Skip to content

Interface

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

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-11-18, 09:51:26 UTC presenting an overview of flowR's interfaces (v2.6.2, 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.2",
        "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.2",
          "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-8563-3umdM6Yk4d11-.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-8563-3umdM6Yk4d11-.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-8563-3umdM6Yk4d11-.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-8563-3umdM6Yk4d11-.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-8563-3umdM6Yk4d11-.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-8563-3umdM6Yk4d11-.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-8563-3umdM6Yk4d11-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8563-3umdM6Yk4d11-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8563-3umdM6Yk4d11-.R"}],"info":{"id":7}},".meta":{"timing":3}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":12,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_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":5}}}}
      

    The complete round-trip took 19.9 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.2",
          "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.2%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%3A125%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 9.6 ms (including time required to validate the messages, start, and stop the internal mock server).

     

    Including the Control Flow Graph

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

    Requesting a Control Flow Graph

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

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

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.6.2",
          "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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8563-iXvKiii0G4Jx-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8563-iXvKiii0G4Jx-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.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-8563-iXvKiii0G4Jx-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8563-iXvKiii0G4Jx-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8563-iXvKiii0G4Jx-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8563-iXvKiii0G4Jx-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8563-iXvKiii0G4Jx-.R"}],"info":{"id":33}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"function-call","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"variable-definition","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"function-call","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"variable-definition","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"function-call","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"variable-definition","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"function-call","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"function-call","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"function-call","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],"cfgQuick":{"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["32-exit"],"entryPoints":[32]},".meta":{"timing":3}}}}
      

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

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

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

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

    The complete round-trip took 7.3 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.2",
          "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₶\"晠ȉᘠ᛬φᥒ#䕳兔ᤸˤ撺㌠ɀ̺ሠᮥ'᪤㈠ຠɱ 待У៲火Ȥ䊡ᙔẶ䀠瘲刢ᑶᕴࠠ栣泀窐䚠ÜࢄСáᚍ␩〡Ẁ㏄ζ䥰ᗀ˓䂥ཥ剮愐偐㖈穽὿噣䮂㇖̣⃍͹䚧㪩ↅᦦჀ㠡嬺箝罼咄ᯀ潩䘢ቐ⭰兮晋䑐⛅ѵ౅Ꭲ⟋哮丏删⍋⌢淖ᶼ漢烰⫁❙㎷਑ד懡櫒ᮤ☺⡋㏲䃸ᠬ๱Ļ仵ע呡䒂ഫ唇䉤䫰ͻ䭣渥⭢䡤ۣ䂈ǘ䴫ⰹげŚോ☠搡掠ⵣⱠ硄తඌ௉ඔᔺゟ⳩ᤦ⼧奮ⷪ禞ⱉ䕩ⵋ故⺈䁈࡚㵶滺彎晱呚࿸睝梠䀪࢘ඃ檛佫涘╻慳栧攘彮漙㼿枣罠ᵠ䃒悊ፈ䣧➟⌧⶘ᓥႰʥ僤ໆㄗ⢋ീឥ℞ᡦࣖ⇩㤾⟪Ա⹉╹⃈ᤄ捺爻ख़恈ࡹ坐ገ඀咣哵棩ゎд䋐墢庛ȡ浈ปࡴ䌢㉍ᒣ勓↉惰全浒ୃ㞎௛綊岧ҳ按伫斘潥滃穹ᴛ壥Ḙൿ櫇䂭ᤴᡫ▤泼ᱫ烺Ⱨᳲᜄ⣯ᵤ糚᣶傣枆璧ᩑ砤ᾺⰹѸ䮚ᕠ由濦殚攢ᮆ憊夙懥㹣䧃箆᱘卋噚➉歙壮枠ນ䋘⋢忤༧寧絨㪅᫱ᛴ⓻氯ᜫ⤚窥ᆠ㼡呗რ᷂䜐㍰眝ᬧ惤ᑆ㜉喇・ᰧ⍙壨ᛷṤ㳊Ḇ棟ყಶ᝛壀㑓儾᭵碡ᑄ䒶噇嫩၏䅁䏷擗断ᓡ勅燄า৤汮⃲㢄搾㇗䳫ᥔ焍僮ᴙ層峒ἆ⣏፦糅ↈ˴沴❰帵㓨娣⌚⬴⶘嘢጗㨍勭䆉㊼垴૤汴ᣒ唠⫴刣㘺坵䡔磴◴Սᆡビ旔㝅笅㎭嗳ᠧৢٔⴺ㕗䷹妍ᨋ㣖娛㫖㧪㲌⃝ᙠ焣弋༂憢䡓〛憷⺮ᖣ⿷ᔎ汖႑彽业㓼䁇᫼姛㋔㧇㯾眘椹懊㐤䪹器⦊⳽ࢶ⛼砖㤍椅⶿᫰%ၦຝ唭◉፝⃼ⰼ綨ʰ‪˖'㪚චᩯ曔࠰㒒䜠⠴ᗫࡰ挢穕▆婴ᓨ䁃勓橌൪壞哳仅兺⸪坚炠内乄ᴉ⚥⣍ۢ፞p售卺দ≪皨্⡽Ő坋㒥努ィ塥摰᠅怦䩈核ᠭᵳ䇈Īජ䁭ᑬ砆刴૨ᚦ屴㋛⛚史ෆ穜נု⢆ڀጽ䌘⺠Ғغथ⑭悼ᬩ䁧⢉࠺掌Ɽ⒓卥؁僱㐑≣䆐ޣ偳扐ᯤ൏䗴ඪ⩥Ȩ⬺䢖ᆔ影才ၤ屨䓤垩䠿෨ರसृ࠸ቐᑇ絉⑤攪䓠ᄠ༴⥅ᆳ䪭᎒Ȣ牆⑐刡撰ϩ愶熥ᜳ䕁Ꮪ㟇䪅❴浫၉䢉丿拍Ṓ╇割⯆剒∺㬄䥈٨㺰煮ᑃ⹝掂㹆粖朌尧泣䦹₶ጓῥ╇㏝伅ᙳ▬旭㲻䤙亲儉Ჰ斸∎㻦⻀本姮粩䫙恷À呩扂匾⑆ⵗь盩ʬߙี祋ᆓフ珑㄄ƅ䛜傔═⫩杩׮ቓ杍卆㮆⥯̂牍䳇佥ゲ敶䂴泓珂₵᥼ᛒ眥ዴ䰥੹⓰Ġᆴᗉ㿅ឩ栄森૕亅撤Ⳓ彊݉ଢ⤡暗ᗴ䭉䫄痵屹ॢ勳ӝ動⳵斚爊奉d䎴㪫ࡧᄪ⫁䪁⟥嵧堊䩊₄⃪䈿琡娊痱反㖆⺄㚌恌⑏⻩ώ؊强䇒卣㨆嶀坔岍䌄榕碪䢆π凜୳㝇榚㓺䣍ᜒ檭အ旮亵㧑婋㽕絢⚖柉ᚴ淅㓰⤹嬫焫᫻≛൹ή璎ⴚ棵䐮ᵎ倠纣嬴ᄯ⊦㛔䝢發嬌ܼ杠孇న宴឵Ⴠɳʦ焮⢈㆐歀Ϸ䗑宊्㩽⭙⮓傼ᜊ䋽汍Ἷ⇋䱄栤笸䴖別畾上楛汈߱䘜⽢囀嫿ㄡ厫哨㬈奭槍厰Ј㶧ߔߠ搷佦ɾ瘎⣫ޣ㬨䏂汦⿍٥㬬嵠Ű焏码櫌㋥洃ቜ㶾书傒䚀暭棼Q翀ਆᨍ䐩捎卨岏ߗ₭啾盢犼৐ḳ䡝ϴ㮚⇁ޓ㭭攈甘犹㪠ϱ⧟槽൘̩ᮆ㪌䠔汮೼༹紽暷ὓ䵓燖㌊0䞆㲗橌慆䌋三搅৊ᶣ婝獲㮻冟暼焢䋫吠㼸ⷉ漿䧼妫ᝢጦ㢷ኚ⛨࣏匚༅䜸ਏ棽筞厜㦓沖♠桬䬛䱅䒾◪怂盝涱デ઒⭌•硆潏羃俁哺筎嵝㣖⮝㢡矗ᨶ溗煠ⱄ䋹؉奰ᩴ氁㝺ᦘᜮ搢㬎侕䫸稒怋哙㯈㽆ទᭌ‡碆懮嬌ᖝ煾ⶪḋ⍞孆㵛籿皊摵㻫啨㟹㘙ᮧ�Η㰮应ຜ簿੐漍戣䎷⤛䏘毘㳶ք㜩熌漀ῥ碹έ嫧ઝ寏崯厖ຩ礌䨉渱䣊䡫廛㝚䟔纯甑簘垼燦⾫䯈r㓟䏒㷧妙✢琮䌉ᙑ敍ㇲ嵓䬼⻅㦷ᩧᝧ㓋岟ᙂ煾ฒ廥櫜稕㤷⑒ò禎㬞⚽湼昛഻煝᯹帛Ἵើ疏㞆渾捼܃帧䯙ච羗燘瞦䘎ᴇ溞痼Ᏸ㽳櫻叐㴷礐㑦甮笍ṽ㾫෿݇䉙඲竛⏵❈爾殞潥䫜弅㿝䐿嶏㵳徟ᎅ侕嘔䟍暾淥⼆澘䰔ᬿ᝿ ए᠆熶㐝Ἃ梞䐃䀚⌚䟼㱿⨗ó粰堢奫猋䯢屏漟瀒承募㬭綾༆㹏焜అ摟䈛㞧縰ᳬ㑧瘔⠞㿰搝ⶣ䊄㭿䴼眇㽱㈠Ⱍ搂ᕈԁޝ吃ᑽ䧯䴌;彄صТ㶆圱禃䚜ᠼ㸶福崣䠲甩⃠۠Ꭲ䄎㩎岣ᐵ㾌ܯ刌备⃊ڏ䍍ⰶ漨ଶ࣑吷ᬱ⮐ⴡ㰵䃡㥐ⱝ㧈ᄁݟ嘵ሽ␷⤪̠溤䉮窳怜⋀僅ѐ㑣Ⰱğ₈☠♤€專✠⻌粚⎦奢䨅漴碭峣ᘵ儚禇匼㨏ㄎਸ♕㬉㥗ߊᓢ爏呣磈⮽簸崠䙘▝㠂炧㦤㶣梆ࢷ⧺ሸ䄶㝴Ҫ元愹侁㬈ⲡ椻ࣔ䑠Đ⻃㥂fྡྷ缀䦂䟠ᓂ∴烌䕤㑹ᔾౢژ㹭ഺ⣉穰㸡ᆬ䤎碭䊢Ꭵ梬䓿姣ᬃ侞䘬⽃௎᢭⇗仱ᘬႾ䛸㜼猵ᄞ㨯千怿⤟⃌㪱ጹ㤽䟟媜倭椋ۈ㕂匴㤃燌㡜ᄲᤐ磠ጂ〱㤃䗗䈠̶⤙᧜ⓩ圱侁䗴㒂༅磇䙼䠲⻌సરࠜ㿃オ笃尲کԞ祍妜ᬻ䂼篢ㄲ䘱ἶࡂⷝ恅㑪兢┌⤳⃫䰂ゲ䢻⽰Ԁ㦢㨎ⓐ刌㘵璶澔઀ઈ䒹朲⒤㌅ⲱ䂖♲╽㜿礐笒㾲墾僘ǒ㸢爅䰩›ഠ⠡磞䖡平ળ⣁⚌″ဲ咥✢㘵㊺哖筂ð䊤哼㬺㓳檺䓺⑛䋲窳煛ⓚ嗑怈壸⒅姲䌶Ô⑛䏳ಳ焯╚⫰ኡ‶ƺ㷲䆲೯⓲㱢夌瓨昚⅄熺ೠ摪ɀ憾䎇◆⫲缹唐窆㻳঴೔撔㿸Ჷ羓䓟䙉妵璻♠⫓刳焪ࠛłࣈࣳ䜤㳃࠮咋慦Ɫ氃䣶搶⯓β甸ী᪝ቆⲸ⚿崬掱ᲤͶ㩓綿扙普⇒ॊ岤Ú刡溠峷⓮⑴㮾屾攈⮂搤㲥柎ㄠា漫暦⪒机⓸⧾┓ᄵ唟⃞⅓垶璕捆⹝撃ᑁ⃠ᑱ榲ᔠᔡ␫ஷ洌䠑ᰫ䁴᳘ᒡ⣂〣ᒊ䪡㆕禪䋑ዞ⼃㧉䋔ᖞ㼫塲畟㊥ࡣ桹㥲ᕠᲪ偺㴗新પ㑵㳦ᚺ◴溨ʧ⬊䊫ノ挍⮺䧴㡼ᓼ欑㎪ɵ粱ᔊ䁪汲䋟䪛Ȓᶹ碹ៜ乪ʾ墼枚㑹汻ኦ╾⭫䩶ઉᓪ᧲䈼ႎᔘ嶫䙾氹拱⸓戁㋀撹㫫㩲䋫ᚹリⱶ㊤䯑⏪㙻䋌㮙✕呹㔇ᖁ㵰䅺碴ᗬ㪪䤾泎⚖㶪其䁸ㄜ┳橻ⴟ⁅⊱兴ᳬ坸ॊ清#ቢ㾒樸嵢品ၫ㦺ὂ呁⛊⑼ై௩⹋犀㐦噵⍫纪櫋≕㦪浲⋵捹ⓊᖻԳ☝៪䉵䝱啙㱳௅᫃⛽ীᒠ壸圔㳲୴嫽䛉✃嚳಼筸ᯱ୿ᣭ哭㌅筸㫾Ӛ䜱ᦨن囍⍌坰セ喍㠂㖻媧㡝⭐஥粯嘣״䈡ౢ┭⨒㹏竫r╋咽˓树ᐺᒲ㫆♚勈ि䱌挠⠻岻֝≝㠣佺䫷坎㍈⣶ᒶ䒭䬻⣼㑣ᒠ印㊢䁄爎ᜊ䬱䮖ᕳ∠㓷⛫摣ㆢ瑷㊴ᓓⶺᣎዾ㚠徺箦㄁㛳⁻棹泞㑫㺻㣹܎㜆䙻泴ᴅ㒂䒫⳷攷抙⫅᫿呋䓷偲㭰⛹烪୻䴿ᴬ媻㳺ս檧ѓⷳ墰䆗ߕ㵊搠欛㕾⏺⻱囿ԋ㏻᳽僻ᜆ叻烳焧Ӛ䛱⡠擉㟩䩚⩸໺䕵⬽燳勐瑄啚渀㼩ⅲݻ姻休均❝秼㪲㜃䓛⼰㒓࡛ℓ்㲊矫⮻䇿狊甅㗚昷吽㞸㗺潺ᚎ疞㯚व䬜哷㓋笼ἄ嘻⵫磳ˬ偯⢓ॸ⣘礪ۋ⏼ᪿ࣏⋋ױ櫒ʏ㜲德廑燧䓲曏盞ᔗ⓻柵粳睠ᜓ䐦哸璭䰡矱㻹睟⵲垾绖碦࿰⺲嫦㟁䠛㝊缈㒠ࠧ怅㴐໾ⴻ翸監攃ㅚ᪳弞ᆠܻ槽㴉◄䈤⡭櫋һ媒揳Ⴜౠ専叽嫔圗㿱塐䓼മ㪧䐫∍敺ᷰ〤ᒊᖠԃ硘粬㔘䰡䱛⍖වΦ ⊴တ疧汑㚽墅侦ⱘሁ೚宠䊆开㑄䥧㪍廗㑣ᥦ垾冪㗧䘨ಡ.章盛ᝈ㇛∗儧䛻ẫ༸梒癜沍攨㶐ㅵ憥ᕟ◦桩凪྾⯧ヮ䇐И斲ဠ克⍄చ⩓憤䯖ెᅒ线ళ㙇䆯য矀祇慕绉窪ရ湜櫞䔄摧眸⧏朡㽦楁ᱦℋ㋆噖↷啎㛦啕粺䴺ⅲ࿺㇢ౚⷆ䕛䵽⃀െ旱䭞乊◴!僀₱⊓娃Ჹ掕Ϗ教熹儅ᚅ樳亠■ᴧⶋṘ曮ኖ㷻᣹億ຓ㍎儬ఁ䓑緘獙斡䓎㍩湡堯亅☈ộ咵揳䎅灁笔በ洣睁䴖䂊⏬瑽߁壏棖䇶熮䊴妗ᩡ嚮崼୐彡呌↌৅䳙䙸ↀ༁狥埗᭎Ẑ➂Ḯ㺛䎽䱅枂䢏珀Ƶడ樶̐ၔຠ®Ñࠉ卦⓪ᡖ䝡ᔹܵ样䚖ઔ㢂䭣佅亁籍኶Ḯ㖔ㆎᇦ᪵匙䲻䁆Š㱠恢ᢠ曺㢋ᖕ⭆侂ᠤ杮僝ᜯⓌ〡师ᥕ禨嵠悒嵕仗ⶌĒ幧⋏㖍Ⱌ擵眨嶗⮽䟵缳戰欢姯㷎ᶊ祡巕叄涚⬽Ἑ戢ᑁ毖媕䉄砳氊塼ֲ橹ᮚ孷Ǎ඗᫑席稭玌᭒䢭仔怤嬩峺ڌ㖒搾奵每㶋ᯞ怕緧䮊禅宭旍揼∽姶瞏΅ᗮ寍城历尊䋍亀綄�姭噙箞᭷䮽枍剬愅妵䣈垇嬵婭儌压壃宠㤌ല㯳堭䏘㞟ᮣὣ㨍஍ቚս咎咑�峽湖އ⯛堮㇊྘篭巭㐌⾒済㠝与Š�篻擽毰渧៸༂㚵㏛㝿漗眻㕛忺掬ภ絃桙ᛸ᜽㛛㬍䇽♯䷛矻㫡֋㙧۽寖㝯㧅៾⋯㙽⧈䷸ሉ死㜧䫼⇦噈癛湘伊๯㸾ᙚ成៸瓧㤔␤๩㈃岒䧱້㉧њ刊㞘炛繚ἀ俰玾祝৷䊫⮧㤓灒ˆ㽆捜悃㭌ໂ䇅搵ႝ㽬⹻䀯ᛨీ❉勽ᜀ➍♽⅋ᙰℸ⇠玨ęᬢᤣ࢟͢Ე坜ᙋ俚⟤怣ᩘ㷬琫絝焕ପ䋹̨䀬奬穭䳢旧ᮨ癸⭚䀭伌磻ݚ䁗ᛏ⯫⣘婛倉㘇晽稛᝝ߢ⃜ᩇ煢疈烚༵䪼執壞㩜⿯䎾弫᜖⻏ᙗ糚炔ȅጣ䡘à䎆翩于ᘉ⽉྇乼嗳俊猇繻嗻停烫潙㋻᠜竷䯇㗨⻢磁廝嗵沂璦懟ޤֶ皣䯺ⷩ⻆䷙因紑糞㤛愀☲綯෗束煝瀊稇бḓ⿮稔罦؇⺎焷㻞䗥焦緈ӝ暰ᾲ皇忝序潰圠䛋㈓犩禤ỉ█Ị繡㷛㨁渺猯⛛Ḛ崢璯⻙痱棱砼䟛䘖ố殯抙疀♉牯㜖瀬ƣ䌂ᶌ䰔彐䈯䝟Ͽᘹ筫⚜㋫Ἔ盯╲帒Ὶ算溟巠溾灏ᴓ䰐⽏ả玙䯰穬プ㠽ҝ䞱捯ᷛ古‖瘈ၴ堾⨂�䗏狫⤅⇈撠䩕ଠ䦂䔨笥煝䵂ϛⰔṕ琇嚘׮幙犯㯘簑怙牗梪㰄瀌㽁电ਾ爿㴳䐣⢴ƫ磏ゝ減庼嶀Ѷ篬Ɲ耏᧤ࠚՌȿㄛ怰⻾ᜠ椛Ռ㹠ԯ揜毫⸱癠㔟氊ậ矯⇝ᯣ屋畿Њ៶猃柈槙明᱗煗檚Ⰽ㹵篢⾙篿廂绿愝ߧ秛௿⤚恀縸䉟䛚⟶平盷⨚琄⽓睟ⲙ柣⌍ŗ琸砆徥♶䌐o᜜ᦂ丬Ā㶽矿䷾䐘嶬㿓㻇砧檠ႝḔ忼Ἳ縛珟偀ࠚᨀ俌ứ硽昔⻝ᴐ᯳羞巟癠ƞ冁※䞣䛀ѐᚁʀ米緷縠㳫炁䤊疻Ⰻ➭⸾穟泯㐝搗㏣垒ʇ猟䌾᎚耏瑗ƌۋ⫠姉⃑䩦ʜ⑀┪ơࠤF傄Һޠᮭ௝䬔䏠䃱籤ྦྷ䱡毛⠁侵Dzއ澑⺣嵷框Ö洼ࣰ⨠昤಍6䆄礘䅘㞢ث濦徘Ў炏䊰ᐚ尊㱚Ž祿愿ᾜГ恎ὃ岿畛䘞ሦሎႚ㺦票ᆠ♜㐭䡚Р䉼ཡ忡༤਄ễ䁞ڷ槹᳤娬ᡎ¡Ћ牠◞㐙倱澬ⅸ٧掠䲝砯䟬惴䍤൯十欧㈻ゎ⅒ܺ慨ᵣ曒䱜僘禫L᭡ᅰᘻ秒ቦп技形⤫䏻⽗綦ट䞾ߙ氿ᾡ∜⃌ᑙ㧢吇⸽ஊ䐄旼䘶₧砿➱ၢه恐䖢䌪塀烹綮ਟ异殥ݏ㡻㳈∭̘⒍眓᣶ਰ⋓Ȕྡ垚ᨲ碉䇻ܰᅟ㼱瀐偐烌籮༯ᨱて嗃簾ᅳ犸䂸╀㨣ㄢ獻䌚ᙄ⪰㉤⤫㧃成䝜ᒰ竜䐫⑕࣒˒ೀ㴾熧氻䴬ô䚲Ṩ珬ᾒ䱠⣺⊎㔖Ṣ㗠塣໅ᇘ炡䘭㪨炮ᡐ⃄⎤྘㞁䯛儹ၸ憙ݝ殺˂㊪๰棅⏗ᔪ੾ᶋ䆁㒌ǡт᳨愢搐籏ハ䉑ਘ➱汤爎㑿㲡ᦚ᛾⣬稥ሼÿȲ⠔けᜤᤲ咊廩ߊᏐ氜媯汕梼䌕ව㿰僤ా䆺㇠穈氈ႂ犨斻䀼揣ใ嶁Ⴆ唵塬ㅈ䙸៏㟢䦨䱗ᨢ揆ऴ㌄ۥ昶䥛儌ᥴᄨ杬े㙈⍚䉃ࣸⳑ棥帻ಚ↳硆Ꮘ睃䦭᱄~挃㙈⧑絩狏ᱪ䄵ᡠ䧸䲽祕探㢕挢์⇁♧ࠆ周熵䚜ᵸ抃㪫噋฽挻ణ䑴᯦嬸՗Ɓ䟐ᴩ⥍犆㹏㣥ᱫ௔⤑狤伶摵ㄲӸᕘ嘃⸰☥磥͌Ң□䪦猵沔㛼ࠖῘ淃ޭ㱕䣡䎽ཛྷ㊑庚縿䡮ᄩ䋾ᶧࣈ䡬㹒戵䍀䩸㆔੅㼶塡熕穂‘䘲亯䙅梼ኮྔ、峰械屽燴☽̤岙㢩稲䔀挰ز㯰䩇樺䉣ਖ䠔ᩘ筃媩ŗӮᐐ䩶䂱ᅇ匸屯䐲☩ᚲ㔙≫晝أᎈ䷏ࠑ㑇༼抆凄Չᩐ栳㲪掤擾Ꭸ䱽৩嗦ŭὔ簻䠝漘䣹Ṯ⅛礚ሰజ㢑⭅挳㉤燪⒑ᵘ碙繪楏䓫䤂䫬⹜但ರ䊃盉⚹Ḧ㦳㉩Յ䣧⏌䣨ⶩ⣅ㄵ抃䦎┼慴䯈倫╓㣈ḏഠ⩩Ǧ䬵ಞ⨆صṘ煲癩⥆ᓼ梊侪◩猺᪶≫ⓜʹ晔䷂伭敝Ң叢䩊㬩዇⠿咕焳╾⅘ᣳ剱䀭墏ቘฒ㜼┫㚵䪉灡⚌ᨴ泲掫≒ᔎ参䬢〲̪ຼ牸乜⯽ᑈ➢ዖヴ፷吀䯊ㆎ储㺴Ⴀ⦔ⓩᰴ䳳浫䵓咥収䵊⵩Ⲓ䱦ⶠᤣ╝ᐂ᱓Ὣ㵐ਖ਼戴ૂ☜旦ㆽቴ楀晹Ẕ抲坪片哻區ᇦ㥡䁦⦻恿橒䜾ੜ໲澭䧣ᚃ懴₆㢠䂅䲲㩰熍⒊Ḭ旲嵭ፆ璧ጉំ㪐了ᆲ䮢⒌敠Ǭ婓ᙂ௠士⊩癶㊉䙧⚸♸ᤷ⒒ቐ烓僮ⵇṅ㋭㛲⅄掆਀䰭ᩖ䏲ຘᛀ壯Ᏺ泰㲍䱰奱䇦媰璖姤攫ᦨ勲⦯Ṩ佇㎍䨼䡾䄄嶳篅妢ၠຘⰃ䒷啑㩁㵃亮㗹ᛆᢶ㪇奠⚒ᐌ帳ۨ㮡ᴄࣃ䮩ᡙ⊚Ꮈ⺘㦶êતDŽ⫨䝛5△东㐹纄疻㊞姞擮ូ喒徰睎峋䏀م䟩ᚄI呌ĕ摹ᓤ兒᧫歋ᳵና䣆⿙檇枵ᒆ倳䅓ᬼ濲㲰☭煎㏒䨆㷹祆伵䊐॰旗቉✒⯪䭞♵憷䡶㰠䩢ᰉ㇅冗摲Ĝ竓ᆭ❏䲥ፇ䧌㌑円玴繱䛾䚻ᶙ䀒࿪侨፬ᅷ䴄乙᠓䁷V秧✣᪔䠒߭ㅒ೶珓䰖㾨⦘層≲ᥝ䛠厜䰂䧡帿峽匧䤵ࢥ⒂⦄ڞᥨᒛᓼ埒桎佗哌㥈⥁⢒㘶⒮ᗀᒅ䊧榸ႄ瓱歷䋒戎䴯嚤分㖾ẚ㦇䔿Ả䴓ᡈ䆯䋱ତ⬜塥縵䑿䖨njۏ浳Ņ猱棕糗㏿俁㐙ᤶ㎶瑫ՙ煮ෂ斝ᜒÚ挝஌ⶸ嗒䠷䭈緗㈦䏠勴⼓䙏潐ӓે䣑㲹涨山㺎⻷䃿ὂᰱ彨ཋ㢬壂⬑㔠ἵ撼䒟䖧枸學瀓⋠Ⓦዼ㢒⹪ⵄ䠠ᑪ↓ᦑេ䑲䤓ى❅ኪ拲ⵡ㙥昷ɾ㳈⚵᚟⋲眫ᙅⸯ䌸䫨⭉㵢㡃✤Ⲁ⦨ᜓኂ䨪ᅮ筈ዌ䬔္㝅挪晰⦀ᑋШ幂緒㹆ⳃ⊩਩䪱↥〄⼿㉧典炌勂嘅䝏࣌˶悎ཪⳞ⦚⹵好֞ᚁὲ䙪㿬᳌ㅀ㲱㈡㜅㹱㏀䕘ѓৌ墹Ὺ堥ⱛ䲱䬗䵩⨅঵ᡵ᥻敞䬢倪嘄堣¤ૃ☉٨ؠᥰ匨֚洈嚂唫㷫⍌㳅䔈⨺ⶥⳉ㷉煵䕽䔩⛢䃨ً哈孓徘泤䷧徜܋᪰湶姛ᐤ帜䇪ᓍ杗瞖⪫䡬ᡵ㌅̥㐪�䊞ർ琳䆢䫍9⫊⬅➅匷剸আ▐嚫யӊ૊⫓絿嶕⺵⦵♻ᶱ␩hᆆౠච匥䫔櫻㏷ـድ@浲၁ᔰ围唪糲擌櫀⬍⮞矕ㅢ䝷ᵽ㖍啽搦埈ϊᛍ坔᫗⫫䤑Ⓟ㘄ḉ㥎ḩ埚専摊Ⓨ竅猞⪁䩖㠎㓷䍰䰺㖱欷晰䰢扪娬嫤䮩٩⽉ㆵ橺╮㖄杬噠ᖋ丫揤㚖毫⾒㋤ᄴª熇ƽ䰖奌僪㑈歛㋔犙⽵⾵ᛵ㕿琨痘ᝫᢠ⌊⍩Ø挹⃓ጲ㶕〢㝾䵭┠▚儬俋⽋竟栽欗⬜䌕择握䀢⠩䆎咄䣈矍揫ᥜ㉇⢙㍕ໆֳ֏喙唚⾚斠濈ᛰڻ櫻ऋ傕㷄១ͱ槾អ冺柊姎ộ媱㐇⭀ᔺ信᝷㡬ණᙸ䬃ᰲᗊ㻄ା(津➙硔ྲྀઓ㥄晔嫺缱碊懄㘦ᩦ俀㠎䟷⹹泋യ堎彺煋忍歖㫴᫯⺢ড㙖ᠽp෗䯪嵊卡ᤤ婚⛥⮄樃㇙㕷ṱ喉瘟垊僆栀䪊睛⛅᮸瑔ბᤅ⁾幽ᕦ㓶厴攋䡌㛛ᬕᮓⶾ㿰汃೴᳓䵗朧ʆ宪昐秙✎⭴檍㻭㧷Ӳ䇁㨁圖删Ӏኤ䇜䋺ӂ涣⥅੖磵絠夢㠌吶暻纤䗑䛼㣒椺㝍Ӡ奴⎅攙㙸ཛ❊揪仟曛ᬤ桖Ⅵ዗枎䇝⵫娢䤶痌埇嘰㕂宁▋㨠ॠ㫻玊嘃᝵嚶傺ᦋဧ圖宇䚺䠥৕竵᭻㲱㛎ǂ㑺絍䗉㚾樦泋⢍摖˺ᮃ七㑪໖発ᰴ᷆栭嫨ᝀ䄴ⷆ㱳榉◰ផ妖寀㦤姎媵ᯖ樝┕ݕ櫸箕淧㟁䤶簠侉巗ڨ婅Ĥ㓐ᖵ⹳窒㔯㞣尸⛫䫈嗆曃橞楣㛍᧦⋷ބᵣ䪃幸ћ᭍⳥糑Ꮗ憞㸕㠆⣱ẏᕃ㟃嬴楛桑Ꮐ弴剶濛⟤⽇拻ⶂⶏ㛹取䵺⟭暭仧厷⠷㱍৩щ䎍浩噢᫮枨䊧ௌ㫐⮈⩅㥍橖♷綞渜⊫孎忺⋄毎⼐嫃䬦妽㍗䳊慔☒瞱壎䟋ߊ⇕໽媉渲哽涕毈睾ⶁ磪ഠㄫ妓॓ė㩔⟮ᄽ䤵㛽枍巜璀冮寚Ἇ篊礿㭃椊ည礰ᴡ৛ラáҎ䱚⃰⟉Ẩs樱嶽⭖㽸䎟്曱嚦䱕ᨋ9Ỵ笆⽣Ԡ猖⯻佨ᷕ癚־仔丌⟂廛㋩橑⊽椴杽❿ᵸ燗勾堄䐈矏ग़篓櫾䱩列Ᏽ康㷵ᕅ塾䩻䘏ዌ㛒箻椏⸄䱩sᾄ緘䯧凞犛扅䩃䜙ᦗ湨ᤝ䷗ᇳ㞊⸌⟻塞䔚᠍彤㻧筏桟ㅝह性Ť巆㟇卌暛‎翜溤୍档㫽⌔棺徚巤䀠㛣᠚伋ቶǒ悠Ἣ⢝穣毶佴帟睗庡皚嘎�۰ڛ溽⵭儗摳ᱺ̸ཷ削┦砸㟕Ǭ箐ᶏㆣ盡⿰浪ᷗ癍ᘾ碙㐺๷䈗箲נ殝昬灛ᾞ笓瓊吾䜦Ⰻ⯁⋺ޤᦟ㑣㸕࿆䥜䎷甂囁琚ሺ⏝䆻窄ᣳ㨣䴭參彫Ϲ痟圾ᄚ਱堷㤳篁櫠浈䴕ⱓ・Μ㝏夡沦ᐼ㢂劇ܴᱯ⧣㞺呙侘ᵂ็就䂛嚍梂ǵ㨬᮰桃㲕硗ञ綑瀣呿☧嶬‥ᇪ籾洇⿭矖㡜㺗ϙ劄㩈Ȧྈ偫ᆱ匘㗹ᅕ怗汕⣷䴁຤ᳰ䨢渓㑂美総猈⅁∙㧽ᄛ䍑࿗ᖈ㕧䇪ಋ晖ᑇ×制ব昈棧庁՗拰樣䒦䑓¾糚ᷠ⟃岯Ͽ䣼䖶ᘢⵑ䋝扰Იà⨉ߣ❺㎬䣳掜挱۔᳑筣⬼璞Ⴍ䞚ર潣纭㻳ᲅ揼ʖ峑㧦亱㢦减᭛თ媥֔㽷ᤓ⎱޿憠䝦焭忧儂ۊ樇㿝䊮捈Ӱ狀䴺░之朽䲉僦綎᩸耊皮戽䂗⏏ཿ唱瀊̾১ো昞ᷝ㜄碬煵䁄䤂ྵ宴䷧䠮䊍凸⛩ὸ焳䘗䁖焔⎿ฆ⳩碦ה䪅⇠⦕Ջⓞ吕ᣲ簴घ䴿桩但眹ኟ䧮䎾ᨴ矃瞭䕞䮔В今ラ䫆✼墠农慁㜀۳㕮ေ唂揍࿼㩩滆ࢿ忩ড়䠔ἴ硪㭬㱋▙䬞仾ⵘ㟀ኢ絵䫰柣᪟Ꮃ惇㥜瓴ℯ෢㹩䯦庾沇樃☴⼉ⱓ⿊㿅ೢ灬᪺椠ƕᆺᚊ粋䛁᫴斃擮ՙ甐却㙐娖暇̻ 嵜杻᮰䣮㐢ᕗㄚ⍡ᠵ汒儧ἒ㪅凤曽᭸潳㫬൝⓳㎛㖆㷹炒஻ɩ允੷ᢔ碓炦㕜┕㌢乮㢰綇ᔋ矎纡篱፼毺ᗬ矡ᐿⱘ埠֙冹殿䚔㦸♚ࢼ揳緯❚ᓭᏞ一⮒㘆淕纈晖ᑔ◁䜵ྔ䃝僷Ꮅ侎㒹漆澼沐㜔晞Ẍ滪恌䢃䫊ଽᛮṘᔀ滉庛؉惡ᣗ∳ɮ㝐䴓环࿢㷰唆嬻璈槙暇ঠἫ屍宄挆ா♬㎪笶㌸䆎ᧈᙽỴ易➭惙┄⎿仮㾞亘屼ᲊ祉ᝍᤠᏩ歡ㆌ➔粪ⱜኤ儇྽犕榽❿᫂縓ᩎൕ紒జ瓉㶌敳⩸ᕧ祰兒ࠟ䟓墴姰䤲㡖೹㧟༶䴹຋□ᙈ奬罳͌杖䝩献煙㔊ஶ*Øᘋឌ嶉塘碥Ŕᶜ䳚䃥㔿ℶ‾ᆝ⧲ᚿᰄ火䩌⥖䴍୦⿱㱇⺛ㅽ㧘嘄嘪凐ᝆ廯⎋〤ۑ俙ㆵ架㮿㪏☘᛾‒滽䃎䖫⫢વⱍ巿๋⬸㺏䗑暔娲痋ᅎ屒坡⬲ⱛ䑕璛帖啔ýେ吼测䝮᫕ⳬ୍⼅゙澛␽⊜䈐磀༳▲㹩渍⬃瘪न慹䞶孿ຜ㗽噟Ẻ籫⻍瑎㬑儿ⱴά剸㣍呔ㇿ囼岤漋桌ồ䬊㎛Ⲱ〶夦笽ି瘁䛟ឦ沃缨⤥䓿毈沂㱕䡗籾㖗◇圜嬲恋㑮䜁䛵䠫檳㌸ᤤ瀣犫⨼╜澪撌䥀槚尬҄㛅㹮䜆଼斛☌嚜廂愫糎廜⛼毴濂勭䖽ඍ஖䷶㘶檶惨撠∬⪷ⵞᅓ㺪糗૽嶓㗰㛦弦矫Ǝ೔ᛱ步෫㢈˗尌ځት㚓桔೻妌槕ឲ䡚楻ㄍ码᫺玉嘍圑墦程䛭৔㛫ɲ泛㍪想嶌ޏ䍷㛉姆睰啯㷵᜔㬣侮凭暷睹殏丝᠕夊昻⚷碥㜜㭘痧㭔⒗棋ᘺ典皉奎涻䈯囙曱ፘ溛㤕矖ӹ㶏淸㝒檶招紏䯑㴒⍲涾౛ᮄ䪹旗帚涓Ὴ砻ⶍ毖ۺ㮍⵲㡭杷䋽ପ淞癟㌜䦛ሌ⬤⻶員䀸⩰取勻ヹ䌸Ɨ嫦抛凎秛ⴚ㰍ⷯ㖽崺ᆏ澛㷃盔Ჶ离ࠎ矙廤䤺渭㕍䠗ࢳ྄䘗㙳彞澓ᨎ䓜漜簞洇䖍倗᷿⋚ϭ盾ᄂ泛瑴ႝ拿簉Ⱐ緍倯䉻斀涶矓寞暻ᐿⓜ缒ߧ෻㺪桱䆤ᕹ组ྲӁ曰損ǟ缍㮇澙㆝䠮卽箜϶矦檶级樿౑㛦⎜ἡぃ礮瑝औ僽䖈䀁橧㞌增⋭㏠ṭ㳎圮㟽ៀ䎪ང㺠ᓚℽⷛᇮ䠂Ờ杅⴯䙙業έ噐㲾畛瘼咔彸ࠊἥ姃牠晙䄅揇䰬刎暻䐿ᗙ㛴嬼ⵐ纣䊮奻ㄙ⎼ན屚枧ᴏ粝择ࠛ烻昃氮ᩯɒ痒糀㹩繧ⷯⲕ䇤氁὿㤳縯楝ɖࣵ矟壩玛㖹㒫ᨷ答湴瞽䨖噝ㄉ␌ཁ幤摝ʾ濕㛽⟵ὧ啍睮偠唖㸺俱ⴒ㍇㉌䊜樎⟍ᾚ㒥慷䛽唈㏾丶㼱珩碾๛∊朡ᱸ獽噮䵝䆊㎿㜖⹜憛㜌ᚖ娐㮘ᜨ皓擧᯽庆䙝砍堢拮涿Ꮩ䈈❍Ḽ畮燮ၙ஑珛晅妻せ➿䋵㛷⌯ῂ嘫䍯䅙玝玣亻孱揇ാ䆟ࡻ䞀忟㲳淗䍞␢⓬⼢㳑稷⽎⚟䛦㰙ᾜ申玮㣜羉㏄侪㼔᛻不≼௘᜷瞆ӫ呏㭜⤟㐂⻏墑焷✽ⷘ昁傎Ḫ燝扯㓺椨棌⹭ད絫欎庝䨌៼廯㯫奏՟澚⣅⍪㺆捷伽剥㛷ด浡怖峗⊈ႁᚭᙦ崅枋䜌䦒嗷͟ṏ㊋䒺湘ᬜ⎡喹㾕綷熼憔◭坜层立杯櫞䷏␀濤㢸笐╶梑ฌ҃ᾓ㡫坎绞⬀ᰛ⿩㿵煢壽㖖囦㝒嚏㚒呛百ᯏ掺㠓㮭揻⨎沗䧽圥ౚ窓穋◚朙ၲ漓㨑炛ษ◙␶柒嵇㦋䓯৛殟毃佳㭵擗½抙淢➚嵫㨤ᷓ㑙伌寠༵㩭琧ᓼ殖且着凘罛淮⠦␯৺຀׽漳㱼皝痢㟶尮粻儎毙༏ૃ瀉ᮩ焗㷽⹛㧠凬怒ែ更⽝眇氞瀙尽氇懽Ο㛻瞭岞牨碯篝礊琔⮯㼝笻㶼⾟緵瞠㳾簧氾࿜̊ᶷ滥㨞祀ቡ〤囻㟦峳㞧䄾␠⼍珿⽏㥽笗嶮澝䘒➪瀁禠ℾ湛ሕ䞪ὗ廂䊐⧠ߚ䨇㉶洑矧放૞则ߺὰ翃累恱倫搎㎑Ἡ灹壏ߟ㼃綘Ὧ嫕毻ᩞ㢗⏩㸜帧こ⢏盹೷ߢኟ渤繬⠿䴖㗧ᴶ屁症䎖㪝⤏⟈܊漞曯徯定␇倂ỳ⯞㚇䳟程擰杤籣筯फ़甕ᐞ例睘簷恿ෟ䘔៻俷Ú烗䀔愑䖊⾁㹙篍摾⺞䘍枬㬣廫氯泞㟔➔ྲྀ溳凇捯㦞侎掱⟋㺳椷⦍槵䐚ᗀᖪ炄⠗凜ᨪ䯺帩㷦槯糟沚巫⼦㳳㏷秖⇹⮄涣⁕弃濋ⱼ竕瘜㟣㸅禝䨾䞺ȕ堒瞶绅破㻏㤕㌍䐉㿸㑇槾㦛眉ߍ彄移洯㷟௕㰃㜱⼊狶哖㽼篎旾䨼峫氏⤖ܑ旭漱㷽男䏾᎝䘊涠㹚䒍昿ᦂ㟓笓ᝨ緍繻䶮慞䴑ךឆ岕暻ᒞ༔䟾㟾᫰瞜櫷৾矔簕怋峻控˜∓ఔͶ溳眃獟᯾䬅䠈粨砳櫯畼▞儧ᾌ㻃磛碾愛吀痠溾缵煱γ䤓ᰅ杶濓筏碎㑚嘎ⷍڡ筝掏۝⮞ᯣ‎㵭甝䝾⨍彡䯶濙粆橻兡㮖嫯㜮㲣牗棞掝㨃成砥㬽棿⮞➑簗䝎᎝糫䗜缚ఊ䟟漽窋睿⋞帓ਆࢡ總瀿纐洘ᣖ䏅簳弤盿䵟渓⠃⼭佛筩糮拸ᣐ砄翤㹌穧喝爞⳰㾂㲧筯叟֙㰏ᾨ䱋硇糓䒟獟搙瀉ལ盿痿㿝帆忐纓缜爧俟㰗ࠗ㽛怏䊫噎俜䌄簙⿢碗翟洝氛俠㭆㹯甿ᮮ㐙⌝௺⻭堷抯Ȿ⦜‡翟澖煯紟疜圓࿡㜐㦳礟吟夑䘓ཪ翟㰴⼾㠮㌚櫩憏爏紗傝᠔Ẏ៷㟄潸༏綟穖真戟徶✖㐰ੀᑁ縇㭨密⽘Ƶ㣭ᢋ狇慻䌿⟮窜መᰕ‰䁍採¡乒䥕ʗ朶梋䙍㙒੡勻ẗ 彲羦㾍㹗綐㮐矡漈ڠ䔡؅搥槗㾦⁑䟍ᝲ洜Ʉ䨟狷涟䜠瀡䟜乘㠬矢ၔ卐䄒仄ʈ߫㚇掙徠䪡漸琘羗耈快ᾰĈ㚜嶂磨໖擻占稬挢ᨥៃ㙎偔淏⾈ḶΌֿ燗憟孠墡氣烚ࠖᦇ䂦恭孊⼆ʜ߲牰᧿৒ᙰ㩼١Щ倲ࡁ塕孱Ǵ綸Ѩࡐᅏ婠缡⢣㝠戯䠹ࡘᑈ₸䇝敛獒拉扳䱩ㆡ粣犸㥷倻籱䂏㼠ƚЖ婄ठᒀ㾠䥡㱤ᤥ爩Ɋ⡏䁭ñ亊ٌ͚烠ᚯ䝇ዎ篝ሦ∖䂌か偻㚞ǃᶒݻ㕰ᑰ⟠檡ⴢ眙⨭栳埳恼枏Ǫ̭Lတ᧐⃰⭞₢⨊䶔债孺䂇㹷⺵簷窇畸ዟ䢟㸘產䜧㠬᰼痺を箞ヽ͛狜ચ䟰㡿㖞᪢僻۲␰框䂇悥ṿᘘҢവ涀⚠緀㥨ᄦ㰁䈳೼傁煪䅚ˎӐࢩ栨㒀缡ѣ༤焮䰸埳䞷Ἦ绱妬вഇ欰⬠䟮༢㜥㰫౯恌䢀弩䆼ʕ㩟皸᪰⺷ᶡ扝〰刪搽ࡀ㞲შᙫͱߤໄᮠ㻟ۡ患㲥别砶ѓႝႌ䆫㰮ڌ熸材⟀秮੣椙⤭嬎࿼⡽ვ∎粤㦬௿Γ䄀瓎㡢匚▔ⰾ俹ぺႤ䄠䐊ւຄ៯偧⳾ụ璤疐琹澻格䃵ⅾ䌄պோ擠㱠棁憢笘ᣗ瀽瑃Ꭻ℄䂱䌤ג઴ᝫ嚀綡ṣ犧∨ⰽ硘᾿㽟䆍Ზᦦဘ❈㭀盡奣ኦ匫␿塊ࡩヰ䆼䏭福䅬ᕸ⧠神أ⸥戮ؽ呍のᾕ碕䈻ê౔ᗸ㜈⋁ૢᣊ瞕⸥຾塚灘噦巙٤฼ၩਠ㐀威掤㔨఼巼࿈ボIJ䊧۳㔼ი♐㒁⟼⎥末ู⛠灣罅㼏ȤӢᄄኟ䴐䂁⇜⶧尫㘳⑝ま價ǯ総زಘ᪘␐孁偝㺤ㅵȋ㱘ྭ傱↯䋥ۏ熜‘㐗⏡灝㧳☮䄎㱞Ҁ࣭㼗䋕С猢ᮐ⺙Ⰱ婼㶦崬‬ぎΡ愐怩᤟Աཱི恈㞫Ⴡ㜣⡧㜓⸻呎灭òᆯ̸䗒ྉ䗨⪂੡㉃严ᬬ儲䉎ைࣺሀ␈䜤੓殤㣠檾榣絚ာ䯎䣬ね啊伈Ϩ䑕㐬ᰤ㗐娱łᡦ㬬琷቞厳ხ粲⍝݄Ӽ予⣨䗡Ⱌྥ咫吵၈ࢇ㸳ᇚ⌬䟪➼䂄㤟㧁权♥̯ᤳ≒摨悥ଘ⋿ڞఒᵐ✡Ⴌ砡暥ʫ\"੍摪䢯ᅣ˜䘆ఄ⿠ⱈ䑱㭃॥擓र䱜梛Ⴥ慫嶼竷睢᭨⡨䙊瓂箧劫䄴揽碙Ⴄᆅ⌿穥ิ᫄㏨緁⭃ລガ帲翣碔ギἄ䏆ޤཛྷᷴ⤨昡䵢籤Ⲩ㔽牜ᢎ惧䈁Ѓж瘛沠ⵈ媶⹂ᔧᬬ券ᩞ呪፬⅞≳ݡপۨ㱛ᒱ媬㉤利洵䩄⿀ú䇣⌂䒎ਮ洤ㄈ坱络䒧⚨昀灁㞣ヴ繎ʘ䕍స᫘㙈笁ࡃ厛䚭崵亨ो፠㆝␚ޅ഻恟䨐䞁䨙䃤அɮ禮糚倫穣എ䕀࣫敨່ቑက㕥⢮ⴳੌ璗棻␨挀ʃஷ泚崸扑兡䣥ൂጼ緱ジ䦒㇤揧ٷ㝕杋冈䃱࿂挙㺫儺ᘡ䲍ᣏἈ㆙䕓ໆᆬ⁂ܜ仔汦仁区ᙎ桟⹥ሃ涴䛵ສᨔ㼸睑❔勦ണ଺獽Ⲝ刹㇢挱䘒₴२ᤀ忾庂ۥඪᴻ硚灾⤇憤扑䖻ဆቊᓸ堸玃䲑঩歠時汶ニ㈊␒䔓஖ᘙϸ毑ಃባථ※晄ᲇ夊䇾拙䘩ఖ᰼ㄵ㨬焂㌱ά⌶ᅥᏑყ洁抳䆴ྺᲨⶸ猁᳂ყⶪ䌿⍦䱺㣍㇡揓䘋ๆሢᭈ㯑᪃㗧異昵⿫沚ჲ⸮䈴⬓ಎᅼㄸ瞑ᔃ䓤䱁兯♆䲀礀哭捎ҡ਺᫔⏘䴂広⏤箨༻㮫ᡋઘ㆖搒ⅇՇ䴧䧸炨ฃᇤ嘫㜼毼瑾樺ㄶ祫`ķ䐢官䤠布緦ಮ㽮㕾屦ᢻė掯ᎃขᇬ㝈俑ᮂ燦ᆮ㼵⚢玹ᢺ㆟房䛿ฏࣁᴤ␑䒂恅Ѓ漻㑄ᡬ㢭ᆄƙ䝠䢡ြ⚸䨩㥌姥性✿㩞憶Ҽ熭䈶䗝྆ዘ㎸䫑夂櫦⮮悰幋录ӻ煛䕀✳ࢁ᜜㸈椩倂ࡆ綬傸䙙䉣ጺㄬᎏ䕹慠ଜ㢘䙑䄳⿤䆩簺湎梔磦冽抉䖨䠡Ⴕ幤䶠ℳᡄ榯ᒊᐠᄩ䝍爊ካ熈䦵殼ば痁䖃呥熩䢲ᩘ❎䓪級ኈ⒈䧑᠕ᩁĴ樕็チゲ⅐岒羂熏⳨)あ䖙៤焴ଭ㣸㑖ұᅓᡴ㢣煚䉈┘䴩ả‟Ω皤၁Ꭳ☋䅝ᆠ䭄䦙秧䖹൑᳌㳤刑ޑ楇ቫ炍ࡣታ䙘磼Ń狫擉ᜂ⃘硑伲忤䮯࠭⥗⍅ⓥಜ䣆䛃࿐慲㏚൩ゃ∛橨炽繆౛Ⓛ擽ፔ⨢䜔൲Ⱪⓩ㞩う➩ⴾ槭㑬焹䦌࣏჌䮏॒⟄瓩ᆳ㵇ຮ昳᧻࿗䔞Ⴛ፞⤨煙἞૪ㅑங塓ࠢ刬䠻㢉䨻暷Ꮾ㣼䯙ᄒ㙸憩੃䙄熨缴⹁剱擹拯Ꮞ␡Ιᢘ㺍⥬⁲⹂幬刯㥌੻䨹⓯ረ禅玡⅘⪠组䑳ⲛᅯԷ᥎呹䓥䥓搎ႂ䣜֪⁓⢱≲㣂睆抵Ἱ牠樻⁽礿Ζ㋲໦䛐䌘ᩳ͈๣࣌簣㠻界䨎⊒▰䯩ၬ㈢ᭉ因᳅Ꭲ犴敐ࢨ哚⦼匹♩囅᱀ᢸ嚀❡Ȼ⼥㫊ⶹ犒唂㆖䇂䉜䬩ዼ≄璩米㉄ᣔ檸琻⩺哝⨆˭Ⓤ䧵Ịⅴ嘠媍ⶣ稖㸩罸⊝䄉⥎吓Ǡ㜱ᯪ⩈罉瘳摆ၪ惉畀牋咿⦪ጚኦ以渊⣎⩱楲݁ᨬᐱ畑⩳哚⥩刨ⓝ༂Ḓ㸘嬩㾳͆ᩭリ䵖䪂㓖䇭˻う䧹ٺ㘱ω抂䣄健娡尻≤夔⧉吋❢抍ႂイ庑戳㕇穯栴൓䊚ඒ⨘㱛➛Ɣᦓ䣔揉盳෇䝨岺䵘‸9⣊厕➫অအᨄ按旲盅畫窲ㅗಎ┃⤶ጙ઎䣠Ӛ㭝༉ჼ擄ᝫẽ嵒橬灺椢縉⑪䴮ᄔ⒔泉ぁ㭆ⶬ䒾汀ੴ瓚榸剟␢瑔Ἒ㱴峉秳໅㕮挀繉犊㓈᨟抑╋࠵ᒚ㽄烉㡓曇⃯ࢽ㕝٪咤᦯励⟨䌯侸՝ۉ㛳ᣆࣨĬ⍕㉾璿䦙刦☮䨹ᱚⲬ煉੓⻄䣨䊼捇ੋೊᤰ㎩䞪䗴཭ࣀ珩繒窠吒ᆆ信ⲍಯण匥⛋ઃᤊ⑬峔汒અ瞕঻捜玠⠵樊厀晚䣗䧆㌔戹ó秄ᣬᚹՓў䴛楲即☉仌׆㸴宂右柇ⷖࢪ⍑橶瓚ئ䁼斞䪱ἢ⓬怉䝓䯄ಢ禱ⵆ穳䳀奼㰱✶侅᭢✤杩᥃ᗅ硴暾ፕ瑮㓶৲㍮䛩亩ሺ⩌棉ᣒ嚆ᵩᚷ䭑窍ᔞ㹠㍿⟸㠝ᚺ㓌堹俳竄➭抸㵗ᡰ唕磱勪栅䠾ᡒ嫌䍉ぁ࿇ŭ岳Ձٮ䳋䥰剡␭䦣᝶㭄䈉摒䶅擮斻卄㚟ⳬᦱ勗憹䥇䩖⦌窹䋓ᓄ怦㊱乆狅㔍奜包䝐爢Ὶ㠄紹䳓䇆ũ斷═皛Ⳕ椧ᄎ朵享ᷦ☠㬹⅒㞄๥㶾捂㙿ᓉ妡华攮䮻ᇶ㝌矹喳䪄䇫劶ݝ♴ഐ奈揄䒲৕ᓢヰべᩓ㧇勯簸ݑ䚐Წ⨸㌁柽䶧ኮ≌䎹ᯒ嶄彯㠊䥑ຉ᳑⧽㋔䉂ങᓄ⼐婹㪲㊄僮㖿ፒ๹᳙⥯灁敵䧇Ṯ㵬役㮲څ۩㲾孄⺏洟⨟㎬斃䵓ᶆ↌烙䭒ᲇ曬叮ᝒ暞ഒᤪᅈ旝䳔䈖㪔曙≒㬆೮䮱㭍二洋娚牸斋䮃ᰵូ䄹殓䒄垩Ꮉ㝇ਨ峝㤠㎩⑫䭧ᳮ㿔䙹㎒妄ⷨ箺睉⹨ⲷ㦖㈿♥䡋጖⇼凙冓և㻫༼㭈Ꮙ泉᥌猝擭䠯᥶㹜䲙⵱瞇㏬ᮻ佃⺑ᔐ榑卼攧䦭ᜊⱬ策ᓓኇ凫➹䝟湵泪奨剫撊ٻ᫪㎬䖙ࣲ㄄ロ㞾畅媃㉄㥽獫枙䱕ᰆ㙼羹᱒㗦捫㞰❗幬紃摥犑␃䴷ᒪ▜擙㏒璆姨枴潄㪚糛㦸向敏䦅恾㸼廱⪒戇㻮㴼䭛᪍㲿㥇∻攏䨧ᠾ⨔嘙篓眆俬涹歆⾸璪∣犛୦䢍፦Śኙ籼⨅毭箸罃᧖Ჷ祅㊟曮䷙䯮⸢椉Ыኪ⏬䎵筇ṹ糫ṱ卞撿价ᶫ壼秹渓倵旪䞺݋ž㴈禿猿➪䠞၆㞈严ᗓ⧅桏ᫀ惈䅶純秄େ擉俀囆㥼弹◓氶Ὢ䆱䵌庎Ჵ⦂୧栏੕ᔞ☢敹儫嗄䶱ƵὊ婦灢⌈૥晍䪰弎⭢巩⤪ᰆ召䁳䱛䅩朮㦚ઁ␸⸇ᑎ㋢劥ᢓ哊慯丸祗↞ᕟ₮చ歨⮡ῤ⃔伥╲ื幨Ꮏ烎੤㴇㧣㍵晍䰏ᣡ↻㌥ᖒ殄≈⾵⽊嶤䳆㨎ᐋ撸ⶹ晡ⱂ履㮳ᄷ滩塼ὖ㺑粠䗋獑✴ⱐ儡∜穥䎲昴燪⊶⣀纑ᒠ䖯匉㯐ⴷዱ㾢祥簓筅㈑䶋烆ᢊ䳅᥿ᖾ⟔ⴶ䧁ヌ煥崫挷Ɉ灱䝊冏⊺䗐ூ柴⨸垡⧂暥⡒ጴ卬䆱䍌冗峴䗦ਮ⟬ⷍ溁⎂瓥Īሷফⱺ࣏乥㴈盘ԃ枟䷘姧䯔嚉∳⦇癌呸㣐淙ᝌ禯୽◼⸴⋁㲢䳂➪प竨⮶᭝㡋⋽ؙଘᗫ⏸基㐂佥澫氦囮䊴Ⴣ冕䊨┸䭦᝼⾓ᛁ⃀汹ғ࿒⫯扰チॿⓄ◗糸ۿ㕄定㊝ᶥ玪撵汎㶻䭛㚘䋍姉㱲奄⧏኱ㄲ睥橫๙నᶵ擊䅻ዱ▯向ᜄⴷᕉ⅂䳥㒪張瀐椇Ⓣ暔勰秤掅ᙷ佳ዾ☬溥ᵫ㻆䁌吊ُ㊔㣟ᤫ஻暂䰻ỉ⨔帹䴫拁䬣ᛁ੗↝勘®䬲ᓓ๨帡⯂槅ਓ暷ӯ䊦瓞癫勠旧狪摳䮫ᆞ㳜墅祪ܷᅊ⩽ၔڍᳫ\\牶ᖧ京剁㟜嬥縪⸶㍊䉱棂䥩势榰挚១䫬塑⠲勉峪᪡哮㑵៰栭䀶ࣈ剮ۖ䲕ᝫ䅱㶅䛪ㆵ⥍〴ᓔゐ拚旱⅛ូ⮌囘ϒ疦〓仆ửੰ磒㥩ᓎ攢䪛ᘸఌ嵮⺒秥搫沶奋势磙照ገ姻䨲ઘ⾹ឪ⹢晥ߓ₷湎婸⭟㦎ŭ昜絖᠟䯢ᴺ㞂懅ᑢ䘷㭈戰╄穪猅䔵䪎ᕼ⽦⿹⸲呥䧢匲Ëᙾ瓎柋᣾榴䨷ᒞ⥕ᡪ㕔嵎⁋瞅჏Ÿᝅ扆䴉═䩐囹䭴偹㰔沥匫䜴燩妶烍⥶ጓ᧘⬅᛾Ⳡ偾ⶢⓥ䞫儆཈㖽ᭈ䕯挈楬⭏ᙑ⧯ᕡቲ絅ᱫ䁵公ྺ୙㪒ଆᕨ㈡晗亟ዉ㑪娵♫籷჎㶵⧰㦕䌢☍Ⱦᝉ⢌嫅㲲䰅紂ぴ絊䥿Ⴭ䪆䫦斊⯫╀ⴼ勅⸌墥搒Ꭱ䬧㡎Ⴭ㺝䪰Ԭ琅䘒⿲呹⯤必伒癴䨄ɽ㵌ẏ䪧ᕂ਼ᔈ⫸堁⨶ᦵኽᴴ㹍䅾湞շ狨ᧁ⬹᝺ⶐ屬⛪壥㷪犴杊湽䫆ᖟኣᕇ䬚ᕾ⯪内㝌湥ᩋ破淭湻᳁ẜ狢喌⭱ᓎ⯊囙㮪䆙➒w旬其烌ᕣ狪姄⯲哅⿢吆㯢姅扊〄ۊ䕼僀ᕶ⋭᤹⯎ᝀⳄख़ƪ洅◊ၷ珳㥵瓖ᕣ⪬䗥⬾ᗍ⬴利ℊ硅炪睄埮慺㫆ચ紁喃獦圚⼺念㬲缙哪夷兊Ᾱ䫗ᙡ檼唧პ堅⤒塥㞊瞵恪㽵坃ᕷ╘疚抧؍䫌垨⭪偙⭪睅ཫ㲵㛈ᕹ狟牰᪨喎ு呃Ⱘ夵㬺枅䫊瀄狏琄⛏疁㊠㗵ਾ咑Ⳁ嫵㛊攥೪⫇燏๺ᝊٳ᫤㖰⭝ᝁ༔嚭⟢䙕஫烵ݍ╱䍍䵤狚⦎珢喾⬗ᯅ㨪祕爓ٶ佌ᖱᝌൡ搣ᦜ⭵ᜊ⢶啉㲌䷵ᤪ狵ો獵囋٫欄䂦氃♁⣥⤑ෂ䗕ឩ扵೭ᮿ囊䶙媧䑖母ᗲ皖帶䅢䎥珊ድ懎嵽ᛝ熊᪪㕧௸嗡䬖呮㒸巢䵲懶㳮Ꮉ櫛ㅳ偸㘆吊唓⬺刽㹚箙ෲ吆䗏䁼Ì矅Ჲ▵加ᚖ乮吽┲浅䌋䀇糌亱⻕ƛ潫ࣟ௥ᓂ伬屩㾌帥淓甇㭪ᢷ㽛㕪㬛喉橐ᒲ䥬尙㎲厕ἒ⫇枑㍱䍂㵹᪢ᖚ欺垷⵰嵝㞼吹淽ᨵ䈯ݾო㵬㬋秵玏柙ⶶ垕㹺彥⸋䆆秩ύໞ嶀ଌ嗚ર嘅⧶嘁⪘刕㺋㟵㕎๰⣑㺆䌜╂檅᠑⼞卝⒊搕ދ練䷍罹㋇ග䫇᥂殯枟⯴妪〚縕⏫ඇ柎⩲ᵏ絣⊼⡰᭔᙭⦡免㬦堭䆊ࡔ壌䥴lj喌⋭ᦈᮭ嘀楒幙㋊巹把厴兪ᶺ狄癷᪾病氃ᜪ⥼坣⮪洅⟒ὴ䅋ॲ嫀⍼䬟痗⬠㝀桬務ⱪ伭愺禶煋䝹杌⪕Ԛ඙㎍咻䥀堭ㇺ灅櫓䩔撉棼歲絫̝砱䨏ፚ⹑尹ἒ⢭嶋ߴ䢈⽲卉ᤰ㌓න䦈៟ⰲ峹㡪漥㰋绷㯌ݷồ⎐ׅۚ⮭嘤櫴姙℄อ㻋ᗇ悎磿廖㵭䚩඼ᮡ含⺆千㱆縭ᨻᨶ嶥வ䧊捣窥䧖ᩰ㛆䧩寮㗸ⶅݫ暩岋縉⭎䯙⛂E欜㙳⸡即㗲䕭ᑊƶ媌啶⭗㚞㫶痺ᰙ旪䪁姽Ⰴ侭翊ൗύჸ凙穠曣啼珙➇⠲卵⮒䢭䈺ቴ旪㽵净㶔䜅㔫᫢㒍会埓㝆戭噋織⚋ṵ㓛㎍匋䘂偂㟎䶠倉㩆猭攓ⱖ粏䓲㧎掀䊪ෟ䯎㟄波惽␲磕䢺⮵◌㳶Ù玈曷䶭᭮㝀⩶岍㨶站䴪䣅㪌㥸͆嚄哕෤૘ᗜ汉嚹㔶撺玫ࣖ熋ǀ凉窂ⴄⷤ卩㟂洀唡⬶播ᱻ㩗傊ᖿ懟俛㫥䷬嫙ᒗ⶘叺⁚硍焺㓖ኌ䳲旖䵨኶ⶵ⯝嘢氉崆ㄟ⇭∺歔ઍ勹᧙疐竧䘏⨶坥䬵宓㐪帥㾊⃕ൌ䢶ᇟ።✅敩ᬵ㓭⭜勋㢶慹棫筕ⶎ䫺姞涁嚿ᄩ㎑㔯ⵕ妋㧶棕ᝲ᫷䖌䳵㓅㍽媭ධ対㓼⽙嬫。䠩ѻᚶມ湲⣘年㚣旖尝㚂氭嶫㳜瘅⬋䯈ⵍ䛽㈬টܞ䶿劤㘆毀Ꮛ㘒䕥㣋ߧ姩掶痉ᦁ櫢派櫱៍䧙埖㏒⏵䯋䥗姈浲懟呫曾ⷩ尅㑸⮍垱㬲昭殪楶懌㋉◖ㆂ劺╉娹⠲坘婛㤜埵堻䓆绋竾凉ᮘ曀浨厞呒梦嶑₊碥ϺᏔᕋ䙽᷏孱看┧孊圕⣵匞ᩔ亵拺穴࿉盹巆㮒ˋׁ宇៭⹅失㱜碥忻䃕ڌ㎲䛇䭡回ⵦ寇晷䰝庑‮籍殪䣄澊㛹໓幣盀ᶻ⫡㝞欣寻㾶吉࿻㾴ᄉ㉶廉掉䚩㖔尼㜾涬塉⦒揍王撖巎ᇾ䋛喒ᴍ疧媐嗘⻵嚧㏖燅㢺⿕䯉仹᫄殕㫎唺䆌枺汑庽㉶䨞ਊ㦴啫䎲㛓㮥༗昑⮯☀∿ᝇ⦚燕䊓寷攈⊮单֟㳻浍䮩䠉潺坺䓖睕瘺柔焉᧶槒玑ᜑ⤊媰眀⥳ᇧ㎶垕墺Uㄍ㻷淁杦笓䗞㩸璥Ⲫ喥⟺䎥㱊ㅔ䄌懼㳁殉哰痡㪢㜞⮦兵⦶䇨⃋䷆ഈ磰嗙敫抻福੦㕥橡帧⚮䓍㓚Ꮔ㎎䚺⯝⚋ʣᵮ㪂ᘨ⸕儷⌮伽⽚粔紈᳻杚坹嫧⧟嬰甔溍崒⟎僵䛚巖䄎䗴⯖ភ⺤䕳Ⰾ昭潰卺㐚絅焫溇檈䋽珇ޒ溨൒凕ᚂ䯁峛⊴坅䆺溗ڈ秿嗌㞖ຨᵯ变㑒氁嫋㝌敽綻瞔ᎏ⻽◜瞑⺡疯㯖㙵湟ᡃ≺绅櫫炷܎燹珌睺溫嶟㭺᝺⼧卹㈺摵zᦔK䗶烐ݱ漀ᵭ㮡瘵涛兗㌺䗉嗳㣵ላ䇱㗑熃㛞巨㩅㑜洃唓⒎䅽掻ᤔ჋Ᏻ秆㍺✊ෟᨢ枇埜弯㈒䢵㚚朵Ἀ拲篔ཻ溰൮㊟ᚺ濤怙㱮毵凓Ⲗ⻉ⷻ揃䍥溻֣媅瓘澖幁㱴⫝䕚旕≭澴㇃⾕匕㶯য昪毻塝㙾䭽禛̕ᅬૹ߇㞛᜕ᦀ㎹圈⢗廻ⳮ名曚№嬉懼矞皗廐Ⓕ旷ɄŃ⩓ࡥ㿝㠡Ȕ繖߹埇㖍ự磁篣癸ү嘍๞傝ˉ㮣孶搦ྲὸ䥒惆ᆫ炇栢ࢿⶖ彝㦫἗⁑柾俓ὢ੔継筋睎㗯圠὞焠㴡⮻氌㟼濊ᾏ㬕丄巫瓷栢໿㴓⮝ㄙ丕氈埵䙛ᾕ㺦紣⶙畲楏冏⚑ྜྷ䨚壤ࠍ࿻ᓳ勌炳绶ǏŖⰛ悘⎞焪លঋ䴋ヶ᧔形䕽綛帗眺᝿冟⮞䭄氛⪘煷῰翚㾄盳淝䫯矿椲ᦓ䨞榾㒱栗嬦ᱫ⹧奃缋素ߧ׀ؠ㌟┖唽△⟩⏂檮妨ë圏緀ܰආȌ䕈帡稠嫁堷≏䳅䂉ᔴ囂絓竇㟟榼⺟㬡响璹堖⠽⿽⼫ç欰̬ڎ増泓噠渡崁籝భ⽀偕竹㵕绽㪵㰿ឿ氰㦲〾廍欺猕ⴎ䂂ႆ⻇炖幢ᶄණ匋栟㬞漘浒扫倏⡛嵜℘ⓩІ範ಟ澠㷀欔䨣挦歐䉌ʮ㿈⃧Ἃ΂ܿ㓫⾗冯⁾礣氚ਮ炫塖⥕ℜȎ䩊綤ཿ渐㎷㞚幽Ꮫ稬㸋俱悄翀⇋絞߇»砀㼠曹ਔᶉ嘭喂缋傀橸∇χ筼ไ᭨㌰玡剣ைम㠻Ƽ烚ߙ绒䌿቉皢櫇唀暾䮣䢧䃀ᥪ媴Ų僫⇫Ͷ䵜暧沥䷰沠榽䐚漗刈㑓䢎政∑姨姦ಟ⭩඘᫰ᤡ仠嫃ⱓ͡楅嶜⩉䌫۴⏚ș⫠攞䑣慉欬猤ⱕ墔犎ࣹ䐞穖ൌᨙ⛥ā䷖㟝㴭昺㴬梇憴Ǫᶫ䮀ဌᢘ㻤ਁ戥‴术昼᱗㢚焇憥䍖ފ畓⇘㫊㛆Σ湻唗ࢉ䗶ᢘँ戗ηᴞ๜ᥰ㠪ᔱ埣杩㪢时濼䁓࣢戌⎂琯矹熤㽰渱磽ѧ朮ฺቛ䒍嵂ᆻ㛔䝟ʁ㊼ݘ㳱⺪㙧ⵋ࠽㿳�禕煴瓄华㫒Ắ䦥前⧆䪻䠥䔸媆㟜ᄁ䆬㩙槅໏ぴド䷜➠⸚㝱䒳⩚Ѵ㶦√妖娣㙔ᷭ׈琊㈣旵䚮练䞥咄翛Ⓑ悘䙒祺ᾩ濍ұ吵㉧䌬⤹䟵䜡棭几㜈ᣝఠ䉫কហ㘀ᐝ翄痀㩚ಇㄊ滱䍦䚣ూ⃥⦒⢒㢃Ӧ搲㱤坄盵ᤎ炷䍪㯫㞻仝೫ၱ猊㳦榬嵥ᒲ佨䦙糧泅䙇Ņ丨㗫㽎祃奻炬⑆ⒶⲎ䌫㈊揵扑⭮̿参⌸囲㹨㯴祋潹ு夝囪⏝᧴➖᢮哦劑䄃仧ᒢ痭癘䙁㣬刌䎛ۑ挓ॼ㚢⌸䬃専㰣偡抩➱䉽ގ'䞲ľᲬ㕀綡䔃ಃ箯簇Ṟុ㤂ᣛ控䟥狿ॡড়−潑࿧⮬䘿⹜㹃౯燇掕勿໏౦Ⴀ㠡䢩灇䣈㦍旷Ⲕჾ⛹⏷䙗ಯঢ㍢∩摁㥬㓤䢁ج㲇ԏ爗⎦䙰䲃࿢㰤祀㸳専噲᜺繒Ṙ⁂㴈␕䛽๖Ἴ㱤簩崳瑇汮澬ာ㲛䔅熣Ϩ☠乃ข㯢⌸眳専悁⮭抃♂ⓤ:捣䙢ಮ᪂㙘揱悳瓋日䢹䥐㇋桌爈Ć副箔梬妼❩甴❡穬ࢾㅒ劖沂ᤞ揚❬䱋㗑ᜰ擩䤠筆箮伿矬㲅礙䨅፤❴䲾ᡜ㍢㏩弃ၐ嫱榪⹜♜ᠮ〰召扙坃⭧媗ⶑ峃䬳㞯ʺ捠癄ଭᢨ叶䅲亖ᦰ᭛䱉噾倰幬ാ䙚抉⩹î窩援➵ᴌ㨨撾䴃ᆃ瘬樽櫷傑Ӣ⦡፶♍☠刱毬㴱帺᪃栣ం删儧桄剣㈅㏲ᮞ᭠ࡔ磐㇤潡⍯䶫煔䊚䞌礞即♕í᤺㴌ⵉ擑䁆歭ڽ䵟᪜ᛏᣬ危⟨伶Nj坴糲ٳᓇݡ亹㸠ᢔ䤃ਘ原䜲䳾ẜ㎔緰ᷳ⎋嵯⺼䕚䪋瓺䒬㈞ҽ᠅Ḧㄔ旱右Ⲧ⽯媹缴慍栦㫧㆜ᐁ亖ᮆ₩ਈ㈃咆哱㸭橙᭘徉ȅ卩✱䚃ὦ㙤碹罐専愉嬣婗䅌屣ـᑥ♗㒵Ḓ㥬纹夳ᚇ᡺禬䀨䶯ᶁ䧒粼枣೙⪊㒟㯖缳ʆ潯প獝຦䊄委։ᆙ䓹᪒㮠搪仳歇๭璸㍟柉䳧⧎措व䱙᷶㻌桎宥昅䣈氣໹ૄ波ᑓ㎫⛺䶫ᵳ墯ㆸ䈮⮆礖ᶸ䲌皘繬妾㏋ݩ瞷䴖㇌皞毳箆戅綿拹䕏泱妰Ꮏ䙙皛Ⲫ吤歑囝忲糵懋䝜廁慯燪問䘿൧ᬤ㦽≶暓௧燯␉祟㼺᪞㧧掚ᨮ↷᪡ॵ⮑傭纜宮஼矷ᗇނ櫻㦿媮咕⢷唚⎦ᣴ᎚㷯⨹⏾䏎僲䨂吟䙫亗倎㼞ⱙ塔亦〄ঊ♱࠯㮳姈犄媑↔橾㜌料䷓梆盭䙄♲絑㴅姍獖篩㘲棾㪌绢幕癆⳵⇎彘溍䄎稑獩⫏䲀Ύ㢷㜙氓淛䓆犽⽐⪓⡟娜㐏ڣ侷䨞㨼簙畳䫊䟯ⶻ坐㤪ˠח綯曰摪殡㑋㾿ᰫ䫊◄๒⭔዁ྜྷự⥸᠀⼒ᡪ尢朂昫惙厭欍პ敀䌎曰ଥ嬟亗圄㴠渁彃㸆混⪺૵᳐哦㦯吃❃ᓼ⥚㶴箙愳ⶆ䡎⚌ࣘ㨱佽ݾ୿晐㝿ᥗ啤炥䬫戶汍䏬⣖Ǝ⌇称旘寯佛᦭囜来䨫簇㬮ν⣕೐挒程㍇昬ⵆⷱ㋜扙囈Ⱑ䘐㎖惞燗̖ủ୍᩼ⵈ客勇⳥洍Ⲋ乏簆ْ皓挓䖰䯛ᩣ俰央㲂橑夓ㄶ枴找泾຅ឃ㾎㏌娮⃤媁㬐知樹ᛒ⮵ቿ㝟查ግ滚⤣⟶伭ᮺ㗔熆䳞㷆᭭⩻൓熙❾☓֥㏪」ᳺ㣲玥䬾槇ᕎ຿䳺⊞䌉৸䭷䜰〄婩屒箆䔳ᢚ渵桽׹૔˨旱㍠᠜ⷣⱹ㪼憅䐫咷泬㉹ߧ⚙椇ᬁ珯♤⿤弹㥓➅樫๳筏暋㍷㆚ˤ嫢姗ᚬ⾄廬㷏㩪呭Ὰ睌残㛵禘纇䨝ஞ⟼伨壒㱼慅剉羷噎Ž佗秇纖㧫匽犲㗧ᦙゼ磒录㚷旯㚏❕䇍䝹⧢参獆噌幥㑼瑥姫൓㚇噼僳䖁䌅稃㍙篵ǎ䧮㞓⇹䘝巡瓍᩹晙佊ᵥ姚⭠坲员⢏佈㷩滭ᐷ瑏ṹ捗筏ೢֵ䭯昧唸廹庢睖䏹ȷ筕䡻俄▉峳ㆲயៈ⾰弙㫊楃㰽㠺㫍⟵練㖟̎嘀⯾♩⾸⩥Ὴ报䉋猒盌㶊烟纅⎁ᘑ⭲獅ⴰ少㍊朂䕋╻㱕㙼᫜═㌉喰歐Ɛ乺崾㪂矵剉䦷䛵捸䛜疁ć禵ชᚶⵍẵゲ礢窋る級ᑼ啾榞匟▵൥圚⽴媭㣬甅歫䞪旌ຸ囑⺇勥☚殭᜷㝱Ắ㉚⇙立ࠆ姎䥾滶纔殟㖺⬣搀րC溌欺椋朱ᨐ㵼澳撙⋯喤䮐檥Ů弽㽛⨺欋噝㉍ⅺ杛纊崛ᗗ䭦⭛栎壱㏚椑洫㖇♬橹歛㊈䄌痗效囜和歜僌絹睫埶城皏糟ↂଗ㖳୐杩⸵䢥㷓ぉ橫濶ཎṍ统㶔宑ᘊ段孀淙ᵐ㹷▒栻惶㣀䕻۞䎒拡痤珯嚱◪塭㦪ⅵ楫抶㏮發余ⶓ⳼෥䗓䩈湖岾ㆢ笐㢨嶷涡摤ポ΂枟痑䭕垇ᛑ広㦒愡嬻离毬ヾ競㳄✖෪ᬡ映洑妵᚜悭䂋㥖௮繽ⓑ綐羬ֻ殚曄渠嶁㰊綒昋⨦䕎Ứ᧗₏玌曆⥿ᙴ㑩峾㖂瀕屫᣷姎Ṏ姑㺀✓丗㌱宩☑寪㙆盵医癖౬Ⴚᳲ㦁替㗘ඞ㛇亙弫㤲沭续㩖皎䙽盛᎓ዬⷴ䴱ᣨ涞屣㯚羆䨋೷㛮ዿ䇛䭇ᛨ෬將圵ⱨ崪㙆栭䲫浖勎瓼㧘⮚圊⸒宕宯⽵套島札橋㱗ᣄ㫽ố殘繽㗮䬫♭瘭墉ピ睍伓糖珮ㅭිⶒଌ渊䮽ᩌ⳹巹㙶㋭䓻惖㊌ૹɶ宁✋囇ᯫ㙏丶岜㇆椵䜻搛皍㛹凒Ӆᳱ䷱槵朵⿈忁㺺繍狫㫗�⋭曞溜ᎇয᭘傠䲭彎㬖獕篻᭶㎌ㅼᇜ╋ૺෝ䭴枟䱼壻㈪竵浥䁓坎佹泛姖峤෯嘔⚥䴬ṙ㒮窭䱋⛼ύԊ⓻岑⫥昚ନ瞡清崧㷖欅屛溶ᤎỿג喍伂᷋⭤盂㒓廹嘆硭懻㴷唎׾Ὓ➒㜝ḋ寕寶澌添㶦棾䦻怆檎ܺ⍼᲎ᓴ᧭导㙱澟ᡷ㪚楽看➷ኌᑼ糖ᖀᜂ䦢㭼癢涣崓㲎牭摋Ζ⮎⫍ۙ⮑熐旑㬺盆涹塙༺煭罞榶竘瑹ᚴ盠Ἓᓮ孯図㬧崵Ꭾ䉝剔撬琰⩕૎䘤ͣᘘⰟ㔃沴㈵⢾棾㧻ᆆℌ呻䶆侍䫆㶯㲭㐫沇媜Ҿ榵⺺噵㾒瓴珝ඊ眎Ṻ篂砳9匐₩ൃ㒌缥渍珵㯸炄㳵㗫㭋ᆣິ㐐ⱞ断ᅢ㱺扪䨵㻊ྜྷ඘欉箂㖺は婅如Ϥ⼾ⰠḎᾃ⿖皛ᇃ槠孒婍浽廿㇞窣⌈搖⠸ᛳϋ幐㖵縓煎෥渇屾殞挘庮栖æ㺼濖⾠漤☾筙ൎ溋帏䈞甝旨瀖㟩峳៚熄汥䴨ࠗ矽汫张炾樐⥶⬉؍ၙ緯щǮᔯᩆ歐Ჾ爍ㅎ笣穐⌄ᠽ栺N⊚䔥槾㎽䣨ᵄ俚㬡炽愛十㙻䡛傘⊹䈍Љ䎠僨ῖā仂ɱ䙾港䙓ଇ͑替ȃ縟₢྘ᶶȼ䥁硣灂坫qћ炕溡⇯ϙࠋ䳤Ṏ宰⫁楣璧Ȉ㨽⑛䦊䈴⠹媞䱊๬Ṫ唂ᓴ獣䭫繁䘾䱚翼嵾戅䏖砠H㫳屚恦宦M中崅㧣折㫜企灒␀㴈嚢䉞⎣盧ᨬ⧗㳘ţℯ晎丱绵䚄⒮姱ቘ埚擽ᇶ㷥ᱱ༪ƍ抺✱烀ɧὨ夿௺Ê氱砥㶽碶@≠㦺ᇈᛃ匘岮崠扝縯ञ焣␄䟐ग़῟䃴͈Ḡ㪻笢紼ٞ⯙ग़ᇮ⥢䞖ƪṠ☸瘞䯃哤妮៴婤傮ⲉ䆄ĵ䝭ခ㮬㿂⥑渠㓧絀ᬿ᪀沗♶核㖉競擣⬃⚈熴ʃ筧峰仪⹛䒱㤎᫅凙ࢁᢴ␆溣湸Ⴌ亀箽ᄽ㙛撚椏=揯⎏༴∜㫜丑縃緮ᝰ㊢∱拇ԛሒኋ䠙๕䬌㥴॰ㄳ䂜䬰㊢䩠ᠩ甥⠬傔恮分歿旤窰ἳ潠啠䴠簇ኙ┐䨜※₻穘䋊Ϥ灩暑ᙇ⑗犂㥛㞤┇燈⢐⦂┙Ჲ㧰㎱怳䭧宮䔾樺榃攌䧻Ꮚ⟢严ẹ⎴煩悳䗀㡯㒿敘㊔攘䋆叵➘ף扊㥋䫰桧ᇇ秕ゼ楘⊙㔊爘去䝛ဂὪ㯘歉朳囇畯䒽ᕛ㟢生⨁Ꮊ❊倉Ὴ㲄粑ᝳ忇癯ڿⵟ⃡唖਀㐆❚梅ͦ㷴耑筰盧᥅梾ᵚⲌ甕䨗受⠜侭ẚ㳬耉窳廇ˮ熼留癢ഀ樎㐲条佀౦㾬熠狱版ョ඼ᎂ墊䈥✳猢㓎䩭ἁଌ筜涨੣੡琾࿸�洀絀珉磸᢮劶撼竑p穇箨㎾璕स崕ὺ湵暋仜ό成癷ڮ㛰Ⅰ⠢沧⤭ラ本)⬈ሎ䣇έЂ࣎㖼㩘ை㔥庚兡秩⹞Ɛ₤מ㹧ಙ潈ᨇ縵ូ⹤㙨㝮稚ൠ᠒˿ᵼᎢÉກ簇₸⠡⃜纟;稐ん杻┟ᶘ䀢焥瘫嚂磂᡽惘䰳䌄໏䪨q巀稱㪎ᱧఓ樇⑏㾿㹣硂ԩ屡玳⃧ⴈ屘暂牥ܳᢲ䱀㼹៧溛㈳⁘㱮៻♦儁獩ਠܵ⢷柉戃䓟⃪*㸬兴॥̄屡ⱔૹ渠㮇桭䦿偤㊑㰻唱⡭䄗ऴ帢ၒ猊ዤ๊ፏ㣳晐ᔬ簼秾⠽�⣭䌵׭څ紦▨捎♽䒵怦㌅ᔥ䮤③৐ù㯒箄ǫ噘ཎ䎰䋙㪠$䏍ቋ牘潎噽糙䀫㌍ᝍ䠢㓱⻏ብ㦕 gⴶ⮸坾祌弙㦠စ楋籌᳎垱㋚ᑪ扃侎劌Ⲙ⤼Ổ☟嗡攤⾠ᶈળ簂┳碼ṋⰆ垤⢺岥૆柢爖ґᫎǺӛ与୯䤽䪦悙椄祇ך຾དྷ೷⧎徰⛝䶕劌塈嵝ࠃ穖忚⧥什慤ɓ㋈筿⑝䎬⌬ⓑд哌㚬Ǡɡ̵崤㷮弸持ᣧ⃭⨥橛ᰧ斜熨牽㻚縞䡞㷷ʉ侁u㎧༱;殮㵀瀆弆䜦瘙᰻曲㬅⁺ễ䈳ଗ嚦傐᳴⢽俢扰䜭秪ᖒ㌩䅍暽攠䜙嵥㇎ʘ潼∳㩿řŐᰠᴠټ㗡㬬䜒恊ᮨΎ栁㋁Ѱ侭潈➒⯨泾撻᎓䜎Ḵ䀦傇⿮弱惀丫Ꮋ䫄㿏½㻙嶞Ŏ员ᠢ㒢溾崠剶盾٠㿸ㅅ櫽១䀪箬-ᰕࣼ報ᅩ拝͑ົ䏼͠坾旝継ਠ䴶寏摺滐悝䃶紧嵻摘ᓈ拾䊠䮗ᒪⷫ⎽㟦ᨕ嶣扖热祌⽜ஏ彾滟䮘䰶淳寁擎滻怠͇䞓嚱ᷲ籥Ю䇬↻㸌睈႐ 畛牽䀩僇㬜䊽旴ኗᱴ旾燃➑会ᇶ㯼砙瀁ぷ㽡䒽旴 ἶ睚棻廇㢠ຽ摛圠摱姼怣枙㼼ᱏ䂐碽滟ኗ㶎燽毛侗䴏緽毞ྔଇṛ㮩瞍灻彛㢜廝戻噘⸎ᏼ懣䞭ᜣ療㰧斧瀓悕㷭ઝ梒☗㿉毺寵徜ᬎ䥝簟ৗ湽⏐0ل丛眗ᴑ´㽄羚妡妅Џ㎞␠㱡Ⳇ绘௲ທ១ᒢⳟᤤĿ亨߃䰨Ṛာ➴櫢ᾣ䕹亩⡜ൌ⧦ȕ潙ⱨུ䂀㶍Ρ瞡ጧ䰀㐿©䢚姩愕㼎ࠊ䲔ᾱ挀碡産梧稰揌ౝ嚳儒㤕廘ᩚ䱜ഁ儏冯㚲ៜ⎜嗬红ݘ㾔૮ˈ䟇栂ῢ樨↮洧䅧价न⏠ໜ岬刘ࢵ健ࠛ㣤䡐懱灜簬ᰌ小孠恥愞洕世䟣䌈ᨔ㷃斤琸῱嫳壮๟痂㤕嶹✩䠀ႆṠ㱸策牂媐㆜ˁㄡ䅝粙ਢᛋゟȯ卋᳘羲೟଒ೀᢿ㪡Ⰵ䊛ร樌㏴俙丵㏡摝䵔ᯧ啗弿儿粘怨਀桐➿䜿࿡䎤竔ळ栫缰ᥠᥟ䅯䔐樞晷Б椭勰⏀罨汱᷇䧄ࡊ祟圠ᔘԋ⬦乩沜ê䈏琙ౢ䲘Ḵ㚿⡂窙䢛ᨓ␤ӓҲ敶ḀὣԘῖ㤷͡晜䲞䒜㈟嶨梁倍佇ン↡୳梄⫯喈坜Ő嗑柏䥂愩៙奄⽍㲱㽁Ձ堗䘙䚪穞♲皦禦倠璿⿏ɻ㨚瞕版㮈⽠೽᧟⎒ἔ‼窏惶姝�؎瞈ᯰ नå砬úöூ⢔⾴Ü緁䩡吰㝕ᦹᇄ弞㼃↶稫牛溷籡ნ䷜㎛劆௤៛
径佂策窫挷噏᱿愑熜北皴匰堃憍䑕Ξ͹糌署ӏ崺᝿Ɵޗ᜞痤᠁牁揁㳓㶥熴ᶷ尠䑾峟≙猙䘇Ⱏ៺粢彌ɪ簤⭋歩坤䥿ၱਬ嬙ʺ䯢埋㞀忡䃊窥狫捷孏≎㫞㦞㨯嘖┏ៃ⾅䀥㻯⛕綢⇷禡签㽞ᖅ᛭Ⳟݗே⿔徵㵮䕵犭揷䎰⽾᳝ᆛ笘Ԁ毿᠀潆彣㷦竆ɋ笨ᕐ檯૒涚ಖ⸇䀣堙⾁澽㷲糵罭榷竏೾參㖝欓丅凾㟀濘庫㳶缀Ļ炷意⑈ⓝ䠮堫ข㯰↷⁔幃彆碅窻禷婗佾ᷟ㶚眒䘀ᰁ堌⼥廽犺範♷⼁【᮸痴䀡昣ᐧ䁖娼⬇彏㽥Ộ績ܗ巆凎᧰ഠ弔縝繗倴ᒯ廏㴴ഝ皍ᘗ渏䶮䦾䎛缝縙篾ࣰἠ㿿㾎␐㇯㡩䩴篾㤒ฒआኝ獏ਚ㈐㾨牁磼㱄煘樿灕᧙ਨ痤П殾᠂῅ᦨ縹勎䈌㜳ᆺᩞ㚿Ĝ˧␟沙厊ᾎ掏䑬⊢㓊ㄵȿ孯ӯ㤟ȟᚙᲟ牃垐é㹠޲紧嶋枨㋡抜恬⚚␖㵔倝垒㽰➾㛺竇湫է戡᪝䉜㸫吁⠒㜢㓺㸬終剨篇涪෬㥱ᒠഛे⑺栉俾ᾬ㽤㋚˓瑸ᓯ牌㝞㚟局䨗ይ桍倈἞㺜翩碃磇琦ၿ弩㺜狁碜ఙ㐍略埗⁋䮚сൕ犋承戡䦞噵ؔ㐖㴪殦恩㹲络筫縈Ï秪瘙͢㔠帣ᐢ⠇炜崄心㈺Āᕷ曏嵿቞㦞䂄㘙ⰃU⿙⣕㻘⡌窋緷族罿⊨ᖞ欃ॉ氉਍㲌Ὑ煆綴㨱杗皙拿ᄘ偟桁拌小嚵ၕ忹㹷㠳⃻竗簼倪緞实磏ᘘᰅ㠉⵹䨋㻦羲楴斗枏朮㷞㞝垻帘㰁㠓澫忍ዮ綕积⦀ϤⳚt᎜㼜ᣯ簛砽矞ὓ΅粣秐/簯狿梟ㄝ實⸞儹ỵ϶䐿㹱緕緻筝᤿吠⹮⎂爚⸑簓㟫Ⰲ㽷帾终犛纗撿愴㊟憋᜞Ť✍㈚ద㿂䆀亚ƻ焎ᖿ槃璟枞ᨚ␑簑瑊῀࿻礥緮ё燯房噘旞䌜ܙ縛᠔㠙濧┺䟀筍繷珈汳玿从ᾟ嘙琐⠇〙儫⎉ᆠ⟎ҏ歎嗏乊᎞ዮ笘少⠌㞡ᩋ㾆缚纆ὡ䤏碏壏౦庞ↂ簘㐛ဘ⾿㿚⣝纮┓᥍ᨯన䟱㼞Ἕ佮ကⴵ爸耒ᭌ⃓⌎䞪滿增ʈ䨜߆烔ቡ≀੏㲽ἰ䤇箠淍⬯哟圩؝琝⭮】弱䎥ࡻ淋綗●瑿笧片匞༃ἧӱ 㵃㾪罎僧Á≌ંໃ䙾㼞ᱲࠚ搕န̨羡羴Ⴇᅯ糄ٟ硟剜ᶈぁ᠜䠙⠚ῡ偵羑罗繱磐澤ٰ̝圕簞ရ〟㠖㵔〣缳笘ᬿ竟砕ܟ䒟樕砞搚㨖అ查翭ბ缂╟硯熜ภ‴㡀勜㡌楡簜嵈牭哑⸝⋠᠝‣堜堡耜怠婬᠝Ⱍဝ〢尜〝涜瀝簜尜怜⠣㰝⨹簜狐ⲹ䠢耜ТᲸ☜嬝眽砢໐ⲹ繅ᐢ纠ۍÀ␜↡矼扩ఢ俼栢缜⺝Ⱓݜ徰尢ῑ䙼䋽備㠠⋽ઑ撁祽枽㷽᣽廼ᮠ䶡敠惰⧡䑁ᷝ㻝烐䈣䫼䉘⨢渀䈢Ȣྵᨢ䲁ৰ戢ᡁ儽ሢᕝᘠ㈢䧠爢啠ਣ毜䨢ཽ搡⫼徰㨢ᨣ樣♼丢睑稢᳑⺡Ӽ㒁☣䧠啠䲁ਣ姝䨢⸣乽樣⹼瘣湼ย㔰渢ሣḣ刣惐㸢持ᘢ姜竝㏰Ṽ瘢垱⤢⽽䟱渰娢ᴕᘱ䈣䢱∢㹽戢曼䘢帢焣昣ོ䒡縣䤣⁐礣⨣㡤產渀礢㤣್㍱夣礢咰柀儢┢ㄢ婡帢ᔣ䔡ढ㻜Ģ㘣䴣産᝘挣䂨窡ഢ㣈㸱堠ᴢ⬁崣أ㴢☣攣ᕡᔣᇠ嘢⌣樝匣夣挢丽㬣㸱ᤢ楀猢〠愣備✢椢稢䔢أ½┣ㄣ㈣欣̢縢嬢㔢⺝ᜣ䑀㙝ܣ猣䜣Ἔ祰ṁ掤ⴢ⨌⋀ߜ犘桜朣㨣֐崢㜣渣眢索欣爢⼢䤣巜⺝₢£猣笣ἰ⟜患¢沀爀梣患朢ྴң¢ଣ圀䬢眢⬣索伢椣唢⢢癱墣梢朣ἣ㼭ಣң㼢嚸⟜䂢検⎀ߜ撣䈀ᒢⴼ炣⬣༣ࢢ唣⼣璣䉰岣ᢣ㲣劣⼰岣岢⌜䳰ણႢ∣傢煽ア咢ࢢᘢ䢣䌢漢ಣ嘠椣ẝڢᲢ垀䯥ણ䓽ᶰ☱粣āʢᥡ䊣咢抣ᬣ䢣烑嚢㊣犩暢碢耕暢ᚣ䴝樰㺣⪢ԣ檢ս儢ڰ攣⊢㪣抢⺢㘣嚢ⲣਬƣ㽉乌Ⴂ称幍䦣ᄢィ↣ዼ༢昢㒣㪢ᯜ㘢䅌∠熣㡥֣䦢亱⦢䒣睜ᖢ㚢瘀皢棠媢ᆢढ禣嘣䚝喣溣溰涣㛱仰䜣❼劜盰笣ะ疢Ḣ憣妣焣䔡䶣嬢䪝綢㶢ࡱ厢ᢢ嶣ጢ㣉廰䜢㖣Ԣ᪣ᦢ刣炣ඣ伢冢窣ኢ夁䮢㼣涢仱ጢ动ᠠ㌣ᨭ厠㌣⸢ᦢ㴢⎢客㦢亣烜箣⺢垢΢߰澢㎢枣ணឣ枣洣ƣᴣྠ䎢ຣ媢䶣㮣禢䥑ᾢ䞢堔羢⮢庣À厠ᦝ㺣歜൨䡢cଣ㞣䬣瞢⊣ྣ㸣恢ⶣ㙐⬽䖢䊬䑣灣Ⰼ䑣䡣勜縨ᑣ档撣ᡣᒣ塣ຣᆣ亢⾢㘣ࡣ庠䚣癈㑣⪬⅝䘣ᑢ䀢傽悼ᮡ⮣䆣䔢塢妢ྡྷ探䌢ၣ㏱ɣ⅜婡䑢暭㱢㒁⚢牢籣籢湍ࠠ橢⩢≢䁣瑢䊢ඣ㡢恢Ɫ㉣⁑婣䉣੣犁晢੣⚢༼䖣㶢ྴ癢榢㞣殢瞢ቢ㡢剢Ꭳ窣眽伽乢伽✽癢碱㹣ᖣⴢ撱䅣㩣䐡䁣٢剣剢ѣ⁐乣ᱢ䉘ॣ⚣慼ᩢ羙⥣㑢ʣ㞢ნ⁣宣ㅣᎣ⁐ᥢ䎰䕢ᅼⅣ䂣ு⥢ᅣ崢㥣兢̣㒢ኣ烑ᕣ䞢⋀䵢渀᥼楣䠥浣ᥣ㚣奢叁㥢䙣掣硢բ⺜嵢䎱⍣᥼敢㲣㤁浢啣㵢ೝ絢ㅢ幣箢㨀㍣䵣ு⭣ᭀ⪠燀䅜牁䰰♀晀ᙀ审䜀⸀ᡠ༁ム籁䏀櫀㩡ⷀ剁ᵀ䐑֢汜ᚠ扈䯅ạ癤⯘羡㷠ডₑⅠ㢬ᡁ⨠氠⽡唠⪠旉⹐ՠ༼滐ṽ吠㪠妐搠㝣櫠ᙠ⿡㠠氡僣㙠ⷁ槜瀠㈡䍀㏡ޡ`䁀猡摁᪡⣢Ⴅ䋨堐檐硣╡ᰝ庠䘡羼׼眣㘑汀❢⻡ᝡᨠ摁㻠⓱橠籀Ⳣ㉀㚠悀䋙堐垼幰⬢砨䄡娠⣢搡䞼㣢䠠籼䄡愠拣籠烢䙁籁࣢㔠狣䒡毸ⓣ呀夁瑀㦡⛑哢桽㓢䊣瓢泣䭀ӡ᳣ⳣ暁᫠曣峣呰玈㸐ˣ扩秨䧩剁ዀ尡䐡በ惢᜼უ㠠儡ტӣ喠䎡แࣣ䣢ీ䎡ఠ䱀ࡣ梀ൠ㓀䎠唠睢⨠氡㻣凣౽磢䧣ࠠ䱁掁娠ṽ䇢Š䎠ᐠ燣㠠㔠ṽ⋢⇢́㇢㋢绢纠Ǣ既ᇢ⋀姡⧢旣⥀䐐ᮡ㝡⒠ø⍡㟝ⷣ䌹嶠ᴀᡠ⓱嗣⪡檡翭翠ı޼ঐ䀠 "}
      

    The complete round-trip took 48.9 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.2",
          "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-8563-Swi6MkBAXwiw-.R"}],".meta":{"timing":1}},"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-8563-Swi6MkBAXwiw-.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-8563-Swi6MkBAXwiw-.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-8563-Swi6MkBAXwiw-.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-8563-Swi6MkBAXwiw-.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-8563-Swi6MkBAXwiw-.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-8563-Swi6MkBAXwiw-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8563-Swi6MkBAXwiw-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8563-Swi6MkBAXwiw-.R"}],"info":{"id":7}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":131,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_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 11.8 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.2",
          "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 2.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.2",
          "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-8563-Zs76LUV1rTy7-.R"}],".meta":{"timing":8}},"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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.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-8563-Zs76LUV1rTy7-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8563-Zs76LUV1rTy7-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8563-Zs76LUV1rTy7-.R"}],"info":{"id":91}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],"cfgQuick":{"graph":{"rootVertices":[90,0,3,"3-exit",2,1,"2-exit",4,7,"7-exit",6,5,"6-exit",8,11,"11-exit",10,9,"10-exit",12,13,16,"16-exit",15,14,"15-exit",17,"17-exit",18,19,22,"22-exit",21,20,"21-exit",23,"23-exit",24,25,31,"31-exit",30,26,29,28,27,"28-exit","29-exit","30-exit",32,"32-exit",33,36,"36-exit",35,34,"35-exit",37,52,"52-exit",39,38,"39-exit",51,40,50,"50-exit",49,41,48,"48-exit",44,42,43,"44-exit",47,45,46,"47-exit","49-exit","51-exit",53,54,"54-exit",55,"55-exit",56,67,"67-exit",61,57,60,59,58,"59-exit","60-exit","61-exit",66,62,65,64,63,"64-exit","65-exit","66-exit",68,79,"79-exit",73,69,72,71,70,"71-exit","72-exit","73-exit",78,74,77,76,75,"76-exit","77-exit","78-exit",80,89,"89-exit",88,81,87,"87-exit",86,82,85,84,83,"84-exit","85-exit","86-exit","88-exit","90-exit"],"vertexInformation":[[90,{"id":90,"type":"expr","end":["90-exit"]}],[0,{"id":0,"type":"expr"}],[3,{"id":3,"type":"stm","mid":[0],"end":["3-exit"]}],["3-exit",{"id":"3-exit","type":"end","root":3}],[2,{"id":2,"type":"expr","mid":[2],"end":["2-exit"]}],[1,{"id":1,"type":"expr"}],["2-exit",{"id":"2-exit","type":"end","root":2}],[4,{"id":4,"type":"expr"}],[7,{"id":7,"type":"stm","mid":[4],"end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],[6,{"id":6,"type":"expr","mid":[6],"end":["6-exit"]}],[5,{"id":5,"type":"expr"}],["6-exit",{"id":"6-exit","type":"end","root":6}],[8,{"id":8,"type":"expr"}],[11,{"id":11,"type":"stm","mid":[8],"end":["11-exit"]}],["11-exit",{"id":"11-exit","type":"end","root":11}],[10,{"id":10,"type":"expr","mid":[10],"end":["10-exit"]}],[9,{"id":9,"type":"expr"}],["10-exit",{"id":"10-exit","type":"end","root":10}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr"}],[16,{"id":16,"type":"expr","mid":[13],"end":["16-exit"]}],["16-exit",{"id":"16-exit","type":"end","root":16}],[15,{"id":15,"type":"expr","mid":[15],"end":["15-exit"]}],[14,{"id":14,"type":"expr"}],["15-exit",{"id":"15-exit","type":"end","root":15}],[17,{"id":17,"type":"expr","end":["17-exit"]}],["17-exit",{"id":"17-exit","type":"end","root":17}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr"}],[22,{"id":22,"type":"expr","mid":[19],"end":["22-exit"]}],["22-exit",{"id":"22-exit","type":"end","root":22}],[21,{"id":21,"type":"expr","mid":[21],"end":["21-exit"]}],[20,{"id":20,"type":"expr"}],["21-exit",{"id":"21-exit","type":"end","root":21}],[23,{"id":23,"type":"expr","end":["23-exit"]}],["23-exit",{"id":"23-exit","type":"end","root":23}],[24,{"id":24,"type":"expr"}],[25,{"id":25,"type":"expr"}],[31,{"id":31,"type":"expr","mid":[25],"end":["31-exit"]}],["31-exit",{"id":"31-exit","type":"end","root":31}],[30,{"id":30,"type":"expr","mid":[30],"end":["30-exit"]}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"expr","mid":[26],"end":["29-exit"]}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["29-exit",{"id":"29-exit","type":"end","root":29}],["30-exit",{"id":"30-exit","type":"end","root":30}],[32,{"id":32,"type":"expr","end":["32-exit"]}],["32-exit",{"id":"32-exit","type":"end","root":32}],[33,{"id":33,"type":"expr"}],[36,{"id":36,"type":"stm","mid":[33],"end":["36-exit"]}],["36-exit",{"id":"36-exit","type":"end","root":36}],[35,{"id":35,"type":"expr","mid":[35],"end":["35-exit"]}],[34,{"id":34,"type":"expr"}],["35-exit",{"id":"35-exit","type":"end","root":35}],[37,{"id":37,"type":"expr"}],[52,{"id":52,"type":"expr","mid":[37],"end":["52-exit"]}],["52-exit",{"id":"52-exit","type":"end","root":52}],[39,{"id":39,"type":"expr","mid":[39],"end":["39-exit"]}],[38,{"id":38,"type":"expr"}],["39-exit",{"id":"39-exit","type":"end","root":39}],[51,{"id":51,"type":"expr","mid":[51],"end":["51-exit"]}],[40,{"id":40,"type":"expr"}],[50,{"id":50,"type":"expr","mid":[40],"end":["50-exit"]}],["50-exit",{"id":"50-exit","type":"end","root":50}],[49,{"id":49,"type":"expr","mid":[49],"end":["49-exit"]}],[41,{"id":41,"type":"expr"}],[48,{"id":48,"type":"expr","mid":[41],"end":["48-exit"]}],["48-exit",{"id":"48-exit","type":"end","root":48}],[44,{"id":44,"type":"expr","mid":[42],"end":["44-exit"]}],[42,{"id":42,"type":"expr"}],[43,{"id":43,"type":"expr"}],["44-exit",{"id":"44-exit","type":"end","root":44}],[47,{"id":47,"type":"expr","mid":[45],"end":["47-exit"]}],[45,{"id":45,"type":"expr"}],[46,{"id":46,"type":"expr"}],["47-exit",{"id":"47-exit","type":"end","root":47}],["49-exit",{"id":"49-exit","type":"end","root":49}],["51-exit",{"id":"51-exit","type":"end","root":51}],[53,{"id":53,"type":"expr"}],[54,{"id":54,"type":"expr","mid":[53],"end":["54-exit"]}],["54-exit",{"id":"54-exit","type":"end","root":54}],[55,{"id":55,"type":"expr","end":["55-exit"]}],["55-exit",{"id":"55-exit","type":"end","root":55}],[56,{"id":56,"type":"expr"}],[67,{"id":67,"type":"stm","mid":[56],"end":["67-exit"]}],["67-exit",{"id":"67-exit","type":"end","root":67}],[61,{"id":61,"type":"expr","mid":[61],"end":["61-exit"]}],[57,{"id":57,"type":"expr"}],[60,{"id":60,"type":"expr","mid":[57],"end":["60-exit"]}],[59,{"id":59,"type":"expr","mid":[59],"end":["59-exit"]}],[58,{"id":58,"type":"expr"}],["59-exit",{"id":"59-exit","type":"end","root":59}],["60-exit",{"id":"60-exit","type":"end","root":60}],["61-exit",{"id":"61-exit","type":"end","root":61}],[66,{"id":66,"type":"expr","mid":[66],"end":["66-exit"]}],[62,{"id":62,"type":"expr"}],[65,{"id":65,"type":"expr","mid":[62],"end":["65-exit"]}],[64,{"id":64,"type":"expr","mid":[64],"end":["64-exit"]}],[63,{"id":63,"type":"expr"}],["64-exit",{"id":"64-exit","type":"end","root":64}],["65-exit",{"id":"65-exit","type":"end","root":65}],["66-exit",{"id":"66-exit","type":"end","root":66}],[68,{"id":68,"type":"expr"}],[79,{"id":79,"type":"stm","mid":[68],"end":["79-exit"]}],["79-exit",{"id":"79-exit","type":"end","root":79}],[73,{"id":73,"type":"expr","mid":[73],"end":["73-exit"]}],[69,{"id":69,"type":"expr"}],[72,{"id":72,"type":"expr","mid":[69],"end":["72-exit"]}],[71,{"id":71,"type":"expr","mid":[71],"end":["71-exit"]}],[70,{"id":70,"type":"expr"}],["71-exit",{"id":"71-exit","type":"end","root":71}],["72-exit",{"id":"72-exit","type":"end","root":72}],["73-exit",{"id":"73-exit","type":"end","root":73}],[78,{"id":78,"type":"expr","mid":[78],"end":["78-exit"]}],[74,{"id":74,"type":"expr"}],[77,{"id":77,"type":"expr","mid":[74],"end":["77-exit"]}],[76,{"id":76,"type":"expr","mid":[76],"end":["76-exit"]}],[75,{"id":75,"type":"expr"}],["76-exit",{"id":"76-exit","type":"end","root":76}],["77-exit",{"id":"77-exit","type":"end","root":77}],["78-exit",{"id":"78-exit","type":"end","root":78}],[80,{"id":80,"type":"expr"}],[89,{"id":89,"type":"stm","mid":[80],"end":["89-exit"]}],["89-exit",{"id":"89-exit","type":"end","root":89}],[88,{"id":88,"type":"expr","mid":[88],"end":["88-exit"]}],[81,{"id":81,"type":"expr"}],[87,{"id":87,"type":"expr","mid":[81],"end":["87-exit"]}],["87-exit",{"id":"87-exit","type":"end","root":87}],[86,{"id":86,"type":"expr","mid":[86],"end":["86-exit"]}],[82,{"id":82,"type":"expr"}],[85,{"id":85,"type":"expr","mid":[82],"end":["85-exit"]}],[84,{"id":84,"type":"expr","mid":[84],"end":["84-exit"]}],[83,{"id":83,"type":"expr"}],["84-exit",{"id":"84-exit","type":"end","root":84}],["85-exit",{"id":"85-exit","type":"end","root":85}],["86-exit",{"id":"86-exit","type":"end","root":86}],["88-exit",{"id":"88-exit","type":"end","root":88}],["90-exit",{"id":"90-exit","type":"end","root":90}]],"bbChildren":[],"edgeInformation":[[3,[[90,{"label":0}]]],[0,[[3,{"label":0}]]],[1,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[2,[[0,{"label":0}]]],["3-exit",[["2-exit",{"label":0}]]],[7,[["3-exit",{"label":0}]]],[4,[[7,{"label":0}]]],[5,[[6,{"label":0}]]],["6-exit",[[5,{"label":0}]]],[6,[[4,{"label":0}]]],["7-exit",[["6-exit",{"label":0}]]],[11,[["7-exit",{"label":0}]]],[8,[[11,{"label":0}]]],[9,[[10,{"label":0}]]],["10-exit",[[9,{"label":0}]]],[10,[[8,{"label":0}]]],["11-exit",[["10-exit",{"label":0}]]],[17,[["11-exit",{"label":0}]]],[13,[[16,{"label":0}]]],[14,[[15,{"label":0}]]],["15-exit",[[14,{"label":0}]]],[15,[[13,{"label":0}]]],["16-exit",[["15-exit",{"label":0}]]],[16,[[12,{"label":0}]]],[12,[[17,{"label":0}]]],["17-exit",[["16-exit",{"label":0}]]],[23,[["17-exit",{"label":0}]]],[19,[[22,{"label":0}]]],[20,[[21,{"label":0}]]],["21-exit",[[20,{"label":0}]]],[21,[[19,{"label":0}]]],["22-exit",[["21-exit",{"label":0}]]],[22,[[18,{"label":0}]]],[18,[[23,{"label":0}]]],["23-exit",[["22-exit",{"label":0}]]],[32,[["23-exit",{"label":0}]]],[25,[[31,{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],[29,[[30,{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[30,[[25,{"label":0}]]],["31-exit",[["30-exit",{"label":0}]]],[31,[[24,{"label":0}]]],[24,[[32,{"label":0}]]],["32-exit",[["31-exit",{"label":0}]]],[36,[["32-exit",{"label":0}]]],[33,[[36,{"label":0}]]],[34,[[35,{"label":0}]]],["35-exit",[[34,{"label":0}]]],[35,[[33,{"label":0}]]],["36-exit",[["35-exit",{"label":0}]]],[55,[["36-exit",{"label":0}]]],[37,[[52,{"label":0}]]],[38,[[39,{"label":0}]]],["39-exit",[[38,{"label":0}]]],[39,[[37,{"label":0}]]],[40,[[50,{"label":0}]]],[41,[[48,{"label":0}]]],[42,[[44,{"label":0}]]],[43,[[42,{"label":0}]]],["44-exit",[[43,{"label":0}]]],[44,[[41,{"label":0}]]],[45,[[47,{"label":0}]]],[46,[[45,{"label":0}]]],["47-exit",[[46,{"label":0}]]],[47,[["44-exit",{"label":0}]]],["48-exit",[["47-exit",{"label":0}]]],[48,[[49,{"label":0}]]],["49-exit",[["48-exit",{"label":0}]]],[49,[[40,{"label":0}]]],["50-exit",[["49-exit",{"label":0}]]],[50,[[51,{"label":0}]]],["51-exit",[["50-exit",{"label":0}]]],[51,[["39-exit",{"label":0}]]],["52-exit",[["51-exit",{"label":0}]]],[53,[[54,{"label":0}]]],["54-exit",[[53,{"label":0}]]],[54,[["52-exit",{"label":0}]]],[52,[[55,{"label":0}]]],["55-exit",[["54-exit",{"label":0}]]],[67,[["55-exit",{"label":0}]]],[56,[[67,{"label":0}]]],[57,[[60,{"label":0}]]],[58,[[59,{"label":0}]]],["59-exit",[[58,{"label":0}]]],[59,[[57,{"label":0}]]],["60-exit",[["59-exit",{"label":0}]]],[60,[[61,{"label":0}]]],["61-exit",[["60-exit",{"label":0}]]],[61,[[56,{"label":0}]]],[62,[[65,{"label":0}]]],[63,[[64,{"label":0}]]],["64-exit",[[63,{"label":0}]]],[64,[[62,{"label":0}]]],["65-exit",[["64-exit",{"label":0}]]],[65,[[66,{"label":0}]]],["66-exit",[["65-exit",{"label":0}]]],[66,[["61-exit",{"label":0}]]],["67-exit",[["66-exit",{"label":0}]]],[79,[["67-exit",{"label":0}]]],[68,[[79,{"label":0}]]],[69,[[72,{"label":0}]]],[70,[[71,{"label":0}]]],["71-exit",[[70,{"label":0}]]],[71,[[69,{"label":0}]]],["72-exit",[["71-exit",{"label":0}]]],[72,[[73,{"label":0}]]],["73-exit",[["72-exit",{"label":0}]]],[73,[[68,{"label":0}]]],[74,[[77,{"label":0}]]],[75,[[76,{"label":0}]]],["76-exit",[[75,{"label":0}]]],[76,[[74,{"label":0}]]],["77-exit",[["76-exit",{"label":0}]]],[77,[[78,{"label":0}]]],["78-exit",[["77-exit",{"label":0}]]],[78,[["73-exit",{"label":0}]]],["79-exit",[["78-exit",{"label":0}]]],[89,[["79-exit",{"label":0}]]],[80,[[89,{"label":0}]]],[81,[[87,{"label":0}]]],[82,[[85,{"label":0}]]],[83,[[84,{"label":0}]]],["84-exit",[[83,{"label":0}]]],[84,[[82,{"label":0}]]],["85-exit",[["84-exit",{"label":0}]]],[85,[[86,{"label":0}]]],["86-exit",[["85-exit",{"label":0}]]],[86,[[81,{"label":0}]]],["87-exit",[["86-exit",{"label":0}]]],[87,[[88,{"label":0}]]],["88-exit",[["87-exit",{"label":0}]]],[88,[[80,{"label":0}]]],["89-exit",[["88-exit",{"label":0}]]],["90-exit",[["89-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["90-exit"],"entryPoints":[90]},".meta":{"timing":7}}}}
      
    4. request-query (request)
      Show Details
      {
        "type": "request-query",
        "id": "2",
        "filetoken": "x",
        "query": [
          {
            "type": "compound",
            "query": "call-context",
            "commonArguments": {
              "kind": "visualize",
              "subkind": "text",
              "callTargets": "global"
            },
            "arguments": [
              {
                "callName": "^mean$"
              },
              {
                "callName": "^print$",
                "callTargets": "local"
              }
            ]
          }
        ]
      }
    5. response-query (response)
      Show Details
      {
        "type": "response-query",
        "id": "2",
        "results": {
          "call-context": {
            ".meta": {
              "timing": 0
            },
            "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 34.8 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-query)

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

    • . object Request a query to be run on the file analysis information.
      • type string [required] The type of the message. Allows only the values: 'request-query'
      • id string [optional] If you give the id, the response will be sent to the client with the same id.
      • filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
      • query array [required] The query to run on the file analysis information. Valid item types:
        • . alternatives Any query
          • . alternatives Supported queries
            • . object Call context query used to find calls in the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'call-context'
              • callName string [required] Regex regarding the function name!
              • callNameExact boolean [optional] Should we automatically add the ^ and $ anchors to the regex to make it an exact match?
              • kind string [optional] The kind of the call, this can be used to group calls together (e.g., linking plot to visualize). Defaults to .
              • subkind string [optional] The subkind of the call, this can be used to uniquely identify the respective call type when grouping the output (e.g., the normalized name, linking ggplot to plot). Defaults to .
              • callTargets string [optional] Call targets the function may have. This defaults to any. Request this specifically to gain all call targets we can resolve. Allows only the values: 'global', 'must-include-global', 'local', 'must-include-local', 'any'
              • ignoreParameterValues boolean [optional] Should we ignore default values for parameters in the results?
              • includeAliases boolean [optional] Consider a case like f <- function_of_interest, do you want uses of f to be included in the results?
              • fileFilter object [optional] Filter that, when set, a node's file attribute must match to be considered
                • fileFilter string [required] Regex that a node's file attribute must match to be considered
                • includeUndefinedFiles boolean [optional] If fileFilter is set, but a nodes file attribute is undefined, should we include it in the results? Defaults to true.
              • linkTo alternatives [optional] Links the current call to the last call of the given kind. This way, you can link a call like points to the latest graphics plot etc.
                • . object
                  • type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
                  • callName alternatives [required] Test regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression, and string arrays are checked for containment.
                    • . string
                    • . array Valid item types:
                    • . string
                  • ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
                  • cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
                  • attachLinkInfo object [optional] Additional information to attach to the link.
                • . array Valid item types:
                  • . object
                    • type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
                    • callName alternatives [required] Test regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression, and string arrays are checked for containment.
                    • . string
                    • . array Valid item types:
                    • . string
                    • ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
                    • cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
                    • attachLinkInfo object [optional] Additional information to attach to the link.
            • . object The config query retrieves the current configuration of the flowR instance and optionally also updates it.
              • type string [required] The type of the query. Allows only the values: 'config'
              • update object [optional] An optional partial configuration to update the current configuration with before returning it. Only the provided fields will be updated, all other fields will remain unchanged.
            • . object The control flow query provides the control flow graph of the analysis, optionally simplified.
              • type string [required] The type of the query. Allows only the values: 'control-flow'
              • config object [optional] Optional configuration for the control flow query.
                • simplificationPasses array The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used. Valid item types:
                  • . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
            • . object The dataflow query simply returns the dataflow graph, there is no need to pass it multiple times!
              • type string [required] The type of the query. Allows only the values: 'dataflow'
            • . object The dataflow-lens query returns a simplified view on the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'dataflow-lens'
            • . object The df-shape query retrieves information on the shape of dataframes
              • type string [required] The type of the query. Allows only the values: 'df-shape'
              • criterion string [optional] The slicing criterion of the node to get the dataframe shape for.
            • . object The id map query retrieves the id map from the normalized AST.
              • type string [required] The type of the query. Allows only the values: 'id-map'
            • . object The normalized AST query simply returns the normalized AST, there is no need to pass it multiple times!
              • type string [required] The type of the query. Allows only the values: 'normalized-ast'
            • . object The cluster query calculates and returns all clusters in the dataflow graph.
              • type string [required] The type of the query. Allows only the values: 'dataflow-cluster'
            • . object Slice query used to slice the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'static-slice'
              • criteria array [required] The slicing criteria to use. Valid item types:
                • . string
              • noReconstruction boolean [optional] Do not reconstruct the slice into readable code.
              • noMagicComments boolean [optional] Should the magic comments (force-including lines within the slice) be ignored?
              • direction string [optional] The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
            • . object 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 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, :?)

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.2, R v4.5.0 (r-shell engine)
R> :dataflow* y <- 1 + x
Output
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgYnVpbHQtaW46Xy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfLSBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAzIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46X1xuICAgIGxpbmtTdHlsZSAyIHN0cm9rZTpncmF5O1xuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCAzXG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDRcbiAgICA0IC0tPnxcImFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=

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

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

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

y <- 1 + x

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

Example: Interfacing with the File System

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

$ docker run -it --rm eagleoutice/flowr # or npm run flowr 
flowR repl using flowR v2.6.2, R v4.5.0 (r-shell engine)
R> :parse file://test/testfiles/example.R
Output
File: test/testfiles/example.R

exprlist
├ expr
│ ├ expr
│ │ ╰ SYMBOL "sum" (1:1─3)
│ ├ LEFT_ASSIGN "<-" (1:5─6)
│ ╰ expr
│   ╰ NUM_CONST "0" (1:8)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "product" (2:1─7)
│ ├ LEFT_ASSIGN "<-" (2:9─10)
│ ╰ expr
│   ╰ NUM_CONST "1" (2:12)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "w" (3:1)
│ ├ LEFT_ASSIGN "<-" (3:3─4)
│ ╰ expr
│   ╰ NUM_CONST "7" (3:6)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "N" (4:1)
│ ├ LEFT_ASSIGN "<-" (4:3─4)
│ ╰ expr
│   ╰ NUM_CONST "10" (4:6─7)
├ expr
│ ├ FOR "for" (6:1─3)
│ ├ forcond
│ │ ├ ( "(" (6:5)
│ │ ├ SYMBOL "i" (6:6)
│ │ ├ IN "in" (6:8─9)
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ NUM_CONST "1" (6:11)
│ │ │ ├ : ":" (6:12)
│ │ │ ╰ expr
│ │ │   ├ ( "(" (6:13)
│ │ │   ├ expr
│ │ │   │ ├ expr
│ │ │   │ │ ╰ SYMBOL "N" (6:14)
│ │ │   │ ├ - "-" (6:15)
│ │ │   │ ╰ expr
│ │ │   │   ╰ NUM_CONST "1" (6:16)
│ │ │   ╰ ) ")" (6:17)
│ │ ╰ ) ")" (6:18)
│ ╰ expr
│   ├ { "{" (6:20)
│   ├ expr
│   │ ├ expr
│   │ │ ╰ SYMBOL "sum" (7:3─5)
│   │ ├ LEFT_ASSIGN "<-" (7:7─8)
│   │ ╰ expr
│   │   ├ expr
│   │   │ ├ expr
│   │   │ │ ╰ SYMBOL "sum" (7:10─12)
│   │   │ ├ + "+" (7:14)
│   │   │ ╰ expr
│   │   │   ╰ SYMBOL "i" (7:16)
│   │   ├ + "+" (7:18)
│   │   ╰ expr
│   │     ╰ SYMBOL "w" (7:20)
│   ├ expr
│   │ ├ expr
│   │ │ ╰ SYMBOL "product" (8:3─9)
│   │ ├ LEFT_ASSIGN "<-" (8:11─12)
│   │ ╰ expr
│   │   ├ expr
│   │   │ ╰ SYMBOL "product" (8:14─20)
│   │   ├ * "*" (8:22)
│   │   ╰ expr
│   │     ╰ SYMBOL "i" (8:24)
│   ╰ } "}" (9:1)
├ expr
│ ├ expr
│ │ ╰ SYMBOL_FUNCTION_CALL "cat" (11:1─3)
│ ├ ( "(" (11:4)
│ ├ expr
│ │ ╰ STR_CONST "\"Sum:\"" (11:5─10)
│ ├ , "," (11:11)
│ ├ expr
│ │ ╰ SYMBOL "sum" (11:13─15)
│ ├ , "," (11:16)
│ ├ expr
│ │ ╰ STR_CONST "\"\\n\"" (11:18─21)
│ ╰ ) ")" (11:22)
╰ expr
  ├ expr
  │ ╰ SYMBOL_FUNCTION_CALL "cat" (12:1─3)
  ├ ( "(" (12:4)
  ├ expr
  │ ╰ STR_CONST "\"Product:\"" (12:5─14)
  ├ , "," (12:15)
  ├ expr
  │ ╰ SYMBOL "product" (12:17─23)
  ├ , "," (12:24)
  ├ expr
  │ ╰ STR_CONST "\"\\n\"" (12:26─29)
  ╰ ) ")" (12:30)

Retrieve the parsed AST of the example file.

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

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

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

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

⚙️ Configuring FlowR

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

:query @config

The following summarizes the configuration options:

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

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

Example Configuration File
{
  "ignoreSourceCalls": true,
  "semantics": {
    "environment": {
      "overwriteBuiltIns": {
        "definitions": [
          {
            "type": "function",
            "names": [
              "foo"
            ],
            "processor": "builtin:assignment",
            "config": {}
          }
        ]
      }
    }
  },
  "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 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