mirror of
https://github.com/ocogeclub/ocoge.git
synced 2024-11-24 16:39:49 +00:00
1 line
270 KiB
Plaintext
1 line
270 KiB
Plaintext
{"version":3,"sources":["blocks/variables_dynamic.js","blocks/variables.js","blocks/text.js","blocks/procedures.js","blocks/math.js","blocks/loops.js","blocks/logic.js","blocks/lists.js","blocks/colour.js","blocks/blocks.js"],"names":["ContextMenu","Extensions","Variables","xml","BlockDefinition","Object","Msg","createBlockDefinitionsFromJsonArray","defineBlocks","blocks","CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN","customContextMenu","options","isInFlyout","id","getFieldValue","varType","workspace","getVariableById","variableModel","type","oppositeType","contextMenuMsg","option","enabled","remainingCapacity","name","getField","getText","text","replace","xmlField","createElement","setAttribute","appendChild","createTextNode","xmlBlock","callback","callbackFactory","push","renameOption","renameOptionCallbackFactory","deleteOption","deleteOptionCallbackFactory","unshift","onchange","_e","getVariable","outputConnection","setCheck","getInput","connection","block","variable","renameVariable","deleteVariableById","getId","refreshToolboxSelection","registerMixin","xmlUtils","Align","ConnectionType","FieldDropdown","FieldImage","FieldTextInput","Mutator","init","setHelpUrl","setStyle","appendValueInput","appendField","appendDummyInput","setInputsInline","setOutput","updateAt_","setTooltip","mutationToDom","container","isAt1","INPUT_VALUE","isAt2","domToMutation","xmlElement","getAttribute","n","isAt","removeInput","menu","value","newAt","getSourceBlock","setFieldValue","moveInputBefore","OPERATORS","jsonInit","TEXT_PROMPT_COMMON","updateType_","newOp","TYPES","thisBlock","dropdown","mixin","QUOTE_IMAGE_MIXIN","newQuote_","QUOTE_IMAGE_LEFT_DATAURI","QUOTE_IMAGE_RIGHT_DATAURI","QUOTE_IMAGE_WIDTH","QUOTE_IMAGE_HEIGHT","quoteField_","fieldName","i","input","inputList","j","field","fieldRow","insertFieldAt","console","warn","toDevString","open","isLeft","RTL","dataUri","TEXT_QUOTES_EXTENSION","TEXT_JOIN_MUTATOR_MIXIN","itemCount_","parseInt","updateShape_","saveExtraState","loadExtraState","state","decompose","containerBlock","newBlock","initSvg","itemBlock","connect","previousConnection","nextConnection","compose","getInputTargetBlock","connections","isInsertionMarker","valueConnection_","getNextBlock","targetConnection","indexOf","disconnect","length","reconnect","saveConnections","setAlign","RIGHT","TEXT_JOIN_EXTENSION","setMutator","register","buildTooltipWithFieldText","TEXT_INDEXOF_TOOLTIP_EXTENSION","oneBasedIndex","TEXT_CHARAT_MUTATOR_MIXIN","isAt_","TEXT_CHARAT_EXTENSION","setValidator","where","tooltip","msg","registerMutator","Events","Procedures","Xml","config","FieldCheckbox","FieldLabel","Names","PROCEDURE_DEF_COMMON","setStatements_","hasStatements","hasStatements_","appendStatementInput","updateParams_","paramString","arguments_","join","disable","enable","opt_paramIds","argumentVarModels_","parameter","argModel","paramIds_","childNode","childNodes","nodeName","toLowerCase","varName","varId","getOrCreateVariablePackage","log","mutateCallers","create","param","containerBlockNode","statementNode","argBlockNode","fieldNode","argumentName","nextNode","node","domToBlock","paramBlock","targetBlock","statementConnection_","stackConnection","stackBlock","unplug","bumpNeighbours","getVars","getVarModels","renameVarById","oldId","newId","oldVariable","oldName","newVar","change","displayRenamedVar_","updateVarName","newName","mutator","isVisible","workspace_","getAllBlocks","equals","xmlMutation","xmlArg","callType_","isCollapsed","argOption","argVar","argXmlField","generateVariableFieldDom","argXmlBlock","initName","findLegalName","nameField","rename","setSpellcheck","comments","parentWorkspace","setCommentText","getProcedureDef","contextMenu","DEFAULT_ARG","validator_","oldShowEditorFn_","showEditor_","newShowEditorFn","createdVariables_","setPreviousStatement","setNextStatement","onFinishEditing_","deleteIntermediateVars_","sourceBlock","outerWs","findParentWs","targetWorkspace","caselessName","otherVar","model","renameVariableById","createVariable","newText","PROCEDURE_CALL_COMMON","getProcedureCall","renameProcedure","baseMsg","setProcedureParameters_","paramNames","paramIds","defBlock","getDefinition","mutatorOpen","setCollapsed","quarkConnections_","quarkIds_","RangeError","savedRendered","rendered","concat","quarkId","render","argField","setValue","newField","topRow","removeField","args","params","ids","fill","event","isFlyout","recordUndo","BLOCK_CREATE","def","defType_","JSON","stringify","setGroup","group","xy","getRelativeToSurfaceXY","y","snapRadius","x","mutation","callName","domToWorkspace","BLOCK_DELETE","blockId","dispose","CHANGE","element","oldGroup","getGroup","newValue","previousEnabledState_","isEnabled","setEnabled","isMovable","option.callback","centerOnBlock","select","hasReturnValue_","Number","e","isDragging","BLOCK_MOVE","legal","FUNCTION_TYPES","getSurroundParent","setWarningText","TOOLTIPS_BY_OP","buildTooltipForDropdown","IS_DIVISIBLEBY_MUTATOR_MIXIN","divisorInput","inputExists","IS_DIVISIBLE_MUTATOR_EXTENSION","LIST_MODES_MUTATOR_MIXIN","LIST_MODES_MUTATOR_EXTENSION","bind","WHILE_UNTIL_TOOLTIPS","BREAK_CONTINUE_TOOLTIPS","CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN","loopTypes","Set","CONTROL_FLOW_IN_LOOP_CHECK_MIXIN","getSurroundLoop","has","CONTROLS_IF_MUTATOR_MIXIN","elseifCount_","elseCount_","rebuildShape_","elseifBlock","elseBlock","clauseBlock","valueConnections","statementConnections","elseStatementConnection","TypeError","reconnectChildBlocks_","inputIf","inputDo","CONTROLS_IF_TOOLTIP_EXTENSION","LOGIC_COMPARE_ONCHANGE_MIXIN","prevBlocks_","blockA","blockB","connectionChecker","doTypeChecks","prevA","isDisposed","isShadow","prevB","LOGIC_COMPARE_EXTENSION","LOGIC_TERNARY_ONCHANGE_MIXIN","prevParentConnection_","parentConnection","MODE","WHERE_OPTIONS","modeMenu","isStatement","updateStatement_","mode","textToDom","newStatement","oldStatement","newMode","Error","inputConnection","setShadowDom","inputBlock","exports","colour","lists","logic","loops","math","procedures","texts","variables","variablesDynamic","assign"],"mappings":"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","file":"blocks_compressed.js","sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Variable blocks for Blockly.\n * @suppress {checkTypes}\n */\n'use strict';\n\ngoog.module('Blockly.libraryBlocks.variablesDynamic');\n\n/* eslint-disable-next-line no-unused-vars */\nconst AbstractEvent = goog.requireType('Blockly.Events.Abstract');\nconst ContextMenu = goog.require('Blockly.ContextMenu');\nconst Extensions = goog.require('Blockly.Extensions');\nconst Variables = goog.require('Blockly.Variables');\nconst xml = goog.require('Blockly.utils.xml');\n/* eslint-disable-next-line no-unused-vars */\nconst {Block} = goog.requireType('Blockly.Block');\n// const {BlockDefinition} = goog.requireType('Blockly.blocks');\n// TODO (6248): Properly import the BlockDefinition type.\n/* eslint-disable-next-line no-unused-vars */\nconst BlockDefinition = Object;\nconst {Msg} = goog.require('Blockly.Msg');\nconst {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldLabel');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldVariable');\n\n\n/**\n * A dictionary of the block definitions provided by this module.\n * @type {!Object<string, !BlockDefinition>}\n */\nconst blocks = createBlockDefinitionsFromJsonArray([\n // Block for variable getter.\n {\n 'type': 'variables_get_dynamic',\n 'message0': '%1',\n 'args0': [{\n 'type': 'field_variable',\n 'name': 'VAR',\n 'variable': '%{BKY_VARIABLES_DEFAULT_NAME}',\n }],\n 'output': null,\n 'style': 'variable_dynamic_blocks',\n 'helpUrl': '%{BKY_VARIABLES_GET_HELPURL}',\n 'tooltip': '%{BKY_VARIABLES_GET_TOOLTIP}',\n 'extensions': ['contextMenu_variableDynamicSetterGetter'],\n },\n // Block for variable setter.\n {\n 'type': 'variables_set_dynamic',\n 'message0': '%{BKY_VARIABLES_SET}',\n 'args0': [\n {\n 'type': 'field_variable',\n 'name': 'VAR',\n 'variable': '%{BKY_VARIABLES_DEFAULT_NAME}',\n },\n {\n 'type': 'input_value',\n 'name': 'VALUE',\n },\n ],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'variable_dynamic_blocks',\n 'tooltip': '%{BKY_VARIABLES_SET_TOOLTIP}',\n 'helpUrl': '%{BKY_VARIABLES_SET_HELPURL}',\n 'extensions': ['contextMenu_variableDynamicSetterGetter'],\n },\n]);\nexports.blocks = blocks;\n\n/**\n * Mixin to add context menu items to create getter/setter blocks for this\n * setter/getter.\n * Used by blocks 'variables_set_dynamic' and 'variables_get_dynamic'.\n * @mixin\n * @augments Block\n * @readonly\n */\nconst CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = {\n /**\n * Add menu option to create getter/setter block for this setter/getter.\n * @param {!Array} options List of menu options to add to.\n * @this {Block}\n */\n customContextMenu: function(options) {\n // Getter blocks have the option to create a setter block, and vice versa.\n if (!this.isInFlyout) {\n let oppositeType;\n let contextMenuMsg;\n const id = this.getFieldValue('VAR');\n const variableModel = this.workspace.getVariableById(id);\n const varType = variableModel.type;\n if (this.type === 'variables_get_dynamic') {\n oppositeType = 'variables_set_dynamic';\n contextMenuMsg = Msg['VARIABLES_GET_CREATE_SET'];\n } else {\n oppositeType = 'variables_get_dynamic';\n contextMenuMsg = Msg['VARIABLES_SET_CREATE_GET'];\n }\n\n const option = {enabled: this.workspace.remainingCapacity() > 0};\n const name = this.getField('VAR').getText();\n option.text = contextMenuMsg.replace('%1', name);\n const xmlField = xml.createElement('field');\n xmlField.setAttribute('name', 'VAR');\n xmlField.setAttribute('variabletype', varType);\n xmlField.appendChild(xml.createTextNode(name));\n const xmlBlock = xml.createElement('block');\n xmlBlock.setAttribute('type', oppositeType);\n xmlBlock.appendChild(xmlField);\n option.callback = ContextMenu.callbackFactory(this, xmlBlock);\n options.push(option);\n } else {\n if (this.type === 'variables_get_dynamic' ||\n this.type === 'variables_get_reporter_dynamic') {\n const renameOption = {\n text: Msg['RENAME_VARIABLE'],\n enabled: true,\n callback: renameOptionCallbackFactory(this),\n };\n const name = this.getField('VAR').getText();\n const deleteOption = {\n text: Msg['DELETE_VARIABLE'].replace('%1', name),\n enabled: true,\n callback: deleteOptionCallbackFactory(this),\n };\n options.unshift(renameOption);\n options.unshift(deleteOption);\n }\n }\n },\n /**\n * Called whenever anything on the workspace changes.\n * Set the connection type for this block.\n * @param {AbstractEvent} _e Change event.\n * @this {Block}\n */\n onchange: function(_e) {\n const id = this.getFieldValue('VAR');\n const variableModel = Variables.getVariable(this.workspace, id);\n if (this.type === 'variables_get_dynamic') {\n this.outputConnection.setCheck(variableModel.type);\n } else {\n this.getInput('VALUE').connection.setCheck(variableModel.type);\n }\n },\n};\n\n/**\n * Factory for callbacks for rename variable dropdown menu option\n * associated with a variable getter block.\n * @param {!Block} block The block with the variable to rename.\n * @return {!function()} A function that renames the variable.\n */\nconst renameOptionCallbackFactory = function(block) {\n return function() {\n const workspace = block.workspace;\n const variable = block.getField('VAR').getVariable();\n Variables.renameVariable(workspace, variable);\n };\n};\n\n/**\n * Factory for callbacks for delete variable dropdown menu option\n * associated with a variable getter block.\n * @param {!Block} block The block with the variable to delete.\n * @return {!function()} A function that deletes the variable.\n */\nconst deleteOptionCallbackFactory = function(block) {\n return function() {\n const workspace = block.workspace;\n const variable = block.getField('VAR').getVariable();\n workspace.deleteVariableById(variable.getId());\n workspace.refreshToolboxSelection();\n };\n};\n\nExtensions.registerMixin(\n 'contextMenu_variableDynamicSetterGetter',\n CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Variable blocks for Blockly.\n * @suppress {checkTypes}\n */\n'use strict';\n\ngoog.module('Blockly.libraryBlocks.variables');\n\nconst ContextMenu = goog.require('Blockly.ContextMenu');\nconst Extensions = goog.require('Blockly.Extensions');\nconst Variables = goog.require('Blockly.Variables');\nconst xmlUtils = goog.require('Blockly.utils.xml');\n/* eslint-disable-next-line no-unused-vars */\nconst {Block} = goog.requireType('Blockly.Block');\n// const {BlockDefinition} = goog.requireType('Blockly.blocks');\n// TODO (6248): Properly import the BlockDefinition type.\n/* eslint-disable-next-line no-unused-vars */\nconst BlockDefinition = Object;\nconst {Msg} = goog.require('Blockly.Msg');\nconst {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldLabel');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldVariable');\n\n\n/**\n * A dictionary of the block definitions provided by this module.\n * @type {!Object<string, !BlockDefinition>}\n */\nconst blocks = createBlockDefinitionsFromJsonArray([\n // Block for variable getter.\n {\n 'type': 'variables_get',\n 'message0': '%1',\n 'args0': [\n {\n 'type': 'field_variable',\n 'name': 'VAR',\n 'variable': '%{BKY_VARIABLES_DEFAULT_NAME}',\n },\n ],\n 'output': null,\n 'style': 'variable_blocks',\n 'helpUrl': '%{BKY_VARIABLES_GET_HELPURL}',\n 'tooltip': '%{BKY_VARIABLES_GET_TOOLTIP}',\n 'extensions': ['contextMenu_variableSetterGetter'],\n },\n // Block for variable setter.\n {\n 'type': 'variables_set',\n 'message0': '%{BKY_VARIABLES_SET}',\n 'args0': [\n {\n 'type': 'field_variable',\n 'name': 'VAR',\n 'variable': '%{BKY_VARIABLES_DEFAULT_NAME}',\n },\n {\n 'type': 'input_value',\n 'name': 'VALUE',\n },\n ],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'variable_blocks',\n 'tooltip': '%{BKY_VARIABLES_SET_TOOLTIP}',\n 'helpUrl': '%{BKY_VARIABLES_SET_HELPURL}',\n 'extensions': ['contextMenu_variableSetterGetter'],\n },\n]);\nexports.blocks = blocks;\n\n\n/**\n * Mixin to add context menu items to create getter/setter blocks for this\n * setter/getter.\n * Used by blocks 'variables_set' and 'variables_get'.\n * @mixin\n * @augments Block\n * @package\n * @readonly\n */\nconst CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = {\n /**\n * Add menu option to create getter/setter block for this setter/getter.\n * @param {!Array} options List of menu options to add to.\n * @this {Block}\n */\n customContextMenu: function(options) {\n if (!this.isInFlyout) {\n let oppositeType;\n let contextMenuMsg;\n // Getter blocks have the option to create a setter block, and vice versa.\n if (this.type === 'variables_get') {\n oppositeType = 'variables_set';\n contextMenuMsg = Msg['VARIABLES_GET_CREATE_SET'];\n } else {\n oppositeType = 'variables_get';\n contextMenuMsg = Msg['VARIABLES_SET_CREATE_GET'];\n }\n\n const option = {enabled: this.workspace.remainingCapacity() > 0};\n const name = this.getField('VAR').getText();\n option.text = contextMenuMsg.replace('%1', name);\n const xmlField = xmlUtils.createElement('field');\n xmlField.setAttribute('name', 'VAR');\n xmlField.appendChild(xmlUtils.createTextNode(name));\n const xmlBlock = xmlUtils.createElement('block');\n xmlBlock.setAttribute('type', oppositeType);\n xmlBlock.appendChild(xmlField);\n option.callback = ContextMenu.callbackFactory(this, xmlBlock);\n options.push(option);\n // Getter blocks have the option to rename or delete that variable.\n } else {\n if (this.type === 'variables_get' ||\n this.type === 'variables_get_reporter') {\n const renameOption = {\n text: Msg['RENAME_VARIABLE'],\n enabled: true,\n callback: renameOptionCallbackFactory(this),\n };\n const name = this.getField('VAR').getText();\n const deleteOption = {\n text: Msg['DELETE_VARIABLE'].replace('%1', name),\n enabled: true,\n callback: deleteOptionCallbackFactory(this),\n };\n options.unshift(renameOption);\n options.unshift(deleteOption);\n }\n }\n },\n};\n\n/**\n * Factory for callbacks for rename variable dropdown menu option\n * associated with a variable getter block.\n * @param {!Block} block The block with the variable to rename.\n * @return {!function()} A function that renames the variable.\n */\nconst renameOptionCallbackFactory = function(block) {\n return function() {\n const workspace = block.workspace;\n const variable = block.getField('VAR').getVariable();\n Variables.renameVariable(workspace, variable);\n };\n};\n\n/**\n * Factory for callbacks for delete variable dropdown menu option\n * associated with a variable getter block.\n * @param {!Block} block The block with the variable to delete.\n * @return {!function()} A function that deletes the variable.\n */\nconst deleteOptionCallbackFactory = function(block) {\n return function() {\n const workspace = block.workspace;\n const variable = block.getField('VAR').getVariable();\n workspace.deleteVariableById(variable.getId());\n workspace.refreshToolboxSelection();\n };\n};\n\nExtensions.registerMixin(\n 'contextMenu_variableSetterGetter',\n CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Text blocks for Blockly.\n * @suppress {checkTypes}\n */\n'use strict';\n\ngoog.module('Blockly.libraryBlocks.texts');\n\nconst Extensions = goog.require('Blockly.Extensions');\nconst {Msg} = goog.require('Blockly.Msg');\n/* eslint-disable-next-line no-unused-vars */\nconst xmlUtils = goog.require('Blockly.utils.xml');\nconst {Align} = goog.require('Blockly.Input');\n/* eslint-disable-next-line no-unused-vars */\nconst {Block} = goog.requireType('Blockly.Block');\n// const {BlockDefinition} = goog.requireType('Blockly.blocks');\n// TODO (6248): Properly import the BlockDefinition type.\n/* eslint-disable-next-line no-unused-vars */\nconst BlockDefinition = Object;\nconst {ConnectionType} = goog.require('Blockly.ConnectionType');\nconst {FieldDropdown} = goog.require('Blockly.FieldDropdown');\nconst {FieldImage} = goog.require('Blockly.FieldImage');\nconst {FieldTextInput} = goog.require('Blockly.FieldTextInput');\nconst {Mutator} = goog.require('Blockly.Mutator');\n/* eslint-disable-next-line no-unused-vars */\nconst {Workspace} = goog.requireType('Blockly.Workspace');\nconst {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldMultilineInput');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldVariable');\n\n\n/**\n * A dictionary of the block definitions provided by this module.\n * @type {!Object<string, !BlockDefinition>}\n */\nconst blocks = createBlockDefinitionsFromJsonArray([\n // Block for text value\n {\n 'type': 'text',\n 'message0': '%1',\n 'args0': [{\n 'type': 'field_input',\n 'name': 'TEXT',\n 'text': '',\n }],\n 'output': 'String',\n 'style': 'text_blocks',\n 'helpUrl': '%{BKY_TEXT_TEXT_HELPURL}',\n 'tooltip': '%{BKY_TEXT_TEXT_TOOLTIP}',\n 'extensions': [\n 'text_quotes',\n 'parent_tooltip_when_inline',\n ],\n },\n {\n 'type': 'text_multiline',\n 'message0': '%1 %2',\n 'args0': [\n {\n 'type': 'field_image',\n 'src':\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAADpP' +\n 'U2iAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAdhgAAHYYBXaITgQAAABh0RVh0' +\n 'U29mdHdhcmUAcGFpbnQubmV0IDQuMS42/U4J6AAAAP1JREFUOE+Vks0KQUEYhjm' +\n 'RIja4ABtZ2dm5A3t3Ia6AUm7CylYuQRaUhZSlLZJiQbFAyRnPN33y01HOW08z88' +\n '73zpwzM4F3GWOCruvGIE4/rLaV+Nq1hVGMBqzhqlxgCys4wJA65xnogMHsQ5luj' +\n 'nYHTejBBCK2mE4abjCgMGhNxHgDFWjDSG07kdfVa2pZMf4ZyMAdWmpZMfYOsLiD' +\n 'MYMjlMB+K613QISRhTnITnsYg5yUd0DETmEoMlkFOeIT/A58iyK5E18BuTBfgYX' +\n 'fwNJv4P9/oEBerLylOnRhygmGdPpTTBZAPkde61lbQe4moWUvYUZYLfUNftIY4z' +\n 'wA5X2Z9AYnQrEAAAAASUVORK5CYII=',\n 'width': 12,\n 'height': 17,\n 'alt': '\\u00B6',\n },\n {\n 'type': 'field_multilinetext',\n 'name': 'TEXT',\n 'text': '',\n },\n ],\n 'output': 'String',\n 'style': 'text_blocks',\n 'helpUrl': '%{BKY_TEXT_TEXT_HELPURL}',\n 'tooltip': '%{BKY_TEXT_TEXT_TOOLTIP}',\n 'extensions': [\n 'parent_tooltip_when_inline',\n ],\n },\n {\n 'type': 'text_join',\n 'message0': '',\n 'output': 'String',\n 'style': 'text_blocks',\n 'helpUrl': '%{BKY_TEXT_JOIN_HELPURL}',\n 'tooltip': '%{BKY_TEXT_JOIN_TOOLTIP}',\n 'mutator': 'text_join_mutator',\n\n },\n {\n 'type': 'text_create_join_container',\n 'message0': '%{BKY_TEXT_CREATE_JOIN_TITLE_JOIN} %1 %2',\n 'args0': [\n {\n 'type': 'input_dummy',\n },\n {\n 'type': 'input_statement',\n 'name': 'STACK',\n },\n ],\n 'style': 'text_blocks',\n 'tooltip': '%{BKY_TEXT_CREATE_JOIN_TOOLTIP}',\n 'enableContextMenu': false,\n },\n {\n 'type': 'text_create_join_item',\n 'message0': '%{BKY_TEXT_CREATE_JOIN_ITEM_TITLE_ITEM}',\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'text_blocks',\n 'tooltip': '%{BKY_TEXT_CREATE_JOIN_ITEM_TOOLTIP}',\n 'enableContextMenu': false,\n },\n {\n 'type': 'text_append',\n 'message0': '%{BKY_TEXT_APPEND_TITLE}',\n 'args0': [\n {\n 'type': 'field_variable',\n 'name': 'VAR',\n 'variable': '%{BKY_TEXT_APPEND_VARIABLE}',\n },\n {\n 'type': 'input_value',\n 'name': 'TEXT',\n },\n ],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'text_blocks',\n 'extensions': [\n 'text_append_tooltip',\n ],\n },\n {\n 'type': 'text_length',\n 'message0': '%{BKY_TEXT_LENGTH_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'VALUE',\n 'check': ['String', 'Array'],\n },\n ],\n 'output': 'Number',\n 'style': 'text_blocks',\n 'tooltip': '%{BKY_TEXT_LENGTH_TOOLTIP}',\n 'helpUrl': '%{BKY_TEXT_LENGTH_HELPURL}',\n },\n {\n 'type': 'text_isEmpty',\n 'message0': '%{BKY_TEXT_ISEMPTY_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'VALUE',\n 'check': ['String', 'Array'],\n },\n ],\n 'output': 'Boolean',\n 'style': 'text_blocks',\n 'tooltip': '%{BKY_TEXT_ISEMPTY_TOOLTIP}',\n 'helpUrl': '%{BKY_TEXT_ISEMPTY_HELPURL}',\n },\n {\n 'type': 'text_indexOf',\n 'message0': '%{BKY_TEXT_INDEXOF_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'VALUE',\n 'check': 'String',\n },\n {\n 'type': 'field_dropdown',\n 'name': 'END',\n 'options': [\n [\n '%{BKY_TEXT_INDEXOF_OPERATOR_FIRST}',\n 'FIRST',\n ],\n [\n '%{BKY_TEXT_INDEXOF_OPERATOR_LAST}',\n 'LAST',\n ],\n ],\n },\n {\n 'type': 'input_value',\n 'name': 'FIND',\n 'check': 'String',\n },\n ],\n 'output': 'Number',\n 'style': 'text_blocks',\n 'helpUrl': '%{BKY_TEXT_INDEXOF_HELPURL}',\n 'inputsInline': true,\n 'extensions': [\n 'text_indexOf_tooltip',\n ],\n },\n {\n 'type': 'text_charAt',\n 'message0': '%{BKY_TEXT_CHARAT_TITLE}', // \"in text %1 %2\"\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'VALUE',\n 'check': 'String',\n },\n {\n 'type': 'field_dropdown',\n 'name': 'WHERE',\n 'options': [\n ['%{BKY_TEXT_CHARAT_FROM_START}', 'FROM_START'],\n ['%{BKY_TEXT_CHARAT_FROM_END}', 'FROM_END'],\n ['%{BKY_TEXT_CHARAT_FIRST}', 'FIRST'],\n ['%{BKY_TEXT_CHARAT_LAST}', 'LAST'],\n ['%{BKY_TEXT_CHARAT_RANDOM}', 'RANDOM'],\n ],\n },\n ],\n 'output': 'String',\n 'style': 'text_blocks',\n 'helpUrl': '%{BKY_TEXT_CHARAT_HELPURL}',\n 'inputsInline': true,\n 'mutator': 'text_charAt_mutator',\n },\n]);\nexports.blocks = blocks;\n\nblocks['text_getSubstring'] = {\n /**\n * Block for getting substring.\n * @this {Block}\n */\n init: function() {\n this['WHERE_OPTIONS_1'] = [\n [Msg['TEXT_GET_SUBSTRING_START_FROM_START'], 'FROM_START'],\n [Msg['TEXT_GET_SUBSTRING_START_FROM_END'], 'FROM_END'],\n [Msg['TEXT_GET_SUBSTRING_START_FIRST'], 'FIRST'],\n ];\n this['WHERE_OPTIONS_2'] = [\n [Msg['TEXT_GET_SUBSTRING_END_FROM_START'], 'FROM_START'],\n [Msg['TEXT_GET_SUBSTRING_END_FROM_END'], 'FROM_END'],\n [Msg['TEXT_GET_SUBSTRING_END_LAST'], 'LAST'],\n ];\n this.setHelpUrl(Msg['TEXT_GET_SUBSTRING_HELPURL']);\n this.setStyle('text_blocks');\n this.appendValueInput('STRING').setCheck('String').appendField(\n Msg['TEXT_GET_SUBSTRING_INPUT_IN_TEXT']);\n this.appendDummyInput('AT1');\n this.appendDummyInput('AT2');\n if (Msg['TEXT_GET_SUBSTRING_TAIL']) {\n this.appendDummyInput('TAIL').appendField(Msg['TEXT_GET_SUBSTRING_TAIL']);\n }\n this.setInputsInline(true);\n this.setOutput(true, 'String');\n this.updateAt_(1, true);\n this.updateAt_(2, true);\n this.setTooltip(Msg['TEXT_GET_SUBSTRING_TOOLTIP']);\n },\n /**\n * Create XML to represent whether there are 'AT' inputs.\n * Backwards compatible serialization implementation.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n const isAt1 = this.getInput('AT1').type === ConnectionType.INPUT_VALUE;\n container.setAttribute('at1', isAt1);\n const isAt2 = this.getInput('AT2').type === ConnectionType.INPUT_VALUE;\n container.setAttribute('at2', isAt2);\n return container;\n },\n /**\n * Parse XML to restore the 'AT' inputs.\n * Backwards compatible serialization implementation.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n const isAt1 = (xmlElement.getAttribute('at1') === 'true');\n const isAt2 = (xmlElement.getAttribute('at2') === 'true');\n this.updateAt_(1, isAt1);\n this.updateAt_(2, isAt2);\n },\n\n // This block does not need JSO serialization hooks (saveExtraState and\n // loadExtraState) because the state of this object is already encoded in the\n // dropdown values.\n // XML hooks are kept for backwards compatibility.\n\n /**\n * Create or delete an input for a numeric index.\n * This block has two such inputs, independent of each other.\n * @param {number} n Specify first or second input (1 or 2).\n * @param {boolean} isAt True if the input should exist.\n * @private\n * @this {Block}\n */\n updateAt_: function(n, isAt) {\n // Create or delete an input for the numeric index.\n // Destroy old 'AT' and 'ORDINAL' inputs.\n this.removeInput('AT' + n);\n this.removeInput('ORDINAL' + n, true);\n // Create either a value 'AT' input or a dummy input.\n if (isAt) {\n this.appendValueInput('AT' + n).setCheck('Number');\n if (Msg['ORDINAL_NUMBER_SUFFIX']) {\n this.appendDummyInput('ORDINAL' + n)\n .appendField(Msg['ORDINAL_NUMBER_SUFFIX']);\n }\n } else {\n this.appendDummyInput('AT' + n);\n }\n // Move tail, if present, to end of block.\n if (n === 2 && Msg['TEXT_GET_SUBSTRING_TAIL']) {\n this.removeInput('TAIL', true);\n this.appendDummyInput('TAIL').appendField(Msg['TEXT_GET_SUBSTRING_TAIL']);\n }\n const menu = new FieldDropdown(\n this['WHERE_OPTIONS_' + n],\n /**\n * @param {*} value The input value.\n * @this {FieldDropdown}\n * @return {null|undefined} Null if the field has been replaced;\n * otherwise undefined.\n */\n function(value) {\n const newAt = (value === 'FROM_START') || (value === 'FROM_END');\n // The 'isAt' variable is available due to this function being a\n // closure.\n if (newAt !== isAt) {\n const block = this.getSourceBlock();\n block.updateAt_(n, newAt);\n // This menu has been destroyed and replaced.\n // Update the replacement.\n block.setFieldValue(value, 'WHERE' + n);\n return null;\n }\n return undefined;\n });\n\n this.getInput('AT' + n).appendField(menu, 'WHERE' + n);\n if (n === 1) {\n this.moveInputBefore('AT1', 'AT2');\n if (this.getInput('ORDINAL1')) {\n this.moveInputBefore('ORDINAL1', 'AT2');\n }\n }\n },\n};\n\nblocks['text_changeCase'] = {\n /**\n * Block for changing capitalization.\n * @this {Block}\n */\n init: function() {\n const OPERATORS = [\n [Msg['TEXT_CHANGECASE_OPERATOR_UPPERCASE'], 'UPPERCASE'],\n [Msg['TEXT_CHANGECASE_OPERATOR_LOWERCASE'], 'LOWERCASE'],\n [Msg['TEXT_CHANGECASE_OPERATOR_TITLECASE'], 'TITLECASE'],\n ];\n this.setHelpUrl(Msg['TEXT_CHANGECASE_HELPURL']);\n this.setStyle('text_blocks');\n this.appendValueInput('TEXT').setCheck('String').appendField(\n new FieldDropdown(OPERATORS), 'CASE');\n this.setOutput(true, 'String');\n this.setTooltip(Msg['TEXT_CHANGECASE_TOOLTIP']);\n },\n};\n\nblocks['text_trim'] = {\n /**\n * Block for trimming spaces.\n * @this {Block}\n */\n init: function() {\n const OPERATORS = [\n [Msg['TEXT_TRIM_OPERATOR_BOTH'], 'BOTH'],\n [Msg['TEXT_TRIM_OPERATOR_LEFT'], 'LEFT'],\n [Msg['TEXT_TRIM_OPERATOR_RIGHT'], 'RIGHT'],\n ];\n this.setHelpUrl(Msg['TEXT_TRIM_HELPURL']);\n this.setStyle('text_blocks');\n this.appendValueInput('TEXT').setCheck('String').appendField(\n new FieldDropdown(OPERATORS), 'MODE');\n this.setOutput(true, 'String');\n this.setTooltip(Msg['TEXT_TRIM_TOOLTIP']);\n },\n};\n\nblocks['text_print'] = {\n /**\n * Block for print statement.\n * @this {Block}\n */\n init: function() {\n this.jsonInit({\n 'message0': Msg['TEXT_PRINT_TITLE'],\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'TEXT',\n },\n ],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'text_blocks',\n 'tooltip': Msg['TEXT_PRINT_TOOLTIP'],\n 'helpUrl': Msg['TEXT_PRINT_HELPURL'],\n });\n },\n};\n\n\n/**\n * Common properties for the text_prompt_ext and text_prompt blocks\n * definitions.\n */\nconst TEXT_PROMPT_COMMON = {\n /**\n * Modify this block to have the correct output type.\n * @param {string} newOp Either 'TEXT' or 'NUMBER'.\n * @private\n * @this {Block}\n */\n updateType_: function(newOp) {\n this.outputConnection.setCheck(newOp === 'NUMBER' ? 'Number' : 'String');\n },\n /**\n * Create XML to represent the output type.\n * Backwards compatible serialization implementation.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n container.setAttribute('type', this.getFieldValue('TYPE'));\n return container;\n },\n /**\n * Parse XML to restore the output type.\n * Backwards compatible serialization implementation.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n this.updateType_(xmlElement.getAttribute('type'));\n },\n};\n\nblocks['text_prompt_ext'] = {\n ...TEXT_PROMPT_COMMON,\n /**\n * Block for prompt function (external message).\n * @this {Block}\n */\n init: function() {\n const TYPES = [\n [Msg['TEXT_PROMPT_TYPE_TEXT'], 'TEXT'],\n [Msg['TEXT_PROMPT_TYPE_NUMBER'], 'NUMBER'],\n ];\n this.setHelpUrl(Msg['TEXT_PROMPT_HELPURL']);\n this.setStyle('text_blocks');\n // Assign 'this' to a variable for use in the closures below.\n const thisBlock = this;\n const dropdown = new FieldDropdown(TYPES, function(newOp) {\n thisBlock.updateType_(newOp);\n });\n this.appendValueInput('TEXT').appendField(dropdown, 'TYPE');\n this.setOutput(true, 'String');\n this.setTooltip(function() {\n return (thisBlock.getFieldValue('TYPE') === 'TEXT') ?\n Msg['TEXT_PROMPT_TOOLTIP_TEXT'] :\n Msg['TEXT_PROMPT_TOOLTIP_NUMBER'];\n });\n },\n\n // This block does not need JSO serialization hooks (saveExtraState and\n // loadExtraState) because the state of this object is already encoded in the\n // dropdown values.\n // XML hooks are kept for backwards compatibility.\n};\n\nblocks['text_prompt'] = {\n ...TEXT_PROMPT_COMMON,\n /**\n * Block for prompt function (internal message).\n * The 'text_prompt_ext' block is preferred as it is more flexible.\n * @this {Block}\n */\n init: function() {\n this.mixin(QUOTE_IMAGE_MIXIN);\n const TYPES = [\n [Msg['TEXT_PROMPT_TYPE_TEXT'], 'TEXT'],\n [Msg['TEXT_PROMPT_TYPE_NUMBER'], 'NUMBER'],\n ];\n\n // Assign 'this' to a variable for use in the closures below.\n const thisBlock = this;\n this.setHelpUrl(Msg['TEXT_PROMPT_HELPURL']);\n this.setStyle('text_blocks');\n const dropdown = new FieldDropdown(TYPES, function(newOp) {\n thisBlock.updateType_(newOp);\n });\n this.appendDummyInput()\n .appendField(dropdown, 'TYPE')\n .appendField(this.newQuote_(true))\n .appendField(new FieldTextInput(''), 'TEXT')\n .appendField(this.newQuote_(false));\n this.setOutput(true, 'String');\n this.setTooltip(function() {\n return (thisBlock.getFieldValue('TYPE') === 'TEXT') ?\n Msg['TEXT_PROMPT_TOOLTIP_TEXT'] :\n Msg['TEXT_PROMPT_TOOLTIP_NUMBER'];\n });\n },\n};\n\nblocks['text_count'] = {\n /**\n * Block for counting how many times one string appears within another string.\n * @this {Block}\n */\n init: function() {\n this.jsonInit({\n 'message0': Msg['TEXT_COUNT_MESSAGE0'],\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'SUB',\n 'check': 'String',\n },\n {\n 'type': 'input_value',\n 'name': 'TEXT',\n 'check': 'String',\n },\n ],\n 'output': 'Number',\n 'inputsInline': true,\n 'style': 'text_blocks',\n 'tooltip': Msg['TEXT_COUNT_TOOLTIP'],\n 'helpUrl': Msg['TEXT_COUNT_HELPURL'],\n });\n },\n};\n\nblocks['text_replace'] = {\n /**\n * Block for replacing one string with another in the text.\n * @this {Block}\n */\n init: function() {\n this.jsonInit({\n 'message0': Msg['TEXT_REPLACE_MESSAGE0'],\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'FROM',\n 'check': 'String',\n },\n {\n 'type': 'input_value',\n 'name': 'TO',\n 'check': 'String',\n },\n {\n 'type': 'input_value',\n 'name': 'TEXT',\n 'check': 'String',\n },\n ],\n 'output': 'String',\n 'inputsInline': true,\n 'style': 'text_blocks',\n 'tooltip': Msg['TEXT_REPLACE_TOOLTIP'],\n 'helpUrl': Msg['TEXT_REPLACE_HELPURL'],\n });\n },\n};\n\nblocks['text_reverse'] = {\n /**\n * Block for reversing a string.\n * @this {Block}\n */\n init: function() {\n this.jsonInit({\n 'message0': Msg['TEXT_REVERSE_MESSAGE0'],\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'TEXT',\n 'check': 'String',\n },\n ],\n 'output': 'String',\n 'inputsInline': true,\n 'style': 'text_blocks',\n 'tooltip': Msg['TEXT_REVERSE_TOOLTIP'],\n 'helpUrl': Msg['TEXT_REVERSE_HELPURL'],\n });\n },\n};\n\n/**\n * @mixin\n * @package\n * @readonly\n */\nconst QUOTE_IMAGE_MIXIN = {\n /**\n * Image data URI of an LTR opening double quote (same as RTL closing double\n * quote).\n * @readonly\n */\n QUOTE_IMAGE_LEFT_DATAURI:\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAA' +\n 'n0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY' +\n '1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1' +\n 'HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMf' +\n 'z9AylsaRRgGzvZAAAAAElFTkSuQmCC',\n /**\n * Image data URI of an LTR closing double quote (same as RTL opening double\n * quote).\n * @readonly\n */\n QUOTE_IMAGE_RIGHT_DATAURI:\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAA' +\n 'qUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhg' +\n 'gONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvB' +\n 'O3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5Aos' +\n 'lLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==',\n /**\n * Pixel width of QUOTE_IMAGE_LEFT_DATAURI and QUOTE_IMAGE_RIGHT_DATAURI.\n * @readonly\n */\n QUOTE_IMAGE_WIDTH: 12,\n /**\n * Pixel height of QUOTE_IMAGE_LEFT_DATAURI and QUOTE_IMAGE_RIGHT_DATAURI.\n * @readonly\n */\n QUOTE_IMAGE_HEIGHT: 12,\n\n /**\n * Inserts appropriate quote images before and after the named field.\n * @param {string} fieldName The name of the field to wrap with quotes.\n * @this {Block}\n */\n quoteField_: function(fieldName) {\n for (let i = 0, input; (input = this.inputList[i]); i++) {\n for (let j = 0, field; (field = input.fieldRow[j]); j++) {\n if (fieldName === field.name) {\n input.insertFieldAt(j, this.newQuote_(true));\n input.insertFieldAt(j + 2, this.newQuote_(false));\n return;\n }\n }\n }\n console.warn(\n 'field named \"' + fieldName + '\" not found in ' + this.toDevString());\n },\n\n /**\n * A helper function that generates a FieldImage of an opening or\n * closing double quote. The selected quote will be adapted for RTL blocks.\n * @param {boolean} open If the image should be open quote (“ in LTR).\n * Otherwise, a closing quote is used (” in LTR).\n * @return {!FieldImage} The new field.\n * @this {Block}\n */\n newQuote_: function(open) {\n const isLeft = this.RTL ? !open : open;\n const dataUri =\n isLeft ? this.QUOTE_IMAGE_LEFT_DATAURI : this.QUOTE_IMAGE_RIGHT_DATAURI;\n return new FieldImage(\n dataUri, this.QUOTE_IMAGE_WIDTH, this.QUOTE_IMAGE_HEIGHT,\n isLeft ? '\\u201C' : '\\u201D');\n },\n};\n\n/**\n * Wraps TEXT field with images of double quote characters.\n * @this {Block}\n */\nconst TEXT_QUOTES_EXTENSION = function() {\n this.mixin(QUOTE_IMAGE_MIXIN);\n this.quoteField_('TEXT');\n};\n\n/**\n * Mixin for mutator functions in the 'text_join_mutator' extension.\n * @mixin\n * @augments Block\n * @package\n */\nconst TEXT_JOIN_MUTATOR_MIXIN = {\n /**\n * Create XML to represent number of text inputs.\n * Backwards compatible serialization implementation.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n container.setAttribute('items', this.itemCount_);\n return container;\n },\n /**\n * Parse XML to restore the text inputs.\n * Backwards compatible serialization implementation.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\n this.updateShape_();\n },\n /**\n * Returns the state of this block as a JSON serializable object.\n * @return {{itemCount: number}} The state of this block, ie the item count.\n */\n saveExtraState: function() {\n return {\n 'itemCount': this.itemCount_,\n };\n },\n /**\n * Applies the given state to this block.\n * @param {*} state The state to apply to this block, ie the item count.\n */\n loadExtraState: function(state) {\n this.itemCount_ = state['itemCount'];\n this.updateShape_();\n },\n /**\n * Populate the mutator's dialog with this block's components.\n * @param {!Workspace} workspace Mutator's workspace.\n * @return {!Block} Root block in mutator.\n * @this {Block}\n */\n decompose: function(workspace) {\n const containerBlock = workspace.newBlock('text_create_join_container');\n containerBlock.initSvg();\n let connection = containerBlock.getInput('STACK').connection;\n for (let i = 0; i < this.itemCount_; i++) {\n const itemBlock = workspace.newBlock('text_create_join_item');\n itemBlock.initSvg();\n connection.connect(itemBlock.previousConnection);\n connection = itemBlock.nextConnection;\n }\n return containerBlock;\n },\n /**\n * Reconfigure this block based on the mutator dialog's components.\n * @param {!Block} containerBlock Root block in mutator.\n * @this {Block}\n */\n compose: function(containerBlock) {\n let itemBlock = containerBlock.getInputTargetBlock('STACK');\n // Count number of inputs.\n const connections = [];\n while (itemBlock) {\n if (itemBlock.isInsertionMarker()) {\n itemBlock = itemBlock.getNextBlock();\n continue;\n }\n connections.push(itemBlock.valueConnection_);\n itemBlock = itemBlock.getNextBlock();\n }\n // Disconnect any children that don't belong.\n for (let i = 0; i < this.itemCount_; i++) {\n const connection = this.getInput('ADD' + i).connection.targetConnection;\n if (connection && connections.indexOf(connection) === -1) {\n connection.disconnect();\n }\n }\n this.itemCount_ = connections.length;\n this.updateShape_();\n // Reconnect any child blocks.\n for (let i = 0; i < this.itemCount_; i++) {\n Mutator.reconnect(connections[i], this, 'ADD' + i);\n }\n },\n /**\n * Store pointers to any connected child blocks.\n * @param {!Block} containerBlock Root block in mutator.\n * @this {Block}\n */\n saveConnections: function(containerBlock) {\n let itemBlock = containerBlock.getInputTargetBlock('STACK');\n let i = 0;\n while (itemBlock) {\n if (itemBlock.isInsertionMarker()) {\n itemBlock = itemBlock.getNextBlock();\n continue;\n }\n const input = this.getInput('ADD' + i);\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\n itemBlock = itemBlock.getNextBlock();\n i++;\n }\n },\n /**\n * Modify this block to have the correct number of inputs.\n * @private\n * @this {Block}\n */\n updateShape_: function() {\n if (this.itemCount_ && this.getInput('EMPTY')) {\n this.removeInput('EMPTY');\n } else if (!this.itemCount_ && !this.getInput('EMPTY')) {\n this.appendDummyInput('EMPTY')\n .appendField(this.newQuote_(true))\n .appendField(this.newQuote_(false));\n }\n // Add new inputs.\n for (let i = 0; i < this.itemCount_; i++) {\n if (!this.getInput('ADD' + i)) {\n const input = this.appendValueInput('ADD' + i).setAlign(Align.RIGHT);\n if (i === 0) {\n input.appendField(Msg['TEXT_JOIN_TITLE_CREATEWITH']);\n }\n }\n }\n // Remove deleted inputs.\n for (let i = this.itemCount_; this.getInput('ADD' + i); i++) {\n this.removeInput('ADD' + i);\n }\n },\n};\n\n/**\n * Performs final setup of a text_join block.\n * @this {Block}\n */\nconst TEXT_JOIN_EXTENSION = function() {\n // Add the quote mixin for the itemCount_ = 0 case.\n this.mixin(QUOTE_IMAGE_MIXIN);\n // Initialize the mutator values.\n this.itemCount_ = 2;\n this.updateShape_();\n // Configure the mutator UI.\n this.setMutator(new Mutator(['text_create_join_item'], this));\n};\n\n// Update the tooltip of 'text_append' block to reference the variable.\nExtensions.register(\n 'text_append_tooltip',\n Extensions.buildTooltipWithFieldText('%{BKY_TEXT_APPEND_TOOLTIP}', 'VAR'));\n\n/**\n * Update the tooltip of 'text_append' block to reference the variable.\n * @this {Block}\n */\nconst TEXT_INDEXOF_TOOLTIP_EXTENSION = function() {\n // Assign 'this' to a variable for use in the tooltip closure below.\n const thisBlock = this;\n this.setTooltip(function() {\n return Msg['TEXT_INDEXOF_TOOLTIP'].replace(\n '%1', thisBlock.workspace.options.oneBasedIndex ? '0' : '-1');\n });\n};\n\n/**\n * Mixin for mutator functions in the 'text_charAt_mutator' extension.\n * @mixin\n * @augments Block\n * @package\n */\nconst TEXT_CHARAT_MUTATOR_MIXIN = {\n /**\n * Create XML to represent whether there is an 'AT' input.\n * Backwards compatible serialization implementation.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n container.setAttribute('at', !!this.isAt_);\n return container;\n },\n /**\n * Parse XML to restore the 'AT' input.\n * Backwards compatible serialization implementation.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n // Note: Until January 2013 this block did not have mutations,\n // so 'at' defaults to true.\n const isAt = (xmlElement.getAttribute('at') !== 'false');\n this.updateAt_(isAt);\n },\n\n // This block does not need JSO serialization hooks (saveExtraState and\n // loadExtraState) because the state of this object is already encoded in the\n // dropdown values.\n // XML hooks are kept for backwards compatibility.\n\n /**\n * Create or delete an input for the numeric index.\n * @param {boolean} isAt True if the input should exist.\n * @private\n * @this {Block}\n */\n updateAt_: function(isAt) {\n // Destroy old 'AT' and 'ORDINAL' inputs.\n this.removeInput('AT', true);\n this.removeInput('ORDINAL', true);\n // Create either a value 'AT' input or a dummy input.\n if (isAt) {\n this.appendValueInput('AT').setCheck('Number');\n if (Msg['ORDINAL_NUMBER_SUFFIX']) {\n this.appendDummyInput('ORDINAL').appendField(\n Msg['ORDINAL_NUMBER_SUFFIX']);\n }\n }\n if (Msg['TEXT_CHARAT_TAIL']) {\n this.removeInput('TAIL', true);\n this.appendDummyInput('TAIL').appendField(Msg['TEXT_CHARAT_TAIL']);\n }\n\n this.isAt_ = isAt;\n },\n};\n\n/**\n * Does the initial mutator update of text_charAt and adds the tooltip\n * @this {Block}\n */\nconst TEXT_CHARAT_EXTENSION = function() {\n const dropdown = this.getField('WHERE');\n dropdown.setValidator(\n /**\n * @param {*} value The input value.\n * @this {FieldDropdown}\n */\n function(value) {\n const newAt = (value === 'FROM_START') || (value === 'FROM_END');\n if (newAt !== this.isAt_) {\n const block = this.getSourceBlock();\n block.updateAt_(newAt);\n }\n });\n this.updateAt_(true);\n // Assign 'this' to a variable for use in the tooltip closure below.\n const thisBlock = this;\n this.setTooltip(function() {\n const where = thisBlock.getFieldValue('WHERE');\n let tooltip = Msg['TEXT_CHARAT_TOOLTIP'];\n if (where === 'FROM_START' || where === 'FROM_END') {\n const msg = (where === 'FROM_START') ?\n Msg['LISTS_INDEX_FROM_START_TOOLTIP'] :\n Msg['LISTS_INDEX_FROM_END_TOOLTIP'];\n if (msg) {\n tooltip += ' ' +\n msg.replace(\n '%1', thisBlock.workspace.options.oneBasedIndex ? '#1' : '#0');\n }\n }\n return tooltip;\n });\n};\n\nExtensions.register('text_indexOf_tooltip', TEXT_INDEXOF_TOOLTIP_EXTENSION);\n\nExtensions.register('text_quotes', TEXT_QUOTES_EXTENSION);\n\nExtensions.registerMutator(\n 'text_join_mutator', TEXT_JOIN_MUTATOR_MIXIN, TEXT_JOIN_EXTENSION);\n\nExtensions.registerMutator(\n 'text_charAt_mutator', TEXT_CHARAT_MUTATOR_MIXIN, TEXT_CHARAT_EXTENSION);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Procedure blocks for Blockly.\n * @suppress {checkTypes|visibility}\n */\n'use strict';\n\ngoog.module('Blockly.libraryBlocks.procedures');\n\n/* eslint-disable-next-line no-unused-vars */\nconst AbstractEvent = goog.requireType('Blockly.Events.Abstract');\nconst ContextMenu = goog.require('Blockly.ContextMenu');\nconst Events = goog.require('Blockly.Events');\nconst Procedures = goog.require('Blockly.Procedures');\nconst Variables = goog.require('Blockly.Variables');\nconst Xml = goog.require('Blockly.Xml');\nconst xmlUtils = goog.require('Blockly.utils.xml');\nconst {Align} = goog.require('Blockly.Input');\n/* eslint-disable-next-line no-unused-vars */\nconst {Block} = goog.requireType('Blockly.Block');\n// const {BlockDefinition} = goog.requireType('Blockly.blocks');\n// TODO (6248): Properly import the BlockDefinition type.\n/* eslint-disable-next-line no-unused-vars */\nconst BlockDefinition = Object;\nconst {config} = goog.require('Blockly.config');\n/* eslint-disable-next-line no-unused-vars */\nconst {FieldCheckbox} = goog.require('Blockly.FieldCheckbox');\nconst {FieldLabel} = goog.require('Blockly.FieldLabel');\nconst {FieldTextInput} = goog.require('Blockly.FieldTextInput');\nconst {Msg} = goog.require('Blockly.Msg');\nconst {Mutator} = goog.require('Blockly.Mutator');\nconst {Names} = goog.require('Blockly.Names');\n/* eslint-disable-next-line no-unused-vars */\nconst {VariableModel} = goog.requireType('Blockly.VariableModel');\n/* eslint-disable-next-line no-unused-vars */\nconst {Workspace} = goog.requireType('Blockly.Workspace');\nconst {defineBlocks} = goog.require('Blockly.common');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.Comment');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.Warning');\n\n\n/**\n * A dictionary of the block definitions provided by this module.\n * @type {!Object<string, !BlockDefinition>}\n */\nconst blocks = {};\nexports.blocks = blocks;\n\n/**\n * Common properties for the procedure_defnoreturn and\n * procedure_defreturn blocks.\n */\nconst PROCEDURE_DEF_COMMON = {\n /**\n * Add or remove the statement block from this function definition.\n * @param {boolean} hasStatements True if a statement block is needed.\n * @this {Block}\n */\n setStatements_: function(hasStatements) {\n if (this.hasStatements_ === hasStatements) {\n return;\n }\n if (hasStatements) {\n this.appendStatementInput('STACK').appendField(\n Msg['PROCEDURES_DEFNORETURN_DO']);\n if (this.getInput('RETURN')) {\n this.moveInputBefore('STACK', 'RETURN');\n }\n } else {\n this.removeInput('STACK', true);\n }\n this.hasStatements_ = hasStatements;\n },\n /**\n * Update the display of parameters for this procedure definition block.\n * @private\n * @this {Block}\n */\n updateParams_: function() {\n // Merge the arguments into a human-readable list.\n let paramString = '';\n if (this.arguments_.length) {\n paramString =\n Msg['PROCEDURES_BEFORE_PARAMS'] + ' ' + this.arguments_.join(', ');\n }\n // The params field is deterministic based on the mutation,\n // no need to fire a change event.\n Events.disable();\n try {\n this.setFieldValue(paramString, 'PARAMS');\n } finally {\n Events.enable();\n }\n },\n /**\n * Create XML to represent the argument inputs.\n * Backwards compatible serialization implementation.\n * @param {boolean=} opt_paramIds If true include the IDs of the parameter\n * quarks. Used by Procedures.mutateCallers for reconnection.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function(opt_paramIds) {\n const container = xmlUtils.createElement('mutation');\n if (opt_paramIds) {\n container.setAttribute('name', this.getFieldValue('NAME'));\n }\n for (let i = 0; i < this.argumentVarModels_.length; i++) {\n const parameter = xmlUtils.createElement('arg');\n const argModel = this.argumentVarModels_[i];\n parameter.setAttribute('name', argModel.name);\n parameter.setAttribute('varid', argModel.getId());\n if (opt_paramIds && this.paramIds_) {\n parameter.setAttribute('paramId', this.paramIds_[i]);\n }\n container.appendChild(parameter);\n }\n\n // Save whether the statement input is visible.\n if (!this.hasStatements_) {\n container.setAttribute('statements', 'false');\n }\n return container;\n },\n /**\n * Parse XML to restore the argument inputs.\n * Backwards compatible serialization implementation.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n this.arguments_ = [];\n this.argumentVarModels_ = [];\n for (let i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) {\n if (childNode.nodeName.toLowerCase() === 'arg') {\n const varName = childNode.getAttribute('name');\n const varId =\n childNode.getAttribute('varid') || childNode.getAttribute('varId');\n this.arguments_.push(varName);\n const variable = Variables.getOrCreateVariablePackage(\n this.workspace, varId, varName, '');\n if (variable !== null) {\n this.argumentVarModels_.push(variable);\n } else {\n console.log(\n 'Failed to create a variable with name ' + varName +\n ', ignoring.');\n }\n }\n }\n this.updateParams_();\n Procedures.mutateCallers(this);\n\n // Show or hide the statement input.\n this.setStatements_(xmlElement.getAttribute('statements') !== 'false');\n },\n /**\n * Returns the state of this block as a JSON serializable object.\n * @return {?{params: (!Array<{name: string, id: string}>|undefined),\n * hasStatements: (boolean|undefined)}} The state of this block, eg the\n * parameters and statements.\n */\n saveExtraState: function() {\n if (!this.argumentVarModels_.length && this.hasStatements_) {\n return null;\n }\n const state = Object.create(null);\n if (this.argumentVarModels_.length) {\n state['params'] = [];\n for (let i = 0; i < this.argumentVarModels_.length; i++) {\n state['params'].push({\n // We don't need to serialize the name, but just in case we decide\n // to separate params from variables.\n 'name': this.argumentVarModels_[i].name,\n 'id': this.argumentVarModels_[i].getId(),\n });\n }\n }\n if (!this.hasStatements_) {\n state['hasStatements'] = false;\n }\n return state;\n },\n /**\n * Applies the given state to this block.\n * @param {*} state The state to apply to this block, eg the parameters and\n * statements.\n */\n loadExtraState: function(state) {\n this.arguments_ = [];\n this.argumentVarModels_ = [];\n if (state['params']) {\n for (let i = 0; i < state['params'].length; i++) {\n const param = state['params'][i];\n const variable = Variables.getOrCreateVariablePackage(\n this.workspace, param['id'], param['name'], '');\n this.arguments_.push(variable.name);\n this.argumentVarModels_.push(variable);\n }\n }\n this.updateParams_();\n Procedures.mutateCallers(this);\n this.setStatements_(state['hasStatements'] === false ? false : true);\n },\n /**\n * Populate the mutator's dialog with this block's components.\n * @param {!Workspace} workspace Mutator's workspace.\n * @return {!Block} Root block in mutator.\n * @this {Block}\n */\n decompose: function(workspace) {\n /*\n * Creates the following XML:\n * <block type=\"procedures_mutatorcontainer\">\n * <statement name=\"STACK\">\n * <block type=\"procedures_mutatorarg\">\n * <field name=\"NAME\">arg1_name</field>\n * <next>etc...</next>\n * </block>\n * </statement>\n * </block>\n */\n\n const containerBlockNode = xmlUtils.createElement('block');\n containerBlockNode.setAttribute('type', 'procedures_mutatorcontainer');\n const statementNode = xmlUtils.createElement('statement');\n statementNode.setAttribute('name', 'STACK');\n containerBlockNode.appendChild(statementNode);\n\n let node = statementNode;\n for (let i = 0; i < this.arguments_.length; i++) {\n const argBlockNode = xmlUtils.createElement('block');\n argBlockNode.setAttribute('type', 'procedures_mutatorarg');\n const fieldNode = xmlUtils.createElement('field');\n fieldNode.setAttribute('name', 'NAME');\n const argumentName = xmlUtils.createTextNode(this.arguments_[i]);\n fieldNode.appendChild(argumentName);\n argBlockNode.appendChild(fieldNode);\n const nextNode = xmlUtils.createElement('next');\n argBlockNode.appendChild(nextNode);\n\n node.appendChild(argBlockNode);\n node = nextNode;\n }\n\n const containerBlock = Xml.domToBlock(containerBlockNode, workspace);\n\n if (this.type === 'procedures_defreturn') {\n containerBlock.setFieldValue(this.hasStatements_, 'STATEMENTS');\n } else {\n containerBlock.removeInput('STATEMENT_INPUT');\n }\n\n // Initialize procedure's callers with blank IDs.\n Procedures.mutateCallers(this);\n return containerBlock;\n },\n /**\n * Reconfigure this block based on the mutator dialog's components.\n * @param {!Block} containerBlock Root block in mutator.\n * @this {Block}\n */\n compose: function(containerBlock) {\n // Parameter list.\n this.arguments_ = [];\n this.paramIds_ = [];\n this.argumentVarModels_ = [];\n let paramBlock = containerBlock.getInputTargetBlock('STACK');\n while (paramBlock && !paramBlock.isInsertionMarker()) {\n const varName = paramBlock.getFieldValue('NAME');\n this.arguments_.push(varName);\n const variable = this.workspace.getVariable(varName, '');\n this.argumentVarModels_.push(variable);\n\n this.paramIds_.push(paramBlock.id);\n paramBlock =\n paramBlock.nextConnection && paramBlock.nextConnection.targetBlock();\n }\n this.updateParams_();\n Procedures.mutateCallers(this);\n\n // Show/hide the statement input.\n let hasStatements = containerBlock.getFieldValue('STATEMENTS');\n if (hasStatements !== null) {\n hasStatements = hasStatements === 'TRUE';\n if (this.hasStatements_ !== hasStatements) {\n if (hasStatements) {\n this.setStatements_(true);\n // Restore the stack, if one was saved.\n Mutator.reconnect(this.statementConnection_, this, 'STACK');\n this.statementConnection_ = null;\n } else {\n // Save the stack, then disconnect it.\n const stackConnection = this.getInput('STACK').connection;\n this.statementConnection_ = stackConnection.targetConnection;\n if (this.statementConnection_) {\n const stackBlock = stackConnection.targetBlock();\n stackBlock.unplug();\n stackBlock.bumpNeighbours();\n }\n this.setStatements_(false);\n }\n }\n }\n },\n /**\n * Return all variables referenced by this block.\n * @return {!Array<string>} List of variable names.\n * @this {Block}\n */\n getVars: function() {\n return this.arguments_;\n },\n /**\n * Return all variables referenced by this block.\n * @return {!Array<!VariableModel>} List of variable models.\n * @this {Block}\n */\n getVarModels: function() {\n return this.argumentVarModels_;\n },\n /**\n * Notification that a variable is renaming.\n * If the ID matches one of this block's variables, rename it.\n * @param {string} oldId ID of variable to rename.\n * @param {string} newId ID of new variable. May be the same as oldId, but\n * with an updated name. Guaranteed to be the same type as the old\n * variable.\n * @override\n * @this {Block}\n */\n renameVarById: function(oldId, newId) {\n const oldVariable = this.workspace.getVariableById(oldId);\n if (oldVariable.type !== '') {\n // Procedure arguments always have the empty type.\n return;\n }\n const oldName = oldVariable.name;\n const newVar = this.workspace.getVariableById(newId);\n\n let change = false;\n for (let i = 0; i < this.argumentVarModels_.length; i++) {\n if (this.argumentVarModels_[i].getId() === oldId) {\n this.arguments_[i] = newVar.name;\n this.argumentVarModels_[i] = newVar;\n change = true;\n }\n }\n if (change) {\n this.displayRenamedVar_(oldName, newVar.name);\n Procedures.mutateCallers(this);\n }\n },\n /**\n * Notification that a variable is renaming but keeping the same ID. If the\n * variable is in use on this block, rerender to show the new name.\n * @param {!VariableModel} variable The variable being renamed.\n * @package\n * @override\n * @this {Block}\n */\n updateVarName: function(variable) {\n const newName = variable.name;\n let change = false;\n let oldName;\n for (let i = 0; i < this.argumentVarModels_.length; i++) {\n if (this.argumentVarModels_[i].getId() === variable.getId()) {\n oldName = this.arguments_[i];\n this.arguments_[i] = newName;\n change = true;\n }\n }\n if (change) {\n this.displayRenamedVar_(oldName, newName);\n Procedures.mutateCallers(this);\n }\n },\n /**\n * Update the display to reflect a newly renamed argument.\n * @param {string} oldName The old display name of the argument.\n * @param {string} newName The new display name of the argument.\n * @private\n * @this {Block}\n */\n displayRenamedVar_: function(oldName, newName) {\n this.updateParams_();\n // Update the mutator's variables if the mutator is open.\n if (this.mutator && this.mutator.isVisible()) {\n const blocks = this.mutator.workspace_.getAllBlocks(false);\n for (let i = 0, block; (block = blocks[i]); i++) {\n if (block.type === 'procedures_mutatorarg' &&\n Names.equals(oldName, block.getFieldValue('NAME'))) {\n block.setFieldValue(newName, 'NAME');\n }\n }\n }\n },\n /**\n * Add custom menu options to this block's context menu.\n * @param {!Array} options List of menu options to add to.\n * @this {Block}\n */\n customContextMenu: function(options) {\n if (this.isInFlyout) {\n return;\n }\n // Add option to create caller.\n const option = {enabled: true};\n const name = this.getFieldValue('NAME');\n option.text = Msg['PROCEDURES_CREATE_DO'].replace('%1', name);\n const xmlMutation = xmlUtils.createElement('mutation');\n xmlMutation.setAttribute('name', name);\n for (let i = 0; i < this.arguments_.length; i++) {\n const xmlArg = xmlUtils.createElement('arg');\n xmlArg.setAttribute('name', this.arguments_[i]);\n xmlMutation.appendChild(xmlArg);\n }\n const xmlBlock = xmlUtils.createElement('block');\n xmlBlock.setAttribute('type', this.callType_);\n xmlBlock.appendChild(xmlMutation);\n option.callback = ContextMenu.callbackFactory(this, xmlBlock);\n options.push(option);\n\n // Add options to create getters for each parameter.\n if (!this.isCollapsed()) {\n for (let i = 0; i < this.argumentVarModels_.length; i++) {\n const argOption = {enabled: true};\n const argVar = this.argumentVarModels_[i];\n argOption.text =\n Msg['VARIABLES_SET_CREATE_GET'].replace('%1', argVar.name);\n\n const argXmlField = Variables.generateVariableFieldDom(argVar);\n const argXmlBlock = xmlUtils.createElement('block');\n argXmlBlock.setAttribute('type', 'variables_get');\n argXmlBlock.appendChild(argXmlField);\n argOption.callback = ContextMenu.callbackFactory(this, argXmlBlock);\n options.push(argOption);\n }\n }\n },\n};\n\nblocks['procedures_defnoreturn'] = {\n ...PROCEDURE_DEF_COMMON,\n /**\n * Block for defining a procedure with no return value.\n * @this {Block}\n */\n init: function() {\n const initName = Procedures.findLegalName('', this);\n const nameField = new FieldTextInput(initName, Procedures.rename);\n nameField.setSpellcheck(false);\n this.appendDummyInput()\n .appendField(Msg['PROCEDURES_DEFNORETURN_TITLE'])\n .appendField(nameField, 'NAME')\n .appendField('', 'PARAMS');\n this.setMutator(new Mutator(['procedures_mutatorarg'], this));\n if ((this.workspace.options.comments ||\n (this.workspace.options.parentWorkspace &&\n this.workspace.options.parentWorkspace.options.comments)) &&\n Msg['PROCEDURES_DEFNORETURN_COMMENT']) {\n this.setCommentText(Msg['PROCEDURES_DEFNORETURN_COMMENT']);\n }\n this.setStyle('procedure_blocks');\n this.setTooltip(Msg['PROCEDURES_DEFNORETURN_TOOLTIP']);\n this.setHelpUrl(Msg['PROCEDURES_DEFNORETURN_HELPURL']);\n this.arguments_ = [];\n this.argumentVarModels_ = [];\n this.setStatements_(true);\n this.statementConnection_ = null;\n },\n /**\n * Return the signature of this procedure definition.\n * @return {!Array} Tuple containing three elements:\n * - the name of the defined procedure,\n * - a list of all its arguments,\n * - that it DOES NOT have a return value.\n * @this {Block}\n */\n getProcedureDef: function() {\n return [this.getFieldValue('NAME'), this.arguments_, false];\n },\n callType_: 'procedures_callnoreturn',\n};\n\nblocks['procedures_defreturn'] = {\n ...PROCEDURE_DEF_COMMON,\n /**\n * Block for defining a procedure with a return value.\n * @this {Block}\n */\n init: function() {\n const initName = Procedures.findLegalName('', this);\n const nameField = new FieldTextInput(initName, Procedures.rename);\n nameField.setSpellcheck(false);\n this.appendDummyInput()\n .appendField(Msg['PROCEDURES_DEFRETURN_TITLE'])\n .appendField(nameField, 'NAME')\n .appendField('', 'PARAMS');\n this.appendValueInput('RETURN')\n .setAlign(Align.RIGHT)\n .appendField(Msg['PROCEDURES_DEFRETURN_RETURN']);\n this.setMutator(new Mutator(['procedures_mutatorarg'], this));\n if ((this.workspace.options.comments ||\n (this.workspace.options.parentWorkspace &&\n this.workspace.options.parentWorkspace.options.comments)) &&\n Msg['PROCEDURES_DEFRETURN_COMMENT']) {\n this.setCommentText(Msg['PROCEDURES_DEFRETURN_COMMENT']);\n }\n this.setStyle('procedure_blocks');\n this.setTooltip(Msg['PROCEDURES_DEFRETURN_TOOLTIP']);\n this.setHelpUrl(Msg['PROCEDURES_DEFRETURN_HELPURL']);\n this.arguments_ = [];\n this.argumentVarModels_ = [];\n this.setStatements_(true);\n this.statementConnection_ = null;\n },\n /**\n * Return the signature of this procedure definition.\n * @return {!Array} Tuple containing three elements:\n * - the name of the defined procedure,\n * - a list of all its arguments,\n * - that it DOES have a return value.\n * @this {Block}\n */\n getProcedureDef: function() {\n return [this.getFieldValue('NAME'), this.arguments_, true];\n },\n callType_: 'procedures_callreturn',\n};\n\nblocks['procedures_mutatorcontainer'] = {\n /**\n * Mutator block for procedure container.\n * @this {Block}\n */\n init: function() {\n this.appendDummyInput().appendField(\n Msg['PROCEDURES_MUTATORCONTAINER_TITLE']);\n this.appendStatementInput('STACK');\n this.appendDummyInput('STATEMENT_INPUT')\n .appendField(Msg['PROCEDURES_ALLOW_STATEMENTS'])\n .appendField(new FieldCheckbox('TRUE'), 'STATEMENTS');\n this.setStyle('procedure_blocks');\n this.setTooltip(Msg['PROCEDURES_MUTATORCONTAINER_TOOLTIP']);\n this.contextMenu = false;\n },\n};\n\nblocks['procedures_mutatorarg'] = {\n /**\n * Mutator block for procedure argument.\n * @this {Block}\n */\n init: function() {\n const field = new FieldTextInput(Procedures.DEFAULT_ARG, this.validator_);\n // Hack: override showEditor to do just a little bit more work.\n // We don't have a good place to hook into the start of a text edit.\n field.oldShowEditorFn_ = field.showEditor_;\n /**\n * @this {FieldTextInput}\n */\n const newShowEditorFn = function() {\n this.createdVariables_ = [];\n this.oldShowEditorFn_();\n };\n field.showEditor_ = newShowEditorFn;\n\n this.appendDummyInput()\n .appendField(Msg['PROCEDURES_MUTATORARG_TITLE'])\n .appendField(field, 'NAME');\n this.setPreviousStatement(true);\n this.setNextStatement(true);\n this.setStyle('procedure_blocks');\n this.setTooltip(Msg['PROCEDURES_MUTATORARG_TOOLTIP']);\n this.contextMenu = false;\n\n // Create the default variable when we drag the block in from the flyout.\n // Have to do this after installing the field on the block.\n field.onFinishEditing_ = this.deleteIntermediateVars_;\n // Create an empty list so onFinishEditing_ has something to look at, even\n // though the editor was never opened.\n field.createdVariables_ = [];\n field.onFinishEditing_('x');\n },\n\n /**\n * Obtain a valid name for the procedure argument. Create a variable if\n * necessary.\n * Merge runs of whitespace. Strip leading and trailing whitespace.\n * Beyond this, all names are legal.\n * @param {string} varName User-supplied name.\n * @return {?string} Valid name, or null if a name was not specified.\n * @private\n * @this {FieldTextInput}\n */\n validator_: function(varName) {\n const sourceBlock = this.getSourceBlock();\n const outerWs = Mutator.findParentWs(sourceBlock.workspace);\n varName = varName.replace(/[\\s\\xa0]+/g, ' ').replace(/^ | $/g, '');\n if (!varName) {\n return null;\n }\n\n // Prevents duplicate parameter names in functions\n const workspace =\n sourceBlock.workspace.targetWorkspace || sourceBlock.workspace;\n const blocks = workspace.getAllBlocks(false);\n const caselessName = varName.toLowerCase();\n for (let i = 0; i < blocks.length; i++) {\n if (blocks[i].id === this.getSourceBlock().id) {\n continue;\n }\n // Other blocks values may not be set yet when this is loaded.\n const otherVar = blocks[i].getFieldValue('NAME');\n if (otherVar && otherVar.toLowerCase() === caselessName) {\n return null;\n }\n }\n\n // Don't create variables for arg blocks that\n // only exist in the mutator's flyout.\n if (sourceBlock.isInFlyout) {\n return varName;\n }\n\n let model = outerWs.getVariable(varName, '');\n if (model && model.name !== varName) {\n // Rename the variable (case change)\n outerWs.renameVariableById(model.getId(), varName);\n }\n if (!model) {\n model = outerWs.createVariable(varName, '');\n if (model && this.createdVariables_) {\n this.createdVariables_.push(model);\n }\n }\n return varName;\n },\n\n /**\n * Called when focusing away from the text field.\n * Deletes all variables that were created as the user typed their intended\n * variable name.\n * @param {string} newText The new variable name.\n * @private\n * @this {FieldTextInput}\n */\n deleteIntermediateVars_: function(newText) {\n const outerWs = Mutator.findParentWs(this.getSourceBlock().workspace);\n if (!outerWs) {\n return;\n }\n for (let i = 0; i < this.createdVariables_.length; i++) {\n const model = this.createdVariables_[i];\n if (model.name !== newText) {\n outerWs.deleteVariableById(model.getId());\n }\n }\n },\n};\n\n/**\n * Common properties for the procedure_callnoreturn and\n * procedure_callreturn blocks.\n */\nconst PROCEDURE_CALL_COMMON = {\n /**\n * Returns the name of the procedure this block calls.\n * @return {string} Procedure name.\n * @this {Block}\n */\n getProcedureCall: function() {\n // The NAME field is guaranteed to exist, null will never be returned.\n return /** @type {string} */ (this.getFieldValue('NAME'));\n },\n /**\n * Notification that a procedure is renaming.\n * If the name matches this block's procedure, rename it.\n * @param {string} oldName Previous name of procedure.\n * @param {string} newName Renamed procedure.\n * @this {Block}\n */\n renameProcedure: function(oldName, newName) {\n if (Names.equals(oldName, this.getProcedureCall())) {\n this.setFieldValue(newName, 'NAME');\n const baseMsg = this.outputConnection ?\n Msg['PROCEDURES_CALLRETURN_TOOLTIP'] :\n Msg['PROCEDURES_CALLNORETURN_TOOLTIP'];\n this.setTooltip(baseMsg.replace('%1', newName));\n }\n },\n /**\n * Notification that the procedure's parameters have changed.\n * @param {!Array<string>} paramNames New param names, e.g. ['x', 'y', 'z'].\n * @param {!Array<string>} paramIds IDs of params (consistent for each\n * parameter through the life of a mutator, regardless of param renaming),\n * e.g. ['piua', 'f8b_', 'oi.o'].\n * @private\n * @this {Block}\n */\n setProcedureParameters_: function(paramNames, paramIds) {\n // Data structures:\n // this.arguments = ['x', 'y']\n // Existing param names.\n // this.quarkConnections_ {piua: null, f8b_: Connection}\n // Look-up of paramIds to connections plugged into the call block.\n // this.quarkIds_ = ['piua', 'f8b_']\n // Existing param IDs.\n // Note that quarkConnections_ may include IDs that no longer exist, but\n // which might reappear if a param is reattached in the mutator.\n const defBlock =\n Procedures.getDefinition(this.getProcedureCall(), this.workspace);\n const mutatorOpen =\n defBlock && defBlock.mutator && defBlock.mutator.isVisible();\n if (!mutatorOpen) {\n this.quarkConnections_ = {};\n this.quarkIds_ = null;\n } else {\n // fix #6091 - this call could cause an error when outside if-else\n // expanding block while mutating prevents another error (ancient fix)\n this.setCollapsed(false);\n }\n // Test arguments (arrays of strings) for changes. '\\n' is not a valid\n // argument name character, so it is a valid delimiter here.\n if (paramNames.join('\\n') === this.arguments_.join('\\n')) {\n // No change.\n this.quarkIds_ = paramIds;\n return;\n }\n if (paramIds.length !== paramNames.length) {\n throw RangeError('paramNames and paramIds must be the same length.');\n }\n if (!this.quarkIds_) {\n // Initialize tracking for this block.\n this.quarkConnections_ = {};\n this.quarkIds_ = [];\n }\n // Switch off rendering while the block is rebuilt.\n const savedRendered = this.rendered;\n this.rendered = false;\n // Update the quarkConnections_ with existing connections.\n for (let i = 0; i < this.arguments_.length; i++) {\n const input = this.getInput('ARG' + i);\n if (input) {\n const connection = input.connection.targetConnection;\n this.quarkConnections_[this.quarkIds_[i]] = connection;\n if (mutatorOpen && connection &&\n paramIds.indexOf(this.quarkIds_[i]) === -1) {\n // This connection should no longer be attached to this block.\n connection.disconnect();\n connection.getSourceBlock().bumpNeighbours();\n }\n }\n }\n // Rebuild the block's arguments.\n this.arguments_ = [].concat(paramNames);\n // And rebuild the argument model list.\n this.argumentVarModels_ = [];\n for (let i = 0; i < this.arguments_.length; i++) {\n const variable = Variables.getOrCreateVariablePackage(\n this.workspace, null, this.arguments_[i], '');\n this.argumentVarModels_.push(variable);\n }\n\n this.updateShape_();\n this.quarkIds_ = paramIds;\n // Reconnect any child blocks.\n if (this.quarkIds_) {\n for (let i = 0; i < this.arguments_.length; i++) {\n const quarkId = this.quarkIds_[i];\n if (quarkId in this.quarkConnections_) {\n const connection = this.quarkConnections_[quarkId];\n if (!Mutator.reconnect(connection, this, 'ARG' + i)) {\n // Block no longer exists or has been attached elsewhere.\n delete this.quarkConnections_[quarkId];\n }\n }\n }\n }\n // Restore rendering and show the changes.\n this.rendered = savedRendered;\n if (this.rendered) {\n this.render();\n }\n },\n /**\n * Modify this block to have the correct number of arguments.\n * @private\n * @this {Block}\n */\n updateShape_: function() {\n for (let i = 0; i < this.arguments_.length; i++) {\n const argField = this.getField('ARGNAME' + i);\n if (argField) {\n // Ensure argument name is up to date.\n // The argument name field is deterministic based on the mutation,\n // no need to fire a change event.\n Events.disable();\n try {\n argField.setValue(this.arguments_[i]);\n } finally {\n Events.enable();\n }\n } else {\n // Add new input.\n const newField = new FieldLabel(this.arguments_[i]);\n const input = this.appendValueInput('ARG' + i)\n .setAlign(Align.RIGHT)\n .appendField(newField, 'ARGNAME' + i);\n input.init();\n }\n }\n // Remove deleted inputs.\n for (let i = this.arguments_.length; this.getInput('ARG' + i); i++) {\n this.removeInput('ARG' + i);\n }\n // Add 'with:' if there are parameters, remove otherwise.\n const topRow = this.getInput('TOPROW');\n if (topRow) {\n if (this.arguments_.length) {\n if (!this.getField('WITH')) {\n topRow.appendField(Msg['PROCEDURES_CALL_BEFORE_PARAMS'], 'WITH');\n topRow.init();\n }\n } else {\n if (this.getField('WITH')) {\n topRow.removeField('WITH');\n }\n }\n }\n },\n /**\n * Create XML to represent the (non-editable) name and arguments.\n * Backwards compatible serialization implementation.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n container.setAttribute('name', this.getProcedureCall());\n for (let i = 0; i < this.arguments_.length; i++) {\n const parameter = xmlUtils.createElement('arg');\n parameter.setAttribute('name', this.arguments_[i]);\n container.appendChild(parameter);\n }\n return container;\n },\n /**\n * Parse XML to restore the (non-editable) name and parameters.\n * Backwards compatible serialization implementation.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n const name = xmlElement.getAttribute('name');\n this.renameProcedure(this.getProcedureCall(), name);\n const args = [];\n const paramIds = [];\n for (let i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) {\n if (childNode.nodeName.toLowerCase() === 'arg') {\n args.push(childNode.getAttribute('name'));\n paramIds.push(childNode.getAttribute('paramId'));\n }\n }\n this.setProcedureParameters_(args, paramIds);\n },\n /**\n * Returns the state of this block as a JSON serializable object.\n * @return {{name: string, params:(!Array<string>|undefined)}} The state of\n * this block, ie the params and procedure name.\n */\n saveExtraState: function() {\n const state = Object.create(null);\n state['name'] = this.getProcedureCall();\n if (this.arguments_.length) {\n state['params'] = this.arguments_;\n }\n return state;\n },\n /**\n * Applies the given state to this block.\n * @param {*} state The state to apply to this block, ie the params and\n * procedure name.\n */\n loadExtraState: function(state) {\n this.renameProcedure(this.getProcedureCall(), state['name']);\n const params = state['params'];\n if (params) {\n const ids = [];\n ids.length = params.length;\n ids.fill(null);\n this.setProcedureParameters_(params, ids);\n }\n },\n /**\n * Return all variables referenced by this block.\n * @return {!Array<string>} List of variable names.\n * @this {Block}\n */\n getVars: function() {\n return this.arguments_;\n },\n /**\n * Return all variables referenced by this block.\n * @return {!Array<!VariableModel>} List of variable models.\n * @this {Block}\n */\n getVarModels: function() {\n return this.argumentVarModels_;\n },\n /**\n * Procedure calls cannot exist without the corresponding procedure\n * definition. Enforce this link whenever an event is fired.\n * @param {!AbstractEvent} event Change event.\n * @this {Block}\n */\n onchange: function(event) {\n if (!this.workspace || this.workspace.isFlyout) {\n // Block is deleted or is in a flyout.\n return;\n }\n if (!event.recordUndo) {\n // Events not generated by user. Skip handling.\n return;\n }\n if (event.type === Events.BLOCK_CREATE &&\n event.ids.indexOf(this.id) !== -1) {\n // Look for the case where a procedure call was created (usually through\n // paste) and there is no matching definition. In this case, create\n // an empty definition block with the correct signature.\n const name = this.getProcedureCall();\n let def = Procedures.getDefinition(name, this.workspace);\n if (def &&\n (def.type !== this.defType_ ||\n JSON.stringify(def.getVars()) !== JSON.stringify(this.arguments_))) {\n // The signatures don't match.\n def = null;\n }\n if (!def) {\n Events.setGroup(event.group);\n /**\n * Create matching definition block.\n * <xml xmlns=\"https://developers.google.com/blockly/xml\">\n * <block type=\"procedures_defreturn\" x=\"10\" y=\"20\">\n * <mutation name=\"test\">\n * <arg name=\"x\"></arg>\n * </mutation>\n * <field name=\"NAME\">test</field>\n * </block>\n * </xml>\n */\n const xml = xmlUtils.createElement('xml');\n const block = xmlUtils.createElement('block');\n block.setAttribute('type', this.defType_);\n const xy = this.getRelativeToSurfaceXY();\n const x = xy.x + config.snapRadius * (this.RTL ? -1 : 1);\n const y = xy.y + config.snapRadius * 2;\n block.setAttribute('x', x);\n block.setAttribute('y', y);\n const mutation = this.mutationToDom();\n block.appendChild(mutation);\n const field = xmlUtils.createElement('field');\n field.setAttribute('name', 'NAME');\n const callName = this.getProcedureCall();\n const newName = Procedures.findLegalName(callName, this);\n if (callName !== newName) {\n this.renameProcedure(callName, newName);\n }\n field.appendChild(xmlUtils.createTextNode(callName));\n block.appendChild(field);\n xml.appendChild(block);\n Xml.domToWorkspace(xml, this.workspace);\n Events.setGroup(false);\n }\n } else if (event.type === Events.BLOCK_DELETE && event.blockId != this.id) {\n // Look for the case where a procedure definition has been deleted,\n // leaving this block (a procedure call) orphaned. In this case, delete\n // the orphan.\n const name = this.getProcedureCall();\n const def = Procedures.getDefinition(name, this.workspace);\n if (!def) {\n Events.setGroup(event.group);\n this.dispose(true);\n Events.setGroup(false);\n }\n } else if (event.type === Events.CHANGE && event.element === 'disabled') {\n const name = this.getProcedureCall();\n const def = Procedures.getDefinition(name, this.workspace);\n if (def && def.id === event.blockId) {\n // in most cases the old group should be ''\n const oldGroup = Events.getGroup();\n if (oldGroup) {\n // This should only be possible programmatically and may indicate a\n // problem with event grouping. If you see this message please\n // investigate. If the use ends up being valid we may need to reorder\n // events in the undo stack.\n console.log(\n 'Saw an existing group while responding to a definition change');\n }\n Events.setGroup(event.group);\n if (event.newValue) {\n this.previousEnabledState_ = this.isEnabled();\n this.setEnabled(false);\n } else {\n this.setEnabled(this.previousEnabledState_);\n }\n Events.setGroup(oldGroup);\n }\n }\n },\n /**\n * Add menu option to find the definition block for this call.\n * @param {!Array} options List of menu options to add to.\n * @this {Block}\n */\n customContextMenu: function(options) {\n if (!this.workspace.isMovable()) {\n // If we center on the block and the workspace isn't movable we could\n // loose blocks at the edges of the workspace.\n return;\n }\n\n const option = {enabled: true};\n option.text = Msg['PROCEDURES_HIGHLIGHT_DEF'];\n const name = this.getProcedureCall();\n const workspace = this.workspace;\n option.callback = function() {\n const def = Procedures.getDefinition(name, workspace);\n if (def) {\n workspace.centerOnBlock(def.id);\n def.select();\n }\n };\n options.push(option);\n },\n};\n\nblocks['procedures_callnoreturn'] = {\n ...PROCEDURE_CALL_COMMON,\n /**\n * Block for calling a procedure with no return value.\n * @this {Block}\n */\n init: function() {\n this.appendDummyInput('TOPROW').appendField('', 'NAME');\n this.setPreviousStatement(true);\n this.setNextStatement(true);\n this.setStyle('procedure_blocks');\n // Tooltip is set in renameProcedure.\n this.setHelpUrl(Msg['PROCEDURES_CALLNORETURN_HELPURL']);\n this.arguments_ = [];\n this.argumentVarModels_ = [];\n this.quarkConnections_ = {};\n this.quarkIds_ = null;\n this.previousEnabledState_ = true;\n },\n\n defType_: 'procedures_defnoreturn',\n};\n\nblocks['procedures_callreturn'] = {\n ...PROCEDURE_CALL_COMMON,\n /**\n * Block for calling a procedure with a return value.\n * @this {Block}\n */\n init: function() {\n this.appendDummyInput('TOPROW').appendField('', 'NAME');\n this.setOutput(true);\n this.setStyle('procedure_blocks');\n // Tooltip is set in domToMutation.\n this.setHelpUrl(Msg['PROCEDURES_CALLRETURN_HELPURL']);\n this.arguments_ = [];\n this.argumentVarModels_ = [];\n this.quarkConnections_ = {};\n this.quarkIds_ = null;\n this.previousEnabledState_ = true;\n },\n\n defType_: 'procedures_defreturn',\n};\n\nblocks['procedures_ifreturn'] = {\n /**\n * Block for conditionally returning a value from a procedure.\n * @this {Block}\n */\n init: function() {\n this.appendValueInput('CONDITION')\n .setCheck('Boolean')\n .appendField(Msg['CONTROLS_IF_MSG_IF']);\n this.appendValueInput('VALUE').appendField(\n Msg['PROCEDURES_DEFRETURN_RETURN']);\n this.setInputsInline(true);\n this.setPreviousStatement(true);\n this.setNextStatement(true);\n this.setStyle('procedure_blocks');\n this.setTooltip(Msg['PROCEDURES_IFRETURN_TOOLTIP']);\n this.setHelpUrl(Msg['PROCEDURES_IFRETURN_HELPURL']);\n this.hasReturnValue_ = true;\n },\n /**\n * Create XML to represent whether this block has a return value.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n container.setAttribute('value', Number(this.hasReturnValue_));\n return container;\n },\n /**\n * Parse XML to restore whether this block has a return value.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n const value = xmlElement.getAttribute('value');\n this.hasReturnValue_ = (value === '1');\n if (!this.hasReturnValue_) {\n this.removeInput('VALUE');\n this.appendDummyInput('VALUE').appendField(\n Msg['PROCEDURES_DEFRETURN_RETURN']);\n }\n },\n\n // This block does not need JSO serialization hooks (saveExtraState and\n // loadExtraState) because the state of this block is already encoded in the\n // block's position in the workspace.\n // XML hooks are kept for backwards compatibility.\n\n /**\n * Called whenever anything on the workspace changes.\n * Add warning if this flow block is not nested inside a loop.\n * @param {!AbstractEvent} e Move event.\n * @this {Block}\n */\n onchange: function(e) {\n if (this.workspace.isDragging && this.workspace.isDragging() ||\n e.type !== Events.BLOCK_MOVE) {\n return; // Don't change state at the start of a drag.\n }\n let legal = false;\n // Is the block nested in a procedure?\n let block = this;\n do {\n if (this.FUNCTION_TYPES.indexOf(block.type) !== -1) {\n legal = true;\n break;\n }\n block = block.getSurroundParent();\n } while (block);\n if (legal) {\n // If needed, toggle whether this block has a return value.\n if (block.type === 'procedures_defnoreturn' && this.hasReturnValue_) {\n this.removeInput('VALUE');\n this.appendDummyInput('VALUE').appendField(\n Msg['PROCEDURES_DEFRETURN_RETURN']);\n this.hasReturnValue_ = false;\n } else if (\n block.type === 'procedures_defreturn' && !this.hasReturnValue_) {\n this.removeInput('VALUE');\n this.appendValueInput('VALUE').appendField(\n Msg['PROCEDURES_DEFRETURN_RETURN']);\n this.hasReturnValue_ = true;\n }\n this.setWarningText(null);\n } else {\n this.setWarningText(Msg['PROCEDURES_IFRETURN_WARNING']);\n }\n if (!this.isInFlyout) {\n const group = Events.getGroup();\n // Makes it so the move and the disable event get undone together.\n Events.setGroup(e.group);\n this.setEnabled(legal);\n Events.setGroup(group);\n }\n },\n /**\n * List of block types that are functions and thus do not need warnings.\n * To add a new function type add this to your code:\n * Blocks['procedures_ifreturn'].FUNCTION_TYPES.push('custom_func');\n */\n FUNCTION_TYPES: ['procedures_defnoreturn', 'procedures_defreturn'],\n};\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Math blocks for Blockly.\n * @suppress {checkTypes}\n */\n'use strict';\n\ngoog.module('Blockly.libraryBlocks.math');\n\nconst Extensions = goog.require('Blockly.Extensions');\n// N.B.: Blockly.FieldDropdown needed for type AND side-effects.\n/* eslint-disable-next-line no-unused-vars */\nconst FieldDropdown = goog.require('Blockly.FieldDropdown');\nconst xmlUtils = goog.require('Blockly.utils.xml');\n/* eslint-disable-next-line no-unused-vars */\nconst {Block} = goog.requireType('Blockly.Block');\n// const {BlockDefinition} = goog.requireType('Blockly.blocks');\n// TODO (6248): Properly import the BlockDefinition type.\n/* eslint-disable-next-line no-unused-vars */\nconst BlockDefinition = Object;\nconst {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldLabel');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldNumber');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldVariable');\n\n\n/**\n * A dictionary of the block definitions provided by this module.\n * @type {!Object<string, !BlockDefinition>}\n */\nconst blocks = createBlockDefinitionsFromJsonArray([\n // Block for numeric value.\n {\n 'type': 'math_number',\n 'message0': '%1',\n 'args0': [{\n 'type': 'field_number',\n 'name': 'NUM',\n 'value': 0,\n }],\n 'output': 'Number',\n 'helpUrl': '%{BKY_MATH_NUMBER_HELPURL}',\n 'style': 'math_blocks',\n 'tooltip': '%{BKY_MATH_NUMBER_TOOLTIP}',\n 'extensions': ['parent_tooltip_when_inline'],\n },\n\n // Block for basic arithmetic operator.\n {\n 'type': 'math_arithmetic',\n 'message0': '%1 %2 %3',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'A',\n 'check': 'Number',\n },\n {\n 'type': 'field_dropdown',\n 'name': 'OP',\n 'options': [\n ['%{BKY_MATH_ADDITION_SYMBOL}', 'ADD'],\n ['%{BKY_MATH_SUBTRACTION_SYMBOL}', 'MINUS'],\n ['%{BKY_MATH_MULTIPLICATION_SYMBOL}', 'MULTIPLY'],\n ['%{BKY_MATH_DIVISION_SYMBOL}', 'DIVIDE'],\n ['%{BKY_MATH_POWER_SYMBOL}', 'POWER'],\n ],\n },\n {\n 'type': 'input_value',\n 'name': 'B',\n 'check': 'Number',\n },\n ],\n 'inputsInline': true,\n 'output': 'Number',\n 'style': 'math_blocks',\n 'helpUrl': '%{BKY_MATH_ARITHMETIC_HELPURL}',\n 'extensions': ['math_op_tooltip'],\n },\n\n // Block for advanced math operators with single operand.\n {\n 'type': 'math_single',\n 'message0': '%1 %2',\n 'args0': [\n {\n 'type': 'field_dropdown',\n 'name': 'OP',\n 'options': [\n ['%{BKY_MATH_SINGLE_OP_ROOT}', 'ROOT'],\n ['%{BKY_MATH_SINGLE_OP_ABSOLUTE}', 'ABS'],\n ['-', 'NEG'],\n ['ln', 'LN'],\n ['log10', 'LOG10'],\n ['e^', 'EXP'],\n ['10^', 'POW10'],\n ],\n },\n {\n 'type': 'input_value',\n 'name': 'NUM',\n 'check': 'Number',\n },\n ],\n 'output': 'Number',\n 'style': 'math_blocks',\n 'helpUrl': '%{BKY_MATH_SINGLE_HELPURL}',\n 'extensions': ['math_op_tooltip'],\n },\n\n // Block for trigonometry operators.\n {\n 'type': 'math_trig',\n 'message0': '%1 %2',\n 'args0': [\n {\n 'type': 'field_dropdown',\n 'name': 'OP',\n 'options': [\n ['%{BKY_MATH_TRIG_SIN}', 'SIN'],\n ['%{BKY_MATH_TRIG_COS}', 'COS'],\n ['%{BKY_MATH_TRIG_TAN}', 'TAN'],\n ['%{BKY_MATH_TRIG_ASIN}', 'ASIN'],\n ['%{BKY_MATH_TRIG_ACOS}', 'ACOS'],\n ['%{BKY_MATH_TRIG_ATAN}', 'ATAN'],\n ],\n },\n {\n 'type': 'input_value',\n 'name': 'NUM',\n 'check': 'Number',\n },\n ],\n 'output': 'Number',\n 'style': 'math_blocks',\n 'helpUrl': '%{BKY_MATH_TRIG_HELPURL}',\n 'extensions': ['math_op_tooltip'],\n },\n\n // Block for constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY.\n {\n 'type': 'math_constant',\n 'message0': '%1',\n 'args0': [\n {\n 'type': 'field_dropdown',\n 'name': 'CONSTANT',\n 'options': [\n ['\\u03c0', 'PI'],\n ['e', 'E'],\n ['\\u03c6', 'GOLDEN_RATIO'],\n ['sqrt(2)', 'SQRT2'],\n ['sqrt(\\u00bd)', 'SQRT1_2'],\n ['\\u221e', 'INFINITY'],\n ],\n },\n ],\n 'output': 'Number',\n 'style': 'math_blocks',\n 'tooltip': '%{BKY_MATH_CONSTANT_TOOLTIP}',\n 'helpUrl': '%{BKY_MATH_CONSTANT_HELPURL}',\n },\n\n // Block for checking if a number is even, odd, prime, whole, positive,\n // negative or if it is divisible by certain number.\n {\n 'type': 'math_number_property',\n 'message0': '%1 %2',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'NUMBER_TO_CHECK',\n 'check': 'Number',\n },\n {\n 'type': 'field_dropdown',\n 'name': 'PROPERTY',\n 'options': [\n ['%{BKY_MATH_IS_EVEN}', 'EVEN'],\n ['%{BKY_MATH_IS_ODD}', 'ODD'],\n ['%{BKY_MATH_IS_PRIME}', 'PRIME'],\n ['%{BKY_MATH_IS_WHOLE}', 'WHOLE'],\n ['%{BKY_MATH_IS_POSITIVE}', 'POSITIVE'],\n ['%{BKY_MATH_IS_NEGATIVE}', 'NEGATIVE'],\n ['%{BKY_MATH_IS_DIVISIBLE_BY}', 'DIVISIBLE_BY'],\n ],\n },\n ],\n 'inputsInline': true,\n 'output': 'Boolean',\n 'style': 'math_blocks',\n 'tooltip': '%{BKY_MATH_IS_TOOLTIP}',\n 'mutator': 'math_is_divisibleby_mutator',\n },\n\n // Block for adding to a variable in place.\n {\n 'type': 'math_change',\n 'message0': '%{BKY_MATH_CHANGE_TITLE}',\n 'args0': [\n {\n 'type': 'field_variable',\n 'name': 'VAR',\n 'variable': '%{BKY_MATH_CHANGE_TITLE_ITEM}',\n },\n {\n 'type': 'input_value',\n 'name': 'DELTA',\n 'check': 'Number',\n },\n ],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'variable_blocks',\n 'helpUrl': '%{BKY_MATH_CHANGE_HELPURL}',\n 'extensions': ['math_change_tooltip'],\n },\n\n // Block for rounding functions.\n {\n 'type': 'math_round',\n 'message0': '%1 %2',\n 'args0': [\n {\n 'type': 'field_dropdown',\n 'name': 'OP',\n 'options': [\n ['%{BKY_MATH_ROUND_OPERATOR_ROUND}', 'ROUND'],\n ['%{BKY_MATH_ROUND_OPERATOR_ROUNDUP}', 'ROUNDUP'],\n ['%{BKY_MATH_ROUND_OPERATOR_ROUNDDOWN}', 'ROUNDDOWN'],\n ],\n },\n {\n 'type': 'input_value',\n 'name': 'NUM',\n 'check': 'Number',\n },\n ],\n 'output': 'Number',\n 'style': 'math_blocks',\n 'helpUrl': '%{BKY_MATH_ROUND_HELPURL}',\n 'tooltip': '%{BKY_MATH_ROUND_TOOLTIP}',\n },\n\n // Block for evaluating a list of numbers to return sum, average, min, max,\n // etc. Some functions also work on text (min, max, mode, median).\n {\n 'type': 'math_on_list',\n 'message0': '%1 %2',\n 'args0': [\n {\n 'type': 'field_dropdown',\n 'name': 'OP',\n 'options': [\n ['%{BKY_MATH_ONLIST_OPERATOR_SUM}', 'SUM'],\n ['%{BKY_MATH_ONLIST_OPERATOR_MIN}', 'MIN'],\n ['%{BKY_MATH_ONLIST_OPERATOR_MAX}', 'MAX'],\n ['%{BKY_MATH_ONLIST_OPERATOR_AVERAGE}', 'AVERAGE'],\n ['%{BKY_MATH_ONLIST_OPERATOR_MEDIAN}', 'MEDIAN'],\n ['%{BKY_MATH_ONLIST_OPERATOR_MODE}', 'MODE'],\n ['%{BKY_MATH_ONLIST_OPERATOR_STD_DEV}', 'STD_DEV'],\n ['%{BKY_MATH_ONLIST_OPERATOR_RANDOM}', 'RANDOM'],\n ],\n },\n {\n 'type': 'input_value',\n 'name': 'LIST',\n 'check': 'Array',\n },\n ],\n 'output': 'Number',\n 'style': 'math_blocks',\n 'helpUrl': '%{BKY_MATH_ONLIST_HELPURL}',\n 'mutator': 'math_modes_of_list_mutator',\n 'extensions': ['math_op_tooltip'],\n },\n\n // Block for remainder of a division.\n {\n 'type': 'math_modulo',\n 'message0': '%{BKY_MATH_MODULO_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'DIVIDEND',\n 'check': 'Number',\n },\n {\n 'type': 'input_value',\n 'name': 'DIVISOR',\n 'check': 'Number',\n },\n ],\n 'inputsInline': true,\n 'output': 'Number',\n 'style': 'math_blocks',\n 'tooltip': '%{BKY_MATH_MODULO_TOOLTIP}',\n 'helpUrl': '%{BKY_MATH_MODULO_HELPURL}',\n },\n\n // Block for constraining a number between two limits.\n {\n 'type': 'math_constrain',\n 'message0': '%{BKY_MATH_CONSTRAIN_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'VALUE',\n 'check': 'Number',\n },\n {\n 'type': 'input_value',\n 'name': 'LOW',\n 'check': 'Number',\n },\n {\n 'type': 'input_value',\n 'name': 'HIGH',\n 'check': 'Number',\n },\n ],\n 'inputsInline': true,\n 'output': 'Number',\n 'style': 'math_blocks',\n 'tooltip': '%{BKY_MATH_CONSTRAIN_TOOLTIP}',\n 'helpUrl': '%{BKY_MATH_CONSTRAIN_HELPURL}',\n },\n\n // Block for random integer between [X] and [Y].\n {\n 'type': 'math_random_int',\n 'message0': '%{BKY_MATH_RANDOM_INT_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'FROM',\n 'check': 'Number',\n },\n {\n 'type': 'input_value',\n 'name': 'TO',\n 'check': 'Number',\n },\n ],\n 'inputsInline': true,\n 'output': 'Number',\n 'style': 'math_blocks',\n 'tooltip': '%{BKY_MATH_RANDOM_INT_TOOLTIP}',\n 'helpUrl': '%{BKY_MATH_RANDOM_INT_HELPURL}',\n },\n\n // Block for random integer between [X] and [Y].\n {\n 'type': 'math_random_float',\n 'message0': '%{BKY_MATH_RANDOM_FLOAT_TITLE_RANDOM}',\n 'output': 'Number',\n 'style': 'math_blocks',\n 'tooltip': '%{BKY_MATH_RANDOM_FLOAT_TOOLTIP}',\n 'helpUrl': '%{BKY_MATH_RANDOM_FLOAT_HELPURL}',\n },\n\n // Block for calculating atan2 of [X] and [Y].\n {\n 'type': 'math_atan2',\n 'message0': '%{BKY_MATH_ATAN2_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'X',\n 'check': 'Number',\n },\n {\n 'type': 'input_value',\n 'name': 'Y',\n 'check': 'Number',\n },\n ],\n 'inputsInline': true,\n 'output': 'Number',\n 'style': 'math_blocks',\n 'tooltip': '%{BKY_MATH_ATAN2_TOOLTIP}',\n 'helpUrl': '%{BKY_MATH_ATAN2_HELPURL}',\n },\n]);\nexports.blocks = blocks;\n\n/**\n * Mapping of math block OP value to tooltip message for blocks\n * math_arithmetic, math_simple, math_trig, and math_on_lists.\n * @see {Extensions#buildTooltipForDropdown}\n * @package\n * @readonly\n */\nconst TOOLTIPS_BY_OP = {\n // math_arithmetic\n 'ADD': '%{BKY_MATH_ARITHMETIC_TOOLTIP_ADD}',\n 'MINUS': '%{BKY_MATH_ARITHMETIC_TOOLTIP_MINUS}',\n 'MULTIPLY': '%{BKY_MATH_ARITHMETIC_TOOLTIP_MULTIPLY}',\n 'DIVIDE': '%{BKY_MATH_ARITHMETIC_TOOLTIP_DIVIDE}',\n 'POWER': '%{BKY_MATH_ARITHMETIC_TOOLTIP_POWER}',\n\n // math_simple\n 'ROOT': '%{BKY_MATH_SINGLE_TOOLTIP_ROOT}',\n 'ABS': '%{BKY_MATH_SINGLE_TOOLTIP_ABS}',\n 'NEG': '%{BKY_MATH_SINGLE_TOOLTIP_NEG}',\n 'LN': '%{BKY_MATH_SINGLE_TOOLTIP_LN}',\n 'LOG10': '%{BKY_MATH_SINGLE_TOOLTIP_LOG10}',\n 'EXP': '%{BKY_MATH_SINGLE_TOOLTIP_EXP}',\n 'POW10': '%{BKY_MATH_SINGLE_TOOLTIP_POW10}',\n\n // math_trig\n 'SIN': '%{BKY_MATH_TRIG_TOOLTIP_SIN}',\n 'COS': '%{BKY_MATH_TRIG_TOOLTIP_COS}',\n 'TAN': '%{BKY_MATH_TRIG_TOOLTIP_TAN}',\n 'ASIN': '%{BKY_MATH_TRIG_TOOLTIP_ASIN}',\n 'ACOS': '%{BKY_MATH_TRIG_TOOLTIP_ACOS}',\n 'ATAN': '%{BKY_MATH_TRIG_TOOLTIP_ATAN}',\n\n // math_on_lists\n 'SUM': '%{BKY_MATH_ONLIST_TOOLTIP_SUM}',\n 'MIN': '%{BKY_MATH_ONLIST_TOOLTIP_MIN}',\n 'MAX': '%{BKY_MATH_ONLIST_TOOLTIP_MAX}',\n 'AVERAGE': '%{BKY_MATH_ONLIST_TOOLTIP_AVERAGE}',\n 'MEDIAN': '%{BKY_MATH_ONLIST_TOOLTIP_MEDIAN}',\n 'MODE': '%{BKY_MATH_ONLIST_TOOLTIP_MODE}',\n 'STD_DEV': '%{BKY_MATH_ONLIST_TOOLTIP_STD_DEV}',\n 'RANDOM': '%{BKY_MATH_ONLIST_TOOLTIP_RANDOM}',\n};\n\nExtensions.register(\n 'math_op_tooltip',\n Extensions.buildTooltipForDropdown('OP', TOOLTIPS_BY_OP));\n\n\n/**\n * Mixin for mutator functions in the 'math_is_divisibleby_mutator'\n * extension.\n * @mixin\n * @augments Block\n * @package\n */\nconst IS_DIVISIBLEBY_MUTATOR_MIXIN = {\n /**\n * Create XML to represent whether the 'divisorInput' should be present.\n * Backwards compatible serialization implementation.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n const divisorInput = (this.getFieldValue('PROPERTY') === 'DIVISIBLE_BY');\n container.setAttribute('divisor_input', divisorInput);\n return container;\n },\n /**\n * Parse XML to restore the 'divisorInput'.\n * Backwards compatible serialization implementation.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n const divisorInput = (xmlElement.getAttribute('divisor_input') === 'true');\n this.updateShape_(divisorInput);\n },\n\n // This block does not need JSO serialization hooks (saveExtraState and\n // loadExtraState) because the state of this object is already encoded in the\n // dropdown values.\n // XML hooks are kept for backwards compatibility.\n\n /**\n * Modify this block to have (or not have) an input for 'is divisible by'.\n * @param {boolean} divisorInput True if this block has a divisor input.\n * @private\n * @this {Block}\n */\n updateShape_: function(divisorInput) {\n // Add or remove a Value Input.\n const inputExists = this.getInput('DIVISOR');\n if (divisorInput) {\n if (!inputExists) {\n this.appendValueInput('DIVISOR').setCheck('Number');\n }\n } else if (inputExists) {\n this.removeInput('DIVISOR');\n }\n },\n};\n\n/**\n * 'math_is_divisibleby_mutator' extension to the 'math_property' block that\n * can update the block shape (add/remove divisor input) based on whether\n * property is \"divisible by\".\n * @this {Block}\n * @package\n */\nconst IS_DIVISIBLE_MUTATOR_EXTENSION = function() {\n this.getField('PROPERTY')\n .setValidator(\n /**\n * @this {FieldDropdown}\n * @param {*} option The selected dropdown option.\n */\n function(option) {\n const divisorInput = (option === 'DIVISIBLE_BY');\n this.getSourceBlock().updateShape_(divisorInput);\n });\n};\n\nExtensions.registerMutator(\n 'math_is_divisibleby_mutator', IS_DIVISIBLEBY_MUTATOR_MIXIN,\n IS_DIVISIBLE_MUTATOR_EXTENSION);\n\n// Update the tooltip of 'math_change' block to reference the variable.\nExtensions.register(\n 'math_change_tooltip',\n Extensions.buildTooltipWithFieldText('%{BKY_MATH_CHANGE_TOOLTIP}', 'VAR'));\n\n/**\n * Mixin with mutator methods to support alternate output based if the\n * 'math_on_list' block uses the 'MODE' operation.\n * @mixin\n * @augments Block\n * @package\n * @readonly\n */\nconst LIST_MODES_MUTATOR_MIXIN = {\n /**\n * Modify this block to have the correct output type.\n * @param {string} newOp Either 'MODE' or some op than returns a number.\n * @private\n * @this {Block}\n */\n updateType_: function(newOp) {\n if (newOp === 'MODE') {\n this.outputConnection.setCheck('Array');\n } else {\n this.outputConnection.setCheck('Number');\n }\n },\n /**\n * Create XML to represent the output type.\n * Backwards compatible serialization implementation.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n container.setAttribute('op', this.getFieldValue('OP'));\n return container;\n },\n /**\n * Parse XML to restore the output type.\n * Backwards compatible serialization implementation.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n this.updateType_(xmlElement.getAttribute('op'));\n },\n\n // This block does not need JSO serialization hooks (saveExtraState and\n // loadExtraState) because the state of this object is already encoded in the\n // dropdown values.\n // XML hooks are kept for backwards compatibility.\n};\n\n/**\n * Extension to 'math_on_list' blocks that allows support of\n * modes operation (outputs a list of numbers).\n * @this {Block}\n * @package\n */\nconst LIST_MODES_MUTATOR_EXTENSION = function() {\n this.getField('OP').setValidator(function(newOp) {\n this.updateType_(newOp);\n }.bind(this));\n};\n\nExtensions.registerMutator(\n 'math_modes_of_list_mutator', LIST_MODES_MUTATOR_MIXIN,\n LIST_MODES_MUTATOR_EXTENSION);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Loop blocks for Blockly.\n * @suppress {checkTypes}\n */\n'use strict';\n\ngoog.module('Blockly.libraryBlocks.loops');\n\n/* eslint-disable-next-line no-unused-vars */\nconst AbstractEvent = goog.requireType('Blockly.Events.Abstract');\nconst ContextMenu = goog.require('Blockly.ContextMenu');\nconst Events = goog.require('Blockly.Events');\nconst Extensions = goog.require('Blockly.Extensions');\nconst Variables = goog.require('Blockly.Variables');\nconst xmlUtils = goog.require('Blockly.utils.xml');\n/* eslint-disable-next-line no-unused-vars */\nconst {Block} = goog.requireType('Blockly.Block');\n// const {BlockDefinition} = goog.requireType('Blockly.blocks');\n// TODO (6248): Properly import the BlockDefinition type.\n/* eslint-disable-next-line no-unused-vars */\nconst BlockDefinition = Object;\nconst {Msg} = goog.require('Blockly.Msg');\nconst {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldDropdown');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldLabel');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldNumber');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldVariable');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.Warning');\n\n\n/**\n * A dictionary of the block definitions provided by this module.\n * @type {!Object<string, !BlockDefinition>}\n */\nconst blocks = createBlockDefinitionsFromJsonArray([\n // Block for repeat n times (external number).\n {\n 'type': 'controls_repeat_ext',\n 'message0': '%{BKY_CONTROLS_REPEAT_TITLE}',\n 'args0': [{\n 'type': 'input_value',\n 'name': 'TIMES',\n 'check': 'Number',\n }],\n 'message1': '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',\n 'args1': [{\n 'type': 'input_statement',\n 'name': 'DO',\n }],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'loop_blocks',\n 'tooltip': '%{BKY_CONTROLS_REPEAT_TOOLTIP}',\n 'helpUrl': '%{BKY_CONTROLS_REPEAT_HELPURL}',\n },\n // Block for repeat n times (internal number).\n // The 'controls_repeat_ext' block is preferred as it is more flexible.\n {\n 'type': 'controls_repeat',\n 'message0': '%{BKY_CONTROLS_REPEAT_TITLE}',\n 'args0': [{\n 'type': 'field_number',\n 'name': 'TIMES',\n 'value': 10,\n 'min': 0,\n 'precision': 1,\n }],\n 'message1': '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',\n 'args1': [{\n 'type': 'input_statement',\n 'name': 'DO',\n }],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'loop_blocks',\n 'tooltip': '%{BKY_CONTROLS_REPEAT_TOOLTIP}',\n 'helpUrl': '%{BKY_CONTROLS_REPEAT_HELPURL}',\n },\n // Block for 'do while/until' loop.\n {\n 'type': 'controls_whileUntil',\n 'message0': '%1 %2',\n 'args0': [\n {\n 'type': 'field_dropdown',\n 'name': 'MODE',\n 'options': [\n ['%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_WHILE}', 'WHILE'],\n ['%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL}', 'UNTIL'],\n ],\n },\n {\n 'type': 'input_value',\n 'name': 'BOOL',\n 'check': 'Boolean',\n },\n ],\n 'message1': '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',\n 'args1': [{\n 'type': 'input_statement',\n 'name': 'DO',\n }],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'loop_blocks',\n 'helpUrl': '%{BKY_CONTROLS_WHILEUNTIL_HELPURL}',\n 'extensions': ['controls_whileUntil_tooltip'],\n },\n // Block for 'for' loop.\n {\n 'type': 'controls_for',\n 'message0': '%{BKY_CONTROLS_FOR_TITLE}',\n 'args0': [\n {\n 'type': 'field_variable',\n 'name': 'VAR',\n 'variable': null,\n },\n {\n 'type': 'input_value',\n 'name': 'FROM',\n 'check': 'Number',\n 'align': 'RIGHT',\n },\n {\n 'type': 'input_value',\n 'name': 'TO',\n 'check': 'Number',\n 'align': 'RIGHT',\n },\n {\n 'type': 'input_value',\n 'name': 'BY',\n 'check': 'Number',\n 'align': 'RIGHT',\n },\n ],\n 'message1': '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',\n 'args1': [{\n 'type': 'input_statement',\n 'name': 'DO',\n }],\n 'inputsInline': true,\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'loop_blocks',\n 'helpUrl': '%{BKY_CONTROLS_FOR_HELPURL}',\n 'extensions': [\n 'contextMenu_newGetVariableBlock',\n 'controls_for_tooltip',\n ],\n },\n // Block for 'for each' loop.\n {\n 'type': 'controls_forEach',\n 'message0': '%{BKY_CONTROLS_FOREACH_TITLE}',\n 'args0': [\n {\n 'type': 'field_variable',\n 'name': 'VAR',\n 'variable': null,\n },\n {\n 'type': 'input_value',\n 'name': 'LIST',\n 'check': 'Array',\n },\n ],\n 'message1': '%{BKY_CONTROLS_REPEAT_INPUT_DO} %1',\n 'args1': [{\n 'type': 'input_statement',\n 'name': 'DO',\n }],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'loop_blocks',\n 'helpUrl': '%{BKY_CONTROLS_FOREACH_HELPURL}',\n 'extensions': [\n 'contextMenu_newGetVariableBlock',\n 'controls_forEach_tooltip',\n ],\n },\n // Block for flow statements: continue, break.\n {\n 'type': 'controls_flow_statements',\n 'message0': '%1',\n 'args0': [{\n 'type': 'field_dropdown',\n 'name': 'FLOW',\n 'options': [\n ['%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK}', 'BREAK'],\n ['%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE}', 'CONTINUE'],\n ],\n }],\n 'previousStatement': null,\n 'style': 'loop_blocks',\n 'helpUrl': '%{BKY_CONTROLS_FLOW_STATEMENTS_HELPURL}',\n 'suppressPrefixSuffix': true,\n 'extensions': [\n 'controls_flow_tooltip',\n 'controls_flow_in_loop_check',\n ],\n },\n]);\nexports.blocks = blocks;\n\n/**\n * Tooltips for the 'controls_whileUntil' block, keyed by MODE value.\n * @see {Extensions#buildTooltipForDropdown}\n * @readonly\n */\nconst WHILE_UNTIL_TOOLTIPS = {\n 'WHILE': '%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_WHILE}',\n 'UNTIL': '%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL}',\n};\n\nExtensions.register(\n 'controls_whileUntil_tooltip',\n Extensions.buildTooltipForDropdown('MODE', WHILE_UNTIL_TOOLTIPS));\n\n/**\n * Tooltips for the 'controls_flow_statements' block, keyed by FLOW value.\n * @see {Extensions#buildTooltipForDropdown}\n * @readonly\n */\nconst BREAK_CONTINUE_TOOLTIPS = {\n 'BREAK': '%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK}',\n 'CONTINUE': '%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE}',\n};\n\nExtensions.register(\n 'controls_flow_tooltip',\n Extensions.buildTooltipForDropdown('FLOW', BREAK_CONTINUE_TOOLTIPS));\n\n/**\n * Mixin to add a context menu item to create a 'variables_get' block.\n * Used by blocks 'controls_for' and 'controls_forEach'.\n * @mixin\n * @augments Block\n * @package\n * @readonly\n */\nconst CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN = {\n /**\n * Add context menu option to create getter block for the loop's variable.\n * (customContextMenu support limited to web BlockSvg.)\n * @param {!Array} options List of menu options to add to.\n * @this {Block}\n */\n customContextMenu: function(options) {\n if (this.isInFlyout) {\n return;\n }\n const variable = this.getField('VAR').getVariable();\n const varName = variable.name;\n if (!this.isCollapsed() && varName !== null) {\n const option = {enabled: true};\n option.text = Msg['VARIABLES_SET_CREATE_GET'].replace('%1', varName);\n const xmlField = Variables.generateVariableFieldDom(variable);\n const xmlBlock = xmlUtils.createElement('block');\n xmlBlock.setAttribute('type', 'variables_get');\n xmlBlock.appendChild(xmlField);\n option.callback = ContextMenu.callbackFactory(this, xmlBlock);\n options.push(option);\n }\n },\n};\n\nExtensions.registerMixin(\n 'contextMenu_newGetVariableBlock',\n CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN);\n\nExtensions.register(\n 'controls_for_tooltip',\n Extensions.buildTooltipWithFieldText('%{BKY_CONTROLS_FOR_TOOLTIP}', 'VAR'));\n\nExtensions.register(\n 'controls_forEach_tooltip',\n Extensions.buildTooltipWithFieldText(\n '%{BKY_CONTROLS_FOREACH_TOOLTIP}', 'VAR'));\n\n/**\n * List of block types that are loops and thus do not need warnings.\n * To add a new loop type add this to your code:\n *\n * // If using the Blockly npm package and es6 import syntax:\n * import {loops} from 'blockly/blocks';\n * loops.loopTypes.add('custom_loop');\n *\n * // Else if using Closure Compiler and goog.modules:\n * const {loopTypes} = goog.require('Blockly.libraryBlocks.loops');\n * loopTypes.add('custom_loop');\n *\n * // Else if using blockly_compressed + blockss_compressed.js in browser:\n * Blockly.libraryBlocks.loopTypes.add('custom_loop');\n *\n * @type {!Set<string>}\n */\nconst loopTypes = new Set([\n 'controls_repeat',\n 'controls_repeat_ext',\n 'controls_forEach',\n 'controls_for',\n 'controls_whileUntil',\n]);\nexports.loopTypes = loopTypes;\n\n/**\n * This mixin adds a check to make sure the 'controls_flow_statements' block\n * is contained in a loop. Otherwise a warning is added to the block.\n * @mixin\n * @augments Block\n * @public\n * @readonly\n */\nconst CONTROL_FLOW_IN_LOOP_CHECK_MIXIN = {\n /**\n * Is this block enclosed (at any level) by a loop?\n * @return {Block} The nearest surrounding loop, or null if none.\n * @this {Block}\n */\n getSurroundLoop: function() {\n let block = this;\n do {\n if (loopTypes.has(block.type)) {\n return block;\n }\n block = block.getSurroundParent();\n } while (block);\n return null;\n },\n\n /**\n * Called whenever anything on the workspace changes.\n * Add warning if this flow block is not nested inside a loop.\n * @param {!AbstractEvent} e Move event.\n * @this {Block}\n */\n onchange: function(e) {\n // Don't change state if:\n // * It's at the start of a drag.\n // * It's not a move event.\n if (!this.workspace.isDragging || this.workspace.isDragging() ||\n e.type !== Events.BLOCK_MOVE) {\n return;\n }\n const enabled = this.getSurroundLoop(this);\n this.setWarningText(\n enabled ? null : Msg['CONTROLS_FLOW_STATEMENTS_WARNING']);\n if (!this.isInFlyout) {\n const group = Events.getGroup();\n // Makes it so the move and the disable event get undone together.\n Events.setGroup(e.group);\n this.setEnabled(enabled);\n Events.setGroup(group);\n }\n },\n};\n\nExtensions.registerMixin(\n 'controls_flow_in_loop_check', CONTROL_FLOW_IN_LOOP_CHECK_MIXIN);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Logic blocks for Blockly.\n * @suppress {checkTypes}\n */\n'use strict';\n\ngoog.module('Blockly.libraryBlocks.logic');\n\n/* eslint-disable-next-line no-unused-vars */\nconst AbstractEvent = goog.requireType('Blockly.Events.Abstract');\nconst Events = goog.require('Blockly.Events');\nconst Extensions = goog.require('Blockly.Extensions');\nconst xmlUtils = goog.require('Blockly.utils.xml');\n/* eslint-disable-next-line no-unused-vars */\nconst {Block} = goog.requireType('Blockly.Block');\n// const {BlockDefinition} = goog.requireType('Blockly.blocks');\n// TODO (6248): Properly import the BlockDefinition type.\n/* eslint-disable-next-line no-unused-vars */\nconst BlockDefinition = Object;\nconst {Msg} = goog.require('Blockly.Msg');\nconst {Mutator} = goog.require('Blockly.Mutator');\n/* eslint-disable-next-line no-unused-vars */\nconst {RenderedConnection} = goog.requireType('Blockly.RenderedConnection');\n/* eslint-disable-next-line no-unused-vars */\nconst {Workspace} = goog.requireType('Blockly.Workspace');\nconst {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldDropdown');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldLabel');\n\n\n/**\n * A dictionary of the block definitions provided by this module.\n * @type {!Object<string, !BlockDefinition>}\n */\nconst blocks = createBlockDefinitionsFromJsonArray([\n // Block for boolean data type: true and false.\n {\n 'type': 'logic_boolean',\n 'message0': '%1',\n 'args0': [\n {\n 'type': 'field_dropdown',\n 'name': 'BOOL',\n 'options': [\n ['%{BKY_LOGIC_BOOLEAN_TRUE}', 'TRUE'],\n ['%{BKY_LOGIC_BOOLEAN_FALSE}', 'FALSE'],\n ],\n },\n ],\n 'output': 'Boolean',\n 'style': 'logic_blocks',\n 'tooltip': '%{BKY_LOGIC_BOOLEAN_TOOLTIP}',\n 'helpUrl': '%{BKY_LOGIC_BOOLEAN_HELPURL}',\n },\n // Block for if/elseif/else condition.\n {\n 'type': 'controls_if',\n 'message0': '%{BKY_CONTROLS_IF_MSG_IF} %1',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'IF0',\n 'check': 'Boolean',\n },\n ],\n 'message1': '%{BKY_CONTROLS_IF_MSG_THEN} %1',\n 'args1': [\n {\n 'type': 'input_statement',\n 'name': 'DO0',\n },\n ],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'logic_blocks',\n 'helpUrl': '%{BKY_CONTROLS_IF_HELPURL}',\n 'suppressPrefixSuffix': true,\n 'mutator': 'controls_if_mutator',\n 'extensions': ['controls_if_tooltip'],\n },\n // If/else block that does not use a mutator.\n {\n 'type': 'controls_ifelse',\n 'message0': '%{BKY_CONTROLS_IF_MSG_IF} %1',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'IF0',\n 'check': 'Boolean',\n },\n ],\n 'message1': '%{BKY_CONTROLS_IF_MSG_THEN} %1',\n 'args1': [\n {\n 'type': 'input_statement',\n 'name': 'DO0',\n },\n ],\n 'message2': '%{BKY_CONTROLS_IF_MSG_ELSE} %1',\n 'args2': [\n {\n 'type': 'input_statement',\n 'name': 'ELSE',\n },\n ],\n 'previousStatement': null,\n 'nextStatement': null,\n 'style': 'logic_blocks',\n 'tooltip': '%{BKYCONTROLS_IF_TOOLTIP_2}',\n 'helpUrl': '%{BKY_CONTROLS_IF_HELPURL}',\n 'suppressPrefixSuffix': true,\n 'extensions': ['controls_if_tooltip'],\n },\n // Block for comparison operator.\n {\n 'type': 'logic_compare',\n 'message0': '%1 %2 %3',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'A',\n },\n {\n 'type': 'field_dropdown',\n 'name': 'OP',\n 'options': [\n ['=', 'EQ'],\n ['\\u2260', 'NEQ'],\n ['\\u200F<', 'LT'],\n ['\\u200F\\u2264', 'LTE'],\n ['\\u200F>', 'GT'],\n ['\\u200F\\u2265', 'GTE'],\n ],\n },\n {\n 'type': 'input_value',\n 'name': 'B',\n },\n ],\n 'inputsInline': true,\n 'output': 'Boolean',\n 'style': 'logic_blocks',\n 'helpUrl': '%{BKY_LOGIC_COMPARE_HELPURL}',\n 'extensions': ['logic_compare', 'logic_op_tooltip'],\n },\n // Block for logical operations: 'and', 'or'.\n {\n 'type': 'logic_operation',\n 'message0': '%1 %2 %3',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'A',\n 'check': 'Boolean',\n },\n {\n 'type': 'field_dropdown',\n 'name': 'OP',\n 'options': [\n ['%{BKY_LOGIC_OPERATION_AND}', 'AND'],\n ['%{BKY_LOGIC_OPERATION_OR}', 'OR'],\n ],\n },\n {\n 'type': 'input_value',\n 'name': 'B',\n 'check': 'Boolean',\n },\n ],\n 'inputsInline': true,\n 'output': 'Boolean',\n 'style': 'logic_blocks',\n 'helpUrl': '%{BKY_LOGIC_OPERATION_HELPURL}',\n 'extensions': ['logic_op_tooltip'],\n },\n // Block for negation.\n {\n 'type': 'logic_negate',\n 'message0': '%{BKY_LOGIC_NEGATE_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'BOOL',\n 'check': 'Boolean',\n },\n ],\n 'output': 'Boolean',\n 'style': 'logic_blocks',\n 'tooltip': '%{BKY_LOGIC_NEGATE_TOOLTIP}',\n 'helpUrl': '%{BKY_LOGIC_NEGATE_HELPURL}',\n },\n // Block for null data type.\n {\n 'type': 'logic_null',\n 'message0': '%{BKY_LOGIC_NULL}',\n 'output': null,\n 'style': 'logic_blocks',\n 'tooltip': '%{BKY_LOGIC_NULL_TOOLTIP}',\n 'helpUrl': '%{BKY_LOGIC_NULL_HELPURL}',\n },\n // Block for ternary operator.\n {\n 'type': 'logic_ternary',\n 'message0': '%{BKY_LOGIC_TERNARY_CONDITION} %1',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'IF',\n 'check': 'Boolean',\n },\n ],\n 'message1': '%{BKY_LOGIC_TERNARY_IF_TRUE} %1',\n 'args1': [\n {\n 'type': 'input_value',\n 'name': 'THEN',\n },\n ],\n 'message2': '%{BKY_LOGIC_TERNARY_IF_FALSE} %1',\n 'args2': [\n {\n 'type': 'input_value',\n 'name': 'ELSE',\n },\n ],\n 'output': null,\n 'style': 'logic_blocks',\n 'tooltip': '%{BKY_LOGIC_TERNARY_TOOLTIP}',\n 'helpUrl': '%{BKY_LOGIC_TERNARY_HELPURL}',\n 'extensions': ['logic_ternary'],\n },\n // Block representing the if statement in the controls_if mutator.\n {\n 'type': 'controls_if_if',\n 'message0': '%{BKY_CONTROLS_IF_IF_TITLE_IF}',\n 'nextStatement': null,\n 'enableContextMenu': false,\n 'style': 'logic_blocks',\n 'tooltip': '%{BKY_CONTROLS_IF_IF_TOOLTIP}',\n },\n // Block representing the else-if statement in the controls_if mutator.\n {\n 'type': 'controls_if_elseif',\n 'message0': '%{BKY_CONTROLS_IF_ELSEIF_TITLE_ELSEIF}',\n 'previousStatement': null,\n 'nextStatement': null,\n 'enableContextMenu': false,\n 'style': 'logic_blocks',\n 'tooltip': '%{BKY_CONTROLS_IF_ELSEIF_TOOLTIP}',\n },\n // Block representing the else statement in the controls_if mutator.\n {\n 'type': 'controls_if_else',\n 'message0': '%{BKY_CONTROLS_IF_ELSE_TITLE_ELSE}',\n 'previousStatement': null,\n 'enableContextMenu': false,\n 'style': 'logic_blocks',\n 'tooltip': '%{BKY_CONTROLS_IF_ELSE_TOOLTIP}',\n },\n]);\nexports.blocks = blocks;\n\n/**\n * Tooltip text, keyed by block OP value. Used by logic_compare and\n * logic_operation blocks.\n * @see {Extensions#buildTooltipForDropdown}\n * @readonly\n */\nconst TOOLTIPS_BY_OP = {\n // logic_compare\n 'EQ': '%{BKY_LOGIC_COMPARE_TOOLTIP_EQ}',\n 'NEQ': '%{BKY_LOGIC_COMPARE_TOOLTIP_NEQ}',\n 'LT': '%{BKY_LOGIC_COMPARE_TOOLTIP_LT}',\n 'LTE': '%{BKY_LOGIC_COMPARE_TOOLTIP_LTE}',\n 'GT': '%{BKY_LOGIC_COMPARE_TOOLTIP_GT}',\n 'GTE': '%{BKY_LOGIC_COMPARE_TOOLTIP_GTE}',\n\n // logic_operation\n 'AND': '%{BKY_LOGIC_OPERATION_TOOLTIP_AND}',\n 'OR': '%{BKY_LOGIC_OPERATION_TOOLTIP_OR}',\n};\n\nExtensions.register(\n 'logic_op_tooltip',\n Extensions.buildTooltipForDropdown('OP', TOOLTIPS_BY_OP));\n\n/**\n * Mutator methods added to controls_if blocks.\n * @mixin\n * @augments Block\n * @readonly\n */\nconst CONTROLS_IF_MUTATOR_MIXIN = {\n elseifCount_: 0,\n elseCount_: 0,\n\n /**\n * Create XML to represent the number of else-if and else inputs.\n * Backwards compatible serialization implementation.\n * @return {Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n if (!this.elseifCount_ && !this.elseCount_) {\n return null;\n }\n const container = xmlUtils.createElement('mutation');\n if (this.elseifCount_) {\n container.setAttribute('elseif', this.elseifCount_);\n }\n if (this.elseCount_) {\n container.setAttribute('else', 1);\n }\n return container;\n },\n /**\n * Parse XML to restore the else-if and else inputs.\n * Backwards compatible serialization implementation.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10) || 0;\n this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10) || 0;\n this.rebuildShape_();\n },\n /**\n * Returns the state of this block as a JSON serializable object.\n * @return {?{elseIfCount: (number|undefined), haseElse: (boolean|undefined)}}\n * The state of this block, ie the else if count and else state.\n */\n saveExtraState: function() {\n if (!this.elseifCount_ && !this.elseCount_) {\n return null;\n }\n const state = Object.create(null);\n if (this.elseifCount_) {\n state['elseIfCount'] = this.elseifCount_;\n }\n if (this.elseCount_) {\n state['hasElse'] = true;\n }\n return state;\n },\n /**\n * Applies the given state to this block.\n * @param {*} state The state to apply to this block, ie the else if count and\n * else state.\n */\n loadExtraState: function(state) {\n this.elseifCount_ = state['elseIfCount'] || 0;\n this.elseCount_ = state['hasElse'] ? 1 : 0;\n this.updateShape_();\n },\n /**\n * Populate the mutator's dialog with this block's components.\n * @param {!Workspace} workspace Mutator's workspace.\n * @return {!Block} Root block in mutator.\n * @this {Block}\n */\n decompose: function(workspace) {\n const containerBlock = workspace.newBlock('controls_if_if');\n containerBlock.initSvg();\n let connection = containerBlock.nextConnection;\n for (let i = 1; i <= this.elseifCount_; i++) {\n const elseifBlock = workspace.newBlock('controls_if_elseif');\n elseifBlock.initSvg();\n connection.connect(elseifBlock.previousConnection);\n connection = elseifBlock.nextConnection;\n }\n if (this.elseCount_) {\n const elseBlock = workspace.newBlock('controls_if_else');\n elseBlock.initSvg();\n connection.connect(elseBlock.previousConnection);\n }\n return containerBlock;\n },\n /**\n * Reconfigure this block based on the mutator dialog's components.\n * @param {!Block} containerBlock Root block in mutator.\n * @this {Block}\n */\n compose: function(containerBlock) {\n let clauseBlock = containerBlock.nextConnection.targetBlock();\n // Count number of inputs.\n this.elseifCount_ = 0;\n this.elseCount_ = 0;\n const valueConnections = [null];\n const statementConnections = [null];\n let elseStatementConnection = null;\n while (clauseBlock) {\n if (clauseBlock.isInsertionMarker()) {\n clauseBlock = clauseBlock.getNextBlock();\n continue;\n }\n switch (clauseBlock.type) {\n case 'controls_if_elseif':\n this.elseifCount_++;\n valueConnections.push(clauseBlock.valueConnection_);\n statementConnections.push(clauseBlock.statementConnection_);\n break;\n case 'controls_if_else':\n this.elseCount_++;\n elseStatementConnection = clauseBlock.statementConnection_;\n break;\n default:\n throw TypeError('Unknown block type: ' + clauseBlock.type);\n }\n clauseBlock = clauseBlock.getNextBlock();\n }\n this.updateShape_();\n // Reconnect any child blocks.\n this.reconnectChildBlocks_(\n valueConnections, statementConnections, elseStatementConnection);\n },\n /**\n * Store pointers to any connected child blocks.\n * @param {!Block} containerBlock Root block in mutator.\n * @this {Block}\n */\n saveConnections: function(containerBlock) {\n let clauseBlock = containerBlock.nextConnection.targetBlock();\n let i = 1;\n while (clauseBlock) {\n if (clauseBlock.isInsertionMarker()) {\n clauseBlock = clauseBlock.getNextBlock();\n continue;\n }\n switch (clauseBlock.type) {\n case 'controls_if_elseif': {\n const inputIf = this.getInput('IF' + i);\n const inputDo = this.getInput('DO' + i);\n clauseBlock.valueConnection_ =\n inputIf && inputIf.connection.targetConnection;\n clauseBlock.statementConnection_ =\n inputDo && inputDo.connection.targetConnection;\n i++;\n break;\n }\n case 'controls_if_else': {\n const inputDo = this.getInput('ELSE');\n clauseBlock.statementConnection_ =\n inputDo && inputDo.connection.targetConnection;\n break;\n }\n default:\n throw TypeError('Unknown block type: ' + clauseBlock.type);\n }\n clauseBlock = clauseBlock.getNextBlock();\n }\n },\n /**\n * Reconstructs the block with all child blocks attached.\n * @this {Block}\n */\n rebuildShape_: function() {\n const valueConnections = [null];\n const statementConnections = [null];\n let elseStatementConnection = null;\n\n if (this.getInput('ELSE')) {\n elseStatementConnection =\n this.getInput('ELSE').connection.targetConnection;\n }\n for (let i = 1; this.getInput('IF' + i); i++) {\n const inputIf = this.getInput('IF' + i);\n const inputDo = this.getInput('DO' + i);\n valueConnections.push(inputIf.connection.targetConnection);\n statementConnections.push(inputDo.connection.targetConnection);\n }\n this.updateShape_();\n this.reconnectChildBlocks_(\n valueConnections, statementConnections, elseStatementConnection);\n },\n /**\n * Modify this block to have the correct number of inputs.\n * @this {Block}\n * @private\n */\n updateShape_: function() {\n // Delete everything.\n if (this.getInput('ELSE')) {\n this.removeInput('ELSE');\n }\n for (let i = 1; this.getInput('IF' + i); i++) {\n this.removeInput('IF' + i);\n this.removeInput('DO' + i);\n }\n // Rebuild block.\n for (let i = 1; i <= this.elseifCount_; i++) {\n this.appendValueInput('IF' + i).setCheck('Boolean').appendField(\n Msg['CONTROLS_IF_MSG_ELSEIF']);\n this.appendStatementInput('DO' + i).appendField(\n Msg['CONTROLS_IF_MSG_THEN']);\n }\n if (this.elseCount_) {\n this.appendStatementInput('ELSE').appendField(\n Msg['CONTROLS_IF_MSG_ELSE']);\n }\n },\n /**\n * Reconnects child blocks.\n * @param {!Array<?RenderedConnection>} valueConnections List of\n * value connections for 'if' input.\n * @param {!Array<?RenderedConnection>} statementConnections List of\n * statement connections for 'do' input.\n * @param {?RenderedConnection} elseStatementConnection Statement\n * connection for else input.\n * @this {Block}\n */\n reconnectChildBlocks_: function(\n valueConnections, statementConnections, elseStatementConnection) {\n for (let i = 1; i <= this.elseifCount_; i++) {\n Mutator.reconnect(valueConnections[i], this, 'IF' + i);\n Mutator.reconnect(statementConnections[i], this, 'DO' + i);\n }\n Mutator.reconnect(elseStatementConnection, this, 'ELSE');\n },\n};\n\nExtensions.registerMutator(\n 'controls_if_mutator', CONTROLS_IF_MUTATOR_MIXIN, null,\n ['controls_if_elseif', 'controls_if_else']);\n/**\n * \"controls_if\" extension function. Adds mutator, shape updating methods, and\n * dynamic tooltip to \"controls_if\" blocks.\n * @this {Block}\n */\nconst CONTROLS_IF_TOOLTIP_EXTENSION = function() {\n this.setTooltip(function() {\n if (!this.elseifCount_ && !this.elseCount_) {\n return Msg['CONTROLS_IF_TOOLTIP_1'];\n } else if (!this.elseifCount_ && this.elseCount_) {\n return Msg['CONTROLS_IF_TOOLTIP_2'];\n } else if (this.elseifCount_ && !this.elseCount_) {\n return Msg['CONTROLS_IF_TOOLTIP_3'];\n } else if (this.elseifCount_ && this.elseCount_) {\n return Msg['CONTROLS_IF_TOOLTIP_4'];\n }\n return '';\n }.bind(this));\n};\n\nExtensions.register('controls_if_tooltip', CONTROLS_IF_TOOLTIP_EXTENSION);\n\n/**\n * Adds dynamic type validation for the left and right sides of a logic_compare\n * block.\n * @mixin\n * @augments Block\n * @readonly\n */\nconst LOGIC_COMPARE_ONCHANGE_MIXIN = {\n /**\n * Called whenever anything on the workspace changes.\n * Prevent mismatched types from being compared.\n * @param {!AbstractEvent} e Change event.\n * @this {Block}\n */\n onchange: function(e) {\n if (!this.prevBlocks_) {\n this.prevBlocks_ = [null, null];\n }\n\n const blockA = this.getInputTargetBlock('A');\n const blockB = this.getInputTargetBlock('B');\n // Disconnect blocks that existed prior to this change if they don't match.\n if (blockA && blockB &&\n !this.workspace.connectionChecker.doTypeChecks(\n blockA.outputConnection, blockB.outputConnection)) {\n // Mismatch between two inputs. Revert the block connections,\n // bumping away the newly connected block(s).\n Events.setGroup(e.group);\n const prevA = this.prevBlocks_[0];\n if (prevA !== blockA) {\n blockA.unplug();\n if (prevA && !prevA.isDisposed() && !prevA.isShadow()) {\n // The shadow block is automatically replaced during unplug().\n this.getInput('A').connection.connect(prevA.outputConnection);\n }\n }\n const prevB = this.prevBlocks_[1];\n if (prevB !== blockB) {\n blockB.unplug();\n if (prevB && !prevB.isDisposed() && !prevB.isShadow()) {\n // The shadow block is automatically replaced during unplug().\n this.getInput('B').connection.connect(prevB.outputConnection);\n }\n }\n this.bumpNeighbours();\n Events.setGroup(false);\n }\n this.prevBlocks_[0] = this.getInputTargetBlock('A');\n this.prevBlocks_[1] = this.getInputTargetBlock('B');\n },\n};\n\n/**\n * \"logic_compare\" extension function. Adds type left and right side type\n * checking to \"logic_compare\" blocks.\n * @this {Block}\n * @readonly\n */\nconst LOGIC_COMPARE_EXTENSION = function() {\n // Add onchange handler to ensure types are compatible.\n this.mixin(LOGIC_COMPARE_ONCHANGE_MIXIN);\n};\n\nExtensions.register('logic_compare', LOGIC_COMPARE_EXTENSION);\n\n/**\n * Adds type coordination between inputs and output.\n * @mixin\n * @augments Block\n * @readonly\n */\nconst LOGIC_TERNARY_ONCHANGE_MIXIN = {\n prevParentConnection_: null,\n\n /**\n * Called whenever anything on the workspace changes.\n * Prevent mismatched types.\n * @param {!AbstractEvent} e Change event.\n * @this {Block}\n */\n onchange: function(e) {\n const blockA = this.getInputTargetBlock('THEN');\n const blockB = this.getInputTargetBlock('ELSE');\n const parentConnection = this.outputConnection.targetConnection;\n // Disconnect blocks that existed prior to this change if they don't match.\n if ((blockA || blockB) && parentConnection) {\n for (let i = 0; i < 2; i++) {\n const block = (i === 1) ? blockA : blockB;\n if (block &&\n !block.workspace.connectionChecker.doTypeChecks(\n block.outputConnection, parentConnection)) {\n // Ensure that any disconnections are grouped with the causing event.\n Events.setGroup(e.group);\n if (parentConnection === this.prevParentConnection_) {\n this.unplug();\n parentConnection.getSourceBlock().bumpNeighbours();\n } else {\n block.unplug();\n block.bumpNeighbours();\n }\n Events.setGroup(false);\n }\n }\n }\n this.prevParentConnection_ = parentConnection;\n },\n};\n\nExtensions.registerMixin('logic_ternary', LOGIC_TERNARY_ONCHANGE_MIXIN);\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview List blocks for Blockly.\n * @suppress {checkTypes}\n */\n'use strict';\n\ngoog.module('Blockly.libraryBlocks.lists');\n\nconst xmlUtils = goog.require('Blockly.utils.xml');\nconst Xml = goog.require('Blockly.Xml');\nconst {Align} = goog.require('Blockly.Input');\n/* eslint-disable-next-line no-unused-vars */\nconst {Block} = goog.requireType('Blockly.Block');\n// const {BlockDefinition} = goog.requireType('Blockly.blocks');\n// TODO (6248): Properly import the BlockDefinition type.\n/* eslint-disable-next-line no-unused-vars */\nconst BlockDefinition = Object;\nconst {ConnectionType} = goog.require('Blockly.ConnectionType');\nconst {FieldDropdown} = goog.require('Blockly.FieldDropdown');\nconst {Msg} = goog.require('Blockly.Msg');\nconst {Mutator} = goog.require('Blockly.Mutator');\n/* eslint-disable-next-line no-unused-vars */\nconst {Workspace} = goog.requireType('Blockly.Workspace');\nconst {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldDropdown');\n\n\n/**\n * A dictionary of the block definitions provided by this module.\n * @type {!Object<string, !BlockDefinition>}\n */\nconst blocks = createBlockDefinitionsFromJsonArray([\n // Block for creating an empty list\n // The 'list_create_with' block is preferred as it is more flexible.\n // <block type=\"lists_create_with\">\n // <mutation items=\"0\"></mutation>\n // </block>\n {\n 'type': 'lists_create_empty',\n 'message0': '%{BKY_LISTS_CREATE_EMPTY_TITLE}',\n 'output': 'Array',\n 'style': 'list_blocks',\n 'tooltip': '%{BKY_LISTS_CREATE_EMPTY_TOOLTIP}',\n 'helpUrl': '%{BKY_LISTS_CREATE_EMPTY_HELPURL}',\n },\n // Block for creating a list with one element repeated.\n {\n 'type': 'lists_repeat',\n 'message0': '%{BKY_LISTS_REPEAT_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'ITEM',\n },\n {\n 'type': 'input_value',\n 'name': 'NUM',\n 'check': 'Number',\n },\n ],\n 'output': 'Array',\n 'style': 'list_blocks',\n 'tooltip': '%{BKY_LISTS_REPEAT_TOOLTIP}',\n 'helpUrl': '%{BKY_LISTS_REPEAT_HELPURL}',\n },\n // Block for reversing a list.\n {\n 'type': 'lists_reverse',\n 'message0': '%{BKY_LISTS_REVERSE_MESSAGE0}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'LIST',\n 'check': 'Array',\n },\n ],\n 'output': 'Array',\n 'inputsInline': true,\n 'style': 'list_blocks',\n 'tooltip': '%{BKY_LISTS_REVERSE_TOOLTIP}',\n 'helpUrl': '%{BKY_LISTS_REVERSE_HELPURL}',\n },\n // Block for checking if a list is empty\n {\n 'type': 'lists_isEmpty',\n 'message0': '%{BKY_LISTS_ISEMPTY_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'VALUE',\n 'check': ['String', 'Array'],\n },\n ],\n 'output': 'Boolean',\n 'style': 'list_blocks',\n 'tooltip': '%{BKY_LISTS_ISEMPTY_TOOLTIP}',\n 'helpUrl': '%{BKY_LISTS_ISEMPTY_HELPURL}',\n },\n // Block for getting the list length\n {\n 'type': 'lists_length',\n 'message0': '%{BKY_LISTS_LENGTH_TITLE}',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'VALUE',\n 'check': ['String', 'Array'],\n },\n ],\n 'output': 'Number',\n 'style': 'list_blocks',\n 'tooltip': '%{BKY_LISTS_LENGTH_TOOLTIP}',\n 'helpUrl': '%{BKY_LISTS_LENGTH_HELPURL}',\n },\n]);\nexports.blocks = blocks;\n\nblocks['lists_create_with'] = {\n /**\n * Block for creating a list with any number of elements of any type.\n * @this {Block}\n */\n init: function() {\n this.setHelpUrl(Msg['LISTS_CREATE_WITH_HELPURL']);\n this.setStyle('list_blocks');\n this.itemCount_ = 3;\n this.updateShape_();\n this.setOutput(true, 'Array');\n this.setMutator(new Mutator(['lists_create_with_item'], this));\n this.setTooltip(Msg['LISTS_CREATE_WITH_TOOLTIP']);\n },\n /**\n * Create XML to represent list inputs.\n * Backwards compatible serialization implementation.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n container.setAttribute('items', this.itemCount_);\n return container;\n },\n /**\n * Parse XML to restore the list inputs.\n * Backwards compatible serialization implementation.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);\n this.updateShape_();\n },\n /**\n * Returns the state of this block as a JSON serializable object.\n * @return {{itemCount: number}} The state of this block, ie the item count.\n */\n saveExtraState: function() {\n return {\n 'itemCount': this.itemCount_,\n };\n },\n /**\n * Applies the given state to this block.\n * @param {*} state The state to apply to this block, ie the item count.\n */\n loadExtraState: function(state) {\n this.itemCount_ = state['itemCount'];\n this.updateShape_();\n },\n /**\n * Populate the mutator's dialog with this block's components.\n * @param {!Workspace} workspace Mutator's workspace.\n * @return {!Block} Root block in mutator.\n * @this {Block}\n */\n decompose: function(workspace) {\n const containerBlock = workspace.newBlock('lists_create_with_container');\n containerBlock.initSvg();\n let connection = containerBlock.getInput('STACK').connection;\n for (let i = 0; i < this.itemCount_; i++) {\n const itemBlock = workspace.newBlock('lists_create_with_item');\n itemBlock.initSvg();\n connection.connect(itemBlock.previousConnection);\n connection = itemBlock.nextConnection;\n }\n return containerBlock;\n },\n /**\n * Reconfigure this block based on the mutator dialog's components.\n * @param {!Block} containerBlock Root block in mutator.\n * @this {Block}\n */\n compose: function(containerBlock) {\n let itemBlock = containerBlock.getInputTargetBlock('STACK');\n // Count number of inputs.\n const connections = [];\n while (itemBlock) {\n if (itemBlock.isInsertionMarker()) {\n itemBlock = itemBlock.getNextBlock();\n continue;\n }\n connections.push(itemBlock.valueConnection_);\n itemBlock = itemBlock.getNextBlock();\n }\n // Disconnect any children that don't belong.\n for (let i = 0; i < this.itemCount_; i++) {\n const connection = this.getInput('ADD' + i).connection.targetConnection;\n if (connection && connections.indexOf(connection) === -1) {\n connection.disconnect();\n }\n }\n this.itemCount_ = connections.length;\n this.updateShape_();\n // Reconnect any child blocks.\n for (let i = 0; i < this.itemCount_; i++) {\n Mutator.reconnect(connections[i], this, 'ADD' + i);\n }\n },\n /**\n * Store pointers to any connected child blocks.\n * @param {!Block} containerBlock Root block in mutator.\n * @this {Block}\n */\n saveConnections: function(containerBlock) {\n let itemBlock = containerBlock.getInputTargetBlock('STACK');\n let i = 0;\n while (itemBlock) {\n if (itemBlock.isInsertionMarker()) {\n itemBlock = itemBlock.getNextBlock();\n continue;\n }\n const input = this.getInput('ADD' + i);\n itemBlock.valueConnection_ = input && input.connection.targetConnection;\n itemBlock = itemBlock.getNextBlock();\n i++;\n }\n },\n /**\n * Modify this block to have the correct number of inputs.\n * @private\n * @this {Block}\n */\n updateShape_: function() {\n if (this.itemCount_ && this.getInput('EMPTY')) {\n this.removeInput('EMPTY');\n } else if (!this.itemCount_ && !this.getInput('EMPTY')) {\n this.appendDummyInput('EMPTY').appendField(\n Msg['LISTS_CREATE_EMPTY_TITLE']);\n }\n // Add new inputs.\n for (let i = 0; i < this.itemCount_; i++) {\n if (!this.getInput('ADD' + i)) {\n const input = this.appendValueInput('ADD' + i).setAlign(Align.RIGHT);\n if (i === 0) {\n input.appendField(Msg['LISTS_CREATE_WITH_INPUT_WITH']);\n }\n }\n }\n // Remove deleted inputs.\n for (let i = this.itemCount_; this.getInput('ADD' + i); i++) {\n this.removeInput('ADD' + i);\n }\n },\n};\n\nblocks['lists_create_with_container'] = {\n /**\n * Mutator block for list container.\n * @this {Block}\n */\n init: function() {\n this.setStyle('list_blocks');\n this.appendDummyInput().appendField(\n Msg['LISTS_CREATE_WITH_CONTAINER_TITLE_ADD']);\n this.appendStatementInput('STACK');\n this.setTooltip(Msg['LISTS_CREATE_WITH_CONTAINER_TOOLTIP']);\n this.contextMenu = false;\n },\n};\n\nblocks['lists_create_with_item'] = {\n /**\n * Mutator block for adding items.\n * @this {Block}\n */\n init: function() {\n this.setStyle('list_blocks');\n this.appendDummyInput().appendField(Msg['LISTS_CREATE_WITH_ITEM_TITLE']);\n this.setPreviousStatement(true);\n this.setNextStatement(true);\n this.setTooltip(Msg['LISTS_CREATE_WITH_ITEM_TOOLTIP']);\n this.contextMenu = false;\n },\n};\n\nblocks['lists_indexOf'] = {\n /**\n * Block for finding an item in the list.\n * @this {Block}\n */\n init: function() {\n const OPERATORS = [\n [Msg['LISTS_INDEX_OF_FIRST'], 'FIRST'],\n [Msg['LISTS_INDEX_OF_LAST'], 'LAST'],\n ];\n this.setHelpUrl(Msg['LISTS_INDEX_OF_HELPURL']);\n this.setStyle('list_blocks');\n this.setOutput(true, 'Number');\n this.appendValueInput('VALUE').setCheck('Array').appendField(\n Msg['LISTS_INDEX_OF_INPUT_IN_LIST']);\n this.appendValueInput('FIND').appendField(\n new FieldDropdown(OPERATORS), 'END');\n this.setInputsInline(true);\n // Assign 'this' to a variable for use in the tooltip closure below.\n const thisBlock = this;\n this.setTooltip(function() {\n return Msg['LISTS_INDEX_OF_TOOLTIP'].replace(\n '%1', thisBlock.workspace.options.oneBasedIndex ? '0' : '-1');\n });\n },\n};\n\nblocks['lists_getIndex'] = {\n /**\n * Block for getting element at index.\n * @this {Block}\n */\n init: function() {\n const MODE = [\n [Msg['LISTS_GET_INDEX_GET'], 'GET'],\n [Msg['LISTS_GET_INDEX_GET_REMOVE'], 'GET_REMOVE'],\n [Msg['LISTS_GET_INDEX_REMOVE'], 'REMOVE'],\n ];\n this.WHERE_OPTIONS = [\n [Msg['LISTS_GET_INDEX_FROM_START'], 'FROM_START'],\n [Msg['LISTS_GET_INDEX_FROM_END'], 'FROM_END'],\n [Msg['LISTS_GET_INDEX_FIRST'], 'FIRST'],\n [Msg['LISTS_GET_INDEX_LAST'], 'LAST'],\n [Msg['LISTS_GET_INDEX_RANDOM'], 'RANDOM'],\n ];\n this.setHelpUrl(Msg['LISTS_GET_INDEX_HELPURL']);\n this.setStyle('list_blocks');\n const modeMenu = new FieldDropdown(\n MODE,\n /**\n * @param {*} value The input value.\n * @this {FieldDropdown}\n */\n function(value) {\n const isStatement = (value === 'REMOVE');\n this.getSourceBlock().updateStatement_(isStatement);\n });\n this.appendValueInput('VALUE').setCheck('Array').appendField(\n Msg['LISTS_GET_INDEX_INPUT_IN_LIST']);\n this.appendDummyInput()\n .appendField(modeMenu, 'MODE')\n .appendField('', 'SPACE');\n this.appendDummyInput('AT');\n if (Msg['LISTS_GET_INDEX_TAIL']) {\n this.appendDummyInput('TAIL').appendField(Msg['LISTS_GET_INDEX_TAIL']);\n }\n this.setInputsInline(true);\n this.setOutput(true);\n this.updateAt_(true);\n // Assign 'this' to a variable for use in the tooltip closure below.\n const thisBlock = this;\n this.setTooltip(function() {\n const mode = thisBlock.getFieldValue('MODE');\n const where = thisBlock.getFieldValue('WHERE');\n let tooltip = '';\n switch (mode + ' ' + where) {\n case 'GET FROM_START':\n case 'GET FROM_END':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_FROM'];\n break;\n case 'GET FIRST':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_FIRST'];\n break;\n case 'GET LAST':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_LAST'];\n break;\n case 'GET RANDOM':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_RANDOM'];\n break;\n case 'GET_REMOVE FROM_START':\n case 'GET_REMOVE FROM_END':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM'];\n break;\n case 'GET_REMOVE FIRST':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST'];\n break;\n case 'GET_REMOVE LAST':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST'];\n break;\n case 'GET_REMOVE RANDOM':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM'];\n break;\n case 'REMOVE FROM_START':\n case 'REMOVE FROM_END':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM'];\n break;\n case 'REMOVE FIRST':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST'];\n break;\n case 'REMOVE LAST':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST'];\n break;\n case 'REMOVE RANDOM':\n tooltip = Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM'];\n break;\n }\n if (where === 'FROM_START' || where === 'FROM_END') {\n const msg = (where === 'FROM_START') ?\n Msg['LISTS_INDEX_FROM_START_TOOLTIP'] :\n Msg['LISTS_INDEX_FROM_END_TOOLTIP'];\n tooltip += ' ' +\n msg.replace(\n '%1', thisBlock.workspace.options.oneBasedIndex ? '#1' : '#0');\n }\n return tooltip;\n });\n },\n /**\n * Create XML to represent whether the block is a statement or a value.\n * Also represent whether there is an 'AT' input.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n const isStatement = !this.outputConnection;\n container.setAttribute('statement', isStatement);\n const isAt = this.getInput('AT').type === ConnectionType.INPUT_VALUE;\n container.setAttribute('at', isAt);\n return container;\n },\n /**\n * Parse XML to restore the 'AT' input.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n // Note: Until January 2013 this block did not have mutations,\n // so 'statement' defaults to false and 'at' defaults to true.\n const isStatement = (xmlElement.getAttribute('statement') === 'true');\n this.updateStatement_(isStatement);\n const isAt = (xmlElement.getAttribute('at') !== 'false');\n this.updateAt_(isAt);\n },\n\n /**\n * Returns the state of this block as a JSON serializable object.\n * Returns null for efficiency if no state is needed (not a statement)\n * @return {?{isStatement: boolean}} The state of this block, ie whether it's\n * a statement.\n */\n saveExtraState: function() {\n if (!this.outputConnection) {\n return {\n 'isStatement': true,\n };\n }\n return null;\n },\n\n /**\n * Applies the given state to this block.\n * @param {*} state The state to apply to this block, ie whether it's a\n * statement.\n */\n loadExtraState: function(state) {\n if (state['isStatement']) {\n this.updateStatement_(true);\n } else if (typeof state === 'string') {\n // backward compatible for json serialised mutations\n this.domToMutation(Xml.textToDom(state));\n }\n },\n\n /**\n * Switch between a value block and a statement block.\n * @param {boolean} newStatement True if the block should be a statement.\n * False if the block should be a value.\n * @private\n * @this {Block}\n */\n updateStatement_: function(newStatement) {\n const oldStatement = !this.outputConnection;\n if (newStatement !== oldStatement) {\n this.unplug(true, true);\n if (newStatement) {\n this.setOutput(false);\n this.setPreviousStatement(true);\n this.setNextStatement(true);\n } else {\n this.setPreviousStatement(false);\n this.setNextStatement(false);\n this.setOutput(true);\n }\n }\n },\n /**\n * Create or delete an input for the numeric index.\n * @param {boolean} isAt True if the input should exist.\n * @private\n * @this {Block}\n */\n updateAt_: function(isAt) {\n // Destroy old 'AT' and 'ORDINAL' inputs.\n this.removeInput('AT');\n this.removeInput('ORDINAL', true);\n // Create either a value 'AT' input or a dummy input.\n if (isAt) {\n this.appendValueInput('AT').setCheck('Number');\n if (Msg['ORDINAL_NUMBER_SUFFIX']) {\n this.appendDummyInput('ORDINAL').appendField(\n Msg['ORDINAL_NUMBER_SUFFIX']);\n }\n } else {\n this.appendDummyInput('AT');\n }\n const menu = new FieldDropdown(\n this.WHERE_OPTIONS,\n /**\n * @param {*} value The input value.\n * @this {FieldDropdown}\n * @return {null|undefined} Null if the field has been replaced;\n * otherwise undefined.\n */\n function(value) {\n const newAt = (value === 'FROM_START') || (value === 'FROM_END');\n // The 'isAt' variable is available due to this function being a\n // closure.\n if (newAt !== isAt) {\n const block = this.getSourceBlock();\n block.updateAt_(newAt);\n // This menu has been destroyed and replaced. Update the\n // replacement.\n block.setFieldValue(value, 'WHERE');\n return null;\n }\n return undefined;\n });\n this.getInput('AT').appendField(menu, 'WHERE');\n if (Msg['LISTS_GET_INDEX_TAIL']) {\n this.moveInputBefore('TAIL', null);\n }\n },\n};\n\nblocks['lists_setIndex'] = {\n /**\n * Block for setting the element at index.\n * @this {Block}\n */\n init: function() {\n const MODE = [\n [Msg['LISTS_SET_INDEX_SET'], 'SET'],\n [Msg['LISTS_SET_INDEX_INSERT'], 'INSERT'],\n ];\n this.WHERE_OPTIONS = [\n [Msg['LISTS_GET_INDEX_FROM_START'], 'FROM_START'],\n [Msg['LISTS_GET_INDEX_FROM_END'], 'FROM_END'],\n [Msg['LISTS_GET_INDEX_FIRST'], 'FIRST'],\n [Msg['LISTS_GET_INDEX_LAST'], 'LAST'],\n [Msg['LISTS_GET_INDEX_RANDOM'], 'RANDOM'],\n ];\n this.setHelpUrl(Msg['LISTS_SET_INDEX_HELPURL']);\n this.setStyle('list_blocks');\n this.appendValueInput('LIST').setCheck('Array').appendField(\n Msg['LISTS_SET_INDEX_INPUT_IN_LIST']);\n this.appendDummyInput()\n .appendField(new FieldDropdown(MODE), 'MODE')\n .appendField('', 'SPACE');\n this.appendDummyInput('AT');\n this.appendValueInput('TO').appendField(Msg['LISTS_SET_INDEX_INPUT_TO']);\n this.setInputsInline(true);\n this.setPreviousStatement(true);\n this.setNextStatement(true);\n this.setTooltip(Msg['LISTS_SET_INDEX_TOOLTIP']);\n this.updateAt_(true);\n // Assign 'this' to a variable for use in the tooltip closure below.\n const thisBlock = this;\n this.setTooltip(function() {\n const mode = thisBlock.getFieldValue('MODE');\n const where = thisBlock.getFieldValue('WHERE');\n let tooltip = '';\n switch (mode + ' ' + where) {\n case 'SET FROM_START':\n case 'SET FROM_END':\n tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_SET_FROM'];\n break;\n case 'SET FIRST':\n tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_SET_FIRST'];\n break;\n case 'SET LAST':\n tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_SET_LAST'];\n break;\n case 'SET RANDOM':\n tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_SET_RANDOM'];\n break;\n case 'INSERT FROM_START':\n case 'INSERT FROM_END':\n tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_FROM'];\n break;\n case 'INSERT FIRST':\n tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST'];\n break;\n case 'INSERT LAST':\n tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_LAST'];\n break;\n case 'INSERT RANDOM':\n tooltip = Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM'];\n break;\n }\n if (where === 'FROM_START' || where === 'FROM_END') {\n tooltip += ' ' +\n Msg['LISTS_INDEX_FROM_START_TOOLTIP'].replace(\n '%1', thisBlock.workspace.options.oneBasedIndex ? '#1' : '#0');\n }\n return tooltip;\n });\n },\n /**\n * Create XML to represent whether there is an 'AT' input.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n const isAt = this.getInput('AT').type === ConnectionType.INPUT_VALUE;\n container.setAttribute('at', isAt);\n return container;\n },\n /**\n * Parse XML to restore the 'AT' input.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n // Note: Until January 2013 this block did not have mutations,\n // so 'at' defaults to true.\n const isAt = (xmlElement.getAttribute('at') !== 'false');\n this.updateAt_(isAt);\n },\n\n /**\n * Returns the state of this block as a JSON serializable object.\n * This block does not need to serialize any specific state as it is already\n * encoded in the dropdown values, but must have an implementation to avoid\n * the backward compatible XML mutations being serialized.\n * @return {null} The state of this block.\n */\n saveExtraState: function() {\n return null;\n },\n\n /**\n * Applies the given state to this block.\n * No extra state is needed or expected as it is already encoded in the\n * dropdown values.\n */\n loadExtraState: function() {},\n\n /**\n * Create or delete an input for the numeric index.\n * @param {boolean} isAt True if the input should exist.\n * @private\n * @this {Block}\n */\n updateAt_: function(isAt) {\n // Destroy old 'AT' and 'ORDINAL' input.\n this.removeInput('AT');\n this.removeInput('ORDINAL', true);\n // Create either a value 'AT' input or a dummy input.\n if (isAt) {\n this.appendValueInput('AT').setCheck('Number');\n if (Msg['ORDINAL_NUMBER_SUFFIX']) {\n this.appendDummyInput('ORDINAL').appendField(\n Msg['ORDINAL_NUMBER_SUFFIX']);\n }\n } else {\n this.appendDummyInput('AT');\n }\n const menu = new FieldDropdown(\n this.WHERE_OPTIONS,\n /**\n * @param {*} value The input value.\n * @this {FieldDropdown}\n * @return {null|undefined} Null if the field has been replaced;\n * otherwise undefined.\n */\n function(value) {\n const newAt = (value === 'FROM_START') || (value === 'FROM_END');\n // The 'isAt' variable is available due to this function being a\n // closure.\n if (newAt !== isAt) {\n const block = this.getSourceBlock();\n block.updateAt_(newAt);\n // This menu has been destroyed and replaced. Update the\n // replacement.\n block.setFieldValue(value, 'WHERE');\n return null;\n }\n return undefined;\n });\n this.moveInputBefore('AT', 'TO');\n if (this.getInput('ORDINAL')) {\n this.moveInputBefore('ORDINAL', 'TO');\n }\n\n this.getInput('AT').appendField(menu, 'WHERE');\n },\n};\n\nblocks['lists_getSublist'] = {\n /**\n * Block for getting sublist.\n * @this {Block}\n */\n init: function() {\n this['WHERE_OPTIONS_1'] = [\n [Msg['LISTS_GET_SUBLIST_START_FROM_START'], 'FROM_START'],\n [Msg['LISTS_GET_SUBLIST_START_FROM_END'], 'FROM_END'],\n [Msg['LISTS_GET_SUBLIST_START_FIRST'], 'FIRST'],\n ];\n this['WHERE_OPTIONS_2'] = [\n [Msg['LISTS_GET_SUBLIST_END_FROM_START'], 'FROM_START'],\n [Msg['LISTS_GET_SUBLIST_END_FROM_END'], 'FROM_END'],\n [Msg['LISTS_GET_SUBLIST_END_LAST'], 'LAST'],\n ];\n this.setHelpUrl(Msg['LISTS_GET_SUBLIST_HELPURL']);\n this.setStyle('list_blocks');\n this.appendValueInput('LIST').setCheck('Array').appendField(\n Msg['LISTS_GET_SUBLIST_INPUT_IN_LIST']);\n this.appendDummyInput('AT1');\n this.appendDummyInput('AT2');\n if (Msg['LISTS_GET_SUBLIST_TAIL']) {\n this.appendDummyInput('TAIL').appendField(Msg['LISTS_GET_SUBLIST_TAIL']);\n }\n this.setInputsInline(true);\n this.setOutput(true, 'Array');\n this.updateAt_(1, true);\n this.updateAt_(2, true);\n this.setTooltip(Msg['LISTS_GET_SUBLIST_TOOLTIP']);\n },\n /**\n * Create XML to represent whether there are 'AT' inputs.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n const isAt1 = this.getInput('AT1').type === ConnectionType.INPUT_VALUE;\n container.setAttribute('at1', isAt1);\n const isAt2 = this.getInput('AT2').type === ConnectionType.INPUT_VALUE;\n container.setAttribute('at2', isAt2);\n return container;\n },\n /**\n * Parse XML to restore the 'AT' inputs.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n const isAt1 = (xmlElement.getAttribute('at1') === 'true');\n const isAt2 = (xmlElement.getAttribute('at2') === 'true');\n this.updateAt_(1, isAt1);\n this.updateAt_(2, isAt2);\n },\n\n /**\n * Returns the state of this block as a JSON serializable object.\n * This block does not need to serialize any specific state as it is already\n * encoded in the dropdown values, but must have an implementation to avoid\n * the backward compatible XML mutations being serialized.\n * @return {null} The state of this block.\n */\n saveExtraState: function() {\n return null;\n },\n\n /**\n * Applies the given state to this block.\n * No extra state is needed or expected as it is already encoded in the\n * dropdown values.\n */\n loadExtraState: function() {},\n\n /**\n * Create or delete an input for a numeric index.\n * This block has two such inputs, independent of each other.\n * @param {number} n Specify first or second input (1 or 2).\n * @param {boolean} isAt True if the input should exist.\n * @private\n * @this {Block}\n */\n updateAt_: function(n, isAt) {\n // Create or delete an input for the numeric index.\n // Destroy old 'AT' and 'ORDINAL' inputs.\n this.removeInput('AT' + n);\n this.removeInput('ORDINAL' + n, true);\n // Create either a value 'AT' input or a dummy input.\n if (isAt) {\n this.appendValueInput('AT' + n).setCheck('Number');\n if (Msg['ORDINAL_NUMBER_SUFFIX']) {\n this.appendDummyInput('ORDINAL' + n)\n .appendField(Msg['ORDINAL_NUMBER_SUFFIX']);\n }\n } else {\n this.appendDummyInput('AT' + n);\n }\n const menu = new FieldDropdown(\n this['WHERE_OPTIONS_' + n],\n /**\n * @param {*} value The input value.\n * @this {FieldDropdown}\n * @return {null|undefined} Null if the field has been replaced;\n * otherwise undefined.\n */\n function(value) {\n const newAt = (value === 'FROM_START') || (value === 'FROM_END');\n // The 'isAt' variable is available due to this function being a\n // closure.\n if (newAt !== isAt) {\n const block = this.getSourceBlock();\n block.updateAt_(n, newAt);\n // This menu has been destroyed and replaced.\n // Update the replacement.\n block.setFieldValue(value, 'WHERE' + n);\n return null;\n }\n });\n this.getInput('AT' + n).appendField(menu, 'WHERE' + n);\n if (n === 1) {\n this.moveInputBefore('AT1', 'AT2');\n if (this.getInput('ORDINAL1')) {\n this.moveInputBefore('ORDINAL1', 'AT2');\n }\n }\n if (Msg['LISTS_GET_SUBLIST_TAIL']) {\n this.moveInputBefore('TAIL', null);\n }\n },\n};\n\nblocks['lists_sort'] = {\n /**\n * Block for sorting a list.\n * @this {Block}\n */\n init: function() {\n this.jsonInit({\n 'message0': '%{BKY_LISTS_SORT_TITLE}',\n 'args0': [\n {\n 'type': 'field_dropdown',\n 'name': 'TYPE',\n 'options': [\n ['%{BKY_LISTS_SORT_TYPE_NUMERIC}', 'NUMERIC'],\n ['%{BKY_LISTS_SORT_TYPE_TEXT}', 'TEXT'],\n ['%{BKY_LISTS_SORT_TYPE_IGNORECASE}', 'IGNORE_CASE'],\n ],\n },\n {\n 'type': 'field_dropdown',\n 'name': 'DIRECTION',\n 'options': [\n ['%{BKY_LISTS_SORT_ORDER_ASCENDING}', '1'],\n ['%{BKY_LISTS_SORT_ORDER_DESCENDING}', '-1'],\n ],\n },\n {\n 'type': 'input_value',\n 'name': 'LIST',\n 'check': 'Array',\n },\n ],\n 'output': 'Array',\n 'style': 'list_blocks',\n 'tooltip': '%{BKY_LISTS_SORT_TOOLTIP}',\n 'helpUrl': '%{BKY_LISTS_SORT_HELPURL}',\n });\n },\n};\n\nblocks['lists_split'] = {\n /**\n * Block for splitting text into a list, or joining a list into text.\n * @this {Block}\n */\n init: function() {\n // Assign 'this' to a variable for use in the closures below.\n const thisBlock = this;\n const dropdown = new FieldDropdown(\n [\n [Msg['LISTS_SPLIT_LIST_FROM_TEXT'], 'SPLIT'],\n [Msg['LISTS_SPLIT_TEXT_FROM_LIST'], 'JOIN'],\n ],\n function(newMode) {\n thisBlock.updateType_(newMode);\n });\n this.setHelpUrl(Msg['LISTS_SPLIT_HELPURL']);\n this.setStyle('list_blocks');\n this.appendValueInput('INPUT').setCheck('String').appendField(\n dropdown, 'MODE');\n this.appendValueInput('DELIM').setCheck('String').appendField(\n Msg['LISTS_SPLIT_WITH_DELIMITER']);\n this.setInputsInline(true);\n this.setOutput(true, 'Array');\n this.setTooltip(function() {\n const mode = thisBlock.getFieldValue('MODE');\n if (mode === 'SPLIT') {\n return Msg['LISTS_SPLIT_TOOLTIP_SPLIT'];\n } else if (mode === 'JOIN') {\n return Msg['LISTS_SPLIT_TOOLTIP_JOIN'];\n }\n throw Error('Unknown mode: ' + mode);\n });\n },\n /**\n * Modify this block to have the correct input and output types.\n * @param {string} newMode Either 'SPLIT' or 'JOIN'.\n * @private\n * @this {Block}\n */\n updateType_: function(newMode) {\n const mode = this.getFieldValue('MODE');\n if (mode !== newMode) {\n const inputConnection = this.getInput('INPUT').connection;\n inputConnection.setShadowDom(null);\n const inputBlock = inputConnection.targetBlock();\n if (inputBlock) {\n inputConnection.disconnect();\n if (inputBlock.isShadow()) {\n inputBlock.dispose();\n } else {\n this.bumpNeighbours();\n }\n }\n }\n if (newMode === 'SPLIT') {\n this.outputConnection.setCheck('Array');\n this.getInput('INPUT').setCheck('String');\n } else {\n this.outputConnection.setCheck('String');\n this.getInput('INPUT').setCheck('Array');\n }\n },\n /**\n * Create XML to represent the input and output types.\n * @return {!Element} XML storage element.\n * @this {Block}\n */\n mutationToDom: function() {\n const container = xmlUtils.createElement('mutation');\n container.setAttribute('mode', this.getFieldValue('MODE'));\n return container;\n },\n /**\n * Parse XML to restore the input and output types.\n * @param {!Element} xmlElement XML storage element.\n * @this {Block}\n */\n domToMutation: function(xmlElement) {\n this.updateType_(xmlElement.getAttribute('mode'));\n },\n\n /**\n * Returns the state of this block as a JSON serializable object.\n * This block does not need to serialize any specific state as it is already\n * encoded in the dropdown values, but must have an implementation to avoid\n * the backward compatible XML mutations being serialized.\n * @return {null} The state of this block.\n */\n saveExtraState: function() {\n return null;\n },\n\n /**\n * Applies the given state to this block.\n * No extra state is needed or expected as it is already encoded in the\n * dropdown values.\n */\n loadExtraState: function() {},\n};\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Colour blocks for Blockly.\n */\n'use strict';\n\ngoog.module('Blockly.libraryBlocks.colour');\n\n// const {BlockDefinition} = goog.requireType('Blockly.blocks');\n// TODO (6248): Properly import the BlockDefinition type.\n/* eslint-disable-next-line no-unused-vars */\nconst BlockDefinition = Object;\nconst {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.FieldColour');\n\n\n/**\n * A dictionary of the block definitions provided by this module.\n * @type {!Object<string, !BlockDefinition>}\n */\nconst blocks = createBlockDefinitionsFromJsonArray([\n // Block for colour picker.\n {\n 'type': 'colour_picker',\n 'message0': '%1',\n 'args0': [\n {\n 'type': 'field_colour',\n 'name': 'COLOUR',\n 'colour': '#ff0000',\n },\n ],\n 'output': 'Colour',\n 'helpUrl': '%{BKY_COLOUR_PICKER_HELPURL}',\n 'style': 'colour_blocks',\n 'tooltip': '%{BKY_COLOUR_PICKER_TOOLTIP}',\n 'extensions': ['parent_tooltip_when_inline'],\n },\n\n // Block for random colour.\n {\n 'type': 'colour_random',\n 'message0': '%{BKY_COLOUR_RANDOM_TITLE}',\n 'output': 'Colour',\n 'helpUrl': '%{BKY_COLOUR_RANDOM_HELPURL}',\n 'style': 'colour_blocks',\n 'tooltip': '%{BKY_COLOUR_RANDOM_TOOLTIP}',\n },\n\n // Block for composing a colour from RGB components.\n {\n 'type': 'colour_rgb',\n 'message0':\n '%{BKY_COLOUR_RGB_TITLE} %{BKY_COLOUR_RGB_RED} %1 %{BKY_COLOUR_RGB_GREEN} %2 %{BKY_COLOUR_RGB_BLUE} %3',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'RED',\n 'check': 'Number',\n 'align': 'RIGHT',\n },\n {\n 'type': 'input_value',\n 'name': 'GREEN',\n 'check': 'Number',\n 'align': 'RIGHT',\n },\n {\n 'type': 'input_value',\n 'name': 'BLUE',\n 'check': 'Number',\n 'align': 'RIGHT',\n },\n ],\n 'output': 'Colour',\n 'helpUrl': '%{BKY_COLOUR_RGB_HELPURL}',\n 'style': 'colour_blocks',\n 'tooltip': '%{BKY_COLOUR_RGB_TOOLTIP}',\n },\n\n // Block for blending two colours together.\n {\n 'type': 'colour_blend',\n 'message0': '%{BKY_COLOUR_BLEND_TITLE} %{BKY_COLOUR_BLEND_COLOUR1} ' +\n '%1 %{BKY_COLOUR_BLEND_COLOUR2} %2 %{BKY_COLOUR_BLEND_RATIO} %3',\n 'args0': [\n {\n 'type': 'input_value',\n 'name': 'COLOUR1',\n 'check': 'Colour',\n 'align': 'RIGHT',\n },\n {\n 'type': 'input_value',\n 'name': 'COLOUR2',\n 'check': 'Colour',\n 'align': 'RIGHT',\n },\n {\n 'type': 'input_value',\n 'name': 'RATIO',\n 'check': 'Number',\n 'align': 'RIGHT',\n },\n ],\n 'output': 'Colour',\n 'helpUrl': '%{BKY_COLOUR_BLEND_HELPURL}',\n 'style': 'colour_blocks',\n 'tooltip': '%{BKY_COLOUR_BLEND_TOOLTIP}',\n },\n]);\nexports.blocks = blocks;\n\n// Register provided blocks.\ndefineBlocks(blocks);\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview All the blocks. (Entry point for blocks_compressed.js.)\n * @suppress {extraRequire}\n */\n'use strict';\n\ngoog.module('Blockly.libraryBlocks');\n\nconst colour = goog.require('Blockly.libraryBlocks.colour');\nconst lists = goog.require('Blockly.libraryBlocks.lists');\nconst logic = goog.require('Blockly.libraryBlocks.logic');\nconst loops = goog.require('Blockly.libraryBlocks.loops');\nconst math = goog.require('Blockly.libraryBlocks.math');\nconst procedures = goog.require('Blockly.libraryBlocks.procedures');\nconst texts = goog.require('Blockly.libraryBlocks.texts');\nconst variables = goog.require('Blockly.libraryBlocks.variables');\nconst variablesDynamic = goog.require('Blockly.libraryBlocks.variablesDynamic');\n// const {BlockDefinition} = goog.requireType('Blockly.blocks');\n// TODO (6248): Properly import the BlockDefinition type.\n/* eslint-disable-next-line no-unused-vars */\nconst BlockDefinition = Object;\n\n\nexports.colour = colour;\nexports.lists = lists;\nexports.logic = logic;\nexports.loops = loops;\nexports.math = math;\nexports.procedures = procedures;\nexports.texts = texts;\nexports.variables = variables;\nexports.variablesDynamic = variablesDynamic;\n\n/**\n * A dictionary of the block definitions provided by all the\n * Blockly.libraryBlocks.* modules.\n * @type {!Object<string, !BlockDefinition>}\n */\nconst blocks = Object.assign(\n {}, colour.blocks, lists.blocks, logic.blocks, loops.blocks, math.blocks,\n procedures.blocks, variables.blocks, variablesDynamic.blocks);\nexports.blocks = blocks;\n"]} |