TouchDevelop/help.cache

363 строки
293 KiB
Plaintext
Исходник Ответственный История

Этот файл содержит невидимые символы Юникода!

Этот файл содержит невидимые символы Юникода, которые могут быть отображены не так, как показано ниже. Если это намеренно, можете спокойно проигнорировать это предупреждение. Используйте кнопку Экранировать, чтобы показать скрытые символы.

{
"abgjb": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"widgets\";\nmeta icon \"Callout\";\nmeta color \"#ff9955bb\";\nmeta rootId \"xhf1Sp6J1xBm2sAyHDvS1Bdb\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n#main\naction example() {\n // * display a social network message\n code→message(bazaar→current_user, time→now, \"hello!\");\n meta private;\n}\n#message\naction message(user: User, dt: DateTime, text: String) {\n // Displays a message in the current box\n do box {\n box→set_margins(0.2, 0.2, 0.2, 0.5);\n $msg := social→create_message($text);\n $msg→set_from($user→name);\n if $user→has_picture then {\n $msg→set_picture_link(\"https://www.touchdevelop.com/api/\" ∥ web→url_encode($user→id) ∥ \"/picture?which=square\");\n }\n $msg→set_time($dt);\n $msg→post_to_wall;\n }\n meta sync;\n}\n#E1WCAiUZJ9Mv8Ia4upv8cGKG\naction picture(url: String) {\n // Displays a web picture, given a url\n $link := web→link_image($url);\n $link→post_to_wall;\n meta sync;\n}\n",
"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",
"awyse": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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 #mClTcZMKYR837I54 // * [](/profiling)\n #sKUw6xXGoNI93ext // * [](/coverage)\n #cg4SuHwjzmBSBiYV // * [](/refactorings)\n #BWzEufAUIGczyAse // * [](/plugins)\n #xEQPTaV6NZqozCt4 // ## exporting\n #pnSWGGicOCNMrbwm // * [exporting scripts to apps](/exporttoapp)\n #xqTAOKPZhoBMoLyi // ## consuming web services\n #PZrfFZse0UnUeTSb // * [web requests](/webrequests) Use HTTP web requests and responses\n #tKO2k9nkxwe67qkd // * [parsing data](/parsingdata) Read data in various formats (JSON, XML, CSV)\n #xjzaOb5gVJ8OZKdj // * [cloud APIs](https://www.touchdevelop.com/help/cloudservices) enable you to interact with the TouchDevelop cloud\n #lupXbjECZ2VpYbIl // ## authenticating web services\n #RkVPdH3qp4wOP4Sv // * [Microsoft Live](/script:pfoo) Authenticating and using the Microsoft Live APIs\n #x8qk8ThHJ982rug9 // * [Facebook](/script:yeoq) Authenticating and using the Facebook Graph APIs\n #hn7E2HZPQFWItv0Z // * [Google](/script:efxjb) Authenticating and using the Google APIs\n #xmCpQj4D94Ba9Qf6 // * and [many others](/oauthv2)\n}\n",
"bhjyb": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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 #Engduink\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#XAWEAriEDqFjwWmS meta import engduino {\n pub \"ogmwd\"\n usage {\n\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 #YPEF5gW7PSmp9b4U resolve arduino = ♻ arduino with {\n }\n}\n#uvXS88LcuackBUtZ\naction main() {\n #EuO57UhnSOMDRRlU // This action emulates the code loop in the bug and will not be compiled.\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\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",
"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",
"cljk": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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",
"cqnha": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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",
"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",
"dbjyb": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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 #OdP2Jka5zS5NMgJG // ## Beta feature!\n #xSh4e5kqwQHcBmkx // It is possible to run TouchDevelop from a local web server on your machine. This allow TouchDevelop to work completely offline or access services required for [app generation](/exporttocordova).\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=<your key here>``\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",
"djjlc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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 #tO3dDceW3bsm8w4D @\\u267b→game→bounce_on_sides;\n #d3NEpyQ23dEnVv0F $monster := @\\u267b→game→create_sprite(art→monster);\n #DXV4iMnEfxNiTp9x $monster→acceleration_y := 400;\n #casrRb7vrPB4Den3 @\\u267b→gamepad→on_button_pressed($@action);\n #UCgGiaTYNYB3k9mm where @action() {\n #nIR8WfYhh9EC5Qo1 $monster→speed_y := - 200;\n }\n}\n#QgTAJQKZ2nORRZRz meta import game {\n pub \"sduub\"\n usage {\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` splash_text(message: String, seconds: Number, foreground: Color, background: Color, done: 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 }\n}\n#hMbw1hQ3jl9MfUNI meta import gamepad {\n pub \"krxlb\"\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(@action: Action) returns(binding: ♻ gamepad → Gamepad_Event_Binding)\n action `sync` delete(binding: ♻ gamepad → Gamepad_Event_Binding)\n }\n #zDeKtzLCNCj9mWEr resolve game = ♻ game with {\n }\n}\n#xSTcRyh4flfGg1AZ meta import game_animations {\n pub \"nehv\"\n usage {\n action `async` splatter(sprite: Sprite, splatter: Picture)\n action `sync` add_score(sprite: Sprite, score: Number)\n }\n #QG0x2FmWdJxIAUPl 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",
"dywha": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank express web site\";\nmeta icon \"Space\";\nmeta color \"#ffffffff\";\nmeta rootId \"jDJRj1seQOoZB3U7qqrGz1tc\";\nmeta iconArtId \"wyfreugv\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta isCloud \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"network,npm,shell\";\nmeta parentIds \"\";\n// An Express web site #node #azure #express\n#hiD2Wvx98aNqdu2X\naction \\_init() {\n #xYtoEBf3RCXkd4GO data→logger := app→create_logger(\"myweb\");\n #uBHv8x9x4btJELAn data→logger→debug(\"starting...\");\n #ceNJU1vmJrnKmk8j code→init_express;\n #x0ycvfOPw9VKV8fk data→logger→info(\"started...\");\n}\n#b3vaILgZrhX64BbM meta import express {\n pub \"lfwp\"\n usage {\n action `async` `type` Request_Handler(req: ♻ express → Request, res: ♻ express → Response)\n action `async` `type` Request_Param_Handler(req: ♻ express → Request, res: ♻ express → Response, value: String)\n action `async` `type` Error_Request_Handler(err: ♻ express → Error, req: ♻ express → Request, res: ♻ express → Response)\n type Request\n type Response\n type Error\n type Router\n type Middleware\n type Route\n type Application\n type Engine\n action `sync` use(router: ♻ express → Router, path: String, mid: ♻ express → Middleware)\n action `sync` route(router: ♻ express → Router, path: String) returns(route: ♻ express → Route)\n action `sync` get(route: ♻ express → Route, @then: ♻ express → Request_Handler)\n action `sync` post(route: ♻ express → Route, @then: ♻ express → Request_Handler)\n action `sync` route_param(router: ♻ express → Router, name: String, mid: ♻ express → Request_Param_Handler)\n action `sync` router(application: ♻ express → Application) returns(route: ♻ express → Router)\n action `sync` all(route: ♻ express → Route, @then: ♻ express → Request_Handler)\n action `sync` setting(application: ♻ express → Application, name: String) returns(value: String)\n action `sync` set_setting(application: ♻ express → Application, name: String, setting: String)\n action `sync` root_app() returns(application: ♻ express → Application)\n action `sync` use_router(router: ♻ express → Router, path: String, nested: ♻ express → Router)\n action `sync` use_error(router: ♻ express → Router, mid: ♻ express → Error_Request_Handler)\n action `sync` path(application: ♻ express → Application) returns(path: String)\n action `sync` enable(application: ♻ express → Application, name: String)\n action `sync` disable(application: ♻ express → Application, name: String)\n action `sync` enabled(application: ♻ express → Application, name: String) returns(b: Boolean)\n action `sync` disabled(application: ♻ express → Application, name: String) returns(b: Boolean)\n action `sync` mountpath(application: ♻ express → Application) returns(path: Json_Object)\n action `sync` on(route: ♻ express → Route, method: String, @then: ♻ express → Request_Handler)\n action `sync` original_url(req: ♻ express → Request) returns(url: String)\n action `sync` url(req: ♻ express → Request) returns(url: String)\n action `sync` base_url(req: ♻ express → Request) returns(url: String)\n action `sync` params(req: ♻ express → Request) returns(params: Json_Object)\n action `sync` body(req: ♻ express → Request) returns(body: String)\n action `sync` send(res: ♻ express → Response, content: String)\n action `sync` static(path: String) returns(mid: ♻ express → Middleware)\n action `sync` query(req: ♻ express → Request) returns(query: Json_Object)\n action `sync` matched_route(req: ♻ express → Request) returns(route: Json_Object)\n action `sync` status(res: ♻ express → Response, status: Number)\n action `sync` end(res: ♻ express → Response)\n action `sync` send_status(res: ♻ express → Response, status: Number)\n action `sync` redirect(res: ♻ express → Response, status: Number, url: String)\n action `sync` location(res: ♻ express → Response, url: String)\n action `sync` json(res: ♻ express → Response, content: Json_Object)\n action `sync` type(res: ♻ express → Response, type: String)\n action `sync` locals(res: ♻ express → Response) returns(locs: Json_Builder)\n action `sync` app_locals(application: ♻ express → Application) returns(locs: Json_Builder)\n action `sync` param(req: ♻ express → Request, name: String) returns(param: String)\n action `sync` is(req: ♻ express → Request, type: String) returns(B: Boolean)\n action `sync` fresh(req: ♻ express → Request) returns(fresh: Boolean)\n action `sync` engine(application: ♻ express → Application, ext: String, engine: ♻ express → Engine)\n action `sync` render(res: ♻ express → Response, name: String)\n action `sync` attachment(res: ♻ express → Response, path: String)\n action `sync` send_file(res: ♻ express → Response, path: String)\n action `sync` accepts(req: ♻ express → Request, types: String) returns(type: String)\n action `sync` body_as_json(req: ♻ express → Request) returns(body: Json_Object)\n action `sync` jsonp(res: ♻ express → Response, content: Json_Object)\n action `sync` put(route: ♻ express → Route, @then: ♻ express → Request_Handler)\n action `sync` delete(route: ♻ express → Route, path: String, @then: ♻ express → Request_Handler)\n action `sync` create_router() returns(router: ♻ express → Router)\n action `sync` next(res: ♻ express → Response, options: String)\n action `sync` method(req: ♻ express → Request) returns(method: String)\n action `sync` set_header(res: ♻ express → Response, header: String, value: String)\n }\n}\n#SG238Q4OmPxmVR4P meta import express_body\\u002dparser {\n pub \"ecffc\"\n usage {\n action `sync` json() returns(mid: ♻ express → Middleware)\n action `sync` text() returns(mid: ♻ express → Middleware)\n action `sync` url_encoded() returns(mid: ♻ express → Middleware)\n action `sync` raw() returns(mid: ♻ express → Middleware)\n }\n #nLGmfaUOhlUfL74N resolve express = ♻ express with {\n }\n}\n#nDav9xExRTePgaGg meta import express_jade {\n pub \"cfxl\"\n usage {\n action `sync` engine() returns(engine: ♻ express → Engine)\n }\n #xRwOawUOWkxRGw7G resolve express = ♻ express with {\n }\n}\n#LeHEpisvM4q12k8t\naction GET_\\u002fping() returns(#qP7k85ypSxJnhYWo millis: Number) {\n #yiWcOl1M3MXNCbtN // Gets the number of milli seconds since epoch\n #hnK45z9F55C3NChZ $millis := time→now→milliseconds_since_epoch;\n}\n#e6etd5mIJhX1K0JK meta import express_touchdevelop {\n pub \"azay\"\n usage {\n action `sync` autobind(router: ♻ express → Router)\n action `sync` errors_to_log(logger: App_Logger) returns(middleware: ♻ express → Middleware)\n }\n #g4lL1aVFCH3g1lge resolve express = ♻ express with {\n }\n}\n#xk4vhm4c3AviAc9b\nvar logger : App_Logger {\n transient = true;\n}\n#ErkjeVpi2PFdk3wN\naction init_express() {\n #xAhdSfGRemXu1if1 $application := @\\u267b→express→root_app;\n #elEFt68Wge4UKbHC $router := $application→router;\n #xLw2Qq18Yaa27v4k $router→use(\"/\", @\\u267b→express_cors→cors);\n #eoFz2EGsaF30XqyL $router→use(\"/\", @\\u267b→express_body\\u002dparser→json);\n #fa1RAG9wtM7V1uiH $router→use(\"/\", @\\u267b→express_body\\u002dparser→text);\n #qM2DRBq2Y2v7tX2S // view engines\n #xvne14wIqJXBmxXD $application→engine(\"jade\", @\\u267b→express_jade→engine);\n #YlCYG1CwiVL6r2Oo // routes for TouchDevelop fuctions\n #dHhu0vEFtH3OYNEH @\\u267b→express_touchdevelop→autobind($application→router);\n #xYfDAyPsE4vmIjs2 // custom routes\n #i43FxYbigcUhVlmm $router→route(\"/echo\")→post($@then);\n #aaobGHQo1RDjZmut where @then(req: ♻ express → Request, res: ♻ express → Response) {\n #jrlqIwhURyURpoW1 $body := $req→body;\n #xZDFMBC26c8LQyJO data→logger→debug(\"echo \" ∥ $body);\n #Bi02XLyHk2I0gP1K $res→send($body);\n }\n #LOe4XfnvNUWOxoUO // error logging\n #rwTessEslB3P8KFt $router→use(\"/\", @\\u267b→express_touchdevelop→errors_to_log(data→logger));\n meta private;\n meta sync;\n}\n#b1Bbx0WKzsBhwJVU meta import express_cors {\n pub \"pzhea\"\n usage {\n action `sync` cors() returns(mid: ♻ express → Middleware)\n }\n #jkPPKe5AX2SKxtgR resolve express = ♻ express with {\n }\n}\n",
"enyra": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank scratch\";\nmeta icon \"Flag\";\nmeta color \"#ffffa500\";\nmeta rootId \"DW2rPXfOGG0eQFu92NcRb5TE\";\nmeta platform \"current\";\n// #scratch\n#mNUzNyy2wxUPIVGaxSd7qyIc\naction main() {\n skip;\n}\n#scratch meta import scratch {\n pub \"cagwa\"\n usage {\n type scratch_sprite\n action `sync` new_sprite(pic: Picture) returns(sprite: ♻ scratch → scratch_sprite)\n action `async` move(sprite: ♻ scratch → scratch_sprite, steps: Number)\n action `async` say_for(sprite: ♻ scratch → scratch_sprite, text: String, seconds: Number)\n action `sync` play_sound(sound: Sound)\n action `async` play_sound_until_done(sound: Sound)\n action `async` turn_left(sprite: ♻ scratch → scratch_sprite, degrees: Number)\n action `async` turn_right(sprite: ♻ scratch → scratch_sprite, degrees: Number)\n action `sync` x_position(sprite: ♻ scratch → scratch_sprite) returns(x: Number)\n action `sync` y_position(sprite: ♻ scratch → scratch_sprite) returns(y: Number)\n action `sync` grid()\n action `async` change_x_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `async` change_y_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` set_y_to(sprite: ♻ scratch → scratch_sprite, y: Number)\n action `sync` set_x_to(sprite: ♻ scratch → scratch_sprite, x: Number)\n action `sync` direction(sprite: ♻ scratch → scratch_sprite) returns(d: Number)\n action `async` point_in_direction(sprite: ♻ scratch → scratch_sprite, degrees: Number)\n action `async` glide_to(sprite: ♻ scratch → scratch_sprite, duration: Number, x: Number, y: Number)\n action `async` go_to_x_y(sprite: ♻ scratch → scratch_sprite, x: Number, y: Number)\n action `async` show(sprite: ♻ scratch → scratch_sprite)\n action `async` hide(sprite: ♻ scratch → scratch_sprite)\n action `async` change_size_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` size(sprite: ♻ scratch → scratch_sprite) returns(size: Number)\n action `async` wait(seconds: Number)\n action `sync` mouse_down\\u003f() returns(b: Boolean)\n action `sync` mouse_y() returns(x: Number)\n action `sync` mouse_x() returns(x: Number)\n action `sync` pick_random(start: Number, end: Number) returns(r: Number)\n action `sync` user_name() returns(name: String)\n action `sync` user_picture() returns(pic: Picture)\n action `sync` ask_and_wait(text: String) returns(answer: String)\n action `sync` go_to_front(sprite: ♻ scratch → scratch_sprite)\n action `sync` go_back(sprite: ♻ scratch → scratch_sprite, layers: Number)\n action `sync` if_on_edge\\u002c_bounce(sprite: ♻ scratch → scratch_sprite)\n action `sync` switch_backdrop_to(backdrop: Picture)\n action `sync` current_time() returns(now: DateTime)\n action `sync` when_clicked(sprite: ♻ scratch → scratch_sprite, clicked: Action)\n action `sync` distance_to(sprite: ♻ scratch → scratch_sprite, other: ♻ scratch → scratch_sprite) returns(d: Number)\n action `sync` point_towards(sprite: ♻ scratch → scratch_sprite, other: ♻ scratch → scratch_sprite)\n action `sync` mouse\\u002dpointer() returns(m: ♻ scratch → scratch_sprite)\n action `sync` timer() returns(t: Number)\n action `sync` reset_timer()\n action `sync` when_backdrop_clicked(clicked: Position_Action)\n action `async` go_to(sprite: ♻ scratch → scratch_sprite, other: ♻ scratch → scratch_sprite)\n action `async` next_costume(sprite: ♻ scratch → scratch_sprite)\n action `async` add_costume(sprite: ♻ scratch → scratch_sprite, pic: Picture)\n action `async` say(sprite: ♻ scratch → scratch_sprite, text: String)\n action `sync` when_flag_clicked(clicked: Action)\n action `sync` create_clone(sprite: ♻ scratch → scratch_sprite) returns(clone: ♻ scratch → scratch_sprite)\n action `sync` touching(sprite: ♻ scratch → scratch_sprite, other: ♻ scratch → scratch_sprite) returns(b: Boolean)\n action `sync` x_speed(sprite: ♻ scratch → scratch_sprite) returns(vx: Number)\n action `sync` y_speed(sprite: ♻ scratch → scratch_sprite) returns(y: Number)\n action `sync` change_speed_x_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` change_speed_y_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` x_acceleration(sprite: ♻ scratch → scratch_sprite) returns(ax: Number)\n action `sync` y_acceleration(sprite: ♻ scratch → scratch_sprite) returns(ay: Number)\n action `sync` change_x_acceleration_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` change_y_acceleration_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` set_x_speed_to(sprite: ♻ scratch → scratch_sprite, speed: Number)\n action `sync` set_y_speed_to(sprite: ♻ scratch → scratch_sprite, speed: Number)\n action `sync` set_x_acceleration_to(sprite: ♻ scratch → scratch_sprite, acceleration: Number)\n action `sync` set_y_acceleration_to(sprite: ♻ scratch → scratch_sprite, acceleration: Number)\n action `sync` forever(@action: Action)\n action `sync` friction(sprite: ♻ scratch → scratch_sprite) returns(f: Number)\n action `sync` set_friction_to(sprite: ♻ scratch → scratch_sprite, friction: Number)\n action `sync` when_swipped(sprite: ♻ scratch → scratch_sprite, swiped: Vector_Action)\n action `sync` when_backdrop_swiped(swiped: Vector_Action)\n action `sync` device_x_acceleration() returns(dev_ax: Number)\n action `sync` device_y_acceleration() returns(dev_ay: Number)\n action `sync` bounce_on_edges()\n action `async` set_size_to(sprite: ♻ scratch → scratch_sprite, percent: Number)\n action `async` clear()\n action `sync` pen_down(sprite: ♻ scratch → scratch_sprite)\n action `sync` pen_up(sprite: ♻ scratch → scratch_sprite)\n action `sync` set_pen_color_to(sprite: ♻ scratch → scratch_sprite, c: Color)\n action `sync` set_pen_color_to_wheel(sprite: ♻ scratch → scratch_sprite, c: Number)\n action `sync` change_pen_color_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` set_pen_size_to(sprite: ♻ scratch → scratch_sprite, size: Number)\n action `sync` change_pen_size_by(sprite: ♻ scratch → scratch_sprite, amount: Number)\n action `sync` stamp(sprite: ♻ scratch → scratch_sprite)\n action `sync` join(left: String, right: String) returns(s: String)\n action `sync` letter_of(index: Number, s: String) returns(c: String)\n action `sync` length(s: String) returns(r: Number)\n action `sync` stop_all()\n action `async` new_rectangle_sprite(color: Color, width: Number, height: Number) returns(sprite: ♻ scratch → scratch_sprite)\n action `sync` key_pressed\\u003f(key: String) returns(b: Boolean)\n action `sync` when_key_pressed(key: String, @action: Action)\n }\n}\n",
"exvp": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank office mix\";\nmeta icon \"AddressBook\";\nmeta rootId \"w0BIoDnMjckDm4IxHPWUL5LO\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n#theme meta import theme {\n pub \"gnvi\"\n usage {\n action `async` title_1()\n action `async` title_2()\n action `async` title_3()\n action `async` subtle()\n action `async` normal()\n action `sync` example()\n action `async` accent()\n action `async` set_right_aligned(value: Boolean)\n action `async` huge()\n }\n}\n#main\naction slideshow_view(\\u2756: * slideshow_view_page_data) {\n if box→is_init then {\n code→load_settings;\n }\n if true then {\n // We show the question taken as input in the Edit Mode. The answer is passed to the Input Activity created in Edit Mode (and referred by index `0`).\n do box {\n data→settings→question→post_to_wall;\n }\n @\\u267b→forms→input_text_area(\"\", $\\u2756→text→\\u25c8ref);\n @\\u267b→forms→button(\"submit\", $on_tapped);\n where on_tapped() {\n $slideshow := @\\u267b→office_mix→current_viewer;\n $slideshow→complete_input_activity(0, $\\u2756→text, 1, true);\n $slideshow→next_slide;\n }\n }\n meta private;\n meta page;\n meta sync;\n}\n#BbWFpbiBwYWdlIGRhdGEa\ntable slideshow_view_page_data {\n type = \"Object\";\n persistent = false;\n fields {\n #mxIky6R9ZTE4uS48eYA6Q8jB text : String\n }\n}\n#YZGaVg1jhqq9sfncCGsIoHbh meta import forms {\n pub \"rwffb\"\n usage {\n action `sync` `type` display_code()\n action `sync` `type` validator(s: String) returns(error: String)\n action `sync` button(text: String, on_tapped: Action)\n action `sync` checkbox(text: String, checked: Ref[Boolean])\n action `sync` show_example()\n action `sync` input_string_collection(label: String, strings: String_Collection)\n action `sync` input_text_line(label: String, text: Ref[String])\n action `sync` input_text_area(label: String, text: Ref[String])\n action `sync` input_password(label: String, password: Ref[String])\n action `sync` input_number(label: String, text: Ref[String], changehandler: Number_Action)\n action `sync` labeled_content(label: String, content: display_code)\n action `sync` indented_content(content: display_code)\n action `sync` input_choice(label: String, choices: String_Collection, index: Ref[Number])\n action `sync` input_text_line_w\\u002f_validator(label: String, text: Ref[String], errorcheck: validator, changehandler: Text_Action)\n }\n}\n#LHF2iIBnkOQcwhcoQKFiR4A2 meta import widgets {\n pub \"abgjb\"\n usage {\n action `sync` message(user: User, dt: DateTime, text: String)\n action `sync` picture(url: String)\n }\n}\n#iDxzKDq4042OKy7IX4V4D91F meta import layout {\n pub \"cwgn\"\n usage {\n action `sync` stretch_and_center()\n action `async` grid_of_squares(cell_content: Number_Action, count: Number, grid_width: Number, grid_height: Number)\n action `async` horizontal_hub_of_squares(cell_content: Number_Action, count: Number, cell_size: Number, group_width: Number, total_height: Number)\n action `async` vertical_hub_of_squares(cell_content: Number_Action, count: Number, cell_size: Number, total_width: Number, group_height: Number)\n }\n}\n#BdGhpbmca\ntable Settings {\n type = \"Object\";\n persistent = false;\n fields {\n #qkFSUVeLWy15xGwkOSkxcgi8 question : String\n }\n}\n#xlTdxT5HNK4dNq8WHyG47gDw\naction main() {\n // See `Office Mix` library for more documentation.\n @\\u267b→office_mix→connect;\n if @\\u267b→office_mix→is_edit_mode then {\n // `Edit Mode` is activated when the user opens your app while making the slides.\n code→settings_view;\n }\n else { if @\\u267b→office_mix→is_view_mode then {\n // `View Mode` is fired when the slide containing your app is activated on a slideshow or in Mix lesson player.\n code→slideshow_view;\n }\n else { } } \n}\n#megDAnWFZthpuq80jwFuWisO\nvar settings : * Settings {\n // Add fields that need to be stored for the configuration of the app.\n transient = true;\n}\n#UW3iOsSblj12g3meTHz4P9yV\naction settings_view(\\u2756: * settings_view_page_data) {\n if box→is_init then {\n code→load_settings;\n wall→set_subtitle(\"settings\");\n }\n if true then {\n // This app stores a question from the user.\n @\\u267b→forms→input_text_area(\"Question\", data→settings→question→\\u25c8ref);\n @\\u267b→forms→button(\"save\", $on_tapped);\n where on_tapped() {\n code→save_settings;\n }\n }\n meta private;\n meta page;\n meta sync;\n}\n#BICBuYW1lICAa\ntable settings_view_page_data {\n type = \"Object\";\n persistent = false;\n}\n#Ofpos6ZVH8Uq4wNIrVcx6Oj5\naction save_settings() {\n $editor := @\\u267b→office_mix→current_editor;\n // The index of an activity is a unique number to reference it. The expected answer is optional and is used by Office Mix analytics.\n // Custom data is any data that you need while the app starts in View Mode. In this particular script, it is the `question` set by the user.\n $editor→set_input_activity(0, \"\", 1, data→settings→to_json);\n meta private;\n}\n#TyCJn9KTtksCY1nxdUpgB18L\naction load_settings() {\n $js := @\\u267b→office_mix→current_configuration(0);\n data→settings := records→Settings→create;\n if not $js→is_invalid then {\n data→settings→from_json($js);\n }\n else {\n code→default_settings;\n }\n meta private;\n}\n#XOVEmidye5OpPaWMlmI6njTk\naction default_settings() {\n // This is the sample question to be used if no configuration is provided in `Edit Mode`\n data→settings→question := \"Edit me to set the question\";\n meta private;\n meta sync;\n}\n#h2r1rbrbC280iZiz2Hvcq740 meta import office_mix {\n pub \"smola\"\n usage {\n type viewer\n type editor\n type choice\n action `async` slide_state(viewer: ♻ office_mix → viewer) returns(js: Json_Object)\n action `async` set_slide_state(viewer: ♻ office_mix → viewer, state: Json_Object)\n action `async` next_slide(viewer: ♻ office_mix → viewer)\n action `async` complete_simple_activity(viewer: ♻ office_mix → viewer, index: Number)\n action `async` current_viewer() returns(viewer: ♻ office_mix → viewer)\n action `async` connect()\n action `async` current_editor() returns(editor: ♻ office_mix → editor)\n action `sync` is_edit_mode() returns(b: Boolean)\n action `sync` is_connected() returns(connected: Boolean)\n action `sync` is_view_mode() returns(b: Boolean)\n action `async` current_configuration(index: Number) returns(js: Json_Object)\n action `async` set_simple_activity(editor: ♻ office_mix → editor, index: Number, custom_data: Json_Object)\n action `async` set_input_activity(editor: ♻ office_mix → editor, index: Number, answer: String, max_score: Number, custom_data: Json_Object)\n action `async` complete_input_activity(viewer: ♻ office_mix → viewer, index: Number, answer: String, score: Number, is_complete: Boolean)\n action `async` set_choice_activity(editor: ♻ office_mix → editor, index: Number, choices: Collection[ ♻ office_mix → choice], max_score: Number, custom_data: Json_Object)\n action `sync` create_choices(editor: ♻ office_mix → editor) returns(choices: Collection[ ♻ office_mix → choice])\n action `sync` add_choice(choices: Collection[ ♻ office_mix → choice], name: String, is_answer: Boolean)\n action `async` complete_choice_activity(viewer: ♻ office_mix → viewer, index: Number, answer: String_Collection, score: Number, is_complete: Boolean)\n action `async` start_attempt(viewer: ♻ office_mix → viewer, index: Number, type: String)\n action `async` add_hints(editor: ♻ office_mix → editor, index: Number, hints: String_Collection)\n action `async` get_hint(viewer: ♻ office_mix → viewer, index: Number, hint_index: Number) returns(hint: String)\n action `sync` is_run_locally() returns(b: Boolean)\n action `async` on_skip_slide(viewer: ♻ office_mix → viewer, @action: Action)\n }\n}\n",
"fbyfa": "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 #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 #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}\n",
"fjsc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"faq\";\nmeta rootId \"NvlICz4I1I4g3L6rdvkN1Sb4\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Frequently asked questions. #docs #faq\n#main\naction main() {\n #pfDKPZiTONFucbOz // {parentTopic:contents}\n #rKH7VYjeSZ5qTv4I // ### who created TouchDevelop\n #kWnrfxiKMJ4aYPsI // TouchDevelop is developed by the Research in Software Engineering group (RiSE) at Microsoft Research. [Learn more about our research...](http://research.microsoft.com/touchdevelop)\n #egrX5Ed4mYOl7Bth // ### why was TouchDevelop created\n #gEGMxxU9wvoQlver // We want to explore how the future of software development might look like when the most commonly accessible computing devices are mobile devices. We have found that TouchDevelop is a great way to learn or teach programming.\n #pmZW7gwSpCwvSeBk // ### what browsers and devices does TouchDevelop run on?\n #Gqsjd4PJ7qF7a0UK // The TouchDevelop Web App runs on [virtually all recent platforms](https://www.touchdevelop.com/platforms), including iPad, iPhone, Android (phones and tablets), Macs, PC. For the Windows Phone, you can download the [TouchDevelop app from the Windows Phone Store](http://windowsphone.com/s?appId=fe08ccec-a360-e011-81d2-78e7d1fa76f8).\n #bigUk0bn4RM2dCYR // ### does TouchDevelop replace other professional IDEs?\n #ohexDxybnieKiV0T // TouchDevelop has been designed for mobile devices with touchscreens. While it can also be used with keyboard and mouse, you still want to use professional development tools when you have the resources.\n #YWFFlzEAXfYkdY88 // ### how do I create Windows/Windows Phone/Android/iOS apps?\n #xdUdmLFEFOLeF1cA // Follow the instructions in [export to app](/exporttoapp).\n #xmTE4RGGcQR3sKzQ // ### what about the TouchDevelop Windows Phone app\n #PtmBA5LLot5CBSoc // The TouchDevelop Windows Phone app was the first to launch in April 2011. The TouchDevelop Web App Preview was launched in October 2012. Certain sensors and data providers that can be used in the TouchDevelop Windows Phone app and generated Windows 8 apps are not accessible on the web due to browser restrictions.\n #ojIFVLpIRq4h9Vxv // ### does TouchDevelop work offline?\n #Q5zmZEpbcPASdM4H // Yes! After you run the web app once, it will be cached on your device. [learn more...] (/offlinesupport)\n #NPgmp4E1zKDUWzci // ### how can I change the language of TouchDevelop?\n #jmGZ4cLweV6NmbgY // Go to your [account settings](/accountsettings) and change your preferred language. TouchDevelop is not yet localized in all languages so your mileage will vary.\n #RuC7HRkZBa31lEwn // ### does TouchDevelop work in my language?\n #f1cC43ALRBBO76r5 // TouchDevelop is partially localized. Help us localize TouchDevelop by playing the [localization game](http://touchdeveloptranslator.azurewebsites.net/)!\n #CaQzOPGewL8pVAUE // TouchDevelop will also automatically translate the help into your language using Microsoft Translator.\n #uVYmmkB4gCGsybvf // ### how was the TouchDevelop Web App created?\n #rWI2639IS1nEOZXu // The TouchDevelop Web App is written in Type Script. [Watch this video from the //build/ conference](http://channel9.msdn.com/Events/Build/2012/3-018) to learn more.\n #zMkQvwvtUNp76J2L // ### how do I report bugs or contact the TouchDevelop team?\n #ul12npnsSIJDd4AI // Tap on the `feedback` link on the lower right of this page.\n}\n",
"gnvi": "meta version \"v2.2,js,ctx\";\nmeta name \"theme\";\nmeta icon \"AlignLeft\";\nmeta color \"#ff9955bb\";\nmeta rootId \"pyxigTkgfxN2UU8WcngsVxr3\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n// Basic themes for boxes\naction title_1() {\n // Sets the current box to **title 1** style\n $m := 0.5;\n $font_size := 2;\n code→paragraph($m, $font_size, colors→foreground);\n}\naction paragraph(margins: Number, font_size: Number, foreground: Color) {\n box→set_margins($margins, $margins, $margins, $margins);\n box→set_font_size($font_size);\n box→set_text_wrapping(true, 15);\n box→set_foreground($foreground);\n if data→right_aligned then {\n box→set_horizontal_alignment(0, 1);\n }\n meta private;\n}\naction title_2() {\n // Sets the current box to **title 2** style\n $m := 0.5;\n $font_size := 1.5;\n code→paragraph($m, $font_size, colors→foreground);\n}\naction title_3() {\n // Sets the current box to **title 3** style.\n $m := 0.5;\n $font_size := 1.2;\n code→paragraph($m, $font_size, colors→foreground);\n}\naction subtle() {\n // Sets the current box to **subtle** style.\n $m := 0.5;\n $font_size := 1;\n code→paragraph($m, $font_size, colors→subtle);\n}\naction normal() {\n // Sets the current box to **normal** style\n $m := 0.5;\n $font_size := 1;\n code→paragraph($m, $font_size, colors→foreground);\n}\naction example() {\n if box→is_init then {\n skip;\n }\n if true then {\n // This library provides various built in themes to display structured paragraphs.\n // All text wrap by default.\n do box {\n code→huge;\n \"huge\" →post_to_wall;\n }\n do box {\n code→title_1;\n \"title 1\" →post_to_wall;\n }\n do box {\n code→title_2;\n \"title 2\" →post_to_wall;\n }\n do box {\n code→title_3;\n \"title 3\" →post_to_wall;\n }\n do box {\n code→normal;\n \"normal\" →post_to_wall;\n }\n do box {\n code→accent;\n \"accent\" →post_to_wall;\n }\n do box {\n code→subtle;\n \"subtle\" →post_to_wall;\n }\n }\n meta page;\n}\naction accent() {\n // Sets the current box to **accent** style.\n $m := 0.5;\n $font_size := 1;\n code→paragraph($m, $font_size, colors→accent);\n}\naction set_right_aligned(value: Boolean) {\n // Sets whether the next paragraphs should be right aligned.\n data→right_aligned := $value;\n}\nvar right_aligned : Boolean {\n}\naction huge() {\n // Sets the current box to **title 1** style\n $m := 0.5;\n $font_size := 5;\n code→paragraph($m, $font_size, colors→foreground);\n}\n",
"gtfla": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank cordova library\";\nmeta icon \"ApproveButton\";\nmeta color \"#ffe3256b\";\nmeta rootId \"yGFW3wy9mcuwDt2lxN2XzLPS\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"accelerometer,compass,gyroscope,location,musicandsounds,network,orientation,phone,cordova\";\nmeta parentIds \"\";\n// A library that wraps an Apache cordova plugin #cordova\n#xbyRT3U8tTYlJuX3\naction init(#qC2ALk0kurvg43d9 options\\u003f: * Options) {\n #MNkyanFCYYm1mj2c // Initializes the plugin. Call once.\n #X4G0I6zR3PXSOoW2 contract→requires(data→logger→is_invalid, \"plugin already initialized\");\n #t7IXp9pyue4DKV3r app→import(\"cordova\", \"TODO: cordoval plugin name here\", \"*\");\n #pAoVhCYiE8wIBNx2 data→logger := app→create_logger(\"mylib\");\n #x5295YzyzYEkwRz9 // TODO: use `app-> javasctipt` and `app->javascript async` to proxy with javascript.\n #NSEi48Fc3E82Gzhc // TODO: change the script description\n #xGNJXaGae2QQzC4o // TODO: write docs in `code-> example`\n}\n#SHXfYJBDaSY28xmP\nvar logger : App_Logger {\n transient = true;\n}\n#BdGhpbmca\ntable Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n}\n#M64FUpLsIJLTUj44\naction example() {\n #HaX1MKDnbGBzPPnq // Document your library here!\n meta private;\n meta sync;\n}\n",
"ibksb": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank node library\";\nmeta icon \"ArrowStandardCircle\";\nmeta color \"#ff007fff\";\nmeta rootId \"yGFW3wy9mcuwDt2lxN2XzLPS\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"network,npm,shell\";\nmeta parentIds \"\";\n// A library that wraps a npm module #node #npm #azure\n#xbyRT3U8tTYlJuX3\naction init(#qC2ALk0kurvg43d9 options\\u003f: * Options) {\n #MNkyanFCYYm1mj2c // Initializes the library. Call this action from your ``_init`` function.\n #t7IXp9pyue4DKV3r app→import(\"npm\", \"TODO: npm package name here\", \"*\");\n #pAoVhCYiE8wIBNx2 data→logger := app→create_logger(\"TODO: mylib\");\n #PUrP48D9R04LP8ev // TODO: use `app-> server setting` to read environment variables or node command line arguments.\n #x5295YzyzYEkwRz9 // TODO: use `app-> javasctipt` and `app->javascript async` to proxy with javascript.\n #fNRnVruS6cg7D9H3 // TODO: write some unit tests!\n #xlb7m4Eyw0BWFbzP // TODO: change the script description\n #s4LqDBpWVhF4APDU // TODO: write the docs in `code-> example`\n}\n#SHXfYJBDaSY28xmP\nvar logger : App_Logger {\n transient = true;\n}\n#BdGhpbmca\ntable Options {\n type = \"Object\";\n exported = true;\n persistent = false;\n}\n#egka9cxvzrsZcSyc\naction example() {\n #xbnNQHjvSDNjeKCB // Document your library here!\n #CHb8jtuTrMd1PuMI // {imports}\n meta private;\n meta sync;\n}\n",
"irjz": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank restify web site\";\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 service using Restify. #node #azure #restify\n#xSBmyyFcqCDRZi1l meta import azure_storage {\n pub \"fwer\"\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(\"myweb\");\n #x2Y2gFv2oHeZKjaB code→init_restify;\n #fmCQZR9L4MGzZxju code→init_azure_services;\n #z1Taq8ixDqqUfh2n data→logger→info(\"started...\");\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#xEtQAQTr2kEKR4Qd meta import azure_search {\n pub \"acqbc\"\n usage {\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(service_name: String, api_key: String, api_version: String)\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 }\n}\n#HYf09saPhMlbW1HL meta import azure_service_bus {\n pub \"dxbea\"\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 }\n}\n#GtzZ3bQlwmMy9v5o meta import azure_blob_storage {\n pub \"gajza\"\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 }\n }\n type Blob_Service\n type Container\n type Blob_Info\n action `async` 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) 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) returns(result: ♻ azure_blob_storage → Blob_Info, buf: Buffer)\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` 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 `async` etag(inf: ♻ azure_blob_storage → Blob_Info) returns(etag: String)\n action `async` last_modified(inf: ♻ azure_blob_storage → Blob_Info) returns(lastmod: DateTime)\n action `async` 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 `async` 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 `async` succeded(inf: ♻ azure_blob_storage → Blob_Info) returns(ok: Boolean)\n action `async` text(inf: ♻ azure_blob_storage → Blob_Info) returns(text: String)\n action `async` error(inf: ♻ azure_blob_storage → Blob_Info) returns(message: String)\n action `async` 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 }\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#UOxQdfs1e4yyXvbz meta import redis {\n pub \"szuza\"\n usage {\n type Client\n action `async` create_client(host: String, port: Number, password: String) returns(client: ♻ redis → Client)\n action `async` set(client: ♻ redis → Client, key: String, value: String)\n action `async` get(client: ♻ redis → Client, key: String) returns(value: String)\n action `async` send_command(client: ♻ redis → Client, command: String, args: Json_Object) returns(result: Json_Object)\n action `async` sadd(client: ♻ redis → Client, key: String, value: String) returns(added: Number)\n action `async` scard(client: ♻ redis → Client, key: String) returns(count: Number)\n action `async` smembers(client: ♻ redis → Client, key: String) returns(members: Json_Object)\n action `async` multi(client: ♻ redis → Client) returns(multi: ♻ redis → Client)\n action `async` exec(client: ♻ redis → Client) returns(js: Json_Object)\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 #SefRc2WV2N6j47d4 @\\u267b→azure_storage→init;\n #xEz0G2dzTJTWxcUJ @\\u267b→azure_blob_storage→init;\n #zudlvXHTv0hhPwyW data→blob_service := @\\u267b→azure_blob_storage→create_blob_service;\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 meta private;\n}\n#iiySPFknzOIjtFIO\nvar blob_service : ♻ 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 #jm46Bd6JTW4s4zEU // custom routes\n #B2Ui2S2BrMhefyH4 $server→get(\"/echo\", $@then);\n #c58sWTLqXwkWaboA where @then(req: ♻ restify → Request, res: ♻ restify → Response) {\n #yXsNFxumA3UsfrbL $res→send($req→body);\n }\n #SRHLtK3JrVlEa4dI // error logging\n #UAx1DGb27XEqkYO5 $server→use(@\\u267b→restify_touchdevelop→errors_to_log(data→logger));\n meta private;\n meta sync;\n}\n#hviNQuyg4sU492ot meta import restify {\n pub \"abuha\"\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 // response status code, default is 200\n #svWYln7UIackFIpB status : 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 }\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#TdBk0bwqAZoQ4wgf meta import redis_restify {\n pub \"nwilc\"\n usage {\n action `async` token_table(client: ♻ redis → Client) returns(r: ♻ restify → Tokens_Table)\n }\n #xC27OGAP0OidvO0t resolve restify = ♻ restify with {\n }\n #xzLkfsgbifNIKyCp resolve redis = ♻ redis with {\n }\n}\n#om5lHFOhC2ECNCd8 meta import azure_event_hubs {\n pub \"mlxna\"\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",
"jbyx": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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\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\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 sites\n #TayahDhQnjYSgEyw // If you're not looking to create a client app, you can also convert a script into an Azure web site. TouchDevelop allows to create [node.js](http://nodejs.org/) applications using any package from [npm](https://www.npmjs.com/).\n #emixj6WcdUjIxT29 // Interrested? [Get started with Azure Web Sites](/exporttoazure).\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",
"krxlb": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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#yPeu0IKvKxtuSD7c meta import game {\n pub \"sduub\"\n usage {\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` splash_text(message: String, seconds: Number, foreground: Color, background: Color, done: 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 }\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 time→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 @action: 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 $@action→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 $@action→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` $@action→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",
"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",
"lyjec": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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, performance profiling 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",
"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",
"mlblb": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"social coding\";\nmeta rootId \"BW5Z2tT8PGR2YDIgrAuEFSwo\";\nmeta allowExport \"yes\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Understanding the script lifecycle in TouchDevelop #docs\n#VEa6LCnMw4ZByh2e\naction main() {\n #xBjWgS23MmRm2V8q // {parentTopic:contents}\n #TsSbdsjFrjlfbrl2 // {priority:18}\n #F3AeAVPtlABeBNH0 // TouchDevelop is a social coding platform where users can publish, fork, share their code freely.\n #NqBtxFlY9ixknwfz // ### script lifecycle\n #NNfJw34CNIpPxMKS // * [publishing scripts](/publishing)\n #D2ec4i8FUj8Zf42V // * [script udpates](/scriptupdates)\n #zatUDng4g32z2kw1 // * [script forks](/scriptforks)\n #worYh9j4YpqUkDjQ // * [pull requests](/pullrequests)\n #xBk0CTCjZwiUcwbn // * [](/groupscripts)\n #nTFmRh4k4iWbpFYt // * [how to search](/howtosearch)\n #LvaFGsTPaXgjGvDw // * [publishing run](/publishingrun)\n #hFLp36CMsiiqhnTC // ### community\n #WeNKI424s6V7W4kF // * [user score](/userscore)\n #t74MV1fKe6B4qWAO // * [user account](/useraccounts)\n #xAjOjHispoqafEHB // * [](/groups)\n #KKJEtnheKvaB9l3U // * [](/subscriptions)\n #ywJe2TIjeOzs8Qqn // * [](/insights)\n #EREwb2qLrQvylpAT // * [offline support](/offlinesupport)\n #HrlXZn0HuxSFDF8c // ### documentation\n #YCpaJ14DVX0dfFlw // * [add your own docs](/addyourowndocs)\n #xCtUVFwT2yTxkSyI // * [how to edit the docs](/howtoeditthedocs)\n}\n",
"nehv": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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#MHC9cku1GTEdncGR meta import game {\n pub \"sduub\"\n usage {\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` splash_text(message: String, seconds: Number, foreground: Color, background: Color, done: 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 }\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",
"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",
"owroa": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"forms\";\nmeta icon \"AlignLeft\";\nmeta color \"#ff9955bb\";\nmeta rootId \"mMuT4ZcDiX4oeiP6z7DBQnLh\";\nmeta isLibrary \"yes\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n// Basic user interface elements (buttons, text input boxes, check boxes, drop-down menus) used for simple forms.\n#button\naction button(text: String, on_tapped: Action) {\n // Displays a button\n do box {\n box→set_margins(0.5, 0.5, 0.5, 0.5);\n box→set_padding(0.5, 1, 0.5, 1);\n box→set_border(colors→foreground, 0.1);\n box→set_font_size(1.2);\n box→on_tapped($handler);\n where handler() {\n $on_tapped→run;\n }\n do box {\n box→set_horizontal_align(\"center\");\n box→set_vertical_align(\"center\");\n $text→to_lower_case→post_to_wall;\n }\n }\n meta sync;\n}\n#checkbox\naction checkbox(text: String, checked: Ref[Boolean]) {\n // Displays a checkbox\n do box {\n box→use_horizontal_layout;\n box→set_horizontal_align(\"left\");\n box→set_horizontal_stretch(1);\n box→set_margins(0, 0.5, 0.5, 0.5);\n do box {\n box→use_overlay_layout;\n do box {\n box→set_margins(0, 0, 0, 0.2);\n box→set_font_size(2);\n if $checked→\\u25c8get then {\n box→set_foreground(colors→accent);\n }\n else {\n box→set_foreground(colors→transparent);\n }\n \"✓\" →post_to_wall;\n }\n do box {\n box→set_width(1.5);\n box→set_height(1.5);\n box→set_border(colors→foreground, 0.1);\n \"\" →post_to_wall;\n box→on_tapped($handler);\n where handler() {\n $checked→\\u25c8set( not $checked→\\u25c8get);\n }\n }\n }\n do box {\n box→set_margins(0, 0, 0, 0.3);\n $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(x: Number) {\n // returns the default width of the left column\n if code→narrow_screen then {\n $x := 0;\n }\n else {\n $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 : String_Collection {\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 if box→is_init then {\n if data→example_emails→is_invalid then {\n data→example_emails := collections→create_string_collection;\n }\n data→dropdownchoices := \"Car,Bus,Train,Airplane\" →split(\",\");\n data→example_number_string := data→example_number→to_string;\n }\n if true then {\n // input a string that stays on a single line\n code→input_text_line(\"Name\", data→example_name→\\u25c8ref);\n // input a string that can span multiple lines\n code→input_text_area(\"Comments\", data→example_comments→\\u25c8ref);\n // input a collection of strings (user can add/remove/edit entries)\n code→input_string_collection(\"email addresses\", data→example_emails);\n // input a number\n code→input_number(\"Number\", data→example_number_string→\\u25c8ref, $changehandler);\n where changehandler(x: Number) {\n data→example_number := $x;\n }\n // input a password (characters are hidden)\n code→input_password(\"Password\", data→example_password→\\u25c8ref);\n // input from a dropdown menu\n code→input_choice(\"Transportation\", data→dropdownchoices, data→example_choice→\\u25c8ref);\n // use the \"indented content\" call to achieve consistent indentation\n code→indented_content($content2);\n where content2() {\n // input a boolean, as a checkbox\n code→checkbox(\"send feedback\", data→example_boolean→\\u25c8ref);\n where on_value_change2(boolean: Boolean) {\n data→example_boolean := $boolean;\n }\n }\n // use the \"indented content\" call to achieve consistent indentation\n code→indented_content($content3);\n where content3() {\n // make a button\n code→button(\"Submit\", $tapped);\n where tapped() {\n wall→prompt(\"Submit Button Tapped\");\n }\n }\n }\n meta private;\n meta page;\n meta sync;\n}\n#inputstringcollectio\naction input_string_collection(label: String, strings: String_Collection) {\n code→labeled_content($label, $content);\n where content() {\n do box {\n box→set_margins(0, 0, 0.2, 0);\n if $strings→count > 0 then {\n for 0 ≤ i < $strings→count do {\n do box {\n box→use_horizontal_layout;\n do box {\n box→set_border(colors→black, 0.1);\n box→set_margins(0.2, 0, 0.2, 0);\n box→set_horizontal_stretch(1);\n box→edit(\"textline\", $strings→at($i), $changehandler);\n where changehandler(text: String) {\n $strings→set_at($i, $text);\n }\n }\n do box {\n code→small_button(.5, \"(remove)\", $@action);\n where @action() {\n $strings→remove_at($i);\n }\n }\n }\n }\n }\n do box {\n code→small_button(0, \"(add)\", $@action);\n where @action() {\n $strings→add(\"\");\n }\n }\n }\n }\n meta sync;\n}\n#inputtextline\naction input_text_line(label: String, text: Ref[String]) {\n code→labeled_content($label, $content);\n where content() {\n do box {\n box→set_border(colors→foreground, .1);\n box→edit(\"textline\", $text→\\u25c8get, $changehandler);\n where changehandler(t: String) {\n $text→\\u25c8set($t);\n }\n box→set_margins(0.2, 0.5, 0.2, 0);\n box→set_horizontal_stretch(1);\n }\n }\n meta sync;\n}\n#smallbutton\naction small_button(side_margins: Number, s: String, @action: Action) {\n do box {\n if $side_margins ≠ 0 then {\n box→set_vertical_align(\"top\");\n }\n box→set_horizontal_align(\"center\");\n box→set_margins(0.2, $side_margins, 0, $side_margins);\n box→set_padding(0.2, 0, 0.2, 0);\n box→on_tapped($@action);\n $s→post_to_wall;\n }\n meta private;\n meta sync;\n}\n#inputtextarea\naction input_text_area(label: String, text: Ref[String]) {\n code→labeled_content($label, $content);\n where content() {\n do box {\n box→set_border(colors→foreground, .1);\n box→edit(\"textarea\", $text→\\u25c8get, $changehandler);\n where changehandler(t: String) {\n $text→\\u25c8set($t);\n }\n box→set_margins(0.2, 0.5, 0.2, 0);\n box→set_height_range(3, math→\\u221e\\u208a);\n box→set_horizontal_stretch(1);\n }\n }\n meta sync;\n}\n#inputpassword\naction input_password(label: String, password: Ref[String]) {\n code→labeled_content($label, $content);\n where content() {\n do box {\n box→set_border(colors→foreground, .1);\n box→edit(\"password\", $password→\\u25c8get, $changehandler);\n where changehandler(text: String) {\n $password→\\u25c8set($text);\n }\n box→set_margins(0.2, 0.5, 0.2, 0);\n box→set_horizontal_stretch(1);\n }\n }\n meta sync;\n}\n#inputnumber\naction input_number(label: String, text: Ref[String], changehandler: Number_Action) {\n code→input_text_line_w\\u002f_validator($label, $text, $errorcheck, $changed);\n where errorcheck(s: String) returns (error: String) {\n $x := $s→to_number;\n if $x→is_invalid then {\n $error := \"please enter a valid number.\";\n }\n else {\n $error := \"\";\n }\n }\n where changed(t: String) {\n $changehandler→run($t→to_number);\n }\n meta sync;\n}\n#example\naction example() {\n // This library allows to create form elements such as buttons, text boxes, checkboxes, or drop-down menus.\n // * input a string in a text box (single line)\n code→input_text_line(\"Name\", data→example_name→\\u25c8ref);\n // * input a string in a text box (multiple lines)\n code→input_text_area(\"Comments\", data→example_comments→\\u25c8ref);\n // * input a collection of strings (user can add/remove/edit entries)\n code→input_string_collection(\"email addresses\", data→example_emails);\n // * input a password in a text box (characters are hidden)\n code→input_password(\"Password\", data→example_password→\\u25c8ref);\n // * input a boolean, as a checkbox\n code→checkbox(\"send feedback\", data→example_boolean→\\u25c8ref);\n // * make a button\n code→button(\"Submit\", $tapped);\n where tapped() {\n wall→prompt(\"Submit Button Tapped\");\n }\n // * choose from a dropdown menu\n code→input_choice(\"Transportation\", data→dropdownchoices, data→example_choice→\\u25c8ref);\n meta private;\n meta sync;\n}\n#narrowscreen\naction narrow_screen() returns(b: Boolean) {\n $b := box→page_width < 35;\n meta private;\n meta sync;\n}\n#labeledcontent\naction labeled_content(label: String, content: display_code) {\n // 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 if not $label→is_invalid and not $label→equals(\"\") then {\n do box {\n box→set_horizontal_stretch(1);\n box→set_horizontal_align(\"left\");\n if code→narrow_screen then {\n box→use_vertical_layout;\n box→set_margins(0.35, 0, 0, 0);\n }\n else {\n box→use_horizontal_layout;\n }\n $indent := code→indentation;\n do box {\n $label→post_to_wall;\n $pw := box→page_width;\n box→set_horizontal_stretch($indent / ($pw - .7));\n box→set_horizontal_align(\"right\");\n box→set_margins(0.2, 0, 0.2, 0.5);\n }\n do box {\n if box→page_width < 40 then {\n box→set_width_range(10, box→page_width - $indent);\n box→set_horizontal_stretch(1);\n }\n else {\n box→set_horizontal_stretch(0);\n box→set_width_range(20, box→page_width - $indent);\n }\n do box {\n box→set_padding(0, 0.5, 0, 0.5);\n $content→run;\n }\n }\n }\n }\n else {\n code→normal_content($content);\n }\n meta sync;\n}\n#indentedcontent\naction indented_content(content: display_code) {\n // Display content with the same indentation as other form elements.\n if code→narrow_screen then {\n code→normal_content($content);\n }\n else {\n code→labeled_content(\" \", $content);\n }\n meta sync;\n}\n#normalcontent\naction normal_content(content: display_code) {\n do box {\n if box→page_width < 40 then {\n box→set_width_range(10, box→page_width);\n box→set_horizontal_stretch(1);\n }\n else {\n box→set_horizontal_stretch(0);\n box→set_width_range(20, box→page_width);\n }\n do box {\n box→set_padding(0, 0.5, 0, 0.5);\n $content→run;\n }\n }\n meta private;\n meta sync;\n}\n#w4wvvOyYMGH8M1GFkNzq9U37\naction `type` display_code() {\n skip;\n meta sync;\n}\n#JFIbi283vQ4hKSeSDgSFD1mR\naction input_choice(label: String, choices: String_Collection, index: Ref[Number]) {\n // Input a choice from a dropdown menu.\n code→labeled_content($label, $content);\n where content() {\n $current := \"\";\n if not $index→\\u25c8get→is_invalid and $index→\\u25c8get ≥ 0 and $index→\\u25c8get < $choices→count then {\n $current := $choices→at($index→\\u25c8get);\n }\n if $current→is_invalid or $current→equals(\"\") then {\n $current := \" \";\n }\n do box {\n box→set_margins(0.2, 0.5, 0.2, 0.5);\n box→set_padding(0.3, 1, 0.3, 1);\n box→set_border(colors→foreground, 0.1);\n box→on_tapped($handler);\n where handler() {\n $x := wall→pick_string($label, \"\", $choices);\n if $x ≥ 0 then {\n $index→\\u25c8set($x);\n }\n }\n do box {\n box→set_horizontal_align(\"center\");\n $current→post_to_wall;\n }\n }\n }\n meta sync;\n}\n#Mb4wOugItC8WuhV4FzURCsdU\nvar dropdownchoices : String_Collection {\n transient = true;\n}\n#CwT0X1vsa9H4HZJxEErdw2z6\nvar example_choice : Number {\n transient = true;\n}\n#oWu4bWFVWgG65r4Hrh69VnB3\naction input_text_line_w\\u002f_validator(label: String, text: Ref[String], errorcheck: validator, changehandler: Text_Action) {\n code→labeled_content($label, $content);\n where content() {\n do box {\n $error := $errorcheck→run($text→\\u25c8get);\n do box {\n box→set_border(colors→foreground, .1);\n box→edit(\"textline\", $text→\\u25c8get, $changed);\n where changed(t: String) {\n $text→\\u25c8set($t);\n if $errorcheck→run($t)→is_empty then {\n $changehandler→run($t);\n }\n }\n box→set_margins(0.2, 0.5, 0.2, 0);\n box→set_horizontal_stretch(1);\n }\n if not $error→is_empty then {\n box→set_foreground(colors→red);\n (\"⇧ \" ∥ $error)→post_to_wall;\n }\n }\n }\n meta sync;\n}\n#XPzkmnAHw2YfZd8ERHYp0i1a\naction `type` validator(s: String) returns(error: String) {\n 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",
"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",
"qetpa": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank app\";\nmeta icon \"AddressBook\";\nmeta rootId \"xPVLZKRfDmGiasdkBt2RaNR4\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n#theme meta import theme {\n pub \"gnvi\"\n usage {\n action `async` title_1()\n action `async` title_2()\n action `async` title_3()\n action `async` subtle()\n action `async` normal()\n action `sync` example()\n action `async` accent()\n action `async` set_right_aligned(value: Boolean)\n action `async` huge()\n }\n}\n#main\naction main(\\u2756: * main_page_data) {\n if box→is_init then {\n skip;\n }\n if true then {\n skip;\n }\n meta page;\n meta sync;\n}\n#BbWFpbiBwYWdlIGRhdGEa\ntable main_page_data {\n type = \"Object\";\n persistent = false;\n}\n#YZGaVg1jhqq9sfncCGsIoHbh meta import forms {\n pub \"owroa\"\n usage {\n action `sync` `type` display_code()\n action `sync` `type` validator(s: String) returns(error: String)\n action `sync` button(text: String, on_tapped: Action)\n action `sync` checkbox(text: String, checked: Ref[Boolean])\n action `sync` input_string_collection(label: String, strings: String_Collection)\n action `sync` input_text_line(label: String, text: Ref[String])\n action `sync` input_text_area(label: String, text: Ref[String])\n action `sync` input_password(label: String, password: Ref[String])\n action `sync` input_number(label: String, text: Ref[String], changehandler: Number_Action)\n action `sync` labeled_content(label: String, content: ♻ forms → display_code)\n action `sync` indented_content(content: ♻ forms → display_code)\n action `sync` input_choice(label: String, choices: String_Collection, index: Ref[Number])\n action `sync` input_text_line_w\\u002f_validator(label: String, text: Ref[String], errorcheck: ♻ forms → validator, changehandler: Text_Action)\n }\n}\n#LHF2iIBnkOQcwhcoQKFiR4A2 meta import widgets {\n pub \"abgjb\"\n usage {\n action `sync` message(user: User, dt: DateTime, text: String)\n action `sync` picture(url: String)\n }\n}\n#iDxzKDq4042OKy7IX4V4D91F meta import layout {\n pub \"cwgn\"\n usage {\n action `sync` stretch_and_center()\n action `async` grid_of_squares(cell_content: Number_Action, count: Number, grid_width: Number, grid_height: Number)\n action `async` horizontal_hub_of_squares(cell_content: Number_Action, count: Number, cell_size: Number, group_width: Number, total_height: Number)\n action `async` vertical_hub_of_squares(cell_content: Number_Action, count: Number, cell_size: Number, total_width: Number, group_height: Number)\n }\n}\n",
"sduub": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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 #ecGxOhCF2WkgYkcB code→splash_text(\"Bonus round!!\", 1, colors→random, colors→random, $done);\n #bNYLbQktHZxfvVWO where done() {\n #ZTSBMLGC09ze9KUe skip;\n }\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 : String_Collection {\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 #ixtnMJPUsyivodZ2 app→restart(\"\");\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 @action: Action) {\n #hs2S4pK5luKS7Yx7 // Attach code to run when the game ends. Overrides the default behavior.\n #AYzAMJdPbb22r3I4 data→\\_end_event := $@action;\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#a7BJpaIAFIQXxK4dh0p7dx24\naction splash_text(#zkkfu4GlLCP2VpR4 message: String, #UhC6GSzz7YIGr7om seconds: Number, #cob5g2NL5WPFJERB foreground: Color, #oE7eANpx6Js6Yy74 background: Color, #CkRu2opZg12ei2aI done: Action) {\n #M0y7c0URhyJonPa7 // Shows a full screen splash message and goes away. Does not block the game loop.\n #GCpZHAzwGv9a96uR // {hints:message:Get Ready!}\n #P4tH0Ut3u2WfkwCG if $seconds < 0.5 then {\n #xCvwguc2te1lLKE4 $seconds := 0.5;\n }\n #gQ2Dt0rq2efvvH49 $back := data→\\_board→create_rectangle(data→\\_board→width, data→\\_board→height);\n #v2gaLx1i4woeKuTv $back→set_color($background);\n #b7dLaPuBaGV7q9Ji $back→set_z_index(1000);\n #YQehWIY2hzAQ2BRj $text := data→\\_board→create_text(data→\\_board→width, 2, 60, $message);\n #z8IJzlBH3NbG5yCh $text→fit_text;\n #uY628hbLD2rnNEiK while $text→width > data→\\_board→width * 0.8 do {\n #rayekD9V5rz4rOzc $text→set_font_size($text→font_size * 0.8);\n #o4KBW2LCw0e1f7WV $text→fit_text;\n }\n #Da9p2BcmQVywBdiG $text→set_color($foreground);\n #ynExTRQQwAvh8hrH $text→set_z_index(1000);\n #mZ1swRJ8KSspXDPA $text_anim := $text→create_animation;\n #sgvsL0eJTKOVKend $text_anim→sleep($seconds);\n #x4Um8LUQYZu74SCo $text_anim→puff_out(0.9, \"cubic\", 1.5);\n #xkjPwiZ0JHuWWu8w $text_anim→delete;\n #QFgsQgBaf4E9eHpD $anim2 := $back→create_animation;\n #lz8Wv4BjDYWWy4PF $anim2→sleep($seconds + 0.7);\n #A6qQu0ahu46t3ECd $anim2→fade_out(0.2, \"cubic\");\n #xkTvtdr2OOieq3m4 $anim2→delete;\n #xby5BLlMaNeEXolS $anim2→on_stop($handler);\n #imcBHmey6h97z8ZZ where handler() {\n #Pn3eKA236i2cd8jR $done→run;\n }\n #IgDWv2ICGGG1fy5T `async` $anim2→wait;\n}\n#dztvp9VA3SKJ2iQhwHi5hOJt\naction test_show_splash() {\n #CdHT5UbOtPNVdpc7 $board := code→start_landscape;\n #FR5BPIwE2h4GLwu0 $board→set_background(colors→random);\n #nJjfk952pY1q4N14 code→splash_text(\"hello wooooooooooooooooooooooorld!\", 1, colors→white, colors→random, $done);\n #pzDNwpKV7UErnreC where done() {\n #SMMW4HxliR2ivls2 code→set_hud_colors(colors→random, colors→random, colors→random);\n #xp9OOz6xZ9cpRJQj code→start_countdown_timer(10);\n #xLR35Dz2Z0dhsZ8s $board→add_on_every_frame($perform);\n #xP1kW44KZzPyGIci where perform() {\n #x0Gtlxg8b5SJMONk code→add_score(1);\n #xT2K3e9qh4XJXL2H code→add_life(1);\n }\n }\n meta private;\n meta test;\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",
"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",
"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",
"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",
"vozrb": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\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 #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\", \"<html><body>Yay!</body></html>\");\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",
"wonx": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"blank tutorial\";\nmeta icon \"Erase\";\nmeta rootId \"H4TKg7Y9ZIPwaE5mv9KlRcjO\";\nmeta allowExport \"yes\";\nmeta platform \"current\";\n// TODO: the description of the tutorial. #docs #tutorials #stepByStep\n#main\naction main() {\n // {template:empty}\n // {templatename:ADJ app}\n // TODO This is the initial screen of the tutorial. Change this description and the template name.\n}\n#wWW6zPLClAxV8Yi341qmQqil\naction \\u00230_main() {\n // This is a tutorial step description which should be followed by the code.\n // TODO change the steps to create your tutorial\n // Learn more about the [Markdown syntax](/markdown) and [interactive tutorials](/creatinginteractivetutorials).\n // {stcode}\n \"Hello\" →post_to_wall;\n // {stcmd:run:this is how you run the code}\n // You can add many steps\n // {stcode}\n for 0 ≤ i < 4 do {\n // The steps are split using a depth-first-search strategy.\n \"Hello Again\" →post_to_wall;\n // {stcmd:run:this is how you run the code}\n }\n}\n",
"yuipc": "meta version \"v2.2,js,ctx,refs,localcloud,unicodemodel,allasync\";\nmeta name \"games\";\nmeta rootId \"E1ax9Kdm157CJfSoj2AswUkU\";\nmeta hasIds \"yes\";\nmeta platform \"current\";\nmeta parentIds \"\";\n// Resources on creating games. #docs #games\n#main\naction main() {\n #vpkj0TkCofaguObf // {parentTopic:contents}\n #eKKtA5noHZreltaN // TouchDevelop provides a simple and powerful environment to create engaging mobile games. In this section you can learn more about the game board engine, techniques for animating sprites, and more.\n #h0a0jh2pr6pw2VK0 // * [game board](/gameboard), a 2D game engine\n #MJmuIsFH4wopVnNA // * [sprite sheet](/spritesheet), manage sprite sheets and animations\n #taMaw2T4exuyggQm // * [sprite animation](/spriteanimation), fade in, fade out, scale, move using smooth transitions\n #jiq0SBl002XrFebR // * [parallax backgrounds](/parallaxbackgrounds), create depth effects with background scrolling\n #t0tKdQPBLcBVBH4G // * [](/leaderboards), online high scores\n #MLCuAd6azDerRM5A // * [gamepad](/gamepad), a library to control a game from keyboard, mouse, touch or actual gamepads.\n}\n"
}, [
{"name":"App javascript","id":"ryoka","rootid":"ryoka","userid":"jeiv","description":"#docs #AppJavascript","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1407457015,"priority":10000},
{"name":"App javascript async","id":"qjef","rootid":"qjef","userid":"jeiv","description":"#docs #AppJavascriptAsync","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1407956733,"priority":10000},
{"name":"Bazaar ast of","id":"uplz","rootid":"emol","userid":"jeiv","description":"#docs #BazaarAstOf","iconbackground":"#A1CAF1","icon":"Farm","iconArtId":null,"splashArtId":null,"time":1370371413,"priority":10000},
{"name":"Bazaar pick script","id":"dusea","rootid":"dusea","userid":"jeiv","description":"#docs #BazaarPickScript","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1370371241,"priority":10000},
{"name":"Bazaar save ast","id":"zsir","rootid":"zsir","userid":"jeiv","description":"#docs #BazaarSaveAst","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1370371622,"priority":10000},
{"name":"Bazaar script id","id":"aufr","rootid":"aufr","userid":"jeiv","description":"#docs #BazaarScriptId","iconbackground":"#A1CAF1","icon":"Farm","iconArtId":null,"splashArtId":null,"time":1365552101,"priority":10000},
{"name":"Bluetooth","id":"puyd","rootid":"ozpm","userid":"jeiv","description":"Program your paired Bluetooth devices from TouchDevelop. #docs #sensesbluetoothdevices #bluetoothdevice","iconbackground":"#00008B","icon":"Bolt","iconArtId":null,"splashArtId":null,"time":1384928481,"priority":10000,"platforms":["bluetooth"]},
{"name":"Board","id":"rnxb","rootid":"rnxb","userid":"jeiv","description":"#docs #Board","iconbackground":"#7D26CD","icon":"FormatText","iconArtId":null,"splashArtId":null,"time":1375488962,"priority":10000},
{"name":"Board Background Layer","id":"cnihb","rootid":"cnihb","userid":"jeiv","description":"#docs #BoardBackgroundLayer","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1392650435,"priority":10000},
{"name":"Board Background Scene","id":"irkl","rootid":"irkl","userid":"jeiv","description":"#docs #BoardBackgroundScene","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1392650403,"priority":10000},
{"name":"Boolean","id":"dcqpa","rootid":"vtpz","userid":"jeiv","description":"A value that can be true or false. #docs #boolean","iconbackground":"#DAA520","icon":"CheckBox","iconArtId":null,"splashArtId":null,"time":1412689681,"priority":10000,"parentTopic":"language"},
{"name":"Box","id":"pcggb","rootid":"pcggb","userid":"jeiv","description":"#docs #Box","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1375488107,"priority":10000},
{"name":"Box edit","id":"qlpm","rootid":"qlpm","userid":"jeiv","description":"#docs #BoxEdit","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1375489882,"priority":10000},
{"name":"Build Your First App","id":"tumw","rootid":"bybk","userid":"jeiv","description":"The page links to the tutorial of the \"Build Your First App\" course 70307AE #docs","iconbackground":"#E3256B","icon":"Book","iconArtId":null,"splashArtId":null,"time":1395897414,"priority":10000,"parentTopic":"tutorials"},
{"name":"Build Your First App Educator Notes","id":"bbrcb","rootid":"gjvv","userid":"jeiv","description":"Educator notes for the \"Build Your First App\" course #70307AE #docs","iconbackground":"#E3256B","icon":"Book","iconArtId":null,"splashArtId":null,"time":1412701918,"priority":10000,"parentTopic":"buildyourfirstapp"},
{"name":"Build Your First App: Build a Physics Game With Sprites","id":"qlwr","rootid":"bzpm","userid":"jeiv","description":"Build Your First App Module 4 Tutorial 1: Create a Basic Physics Game #docs #tutorials #ITAcademy #70307AE #m4t1","iconbackground":"#E3256B","icon":"Book","iconArtId":null,"splashArtId":null,"time":1416422687,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/oeluiclq","parentTopic":"buildyourfirstapp"},
{"name":"Build Your First App: Define And Modify Variables","id":"zpwza","rootid":"altu","userid":"jeiv","description":"Build Your First App Module 3 Tutorial 3: Declare and Implement a Variable. #docs #ITAcademy #tutorials #70307AE #m3t3","iconbackground":"#E3256B","icon":"Reading","iconArtId":null,"splashArtId":null,"time":1415343997,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/rxzqbpyt","parentTopic":"buildyourfirstapp"},
{"name":"Build Your First App: Implement Conditional Statements","id":"lxwba","rootid":"altu","userid":"jeiv","description":"Build Your First App Module 3 Tutorial 4: Implement Conditional Statements. #docs #ITAcademy #tutorials #70307AE #m3t4","iconbackground":"#E3256B","icon":"Reading","iconArtId":null,"splashArtId":null,"time":1415344492,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/ujazpuvn","parentTopic":"buildyourfirstapp"},
{"name":"Build Your First App: Implement Script Loops","id":"ohjr","rootid":"altu","userid":"jeiv","description":"Build Your First App Module 3 Tutorial 2: Implement Script Loops. #docs #ITAcademy #tutorials #70307AE #m3t2","iconbackground":"#E3256B","icon":"Reading","iconArtId":null,"splashArtId":null,"time":1415343262,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/aagvyvhj","parentTopic":"buildyourfirstapp"},
{"name":"Build Your First App: Organize Sprites with a Sprite Set","id":"tlboa","rootid":"lekzuvii","userid":"jeiv","description":"Build Your First App Module 4 Tutorial 3: Use Sprite Sets #docs #tutorials #ITAcademy #70307AE #m4t3","iconbackground":"#E3256B","icon":"Book","iconArtId":null,"splashArtId":null,"time":1416422670,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hakgtzve","parentTopic":"buildyourfirstapp"},
{"name":"Build Your First App: Understand Code Execution","id":"imapb","rootid":"altu","userid":"jeiv","description":"Build Your First App Module 3 Tutorial 1: Understand Code Execution. #docs #ITAcademy #tutorials #70307AE #m3t1","iconbackground":"#E3256B","icon":"Reading","iconArtId":null,"splashArtId":null,"time":1415343817,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/sfvfhawf","parentTopic":"buildyourfirstapp"},
{"name":"Build Your First App: Understand Touch Input","id":"olst","rootid":"bzpm","userid":"jeiv","description":"Build Your First App Module 4 Tutorial 2: Understand Touch Input #docs #tutorials #ITAcademy #70307AE #m4t2","iconbackground":"#E3256B","icon":"Book","iconArtId":null,"splashArtId":null,"time":1416422702,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/oeluiclq","parentTopic":"buildyourfirstapp"},
{"name":"Build Your First App: Use the Accelerometer","id":"hkscb","rootid":"bzpm","userid":"jeiv","description":"Build Your First App Module 4 Tutorial 4: Use the Accelerometer #docs #tutorials #ITAcademy #70307AE #m4t4","iconbackground":"#E3256B","icon":"Book","iconArtId":null,"splashArtId":null,"time":1416422648,"priority":10000,"platforms":["accelerometer","musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/oeluiclq","parentTopic":"buildyourfirstapp"},
{"name":"CORS","id":"udrp","rootid":"vufba","userid":"jeiv","description":"Web requests in TouchDevelop may be subject of \"Cross-origin resource sharing\" rules in your browser #docs","iconbackground":"#FF0038","icon":"Bolt","iconArtId":null,"splashArtId":null,"time":1376085418,"priority":10000},
{"name":"Camera","id":"kdzf","rootid":"kdzf","userid":"jeiv","description":"#docs #Camera","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1395425046,"priority":10000,"platforms":["camera"]},
{"name":"Cloud Data","id":"lrfb","rootid":"lrfb","userid":"jeiv","description":"#docs #CloudData","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1377037638,"priority":10000},
{"name":"Cloud Session","id":"olkga","rootid":"olkga","userid":"jeiv","description":"#docs #CloudSession","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1377037634,"priority":10000},
{"name":"Coding Jetpack Jumper!","id":"czzj","rootid":"asxkrtvt","userid":"lxxx","description":"Get introduced to coding by fixing a broken game, then share it with your friends! #docs #tutorials #HourOfCode #stepByStep","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1417650517,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/jbdmnvvc"},
{"name":"Customize Jetpack Jumper","id":"knmo","rootid":"vgke","userid":"lxxx","description":"#docs","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1417826233,"priority":10000},
{"name":"Gamepad","id":"vnapa","rootid":"sjbp","userid":"jeiv","description":"#docs #Gamepad","iconbackground":"#7D26CD","icon":"controller","iconArtId":null,"splashArtId":null,"time":1412688041,"priority":10000,"platforms":["accelerometer"],"parentTopic":"games"},
{"name":"Location","id":"ljhc","rootid":"tfiea","userid":"jeiv","description":"#docs #Location","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1395425058,"priority":10000,"platforms":["location","maps"]},
{"name":"Number","id":"lrmt","rootid":"emeb","userid":"jeiv","description":"#docs #Number","iconbackground":"#7D26CD","icon":"123","iconArtId":null,"splashArtId":null,"time":1412690120,"priority":10000,"parentTopic":"language"},
{"name":"Ref","id":"avdba","rootid":"ifzr","userid":"jeiv","description":"#docs #Ref","iconbackground":"#7D26CD","icon":"Package","iconArtId":null,"splashArtId":null,"time":1412689392,"priority":10000,"parentTopic":"language"},
{"name":"Sprite Animation","id":"nucbb","rootid":"skpl","userid":"jeiv","description":"How to animate properties of sprites. #docs #games","iconbackground":"#008080","icon":"AlmostEqual","iconArtId":null,"splashArtId":null,"time":1412687064,"priority":10000,"parentTopic":"games"},
{"name":"Sprite Sheet","id":"wmkva","rootid":"skpl","userid":"jeiv","description":"#docs #SpriteSheet","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1412687028,"priority":10000,"parentTopic":"games"},
{"name":"String","id":"tioib","rootid":"tioib","userid":"jeiv","description":"#docs #String","iconbackground":"#7D26CD","icon":"ABC","iconArtId":null,"splashArtId":null,"time":1412690443,"priority":10000,"parentTopic":"language"},
{"name":"String split","id":"fldx","rootid":"ekrf","userid":"jeiv","description":"Basic examples of string splitting. #docs #StringSplit","iconbackground":"#800080","icon":"ABC","iconArtId":null,"splashArtId":null,"time":1364933442,"priority":10000},
{"name":"TODO","id":"nldr","rootid":"nldr","userid":"jeiv","description":"A brief explanation about the TODO #docs #todo","iconbackground":"#9955BB","icon":"Person","iconArtId":null,"splashArtId":null,"time":1367469361,"priority":10000},
{"name":"Tags nfc receive","id":"tvdca","rootid":"mmlya","userid":"jeiv","description":"#docs #TagsNfcReceive","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1380818016,"priority":10000,"platforms":["proximity"]},
{"name":"Tags nfc send","id":"dfxzb","rootid":"dfxzb","userid":"jeiv","description":"#docs #TagsNfcSend","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1380818121,"priority":10000,"platforms":["proximity"]},
{"name":"Tags nfc write tag","id":"yfik","rootid":"yfik","userid":"jeiv","description":"#docs #TagsNfcWriteTag","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1380818265,"priority":10000,"platforms":["proximity"]},
{"name":"TextBox","id":"xjgpb","rootid":"xjgpb","userid":"jeiv","description":"#docs #TextBox","iconbackground":"#7D26CD","icon":"Document","iconArtId":null,"splashArtId":null,"time":1375489993,"priority":10000},
{"name":"Tiles pin picture","id":"fosr","rootid":"fosr","userid":"jeiv","description":"#docs #TilesPinPicture","iconbackground":"#EEDC82","icon":"WritePage","iconArtId":null,"splashArtId":null,"time":1378502819,"priority":10000,"platforms":["tiles"]},
{"name":"Tiles pin pictures","id":"afnnc","rootid":"afnnc","userid":"jeiv","description":"#docs #TilesPinPictures","iconbackground":"#EEDC82","icon":"WritePage","iconArtId":null,"splashArtId":null,"time":1378499463,"priority":10000,"platforms":["tiles"]},
{"name":"WebAppBooster","id":"xhnw","rootid":"hasy","userid":"jeiv","description":"WebAppBooster is a free Android app you can download from Google's Play Store. It gives the TouchDevelop Web App access to the sensors and data of your Android phone or tablet. #docs","iconbackground":"#00008B","icon":"Dashboard","iconArtId":null,"splashArtId":null,"time":1413906585,"priority":10000},
{"name":"Welcome to the community blog!","id":"azyzc","rootid":"szcl","userid":"ajlk","description":"Welcome to the TouchDevelop community blog! #docs #blog","iconbackground":"#9955BB","icon":"SoundLow","iconArtId":"zlyvwtcm","splashArtId":null,"time":1422659306,"priority":10000,"parentTopic":"blog"},
{"name":"YouthSpark CodeIT!","id":"widw","rootid":"arzja","userid":"jeiv","description":"YouthSpark CodeIT! activities. #docs","iconbackground":"#008080","icon":"ShoppingBag","iconArtId":null,"splashArtId":null,"time":1404230161,"priority":10000},
{"name":"accelero colors tutorial","id":"dwyva","rootid":"dwyva","userid":"jeiv","description":"A fun tutorial that maps the acceleration sensor data to a background color. #docs #tutorials #stepbystep","iconbackground":"#00008B","icon":"AlignCenter","iconArtId":null,"splashArtId":null,"time":1383558568,"priority":10000,"platforms":["accelerometer"]},
{"name":"accelero-turtle","id":"ojmka","rootid":"yrcna","userid":"jeiv","description":"Using the accelerometer to move the turtle. #docs #turtle #accelerometer #stepbystep #tutorials","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1418020991,"priority":10000,"platforms":["accelerometer"]},
{"name":"accelerometer","id":"hsmma","rootid":"yrcna","userid":"jeiv","description":"What is the accelerometer? #docs #accelerometer","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1384241198,"priority":10000,"platforms":["accelerometer"]},
{"name":"account settings","id":"mgyv","rootid":"tisz","userid":"jeiv","description":"Your account settings. #docs","iconbackground":"#E25822","icon":"Setting","iconArtId":null,"splashArtId":null,"time":1420746319,"priority":10000,"parentTopic":"socialcoding"},
{"name":"action parameters","id":"fmnma","rootid":"qlyt","userid":"jeiv","description":"Parameters are used to pass information in and out of an action. #docs #actionParameters #language","iconbackground":"#008080","icon":"Funnel","iconArtId":null,"splashArtId":null,"time":1412946700,"priority":10000,"parentTopic":"code"},
{"name":"action types","id":"gbkca","rootid":"gahi","userid":"jeiv","description":"User-defined action types #docs #language","iconbackground":"#800080","icon":"Bolt","iconArtId":null,"splashArtId":null,"time":1412689293,"priority":10000,"parentTopic":"language"},
{"name":"add your own docs","id":"wnhuc","rootid":"opsc","userid":"jeiv","description":"How to create and publish documentations or tutorials. #docs #contents","iconbackground":"#A52A2A","icon":"Document","iconArtId":null,"splashArtId":null,"time":1412947639,"priority":10000,"parentTopic":"socialcoding"},
{"name":"ads","id":"izwjc","rootid":"riqra","userid":"jeiv","description":"Monetize scripts with advertisements. #docs #ads","iconbackground":"#85BB65","icon":"Sun","iconArtId":null,"splashArtId":null,"time":1419259917,"priority":10000,"parentTopic":"exporttoapp"},
{"name":"advanced topics","id":"awyse","rootid":"tgge","userid":"jeiv","description":"Documentation. #docs #content","iconbackground":"#66FF00","icon":"Capitalize","iconArtId":null,"splashArtId":null,"time":1412701839,"priority":18,"parentTopic":"contents"},
{"name":"algorithm tutorials","id":"nkrwa","rootid":"nkrwa","userid":"jeiv","description":"A set of interactive tutorials to learn about algorithms. #docs #tutorials","iconbackground":"#F5DEB3","icon":"Leaf","iconArtId":null,"splashArtId":null,"time":1395684884,"priority":10000,"parentTopic":"tutorials"},
{"name":"allow export to app","id":"pwzka","rootid":"vdjx","userid":"jeiv","description":"Allow users to export your apps. #docs #exportToApp #allowExportToApp","iconbackground":"#00008B","icon":"CheckAlt","iconArtId":null,"splashArtId":null,"time":1412792004,"priority":10000,"parentTopic":"exporttoapp"},
{"name":"amazing event","id":"rvkrb","rootid":"rvkrb","userid":"wonm","description":"A nice event. #blog","iconbackground":"#FFA500","icon":"SmilieSad","iconArtId":null,"splashArtId":null,"time":1422663258,"priority":10000},
{"name":"api","id":"abtwc","rootid":"fxeza","userid":"jeiv","description":"API reference. #docs #api","iconbackground":"#FF0038","icon":"Subtract","iconArtId":null,"splashArtId":null,"time":1415064399,"priority":10,"parentTopic":"contents"},
{"name":"app day","id":"vvhca","rootid":"pbychgeq","userid":"jeiv","description":"An fun event to learn how to create apps #docs","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412946727,"priority":10000,"parentTopic":"teach"},
{"name":"app day bird","id":"eqtwc","rootid":"silub","userid":"jeiv","description":"An App Day game activity. #docs #stepByStep #AppDay","iconbackground":"#007FFF","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1400654309,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hjovmckd"},
{"name":"app day device setup","id":"vrlge","rootid":"dhpu","userid":"jeiv","description":"Instructions to setup a device for App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1415064986,"priority":10000,"parentTopic":"appday"},
{"name":"app day faq","id":"tjmk","rootid":"tidc","userid":"jeiv","description":"Frequently asked questions about App Day. #docs #appday","iconbackground":"#007FFF","icon":"PlusCircle","iconArtId":null,"splashArtId":null,"time":1384241732,"priority":10000},
{"name":"app day large","id":"lpcla","rootid":"ihasxqnf","userid":"jeiv","description":"Description of a large App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412703502,"priority":10000,"parentTopic":"appday"},
{"name":"app day large logistics","id":"iwgea","rootid":"kfcnzcfq","userid":"jeiv","description":"Timeline and logistics to run a large App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412703520,"priority":10000,"parentTopic":"appdaylarge"},
{"name":"app day large schedule","id":"cbdz","rootid":"uwjeaiqw","userid":"jeiv","description":"The schedule of a large App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412703529,"priority":10000,"parentTopic":"appdaylarge"},
{"name":"app day medium","id":"pgzra","rootid":"ihasxqnf","userid":"jeiv","description":"Description of a medium App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412703371,"priority":10000,"parentTopic":"appday"},
{"name":"app day medium logistics","id":"qhjja","rootid":"kfcnzcfq","userid":"jeiv","description":"Description of the logistics involved with medium App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412703468,"priority":10000,"parentTopic":"appdaymedium"},
{"name":"app day medium schedule","id":"yxpqb","rootid":"uwjeaiqw","userid":"jeiv","description":"The schedule of a medium App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412703486,"priority":10000,"parentTopic":"appdaymedium"},
{"name":"app day rocks","id":"sbwi","rootid":"cxwjqvmo","userid":"jeiv","description":"An App Day game activity #docs #AppDay","iconbackground":"#007FFF","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1400655333,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/czyykuaj"},
{"name":"app day rules","id":"oqfna","rootid":"koveoafl","userid":"jeiv","description":"Overview of the rules to run App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1379016640,"priority":10000},
{"name":"app day small","id":"cebw","rootid":"ihasxqnf","userid":"jeiv","description":"Description of a small App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412703424,"priority":10000,"parentTopic":"appday"},
{"name":"app day small logistics","id":"ctfvb","rootid":"kfcnzcfq","userid":"jeiv","description":"Description of the logistics involved with App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412703412,"priority":10000,"parentTopic":"appdaysmall"},
{"name":"app day small schedule","id":"ayrnd","rootid":"uwjeaiqw","userid":"jeiv","description":"The schedule of a small App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1415077874,"priority":10000,"parentTopic":"appdaysmall"},
{"name":"app day stop","id":"soxy","rootid":"quwi","userid":"jeiv","description":"Page used to separate workshops in App Day. #docs","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1379016679,"priority":10000},
{"name":"app day workshops","id":"ldks","rootid":"ctsigkri","userid":"jeiv","description":"Description of the workshops used in App Day #docs #appday","iconbackground":"#9955BB","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412703394,"priority":10000,"parentTopic":"appday"},
{"name":"app tutorial template","id":"uutp","rootid":"lazr","userid":"jeiv","description":"A tutorial. #docs #tutorials #stepbystep","iconbackground":"#90EE90","icon":"SMS","iconArtId":null,"splashArtId":null,"time":1395865795,"priority":10000},
{"name":"arduino blink no delay tutorial","id":"cneva","rootid":"aewdb","userid":"jeiv","description":"A tutorial to build an Arduino Blinking circuit without using delay. #arduino #arduinoSketch #docs #tutorials #stepByStep","iconbackground":"#00CC99","icon":"ArrowStandardCircle","iconArtId":null,"splashArtId":null,"time":1422935317,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/ilohpnvs"},
{"name":"arduino blink tutorial","id":"ujgx","rootid":"aewdb","userid":"jeiv","description":"A tutorial to build an Arduino Blinking circuit. #arduino #arduinoSketch #docs #tutorials #stepByStep","iconbackground":"#00CC99","icon":"ArrowStandardCircle","iconArtId":null,"splashArtId":null,"time":1422935126,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/ilohpnvs"},
{"name":"arduino morse tutorial","id":"egwr","rootid":"aewdb","userid":"jeiv","description":"A tutorial to build an Arduino circuit that sends a SOS message using a LED. #arduino #arduinoSketch #docs #tutorials #stepByStep","iconbackground":"#00CC99","icon":"ArrowStandardCircle","iconArtId":null,"splashArtId":null,"time":1422935347,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/ilohpnvs"},
{"name":"arduino photo cell tutorial","id":"upgxa","rootid":"aewdb","userid":"jeiv","description":"A tutorial to use a photo cell sensor. #arduino #arduinoSketch #docs #tutorials #stepByStep","iconbackground":"#00CC99","icon":"ArrowStandardCircle","iconArtId":"kzajxznr","splashArtId":null,"time":1422935270,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/ilohpnvs"},
{"name":"arduino sos tutorial","id":"udzya","rootid":"aewdb","userid":"jeiv","description":"A tutorial to build an Arduino circuit that sends a SOS message using a LED. #arduino #arduinoSketch #docs #tutorials #stepByStep","iconbackground":"#00CC99","icon":"ArrowStandardCircle","iconArtId":null,"splashArtId":null,"time":1422935296,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/ilohpnvs"},
{"name":"arduino tutorials","id":"frdb","rootid":"hvuu","userid":"jeiv","description":"Arduino tutorials. #docs","iconbackground":"#00CC99","icon":"ArrowCircleRounded","iconArtId":null,"splashArtId":null,"time":1421775560,"priority":10000,"parentTopic":"tutorials"},
{"name":"art","id":"uyht","rootid":"ymbla","userid":"jeiv","description":"A guide to using resources such as pictures and sounds. #docs #art #games #language","iconbackground":"#B7410E","icon":"Clover","iconArtId":null,"splashArtId":null,"time":1418713137,"priority":10000,"parentTopic":"language"},
{"name":"assignment","id":"zsas","rootid":"mcsz","userid":"jeiv","description":"Update local and global variables. #docs #assignment #langauge","iconbackground":"#85BB65","icon":"AlmostEqual","iconArtId":null,"splashArtId":null,"time":1415077825,"priority":10000,"parentTopic":"operators"},
{"name":"async actions","id":"estfa","rootid":"hhica","userid":"jeiv","description":"Asynchronous (async) actions and await API #docs #language #async. Also foreground/background tasks, atomic/non-atomic APIs, and atomicity of page display/init sections.","iconbackground":"#FF0038","icon":"Clock","iconArtId":null,"splashArtId":null,"time":1412666626,"priority":10000,"platforms":["accelerometer","musicandsounds"],"parentTopic":"language"},
{"name":"azure services","id":"kelo","rootid":"oolz","userid":"jeiv","description":"Available Azure Services #docs.","iconbackground":"#007FFF","icon":"Stacks","iconArtId":null,"splashArtId":null,"time":1410093706,"priority":10000},
{"name":"bear","id":"haaza","rootid":"vxyfa","userid":"jeiv","description":"A library to create educational maze games.#board #games","iconbackground":"#9955BB","icon":"controller","iconArtId":null,"splashArtId":null,"time":1412717735,"priority":10000,"platforms":["musicandsounds"]},
{"name":"bear forest","id":"vsso","rootid":"yhed","userid":"jeiv","description":"","iconbackground":"#00CC99","icon":"Butterfly","iconArtId":null,"splashArtId":null,"time":1412717740,"priority":10000},
{"name":"bear quest tutorial","id":"xgbv","rootid":"jyyja","userid":"jeiv","description":"An interactive tutorial to learn coding. #docs #tutorials #stepByStep #HourOfCode #tutorial","iconbackground":"#85BB65","icon":"Award","iconArtId":null,"splashArtId":null,"time":1416508747,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/kvkgnoql"},
{"name":"beginner tutorials","id":"blnna","rootid":"ofmd","userid":"jeiv","description":"A set of interactive tutorials for users new to programming. #docs #tutorials","iconbackground":"#FF2800","icon":"Film","iconArtId":null,"splashArtId":null,"time":1414697971,"priority":10000,"parentTopic":"tutorials"},
{"name":"beta","id":"hptw","rootid":"oejn","userid":"jeiv","description":"Stay on the bleeding edge! #docs","iconbackground":"#85BB65","icon":"Play","iconArtId":null,"splashArtId":null,"time":1371667518,"priority":10000},
{"name":"beyond an hour","id":"szud","rootid":"nefs","userid":"jeiv","description":"#docs Expand your TouchDevelop skills with these resources!","iconbackground":"#A1CAF1","icon":"Airplane","iconArtId":null,"splashArtId":null,"time":1412946816,"priority":10000,"parentTopic":"teach"},
{"name":"blank cloud app template","id":"rmor","rootid":"qaub","userid":"jeiv","description":"An empty template to create apps using pages and cloud data.","iconbackground":"#FFA500","icon":"FourColumn","iconArtId":null,"splashArtId":null,"time":1399008793,"priority":10000},
{"name":"blank esplora","id":"lsrh","rootid":"quil","userid":"jeiv","description":"An script that gets exported to the Arduino #Esplora board.","iconbackground":"#008000","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1400134489,"priority":10000},
{"name":"blank game tutorial template","id":"ybxma","rootid":"ahcpb","userid":"jeiv","description":"","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1412291788,"priority":10000},
{"name":"blank makey makey","id":"wvzm","rootid":"wvzm","userid":"jeiv","description":"A script using #MakeyMakey.","iconbackground":"#85BB65","icon":"Controls","iconArtId":null,"splashArtId":null,"time":1394195518,"priority":10000},
{"name":"blank pixel art","id":"mdrw","rootid":"mdrw","userid":"jeiv","description":"A pixel art script. #pixelart","iconbackground":"#9955BB","icon":"NineColumn","iconArtId":null,"splashArtId":null,"time":1412097278,"priority":10000,"platforms":["musicandsounds"]},
{"name":"blank scratch","id":"enyra","rootid":"gowz","userid":"jeiv","description":"#scratch","iconbackground":"#FFA500","icon":"Flag","iconArtId":null,"splashArtId":null,"time":1394049668,"priority":10000},
{"name":"blank turtle","id":"parp","rootid":"oobxb","userid":"jeiv","description":"#turtle","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1418279474,"priority":10000},
{"name":"blog","id":"fbyfa","rootid":"fbyfa","userid":"jeiv","description":"All the info about the TouchDevelop blog. #docs","iconbackground":"#85BB65","icon":"Bolt","iconArtId":null,"splashArtId":null,"time":1422887832,"priority":10000,"parentTopic":"contents"},
{"name":"book","id":"zhnbb","rootid":"yhsu","userid":"jeiv","description":"The TouchDevelop book. #docs #book","iconbackground":"#008000","icon":"Book","iconArtId":null,"splashArtId":null,"time":1412666709,"priority":10000,"parentTopic":"teach"},
{"name":"bouncing bubbles walkthrough","id":"eimha","rootid":"eqhr","userid":"jeiv","description":"A walkthrough for the `physics game` template. #docs #tutorials","iconbackground":"#00008B","icon":"GPS","iconArtId":null,"splashArtId":null,"time":1416425701,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/oeluiclq"},
{"name":"box edit translate","id":"obme","rootid":"obme","userid":"jeiv","description":"A template to create apps using pages.","iconbackground":"#FFA500","icon":"AddressBook","iconArtId":null,"splashArtId":null,"time":1375400029,"priority":10000,"platforms":["translation","speech"]},
{"name":"boxed","id":"pnzuc","rootid":"nlnz","userid":"jeiv","description":"A box displayed on screen. #docs #language","iconbackground":"#FF91A4","icon":"FlowChart","iconArtId":null,"splashArtId":null,"time":1412946853,"priority":10000,"parentTopic":"language"},
{"name":"bubble popper tutorial","id":"lnjsa","rootid":"lekzuvii","userid":"jeiv","description":"A tutorial to build a bubble popper game from scratch. #docs #tutorials #games #HourOfCode #tutorial","iconbackground":"#85BB65","icon":"Cactus","iconArtId":null,"splashArtId":null,"time":1416508894,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/rigzqzdx","parentTopic":"beginnertutorials"},
{"name":"cloud libraries","id":"ferb","rootid":"czmjc","userid":"jeiv","description":"Explains how to build server-side libraries. #docs","iconbackground":"#A1CAF1","icon":"AlignRight","iconArtId":null,"splashArtId":null,"time":1406402358,"priority":10000},
{"name":"cloud sessions","id":"ifjw","rootid":"sptg","userid":"jeiv","description":"Cloud sessions provide a simple way to save data in the cloud, and to share data between different devices. Cloud sessions automatically synchronize the shared data between participants of the same cloud session. #docs","iconbackground":"#007FFF","icon":"Weather","iconArtId":null,"splashArtId":null,"time":1412665778,"priority":10000,"parentTopic":"language"},
{"name":"code","id":"bjdyb","rootid":"rxme","userid":"jeiv","description":"A sequence of code with inputs and outputs. #docs #code #language","iconbackground":"#A52A2A","icon":"ArrowBox","iconArtId":null,"splashArtId":null,"time":1412665805,"priority":10000,"parentTopic":"language"},
{"name":"code hunt sector 0","id":"eolgd","rootid":"vtfgmgwr","userid":"jeiv","description":"This is the TouchDevelop version of sector 0 of Code Hunt.\r\n#docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415082661,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 1","id":"jfrha","rootid":"romzeakr","userid":"jeiv","description":"This is the TouchDevelop version of sector 1 of Code Hunt.\r\n#docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415080044,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 10","id":"yptja","rootid":"vtfgmgwr","userid":"jeiv","description":"This is the TouchDevelop version of sector 11 of Code Hunt.\r\n#docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415081808,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 11","id":"xjaya","rootid":"vtfgmgwr","userid":"jeiv","description":"This is the TouchDevelop version of sector 12 of Code Hunt.\r\n#docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415082394,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 12","id":"kodw","rootid":"vtfgmgwr","userid":"jeiv","description":"This is the TouchDevelop version of sector 14 of Code Hunt.\r\n#docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415082296,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 2","id":"cvsd","rootid":"uhkxaair","userid":"jeiv","description":"This is the TouchDevelop version of sector 2 of Code Hunt.\r\n#docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415081955,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 3","id":"eyxma","rootid":"mbnkaxkm","userid":"jeiv","description":"This is the TouchDevelop version of sector 3 of Code Hunt. #docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415081668,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 4","id":"cgsv","rootid":"sjicrkpo","userid":"jeiv","description":"This is the TouchDevelop version of sector 4 of Code Hunt. #docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415081732,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 5","id":"ztkrc","rootid":"uhkxaair","userid":"jeiv","description":"This is the TouchDevelop version of sector 5 of Code Hunt.\r\n#docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415081560,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 6","id":"jqspa","rootid":"mbnkaxkm","userid":"jeiv","description":"This is the TouchDevelop version of sector 6 of Code Hunt. #docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415081500,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 7","id":"oskc","rootid":"vtfgmgwr","userid":"jeiv","description":"This is the TouchDevelop version of sector 7 of Code Hunt.\r\n#docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415082115,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 8","id":"yxqva","rootid":"vtfgmgwr","userid":"jeiv","description":"This is the TouchDevelop version of sector 8 of Code Hunt.\r\n#docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415082030,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt sector 9","id":"ptlv","rootid":"vtfgmgwr","userid":"jeiv","description":"This is the TouchDevelop version of sector 9 of Code Hunt.\r\n#docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1415082241,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/hgtykqzn","parentTopic":"codehunttutorials"},
{"name":"code hunt tutorial library","id":"avzea","rootid":"oqajohuh","userid":"jeiv","description":"","iconbackground":"#FF2800","icon":"Inbox","iconArtId":null,"splashArtId":null,"time":1407868381,"priority":10000,"platforms":["musicandsounds"]},
{"name":"code hunt tutorials","id":"vovja","rootid":"nkzm","userid":"jeiv","description":"A set of interactive tutorials to learn about algorithms. #docs #tutorials","iconbackground":"#FFA500","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1407775977,"priority":10000,"parentTopic":"tutorials"},
{"name":"coding guidelines","id":"fovs","rootid":"plsza","userid":"jeiv","description":"Best practices for creating code. #docs #codingGuidelines #language","iconbackground":"#E25822","icon":"Headphones","iconArtId":null,"splashArtId":null,"time":1412701898,"priority":10000,"parentTopic":"advancedtopics"},
{"name":"commands","id":"aulud","rootid":"xxqrc","userid":"jeiv","description":"Straight line code #docs #commands #language","iconbackground":"#85BB65","icon":"AlignLeft","iconArtId":null,"splashArtId":null,"time":1412665859,"priority":10000,"parentTopic":"language"},
{"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":"lyjec","rootid":"otbw","userid":"jeiv","description":"Documentation. #docs #content","iconbackground":"#FF7518","icon":"PlusBoxAlt","iconArtId":null,"splashArtId":null,"time":1422887527,"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":"elmwa","rootid":"cqvl","userid":"jeiv","description":"Courses and tutorials for TouchDevelop. #docs #courses","iconbackground":"#E3256B","icon":"Erase","iconArtId":null,"splashArtId":null,"time":1412666689,"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"},
{"name":"creating interactive tutorials","id":"oibib","rootid":"xniertjj","userid":"jeiv","description":"How to create 'tap here' tutorials. #docs","iconbackground":"#E3256B","icon":"GlobeSA","iconArtId":null,"splashArtId":null,"time":1421696541,"priority":10000,"platforms":["clouddata"],"parentTopic":"teach"},
{"name":"cutest voting app tutorial","id":"ajhsb","rootid":"nrdhndao","userid":"jeiv","description":"A tutorial to create an voting app for the cutest cat or dog. #docs #tutorials #stepByStep.","iconbackground":"#FFA500","icon":"CheckCircleAlt","iconArtId":null,"splashArtId":null,"time":1415066416,"priority":10000,"platforms":["musicandsounds","clouddata"],"screenshot":"https://az31353.vo.msecnd.net/pub/akzvrrqu","parentTopic":"socialapptutorials"},
{"name":"data","id":"mhloa","rootid":"jswu","userid":"jeiv","description":"Global variables. #docs #data #language","iconbackground":"#9955BB","icon":"BulletList","iconArtId":null,"splashArtId":null,"time":1412665797,"priority":10000,"parentTopic":"language"},
{"name":"debugging","id":"lzcj","rootid":"aokhb","userid":"jeiv","description":"Debugging your script with the built-in debugger. #docs","iconbackground":"#FF0038","icon":"Settings","iconArtId":null,"splashArtId":null,"time":1412666436,"priority":10000,"parentTopic":"advancedtopics"},
{"name":"dev bootcamp","id":"zibx","rootid":"rfhw","userid":"jeiv","description":"A quick tutorial for developers. #docs #tutorials","iconbackground":"#007FFF","icon":"Airplane","iconArtId":null,"splashArtId":null,"time":1412688762,"priority":10000,"platforms":["accelerometer","location","maps","clouddata"],"parentTopic":"gettingstarted"},
{"name":"don't tap the tile tutorial","id":"zdir","rootid":"zdjla","userid":"jeiv","description":"An interactive tutorial to build the 'don't tap the white tile' game #docs #tutorials #HourOfCode #tutorial","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1416508829,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/icpgmiyy","parentTopic":"gametutorials"},
{"name":"dreamspark","id":"kadra","rootid":"fasn","userid":"jeiv","description":"Free access to app publishing for students. #docs #dreamSpark #exportToApp #windows8","iconbackground":"#007FFF","icon":"Award","iconArtId":null,"splashArtId":null,"time":1412701945,"priority":10000,"parentTopic":"teach"},
{"name":"esplora level tutorial","id":"qawva","rootid":"alae","userid":"jeiv","description":"A tutorial to learn how to build a Arduino #Esplora level. #docs","iconbackground":"#FF0038","icon":"Stacks","iconArtId":null,"splashArtId":null,"time":1395427843,"priority":10000,"platforms":["accelerometer"],"screenshot":"https://az31353.vo.msecnd.net/pub/iujwaftk"},
{"name":"events","id":"aesna","rootid":"rlzoa","userid":"jeiv","description":"Special actions that trigger based on certain conditions. #docs #events #language","iconbackground":"#FFA500","icon":"Bolt","iconArtId":null,"splashArtId":null,"time":1412665800,"priority":10000,"platforms":["accelerometer","orientation"],"parentTopic":"language"},
{"name":"export to Cordova","id":"wztlc","rootid":"hdgs","userid":"jeiv","description":"Explains how to export a script to the App Store. #docs","iconbackground":"#007FFF","icon":"GlobeEUA","iconArtId":null,"splashArtId":null,"time":1422412561,"priority":10000,"parentTopic":"exporttoapp"},
{"name":"export to android","id":"rdena","rootid":"hdgs","userid":"jeiv","description":"Explains how to export a script to Android. #docs","iconbackground":"#007FFF","icon":"AlmostEqual","iconArtId":null,"splashArtId":null,"time":1421185017,"priority":10000},
{"name":"export to app","id":"jbyx","rootid":"fdyu","userid":"jeiv","description":"Export your scripts to Windows, Windows Phone or Web apps. #docs #exportToApp","iconbackground":"#85BB65","icon":"Acorn","iconArtId":null,"splashArtId":null,"time":1421184677,"priority":10000,"parentTopic":"contents"},
{"name":"export to app studio","id":"jzchb","rootid":"mueyvopf","userid":"jeiv","description":"How to export your scripts to Windows and Windows Phone using App Studio #docs","iconbackground":"#008000","icon":"Suitcase","iconArtId":null,"splashArtId":null,"time":1418774223,"priority":10000,"parentTopic":"exporttoapp"},
{"name":"export to azure","id":"nexja","rootid":"lqlc","userid":"jeiv","description":"Describes how to export a script to an Azure web site. #azure #docs","iconbackground":"#007FFF","icon":"Stacks","iconArtId":null,"splashArtId":null,"time":1422452846,"priority":10000,"parentTopic":"exporttoapp"},
{"name":"export to iOS","id":"rwqla","rootid":"hdgs","userid":"jeiv","description":"Explains how to export a script to the App Store. #docs","iconbackground":"#FF0038","icon":"Acorn","iconArtId":null,"splashArtId":null,"time":1421184878,"priority":10000},
{"name":"export to node.js","id":"ymxc","rootid":"uhuwqdmn","userid":"jeiv","description":"How to export to any node.js server instance.\r\n#docs","iconbackground":"#FF0038","icon":"Needle","iconArtId":null,"splashArtId":null,"time":1413906618,"priority":10000,"parentTopic":"exporttoapp"},
{"name":"export to windows phone","id":"tqfsb","rootid":"zuaea","userid":"jeiv","description":"Instruction on exporting your script to the Windows Phone Store #docs","iconbackground":"#F5DEB3","icon":"FlowChart","iconArtId":null,"splashArtId":null,"time":1421184778,"priority":10000},
{"name":"extension actions","id":"gtjra","rootid":"nupt","userid":"jeiv","description":"Action that appear as property calls on records and setter conversion #docs #language #actions #setters","iconbackground":"#FF0038","icon":"AddFolder","iconArtId":null,"splashArtId":null,"time":1412689151,"priority":10000,"parentTopic":"language"},
{"name":"factorial tutorial","id":"joxi","rootid":"ivzrejdn","userid":"jeiv","description":"A step-by-step tutorial about the factorial function #docs #tutorials #stepByStep.","iconbackground":"#800080","icon":"Exclamation","iconArtId":null,"splashArtId":null,"time":1383627495,"priority":10000},
{"name":"falling rocks tutorial","id":"rfcea","rootid":"cxwjqvmo","userid":"jeiv","description":"A step-by-step tutorial on creating a game where you have to tilt your device to avoid falling rocks! #docs #tutorials #stepByStep #HourOfCode #tutorial","iconbackground":"#008000","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1416508849,"priority":10000,"platforms":["accelerometer","musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/czyykuaj"},
{"name":"faq","id":"fjsc","rootid":"gswd","userid":"jeiv","description":"Frequently asked questions. #docs #faq","iconbackground":"#B7410E","icon":"ArrowHead","iconArtId":null,"splashArtId":null,"time":1420746259,"priority":10000,"parentTopic":"contents"},
{"name":"first steps with drawing","id":"tkhvb","rootid":"alscwpqx","userid":"jeiv","description":"Use simple shapes to build amazing drawings! #docs #drawing #tutorials","iconbackground":"#A52A2A","icon":"Wand","iconArtId":null,"splashArtId":null,"time":1415066532,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/rxvuaajw","parentTopic":"beginnertutorials"},
{"name":"first steps with turtle","id":"tbgfb","rootid":"fezjznjm","userid":"jeiv","description":"Draw incredible drawings with the turtle! #docs #tutorials #stepbystep #HourOfCode #tutorial","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1417736017,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/nqolyatf"},
{"name":"flickr search tutorial","id":"ytqh","rootid":"bhdxlolr","userid":"jeiv","description":"A tutorial on how to read RSS to build a flickr search app. #docs #tutorials #stepByStep","iconbackground":"#007FFF","icon":"Save","iconArtId":null,"splashArtId":null,"time":1400089812,"priority":10000},
{"name":"for","id":"xlkga","rootid":"xmpf","userid":"jeiv","description":"Repeat code a number of times. #docs #for #language","iconbackground":"#E25822","icon":"Revert","iconArtId":null,"splashArtId":null,"time":1412665885,"priority":10000,"parentTopic":"language"},
{"name":"for each","id":"ruis","rootid":"zxfb","userid":"jeiv","description":"Run code for each element in a collection. #docs #forEach #language","iconbackground":"#85BB65","icon":"AlignLeft","iconArtId":null,"splashArtId":null,"time":1412665927,"priority":10000,"parentTopic":"language"},
{"name":"forehead word guesser","id":"lubu","rootid":"auqsa","userid":"jeiv","description":"","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1402089234,"priority":10000,"platforms":["accelerometer"]},
{"name":"from blocks to text","id":"pxipa","rootid":"gvwxajqc","userid":"jeiv","description":"A migration guide from block editors such as Scratch. #docs #blocks #Scratch #Snap #AppInvetor #Snap #blockly #BYOB","iconbackground":"#00008B","icon":"Location","iconArtId":null,"splashArtId":null,"time":1418865277,"priority":10000,"parentTopic":"gettingstarted"},
{"name":"fun with sphero","id":"txkya","rootid":"gshiehls","userid":"jeiv","description":"Control your Sphero like turtle! #docs #turtle #tutorials #Sphero","iconbackground":"#A1CAF1","icon":"ArrowCircleRounded","iconArtId":null,"splashArtId":null,"time":1415076614,"priority":10000,"platforms":["musicandsounds","bluetooth"],"screenshot":"https://az31353.vo.msecnd.net/pub/gftqcplh","parentTopic":"hardwaretutorials"},
{"name":"game board","id":"djse","rootid":"uels","userid":"jeiv","description":"A built-in 2D game engine. #docs #gameBoard #games","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1412686995,"priority":10000,"platforms":["accelerometer"],"parentTopic":"games"},
{"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":"cljk","rootid":"idsna","userid":"jeiv","description":"A few tips on getting started with TouchDevelop. #docs #gettingStarted","iconbackground":"#007FFF","icon":"CoffeeCup","iconArtId":null,"splashArtId":null,"time":1415145612,"priority":15,"parentTopic":"contents"},
{"name":"getting started with arduino","id":"jobxd","rootid":"utpcc","userid":"jeiv","description":"A guide to developing Arduino with TouchDevelop. #docs #arduino","iconbackground":"#00CC99","icon":"ArrowCircleRounded","iconArtId":null,"splashArtId":null,"time":1421988251,"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":"mbwva","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":1422318217,"priority":10000,"parentTopic":"groups"},
{"name":"groups","id":"vrfhb","rootid":"yupu","userid":"jeiv","description":"A group is a collection of users. #docs","iconbackground":"#FFDF00","icon":"Stacks","iconArtId":null,"splashArtId":null,"time":1412791985,"priority":10000,"parentTopic":"teach"},
{"name":"hardware tutorials","id":"pjybb","rootid":"hvuu","userid":"jeiv","description":"Interactive tutorials to program hardware gadgets with TouchDevelop. #docs","iconbackground":"#FF00FF","icon":"Notebook","iconArtId":null,"splashArtId":null,"time":1417788324,"priority":10000,"parentTopic":"tutorials"},
{"name":"hello world","id":"yznkb","rootid":"lzqxkvzl","userid":"jeiv","description":"A short tutorial for Java developers #docs #tutorials","iconbackground":"#007FFF","icon":"Wand","iconArtId":null,"splashArtId":null,"time":1412688174,"priority":10000,"parentTopic":"gettingstarted"},
{"name":"hidden scripts","id":"hcqlb","rootid":"oohc","userid":"jeiv","description":"Hiding and unhidding scripts. #docs","iconbackground":"#FF7518","icon":"Cactus","iconArtId":null,"splashArtId":null,"time":1413225132,"priority":10000,"parentTopic":"socialcoding"},
{"name":"hide and seek scratch tutorial","id":"tssxc","rootid":"vdqqa","userid":"jeiv","description":"","iconbackground":"#FFA500","icon":"Tanktop","iconArtId":null,"splashArtId":null,"time":1414630862,"priority":10000,"platforms":["musicandsounds"]},
{"name":"history","id":"wpzv","rootid":"wpzv","userid":"jeiv","description":"Understand how the scripts are saved. #docs","iconbackground":"#E3256B","icon":"Revert","iconArtId":null,"splashArtId":null,"time":1413226626,"priority":10000,"parentTopic":"socialcoding"},
{"name":"hour of code educator notes","id":"lugh","rootid":"gjvv","userid":"jeiv","description":"The recipe to run an awesome Hour Of Code™ with TouchDevelop! #docs #hourofcode","iconbackground":"#9955BB","icon":"Wand","iconArtId":null,"splashArtId":null,"time":1417736256,"priority":10000,"parentTopic":"teach"},
{"name":"how to edit the docs","id":"qeyra","rootid":"pzlhc","userid":"jeiv","description":"Explains the process to edit the official documentation #docs","iconbackground":"#FF2800","icon":"Key","iconArtId":null,"splashArtId":null,"time":1412977108,"priority":10000,"parentTopic":"socialcoding"},
{"name":"how to search","id":"ztiea","rootid":"agnnwyno","userid":"jeiv","description":"Learn where to search for what. Discover the query syntax. #docs #search","iconbackground":"#008000","icon":"Search","iconArtId":null,"splashArtId":null,"time":1422129096,"priority":10000,"parentTopic":"howtosearch"},
{"name":"if","id":"epzxa","rootid":"ikef","userid":"jeiv","description":"Run different code based on a condition. #docs #if #language","iconbackground":"#FF7518","icon":"Directions","iconArtId":null,"splashArtId":null,"time":1417509300,"priority":10000,"parentTopic":"language"},
{"name":"image search tutorial","id":"xpvu","rootid":"xpvu","userid":"jeiv","description":"","iconbackground":"#FDEE00","icon":"AddressBook","iconArtId":null,"splashArtId":null,"time":1402040155,"priority":10000,"platforms":["search"]},
{"name":"inline actions","id":"myspb","rootid":"bzgr","userid":"jeiv","description":"Actions defined inside other actions","iconbackground":"#9955BB","icon":"HomeAlt","iconArtId":null,"splashArtId":null,"time":1412688346,"priority":10000,"platforms":["accelerometer"],"parentTopic":"language"},
{"name":"insanely short tutorial","id":"hglg","rootid":"koyn","userid":"jeiv","description":"#docs A tutorial to test the tutorials.","iconbackground":"#90EE90","icon":"MultiplyCircle","iconArtId":null,"splashArtId":null,"time":1384762563,"priority":10000},
{"name":"insights","id":"yglza","rootid":"nnmv","userid":"jeiv","description":"TouchDevelop maintains various statistics and information about your published scripts. #docs","iconbackground":"#FDEE00","icon":"Lightbulb","iconArtId":null,"splashArtId":null,"time":1412791874,"priority":10000,"parentTopic":"socialcoding"},
{"name":"invalid","id":"wzrdb","rootid":"fvhi","userid":"jeiv","description":"An invalid value is a value that is useless. #docs #invalid #language","iconbackground":"#00008B","icon":"LoadingAlt","iconArtId":null,"splashArtId":null,"time":1412701835,"priority":10000,"parentTopic":"language"},
{"name":"jumping bird tutorial","id":"hvjv","rootid":"silub","userid":"jeiv","description":"A tutorial to build a flappy bird clone. #docs #stepByStep #HourOfCode #tutorial","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1416508809,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/cpfimuwo","parentTopic":"gametutorials"},
{"name":"keyboard","id":"ilmoa","rootid":"ilmoa","userid":"jeiv","description":"How to handle keyboard input #docs","iconbackground":"#008080","icon":"Inbox","iconArtId":null,"splashArtId":null,"time":1393874919,"priority":10000},
{"name":"label printer","id":"auefd","rootid":"kjzs","userid":"jeiv","description":"A sample using cloud services to print labels for scripts. #docs","iconbackground":"#FF0038","icon":"Sort","iconArtId":null,"splashArtId":null,"time":1412666772,"priority":10000,"parentTopic":"teach"},
{"name":"language","id":"utqwa","rootid":"oyrs","userid":"jeiv","description":"Language syntax. #docs #language","iconbackground":"#008000","icon":"RemoveFolder","iconArtId":null,"splashArtId":null,"time":1412701843,"priority":20,"parentTopic":"contents"},
{"name":"leaderboards","id":"mfiyb","rootid":"ejjc","userid":"jeiv","description":"Adding a high score list to your games. #docs #leaderboards #games","iconbackground":"#00008B","icon":"Fire","iconArtId":null,"splashArtId":null,"time":1412687008,"priority":10000,"parentTopic":"games"},
{"name":"libraries","id":"zjyc","rootid":"xkmna","userid":"jeiv","description":"Libraries are scripts, which you can use in other scripts. #docs #libraries #language #bazaar","iconbackground":"#800080","icon":"Recycle","iconArtId":null,"splashArtId":null,"time":1412665781,"priority":10000,"parentTopic":"language"},
{"name":"love me not notes","id":"pmdfa","rootid":"qjvtnqox","userid":"jeiv","description":"The notes associated to the 'love me not' tutorial. #docs","iconbackground":"#FF0038","icon":"ABC","iconArtId":null,"splashArtId":null,"time":1386359780,"priority":10000,"platforms":["musicandsounds"]},
{"name":"love me not tutorial","id":"ipcsa","rootid":"iyjkmpxy","userid":"jeiv","description":"This is a tutorial that describes how to make a simple flower petal game by teaching the use of sprite sets. #docs #tutorials #stepbystep #HourOfCode #tutorial","iconbackground":"#FF00FF","icon":"HeartAlt","iconArtId":null,"splashArtId":null,"time":1418326296,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/ojefqwbp","parentTopic":"gametutorials"},
{"name":"loves me loves me not","id":"abzi","rootid":"djkg","userid":"jeiv","description":"#HourOfCode","iconbackground":"#E3256B","icon":"Heart","iconArtId":null,"splashArtId":null,"time":1418326280,"priority":10000},
{"name":"magic 8 ball tutorial","id":"ywrn","rootid":"czxea","userid":"jeiv","description":"A magic 8 ball game tutorial #docs #tutorials","iconbackground":"#00008B","icon":"Tools","iconArtId":null,"splashArtId":null,"time":1415066917,"priority":10000,"platforms":["musicandsounds"],"parentTopic":"gametutorials"},
{"name":"makey makey beatbox tutorial","id":"hgkr","rootid":"upol","userid":"jeiv","description":"A guided to tutorial to build a beatbox driven by Makey Makey #docs","iconbackground":"#FFA500","icon":"Forward","iconArtId":null,"splashArtId":null,"time":1395427717,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/krrqcmcm"},
{"name":"map of things tutorial","id":"zltx","rootid":"pljua","userid":"jeiv","description":"A tutorial to build a collaborative app that allows users to collect information about things in the world. #docs #tutorials #stepByStep.","iconbackground":"#FFA500","icon":"Map","iconArtId":null,"splashArtId":null,"time":1415066980,"priority":10000,"platforms":["location","maps","clouddata"],"screenshot":"https://az31353.vo.msecnd.net/pub/heknakcs"},
{"name":"markdown","id":"wxgg","rootid":"pbph","userid":"jeiv","description":"Syntax to create formatted text. #docs #markdown","iconbackground":"#800080","icon":"Shield","iconArtId":null,"splashArtId":null,"time":1422053368,"priority":10000,"parentTopic":"comment"},
{"name":"microphone","id":"hjjw","rootid":"hjjw","userid":"jeiv","description":"Access to the #microphone #docs","iconbackground":"#E3256B","icon":"AlignCenter","iconArtId":null,"splashArtId":null,"time":1395425064,"priority":10000,"platforms":["microphone","musicandsounds"]},
{"name":"monster slicer tutorial","id":"rebp","rootid":"cxwjqvmo","userid":"jeiv","description":"A step-by-step tutorial on creating a game with bouncing monsters #docs #tutorials #stepByStep #HourOfCode #tutorial","iconbackground":"#008000","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1416508877,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/dwhkdiwe","parentTopic":"gametutorials"},
{"name":"move to library","id":"uvthb","rootid":"igxk","userid":"jeiv","description":"Explains the move to library refactoring that allows you to easily identify and move a set of script elements to a library.\r\n#docs #refactorings","iconbackground":"#FDEE00","icon":"DocumentsAlt","iconArtId":null,"splashArtId":null,"time":1412701848,"priority":10000,"parentTopic":"refactorings"},
{"name":"name matcher","id":"dszyb","rootid":"rizvatwt","userid":"jeiv","description":"This is a tutorial to build a love compatibility tester in TouchDevelop. #docs","iconbackground":"#E3256B","icon":"CheckAlt","iconArtId":null,"splashArtId":null,"time":1415067352,"priority":10000,"parentTopic":"gametutorials"},
{"name":"nfc","id":"pwuy","rootid":"bcwe","userid":"jeiv","description":"Using Near Field Communication to send and receive messages. #docs #nfc","iconbackground":"#E25822","icon":"ChargingBattery","iconArtId":null,"splashArtId":null,"time":1380066325,"priority":10000,"platforms":["proximity"]},
{"name":"not implemented","id":"skux","rootid":"skux","userid":"jeiv","description":"#docs","iconbackground":"#FF0038","icon":"Warning","iconArtId":null,"splashArtId":null,"time":1379018365,"priority":10000},
{"name":"oauth v2","id":"xtlk","rootid":"aaisa","userid":"jeiv","description":"OAuth 2.0 allows to build apps for Live, Facebook or Google. #docs #OAuthv2 #WebOauthV2","iconbackground":"#00CC99","icon":"Wifi","iconArtId":null,"splashArtId":null,"time":1394724227,"priority":10000},
{"name":"obsolete","id":"mwly","rootid":"mwly","userid":"jeiv","description":"An obsolete API should not be used. It might not work properly. Please try to find an alternative API. #docs","iconbackground":"#FF0038","icon":"Warning","iconArtId":null,"splashArtId":null,"time":1379018034,"priority":10000},
{"name":"office mix docs","id":"ovsn","rootid":"sxuka","userid":"jeiv","description":"How to create and publish Office Mix apps #docs #officemix","iconbackground":"#FFA500","icon":"SmilieHappy","iconArtId":null,"splashArtId":null,"time":1418016921,"priority":10000,"parentTopic":"exporttoapp"},
{"name":"offline support","id":"vsvvb","rootid":"nldy","userid":"jeiv","description":"Notes about using TouchDevelop offline. #docs","iconbackground":"#E3256B","icon":"ExclamationCircleAlt","iconArtId":null,"splashArtId":null,"time":1412947181,"priority":10000,"parentTopic":"socialcoding"},
{"name":"one pic social tutorial","id":"mugd","rootid":"ucau","userid":"jeiv","description":"A tutorial to create a one picture social network. #docs #tutorials #stepbystep","iconbackground":"#FFA500","icon":"FourColumn","iconArtId":null,"splashArtId":null,"time":1421688918,"priority":10000,"platforms":["cloudservices"],"parentTopic":"socialapptutorials"},
{"name":"operators","id":"lwln","rootid":"fqey","userid":"jeiv","description":"Built-in operators. #docs #operators #language","iconbackground":"#E25822","icon":"Link","iconArtId":null,"splashArtId":null,"time":1412701831,"priority":10000,"parentTopic":"language"},
{"name":"page","id":"azvh","rootid":"oxtn","userid":"jeiv","description":"A user interface made of boxes.","iconbackground":"#800080","icon":"Presentation","iconArtId":null,"splashArtId":null,"time":1364254960,"priority":10000},
{"name":"pages","id":"gytfa","rootid":"oxtn","userid":"jeiv","description":"A user interface made of boxes. #docs #pages #language","iconbackground":"#00CC99","icon":"Presentation","iconArtId":null,"splashArtId":null,"time":1412665787,"priority":10000,"parentTopic":"language"},
{"name":"pages and boxes","id":"groya","rootid":"oxtn","userid":"jeiv","description":"A user interface made of boxes. #docs #pages #language #tutorial #boxed","iconbackground":"#9955BB","icon":"CheckBox","iconArtId":null,"splashArtId":null,"time":1412702224,"priority":10000,"platforms":["translation"],"parentTopic":"pages"},
{"name":"pages and boxes tutorial","id":"hzii","rootid":"fbega","userid":"jeiv","description":"#docs\r\nA guide to learn the ropes of using pages and boxes in TouchDevelop.","iconbackground":"#9955BB","icon":"Heart","iconArtId":null,"splashArtId":null,"time":1408665579,"priority":10000},
{"name":"pages template","id":"yauv","rootid":"elsn","userid":"jeiv","description":"A template to create apps using pages.","iconbackground":"#00CC99","icon":"AddressBook","iconArtId":null,"splashArtId":null,"time":1384762479,"priority":10000},
{"name":"parallax backgrounds","id":"lhiq","rootid":"zcem","userid":"jeiv","description":"How to create cool parallax background effects for games. #docs #games","iconbackground":"#007FFF","icon":"CoffeeCup","iconArtId":null,"splashArtId":null,"time":1412687250,"priority":10000,"parentTopic":"games"},
{"name":"parsing data","id":"uwkg","rootid":"vpbj","userid":"jeiv","description":"Parsing JSON, XML, RSS, CSV data. #docs #parsingData #XML #JSON #CSV #apps #web","iconbackground":"#B7410E","icon":"Download","iconArtId":null,"splashArtId":null,"time":1364934096,"priority":10000},
{"name":"persistent data","id":"jtvqd","rootid":"iiqn","userid":"jeiv","description":"Saving global variables. #docs #data #language","iconbackground":"#9955BB","icon":"Save","iconArtId":null,"splashArtId":null,"time":1412688973,"priority":10000,"parentTopic":"language"},
{"name":"petals","id":"zzjn","rootid":"kgtowzwg","userid":"jeiv","description":"Positions sprites in a circular arrangement, like petals on a flower.","iconbackground":"#B7410E","icon":"Leaf","iconArtId":null,"splashArtId":null,"time":1384758884,"priority":10000},
{"name":"photo map tutorial","id":"blrz","rootid":"pljua","userid":"jeiv","description":"A tutorial to build a collaborative app that allows users to collect pictures about things in the world. #docs #tutorials #stepByStep.","iconbackground":"#FFA500","icon":"Map","iconArtId":null,"splashArtId":null,"time":1395787450,"priority":10000,"platforms":["location","maps","clouddata","cloudservices"],"screenshot":"https://az31353.vo.msecnd.net/pub/heknakcs"},
{"name":"physics game walkthrough","id":"yqxt","rootid":"eqhr","userid":"jeiv","description":"A walkthrough for the `physics game` template. #docs #tutorial","iconbackground":"#EEDC82","icon":"GPS","iconArtId":null,"splashArtId":null,"time":1370996989,"priority":10000},
{"name":"pixel art","id":"clfha","rootid":"vxyfa","userid":"jeiv","description":"A library to create pixel art tutorials. #pixelArt","iconbackground":"#9955BB","icon":"NineColumn","iconArtId":null,"splashArtId":null,"time":1412316326,"priority":10000,"platforms":["musicandsounds"]},
{"name":"pixel art levels","id":"upfmb","rootid":"tzjz","userid":"jeiv","description":"","iconbackground":"#9955BB","icon":"NineColumn","iconArtId":null,"splashArtId":null,"time":1412316331,"priority":10000},
{"name":"pixel art tutorial","id":"whvfa","rootid":"jsbka","userid":"jeiv","description":"Learn to create your own pixel art! #docs #tutorials #stepByStep #HourOfCode","iconbackground":"#9955BB","icon":"NineColumn","iconArtId":null,"splashArtId":null,"time":1414630511,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/eyaoibxe"},
{"name":"pixels template","id":"qnsl","rootid":"bnxva","userid":"jeiv","description":"A cool drawing created pixel by pixel.","iconbackground":"#007FFF","icon":"Appointment","iconArtId":null,"splashArtId":null,"time":1384333193,"priority":10000},
{"name":"pixels tutorial","id":"qnbvb","rootid":"bnxva","userid":"jeiv","description":"A cool drawing created pixel by pixel. #docs #tutorials #stepbystep","iconbackground":"#E25822","icon":"Appointment","iconArtId":null,"splashArtId":null,"time":1415067752,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/divrwugm"},
{"name":"plugins","id":"lhnp","rootid":"oehga","userid":"jeiv","description":"Extend the TouchDevelop editor with #plugins #docs","iconbackground":"#007FFF","icon":"PlusCircle","iconArtId":null,"splashArtId":null,"time":1422431143,"priority":10000,"parentTopic":"advancedtopics"},
{"name":"popular number tutorial","id":"vyjp","rootid":"wxira","userid":"jeiv","description":"#docs","iconbackground":"#00008B","icon":"8Ball","iconArtId":null,"splashArtId":null,"time":1395964240,"priority":10000,"platforms":["clouddata"]},
{"name":"press","id":"melsa","rootid":"nmce","userid":"jeiv","description":"List of news, press or blogs about TouchDevelop. #docs #news #press","iconbackground":"#E25822","icon":"ArrowLarge","iconArtId":null,"splashArtId":null,"time":1386710890,"priority":10000},
{"name":"productivity tutorials","id":"ffww","rootid":"hurbc","userid":"jeiv","description":"Interactive tutorials to build apps with input fields, reports, computations, etc... #docs #tutorials","iconbackground":"#FFA500","icon":"Appointment","iconArtId":null,"splashArtId":null,"time":1395684978,"priority":10000,"parentTopic":"tutorials"},
{"name":"profiling","id":"colv","rootid":"naec","userid":"jeiv","description":"Profiling your script with the built-in profiling to measure performance characteristics. #docs","iconbackground":"#FF0038","icon":"Alram","iconArtId":null,"splashArtId":null,"time":1412666463,"priority":10000,"parentTopic":"advancedtopics"},
{"name":"publishing","id":"jknr","rootid":"gdzm","userid":"jeiv","description":"How to publish scripts. #docs #publishing","iconbackground":"#A52A2A","icon":"Star","iconArtId":null,"splashArtId":null,"time":1412686745,"priority":10000,"parentTopic":"socialcoding"},
{"name":"publishing run","id":"ardzd","rootid":"wkkg","userid":"jeiv","description":"Publishing information about a script crash or a successful script run. #docs","iconbackground":"#FDEE00","icon":"Bullseye","iconArtId":null,"splashArtId":null,"time":1412686774,"priority":10000,"parentTopic":"socialcoding"},
{"name":"pull requests","id":"aymwb","rootid":"hilwa","userid":"jeiv","description":"Explains how `pull request` for changes work. #docs","iconbackground":"#E25822","icon":"Command","iconArtId":null,"splashArtId":null,"time":1415067814,"priority":10000,"parentTopic":"socialcoding"},
{"name":"quadratic equation activity","id":"gbqpa","rootid":"gnty","userid":"jeiv","description":"This is an activity for students learning quadratic equation #docs #math #stem.","iconbackground":"#FDEE00","icon":"PlusBox","iconArtId":null,"splashArtId":null,"time":1367468952,"priority":10000},
{"name":"quadratic equation solver","id":"qzvj","rootid":"tyltxixd","userid":"jeiv","description":"Learn how to solve classic math problems using TouchDevelop #docs #math #tutorials #stepbystep","iconbackground":"#007FFF","icon":"Graph","iconArtId":null,"splashArtId":null,"time":1384378223,"priority":10000},
{"name":"random number guesser tutorial","id":"algna","rootid":"gvwxajqc","userid":"jeiv","description":"A migration guide from block editors such as Scratch. #docs #blocks #Scratch #Snap #AppInvetor #Snap #blockly #BYOB #tutorials #stepbystep","iconbackground":"#9955BB","icon":"SmilieHappyAlt","iconArtId":null,"splashArtId":null,"time":1386311399,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/kromirev"},
{"name":"records","id":"bosw","rootid":"rvqe","userid":"jeiv","description":"Tables, indexes, objects and decorators. #docs #records #language","iconbackground":"#9955BB","icon":"Files","iconArtId":null,"splashArtId":null,"time":1412665788,"priority":10000,"parentTopic":"language"},
{"name":"recursion","id":"zqdka","rootid":"zqdka","userid":"jeiv","description":"Explain the principle of recursive action calls. #docs","iconbackground":"#EEDC82","icon":"Cycle","iconArtId":null,"splashArtId":null,"time":1374787923,"priority":10000},
{"name":"refactorings","id":"diwwa","rootid":"magu","userid":"jeiv","description":"Use TouchDevelop code editor to its fullest with #refactorings #docs","iconbackground":"#008080","icon":"Male","iconArtId":null,"splashArtId":null,"time":1412666493,"priority":10000,"parentTopic":"advancedtopics"},
{"name":"rss feeds","id":"wlbra","rootid":"jzzy","userid":"jeiv","description":"RSS feeds to track new scripts, etc... #docs","iconbackground":"#E25822","icon":"Paint","iconArtId":null,"splashArtId":null,"time":1422900797,"priority":10000,"parentTopic":"socialcoding"},
{"name":"scratch cat tutorial","id":"svbva","rootid":"gowz","userid":"jeiv","description":"#docs #scratch #stepByStep #tutorials","iconbackground":"#FFA500","icon":"Flag","iconArtId":null,"splashArtId":null,"time":1414630829,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/azkhirjm"},
{"name":"scratch pong tutorial","id":"aakqc","rootid":"aldve","userid":"jeiv","description":"A tutorial to build a pong game using the Scratch library. #docs #tutorials #scratch","iconbackground":"#85BB65","icon":"NumberedList","iconArtId":null,"splashArtId":null,"time":1414630887,"priority":10000,"platforms":["musicandsounds"]},
{"name":"scratch random number guesser notes","id":"njjjb","rootid":"gvwxajqc","userid":"jeiv","description":"A migration guide from block editors such as Scratch. #docs #blocks #Scratch #Snap #AppInvetor #Snap #blockly #BYOB #tutorials","iconbackground":"#FFA500","icon":"Bomb","iconArtId":null,"splashArtId":null,"time":1386312326,"priority":10000,"platforms":["musicandsounds"]},
{"name":"scratch random number guesser tutorial","id":"rmoga","rootid":"gvwxajqc","userid":"jeiv","description":"A migration guide from block editors such as Scratch. #docs #blocks #Scratch #Snap #AppInvetor #Snap #blockly #BYOB #tutorials #stepbystep","iconbackground":"#00CC99","icon":"AlmostEqual","iconArtId":null,"splashArtId":null,"time":1387326471,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/kromirev"},
{"name":"scratch reference","id":"zwvsb","rootid":"ozsd","userid":"jeiv","description":"A complete reference manual of the Scratch library in TouchDevelop. #docs #scratch","iconbackground":"#007FFF","icon":"Ladder","iconArtId":null,"splashArtId":null,"time":1421454831,"priority":10000,"platforms":["accelerometer","musicandsounds"],"parentTopic":"fromblockstotext"},
{"name":"script categories","id":"stscb","rootid":"stscb","userid":"jeiv","description":"A description of the script categories. #docs","iconbackground":"#008080","icon":"Beer","iconArtId":null,"splashArtId":null,"time":1413226221,"priority":10000,"parentTopic":"socialcoding"},
{"name":"script forks","id":"yict","rootid":"irkbb","userid":"jeiv","description":"Explains how forking scripts work. #docs","iconbackground":"#F5DEB3","icon":"Split","iconArtId":null,"splashArtId":null,"time":1412791954,"priority":10000,"parentTopic":"socialcoding"},
{"name":"script id","id":"kfsy","rootid":"htjz","userid":"jeiv","description":"What is the script id? #docs","iconbackground":"#FF7518","icon":"EmailDoc","iconArtId":null,"splashArtId":null,"time":1415067862,"priority":10000,"parentTopic":"socialcoding"},
{"name":"script updates","id":"ptysc","rootid":"bppo","userid":"jeiv","description":"Publishing updates of your scripts. #docs #ScriptUpdates","iconbackground":"#FF0038","icon":"Download","iconArtId":null,"splashArtId":null,"time":1412791964,"priority":10000,"parentTopic":"socialcoding"},
{"name":"senses","id":"ajahc","rootid":"wauha","userid":"jeiv","description":"Overview of sensor access in TouchDevelop #docs","iconbackground":"#008080","icon":"Cherry","iconArtId":null,"splashArtId":null,"time":1412018355,"priority":10000},
{"name":"sensors and user input","id":"rrzd","rootid":"wauha","userid":"jeiv","description":"Overview of sensor access in TouchDevelop #docs","iconbackground":"#008000","icon":"Butterfly","iconArtId":null,"splashArtId":null,"time":1412702232,"priority":10000,"parentTopic":"language"},
{"name":"sketch","id":"zisf","rootid":"qkiw","userid":"jeiv","description":"A library to move a pen left, right, up and down. #turtle","iconbackground":"#007FFF","icon":"Files","iconArtId":null,"splashArtId":null,"time":1384435139,"priority":10000},
{"name":"sketch drawings demo","id":"cyzs","rootid":"cyzs","userid":"jeiv","description":"","iconbackground":"#008000","icon":"Warning","iconArtId":null,"splashArtId":null,"time":1384440074,"priority":10000},
{"name":"skill levels","id":"lghma","rootid":"buuc","userid":"jeiv","description":"A description of the skill levels to modify the editor appearance. #docs","iconbackground":"#FF0038","icon":"ThreeColumn","iconArtId":null,"splashArtId":null,"time":1419032993,"priority":10000},
{"name":"social app tutorials","id":"ajpm","rootid":"gvyja","userid":"jeiv","description":"Interactive tutorials to build apps that share data between users. #docs #tutorials","iconbackground":"#A52A2A","icon":"Tree","iconArtId":null,"splashArtId":null,"time":1399010884,"priority":10000,"parentTopic":"tutorials"},
{"name":"social coding","id":"mlblb","rootid":"kplh","userid":"jeiv","description":"Understanding the script lifecycle in TouchDevelop #docs","iconbackground":"#E25822","icon":"Command","iconArtId":null,"splashArtId":null,"time":1416352786,"priority":18,"parentTopic":"contents"},
{"name":"song shaker","id":"lfzo","rootid":"sqrf","userid":"jeiv","description":"Learn how to build a script that plays random song when you shake the phone #docs #games #tutorials","iconbackground":"#800080","icon":"InfoCircle","iconArtId":null,"splashArtId":null,"time":1384241542,"priority":10000,"platforms":["accelerometer","media","musicandsounds"]},
{"name":"song shaker template","id":"uykla","rootid":"qcre","userid":"jeiv","description":"Shake to play music!","iconbackground":"#007FFF","icon":"Anchor","iconArtId":null,"splashArtId":null,"time":1382935124,"priority":10000,"platforms":["accelerometer"]},
{"name":"song shaker tutorial","id":"vqwxa","rootid":"sqrf","userid":"jeiv","description":"Learn how to build a script that plays random song when you shake the phone #docs #games #tutorials","iconbackground":"#EEDC82","icon":"Signal","iconArtId":null,"splashArtId":null,"time":1403930466,"priority":10000,"platforms":["accelerometer","media","musicandsounds"]},
{"name":"soundboard demo","id":"vxii","rootid":"matlavjh","userid":"jeiv","description":"Demo of the soundbaord tutorial.","iconbackground":"#FF00FF","icon":"SoundHigh","iconArtId":null,"splashArtId":null,"time":1383539953,"priority":10000,"platforms":["musicandsounds"]},
{"name":"soundboard tutorial","id":"uoozb","rootid":"matlavjh","userid":"jeiv","description":"Learn how to build a sound beat box using boxes. #docs #tutorials #pages #stepbystep","iconbackground":"#FF00FF","icon":"SoundHigh","iconArtId":null,"splashArtId":null,"time":1415076478,"priority":10000,"platforms":["musicandsounds"],"screenshot":"https://az31353.vo.msecnd.net/pub/edwmwvjo","parentTopic":"gametutorials"},
{"name":"speech","id":"lioqb","rootid":"tfrv","userid":"jeiv","description":"An overview of the speech related actions. #docs #speech","iconbackground":"#DAA520","icon":"Mic","iconArtId":null,"splashArtId":null,"time":1370997010,"priority":10000,"platforms":["speech"]},
{"name":"spiral maker scratch tutorial","id":"jeue","rootid":"pctm","userid":"jeiv","description":"","iconbackground":"#FDEE00","icon":"Lightbulb","iconArtId":null,"splashArtId":null,"time":1387344026,"priority":10000},
{"name":"sprite interaction tutorial","id":"fzqr","rootid":"tnfra","userid":"jeiv","description":"#docs #tutorial","iconbackground":"#FF2800","icon":"Fit","iconArtId":null,"splashArtId":null,"time":1413576254,"priority":10000},
{"name":"square poll tutorial","id":"jmyua","rootid":"wnljijkz","userid":"jeiv","description":"A tutorial to build an online poll. #docs #tutorials #stepByStep","iconbackground":"#FFA500","icon":"FourColumn","iconArtId":null,"splashArtId":null,"time":1403813705,"priority":10000,"platforms":["clouddata"]},
{"name":"string casing","id":"bvyn","rootid":"ekrf","userid":"jeiv","description":"A piece of text. #docs #StringToLowerCase","iconbackground":"#800080","icon":"ABC","iconArtId":null,"splashArtId":null,"time":1368129984,"priority":10000},
{"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":"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":"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},
{"name":"touchdevelop lingo","id":"osjjb","rootid":"ayxftkzb","userid":"jeiv","description":"A script to translate the TouchDevelop UI.","iconbackground":"#FFA500","icon":"FourColumn","iconArtId":null,"splashArtId":null,"time":1405111182,"priority":10000,"platforms":["translation"]},
{"name":"touchdevelop local","id":"dbjyb","rootid":"hdgs","userid":"jeiv","description":"Explains how to export a script to the App Store. #docs","iconbackground":"#007FFF","icon":"GlobeEUA","iconArtId":null,"splashArtId":null,"time":1421106164,"priority":10000,"parentTopic":"contents"},
{"name":"translating docs","id":"nfze","rootid":"nfze","userid":"jeiv","description":"How to help translating docs. #docs","iconbackground":"#F5DEB3","icon":"Watch","iconArtId":null,"splashArtId":null,"time":1386099740,"priority":10000},
{"name":"turtle fractals tutorial","id":"awwwa","rootid":"lfqv","userid":"jeiv","description":"Learn how to draw incredible drawings with recursion and the turtle! #docs #tutorials #turtle #stepbystep","iconbackground":"#FF7518","icon":"SMSAlt","iconArtId":null,"splashArtId":null,"time":1414649981,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/piztqcln"},
{"name":"turtle keyboard","id":"dkqba","rootid":"dkqba","userid":"jeiv","description":"#turtle","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1418280649,"priority":10000},
{"name":"turtle keyboard tutorial","id":"znrnc","rootid":"wxcxb","userid":"jeiv","description":"A tutorial to learn how to use the keyboard to control the turtle. #turtle #docs #tutorials #stepByStep","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1418363158,"priority":10000},
{"name":"turtle notes","id":"ixbc","rootid":"qjvtnqox","userid":"jeiv","description":"The notes associated to the 'love me not' tutorial. #docs","iconbackground":"#008000","icon":"AlignCenter","iconArtId":null,"splashArtId":null,"time":1415066868,"priority":10000},
{"name":"turtle ramp up examples","id":"juqg","rootid":"acaiqrll","userid":"jeiv","description":"#turtle","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1412920367,"priority":10000},
{"name":"turtle ramp up tutorial","id":"cojh","rootid":"bduiuwwq","userid":"jeiv","description":"A quick ramp up tutorail to learn TouchDevelop #turtle #docs #stepByStep","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1417736293,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/yscsjswl"},
{"name":"turtle shapes 2 tutorial","id":"lhdma","rootid":"vgekb","userid":"jeiv","description":"An interactive tutorial to learn geometric shapes. #docs #tutorials #stepByStep #tutorial","iconbackground":"#00CC99","icon":"Erase","iconArtId":null,"splashArtId":null,"time":1418279582,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/gvzmkxvo"},
{"name":"turtle shapes tutorial","id":"dujg","rootid":"vgekb","userid":"jeiv","description":"An interactive tutorial to learn geometric shapes. #docs #tutorials #stepByStep #tutorial","iconbackground":"#FF7518","icon":"Erase","iconArtId":null,"splashArtId":null,"time":1418279603,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/gvzmkxvo"},
{"name":"turtle snowflake tutorial","id":"azgqa","rootid":"lfqv","userid":"jeiv","description":"Learn how to draw Koch snowflake fractals with the turtle. #docs #tutorials #turtle #stepbystep","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1415054966,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/ikidmsox"},
{"name":"turtle tree tutorial","id":"aepmb","rootid":"qkiw","userid":"jeiv","description":"A turtle that draws a tree. #docs #tutorials #stepbystep","iconbackground":"#007FFF","icon":"snowflake","iconArtId":null,"splashArtId":null,"time":1417736359,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/otbheubo"},
{"name":"turtle triangle spiral tutorial","id":"ycje","rootid":"qkiw","userid":"jeiv","description":"A tutorial to learn to draw spirals with turtle. #docs #tutorials #stepbystep","iconbackground":"#007FFF","icon":"snowflake","iconArtId":null,"splashArtId":null,"time":1415054919,"priority":10000,"screenshot":"https://az31353.vo.msecnd.net/pub/tngqslcx"},
{"name":"turtle tutorials","id":"nzfda","rootid":"ofmd","userid":"jeiv","description":"A set of interactive tutorials for users new to programming. #docs #tutorials","iconbackground":"#FF00FF","icon":"PieChart","iconArtId":null,"splashArtId":null,"time":1418281876,"priority":10000,"parentTopic":"tutorials"},
{"name":"turtle-a-sketch tutorial","id":"cjfmb","rootid":"pntza","userid":"jeiv","description":"A tutorial to make the turtle follow the touch point #turtle #docs #tutorials #stepByStep","iconbackground":"#007FFF","icon":"Snowflake","iconArtId":null,"splashArtId":null,"time":1418281928,"priority":10000},
{"name":"tutorial playground","id":"objv","rootid":"objv","userid":"jeiv","description":"","iconbackground":"#FDEE00","icon":"Pen","iconArtId":null,"splashArtId":null,"time":1383503483,"priority":10000},
{"name":"tutorial template","id":"ryzld","rootid":"lazr","userid":"jeiv","description":"A tutorial. #docs #tutorials #stepbystep","iconbackground":"#9955BB","icon":"SignalAlt","iconArtId":null,"splashArtId":null,"time":1395865565,"priority":10000},
{"name":"tutorials","id":"oqsm","rootid":"awiza","userid":"jeiv","description":"A list of TouchDevelop tutorials. #docs #tutorials","iconbackground":"#E25822","icon":"Video","iconArtId":null,"splashArtId":null,"time":1417788406,"priority":2,"parentTopic":"contents"},
{"name":"user accounts","id":"wekpa","rootid":"xmdf","userid":"jeiv","description":"Publishing in TouchDevelop requires a user account. #docs","iconbackground":"#007FFF","icon":"BusinessPerson","iconArtId":null,"splashArtId":null,"time":1412701883,"priority":10000,"parentTopic":"socialcoding"},
{"name":"user input","id":"ojixa","rootid":"pwiea","userid":"jeiv","description":"Learn how to get input from the user. #docs","iconbackground":"#FFA500","icon":"Cube","iconArtId":null,"splashArtId":null,"time":1412666197,"priority":10000,"parentTopic":"language"},
{"name":"user score","id":"pizoa","rootid":"blkx","userid":"jeiv","description":"what is my score? #docs #userScore #bazaar","iconbackground":"#008080","icon":"ABC","iconArtId":null,"splashArtId":null,"time":1412686867,"priority":10000,"parentTopic":"socialcoding"},
{"name":"var","id":"nlgzb","rootid":"bdjba","userid":"jeiv","description":"A local variable where you can store and read a value. #docs #var #language","iconbackground":"#00008B","icon":"ShoppingCart","iconArtId":null,"splashArtId":null,"time":1412665855,"priority":10000,"parentTopic":"language"},
{"name":"videos","id":"jzpoa","rootid":"qmvx","userid":"jeiv","description":"Tutorials videos #docs #videos","iconbackground":"#00008B","icon":"Suitcase","iconArtId":null,"splashArtId":null,"time":1377556183,"priority":10000},
{"name":"voice commands","id":"jpue","rootid":"jpue","userid":"jeiv","description":"List of voice commands #docs #wp8","iconbackground":"#FF7518","icon":"AlignCenter","iconArtId":null,"splashArtId":null,"time":1370322986,"priority":10000},
{"name":"web requests","id":"qaeq","rootid":"ezdyb","userid":"jeiv","description":"Send HTTP requests and read HTTP responses. #docs #webRequests #web #apps","iconbackground":"#E3256B","icon":"Wifi","iconArtId":null,"splashArtId":null,"time":1384241473,"priority":10000},
{"name":"what's new?","id":"vozrb","rootid":"jiuk","userid":"jeiv","description":"release notes #docs","iconbackground":"#A52A2A","icon":"Share","iconArtId":null,"splashArtId":null,"time":1422456994,"priority":1,"platforms":["accelerometer","location","maps","cloudservices"],"parentTopic":"contents"},
{"name":"what's new? 2013","id":"tmtj","rootid":"jiuk","userid":"jeiv","description":"release notes #docs","iconbackground":"#FF2800","icon":"ApproveButton","iconArtId":null,"splashArtId":null,"time":1422891003,"priority":10000,"parentTopic":"whatsnew"},
{"name":"where","id":"bmmha","rootid":"dzdh","userid":"jeiv","description":"Limit the scope of for each loop #docs #forEach #where #language","iconbackground":"#85BB65","icon":"Question","iconArtId":null,"splashArtId":null,"time":1412666005,"priority":10000,"parentTopic":"language"},
{"name":"while","id":"uuuya","rootid":"ykdm","userid":"jeiv","description":"Repeat code while a condition remains true. #docs #while #language","iconbackground":"#E25822","icon":"Cycle","iconArtId":null,"splashArtId":null,"time":1412688421,"priority":10000,"parentTopic":"language"},
{"name":"word hunt tutorial","id":"prmgb","rootid":"auqsa","userid":"jeiv","description":"A tutorial to build a fun word guessing game. #docs #stepByStep #tutorial","iconbackground":"#9955BB","icon":"Controller","iconArtId":null,"splashArtId":null,"time":1416508766,"priority":10000,"platforms":["accelerometer"],"screenshot":"https://az31353.vo.msecnd.net/pub/ohcqfviv"}
], [
{"title":"blank","id":"blank","icon":"ABC","description":"An empty script, which doesn't do anything.","section":"templates","name":"ADJ script","scriptid":"spbd"},
{"title":"blank game","id":"game","icon":"Controller","name":"ADJ game","description":"Boiler plate code to create a game.","section":"templates","scriptid":"djjlc"},
{"title":"blank app","id":"pages","icon":"AddressBook","name":"ADJ app","description":"An empty app using pages and boxes.","section":"templates","scriptid":"qetpa"},
{"title":"blank turtle","id":"blankturtle","icon":"Controller","name":"ADJ drawing","description":"An turtle app.","section":"beginners","scriptid":"parp"},
{"title":"blank scratch","id":"blankscratch","icon":"Controller","name":"ADJ app","description":"An empty app using the scratch library.","section":"beginners","scriptid":"enyra"},
{"title":"blank pixel art","id":"blankpixelart","icon":"NineColumn","name":"ADJ art","description":"A pixel art app.","section":"beginners","scriptid":"mdrw"},
{"title":"blank cordova library","id":"blankcordovalibrary","icon":"ApproveButton","name":"cordova ADJ plugin","description":"An wrapper around an Apache Cordova plugin.","section":"apps","scriptid":"gtfla"},
{"title":"blank express web site","id":"blankexpresswebsite","icon":"Stacks","name":"ADJ web","description":"An Express web site.","section":"web sites","scriptid":"dywha"},
{"title":"blank restify web site","id":"blankrestifywebsite","icon":"Stacks","name":"ADJ web","description":"A Restify web api.","section":"web sites","scriptid":"irjz"},
{"title":"blank node library","id":"blanknodelibrary","icon":"ArrowStandardCircle","name":"node ADJ package","description":"An wrapper for a node package.","section":"web sites","scriptid":"ibksb"},
{"title":"blank arduino","id":"blankarduino","icon":"ArrowCircleRounded","name":"ADJ sketch","description":"An empty Arduino sketch.","section":"makers","scriptid":"cqnha"},
{"title":"blank esplora","id":"blankesplora","icon":"Controller","name":"ADJ esplora","description":"An empty Arduino Esplora script.","section":"makers","scriptid":"lsrh"},
{"title":"blank engduino","id":"blankengduino","icon":"Controller","name":"ADJ engduino","description":"An empty Engduino script.","section":"makers","scriptid":"bhjyb"},
{"title":"blank tutorial","id":"blanktutorial","icon":"Controller","name":"ADJ tutorial","description":"An empty interactive tutorial.","section":"touchdevelop","scriptid":"wonx"},
,
{"title":"blank script plugin","id":"blankscriptplugin","icon":"Brush","name":"ADJ plugin","description":"An empty script editor plugin.","section":"touchdevelop","scriptid":"tiwt"},
{"title":"blank office mix","id":"blankofficemix","icon":"Controller","name":"ADJ mix app","description":"An empty Office Mix app.","section":"others","scriptid":"exvp"}
]