diff --git a/editor/hub.ts b/editor/hub.ts index c8abb474..535f8f50 100644 --- a/editor/hub.ts +++ b/editor/hub.ts @@ -2821,7 +2821,7 @@ module TDev.Browser { var sellApps:HTMLElement; var docsEl: HTMLElement; - var apiEl: HTMLElement; + var ccgaEl: HTMLElement; var whatsNew: HTMLElement; var begginersEl : HTMLElement; //var advancedEl:HTMLElement; @@ -2845,9 +2845,14 @@ module TDev.Browser { begginersEl = toTutBtn(this.smallBtn(lf("Getting started"), () => { Util.setHash('#topic:gettingstarted'); }, Ticks.hubBeginnersGettingStarted, true)), + ccgaEl = toTutBtn(this.smallBtn(lf("Teach Creative Coding!"), () => { + Util.navigateInWindow("http://aka.ms/CreativeCoding"); + }, Ticks.hubCCGA, true)), + /* apiEl = toTutBtn(this.smallBtn(lf("API Docs"), () => { Util.setHash('#topic:api') }, Ticks.hubDocsApi, true)), + */ // this button says "Search", which means "search" not "search docs" - "Help" is for that searchEl = this.mkFnBtn(lf("Search everything"), () => { this.hide(); this.browser().showList("search", null); }, Ticks.hubChatSearch, false), this.createSkillButton(), diff --git a/generated/help.cache b/generated/help.cache index 90805625..dff7ad2e 100644 --- a/generated/help.cache +++ b/generated/help.cache @@ -3,7 +3,6 @@ "abtwc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"api\";\nmeta rootId \"Pvxrj50J41np0XDuid8EnOb3\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// API reference. #docs #api\n#main\naction main() {\n #xXOjGw5JTxlLDQe2 // {parentTopic:contents}\n #xB2bXN2KGFAR2lm4 // {priority:10}\n #VdNuf8cBJH4XUcbn // **api** stands for **A**plication **P**rogramming **I**nterface [wikipedia](http://en.wikipedia.org/wiki/Application_programming_interface).\n #fHSfp1fQeOWTGr52 // You will find the list of built-in types and actions available in TouchDevelop.\n}\n", "angli": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"game\";\nmeta icon \"controller\";\nmeta color \"#ff9955bb\";\nmeta rootId \"F18otGXDXq4l5kwcjDwwlg1w\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A library to create games with physics, life, score and leaderboard. #games\n#Ayu95FKZqA9xPdjQXSANLGvP\naction initialize(#Ef1fU1WP2dp5fv5i width: Number, #CIEvqcj84KymuPB3 height: Number) {\n #bNSXfBcyc1TlFXuk // Call this first with your game board\n #Clk2zqeLTyzvKFNp $ratio := wall→width / wall→height;\n #lHC24tGRfxpXZxgk if $width < 0 `and` $height < 0 then {\n #xZ5BAygKRsMnteqb if $ratio < 1 then {\n #Ye23loceGoB42QXd $width := 800 * $ratio;\n #XOxgQshg475aS5Hk $height := 800;\n }\n else {\n #JqNvfilYjyb1v6dO $width := 800;\n #sEmxz8ZVPjbzQaT5 $height := 800 / $ratio;\n }\n }\n #jhe41v4xeIFpAnXk if $width < $height then {\n #Qe4DsmxnWXWundDd if $width < 0 then {\n #mo0yRpxiwtI2oz42 if $ratio < 1 then {\n #sLJ2pYjNI9NO4jGv $ratio := 1 / $ratio;\n }\n #lohlOvEl2FCCHlN8 $width := $height * $ratio;\n }\n #xZv5qx7QK0pfbIwx data→\\_board := media→create_portrait_board($width, $height);\n }\n else {\n #mbaxWZ8Upqc4dY2m if $height < 0 then {\n #urxU2iGbiBiGNGbM if $ratio < 1 then {\n #xzVsM6nAQXKxe7pq $ratio := 1 / $ratio;\n }\n #Y2iBY1rS8V2IYESl $height := $width / $ratio;\n }\n #IisORl3LBXmnPKgW data→\\_board := media→create_landscape_board($width, $height);\n }\n #cpH4M20Y66Y5LRJs data→\\_score := 0;\n #ekMv5bgzPxBK4CW4 data→\\_life := 3;\n #jbZnUix7Lx1Q7ZDV data→\\_start_time := invalid→datetime;\n #w1UaCIU8Ev4ebPlb data→\\_life_txt := invalid→sprite;\n #JOr3eMPViQ4dHWhw data→\\_score_txt := invalid→sprite;\n #my4nhbFyphwdVePb data→\\_timer_txt := invalid→sprite;\n #jLtQyZzuywVmboyz data→\\_countdown_duration := - 1;\n #ZZUqmmdXH7QdhMrH data→\\_hearts := \"---;❤;❤❤;❤❤❤\" →split(\";\");\n #xKSYee6TFDQOfML9 data→\\_score_txt := code→create_text();\n #Yyg0CzGMYWO9TQ47 data→\\_score_txt→set_pos(data→\\_board→width - 132, 20);\n #CtaIZxAjWA3KSV2x data→\\_score_txt→set_color(colors→orange);\n #kTjf5SscJwSXMOxR data→\\_life_txt := code→create_text;\n #lD26N7zVYcw4OA2B data→\\_life_txt→set_color(colors→red);\n #ShXHDkMQszri4hgi data→\\_life_txt→set_pos(84, 20);\n #DF79Mzy4RLJvr5lu data→\\_timer_txt := code→create_text;\n #flUJeGo9oH4ZKL7k data→\\_timer_txt→set_pos(data→\\_board→width / 2, 20);\n #nvzUAhKiUrDNx9ua if data→\\_board→width < data→\\_board→height then {\n #tprbh6Qbs4RtbWGE data→\\_score_txt→set_y(data→\\_board→height / 10.5);\n #vo1skKgdHy2wqGAI $y := data→\\_score_txt→y;\n #xIiwhrp5beNVxp0W data→\\_timer_txt→y := data→\\_score_txt→y;\n #xRtkSt16gx2kVUQE data→\\_life_txt→set_y($y);\n #xVMKJwJbqH32RaBs data→\\_score_txt→x := data→\\_board→width - 64;\n #sftDMBB4Rc62DLVK data→\\_life_txt→x := 64;\n }\n #lVFXy8tvC2YO5VaY code→set_score(0);\n #u1GLYt6g45euiwLd code→set_life(3);\n meta private;\n}\n#xW5SJ4MKJ44wSSDVuZgZG3iS\nvar \\_board : Board {\n transient = true;\n}\n#oKY8zayGQ3QsufrQiKXXS9sh\naction set_score(#xNzj5Tyy4ubd9CTJ value: Number) {\n #PK9RS22fUTIwMlpW // Sets the current score\n #jia5eGpMgyK70yu7 data→\\_score_txt→text := math→ceiling(data→\\_score)→to_string;\n #xQiqEsIGlVBWEId8 data→\\_score := $value;\n #xolTOrWos40PlDsI if data→\\_score < 0 then {\n #x6X2fk4vDwHtW7kW data→\\_score_txt→hide;\n }\n else {\n #jdbScDz352fC51ZD data→\\_score_txt→show;\n #xK4S7FrNcjoVbrXT $anim := data→\\_score_txt→create_animation;\n #xvRwFDBdhXE6rfYC $anim→text(1, \"cubic\", \"inout\", math→ceiling(data→\\_score)→to_string);\n }\n meta sync;\n}\n#l4svuo4DZFDcDqJbGklzHLTi\naction set_life(#Od5XHbEXJ6mWwB8S value: Number) {\n #jJNGIzmWCGL9Ye5S // Sets the current life points. Set as negative or zero to end the game.\n #HrH1awtB4sa44j1P data→\\_life := math→max(0, $value);\n #KKSJ0NQA0LL2KCCt if data→\\_life ≤ 0 then {\n #UPv3xvSjaIsOHLKO code→evolve;\n #O8ZDpX4rPiqIH7PJ code→end;\n }\n}\n#xR8UEUDLaI6qbCw4GQtfFiwQ\naction start_timer() {\n #PY2vofNQd2BKaT5s // Starts a stopwatch timer\n #lh5CUs6TzxANutck data→\\_start_time := time→now;\n #SOklrsSACxtSyTFU data→\\_countdown_duration := - 1;\n meta sync;\n}\n#uCawjS8UtYJd1W4TZkrVvAE7\naction start_countdown_timer(#sXGZbgouHWzZbxDx seconds: Number) {\n #Y1MYOM224FH40w2J // Starts a countdown timer starting at second.\n #UNJ3mVD9lmnoyJtS // {hints:seconds:30,15}\n #xrYxMpoChJ3q8C4C data→\\_start_time := time→now;\n #xpOkBULYOyu5K6ol data→\\_countdown_duration := $seconds;\n meta sync;\n}\n#YXmGOuliQ2RYyUc3NtRv9DNE\naction life() returns(#ngP5T2tPSB4Euoev r: Number) {\n #xF0BpscALdWMIeMq // Returns the current life points. Negative if not set.\n #X5WbD4tx2QCjM0xZ $r := data→\\_life;\n meta sync;\n}\n#xubkD4SENn7AllzejMhYSTOV\nvar \\_life : Number {\n transient = true;\n}\n#lp3pSLpGr7O3RGbDzuSQiJ5m\nvar \\_score : Number {\n transient = true;\n}\n#xleVEbMbZTbU7BJfeUMUPpMk\naction score() returns(#x2cmZgt88Gtfc90g r: Number) {\n #ZXZChxtbZJ7VM49L // Gets the current score; negative if not set.\n #eM5HsVUk3W4Wjmar $r := data→\\_score;\n meta sync;\n}\n#TzLNjDeJYpMRpdgNFuqgE2PY\nvar \\_start_time : DateTime {\n transient = true;\n}\n#gswamj84uYSwqLED2VvLdKi6\naction evolve() {\n #V02U4MCe9H2MP9DW if `not` data→\\_board→is_invalid then {\n #xtVboJorI0AoA2Ll data→\\_board→evolve;\n #ZyuqlVaK8jZ4RcTi if data→\\_life ≥ 0 then {\n #Zzh3zjzuxyYn2f3X code→evolve_life;\n }\n #fr31zBhiCvv05kR8 if `not` data→\\_start_time→is_invalid then {\n #Im49UQ654OeS2n44 code→evolve_timer;\n }\n }\n meta private;\n}\n#pHEIAaLyqWXgpyUd6dIeYp2X\nvar \\_life_txt : Sprite {\n transient = true;\n}\n#UMupj4ChNfQ8E2uvW694p1tX\naction create_text() returns(#HsWcsHa430EovY0o r: Sprite) {\n #r2pD3YM0AhwqdeoJ $r := data→\\_board→create_text(100, 20, 28, \"\");\n #DfUPvQHARvqZmkPa $r→set_z_index(1000);\n #xvp7IxArcVElQk4H $r→set_friction(1);\n #Sh16Yvgqws3F2ttd $r→set_color(colors→foreground);\n meta private;\n meta sync;\n}\n#XjXM7AL67NDGlzsZgg9s44uq\naction evolve_life() {\n #x69dm0I2qdoTbeEa $l := math→ceiling(data→\\_life);\n #MkDJrwcWdlaEAj5i $s := \"❤ \" ∥ $l→to_string;\n #NnjfQ48F1IZTeEU4 if $l < data→\\_hearts→count then {\n #xUcDUL43eSf74Few $s := data→\\_hearts→at($l);\n }\n #Bv24Vr22toZdfAsj data→\\_life_txt→set_text($s);\n meta private;\n meta sync;\n}\n#PojbQsm32lz5k054APQR8Jb1\naction evolve_timer() {\n #tSYdAJQ9rmGX28Ph $elapsed := code→current_time;\n #zaYbaDOnN52N0y3T data→\\_timer_txt→set_text(math→round_with_precision($elapsed, 1)→to_string);\n #x5HB6TM2gE95ePes if data→\\_countdown_duration > 0 `and` $elapsed = 0 then {\n #M7CIY2SvsjyqZLbG code→end;\n }\n meta private;\n}\n#AejJAmPMk38UG2URZk5hXYh6\nvar \\_score_txt : Sprite {\n transient = true;\n}\n#x2fjfvNmVawvnAWKndzdfxls\nvar \\_timer_txt : Sprite {\n transient = true;\n}\n#x4cIV8c7P0QJsADCfcHm2ApY\nvar \\_countdown_duration : Number {\n transient = true;\n}\n#xK9ECxOm926KPUxdhlTtnYMl\naction example() {\n #akMbxF0YpXNsigw2 // This library lets you build a game with a physics engine, life, score and leaderboard.\n #EsTTE4EYqiiR5mR9 // Let's start by creating a board which we will use for the demo.\n #u3XIthRzNcrktgqo $board := code→start;\n #CB9rVzyFARPTw2L6 // You can use the board as usual.\n #a0rtwTn2G2kZoHic // * you can force landscape or portrait by using `code->start landscape` or `code->start portrait`.\n #HiLltZT9c8Ny7H2E // ### create sprites\n #EP9EIWqKvuc1cX6e // Use ``create sprite`` to create a new moving sprite of width 100.\n #xyZg3wDu5wWFWdW2 // {hide}\n #oPJA0VM7q3Dq7ZEE $pic := media→create_picture(480, 800);\n #iW2dZelc5Tuo2vJY // {/hide}\n #Ng4pLvKyecQ91WR4 $sprite := code→create_sprite($pic);\n #x2HgaAq5uHrc3P8X // ### scores\n #x3VS2BYISO2aappr // Simply call `set score` to display a score on the top right corner of the board. You can use `score` to get back the current value of the score.\n #pMoWowx4j3FkFkkQ code→set_score(3600);\n #Nb4rWtolHuG8aQWe // You can also update the current score by using `add score`.\n #nY0cqPKJNNGoYg2f code→add_score(100);\n #x42VU0bH4Y18mgZ3 // ### life indicator\n #LdsjDYMx4YCgdsld // Use the `set life` action to display a life indicator on the top left corner of the board. You can use `life` to get back the current value of the life.\n #EiPgaOurEAlcymkM code→set_life(1);\n #g9R26zu52v8nG4Lv // You can also update the current life by using `add life` or `remove life`.\n #iuvGvo404RGhd1ty code→add_life(1);\n #x2gRSkPtHp9KAAJY code→remove_life(1);\n #e9hK3ZG8eO2Uue8K // You can hide the life indicator as well.\n #s7Ov2CH1qy9FYASs code→set_life_visible(false);\n #bgcEN9gqslrdaO1M // ### timers and countdowns\n #xt4bAYcodWe3qqgS // You can also display a timer by calling `start timer`. You can use `current time` to get the seconds elapsed since the start of the timer.\n #OSsbR8gZWen9tVtk code→start_timer;\n #dFee6Un3iogCKg9q code→start_countdown_timer(10);\n #ukkrid8JC6KKttr4 // ### game over\n #PWb2EFMyS7uuvzFr // Use the `end` to finish the game\n #d4L7G4RdnmxEcHRl code→end;\n #rCcoUqTjtzJB1J3X // ### splashing text\n #YbAUazcKVtV6qku3 // A quick and easy way to display text to the user.\n #WQDnU04vr3fiktQi code→splash(\"Get Ready!\");\n #DRe04VIIWS4rwYnQ // ### parralax background\n #Gi8A6YOMZ7dX42ho // Use ``set background scene`` to create moving backgrounds\n #S2ZNHTg3eKNYn9DK code→set_background_scene(\"horizontal\", $pic);\n meta private;\n meta test;\n}\n#q4EB482ElguyYpuPEwTgQQ4e\naction current_time() returns(#Fh83zvcS14ZK6jNA seconds: Number) {\n #BFdsvunZH1UbuS9L // Current time in timer\n #C4ggpXXT0fM11xJ2 $seconds := time→now→subtract(data→\\_start_time);\n #hAkzFccDnEQ4eexF if data→\\_countdown_duration > 0 then {\n #xlavYFgnlGubTeEu $seconds := math→max(0, data→\\_countdown_duration - $seconds);\n }\n meta sync;\n}\n#emzufgdY6lsG2RaaCYaxwN8m\nvar \\_hearts : Collection[String] {\n transient = true;\n}\n#xINhkUFpWzhMPF0ROZX4TSm4\naction add_score(#tAQjhhYZ8ziBD6ez value: Number) {\n #L8MM1n5h3tJq4MAH // Adds value to the current score. Value can be negative.\n #ZwhiUoPbRzDmYy7b // {hints:value:1,10,100}\n #VurwTOF3FLa4ejcU if $value > 0 then {\n #dvQS5eDbxUvHojRk code→set_score(data→\\_score + $value);\n #sfOOtfKb4Xf1BwcX if $value > 1 then {\n #l3wCIj7Pgnwwaxa6 $sprite := code→create_text;\n #SpicJAYTeJmiPCCz $sprite→set_text(math→ceiling($value)→to_string);\n #jsbm2wkw4a611R5L $sprite→set_pos(data→\\_score_txt→x, data→\\_score_txt→y);\n #xoIUTQpKKecgzCBQ $sprite→set_color(data→\\_score_txt→color);\n #A2Yn5zDjzdNo1bNy $anim := $sprite→create_animation;\n #QTO5DnOJkIqirrb8 $anim→puff_out(0.5, \"cubic\", 1.5);\n #A4CmMqj3KJAY3UGU $anim→delete;\n }\n }\n meta sync;\n}\n#l0buJlsN2iCiTbJPwUwTGWmO\naction add_life(#i5ReduzYFUpLFhbF value: Number) {\n #xFocNGxUz72Py6Dg // Adds the value to the current life. Value can be negative.\n #JBypj2Ez1thEbbpC // {hints:value:1}\n #t429gQZTs2Mi64fg code→set_life(data→\\_life + $value);\n}\n#ods2ZuwV9xHaiO5pElQlNyaE\naction clear_timer() {\n #xIt9uxPUZm1DfVjP // Hides the timer.\n #Ra8ZWiOP7bWzSa21 data→\\_start_time := invalid→datetime;\n #UvLafUxbxNZwvjGp data→\\_countdown_duration := - 1;\n meta sync;\n}\n#qoY1RsaFEb0jJJuZq8SkbAp3\naction remove_life(#R2JXjstC7H6C2I7d value: Number) {\n #UDbb3xUmllgAFfrm // Removes the value from the current life. Value can be negative.\n #BOunFP4tltU9M437 // {hints:value:1}\n #YQ51m4VCvuQWTj3G code→set_life(data→\\_life - $value);\n}\n#a14qLDjp7EtajVvdEd1rS18X\naction end() {\n #Ty1H9yFvz689uQKb // Displays a game over animation and finishes the game.\n #GEyVdP7gHEhMYuLh if `not` data→\\_board→is_invalid then {\n #PNm4kHsAAvLeTCPN if `not` data→\\_end_event→is_invalid then {\n #OmNZGM9KWiapFko7 data→\\_end_event→run;\n #xKYF8z0LLaVOQks4 code→reset;\n }\n else {\n #oCdsISU82CsuPzFb if data→\\_score > 0 then {\n #ckNPHuv2TzqnX5lX bazaar→post_leaderboard_score(data→\\_score);\n }\n #WX2o7oS0pkjUgsJI code→game_over;\n #ovm0Qx6hi7RraNH6 if `not` app→script_id→is_invalid then {\n #ixtnMJPUsyivodZ2 app→restart(\"\");\n }\n }\n }\n}\n#rUM4WD97vl3DCMmQPvBzb6jc\naction start() returns(#AbFPR1tINAAIzPii board: Board) {\n #cuJu2Z9VQgHn4Yzb // Creates a new empty game board and shows it on the screen.\n #itfyVKsFJ72c4STK $board := code→start_with_fixed_size( - 1, - 1);\n}\n#joFUGC04wxnpsBuC02e32Cvy\naction game_over() {\n #bR2JRRWa79KdtZFj $message := \"game over\";\n #M2lvKKOoUSyjBCSv $text := data→\\_board→create_text(200, 40, 40, $message);\n #JMxAY8MaxP9BJkYm $text→set_opacity(0);\n #G0kMTi3FwR2Te2TL for 0 ≤ i < 720 / 5 do {\n #x8gGwdunz5TOunUX $text→set_opacity($text→opacity + 0.05);\n #UZreYUZJfIfRGKib $text→set_color(colors→random);\n #ceUd1V8yfqAFQqBu $text→set_angle($text→angle + 5);\n #x92Ig40jCZ7U1SyU data→\\_board→update_on_wall;\n #tZWU4KGKKBKVwDn8 time→sleep(0.02);\n }\n #TU2xkLuKEQOh3DbW time→sleep(2);\n #cMsaragG8BtT1kXr $text→delete;\n #uRIMBM6HQm2N2Nxd data→\\_board→update_on_wall;\n meta private;\n}\n#Kv3t1TJgZdpYJpx9reGXtTW2\naction reset() {\n #ypVAHbhYCLxfGrbY // Resets the game engine\n #xLdUoT2qnoqxmytB code→clear_board;\n #JuuhG6ReNJxwspTc data→\\_end_event := invalid→@action;\n meta sync;\n}\n#XQPjg13t37zIEtpt44U6ff92\naction start_with_fixed_size(#x5Z0dR2qabb82pDA width: Number, #vP71QeZJBImfaq42 height: Number) returns(#QOzAYblVxQIXVsKF board: Board) {\n #GIkGM27wDa43LVsh // Initializes the game engine with the given size and returns the game board.\n #xnuJIIH3pQuwhAsw code→clear_board;\n #xUWsaURY4G0KHWcS code→initialize($width, $height);\n #CctsikpPaxGUdxUU data→\\_board→add_on_every_frame($perform);\n #NGgspE16GddTzQpD where perform() {\n #iAVXIMARzmZHG9C4 code→evolve;\n #xp5Ar4dvRYXdJEWH if `not` data→\\_board→is_invalid then {\n #KatnpCQDlegi4a82 data→\\_board→update_on_wall;\n }\n }\n #nggfDbuDWSW8HkO7 data→\\_board→post_to_wall;\n #qe89fHKQxAlM428p $board := data→\\_board;\n #rmmerjSOecJSwDqC app→log(\"game: end initialize\");\n}\n#A69js6TDtOSLAIAQQr6S33zC\naction start_with_background_picture(#IqRuFOf9jijyzGQ6 pic: Picture) returns(#qgW4pkhngSp9yx4t board: Board) {\n #DYuQdVsO2gdze4RK // Starts a game engine with the picture as background\n #KhZxjKvfIr4UkTpf $board := code→start_with_fixed_size($pic→width, $pic→height);\n #x6Z3xF23v2lYG3F2 $board→set_background_picture($pic);\n}\n#y5RrO2ILX7gVIvFQMpo6XjGo\naction board() returns(#y28JfFz47DWDtngG board: Board) {\n #bnTv8HRMWLtLAU9q // Gets the current game board for the game. Invalid if game not started.\n #nXVJcphXOyIll9oE $board := data→\\_board;\n meta sync;\n}\n#Eu2dngMaA73jYqD6d0u8iCju\nvar \\_end_event : Action {\n transient = true;\n}\n#xTv6Ulq3EWIRTV6f6oXlbDh9\naction on_end(#xPcQEigjfypzEgie body: Action) {\n #hs2S4pK5luKS7Yx7 // Attach code to run when the game ends. Overrides the default behavior.\n #AYzAMJdPbb22r3I4 data→\\_end_event := $body;\n meta sync;\n}\n#Xd5cD2v2HyMBTyiuwycN9lHa\naction test_on_end() {\n #y2RQOSjYPHCmTn7j code→on_end($@action);\n #XjIoI4kD9LlHrUVX where @action() {\n #fg4t4cENnu22YDnm wall→prompt(\"on end called\");\n }\n #xWqn6Z7usZe5uNhV code→start;\n #xVxjo0kGpkT8Gdob code→end;\n meta private;\n meta test;\n}\n#xOu0vfXrzi94ugA9AcysN2bf\naction test() {\n #mdU4UX4XMXiUvcqM $board := code→start;\n #hyMg45fVM9c4Ek5p $board→set_gravity(0, 200);\n #YeRPrdEXM3lGGTde $board→create_boundary(0);\n #QpoVJddHOtkHw28b $sprite := $board→create_rectangle(20, 20);\n #px6QNcegyYne2apd $sprite→set_color(colors→random);\n #xOLydxzUemgYcA0F code→add_score(100);\n meta private;\n meta test;\n}\n#xpQAnETcU9aowS6g7p1qZZbf\naction clear_board() {\n #otzjU0KwlOeyFv7W if `not` data→\\_board→is_invalid then {\n #xb2iFSOWUmUxd3BO data→\\_board→clear_every_frame_timers;\n }\n #znTtVcKS99o5PuwK data→\\_board := invalid→board;\n meta private;\n meta sync;\n}\n#eIngK72C8H06n0lzszL8yaCm\naction start_landscape() returns(#vGhNIEVWNjf2DMe1 board: Board) {\n #DiW6QoP2oFAWHrdh // Starts a new landscape game\n #or2RSf2CvyV9CGi5 $board := code→start_with_fixed_size(800, - 1);\n}\n#sYve2cIuyW1MMqF3aRO2OZyU\naction start_portrait() returns(#dNtnzA61nztVz7ly board: Board) {\n #RUqcBdXLfT3WLwtI // Starts a portrait game\n #sKZshpWP91TKnlmc $board := code→start_with_fixed_size( - 1, 800);\n}\n#OMEJVlEdU2VpPg82GXpsMZTs\naction set_hud_colors(#ym5U3Gn6Cgc734j4 life: Color, #Ze4lgB3HYaEPaQms timer: Color, #x8GuNE6MswGyW8e8 score: Color) {\n #IQSX7p2v7ihFyRgW // Sets the text color of the life, timer and score text in the head-up display (hud).\n #xdJOASojRtIrV28p data→\\_life_txt→set_color($life);\n #YSRB5T5tGLdTpN6M data→\\_timer_txt→set_color($timer);\n #NRXdOMJdrV4Ktx6J data→\\_score_txt→set_color($score);\n #N8WL5zaLyqFuS7r6 data→\\_board→update_on_wall;\n meta sync;\n}\n#OSUi7mcMXLLJLfNRTez0CgSV\naction hud_sprites() returns(#xS4wU3OeXU6RjZLi sprites: Sprite_Set) {\n #xP1yJJaa18LnCHT0 // Gets the sprites used by the game board to display the head-up display.\n #ICC48H9UA4IZRlyg $sprites := data→\\_board→create_sprite_set;\n #xxzXIsbzTviF5El6 $sprites→add(data→\\_timer_txt);\n #Vx4vvyPFYOWBU33f $sprites→add(data→\\_score_txt);\n #ae9F20KA4qLwlsQG $sprites→add(data→\\_life_txt);\n meta sync;\n}\n#xoAgK46gsSE32UIau4PsRlbw\naction test_score() {\n #INflARm2bc0ire1B $board := code→start;\n #nQ3jWN002Btc09h0 $board→set_debug_mode(true);\n #v7lsr4cRsspdWafA $board→on_tap($tapped);\n #hfu0GsIcIHTumLfm where tapped(x: Number, y: Number) {\n #PI1IuG3owK4henhk code→add_score(100);\n #xWY0qUyGfdmcoj3E if code→score > 1000 then {\n #xmr1ny8p58MtPfHb code→end;\n }\n }\n meta private;\n meta test;\n}\n#qScd7vJgHvp5y6wWRmglDahb\nvar x : Boolean {\n transient = true;\n}\n#QakFM2TVyNr4ziDe1asYvARy\naction life_visible() returns(#AUsSkrVIQdg5hKUl b: Boolean) {\n #xoeItkItCNLhf6tS // Gets a value indicating if the life is visible in the hud.\n #rX1u2cGvGpIlH5cv $b := data→\\_life_txt→is_visible;\n}\n#gf2b0Sz627NLlyAFFj4MeOic\naction set_life_visible(#JTLRihoxN8cxPQ43 visible: Boolean) {\n #sD4OBtrspT0Uh0k8 // Controls the visibility of the life counter.\n #kBruCITydNqICsgy if $visible then {\n #LY35FhMwu25cQBYw data→\\_life_txt→show;\n }\n else {\n #xAsc32ZmZ4mDOFhj data→\\_life_txt→hide;\n }\n}\n#sbBwOOYCaN7mUaF0ZlZyxAYU\naction sprites() returns(#xX6pkmdt8a5KVNiS sprites: Sprite_Set) {\n #xc0QtpSbTXh1GwCV // Gets the sprites of the board, excluding hub sprites.\n #Scb2mfgsd1z4R2G8 $excluded := code→hud_sprites;\n #ws52NEnvj9qCKGjx $sprites := data→\\_board→create_sprite_set;\n #CWr1flThpV1vp2cs foreach sprite in data→\\_board\n #jcgSowlf2GnOKbqi where `not` $excluded→contains($sprite)\n do {\n #SqHBUc15dLrI44tQ $sprites→add($sprite);\n }\n meta sync;\n}\n#x8hRsIT9CAZerwKF\naction set_background_scene(#xxFyAjWYlZqmsd2c direction: String, #xWDQ4yQUS8QWIm2G pic: Picture) {\n #b4qYeJJV5fXmlqL2 // Sets the background picture and the speed of the background.\n #fDC7OSyUxOtiQToM // {hints:direction:horizontal,vertical}\n #cXnTiVb5rm0qSDSX $b := $direction→trim(\" \\t\")→to_lower_case→equals(\"horizontal\");\n #FjQX2QH2ZqBHBOpO $scene := data→\\_board→background_scene;\n #xbEzCcsY22RoPtXj $scene→clear;\n #S7bkh6r4pVcHgV8c $pic := $pic→clone;\n #VxjO3KnRByvOLvVK if $b then {\n #U2a67VkZZO12op2U $pic→resize( - 1, data→\\_board→height);\n }\n else {\n #p7Io8ZWoL2G6yL92 $pic→resize(data→\\_board→width, - 1);\n }\n #ozFKGP79IQraapHB $layer := $scene→create_layer(0, $pic);\n #eGk2b4ExeTM73Kg5 if `not` data→background_scene_move→is_invalid then {\n #TrbtdU7nPhE4r4tN data→background_scene_move→delete;\n }\n #lAeYACw4EOAzqkI9 if $b then {\n #LZGihYJA823COO24 data→background_scene_move := data→\\_board→add_on_every_frame($perform);\n #dDXqnuq6ZX0XYuiq where perform() {\n #OpD6ZCcvZ2IeZrER $scene→view_x := $scene→view_x + 1;\n }\n }\n else {\n #wzNI5zIvycykPz4e data→background_scene_move := data→\\_board→add_on_every_frame($perform);\n #CcNlh4HGCmc6EI44 where perform() {\n #xRSy4Rcl9aKAtAcs $scene→view_y := $scene→view_y + 1;\n }\n }\n}\n#oJd6t0JYUca8Bpha\nvar background_scene_move : Event_Binding {\n transient = true;\n}\n#x7LNZH9OJJV4MHMQ\naction bounce_on_sides() {\n #zDu3lJNCaInFBCJs // Makes all the sprite bounce on thee border of the screen\n #xa1tv4gUnH7S5toZ data→\\_board→create_boundary(0);\n meta sync;\n}\n#xi31jXN7f2tym77g\naction create_sprite(#U0MZEHjiclDl3NQR pic: Picture) returns(#nXzTwbGcDPXL4IbM sprite: Sprite) {\n #DHXP2H45qOOljGtB // Creates a new sprite of width 100 with the given picture.\n #PvmYHlhdUQ7SCbU9 $sprite := data→\\_board→create_picture($pic);\n #foFswt2QK0q4XHqB $sprite→set_width(100);\n meta sync;\n}\n#x7Vz1ZmH6VcaJlua\naction splash(#hGCLHQNWZiNWtoh5 message: String, #xW09NdgistI7i5VL options\\u003f: * Splash_Options) {\n #xBgJYP0JkLV8vLsu // Shows a full screen splash message and goes away. Does not block the game loop.\n #iAbTUBn5UnH02hT4 // {hints:message:Get Ready!}\n #xucGFQ2aCONYJsj4 if $options\\u003f→seconds < 0.5 then {\n #Gl9svYaw9KPAtSD4 $options\\u003f→seconds := 0.5;\n }\n #xpgOw6sO8dWNOiDI if $options\\u003f→foreground_color→is_invalid then {\n #bj1pifyWf1UD3vf6 $options\\u003f→foreground_color := colors→white;\n }\n #YlwAvzjiiCuLvRbQ if $options\\u003f→background_color→is_invalid then {\n #xhto7QFnl6G4cIiu $options\\u003f→background_color := colors→random→darken(0.5);\n }\n #D2gJ2aRY7G1Wgqwj $back := data→\\_board→create_rectangle(data→\\_board→width, data→\\_board→height);\n #xQBmIbQZArDQK1DL $back→set_color($options\\u003f→background_color);\n #utiWa6diuPaMt7qw $back→set_z_index(1000);\n #xzEFpi614YiD4AOU $text := data→\\_board→create_text(data→\\_board→width, 2, 60, $message);\n #sgtqZkFVB2yypxiX $text→fit_text;\n #N9uLwv3sSMul5KTd while $text→width > data→\\_board→width * 0.8 do {\n #GdP3sZefFfld8d63 $text→set_font_size($text→font_size * 0.8);\n #QtElLFuIFqofqV4L $text→fit_text;\n }\n #xa0j4MSSRICa1yCV $text→set_color($options\\u003f→foreground_color);\n #x2deRPjfZc5imD1G $text→set_z_index(1000);\n #KQFtfPZJutultOrV $text_anim := $text→create_animation;\n #mqUe7l7KIaVRCE9J $text_anim→sleep($options\\u003f→seconds);\n #nXXLe2bQSf5s97tR $text_anim→puff_out(0.9, \"cubic\", 1.5);\n #xmMpx7kl2Z6wGX5k $text_anim→delete;\n #sclwDHGL3pYC7I8g $anim2 := $back→create_animation;\n #xC2LFDuonXynWnZs $anim2→sleep($options\\u003f→seconds + 0.7);\n #IwAHdtxZYXAd7Ixk $anim2→fade_out(0.2, \"cubic\");\n #vb92LcxyqpOkvWXT $anim2→delete;\n #UZh2uFuZx5M69gXr $anim2→wait;\n}\n#BVGhpbmca\ntable Splash_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #X13V3PCWTQpT2ORT seconds : Number\n #nk8FBg8KCO4gn30S foreground_color : Color\n #Tl89ovYzNYTzCj6A background_color : Color\n }\n}\n#xitA6AzKCSj7jr14\naction test_splash() {\n #mH4n647I6RX3Pr0d $board := code→start_landscape;\n #dO1aUG4TA9Z6hrt1 skip;\n #QWfn57z2DhlT2JFV code→splash(\"Get Ready!\");\n #nShZjozF46reKDxU code→splash_text(\"Get Ready!\", 0, colors→random, colors→random, $done);\n #OX0tEUwVeQVbnx2b where done() {\n #jEks25QODvuCIWKX skip;\n }\n #SoAL1SvMMRt4XNCx code→set_hud_colors(colors→random, colors→random, colors→random);\n #fAgXJrzKv1FbXVTL code→start_countdown_timer(10);\n #Xj7upwlsgslQ7u7c $board→add_on_every_frame($perform);\n #x78Ey3ZT5canzl7t where perform() {\n #i39JaH9PgBaGdUyO code→add_score(1);\n #ltYm4Dte7zDTreVg code→add_life(1);\n }\n meta private;\n meta test;\n}\n#VrNBbzfR0J7q4E3C\naction splash_text(#CA9uMnMJb89YJMbC message: String, #fxC4ka8ITNRb2qGo seconds: Number, #xdE0PK79kjesmqlt foreground: Color, #RuH75z7IkGHd1s42 background: Color, #WjisPpt6qlTfZgdt done: Action) {\n #AT4CUHz7jETg7hzm // Shows a full screen splash message and goes away (obsolete, use ``splash`` instead...)\n #MJjiPyY8duIetPrr // {hints:message:Get Ready!}\n #aOnY2ZFsfdmQ4vys code→splash(\"Get Ready!\");\n #WJm64gJJ5a32uvrS where seconds := $seconds;\n #x6gdQ1QvLIYvWifu where foreground_color := $foreground;\n #BBN4zp8KQ0yoX4P0 where background_color := $background;\n #xKaH5mqhj84r6aeW $done→run;\n}\n", "apfwa": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blog\";\nmeta rootId \"xWuFaE2vZzUwxkHBZgQ9b4Le\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// All the info about the TouchDevelop blog. #docs\n#mZUeD39600MonBqw\naction main() {\n #YGfAkXjDa3ak2Z7x // {parentTopic:contents}\n #h3xZv3nxc55Ty7qp // The official TouchDevelop community blog is hosted at\n #PJB2w8bkCOOKQPNI // > [](https://www.touchdevelop.com/blog)\n #ewje63A7NtIOj48b // The blog is written by the team members and hopefully soon invited community members. All posts are written in TouchDevelop itself as documentation scripts and pulled by the cloud.\n #xjWg4oNJPpQk7NCe // ### how to write a blog post?\n #o2UVZjWDSQ3hmrpH // All TouchDevelop blog posts are written as TouchDevelop scripts. This allows to create beautiful posts mixing code, images and videos.\n #DDm9sGQNW61IKOsm // * create a new script\n #OAQd72IqjonsmtAk // * add ``#docs #blog`` hashtags to the description.\n #JwnC7pjlA6foqnhv // * add this comment ``{parentTopic:blog}``\n #xXhkz5licxZ0M2TL // * don't forget fill the description: it will be used as a summary on the blog landing page\n #NFZBF4LHpxf21fAg // * don't forget to finish your user profile: set a picture, web site and twitter handle if any.\n #I2L8NHb4FdS9pM6s // When you are ready, publish your script and [send us a message](mailto:touchdevelop@microsoft.com) with your blog post script id. we will review it to see if can be posted on the main TouchDevelop blog.\n #xElV25rsIkDkEftt // ### previous blog\n #NjNG49vP0WyJFucd // When TouchDevelop started, we used Nikolai Tillmann's blog on MSDN. You can find all the previous TouchDevelop entries under\n #xa4VqROkVCZesJsC // > [](http://blogs.msdn.com/b/nikolait/archive/tags/touchdevelop/)\n #vkjQ3q6N7IxIs2MC // * [TouchDevelop: Hour of Code™ 2013 tutorials](http://blogs.msdn.com/b/nikolait/archive/2013/11/26/touchdevelop-hour-of-code-tutorials.aspx)\n #v9K8lBTJClfpcsEx // * [Announcing contest winners + TouchDevelop v3.2: Interactive Tutorials](http://blogs.msdn.com/b/nikolait/archive/2013/11/19/announcing-contest-winners-touchdevelop-v3-2-interactive-tutorials.aspx)\n #x4bDUliWx0MQYocZ // * [cloud data for TouchDevelop released today](http://blogs.msdn.com/b/nikolait/archive/2013/10/28/cloud-data-for-touchdevelop.aspx)\n #R2lmiXq0xPiLx47a // * [Microsoft Touch of Summer 2013 Contest](http://blogs.msdn.com/b/nikolait/archive/2013/10/17/microsoft-touch-of-summer-2013-contest.aspx)\n #XXdtxOaF1NycbeBz // * [Announcing TouchDevelop v3.1: Bluetooth, pin to start, Radio, debugger, profiler, insights, tutorials, videos](http://blogs.msdn.com/b/nikolait/archive/2013/09/19/announcing-touchdevelop-v3-1-bluetooth-debugger-and-more.aspx)\n #PA12Z5Phg6z4jUKf // * [Debugging TouchDevelop scripts](http://blogs.msdn.com/b/nikolait/archive/2013/07/10/debugging-touchdevelop-scripts.aspx)\n #yg656Chmpqbme2nz // * [Announcing TouchDevelop v3.0 for Windows Phone 8: unified experience, new language features, NFC, speech and tile APIs](http://blogs.msdn.com/b/nikolait/archive/2013/06/28/touchdevelop-v3-0-for-windows-phone-8-unified-experience-new-language-features-nfc-speech-tiles.aspx)\n #xaO2uAXiKFGcWLYj // * [TouchDevelop v3.0 beta for Windows Phone 8](http://blogs.msdn.com/b/nikolait/archive/2013/05/14/touchdevelop-v3-0-beta-for-windows-phone-8.aspx)\n #x9F2jBCSAtNXu9Kl // * [expanded device support](http://blogs.msdn.com/b/nikolait/archive/2012/11/27/touchdevelop-create-apps-on-ipad-iphone-android-in-addition-to-pc-mac-windows-phone.aspx)\n #J27g7K92fT9Fe4TF // * [Web App Preview](http://blogs.msdn.com/b/nikolait/archive/2012/10/22/announcing-touchdevelop-web-app-preview.aspx)\n #DZlLfb8eB519gc1x // * [v2.10](http://blogs.msdn.com/b/nikolait/archive/2012/08/28/announcing-touchdevelop-v2-10-tutorial-videos-code-synthesis-trace-replay-and-more.aspx), [v2.8](http://blogs.msdn.com/b/nikolait/archive/2012/05/26/announcing-touchdevelop-v2-8-structured-datatypes-tags-better-pages-buttons-api-search-featured-screenshots.aspx), [v2.6](http://blogs.msdn.com/b/nikolait/archive/2012/02/21/touchdevelop-v2-6-enhanced-user-profiles-libraries-access-devices-in-your-home-network-and-more.aspx), [v2.5](http://blogs.msdn.com/b/nikolait/archive/2011/12/20/touchdevelop-v2-5-new-tutorial-artwork-forum-and-more.aspx), [v2.4](http://blogs.msdn.com/b/nikolait/archive/2011/11/11/touchdevelop-v2-4-push-notifications-updates-discussions.aspx), [v2.3](http://blogs.msdn.com/b/nikolait/archive/2011/10/07/touchdevelop-v2-3-for-mango-pin-to-start-for-scripts.aspx), [v2.2](http://blogs.msdn.com/b/nikolait/archive/2011/09/13/touchdevelop-v2-2-tutorial-mode-improved-code-editor-events.aspx), [v2.1](http://blogs.msdn.com/b/nikolait/archive/2011/08/18/touchdevelop-v2-1-integrated-script-bazaar.aspx), [v2.0](http://blogs.msdn.com/b/nikolait/archive/2011/08/02/announcing-touchdevelop-v2-0-beta-script-sharing-in-the-cloud.aspx), [v1.1](http://blogs.msdn.com/b/nikolait/archive/2011/05/02/touchstudio-update-v1-1-beta.aspx), [v1.0](http://blogs.msdn.com/b/nikolait/archive/2011/04/09/announcing-touchstudio.aspx)\n}\n", -"ckbk": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"teach\";\nmeta rootId \"rfFWOBXKYWbKL3882OCwIeVx\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Teaching with TouchDevelop. #docs #teach #education\n#sJti4PgyaJBMZl5Xa5UMimxW\naction main() {\n #K1y28DAXzlzjVqnx // {parentTopic:contents}\n #sYkQiq3Kz6SzmixV // {priority:100}\n #VE3zvfX2r4Slzd0O // TouchDevelop makes it fun to learn (and teach) programming skills. This section has lots of ideas for using TouchDevelop in the classroom.\n #A6eQBe2sSnp2lUqk // * **Are you a teacher? Join the [TouchDevelop Teachers group](#pub:sxlktprb)!**\n #xQ6nypfXFlgBD7VZ // ### resources for educators\n #iTqjubSk3ck5JnQE // * [Hour Of Code](https://www.touchdevelop.com/hoc) - all the information to run an **Hour Of Code** with TouchDevelop\n #bBTHXKtvHh3YgmNL // * [](/courses) — choose from different curriculum to teach about mobile app and game creation\n #xbbpj2AABJzoZacv // * [](/tutorials) — step by step tutorials to build games and apps\n #Hd33r1xwwgD7qsD7 // * [docs](/contents) — the built-in documentation\n #qQqt5pFCKhlqbNUX // * [](/book) — currently available for free online; systematic introduction to all basic concepts\n #OPjd1hyHfJ39XbW8 // ### environments\n #lLBw4hzsB8IpuVx9 // * The **TouchDevelop Web App** runs in [most modern browsers](https://www.touchdevelop.com/app/current.browsers).\n #Z4En3ihiQz4Dcdfi // * The [TouchDevelop Windows Phone app](http://www.windowsphone.com/s?appId=fe08ccec-a360-e011-81d2-78e7d1fa76f8) gives access to most sensors and data providers available on modern smartphones. [More resources for educators interested in using Windows Phone...](https://www.touchdevelop.com/teachwindowsphone)\n #uc4AzvPR1oVPRmCN // * The [TouchDevelop Android app](https://play.google.com/store/apps/details?id=com.microsoft.touchdevelop) gives access to notifications on Android\n #bAFkE6FP49vQmk4Q // Learn more about [platforms and supported features](https://www.touchdevelop.com/platforms).\n #T4CItQIBnMyWsjzq // ### create your own tutorials and docs\n #RLolkQMEUD0pU4i5 // In addition to creating fun and useful apps, you can use TouchDevelop to create custom interactive tutorials to augment your curriculum. You can also create your own documentation topics adding to the TouchDevelop documentation. This benefits not only your class, but the entire TouchDevelop community!\n #qc2MeCvS62HoY74P // * [creating interactive tutorials](/creatinginteractivetutorials)\n #Esv88v05v32k6UzH // * [add your own docs](/addyourowndocs)\n #cKhwOfsnzrr9c6Ri // ### manage your classroom\n #ZZ80VlTdiwMCWzcy // * You can create [](/groups) and manage your classrooms through them. Groups have a message board and allow to easily collect homework from your students.\n #xo43SANX5LZxfqRT // * Use a [label printer](/labelprinter) to easily get printed labels from student scripts\n #ow6CAnIoZDQOKOLP // ### follow your students\n #t6fGFzG0xF05rZyE // As a teacher, consider [subscribing](/subscriptions) to your students to see what they are publishing and if they are asking questions.\n #ueEDtziGGzDu30Yi // ### experience\n #x2P2jb0Ng0DiKokb // Visit the [TouchDevelop teaching page](http://research.microsoft.com/touchdevelop/teaching.aspx) at Microsoft Research for a list of how TouchDevelop has been used and is being used in classrooms.\n}\n", "cnfhc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"forms\";\nmeta icon \"AlignLeft\";\nmeta color \"#ff9955bb\";\nmeta rootId \"mipj4oNCsNRLklwFD2N4B4q4\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Basic user interface elements (buttons, text input boxes, check boxes, drop-down menus) used for simple forms.\n#button\naction button(#xURWrXuGKgW5xN1l text: String, #s7a8MjOB7JpBePnY body: Action) {\n #oMZnJkBvk4CM5NGG // Displays a button.\n #BeVNPIv2BatLOg8h do box {\n #lCBx1FU8aK5Bq79r box→set_margins(0.5, 0.5, 0.5, 0.5);\n #eAQT483O6pVvTl0u box→set_padding(0.5, 1, 0.5, 1);\n #P0SG5IzV2sxMnysd box→set_border(colors→foreground, 0.1);\n #x3sO2ZcJrezHe3kX box→set_font_size(1.2);\n #veq2xNGD2p2kRPZ1 box→on_tapped($handler);\n #k2pcA7icp5MU2rgL where handler() {\n #MQxNPwBN7QPWlcFZ $body→run;\n }\n #EEPUP0nu9eFaj3nx do box {\n #clIc1IEhC7rO4Bea box→set_horizontal_align(\"center\");\n #Gscop3pSrsVr5VHt box→set_vertical_align(\"center\");\n #oehMaNCjES5Lh1kE $text→to_lower_case→post_to_wall;\n }\n }\n meta sync;\n}\n#checkbox\naction checkbox(#XmddAe3uxF6wntlE text: String, #dZdJ4JFE9PMNmrPX checked: Ref[Boolean]) {\n #N4FSlNqRksJoLHPh // Displays a checkbox\n #UoY0M75Nvw5HC4z0 do box {\n #xxuX34412T2wy2JH box→use_horizontal_layout;\n #W9sbimcI2hu89mZW box→set_horizontal_align(\"left\");\n #NJ5RvCBtJTVuhxnC box→set_horizontal_stretch(1);\n #YDqkFsXsBQ1P2gab box→set_margins(0, 0.5, 0.5, 0.5);\n #x0esfrqmUhgMoq5J do box {\n #TUeyyCVT9kSjkRck box→use_overlay_layout;\n #oUlb2Pz62JEqMOO2 do box {\n #enlqc8RC7GumM4AS box→set_margins(0, 0, 0, 0.2);\n #FQsLjirTzTFYq98S box→set_font_size(2);\n #M1UL7gPi16Yr6jMW if $checked→\\u25c8get then {\n #xHL19Tt7RLJEtSUO box→set_foreground(colors→accent);\n }\n else {\n #iCJYrucmP1In4Z5B box→set_foreground(colors→transparent);\n }\n #QIItRGSCbXYUMs99 \"✓\" →post_to_wall;\n }\n #xyHv2ocxtMyF4hKQ do box {\n #xg5oEvPL1XIyhcCs box→set_width(1.5);\n #w5iCnvFn6AY2F2nc box→set_height(1.5);\n #rQhcUYKpXBHnHgIY box→set_border(colors→foreground, 0.1);\n #Tf1ACluswhZ92NeO \"\" →post_to_wall;\n #TNQpvE84RafK2Ltq box→on_tapped($handler);\n #OHLhaRAMgSmPXJ8f where handler() {\n #btd149gNJDgR4jtP $checked→\\u25c8set( `not` $checked→\\u25c8get);\n }\n }\n }\n #WgHL5wANnTOxjU52 do box {\n #KhPy4XoFkMHMWmFt box→set_margins(0, 0, 0, 0.3);\n #BjD0JSTq6ttAus60 $text→post_to_wall;\n }\n }\n meta sync;\n}\n#exampleboolean\nvar example_boolean : Boolean {\n // A variable used in the example page.\n transient = true;\n}\n#examplename\nvar example_name : String {\n // A variable used in the example page.\n transient = true;\n}\n#indentation\naction indentation() returns(#mSrNtse499SoyYNG x: Number) {\n #S8yRz09biYjgAiEF // returns the default width of the left column\n #MlYnlJMVLG2RLagf if code→narrow_screen then {\n #fvUQIztqcBz1gYQv $x := 0;\n }\n else {\n #dt0YYXQ04btlJrZQ $x := 10 + (box→page_width - 40) * .2;\n }\n meta private;\n meta sync;\n}\n#examplecomments\nvar example_comments : String {\n // A variable used in the example page.\n transient = true;\n}\n#exampleemails\nvar example_emails : Collection[String] {\n // A variable used in the example page.\n transient = true;\n}\n#examplepassword\nvar example_password : String {\n // A variable used in the example page.\n transient = true;\n}\n#showexample\naction show_example() {\n #g3Dehh42TZmVcf55 if box→is_init then {\n #q8U4U4G8U546KU3l if data→example_emails→is_invalid then {\n #xedWeRwh8Ue6cb9A data→example_emails := collections→create_string_collection;\n }\n #hbxRTSacAvE3oSVD data→dropdownchoices := \"Car,Bus,Train,Airplane\" →split(\",\");\n #W9GFtAxvA6ED3qH2 data→example_number_string := data→example_number→to_string;\n }\n #AWLV4z6sbGWj2yj2 if true then {\n #xynv57KgW6I4K9te // input a string that stays on a single line\n #xSVZAzMz4z43m0ic code→input_text_line(\"Name\", data→example_name→\\u25c8ref);\n #xCC2PGgyRh0QhRdD // input a string that can span multiple lines\n #d6wKNn1hCMbUAl7b code→input_text_area(\"Comments\", data→example_comments→\\u25c8ref);\n #Kpaisod9fa1EJ1Nz // input a collection of strings (user can add/remove/edit entries)\n #JSDo03mXMRXL34Ru code→input_string_collection(\"email addresses\", data→example_emails);\n #V4hZ3bgEE4629j2c // input a number\n #EL2h4uXrvebuyGpa code→input_number(\"Number\", data→example_number_string→\\u25c8ref, $changehandler);\n #f65hdk6OYVW42SSS where changehandler(x: Number) {\n #oyZNk2iWk4yBBQZQ data→example_number := $x;\n }\n #JY4LJVzqLW8Ufm2M // input a password (characters are hidden)\n #dZKpLy54xah0JQ1F code→input_password(\"Password\", data→example_password→\\u25c8ref);\n #EKqdXdczvwH1E1E7 // input from a dropdown menu\n #oHvsT479mP7NaOUZ code→input_choice(\"Transportation\", data→dropdownchoices, data→example_choice→\\u25c8ref);\n #Z424oFe8h2a4NJi3 // use the \"indented content\" call to achieve consistent indentation\n #xiMteeUY3QIwwfIj code→indented_content($content2);\n #VQJ4O7N7egqz2A64 where content2() {\n #QdCsitEWPIpnmoXX // input a boolean, as a checkbox\n #xC4ZXwlEtm4CPWzC code→checkbox(\"send feedback\", data→example_boolean→\\u25c8ref);\n #JFhaztfd8ELUtM1b where on_value_change2(boolean: Boolean) {\n #xpdH3an9NXVldO1G data→example_boolean := $boolean;\n }\n }\n #ZKcd2H87G6EIr0cZ // use the \"indented content\" call to achieve consistent indentation\n #vQ29crAnY4nnof1v code→indented_content($content3);\n #Rr8voxBmlDVHpX3w where content3() {\n #y3NfmDCiPjZ4Nzd6 // make a button\n #t7v67S6usgbTGH0L code→button(\"Submit\", $tapped);\n #It0JRh4s6Jx8j0Br where tapped() {\n #xElKqf2bp4mbTNVn wall→prompt(\"Submit Button Tapped\");\n }\n }\n }\n meta private;\n meta page;\n meta sync;\n}\n#inputstringcollectio\naction input_string_collection(#xlVbb24mJshpHIWy label: String, #bIyKXlvmQ4BVXFGJ strings: Collection[String]) {\n #RD6YRNvW7BsRWNoQ // Input a collection of strings.\n #oUukBN5uP90294lf code→labeled_content($label, $content);\n #uwWOPWrN7OPorUR8 where content() {\n #xIiHiCHk5XC8XC5V do box {\n #BEQalokclWoiv8fI box→set_margins(0, 0, 0.2, 0);\n #FeyV2cUzflwAQdHH if $strings→count > 0 then {\n #WK24Bqr5DZjvL2mr for 0 ≤ i < $strings→count do {\n #h5Sbg3kJQnTP8sIx do box {\n #xv6adBsRrrPiHDnR box→use_horizontal_layout;\n #WM9JnTT1DdcETTxo do box {\n #lQ4PpsbjoKjvlS8B box→set_border(colors→black, 0.1);\n #QxS3O0qq0vJUofWW box→set_margins(0.2, 0, 0.2, 0);\n #CmCA4AQvRAs4Iqz2 box→set_horizontal_stretch(1);\n #ZJ1MCdZEi29R0dCT box→edit(\"textline\", $strings→at($i), $changehandler);\n #v6WEw3aYUIlcGY0s where changehandler(text: String) {\n #lRXq1ZOARuefS2Zm $strings→set_at($i, $text);\n }\n }\n #SV8eTwoP4loYDkc6 do box {\n #O7tAuAtSc1wLjWvm code→small_button(.5, \"(remove)\", $@action);\n #LQxR82QVQNh5fJIq where @action() {\n #xHslnsXxIehL4tcC $strings→remove_at($i);\n }\n }\n }\n }\n }\n #Mk34EQ6Gc5GsV0nN do box {\n #xif4nWs6htJVPd4M code→small_button(0, \"(add)\", $@action);\n #VCASmDOFVyse2Xfx where @action() {\n #aBCpTjDTBIZMd4yX $strings→add(\"\");\n }\n }\n }\n }\n meta sync;\n}\n#inputtextline\naction input_text_line(#jyN30xmHpt3mjpZ7 label: String, #Ngs7aKl2HlYTJuRr text: Ref[String]) {\n #vGs7PXioIiH5mAzi // Input a line of text.\n #rQMlU9juUOBnSPIM code→labeled_content($label, $content);\n #ISy3UZlVfS2ZnhEg where content() {\n #vrU98EyH2kTspRIE do box {\n #DUOG5YkbvBoo7ftX box→set_border(colors→foreground, .1);\n #t4KwEg41WKXyCDTj box→edit(\"textline\", $text→\\u25c8get, $changehandler);\n #YIpAHVVv6bGkqVxY where changehandler(t: String) {\n #xm4oLLaN18HmqFkR $text→\\u25c8set($t);\n }\n #LthSFfpSwy2mKuIX box→set_margins(0.2, 0.5, 0.2, 0);\n #W3C0472c4Iru7Mgo box→set_horizontal_stretch(1);\n }\n }\n meta sync;\n}\n#smallbutton\naction small_button(#xGsDy4W54h9imV7t side_margins: Number, #CtQazt5tBtc5Lx0L s: String, #xV02qoKpuhzNHE84 @action: Action) {\n #IsEMF5r247iH2bRo do box {\n #xfkRzIEi346QIRF3 if $side_margins ≠ 0 then {\n #lK8yb7EboqVg4Qj8 box→set_vertical_align(\"top\");\n }\n #U4wnbbHKfLN2Fd00 box→set_horizontal_align(\"center\");\n #x2pMWPlWzYBQX1G9 box→set_margins(0.2, $side_margins, 0, $side_margins);\n #T6MYpng3si9WG0Yf box→set_padding(0.2, 0, 0.2, 0);\n #WSQ0OZQWGiM6IhvE box→on_tapped($@action);\n #x0mIhLxidJtjL4Rh $s→post_to_wall;\n }\n meta private;\n meta sync;\n}\n#inputtextarea\naction input_text_area(#FZLl0kAIfRiaZCgi label: String, #D4q1w1t1SIeY5CdI text: Ref[String]) {\n #xqkYC4vcG01Uxa7b // Input a large text area.\n #C4wo2Rd3F145JrVP code→labeled_content($label, $content);\n #RpCrJCiBuuM49jr4 where content() {\n #daObdJSu6PATeOZh do box {\n #xxLB1Zyoh2IrlodK box→set_border(colors→foreground, .1);\n #DsMVzv8RMdeVoa6Z box→edit(\"textarea\", $text→\\u25c8get, $changehandler);\n #fsH41pZcSs4iYeBE where changehandler(t: String) {\n #fS1ehc5sR4qFLp4b $text→\\u25c8set($t);\n }\n #BrWx2AkIBUmKYPrg box→set_margins(0.2, 0.5, 0.2, 0);\n #xNdf2yNH0rJFFIXr box→set_height_range(3, math→\\u221e\\u208a);\n #dzu9pGfd1ZQ8h4Sc box→set_horizontal_stretch(1);\n }\n }\n meta sync;\n}\n#inputpassword\naction input_password(#oRK3omOo2nyTw2uC label: String, #RjGW0mXUY2iNGZ51 password: Ref[String]) {\n #CPSehlG2rZEIateV // Input a password in a text box.\n #vSNm4gSV5Ks69lFG code→labeled_content($label, $content);\n #h2Rm6uGFHPCBLO6F where content() {\n #AFo8siAcXyjkn626 do box {\n #MzqAW76QSRhrA3Lj box→set_border(colors→foreground, .1);\n #fX0LiHFWGDYgMytB box→edit(\"password\", $password→\\u25c8get, $changehandler);\n #IXmuR4nafPlvQaR4 where changehandler(text: String) {\n #xhZ5RmCuVvVAtiUt $password→\\u25c8set($text);\n }\n #Kiqhf5ZBVOQEW0CS box→set_margins(0.2, 0.5, 0.2, 0);\n #Wah7zj4lGCg2kqSd box→set_horizontal_stretch(1);\n }\n }\n meta sync;\n}\n#inputnumber\naction input_number(#xNaUglPENXPgYZJA label: String, #Dvo2uCzchwt1RK9T text: Ref[String], #xHizTOVW4HAYsKed changehandler: Number_Action) {\n #lsIcXLJ84WyQO3qb // Input a number in a text box\n #ZHBhFk2XYX4sBT1J code→input_text_line_w\\u002f_validator($label, $text, $errorcheck, $changed);\n #wJCP8sQukTPlpnLv where errorcheck(s: String) returns (error: String) {\n #c26j93ykO4m2So60 $x := $s→to_number;\n #qigndUatIEgwI4GN if $x→is_invalid then {\n #pV4aS5dTajuO4QyX $error := \"please enter a valid number.\";\n }\n else {\n #sseXJOPgV4a4kIqw $error := \"\";\n }\n }\n #FZI2cM0Cm4gVf4Vg where changed(t: String) {\n #At96ttBLnjKVKnSr $changehandler→run($t→to_number);\n }\n meta sync;\n}\n#example\naction example() {\n #U8WbRxe5rZkym84o // This library allows to create form elements such as buttons, text boxes, checkboxes, or drop-down menus.\n #MAB3qp04iehrzedJ // * input a string in a text box (single line)\n #W78Bh5jzAj1XlSG3 code→input_text_line(\"Name\", data→example_name→\\u25c8ref);\n #Z2DbZhS3DzxFekj9 // * input a string in a text box (multiple lines)\n #gNmJvlKcoquLosgx code→input_text_area(\"Comments\", data→example_comments→\\u25c8ref);\n #mYcQp4Snz5rTJEg7 // * input a collection of strings (user can add/remove/edit entries)\n #txLA4LS6tYJ0y4bJ code→input_string_collection(\"email addresses\", data→example_emails);\n #xuj5EYtBrmeO2TEh // * input a password in a text box (characters are hidden)\n #ARAEp3dAGToEwfqn code→input_password(\"Password\", data→example_password→\\u25c8ref);\n #s65do3tt0RIjTpA6 // * input a boolean, as a checkbox\n #P8t4WI8KCKpiopSI code→checkbox(\"send feedback\", data→example_boolean→\\u25c8ref);\n #sThgFiYR4kqeb3og // * make a button\n #GGi0umzFN0i7PeNy code→button(\"Submit\", $tapped);\n #kEYl72guCTWPBwyf where tapped() {\n #Xr4FF4Zwi9BGtxXK wall→prompt(\"Submit Button Tapped\");\n }\n #l2rHOI3WCUtbJhwS // * choose from a dropdown menu\n #fvLBanASFw6tp6yY code→input_choice(\"Transportation\", data→dropdownchoices, data→example_choice→\\u25c8ref);\n meta private;\n meta sync;\n}\n#narrowscreen\naction narrow_screen() returns(#H5ouAYlv7HbPVDl2 b: Boolean) {\n #xhsJ4s70sFRqW9JL $b := box→page_width < 35;\n meta private;\n meta sync;\n}\n#labeledcontent\naction labeled_content(#D79ONITsvnubDAn2 label: String, #Qd6YjIewYV4skSoJ content: * display_code) {\n #O1MoBO3T4k8qdK2z // For displaying labeled content, with the same indentation as other form elements. If the label is the empty string, the item is displayed without indentation.\n #x57fXUa20kusWpQR if `not` $label→is_invalid `and` `not` $label→equals(\"\") then {\n #x1QPNytuF6aVimtI do box {\n #W3cfgIbzJtpKQu58 box→set_horizontal_stretch(1);\n #N3V9zJqTiYOZ09Y4 box→set_horizontal_align(\"left\");\n #MIXwy0Lrg4byv7v2 if code→narrow_screen then {\n #iLdCmyES0H44sYXl box→use_vertical_layout;\n #x5C1zDmnt0g59AKK box→set_margins(0.35, 0, 0, 0);\n }\n else {\n #JG4RsN69pDFxkHCs box→use_horizontal_layout;\n }\n #jpuLtmhurwi9PgQH $indent := code→indentation;\n #qIj8HVwd4WzOBmo0 do box {\n #RpI2slWOhKGTeFzx $label→post_to_wall;\n #bQyiflPFSe4LG1PF $pw := box→page_width;\n #do30F2oLngCTQahg box→set_horizontal_stretch($indent / ($pw - .7));\n #ZSt80PJbtHzVC9Xc box→set_horizontal_align(\"right\");\n #rwpwvOMJSurVrxXm box→set_margins(0.2, 0, 0.2, 0.5);\n }\n #PcMSXcdzHFpXVs0c do box {\n #PMVSXaDMx2Byxb4q if box→page_width < 40 then {\n #S08jbByW69nHCSvh box→set_width_range(10, box→page_width - $indent);\n #v6d9cE4Xn6LJLsIP box→set_horizontal_stretch(1);\n }\n else {\n #r5cfsPE3NVyPphiI box→set_horizontal_stretch(0);\n #xyhKvW904uX4eTbV box→set_width_range(20, box→page_width - $indent);\n }\n #d4tjdbWzbshKmjAb do box {\n #Bc2pIO5JfYnlxvd5 box→set_padding(0, 0.5, 0, 0.5);\n #Il02dBjaLo20CMA7 $content→run;\n }\n }\n }\n }\n else {\n #CLcBNraLBuLvz6WE code→normal_content($content);\n }\n meta sync;\n}\n#indentedcontent\naction indented_content(#HlPcz3hfCeLsCsev content: * display_code) {\n #x254GheEOFSrWZV0 // Display content with the same indentation as other form elements.\n #p77c6gjAGbt4vcnh if code→narrow_screen then {\n #OCpnGMZCt40T7hbD code→normal_content($content);\n }\n else {\n #xBTwLs19aArPzbwI code→labeled_content(\" \", $content);\n }\n meta sync;\n}\n#normalcontent\naction normal_content(#LhxZ2oFbeQqjqioO content: * display_code) {\n #muK7qjocorEy5bFp do box {\n #PGjY9ijaM2Dqkz6u if box→page_width < 40 then {\n #HOwt6al4pB0a4b77 box→set_width_range(10, box→page_width);\n #JmPANVSMlr2ok7XQ box→set_horizontal_stretch(1);\n }\n else {\n #xjNSS8T2YkmlTDA1 box→set_horizontal_stretch(0);\n #drzpEKoWynG0Wxut box→set_width_range(20, box→page_width);\n }\n #sL9WHWbDfK264y7q do box {\n #xwjgvLJt7CmHAqYx box→set_padding(0, 0.5, 0, 0.5);\n #WjbACCskO8bfp0L4 $content→run;\n }\n }\n meta private;\n meta sync;\n}\n#w4wvvOyYMGH8M1GFkNzq9U37\naction `type` display_code() {\n #hZfzSP0cQHetMj0l skip;\n meta sync;\n}\n#JFIbi283vQ4hKSeSDgSFD1mR\naction input_choice(#HfI9CZ0A6zymTXhX label: String, #VHxBItXZ7vdwsgje choices: Collection[String], #JjVfKb4CtmnLwR3f index: Ref[Number]) {\n #xIOPKp4ND54mdERz // Input a choice from a dropdown menu.\n #i4btpxWzjC1Ut5N0 code→labeled_content($label, $content);\n #tL3OSQzj8T50p3lV where content() {\n #h1ji0TdsbfpWk9Cr $current := \"\";\n #xKb8l8XFST5CgAib if `not` $index→\\u25c8get→is_invalid `and` $index→\\u25c8get ≥ 0 `and` $index→\\u25c8get < $choices→count then {\n #VuMgiiVIuQyumTWs $current := $choices→at($index→\\u25c8get);\n }\n #rsBQ6IUkgl23h1G6 if $current→is_invalid `or` $current→equals(\"\") then {\n #YxdTjAvVhPI4W6aL $current := \" \";\n }\n #tF4Va1rstxXDGXx2 do box {\n #ZszxNLVOR5FlgO5P box→set_margins(0.2, 0.5, 0.2, 0.5);\n #xpsrO8CvPAGqAF2y box→set_padding(0.3, 1, 0.3, 1);\n #m7SyLwOP6LOpWKMV box→set_border(colors→foreground, 0.1);\n #SVgsFJYaIgCaNf6g box→on_tapped($handler);\n #dDS0hvCaqRXWn4ee where handler() {\n #nWr4ZoynLjjvLEQh $x := wall→pick_string($label, \"\", $choices);\n #PgR4AtEyrW3rxC2q if $x ≥ 0 then {\n #egXS2NagU5uAHe20 $index→\\u25c8set($x);\n }\n }\n #gg9amd8VqZ2N8wlK do box {\n #pg0wfOvpIQXqrqqI box→set_horizontal_align(\"center\");\n #UAfPyzrOQTVhSYDT $current→post_to_wall;\n }\n }\n }\n meta sync;\n}\n#Mb4wOugItC8WuhV4FzURCsdU\nvar dropdownchoices : Collection[String] {\n transient = true;\n}\n#CwT0X1vsa9H4HZJxEErdw2z6\nvar example_choice : Number {\n transient = true;\n}\n#oWu4bWFVWgG65r4Hrh69VnB3\naction input_text_line_w\\u002f_validator(#AcC2TeSfON5qosYl label: String, #Ob1comuvIQ5NK7Pb text: Ref[String], #b7avWpkiitGYOk25 errorcheck: * validator, #x2oOeBNEMxEIENx8 changehandler: Text_Action) {\n #hRz67TwYTlCDX2kL // Input a line of text with validation.\n #x0k97z2hXiY322mO code→labeled_content($label, $content);\n #qWtL22bzMjpfKJYV where content() {\n #f80gXpCr25EE0tP5 do box {\n #YDavaFuz8WaZCRWC $error := $errorcheck→run($text→\\u25c8get);\n #pDpoejLevWzS8z0b do box {\n #stSGcB2mwmZoYFPm box→set_border(colors→foreground, .1);\n #x7T2lUz4YYgBaRD0 box→edit(\"textline\", $text→\\u25c8get, $changed);\n #RLsisiY1kcQ36lrj where changed(t: String) {\n #GEBkTEw75djEWxk1 $text→\\u25c8set($t);\n #vhOJcgr7W19mZVmU if $errorcheck→run($t)→is_empty then {\n #NGbmrrFVzFOvhnVr $changehandler→run($t);\n }\n }\n #XfjBHlqMy2xMp1PU box→set_margins(0.2, 0.5, 0.2, 0);\n #znNNcFLuMrwlygkb box→set_horizontal_stretch(1);\n }\n #P9NfFHCmIjIAsrFp if `not` $error→is_empty then {\n #x3HjnQ2qlUWV0mJX box→set_foreground(colors→red);\n #i8JReBGCqZHMyNLW(\"⇧ \" ∥ $error)→post_to_wall;\n }\n }\n }\n meta sync;\n}\n#XPzkmnAHw2YfZd8ERHYp0i1a\naction `type` validator(#hZesnUE4MJN6O7Oc s: String) returns(#xKLHMkYW5WPYaUdp error: String) {\n #dI2gcwHzWKYwA7fT skip;\n meta sync;\n}\n#h9fnSKl9lC2Y2ipmhRWNzOhy\nvar example_number : Number {\n transient = true;\n}\n#obyaxW4FDptTluW9lt69d7Zg\nvar example_number_string : String {\n transient = true;\n}\n", "cwgn": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"layout\";\nmeta icon \"NineColumn\";\nmeta color \"#ff9955bb\";\nmeta rootId \"J2g52kon8pb1Qs9cRhmPGKZu\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n// A library to help with laying out boxes.\n#main\naction example() {\n // This library provides various helpers to simplify the layout of boxes.\n // * layout vertically or horizontally based on the page orientation\n do box {\n code→use_flexible_layout;\n // ...\n }\n // * stretch and center a box\n do box {\n code→stretch_and_center;\n // ...\n }\n meta private;\n meta test;\n}\n#fADj2RlGhi2LmT1rCUpyRpxM\naction stretch_and_center() {\n // Stretches horizontally and vertically the current box and aligns the content with the center.\n box→set_horizontal_stretch(1);\n box→set_horizontal_align(\"center\");\n box→set_vertical_stretch(1);\n box→set_vertical_align(\"center\");\n meta sync;\n}\n#QpiD4W44RMmIzOZmyI6706Ps\naction use_flexible_layout() {\n // Uses **horizontal layout** if the page is landscape; **vertical layout** if the page is portrait.\n if box→page_width > box→page_height then {\n box→use_horizontal_layout;\n }\n else {\n box→use_vertical_layout;\n }\n meta private;\n meta sync;\n}\n#gridofsquares\naction grid_of_squares(cell_content: Number_Action, count: Number, grid_width: Number, grid_height: Number) {\n // Draw a grid of at least (count) squares, of the specified total width and height.\n $numboxes := $count;\n $Area := $grid_width * $grid_height;\n $bsize := math→sqrt($Area / $numboxes);\n $cols := math→floor($grid_width / $bsize);\n $rows := math→ceiling($numboxes / $cols);\n while $rows * $bsize > $grid_height do {\n $alt1 := $grid_width / ($cols + 1) - .001;\n $alt2 := $grid_height / $rows - 0.001;\n $bsize := math→max($alt1, $alt2);\n $cols := math→floor($grid_width / $bsize);\n $rows := math→ceiling($numboxes / $cols);\n }\n $mgn := .03 * $bsize;\n if $mgn * box→pixels_per_em < 2 then {\n $mgn := 2 / box→pixels_per_em;\n }\n $bsize := $bsize - $mgn;\n do box {\n code→draw_grid($rows, $cols, $mgn, $bsize, $cell_content, 0);\n }\n}\n#drawgrid\naction draw_grid(rows: Number, cols: Number, margin: Number, bsize: Number, cell_content: Number_Action, offset: Number) {\n box→set_height($rows * $bsize + ($rows - 1) * $margin);\n box→use_vertical_layout;\n box→set_vertical_align(\"justify\");\n for 0 ≤ i < $rows do {\n do box {\n box→set_width($cols * $bsize + ($cols - 1) * $margin);\n box→use_horizontal_layout;\n box→set_horizontal_align(\"justify\");\n for 0 ≤ j < $cols do {\n do box {\n do box {\n box→set_width($bsize);\n box→set_height($bsize);\n $cell_content→run($offset + $i * $cols + $j);\n }\n }\n }\n }\n }\n meta private;\n}\n#horizontallyscrollin\naction horizontal_hub_of_squares(cell_content: Number_Action, count: Number, cell_size: Number, group_width: Number, total_height: Number) {\n // Draw a horizontally scrolling grid of at least (count) squares of the specified size, with the specified total height.\n $numboxes := $count;\n $mgn := .03 * $cell_size;\n if $mgn * box→pixels_per_em < 2 then {\n $mgn := 2 / box→pixels_per_em;\n }\n $bsize := $cell_size + $mgn;\n $cols := math→floor($group_width / $bsize);\n $rows := math→floor($total_height / $bsize);\n if $cols ≤ 0 then {\n $cols := $rows;\n }\n $groups := math→ceiling($numboxes / ($rows * $cols));\n box→use_horizontal_layout;\n for 0 ≤ i < $groups do {\n do box {\n if $i ≠ 0 then {\n box→set_margins(0, 0, 0, .2 * $bsize);\n }\n code→draw_grid($rows, $cols, $mgn, $cell_size, $cell_content, $i * ($rows * $cols));\n }\n }\n box→set_scrolling(true, false);\n}\n#verticallyscrollings\naction vertical_hub_of_squares(cell_content: Number_Action, count: Number, cell_size: Number, total_width: Number, group_height: Number) {\n // Draw a vertically scrolling grid of at least (count) squares of the specified size, with the specified total width.\n $numboxes := $count;\n $mgn := .03 * $cell_size;\n if $mgn * box→pixels_per_em < 2 then {\n $mgn := 2 / box→pixels_per_em;\n }\n $bsize := $cell_size + $mgn;\n $cols := math→floor($total_width / $bsize);\n $rows := math→floor($group_height / $bsize);\n if $rows ≤ 0 then {\n $rows := $cols;\n }\n $groups := math→ceiling($numboxes / ($rows * $cols));\n box→use_vertical_layout;\n for 0 ≤ i < $groups do {\n do box {\n if $i ≠ 0 then {\n box→set_margins(.2 * $bsize, 0, 0, 0);\n }\n code→draw_grid($rows, $cols, $mgn, $cell_size, $cell_content, $i * ($rows * $cols));\n }\n }\n box→set_scrolling(false, true);\n}\n", "czopc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank engduino\";\nmeta icon \"CreditCard\";\nmeta color \"#ff00008b\";\nmeta rootId \"SEYbC35yczei4aI3wm7icdMs\";\nmeta iconArtId \"qmjzqlkc\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A blank Engduino v3 sketch. #arduino #arduinoSketch #Engduino\n#LnSjoBj2DrSx4mcw\naction setup() {\n #mQv6HDl3bdDDAJI0 skip;\n meta private;\n}\n#xq99yDlZpVBNRgrY\naction loop() {\n #xBK6GndqJnRSJkTx @\\u267b→engduino→set_all_LEDs(colors→random);\n #xtbigB2VPSstxCXs @\\u267b→engduino→delay(200);\n #OSTD49T6WAb9oYz6 @\\u267b→engduino→set_all_LEDs(colors→black);\n #jTiWi7fMT5Y0BSEk @\\u267b→engduino→delay(200);\n meta private;\n}\n#xdB9Cm8GWFKxZGcr\naction variables() {\n #khP9iYCJxRB2iUZw skip;\n meta private;\n}\n#Z2bgYR2Rs9Bvcb74\nvar screenshot : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/qmjzqlkc\";\n transient = true;\n}\n#LrYSVbKx8FjyP2FW meta import engduino {\n pub \"odwke\"\n usage {\n action `async` set_LED(led_number: Number, color: Color)\n action `async` millis() returns(ms: Number)\n action `async` micros() returns(us: Number)\n action `async` button_pressed() returns(b: Boolean)\n action `async` button_was_pressed() returns(b: Boolean)\n action `async` delay(millis: Number)\n action `async` acceleration() returns(p: Vector3)\n action `async` temperature() returns(p: Number)\n action `async` set_all_LEDs(color: Color)\n }\n #mAHtFDspzVKM5ZCP resolve arduino = ♻ arduino with {\n }\n}\n#uvXS88LcuackBUtZ\naction simulate() {\n #EuO57UhnSOMDRRlU // **Do not edit this action**. This action simulates the Engduino code.\n #Lo714zCo2ze5KJxO code→setup;\n #rTWfhzlllMzajBW8 while true do {\n #xASbcNy6sOwDn24U code→loop;\n }\n}\n#xEqnQPX6C7o8xLVl meta import arduino {\n pub \"cqfda\"\n usage {\n action `sync` digital_read(pin: Number) returns(bit: Number)\n action `sync` digital_write(pin: Number, value: Number)\n action `sync` analog_read(pin: Number) returns(bit: Number)\n action `sync` analog_write(pin: Number, value: Number)\n action `async` pin_mode(pin: Number, mode: Number)\n action `sync` HIGH() returns(v: Number)\n action `sync` LOW() returns(v: Number)\n action `sync` OUTPUT() returns(v: Number)\n action `sync` INPUT() returns(v: Number)\n action `async` delay(millis: Number)\n action `sync` sketch(source: String)\n action `sync` static_buffer(bytes: String) returns(buf: Buffer)\n action `sync` INPUT\\_PULLUP() returns(v: Number)\n action `sync` LED\\_BUILTIN() returns(r: Number)\n action `sync` mac(address: String)\n action `sync` analog_reference(type: Number)\n action `sync` DEFAULT() returns(r: Number)\n action `sync` EXTERNAL() returns(r: Number)\n action `sync` tone(pin: Number, frequency: Number, duration: Number)\n action `sync` no_tone(pin: Number)\n action `sync` millis() returns(millis: Number)\n action `sync` micros() returns(micros: Number)\n action `sync` pulse_in(pin: Number, value: Number, timeout: Number) returns(micros: Number)\n action `sync` board(name: String)\n action `sync` print_value(name: String, value: Number)\n action `sync` print(text: String)\n action `sync` println(text: String)\n action `sync` map(value: Number, from_low: Number, from_high: Number, to_low: Number, to_high: Number) returns(r: Number)\n action `sync` constrain(value: Number, a: Number, b: Number) returns(r: Number)\n action `async` delay_microseconds(micros: Number)\n }\n}\n", @@ -20,23 +19,24 @@ "kkwd": "meta version 'v2.2';\nmeta name \"physics game starter\";\n// Tap the screen to creates bubbles!\n\naction main() {\n // The board is a 2D canvas with a physics engine. Gravity makes sprites fall and boundary makes them bounce.\n wall→set_background(colors→random);\n data→board := media→create_landscape_board(800, 480);\n data→board→set_gravity(0, 400);\n data→board→create_boundary(0);\n $info := data→board→create_text(100, 20, 24, 'tap to create bubbles');\n $info→set_friction(1);\n // Display the board. The game loop will start after leaving main.\n data→board→post_to_wall;\n}\nvar board : Board {\n}\n\nevent gameloop() {\n // Apply physics and redraw.\n data→board→evolve;\n data→board→update_on_wall;\n meta private;}\n\nevent tap_board\\u003a_board(x: Number, y: Number) {\n // When the board is tapped, create a circle sprite that falls down.\n $circle := data→board→create_ellipse(100, 100);\n $circle→set_pos($x, $y);\n $circle→set_color(colors→random);\n $circle→set_friction(0.005);\n}\n", "klwwa": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank azure web api\";\nmeta icon \"Stacks\";\nmeta color \"#ffffffff\";\nmeta rootId \"x4mibwzdISu8zLeLgg7b3IKt\";\nmeta iconArtId \"wyfreugv\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta isCloud \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"network,npm,shell\";\nmeta parentIds \"\";\n// An Azure web api using Restify. #node #azure #restify #rest #api\n#Qb4usfyu91x2SfdX meta import azure_storage {\n pub \"qzkz\"\n usage {\n type @table\n type table_query\n action `async` init()\n action `async` create_private_table_if_not_exists(name: String) returns(@table: ♻ azure_storage → @table)\n action `async` insert_entity(@table: ♻ azure_storage → @table, entity: Json_Object, when_present: String)\n action `async` update_entity(@table: ♻ azure_storage → @table, entity: Json_Object, mode: String)\n action `async` try_update_entity(@table: ♻ azure_storage → @table, entity: Json_Object, mode: String) returns(ok: Boolean)\n action `async` delete_entity(@table: ♻ azure_storage → @table, entity: Json_Object)\n action `sync` create_entity(PartitionKey: String, RowKey: String) returns(entity: Json_Builder)\n action `async` delete_table(@table: ♻ azure_storage → @table)\n action `sync` create_query(@table: ♻ azure_storage → @table) returns(query: ♻ azure_storage → table_query)\n action `sync` @top(query: ♻ azure_storage → table_query, count: Number) returns(res_query: ♻ azure_storage → table_query)\n action `sync` @where(query: ♻ azure_storage → table_query, expression: String, argument: String) returns(res_query: ♻ azure_storage → table_query)\n action `sync` partition_key_is(query: ♻ azure_storage → table_query, PartitionKey: String) returns(res_query: ♻ azure_storage → table_query)\n action `sync` @and(query: ♻ azure_storage → table_query, expression: String, argument: String) returns(res_query: ♻ azure_storage → table_query)\n action `sync` @or(query: ♻ azure_storage → table_query, expression: String, argument: String) returns(res_query: ♻ azure_storage → table_query)\n action `async` get_entity(@table: ♻ azure_storage → @table, PartitionKey: String, RowKey: String) returns(result: Json_Object)\n action `sync` page_size(query: ♻ azure_storage → table_query, count: Number) returns(res_query: ♻ azure_storage → table_query)\n action `async` execute(query: ♻ azure_storage → table_query) returns(entities: Json_Object)\n action `sync` create_log_id() returns(id: String)\n action `sync` create_random_id(size: Number) returns(id: String)\n }\n}\n#czWG9NcXY9uFZHMz\naction \\_init() {\n #bMLhngb94mCl87BE // This action runs when the web server starts up. To deploy this service, go to the script settings, then tap `[Azure]` under `[export to app]`.\n #rg6M5H46J1bK4x8c data→logger := app→create_logger(\"api\");\n #fmCQZR9L4MGzZxju code→init_azure_services;\n #x2Y2gFv2oHeZKjaB code→init_restify;\n}\n#FrNAgtgAKnFVC43t\naction GET_\\u002fping() returns(#aM0QoLDaWxwAlfSy millis: Number) {\n #xzy3cNZXu2Lbz9f2 // Returns the number of milliseconds since epoch.\n #IYDlx4xcyWX5wD4m $millis := time→now→milliseconds_since_epoch;\n}\n#Uc74s6BEKtjofv4n meta import azure_search {\n pub \"gxoyc\"\n usage {\n #BVGhpbmca\n table Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #WbpPTavV3XYENAQf service_name : String\n #xQdHjpoFK4iKIgyz api_key : String\n #J4Vffn1xdLaOmNsv version : String\n }\n }\n type Index_Definition\n type Index\n type Batch_Update\n type Field_Definition\n type Scoring_Profile\n action `async` create_or_update(schema: ♻ azure_search → Index_Definition) returns(index: ♻ azure_search → Index)\n action `sync` create_batch_update(index: ♻ azure_search → Index) returns(update: ♻ azure_search → Batch_Update)\n action `sync` upload(update: ♻ azure_search → Batch_Update, key: String) returns(doc: Json_Builder)\n action `sync` merge(update: ♻ azure_search → Batch_Update, key: String) returns(doc: Json_Builder)\n action `sync` delete(update: ♻ azure_search → Batch_Update, key: String)\n action `async` send(update: ♻ azure_search → Batch_Update) returns(status_code: Number)\n action `async` init(options\\u003f: ♻ azure_search → Options)\n action `async` delete_index(index: ♻ azure_search → Index) returns(deleted: Boolean)\n action `async` statistics(index: ♻ azure_search → Index) returns(document_count: Number, storage_size: Number)\n action `sync` action_count(update: ♻ azure_search → Batch_Update) returns(count: Number)\n action `sync` create_index_definition(index_name: String, key_name: String) returns(schema: ♻ azure_search → Index_Definition)\n action `sync` add_field(schema: ♻ azure_search → Index_Definition, name: String, type: String) returns(field: ♻ azure_search → Field_Definition)\n action `sync` set_searchable(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` set_filterable(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` set_sortable(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` set_facetable(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` set_suggestions(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` set_retrievable(field: ♻ azure_search → Field_Definition, value: Boolean)\n action `sync` index_builder(schema: ♻ azure_search → Index_Definition) returns(jsb: Json_Builder)\n action `sync` add_CORS_origin(schema: ♻ azure_search → Index_Definition, origin: String)\n action `sync` update_builder(update: ♻ azure_search → Batch_Update) returns(jsb: Json_Builder)\n action `async` index_definition(index_name: String) returns(schema: Json_Object)\n action `async` indexe_definitions() returns(schema: Json_Object)\n action `sync` add_scoring_profile(index: ♻ azure_search → Index_Definition, name: String) returns(profile: ♻ azure_search → Scoring_Profile)\n action `sync` set_weight(profile: ♻ azure_search → Scoring_Profile, field: ♻ azure_search → Field_Definition, weight: Number)\n action `sync` add_magnitude(profile: ♻ azure_search → Scoring_Profile, field: ♻ azure_search → Field_Definition, boost: Number, interpolation: String, boosting_range_start: Number, boosting_range_end: Number, constant_boost_beyond_range: Boolean)\n action `sync` set_function_aggregation(profile: ♻ azure_search → Scoring_Profile, type: String)\n action `sync` key_field(schema: ♻ azure_search → Index_Definition) returns(key: ♻ azure_search → Field_Definition)\n action `sync` reset(update: ♻ azure_search → Batch_Update)\n action `sync` get(schema: ♻ azure_search → Index_Definition) returns(index: ♻ azure_search → Index)\n action `sync` index_name(@this: ♻ azure_search → Index) returns(name: String)\n action `sync` key_name(@this: ♻ azure_search → Index) returns(name: String)\n }\n}\n#i33oK3W1WoQk1Wb7 meta import azure_service_bus {\n pub \"wiwq\"\n usage {\n #BVGhpbmca\n table Shared_Access_Signature_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Authorization rule name; if empty the ``RootManageSharedAccessKey`` is used\n #LZ3fT92mZud9ADXV key_name : String\n // The ``Primary Key`` associated to the Authorization rule. Leave empty for ``RootManageSharedAccessKey``.\n #Z5xeMrnQRfDYLF4h key : String\n // Expiration in seconds from the current time.\n #l9O44Lv51CRijsGx expires_in : Number\n }\n }\n type Topic\n type Queue\n type Queue_Message\n type Subscription\n action `async` init()\n action `async` create_topic_if_not_exists(name: String) returns(topic: ♻ azure_service_bus → Topic)\n action `async` create_queue_if_not_exists(name: String) returns(queue: ♻ azure_service_bus → Queue)\n action `async` send_message(queue: ♻ azure_service_bus → Queue, message: String)\n action `async` delete_queue(queue: ♻ azure_service_bus → Queue)\n action `async` receive_message(queue: ♻ azure_service_bus → Queue) returns(message: String)\n action `async` peek_message(queue: ♻ azure_service_bus → Queue) returns(message: ♻ azure_service_bus → Queue_Message)\n action `async` delete_message(message: ♻ azure_service_bus → Queue_Message)\n action `sync` content(message: ♻ azure_service_bus → Queue_Message) returns(content: String)\n action `async` delete_topic(topic: ♻ azure_service_bus → Topic)\n action `async` send_topic_message(topic: ♻ azure_service_bus → Topic, message: String)\n action `async` create_subscription(topic: ♻ azure_service_bus → Topic, name: String) returns(subscription: ♻ azure_service_bus → Subscription)\n action `async` delete_subscription(subscription: ♻ azure_service_bus → Subscription)\n action `async` receive_subscription_message(subscription: ♻ azure_service_bus → Subscription) returns(message: String)\n action `sync` create_sas_token(entity_path: String, options\\u003f: ♻ azure_service_bus → Shared_Access_Signature_Options) returns(token: String)\n action `sync` namespace() returns(ns: String)\n }\n}\n#LUvGQdnC2vRRhh4e meta import azure_blob_storage {\n pub \"semk\"\n usage {\n #eQ9ksqF8mc5ykZ0k\n table Create_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #v2t1qjT74Nc5nEeS etag : String\n #zNv4AFwkrDTt7NE6 force_new : Boolean\n #JEQEgLG1XiOpoNTc just_try : Boolean\n #S4e80DX2Kc4HnE96 contentType : String\n #lqupeQTDrct300uA contentEncoding : String\n #xLEc1tc4MYZOowJi cacheControl : String\n #x7sLNi86uuIjZYsp contentDisposition : String\n #Ve2cFqb2VAgtpj7i timeoutIntervalInMs : Number\n #xRIj6RoUu0DC9f1I smartGzip : Boolean\n }\n }\n #BVGhpbmca\n table Get_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #MGcXNRSlXoeJkOtU timeoutIntervalInMs : Number\n }\n }\n type Blob_Service\n type Container\n type Blob_Info\n action `sync` init()\n action `sync` create_random_id(size: Number) returns(id: String)\n action `sync` create_blob_service() returns(blob_service: ♻ azure_blob_storage → Blob_Service)\n action `async` create_container_if_not_exists(blob_service: ♻ azure_blob_storage → Blob_Service, container_name: String, permission: String) returns(container: ♻ azure_blob_storage → Container)\n action `async` create_block_blob_from_local_file(container: ♻ azure_blob_storage → Container, blob_name: String, file_path: String) returns(result: ♻ azure_blob_storage → Blob_Info)\n action `async` create_block_blob_from_text(container: ♻ azure_blob_storage → Container, blob_name: String, text: String, options\\u003f: ♻ azure_blob_storage → Create_Options) returns(result: ♻ azure_blob_storage → Blob_Info)\n action `async` get_blob_to_file(container: ♻ azure_blob_storage → Container, blob_name: String, file_path: String) returns(result: ♻ azure_blob_storage → Blob_Info)\n action `async` get_blob_to_text(container: ♻ azure_blob_storage → Container, blob_name: String, options\\u003f: ♻ azure_blob_storage → Get_Options) returns(info: ♻ azure_blob_storage → Blob_Info)\n action `async` delete_blob(container: ♻ azure_blob_storage → Container, blob_name: String)\n action `async` get_blob_to_buffer(container: ♻ azure_blob_storage → Container, blob_name: String, options\\u003f: ♻ azure_blob_storage → Get_Options) returns(result: ♻ azure_blob_storage → Blob_Info, buf: Buffer)\n action `async` set_service_properties(blob_service: ♻ azure_blob_storage → Blob_Service, properties: Json_Object) returns(result: Json_Object, response: Json_Object)\n action `async` set_cors_properties(blob_service: ♻ azure_blob_storage → Blob_Service, allowed_origins: String, allowed_methods: String, allowed_headers: String, exposed_headers: String, max_age_in_seconds: Number) returns(success: Boolean)\n action `async` service_properties(blob_service: ♻ azure_blob_storage → Blob_Service) returns(result: Json_Object, response: Json_Object)\n action `sync` etag(inf: ♻ azure_blob_storage → Blob_Info) returns(etag: String)\n action `sync` last_modified(inf: ♻ azure_blob_storage → Blob_Info) returns(lastmod: DateTime)\n action `sync` content_md5(inf: ♻ azure_blob_storage → Blob_Info) returns(md5: Buffer)\n action `async` list_blobs(container: ♻ azure_blob_storage → Container, prefix: String) returns(blobs: Collection[ ♻ azure_blob_storage → Blob_Info])\n action `sync` name(inf: ♻ azure_blob_storage → Blob_Info) returns(blob_name: String)\n action `sync` get_blob_url(container: ♻ azure_blob_storage → Container, blob_name: String, expires: Number) returns(blob_url: String)\n action `sync` generate_random_id(blob_service: ♻ azure_blob_storage → Blob_Service) returns(id: String)\n action `async` get_blob_properties(container: ♻ azure_blob_storage → Container, blob_name: String) returns(info: ♻ azure_blob_storage → Blob_Info)\n action `sync` succeded(inf: ♻ azure_blob_storage → Blob_Info) returns(ok: Boolean)\n action `sync` text(inf: ♻ azure_blob_storage → Blob_Info) returns(text: String)\n action `sync` error(inf: ♻ azure_blob_storage → Blob_Info) returns(message: String)\n action `sync` url(container: ♻ azure_blob_storage → Container) returns(url: String)\n action `async` create_block_blob_from_url(container: ♻ azure_blob_storage → Container, blob_name: String, url: String, options\\u003f: ♻ azure_blob_storage → Create_Options) returns(result: ♻ azure_blob_storage → Blob_Info)\n action `sync` generate_shared_access_signature(container: ♻ azure_blob_storage → Container, blob_name: String, permissions: String, minutes: Number) returns(blobSAS: String)\n action `sync` set_log_level(blob_service: ♻ azure_blob_storage → Blob_Service, level: String)\n action `async` delete_container(blob_service: ♻ azure_blob_storage → Blob_Service, container_name: String)\n action `async` create_block_blob_from_buffer(container: ♻ azure_blob_storage → Container, blob_name: String, buffer: Buffer, options\\u003f: ♻ azure_blob_storage → Create_Options) returns(result: ♻ azure_blob_storage → Blob_Info)\n action `async` create_gzipped_block_blob_from_buffer(container: ♻ azure_blob_storage → Container, blob_name: String, buffer: Buffer, options\\u003f: ♻ azure_blob_storage → Create_Options) returns(result: ♻ azure_blob_storage → Blob_Info)\n }\n}\n#a4wL0Lb7xeWxhV4L meta import parallel {\n pub \"fncvb\"\n usage {\n type queue\n action `async` @for(count: Number, @action: Number_Action)\n action `async` for_batched(count: Number, batch_count: Number, item_action: Number_Action, batch_action: Action)\n action `sync` schedule(q: ♻ parallel → queue, task: Action)\n action `sync` create_queue(max_running: Number) returns(queue: ♻ parallel → queue)\n action `async` wait_for_empty(q: ♻ parallel → queue)\n action `async` for_json(js: Json_Object, @action: Json_Action)\n }\n}\n#CW3Wao3uu3Z2Fhe6\nvar logger : App_Logger {\n transient = true;\n}\n#nqXVz0rfKvDDnRD4\naction init_azure_services() {\n #OBj6PIXBqnKUsTPb // Initializes Azure Storage, Azure Blob Storage and Azure Service Bus\n #r8um59444dareUX1 // TODO: setup Application Insights instrumentation key to collect statistics\n #F5RjrZA2zg2U0vx6 if false then {\n #lKXvUpBSfoDB4Fwn @\\u267b→application_insights→init;\n }\n #SefRc2WV2N6j47d4 @\\u267b→azure_storage→init;\n #xEz0G2dzTJTWxcUJ @\\u267b→azure_blob_storage→init;\n #MvPpKEWTfR2lF47o @\\u267b→azure_service_bus→init;\n #x471VF7xAMk2DGHB @\\u267b→azure_event_hubs→init;\n #pNmq2bCUAPLYWZdS where sas_token := @\\u267b→azure_service_bus→create_sas_token(\"\");\n #zudlvXHTv0hhPwyW data→blobs := @\\u267b→azure_blob_storage→create_blob_service;\n meta private;\n}\n#iiySPFknzOIjtFIO\nvar blobs : ♻ azure_blob_storage → Blob_Service {\n transient = true;\n}\n#rmfzWWMIFG8Ule9I\naction init_restify() {\n #GL26xBm2sW9gi51S $server := @\\u267b→restify→server;\n #q44IvFRo4glW35y4 // plugins\n #eq0FvCwwbob1i3UD $server→use(@\\u267b→restify→authorization_parser);\n #Ee6qD4jb4Xr4TCYg $server→pre(@\\u267b→restify→sanitize_path);\n #xiHn2sJ7jyfBOFLf $throttle := @\\u267b→restify→throttle;\n #ZU1qf4WMSwf2ZZs8 where rate := 40;\n #S04R2349FF42Rb2O where burst := 100;\n #qa878gtstkVP7tTO where ip := true;\n #kld3kZpnFcZ4TVhB $server→use($throttle);\n #sptEZCs70xCB68CA $server→use(@\\u267b→restify→CORS);\n #mFFPDO74C64OWH8s $server→use(@\\u267b→restify→body_parser);\n #xSqpOmBEP6L2VCFi $server→use(@\\u267b→restify→gzip_response);\n #xR4QGtRsV3hGoSJQ $server→use(@\\u267b→restify→query_parser);\n #x9bNZzJ9tZk0l1Z4 $server→use(@\\u267b→restify→conditional_request);\n #buXcIfKig0apgL4x @\\u267b→restify_touchdevelop→autobind($server);\n #O8e4in6wAR7ZF8Ke code→init_routes;\n #UAx1DGb27XEqkYO5 $server→use(@\\u267b→restify_touchdevelop→errors_to_log(data→logger));\n meta private;\n}\n#HCPFq2ujaTerxlXG meta import restify {\n pub \"uqffa\"\n usage {\n action `async` `type` Request_Handler(req: ♻ restify → Request, res: ♻ restify → Response)\n #xLPhdjOebDT8w77X\n table Throttle_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xo6LfV0hyAQtz675 rate : Number\n #yZ2QZAfeW3W74JA1 burst : Number\n #JUlNvDq7Hm9cTUAG ip : Boolean\n #w2h4dcf4I5K5h7kn xff : Boolean\n #RO3Sx6iTt4WsVBm6 username : Boolean\n #VbsYnDvr3t4Xr4VA maxKeys : Number\n #w25h9R5LKJnWiBNu tokensTable : ♻ restify → Tokens_Table\n }\n }\n #xdeuBx505IsZ6eEI\n table Serve_Static_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #NfWLVJBBbHvtMqkl default : String\n #KvIMj1sEoAwQCf22 maxAge : Number\n }\n }\n #mqEMUbizkEp6naSD\n table CORS_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xMYYV6C3eS7PWsfQ origins : String\n #z5HdpFdSi792e1OX credentials : Boolean\n #Fw1D0A9ZfeMCf5c3 headers : String\n }\n }\n #w2zTzWkfMf01yOko\n table Body_Parser_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #mhaHCLobgUgMrv72 maxBodySize : Number\n #xr4fKleNd4wHHP1l mapParams : Boolean\n #st0ir2vLTxbLTQWB mapFiles : Boolean\n #z5ah2mZWb8c5FmTM overrideParams : Boolean\n }\n }\n #xv4yZciZi2wFoqpM\n table Send_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #svWYln7UIackFIpB status : Number\n }\n }\n #BVGhpbmca\n table HTTP_Status_Codes {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #BVGhpbmcaMjAwIE9L @200_OK : Number\n #BVGhpbmcaMjAxIENyZWF0ZWQa @201_Created : Number\n #BVGhpbmcaMzAwIE11bHRpcGxlIENob2ljZXMa @300_Multiple_Choices : Number\n #BVGhpbmcaMzAxIE1vdmVkIFBlcm1hbmVudGx5 @301_Moved_Permanently : Number\n #BVGhpbmcaMzAyIE1vdmVkIFRlbXBvcmFyaWx5 @302_Moved_Temporarily : Number\n #BVGhpbmcaMzAzIFNlZSBPdGhlcgaa @303_See_Other : Number\n #BVGhpbmcaMzA0IE5vdCBNb2RpZmllZAaa @304_Not_Modified : Number\n #BVGhpbmcaMzA3IFRlbXBvcmFyeSBSZWRpcmVjdAaa @307_Temporary_Redirect : Number\n #BVGhpbmcaNDAwIEJhZCBSZXF1ZXN0 @400_Bad_Request : Number\n #BVGhpbmcaNDAxIFVuYXV0aG9yaXplZAaa @401_Unauthorized : Number\n #BVGhpbmcaNDAyIFBheW1lbnQgUmVxdWlyZWQa @402_Payment_Required : Number\n #BVGhpbmcaNDAzIEZvcmJpZGRlbgaa @403_Forbidden : Number\n #BVGhpbmcaNDA0IE5vdCBGb3VuZAaa @404_Not_Found : Number\n #BVGhpbmcaNDA1IE1ldGhvZCBOb3QgQWxsb3dlZAaa @405_Method_Not_Allowed : Number\n #BVGhpbmcaNDA4IFJlcXVlc3QgVGltZW91dAaa @408_Request_Timeout : Number\n #BVGhpbmcaNDA5IENvbmZsaWN0 @409_Conflict : Number\n #BVGhpbmcaNDEwIEdvbmUa @410_Gone : Number\n #BVGhpbmcaNDEyIFByZWNvbmRpdGlvbiBGYWlsZWQa @412_Precondition_Failed : Number\n #BVGhpbmcaNDEzIFJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZQaa @413_Request_Entity_Too_Large : Number\n #BVGhpbmcaNDE1IFVuc3VwcG9ydGVkIE1lZGlhIFR5cGUa @415_Unsupported_Media_Type : Number\n #BVGhpbmcaNDE4IEltIGEgdGVhcG90 @418_Im_a_teapot : Number\n #BVGhpbmcaNDIyIFVucHJvY2Vzc2FibGUgRW50aXR5 @422_Unprocessable_Entity : Number\n #BVGhpbmcaNDIzIExvY2tlZAaa @423_Locked : Number\n #BVGhpbmcaNDI0IEZhaWxlZCBEZXBlbmRlbmN5 @424_Failed_Dependency : Number\n #BVGhpbmcaNDI1IFVub3JkZXJlZCBDb2xsZWN0aW9u @425_Unordered_Collection : Number\n #BVGhpbmcaNDI5IFRvbyBNYW55IFJlcXVlc3Rz @429_Too_Many_Requests : Number\n #BVGhpbmcaNTAwIEludGVybmFsIFNlcnZlciBFcnJvcgaa @500_Internal_Server_Error : Number\n #BVGhpbmcaNTAxIE5vdCBJbXBsZW1lbnRlZAaa @501_Not_Implemented : Number\n #BVGhpbmcaNTAzIFNlcnZpY2UgVW5hdmFpbGFibGUa @503_Service_Unavailable : Number\n }\n }\n type Request\n type Response\n type Tokens_Table\n type Server\n type Middleware\n type Error\n action `sync` use(server: ♻ restify → Server, mid: ♻ restify → Middleware)\n action `sync` get(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` post(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` server() returns(server: ♻ restify → Server)\n action `sync` send(res: ♻ restify → Response, content: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` status(res: ♻ restify → Response, status: Number)\n action `sync` is(req: ♻ restify → Request, type: String) returns(r: Boolean)\n action `sync` accepts(req: ♻ restify → Request, types: String) returns(type: String)\n action `sync` put(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` del(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` head(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` pre(server: ♻ restify → Server, mid: ♻ restify → Middleware)\n action `sync` CORS(options\\u003f: ♻ restify → CORS_Options) returns(mid: ♻ restify → Middleware)\n action `sync` conditional_request() returns(mid: ♻ restify → Middleware)\n action `sync` route(server: ♻ restify → Server, method: String, path: String, @then: ♻ restify → Request_Handler)\n action `sync` json(res: ♻ restify → Response, content: Json_Object, options\\u003f: ♻ restify → Send_Options)\n action `sync` next(res: ♻ restify → Response)\n action `sync` next_error(res: ♻ restify → Response, error: ♻ restify → Error)\n action `sync` address(server: ♻ restify → Server) returns(address: String)\n action `sync` gzip_response() returns(mid: ♻ restify → Middleware)\n action `sync` header(req: ♻ restify → Request, name: String) returns(value: String)\n action `sync` is_secure(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` is_chunked(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` is_keep_alive(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` set_header(res: ♻ restify → Response, name: String, value: String)\n action `sync` body_parser(options\\u003f: ♻ restify → Body_Parser_Options) returns(mid: ♻ restify → Middleware)\n action `sync` throttle(options\\u003f: ♻ restify → Throttle_Options) returns(middleware: ♻ restify → Middleware)\n action `sync` date_parser(clock_skew: Number) returns(middleware: ♻ restify → Middleware)\n action `sync` serve_static(directory: String, options\\u003f: ♻ restify → Serve_Static_Options) returns(middleware: ♻ restify → Middleware)\n action `sync` query_parser() returns(middleware: ♻ restify → Middleware)\n action `sync` authorization_parser() returns(middleware: ♻ restify → Middleware)\n action `sync` jsonp() returns(middleware: ♻ restify → Middleware)\n action `sync` body_as_json(req: ♻ restify → Request) returns(body: Json_Object)\n action `sync` id(req: ♻ restify → Request) returns(id: String)\n action `sync` param(req: ♻ restify → Request, name: String) returns(value: String)\n action `sync` opts(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` patch(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` to_string(ser: ♻ restify → Server) returns(s: String)\n action `sync` sanitize_path() returns(middleware: ♻ restify → Middleware)\n action `sync` body(req: ♻ restify → Request) returns(body: String)\n action `sync` send_error(res: ♻ restify → Response, status: Number, message: String)\n action `sync` all(server: ♻ restify → Server, @then: ♻ restify → Request_Handler)\n action `sync` method(req: ♻ restify → Request) returns(method: String)\n action `sync` url(req: ♻ restify → Request) returns(url: String)\n action `sync` query(req: ♻ restify → Request) returns(query: Json_Object)\n action `sync` redirect(res: ♻ restify → Response, status_code: Number, url: String)\n action `sync` send_status(res: ♻ restify → Response, status_code: Number)\n action `sync` charset(res: ♻ restify → Response, encoding: String)\n action `sync` route_regex(server: ♻ restify → Server, method: String, path_regex: String, @then: ♻ restify → Request_Handler)\n action `async` read_body_as_buffer(req: ♻ restify → Request) returns(body: Buffer)\n action `sync` headers(req: ♻ restify → Request) returns(headers: Json_Object)\n action `sync` server_url(req: ♻ restify → Request) returns(url: String)\n action `sync` html(res: ♻ restify → Response, content: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` send_text(res: ♻ restify → Response, content: String, content_type: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` send_buffer(res: ♻ restify → Response, content: Buffer, content_type: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` finished(res: ♻ restify → Response) returns(done: Boolean)\n action `sync` http() returns(codes: ♻ restify → HTTP_Status_Codes)\n }\n}\n#MLbRHC7j0u4Bo4GQ meta import restify_touchdevelop {\n pub \"dvuhb\"\n usage {\n action `sync` autobind(server: ♻ restify → Server)\n action `sync` errors_to_log(logger: App_Logger) returns(middleware: ♻ restify → Middleware)\n }\n #OzaDw2jYXC1r4oMK resolve restify = ♻ restify with {\n }\n}\n#Tnw31Dmg2nmrVqYq meta import azure_event_hubs {\n pub \"qbjtg\"\n usage {\n #qy4yPchAE7AUedlB\n table Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Name of the event hub\n #BULIHveLGv3xhPGc hub_namespace : String\n // Shared Access Signature token; otherwise the server setting ``AZURE_SERVICEBUS_SAS_TOKEN`` is used.\n #xr7jIhKzmCpq0i5N sas_token : String\n }\n }\n #EyRHf2UILCkoocED\n table Event_Hub {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #t4VjI1BVPLvcUl22 name : String\n }\n }\n action `sync` init(options\\u003f: ♻ azure_event_hubs → Options)\n action `async` send_message(hub: ♻ azure_event_hubs → Event_Hub, device_id: String, msg: String) returns(status: Number)\n action `async` create_event_hub_if_not_exists(name_: String) returns(hub: ♻ azure_event_hubs → Event_Hub)\n action `async` send_message_as_json(hub: ♻ azure_event_hubs → Event_Hub, device_id: String, msg: Json_Object) returns(status: Number)\n }\n}\n#xcDhCtrxPsQBOdut\naction init_routes() {\n #f2p7glhNykvLLVg0 // TODO: add custom routes here\n #xLyImlUfp28hk6Pb $server := @\\u267b→restify→server;\n #B2Ui2S2BrMhefyH4 $server→get(\"/echo\", $@then);\n #c58sWTLqXwkWaboA where @then(req: ♻ restify → Request, res: ♻ restify → Response) {\n #yXsNFxumA3UsfrbL $res→send($req→body);\n }\n meta private;\n}\n#xZ4HxLh7nvC9Ye4O meta import node_hash {\n pub \"ezbka\"\n usage {\n action `sync` sha256(value: String) returns(digest: String)\n action `sync` sha1(value: String) returns(digest: String)\n }\n #xLAq93oXbklxTC8e resolve node_crypto = ♻ node_crypto with {\n }\n}\n#xwBt607irxmtq17g meta import node_crypto {\n pub \"oevpc\"\n usage {\n type credentials\n type hash\n type hmac\n type cipher\n type decipher\n type sign\n type verify\n type DiffieHellman\n action `sync` get_ciphers() returns(ciphers: Collection[String])\n action `sync` get_hashes() returns(hashes: Collection[String])\n action `sync` create_credentials(details: Json_Object) returns(credentials: ♻ node_crypto → credentials)\n action `sync` create_hash(algorithm: String) returns(hash: ♻ node_crypto → hash)\n action `sync` update_hash(hash: ♻ node_crypto → hash, hash_data: Buffer)\n action `sync` digest_hash(hash: ♻ node_crypto → hash) returns(digest: Buffer)\n action `sync` update_hmac(hmac: ♻ node_crypto → hmac, hmac_data: Buffer)\n action `sync` digest_hmac(hmac: ♻ node_crypto → hmac) returns(digest: Buffer)\n action `sync` create_cipher(algorithm: String, password: Buffer) returns(cipher: ♻ node_crypto → cipher)\n action `sync` create_cipher_iv(algorithm: String, key: Buffer, iv: Buffer) returns(iv_cipher: ♻ node_crypto → cipher)\n action `sync` update_cipher(cipher: ♻ node_crypto → cipher, _data: Buffer) returns(enciphered: Buffer)\n action `sync` final(cipher: ♻ node_crypto → cipher) returns(cipher_final: Buffer)\n action `sync` set_auto_padding(cipher: ♻ node_crypto → cipher)\n action `sync` create_decipher(algorithm: String, password: Buffer) returns(decipher: ♻ node_crypto → decipher)\n action `sync` create_decipher_iv(algorithm: String, key: Buffer, iv: Buffer) returns(iv_decipher: ♻ node_crypto → decipher)\n action `sync` update_decipher(decipher: ♻ node_crypto → decipher, _data: Buffer) returns(deciphered: Buffer)\n action `sync` final_(decipher: ♻ node_crypto → decipher) returns(decipher_final: Buffer)\n action `sync` set_auto_padding_(decipher: ♻ node_crypto → decipher)\n action `sync` create_sign(algorithm: String) returns(sign: ♻ node_crypto → sign)\n action `sync` update_sign(sign: ♻ node_crypto → sign, sign\\_data: Buffer)\n action `sync` sign_(sign: ♻ node_crypto → sign, private_key: String) returns(signature: Buffer)\n action `sync` create_verify(algorithm: String) returns(verify: ♻ node_crypto → verify)\n action `sync` update_verify(verify: ♻ node_crypto → verify, verify_data: Buffer)\n action `sync` verify_(verify: ♻ node_crypto → verify, object: String, signature: Buffer) returns(valid: Boolean)\n action `sync` create_DiffieHellman(prime_length: Number) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `sync` generate_keys(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(public_key: Buffer)\n action `sync` compute_secret(DiffieHellman: ♻ node_crypto → DiffieHellman, other_public_key: Buffer) returns(shared_secret: Buffer)\n action `sync` get_prime(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(DH_prime: Buffer)\n action `sync` get_generator(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(generator: Buffer)\n action `sync` get_public_key(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(public_key: Buffer)\n action `sync` get_private_key(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(private_key: Buffer)\n action `sync` set_public_key(DiffieHellman: ♻ node_crypto → DiffieHellman, public_key: Buffer)\n action `sync` set_private_key(DiffieHellman: ♻ node_crypto → DiffieHellman, private_key: Buffer)\n action `sync` get_DiffieHellman(group_name: String) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `async` pbkdf2(password: String, salt: String, iterations: Number, keylen: Number) returns(derived_key: String)\n action `async` random_bytes(size: Number) returns(strong_data: Buffer)\n action `sync` DEFAULT\\_ENCODING() returns(default_encoding: String)\n action `sync` create_hmac(algorithm: String, key: String) returns(hmac: ♻ node_crypto → hmac)\n action `sync` create_DiffieHellmanWithPrime(prime: Buffer) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `async` pseudo_random_bytes(size: Number) returns(non\\u002dstrong_data: Buffer)\n action `sync` update_hash_string(hash: ♻ node_crypto → hash, hash_data: String)\n action `async` new_guid() returns(guid: String)\n }\n}\n#vKRQhu9LYo2GA4Hf meta import application_insights {\n pub \"kgwpa\"\n usage {\n #BVGhpbmca\n table Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xYM2DFyGKHO12BbR track_uncaught_exceptions : Boolean\n }\n }\n #jQX44THKDWpQpHhU\n table Event_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #lTT22PAyjeXo47EF arguments : Json_Object\n #x7R256x3M3SbrPmi duration_in_ms : Number\n #gJxbxKuoVAifu2Lo duration_since : Number\n }\n }\n #ZGPN2rZbWO22hiYK\n table Request_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #x8GBdWsNotD1GLcL properties : Json_Object\n #b48kCc1eoez2GDNM duration_override : Number\n }\n }\n action `sync` init(options\\u003f: ♻ application_insights → Options) returns(active: Boolean)\n }\n}\n", "krvn": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank docs\";\nmeta icon \"GPS\";\nmeta color \"#ffa1caf1\";\nmeta rootId \"kPNw3L4aANMbOhHGjD3Zu2QI\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// TODO: update the description. #docs\n#KuT2EaOAEn47T69Y\naction main() {\n #yiJrPOX5VkxgcJrp // You can use the [](/markdown) syntax to write **documentation**.\n #K1W8LqOgGHoaTE04 $x := 42;\n #velf3fNZzB4D7q65 // And interleave code as need or even insert snippets using the ``decl`` macro:\n #zrmo9BjVQdTGtzPL // {decl:main}\n}\n#xOiiduqfYBGjAp4X\nvar snd : Sound {\n is\\_resource = true;\n transient = true;\n}\n#LrnoHkgZHl46sgP8\naction test() {\n #aS25XlJHypSNPB32 skip;\n meta private;\n meta test;\n}\n", +"kwlwa": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank minecraft pi\";\nmeta color \"#ffffffff\";\nmeta rootId \"UqtPMmqsRpLtBLICK3xNRKmo\";\nmeta iconArtId \"eopyzwpm\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta splitScreen \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A empty Minecraft Pi script #minecraft\n#ALKdKR1Vv5Af8ary\naction main() {\n #psv5rGsmdRE2aFyJ minecraft[lib minecraft_pi] →command(\"/time set night\");\n #H8A2xEaYfWcaRcnx minecraft[lib minecraft_pi] →forever;\n #KADEM3wBEa3TZ4S5 where `implicit` \\_body\\_() {\n #RHjmHHCG1NEkxwQU pos := minecraft[lib minecraft_pi] →player_→position;\n #tzHVxYsw9oZ2AuBi pos→fill(\"flower yellow\");\n }\n}\n#szfANXm2yM2bBx92 meta import minecraft_pi {\n pub \"sakwc\"\n usage {\n #BVGhpbmca\n table Block_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xNQF2IfWS5kUTCuC state : Number\n #xUNtn4WzFNh0J275 wool : String\n }\n }\n #xIIDIryL3GdLzzFH\n table Connect_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #IhKVKMjdA949jNr3 host : String\n #PQgsvjixlAlu49Bw port : Number\n #nlMXsJlluWZB1fNN proxy : String\n }\n }\n type Entity\n #umgRs0Idq3y9jRyc\n table Block_Event {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #SCV1txxxrjigP8XC kind : String\n #UIy6UFvY6WJWDDoA x : Number\n #wWASeEjKJDoiqrL2 y : Number\n #MkoIqcTcP3QiIoot z : Number\n #kYCW4sVB0Q5jQy0Q face : Number\n #EayHvTpmMjNF3Sfh entity : ♻ minecraft_pi → Entity\n }\n }\n #pqaWOjEWNqEkbxwJ\n table Position {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #L4NO4JXo2Sev2b1J x : Number\n #x2UU2Lt4BiV8NNNz y : Number\n #gw4VDwinZ6yVcwzL z : Number\n }\n }\n #eVDb6TwJ7CKitS8g\n table Repeat_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #VB0iDf9EazabCCQM delay : Number\n }\n }\n\n action `async` connect(options\\u003f: ♻ minecraft_pi → Connect_Options)\n action `async` fill(@this: ♻ minecraft_pi → Position, name: String, options\\u003f: ♻ minecraft_pi → Block_Options) returns(r: ♻ minecraft_pi → Position)\n action `async` fill_many(@this: ♻ minecraft_pi → Position, corner: ♻ minecraft_pi → Position, name: String, options\\u003f: ♻ minecraft_pi → Block_Options) returns(r: ♻ minecraft_pi → Position)\n action `async` block(@this: ♻ minecraft_pi → Position) returns(name: String)\n action `async` height(@this: ♻ minecraft_pi → Position) returns(h: Number)\n action `async` chat(msg: String)\n action `async` position(entity: ♻ minecraft_pi → Entity) returns(pos: ♻ minecraft_pi → Position)\n action `async` set_position(entity: ♻ minecraft_pi → Entity, p: ♻ minecraft_pi → Position)\n action `sync` is_connected() returns(r: Boolean)\n action `async` player_() returns(p: ♻ minecraft_pi → Entity)\n action `async` direction(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` rotation(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` pitch(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` player_by_name(name: String) returns(steve: ♻ minecraft_pi → Entity)\n action `sync` block_names() returns(names: Collection[String])\n action `async` forever(body: Action, options\\u003f: ♻ minecraft_pi → Repeat_Options) returns(t: Timer)\n action `sync` wool_colors() returns(cs: Collection[Color])\n action `sync` wool_color(c: Color) returns(name: String)\n action `async` spawn(@this: ♻ minecraft_pi → Position, kind: String) returns(mob: ♻ minecraft_pi → Entity)\n action `async` test_spawn()\n action `async` up(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` down(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` move(@this: ♻ minecraft_pi → Position, x: Number, y: Number, z: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` pos(x: Number, y: Number, z: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` west(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` east(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` north(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` south(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` strafe(@this: ♻ minecraft_pi → Position, x: Number, z: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` ground(@this: ♻ minecraft_pi → Position) returns(r: ♻ minecraft_pi → Position)\n action `async` build_wall(@this: ♻ minecraft_pi → Position, corner: ♻ minecraft_pi → Position, height: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options) returns(r: ♻ minecraft_pi → Position)\n action `async` wire_redstone(@this: ♻ minecraft_pi → Position, corner: ♻ minecraft_pi → Position) returns(r: ♻ minecraft_pi → Position)\n action `async` fill_redstone(@this: ♻ minecraft_pi → Position, name: String) returns(r: ♻ minecraft_pi → Position)\n action `async` command(msg: String)\n }\n #Me0PRA75FE3bCr4V resolve shell = ♻ shell with {\n }\n}\n#roUgK2K1uqFWdGUx meta import shell {\n pub \"gzeda\"\n usage {\n #BdGhpbmca\n table Exec_Output {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #YaaLgMz45N5ZuAeU success : Boolean\n #qrwQiGIhHhUhb8AF error : String\n #ijyQCE4KPQL2ziZD code : Number\n #wf4AkGfhLyWkyKhQ stdout : String\n #ZyLfqXXM99R1znCa stderr : String\n }\n }\n #ttC12C2SJrh1ODjl\n table Serial_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #wXa4BRcG6mdxKU25 delimiter : String\n }\n }\n #Aamro6VY4UQ3IxE3\n table Exec_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Additional environment variables\n #xhtUoyBrBc8JWpKW env : String_Map\n }\n }\n type Command_Result\n type Shell_Socket\n\n action `async` write_file(path: String, content: String) returns(res: ♻ shell → Command_Result)\n action `sync` mkpath(folder: String, name: String) returns(path: String)\n action `async` mkdir(path: String) returns(res: ♻ shell → Command_Result)\n action `async` exec(cmd: String, cwd: String, options\\u003f: ♻ shell → Exec_Options) returns(res: ♻ shell → Exec_Output)\n action `sync` logger() returns(logger: App_Logger)\n action `async` exec_file(cmd: String, args: Collection[String], cwd: String, options\\u003f: ♻ shell → Exec_Options) returns(res: ♻ shell → Exec_Output)\n action `async` python_env() returns(res: ♻ shell → Command_Result)\n action `async` tcp_connect(host: String, port: Number) returns(sock: ♻ shell → Shell_Socket)\n action `async` receive(sock: ♻ shell → Shell_Socket) returns(netdata: String)\n action `async` send(sock: ♻ shell → Shell_Socket, netdata: String)\n action `async` close(sock: ♻ shell → Shell_Socket)\n action `async` serialport_connect(name: String, options\\u003f: ♻ shell → Serial_Options) returns(sock: ♻ shell → Shell_Socket)\n action `async` serial_list() returns(ports: Json_Object)\n action `async` read_file(path: String) returns(content: String)\n }\n}\n", "kxwna": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"contents\";\nmeta rootId \"xD9L5v3m9GPYhDNjn5CSnE5o\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Documentation. #docs #content\n#OVgF8idv6dH4kLiKyBNuGLSY\naction main() {\n #xfl4uVD2RY4FWYpg // {priority:1}\n #xyAN4z6sCQKOwHWc // Welcome to TouchDevelop, a friendly **mobile app creation environment**. With TouchDevelop you can create apps on your mobile phone, tablet, and PC, and share the apps you create in the cloud.\n #g3DL66Cb9S0ZegTR // ## contents\n #QOmTj1hDA4y6mKlZ // * [Getting Started](/gettingstarted) Learn more about TouchDevelop, and create your first app!\n #nth3IKoU9pTSwIb1 // * [Language Reference](/language) Dig into the details of coding with TouchDevelop.\n #xNCKcYSczgDz7V9A // * [API Reference](/api) Explore the TouchDevelop API, and learn more about the services, types, and action types.\n #xequzJYQ145qm2Zw // * [Tutorials](/tutorials) Expand your knowledge with lots of great tutorials, from games to connected data sharing apps.\n #iN4Ls0QhUddrt9Dg // * [Social Coding](/socialcoding) Understand how to publish, share, merge your scripts with the TouchDevelop environment.\n #c72LZaRxP2NDOTnK // * [Advanced Topics](/advancedtopics) Move beyond the basics and learn about testing, debugging, and more.\n #YHnFwRwN2EXUj90o // * [Teach](/teach) Find out more about creating custom tutorials, and using TouchDevelop in the classroom.\n #ADc1YaDiZ2O74NSJ // * [Games](/games) Discover techniques for creating lots of different types of games.\n #mZEveK8nVUnOOwxh // * [FAQ](/faq) Get answers to your questions with the TouchDevelop FAQ.\n #JHO1xs6a3UF852aE // * [What's New](/whatsnew) Read our release notes for news on the latest features and fixes.\n #ynfwmb0zxcfVhs4p // * [Blog](/blog) subscribe and follow the TouchDevelop community blog\n #x4IdZphhhSfUG283 // ## legal information\n #uvgx7BQH12ER67f9 // By using TouchDevelop you agree to the [Cloud Services Agreement](https://www.touchdevelop.com/legal) with Microsoft Research. Please read our [Privacy Statement](https://www.touchdevelop.com/privacy).\n}\n", "lsrh": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank esplora\";\nmeta icon \"Controller\";\nmeta color \"#ff008000\";\nmeta rootId \"pC5UwMf4G7SPUhesWRaUHyQ6\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n// An script that gets exported to the Arduino #Esplora board.\n#main\naction setup() {\n skip;\n meta private;\n}\n#rK9jginmrEINvgw7qIb2i66k meta import esplora {\n pub \"xblmc\"\n usage {\n action `sync` millis() returns(ms: Number)\n action `sync` micros() returns(us: Number)\n action `async` delay(ms: Number)\n action `sync` acceleration() returns(p: Vector3)\n action `sync` temperature() returns(p: Number)\n action `sync` light_sensor() returns(light: Number)\n action `sync` slider() returns(pos: Number)\n action `sync` microphone() returns(sound: Number)\n action `sync` is_joystick_button_pressed() returns(b: Boolean)\n action `sync` is_button_pressed(switch_index: Number) returns(b: Boolean)\n action `sync` joystick_x() returns(x: Number)\n action `sync` joystick_y() returns(y: Number)\n action `sync` color() returns(c: Color)\n action `sync` set_color(c: Color)\n action `sync` tone(frequency: Number, ms: Number)\n action `sync` no_tone()\n }\n}\n#r75MjRvGqDKnLhJ9inuyjofK\naction main() {\n // This code emulates the Arduino Esplora runtime. Do not edit.\n code→setup;\n time→on_every_frame($perform);\n where perform() {\n code→loop;\n @\\u267b→esplora→delay(10);\n }\n}\n#OMQT5yM1JrJcj3UdHlpxgTaJ\naction loop() {\n skip;\n meta private;\n}\n", "mdrw": "meta version \"v3.0,js,ctx,refs,localcloud,unicodemodel,allasync,replay,partial\";\nmeta name \"blank pixel art\";\nmeta icon \"NineColumn\";\nmeta color \"#ff9955bb\";\nmeta rootId \"VBXALpufM78Zg6nXlU4VkoKX\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A pixel art script. #pixelart\n#RgqvETdZVOPoT1G4\naction main() {\n #QECmOCB8D9No5rO6 @\\u267b→pixel_art→set_pen_color(colors→random);\n #xO2UVI7FHoavaFrj @\\u267b→pixel_art→paint(8, 8);\n}\n#TTrakYktVjHUznf2 meta import pixel_art {\n pub \"tsrn\"\n usage {\n action `sync` create(terrain: String)\n action `async` test()\n action `sync` set_pen_color(c: Color)\n action `sync` pen_color() returns(c: Color)\n action `async` paint(x: Number, y: Number)\n action `sync` pixel(x: Number, y: Number) returns(c: Color)\n action `sync` sides() returns(cols: Number)\n action `async` test_fail()\n action `async` test_success()\n }\n}\n", "mfvka": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"touchdevelop local\";\nmeta icon \"GlobeEUA\";\nmeta color \"#ff007fff\";\nmeta rootId \"O6Rs2BjFB4g0ArT2oat8Gpfc\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Explains how to export a script to the App Store. #docs\n#main\naction main() {\n #YKeb2CW4sOdvQyW9 // {parentTopic:contents}\n #xSh4e5kqwQHcBmkx // It is possible to run TouchDevelop from a local web server on your machine. This allow TouchDevelop to work completely offline, access services required for [app generation](/exporttocordova) or code with [Minecraft](/minecraftpisetup).\n #x35eEyKbLVKI0YGH // ## installation steps\n #juuuaj9Ro2J2Clco // * install [node.js] (http://nodejs.org/)\n #c72W0S2LKE5DVZEb // * create an empty folder for your projects\n #xFRR2AdHdpXNY6Tp // * open a command prompt in your fresh folder and install the **touchdevelop** npm package.\n #hxp4ucOoAsva9ecH // > ``npm install -g http://aka.ms/touchdevelop.tgz``\n #FDTBrovQEeBZm4YP // * launch TouchDevelop locally (make sure you're in your fresh folder)\n #VdVeyI6zCWRyKLoA // > ``touchdevelop``\n #jB3SWBY83Ya2hQve // This will start the TouchDevelop editor in your default browser.\n #GG0Wwd79o4DWGali // ### using non-default browser\n #c9GeLb0N1ocQTHV0 // If you want to use a different browser run ``touchdevelop --cli`` and then point your browser to the URL printed out, it will look **something like** this:\n #Zt9aw3IdHQhkjOAj // > ``Editor URL: http://localhost:4242/editor/beta#td_deployment_key=``\n #A85X0jwZQ7nxKmA7 // It is very important to copy&paste the deployment key at the end precisely.\n #oZCkpuvERU4pSBgP // ### caching of resources\n #HZg9zZ33hRQewElr // All [art resources](/art) or scripts that are loaded while using TouchDevelop local are automatically cached on disk, which allows for a better experience.\n #dOWKEqjA2EopKrAa // If you are planning to package TouchDevelop, make sure that you use at least once each required script or tutorial so that they get cached.\n #xJW2i0dpR9ECZHbH // ### packaging\n #xk9FWWSoKznWnmdy // If you plan to package and share your local touchdevelop, you need to perform the following step.\n #OWX4ZYDjngkiBEtL // * go to the **hub**,\n #gHhslghRyoF9m2FR // * tap on `[Settings]`\n #xpnUIIdzjeb32vYB // * tap on `[save offline caches]`\n #HBWc0AdjvaE1PBPq // Copy or zip the folder containing the TouchDevelop files.\n}\n#lRC7ZP4I3ytfLfcRhscBaKF6\nvar monster : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ymggwtmn\";\n transient = true;\n}\n#xZA3MGCJ6sAJtfqSibDFTyzZ\nvar @1_Click_on_Title : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/syhbuwmb\";\n transient = true;\n}\n#x4oXuBrRP7peqBxOraPy0Ppu\nvar @2_Publish_Script : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/uegejzev\";\n transient = true;\n}\n#Pb7ZRhh1Le4Kwz16DOm6h95t\nvar @3_Click_Export_iOS : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/snnlubem\";\n transient = true;\n}\n#JiJThBxgjuQyZZagv84V67Cc\nvar @4_Export_to_App_Store : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/jhmzbank\";\n transient = true;\n}\n#u2byTeHW2wX14mnA374fzvSh\nvar @5_App_is_Ready : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/pnqogdug\";\n transient = true;\n}\n#XhCWNpaqagoeYlvuBl6OZOHa\nvar @6_Search_for_Xcode : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ukwoekck\";\n transient = true;\n}\n#ZeXqju7M5bfqlm0Gx6CYvtRK\nvar @7_Open_Xcode : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/akluqtvy\";\n transient = true;\n}\n#xzO7Z4FWRmvE3GvB3nUQGdja\nvar @8_Open_Project_Folder : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/duqdaaut\";\n transient = true;\n}\n#JOEveTZ34fcQQBSty0Y64Edz\nvar @9_Run_on_Simulator : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/vxmsyaas\";\n transient = true;\n}\n#xiLx3rI7m5QO2Xo18r4e8IkZ\nvar @10_New_App : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/mpgptjat\";\n transient = true;\n}\n#xvxHs2DcS5TxtO3WUNGJU8SX\nvar @11_App_Info_1 : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ogcsqjwj\";\n transient = true;\n}\n#ZrjNZAJFXA9xGxb5V6oiQ2fr\nvar @12_App_Info_2 : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/sqvolvpy\";\n transient = true;\n}\n#Y3AswkOZPm0qiy2UVZvlZkez\nvar @13_App_Info_3 : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/aisvqsqf\";\n transient = true;\n}\n#bBNxhIal86lYKIvamSdSIjaY\nvar @14_App_Info_4 : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/afpjiooj\";\n transient = true;\n}\n#NzF4EhVGG7woPhmPnliAixIE\nvar @15_Upload_Images : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/fxzfihkw\";\n transient = true;\n}\n#ncULKNvBE2KztzZPCeZpAkDY\nvar @16_Create_Certificate : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/uzxlvvev\";\n transient = true;\n}\n#HvyrGPpdCBgkgany57HRlfeD\nvar @17_iOS_Device : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/luyofzkt\";\n transient = true;\n}\n#jlzt0AP4sDglw23BWlpFGzmL\nvar @18_Product_Archive : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/mnuosfrx\";\n transient = true;\n}\n#ed23hfCPWk4e4wTEwn4QGZzq\nvar Provisioning_Profile : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/jdzxutxx\";\n transient = true;\n}\n#eXePACFUcwQUUlcmdK8BzBgP\nvar P_Validate : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/waeqjhwx\";\n transient = true;\n}\n#lPh2YgYpDFec75cVhrBPJBW7\nvar Distribute : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/evpvthnw\";\n transient = true;\n}\n#n7TK0c4AGeFXhyBY7vYRqXAx\nvar @3_Click_Export_iOS_2 : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/przbvosv\";\n transient = true;\n}\n", "mlqea": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"gamepad\";\nmeta icon \"JoyStick\";\nmeta color \"#ff9955bb\";\nmeta rootId \"xCYAjTKR25pBB4IRmMK0nm4f\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A library that provides a virtual gamepad with keyboard, touch, accelerometer or physical gamepads.\n#main\naction example() {\n #iAAUNeoV3SRfYzb2 // The virtual gamepad that works for accelerometer, keyboard, touch, mouse or console gamepads.\n #Iq9tqh2gWM4rizSm // The library computes a vector that represents the orientation of a virtual joystick.\n #owlUjuL8ac2hBSAk // {hide}\n #FuQWVPr2FDIJMzYz $board := @\\u267b→game→start;\n #xgK3eb0xoxbkyneh $sprite := $board→create_ellipse(20, 20);\n #ZWPwsGsl9p64ZV3A // {/hide}\n #OmphHpb5CKI7uf6f // ### reading data\n #Vskl34wFNiYSQrbW // Use the `current` action to get the current angle of the joystick and the button status.\n #Xe4qJzFH1BMswBVG $p := code→current;\n #Govj2D79bADsyfG4 // The values ``x`` and ``y`` of ``p`` can be used to apply speed or acceleration to sprites. They are always between ``-1`` and ``1``.\n #xJS2TNmfJBQZzks4 $sprite→set_speed($p→x * 50, $p→y * 50);\n #xLS5Ne0GtAN3wBxc // The values of ``x`` and ``y`` ramp up from ``0`` to ``1`` or ``-1`` which allows to create smooth animations. They also ramp down.\n #gesKcthIr5iJV9Bf // ### handling button presses\n #LZHni02fBp8J2dYZ // The value ``z`` indicates if the button is pressed. ``z`` also ramps up from ``0`` to ``1``.\n #krIr922mSJTyUZQl $sprite→set_acceleration_y($p→z * 10);\n #xiCO9EoNc4Nerwbo // You can also register an action that will be raised when the button is first pressed. If the user uses a keyboard, this means that ``space`` is pressed, or it may be a mouse click or pressing a button on a gamepad.\n #qZu0cbj2DyIfzU52 $binding := code→on_button_pressed($@action);\n #imT7vW8zBSjB3Aop where @action() {\n #rVEC9zk3x0gC4OZb // flap the bird!\n }\n #GNOC4Ry9eimP29CM // Later on, you can use ``binding->delete`` to remove the action.\n #cfjCbfsrwwA0ZqyT $binding→delete;\n #gwgZhz1b4YvIekRt // ### controlling sprites\n #k2bfNyVWE76ny2I7 // The ``control sprite`` provides an easy way to control a sprite with the joystick.\n #jzhDiTAvPAg57yvr code→control_sprite($sprite, 50, 0);\n #xOJhGHYxDX6GHNuT // * where ``50`` is the maximum ``speed x`` so the sprite moves horizontally with the joystick\n #S908Ce7SKZnvE2Bg // * where ``0`` is the maximum ``speed y`` so the sprite does **not** move vertically with the joystick.\n #TxTHOrAKW201NNub // ### controlling the background scene\n #UHNq8hFA8hDCdhIg // Similarly to ``control sprite``, the action ``control backgroung scene`` will move the scene view position according to the ``current`` value.\n #SvPpf8Hshabf4Uvm code→control_background_scene(0, 10);\n #kRyIJdzWHDHzzqAe // ### accelerometer\n #x5sT7QqO3Ys47Gre // By default, the joystick uses the accelerometer if available. It can be disbales or enabled using ``settings->use accelerometer``.\n #H2L3DDUr5DSWJbOI code→settings→use_accelerometer := false;\n #AouqZGsi7N5U7ubU // When the accelerometer is used, touch is used solely to record button presses.\n #x2VFytPS2zWM4dlC // ### custom keys\n #jYpIpb7O5eCkMXG8 // By default, the keyboard uses the arrow keys and space. Use `set keys` to use a different set of keys.\n #gGG5PlUtox03FCmh code→settings→set_keys(\"a\", \"w\", \"d\", \"s\", \"space\");\n meta private;\n meta test;\n}\n#k4esRNhmmMLxrqp8 meta import game {\n pub \"iroye\"\n usage {\n #BVGhpbmca\n table Splash_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #X13V3PCWTQpT2ORT seconds : Number\n #nk8FBg8KCO4gn30S foreground_color : Color\n #Tl89ovYzNYTzCj6A background_color : Color\n }\n }\n action `sync` set_score(value: Number)\n action `async` set_life(value: Number)\n action `sync` start_timer()\n action `sync` start_countdown_timer(seconds: Number)\n action `sync` life() returns(r: Number)\n action `sync` score() returns(r: Number)\n action `sync` current_time() returns(seconds: Number)\n action `sync` add_score(value: Number)\n action `async` add_life(value: Number)\n action `sync` clear_timer()\n action `async` remove_life(value: Number)\n action `async` end()\n action `async` start() returns(board: Board)\n action `sync` reset()\n action `async` start_with_fixed_size(width: Number, height: Number) returns(board: Board)\n action `async` start_with_background_picture(pic: Picture) returns(board: Board)\n action `sync` board() returns(board: Board)\n action `sync` on_end(body: Action)\n action `async` start_landscape() returns(board: Board)\n action `async` start_portrait() returns(board: Board)\n action `sync` set_hud_colors(life: Color, timer: Color, score: Color)\n action `sync` hud_sprites() returns(sprites: Sprite_Set)\n action `async` life_visible() returns(b: Boolean)\n action `async` set_life_visible(visible: Boolean)\n action `sync` sprites() returns(sprites: Sprite_Set)\n action `async` set_background_scene(direction: String, pic: Picture)\n action `sync` bounce_on_sides()\n action `sync` create_sprite(pic: Picture) returns(sprite: Sprite)\n action `async` splash(message: String, options\\u003f: ♻ game → Splash_Options)\n action `async` splash_text(message: String, seconds: Number, foreground: Color, background: Color, done: Action)\n }\n}\n#qDcj96avRPrOW0HP9ddHIGDX\naction current() returns(#SPQYjzyoWvpeE5gt p: Vector3) {\n #ufnmt4tCZLjrO8Tw // Gets the current gamepad position. ``x``, ``y`` represent the angle, ``z`` represent the button. ``x`` is between ``-1`` (left) and ``1`` (right), ``y`` between ``-1`` (up) and ``1`` (down), ``z`` between ``0`` (released) and ``1`` (pressed).\n #K24bzS6d5dLCg70O code→initialize;\n #xAMQZhHolKwnH85G $now := time→now;\n #NKbyhJdf10449w1j $dt := code→check_last_current($now);\n #tvuqtvwZjf2WTFdV $vector := records→Vector→create;\n #SgjdVJE0JKpuCIDH $any_gamepad := false;\n #UCUZ4M8UBYsds6Bk foreach gamepad in senses→gamepads\n #PS1NasLc8vbJrVTF where $gamepad→is_connected\n do {\n #xlXsKI4PRPX0iBSR code→compute_gamepad($dt, $vector, $gamepad);\n #DyNM0jOUPeDyS6fX $any_gamepad := true;\n }\n #xBZ8zCuwMS8krcBu if `not` $any_gamepad then {\n #CyCCbKxg4vqTMewD code→compute_keyboard($dt, $vector);\n }\n #cwR4Eid54DDf549Z if data→\\_settings→\\_accelerometer then {\n #kp59r5CUOcmqTupl code→compute_accelerometer($dt, $vector);\n }\n else { #B9H3ZCbj5SQ03j7I if @\\u267b→game→board→touched then {\n #PGgITIMyD77HqtMV code→compute_touch($dt, $vector);\n }\n else { } } \n #jFEB3QBWrx0td7Uf data→\\_current := math→create_vector3($vector→x, $vector→y, $vector→z);\n #n6WZh7F4fYEQIvv1 data→\\_current_time := $now;\n #oDUWcYIBCj2AGWFI $p := data→\\_current;\n meta sync;\n}\n#LJp5GBFLELwUrK3r6yVHOfL1\nvar \\_current : Vector3 {\n transient = true;\n}\n#k7HatejkjqfIA242SSMpitAK\nvar \\_current_time : DateTime {\n transient = true;\n}\n#uYKZvu9VJlQJWlN4YZ8bPdOY\naction compute_touch(#EtnUI7jAfTxsnmC2 dt: Number, #lwWp15agk6qD4vdN vector: * Vector) {\n #Yc6Ljy2Kf77vAJE1 contract→assert( `not` data→\\_settings→\\_accelerometer, \"\");\n #aeff4ISwAiII2RYg $board := @\\u267b→game→board;\n #yo6SJ6XLPigLcePS $dist := $board→touch_current→subtract($board→touch_start);\n #nd4lO2qkviheKQQJ $r := math→min($board→width, $board→height) * 0.3;\n #xTZ3w0K2Vk4SDgG5 $m := math→max($r, math→max(math→abs($dist→x), math→abs($dist→y)));\n #x5FkjD7QKOi14bXx $p := $dist→scale(1 / $m * data→\\_settings→\\_keyboard_factor);\n #ar97E48abhnLItBH $vector→x := math→clamp( - 1, 1, $vector→x + $p→x);\n #xWe42O1gJ8jTOtYh $vector→y := math→clamp( - 1, 1, $vector→y + $p→y);\n meta private;\n meta sync;\n}\n#l4qZbEXuo0rCJ9p2l2546YMX\naction compute_keyboard(#agAE8QNlfT10TA8L seconds: Number, #QqtJbJ3bDDMJ6U1U vector: * Vector) {\n #xQvrhXDEZNLchRD1 $ramp := 0.4;\n #WqLlvN4eJaGlJC0G $deramp := 0.9;\n #GWAdBf4KVYtidymi $settings := data→\\_settings;\n #gOqhTN0E7f2RegEc $f := $settings→\\_keyboard_factor;\n #aAkuAGlBzQhKJw20 if `not` data→\\_current→is_invalid `and` $seconds > 0 then {\n #N0Bkg1ID2lRgdDtf $vector→x := data→\\_current→x;\n #lvUYGko8mZzeHc6V $vector→y := data→\\_current→y;\n #UQqL226sbMoeuKuS $vector→z := data→\\_current→z;\n }\n #j5LDrMTjvgNlPcNv if senses→is_key_pressed($settings→\\_left_key) then {\n #xn9Er5aq2bDVJi2I $vector→x := math→clamp( - 1, 0, ($vector→x - $seconds / $ramp) * $f);\n }\n else { #Kl0ql42NLDKUGvRF if senses→is_key_pressed($settings→\\_right_key) then {\n #Sqqq3YnIb2PBOqBS $vector→x := math→clamp(0, 1, ($vector→x + $seconds / $ramp) * $f);\n }\n else {\n #HayKmkb4wsCPhWA7 $vector→x := $vector→x * $deramp * $f;\n #pXLE351So9iM8EYM if math→abs($vector→x) < 0.05 then {\n #UKGenIUclEZAJnZ9 $vector→x := 0;\n }\n }\n } \n #xCOScmqJMBvGOFsF if senses→is_key_pressed($settings→\\_down_key) then {\n #mymWVgslyKEmFBDi $vector→y := math→clamp(0, 1, ($vector→y + $seconds / $ramp) * $f);\n }\n else { #ANgXb90ciinu1c08 if senses→is_key_pressed($settings→\\_up_key) then {\n #wzqzC3IBiGt83wCI $vector→y := math→clamp( - 1, 0, ($vector→y - $seconds / $ramp) * $f);\n }\n else {\n #H5PDO9dmid1b4OG6 $vector→y := $vector→y * $deramp * $f;\n #oVbCQ74UwHpbDU3m if math→abs($vector→y) < 0.05 then {\n #rdxiuAjRrQaBVDgJ $vector→y := 0;\n }\n }\n } \n #P7vuxXV4hIsABGid $click := data→\\_settings→\\_accelerometer `and` @\\u267b→game→board→touched;\n #NJia5AtUzVRAue2I if senses→is_key_pressed($settings→\\_button_key) `or` $click then {\n #jDP8eblTFKDgs0P4 $vector→z := math→clamp(0, 1, ($vector→z + $seconds / $ramp) * $f);\n }\n else {\n #bfu4Xe5wPIFVYSU0 $vector→z := $vector→z * $deramp * $f;\n #kctdFFz43brt9U5o if $vector→z < 0.05 then {\n #Y8kiexxwCtaTI1EQ $vector→z := 0;\n }\n }\n meta private;\n meta sync;\n}\n#AKyPSHgYSnMUTq5QWdoGYf4b\naction check_last_current(#xjgjVLBvL0WGZ6YX now: DateTime) returns(#Thizg9eKf28lICqA dt: Number) {\n #ObcOFDPPp9WxhSt2 $dt := 0;\n #Kb72ZpRTA3m4Kp8U if `not` data→\\_current→is_invalid then {\n #x8ik4sk6ewFwAcfS $dt := $now→subtract(data→\\_current_time);\n #Ew4zlsnuP3h4JSI9 if $dt > 1 then {\n #EXRHRdWwI0F4HPp8 data→\\_current := invalid→vector3;\n #SquuGsAcxSF7COR1 $dt := 0;\n }\n }\n meta private;\n meta sync;\n}\n#UJBkmukg7xj2SmmTAcdYmdmZ\naction test() {\n #jHqREyI9wOqOCUqc $board := @\\u267b→game→start;\n #inxjywJVM590S1zh $board→set_debug_mode(true);\n #xGbKRxfvo4Q93kKk $sprite := $board→create_ellipse(100, 100);\n #Ic9uUBobqM3degOG $board→add_on_every_frame($perform);\n #xqlRo4rJOJlPMyen where perform() {\n #xM22BN7aFmcIrgzt $p := code→current;\n #RP4MWoA4i0njhVTB app→log(\"current: \" ∥ $p);\n #sUHisiH35bEla3UR $sprite→set_speed($p→x * 150, $p→y * 150);\n #yuKJPVDFO1cFN4g1 $sprite→set_color(colors→wheel($p→z));\n }\n #d4220TFiigYosuSS code→on_button_pressed($@action);\n #K46EjvEbVdCKdBQ4 where @action() {\n #UkfR0OrhfR70BXgP $anim := $sprite→create_animation;\n #rlbsft24Zld2dOXf $anim→beat(1.5, 2, 1.2);\n }\n meta private;\n meta test;\n}\n#xLL5SIqze7BJH9jArgnxFL1w\naction set_keys(#F1fwvPuXyWqOAgyE settings: * Settings, #qCVhDclIfaTvxR48 left: String, #jItXnxypevC73xkO up: String, #phYJQlteKaNIY8Fy right: String, #Rhj5ziYa0g1IgTfO down: String, #fGxfwRyt0642IsC2 button: String) {\n #eF8U1KL4QoC09Dpz // Sets custom keys to control the joystick.\n #jdZihqWH7R4PPh2k // {hints:left:left,a}\n #timneyKMpZRrUy2P // {hints:right:right,d}\n #KlUDH8tXmhEvDhke // {hints:down:down,s}\n #mkQo4n8pPyFWS4CB // {hints:up:up,w}\n #x5gUEO14aZOvuWdZ // {hints:button:space,enter}\n #mA2kmO4mS2sB0gGU code→initialize;\n #QtLmAF0x3BKCuNN4 contract→requires( `not` $left→is_empty, \"missing key\");\n #APG86c6eW0q18zKm contract→requires( `not` $right→is_empty, \"missing key\");\n #XI8oeyxHEGG9pdE3 contract→requires( `not` $up→is_empty, \"missing key\");\n #xamto1IEQdzpF94F contract→requires( `not` $down→is_empty, \"missing key\");\n #u7zsrNBpl2YMnGxa contract→requires( `not` $button→is_empty, \"missing key\");\n #xX6kINu4smLfSU4V $settings→\\_left_key := $left;\n #xgvIJTVCRXCbzX0v $settings→\\_right_key := $right;\n #qBkkp8802szSl6Ku $settings→\\_up_key := $up;\n #xxqcuvdCnDlG2zXt $settings→\\_down_key := $down;\n #NNy2TBcsHPoSB5HX $settings→\\_button_key := $button;\n meta sync;\n}\n#hUUrbnz6QsXzbuBs4lLmaY67\naction set_use_accelerometer(#sMb8yT6LjTfyQf66 settings: * Settings, #ZWB7PFBsxcVwbmuO enabled: Boolean) {\n #MhCet6v5VrZkHYm5 // Sets a value to enable using the accelerometer to control the joystick, if available.\n #xJbQ5KBVWJ2ZC4wt $settings→\\_accelerometer := $enabled `and` senses→has_accelerometer;\n meta sync;\n}\n#NARYT4r1qcmrRmDNdAjtkOcD\naction compute_accelerometer(#x2GnG1i2JgFiTdyI dt: Number, #l0iot4LcZEAUCbBo vector: * Vector) {\n #CdB24VEl10I21wlN $p := senses→acceleration_quick;\n #JHkzPnuUlv7pCGrG $x := data→\\_settings→\\_accelerometer_factor;\n #YunhQWUn2P4CqgQO $vector→x := math→clamp( - 1, 1, $vector→x + $p→x * $x);\n #Eb4F6YvngxPCmqxQ $vector→y := math→clamp( - 1, 1, $vector→y + $p→y * $x);\n meta private;\n meta sync;\n}\n#BdGhpbmca\ntable Vector {\n type = \"Object\";\n persistent = false;\n fields {\n #PIhmB5a45eV2GwDOel4fNJzD x : Number\n #s4RJLddQmZAAL2fVNJZlofpI y : Number\n #z4sZT4jEURZzF4qvBK80374u z : Number\n }\n}\n#Pp43nHG2nxgTrXqtYtq2qQ3n\naction use_accelerometer(#x4AqNqJN2AV8FyNW settings: * Settings) returns(#ZuecI66sdYrN0fLg b: Boolean) {\n #xKiBqWGiPgb8OodJ // Gets a value indicating if the game pad is in accelerometer mode\n #iyQVQkZox7faFtMZ $b := $settings→\\_accelerometer;\n meta sync;\n}\n#Jr5PkqN8lT3CcCaI8FkcwY9i\naction control_sprite(#J4bQtf4dzt0JJv0o sprite: Sprite, #xITne2vAd7GGo71K max_speed_x: Number, #eh4guxKhGAkkT5zd max_speed_y: Number) {\n #pZFTfhm2KibBy4vb // Attaches code to a sprite so that it moves with the joystick. ``max speed x``, ``max speed y`` are the maximum speed in the horizontal and vertical directions. If the ``max speed`` is ``0``, the sprite does not move in that direction.\n #gqAAXsRX7ML6Xp6Q // {hints:max speed x:10}\n #XYUBw2I2PmJxsfQk // {hints:max speed y:10}\n #QJN5pdrnm402r4nc contract→requires($max_speed_x ≠ 0 `or` $max_speed_y ≠ 0, \"max speed x or max speed y must be positive\");\n #SdQfPla60i8KOB69 @\\u267b→game→board→add_on_every_frame($perform);\n #dzrdQXYVBuiYpCB3 where perform() {\n #kMPKcC4hlDnlAzNf $p := code→current;\n #m84DBIk76JwFXGtK if $max_speed_x ≠ 0 then {\n #AIc6bHmDGE5KEkub $sprite→set_speed_x($p→x * $max_speed_x);\n }\n #FlHS37vNSYlJzzK2 if $max_speed_y ≠ 0 then {\n #kcqg248K96z8hSvW $sprite→set_speed_y($p→y * $max_speed_y);\n }\n }\n meta sync;\n}\n#xOCxKZH5B5Fbbm2N2BgFeCjp\naction control_background_scene(#xexUUg8AFUV1pKss max_speed_x: Number, #husVqChs0aLNEthp max_speed_y: Number) {\n #xvNWw6U8MHjXt8Af // Attaches code to a sprite so that it moves with the joystick. ``max speed x``, ``max speed y`` are the maximum speed in the horizontal and vertical directions. If the ``max speed`` is ``0``, the sprite does not move in that direction.\n #YJZmMvKMLvYxEwDY // {hints:max speed x:5}\n #BVh2sKVCrb3m56WT // {hints:max speed y:5}\n #EmBN4lPPQPbBchh1 contract→requires($max_speed_x ≠ 0 `or` $max_speed_y ≠ 0, \"max speed x or max speed y must be positive\");\n #TZWQZIGfZ68yG9Uv $board := @\\u267b→game→board;\n #wPA2oQGbTH3FGzOZ $scene := $board→background_scene;\n #Js4Zpc34CRxt2GeX $board→add_on_every_frame($perform);\n #ZWthGFblITdJ5y2q where perform() {\n #xLolGpyPJ26Bf7gF $p := code→current;\n #NRgvlWpZblB5411Z if $max_speed_x * $p→x ≠ 0 then {\n #x9XySL1IghJ4eAkc $scene→view_x := $scene→view_x + $p→x * $max_speed_x;\n }\n #zAl92h1NWX6zV6YZ if $max_speed_y * $p→y ≠ 0 then {\n #v2doU4uETj8wdBU6 $scene→view_y := $scene→view_y + $p→y * $max_speed_y;\n }\n }\n meta sync;\n}\n#O5jlHid249RIgTQx4Il4dMsQ\naction initialize() {\n #BY1a8ZelCHXrWspS if data→\\_settings→is_invalid then {\n #xG5gN3ayZLIr97Kv data→\\_settings := records→Settings→create;\n #xg65D2HGMuN6YvRl data→\\_settings→\\_left_key := \"left\";\n #Qvua74YQy1S3NWOW data→\\_settings→\\_right_key := \"right\";\n #UtF8HSgpBFH4GOCh data→\\_settings→\\_up_key := \"up\";\n #x8LXxXent3EQ3HSb data→\\_settings→\\_down_key := \"down\";\n #eHrpy4kjLd3kKU7H data→\\_settings→\\_button_key := \"space\";\n #JrohHVSmIOHoTJfg data→\\_settings→\\_accelerometer := senses→has_accelerometer;\n #QLmAnO22zSclfJLh data→\\_settings→\\_accelerometer_factor := 2.5;\n #FoOj1D7azTBsWmAS data→\\_settings→\\_keyboard_factor := 1;\n #gE4FhHuKQInXChc6 data→\\_settings→\\_touch_factor := 1;\n #x4HLjy5jtRlZw5QK data→\\_settings→\\_gamepad_factor := 1;\n }\n meta private;\n meta sync;\n}\n#EBTBDXQl4wWAeztoI6v6uXr7\ntable Settings {\n type = \"Object\";\n persistent = false;\n fields {\n #xWrudrZ5NpJdyPTY \\_accelerometer : Boolean\n #haeXdtH8UXoKT2YiPEqLa2fY \\_accelerometer_factor : Number\n #xU41NwX1DW2EsOH1zEyKrBDI \\_keyboard_factor : Number\n #gs0C5qUDfkJQgVZNTRvcYXdg \\_touch_factor : Number\n #xye4E9Gkn75xPO9BypOVNnQl \\_gamepad_factor : Number\n #zJxyk6doic4epMgg \\_button_key : String\n #xTqBB94SCy85xBDo \\_left_key : String\n #xcK10crRhLYLIPRa \\_right_key : String\n #teqHhpmPMmsqCDDe \\_up_key : String\n #O8zLW0tiUKq2Iq6m \\_down_key : String\n }\n}\n#wzrHF0ZiaaIPCBlykVeDL7ZQ\nvar \\_settings : * Settings {\n transient = true;\n}\n#fZA6Z6A6AZBTzGzFKUi45Qkk\naction settings() returns(#x2440FgmL0FXNm2Y sets: * Settings) {\n #H4fuepz89B5nVk5c // Gets the settings\n #NYeQ8DS6Yk6rvaoH code→initialize;\n #J0zI5t9SBqZz2A3Y $sets := data→\\_settings;\n meta sync;\n}\n#JsMMnNP4PoTsmzcKQb03lxcd\naction set_accelerometer_factor(#hV904uzJQP4Ha1vL settings: * Settings, #UZL9DHRMGQZ1SjJc factor: Number) {\n #U2OMRDlAavZbU8QD // Sets the accelerometer factor which defines the sensitivity of the gamepad to acceleration.\n #KQOkRcPNYlYc4rfq $settings→\\_accelerometer_factor := $factor;\n meta sync;\n}\n#qHUjP3JxEIe6PglgPBd7XvGj\naction set_keyboard_factor(#xoDt4HwFM7Xtn50y settings: * Settings, #BXbMcZD3FCEFxd74 factor: Number) {\n #oEa4VV4P5Qcw4LxT // Sets the keyboard factor which defines the sensitivity of the gamepad to keystrokes.\n #I22dHuBIaCE4Wsfg $settings→\\_keyboard_factor := $factor;\n meta sync;\n}\n#ykOjMaqh0yuACa3eucm2crhX\naction set_touch_factor(#x9g9UuMQ0nWvsOOr settings: * Settings, #xB4ys583aKS4LhSA factor: Number) {\n #xxTdZjauXHuYGsze // Sets the keyboard factor which defines the sensitivity of the gamepad to touch position.\n #xDWukfE0Nb0J1SEB $settings→\\_touch_factor := $factor;\n meta sync;\n}\n#HkT5dDFCgut23pzIiUtT5449\naction accelerometer_factor(#x42Ymf1w793HBMrM settings: * Settings) returns(#J3b5CTzLR5bnRzDd factor: Number) {\n #x2ohapkwxTl4TJm2 // Gets the accelerometer factor which defines the sensitivity of the gamepad to acceleration.\n #ubiUm8C4Qa37zXl9 $factor := $settings→\\_accelerometer_factor;\n meta sync;\n}\n#ojPViw2hIEo2FhK11HwNyfHv\naction keyboard_factor(#xIAMPIUEzeeI4MSo settings: * Settings) returns(#qer1Gid3Ka1sYUlo factor: Number) {\n #DZ0tTbGBLf0zdvaN // Gets the factor which defines the sensitivity of the gamepad to keystrokes.\n #hQzKDt4MvV3eZ3y0 $factor := $settings→\\_keyboard_factor;\n meta sync;\n}\n#cmxAcycEZOsCpQnldHU6eNUe\naction touch_factor(#xi4zCqnOSG7a3FJ9 settings: * Settings) returns(#cWB3AVRhR2UxhY5M factor: Number) {\n #adW5EhfLFYOS1SN4 // Gets the factor which defines the sensitivity of the gamepad to touch.\n #xoHybh1K0DH2JE6U $factor := $settings→\\_touch_factor;\n meta sync;\n}\n#qDlKG3i3k2K4V8WDC0PeMN11\naction compute_gamepad(#sNZCyEA7PtuE1Ja2 seconds: Number, #oxn5BeCE5Z9fBJri vector: * Vector, #yC3saYaNHw0wr46w gp: Gamepad) {\n #J7ujsf4vd2ZdQS4j $ramp := 0.4;\n #aIps1tsTQVIXzE48 $deramp := 0.9;\n #Np91rQPyO6dT6h0r $f := data→\\_settings→\\_keyboard_factor;\n #SOG2l2YssSdmyfJ6 if `not` data→\\_current→is_invalid `and` $seconds > 0 then {\n #TYEiJepb5OzRK4Ue $vector→x := data→\\_current→x;\n #SrTapAnFDCPENlkk $vector→y := data→\\_current→y;\n #Q3jerK4ei022TcO4 $vector→z := data→\\_current→z;\n }\n #nm6km479Qkl8nmTz // digital commands\n #x41OxuSqcvPpFBvT $p := $gp→axes(\"left stick\");\n #af6ujQZDY57S69tr if math→abs($p→x) > 0.07 then {\n #NLqjhSODtwJdvmKn $vector→x := $p→x;\n }\n else { #xH41FZCtrksP73Im if $gp→is_button_pressed(\"left\") then {\n #ULPRruprvYXYBBBV $vector→x := math→clamp( - 1, 0, ($vector→x - $seconds / $ramp) * $f);\n }\n else { #kJfsCJRarGkYDJo5 if $gp→is_button_pressed(\"right\") then {\n #HPux3qopIyjD40mF $vector→x := math→clamp(0, 1, ($vector→x + $seconds / $ramp) * $f);\n }\n else {\n #jzdCQpkG1NhYRxJK $vector→x := $vector→x * $deramp * $f;\n #xfezCQnnAlipaL2h if math→abs($vector→x) < 0.05 then {\n #L2AiamuB1W6laju5 $vector→x := 0;\n }\n }\n } } \n #syDnE1OdmuOcz7JJ if math→abs($p→y) > 0.07 then {\n #BJOkzjS2t6qrFqOs $vector→y := $p→y;\n }\n else { #xvn3AVRyEYWu4vmX if $gp→is_button_pressed(\"down\") then {\n #EcM7LTmETJGKXq7k $vector→y := math→clamp(0, 1, ($vector→y + $seconds / $ramp) * $f);\n }\n else { #thLr6SB1G4GOz9KA if $gp→is_button_pressed(\"up\") then {\n #sfKxmyqJIrEyAIEI $vector→y := math→clamp( - 1, 0, ($vector→y - $seconds / $ramp) * $f);\n }\n else {\n #x0qsG75vhyV1OTI3 $vector→y := $vector→y * $deramp * $f;\n #xED8wNfNIawJhHlB if math→abs($vector→y) < 0.05 then {\n #ud5B1uYehyoXkvFL $vector→y := 0;\n }\n }\n } } \n #Gp6XE26xRnkZH1UF if $gp→is_button_pressed(\"x\") `or` $gp→is_button_pressed(\"a\") `or` $gp→is_button_pressed(\"left trigger\") `or` $gp→is_button_pressed(\"right trigger\") then {\n #xY1aCbyRrl4WRQzr $vector→z := math→clamp(0, 1, ($vector→z + $seconds / $ramp) * $f);\n }\n else {\n #rlwfZwqD5NQN3FYU $vector→z := $vector→z * $deramp * $f;\n #xqZ0ek76dg18mmKi if $vector→z < 0.05 then {\n #xM1wils39LR2R2r1 $vector→z := 0;\n }\n }\n meta private;\n meta sync;\n}\n#Q5iYM4d4RaKAHW0EBSJVw4Ax\naction gamepad_factor(#EzeyG4fwIy72v43H settings: * Settings) returns(#iQoR4aWzVHrOCNUa factor: Number) {\n #x4QTtaWY5KjaOBX6 // Gets the gamepad multiplaction factor\n #Da02a7PsI4JZXbHz $factor := $settings→\\_gamepad_factor;\n meta sync;\n}\n#BKrrtzJkT6r8eMJwqbQ4H4uv\naction set_gamepad_factor(#lCTVkfU4Lf2pn4WH settings: * Settings, #wYwRD3xQjAfRM1XF factor: Number) {\n #rWKLWdtv08NDnClQ // Sets the gamepad factor\n #kizmsK2S0IHazy2g $settings→\\_gamepad_factor := $factor;\n meta sync;\n}\n#WXa1HIFpjLPPuHwF\naction on_button_pressed(#f4HaMUK2POpX1XK2 body: Action) returns(#bYZ65CfJ1xqucFvz binding: * Gamepad_Event_Binding) {\n #autpkZS0K0HiSnJ6 // Raised when the primary button is pressed. The button could be the keyboard ``space`` key, mouse click, touch tap or the ``A`` gamepad button. Auto-repeat is not supported.\n #Rk7sWmHqManf2FxK // {action:ignoreReturn}\n #kCNUrJ58ODLFjqSE $binding := records→Gamepad_Event_Binding→create;\n #ruht2urgD9P0Owdx $binding→bindings := create→Collection_of→Event_Binding;\n #MVLlCR56fgCGJEwb $ev := senses→on_key_pressed(\"space\", $handler);\n #P3izRPTD4J4M0Utd where handler() {\n #ad3dhq1Q6xkQBaw3 $body→run;\n }\n #IJCZAy2QOOIGsiph $binding→bindings→add($ev);\n #nQ0624TgT5d7Np4l $ev2 := @\\u267b→game→board→on_tap($tapped);\n #FI2pqcbqJr5B5nYd where tapped(x: Number, y: Number) {\n #wL3nosJAQfhAa9jG $body→run;\n }\n #b4DyggOZsb42VJew $binding→bindings→add($ev2);\n #A0Kvs4Rx4Zez5CLb $state := records→Button_State→create;\n #gg0O0MVZAT1CAzK2 $btn_name := \"a\";\n #Z5xTM2xdjWs32GnQ $state→pressed := code→is_button_pressed_in_any_gamepad($btn_name);\n #ES84jGq7VtcYYzsk $ev3 := @\\u267b→game→board→add_on_every_frame($perform);\n #xkNjoDPruQAqd4Vy where perform() {\n #H1O6JVSByAsdB5gl $pressed := code→is_button_pressed_in_any_gamepad($btn_name);\n #XBao9npXj3jLj44Y if $pressed `and` `not` $state→pressed then {\n #zrfrKef5j3G6I87r `async` $body→run;\n }\n #Qp92pguhEJ964LjX $state→pressed := $pressed;\n }\n #xjU7OfAyEY1t2Zlg $binding→bindings→add($ev3);\n}\n#PtpGyZJTdYtckhRv\ntable Button_State {\n type = \"Object\";\n persistent = false;\n fields {\n #SrkEX4XZd2hpMRGQ pressed : Boolean\n }\n}\n#MqSmFDsxMgTB4xkn\naction is_button_pressed_in_any_gamepad(#xU2rD4who6rykMde btn_name: String) returns(#x04nfMmco3aGZUlD pressed: Boolean) {\n #C7AW20Gvnp2I6cxZ $pressed := false;\n #AZmGfN4J5U6UVomG $gps := senses→gamepads;\n #YlD0rGhPyywGrYvr foreach gamepad in $gps\n #zi4HbWuQNS1TGoqd where `not` $pressed `and` $gamepad→is_connected `and` $gamepad→is_button_pressed($btn_name)\n do {\n #gzc7udJGZ2ZXqcDr $pressed := true;\n }\n meta private;\n meta sync;\n}\n#B5CwXDSpNzCP42Ri\ntable Gamepad_Event_Binding {\n type = \"Object\";\n persistent = false;\n fields {\n #ftimFuL4HLLtCtfV bindings : Collection[Event_Binding]\n }\n}\n#x3PpQGVlqDg5FKmt\naction delete(#xR9VnFvk412nTGrw binding: * Gamepad_Event_Binding) {\n #mzSlbL2z6dbP8sib // Deletes all the bindings\n #c0BBfqA8y3oFMZyX foreach ev in $binding→bindings\n do {\n #vth7W3m3aQtq02TK $ev→delete;\n }\n #JpIxBpOLfLjBVWZO $binding→bindings→clear;\n meta sync;\n}\n", +"ohqwa": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"teach\";\nmeta rootId \"rfFWOBXKYWbKL3882OCwIeVx\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Teaching with TouchDevelop. #docs #teach #education\n#sJti4PgyaJBMZl5Xa5UMimxW\naction main() {\n #K1y28DAXzlzjVqnx // {parentTopic:contents}\n #sYkQiq3Kz6SzmixV // {priority:100}\n #VE3zvfX2r4Slzd0O // TouchDevelop makes it fun to learn (and teach) programming skills. This section has lots of ideas for using TouchDevelop in the classroom.\n #A6eQBe2sSnp2lUqk // * **Are you a teacher? Join the [TouchDevelop Teachers group](#pub:sxlktprb)!**\n #xQ6nypfXFlgBD7VZ // ### resources for educators\n #DiMTw4UxkA3KWqx3 // {pic:ccga girl:16x31}\n #rlDjvfGlMtuvb23A // * [Create Coding Through Games And Apps](http://aka.ms/CreativeCoding) - semester long introduction to CS using TouchDevelop.\n #iTqjubSk3ck5JnQE // * [Hour Of Code](https://www.touchdevelop.com/hoc) - all the information to run an **Hour Of Code** with TouchDevelop\n #bBTHXKtvHh3YgmNL // * [](/courses) — choose from different curriculum to teach about mobile app and game creation\n #xbbpj2AABJzoZacv // * [](/tutorials) — step by step tutorials to build games and apps\n #Hd33r1xwwgD7qsD7 // * [docs](/contents) — the built-in documentation\n #qQqt5pFCKhlqbNUX // * [](/book) — currently available for free online; systematic introduction to all basic concepts\n #OPjd1hyHfJ39XbW8 // ### environments\n #lLBw4hzsB8IpuVx9 // * The **TouchDevelop Web App** runs in [most modern browsers](https://www.touchdevelop.com/app/current.browsers).\n #Z4En3ihiQz4Dcdfi // * The [TouchDevelop Windows Phone app](http://www.windowsphone.com/s?appId=fe08ccec-a360-e011-81d2-78e7d1fa76f8) gives access to most sensors and data providers available on modern smartphones. [More resources for educators interested in using Windows Phone...](https://www.touchdevelop.com/teachwindowsphone)\n #bAFkE6FP49vQmk4Q // Learn more about [platforms and supported features](https://www.touchdevelop.com/platforms).\n #T4CItQIBnMyWsjzq // ### create your own tutorials and docs\n #RLolkQMEUD0pU4i5 // In addition to creating fun and useful apps, you can use TouchDevelop to create custom interactive tutorials to augment your curriculum. You can also create your own documentation topics adding to the TouchDevelop documentation. This benefits not only your class, but the entire TouchDevelop community!\n #qc2MeCvS62HoY74P // * [creating interactive tutorials](/creatinginteractivetutorials)\n #Esv88v05v32k6UzH // * [add your own docs](/addyourowndocs)\n #cKhwOfsnzrr9c6Ri // ### manage your classroom\n #ZZ80VlTdiwMCWzcy // * You can create [](/groups) and manage your classrooms through them. Groups have a message board and allow to easily collect homework from your students.\n #xo43SANX5LZxfqRT // * Use a [label printer](/labelprinter) to easily get printed labels from student scripts\n #ow6CAnIoZDQOKOLP // ### follow your students\n #t6fGFzG0xF05rZyE // As a teacher, consider [subscribing](/subscriptions) to your students to see what they are publishing and if they are asking questions.\n #ueEDtziGGzDu30Yi // ### experience\n #x2P2jb0Ng0DiKokb // Visit the [TouchDevelop teaching page](http://research.microsoft.com/touchdevelop/teaching.aspx) at Microsoft Research for a list of how TouchDevelop has been used and is being used in classrooms.\n}\n#x38IRlu2meiXXvvp\nvar ccga_girl : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/cvapqfwl\";\n transient = true;\n}\n", "oixlc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"what\\'s new?\";\nmeta rootId \"oGIahryiInwIpsu2H7pX84CQ\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// release notes #docs\n#gMH7AtpXfxA2FZuYuc70zvTg\naction main() {\n #KN6Hyh4R0VdJdW12 // {parentTopic:contents}\n #C4J9deHXvt4lAMtW // {priority:1}\n #xNGLl7UVKMsrfBtR // {hide}\n #hdiFhuPgtoIAxNMU $board := media→create_landscape_board(800, 480);\n #YFcbdAvVWgJIYuA2 $pic := media→create_picture(480, 800);\n #xHyoPiwr1eIqHsx8 $thing := records→thing_table→add_row;\n #KTDbHXA9o6IYn06Y // {/hide}\n #Gm1rJgBBb7mfxnas // * **Join the [TouchDevelop Updates group](#pub:evjjxsjs)** to be notified about upcoming features and releases.\n #xgSLZR22im6IwCPD // ### March\n #xpr2Q4pO2LOkLFXr // * The BBC announces the [Micro-Bit project](http://www.bbc.co.uk/mediacentre/mediapacks/makeitdigital/micro-bit) project.\n #q1OyHlYqW8XFO7uC // ### February\n #GnTs3k25Lp92y1Fl // * **we're open source on github** at [](https://github.com/Microsoft/TouchDevelop)!\n #bLGyRe88cWcUwPM3 // * deprecated crowd source run and coverage maps collection.\n #NSnGZHMZvQDX4awK // ### January\n #v3L9m2jXHjGCLbDw // * switched the app generation to App Studio and Cordova\n #ZFUQ9GsEs5SSkbgs // * button plugins can load buttons in the editor\n #tS9RO2F48DYHv6bV // * set a wallpaper in the hub!\n #kiA1lM0tw2WGGYET // * set an **icon** and **splash** picture art resource on scripts. The icon is displayed on all searches.\n #Vlmnwr0jCxc0bCty // * support for Python **pip** in ``app->import``. TouchDevelop creates a Python virtual environment and install the required pip packages.\n #wZ2rVQ3FOGZWfEdD // ### December 2014\n #x5oG13lAF6NZyDli // * [group scripts](/groupscripts) allow multiple users to collaborate on a single script\n #PVabV6GQFdt4XBag // * `app->import` allows to import **Node.JS npm** or **Apache Cordova plugins**.\n #wiTYksRN9Hv2iVnq app→import(\"npm\", \"azure-storage\", \"*\");\n #HA4q6o3aE7Cyz6tE // * script [plugins](/plugins) can have button inserted in the script editor\n #qV0pfa992reHW5Hv // * new [arduino tutorials](/arduinotutorials)\n #xJUEp8q1O2PUK74X // {pic:arduino blink:4x4}\n #pZ3uWaouxVtg7RPO // ### November 2014\n #YjF6a4nYSKYHJSXX // * An awesome new tutorial with super-cool videos that explain every step!\n #jSFgLhHY5aFFw6e0 // {follow:Coding Jetpack Jumper!}\n #sLrTw2l2DAXtP4qI // * **beta only:** real time multi user editing of [group scripts](/group scripts)!!!\n #pVVkVwNlJE44ZhD2 // * **beta only:** different editor modes for different users: try the **block mode** and **pro mode**\n #KKYOD6Rx6EWIgrDZ // {pic:block mode:7x7}\n #VnMmHhxgba8g0XJc // {pic:pro mode:7x7}\n #xJCceQUmsB4YdCsp // * new api `app->restart` let's you easily restart your script\n #xmEi5ZOJuHyI5cmR // ### October 2014\n #xnkgZyJ68CUy3ob1 // * when publishing, **add a release note** from the publish dialog\n #OkKSuSF4FBBR0jIS // * fork scripts and **[send a pull request](/pullrequests)**\n #rg4flIOCfg42dcfV // * `[go to]` now works for [extension actions](/extension actions) and [](/libraries)\n #ozPvx4o6D0mIKCYG // * **drag and drop** of statements in editor (when applicable)\n #iGxwLE2IEBp0mtrf // {pic:draganddrop:17x11}\n #aVJIaCI47ed62nvp // * libraries are bound a main script which allows to edit a referenced library and still run the script without switching.\n #Pn0iqqaRpZMaCsIR // * script comments are automatically loaded for earlier versions\n #gzErp0wP0OfPBo4T // * documentation can be browsed outside the editor at [](https://www.touchdevelop.com/docs)\n #K3MUP9gl62nlCIvO // * tutorials and documentation topics are automatically translated using Bing translator based on the browser language\n #vulQJpxFQTfIWRer // * the crowd-sourced localization of TouchDevelop has started! Try it out at [](https://touchdeveloptranslator.azurewebsites.net/)\n #hdQ0ZCKjkKssc0CV // * `box->set font family` allows to specify the font on a box\n #FQYXdoSkXUc82Uyx // * when renaming a local variable to a name that already exists, the editor proposes to merge the two variables\n #pvDy7RQo6TFK3JQZ box→set_font_family(\"Georgia\");\n #VKS8E7BPD7acVcd9 // * new `Sprite->left`, `Sprite->right`, `Sprite->top`, `Sprite->bottom` action to get the coordinates of the bounding box of a sprite.\n #rxbculFeHF4gcwv3 // * new `Buffer->concat`, `Buffer->read number`, `Buffer->write number`, `DateTime->milliseconds since epoch`, `math->div`, `web->encode uri`, `web->decode uri`, `web->encode uri component`, `web->decode uri component`\n #btWsFTctkwUp73lj // ### September 2014\n #Zizy5aFD6EU16ku6 // * new bear and pixel art tutorials leveraging the ``{stvalidator:...}`` macros.\n #vN6499h5IP4Ufmvl // * easy access to `app->log` through new button.\n #cE2MQC4SVXlvLHas // * richer logging infrastructure throuugh `app->create logger`\n #xr0ympiTptzn4h9r $logger := app→create_logger(\"my logger\");\n #pLB29ibkA6YwZyiU $logger→debug(\"a debug message\");\n #DbLce24L1veQ4HhT $logger→info(\"an info message\");\n #Wi1rReEWmIl7rQNT $logger→info(\"an error message!\");\n #B4gUxU6KbPiTzprj // * `Sprite->fit text` wraps the sprite bounding box around the text. `Sprite->set text alignment` allows to control how the text aligns vertically.\n #xda3VWfBlQDkajcz // * new ``{pici:...}`` and ``{sthashtags:...}`` macros for tutorials.\n #n1V224nUV7Hx7Bp3 // ### August 2014\n #xqmwBEi2K2Mx5XB3 // * `[comment out]` now shows up as an option when `[select]`ing lines of code\n #KDBouGJ0yqwbuLSC // * `[uncomment]`, `[strip if/for/...]` are now options when editing block statements\n #xmpTPUNKKU1NP1Z4 // * when you `[edit library]` from a script (which is now also more easily available) it adds a temporary link from the library to the parent script, so it's easier to go back and you can **deploy** parent script from the library; shortly you'll be also able to **run** it\n #xvEm557GPTJvAkdd // * new APIs: `Buffer->concat`, `Buffer->write number`, `Buffer->read number`, `math->div` (integer division), `DateTime->milliseconds_since_epoch` (epoch is, of course, 1970-01-01)\n #xi1ICDInif6b0xd5 // * tutorials with `{stvalidator}` now have access to `app->editor`\n #ducKZaXdvSn1LLWU // * Windows Phone 8.1 Update 1 is now supported\n #dKHLgvcRUKWRB84x // ### merging scripts\n #x9vdf8GQj929RnyG // At the bottom of info pages about published scripts there is now a new `[merge]` button. It let's you pick a target script in your account. It will then merge the changes between the common parent of these two scripts.\n #FS4bg5kyR0AJXVb8 // This feature is **beta** only.\n #xT4nXwphk9EENGK3 // ### July 2014\n #ptCPf721OV3p0bSr // * immutable types (i.e., ones which once created never change) are now marked with a little diamond\n #x6lLNbQg7et2EZAk // * new API `Collection->map to`, `Collection->ordered by`, `Collection->ordered by string`, `Collection->sorted` - higher order programming is coming to TD! we now also have `Collection->take`, `Collection->slice` as well as `create->collection of->...` for creating collections of arbitrary types\n #nr9bjJXxESYCawUV // * new `->wait for update` API on tables and indices\n #uq2o327lpSaTRI2S // ### June 2014\n #wYV4JrgD5s6FWI7t // * support for `Gamepad`\n #tgVzFk67GzK95nT0 // {pic:Xbox 360 gamepad:11x11}\n #efC2PV6rDZ5wWJSF $gamepad := senses→gamepads→at(0);\n #xMvOhtOZkTPT54DT if $gamepad→is_button_pressed(\"x\") then {\n #Utu0GZArBP4Iprto // shoot!\n }\n #Yrlb4Ry3y8K2yqvh // * custom validator in tutorials\n #VMedROHjGmtTxM80 // * split screen view in editor\n #dguL9eRXAIzNSOXO // ### May 2014\n #QWm8SUaVFH9e3eY9 // * `Task` now has `Task->completed`, `Task->value`, and `Task->await at most` [more info] (/asyncActions)\n #o0nc5EVOVV2R9g2h // * Logs are enabled also for published scripts\n #fOnZlHemD3JokxwO // * wait for messages from the parent frame\n #eQjUBLmGkFbpkASK $js := web→wait_for_message_from_parent(\"https://www.touchdevelop.com\");\n #xBTaJtW0yjIFW8y8 // ### April 2014\n #M0PSSIvUWBJWmqhi // #### Export to Android\n #ctXEW1KYFYvdXlH0 // Take your favorite script and [turn it into an Android app](/exporttoandroid)!\n #amczWXR0V2J7DYl7 // #### Export to Windows 8.1\n #kyhYUwojXgNfMI32 // We've updated our template and the exported Windows apps are now targeting 8.1.\n #kTE9uNrD2RWoBT8C // #### post and receive messages\n #xFLQsORmFJjTxlq8 // For the adventurous, it is now possible to post and receive messages between a TouchDevelop web app and its parent window.\n #x27TCdxiSFnSSMb4 // * post a message\n #xbK2liAPKS6bwodb web→post_message_to_parent(\"https://www.touchdevelop.com\", web→json_object);\n #IPRrn0QlLOhB36OK // * listen to incoming messages\n #ejJR3FUPFfM2qqPs web→on_received_message_from_parent(\"http://yourhostdomainname.something\", $received);\n #vLKi4zZGzwnvOZKR where received(json: Json_Object) {\n #zfHUftNJW4BFsMnC skip;\n }\n #h4LDm62JHbaOimTo // #### background pictures on boxes\n #tmivmy8mhcNZh7Nr // You can efficiently set one or more pictures as the background of a `box` using `box->add background picture`. The API does not impact the size of the box.\n #ZoveBWBWaAMGSRPz box→add_background_picture($pic, \"center center\", \"cover\", \"no-repeat\", \"scroll\");\n #hw6nBaRo847s9iil // #### hiding the title bar on pages\n #cN1c17sI2xSC1udr // You can hide the title and subtitle bar on the pages.\n #xEdUS4FJiwZ9cu64 wall→show_title_bar(false);\n #j2tWdyNbps42FXSb // ### March 2014\n #xtgXEU8BB93WTtil // #### Reorganized tutorials section\n #xF2Nm2dJhzBnD6Ul // As the list of tutorials grew longer and longer, we've reorganized them into categories. Tell us what you think!\n #Abb9Odg3L9wtP6CC // * [check out the new tutorials](/tutorials)\n #SWZt9P29nFdqDPWN // #### OneDrive support\n #wK1vvSAAQuubRjSe // Upload pictures to OneNote easily. The resulting `Cloud Picture` can be stored in an table or index.\n #i6Edi5yctYksdwAs $onedrive_pic := cloud_storage→upload_picture($pic, \"public\", \"\");\n #eixE9tEciDf527YB $onedrive_pic→post_to_wall;\n #gnsNGxGAvLzW8iPj // A `Cloud Picture` can be stored in tables and indices which allows to share them!\n #xUEtu327qEiqNCH5 // #### OneNote support\n #MOfJQ69dhYEfGh4Q // Create new pages in your OneNote with text, pictures and more!\n #Z6AD6VuAj7wvRmC3 $form := web→create_form_builder;\n #PmtsdZrr1bPrr6Wh $form→add_string(\"Presentation\", \"Yay!\");\n #FPKHJtraWucSSGz4 cloud_storage→upload_note($form);\n #tWo2ES4E2W2AxF2n // #### Arduino Esplora support\n #zk7g7nfYGBsnW4xB // Build scripts for the Esplora board using TouchDevelop! Look for the `[blank esplora]` template to get started.\n #InttAI7LPAREaWHr // * try the [esplora level tutorial](/esploraleveltutorial)\n #OjhdxFirqdh0Qxia // ### February 2014\n #mNMXPx1B3mJNvoXz // #### new refactoring: move to library\n #UFVd0ZAosyc8yuKN // Is your script getting too large to manage? Think about using the [move to library](/movetolibrary) refactoring support to move related elements of your script into a library.\n #rQqJWd7kKhaagTp8 // #### parallax backgrounds\n #RnNVp2kbW5LCV1Gb // Create awesome scrolling effects with the [background scrolling](/parallaxbackgrounds) support.\n #LKhR34KG7Qp8929Y $scene := $board→background_scene;\n #sXpKhu2tm8bVC4AF $back_layer := $scene→create_layer(0, art→nature);\n #On3ZT1H5qzrbg2h4 // Take a look at [this demo](#pub:cprja) from David Renton!\n #Sc0DUKR92oVvpXz1 // #### keyboard support\n #qm6AHO0Ztm5fF7ah // You can listen to key pressed on the keyboard (if available). You can listen to event or simply query for keys.\n #ByDk09RpVj9Qy89I // * attach an event. It will repeat automatically if the user keeps pressing the key.\n #xY2tf5SdjS2w7NwX senses→on_key_pressed(\"space\", $handler2);\n #gHo1W85uQlQ7AQFc where handler2() {\n #qQzuB57IuP2pRDf5 // Do something when space is pressed\n }\n #PJsvNHxqXEV4DpwY // * query the status of a given key\n #damdUTIZtFzTPOJD $b := senses→is_key_pressed(\"space\");\n #xgwYHHUeAswJjL23 // ### January 2014\n #UdpXhKxqwusZzcM9 // #### page models\n #HN3PLMP1v9TfStnm // [Pages](/page) now comes with an associated object type to store the **data**. It is edited together with the page in the **data** section (see example below). Every time the page is pushed a new instance of the page data is created.\n #PIgKRS2bXzpgRdv9 // {decl:show}\n #xLuQ6yyrI49hxwgI // #### timers\n #EzPTlUMkQ8MeNGad // Using `time->run after` and `time->run every`, you can schedule a handler of code to run once or at regular intervals.\n #tbjUYrS0xPoq4EZ4 time→run_after(3, $perform);\n #vl74hr7B4Ynhz4gh where perform() {\n #d137srI0VHIgQ42p // this code will run after 3 seconds of delay\n #SIAlx8bJyftKzpL5 skip;\n }\n #xLTuQBp8wQxge4o0 // The action `time->on every frame` allows to register a handler in a built-in game loop timer.\n #xs2TIThvzy4VmxSj time→on_every_frame($perform2);\n #VHQKoOSby2fgVy0G where perform2() {\n #xc6AoudLjgxb3kb8 // runs this code many times a second\n }\n #vI0j1XSJu32BYFH2 // #### inline events\n #D0b8PPRagmEnMBPj // We've added inline events for various global events. This means that you can attach (and detach) handlers to the `shake` event by using `senses->on shake`:\n #rUuLSLcoSl3H2r4s senses→on_shake($handler);\n #xlCmu8p3fAnRtNPw where handler() {\n #xnzuKlrGp4X55CHj // this code runs when the device is shaken!\n }\n #y2CRR2t1v2YVmuLP // Also added: `senses->on phone face up`, `senses->on phone face down`, `senses->on phone landscape left`, `senses->on phone landscape right`, `senses->on phone portrait`, `player->on active song changed`, `player->on player state changed`.\n #BhRIcWMBNbJvSgFD // #### maps\n #tk8SkFGqsFVJgeO0 // You can manipulate map **pushpins** easily: you can move thenm and register code on their ``on tap`` event.\n #uF2SA7ZTUdQZfvuh $map := maps→create_map;\n #Hgqk1s1QruxOWPzZ $pushpin := $map→add_text(senses→current_location, \"Yay!\", colors→accent, colors→white);\n #GKU7C0T2YuGvC1Yo $pushpin→on_tap($tapped);\n #AMTeUqcKWnOCSyyT where tapped() {\n #jlU4tkiDOjtZYvkl // runs when the user taps the pushpin!\n }\n #pAUqAIkNXXJCb9q3 // #### sprite sheets and animations\n #gGSGqj4mRdbLbkCH // A [sprite sheet](/spritesheet) is a picture that packs multiple images of an animation. It is commonly used in 2D games to create animations and efficiently package pictures together.\n #VDMtLedYw41T9Xb1 $sheet := $board→create_sprite_sheet(art→sheet);\n #xSaZgZfCa7PCKjv9 $sprite_ := $sheet→create_sprite(\"monster\");\n #x1gRQzNt9OCfUVf6 // Sprite properties such as opacity can be animated using [sprite animations](/spriteanimation).\n #iRBePYa2iGsxxJay $anim := $sprite_→create_animation;\n #nfZxLBbjP8x8yaSy $anim→fade_in(1, \"expo\");\n #AUlcOKPa0sQ8ZrC2 $anim→fade_out(1, \"quadratic\");\n #tENQxAxwNH3izuvf // #### obstacles\n #Dk9mqBesyVrHn4tD // The `board->create obstacle` returns an [](/obstacle). You can change the color or attach to events on the obstacle.\n #gJC20L3zXnGWyWoQ $obstacle := $board→create_obstacle(0, 0, 100, 100, 1);\n #BVV3SlloJE5xdWGq // * play a sound when an object bounces\n #NJCf0QLA4nM6HWg7 $obstacle→on_collision($bounce);\n #DFui22yFHSa20lr3 where bounce(sprite: Sprite) {\n #x2M80w4jYg0s4dsH // runs when a sprite bounces on the obstacle...\n }\n #n84Ok32Cpn7N1xz8 // * remove obstacle\n #FD8f8ntRjTFOYgFd $obstacle→delete;\n #pIrlAfuEH2f27VXp // #### other stuff\n #Gsjj7aKcN41DVmqS // * `senses->record microphone` support through [WebRTC](http://www.webrtc.org/)\n #siRQjDie3HsLnHy3 // * improvements in [](/libraries) documentation authoring\n #tB4O84e4OIJ4dllC // * customizable zoom factor for text (look in Settings in the Hub)\n #KeUiAm45I2EcZQD6 // * you can now define your own [action types](/actiontypes)\n #sn41TNhNQH2h5mxJ // * control structures (like `for` or `while`) are now displayed with an `end` keyword at the end. This makes it easy to add stuff after them and makes the scoping clear.\n #Us2LVnhyUmzSftLG // ### Older release notes\n #iuHW7I32l31xjT77 // * [what's new? 2013](/whatsnew2013)\n}\n#xDaFBvTdimT9orVbFsfSFNFA\naction show(#nb8QcaSLy2sZRFD6 \\u2756: * show_page_data) {\n #q3zqAKeTpljUqtLP if box→is_init then {\n #LtNAF02isq7bKo49 $\\u2756→counter := 0;\n }\n #i34bAjBmEr64ak5s if true then {\n #ctaNyxHk2oPV2rkg $\\u2756→counter→post_to_wall;\n #EAhNogbWhLE2FLDo box→on_tapped($handler);\n #s5Bl3Y1Ot2Zppsix where handler() {\n #fgBm1IJ8ju4qa46h $\\u2756→counter := $\\u2756→counter + 1;\n }\n }\n meta page;\n meta sync;\n}\n#BICBuYW1lICAa\ntable show_page_data {\n type = \"Object\";\n persistent = false;\n fields {\n #xUj2CwS6PTK5ZjC6yGL8Y8E6 counter : Number\n }\n}\n#dys4Eewl2C5GN3fDN4Rz9Mnz\nvar sheet : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/lvxdmali\";\n transient = true;\n}\n#zHH1uV1wY4qUHQzfaBkZaooz\nvar nature : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/pxuumvdl\";\n transient = true;\n}\n#BdGhpbmcgdGFibGUa\ntable thing {\n type = \"Table\";\n persistent = true;\n fields {\n #d7R6BWVqibW7FAhFCsKVV2vM pic : Cloud_Picture\n }\n}\n#xQ2tUepQG3htXvNC9XJ9Blq1\nvar Xbox_360_gamepad : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/qmrebwzq\";\n transient = true;\n}\n#MaJHONlLZA7msNcK\nvar draganddrop : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ugbrfmxk\";\n transient = true;\n}\n#M0DWrZa7ca1vfLan\nvar pro_mode : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/flnuktvd\";\n transient = true;\n}\n#wuUz5Ma8wz5BM24J\nvar block_mode : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ujvglgks\";\n transient = true;\n}\n#u1V47sacOEL1Wdh4\nvar arduino_blink : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/ilohpnvs\";\n transient = true;\n}\n", "oqsm": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"tutorials\";\nmeta rootId \"xcFXL1vqQbVPFKk2Yc1gTRIF\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A list of TouchDevelop tutorials. #docs #tutorials\n#main\naction main() {\n #LQQH7W4x4vOr6kcT // {parentTopic:contents}\n #LpknIXykLhvB5YLw // {priority:2}\n #x6WZ72Kym5u8aNuV // {docflags:nochrome}\n #JkpnXEMEJkFS4mnx // # featured\n #xPrDSkOmttZegncR // * {follow:Coding Jetpack Jumper!}\n #xAR2eREH5fGtTotx // * {follow:jumping bird tutorial}\n #yO4n3Tb0o3Or3L55 // * {follow:first steps with turtle}\n #fSp20aGSenwd4bH2 // * {follow:pixel art tutorial}\n #aM13Ksd59pPcP33j // # games\n #iUSpluk0DLK4NtiA // * {follow:monster slicer tutorial}\n #A8cfd633Th1P7kbJ // * {follow:bear quest tutorial}\n #VsZDHY1LOsv3l825 // * {follow:falling rocks tutorial}\n #x93wx6dPRfGXaxdE // * {follow:don't tap the tile tutorial}\n #XP2FMZ7hb7pCZzlE // * {follow:word hunt tutorial}\n #qOTdAJch2sHVC4Av // * {follow:love me not tutorial}\n #kFSt9am2yYoTHMsd // * {follow:sound board tutorial}\n #uWIA0tQivNtloAdi // * {topictile:game tutorials}\n #H7AzZmdb0qZkhNmB // # beginners\n #x5vHrVNhyrmyHfSS // * {follow:turtle ramp up tutorial}\n #avV0BXVrlq8tFqbJ // * {follow:pixels tutorial}\n #ltteGneoeMCOKyfD // * {follow:scratch cat tutorial}\n #IjY2cuHq10NmYN8Z // * {topictile:beginner tutorials}\n #lUIEFAjnBaFp0NYM // # social apps\n #zomIAaVZ03v4R1xB // * {follow:one pic social tutorial}\n #JZPcmj4bsQ6MphyN // * {follow:map of things tutorial}\n #CiNPuZfJcC2VnMKB // * {follow:square poll tutorial}\n #Bg5Sg2zvnzUsxWDD // * {topictile:social app tutorials}\n #mW19SQB7JzUYUDyp // # algorithms\n #wzF2w9H8stNcR8oB // * {follow:quadratic equation solver}\n #HqrHWbJyly22r9vo // * {follow:factorial tutorial}\n #QI6trn3hYBszuzKO // * {topictile:algorithm tutorials}\n #lhDXdp92VSAbLGDI // # code hunt\n #TQJbXgBtfLKPm4eZ // * {follow:code hunt sector 0}\n #UFYGFD7GvVf941uN // * {follow:code hunt sector 1}\n #uyUyccw3k3epD2WP // * {follow:code hunt sector 2}\n #pKVV2nqY2iWOrdrQ // * {topictile:code hunt tutorials}\n #xQcC1JyQ0SbywpYf // # arduino\n #ht2FBDTcOKDiMxuT // * {follow:arduino blink tutorial}\n #xVTW9pO53483xii4 // * {follow:arduino sos tutorial}\n #LB6wN2U8tYxM2xMd // * {topictile:arduino tutorials}\n #KqQQoH1lfiX7GGs9 // # hardware\n #xiePhqB81TDsXU4v // * {follow:makey makey beatbox tutorial}\n #xLaWWHNk2TcRzkXa // * {follow:esplora level tutorial}\n #xF73sSThDYR09wui // * {topictile:hardware tutorials}\n #x7K4ek6efU0P1hOd // **Want to write your own tutorials?** Learn how to [create interactive tutorials](/creatinginteractivetutorials).\n}\n", -"oskkg": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank minecraft pi\";\nmeta color \"#ffffffff\";\nmeta rootId \"UqtPMmqsRpLtBLICK3xNRKmo\";\nmeta iconArtId \"eopyzwpm\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta splitScreen \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A empty Minecraft Pi script #minecraft\n#ALKdKR1Vv5Af8ary\naction main() {\n #H8A2xEaYfWcaRcnx minecraft[lib minecraft_pi] →forever;\n #KADEM3wBEa3TZ4S5 where `implicit` \\_body\\_() {\n #RHjmHHCG1NEkxwQU $pos := minecraft[lib minecraft_pi] →player_→position;\n #tzHVxYsw9oZ2AuBi $pos→fill(\"flower yellow\");\n }\n}\n#IkVT8AGXE1b2zVpw meta import minecraft_pi {\n pub \"ynlwe\"\n usage {\n #BVGhpbmca\n table Block_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xNQF2IfWS5kUTCuC state : Number\n #xUNtn4WzFNh0J275 wool : String\n }\n }\n #xIIDIryL3GdLzzFH\n table Connect_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #IhKVKMjdA949jNr3 host : String\n #PQgsvjixlAlu49Bw port : Number\n #nlMXsJlluWZB1fNN proxy : String\n }\n }\n #umgRs0Idq3y9jRyc\n table Block_Event {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #SCV1txxxrjigP8XC kind : String\n #UIy6UFvY6WJWDDoA x : Number\n #wWASeEjKJDoiqrL2 y : Number\n #MkoIqcTcP3QiIoot z : Number\n #kYCW4sVB0Q5jQy0Q face : Number\n #EayHvTpmMjNF3Sfh entity : ♻ minecraft_pi → Entity\n }\n }\n #pqaWOjEWNqEkbxwJ\n table Position {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #L4NO4JXo2Sev2b1J x : Number\n #x2UU2Lt4BiV8NNNz y : Number\n #gw4VDwinZ6yVcwzL z : Number\n }\n }\n #eVDb6TwJ7CKitS8g\n table Repeat_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #VB0iDf9EazabCCQM delay : Number\n }\n }\n type Entity\n action `async` connect(options\\u003f: ♻ minecraft_pi → Connect_Options)\n action `async` fill(@this: ♻ minecraft_pi → Position, name: String, options\\u003f: ♻ minecraft_pi → Block_Options) returns(r: ♻ minecraft_pi → Position)\n action `async` fill_many(@this: ♻ minecraft_pi → Position, corner: ♻ minecraft_pi → Position, name: String, options\\u003f: ♻ minecraft_pi → Block_Options) returns(r: ♻ minecraft_pi → Position)\n action `async` block(@this: ♻ minecraft_pi → Position) returns(name: String)\n action `async` height(@this: ♻ minecraft_pi → Position) returns(h: Number)\n action `async` chat(msg: String)\n action `async` position(entity: ♻ minecraft_pi → Entity) returns(pos: ♻ minecraft_pi → Position)\n action `async` set_position(entity: ♻ minecraft_pi → Entity, p: ♻ minecraft_pi → Position)\n action `sync` is_connected() returns(r: Boolean)\n action `async` player_() returns(p: ♻ minecraft_pi → Entity)\n action `async` direction(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` rotation(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` pitch(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` player_by_name(name: String) returns(steve: ♻ minecraft_pi → Entity)\n action `sync` block_names() returns(names: Collection[String])\n action `async` forever(body: Action, options\\u003f: ♻ minecraft_pi → Repeat_Options) returns(t: Timer)\n action `sync` wool_colors() returns(cs: Collection[Color])\n action `sync` wool_color(c: Color) returns(name: String)\n action `async` spawn(@this: ♻ minecraft_pi → Position, kind: String) returns(mob: ♻ minecraft_pi → Entity)\n action `async` test_spawn()\n action `async` up(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` down(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` move(@this: ♻ minecraft_pi → Position, x: Number, y: Number, z: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` pos(x: Number, y: Number, z: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` west(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` east(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` north(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` south(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` strafe(@this: ♻ minecraft_pi → Position, x: Number, z: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` ground(@this: ♻ minecraft_pi → Position) returns(r: ♻ minecraft_pi → Position)\n action `async` build_wall(@this: ♻ minecraft_pi → Position, corner: ♻ minecraft_pi → Position, height: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options) returns(r: ♻ minecraft_pi → Position)\n action `async` wire_redstone(@this: ♻ minecraft_pi → Position, corner: ♻ minecraft_pi → Position) returns(r: ♻ minecraft_pi → Position)\n action `async` fill_redstone(@this: ♻ minecraft_pi → Position, name: String) returns(r: ♻ minecraft_pi → Position)\n }\n #aKNwHjji2YLLKngx resolve shell = ♻ shell with {\n }\n}\n#roUgK2K1uqFWdGUx meta import shell {\n pub \"gzeda\"\n usage {\n #BdGhpbmca\n table Exec_Output {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #YaaLgMz45N5ZuAeU success : Boolean\n #qrwQiGIhHhUhb8AF error : String\n #ijyQCE4KPQL2ziZD code : Number\n #wf4AkGfhLyWkyKhQ stdout : String\n #ZyLfqXXM99R1znCa stderr : String\n }\n }\n #ttC12C2SJrh1ODjl\n table Serial_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #wXa4BRcG6mdxKU25 delimiter : String\n }\n }\n #Aamro6VY4UQ3IxE3\n table Exec_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Additional environment variables\n #xhtUoyBrBc8JWpKW env : String_Map\n }\n }\n type Command_Result\n type Shell_Socket\n action `async` write_file(path: String, content: String) returns(res: ♻ shell → Command_Result)\n action `sync` mkpath(folder: String, name: String) returns(path: String)\n action `async` mkdir(path: String) returns(res: ♻ shell → Command_Result)\n action `async` exec(cmd: String, cwd: String, options\\u003f: ♻ shell → Exec_Options) returns(res: ♻ shell → Exec_Output)\n action `sync` logger() returns(logger: App_Logger)\n action `async` exec_file(cmd: String, args: Collection[String], cwd: String, options\\u003f: ♻ shell → Exec_Options) returns(res: ♻ shell → Exec_Output)\n action `async` python_env() returns(res: ♻ shell → Command_Result)\n action `async` tcp_connect(host: String, port: Number) returns(sock: ♻ shell → Shell_Socket)\n action `async` receive(sock: ♻ shell → Shell_Socket) returns(netdata: String)\n action `async` send(sock: ♻ shell → Shell_Socket, netdata: String)\n action `async` close(sock: ♻ shell → Shell_Socket)\n action `async` serialport_connect(name: String, options\\u003f: ♻ shell → Serial_Options) returns(sock: ♻ shell → Shell_Socket)\n action `async` serial_list() returns(ports: Json_Object)\n action `async` read_file(path: String) returns(content: String)\n }\n}\n", "ovsf": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"advanced topics\";\nmeta icon \"Capitalize\";\nmeta color \"#ff66ff00\";\nmeta rootId \"npPeJGVIwzXSzviuRJx4QZdx\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Documentation. #docs #content\n#dPls0VOqrjVgrd8l\naction main() {\n #xrsW4qaXYgfIbt3y // {parentTopic:contents}\n #d3Mt25zk5OtB7p1q // {priority:18}\n #n8nYubeSJAy44z3V // This section highlights advanced programming techniques with TouchDevelop, from testing and debugging to working with web services and cloud-based APIs.\n #A2gpx4JKDMpPreG2 // ## working with code\n #xKHgDuZA9CDWVRvz // * [coding guidelines](/codingguidelines)\n #mZ7vCfgMwseLMcU2 // * [](/debugging)\n #DxgnNlqjP2PmFJyy // * [](/testing)\n #cg4SuHwjzmBSBiYV // * [](/refactorings)\n #BWzEufAUIGczyAse // * [](/plugins)\n #x8rcyx8d9Jojr6Rd // * [hosted apps](/hostedapps)\n #xEQPTaV6NZqozCt4 // ## exporting\n #pnSWGGicOCNMrbwm // * [exporting scripts to apps](/exporttoapp)\n}\n", "parp": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank turtle\";\nmeta icon \"Snowflake\";\nmeta color \"#ff007fff\";\nmeta rootId \"JfhbuKHwe3K29WLENfXE17iC\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// #turtle\n#k3GG7tZEQiPXLEm5bnyfOkDF\naction main() {\n #iTGtxXhIwXwHLfFT @\\u267b→turtle→forward(100);\n}\n#xEv66n448mkvLMp4 meta import turtle {\n pub \"smzqa\"\n usage {\n type Maze\n action `async` pen_down()\n action `async` pen_up()\n action `async` move_to(x: Number, y: Number)\n action `async` forward(steps: Number)\n action `async` left_turn(angle: Number)\n action `async` set_pen_color(c: Color)\n action `async` xcor() returns(x: Number)\n action `async` ycor() returns(y: Number)\n action `async` heading() returns(a: Number)\n action `async` world_width() returns(w: Number)\n action `async` world_height() returns(h: Number)\n action `async` set_heading(angle: Number)\n action `async` set_pen_size(thickness: Number)\n action `async` right_turn(angle: Number)\n action `async` circle(radius: Number)\n action `async` world_board() returns(board: Board)\n action `async` turn_to(dx: Number, dy: Number)\n action `async` world_picture() returns(pic: Picture)\n action `async` set_speed(steps_per_second: Number)\n action `async` go_home()\n action `async` back(steps: Number)\n action `async` pen_size() returns(size: Number)\n action `async` clean()\n action `async` clear_screen()\n action `async` speed() returns(v: Number)\n action `async` set_xy(xcor: Number, ycor: Number)\n action `async` set_x(xcor: Number)\n action `async` set_y(ycor: Number)\n action `async` pen_color() returns(c: Color)\n action `async` color_under() returns(c: Color)\n action `async` save_picture()\n action `async` xy() returns(x: Number, y: Number)\n action `async` touch_xy() returns(tx: Number, ty: Number)\n action `async` grid()\n action `async` fast()\n action `async` stamp()\n action `async` set_turtle_picture(pic: Picture)\n action `async` set_turtle_opacity(opacity: Number)\n action `async` trail()\n action `async` add_obstacle(maze: ♻ turtle → Maze, x: Number, y: Number, width: Number, height: Number, c: Color)\n action `async` set_goal(maze: ♻ turtle → Maze, x: Number, y: Number, radius: Number, c: Color)\n action `async` maze() returns(maze: ♻ turtle → Maze)\n action `async` lock(maze: ♻ turtle → Maze)\n action `async` history() returns(commands: String)\n action `async` clear_history()\n action `sync` on_command(command: Text_Action)\n action `async` add_way_point(maze: ♻ turtle → Maze)\n action `async` on_collision(maze: ♻ turtle → Maze, collision: Action)\n }\n}\n", -"qkezc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"getting started\";\nmeta icon \"CoffeeCup\";\nmeta color \"#ff007fff\";\nmeta rootId \"jgxw4hrQ2FJpvMX5ioKe2B98\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A few tips on getting started with TouchDevelop. #docs #gettingStarted\n#xIo02XpbLanjKZPs4Os6Y4LA\naction main() {\n #Oqq61gE3scTEvYZY // {parentTopic:contents}\n #zLfUy9LLj4LtaQx1 // {priority:15}\n #BtM6DR2J5yHB6sPI // TouchDevelop lets you **create apps** on all your devices. Let's get started!\n #xTc92pAlcVjk7NIM // ## interactive tutorials\n #UR4kehofIixy8ZqD // Interactive tutorials let you learn at your own pace. We recommend starting out with one or more of these:\n #BMpEHAl89GLjB6Tj // * {follow:first steps with turtle}\n #RyRvlr3i8Xt2QwpU // * {follow:jumping bird tutorial}\n #ZQgFR1AVUm6THyGs // * {follow:coding jetpack jumper}\n #zObCeEa9dPLp8ooa // * {follow:pixel art tutorial}\n #zxrf3iOVA2LWSucN // Try also\n #q9JFJmh12AXcgatn // * [build your first app](http://aka.ms/buildyourfirstapp)\n #Fi2zIopLiFb4rNH4 // * Run an [Hour Of Code](https://www.touchdevelop.com/hoc) with TouchDevelop!\n #yx3F7H4uaTmcHwkO // Browse many other [interactive tutorials](/tutorials) and [courses](/courses). Learn how to build your own games, social apps, and more! Also, check out the book [TouchDevelop - Programming on the Go](/book). It's available as a free download!\n #xJmv15REfU94PGim // ## if you have programming experience...\n #fl1IdthF70YHQxDf // ### Traditional Languages\n #ss44jvTWrjOMlUod // {pic:eclipse:12x5}\n #h4UEzbiXxngho4qF // If you have experience with a traditional programming language such as Java, JavaScript, Python, C#, or C++:\n #P2cb12dV12LdnGN4 // * Start with [hello world](/helloworld) and create a TouchDevelop version of the classic 'hello world' app.\n #Tk1HQSMDs4fk4SuF // * Go to the [dev boot camp](/devbootcamp) and get a quick overview of the TouchDevelop language and environment.\n #xqE7TP69LpivSkjp // * Try a [social app tutorial](/socialapptutorials).\n #xM8eoCxsFuNcZ6Lc // ### Block Programming Environments\n #A6h4niF5i1xLuOXm // {pic:scratch:11x4}\n #k1oezDF4jvXHgk3V // If you have experience with block programming environments such as **Scratch**, **AppInventor**, **Snap!** (BYOB), **code.org**, **Blockly**, or other tools, let us show you how to [transition from blocks to text](/fromblockstotext).\n #KY8dTaEdqs4sjpRG // ## inform and instruct\n #Retn7qEvVW1pvEQZ // In addition to creating fun and useful apps, you can use TouchDevelop to create custom interactive tutorials to show users how to perform specific tasks. You can also create your own documentation topics to expand the TouchDevelop documentation!\n #xCY1IPuWs8bC15Fj // * [creating interactive tutorials](/creatinginteractivetutorials)\n #HIy9PSdtPgJXRY8Z // * [add your own docs](/addyourowndocs)\n}\n#kZWqFwNpvbKrHfETZ2TSQKCA\nvar scratch : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/fpxfkwlk\";\n transient = true;\n}\n#b97YU9g2RQFdWzG22RPqgK2Y\nvar eclipse : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/srtrixfh\";\n transient = true;\n}\n#SxNnQzF2puTSD7MMUORJP2UN\nvar turtle : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/pskgnelo\";\n transient = true;\n}\n", "qvira": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"game animations\";\nmeta icon \"Controller\";\nmeta color \"#ff9955bb\";\nmeta rootId \"x5GWly5akgFmjLrYRRLK4cEP\";\nmeta isLibrary \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A suite of nifty game animations.\n#example\naction example() {\n #oQvXum6wlCxvA14x // This library provides a bunch of cool animation to be used with the `libs->game` library.\n #OrK2keevME4R7Ikt // {hide}\n #IBkRy8dLlysml6xn $pic := media→create_picture(480, 800);\n #LUD4QUQWDq3cZvhL $board := @\\u267b→game→start;\n #PcO7yRSD4Y6NqNK1 @\\u267b→game→bounce_on_sides;\n #uuxlVRt3Fj7zUX3d $sprite := $board→create_rectangle(100, 100);\n #WeOMvS436zFINcmB $sprite→set_color(colors→blue);\n #cd8qQ2IGGEG8LSik $sprite→set_acceleration_y(400);\n #ozsU7Yocpctcf8Kz $sprite→set_opacity(0.8);\n #OTQ8K19QPPnhEckE // {/hide}\n #EBms12UX1I3YptSc // ### splatter\n #o4uCUnbQ4qtH4xOe // Display a splatter under the sprite that goes away after a couple secs.\n #pQPunYKP94mwyJYM code→splatter($sprite, $pic);\n #ItG0lTW3p7NiLMvc // ### add score to a sprite\n #WTbMbwwzr2UNA7NT // Add a score that pops a little ``+score`` on the top right corner of the sprite.\n #Ejn7ZLQa7j8Earpj code→add_score($sprite, 100);\n meta private;\n meta test;\n}\n#xdHh3GbzZt7wBK4e meta import game {\n pub \"ofjsa\"\n usage {\n #BVGhpbmca\n table Splash_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #X13V3PCWTQpT2ORT seconds : Number\n #nk8FBg8KCO4gn30S foreground_color : Color\n #Tl89ovYzNYTzCj6A background_color : Color\n }\n }\n action `sync` set_score(value: Number)\n action `async` set_life(value: Number)\n action `sync` start_timer()\n action `sync` start_countdown_timer(seconds: Number)\n action `sync` life() returns(r: Number)\n action `sync` score() returns(r: Number)\n action `sync` current_time() returns(seconds: Number)\n action `sync` add_score(value: Number)\n action `async` add_life(value: Number)\n action `sync` clear_timer()\n action `async` remove_life(value: Number)\n action `async` end()\n action `async` start() returns(board: Board)\n action `sync` reset()\n action `async` start_with_fixed_size(width: Number, height: Number) returns(board: Board)\n action `async` start_with_background_picture(pic: Picture) returns(board: Board)\n action `sync` board() returns(board: Board)\n action `sync` on_end(@action: Action)\n action `async` start_landscape() returns(board: Board)\n action `async` start_portrait() returns(board: Board)\n action `sync` set_hud_colors(life: Color, timer: Color, score: Color)\n action `sync` hud_sprites() returns(sprites: Sprite_Set)\n action `async` life_visible() returns(b: Boolean)\n action `async` set_life_visible(visible: Boolean)\n action `sync` sprites() returns(sprites: Sprite_Set)\n action `async` set_background_scene(direction: String, pic: Picture)\n action `sync` bounce_on_sides()\n action `sync` create_sprite(pic: Picture) returns(sprite: Sprite)\n action `async` splash(message: String, options\\u003f: ♻ game → Splash_Options)\n action `async` splash_text(message: String, seconds: Number, foreground: Color, background: Color, done: Action)\n }\n}\n#IgJeOaT4qD6XCDWM\naction splatter(#xSZvm6EeJuCvT4s4 sprite: Sprite, #MCvt1zYjYJcK4L44 splatter: Picture) {\n #X4OAdwxnO5wHxDZa // Splats the ``splatter`` picture under the ``sprite`` and fades it away.\n #X64Ps5YYS1av5MpI $sp := @\\u267b→game→board→create_picture($splatter);\n #ODXoYXN95HMQR2Cl $sp→set_pos($sprite→x, $sprite→y);\n #u9qh43UUwoK0FZl0 $sp→set_width($sprite→width);\n #x2LYMGKCfJ1oW8qz $sp→set_speed($sprite→speed_x / 5, $sprite→speed_y / 5);\n #uAJdLNuxiNbu2T4D $sp→friction := 0.05;\n #xkBOKjaSeL4oRcyl $sp→z_index := $sprite→z_index - 1;\n #F7VCHbHecTaVIjT4 $anim := $sp→create_animation;\n #IUYXcNBxhS2fVVRG $anim→puff_out(0.6, \"cubic\", 1.2);\n #bx6onFKBhqu1SI15 $anim→delete;\n}\n#v4ugzdtO8BJPkkj4\naction add_score(#wysUeGszNWAN7trp sprite: Sprite, #tEL2GDgDi86bI72e score: Number) {\n #VeUaeIa25nApnqQT // Shows a little score animation\n #NxnWqSc1zhnO54N9 $bonus := @\\u267b→game→board→create_text(100, 20, 15, $score→to_string);\n #DdGj3W3NCt2n0PVo if $score > 0 then {\n #jIysyn2MjoPyhGQY $bonus→set_text(\"+\" ∥ $bonus→text);\n #dyvGOVwl5E8c2rkE $bonus→set_color(colors→orange);\n }\n else {\n #FMAzDAxm7WBKyVi5 $bonus→set_color(colors→red);\n }\n #VyMLdyfovccmoVPZ $bonus→fit_text;\n #s9mf7tHP4hg6zQrA $bonus→set_pos($sprite→right, $sprite→@top + $bonus→height * 0.6);\n #lU46vyX425TKrBrI $bonus→set_color(colors→green);\n #wGW2fYDAlMw9MmgM @\\u267b→game→add_score($score);\n #trQhQdUjt6fA4cos $anim := $bonus→create_animation;\n #zz6SU1LbMkxhFiv2 $anim→fork→fade_out(1.5, \"linear\");\n #aQP47O58Ny55MN92 $anim→move_to(1.5, \"linear\", \"inout\", $bonus→x, $bonus→y - $sprite→height / 2);\n #IWdqhz1GYoeIezqg $anim→delete;\n meta sync;\n}\n#xkUbqdD2nTGw2md2\naction demo() {\n #nKfBY2pfuGzl6Lqa $pic := media→create_picture(480, 800);\n #umREhXlH6l4zWsW1 $pic→clear(colors→green);\n #c4OOPp4yjrTumwFn $board := @\\u267b→game→start;\n #xC9EjUCuAFD2OizM @\\u267b→game→bounce_on_sides;\n #HTWzkiDs2iFrpskf $sprite := $board→create_rectangle(100, 100);\n #bzn6oVDiFRefDYp2 $sprite→set_color(colors→blue);\n #xYGC7i8OXtlJa6Do $sprite→set_acceleration_y(400);\n #JLsA8cmWdwlhqyVQ $sprite→set_opacity(0.8);\n #r5ErvAs4SbRUQw7y $sprite→on_tap($tapped);\n #ReFgA1ac1h6CUcqH where tapped(x: Number, y: Number) {\n #V34hkhzTxtRXuf22 code→splatter($sprite, $pic);\n #xdmQ7YIokLC3Enu3 code→add_score($sprite, 100);\n }\n meta private;\n meta test;\n}\n#FEj2rviL4TuENW1u\naction puff(#K0dT3erQY946Qikv sprite: Sprite) {\n #wL61RR1dWtwBzsUz // Create a little puff out animation\n #gS3roQKn8OtmLwfZ $pf := @\\u267b→game→board→create_ellipse($sprite→width, $sprite→height);\n #FQE8wIG8gSPhzKob $pf→x := $sprite→x;\n #vTXyJ2Ydw2QPjMzV $pf→y := $sprite→y;\n #K0hkpaxIGOKgRCn1 $anim := $pf→create_animation;\n #AYo2HSiJ936KQfIR $anim→puff_out(0.5, \"cubic\", 1.5);\n #xeDEZFLy319oNVtY $anim→delete;\n}\n", "qwos": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank event hubs\";\nmeta icon \"Stacks\";\nmeta color \"#ffffffff\";\nmeta rootId \"rTo1i2UE9ZqDVMIBTLAUqMYl\";\nmeta iconArtId \"wyfreugv\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta isCloud \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"network,npm,shell\";\nmeta parentIds \"\";\n// A node.js web site that sends events to Azure Event Hubs using AMQP. #node #azure #restify #rest #api\n#x6T4YCsBsZWtPUmF\naction \\_init() {\n #Zy8rc2YHRBIcmnOf // This template allows you to easily stream data to an Azure Event Hubs instance using the AMQP1.0 protocol.\n #LKpR3HLsnUt8zjTC // To setup this service, you will have to setup the following:\n #x0DCfAxIkDRE4kH5 // * An [Event Hub](http://azure.microsoft.com/en-us/services/event-hubs/) in Azure.\n #BPgmHhKMscVJieMa // * define the ``AZURE_SERVICEBUS_SAS_KEY_NAME`` environment variable with your SAS key name\n #R7tTfXVWqjfIjJuw // * define the ``AZURE_SERVICEBUS_SAS_KEY`` environment variable with the SAS key.\n #uHkwReQVwrICaHzH // * (optional) setup application insights instrumentation key by defining the ``APPINSIGHTS_INSTRUMENTATION_KEY`` environment variable.\n #JGUzkYMjc2rxbxQ2 // * `[Export]` this script to a node.js web site.\n #bMtNnag4oaUSbmG8 data→logger := app→create_logger(\"api\");\n #ggtkH2QPjkFSMATl code→init_restify;\n #xYi50zyUUbDrUiYA code→init_azure_services;\n #GmpMiJN3N0hJ473p // TODO: change the event hubname below\n #A3exv4u2E6ZcTY5F data→hub := @\\u267b→azure_event_hubs→create_event_hub_if_not_exists(\"events\");\n #rlP2tbcbetF1rUVe time→run_every(1, $perform);\n #OVfCshDzbjMrMcel where perform() {\n #wjsvsYZW73p1LRfD // this is where you read your sensor data\n #xViWmNVnfqeTVF3p $msg := records→Message→create;\n #hzLc4iJcGXm7Yk3P $msg→temp := math→random(1000);\n #T9qIzqSC0FK3USRu // and send it to the event hub...\n #uX42zx1Jbgxuczbb data→hub→send_message_as_json(data→deviceid, $msg→to_json);\n }\n}\n#yjW8JMhhkCVxVG9z meta import parallel {\n pub \"fncvb\"\n usage {\n type queue\n action `async` @for(count: Number, @action: Number_Action)\n action `async` for_batched(count: Number, batch_count: Number, item_action: Number_Action, batch_action: Action)\n action `sync` schedule(q: ♻ parallel → queue, task: Action)\n action `sync` create_queue(max_running: Number) returns(queue: ♻ parallel → queue)\n action `async` wait_for_empty(q: ♻ parallel → queue)\n action `async` for_json(js: Json_Object, @action: Json_Action)\n }\n}\n#kGiIbArLBJgrGrUh\nvar logger : App_Logger {\n transient = true;\n}\n#xht4tB8QBEGYhcxd\naction init_azure_services() {\n #xrdwLuCApP4dSbPN @\\u267b→azure_event_hubs→init;\n #rIelx44MT4mxwsuP if data→deviceid→is_empty then {\n #lVuKP04Sv0BPFvTe data→deviceid := @\\u267b→node_crypto→random_bytes(16)→to_string(\"hex\");\n }\n #SqiRrk2SBmwfUygc data→logger→info(\"deviceid: \" ∥ data→deviceid);\n meta private;\n}\n#VJhyWCgHgpoXBxQe\naction init_restify() {\n #Rfk2zOUWd63utX0c $server := @\\u267b→restify→server;\n #xwHqz4BboMG6fFYA $server→use(@\\u267b→restify→authorization_parser);\n #CCiEC9MjVyBu1Alm $server→pre(@\\u267b→restify→sanitize_path);\n #QhDtswBtwpK4HWfj $throttle := @\\u267b→restify→throttle;\n #xnNL4UkM1HGz7bML where rate := 40;\n #pjHy3CkNNDrbTRdj where burst := 100;\n #u8A4y4yHMKc8lyUK where ip := true;\n #hivZ6Vt6ftjQnefM $server→use($throttle);\n #xHYwcSAiT7KduHhg $server→use(@\\u267b→restify→CORS);\n #uouNso31DPAdpy0R $server→use(@\\u267b→restify→body_parser);\n #PQsbPK8j0KxXP7BN $server→use(@\\u267b→restify→gzip_response);\n #krhauhLHNWLfS4Rr $server→use(@\\u267b→restify→query_parser);\n #OQV2aOnQMrFwfSMH $server→use(@\\u267b→restify→conditional_request);\n #dJCZRF6m52AEcGvh @\\u267b→restify_touchdevelop→autobind($server);\n #RheHhoSGEfw2gVg7 code→init_routes;\n #JCEJ0pDtVdSmeI23 $server→use(@\\u267b→restify_touchdevelop→errors_to_log(data→logger));\n meta private;\n}\n#RtmLKYphNIzdwos1 meta import restify {\n pub \"uqffa\"\n usage {\n action `async` `type` Request_Handler(req: ♻ restify → Request, res: ♻ restify → Response)\n #xLPhdjOebDT8w77X\n table Throttle_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xo6LfV0hyAQtz675 rate : Number\n #yZ2QZAfeW3W74JA1 burst : Number\n #JUlNvDq7Hm9cTUAG ip : Boolean\n #w2h4dcf4I5K5h7kn xff : Boolean\n #RO3Sx6iTt4WsVBm6 username : Boolean\n #VbsYnDvr3t4Xr4VA maxKeys : Number\n #w25h9R5LKJnWiBNu tokensTable : ♻ restify → Tokens_Table\n }\n }\n #xdeuBx505IsZ6eEI\n table Serve_Static_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #NfWLVJBBbHvtMqkl default : String\n #KvIMj1sEoAwQCf22 maxAge : Number\n }\n }\n #mqEMUbizkEp6naSD\n table CORS_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xMYYV6C3eS7PWsfQ origins : String\n #z5HdpFdSi792e1OX credentials : Boolean\n #Fw1D0A9ZfeMCf5c3 headers : String\n }\n }\n #w2zTzWkfMf01yOko\n table Body_Parser_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #mhaHCLobgUgMrv72 maxBodySize : Number\n #xr4fKleNd4wHHP1l mapParams : Boolean\n #st0ir2vLTxbLTQWB mapFiles : Boolean\n #z5ah2mZWb8c5FmTM overrideParams : Boolean\n }\n }\n #xv4yZciZi2wFoqpM\n table Send_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #svWYln7UIackFIpB status : Number\n }\n }\n #BVGhpbmca\n table HTTP_Status_Codes {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #BVGhpbmcaMjAwIE9L @200_OK : Number\n #BVGhpbmcaMjAxIENyZWF0ZWQa @201_Created : Number\n #BVGhpbmcaMzAwIE11bHRpcGxlIENob2ljZXMa @300_Multiple_Choices : Number\n #BVGhpbmcaMzAxIE1vdmVkIFBlcm1hbmVudGx5 @301_Moved_Permanently : Number\n #BVGhpbmcaMzAyIE1vdmVkIFRlbXBvcmFyaWx5 @302_Moved_Temporarily : Number\n #BVGhpbmcaMzAzIFNlZSBPdGhlcgaa @303_See_Other : Number\n #BVGhpbmcaMzA0IE5vdCBNb2RpZmllZAaa @304_Not_Modified : Number\n #BVGhpbmcaMzA3IFRlbXBvcmFyeSBSZWRpcmVjdAaa @307_Temporary_Redirect : Number\n #BVGhpbmcaNDAwIEJhZCBSZXF1ZXN0 @400_Bad_Request : Number\n #BVGhpbmcaNDAxIFVuYXV0aG9yaXplZAaa @401_Unauthorized : Number\n #BVGhpbmcaNDAyIFBheW1lbnQgUmVxdWlyZWQa @402_Payment_Required : Number\n #BVGhpbmcaNDAzIEZvcmJpZGRlbgaa @403_Forbidden : Number\n #BVGhpbmcaNDA0IE5vdCBGb3VuZAaa @404_Not_Found : Number\n #BVGhpbmcaNDA1IE1ldGhvZCBOb3QgQWxsb3dlZAaa @405_Method_Not_Allowed : Number\n #BVGhpbmcaNDA4IFJlcXVlc3QgVGltZW91dAaa @408_Request_Timeout : Number\n #BVGhpbmcaNDA5IENvbmZsaWN0 @409_Conflict : Number\n #BVGhpbmcaNDEwIEdvbmUa @410_Gone : Number\n #BVGhpbmcaNDEyIFByZWNvbmRpdGlvbiBGYWlsZWQa @412_Precondition_Failed : Number\n #BVGhpbmcaNDEzIFJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZQaa @413_Request_Entity_Too_Large : Number\n #BVGhpbmcaNDE1IFVuc3VwcG9ydGVkIE1lZGlhIFR5cGUa @415_Unsupported_Media_Type : Number\n #BVGhpbmcaNDE4IEltIGEgdGVhcG90 @418_Im_a_teapot : Number\n #BVGhpbmcaNDIyIFVucHJvY2Vzc2FibGUgRW50aXR5 @422_Unprocessable_Entity : Number\n #BVGhpbmcaNDIzIExvY2tlZAaa @423_Locked : Number\n #BVGhpbmcaNDI0IEZhaWxlZCBEZXBlbmRlbmN5 @424_Failed_Dependency : Number\n #BVGhpbmcaNDI1IFVub3JkZXJlZCBDb2xsZWN0aW9u @425_Unordered_Collection : Number\n #BVGhpbmcaNDI5IFRvbyBNYW55IFJlcXVlc3Rz @429_Too_Many_Requests : Number\n #BVGhpbmcaNTAwIEludGVybmFsIFNlcnZlciBFcnJvcgaa @500_Internal_Server_Error : Number\n #BVGhpbmcaNTAxIE5vdCBJbXBsZW1lbnRlZAaa @501_Not_Implemented : Number\n #BVGhpbmcaNTAzIFNlcnZpY2UgVW5hdmFpbGFibGUa @503_Service_Unavailable : Number\n }\n }\n type Request\n type Response\n type Tokens_Table\n type Server\n type Middleware\n type Error\n action `sync` use(server: ♻ restify → Server, mid: ♻ restify → Middleware)\n action `sync` get(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` post(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` server() returns(server: ♻ restify → Server)\n action `sync` send(res: ♻ restify → Response, content: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` status(res: ♻ restify → Response, status: Number)\n action `sync` is(req: ♻ restify → Request, type: String) returns(r: Boolean)\n action `sync` accepts(req: ♻ restify → Request, types: String) returns(type: String)\n action `sync` put(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` del(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` head(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` pre(server: ♻ restify → Server, mid: ♻ restify → Middleware)\n action `sync` CORS(options\\u003f: ♻ restify → CORS_Options) returns(mid: ♻ restify → Middleware)\n action `sync` conditional_request() returns(mid: ♻ restify → Middleware)\n action `sync` route(server: ♻ restify → Server, method: String, path: String, @then: ♻ restify → Request_Handler)\n action `sync` json(res: ♻ restify → Response, content: Json_Object, options\\u003f: ♻ restify → Send_Options)\n action `sync` next(res: ♻ restify → Response)\n action `sync` next_error(res: ♻ restify → Response, error: ♻ restify → Error)\n action `sync` address(server: ♻ restify → Server) returns(address: String)\n action `sync` gzip_response() returns(mid: ♻ restify → Middleware)\n action `sync` header(req: ♻ restify → Request, name: String) returns(value: String)\n action `sync` is_secure(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` is_chunked(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` is_keep_alive(req: ♻ restify → Request) returns(r: Boolean)\n action `sync` set_header(res: ♻ restify → Response, name: String, value: String)\n action `sync` body_parser(options\\u003f: ♻ restify → Body_Parser_Options) returns(mid: ♻ restify → Middleware)\n action `sync` throttle(options\\u003f: ♻ restify → Throttle_Options) returns(middleware: ♻ restify → Middleware)\n action `sync` date_parser(clock_skew: Number) returns(middleware: ♻ restify → Middleware)\n action `sync` serve_static(directory: String, options\\u003f: ♻ restify → Serve_Static_Options) returns(middleware: ♻ restify → Middleware)\n action `sync` query_parser() returns(middleware: ♻ restify → Middleware)\n action `sync` authorization_parser() returns(middleware: ♻ restify → Middleware)\n action `sync` jsonp() returns(middleware: ♻ restify → Middleware)\n action `sync` body_as_json(req: ♻ restify → Request) returns(body: Json_Object)\n action `sync` id(req: ♻ restify → Request) returns(id: String)\n action `sync` param(req: ♻ restify → Request, name: String) returns(value: String)\n action `sync` opts(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` patch(server: ♻ restify → Server, path: String, @then: ♻ restify → Request_Handler)\n action `sync` to_string(ser: ♻ restify → Server) returns(s: String)\n action `sync` sanitize_path() returns(middleware: ♻ restify → Middleware)\n action `sync` body(req: ♻ restify → Request) returns(body: String)\n action `sync` send_error(res: ♻ restify → Response, status: Number, message: String)\n action `sync` all(server: ♻ restify → Server, @then: ♻ restify → Request_Handler)\n action `sync` method(req: ♻ restify → Request) returns(method: String)\n action `sync` url(req: ♻ restify → Request) returns(url: String)\n action `sync` query(req: ♻ restify → Request) returns(query: Json_Object)\n action `sync` redirect(res: ♻ restify → Response, status_code: Number, url: String)\n action `sync` send_status(res: ♻ restify → Response, status_code: Number)\n action `sync` charset(res: ♻ restify → Response, encoding: String)\n action `sync` route_regex(server: ♻ restify → Server, method: String, path_regex: String, @then: ♻ restify → Request_Handler)\n action `async` read_body_as_buffer(req: ♻ restify → Request) returns(body: Buffer)\n action `sync` headers(req: ♻ restify → Request) returns(headers: Json_Object)\n action `sync` server_url(req: ♻ restify → Request) returns(url: String)\n action `sync` html(res: ♻ restify → Response, content: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` send_text(res: ♻ restify → Response, content: String, content_type: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` send_buffer(res: ♻ restify → Response, content: Buffer, content_type: String, options\\u003f: ♻ restify → Send_Options)\n action `sync` finished(res: ♻ restify → Response) returns(done: Boolean)\n action `sync` http() returns(codes: ♻ restify → HTTP_Status_Codes)\n }\n}\n#A3d3ZvbSo4doxSON meta import restify_touchdevelop {\n pub \"dvuhb\"\n usage {\n action `sync` autobind(server: ♻ restify → Server)\n action `sync` errors_to_log(logger: App_Logger) returns(middleware: ♻ restify → Middleware)\n }\n #Ndi4Jc7GXTkHfWcQ resolve restify = ♻ restify with {\n }\n}\n#rMIDyd4TDaMKCuVx\naction init_routes() {\n #JtHQs8S4PNExhJqH skip;\n meta private;\n}\n#vOmAlM8jBeSaiHx8 meta import node_crypto {\n pub \"oevpc\"\n usage {\n type credentials\n type hash\n type hmac\n type cipher\n type decipher\n type sign\n type verify\n type DiffieHellman\n action `sync` get_ciphers() returns(ciphers: Collection[String])\n action `sync` get_hashes() returns(hashes: Collection[String])\n action `sync` create_credentials(details: Json_Object) returns(credentials: ♻ node_crypto → credentials)\n action `sync` create_hash(algorithm: String) returns(hash: ♻ node_crypto → hash)\n action `sync` update_hash(hash: ♻ node_crypto → hash, hash_data: Buffer)\n action `sync` digest_hash(hash: ♻ node_crypto → hash) returns(digest: Buffer)\n action `sync` update_hmac(hmac: ♻ node_crypto → hmac, hmac_data: Buffer)\n action `sync` digest_hmac(hmac: ♻ node_crypto → hmac) returns(digest: Buffer)\n action `sync` create_cipher(algorithm: String, password: Buffer) returns(cipher: ♻ node_crypto → cipher)\n action `sync` create_cipher_iv(algorithm: String, key: Buffer, iv: Buffer) returns(iv_cipher: ♻ node_crypto → cipher)\n action `sync` update_cipher(cipher: ♻ node_crypto → cipher, _data: Buffer) returns(enciphered: Buffer)\n action `sync` final(cipher: ♻ node_crypto → cipher) returns(cipher_final: Buffer)\n action `sync` set_auto_padding(cipher: ♻ node_crypto → cipher)\n action `sync` create_decipher(algorithm: String, password: Buffer) returns(decipher: ♻ node_crypto → decipher)\n action `sync` create_decipher_iv(algorithm: String, key: Buffer, iv: Buffer) returns(iv_decipher: ♻ node_crypto → decipher)\n action `sync` update_decipher(decipher: ♻ node_crypto → decipher, _data: Buffer) returns(deciphered: Buffer)\n action `sync` final_(decipher: ♻ node_crypto → decipher) returns(decipher_final: Buffer)\n action `sync` set_auto_padding_(decipher: ♻ node_crypto → decipher)\n action `sync` create_sign(algorithm: String) returns(sign: ♻ node_crypto → sign)\n action `sync` update_sign(sign: ♻ node_crypto → sign, sign\\_data: Buffer)\n action `sync` sign_(sign: ♻ node_crypto → sign, private_key: String) returns(signature: Buffer)\n action `sync` create_verify(algorithm: String) returns(verify: ♻ node_crypto → verify)\n action `sync` update_verify(verify: ♻ node_crypto → verify, verify_data: Buffer)\n action `sync` verify_(verify: ♻ node_crypto → verify, object: String, signature: Buffer) returns(valid: Boolean)\n action `sync` create_DiffieHellman(prime_length: Number) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `sync` generate_keys(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(public_key: Buffer)\n action `sync` compute_secret(DiffieHellman: ♻ node_crypto → DiffieHellman, other_public_key: Buffer) returns(shared_secret: Buffer)\n action `sync` get_prime(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(DH_prime: Buffer)\n action `sync` get_generator(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(generator: Buffer)\n action `sync` get_public_key(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(public_key: Buffer)\n action `sync` get_private_key(DiffieHellman: ♻ node_crypto → DiffieHellman) returns(private_key: Buffer)\n action `sync` set_public_key(DiffieHellman: ♻ node_crypto → DiffieHellman, public_key: Buffer)\n action `sync` set_private_key(DiffieHellman: ♻ node_crypto → DiffieHellman, private_key: Buffer)\n action `sync` get_DiffieHellman(group_name: String) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `async` pbkdf2(password: String, salt: String, iterations: Number, keylen: Number) returns(derived_key: String)\n action `async` random_bytes(size: Number) returns(strong_data: Buffer)\n action `sync` DEFAULT\\_ENCODING() returns(default_encoding: String)\n action `sync` create_hmac(algorithm: String, key: String) returns(hmac: ♻ node_crypto → hmac)\n action `sync` create_DiffieHellmanWithPrime(prime: Buffer) returns(DiffieHellman: ♻ node_crypto → DiffieHellman)\n action `async` pseudo_random_bytes(size: Number) returns(non\\u002dstrong_data: Buffer)\n action `sync` update_hash_string(hash: ♻ node_crypto → hash, hash_data: String)\n action `async` new_guid() returns(guid: String)\n }\n}\n#lQzkFetSEgRfkoD1\nvar deviceid : String {\n}\n#BVGhpbmca\ntable Message {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #wy6NESQzEaxcVB7P temp : Number\n }\n}\n#j113cC0ZjCAoNnDS meta import node_hash {\n pub \"ezbka\"\n usage {\n action `sync` sha256(value: String) returns(digest: String)\n action `sync` sha1(value: String) returns(digest: String)\n }\n #MBLWOTnilXzcOFAX resolve node_crypto = ♻ node_crypto with {\n }\n}\n#OAqit425iZkuTA35\nvar hub : ♻ azure_event_hubs → Event_Hub {\n transient = true;\n}\n#x41EhzlB627EK4e1 meta import azure_event_hubs {\n pub \"qbjtg\"\n usage {\n #qy4yPchAE7AUedlB\n table Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Name of the event hub\n #BULIHveLGv3xhPGc hub_namespace : String\n // Shared Access Signature token; otherwise the server setting ``AZURE_SERVICEBUS_SAS_TOKEN`` is used.\n #xr7jIhKzmCpq0i5N sas_token : String\n }\n }\n #EyRHf2UILCkoocED\n table Event_Hub {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #t4VjI1BVPLvcUl22 name : String\n }\n }\n action `sync` init(options\\u003f: ♻ azure_event_hubs → Options)\n action `async` send_message(hub: ♻ azure_event_hubs → Event_Hub, device_id: String, msg: String) returns(status: Number)\n action `async` create_event_hub_if_not_exists(name_: String) returns(hub: ♻ azure_event_hubs → Event_Hub)\n action `async` send_message_as_json(hub: ♻ azure_event_hubs → Event_Hub, device_id: String, msg: Json_Object) returns(status: Number)\n }\n}\n", "spbd": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank template\";\nmeta rootId \"s18cNgqmk4qdPwKNK0ppoMp2\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n#main\naction main() {\n skip;\n}\n", "szrna": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"export to app\";\nmeta rootId \"xp8sE0p9XtQHYy4T5VhcCufH\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Export your scripts to Windows, Windows Phone or Web apps. #docs #exportToApp\n#main\naction main() {\n #mEtE4fv17EKWFNsk // {parentTopic:contents}\n #OyrhWsuD1E8yISz4 // You can export your scripts as **Windows** apps, **Windows Phone** apps, **Android** apps, **iPhone/iPad** apps that can be published in the app stores of each platform like the Apple App Store or the Windows Store. You can also export to **Azure** web sites or Office Mix.\n #WE7EBnFwXAl99qEN // ### export to App Studio (Windows, Windows Phone)\n #IttiVt6Tov08b0xK // Windows App Studio allows to export (some of) your script to **Windows** and **Windows Phone** through **a web interface**. However, some features such as network requests are not supported.\n #cwjQRgAGBrDnyXde // * **pros** no tools installation, straightforward web site to publish script to Windows, Windows Phone\n #cGhti0U1la6bYar3 // * **cons** some features such as network requests not supported. Only Windows and Windows Phone supported.\n #jcS5DkQwzxLcTDwC // Interrested? [Get started with App Studio](/exporttoappstudio).\n #xfQwOjyqbCZ6UelA // ### export to Cordova app (iOS, Android, Windows)\n #L1JWCQsWnRYB2dGP // Apache Cordova allows to build **Android**, **iOS**, **Windows**, **Windows Phone**, and more platforms. It also provides access to the hundreds of Cordova plugins to create rich apps in TouchDevelop.\n #xgbXNg3ylPwfJLBw // * **pros** target all platforms supported by Apache Cordova, including **iOS** and **Android**.\n #LMFUy87nZuwZ2okp // * **cons** requires running TouchDevelop locally and installing the Apache Cordova tools.\n #lhynaeP1iq2JdgWj // Interrested? [Get started with Cordova](/exporttocordova).\n #TFt2d3cjCzCX0jtD // ### export to Azure Web Apps (Node.JS)\n #TayahDhQnjYSgEyw // If you're not looking to create a client app, you can also convert a script into a [node.js](http://nodejs.org/) app running as Azure Web App. TouchDevelop also allows to use any [npm](https://www.npmjs.com/) packages after wrapping them into a script.\n #emixj6WcdUjIxT29 // Interrested? [Get started with Azure Web Apps](/exporttoazure).\n #u4X7JAa3t1Px3OWG // ### export to Raspberry PI (Node.JS)\n #LOwcrH5NUAqxKSqQ // You can export scripts to Node.JS and run them wherever Node.JS runs... including the Raspberry Pi 1 or 2!\n #xgUx84IiBWz5UzNv // Interrested? [Get started with Raspberry Pi apps](/raspberrypisetup)\n #loQbqxe3beLcUWdX // ### export to web app or Office Mix\n #WHdYF2YQa2Rm4ErK // * [Export to Office Mix](/officemixdocs) allows to create interactive apps that integrate in online Office Mix presentations.\n #fdHsLajmawNqeu7l // * **HTML5 WebApp** No need for walktrough, just hit the `WebApp` button and you are done!\n #Q23Xhi1Fw36lK2aX // ### where do I start?\n #cDLR6mK0SMJkC4dq // * open your script in the editor\n #IGlhqkpixFMY8PVk // * tap on the **script name** (in the example below, my script)\n #dmmiVzVZsmczyWfs // * go to the `[export]` section\n #w6iey58yu47LbDZd // * select the export option\n}\n#storelogos\nvar storelogos : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/fmiidrfd\";\n transient = true;\n}\n#pic\nvar pic : Picture {\n is\\_resource = true;\n transient = true;\n}\n", "szzdc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank arduino\";\nmeta icon \"ArrowStandardCircle\";\nmeta color \"#ff00cc99\";\nmeta rootId \"xkbt9ErH776FGA72sWuqxeOz\";\nmeta iconArtId \"kzajxznr\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// An Arduino sketch. #arduino #arduinoSketch\n#KUJMn0ag6zrqQys9\naction setup() {\n #qWODTg5ZnR95PTeF @\\u267b→arduino→pin_mode(13, @\\u267b→arduino→OUTPUT);\n meta private;\n}\n#UzRPACG9RBTCLU2MkuwLAhpD\naction loop() {\n #x5bamvNg9UVXaFY7 @\\u267b→arduino→digital_write(13, @\\u267b→arduino→HIGH);\n #UybvnpQJqqrqtrnH @\\u267b→arduino→delay(200);\n #xqXPRRCVUKc8rCTO @\\u267b→arduino→digital_write(13, @\\u267b→arduino→LOW);\n #um2lxP36WxO2OgOk @\\u267b→arduino→delay(200);\n meta private;\n}\n#iHY2wlj4qcvFdTHc meta import arduino {\n pub \"cqfda\"\n usage {\n action `sync` digital_read(pin: Number) returns(bit: Number)\n action `sync` digital_write(pin: Number, value: Number)\n action `sync` analog_read(pin: Number) returns(bit: Number)\n action `sync` analog_write(pin: Number, value: Number)\n action `async` pin_mode(pin: Number, mode: Number)\n action `sync` HIGH() returns(v: Number)\n action `sync` LOW() returns(v: Number)\n action `sync` OUTPUT() returns(v: Number)\n action `sync` INPUT() returns(v: Number)\n action `async` delay(millis: Number)\n action `sync` sketch(source: String)\n action `sync` static_buffer(bytes: String) returns(buf: Buffer)\n action `sync` INPUT\\_PULLUP() returns(v: Number)\n action `sync` LED\\_BUILTIN() returns(r: Number)\n action `sync` mac(address: String)\n action `sync` analog_reference(type: Number)\n action `sync` DEFAULT() returns(r: Number)\n action `sync` EXTERNAL() returns(r: Number)\n action `sync` tone(pin: Number, frequency: Number, duration: Number)\n action `sync` no_tone(pin: Number)\n action `sync` millis() returns(millis: Number)\n action `sync` micros() returns(micros: Number)\n action `sync` pulse_in(pin: Number, value: Number, timeout: Number) returns(micros: Number)\n action `sync` board(name: String)\n action `sync` print_value(name: String, value: Number)\n action `sync` print(text: String)\n action `sync` println(text: String)\n action `sync` map(value: Number, from_low: Number, from_high: Number, to_low: Number, to_high: Number) returns(r: Number)\n action `sync` constrain(value: Number, a: Number, b: Number) returns(r: Number)\n action `async` delay_microseconds(micros: Number)\n }\n}\n#xJTsvVkdQIFOcF0fRDHFLPLk\naction variables() {\n #xaFPmIVW8ylv5b9P // Initializes your global variables here.\n meta private;\n}\n#CvN1nxjx0F41jAPT meta import serial {\n pub \"kzkua\"\n usage {\n action `sync` read() returns(byte: Number)\n action `sync` available() returns(bytes: Number)\n action `sync` peek() returns(byte: Number)\n action `sync` print(msg: String)\n action `sync` println(msg: String)\n action `sync` write(byte: Number)\n }\n #ojn444WfORgPYrSW resolve arduino = ♻ arduino with {\n }\n}\n", "tiwt": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank script plugin\";\nmeta icon \"Brush\";\nmeta color \"#ffe3256b\";\nmeta rootId \"B1BBU2S1UsnHiEXWlTqkabme\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current,editoronly\";\nmeta parentIds \"\";\n// A TouchDevelop plugin. #scriptPlugin #buttonPlugin\n#gYzBYlK5jAx3Qfv9\naction do_stuff(#fK8mH7TfckAPC9Ui editor: Editor) {\n #dFvzotTJtIW2DkOD code→init_log;\n #x1Y6B2xJRSkIezBw // TODO: this action gets called by the editor!\n}\n#YCEitfuBjl2PqD4f meta import ast {\n pub \"njle\"\n usage {\n action `async` `type` update_node(type: String, node: Json_Builder)\n action `async` update_nodes(ast: Json_Builder, update: ♻ ast → update_node)\n action `async` update_script(id: String, update: ♻ ast → update_node)\n action `async` test_plugin(plugin: Text_Action)\n action `sync` find_decl(@script: Json_Builder, name: String) returns(decl: Json_Builder)\n }\n}\n#xUKJA4AiahTHnwv2\nvar logger : App_Logger {\n transient = true;\n}\n#PNnxmlnhF0t47I8b\naction init_log() {\n #QliVR9SuYlA9GDox if data→logger→is_invalid then {\n #tE4d3cGdvoaUcNRY data→logger := app→create_logger(\"plugin\");\n }\n meta private;\n meta sync;\n}\n", +"uboba": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"getting started\";\nmeta icon \"CoffeeCup\";\nmeta color \"#ff007fff\";\nmeta rootId \"jgxw4hrQ2FJpvMX5ioKe2B98\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// A few tips on getting started with TouchDevelop. #docs #gettingStarted\n#xIo02XpbLanjKZPs4Os6Y4LA\naction main() {\n #Oqq61gE3scTEvYZY // {parentTopic:contents}\n #zLfUy9LLj4LtaQx1 // {priority:15}\n #BtM6DR2J5yHB6sPI // TouchDevelop lets you **create apps** on all your devices. Let's get started!\n #xTc92pAlcVjk7NIM // ## interactive tutorials\n #UR4kehofIixy8ZqD // Interactive tutorials let you learn at your own pace. We recommend starting out with one or more of these:\n #BMpEHAl89GLjB6Tj // * {follow:first steps with turtle}\n #RyRvlr3i8Xt2QwpU // * {follow:jumping bird tutorial}\n #ZQgFR1AVUm6THyGs // * {follow:coding jetpack jumper}\n #zObCeEa9dPLp8ooa // * {follow:pixel art tutorial}\n #zxrf3iOVA2LWSucN // Try also\n #Fi2zIopLiFb4rNH4 // * Run an [Hour Of Code](https://www.touchdevelop.com/hoc) with TouchDevelop!\n #yx3F7H4uaTmcHwkO // Browse many other [interactive tutorials](/tutorials) and [courses](/courses). Learn how to build your own games, social apps, and more! Also, check out the book [TouchDevelop - Programming on the Go](/book). It's available as a free download!\n #xJmv15REfU94PGim // ## if you have programming experience...\n #fl1IdthF70YHQxDf // ### Traditional Languages\n #ss44jvTWrjOMlUod // {pic:eclipse:12x5}\n #h4UEzbiXxngho4qF // If you have experience with a traditional programming language such as Java, JavaScript, Python, C#, or C++:\n #P2cb12dV12LdnGN4 // * Start with [hello world](/helloworld) and create a TouchDevelop version of the classic 'hello world' app.\n #Tk1HQSMDs4fk4SuF // * Go to the [dev boot camp](/devbootcamp) and get a quick overview of the TouchDevelop language and environment.\n #xqE7TP69LpivSkjp // * Try a [social app tutorial](/socialapptutorials).\n #xM8eoCxsFuNcZ6Lc // ### Block Programming Environments\n #A6h4niF5i1xLuOXm // {pic:scratch:11x4}\n #k1oezDF4jvXHgk3V // If you have experience with block programming environments such as **Scratch**, **AppInventor**, **Snap!** (BYOB), **code.org**, **Blockly**, or other tools, let us show you how to [transition from blocks to text](/fromblockstotext).\n #tJiCJR2enQbzOdxI // ## teachers\n #XrKENFzrbDNVYC4C // {pic:ccga girl}\n #doEktnaVv1icV0a6 // [Creative Coding Through Games And Apps](http://aka.ms/CreativeCoding) is a semester-long Introduction to Computer Science course using Touch Develop.\n #KY8dTaEdqs4sjpRG // ## inform and instruct\n #Retn7qEvVW1pvEQZ // In addition to creating fun and useful apps, you can use TouchDevelop to create custom interactive tutorials to show users how to perform specific tasks. You can also create your own documentation topics to expand the TouchDevelop documentation!\n #xCY1IPuWs8bC15Fj // * [creating interactive tutorials](/creatinginteractivetutorials)\n #HIy9PSdtPgJXRY8Z // * [add your own docs](/addyourowndocs)\n}\n#kZWqFwNpvbKrHfETZ2TSQKCA\nvar scratch : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/fpxfkwlk\";\n transient = true;\n}\n#b97YU9g2RQFdWzG22RPqgK2Y\nvar eclipse : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/srtrixfh\";\n transient = true;\n}\n#SxNnQzF2puTSD7MMUORJP2UN\nvar turtle : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/pskgnelo\";\n transient = true;\n}\n#tRapPcJ9zwXdvBwi\nvar ccga_girl : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/cvapqfwl\";\n transient = true;\n}\n", "ugftc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank game template\";\nmeta icon \"Controller\";\nmeta color \"#ff9955bb\";\nmeta rootId \"x0hukfGG4i3MRik2f8KmalqI\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n#Apxoi0VesSBXIz9PLx65FHFL\naction main() {\n #xSdbHt6IzwL2zF22 $board := @\\u267b→game→start;\n #HcieLw2N0l20RLiX @\\u267b→game→splash(\"Get Ready!\");\n #tO3dDceW3bsm8w4D @\\u267b→game→bounce_on_sides;\n #d3NEpyQ23dEnVv0F $monster := @\\u267b→game→create_sprite(art→monster);\n #DXV4iMnEfxNiTp9x $monster→acceleration_y := 400;\n #b1vCOUVhFBUhOTZS @\\u267b→gamepad→on_button_pressed;\n #wenMZEk4bzR7XHM4 where `implicit` \\_body\\_() {\n #nIR8WfYhh9EC5Qo1 $monster→speed_y := - 200;\n }\n}\n#T3Ql4cZePvcJv2yq meta import game {\n pub \"angli\"\n usage {\n #BVGhpbmca\n table Splash_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #X13V3PCWTQpT2ORT seconds : Number\n #nk8FBg8KCO4gn30S foreground_color : Color\n #Tl89ovYzNYTzCj6A background_color : Color\n }\n }\n action `sync` set_score(value: Number)\n action `async` set_life(value: Number)\n action `sync` start_timer()\n action `sync` start_countdown_timer(seconds: Number)\n action `sync` life() returns(r: Number)\n action `sync` score() returns(r: Number)\n action `sync` current_time() returns(seconds: Number)\n action `sync` add_score(value: Number)\n action `async` add_life(value: Number)\n action `sync` clear_timer()\n action `async` remove_life(value: Number)\n action `async` end()\n action `async` start() returns(board: Board)\n action `sync` reset()\n action `async` start_with_fixed_size(width: Number, height: Number) returns(board: Board)\n action `async` start_with_background_picture(pic: Picture) returns(board: Board)\n action `sync` board() returns(board: Board)\n action `sync` on_end(body: Action)\n action `async` start_landscape() returns(board: Board)\n action `async` start_portrait() returns(board: Board)\n action `sync` set_hud_colors(life: Color, timer: Color, score: Color)\n action `sync` hud_sprites() returns(sprites: Sprite_Set)\n action `async` life_visible() returns(b: Boolean)\n action `async` set_life_visible(visible: Boolean)\n action `sync` sprites() returns(sprites: Sprite_Set)\n action `async` set_background_scene(direction: String, pic: Picture)\n action `sync` bounce_on_sides()\n action `sync` create_sprite(pic: Picture) returns(sprite: Sprite)\n action `async` splash(message: String, options\\u003f: ♻ game → Splash_Options)\n action `async` splash_text(message: String, seconds: Number, foreground: Color, background: Color, done: Action)\n }\n}\n#SU9oq98rU41J6G2v meta import gamepad {\n pub \"mlqea\"\n usage {\n type Settings\n type Gamepad_Event_Binding\n action `sync` current() returns(p: Vector3)\n action `sync` set_keys(settings: ♻ gamepad → Settings, left: String, up: String, right: String, down: String, button: String)\n action `sync` set_use_accelerometer(settings: ♻ gamepad → Settings, enabled: Boolean)\n action `sync` use_accelerometer(settings: ♻ gamepad → Settings) returns(b: Boolean)\n action `sync` control_sprite(sprite: Sprite, max_speed_x: Number, max_speed_y: Number)\n action `sync` control_background_scene(max_speed_x: Number, max_speed_y: Number)\n action `sync` settings() returns(sets: ♻ gamepad → Settings)\n action `sync` set_accelerometer_factor(settings: ♻ gamepad → Settings, factor: Number)\n action `sync` set_keyboard_factor(settings: ♻ gamepad → Settings, factor: Number)\n action `sync` set_touch_factor(settings: ♻ gamepad → Settings, factor: Number)\n action `sync` accelerometer_factor(settings: ♻ gamepad → Settings) returns(factor: Number)\n action `sync` keyboard_factor(settings: ♻ gamepad → Settings) returns(factor: Number)\n action `sync` touch_factor(settings: ♻ gamepad → Settings) returns(factor: Number)\n action `sync` gamepad_factor(settings: ♻ gamepad → Settings) returns(factor: Number)\n action `sync` set_gamepad_factor(settings: ♻ gamepad → Settings, factor: Number)\n action `async` on_button_pressed(body: Action) returns(binding: ♻ gamepad → Gamepad_Event_Binding)\n action `sync` delete(binding: ♻ gamepad → Gamepad_Event_Binding)\n }\n #mfGdJ3XAnPOkRMuG resolve game = ♻ game with {\n }\n}\n#OCiM38F7S5D68naX meta import game_animations {\n pub \"qvira\"\n usage {\n action `async` splatter(sprite: Sprite, splatter: Picture)\n action `sync` add_score(sprite: Sprite, score: Number)\n action `async` puff(sprite: Sprite)\n }\n #wRSSCCH0lkUUewmO resolve game = ♻ game with {\n }\n}\n#ZY2qZ7leUTySclE6\nvar monster : Picture {\n is\\_resource = true;\n url = \"https://az31353.vo.msecnd.net/pub/mezojwug\";\n transient = true;\n}\n", "utqwa": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"language\";\nmeta rootId \"xNNYZSbsMsmUVW3hCWRiTfLg\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Language syntax. #docs #language\n#main\naction main() {\n #nb4CHA53bkLnp177 // {parentTopic:contents}\n #xksr0QSkw2CcGDsA // {priority:20}\n #QVGutM59qm90cWT6 // The language used in TouchDevelop is a scripty language designed for mobile touch screens.\n #YXtUjZDsrELBt0UG // ### script ingredients\n #xkVhY3xIAh4V7pBq // A script contains all the assets that define an app in TouchDevelop.\n #RHCVqjPUb8Np2MQZ // * [](/code)\n #ABeKPb4ps01sDihS // * [](/events)\n #ku9Q5d89i7hMMxjV // * [](/data)\n #ccme6EgMV4JFdwDu // * [](/art)\n #x7dsK3Fm8wLNpvmh // * [](/records)\n #mGh2QhODjHx8wo6O // * [](/pages)\n #T2tAFXdtdGiAZtYS // * [](/libraries)\n #rlZee7R2av4AuDNk // * [action types](/actiontypes)\n #ueq2d0Ob9YpPC4Z5 // * [cloud data](/cloudsessions)\n #D2UrRuXynuBZFwbG // * [persistent data](/persistentdata)\n #J9GaECB3TwEch6n0 // ### code\n #FYHRMyX72ne4FsHL // The following statements are supported by the TouchDevelop language.\n #xOY6HaDGj7R3a6xd // * basic data types: [](/Number), [](/Boolean), [](/String)\n #ki3gLv4ChlKWKuWe // * straight-line [](/commands)\n #x4fYnOsHU6cjdf46 // * [](/operators)\n #B8wZ8WdXi43jsRdU // * [](/var)\n #uw58aM4s0LGJnSd0 // * [](/if)\n #FBCHh8dHvVIKyB5a // * [](/for)\n #jxWMQRmr4K1bYrZ2 // * [for each](/foreach), [where](/where)\n #c9P484EQ4fAcG7ya // * [](/while)\n #DTktcH0EOqQfT0un // * [](/invalid)\n #KSF57iPUg4OyWhuz // * [](/comment)\n #xMdFaKmbfv7LXjuP // * [](/boxed)\n #RD9QKM4T7ODoMv1G // * [](/ref)\n #Gm4gR8MYoGfH2xl0 // * [async](/asyncactions)\n #Gm4gR8MYoGfH2xl0 // * [inline actions](/inlineactions)\n #Pw2hFORG6ljqw21n // * [extension actions](/extensionactions)\n #FhhCfW53SoBn2DFp // ### user interface\n #xHNe5HvYKNjmaLSh // Support to display values, get user input and sensor data, or create complex user interfaces.\n #sXtk9VktJMfBnvxB // * [user input](/userinput)\n #dyobbxJUUbaB7uMX // * [sensors and touch events](/sensorsanduserinput)\n #x6jX4IIXG2ZHO2fa // * [pages](/pages)\n #G2S1PHtM0JDBnDBf // * [](/wall)\n #xLsOhd7UY4k0i9m3 // * [game board](/gameboard)\n}\n", "uvdqc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync,upperplex\";\nmeta name \"blank creeper\";\nmeta color \"#ffffffff\";\nmeta rootId \"nHs55hVQebfHsdRXLqdn6Z3u\";\nmeta iconArtId \"yapqobto\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta splitScreen \"yes\";\nmeta platform \"accelerometer,location,musicandsounds,network,orientation,shell\";\nmeta parentIds \"\";\n// Move the creeper to create cool structures! #minecraft #turtle\n#ew46jSsSq5jX27bx\naction main() {\n #C5Nw6Q63PHrMOwzg @\\u267b→creeper→change_block(\"tnt\");\n #GntZkP8LuGenbICm for 0 ≤ i < 50 do {\n #PP9GM4o5xyjrF9bc @\\u267b→creeper→move_forward(5);\n #x17oHSx7q2zlZQpM @\\u267b→creeper→turn_left(90);\n }\n}\n#rK4c3DfRqf36w9i4 meta import creeper {\n pub \"wupmc\"\n usage {\n action `async` move_forward(blocks: Number)\n action `async` turn_left(angle: Number)\n action `async` turn_right(angle: Number)\n action `async` move_back(blocks: Number)\n action `async` change_block(name: String)\n action `async` fly_down(blocks: Number)\n action `async` fly_up(blocks: Number)\n action `async` position() returns(x: Number, z: Number)\n action `async` fly_mode()\n action `async` build_cube(sides: Number)\n action `async` build_tower(sides: Number, height: Number)\n action `async` wipe_out()\n action `async` mine(blocks: Number)\n action `async` ground_height() returns(y: Number)\n action `async` walk_mode()\n action `async` dig_mode()\n action `async` block() returns(kind: String)\n action `async` chat(msg: String)\n action `async` add_checkpoint(id: String)\n action `async` go_to_checkpoint(id: String)\n action `async` build_walls()\n action `async` change_wool(c: Color)\n }\n #XC8WIMIneVm3Ixh7 resolve turtle = ♻ turtle with {\n }\n #gV4ustz42GMSWIot resolve minecraft_pi = ♻ minecraft_pi with {\n }\n #EP2EI6Cpgl1YyGq1 resolve shell = ♻ shell with {\n }\n}\n#mDbZKA4zyanhcLrQ meta import turtle {\n pub \"gkgtg\"\n usage {\n type Maze\n action `async` pen_down()\n action `async` pen_up()\n action `async` move_to(x: Number, y: Number)\n action `async` forward(steps: Number)\n action `async` left_turn(angle: Number)\n action `async` set_pen_color(c: Color)\n action `async` xcor() returns(x: Number)\n action `async` ycor() returns(y: Number)\n action `async` heading() returns(a: Number)\n action `async` world_width() returns(w: Number)\n action `async` world_height() returns(h: Number)\n action `async` set_heading(angle: Number)\n action `async` set_pen_size(thickness: Number)\n action `async` right_turn(angle: Number)\n action `async` circle(radius: Number)\n action `async` world_board() returns(board: Board)\n action `async` turn_to(dx: Number, dy: Number)\n action `async` world_picture() returns(pic: Picture)\n action `async` set_speed(steps_per_second: Number)\n action `async` go_home()\n action `async` back(steps: Number)\n action `async` pen_size() returns(size: Number)\n action `async` clean()\n action `async` clear_screen()\n action `async` speed() returns(v: Number)\n action `async` set_xy(xcor: Number, ycor: Number)\n action `async` set_x(xcor: Number)\n action `async` set_y(ycor: Number)\n action `async` pen_color() returns(c: Color)\n action `async` color_under() returns(c: Color)\n action `async` save_picture()\n action `async` xy() returns(x: Number, y: Number)\n action `async` touch_xy() returns(tx: Number, ty: Number)\n action `async` show_grid()\n action `async` fast()\n action `async` stamp()\n action `async` set_turtle_picture(pic: Picture)\n action `async` set_turtle_opacity(opacity: Number)\n action `async` trail()\n action `async` add_obstacle(maze: ♻ turtle → Maze, x: Number, y: Number, width: Number, height: Number, c: Color)\n action `async` set_goal(maze: ♻ turtle → Maze, x: Number, y: Number, radius: Number, c: Color)\n action `async` maze() returns(maze: ♻ turtle → Maze)\n action `async` lock(maze: ♻ turtle → Maze)\n action `async` history() returns(commands: String)\n action `async` clear_history()\n action `sync` on_command(command: Text_Action)\n action `async` add_way_point(maze: ♻ turtle → Maze)\n action `async` on_collision(maze: ♻ turtle → Maze, collision: Action)\n action `async` interactive()\n action `async` on_move(@action: Action)\n action `async` set_raster(value: Boolean)\n action `async` \\_libinit()\n }\n}\n#Lr0lexBOV6x2o3LV meta import minecraft_pi {\n pub \"ynlwe\"\n usage {\n #BVGhpbmca\n table Block_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #xNQF2IfWS5kUTCuC state : Number\n #xUNtn4WzFNh0J275 wool : String\n }\n }\n #xIIDIryL3GdLzzFH\n table Connect_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #IhKVKMjdA949jNr3 host : String\n #PQgsvjixlAlu49Bw port : Number\n #nlMXsJlluWZB1fNN proxy : String\n }\n }\n #umgRs0Idq3y9jRyc\n table Block_Event {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #SCV1txxxrjigP8XC kind : String\n #UIy6UFvY6WJWDDoA x : Number\n #wWASeEjKJDoiqrL2 y : Number\n #MkoIqcTcP3QiIoot z : Number\n #kYCW4sVB0Q5jQy0Q face : Number\n #EayHvTpmMjNF3Sfh entity : ♻ minecraft_pi → Entity\n }\n }\n #pqaWOjEWNqEkbxwJ\n table Position {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #L4NO4JXo2Sev2b1J x : Number\n #x2UU2Lt4BiV8NNNz y : Number\n #gw4VDwinZ6yVcwzL z : Number\n }\n }\n #eVDb6TwJ7CKitS8g\n table Repeat_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #VB0iDf9EazabCCQM delay : Number\n }\n }\n type Entity\n action `async` connect(options\\u003f: ♻ minecraft_pi → Connect_Options)\n action `async` fill(@this: ♻ minecraft_pi → Position, name: String, options\\u003f: ♻ minecraft_pi → Block_Options) returns(r: ♻ minecraft_pi → Position)\n action `async` fill_many(@this: ♻ minecraft_pi → Position, corner: ♻ minecraft_pi → Position, name: String, options\\u003f: ♻ minecraft_pi → Block_Options) returns(r: ♻ minecraft_pi → Position)\n action `async` block(@this: ♻ minecraft_pi → Position) returns(name: String)\n action `async` height(@this: ♻ minecraft_pi → Position) returns(h: Number)\n action `async` chat(msg: String)\n action `async` position(entity: ♻ minecraft_pi → Entity) returns(pos: ♻ minecraft_pi → Position)\n action `async` set_position(entity: ♻ minecraft_pi → Entity, p: ♻ minecraft_pi → Position)\n action `sync` is_connected() returns(r: Boolean)\n action `async` player_() returns(p: ♻ minecraft_pi → Entity)\n action `async` direction(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` rotation(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` pitch(entity: ♻ minecraft_pi → Entity) returns(d: Number)\n action `async` player_by_name(name: String) returns(steve: ♻ minecraft_pi → Entity)\n action `sync` block_names() returns(names: Collection[String])\n action `async` forever(body: Action, options\\u003f: ♻ minecraft_pi → Repeat_Options) returns(t: Timer)\n action `sync` wool_colors() returns(cs: Collection[Color])\n action `sync` wool_color(c: Color) returns(name: String)\n action `async` spawn(@this: ♻ minecraft_pi → Position, kind: String) returns(mob: ♻ minecraft_pi → Entity)\n action `async` test_spawn()\n action `async` up(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` down(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` move(@this: ♻ minecraft_pi → Position, x: Number, y: Number, z: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` pos(x: Number, y: Number, z: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` west(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` east(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` north(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` south(@this: ♻ minecraft_pi → Position, value: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` strafe(@this: ♻ minecraft_pi → Position, x: Number, z: Number) returns(r: ♻ minecraft_pi → Position)\n action `async` ground(@this: ♻ minecraft_pi → Position) returns(r: ♻ minecraft_pi → Position)\n action `async` build_wall(@this: ♻ minecraft_pi → Position, corner: ♻ minecraft_pi → Position, height: Number, name: String, options\\u003f: ♻ minecraft_pi → Block_Options) returns(r: ♻ minecraft_pi → Position)\n action `async` wire_redstone(@this: ♻ minecraft_pi → Position, corner: ♻ minecraft_pi → Position) returns(r: ♻ minecraft_pi → Position)\n action `async` fill_redstone(@this: ♻ minecraft_pi → Position, name: String) returns(r: ♻ minecraft_pi → Position)\n }\n #OW4I86tzCBKIqTN4 resolve shell = ♻ shell with {\n }\n}\n#qCGk32sQ794gEunC meta import shell {\n pub \"gzeda\"\n usage {\n #BdGhpbmca\n table Exec_Output {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #YaaLgMz45N5ZuAeU success : Boolean\n #qrwQiGIhHhUhb8AF error : String\n #ijyQCE4KPQL2ziZD code : Number\n #wf4AkGfhLyWkyKhQ stdout : String\n #ZyLfqXXM99R1znCa stderr : String\n }\n }\n #ttC12C2SJrh1ODjl\n table Serial_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n #wXa4BRcG6mdxKU25 delimiter : String\n }\n }\n #Aamro6VY4UQ3IxE3\n table Exec_Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n fields {\n // Additional environment variables\n #xhtUoyBrBc8JWpKW env : String_Map\n }\n }\n type Command_Result\n type Shell_Socket\n action `async` write_file(path: String, content: String) returns(res: ♻ shell → Command_Result)\n action `sync` mkpath(folder: String, name: String) returns(path: String)\n action `async` mkdir(path: String) returns(res: ♻ shell → Command_Result)\n action `async` exec(cmd: String, cwd: String, options\\u003f: ♻ shell → Exec_Options) returns(res: ♻ shell → Exec_Output)\n action `sync` logger() returns(logger: App_Logger)\n action `async` exec_file(cmd: String, args: Collection[String], cwd: String, options\\u003f: ♻ shell → Exec_Options) returns(res: ♻ shell → Exec_Output)\n action `async` python_env() returns(res: ♻ shell → Command_Result)\n action `async` tcp_connect(host: String, port: Number) returns(sock: ♻ shell → Shell_Socket)\n action `async` receive(sock: ♻ shell → Shell_Socket) returns(netdata: String)\n action `async` send(sock: ♻ shell → Shell_Socket, netdata: String)\n action `async` close(sock: ♻ shell → Shell_Socket)\n action `async` serialport_connect(name: String, options\\u003f: ♻ shell → Serial_Options) returns(sock: ♻ shell → Shell_Socket)\n action `async` serial_list() returns(ports: Json_Object)\n action `async` read_file(path: String) returns(content: String)\n }\n}\n", @@ -178,7 +178,7 @@ {"name":"comment","id":"agcpf","rootid":"sqor","userid":"jeiv","description":"A note in the code. #docs #comment #language","iconbackground":"#007FFF","icon":"Contacts","iconArtId":null,"splashArtId":null,"time":1412666160,"priority":10000,"parentTopic":"language"}, {"name":"contents","id":"kxwna","rootid":"otbw","userid":"jeiv","description":"Documentation. #docs #content","iconbackground":"#FF7518","icon":"PlusBoxAlt","iconArtId":null,"splashArtId":null,"time":1431363498,"priority":1}, {"name":"cordova library guide","id":"pxgka","rootid":"pxgka","userid":"jeiv","description":"Develop your own Apache Cordova libraries. #docs #cordova","iconbackground":"#FFA500","icon":"QuestionCircle","iconArtId":null,"splashArtId":null,"time":1419280927,"priority":10000}, -{"name":"courses","id":"kumqe","rootid":"cqvl","userid":"jeiv","description":"Courses and tutorials for TouchDevelop. #docs #courses","iconbackground":"#E3256B","icon":"Erase","iconArtId":null,"splashArtId":null,"time":1424828791,"priority":10000,"parentTopic":"teach"}, +{"name":"courses","id":"wfwxe","rootid":"cqvl","userid":"jeiv","description":"Courses and tutorials for TouchDevelop. #docs #courses","iconbackground":"#E3256B","icon":"Erase","iconArtId":null,"splashArtId":null,"time":1440435395,"priority":10000,"parentTopic":"teach"}, {"name":"coverage","id":"wcbu","rootid":"dfpo","userid":"jeiv","description":"Investigate code coverage of your script with the built-in code coverage tools. #docs","iconbackground":"#FF0038","icon":"Justified","iconArtId":null,"splashArtId":null,"time":1412666479,"priority":10000,"parentTopic":"advancedtopics"}, {"name":"crazy holiday football tutorial","id":"wnzk","rootid":"qnxj","userid":"jeiv","description":"Tap the screen to creates more pumpkins! #docs","iconbackground":"#FF91A4","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1415066198,"priority":10000,"platforms":["musicandsounds"],"parentTopic":"gametutorials"}, {"name":"crazy pumpkins tutorial","id":"htsu","rootid":"qnxj","userid":"jeiv","description":"Tap the screen to creates more pumpkins! #docs","iconbackground":"#A1CAF1","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1384585198,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/lpjjsove"}, @@ -220,7 +220,7 @@ {"name":"game tutorials","id":"nqxba","rootid":"nssd","userid":"jeiv","description":"A list of interactive game tutorials #docs","iconbackground":"#008080","icon":"MultiplyCircle","iconArtId":null,"splashArtId":null,"time":1415145463,"priority":10000,"parentTopic":"tutorials"}, {"name":"gameloop","id":"jgpl","rootid":"ryega","userid":"jeiv","description":"An event that triggers many times a second. #docs #events","iconbackground":"#FF7518","icon":"Bolt","iconArtId":null,"splashArtId":null,"time":1412947137,"priority":10000,"parentTopic":"games"}, {"name":"games","id":"yuipc","rootid":"mbqg","userid":"jeiv","description":"Resources on creating games. #docs #games","iconbackground":"#008080","icon":"Notebook","iconArtId":null,"splashArtId":null,"time":1412687862,"priority":10000,"parentTopic":"contents"}, -{"name":"getting started","id":"qkezc","rootid":"idsna","userid":"jeiv","description":"A few tips on getting started with TouchDevelop. #docs #gettingStarted","iconbackground":"#007FFF","icon":"CoffeeCup","iconArtId":null,"splashArtId":null,"time":1430950598,"priority":15,"parentTopic":"contents"}, +{"name":"getting started","id":"uboba","rootid":"idsna","userid":"jeiv","description":"A few tips on getting started with TouchDevelop. #docs #gettingStarted","iconbackground":"#007FFF","icon":"CoffeeCup","iconArtId":null,"splashArtId":null,"time":1440540190,"priority":15,"parentTopic":"contents"}, {"name":"getting started with arduino","id":"wwun","rootid":"utpcc","userid":"jeiv","description":"A guide to developing Arduino with TouchDevelop. #docs #arduino","iconbackground":"#00CC99","icon":"ArrowCircleRounded","iconArtId":null,"splashArtId":null,"time":1432060445,"priority":10000}, {"name":"great game","id":"xdrz","rootid":"xdrz","userid":"jeiv","description":"","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1405034770,"priority":10000,"platforms":["musicandsounds"]}, {"name":"group scripts","id":"agbfe","rootid":"knqeb","userid":"jeiv","description":"A project is a script that can be edited by multiple users. #docs","iconbackground":"#66FF00","icon":"Mute","iconArtId":null,"splashArtId":null,"time":1430273090,"priority":10000,"parentTopic":"groups"}, @@ -337,7 +337,7 @@ {"name":"subscriptions","id":"gnkya","rootid":"ydcn","userid":"jeiv","description":"Subscribe to users and tags. #docs #subscriptions #bazaar","iconbackground":"#E25822","icon":"AdminUser","iconArtId":null,"splashArtId":null,"time":1412686848,"priority":10000,"parentTopic":"socialcoding"}, {"name":"supper digger","id":"uwzb","rootid":"cwbue","userid":"jeiv","description":"A empty Minecraft Pi script #minecraft","iconbackground":"#FFFFFF","icon":"Anchor","iconArtId":"eopyzwpm","splashArtId":null,"time":1438055386,"priority":10000,"platforms":["editoronly"]}, {"name":"tap mania tutorial","id":"myuqb","rootid":"ucau","userid":"jeiv","description":"A tutorial to learn to create cloud-connected apps. #docs #tutorials #stepbystep","iconbackground":"#FFA500","icon":"FourColumn","iconArtId":null,"splashArtId":null,"time":1421688964,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/ttcqbzzz","parentTopic":"socialapptutorials"}, -{"name":"teach","id":"ckbk","rootid":"jcsj","userid":"jeiv","description":"Teaching with TouchDevelop. #docs #teach #education","iconbackground":"#FFA500","icon":"Video","iconArtId":null,"splashArtId":null,"time":1420735201,"priority":100,"parentTopic":"contents"}, +{"name":"teach","id":"ohqwa","rootid":"jcsj","userid":"jeiv","description":"Teaching with TouchDevelop. #docs #teach #education","iconbackground":"#FFA500","icon":"Video","iconArtId":null,"splashArtId":null,"time":1440540017,"priority":100,"parentTopic":"contents"}, {"name":"testing","id":"qztgb","rootid":"kqusb","userid":"jeiv","description":"Describes how to write and execute tests #docs","iconbackground":"#00008B","icon":"Grapes","iconArtId":null,"splashArtId":null,"time":1412666450,"priority":10000,"parentTopic":"advancedtopics"}, {"name":"tiles","id":"skzn","rootid":"ygaya","userid":"jeiv","description":"Learn how to control the active tiles of your scripts. #docs #tiles","iconbackground":"#EEDC82","icon":"WritePage","iconArtId":null,"splashArtId":null,"time":1377844202,"priority":10000,"platforms":["tiles"]}, {"name":"tinter tutorial","id":"lrgbb","rootid":"xeeua","userid":"jeiv","description":"A tutorial to build an app that tints pictures #docs #apps #tutorials #stepbystep","iconbackground":"#B7410E","icon":"Wand","iconArtId":null,"splashArtId":null,"time":1415076872,"priority":10000}, @@ -379,7 +379,7 @@ {"title":"blank turtle","id":"blankturtle","icon":"Controller","name":"ADJ turtle","description":"An turtle app.","section":"beginners","scriptid":"parp","editorMode":1}, {"title":"blank scratch","id":"blankscratch","icon":"Controller","name":"ADJ app","description":"An empty app using the scratch library.","section":"beginners","scriptid":"enyra","editorMode":1}, {"title":"blank pixel art","id":"blankpixelart","icon":"NineColumn","name":"ADJ art","description":"A pixel art app.","section":"beginners","scriptid":"mdrw","editorMode":1}, -{"title":"blank minecraft pi","id":"blankminecraftpi","icon":"NineColumn","name":"ADJ craft","description":"A Minecraft Pi app.","section":"Minecraft","scriptid":"oskkg","editorMode":1}, +{"title":"blank minecraft pi","id":"blankminecraftpi","icon":"NineColumn","name":"ADJ craft","description":"A Minecraft Pi app.","section":"Minecraft","scriptid":"kwlwa","editorMode":1}, {"title":"blank creeper","id":"blankcreeper","icon":"NineColumn","name":"ADJ creeper","description":"A Minecraft creeper app.","section":"Minecraft","scriptid":"uvdqc","editorMode":1}, {"title":"blank cordova library","id":"blankcordovalibrary","icon":"ApproveButton","name":"cordova ADJ plugin","description":"An wrapper around an Apache Cordova plugin.","section":"apps","scriptid":"gtfla","editorMode":3}, {"title":"blank web app","id":"blankwebapi","icon":"Stacks","name":"ADJ api","description":"A web app using Node.js and Restify.","section":"web apps","scriptid":"egzse","editorMode":3}, diff --git a/generated/langs.js b/generated/langs.js index 5db8c172..06ef1ce5 100644 --- a/generated/langs.js +++ b/generated/langs.js @@ -460,6 +460,7 @@ var keys = [ "cut", "cut selection", "data", +"database", "debug", "decimal dot", "delete", @@ -746,7 +747,7 @@ if (lang == "en-GB") { TDev.Util._setLanguageArray(keys, [0,0,0,0,0,0,0,0,0,0,0, "Search...", 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "add", -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "dismiss", 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "goal:", @@ -1073,6 +1074,7 @@ if (lang == "zh-CHS") { TDev.Util._setLanguageArray(keys, [ "剪切", 0, "数据", +0, "调试", "小数点", "删除", @@ -1660,6 +1662,7 @@ if (lang == "es") { TDev.Util._setLanguageArray(keys, [ "cortar", 0, "datos", +0, "depurar", "punto decimal", "eliminar", @@ -2261,6 +2264,7 @@ if (lang == "ar") { TDev.Util._setLanguageArray(keys, [ "قص", 0, "البيانات", +0, "تصحيح", "نقطة عشرية", "حذف", @@ -2860,6 +2864,7 @@ if (lang == "pt") { TDev.Util._setLanguageArray(keys, [ "recortar", 0, "dados", +0, "depurar", "ponto decimal", "excluir", @@ -3493,6 +3498,7 @@ if (lang == "ru") { TDev.Util._setLanguageArray(keys, [ "вырезать", 0, "данные", +"база данных", "отладка", "десятичная точка", "удалить", @@ -4079,6 +4085,7 @@ if (lang == "de") { TDev.Util._setLanguageArray(keys, [ "Ausschneiden", 0, "Daten", +0, "Debuggen", "Dezimalzeichen", "Löschen", @@ -4783,6 +4790,7 @@ if (lang == "fr") { TDev.Util._setLanguageArray(keys, [ "couper", 0, "données", +0, "déboguer", "point décimal", "supprimer", @@ -5400,6 +5408,7 @@ if (lang == "pl") { TDev.Util._setLanguageArray(keys, [ "wytnij", 0, "dane", +0, "debuguj", "kropka dziesiętna", "usuń", @@ -6021,6 +6030,7 @@ if (lang == "nl") { TDev.Util._setLanguageArray(keys, [ "knippen", "selectie knippen", "gegevens", +0, "debuggen", "decimale punt", "verwijderen", @@ -6603,6 +6613,7 @@ if (lang == "tr") { TDev.Util._setLanguageArray(keys, [ "kes", 0, "veriler", +0, "hata ayıkla", "ondalık nokta", "sil", @@ -7174,6 +7185,7 @@ if (lang == "ko") { TDev.Util._setLanguageArray(keys, [ "잘라내기", 0, "데이터", +0, "디버그", "소수점", "삭제", @@ -7743,6 +7755,7 @@ if (lang == "ja") { TDev.Util._setLanguageArray(keys, [ "切り取り", 0, "データ", +0, "デバッグ", "小数点", "削除", @@ -8015,7 +8028,7 @@ if (lang == "ja") { TDev.Util._setLanguageArray(keys, [ if (lang == "he") { TDev.Util._setLanguageArray(keys, [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "חיפוש...", -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "עזרה...", 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "עוד", @@ -8029,7 +8042,7 @@ if (lang == "he") { TDev.Util._setLanguageArray(keys, [0,0,0,0,0,0,0,0,0,0,0,0,0 if (lang == "cy") { TDev.Util._setLanguageArray(keys, [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "Chwilio...", -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "fy sgriptiau", 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "tap yno" diff --git a/rt/ticker.ts b/rt/ticker.ts index c877c3be..dcf68bd1 100644 --- a/rt/ticker.ts +++ b/rt/ticker.ts @@ -373,6 +373,7 @@ module TDev { hubBasicEditorVideoVoice, hubBasicEditorVideoSubtitles, hubBeginnersGettingStarted, + hubCCGA, hubChatSearch, hubRateTouchdevelop, hubChooseSkill,