Skip to content

Interface

github-actions[bot] edited this page Jun 30, 2025 · 1 revision

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-06-30, 17:29:04 UTC presenting an overview of flowR's interfaces (v2.2.15, using R v4.5.0). Please do not edit this file/wiki page directly.

Although far from being as detailed as the in-depth explanation of flowR, this wiki page explains how to interface with flowR in more detail. In general, command line arguments and other options provide short descriptions on hover over.

💬 Communicating with the Server

As explained in the Overview, you can simply run the TCP server by adding the --server flag (and, due to the interactive mode, exit with the conventional CTRL+C). Currently, every connection is handled by the same underlying RShell - so the server is not designed to handle many clients at a time. Additionally, the server is not well guarded against attacks (e.g., you can theoretically spawn an arbitrary number of RShell sessions on the target machine).

Every message has to be given in a single line (i.e., without a newline in-between) and end with a newline character. Nevertheless, we will pretty-print example given in the following segments for the ease of reading.

Note

The default --server uses a simple TCP connection. If you want flowR to expose a WebSocket server instead, add the --ws flag (i.e., --server --ws) when starting flowR from the command line.

  • Hello Message (hello)
    View Details. The server informs the client about the successful connection and provides Meta-Information.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client-->Server: connects
        Server->>Client: hello
    	
    
    Loading

    After launching flowR, for example, with docker run -it --rm eagleoutice/flowr --server (🐳️), simply connecting should present you with a hello message, that amongst others should reveal the versions of flowR and R, using the semver 2.0 versioning scheme. The message looks like this:

    {
      "type": "hello",
      "clientName": "client-0",
      "versions": {
        "flowr": "2.2.15",
        "r": "4.5.0",
        "engine": "r-shell"
      }
    }

    There are currently a few messages that you can send after the hello message. If you want to slice a piece of R code you first have to send an analysis request, so that you can send one or multiple slice requests afterward. Requests for the REPL are independent of that.


    Message schema (hello)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-hello.ts.

    • . object [required]
      • type string [required] The type of the hello message. Allows only the values: 'hello'
      • id any [forbidden] The id of the message is always undefined (as it is the initial message and not requested).
      • clientName string [required] A unique name that is assigned to each client. It has no semantic meaning and is only used/useful for debugging.
      • versions object [required]
        • flowr string [required] The version of the flowr server running in semver format.
        • r string [required] The version of the underlying R shell running in semver format.
        • engine string [required] The parser backend that is used to parse the R code.

  • Analysis Message (request-file-analysis)
    View Details. The server builds the dataflow graph for a given input file (or a set of files).
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-file-analysis
        alt
            Server-->>Client: response-file-analysis
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    The request allows the server to analyze a file and prepare it for slicing. The message can contain a filetoken, which is used to identify the file in later slice or lineage requests (if you do not add one, the request will not be stored and therefore, it is not available for subsequent requests).

    Please note!
    If you want to send and process a lot of analysis requests, but do not want to slice them, please do not pass the filetoken field. This will save the server a lot of memory allocation.

    Furthermore, the request must contain either a content field to directly pass the file's content or a filepath field which contains the path to the file (this path must be accessible for the server to be useful). If you add the id field, the answer will use the same id so you can match requests and the corresponding answers. See the implementation of the request-file-analysis message for more information.

    Example of the request-file-analysis Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details

      Let' suppose you simply want to analyze the following script:

      x <- 1
      x + 1

      For this, you can send the following request:

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. response-file-analysis (response)
      Show Details

      The results field of the response effectively contains three keys of importance:

      • parse: which contains 1:1 the parse result in CSV format that we received from the RShell (i.e., the AST produced by the parser of the R interpreter).
      • normalize: which contains the normalized AST, including ids (see the info field and the Normalized AST wiki page).
      • dataflow: especially important is the graph field which contains the dataflow graph as a set of root vertices (see the Dataflow Graph wiki page).

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8017-ihiZLROdCZBc-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8017-ihiZLROdCZBc-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-8017-ihiZLROdCZBc-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8017-ihiZLROdCZBc-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8017-ihiZLROdCZBc-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-8017-ihiZLROdCZBc-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8017-ihiZLROdCZBc-.R","role":"root","index":0}},".meta":{"timing":3}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":12,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8017-ihiZLROdCZBc-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":4}}}}
      

    The complete round-trip took 17.5 ms (including time required to validate the messages, start, and stop the internal mock server).

    You receive an error if, for whatever reason, the analysis fails (e.g., the message or code you sent contained syntax errors). It contains a human-readable description why the analysis failed (see the error message implementation for more details).

    Example Error Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filename": "sample.R",
        "content": "x <-"
      }
    3. error (response)
      Show Details
      {
        "id": "1",
        "type": "error",
        "fatal": false,
        "reason": "Error while analyzing file sample.R: GuardError: unable to parse R code (see the log for more information) for request {\"request\":\"file\",\"content\":\"/tmp/tmp-8017-03Za4KJDTO0W-.R\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.2.15%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22file%22%2C%22content%22%3A%22%2Ftmp%2Ftmp%2D8017%2D03Za4KJDTO0W%2D.R%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A75%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A184%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A148%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A58%3A18%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A207%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A266%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A152%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09"
      }

    The complete round-trip took 8.6 ms (including time required to validate the messages, start, and stop the internal mock server).

     

    Including the Control Flow Graph

    While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add cfg: true to its list of options.

    Requesting a Control Flow Graph

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "if(unknown > 0) { x <- 2 } else { x <- 5 }\nfor(i in 1:x) { print(x); print(i) }",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

      The response looks basically the same as a response sent without the cfg flag. However, additionally it contains a cfg field. If you are interested in a visual representation of the control flow graph, see the visualization with mermaid.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-condition","15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-name","25-exit",24,"24-before-value",23,"24-exit",26,29,"29-name","29-exit",28,"28-before-value",27,"28-exit","30-exit","31-head","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["15-condition"],"end":["15-exit"]}],["15-condition",{"id":"15-condition","kind":"condition","type":"mid","root":15}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":["31-head"]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":["25-name"],"end":["25-exit"]}],["25-name",{"id":"25-name","kind":"name","type":"mid","root":25}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":["24-before-value"],"end":["24-exit"]}],["24-before-value",{"id":"24-before-value","kind":"before-value","type":"mid","root":24}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":["29-name"],"end":["29-exit"]}],["29-name",{"id":"29-name","kind":"name","type":"mid","root":29}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":["28-before-value"],"end":["28-exit"]}],["28-before-value",{"id":"28-before-value","kind":"before-value","type":"mid","root":28}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-head",{"id":"31-head","type":"mid","root":31,"kind":"head"}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],["15-condition",[["2-exit",{"label":0}]]],[8,[["15-condition",{"label":1,"when":"TRUE","caused":15}]]],[14,[["15-condition",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],["25-name",[[22,{"label":0}]]],["24-before-value",[[24,{"label":0}]]],[23,[["24-before-value",{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[["25-name",{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],["29-name",[[26,{"label":0}]]],["28-before-value",[[28,{"label":0}]]],[27,[["28-before-value",{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[["29-name",{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],["31-head",[[16,{"label":0}]]],[30,[["31-head",{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[["31-head",{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]",".meta":{"timing":3}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RIfThenElse","condition":{"type":"RBinaryOp","location":[1,12,1,12],"lhs":{"type":"RSymbol","location":[1,4,1,10],"content":"unknown","lexeme":"unknown","info":{"fullRange":[1,4,1,10],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},"rhs":{"location":[1,14,1,14],"lexeme":"0","info":{"fullRange":[1,14,1,14],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"},"type":"RNumber","content":{"num":0,"complexNumber":false,"markedAsInt":false}},"operator":">","lexeme":">","info":{"fullRange":[1,4,1,14],"additionalTokens":[],"id":2,"parent":15,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","role":"if-cond"}},"then":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,21,1,22],"lhs":{"type":"RSymbol","location":[1,19,1,19],"content":"x","lexeme":"x","info":{"fullRange":[1,19,1,19],"additionalTokens":[],"id":5,"parent":7,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},"rhs":{"location":[1,24,1,24],"lexeme":"2","info":{"fullRange":[1,24,1,24],"additionalTokens":[],"id":6,"parent":7,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"},"type":"RNumber","content":{"num":2,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,19,1,24],"additionalTokens":[],"id":7,"parent":8,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":0,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[1,17,1,17],"content":"{","lexeme":"{","info":{"fullRange":[1,17,1,26],"additionalTokens":[],"id":3,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},{"type":"RSymbol","location":[1,26,1,26],"content":"}","lexeme":"}","info":{"fullRange":[1,17,1,26],"additionalTokens":[],"id":4,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":1,"role":"if-then"}},"location":[1,1,1,2],"lexeme":"if","info":{"fullRange":[1,1,1,42],"additionalTokens":[],"id":15,"parent":32,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":0,"role":"expr-list-child"},"otherwise":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,37,1,38],"lhs":{"type":"RSymbol","location":[1,35,1,35],"content":"x","lexeme":"x","info":{"fullRange":[1,35,1,35],"additionalTokens":[],"id":11,"parent":13,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},"rhs":{"location":[1,40,1,40],"lexeme":"5","info":{"fullRange":[1,40,1,40],"additionalTokens":[],"id":12,"parent":13,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"},"type":"RNumber","content":{"num":5,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,35,1,40],"additionalTokens":[],"id":13,"parent":14,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":0,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[1,33,1,33],"content":"{","lexeme":"{","info":{"fullRange":[1,33,1,42],"additionalTokens":[],"id":9,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},{"type":"RSymbol","location":[1,42,1,42],"content":"}","lexeme":"}","info":{"fullRange":[1,33,1,42],"additionalTokens":[],"id":10,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":2,"role":"if-otherwise"}}},{"type":"RForLoop","variable":{"type":"RSymbol","location":[2,5,2,5],"content":"i","lexeme":"i","info":{"additionalTokens":[],"id":16,"parent":31,"role":"for-variable","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},"vector":{"type":"RBinaryOp","location":[2,11,2,11],"lhs":{"location":[2,10,2,10],"lexeme":"1","info":{"fullRange":[2,10,2,10],"additionalTokens":[],"id":17,"parent":19,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"rhs":{"type":"RSymbol","location":[2,12,2,12],"content":"x","lexeme":"x","info":{"fullRange":[2,12,2,12],"additionalTokens":[],"id":18,"parent":19,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":1,"role":"for-vector"}},"body":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[2,17,2,21],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,17,2,21],"content":"print","lexeme":"print","info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":22,"parent":25,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},"arguments":[{"type":"RArgument","location":[2,23,2,23],"lexeme":"x","value":{"type":"RSymbol","location":[2,23,2,23],"content":"x","lexeme":"x","info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":23,"parent":24,"role":"arg-value","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":0,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[2,27,2,31],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,27,2,31],"content":"print","lexeme":"print","info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":26,"parent":29,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},"arguments":[{"type":"RArgument","location":[2,33,2,33],"lexeme":"i","value":{"type":"RSymbol","location":[2,33,2,33],"content":"i","lexeme":"i","info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":27,"parent":28,"role":"arg-value","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":1,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[2,15,2,15],"content":"{","lexeme":"{","info":{"fullRange":[2,15,2,36],"additionalTokens":[],"id":20,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}},{"type":"RSymbol","location":[2,36,2,36],"content":"}","lexeme":"}","info":{"fullRange":[2,15,2,36],"additionalTokens":[],"id":21,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8017-XnMGnf1c0CM7-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":true}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8017-XnMGnf1c0CM7-.R"],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"function-call","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"variable-definition","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"function-call","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"variable-definition","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"function-call","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"variable-definition","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"function-call","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"function-call","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"function-call","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":2}}}}
      

    The complete round-trip took 10.3 ms (including time required to validate the messages, start, and stop the internal mock server).

     

    Retrieve the Output as RDF N-Quads

    The default response is formatted as JSON. However, by specifying format: "n-quads", you can retrieve the individual results (e.g., the Normalized AST), as RDF N-Quads. This works with and without the control flow graph as described above.

    Requesting RDF N-Quads

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "n-quads",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

      Please note, that the base message format is still JSON. Only the individual results get converted. While the context is derived from the filename, we currently offer no way to customize other parts of the quads (please open a new issue if you require this).

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"n-quads","id":"1","cfg":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/exitPoints> \"6-exit\" <unknown> .\n","results":{"parse":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/token> \"exprlist\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/text> \"\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/text> \"x <- 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/token> \"LEFT_ASSIGN\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/text> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/text> \"x + 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/token> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/text> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n","normalize":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/type> \"RExpressionList\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/operator> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lexeme> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/operator> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lexeme> \"+\" <unknown> .\n","dataflow":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/tag> \"variable-definition\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/name> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/nodeId> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/nodeId> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/origin> \"builtin:assignment\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/tag> \"use\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/nodeId> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/nodeId> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/origin> \"builtin:default\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"returns\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"built-in:<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
      

    The complete round-trip took 6.8 ms (including time required to validate the messages, start, and stop the internal mock server).

    Retrieve the Output in a Compacted Form

    The default response is formatted as JSON. But this can get very big quickly. By specifying format: "compact", you can retrieve the results heavily compacted (using lz-string). This works with and without the control flow graph as described above.

    Requesting Compacted Results

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "compact",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

      Please note, that the base message format is still JSON. Only the individual results are printed as binary objects.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀஠洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾࿛⩬ᰡ暁∠ᰠ⵲䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ჈䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ๝吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭⵮埋ℜঋ殍ᯕ獺฀䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰  ","results":"ᯡࠣ䄬Ԁ朥ᢠ⹲⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠᥶N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫ೉ҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨⸠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ౤䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥ௔う᧡㉕ࡉ᳎ᨨ漡╁Ř⵬ో੅ⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ᫰气፾䥓ѣ⤀㐽ᩢɀᐲᲵ䎴䭌ذ綞卒佢ᡨ㄂侶䧴䜉䮂疲䀾䂁拠ᏹ籀YᑼಬၥᐥƠNJ炁䀡ⷁ禬ᓐ䖪䩀Ʋ㉰៶ਮ䧵㚎䏁ၾ厡暙单悥䊶ᛅ峔囵䪵圙ᘪ㊭姕㜍䯑盦忔ฤҐᨴ䍐乳帪惓喰⻀㦑Ë嶔₴⮔઴䚲༛儒怷崕ḫ䜓帯䨕㼏䰑纟䀪Ŭ䁗ᩉᣧڐਤ櫉䲓爴嵭剬䕓ἐ↣⤺⭬⁗ೡ<䨦眈ف䀩ڪ⃶㠩ē卮㪌䬡ࣹ䆥暲忩⻈ⓓ犅䋒噕娯䣤ǒ㙍乖ᇽ䊵相Ჯ๬唥槄ᦶ溜⾑'䆬時⑮廗弔㻯且绿堗纠㑋⸥䁬仳䬦⊫䵰ᣢ᭵檸ᠭ᪡卐婶䨡媖䦰䇑嗰⚯΀⢐Ⱛ牊⡑܁剖䚰⹖ᬋಆ♚㗬春䚈↲䴏ㆁ㴪䕸㛐ᶤŌᇩ㎠盉㵌斨ॢ凚㣀病␢㈓冓ō㎬渥㞗㕅㤓व≮嗲⻋䦭ㅨ秌㰩䙰↌璐丨嵸᤭ֈ≈懱㬯涘抆㵩㥱◄⿑⺣俥絇䀏兓云ㆀ笍㖦㽍燰碕䏢㸻঵㉩啒㻏䥭⥩આ䡗ᦁ卮楔㝭Ě✰௦Ⱕ᥊浺夫঳央⧩㤹巬㊾≲䁞㋩kJո᧹ᐁ㐤䖸♍搃Ꮕ卤⸉ᆉⲮ㍨ 敇⽉煛復ୢⳏஷ儺䧕㙨㔪㧋玼㊬獽㟁疢忉檚䠫匝䜋爤⺻㛡搋ࠌゑ䝰繜ঠ糈䯉穹⎹繹ƽ㍒乌䡷΍㊠秘弴ኋⲴᕼ⏯⃮䈣〮䀧㬪挢䪖噭㱲⥮ǐ䵐梊祱干捫Ⳓ㗡ሮ৭婁Ⲹ⊂痑И䙪糿䇿瑟䥽湋凎繾䋩䘣ᡭᦳ⾼˿ᅵ羜憞█䃌曘ޫ㤼嚩ᤠǙ㡉䇚Ҡ坆⑔ల⑳䅨碤畠ͳఴͱڅ!旄尥㳹⩙摉岪估焻ኪ㇆怰͈崫儝ร⿸䂰ㄚ⤦äڂ΃״㻉⒨࿣ɓϐ㞳璥ㅒⰬ晅೤噥纬⭃᰾≉ᅦ䨠䔡Ҥ硞নℲ᫜䩂䲹Ʉⴤ౼䜨ʩ␻ॱ丣䆨ໃᰳ≀ሚ㲎䙠琬晐摑挸兖ᅼ噂Ⴥᓀ䉍䐠綫ࢴಱ椹঎Ⴢॉፑତ粏ᅢ඲械ϩ撹冁ᡘ㉇ቬ⋄ⲜⓄ䢯┇઱圴㈎ὲՕ⊰ӆʃ硤⡯梨䪩⺸䁣ᜳ判âق瑒䉴炨₧ठ✺䈍ᩒ畑Ɔ㺆⩨ȴ澮夡䲴ᶰ姣ᔢ㕛ፚⅦ互╬漫҆乹嚾她ᙒ㝇努ⷨ䷓ᄤ䧯ᴐ䷉殲ㆯᾒ†Ĝ佔㗖দ嚘䛜䝮䓨⩒敠㴜⨠ڱ墂ː戴Ų㪷♾慉ᮆ⧨儢⍈઱㇇⚛奌瑏硸⭹䲸䘃“⦵ѩᴶ✼Ƃ之抢⧂≱䡄堒滠୎㸄䲓妢琖䡛හٸ爐峫᭘ରᙴ䁛ᗂ烄拧ᐅ籶Ωы☤⬿䍵瑥擒䊮㽐⠠⩈⸄ᡴ唹ጃ⫚ᐍ┴㥷ᜊ癌灼⡕䉷槢岒堣毩㋵嶘柺塊ḧ⡵䙼嗎奫捖᭝㭵礯堊䃊ᫀ楕ჶ⬂喊♖᫡‡甃⮪ᕼᓚ䛮⚥ཌྷ㓹敚只竏氙ヷർʺ擀㜐氥⮽ਅ嘪0䅺仚嫺⸅㚈癖矉㛿〕泹淽喠㏏婅㪗⦏Р㼸當半⚡漹巻ᷭ寪淀ᬥ㝕㮞㒠ਏ⻂池巷㔾坫ໟ㬳㛕ར䛺墊櫆棭秵䴽嶚⯓ᦟブ⍯睦斮䲠؃䇝桭᫵ᶊ傧櫽ᩑ⠬⽲皡渏⇊䣅濲㈈㉛ࢎ⭲㹗ᶄ癞焏ᇭⵥU䐇壚ₑƩ㜕椄෶䦪燐⠠㹄ểѵ͆ᡇ⟐ٸ緖Λ༦濬㾑ᢝ兘䂢㘫Ȩ♇⑬礂ω䒾ㇶ涃ᥑ搒㰵岘䚔殔䁟ྱ尊凭᥵浝㌸㓧峊❏❖擾㒹嘢㧢᢭䝘䎊㎇狒宰暯ᔀ䏱耋仗ᷣ体㷾㦹ᆌ杅❮̌༐䀥ኅ䚸ỏ浫泜獑ょ劊簂氬䁁⸙羈ᖼ嬥䳔㱙ㅧ⿼㬒甯≣ⵕ䌺竓楋睜巗姶⦋㊦绎浳⻹桾ধὓ䳞᭥㯶௔噜磭䩼涕䗉喱徻站␳㈷ⶓ篺粆㋾汍撻痘嵻兹䳇ㅨᮚ匿⼍櫦ⶀ㍸⃣奣䟹䲚㬇ឍ䟎爘绲侉暃ʣ⚺䧙簁㷆ᄜ研榏竾ๅ睎䴰㽓㢖ؐ!໙㒗࿇ခ瀎ᇵ淩奬ᐊ壽㕸❸眡夊ሀ䣳弝ᖥ嚿ᦼ㢇䍤➹厦Č于搠㨃Ἥ畛叮㩔媟❼ೈ㒹俿㖼朊ⲓ瓝湿娇䍖⮠祉䬁極紽ᗸ峋䵄䯌Ⓞ刅ܿ嘗䪇཭痩嘖ಋ䫿珧燗㎒៱ᬏ⹬ૉأస㈃嗞榿㰗源矫ざ⤘”犾ὴ㹹嬑檍 ᢞ㌩牨䨞澂澽㳹◇䚟母䯯⵩㌺䧠ʹ㡍慾ྊ⺷禝ߌ穓枙ᓕ烉漜㉻濱䆓㄂【垣峗ᔚ䯽篿瘟眻杜ؐ縜嬴淊㺩⨗䒽笗撩佋窏⯶擏椙ᐌ硫㊵彑糆尌ਖ਼ഉ堝䲏嫍‍縣爗弢綟ࠛ⟏氵丆䯠ۇᰞ竏糕妏皡 㽾㧿䋍老罱瀷䵴怷`փ俽瀥罪ᥭ䌝䀍➘ࠂࠣ༁ྒ㯀∣㐀❼ٹ䎰ء侓秕刕䐿侈婍圝ᬄ潌ɰ㣜倎㍦ٹ䘡夅dӕ䂜洄圮Ѡ㪢ឃ弰۾嶣ᰶ漥ন⡰惁P戗䤣儋惍䫨ⶩȰ䝺՛䊝࿢傩Ҹ䝣愂Ī⊀๼皎℅᥮ங䘽歬ᬳ䍣堰ᜫԸ㝣ࠨ烁勝喘ⲫ爳݀ⳣ媁烏ݸ◭欎྄㦴忢婬惴室ⓜ瀫呢厘ㅣଅ女燤⽼樻㄀װ⭣下࣮Ϥ㈣兂䣜䜎ଽ᳁␲⇐ᥜ䨽❒䑴㌢ℾ⭱۴㋃ᄵ奥ⅲ᳃ᔶՈ⁲Ͱ唴䣕⤔⿃ᨆὌ䟿刘䌼烩䖢䇱㌆ℜ㭉嚃甴䝦䓃䦃ⴶ啅䓬▰咫䁪Д㌝克ᣝ䝌㒽夵䂃䠌⎂䜳墳䞌⪱縠㣴Ӽ∃✻弪嫬㈃圾᥯䗐⃨ळ悡䒛怃ļ⮁֬⋍㼃嚏䙨⃨⠃敵箟嶝伾ᥜ⍶ข∲䝔╓䃃⢰䓫ᦏұ夃䄠┟夌ੈ│⑀҃悹儑䙪ኲⒻ䒪➴⪳ᚉa⍲㺃Ȏ㌮◆̲Ⴛ㵞❲㦲♌ᔖ␪൐圽擡禌塲场Һڄ⺲ᖏᔇ׊㰼ⷅ䐭⃠̤伾⒳ଊ孳㪰ᒵ⛾䣲㪷咸☺⭳ᚹ㍕ↂῥ窸紧╚⚲瘺ࢡ㫚〈丽璪批孹ᩮ侇❉偒倬ഗ❊㻣࿦ನ暪⿤ӎೞ䓨☡媵咈`ᐜ櫪┄␺ㄠʦ䲬斆≃઴Ⴏ⛌Ⳅֽ呂旆ӓ砼半柆㻹䖹㌢旟嬨ᄳᔊ䝤䷒᫡泳❦㉱㶶䲞杺㽓⦾法テ⬱㌾低¦㭬ֻ᳇Ⅶቒ堹甍ۆ㦓玶᳅攌⺒冭᳸本⯒䂾ᤢ朾ₒ᮴᳴晾㞓㞸䴀杮㢣憶㽄Ⓚ⽒ֲ粲ⅽᵃ䄲壍㦀ఓ亪紇ܡ⣠㾹㍈őᣣ➸㤑䭡㖐垱ⲧӡ㧣ࡴ烐⡲ઐᯣ䲯晞嬪ⲫ䋲柈⩓垵䁢ᜱ㻓媉⊠擆ᖒ灲䒥ଔ㮈殰棠ᚆ֫⮿೎ᙹ䣡⊩⢇⊰㸓㸾㎞ᘩ⒢䰲⊬䟎┪ጹᨩ᠇媪扰勁᜷䰵䢯ᑥ⋚༫≺䭭ᑊྈ汰̚چë婳䔅᠉⹱ٺ瑐⢐ᐜ常拜摙⃠ķ糐碹㴃ᦪ犠䕹⮅㹵刳秊ᅱ⬌犪ҥ㽂Ṱ潡▂㉊笏狋篥㣽⾀ⳅ瀲ର氯㙜按Ↄ஺䴔呠ፋ奲ᔈ嚬Ⳳ⤆䬅猵㑵瞵䑢哵⽐帍⫌囵㱋䪀櫶唅㩫羶㤚▀Ꮚ╼烡嚪䬪䕲撒←␍¿̆ឭ㊋䡱拿䦂ʊⶬ烖惍↊ط庉硎⌼䑲ᾃᘕ⋌㡸㬘暽㞊捸彝囅䴊敻ⓡ摱㞊掲ὐ⧒එᶲዜ垹帋妳櫯᜽㜕㽷⳧孉堻ᚈ杊‸ণ浽卨㝣ㆋ♽瑣Ⅳ⩫ॴ㢴㑃♢ᒭ慼唒㕍喫䜟哥⋋ᖳ䛐ឳ⯜撣㫍䮗儻幺妊㖮⺺⠂˨ᘃ㙲堆替晑䰳斴嬏敽ᴻ⢽暲私⎻嶾澑㜳㳋ཹ䰭⍫㡺ੀ囄ᖁ㫓ὰ傹啑ⓥ㴴洚㠕㎫櫾嫃㖢䰡栢棸㜒㳻竺唋㖮⳺崺笠Ÿ┮ㅿ⿦囨巎Ò熶䏷䣓᡾樖勔䱰Ḍ䬪篖㧚ኀͨ潕ᕖ╫⺮傖䇛⚩澯⬁ࣞ⇼ୄ搉垽ᶋ数沕䭌䖒Ⲵ⺕ృᷮ୎稠⯔浌䐴ఠ㔼ᦀʺ䭚獑窀ώ凊ᯄ䣭槖僆㯁嵭毠犖祀㷽渎塈ᠻ⨲歜䊩⟉婧⾘渋柉ᵤ㕫ଖ⳶㣇䂠⑘⏒⴪ዾ䝁凾瘜橦戔矙戇比⧗叭ᢏ䳶皗ᓬ×潼⌖ㅌ勯櫬僔䟕ᚿ毞䦘‸䉌䊨ϔ槍⩮䈡䠭淗淇梆䐭✪͍ྫྷ簯�͸烡ᯔ῍巶烡徔凷⧋瀓㭚炌ઁ䍜ᠯ≬䏧汎椷揌縄ᬼ唭磂儶毾洔䱴䢌ɡ䨗௉㖼ᩡ炗壥䎶〠ێƩ䦍哓ऑᢀ㯣⒎䤓䈴㘪扮䀡䃙ţ熱⤇ϴ㜝壋ᒶ䛴㴁̿⣸ᒽ勸嫨棢䓬むଽ椉ᨥ涃嬿䚃䛇ᬖᜏ䯖ߔ恁ᨹ䦛઱屝㘊泔䍲垌桬䤒䍢㞣䫬䔎獂㸮セㄌ欭ᴩ቉ᵪ✤㻨䭗之ㅓ嵕䠎槖✃}ồ牚㊀ੰ清漥ᆴX㠡зڀᝩ緣㉉稝⯸繧穥⴪㳈ᨑ罶旚㨼嚋^妑帳⺎ഇ©庱เざ䃸ذ⸄羾槺䰜㦸ⴏ⍻ऎⰣщ⁲Ì縑潨枼ᒝ⎻˚䄮㥓䬹ᣙ晆㕓Ἱ䳺朶㎬䷣糃晖㜸ⶼ昮朖ㅶᮺ᳸猞㦓ᦨ崈朲㷍䐣៍暩愓禺㴒柘䬓塿㴒兞㍒嶿泠嵁䀓磪拰᝾挠ၺ崂)㔫忑䌚暶㽔ѻ戻杉ㅨ呾糦ᙽ桫㇩ጉ松斢剻ഔ╙㶫榺ᢃƉ㎬橻䀰噞㳖涿⋥⶙㦓㇩䬗ӡ⯀ᙾ猘撵㩫楏ዼᛉ㲒ㅹ⋤回㕋寳⬖ᜤ㲋㱺壒䆵㘫㳬嬚堙㫴嵿䘨圽ル䍹⏍噭㟳㕰笙埆⌘⭺愞ழ瀋㭿峠垆㒫㩸୊权㧓絻⋯枏∻佼Ӻ喳㰋帰۶㭜㺆ᙸ欘㜽㖴ፑ㬜㜹ㅶ㳼ँ៚ᖻ㲹朊Ⱙ਻ኻ傡㞃㳓簄⋥ᜃ㼆䥼⛪᰻㊻∿囵㝾愰᫽㝰㟔橛䛹墆垱㼸盹匋㜕㷻ͽ盹Ⓡせⷓ⪦癓㸠烫宪嘴Ⳡ㞗审䃈⚴ᒦ䎇晥䋳㠣㓰ఝᓨ㊸哮砮即㗧哱祟毸ზ穅ᅛీ㝌⹄吚䗠湉⺇rΖ怠㉊吗〳䇻䪜ຨᗅࠤ匬窲㢠䘐ጚသ嚛⠠廵砕㎛⠥㓾ᗺ㘧䱦㼅⛿㭳俼㓯皰᠛渄ǫᆠ籼࡜樸ເ碤ᡘ神絰箧䄾懺ะت㘆䁙⏣堻㵌ោ仂吃ͧ戁໕ඛ暽ᇽ矨焛湎刋眗伛㪸㔗砝¢晘ǰ໫懧䩚ᥗ࿀笧寰䧡ဒᡃ䝚䧪⫌⿌ሂጇ俜㓻担弝睓ඇဥ槵☬罧捛ⵉ侪ẇ㙜姿⥘率ૡ爏ᄘ竉ݠ⇶盃冷癨昃匀஥䏻੾⻗౥璮ᘦ伢燳ᵘਫ盢睧⍘秏皂竧癘☐⹀犷≧姪Ნ羷⩊笖⹧俷䭐〬ȕ䅂≻෤滗Ѯ૛ᇯ巔畧嫙刞为瘛⛚㇫⹌爧䓜櫍侘珷㊶丑≥ᡃᏜ䷰暩㒝㧘׶亢礛ᅤ抡䂼䘰੤ট剂䦹籢䐵ᇣᡘ帳៊塋ی㰲㻪演絳痘㇩佦䚇囟䘈༾秷㭟燣籏噙ᯛ˅ӀƢ⹮嬃璑瞯寜嘝濊猜柝㸛潈瘗吀ᡏ瀞粈潥䡼a痄゙פ 爛䛜㈋稁珗⭞⏡潲璗ƒᏹ漦绾⨶ᐋ籙ວ⋜‹ᅤ牯ט刃溬Ϫ៙䀻湞甸媙緿瀈₸暞М৹玌僝凯Ṗ矯棟绢ᾖ燷ᆞ痺Ἷ䳏⅚䯢䑝癇埐䘳�熧灿篯併秇䗘㸗୕紈⪛氉㇞罯⎘Љ役纏༤寷῍碇宝䐄凖眷➞ఒ⽱煶ᄜࠜ㋫瘇⼑ཚ导㪁濊ྭ㺻ᰇᬯ丘㿵獷犽ⷴẍ猯⣛䐞㻺璯灙㰒å礜欌䦊䞦哿樛䂊৷䧄儚߾㎝惟≊〙㿪瞗टᐘớ礯烝琎㹎ᄏ䆟㗱㽀牿優漧䋷䧟⽝㌍缷甠儝ᄔƷ磏ム翶纜㛿⫞׺ᾍ㶕燇䯸Ԙᨌ㟀Ṍ秓溿㼜疒柢᝭帙琿儾㷘刈㮻幓䄟椟֝堮Ӫ抂՟灇䤜杣᠍ዟ纄稠᥯ໝ唔緬Ú㱀๯䠾唚䈁価综箇柿㍼栐៨⼱綫烠⋌䈧䰌Ꮙř㦢䏈㫀Ⱄ㺲₶籼惀㞞惙⸆寏㺱㮐ዧ㨝䐒燠⃱㵐ૠᙡ木వ䜺〩ᣩ惿᭤☫ߠç嶴ਏ厡㔥㜃恰纈گ暷⢥ᘭ㋲惎碛ƌᐶ㌤㷆唺炉⌘ᖀ攢㘬查ℛʰ࿗䍡帤』恵红۾䐰拀抦൧惔䋑攁Ҙⵣᐩɍ䚪磠ධ瑔礮㨩掍絩瑰㱁瘤ြ㿟㺙祘᪠珜㨭㯲ং䎒࿨《䄹ਹ炩↽ԥ⬖㭈湲储䭁䉠⅌䋁㖙ᜇ�㹧礇潰樝ㄮ㡙僤䎔࣋ಁᆥ䝁塠愾㯟䯝㾣ᇷಮ沑嵢ૈ㏞砦∸䁽帣穔᡿ɢ嶓࿯⃬憮୧ၦឦ䒊倧炡穋扃⟣䀓秡₮綶燈㌁㪧吻௒憷硜ᜀ䩙㼪籇áഁ༰㘌أ䔭碑Ǻ㋂ᙠ擣渖䱓估⌌૘┞䳠倷㢖䇋۔᳝ᩂࢪ篤扌⎱૑ၰ✉࠰㢞穆ᅒᏽ㙂耑濨ࢹ䌯皧䇡搦渷悙ᇰ䞯淎дፑ剕ᬯ㥅ட俾㘀夽䶤眆ㆦࣈ翣⸑牏ࣻ̆଀㇡▥ᨵҕ繈燊ᙠ悭⚨㉚㉩縁௏䟢猦Ȳḭ凇ܒᾨ䗣ҫɟ⢨⌭࿘㣱㊳ⴲႍᆨКᕿ⯹ᐒ⩖嬵⌻灐றe㔹࿐ᆎ䜊ᡈ䱢庫቉ᜪ⌾࣋౑ä放ᥖㅁ䕸䭀參刮⦨墭␄஬⾞坦昰ᒔ⅗кᚸ综⴬晖穒揅ౣ䵴㛧瀵㑦⇂䌶ᣏ੣㸮ᙜ䃪抴ࢨ㷱禧䄸瞨刉䖪ᔐ屉䄫ਸ㣡ധ੼㋱帳㇯汦ሆ㊎Ṹ坉®橜㣄挋࢈⇑᧥ᬱ䱬ሚ᭎ᠸ漂֮䲻ຌ㧣༽噮㕲ἳಆ况ӚᏈ涃圭ṕᤓ揰୸㜔矤猱沔Ⓚ⟾ᇘ布㚬⑳ݧ控৤㫡玤欺偩熫Сἰ棃㺨஡Ӑዒ瓱䘩丈夠怶燌䟐梠㿝࡮牋磣戩๜】ే✵䊌煘♟դ縲琇ಣ䓈ኡ䊀ࢶャ碻笡爑䘒ᇠ兂଩ቘ⢶቏஼㓞⅄Ⰿ扪㉐ɚഘ䞭ᆮ⡡⡵጗ൌᒑ檦ጻ粑ᄢ秤ᗀ欲䤬啫⒭⃭బ㳜浆碹愡ᜉ燉὿c兀㥐͋ኔ䢪ཀྵᑇ礶䊃ॲ▾ፄ倳ᒪ扮崯Ꮜ䷬Ⅴ睅Ჾ岀岲䛷摫݂怤╘Ⓙሳൢ⩁Çಹѯ分➳䂴玝丶║ᔛᗦ์཰杅洺犘擥䅰䅴稠ᾨ噖䓱Ꮛఒ⭉⍆䤸ʋ䈂䖀ݴ吠൬䕜Ӻ只䲬ᇉ㣅笊䒗亙㥭ᚴ䭲喩繟擮叄䵒㙩㙆┩ᩱ᪏ӭ჋⯸綐嗧࢒愩Ō╚㳘ິ㪓冔␹ᓔ撲㥮穛Ԝ別柺ⶰ䏅䯮咹楏⑽᪍ṽ䡀䀼塸ዕ召俎忇纹㪋⦫⒕ᮔ坳䅩畞㤀㌯䐚⣤矇܂ٲ᧿ⓃὈᥥ卨捝儼⒰䬨㟩煄㴴ᑰ⧋⒥ዸ潼㽬捃冄㈬ߊ媹ও熀⑌i❓ᱳ⠂匯͈磣዁䥺◡曥⼰ᝀ僰̔攴筂泩ឤ㱹ӊ䮢㰶ᓠदళ⨛䟅ᙄ浣Ꭼ穙䓒㎁佸⩹䖆㢸⟎娒䒙旈ᛜ㞑ᵗ䤳㎽͖⒑秅䜿≯ᥳ䚈Ῥ昃㵮㱒洍畾బⰠ瞅㈏䗓穻䃫ᠬ䅙绫䀩⳽ᎍ俲㍉ॆᶲ㊓妒⚨∼僲Ѭ䡱᳘劍࿖ې岸弿㒔┉柽໬獳᳨ⵛ䲻劃䷪∉恄凧了㧮୷ᶤጘ噀ᨯ睍ᒖᛪ䢶✄ഥ剿湡ᆣᱼ緓◨歉沵䐃䥧ϙᜇ㮾䧀ㆃ斗᛼椭㴨䯠┙犅畊䚩⌅涽㪄ᦅ柽ᚄ斒敀䘦待獏剾㜾徘࠰䓀㨙ᣐ⺜垲廡⭍哂㏵䥆㌩ⶄֺ皍䣷柖᲼䦩墲᭚㉂ਇݤ㲩䱛羶ທ䤱昳ᛌ廂俬歎ᴕ勐ġ㽹敐ၻ抄äᆇỄ氂凴å䳙勷䲮㷉椆޻ຐ禐᝜ᶢ棓䍪Ỽ䋩㉛吡㥱䰷寯᱄じࠃᚐ䙲юፅᢸ੨Ⲛ㈘ᓢ桹繷৪楐圴沣ⷩ睜泴壤⢾㟙瘅⎹憝㇯曠寢擁剋㝌㥕છ䫧Ꮾ匧桳亘攃㡚ʳ⬫復ᝓ㳂௫䧾㑉犐瑼⪍䕓ऒ䫜إቊ沾е爀䎰㥹瀷塰繴ռᔯᒈ䪪᜴㣃指Ӽ⪑㯑帲伥ࠬĉ䨦̂惤㢡䓎ኵ玃༑㕹偦᾿熑֡ᜏ၎㑫ㅉ潲⽑㏸扩ヅ䃣冿⟌嚪礙惮ᷬ楋惂ˬ䬜ⱱ㮥岷ⱴ穦⺕ᛳᷲ敪ᾢ中䁵⅛ۦ⃠纴夨ᥩუᜀ宨坓緯ᣚʠ䬒䯩㈘Ὑ䙱ᥴ昑䫌偒僫㦑༦卷厽àĘ䕣倬぀恃᠌咔媁栦᳀㡓䯘ֱ㼥強ጺ概攵撔勒䙽ᝋឺ狻䭮⽙㻺⾵䤥㥱斸栜儒敫墷⃅擣䊯ル䨵䞵ᩱᱫ☟䗔哒䟪᭯䋁प૟䱠߮ѵ廇䟋纔ᑦტ䊨Ⲣዔ˻珲⿞㈥ា其祵䔴斴䅪䐝ᦒࣄ扶⮩⸂㏙Ǡ⾷ⶶ擜垭ዢ欒㍋睃㳢ਸ਼⧩㴵晴᱆ղ㤼哘⽊梫⛩潫ࡏ䔵爖⵵⾨涸楯䖔埁ᠴ努㱎ⳕ⋵⫠ݵメ獶⵳ᢩ䡃悊巘橹ᰣ嫀怽⩬⫚㹥Ⲷ幽ᖛ旒噟ഊ侼㫌࣠᪬崾ᕈ官繴㒳⢤㕗栙捪䑓ዎ擒拕劢ⳬᑊ仠ᕰ❟盟敤壠㒂Ⓨ杆咥ए埭⑵ڵ䕷ᅧվ呒吊卋˨䱯᫬殴慍❕₀䢸ං礡篺墪绋䵏勉䓦⩳ⵕㆨ盶䍴㹷㗎埒ⷒ擫ᔠ␻枉歛ֽ⟕ಷᅿ浱喈圚彺䛲ொ⻞洽欇⼈劰橤ƹ㺝㙧啲场廊⯈ㅙ㓲㎴⸽㍐ཱུᷣᣙ申╃Ⴒ白ṏ݊竺⬛ⱕ⼉䛧䦵嵶Ě插廽ᩓ⾂刪䡨櫩⥑ਭ௴䒾ᖇ啈吮孺儊ᣊ怾ۤણ暣⹉ⱔ䞭⦃啻ᐁ傀ⳍ㫈囉犣⯒亦☙ជ朲⍹ජᡑ寔喨傏ᳯੋ‸剃⵴㙗‥⑇෫圞嫚耊㒏廃۬憘椃⻘未⓿掔䷾煲ʸ㔨わ棁≈᪴漅Ⱅ〴罰䵢䕕坆否尓檋㈳⚹᬴楓㗕⡗怠ᑒ偊㔶圦俘㳁⥂䠤ᬏ䷳㫕呔೽嚍瑶㕙宆瘻暅秆暷ᬐ櫄ࡁ絣䑻冉ᗊ㑙帶唀㉎䳙Ӿ殤滃⾹፷䓲4එ㙥嚆発㉎⣬泥㷑曖㷵妴╷厇䷻柁堊擁䖈揾ᥚ寏喛਑˴びஂM㖶凬䔺䣉廗䳛毲構⬠仕䃼匨涶㌲⺾ڋⶉ䋍䢮宄⃴᪍⻖ள殒⶝㖏ᠦ瞺⤄䷑㛆比懻⦍䢷礪Ġ֯穋栔宵⺏䛌拤毝⬓㘙秤⻺㮈涫䢽妆翼墦䀣Ქ㷘溩फ़俗⡯㩀与㓁廚愋ڏ凃盏媡欼怍梔抯㊱Ѽ䂠攈ᑡ㎣姖ળࣸɧ┽ࠡ凳滌㖨㙶崒䢺榏㓈㚿ᒑ楪⼽璔˵ࢵ᷈盳寤癛岥揈䬶㮱滇㠽ᯔ⫶ݺര瑵䇮孚掲ோ令㭹滇⩀⑈㽻⩣ᶘ睫幦剻埈㭂拊娥淝ᑽ咔ᗸᇆ帒皁⼁᳚儢患ⵝఌ櫒ჽ掗㧷ᦍ渚㗋嗖塤ᜎ䀹慽㪭檗㱽撖߇H㥓㝵᦮秛ⴌ篛漅嫜⧳➽ཕ秿㭽ජ甃堾廻暂௖Ộ劥槤ᆽʕ任箌巌瓇卮媚媎勔Ἃ㮙栣㯉ߗ⏵侊㶑石幾些ⷎ⟉梖㪑滯⫽狗䏼⽬ᧅ璋壾続⌊矐䢗㫂ۯ⩽✨旰儽㶚畸⩶刺嗍ύ建ᩧ䢗㫝∕ⱃ垏㵫癹䙞毚✎䗌溭筍汫₹㗔嗵ᖄ㸓琫䯞叚㸌⿒漞筫晐Ꮂ⸖୷睰巗矿峾爺母俌⚪㮪䇧☝✸基板緎᥸䑎硺ญ㏌ȝ竸⹷ₙ搕深潪᳀ฺೞ悂䠿毕䜀禑烧⺍⭔昅㭡㵍瓯婆惻䂈䧓Ƭो湃㲣围㯆㝔ᗞ痭孡嘈倹㩈ø絠๊ᰡ┙ᨌ恬ļ碣刞焧攍ႜ6℈ὴ䱣⯰摆౉湤嫨⭁䬦碫ゆ䃘簭瑯冾᎚硖俟΁田㙮䳊∿䢒㝽撄᳛妜ዷ⼁㄂䏍❈㈠崣᰸せ䇭߀໰涡䈮џ儆疏攂ց粄㸻曂ഩਈᶶ⽒变லྊ淪⍰ខ绝琬ᯣ⇈˭疀☣禵፿ô㷗冤㘲偦籰҄㺮ഒᱷℝ⢭㘎愝䌮⯤㤠䪜簻㢝绲㨦渰渙弮ҁャ䗸⌯壏㰱洸俔⫅㪾畈散ฬ⩞僵⍺ང㑆竻⬌淁ǒ䣚Ṡ汅澋晘㶉ธ礠師⥀⬼৖懺΂ᢐ狃☤属ᣠ䐕༺壱紂ᬸㄬ㤫䝯亹Ƞء唧ᄝ搁ྞ失罦㈔ಜ凎زỈ痣ᒬ淹⮔挹๵┑場₽坲㍊ₔ凉㉐兢⅗䚏⏥ො㰠仧爔㢛燑䙍琘棝ℬౖ纍א䴉⧒䱆炿㉦২1埨漵㉯ᴥዄ絴Ь㌱橇笹炐燬♆᩟ⵃ䁮俲妕ጴ䴲㥓㥇橳浄䡵䝭気㨚咷㫷椖揊෤㉑䇦䤻㊘燴娺ᷤ渹ᅯ啁唆加ੲよໆ䔾䂉৒䞖Ḹ熡᙮ᕛ�Ꮠຒ㉾偆敃檅皬㤺㎀寺ၒ⥟5ႎ䰺㫡瑦⢻⢌樇ٍ᧰烝圔煕焜焾䶚㷰毇ǁ䡺䈪畉ᬛ⅓潭ᑛ甌厛࿪㺉䬢䪽梃懵⟣Ὅ幓紉䃄ⳣ㧳რਸҀཏ㪒姨憾ỳ㘃ᥭٕ礈揌乺㳉渋✻⪒ॺ柋ᾬ䋓ⷀⅼ殖ᰪവ剙熦⦹墍ᨆ曱ᶌ桓媯⟷䳷㌥䲡ṙ泼掴㹖∅ෑ斄ፆ䩮Ἳ崑䔨为㓹柧㎸⪛ᨖ枓ᥘ掕㫵徰㳫楦ᤎ㤙硙ኴ椡႙㵥ỿ⿽箃濱糪延൶᪙䧆ⶸ庆凌❣ᴐ漓秦罛ⳟ玾碴嬥簇ιヿⲈ΢ᨮ㧕ʗ僕夔率佒㠹昇䆿㢆稐㰍濩㬫悘煸喉ႈ⵱㔥ㆡᡓ઎㚳�叄捾㱌䃞㳶㐀⵺㪱巻椾犒⡶៰咂独渮⥑ጄ獠⺑㓩暇ѽ熃娞宷Ả拌⥍᣸枼稗歑ㅤ翝㡸㊏槙☣ᱨ梫׬䧲哪䯵㒨㟅挬⑩ឯᆝ䊔峣哜Ἃ瓞礃ᐞ䵘㊅抷垸妖秋᛿䦒珹ኵ˔⃉Ʋആ䥩愢ᅿ嚟Ủ构崒紳㛯ࣗ⣿䮄ⳬ㺯㒂ㅾ᳼ᘑݹ啃❃⣏ᴥ䤀ఔ俙㢅䚇䙹粈燿᝛‒絽Ⱬ૘⫿䍭ⴑๅ尠፲䐥ᡍ灯⠵➭ໍች櫽峲ⶵ㲩窇⚺禚喼晣ᯰ罓啌糰᫷⮦ਗ਼㪶㘱ᵺඈ盕嚲⪂ੀ缢惁佺䶫ⴍ㟕家捹亀䘏ឞᰂ考खӚↆⵧ⹲௕䨦╊涟ສ↾徊珋燘䢤▻歟⾖ક燆牺喃ো暆婼绋牎ᾯ竧㪠滣壕䁖㜽炭痲ⅎᱷ唻⅂䫑拡䰃⺡㏥嗶䩸淖槁ᝐ決活抶⡷Ι᭢⎛䣕䏆罿厙樌㛃灪棫䧍䇒䬂珄〓崭擀潸㎁෮嘹密珋㋡枈書孺寢㹺瓆泼喃丄囬嫃⻋瓍浐᜻氂浦摍剪嫺䄴ⷡ囇tᰞࠕ嫶㝻殭槷⌠৖䃸粋䖫囆弦撫㓎科䫬᮫⹻㲍䘛熰守渋㛽沣ㆋ嗦䔢㬄䭡漖ᨽ䣶㣿ᖏฎᘴ屆盋敍⇖真ᰁ湎ሽ䯶哼‭瘀癮塖橀⌯坑䜂殥湪㋖峗㣿ᶞ◫嚊墦枻ᐗ滖笉㭒㒷㪁泽秼椪㢈ᑏ湎珋伍夣㛫᬴穷㾥疗໺玜旵㝽彶緻㼏捝滨᫏⹍㿽䌖彺Ⓟ㶳㚁做窻㨍㯙弍嬾⿓㒵紆ၽ䶒斦囪⎚掛校凈౵簓瀏㾽䮭⛽䷂䓗垿塞拋৏࿚㌉箰淋㩭䒻୸羇ⷈ䁟忮璓渏㏘嫢䍱滓㉝緖揼玙⷟橽墎畕ߎ㫛dz൐ᶸ㫦媗⤫硉昐ⲓ希㐛夌ᷜ䇿簕淽ㆣ椯槹㞓嘀盷媨զᩁ㇛滲▌ᱳ㹣喗⃺⮚䏔ྈ㢝㌧⸽乾戅捞湍㷣浗Ǽ疑磩㛘㷧࢛ኬ揗戂孇潽㶩吶ſ凚␅ໄ㾱眼紎ἰ村䎼Ố置Ⱟ汿䄍⏱砘㳱梻⦬䧘漞䞆῎㢃劯湞⎔⎸䪃ᡝ䨧翏粗侅瘑ⱀ爭䚯㿺椒י垔㭲焻悾ᢖ⦂✰ὠᣃ䍘楙⤈槛㙂㨞柫㬍ҕ攋䝸Ẅ稃䙯䄑ㄘᷯ団媁矑檽悜ỽ䞨᱘申厮瀺ᔎ䎢ྜ࿉朧媿叙笞㰟朴⺳僮២攘׼伇ᶉ煛抏寳Ἂ㮽⺬禅ḗ୺ⴅ䐍䏲㣹粇福㿕᨞⟮浯㺣䢮᛽☼ツ亶姂ഇ紎Ⰻ櫴㖟㔽㩚炚⼸垉叩仠塮惇䎿ґ䭻歗ᾼ砓纗瑴洕䔦佴㭚继䢿皚䫷朽Ἴ爍䡏㵜ඛ㒋仫曾ᵇ᤯⬡奭䞭ᾢ糳摎὘ᴉᶠྪ㻺男බᆖ䝹ᝌẈ唶搚㠼ⶆ䯾แ㯩悷桽ঝἀߞṒ稣捏秺樲ϕ䜓᎚羷৯㆖ؐᮩ⸌竫睗ՙ㤓叮噥㤑抷䕼粔漆ᔉẮಔ桏奜ᾁⶶ⾋居皇㨔䦐⼚埀Ẋ狣䰠氢䐪憫ໍ㧕烃ㅼ疕缞ᰑ氺盫凎怉࢟瘋⾺᥹簋彼ɟ仯⅙߄爻彆付䴒Ⱇ俽㦵昷㥽憝笛∇ᾦ瑉縯ᵽ嬐ᐒ㜽㹜柳炿⎐✌㞳濒璓俯姘〥㘂ᯫ㳺毇ㅡ盕ࠩ⤐␍㡋沙㗘极寽₻㪅漷絿⛘㘓䞓Ẓ罣愯痜㜃�侓彠ϗ႙屎䷲☁䦦ĸ≄ⷞ⦠ⶲℷ㱄牗ᶾ嶓⻿㜾尮粋糏珟⼉㰓丷㵝硗嘸垔ག᯼ᬆ窹纎䟺䬈宵㙫㼙簝ὼ厘皼睱Іᮓ氻做㄄㲜ۢ㶙惗㝽瞗෻矐嶶琧榋ᗟ疎߫ᬶ嫪亼籯劚䏳煐侖眓憏႞ᜓ殲ڬ楣惰ⱞ᣿瘎寄㿁簻媁๾纞䰏垈秣簯巽ᷟ帛✩廡癲匿⁜物嚿漪櫭珋዗澕ᴃ瞚彞羧氏қᲞᐁ 棅矹´ᢪ໥䝊㴔㭍扆凚㼆ᯉὰ㾭炗፿唟稅႙淨罛墶㕘娍䗱Ẅ弳瞇嵝夕Ϭ俽䱍㱍斾教ট᷄ᙿ墀減窍彑ᢍ促ⱪ珇帾亘ሀ篏⾨縶灏㏽挟仳ͦã冃剿律គᆷ侑㷣戯ࣟ┕௱ྚẕ㚷䱚教ᘁ༓Ṡオ絇ⓟᤖఎ⼳瀅燧憾䟚嘄筒忊簅瘚଼䶳曆佇侎眽欿ඟ樚߮ṟ㢅瘚㊾笞娉杴፮痻喾᝞ొ%忧㻹绯᷿䟒䇪⴦㸾碻剏᝟丌㯬瞑⥙椏嗜伒戀箊㾛㗛曾䎞渐⏝忂穋箋澌⦓㜀朢弰瑋櫯噞ؚḌ幸窛穇㐏Ꮯ᧹᮫ᾀ照凚宼嘔瞔忲㱧瓏篝䄟Ⱀ潛㹬㳷绾岞礉࿰๱磋栗؅᜚⠖基㱩礇䣿㮛ฅ垣廚属㐧؆ጓ⓭⾌粍纯啟憙君ྻ⠉篧灳玽ؘ䰑፰䴩璲繆Ⓖ琘ྫྷ㽡箉羿岜✜⯸快ᵏ㋏䑆癴嘞毾ۣ㻕睿ᦞ䌝柣⽸粒ぅ䰿䬛ᓟ⿲义㧷浇納⪚ḇ㠋㱸礏唎垜ᰇᎰ㻈㬧耛๼䶖矺濇㹊屛睮伙伒吕ᄷ㵯嵇厷䌦㞽⿦纃紗嵞䬞笈᷈縳紡湟椞㪉⯩磤኷䘙嵏纛瞗兢罄㭧癿┟易᧡⿒㷙绝禟⒔䤂䮢繻稑硹窘㛚暓偫ⴕ㢿䎾㴝ᰚ樓㿦礰毟缟۝桡ჽ罍㛡ⴟ㿛ᄝ槥羸㴗睷∜丒俫佋倀櫟猟綿瀁䐃̛秺暏ᘞ倔笙缴縭祣䂯㼙儂澩缷筟檏᨞】竬潇翳沕玏㾘Ꭵ羳歨癵粭窏癯感噷Þ瀕ᐚ耖ᕈC疹佦⊫糁ᇹԴ༕域㵜ᐣ嚣倯。痱瞯弥㺃糀ݟ琏斠㊈ม䐝␧咥‾䁛羴嵀䈻ನ㯱烂⥟囆㬮㒥㠤⢒ℏ㿰䂍嵇纏數ѐन⨀俟ᬡ䘢ఙ簐⤁㿾伴䂻縯㴏穘珏掯嘏⑄䘝㈧怑䠼㇩䲧羓纥؀ݿ焠ᘏ乿ġ┣ଘ启㡃偍翀ㄸƴ䃟箈ਟ椓怗㭺ᠣฦࠒ渂こ珊㾓ƛ絯竘रᄀ⊕ҡ窘竹ೃ样濤ႆ睠㻖᷋禠ා樀➟㳶ἣ䄧◓䀾ࡅၽî⁔旄з㏨䖰⹠坞墢ḧ箖⠸⯵ⁿ㽬䆊糓婯烈ᐰ㦏㣢ℜᠥ樮Ḍ矣➴卍ỗ緘وྨ὿嗯ቡ⚣ម娭␷ῢ瞣⃚Ƅ˰ۉ犡楟岀絮䌢ᰛ尩瀺え䁺㼡Ǩψހಮ懀♅㫡爣ࠧ䭓⠵ㇼ掴患䇾᳼ࠀ౸ᷰⓀ䎞㺣♘我ᓉῶ灾ޝ䆝糖㦤ุ዗䴀䊡榽ᜥ䰭ᐱそ灹枟ȝΊڪͿ朐⩀⡁М猥瀪簵׹枯⃽縥┛穢ࢁ搨┰愮媢㌦琮ᰵ⁇࠭£űʑ㪠ࡸᗰ㣀濡殢䢦〩氶䁚羶惌∋䃦ݲಸᶛ嶼᫡㱣嚣,ሾᗨ恭㽂䈌㷩ܔೄ᷐㶰擰䶣嘥夭‷塗䉔愋⹉䇾兺ͬƥ唕֢刣㊦㱂䀬氭塂僯䆽Ϟֲ๸Ḁ⡰緎㥢᪤ᔫἤј梚僭↧ᓫ᭪੟档娋͡沣Ș㸗搳ࡄ䡾儞Ω䌞ؔঔᡐ⠰忁ज挧᎖携䷧⡫❘↱㳎تਸ਼Ⲡ⑐攡䰣䧙栬伈桅ᢇĕໝ崒窭灨ᜳ怀匞甌抧港娻灪⢜⥞繐ऍ厢࣌ល忏ẎʢẦ〉㘀ᑑࢌㄒ愺䇀ㆌ໌ᦨ⬗䀞殑䠤欫㐰᯾₎僦懹䈱ل੔၃ᱰ櫁媢㉛凑戳ၜ⎯ޔ懬嵄禆෇掸⌛⮁䗣喣ᜨ☺懩㢌䝄Ɲ紹ጷ獖栎功⨁烣磘従฽౅填履繷䊡վ๬ᝳ妰澁浑ᐙ帖帹䱗侹彞ȃ絶ؗ爜း㸐洎枣甒吁睯1傔࣐Ð≷Ԗ獼‘㒟‱戣䁥₨嘣ɒ䷎ᕩ缐⎀䙒ऴᓠⓟ☼榣咦缩Ⅎ῿䗚ࢵ䄱䱅ݺȸ᱈㔠浡䧼产䄫ㄺ瑚ࡷ¨懲峃ݖࢼᷘ㽐䤎瞝级眬焸ᡎ䁳ࡦ䇲⊰䔅眠ᯠ″ေ穂’᢮䤴≑側ቪᇴ緈䓽㔟␈⣰䡄㩢炳氩䓇۬碋筒ᇨϬ䞉฿淟岐溁㺢䣹᢮㤵ቔ枿羆Ŷ≟窒෌ᄛ廐秡剢度梬ᨴቘ枰ᄃỠ处ᄲ戧䬵呇ᙾ扢Ŧ㴯䈿㱐⒟唽҃䢂䘑⅖➨ࣽᢦགྷ⑧噖攷7ᒝљᇾ籎ࠊสႄ㽅ᅱዃ䈚ὦ䍤ਮ呶⣆冪䊼ֻ咊Ꮄⷈ涱⸜ဤ弖唱ᢶ咗⣋䙣⏗Õ৪ዞ᥾᜺ᙣ痒檬䴱搼ܷᄇ⹜⊏؉烼ᄄ⮐惱⛃獤睇䙩橘呮棣撎ᦊ䜄૴໴⿽㻱㌼咡亩田剉ふ⢪⅕⊺䚽ࡣ洲ገ䯱燂ᙥ純懯婖瑼⃪兪≐䞼㉊ᕑи睤嫃塣享䷉㩒౿棞⇩∤䙙୉̬㧥ựࢂᠳ䆪㔽湤䒙焈㄰損䏴吼᝸㷰扱凣此努⌴穇ᒖᣰㅸ戩䚝ฝ洠અ⋜䯂䯣沣䌱⩈ᒀᣚᄵㅹ䕓ෆᎴⶸ烪䲂㥤㯠䙢晖呸夁䒎䈲䛢ంᓸ㯰揱ⷃ⋦ⴄ⨭ᙅ凄壵ㅯ䦮䝝ຑྌ჎ᐮ矂竤‣ᗤ婒俁⃮ㄨ挵䓦๶ᱴ㔎㻀ᎂ˥涮ᬱ帤ⲑ⤃�椮⤲據ሌ㵊پ枽洧ܭ焻㱜䲂ᣭ冲䂝䚛င䉔⧈濑⾂滥∠䎦⼴籗壺兩揞炓పᖌ∈䷑ं槧㷰朳็ᒚ㢴焩掻䤃೒ᡴ⺸尠䊃旺ί礷ᙄ᱿ᾋㄯ䌓䝷ૺ⠸䘸䇀ᙕ卂⺫⩊义咟㣒処͍䠑঎᪴ⷘ乱∂棦ޭ㬳噋咑䁖ñ扅䛕౾ᴼ♸佁ஂ姥䞩机湋E棓汫掐䓱㈺ᛜ⟧◱徑㤐埦晢幇ᒅ碬ࣷ抢笙ଳ惼⒐糑㯢懥秗漻⩞粃磇ㇻˏ䑨䇸ⵒᓳᯄ䖙⁄絆༻摔㱢壽焳挚䮠᎔伹Ȥ庞ိ磺⥒စŋ㱲⢽燼扢䙟ӡᲢ㼻㶴瀤毣涣刀⩅敉Ԓহ抐⛠䯡ၔ㉰⧆㈲ચ偖傱㺲㴰ṉ屼ዐ⑖ྞᨼ㲘救䠀ఠ硯䙢ᅖⅈ湜䓔嶑䑱ᄱᓭΘ糡劃籇᮫䂴ᅒ琴䔇Ғን䆢䔴Ϣㅾ⺩ळ㱅ᑪ㜰Ɂ䉲壩…Ꮓ揦ⓑᦆᝤ協紲ᩅ౬㜶婅≹䓼煸Č♯ᅉ⨂ⶢ଄枃▐ܦ䍥࠾⢔䶗⚞Ꮬ㬇❠в⑄滱湂ᦥ⢯失♜ᱶ&瑼Ȝ␵搩ᗈᡄ槁傳綻䉭ᷩग़ቮ┙摸燢♖熩⭧䥰彶ྐ敆㮐咺๶ᑱᵀ㻒拿䒸䭢ᜂ⾘媊媲ᖣ橨ℼ⩻劇~䧖䌥掤係䛨ƾ⎀ᅬ㑠ᵱ䴶梴㊓յ廽斻φΕ⚌⏀炑ᜳ♆滗瀱೾㉣健䨖憶❬倉ᚲ⦋㻩ল䝆❵ᒺ㥑⠯အ竵䈎⥅ᜩᮒ℈䏩墲歅έⴾ展抖攅ᆰ䦾➒֙ῄឈ睢r睄㤦ʴ㩑䢾攚䇭䅝歏સጪ㺏᱉䜉碣綨㚏੓㱿Ӗ䥔≚⟠䬉᪒Ⲅ牉㕡⣇垭ʸ╙䋑ᔘ⦽粁⛍猰᱀チⵉ稣榣Ш⢳ѕ劆攖䧟ኡ䠜䣅Ẓ㺴䜡㲲糇䙨ળ湚⡠撦溺ℭ⃿౥᪒㳄刐癡榡练䒺屇⒂⓯煉汲⑪䡵ᵊ㆛ᕡ浲勅ᕮ¾ᕔ牷�㊘瑁♜䬩᪊㎠㧉箳჆桫ጳ祟⒙䓍⥖匍♺䤥ᶀ㱄姉瓩盆Ṯ岿ȡ㞥擉䥰扸Ѫ䩹ᨺㇴ犩ⶲ⻇屨ኴ൜劄㓑惌塃☼䪭ᠺ㣈䯩䚂ࣆ普厦՘呿夈楘匔䖦㟥ቒ✄恉ᳳ䟤ৠᚽⵗ扼哚䥤ሞ燊ͧ┒㇔佩曲΢孪墲啙Ѻ哞兾̸◚䱭ᓺ㢤㞉ᠠ淆卨皸᥋婼ᓖ榹勂PǕ晨ఈ䡦嫳❇᝭ር檯媜䤟兼揙┓ര串⮔欉Ꮂ䇆佪㕯䖿ቤ䐵ᄞ劗ቒ䵙᪗༔柉䗃俥洕㼱奛犌㓒榊ቧ⟄䦝ᜒ㮪㥉⃳俅䴧庵՜妯哻⦞劸䋀䞍ᐺ㟴亚੡炅ᱨ犽絋䩼㓮䤵匰擡乣᪦⡴渹㭲炇䞔⺶᥀牭㢤᧥⏨摓擃ᚦⰔ樱屳߇灮殤敜岙甊ᤫᎈ斪䧣᧦⇰㳾擲ř獩咼ᕀ⚚㒴榌剶䘞ෲ᷃噇㉩Ӳ粇樬঺穀抲ᒣ䦳ዧɎ䡉ᦲ㻔痉偒ቂ੪撴ⵞ䙷擦ᧅ劔㯩七ᄲ❬熹䉓楆೯嚶⍋䙿༸S፟ߓ䊅ጆ㖄簉ნ壇౬犴捋ڙ㓴䥡劈料䤃ᚒ㲄硹❓杅杩皵⍒ᚊ潘妳厛⒜䴝᪆♬䱮琌忤ᓬ▴㝼㪜瓋ी㌴故䡋ἶ㆔皉ቓ祤摫ᄷⵊ嚑㒠娆㌄攅䫓᥶㊰Ĺ拒ㅉ⭯喳୉⚘䲺ძ巼敋䍳ሺ㵐ೖ⊂繤䦮㢱䍐ᚏ瓫᥁㌴斩䣳ၖ≌光畓ᝆᦶ䊴絀普䳷椩㏔敤䫩៖⓬璹畳ɇ曩庰ॐ癤ನ大㊢☍䱽Ṳ㥌坶Ӓ侅䫬亽ᙗ㪙⤍爔Ꮈ朮䷫᜖◔䟹࣓Ą❩㶸筎劑泧槃劚✽䲳ἲₔ抱㿓⻄Ǭ䎴̈́๺Ყ⧝㍪攣䦛ំⓌ繹岓ᾅ勪䶾䍌暌䴌妺厒擱些Ọ㯴烉Გ愇ፆ庳ᵗ箩ᓅ᲋卐妞ࢵኪ⎼䍹᧒䶆⧬䐊䝇劏᳔⤸獥染伷ᅶ⫔壙峲䎅晬嚷㥎⺚ᓘ嚸匴❭佇ᖶ∿❎ג嶇ᗪ䮶╞买㔌楊爻ⓣ䰹ὶ㼼炉⮓焆啫夸ᵓ㡫ⳝ㨅ᎍ暕䶗Ỷ㒬䭙ஓԅ䇮喹⹕㼤唇姍̋䔮ཫ᪖ㇼ䛱枒䈇廭缁᝖㪌㲨ᅆ卢晲䳛梊⍸⾾痳圀䛩檴㕟乶崐㻤屐㨋䭻᥊ㅴ䚙嗓⨅䯭檾㝀亐㲤奔猳标䳫᡾㿿㆙♳瘇❩➻୉庂甅榞揗⚓乴Ὰ㎔疉䈓丅仭⢱㭔㹠糓楽玪䠗䱙⹞♼巩兲ই㍫⾲㭁ኄ㳄䧱犵朵೿ឆ㽼䈙℣ᤫ㷯妳卓㺔Ძ秷㌯斝䤾ᐖ␘秹㸓窅⻪Ҹ㽓噽泌䦋牊擄囩ᶈ㪈䋙ሒ✅翩䒶終㙫磲㤬㉻昛畍洠㨄栥抳䂇෪暸䃀ƍ㴋᧷㋭杻䬟ᛮ㪴䔙Ḓ᫇ת妻䃛ű糲֦犉⛓䬠嬖⻄䴥⸓इ溫抷組⺀攚է珪⓰ⱽᚠ㲜痙Ḫ琅淯皰睉๰Ⲷն㐘ផ┋ᅁ⪢瞙熳琷⿫斾惞纔ӧ礢዇擟䡇ỡ㏌䴹⸫标࿯羰፺準㓅Մ牺❠ⲿ᳡㪜䧙⫲娴偏桻僋㚌䋊⦈泳獻䵏ᜪ◢狉匪纆㗩䁸翯犑瓱᧋㱜᝛珵ឤ⒌䡥ᠤ媄盪恴彎㹢䋲֑ગ➘⣷᙮⿢搡⏳硒⻨撻࣍ᡏ̒Ցઢ⛯䫝ᤁ㣈刹晳氤⮮紾֯⺙⋛祉௹➸ⱀ崞⪼喹㪫⠄㮯尽͎橯糝ց㍊⑗亓ၑ↢炥☫䤇捪妿棁劅㴓䥎㉐឴⻠僁ↂ攥Ȫ∵曨桳䡎橹ˮ姫ఐᑣ䴷ᘌ㫼祩孓䨷な㪳終晦挃䖧੘ᗴ䩍៾ㅘ尠≵ࡤᑎ⺰㐹熊峘刕拀ᒅ䣐幑㬬廙㞪伷忡嚽佔㺛抰┸ળ⠕䡐ࡖ㏨䵥㓳䮆慍ⱶᣔⅵ䌂凰䪱ᙴ༨嫮㥬曹⡓簅䟯䑻ᕚ憒峄䖿઺❤୐少㧂窥嚪笆䷯ቱ୑䥾⋓槼ஶ穲ِȢૄ差啓❅倪౉擛䥪኿䅍நᘋ䠴媸ࡲ帚࣓኷増椬ᓗ嚜潙䖎ો擊ⰰ埚㸸温羫䆄䛯⩽働⥠挌㦘ଡ଼ᚇ䬇ሆ↼䧅傪⊴Ʃ橶Ⴤ幷೨䗎ય擱䪔尡䂲厥嗝爴䥌ⶵ瓉ŭ劣榈䩖ᚷ䷐嗱⡂䆥祔稵倮ᑴ὚剿ዀ槱䪹ᒬ⸊ᛑ㌂絅炳শ奌䡷ビᦞၖ▚ૠ摪Ϡ婪㙒潅䤩夵潫ၺ㣛ઃⲪ㥚琎娋䱌塺▂紙漽ᖴ噊⩸材嚀挞᥽䰂杆⯚ᩉ⺲磅ᇓ侅૫塺⽌㦜拜ᥤ䪒兌⦼匹⁒皑䬪᬴ᙊ♴㽍㥶㊹ּ㐅ᖒ⯟ⅱ㱠櫅巫岴ཌྷ㊽ⳟ晠峚敥牤㡚⹜忙␜䔅⥪ષ潈瑵ӎ剸〣℗磭ᜯ䤳ᐎ␒䅼⼪㺇ᩩ硶䣏煰㌔旌琟ᖞ⾯ᚮ吒篅攓⠵ੵṱ恁↙┳祌匥➾⸐嘥㶂䐵ဪ䡴Ὃٿ䋈妏⋲䖙㌶ᔚ⽂勹⍲矹㨲倇ݍ殴敛ㆃ猓䦆獛᜛侽ኙኪ攅夓䔅Ê割ˉ冊㌆妘⮝ᒑⶍᝮ⢪墵媒ᠵ᭎ⅵ⣋ẗᴍ奻䄏⟴。周な䵅慊䌆ᣎ⥿䐼ځଝ⦚⭴回⾂嗈Ҳʥ匓晴⥋彎㙆妅猍㧷䩒桚⸌唰᫪䳥窣湷≋㾵䥊湢⋢䗞⭝撧䳫渑㪲䒙测疷寫楰獍湽䋼՝㌚ᖑ侒嫉㴄牵ᩊစ棋⡲峔╾Ⳕ唦䭲唀䘟ᒥひ琅Ṫ�᥋羲⫏㦃⓻ᘋዔ囂ⷢ剙✄敵⟫啷᥉㕷㳘㉫䬚䆽獌啷䴏ẵ╢晵杳൶瓌穾ዒ㪝⣐☃Ⰻ擏䧼变්冥⫲啷Ո๿嵙㥽匔☚੶哪ⶌ嶺➊坵♲儇㣊熷݋ֈૺ◹⪺囨⵻朮㽊磩ߒ稶㝍ᙾ⫛兿咳䔭ૄ枏䢪唅㸢築矊㜴癈⹿๊ᥬ▞Щ㋰ը≼巉㰪痵拃ჷ䇍㙰䛜ℱ⫂斞⭈嗁⾚恦㴊債ۊ榵懎Ⓞ䋖ᕴ䫢㖈檢咀⦙Ở〴瑕忓ヵ䛊暽⛏㖕ᬃ◙牋擅⼹᫭㳁⟵ғ⌵݊嵿⛏ᚇᫎ䉌⩙埇䣑䲉◬居䨲ᯄ滊ಾ᭔ẑᣐ嗿⬑咩⡆啑ℨ癅䕵嵶圔䭱⛊婥坅喗ር嘭⭘区㌬棵۪症෌疽䵂毛ጔ㗢㐃៣⫦廗䓺綵̓〷徐倁䳅浴櫅ᔩ䮝咀⺬勹Ⅲ炕簪歵㕍危㛊ᕠ㬆ᕄ櫣咶⺼垊ℊ䉹犪⧴⏉䂿⋟䶅嬟喘痳咎⦼劽㾂惩甊਷䩯杳䛞啿᫭啷ଊ⠇⾗᝽㗊担˫㟇䃭᝹⋎╥㬎㘖牳ᓋ⧲厽㘜纵⋫痵拍㝼ỉ嵬化ᘁ㏹坊ⳉḆ∢䠉ᾫ慵篌䕳㳏⥼窯ᗓ樺▦呪嬅㆒䴕悫殶⯎⽽⻎䵠竑ᘛ橽ᕷ䱼廥㶬䈕湒㓵㏉坳䫔幽立痎⯸摜Ⳙ䂶㦔砕ഋ⨴䛏捰ᛗ綍戥Ⓗ㉠㜌⟸䄑⊪揕狪㐇⣎ὼ囔綔㫕瘐ᯣ唿倏ᇹ㞚磩看し夲㊵滝▗ჴ䗘殰㔠潞垶⒚䥕ᩒ䗵瑏ⴭ㝞䍻媫放氜ᔒ䰨吺ㆦ杹痁沴⅋‡ۑ照拧畹⮿吳⭠ᯣㄨ则ㄻ䂵碍彳Ӎ暜ዠ稁䮴柯⡶奖⥺挥㈻⫴׍㽷ᇓ㶚泰楛櫨囚⩬埵㖪刕漊䈶篌棿滆ᵡᳫ瘗⬯喎⣠岃㹼䊭ᦊ癔湌⃱凖楹竻ค⬡咫ⲑ巙⦔䝅勊㿶䊌⵴懛օ檱෠ᩂ㛍⣡弳㊚瘭秝䝵炎ዢᭌ略䛭▹殤㜘浡幕⼊䣕咻椇்඼㥈煽┅ൢᬠ㖈棁妩㌄傊㬪ൔಋ㹳楎絹㫊䷽把㑼⯉堃㨲崹宫浗㪊佹⥊⵭Ⲥ☁䮕堟⸺寳⛦䅭ㅋ南忏吻囝䕣嫀ן䫤囻䬑寭⟦䨭杊⎇৊᥾᫁ᕱ䛎ᨋ᫼㝭⡇ᷓ㭆洵玫曷䢋磳⍈獮ዹ㗇ᩝᐳ䯤叹㲄埭ᦻ睖曬㳰姏ᚏ朅业᫦杘滞墑㓦汉伻㝔㋏糸᝕㵡朐旖㐎坂䤦噥㤂潰歫ᕖ◭焣o獹媠⶝᪡㖂濥崉⇚幍卪თ乮⦽秌ஐ欽䵶ᬖ㘢湥孍⺶殅ᩒ瓗㳉摴ॗͦ曇㖸ଙ㑯⧊卪仪猭璫絤凩ၰૉ᎕஗ൢ嫒⛰歂嚥㶜䩪Ẻཔ䦋㋸䋞኱糵ⶅ᮲嚔樉ᚵ⦶愅ᙺ嫕绉箷䫙卽Ⓩᕍ橴啋Ǡ噝⛪壍㫊⟷䶏䳽嗍妃嚢䔮婊⣄毅ᬙ㼚媵؋㺄䢊坱痉அ囑ᖦ⭾㓦浒埁╼䷹殒䧕㊊ჼ婇䶓ᛠ昛ᯃ㜶⤇᲻⤜檍劺稷䩪徹⋔孰㛈䴷⪞嗗䵅坲㙖囕ॳ⑴㺈䈰朴Ο۟畵孨㙦渚帍㾲宍䠻㊴ދ屯㗈㶑⢫䷲櫎㞚歆劦㗺槍痊ヴ王相Ỏ穫曦淦⯠柜桢忁⫌槎Ṱ哵湭滼㛞㮄㫇瘙᫝㗕䶽啛嫺嶥䯻⡁瞋矊ۘ暈㫽᥽婃㞆涅宻㝒儍箪稷ᝨ仱᧑⍥瓠疤婫╾ⷍ嘋䀖祕囪傕⾈卷罆͠囘෤⮻ៀ楝害㛆柍峻ᣵ揎ᳳ嗕ނ㫕䶐⯟ᗦ⹣嗓㢮䛍扺増តᇰˌᆚ皳䴴㯀㕢泂壞㶘稽:獕⎉凲৕୽䋖ᷡ᪳㖶潩城⡮斍๛㍖㖎凰ၜቸ京ᖽଐ瘆步ὅ⥚窄唊碆⤌⋻淆➎㪨奨㋺㘬亾咋ヮ䜕偛㖶᳈䇻䷜劔竁䵆㯗哲漹ᔥ♴䢽♲井ᾭۼ˜ᮛ嚯洶媘睜棃姫㴆匽ዺ眴䲏᛺௉捹产ᗍ猀ᔑ滘夷㛮洅悻ᣵ劊⇿䇙啲૔派㨤喙橡叻㋮伽ᓛ椅盋羸竌王䬞⶷ᰝ喩ⱁ嶷⍪湽漺㺗┍沾ೊ䎂仲秪婻㞴⼔匇㝚䒅瞳槗䖎䓳ⷖᝮ仂ᦞ卣ᙉ漋怉➶憹緒Ŷ㔏Ǻᯅ垀站巍䫟撀⹽ᔭ㫼国䒊濗㴈浾㷗ᮎ漑ѐ㫡哃⤫史㪆熽㦋ஔⴎⷻ敇湲曪ⶖ㩕咀⽭ᯕⅢ䟽兺㿉܎囲廛❪漂凿㩂撣桐䭟丠Ѡ㳴≓宲䭆䰪ཥ㜸㵱㩸㒄⦃ᖠઐѝҚءሏᵧߒྔỈᓙ䅹⥄ࠛ䒯ㅾǀ丰礐䨈ร䟂❢ᛅ嵾櫿䡳湇婯㴪ᅝ⪛ⴖ㕄号:侚uč旹甓瀛俯㤾操⇳勗ᨈ珰ᰤ⾙橡㷜簙疓榇婴㲾峝䚙⌔烌绲ჲ⽰廲凒篙眓沶⼕۷ڒ㋋消䴪伌䯴ᱚ庸䵧㩤ᮻ湗嵸Ṷ犸箛᜗ٯ寵㗴サ傸䨣䍴㙠⽱寓⧎眽䃌弔㸊求࿛篔撛㵮䅘ኃᝤ䥩䩞檬夛狴䋋޴廏ក㻠㵚播睧汴ቨ๞爬⾚㨕ᐌᯱ呃寀⢟㧵ଓᏻ桜๿⼎䱽䚛玫Ⰹ繪盐⌳㻺緸磝盏֒漿㏞䎶㬛Ỵ癪柺⿋徐⭌盵笛璗橗傖偯㩭箛吗櫳叴○❡⼀絳稶檖ۖ⫿⯾紝繝ሕ㸋厥㕑⽝庣紣㬊眰沈弛ㄎ匍嘛☔倎⁲૿㽪䙨᧜ል瓯歫墠ᘞ䌝㡺䍷樏巰濈㽴睭綡䕟眏榟嘏㚥ྖ⠽眔‿㧻矑㶟廌海筕瓿檽挠秢㐣䣠ǹⱥ㿸妫㷌经㶧▕吗涁妱Ⳅร∦戕ฌၔ伲㾉㼔椯勀ඛ激㸡⸡墍చޖណ⁘濉䄄擏⤯窭睐ᶌ䊦⼾岦愦ᄗ࠽⏿筟䠸䆠䵅ᗋ˒ܰ㶭š峰࿍ᑂԠ䵪႙ℋて㼊گᨭ殕庿⤡澽㠅爭戋䘣傍攷䓌盆އ箸᭰㦀桡嚣猦㺚㐻ᡜ吱ᱼ⾋㵃㰟盾䇐㋀握氚巨㈯㐹㡔傍惧歗絵㮓㌤ὐ㉇彡柩ฦ凵㠿ᛣ࢝惰Ǚωقಐ䵪䦰悖楀䗕✕䷳硝傖ㅞ⇮恟㭠秇沋咀秎䩣✧渮䨺䷄矑㥎⇦䌥ި䢊ྟࣜ叁个緛خ㠾ᡟᱢᠯ∆䏊䖡匬䪣ⶑ個ᑔᛡᘛ䀍᭶Ϗ羀线ᩓݖ᫣啸ヤͪጠ䞛℥ₐ㠣墒ႜ∐稝ڲฬᣋ࿐硁ⅆ䄸ᜬⳄ妡㢊㮴䒶悥ܝ毼᭑楕ˁ站瘦✭侎忿ᱵ焃懨圑䨞෯ǭא爠ᆤᢴ繅অ㱐孂⃴嚩䕐䛁ථ⑤㚲㱫Ⲩ㗡伬灗≞㑏儕↡䏕ڜ殂ᴸ㫕䢱粘爲椈ᓏ᩺䬥䉸*⎐䟥瑬⧄㝨沒ፃム㲄⾬䘬埐汯磮⏡⨣䛇桠㚋⍞䬝悂䵤咳摧盌┯ᆩ⌬拕Ƒ⽩妔⹱絃➓ⴶᔼ䥵仭⣣ᣦÇ愦⚵怾Ꮄ㭱歜⢠窭㰸ϲᒗ䲍⣣⏚䘪琟૔㲈曱䊑␀ۤᔽ唴璙⣴㳵⏎䚍ഷࣤ儈纘甹㜵捔Ϩ㔹噟ॉ刋ൡ筥ೋବ㍜㩑穄ԃ秱᷇橜⩑ᤛ函禾䚺䛆ᨔ㔰ᕑ䊑ᗩ犯怌崿䲍ᣱˮ⹥䛘ϊᷥ⹸玠㍙⬱ᝦ倦♒Ʈ矜戗㖂穵༰⿌㈗变浱ۦ০㥧匹⓲璟ㆨÕ扳癋Ⳳ墰栁牣寰䎬榮晜Ო䤔刈 勇㯨沽嘃঑碄ṡ⮬䬻੶ⲓ㣪燽土揥ཎỼ㒘慘嗃䛧ឯ䌿旰篆㤅冦Z䞍๞ᶇ䗈綴⫴⤥㟧઩䁬吣磨❪☕㫞ขᵘと濖◃矧撡␵䙝粂ԏ⠦ㅽ綮䦞ᣉ᳜ទ䌵篌៦栒欁噌⤆দㆱ߷൪Ỻᘟ⤁啣Ě㔮⌸婔⊔㽵㇙凹܋໚᥄ޯᨺㄨㅡㄳ⺫ڳ穁䓳ঽ₼॥Ǒ᧚᎘硱布う䵤༦煒抏䔇ᐡᏰ♛㮩Ḃ㿤植◱ῧⲢ₿另伵捡৹六⎴丞᧬㏈ᶮ䮃ॺᬕ丿幝劖Ԁ偝ፍ䅡ᒎ᭒㰘畩斳繨১䀁㱽撐㱠倷⷟㨬༡᪼㊄摩唑睇翧ᲿἺ璐慚⩽䍎䝤亥ᥰ㪤筚䘮䯂畩ె䕝䲁ᓸ⧍㼔⛑䝷⇴䣸汍⏀ྦྷⅴ✾籗䧗焅ਊㆹ➩ത悦ᙴ憸硃࿉ඬ檼Ŷ㿃᭯㫁␄❓皹᧪ὴ纮䢃⛃ᵯ悼恕岅濋䧛爝♷೥ᶩ庤愑眃揦⍭⚽⍼⩁ⲻ䖃�媰呍ᨅӔ灩歳獧汗焉嬏ჭ㔛⪵厛✞䠹檌かҮ妅瓚㼆窸浟䒂䔖樀槷✲眕ᮺ㥊㧱簝૊䡵崹嵒ʎ瓶⊬嵥䫞上氟ᜈ綪巃፧僗朓͝璗ࣹ৻厍✞侭⪦し᪦喙⒆ທ朒⩟㻓೬᧤ΐ曖䱃ᬲ嶬洶櫾╦敗ᯅㅣ㯜䳫Ǒ掊ᨪ侙ᩊ㵘悹䏳㝉砖ᔏᒵ⚄甒䛽卒ถ伂氹ᗬ疉燳濆㹮䂿Ꭸ䓑厗᧥卐⨥䴽᩺㌔磑冥䫊ᖭ䚽寶ᯇ㓢姀㏥⮵䶴桢㭡⬎渳憆೮粻୚杗ⴋ㌋ᷘ⟸嘫ὺㄬ疏㗓ᖇ䕯溽ឿ㚐ឋ䬛㐌⯨旗ハ壅⋲磵侇䔱礸抿䪁垌ᦿ吐晭丛᡹ᘌ潦批椆ዴ඾䋳囀泮ᦶ厘枤䱧ᡇᚌ琶爳ɡ森圑楚力玄ᨓᐟ䞊呄᱊㦧㠉䚓䣓䗭治䅚皞偡㧘ᎅᨵ䳽棶㣟ㆁ綝斦䳯䯎⭞㚎嶖姫帜暁ᙫḆ㎗㥬椓ↆ⧬ឋݟ䚚峫✔悳柶久梾㼌潢晕⌜礒冖筕⒑⹪໎圐⃗佶Ю㛎㡙倳儆⋭⮺ୀ䃘喁秶㳧昮伯⯞㷜懮櫾毇৮亽啘㚒崘㨋玶䬾䱘洞㼥㊂喙砆❶峌㵑溜杷㦠䕬杫搠幉圜礙瀫涋㉯無煚把ⓧ৩䷒櫤俀墲ツ懹捓欆㒅灾ㅟኋ˧䪡䆒❐⿑ᶞ㎸映ኃ皋⮙㌾佚㷈洈姟珒歸⸠巬㻜瀜姓告ɏᎺ䃝ீ㾌؊玸櫓䳻⸱㊤眚啳簊㥭㊾罕揗糫就奪៪传⬲姂纥䇵☇瓕斈ᣒ冊❵稕ஶ䰔ⳛỮ㦂癹䧳毦㞗⼻パ䏕⋼秎ସ䬊♘妛唰጑䭕潦΅ƽ࣒䟞࣠዆⦠朠ⲣᴽ垚づ䞕杺㧭㖔Ӗ沃棡᫙ᗲᝧ嘚櫭ᦌ羥䫳ચ碢J䑜᭟甜榼䯏䙬⵱歑㫦ヅ燝峡㥎Ὰᓝ⦕礑劷㌿曌ⱄ幒㧢糥法⬷M垿ᗳ䇊᳠㧣ఞ昵櫔姗夌渥圹↷䐋Ɀ瓚嚨㴌㦡䮜栆⼬屒㱗⳱窓㜷䇆♼䩐⦇湶旜玑ᚫ䵇ᥢ㩲禞竫ືୗᎾፐ㦌卶ㆻ巌ᙦ⾘Ἆ㽜滄伫᭺㵅硽瓟᯵崘ؚ䈍晶〝梬㛂担忓㼇䭕㹼ཙ禚䌞֪ஔ᠏喰壡㥄瘵厫乛♍ſ纳⺊ଙ׺௲⛎⿢塁㥢惶䆃粶篯屾᫷拑哿漎浢⚜ഗᷕ奸憮楋䆳⓭㉾ཱ⿼≃癁௥⫹⹖牁㲌掅䜓湷ᷚ橺疈ᖕɫ㜒䦈朶⹪幥㥇ⳅ婋嘫幌弾婜䚍䳧䗅Ⱆ䜇䜔姶協炉潽妊➬ڹὕ磀⣽ᦫ猼៪⿂嬫Ꮚ箅䥋㳒ێ䚾᩿ㆇ猞㧅⯜基⼢塇ᨂ灆拋⟧⃮嵿彸熁狺斺⭄᝱倚嬥㌊矵峫⚷憔穩㓟禊䬆槓䬾垣▔宙㡒⟅䮍砶ⳮ๹ã䶄狣ệ䬻៓ⱂ瑡㞺礷�⻍喡づ曔琢䠭㖢歫ل⼶嫏᝺懕䒋⫷痎ᾊ櫞⧕櫑䖯獒暙䵯ᨭ㠪痥秫恺牗౾杘ᶊ⳴笋⯙堍⵭᲍㌢润磫坋ௌ尋ᛑ嶉Ṩ֯疳嚃⸊姱㿚盥猋焷⯎䍻滔䓟怴痋䭓堖䳗ọ㢤癕䦕䟶滌⵸⫖涋Ԛ㗮歕垭ᒓẁ㹺窹罃燦⇮熽作䶒櫷ട毹晙乚彵㸬秵俋⍦⚬敽翲嶔䃫㘓䧲圠ⷃᲕ㉼烥厓⡆⏎漹ۙ䎜㊁ඵᦄ㬒摱寑㾦橵崻呖䰖୾㛞ᶂ⫣ා୔㛪㘂妥い朎眻汷◮嶏᝟⚇糸疴氒匸佢堳㌥㾭手ᯃ㉕ᅏ盓禉㚅擉毤㟉ⴶ弽㏃ㅭ媋ᒇ៎哼曝巔幷槻㏏⛿⿪巽㽰ⱅ妋ࢶ㷏㹼ộ⇔ଚ䷄毄㛔汬崥㠢磑圻㼷俍䳽Ồ₍ར嘋᭄氅☚᳥啳Ⅵ礓Էಎ㮻ố䎕䛤ⷼ史曊伺⳦㈜笹玻㔇⺌卹冴⚛欓ᖾ毚ᘠ洵妫㴢湍恻䭗େ⋼Û冘榇痡䯏堜湨ẵ媢绍䎓嗝疏്⽒㶀㫨稘歄✥೯᳞ㆆ甥睻⇷䯬櫻痛ㆇⴜ痥䯻埬涩彥㶇㚍扽秖ⷬ䖊⧐玜嵦渞嬴囜䶺崳ㄦ搕任᏷ঔ汿ෟ妖猒䶶஬ᘶ洽峓㽗嘅庻窢὏♠佞⍏疨禯孭㞢⾶供ヒ♭៻�ઋ澭哀∧ၾ◭፴ൡ涔圧ㇷŕ昝ⳗ᪏秖傋މ堤ᷓᩐ癧䀷㝧㥧ዅ⼊᪴ᦒ睵ᗖᆀᛴ䆿᳤矖䢯ɽ⼟࣢㘦嵍䟬䄔籕竄⛫䘛寿礉淳勹Ǯ硵ᇺᎌ᷊⥗珖ᵧ監ሌᥢ矛⩐揠⢃㪄⑨䗽灣槼懫ជ䳳ᷓ獌瘮淓廫も๽傚䩖♁ᗿ䯚ୡ汻樂⭜㓢氋ட⌆礽昺㎗໧嘺ᯑڲ⤨ؿ㩞暽⩛奷㢉刅䬻㴘漍㧼汣瞗䒳畐㭭䇝䛞囧つ˽剛⾗篦䏿叮ྊ熬㶼㭛坠橇庺⬾硝噮侗柎㩳⟓㖍⩒㸐箒祤焆Ἤ䇄瀮䯄俭䘍Ⲹ䟞Γ⼆〿㲵皭撴埏㙢⫝憛汀嗏ᯂ傢竝囝㷇₽瘭ͷ帻㣖滝䖛㼗碓ⲿᦫ澇㵘緫ᢋ䁐⎊⚿㗾梶ᴛؗ縌㲽㲉侞ᜄ倵箃皷潓⊘嫞暝瞢稗捈笩ᯟἠ缉緡簆噌泏嫟㿞攝圬䭐 ⢩㋟嵝些ؠ☌啙䒐⫧㿟ವ编扦惱≹̠㸛Ӆ忄㇋瓀╀㨅䲊ėử技ݠ࿏㒒媡愈ᇐٛ瀯৺⁙्䀦ǧ折޸ຑ㈰㯧㾫ἰᬐḆ㾴౷႔㖂Ǧₕ᲼攐ᲄ֠瑌䚣煲㘯㔁榷䀫喝甞၌⃼ྈᾀ㿀甡磰㸧儨簼џゕ愋溮疨愈ʼn൰㡞䶜ᒑ烀㨯ഠ䑘☦ᄄ棒䏃猒࿷棝ဥ⸢⃣徆璨樼沥悕儌ᅑ䏍௱ီ䮼僲佺栦⤨ᓳ଒ࡢ㢘㔨丹䎦ݓᒸẸƀ礜෣䤨༯䢮ᱚҙ单瘳抦Љᭂᴡ射२᜝ᬀ仸熢呒ⵣङ愺␌㳮䅦঄㣯㰺櫽糔Ჯ䡑㉚掫亲┲⥲䝴।笘㮠ခ筼է對眧橜ᏼ厠⽫⎯笤㣟洱慽䱘Ͱᬠ繁ᑡ濳廣,㋉硍ኮ性⁈䉳些শザ籡匽䝂䲐⎡㿜灶㉋ྞ戬㪒ɑ旙㣧⢱ሲ⻱䲒䥟㈇䄵䟦؇t⁰㫑稚ᬠய欿怤沕ᰴ㇪䤽䞒ᄖᶼ㻘畿ᷡᯧᮯ࠙㹝煏糂Sᣈ༟໑㤘昈翤Ḙ⸈息៲ㅦ଺笫㠥㝂ⴐ乢㦢㩠Àˌቇ痈䇚廥)ⓧਊ♻梘伤㊠˧๐䕘篆副ἷ扙碨䤚ⶪ␁ލ磢ɦݾฒנ⑄੯䕫奛ʫ愲䧗ᐉᑠѼ䍖Ը甄ᥠд梁湢潥犘ᆷ䈷ᐎ➪秐̒㽨俩棢㪘祡䊾䕟焮ᔅ๜吇Ӻ仡†łዠ㔗瘲叡⟊亀ª㿽俤ঊᇇ磨ڽ䅠 ቅ䤉磳珼Ů⪼怣⪙㔟洨�⠑䤽ở䍟㔮樢࿝瑱‱✪㟑࿗䈥≶㱎⟲㝦㦐༮౓䲇ਗ⦃捜ᄸ໻˿潜笑ᶕ潠牛➱В挱䩬ֿ涤䴨䴓ᇚ睲未㮑⢶㲂ᧉኍě嵬ࠗࡥ⮲㪹娃㏹㴭亜㢥ѷ䈴ᩪᶋ䴠瀠ྣ↊㸣懩㩟ᄆ儣ఙ̥శᵆ呸偯喢ݞຜ么ᐩ桅唔ㄤ㏅䋑ࢠᚓ簝ᷯ於凧準Ჿ㨒䥌㊩䴬刄౴矦弰㿌烨筯㵟ឦ㴞᥃玺㋾ӫ我Გƙ桑斝䟰殣彜䢥紈乑ሱ炐ƴϒ㾫ೄᬓ䆠寮稔禾窗約㣠௼㌉؟ẞ㹢盆ߓ吮䄠綿剅箧㘩摎ᥑ枰วᴮ㡎ᩙ睨ዴ汏Ꮌ䩲写㌸⁘䱥㴔⺩惠³䘠ఫ唨嚸䘲䞃抡䂢؞渪仨廎㣬ӕফ处♎㋃磠㆕Ǿ䘂䱼᜾捔䀱㭈䑥硣䬷ḉ汾⬂熕̚稭両ោ⹧Ἡ㼔筅秢ㆷば!䣬崲惒瑮೜ᝀ渰籼扚䨫琠Z䓹㲀◉噽䝆妞㌊旭䮨�⺔忰щԅ映⮷⺑掾㌤妕猒映?౷≸煽糘֐猘ᗫ䯗ᝌ倀u䑪癙ᅋ塈磏ᒻ狞䥫㌞昄ϧញ⿢床㭉ࡵ灦㱷㳏剿劉䖗ጆ䌶⯥ᡕ⽴拝䓫࿦ᾌ㩭从嶁呀喫欙慀氛ᑉɐ⚭㿤碡岋仚璣⾀栥〨垮㗡珒䢫⻧ቍ㹱䗩㓝炃㇔᭾㹎Ɩ䰫œ䮶恺䀥ᱣËߕ敓囨珎缱摀沊Ļ廹嵿㡗⹻ǽ㨢珕愋凷Ꮟ揢ⅇ䁫㬑廵₿埯⼼丛拚硎搻璴珏潿⇄綑尴弸ᰓ≷⻪䮽ᠣ慷ঋ娚㽉⠺粤橡ᐧᇪ弌㟹俭ኧዷ䛯⼻粘匁睽緳➧ᢉ嬥ⱪ㜷⻵⋳㶿㋨Ɲ樧璻嗳᧝䒜涡欲皘惣䃗䎽㩨罔ঊ᭗㷘⮩᧜燦ԫ࡟┰⎲㚩㉫㼬䥕ٻ奌ᛸ˼秚㈧朇㗪寠垽敃ȃ憒Ȱᑃ狀㇯ᦈᴦ翨㲶稼尉㟤磧ၻ㡶筏ᘌᙀ䮁ᩢ䉬⯠眃Ẏ┛Ⲣ姙崵ݶ爥獻強涏ᰢ痘刯圙媁寽ღ湹ʻ㡘禸ᗻ涄岳ɒ揚㮒⥕癟簥⥇懩巭啮粜ែ⟥ᾎ榡緜䂓ඥ⸊ᚆ~√㯖⃮⑔᜔ᚗ橀撿捁垞伖㼘椥߄㩬⅖Ѕ䐃ཛ尠̏䈾枂䛦縧⭗᯴ⲹ⣗䍧㵹೽碊ԗᦩ痮㩗坑ᬖㆼ簀櫭朦બᕦ矢崡䯆填佲਷戧㪡㧾䰅柿㣧ᴼ䄴ԥ昫縇掀梢沠ʗ<獈偵ァ⹙ʪ Ł/ཚ䁖⁓ᒶ偀⍚䴹䮛痴丮⦒ㄹ〿䐨ϱᰲឧ濨岽Ş糬券稗㡏៼砦徝氮緣篞ᝯ潿忟㴞砷ᰛ栯柉綹炘Ė℀恗〶眷➩㐂Ձ縣熓纷ᗯ䟼繥䄓㴙㣥箳眼䁰㲮᭡礡挧尗小塟漅愒∐㍿篊ྼཨ㵺⇾硃瑰ᗄ绮㑞ₜᦘ䈆摃ࠈ៬Ḱ㻐秞窣磄ェ渾塜ഡ愔䚡ĸ䟉ަ὘ᳬ扪➹㱖㔯Ў䉿梚徔刞Љ⡕ဌ‏庈罰緃瞧溯縿穟䲟猪斻揣ᄂན᧤㵬఑烠ᩧ穤࠿噞璡䄖㼅⏣䞿䢌ᾏ岐禑玄෧䠗༾ሐҜԕᄋᐇϒ䉨澼ݯǑ䬠殴ѯ͎㙝ႛ夛ਗ䡃䟤修Ἷ岮᳡缃氛垯娜䘡⑛攕䦢䠶ၦ�⥉ᭊ܉羑䑇ᦧ⺸嵜窝暟樌㏻ɱ⃉䡆㸬穪ⵓ斊⣯㦾堾㰮羐娖㐏⠞朋Ặ㷍╖䤠絆䎃ᖿӘᏂ癒⥷壻䙣佌挮㽩☹獘笇䭦玿ಫ羂╌稈珻ត矏‛᭜籝⎭᠈愃⏴罜溚࢐暩竀ា䘠廡䠚ᰑ榹築帑咃☿Ƙ᭢ᐧ粊ᤌ᎐庮檱疱�ࠧ搠㉮⬕㭙挘⹈ఊ柄㒸幻Ḳ篎熳ᷓ尠੾㹛偟‫☄ȃて⾏Ề祍⟅狫碣獏樑㣜粓ᑉ䲫⠫᠓婖ᠥ㺒硥牫憺㽏浡᳞⮁ଝᘇ䯦㢴摢廀㠪̵球ᜇ䖲᥾㙩㿸⬚⹕癍㏩儕⥥_ڪ᥹竰ᇏ፿ⳟ஗㌖㘐氜䏫⽘妍㺪Õ痂䕛婰ɠᖡㄥ挙水❐߬Ჴ䆥䪚缕簋珣扏倩滝䄂笙䲧氝㥿␱庣㽦礭笞ṗ摛㌗䪀Θ笑朐㩲樬濡㤤㌆笵㔹敗濼⏎∂⥐ᜟ暔尊ⳟ᰺廪⁶祍紭೗綗拿粊ᮟ箬丐ᰅ㟲᪦ጵ珶綍穂㱷燯⒈緞昼ᢼ渓寣㟎ऽ当䀃偐लᆍ㎪廿䗝㟇伝氨㏸㠊矫幻ˎ絥砸廗䬏挠௝໷圕ℵ᯶氍ᡇ廀Ɔ緍瘉ᣗ樏㣾Ꮯ澞伖Ρ寱ᘱ瀋幅㵂羝焛暗殏筩䗞畆纒瞏縠ྫྷࣩ筴᲎祧ཻ瀯倏៾ゟᾙ璻ᨬ篯琔濥庰约紝縻抗稿㇩痟儘∛ᵝ繘⨗縕徾ᔹ♅瑛憺⤿≞圭瞞᜖␍ᔔ摘熉䂻ํ儭祩妯煱惿㇝⶝㼄媳䠋ྸ潘䜤〩缃皜٢᳏㰧瀕▝劎嘒ࠅ㉩ᾀ⤴綢䋾ଢί䨹嫈ᒟ庚⍪吓⟨侭ὅ଼્堼Ⲓ歯孏⒉ճۃ䣚౸䉖劇尹湈䭖ʠއ歾⟥᯾ᐒ洝⊻ႋᶳ侷Ἰ嫍ର䌊澇禝恿⽞٬殟䨙ἴ᠐〆㓱㽼繹䄬હ᭰✨䨯ⷾဤ☖䲥៦࿪Ὠ幒罅绞ഁཏ囀Ⳟ⪜⤡䗤▫㱙⿾ῃ㸘綵紙翇糏綴䏠墣㘏㏌氕堕⿺㹫⦁䃕簷崎巏彿⛟灢笛⨞ŀ㟺俓ῶ庱儕绂߇産㣿凉渳ᬟ烆∙ฒ瀙恊ཪ㉥硁ỗ氠㖇䕴㶜土⿌氊埸瀁彵㽆縑纻犗经糿珟彝᜞ธ㦾ㆦԆ忯㻆⸮绳热ߏ篿Я㕩弞೤壵瘦⿇㓃⼵炣缺稗糯䍔࢞ዹ䝅䐕ණ䨆ఔ䷸�幉憍܉璃恷៯丼梥娭爭敃塞朩Ṕ㾚㵧絥歛㥟䭑⤟ሟ㿳⠃⨹⩬㾇愘崃籕ྯ绸⅟㽁䔟咚┖⠖䗸犚㿴绉紒㸷獍ি枈籀徽娛嬠瘢㨆ဲ㿜繂崀Է畉檿䳇纞犾ؙ౮᠛࿴怔愌羅絅䜇甃玧剔祯紟捇ᰝᴎਔ籺䀇矦⌗䍧砇᝴ໟ᚞笝爙䰙栉ᘦ吥㾕ẵ繛磇箪䁟䂄实眝͞䒨砉濭䈷㿪仑緛籂翏珿澰⎞㼜稛簔媲 㿥⪹羇液د祩䆜㳀⤞䄰㈝䠜栒ȋῤ缤羳絟޷皿瓿䍔䌞〡筙⹇倖濭吻Ὕ煣绪䀼⛿熜ן䚞昜☟爮砀怡忏㽹ƭ维碏璫槟䗟圞帟簞尕ㄯᐚ睛埭纛糊穉盟煰熟拑⼜Ⱍသ 忴翲㽪罷繤䗿疿爔؟瘟䰞湖瀙䀈忸㿔澫䤿緿篿篶ğ炧䬞἟Ⱊᐚ䀈堄媫䀋怂瀃㉮耊1瀂怄⨂耎㸋䶣0栎䠈氭耎儋耆 倄⠊倂㠌䨎ⶠ䀴各〯䀉䶣;2䐆耀‹老㬢䀳㈦䀼䀀5䀽 䀻炌‽䀀沬怿㋮⼢‼Ўƪ噁‿匥‹᠀倇老栂䀏‶䀄媡漦2ૣ怵9࿃怹总庍怱总怷笯怲 ှ䀿者栊ဴ4䚡္ံῇဳးެӍ怯း儂ㄬ纁怊Ἢ倳‱䀷᠊㘯〈怶墢〵〱䩂瀸‼䚥庌瀆〶䰉〰 䀾䀣〴䀇〲倇」䀽甇瀿倳ⴎ瀱瀱㪯瀉怎䧇࠴〈䀼砊《㔌​〹倽砆࠰怽甄䠺瀻䟃媯࠵ʠ㪭瀋߄⠼耂䠽ဆ䠾甋堎倻‵倳䠶်☊⠴怂总ܪ根⠹ᙩ怯倄㿉య倆᠄ ⠼包「္䀴栳倷Ư栾瀎䂍ᠼ⠱濃栶⠳濈堶栽〴ᠿဂᠴး㠉‍倾個倷ᠵ栶࿂堵样ṯᄃ瀾∇ᄊᐬ倳ဎ䠼ᠱ梭᠅䠻 瀾࠴堉㠵࠸啦破〶浦㠾㠰Ϧ砽㠳⠷ဈ䀏⠲࠳報ᠷ堰暯砾栶ᢃ砵砸आ༃∫砾歯л䠀〠м䀾堼й報倶ᠿ〼䈋䠴堂䐸㔮砸紤␾䰡瀶␸䐴䐶㝩␶䐾䐸࠹䐳而࠸砱㠋砃‎㢀㜊䐿 ౫␻⌈䜀婊瀴ㄎ搨ᠯ␴࠲в搻堾搱坭㄂␼匧ㄊ〵砿ᐽ瀰䠾翄吿瀺䠱䐻㠱堿㠺ᠽ堺搸瀽甆吻ᐷ炣ᐱ瀷唍␷睮㐵⠲〉吻⠰刀ွ䐰栽䠼砰␽㔌㐾㌥㐹㌮㐱㐷᭭琽㐿怎堲㼉䠻䐺࠲琼栰暧琼炩ర甃琱≯㔊ᐸళ礬ష吹ᐴ瀶⤯ఽк䬡䰹㌯఻హ䎫䰿琵耈䰵㼌䰱‏吲破媠ⰼ炥ⰷड枡愥愣愥䰡⌯Ⲣ禬ᅏĪᨢ礢唡ᰠ㤣䈧䄩ㄡ枬纃܄搭湭癬ᐣॡ┌侩渢严⨦丣ᘪ䘥丢栢%ࠥ帥ϡ䨠ḢḢ簩刯䢌栃ိ
娤⠥琤╧㺢爧㄃䘯ᔀ‬␦䎯ū椮ภ帩瀭
㰿戯夥⨌ဦ夫⸨ⰨᰡḪᠯ䀨簷橭ᛪ婬㞠嶬ਡ唬吩ᦩ倫夎猃耏㮮Ģ氼删䄠倡ԉ縡ഩ∪縠䈿䄩爮ಧ፤枡ᤇ傪‎侩瀤倫簹䰨ᤁ簺䔏䄭䀧瀤∼簵礫㰳瀮∼⠥∱ࡁ␠Ƚ縫㴯縪ȺᐮȲ礉Ⱥ䀽ȴ䈾ण稪䈸䈴匪昤ሾ䈶搩攡㸢㞣䈴ౠ䙪٧氵琡䀭䈢㰰ㄆ㰽䀨࠮㰳簺䤫氪ᄮ∰簽刴䀦․ģដ䬢ਧㄫ氨⠫ⰽိ
刾㈾ᰮ∸ࠧ㈶縥㈽䀤倯ᔏ刲别氯␯氽ာ⠯ᔈ∰㈸䀬
㈹瀩∸਼ਾ∽匮瘤爲ਿ氳㘮䰩ᨡ簭⯠ἃ栢氤䨾რ䰢଩尪ڢ਴搥ḫ事Ḣ弯หΤ  "}
      

    The complete round-trip took 47.7 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-file-analysis)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-analysis.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-file-analysis'
      • id string [optional] You may pass an id to link requests with responses (they get the same id).
      • filetoken string [optional] A unique token to identify the file for subsequent requests. Only use this if you plan to send more queries!
      • filename string [optional] A human-readable name of the file, only for debugging purposes.
      • content string [optional] The content of the file or an R expression (either give this or the filepath).
      • filepath alternatives [optional] The path to the file(s) on the local machine (either give this or the content).
        • . string
        • . array Valid item types:
          • . string
      • cfg boolean [optional] If you want to extract the control flow information of the file.
      • format string [optional] The format of the results, if missing we assume json. Allows only the values: 'json', 'n-quads', 'compact'
    Message schema (response-file-analysis)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-analysis.ts.

    • . alternatives [required] The response to a file analysis request (based on the format field).
      • . object The response in JSON format.
        • type string [required] The type of the message. Allows only the values: 'response-file-analysis'
        • id string [optional] The id of the message, if you passed one in the request.
        • format string [required] The format of the results in json format. Allows only the values: 'json'
        • results object [required] The results of the analysis (one field per step).
        • cfg object [optional] The control flow information of the file, only present if requested.
      • . object The response as n-quads.
        • type string [required] The type of the message. Allows only the values: 'response-file-analysis'
        • id string [optional] The id of the message, if you passed one in the request.
        • format string [required] The format of the results in n-quads format. Allows only the values: 'n-quads'
        • results object [required] The results of the analysis (one field per step). Quads are presented as string.
        • cfg string [optional] The control flow information of the file, only present if requested.
      • . object
        • type string [required] The type of the message. Allows only the values: 'response-file-analysis'
        • id string [optional] The id of the message, if you passed one in the request.
        • format string [required] The format of the results in bson format. Allows only the values: 'bson'
        • results string [required] The results of the analysis (one field per step).
        • cfg string [optional] The control flow information of the file, only present if requested.

  • Slice Message (request-slice)
    View Details. (deprecated) The server slices a file based on the given criteria.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-slice
    
        alt
            Server-->>Client: response-slice
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    We deprecated the slice request in favor of the static-slice Query.

    To slice, you have to send a file analysis request first. The filetoken you assign is of use here as you can re-use it to repeatedly slice the same file. Besides that, you only need to add an array of slicing criteria, using one of the formats described on the terminology wiki page (however, instead of using ;, you can simply pass separate array elements). See the implementation of the request-slice message for more information.

    Additionally, you may pass "noMagicComments": true to disable the automatic selection of elements based on magic comments (see below).

    Example of the request-slice Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details

      Let's assume you want to slice the following script:

      x <- 1
      x + 1

      For this we first request the analysis, using a filetoken of x to slice the file in the next request.

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. response-file-analysis (response)
      Show Details

      See above for the general structure of the response.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":7}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8017-dXofycrhOKTr-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8017-dXofycrhOKTr-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-8017-dXofycrhOKTr-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8017-dXofycrhOKTr-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8017-dXofycrhOKTr-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-8017-dXofycrhOKTr-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8017-dXofycrhOKTr-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":131,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8017-dXofycrhOKTr-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. request-slice (request)
      Show Details

      Of course, the second slice criterion 2:1 is redundant for the input, as they refer to the same variable. It is only for demonstration purposes.

      {
        "type": "request-slice",
        "id": "2",
        "filetoken": "x",
        "criterion": [
          "2@x",
          "2:1"
        ]
      }
    5. response-slice (response)
      Show Details

      The results field of the response contains two keys of importance:

      • slice: which contains the result of the slicing (e.g., the ids included in the slice in result).
      • reconstruct: contains the reconstructed code, as well as additional meta information. The automatically selected lines correspond to additional filters (e.g., magic comments) which force the unconditiojnal inclusion of certain elements.
      {
        "type": "response-slice",
        "id": "2",
        "results": {
          "slice": {
            "timesHitThreshold": 0,
            "result": [
              3,
              0,
              1,
              2,
              "built-in:<-"
            ],
            "decodedCriteria": [
              {
                "criterion": "2@x",
                "id": 3
              },
              {
                "criterion": "2:1",
                "id": 3
              }
            ],
            ".meta": {
              "timing": 1
            }
          },
          "reconstruct": {
            "code": "x <- 1\nx",
            "linesWithAutoSelected": 0,
            ".meta": {
              "timing": 0
            }
          }
        }
      }

    The complete round-trip took 13.9 ms (including time required to validate the messages, start, and stop the internal mock server).

    The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the filetoken is unknown, flowR will respond with an error.

     

    Magic Comments

    Within a document that is to be sliced, you can use magic comments to influence the slicing process:

    • # flowr@include_next_line will cause the next line to be included, independent of if it is important for the slice.
    • # flowr@include_this_line will cause the current line to be included, independent of if it is important for the slice.
    • # flowr@include_start and # flowr@include_end will cause the lines between them to be included, independent of if they are important for the slice. These magic comments can be nested but should appear on a separate line.

    Message schema (request-slice)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-slice.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-slice'
      • id string [optional] The id of the message, if you passed one in the request.
      • filetoken string [required] The filetoken of the file to slice must be the same as with the analysis request.
      • criterion array [required] The slicing criteria to use. Valid item types:
        • . string
    Message schema (response-slice)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-slice.ts.

    • . object The response to a slice request.
      • type string [required] The type of the message. Allows only the values: 'response-slice'
      • id string [optional] The id of the message, if you passed one in the request.
      • results object [required] The results of the slice (one field per step slicing step).

  • REPL Message (request-repl-execution)
    View Details. Access the read evaluate print loop of flowR.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-repl-execution
    
        alt
            Server-->>Client: error
        else
    
        loop
            Server-->>Client: response-repl-execution
        end
            Server-->>Client: end-repl-execution
    
        end
    
        deactivate  Server
    	
    
    Loading

    [!WARNING] To execute arbitrary R commands with a request, the server has to be started explicitly with --r-session-access. Please be aware that this introduces a security risk.

    The REPL execution message allows to send a REPL command to receive its output. For more on the REPL, see the introduction, or the description below. You only have to pass the command you want to execute in the expression field. Furthermore, you can set the ansi field to true if you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of the id field to link answers with requests as you can theoretically request the execution of multiple scripts at the same time, which then happens in parallel.

    [!WARNING] There is currently no automatic sandboxing or safeguarding against such requests. They simply execute the respective R code on your machine. Please be very careful (and do not use --r-session-access if you are unsure).

    The answer on such a request is different from the other messages as the response-repl-execution message may be sent multiple times. This allows to better handle requests that require more time but already output intermediate results. You can detect the end of the execution by receiving the end-repl-execution message.

    The semantics of the error message are similar to that of the other messages.

    Example of the request-slice Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-repl-execution (request)
      Show Details
      {
        "type": "request-repl-execution",
        "id": "1",
        "expression": ":help"
      }
    3. response-repl-execution (response)
      Show Details

      The stream field (either stdout or stderr) informs you of the output's origin: either the standard output or the standard error channel. After this message follows the end marker.

      Pretty-Printed Result
      If enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:
      R> 1 + 1
      [1] 2
      
      Besides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. 
      There are the following basic commands:
        :controlflow[*]     Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)
        :controlflowbb[*]   Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)
        :dataflow[*]        Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)
        :dataflowsimple[*]  Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)
        :execute            Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)
        :help               Show help information (aliases: :h, :?)
        :lineage            Get the lineage of an R object (alias: :lin)
        :normalize[*]       Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)
        :parse              Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)
        :query[*]           Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)
        :quit               End the repl (aliases: :q, :exit)
        :version            Prints the version of flowR as well as the current version of R
      
      Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.
        :benchmark          Benchmark the static backwards slicer
        :export-quads       Export quads of the normalized AST of a given R code file
        :slicer             Static backwards executable slicer for R
        :stats              Generate usage Statistics for R scripts
        :summarizer         Summarize the results of the benchmark
      
      You can combine commands by separating them with a semicolon ;.
      
      {
        "type": "response-repl-execution",
        "id": "1",
        "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n  :controlflow[*]     Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n  :controlflowbb[*]   Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n  :dataflow[*]        Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n  :dataflowsimple[*]  Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)\n  :execute            Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n  :help               Show help information (aliases: :h, :?)\n  :lineage            Get the lineage of an R object (alias: :lin)\n  :normalize[*]       Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)\n  :parse              Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)\n  :query[*]           Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)\n  :quit               End the repl (aliases: :q, :exit)\n  :version            Prints the version of flowR as well as the current version of R\n\nFurthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.\n  :benchmark          Benchmark the static backwards slicer\n  :export-quads       Export quads of the normalized AST of a given R code file\n  :slicer             Static backwards executable slicer for R\n  :stats              Generate usage Statistics for R scripts\n  :summarizer         Summarize the results of the benchmark\n\nYou can combine commands by separating them with a semicolon ;.\n",
        "stream": "stdout"
      }
    4. end-repl-execution (response)
      Show Details
      {
        "type": "end-repl-execution",
        "id": "1"
      }

    The complete round-trip took 1.3 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-repl-execution)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-repl.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-repl-execution'
      • id string [optional] The id of the message, will be the same for the request.
      • ansi boolean [optional] Should ansi formatting be enabled for the response? Is false by default.
      • expression string [required] The expression to execute.
    Message schema (response-repl-execution)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-repl.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'response-repl-execution'
      • id string [optional] The id of the message, will be the same for the request.
      • stream string [required] The stream the message is from. Allows only the values: 'stdout', 'stderr'
      • result string [required] The output of the execution.
    Message schema (end-repl-execution)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-repl.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'end-repl-execution'
      • id string [optional] The id of the message, will be the same for the request.

  • Query Message (request-query)
    View Details. Query an analysis result for specific information.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-query
    
        alt
            Server-->>Client: response-query
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    To send queries, you have to send an analysis request first. The filetoken you assign is of use here as you can re-use it to repeatedly query the same file. This message provides direct access to flowR's Query API. Please consult the Query API documentation for more information.

    Example of the request-query Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details

      Let's assume you want to query the following script:

      library(ggplot)
      library(dplyr)
      library(readr)
      
      # read data with read_csv
      data <- read_csv('data.csv')
      data2 <- read_csv('data2.csv')
      
      m <- mean(data$x) 
      print(m)
      
      data %>%
      	ggplot(aes(x = x, y = y)) +
      	geom_point()
      	
      plot(data2$x, data2$y)
      points(data2$x, data2$y)
      	
      print(mean(data2$k))

      .

      For this we first request the analysis, using a dummy filetoken of x to slice the file in the next request.

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "library(ggplot)\nlibrary(dplyr)\nlibrary(readr)\n\n# read data with read_csv\ndata <- read_csv('data.csv')\ndata2 <- read_csv('data2.csv')\n\nm <- mean(data$x) \nprint(m)\n\ndata %>%\n\tggplot(aes(x = x, y = y)) +\n\tgeom_point()\n\t\nplot(data2$x, data2$y)\npoints(data2$x, data2$y)\n\t\nprint(mean(data2$k))"
      }
    3. response-file-analysis (response)
      Show Details

      See above for the general structure of the response.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,15,10,0,\"expr\",false,\"library(ggplot)\"],[1,1,1,7,1,3,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[1,1,1,7,3,10,\"expr\",false,\"library\"],[1,8,1,8,2,10,\"'('\",true,\"(\"],[1,9,1,14,4,6,\"SYMBOL\",true,\"ggplot\"],[1,9,1,14,6,10,\"expr\",false,\"ggplot\"],[1,15,1,15,5,10,\"')'\",true,\")\"],[2,1,2,14,23,0,\"expr\",false,\"library(dplyr)\"],[2,1,2,7,14,16,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[2,1,2,7,16,23,\"expr\",false,\"library\"],[2,8,2,8,15,23,\"'('\",true,\"(\"],[2,9,2,13,17,19,\"SYMBOL\",true,\"dplyr\"],[2,9,2,13,19,23,\"expr\",false,\"dplyr\"],[2,14,2,14,18,23,\"')'\",true,\")\"],[3,1,3,14,36,0,\"expr\",false,\"library(readr)\"],[3,1,3,7,27,29,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[3,1,3,7,29,36,\"expr\",false,\"library\"],[3,8,3,8,28,36,\"'('\",true,\"(\"],[3,9,3,13,30,32,\"SYMBOL\",true,\"readr\"],[3,9,3,13,32,36,\"expr\",false,\"readr\"],[3,14,3,14,31,36,\"')'\",true,\")\"],[5,1,5,25,42,-59,\"COMMENT\",true,\"# read data with read_csv\"],[6,1,6,28,59,0,\"expr\",false,\"data <- read_csv('data.csv')\"],[6,1,6,4,45,47,\"SYMBOL\",true,\"data\"],[6,1,6,4,47,59,\"expr\",false,\"data\"],[6,6,6,7,46,59,\"LEFT_ASSIGN\",true,\"<-\"],[6,9,6,28,57,59,\"expr\",false,\"read_csv('data.csv')\"],[6,9,6,16,48,50,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[6,9,6,16,50,57,\"expr\",false,\"read_csv\"],[6,17,6,17,49,57,\"'('\",true,\"(\"],[6,18,6,27,51,53,\"STR_CONST\",true,\"'data.csv'\"],[6,18,6,27,53,57,\"expr\",false,\"'data.csv'\"],[6,28,6,28,52,57,\"')'\",true,\")\"],[7,1,7,30,76,0,\"expr\",false,\"data2 <- read_csv('data2.csv')\"],[7,1,7,5,62,64,\"SYMBOL\",true,\"data2\"],[7,1,7,5,64,76,\"expr\",false,\"data2\"],[7,7,7,8,63,76,\"LEFT_ASSIGN\",true,\"<-\"],[7,10,7,30,74,76,\"expr\",false,\"read_csv('data2.csv')\"],[7,10,7,17,65,67,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[7,10,7,17,67,74,\"expr\",false,\"read_csv\"],[7,18,7,18,66,74,\"'('\",true,\"(\"],[7,19,7,29,68,70,\"STR_CONST\",true,\"'data2.csv'\"],[7,19,7,29,70,74,\"expr\",false,\"'data2.csv'\"],[7,30,7,30,69,74,\"')'\",true,\")\"],[9,1,9,17,98,0,\"expr\",false,\"m <- mean(data$x)\"],[9,1,9,1,81,83,\"SYMBOL\",true,\"m\"],[9,1,9,1,83,98,\"expr\",false,\"m\"],[9,3,9,4,82,98,\"LEFT_ASSIGN\",true,\"<-\"],[9,6,9,17,96,98,\"expr\",false,\"mean(data$x)\"],[9,6,9,9,84,86,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[9,6,9,9,86,96,\"expr\",false,\"mean\"],[9,10,9,10,85,96,\"'('\",true,\"(\"],[9,11,9,16,91,96,\"expr\",false,\"data$x\"],[9,11,9,14,87,89,\"SYMBOL\",true,\"data\"],[9,11,9,14,89,91,\"expr\",false,\"data\"],[9,15,9,15,88,91,\"'$'\",true,\"$\"],[9,16,9,16,90,91,\"SYMBOL\",true,\"x\"],[9,17,9,17,92,96,\"')'\",true,\")\"],[10,1,10,8,110,0,\"expr\",false,\"print(m)\"],[10,1,10,5,101,103,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[10,1,10,5,103,110,\"expr\",false,\"print\"],[10,6,10,6,102,110,\"'('\",true,\"(\"],[10,7,10,7,104,106,\"SYMBOL\",true,\"m\"],[10,7,10,7,106,110,\"expr\",false,\"m\"],[10,8,10,8,105,110,\"')'\",true,\")\"],[12,1,14,20,158,0,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y)) +\\n\\tgeom_point()\"],[12,1,13,33,149,158,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y))\"],[12,1,12,4,116,118,\"SYMBOL\",true,\"data\"],[12,1,12,4,118,149,\"expr\",false,\"data\"],[12,6,12,8,117,149,\"SPECIAL\",true,\"%>%\"],[13,9,13,33,147,149,\"expr\",false,\"ggplot(aes(x = x, y = y))\"],[13,9,13,14,120,122,\"SYMBOL_FUNCTION_CALL\",true,\"ggplot\"],[13,9,13,14,122,147,\"expr\",false,\"ggplot\"],[13,15,13,15,121,147,\"'('\",true,\"(\"],[13,16,13,32,142,147,\"expr\",false,\"aes(x = x, y = y)\"],[13,16,13,18,123,125,\"SYMBOL_FUNCTION_CALL\",true,\"aes\"],[13,16,13,18,125,142,\"expr\",false,\"aes\"],[13,19,13,19,124,142,\"'('\",true,\"(\"],[13,20,13,20,126,142,\"SYMBOL_SUB\",true,\"x\"],[13,22,13,22,127,142,\"EQ_SUB\",true,\"=\"],[13,24,13,24,128,130,\"SYMBOL\",true,\"x\"],[13,24,13,24,130,142,\"expr\",false,\"x\"],[13,25,13,25,129,142,\"','\",true,\",\"],[13,27,13,27,134,142,\"SYMBOL_SUB\",true,\"y\"],[13,29,13,29,135,142,\"EQ_SUB\",true,\"=\"],[13,31,13,31,136,138,\"SYMBOL\",true,\"y\"],[13,31,13,31,138,142,\"expr\",false,\"y\"],[13,32,13,32,137,142,\"')'\",true,\")\"],[13,33,13,33,143,147,\"')'\",true,\")\"],[13,35,13,35,148,158,\"'+'\",true,\"+\"],[14,9,14,20,156,158,\"expr\",false,\"geom_point()\"],[14,9,14,18,151,153,\"SYMBOL_FUNCTION_CALL\",true,\"geom_point\"],[14,9,14,18,153,156,\"expr\",false,\"geom_point\"],[14,19,14,19,152,156,\"'('\",true,\"(\"],[14,20,14,20,154,156,\"')'\",true,\")\"],[16,1,16,22,184,0,\"expr\",false,\"plot(data2$x, data2$y)\"],[16,1,16,4,163,165,\"SYMBOL_FUNCTION_CALL\",true,\"plot\"],[16,1,16,4,165,184,\"expr\",false,\"plot\"],[16,5,16,5,164,184,\"'('\",true,\"(\"],[16,6,16,12,170,184,\"expr\",false,\"data2$x\"],[16,6,16,10,166,168,\"SYMBOL\",true,\"data2\"],[16,6,16,10,168,170,\"expr\",false,\"data2\"],[16,11,16,11,167,170,\"'$'\",true,\"$\"],[16,12,16,12,169,170,\"SYMBOL\",true,\"x\"],[16,13,16,13,171,184,\"','\",true,\",\"],[16,15,16,21,179,184,\"expr\",false,\"data2$y\"],[16,15,16,19,175,177,\"SYMBOL\",true,\"data2\"],[16,15,16,19,177,179,\"expr\",false,\"data2\"],[16,20,16,20,176,179,\"'$'\",true,\"$\"],[16,21,16,21,178,179,\"SYMBOL\",true,\"y\"],[16,22,16,22,180,184,\"')'\",true,\")\"],[17,1,17,24,209,0,\"expr\",false,\"points(data2$x, data2$y)\"],[17,1,17,6,188,190,\"SYMBOL_FUNCTION_CALL\",true,\"points\"],[17,1,17,6,190,209,\"expr\",false,\"points\"],[17,7,17,7,189,209,\"'('\",true,\"(\"],[17,8,17,14,195,209,\"expr\",false,\"data2$x\"],[17,8,17,12,191,193,\"SYMBOL\",true,\"data2\"],[17,8,17,12,193,195,\"expr\",false,\"data2\"],[17,13,17,13,192,195,\"'$'\",true,\"$\"],[17,14,17,14,194,195,\"SYMBOL\",true,\"x\"],[17,15,17,15,196,209,\"','\",true,\",\"],[17,17,17,23,204,209,\"expr\",false,\"data2$y\"],[17,17,17,21,200,202,\"SYMBOL\",true,\"data2\"],[17,17,17,21,202,204,\"expr\",false,\"data2\"],[17,22,17,22,201,204,\"'$'\",true,\"$\"],[17,23,17,23,203,204,\"SYMBOL\",true,\"y\"],[17,24,17,24,205,209,\"')'\",true,\")\"],[19,1,19,20,235,0,\"expr\",false,\"print(mean(data2$k))\"],[19,1,19,5,215,217,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[19,1,19,5,217,235,\"expr\",false,\"print\"],[19,6,19,6,216,235,\"'('\",true,\"(\"],[19,7,19,19,230,235,\"expr\",false,\"mean(data2$k)\"],[19,7,19,10,218,220,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[19,7,19,10,220,230,\"expr\",false,\"mean\"],[19,11,19,11,219,230,\"'('\",true,\"(\"],[19,12,19,18,225,230,\"expr\",false,\"data2$k\"],[19,12,19,16,221,223,\"SYMBOL\",true,\"data2\"],[19,12,19,16,223,225,\"expr\",false,\"data2\"],[19,17,19,17,222,225,\"'$'\",true,\"$\"],[19,18,19,18,224,225,\"SYMBOL\",true,\"k\"],[19,19,19,19,226,230,\"')'\",true,\")\"],[19,20,19,20,231,235,\"')'\",true,\")\"]",".meta":{"timing":4}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[1,9,1,14],"lexeme":"ggplot","value":{"type":"RSymbol","location":[1,9,1,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":1,"parent":2,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":0,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[2,1,2,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[2,1,2,7],"content":"library","lexeme":"library","info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":4,"parent":7,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[2,9,2,13],"lexeme":"dplyr","value":{"type":"RSymbol","location":[2,9,2,13],"content":"dplyr","lexeme":"dplyr","info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":5,"parent":6,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[3,1,3,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[3,1,3,7],"content":"library","lexeme":"library","info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":8,"parent":11,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[3,9,3,13],"lexeme":"readr","value":{"type":"RSymbol","location":[3,9,3,13],"content":"readr","lexeme":"readr","info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":9,"parent":10,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":2,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[6,6,6,7],"lhs":{"type":"RSymbol","location":[6,1,6,4],"content":"data","lexeme":"data","info":{"fullRange":[6,1,6,4],"additionalTokens":[],"id":12,"parent":17,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[6,9,6,16],"lexeme":"read_csv","functionName":{"type":"RSymbol","location":[6,9,6,16],"content":"read_csv","lexeme":"read_csv","info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":13,"parent":16,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[6,18,6,27],"lexeme":"'data.csv'","value":{"type":"RString","location":[6,18,6,27],"content":{"str":"data.csv","quotes":"'"},"lexeme":"'data.csv'","info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":14,"parent":15,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[6,1,6,28],"additionalTokens":[{"type":"RComment","location":[5,1,5,25],"content":" read data with read_csv","lexeme":"# read data with read_csv","info":{"fullRange":[6,1,6,28],"additionalTokens":[]}}],"id":17,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":3,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[7,7,7,8],"lhs":{"type":"RSymbol","location":[7,1,7,5],"content":"data2","lexeme":"data2","info":{"fullRange":[7,1,7,5],"additionalTokens":[],"id":18,"parent":23,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[7,10,7,17],"lexeme":"read_csv","functionName":{"type":"RSymbol","location":[7,10,7,17],"content":"read_csv","lexeme":"read_csv","info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":19,"parent":22,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[7,19,7,29],"lexeme":"'data2.csv'","value":{"type":"RString","location":[7,19,7,29],"content":{"str":"data2.csv","quotes":"'"},"lexeme":"'data2.csv'","info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":20,"parent":21,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":4,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[9,3,9,4],"lhs":{"type":"RSymbol","location":[9,1,9,1],"content":"m","lexeme":"m","info":{"fullRange":[9,1,9,1],"additionalTokens":[],"id":24,"parent":32,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[9,6,9,9],"lexeme":"mean","functionName":{"type":"RSymbol","location":[9,6,9,9],"content":"mean","lexeme":"mean","info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":25,"parent":31,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[9,11,9,16],"lexeme":"data$x","value":{"type":"RAccess","location":[9,15,9,15],"lexeme":"$","accessed":{"type":"RSymbol","location":[9,11,9,14],"content":"data","lexeme":"data","info":{"fullRange":[9,11,9,14],"additionalTokens":[],"id":26,"parent":29,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"operator":"$","access":[{"type":"RArgument","location":[9,16,9,16],"lexeme":"x","value":{"type":"RSymbol","location":[9,16,9,16],"content":"x","lexeme":"x","info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":27,"parent":28,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":5,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[10,1,10,5],"lexeme":"print","functionName":{"type":"RSymbol","location":[10,1,10,5],"content":"print","lexeme":"print","info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":33,"parent":36,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[10,7,10,7],"lexeme":"m","value":{"type":"RSymbol","location":[10,7,10,7],"content":"m","lexeme":"m","info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":34,"parent":35,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":6,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[13,35,13,35],"lhs":{"type":"RFunctionCall","named":true,"infixSpecial":true,"lexeme":"data %>%\n\tggplot(aes(x = x, y = y))","location":[12,6,12,8],"functionName":{"type":"RSymbol","location":[12,6,12,8],"lexeme":"%>%","content":"%>%","info":{"id":37,"parent":52,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[12,1,12,4],"value":{"type":"RSymbol","location":[12,1,12,4],"content":"data","lexeme":"data","info":{"fullRange":[12,1,12,4],"additionalTokens":[],"id":38,"parent":39,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,9,13,14],"value":{"type":"RFunctionCall","named":true,"location":[13,9,13,14],"lexeme":"ggplot","functionName":{"type":"RSymbol","location":[13,9,13,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":40,"parent":50,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[13,16,13,32],"lexeme":"aes(x = x, y = y)","value":{"type":"RFunctionCall","named":true,"location":[13,16,13,18],"lexeme":"aes","functionName":{"type":"RSymbol","location":[13,16,13,18],"content":"aes","lexeme":"aes","info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":41,"parent":48,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[13,20,13,20],"lexeme":"x","name":{"type":"RSymbol","location":[13,20,13,20],"content":"x","lexeme":"x","info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":42,"parent":44,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"value":{"type":"RSymbol","location":[13,24,13,24],"content":"x","lexeme":"x","info":{"fullRange":[13,24,13,24],"additionalTokens":[],"id":43,"parent":44,"role":"arg-value","index":1,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,27,13,27],"lexeme":"y","name":{"type":"RSymbol","location":[13,27,13,27],"content":"y","lexeme":"y","info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":45,"parent":47,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"value":{"type":"RSymbol","location":[13,31,13,31],"content":"y","lexeme":"y","info":{"fullRange":[13,31,13,31],"additionalTokens":[],"id":46,"parent":47,"role":"arg-value","index":1,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","role":"binop-lhs"}},"rhs":{"type":"RFunctionCall","named":true,"location":[14,9,14,18],"lexeme":"geom_point","functionName":{"type":"RSymbol","location":[14,9,14,18],"content":"geom_point","lexeme":"geom_point","info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":53,"parent":54,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":7,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[16,1,16,4],"lexeme":"plot","functionName":{"type":"RSymbol","location":[16,1,16,4],"content":"plot","lexeme":"plot","info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":56,"parent":67,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[16,6,16,12],"lexeme":"data2$x","value":{"type":"RAccess","location":[16,11,16,11],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,6,16,10],"content":"data2","lexeme":"data2","info":{"fullRange":[16,6,16,10],"additionalTokens":[],"id":57,"parent":60,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"operator":"$","access":[{"type":"RArgument","location":[16,12,16,12],"lexeme":"x","value":{"type":"RSymbol","location":[16,12,16,12],"content":"x","lexeme":"x","info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":58,"parent":59,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[16,15,16,21],"lexeme":"data2$y","value":{"type":"RAccess","location":[16,20,16,20],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,15,16,19],"content":"data2","lexeme":"data2","info":{"fullRange":[16,15,16,19],"additionalTokens":[],"id":62,"parent":65,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"operator":"$","access":[{"type":"RArgument","location":[16,21,16,21],"lexeme":"y","value":{"type":"RSymbol","location":[16,21,16,21],"content":"y","lexeme":"y","info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":63,"parent":64,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":8,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[17,1,17,6],"lexeme":"points","functionName":{"type":"RSymbol","location":[17,1,17,6],"content":"points","lexeme":"points","info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":68,"parent":79,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[17,8,17,14],"lexeme":"data2$x","value":{"type":"RAccess","location":[17,13,17,13],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,8,17,12],"content":"data2","lexeme":"data2","info":{"fullRange":[17,8,17,12],"additionalTokens":[],"id":69,"parent":72,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"operator":"$","access":[{"type":"RArgument","location":[17,14,17,14],"lexeme":"x","value":{"type":"RSymbol","location":[17,14,17,14],"content":"x","lexeme":"x","info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":70,"parent":71,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[17,17,17,23],"lexeme":"data2$y","value":{"type":"RAccess","location":[17,22,17,22],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,17,17,21],"content":"data2","lexeme":"data2","info":{"fullRange":[17,17,17,21],"additionalTokens":[],"id":74,"parent":77,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"operator":"$","access":[{"type":"RArgument","location":[17,23,17,23],"lexeme":"y","value":{"type":"RSymbol","location":[17,23,17,23],"content":"y","lexeme":"y","info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":75,"parent":76,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":9,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[19,1,19,5],"lexeme":"print","functionName":{"type":"RSymbol","location":[19,1,19,5],"content":"print","lexeme":"print","info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":80,"parent":89,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[19,7,19,19],"lexeme":"mean(data2$k)","value":{"type":"RFunctionCall","named":true,"location":[19,7,19,10],"lexeme":"mean","functionName":{"type":"RSymbol","location":[19,7,19,10],"content":"mean","lexeme":"mean","info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":81,"parent":87,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"arguments":[{"type":"RArgument","location":[19,12,19,18],"lexeme":"data2$k","value":{"type":"RAccess","location":[19,17,19,17],"lexeme":"$","accessed":{"type":"RSymbol","location":[19,12,19,16],"content":"data2","lexeme":"data2","info":{"fullRange":[19,12,19,16],"additionalTokens":[],"id":82,"parent":85,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"operator":"$","access":[{"type":"RArgument","location":[19,18,19,18],"lexeme":"k","value":{"type":"RSymbol","location":[19,18,19,18],"content":"k","lexeme":"k","info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":83,"parent":84,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8017-5pBU1JH0rGbN-.R","role":"root","index":0}},".meta":{"timing":2}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8017-5pBU1JH0rGbN-.R"],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":7}}}}
      
    4. request-query (request)
      Show Details
      {
        "type": "request-query",
        "id": "2",
        "filetoken": "x",
        "query": [
          {
            "type": "compound",
            "query": "call-context",
            "commonArguments": {
              "kind": "visualize",
              "subkind": "text",
              "callTargets": "global"
            },
            "arguments": [
              {
                "callName": "^mean$"
              },
              {
                "callName": "^print$",
                "callTargets": "local"
              }
            ]
          }
        ]
      }
    5. response-query (response)
      Show Details
      {
        "type": "response-query",
        "id": "2",
        "results": {
          "call-context": {
            ".meta": {
              "timing": 1
            },
            "kinds": {
              "visualize": {
                "subkinds": {
                  "text": [
                    {
                      "id": 31,
                      "name": "mean",
                      "calls": [
                        "built-in"
                      ]
                    },
                    {
                      "id": 87,
                      "name": "mean",
                      "calls": [
                        "built-in"
                      ]
                    }
                  ]
                }
              }
            }
          },
          ".meta": {
            "timing": 1
          }
        }
      }

    The complete round-trip took 27.4 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-query)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-query.ts.

    • . object Request a query to be run on the file analysis information.
      • type string [required] The type of the message. Allows only the values: 'request-query'
      • id string [optional] If you give the id, the response will be sent to the client with the same id.
      • filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
      • query array [required] The query to run on the file analysis information. Valid item types:
        • . alternatives Any query
          • . alternatives Supported queries
            • . object Call context query used to find calls in the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'call-context'
              • callName string [required] Regex regarding the function name!
              • callNameExact boolean [optional] Should we automatically add the ^ and $ anchors to the regex to make it an exact match?
              • kind string [optional] The kind of the call, this can be used to group calls together (e.g., linking plot to visualize). Defaults to .
              • subkind string [optional] The subkind of the call, this can be used to uniquely identify the respective call type when grouping the output (e.g., the normalized name, linking ggplot to plot). Defaults to .
              • callTargets string [optional] Call targets the function may have. This defaults to any. Request this specifically to gain all call targets we can resolve. Allows only the values: 'global', 'must-include-global', 'local', 'must-include-local', 'any'
              • ignoreParameterValues boolean [optional] Should we ignore default values for parameters in the results?
              • includeAliases boolean [optional] Consider a case like f <- function_of_interest, do you want uses of f to be included in the results?
              • fileFilter object [optional] Filter that, when set, a node's file attribute must match to be considered
                • fileFilter string [required] Regex that a node's file attribute must match to be considered
                • includeUndefinedFiles boolean [optional] If fileFilter is set, but a nodes file attribute is undefined, should we include it in the results? Defaults to true.
              • linkTo alternatives [optional] Links the current call to the last call of the given kind. This way, you can link a call like points to the latest graphics plot etc.
                • . object
                  • type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
                  • callName string [required] Regex regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression.
                  • ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
                  • cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
                  • attachLinkInfo object [optional] Additional information to attach to the link.
                • . array Valid item types:
                  • . object
                    • type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
                    • callName string [required] Regex regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression.
                    • ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
                    • cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
                    • attachLinkInfo object [optional] Additional information to attach to the link.
            • . object The config query retrieves the current configuration of the flowR instance.
              • type string [required] The type of the query. Allows only the values: 'config'
            • . object The control flow query provides the control flow graph of the analysis, optionally simplified.
              • type string [required] The type of the query. Allows only the values: 'control-flow'
              • config object [optional] Optional configuration for the control flow query.
                • simplificationPasses array The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used. Valid item types:
                  • . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
            • . object The dataflow query simply returns the dataflow graph, there is no need to pass it multiple times!
              • type string [required] The type of the query. Allows only the values: 'dataflow'
            • . object The dataflow-lens query returns a simplified view on the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'dataflow-lens'
            • . object The id map query retrieves the id map from the normalized AST.
              • type string [required] The type of the query. Allows only the values: 'id-map'
            • . object The normalized AST query simply returns the normalized AST, there is no need to pass it multiple times!
              • type string [required] The type of the query. Allows only the values: 'normalized-ast'
            • . object The cluster query calculates and returns all clusters in the dataflow graph.
              • type string [required] The type of the query. Allows only the values: 'dataflow-cluster'
            • . object Slice query used to slice the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'static-slice'
              • criteria array [required] The slicing criteria to use. Valid item types:
                • . string
              • noReconstruction boolean [optional] Do not reconstruct the slice into readable code.
              • noMagicComments boolean [optional] Should the magic comments (force-including lines within the slice) be ignored?
            • . object Lineage query used to find the lineage of a node in the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'lineage'
              • criterion string [required] The slicing criterion of the node to get the lineage of.
            • . object The dependencies query retrieves and returns the set of all dependencies in the dataflow graph, which includes libraries, sourced files, read data, and written data.
              • type string [required] The type of the query. Allows only the values: 'dependencies'
              • ignoreDefaultFunctions boolean [optional] Should the set of functions that are detected by default be ignored/skipped?
              • libraryFunctions array [optional] The set of library functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
              • sourceFunctions array [optional] The set of source functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
              • readFunctions array [optional] The set of data reading functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
              • writeFunctions array [optional] The set of data writing functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
            • . object The location map query retrieves the location of every id in the ast.
              • type string [required] The type of the query. Allows only the values: 'location-map'
            • . object The search query searches the normalized AST and dataflow graph for nodes that match the given search query.
              • type string [required] The type of the query. Allows only the values: 'search'
              • search object [required] The search query to execute.
            • . object Happens-Before tracks whether a always happens before b.
              • type string [required] The type of the query. Allows only the values: 'happens-before'
              • a string [required] The first slicing criterion.
              • b string [required] The second slicing criterion.
            • . object The resolve value query used to get definitions of an identifier
              • type string [required] The type of the query. Allows only the values: 'resolve-value'
              • criteria array [required] The slicing criteria to use. Valid item types:
                • . string
            • . object The project query provides information on the analyzed project.
              • type string [required] The type of the query. Allows only the values: 'project'
            • . object The resolve value query used to get definitions of an identifier
              • type string [required] The type of the query. Allows only the values: 'origin'
              • criterion string [required] The slicing criteria to use
            • . object The linter query lints for the given set of rules and returns the result.
              • type string [required] The type of the query. Allows only the values: 'linter'
              • rules array The rules to lint for. If unset, all rules will be included. Valid item types:
                • . string Allows only the values: 'deprecated-functions', 'file-path-validity', 'absolute-file-paths', 'unused-definitions'
                • . object
                  • name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'absolute-file-paths', 'unused-definitions'
                  • config object
          • . alternatives Virtual queries (used for structure)
            • . object Compound query used to combine queries of the same type
              • type string [required] The type of the query. Allows only the values: 'compound'
              • query string [required] The query to run on the file analysis information.
              • commonArguments object [required] Common arguments for all queries.
              • arguments array [required] Arguments for each query. Valid item types:
                • . object
    Message schema (response-query)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-query.ts.

    • . object The response to a query request.
      • type string [required] Allows only the values: 'response-query'
      • id string [optional] The id of the message, will be the same for the request.
      • results object [required] The results of the query.

  • Lineage Message (request-lineage)
    View Details. (deprecated) Obtain the lineage of a given slicing criterion.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-lineage
    
        alt
            Server-->>Client: response-lineage
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    We deprecated the lineage request in favor of the lineage Query.

    In order to retrieve the lineage of an object, you have to send a file analysis request first. The filetoken you assign is of use here as you can re-use it to repeatedly retrieve the lineage of the same file. Besides that, you will need to add a criterion that specifies the object whose lineage you're interested in.

    Example of the request-query Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.15",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. response-file-analysis (response)
      Show Details

      See above for the general structure of the response.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":2}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8017-QIw0JYlyIlFD-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8017-QIw0JYlyIlFD-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-8017-QIw0JYlyIlFD-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8017-QIw0JYlyIlFD-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8017-QIw0JYlyIlFD-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-8017-QIw0JYlyIlFD-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8017-QIw0JYlyIlFD-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":256,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8017-QIw0JYlyIlFD-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. request-lineage (request)
      Show Details
      {
        "type": "request-lineage",
        "id": "2",
        "filetoken": "x",
        "criterion": "2@x"
      }
    5. response-lineage (response)
      Show Details

      The response contains the lineage of the desired object in form of an array of IDs (as the representation of a set).

      {
        "type": "response-lineage",
        "id": "2",
        "lineage": [
          3,
          0,
          1,
          2,
          "built-in:<-"
        ]
      }

    The complete round-trip took 6.4 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-lineage)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-lineage.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-lineage'
      • id string [optional] If you give the id, the response will be sent to the client with the same id.
      • filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
      • criterion string [required] The criterion to start the lineage from.
    Message schema (response-lineage)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-lineage.ts.

    • . object
      • type string [required] Allows only the values: 'response-lineage'
      • id string [optional] The id of the message, will be the same for the request.
      • lineage array [required] The lineage of the given criterion. Valid item types:
        • . string

📡 Ways of Connecting

If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.

  1. Using Netcat
    Without Websocket

    Suppose, you want to launch the server using a docker container. Then, start the server by (forwarding the internal default port):

    docker run -p1042:1042 -it --rm eagleoutice/flowr --server

    Now, using a tool like netcat to connect:

    nc 127.0.0.1 1042

    Within the started session, type the following message (as a single line) and press enter to see the response:

    {"type":"request-file-analysis","content":"x <- 1","id":"1"}
  2. Using Python
    Without Websocket

    In Python, a similar process would look like this. After starting the server as with using netcat, you can use the following script to connect:

    import socket
    
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect(('127.0.0.1', 1042))
        print(s.recv(4096))  # for the hello message
    
        s.send(b'{"type":"request-file-analysis","content":"x <- 1","id":"1"}\n')
    
        print(s.recv(65536))  # for the response (please use a more sophisticated mechanism)

💻 Using the REPL

Note

To execute arbitrary R commands with a repl request, flowR has to be started explicitly with --r-session-access. Please be aware that this introduces a security risk and note that this relies on the r-shell engine.

Although primarily meant for users to explore, there is nothing which forbids simply calling flowR as a subprocess to use standard-in, -output, and -error for communication (although you can access the REPL using the server as well, with the REPL Request message).

The read-eval-print loop (REPL) works relatively simple. You can submit an expression (using enter), which is interpreted as an R expression by default but interpreted as a command if it starts with a colon (:). The best command to get started with the REPL is :help. Besides, you can leave the REPL either with the command :quit or by pressing CTRL+C twice.

Available Commands

We currently offer the following commands (this with a [*] suffix are available with and without the star):

Command Description
:quit End the repl (aliases: :q, :exit)
:execute Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r)
:controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)
:controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)
:dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)
:normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)
:dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)
:lineage Get the lineage of an R object (alias: :lin)
:parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)
:version Prints the version of flowR as well as the current version of R
:query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)
:help Show help information (aliases: :h, :?)

Example: Retrieving the Dataflow Graph

To retrieve a URL to the mermaid diagram of the dataflow of a given expression, use :dataflow* (or :dataflow to get the mermaid code in the cli):

$ docker run -it --rm eagleoutice/flowr # or npm run flowr 
flowR repl using flowR v2.2.15, R v4.5.0 (r-shell engine)
R> :dataflow* y <- 1 + x
Output
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgYnVpbHQtaW46Xy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfLSBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAzIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46X1xuICAgIGxpbmtTdHlsZSAyIHN0cm9rZTpncmF5O1xuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCAzXG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDRcbiAgICA0IC0tPnxcImFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=

Retrieve the dataflow graph of the expression y <- 1 + x. It looks like this:

flowchart LR
    1{{"`#91;RNumber#93; 1
      (1)
      *1.6*`"}}
    2(["`#91;RSymbol#93; x
      (2)
      *1.10*`"])
    3[["`#91;RBinaryOp#93; #43;
      (3)
      *1.6-10*
    (1, 2)`"]]
    built-in:_["`Built-In:
#43;`"]
    style built-in:_ stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
    0["`#91;RSymbol#93; y
      (0)
      *1.1*`"]
    4[["`#91;RBinaryOp#93; #60;#45;
      (4)
      *1.1-10*
    (0, 3)`"]]
    built-in:_-["`Built-In:
#60;#45;`"]
    style built-in:_- stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
    3 -->|"reads, argument"| 1
    3 -->|"reads, argument"| 2
    3 -.->|"reads, calls"| built-in:_
    linkStyle 2 stroke:gray;
    0 -->|"defined-by"| 3
    0 -->|"defined-by"| 4
    4 -->|"argument"| 3
    4 -->|"returns, argument"| 0
    4 -.->|"reads, calls"| built-in:_-
    linkStyle 7 stroke:gray;
Loading
R Code of the Dataflow Graph

The analysis required 1.9 ms (including parse and normalize, using the r-shell engine) within the generation environment. We encountered no unknown side effects during the analysis.

y <- 1 + x

For the slicing with :slicer, you have access to the same magic comments as with the slice request.

Example: Interfacing with the File System

Many commands that allow for an R-expression (like :dataflow*) allow for a file as well if the argument starts with file://. If you are working from the root directory of the flowR repository, the following gives you the parsed AST of the example file using the :parse command:

$ docker run -it --rm eagleoutice/flowr # or npm run flowr 
flowR repl using flowR v2.2.15, R v4.5.0 (r-shell engine)
R> :parse file://test/testfiles/example.R
Output
exprlist
├ expr
│ ├ expr
│ │ ╰ SYMBOL "sum" (1:1─3)
│ ├ LEFT_ASSIGN "<-" (1:5─6)
│ ╰ expr
│   ╰ NUM_CONST "0" (1:8)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "product" (2:1─7)
│ ├ LEFT_ASSIGN "<-" (2:9─10)
│ ╰ expr
│   ╰ NUM_CONST "1" (2:12)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "w" (3:1)
│ ├ LEFT_ASSIGN "<-" (3:3─4)
│ ╰ expr
│   ╰ NUM_CONST "7" (3:6)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "N" (4:1)
│ ├ LEFT_ASSIGN "<-" (4:3─4)
│ ╰ expr
│   ╰ NUM_CONST "10" (4:6─7)
├ expr
│ ├ FOR "for" (6:1─3)
│ ├ forcond
│ │ ├ ( "(" (6:5)
│ │ ├ SYMBOL "i" (6:6)
│ │ ├ IN "in" (6:8─9)
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ NUM_CONST "1" (6:11)
│ │ │ ├ : ":" (6:12)
│ │ │ ╰ expr
│ │ │   ├ ( "(" (6:13)
│ │ │   ├ expr
│ │ │   │ ├ expr
│ │ │   │ │ ╰ SYMBOL "N" (6:14)
│ │ │   │ ├ - "-" (6:15)
│ │ │   │ ╰ expr
│ │ │   │   ╰ NUM_CONST "1" (6:16)
│ │ │   ╰ ) ")" (6:17)
│ │ ╰ ) ")" (6:18)
│ ╰ expr
│   ├ { "{" (6:20)
│   ├ expr
│   │ ├ expr
│   │ │ ╰ SYMBOL "sum" (7:3─5)
│   │ ├ LEFT_ASSIGN "<-" (7:7─8)
│   │ ╰ expr
│   │   ├ expr
│   │   │ ├ expr
│   │   │ │ ╰ SYMBOL "sum" (7:10─12)
│   │   │ ├ + "+" (7:14)
│   │   │ ╰ expr
│   │   │   ╰ SYMBOL "i" (7:16)
│   │   ├ + "+" (7:18)
│   │   ╰ expr
│   │     ╰ SYMBOL "w" (7:20)
│   ├ expr
│   │ ├ expr
│   │ │ ╰ SYMBOL "product" (8:3─9)
│   │ ├ LEFT_ASSIGN "<-" (8:11─12)
│   │ ╰ expr
│   │   ├ expr
│   │   │ ╰ SYMBOL "product" (8:14─20)
│   │   ├ * "*" (8:22)
│   │   ╰ expr
│   │     ╰ SYMBOL "i" (8:24)
│   ╰ } "}" (9:1)
├ expr
│ ├ expr
│ │ ╰ SYMBOL_FUNCTION_CALL "cat" (11:1─3)
│ ├ ( "(" (11:4)
│ ├ expr
│ │ ╰ STR_CONST "\"Sum:\"" (11:5─10)
│ ├ , "," (11:11)
│ ├ expr
│ │ ╰ SYMBOL "sum" (11:13─15)
│ ├ , "," (11:16)
│ ├ expr
│ │ ╰ STR_CONST "\"\\n\"" (11:18─21)
│ ╰ ) ")" (11:22)
╰ expr
  ├ expr
  │ ╰ SYMBOL_FUNCTION_CALL "cat" (12:1─3)
  ├ ( "(" (12:4)
  ├ expr
  │ ╰ STR_CONST "\"Product:\"" (12:5─14)
  ├ , "," (12:15)
  ├ expr
  │ ╰ SYMBOL "product" (12:17─23)
  ├ , "," (12:24)
  ├ expr
  │ ╰ STR_CONST "\"\\n\"" (12:26─29)
  ╰ ) ")" (12:30)

Retrieve the parsed AST of the example file.

File Content
sum <- 0
product <- 1
w <- 7
N <- 10

for (i in 1:(N-1)) {
  sum <- sum + i + w
  product <- product * i
}

cat("Sum:", sum, "\n")
cat("Product:", product, "\n")

As flowR directly transforms this AST the output focuses on being human-readable instead of being machine-readable.

⚙️ Configuring FlowR

When running flowR, you may want to specify some behaviors with a dedicated configuration file. By default, flowR looks for a file named flowr.json in the current working directory (or any higher directory). You can also specify a different file with --config-file or pass the configuration inline using --config-json. To inspect the current configuration, you can run flowr with the --verbose flag, or use the config Query. Within the REPL this works by running the following:

:query @config

The following summarizes the configuration options:

  • ignoreSourceCalls: If set to true, flowR will ignore source calls when analyzing the code, i.e., ignoring the inclusion of other files.
  • semantics: allows to configure the way flowR handles R, although we currently only support semantics/environment/overwriteBuiltIns. You may use this to overwrite flowR's handling of built-in function and even completely clear the preset definitions shipped with flowR. See Configure BuiltIn Semantics for more information.
  • solver: allows to configure how flowR resolves variables and their values (currently we support: disabled, alias, builtin), as well as if pointer analysis should be active.
  • engines: allows to configure the engines used by flowR to interact with R code. See the Engines wiki page for more information.
  • defaultEngine: allows to specify the default engine to use for interacting with R code. If not set, an arbitrary engine from the specified list will be used.

So you can configure flowR by adding a file like the following:

Example Configuration File
{
  "ignoreSourceCalls": true,
  "semantics": {
    "environment": {
      "overwriteBuiltIns": {
        "definitions": [
          {
            "type": "function",
            "names": [
              "foo"
            ],
            "processor": "builtin:assignment",
            "config": {}
          }
        ]
      }
    }
  },
  "engines": [
    {
      "type": "r-shell"
    }
  ],
  "solver": {
    "variables": "alias",
    "evalStrings": true,
    "pointerTracking": true,
    "resolveSource": {
      "dropPaths": "no",
      "ignoreCapitalization": true,
      "inferWorkingDirectory": "active-script",
      "searchPath": []
    },
    "slicer": {
      "threshold": 50
    }
  }
}
Configure Built-In Semantics

semantics/environment/overwriteBuiltins accepts two keys:

  • loadDefaults (boolean, initially true): If set to true, the default built-in definitions are loaded before applying the custom definitions. Setting this flag to false explicitly disables the loading of the default definitions.

  • definitions (array, initially empty): Allows to overwrite or define new built-in elements. Each object within must have a type which is one of the below. Furthermore, they may define a string array of names which specifies the identifiers to bind the definitions to. You may use assumePrimitive to specify whether flowR should assume that this is a primitive non-library definition (so you probably just do not want to specify the key).

    Type Description Example
    constant Additionally allows for a value this should resolve to. { type: 'constant', names: ['NULL', 'NA'], value: null }
    function Is a rather flexible way to define and bind built-in functions. For the time, we do not have extensive documentation to cover all the cases, so please either consult the sources with the default-builtin-config.ts or open a new issue. { type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }
    replacement A comfortable way to specify replacement functions like $<- or names<-. suffixes describes the... suffixes to attach automatically. { type: 'replacement', suffixes: ['<-', '<<-'], names: ['[', '[['] }
Full Configuration-File Schema
  • . object The configuration file format for flowR.
    • ignoreSourceCalls boolean [optional] Whether source calls should be ignored, causing {@link processSourceCall}'s behavior to be skipped.
    • semantics object Configure language semantics and how flowR handles them.
      • environment object [optional] Semantics regarding how to handle the R environment.
        • overwriteBuiltIns object [optional] Do you want to overwrite (parts) of the builtin definition?
          • loadDefaults boolean [optional] Should the default configuration still be loaded?
          • definitions array [optional] The definitions to load/overwrite. Valid item types:
            • . object
    • engines array The engine or set of engines to use for interacting with R code. An empty array means all available engines will be used. Valid item types:
      • . alternatives
        • . object The configuration for the tree sitter engine.
          • type string [required] Use the tree sitter engine. Allows only the values: 'tree-sitter'
          • wasmPath string [optional] The path to the tree-sitter-r WASM binary to use. If this is undefined, this uses the default path.
          • treeSitterWasmPath string [optional] The path to the tree-sitter WASM binary to use. If this is undefined, this uses the default path.
          • lax boolean [optional] Whether to use the lax parser for parsing R code (allowing for syntax errors). If this is undefined, the strict parser will be used.
        • . object The configuration for the R shell engine.
          • type string [required] Use the R shell engine. Allows only the values: 'r-shell'
          • rPath string [optional] The path to the R executable to use. If this is undefined, this uses the default path.
    • defaultEngine string [optional] The default engine to use for interacting with R code. If this is undefined, an arbitrary engine from the specified list will be used. Allows only the values: 'tree-sitter', 'r-shell'
    • solver object How to resolve constants, constraints, cells, ...
      • variables string How to resolve variables and their values. Allows only the values: 'disabled', 'alias', 'builtin'
      • evalStrings boolean Should we include eval(parse(text="...")) calls in the dataflow graph?
      • pointerTracking alternatives Whether to track pointers in the dataflow graph, if not, the graph will be over-approximated wrt. containers and accesses.
        • . boolean
        • . object
          • maxIndexCount number [required] The maximum number of indices tracked per object with the pointer analysis.
      • resolveSource object [optional] If lax source calls are active, flowR searches for sourced files much more freely, based on the configurations you give it. This option is only in effect if ignoreSourceCalls is set to false.
        • dropPaths string Allow to drop the first or all parts of the sourced path, if it is relative. Allows only the values: 'no', 'once', 'all'
        • ignoreCapitalization boolean Search for filenames matching in the lowercase.
        • inferWorkingDirectory string Try to infer the working directory from the main or any script to analyze. Allows only the values: 'no', 'main-script', 'active-script', 'any-script'
        • searchPath array Additionally search in these paths. Valid item types:
          • . string
        • repeatedSourceLimit number [optional] How often the same file can be sourced within a single run? Please be aware: in case of cyclic sources this may not reach a fixpoint so give this a sensible limit.
        • applyReplacements array Provide name replacements for loaded files Valid item types:
          • . object
      • slicer object [optional] The configuration for the slicer.
        • threshold number [optional] The maximum number of iterations to perform on a single function call during slicing.

⚒️ Writing Code

flowR can be used as a module and offers several main classes and interfaces that are interesting for extension writers (see the Visual Studio Code extension or the core wiki page for more information).

Using the RShell to Interact with R

The RShell class allows interfacing with the R ecosystem installed on the host system. Please have a look at flowR's engines for more information on alterantives (for example, the TreeSitterExecutor).

Important

Each RShell controls a new instance of the R interpreter, make sure to call RShell::close() when you are done.

You can start a new "session" simply by constructing a new object with new RShell().

However, there are several options that may be of interest (e.g., to automatically revive the shell in case of errors or to control the name location of the R process on the system).

With a shell object (let's call it shell), you can execute R code by using RShell::sendCommand, for example shell.sendCommand("1 + 1"). However, this does not return anything, so if you want to collect the output of your command, use RShell::sendCommandWithOutput instead.

Besides that, the command tryToInjectHomeLibPath may be of interest, as it enables all libraries available on the host system.

The Pipeline Executor

Once, in the beginning, flowR was meant to produce a dataflow graph merely to provide program slices. However, with continuous updates, the dataflow graph repeatedly proves to be the more interesting part. With this, we restructured flowR's originally hardcoded pipeline to be far more flexible. Now, it can be theoretically extended or replaced with arbitrary steps, optional steps, and what we call 'decorations' of these steps. In short, if you still "just want to slice" you can do it like this with the PipelineExecutor:

const slicer = new PipelineExecutor(DEFAULT_SLICING_PIPELINE, {
  parser:    new RShell(),
  request:   requestFromInput('x <- 1\nx + 1'),
  criterion: ['2@x']
})
const slice = await slicer.allRemainingSteps()
// console.log(slice.reconstruct.code)
More Information

If you compare this, with what you would have done with the old (and removed) SteppingSlicer, this essentially just requires you to replace the SteppingSlicer with the PipelineExecutor and to pass the DEFAULT_SLICING_PIPELINE as the first argument. The PipelineExecutor...

  1. Provides structures to investigate the results of all intermediate steps
  2. Can be executed step-by-step
  3. Can repeat steps (e.g., to calculate multiple slices on the same input)

See the in-code documentation for more information.

Generate Statistics

Adding a New Feature to Extract

In this example, we construct a new feature to extract, with the name "example". Whenever this name appears, you may substitute this with whatever name fits your feature best (as long as the name is unique).

  1. Create a new file in src/statistics/features/supported
    Create the file example.ts, and add its export to the index.ts file in the same directory (if not done automatically).

  2. Create the basic structure
    To get a better feel of what a feature must have, let's look at the basic structure (of course, due to TypeScript syntax, there are other ways to achieve the same goal):

    const initialExampleInfo = {
        /* whatever start value is good for you */
        someCounter: 0
    }
    
    export type ExampleInfo = Writable<typeof initialExampleInfo>
    
    export const example: Feature<ExampleInfo> = {
     name:        'Example Feature',
     description: 'A longer example description',
    
     process(existing: ExampleInfo, input: FeatureProcessorInput): ExampleInfo {
       /* perform analysis on the input */
       return existing
     },
    
     initialValue: initialExampleInfo
    }

    The initialExampleInfo type holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resulting ExampleInfo type holds the structure of the data that is to be counted. Due to the vast amount of data processed, information like the name and location of a function call is not stored here, but instead written to disk (see below).

    Every new feature must be of the Feature<Info> type, with Info referring to a FeatureInfo (like ExampleInfo in this example). Next to a name and a description, each Feature must provide:

    • a processor that extracts the information from the input, adding it to the existing information.
    • a function returning the initial value of the information (in this case, initialExampleInfo).
  3. Add it to the feature-mapping
    Now, in the feature.ts file in src/statistics/features, add your feature to the ALL_FEATURES object.

Now, we want to extract something. For the example feature created in the previous steps, we choose to count the amount of COMMENT tokens. So we define a corresponding XPath query:

const commentQuery: Query = xpath.parse('//COMMENT')

Within our feature's process function, running the query is as simple as:

const comments = commentQuery.select({ node: input.parsedRAst })

Now we could do a lot of further processing, but for simplicity, we only record every comment found this way:

appendStatisticsFile(example.name, 'comments', comments, input.filepath)

We use example.name to avoid duplication with the name that we’ve assigned to the feature. It corresponds to the name of the folder in the statistics output. 'comments' refers to a freely chosen (but unique) name, that will be used as the name for the output file within the folder. The comments variable holds the result of the query, which is an array of nodes. Finally, we pass the filepath of the file that was analyzed (if known), so that it can be added to the statistics file (as additional information).

Clone this wiki locally