Skip to content

Interface

github-actions[bot] edited this page Nov 25, 2025 · 1 revision

This document was generated from 'src/documentation/wiki-interface.ts' on 2025-11-25, 12:48:06 UTC presenting an overview of flowR's interface (v2.6.3, 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.3",
        "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 query 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.3",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details

      Let's 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":{"files":[{"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\"]","filePath":"/tmp/tmp-8171-UlLznzFLMSDE-.R"}],".meta":{"timing":2}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8171-UlLznzFLMSDE-.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-8171-UlLznzFLMSDE-.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-8171-UlLznzFLMSDE-.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-8171-UlLznzFLMSDE-.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-8171-UlLznzFLMSDE-.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-8171-UlLznzFLMSDE-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8171-UlLznzFLMSDE-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8171-UlLznzFLMSDE-.R"}],"info":{"id":7}},".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":1422,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      

    The complete round-trip took 7.0 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.3",
          "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\":\"text\",\"content\":\"x <-\"}}\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.3%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%22text%22%2C%22content%22%3A%22x%20%3C%2D%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%3A128%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A221%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A182%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%3A104%3A19%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A192%3A25%29%0A%20%20%20%20at%20async%20FlowrAnalyzerCache.runTapeUntil%20%28%3C%3E%2Fsrc%2Fproject%2Fcache%2Fflowr%2Danalyzer%2Dcache.ts%3A89%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.sendFileAnalysisResponse%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A163%3A52%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09"
      }

    The complete round-trip took 7.8 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.3",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "if(unknown > 0) { x <- 2 } else { x <- 5 }\nfor(i in 1:x) { print(x); print(i) }",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

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

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

      {"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-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}},"results":{"parse":{"files":[{"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,\"}\"]","filePath":"/tmp/tmp-8171-XfNudz7vzAx4-.R"}],".meta":{"timing":3}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8171-XfNudz7vzAx4-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8171-XfNudz7vzAx4-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.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-8171-XfNudz7vzAx4-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8171-XfNudz7vzAx4-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8171-XfNudz7vzAx4-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8171-XfNudz7vzAx4-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8171-XfNudz7vzAx4-.R"}],"info":{"id":33}},".meta":{"timing":0}},"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":1503,"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":{"_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":1}}}}
      

    The complete round-trip took 7.7 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.3",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "n-quads",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

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

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

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

    The complete round-trip took 6.1 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.3",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "compact",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

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

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

      {"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀஠洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾࿛⩬ᰡ暁∠ᰠ⵲䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ჈䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ๝吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭⵮埋ℜঋ殍ᯕ獺฀䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰  ","results":"ᯡࠣ䄬Ԁ朥ᢠ⹰ڀ■㚑䤦檲ⲐŒ≎ĸó⻀ᬵǸ吠拀ຨ㠠禥Ꮚᐰᨀ㢦瀠‣怫₱⧠ᝪ劭᫺⨡䲂ƴŔƄ¤Ȅ�Ƞ峀˙憮牲凃㮓✾㸢䉧溔㤦⫋㗈L⨠ጳ౬怪ဣࠠ吡稠䄽ຠበเβ嫹籡㉮唦㴵᱀૦ᗨˈ඲â፼仂⃎晀吮㥳䰚呕睎⽟аⱊᔁ甥⏈兕ਦᬧ䲛敔Ⲱͳ敫玱畖Դ㎿Ⲏ㔊瀍吮❔ٕ垤柺㹃㻲䒦椾†犍倅㦩嬻䛈声←厯⩔ⵖ䏁᭸崹䰸㥍憅䱩玭፿ᯄ偬ₔଠH₶\"晠ȉᘠ᛬φᥒ#䅤えᤠಈ䠠ሸƠĴㄊ傪ܠT㈠ຠɱ 待У៲火Ȥ䊡ᙔẶ䀠瘠㦲Ť⬵⨨�Ȍ傚㡦䀠帨㈤ 悶㛄Ӑ¾〫刣䭩⡕倢姡峯㋲➀硰ѝ㚛⻿㿶⇫ㅑ嬣ǁ嚣⳦䂚䔎㊹䌰偘÷ྚ纠湴㈻倿ⓦIJᢋ㮱┇ᗤᡆ劤⪬ኳ䍆㗔杣矲C㗃֏宽溏Ɛ桊睗᳐⭩碵威愊夻䉆ൈ㗋楠永خ⢣ൎ檥慴⃤ㄭ׶珢≺栣ⱋ戎ˋ⃄ᄣ㄀ᨤ湨ੁA䬣Ⴓ僶媀٤๘ዴ᫤ޢ⁀⃶惚壴懱匠۬䦰㊨㶴牜徴ੂ䱰䫲干⨶䨪๾䷐皏寓ᒊຠ໛徔⁀ʢḦ䔓ḷ䬑幦伐唔ሖ㻏䯐绿堓怠⠮僀㳐ᩩ刮䄡丩媨⨡㇈⃷↧儠槸⏴ᩆ堨ᅐᇤⶰ牼垰ૢ呷ੲ噰⩬╕囙ۢ亐ਢᜋ尭㨦䑍᪶䶔㉸ᮦׁ㱌⃏ỡĖ䨡绤ᕁ䂹᭪‹㳴娨ⱈ勖䲥䡛宣渡䛍ᧂ㗷ặ嬕幫嵧璒☐煪⠐᪟䵨䆶傢䔬૱懖㼮ኤ㚵ᅎ㲯㥴⯭凞↭ᨆ⚋榄ܲ℥勡牅䌥Ⴥ❵ย⻐㙰৑㚶䶨⺼ⰄᲺ�ㅃ啔布䪑亓嶪皘ć䳋削ᔢㄗ嶜⁐䍀ᤕṍ㱯㕲〽屋勲㻝ㅨ悿䂊෈⠮梺⩉呰⚗樐ㄮ⇢⮏妳⛫懔晗䶬冋㦴㏩兞㺯祬㣮ເȈ煈簲೜⻏熢㡮㗈ᄼ䦗䈴ⱝⅯ㻸祬්㼺℁ࢻ̈́枈द℩䢜窸憶㋶姘⻩Ŭ槨ⷄ㗨儾㪮禔⿪⪶偋♉㊓Ա㭪䗀ُ劑␠▀ॉ箞経沶孍昙ナ♅⦯ᕰዋ╀ᮅ嘕Ⲧ杭㸹䮍⹹⌫ᑿ␒⿍⯘捽䍠Ⓕ඀抌寳ㆻ䶖斸㭫㶹㮋㮽ᬶ⍯毃ྦྷ派䤍ᚬ
থ淴坸朹⥝墌⃭檈㍖緙î⯛㏮疊琎狶༩䩕䎆⳹ヅ㚋ሴ媰睄▶砛玻㬬㥰᝾倪€ᬛ⨺䭳ጾ勗ᘒㆂÄࠢ䂍䀡湾䎀ګ碍ᨤ഼几ӂ榎▬昊㉵䎉桳Ⴀ刨തk⍶噯储୤໶侣痢汨⁓珙Ӛ┩⪋⇐⓯䁶䍢瀠䊆墤▬ᦛ∦殔ᝠ汇䩚⦈-汀瘩㤴Й㠡卨娡أ❴りü䎀倫⒳ᐣ㿅䥴ѥ㉱匢ⴷ⹓⻉璶條༢瀨ϴᦣᠩ䌁愷⃂ᚣڤ䅲ஒ✭䊀⇴ᩤڑ圳ᆒገㅲ稈≹䉱ሀ漪İ)₳၁ἳ䪨Ⴜ㕁岙檝➬婑਑䤻ʡᆡ䅀楢㝄≦Ϩ戦䒬֩ë䡕ᷣ㑌勲⍆牶ⓈᎨ䁼䏩昴䂥ሡ䕂⌜㏄⪚╴湠ೂ▱㪵ਂⳲ搮㌦⋸硿л㥬哰侹庸燍Ჱڣ㣄䨣ሰ撘垯ࣿထ嶳᧵ኒǼ獎㛇檃⛌䂶ᳳ䮠垰䥻Ჳ⥚㏚㨅乸⩼懩攄䝌愦税ᆕ⍜㌎⪅皑曢䘣㲰ѹྲ奶䃢歕ႁ⸡慠ᒔ仪瓹䩅౹֪ඳ䝜Ჲ帷牫兂瞨䴛䳅➸敜֪㣙㊂㼵扱ᔒ眢拤仹ᒰ秀婋㓞䩥㊳․ɦъ峤⧙ኹᤴ刪哙ᆫॴ啥摌摪䨵ᚰ唦凘䛓㏩⩵㥣ᙊ窔᫙Ⰹ䒧ᒕର櫀剕⎶冃柚柎᫅䩠摩䨢္Nj殍⥇絨╦勃勗⼕噻畈巊筑ᆣ㻅䍷撠ᚉ䛩⸥䳸䷹ἱ⤬悔ᩔᅯ唴筏✛⧵䐮ⶵ崻壄檃弳䵹Ö喋ዸ棭䞻浾唫焥ᩦⵖ䪀璤夏㲷⃪㳻ḍၛා㋧⨴?岖ⳉ䗶淪仵沙ⷿ૙亠百ᡩ⽊⽊Ⅰᇁխ昼ヴ戱噡䟙㪫㩵⩶畢纑嚷⅘㌶ᨕ傛䗑犸ⶐ䒺ξ吴廴䛝寿㷺⤛Թ稩⁩ᡤ唢栌₌犥᤭崠㟛᫓䪻㼬侄ཡ汊庬ǝ㯹冶ದ瘵م䲯彶ඒ縺䊠ˀᇽ樣緵喧刲㲜䛯⯱⣼ೱ䈿処ᮠ晐ూ㛦燊劘樴楏ม牉Ȍέ兕Ђ㬧炎䘿㑔僾㜉劾今佳⡰�ൔ⎞喇࠾朔犮೴伹刽ᧆᯭ坙㍢㕳皊ਠႡ栘碯ᔂƥ宸ᧇ撳婘䌬㐆犏᪂恎䃨▥呈�㡺槡ᳫ⪷䯑㬈ኈ暲癯擹µ䙾懜弃ᅗ緆䟦ք䜖⮮ᓤඩ奸秤妳ᓝ⬢⧷緃站⒍Ⅰ̒✞⼡慾戉怖ố㸑ㅶΑ¿⽖ᜁ㟑厌ⷰ妻ᔢ敍㧆玝圾⑎໸㪾纽痵崓䫘ᮉ㖗ᢊᝎ瓕穠Ȓ曠侽䡮緲奻機歆㇖暛娤䀽櫷ឝ告䠿岫束ޠ猧瞄࿜氾糤ἴ⣽淝侧⡹箧㳶㯔瞞橍৲滽偘☉ᴧ䷝䞴珖ᔆ㜁碿༉ṙ䎊ᗤʰ⯝毴窯䄎乑憼彠䨓湚䗩㪥*▷Ҕ玡㢡猊俼洼䘒⺃橾揵㺇杚垒獨ଈ瞦㎼⋲崓泞ᯕ㮫憕獺癎梄Ǎ擿⇳㛛䟼㣹㬃᎒➤㆏崛ڝ淼ؚ忻揾毁妗徕ᜦ笾猐椝掼ϻⵥ泚⟻㯛ञ孮煌ᨀ棽瘌ฆ㵢䂵ᰁ൯㏕అ綖ᒎ澉懽⫾㛷熞⮡እ狧㬞竷嘙曛歜槺濳硟ஸᯚ瞗夣甫瀠Ľଈộ⺞߰幗撛枠晿綜埫獞瀶㾲ଢ⬥㱽ᖟᐇᮿ䐑ⱋ繶ྗὧ秾⿱緧伟濋糌㸐㿢ஸ⚤罞䴞ᇵ繿玌Ḱ凶缈璗И▲绿甠攚Ṧŀ॔⠘攴爫盳ጛ矵ť⌠彺㗹廸玿㘥侭幜牀娥Ⅸ桐ǐ┃偞㙼勀䴤濯ŭ犛㙚ᡖ䇻爇ܥ㷤ðᅌㆁ桏癵᠀娢їĺ疀咙獴∂ྠ䡪摚䡰圄أ崥ѝ獇․秥↊຀撧埪ġ䇰䰠傾ⅵᙐ両Ⅵ礔䂭㪤号弇癷㖦汏⅙焿ᙙ䟹愬ᕐ椧ル戊䓐劊᱿⣧烰坘ぉ婁ඐ嬛濣懮犨圧リᅰ埔ё䉐ḱ௹⩧≘㻂瑐夣㉑ᅼ囨告繨䂱䈰呹䩞5ࢰ宥牎ᄲ曈䒀䡐ੵ࠮㥦㴦㹔ྠᒃ前ḷ爈䛀牎缎৷ᤛ⡒㣝টᤥً兡૪Ճ䑟冝癷㷂Ⱞↁ炏⹦⁑儡䝸岦籘八ੰ䋤怶㹰Ј綦㑒滸㝘旤䙂Ĥࢸ䗦婎檄඘漤‪ㆵຓ㟦䱋ㇹ熨壧⏿煓໣ᡆ㯽䊆☘狘䌾˄ψ灄ᩜ㇮瞤䱅੉嬈䵚˥⁺桵␟䀈᱋⇸㏤䅅毹㛋燸珧ᷬ䨁ⓤ廩楗䆸ᓠ㓲ॄ省࿀厈奃�䣄惛䁟ƌିཅ祈燼䮠⭅炦㹰ごᨠ倶঄ප糆Ṉ⧲ీ狄ᕁ䤨೴漧ᄠ棼䑴瘻畐楨仄烇ᷤ樀䬅ᗅⅭ壟煸掤秾槊䪰䜙䠥槺䤩௅浚桦䃀ଡോ䬖䠬毄౏ㄾ䰔梅㵊剁䰬濅ഢၡ䪍㷅ፌ槃।璚博楉䰔劇㩄ᴌ佗ä矶ᔉ䪘䗇⁌妆ౠ㔤䎥ᅄ唨痦㥘↨ݴก䍖ᇈ䢶㮇࿦姝一簩倶㼒ቌ䀦湋䩣䤼䈣䭍⨎䠲ᔆ䝆妫䡠ᑊ‣桓䲔䥅㥽㤻䔌䡅獷㥓䧌分硈禡䬼煄❉嬇俼暆ཝ栻䃜䨆὎đ䡸唸攻䡐ڱ㊅⟲穿䨜帆癛夡䔜砆罆ᦨܢ倶䩆R䒉 Ṡ堨⼲〴楉刐Ɫ吴僑հ嘮ᡱ䑉Ձ၂吡ࣖ㦎俨䂲䣜䕕䧂懅ⅽ桿䪕㋋⵸䕵ኂ绋ᵭ䔴⼬栵䠳䕌ⱕ຅癰╶吖⌷惗猇គ戡ᣚ▞昂垆䅊╏ᑲ䶇操☁⒲䳃浌⇢ֲ匵瓃壓䉲䈇㇨斞俲榴㓞צ⡒亷棐數⿝ᤶ䵟䨁癤䠴哕؊䎒䢶ṩ䕮⧲童䣍ᇭ䣨坆䓞ׁ⭠౒ň㸹伒庉ᣖᕐ朴瑵唢䢁⸀吠ಱॻ仜唛狝ֵ䬢䥵⃏ᖈ☀䇀䌶ʷ䧘挙᭶嗶䟊䞷㙉ᔸ⠬୵嫃ᖯሊ䵵圴斥⪊廨ൗ璆⿜癛䛆斝⥂僵畆瑭Ř沷Ⱗ棫⣸畂⛙ᗸ獺䛶ํ凮㏺䫵Ⅷࡹ䀦ʹ孊ᚇ⥐䗷嫈ਆ佴夘滛᢫䊢䯴ƪ੢Ҭń䛓ᆯ᜚斣䥁ᕴ䴊奵䠰ค䮺啪⇛┫࿴ⷶ䁏畱ⲙɗ㌮ŀ水攴⍀⒈欴懵噀夈湠䋥ᣜʺ䆴ਣ县㢷Ⲫ殅䧂ʴ滆爆㇅䆜⨒祔
䴤劢䍔⧊䴤勐捔׆䷨涌杗㧆丗ⱪ䖅ộ渲椶爇⇑*溆䵵㧚椚䋘姛䝔㘝⣶囖䫎ⴲ晁ೂ㗕砡⥂䇔ⷊ২ᜐ沵櫅懻⬊夢ᷞ涵ⶊ䮧烝涂檫Ꮧ◔ි澼秈籀䵜猖䋦洽Ԕ世玹⏝◌濰犵獾Ḕ䧌檖硈繦䋄ⲵ㏇ᷮ漦䂱珋㕕乎埤ാ拔楌佘漲崡櫦答勂嶶椂玕ⱏ⣒⻐凗ϋ嵰⬎䩧㋎ᗒ⭪瞕⣑ㇶȾ吴䟙ℵⶮ狛㤢嘕殆犗㇡㷵⪢嬔慟ռⶲ䇅ᵴ㵘櫔༕⃏㷰͜無㕎㵜猠ؔ࿟䔢⇞囄佖絰唬㿀ᵂᗵ滣ᰕ繮緱爞瀘歀·䩦栖噚紸槛➶ỘᶀΠ狕悄䷹ᚡᨲ嫎慚櫜廔ᑕϰဤ听㫈ᶃ楡妱傅嶨ف焢䢍㧶䄔ణ㤬䖀۶斚ゟ畁ጠബ᣾䎈ҁ怖གྷ䎔ᢁ寤坺縜ᬁ伭ⅻ䂂㋎砯ヲ␚ぎ燗↪⍕䮱刭穮Ь䂠㞙䂉槸ヱ緀⟱ḕ৺夛璋⎄᭑䮁坌℻䜪䘮᫕䍵ጠඬァ⏐ᦑ穵䏛ۮ᥵∃ᑂ�ᛔ㉢ῖ┽䐩灮濍掃欩䢀⊉緪榩偬䊆㻲ᄞ維⻂绉ḁ愥㊊՟䭱措✱䣒⩉憯炁疀汱氳ઊׅ᯴糆⿇⏻䪍⻀倩給ᬒ䯔ҵ向ᬑ䷄᪗䆲䃀Ⴓ⒗⍼刹䣭៉Ḇ⬿ӭ䢎㍰儼琢ⰱ棒⩹旦嚊Ꭷ潹䫭䢇㏋ᶞ氀磊緿橙䊗䪆ⶓ䬾梁亍ᷪ槙斡壊੬ᵟବ凄ኇ愉䰭䟈⎃ㆉ埧紮梦Ⱕ憅⚘捽ᮔࡍ䢋⎁⟌䠆ୄ獼別恛⏹୕䨥呈Ⴃ䔈ẁ䎯床剸嬌ḯ毵梪冠ᵠၩȦ䇰‱怶ႍᦈ治⌶梸ᗃ㄁崲砾曧ⅎ猴ḏ໣ཏ喠㶀®▖ᆒᅺᴵ䬙傧䁆Š㱣恲ᠠ旆҉斁⬦䤂Ф筮傣ᚯƭ▊㶲壠㶩Ⅰ恦嬵卭૑犆夵燏▂糼͵拍֥⬬ን䛍㬫⬢➨ໍ㦌㹖塕䶄Ύ殖何溕䎅๒岕糏ᶙ⭶⎕䲌㶗᡾夠࿎疏᫊෕嶗ᗓ᭲妿ҏ䖏㉐­䂕⎝歪屼㧓䵼宺峷㛏厐䅅并熍㎗䇒ᖍ棯᪏㌍尭䡕䮑ᬵ弌㲏唦宾寍矎続ṝ寕吷➄欫୐Ǝⶋ͵ᑽ䞎䮁毃峍焍怫㬦䅭媍継溋尭狔侄ᬫৰጏ劎䵱㋝笍箓㬣妕伍瞀箳寭㸎侏卭匝䘏㉠�毽拦➵搧߸崙秬䟛儅⬓盧ㄎ竺Ụ姠縛繺狊ဟ㟲恝㳾᠉儧ቼᢳ矵㡛ᇆ圜ླ㹛哸绥䯷㳍ヾ㳮ဟ朓囬模ཉΏ቙㫱г㗧њ▲࿃曧㑞ऑ券烑䒢ㇱጐ甶䥟㈀嵘笻䫹燨癈翛⩜ἔ㴄片㾼曘俒⟠㐬盵囸㙥ᰪ⾅䆔⡔岢刷嚍䋫㠣㋠䭙㦈㉸匂՝卫瑇勤元࿬㎑Oሰ⍀₊⅃犙ీᭉᥦĆ⿤性ᩔ㴬纇л᨜插‱拾⍑乷㛹Ⳡ䀶⹌疇ᠡ娅ᄌ糫⠥㌍痹㤷≣㨅᝜筫὜㋷冤⠷䍢縨⿍ط爆䗱ㅂ笷ᝧ䘕磧憷糚⭯盒ិ撂䋔׀݉倹廷站⭗⠧一ݹ妇嗞ᘍ俧㾇૜㧵⾼玅㫘稒Ӝ睫ٻ秫⹎䛷惝؊䊚獷磇痺ದ紾ᗛⷹٞ絔㗫㘫枸獇材䝂ぷ折線㧠䢾爠Ꮪ匙溺疗࿀ذ⹚羗烝瘓潏W浠☁猞癣悛◿␩炥㠧喁㜾Ɐ汃㕨᫡祷⨪ḍ⿽༇墜㘅滕懮寙⏷⸾碔璛ܫ漂环沔吉‑砗ኝ䂤䚀ļἵ䦗Dž琷ᚌ䈍Ḯ罯䢙㨔ẹ罷㏝㐏俹瀷撜瘗⾙甯棚搒¥癞禙䰖ࣨ㶏䖝灡䞧広ᒑ⯤ṙ㎅次ዅ䈒估ͦⶇᙺ䳊൦␱僨吤䜵⢏奏ࠌ䔵㧶彮絫嶞㘂ṝỷ⎙珤⹕皏埜尜≽翹猾⢎䗄⧙旼㤂�┠匝ϣ俽甯⾘剏思獷ℜ情䅣縿㰤ؗ挀̿烃䠆忩㷏┞移“竷䎝␃濓灏䇛柤壋獿ฉ᠊父ៈ㇝䥦縪獯㬜Ḛ彝笪ᾙ䀿帣筘㜙߸㺬⤿弟砀₸䌯ۛ࿾幇玗⨞珺Ὥ睟沞ณ巗繗瑙᭯翏˳䌐ޯ㙼ᘕ@佺緡矿䏾≢ᰌ㿉绍竀ిޜ堐䟧很糐?䈞Ԙ娌羪㸼篟沏᚜冖翢潿籅䊠㰡᫨栲޵䊩䆑〗㒽ₑ玲䍭営ㆠ⺾櫘㘈羮庤у池窝向᯶㽬㶓狀⁐วᠶ↬䅮刳椂㔤≡䂬ᒈɀ࿥囒砱煍ĺ䇔܏欠嫝瀯䟸㽤紁眿嬎係㨁俇缂ӥ楀璙䨩桏₰㴒㛰㕡⠣‵Մ烰ψṯࡨ㸬硟℅㴗牐⇞␛ᰆ㾹炈ڗ涟ᘢ縑恞缳ι犟䌎᠚ⰴ䞨䄿磯湠䒣̒䡖ѿΈ๶偁⼧懁␿䈅窈ố㪢dz㯮Đ䏝璨┡扠戱䂗㹱硄ᬿḣ☨၍Ⴢȭ狨㒡㺘琏䡾嘵ܴᅗ⩔ጨぁㄲ愫ð㗒禦㺂ࢁ䇜ܽ澠橣焗毲㽁䍓焸⊡㟙獬塹هӯ䇘Ɍ唭㙣㥰Ⱜ਀↾撤䠎゚⇉礷⟐涣㤯塌ボ梎ୁ堁⬪缪簥嚫㣨旪㨱͢ɛ䃵㷶ಇ埁ⶤⰺ碕䇂ְ៷ṣ琐ᑀ⒐⏓ؔ๡䁤焳Ὅ䒩䉲π㬱䝒届ᘸĩૄұ੠磇⢈⅐䙜 犜䈬౎瞌䋤ഘ㳾⎦ࡅ⒑ᇄ䟉⳻ὂ㒬㳢┥䑀戦坤傻圮愺㪗ݢᄐ儜⤨࡟僶⎖྄㢁〙儳翔㰲䛪ᙣỂ劫⹬ᒉ㶄吥哱垘ᤸ咟ǃ竊Ꮠ尝漩摕࣏䏱౫䓱ਐႎ璀暚ʲภ羢啄䨧椀䌨癄૱К愼咍击۟斀䤣笪橅梽⌓␬㟱圤歂䱾Ḳᨚࠈ祃了瀻ᣔ搅࿏価䶤唽౦↉碊Ἰ嶣岨⿺ఢ掞㏧ሄ糥䨽䤧倬ᩴረ壬䷇㙛䍺䊫࢈ⓑ㡥䬰䒐䅵䒜ᴈ涂ᢩ7壻ⳳຍ䊚㧦ᐲ䥔ҽ䒡殛㎹Ꭵ⹘ᣪ☊ନ⢑䣧Ḱᢚ兼窊፸䎢秂湖傲䏗ම㭄ฦ匲恧ሻ䕘⢸␂傮ᙃ㄁拃഼ⶱ叧⬵摥燸灞ᥐ怢筁Ŏ磞䡘୼㜮㘥籈䱟㇋߼Ḹ卂累ᙑࣘ扇ࣧ兑䨧⏭ʈূ㦢Ⴄ暂猨ᴽ磥䋂晸㲩穥嘽㒉ㅟ䓜ᙘ耂塯珻⣼Ꭾୂ₩嵚ṥ≩ਗ䘂ᐈ㤳纩⭠┊ሧ࿼Ⱁ䏤夿㒌ㆮ䚒ᥘ倳ḵो䓆扢⋤⠱矦ᚄ኎㇪狯䙄刲઩ⅉ⣇䏄䦬㍁燥ᴽ䉴燱爉ዄ呹㙬䅑批禇憢‾㡅㥬犂ु䘎ᣨ熳䲬ࡆ┓Ꮈ䳒㖩᱄礶὇䦖❙䤴掲…㥛Ⓨ招㒙ṉᷦף牽৿䔾ᛈ䏂ᙯ䥊擥Ꮍ慪㺑⦤䉤⪒燀хỘ勼䷀啕ᔈ᧲䩒⛱ⳆʹⲐ⦙⚥ᶄ昃嚦瀺䒲䏚䳲ↂ䧢砢⧐榶䛱ᣴ紳䵫ᥕ咻ɢ䴸㗱䯦䚷ₐ榲⣠໸⮳Ⱙ㹆崳׶䯊ⴐョష牺য়䒾᭔筳獪♂攽叙ۜⓉ๋⺺汿ⓖጶ晁۳侮啋ᄺఢ㇚⾉ᛀີ޳⧆⑶ᜐ湲⢯敛焌㦾会㜉う凅窋榜☔䭘沢ᑨ徱㢴㊈乢ㄉ䂄ʽᩨᦍ▣ᇴ䅳倷⍁⃟䍩䬀Ⰺ奤伢㨻槥䪢ᓺਁ㩁単䁏᎗ယℑፆ熼ٲᄼ䘳ᆔ笳夂㍊6㊁䱂ㆹ檄未暂᦮ጳ澸姃挗䭌㓌㈡䲺⠹౅撿暁憕䖰݌皌睬 ⳓ日猧庰௡㔪䚒峤窻Ẍ䠃ά䥋䳛⌑丆ⴑ䁄↶ὕ姖䆻᫁ᣝত卫泻㎞琖Ɽࠠ⼤粝᧽䘌䱯࢒懫孂⒨挽佢⦩㏅㖶折⧮獧ᚢ⢒ᕅ筒怹₃䧮⡙㴇傭䰱偭䩅ኇᎭ挑᝖⥘玜䧦⧹Ẇシ᪖姳䚇᩼径ࡖ坛z珮ຠܶ塅㚷㣆僐Ƿᆴ咳峨歔ಣ䋳䧶⁨ལ箾⚂秪੆ฑᵓ㫰埭㡭ⅇΆⵉຄᶿ犃㥳搳፜塲珮嶻㳑㏘䤩ங㘄斾Eჾ祛榌瘕࿨刹糬㌬仦⵹䨇Ꮌ䒉禽✫朜暬Ẩᭌ�ઽ熿᧦汃垲接ᇰᗠ௜絳篨❐糄猟८‥抆㟠䅵秊╴䵏ྩཬ㢱礔熏>ⷩ∅㥪ⅼ壤寓Ṕ砓᥯⭏糞㋐⾖㧼ᨷ䡶⇇ղ∤ⶲ㦀戒是榊㐽吙᳐᷅䐂ℸ礳═尜䘫翨♐ˑ砤⼱ⶉ䤶䆌嚪䕢ៈ删繄ᬵ⿤卝ષ牷審ᐶ傿҃਒ᛐ壂瘫ぢᣀ拺丌⻏䶞瓚ᭋƀẋ৘尔樠晊ᵂ挃抒䥞⛥瘴筅熑⧐撤䯹ㄫ壁昽挗ኻ╱Ĩ漶䌰憊姒ᔿዢ毒੩Ӏᡤ䬐⪫ཅ簆…儥ֻ⒝ᅯm⏮⭋糔䩇䣩⫥ⲷ䆰媐庵ᘒ湌咓ⵎ㉡й慼าⶐ瘻ተ檃֕ៀ媔䊫枩擌䂞䪚Ⲍ⩌榷澼墐䕲ᓟᶦ⋪㩎哓磴ம䳑ⲅ欴♼楸粋ᒨ唥ᇪ削䃍填䉋䧫䅾䶋⑼ᦂ㥇☤妢灪݌㾸༭ਭ䧙⸶沱〩Ķā撏ᧀ濪偆ౣ㌛㋖】㭉奇➲禅榃猢怒夬࣎౹玚↲Ơᅴ哠噳㒺ᔸ哢枒浪ཉ泉猑䫽䶙≸٣兹䕠ȍᙜ䥪幋⦢ᝐ纀⋊䢆⩙㿛ᥰ▇ᦈᙜ崪偫筋䋃Ხ⪇ㅜ塵秸ഇ篐ヶ䃀ྸ᠀૫㹄ᠹ⫰εⰵ礇䱲Ბᖜ坜偊惒Ử䫑⫹⮓䪵⥵㥵ள◗头䂰ઢ㚁䐡堪゙⭌ݕ㳹෣࠭㖀࢖咨ת䈓孈Ӌ⫲⯒⽅⁐ʙᵺ傫喎固徊吵䇋樹櫋⪛䢭㏵⌆筊⦛榌味栗㊊廈䋃⫿⪢仵ⲵ䅴■⟆㕱咆壹Ἢ絆娴彀䎚⧲➼⫴尲墉䗉ធ吊告秏竉勢樣�⛕妵揍ⶔ☂ᘡܲ唪墷䛉̝剻⼕㈵ᛇ熿䵠㗽四⅚呲炱⻖ᒨ૔ㆴ൒慆㝶V畹埊僤溊㍬盈䳩䨤䏽ℕᎵ᾵嶞㈫ࢀࢴ⊀㯋四٧権獬吙䶵ཱུᩳ㦺旐堺䟄俌堳窼涠濝ⷑ盚䝾⥨┈榞ग़忳収曘笖歯⯹⃕嵶ῥΊ番䡀䴲涭ᘦ䇍᪯䲘уゅ弴ᮺᥩᘈ㙎妦䕋⒏擈甦ᰏ俀␭䌵䀼綁疞ᔆ媦紊柈ଢ଼ᴊϚ䤝⋦慕缁ͱḦ坊哰♠暪䧋砹᫘泃㞵໴棵浽ൡ埩壆咊媍䧙獣※ൺ䃭є籴䍯痬ᑔ値活ʈطѣᫀ叓㩅ऀŷŰṙ曊彼倓畍泑匓欠梞巭具᜴㐱偤㙧ᤒࡺ⚉Ⓟ⳶殇⺖㧙珆宽ངⵘ㞁䊶汳榌堦㮁ፒ椵㱩佗創⍿喊㘙哚䂱㦏歂ዊ䡊渀䑍㍺潠汐櫏呐⒈㵺䚤㗉⛏᪪浳㟭ŗ侷⮔č㜰䭕ǒΈ㗘㛺媭ͼཤフኲनⷳ㘖姶慺⪋⇗囄嬓⁻㛰◕⃅孬渗撥张㯁㦥䷒峤Į楅ඉ͡⋴ᦁᕜ嚊叶喻檉姌䀫宮滛㕍ᛕ໵㮔╁㞢ᙸያᝍ㋜᜙媭ࠛ⑐疵㽾֙䶒ᔙ唖楺᪍㷌ສ怡沧㥺㿔凱ݨ䖫᭟᱄洘`旜㳂⩯ⰃⓍ㻗✿䝡㻪橳喃ˤ⹩晊犪縉汌⃩濷㣲䍼畎柣幮䶳಍楚኱擤ឣ↽悕曵⥀巼䌫勮玊ㆉ仇䛮㨲浮ⴙખɩ᝿ᵜ火啎猃⇪ʹ皼岕橩㩽稶旼䎏痧摎崖稒܏⯂मभ渫㱞ᥣ…ⅶ⹙㙛崎䦐ẊᏞ皲㫙概➽䷗巷兇嵕䢀ᔎ炚ᵢ絵≧↢ㄌ᥀㡁痱⾪ñ盧儠㲛屗ᇌ朖㫭泩㮽෕ֲ佸�瑇娖捓؎ៃỸ厳檔ᕝ奋⯳ཱ㴶散囊皚ᚋ䏟漜竧柏㛝⡋㯸澏ʝ痧廝コЋ⟝㶆稪椹㖍劗囻Ẕ燃睜䢩඄ఎ啪Ẻ笻湨ᙤᤋ᫶⾚綑疏峖唚ྋ⷏ộ篃恿ℝ弗䯶佡綋瓧偃ᰡࡉௐ㲸᪁兯∝⠕෷并㷪㜿卞樛䬏῝缚ി槗⮴演㿽গ㸔䁷墾暣倽䂓ẳ㪁漓㪭娖W䴢Ή璷帲浊⅂悝Ỉٳ榠拹ሗࡑ汁緤眑堎䮒栌悜䇆箵勠悝خ៷⾋Ѓ瘳卂创㼌⯀ے宩Ā挲昕ѓ䓖␤๿噡䶚␼濌絏㯘ᫀ慽翶慸䝠䠲෨㉁璧簋Ὦ绝⤊⃼宝䚗恒佪䉖8㥡俛吻炅↷嫴ᥐ罣㩥ᡟヹ䍯ᬂ⊾翻氹埃戙ࠎⳐ楣ᡴ畻㄀䍾ೃ噣㞚Ḽ偱䆊紀ᶌ儍ጘ滱⍷ⷳ瓰㢶崧氲䒚≐ڻ⎨穃⊷⴪㤪㔱斫墌繧庁碑僆籯熏偞吧尋ࢆƽ׿桟〛㰾⢐ሓ珸え缾劯የ拄瀮箂哺㟤̸俑⣤κৈ痁㪯娳汜ⅭഔᏡ喦洸懈ሁ䞅瘆心妘剀⎐穛ྴ㇏㣦唺䑂羔˛疸燃䒧ᩔ䣿絉ോ哂籤笿癧㇛⒜⑈瀵囪ᘇ↗編ྚİ処⴮絲罓䚏盠㯁ᐯ㫲㽧㶉࿢嬑剋ゾ㳴䛵唱Ὸ焞⚧繙ᤀᏇ෤ᆑ塇⸍䏍Ơࠎῃ㮠绷ᗬ磣疟ኤ㡑廨堢䤸⇎ܮ䱘礡౭娼Ӽ掷ౌ㣁类䬾姜糺⛉ᵎ劳⸈ᙋ吶ⶅ礸㫧Ⰰち⊁ß䞹Ὗ囃ㅛ㾧᐀佄㶁筧厭ચ⦺旕ᦑ㬮渠ନ㋁卿ཀ喾升唸⪊㇅☺ᥴ眳ᚭᙐ࣪捶璺㴫⯇呖᫨桗喤䠹⟰⽭筀擥⍨ٺ㴰瓦油抗Õ⚎ᣴ秳㜄朧瓻橇䯦䀉娅熼䀿ᴿ⛳ᯞ஭୯๘哶Ꮦ亢㤹幇⠾ᗝǂ⚣⫬罚⓯ඎ䴉戦㧀้棚枎㣤挃㪊⡘湳წ也⣧↖伶ㄉ羧糍䚑ᝦ树猼珜ᚪ䑻⣈捦✆〩歇䪺ᚉႲ晁‟⨳య㇮Ⱜ玺ᕮ㟞ᇀΆ劁ş䤯ᶼ熳⻭獝㓡㎝低㖑䫻冹犒漉搀\\擬㲸佒㍃ચኰ撙䡩伉續秀晆᫔猳廯也泪玣侒㔉潇厯纗Έ⷟ᡢ暜ৣ✩疏猤ᛁ㍘⧆叉粞㦶⛣᩼毁ǯ⹚棬୯乘ᖥ稶㖱䀪䖪檼䶿�㲖ᣞ夀஽䷂㽉梆㚹庘䗨ᝨ岔碓塌沲挍幰⭙ᄏ⋭㐁娹ஆោ巘㖽梖繑挗㐙䶡㈩漶瞼Ⲉ㦫㨱樨秩㥍皅ዷ姙⫞┠♡皥㯇㻉祬归玞᥮㶡㳢玤⸶㇅杆績䆐▪ᜓ❮ã孌ଉ六䬶《㤂⻀ᇥ忭燷᫩ᣯ㱋ᳮ᳐⌗ఀ⻾㜅宋婿燓廫◂庯䷅氅⩪ଃ␔ⵡ΀ᩭ䶹时悕尴妏㼫၎ᝒ猜捱䶱㨅溷柫ᖌ䌶坈ጏ䌫珔㫖挊Ꮅຑ㏹䳧橻喕㨕✿᪊窑皦盵濗䇽⟑嬵犷ួƐ㘖⠍ 畋㊗勔ᎇ䙵㙀ਠ獅㲶棢⧙䨮徺濋ᕍ⽖勪歄⿾ヵ亶ȍ⽤疭瑮堾傭Ậ⋑煯᱕ם㪕炇୹喇䘁囀尝㲫燏䘺竷⎦宣㸆௷Ἶ㯫ᛸ⠌婲洋㿏᳐܊千ⱞ㈭緶⎐制෨㞁峀丠䶉畭ҫ䴿ⷅ呭婊殧䂩嬖曹櫊殫毮ዚ猝⬢ⷽ㧕䂀剦᎚丄嵦泆撻᪎櫿曡䣩duᖶᆎஐ桱㚷氬綫撍᳐䫰氈洣㺎婷傾㮫䷔⩥嬶沦ⶏ台㐬孢漳㵏㊱㉷殔涿悞帢熻䯌⍗拭殌濋㧙夘᛿リ淽尙峖硋ဣ痛呔卙㠓䀍宇弸皗嗿圵媆祻嗎ᷞ嬙㏖឵吽峱Ỿ᎘ḃ㛱⻼治碵癯圆㯶濂㵵橗䳼΍㖯៹壶扸崍❒仦㮛䱌⿍稀䧗ᝄ喪簻婳䁓૎粰曠氁䱡㧅均䃼㖛෭㠙岎璮ᬏሦỰ墤澓㈸থįᮟ业ಈㆠƛ䒏㯚匒氖瀗㼅愗旹㮄㷹癷孾瑝☍柚廮䐕瀓㻄濁㫼疟ⶻ皝Ϟ柋奬ᛙ໽宝潅㜶弗仸嚕看瘤亞紽<℻㻸䎝ᐋ㛑梷Ǿᎊΰ盭ᯢ湋䌍ᗕ㫣孺⶷㰝䊗㻿玎ϝ㚐㳸盾ᨍ其ਨ゙⧨㌣焯徻ᄎ⣮盦ᩡ盻⸎㿚曼㮤䶀翍䤯㚡ᾘЂ㙘㻁絛撢碘ࡶ樴ᰨ畣傯秿疓㷾皲庁挧෌⯙期ᮢὠɽ㜯ᑝᄜ⏂ྲ�䲱⏏ᳯ囮䠇ᣫ嘽氖૿䖊ᷴທ奪湧礌⽽䈑ᮦ᷼柭䎯㝗焉䖩㠆瀆撃㦏䏓㛯㭤ⲷ㬽䶯ⱛ够ⶱ䛴㱟ஃⰏ৘缂筑ᰩᅃ秶䭾䤅䶬㞎峡瑇ဿㄹ⭾ϵ㖄礨嚮䭖椹ᶱສ㭮綛稿粛⫪寅洟㽃䈗ᗿ玌各睯幆秇ᡂટὝ筭ᶔ猝䎶濿ᤃ綹໲㪖织䀎Ꮦ樏✱Ὑΰ玳ᅞ䄃揜但㾹縧屌䲟槹䟨ᱸ緝堗猎ԃ㨑倌㭥⺇炿Ნ㧡簲⽤箪䠆㠱अ稚ᤲ㥦攧ᶾ撗⨍䠞㔼纪䷯Ⓘ火渏仼㷟乇㑶ᩘ稛箬Ἤ竍溚ݛㄋ揠⹇夥歧䠍ෝ樜⟀ᴚಫ彮䣸䞐㐐⽲㲥狭桾㊚䘖✸層璫滖婜Ⓢᝀ⽗槬઼᪷ڕ姰枘廴盍壮マᎊ䯣ℐ㴅溷湽㒘㒁䍍溈῍惏⃙挅Ꮰ俰㮙摇྾䖓ᑴ儳涪痃欺㓝⬁䯭丸㲵曇₼斘◼埢涩审乷枌ᬃ䜀媷墺䑧׈㖝䗳៘嵪灝孏潘࢞⮱媖宕羧纬漢啨䟾局之総嫙䞚Ⰷ⾅㶕硻唨Α἟埆啼粰⧪䄉㿘䛅仱Ɑ灗⵼ʓ嘈㝰廰ン抯䓿✂㸔滔㳄ᷧ㴿ᗯ囹㟌ⴘ窃巏᧞唄ᯇ⾓㵨罗耎ச㧧堜潶硣粎恥႑㏳⾀㶥͗⪽凔渎箁怊焻焎Ⓛ猍ଞ瀘㦠Ԡ撡癗㧪瞯໶燓綎揞លᰆ温㯭焇஌㞜䔋⟘嚾物匎粩匒䣝੫勽欷㼽⒕䷤矶Ḋ璛䝏㣉异㷛溩ခ涗䇽緖㸃眻汽ㄋ缏Ꮩ㜎燏潷㭝扇牯㉠缀ߤɯ㦠ᘡ拸圗琂⺡ଶ洯ᤚ旛⇼玵᳞磻痶㧜ἕ尃瀒㬡缯౟果䡃箘㲲ཧ嚮摴为㢆瞳㤧㕗ᡱ倡搂㏀㲱縧炏撘Ἕ廯溩㣮羯乜ᤞ搌佺὎箛筬䒟ẑ䮦濧㬳樯䩜愕ᐚᗝᦖ犍䋅ࣞᅖ嫌ṉ妩瓯媎䏟✐俩Ở症簎叜䨀毫Ứ湕缥⇽兿䉦ⷃ澶̄粆㓚卿㹿❧㵃獯㐿䔐└矊ຜ簷䁾⋈䔞៰弴磼ᄋ慾払盺⾁㲩焇摿媘䨊䟸ṗᔡワ屷㌕刎ᵠ䀓の檾䁸ឃ⟝滿㼞积⋝甑繤➰៦炄Ḗ络ᨹ緁ῴ緽穛䝜嬝Пϑ䀋㏷匚ᅞ丟䎶噱㣮棋᳟洖␞⽮㾭玁罻糸⸜箸⦶箃瓫᩼糗⒀澺弭禃滮ᴏ洅枹湓婛抛Ꮭ䔴䐟ᮽྉ̎厇岞ᒟ⷗忌įⴏ᷿䌔氈澛Პ盷殾棍縃瞦ề祎୧応榐䠍埯弅盗單掙樂㟀䚞稈昿岞䮚熨䞯查❷糗ĝ␂᠔㽡綋睯࢜᎚熾濤耐硋崾␡包侶ỹ繧懏௜庒᧫ݑ㾃禋皱㊭㐆㟓乩夷睤㆝㶞∕⿤沿〯䩟⮜吊瞼筑竻抋憌㑛ᰅ筏㺒繻䙾冇殚⊏ཀྵ縑枿ₜ䜞實ᾥ㻳瞗望ᷝ攋柧㻂㿷砷ἳ∘寪松纂瘧䫟䄙尚俭录ṫ⯧侜䏱ਂ廰簪焂痎๋簎栟圣竇笏ゟ渙᯲笩籤粂缮疼␛ᨎ㽄㣇敟㖝寽఍澹缳㾿䔗稟䐙ᨏ⠅粧懟༏ಛ㏰潶繽笓䵞夞渚徶缑純熐䕜垒ؗ快帿䜫択ḙ᠚濴翵篗矟⶝ങ—㸬㱯炫粏擝∓俬ậ翱暯瑿ᤞ䏷ῳ羽秿彟磜〓⿐纐縔ٻᦜ⟝忬徨岥ǧ䉢㓝嫊㢌ɶ繯溟㌟煓ᚎ෪志佗繟粿禠ट旃䋐㝀㔰⨲㼔僊罥澬ØŚ䲵穻疿旿徿෾炜༘倨嗣哢ᏞĘǜ࠷䢗戆施䲕ᆌ䵡搦䧕耄⻿翗㼰繃䲞ࣰ࠶毭䞋ᤡ瘣䮩㠭䔉櫷䁢❂繩ᴟ禀૟慿圠汾Ģ棙ឰ矫৯岧㸱㙬縘א౰ჯ崠熞ĝధ〯⠄忱悪䄉㙪ʈ專ౖ擯幠䇖摽䉩㠩殈⏭忂䮟㹂͏竒皀ᑅ喠䕀猢䁚㹶ᠴ㛬恽㊌儈尬䋩⌀ᰀ㇐ǖ稣余ᢖ栳濦翋䂮糡ʎ䊤௩䛠⹀羡繼朱堭勬⧧࣒䃗Ĺͥ᧷❰᱀↠梡✢ᬚ䐑䐲㤼ࢾ₹ĵ͗4獨ᜀ⚇㙡༙ഥ倗ᐉ偘傎坈䆅̨ᇐঈი䇀紘㌢١ᐬ堼ぐ恡⃇任᱂֨ਠᡏ崙ᖡ䍡ا稨⠸塃а惃⺴ʰոࣸᘰ⪀䑎ኣ堛㨨䱢假も⃗NJ峬կペ䩐ⷠ嗡䅝朙殖Ⰰ灚ち愑Ĺ粢ᦐ௘᧼叠淡眍␥堨㨦⹰ၠჾ①䊤٬຅椋䃏ᯡ崣攦Į簹恄࢏㦚䇔˅硼䗿氨ⷠ䝞ᐜ㘥槓場俨傃䃮䇮˜夔૤჋崰乁檣墤ग簶灙ၥ䃡湡ɢ䈘ࣥ慐ⰷ⢾ℜ標㨩〶⑖ၫႰ䄾̱߲࠴ἰ⊷ੁ撠❛噑尼桂玭㜧䇻岾زঘᱨ㓀潁探̤嚖吵ᑗ宻ㅖƂ岺٫璴⍣因敶ɣ愧瘭⨸㡝⢃粝ℴ䏉ߺ୐ᐈྠ䳁撡亦Э㐴呂桫ᝋ⅐䏂ؒஔ០⣠审督判簭ਾ䗤びჄ䄱䐉碳畔ᗽ峰廡ὢᒛ⴩㠰ు䡲悿䈜䐉˒൐ᅈ㥀潾棢⊦猬㘠ᯡ⡳眬ȍʩۆఔᒐ㛰䦁㼢䊧Ḗ㈺ⱆ瑘僝∔䉷㧎ʮ䃸ΐ㯶洌࠱ሮ瘿䒪+炂झ䎖٢ಣ懗䵰突ൣㄤ䜭瘱᱖ᠹ惥慄涷ٺ偊敀Ⓑ㈞婣ڧ‐戾у䡾⾙缅綆ٷ焘ᛠㄐ啁㗣ಘҰ䀁䑇息睷↟巋ᯒࢵ檘†榆䟔猧ὒ␳緸ᢌ₻溆ʸ稏猛暖䞐渾屢㚛焩倍ⱅ⢍カ愲ˏטଢᵰ㴨妡࣡ᅒ崮愲叡᡽ޘᇯ͍Ձผᦘ㺀嬡㱃唥⢩砸榼枲粁慳䉀筕瘯杘㒰䌁絝唥ᔓᠾ槡y┴滕䦚׺噉暠⋐綡敢⑥⌖ℾ硂䑣℁ህᲠ䙪ྲ᝔ೠ䬄䱢ḑ咮ḹ籍࿗烕曗ඁЦೲᣄ⵨栱ߢ䖧梩癍㱌摬ࢤ་ᵋ҈โኸ⩨失ᑃ㉦搮失䉃摶࣫惼ᨀω࠱搄Ⱐᾱⵂ䇙㼪〶扔ෙ₤䋞⊉⢺猀ᴴ⡈俖团縧粮␴打䡹烠Ŏ⊄䠞ಌ᣸ந䒁㩣湥冓渿⏠硪ཧ纾䋋ٙત᭘ⵐ笱ۣ䕧㊕ᔺ㿹ゝ炲兛糉Ԭ༅梈⁀䡱䛜娤昮攰㉃䑿⣥ᄡϣՆ瑠၄㗐穱ッᄤ䤬䔱䱚夻⣚摥⏱⯛㐂᪺䞯₱穣᭥暩椾ਫ਼呲梮ᇾ泘䠍༊ႈ᳨缞ḑ䘧䬨ᄼ⏨䑤䣇ᇰ䏄䒭ಊႍ姐山㯃恘䅐ี⁑爴㸼ᚨ㔰㥝༔᭴㛿ᶁ᭢ዡƪ⋉Ҥ⧃禕₻瘒ᮡ຺Ꮤ⪰㵰撃忣窭琈䉙撄᎒ᅺ䴱䗠˦ṏ䞋ّ⒃剀冫橬♎ޢ憁ሴ扩䠖໓殄㷟㨞䰢㖧熯⺈♈❍ᤆㆄ᤹䗳๼⡌⑂ܜ⛔ᙥ癡ସ㐬ⱡ棵㹧⋁䟮೔䭬㑸緀睽伙▫䩪噆䲆ᣰ↴䅖Щశᯌ▸嫮㚂洤檩丹ٍ璟僑碦拀戋࠶᭬⣸监冉Ϛ᦭䬺⿾Ⱶ多愴喩䑛෮ഓᚸ咰綃棦έ˅⩁撓梨㇌⎮䜯㈖᦬⡘忑⒂৤ί䜾严䪤ࢼ岢捄Ⰴଲᒸ㪐䬱湣୦掭姈ํᲂ㢲ㇹ掽䒳༡δᖊⵑᬂ⫋䎬ᐾق沔㢥ㄭ⌃䕃ࢎṼㆯ㐠㣽奂֨塮⊡䲍ᣁ爎⡟ڥౚე≈熑㈡Ϥἆ昮犹ⵜ磕Ѥ⡳䕃౷䙸Ƞᥜ垃໤䩧✭➷ᱸᤄ慱挫䓯आ杜⾘䒨Ђ㷦㞩弾幄䱭䀻璶唋䚃ઞṭᖇࡑ㭃扤宨ᜰ忽屩棅㆏掿䘎ₓ⭬㸘䰑ࠃ䓁䋔悪繉౷㱵Ӑኑ䑿珦ᬔ㢈痑″灅ῶߣ湁ɮӈঢᗳ䗃่於㳐ຑ߂檛妨ℹቍɡ᣷ᅤ捳䗠ǩ抋咤匩⬃爈瞨䬷╶䱶熗ㆣ⍾֛຦ቼ㌸漩〲≆☀⌹䙒未pृ拄⓸Ʊ᨜㓭⡑⨳曥羯Ḿ䅛沐䓄ㇲ፠✊㐆Ⴢ⾒ᐩ権嘐䉄⥧ᅉ౩䔉ࢆቭ؂୔Ნ㽘䡞㐂㇤⾮瓫♊扭䒾焾፝砯冨ⶥҝᾩ㑉䡄㦭₷⩀ʌ磕ڡቕ煐㊩᭘ఊ㿶仌⬛ɮ傲穌ኀ䓥ㄲ悲❏堚漲⻃㐨甁榘㎪⟃ࡿቡ㸩焣≚ڱுᎴ㴝३ʲ愹橪០墻䀴㹙㳍Ꮂ◈䪑“㵄䞑梁浄咅㒱ᆷ䤴椞ᅛ≺⒗℉᤼㗘玩炳⹇䐦ಷ㞡㉴ᐿℍᎤ䣌优䟢㋄坑終ᡄ▧ⲹ悦奞擾ыቆ◌䡹ᥒ㠘坩ള啇庫沾㥐牲擓䑆⡩䙋慡䱠ર㉠䷣拤溫ၬ祅㎻撯䥿ፖ⚓ශᷬ㺤探㾳⽆¤ʶ᱃嚾♨⥞အ♲ԙᬪ⊍ഘ㾲ⲛ关☏穋てᔔṸ匰⬣๱Ḝ⽘猱⮲奤湭油弯અ瀢⥡⌞ࣲ䳥ɷ宐忩⇉㚢㰂㸨泻␫畎৐㕹└僙ू䘐✀俵敆熩傶䥓≰䓒�ᦤ³அᡊ㵘ド湲೅敩ᎆ氱⪇ᒱ⧄̞➆ڔರỰ౰͉簦番㨢♐橧喀⧁ፍ䕪䣩ᵪ⵴廉獲㞢ⵯ䊰界橡唇⤮⢾◊䮅ᵏ䘐К夲䲧祫㘧畀堨͝ং剰⑪䧕ᥪ⭤䳉想⌛絯ڻ੓柌哌Ċ匳▦佌҂㯴窉ղ㔦㈪Ⴚᥘ冺㔙⤢别╴ࣙኜ㪄睩孳㵇捩窾ⵗႄᅷ⦙劻♴ைᛸ冴攖塹ᮣ䱪ڶ啓ચҚᡦᴌ♆࢑ᙪ⮰涉壳勇架皼ᵏ婳䝮ȓ厛⒔⇵ᛊ㡠㠪㔔ᛇ൬堷祓㪂启⥦勂焿൱ᕒ㵤䕉ひ㕄縷溱䀫㩱璷⥔ⶏ⟾䧽ᜲ㝔䥑䱲䋅㥮ܲⵛ婷甐ၵ匼╮仙ᖚ㜄緉瓳῅ᕮ纺啂ڞᔟ楥⇱◚俵ሜ぀槉摒⿦ì亹䩇硬瓛⤭右♚与ែ㧖ᨹ欃၇彫刋◼ἡ゘竈㌧⠂䵱൦☠ⴹ䱒ᥦ璭අ䛮㊉㓪᦬㌠䃱䡙ቦ㺬浉幓细棬↾䵌⩎倷㇜刨⨜䲳ៈ।瑺ቲᏅ壬笷ⵐʔə᧋尴擡䥆὆㾐㢹ឲ㹂ʠ㺻嵀㪚㓥㱆㍿╺亭᛼⟄䚹灒䚇ア妹畍ⱼ⢤⧮㊋ʹ䮝ᗺ⎔帉䏲٠④冾䵀窖ͣ⁡㍸柭਺ᮦ㻔崉㽓矆˭㔹祹穠ⴐ妌紬撆䱵ᛢ⓴掉൳ḓ㋪㜱ыڛ೬㙣泘摆䫫᳢㕔䕹糓拉ᆰ⚽៾ٯ瓨ᄭ㍕❊乖ᘜ㓸埁櫲ោ热Ƶ╟ٹ㒰榍㏀曖䨻ᩏ䧌笉୓ࣇⅮ⊲䍇ᚔ泊㳓㊨晉䷛♯富倹汒穤捓憷୑㚉ẅ娓㊿◊䪥ἒ⺌礹归淅狮㊳敇牽戺套㊌曄䦭ῶ⹔廹燒ᝂừඹ䭎䩬)ᩪҊ撩倃ᰶ␌唹㹓䲄๬䚲ॖ晬攛ᤱኇਣ䭱ฮ▬燹⯓泅Ǩ䎵᭄䲁೤姈掫ⓕ䩣ቬ㜼叹吃叆廭亰䝐乡嬨姈珑柚乇ᆶ㟴䣹䷠岛ࡨᎶ䝑噴ಶ㥄犋⒡䧹᜖㊼䝙暓婠ᄩ㘺歃䪛ⲯ破㍮撜仓ზ⧬䇹㏓庄秭疽孌㗜ᴎᥒ玱◫䷇‒㦌疹೓ᣄ㇫檢݇䙲ᳱᨃ捯▻ཝṪ⿌罙ઓ岅෯᮳⍉㲒ⳁᦸ冭摑⃃ᦪ⹼弉瞓䬆⋪伽ଡ଼于泡㤿向┋䰳ᬦ㚴䇙੓秆㷭ᮿཙ溓೫㤴ᐊ硧೙ᰦ㌔緙儓岅Ꮺㆲ㝛皞㴄㥾獎枧䷅ᒺ㭔囱⊭洇䯬抩⽃⡊泿੟抚曻䭷᧦Ⅷ⃹䩒ง࣫㮽ཞ并㓦祸珱⯚䨏ᵾ㸃Ղ剓ಚߨ䚵㝃㚑ⳕᥑ㈼斗䱃ᙞ㝬䤙摒㐅ኮ皼❞⺅೽禥㉯ԧ䠱Ệ⍼伙㓒擥䗯箰杛湣ഄ禬㵭敛䡏ᎄ⓸就㏳ᨅ㛨熶⭓庛泓㧯珷敟乧ᰔⱜ䚉榜௅坫澴杇婽健楊狻斟俾梓作佪〫⯆᱓瞾᭕Ŭ˕榬珫✻䯧ᷔ㠔湹璓砄忬疶罚湧粲娉᷹㧸癠垶㼢笙挓⊇N熶ᔣ籴䴑禱⶞◊侀妊厢尥ⴒ眄盭䖲Ï䅦瀡׿㏤ᒊdzᆶガ玉Ⲣ缄࣯㪰僜䉸瓢ሏ獻攨⾏Ḟ⷗〙礪᷅㈭殰ブ傞ᆉ㥓㊵曈ⵗᗎ⋔䮉䐓婥斮伲煇繨ʻն௞旘ⱐ坶‼䏉橴⣇䜫ᦳፖ奎哟ՠ匣晘ⸯᎾ㑢眹ٴⓥ䉎᡺ࣕ੷哒禚犵族䯿ᎁ㵂綥䨂ᄴ俪⾶㽄癥䊯䥹ૃ摋䩥ᵞ⁔眙羒愵ᑋ垿烎ખ⊪䥀卅⠄⽋ᵱ⥂容櫓洴ɉ禿⭍⪚ᝩו૽މ䪶䔮╄楙㺒∷៭羰ᣇ⚗泹䔦㌃架䧈庆㐼籥ㆫᵇ㑈ⁱ䧣珝̖⨑୪ᔝ䨥ᝁ㷴䫥₪ㄶ么瑸დ纉ⳤոᱎ᠊䡘冡⎜履⮫㠷ۨ呿盱ჄʴԷም▜ⴽᬤ㻤暥䷓吶䚑㬉ၜ⺟抳繫勏攫䴘匩㢜晥縪猵َ≱჎ㆃ⌑⧯㌌暿䮈忖㳂䜥䱫ܷ光䡸壅ᆈ⳻֪୶ᝄӄ弁⬲咉ᱫㄅ煉㡽捎䥷䌕稌䭬ម⤠徺㦴抙狳粷䉈笴烖㊋ኧ姸劸ᘪⲴ冶㊲穥↪犵㟮屶Ӏ⾯ᢻ樑㌯⒴⺘壉㋂焙䱳玅ُ橱䍁䦔᳆▄狂ᝬ⤠咉㟜猉羒⢄㋫મⰺ嫐⣁䖮䬀͚⪏ẉ咴檹兪焇煋榼┣榚糗╡䬭旡䬇቎㈜碅⵳ᆷՏ炻瑏榘匟㥭㍥柙乬儹㋠ᓙᒫⰄ兎䦷㭉㸴糂◃ଇ杵ৗᗑ㜂以Ĭ༵䣨扵ᚰ煮㋺敵௳⟂炴⢈۠㬨ᱲ㍥繩㙾尭奧㌅▫牣杤⼌咈⿒妦瘒㶷ઑ䔯泝熈彁╣ીᔪ⥔幑㞼皙⦪Է慊⹸㣑㥬勅䖙㏁ᗿ战忙℈≅㣪孆䅨婱峔๡猏䗚琓⓾⺛柱㸲姥糪㶫䗯ⱲⳃṶ䊻䕔ੁᒜྜ喑⣜濥窪棄⣯⌄ⳋ䆙ᬢ昝੶晨⹼姑⠒硅怣羴惈䅱᳖֌䌓־㐝t⹭ᶁ㣬垹Ⲫᬵ䭌ⅺ哜ચ匝奆㋕᛺Ⳃ塥⥲洅榝䜆㡀⹼ˉ䕠狿╌䬔ᜒⶂ從珥⠪汶敏禶佭վ糙◙䭝ᓈ䳀帙╲両毳а勩ॱዓ䦐䪬ᘄ䪿ᖶ䪼廹ⳣᕅ⋳ж毭๽᳇▝ጂᕴଧᙾ〔墅㭪猹穫家筊ᥳ㋃䥸㋺⦳䇫̈ስ摲㍡⏙米⹶䨄ɺ時䆜粿▱௷ᙹ⳥ᰅ㷪䀥Ὂ湶Ὁ硰⍏憛䋁䗑ஔ埑⤪廎㋪牵孋伶㋊㥷峝䪜劺☗䪵ᖾ⺈化⋪劅㒒缷ો幾ⵍ㹣ફ䠩犯ᚫ璊弥⒪沵ᴢΆ翨ॿ㽕湭૬ԭ⪚啂⡂厥ㅊ䵅䭒庄䳌繼湆▙䫰唵⨵撹䫪埵▇⋵峊⤵⁌刪Ქ䕧拭喲⮴撢⡿ᇥ㗂糵倪ᝂ益䩳嫞∦ⲻכ狱ᔴ⹥႞㓪䳵⏊䎶ⵌ殿㫚乲ⴅ啗⩏术俭ẕ⧊姵◨佶䅍䵾䫄疟櫅撖⬒枽⮰堁㗒䎵厓䥴ᇎ奺䫏ᆋ櫋整咁ㅹ「帖㤺綵咋畵䇩ばᓃ熃ʲ嗶厑᜽⬂埑ㆪ椥ோ䵷槉᱿啅ඎ᫄嘎卹垮⣆匮㳲峵᪊吆㧎斅棙Ⅻ᪢㕓䬒呼䘗ᡵ㳔仙ႋݵ勈瞿曘䆄嫷᤬橵圾丿ṅご秥䕊⮅凈♹拉Ǝ嫃妧૕啖⥆ẫ异㍹殴⎵⷏歵⥃අ䫫㖿ਆែ唘䜭㬺淵ᩫ䥶Ị䵴⭘ᖚᬒ啪氂嚛⸚垭⿢丙泪曅ᇎ䝽曌榄挐㗡欉杚ݿᤊ《禉瀫㩚彊ᛣ⭓ᶟ䫷秠䯄嚣⦚吽⣺狕株⏆態♹⫂嶌˹斿㏑⛓俧ᎍ㳚獉圝樶Ẩᵰເ涕᫒畕櫻嗋⸛ᖹ⍪䯥婪⏙矬ᆸ差ᵤ拕斩欛均⥆ᕝ㣢築䗼ᦄ刨ᨡୈ㆚窺㦒毛呛ⵎ徑⒒䈙䎫寷勫Ż䋊庉崐ᗵ⮗啥䰮埭㺚烥橊炴ⷈ彴Ὀ▝瓡㗆獉ᖟ⺾嫙㡢崕䐊᪵叵罻均絸嬑旮⭑⌟ⱔ循㐦渕搒㷶᷉ᵹ䕔΁拴ര᩹☴⻢姅㜨⩕ಫ䍶炋๴╉♷Ⳳ斆⩫呟⨡孥✪娭枫捶梌惾仃煷洍喓䯑⚪䰖咞㝂刭Њ琷䗪綳⫅䍧܆ඩ厴啕Ⱅṃ㗊䔭֋㨶Ὴ䁺ወ⍸䛦旂᭙枅䮁囃ⵢ偅燲巵濍烵⇟䎑˭ബ殬㑚ⱟԹ̒⯅猻纳ὀ⃳懟㵡䛽䕺㌃ጦ⻑娹೦䅵ᶋ㰵忍侶佝㚙܇嗒ᬎᘸ梳ᐃ╔攙漺畴◉捵曍䍥撘ർᨼᒪ⨩她㈲禕㨻䭷獪罱䭋氾糼䷲ᬢ㟿Ⱑ刳⦸椀濒廡埌ٲ㑲ր烞⥐⪽᝴濖巒㇦喅ᇪൕࠧⅾ槏摱᫆姗㍜坼᜷᯳⧆䘅ᚺ楗慊೴˃煰朚疊⪊㐣௉卽ㅦ嶭撺䕖ᗏ䣻⫊⎔ᬜ嗪⪆㐺⺶忙㣲狭磪๗ઊ㣾⻄涟ભ䵙割ᖪ䆡卩㜆匭䀋⬇㙍偶㧔፦⚷痩>㖉⼶廕㠪哕⼻炶旌⓳䣅㎞䛳䷍᪬㟋ⲝᗓ㩿ⲙᒫႄ捋㇇彑஛ⳮඞᩍ禞⹎劳㘆摍缒ጇ㽭nj磕஁ᛝ☁䯴㓲ⲣၶ⤆稅ᚫ䡕Ꮜ冸⅊ᖍᓆⵤ樧周梎塪㷚皭പ䗷旍⳷ᇚ䎟⫁畆᭙㔥฾圵㡶埕䁺動䏈ᓽ䗀⮐⛗䷒婗喝ⴙ唡㉚䤕糳勗㏈⁣⭗浦ᛧ䄡ᨵ㞢歹呋⠌爕䮺禆㖌䫳筅ᦉᬖ⨖媾㟠⣌宫Ⲇ桙❺䩗׬智减煦ಭඞ宜㒗ⳁ៫⾚獭ࡻ滖介歹᧙⎙嬎祇䬯ᛠ棏Ⴛ㜒䵍勊哷榌㽿哅ᮀ冂⸘刿ᗣ␙垶㊌恕ɺ�斏狺㗐⭩⛛ⴹ䬧噭仚刕⼆䳍咪ὄኌ᫸员殅㚳䶆媋㓸⤙嵽Ⳃ狹沺ᒆ扊⍽╸㍽ᛞ෪嫑喂偨循䨦䊎ⷋᓗ煨ͱⷌ᭨暨浈Ⱁ㗎潡嫛⬊嘵ൠ敕滉惹᷌喈服洫⫪㜋䢁圻⨢棵᛻矔㥎㫾ⳗ禒ଙ䈂状埊渢喁⍌夙Ē䌷美˱淞撔檳ⵝ寋㓮樣嫍㰌琽උ௔ᾍ櫰姎冄檰ᵍ珠瞦渍卛㌴堍䇻ᒆ羏ὲ燏㺚ᝂḋ嬔㑡橵垫㘚椽ᐊ湗彁⑻㷓畡ʺ祍檈㔳䮵嚻㊺獅弋曖ᤌ嫽竐䍳༁祘牏斯⮽慝㺼梽☋Ე秈❵䏊䞈竼㦂㬸ᮅⲳ嫋㔯⬕琊答宏Ÿ㧄୳⋎ᷜ櫗㒞浢岉㚮緅੒拀疏瓱৔፡圀渉狠瞖泣大Ⅾ喽㥻ܷ崏⧼Ꮟ憇䛄᷒㎜ឃ⩂忇㬲䴕;犖⎎╼经ݴ⼚ᖙ⯅硥」ᤛ㠪扽嬲㳖㯍۾⏅枅໨洺媂啷⸶啋㽎焙椫✆䬉㻺⋎╸೎稅㮕暵氝嗞╊弙翻⢔ᴏ磵䗙枆皨嶷嫢㕕混ዷⶊ䤕僓忷Ӌự䷚㭢企巿㎦癎涁勛㚴悭ᥛ燶柎痲㏟஀䛝洫㩤㓬浫儋⌄⻽૛浴礭枿嗘坬㜝工㬷㚩⩭彾⩦勽ペ㨴猉痽㓌䦘⚫磽勰咛⧢倫㿮灥䃛徔愋ᇸ䇂䞊⚾巩⭃枅Ⱀ弫⭶瀵曻㾖槏䓸秈ྜྷ䜌巀競眪栽塷⩖䤍੫⩴彉姾篘ͨଃ⧨竡㒣殕号㊲句旊唕幌Ỵ䕟ղ泓妃㯘皆渃徕㶜囙ዚ滴ṃ澶ᔮ涁滐㗋㮿ᦉ䠷坷➾伡滳泔漉૸្䎑亱㸞珹㜋䳥ၝ⍌吹墺㒴㘉ჶ孓୳亭浳婏㟃榥৪⮺滙涛㥲垰渨䠴䛄倧㑶笀û楄枏⹾乍㿫䵸Ḋ㯹〥澚ᙯ㷖箒刎�ⶰᱞ௝慅斢汥៬࿐Я弛帟款痃溼⸿⡞䢝囍Ȗ␉⟹᳢ὼH緤Ĕʨ勯县⽞毝䕺ਖ冃⟽俜ἱ㼔ⴅ笫琧桏凵䱞䶝滍㈗ẍ㫾矑έ㼌ㇵ簋瞟ž┽ᖗᤪ仪㭤笫ะῆ砮弆秾䫒疕涓嬷䒞樾㿝櫠㟅ะ忐㽷▞絪㵚寯洂᱿⫖叽琅尖㠉器㿘柘儵続冶ㄗᄌ䗟㴞䞀䮨堗㦈ո⻈ᖔ绣㴪箕૿泟嶸ᬞ爝倛砗䀈䫽㬿徚Z僬㩇杙䛿删生஝᝺濕缨翼�ᔺ嚳⺰ڰ༠Ⲡ㤕俅㨝⠱屐娊᧼េĈ纼υ㶽碀ᷠ㟿㒞曚⫝̸䄷㠊偖⥄ឃኧ嵏᯻瘰ᵣ杠撡䨣琛氯堍࿿弥橶Ȟ綜٩瓠ᶝ咥㸡庈渚䈮㩋䳎㿊⃯ǴỴޞ瞏淋暧⪞灝咚ᔔဏ῱毠泒䇆䧹ᇗ琬厷捠紞冣㓚倔璌旾傆㾞缉抦ڇċ痰㪀懡憍㺱䨮ᖆई᷽惾穜Β㮇甤㜐ゕދ⁣竬港倊䆸ࣉ℘⇮⧢ظ຺⪀㛿㸖嶣梦⾠䨈ⓢ䢍R⌌᰻樽瘹⇨㍠⾊夭໚ܗ侏㿴溦校∈ⴙَ构ᣈ㤔ུ஦宵ᵸ漣呑戡僧偆䏄箮㒈ᦀ㹰櫾垀皦䃰㹱涂梟儎ち䏗ᔸ却ᮈ㔗䏪孙綕匬ؽ䱛炅㞟䇋㪫ߦཌḆ䇐烻㋣⦧⴬ؼ⡐⟙⹈憺Ƨࠈ່ᥳᬟ㓁䄣㺦术䘹桒ᢇョ哺㫹ᅮ࿴῔䯈ችᄝ抭漭娼籔ᝢ㽷勋䏶ۿ盼ᣒ䴐怱矣⪦ܯ䘺䉕簠嗔灑慆䔬⭂᫉◰皶䷣㖧厩ᄾ䝤ᛊᙎᆴ⎱കᮻ㛮䕉僁恵⻺┯䜊ᯱ᫬䣸卝㜔䙚㡌┐๟㬀愎噦Ⴋ測屛凔ࣶᇻϱ煙ໝ╬娇䡱柴ᙧ㰠漥∌ᥕ砯懓媼䟅༠䙫௟㲾潣沐મ⊒歯䒙昦冹⏝౅๠͒ສ娄沴൧◄嘿׽䒐⤄凃␆䟾僺ᵣ溈犢⁨ጅ書崽⸱䒝ᮋẩ嶳㷽ྊ᳍栈瞢⥩〡爉瓉ㇱ⾸ᤈㆫ␑答཮ᒬ㥘ૌ呸磦㲶֫ⵋ撬ė̃┎ኇƗ椰㥷⏊䃙哦㦮⿩ソ䲝ᤛӪ⃆䡌⒳ೌ㴸禡剣広ᣦ欻ࢴ䙖壴Ҿ¸ᅑⅳ採ቬ⏑徜撡嶬唹瑐沏ᩀ壞捽䝥烖Ḍ㷠Ꮡ䄃冘偄┤炻篐Ⲃ燚掩ߤ།◆᫘檑侉लϦ䞭糄滟▆㢣掭䣷෠᭴姘猸簡‛䯦伸癥ŗ͈〾揩¿྾ᬰ㦘書浑㟦㮭强䂲㊪夎礋揢ų旕毷怍㬁䵃㊦垭ᆨœ湎ӴӢO䚰䴮᧐㩿㒑浑ᑇ穆ㆪ⅕Ŋع㣮嚢搐䱠˱冀瞶䰝㹦偯䄺繙䙘䔂㇃哔挈俐䭬㴠೴樾㺻猬Ⰲᙚ催䕓傖ᐏ䛨埩⧂㦂◡嬳册幆䒻煞ኝ壬燞籏䟧఩᫋姵㯰ⵑՆ㮬ᒿ㙑̼浝ᣀ፨扃̆۲ㇶ㢴兣綛ၯ㴽剘沏⓶䦤㑟᳓຃࿲㎈۩猳ᨢϙɍ♒犑ⓡㆪ㨎♀↘䤒㔢⤁朳䴤⋤⸻Ŕ㗘價䨜Ͷ䙐亃ಘ㻌㥸纣㺰⮭倥៥␭≏偩⑦䈍䘱᫼㊴捰ঀ䮨㺢㊾教璐板䆡⍑⚱䟀ժぴ捉巑孆㚲犹啞䪈唝⨖म✬仞᥌෍㦑檳歆ݡ㪽㸡⒙罵ᇨ吅⟰䳡Ḍ㿴揰⃳᭫煯沾䵑澴⅕曄卜ᏽǬ橠ᡌ⟡ぱ勇㊖嘸啙᪞Ớ榾燻⚝壎Ấ乭ᶱ害ⷦᝮẤ祜㯔↙榤⒗⚗൓ፒޔ悤攬濨⾭䇷㘤Ҋ╥঴㶈➃๹ᣎᘔ翱佘ⴃ惯塬ᩝູӴ刜瘄੦䱥᳂㺄稩炳ኃヮ玏ጹ䊁ഋ䆰嚅䝸丑ᦜ㋤瞩琣㢦⮶專幞⋐甉᧖ጲ⚘俳ᬛ哬㢃ैᬡ揗㇎潋祽䴊৐⏱☴堝榆㿱䶹檕㼪峬䖼⻵䚎ㄓ㪪糾⮉╫Ὶ㑼ⱊ繉և徆ㅨ⭜暗㣧ᦼᗻ䞖位泔ゔ抂ࡥ沋㫯歋硺岈䶘燙捫䞮ഐ⾤喌炑廓ҧ哭Ҽ㾮ᝁ洄燅ෲ籝与ᦧ叕〩牽羇૯侨䍼˙壷姓嗅牧埋ᨦ丒㛹緹羓౐⛂㭗࿞壦燃㎩枃佒泥Ҽ矂淍ቺ⋆垕㍚๪ᥫᚬ攱«伫᥎㯬羱䓳ഇ磖窌坝暛᳹㜎⥭晅亮澦判筹糉漆㗭⢿獟⺛๷㦬Ý⭞㝃⼎㭗⏩䩍籲搥᯳晔㯉⳪۹珳晵瓏Ḓ㑭㱹疓û淯⮹❕⚃磭ᧁ獱嫗䴓᢮㯜綹兕ղј㌺䅶糊ஆⲻ珡枼ᑒ檠嶜桎ঃⲚ濬ժ㽓᧎㳾滌⧞⠛䷃Ể㜌痚欓ⶺ෴㞿䗱㤣哳䦮ⴢᴶ佟᬴嬜砪尫ρ⋖ၸᥔ犑㭼হ珔匐』ᶠ㢜痹暹羓ю㜎䃹ẖ繹㧄ⴷ杫亂䊋ὢ砥味䎆恌᮸晼憍㴍ؖ娔᝕俠൏䔻圙浭Ú⇶梊怨ᆊ⤒פ攬宱周小䕂籚癕Ķ੏Ւ᛾敕⳼✀䲘柄⸻⽕徺㕹埍洶៣熾煱磓⌞曱㺦ᘷ䴫氾㻢硶憫塺ᝀ㖾䓽⪟ᓫ⨂叶殅伇⯪㚴烉枫崶㲔殏暶熏拽⧌匭⠏䳷⴩㭴痉䑫儺ᝀ缺棓粈䌈䇡Ᏽ㫚垶䥩㤢瘑䰠柧᫯羸佷烐匊☜振⛾圻᧢割泹癕耆㵗↸⃛窛瓫ؑ區晈圪檉ㄬ慙磭梆㍖׎フ冟匉秠䮌箢⾶䨹㱼洙乫শ嗮⾹僙䔭⓬廕Ꮕ᜷䲧ᢅ妪㦅攫Ľ㉭玻ᣞ敛㣶䗽㍖᠅皠孁㴲珹乫இߔ䳬ᓒ㷈筵◵珧᛽璮ᠶ㛧〥曀些ʕ橼睙暜ᾚ偘獡☦㘫ᠿ埘 䣫ὦ愕䖻糗኉⋮૏㳙䌄䳬渹㩻㤵䫫嬶汍乽κ䖇ጐ旞䭟晟䰠從㧡䊹䈵営⿯嚋斴▘⇔昜⯋瘆⹟ᡅ㾢稦测穬Ⓧ嫏⋗⺞挅ೊ⮿枌痴⨅㰋㸅殳碚ɖṻ㋓ᇄ彻◷䯢寊⵺澁崢愶繉Ⓑ玖ㅡⓔ禒⫺刃玸叒⸆淅᠘春䘝分໗☔პ喏㾇ᗬ⯸笛便ᡢり晅䞫㛆ࡏ浿磘疍૩旛ஶ囀᝚弩㉴槥娾曆⻏扼⻼沆⾘㧓⯊䙾ⶊ嵽噜漮晉㛦㽎梍‽焥朲⬘㕩噸箢壒㻲皖糉瓷梚䖾⣗䶓䭂皿㌬៖⻮Ზ㸺碑窓⹶ᭌ百孒溔嫿秩፼糔ⷳṆ㋲羉䗋䝒㾇孾⁕纐⥫㗶Օ㌶⹸嶡㏒獕穓⹷秆㙻䫞ᶓ夀嗱殡来筌嫍㰬獵甋㐶Ꮜ掎筑ᶑ㮒ᖹ㷈囷⸓ᣥ㏺猴癋嵷ᣂ煸᫛亘欓䗌玽嘭侖嬏ᔡ㜕伋篷㽡⾹師ᄮ童纵ओ查⸴潕㕊礙尓濶⪖㊍䏾΁ጋ㦰ᨣᛧ⻡壎㒚瀭䘽痷ᇎ㝾᛾⺋䋮◦珷埴⽫琍㱂纆梫᥶䏎❽᳓涑㥹ท氈哨洔櫣゚狥杙⑺䢎♿ᇑ疒䜐ૼᮌ㚈澑嶹㙫₥琻♶翌罼㻓ಃ㬅嗴ൢ㟘⵰思㌦渕嚫㟶滏ṹ囙疜婲䶼䯗嚆㚶嵍叆祭䛋瑖檍狫槓䦉嬔✔୚➷⻠婡㙆浙栃౗泄⳼䓓仜嵳䶡ᬫᚌ浌姓㿆砭䒻㏷磅峻⭐உ̂眏⮑្䳫欫〲盭笃筗኏煪䗚疋㌂ⷀ欦嚸⹑幽㳦瞥爻Ṧ嘭ƹỜ經ዴ曮ଷ址漵寁㞦濹棞ζ䲏儬筜㶖峨ටᯈச凪妋㌦漥惫歶ඌ޽Ồ綜㌕嘉䯴᜵⻲䧋㋻⢔絻ᑗᶔૺ㗟ஔ㛥旫歺朷㚔孍㋖晍䯓ಶ嚵惨㓓᎔὏☈䵁嘰润媻㵨搥䜻绖ヴ捸໙㮆ۺ淍஋㚜汦嵳㧦磖任᱗箏呿䓴ᎋ囼丕孄᝖渌⬛㰖棥䞀㥖㍗勹營㮄囯෧寵圂泝岕崮羭秽塖籏楼ᇖⶃ໿渔䯪✅䵒仃㯖挽渫䰻炏䛻䃲➇ᛸ⧮浈栒湕尓㗾⌦俭ᵋ▎㺌㏗䇃奺Ḝᮩᜒ⼞孵㊖沉型姖ए☑櫖⮔⿞嗄Ẽᘵ➻㊷お㶭彻狕㌌㕫殄垊呄⍋त禉᝞ׄ劺栯٦䶖ᣠ痹ẻ䮐೹Ộ㭧杕尋夅⢎樾㩚⮗ড㗸槼ⶁㄡẍᩞ䴞玉喧㚦稍滒ྗ㊊䭴☨卻悴冸䘤䙣浀㟺垶泽矛碗ԩ䲢撇大惜㶶ᩥ՘檕㕈⹆幽慻ᒱ⨏ᆋ偋侟癴吮Ṹţ溎ᇀ䱌慃ぃ幧㔎竾某स弇綇ᮯላ汷塛☮䜘縖眗寤ⱑ䷟➜嚷㷶嬾尧溇⒜䰳᨝⁋⣐㴑䟺翆⊁↬㶫㭐捧汇尦ᓞ缙⎺殗価೰坠㞓㼂ᬵᯑ矚㌹僿㯪椊ማޖᣣධ矡㾓嗓䵧㭝眉渹娭ⅲ༝榊Ⱇᰎ䩂֊粌䔯⨘獼刟熟娺㾞盝僛㈡耏牬�䊳缘ε厮ሟ沖ҁ䯂Ή䂱㠮婒㜆൙ὼ漉֠恈ะᾶ́䎡洣漤瑁剁㽅ₘ䄓嵛勲ߘ࿰ᾛ嘏㤞沠ㄧ⨯н範傟Đ䇠ᄲ߲唈䜝沀痡栣姻֖䂂㡛㓫䑸∉缌䠠I㉱⑝恩宺朮湤᳠⇃惨㧌䕁矲᐀崉嚠㑙⎪囷ᩉܝ糘ã∯枥◁攝狘㛠ᨿ呚㯐ֆ⳰ᕳݦ癷挈㱈๷ᤩ↧䊡䘿ᷠ墝ㄉ૝䎺岛煌͠䉃㗐⍰⁧䜯ⳙ瑘㕆焎性䐈с໬ᶰ⎨穠⍰ೀ砡ⷍ᤮⒚䤌䆈GݽȔ᷋抨眠ك朘ಯဋ扛屢⤌綖⒉惤ãྠṷ൱璩埀Ჯᥢ≚ᢝ༡刈䴺䜣瓝䩦儿⏱窫ࡔ暮⸾ರᒔ⤂ൟ⏎䰀ెἐ⃌ࣦ㝐Ϯ仍㌾ʀ梮ⷐ㈘␇ޙ༟ǔ㯭ӑ絤˧᫩㬿晟ĥԦ⠴Ⅾ囇཭牡戸科漠ᆧ檗杸⹜ߨ焦⡋␣~偵êìඊʍ⳦ឯ⤡幝琪吩偗㹟䜠乞ῤהࣟ␳毧瞯厪Ṟ䡜猾ਏɯ䝄䳢䁭坘瘑洳汣ქ圾婟㢟㤒禲᏿䝐伡᳂㼘炅ᢳ翧瞯ᚢ乞䊕└䧤Ꮻ䒄ᔉᶢ㮤禩疎ᩣ΄撽ㅝ泛├爐ᎽࠋྒḂ㺨灩旁ᅇ枮Ⓖ㹟㊓礒⨝Ꭿ䟠佉ᶢ㧄磩樳勇塯刁祙噫┄爊吆⠇༕ᴟ歸称≃墂冮抾♐䪚吪⧭Ꮉ✴伅Ὂ㨤狩窳櫀䍯ᱣⵟ䪗ԍ槹ع⃾佮剌䕔〹牖DŽ㪱桡礅昬㣸ᵛ勮❛ⷃἌ徂ਲ਼ʰ㼧嘷娌ፘ潤䴆㸪٭咡˓Ẍ≃橑燡⺇唽Ὁ୘߷ᄔ⋙㏹ݥ㡪熵挮ʠ໨ڰ㌭ຐ怢䫉䄧㓆㢂桁ᇓ╹晣䘥Ͱ྇䫉綾圇簰䈸࢈玴㡭倒䋖㨱⇹瞄ⰺ嶕㶼敨⺘䡔㨙愤ᄒ䡊ථ㺑䊠᎓䔇砠厼䌣㚖婶㧰⒙栋亗᱐ᖀẙ瞓冡毯ㅪ糈䀫痰㮣珦煀楇᳖㱜獙甴b塱⾿歘䄮椗秥䙀᠘⦱ᬩᛢ֛䔼㝀翯ࠢ㐦䞡̉廩੤♰兠ʕ㕢絍ᩜ㨷斉†查䩄䅒恾௥ᦦ䅬ᦦ㾎椹掃䫜࡯អ嫆ᔩ報惁௟䈬⻁≘䔊拥恚∢䋀⾡孟攣倢㴣ᠲ備僸彋⒑೥斫炲尠汼䇀熖㈬⅖>វ⼌䀩㻧Ņ沦ષ⡰ 䦄劉㥧൅殫岷ᠡ㱽䴃夬ົ◭㉭ᝰ倠*擂妓匈罇௹ᝐȄ崹㱎䈠۫䶄⭏┳㡝翔�Ғ沈硊䢐厨㰉ཉ࿞௅䇼ⅾ簤ྯ猂⡄⯠埁⺝塇༉撄江∷㲽䮪祅㥿䩓喦Ⱄ灗⃂岆栃段纩禧䋏祦❔ே䄓嗟你䢵⹐徙㐀㛂ฎ嬊૎㻺᪦ॆℤൈ᷃�Ű⃠俊جᡚᤨ斈㕡⛥䥯朲ܷ⮾埸ፐ⁜狉䁄،ǒ嚐ଲဧ㎤ࣅ㘞Ⰼ㤋⻀反㵺⭼姁淴っ汾۰樤ά䕋ᦷ់挮忱恚砠紨⪤⋆祠滘傟㬗戳殴㡃䤳Ǡǰå筼⟐描ᘢ仜摜ᚅ旽殲Ꮟ⹛䬂ᆚ礕戻屘㛏ϙ␠疙κ䅀᚜倽斆师㲺篵焤罷ⓡͽۘᭀ䜓䘢戹 熤䢳㥿̠ᚎᠠ濏㩂妃ᤩᎶ穐承堜砭Ε㫦簿ᴻ夔犎偳䧛憩笴一眲㝰灡千㬪ભ癲❗岯ᓽ㒁厞޾丟殴壯㥹嵭㰊祍缚ࠠ↎摒㗚䊠,䏍癪ỗᘑ⨲ᴧ墬朎᧼偁怠ǵ࿫㬦ݨ㜊Ձ寽㜦溭屠Ŗ磍殠⋨எ〣ⷞ徧ᬄ^宧㟜ࠠęϝ䥢༅添寓㞾滍峻㷂簀ᩜ㢗⡉懽Ⅵޙ櫵ᷠ㪃㟆演Ά㦮簍楫夘甏䫲䏙➐ᜈᅰ㰁㜷ᠳ嵣䉎笮ƂⳘ俑䨁ɏ垚༲巾㒆瞄᧻嶝␘ᢲ㯛嵷ↅ㷽ᡓ簵Խ䀠䂁ቃ湖嶯䜾甥Მ括盪䀌⟾䕇ἑ♧殭息्廞ӄ৥猘඲☎筒矞瑥ᢴ⦧фݛ⍆ჹӓ䐻ぼଗ喙ᖃ埚別异搵砿䉝ࢯ巭᮪ጝ瘐㈗ဥ埼䪁羞笉㷺箭眯潐䏔㰞睠䠛啒榇䞭᏶ͪ漈Ⲵᨣ㊀砣砚ɬ畵焥㟜਎梳傝ℝ⿅В煱С洧㠰穱἗ᤈ፷ẑ䑝࡞娪℗⻰⋪౔ᾭ沑晃䠐㚸㰨氏憾淛཯∏佒媎ྞึცجӈ潉沴䄾摱㗁जചܺ丹傌ặ岐羖繂䚐⦜䋁ㄠ呦ⲛᬗ涻〿ʑጓ↨縱糟᭳傯ा㘐乚✣攔␙䞮➬Ḵ獐窎歃惰㬯ᘾ稽ᒘ怢刀栺䟙䝋໡䆈绔σ熓䂰ᥠ噟兞檜਋ᄌή䔈ႀҿ㹈晱ੇ䇄䕒牞㻘⤜朎ܧ޴沜Ǫ䇂猥ق䩥羷䢾慣⊟悐⨃ȯ宇怦妤䮴篫⤧े䜀ᒾ稾ᔇ夘䀥❎癕᱉奉叠䀩癒᩹ㅷ瘤㵞㏀惝䬐㏿㮸☫ի傀幰䨳ጧ挜ͤ䤾㍉筮䤞㏠∵碸濆崃㮮穀ᯰ㿷䂏松㭤洟㐧砹嘿⃞懽忺ȔߨȠ⦜̡㚢ಶݫ梿浓㘭‱棻ࢊ;䝈笅⯯瞈Dz嚝⮕ਡ㨶柦㜠潸伌耙炓渠ᇯᎿ䳽亘崕㨆珤ṛ便ᾶ㿞㓐ܓ溇倀媯᦮い堮䘅㏭灖㞋ᾆ怜社␼➇灗㶿ᥡ䆘䌒琯∔៫倀弁䀏恥綫惌揯晾㲶穇⌙ʲ恦偮⿘徵忓㦺砓癘Oቿ䃝䦝̘紜௩২⽔幨䳢翅繸ḷ夔๾䱆⃁冃昕⯼柈没ʄᑚ搅羫砇塐≿孝䖜㤡ᘐ琔堊⼻ྉ㻢籵磫祷滏ⷁ䣟㖟碕ණ䰂柗〚幵徃㱅籋碷䧷卿珃֜匙㘔珼埚⿷Ἅ㷋抅程秷䏌忩績椲䄞ಋ敠ѧ䴆۝Ĝ稕瑋比㿏⁾板䖞ܙᘊ䯸㠓伱帹㽦碕獠㫠ῢ㓾㗞ㆀᨣᐧ䀥婮囙䂻㸺㉒㤰㡚ᮏ替⥾အ眑渔䁯傘ᐣ幻㹸฽皍ᇗ澏ギ⚿ᖘ会ḏ對଱潳弧㷎♐㰗⬩燇僽げ᰹涋䊄⦪দㆻ廎ᴪ㽶硦垗竑緿ႋ⎔堾殦㰖砅⾗弒ㇾ翳ⅽ෸愳͕濜φ㒔Ꮃ簏墧᪟思䙨䳑ᨪ嫑埮仾㿞⪾掶๎礆ᤉ䔅⺊巠Ι礠Ἣ愎櫏ൿᄙ悸ᔖ㰁窔 䅐絀仏勵悯俖⼮⒞㑚㸮␛ߣ矣璄㿜Ⴡ罁眚哣礿䙉ནᕤ別␘Ⓧᆖὴ㿟㺾紤䛧磐⼿穙ʜ㤟刟䅔䵑⺑Ὲ㺢៚؃痛槷ゔ㥟办ᤚ犬吀ᄣྡ侹⺎䐇ሔB᝚⥷ᵞ㔿甞刘同㴮⯦惚㹬羬绳琈૯姪瘙͢㔤帣ᐥ߷灑崏ṋ爺~⌇淯䞿篾暞࿆稜球K倅⤎㾘⬴稓稷濯摿动亝ἆौఒ燮ᐞᾙ冲罤䡖↷瞅癿儘᯽ᡄ疋䰝嚵ဢ徜㺐翋㩋羷澪件䫞▞桇䘝ఏ៶ⴭ䦥㸲糒檴拷泏䴿૞涞ᡸ瘝Ⱉ濍⿡䦮㼺粈怩ॎ启硷廟樊Ⱗณ簢ߺ「㣙㻦糸»矻福氀㧞⣈䜙؜䠷∭䐈ྺ֒耍砫祛塚ㇿ⠠ࢿᗠ帓䰚㠑⿍粗㹻㶕簫珷燏緿᱉ྟ᜵易粨磪㟶擿㿄≟檈磗沜_ᅧ洲ᬙ縛悷៣栣徟㹁缍綧窗槯㧿槞䤜㼜㘔䠁堎瀇╷➞眅緧編犲␿◟厞ਟМ猠俩冑⏹၀⒎۱㥎忯杶㪟ᣯ䌚㐜簌矸稶㼬繂粚Ṷ䷯癏沀噟᪣ᙄ།搏ᨊ〒弢㹥缶㤸㩇炒ܕẉ䉫恡㺪㐓倁稵㽜榷ቋ署夂Ꮊ➔‶ᴜ刚焘㠗䏢嗈ኊჟᄿ憩皖䘐ᐠ⮟弒ᓩᐙ炲濨͓ᴦ攍籛秈㟏浤Ỉ殟ᷲ縛㰙㼚ٓ怙㒡耝縗✯礏瞢㤀硉䖢汢Ґቖ–ਤ翨繺笧♯缿暤᤬䴟ᒢ吚䊯Ĺཌ䩢罯庭翇笇炈ࣟ吴ጞǙ㻄ᄣᐩᾒ縱笕缻絛礧筩ן禝キḝ㐈࿉瀕〓㿌-繋Ƌ硳经絻䲀戟⬟៷砘ᚷढ़䀞䨸式乒ⁿ炤ᇃ楌真᥆堛+樔䥖羾△绋縯箠௅ᓟ够掟߲ဝ᠔惾忱㿚罣罅ㅲ㙟甎䑶Æ琟昞〟堘耚䬂ߏ翏维⸔䍇窦Η㬩ᄠܗ㯟筳炇确笠߸祡↠߸筑㧣㤤⬀Ƀ㢦ᅱ䏹㧖㯛㩽㮘穸͖uģ⊇ư䂦笼祺稿⃀ۑ䌩㢭㡌⃀Հܝ棰ۑ䄸悀ր䈈㮀߱䈀߇0ݵİܶ窦稛㯰ۉ㨳㬐⁩㫰ޙ㨌䌨ѐ١揀ө㪀ݓ㫐ڎϐ҇͵ˑ䌰Ӫ禯⎨ۉ㮰Ԩࠐۑ㮈֢慐Ւ懚ý㧐آ扈ѫ䎐Ѻ碰ә㬨ࠃ㤍㍸Գ㮄䋸₨я㭋䉘Ѩ׀پ䐈րԸߨҸڐѫ䍈Ԑٸ؛㫘ְ悤ޛ․∨ڕ㉘ۀٲⅨ؉㠸רމHؘܴθժ礤ܧ⍤Ѱлᆄ԰㨊¤ڕ㐘⎀äЪₘݨݐҌ㩄܀ܘյИԲÈڰߋ㤴Ӡøݛ獔հ߾ᐄޘ≤ٴ禔ѤҴާ䊘ۨޘՄӴذׄҶ稛㯔۔Һ獬߸ށ揆簑猿㣔ֱ䆑穌Ф䐖ࠬ׻䄬ӐҬݴࠀ۴ܴ$Ѹۈؿⅆ祌ڌބ׫硯₌ܴ߬٘䎼ۼӔ՘۸㯳⏌݌٤؈޴ф،݄ؼڜєѽ㯜ڌӬڙ牜ҜҔьݸÜؽ秜ݢטִۤߤ֘׃㤘мذܼ߄ڼߋ㥆窢ե䌂߼ךφ礔֫笲֌އ䄌ٴܜ֬֐ڂ٬Չ禲ռݛ猂٢٘䁸⃢ߣ硠ᡏலԣ䉲܄㥴؜҂ߴؤނ܊᎒ՒӀ᮪ࠍ㇈₲ӰᮒԒԫ䈒څ*Ӳָײܐܧ⏒؂֒Ӫےإ揚⪥㢒״㭚›ҨJפљ㣂ѫ㧂Ґࠜߊ҄޹窺ӌՂ党؊ߨ妺Ժڂ磆⋚޺Ղٺܬۂڬ߂۲ܪҼٔֆℚѪڙ珚ݜزכ⁤یׁ窛⎔тڴ՞Ŋ߃Ͳܦ״קªަޙ㍆цە㈶׼ٻ槻␔نԤ⯦ܴܚ߆ޜպַጸކۄߺڪж޶Ӷզե䍶ۦ֔傀4րᰖӆۘ₆ظئࠌۺԪ܆֦ә㤭‴ܟ椮Զӏ቎ږݪ჎ܖ״⊮ӊݖТ؆ۮӮ̄ݏ毎بӭヴ㪚ݏ筗声䄚˶ܰƎֆٮՈڦւࠆރ䁔㮊ߴ㥾؊מ޾Ҩ嬍㊞Ӿ׾ޮتҦݮݞә㮞֖ڎᐞزؼ㤀Ԟܱ婀ˡ߱䀡߶ЦݺԦўԆٌ⃮؛㥁ڎϞԓ䈁މȊԱٸ˪ܝ檱ڜِہ܌ԡۊӖ՞߲֯≱бށ䃑زڻᅬϡՀઑֺۆجӱղױԎۖӞ֗偬㫑լ㧺ƑґѩޑЩ଑Ҏׁ݂ٖ֜ӺڸёڡՑٿ秩١݋䉉Ҿь⏉㯩ԍହࠑތہࠜ箎ځԼّҊ֯↹ְ扙҉㮱ڨٜ䌹ӁӉչ߾҉܎ԁҹ㪜݋ₙزѹ㢹ܴ㊥޹Ѳٹܪ筹ܙکә㡥ְ扅ٹ㫙ݘԓ䊥ڙࠚޙܩӹؙ֡؛㢅؉߅عՆ䋎䋈磈䇐⃸䇸䁘䎎ʻ䌷䆁͛䄨䁽ɮ䆊䉡В䁈䆄䈯揚Ҡ空ɨ厠冚ȍ祚琞̿Ȉ倡憥Ɯᦀ䋈ǐ͝ʹÊͶ勸戵ʑӚ恩㭰ĊЅ憰ϕڋɹ�̀ǐǍ׹ϖ䀶禀èά䍋Ȗℸ䅿ǬŰЍѣ⏗㈳ᄸ䃔穞ֵɷ礚ĸǮ㪐簒и㭰䎲䂡̨䊈ɰ䍽ٹ䂉ȝې䆵Ʊℭ厗抖㯽Ꭾ߿愤Έýюℍᤸ䇡㤤ΤCߖ䂦䆍ڤčӴσ֜௽װ䎃䅐䌆̺懝ھ㢝݊֝ٹ䈳£հ䉹䎋˳א䎣ޒ独ㅣҩᄨ˧ቈ䊵ҰũɍԔ㭍܀ŤÍأإ̮ʘ䄍؍ݐ䌮ɐʣش掁䉕Ò䌮Ŵʕӈǐً̫С㥽ҋݔ磋܀Έi㩫ګں̋Ӵi㯣իҬ䍋ۃҫӶƫջ߈掁䐇΋ջײ䈯抎ýʲ̃獔空̖窛֔ㄖ�䆁Ƚ⏻ۊϊ�夠䂤⁖㡅愠  "}
      

    The complete round-trip took 44.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.3",
          "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":{"files":[{"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\"]","filePath":"/tmp/tmp-8171-bjyUyXCWh65M-.R"}],".meta":{"timing":4}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8171-bjyUyXCWh65M-.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-8171-bjyUyXCWh65M-.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-8171-bjyUyXCWh65M-.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-8171-bjyUyXCWh65M-.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-8171-bjyUyXCWh65M-.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-8171-bjyUyXCWh65M-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8171-bjyUyXCWh65M-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8171-bjyUyXCWh65M-.R"}],"info":{"id":7}},".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":1541,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. request-slice (request)
      Show Details

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

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

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

      • slice: which contains the result of the slicing (e.g., the ids included in the slice in result).
      • reconstruct: contains the reconstructed code, as well as additional meta information. The automatically selected lines correspond to additional filters (e.g., magic comments) which force the unconditiojnal inclusion of certain elements.
      {
        "type": "response-slice",
        "id": "2",
        "results": {}
      }

    The complete round-trip took 8.7 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.3",
          "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, :?)
        :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  :normalize[*]       Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)\n  :parse              Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)\n  :query[*]           Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)\n  :quit               End the repl (aliases: :q, :exit)\n  :version            Prints the version of flowR as well as the current version of R\n\nFurthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.\n  :benchmark          Benchmark the static backwards slicer\n  :export-quads       Export quads of the normalized AST of a given R code file\n  :slicer             Static backwards executable slicer for R\n  :stats              Generate usage Statistics for R scripts\n  :summarizer         Summarize the results of the benchmark\n\nYou can combine commands by separating them with a semicolon ;.\n",
        "stream": "stdout"
      }
    4. end-repl-execution (response)
      Show Details
      {
        "type": "end-repl-execution",
        "id": "1"
      }

    The complete round-trip took 1.0 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.3",
          "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":{"files":[{"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,\")\"]","filePath":"/tmp/tmp-8171-MlPMZvWj2tgg-.R"}],".meta":{"timing":4}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.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-8171-MlPMZvWj2tgg-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8171-MlPMZvWj2tgg-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8171-MlPMZvWj2tgg-.R"}],"info":{"id":91}},".meta":{"timing":0}},"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":1650,"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":{"_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":1557,"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":1567,"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":1599,"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":3}}}}
      
    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 21.1 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 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.

📡 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. When writing a command, you may press Tab to get a list of completions, if available. Multiple commands can be entered in a single line by separating them with a semicolon (;), e.g. :parse "x<-2"; :df*. If a command is given without R code, the REPL will re-use R code given in a previous command. The prior example will hence return first the parsed AST of the program and then the dataflow graph for "x <- 2".

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)
: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, :?)

Tip

As indicated by the examples before, all REPL commands that operate on code keep track of the state. Hence, if you run a command like :dataflow* without providing R code, the REPL will re-use the R code provided in a previous command. Likewise, doing this will benefit from incrementality! If you request the dataflow graph with :df* x <- 2 * y and then want to see the parsed AST with :parse, the REPL will re-use previously obtained information and not re-parse the code again.

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.3, R grammar v14 (tree-sitter 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 0.7 ms (including parse and normalize, using the tree-sitter 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.3, R grammar v14 (tree-sitter engine)
R> :parse file://test/testfiles/example.R
Output
File: test/testfiles/example.R

program
├ binary_operator
│ ├ identifier "sum" (1:1─4)
│ ├ <- "<-" (1:5─7)
│ ╰ float "0" (1:8─9)
├ binary_operator
│ ├ identifier "product" (2:1─8)
│ ├ <- "<-" (2:9─11)
│ ╰ float "1" (2:12─13)
├ binary_operator
│ ├ identifier "w" (3:1─2)
│ ├ <- "<-" (3:3─5)
│ ╰ float "7" (3:6─7)
├ binary_operator
│ ├ identifier "N" (4:1─2)
│ ├ <- "<-" (4:3─5)
│ ╰ float "10" (4:6─8)
├ for_statement
│ ├ for "for" (6:1─4)
│ ├ ( "(" (6:5─6)
│ ├ identifier "i" (6:6─7)
│ ├ in "in" (6:8─10)
│ ├ binary_operator
│ │ ├ float "1" (6:11─12)
│ │ ├ : ":" (6:12─13)
│ │ ╰ parenthesized_expression
│ │   ├ ( "(" (6:13─14)
│ │   ├ binary_operator
│ │   │ ├ identifier "N" (6:14─15)
│ │   │ ├ - "-" (6:15─16)
│ │   │ ╰ float "1" (6:16─17)
│ │   ╰ ) ")" (6:17─18)
│ ├ ) ")" (6:18─19)
│ ╰ braced_expression
│   ├ { "{" (6:20─21)
│   ├ binary_operator
│   │ ├ identifier "sum" (7:3─6)
│   │ ├ <- "<-" (7:7─9)
│   │ ╰ binary_operator
│   │   ├ binary_operator
│   │   │ ├ identifier "sum" (7:10─13)
│   │   │ ├ + "+" (7:14─15)
│   │   │ ╰ identifier "i" (7:16─17)
│   │   ├ + "+" (7:18─19)
│   │   ╰ identifier "w" (7:20─21)
│   ├ binary_operator
│   │ ├ identifier "product" (8:3─10)
│   │ ├ <- "<-" (8:11─13)
│   │ ╰ binary_operator
│   │   ├ identifier "product" (8:14─21)
│   │   ├ * "*" (8:22─23)
│   │   ╰ identifier "i" (8:24─25)
│   ╰ } "}" (9:1─2)
├ call
│ ├ identifier "cat" (11:1─4)
│ ╰ arguments
│   ├ ( "(" (11:4─5)
│   ├ argument
│   │ ╰ string
│   │   ├ " "\"" (11:5─6)
│   │   ├ string_content "Sum:" (11:6─10)
│   │   ╰ " "\"" (11:10─11)
│   ├ comma "," (11:11─12)
│   ├ argument
│   │ ╰ identifier "sum" (11:13─16)
│   ├ comma "," (11:16─17)
│   ├ argument
│   │ ╰ string
│   │   ├ " "\"" (11:18─19)
│   │   ├ string_content
│   │   │ ╰ escape_sequence "\\n" (11:19─21)
│   │   ╰ " "\"" (11:21─22)
│   ╰ ) ")" (11:22─23)
╰ call
  ├ identifier "cat" (12:1─4)
  ╰ arguments
    ├ ( "(" (12:4─5)
    ├ argument
    │ ╰ string
    │   ├ " "\"" (12:5─6)
    │   ├ string_content "Product:" (12:6─14)
    │   ╰ " "\"" (12:14─15)
    ├ comma "," (12:15─16)
    ├ argument
    │ ╰ identifier "product" (12:17─24)
    ├ comma "," (12:24─25)
    ├ argument
    │ ╰ string
    │   ├ " "\"" (12:26─27)
    │   ├ string_content
    │   │ ╰ escape_sequence "\\n" (12:27─29)
    │   ╰ " "\"" (12:29─30)
    ╰ ) ")" (12:30─31)

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": {}
          }
        ]
      }
    }
  },
  "project": {
    "resolveUnknownPathsOnDisk": true
  },
  "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
    • project object Project specific configuration options.
      • resolveUnknownPathsOnDisk boolean [optional] Whether to resolve unknown paths loaded by the r project disk when trying to source/analyze files.
    • 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 RShell::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