From ee1efb360e90f20a1fc99211c4fbebc8b67ec1ea Mon Sep 17 00:00:00 2001 From: damp11113 Date: Tue, 16 Jul 2024 23:38:54 +0700 Subject: [PATCH] added new CCTurtle library (not not finish yet) --- TestProject/turtle example 1.ccp | 2 +- blocks/CCTurtle/block_design.json | 383 ++++++++++++++++++++++++++++++ blocks/CCTurtle/generator.js | 58 +++++ blocks/CCTurtle/index.json | 22 ++ blocks/CCTurtle/toolbox.xml | 97 ++++++++ blocks/IDE/block_design.json | 9 + blocks/IDE/generator.js | 14 ++ blocks/IDE/toolbox.xml | 1 + ccIDE Defines.xlsx | Bin 49467 -> 51685 bytes index.js | 36 ++- src/ccRemote.js | 18 +- src/codegen.js | 31 ++- src/module_block_design.json | 9 - src/module_generator.js | 14 -- src/toolbox.xml | 2 +- src/virtualcode.js | 13 + 16 files changed, 673 insertions(+), 36 deletions(-) create mode 100644 blocks/CCTurtle/block_design.json create mode 100644 blocks/CCTurtle/generator.js create mode 100644 blocks/CCTurtle/index.json create mode 100644 blocks/CCTurtle/toolbox.xml diff --git a/TestProject/turtle example 1.ccp b/TestProject/turtle example 1.ccp index 5e5bd04..1d25584 100644 --- a/TestProject/turtle example 1.ccp +++ b/TestProject/turtle example 1.ccp @@ -1 +1 @@ -{"usedlibrary":["IDE"],"content":{"blocks":{"languageVersion":0,"blocks":[{"type":"sys_start","id":"o[Cw/cGpoIP_gX=[qr#;","x":330,"y":210,"inputs":{"DO":{"block":{"type":"ide_addcode","id":"4rulxmAG~hzUkD5l(5yF","inputs":{"CODE":{"block":{"type":"text","id":"(o[.P`~(.T7p_[l_^Hl#","fields":{"TEXT":"turtle.refuel()"}}}},"next":{"block":{"type":"ide_addcode","id":"/5%!yEWtyS/E=wR/m*Xm","inputs":{"CODE":{"block":{"type":"text","id":"%wbX8A-7RhI2ZgV=lFhV","fields":{"TEXT":"turtle.digDown()"}}}},"next":{"block":{"type":"ide_addcode","id":"*(^6fQ{j/V.kg,ho=|:N","inputs":{"CODE":{"block":{"type":"text","id":"7hY96DknnQ/t#Xq?Q`dz","fields":{"TEXT":"turtle.down()"}}}},"next":{"block":{"type":"controls_repeat_ext","id":"$%Y?,,|7H1k$t+Jn)I}r","inputs":{"TIMES":{"shadow":{"type":"math_number","id":"s.U14p%aW!FTHv{Re%tn","fields":{"NUM":10}}},"DO":{"block":{"type":"ide_addcode","id":"]{qn$;Fr@4:nCTC%VK@d","inputs":{"CODE":{"block":{"type":"text","id":"*h}KRP|Z|Z8~bz+}Lb|S","fields":{"TEXT":"turtle.forward()"}}}},"next":{"block":{"type":"ide_addcode","id":"4*u|eIRv$3l8gVAe-#G6","inputs":{"CODE":{"block":{"type":"text","id":"vJr{;31CY5XLpno1G1l`","fields":{"TEXT":"turtle.dig()"}}}}}}}}},"next":{"block":{"type":"ide_addcode","id":"MYaWPpTW,*Sbr$qHdP;X","inputs":{"CODE":{"block":{"type":"text","id":"4yq!yCVpT7zAkbgx|e}?","fields":{"TEXT":"turtle.up()"}}}},"next":{"block":{"type":"ide_addcode","id":"}oNps@eRjo{j6Mt*y[M(","inputs":{"CODE":{"block":{"type":"text","id":"Pp6jDe[JkcY^`5J3FtzJ","fields":{"TEXT":"turtle.forward()"}}}},"next":{"block":{"type":"ide_addcode","id":"GBsH+H_G).Or7Jg#Z/HM","inputs":{"CODE":{"block":{"type":"text","id":"I39UB3G^1g|#PXmIK~/8","fields":{"TEXT":"turtle.forward()"}}}}}}}}}}}}}}}}}}}}]},"variables":[{"name":"fuellevel","id":"v3Vu$~B8ol()F*#n?^)B"}]}} \ No newline at end of file +{"usedlibrary":["IDE"],"content":{"blocks":{"languageVersion":0,"blocks":[{"type":"ide_start","id":"o[Cw/cGpoIP_gX=[qr#;","x":330,"y":210,"inputs":{"DO":{"block":{"type":"ide_addcode","id":"4rulxmAG~hzUkD5l(5yF","inputs":{"CODE":{"block":{"type":"text","id":"(o[.P`~(.T7p_[l_^Hl#","fields":{"TEXT":"turtle.refuel()"}}}},"next":{"block":{"type":"ide_addcode","id":"/5%!yEWtyS/E=wR/m*Xm","inputs":{"CODE":{"block":{"type":"text","id":"%wbX8A-7RhI2ZgV=lFhV","fields":{"TEXT":"turtle.digDown(\"left\")"}}}},"next":{"block":{"type":"ide_addcode","id":"*(^6fQ{j/V.kg,ho=|:N","inputs":{"CODE":{"block":{"type":"text","id":"7hY96DknnQ/t#Xq?Q`dz","fields":{"TEXT":"turtle.down()"}}}},"next":{"block":{"type":"controls_repeat_ext","id":"$%Y?,,|7H1k$t+Jn)I}r","inputs":{"TIMES":{"shadow":{"type":"math_number","id":"s.U14p%aW!FTHv{Re%tn","fields":{"NUM":10}}},"DO":{"block":{"type":"ide_addcode","id":"]{qn$;Fr@4:nCTC%VK@d","inputs":{"CODE":{"block":{"type":"text","id":"*h}KRP|Z|Z8~bz+}Lb|S","fields":{"TEXT":"turtle.forward()"}}}},"next":{"block":{"type":"ide_addcode","id":"4*u|eIRv$3l8gVAe-#G6","inputs":{"CODE":{"block":{"type":"text","id":"vJr{;31CY5XLpno1G1l`","fields":{"TEXT":"turtle.dig(\"left\")"}}}}}}}}},"next":{"block":{"type":"ide_addcode","id":"MYaWPpTW,*Sbr$qHdP;X","inputs":{"CODE":{"block":{"type":"text","id":"4yq!yCVpT7zAkbgx|e}?","fields":{"TEXT":"turtle.up()"}}}},"next":{"block":{"type":"ide_addcode","id":"}oNps@eRjo{j6Mt*y[M(","inputs":{"CODE":{"block":{"type":"text","id":"Pp6jDe[JkcY^`5J3FtzJ","fields":{"TEXT":"turtle.forward()"}}}},"next":{"block":{"type":"ide_addcode","id":"GBsH+H_G).Or7Jg#Z/HM","inputs":{"CODE":{"block":{"type":"text","id":"I39UB3G^1g|#PXmIK~/8","fields":{"TEXT":"turtle.forward()"}}}}}}}}}}}}}}}}}}}}]},"variables":[{"name":"fuellevel","id":"v3Vu$~B8ol()F*#n?^)B"}]}} \ No newline at end of file diff --git a/blocks/CCTurtle/block_design.json b/blocks/CCTurtle/block_design.json new file mode 100644 index 0000000..00a3a49 --- /dev/null +++ b/blocks/CCTurtle/block_design.json @@ -0,0 +1,383 @@ +{ + "turtle_move_operation": { + "message0": "Move %1 for %2 blocks", + "args0": [ + { + "type": "field_dropdown", + "name": "OPERATION", + "options": [ + ["Forward", "FORWARD"], + ["Back", "BACK"], + ["Up", "UP"], + ["Down", "DOWN"] + ] + }, + { + "type": "input_value", + "name": "FOR", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": 215, + "tooltip": "Move the turtle." + }, + "turtle_turn_operation": { + "message0": "Turn %1 for %2 round", + "args0": [ + { + "type": "field_dropdown", + "name": "OPERATION", + "options": [ + ["Left", "LEFT"], + ["Right", "RIGHT"] + ] + }, + { + "type": "input_value", + "name": "ROUND", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": 215, + "tooltip": "Turn the turtle." + }, + "turtle_dig_operation": { + "message0": "Dig in %1 of turtle with %2 side", + "args0": [ + { + "type": "field_dropdown", + "name": "OPERATION", + "options": [ + ["Front", "FRONT"], + ["Up", "UP"], + ["Down", "DOWN"] + ] + }, + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Left", "LEFT"], + ["Right", "RIGHT"] + ] + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": 215, + "tooltip": "Attempt to break the block in direction of the turtle." + }, + "turtle_attack_operation": { + "message0": "Attack in %1 of turtle with %2 side", + "args0": [ + { + "type": "field_dropdown", + "name": "OPERATION", + "options": [ + ["Front", "FRONT"], + ["Up", "UP"], + ["Down", "DOWN"] + ] + }, + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Left", "LEFT"], + ["Right", "RIGHT"] + ] + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": 215, + "tooltip": "Attack the entity in direction of the turtle." + }, + "turtle_place_operation": { + "message0": "Use/Place in %1 of turtle", + "args0": [ + { + "type": "field_dropdown", + "name": "OPERATION", + "options": [ + ["Front", "FRONT"], + ["Up", "UP"], + ["Down", "DOWN"] + ] + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": 215, + "tooltip": "Place a block or item into the world in direction of the turtle." + }, + "turtle_drop_operation": { + "message0": "Drop item in %1 of turtle for %2 items", + "args0": [ + { + "type": "field_dropdown", + "name": "OPERATION", + "options": [ + ["Front", "FRONT"], + ["Up", "UP"], + ["Down", "DOWN"] + ] + }, + { + "type": "input_value", + "name": "COUNT", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": 215, + "tooltip": "Drop the currently selected stack into the inventory in the turtle, or as an item into the world if there is no inventory." + }, + "turtle_select_item": { + "message0": "Select item in slot %1", + "args0": [ + { + "type": "input_value", + "name": "SLOT", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": 215, + "tooltip": "Change the currently selected slot." + }, + "turtle_get_item_count": { + "message0": "Get item count in slot %1", + "args0": [ + { + "type": "input_value", + "name": "SLOT", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "colour": 215, + "tooltip": "Get the number of items in the given slot." + }, + "turtle_get_slot_free": { + "message0": "Get free space in slot %1", + "args0": [ + { + "type": "input_value", + "name": "SLOT", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "colour": 215, + "tooltip": "Get the remaining number of items which may be stored in this stack." + }, + "turtle_detect_block": { + "message0": "Detect solid block in %1 of turtle", + "args0": [ + { + "type": "field_dropdown", + "name": "OPERATION", + "options": [ + ["Front", "FRONT"], + ["Up", "UP"], + ["Down", "DOWN"] + ] + } + ], + "inputsInline": true, + "output": "Boolean", + "colour": 215, + "tooltip": "Check if there is a solid block in direction of the turtle." + }, + "turtle_compare_item": { + "message0": "Compare block in %1 of turtle is equal current item slot", + "args0": [ + { + "type": "field_dropdown", + "name": "OPERATION", + "options": [ + ["Front", "FRONT"], + ["Up", "UP"], + ["Down", "DOWN"] + ] + } + ], + "inputsInline": true, + "output": "Boolean", + "colour": 215, + "tooltip": "Check if the block in direction of the turtle is equal to the item in the currently selected slot." + }, + "turtle_collect_item": { + "message0": "Collect %1 items in %2 of turtle", + "args0": [ + { + "type": "input_value", + "name": "COUNT", + "check": "Number" + }, + { + "type": "field_dropdown", + "name": "OPERATION", + "options": [ + ["Front", "FRONT"], + ["Up", "UP"], + ["Down", "DOWN"] + ] + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": 215, + "tooltip": "Collect an item from the inventory in direction of the turtle, or from an item floating in the world. If count is 0 it collect all item." + }, + "turtle_get_fuel_level": { + "message0": "Get current fuel level", + "inputsInline": true, + "output": "Number", + "colour": 215, + "tooltip": "Get the maximum amount of fuel this turtle currently holds." + }, + "turtle_refuel": { + "message0": "Refuel turtle for %1", + "args0": [ + { + "type": "input_value", + "name": "COUNT", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": 215, + "tooltip": "Refuel this turtle. If 0 it refuel unlimit from current item." + }, + "turtle_compare_to": { + "message0": "Compare item to slot %1", + "args0": [ + { + "type": "input_value", + "name": "SLOT", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Boolean", + "colour": 215, + "tooltip": "Compare the item in the currently selected slot to the item in another slot." + }, + "turtle_transfer_to": { + "message0": "Transfer item to slot %1 for %2 items", + "args0": [ + { + "type": "input_value", + "name": "SLOT", + "check": "Number" + }, + { + "type": "input_value", + "name": "COUNT", + "check": "Number" + } + ], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "colour": 215, + "tooltip": "Move an item from the selected slot to another one." + }, + "turtle_get_selected_slot": { + "message0": "Get current selected slot", + "inputsInline": true, + "output": "Number", + "colour": 215, + "tooltip": "Get the currently selected slot." + }, + "turtle_get_fuel_limit": { + "message0": "Get fuel limit", + "inputsInline": true, + "output": "Number", + "colour": 215, + "tooltip": "Get the maximum amount of fuel this turtle can hold." + }, + "turtle_equip": { + "message0": "Equip item on %1 side", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Left", "LEFT"], + ["Right", "RIGHT"] + ] + } + ], + "inputsInline": true, + "output": "Multiple", + "colour": 215, + "tooltip": "Equip (or unequip) an item on the side of this turtle." + }, + "turtle_inspect": { + "message0": "Inspect block on %1 side", + "args0": [ + { + "type": "field_dropdown", + "name": "OPERATION", + "options": [ + ["Front", "FRONT"], + ["Up", "UP"], + ["Down", "DOWN"] + ] + } + ], + "inputsInline": true, + "output": "Multiple", + "colour": 215, + "tooltip": "Get information about the block in direction of the turtle." + }, + "turtle_get_item_detail": { + "message0": "Get Item detail in slot %1", + "args0": [ + { + "type": "input_value", + "name": "SLOT", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Array", + "colour": 215, + "tooltip": "Get detailed information about the items in the given slot." + }, + "turtle_craft": { + "message0": "Craft Item with limit %1", + "args0": [ + { + "type": "input_value", + "name": "LIMIT", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Multiple", + "colour": 215, + "tooltip": "Craft a recipe based on the turtle's inventory." + } +} \ No newline at end of file diff --git a/blocks/CCTurtle/generator.js b/blocks/CCTurtle/generator.js new file mode 100644 index 0000000..6cfab87 --- /dev/null +++ b/blocks/CCTurtle/generator.js @@ -0,0 +1,58 @@ +const { luaGenerator } = require('blockly/lua'); + +// Check if luaGenerator.forBlock is defined and initialize if necessary +if (!luaGenerator.forBlock) { + luaGenerator.forBlock = {}; +} + +// Math operation block +luaGenerator.forBlock['math_operation'] = function(block, generator) { + var operator = block.getFieldValue('OPERATOR'); + var num1 = generator.valueToCode(block, 'NUM1', generator.ORDER_ATOMIC); + var num2 = generator.valueToCode(block, 'NUM2', generator.ORDER_ATOMIC); + + var operatorSymbol = ''; + switch (operator) { + case 'ADD': + operatorSymbol = '+'; + break; + case 'SUBTRACT': + operatorSymbol = '-'; + break; + case 'MULTIPLY': + operatorSymbol = '*'; + break; + case 'DIVIDE': + operatorSymbol = '/'; + break; + default: + operatorSymbol = '+'; + break; + } + + var code = `${num1} ${operatorSymbol} ${num2}`; + return [code, generator.ORDER_ATOMIC]; +}; + +// Print text block +luaGenerator.forBlock['text_print'] = function(block, generator) { + var text = generator.valueToCode(block, 'TEXT', generator.ORDER_NONE) || '\'\''; + var code = `print(${text})\n`; + return code; +}; + +// If condition block +luaGenerator.forBlock['controls_if'] = function(block, generator) { + var condition = generator.valueToCode(block, 'IF0', generator.ORDER_NONE) || 'false'; + var branch = generator.statementToCode(block, 'DO0'); + var code = `if ${condition} then\n${branch}\nend\n`; + return code; +}; + +// Set variable block +luaGenerator.forBlock['variables_set'] = function(block, generator) { + var variable = generator.nameDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); + var value = generator.valueToCode(block, 'VALUE', generator.ORDER_NONE) || '0'; + var code = `${variable} = ${value}\n`; + return code; +}; diff --git a/blocks/CCTurtle/index.json b/blocks/CCTurtle/index.json new file mode 100644 index 0000000..92d0511 --- /dev/null +++ b/blocks/CCTurtle/index.json @@ -0,0 +1,22 @@ +{ + "name": "CC: Turtle", + "author": "DPSoftware Foundation", + "description": "Library for control turtle", + "version": "0.1", + "category": "turtle", + "keyword": "turtle", + "license": "GPL-3.0-or-later", + "peripherals": false, + "library": true, + "require_network": false, + "dependencies": {}, + "design_for_computer": { + "basic": false, + "adv": false, + "command": false, + "pocket": false, + "advpocket": false, + "turtle": true, + "advturtle": true + } +} diff --git a/blocks/CCTurtle/toolbox.xml b/blocks/CCTurtle/toolbox.xml new file mode 100644 index 0000000..10db08b --- /dev/null +++ b/blocks/CCTurtle/toolbox.xml @@ -0,0 +1,97 @@ + \ No newline at end of file diff --git a/blocks/IDE/block_design.json b/blocks/IDE/block_design.json index 3c538d2..4cb8834 100644 --- a/blocks/IDE/block_design.json +++ b/blocks/IDE/block_design.json @@ -13,5 +13,14 @@ "colour": 150, "tooltip": "Add Code for some code is not in IDE", "helpUrl": "" + }, + "ide_start": { + "message0": "When Code Start", + "message1": "do %1", + "args1": [ + {"type": "input_statement", "name": "DO"} + ], + "colour": 150, + "tooltip": "Not require but make your code easy to read." } } diff --git a/blocks/IDE/generator.js b/blocks/IDE/generator.js index 4266691..f26725d 100644 --- a/blocks/IDE/generator.js +++ b/blocks/IDE/generator.js @@ -13,3 +13,17 @@ luaGenerator.forBlock['ide_addcode'] = function(block, generator) { const cleanedStr = codefromuser.replace(/[']/g, ''); return cleanedStr+"\n"; }; + +luaGenerator.forBlock['ide_start'] = function(block, generator) { + var docode = generator.statementToCode(block, 'DO'); + + var code = +` +function main() +${docode} +end + +main() +` + return code; +}; \ No newline at end of file diff --git a/blocks/IDE/toolbox.xml b/blocks/IDE/toolbox.xml index 8055198..7ba83e4 100644 --- a/blocks/IDE/toolbox.xml +++ b/blocks/IDE/toolbox.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/ccIDE Defines.xlsx b/ccIDE Defines.xlsx index 4e96e61959d5f1068dbafd518e942a8f659b1754..50bfe4dbcad6e9ffefe5e56bf4b2ae8f42f925b7 100644 GIT binary patch delta 31274 zcma&NWmsHIvo4$ff#B}J-Q8UV2tGIr65QPhVQ?ATHNjzUcXxLS?u0-H5FmIsljq%M z?{}a5UEeu>)|y#URejf8)m1%xt?mehKTL)vQdfdUzg}snuc%(p{!s4;e*Nkd zEm9p37aW*S8$U=U-8>rM`4ukaAaxzvjO6aQ2$#Axel(WCVG?8AH#XdFDy1#ZaSM#s zu??9v#VUz`Q=j?0lA>mILHj^jg>gG=Vbn}LIEeA>LphJ3UvFpyn^ghjFEtG_W65Gp zPjc3p7$Yd&rFn)z&9AboKnHVqlq;S%B6^ymR21vf<_3M;jxWIDmn?6o+qF30YGE^;Yh>Vwl^Gy{g zEQOq`F(ahS-68qLt7mpbw|%)ZMCk8L-uUU_e@u_o2x#LZ6B1Cl4SBbo^|hc;W7x^# zd^g@P8#oL)os_l%W8W!|ouSUTexwrq$u2wcEb*Oknlj z^(SEd8EMcP<%sPypAlW>2Ea~NTVOpPN=s-553e`JF-vRd&n>A4Rq>Q<>X~s$##eHQ zFV;tyyT2x?s~fHRecoqB#j&#*(WuB>)%#{0ZxfbrE%ULvB=3VE{1yd0Sk>URhpYGr zHp^`MVp8;1B;s?ZRBN-mzB&mcSEy@Ah+fMnOM1O2Vws(m2;Vv>WfxOzL21s*tq#{> z(xcOTd8eM4i5XT#DkODCrbYd58{Yt{zsRemr-LfE);+2c=i1*yYU`)&0fJ5pK8IbE zhI4n82mZ$JU5f+vtwd1Nf2e)T{&0Fw-abim=)uPRYHdU0Q$K}1z4W{VR%>ci4ud*$e}aXX3AdQEFuX1PaI zzagzJlY;o1JZCZJms61EStSe0*CwNpI?t;U#&4jKLyK5&ha#)wsFierFw>Ny6FeqfiCD5L?FyHGnH$Nsh+-LJ1XswH- zsHnEM1f9W`r3XOZCKj5i*8CaWfq~5l&Ou`VXU-bpVEi2}X|Gq|g1Cn~`aAd;?@^ks z-3xkD=iU+_MePQ2qpx_2nG?j1Ai8NfTL1!fl-Uk*gY=6JxKwMMbLXvS-*eV%-lAeC8Q&?(L?wCMmtOCXq97CJ?Y*GiHb$iO}L} zeX;1634fOwJ}Dld`vR9-2aks=rWfdk1uL&V8zxa$UV}I7LOHR*&QU)hjeUx3mteEp z-%9DxVLd)}fc_#9<3P0^yt`k`~Jm=~VZEW{$sc8<$$00|XIu;i@h|O^I zt3g!D)zxN5WI`jG=P4^A*DHv5z(;qVARSx^>4j^eItYLc4fw)HM}R0CTX)*$R_fNh zFj!n;Sp$xau9mWTU!VS`CVbR7YpzVIKUeX$1g4nCOU+q%In&M<{yCXmyBXD-4dx+> zZ#Q{;?QgyWoQAWEsIX3q27R2Pg?m(zS6Pw)EeXK32IRgCjx02EwsEx|Dqqi?3DhM%nR3y)2P4&M;$go;B_Tl564dQ3XS%aW2$f zy&9@~o&3j<2+Z}j-sNbm$E|T#(w(C^~B2JUF~VV%-yLnt}t} zY>V)}my~|fsF6f0B4iyWHbN}%!}oiqdRYdP`=H~~!7L;)N4o;;`L6pIJ+Y9t+RYFG zu{xH-_si%63v3~`0qqr=;L%dYXAMq;Z$tshDdvY@NS4k;309Ihx=harNM4?3Qb4)>?p zqS0O2PsZBPdzQ$jTaQ%q)5iVyy<#>KU+<$8bFi6G7#mS1w}4lNzvQ<@2a3$w4PT6S z1CHN=ANrNy)wKH7Y43p}_&KA9&a}}Y+zm$DoAshH;3pR>HgfBREo$GKn||7yTe;}F zvX%IPQcmJfQ^C*AfMnO{ya6lixFSG!Nx%csTet(2;bkca;?1&#jk$t93aDa*mdGX% zqrUjTV4ANU&P1QlB}kR}1+3;2HCg-D! zETuQvMx^-DGBPYZALw)*vc38`safkq&i;8BgWguM?xjc0ce%kElL`)OiqMbxX*xq6 zj<_GeN_k@X0%Fc+&WYY;5WlXE=zmS+7h)w&rb#py+)*2hW~G1|)JDnu*7^GY=irX3 z%1`cKTxY89y_NepQl`i60ykP>d{uDWqaruS>F2yn-;()_Wk_{( zGmJpZh1qIQGawqd54DLdnB@vn_-jGIVwhLLxJaGtZv5q7BNvs~aXVb)eumJIjjlRqr( zAJ`)o9k~$EWf#$H*;>r&#U}DYdr%K&Or81k7R6#I64y9yAA{&ye)^wb?%O4#- zP-{Jfp|Oo@Dp{i+|14`UedgpyNrDIlr;%Z0odQ#tYvn8&5=5oATHPT@LGw$q1~VF0 zG3{aoRUY0^QAAu z)~P%NT6*#2LdgSc`W4K%v!MEAxN=!P4tobk08ir2G2x9P9Ll5vXBk(AxL>a@S_bY$ zU!F{QUe3W+J@X_Su@`oa<|elihUqrPn}y5*Yd@w+N}47yyA&Ps^94evyP#DD@zh3HN7h}Zqu4=#8M(abYXa%u1BsJ!AhJw7AJyctPU-hn2V zlLdv`+D#aFUluevRIk&>ryRb+XB01}XYLpuaPT$D8_&h>O522VG!CI<^sR#bEby??O-8GLL5h)%S|eD&rMX_9~ADS}C^9rFsj+1q`9M0u*Mm-|pnT==0U zR^r7d(Agj>@wjNxWyN|q%{nHFFnVzXCW~1BKVwGB(+_^I1ikglG@B-1R@Im*Q$Rff zY-7bW8xUXxEHS=p3=Qh1bqh{^IynoY!n7t?+Q3M+DQII;)NU~=vj`vOR}mfRq2p;x z0%r(!nnBJPNnQy+p{$0HYBvcs%D>SUsf6uOM_jgoHQrjD;LH7q4uYGj5ey(sv|<@&TP~Ai`Pug=@{6+z&p|^Va}{k1 zBcV%V*3RO*opDs-p73;Kw5@mQR=sH#49gfaNZ2CFX_hLvI2zqa-l(!mf&MdCcOs2C z)5A=KiO$0U{Y@IkcSm@OJ<+hzK=?-2S|`8Fp&1%s0FXLr9XIK0{94;y@7rgwEJ?=Q zP`nk`A^V~3H+3d&u9Z@vvS@dS-!we?I8%#8RZ`i53VgL^8QnrB4h`;YK$VyjJu|D) z0<8p!hUUW*>fyki0y1W6$vY3QnO4T$Ygi^%wbrj@@XwP&`>y&Z5baD9xOV(KLENkG?r4>S!&Z z;T7V07ogz{6UXU@8oIMA*)_5YIqw_U+2YGP@r#Ih+TjBl zd7wPkR_e~j_$7jJJd8=mF(v}UcwP}@uxTppAHmAGh3DFu;tYSxzBjtGjK225t2^|8IxQf-xgaH{={zq&WRZ!Dc}ibZ#x6GuDy=z+Ln3n$~2qC1~c`mw@LA3&}iXNU01 z&t1kNZ#?$2t8B}-UXCw#;?DXq*nL@2Mgghh!ZJ@*>IZ~`Jj)fm98S*uk=4$=a);uM zK*a9UBj%nHAY;I0U+T6Y+*3il#nh#NXY}~|k6%{O1I?t#XT)sq@AL(d$w(qzn#gF|y*Hxf!$;B$NL>siUBRqixHF>T zJ2OPKy&pPz2k&`jM9;?r^5~wGOf*T!Lc_Zs;y4Ba+=ET1_;!U-Ky_OGTm39YBgX+~ zSML`LlRIJnxrQTiWQm@KGRlHpBc2SOC&?&VvG}}_aOfamEa~&nlJ+pVnE14|H}@Y# zIQ5&n{@}wc5X3J@RDRjhYYR2e}2YlxS zxZWXigbKl?*)Btz1w8nMTK}tA2|8Y;oYc5vqV2mffcrXnfHp&xc}a9J&e$(tf-O8B zO;hTt1x5uSNTxBJLhQ;-A37sxC;W*+-n|09dipk9aLOv=sesZlPf%ljMW^5tBno$1 zCMn`_R~5+Iqr_Xjx5KRgLcWM5NiEFS)+Slbax#)|(IyQI1 zz=*fd)Pbr;JxBc8a}!6`>9#6V`=<_EyqK`C#Sl~R!AhVCDAF>BR^;v@KYjjFh& zxXj1iLcs<%JJqO}=<={7+?;BS;^9Zi5A2)suLa;eTY2k>2M&|2)Rv78l1ki;kmnxMKd*|z92@pXtJhlkOFKq7JXyyzl8|cufC~hTOMIqHfmL4 zZ}$bd7iQo$apdnz32*y%?2;=p%PwecOuFKgiZRl&JvDkdm&+UIE?HfUk2Vx$iBz{9 ze~xB1PH}5LDzm97=98HWilt9z-0p&kp)8oKwkPd_kmyNDac|*^~YzqT~OlR zt;byieET@$4XuLAouNK!cPCIzoIOuxigLi8QP3@F@IF28Zh8ZqPePD{5hKpWeq}(N zdRnK96G=o=>%2weBTy+lKMR$UrMwumq$s+O+Njn25UM~}5?Bt{%3geyey>#k&S3YP zjS3$^gKKwTZ$Nxww7>R6V`!x(KE1p$b5fZX8nt}?0dO`60Gx*ltBPd@^#0t#9~cdn z$F7M(;UP4}x&w;LO&j{`M0EIR;-^bXoE% z!>o7DL4E~~7#bTyW>@2kXm>>q?wmL?A~GXemt^x5c?y5B%kyg9*kv%KDBmX4Bk?CW zZtALbk(Y0Wl+_0$&jgbKhq^q6areeCz(YSxZ)BCLada_QtA7|@7?8qyew|7?S~a4s z(z6dTdSbq?%Nu1U@78*@@^a5z8=8rm4#87O-Jr8mx^$w`g|dlsO6{3~ZxGrP9ak$U zTvT{$DEwp?02tC>EZ}EgX&MTKy(vWPmv6{fXvaYIJD9&UG+%`8IkjHRkqIJ}-w#a1 zu2}3=Z}d+1%6wikT@%IKwlHwdFc=u%J>hJC+)6Lr}GN3bseVPM>`?c>wR>6X*!J|BY*EB2pKc*O!!8L zN7#vR|0B;!7T<97d$w=&-G?cR78Z^z;}~(#(S0b9Udqok_~uXF?DtM^3G_kYyjw|r z0$SEgW?zv13{VjJXE2f5jjTuYP=~1A>=gVVGq!T|S`=*y&%%@i!vmyUB<9vp5B64% zDhdnOMCB?Trh7gEfnkRCv$EAb;(vC@y$u*Q= z6#Dmv4J@rk??URE3#kk5#u9&sOr_y#6Z6f;lJq`pGEYZT1odlpjP$hG29u!o?oUab z-bR%g5LJ4BN(+S%7LVW=lUr$A!JR$h%E)O8GMdUY8z6E_o!DOhJ*N53t8sRoe$!28 zd_9YaC5&8NS}dAp7k&d3h5aaS@gAR`Fn?2?rBzPofy&)NO`e3-t47zbP(!wj-FM(Y3xDJ_{ zzF5+Q+DN6X_mU)6;0Fw_ACLMs`Gqj1KSL()LtLaS)983sbizlaS%o5cD9~Y#--=>) z-s$1$QS8&KX2q$YG*==IHy-k?irtF6B%r=eh)J~Qc&&rE&mVba?PaB2brEX*X(ePq z9wdtr)XdKsU=`UAe8Jkp!*y$3%$X@--z=u0o)*)M;^E>H9em0T?{FJ+G9!7dU9_&VxeizgeM4b+GhaTBTvgP&D zrEU~c#Z2r?_JfO4U#0tSF93P-N+^DT28wNY9N*3gSS63$q3^~aYQf*MS}fT`%U`iu zF}p<(C%~*QIz)cCA_7UKDxF(KDcMH0dRXhQyN}r)(~m_AiI*BP@N8p(cz&R4g>Y2V$f0sEA;Mt%@Xcl z{&k~^3ip>~N|Z}$X0*k8PS6Q31K5Z6tXk4Us6T|OiU_IPi;F*Q`>^z=r9YI^!97^n z&cjmChM+ez<2}{-0l&E9-i7y>2Cd5He!tZ$ltPYB#vbve)kBl-o%?%QjN6k+q(s4| zKeAvCO{@sA)>J#scZc6BRYuGCwv9l@SP|QY!jNx+z^uFe6_morh+PE0}UW)0aV!jj*NUB+mO_3fpF9Ef)Mn+r41&?5y*_B@g}_G>MjbOni_OxS2mD;JD+ zLni|#Q7%sf7w+72h3LwnPu~3M5laqbBVaqZrV@mTk|^HKYYXui2Bp*$J}Ji6{xg++ zxy%)MZiL~o|MHA>@PwT3J0=gio)O(oTF*$D6gTn};jGVOopisaSZ`WoR}ai?%mfQ0 z?ei4g1%%q?{TAC*nns1<$ScP2%8r$Ptj4j9h%pn?n7;bKIB&a%+s!@N&OHaNml29T zrEI{nQjeFmL;;if`(@k}`hMJ)>LFpQhm>~&!Bt#;w|cFu)0OU-a2OEn0*kheJ8~$^ zp=kJCnS1JFvd1S3`ElPtDH;sdLBK2;ZPvB(Uh=h7ip|{RX^4(8>2qX$b2i}PxRjS?ix`2!a z?-|MSx>V*JvY?fy+`DopEKlW+@UEZu(DP?t73JmsYi~ z$n|*r)R(w;*u2dd<0sow$7;*CRCuRY@>g39rmb)DT6<5SFfp7FcCE9+a`mxU0KRiA z?5(})Chpz&juQ#;o@#8LV=kLCJ( zx>71bDNt#{jCY^zoH;7~{nF{{;!ANh1bflW{n3 z|LDzcl)gHKiOty<1mscq+V)z8-#riKLx z|EQ8#=AR&11rQoxb{vYI3*u1Y9BnS^iVP$gdYX9`;1oJ zi-_PfwX$kStzxTqq_mmBgXnegcTnO*Q(Y*vkJp*m6u|3}v9UVR4uhBj8SSj*6mew1{nZz?)vFt4SfdFT$4g@jWdb zu387UZ^+~U(!e<&+n)Ew+;-4~(*|>SZ6$O4SA$JMpWoDP)wTRkVi4DNEmN11cN4#h z8N0i9X~mzgg0G=RG@>7$Ugyd-B?KO8O3MSvf$$n#-*&X2Vt*91_OjxBD_rqb=z!$~ z46Q-Ed=MF9O#t7x3~GE78iyj&-Yf4<)=mq9jyHPNAjnM&&sdgwd<1QLu(@%!{1eQKK7a4KdK-6AH{JaEqtA>+ zrL~p?*${&~U>W#Hql<8${e+-Xk_o){K1pMFsaCZhMK@GkUc0<^u(n$^JC^u@Y*oT9l82R9`+4j1K1_JteTs1H&N9-+2i)JD-5NI`F6{6J@yeyqJzgWl9etv&%?-!~Z8so0Pe zAp8cv@`OeUWbq)Asv6VTgn}*Yk)9;EfGkBUqWV6bT19ErCUl%!{{iI;r>^{=DW6{# z!Orz`+P)kL=(BS*U~6RQl;cgDOiCunQt3KLnq0;kBgPN6!kff_-QN$ZP%VL%YnjWb zRy)=zliO~Y^WA#*X}?iZX0E6r;$B8;ESn{Tm51f#(IyRn$EdN#O6)z~TiHVnVj#4I zZ_mW+-;3`s1*I4;eTL9v;?)?`QTaw49pYzet{WrJHV~QZ5haWIUj`JLmcOlkYaIX4 zON(KQ8?>4E)upNl-U(>bIi4`j;uOS)J@>pqR9AgfsN^}57a(|if zel%+(U&%883keD<@EXc3@q@r-8#LGS+ITg>TzqJimX60di1KgD z5@Q79RgyrazXMl->8!qgO(AS5ynJ1Q+$GF>5xF8B0G<9d#`IHmFEOlKgV+1i{kv{g z_H{%$fcmmUll%?6ndfH>zFLi@e3|Hwd_P$$&?jpBTO7CWCgL`_;&FAh7SeZ>xGe<$ z;UN<+aEkK>em0SI*Egam=rt&LN-KLJ5M)5CZ>^mW7d*OG^<>&9hf2_e)Xu&P6mx2* z5^qub@p^e4FB_N$N-9Ug-%INb)_m4=J$<%o9V$oxlx^{}5aYK^S@yCalPm}Bd41O5 ztJU%Ry2F&yr!MAXRAE=D!}kic3etj6HPs7d`x2pK?$(Uoc8I2btVHbu%uqDvw%6__ zG^;v&MsckeWY&^d$avDKBw3Eq#(jrl-frZ@sTB_*tnk}lZj0DY8!Cr4F8b0s1s!E0 zZ`6PRnK0A#y|7X?rq%K7fooB$>W}xrZ9&AnI%9OLBuX|?D$5K~%+X61iX3Drd;pu* ztNUKusF=IS4Yj^m#`z0<$Xq85GC}T>EzVL-oZMA`-coSexd216ag^n%Jj}}HYR}on z2GMG;HjD@=E`w+Pon%KfNZVJXq}kPqzkGKP_m^nfarH!yD5Usd2Gn^-MQR7ER9rZt zwjA%khw@D^iDG|ARb3QM1()!js#>VHyi3{*6UPicK^qG{39qW9pSO?!*u78ShD}He z%d$WFv7Wg%Oe`(MX6T^RkBY^eCTuM_h^9(zVFQ8=0w&r;C6L5J^yi|B4^Z+6FA{sv zQ=XP`?d6LC9-aSR=bVbxGZUk7O^MxRv9*`G+aoFqSP2 z$a+G&wIa`G91)^^vTU`PK)mJoI^6;IKZ%<#JF`cq&l{7SpLH+0Ra@8I?xOSvD>u|6 zWXYyv@6DTM$1*kZFxRX2HF&btt9+C$c=XSA_%upCWVWfeio=xl-8RUe7&M335)71fP_-QJVVN6`GCb@O{63~PMPA(piI6&w788~sqax8Gz_TpNBWIXJ6 zaL+=DkG8NRwZ0kvmv+mNP>I0Wc}y3(uJ)#KiV^H@yD{DVo|gD13vY~d8|u2wn?XM2 z@FP+l@o!m{=WV5CPRs#PC0)jNQD=g*_L~bylIp;WiIonQ2M*6DwAml`Xm-=@wgMp* zTJ;3-^|Ot~0>=@t>iL5%j&{oN7X0+x2DS8s@)zs==X$i6MK*KKG~}8Jrwn+t8i>PL zX|=^xdxl)ogVGDaX4EOv_hltb&nK=GWzQ6}dfv#DEKOqM!I zAfqCV)FkC29iLQI_CHHV;1!hc5&JT9t*Iw^&sP9$@z0@-bV>R@VO9FTkPD$@32owp zhWr}rlMOkj88-q^dGD$j7wr(Z5ytO?pMVhsNJYA5y{)ZSla$As@~OvYKS%zIu0cmF zS6$HZ(5=RzX}x8UbqjE!%xuKHrLM_uIi;;dCf~n}Y?-FF(?=2B!_I^iYYN5Gplp}( zC4*G%svypQ-E$?QE;FSAY)s!z&}oR#?k@%OM1K?|(N^jtKF$gv-;KFG>j-3Wd2o>B zeaQv?DVHPtry>dpGPEU(TF8h)#S9G#Kz>WGk)Nii@%#g3w1S3r%T`5c{FG?; zWrw@EjiXAtzhEl_vz5kT2ocJGUMVFj%l0smPylS|1;UK9_UkYu^sSmcXg z;q5uloX{BOzcu}XrCGksVuP~n3^10Vh)yE|SZh~Sw{lDJ)b*4a2?#fl9p#}<|s=ys(H6gn!WyWo)6lD4jXJD(YytMc+ zgBj|k#!X7_Lk-mOxm?Sk#ANAX$@24>dc^^YxTCcSik3XCxg2LG_r9bU6l?9qi)3!4RJJiuA{pI=`{Cvx?y^!1U{P@jz0Hdk27$ghU z1jOj9A@OQ)7&H(ql&0{p@nKnO#pq}dRaqwj*Tk`&2~YEa?Fv%Em@JiKSx_}~u!*WB zTtDDxLx*Be#2{)4KSP5bZR-XjR zKhZ2LLiRKvz~#bF4y~Aaa!Y*p!cwpm6kbj~s*u%TzIB$^!HCvYj#o4>6A?sU7#BPe zb8=jJu&58~j5&i}rFJ*gj z#h60>Fm`0hkV4;A$fDvpTzYyiX%Hj7HUMN4Jx=zSbd)0(qR?0)_&#vLbO~mz#4BJG zkAgr9ygg;AuyR$W_)*nKQ%b~}DtR5fi^P8Dk!nz#C~C$VaYg+)sdrgMr(8RW}<}ph1luI00 z87g%sx)6H~7K$?I@G#?ygI5!3!w3zEpO$m$P4S}VGbXy#W7;UcLW6zp4)KCds*!3Q;QkfJ%K?Bhzx zsyw?3;GB_I>)Y06W_|==Gi(^b;6_WwQHbTc$s{mMdHw`>Dpu>)7GN7pOcf(*KK&Cp=h!6!^HiUv+S| zmP(~O79#?e-7Bdt^mO%m&1c;oMC&2R;*l?Z7Qg}b;6DrJJ^nABw4OC!j~n(eY0>%q zEQ6jEQ0el$1(uW8RBs^kYMnQh(6nJ(CpdrTPZkpWL8i|({fS2THWt_;4geBT2DsQl zty;su)sC;TK7UfDsfm~`Xly2%+j*_@lnO^>0LhSH2bOsSd$6g}T!!P)tkPU0fQh8b z=Jzjf)84X`))YQX?35A)Z}o!9Z|MQw;*byFCon-z+iP>lKaotZKb?nzgm*;DZgSCn zrb@;6&_UX1y`02m!9r8lVP-h%8IP7{VOOi*fwkS#k_*|a7;*+H;17sSH%Zmj%79$H^o{Gf||{OB>JDYK;Yh0 z9{jUf)lZo_qr_wDutJ*$gKt%<$_u02r~gHmh*^$?4LOVrJNAusdZ?DiEdfY3a+bxZ zD&HC)xzB?Q(~ZyEQGm&yFBNi~62n%TAF+j?Horn!4(UnGLMp8;-TI?f#oyr@sXeL{ z4~5I=*vR(a#j?Be@j|Wy!KHFFG4A`OpQU;FU_N4#l*^l^QMU8eZxq__ww2Po_3p!o zWu498_n6l9FhMJSvot#j7uyI3v2(STDa5fM;X<=9WSD)YmnU=?#`GUivk2P{Wng9x zfq^K!#*M9<$D8DnXuLoGsD7U-w%eoWdbCB@c<-7Xf* znvaD;=HHG#Yvj~fnBxaESSL-HezxH0b48%boKo+a1<|kKnR}XY{K&na^xtD$k9U=O zh=HvQ#k7o_oVqs+lbU^&&AI-`+QEzgVJ@p+8fy>F$b7#XHeB;it~ziVtvbU~YMyN2 ztaY=;tn^on0lHJ3Vly5?7(ozFwmye00!i+7o)OQ7Nd$S4_nJIf5pps&;Yy~;v>b4r z{o7fs7~zmPg@+i2M1tRMwB6O2+doEEu?)U7*f6kdq|Up{6n8f)ol$lvO0?jYxv?=U znSlXD!2hl0Q!Klu436ZwbA5;?>?c70TirJlkWA~vVE^@&=pS#bbK*`1GmztQ=6=nn zi%q9RarI}Qh^0BG-t~DG03*3TIOZ17@BE;h8yo&2*oq)tY=Rd4{L;aUqbD_G!T5i4 zd6P=4pyaU=gG8n=;_o`qV5lDvaAKun`Y@L?z`W(~?8-FJT*YRe-xjl#Bo1ZFFIk{6 zlBPdRw7eZTttiwpC^t%JSU+An&fo?kNiiLJUTps)W>AY%+YT(QAcNBTUR}3$^55o7D(Md10j6$fXmW##X?9K+049J46JRxQ5t#0Wz`muF{1sQS z{ZH|UBQCZ+Q#9R_F|fW~3QXnuRR3Rv@BGu!T5be2re%ym6Tqthq8ih6)xd`3D&6?j z%g=iQvIWC4r(fz>(T^;C#OoQ{Sl|_0 zRB#&vVK?-+`TH4?Yj`;fxHaH?w3>r|ehdEm%DM{l@w3aO3wb4@AZj|@*uN0Ls52~g zCdf}}s5NsV;0RTm>um6$TJ(a;X>yu#A20LqY2dsElcH%qr{{!04_H|hr+)$7@3YF% zSzo$^K<2ZDCMfIdijWkYbrz6amfMSmkllB#txO@G|6%AKugCPiB#%gbVB16M#+wpB zrC<~~wM7IQr1z=0WS|R$2xt*C2!=3dp~y_{AgA^x@c1w*nzkkfNU?*}c^r{x$RWTE!Ui zS8Rya3dWv25K#>?CFh1WgrcU{fXY?n;?7DRc*@G`M*%(V2k3IxeFor5wC%-4|7^1H z3M~DbVm8>@l`EdaPY6iXroW!}iOSJsnE#Hy1qp7zO3fJ}7R9Ht7P8xdjneX$;EA1) zZ3Tp-K1hFd7?YPD40LJ1wUsNP8jQH<9aymc1!AkRl=$iNuU`Y%L&Tl={n^P5Ql#K` zkv{vsuo+PI3IAx@mi$W;!At7sT4i9r+Q+CK~NAi`CE!L%v*r%am4toz5mC&dQ>Pk>3-gf*?!hT~7 z$fL-|H4WVEtQ^}(&XBLd;XhRNzLTvrSFDHG^^OBj)9D#R)bnnUVUO_nOudm4{bh`I(jk`0mQ_t^0SJGhLvP;kJtPVxQ zcV%(|9&QL-7tD0HGe%CbnWUb(U+KRXhGx&JvTk^+j)hMlL` zX1S4|>bHiY$5@7Ip!z9V z>M$=8Y^OsR>kK>=zT{Gzpoj$@VHfLJNHhjYgt~B&sMJz+%8^lNw{ThjUB(HLoZeKZ zAOS0>5g%6QoUbKuuL*J}?HU{nnE~*T_%*FU&FTklv&3uc%SOwC+b{!Uq3-Gz$UCGM z{Ac$(41Hxu1_Z91vlb6@CVC`^aEHo#6hsLVbfr9XFrD8?UlNllY+ zC%4#BoqWIKOYAP1+)W6&4t(J9D&+KYO9uFyi--SN;QfMtxe#%{ku~FnA>vT#hR4F~ zab8MM_;&Zc5`7kP`uD@q+C5wGonq8x1(CGB@RJ3+o+pE&m9BYts< zE5V*of@OH|8*ZYw9`5avaPT@3mYY0=y3NecO7w6X=6|r~{9mxS4XRp_w%{Icsp(fuOH4xo+% z+)=5COfp7jB8=UC5!&_2{R2CB_3{EcQ~C0evbL)VlE)gl)RhvI+}%2*rKeW7nf^K1 ztQN$mAyKR?Y5Vy5#?zIX=cPjU5j{Y7So|ZpIMGj&0B}G+>d4AS#3Kjz$@AuL;l|_B z%`fn`{cq{}@)V`}3}Cg6k<$2{XPOxfwV7NK38U>lye1MG5>>0YD;MAC<-tNHD-r9D z*)^EA0&31t@VMSwz>Ewt>5Q*KvX*9XQNx2B8MCn?Ts`r`>!U?T>%^<)x0e%7Zqpl` zpXX~ZoZ?n?*M~CX*@sEu2+h}ulOkd#uc^RB2^6EFLJh{hJQh7qU5i2-K$#wj?Wyn8 z$k)e<#GiA7zIX|4SRS~nxQK2%i&L=kxC>|3-&oGC!jwFlNn3i9w%r_0#pm0;56h^i zS%}C_tIhvGZ1G;v-R|DJeLOEE!|)bxYqj?g+qg0!<4!?K%D1v1<_)nt#*ohRrU6?n zyD%o_TO^?I$xP%Cv&wj5jdxNoHH6D#qS1v|K#2_yr#=w3ho~P7D8SwV7`I>~rj?nR z<+eebm?aD4eoW-H7fcyb=T->M%D0?FOUoB|YZ)g&7vL{nxvNeuGe${l7oH}?qZj^@ zG9}YVel2G{AEQVTL4yjt04v0UqYk|M_3K2#VeQWWmrWE|O8j|B6fT8Z9DDSslCiUp zg>o^;|MnC;jj1Pqg7OV@0*WnG7*Wy3sHX6e{?MvdOjto$3L%Vxl$%PGe7q#|m52&K zZ;PZ!WT_Cp8=F<--*cKu{5MngRIdK`cQ4>=KQ3B&R^&)Y<{~LPvxJ{?&A+1e%ve|< z$jNa3HA>Y}W9wIx1+)IktwSJkpvbqc-4RtV#blt!EH8q}d#Hydsa{P%H4Rtb2T-~2o4OQX#hb!>l8ga3m^ z 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 Xq$~&dIamL@3Kb;wb7sB_{nPqCPhRpS delta 29212 zcma%iWmsIzvNgei>);kNxVs0}Fav{2f;+(-277H*0BkaA9(I8t9x?oLKsW&Ogl><4=(PwGzKY>z4$>B*Yd1jTe zXkKNB*#Drz|ImLol%x=!yjbo^$X$yF=sZ7DwQRWwK-Jctka@SCTRhMapk#a^s*^*~ z4rJP0=1ed;(BONu;=oU3e$Eni*4sg&9uariXV_3fdoEjQR@EfoD@O=s@OrAW@*9 zd^cn2#%>hfg4kavM=jlW6xc6CLHFlD(bLy)a=}8*IPt0U+r>4~h+;zqP&jYNZ04jW z^!pe;h1c?i5`uBrC9mH9>|Nz${ z{FfI5xPMPZWBnKc9Rg$yS75mk0S*p;3J3Rhpr;*&$0ui7lTV*)**)#;DmCpt?F!;N z`_KIeW89h_@Iokr{a%ZG)t(gDQ z!~{>$ILBHWcMd91GM_2FpQ#RYa>mvMv0_R=u3&n?po2yI(^9!D+LFLL&WO&>t4j|J(*c}_qGYVSsEdS6{`J(cm1#p~6KyV~ObWd9pVCwlKMUgYo85BzVZ z!3P&Tkzu)J1e9O<1UUDfxJluyt*c~kI@Ah~UOQBKxwRG$wEir%-ER65X`50u#>>oV zrUz7vtQ87iT8sBU@31YUsQS2kD>lt{RuPo_sTCAYaLx=7dQJUvC!f2|aUXdMFPN*0 zZU-}!&LRep;{54RbJF@pi&>uIUhLB%=zZQ-$q(Bs(SmUo>gy)Dq!cwn7UXPQ=#CI- zM_T@<;P6JXGn#2j#Wq3px8iIeFL`R&ET#4rZI(;jkZ3rZ{aK@+=0vg!aph`i?5ztP zGbHB^KO)^B$j0)Urb*W*VqI<4cp?tu`u+K*y3YWir2$n@VyWerPF|AxOEt&PFwm6a z+i}A_f}3wQ)a`He1w7lg-o0O#-HjQlsQ+ERaNYlP>vtKsR@GTfVvJ`}XeKG2y_G72 z(VV*FcOXB~T8{{6KorN%QnJnmNp#)MbHJkj#qM8kA^B?b7xE(%NF{+Tin*iY96rEv z<|Wf>x6jD=A|%DB*usrZGuV~Z+~j&A)1L$J!)QP4S~dN`HQe|Z*yK+d!yZ{_yN$L; zaZ~<2(E37Qqt6maosw#;RG;l)4EQ<@>p?!ub%mVjF{r*;j5`#|tEKn1r}PB#l9Sc) zYpKnIR!9wB^Bvu=CYD-T&s7-hGU;QE z?V$f|N$(rgIqSUrqAuOpm)TY~bGhGf`6jw1?BB`1+ujFnCM*KbXS!p*V*197z7N`2 zxC|)B&7ZiM9jPsupK1O~cm4U5(k}1F<_PnhcCPi0ENT5*1|9bq4Y0`UwL;8_!|m6W z6C(FHuVv1GucNWNg7n(-b7F-44C)M;^>a#e-ynALW(qQDK7XZBFpwWX z!Rn^J>Cf=hJuuNwiXB<;{zZarWo^S_EnMveEK>0%!UV_4MSG!1{ldxD&lCAwrF}k` zCForoV*8J0hu@(whmH{{8wn`PsQ}``b6KS^%%)75<$TPPxd$y56hC^AFOXc<5bl`0 zm>US+8#3!i>HHq5NP=+FEu`-+jfT2QLg$A54zpL7=nn@^5g0VDL1!#xNNIr4{JKbZ zu8}oPHJ85lS;{DnU-`?fNTkK3ALl|ulHT{yq4(2iaAxTa5BTAyKG$*b4ru&}b6Iuq zRPuDAk`l^JV$d^UloUG- zt`;lniFiY~w;z8j0-=+Ny~~Q$pF2tsA}uL;EBfth!HJ1l%f#dUjI^l)r9qh#>MaVI zFfEz=%2l(Y-_463qsfb%QufrrywV)t{IHeZ9`i}@B8|mhkse?fhJE8^X-?@#s&l15 zZ7IPzQ}Dh{fAKoR(}sg-iY+|Nh?9JXa=228Pn!AX4vuUuiXocwcEcQBL=pWGXZLDd zr_G9BYgnvltH_VnG8baNO5M?$D0*3}x5w8dcz89+-|kkhxtyl(#9#T!S4A6ktM5iD z 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 Bd@29{ diff --git a/index.js b/index.js index 78b24f9..9027828 100644 --- a/index.js +++ b/index.js @@ -208,6 +208,19 @@ app.whenReady().then(() => { } }, { type: 'separator' }, + { + label: 'Export', + submenu: [ + { + label: "Export Lua", + accelerator: 'CmdOrCtrl+Shift+L', + click: () => { + win.webContents.send('export-lua-request'); + } + } + ] + }, + { type: 'separator' }, { label: 'Exit', accelerator: 'CmdOrCtrl+Q', @@ -373,6 +386,28 @@ app.whenReady().then(() => { } }); + ipc.on('export-lua', (event, data) => { + dialog.showSaveDialog(win, { + title: 'Save Project', + defaultPath: path.join(app.getPath('documents'), 'main.lua'), + filters: [ + { extensions: ['lua'] } + ] + }).then(result => { + if (!result.canceled) { + fs.writeFile(result.filePath, data, (err) => { + if (err) { + console.error('Error exporting lua from project:', err); + dialog.showErrorBox("Export Lua Error", err.message) + } + }); + } + }).catch(err => { + console.error('Error exporting lua from project:', err); + dialog.showErrorBox("Export Lua Error", err.message) + }); + }); + ipc.on('workspace-notsave', (event) => { win.setTitle(`${currentprojectname}* | ccIDE`) currentworkspacechange = true; @@ -383,7 +418,6 @@ app.whenReady().then(() => { }) - app.on("close", function(e) { console.log("Close event triggered"); if (currentprojectopen) { diff --git a/src/ccRemote.js b/src/ccRemote.js index 14c03a2..bd7be97 100644 --- a/src/ccRemote.js +++ b/src/ccRemote.js @@ -26,6 +26,15 @@ class CCRemote { }); } + isClientConnect() { + for (const client of this.socket.clients) { + if (client.readyState === WebSocket.OPEN) { + return true; + } + } + return false; + } + sendCommand(command) { // Iterate over each connected client and send the command this.socket.clients.forEach((client) => { @@ -41,7 +50,6 @@ class CCRemote { if (client.readyState === WebSocket.OPEN) { client.send("sendcode"); setTimeout(() => { - console.log(Code) client.send(Code); return true }, 500); @@ -62,6 +70,14 @@ class CCRemote { }); } + disconnectAllClients() { + this.socket.clients.forEach((client) => { + if (client.readyState === WebSocket.OPEN) { + client.close(); + } + }); + } + } module.exports = { CCRemote }; diff --git a/src/codegen.js b/src/codegen.js index 05d4d17..7bcb46b 100644 --- a/src/codegen.js +++ b/src/codegen.js @@ -38,7 +38,13 @@ const uploadUpdateProgress = () => { function clientexit() { ccInstance.sendCommand("exit") + ccInstance.disconnectAllClients(); } + +function gencodeonly() { + return luaGenerator.workspaceToCode(workspace); +} + async function gencode() { document.getElementById('upload-popup').style.display = 'block'; upcurrentActive = 1; @@ -60,18 +66,25 @@ async function gencode() { return } - // upload to computercraft with remote - document.getElementById('upload-status').textContent = "Uploading code to machine"; upcurrentActive++; uploadUpdateProgress(); - ccInstance.sendCode(code); - await delay(500) + if (ccInstance.isClientConnect()) { + // upload to computercraft with remote + document.getElementById('upload-status').textContent = "Uploading code to machine"; + ccInstance.sendCode(code); + await delay(500) - // execute with remote - document.getElementById('upload-status').textContent = "Executing code"; - upcurrentActive++; - uploadUpdateProgress(); - ccInstance.runCode(); + // execute with remote + document.getElementById('upload-status').textContent = "Executing code"; + upcurrentActive++; + uploadUpdateProgress(); + ccInstance.runCode(); + } else { + uploadError = true; + uploadUpdateProgress(); + document.getElementById('upload-status').innerHTML = `Please Connect Computer to IDE.\nInstruction: Install Remote code into computercraft in github.`; + return + } // done! document.getElementById('upload-status').textContent = "Done!"; diff --git a/src/module_block_design.json b/src/module_block_design.json index fafcc30..b7cf57b 100644 --- a/src/module_block_design.json +++ b/src/module_block_design.json @@ -1,13 +1,4 @@ { - "sys_start": { - "message0": "When Code Start", - "message1": "do %1", - "args1": [ - {"type": "input_statement", "name": "DO"} - ], - "colour": 45, - "tooltip": "Not require but make your code easy to read." - }, "sys_sleep": { "message0": "Sleep For %1 Second", "args0": [ diff --git a/src/module_generator.js b/src/module_generator.js index b3a615c..b06e8a3 100644 --- a/src/module_generator.js +++ b/src/module_generator.js @@ -11,18 +11,4 @@ luaGenerator.forBlock['sys_sleep'] = function(block, generator) { var code = `sleep(${sleepfor})\n`; return code; -}; - -luaGenerator.forBlock['sys_start'] = function(block, generator) { - var docode = generator.statementToCode(block, 'DO'); - - var code = -` -function main() -${docode} -end - -main() -` - return code; }; \ No newline at end of file diff --git a/src/toolbox.xml b/src/toolbox.xml index 679bd82..16c3bff 100644 --- a/src/toolbox.xml +++ b/src/toolbox.xml @@ -46,7 +46,7 @@ - + diff --git a/src/virtualcode.js b/src/virtualcode.js index 3d706ef..2fcb984 100644 --- a/src/virtualcode.js +++ b/src/virtualcode.js @@ -39,6 +39,15 @@ var workspace = Blockly.inject('blocklyDiv', { length: 3, colour: '#ccc', snap: true + }, + zoom:{ + controls: true, + wheel: true, + startScale: 1.0, + maxScale: 5, + minScale: 0.1, + scaleSpeed: 1.1, + pinch: true } }); @@ -52,6 +61,10 @@ try { } workspace.getToolbox().getFlyout().autoClose = false; +ipc.on('export-lua-request', (event) => { + console.log("exporting lua") + ipc.send('export-lua', gencodeonly()); +}) // Save workspace ipc.on('save-workspace-request', (event) => {