Skip to content

Interface

github-actions[bot] edited this page Oct 28, 2025 · 1 revision

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-10-28, 20:57:02 UTC presenting an overview of flowR's interfaces (v2.6.1, 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.6.1",
        "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.6.1",
          "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-9982-GeDPmRYfrP7j-.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-9982-GeDPmRYfrP7j-.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-9982-GeDPmRYfrP7j-.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-9982-GeDPmRYfrP7j-.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-9982-GeDPmRYfrP7j-.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-9982-GeDPmRYfrP7j-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9982-GeDPmRYfrP7j-.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-9982-GeDPmRYfrP7j-.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":6}}}}
      

    The complete round-trip took 21.3 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.6.1",
          "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-9982-1N16qKsGYvgU-.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.6.1%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%2D9982%2D1N16qKsGYvgU%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%3A210%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A174%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%3A89%3A18%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A205%3A25%29%0A%20%20%20%20at%20async%20FlowrAnalyzerCache.runTapeUntil%20%28%3C%3E%2Fsrc%2Fproject%2Fcache%2Fflowr%2Danalyzer%2Dcache.ts%3A101%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.sendFileAnalysisResponse%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A175%3A52%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09"
      }

    The complete round-trip took 9.7 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.6.1",
          "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":{"graph":{"rootVertices":[32,15,"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-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["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":[16]}],[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":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[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":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["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}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"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}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["32-exit"],"entryPoints":[32]},"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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-9982-zymUj1geA7vD-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-9982-zymUj1geA7vD-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.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-9982-zymUj1geA7vD-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-9982-zymUj1geA7vD-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-9982-zymUj1geA7vD-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-9982-zymUj1geA7vD-.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":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"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":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"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-9982-zymUj1geA7vD-.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}],"cfgQuick":{"graph":{"rootVertices":[32,15,"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-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["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":[16]}],[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":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[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":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["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}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"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}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["32-exit"],"entryPoints":[32]},".meta":{"timing":3}}}}
      

    The complete round-trip took 12.1 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.6.1",
          "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 7.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.6.1",
          "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":"ᯡ࡙䂼ࢀܠ墠⹰ₛ⨢瀺䃆ࢀ■挼͙ျ※:,ᨤヰদ䡌ׁ性䂬₈͐校ヰևソ柠㶵ⴞအ㬌ü硒砤䠣堣ᫀ䀫㊨⪯㋕൰Ƞ♩㑠〤磡扢௦ɀ矝⏂ʤ࣋晱⠢糴ᐬ㭀䌫巳梭爅碣⊈ᓬ磄㌲⏫搇狨凑猰沥ᓔ䚛ܰᥡ扰।扻戒䫮峟䷨媸沗㇂グⲅᅪ䢭㣝ᩳ༴垩暦ஹᣉ╴䶎堀檎Ҡ擛⪅᏶悯㔏廠᷎မ䘥࠲ௐ巯㐙⾜乊㕦瑋敦䓴ဠҁС䊐ĠǗ塀䛅ษ戌〮࿂ᥬ猡আ壸ਭ䨧䋀࡮༪℈ぬ⳦ጂ္ᅪ匰ᩪ䇮搸扥⓯ፉ檍ᶵ疞抎⟩㌥๶涱Ә㏍䅈ૹⅥๆᏆ▋Ử版ᅑ᷒櫅嶅惎Ꮆ⍪嵎ઞ祑᪊絍ᶇሠȔ晷!ኢ㐠Ⴔ੦ᆝ碊ѠǍ摤åϣ␼቎恣䣈ɚ䟐穾̩౱愄⌠˘ₚ㚍ர*吡߂枺宊䢐恀圥㕹垢⨴␠ ","results":"ᯡࠣ䄬Ԁ朥ᢠ⹲⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠᥶N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫ೉ҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨㾠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ౤䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥ௔う᧡㉕ࡉ᳎ᨨ漡╁Ř⵬ో੅ⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ᫰气፾䥓ѣ⤀㐽᷅ᥰ⒒⬮⥌堸∕絬敝ҁუ䕞ⵇ⨋卍䗶┠㴡䎫Ư吐䀤牾.㾸‡屲(坩源㣍㵩汲%カ४အ䡮彸⡚❵姚຤䆚丧ᨆ䳷ȶ੸媶狲孶⩶射塉䩖曵寖⻧嬺绰㠰ᇠ桲೰Ⴀ䧾ր᧵䯮⠬ݎੵ㠶䐲䚎䅲䣲⇯㠾ⰼ禾᏾㭾㯱磞㟣禞῿稡恉䠦獥ጸ烮Š䵵᦮㹢䪉␲䓆叾ѐോ┉䐦熸ဣ䥠滽äᠡჱ␶撡ီ㮉杭䦀ᄻᡐ峲⨥ํؒ㋢奶᫺ߨ戡奖ᛮᬱ滢䬖氼䞮⩟⚰晫㠩巤Ў䙓ᦩㅊ竾篩竞石箞㿠ԡ๋䔵ْ⭂׭⠸愻⬊䰤ں䃳᡺⭪ú㭩䡡壵框䞣え㡌ؒ㕈ᢦ烲᭦䡎ᬺ疬㍆㵝暆˪㑁䥤璠⋤婥ెខ巄爰䓐䓅丣姅ೋᙀ┧ᔽ抾䕮♖㯮䗥ە⅟᠑ᷢವ⏢⑵⥚囩㫁♕敋旑廴ͭ⡎㚔㡮ֽⰹޥ比ť䱖ᘃ㾳卝擙⫅剏孎䇯挝೿矕₅䜨䲌෎ṉ䨑淰✮墔⟣॒坩ᫎ⟵䕉哉ᅬ椦䭌ᮉ嵆䠉倰攂捉䪹〼旋ආ摌♡教ᝍ撆佑䮙४ș歄Ō⃄ᖀ㞔俁棋۶㷖倁Ⓢ䗝ቝᖱᚉН吷ᔫ˚ණᅌ噫௱೩嫞⑕╙噽乀⹱⺓᪕主圕ᵯ⬡㩿嫁㊟䬧埝畓䳒Ṁ㳘⸵ᢉᲠ狊⷇妅ඇ䖂㨣䳲㣒Ⅵ含䨫朂籰䣍㉣开⽝͚࠭䁚=汋ప␘奭煩╘ۣ㓣⇋攨箿ഽ㋪圤䡙棖梥㊁প囤ཫ灻羞ޟ崞┷孋ヷ剏ↄ挡䱆䳨矮?䣈�㏟૔⁖㕼緩峮⭤䲡磘ᓡ崤䅷ፄᨧ慄䧡⒘䒕‣⦬ਣ⢦㊠Ć᥼ǜ♣ິᦕθ㤑ܱ奈区㘡R䗰崯桰ም䐵ɯ劰〬₆ࠣڃ״ỉ⒨т≛ΐ㞲ಥㄫС㽕೤噫繬⣃᰹≉ᕦ䩐䜡Ҥ硡ন儴᫜䅂䲭τ㌤䱲䜨઩␧ࣱ丧䆨ස᰷␔⿧ₑ䚆ʪ碿࢑⬇ㄱՉ┤ᄼ㠧ᲄ䟀䲫䤈䭑漱ㆩᲳᢧȢ㞱ℽ䡀暀ᒴ䨶ᠷű᪃晑Ê⛤ኊ➨䙯㣹഑岲儱ѳᩉê㑆┿⓴摯䢦䯩⚲槲Ƞ愦ᆔᥣ⩸䝀䮩W࣡⺿⥑ᆃ獑㏊␣઀⛹リ恝䩹䌻⦣䅒㭑Ǯ╇抌斤᭭Ⲯ䳹油᥊ᴓ繘班妱璄厜䑭䄋䧩䚼禯၂/挓䍻へ㶅⒛枔捩䊣㙴編ዀ�ඦ။ف‵኉㪅癒俖લ�尪畆犚⋤憄ᛛⱍ犘ⶑ⑵䥈啒䁅ᥰ䒱㆝ৠ⹏拢⹅ᩊ┹๪Ó济㲅䅷ᓬ䂫㾉ʑ捏瀨凒᳛㌉ㄡᕨĒ晎਼⺒慴┴ႁ拔慅☚畱䒢杉⣗璅%⚅啾嘌刂嫑剽㴶禟ᔺ幌瀢ⵕቸᤲ媓ᦧ毉㐶㹥䓚捌ṷ⨂㕶方ᨋ㓑匳㟴ൿဦ䧍ଓ⬭䭱෽捊盋櫆ㅖᥠȉᎋᙂ媊沬檹嫽䶜墋˘檣⑵䵥嗠ᗌ䩶溭筱㇕壪0䝺⧁孚␆溄痖翌盠渭˷洣喠௘㩋╦➃ᐠ㼴矚掋伍ⱝ䗱浢巺⇌⪫㿔䮙瞎玉⣣溕ὲ妐嵚᫝ᬅ╥ᵴ㠊箍朅濭廷㴻夺凖檉㠕掜㛸注~∺Ỵ涽ᇸ䃨㧌㧛੠笕垘ಶ嘻ഒ溝ଵ䌳劧䫍ዽ⴯ᅮ瑸礊凝⣥⁛䍷嫚悑éⓕ᣹㓡沌⁞ᲅ'散᧿⎄㢠抂箠掬箈㞑碏粷熳⟻ϲナ夼⟟⧔㔀䎁嬸ଙ᧝䋴句勇ⅿ䚃㜄ഈ䵱䠉㋏椕㵘ፂ㳧�㩬悯䴝癹嘧㨋ᣣ䃘斢Ć⫙ᮯ㴬ᤂƥ憺秎洃䕓搞㦸熄䘤盬儃ᐠ⤮ⴉ䮽Ủ䯫磙㶩デ㟗晀搠䫦⳹盉ᗼ屜糝⌿潻㪈囆❏ᬉⷩ祽ᨕ楍滒氊㡇䎋⚒槴嬃仱䒼櫉᲻ᇙ玅㋚ᖌ晲抶ᛰ⳥国旪⚻ࣞ殥ㆦ㦟㞚綯端䲍哌晳壄ᇝЕ㱶枑䭓ᗏၱ沾䘻㶶ᰕᗚϩ㳆ᓇ眾簍㓡剭೼䗚Ά൑ࠇ㲇ឋ䟎昛懽ⲁ籜㌘ 䜢嬛ᣓ䜨瞻碙ມ朌䁁ῃ䅛䁼㫧᪕ऐ⒉澓竂牬㓮᱓懂Ꮬᩫ䫒䞲䇯ഛ㛄災㧽ᾃ呢炅⇄暔珌笯ʃ仅枒擥滍䃼ᇴ壇窜坒穗㝉⸽ޓ䗶ቲԒ䏯庫ᆓ⟆缅⬑࿵欍䧫礃淘依㻵垖㝺㕨〸惣༽ⷦ伛翞琏ᵇ୑╁瀾唊⟃歮㞮厊ₛ㏡ᱯቬ倖籯㴝㞽牳吆㲛捨៍⋳൩怢䓘᜙树橯䰅㶧剜Ϩ罇笐哢燆渏椹㧐焠շ懹埀簳弟澭礎ሏ晉㒜Ų焷哩俜✏ѐሄ䓯嘞⺟ね堘簣彛柌ǿ夑卛磪Ფ瑗昽㠍枿漙ᐆ窿犛㿧緞ဠ夹⳿㓜�㧜࿭經宴羺�枞ᴔබ岠Ḟ瞕άⵀᜠဪ揟帀ఞᩖ䎼淏樎␯扈˶渡ੳ箸ㆰᇾ䖒恰僯洈䴔忚Ƞ᷊๠ᡁ㶶柶ਐ㿕ⴈ᡾ᠪ䦻ͫ斮沒䀪˺摞唐ᯏϽ棡㖓濎㱻挎ᄮ႐䌘ᗆࠤၪ㰵殒䔫侸䈽慁㰯Ꮊ䎄᷊崬㋄熗䦠妕䶧ⱑ渢乁恦峊扺〉填綎⾁ǁ⿑⠽င匫ₙ䊂懜ᙠ碏沐槁簗澴䍅ఁ缨灦䷢Ꮔ䙰彎優䨁䮒࢖唂ቼᖐѱ䷓殡䶐勊∲὞ᔳ撑嵼ᣈ⩠利ჸುబ㓉⏪ᥱⴑ珖⎌ᗎ媨呾䊊៪㪪榴၉Lj⪩傃⒚៱گޫɫ⑑皪䲤挹℈ᦒ傗䋄歑欪㯈⋐ӑ䜮檲抆የ⩥恅Ț᧶ᔵ䱾掶ᥞ櫖Პ扖ᣲப槌搜�౓岉拦ᗎ➪屴撾ᢡ㶄⒀䉴ᦡ澨摢ⶸሱ䠑㮱䧾ዂ㾓欹紥⻞䀒徠拆➨櫦㱨፸ᬩ䦩⣒ክ࣪币ቖᴐ␑耔ᱥ䔑ၩС౳㳱ቺ㉬ቡ⍩ṱ牪槄ĥũ禮ᶬⱹᚸ呬䢈ፅש੯劂%ᳩţ♅揹᭾൐અ挡‖悭犕ⲅᦩଶ⪁䍛▨ൡ䀣瀾ጶ⍴檖劙᷁咐橶劕ᄩଷ橹勔曈ⱦӎ勄殉筬劐ጵቺ❨愪匰ȉૢ槎委䆾ݨ槟勀࠹ᝪ桮⏩戹リઔ㌚ᣪŤ橶净Ġ‐欱ሱቩ䐤⚖偳ᚹᵇ٢厭᥈ᳮ♳娓ᘉ勫智もᬁ䓬翖ࠫ᥉戕⡬ý朠䛪᪄㉿佹ⶄ癥叓᛹ۨ欢㋻᭑ഒ瀰㌤梹燪㨴ㄫᘡ滩ᙸ犖ᅙ秪੬獷᝙ԫ㙼㋇᫹㭮ወ㎦ᝉ☨䚓≉⢹㷨๵犯ᠹ凭打兣ᆞ确偶㌳ᝡ柪癥犔᛹俩ሥ楂ᵙ㿪㹠௡泤ጮ㚒⌺┠ࡎ纟᳐ଥᗢ穲ૌᣪ੤乖硓᜙౐慡稀傞䳣慶ஃᦥ㽩♜狀堑䚵璆样ᓱъᅥ૝᭥⣤㊱䅥॰ਭ៖ਸ਼ᇆ๊熝ʘ媙焪ᙲ狐E湊窄䪤嗆摧䩂兽௥๪䧜䨵ϔ穉境ચೠՈ楰勴壅ᱭ㡧�戁⩎呴敬傀缨桶⋔塥担♭䨫ᑉ歏礹糵ࣈᖐ如ዑᘅ粫妃∼嫑䳧ቚ䯲ᐥᰐ֑⌌⢹嘀ሶჸԌ㳦⥴厠喨ӈ䀲⩲塉⃍ಕዕ漵㘁整咏᛹ⳍᕾ゛扵擋ᖏ䫓᥵㫍╨䪢ᣙῩ㼳⮒嘉⻊䫚௒勨牧灧涞ᦅᔳ㘶ᄦ勸ɍ֟敆呕ᙈൢ欬ႜ㈓╫㏕⦥㗍㖝䩶៩䑍ⶌ籰墕☓穱毶崥⦶涞⫉ᜉⶖ浴⯕♞䙳㉊炻ᬙ㹌ো毳Ꮥ惋涕ⷞ嬅䟌㓀ᮎᢈ⩠ᠯ਺夑炌䍬氖妸䚐䎐䮡刑墎災㉉ߢ௎兴旋ත忈ᕽ歏ᖭ䫭፯㳩࿙浵矜ᯊ捭ǩ厙ʬإ᲋൥䘟ᆔᯍ㪑㌯樥䁊岦ౙ噾㡍㍿䩌⇈ᆌᎍ檙妸঎Ⅰ猅嚥圭瑹㋉卥峭㥷ᯯ᷅ᖎ䀫੕峩琧咔᭙ᒍ媉ᚸí偙䮌咃ᐠցᑙ䒝╪᪀皮枻⭼滷坴㓈䯻䲳猇㟅㜄怮䣍㖩⏋粹ડ㚒㙋㍉帵怿�⠴䣼㓈幛ᱨ亯㑲嵛栩亡攇㍛ೆ6∪ؠ᪪೐̭▽ᦱ䎂皷㳚⒩⻌瞳仛曀滆睻ⓚ深⻒ۘ↠ۊᛌ栗㷕᩿窲欯㯻凵ጩ疉䚐➡h㨧⎋േẮ≭੻峾ወ䣖ක庺庥睒⍜榢約皭ⱻ䊴㻕抯ⴂ᛹㼞㛪偬性㻒硠ᒤⲥ࠻㗋⪄亦纯畻⎛嫸犿癮ရ甴ᔀ࿟㐚夀籇㚿㢲ᢍ哝㦧㷋婸䇏◀熴憪㱏瓈䬧毼䆦ᙙ⼦篽䈖ᑴ㣺䯹㪵લච恐↰呃⑱摝ጆ๒䀠᫘ņ৕ⓣ䍄怡碗㓗䍾䨱捈ग़&̄ฬⱬ⎜ಱ瘔幂䩒ᢱ埅ᒒ␖榌අ⒑�棱俷梌㶾深偕⟕浦Ἀ嚮䑕䙠䰡泷⁄探㘎屶ᶻ燼ᣳ̗㒠ਚ᧞具Გ姞᱐䮮⢕ᶶ䴑喭ऺ圌䅢瑆屎㣍䉮䂧悆ᛑᮬ㪥䊏䣩䦠⥡瞵䢧晰ā怤ეᾠ潅眭䠷昭⾃礷椠泎䩭㵙Ꮺ䙿ᶩ埈泸涑氙䀵匨煼⌣㐭䂁׾ဘ皢ఠᐉ䃮穕塙獙⥠利ⰴ冉朠ে渌桾坮᥽⃋ᱹ嚬㚓卻ῗཬᠬ㎣ᷦ܀Ũ猳ᮬᓮ㌬ၓ᮹祘皋匣䢙囬晓㎍ᨩ孖ဢ廛ᡆ䚤ຜ獣ᶺ⼱亟叧᳙嫻⚖㐇ங埇㺍㍅থ愔႑்〙桌⺈௣ဥ擬↚珗ịఠ写㎨х俭㓧ʄ婥䱸⦑珈寮⇯冐఑䘥幃㆜ெ㒥巬徦䮛ᨴ位硱䫚ѥ筮湨⮴寅圱妓ஶ㊵䕁⺎㌘奍ᣎ榘䯪妙殧ᐸ⬿὞曏䖏琔嶵绐斑䭘夅幍ↄ嫚奵綮湪氊寑!哕㜣ᬉ䖳圕㚳ذ᫩垦㋫㠥䬜嚎ㆋ⶗㬕嘿宒僿嬌施コ坺䦪᠕㥋ώ䴳硡㹓♼܂嚜㘻剓㣹៸医ᇌ⓴䰩ȋ㿓爺៳㮬哽㌒㜅㮫վۥᕫ㎻䳖檫㛃あࢤ᜕㪐匶滻ᜀ⍋㘫ᓺ拽㝓㓻犐་㚾敒槼眘ţណᅾ櫓ǝ惱̡僚⡲भ⮻ହ✀ųⰢ灚牒㖳縅攞✪㪜‒捊ϝ२仦࠭䨷ى廁ἆ偯㊰ᯖ#Ⴕᓛ㬿܊瘠痆☔ጝ棉㧡Ո䀤ྞ姛⠦漎瞑㿛⠧ᔁᕊ㈛♣἖❶垳嗦弑✏㈜߻潓癹ଛ䅧㼏刭䘛Ώ绩㓠猧䅮ጃဎ䣪丆䁙∣匋㻺䦧ะ砵佸૜༰痈㷽ᔊ༯㺧揾凨ǐ熛੣懡⚪㮛罦₩຿㌛ଔ凼珷ᯇ濼⅏盜䶽也撑᠘痧ᩢᝣ僋坎㣾䩭丱汸䥚ἆㅐ睇ŧỮ✴疛ᕛᦤⱔ癧ਖ਼畎佟ㅸ͝爱亵ᤇ殌㨕俧䞉㠢慪眺⒌Ӝ温੔ᴇ㑝箬佯㨇ᱜ弞༜瑧畛⒆俨緇ჟ㨞伈粇ᜉ娂⹨屫㓘ᠳ⻔惠ᠢ᭔䓔㧷滜渳丯㬇⪿昆✪琇拙弟倏㹷⃚嗵༔筧䍟凶崚皱晙嬖哶珷爬⽯ཞ厞Џ寖⻄箷㝝䧱䄥₀ᝃХი尉䣅⚞Ⴢը僬ภ䑋滌ૠ次Ӑ灷՚⧡ུ狔㋜㻼滿㨷᩟׽⽸ᒗⅭ澌⊈℘㙮櫶㏈┠撜෫俄纗痬帓傎瞗࿼㷥砬̗㟞ᩗ儴ᜠ濙楏湜癗�秴潪籔䃚槤Ẋ瓗䣙⸎⊱燗⁜㓚ὑ爞๠䇪⻆♨♚揮⹐熗ᱶ巬Ǝ羗⣡ᐓ潾磢Ӣ号瀀䝯箇䨗伡牷㕛㐌湙珇⺞䐒瀊猜⦝䈑ᜍ炠䰹㈳�煏尹㰋⺅窗㦛揢弩狏勢㷹ṕ缗涙后幜࿏翜ᰓἨ犏䥣ᰅ⽙筇嫞尕ⱃଏ爃澇异笁崊ঘ䛔みඌ夙㟩䑗Კฆိ箧㤞Ϡ⺳簷כ؇B縳ᮜ䨩㻫ᠧ峹࿘祫痆㾕ℶ秔䘏䡟㏎禜᧜㈙䘋⩮籗睝埱⾴狯ԛⱸ῭絷唞珧㸩㕟刚䁘纥ᱟ樝倖㽐㴠爟㯥䓣֟㨚昅㻮絿啇篲庩焗犆࠙ὕ爗檝叴㺟㩓欿⓽爑ϴ潭綳烗䞞⮘稉澳ग箇恙Ḝ䠓柹厇⇏畧偺త Ꭲ繵篙澯⋝䬖Ꮻ署㲟猯后घ缍࿐ƕ窠ჿ೽ီ㟲ཝ⦗癠ើ⠐瀴䂜Ỽ٘歒ແ檠俰♡˫琨弡栙᠃࿝Nj禠᣿㌣玕き὘ϊ攰⯲㔥㇦䱀✛㣛⣎ᚣ弔⿶➅籆疰ㆡ扙ᰈ傅庍磣扺⭄¶ዮ惍᥷ݪא瞸琴໕ᩝ䋘ႀ䄢䘮䡅㽀㷆睐Ⅱᔚᜋ~繅単ᣈᣀ㵲硆჌㢘✾୰攢₩凐䄦牄᤭੣亣⑞㽇綝燏忡ጦȺ柂㹁ݠᘰ疣樕塓ᄄ䍲ਚ䇡媧㈰う䛑૆ย㯵渮⽻綖䊈∐㉡㼥栰࢑开ִᩧ᜜⸒䏪債ɫ∅۪㺤ᗋ梍㊖ቛ׷ᚭ⬯惯Ĝ䌒瑈⢁护䘿႘慰ޏ楰箜ᰯ䁓ᠭ䋝ዘ㶦唢缦瞶ő㇐析渣昖ᔻー㶖ଓ䙡ኧ堈䛙ⅇۗ暐呼◆㱞炾Ω㌤ⴡ妰ᠮᐣ慽հ憂ⱃ䠔㿻༡䍦眘㢁㘚䘱徱慌ոᰨ朢⿦≎㾂Ⱪࣟ䓂暊的䁭繄奲ከ团梨ᑈì␖໤㄁૛焳�愱Ӕ⽨楃ᮑ呿䢪⌌⌬᎘䰤ᄼূ�䑒ᜐ䒣䲨㏵䣃㷹઀⼱䬧㤸⑥戒Ꭺ၈惜十䩚ࢡࠫ眤㛮㌪琻㥑减ިሐ䰝ય෹⣙͵ഄ㵱厤氵坅儰䘪პ㤐⚪㡜㰩⎃㘃䍬̚攽㑳ᅛӒᾈ綜䄭ϭ⣰䊡ஔ㪜罦男澥凩䒪၀睱㺯⑛⩱ϓ௨㱑侦⌴枣ő䑠᜸䕢ম呋⹜扳஍凄嫤㌴㑼⇂䎆᭨呣ⸯ晕ࣹ㱃௔ⓑ匥䬶ᢓ刑䕬ᧈ嵔⶯晘䬮拥ؔ㑦㛦ḵፖᱽ䙒ᏸ冂綩@㣲䎑฼㋑処ጾ✲熕䛮拂∂䶩;ຌ㠣੍廮䅐⼺౱䴒䜖ᲀ䏂昭䙇㣠⌗໌ㅦ䯥༱䌽熦䞾᪘槂帷ᩛ⨫掷ழ⛱⤥瘲粀燻䞣毘嬣愯ᱚ嚐᎟ফഩ㏦㐏ᲄ冿ᮁᖈ䐂偬౉⤈拗ဘ⋑࿥Ⴓ摪ॅ吁ᨈ廂ἐ〶㣷ӣʀ୦噆㘹ʁ㇖䝞ᩤ忣洖᱒ナዧෂⶩ搥墺Წ®䅾᯻ǽ稰⨺⒢ᐙ⒜ⶑ幆䬶≠䥼䛚ᘘ瀄剨樸羂ⵋ摲ⴑḲঁ伬䦖㤦ᷞক⿷楉⓲您䣤⩑畇碱と燢⠎ጜ⦳㙨᥋棌⒌佒
䅠⯈ᾮㅢ䒥᏿㽢ફ⥓㣷ሡਲ㥡幧灅⒈⥇磅ᤴ捉䖡傸塝⁌䭔⏡䚱㊵.⨈Ͼ᳄掲弮㥖ᒼ⏨侜ⅉ瘤䄵圱⥅✙ფ䖩䵬䘴咠፺狤ᘱ疦ᬇ檑渵✶ᇘ濢㕬楅棊抆૷߉䇅Ջ᩠囎कᴇแ斤ሬᓉ䦶䮄ᖉ଑⊴籱⇐⒉ᜄ戳३兆㓦屶䭺㬁ே㚵㪜⺍㧀䄠㦁䁩❳猾匾亚⾉啄ື折槧♱᪔捲ᓇ㵄籇勬⛚ⅎ࿇䆿㪆⬒䊔⿴摒烫ᑫ璾ኞ䦒〉磅ᐰ橱ሜ䩕櫘ⵤშ㵉ഃᔌ␴ᨠ碻⼵㉡尤䋠ʬ琲⑯⍃䢤ሡ仦⭱㊆榰᳛ᥭ᫬䊸ŀ憣敄Ң劚ఆⳉ݇㢿♵⦃╓ᅐ噓䡪͕庑焴ᖊ㕑ᒪᖿ暗⥺䅽毝۲⩃3ⴇ⇕䡌㖑咄悻窔妢⛫ᵤ糒⿣歋Ⳙ㱺矶㺚㭡㇤细瀢曝ẝ᝽剅୒ᒁ号ਘ℁❧ᦿ⩼奘斀،寓桩வ泘Ý璅ӱ➀次⚌䧀♔䂼忑⥒煘沩㐛શ⡙ᦄह犄儉敇ᘉও塦獀∣ⅾ灲䞂ᓉ㒍⹡倪⛝柂ᵓ䑬䭐ᴀ䉈䤮⫹ㄆ䞡河㥲ⓗᾀ徳ᚰབ崁率吐庢纛墽Ẑ庙⣎ᐏ㻳⛬㍟Ძ㌫䧲☘࣠ࠋẒȓ曯ጩ㖁滫Ὣᦌ⒝䣏屹眆玹湻燡晻ቄ囙柪䝄繸┃䶐䒤㧣愸౼䦭ኟᆜ篢埪㥆粵⋛䯊∙⌅〯繫禢㍠嚘搡⑆❒擿獖䶞䎹⎇ួ窊秵➻ᗄ哲䥩㝭˙硺牁Ⳝ㧢⌣③熽现径濒䁌啄˧⋠⿞㎙槆牃↝ॊ攫懢缢Ʌࡎ島犕䣑ᾥ䨅ڿⅨ椡暠垜䆒᪬䃓ᠱఋ䠼䅥圄嶰瑖䅟曇ᕒ᝼橋㝘˱厏佌㰥嘴ࡲ眺⹃旕ቫᦪ惷⼾з卯䦦䛥氩䑽井稚ᕨ墂䬫㉊潑ὡ⡗䊑⡲硂ᱻ慨偘䅤̠㊅Ƣࣛ䙰䯢⾑坥ص屴憔䔻斘团祘➣ӂኡ㳘⪸䙅ⲷ᥃㎣᲎҈呌滓Ս狻壬੭䢆✥瘅灹籺╖枴哓⤓䊶㓀势⍇΀ᕰ仠ᆰく災ᔔ弲䒪墪Ⓝ抹௔䲉㜹亴夭楩ოᛥ捒峫㵏嵏ጽ厽àᤘ䕣倬぀悝ᗌ囔媁栢泀㡽䯘ع㿹冶弾ᥪ△ᒸ嵒䆠݈垨犳䪖⯹ㆅ䞵䤨㦆斐旜庒緳墲⃟ᔎ䋪⼾ဵழ抷亓Գ᠀嚔灒㚗˃猐⩾噧唡䨶炾㺫჈吠勄番ᷯ㣈㣯଎⮥㲼ⱷ個濝ㅳᆲ嚪灪䷨ฤ紂洁昙✵㾆ⅰㆁᕐ呔徒戵䳉䃉慾⫯ಖ⶚Ᵽ湅॰唫梪優婓㕎䋖狸⯍䲴ᱵ〢╴兽姪埼⍑ᦱ揥૖䢯慺电⌥䌥瑹ᅸ攼嗪嗪䥊⿣櫆朣⮩㛕㭵√ᾀ敭焦煚孢昒⹎᫊狘ᎊ䩅㹵㼄⧦疇ִ噢␺火䟰ᠹ櫊㏻㒀ቕ睶y畢╆坼嚊絪Ṯ磂╸段䤭⋤ࣷ徺ᒎ㸮啤妿㻊勎惊଄䫳Ⱖ⁕ዴ浳侶㸦�哔惫獌吡႕䉻ⴌ෕㋴橱⵭敵囓‛⳪㵎盚浮毛⭁䬺⣴偽⇅႐䔐ᥲ凊䧎竈瓬㎬ⳕ㉰淣東░燙嗮徺注䛣壑䫧痡云⫅ᴆቲ䶜়埆啒嘠䟎嵘ዊ⃉ڽ㍥ᔰ彲斘䖷ᗒ᪊下曋廛䫬慟Ⰵ㭴ၕ伾͡䂛᫲ᤦ䕪䯪⻄㋿每⸕㜕櫵㔻ͫ┶ᒁ后ᕀ᭔ኪ桪ᓈⰳؕ㱕⤠⍯㘘嘞劦䀺梎喤䜈è殌ᶒ扻棿䍳൘㓆ୢᰋ╈墥竮᪉⣃ㆥ摔⚾犍൅刑囨ºΰ䧋䚠ቿ⾠p散㣲֏ෞ爪䕄䕀忌⛑ۣ匂伎∥೷ö厂䶺㚡売㲻檊⧎⛊↼࿴e甶⦳ᶊ䷖㙮ੂ懋㸪竉ڿ⩤楚ゕ煔泸㐽䶎㓑倶朱⺏坔⎍㎉໧ჹ䗴㳼嵷䷋堉廚䋊堡䗞泶䯲準㗢ῧ兲⥪䶨̅噀愳忋㋀䬟樧⴮⭱⋔咀㵠䐤䢇䧸㊻ࢬᗑ∭₺澭㜵䯷፽玟楝晟ᣃ᭺ᶎۗ㫶嬺毋㾰࠱㾷䮃丏呸䔔䶴媈廕抾媲橑㕅⁖⛸孹䶘業兖梜墦䀱ᴑ㲨淙č⏕綨፵痝㗎凖䜊堧ᷖ䉫寄殛儍⟖抩䩩Ѽ䂟┈ᑠ㎦㗊⣖Þ樛∠㿖ᯉ残ᗲ嘖媺擲ᛍ◓ᡀ㯙ħⰽ泶䛸䞗涀̝怖䀳椉ϋ⍼㭑潺㷭瑤ዻ卦᧩㗽弮煱䄌Ꮛ椢㪽˳ẽ傗旋⑳ᵱϫⱮ瑲儏㋂囸㬠濛ℽ᪖绱枑ᚌ睁⨖剛Ԋ䐧ɮ䐒榋ⶽᦕ⻺孾下㜲啮䋚竰๣⼅䎆◧Ⳛ͢掽續浜㓹మ绚瀤ᯁ㬘ᰂ槳⳹㪵秶፳⦆瞷↎橚ᢃ毅滫㮢ⷧ✰ⲗ䇳᭪㥆甛堎勺ࢉ绌仼਽氓⧽⒖緺ޖᵃ㟛尮岚⤉揙Ầ㫂ⸯ⢽㣔䧻㝺秒噵导囂娋叝Ợ⁅漛╝ᚖ份唶㸌瑘⧮䬓㷉珚䛢稦潇ໝᆖ婹潲媖ᇷ壎暚明䯓⻦竐⺏㳍圕⏵⮕ⴝ璯婎儛ଈ埊႒禬ք噽掔ૻ䝪綋畋勚䫚绋䏀ᫍ稢⇿⭽悗㟺桩䫠盹微瘛ƍ濑᜝筰溯⊴岔濶㽲ᵗ癒但剜Č糧纬㵣槗㱝㮔௵ά㶔㒧䠡仺Ὴ䂁砩宫南࠵䆄૸䄍甇喧呠䂝␪㥼䃰絉狀‡窙䫵⍯䵌杯再ୀ䠾届䇻栳ጬᶎⴺᑈ惦Ϡ඀㼟ₜ欑ߢ位㴨Ჯ墣溔⟶℟ⶒ᠒á佼㞷ࢀ㝓硃⫱䜰央塛佨傏碰᨟⸧欑炏缽㲈௯♵䫷䁞潷䤪࿣歁䳥剆₃泌时瓮ⱑ浗ᑕ㯖Ίູ⇁瀝戒႖䄑筨ᰋ⃭篷䢹㸠狶ྔ⬺䖭䄼⢁⤖ݴᵷ䲡ᜮ⠿翟̾๱屆瞦⦈ۘ戂⵬ᶐ帨汀᱋啧㌗疤㯸䑦‒䒝∎ݼᰀ杣ု珿儈䵏瞳䖱繦ŋ撗廹䥩ʣ┾౵㍆椃ࠥ෎ᑱ朧儻ᒖልܕ痰稽庖橑⃶峽྄厺眸ⶤㄡᤦõʀ禃ᬬ䫷ㄟ⍘མ㑑䄦焼咄䇄䞎歷⁕㠐噓㲺揬䩦ੈᕀ䩵剘嵥䶎᪇ᒝ孥㙔焗缘༐㿑棦唻梟媣ݤᢘ會╋暽㣳捷์椠᱔兊ʊਁᒓ漨散抭Ї䄆䎎࿤㙑䮛䈹碓㛸➽Ŧ嗅㱭懄⺩ွ෫啈吕௪杙㛟㰼ᤀ箃ྭ兑⣯控೽兮䧦媬劚烲⟡晉䇙㹮穚磲ጣິㅠ廦⌼W爑䝇沸戣㬨Քᒡ倨ࢴ⇹ᠸ兏䀪䡕♾᱀㡳ٮ兞⤗掲仒㛖䈛紊參⧍☼൴瑔Ӫ桧仍ᅧ㘇ⷉ糜璼䒅স䟥Ề△䄭㱜㤟啺䙚㧜ㄫⵌڒ岪㥣¬ᴅ畬⍙ౚ搅➞圑䥦㬻ઋ熩☤Ὅ⬳撮⧰൬Q䵦㊟Ẇ憸幅䈈寑憀秳婬ਏ┛搚伬㘉准㺺Ო䨟❰䭌扣Ⅻ୓宮ⷸ狒ळᑪឭ皔ᎊ❐ᷴ曓཮卟ⴚ㎾ൖ㫎䮆◀ປ㒵ಛᱼ烢ㅫ㒠䠸庄䲏勶叐氈溚⽡⚕ᶔ礳⸬单億猩ഩ囩洇ࠊ橗㦺昗ῗ嗅篯坙崗⌀砟憁綪ㆅረ汯晎ⱬ緳嶬❞焆።ආ㇩畹㾼႘ᦫீ怜烢挢悎┇晆ŀ涎劧}ẓ爓杠媴獓㽮潑লୈ⢱㸞䕜兏悐禷⛋ᮔ笫♮ൕᴂ⏷人㤎咘ᑺ੿ȇ㱯兢級䴘Úᳲ㎬䰺㚹昇垉᪙绉䙉⠂羙砒屎⽃㩺ᡉ㧤润㒿㼰◀ᛯὤ愃䛬壙ዼ卺獉㘉ᆶ䳳ₐ婈䬈ፒ湓ㆆ㙑匝ୂⱾ㘥濇䶺ᆁ䜬Έὒ瞡䣴㳖೽ʡ౹㴈㾶ᖿ⦘禱➳᧢筫潬㍞́ஆ䰦堅禦庰▏䐿㤀к妝䬫ི畸ඉ⺤劸⼑䖏䚖旰圕Ἴ眫౯烓૫䮑⿁宵䙶պ穻Ҕ堒徒ᰝ㫏ᢥ࡟䂰⣷庆筷ᒤ疄憀坿煊沓恏䫓匔⯮⳾㍵崺絸删㗦圆塺淋瓍㬂∶䙭ⳤ屽㞀ɹඈ◺杝ᯢ磳⠔棷⣫碻ⶤ巕泧⎈嶍㖽噶崩㒰Ậ惷⫳歴仉㉙廷᩸䖙䦦杆妼疫㏎┡㫻殫⿅㨭䏶儢⪋ᘈ殚彪稻巎棒㴀捺⼝㓥嘆ችᶊ☒㡎塦穭㫌ᇙ۹〸姢⧱䘸᝾ᎉ䭤㞨๦瑳῎ᣖጒ帄睭㛥乖畼厊Ҝ㟲夆枈䢏䯂⺬Hҍ㝵罖ઢச䗪暉嬪硫㫭໛匆ᮍ皨㆕棗˻俕包㝇̶潺䢏✺ᐷ⯢濅㯍绖ዹ։ฉ㘮夢拋描᧘ܖᰇⷵ㒍惶Ⲉ㮅夝㝁庀扣៏勑盠湆漭㚍楶捼䖏瘉朔嫦惫⤑櫓眕氄浧㕁叝⸰嶛⑩憀哷⯻傷Ꮦ摘季⿸〽棷⣸㎉斠㠔屐砻㫎㏚休䙸㞷㞉斗⥿▂嶴ˁ刊檄┎比漕ᮮဍ㙵炗棿঄痥㜬椠ෛᔌ㯕曦㰍潠ƭᶨ᝹棥儔旳媨ປ岤ᅘ⣽䭈濳㩅冖懼ྗ戁眊幾懁疌࿖㇄ᭅ䳗㈚嵷施⾏刕眉墂殛䫍⛛㛤㮌濅㹹珗濺皆㶷㙼ন㊫怏∻禦ந䶝㾅泖囿䮀㶠⚧壚睻ゎ䉿ȄᮂᣱɄ/楹℔ෟ㞓媶灛̎῝㜄㷒亷ㄖ嵷ᡛℓ䗒ྖⵡ熃䔍䢛䝚߁ᑾ᧽疇巺ލ෦㜗槖擛▏梐䇴⃬ὀ煎㨖擹䖢疫戹枌望Ⅽ䂑廣箮ⵟ㱽碖⑞Ǟ䏩ྜྷ峁挧愿㿛᥍毶低憝漺畸媌㢌໐宱懫㦏结廬ޛ済秉榯ᩙ䓟␇櫏怟䃻傶ࡒ懽ଶᱠ煕梖૽夓㚫囜㼾憼眼痒汢殬ᵤ்瑮㧿ᤞ緫ཀ㻑灇戾碘㛴⟦浘笳噮⸱羝ᗯ狲ᄑ穽╣ખㇽ簁⿨疃䁯偟┖Ϛ嚪㳄ᾧ⚼䦻凨孫Ҵ睐䝣幝厊各倜㺂浇录淖⼓⮽ᶤ緳彣ჽ囀ἄଆ池̋妾૓㋺䰞漀羽朖ੜᄞ漚伌㾊烕᷶揞䬒栕清㝥⌗䱰唖⏄伜㪪盇渿ᒑ䨙柬㜿㹓嬴瑙ᴂ幝灪㢀竐ִኙ⧬宧Ⳅ焓儮⍝㾞淏倞䀁瀇ι⇜兣䶡琵冕扏㵟ᮇ嶮࿗帹粣䡽䚚ॺខ᷂炫䢯㱺晵ఋ癠㭾朇纽溒໰枕ᱢ狃缗楺樣緗丩㲀緻ᱰ䪚᱖㵴廿㍫灏᛼ഃ෦⾑㺅挋㹿碝ᘄ᭐ǐ԰ʧ௿䬑⯰䜡㨵拻燏源昃柛漤粃䋎椸猌ዣ⾢᮵盁ኼ怡㘕枙淐羣目偝欈Ꭱ㩹㦩㫷Ჽ⶝Ẕ簍ᾣ㨱挗䘾䤈移⿞廉琷ᵿ䆑ᘓ柊屐ғ墯⽻ᬓ珤ཽ彠ੀዃ悭欈䞑爠笀坷⧝樽ᰔ⼐㫹曇烾皔旴㞮渆縗Ꮧ䛜圍ᮬî㪦撰ム〉⛹៧Ấ娹எ₼܆䖭伍㹍汗ㅽᶗ娞堐潖竻缮巜伎⮪൓㸯÷䋾㚚จ堝沮繻䍯⭻ó綸䮍呭癇瓤懔玂朮渾瓛䄎⯞欘㮨湤᳽焧㏽䊒౼丌氺ঘ痦╞╦乀⟯㤭悇⯽垓㷮ፎ屳㬛砎慜缍箥涎孬ྎ盽掚嫬ཟ徠爫欎䳼ȅᇺ嘰綮㾧噫㋰⨈╱㘸犛穷ㆈଆ␀澰礵耗㑝䮙෽睱ȻᏛ䌾߱䴒䢃㜷庂ᭇ廾◕漏瞔帗㍧堧⏞Ȏ㘌亸紃罇὾㮒⋬➈ⵁ簃䨿咚焝ࠌ材纳犚欏懖⌞睏俏岫䭻㣻⺓ⵒả䀍澯䕟榝㸍࿗怌缭冾叟娒ීឮ櫼罯⥤⻜琓渊山烇唿ᚘȚ柀ỉ椓揫᝟碙珧減嶹㉳瑾㛛ᨒ䟍〜簳曃෾洚ঌ⽙ὥ炫嘕௼歓䴳Ἓ㸃慏弎㢘羚瞔㷅田ṿ籞嘏䷅䋋㡍晇⦽†毣㞑㴵簇找ʞ⨐ឬᾆ弹暨຦嬓⸆倇ḭ獢ヿෟஃ䞱篘絖繏仜䬝䘘坖㶮稲皗択殟㮧慩㻼緯䚾⦜᳻͠床瓗抮㙞ਘឣ忻᪃枏ᴼѢਔ䒁㳤绗㏿庘⸖玫Ὶ筋敯䡏䓵㻳潾㵑笗旺系潒珝現礋琏㽟㼑ྏ⿊䀕瞵摞䲘⽑寘⚂翤繯ᢝ㬚Ⱌὢ㻅盗䠔夛ԃ࿇ỡᯘ梯პṓ淡⽜㻐纇汞礝�ឪ庩稤簳劜⨖槣漦徤瘗◎૝Ԋྦ㾪童紏᱾園᏶砜糳控僞ᅟ漎ᏼ瀋㣭港⳾㊗缈倣⹭绷棟டఇ㎢㻹纷楗⶜瘚堟ߪ糆福仗ᩡ㜂ἲ亖⼬ݾ沞榕簓῵လ㦗䂊灟尕濧瀝粗爻琂䡮⽋倓᲻咽潤戙璄⾿ຑ筛棿嚝☕㯣㭑绁朿匿∜栁ᷲ㈩͇䗋⏼ᚖ⚁㾹ⷛ籋湟䮟ᘕᾼ昫翊滼㓇ᴠ瀐◅缄痏嚬渟䄏⾤翽窇竟忝杗撓㿽絗癯ሯᒮ㠃嘊念῏窟Ⰻ搗樅㽩繚硟殷䐛᏾䀛璒Ⲥ亟绎欙 耝⿑瑧实ᵺ爎候忁簏櫟জ圔௽㽳缿牗伞ᙃ’翁縋窤䇨涟ᢩ濷羺₟禣嚘杗嶇㘞昝ܚ堐␇篣㾸╠Ƕ䆠߀怠Ꭸࠠ怞䴥丛犅ℏ绶䢻㽬ƍච㤽瓢抗匷↖㰜㘘–㍏⿯�䅮㉴μఀട泿妧ⴞ☢ౚ᠐挎懴䂒㾏㺤籽㧗皀ᙟ䁧ⵘ䐝䀤树怷忢䠬羖ť嵏㥅爋沏囟┡⠝ሤ᠐㡁၀翞㽉级ḟ禈ࢍⅿ唏␡咽砙笕塇Ώ₍ýij㓻礓㓇潛佡㎞ᬢ…〓?埱῁䃐⻰ʧ筅႐ቛᨃ᪡ἢ⓺ᠫᏩ搹ಫĀ䅅慢ݨ๽栛习俾伣氛㰯п٢恲℄㌈˫箭熋榏䱀䙶䲣㬙∨弃ࡎྫἾņ緭᯷皋澰㿠䙡禤大玐㜎䡎j¤Ň紌ݳᚏ渟䗀惶倢㡛䀨ᠵ恊b䂪Ĥ妰Ԡଳ櫲䷟❡燁䭸䐨䤋寭柇暞Ǻ᱔㤔౩掟䖟ᆡ爢☦怫䰳㯢ゝ㽽䇲౤ݕ燰፰⟇ྞ☝紤࢔ల俸ら䄆繇ɲ܄෈ᐰ⩀⣀漝戧ᰗ㰲汿⁩ċ䆻˷磭㟘ᙯᰀ䞞➣₥�㰵ᡛ⾸䃳练Ȱը൸ᱠ㎠翡༢䌧㘬␴案t䄊䅸䈱׎҈ᴨ㗀竞皑炧䚠怈⁔ί佗ģȡߤਤᬠ⢰䰞㦭ጧ怯ሹᏠ≄悥⹉䅾兺ؙͬ䔕㭡㊘⫘礪䀬氭塟ჿ䅈䈽㧲ཤ᢯堰䧎್㲤┯碈၄⡿䉑↜䍏䉔໗每吀礞㲽礥ᄨ欇硆⡺჻䄸䏩憗瑔ᶰだ滁宜∦㶒⑊㡌ዛ垃⇴䏶ߘ്杈☠晁❣傹唨嬃呙᮫僧㙲䐍㢶狓搈⯠嗁笜憥ḫظ桞ĵ媝ⅱƳװ暐ᯰ㗠柁婣暦䨬⠲ᡙ忚ツť䉕ƻ⑄᝛䒰綡慢ᦦ⤮匁瑂�ㄏℶ䐅ْ໽濐⏀弎䴢攓䢖㶇щ䂕݌ล̹竿眀ጮ䟿ኡợΤ⢕戻汏ῌ摖绔䡃笢冋⣘ㆲᵄ睢ᾘ猭∼江᡽惸ū䉫ֳ摜᰸㳿ㅁ㷝ଥ挫攎౐㯊ྙō䎝ۦि涘⅐瘁ⓢᖢᯇ䀢瑂὇焗嘻೶㦆ฏ棸➐咁ߢㆤ巧堃籌7烇䅰⋟ز஄ᱲ䌐柒㉢Ф㻖Ḃ㑚⢄゠廱䈲՞ิᢤ⤐幁燁⼥殗吶培Ѷ㊋ⅺ籵箱ড়ᭀ㣀埞燣㰧䨮㸳≆澽ࣷ戌⍆穔ట掰⾨焁㆜䶦䂫渹㑂Ғ䃂ᆈ̽ޢ╬ᔩẨ兡侜缻᢫ᐸ翠䒙䕷纔䑚Թфᖕ䗰巶㿢䕸«ⰼɌ梎焅ᄥ䈵ࠉੂᖄ㞨嬾ੂତ傮⠱⑝ѱìᄱ䊧㤁ଢឤ㱨刞੡挤ⱷ䀇牃䢖帡⇹ⷎገ⃘ᇠ㷨币㢣㡤ᤨ助箶֦䣤函ॕ䨂ڷ╡廨撞˕ჰ䊠攸愲ᑬ䂥ᄣ縉ۓ㆞ழ㵈䐀䳃剱劫䀯䩘ᑥ⣚刜䎫碻咊᫋䡡₱Ν䉦㲭ऺ汙孍⤖凑屫〭ຊ᪴⽈嬘⦙҉娯㛠ᩂ㑧ၝᲹ䎬䕼൒ቄ㳨缁练捦⤤䴳⩓㒙⊙冃⏲䑤૴˴❈䃱⏂⭙桶ᖀ汙㒖ऄ廝⌿޵୚៪ᤈ仱䏃佧䍵唱ㆳ璁⤈䈜㴴䝪㛤晄㎕㟱Ⅹ൤ຫ唽䈤瑫ⵖ冰搄䘝ॊ᜴Ⳉ灑㳃ヤ݁䌽䂽䔠梶牨∼䖔㋦ᔌന老俍坦䴭崿㱞璘ऄ㈉⏑䛝ࢦၬ㰸汮栠୊椳㔺帱搼᢯㸨拜䟥ཀྵ⁔ⶸ䁎璬糥ᦨ㌵漬ᤫᢡ凂扯኎ఈᩬ⏨己㗂䃤Ⓚ䬽厱⠩牡㆙⍅䑓ཻ俈Ƞ㉼≜浧㖪㬩䮱㒒ᄈ兪㶂䞓੦ᓌ⽈懑嶃㓧咐怤㙁䲑䁫㐻ᓞ䘅খႵè櫮抂室䲫ጱ㙂䲗䣊㆕⍝䗛୦ၔⱘ睄䲂祤⇠垡㸽沚⣘煯㡙䠗獀ᠨ⫸暀㛃䧤Ꭸ䜻๐溪㢸燴戭ă໪ᴬ㼸尠䊃٦綩䬵䉎ⲙᢥ㆝⎙䓃ॎᾌ⛙⋲㬰浥䔴✷⩛屯棢䈐揳䚵ਦ涌㵈徑傂ͧ㮪᜴橘总�⑱ᓺ䚎掾Ḍ㌈冱厃㞧䶯搉㙄㱶㢱凓搇䑯௪ᓜ㩘殤㛂缀㈃⾠廿Ⱡ椓焯䅏䜹珌ᡋ䒸嶑ᣂ寥Ω猸穏ᒍ礛爖揟䕝璇⸟᧲⭚䀳ẳ箩ั塏ᢃ㢧冁ࡠ⛩攷⬢␇ᾚ恽ᨋၬ申⑄ѯ⣈঴拐ϛ狷Ⱛ卉㠜一仢愔儾睰䊑Ӵ燃䊎ߟ೮ᩉ䢤䙺ଵ䦻桫戃ѳ睏⹖ঀኤ䒀侶ᅑ䖨䂊ؠ᱅Հࢸ傣圩㡄⺅担ࠨ䳆䧢⯈眩܃㱄咪橅ᅝ⑼掅ॺㅥ�䷄⇂⑤䲩琲⭦と⢱㉋⹖䒸硢䡬⟈䬱ᗃͤ璩㐳宧瑩炳ᓯ䉶冋ॊ፦棘䨿䝙່竼礉栢⇂䐬呒㥚卯म抜☘䠩ე㈘社㾂㝧殬ܵ䅘Ი㦀䧾ሧƤ䳴Ủ厹ቩ椱ⅅ㔧碶䥒㤶ᲀ䦉峢⣡甪ᬭ䭥Ⅹ糽䕆掶妊幆岖ㄟ㇑ዿ䟤䤞၎˄䖀⪳偧傃㒹怣剸㍒瑼Ċ䑱⎄๯ᇐ⥆ᩀ㫊倖Ҵ᥅垫㦆愉䀭⭫࿉ጲ㘘䥡暳㑇穯䄡䫡栬擇んᏦ▔䠹ᗒ㢄泩ㆳ෈㱬Ჸ吧䡓ལႡነܤ䳙᝴⎰෩ࢲ⹥⤮䒻ᙅ㉳ࣣ਋⋍߼伄ऒ㫐᧪γ᭄Ṯ岴Հ劁擁䤳㶻λ垾ធ㈴䔪桲檠巰Ἰ奈Ғ擭燋Ꮮ♋೬ǒや扉ᛜツ兩䞀✪㉡ᓸ仨刭¿െ♪㮄筚稢㐧慬沽ᥞ䪚〺ǖሺ⚜䩲ᶪ⧘䯘婳䍇⠯羂㾿䩫⽡⤽户ޔ䵭戃ᵐᘑ槂㔲╭Ἦ搦⩣磷䨕䏾ⓟ೥ᘒ㇤抩ɸે╪欥⻣⑾ᒦ干劵␺余᧒⮠Ồ傔佅ŪҸ㥊檒㉐⦡቙⒂䶨ᓲ➴琩䒲ໆ㠦媼畕玠⤀䦮劍☢俩ቱቴ䧩匼䳅檪ᒹ൑徺ᓫ䄿ፕ➒仵ᒂ㼢҉嶳❇ũ䚹⥎᪋㽟䥷ዝ䚗灍᝴⣔溩㬲Ǥ㵭⚳祏䩥攟䦬戯䑘ᅍჺ㺐杁䥲⑁弃⨧筸媁擂䤽刧Ɩ䵑Ⴚ⩈䜑睲壇⭩抱✽媉С楐Ǜ⒄不ᥲ㿔䱉滲჆㙨〨嗬䡒炴ۋ䎢⒎䵄˵ᢔ共䈂掦㵮悻䕏㪆璶呭匮⠎䫽ᆊ⯤璨㕁组筬沾容窍咷⥧厞䚓ਾ᢬➘唉䎳濅䴡㺰嵍穳環ᦿ匰⑪䨕᠊㦨ب埲畧ͮ0䍜媇ᔄ椠所宾䰣ᦊ㟴叉硒涛խ䆿䍒䠢ೕ樘匉⟗ౣᒒ➄斑䨲၅䲫Ằ䥂穢ᓪ᧍拠摱乙᫼㲬凩ড়秇⣪䊳奔㊃䞏椣掟⚾䢽ᯪ㗄欹⇝粄㣭熴ፏ㊞㓀᥹ቲ┄䭍ᴺ⑄媹ᛳ璅㴭ⴴ捅劗唐᤹㧔斶䩃ᲆ⥎⦹㞂㲄奭戃\"㉼唒䥒㉺秹䡹ኌⷨ椉䙂⧆ƪ䦴㍓䙫䲲䧖呆Ҫ三ᓺ䚴玹劽᷅杩䞩卅䪒瓡槚㏚䑘䨓ᘊ▬獉਴⶛拮䖽䵆䚄⳹構口◶䫙ၦ⭈䬁⥥䛆䅩ᖸ䭎≼⒣ᨋᎻ╵侳᥶㒬䍡䋓榄ᴣ熹䵝ᠻ㝲ৄ劄暕丳፤ৠ摩卝㗥䶫ີ啅ᚖഃ⦢㉦╉䰐ᰶ㿌抹厲㴘烬㺲㍗扮Ⓢ᧴㎲⚍䴣ᬊ⥔䓹潒墇ᣫⶵ协㚖洙᧛㌜➍䨃៺⚔䬉憩᪇滪䖼彺嚝䔙ল㍲施䦛ᾶ⵸拹䶳㾆Ứ㺲㕒皓泪䦷㈮撊䩛ᦦ㙋㵹䗳浆⇩庸݂ຈ㔈ᦍ剂斅䮛ᾊ㷌烩Ⲓ勧峮㼾ᭋ暌ᴊ圐玑暅䢛ᗺ䀌悉䲒唅杯䙦歇᪛Ⓜ⥴受♸ち䥊㖼繀ᘂỉ垨禰扟瑡୒㤠㎭┴伇᣺‼獙Ẳጆ孫ᶺՖ⺕ಥ㦴劙柝䳍Ṛ⪌槹૓痆ᗪ㖳坅⺕ᒸ᥈珺♕伧኎◌睡䊓櫇৪வ⫥䷈峩⦭㏬杫䥣᫶㱌燙Ẳ夆䫩溾⭚㪋泫㥃㌪祌䱛ቮ㡼緙冼纄䵪箳䭈๷㔀兓㏩♊䭕୊⫐䇘繲᎙Ꮾ⪶坑剦岳妦㋲暑䣯Ὴ㝁㉙䌒大௩๤杗ᚔ㲼㨞㌒擎䠯᫊⨘痙体㜇ῑ焄ỡṽᒺ秮珋柳䶩戮⎔埑ϳ洇㽑ன㵘㺝瓔ᦎ卣旻䦞泫壴儙ප␄狪⾶䰥㹯೰⦂劵柶仿ᵞ⑜宙┼站砮㚷彗并粦⨑Ӌ杽䧩៞㍬丙噲堥⮩笱䉈事㳎ㅔሽ擉䣻᠂ⴜ榙珓䀆⿯઱䝄੶╼䨂䎎♬䣙ᘡ㱄皙⹳┇䏫按བኤ傐؄㒺擠⯩Ắⴌ䐙嶓砆哫涻坊๭岯禋ዟ摹仩ᅪ㘴䥉爓怆ⳬၰ㝎⹸峪䧐஋撺䶀屡㸜怉渂ሄ௯ふ䃆ṫʡ՜㏕磏䮀婁⪜朥䆓␵櫯ၷ⩂↕瓉㦏ˏ═⤫᫡㙌䙹㐫楅⑎ᔽ惓纏˓奌剘᠟䩐屁⫝̸桉甪倴䅯嚱惔⚘ӝᤦዞ杭亍ᲁ⥢䖥㌫漅䯪側竲Ἳ˹奐劜ᘈ拗ᙖ⮢䒹䶓稆౏ኰࣞ傁咶∉猩➕ƨ刮㜢猙⨓破翯⦺䣐窐⌀称率柗䪙槾㍄䙥ᛲ戶篩⑾彞穯ഄᦗ狌ᕁ䯣ᳮ䠢尥౒戇柭ࢌ㕆关⌙ᦽૹ╿䴐家⻬䂹䴫̷矫摸㽂瞳䓽⤱㉦᜗䷓ቲ␼爹㰪甶◠㑵⃘䪓⊸㧍ਜ਼昏ㄈ嫑⢢耙䖫ఴ䇯ா์湬崐煚੯❰䭀傁㦢䭙஫耄乌᮲Î呦璣⃈咀䚉䮘圠Ђ潙ӵ紅忮䡷僆煲˞׿ஞᛏ䪦搑Ⱌ⪥Ғ㵅獩疻䙓乼ዙ奋㉖᠄⩟ᴋ峳ډ䇒ؠ᛭厱睕গⲰ㤪狒ᚯ䰴ᨎ᧔攙沫ȇ樗⊰㽆ⅳ䋍㥴䫩ᔅ䵄奱㫊ᖙ涜猪⤦ᠮĴ劑瞃⧼䭳̒〄庩㲂擞᫳劆㙮੺䇰搸匙᧒䯗Ȓ⵿∮㚌䣥പᶄˮ咾ᓑ䦘⌒㥾આᒸ⽅ᡑ⛬暥梪)籏᩸䣒榅挑᧷஄᛼⤫ᆉ㟢泥歫籠3᩵哋ↄ˧ᦰ䨂ᔚ⦙ᑬ㘜䮙愵珨ᩰ卐᥮⳹姐੤ᚴ⭨峑㭿㕅㾪嶉ϯ剶ᣏ⥤㋙תੳᔅ乬嫩➬瀹吪䬵絋䀌⣟ࠨೂ֖૘⒝䷋ᓩ≂燉拫◅๊嶱̈́奱拏╣㳑擥乸孖⟒滅恫ຶ䅌䑽瓀㦜䴞昝爣捴⯸嫩ⶢ拥㧪皵厯ٷ݇ᥢ犮╔௹愦䶼凙⵲䣅祫ⰊῨ〵㓎⥪務榇犋ᛨ䯌啺㽲亅Ṫ޷佊瑶瓔禟ዃ旾Ԏ晴䬬�ڞẾळଦᷮ繴ࣖ䥵罼䕄ધᑖⲬ呲Ⱂ剼␌Ҵ差䅳糄䥸˺䖅䩩㏼乢唙㌒庩疓ᎇ㍊㩽Ý挻狁⨟牰ᗵ໿ᗹ⅂甥↪瓇⭉摱䳌ժ犱㨘⩉旌⮇ጹ㷲童⻪᎛燮兽泟幡ᴀᕎЈ嚤⢔儥⼒祉ṊᎴⓏ煼䣝她૎䘉ୋᛀ⣜坥ㅔ暅灋㞷ᣏⶴ勞▏⋬ᩦ剋᝞佂啾㚌囀䉩᪵ܓ᥺䳏沲梦┺⬐咮⬏ᦅ⺲㇅潪噶擉ᑺ㝙ㅣ糇㥸⩋┇䷢嫙⭪䀥Ჲ伇翩祱㝏㥽ᔗᕶ䯂咎൲剚ⱒ梵䵋๴䋩䕶瓎ᖌደ֤Ⰿᖾ⩷ᘡ㝊䋅◪呆攩灺䫀䖊ˢ嗊䩐ᔅ⿼垵⮪教羓㱷㣏瞸潘ᦋ䣠◚ସ噀⡿္⟜段㹊䵶㟯嚵⫀⥩㾆槃⬧ផ⮈呱⣌繉៫啷俩൷⫌⥥૰ᤶ⩺穣䰒度㎂崙涫ᮉ᳌浶䝝䕽ᓻ奵珷ឲ⬪ᔆ㜬忉㍓孴柨䩼し晿ʫ啙㍾埦⦠́ᱢ塪⿋䕴ᣯ榶ዘᖖ彯嘒वᔝ⾰䧞Ⱒ垵告ᖅ⇌䕺ᣁ䖒⪧ᗝ⩊圗ྦ庞⸺䕀㉓昷繩澳搪㕲ᫀ嘅⯌᠃⯷ᾭⶊ暙獳ㅷ٬卲廡ᖑ甛◅Ⱄᜳ⯏᭭㘪䆵࣒泴痱㱰ᣄ劂ዟ斾摢旹主ᓾ⩄䡥Ⓤ䳴䅉⍲拘⵩欁䧒殦啼亵曡㐴狕㿊ืዮ⍾棙婺媲ᘕ厅㦒⶗Ḏ⎼役ᥪ䛴ৌ䭼᳚⶜䌓㖀櫊柦ⵌ媾㊲懩擫⶷嗊▹筅ᖕ嫼斎氟曛⫂卙⿴擵秫⬷Ϗ㭳⭆祶嫹啗⪽▧⡘娽▊櫅࿫浇ϋᱼ硔⦂欛喖⯆堍⥟ኩ⹚劥⊳፵ୋ䥾仁祮泲疁櫓埉⧮塱➂憵ၒ׵惈㬼絘嵩䪳□㎺垊⺢ᜆな怱㕋ࣶⷌͲ曊ᦋ䳙㔳㳧呕⡬媵˪瑉䗫嗶ߌ䂵㛛⵲洉疻䬵怦⯬啝⪬畕仒璄ᇉॴị浪竼㦛气嗤⵾啦➬䜉ᮨ水濉汢㢠絤嫅痣毝埿ⷸ䭉“簕Ꭹ埶壍⮷㻏綊ᔚ㕟厷ᘳ⪂剝⢜濕┫ၔϏ㝷╕ᵿ㋭յ殠㖩䴡咝⩚綕࣒䷴㧉ㅶ滟冊桖Ԥᯣ坾ⷯᑭ㯺儭耓⭣捏㱳Ӛ䚖强ඈM哟⹞崽⛺䌭ᡃ㸇梎䉸懛㵷ⴝ䧛殶柬䪁壦㘚䨕⼪秅ˮ㝻ᭂ⍴⬁䦙䯉嘲侾劣㻢䟕竪ⱖらㅿᇃᕼ䛢斐᪔㗢䱡卥⌂䌕䐋䱔よᵼ瓁煲䊶⥥原呀榦妚㤦徕孊㗵䂉當ᇊဦ甌ഷ毷▷⿊埃⊏ᡙ䌺䎙㛎⣻ⳇ֑泒ാᮆ敃仑幪ⴊ罥売籕乫ぴ䧗এ㫱㗃㍠嚸椱廃⋦䩅᤻犅劊⦶ୈ湫岽疉檗地梩傡⚊䚭犻沆篪⓷⍊㶌媡ෝብ埕⮙ṍ⯊宭㪻祖俎睳?८ۣ▜殄㑭皦唍㹴欕彊慕⽉哵壎嵠曏ց⬂㞚⿖埃●ᓭ廓㐴壋䳼燝㲓竼丆ᬓ堌潦偕㮆摵㗊ࢶ磌ࣴ᭘⍠᫜䶇ᬋ曼檲囦㜲櫹❊珴ಈ㣺廎疜朌ᔡ⭂㞠漖态⫦咭⢫嚅⯯ள㓗慺㪷╠⭒㟆⠾厳⨆槭汪⢶ᆍ䑺᭮煬峘ⶵ琚ᓒ䮳ᇕ⢲粉䁻繷恊⳼㽓୫૙᧺ᰎ㝉䣀巆㻦瓭毋婶⡊㣼䗎䦊ᜃ丈嫂㛐椪堃⣊硵Ȫ繅炋ᓹ䥮ኪ嬜䩯殚㟀栵彳⩶摪ಊ煋Ꮙ璳્ᶚ⪳ග嬼᝜淅匎㵊揥䪳湴䯌渠⇑╱ڽ⸒嫬㙊楹勽╸ᮅ獺⫡⟉ⅶ旟榊窵ᖧᨥ擺楙型☆咅䀓歕ܖ᥿棖⺚欅䘁孢㞚洊喑ⅶ桍༺凗໏䦴䷙犑拪䦎宖㖎⥤嘋㮶䠵態㫖㗏竰㗄橰㜆略፣㙪滷殝㍬疍ࠋ㊳ⶋ䛻㗁ᮀ囚洿氓ᑓ䟍刅❪淕䭺₄຋更዗䮏圞ⵍ媵㝖ⷖ幱㓚曭纫䶅㇈怩ᜧ䮪嬚楅㌷㘪䒙埋⌶了ےᜅ垊Ꮗ囘嚎皣㘝ਫ᜜澕幹◺亹㥺䷕綋໿㗔箚竔禷完㕷䣽Ꮣ⤲槕垫Ꮦᮌ㍼淝掀囗洷ᯀ㞻Ⲧ塥ㇺ嚍ซ⣶�奰䳨獨盭淥寗㕡濸圁Ⱒ拙⨊ࡴ叨䇴緐㍿浠ᕊ勚㗊䨉厛㒖耍╻㎆ㄉ拼䓗ޅ໡祷嫞ᕾ滉尫㛆溕ዺ氆ᾎ㭻燅筸㛦դ⭫䖵倜墒㱖溍䉛万ऍ绻㷌䞝圁ᵯ䰟擩毲僑⇂甹惲ᯕ஋廰ළ➗⋅Ḋ孢東䩉ᙝ㬖䒽剛絔Ώ槹滈厅ⓩ畻ᬐ瓡⸜假ぺ䑹婛ڕ傋绲㏄孫ᓇᴬ媌癁⧳彃ℶ劭᣻↷愋⧵Ꮤ枅Ⓧ෦導ᜎⴣ媡⡆忭泋㆗ᎊㇵ●㖒暠淄Ⱆ撱⬠傳㉶泹噻墖㤊硵旔❸嬌䶥孝喎殆‹㯦湍櫛৵穮湷畒憜⼚䕭㨤᝙楊嬇㖮刽ᤋℊ屎㝼䍎ᦕ糑ⷭ決璥⵳具ㄮ啽㨫奄狩德⏄൴᣿㧗叡命ఇᝲ⃖災䧛檕复ⷹӑ㞚㜖䦍᫳嗔湫勱㕎䵍Ớ⼆伌䗳楁⵵㳬槵⭔晝槉ỗ⑒碽᝛ን崊巵۴㊂欟祏㯡手፬İᙕᬬ܅䄕急ϳ෼ཧ⼟唨㪖琦咼�䨾塝揈⤗∈ᠮߝ⤯҄㱩þ狣淄₈᜾尠粚΢戋᷻嫀内滛曙䃩⦳潠ů㢶ㅝ窚Ԗ祑Ᏸ柕 ጮ㶏㣙痣棶巗㑎啚ᚚ礖稉Ⅷ⟔⽠灎㵘筹琵ੇ兏㒾䜶Ώᾗഎ痻⟇佡⣥☪稹疰喚䣋兙ᣵ᎕⊤厒ᠭⰵ瞟抭巣婨瑃樷债壾绝㎛䙸㔩ᯰ㟗⽸傳⹪ⶽ璛瀇嫃㉚哽櫑眗斒㯷埈ύ⅝㵮䄘ᇣᅤ䔲廾䒝繢⒣␌叱䓂ㅮ哹䉾笃畧椹坑噞碬䴚演㢮Ԭ㛌㺕՝㸛䄫瑭歱奷⁞埝㌛҇ই寻⿘ᑣ㺲灄቟㗷䇏勿⋞忝䒚媫ᰌ⦈塴徇㻐縎稺毕呃檥㻾椝仡⒚̈緹毋睺弊続竇癑疉⥟⢍ɜ祌弔槣媻⑾潮经椴媖均沴奚㾞墬òᩧ倏ʵ忏⾘缓涨ȍ瓯氽忽ㅊ国䬛缕吋忰慊罷廭綖ል瑜㍮摧倡撀姜䠔Ị晹翐斷廀ʹ㪂抠ᣏ෭▬ḝ䆹⎔ 㿶䂋徉ھ絫篽盍ᅶ䰿㼡嘣戚⧚㍭穱䂋澙ǀ旵揾疵澟巿㛾澝⨧⍄嵯埲悙堸㓘呸歁畐㈀㊯㬡恵尦◃⬥㈠ႆ祟Ȉⷼۤ೭޺浢ၰ⃴㸦㈮嬦⿊彦攰猷絎ᬷ呏歫啮呡灝㣡⨬ᐽ㢱䌿⃡㽣Вߴై⒰㋀睯ኣ̧䪢缍ῄ俑當愇嘜䂌ุᯐㅀ祡垣䝝ᣲ簼㡟㿀垃⑓ϒ޸磉ㅋ喳㎎痝მ徔͔硔ࢇ罼捐䍊ࠟ睦摨㽕嚂⥀盕ܔ૵⑘゛ᄃⶓ㶉䪙㗟涨㡏㹁畸ʧอ਽摖⚰ჶ↽䑙ݛƦガوⰜᴒວ桋ᘏ俺埗⃭㕠㑩⌆ᯔᮚ䘹䘕೦෌ჰᙑ䇵㩈ᝥ↯緢ە恬ᦸ㣵媁筦㥈䰡丈楫②恖懺㻓簈ౌᲀ㕰擔ợᜤ₻ই᱔㊳㄄nႲᲦ刄ᦋ⺐敗ᢩᛠ┬泋䇼㢇óȊ塏ؾ࿜ᬔ倐渁憈䙱缭煪森ғ技䆰⷟ۮඌῘㄨ悒ᑃƲ㼂ᑧ捁嫽ऊ僾䐐笂๏漳▨碁䷶䉦ਃ࡫総揇溇暆਄䚁೑核㗈媱墀琋⎊᤾rᐦ粄す㷷拟䚒ᮊ孠揊糣⍚㜖举䲁撄屓ჱ媇掙౓૴Ԗ㮱穱奧㒯⦊扺䣠㒂凜焪䜹暗࠺ᣠ̘ཀྵ೘㷥匨〧咊အ冿㴱檞ಪ᣺Ẵ㝱䵜卦䦓涭婟咁椔磉⦚捰嗕൞ಌ㄁䱣Ⅶ碯椺䆀ᩋ椝夀揎䟣筧漶ᇌぅ❭繧嵕฻穙⢟ई凈挸䡕ฬ京レ⡓ᷔ䍦妭ᔸ已咋⢻⣼掉䛂̆ᬬ㗠๱䟃ংᖭ猾台Ⲑᣦ墺捅䜇ᆊᶈ恔㔠⇃໧暬䢊ࡗҙᤚ⣎控戧ඍ直㞴⾴㵑؂ͧ䜸䀬罖剽ǿ⍊箥െỔ㙥⚸䦃槦沭┺ 祅ᮣ䲧絻䟀Ďᴊ歸猲䔁ۧ楥Ⓐ湓搷㤏磐ρ䧏༾ᶔ㔈烱球滧ୗ猻Ṟᢧ⤑凙㹅䞿൞ᨅՕࡡ⒃᭧o䋃ⷱ㟞㣵庤掫ܛ೎᭬ᘤ篈⏃䑇檢崽᠎婤ӽ⤔ፇ䙳痆于ᆘ惟㼍嚴柦ࢸ㌼ࢍ徟੹冐碑ఫ涢㖈缩䁉瘉櫧劯⑐ᄳ棩ႄ㲰楨↪Π༔ヱ缀乆㪡硅ਫ把䠫棗揬㮵ພ‌㎺ど眳ᅆ籬䬸य़䐨⓯৞ጠ➵ġᭇ亾ഖ䡣⦨㪬傾楓吨ͯ刈Ꭻ䠝ೳ潜㝴㸢⚳灇▯ಸ燸ᢠ攍䨎儖♻ǫ䬎၈ጊ奩樹Ꮵ㲹慚㿝愇䦮෬➛䠙ᶔ㖴厨ⲣ繇ᘰ዇楣⊗澅刅挬❳㫥Ẫ㓄浉吰坦㚊ᴢ㱕ᑦಎ㩍␡⚾垝䡊㮴淘慳レ浥渻㵩沚塍⦩ፉ㬋ཀྵᾢ㍴綺峦櫇畮ঋ㙓撊磻⽬ᎁᔏഎṊ㜀瓉壃䏧垮漻畟ཝց૞㊡ᖬЅ⮺㳡側⋳䛇林᪼䱻ぶ㔊̙友⛹ᖠ⯺㔔儎佩㛆皖⤸㧸Ⓦ瓨榬煙䪪❽ᣓ廲㬉䱽ᣲຬ斌ᅼಝ㓵ỳ捻♺ᄍᶚ㳷ᔮ䟳ᝦŔ嬒㩟㒝棣缏䶀暟ཚἔ㧀氁䰳Ꭷ䥮歭懾ڌ椖䚩弈晡䴲潅Ỉ皚䭾畦⸭›ⱞ䵕㵱ᦡ唳㴵ഉ泎䆓如緳ᭈ㐬忨੗ῗंㆠ揻♱ᛳ᳟吃◼睓Ꮖ擖᭴⬂媘甊⛼槩ᰜ̫ᢀ濔氉䨝዇临ઈ䭕ᚁ㔀䌖䤲᮵倍ᦚ㳞䧑暹೚ⶬ溾༼૏ⳳㇵⶵ⪋ഉ滢㙌椎椳妇⸮溾ն㏍㱊姛巄⛇唽᭺ぬ捹棓抇癷※፛䏝洘窶庡曇坬䪰摿⊲䳭屚懭剃牜暎ᣢ燞䍫䙙丝ᵾ匼毝⑍潫槬婑獷ᣉ波䜂䨙暝价Ⳓ㧬智䷓⽛塭⟉奚搼ӷ㪤ፎ♚䑅ᣔ㯸纩橓⼪㗭㒺ݐ準峲ঽḚ曍䴔䠾㱼濆䩓楪⼇޽巽嚓䁋ㆾ㗥᭮▛ᤖ㽬籹湅䘆ۯ罨㭒庉♺秧吐䮲㗏᫶㸿夾㟮आ坴㶈◾䲚३稕玅⯝嘋ᾢಜ绉䇳᳊࿬樂㽖嫁甉ᚧ千栃㗡ḙᄶ㰙旭抜秣ှ䍜Ɓ唇娏班暛໢ᮎ㹜橒怫惺᎛Ế姼劋䔐䧱ᐂ❩㗀嵲ツ汩䐳劧秕䲺❑㊞壹㧶㔼♴俩᳡㑔㭖䬵᰷呏咾姼Ⲕ䮑ㆿ獽㩳倛ᯏᛢ栥妃猪怶ⶽ歐ᆂ崔ؗ掻❳盇ᣞ㡼悰㐓吪嗮䆹㷩⪞峮⧂取晩丟ᾎ㔹╥元橛払ᑻ⵺᫇㴉ᛣ஡更⼛ᵆ䀜眦絽Ḇ应䱹୘媇➋燔痏䟸ⴈᵎ㥂旼䮫⨇羮偻㵝䆍甋䘞䐎ᛘ⼅䴚㘇㑑烽杺牌涻盽ঈ崈䗩ጿ䞞䲤墽妌檖呫ⱇ⻯硻䵜⟏࠴棈㐟⠕眆ϩ㎜禺帓䏇㥎缽᭔橒化ˣ啦អ㜧ῑ㩲橺瑭䴫♍㴉ݝ㏛ᴉ禿ጷ嫌⾌伮㋲禚惍ᙲ㵍旉㘎ᦟ峦ⳁ䮣暈曬尩㲼硅斫ਆ㍎掾㭟ᦝ㌋⚸䯡ᩇ咨墠㶽㒙末ᖷ⏴⮼卐୉泮亶௫柺◐塩㓴栉䒫Ⴖ䕄硼᝹⥏䌎᧌獚枖⹬奖㾒掉揫㱇ᩍ猉᭞㦚㴌秱散㰸Ⲁ屲㨌稵媳簷䍎䒍೘佒䌚֤Ⰲ❑䷴ல㌪焵亽粆㝌㖈॰䚇殗懶玃权攴䣆㜒緄畓沷ᕶ搒䢭⎨⋮⫦⮉岱《樛埌涵纎夷̈́祾哣ג劖᧨㎚⟯亘嶦ㄬ掵喝父⛄䕸泟ᖍ㖅熩吝✺⸭Ẻ㵊濹䧫孒䍮⚿㳿ᛗ⫻峼嶺઼ⷊ妑䀒簉渳⥫ሄ奪磜ෆ೾冩䴮垟ປὕを痦瀓㠶㛏䥫嫙予㞯䗤䶵፬⷇⤉ㆊ湹棳ևҴ㩺何榓狰澞㐍ᨳ⹌嵁㋴筵祉⓶惏禽ݝⰧɝ㧇‴䆓ⶸ奎㙢揥咅糷׍ㅾ歐⶜廕伕㏡囵ⷶ庉㑺椅狫恷ᨶ᭾䭝皈˧㖵㏍ᬭ⼔尴倹㥵縃䉒懍涼᭒ờ⦟㘎珣垦伐潩僲沎璭▇⇏嵾桔঄嫨★欫埃ⵀ岅奌癕操⌊㧌ゼዕⶂ嫸瘕୾團᜾廍㇒糕䶋㣶⶘፺罘暓⫥䗖殔剓⿺夞䜚涊糋̆�፿㍚涞̍嗩⬸暠⹊廓姼滙总䍇濌㑻ǒ㖁ܞ嗐㌨㜼⻁庑㪦砭崳੶㟏չ懝熃۰嘖䨐圐ⶀ孝㹦暥戻毶㾆⩮凘劉卣ු⯘ᚈ濮廾㽺榕祉㳲㙎⽿ᣔ䎛欗勾ᯛ圝Ⱝ䴃㳲檚柳㡶ŏ磾ᛚ䶓竴ᖠ䮀噂ⵞ弥㞓㵭王佷碎ⅽ糓Ẃ㌚䶽ᷲ㛈滩孽㚫⦅朋Ꮆ䕅䉺佚厈笎㓅ஓ។⻱姳㞫ㅥ祳帇溍઻⵰▛䜔⬂⭱ٱ㞴ᩦ㒴礅抻䊆㔆䚍斷▍✓䶢玑㞐潃ᬫ㲦犬掻⽛二౹ố厁竫丄孢㞦┅季㺚爕燋ྺ኎㭺⽗王䚊秵毆➢澹ᤣ㦆籍惓ᬷ巏瞼ỗẒ枔痙䯓圕⹅崫㨦犵坻൷Ẏ竺᫙殅ᶕ䗎ᬥ᠓啭媍㿶粵幻ɗᎌᛋ人ᎊᛱ㫙嬵㚽⺶ᦠම緆巫㍗斕烺ⷙւ㟋旑᭍㱞⼈矾㵒⎋ⷻ೓㦎۾ǀ箛㊃⭷嬾⤳姠㖋䥎৐૥粶拎哵弳简䑟淇孭㞡宝屉⨮緮ࡺ悗儍绸绯㩴㫝挻᳃吶滠姳㫷ᴽ䭼㒗淊〄焧罯䗝⧀ٌ栃ౕ奛㴖繤ज़ᠭ㠐槺慈䁥ᎍᄴ˅哔沐嫇㋮滕㈢䚗╔Ѡ⢢淾б᷌攜矅亳塮㱢涹敛࢖♀׺篇庿湈帋ᩚ捥ⱱṃ⎆䧸瘮祗䥌燗⯗㙚⛎帍烏ᤥ�≗⫎眄ᕼ᎖圉篊比禞冸剫㯔ᜤ恻墻◚䐽厀ହ篈ᇻ䝗Ᲊ↭巀⮻啝澯؛ㅈ挬⯛⾖Ջȯ㯓Ӭ扐㶧穩㛉派喯㬷ቝ灱䞙▮䍅楖㞛⨺㷂਎✃氭康㦸ݝ䚛䝇ጒ㝗⟗侔⼳ຍ㎵梈⎙ṝ暾槰⶛͡税᛺变澁㵜๲筊ၛ潗宷᫘Ȑ⛄伖瘏ఁ籴ᾏ弋㷬㯇㘧澯嬏㬰傝厛㨖㸁䟽䳉ⱐ༂9篋睇淲᫇㧞皦㴛䧉簎ᥠ!⋱䪞掖ᜌᠠ㯑䔆⇭⬼绰剳篻ऻƈ悔ഞ综㗖↱ၭ伆怦⤾伢⢶₏瘢⠠㸪ᬞ敗☼嵵䀽䇿㿘痳绪䤿笹ğ濴㒠笮病⠧ゖ甀త漠ᶄ忞၌ܨ灟沄³䫘帣榠䐮⼂灙ߝ✳Ȝ㴜⁸䈀ˊ妦孡纣矛倠оᨢ翑䨷绡ᙆܶ畈ύ䎋䳡檙㨠੦⛵ⓠ䘬ᄟǬϢܼྭƐ㷂➜ᦱ䘸焮沬嚷㳊杻㓛敶和༌䇠㮰瓴䍣纆冔ؽ䍖Ⴆ纼䈴㓂Ệ໨↺䒰秐㘣䟢ሮ瀡䡘甠ⶌ懭䐄⏎࿌ᶮ҅֨ၞᑪ弮㖑Ԇ梔ℓ˃䏏₩ᰢᱝ怱֨៤㪠ᒰ庡ㄥ䨣ⲽ䚶常䝑Ă᳔ۤ॰ኾᩧಮऽ䈣㈪㟞ᡔ⏸䠑໕੤㨆㩖䋃嚸䒮㇛㒧Ⓕ⑶划⏣綏᳨֢㡬ఞ梖䣆檯⤾䩜撔椞刄牾䠉ဂᵒؐ玱濃繧䊯২♙ಕྺ嘠掤᲌ݺ⩌㾃␁筃羧ථ娽⑟゛儁Ƿ⎼ٝ๪ᷬ㡨璱炃櫜掮礽䙞撜ᤊ爖ဢ䞜ࢆỼ㭈烑殃煌熮㸼Ṛᒕ冫࠷掹䟰༌Ὠ㯸穡愃媦⎯墢♛ಖ㤉㇥推❇࿎Ử㯘簑窃䩄枯猼䭦⊘礑ᾛ揟䝈䣡༴䒤ど羆⽤±⮡⮃䘩惻┯挅䜶ᗉᾀⲢӅ姰㜛⥇嬌徠㊐嚩䧶Ი瓒⧵ᮒ㢀䁋䱃䅌㹮Ҹʮછ擤❟ጩ✷瘰煿婣䚋ᢐۀ㘡ɢ⢥⿈㶦 敧⃕摽䆢䅱ժ⮖ᝌ䥠窼ᄇ௱ᔓ₼炟缆倍拊㦒lj挘ʲ浮ൂ砗᪒ᡒ槺⦇➴䔇t⌰ㆉ樚ᬠ潮嚿怡媙ᰮ槴䤧❪ႽἚ㼔猉牓抚ʑஉ㵚慃䔹䱱ྈᔰ!㢈⛔绉硓囇ᑱ㡑፜樤唖䠦㺜柨ؓ῁␕摧厐ಎґાҠ⠭⬪娃巻䢭仔抠ʩ⛹摪㕸໯䓒䀢採桷ᱮĞ枟୉Ï卄簀㊳假ϸԼ⬧慦㘥怡ᙁ栈ᤷṒ䀱Բ喓歴∤湣ᬣ媒爹⁓᪈ゾ⏎㹅䁂֓欇婥堣坘桩崓䐦㲙⃛倗ḩќ痎ጓ埄埯ೀ!ᆈ挜美ܓ眇篮〡睚⻨ሻ┯珁⑿伹†2棭̗秢幍林亀^㸢痝РⰷⅩ偼㿣⿕侑刻≵㣵ㄐ崪⎈䖥暾⟥≜ᔲ䣝现⌔簫䁏␴⾈巕㉻怞忥ᢤ姌䶼狖ӂ⸫禕倷篭岽䂱࿢牺஫缷䔮ㆃә熞咡嚫㷈䫏崴⍩㴌罉䩫瞛㈄䩽㓣ԫ⑬ᑋ⪜殺Ā̿М憜ۣ䒔À㛂婴Ԩ攼ᙊયᡢ㧔弉㡎ႅ罨㚴晑䓓㋥㡩䌫⌻䯡᝺灜崪⎒祄奀䏆畉ᄧ⽘㇏䐩歈㈵又⽋捄ࣼ䠵疌欀ଐ≯Ქ䖚ᾁᗬ䒄堖瀩ᎯΠೀᆓ澸啀ⅼణ֐俚ⴊఘ坓䛲尳ႆ䜜煋䮰ʅↃ哚ለဳ◦䉟㢮憊应⑒稞曫康礂Ⅱ຦楤欄日䕡坺ㆤé䗄♕愼ఠ๘怠狙傮⦳䑗㙢⣸ऒ巐Ⴤυ柋叼仏๲⛘๩ᬑ䨸民坤㴮嵭㦖᷄᷋奤淏氿⛘⽧ᬅ杂殢垗傈珍㷒翅濋䚀浈❽盙দጱ䨠Rῷⴸüᇠ垥搯䉊毚❲䆝 ݴ歏఻═ᮡ擠瀞崣㤦焠఻号稡䕁⇙䀫܋丱䯬悠溱嶉䀠Ђ✋⌹ᯔ㜸湁徃㦦眭揨ˠ櫑ᓼ݄厘攼䷴▖㟍⥡徣㴟㤭溻繗柮ᓂ㧞ዮ✍䷱毴ᕄ滴拑㥍्毲ⳗ峐⊀໥ⅳ䬱⸙沊塊渾拔僶磮埠繚嶏Ṿ忷殖犷⸃ᐺÌƉ঻㭶牺ዻ䄄䮏≑祌某ᛋ᥆⮳Ꭱࡽ庽捽ഭ旐ᛀⷮ叢傰㮜匕嚶⯁籨ࣺᡠ䟏㉿呛䮀焎ः巛e眒൏導ჳ憌१㳽䥎⁈媗ᤏᡓ巟ㅋ伃ᗠ㰘矾溳忎ï侽桲ᢀ崏ᥫ䳂ሌ玪渞䐘Ͳㄋ忊₴ө晫沒⯙痼⥠䎩漀㤯㯮⟎৳或ൢ呝檫䦈刎庰⟙瞢搨㼓ᗂộ榇嵓ᣍ下Ჳ泰懡㯣川⾟ܑ攢篶ɳ䒇庥成灒冘⥀䲙縿࿚൩↛匪篽㜰恗尧㫾禭槙⒀撘湠䈤碜吰昐笧ₗ磸傂㣞粴ഛ僄Ⱡ^俛䮵䐦汙掿䞰ẁ὿㩭䤝漛䕀丏㟾㿾㾙怵緥႗眽卟怉ܞ狨᠛䇇Ⱐၜ൮桾礆Ϻ揷Ѡव➿®犎䪧娐庨缷濚斐䈓缈暑氭妸ęݗ惹ᅙð睨ۇ⢜ㄗ⌐⏣ޤ煝烚䢨㹏剞ቧ䉘显榢增䢜ᶰႇ硑汻瀅ㅅ◾ࡣ獐ᎀ᧸ᢂ璘⻢⸸ӱགྷྋ㯮ᅁᠨ柼繫኶⼏⸃೒࿯䐭㔮çဇ⣔彶ú瞅縋䍗㑠⊠૚ᖑ଎㧯�ႉ伀�攴໌ጻ䝀兠 ⑀̓杰ۨጥ⨬᜿❲㦱┝呅⦡䀨岙✶ࠂ۩獹緧毷廏ټ乥礜嬐嘁熠俅ṙΖ̩焳疋呯墿煞ኝ㧬䨋ᐋ䟋✍Ὦ傀㼌Ճ牙嚪籡㵜ઙ㶙嬞旱桲佔敁䠘祊砳滨൯傾㎯檜翘樎ᐈ➶佘磺㴬筩炀ࢇ佯䬃暳Კ洟娘㏧䟗坅἞≬紪祳暇畯Ⴞ畞䩦䢒娙叡偶侮⦰ጔ罔䊟ႇ燯మݒ㰗戧稞湗⯯ဇẜ㹼磉縵朇忨禿睞⊙乔樍㏫枭侏ḡ㿲条䪫痈⿯穸ݞ倐挘怳珦䊀⾇—䁬簑經瓈ⷯ媿ଡ଼ẟゔ稑௲➴⿻䃘䊜紉炓ݲاᲥ杮䑟㎧ḥ傡༞⡤循㲲磙癫爷䕏桾睟⦛䌓ਕ㏢⟄⾇㣺㺒罥灿䣠ᚸ敠墢ᠦ䵥ॽⰆ垨ᏺม偲õ糑嶫䡔䍿㫝ࠅਦ沧Ⱁ埮纶彆冺秕瀩戇⨬㭿囝㖘ᚅ㘁气橂瓠ݰ嘮ᣰ俋拺᫖଴ᶯ壂癒晟毰⎽䞬᥃⬦磲ᬻ琥搌伜䧝ᶙ權䆥ᯩ繄澳啥ƣࡾ᝚块盧䁯㙓玙̾䣤寧塔፮ᐦ䴰╭籛孪ᨑ缵Ⅽ䉰挺炶☉јùὀ.㩃曻惰➏ᔃ㗝垖楫渃尌籎澡湧䀖缱禱堣唏娾֊䁛伛ㄙ氃䩥澃帧㴠㲌ӛ慒ୢ哨媡រ䓃䡯㯡矢潋徆儾维ʛ烩⼏䯿毟➛䕥㾎簜瞶娢䁯㰦纭絰爗匘燿ᖱ㾟䨣縌懗఑傹⥥͟؂琧瑰࠿たϝ᧖楮ጘࠐ䐈ἡᔘ彺ʣ狂劧穰ɠᖡㄢ眙氩䜮⠓璴䃩䮁緣羧禗媏䝈䒝ㄜ瀣䐕᤾ྪ牂ᾨ糱絃烧搜☿瀯摿夝⟥จ尃يὈ์Ⱁ簵㞂࡯籅澏∁≵਒箼⟰璾ᾇ弘綑笳礭ɯ儷䕟功ᔞ乱䐉䠚俭়㿔綱劣⏂㔗䔿姈劜ജࢰ瞭⠙侱ঌ㿔緯ⁱ໶䫗庿橞愈ఠ㨝氯⯧瞡ྖ㹻ϙ粍竲䩯綿挡ຟɲ䨓℠໮௩㲊㿢羱篍祧穏吠䪮ᢁ䌜☓㒪柶基⊆㿽㿞縃灥絏䧏⣟窟㶚樒琛⥟ᬛᵹ䣄綵綫瑛繏皿櫞α⬘㸪孊⠔栨彮澲緉箋獷瘯嵿᝟嶞ᬚ瘓఻Ŵ侯䕛޼精暷☞ṉ岿፞ટ㔛น㢀៺俥忋㋃䗵ঃ老嚱㫿抝涉䤙䈕懻┮濭彚ᚂ挽篃癧林䅀䨨䒘⾟䊋ᰎ᠙瞻潂乔䗽竳௜Ĥᑪ࿞敳ജ㸘憻砂䊫ਠ耛瀇ᾌ⼲戏浿姈奰竄峟侴䉆別㳯廅ୖʠ¯欎ῥ䃿溫戙㯁׃⑪῔㽲ކ⃃繿⢯磞⤨ኟ検笜ḓ弜修ᾬ瞘羉纳粅ȸි㛀ḱ堼䷱㐔䲽俵ῒ建⣙緓篞؉�囀ẟ㢰⤧ᗥ冷㱄徣徜缼卫磭籫ſ籎ፈޡㄡ௴䠓獌ᢕ㼪箙綳囲䷏捿嵚㖞䜞㊱ᰘ㐾啍㰓㾿㾞繣粁䢏拿恟ൂ༜ၣᰟȳ⤼灞侇柺䧋祬ؠᚑ欧⽞䵪縜簜㠝濿徵ފ纅结劯熻杏粿ᨕ㈜纒毄倅㋊怗㿋ᨒᣧ磯秳ᇃ㲟㧟ਜ琘䨠潴⺺忬罙晠Ɠ篖俍皱ᖟ⎏稝缞喧【ၠ犆罴汷᱕㵢嶠᧋傼⍰ࡽ浜掕଒瘚ほ⃞⁼匹㳤̫橷䅗ᰡ᩼佛ᦚ炻怇㾧絫羕⃽⠏禜ᖋ償献㑢䠚㬮‍ᙆ䯉老ẉ㹐敿眙撋娇星氎⽙砖硯怍玡罻羂嶺䏿紌ʟ䗐䥾⠞僝怔ᬃ⒏翍᡻羋罨張ࡀÕ罾置栭罞梜့缱罧゗罣罽⢃罅佧ᑐ×枓羞呅碀®弸增硛罠䐧羟枈Ğ⁸ý羘£罷灩罏缴ù呜ß罙䙚Ó呌Čª彼ᑹ砱坪⑈á署£W缪®Ā佊⾏缹罜Ù罶䩱ç⡘㽞碖Å⢖扒⁦îç罭罯箍罷羒ğၔ塄Ċó罚㒙¹¾呝ÌéÛࡥ碙‮ÙĉĆĐě罨ÅĂõØÑ缭Ì䁃羍ò坣ÓÑ«ੳ¸k罚摞⾆源睿ùû张䂥࢞↜ì䑻ÂĎú䑕Ç·ぷÁºæ౮⽠䂨䄚ñ婔䄐䃓ăĈ汐䃀䄓ð䄆㐼䃿è䂤塎ć罘䃧ĝ羇¡Ą½±̢䂨䃏÷徆䃯Ü䂡࡮⼶«厗摞⾒䃒塪䂵¾ÞÚ䃍Ą䃦䃂咞䃬䃳Ή䂥Ҟ䂾䄎⾉搥䄋¢Ĉ䃤᝸䂮场䂤·đ䂥侁čᒎ䃶䂴䌵䃒砵ㅥ䄉ཻ䡎砡䃞塁䄉ܧÒ¤䂯罡ĝ䂴䂠經䂹䂤̯䃓䃪硂䂩經䂻䂫塛䄖ܧ䃾ĕä䃄䃷䃩䃼䐠⃯䃚硸⃐㒃玀䂷筋玄⃥¸䃊䃍䃧䃺䃤䃝䃸⼹罷玎�䃱婢℄₹䑴⃟䂧絲₡ĕ罛í䄁羌₽䄚䃗¢₪ℂ₸㑄⃟Ûࡍ咝¹ᜳ呼䃦碀⃛ၰ⃱䃼⃊©䃴᜾⃃ă呣炝µ呹⃋¨㴥₮䃡⃚⃬₦⃐⃇䃤đ⃈⃩℞⃒䃘⃘㢝⃎₾㉨急Ý絓⃾⃉㑁₸Ċ䃦℞Ü℉羍ᐪᐥĐ౫℉⃖䉮)ï㵏№à⃤㠻₲Û⃭₼₠偨ℜℇ℗₵⃥䉿⃥ℇ㲁ܫ䄞伯㰤惵䃈䃦恠悱ℐℇ䂦䃴ចޖ₸塜惮䄙ࠥݪℕ筜感⃢­䄕₽缰惆ℐ惇⃂ల愜惑݆惂惋ܼ༺ၤ意㽤�悺悪愕䃇羁䄀惱ℌ悶⃊✯睞惣⃡᡾惓⠥罛࠹愔恲悰«ࠥ惮愞愔惕⃁惌⃺愞Ě患䃧ᑵ患!Ë䌩惹惙惽㪃ݎ惞䬻ၫ惴悪䃭愛䂱䃌惭½₨惧ᑵ݂⃉惻䠯惒₳ᑫ惋愃渿悺₨­悬⃍悭₱愍⃯缩₹罀ᄆ惈䒟惂悯朠Ⴅ亄მ惡䃕⃲佬惍⃪Ĉჽ₹罔჏③ჯ杅悼Éᢄᄕ愔j䃌Ⴧ悼ᄆ₸ჰឃ惶䨪Ⴢ惨᜴Ⴓ㩖ᄔ჻䃬ჟ䢌ჰ悷惜თ惹呮჏␱჈ᝲჶ¸塖ცᄊჾჺᄞჽ䃷悦愁჆ႫઉᄃÏ⁐⡗眢歭㢎ࡾ࢞ࡌ悊ᠸѳ䲂≄ࢁ偗䡭⡚၃䠼ဢࡻ࢚㱢⃲睆‶牝㊁⁡厙圦湍㰾灴灊傔灙ぴれ灬䝈䁽炁溆瀠ゑ瀧ⲍြ䍭缹��偂䁏⁴⪃瑗ၵݼに朢�‸᱈ਡ䠶炅灯�,僡ၣ䢒⽘�-䢚ょ䙭㲉灱䂏灿ར僧Łቭ㰺汰偽⢅⁥䱭g➍眰₼㱈ࢃჵႄࠥO瀿炒桪ု瀡僢࢏ၰ摦ᩪ㰽➙娾È籯E\"僌u❢恡悚杯_E僬悋ჵ僄?bࢌ�䁍儂偿Ħ僟瀲桀ࡶ僱ₖ儐杮儁ℎ僁僚䠿偱僡儍桖〷儑僖⁞⢆乍㰹傭筰㉯剻჏‬�ႄ傭ݴ儌`䁔傺僕ၾ怩ࠣ儜僔䡾恒pࡹ䢝ᡅ⡇ࡾ恢䂘䡜儉9lヂ枊傢ワ瀼ㄉEk杤ヸ㄃ၲャ僜ュ僄ツ��キ傸ビ⁘ㄆピメᡏもㄆホᄛゔ悑偿怯ᚌ偽⽁ㄊؤ怨堭悈琮ㄌ⁜‹ଥ灕硱た汀  "}
      

    The complete round-trip took 51.1 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.6.1",
          "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-9982-U9t7s1UuQd0X-.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-9982-U9t7s1UuQd0X-.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-9982-U9t7s1UuQd0X-.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-9982-U9t7s1UuQd0X-.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-9982-U9t7s1UuQd0X-.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-9982-U9t7s1UuQd0X-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9982-U9t7s1UuQd0X-.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-9982-U9t7s1UuQd0X-.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":1}}}}
      
    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": {}
      }

    The complete round-trip took 18.0 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
      • direction string The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
    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.6.1",
          "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 2.1 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.6.1",
          "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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-9982-7pI2rvkT41JH-.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-9982-7pI2rvkT41JH-.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}],"cfgQuick":{"graph":{"rootVertices":[90,0,3,"3-exit",2,1,"2-exit",4,7,"7-exit",6,5,"6-exit",8,11,"11-exit",10,9,"10-exit",12,13,16,"16-exit",15,14,"15-exit",17,"17-exit",18,19,22,"22-exit",21,20,"21-exit",23,"23-exit",24,25,31,"31-exit",30,26,29,28,27,"28-exit","29-exit","30-exit",32,"32-exit",33,36,"36-exit",35,34,"35-exit",37,52,"52-exit",39,38,"39-exit",51,40,50,"50-exit",49,41,48,"48-exit",44,42,43,"44-exit",47,45,46,"47-exit","49-exit","51-exit",53,54,"54-exit",55,"55-exit",56,67,"67-exit",61,57,60,59,58,"59-exit","60-exit","61-exit",66,62,65,64,63,"64-exit","65-exit","66-exit",68,79,"79-exit",73,69,72,71,70,"71-exit","72-exit","73-exit",78,74,77,76,75,"76-exit","77-exit","78-exit",80,89,"89-exit",88,81,87,"87-exit",86,82,85,84,83,"84-exit","85-exit","86-exit","88-exit","90-exit"],"vertexInformation":[[90,{"id":90,"type":"expr","end":["90-exit"]}],[0,{"id":0,"type":"expr"}],[3,{"id":3,"type":"stm","mid":[0],"end":["3-exit"]}],["3-exit",{"id":"3-exit","type":"end","root":3}],[2,{"id":2,"type":"expr","mid":[2],"end":["2-exit"]}],[1,{"id":1,"type":"expr"}],["2-exit",{"id":"2-exit","type":"end","root":2}],[4,{"id":4,"type":"expr"}],[7,{"id":7,"type":"stm","mid":[4],"end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],[6,{"id":6,"type":"expr","mid":[6],"end":["6-exit"]}],[5,{"id":5,"type":"expr"}],["6-exit",{"id":"6-exit","type":"end","root":6}],[8,{"id":8,"type":"expr"}],[11,{"id":11,"type":"stm","mid":[8],"end":["11-exit"]}],["11-exit",{"id":"11-exit","type":"end","root":11}],[10,{"id":10,"type":"expr","mid":[10],"end":["10-exit"]}],[9,{"id":9,"type":"expr"}],["10-exit",{"id":"10-exit","type":"end","root":10}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr"}],[16,{"id":16,"type":"expr","mid":[13],"end":["16-exit"]}],["16-exit",{"id":"16-exit","type":"end","root":16}],[15,{"id":15,"type":"expr","mid":[15],"end":["15-exit"]}],[14,{"id":14,"type":"expr"}],["15-exit",{"id":"15-exit","type":"end","root":15}],[17,{"id":17,"type":"expr","end":["17-exit"]}],["17-exit",{"id":"17-exit","type":"end","root":17}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr"}],[22,{"id":22,"type":"expr","mid":[19],"end":["22-exit"]}],["22-exit",{"id":"22-exit","type":"end","root":22}],[21,{"id":21,"type":"expr","mid":[21],"end":["21-exit"]}],[20,{"id":20,"type":"expr"}],["21-exit",{"id":"21-exit","type":"end","root":21}],[23,{"id":23,"type":"expr","end":["23-exit"]}],["23-exit",{"id":"23-exit","type":"end","root":23}],[24,{"id":24,"type":"expr"}],[25,{"id":25,"type":"expr"}],[31,{"id":31,"type":"expr","mid":[25],"end":["31-exit"]}],["31-exit",{"id":"31-exit","type":"end","root":31}],[30,{"id":30,"type":"expr","mid":[30],"end":["30-exit"]}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"expr","mid":[26],"end":["29-exit"]}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["29-exit",{"id":"29-exit","type":"end","root":29}],["30-exit",{"id":"30-exit","type":"end","root":30}],[32,{"id":32,"type":"expr","end":["32-exit"]}],["32-exit",{"id":"32-exit","type":"end","root":32}],[33,{"id":33,"type":"expr"}],[36,{"id":36,"type":"stm","mid":[33],"end":["36-exit"]}],["36-exit",{"id":"36-exit","type":"end","root":36}],[35,{"id":35,"type":"expr","mid":[35],"end":["35-exit"]}],[34,{"id":34,"type":"expr"}],["35-exit",{"id":"35-exit","type":"end","root":35}],[37,{"id":37,"type":"expr"}],[52,{"id":52,"type":"expr","mid":[37],"end":["52-exit"]}],["52-exit",{"id":"52-exit","type":"end","root":52}],[39,{"id":39,"type":"expr","mid":[39],"end":["39-exit"]}],[38,{"id":38,"type":"expr"}],["39-exit",{"id":"39-exit","type":"end","root":39}],[51,{"id":51,"type":"expr","mid":[51],"end":["51-exit"]}],[40,{"id":40,"type":"expr"}],[50,{"id":50,"type":"expr","mid":[40],"end":["50-exit"]}],["50-exit",{"id":"50-exit","type":"end","root":50}],[49,{"id":49,"type":"expr","mid":[49],"end":["49-exit"]}],[41,{"id":41,"type":"expr"}],[48,{"id":48,"type":"expr","mid":[41],"end":["48-exit"]}],["48-exit",{"id":"48-exit","type":"end","root":48}],[44,{"id":44,"type":"expr","mid":[42],"end":["44-exit"]}],[42,{"id":42,"type":"expr"}],[43,{"id":43,"type":"expr"}],["44-exit",{"id":"44-exit","type":"end","root":44}],[47,{"id":47,"type":"expr","mid":[45],"end":["47-exit"]}],[45,{"id":45,"type":"expr"}],[46,{"id":46,"type":"expr"}],["47-exit",{"id":"47-exit","type":"end","root":47}],["49-exit",{"id":"49-exit","type":"end","root":49}],["51-exit",{"id":"51-exit","type":"end","root":51}],[53,{"id":53,"type":"expr"}],[54,{"id":54,"type":"expr","mid":[53],"end":["54-exit"]}],["54-exit",{"id":"54-exit","type":"end","root":54}],[55,{"id":55,"type":"expr","end":["55-exit"]}],["55-exit",{"id":"55-exit","type":"end","root":55}],[56,{"id":56,"type":"expr"}],[67,{"id":67,"type":"stm","mid":[56],"end":["67-exit"]}],["67-exit",{"id":"67-exit","type":"end","root":67}],[61,{"id":61,"type":"expr","mid":[61],"end":["61-exit"]}],[57,{"id":57,"type":"expr"}],[60,{"id":60,"type":"expr","mid":[57],"end":["60-exit"]}],[59,{"id":59,"type":"expr","mid":[59],"end":["59-exit"]}],[58,{"id":58,"type":"expr"}],["59-exit",{"id":"59-exit","type":"end","root":59}],["60-exit",{"id":"60-exit","type":"end","root":60}],["61-exit",{"id":"61-exit","type":"end","root":61}],[66,{"id":66,"type":"expr","mid":[66],"end":["66-exit"]}],[62,{"id":62,"type":"expr"}],[65,{"id":65,"type":"expr","mid":[62],"end":["65-exit"]}],[64,{"id":64,"type":"expr","mid":[64],"end":["64-exit"]}],[63,{"id":63,"type":"expr"}],["64-exit",{"id":"64-exit","type":"end","root":64}],["65-exit",{"id":"65-exit","type":"end","root":65}],["66-exit",{"id":"66-exit","type":"end","root":66}],[68,{"id":68,"type":"expr"}],[79,{"id":79,"type":"stm","mid":[68],"end":["79-exit"]}],["79-exit",{"id":"79-exit","type":"end","root":79}],[73,{"id":73,"type":"expr","mid":[73],"end":["73-exit"]}],[69,{"id":69,"type":"expr"}],[72,{"id":72,"type":"expr","mid":[69],"end":["72-exit"]}],[71,{"id":71,"type":"expr","mid":[71],"end":["71-exit"]}],[70,{"id":70,"type":"expr"}],["71-exit",{"id":"71-exit","type":"end","root":71}],["72-exit",{"id":"72-exit","type":"end","root":72}],["73-exit",{"id":"73-exit","type":"end","root":73}],[78,{"id":78,"type":"expr","mid":[78],"end":["78-exit"]}],[74,{"id":74,"type":"expr"}],[77,{"id":77,"type":"expr","mid":[74],"end":["77-exit"]}],[76,{"id":76,"type":"expr","mid":[76],"end":["76-exit"]}],[75,{"id":75,"type":"expr"}],["76-exit",{"id":"76-exit","type":"end","root":76}],["77-exit",{"id":"77-exit","type":"end","root":77}],["78-exit",{"id":"78-exit","type":"end","root":78}],[80,{"id":80,"type":"expr"}],[89,{"id":89,"type":"stm","mid":[80],"end":["89-exit"]}],["89-exit",{"id":"89-exit","type":"end","root":89}],[88,{"id":88,"type":"expr","mid":[88],"end":["88-exit"]}],[81,{"id":81,"type":"expr"}],[87,{"id":87,"type":"expr","mid":[81],"end":["87-exit"]}],["87-exit",{"id":"87-exit","type":"end","root":87}],[86,{"id":86,"type":"expr","mid":[86],"end":["86-exit"]}],[82,{"id":82,"type":"expr"}],[85,{"id":85,"type":"expr","mid":[82],"end":["85-exit"]}],[84,{"id":84,"type":"expr","mid":[84],"end":["84-exit"]}],[83,{"id":83,"type":"expr"}],["84-exit",{"id":"84-exit","type":"end","root":84}],["85-exit",{"id":"85-exit","type":"end","root":85}],["86-exit",{"id":"86-exit","type":"end","root":86}],["88-exit",{"id":"88-exit","type":"end","root":88}],["90-exit",{"id":"90-exit","type":"end","root":90}]],"bbChildren":[],"edgeInformation":[[3,[[90,{"label":0}]]],[0,[[3,{"label":0}]]],[1,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[2,[[0,{"label":0}]]],["3-exit",[["2-exit",{"label":0}]]],[7,[["3-exit",{"label":0}]]],[4,[[7,{"label":0}]]],[5,[[6,{"label":0}]]],["6-exit",[[5,{"label":0}]]],[6,[[4,{"label":0}]]],["7-exit",[["6-exit",{"label":0}]]],[11,[["7-exit",{"label":0}]]],[8,[[11,{"label":0}]]],[9,[[10,{"label":0}]]],["10-exit",[[9,{"label":0}]]],[10,[[8,{"label":0}]]],["11-exit",[["10-exit",{"label":0}]]],[17,[["11-exit",{"label":0}]]],[13,[[16,{"label":0}]]],[14,[[15,{"label":0}]]],["15-exit",[[14,{"label":0}]]],[15,[[13,{"label":0}]]],["16-exit",[["15-exit",{"label":0}]]],[16,[[12,{"label":0}]]],[12,[[17,{"label":0}]]],["17-exit",[["16-exit",{"label":0}]]],[23,[["17-exit",{"label":0}]]],[19,[[22,{"label":0}]]],[20,[[21,{"label":0}]]],["21-exit",[[20,{"label":0}]]],[21,[[19,{"label":0}]]],["22-exit",[["21-exit",{"label":0}]]],[22,[[18,{"label":0}]]],[18,[[23,{"label":0}]]],["23-exit",[["22-exit",{"label":0}]]],[32,[["23-exit",{"label":0}]]],[25,[[31,{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],[29,[[30,{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[30,[[25,{"label":0}]]],["31-exit",[["30-exit",{"label":0}]]],[31,[[24,{"label":0}]]],[24,[[32,{"label":0}]]],["32-exit",[["31-exit",{"label":0}]]],[36,[["32-exit",{"label":0}]]],[33,[[36,{"label":0}]]],[34,[[35,{"label":0}]]],["35-exit",[[34,{"label":0}]]],[35,[[33,{"label":0}]]],["36-exit",[["35-exit",{"label":0}]]],[55,[["36-exit",{"label":0}]]],[37,[[52,{"label":0}]]],[38,[[39,{"label":0}]]],["39-exit",[[38,{"label":0}]]],[39,[[37,{"label":0}]]],[40,[[50,{"label":0}]]],[41,[[48,{"label":0}]]],[42,[[44,{"label":0}]]],[43,[[42,{"label":0}]]],["44-exit",[[43,{"label":0}]]],[44,[[41,{"label":0}]]],[45,[[47,{"label":0}]]],[46,[[45,{"label":0}]]],["47-exit",[[46,{"label":0}]]],[47,[["44-exit",{"label":0}]]],["48-exit",[["47-exit",{"label":0}]]],[48,[[49,{"label":0}]]],["49-exit",[["48-exit",{"label":0}]]],[49,[[40,{"label":0}]]],["50-exit",[["49-exit",{"label":0}]]],[50,[[51,{"label":0}]]],["51-exit",[["50-exit",{"label":0}]]],[51,[["39-exit",{"label":0}]]],["52-exit",[["51-exit",{"label":0}]]],[53,[[54,{"label":0}]]],["54-exit",[[53,{"label":0}]]],[54,[["52-exit",{"label":0}]]],[52,[[55,{"label":0}]]],["55-exit",[["54-exit",{"label":0}]]],[67,[["55-exit",{"label":0}]]],[56,[[67,{"label":0}]]],[57,[[60,{"label":0}]]],[58,[[59,{"label":0}]]],["59-exit",[[58,{"label":0}]]],[59,[[57,{"label":0}]]],["60-exit",[["59-exit",{"label":0}]]],[60,[[61,{"label":0}]]],["61-exit",[["60-exit",{"label":0}]]],[61,[[56,{"label":0}]]],[62,[[65,{"label":0}]]],[63,[[64,{"label":0}]]],["64-exit",[[63,{"label":0}]]],[64,[[62,{"label":0}]]],["65-exit",[["64-exit",{"label":0}]]],[65,[[66,{"label":0}]]],["66-exit",[["65-exit",{"label":0}]]],[66,[["61-exit",{"label":0}]]],["67-exit",[["66-exit",{"label":0}]]],[79,[["67-exit",{"label":0}]]],[68,[[79,{"label":0}]]],[69,[[72,{"label":0}]]],[70,[[71,{"label":0}]]],["71-exit",[[70,{"label":0}]]],[71,[[69,{"label":0}]]],["72-exit",[["71-exit",{"label":0}]]],[72,[[73,{"label":0}]]],["73-exit",[["72-exit",{"label":0}]]],[73,[[68,{"label":0}]]],[74,[[77,{"label":0}]]],[75,[[76,{"label":0}]]],["76-exit",[[75,{"label":0}]]],[76,[[74,{"label":0}]]],["77-exit",[["76-exit",{"label":0}]]],[77,[[78,{"label":0}]]],["78-exit",[["77-exit",{"label":0}]]],[78,[["73-exit",{"label":0}]]],["79-exit",[["78-exit",{"label":0}]]],[89,[["79-exit",{"label":0}]]],[80,[[89,{"label":0}]]],[81,[[87,{"label":0}]]],[82,[[85,{"label":0}]]],[83,[[84,{"label":0}]]],["84-exit",[[83,{"label":0}]]],[84,[[82,{"label":0}]]],["85-exit",[["84-exit",{"label":0}]]],[85,[[86,{"label":0}]]],["86-exit",[["85-exit",{"label":0}]]],[86,[[81,{"label":0}]]],["87-exit",[["86-exit",{"label":0}]]],[87,[[88,{"label":0}]]],["88-exit",[["87-exit",{"label":0}]]],[88,[[80,{"label":0}]]],["89-exit",[["88-exit",{"label":0}]]],["90-exit",[["89-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["90-exit"],"entryPoints":[90]},".meta":{"timing":9}}}}
      
    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 36.8 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 alternatives [required] Test regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression, and string arrays are checked for containment.
                    • . string
                    • . array Valid item types:
                    • . string
                  • 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 alternatives [required] Test regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression, and string arrays are checked for containment.
                    • . string
                    • . array Valid item types:
                    • . string
                    • 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 and optionally also updates it.
              • type string [required] The type of the query. Allows only the values: 'config'
              • update object [optional] An optional partial configuration to update the current configuration with before returning it. Only the provided fields will be updated, all other fields will remain unchanged.
            • . 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 df-shape query retrieves information on the shape of dataframes
              • type string [required] The type of the query. Allows only the values: 'df-shape'
              • criterion string [optional] The slicing criterion of the node to get the dataframe shape for.
            • . 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?
              • direction string [optional] The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
            • . 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? Defaults to false.
              • 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 read 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 write 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.
              • visualizeFunctions array [optional] The set of visualize 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.
              • enabledCategories array [optional] A set of flags that determines what types of dependencies are searched for. If unset or empty, all dependency types are searched for. Valid item types:
                • . string Allows only the values: 'library', 'source', 'read', 'write', 'visualize'
              • additionalCategories object [optional] A set of additional, user-supplied dependency categories, whose results will be included in the query return value. Allows only the values: '[object Object]'
            • . 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'
              • ids array [optional] Optional list of ids to filter the results by. Valid item types:
                • . string
            • . 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 Either returns all function definitions alongside whether they are higher-order functions, or just those matching the filters.
              • type string [required] The type of the query. Allows only the values: 'inspect-higher-order'
              • filter array [optional] If given, only function definitions that match one of the given slicing criteria are considered. Each criterion can be either line:column, line@variable-name, or $id, where the latter directly specifies the node id of the function definition to be considered. Valid item types:
                • . string [required]
            • . 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', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'network-functions', 'dataframe-access-validation', 'dead-code', 'useless-loop'
                • . object
                  • name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'network-functions', 'dataframe-access-validation', 'dead-code', 'useless-loop'
                  • 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.6.1",
          "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-9982-NV5Wxk85kC0T-.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-9982-NV5Wxk85kC0T-.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-9982-NV5Wxk85kC0T-.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-9982-NV5Wxk85kC0T-.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-9982-NV5Wxk85kC0T-.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-9982-NV5Wxk85kC0T-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9982-NV5Wxk85kC0T-.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-9982-NV5Wxk85kC0T-.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":1}}}}
      
    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.8 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.

Note

If you develop flowR, you may want to launch the repl using the npm run main-dev command, this way, you get a non-minified version of flowR with debug information and hot-reloading of source files.

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.6.1, 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 2.3 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.6.1, 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.
  • abstractInterpretation: allows to configure how flowR performs abstract interpretation, although we currently only support data frame shape inference through abstract interpretation.

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
    }
  },
  "abstractInterpretation": {
    "dataFrame": {
      "maxColNames": 20,
      "wideningThreshold": 4,
      "readLoadedData": {
        "readExternalFiles": true,
        "maxReadLines": 1000000
      }
    }
  }
}
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.
    • abstractInterpretation object The configuration options for abstract interpretation.
      • dataFrame object The configuration of the shape inference for data frames.
        • maxColNames number The maximum number of columns names to infer for data frames before over-approximating the column names to top.
        • wideningThreshold number The threshold for the number of visitations of a node at which widening should be performed to ensure the termination of the fixpoint iteration.
        • readLoadedData object Configuration options for reading data frame shapes from loaded external data files, such as CSV files.
          • readExternalFiles boolean Whether data frame shapes should be extracted from loaded external files, such as CSV files.
          • maxReadLines number The maximum number of lines to read when extracting data frame shapes from loaded files, such as CSV files.

⚒️ 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.

Creating flowR analyses

Nowadays, instances of FlowrAnalyzer should be used as central frontend to get analysis results from flowR. For example, a program slice can be created like this:

const analyzer = await new FlowrAnalyzerBuilder(requestFromInput('x <- 1\ny <- x\nx')).build();
const result = await analyzer.query([
	{
		type:     'static-slice',
		criteria: ['3@x']
	}
]);
//console.log(result['static-slice']);

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, a slicing pipeline using the PipelineExecutor looks like this:

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