{"code":"(window.webpackJsonpGUI=window.webpackJsonpGUI||[]).push([[83],{1380:function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return u})),n.d(t,\"e\",(function(){return m})),n.d(t,\"c\",(function(){return f})),n.d(t,\"d\",(function(){return y})),n.d(t,\"a\",(function(){return k})),n.d(t,\"g\",(function(){return M})),n.d(t,\"f\",(function(){return E}));var o=n(709);let s,r=!1,a=new WeakMap,i=!1,c=null;const l=new o.a;let d=Promise.resolve();const u=()=>r,p=e=>{if(e.updateMonitor||a.has(e))return;const t={time:s.runtime.currentMSecs,status:e.status};a.set(e,t),e.status=1},g=e=>{if(4===e.status)return;const t=a.get(e);t&&1!==e.status&&(t.status=e.status,e.status=1)},h=e=>{c=e},b=(e,t)=>{e.timer&&(e.timer.startTime+=s.runtime.currentMSecs-t.time),e.compatibilityStackFrame&&e.compatibilityStackFrame.timer&&(e.compatibilityStackFrame.timer.startTime+=s.runtime.currentMSecs-t.time);const n=e.peekStackFrame();n&&n.executionContext&&n.executionContext.timer&&(n.executionContext.timer.startTime+=s.runtime.currentMSecs-t.time)},m=e=>{const t=r!==e;if(t&&(r=e,l.dispatchEvent(new CustomEvent(\"change\")),r?s.runtime.emit(\"RUNTIME_PAUSED\"):s.runtime.emit(\"RUNTIME_UNPAUSED\")),r){d=d.then((()=>s.runtime.audioEngine.audioContext.suspend())),s.runtime.ioDevices.clock._paused||s.runtime.ioDevices.clock.pause(),s.runtime.threads.forEach(p);const e=s.runtime.sequencer.activeThread;e&&(h(e),l.dispatchEvent(new CustomEvent(\"step\")))}if(!r&&t){d=d.then((()=>s.runtime.audioEngine.audioContext.resume())),s.runtime.ioDevices.clock.resume();for(const e of s.runtime.threads){const t=a.get(e);t&&(b(e,t),e.status=t.status)}a=new WeakMap;(e=>{const t=s.runtime.threads,n=w(e);if(-1!==n)for(let e=n;e{l.addEventListener(\"change\",(()=>e(r)))},y=e=>{l.addEventListener(\"step\",e)},k=()=>c,v=e=>{const t=a.get(e);return t?t.status:e.status},w=e=>e?s.runtime.threads.findIndex((t=>t.target===e.target&&t.topBlock===e.topBlock&&t.stackClick===e.stackClick&&t.updateMonitor===e.updateMonitor)):-1,C=e=>{const t=s.runtime.threads;for(let n=e;n{if(c){const e=a.get(c);b(c,e),e.time=s.runtime.currentMSecs;(e=>{if(4===e.status)return!1;if(e.isCompiled)return!1;const t=e.peekStack();if(!t&&(e.popStack(),0===e.stack.length))return e.status=4,!1;i=!0,s.runtime.sequencer.activeThread=e;const n=[\"special error used by Scratch Addons for implementing single-stepping\"];Object.defineProperty(e,\"blockGlowInFrame\",{set(e){throw n}});try{e.status=0,e.warpTimer&&e.warpTimer.start();try{s.runtime.sequencer.stepThread(e)}catch(e){if(e!==n)throw e}if(0!==e.status)return!1;for(e.peekStack()===t&&e.goToNextBlock();!e.peekStack();){if(e.popStack(),0===e.stack.length)return e.status=4,!1;const t=e.peekStackFrame();if(t.isLoop){if(e.peekStackFrame().warpMode)continue;return!1}if(t.waitingReporter)return!1;e.goToNextBlock()}return!0}finally{i=!1,s.runtime.sequencer.activeThread=null,Object.defineProperty(e,\"blockGlowInFrame\",{value:t,configurable:!0,enumerable:!0,writable:!0}),4!==e.status&&(e.status=1)}})(c)||(c=C(w(c)+1))}if(!c){h(C(0)),s.runtime.ioDevices.clock._pausedTime+=s.runtime.currentStepTime;const e=s.runtime.audioEngine.audioContext;for(const t of s.runtime.targets)for(const n of Object.keys(t.sprite.soundBank.soundPlayers)){const o=t.sprite.soundBank.soundPlayers[n];o.outputNode&&(o.outputNode.stop(e.currentTime),o._createSource(),o.outputNode.start(e.currentTime,e.currentTime-o.startingUntil+s.runtime.currentStepTime/1e3),o.startingUntil-=s.runtime.currentStepTime/1e3)}for(const e of s.runtime.threads)a.has(e)&&(a.get(e).time+=s.runtime.currentStepTime);i=!0;const t=s.runtime._hats;for(const e in t){if(!Object.prototype.hasOwnProperty.call(t,e))continue;t[e].edgeActivated&&s.runtime.startHats(e)}i=!1}l.dispatchEvent(new CustomEvent(\"step\"))},E=e=>{if(s)return;s=e.tab.traps.vm;const t=s.runtime.sequencer.stepThreads;s.runtime.sequencer.stepThreads=function(){if(u())for(const e of this.runtime.threads)g(e);return t.call(this)};const n=s.runtime.greenFlag;s.runtime.greenFlag=function(){return m(!1),n.call(this)};const o=s.runtime.startHats;s.runtime.startHats=function(){for(var e=arguments.length,t=new Array(e),n=0;n=9?parseInt(e.substring(7,9),16)/255:1}}function s(e){return 1===(e=Math.round(e).toString(16)).length?\"0\".concat(e):e}function r(e){const t=s(e.r),n=s(e.g),o=s(e.b),r=void 0!==e.a?s(255*e.a):\"\";return\"#\".concat(t).concat(n).concat(o).concat(r)}function a(e){let{r:t,g:n,b:o}=e;t/=255,n/=255,o/=255;const s=Math.max(t,n,o),r=s-Math.min(t,n,o);if(0===r)return{h:0,s:0,v:s};const a=(s-t)/r,i=(s-n)/r,c=(s-o)/r;let l;a?i?c||(l=4+i-a):l=2+a-c:l=c-i;return{h:60*l%360,s:r/s,v:s}}function i(e){const{r:t,g:n,b:s}=o(e);return.299*t+.587*n+.114*s}function c(e,t,n,o){return\"number\"!=typeof(o=void 0!==o?o:170)&&(o=i(o)),i(e)>o?void 0!==t?t:\"#575e75\":void 0!==n?n:\"#ffffff\"}function l(e,t){const{r:n,g:s,b:a,a:i}=o(e);return void 0===t.r&&(t.r=1),void 0===t.g&&(t.g=1),void 0===t.b&&(t.b=1),void 0===t.a&&(t.a=1),r({r:t.r*n,g:t.g*s,b:t.b*a,a:t.a*i})}function d(e,t){const{r:n,g:s,b:a,a:i}=o(e);return void 0===t.r&&(t.r=1),void 0===t.g&&(t.g=1),void 0===t.b&&(t.b=1),void 0===t.a&&(t.a=1),r({r:255*(1-t.r)+t.r*n,g:255*(1-t.g)+t.g*s,b:255*(1-t.b)+t.b*a,a:1-t.a+t.a*i})}function u(e,t){const{r:n,g:s,b:a}=o(e),{r:i,g:c,b:l,a:d}=o(t);return r({r:(1-d)*n+d*i,g:(1-d)*s+d*c,b:(1-d)*a+d*l})}function p(e){return e.substring(0,7)}function g(e,t,n){return r(function(e){let{h:t,s:n,v:o}=e;if(0===n)return{r:255*o,g:255*o,b:255*o};t%=360,t<0&&(t+=360);const s=t/60,r=Math.floor(s),a=o*(1-n*(1-s+r)),i=o*(1-n*(s-r)),c=o*(1-n);switch(r){case 0:return{r:255*o,g:255*a,b:255*c};case 1:return{r:255*i,g:255*o,b:255*c};case 2:return{r:255*c,g:255*o,b:255*a};case 3:return{r:255*c,g:255*i,b:255*o};case 4:return{r:255*a,g:255*c,b:255*o};case 5:return{r:255*o,g:255*c,b:255*i}}}({h:\"number\"==typeof e?e:a(o(e)).h,s:\"number\"!=typeof e&&0===a(o(e)).s?0:\"number\"==typeof t?t:a(o(t)).s,v:\"number\"==typeof n?n:a(o(n)).v}))}function h(e){const{r:t,g:n,b:s}=o(e);return\"url(\\\"data:image/svg+xml,\\n \\n \\n \\n \\n #recolor\\n \\\")\").split(\"\\n\").join(\"\")}n.d(t,\"e\",(function(){return o})),n.d(t,\"h\",(function(){return c})),n.d(t,\"d\",(function(){return l})),n.d(t,\"b\",(function(){return d})),n.d(t,\"a\",(function(){return u})),n.d(t,\"g\",(function(){return p})),n.d(t,\"c\",(function(){return g})),n.d(t,\"f\",(function(){return h}))},1391:function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return c}));var o=n(1393);class s{static flash(e){r.timerID>0&&(clearTimeout(r.timerID),r.block.svgPath_&&(r.block.svgPath_.style.fill=\"\"));let t=4,n=!0;r.block=e,function e(){r.block.svgPath_&&(r.block.svgPath_.style.fill=n?\"#ffff80\":\"\"),n=!n,t--,t>0?r.timerID=setTimeout(e,200):(r.timerID=0,r.block=null)}()}}const r={block:null,timerID:null};let a=[],i=[];class c{constructor(e){this.addon=e,this.addon.tab.traps.getBlockly().then((e=>{this.blockly=e})),this.vm=this.addon.tab.traps.vm,this.offsetX=32,this.offsetY=32,this.navigationHistory=new l,this._workspace=null}getEditingTarget(){return this.vm.runtime.getEditingTarget()}setEditingTarget(e){this.getEditingTarget().id!==e&&this.vm.setEditingTarget(e)}getWorkspace(){const e=Blockly.getMainWorkspace();return e.getToolbox()&&(this._workspace=e),this._workspace}scrollBlockIntoView(e){var t;let n,r=this.getWorkspace();if(e instanceof o.a?(this.setEditingTarget(e.targetId),n=r.getBlockById(e.id)):n=e&&e.id?e:r.getBlockById(e),!n)return;let a=n.getRootBlock(),i=this.getTopOfStackFor(n).getRelativeToSurfaceXY(),c=a.getRelativeToSurfaceXY(),l=r.scale,d=c.x*l,u=i.y*l,p=n.width+d,g=n.height+u,h=r.getMetrics();if(dh.viewLeft+h.viewWidth||uh.viewTop+h.viewHeight){let e=d-h.contentLeft-this.offsetX,t=u-h.contentTop-this.offsetY;this.navigationHistory.storeView(this.navigationHistory.peek(),64),r.scrollbar.set(e,t),this.navigationHistory.storeView({left:e,top:t},64)}null===(t=this.blockly)||void 0===t||t.hideChaff(),s.flash(n)}getTopOfStackFor(e){let t=e;for(;t.getOutputShape()&&t.getSurroundParent();)t=t.getSurroundParent();return t}}class l{storeView(e,t){i=[];let n=Blockly.getMainWorkspace().getMetrics(),o={left:n.viewLeft,top:n.viewTop};(!e||d(o,e)>t)&&a.push(o)}peek(){return a.length>0?a[a.length-1]:null}goBack(){const e=Blockly.getMainWorkspace(),t=e.getMetrics();let n={left:t.viewLeft,top:t.viewTop},o=this.peek();if(!o)return;if(d(n,o)<64&&a.length>1&&(a.pop(),i.push(o)),o=this.peek(),!o)return;let s=o.left-t.contentLeft,r=o.top-t.contentTop;e.scrollbar.set(s,r)}goForward(){let e=i.pop();if(!e)return;a.push(e);let t=Blockly.getMainWorkspace(),n=t.getMetrics(),o=e.left-n.contentLeft,s=e.top-n.contentTop;t.scrollbar.set(o,s)}}function d(e,t){return Math.sqrt(Math.pow(e.left-t.left,2)+Math.pow(e.top-t.top,2))}},1393:function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return o}));class o{constructor(e,t){this.targetId=e.id,this.id=t.id}}},1394:function(e,t,n){\"use strict\";n.d(t,\"f\",(function(){return c})),n.d(t,\"a\",(function(){return l})),n.d(t,\"b\",(function(){return d})),n.d(t,\"e\",(function(){return u})),n.d(t,\"d\",(function(){return p})),n.d(t,\"c\",(function(){return g})),n.d(t,\"g\",(function(){return b}));let o=!1,s=null,r=1,a=1;const i=[],c=e=>{s?s.value=e:a=e,i.forEach((e=>e()))},l=()=>s?s.value:a,d=()=>0===l(),u=e=>{r=e},p=e=>{e?(u(l()),c(0)):c(r)},g=e=>{i.push(e)},h=e=>{e?(s=e.inputNode.gain,s.value=a):console.error(\"could not get audio engine; sound-related addons will not work\")},b=e=>{if(o)return;o=!0;const t=e.runtime.audioEngine;t?h(t):e.runtime.once(\"PROJECT_LOADED\",(()=>{h(e.runtime.audioEngine)}))}},1406:function(e){e.exports=JSON.parse('{\"_general/blocks/anticlockwise\":\"anti-clockwise\",\"_general/blocks/clockwise\":\"clockwise\",\"_general/blocks/green-flag\":\"flag\",\"editor-devtools/clean-plus\":\"Clean up Blocks +\",\"editor-devtools/copy-all\":\"Copy All\",\"editor-devtools/copy-block\":\"Copy Block\",\"editor-devtools/cut-block\":\"Cut Block\",\"editor-devtools/lists\":\"lists\",\"editor-devtools/make-space\":\"Make Space\",\"editor-devtools/orphaned\":\"{count, plural, one {Developer tools: Delete 1 orphaned reporter block?} other {Developer tools: Delete # orphaned reporter blocks?} }\",\"editor-devtools/paste\":\"Paste\",\"editor-devtools/replace\":\"Developer tools: Switch all {name} in this sprite for the variable named:\",\"editor-devtools/swap\":\"Swap {var} in Sprite\",\"editor-devtools/unused-list\":\"{count, plural, one {Developer tools: Delete 1 unused local list? Here it is:\\\\n} other {Developer tools: Delete # unused local lists? Here they are:\\\\n} }\",\"editor-devtools/unused-var\":\"{count, plural, one {Developer tools: Delete 1 unused local variable? Here it is:\\\\n} other {Developer tools: Delete # unused local variables? Here they are:\\\\n} }\",\"editor-devtools/var-not-exist\":\"That variable does not exist...\",\"editor-devtools/variables\":\"variables\",\"find-bar/complex-broadcast\":\"(expression)\",\"find-bar/event\":\"event {name}\",\"find-bar/find-placeholder\":\"Find (Ctrl+F)\",\"find-bar/list-global\":\"LIST {name}\",\"find-bar/list-local\":\"list {name}\",\"find-bar/var-global\":\"VAR {name}\",\"find-bar/var-local\":\"var {name}\",\"middle-click-popup/start-typing\":\"Start Typing...\",\"editor-searchable-dropdowns/createBroadcast\":\"Create message \\\\\"{name}\\\\\"\",\"editor-searchable-dropdowns/createGlobalList\":\"Create list \\\\\"{name}\\\\\" for all sprites\",\"editor-searchable-dropdowns/createGlobalVariable\":\"Create variable \\\\\"{name}\\\\\" for all sprites\",\"editor-searchable-dropdowns/createLocalList\":\"Create list \\\\\"{name}\\\\\" for this sprite only\",\"editor-searchable-dropdowns/createLocalVariable\":\"Create variable \\\\\"{name}\\\\\" for this sprite only\",\"data-category-tweaks-v2/for-all-sprites\":\"For all sprites:\",\"data-category-tweaks-v2/for-this-sprite-only\":\"For this sprite only:\",\"data-category-tweaks-v2/list-category\":\"Lists\",\"hide-flyout/lock\":\"Lock Palette\",\"hide-flyout/unlock\":\"Unlock Palette\",\"mediarecorder/cancel\":\"Cancel\",\"mediarecorder/click-flag\":\"Waiting...\",\"mediarecorder/click-flag-description\":\"Click the green flag to start recording. Click this button to stop.\",\"mediarecorder/option-title\":\"Record Options\",\"mediarecorder/record\":\"Record\",\"mediarecorder/record-after-flag\":\"Do not start recording until the Green Flag is clicked\",\"mediarecorder/record-audio\":\"Include project sounds\",\"mediarecorder/record-audio-description\":\"This does not include Text-to-Speech.\",\"mediarecorder/record-description\":\"Record the stage as a {extension} file. You can save it to your computer after the recording is finished.\\\\nNote: variable and list monitors will not be visible.\",\"mediarecorder/record-duration\":\"Record Duration (in seconds)\",\"mediarecorder/record-mic\":\"Include sounds from microphone\",\"mediarecorder/record-until-stop\":\"Stop recording after the project has stopped\",\"mediarecorder/record-until-stop-disabled\":\"You need to enable \\\\\"{afterFlagOption}\\\\\" to use this option.\",\"mediarecorder/start\":\"Start\",\"mediarecorder/start-delay\":\"Start Delay (in seconds)\",\"mediarecorder/starting-in\":\"Starting in {secs}...\",\"mediarecorder/stop\":\"Stop Recording\",\"debugger/block-breakpoint\":\"breakpoint\",\"debugger/block-error\":\"error %s\",\"debugger/block-log\":\"log %s\",\"debugger/block-warn\":\"warn %s\",\"debugger/cannot-pause-player\":\"Breakpoint block can only be used while on the editor.\",\"debugger/clear\":\"Clear\",\"debugger/clone-of\":\"Clone of {sprite}\",\"debugger/close\":\"Close\",\"debugger/console\":\"Logs\",\"debugger/debug\":\"Debug\",\"debugger/empty-string\":\"(empty string)\",\"debugger/enter-format\":\"Enter export format:\",\"debugger/export\":\"Export\",\"debugger/export-desc\":\"Click while holding Shift to customize export format.\",\"debugger/icon-error\":\"Error\",\"debugger/icon-warn\":\"Warning\",\"debugger/log-msg-broadcasted\":\"Broadcasted \\'{broadcast}\\'.\",\"debugger/log-msg-clone-cap\":\"Failed to create clone of \\'{sprite}\\', cannot create over 300 clones.\",\"debugger/log-msg-clone-created\":\"Created clone of \\'{sprite}\\'.\",\"debugger/log-msg-flag-clicked\":\"Green flag clicked.\",\"debugger/no-logs\":\"There are no logs to display.\",\"debugger/no-threads-running\":\"No threads running.\",\"debugger/performance-clonecount-graph-tooltip\":\"Clones: {clones}\",\"debugger/performance-clonecount-title\":\"Clones\",\"debugger/performance-framerate-graph-tooltip\":\"FPS: {fps}\",\"debugger/performance-framerate-title\":\"FPS\",\"debugger/step\":\"Step\",\"debugger/step-desc\":\"Executes one block.\",\"debugger/tab-logs\":\"Logs\",\"debugger/tab-performance\":\"Performance\",\"debugger/tab-threads\":\"Threads\",\"debugger/thread\":\"Thread {id}\",\"debugger/unknown-sprite\":\"(unknown sprite)\",\"debugger/unpause\":\"Resume\",\"pause/pause\":\"Pause\",\"pause/play\":\"Resume\",\"clones/clones\":\"clones: {cloneCount}\",\"color-picker/hex\":\"hex color\",\"remove-sprite-confirm/confirm\":\"Do you want to delete the sprite?\",\"block-count/blocks\":\"{num, plural, one {1 block} other {# blocks}}\",\"onion-skinning/behind\":\"Behind\",\"onion-skinning/front\":\"Front\",\"onion-skinning/layering\":\"Layering\",\"onion-skinning/merge\":\"Merge\",\"onion-skinning/mode\":\"Mode\",\"onion-skinning/next\":\"Next costumes\",\"onion-skinning/opacity\":\"Opacity (%)\",\"onion-skinning/opacityStep\":\"Opacity step (%)\",\"onion-skinning/previous\":\"Previous costumes\",\"onion-skinning/settings\":\"Onion Skinning Settings\",\"onion-skinning/tint\":\"Tint\",\"onion-skinning/toggle\":\"Toggle Onion Skinning\",\"paint-snap/boxCenter\":\"Center of selection\",\"paint-snap/boxCorners\":\"Corners of selection\",\"paint-snap/boxEdgeMids\":\"Selection edge midpoints\",\"paint-snap/objectCenters\":\"Centers of objects\",\"paint-snap/objectCorners\":\"Corners of objects\",\"paint-snap/objectEdges\":\"Edges of objects\",\"paint-snap/objectMidlines\":\"Midlines of objects\",\"paint-snap/off\":\"Off\",\"paint-snap/on\":\"On\",\"paint-snap/pageAxes\":\"Page x and y axes\",\"paint-snap/pageCenter\":\"Center of the page\",\"paint-snap/pageCorners\":\"Corners of the page\",\"paint-snap/pageEdges\":\"Edges of the page\",\"paint-snap/settings\":\"Snap Settings\",\"paint-snap/snapFrom\":\"Snap from:\",\"paint-snap/snapTo\":\"Snap to:\",\"paint-snap/threshold\":\"Snapping distance\",\"paint-snap/toggle\":\"Toggle Snapping\",\"2d-color-picker/shade\":\"Shade\",\"better-img-uploads/upload\":\"HD Upload\",\"variable-manager/for-all-sprites\":\"Variables for all sprites\",\"variable-manager/for-this-sprite\":\"Variables for this sprite\",\"variable-manager/search\":\"Search\",\"variable-manager/too-big\":\"Click to display very large value.\",\"variable-manager/variables\":\"Variables\",\"search-sprites/placeholder\":\"Search sprites...\",\"sprite-properties/close-properties-panel-tooltip\":\"Collapse properties panel\",\"sprite-properties/open-properties-panel-tooltip\":\"Open properties panel\",\"gamepad/axes-a-b\":\"Axes {a} & {b}\",\"gamepad/axis-arrows\":\"Arrow Keys\",\"gamepad/axis-cursor\":\"Cursor\",\"gamepad/axis-custom\":\"Custom\",\"gamepad/axis-none\":\"None\",\"gamepad/browser-support\":\"This browser and operating system have known bugs that may make this addon difficult to use. Try another browser if you encounter problems.\",\"gamepad/button-n\":\"Button {n}\",\"gamepad/clear\":\"Clear all controls\",\"gamepad/config-header\":\"This comment contains configuration for gamepad support in third-party tools or websites such as https://turbowarp.org/\\\\nDo not edit by hand\",\"gamepad/key-click\":\"Click\",\"gamepad/key-down\":\"Down\",\"gamepad/key-enter\":\"Enter\",\"gamepad/key-left\":\"Left\",\"gamepad/key-none\":\"(none)\",\"gamepad/key-right\":\"Right\",\"gamepad/key-space\":\"Space\",\"gamepad/key-up\":\"Up\",\"gamepad/keyinput-title\":\"Click and press a key or click to change button. Escape to cancel. Backspace or delete to clear.\",\"gamepad/no-controllers\":\"No controllers detected. Try plugging one in and pressing a button on it.\",\"gamepad/reset\":\"Reset all controls to project defaults\",\"gamepad/settings\":\"Gamepad Settings\",\"gamepad/store-in-project\":\"Store the mappings set above inside the project. After saving the project, these mappings will become the new default configuration.\",\"folders/add-to-folder\":\"add to folder: {folder}\",\"folders/closed-folder\":\"Folder\",\"folders/confirm-backpack-folder\":\"Save entire folder to backpack?\",\"folders/create-folder\":\"create folder\",\"folders/name-not-allowed\":\"Invalid folder name\",\"folders/name-prompt\":\"Name of folder:\",\"folders/name-prompt-title\":\"Create Folder\",\"folders/open-folder\":\"Opened\",\"folders/remove-folder\":\"remove folder\",\"folders/remove-from-folder\":\"remove from folder\",\"folders/rename-folder\":\"rename folder\",\"folders/rename-folder-prompt\":\"Rename folder to:\",\"folders/rename-folder-prompt-title\":\"Rename Folder\",\"block-switching/control_forever\":\"forever\",\"block-switching/control_if\":\"if\",\"block-switching/control_if_else\":\"if... else\",\"block-switching/control_repeat_until\":\"repeat until\",\"block-switching/control_wait_until\":\"wait until\",\"block-switching/data_changevariableby\":\"change variable\",\"block-switching/data_deletealloflist\":\"delete all\",\"block-switching/data_deleteoflist\":\"delete item\",\"block-switching/data_hidelist\":\"hide list\",\"block-switching/data_hidevariable\":\"hide variable\",\"block-switching/data_insertatlist\":\"insert item\",\"block-switching/data_replaceitemoflist\":\"replace item\",\"block-switching/data_setvariableto\":\"set variable\",\"block-switching/data_showlist\":\"show list\",\"block-switching/data_showvariable\":\"show variable\",\"block-switching/debugger_error\":\"error\",\"block-switching/debugger_log\":\"log\",\"block-switching/debugger_warn\":\"warn\",\"block-switching/event_broadcast\":\"broadcast\",\"block-switching/event_broadcastandwait\":\"broadcast and wait\",\"block-switching/looks_backdropnumbername\":\"backdrop number or name\",\"block-switching/looks_changeeffectby\":\"change effect\",\"block-switching/looks_changesizeby\":\"change size\",\"block-switching/looks_costumenumbername\":\"costume number or name\",\"block-switching/looks_goforwardbackwardlayers\":\"go forward or backward layers\",\"block-switching/looks_gotofrontback\":\"go to front or back layer\",\"block-switching/looks_hide\":\"hide\",\"block-switching/looks_nextbackdrop\":\"next backdrop\",\"block-switching/looks_nextcostume\":\"next costume\",\"block-switching/looks_say\":\"say\",\"block-switching/looks_sayforsecs\":\"say for seconds\",\"block-switching/looks_seteffectto\":\"set effect\",\"block-switching/looks_setsizeto\":\"set size\",\"block-switching/looks_show\":\"show\",\"block-switching/looks_switchbackdropto\":\"switch backdrop\",\"block-switching/looks_switchbackdroptoandwait\":\"switch backdrop and wait\",\"block-switching/looks_think\":\"think\",\"block-switching/looks_thinkforsecs\":\"think for seconds\",\"block-switching/motion_changexby\":\"change x\",\"block-switching/motion_changeyby\":\"change y\",\"block-switching/motion_setx\":\"set x\",\"block-switching/motion_sety\":\"set y\",\"block-switching/motion_turnleft\":\"turn left\",\"block-switching/motion_turnright\":\"turn right\",\"block-switching/motion_xposition\":\"x position\",\"block-switching/motion_yposition\":\"y position\",\"block-switching/music_changeTempo\":\"change tempo\",\"block-switching/music_setTempo\":\"set tempo\",\"block-switching/operator_add\":\"+\",\"block-switching/operator_and\":\"and\",\"block-switching/operator_divide\":\"/\",\"block-switching/operator_equals\":\"=\",\"block-switching/operator_gt\":\">\",\"block-switching/operator_lt\":\"<\",\"block-switching/operator_mod\":\"mod\",\"block-switching/operator_multiply\":\"*\",\"block-switching/operator_or\":\"or\",\"block-switching/operator_subtract\":\"-\",\"block-switching/pen_changePenColorParamBy\":\"change parameter\",\"block-switching/pen_changePenHueBy\":\"change hue\",\"block-switching/pen_changePenShadeBy\":\"change shade\",\"block-switching/pen_changePenSizeBy\":\"change size\",\"block-switching/pen_penDown\":\"pen down\",\"block-switching/pen_penUp\":\"pen up\",\"block-switching/pen_setPenColorParamTo\":\"set parameter\",\"block-switching/pen_setPenHueToNumber\":\"set hue\",\"block-switching/pen_setPenShadeToNumber\":\"set shade\",\"block-switching/pen_setPenSizeTo\":\"set size\",\"block-switching/sensing_coloristouchingcolor\":\"color touching color\",\"block-switching/sensing_mousex\":\"mouse x\",\"block-switching/sensing_mousey\":\"mouse y\",\"block-switching/sensing_touchingcolor\":\"touching color\",\"block-switching/sound_changeeffectby\":\"change effect\",\"block-switching/sound_changevolumeby\":\"change volume\",\"block-switching/sound_play\":\"start\",\"block-switching/sound_playuntildone\":\"play until done\",\"block-switching/sound_seteffectto\":\"set effect\",\"block-switching/sound_setvolumeto\":\"set volume\",\"copy-reporter/copy-to-clipboard\":\"Copy\",\"copy-reporter/copy-value\":\"copy value\",\"blocks2image/error_blocks_not_added\":\"Add blocks to workspace!\",\"blocks2image/export_all_to_PNG\":\"Export all as PNG\",\"blocks2image/export_all_to_SVG\":\"Export all as SVG\",\"blocks2image/export_selected_to_PNG\":\"Export block as PNG\",\"blocks2image/export_selected_to_SVG\":\"Export block as SVG\",\"editor-extra-keys/enter-key\":\"enter\",\"move-to-top-bottom/bottom\":\"move to bottom\",\"move-to-top-bottom/top\":\"move to top\",\"move-to-top-layer/move-to-front-layer\":\"move to front layer\",\"rename-broadcasts/RENAME_BROADCAST\":\"Rename message\",\"rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE\":\"Rename Message\",\"rename-broadcasts/RENAME_BROADCAST_TITLE\":\"Rename all \\\\\"{name}\\\\\" messages to:\",\"swap-local-global/cant-convert-cloud\":\"Cloud variables can\\'t be converted to this sprite only.\",\"swap-local-global/cant-convert-conflict\":\"Can\\'t convert because it would conflict with variables in another sprite: {sprites}\",\"swap-local-global/cant-convert-stage\":\"The stage can\\'t have variables for this sprite only.\",\"swap-local-global/cant-convert-to-local\":\"Can\\'t convert because it\\'s used by multiple sprites: {sprites}\",\"swap-local-global/cant-convert-used-elsewhere\":\"Can\\'t convert because it\\'s used by another sprite: {sprite}\",\"swap-local-global/edit\":\"Edit properties:\",\"swap-local-global/edit-list-header\":\"Edit List\",\"swap-local-global/edit-list-option\":\"Rename or edit list\",\"swap-local-global/edit-variable-header\":\"Edit Variable\",\"swap-local-global/edit-variable-option\":\"Rename or edit variable\",\"swap-local-global/to-global\":\"Convert to \\\\\"For all sprites\\\\\"\",\"swap-local-global/to-local\":\"Convert to \\\\\"For this sprite only\\\\\"\",\"hide-stage/hide-stage\":\"Hide stage\"}')},1407:function(e,t,n){\"use strict\";t.a={de:()=>n.e(65).then(n.t.bind(null,1417,3)),es:()=>n.e(66).then(n.t.bind(null,1418,3)),fi:()=>n.e(67).then(n.t.bind(null,1419,3)),fr:()=>n.e(68).then(n.t.bind(null,1420,3)),hu:()=>n.e(69).then(n.t.bind(null,1421,3)),it:()=>n.e(70).then(n.t.bind(null,1422,3)),ja:()=>n.e(71).then(n.t.bind(null,1423,3)),ko:()=>n.e(72).then(n.t.bind(null,1424,3)),nl:()=>n.e(73).then(n.t.bind(null,1425,3)),pl:()=>n.e(74).then(n.t.bind(null,1426,3)),pt:()=>n.e(75).then(n.t.bind(null,1427,3)),ro:()=>n.e(76).then(n.t.bind(null,1428,3)),ru:()=>n.e(77).then(n.t.bind(null,1429,3)),sl:()=>n.e(78).then(n.t.bind(null,1430,3)),tr:()=>n.e(79).then(n.t.bind(null,1431,3)),\"zh-cn\":()=>n.e(80).then(n.t.bind(null,1432,3)),\"zh-tw\":()=>n.e(81).then(n.t.bind(null,1433,3))}},1408:function(e,t,n){\"use strict\";t.a={\"cat-blocks\":()=>n.e(10).then(n.bind(null,1544)),\"editor-devtools\":()=>n.e(4).then(n.bind(null,1523)),\"find-bar\":()=>n.e(4).then(n.bind(null,1535)),\"middle-click-popup\":()=>n.e(4).then(n.bind(null,1525)),\"jump-to-def\":()=>n(1542),\"reorder-custom-inputs\":()=>n.e(4).then(n.bind(null,1536)),\"editor-searchable-dropdowns\":()=>n.e(4).then(n.bind(null,1545)),\"data-category-tweaks-v2\":()=>n.e(18).then(n.bind(null,1546)),\"block-palette-icons\":()=>n.e(8).then(n.bind(null,1521)),\"hide-flyout\":()=>n.e(37).then(n.bind(null,1529)),mediarecorder:()=>n.e(42).then(n.bind(null,1547)),\"drag-drop\":()=>n(1543),debugger:()=>n.e(19).then(n.bind(null,1519)),pause:()=>n(1528),\"mute-project\":()=>n(1534),\"vol-slider\":()=>n.e(63).then(n.bind(null,1526)),clones:()=>n.e(11).then(n.bind(null,1530)),\"mouse-pos\":()=>n.e(43).then(n.bind(null,1548)),\"color-picker\":()=>n.e(4).then(n.bind(null,1537)),\"remove-sprite-confirm\":()=>n.e(50).then(n.bind(null,1549)),\"block-count\":()=>n.e(7).then(n.bind(null,1550)),\"onion-skinning\":()=>n.e(4).then(n.bind(null,1524)),\"paint-snap\":()=>n.e(48).then(n.bind(null,1520)),\"default-costume-editor-color\":()=>n.e(20).then(n.bind(null,1551)),\"bitmap-copy\":()=>n.e(4).then(n.bind(null,1552)),\"2d-color-picker\":()=>n.e(5).then(n.bind(null,1527)),\"paint-skew\":()=>n.e(4).then(n.bind(null,1553)),\"better-img-uploads\":()=>n.e(6).then(n.bind(null,1538)),\"pick-colors-from-stage\":()=>n.e(4).then(n.bind(null,1554)),\"custom-block-shape\":()=>n.e(14).then(n.bind(null,1555)),\"editor-square-inputs\":()=>n.e(29).then(n.bind(null,1556)),\"zebra-striping\":()=>n.e(64).then(n.bind(null,1557)),\"editor-compact\":()=>n.e(25).then(n.bind(null,1531)),\"custom-menu-bar\":()=>n.e(16).then(n.bind(null,1476)),\"editor-theme3\":()=>n.e(32).then(n.bind(null,1518)),\"custom-block-text\":()=>n.e(15).then(n.bind(null,1558)),\"editor-colored-context-menus\":()=>n.e(24).then(n.bind(null,1559)),\"editor-stage-left\":()=>n.e(30).then(n.bind(null,1560)),\"editor-buttons-reverse-order\":()=>n.e(23).then(n.bind(null,1485)),\"variable-manager\":()=>n.e(62).then(n.bind(null,1532)),\"search-sprites\":()=>n.e(52).then(n.bind(null,1561)),\"sprite-properties\":()=>n.e(53).then(n.bind(null,1533)),gamepad:()=>n.e(35).then(n.bind(null,1522)),\"editor-sounds\":()=>n.e(28).then(n.bind(null,1562)),folders:()=>n.e(4).then(n.bind(null,1539)),\"block-switching\":()=>n.e(4).then(n.bind(null,1563)),\"load-extensions\":()=>n.e(41).then(n.bind(null,1564)),\"custom-zoom\":()=>n.e(17).then(n.bind(null,1565)),\"copy-reporter\":()=>n.e(13).then(n.bind(null,1540)),\"initialise-sprite-position\":()=>n.e(40).then(n.bind(null,1566)),blocks2image:()=>n.e(9).then(n.bind(null,1567)),\"remove-curved-stage-border\":()=>n.e(49).then(n.bind(null,1497)),\"transparent-orphans\":()=>n.e(55).then(n.bind(null,1499)),\"paint-by-default\":()=>n.e(47).then(n.bind(null,1568)),\"block-cherry-picking\":()=>n.e(4).then(n.bind(null,1569)),\"hide-new-variables\":()=>n.e(38).then(n.bind(null,1570)),\"editor-extra-keys\":()=>n.e(26).then(n.bind(null,1571)),\"hide-delete-button\":()=>n.e(36).then(n.bind(null,1501)),\"no-script-bumping\":()=>n.e(45).then(n.bind(null,1572)),\"disable-stage-drag-select\":()=>n.e(22).then(n.bind(null,1573)),\"move-to-top-bottom\":()=>n.e(4).then(n.bind(null,1574)),\"move-to-top-layer\":()=>n.e(44).then(n.bind(null,1575)),\"disable-paste-offset\":()=>n.e(21).then(n.bind(null,1576)),\"block-duplicate\":()=>n.e(4).then(n.bind(null,1577)),\"rename-broadcasts\":()=>n.e(4).then(n.bind(null,1578)),\"swap-local-global\":()=>n.e(54).then(n.bind(null,1579)),\"editor-comment-previews\":()=>n.e(4).then(n.bind(null,1580)),columns:()=>n.e(12).then(n.bind(null,1581)),\"number-pad\":()=>n.e(46).then(n.bind(null,1582)),\"editor-number-arrow-keys\":()=>n.e(27).then(n.bind(null,1583)),\"expanded-backpack\":()=>n.e(33).then(n.bind(null,1584)),\"script-snap\":()=>n.e(51).then(n.bind(null,1585)),fullscreen:()=>n.e(34).then(n.bind(null,1586)),\"hide-stage\":()=>n.e(39).then(n.bind(null,1541)),\"tw-straighten-comments\":()=>n.e(61).then(n.bind(null,1587)),\"tw-remove-backpack\":()=>n.e(59).then(n.bind(null,1588)),\"tw-remove-feedback\":()=>n.e(60).then(n.bind(null,1516)),\"tw-disable-vibration\":()=>n.e(58).then(n.bind(null,1589)),\"tw-disable-cloud-variables\":()=>n.e(56).then(n.bind(null,1590)),\"tw-disable-compiler\":()=>n.e(57).then(n.bind(null,1591)),\"editor-stepping\":()=>n.e(31).then(n.bind(null,1592))}},1409:function(e,t,n){(e.exports=n(9)(!1)).push([e.i,\".pause-btn {\\n width: 2rem;\\n height: 2rem;\\n padding: 0.375rem;\\n border-radius: 0.25rem;\\n user-select: none;\\n user-drag: none;\\n cursor: pointer;\\n}\\n\\n.pause-btn:hover {\\n background-color: var(--looks-light-transparent);\\n}\\n\",\"\"])},1410:function(e,t,n){\"use strict\";function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t{e.classList.contains(\"sa-ctx-menu\")&&e.remove()}));for(const e of i?c.flatMap((e=>\"function\"==typeof e?e(u,h):e)):c){if(!e)continue;if(e.types&&!e.types.some((e=>u===e)))continue;if(e.condition&&!e.condition(h))continue;const t=document.createElement(\"div\"),n=[\"context-menu_menu-item\"];e.border&&n.push(\"context-menu_menu-item-bordered\"),e.dangerous&&n.push(\"context-menu_menu-item-danger\"),t.className=this.scratchClass(...n,{others:[\"react-contextmenu-item\",\"sa-ctx-menu\",e.className||\"\"]});const o=document.createElement(\"span\");o.textContent=e.label,t.append(o),this.displayNoneWhileDisabled(t,{display:\"block\"}),t.addEventListener(\"click\",(t=>{t.stopPropagation(),window.dispatchEvent(new CustomEvent(\"REACT_CONTEXTMENU_HIDE\",{detail:{action:\"REACT_CONTEXTMENU_HIDE\"}})),e.callback(h)})),this.appendToSharedSpace({space:e.position,order:e.order,scope:p,element:t})}},d=e=>{a||(a=!0,document.body.addEventListener(\"contextmenu\",(t=>l.call(e,t)),{capture:!0}))},u=(e,t,n)=>{void 0===n?(c.push(t),i=!0):c.push(s(s({},n),{},{callback:t})),d(e)}},1411:function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return i})),n.d(t,\"a\",(function(){return l})),n.d(t,\"c\",(function(){return d}));var o=n(108),s=n.n(o),r=n(1412),a=n.n(r);const i=function(e,t){let{isOpen:n=!1}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const o=Object.assign(document.createElement(\"div\"),{className:e.scratchClass(\"modal_modal-overlay\"),dir:e.direction});o.style.display=n?\"\":\"none\",document.body.appendChild(o);const r=Object.assign(document.createElement(\"div\"),{className:e.scratchClass(\"modal_modal-content\")});r.addEventListener(\"click\",(e=>e.stopPropagation())),o.appendChild(r);const i=Object.assign(document.createElement(\"div\"),{className:e.scratchClass(\"modal_header\")});r.appendChild(i),i.appendChild(Object.assign(document.createElement(\"div\"),{className:e.scratchClass(\"modal_header-item\",\"modal_header-item-title\"),innerText:t}));const c=Object.assign(document.createElement(\"div\"),{className:e.scratchClass(\"modal_header-item\",\"modal_header-item-close\")});i.appendChild(c);const l=Object.assign(document.createElement(\"div\"),{className:e.scratchClass(\"close-button_close-button\",\"close-button_large\")});c.appendChild(l),l.appendChild(Object.assign(document.createElement(\"img\"),{className:e.scratchClass(\"close-button_close-icon\"),src:s.a}));const d=Object.assign(document.createElement(\"div\"),{className:a.a.modalContent});return r.appendChild(d),{container:r,content:d,backdrop:o,closeButton:l,open:()=>{o.style.display=\"\"},close:()=>{o.style.display=\"none\"},remove:o.remove.bind(o)}},c=e=>{const t=Object.assign(document.createElement(\"div\"),{className:e.scratchClass(\"prompt_button-row\")}),n=Object.assign(document.createElement(\"button\"),{className:e.scratchClass(\"prompt_cancel-button\"),innerText:e.scratchMessage(\"gui.prompt.cancel\")});t.appendChild(n);const o=Object.assign(document.createElement(\"button\"),{className:e.scratchClass(\"prompt_ok-button\"),innerText:e.scratchMessage(\"gui.prompt.ok\")});return t.appendChild(o),{buttonRow:t,cancelButton:n,okButton:o}},l=function(e,t,n){let{useEditorClasses:o=!1}=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};const{remove:s,container:r,content:a,backdrop:i,closeButton:l}=e.createModal(t,{isOpen:!0,useEditorClasses:o,useSizesClass:!0}),d=null!==e.editorMode&&o?\"editor\":e.clientVersion;\"editor\"===d&&(r.classList.add(e.scratchClass(\"prompt_modal-content\")),a.classList.add(e.scratchClass(\"prompt_body\"))),a.appendChild(Object.assign(document.createElement(\"div\"),{className:e.scratchClass(\"prompt_label\"),innerText:n}));const{buttonRow:u,cancelButton:p,okButton:g}=c(e);return a.appendChild(u),g.focus(),new Promise((e=>{const t=()=>{s(),e(!1)},n=()=>{s(),e(!0)};i.addEventListener(\"click\",t),l.addEventListener(\"click\",t),p.addEventListener(\"click\",t),g.addEventListener(\"click\",n),r.addEventListener(\"keydown\",(e=>{\"Enter\"===e.key&&n(),\"Escape\"===e.key&&t()}))}))},d=function(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",{useEditorClasses:s=!1}=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};const{remove:r,container:a,content:i,backdrop:l,closeButton:d}=e.createModal(t,{isOpen:!0,useEditorClasses:s,useSizesClass:!0});a.classList.add(e.scratchClass(\"prompt_modal-content\")),i.classList.add(e.scratchClass(\"prompt_body\")),i.appendChild(Object.assign(document.createElement(\"div\"),{className:e.scratchClass(\"prompt_label\"),innerText:n}));const u=Object.assign(document.createElement(\"input\"),{className:e.scratchClass(\"prompt_variable-name-text-input\"),value:o});i.appendChild(u),u.focus(),u.select();const{buttonRow:p,cancelButton:g,okButton:h}=c(e);return i.appendChild(p),new Promise((e=>{const t=()=>{r(),e(null)},n=()=>{r(),e(u.value)};l.addEventListener(\"click\",t),d.addEventListener(\"click\",t),g.addEventListener(\"click\",t),h.addEventListener(\"click\",n),a.addEventListener(\"keydown\",(e=>{\"Enter\"===e.key&&n(),\"Escape\"===e.key&&t()}))}))}},1412:function(e,t,n){var o=n(1413);\"string\"==typeof o&&(o=[[e.i,o,\"\"]]);var s={hmr:!0,transform:undefined,insertInto:void 0};n(10)(o,s);o.locals&&(e.exports=o.locals)},1413:function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\".modal_modal-content_vp9Mi {\\n background-color: var(--ui-modal-background);\\n color: var(--ui-modal-foreground);\\n}\\n\",\"\"]),t.locals={\"modal-content\":\"modal_modal-content_vp9Mi\",modalContent:\"modal_modal-content_vp9Mi\"}},1414:function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return i})),n.d(t,\"b\",(function(){return r}));const o=document.createElement(\"div\");o.style.display=\"none\",o.className=\"addons-styles\",document.body.appendChild(o);const s=new Map,r=()=>{for(const e of s.values())e.update()};class a{constructor(e){this.el=null,this.styleText=e,this.precedence=0,this.dependents=[],this.previousEnabledDependents=[]}addDependent(e,t,n){this.dependents.push([e,n]),t>this.precedence&&(this.precedence=t,this.el&&(this.el.dataset.precedence=t)),this.update()}getEnabledDependents(){const e=[];for(const[t,n]of this.dependents)n()&&e.push(t);return e}dependsOn(e){return this.dependents.some((t=>t[0]===e))}getElement(){if(!this.el){const e=document.createElement(\"style\");e.className=\"scratch-addons-style\",e.dataset.precedence=this.precedence,e.textContent=this.styleText,this.styleText=null,this.el=e}return this.el}update(){const e=this.getEnabledDependents();if(!((e,t)=>{if(e.length!==t.length)return!1;for(let n=0;n0){const t=this.getElement();t.dataset.addons=e.join(\",\");for(const e of o.children){if((+e.dataset.precedence||0)>=this.precedence)return void o.insertBefore(t,e)}o.appendChild(t)}else this.el&&this.el.remove()}}const i=(e,t)=>{if(!s.get(e)){const n=new a(t);s.set(e,n)}return s.get(e)}},1415:function(e,t,n){\"use strict\";const o=[\"columns\",\"editor-stage-left\",\"editor-theme3\",\"hide-stage\"];t.a=e=>o.indexOf(e)+1},1416:function(e,t,n){\"use strict\";var o=n(709),s=n(53);class r extends o.a{constructor(){super(),this._isInReducer=!1,this._nextState=null,s.a.appStateReducer=(e,t,n)=>{this._isInReducer=!0,this._nextState=n,this.dispatchEvent(new CustomEvent(\"statechanged\",{detail:{action:e,prev:t,next:n}})),this._nextState=null,this._isInReducer=!1}}initialize(){}dispatch(e){this._isInReducer?queueMicrotask((()=>s.a.appStateStore.dispatch(e))):s.a.appStateStore.dispatch(e)}get state(){return this._nextState?this._nextState:s.a.appStateStore.getState()}}const a=new r;t.a=a},1528:function(e,t,n){\"use strict\";n.r(t),n.d(t,\"resources\",(function(){return r}));var o=n(1380),s=n(1409);const r={\"userscript.js\":async function(e){let{addon:t,console:n,msg:s}=e;Object(o.f)(t);const r=document.createElement(\"img\");r.className=\"pause-btn\",r.draggable=!1,r.title=s(\"pause\");const a=()=>{r.src=t.self.getResource(Object(o.b)()?\"/play.svg\":\"/pause.svg\"),r.title=Object(o.b)()?s(\"play\"):s(\"pause\")};for(r.addEventListener(\"click\",(()=>Object(o.e)(!Object(o.b)()))),t.tab.displayNoneWhileDisabled(r),t.self.addEventListener(\"disabled\",(()=>Object(o.e)(!1))),a(),Object(o.c)(a),document.addEventListener(\"keydown\",(function(e){!e.altKey||\"x\"!==e.key.toLowerCase()&&88!==e.keyCode||t.self.disabled||(e.preventDefault(),e.stopImmediatePropagation(),Object(o.e)(!Object(o.b)()))}),{capture:!0});;)await t.tab.waitForElement(\"[class^='green-flag']\",{markAsSeen:!0,reduxEvents:[\"scratch-gui/mode/SET_PLAYER\",\"fontsLoaded/SET_FONTS_LOADED\",\"scratch-gui/locales/SELECT_LOCALE\"]}),t.tab.appendToSharedSpace({space:\"afterGreenFlag\",element:r,order:0})},\"style.css\":n.n(s).a,\"pause.svg\":\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTgiIHdpZHRoPSIxOCI+PHBhdGggZD0iTTIzMS40MjkgMTg4LjkyOVYxNzEuMDdoNC4yODV2MTcuODU4em0xMi4xNDIgMFYxNzEuMDdoNC4yODZ2MTcuODU4eiIgdHJhbnNmb3JtPSJtYXRyaXgoMS4wMzMwOSAwIDAgLjk1NDI3IC0yMzguNTczIC0xNjIuNzY5KSIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsPSIjZmZhZTAwIiBzdHJva2U9IiNkODk0MDAiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbCIvPjwvc3ZnPg==\",\"play.svg\":\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTgiIHdpZHRoPSIxOCI+PHBhdGggZD0ibTI0Ni4wNTUgMTgwLTEyLjExIDEyLjExdi0yNC4yMnoiIHRyYW5zZm9ybT0ibWF0cml4KDEuMTM5NDkgMCAwIC42Nzk0MyAtMjY0LjU5NSAtMTEzLjI5OCkiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlPSIjZDg5NDAwIiBmaWxsPSIjZmZhZTAwIiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iLz48L3N2Zz4=\"}},1534:function(e,t,n){\"use strict\";n.r(t),n.d(t,\"resources\",(function(){return s}));var o=n(1394);const s={\"userscript.js\":async function(e){let{addon:t,console:n}=e;const s=t.tab.traps.vm;Object(o.g)(s);const r=document.createElement(\"img\");r.loading=\"lazy\",r.src=t.self.getResource(\"/mute.svg\"),r.className=\"sa-mute-project-icon\",r.style.userSelect=\"none\",t.tab.displayNoneWhileDisabled(r);const a=()=>{r.style.display=t.self.disabled||!Object(o.b)()?\"none\":\"\"};Object(o.c)(a),a();const i=e=>{t.self.disabled||!e.ctrlKey&&!e.metaKey||(e.cancelBubble=!0,e.preventDefault(),Object(o.d)(!Object(o.b)()))};for(t.self.addEventListener(\"disabled\",(()=>{Object(o.b)()&&Object(o.d)(!1)}));;){let e=await t.tab.waitForElement(\"[class^='green-flag_green-flag']\",{markAsSeen:!0,reduxEvents:[\"scratch-gui/mode/SET_PLAYER\",\"fontsLoaded/SET_FONTS_LOADED\",\"scratch-gui/locales/SELECT_LOCALE\"]});t.tab.appendToSharedSpace({space:\"afterStopButton\",element:r,order:0}),e.addEventListener(\"click\",i),e.addEventListener(\"contextmenu\",i)}},\"mute.svg\":\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU1LjIgKDc4MTgxKSAtIGh0dHBzOi8vc2tldGNoYXBwLmNvbSAtLT4KICAgIDx0aXRsZT5Tb3VuZC9FZmZlY3RzL011dGU8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iU291bmQvRWZmZWN0cy9NdXRlIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBmaWxsPSIjQ0Y2M0NGIiBkPSJNMTMuNDU0MTc0OSw1LjA0ODE1MjQzIEwxNS42MjgxMTY4LDIuODc0MjEwNTQgQzE1LjkyMTAxLDIuNTgxMzE3MzIgMTYuMzk1ODgzNywyLjU4MTMxNzMyIDE2LjY4ODc3NywyLjg3NDIxMDU0IEMxNi45ODE2NzAyLDMuMTY3MTAzNzYgMTYuOTgxNjcwMiwzLjY0MTk3NzQ5IDE2LjY4ODc3NywzLjkzNDg3MDcxIEw0LjUzMDMzMDA5LDE2LjA5MzMxNzYgQzQuMjM3NDM2ODcsMTYuMzg2MjEwOCAzLjc2MjU2MzEzLDE2LjM4NjIxMDggMy40Njk2Njk5MSwxNi4wOTMzMTc2IEMzLjE3Njc3NjcsMTUuODAwNDI0NCAzLjE3Njc3NjcsMTUuMzI1NTUwNiAzLjQ2OTY2OTkxLDE1LjAzMjY1NzQgTDYuMzEyMTQ5MzIsMTIuMTkwMTc4IEM2LjEyNDExOTEsMTIuMDYyMTM3OSA2LDExLjg0NjMzMzEgNiwxMS42MDI5ODc1IEw2LDguNjM3NDg3NSBDNiw4LjI0NzExMjUgNi4zMTk0MTUyNyw3LjkyNzYxMjUgNi43MDk2ODY3NSw3LjkyNzYxMjUgTDcuMDI0NjAzMjIsNy45Mjc2MTI1IEM4Ljc1Nzc2ODQ4LDcuOTI3NjEyNSAxMC4yOTQxMTEsNi44MTM4NjI1IDEwLjgzMzk2NzgsNS4xNjY4NjI1IEMxMC45Mjk1Njc0LDQuODc0MzYyNSAxMS4yMDE3NDUyLDQuNjc3NDg3NSAxMS41MDc2NjQxLDQuNjc3NDg3NSBMMTIuODMxNDM3OSw0LjY3NzQ4NzUgQzEzLjEwMDI4NDQsNC42Nzc0ODc1IDEzLjMzNDEwNzUsNC44MjcxNzIwOCAxMy40NTQxNzQ5LDUuMDQ4MTUyNDMgWiBNMTMuNTQsOS4wODM2NDc3MSBMMTMuNTQsMTQuODUzMTEyNSBDMTMuNTQsMTUuMjQ1NzM3NSAxMy4yMjI4MzQxLDE1LjU2Mjk4NzUgMTIuODMxNDM3OSwxNS41NjI5ODc1IEwxMS41MDc2NjQxLDE1LjU2Mjk4NzUgQzExLjIwMTc0NTIsMTUuNTYyOTg3NSAxMC45Mjk1Njc0LDE1LjM2NjExMjUgMTAuODMzOTY3OCwxNS4wNzM2MTI1IEMxMC41NzczNzg1LDE0LjI5MDgwNzcgMTAuMDk1NjgxMywxMy42Mjg0NjUgOS40NzQ3MzUzMSwxMy4xNDg5MTI0IEwxMy41NCw5LjA4MzY0NzcxIFoiIGlkPSJwYXRoLTEiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+Cg==\"}},1542:function(e,t,n){\"use strict\";n.r(t),n.d(t,\"resources\",(function(){return s}));var o=n(1391);const s={\"userscript.js\":async function(e){let{addon:t,msg:n,console:s}=e;const r=new o.a(t),a=await t.tab.traps.getBlockly();Object.defineProperty(a.Gesture.prototype,\"jumpToDef\",{get:()=>!t.self.disabled});const i=a.Gesture.prototype.doBlockClick_;a.Gesture.prototype.doBlockClick_=function(){if(!t.self.disabled&&(1===this.mostRecentEvent_.button||this.mostRecentEvent_.shiftKey)){let e=this.startBlock_;for(;e;e=e.getSurroundParent())if(\"procedures_call\"===e.type){let t=e.getProcCode(),n=r.getWorkspace().getTopBlocks();for(const e of n)if(\"procedures_definition\"===e.type){let n=e.getChildren()[0].getProcCode();if(n&&n===t)return void r.scrollBlockIntoView(e)}}}i.call(this)}}}},1543:function(e,t,n){\"use strict\";n.r(t),n.d(t,\"resources\",(function(){return o}));const o={\"userscript.js\":async function(e){let{addon:t,console:n}=e,o=null;const s=new WeakMap,r=(e,t)=>{let n;s.has(e)?n=s.get(e):(n=e.animate([{},{backgroundColor:\"hsla(0, 100%, 77%, 1)\"}],{duration:250,fill:\"forwards\",easing:\"ease\"}),s.set(e,n)),n.playbackRate=t},a=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,\"value\").set;document.addEventListener(\"dragover\",(e=>{if(t.self.disabled)return;if(!e.dataTransfer.types.includes(\"Files\"))return;let s,i;if((s=e.target.closest('div[class*=\"sprite-selector_sprite-selector\"]'))||(s=e.target.closest('div[class*=\"stage-selector_stage-selector\"]'))||(s=e.target.closest('div[class*=\"selector_wrapper\"]'))?i=e=>{const n=t.settings.get(\"use-hd-upload\")?\"\":\":not(.sa-better-img-uploads-input)\",o=s.querySelector('input[class*=\"action-menu_file-input\"]'+n);o.files=e,o.dispatchEvent(new Event(\"change\",{bubbles:!0}))}:(s=e.target.closest('div[class*=\"monitor_list-monitor\"]'))?i=e=>{const t=document.querySelector(\"body > .react-contextmenu.react-contextmenu--visible\");s.dispatchEvent(new MouseEvent(\"contextmenu\",{bubbles:!0}));const o=document.querySelector(\"body > .react-contextmenu.react-contextmenu--visible\"),r=null===o?t:o;r.style.display=\"none\";const a=document.body.appendChild;document.body.appendChild=t=>{if(document.body.appendChild=a,!(t instanceof HTMLInputElement))return n.error('File input was not immediately given to appendChild upon clicking \"Import\"!'),a(t);document.body.appendChild(t),t.click=()=>{},t.files=e,t.dispatchEvent(new Event(\"change\")),window.requestAnimationFrame((()=>{window.requestAnimationFrame((()=>{r.style.display=null,r.style.opacity=0,r.style.pointerEvents=\"none\"}))}))},r.children[0].click()}:(s=e.target.closest('div[class*=\"question_question-input\"] > input[class*=\"input_input-form_l9eYg\"]'))&&(i=async e=>{const t=(await Promise.all(Array.from(e,(e=>e.text())))).join(\"\").replace(/[\\r\\n]+$/,\"\").replace(/\\r?\\n|\\r/g,\" \"),n=s.selectionStart;((e,t)=>{a.call(e,t),e.dispatchEvent(new Event(\"change\",{bubbles:!0}))})(s,s.value.slice(0,n)+t+s.value.slice(s.selectionEnd)),s.setSelectionRange(n,n+t.length)}),!s)return;if(e.preventDefault(),s===o)return;o=s;const c=[s,s.querySelector('div[class*=\"stage-selector_header_\"]'),s.querySelector('div[class*=\"sprite-info_sprite-info\"]'),s.querySelector('div[class*=\"monitor_list-body\"]')].filter((e=>e));for(const e of c)r(e,1);const l=e=>{e.preventDefault(),p(),e.dataTransfer.types.includes(\"Files\")&&e.dataTransfer.files.length>0&&i(e.dataTransfer.files)},d=e=>{e.preventDefault(),e.dataTransfer.dropEffect=\"copy\"};e.dataTransfer.dropEffect=\"copy\";const u=e=>{e.preventDefault(),p()},p=()=>{o=null,s.removeEventListener(\"dragover\",d),s.removeEventListener(\"dragleave\",u),s.removeEventListener(\"drop\",l);for(const e of c)r(e,-1)};s.addEventListener(\"dragover\",d),s.addEventListener(\"dragleave\",u),s.addEventListener(\"drop\",l)}),{useCapture:!0})}}},658:function(e,t,n){\"use strict\";n.r(t),function(e){var t=n(436),o=n.n(t),s=n(146),r=n(265),a=n(709),i=n(53),c=n(254),l=n(1406),d=n(1407),u=n(1408),p=n(1410),g=n(1411),h=n(1385),b=n(1414),m=n(1415),f=n(1416);const y=e=>e.replace(/([<>'\"&])/g,((e,t)=>\"&#\".concat(t.charCodeAt(0),\";\"))),k=e=>e.replace(/-([a-z])/g,(e=>e[1].toUpperCase()));let v=null;let w,C=[];const M=e=>{C=C.filter((t=>t!==e))},E=(()=>{const e=f.a.state.locales.locale;return Object.prototype.hasOwnProperty.call(d.a,e)?e:e.split(\"-\")[0]})(),_=(async()=>{if(Object.prototype.hasOwnProperty.call(d.a,E)){const e=await d.a[E]();Object.assign(l,e)}})(),x=e=>\"addons-display-none-\".concat(e),S=e=>e.split(/(?=[^\\\\]%[nbs])/g).map((e=>e.trim())).filter((e=>\"%\"===e.charAt(0))).map((e=>e.substring(0,2)));let T=!1;const N=[],I=[\"editor-devtools\",\"block-switching\",\"blocks2image\",\"swap-local-global\"];let j=!1;const D=()=>{const e=f.a.state,t=\"small\"===e.scratchGui.stageSize.stageSize,n=e.scratchGui.mode.isFullScreen,o=e.scratchGui.mode.isPlayerOnly;document.body.classList.toggle(\"sa-small-stage\",t&&!n&&!o),document.body.classList.toggle(\"sa-body-editor\",!o||n)};f.a.addEventListener(\"statechanged\",(e=>{\"scratch-gui/StageSize/SET_STAGE_SIZE\"!==e.detail.action.type&&\"scratch-gui/mode/SET_FULL_SCREEN\"!==e.detail.action.type&&\"scratch-gui/mode/SET_PLAYER\"!==e.detail.action.type||D()})),D();const O=e=>Object.keys(e).find((e=>e.startsWith(\"__reactInternalInstance$\")));class L extends a.a{constructor(e){super(),this._id=e,this._seenElements=new WeakSet,this.traps={get vm(){return f.a.state.scratchGui.vm},getBlockly:()=>i.a.blockly?Promise.resolve(i.a.blockly):new Promise((e=>{i.a.blocklyCallbacks.push((()=>e(i.a.blockly)))})),getWorkspace:()=>i.a.blocklyWorkspace,getPaper:async()=>{const e=await this.waitForElement(\"[class*='paint-editor_mode-selector']\",{reduxCondition:e=>1===e.scratchGui.editorTab.activeTabIndex&&!e.scratchGui.mode.isPlayerOnly});let t,n=e[Object.keys(e).find((e=>e.startsWith(\"__reactInternalInstance$\")))].child;for(;n;){const e=n.child.stateNode;if(e.tool){t=e.tool;break}if(e.blob&&e.blob.tool){t=e.blob.tool;break}n=n.sibling}if(t){return t._scope}throw new Error(\"cannot find paper :(\")},getInternalKey:O}}get redux(){return f.a}waitForElement(e){let{markAsSeen:t=!1,condition:n,reduxCondition:o,reduxEvents:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=!0;const a=()=>!!r&&(!(n&&!n())&&!(o&&!o(f.a.state)));if(a()){const n=document.querySelectorAll(e);for(const e of n)if(!this._seenElements.has(e))return t&&this._seenElements.add(e),Promise.resolve(e)}let i;return s&&(r=!1,i=e=>{let{detail:t}=e;const n=t.action.type;s.includes(n)&&\"fontsLoaded/SET_FONTS_LOADED\"!==n&&(r=!0)},this.redux.initialize(),this.redux.addEventListener(\"statechanged\",i)),new Promise((n=>{const o=()=>{if(!a())return;const s=document.querySelectorAll(e);for(const e of s)if(!this._seenElements.has(e)){n(e),M(o),t&&this._seenElements.add(e),i&&this.redux.removeEventListener(\"statechanged\",i);break}};var s;s=o,w||(w=new MutationObserver((()=>{for(const e of C)e()})),w.observe(document.documentElement,{attributes:!1,childList:!0,subtree:!0})),C.push(s)}))}appendToSharedSpace(e){let{space:t,element:n,order:o,scope:s}=e;const r=document.querySelector.bind(document),a={stageHeader:{element:()=>r(\"[class^='stage-header_stage-size-row']\"),from:()=>[],until:()=>[r(\"[class^='stage-header_stage-size-toggle-group']\"),r(\"[class^='stage-header_stage-size-row']\").lastChild]},fullscreenStageHeader:{element:()=>r(\"[class^='stage-header_fullscreen-buttons-row_']\"),from:()=>[],until:()=>[r(\"[class^='stage-header_fullscreen-buttons-row_']\").lastChild]},afterGreenFlag:{element:()=>r(\"[class^='controls_controls-container']\"),from:()=>[],until:()=>[r(\"[class^='stop-all_stop-all']\")]},afterStopButton:{element:()=>r(\"[class^='controls_controls-container']\"),from:()=>[r(\"[class^='stop-all_stop-all']\")],until:()=>[]},afterSoundTab:{element:()=>r(\"[class^='react-tabs_react-tabs__tab-list']\"),from:()=>[r(\"[class^='react-tabs_react-tabs__tab-list']\").children[2]],until:()=>[r(\".sa-find-bar\")]},assetContextMenuAfterExport:{element:()=>s,from:()=>Array.prototype.filter.call(s.children,(e=>e.textContent===this.scratchMessage(\"gui.spriteSelectorItem.contextMenuExport\"))),until:()=>Array.prototype.filter.call(s.children,(e=>e.textContent===this.scratchMessage(\"gui.spriteSelectorItem.contextMenuDelete\")))},assetContextMenuAfterDelete:{element:()=>s,from:()=>Array.prototype.filter.call(s.children,(e=>e.textContent===this.scratchMessage(\"gui.spriteSelectorItem.contextMenuDelete\"))),until:()=>[]},monitor:{element:()=>s,from:()=>{const e=[this.scratchMessage(\"gui.monitor.contextMenu.large\"),this.scratchMessage(\"gui.monitor.contextMenu.slider\"),this.scratchMessage(\"gui.monitor.contextMenu.sliderRange\"),this.scratchMessage(\"gui.monitor.contextMenu.export\")],t=Array.prototype.filter.call(s.children,(t=>e.includes(t.textContent)));return[t[t.length-1]]},until:()=>[]},paintEditorZoomControls:{element:()=>r(\".sa-paintEditorZoomControls-wrapper\")||(()=>{const e=Object.assign(document.createElement(\"div\"),{className:\"sa-paintEditorZoomControls-wrapper\"});e.style.display=\"flex\",e.style.flexDirection=\"row-reverse\",e.style.height=\"calc(1.95rem + 2px)\";const t=r(\"[class^='paint-editor_zoom-controls']\");return t.replaceWith(e),e.appendChild(t),e})(),from:()=>[],until:()=>[]}}[t],i=a.element();if(!i)return!1;const c=a.from(),l=a.until();n.dataset.saSharedSpaceOrder=o;let d=!1;0===c.length&&(d=!0);let u=null;const p=Array.from(i.children);for(const e of p.keys()){const t=p[e],n=Number(e);if(d){if(l.includes(t)){u=0===n?-1:p[n-1];break}if(t.dataset.saSharedSpaceOrder&&Number(t.dataset.saSharedSpaceOrder)>o){u=0===n?-1:p[n-1];break}}else c.includes(t)&&(d=!0)}return!!d&&(null===u?i.appendChild(n):-1===u?i.prepend(n):i.insertBefore(n,u.nextSibling),!0)}addBlock(e,t){let{args:n,displayName:o,callback:s}=t;const r=S(e);if(n.length!==r.length)throw new Error(\"Procedure code and argument list do not match\");if(o){o=(e=>e.replace(/([^\\s])(%[nbs])/g,((e,t,n)=>\"\".concat(t,\" \").concat(n))))(o);const t=S(o);a=r,i=t,JSON.stringify(a)!==JSON.stringify(i)&&(console.warn(\"displayName \".concat(o,\" for \").concat(e,\" has invalid arguments, ignoring it.\")),o=e)}else o=e;var a,i;const c=this.traps.vm;c.addAddonBlock({procedureCode:e,arguments:n,callback:(e,t)=>s(e,t.thread),displayName:o}),T||(T=!0,this.traps.getBlockly().then((e=>{const t=e.BlockSvg,n=t.prototype.updateColour;t.prototype.updateColour=function(){if(!this.isInsertionMarker()&&\"procedures_call\"===this.type){if(this.procCode_&&c.runtime.getAddonBlock(this.procCode_)){const e=f.a.state.scratchGui.theme.theme.getBlockColors().addons;this.colour_=e.primary,this.colourSecondary_=e.secondary,this.colourTertiary_=e.tertiary,this.colourQuaternary_=e.quaternary,this.customContextMenu=null}}for(var e=arguments.length,t=new Array(e),o=0;o1&&void 0!==arguments[1]?arguments[1]:{};N.push({addonId:this._id,callback:e,workspace:t,blocks:n,flyout:o,comments:s}),N.sort(((e,t)=>I.indexOf(e.addonId)-I.indexOf(t.addonId))),j||(j=!0,this.traps.getBlockly().then((e=>{const t=e.ContextMenu.show;e.ContextMenu.show=function(n,o,s){const r=e.mainWorkspace.currentGesture_,a=r.targetBlock_;for(const{callback:e,workspace:t,blocks:n,flyout:s,comments:i}of N){if(t&&!a&&!r.flyout_&&!r.startBubble_||n&&a&&!r.flyout_||s&&r.flyout_||i&&r.startBubble_)try{o=e(o,a)}catch(e){console.error(\"Error while calling context menu callback: \",e)}}t.call(this,n,o,s);const i=e.WidgetDiv.DIV.firstChild;o.forEach(((e,t)=>{if(0!==t&&e.separator){const e=i.children[t];e.style.paddingTop=\"2px\",e.classList.add(\"sa-blockly-menu-item-border\"),e.style.borderTop=\"1px solid var(--ui-black-transparent)\"}}))}})))}createEditorContextMenu(e,t){Object(p.a)(this,e,t)}copyImage(e){if(!navigator.clipboard.write)return Promise.reject(new Error(\"Clipboard API not supported\"));const t=[new ClipboardItem({\"image/png\":Object(r.a)(e)})];return navigator.clipboard.write(t)}scratchMessage(e){return f.a.state.locales.messages[e]}scratchClassReady(){return Promise.resolve()}scratchClass(){const e=(()=>{if(v)return v;const e=Array.from(document.styleSheets).filter((e=>!(e.ownerNode.textContent.startsWith(\"/* DO NOT EDIT\\n@todo This file is copied from GUI and should be pulled out into a shared library.\")&&(e.ownerNode.textContent.includes(\"input_input-form\")||e.ownerNode.textContent.includes(\"label_input-group_\"))))).map((e=>{try{return[...e.cssRules]}catch(e){return[]}})).flat().map((e=>e.selectorText)).filter((e=>e)).map((e=>e.match(/(([\\w-]+?)_([\\w-]+)_([\\w\\d-]+))/g))).filter((e=>e)).flat();v=[...new Set(e)];const t=new MutationObserver((e=>{for(const n of e)for(const e of n.addedNodes)if(\"STYLE\"===e.tagName)return v=null,void t.disconnect()}));return t.observe(document.head,{childList:!0}),v})(),t=[];for(var n=arguments.length,o=new Array(n),s=0;s{const e=f.a.state.scratchGui.mode;return e.isEmbedded?\"embed\":e.isFullScreen?\"fullscreen\":e.isPlayerOnly?\"projectpage\":\"editor\"})()}displayNoneWhileDisabled(e,t){e.classList.add(x(this._id)),t&&t.display&&(e.style.display=t.display)}get direction(){return this.redux.state.locales.isRtl?\"rtl\":\"ltr\"}createModal(e){let{isOpen:t=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return g.b(this,e,{isOpen:t})}confirm(){for(var e=arguments.length,t=new Array(e),n=0;n{const n=t.replace(/#855cd6/gi,window.Recolor.primary);Object.getOwnPropertyDescriptor(window.HTMLImageElement.prototype,\"src\").set.call(e,\"data:image/svg+xml;,\".concat(encodeURIComponent(n)))};return Object.defineProperty(e,\"src\",{get:()=>t?\"data:image/svg+xml;,\".concat(encodeURIComponent(t)):\"\",set:e=>{const o=e.split(\";base64,\")[1];t=atob(o),n()}}),i.a.recolorCallbacks.push(n),e}}class A extends a.a{constructor(e,t){super(),this._addonId=e,this._manifest=t}get(e){return s.a.getAddonSetting(this._addonId,e)}}class z extends a.a{constructor(e,t){super(),this.id=e,this.disabled=!1,this.getResource=t}}class P{constructor(t){P.instances.push(this);const n=c.a[t];this.id=t,this.manifest=n,this.messageCache={},this.loading=!0,this.resources=null,this.publicAPI={global:e,console:console,addon:{tab:new L(t),settings:new A(t,n),self:new z(t,this.getResource.bind(this))},msg:this.msg.bind(this),safeMsg:this.safeMsg.bind(this)}}_msg(e,t,n){const s=e.startsWith(\"/\")?e.substring(1):\"\".concat(this.id,\"/\").concat(e);if(this.messageCache[s])return this.messageCache[s].format(t);let r=l[s];if(!r)return s;n&&(r=n(r));const a=new o.a(r,E);return this.messageCache[s]=a,a.format(t)}msg(e,t){return this._msg(e,t,null)}safeMsg(e,t){return this._msg(e,t,y)}getResource(e){const t=e.substring(1),n=this.resources[t];if(\"string\"!=typeof n)throw new Error(\"Unknown asset: \".concat(e));return n}updateAllStyles(){b.b(),this.updateCssVariables()}updateCssVariables(){const e=k(this.id);if(this.manifest.settings)for(const t of this.manifest.settings){const n=t.id,o=\"--\".concat(e,\"-\").concat(k(n)),s=this.publicAPI.addon.settings.get(n);document.documentElement.style.setProperty(o,s)}if(this.manifest.customCssVariables)for(const t of this.manifest.customCssVariables){const n=t.name,o=\"--\".concat(e,\"-\").concat(n),s=t.value,r=this.evaluateCustomCssVariable(s);document.documentElement.style.setProperty(o,r)}}evaluateCustomCssVariable(e){if(\"object\"!=typeof e||null===e)return e;switch(e.type){case\"alphaBlend\":{const t=this.evaluateCustomCssVariable(e.opaqueSource),n=this.evaluateCustomCssVariable(e.transparentSource);return h.a(t,n)}case\"alphaThreshold\":{const t=this.evaluateCustomCssVariable(e.source);return h.e(t).a>=(this.evaluateCustomCssVariable(e.threshold)||.5)?this.evaluateCustomCssVariable(e.opaque):this.evaluateCustomCssVariable(e.transparent)}case\"brighten\":{const t=this.evaluateCustomCssVariable(e.source);return h.b(t,e)}case\"makeHsv\":{const t=this.evaluateCustomCssVariable(e.h),n=this.evaluateCustomCssVariable(e.s),o=this.evaluateCustomCssVariable(e.v);return h.c(t,n,o)}case\"map\":return e.options[this.evaluateCustomCssVariable(e.source)];case\"multiply\":{const t=this.evaluateCustomCssVariable(e.source);return h.d(t,e)}case\"recolorFilter\":{const t=this.evaluateCustomCssVariable(e.source);return h.f(t)}case\"settingValue\":return this.publicAPI.addon.settings.get(e.settingId);case\"ternary\":{const t=this.evaluateCustomCssVariable(e.source);return this.evaluateCustomCssVariable(t?e.true:e.false)}case\"textColor\":{const t=this.evaluateCustomCssVariable(e.source),n=this.evaluateCustomCssVariable(e.black),o=this.evaluateCustomCssVariable(e.white),s=this.evaluateCustomCssVariable(e.threshold);return h.h(t,n,o,s)}}return console.warn(\"Unknown customCssVariable\",e),\"#000000\"}settingsChanged(){this.updateAllStyles(),this.publicAPI.addon.settings.dispatchEvent(new CustomEvent(\"change\"))}dynamicEnable(){this.loading||(this.publicAPI.addon.self.disabled=!1,this.updateAllStyles(),this.publicAPI.addon.self.dispatchEvent(new CustomEvent(\"reenabled\")))}dynamicDisable(){this.loading||(this.publicAPI.addon.self.disabled=!0,this.updateAllStyles(),this.publicAPI.addon.self.dispatchEvent(new CustomEvent(\"disabled\")))}async run(){this.manifest.editorOnly&&await(()=>{if(f.a.state.scratchGui.mode.isPlayerOnly&&!f.a.state.scratchGui.mode.isEmbedded)return new Promise((e=>{const t=()=>{f.a.state.scratchGui.mode.isPlayerOnly||(e(),f.a.removeEventListener(\"statechanged\",t))};f.a.initialize(),f.a.addEventListener(\"statechanged\",t)}))})();const e=await u.a[this.id]();this.resources=e.resources,this.manifest.noTranslations||await _;const t=100*Object(m.a)(this.id);if(this.manifest.userstyles)for(let e=0;e!this.publicAPI.addon.self.disabled&&s.a.evaluateCondition(this.id,n.if);for(const[e,t]of this.resources[n.url]){b.a(e,t).addDependent(this.id,o,r)}}const n=\".\".concat(x(this.id),\"{display:none !important;}\");if(b.a(\"_disabled/\".concat(this.id),n).addDependent(this.id,t,(()=>this.publicAPI.addon.self.disabled)),this.updateCssVariables(),this.manifest.userscripts)for(const e of this.manifest.userscripts){if(!s.a.evaluateCondition(e.if))continue;(0,this.resources[e.url])(this.publicAPI)}this.loading=!1}}P.instances=[];const B=e=>{new P(e).run()};s.a.addEventListener(\"addon-changed\",(e=>{const t=e.detail.addonId,n=P.instances.find((e=>e.id===t));n&&n.settingsChanged(),e.detail.dynamicEnable?n?n.dynamicEnable():B(t):e.detail.dynamicDisable&&n&&n.dynamicDisable()}));for(const e of Object.keys(c.a))s.a.getAddonEnabled(e)&&B(e)}.call(this,n(151))}}]);","name":"js/pentapod/addons.a3af0b901e6436597a32.js","input":"(window[\"webpackJsonpGUI\"] = window[\"webpackJsonpGUI\"] || []).push([[83],{\n\n/***/ 1380:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return isPaused; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return setPaused; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return onPauseChanged; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return onSingleStep; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getRunningThread; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return singleStep; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return setup; });\n/* harmony import */ var _event_target_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(709);\n /* inserted by pull.js */\n\n// https://github.com/scratchfoundation/scratch-vm/blob/bb352913b57991713a5ccf0b611fda91056e14ec/src/engine/thread.js#L198\nconst STATUS_RUNNING = 0;\nconst STATUS_PROMISE_WAIT = 1;\nconst STATUS_YIELD = 2;\nconst STATUS_YIELD_TICK = 3;\nconst STATUS_DONE = 4;\nconst REACT_INTERNAL_PREFIX = \"__reactInternalInstance$\";\nlet vm;\nlet paused = false;\nlet pausedThreadState = new WeakMap();\nlet pauseNewThreads = false;\nlet steppingThread = null;\nconst eventTarget = new _event_target_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"]();\nlet audioContextStateChange = Promise.resolve();\nconst isPaused = () => paused;\nconst pauseThread = thread => {\n if (thread.updateMonitor || pausedThreadState.has(thread)) {\n // Thread is already paused or shouldn't be paused.\n return;\n }\n const pauseState = {\n time: vm.runtime.currentMSecs,\n status: thread.status\n };\n pausedThreadState.set(thread, pauseState);\n\n // Pausing a thread now works by just setting its status to STATUS_PROMISE_WAIT.\n // At the start of each frame, we make sure each paused thread is still paused.\n // This is really the best way to implement this.\n // Converting thread.status into a getter/setter causes Scratch's sequencer to permanently\n // perform significantly slower in some projects. I think this is because it causes some\n // very hot functions to be deoptimized.\n // Trapping sequencer.stepThread to no-op for a paused thread causes Scratch's sequencer\n // to waste 24ms of CPU time every frame because it thinks a thread is running.\n thread.status = STATUS_PROMISE_WAIT;\n};\nconst ensurePausedThreadIsStillPaused = thread => {\n if (thread.status === STATUS_DONE) {\n // If a paused thread is finished by single stepping, let it keep being done.\n return;\n }\n const pauseState = pausedThreadState.get(thread);\n if (pauseState) {\n if (thread.status !== STATUS_PROMISE_WAIT) {\n // We'll record the change so we can properly resume the thread, but the thread must still be paused for now.\n pauseState.status = thread.status;\n thread.status = STATUS_PROMISE_WAIT;\n }\n }\n};\nconst setSteppingThread = thread => {\n steppingThread = thread;\n};\nconst compensateForTimePassedWhilePaused = (thread, pauseState) => {\n // TW: Compiled threads store their timer in a different place.\n if (thread.timer) {\n thread.timer.startTime += vm.runtime.currentMSecs - pauseState.time;\n }\n if (thread.compatibilityStackFrame && thread.compatibilityStackFrame.timer) {\n thread.compatibilityStackFrame.timer.startTime += vm.runtime.currentMSecs - pauseState.time;\n }\n const stackFrame = thread.peekStackFrame();\n if (stackFrame && stackFrame.executionContext && stackFrame.executionContext.timer) {\n stackFrame.executionContext.timer.startTime += vm.runtime.currentMSecs - pauseState.time;\n }\n};\nconst stepUnsteppedThreads = lastSteppedThread => {\n // If we paused in the middle of a tick, we need to make sure to step the scripts that didn't get\n // stepped in that tick to avoid affecting project behavior.\n const threads = vm.runtime.threads;\n const startingIndex = getThreadIndex(lastSteppedThread);\n if (startingIndex !== -1) {\n for (let i = startingIndex; i < threads.length; i++) {\n const thread = threads[i];\n const status = thread.status;\n if (status === STATUS_RUNNING || status === STATUS_YIELD || status === STATUS_YIELD_TICK) {\n vm.runtime.sequencer.activeThread = thread;\n vm.runtime.sequencer.stepThread(thread);\n }\n }\n }\n};\nconst setPaused = _paused => {\n const didChange = paused !== _paused;\n if (didChange) {\n paused = _paused;\n eventTarget.dispatchEvent(new CustomEvent(\"change\"));\n\n // TW: events for extensions\n if (paused) {\n vm.runtime.emit(\"RUNTIME_PAUSED\");\n } else {\n vm.runtime.emit(\"RUNTIME_UNPAUSED\");\n }\n }\n\n // Don't check didChange as new threads could've started that we need to pause.\n if (paused) {\n audioContextStateChange = audioContextStateChange.then(() => {\n return vm.runtime.audioEngine.audioContext.suspend();\n });\n if (!vm.runtime.ioDevices.clock._paused) {\n vm.runtime.ioDevices.clock.pause();\n }\n vm.runtime.threads.forEach(pauseThread);\n const activeThread = vm.runtime.sequencer.activeThread;\n if (activeThread) {\n setSteppingThread(activeThread);\n eventTarget.dispatchEvent(new CustomEvent(\"step\"));\n }\n }\n\n // Only run unpausing logic when pause state changed to avoid unnecessary work\n if (!paused && didChange) {\n audioContextStateChange = audioContextStateChange.then(() => {\n return vm.runtime.audioEngine.audioContext.resume();\n });\n vm.runtime.ioDevices.clock.resume();\n for (const thread of vm.runtime.threads) {\n const pauseState = pausedThreadState.get(thread);\n if (pauseState) {\n compensateForTimePassedWhilePaused(thread, pauseState);\n thread.status = pauseState.status;\n }\n }\n pausedThreadState = new WeakMap();\n const lastSteppedThread = steppingThread;\n // This must happen after the \"change\" event is fired to fix https://github.com/ScratchAddons/ScratchAddons/issues/4281\n stepUnsteppedThreads(lastSteppedThread);\n steppingThread = null;\n }\n};\nconst onPauseChanged = listener => {\n eventTarget.addEventListener(\"change\", () => listener(paused));\n};\nconst onSingleStep = listener => {\n eventTarget.addEventListener(\"step\", listener);\n};\nconst getRunningThread = () => steppingThread;\n\n// A modified version of this function\n// https://github.com/scratchfoundation/scratch-vm/blob/0e86a78a00db41af114df64255e2cd7dd881329f/src/engine/sequencer.js#L179\n// Returns if we should continue executing this thread.\nconst singleStepThread = thread => {\n if (thread.status === STATUS_DONE) {\n return false;\n }\n // TW: Can't single-step compiled threads\n if (thread.isCompiled) {\n return false;\n }\n const currentBlockId = thread.peekStack();\n if (!currentBlockId) {\n thread.popStack();\n if (thread.stack.length === 0) {\n thread.status = STATUS_DONE;\n return false;\n }\n }\n pauseNewThreads = true;\n vm.runtime.sequencer.activeThread = thread;\n\n /*\n We need to call execute(this, thread) like the original sequencer. We don't\n have access to that method, so we need to force the original stepThread to run\n execute for us then exit before it tries to run more blocks.\n So, we make `thread.blockGlowInFrame = ...` throw an exception, so this line:\n https://github.com/scratchfoundation/scratch-vm/blob/bb352913b57991713a5ccf0b611fda91056e14ec/src/engine/sequencer.js#L214\n will end the function early. We then have to set it back to normal afterward.\n Why are we here just to suffer?\n */\n const specialError = [\"special error used by Scratch Addons for implementing single-stepping\"];\n Object.defineProperty(thread, \"blockGlowInFrame\", {\n set(_block) {\n throw specialError;\n }\n });\n try {\n thread.status = STATUS_RUNNING;\n\n // Restart the warp timer on each step.\n // If we don't do this, Scratch will think a lot of time has passed and may yield this thread.\n if (thread.warpTimer) {\n thread.warpTimer.start();\n }\n try {\n vm.runtime.sequencer.stepThread(thread);\n } catch (err) {\n if (err !== specialError) throw err;\n }\n if (thread.status !== STATUS_RUNNING) {\n return false;\n }\n if (thread.peekStack() === currentBlockId) {\n thread.goToNextBlock();\n }\n while (!thread.peekStack()) {\n thread.popStack();\n if (thread.stack.length === 0) {\n thread.status = STATUS_DONE;\n return false;\n }\n const stackFrame = thread.peekStackFrame();\n if (stackFrame.isLoop) {\n if (thread.peekStackFrame().warpMode) {\n continue;\n } else {\n return false;\n }\n } else if (stackFrame.waitingReporter) {\n return false;\n }\n thread.goToNextBlock();\n }\n return true;\n } finally {\n pauseNewThreads = false;\n vm.runtime.sequencer.activeThread = null;\n Object.defineProperty(thread, \"blockGlowInFrame\", {\n value: currentBlockId,\n configurable: true,\n enumerable: true,\n writable: true\n });\n\n // Strictly this doesn't seem to be necessary, but let's make sure the thread is still paused after we step it.\n if (thread.status !== STATUS_DONE) {\n thread.status = STATUS_PROMISE_WAIT;\n }\n }\n};\nconst getRealStatus = thread => {\n const pauseState = pausedThreadState.get(thread);\n if (pauseState) {\n return pauseState.status;\n }\n return thread.status;\n};\nconst getThreadIndex = thread => {\n // We can't use vm.runtime.threads.indexOf(thread) because threads can be restarted.\n // This can happens when, for example, a \"when I receive message1\" script broadcasts message1.\n // The object in runtime.threads is replaced when this happens.\n if (!thread) return -1;\n return vm.runtime.threads.findIndex(otherThread => otherThread.target === thread.target && otherThread.topBlock === thread.topBlock && otherThread.stackClick === thread.stackClick && otherThread.updateMonitor === thread.updateMonitor);\n};\nconst findNewSteppingThread = startingIndex => {\n const threads = vm.runtime.threads;\n for (let i = startingIndex; i < threads.length; i++) {\n const possibleNewThread = threads[i];\n if (possibleNewThread.updateMonitor) {\n // Never single-step monitor update threads.\n continue;\n }\n // TW: Can't single-step compiled threads\n if (possibleNewThread.isCompiled) {\n continue;\n }\n const status = getRealStatus(possibleNewThread);\n if (status === STATUS_RUNNING || status === STATUS_YIELD || status === STATUS_YIELD_TICK) {\n // Thread must not be running for single stepping to work.\n pauseThread(possibleNewThread);\n return possibleNewThread;\n }\n }\n return null;\n};\nconst singleStep = () => {\n if (steppingThread) {\n const pauseState = pausedThreadState.get(steppingThread);\n // We can assume pauseState is defined as any single stepping threads must already be paused.\n\n // Make it look like no time has passed\n compensateForTimePassedWhilePaused(steppingThread, pauseState);\n pauseState.time = vm.runtime.currentMSecs;\n\n // Execute the block\n const continueExecuting = singleStepThread(steppingThread);\n if (!continueExecuting) {\n // Try to move onto the next thread\n steppingThread = findNewSteppingThread(getThreadIndex(steppingThread) + 1);\n }\n }\n\n // If we don't have a thread, than we are between VM steps and should search for a new thread\n if (!steppingThread) {\n setSteppingThread(findNewSteppingThread(0));\n\n // End of VM step, emulate one frame of time passing.\n vm.runtime.ioDevices.clock._pausedTime += vm.runtime.currentStepTime;\n // Skip all sounds forward by vm.runtime.currentStepTime milliseconds so it's as\n // if they where playing for one frame.\n const audioContext = vm.runtime.audioEngine.audioContext;\n for (const target of vm.runtime.targets) {\n for (const soundId of Object.keys(target.sprite.soundBank.soundPlayers)) {\n const soundPlayer = target.sprite.soundBank.soundPlayers[soundId];\n if (soundPlayer.outputNode) {\n soundPlayer.outputNode.stop(audioContext.currentTime);\n soundPlayer._createSource();\n soundPlayer.outputNode.start(audioContext.currentTime, audioContext.currentTime - soundPlayer.startingUntil + vm.runtime.currentStepTime / 1000);\n soundPlayer.startingUntil -= vm.runtime.currentStepTime / 1000;\n }\n }\n }\n // Move all threads forward one frame in time. For blocks like `wait () seconds`\n for (const thread of vm.runtime.threads) {\n if (pausedThreadState.has(thread)) {\n pausedThreadState.get(thread).time += vm.runtime.currentStepTime;\n }\n }\n\n // Try to run edge activated hats\n pauseNewThreads = true;\n const hats = vm.runtime._hats;\n for (const hatType in hats) {\n if (!Object.prototype.hasOwnProperty.call(hats, hatType)) continue;\n const hat = hats[hatType];\n if (hat.edgeActivated) {\n vm.runtime.startHats(hatType);\n }\n }\n pauseNewThreads = false;\n }\n eventTarget.dispatchEvent(new CustomEvent(\"step\"));\n};\nconst setup = addon => {\n if (vm) {\n return;\n }\n vm = addon.tab.traps.vm;\n const originalStepThreads = vm.runtime.sequencer.stepThreads;\n vm.runtime.sequencer.stepThreads = function () {\n if (isPaused()) {\n for (const thread of this.runtime.threads) {\n ensurePausedThreadIsStillPaused(thread);\n }\n }\n return originalStepThreads.call(this);\n };\n\n // Unpause when green flag\n const originalGreenFlag = vm.runtime.greenFlag;\n vm.runtime.greenFlag = function () {\n setPaused(false);\n return originalGreenFlag.call(this);\n };\n\n // Disable edge-activated hats and hats like \"when key pressed\" while paused.\n const originalStartHats = vm.runtime.startHats;\n vm.runtime.startHats = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n const hat = args[0];\n // These hats can be manually started by the user when paused or while single stepping.\n const isUserInitiated = hat === \"event_whenbroadcastreceived\" || hat === \"control_start_as_clone\";\n if (pauseNewThreads) {\n if (!isUserInitiated && !this.getIsEdgeActivatedHat(hat)) {\n return [];\n }\n const newThreads = originalStartHats.apply(this, args);\n for (const thread of newThreads) {\n pauseThread(thread);\n }\n return newThreads;\n } else if (paused && !isUserInitiated) {\n return [];\n }\n return originalStartHats.apply(this, args);\n };\n\n // Paused threads should not be counted as running when updating GUI state.\n const originalGetMonitorThreadCount = vm.runtime._getMonitorThreadCount;\n vm.runtime._getMonitorThreadCount = function (threads) {\n let count = originalGetMonitorThreadCount.call(this, threads);\n if (paused) {\n for (const thread of threads) {\n if (pausedThreadState.has(thread)) {\n count++;\n }\n }\n }\n return count;\n };\n};\n\n/***/ }),\n\n/***/ 1385:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return parseHex; });\n/* unused harmony export convertToHex */\n/* unused harmony export convertFromHsv */\n/* unused harmony export convertToHsv */\n/* unused harmony export brightness */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return textColor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return multiply; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return brighten; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return alphaBlend; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return removeAlpha; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return makeHsv; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return recolorFilter; });\nfunction parseHex(hex) {\n return {\n r: parseInt(hex.substring(1, 3), 16),\n g: parseInt(hex.substring(3, 5), 16),\n b: parseInt(hex.substring(5, 7), 16),\n a: hex.length >= 9 ? parseInt(hex.substring(7, 9), 16) / 255 : 1\n };\n}\nfunction convertComponentToHex(a) {\n a = Math.round(a).toString(16);\n if (a.length === 1) return \"0\".concat(a);\n return a;\n}\nfunction convertToHex(obj) {\n const r = convertComponentToHex(obj.r);\n const g = convertComponentToHex(obj.g);\n const b = convertComponentToHex(obj.b);\n const a = obj.a !== undefined ? convertComponentToHex(255 * obj.a) : \"\";\n return \"#\".concat(r).concat(g).concat(b).concat(a);\n}\nfunction convertFromHsv(_ref) {\n let {\n h,\n s,\n v\n } = _ref;\n if (s === 0) return {\n r: 255 * v,\n g: 255 * v,\n b: 255 * v\n };\n h %= 360;\n if (h < 0) h += 360;\n const h1 = h / 60;\n const hi = Math.floor(h1);\n const x = v * (1 - s * (1 - h1 + hi));\n const y = v * (1 - s * (h1 - hi));\n const z = v * (1 - s);\n switch (hi) {\n case 0:\n return {\n r: 255 * v,\n g: 255 * x,\n b: 255 * z\n };\n case 1:\n return {\n r: 255 * y,\n g: 255 * v,\n b: 255 * z\n };\n case 2:\n return {\n r: 255 * z,\n g: 255 * v,\n b: 255 * x\n };\n case 3:\n return {\n r: 255 * z,\n g: 255 * y,\n b: 255 * v\n };\n case 4:\n return {\n r: 255 * x,\n g: 255 * z,\n b: 255 * v\n };\n case 5:\n return {\n r: 255 * v,\n g: 255 * z,\n b: 255 * y\n };\n }\n}\nfunction convertToHsv(_ref2) {\n let {\n r,\n g,\n b\n } = _ref2;\n r /= 255;\n g /= 255;\n b /= 255;\n const v = Math.max(r, g, b);\n const d = v - Math.min(r, g, b);\n if (d === 0) return {\n h: 0,\n s: 0,\n v: v\n }; // gray\n const s = d / v;\n const hr = (v - r) / d;\n const hg = (v - g) / d;\n const hb = (v - b) / d;\n let h1;\n if (!hr) h1 = hb - hg;else if (!hg) h1 = 2 + hr - hb;else if (!hb) h1 = 4 + hg - hr;\n const h = 60 * h1 % 360;\n return {\n h,\n s,\n v\n };\n}\nfunction brightness(hex) {\n const {\n r,\n g,\n b\n } = parseHex(hex);\n return r * 0.299 + g * 0.587 + b * 0.114;\n}\nfunction textColor(hex, black, white, threshold) {\n threshold = threshold !== undefined ? threshold : 170;\n if (typeof threshold !== \"number\") threshold = brightness(threshold);\n if (brightness(hex) > threshold) {\n // https://stackoverflow.com/a/3943023\n return black !== undefined ? black : \"#575e75\";\n } else {\n return white !== undefined ? white : \"#ffffff\";\n }\n}\nfunction multiply(hex, c) {\n const {\n r,\n g,\n b,\n a\n } = parseHex(hex);\n if (c.r === undefined) c.r = 1;\n if (c.g === undefined) c.g = 1;\n if (c.b === undefined) c.b = 1;\n if (c.a === undefined) c.a = 1;\n return convertToHex({\n r: c.r * r,\n g: c.g * g,\n b: c.b * b,\n a: c.a * a\n });\n}\nfunction brighten(hex, c) {\n const {\n r,\n g,\n b,\n a\n } = parseHex(hex);\n if (c.r === undefined) c.r = 1;\n if (c.g === undefined) c.g = 1;\n if (c.b === undefined) c.b = 1;\n if (c.a === undefined) c.a = 1;\n return convertToHex({\n r: (1 - c.r) * 255 + c.r * r,\n g: (1 - c.g) * 255 + c.g * g,\n b: (1 - c.b) * 255 + c.b * b,\n a: 1 - c.a + c.a * a\n });\n}\nfunction alphaBlend(opaqueHex, transparentHex) {\n const {\n r: r1,\n g: g1,\n b: b1\n } = parseHex(opaqueHex);\n const {\n r: r2,\n g: g2,\n b: b2,\n a\n } = parseHex(transparentHex);\n return convertToHex({\n r: (1 - a) * r1 + a * r2,\n g: (1 - a) * g1 + a * g2,\n b: (1 - a) * b1 + a * b2\n });\n}\nfunction removeAlpha(hex) {\n return hex.substring(0, 7);\n}\nfunction makeHsv(hSource, sSource, vSource) {\n const h = typeof hSource === \"number\" ? hSource : convertToHsv(parseHex(hSource)).h;\n const s = typeof hSource !== \"number\" && convertToHsv(parseHex(hSource)).s === 0 ? 0 : typeof sSource === \"number\" ? sSource : convertToHsv(parseHex(sSource)).s;\n const v = typeof vSource === \"number\" ? vSource : convertToHsv(parseHex(vSource)).v;\n return convertToHex(convertFromHsv({\n h,\n s,\n v\n }));\n}\nfunction recolorFilter(hex) {\n const {\n r,\n g,\n b\n } = parseHex(hex);\n return \"url(\\\"data:image/svg+xml,\\n \\n \\n \\n \\n #recolor\\n \\\")\").split(\"\\n\").join(\"\");\n}\n\n\n/***/ }),\n\n/***/ 1391:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"a\", function() { return /* binding */ Utils_Utils; });\n\n// EXTERNAL MODULE: ./src/addons/addons/find-bar/blockly/BlockInstance.js\nvar BlockInstance = __webpack_require__(1393);\n\n// CONCATENATED MODULE: ./src/addons/addons/find-bar/blockly/BlockFlasher.js\n/**\n * Helper class to flash a Blockly scratch block in the users workspace\n */\nclass BlockFlasher {\n /**\n * FLash a block 3 times\n * @param block the block to flash\n */\n static flash(block) {\n if (myFlash.timerID > 0) {\n clearTimeout(myFlash.timerID);\n if (myFlash.block.svgPath_) {\n myFlash.block.svgPath_.style.fill = \"\";\n }\n }\n let count = 4;\n let flashOn = true;\n myFlash.block = block;\n\n /**\n * Internal method to switch the colour of a block between light yellow and it's original colour\n * @private\n */\n function _flash() {\n if (myFlash.block.svgPath_) {\n myFlash.block.svgPath_.style.fill = flashOn ? \"#ffff80\" : \"\";\n }\n flashOn = !flashOn;\n count--;\n if (count > 0) {\n myFlash.timerID = setTimeout(_flash, 200);\n } else {\n myFlash.timerID = 0;\n myFlash.block = null;\n }\n }\n _flash();\n }\n}\nconst myFlash = {\n block: null,\n timerID: null\n};\n// CONCATENATED MODULE: ./src/addons/addons/find-bar/blockly/Utils.js\n\n\n\n// Make these global so that every addon uses the same arrays.\nlet views = [];\nlet forward = [];\nclass Utils_Utils {\n constructor(addon) {\n this.addon = addon;\n this.addon.tab.traps.getBlockly().then(blockly => {\n this.blockly = blockly;\n });\n /**\n * Scratch Virtual Machine\n * @type {null|*}\n */\n this.vm = this.addon.tab.traps.vm;\n // this._myFlash = { block: null, timerID: null, colour: null };\n this.offsetX = 32;\n this.offsetY = 32;\n this.navigationHistory = new NavigationHistory();\n /**\n * The workspace\n */\n this._workspace = null;\n }\n\n /**\n * Get the Scratch Editing Target\n * @returns {?Target} the scratch editing target\n */\n getEditingTarget() {\n return this.vm.runtime.getEditingTarget();\n }\n\n /**\n * Set the current workspace (switches sprites)\n * @param targetID {string}\n */\n setEditingTarget(targetID) {\n if (this.getEditingTarget().id !== targetID) {\n this.vm.setEditingTarget(targetID);\n }\n }\n\n /**\n * Returns the main workspace\n * @returns !Blockly.Workspace\n */\n getWorkspace() {\n const currentWorkspace = Blockly.getMainWorkspace();\n if (currentWorkspace.getToolbox()) {\n // Sadly get get workspace does not always return the 'real' workspace... Not sure how to get that at the moment,\n // but we can work out whether it's the right one by whether it has a toolbox.\n this._workspace = currentWorkspace;\n }\n return this._workspace;\n }\n\n /**\n * Based on wksp.centerOnBlock(li.data.labelID);\n * @param blockOrId {Blockly.Block|{id}|BlockInstance} A Blockly Block, a block id, or a BlockInstance\n */\n scrollBlockIntoView(blockOrId) {\n var _this$blockly;\n let workspace = this.getWorkspace();\n /** @type {Blockly.Block} */\n let block; // or is it really a Blockly.BlockSvg?\n\n if (blockOrId instanceof BlockInstance[\"a\" /* default */]) {\n // Switch to sprite\n this.setEditingTarget(blockOrId.targetId);\n // Highlight the block!\n block = workspace.getBlockById(blockOrId.id);\n } else {\n block = blockOrId && blockOrId.id ? blockOrId : workspace.getBlockById(blockOrId);\n }\n if (!block) {\n return;\n }\n\n /**\n * !Blockly.Block\n */\n let root = block.getRootBlock();\n let base = this.getTopOfStackFor(block);\n let ePos = base.getRelativeToSurfaceXY(),\n // Align with the top of the block\n rPos = root.getRelativeToSurfaceXY(),\n // Align with the left of the block 'stack'\n scale = workspace.scale,\n x = rPos.x * scale,\n y = ePos.y * scale,\n xx = block.width + x,\n // Turns out they have their x & y stored locally, and they are the actual size rather than scaled or including children...\n yy = block.height + y,\n s = workspace.getMetrics();\n if (x < s.viewLeft + this.offsetX - 4 || xx > s.viewLeft + s.viewWidth || y < s.viewTop + this.offsetY - 4 || yy > s.viewTop + s.viewHeight) {\n // sx = s.contentLeft + s.viewWidth / 2 - x,\n let sx = x - s.contentLeft - this.offsetX,\n // sy = s.contentTop - y + Math.max(Math.min(32, 32 * scale), (s.viewHeight - yh) / 2);\n sy = y - s.contentTop - this.offsetY;\n this.navigationHistory.storeView(this.navigationHistory.peek(), 64);\n\n // workspace.hideChaff(),\n workspace.scrollbar.set(sx, sy);\n this.navigationHistory.storeView({\n left: sx,\n top: sy\n }, 64);\n }\n (_this$blockly = this.blockly) === null || _this$blockly === void 0 ? void 0 : _this$blockly.hideChaff();\n BlockFlasher.flash(block);\n }\n\n /**\n * Find the top stack block of a stack\n * @param block a block in a stack\n * @returns {*} a block that is the top of the stack of blocks\n */\n getTopOfStackFor(block) {\n let base = block;\n while (base.getOutputShape() && base.getSurroundParent()) {\n base = base.getSurroundParent();\n }\n return base;\n }\n}\nclass NavigationHistory {\n /**\n * Keep a record of the scroll and zoom position\n */\n storeView(next, dist) {\n forward = [];\n let workspace = Blockly.getMainWorkspace(),\n s = workspace.getMetrics();\n let pos = {\n left: s.viewLeft,\n top: s.viewTop\n };\n if (!next || distance(pos, next) > dist) {\n views.push(pos);\n }\n }\n peek() {\n return views.length > 0 ? views[views.length - 1] : null;\n }\n goBack() {\n const workspace = Blockly.getMainWorkspace(),\n s = workspace.getMetrics();\n let pos = {\n left: s.viewLeft,\n top: s.viewTop\n };\n let view = this.peek();\n if (!view) {\n return;\n }\n if (distance(pos, view) < 64) {\n // Go back to current if we are already far away from it\n if (views.length > 1) {\n views.pop();\n forward.push(view);\n }\n }\n view = this.peek();\n if (!view) {\n return;\n }\n let sx = view.left - s.contentLeft,\n sy = view.top - s.contentTop;\n\n // transform.setTranslate(-600,0);\n\n workspace.scrollbar.set(sx, sy);\n\n /*\n let blocklySvg = document.getElementsByClassName('blocklySvg')[0];\n let blocklyBlockCanvas = blocklySvg.getElementsByClassName('blocklyBlockCanvas')[0];\n let transform = blocklyBlockCanvas.transform.baseVal.getItem(0);\n let scale = blocklyBlockCanvas.transform.baseVal.getItem(1);\n let transformMatrix = transform.matrix;\n let scaleMatrix = scale.matrix;\n console.log('Transform - getMetrics', s);\n console.log('sx, sy: ', sx, sy);\n console.log('left, top: ', view.left, view.top);\n console.log('contentLeft, right:', s.contentLeft, s.contentTop);\n console.log('transform, scale matrix: ', transformMatrix, scaleMatrix);\n */\n }\n goForward() {\n let view = forward.pop();\n if (!view) {\n return;\n }\n views.push(view);\n let workspace = Blockly.getMainWorkspace(),\n s = workspace.getMetrics();\n let sx = view.left - s.contentLeft,\n sy = view.top - s.contentTop;\n workspace.scrollbar.set(sx, sy);\n }\n}\nfunction distance(pos, next) {\n return Math.sqrt(Math.pow(pos.left - next.left, 2) + Math.pow(pos.top - next.top, 2));\n}\n\n/***/ }),\n\n/***/ 1393:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return BlockInstance; });\n/**\n * Encapsulates a block (either in this sprite or another / Blockly, or native JSON block\n */\nclass BlockInstance {\n constructor(target, block) {\n this.targetId = target.id;\n this.id = block.id;\n }\n}\n\n/***/ }),\n\n/***/ 1394:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return setVolume; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getVolume; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return isMuted; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return setUnmutedVolume; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return setMuted; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return onVolumeChanged; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return setup; });\n// Volumes in this file are always in 0-1.\n\nlet hasSetup = false;\n/** @type {AudioParam|null} */\nlet gainNode = null;\nlet unmuteVolume = 1;\nlet volumeBeforeFinishSetup = 1;\nconst callbacks = [];\nconst setVolume = newVolume => {\n if (gainNode) {\n gainNode.value = newVolume;\n } else {\n volumeBeforeFinishSetup = newVolume;\n }\n callbacks.forEach(i => i());\n};\nconst getVolume = () => {\n if (gainNode) {\n return gainNode.value;\n }\n return volumeBeforeFinishSetup;\n};\nconst isMuted = () => {\n return getVolume() === 0;\n};\nconst setUnmutedVolume = newUnmuteVolume => {\n unmuteVolume = newUnmuteVolume;\n};\nconst setMuted = newMuted => {\n if (newMuted) {\n setUnmutedVolume(getVolume());\n setVolume(0);\n } else {\n setVolume(unmuteVolume);\n }\n};\nconst onVolumeChanged = callback => {\n callbacks.push(callback);\n};\nconst gotAudioEngine = audioEngine => {\n if (!audioEngine) {\n console.error('could not get audio engine; sound-related addons will not work');\n return;\n }\n gainNode = audioEngine.inputNode.gain;\n gainNode.value = volumeBeforeFinishSetup;\n};\nconst setup = vm => {\n if (hasSetup) {\n return;\n }\n hasSetup = true;\n const audioEngine = vm.runtime.audioEngine;\n if (audioEngine) {\n gotAudioEngine(audioEngine);\n } else {\n vm.runtime.once(\"PROJECT_LOADED\", () => {\n gotAudioEngine(vm.runtime.audioEngine);\n });\n }\n};\n\n/***/ }),\n\n/***/ 1406:\n/***/ (function(module) {\n\nmodule.exports = JSON.parse(\"{\\\"_general/blocks/anticlockwise\\\":\\\"anti-clockwise\\\",\\\"_general/blocks/clockwise\\\":\\\"clockwise\\\",\\\"_general/blocks/green-flag\\\":\\\"flag\\\",\\\"editor-devtools/clean-plus\\\":\\\"Clean up Blocks +\\\",\\\"editor-devtools/copy-all\\\":\\\"Copy All\\\",\\\"editor-devtools/copy-block\\\":\\\"Copy Block\\\",\\\"editor-devtools/cut-block\\\":\\\"Cut Block\\\",\\\"editor-devtools/lists\\\":\\\"lists\\\",\\\"editor-devtools/make-space\\\":\\\"Make Space\\\",\\\"editor-devtools/orphaned\\\":\\\"{count, plural, one {Developer tools: Delete 1 orphaned reporter block?} other {Developer tools: Delete # orphaned reporter blocks?} }\\\",\\\"editor-devtools/paste\\\":\\\"Paste\\\",\\\"editor-devtools/replace\\\":\\\"Developer tools: Switch all {name} in this sprite for the variable named:\\\",\\\"editor-devtools/swap\\\":\\\"Swap {var} in Sprite\\\",\\\"editor-devtools/unused-list\\\":\\\"{count, plural, one {Developer tools: Delete 1 unused local list? Here it is:\\\\n} other {Developer tools: Delete # unused local lists? Here they are:\\\\n} }\\\",\\\"editor-devtools/unused-var\\\":\\\"{count, plural, one {Developer tools: Delete 1 unused local variable? Here it is:\\\\n} other {Developer tools: Delete # unused local variables? Here they are:\\\\n} }\\\",\\\"editor-devtools/var-not-exist\\\":\\\"That variable does not exist...\\\",\\\"editor-devtools/variables\\\":\\\"variables\\\",\\\"find-bar/complex-broadcast\\\":\\\"(expression)\\\",\\\"find-bar/event\\\":\\\"event {name}\\\",\\\"find-bar/find-placeholder\\\":\\\"Find (Ctrl+F)\\\",\\\"find-bar/list-global\\\":\\\"LIST {name}\\\",\\\"find-bar/list-local\\\":\\\"list {name}\\\",\\\"find-bar/var-global\\\":\\\"VAR {name}\\\",\\\"find-bar/var-local\\\":\\\"var {name}\\\",\\\"middle-click-popup/start-typing\\\":\\\"Start Typing...\\\",\\\"editor-searchable-dropdowns/createBroadcast\\\":\\\"Create message \\\\\\\"{name}\\\\\\\"\\\",\\\"editor-searchable-dropdowns/createGlobalList\\\":\\\"Create list \\\\\\\"{name}\\\\\\\" for all sprites\\\",\\\"editor-searchable-dropdowns/createGlobalVariable\\\":\\\"Create variable \\\\\\\"{name}\\\\\\\" for all sprites\\\",\\\"editor-searchable-dropdowns/createLocalList\\\":\\\"Create list \\\\\\\"{name}\\\\\\\" for this sprite only\\\",\\\"editor-searchable-dropdowns/createLocalVariable\\\":\\\"Create variable \\\\\\\"{name}\\\\\\\" for this sprite only\\\",\\\"data-category-tweaks-v2/for-all-sprites\\\":\\\"For all sprites:\\\",\\\"data-category-tweaks-v2/for-this-sprite-only\\\":\\\"For this sprite only:\\\",\\\"data-category-tweaks-v2/list-category\\\":\\\"Lists\\\",\\\"hide-flyout/lock\\\":\\\"Lock Palette\\\",\\\"hide-flyout/unlock\\\":\\\"Unlock Palette\\\",\\\"mediarecorder/cancel\\\":\\\"Cancel\\\",\\\"mediarecorder/click-flag\\\":\\\"Waiting...\\\",\\\"mediarecorder/click-flag-description\\\":\\\"Click the green flag to start recording. Click this button to stop.\\\",\\\"mediarecorder/option-title\\\":\\\"Record Options\\\",\\\"mediarecorder/record\\\":\\\"Record\\\",\\\"mediarecorder/record-after-flag\\\":\\\"Do not start recording until the Green Flag is clicked\\\",\\\"mediarecorder/record-audio\\\":\\\"Include project sounds\\\",\\\"mediarecorder/record-audio-description\\\":\\\"This does not include Text-to-Speech.\\\",\\\"mediarecorder/record-description\\\":\\\"Record the stage as a {extension} file. You can save it to your computer after the recording is finished.\\\\nNote: variable and list monitors will not be visible.\\\",\\\"mediarecorder/record-duration\\\":\\\"Record Duration (in seconds)\\\",\\\"mediarecorder/record-mic\\\":\\\"Include sounds from microphone\\\",\\\"mediarecorder/record-until-stop\\\":\\\"Stop recording after the project has stopped\\\",\\\"mediarecorder/record-until-stop-disabled\\\":\\\"You need to enable \\\\\\\"{afterFlagOption}\\\\\\\" to use this option.\\\",\\\"mediarecorder/start\\\":\\\"Start\\\",\\\"mediarecorder/start-delay\\\":\\\"Start Delay (in seconds)\\\",\\\"mediarecorder/starting-in\\\":\\\"Starting in {secs}...\\\",\\\"mediarecorder/stop\\\":\\\"Stop Recording\\\",\\\"debugger/block-breakpoint\\\":\\\"breakpoint\\\",\\\"debugger/block-error\\\":\\\"error %s\\\",\\\"debugger/block-log\\\":\\\"log %s\\\",\\\"debugger/block-warn\\\":\\\"warn %s\\\",\\\"debugger/cannot-pause-player\\\":\\\"Breakpoint block can only be used while on the editor.\\\",\\\"debugger/clear\\\":\\\"Clear\\\",\\\"debugger/clone-of\\\":\\\"Clone of {sprite}\\\",\\\"debugger/close\\\":\\\"Close\\\",\\\"debugger/console\\\":\\\"Logs\\\",\\\"debugger/debug\\\":\\\"Debug\\\",\\\"debugger/empty-string\\\":\\\"(empty string)\\\",\\\"debugger/enter-format\\\":\\\"Enter export format:\\\",\\\"debugger/export\\\":\\\"Export\\\",\\\"debugger/export-desc\\\":\\\"Click while holding Shift to customize export format.\\\",\\\"debugger/icon-error\\\":\\\"Error\\\",\\\"debugger/icon-warn\\\":\\\"Warning\\\",\\\"debugger/log-msg-broadcasted\\\":\\\"Broadcasted '{broadcast}'.\\\",\\\"debugger/log-msg-clone-cap\\\":\\\"Failed to create clone of '{sprite}', cannot create over 300 clones.\\\",\\\"debugger/log-msg-clone-created\\\":\\\"Created clone of '{sprite}'.\\\",\\\"debugger/log-msg-flag-clicked\\\":\\\"Green flag clicked.\\\",\\\"debugger/no-logs\\\":\\\"There are no logs to display.\\\",\\\"debugger/no-threads-running\\\":\\\"No threads running.\\\",\\\"debugger/performance-clonecount-graph-tooltip\\\":\\\"Clones: {clones}\\\",\\\"debugger/performance-clonecount-title\\\":\\\"Clones\\\",\\\"debugger/performance-framerate-graph-tooltip\\\":\\\"FPS: {fps}\\\",\\\"debugger/performance-framerate-title\\\":\\\"FPS\\\",\\\"debugger/step\\\":\\\"Step\\\",\\\"debugger/step-desc\\\":\\\"Executes one block.\\\",\\\"debugger/tab-logs\\\":\\\"Logs\\\",\\\"debugger/tab-performance\\\":\\\"Performance\\\",\\\"debugger/tab-threads\\\":\\\"Threads\\\",\\\"debugger/thread\\\":\\\"Thread {id}\\\",\\\"debugger/unknown-sprite\\\":\\\"(unknown sprite)\\\",\\\"debugger/unpause\\\":\\\"Resume\\\",\\\"pause/pause\\\":\\\"Pause\\\",\\\"pause/play\\\":\\\"Resume\\\",\\\"clones/clones\\\":\\\"clones: {cloneCount}\\\",\\\"color-picker/hex\\\":\\\"hex color\\\",\\\"remove-sprite-confirm/confirm\\\":\\\"Do you want to delete the sprite?\\\",\\\"block-count/blocks\\\":\\\"{num, plural, one {1 block} other {# blocks}}\\\",\\\"onion-skinning/behind\\\":\\\"Behind\\\",\\\"onion-skinning/front\\\":\\\"Front\\\",\\\"onion-skinning/layering\\\":\\\"Layering\\\",\\\"onion-skinning/merge\\\":\\\"Merge\\\",\\\"onion-skinning/mode\\\":\\\"Mode\\\",\\\"onion-skinning/next\\\":\\\"Next costumes\\\",\\\"onion-skinning/opacity\\\":\\\"Opacity (%)\\\",\\\"onion-skinning/opacityStep\\\":\\\"Opacity step (%)\\\",\\\"onion-skinning/previous\\\":\\\"Previous costumes\\\",\\\"onion-skinning/settings\\\":\\\"Onion Skinning Settings\\\",\\\"onion-skinning/tint\\\":\\\"Tint\\\",\\\"onion-skinning/toggle\\\":\\\"Toggle Onion Skinning\\\",\\\"paint-snap/boxCenter\\\":\\\"Center of selection\\\",\\\"paint-snap/boxCorners\\\":\\\"Corners of selection\\\",\\\"paint-snap/boxEdgeMids\\\":\\\"Selection edge midpoints\\\",\\\"paint-snap/objectCenters\\\":\\\"Centers of objects\\\",\\\"paint-snap/objectCorners\\\":\\\"Corners of objects\\\",\\\"paint-snap/objectEdges\\\":\\\"Edges of objects\\\",\\\"paint-snap/objectMidlines\\\":\\\"Midlines of objects\\\",\\\"paint-snap/off\\\":\\\"Off\\\",\\\"paint-snap/on\\\":\\\"On\\\",\\\"paint-snap/pageAxes\\\":\\\"Page x and y axes\\\",\\\"paint-snap/pageCenter\\\":\\\"Center of the page\\\",\\\"paint-snap/pageCorners\\\":\\\"Corners of the page\\\",\\\"paint-snap/pageEdges\\\":\\\"Edges of the page\\\",\\\"paint-snap/settings\\\":\\\"Snap Settings\\\",\\\"paint-snap/snapFrom\\\":\\\"Snap from:\\\",\\\"paint-snap/snapTo\\\":\\\"Snap to:\\\",\\\"paint-snap/threshold\\\":\\\"Snapping distance\\\",\\\"paint-snap/toggle\\\":\\\"Toggle Snapping\\\",\\\"2d-color-picker/shade\\\":\\\"Shade\\\",\\\"better-img-uploads/upload\\\":\\\"HD Upload\\\",\\\"variable-manager/for-all-sprites\\\":\\\"Variables for all sprites\\\",\\\"variable-manager/for-this-sprite\\\":\\\"Variables for this sprite\\\",\\\"variable-manager/search\\\":\\\"Search\\\",\\\"variable-manager/too-big\\\":\\\"Click to display very large value.\\\",\\\"variable-manager/variables\\\":\\\"Variables\\\",\\\"search-sprites/placeholder\\\":\\\"Search sprites...\\\",\\\"sprite-properties/close-properties-panel-tooltip\\\":\\\"Collapse properties panel\\\",\\\"sprite-properties/open-properties-panel-tooltip\\\":\\\"Open properties panel\\\",\\\"gamepad/axes-a-b\\\":\\\"Axes {a} & {b}\\\",\\\"gamepad/axis-arrows\\\":\\\"Arrow Keys\\\",\\\"gamepad/axis-cursor\\\":\\\"Cursor\\\",\\\"gamepad/axis-custom\\\":\\\"Custom\\\",\\\"gamepad/axis-none\\\":\\\"None\\\",\\\"gamepad/browser-support\\\":\\\"This browser and operating system have known bugs that may make this addon difficult to use. Try another browser if you encounter problems.\\\",\\\"gamepad/button-n\\\":\\\"Button {n}\\\",\\\"gamepad/clear\\\":\\\"Clear all controls\\\",\\\"gamepad/config-header\\\":\\\"This comment contains configuration for gamepad support in third-party tools or websites such as https://turbowarp.org/\\\\nDo not edit by hand\\\",\\\"gamepad/key-click\\\":\\\"Click\\\",\\\"gamepad/key-down\\\":\\\"Down\\\",\\\"gamepad/key-enter\\\":\\\"Enter\\\",\\\"gamepad/key-left\\\":\\\"Left\\\",\\\"gamepad/key-none\\\":\\\"(none)\\\",\\\"gamepad/key-right\\\":\\\"Right\\\",\\\"gamepad/key-space\\\":\\\"Space\\\",\\\"gamepad/key-up\\\":\\\"Up\\\",\\\"gamepad/keyinput-title\\\":\\\"Click and press a key or click to change button. Escape to cancel. Backspace or delete to clear.\\\",\\\"gamepad/no-controllers\\\":\\\"No controllers detected. Try plugging one in and pressing a button on it.\\\",\\\"gamepad/reset\\\":\\\"Reset all controls to project defaults\\\",\\\"gamepad/settings\\\":\\\"Gamepad Settings\\\",\\\"gamepad/store-in-project\\\":\\\"Store the mappings set above inside the project. After saving the project, these mappings will become the new default configuration.\\\",\\\"folders/add-to-folder\\\":\\\"add to folder: {folder}\\\",\\\"folders/closed-folder\\\":\\\"Folder\\\",\\\"folders/confirm-backpack-folder\\\":\\\"Save entire folder to backpack?\\\",\\\"folders/create-folder\\\":\\\"create folder\\\",\\\"folders/name-not-allowed\\\":\\\"Invalid folder name\\\",\\\"folders/name-prompt\\\":\\\"Name of folder:\\\",\\\"folders/name-prompt-title\\\":\\\"Create Folder\\\",\\\"folders/open-folder\\\":\\\"Opened\\\",\\\"folders/remove-folder\\\":\\\"remove folder\\\",\\\"folders/remove-from-folder\\\":\\\"remove from folder\\\",\\\"folders/rename-folder\\\":\\\"rename folder\\\",\\\"folders/rename-folder-prompt\\\":\\\"Rename folder to:\\\",\\\"folders/rename-folder-prompt-title\\\":\\\"Rename Folder\\\",\\\"block-switching/control_forever\\\":\\\"forever\\\",\\\"block-switching/control_if\\\":\\\"if\\\",\\\"block-switching/control_if_else\\\":\\\"if... else\\\",\\\"block-switching/control_repeat_until\\\":\\\"repeat until\\\",\\\"block-switching/control_wait_until\\\":\\\"wait until\\\",\\\"block-switching/data_changevariableby\\\":\\\"change variable\\\",\\\"block-switching/data_deletealloflist\\\":\\\"delete all\\\",\\\"block-switching/data_deleteoflist\\\":\\\"delete item\\\",\\\"block-switching/data_hidelist\\\":\\\"hide list\\\",\\\"block-switching/data_hidevariable\\\":\\\"hide variable\\\",\\\"block-switching/data_insertatlist\\\":\\\"insert item\\\",\\\"block-switching/data_replaceitemoflist\\\":\\\"replace item\\\",\\\"block-switching/data_setvariableto\\\":\\\"set variable\\\",\\\"block-switching/data_showlist\\\":\\\"show list\\\",\\\"block-switching/data_showvariable\\\":\\\"show variable\\\",\\\"block-switching/debugger_error\\\":\\\"error\\\",\\\"block-switching/debugger_log\\\":\\\"log\\\",\\\"block-switching/debugger_warn\\\":\\\"warn\\\",\\\"block-switching/event_broadcast\\\":\\\"broadcast\\\",\\\"block-switching/event_broadcastandwait\\\":\\\"broadcast and wait\\\",\\\"block-switching/looks_backdropnumbername\\\":\\\"backdrop number or name\\\",\\\"block-switching/looks_changeeffectby\\\":\\\"change effect\\\",\\\"block-switching/looks_changesizeby\\\":\\\"change size\\\",\\\"block-switching/looks_costumenumbername\\\":\\\"costume number or name\\\",\\\"block-switching/looks_goforwardbackwardlayers\\\":\\\"go forward or backward layers\\\",\\\"block-switching/looks_gotofrontback\\\":\\\"go to front or back layer\\\",\\\"block-switching/looks_hide\\\":\\\"hide\\\",\\\"block-switching/looks_nextbackdrop\\\":\\\"next backdrop\\\",\\\"block-switching/looks_nextcostume\\\":\\\"next costume\\\",\\\"block-switching/looks_say\\\":\\\"say\\\",\\\"block-switching/looks_sayforsecs\\\":\\\"say for seconds\\\",\\\"block-switching/looks_seteffectto\\\":\\\"set effect\\\",\\\"block-switching/looks_setsizeto\\\":\\\"set size\\\",\\\"block-switching/looks_show\\\":\\\"show\\\",\\\"block-switching/looks_switchbackdropto\\\":\\\"switch backdrop\\\",\\\"block-switching/looks_switchbackdroptoandwait\\\":\\\"switch backdrop and wait\\\",\\\"block-switching/looks_think\\\":\\\"think\\\",\\\"block-switching/looks_thinkforsecs\\\":\\\"think for seconds\\\",\\\"block-switching/motion_changexby\\\":\\\"change x\\\",\\\"block-switching/motion_changeyby\\\":\\\"change y\\\",\\\"block-switching/motion_setx\\\":\\\"set x\\\",\\\"block-switching/motion_sety\\\":\\\"set y\\\",\\\"block-switching/motion_turnleft\\\":\\\"turn left\\\",\\\"block-switching/motion_turnright\\\":\\\"turn right\\\",\\\"block-switching/motion_xposition\\\":\\\"x position\\\",\\\"block-switching/motion_yposition\\\":\\\"y position\\\",\\\"block-switching/music_changeTempo\\\":\\\"change tempo\\\",\\\"block-switching/music_setTempo\\\":\\\"set tempo\\\",\\\"block-switching/operator_add\\\":\\\"+\\\",\\\"block-switching/operator_and\\\":\\\"and\\\",\\\"block-switching/operator_divide\\\":\\\"/\\\",\\\"block-switching/operator_equals\\\":\\\"=\\\",\\\"block-switching/operator_gt\\\":\\\">\\\",\\\"block-switching/operator_lt\\\":\\\"<\\\",\\\"block-switching/operator_mod\\\":\\\"mod\\\",\\\"block-switching/operator_multiply\\\":\\\"*\\\",\\\"block-switching/operator_or\\\":\\\"or\\\",\\\"block-switching/operator_subtract\\\":\\\"-\\\",\\\"block-switching/pen_changePenColorParamBy\\\":\\\"change parameter\\\",\\\"block-switching/pen_changePenHueBy\\\":\\\"change hue\\\",\\\"block-switching/pen_changePenShadeBy\\\":\\\"change shade\\\",\\\"block-switching/pen_changePenSizeBy\\\":\\\"change size\\\",\\\"block-switching/pen_penDown\\\":\\\"pen down\\\",\\\"block-switching/pen_penUp\\\":\\\"pen up\\\",\\\"block-switching/pen_setPenColorParamTo\\\":\\\"set parameter\\\",\\\"block-switching/pen_setPenHueToNumber\\\":\\\"set hue\\\",\\\"block-switching/pen_setPenShadeToNumber\\\":\\\"set shade\\\",\\\"block-switching/pen_setPenSizeTo\\\":\\\"set size\\\",\\\"block-switching/sensing_coloristouchingcolor\\\":\\\"color touching color\\\",\\\"block-switching/sensing_mousex\\\":\\\"mouse x\\\",\\\"block-switching/sensing_mousey\\\":\\\"mouse y\\\",\\\"block-switching/sensing_touchingcolor\\\":\\\"touching color\\\",\\\"block-switching/sound_changeeffectby\\\":\\\"change effect\\\",\\\"block-switching/sound_changevolumeby\\\":\\\"change volume\\\",\\\"block-switching/sound_play\\\":\\\"start\\\",\\\"block-switching/sound_playuntildone\\\":\\\"play until done\\\",\\\"block-switching/sound_seteffectto\\\":\\\"set effect\\\",\\\"block-switching/sound_setvolumeto\\\":\\\"set volume\\\",\\\"copy-reporter/copy-to-clipboard\\\":\\\"Copy\\\",\\\"copy-reporter/copy-value\\\":\\\"copy value\\\",\\\"blocks2image/error_blocks_not_added\\\":\\\"Add blocks to workspace!\\\",\\\"blocks2image/export_all_to_PNG\\\":\\\"Export all as PNG\\\",\\\"blocks2image/export_all_to_SVG\\\":\\\"Export all as SVG\\\",\\\"blocks2image/export_selected_to_PNG\\\":\\\"Export block as PNG\\\",\\\"blocks2image/export_selected_to_SVG\\\":\\\"Export block as SVG\\\",\\\"editor-extra-keys/enter-key\\\":\\\"enter\\\",\\\"move-to-top-bottom/bottom\\\":\\\"move to bottom\\\",\\\"move-to-top-bottom/top\\\":\\\"move to top\\\",\\\"move-to-top-layer/move-to-front-layer\\\":\\\"move to front layer\\\",\\\"rename-broadcasts/RENAME_BROADCAST\\\":\\\"Rename message\\\",\\\"rename-broadcasts/RENAME_BROADCAST_MODAL_TITLE\\\":\\\"Rename Message\\\",\\\"rename-broadcasts/RENAME_BROADCAST_TITLE\\\":\\\"Rename all \\\\\\\"{name}\\\\\\\" messages to:\\\",\\\"swap-local-global/cant-convert-cloud\\\":\\\"Cloud variables can't be converted to this sprite only.\\\",\\\"swap-local-global/cant-convert-conflict\\\":\\\"Can't convert because it would conflict with variables in another sprite: {sprites}\\\",\\\"swap-local-global/cant-convert-stage\\\":\\\"The stage can't have variables for this sprite only.\\\",\\\"swap-local-global/cant-convert-to-local\\\":\\\"Can't convert because it's used by multiple sprites: {sprites}\\\",\\\"swap-local-global/cant-convert-used-elsewhere\\\":\\\"Can't convert because it's used by another sprite: {sprite}\\\",\\\"swap-local-global/edit\\\":\\\"Edit properties:\\\",\\\"swap-local-global/edit-list-header\\\":\\\"Edit List\\\",\\\"swap-local-global/edit-list-option\\\":\\\"Rename or edit list\\\",\\\"swap-local-global/edit-variable-header\\\":\\\"Edit Variable\\\",\\\"swap-local-global/edit-variable-option\\\":\\\"Rename or edit variable\\\",\\\"swap-local-global/to-global\\\":\\\"Convert to \\\\\\\"For all sprites\\\\\\\"\\\",\\\"swap-local-global/to-local\\\":\\\"Convert to \\\\\\\"For this sprite only\\\\\\\"\\\",\\\"hide-stage/hide-stage\\\":\\\"Hide stage\\\"}\");\n\n/***/ }),\n\n/***/ 1407:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* generated by pull.js */\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n \"de\": () => __webpack_require__.e(/* import() | addon-l10n-de */ 65).then(__webpack_require__.t.bind(null, 1417, 3)),\n \"es\": () => __webpack_require__.e(/* import() | addon-l10n-es */ 66).then(__webpack_require__.t.bind(null, 1418, 3)),\n \"fi\": () => __webpack_require__.e(/* import() | addon-l10n-fi */ 67).then(__webpack_require__.t.bind(null, 1419, 3)),\n \"fr\": () => __webpack_require__.e(/* import() | addon-l10n-fr */ 68).then(__webpack_require__.t.bind(null, 1420, 3)),\n \"hu\": () => __webpack_require__.e(/* import() | addon-l10n-hu */ 69).then(__webpack_require__.t.bind(null, 1421, 3)),\n \"it\": () => __webpack_require__.e(/* import() | addon-l10n-it */ 70).then(__webpack_require__.t.bind(null, 1422, 3)),\n \"ja\": () => __webpack_require__.e(/* import() | addon-l10n-ja */ 71).then(__webpack_require__.t.bind(null, 1423, 3)),\n \"ko\": () => __webpack_require__.e(/* import() | addon-l10n-ko */ 72).then(__webpack_require__.t.bind(null, 1424, 3)),\n \"nl\": () => __webpack_require__.e(/* import() | addon-l10n-nl */ 73).then(__webpack_require__.t.bind(null, 1425, 3)),\n \"pl\": () => __webpack_require__.e(/* import() | addon-l10n-pl */ 74).then(__webpack_require__.t.bind(null, 1426, 3)),\n \"pt\": () => __webpack_require__.e(/* import() | addon-l10n-pt */ 75).then(__webpack_require__.t.bind(null, 1427, 3)),\n \"ro\": () => __webpack_require__.e(/* import() | addon-l10n-ro */ 76).then(__webpack_require__.t.bind(null, 1428, 3)),\n \"ru\": () => __webpack_require__.e(/* import() | addon-l10n-ru */ 77).then(__webpack_require__.t.bind(null, 1429, 3)),\n \"sl\": () => __webpack_require__.e(/* import() | addon-l10n-sl */ 78).then(__webpack_require__.t.bind(null, 1430, 3)),\n \"tr\": () => __webpack_require__.e(/* import() | addon-l10n-tr */ 79).then(__webpack_require__.t.bind(null, 1431, 3)),\n \"zh-cn\": () => __webpack_require__.e(/* import() | addon-l10n-zh-cn */ 80).then(__webpack_require__.t.bind(null, 1432, 3)),\n \"zh-tw\": () => __webpack_require__.e(/* import() | addon-l10n-zh-tw */ 81).then(__webpack_require__.t.bind(null, 1433, 3))\n});\n\n/***/ }),\n\n/***/ 1408:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* generated by pull.js */\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n \"cat-blocks\": () => __webpack_require__.e(/* import() | addon-entry-cat-blocks */ 10).then(__webpack_require__.bind(null, 1544)),\n \"editor-devtools\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1523)),\n \"find-bar\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1535)),\n \"middle-click-popup\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1525)),\n \"jump-to-def\": () => __webpack_require__(1542),\n \"reorder-custom-inputs\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1536)),\n \"editor-searchable-dropdowns\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1545)),\n \"data-category-tweaks-v2\": () => __webpack_require__.e(/* import() | addon-entry-data-category-tweaks-v2 */ 18).then(__webpack_require__.bind(null, 1546)),\n \"block-palette-icons\": () => __webpack_require__.e(/* import() | addon-entry-block-palette-icons */ 8).then(__webpack_require__.bind(null, 1521)),\n \"hide-flyout\": () => __webpack_require__.e(/* import() | addon-entry-hide-flyout */ 37).then(__webpack_require__.bind(null, 1529)),\n \"mediarecorder\": () => __webpack_require__.e(/* import() | addon-entry-mediarecorder */ 42).then(__webpack_require__.bind(null, 1547)),\n \"drag-drop\": () => __webpack_require__(1543),\n \"debugger\": () => __webpack_require__.e(/* import() | addon-entry-debugger */ 19).then(__webpack_require__.bind(null, 1519)),\n \"pause\": () => __webpack_require__(1528),\n \"mute-project\": () => __webpack_require__(1534),\n \"vol-slider\": () => __webpack_require__.e(/* import() | addon-entry-vol-slider */ 63).then(__webpack_require__.bind(null, 1526)),\n \"clones\": () => __webpack_require__.e(/* import() | addon-entry-clones */ 11).then(__webpack_require__.bind(null, 1530)),\n \"mouse-pos\": () => __webpack_require__.e(/* import() | addon-entry-mouse-pos */ 43).then(__webpack_require__.bind(null, 1548)),\n \"color-picker\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1537)),\n \"remove-sprite-confirm\": () => __webpack_require__.e(/* import() | addon-entry-remove-sprite-confirm */ 50).then(__webpack_require__.bind(null, 1549)),\n \"block-count\": () => __webpack_require__.e(/* import() | addon-entry-block-count */ 7).then(__webpack_require__.bind(null, 1550)),\n \"onion-skinning\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1524)),\n \"paint-snap\": () => __webpack_require__.e(/* import() | addon-entry-paint-snap */ 48).then(__webpack_require__.bind(null, 1520)),\n \"default-costume-editor-color\": () => __webpack_require__.e(/* import() | addon-entry-default-costume-editor-color */ 20).then(__webpack_require__.bind(null, 1551)),\n \"bitmap-copy\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1552)),\n \"2d-color-picker\": () => __webpack_require__.e(/* import() | addon-entry-2d-color-picker */ 5).then(__webpack_require__.bind(null, 1527)),\n \"paint-skew\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1553)),\n \"better-img-uploads\": () => __webpack_require__.e(/* import() | addon-entry-better-img-uploads */ 6).then(__webpack_require__.bind(null, 1538)),\n \"pick-colors-from-stage\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1554)),\n \"custom-block-shape\": () => __webpack_require__.e(/* import() | addon-entry-custom-block-shape */ 14).then(__webpack_require__.bind(null, 1555)),\n \"editor-square-inputs\": () => __webpack_require__.e(/* import() | addon-entry-editor-square-inputs */ 29).then(__webpack_require__.bind(null, 1556)),\n \"zebra-striping\": () => __webpack_require__.e(/* import() | addon-entry-zebra-striping */ 64).then(__webpack_require__.bind(null, 1557)),\n \"editor-compact\": () => __webpack_require__.e(/* import() | addon-entry-editor-compact */ 25).then(__webpack_require__.bind(null, 1531)),\n \"custom-menu-bar\": () => __webpack_require__.e(/* import() | addon-entry-custom-menu-bar */ 16).then(__webpack_require__.bind(null, 1476)),\n \"editor-theme3\": () => __webpack_require__.e(/* import() | addon-entry-editor-theme3 */ 32).then(__webpack_require__.bind(null, 1518)),\n \"custom-block-text\": () => __webpack_require__.e(/* import() | addon-entry-custom-block-text */ 15).then(__webpack_require__.bind(null, 1558)),\n \"editor-colored-context-menus\": () => __webpack_require__.e(/* import() | addon-entry-editor-colored-context-menus */ 24).then(__webpack_require__.bind(null, 1559)),\n \"editor-stage-left\": () => __webpack_require__.e(/* import() | addon-entry-editor-stage-left */ 30).then(__webpack_require__.bind(null, 1560)),\n \"editor-buttons-reverse-order\": () => __webpack_require__.e(/* import() | addon-entry-editor-buttons-reverse-order */ 23).then(__webpack_require__.bind(null, 1485)),\n \"variable-manager\": () => __webpack_require__.e(/* import() | addon-entry-variable-manager */ 62).then(__webpack_require__.bind(null, 1532)),\n \"search-sprites\": () => __webpack_require__.e(/* import() | addon-entry-search-sprites */ 52).then(__webpack_require__.bind(null, 1561)),\n \"sprite-properties\": () => __webpack_require__.e(/* import() | addon-entry-sprite-properties */ 53).then(__webpack_require__.bind(null, 1533)),\n \"gamepad\": () => __webpack_require__.e(/* import() | addon-entry-gamepad */ 35).then(__webpack_require__.bind(null, 1522)),\n \"editor-sounds\": () => __webpack_require__.e(/* import() | addon-entry-editor-sounds */ 28).then(__webpack_require__.bind(null, 1562)),\n \"folders\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1539)),\n \"block-switching\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1563)),\n \"load-extensions\": () => __webpack_require__.e(/* import() | addon-entry-load-extensions */ 41).then(__webpack_require__.bind(null, 1564)),\n \"custom-zoom\": () => __webpack_require__.e(/* import() | addon-entry-custom-zoom */ 17).then(__webpack_require__.bind(null, 1565)),\n \"copy-reporter\": () => __webpack_require__.e(/* import() | addon-entry-copy-reporter */ 13).then(__webpack_require__.bind(null, 1540)),\n \"initialise-sprite-position\": () => __webpack_require__.e(/* import() | addon-entry-initialise-sprite-position */ 40).then(__webpack_require__.bind(null, 1566)),\n \"blocks2image\": () => __webpack_require__.e(/* import() | addon-entry-blocks2image */ 9).then(__webpack_require__.bind(null, 1567)),\n \"remove-curved-stage-border\": () => __webpack_require__.e(/* import() | addon-entry-remove-curved-stage-border */ 49).then(__webpack_require__.bind(null, 1497)),\n \"transparent-orphans\": () => __webpack_require__.e(/* import() | addon-entry-transparent-orphans */ 55).then(__webpack_require__.bind(null, 1499)),\n \"paint-by-default\": () => __webpack_require__.e(/* import() | addon-entry-paint-by-default */ 47).then(__webpack_require__.bind(null, 1568)),\n \"block-cherry-picking\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1569)),\n \"hide-new-variables\": () => __webpack_require__.e(/* import() | addon-entry-hide-new-variables */ 38).then(__webpack_require__.bind(null, 1570)),\n \"editor-extra-keys\": () => __webpack_require__.e(/* import() | addon-entry-editor-extra-keys */ 26).then(__webpack_require__.bind(null, 1571)),\n \"hide-delete-button\": () => __webpack_require__.e(/* import() | addon-entry-hide-delete-button */ 36).then(__webpack_require__.bind(null, 1501)),\n \"no-script-bumping\": () => __webpack_require__.e(/* import() | addon-entry-no-script-bumping */ 45).then(__webpack_require__.bind(null, 1572)),\n \"disable-stage-drag-select\": () => __webpack_require__.e(/* import() | addon-entry-disable-stage-drag-select */ 22).then(__webpack_require__.bind(null, 1573)),\n \"move-to-top-bottom\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1574)),\n \"move-to-top-layer\": () => __webpack_require__.e(/* import() | addon-entry-move-to-top-layer */ 44).then(__webpack_require__.bind(null, 1575)),\n \"disable-paste-offset\": () => __webpack_require__.e(/* import() | addon-entry-disable-paste-offset */ 21).then(__webpack_require__.bind(null, 1576)),\n \"block-duplicate\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1577)),\n \"rename-broadcasts\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1578)),\n \"swap-local-global\": () => __webpack_require__.e(/* import() | addon-entry-swap-local-global */ 54).then(__webpack_require__.bind(null, 1579)),\n \"editor-comment-previews\": () => __webpack_require__.e(/* import() | addon-default-entry */ 4).then(__webpack_require__.bind(null, 1580)),\n \"columns\": () => __webpack_require__.e(/* import() | addon-entry-columns */ 12).then(__webpack_require__.bind(null, 1581)),\n \"number-pad\": () => __webpack_require__.e(/* import() | addon-entry-number-pad */ 46).then(__webpack_require__.bind(null, 1582)),\n \"editor-number-arrow-keys\": () => __webpack_require__.e(/* import() | addon-entry-editor-number-arrow-keys */ 27).then(__webpack_require__.bind(null, 1583)),\n \"expanded-backpack\": () => __webpack_require__.e(/* import() | addon-entry-expanded-backpack */ 33).then(__webpack_require__.bind(null, 1584)),\n \"script-snap\": () => __webpack_require__.e(/* import() | addon-entry-script-snap */ 51).then(__webpack_require__.bind(null, 1585)),\n \"fullscreen\": () => __webpack_require__.e(/* import() | addon-entry-fullscreen */ 34).then(__webpack_require__.bind(null, 1586)),\n \"hide-stage\": () => __webpack_require__.e(/* import() | addon-entry-hide-stage */ 39).then(__webpack_require__.bind(null, 1541)),\n \"tw-straighten-comments\": () => __webpack_require__.e(/* import() | addon-entry-tw-straighten-comments */ 61).then(__webpack_require__.bind(null, 1587)),\n \"tw-remove-backpack\": () => __webpack_require__.e(/* import() | addon-entry-tw-remove-backpack */ 59).then(__webpack_require__.bind(null, 1588)),\n \"tw-remove-feedback\": () => __webpack_require__.e(/* import() | addon-entry-tw-remove-feedback */ 60).then(__webpack_require__.bind(null, 1516)),\n \"tw-disable-vibration\": () => __webpack_require__.e(/* import() | addon-entry-tw-disable-vibration */ 58).then(__webpack_require__.bind(null, 1589)),\n \"tw-disable-cloud-variables\": () => __webpack_require__.e(/* import() | addon-entry-tw-disable-cloud-variables */ 56).then(__webpack_require__.bind(null, 1590)),\n \"tw-disable-compiler\": () => __webpack_require__.e(/* import() | addon-entry-tw-disable-compiler */ 57).then(__webpack_require__.bind(null, 1591)),\n \"editor-stepping\": () => __webpack_require__.e(/* import() | addon-entry-editor-stepping */ 31).then(__webpack_require__.bind(null, 1592))\n});\n\n/***/ }),\n\n/***/ 1409:\n/***/ (function(module, exports, __webpack_require__) {\n\nexports = module.exports = __webpack_require__(9)(false);\n// imports\n\n\n// module\nexports.push([module.i, \".pause-btn {\\n width: 2rem;\\n height: 2rem;\\n padding: 0.375rem;\\n border-radius: 0.25rem;\\n user-select: none;\\n user-drag: none;\\n cursor: pointer;\\n}\\n\\n.pause-btn:hover {\\n background-color: var(--looks-light-transparent);\\n}\\n\", \"\"]);\n\n// exports\n\n\n/***/ }),\n\n/***/ 1410:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return addContextMenu; });\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n// This file is imported from\n// https://github.com/ScratchAddons/ScratchAddons/blob/master/addon-api/content-script/contextmenu.js\n\n/* eslint-disable */\n\nlet initialized = false;\nlet hasDynamicContextMenu = false;\nlet contextMenus = [];\nconst onReactContextMenu = function onReactContextMenu(e) {\n var _ctxTarget$this$traps0, _ctxTarget$this$traps1, _ctxTarget$this$traps10, _ctxTarget$this$traps11, _ctxTarget$this$traps12, _ctxTarget$this$traps13;\n if (!e.target) return;\n const ctxTarget = e.target.closest(\".react-contextmenu-wrapper\");\n if (!ctxTarget) return;\n let ctxMenu = ctxTarget.querySelector(\"nav.react-contextmenu\");\n let type;\n const extra = {};\n if (false) { var _ctxTarget$this$traps, _ctxTarget$this$traps2, _ctxTarget$this$traps3, _ctxTarget$this$traps4, _ctxTarget$this$traps5, _ctxTarget$this$traps6, _ctxTarget$this$traps7, _ctxTarget$this$traps8, _ctxTarget$this$traps9; } else if ((_ctxTarget$this$traps0 = ctxTarget[this.traps.getInternalKey(ctxTarget)]) !== null && _ctxTarget$this$traps0 !== void 0 && (_ctxTarget$this$traps1 = _ctxTarget$this$traps0.return) !== null && _ctxTarget$this$traps1 !== void 0 && (_ctxTarget$this$traps10 = _ctxTarget$this$traps1.return) !== null && _ctxTarget$this$traps10 !== void 0 && (_ctxTarget$this$traps11 = _ctxTarget$this$traps10.return) !== null && _ctxTarget$this$traps11 !== void 0 && (_ctxTarget$this$traps12 = _ctxTarget$this$traps11.stateNode) !== null && _ctxTarget$this$traps12 !== void 0 && (_ctxTarget$this$traps13 = _ctxTarget$this$traps12.props) !== null && _ctxTarget$this$traps13 !== void 0 && _ctxTarget$this$traps13.dragType) {\n // SpriteSelectorItem which despite its name is used for costumes, sounds, backpacked script etc\n const props = ctxTarget[this.traps.getInternalKey(ctxTarget)].return.return.return.stateNode.props;\n type = props.dragType.toLowerCase();\n extra.name = props.name;\n extra.itemId = props.id;\n extra.index = props.index;\n } else {\n return;\n }\n const ctx = _objectSpread({\n menuItem: ctxMenu,\n target: ctxTarget,\n type\n }, extra);\n Array.from(ctxMenu.children).forEach(existing => {\n if (existing.classList.contains(\"sa-ctx-menu\")) existing.remove();\n });\n for (const item of hasDynamicContextMenu ? contextMenus.flatMap(menu => typeof menu === \"function\" ? menu(type, ctx) : menu) : contextMenus) {\n if (!item) continue;\n if (item.types && !item.types.some(itemType => type === itemType)) continue;\n if (item.condition && !item.condition(ctx)) continue;\n const itemElem = document.createElement(\"div\");\n const classes = [\"context-menu_menu-item\"];\n if (item.border) classes.push(\"context-menu_menu-item-bordered\");\n if (item.dangerous) classes.push(\"context-menu_menu-item-danger\");\n itemElem.className = this.scratchClass(...classes, {\n others: [\"react-contextmenu-item\", \"sa-ctx-menu\", item.className || \"\"]\n });\n const label = document.createElement(\"span\");\n label.textContent = item.label;\n itemElem.append(label);\n this.displayNoneWhileDisabled(itemElem, {\n display: \"block\"\n });\n itemElem.addEventListener(\"click\", e => {\n e.stopPropagation();\n window.dispatchEvent(new CustomEvent(\"REACT_CONTEXTMENU_HIDE\", {\n detail: {\n action: \"REACT_CONTEXTMENU_HIDE\"\n }\n }));\n item.callback(ctx);\n });\n this.appendToSharedSpace({\n space: item.position,\n order: item.order,\n scope: ctxMenu,\n element: itemElem\n });\n }\n return;\n};\nconst initialize = tab => {\n if (initialized) return;\n initialized = true;\n document.body.addEventListener(\"contextmenu\", e => onReactContextMenu.call(tab, e), {\n capture: true\n });\n};\nconst addContextMenu = (tab, callback, opts) => {\n if (typeof opts === \"undefined\") {\n contextMenus.push(callback);\n hasDynamicContextMenu = true;\n } else {\n contextMenus.push(_objectSpread(_objectSpread({}, opts), {}, {\n callback\n }));\n }\n initialize(tab);\n};\n\n/***/ }),\n\n/***/ 1411:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return createEditorModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return confirm; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return prompt; });\n/* harmony import */ var _components_close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(108);\n/* harmony import */ var _components_close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_components_close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _modal_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1412);\n/* harmony import */ var _modal_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_modal_css__WEBPACK_IMPORTED_MODULE_1__);\n// Based on\n// https://github.com/ScratchAddons/ScratchAddons/blob/master/addon-api/content-script/modal.js\n\n\n\nconst createEditorModal = function createEditorModal(tab, title) {\n let {\n isOpen = false\n } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n const container = Object.assign(document.createElement('div'), {\n className: tab.scratchClass('modal_modal-overlay'),\n dir: tab.direction\n });\n container.style.display = isOpen ? '' : 'none';\n document.body.appendChild(container);\n const modal = Object.assign(document.createElement('div'), {\n className: tab.scratchClass('modal_modal-content')\n });\n modal.addEventListener('click', e => e.stopPropagation());\n container.appendChild(modal);\n const header = Object.assign(document.createElement('div'), {\n className: tab.scratchClass('modal_header')\n });\n modal.appendChild(header);\n header.appendChild(Object.assign(document.createElement('div'), {\n className: tab.scratchClass('modal_header-item', 'modal_header-item-title'),\n innerText: title\n }));\n const closeContainer = Object.assign(document.createElement('div'), {\n className: tab.scratchClass('modal_header-item', 'modal_header-item-close')\n });\n header.appendChild(closeContainer);\n const closeButton = Object.assign(document.createElement('div'), {\n className: tab.scratchClass('close-button_close-button', 'close-button_large')\n });\n closeContainer.appendChild(closeButton);\n closeButton.appendChild(Object.assign(document.createElement('img'), {\n className: tab.scratchClass('close-button_close-icon'),\n src: _components_close_button_icon_close_svg__WEBPACK_IMPORTED_MODULE_0___default.a\n }));\n const content = Object.assign(document.createElement('div'), {\n className: _modal_css__WEBPACK_IMPORTED_MODULE_1___default.a.modalContent\n });\n modal.appendChild(content);\n return {\n container: modal,\n content,\n backdrop: container,\n closeButton,\n open: () => {\n container.style.display = '';\n },\n close: () => {\n container.style.display = 'none';\n },\n remove: container.remove.bind(container)\n };\n};\nconst createButtonRow = tab => {\n const buttonRow = Object.assign(document.createElement('div'), {\n className: tab.scratchClass('prompt_button-row')\n });\n const cancelButton = Object.assign(document.createElement('button'), {\n className: tab.scratchClass('prompt_cancel-button'),\n innerText: tab.scratchMessage('gui.prompt.cancel')\n });\n buttonRow.appendChild(cancelButton);\n const okButton = Object.assign(document.createElement('button'), {\n className: tab.scratchClass('prompt_ok-button'),\n innerText: tab.scratchMessage('gui.prompt.ok')\n });\n buttonRow.appendChild(okButton);\n return {\n buttonRow,\n cancelButton,\n okButton\n };\n};\nconst confirm = function confirm(tab, title, message) {\n let {\n useEditorClasses = false\n } = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n const {\n remove,\n container,\n content,\n backdrop,\n closeButton\n } = tab.createModal(title, {\n isOpen: true,\n useEditorClasses: useEditorClasses,\n useSizesClass: true\n });\n const mode = tab.editorMode !== null && useEditorClasses ? 'editor' : tab.clientVersion;\n if (mode === 'editor') {\n container.classList.add(tab.scratchClass('prompt_modal-content'));\n content.classList.add(tab.scratchClass('prompt_body'));\n }\n content.appendChild(Object.assign(document.createElement('div'), {\n className: tab.scratchClass('prompt_label'),\n innerText: message\n }));\n const {\n buttonRow,\n cancelButton,\n okButton\n } = createButtonRow(tab, mode);\n content.appendChild(buttonRow);\n okButton.focus();\n return new Promise(resolve => {\n const cancel = () => {\n remove();\n resolve(false);\n };\n const ok = () => {\n remove();\n resolve(true);\n };\n backdrop.addEventListener('click', cancel);\n closeButton.addEventListener('click', cancel);\n cancelButton.addEventListener('click', cancel);\n okButton.addEventListener('click', ok);\n container.addEventListener('keydown', e => {\n if (e.key === 'Enter') ok();\n if (e.key === 'Escape') cancel();\n });\n });\n};\nconst prompt = function prompt(tab, title, message) {\n let defaultValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n let {\n useEditorClasses = false\n } = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\n const {\n remove,\n container,\n content,\n backdrop,\n closeButton\n } = tab.createModal(title, {\n isOpen: true,\n useEditorClasses: useEditorClasses,\n useSizesClass: true\n });\n container.classList.add(tab.scratchClass('prompt_modal-content'));\n content.classList.add(tab.scratchClass('prompt_body'));\n content.appendChild(Object.assign(document.createElement('div'), {\n className: tab.scratchClass('prompt_label'),\n innerText: message\n }));\n const input = Object.assign(document.createElement('input'), {\n className: tab.scratchClass('prompt_variable-name-text-input'),\n value: defaultValue\n });\n content.appendChild(input);\n input.focus();\n input.select();\n const {\n buttonRow,\n cancelButton,\n okButton\n } = createButtonRow(tab);\n content.appendChild(buttonRow);\n return new Promise(resolve => {\n const cancel = () => {\n remove();\n resolve(null);\n };\n const ok = () => {\n remove();\n resolve(input.value);\n };\n backdrop.addEventListener('click', cancel);\n closeButton.addEventListener('click', cancel);\n cancelButton.addEventListener('click', cancel);\n okButton.addEventListener('click', ok);\n container.addEventListener('keydown', e => {\n if (e.key === 'Enter') ok();\n if (e.key === 'Escape') cancel();\n });\n });\n};\n\n/***/ }),\n\n/***/ 1412:\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(1413);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n\n/***/ 1413:\n/***/ (function(module, exports, __webpack_require__) {\n\nexports = module.exports = __webpack_require__(9)(false);\n// imports\n\n\n// module\nexports.push([module.i, \".modal_modal-content_vp9Mi {\\n background-color: var(--ui-modal-background);\\n color: var(--ui-modal-foreground);\\n}\\n\", \"\"]);\n\n// exports\nexports.locals = {\n\t\"modal-content\": \"modal_modal-content_vp9Mi\",\n\t\"modalContent\": \"modal_modal-content_vp9Mi\"\n};\n\n/***/ }),\n\n/***/ 1414:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return create; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return updateAll; });\n// Stylesheets are added at the end of so that they have higher precedence\n// than those in and above dark mode which is appended at the start of \nconst stylesheetContainer = document.createElement('div');\nstylesheetContainer.style.display = 'none';\nstylesheetContainer.className = 'addons-styles';\ndocument.body.appendChild(stylesheetContainer);\n\n/**\n * Maps opaque module IDs to its ConditionalStyle.\n * @type {Map}\n */\nconst allSheets = new Map();\n\n/**\n * Determine if the contents of a list are equal (===) to each other.\n * @param {unknown[]} a The first list\n * @param {unknown[]} b The second list\n * @returns {boolean} true if the lists are identical\n */\nconst areArraysEqual = (a, b) => {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; a++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n};\nconst updateAll = () => {\n for (const sheet of allSheets.values()) {\n sheet.update();\n }\n};\nclass ConditionalStyle {\n /**\n * @param {string} styleText CSS text\n */\n constructor(styleText) {\n /**\n * Lazily created