var pxtTargetBundle = {
  "id": "pxt-lrf",
  "name": "LRF Blocks",
  "title": "Little Robot Friends Code Editor",
  "corepkg": "core",
  "bundleddirs": [
    "libs/core"
  ],
  "runtime": {
    "mathBlocks": true,
    "textBlocks": false,
    "listsBlocks": true,
    "variablesBlocks": true,
    "functionBlocks": true,
    "logicBlocks": true,
    "loopsBlocks": true,
    "onStartUnDeletable": false
  },
  "simulator": {
    "autoRun": true,
    "hideFullscreen": false,
    "headless": true
  },
  "appTheme": {
    "accentColor": "#fefefe",
    "boardName": "Little Robot Friend",
    "logoUrl": "https://littlerobotfriends.com/",
    "homeUrl": "https://littlerobotfriends.com/",
    "privacyUrl": "https://littlerobotfriends.com/",
    "termsOfUseUrl": "https://littlerobotfriends.com/",
    "coloredToolbox": true,
    "invertedMenu": true,
    "blocklyOptions": {
      "grid": {
        "spacing": 45,
        "length": 7,
        "colour": "rgba(189, 195, 199, 0.30)",
        "snap": true
      },
      "trashcan": true
    },
    "disableBlockIcons": false,
    "blocksOnly": true,
    "blockHats": true,
    "logo": "data:image/png;base64, ",
    "organization": "Little Robot Friends",
    "organizationLogo": "data:image/png;base64, ",
    "__UNCOMMENT_FOR_MENUS__": {
      "hideSideDocs": true,
      "sideDoc": "tutorials/getting-started",
      "docMenu": [
        {
          "name": "Getting started",
          "tutorial": true,
          "path": "/tutorials/getting-started"
        },
        {
          "name": "Next Steps",
          "tutorial": true,
          "path": "/tutorials/next-steps"
        }
      ]
    },
    "TOC": [
      {
        "name": "Blocks",
        "subitems": [
          {
            "name": "On Start",
            "subitems": [],
            "path": "/blocks/on-start",
            "prevName": "Blocks",
            "prevPath": "/blocks",
            "nextName": "Loops",
            "nextPath": "/blocks/loops"
          },
          {
            "name": "Loops",
            "subitems": [
              {
                "name": "repeat",
                "subitems": [],
                "path": "/blocks/loops/repeat",
                "prevName": "Loops",
                "prevPath": "/blocks/loops",
                "nextName": "for",
                "nextPath": "/blocks/loops/for"
              },
              {
                "name": "for",
                "subitems": [],
                "path": "/blocks/loops/for",
                "prevName": "repeat",
                "prevPath": "/blocks/loops/repeat",
                "nextName": "while",
                "nextPath": "/blocks/loops/while"
              },
              {
                "name": "while",
                "subitems": [],
                "path": "/blocks/loops/while",
                "prevName": "for",
                "prevPath": "/blocks/loops/for",
                "nextName": "Logic",
                "nextPath": "/blocks/logic"
              }
            ],
            "path": "/blocks/loops",
            "prevName": "On Start",
            "prevPath": "/blocks/on-start",
            "nextName": "repeat",
            "nextPath": "/blocks/loops/repeat"
          },
          {
            "name": "Logic",
            "subitems": [
              {
                "name": "if",
                "subitems": [],
                "path": "/blocks/logic/if",
                "prevName": "Logic",
                "prevPath": "/blocks/logic",
                "nextName": "Boolean",
                "nextPath": "/blocks/logic/boolean"
              },
              {
                "name": "Boolean",
                "subitems": [],
                "path": "/blocks/logic/boolean",
                "prevName": "if",
                "prevPath": "/blocks/logic/if",
                "nextName": "Variables",
                "nextPath": "/blocks/variables"
              }
            ],
            "path": "/blocks/logic",
            "prevName": "while",
            "prevPath": "/blocks/loops/while",
            "nextName": "if",
            "nextPath": "/blocks/logic/if"
          },
          {
            "name": "Variables",
            "subitems": [
              {
                "name": "assign",
                "subitems": [],
                "path": "/blocks/variables/assign",
                "prevName": "Variables",
                "prevPath": "/blocks/variables",
                "nextName": "change var",
                "nextPath": "/blocks/variables/change"
              },
              {
                "name": "change var",
                "subitems": [],
                "path": "/blocks/variables/change",
                "prevName": "assign",
                "prevPath": "/blocks/variables/assign",
                "nextName": "var",
                "nextPath": "/blocks/variables/var"
              },
              {
                "name": "var",
                "subitems": [],
                "path": "/blocks/variables/var",
                "prevName": "change var",
                "prevPath": "/blocks/variables/change",
                "nextName": "Math",
                "nextPath": "/blocks/math"
              }
            ],
            "path": "/blocks/variables",
            "prevName": "Boolean",
            "prevPath": "/blocks/logic/boolean",
            "nextName": "assign",
            "nextPath": "/blocks/variables/assign"
          },
          {
            "name": "Math",
            "subitems": [],
            "path": "/blocks/math",
            "prevName": "var",
            "prevPath": "/blocks/variables/var",
            "nextName": "JavaScript blocks",
            "nextPath": "/blocks/javascript-blocks"
          },
          {
            "name": "JavaScript blocks",
            "subitems": [],
            "path": "/blocks/javascript-blocks",
            "prevName": "Math",
            "prevPath": "/blocks/math",
            "nextName": "Custom blocks",
            "nextPath": "/blocks/custom"
          },
          {
            "name": "Custom blocks",
            "subitems": [],
            "path": "/blocks/custom",
            "prevName": "JavaScript blocks",
            "prevPath": "/blocks/javascript-blocks",
            "nextName": "JavaScript",
            "nextPath": "/javascript"
          }
        ],
        "path": "/blocks",
        "nextName": "On Start",
        "nextPath": "/blocks/on-start"
      },
      {
        "name": "JavaScript",
        "subitems": [
          {
            "name": "Calling",
            "subitems": [],
            "path": "/javascript/call",
            "prevName": "JavaScript",
            "prevPath": "/javascript",
            "nextName": "Sequencing",
            "nextPath": "/javascript/sequence"
          },
          {
            "name": "Sequencing",
            "subitems": [],
            "path": "/javascript/sequence",
            "prevName": "Calling",
            "prevPath": "/javascript/call",
            "nextName": "Variables",
            "nextPath": "/javascript/variables"
          },
          {
            "name": "Variables",
            "subitems": [],
            "path": "/javascript/variables",
            "prevName": "Sequencing",
            "prevPath": "/javascript/sequence",
            "nextName": "Operators",
            "nextPath": "/javascript/operators"
          },
          {
            "name": "Operators",
            "subitems": [],
            "path": "/javascript/operators",
            "prevName": "Variables",
            "prevPath": "/javascript/variables",
            "nextName": "Statements",
            "nextPath": "/javascript/statements"
          },
          {
            "name": "Statements",
            "subitems": [],
            "path": "/javascript/statements",
            "prevName": "Operators",
            "prevPath": "/javascript/operators",
            "nextName": "Functions",
            "nextPath": "/javascript/functions"
          },
          {
            "name": "Functions",
            "subitems": [],
            "path": "/javascript/functions",
            "prevName": "Statements",
            "prevPath": "/javascript/statements",
            "nextName": "Types",
            "nextPath": "/javascript/types"
          },
          {
            "name": "Types",
            "subitems": [],
            "path": "/javascript/types",
            "prevName": "Functions",
            "prevPath": "/javascript/functions",
            "nextName": "Classes",
            "nextPath": "/javascript/classes"
          },
          {
            "name": "Classes",
            "subitems": [],
            "path": "/javascript/classes",
            "prevName": "Types",
            "prevPath": "/javascript/types",
            "nextName": "Interfaces",
            "nextPath": "/javascript/interfaces"
          },
          {
            "name": "Interfaces",
            "subitems": [],
            "path": "/javascript/interfaces",
            "prevName": "Classes",
            "prevPath": "/javascript/classes",
            "nextName": "Generics",
            "nextPath": "/javascript/generics"
          },
          {
            "name": "Generics",
            "subitems": [],
            "path": "/javascript/generics",
            "prevName": "Interfaces",
            "prevPath": "/javascript/interfaces",
            "nextName": "Types",
            "nextPath": "/types"
          }
        ],
        "path": "/javascript",
        "prevName": "Custom blocks",
        "prevPath": "/blocks/custom",
        "nextName": "Calling",
        "nextPath": "/javascript/call"
      },
      {
        "name": "Types",
        "subitems": [
          {
            "name": "Number",
            "subitems": [],
            "path": "/types/number",
            "prevName": "Types",
            "prevPath": "/types",
            "nextName": "String",
            "nextPath": "/types/string"
          },
          {
            "name": "String",
            "subitems": [],
            "path": "/types/string",
            "prevName": "Number",
            "prevPath": "/types/number",
            "nextName": "Boolean",
            "nextPath": "/types/boolean"
          },
          {
            "name": "Boolean",
            "subitems": [],
            "path": "/types/boolean",
            "prevName": "String",
            "prevPath": "/types/string",
            "nextName": "Array",
            "nextPath": "/types/array"
          },
          {
            "name": "Array",
            "subitems": [],
            "path": "/types/array",
            "prevName": "Boolean",
            "prevPath": "/types/boolean",
            "nextName": "Function",
            "nextPath": "/types/function"
          },
          {
            "name": "Function",
            "subitems": [],
            "path": "/types/function",
            "prevName": "Array",
            "prevPath": "/types/array",
            "nextName": "Support",
            "nextPath": "/support"
          }
        ],
        "path": "/types",
        "prevName": "Generics",
        "prevPath": "/javascript/generics",
        "nextName": "Number",
        "nextPath": "/types/number"
      },
      {
        "name": "",
        "subitems": [
          {
            "name": "Support",
            "subitems": [],
            "path": "/support",
            "prevName": "Function",
            "prevPath": "/types/function",
            "nextName": "FAQ",
            "nextPath": "/faq"
          },
          {
            "name": "FAQ",
            "subitems": [],
            "path": "/faq",
            "prevName": "Support",
            "prevPath": "/support",
            "nextName": "Translate",
            "nextPath": "/translate"
          },
          {
            "name": "Translate",
            "subitems": [],
            "path": "/translate",
            "prevName": "FAQ",
            "prevPath": "/faq",
            "nextName": "Sharing projects",
            "nextPath": "/share"
          },
          {
            "name": "Sharing projects",
            "subitems": [],
            "path": "/share",
            "prevName": "Translate",
            "prevPath": "/translate",
            "nextName": "Offline support",
            "nextPath": "/offline"
          },
          {
            "name": "Offline support",
            "subitems": [],
            "path": "/offline",
            "prevName": "Sharing projects",
            "prevPath": "/share",
            "nextName": "Streaming",
            "nextPath": "/streaming"
          },
          {
            "name": "Streaming",
            "subitems": [],
            "path": "/streaming",
            "prevName": "Offline support",
            "prevPath": "/offline"
          }
        ],
        "prevName": "Function",
        "prevPath": "/types/function"
      }
    ],
    "embedUrl": "https://littlerobotfriends.com/",
    "id": "pxt-lrf",
    "title": "Little Robot Friends Code Editor",
    "name": "LRF Blocks",
    "logoCDN": "@cdnUrl@/blob/b6b5ed6113fd0e3fc9b5e19640c8d78c4c34fcb1/lrf-128.png",
    "organizationLogoCDN": "@cdnUrl@/blob/f7933159bf11db88863be6747cb444a3fb82ef67/lrf-logo.png",
    "htmlDocIncludes": {}
  },
  "blocksprj": {
    "id": "blocksprj",
    "config": {
      "name": "{0}",
      "dependencies": {
        "core": "*"
      },
      "description": "",
      "files": [
        "main.blocks",
        "main.ts",
        "README.md"
      ]
    },
    "files": {
      "README.md": " ",
      "main.blocks": "<xml xmlns=\"http://www.w3.org/1999/xhtml\">\n  <variables>\n    <variable type=\"\" id=\"`7v|j,;HLu7qOl:[H:{9\">flag</variable>\n    <variable type=\"\" id=\"$7Z*cLt4dTj@TA(fS,[b\">item</variable>\n  </variables>\n  <block type=\"pxt-on-start\" id=\"K};|Tv3xxqoh;GE/$Km1\" deletable=\"true\" x=\"0\" y=\"0\">\n    <statement name=\"HANDLER\">\n      <block type=\"set_eye_color_both\" id=\"{FDch!vqFLL+o8p6v)GS\">\n        <field name=\"color\">LRFColour.red</field>\n      </block>\n    </statement>\n  </block>\n  <block type=\"on_hair_touched\" id=\"=5Mad=zYsYXwlH=8Oyt,\" x=\"0\" y=\"90\">\n    <field name=\"type\">LRFTouchEventType.tapped</field>\n    <statement name=\"HANDLER\">\n      <block type=\"set_eye_color_both\" id=\"xtLq:3MIanS@pe`}WV@F\">\n        <field name=\"color\">LRFColour.blue</field>\n      </block>\n    </statement>\n  </block>\n</xml>\n",
      "main.ts": "LRFInputEvents.onHairTouchedEvent(LRFTouchEventType.tapped, function () {\n    LRFEyeMessages.setEyeColorBoth(LRFColour.blue)\n})\nLRFEyeMessages.setEyeColorBoth(LRFColour.red)\n"
    }
  },
  "tsprj": {
    "id": "tsprj",
    "config": {
      "name": "{0}",
      "dependencies": {
        "core": "*"
      },
      "description": "",
      "files": [
        "main.ts",
        "README.md"
      ]
    },
    "files": {
      "README.md": " ",
      "main.ts": "LRFInputEvents.onHairTouchedEvent(LRFTouchEventType.tapped, function () {\n    LRFEyeMessages.setEyeColorBoth(LRFColour.blue)\n})\nLRFEyeMessages.setEyeColorBoth(LRFColour.red)\n"
    }
  },
  "bundledpkgs": {
    "core": {
      "README.md": "# basic\n\nAdd your docs here...",
      "enums.d.ts": "declare const enum Direction {\n    //% block=left\n    Left,\n    //% block=right\n    Right\n}\n\n//% block\ndeclare const enum LRFOctave {\n    lowest,\n    low,\n    midLow,\n    mid,\n    midhigh,\n    high,\n    higher,\n    highest\n}\n\ndeclare const enum LRFNote {\n    a,\n    as,\n    b,\n    c,\n    cs,\n    d,\n    ds,\n    e,\n    f,\n    fs,\n    g,\n    gs,\n    mute,\n    null = 15\n}\n\ndeclare const enum LRFIntonation {\n    flat,\n    rising,\n    falling,\n    peaking,\n    dipping\n}\n\ndeclare const enum LRFDuration {\n    short = 1, //1 block\n    doubleShort = 2, //2 blocks\n    medium = 3, //4 blocks\n    doubleMedium = 4, //8 blocks\n    long = 5, //16 blocks\n    doubleLong = 6,\n    veryLong = 7,\n    none = 0\n}\n\ndeclare const enum LRFColour {\n    red = 1,\n    green = 2,\n    blue = 3,\n    orange = 4,\n    cyan = 5,\n    purple = 6,\n    yellow = 7,\n    pink = 8,\n    white = 15,\n    none = 0\n}\n\ndeclare const enum LRFHelloExpression {\n    // Hellos (3)\n    //% blockId='hello' block='hello'\n    hello = 0,\n    //% blockId='happy-hello' block='happy-hello'\n    happyHello = 1,\n    //% blockId='angry-hello' block='angry-hello'\n    angryHello = 2\n}\n\ndeclare const enum LRFMoodExpression {\n    // Moods (8)\n    // % blockId='happy' block='happy'\n    happy = 3,\n    // % blockId='very-happy' block='very-happy'\n    veryHappy = 4,\n    // % blockId='excited' block='excited'\n    excited = 5,\n    // % blockId='very-excited' block='very-excited'\n    veryExcited = 6,\n    // % blockId='annoyed' block='annoyed'\n    annoyed = 7,\n    // % blockId='very-annoyed' block='very-annoyed'\n    veryAnnoyed = 8,\n    // % blockId='angry' block='angry'\n    angry = 9,\n    // % blockId='very-angry' block='very-angry'\n    veryAngry = 10,\n}\n\ndeclare const enum LRFLaughExpression {\n    // Laughs (4)\n    // % blockId='giggle' block='giggle'\n    giggle = 11,\n    // % blockId='laugh' block='laugh'\n    laugh = 12,\n    // % blockId='hysterical' block='hysterical'\n    hysterical = 13,\n    // % blockId='evil-cackle' block='evil-cackle'\n    evilCackle = 14\n}\n\ndeclare const enum LRFCryExpression {\n    // Cries (2)\n    // % blockId='pout' block='pout'\n    pout = 15,\n    // % blockId='sob' block='sob'\n    sob = 16\n}\n\ndeclare const enum LRFScaredExpression {\n    // Scared (3)\n    // % blockId='scared' block='scared'\n    scared = 17,\n    // % blockId='terrified' block='terrified'\n    terrified = 18,\n    // % blockId='relieved' block='relieved'\n    relieved = 19\n}\n\ndeclare const enum LRFSleepyExpression {\n\n    // Sleepy (3)\n    // % blockId='bored' block='bored'\n    bored = 20,\n    // % blockId='yawn' block='yawn'\n    yawn = 21,\n    // % blockId='snoring' block='snoring'\n    snoring = 22\n}\n\ndeclare const enum LRFSystemExpression {\n    // System (3)\n    // % blockId='hungry block='hungry\n    hungry = 23,\n    // % blockId='power-up' block='power-up'\n    powerUp = 24,\n    // % blockId='alarm' block='alarm'\n    alarm = 25\n}\n\ndeclare const enum LRFMiscExpression {\n    // % blockId='awww' block='awww'\n    awww = 26,\n    // % blockId='yikes' block='yikes'\n    yikes = 27,\n    // % blockId='whoa-up' block='whoa-up'\n    whoaUp = 28,\n    // % blockId='whoa-down' block='whoa-down'\n    whoaDown = 29,\n    // % blockId='whoa-whoa-whoa' block='whoa-whoa-whoa'\n    whoaWhoaWhoa = 30,\n\n    // Special\n    custom = 0xa0,\n    temp = 0xfd,\n    signature = 0xfe,\n    null = 0xff\n}\n\ndeclare const enum LRFTouchEventType {\n    tapped,\n    tickled,\n    //% block=\"held/hugged\"\n    holdHug\n}\n\ndeclare const enum LRFSoundSensorEventType {\n    normal,\n    loud\n}\n\ndeclare const enum LRFLightSensorEventType {\n    //% block=\"dark for too long\"\n    tooDarkLong,\n    dark,\n    normal,\n    bright,\n    //% block=\"bright for too long\"\n    tooBrightLong\n}\n\ndeclare const enum LRFMotionSensorEventType {\n    //% block=\"tilt left\"\n    tiltLeft,\n    //% block=\"tilt right\"\n    tiltRight,\n    //% block=\"lay left\"\n    layLeft,\n    //% block=\"lay right\"\n    layRight,\n    shake\n}\n\ndeclare const enum LRFBrainSensorEventType {\n    hungry,\n    bored\n}\n\ndeclare const enum LRFTouchSensorChannel {\n  hair,\n  left,\n  right\n}\n\ndeclare const enum LRFMotionSensorChannel {\n  x,\n  y,\n  z\n}\n\ndeclare const enum LRFInputs {\n    hair,\n    leftHand,\n    rightHand,\n    soundSensor,\n    lightSensor,\n    motionSensor,\n    brainSensor\n}\n",
      "ns.ts": "//% color=#DD0078\n//% block=\"Speech & Sounds\"\n//% icon=\"\\uf0a1\"\n//% weight=130\nnamespace LRFSoundMessages {\n\n}\n\n//% color=#0098BB\n//% block=\"Eyes & Patterns\"\n//% icon=\"\\uf06e\"\n//% weight=120\nnamespace LRFEyeMessages {\n\n}\n\n//% color=#EA8225\n//% block=\"Sensors & Events\"\n//% icon=\"\\uf0a4\"\n//% weight=110\nnamespace LRFInputEvents {\n\n}\n\n//% color=#53AD40\n//% block=\"Expressions\"\n//% icon=\"\\uf001\"\n//% weight=100\nnamespace LRFExpressions {\n\n}\n",
      "pxt-core.d.ts": "/// <reference no-default-lib=\"true\"/>\n\ninterface Array<T> {\n    /**\n      * Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.\n      */\n    //% shim=Array_::length weight=84\n    //% blockId=\"lists_length\" block=\"length of %VALUE\" blockBuiltin=true blockNamespace=\"arrays\"\n    length: number;\n\n    /**\n      * Appends new elements to an array.\n      * @param items New elements of the Array.\n      */\n    //% help=arrays/push\n    //% shim=Array_::push weight=49\n    //% blockId=\"array_push\" block=\"%list| add value %value| to end\" blockNamespace=\"arrays\"\n    push(item: T): void;\n\n    /**\n      * Removes the last element from an array and returns it.\n      */\n    //% help=arrays/pop\n    //% shim=Array_::pop weight=48\n    //% blockId=\"array_pop\" block=\"get and remove last value from %list\" blockNamespace=\"arrays\"\n    pop(): T;\n\n    /**\n      * Reverses the elements in an Array. The first array element becomes the last, and the last array element becomes the first.\n      */\n    //% help=arrays/reverse\n    //% helper=arrayReverse weight=10 advanced=true\n    //% blockId=\"array_reverse\" block=\"reverse %list\" blockNamespace=\"arrays\"\n    reverse(): void;\n\n    /**\n      * Removes the first element from an array and returns that element. This method changes the length of the array.\n      */\n    //% help=arrays/shift\n    //% helper=arrayShift weight=70 advanced=true\n    //% blockId=\"array_shift\" block=\"get and remove first value from %list\" blockNamespace=\"arrays\"\n    shift(): T;\n\n    /**\n      * Adds one element to the beginning of an array and returns the new length of the array.\n      * @param element to insert at the start of the Array.\n      */\n    //% help=arrays/unshift\n    //% helper=arrayUnshift weight=69 advanced=true\n    //% blockId=\"array_unshift\" block=\"%list| insert %value| at beginning\" blockNamespace=\"arrays\"\n    //unshift(...values:T[]): number; //rest is not supported in our compiler yet.\n    unshift(value: T): number;\n\n    /**\n      * Returns a section of an array.\n      * @param start The beginning of the specified portion of the array. eg: 0\n      * @param end The end of the specified portion of the array. eg: 0\n      */\n    //% help=arrays/slice\n    //% helper=arraySlice weight=41 advanced=true blockNamespace=\"arrays\"\n    slice(start: number, end: number): T[];\n\n    /**\n      * Removes elements from an array.\n      * @param start The zero-based location in the array from which to start removing elements. eg: 0\n      * @param deleteCount The number of elements to remove. eg: 0\n      */\n    //% helper=arraySplice weight=40\n    splice(start: number, deleteCount: number): void;\n\n    /**\n      * Sorts the elements of an array in place and returns the array. The sort is not necessarily stable.\n      * @param specifies a function that defines the sort order. If omitted, the array is sorted according to the prmitive type\n      */\n    //% helper=arraySort weight=40\n    sort(callbackfn?: (value1: T, value2: T) => number): T[];\n\n    /**\n      * Calls a defined callback function on each element of an array, and returns an array that contains the results.\n      * @param callbackfn A function that accepts up to two arguments. The map method calls the callbackfn function one time for each element in the array.\n      */\n    //% helper=arrayMap weight=40\n    map<U>(callbackfn: (value: T, index: number) => U): U[];\n\n    /**\n      * Returns the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to two arguments. The filter method calls the callbackfn function one time for each element in the array.\n      */\n    //% helper=arrayFilter weight=40\n    filter(callbackfn: (value: T, index: number) => boolean): T[];\n\n    /**\n      * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to three arguments. The reduce method calls the callbackfn function one time for each element in the array.\n      * @param initialValue Initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    //% helper=arrayReduce weight=40\n    reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number) => U, initialValue: U): U;\n\n\n    /** Removes the first occurence of an object. Returns true if removed. */\n    //% shim=Array_::removeElement weight=48\n    removeElement(element: T): boolean;\n\n    /** Removes the object at position index. */\n    //% help=arrays/removeat\n    //% shim=Array_::removeAt weight=49 advanced=true\n    //% blockId=\"array_removeat\" block=\"%list| remove value at %index\" blockNamespace=\"arrays\"\n    removeAt(index: number): T;\n\n    /**\n     * Insert the value at a particular index, increases length by 1\n     * @param index the zero-based position in the list to insert the value, eg: 0\n     * @param the value to insert, eg: 0\n     */\n    //% help=arrays/insertat\n    //% shim=Array_::insertAt weight=84 advanced=true\n    //% blockId=\"array_insertAt\" block=\"%list| insert at %index| value %value\" blockNamespace=\"arrays\"\n    insertAt(index: number, value: T): void;\n\n    /**\n      * Returns the index of the first occurrence of a value in an array.\n      * @param item The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\n      */\n    //% help=arrays/indexof\n    //% shim=Array_::indexOf weight=50 advanced=true\n    //% blockId=\"array_indexof\" block=\"%list| find index of %value\" blockNamespace=\"arrays\"\n    indexOf(item: T, fromIndex?: number): number;\n\n    /**\n     * Gets the value at a particular index\n     * @param index the zero-based position in the list of the item, eg: 0\n     */\n    //% help=arrays/get\n    //% shim=Array_::getAt weight=85\n    get(index: number): T;\n\n    /**\n     * Stores the value at a particular index\n     * @param index the zero-based position in the list to store the value, eg: 0\n     * @param the value to insert, eg: 0\n     */\n    //% help=arrays/set\n    //% shim=Array_::setAt weight=84\n    set(index: number, value: T): void;\n\n    [n: number]: T;\n}\n\ndeclare interface String {\n    // This block is currently disabled in favor of the built-in Blockly \"Create text with\" block, which compiles to \"\" + \"\"\n    // Add % sign back to the block annotation to re-enable\n    /**\n     * Returns a string that contains the concatenation of two or more strings.\n     * @param other The string to append to the end of the string.\n     */\n    //% shim=String_::concat weight=49\n    //% blockId=\"string_concat\" blockNamespace=\"text\"\n    // block=\"join %list=text|%other\"\n    concat(other: string): string;\n\n    /**\n     * Returns the character at the specified index.\n     * @param index The zero-based index of the desired character.\n     */\n    //% shim=String_::charAt weight=48\n    //% help=text/char-at\n    //% blockId=\"string_get\" block=\"char from %this=text|at %pos\" blockNamespace=\"text\"\n    charAt(index: number): string;\n\n    /** Returns the length of a String object. */\n    //% property shim=String_::length weight=47\n    //% blockId=\"text_length\" block=\"length of %VALUE\" blockBuiltin=true blockNamespace=\"text\"\n    length: number;\n\n    /**\n     * Returns the Unicode value of the character at the specified location.\n     * @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.\n     */\n    //% shim=String_::charCodeAt\n    charCodeAt(index: number): number;\n\n    /**\n     * Determines whether relative order of two strings (in ASCII encoding).\n     * @param that String to compare to target string\n     */\n    //% shim=String_::compare\n    //% help=text/compare\n    //% blockId=\"string_compare\" block=\"compare %this=text| to %that\" blockNamespace=\"text\"\n    compare(that: string): number;\n\n    /**\n     * Return substring of the current string.\n     * @param start first character index; can be negative from counting from the end, eg:0\n     * @param length number of characters to extract\n     */\n    //% shim=String_::substr length.defl=1000000\n    //% help=text/substr\n    //% blockId=\"string_substr\" block=\"substring of %this=text|from %start|of length %length\" blockNamespace=\"text\"\n    substr(start: number, length?: number): string;\n\n    // This block is currently disabled, as it does not compile in some targets\n    // Add % sign back to the block annotation to re-enable\n    /** Returns a value indicating if the string is empty */\n    //% shim=String_::isEmpty\n    //% blockId=\"string_isempty\" blockNamespace=\"text\"\n    // block=\"%this=text| is empty\"\n    isEmpty(): boolean;\n\n    [index: number]: string;\n}\n\n/**\n  * Convert a string to an integer.\n  * @param s A string to convert into a number.\n  */\n//% shim=String_::toNumber\n//% help=text/parse-int\n//% blockId=\"string_parseint\" block=\"parse to integer %text\" blockNamespace=\"text\"\ndeclare function parseInt(text: string): number;\n\ninterface Object { }\ninterface Function { }\ninterface IArguments { }\ninterface RegExp { }\n\ntype uint8 = number;\ntype uint16 = number;\ntype uint32 = number;\ntype int8 = number;\ntype int16 = number;\ntype int32 = number;\n\n\ndeclare interface Boolean {\n    /**\n     * Returns a string representation of an object.\n     */\n    //% shim=Boolean_::toString\n    toString(): string;\n}\n\n/**\n * Combine, split, and search text strings.\n*/\n//% blockNamespace=\"Text\"\ndeclare namespace String {\n\n    /**\n     * Make a string from the given ASCII character code.\n     */\n    //% help=math/string-from-char-code\n    //% shim=String_::fromCharCode\n    //% advanced=true\n    //% blockNamespace=\"Math\" blockId=\"stringFromCharCode\" block=\"text from char code %code\" weight=1\n    function fromCharCode(code: number): string;\n}\n\ndeclare interface Number {\n    /**\n     * Returns a string representation of a number.\n     */\n    //% shim=Number_::toString\n    toString(): string;\n}\n\n/**\n * Add, remove, and replace items in lists.\n*/\n//% blockNamespace=\"Arrays\"\n//% weight=500\ndeclare namespace Array {\n}\n\n/**\n * More complex operations with numbers.\n*/\n//% weight=500\ndeclare namespace Math {\n    /**\n     * Returns the value of a base expression taken to a specified power.\n     * @param x The base value of the expression.\n     * @param y The exponent value of the expression.\n     */\n    //% shim=Math_::pow\n    function pow(x: number, y: number): number;\n\n    /**\n     * Returns a pseudorandom number between 0 and 1.\n     */\n    //% shim=Math_::random\n    //% helpUrl=\"/reference/math/random\"\n    function random(): number;\n\n    /**\n     * Returns a pseudorandom number between min and max included.\n     * If both numbers are integral, the result is integral.\n     * @param min the lower inclusive bound, eg: 0\n     * @param max the upper inclusive bound, eg: 10\n     */\n    //% blockId=\"device_random\" block=\"pick random %min|to %limit\"\n    //% helpUrl=\"/reference/math/random-range\"\n    //% shim=Math_::randomRange\n    function randomRange(min: number, max: number): number;\n\n    /**\n     * Returns the natural logarithm (base e) of a number.\n     * @param x A number\n     */\n    //% shim=Math_::log\n    function log(x: number): number;\n\n    /**\n     * Returns returns ``e^x``.\n     * @param x A number\n     */\n    //% shim=Math_::exp\n    function exp(x: number): number;\n\n    /**\n     * Returns the sine of a number.\n     * @param x An angle in radians\n     */\n    //% shim=Math_::sin\n    function sin(x: number): number;\n\n    /**\n     * Returns the cosine of a number.\n     * @param x An angle in radians\n     */\n    //% shim=Math_::cos\n    function cos(x: number): number;\n\n    /**\n     * Returns the tangent of a number.\n     * @param x An angle in radians\n     */\n    //% shim=Math_::tan\n    function tan(x: number): number;\n\n    /**\n     * Returns the arcsine (in radians) of a number\n     * @param x A number\n     */\n    //% shim=Math_::asin\n    function asin(x: number): number;\n\n    /**\n     * Returns the arccosine (in radians) of a number\n     * @param x A number\n     */\n    //% shim=Math_::acos\n    function acos(x: number): number;\n\n    /**\n     * Returns the arctangent (in radians) of a number\n     * @param x A number\n     */\n    //% shim=Math_::atan\n    function atan(x: number): number;\n\n    /**\n     * Returns the arctangent of the quotient of its arguments.\n     * @param y A number\n     * @param x A number\n     */\n    //% shim=Math_::atan2\n    function atan2(y: number, x: number): number;\n\n    /**\n     * Returns the square root of a number.\n     * @param x A numeric expression.\n     */\n    //% shim=Math_::sqrt\n    function sqrt(x: number): number;\n\n    /**\n     * Returns the smallest number greater than or equal to its numeric argument.\n     * @param x A numeric expression.\n     */\n    //% shim=Math_::ceil\n    function ceil(x: number): number;\n\n    /**\n      * Returns the greatest number less than or equal to its numeric argument.\n      * @param x A numeric expression.\n      */\n    //% shim=Math_::floor\n    function floor(x: number): number;\n\n    /**\n      * Returns the number with the decimal part truncated.\n      * @param x A numeric expression.\n      */\n    //% shim=Math_::trunc\n    function trunc(x: number): number;\n\n    /**\n      * Returns a supplied numeric expression rounded to the nearest number.\n      * @param x The value to be rounded to the nearest number.\n      */\n    //% shim=Math_::round\n    function round(x: number): number;\n\n    /**\n     * Returns the value of integer signed 32 bit multiplication of two numbers.\n     * @param x The first number\n     * @param y The second number\n     */\n    //% shim=Math_::imul\n    function imul(x: number, y: number): number;\n\n    /**\n     * Returns the value of integer signed 32 bit division of two numbers.\n     * @param x The first number\n     * @param y The second number\n     */\n    //% shim=Math_::idiv\n    function idiv(x: number, y: number): number;\n}\n",
      "pxt-helpers.ts": "type Action = () => void;\n\nnamespace helpers {\n    export function arraySplice<T>(arr: T[], start: number, len: number) {\n        if (start < 0) {\n            return;\n        }\n        for (let i = 0; i < len; ++i) {\n            arr.removeAt(start)\n        }\n    }\n\n    export function arrayReverse<T>(arr: T[]): void {\n        let len = arr.length;\n        for (let i = 0; i < len / 2; i++) {\n            swap(arr, i, len - i - 1);\n        }\n    }\n\n    export function arrayShift<T>(arr: T[]): T {\n        return arr.removeAt(0);\n    }\n\n    /*TODO: Enable this multiple value unshift, after rest is enabled in our compiler.\n        export function arrayUnshift<T>(arr: T[], ...values: T[]) : number {\n            for(let i = values.length; i > 0; --i) {\n                arr.insertAt(0, values[i - 1]);\n            }\n            return arr.length;\n        }\n    */\n    export function arrayUnshift<T>(arr: T[], value: T): number {\n        arr.insertAt(0, value);\n        return arr.length;\n    }\n\n    function swap<T>(arr: T[], i: number, j: number): void {\n        let temp: T = arr[i];\n        arr[i] = arr[j];\n        arr[j] = temp;\n    }\n\n    function sortHelper<T>(arr: T[], callbackfn?: (value1: T, value2: T) => number): T[] {\n        if (arr.length <= 0 || !callbackfn) {\n            return arr;\n        }\n        let len = arr.length;\n        // simple selection sort.\n        for (let i = 0; i < len - 1; ++i) {\n            for (let j = i + 1; j < len; ++j) {\n                if (callbackfn(arr[i], arr[j]) > 0) {\n                    swap(arr, i, j);\n                }\n            }\n        }\n        return arr;\n    }\n\n    export function arraySort<T>(arr: T[], callbackfn?: (value1: T, value2: T) => number): T[] {\n        if (!callbackfn) {\n            //TODO: support native strings and number sorting\n            /* callbackfn = function (value1: string, value2: string) : number {\n                return value1.compare(value2);\n                }*/\n        }\n        return sortHelper(arr, callbackfn);\n    }\n\n    export function arrayMap<T, U>(arr: T[], callbackfn: (value: T, index: number) => U): U[] {\n        let res: U[] = []\n        let len = arr.length // caching this seems to match V8\n        for (let i = 0; i < len; ++i) {\n            res.push(callbackfn(arr[i], i))\n        }\n        return res\n    }\n\n    export function arrayFilter<T>(arr: T[], callbackfn: (value: T, index: number) => boolean): T[] {\n        let res: T[] = []\n        let len = arr.length\n        for (let i = 0; i < len; ++i) {\n            let v = arr[i] // need to cache\n            if (callbackfn(v, i)) res.push(v)\n        }\n        return res\n    }\n\n    export function arrayReduce<T, U>(arr: T[], callbackfn: (previousValue: U, currentValue: T, currentIndex: number) => U, initialValue: U): U {\n        let len = arr.length\n        for (let i = 0; i < len; ++i) {\n            initialValue = callbackfn(initialValue, arr[i], i)\n        }\n        return initialValue\n    }\n\n    export function arraySlice<T>(arr: T[], start: number, end: number): T[] {\n        const res: T[] = [];\n        const len = arr.length;\n\n        if (start < 0) {\n            start = Math.max(len + start, 0);\n        }\n\n        if (end < 0) {\n            end = len + end;\n        }\n\n        const sliceLength = end - start;\n\n        for (let i = 0; i < sliceLength; ++i) {\n            const index = i + start;\n            if (index >= len) {\n                break;\n            }\n            res.push(arr[index]);\n        }\n        return res;\n    }\n}\n\nnamespace Math {\n    export function clamp(min: number, max: number, value: number): number {\n        return Math.min(max, Math.max(min, value));\n    }\n\n    /**\n      * Returns the absolute value of a number (the value without regard to whether it is positive or negative).\n      * For example, the absolute value of -5 is the same as the absolute value of 5.\n      * @param x A numeric expression for which the absolute value is needed.\n      */\n    export function abs(x: number): number {\n        return x < 0 ? -x : x;\n    }\n\n    /**\n      * Returns the sign of the x, indicating whether x is positive, negative or zero.\n      * @param x The numeric expression to test\n      */\n    export function sign(x: number): number {\n        if (x == 0) return 0;\n        if (x > 0) return 1;\n        return -1;\n    }\n\n    /**\n      * Returns the larger of two supplied numeric expressions.\n      */\n    export function max(a: number, b: number): number {\n        if (a >= b) return a;\n        return b;\n    }\n\n    /**\n      * Returns the smaller of two supplied numeric expressions.\n      */\n    export function min(a: number, b: number): number {\n        if (a <= b) return a;\n        return b;\n    }\n}\n",
      "pxt.json": "{\n    \"name\": \"core\",\n    \"description\": \"A target sample for PXT\",\n    \"files\": [\n        \"README.md\",\n        \"pxt-core.d.ts\",\n        \"pxt-helpers.ts\",\n        \"enums.d.ts\",\n        \"sims.d.ts\",\n        \"ns.ts\"\n    ],\n    \"testFiles\": [\n        \"test.ts\"\n    ],\n    \"public\": true,\n    \"dependencies\": {}\n}",
      "sims.d.ts": "// Auto-generated from simulator. Do not edit.\ndeclare namespace loops {\n    // /**\n    //  * Repeats the code forever in the background. On each iteration, allows other code to run.\n    //  * @param body the code to repeat\n    //  */\n    // //% help=functions/forever weight=55 blockGap=8\n    // //% blockId=device_forever block=\"forever\"\n    // export function forever(body: RefAction): void {\n    //     thread.forever(body)\n    // }\n    /**\n     * Pause for the specified time in milliseconds\n     * @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000\n     */\n    //% help=functions/pause weight=54\n    //% block=\"pause (ms) %pause\" blockId=device_pause\n    //% shim=loops::pauseAsync promise\n    function pause(ms: number): void;\n\n}\ndeclare namespace LRFEyeMessages {\n    /** Changes the color of the eyes using a boomerang, zigzag, flat, flip, or random pattern. */\n    //% blockId=LRFEyeMessages_pattern\n    //% block=\"pattern with start %startColor | end %endColor | boomerang %boomerang | zigzag %zigzag | flat %flat | flip %flip | random %random | duration %duration\"\n    //% weight=200\n    //% shim=LRFEyeMessages::pattern\n    function pattern(startColor: LRFColour, endColor: LRFColour, boomerang: boolean, zigzag: boolean, flat: boolean, flip: boolean, random: boolean, duration: LRFDuration): LRFPattern;\n\n    /** Changes the eyes color from start to end using a fade pattern. */\n    //% blockId=basic_pattern\n    //% block=\"pattern with start %startColor | end %endColor | duration %duration\"\n    //% weight=190\n    //% shim=LRFEyeMessages::basicPattern\n    function basicPattern(startColor: LRFColour, endColor: LRFColour, duration: LRFDuration): LRFPattern;\n\n    /**\n     * Defines an RGB color. Use \"red\", \"green\", and \"blue\" to define how much of each color you want to mix. Each color can be between 0 and 255\n     * @param red [0-255]; eg: 255, 100, 0\n     * @param green [0-255]; eg: 255, 100, 0\n     * @param blue [0-255]; eg: 255, 100, 0\n     */\n    //% blockId=rgb_color\n    //% block=\"rgb color with red %red | green %green | blue %blue\"\n    //% blockExternalInputs=true\n    //% weight=180\n    //% shim=LRFEyeMessages::rgbColor\n    function rgbColor(red: number, green: number, blue: number): LRFRgbColour;\n\n    /** Blinks the plugged in pattern on the robot's eyes. */\n    //% blockId=blink_pattern\n    //% block=\"blink pattern %pattern\"\n    //% weight=170\n    //% shim=LRFEyeMessages::blinkPattern\n    function blinkPattern(pattern: LRFPattern): void;\n\n    /**\n     * Sets the color of both your LRF's eyes.\n     */\n    //% blockId=set_eye_color_both\n    //% block=\"set eyes to color %color\"\n    //% weight=160\n    //% shim=LRFEyeMessages::setEyeColorBoth\n    function setEyeColorBoth(color: LRFColour): void;\n\n    /**\n     * Sets the colors for your LRF's eyes\n     * @param left\n     * @param right\n     */\n    //% block\n    //% weight=150\n    //% shim=LRFEyeMessages::setEyeColors\n    function setEyeColors(left: LRFColour, right: LRFColour): void;\n\n    /**\n     * Sets the color of both eyes using an 'rgb color' value\n     * @param rgb\n     */\n    //% blockId=set_eye_rgb_left\n    //% block=\"set eyes to rgb %rgb\"\n    //% weight=140\n    //% shim=LRFEyeMessages::setEyesRbg\n    function setEyesRbg(rgb: LRFRgbColour): void;\n\n    /**\n     * Sets the color of your LRF's eyes using 'rgb color' values\n     * @param left\n     * @param right\n     */\n    //% blockId=set_eyes_rgb\n    //% block=\"set 'rgb color' for left eye %left | and right eye %right\"\n    //% blockExternalInputs=true\n    //% weight=130\n    //% shim=LRFEyeMessages::setEyeRGB\n    function setEyeRGB(left: LRFRgbColour, right: LRFRgbColour): void;\n\n    /**\n     * Sets both eye colors to none.\n     */\n    //% block\n    //% weight=120\n    //% shim=LRFEyeMessages::turnEyesOff\n    function turnEyesOff(): void;\n\n}\ndeclare namespace LRFSoundMessages {\n    /**\n     * Describes a sound object. Define the note, its octave, intonation, duration, and the pause after it.\n     * @param note\n     * @param octave\n     * @param intonation\n     * @param duration\n     * @param pause\n     */\n    //% blockId=\"sound\"\n    //% block=\"sound with note %note|octave %octave|intonation %intonation|duration %duration|pause %pause\"\n    //% weight=200\n    //% shim=LRFSoundMessages::sound\n    function sound(note: LRFNote, octave: LRFOctave, intonation: LRFIntonation, duration: LRFDuration, pause: LRFDuration): LRFSound;\n\n    //% blockId=\"basic_sound\"\n    //% block=\"sound with note %note|duration %duration|pause %pause\"\n    //% weight=190\n    //% shim=LRFSoundMessages::basicSound\n    function basicSound(note: LRFNote, duration: LRFDuration, pause: LRFDuration): LRFSound;\n\n    /**\n     * Say a sound\n     * @param sound\n     */\n    //% blockId=\"say_single_sound\"\n    //% block=\"say a sound %sound\"\n    //% weight=180\n    //% shim=LRFSoundMessages::saySound\n    function saySound(sound: LRFSound): void;\n\n    /**\n     * Say a set of sounds in order. Create a variable and set it to an array of sounds.\n     * @param sounds\n     */\n    //% blockId=\"say_multi_sounds\"\n    //% block=\"say some sounds %sounds\"\n    //% weight=170\n    //% shim=LRFSoundMessages::saySounds\n    function saySounds(sounds: LRFSound[]): void;\n\n    /**\n     * Sounds a frequency on the speaker in Hertz (Hz).\n     * @param freq the frequency to play; eg: 440\n     */\n    //% blockId=\"sound_freq\"\n    //% block=\"set speaker to frequency %freq\"\n    //% weight=160\n    //% shim=LRFSoundMessages::setSpeakerToFrequency\n    function setSpeakerToFrequency(freq: number): void;\n\n    /**\n     * Sets the speaker frequency to 0.\n     */\n    //% block\n    //% weight=150\n    //% shim=LRFSoundMessages::turnOffSpeaker\n    function turnOffSpeaker(): void;\n\n}\ndeclare namespace LRFExpressions {\n    /** A custom expression made of up to 4 sounds and a pattern. */\n    //% blockId=LRFExpressions_expression\n    //% block=\"expression with pattern %pattern|sound 1 %sound1|sound 2 %sound2|sound 3 %sound3|sound 4 %sound4\"\n    //% weight=200\n    //% shim=LRFExpressions::expression\n    function expression(pattern: LRFPattern, sound1: LRFSound, sound2: LRFSound, sound3: LRFSound, sound4: LRFSound): SoundCollection;\n\n    /** Plays the plugged in custom expression on the robot */\n    //% blockId=LRFExpressions_blinkAndSayExpression\n    //% block=\"blink & say expression %expression\"\n    //% weight=190\n    //% shim=LRFExpressions::blinkAndSayExpression\n    function blinkAndSayExpression(expression: SoundCollection): void;\n\n    /** Play one of the built-in hello expressions */\n    //% blockId=LRFExpressions_doHello\n    //% block=\"do hello expression %expression\"\n    //% weight=180\n    //% shim=LRFExpressions::doHello\n    function doHello(expression: LRFHelloExpression): void;\n\n    /** Play one of the built-in mood expressions */\n    //% blockId=LRFExpressions_doMood\n    //% block=\"do mood expression %expression\"\n    //% weight=170\n    //% shim=LRFExpressions::doMood\n    function doMood(expression: LRFMoodExpression): void;\n\n    /** Play one of the built-in laugh expressions */\n    //% blockId=LRFExpressions_doLaugh\n    //% block=\"do laugh expression %expression\"\n    //% weight=160\n    //% shim=LRFExpressions::doLaugh\n    function doLaugh(expression: LRFLaughExpression): void;\n\n    /** Play one of the built-in cry expressions */\n    //% blockId=LRFExpressions_doCry\n    //% block=\"do cry expression %expression\"\n    //% weight=150\n    //% shim=LRFExpressions::doCry\n    function doCry(expression: LRFCryExpression): void;\n\n    /** Play one of the built-in scared expressions */\n    //% blockId=LRFExpressions_doScared\n    //% block=\"do scared expression %expression\"\n    //% weight=140\n    //% shim=LRFExpressions::doScared\n    function doScared(expression: LRFScaredExpression): void;\n\n    /** Play one of the built-in sleepy expressions */\n    //% blockId=LRFExpressions_doSleepy\n    //% block=\"do sleepy expression %expression\"\n    //% weight=130\n    //% shim=LRFExpressions::doSleepy\n    function doSleepy(expression: LRFSleepyExpression): void;\n\n    /** Play one of the built-in system expressions */\n    //% blockId=LRFExpressions_doSystem\n    //% block=\"do system expression %expression\"\n    //% weight=120\n    //% shim=LRFExpressions::doSystem\n    function doSystem(expression: LRFSystemExpression): void;\n\n    /** Play one of the built-in whoa expressions */\n    //% blockId=LRFExpressions_doWhoa\n    //% block=\"do whoa expression %expression\"\n    //% weight=110\n    //% shim=LRFExpressions::doWhoa\n    function doWhoa(expression: LRFMiscExpression): void;\n\n}\ndeclare namespace LRFInputEvents {\n    /** Code inside this block will run when the robot's hair is tapped, touched, or tickled. Choose which one in the dropdown */\n    //% blockId=on_hair_touched\n    //% block=\"on hair %type\"\n    //% weight=205\n    //% shim=LRFInputEvents::onHairTouchedEvent\n    function onHairTouchedEvent(type: LRFTouchEventType, body: () => void): void;\n\n    /** Code inside this block will run when the robot's left hand is tapped, touched, or tickled. Choose which one in the dropdown */\n    //% blockId=on_hand_touched_left\n    //% block=\"on left hand %type\"\n    //% weight=204\n    //% shim=LRFInputEvents::onHandTouchedLeft\n    function onHandTouchedLeft(type: LRFTouchEventType, body: () => void): void;\n\n    /** Code inside this block will run when the robot's right hand is tapped, touched, or tickled. Choose which one in the dropdown */\n    //% blockId=on_hand_touched_right\n    //% block=\"on right hand %type\"\n    //% weight=203\n    //% shim=LRFInputEvents::onHandTouchedRight\n    function onHandTouchedRight(type: LRFTouchEventType, body: () => void): void;\n\n    /** Code inside this block will run when the robot hears a normal or loud sound. Choose the type in the dropdown. */\n    //% blockId=on_sound_detected\n    //% block=\"on sound %type\"\n    //% weight=202\n    //% shim=LRFInputEvents::onSoundDetected\n    function onSoundDetected(type: LRFSoundSensorEventType, body: () => void): void;\n\n    /** Code inside this block will run when the robot detects a level of light. Choose which kind of light to detect in the dropdown */\n    //% blockId=on_light_detected\n    //% block=\"on light %type\"\n    //% weight=201\n    //% shim=LRFInputEvents::onLightType\n    function onLightType(type: LRFLightSensorEventType, body: () => void): void;\n\n    /** Code inside this block will run when the robot detects some motion. Choose which type of motion in the dropdown */\n    //% blockId=on_motion\n    //% block=\"on motion %type\"\n    //% weight=200\n    //% shim=LRFInputEvents::onMotion\n    function onMotion(type: LRFMotionSensorEventType, body: () => void): void;\n\n    /**\n     * ADD DESCRIPTION PLZ\n     */\n    //% blockId=touch_read\n    //% block=\"read touch sensor %channel\"\n    //% weight=300\n    //% shim=LRFInputEvents::touchRead\n    function touchRead(channel: LRFTouchSensorChannel): number;\n\n    /**\n     * ADD DESCRIPTION PLZ\n     */\n    //% blockId=hearing_read\n    //% block=\"read microphone\"\n    //% weight=290\n    //% shim=LRFInputEvents::hearingRead\n    function hearingRead(): number;\n\n    /**\n     * ADD DESCRIPTION PLZ\n     */\n    //% blockId=sight_read\n    //% block=\"read photocell\"\n    //% weight=280\n    //% shim=LRFInputEvents::sightRead\n    function sightRead(): number;\n\n    /**\n     * ADD DESCRIPTION PLZ\n     */\n    //% blockId=motion_read\n    //% block=\"read accelerometer %channel\"\n    //% weight=270\n    //% shim=LRFInputEvents::motionRead\n    function motionRead(channel: LRFMotionSensorChannel): number;\n\n}\ndeclare namespace console {\n    /**\n     * Print out message\n     */\n    //%\n    //% shim=console::log\n    function log(msg: string): void;\n\n}\n    //%\n    declare class LRFRgbColour {\n    }\n    //%\n    declare class LRFSound {\n    }\n    //%\n    declare class LRFPattern {\n    }\n    //%\n    declare class SoundCollection {\n    }\n\n// Auto-generated. Do not edit. Really.\n",
      "test.ts": ""
    }
  },
  "compile": {
    "isNative": false,
    "hasHex": false,
    "floatingPoint": true
  },
  "versions": {
    "target": "0.9.1-beta",
    "pxt": "1.8.15"
  }
}