| CARVIEW |
Navigation Menu
-
Notifications
You must be signed in to change notification settings - Fork 10
Interface
This document was generated from 'src/documentation/wiki-interface.ts' on 2025-12-25, 21:00:33 UTC presenting an overview of flowR's interface (v2.7.6, 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.
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.
LoadingsequenceDiagram autonumber participant Client participant Server Client-->Server: connects Server->>Client: helloAfter launching flowR, for example, with
docker run -it --rm eagleoutice/flowr --server(🐳️), simply connecting should present you with ahellomessage, 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.7.6", "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.
-
. object [required]
-
Analysis Message (
request-file-analysis)View Details. The server builds the dataflow graph for a given input file (or a set of files).
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-file-analysis alt Server-->>Client: response-file-analysis else Server-->>Client: error end deactivate ServerThe 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 thefiletokenfield. This will save the server a lot of memory allocation.Furthermore, the request must contain either a
contentfield to directly pass the file's content or afilepathfield which contains the path to the file (this path must be accessible for the server to be useful). If you add theidfield, the answer will use the sameidso 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-analysisMessageNote: 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.6", "r": "4.5.0", "engine": "r-shell" } } -
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" } -
response-file-analysis(response)Show Details
The
resultsfield of the response effectively contains three keys of importance:-
parse: which contains 1:1 the parse result in CSV format that we received from theRShell(i.e., the AST produced by the parser of the R interpreter). -
normalize: which contains the normalized AST, including ids (see theinfofield and the Normalized AST wiki page). -
dataflow: especially important is thegraphfield 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-8256-vLrLMrENVyRv-.R"}],".meta":{"timing":2}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8256-vLrLMrENVyRv-.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-8256-vLrLMrENVyRv-.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-8256-vLrLMrENVyRv-.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-8256-vLrLMrENVyRv-.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-8256-vLrLMrENVyRv-.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-8256-vLrLMrENVyRv-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8256-vLrLMrENVyRv-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8256-vLrLMrENVyRv-.R"}],"info":{"id":7}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":2663,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"vdef","id":0}],[2,{"tag":"fcall","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":"fcall","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}]]]],"_unknownSideEffects":[]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}} -
The complete round-trip took 8.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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.6", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filename": "sample.R", "content": "x <-" } -
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.7.6%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22text%22%2C%22content%22%3A%22x%20%3C%2D%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A128%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A221%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A182%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A104%3A19%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A192%3A25%29%0A%20%20%20%20at%20async%20FlowrAnalyzerCache.runTapeUntil%20%28%3C%3E%2Fsrc%2Fproject%2Fcache%2Fflowr%2Danalyzer%2Dcache.ts%3A89%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.sendFileAnalysisResponse%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A163%3A52%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09" }
The complete round-trip took 7.8 ms (including time required to validate the messages, start, and stop the internal mock server).
Including the Control Flow Graph
While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add
cfg: trueto 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.6", "r": "4.5.0", "engine": "r-shell" } } -
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 } -
response-file-analysis(response)Show Details
The response looks basically the same as a response sent without the
cfgflag. However, additionally it contains acfgfield. 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-8256-rgo8l2lZeaXq-.R"}],".meta":{"timing":2}},"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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.R","index":2,"role":"if-other"}}},{"type":"RForLoop","variable":{"type":"RSymbol","location":[2,5,2,5],"content":"i","lexeme":"i","info":{"additionalTokens":[],"id":16,"parent":31,"role":"for-var","index":0,"nesting":1,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.R","index":1,"role":"for-vec"}},"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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.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-8256-rgo8l2lZeaXq-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8256-rgo8l2lZeaXq-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8256-rgo8l2lZeaXq-.R"}],"info":{"id":33}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":2800,"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":{"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":"fcall","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"vdef","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"fcall","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"fcall","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":"vdef","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"fcall","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"fcall","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"fcall","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":"vdef","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"fcall","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":"fcall","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":"fcall","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"fcall","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":"fcall","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}]]]],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],"cfgQuick":{"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["32-exit"],"entryPoints":[32]},".meta":{"timing":1}}}}
The complete round-trip took 8.1 ms (including time required to validate the messages, start, and stop the internal mock server).
Retrieve the Output as RDF N-Quads
The default response is formatted as JSON. However, by specifying
format: "n-quads", you can retrieve the individual results (e.g., the Normalized AST), as RDF N-Quads. This works with and without the control flow graph as described above.Requesting RDF N-Quads
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.6", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "n-quads", "cfg": true } -
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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<https://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\"^^<https://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> \"vdef\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<https://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> \"fcall\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://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\"^^<https://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\"^^<https://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> \"fcall\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
The complete round-trip took 6.2 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.6", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "compact", "cfg": true } -
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₶\"晠ȉᘠ᛬φᥒ#䄲唈᥆䀠桰o)•媄�:怦ᠡ瘲䲠τO奢K瓘ዡŁയ◀[<撠偵ᕵȦ᪅⡝᱃†⼤ᤢ`にིɹ糐ෲȫⓈټᗠ匏⛲➀硰ᑓល滟⁖∫ㅑ嬣ǀ㌃⳦䆚䓉㊹䌰偘༛绠灴セ傞ⓦIJᠹ⩱┇ᗤᡆ劥檬ኳ䍆㗔杯柲Cೃ֏宽溏Ɛ椊泘泐⭩碵威恺夻䉄䵈ೇ楠永ذ⢡䶎檥杴⃤ㄭV珢≮⣏ߘ㫍Ղၖร撡∰ਹげक़䴹☠摡掠洳Ⱡ硄Чඌ�䶔ᴺだ泩ᤦ⼧奮ⷩ祁⩊╹⽉ᕵⶈ搉嬮望㭒䛁校毛睤Ƞ⡃沈体憙⼻檉漪佢ᾇ欙㬯昛ി栘Ċధ䮕昤浨ᠸ惛⼥⁆Ყ൴ᢚၕᦥ㴳⺊Üᔥ磢ᡥ央◪礡≋䖉❊ᖅ⃤卺殰汉朡⁂殸㝭Ἃീ冈浹⣩ゎ࠷˰墢庛Ȣᵈň䡴䌢㉨庵ⴻ✤䊪⾉䡹ϛ㡝根⬃᱇嶓榛⽻擛咞䍄彖Ⴤ狅ហ响Ệ䃤â浌ᶆ焂⾦概ᔆ䣷ᅤ㴊ḅ椃᪅⚽ᙠ焤ၺⰹ౺䮚ᕣ畱查欦攡ᬶ授墥滥㹣䧀݆ቚ厓幙✹杚壎枠ນ䫛䊱巚溾ᠺ༦媙┟宐圻┛㬙ᆢ㽞峇Ⴀ᷃ۨ印₹毆愘ᢦҭ宇䛋Ꭶ⦸歖ᦙ匇䤗ᕥ㳺ᰄᣣᱚ䁛囤ሐ㢺寧磡偸㹅漨⣑㫙Ἓ凥ᖬ䂟撣䉜㒸্埥瓘ፁ㨒㚧䲻⦇セᐥ榧इᙥ峪ᨄ梿᫈涟ᚻዩ戵䌕扖䂈彪抰༵䁤刍㷔姐浌厷偵ፂ僦䫈劰ී⫺噠㏈㉄嫉ガᙡ㲮撾壎ㆡ嶭ဢ㡠䛑媎⛺㍕ⶦ㎌ᜆㄌ圖㢍䳕᷎䙞㴣剸ひ։罁ᴮ䀴㽏ൾ帚⮵〧殩卬⸆爢᳖瓯清囯ḍᑭ䠤攸喳ᒌ墂嵕䤪寂ያ寝竭ᷚᛊ琗⫎ၦඞ㖍⯉䦰椻䬘ᣑrС⁖怠眿⇐捡ᒖ䴣䚰⤀Ԡ䊥ㅪⲁ癩狌㭪䊹%恾㱥廋⭛桤㗃笹⁁@♄ᠸ㧼䋽ኧ唬僸ኇ恻⇁㠨ⅳ⃢ި䣽儣嗊ீ☵䝄朢&瘰㬤岪Ȝ尸槄ⴢ䍑冊⑵I⇐⠡剩䨡忢ᅹᑁ响㦈猒䵩懐䰩〥⬰⩉Ʊ͉㕝ᏺ㽃恼Ġ窦ゆŐ屘⌈ᑥ偩包ᜆ壻র፨䁞᠂㚶≐Ṧၔ⩾䀱㖩≯䇜ဤ•ቐᾋ⊆◊ၦ磴䠑収穡ᎈ扔ፄ㨨污╤燁䔒侩㤶瑉ᆠ楃ዺ㮦档♤兯ᒲ䥰漱Ùų䱉NJ␢橤䛄㡬㓢䦉岡ᥤ䂲䥋劚け嚄撻༫炽㙹暳ᩒ幗ᅲ᥀䴦灩ᐦ⑉䰩悾ᆁᡒ䵘㊎⟻溃柔扬瓱ᇹ㈥㥿ធⅷ琚❇幪曔桋䀿䵴䔪⥀幹䈷爢ⴊ暜旜燪仙呱䀰姒Õᎍᵆ癡ᗠᩊ擣䷩粳Ո嵪䓑ற㬇ς⯂敫㩌⤩ִ妘嬪᳇䆩⏅ၖ枲潮⒁⼀ࡽ䥧ឲ❓犅㈄❪敆䀨Ҭ灴禸匒畑㏁㔄䆑ㆊ仈㲭䬵撸ֲ奪橗ዴ朂䟯抧⥮啨噓र⤊ᙁ畵罎ᬈ倕䃵㘟ᔃԨଘ剕ͫ啢寉䋤涅㽼൜娺㣑⬥ㅃ⍲❘粉\"湭հ旇ၺ櫞ᅲೠ琲㒂䢉哞ⷭ䫽彺䧄i⤣助㚖䎍勷⯭睸䂣吺㗋᪆❗檊㚼籤ᛗ⠍㭶₫幻瓉⩺㆕啠ț➙䬸䮍㳙洽嶑⮹栦昃᪶揅狄ᐥᩀ哼懬焬⁂籢筁⋕㞂Ў嫉杆殔Ꭺ擧墊ˌ㪸ⶓ⽯勂縈恧溝䴹わ塰ῂ䯓墔卹皼䚓⪹]偞彛児䝏⡩倭瑡ḍ檝岈㞀ᢄⱈ栖㞀嘱嫈Jᄺộ䶍叾浍ῧᒖ߽ḯ椂๑䨹㇘䃮Ꮌ㸺抃⚰Ӹഩ䨊ᦉⵑᏴ㜦璁䞰瘖掋ಶ冽⦣ᱠⵖ唠ߍ卄㛺翅枬暯┙䵑樺姥᥍佗㏘㴲⺍⨠Ⴕ枔戭唂ť垽ᧇ憳猪㓆搡ᙢ瑯拦䲠'獥癉য়汋䓕ᎆ㭆ᚙ䘢捍碹⾅楻旾ἳ恑㒢㱷窔ᛤ敬惩䱵牽稙᷋ዲ毸㰛ˌ㛵•秆棏ӷⴅ泾筩ᷝ䇕⮉㉗⯏䖶掕挒湥峹⢎⾋ᵙ殰㌪ᆈ皣䬗竺汁橾ޝድ㰃㗦揍盵‡稆潬⼉朝祿嶴害䭜簈㉺䄑圥㠍啴䈝汿妤㸧婞宯㸮⾛㞪ḍ拢ᴝ击㗣歛א߱ḗ垏埜狌Ᵽ疾措㷧答栐确➘仼擎մ䉳淾吔㬧㪕䞿山垞⩞昶秾Ⱐ⤬幃椾痤ηᗗ㮈焖䌟栉灏帍綹⯕⦷ᩯ៧㵓ᴆ᜵杏ฉ峽唸㻋ⶒី㟤㜙亵緽ฏົ兞ᇫ㾓䅳竎༔ຽ経䮐㻻䓛䘈綷፫眼耏枎ἳ瑝ጃ庍盛喰Ʒ生垾纾櫏䓭硤吉ᷥ榛寵彷焝低牍嘖澩喙ヽῘ痪翓༑伣㖾侑弣௮⸗嫏䀠Ґ⯠笽樟潀瑗ᤒ࿑憝䟿瑏攛䁉繨Ⱙⲅ皔ᘟ眂窝知㉏嶞、㵿冖䀛爎㦞繏箞砐䌆㧄‗噟⒔垇缞㡪䜿ᢍ䢝㠊眰П䷑3ޙ礏奀>㑷硊ᜅ㐍杸կ夣ᩤº㪋剜氃彬ֿל耀₴哰〣ど拀ㆌ翁ٿ堣㔌睐ҫả吱彡⯐⽍偂Ⲃ惰Ⲽⵋ惔А㬣́ཌྷ媫塣∳¸⭨㪰櫅ᐬʚन市✳篹䥢⨸悼Ѩ❜◅傸Łᙣ❈ゼNJ䘑璠慵݇寜ᨴ坫ݸ❣戰潶ئᇢᓌԅ䏢媮ヿ⦘䣰ࠆ僎㫰ぴ䄼烡磏䆽⌁࣮֮䉂櫈瑨イ⁜栳ք䙤㻝″ऐڄ㹂ᤱc懊圄Ⅿh怨⹍┴䖨⩂㠋䢱㍴㳂䐷╊䔛ۃ庩Ὂߠੑ⤺供ᩰ㊑㴵䤋磐㇃Ƥᢱ䐴㔄匽呜婚ዡ∿梾祋冂㈵❬箄㩂㬋ࢪ⃨㯢翎墥Ф∢吅^䛸㵣䀄羓䖿ᎂЍ墦䜌㰢〧㣧窏市櫁�䙴㻬㼼ェ䕏䐢㬻传⒜ふ悾澖ࢹဂ䬊ಘરໂ伾ᢷ䒫ijコᤈ䢂㲙✵Ĺ⁵జ₇セ䘞弳ҳ⽕㥐㜣ሾĒ⚥ଲⵏⓜ妀匡፤⓳媤っࠪ撬ϒ㊲戆ᣜګ垳粸㣡⪪✩ᐍ⎃⇀Ԡ炴缹◪㒂₼磼箆ᓱ㊿ᓦ♀Ͳ媷䮄⌺ੰષ絣✺㤲䊻⒱ㆺ∲揃㓕⧖ᐜ⬿ゼ婚╳䰼ᔐך❲溰璹⊺ʠⰢ㓡⩚こ溳┝ރ呒䆳生▦⿳⚡ࢀ斮凲䦱㓵⛂㝝⦻㒸⮆㯂ǡ撫㠬〜ㅮ䲯╺㊃▲ㄈ䩰⁘䤽▀䕼⮲熅吻掦⽣䐆⁶搿嫒ⵍ泜寠䴠吏ᅢ攟䫼翈ᴁ摀ᆹ泞ቮ⒓㶸䀥摀൵ဥ璉杚㒳ˎ岭揖㗢ጶ⁽杮⦓䞷䮃擦⮓掳峯₎ْʵ士♦㑼ឳ䳳䫞㷜矀呉⃠ᩥ䦳֘ᮞ㠓箳䣔⒯䰒㾷粽☡㈪禀Ⱕ↔怓❏ˤᓮ⏒渶‴ᚩณ充䋫戅忸ⅢჄᝤ傪倬⋔ᐾⰪ搦⊪ᕎ㚫䚽碸Ξ㍴廄甲ᓔ台ⱸ畏㉱㐪悼拓⧑㞪䮵拁ដ嶪䱸℘⬑⬒球Վᚴ㼄⁺Ҳ橉㰄≾ᓑ毉ⰵⅥዧ⒨㡠ᱸ䁎ᐹ⏑㎧拵ឃ哫纸㊫ᚩ㦪晴㋉ᑑ㣪屺狫ᗊ䱱犧ᑁ☕摸拳䖑ㆃ摲䣆旄ⱃ婼拰嗀ሸྸ磇旮⏰ㅱ唁㎫⥽じ嘅䨠穤䓙ោ㔄祲䈵ᖙ㬼╹䓅晵㜳╌㑰拠咒Ⓗ㳑毵♱൰䬀➶㨓怶檮喉☴絰⋹⁹ナ典᪱喵㍒◄㔏儊㚋㎦喋Вু笽⑆坼◊ヌ嫵啌㶋ᵵ㼬暚㫲坫媣䗔㻬㭶嫜夂罡嬆柹圊䘿㪣坲㴫抇垆ᆐ㪽竟凊䡡ᆨⓑ垒⠻ᘡⓀ☽㯋䥾ڪ㔄烷勳䔺؋:ڶ搶᭑倵ܗ啱㝝⣽䛯祎セ፥ጐऊŰ⠢亝恝㉋岵抪㑠㓲㳼㜈㼻幰呆㓓㌬㪸暨ଓ㾐ᘸᜊ㘓⌻皃曑㛳⸊抲楫㖺䁥㚁䵵珠吹℺ጃ朆ᴙᚼ䍺嫺籉圽け۽圅㞻㣻傼䅯ܹ⇊丹猉呵㷋⫷㗻㵺盷✂攅䷻泲焙㞃䷺ࣺ⋯㚼㻱⡠撩㕋剚≰༚䝛㑼燰擅擇⽍簊㑊⌹㍛姴盳㖰筺ຶ䤷⽌㞡焿㛌❌ᗲ㚪新ᛛ糼㐯ࡸヱ䙹ペ甕⑸ᷳ咮畄ⵊ㥵⺷┼ₛ煰亴⾩ㅿલ癀ⲿ䬃ᕪᆛ秿⻞ፏ㓊㪱廸⟋⡫䙴㓶ᚗ㥊߽k㘏ⶓ䐭咸甅䰡៴㺬ᘑ媺㳛痊塰Ƥ璨圛〕濿֛皝␡㿼⛹甠紓棵缊瘞䰠㣿杧攽怭ù睠焣✽ĴᏕ⛣㫼欝㝤崦♩䈟睱⾩硜ഊ㒧і岹↚ؠ劮⋐ċ㳜㡔⬈䦠ڧ⢏⇔ɐ梧㨎懺ඐ枦㪿懮毃✽恸㮒揉ᆳ⯚ქᇅ旨甧╃ȦᏜၜỡ⢈燰㝫ᛠ畹㑽穕刅㖸旐殲Ⴍ接㬧᭻䆶䦠ۦ桠刄坘杴㏱㫅㢘盦ⲱU࣪᥀俴庠亦ᡆ矶熧甧ె䅒্盤扇犹ᾉટ㻧ཷ罴伐擕㾼ȏൟ䭆櫉ᱦ⌹㣇ٞỄ坤泆ᙒ⧅嗪⬚㩓ል埴筇夀㐴͟㚛浜䧳䘒i剕嫳䨔症⌌ᦽ✬浵䎽k͚ᣪ卑㣹䵤性獓ᨅ㓌皆濺粖ᐬ燧ࠬᑍ俧㘧ॿǥධᾇᘭ姅枼牫✴懃磐粋❏㣃䶕㚓党梱椅屧╅冰倶㬚翋禧€簢䃐⳱ᐦᠷ渏秦丬笳惔Ӽ笢稪疱ඖଧ䱐燶丨汨ҷ䲠፴〧⠤ी声㨯籘ˤφᆪ䔈揺ତ䢌ᰯ␁㝜磑䘅㒒睑縺⤣ಧዚÞ࣍ప猜⡣怳Àṁ灉剳ƥዝᗃ◑ᦢ毇⡩䠳⑶ᠩ⺲㖊旛✰そ⼹ヶ怪ᗴ㮪管ᗞ㏪抴囜嗎拊澩焮喷㎃䓶曔岯⾊捚䛓妼⹀ᥣ⛓瘓Ɀዶ勝㗙ⱹᇐ痼慚搠⻑喲椦珷㏺䶿俶䋟Ὗⰽ⋷盛ᗥ挻ג嗭㧊祖氇䷹瓠ࣶ櫋ᆀ渪瘷㭘淯ⵣ⃗㇔⸎捦歰旘疪潚痷㨆涰济㒗竚⥓Ά旖ǝ᷆涪汗緜ⷾ淠ᦗ䚠䷄淚瑽珖东丞垗᧚㢽î絇瓷ଳ汎瑗♮巠灊毗旔睪澎簣ៗ巯丞世䟚⤠NJ例ହ᧫⾟᭫墝和白㮻帽䦋ĝ筘㈣綏ˊ筙塲䠼㮌ݪ弍僳澋ޯ尓㐍䅄ߓ橣楨甥ߓ岙瑫䤝室崍帽斘䉑境粎ޑ᭐㮉䶏瞐⩔㼝忋羞珸嫃䭪ሯᬸ㧝砿உ䞝岳䜍夋㯙申焿㤌㩪㴵嬇䣋Lj㾜暿ẞ滆㓐⺩ᒷၴ䊕䗒ᦎì墎縴洸䯄屡⯖⦕є彡⒃㦼湀Є䈨搢ന◜䇳о昆⣠碸v䐁溿ᗏ䂄०嚀‾ഞ帳崗挑្汓吣ഔ枣当吡ᦉ穌尫允洌䮮㫅䮽榝柢ᔓ䧃攷柪ぽରេ㮔㡿⾶ᇉ㥜洕籎尐捵㐫‶⨀᭝砖հ㞹䀄答㌋឴䍓䍍猒朥㻓綴䬁柨ና畎榍杞䛋垽欆⢞㲋兽报城瞋溘✘㞙ᤝ磽܌䷇म⊃瞚㷏ਂᜊ果⅛兎㴾栄峻䕼眍璡䟻侾༁堛⊋槾⼵垚䂫䦊弚ឍ䜙壪弁Ҋ皽墅༸礊呔㼟᜴ॻ煽缔圻㽋盽㗣乕㼓絿級དᶧ秼ማ༈糢㽴唆ଌ糧幻㠦A攩ㆷ稐⾸ⓟ⅝俿㧓濼䦜伴峇殿⨃枀翇燼昘ថ繠⭞䗤⽾㼋坞乯⽢耎皮䜒Ϣ彉慌☋矌忒疣⥲悙➨㇂囟խ⛵㛃ሴ椄⠢ឫᑓ沷䌖⊪洌個㡷玽⨊垇◇䇽༊ཟ㳷䭜㬏ሆ᧴䆬套⋲ᓼ政㥇≰ۯ磜ⴖ潟㢗䕃ḕ潥㤗嘪ⰻ濞篠➼繎a紪࢞星瞅㲯募␝瓑缧粜̃⾇㬫仟䁟ᾥ竾嚞坔熦䁫亟丗⎃喿婼ਘ快㺷緞兩潐Ɨ寞机彾稗砓縉彍簨̱圀ྪ糋滼搕⼰碇抟ࠍ埃窈揁化㷫线窬攷䁈絉瀜䤕⎦澕納爱ஞଙ砆㱇廕礿栏⎝Ȓ怵弫糣狟䯞ᰘ䈈⻍⼝穣桟ၽ倗䏥ἱ㇇П娎ᵨ䠴䞥䊩䄩➓㠘བ牬䍝嗆㉏后値缉㿇㹻㮗殟⾝砐佄籧牀㷢樦壁禢ຟ剐፠幹ᐲदȰ傠䗄大煍Ģ䈟笠ᛟᓜ怭߮⾐紡犯䞡傛〶垢㹣筓摀竅灅⡝⃒ʷᅰ㹡⠢⠺㣄烰Ɉᮿᱹ⸪㡃₣呠㓞ࠤ砉廈à㈜㟩ē綔ए䊾琧ȃ➿ǘШၠ盝䈮䄭悿·匐㧡㹸⤮灢繭᪼䣑ဣ㸪桐圹㳫盿垞⬚䈳∐Ч攰炜⠫桍Îɐ੨ⓡࠛ嘏䁥䅏碄ᕝţ夬ቲ䐟獵Ӑ䋡ግ擔憏㧋䠀散⮕⁓䃀㶵珻䟁縥 ᢁǙ珬ǣ᐀渦ୂ䌁㙰━ᘥ墉Ἅᢀ昢籦羓ɢ癯嵲䮤畁峊ᛅӄⰁ䷓᱗㍟䏓Дଁ䦘渻࢜带ސᤐ徝☫恙坽䏲෯бgᗆ䑸ᆳ燘䢸╀㨥ㄻ㍅Εᇤ⪰籤⤩㧊绌࠘ፏܣ焬瑑Ⴕ㳖२➁㞦ⰳ䦩ᆘ䐲ᧅᣣ䨨牌䢫䳝䑰屈瘳⏁炆䋢䜈丨䦜㒭ⱎ䤕䊛癐⺾庥䰿梋ᆣ܇䛘ѕኪ潢⤄㕪⒥䁾៙䩅㟞乭⁴ቯᑃ種忡䣭䊵㘁⼈䟑凱㣚ᛊཀ稥ሣ≝ଔ⻡䩧⸱㒛㻰䝺ᇐ帜䲩㱕⣧⍿琬៱冦漆ᴼ㧊䷠㿁庫拪ࠬ∱⃦椱ᆁ䜐ᄸ形䢫⩏ゲ棓ྫྷ≡䅱⬼䲉找䁐桰䀽柔౻ᖀ渝໗峱บ渷ࡡ㈒䔸ᖠ巃䲨㩝炼䷻ୈ㛖০☲炔ӭ䘩栧 Ꭳ乇悼揅ॸ⼁㥤ḽ梐熱䖶ᴸ僢祁⹎悼䎯൧䯤䘥紻ₑቢ㡐ᢸᘂ劫う⣭搛ㆱ左䬳ߙㅈ䑋⾘疂ᎃາ碹掞౬ẑ㨦漷ୃǹ䖖ᕨ摃䆪婁Ⴢ挵ய䒑⣥䜽䜴ਟ䙫䪒☳疭ᒾェ掆©嗤悸౯ㆶ䒔ၘ屃伬繉侏抽ҩᏤ礸䁓ਇ䔩倐忁Ѫቓञℨ佈㘩㳦攺粌ᅛ䓁៘堂ޭ≛砠∤䶾侩ߦ⚃扦ㅙㅯ䁄嬂侨湏墸⋚ྜ≩㩆о呩㔊▁᜶⦲硫ಪ㹉磠䧜㆑䅳ⲽʉ凈ΖᏀ簲呫㹖梣ት㴩冒Ჶ㊝䰡♹ᘂ㖲⩪ɀ᭐卨互㢰均堲䥖䞦መ侲剫祜ň剸䡬☴䳄㢲ₘ⥍䖭晚㹳兯㷮ᔇ抔䴬ⅱ⇧㲸䑺⦌䞃䉴噲㖮ᕗ罅ቼᓆ仆㐴ብ⟼ᙄ纲㠬䥞䔉ቫⒼᯉ◨⚵㇐⩦杅ⶪ⮥↙卪䱸㳉浄䌸䊕⥯Ҷ᪴棳楩ଥ㓉ⅇං㤉㲥䙦焽㙂ࡍᑹלऱ僠ጳ勶䧃ঁ慄弸䩲ॕ✭ᢄ婣౭䑱璻匢䭸倹柄䊱ÛㇲԱᛸ䌬僬ड़䓗ᐓച➉硧ᔷ⩡椭◿䤬墣䫴㙛䎉̡儴┐㈂溷嚠㙇䌈䱬焠乫ᕗ哤㈲䫊ゑ巄劾䙱䤵䞃䅬吠哭ᵛᓤ㒩䦼᪹恅刋䟊ㅏ㢫Ꮛ⚳咬流Ӣ扱䷂㾉㚄缶柘姨穆È⣒段揣瞚⁏״ᨹἹ㖿㐮姪ਫ਼ᕌ澂孭䭉䳴㐍ୢ㌹瀫刍嚎姊晸խᇒ们歍ⳑࡀÜᬑ䗅ઽ柎Ṿ攛尲䣬㍆䓝卹䰚♑⏪ζ䅗夥ᷭ㲓䇨筅泴ᄕጶ㏹氠敂ປ榵➍ᖌ糒凮≟甛㌃䳮㡦ଆ玼㢔¸塎ᓔ吘㪥䀯᳞勣䱎≙ᚆ刺㦜↚ݼ湓䷭独㉹ₕҼᒹ稥拪ṯ扔柍ᝬ籲ὯݜⒿ刵亮ㄑ樇䞼ٮⰻ摽ᘂᠡᒤ㯣ᾝ㊏偞⊰␇憻䱻㤬撗᳜䉃巨ㅗ崐ů䳱僦搻ᾱ俄糮᪁Ŝ䐳̲罎y獾䣺㳹ᦇ⢻㹺ᨗ断ᛞ䀒㳩㕆ਡ㵢◾␠⯤厫㱝㨀⟹ᙚਪ勠ዦᓗ勏䱾✙⇅澲摴ׂ玀嚢狔ᑈ䤸㳏৫ȗ䭐罨槏㛜ᔅ䇭ᐏ㩩ⷯ卐䋫㍛䷊㈥䏇䃀憛ᝡ⫢挪᱉籌㊉懈િ䀡头ఆ暹ষ析偼漫恉字擛㎨ࡄ䦂㤷䠻冘绿穽ჹဓᡈ摴抷勯ء㊩Dž璵牪祅摟ᢘ瞅えł抻悰ศ瓤⊼䯗䖠彜䕲᛫Ø䊨୨ⰱⲠµ㞷紬☀晠ۂ㨪癬㝊͐䶐ⷆℹ呶ॣ䕄ᚮ᷂悁ॉ㝘⎔䩹Ꭲڐ㈥ऻᑛٶᖺᰲ瓒Ṭ൏ከ䨪⹒㬼᪶⩾ႛ䗆ࡴ呌垩猪ビ䌃猟㉥⸷㉺ই䧩⠐夲慪搣⋅收ⴁ㐙㛢丸⪝樐ᕝ悫㊫殩É匛આⲑ禵箳妎ᤷᑚᐩ猱ೄ᤻䫐x⠥ڴㅲ⧥䖗ᝒ筫⌂怲ɇ䮵吙㜅ไ䠬º勆ྒ巅璣˂ૅଐ⧑㿉ⷧ᩼㦞◖攜帡⡋惍糹ⵌ⬁⽜䔾㸒Ĺ如縡晆Ѫ䓪⅍Ú㋯䮆⮉㶹ॶ᷒٬噮汌縃↡‿ᠩ⃓䳐ѐᥡ㥶䀯ᕝ▄啪懪⅄猏䨹⽎⎵ŷ㥼皟ᖢ唒嚼敍䛨判䁴ـ۠⦢祶喎夻䌰老㫉࠲䫦䯾⬚㦹㩷关ᕨ壏㠺峁ᇊ⛉櫏⫊猳ʕ⍵捴玶疙喉枖Ⲳ忒孏㹥འ橍⮙㤵⎶極ᖝᕪ晒墸㢊Ỉ㈡奺ƴ᭞漥⩺剿琹囸ᴒ偫⋌嫊᪩⯞䭥⭥䖧䵶㗽ខᴲ㖊䡋ミ硓୲ⰵ䆆㬰䖋旖ᒶ嶊痓⡨回欐ᗕ⮑⻕ᚳ孴䆛祺ᡊڹᅂ友&㪨檛ⴲ㩕䥷䭿⪅㖡䏮壚仅寊♡椤儳ֽ❕ცཹ〺㈷栌峚牒䗬䝔狭欫卝⌕瓹έႍ⹍堛᭑㰊畉㥛嫄⩷ⵍ⛵壵浿උ拿坕Ᏺ䶅悉ˇ䁫_⤭㪮塖ɿ⥱㖱吡基熓矊໌䁻ഀ涩➮穷䥀ň笾堂睄ᐭᇉ㬟檏Ⰱ㠭䇶䃳冉ȇ呸扦刋枴狛䫆䅒ƛ厭ⅷ㣽⎛㨊ឤ姂䜋墌㽯䚩․渱剭ŕ檌滜හ啜抈᪃᷌擅⋩䯉⥥♕痴ㆰ絿ࣸ⋉孺屹ڊ᱿㌎䩳✾˴僱卸啶嗫រ瓋ಊᓑ牘䵔ᓰ䕗े䷨㜞媦瘊䯩ী㫑᩼歀籕䝩ᥑ㙸Ȼᅂ熋⳰珏丳◅兕瓾፨i㔊歝禄秐歇栻Ժ䔕棖䴬⮉僅㘩嚶湫⣍㓄ے狸ᓋ㨠櫗枯㋞ⷍ㒵凶慻⚥䨯⊏ᯮౠᏭǔ死⭯ؕ㔉壶䌻䶌ش㜛⇦槴䆍䇕ࣹ玜¾䌆і滭殎劦M媟ⶪ〕⅕⛶嵬涁㗭儶䔤箈᷂ۑ橦滛㎍捡ၹ獿憅䄬凒䎓῍秔桗季ܹ⑵㭗䎃䵿ᗦ妖弱⾈嘽皠㪷ኧⓨ翗ᦱ祤䕯亜䩻秪䳛⛓孒汶∽အ凶侲犤瓭ᩲඳ㹉暶䧩歳⺙䃔棼୦ⷁ㖅帶弰㔎ᧈᓄᄰ䉰淖⊳ㄴ僜瘽徢檪复⻌嬓婹濧㮽䆖䝾㉠嵢瞣Ḍ䑔紎◹⺿உ榙㺽Ꮤ楳䞓ᶘ癟Ỏ峛缰炣⺯ᮝ灴ᨠ吶ገ䭥嵶琷嘊ഊ亱刭汜⸡䮕瑠睼ᶖ瞛围⁕⩆㨸ጮ憲Ƣᕽらϲཤ�瞐汎扊㬎揂㫷䷯Ԡ⤕䀪㵱㓢亾䯁刍䟉˜箣泯⽹≧ཤ浙ᜋ岾绛⨉ᚢ廲箵咏⏐㳐寳྆笅璇娾朕៊楍ۺᩔ⯏⟙䏧寵礲ቫ䦯婵ₛ稍៙ၹ॥གྷ⹌㈔៵⽸嶠㠖圎続ᳮ矆ỵ窕ᅿ㔚ᨗϷ⇙〠ᑳ嘖䈺䲲䟔绘ǯ泷フₔ߸杣ⵉ璯嚾丛瑓忘滅㡋淟㼝ไ⯿㶑瞆哞綸䀹�曃寕毋⛝⁖瓾睧縙眠㌾皚瞎⿊Ỵܫ橃㈣㌗䫻佶ύ癛忾偺⼍㿘㼇ரḯ㔣朕࡛呑緩㧾䄧ࣷ傜㻕竔漷℣䦕ၐ澛ϝ盯➡䜧ా悟㻎穰ᴯ㾝㼕䶶ℚⴴඏ弞缧ሻ濔紣篸ᵿㆣ┨氡峂綴眭兾皧㨼炜⪬᪼漧㈙䌮ቬㄚ䐙甸㎓⥨ᘋ㷘敇߁楐懭寵䇴殅䍱睘㮁炛丿ၾ䄢籃殫ᶍⴛ⁒ឆ䷆ຣ宊泻҄ᆼ筮⑨穤㍔攫㤰㖶㕳墠㬭凚僨̊ไు㠤ᰌ桹纍穇巡望㽪⢍伬䚊昱凃罓㹉ᱞ庎⯔㑏ध㈽稰ჺ䉢ै懁㊬笩ࢅ⎍ݷ咾伦瀊傍╎䛥砆広挶ɋ䎑䬔䋌㏱尳Ժъ£綀࿏咃ય∵⣼ͳ㫜絧沄䵵䘽ᔩୃ㊇ጏ垦▔畟嬌㽧䄯濾僣簮ᥟ儡嚥摚㮍㶪㔹㷧Ïʉ㕸ᮬ囘挽㻇㙐捣ജ処¾㯞∉媆ᭁ㌵桬畋㤉扸iᅂ䒻㢓㇀戱ᴘ稡憮繖ᤑ挳࿏嚁垧焼Ṍ䧊嗳ㆲ䞚宺弥ȴᗭᯥ弪窺伊劗㈏䠖ᵤ甞ٮşę据ᔂ㶉⽆ܕ獚䝅⟫圀Ð㝈㕒磶嶏ด㤏ᅧ̺ͥ䋅ὤ竃ถー玞ᵥઊ㿭㛇枱丿䡳↞剄㛅杮练ჶ挿ඪ㲩䓇⚿粙¹⛮拣䏧嵒瓯㋨ᥚ㤹揇嫔䀯ᵗ⚽ᡬ羊㡭岺ᔑ⏦倚㹱姆䆸抈ਉ䝈ᡴ棅擭澭㏹歸潟㺧㭖㣨⧷䙥ᨔ獓劭楖䓾㌶佒㜱䗻嚚ƶ᷃ᛂ≧䬫⢷厴䵖㒉䮇ኼچᄜ枅ᴬ篣䏤䝑果ኔ壨Ἢヹ粽䱣㧫ᡉᾤ抓⑭㍘桮㍓䲼㥖紇昼⺝⤽暺ῐ✓嚯ˇ兙٤䕻幣ᤇ箸᪇㈆枉Ẽ旁目乓⣢珌䶢┙琨帳ᵔה檀¼᪐獵㝓Ⲭ䄊㤞掇ᾼ⊆䦳♯ᰜ皓扟⎗㎧䝡㘔᰷瘬↟櫳䗌䤈縫檕⟥⌛琉䰾ㆥ皇ܽ暇֠ᝍ᳜砫ፆ棝椑ᵜⶫ楓ᔘ皦⋵ແᚭ䡈熫㶯དྷ按玬䶐䭆ѽ枺攁១㖾䕫煏寫㲨⢹ϟ浹昚嚏◈Ɣ宿䉫㑏⥕የ掟ཱྀ㚙擧|熉▲桳䗰瓫ယ墲狳咎Ⱞよ⠐㲒㳫唃瀒糫猙㽙ᳯ猡仹㝅䱧Ḻ皊⻧玜壈簫ᕬ婤䫨Ⰽ烸ڳආǕ堸䵔昢࣒石⏯ⳟ┙同⺖㾥䉶䮺料ⵜ圪濏媫ᇖ⌁⮁⿁㖅殇ⱻ妉䧜ᜰỿ㑼㊯⾱⛟砠ᙝừ檝嗫៥Ẳ曫熯͐猂䯵⼇䉠欻䔵ᱩಷ各䓱慭⛑䳤⮸⳩㴵勶䖏䆮䬖并宋劖⺰⡫⌡⼟ᛑ⏷礻溁䗂域ᥚ憋業杒ഃ䯋Ⲷ䩰号䫱Οሞ瘂漤構䖫Ṛ૭⇓⸚㽕奷羿Ẁඵ囎寸䨻䭁䇑ᰄৠ㓈グ姑爎⑄䉆癰砰泰卧⸾㕙呷継㗫嘦张䊻ᡵ⧕䂼ᶤ涓㉭慺糽䟘梄䁂J喣录ח剈嬳琵㕰撶獽ᖍ姖ᛱ嶆櫋䲌㧕ᛩ偒潋⧭烖㫸ᎈ䶡㳟ْ佻掌犯܁匬湥㖥獗㡻䖝⸖㛸ሶ系敭恲䣫尌㢍䱊ڣ犑ᛁ㜝忌睳呌曜⬃ᯖ渝㾍崻絼岓ⷂ㚣巶灛ᧀ緜䡒珆洫㺽䟶浸⎜ᶻ㝮寖拋㻎硔眜涹淎㳖禖ᔵ➜硘活ᜠ楼㶎毝䏖㰒涝㲕猷㽿ᖕⶫ圽宮移⊏ᯗ晅㮣湦棘⪗瑑僦Oɓ峆瑐⌨柚漆缍潻㐕䩖⫿妗巸睡桻䨌៖儏ᮓ浯㍝檖籫㶸⯯嶶犋庯槔挒ᯪ洕㽅敷対ᚂᛁ㟏婮梻『叓碵ଡ洳䀝漶狾⾌ḏ坛彾稛壌插⼟㮅洠瓑砖ノĀ◳䔕太ᑐ㳉员ǬᖸῺࣝ歶淿ă巧矚妪揣堿ㅕᵢ瀀綣檕禋儉禦༥婆级⼧囋䈒‼ὠહ渗庹⾁緅㟨㽚瘛㠼矟Ẑ粣伮㉛焍䎸⯎㖲䉻ᚱ痒刊㫀ᾠᑃ杷㾼ជ帑࿈㭙❍㒗ሙ䟉氠盃䣺䋻军␗䞔㱶毋奍䒜⼑䠚㚸瑭崶䱞礄澔ཟ嶲ⰱ⛍痗抅封⻏㤣吖ᑝ盝揂暈㬑欛₽狺抈⟩ᵈ粰ᓭ殡䴤Ꮑ㛒㱮榛ᴼ䢙৹ߎ᳓㗝䒯濽儈东互㩞昵媽₪伕䦷溄獞Ⅿᔘ⎷彉棧碼䲗囫❃汔獞㍯㰆夁嶼墦㢹搧Ŀ䝔燲ᭂᶴ紽儚₺唑Ꮦ众昂矧冿㚖䈉⒆濾㫳簡⚡↼Ꭾ垼㿱橛⌌ᷖ绢❧ᶼ稤࣮惎ᴊ揳絺㣈指䒌䫓槡䞻瀔结䏮癘紅珏仯幩杻岼翙ץ笽Ὥ㮽䐯╝甕㎰媡㰹灇⹇礥؝⟩ȑႍ䁮䓾磋杶侩㥔ᰇ㴍埝৻䞗Ṵ簫兎㦡ጅ珒⽋¾睱嚾㔲ᑥᝨ彌犫淮员ഓ揝㝙㻴㜷ᅽ甶宴㖠㎵牼勛㇆䶸܉塶榇㾼溘ㇼ⠈崪畍䋎牞䬃曝眆圁犊硿濗凳ᰊ尢秋嵧ቘྟ䷮孲㱕熊䉼慾棭烢垐看䈩峝ᄗ䰟侚巅揧法▜僗坏ᶚ狊䯏䤡ⳓ皬⺫⡻綒⧿垶尦灋囏䇜✏㐯嬄㩭畛䩢⚛ᘙᮩ忸罓䠆嵟ᬒḎ盍㰭灷⳽ⷮ枮幖燱怗⣅㔄ѝ㊨㬡焷彽喓⸚㞋ᳺ燓廖巛䤜㯴皀Š᥀ද㢝Ḍ瞘䴖瑳徎⧘༕湓㤽纷ᡴឝ㤎枀哮灩懮牄珓潭㥵砇殾ޒ缕圷炣漎៝挆S潳宽曧㶎慞⸇段嵼熋渎ぞ༁篱漣婽愗揾▙䘈ሜ䆫㲰ी堧ஊ㏚Ҁ砤㸯䑜䠬丗❗岎瑛婏寘挆ௌ⹐糠य㤿⿐䏹ླྀ㻇㹥━厧垘寐䝓孠ắ佬Ა䗵存㸡瞧帎痜朕仭伈碃湧慟䟕ด睇Ὗ⇧姎�圗䠀Ḩ紣林䏽撙ᏹ節⑿圻矻橜羓➧箌洮疗湟攑弞࿎瘱緋倗窙㏝ἐ涫⡻檈矮甋⟮㳹ᔉ瘾嗘ឍᯞỗ㹳梯ᡷ崚珫柡㺙畛䜀朒㈞晓㝂笓湯Ὕę⇨ဒ䳉燙Ⱂⷝ漎៴癱欝桻璖羓价㶗デ牾䪝☐ំک桝搙⣽璧؇坆䇢糛杯䚙ᘊθ乡瀃狯۾嶜毤紧展筵㐾䓿喚ஸ⯦綋环ࢼ䴘䯹⿑ᴕ瀷喿喅琚垈繒症低涝᷒㻊箧妾纙☋ۡἕ姻熧䳝叕尊㮙࿎ඎ纷媚忖揂㠎绐߽ᥝ⾑༜濧㹉熇狾綞ӥ凧弄㾛琿㯜婚樛瀑㸽珧忿斘В垵御祠䘇ᢜச燗ܧ摭㟗狏弞ဈ༱硰矏珞燎粄繋唾䈖√៦眭㽼ѱ㪟䤙㷡Ὗ㺵炯拿纞␈㽐簻笏䆟⤒䑲崀瞷兗њ縓倜矙繇瞿叟ⵐ䣴宧洭璞咏剂ᜀ於䜕姷溇㲝ജ⯢⾪綕硞䕾枟揀澿࿎籗愇凜慿埈ἳ䀌癴᭰ᴟ缎ẵ缋澿殝嘗爆࣎缂猏䆐棘氝ெ硛炿徜⸒罶ᐕ徳祭䲞ߚᣃᎴ柁筌毿盝丙毭ᜡ绋爎僗娟␌姨㿕㖬淿࣯夘Ⱁ࠙紛簗忟␐ῲ绾禬珳Ͻ氚旤体嶜眏䌎䐝䠛瞥㼫簉缗纞君帀翀廞罟悜ᥟ挔䠚㽺㵿碠㚝ㄗ倉忭羻瑿䫞憽枭Ꮜ⺅廿硿哎弔䧹羋羱皝偱璚䑃㿧缰ට繟ᐞℒ㼢㳻稝氟倘庑櫅ᰭ翊㭬ࢊႴᅝ煩⏇嬟༮⍨ဥ祓ဏ䯈䝉繫㲇稟瞁漠⽎∡Ͻ怤瀨ຏ湶彗᭲㚡ⴟ愊ـ၍垟⳾ໝ哙倮᠌㿼㢥ႂ㛴洧䭐ीፀ䊠幎璼䵹瀵䗽羷Ὡ终巻碷焘Ⳡⱇ២⸢慚段埭俏ÎȒ͉秫眗戟䄟㴡␜垹ᠫ䠽囡䅅ƚ˰䋨棷䛧ἡ榌吪㠎偘ᝍż戸श拷䪑㌡䬣挘↶〻ⲫᑖღ⤘Ԙಌ్偠䔞㨢∦䨔ЈᏰၰ⡿Ł˄ޘඨᰰ㿠䦡⩹奛ʒቇ恍ၡ傀乨˴Ԩ༨ᾀ⫿ᢡᴢ㝁縱搲䧪羶ℒ䈈䑬ܬ瓨ᗠ㢇ṡᬢԦ倨䐳翬俞ᵞŭ˼۷憉技⽨ʡڣ渤䴧栽く㿍䃢䄺巰җ眰ᯀ㣰㺡庣䋻⨐嗱ₛ䃕䇭Ɇ۔ॹ摰㑠挡✢ᬧᣳ〷ၗ⮩䃁眗⦦۷惘壿⇶爜⠦瘮䰰恛₁愋䆃泃᐀᎐㿟⥨㸢亢㕀е恀㊑䅔ȫ祬愀⧫ᯡ砨粲Ĩ⾤ࢇĖǚ䑏礢ዯ坤㩁樣砓堼硚ࡰ᭸⇂緷穂ๆ斨∄პᑣ㘑Ȫ崥ת灸ᕄ䈔䋌ї瘍淐ⱀ孡㶣ᄤ〬㽃࡞䠼ſ˘ײ憝什泮֭ಧⲷ㰊ࡑ灿ᝢ⇥Ȯփ ፈᕡ䚣ኦࠪ瀾ᗣࢅê→䋂㦒ῐ㘀䫁絢媩⼐樹䑒桭ᄄ䄜䅄ْᏠ⮀硁籣Ⴇ䴑爻ᡔ傓傡Ȅ䎝ۡ珔ᩈ㩗ᙞ猢⊧挆ᡍ䡪眮−䐝㢽牴ᚈ㘂㢁ţ䄦ᘮਸ䡕ᢝႵ䄭䑳ܘኧ側㽁糢㟹渫往硈桳惈↩䌼ᖸⸯ☞瞌㖱猬㘮ᑗᢗ䂹滒䅃偖üക峥ⳤᅢ嶤ू䀢簾㰿ャ⇨布ࠝ猔ተ㘰䌎滣⎦笭䘮⑁㡨烑愺哀孨ඥ旟媰竡嬙ᰘ焭㨷䑒ゑ儊懆䎋݆ࢰᏘ⤐勡䏣咤䰫㼋八䎸ㄏŏ峡Ҿ৸㴐洁敢垦椩㼄塉碎ᅛⅿ渗ࠐඣ櫨Ⳑ悮粣Ქ⬬稱桊ၷℍ慄㲻١僘㔨巁࣡ᅒᤩ愽ᏺ⽸憵䏟с௷Ⱏ侰圡籂✤碒䨪纣墍Ⴆ䲥䐇愮಼᪻䥏㋞ゥ欬䨊屇匿惦䇚嗒㰛㖜៰⡨䅮揢㽙㼮串⟱ҏტᚢ⊏iᣳ孰猡ᗨ窧ሠ椻䑊⑼ࣲᄩ䉏ޑလᗄ㙲ᔄᩂᩤ䰬瀉削摮䣪⹄⊄䚑ᱨ⻐䶱̣ᡦ愐ጀ䁴ഐŔ䔙ଠࠄ㛨低痼㴛縒ሱ囤ⰿ 兡⋼䛷憪ᛄ㚰䒁䵃⊥墭Ժ濩Ῑ࣮䆴⍓ܘূ᪴㋨牮㰜㰚切屒⑽䣉懞㲇ש༔ᬨⳈ壞ᩂ൧堐ా◼ҟ䄀初岮碅༟斴⤨乱禢㑤刨ㄿⱅᑵ㈯懚⌃ݵ៴㹨峡凃⮤护㸵盪�㕣ᛚ䡥Ӎ୪ᷴⰟ♆姂畤碪洺屋㒋⤃‥䌹祗ᄸᚔ㓐䇶狣䠧沮䴸牗硲ト凮ʥݺྸỸ㓄�绣燚獇ɩ橍㮮棣繼⎼䖚…ᓙࠈ䇄Є媣柰撀柯⿐浊⃕℁䛋Ц䍠筡緂玦䗦⌻ٚ≜⩐挀˃ഐឬⒸ征刢⽹㺆ጸ左ゥ⢰几捔ڣಪᠸᲸ嵑孝⚲榬匽م≹粅㖸䞍◆Ῥㇰၼ䉂㎚㼫椰牜ᑫᣲ癘㑥䒺6ᑬ⾸勑ㆃ㳦憯䈹䱠焊᳔拕䙊犨棿墨啱ใ㋥Ჭ㌰噅ౡ墵ㆺ揈掋ࣶ㭃ቑ抃孥ਕ洰ⳮ⦡棬⫎搑䭬≨໑㿂佒Ϋ峀晋咛墰ㄶ搅䐹匮᧬➮㲑䞂瘐…ወ䙗㍛ਲ摅䗧皲ᤔ㳸珱䯣嚲Ω✩⡙塺⬲燉掳䞠䛪̩嚸䶑慴ᇥƪ䜼晆Ნ㇐戻䛻ॆᗼ⁘䩑㌨ᑱष㌰Ṝ椳㢬ㄤ䊟۵০ᐌ㿘䍼泡⏥㪅匲ṙᲞ幒怰Ñ烸瞆╘㹜ᴂᖦ䶨⸀⹊㱿焂燶挊ℏ༎Ἇ䶘氨㼃ヤ氥彡啮屪ᤛ焴榣壁㟘ᾔ℘塱㜝ץಭἷ㹁籾牟挠┙㗆ᇾᥢᘨ⠃ヤ篦癁㣿熀搟䒳ඡᔢ㠤䰩琔灆澩ጰ慭Დ澕冹揫·ຢდ嘨哱㎂㿧ྩ㴶晄屼R爈⎾懰䮅☂ᶸ猂栲ⓧ塯⌻⁌硹ऀ⛹⌯䴇䖟䡤犑䍘⠡j༽晆怤䓗熦㱟䞰䢚ᥢ㍈缩练ɇ⑭䢹㹜≾爼६䈫焤╱摌㑘䩑䨩穆䉢椇幓粛ࣣ煴Ꮡ䒿ශኂ⭞Ʃ⭣日ᡬ㢶ㅄΆ㵐䋈⧫殘仢䷢∰漩͂䡆ⶫ焤㳵Մ絟ঌ夑ၧ㊊漿䁄篁₲㕥汩傶‾ኄⒻ㚠棢ୠ䅮Է嵘祒河㥇恬耈䅚䉱㣠恧䲒⓵疂⥲⣄䪂ę䌐ᩨⒺ㱞Ґⓒ䦟扁䅔䥱䃲㻄宔⛍尡祅泊⅂宫℉㈙掌⛈䮺傄狔Ʋ深啧爤楈䣂撿䓥ፑ䞒ྉᲢぐ૩ศ䮰癫斨奏劒撹䧭ጓ䝈上ᥒ㯸䣐䎲橺墱岳ၼ攩ᤝ㴈ᦨŲ٨ϸ㟍⼡䞳漘幫㲱祈敉擑䨇䙼亾ᔴ㰄珩翠罅ᜬ粿ぢઈ⑿䦴䇾ⓢ互䃸射戾ふᆚ纩䀷↸ ⨉㶰寨䯚ᣂⰘ佱ၳָ⢬ᆎ䕌䟆ᒠ✂䫠ۯ亴恱磇㘠礣䊫灭悄㑎䚏䜙ቕỰઑ平殠⽰䴹⩚抗碵判⟊∵ᥲ宴䪐ㅲⲉ㸴⪵敔⪟㎑⨌厹➆֔൷婈I䲣彇畩ጸ琨檘夁䦟嵦⑰䧑ᭊ⯸塉䦩⛄崧᪳㰬櫎ᤷ⤦前⒚䲿NJ㖿ఀ尕ቇ䰯窽䑐᩷絀ঃ折⛔乩ᨪ㻤夠♲ⓧիڰⰢ᩻学卙␦䵭Ṹݤ婉䋄Ṧ搾䑫牡㓅⦅͗¶䪭ᠲ♔䳱㣳⥅箷窴ⵆ傎汭剋⟄ঁᄡڴ昀ќ罒㜤ᢰᕈ塯㓂⤈ွ.䣑ᶊ⣏ᯁᚳ穦捫䪶允⩧ᒬ⦃剰排ወቚ⿔礉ຩ㫄䦮幦ắ唃⥁剙⠎䳵ࢊ⏴恉㭲㋄⺵᥍㹗擓榧叽␢䮥⌠ȉ௳⣅縬溳敛⪐㢼⧟創⠞䭹ᅜ⾤帉⮳仇劷絙玻甆⤸厀暉Еᇪ幎䠃◅畭㪾䍒᪄哦ㅍ拑䟶佉Ⴚ⯴侑炄䦫↺繗㩫ᓵࣞ砫Ƨ倨᧚⺬耀ٓ㭅烬䜰䅕屨⓸燽叀朖䦃ᠺㆬ竉繒䓂ӫㆳ⍖⨡偺㑆剙╩䱔݂㚻᧲杇浭庸畞᪃㓙᧓尴暚仳ᵆ゠籉䱁繡㽬ᵞ㸱䴍⁕䅬暡䤔ᛲ╄焹ⵓ䳇瘁ᦴ㵁殦璮⥎㏌旙䧃ᔚ㡻Ҩ♓濆㽫椠穲䓕ᤴ剔摖䰃ᳪ䡹Ḝᒅ愮ֲ㐠ᙪആ⦥匋珰䰫Ặ㳔帩孒䥅歨䆴畄䙹㓭⦙㉤攅䭋ᱢ⚬犉敲侠䃬憴䵒勖Ⴤᦦ挱⬇ਥᄶ㏸倶າ▆⫭㐊歏⚟Ⲷ姠㍠䇅䪙Ⴊ⨴剉橓繪䶳䍑♲垅ᥲ描➲伋ᠭ呄䱹ᴓ曩䶸䭒ઋ攉妯揦斆䢙ࡪ㾴繩擙ᧄ㋯ᶿ䭖婳棭䦻㏎架䷛ᅶ⧌曉寒➄㋯8⚌䴞夯႞朩仍ᢲ㼌刑ݓ㶅ᳯ㶲ᕈຎ擖槅㊁旈䖃ᰖ㪢৹㑓熄ᆨႳ䣳Ჴ天㉘杗ଃᡦ⣌暹ⷒ惋ヨ掴᭒䙥᳜㦾ξ旖Ļὶ㎐⌾䯓岳槨ය᭝㡈ძৄ叅◍䣜憭垬筙䚓⫆㸨禼嚈岺ᤧ㋾┙䶻ፎ⤴峙႓㏄斨䲲❚ᚆ㒥㥖㋾旭䱛ᎆ┌䙉ₓ暳绯抻╈湽泙榥㋂晙䭇ᢎ⤼傹弧ᣯ宰捈ᔯ瓱᧺牭擒䩷ၮ㲘嶹秳圆⇭宻╉⺜Ფ牿❚瞗ီ㺝忓䜄佩䞾㝌ᙹᒯㄢ狹寗ધ᪖㙜紹礒唇㏯᮰㝖䪘㓼楮择媿䓽ቾ㭰⋹⎃沤哬疳㵒ᙯⳍ䦝㍭朖䫏᤺ⱜ宙≰Ḇ೭↽䍗庖ⴊ㤦匧擇䰇ᚾ㴻ڙ䟽⸇䧩ླ䵚庞㳊ᨓ猓❧伏 Ⓢ抙㘓ᔅ䟯┱Ὅⷝ朳ູ剑➏䱫Პ㚼䴹㮓㨅熒ྻ⍎ẕ粽祬掩昧䦏ᖾ㌜牙簓⠅䷫德❔᩵ᄞ楛历曵䫽ᛚ㊔深ᡃ㛇䋬㞾子⺆㳒㥠୷⑮俯ἡ䀜䎦ㆱ洆Ǯ羳㽛皆ʧ礤㉖④䦟ᜡ㳔偙㑃瞋偉枾罇纖䳷焦㊏曪䇀密㜢兙簪䒅Ϭ暿⫍ʽ㤼˰⭧ᶦ㣔䙡专㐄䦬ࡲ⅌ŹҨ獪⪛ᩦ⏔䕡䘒ȴ孪皹坒㙾峑狕暈⪀割㮬揹↓ᚆᅨ⡵ⵋ庎峗䦺૱既噥ᇘⳬ歙ଓ⢇ⱏ粵㕂Ⅸ撳㈃犄ᛐⱀ厮⧢䩉睓ೆ䵭硻ペ䋗䧃狝斋䴿㕬吥甒緻⟪枹ࣙ㺚㓒զ杄⣟᭪㧢丙夶瑏Ⲳ㑇䚌˃祹ଜ᠇䷨噱┌癎⸪弇⩌ぽࣁ废ᳩ稑㪆䯈卍ೢ筥㼒㈅牊箱䭏ᅣ⋵妛牊㤦皨Ỻ₂妥纫ᔷ獪憰㕗冐䋔ᤣ杦䳗ᄖ㙢憥缒猵䩉殸壚ㆊ糌楉勌䆿搠島∄₉㾍儫牋ƿ㍋慼䊤㦧៎䠨徑ⴂ廰橜ዙ㱣⡳孏ʹ᧢ୂᚐ⿈峑⛔櫥炓㜴㙎㦺ࣈ皏̚䖆ਡᓢ⸶䍑⾔䠉珲㨵㷫禳僐ㆄˆ䘛猉㨿䲝ኩ⏝થ紒ᢷॊ網筋੶ʪ☔前曋䢕⼂䲙䉲䠷⥋㊲㭏暘⌁Լ䩒ᕼ〗ᖎ↲䑅摫≋擈᪗⋕祓㋝撂䯻ᰩ㐼桅㖓倆᥌䩾⍌慬匃奨䮲˪䝌䡈埙浪瀢畉垾歟㱧䌝؋பវ䡔咉㽜病㊨ኴ奭㖲杋ຐ洲䗝劽ᛲ⼹Ὡ⎌情䝫ᴆⰣ磜ẛ匟◟˰៨⸘噾Ⲡ吘࣫´旃䩲坋榚䲡▶䭖ᖱ䡤励⇢泥瓫媢瓪呱Э䂖ࣸ剾秔⡌劈࣒亦佫䃇⁊侺棛犖∵䮫᠇䲌帴᧒喅牪അ们割㣛妋ᓂ⥪㈴╨⭔唞╒䉥∫綷᥉殴Ù䥷㊱⨇ᕲᣙ㤂噅椫暷䅍♳ཕ㦅拤夹㎗ᘪᓴ吡㺂冩䀄汉嗋擀噺拍攳䮥摜䂸唎☂昅廕禶⍉徽䗣禕狐㦪䯧៶⤅ᘙ⹒暅䆨ප᛫灹哋晠ぜ⹜䩂ᚤ䅓ᔱ⅒䱥ᱪ⌴吒琹㍁կጝ娐⯌是侼嶨㘼猅嚝Ѵ罈⩽瓆Ɲ犫敄Ⱇᚼ⣀呆㔼曅䁴濪ㅱ䳚奷Ⳙ䔧獜㪆䶂容⏂琅壓ҷ䃋晼㳝妔⢂敆તᖾ⣊㭇㢵ᴭቷ䑈㚌᳝憎糯؊犍杝䮲她㠌晅䦪扴瓌⥹䣗媄炒悊Ԕⴢ刎㓪晜川⸴浭⥸罅䅦䫖ֻ劌垹⽈孪㷪刅綫壋≰壚憆ዄᖭᘢ瞵Ꮃ၂濬⍊㬵ˋቺዅ㦌ଁԧ䫐咥⨸廅⥲濅ᓋ抴奌╳䫟զˋ礩珄圊⋂垞㒘婵汪慷⠔䆳Ὀƒ㲺ᘝ䬫晡⧢怅㢲糙囋∷嫏᳙斆⬍旻㋌旕ⳍ惵ፓᘴው㐉㤿⋺ᕓ⮭ᘞ儋ẵ㎒䮵漪឴ᛍ敽∩泍㧻猀垜⮙ኞ㋊䜅㺴ۏᡴ䕄繼ወ☋狈ᓧ䳺培⑴揵Ị橶囏畹⋁搷嘚⭕⚍⫐崵⧒粵ያ此籌Ͱ㋅妉◩䯮嚝⯵ᶁ⠺亵䘒ࣴ⇌癵ᫀ䕮˙啭⪐ᛝ⪒塱⃢䗵竊㣶绎ᅹ䃟䅡哤㖰櫝旁䳆啹⨺劅✓ヴÎ晾Ⳙ൲䊪㗈櫀寖䮷ᖭ⑴俙Ẓ⎵廋ᵱ⋙䶔Ყ䣁狦垇䨓ứ⡪哅㋷䣩ᵻ櫟勘㕢䯯☍䴴働▜碅䁊惋幅䶽䗭焥抖ᗑᖑ⻫♹㣺䊑竷ⷉ冷狓䊙糹妮欎嚻⥢帵㆔摵䜫具⻌䭺盒亙᫈旴挥◆⾖嵵⚀煹ⴒ曇姈㩱䭁Š˾㖟珗⑲ံ夅⼢䫕㯫⋷㏨❹㦤䶒㪰Օ㍹ᓠڔ崠㓒箉䉳崅❮ᬿ⽅㖐嫚攩ᷨᙷ⫺叹㺴墅侫爷䞑㭽䍋嶎᪬疳捵垇⭣᯽Ⳣ焕禷盎ࡷ灙浿㬆ֹ櫶坊⿔ᜍ❼甕捡⦆㕊繴䫄啹㋤ᖉ残啵⣪怙㇚堵ᅫዶ㟏數拈▍᪰㗸爩仞帽ㄚ单搊䆇佨㽳坏晣竂秝叿坪ⷅἝ㚚庥笊ⴴ忎ٴ┠ͺ匟疼橢仓ᰝ䀂杵嚊䣷槉噹拏গબᖐᯀ㔋䪢哶㭪䮅ˊδ⻩㩻妡祱ۧ瘏⪯堂⦜嬖㇊歞俓棵乎ㅴ竌᪓۠ഥਧ喇ⴡ崮㖦嬵᧫㑴㽌ჾ⭗䵨泌奈ᩘ垻⽡妍⌒祹㨻≖告婷弮᥅犁ג凃ၰ渡再Ⲃ皹画尵ᒈ٤ತ皝ˍ瘆㐀⩈淾嵽⻜䫹Ћᑗ῎僼敘据⫝⫆呜䞡川㷔䀭▊䋵竊僱䇋畲ۨ㖔㝠楛ᜌᚌ硭瘻圴ϫ磽ᇃ䪄⛓֎戓ᔊ⿔娙ⵛ⇅咻払䷍扺ᣝվ媴䵤Żោ槔呃㿲焭㌋撋ᓱ凗捽䜟ല狕☒䫺剎䀔缊圻䉵繈磰祴⛞◗䨷喅⽍Ᏻ㽚䝭㤊䍔リ❰孆厜窯嗹樯ᛊⲶ当❺䞕浓湖䲍䱨凋捾笋⮊㒫⼁嗉う嵕䓓㋁㿌ヹ睙ᖍଞ㖶᪃ࠏⷹ卓㙆皭ںዷ䗩烾ᛒẑ䫂⣍㏪㗍ෞ刎㰆瓭为͔⻌↽⧇⺈ᛆ㥚叟喜滋᭖㐶墭庺㞵䅎˶囏楢ᛨു䫒昰溎勣㗚恱⬋癷❩泼囈暣䷓䫑☦⣭ᆙ㧚愭䨊嵔ᵽ姒㑭䛭൲᪾㗜湾坃∄ₕ皻瓗嚏Ṱ䭭曂ᆗᩩ㞡䭅徃ⱺ坍ᆻ㳗癈斱瓉疄崟椤宴咲䰶垭㒶揭㲺㈆ᖎӸ構乱㬞斒樹㚒涴峫⩴侭畕抈㓹囑㍠䚭☛અᗜ⹘堝㷜母㷫幖㖈䫽嗏䢅㳯ⵯ㒛䱜刑㊒䣉䇒䫔උ㖴嫔極囍ⵖ婙㞇䲭忋れ滵寊歖ⳋ羦䣏暱ⶲ批㟼桭忓⩶旵⎺ೇΌ䉸㫉替ᘘ命埶汥尙㲪䎕勻ᇉ拍ךᯌ欁Ը剾垚瀎尋ㅖ仍㘒㽶○盳嫅喌ۨ⨧⪦噍⿻朻⟶䷥ᑻ姶炏架巐䍠⫳ⴧ⒭⩲刽䕪壍磺䏔䮏哹族╣圞斳Ⱆ䣙巛㜖痭䉺㗷Ỽ巒⭹皸ᘂ䯕晅䢝刓⯖圍ź㉴㷮ձ㗟ټ笂淍婟㒂䣝嬓▴瘍嶋䳇㆕棻⣟⍸㉌䴾檊啧⭇ᒧ㥦六画槗➊㭶廃㺖盼ർ娧㞡楝大㛶磵歒绶愋ᇷᗁސ糂ᴲሀ႖眎傊⌼笽橱Õ⤉ö淆云ໍ繃氝唩殃奛䎚哭䎋劕ᮋᅳ۔筭瘖宀甡噮㙴㽍⳺ㆷ㓮緊掁㜑ⶏ嬝㝲䷳卝Ⳣ暽琒÷牽巕浥䜝᩿ᷗ㕎榩屛㿶俕᭚塶䟎塲燞⮍ଏᔶ⩨㐦捁倷⾮熽㝛⚖ᦋᥴᅫ狰嵦ᯄ砊ⶳ內⠦廭橚䧔硉Ž䷚䅳圆ᶿ嫳ⓥ⬗ᮛ纍旋ⳕ匈ৱ緘垗⫓㬗㜙䱄勥㇎稽ऊ⼦㓋役唤䦃⻎淏㏽㔲䗁劷⎦缽ⴺ⏔奭僱䗟坶ᓖ䶞㭕⚥檭块瑕䚋કᎈ新寖⮔⻐涎䪛材氋婓ⱎ殽ᗛ⎗啋烹罝库ଋᶎ卍⓿䶖夛砥甋ᒗ䌊᷾珞ඔ⪷䵡䭈杸⺶库㍖偽⯒឵玌㧺ᗙ枀眇帉㭦甠⢡妛㖿ⶍ㳚纆佌Ǻ⫕絬㵅䗀㭘曅滕北㉎竕咛嬶የ⏷壏ᝢ峍հ䨮砒⢫哚⫖晜⧓毕䨈◿㛖㚌呦㶫㨹囶ⳋ哇㦾䇕Ꮋ竴䷉痹◇ᆍᒼⷌ筰㙨淩嬗烝η寋Ꮌ͎䵷崙㶣䪶显洧唗ㄎ䑝চ㞘弦ᳶド⾎⩤怺唲ˡ刄ྍჾ䜀掛尢Ⱕ᯲毉綖Ễⴆ笀ɻ滗坵凾珝厛ᾱ屦柭䠷漭弁暛䄓⤛瀜Ώ⑾䒭Ჺ桶ᾷᘥ矎0㼂A箇內氯小㝊�澛㼑琡ネ࿖ὦ㻻㷖ᰍ睙㕯匿㵞嵶䌛娔吊柸櫿潥㻔㇁篒㛁⫅ᒫᓞ䭶Ԛ世喢ຶ㯊Ի痣㔷֏焛濴孍熛毫圬石㰢宝浾綃簚䏗洼᫇䧋ᔝ幃㘔ㄌ䝺❑㾇♶ጋ篪⢗椌Ƒݙᮄ؛␖砋瘶䀠羒绶崱⎘敯湟忟⪶攝␛卒瀎濷῝-⡬㤵᪒涟微㴾慙䲚႔㨌ਅ翎ᔢ⳹瓠ۿ睟淼᎕儞䞝⠰㭺ࠈ嗲ᯑ粷缈ͫ䡰㖿嗟䙽Ӏ峜╵⠎恐⯴垂盐㴺笠ဃ埠ノ崙ᠣ刚Я䲄恓懪㌽䌟嶙祧甏䓝ẟ曝ሚḕ堽㺽₇䄃Ǩϵ㴒❐᪾⩟ァ灝˻ᛔ崈叿促勘䈊䥷糇痵畉՟㛅ᓞ㰧␗吽�㯒Ↄ漟緣㯹㞰㍘Ϳ✝ጧ䨱䎎⡓ᖥ碆䆮絚搯厳瀉弛㭍㖣䜦㪫氹塔႘ڑ瓛Γ窜ⷰ㜁⤖䲣朦⚔㔵痄√姿勦ϔŠ㡚滑么毶Ḋ㡜䗅愀伤䐉ڻ剄ᷫ嘂݁䔡⻡勀瑐䍫羐浂䐗Ⅺක˶䆰瀒敝㕈椯昫⢜儒媊䎌⇺Ἐ䋰曁旾㝉累㨼䂋ཷǐⓣ٪ຬᴲ䕐淁惣㺧礯㨽恔䟋僩↩͡ؼ咤᥀㭀抁獣▧欮ᐽ㢶墍僪䈘䎓٥婚⁔ࡎ寞滬Ꭷᜯ絆屑ᐹ⾍㳇ᶦ㭿㚰᩠㢘弁纭➦ᐕ拡籕㢇人㖉惃䋪ဠጤ㉲䎡庝㶧൨叇籟㌴ࣴ㩔檾㒒ҩॊ媨浳ᣣ&弬倒来䒎ໞᇡ♗⦘ί泘ᎃ叠宣ር䬊ᛸ㾎㱪␟қ竑ኄ㐕ᙾ千⸝͆弥屐ඳ䤖枍㑏٭ᕸ䤘㯐没搒繧岯糣絪⒄搠冾⍄䝀Ǫᱭᲅᾱ䫃汧璬␌Ṇ咑犒娽⎘匪棸䃮⪍䣱䬁桦䐕㔹 㒁ः㮋⍜▧埡ᥰ瞆ᕩ〡ຬᨹ㛾ᒐ磋列⌴ᠽ̍Ử㾍ὄ砛㽔嶩ᢳᰦ往漈䶂䞑ಶ䈬㤸璢䦺媃䆭對峫♒䡑⫄㸌捓ಚᡳ嬨眸䚃䞒≅ା✳怫ȱᐮ㰼ኘ㮐Ì㲰䛃炚庮珧㌾ⲙ彝ㇾ㰸ቩ䗖㯯ᝤ稨ข╷妨๗䲙㝡ㆹ燐执ඖᰍ㵑洑۩單´ಏ历∐䐑䚷䘜叟岸纑宄崲恻Ԧ噐㲔㤛Ộ掍ᦉ䜾Ẽ㲘睤禴⳧媕㦯眼ဢ喏统㥨嬺෨㤘挠ㆃ圳䏥Ἶ✸›夀০掿ڬๅ㗆ᰤ榒㭑䁇㩇⣥Ⲏӵ㢰Ꮡ䛠俈䥦ᢤ憤緺皂ᡯᎮٝ5橶缿䷮打䓆ᵐ㹥ᗰℳᏦ桔ᤸ湑ಒ惡ৱ㚷挐侱᥀ࣤ睤侃櫦ᱯႻє梜磪ᣎ፰➉䒑ᾂ㛘ࣺೢ⤳籮䒽⍣ශ㭨凰䎋䞘亞ᶦᄸᝐᢳᮋ䋦Ⓗ⥝ኗӥĜ٣䙳༉᫂㙏㋱洳墂䐧㮔⼲ㅐ攎䒵䐗䜳䘓ੇ⋘渑柃㏦䩭嵨昂ⲁ攝歶揰·拄ۂᰠ箂�弖๖䀿擩〫䔜䆢人�ᷤ慩䠃১✆⊼Փᔅ磟ᏺ䃂䴥ᣪ㉄歩廰撡䈳ͯ楙劎桔䧂卅䆐擞哗㔑樳ᛦ䉭Ⓖᕜ⪋ᣒ厊❊仞̡ኬ㗡ễ七㓥窿仿䟷予冾፩♰▧唔۴我汑⇇䧤⦱㨺夂榪㓏⢼佖濬㳸瓩繉ᡨ歬夼祙㔒槽য়㗻̒ṫ䦼Ⲧင⍇戔ᰉ浝瞺瓭刖叐拮䳽ᷱᓈ橚ဳᯠ彬㹞Გ㔇榸嵛䞁䔣ᬭ傸纩䔳櫧䱬ࢽ嵟⿂ᕿᎄ➁佮ᦦ㔬猎洎耍哀氡巽ヌ㲿攼㎟♼䱕圗㨪繓沆ᷗ䦺捝癳玐☿厣匌任⬡彬挘ຣϻ櫗琺෴沕攋扭榀杜圖䠶ㆬ檑畕欪厯䴼⁒⚁穧伜⦽䜲曛⤼㡣⟑䞃䇦䤕䢉⭐沒ⴘ戍卒昺㚋ᾶ㉭㬰䇓姦㎗⛋幚ႊ散⛼捤曖伓ἥጙ⛹睍棼漅猈抸憨每㛺⤾朢ಓᢛ巐絾䨳ᩆ竭埩筘ᚈ䨸㧎淿᭑俔㓆㜫☬奭ᤆӭ憼筿㵎縰೨⸇咳䷧᭛匫㍙䑠洇㓬ㆽ幛䚐ඟ燻㎃䞕俇ᶶ㵊᳙䋓ҋ羯稈䂨ៗ媙䦴玸㭩枍泥簶僝歇杔⦽卛䗐崁ᨍ㍘䟅佷ᢉ塜璙凓ޱ叭ඍ䏴啞㇈㈂Ꮱ㬡畏ᬓ䎔㎁免瞧牯纺块暅禁㔅班ᩢ㖒䥞㽙⟒侓䦺淬⮿啜ຒ㴔囻琚嫻佋Ẋ㹄猆羅ᕇ敭皧㝚心猏玊❯仱ࡊ㡸䦓礆㿵殸浟Ꮢ崝姈᥌杀⼇᷎㸘溹歹ሆⷭ玽⪹䆎紕ፁ朝ᚇᷡ㊢挥紓挆堣㐅܂府幵姏嶠歈⽗戚㠜淎段ᬇဥ⡾ホુ䋦✊ଫ显᪭塂沙曃篇ь㋮࣒᧘ⴙ曡ୂᨤⱓᾆ㼜㎹䂓̦㳬➼ὐ槒⋬Ἄ⇲᛭䵲ࢪ㶴浉汳磇ፕ㊸՝ઘ括䦱区媖ྭᠦ㢢究妫᳇業抿⥑姀፳䗃ங⟺㙾Ჹ妘摥媫ࠆᩏ▏磒᧚礆勷㗗曥佥⺞㬢滉縫ㄷ慱䓘㊛䌔琇䱽ᮇፃ⨉䬫䰛Ӷ棊擒Ƙ包稒淘ᝆ㝿⥁㜲涾䉫҆䥌㋪哟ẟ䎆哆䭔暑䶖欂㟗䵫冚睯橾Ӓ敀└弁ᐍ᭥亟ᤵᅌ矅墝碆廷䑿ᚱᚄ㍲姉涓寛䴊Շ塧ⶅ瞎榶瘖厽啸䣑Γ离喻ᙒⷶ溪儏p玜匇擭␊樫皉⌟姕㷊ᝠ䴤墖㙬抸淫⮶楌㹻渧㦟䋥▩䮓柺〄家ᡲ獴獫絻摏媎Ὑ庈䕹禢໐圐⼹ᱩ㡒燅䜓䄬ㄗ慻敫ւ̚ᖲ♾暟嘂嫾㠌潡䪫溆⽌ࡺⓑ䕆૦ᗸᷴ嚩ⱏỤᔲ抅卋咶Ō⥹⋖禓䭱昍୷柶ⶖ渑な梴㾫ᶶⰖ塿睔ጘ盺⨁᛭侂ಡ㝂甥球∦牮汼╟ㆎ喍暵⹒忱㪴拥䙳戇Ṏൽ㣒֍岊Ԧ⼅᭕㋲疿ো孶㮉字寉洈喫緀坱㘖樜㥻㒖毓ᖻ潏╠′द杔☈ᕲ䁣⹁睕㑱㔶毕䣶Ч⍾糜එཚ㍆曐ᯌ㗌揵朣І峍ٽ噞沋⳨旂毝䝭丅槛Წ樹咍㒆䀔啽ൗ庘䴋斧௹猋ⵆᯁ㛺竕䴾皺嵎ź曕禝䫰㧪⯈埫✬峥ず橜斋婊総㞊s榆哨ጘ䯨嘦ⰶ徽㙺搥棫杻㓇᩻深֗ሜ母噑③康唪湵䂫࢈䰯ᴻ⽒糌ᳲᘞ䮓ᘺ⻱㴌牙濽ᯡ㉁࣏䫙綛㌂瘙◫圿ᴽ㿹⏐નେ㳎殿ǟ禚ᴎ瘞毐㞡ⱞ嶹㰦涕湹䔇⟌❸⇛ຈ崙朖毿囮枖幅ㄒ璵叫牷䏎㥽㛛᳐䛨לᯅᰓ䰢宽㑲紭戻⇶癍ོ櫟泋ܒ㨛⭍ᬙ⚀墡㰚獕堻⿶䢍発懵溘⛤ේⰟ欤涴忝㥓㘕䈋୦ᒌ㣹綊⋵瘟䬹囃㞉嶃㻊維嚙㪌䚈曖⦈̖䦽ᰏ曌⽍䷾㛊羙䈫啖གྷ䳽罟㖉曵且氎㛀ⴲ䚓㽬⥭哓ᛶ㐄ㅩ秖熐⭫ᨀ宔朽Ⳙ契㑊檯Nj❷嚎嘍姘ຍ䛣䷷秔卂湸弮㬶烥構杷᥏絈㇞嚊厑؝氟圳ᘔ幣㿒籖漻痠畻ნ䎘旦ᰝ䫆ⶵ幢娊拵峭婋ⳗ冗⫴㜄ஞ㚕仅弭圃⻙䣭ጆ巗ᗑ睍団㖻௩㠔涭嬎㯶穭澉绖滬惫擕玑甙榸欤毝ⴍ塛㯼緲幫㊷⻏筿㫞殔ᕾ㗵對劽䲬淬㙲磅咍㟖窏泿⣚䎌嚎淴洷㟁⸩娻㐮琍王ᇶ㾌䕬䧒滊۷痷嬥㜀法墭弮断䣻爆Ǝ⇒⮅䛨暦寸㙚⺊⡅ᵦ澍帻兖ᷬx箲➅̍ජ㭰ᰐ㑉⡧㝖椥杕檷㞍每秞ޘ笍ᷢ攲⩐沍弡峮紕甋绫ˎᇾ戲ᖕ伙⻱寿㝈滱⪵㬧⠢泋䥼֎୭ᮌ垉⪁淡甯ᳵ涒䷶淎拈ၦ匲椺ॱ⌧њ竸ㆽ嫡ಭ澲兗㢿ɽ嵃䂶ᴍᯚ箾œ灳㯚浍泛姗㴲㽱ੜ楔溹緹燊➟糭峷峲㕯ሧ寫䓨⡦䑦㽮≖涎書ᶵ᭚戃潄㚩ാ揕Ṳⲥ沉摅⍸Ἐ嗭夥眓浭ᗯ㋦䣆ᔤ备㈍ᗦ墯⏫\"㷸淊垶涝彧㣊ǝ䀦ହ嘎ⷋ筢籨➞簋揼ᣅ康㖖嬘䟛ਖາ潆ӥ另竳挹筭瞀ᥫ徏㤯䘦筐氍ၵ㞙砬ጵ眗濢癳㫚涸䈛帖᷍ᗡ濝㞏㼆奄Ⅷ瘣濿婃㱪㕍ଛ䞗㯙㾆絇綴ゐ⤔夵ὂ䉴椾堜䀯嵬䟹ⷖᾏ䑈μ䨀ຕრ㨠灙吣䞀䘹㩃ሹܻ䊠Ǫά峣⚽梿媝㸡ᤣ嚬ᰯ䫱Ⱟᙊࢉࣿ䦨᷀㾎䢉⚣礧尮卻灙⇞炡䈖Ϛߝ桘Ự㣀熁ƣ䃊♂䤕⡜歡榢ǻ㸗筢㇈Ḩ㣤⁁汣嫈 ᓦ⢴ᾀ↻䌠Ӯ᳙㨀呚儏椳瀼瑒䀬ể䚮決վ哜尡乁尅糄ㄛ绿瑖怦နᲩ欭㎃䇣玧箷溢䱛䚮ㄇ砵䏌擖滦⊜༎箜■栰㑏⍌澭吼ህ籏ݽ�ḀА玳ᩃ嶧⋢⤿坑㭏$䞚娍䃒Ὗ崠ܱ捈㸪䬯ԣⱝ㱫䤟ሎᥪ䞗畜ݮـԈ糽䂌窯篔索ᒐ宼䓉⏛ąດ⡔㶃⟱点π睵昉භ㫀㪽凢⎾恩๙䪬㥂摁嚃媊ૠ璆猧ᴄ櫩㈀☭㋁偬㥈絑瑼㫧由⬽ᝀᲒ夌㚉戥⁰Һ塼㷗㌴䞃瞂⺮瀣唠ḍ㤝漷䐥⁷ာĦ䝴È͐Ꮘ廕⌻幝礗倦偆䀭礡ἢ㼘缰Ự㾝灮Ἵ㹜Ṃ礟憃ӄ➙ゞᵻ椪⢱㩇㾯⿇㙟猆ㄗㇹ⎰㶨浱ᰢ㾤爩朳晇⍉撽Ś粓㐢燼Ꮪ➴俁ᱼ╡ⓩ爳扇徯咿ᅟ巅┓⇗䞀从Ἢ㼸灩篣兇溮Ⓘ絓ኖ礂䨗搎✢倗燪㺄縑氳浇䡮ಾ奝䊑唁㱦❚䤹᷊䁴綳嗧卯䮮ঃ岛橡燳掵⻒乕Ϫ㢄磉考䫇䵯₼㥟劑吢樛ࡧ⟊伱ᴚ㹶䊉昳筇㕱ڶ簺⏾ഃ戁䑃⒩ᅰ䃑擒沵廃ұ繒䊿ⴺ戼⇪㷳箄œ᱄愂⌠ᴦỴ¢䖼㙇ᜋ㔝⥉㐂瑿ˋ᳇榻䋢廓檧⍙樿㌂㻩☪⠪;ႊₔ᩹憠䬤ᳲ㔀ೃㅆ樤㎥筚ቱ枹㡫矶㹘✤࠰崇咐㶽犧皘慨㨒搶憓乞ࡎ㡐᧙睐尰㥩य杞㣢䀰稂琘ë佣.㿻⛙盤܇揯㝟庑徜䂞玳栀撌呠ĕ掃䐓掑⢈䮽筜庚崚㷴⣟佛ᶡͺ樥拦ᐷ疈碹ऴ愥㟒縧㎻ႺƓ恁㤫㋲ᴫ幸倠䵸烜畫伯،穰³灥ீ䳨ᩥ熌䧀洭熼㸭沈│杔Ꮻ愍⤛⊌ݴ䅥眹㬷㕰幁熐㪺傡⠷怣伒䄈۪䍬ࣈঈ幏㏱㱢熝挈䣎~ᝰ樘岹İ䶠ᡫ梷ᭁ承䦜嚻◺吠D捈پ凢⦘ጕ◬1ឺ㢌䍅≒瓙ë嫈 ˦⤼弹㫿䁅敫䰠㕏ᙼႆ㦔岱早≁ݬ暁⍊☧ாᡋ匄敩繿ᰇ畒⫎⤴⯥ᧁ⿰⌘Հ碵濨䅖瓯笛䎬⋢ᱲ㬮ኜ䥬噖Ǯ䫧䕘ᗰ䘐妳ᖓ璢嘉⯯擼瑈ᵕ㝌ݵ繋䆝⛎☖嫟䎡⌨䢹ш㒀㚬Ǡաࠅ䬤㧮厸籡䡥佥⨦㙑䩞㡑▚怕㫡ᑕ撈㉴熑Ⱪ曡ឮ朤喂�埋㆓抍㹶䯕榪▒⽰ᄫ熖死⠿皒ᑸ昰ト◮ᤋ泝呁䨰抽䜯㬞䇳毼像⽱挮⑬ܠݠ㬷涑⻡仜堡㬔羌㦤ಯ⽳䒝㳎ⓙȻ珷㳁᧫懧唥欛嘁ᙪҰ威峪☺皁皋䃷䠳㕢⊦╥ာ㘋ू㝜ㅮშȧѨ䊻昘䋮婑绝梤斤摈乇椓ࠡ峤晔ߵ眻柜ⲏ兓⧙橭✀䙗汪㝖᱉彣䊦䚭摈ٗ䵨㳿扝厖>万湆㝠渢抽愆睕炋繗ⓡ䥲䗞⭣圍⨠R㻗捉۾⡬琣戻ᯈ枢䂧 ݰὍ氹ᔩ宽⑆渭弻㵖焠䫗⸠ृⷙ䀧㜂縨殰f澽帅䀠Њ༘敘㰗㞾潍崛㷖羍斫澠崐凼畂䞖唢ᷳ⬬眧⣭屻㭐疍繛䂗䵏⌁㏝佡༝Ḑ宲嗁滥峜普紮ᓛ屘厨㌃㻢➢⫉帍屌埚熻彋⎎盾䐀䮦㼎ⅼᯰྙὯ巺咖\"©ய㭊牺છ仄⨏ፑ�ଔ牗氊卑╷幫捫瘐╀ŏ៣ᓔ⾓᪁擁箹ɝҐ䝠玪ⴛ氀ఏ᠀㟘穭弊䠾篓ၷ悒㍿㱓䧾Ⰰ簗導䕐㟝ᓧ缋瘁箧睛澿忁ͺ怣檉‗䆮⸺⇁垐潾ഭ┝㯇࡛扛憁‸ʰ㔗ૈJ傛࣎䈃䓐䊔⍨稨㽕㻧ౣ祺⨤㐼屙ᕶ↪䐔㐓瀲㠳ᵭޡǝ榧悗娿ഐᒱ䨧∍২むࠦ䁇玂㰁緍å挌䘾緾⦡ㄘ㼍䏹䏖䇓珸䅱Ǒ碋乺㛡⸪ᛁᚠ吸⏼䠩籫䣔㾱ℱ硿ᣳ粐ṯ䙰ᔡᤔ唌⏤噹ᳬᾭː碱筃笠㲯帱䚠ᱦⲙ夒ᑊ䞹ℊῧḦݑ燱ᘴ洔缿㢽❺碭⢬㪆ѫ睏㷢㲀䉔䣖⩧俷帾焀簰䶯䁉⡓繪⥰⮯ō̳捨㨩烎ᴰ⊛䔙ℐⳃ⏵珩㦿˱憪₳掐ቯ碯璐⒞䧦嶶✢㙊㔐ᆜ㶰ˉ糪喩㝯⻲粰㾹ᕰᨆ䷙Ⱊ㈉妟么≾䦣摲ⷶಯ㈮樯皰䬮ᰙ垺漳庨ؔЭ搻嗷ँ碢㊤纗0歟ၯま漽В Ł;ἡ䂛₷斲匔℮䘐ㆇ碔㾣媢嬆據㼭琗娣呋ṕ弭㥽䡘盯わ㭜㚜㨣䨨珩柖㞇㽼緙瘗ἇ埯㼩唾Ⱗ㴑䤇ᑙ⟺ୄौ�穢玘Ꮋ櫯羿ᇢ㚙㎜ܟӮ枵椀弮㻇થ皁昷嗯䎿烟堄⌓䘝୳柶⿊�窢䃓掷吴᾿磟嗛掔☏㐀᠓堄幡㹲硙礫淰ᵏ唃マᦟᘠ䘚ፏ⊎⽈廵㺤㣕䀰㝒墌㱾櫽㧘⨸䯸埒⾷⽅㼲竅獋甇糏پ㝝ᖞ㌒嘇⯦桏䉮徬іᖕ締禡ཿ糜竜ଐ㘍㐈ឬ偆御㿹ʵ焫暷泏漯瓝憟嬕ឥ䯥嚞⿕墝㲄㽄⠷㺝孙0ᝒᑿ㨫稘⯨栠⽻ṅ㶦磕絋牗痏ி㛝ᦟ䜘瘂䂕䀴⾉弒挆tϠ፶替ⷞᖒᒞ斸栫㞭☸⼰�耍獀徰㌴⇾淞㈭༙嚷將㟸䠂丠㍡㌽獛碗埢⧿揜㢶Ŗ瓰緞ᐇ䈎ᣬൿ熢㮓᎗朑䡆㯞㞖╧Ϳ㰏燣澟Ί瀤犁纗焬ࠨ氳弟䡙ᤝ篭棟㹞緽缓խ』⡇�綫乖㊎犤䨐ώ庿㹕ᥑḼ㋩吿ᔚ䵿府䀦⌆揃⮻अ䁰締䰝纛穆ؿ㔰瀣ㄘᔒ濙ࠇ䉴ἣ䳼ἱ窩绔⪯礿ᱞ抿羘ç␏愥⫖࿈羷⃙䷊ኰ✿⛍撨礛爘搏ߠءῥ䂤粱會繇纯吩♈粝ਖ㸝ᯒ⩯′㻮䯈㦳祧立罀溉粠䡢ᖐ⬊瑎倝Ῐ㾴罤柪牵杯䍧፟ყ㔞ᨚ奦㼲䠽₷䀵ˁ碴ݟЇ綸፡編崛㨑琎㯳ဇ濾㾼粀֓緊ᷯ䴪刮亞ؘ̃柩⊈忴Ṡṅ翁緻睇䩿⣞㺞䊟ἥ䰛漮箦ѭⶢ縥揫畨Ï炿㍞Qଟ㩿䰎ॊ彿緡Ⅻ牷榄䶮竞噭ᨗ珹ᕛ《嬑㕚縴緫矷柄掿峞ᩓⱤுЍ堓】彖ņ罡簫稵暏氀㥠ޟ㘛ᰞ㟳忚ჭ汴缄价瞏䁿ᅞ䆟ᬚḟČ矴�忝㹇㽭稻盻糏睿梸㞟圞㘗氛㟨⿐⫲ᅫ啔㹫价砒⫍ᩐ榟縝簓᠇澠㼿㾪緽ϻ疫杌㭿ᢟ䞜⬝ḛ䰑濴䀓䇎罕練幨晋癟㊩歭ⵙ䈞䰗ᾣ収ᏺ綳綷匜⍵㵓㣟ᆝ向尮俤⿓⍪㺾簠抇牬䍟◨崜娟䘜પ⠍䇵䏢纱粓纝癇竓嘞⦞α埏ୣㇾȠ䑎彐ᶲ克簆䟯繿扅徥埬沒㍮᠕〔⚝㿝榻仗⊠นஞിᲬ⾣业翈囈倂澥㒊၍繛扞砤姿巟畚㜟╤尞溭∯忷㼦罈㭅✗稏淿䱈償㼝啧ศኲ䠻䐨䝁欥⃧禂伿桟潞擉䨟ଥ⠓咳ῼ㾺耖猹➡ࡿ敿炟梹䘞徝佡〛毀ဪ䄳瘨科挸ở憝㔟缚懃堐瀜 ᩮ翍羋綀Ə糏糝⾟斟ྞธì瀃␦忁ك绵刂⏏獲匷摧䅱丞㠛⍣忠翕缧琷緡̍擟焟Ȟ☝䠛᠑忩羹翧翿㿯砿牋Ჳሟ㠡ᜊ䶇ኊ䀝—⚆耗繙ᣴ䯏瘟珠犟慠Ȏ≤!戎皞爞柾အ㬌斈䠡汘⹎⒎ᬼ尠ᒎᣄ硐㝎Ǯ⾎ᯎ榎䷠曠㋀࢈㔀㈰䭾狾䄎䐡๐⥎ৎ厨䐡砡ዊਡ๐Ԉ吡氰㌮డ༾䬠氡ᔀ尡䫀簡㋾掾⣾8模ᵎ劎㳐祎䨡⒚䄡ᨡ䉸ᐡ敎㐡㚎䘡ᑐᘡ唀䫀๐ȡ⸡иᄡᵎ戡ġ帡Ṏഡ⌸戠㨡Ր撀篎ᤡ䡸㤡凎มࣾ┡∡ⴡ⥎帡⾈㼨℡明ㄈ嬡儡搡㯰崡琡̡Ⱑ⌡㘡凎ԡ両婾梸欨抎Ⱌ¡㊎㫈伨縡⛌¡␡嬐無华㴡ᓈ㵨䌡ᰡીጡἡ㌡㼡8䢡ሡ噄䲡䨮䍠悡㾞⬨ァ✡梡ᜡड稡漮椡༡⒡㰡咡橾猡ᄞ㲡⊡䚡䜡岡䊡嬡㬡䮆ܨᚡ氠炡洡圡⤡眡痠夡⼡抠匡㪡璡柾弨庡䂡圲榡ᠠ縡澨泾噜ఎ֡从ᬼ㓾ᖡ㻢⢡⩨务墡㜡ҡ⪡嘡撡抠媡⭾䄎䶡欰涡ⲡᦞ斡⮡庡Ⴁ碦㮡喡炡枡涡ᶡސơء↡昡伡Ꭱ㺡䔡䦡と瞡ᦡᮡ掦偡֡㈡Ᾰ泾亡f塡抡嶡⟠澡ડ御ᆡa㎡䈡ᕞ䑡亦屡□欠垡ඡ塡価䴐呡碮䪡憡羡㰡熡玡ᱡ䉡妡䘲㓾䖡ⷌ㨂㡡忞㴘㙡②⾡㊡㢡䩡㾡檡礡≠渡柾㌨䙡䨚ᙨ㙡癡緞⨄ᥡ湡㉡幡Ρ䲎⎡挡ㆡⱡ窡梸煡ॡ祡ᔨᙡ濂帶㖡ᴈ⍡剡Ȑ牡ೀ繡ౡ᪡慡弡兡⳨卡灡䘲䘶ᄠ桡ㆰᝡ⡡疡↾卡㍡篐ୡ紡䎡⩡䅡ᒡ孡㒡筡ᓸὡ❡篔ཡ͡ㆰވ⚡ێྈ嚡㪨罡碡啡⃡採᭡⤀㭡и磡擡瞈守嚡ᮈᲡ䓡䋡ち䢨員⭡橡瘡䵡恡杌ⓡ狡案ۡ佡犴ఠ粡䐚㛡ӡ纡敡䆡䃡š䳡Ⅱ泡メиᇈ盡㐦᧠粡Ⅴ仡ມ⽡⒚凡ァ彡疐䫡瑡櫡ს⇡ড烡礦槡䛡燡淡ᛡ凌ڮ奡㢞◤ᨰ繠䗡ᢡ睎ᕡ䰡ೡ畡婡污⪸叡嵡䑦䟡䞡⼰ᚮ≡ዊ矡珡㶡䯡廡瓡绡寡㯡ⵡ8⣡伤䟡㝡⼰Ꭾ☡⏡昞ㇰ桁ᑐ濡ᑡỡᾡ㻡歡䇡綾懡䄎с䷠⟡▐᱁痠䡁攰眾䑁塁䔞硁┾䎮屁⑁ᴡᑁ㑡㑁嗡ൡ僡иɁ䬠㺡娈㙁壡⼰涄⦠㉁ᒦ㓀֮ᩁ旡ف惡厡晁㩡သ⅁ぁࠬ楁㜔⅁繁మ♨Ձ䕡獡㩁ᗡㅁ䁡᳡䄎幁坡㱁᳐㵁緡厨㵎䕁ᠢ十啁㽡ỡᗰ⫡ⵁ嫡䷡冐ୁ斈❁絎⒚十慁歁找孁ǡ㗡䱁ᙁ䄎ཁ▐㳐筎㍁ៜ烁䭁◡⽁㶾ὁ寡筁潎́㿰⣁チ㝁笡ᚰ烁佁綡á翡瑁㽁ᅡⓁ擁䅰ⳁႡ㜘地眰估傀⸰ᜐీ瀨磈愰姰結ᤰ歰䨠䔰⑰㜘ᝡ〾᭠ิ縄㡐崴ῸჀ殦氰唠㘠䟀檠畠䳴嬸ˀ幁᭸祎樠絠Ә梴ㅰ⬀獀က尠㘠◁ᭀỰ⏠@Ⰰ㦠Ꮐ䶾᷁ᐠ䚘⌰ደ㈰峠浸⌠痮ގડ瘘嫁ை⁀愰䴠䨰揁ᜐ㕀埁嘰ዀ版盔ܘ懮䳈㻡琘₠洠淁㈠Ữ緁␠呎₠炠炁㹀廰㗁傠ශ᪠碁扠珁㨰ደ☰毁繠寁寮篁䟁樰坰岀濁⨰㭐疀㊁㘰㿁牼冬䂁ᖈᔄ䔄ແ畠ሠी姁冮私尠⢠ׁ揁罀懠₰ශⷁ昰懠䘠῁㟡㿰竀湰懠⪠ኰ₠㘠ẁ⦁ࡎ⏁䖁䐠嘰¨洠祎ↁ㺁ୠ妁ᔠ᪠祎め憁ᦰᦁ墁庁纁ᎁ椴㿰ᴀᖁᎁ仁᭠ፂ㽜忠ـ䷠⯀剠⢜喁᭠仾瞁粬Ỡຐీை䮁ൠⵠ疶‰₨玀ࣘ† "}
The complete round-trip took 51.1 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-file-analysis)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts.-
. object
- type string [required] The type of the message. Allows only the values: 'request-file-analysis'
- id string [optional] You may pass an id to link requests with responses (they get the same id).
- filetoken string [optional] A unique token to identify the file for subsequent requests. Only use this if you plan to send more queries!
- filename string [optional] A human-readable name of the file, only for debugging purposes.
- content string [optional] The content of the file or an R expression (either give this or the filepath).
-
filepath alternatives [optional]
The path to the file(s) on the local machine (either give this or the content).
- . string
-
. array
Valid item types:
- . string
- cfg boolean [optional] If you want to extract the control flow information of the file.
- format string [optional] The format of the results, if missing we assume json. Allows only the values: 'json', 'n-quads', 'compact'
Message schema (
response-file-analysis)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts.-
. alternatives [required]
The response to a file analysis request (based on the
formatfield).-
. 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.
-
. object
The response in JSON format.
-
-
Slice Message (
request-slice)View Details. (deprecated) The server slices a file based on the given criteria.
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-slice alt Server-->>Client: response-slice else Server-->>Client: error end deactivate ServerWe deprecated the slice request in favor of the
static-sliceQuery.To slice, you have to send a file analysis request first. The
filetokenyou 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": trueto disable the automatic selection of elements based on magic comments (see below).Example of the
request-sliceMessageNote: 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.6", "r": "4.5.0", "engine": "r-shell" } } -
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
filetokenofxto slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" } -
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-8256-j9BcW864AOKW-.R"}],".meta":{"timing":2}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8256-j9BcW864AOKW-.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-8256-j9BcW864AOKW-.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-8256-j9BcW864AOKW-.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-8256-j9BcW864AOKW-.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-8256-j9BcW864AOKW-.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-8256-j9BcW864AOKW-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8256-j9BcW864AOKW-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8256-j9BcW864AOKW-.R"}],"info":{"id":7}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":2862,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"vdef","id":0}],[2,{"tag":"fcall","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":"fcall","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}]]]],"_unknownSideEffects":[]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}} -
request-slice(request)Show Details
Of course, the second slice criterion
2:1is 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" ] } -
response-slice(response)Show Details
The
resultsfield of the response contains two keys of importance:-
slice: which contains the result of the slicing (e.g., the ids included in the slice inresult). -
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 6.7 ms (including time required to validate the messages, start, and stop the internal mock server).
The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the
filetokenis unknown, flowR will respond with an error.Within a document that is to be sliced, you can use magic comments to influence the slicing process:
-
# flowr@include_next_linewill cause the next line to be included, independent of if it is important for the slice. -
# flowr@include_this_linewill cause the current line to be included, independent of if it is important for the slice. -
# flowr@include_startand# flowr@include_endwill 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.
LoadingsequenceDiagram 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[!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
expressionfield. Furthermore, you can set theansifield totrueif you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of theidfield 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-accessif you are unsure).The answer on such a request is different from the other messages as the
response-repl-executionmessage 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 theend-repl-executionmessage.The semantics of the error message are similar to that of the other messages.
Example of the
request-sliceMessageNote: 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.6", "r": "4.5.0", "engine": "r-shell" } } -
request-repl-execution(request)Show Details
{ "type": "request-repl-execution", "id": "1", "expression": ":help" } -
response-repl-execution(response)Show Details
The
streamfield (eitherstdoutorstderr) 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) :dataflowascii Returns an ASCII representation of the dataflow graph (alias: :df!) :dataflowsilent Just calculates the DFG, but only prints summary info (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 :dataflowascii Returns an ASCII representation of the dataflow graph (alias: :df!)\n :dataflowsilent Just calculates the DFG, but only prints summary info (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" } -
end-repl-execution(response)Show Details
{ "type": "end-repl-execution", "id": "1" }
The complete round-trip took 1.1 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-repl-execution)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts.-
. object
- type string [required] The type of the message. Allows only the values: 'request-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
ansi boolean [optional]
Should ansi formatting be enabled for the response? Is
falseby 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.
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-query alt Server-->>Client: response-query else Server-->>Client: error end deactivate ServerTo send queries, you have to send an analysis request first. The
filetokenyou 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-queryMessageNote: 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.6", "r": "4.5.0", "engine": "r-shell" } } -
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
filetokenofxto 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))" } -
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-8256-Fo3NbeYqNMgU-.R"}],".meta":{"timing":4}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}},{"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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}},{"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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":2,"role":"call-arg"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}},{"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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}},{"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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.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-8256-Fo3NbeYqNMgU-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8256-Fo3NbeYqNMgU-.R"}],"info":{"id":91}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":3050,"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":{"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":"fcall","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"fcall","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"fcall","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"fcall","id":16,"environment":{"current":{"id":2893,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"vdef","id":12}],[17,{"tag":"fcall","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"fcall","id":22,"environment":{"current":{"id":2909,"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":"vdef","id":18}],[23,{"tag":"fcall","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":"fcall","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"fcall","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"vdef","id":24}],[32,{"tag":"fcall","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"fcall","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":"fcall","id":48,"environment":{"current":{"id":2967,"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":"fcall","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"fcall","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"fcall","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"fcall","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":"fcall","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":"fcall","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"fcall","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":"fcall","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":"fcall","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"fcall","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":"fcall","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"fcall","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"fcall","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}]]]],"_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":{}}}]},"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":2}}}} -
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" } ] } ] } -
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 23.4 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-query)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-query.ts.-
. object
Request a query to be run on the file analysis information.
- type string [required] The type of the message. Allows only the values: 'request-query'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
-
query array [required]
The query to run on the file analysis information.
Valid item types:
-
. alternatives
Any query
-
. alternatives
Supported queries
-
. object
Call context query used to find calls in the dataflow graph
- type string [required] The type of the query. Allows only the values: 'call-context'
- callName string [required] Regex regarding the function name!
-
callNameExact boolean [optional]
Should we automatically add the
^and$anchors to the regex to make it an exact match? -
kind string [optional]
The kind of the call, this can be used to group calls together (e.g., linking
plottovisualize). 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
ggplottoplot). 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 offto 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
fileFilteris set, but a nodesfileattribute isundefined, should we include it in the results? Defaults totrue.
-
linkTo alternatives [optional]
Links the current call to the last call of the given kind. This way, you can link a call like
pointsto 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
-
. object
-
. 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'
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
-
. 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 file query finds files in the project based on their roles and path patterns.
- type string [required] The type of the query. Allows only the values: 'files'
-
roles array [optional]
Optional roles of the files to query. If not provided, all roles are considered.
Valid item types:
- . string Allows only the values: 'description', 'namespace', 'news', 'data', 'source', 'other'
- matchesPathRegex string [optional] An optional regular expression to match the file paths against.
-
. 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.
-
. object
-
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.
-
. object
-
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.
-
. object
-
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.
-
. object
-
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.
-
. object
-
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'
- withDf boolean [optional] Whether to include Dataflow information in the result.
-
. 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
-
. object
Call context query used to find calls in the dataflow graph
-
. 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
-
. object
Compound query used to combine queries of the same type
-
. alternatives
Supported queries
-
. alternatives
Any query
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.
-
If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.
-
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"} - 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)
Note
To execute arbitrary R commands with a repl request, flowR has to be started explicitly with --r-session-access.
Please be aware that this introduces a security risk and note that this relies on the r-shell engine .
Although primarily meant for users to explore, there is nothing which forbids simply calling flowR as a subprocess to use standard-in, -output, and -error for communication (although you can access the REPL using the server as well, with the REPL Request message).
The read-eval-print loop (REPL) works relatively simple.
You can submit an expression (using Enter),
which is interpreted as an R expression by default but interpreted as a command if it starts with a colon (:).
The best command to get started with the REPL is :help.
Besides, you can leave the REPL either with the command :quit or by pressing Ctrl+C twice.
When writing a command, you may press Tab to get a list of completions, if available.
Multiple commands can be entered in a single line by separating them with a semicolon (;), e.g. :parse "x<-2"; :df*.
If a command is given without R code, the REPL will re-use R code given in a previous command.
The prior example will hence return first the parsed AST of the program and then the dataflow graph for "x <- 2".
Note
If you develop flowR, you may want to launch the repl using the npm run main-dev command, this way, you get a non-minified version of flowR with debug information and hot-reloading of source files.
Available Commands
We currently offer the following commands (this with a [*] suffix are available with and without the star):
| Command | Description |
|---|---|
| :quit | End the repl (aliases: :q, :exit) |
| :execute | Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r) |
| :controlflow[*] | Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) |
| :controlflowbb[*] | Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) |
| :dataflow[*] | Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) |
| :normalize[*] | Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) |
| :dataflowsimple[*] | Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) |
| :dataflowsilent | Just calculates the DFG, but only prints summary info (aliases: :d#, :df#) |
| :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.) |
| :dataflowascii | Returns an ASCII representation of the dataflow graph (alias: :df!) |
| :help | Show help information (aliases: :h, :?) |
Tip
As indicated by the examples before, all REPL commands that operate on code keep track of the state.
Hence, if you run a command like :dataflow* without providing R code,
the REPL will re-use the R code provided in a previous command.
Likewise, doing this will benefit from incrementality!
If you request the dataflow graph with :df* x <- 2 * y and then want to see the parsed AST with :parse,
the REPL will re-use previously obtained information and not re-parse the code again.
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.7.6, R grammar v14 (tree-sitter engine)
R> :dataflow* y <- 1 + xOutput
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;
R Code of the Dataflow Graph
The analysis required 0.8 ms (including parse and normalize, using the tree-sitter engine) within the generation environment. We encountered no unknown side effects during the analysis.
y <- 1 + xFor the slicing with :slicer, you have access to the same magic comments as with the slice request.
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.7.6, R grammar v14 (tree-sitter engine)
R> :parse file://test/testfiles/example.ROutput
File: test/testfiles/example.R
program
├ binary_operator
│ ├ identifier "sum" (1:1─4)
│ ├ <- "<-" (1:5─7)
│ ╰ float "0" (1:8─9)
├ binary_operator
│ ├ identifier "product" (2:1─8)
│ ├ <- "<-" (2:9─11)
│ ╰ float "1" (2:12─13)
├ binary_operator
│ ├ identifier "w" (3:1─2)
│ ├ <- "<-" (3:3─5)
│ ╰ float "7" (3:6─7)
├ binary_operator
│ ├ identifier "N" (4:1─2)
│ ├ <- "<-" (4:3─5)
│ ╰ float "10" (4:6─8)
├ for_statement
│ ├ for "for" (6:1─4)
│ ├ ( "(" (6:5─6)
│ ├ identifier "i" (6:6─7)
│ ├ in "in" (6:8─10)
│ ├ binary_operator
│ │ ├ float "1" (6:11─12)
│ │ ├ : ":" (6:12─13)
│ │ ╰ parenthesized_expression
│ │ ├ ( "(" (6:13─14)
│ │ ├ binary_operator
│ │ │ ├ identifier "N" (6:14─15)
│ │ │ ├ - "-" (6:15─16)
│ │ │ ╰ float "1" (6:16─17)
│ │ ╰ ) ")" (6:17─18)
│ ├ ) ")" (6:18─19)
│ ╰ braced_expression
│ ├ { "{" (6:20─21)
│ ├ binary_operator
│ │ ├ identifier "sum" (7:3─6)
│ │ ├ <- "<-" (7:7─9)
│ │ ╰ binary_operator
│ │ ├ binary_operator
│ │ │ ├ identifier "sum" (7:10─13)
│ │ │ ├ + "+" (7:14─15)
│ │ │ ╰ identifier "i" (7:16─17)
│ │ ├ + "+" (7:18─19)
│ │ ╰ identifier "w" (7:20─21)
│ ├ binary_operator
│ │ ├ identifier "product" (8:3─10)
│ │ ├ <- "<-" (8:11─13)
│ │ ╰ binary_operator
│ │ ├ identifier "product" (8:14─21)
│ │ ├ * "*" (8:22─23)
│ │ ╰ identifier "i" (8:24─25)
│ ╰ } "}" (9:1─2)
├ call
│ ├ identifier "cat" (11:1─4)
│ ╰ arguments
│ ├ ( "(" (11:4─5)
│ ├ argument
│ │ ╰ string
│ │ ├ " "\"" (11:5─6)
│ │ ├ string_content "Sum:" (11:6─10)
│ │ ╰ " "\"" (11:10─11)
│ ├ comma "," (11:11─12)
│ ├ argument
│ │ ╰ identifier "sum" (11:13─16)
│ ├ comma "," (11:16─17)
│ ├ argument
│ │ ╰ string
│ │ ├ " "\"" (11:18─19)
│ │ ├ string_content
│ │ │ ╰ escape_sequence "\\n" (11:19─21)
│ │ ╰ " "\"" (11:21─22)
│ ╰ ) ")" (11:22─23)
╰ call
├ identifier "cat" (12:1─4)
╰ arguments
├ ( "(" (12:4─5)
├ argument
│ ╰ string
│ ├ " "\"" (12:5─6)
│ ├ string_content "Product:" (12:6─14)
│ ╰ " "\"" (12:14─15)
├ comma "," (12:15─16)
├ argument
│ ╰ identifier "product" (12:17─24)
├ comma "," (12:24─25)
├ argument
│ ╰ string
│ ├ " "\"" (12:26─27)
│ ├ string_content
│ │ ╰ escape_sequence "\\n" (12:27─29)
│ ╰ " "\"" (12:29─30)
╰ ) ")" (12:30─31)
Retrieve the parsed AST of the example file.
File Content
sum <- 0
product <- 1
w <- 7
N <- 10
for (i in 1:(N-1)) {
sum <- sum + i + w
product <- product * i
}
cat("Sum:", sum, "\n")
cat("Product:", product, "\n")As flowR directly transforms this AST the output focuses on being human-readable instead of being machine-readable.
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 @configThe following summarizes the configuration options:
-
ignoreSourceCalls: If set totrue, 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 supportsemantics/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": {}
}
]
}
}
},
"repl": {
"quickStats": false
},
"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": {
"wideningThreshold": 4,
"dataFrame": {
"maxColNames": 20,
"readLoadedData": {
"readExternalFiles": true,
"maxReadLines": 1000000
}
}
}
}Configure Built-In Semantics
semantics/environment/overwriteBuiltins accepts two keys:
-
loadDefaults(boolean, initiallytrue): If set totrue, the default built-in definitions are loaded before applying the custom definitions. Setting this flag tofalseexplicitly 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 atypewhich is one of the below. Furthermore, they may define a string array ofnameswhich specifies the identifiers to bind the definitions to. You may useassumePrimitiveto 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 constantAdditionally allows for a valuethis should resolve to.{ type: 'constant', names: ['NULL', 'NA'], value: null }functionIs 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.tsor open a new issue.{ type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }replacementA comfortable way to specify replacement functions like $<-ornames<-.suffixesdescribes 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
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
repl object
Configuration options for the REPL.
- quickStats boolean [optional] Whether to show quick stats in the REPL after each evaluation.
-
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.
-
. object
The configuration for the tree sitter engine.
-
. alternatives
- 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
ignoreSourceCallsis 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.
-
dataFrame object
The configuration of the shape inference for data frames.
flowR can be used as a module and offers several main classes and interfaces that are interesting for extension writers (see the Visual Studio Code extension or the core wiki page for more information).
Using the RShell to Interact with R
The RShell class allows interfacing with the R ecosystem installed on the host system.
Please have a look at flowR's engines for more information on alterantives (for example, the TreeSitterExecutor).
Important
Each RShell controls a new instance of the R interpreter,
make sure to call RShell::close() when you are done.
You can start a new "session" simply by constructing a new object with new RShell().
However, there are several options that may be of interest (e.g., to automatically revive the shell in case of errors or to control the name location of the R process on the system).
With a shell object (let's call it shell), you can execute R code by using RShell::sendCommand,
for example shell.sendCommand("1 + 1").
However, this does not return anything, so if you want to collect the output of your command, use
RShell::sendCommandWithOutput instead.
Besides that, the command RShell::tryToInjectHomeLibPath may be of interest, as it enables all libraries available on the host system.
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']);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...
- Provides structures to investigate the results of all intermediate steps
- Can be executed step-by-step
- Can repeat steps (e.g., to calculate multiple slices on the same input)
See the in-code documentation for more information.
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).
-
Create a new file in
src/statistics/features/supported
Create the fileexample.ts, and add its export to theindex.tsfile in the same directory (if not done automatically). -
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
initialExampleInfotype holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resultingExampleInfotype 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, withInforeferring to aFeatureInfo(likeExampleInfoin this example). Next to anameand adescription, 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).
-
Add it to the feature-mapping
Now, in thefeature.tsfile insrc/statistics/features, add your feature to theALL_FEATURESobject.
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).
Currently maintained by Florian Sihler and Oliver Gerstl at Ulm University
Email | GitHub | Penguins | Portfolio
- 🧑💻 Developer Onboarding
- 💻 Setup
- 👓 Overview
- 🪟 Interfacing with flowR
- 🌋 Core
- 🧹 Testing & Linting (Benchmark Page)
⁉️ FAQ- ℹ️ Extra Information