-
Notifications
You must be signed in to change notification settings - Fork 9
Interface
This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-11-12, 14:26:03 UTC presenting an overview of flowR's interfaces (v2.6.2, using R v4.5.0). Please do not edit this file/wiki page directly.
Although far from being as detailed as the in-depth explanation of flowR, this wiki page explains how to interface with flowR in more detail. In general, command line arguments and other options provide short descriptions on hover over.
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.6.2", "r": "4.5.0", "engine": "r-shell" } }There are currently a few messages that you can send after the hello message. If you want to slice a piece of R code you first have to send an analysis request, so that you can send one or multiple slice requests afterward. Requests for the REPL are independent of that.
Message schema (
hello)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-hello.ts.-
. object [required]
- type string [required] The type of the hello message. Allows only the values: 'hello'
- id any [forbidden] The id of the message is always undefined (as it is the initial message and not requested).
- clientName string [required] A unique name that is assigned to each client. It has no semantic meaning and is only used/useful for debugging.
-
versions object [required]
- flowr string [required] The version of the flowr server running in semver format.
- r string [required] The version of the underlying R shell running in semver format.
- engine string [required] The parser backend that is used to parse the R code.
-
. 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.6.2", "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":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-9699-4q71LAHQpAlg-.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-9699-4q71LAHQpAlg-.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-9699-4q71LAHQpAlg-.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-9699-4q71LAHQpAlg-.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-9699-4q71LAHQpAlg-.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-9699-4q71LAHQpAlg-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9699-4q71LAHQpAlg-.R","role":"root","index":0}},".meta":{"timing":3}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":12,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-9699-4q71LAHQpAlg-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":5}}}} -
The complete round-trip took 20.4 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.6.2", "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\":\"file\",\"content\":\"/tmp/tmp-9699-cTI7QFOpW9uD-.R\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.6.2%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22file%22%2C%22content%22%3A%22%2Ftmp%2Ftmp%2D9699%2DcTI7QFOpW9uD%2D.R%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A125%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A223%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A187%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A89%3A18%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A197%3A25%29%0A%20%20%20%20at%20async%20FlowrAnalyzerCache.runTapeUntil%20%28%3C%3E%2Fsrc%2Fproject%2Fcache%2Fflowr%2Danalyzer%2Dcache.ts%3A99%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.sendFileAnalysisResponse%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A163%3A52%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09" }
The complete round-trip took 9.0 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.6.2", "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":{"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["32-exit"],"entryPoints":[32]},"results":{"parse":{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]",".meta":{"timing":3}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RIfThenElse","condition":{"type":"RBinaryOp","location":[1,12,1,12],"lhs":{"type":"RSymbol","location":[1,4,1,10],"content":"unknown","lexeme":"unknown","info":{"fullRange":[1,4,1,10],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.R","index":2,"role":"if-otherwise"}}},{"type":"RForLoop","variable":{"type":"RSymbol","location":[2,5,2,5],"content":"i","lexeme":"i","info":{"additionalTokens":[],"id":16,"parent":31,"role":"for-variable","index":0,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.R","index":1,"role":"for-vector"}},"body":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[2,17,2,21],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,17,2,21],"content":"print","lexeme":"print","info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":22,"parent":25,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.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-9699-t9aJv9iFklVM-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-9699-t9aJv9iFklVM-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-9699-t9aJv9iFklVM-.R"],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"function-call","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"variable-definition","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"function-call","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"variable-definition","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"function-call","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"variable-definition","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"function-call","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"function-call","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"function-call","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],"cfgQuick":{"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["32-exit"],"entryPoints":[32]},".meta":{"timing":2}}}}
The complete round-trip took 11.7 ms (including time required to validate the messages, start, and stop the internal mock server).
Retrieve the Output as RDF N-Quads
The default response is formatted as JSON. However, by specifying
format: "n-quads", you can retrieve the individual results (e.g., the Normalized AST), as RDF N-Quads. This works with and without the control flow graph as described above.Requesting RDF N-Quads
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.6.2", "r": "4.5.0", "engine": "r-shell" } } -
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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/exitPoints> \"6-exit\" <unknown> .\n","results":{"parse":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/token> \"exprlist\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/text> \"\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/text> \"x <- 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/token> \"LEFT_ASSIGN\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/text> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/text> \"x + 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/token> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/text> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n","normalize":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/type> \"RExpressionList\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/operator> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lexeme> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/operator> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lexeme> \"+\" <unknown> .\n","dataflow":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/tag> \"variable-definition\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/name> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/nodeId> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/nodeId> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/origin> \"builtin:assignment\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/tag> \"use\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/nodeId> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/nodeId> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/origin> \"builtin:default\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"returns\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"built-in:<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
The complete round-trip took 7.7 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.6.2", "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":"ᯡ࡙䂼ࢀܠ墠ₛ⨢瀺䃆ࢀ■挼͙ျ※:,ᨤヰদ䡌ׁ性䂬₈͐校ヰևソ柠㶵ⴞအ㬌ü硒砤䠣堣ᫀ䀫㊨⪯㋕൰Ƞ♩㑠〤磡扢௦ɀ矝⏂ʤ࣋晱⠢糴ᐬ㭀䌫巳梭爅碣⊈ᓬ磄㌲⏫搇狨凑猰沥ᓔ䚛ܰᥡ扰।扻戒䫮峟䷨媸沗㇂グⲅᅪ䢭㣝ᩳ༴垩暦ஹᣉ╴䶎堀檎Ҡ擛⪅悯㔏廠᷎မ䘥࠲ௐ巯㐙⾜乊㕦瑋敦䓴ဠҁС䊐ĠǗ塀䛅ษ戌〮࿂ᥬ猡আ壸ਭ䨧䋀༪℈ぬ⳦ጂ္ᅪ匰ᩪ䇮搸扥⓯ፉ檍ᶵ疞抎⟩㌥涱Ә㏍䅈ૹⅥๆᏆ▋Ử版ᅑ᷒櫅嶅惎Ꮆ⍪嵎ઞ祑絍ᶇሠȔ晷!ኢ㐠Ⴔ੦ᆝ碊ѠǍ摤åϣ恣䣈ɚ䟐穾̩愄⌠˘ₚ㚍ர*吡߂枺宊䢐恀圥㕹垢⨴␠ ","results":"ᯡࠣ䄬Ԁ朥ᢠ⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨㾠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥう᧡㉕ࡉᨨ漡╁Řోⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ气䥓ѣ⤀㐽᷅ᥰ⒒⬮⥌堸∕絬敝ҁუ䕞ⵇ⨋卍䗶┠㴡䎫Ư吐䀤猱硠Ż㒌㨠Ҕ庀⠻ҰÄႁଵᑠ́ᶝダ璽⮆瑚थ畘ງ䵓⸨ⱉㆊⷫ▍ⳉⶏ䢀午涻⮎泛ྌ㘛℀ǁŇᰵ䂇⭏᳀⠼屉⬀ⴰԹ崥╃⒧ἀ㳐㨆㱯㴍㶏Є絿㰉粟 ʠ區෭੬㇣ᰥŕ⪆ᴙՁ劰Բ䵯ᰰ懴暽匰෦だ݅Ǜ㨣ࢀɭ⊰ɠᴅ厽ᭅ䁤㚀憓Ⓚ௸樷擫օⲋᐿᆨ΄汻ᲄ⏛Ջ淐ᵈ庺↹ᜏ掗尸暊፤嘃㴏␌糿ࠅ綟䀈ϸ朸Ⰸ擌䐷ᫀㆤ㛋啐〺㔣⚁㓍ᐣ㔍ፎ⯀䴾۠冀样整傂⒍ీ岌㗶ᣬ䶔容䰫⓿ͅㇲ«ঁ௰瑵䊖䧨′䄼䭘ފ䯲晸䂴㙸㮪ᴵᴸ洏ᴷ㈲欤幷抗㡜⪯㢾⭄啳ᎊ粰檴枺掛⠥ᭀ泹椁ⰺ㫐ሶ栩䱻䜞❤窲狂䩨後崧ᾣ穓ῶ次猼ၑ桖巘卋揗¼ᲁ䢷ߤ䕵Ꮚ沷⨴捼剥ᧄౌ墅劔男占Ƴ䒬卂㋠ᦺ埵疰墹㶸玼殱䱜捅牅ᐫ狌䠤夢灵䅽䥖䋂昻ⶖ䵗䌲愺箨婺⎹刧筰᠒呚ឤ楱ᙏɝኊ岿⬴危㩘网⍙暁歘ᝳ檕Ễ̉㾂䍩罄寸晒䒘䆒僐⯁抒ê據亅牙丵䔀ݓ│撥㍿杈➻䘑⅌嫩㮕Ἅ稬瑀ᬠ琠㯐噐ᓇ㖄ᯥኴ瀻˳ڦ垵懮㹕嫫ᕼी痂涢૩䉆ᅻ០㟽簼罳粵ứⲦ庱㴫ጸځ᪆◞㠯㺥〝禭綵儢姊琎✂㤺ኄ&猀匦琲ॼ䲰棐⒲✥ሂ⇵-♐⠥∹䨠Ψ斐 㢹ᩚ⡥樮戼⎄公㓸Ƞ攷↔ῂₛ笰ਮὪ⃠ᢡ䱀ع䘷⧚劲ၐ䚨瘭惾⁒૨ᘰഝ橓ॹࠚᢲ䚐ન剕ൈᄴȲ䉆ფり祄䕒⨩䢬攼๓⍘༦ီ䚐Ẩડጹ䲪ḃ㹑捋廤判ÄᎪ·㐻ሒጳ晇捌⥄剠┤䡫ө⁉⌽ǐᴲ時拴㥆沂ⓤᑤ剔拢⠥ࣉᅂ挄⯦牼❔曓㒮䩉派䋅ᖠ繐㍺⭨䚄ⓠ愀⢺䯩㔴楍ᜡ䍁叄ǥ∡冐࣯ࣄඑီ爈᯳啖ᐒ⧅皇Ǭ丬ӑ䷱景内ᶒ瀿㉊⩅ᚅ曌滯㳻䫹䄵ᤦ暄ݙ抰ᤆ乶☔浮ʶ╒䘧㥺ᒠ╙珢⩀䆂᚜䋩䊵䮥Ѱ怽Ⴓ存ᨠ…准㭬瓃伉㎽䧫ၓ媼䭉㚆ㅝ朴磫⋷䣥㉸盌嵫˲匶❆慳❒罊勂⯑涱ࡲ䩰Ω䪦刷⒝ᜂ檫䪥⾅摸䁰䮅灓ᥕㅵշ暪䫪⤠ࢤ嘉ᜃ⫚㿆ⲕ嚬刣檩䱕汵⧿ᔋ࠺殩づ䈬⌈㊦乵㩰畞孲䇄ᮭ␠㦏ჹ߉x洭⽲ᖬ如槑⨣㕔浤ᙦ枬㪸滵犆淪堬ၓ㵷㎅吠ᾡ㞑㾥コ俕拽ോᓻ竹⨗j䀾教ց䑈˄ൎ䳝䟊盠橠ߗ暗喺檪㛜洖烻擻ۺ僓媷㋦jチीយ懹惃幚ᑀ惇⍀杫撛ⶉᚵ䶖㳺绲สⷋ㩛㴅㮊䗞䠠渴⇳ࡃ噚Ꮪ䒏㓡澓簞熩拇氝䭰t曹嶖妲㯋ᬰᔮ箁眾䠻ǫ沽㝻㵉宦㔭玁燁殈憾䢅ᾷ⎘㐦粰䟯㰭⽴ṧ渝䬷⎙倠笔㘛ᢇ算ㄣ䓻ാ瀽Ựᬃ扙τ㴦⧎❈滖攅吠ℤ乑嫌⇫ࡓ祐⍪㑦ႚ篴澬卹侉䦼‣ᯭ/摓盵Ꮼ㰋溜朴燓ᓥ睹漿燌ؓ䝔Ꭸ༆秙ސ綕ಣນ匹槸壶癘ᶶ㋇䆖杢獒勩呁摽◜栠帲夓淽ᏸ㙶榁♘獍˯അ䪉喢屽櫞⮙埇斝竲ⅎ┒ⵙ睽喫ᠫ⭔毚噦嗓ᦦ淍⤏圭庈^վ缏᷉ᗗ琕㙖如㟇╖㛤⳩䫻曡ջ⽓厇㗖ᦇ㜺撮⛦佭噤হ᭛旓民㨚䚊ᮮ柌ÿ㗵䷻ớ孳ߗ㍯㓖羞ߺ栆∅嘨߸缔ᩫ捙ନ牗纘࿘缏盳濃峼差妵䄰Äኞ㮣㤶攃࿖款哭䶣湹�㡇❝➙副侚縛ህ⿍䫬琎䀛籙䞡㶯℗྇⡼弖೫䝞∎㴛㺖孚㉯ଆ亡籿槨Ⳇ竞ఈ㾻媿垶副ᒩ⺱煏秺徻曙ỻ墷ڕ᠗妸朂䠭硴減幺暁珄ॷ珞牏榞漉筎᧪㜧懙槬揭͡疏⬉昳滾㣨ᵛ哽仔綇䣖侙张⾢佱晭చ㱕揝毇彏㴖⾐౿廂ษി崭�吚禜㐵焎㬙嚋秞尌崜冝矃⊏ἕ惪䍩渃㮳灞⋤绯伆巐绷ज矯櫞ຽ㺮笭矼繺冚戶䥏㼭纞湣㹓櫝ࠌ疿䘛堋禜尔ᒙ啨〸惣ጝョ牟琟㾛䏯㛹熗ࠣ_纏爠瀛翯ᨻ懴㛀J噟በ䥀偞纵琿⒙ợŸ㨧။⢶僴✠ԩ㡩瀻⦛ー䆴ഠ圛䁑盓埀䋁䟷檌ఔẋᬧट拀旘桊繟ᘀ缦ᡜ㙘炠琒䑅牫䉀濈摏ࣼ็ᶲ⤵Ģ畱㥁寤Ạ瓿Ҧ◪↲䋰䜦橸憙億ㇳ⡛皠ต֧䑗㚲ঀ搥汖ǖࢠƁ獽㊈Ӆ㪤瓫成Ȑ瘤㺦ૠ㾥怰ሒ㡤籐废瞠㤑ⱅต㰤憹盏㐛扟ࡆॹᩦ牜懮䋠剧ⷩ昼䁐Ω÷ℯ痠伙ౘ凄ඐ榦ᩔ繏䊠≦њ憈൨筧䞧⇃㌠控䇹纝௨檨怬㆙傠ᢀя噿㙨䶦橦㆒່惥ᡘㅬ煸磦ⱻ㈑猡ܲ籕ḧೠၥـ慮ພ─瞴煱ॹ㗦๏ᬋ憄ᾰ国ࣰ斫ṕ焣ଷ㺥㏲熲䜘皳ᩅ㋠䭀尢甠咏ࡸ奦⋼籰䡟繁愷स搤ᅘ尧熯Ꮊㅀ咥牝Հ䤭䁧ॿⅇृᆯ珠琛䥄䧀䢸浆࠴䃴⥄擹䧌䭘䛥光丼䧸䏸奒樮䞿⥤史ᛢ䳄嵦䉓ᠲ俄斨╏䷠┡奛٪䥴均繋ᆰུ罆畑⥌䋄㾢啇狢乔曆兀ਈ亞ᧅ畐槦䮨滐慓廔༿↰ⵓᅯ璠瀙ᵎ焳㦧幭廂乿ಹ焺墲䤨恅〼᧺摺捒橛慄ఁ灹楫猏㘻ፕᤨĔ啇橋ù䭬忆ⱨ夨ϭ␢Է䳬俪⭍ᢱ亀痆┾姙䥌戢孒櫍䣴䶆嵗櫽䲌曤占㦒䤌䃁匥⨑畝ᙀ㔦xᅔ濉ݦ㦓䰼佄卩㧓侼椄㝅㦾ঠᙀ䉡㧱戅獊⧱䳬ᫀཝԜ䫜戅獧ⱺⓠ刄噱祰ڜ娅⍙奸Μ䠇字秌亸缄╢䩴农檨Ԧ㦜唢竒㽉奻ย琴տ䦰⤢爵Ó縻ᖢ澄剙㈛佹᭪坊椨Ⳣ愶䝒Ԥ⽶طՓżܢ滧睆䕮䊬ᰵ݉皰⪂崷䣑䖦䷂咀ダؔⱠӕ䖋侂䨄❽禼侌䢵ⓙ礸⣈簆ⱋ冫ਈ帶焹棪⩂盇ᾲժ⥄㧳捆✚⫲憶l╘丵ᙞ煶⧲埅旻俒䐆✫㴉䨰涶呢䤎⢒畆⁗敌䄒者糁祉䆂䶷哕礱〒䆆㌥䤻┼扷磅ⅦԴ╢婓政৳㩶㋒六ธ浛㥘䕉只噷孜唥ⳕ㉃攱⣎䛪媶㹑Õ⡴㛱䓔啯㖊絵捓湮㜊盱Ṕપ獴㠲䩟煵㕑敠为䡇孜㔦В㦥唱⤋町亻䤭啨䠧㫤曀ᗯ曺竷柽姧䪦㰤䋤ᬢᶯ⮤䦷睚田ך緵孊㕺灚籷礥痋枚縋㣋࣏Ⱖ庀础⨦曵᳴൰梚具㻒槚Ⲵ᱔㻟䦈濝Ѕ廞੍䈲宁ㄷฝଚ座ᇖ㕟䧦祃穘旸う兔Ⳙᖂಚ壄擽敬汦楖㵐疲䎆沧祗䵪ೕፔ懒ᜌ楆浥㽉伌槆俩䑏䕼ࡄ䗆☪涢䝔◞Չ啶䋴旗櫺樴懁⤠恭嫆ෘ涑⺴矃䷐嗚淉⮙ු䇳ࣄ㼫᧔᧸㛌⯗嗇Ʋ業⟔僅涶嘀傷σ啈櫠⢗存ᵥ㦵巖妎ථ秳䗇涺檛Ƶ唩䭒䞤呃⣮ⵖ俫珅㢶棜䀻᳝姥沘䪤奏䬘梵⦗㽁ᔭ湪䎔⭝�䱎羄㯑嵬猠ྖ䝟嵄䯭㸀┤⧊⪚瘺䟃㋝業㔖从测ើ垄㛂㵌滣ᠢ盔⻳⭆睕〳㴫櫮䲸࿒樻慼ふ晗丹䰌浩促䐷涾縧促㲒౾檩濝/棌䭂Ԧ:䞜堢㩞ㅎ䷢䫩䀧緷堞䥂�緓圡瀕₆Σ梡怔�繊ࢀျ揆絋ᓡ䊹䏜䵧⋡箅炆䢙冼‱ẋ澖俨⢃䠳✖灥取㬔᫁罅墎栵䳠媀哘Ϸ洡檩䀧䎋䁁弖㌸⏌哮槈㟄⏙濑Ꮒ䡥䡱Ⱦ傶ᒒ㡊ᠾ匯乓嗌ࢠኮ㒎䦵濱䚮咐幸缭㳚ᔳ࣑氯㵎揃䮼夬呌ᣇ䈲宮ᢅᷬᮂ欯岔㦾᪄煆㯆䌩淉⥁堨揾᧱碖㌢፦ᮞ斫抒樠õ恑ᣛ孲㒾ፖ䙪嬳ဦ攟ጪ㞺哮䀡䃙х劸瑥⛤㰕⪿ᔟᐊㅳሉ㘸ௐ㡃䬷幋⛵崳㲼შÚむ㚿㚀曠垺›徕䞺屭㷉≷ᮞ嵭␎懚ࠌ╣ⵂ㪆♶⛓癧壾䨽䰉䒾ঞ晌凓傹愊䒖㶖⚔崛㊖㽍䀻䙅簝恃潌墼煻妻爹ᒀੰ帇漥ᆴX㠡ф♂ᖉ㷣㉙硏⯸繠噂妇⼓䞿牲឵ು笰好姓䴪僶ᜍ拘䘢㸸ₗ䥪淇͟禩㩫囤柕㕪ʲ⚔指Ý墓♿炾㗴ޫ智ইᛠྫดዣÉ㋩ᲀ渫斥㙫敥匆モཫѼ䂏᠙㻹䕾猂務㶫㎸甂H湸㢥㛠ቹଙᚘ之⍾勼㇅㪺㥺㎮嚵㢓筽⫪䊀໋⅍㬎囝剭䅸䫮ᣭ㞨彺嬃崉ルᓰ竣嚶㹞㝻暮՝㑅壺⬗嘭㠻ᧇ竼sㅨ歽䬈㚾悻㵿㙾㟹㋁崣㬛❾㢠ዻ䜞坘䆻㶆犦㛓㮋ᓴ囤㚄㐒㬝䖴ᱼ壗㛋ὸ嫩坳㩲۾۬嚻㔖绽㜁Ⲅ捛仾沠ô㷙嘒泎悖䧓⸁湪繐槞Ḛ㢦繷信巹泣埵⟘巡櫦㥴獲渮祖㯓䙧玺磷㯘涼滮䈗ݝු哾犆矙ଢ⊎氆ౄ縗泞沗俔湮気ဲϓ活䖄䢕㷋⠡稆卓匨䁞殖䓓ι勞恗ҙ䶩泺愯俫䎡渼窯磑ⴗ旿埖ᶸ掹侏⍌أ⅔僄勚ᙈⷠض堥怶ᒠࠆ罗幦㔢疑⃒㹪⪃ẃ庩⑮挨ᦊமᲾ傩獰⊔䤤ጠư緺搞❐̝ư吨ǽೖ㙙ㅅۚ狯廹揈Α瞮Ꮯ揈͢沕フ叆⎩耆劜ᾢ慯濤叽狉斱檘ᑭῢ罸㪒瞝ẙᚕ㚑㏖曒滊⦚㼈IJ㖛㟔檽ᢏ傰珎᳠ޮ媧揨灯ẜᎸ嶩恰ነ؉Ტ氷犟瑄થ敮檑彑㑮綛叾⁅榼֔珂帼璏妒爛ಘ䉻ᯖầ壐喔Ꮼ掙经㽗玣獕灎涜娮嶂⯎ᆓ氎刕筮ᖨᯂ‹碒ຨ姖瀖㜎嶻㮣无ϫ䲐宷岥Ⓕ䮑玿竵瑯㺙ᐍ尥痎ഁ絮徥牏➞审忥笎侁篭悥ㄇच篫⡐ءۣᅁᒃ欿ᮧ㜿彵瀎殗⯠㵕搾犖ߥḽ爾➝ఞ工潯焛ᵼ㶂㕏ᇛ當㾃棃呛䯩甜䆦ԐᏵ巢瑮䘮礣͙ీᒩ䬘ⱥʵ碥ࡊ⏞ゑɁ⃕ぶᵸу玦嶍瀶ᔔఖ崭ȿ嶑叓廥挎焘䰇ߐ璓̗䶊ॠଥ営帋Ṁᇿ伔឵峵撾挗奩㳠᩿㌕ಙ㾿à䬒堃⎚ڂ瀩堍ᎋ掏ඟ玹ả硎ޜ叺㶻昿ഔᰆ㲂⚥ἚᲯ㾶╢撡䯋ὕⳟ皝簁㴛瑾濯矉㳫歯∘堅㹐䅑刑埘Ꮷ滸攜侶平浟䜓⟳㼕筟᜔栋㽟洟㰈䒒༉摒摆ɝ拞㪁緭掝Ԓ᠕徫称东恋籟渚城继柞ḧ濽㴣罾⨔ῃ㹪ᒟ䞕俚廣檞䴉徥岐斟䀓悸砲偬斧ြ㊄罠啒䳝瘛䯮劙瀎⟃约簍扟ڜ搖䏣缼糎皿唺‥祧㮼相だᰠ樘㯦㱣㱍ᆟ睿䧬怐傩帥Ƌ碓⯟ᶝ殗矸ཤ̖眧嘞⢛樎㯇·㭀⼙偊jϻᇀⲡ稥朎⇔´ݑ昸Ⲣ埻澂㸋煲ᇞ䄛ᰇឹᣇ硧懿㈓䟦缽㵖矟䞎唛 䀷Ɣ箻怦☢Ȯ恑䑥ϗ瞌䅡儦ἃຼ䇎筕ⅱᢣ䨩䁟眦籅牟䗞ᴥ䐇健缊祿族⸝☨⁐㽄͘ൠ⸞爘〹῎㺮چఀ䌣Ⳗ㨠µҕݴડ䣒ਸ寎䉬ۈዠ簢Е淪估巌ྟ䆾璥〴杉∜䧔᪁❓珽㶑磚ຠ⢾堤ȍ⡻ĩҐᵯ㉣尭塓缬䊹拌䄆ບ橯ᡰ㩝䃖Njལ㑐⡵パ…両㢤樱をŏ穬ᎀ䔜簪審乵惲䍸⌺涥ஏㄬÜᆯ㊠ၣ㓹䝇䉾ᙖ丁杣ڏ炀憡Ҹᒿ⣣㔮烐峰⋾䀆ී慟ߜᛍ⇬弩㱗烁䳈叮啐〱ᗍ灮䰧卍⍢⻣䰯汄ࢧ糦ை㵞䡤刾䁳⇐䛬ኺł㢯物䣂≋ዲጾ秘㤵熸⋷楰楂笗ᡉ羃䋌൘㇁帧砼ᯐ狼䜹歈庈⥕⠠%ᬝ䲔⩅⢷ȡ௸㢁Φ䄴㡲⇴䕬Ẑ哃Ȭ䨽⢼䌶ॹᳱ椤ゎᑊ冘䕙䃠᷃᪭牂僁䍑ր㲱てⰳᓘ凉ײኈ晢簦㩟ē涊⊔㽁䞦揋嗖线ݦ᠀毃粯㩘ࣁ∭眸㻁㽦椹ᒅ憁實ᆈ紝礳晆椛ࣣþඥ䊂奉ㄩ䟑柨䪣䦬⟵ᤖ͉ॠヱ㎥刿⑫ⅉ卶Ᾰ䄢瑓ᙃ悵рࣴ␡༐庆矐煪نὸ偃ණᡍᢶ扁ਜ਼䣱̵㡸硃䒃⇘愃癀䁜壠ᴒ疦䲘ᜄ䲌熾䜪ᢰ䓢涨䩆ࣕ扳⏼㟑ヤ器粑ㇻኴ᧘煢㊀繊㣺拽ཛྷ⒁⽧甽㲒爍䐦Ꮈ司㾩㡐獈ቶ㛹ᬁ䕡䔩粓ศ◌ᨘ挢枭篣棠ፏཬ⪱偆漷ん℮ռᾐ稳ݕⅉҽ揖↜ᤩݦ⋫⊏燇䓮ᖤ䪃玮㙜࣑⊏န㭑㡥Ứ抔শ䛈䁄尳Ɂ㸥碝捠↩ॅᢾ⢆ঊἰ矃⊭穛䓌挏ࢢ㚔煅䐸㦮䧴▩ቄ敬䙩濡Ⓤ䎕ਢ⑱ͤࢳ抆䦜➉ኄ箅扬湙㼦Ĉ䣌㴆䬲㠎䉶兄䔊ᙨ渳ப煆播ከ䴌⒩滤堎≰䥾╥ႄ䊨䰠磱ᓳቸ䱲⌑צ㢶剨⧰䖥ᾘ司憦╕惤加冠ᇰ䥅䜽䏝瘪䆵ᝄ爉羭ㅉⓣ䋌䤢㍞孆犵劄ʴࣵᡄ䆂ၶ啃⡨揖☁ᗶ䰫䪸彅⤩䤟⿃ó㕭ᘬ擡⏸䣄㍉᎘椳䩬慽䟇╔棲侩⇳⅍劆䮜つ䅠�⁷照獦᪔䘳⥯᥀ᒬ劝ॺ░灇沽璥榘ࠒⲔ琭䐪㱧ं愕̺㸂楄擬Ⱝӟ⟀ʘ粳坨ⵙ─ቓིⶉ笧┴筐ᦿ䉦ج仲㪆⍔ೡ匤ℛ䧱秛ἇ䙪⤡ѕẴ䜳睨㑍唕剂䡧䂹ᙸ抱泍㦯கᭀ㢧ᘰ䡓匋᚛妎㚄⡌①刞╖ᓔ祓䍘䓤㌀㜆㖹皇അ᚛ၒ摶ⴗ⨨ဧᘴ㤑勠ࣾ䥹搀喾ㅟ䚳檲ཫŗ䒦⊉了㥹喆斱㚖奶晋ᎌ拀咦پ䔃瓕䲖㭢彄ֽ䉥䦡❍ᅬ桲哨䭒į嵷ޖ㫹̠䇏ᑁ瀲ଠ㯍糯礙匥䱺╩歆媰ᧆ䖀ࡈ㐡⿷南᳘爽猾ڂ翆態梇Ʌ斦ฬ嵳䧮策瓒㊭倖ⱹ烅μ縪〤䍷Ậ湄嗮捜M⁅琷厹绨琰祷✳ᚴ串睪㝔ⴉ䋓䨬Ⱐ分⢈憪ừ査挋キᮣᝄΒ浑熱ۙ㧆↲五᧭⛣ᶴ紓拮杓ᢝ珗伎▜⸅性湨熮惶ԓղ粥糿ㄳ亂㊙ᯅֶ乫⥰䙿瘒…罍紞╀⫢ᴶ涰ബ垽⪦䯽⑅Ȫڦ啙⾝क䠢⟹ᨇ厲Ƒ儽╼⇒㨫╬惁ヾ卌⍡⤥父ⵡరĥ磛戄囍瑌呱䌌੩亾㇙簶嚺ž⧌ᮜ᱿“ొ㯤弬ⲣᇾ㲑ἤ⑻ᩤ⢕旑嘃柨杅崞ᆱ⟉㻦汁冈䤩兊ू䓲㊁Ⴎ㡹૩䞱㇉㵥便䉪䖜ᔰ奈ㆫ㩯十挘區Ձḙ疆Ʊ庩䛟摣“呒䵪⣚抢୷㾚漷എ㨀᳢禌⦦䓅棄环俎〥ᢅɻ憁ׯ⟗⒁ᩎ㹕⊘䮒ⷱ㓁搵ぼẍ⑅ᛰ呬恃ᱍ惛䌀⤩⭅䥢⩲䆈狍ᖀ塾⳽崨ṟ佴䗚⤁⪙㪶ඳ憃槆撍ᴞê乐⦗䧷䗨峅ᖱ悦帼ࢅ۷Ჲ䊪ŋ慕墫獒⭖㚔斷智ಎ樒䧬嫒卄㢢䐦R⤣ѹ㕤Ꮱ㦇櫳䘘劜囪䅪敆拝䩆Ᵽ包段嚏撣星ᘦྌ碜竗㷶眶磝㆙⛅↴᮲ᥣ▃ᗹῒ炓曥པ⨾Ǝ╦✦恊傽䐃ᇘ幊ӌೀ˴狲⧹Ⰵ⚴兼縮ᕄ咲ࡪ愕㞕担䢜⬹⪆⃠⁺禼琦g扊ຠㆡ̢ዋ䫒⇹䭬ᴠ繴ܤᖗ�堘如恪哎Ӊ瓺⩻ᗛ宵煵祵嗢坒噜ۊᐰ䫊⪽⮅ⴥ㙒眴Ʒ榍㮺坊寪泉㤊⩵⨙⺵寚海啩灡䧠塂ୁ众㡖ᢷ㏐搕⩡㖵ྺ祪┴啸哊捪⻎卑ட⬼ⳁㄠჴͻ冚ԣ䀸娜挅嫌⊭䩌Ⳓㅵ❷ᕾᦜ㖰ࢆ嚬幪❌′嫞珷䫁䬰獫ᤀ浸m嗺夺披໎ՙ櫒櫻䦉゙䛷䵎泋㘍噊⪄ᤑ䷊۔椩樬ؽ㏹綅㡰䖒䗅坂嬊䰝㏎໑歭歯晳䭕伷䟧嶉䖕䑦姒䏊᭐䓠珠⽺叐⓵㑴塱疧⒪࣠ơ篊嫕ݷ欓⭑⃕΅r嶌㖝垠寣ᰋ矯㉫笘功痛䪕墵帅΄甽喾呺瞋Ὅ⻝唆䬸䠟娭䀙㠇ᵷ㈬嚖॰ɡ玐ᇈ䛤ᬫ⸖⑹㢆汱䍤䛄㜱塝㴺䅑㭽窪珢㓄ё牕罹╩㖠㗎幺琑室燔㥁ᬛ䱖൹䭵壶ǎ姵ដ᧺篪绫佛犡⹙❬煖ⵥ㚌᭲ᚻ忉Ỗ⫛⣝㧙ᩖ啵䁞䶀㞁䖆琋㚈ᠼଉ殝⟓㽖״灿֟瘉ᕂ度䖻ᦡ㧎䴄氜泳⪰乹䝥㑄⩮㘉制琠咧䛅歜榭㯭毵̵厈ⷑ㗖ੇ⇬榉䗎ᜏ磉Ŭᚤᵖ⬺儶䶥㗆弶烫燙ᚥ犹捋ⶰ䝀歱⸑▉张Á䪦ᗓ擤Ǻ澙ᓉ⩼ᗉᝦ卶䧓粏盒暿稚欋㫭 曹殀涍㕲ඐ绁╉瓊⒯歪浻ヰ痕⩱ṱ丒坁媆劺㓏⻚㛕孇[㭍巔㢭㭪Յ᳧ఁ揫㧖劯᪘樍ⴭᓕ᧪箍幮⒏ᾂⲳǍ䇙唰㫣㔕灸䕤浞㑽妸ћ睕ᥬԏ⦩㟅⥗Ҵ儦倸癄堜击盉᷑✊᮴檻⤽岗燶即䲈瘃埼䫓䭶痋⭦㩬⡇㟥⊗擾㶉ᷛួ勆炽恃㏆仨她氎㴞Ᵽ纅们㮫奎濑ᖌ緌㜏嬘桧㾽㽔嘁ឍԒ睕凎峚ㅢ㱤䉎⁴㊔ੀ᧣᧾ⶻ¦眻儠⧛偖Ộ㜃ᨴ櫃㞽㣴⧴⨵嶀»嚎系㻄寛䢋㮍氎⎖㷱暓睻僎棻䗎⯖囋犣ࢯ㑝繪Ᏼ瑅呉瓻剽ᷪ弰範滬笮殳⤭䩖架❿ᶎ矇塒ⷥݗោ崣㰝洯⩀ᰲ然ݦᥙ瓻壾咚凉䟕ڵ㮞業᳝眖䝏澔�畻媣ᰠ俬揋㜌㯓瀗ⲝਗ姾妔᷼㕋巾岚恈⟔㼟痧濝㽅ᨕὰ㵶甂؎巛ℊ揗⛐⒯楟⢍猷៵澅疴旵埾嘚㜎篚媶簝湟㘝吖瑱ཷ絢⨟媾沺繪珄伇㮛ⲻ㰥䀬㦸媫絃皟宾懤娎夥纪穛楓➽嗶⾊Ι畷审疕癆䂁弁箰Ṁ悝純䁘⾌ᴠ㗏囂琑搽႖Ƥۻ渿㛝⎗䡌〵㉭瞿剶弚ᣄһ䈔ڽ湏◽⁔㟿瞇͢ฯ喎咦捑⡢ổ娠⥣怭㶽ℝ◔対剒⨻淙ờܨỹ̛᷍䷶瞩䍮磿尚䉺徍⇇窾惐欤Ḕ歴烸䵌䃔䆊禒᠊ࣣ懕ᣴᢌ℞ęЊࡱ⣚政ᑢ䘨⟮纴ᨿ泮㹝㼉籓㍒ھ䍑᭜䉰撛༠䞇ਨ摁津䉞ࡤ⎽祤㶟౦㘹ᇵୢ⭻䱐䲯䣏⤗ṊंȦ債ⴽ㻜䜜䝔嗞㐚␊⤁䈅ᣎ縚暏Ꮬʮ䘸طⱒ㚮ᕃᄷ䏛旛曯ྫఌ珝℀䊚ᴨ粊㜘ِ㹑҈㳚垻瘼⒅ᨵ䜕ၸ榲亯ၖ椎⌭➔㈱慦㬿璟⃫緂ᤸ穝㢯䙚⾐ൗ⧱泪塢ₙ䝘ᆡᷘ帍䕆ṕ偨㺁܌㜑奧ܹ䏓↳䛏⢐愅ⱉၞ沸ᐚྫྷ拸̱㜿抙狄䯁溤矃㡮幙ࡰ捨令㪖䦛⼎Lj䧠⪹Ẹ䆠㕡㉖攊搁埌㉈ڢ伽䊈刘⛉ᡘ矞⎯⫻ྉ搋疌⧩䨴㊾罹䭊›垛剐兢ᕑ癬ᔥ眒㧑罆⠖ᒏ㈗䞦᬴監檯䳸䞘J䷊㲇ׇ⺧䪜⢇咫Ⱖᕮ‡㛝捰丒㌩滆䊼䒚䧱➱Ṙ楍䥯桒泓吖䵺㳫ெ仱⡸⍆ᨋ♓⺬㵞─厴䴚㉉熣线懔⛮ᡧ䒰㨘ὶǞ㌶⮢檢榆溿濩ᨍ䟢ῴ焳㽮楙䃯済䱶幹淭►㞪䡆妰ᾠᏓቐ⭗⮹Ᏽ上ォ濆ᦸ㚜dž枓ẟ΄⻯䐳ᳩೳ૰䄝㈧ጎ⺒䈕ەᱟ䮃枬歒ᴚ㌵൵岉俦ٕ㦷瑰剼紓䌒䌡ౌ嗽䳾㤸ᝆ儉犐㦽枧Ḵ穁竮⩖浇䷬ᄙ帇戨Ƈ檰Ǥ䢈昍០ᩞ崀⍵䷞㸉惧箼粓式䞟ἰ瀍䡌牔牦ఘ碴挘⭁ᝐ䆟╁筳佭穑ࡺ㎿䶮㸙䨷璻ↅ᪑ከ岉伫嚄ⳎᲶ䠩ɏ欹唚㸺僃䗈Ø彏娫㲮惐ᓫ掴ⱁ㵥䈇⌻册⇨ڣಖᮣ⅏洈㦲䭴僉㙂盩⒤ᬰ惥䛄ⷪ份㵎ፖ⌒㌲Ⲵ㿑璶䡸悂㦾箻ᰳ⣫ඛ玼䵮䭱ಡ㊀▬熺櫣斳ᛗ᧴披ୌ┍ஔ俩㶡砪㹾湸悉嶬Ჯ夣ࢯ筗矉䭣信㦅䟦䚺咘禦᮪緒ࢮ岱熪绞⼤㹥䕇ቻ▐槬暯ᵢ慫瀙ૐ⬮笷௯ា煎㖘喢䟤巼搓瓍⫙䫭Ⰱṡ㐬ⲯ㖓愄䠔屑㬬弤⛑欖獽㕥潷掽ࢋƽڲ珨㚋㮚㛖䣬㨷ཀㅱ㻶≸㲌●❳᪲禋᭗㋴獖硙喑盷睽焳⛘ȁ⃥Ăॗ㱗意劸༑ᄉ绔䧳嘢巌璓᥍㹚ૺ氖֤罻徯ᗿ埾堦昋㟍ᢥ䃶⩚㩶牖掎㘟ᛪ尪滓ᩎཟ欝Ⳇ䜭旫磼埞䲺㞍棄ጻ绀呈朆Ụ℩⻭砭嶤᎔喴柪娪氓犌罙✀氕㝃潗䶌䮇䷍ᜤ⒆環ɬ旼䛲寤丳姉氆█ⷒ㞄媦犓⥯⧚圐䡒淝㛍婗ᝈᨰᄵ㛾廖瀻䍖㗒ܑᮀ湁ㆵ棖慿ⶒŦ㠍怄䟻盭姜䛹ぃ孛厹ޗ㭞㛬弊榋䫌囚ᥰ㏕ൠ旌൲⎍痨着䜟᤻耈翃;䅼漇㥘ˁ█ჟ᠙归痻⭏巗ጔᯗ⽟࣭店◺゛ᜂ砓屎杛㟎⢺ᐡᰑ⽃㯽羗䝿㪙ᗘ壊硋ᆏ毘㜐㎶㘯㾐焗淹瞑㷶㠌⒆筃粘ߖ笆簊沓唍夗嫸侗ⶨ㞰塖朋⎎ᱜ䜎箞潿㓱丷ǻ㶋⑩慌啀盻䮷ῖ搹㭃溱㥽䲗嶞᷋垌寀祛䚎㿚绮娬潃ㄣ垗羉㧨ᬮ牌瀾႖炁⩄Ⱞ㴍䃖⓿Κ斱ܳ姬猛姱傒绦ߗ浟㺣琠冿⾙䷐処狤䚌ᢐ媶ݩ⸟㊵爗⓽ᾆ旵垇嬡级溹ₘ୰䜸䞉旫恺ㄇ痗囀征招ዏ翓囯ܤᾓ刣劗㒉➎⏬ិ媱秃㨼埓㡮懻湼寽璖屜க⏚矯崡歧䚏䲖㛹䠗ٻ㔰⥭呥ᮝ緗ລ⤑悳㻹歶 玃痶癝秛⏫䯼㣖槧漿⬡㜄䞎ἷ䪃剮ᙟᏗ㜚外懛ሿ㷜䜘䦴ᵤ磾㰮䥙㞧ᇏ䭉殛缼㢔刅䞘Ẅ炽屛䑛侏朜些抢潧劾㉘䧯㍷儷㜕彮控ឃ㢉盛Ⲽ柑㼋➱ᵼ彙扖嵚摤仂ᠹ橧䌥劔㻦➳ᵔ痁䭯ɛ䤓㏸件㱩矛ᚏ嚕࡙柣汈穓嵯捙垒瘉瞌㳱扇ܿ渱㨌⟷᷏㲁牗䙊扲琟仴ᄹ玓箿㚑᧳栚涤笓姇̗啱徥痧噤硛挗毭澂ᑨ䡎嫺Ԃீ྾㺥愇笾珕䗨䞥伃㼭奏䇓病䞺咆皷ⶽ熘秡ᝰ岈籫寮磺懝缐矙㷣┷Ⓣ㲛મί㟙滯䁟焆㏣伞婪䍛㥾勈㈍᬴ଏও絧喢㋆句ཚ妅扷䡾⇔☃維滣㞭櫎嫚甃⯕⼲㤉㎍ငོ玒ᯖ归稭绎泜ᬃ䰃⾒㪎槷⻀㛸⧴⃮峺絃䨮㊄㎋⢙๕ᫀ琷嵾嶓欛垇洺炱矏⛛㶂᯽࿀㭭柇ኾ䜦ཬ䜻渌䌋䯖滚依䰉㶥笛䋾抛下䝐ǐᷦ幟圑尟䞎㦭纋㵿掚ⷧ堅峢盎峮ⷛ岁⯋䨻㮸擇呦嵜淢ᆸᵦ燙湎燛䞇寤潝㹭皇皌析ค矔Ἔ纍䷦幞༝宥澫㼍硻㋽瘚矊瀜㗳礏䫚崕㷈䆪䎢ᬻ僼泰弑䞝激ԛ滀϶⾷㰁挗㗾斐縇睸洞秏㵗ࣞ㤂ࠏ澿㣠ᗧ矩䌡ై㯍⾸㲭䨾梟缜⯳漕帍搯᪬䦗㛩㿇㗳瘾㚸伄ፗ溠ᒶ橆㧼惘ਂ瞠ᴡ硣獯៛Ȟ寍澧光瘑㩼旯㯧䟻庂爎�ᜌ篢紣撯㌾䔛昊ޣ湉篂䒖ڠ䥅⧫伎傏ᩅ桴䥒糸埑淑絇䬎緜猒寬癔篳恗ᵞ㔞䏛ᮉ䃕㺫佻ບ㽗ࠃ嵓砯奟क昀杮㶎砷扯侏朙媸紲斯ᏽឝ珧ရᶑ罇呡揪甈澉峄Ί⼽ᢣ㨄⽇⽥祇縿㱟䘕怜磫抰☎㎑⯡ᮩṥ㘃摷嫛崖᮸幬硃泯≞䵐ᷯ寱Ⱖ琅嵾ɼ崝▾䴒紾沇灾ėచ䠆㶵禇嗗Ν䔘㞩㼡䗄⦔磟㘖淬ὃ㫗由殘稀ϏῺ稓慏㥟䬒凒␛㻤篗冡猌┆矫举紵惏㱞挜㯩⾡䱹緷仿䤸܁瞻⽤㌑悙攊䜛绸川籷瓿ᶘ䲕ᛇ⽤ㄽ砿䅿⢣䑴ྟ峄窫婞䢞㸜㞨㻺窧氣众ᰛ歈糰䖯䰾ᓞ渊䯒㿺④标֍燖绸〈浐㒛冿ޙᾍ⏢㺁縘渿嚟䦛後䟔淐㉳嘨⇘戁䯟佃㡓愛岞夔㯡ὥ眓砙燖䣜甚垦篓㿝涾⯝㲛堖嵭㲖瑭慿ᄞ琙Ớ算ㆻΜ抢㧬䔛㹄瑂䙟汉搜ྥ㻙紩疗㽜䨜矨睢瘹䩯ᆸḅ⎰仆㦙氏殜眔睁翽綉稾櫱䷝Ὅᮗ族原爞㟭υ㼳縗寶樘刓⿂织懃旜掿ᮐ淺朹纖爏疮ሚ✇澢缞⻏礇ᇼ定㨟༿ṡ罯旯彘吔篹潟期␔㈂ূ䃓㡟埮㸘∗範Ữ㣲ᔯⰛ簒怗㹣紌炋䝿䐂ⶾ癗筿氇␟憈䧹磄Ꮀ⇗䞪实ఊါ翼琑綿㴙砃㿾絻縢砮Ⲵ怏揎丿竟挼姰♘㉚玷ߠ䛡涣崠伒絺穋燯抩吏⳾ǽ怤䀩䲎㩸�Àȁ礼㧦ᘠᤃ䣿Ҿ埝娙㸒ᐎῦ窡ြŎ㉰༣敟嬠卖䃽ę䀭倱䛩㼳㻤Ѐڰॷ涵娜⬡䩠䰧⒂合䀵{Õ悽֠׳㞮╀だ湾妝凙࠭䀀濴㾲Ĝ纎瓤רೇ摏占獖嫜⻒栩穯㈺㾳࠹ȁ碬ݺʆ旟強㬾梜簙稓䱈ぃ䃋ŔΠѸր㉠碜恸Ṙ䲓怳灚烉ဳə禧璉敋垠啖ᬑ㐦簮а₊Ø䇗לۄ県歠ܡ⬍䨤䠔䐿さ⾬℀ƹϤࢄ้攸噠䕀瘢ĥ᧗〺ࡅ翇ἵƙͮ箰ਬ⯀㛀䩂ģᔤᠵ၇䯀佉嚝֚Ъ狨᳃墟ѡ䉼‛砕晄ᡅ憮䱑Ɲȸև㞊䵰⦀窖栝〥㐖瀾翬䂇罶䇔Ͷт瑨ῐⵛᦞ犣戒㤢㭆おဥ愕☪Ї㦤ସ᥋䊀仡⦣ԧ丮ᜩ㡍悛愈狉͑稗睨ᦠⲷⴞ㪢ᬥ㠫䀊停㚴㼪Ơ䎉笢ईጨケᵞ䘜ഘ䀥‱灚㾶⼶Ȏμٸྰᇍ兠䏡渜伓ဋ塑悖Ⴜ⁎ˊ筆卤Ꭸ㏠纡㎣嵛䪒戾ྲ厬徜∗Њޤઘẛ彀弡ោ䔤㪐會偵➙㛈䎈ۂ狘ᕈ⒀絮䧝澙氮㐶つĊͩ穂ࢀᩈᜠ䭁⢡媧⠩Ⱦ矮�䇄䍾ࠐภῈ㐗㯲娢嚧栭䑈⁵惧⇕϶Ժኈ㨀呡熌⪥刽´偡㥇ƴ䍌Ճ炔 ㌰崾咩䆧ఫ房廠䡷ყ䅛籩ঈṨ㳠䒁洢㗊椩ضᨡ䢖摔ℭ屳K⋔ڸኋ㚊▥إ㱥9堻げ懶ЅՋ痯檸㥰寡函潸䬯嘱㸽⡫㞂懕䍫ѿըၟ怀畡ᇣ䢦ᬪ䨀呇便ᄈ䄶䋈ڞ熿瀐Ⓚ縡稝Иᴬ漀ќ悆烣↹糡ٔଔ᭘⟰箁淼㚧尬漌᱕㶵惁瘰䵡磠ྔῘ㝀戁╣暤Ԩ⸵Ὼ䡱惵成㰸Ѥ‾䵰【挾㮣䲚䄩搾ᡗ䡫炧Ǟ䌠䖾༯䌤⇰派䦜猥⬬临⯡`㍨⇨ɔӁฌ៧冰瑮伽㪤ࢪ䀇㱖厾烐ᅜ䊄穡ࡈ⹇⾮ˬ㨤㈩礀䧧傘㹒摷ϸ䛪࢙敘㧐戡䱃樧Åㄴ⒧᥌ࣈ䄌⍏َಬᒤ㪡ⴡ澽⡥丑瀴㱋淎籹ሓ絤䗩൨ᖟᨦ㰠⮢婥䀡椵扂㞯औᅹ䱭ॲᰠ⽨䆱ᗢ灤⬦椾ᑇᢑ䄇∞䐄䒰Ḉ㥨擀䝃嚢䒯∰恆碌网憯嶷ךགჰ⨐䐱㍢偧嬨Լ属࢛烕䋝籇ۄᗘ㗠漁㬝䚤༬䔺汜摷䣮䇂⍬ަ掟媝⢡惣㘨䈱ᓪࡾ悪⇞∣ዑ❍姰䭱䍂礙⪭ᨻ䩚ᒍࣉ㘬⏓ظঊኴ㍏Ⰾ楂Ⰲ㨫䘶壮⾣炪ᇩ䉞簑୬ᰈ❏ᚁ摂ᔧ猯沎ⱁ毝媍䔍␋硥ૂᔴ⚨仄᷃墹癃╠ṯࠣ㴯ۃ⎳箶晖䰴ଈ挨巂奧皭瀍≟䢀䴫冐ľ䓍ઓྔ㌈嘨毂䲱㺭㜄⡹䝟椏内䋀ީ瑄ᎀ⪏ഁ矂玦ᄁ̵ِપᣍ惠戾䖈⍏䄶䩐硬ႃ壤㤧痪≇⯆⢯⇹∮䞕ਗ਼ᨔ⬸敀ᲂ棦榪ቤ♓ಅ梯䅺䈚Ѷൣ䈬ⶸ瑑˴䨧䊯Ĺ♁㑻ヹ栰拪㥲ކწ㖸刈䦃捑㺪ॡْ咇傼凢挒䖀Ѷቆ幸峑߂塠㦪洵晇Ɫ攬冼Ά䜲ྺ፴⬨瀺ႃ㫥▮紳㙛ⲅ棬ଋӦ䟒⛖ᤌὯ݁၂㍤֬儶穐瑧棩₂抽䛻ࢯ䄠ଵ₨ㆂ⯠Რ⬲يᱶ坰冄挿ثఖᕬ⁘竑夃倠卉๓ᱫᤏ兼Ꭳदၼ♪ʑᎂ㻥暬⨿癉౭ᣫ充扣䟷Ḕⶾ㻀ࠠ澐撓ଲ湑氷渲㴳䚻ැႬ㫘爁冃峤㱦眲๋屻㣜熂␛匒冮ᄔ㣠ᴑ۩佧䦭㴲䱕Ɐ⤄ㆫ掷䠕෪䈬⦘痴煢拤Ꮰ偮㸡㲅棳焪碵䑳८㪸悑ႂ埧侬欰穙粑磗㆐ƽ䛽䐼⃰ߑ磣Ღ䂨圶㙊岊㢺熯投䠟मᢢ屘䣀ႃ▨⾮紸䅕㱲㣿ㄻ才䐩ਬ♌┤整в寡ᮬ㜌〭䀪磂焯⍘炰䯾敔⅐瀩湣ᗥޯ²ṛ㲅梪ो挐➰乁ჹႤ瀘➘娲ᢓ挰㙒瑯ӌ࢜ዸ㬗๗涰愑ࣥᡭ圽穘⊈䒰熪ሽ秇嗰⪙ᱝ㪩ᯩ⡄ޯ䌳ᅘ㲇䣌2ⵯቍ⋱䅣Ⲗ㈭ᙇඬ䢷⅔ɣԛ熉捓˝琿⬽䢊㡢กᴔ渆⩂◇䒠㪅掌╆࿑ῂㆤ憩朳㨫籭⽏♯扷䔔㴊碑灄䧱ᕂ⽤䮁䜲၇猢⒲↡ቾ㐦å恪䙩吂梠ང奀ᰃ毧䶮暉㙈ᢩ⒪ੂʊ♺䔴Ҳ㦮⍩ᦨ敇Ꭸ悹⥋ɳᰶ䥐৻ᄔ䢉ᾲ⡪⍩劳䥅汮䢶䥓ʂ棇壣ᎊ┫熹ᦪ㎑ᤰ柳倦᭥ࠫ塷੯䊫ዥӌ䭹ᇒ㢸瀱⣝㑇ɯಷ扒㉨夏⓻ዹ猌䫴໒ₐ智矄均ᙨว奞牽磻Ꮏ㥼劓槔㜟—⸡彥㹪噯前劚Ҫ䦆⋗䜏䔙ᰛ射吒杍धⅨ嘫Մ੧撠⨏ⰽϔ䓡ᵐគ䠃㙨䕦搴Ზᔊᄓ嗤⠓ହ᪲ⴄ杩⦳倀७擉䕑氩ᓜᩮᨉ⒂久Ᾱ咴䋩㑳ઠ礦☍Ⱖ⫛嚍䧜叞䒒Rץۤ棡≣❄クᲶ噆糐唎別⑪䥤⣊⾴壉䅳⣅悧⊺䟹堸絲ঀ˹☊䭴מ䶤恩⥲烧✭Ҿ䥎≷䤃⨄縕►䯾ᵠ䇴筨❲ڡ㡩㫬㕝剒℟Ŧ勱☲丕ᐰ㜁⣩Ꮂ哆敩励㥊㒦⧭ၣ⒤୵ᬺ㶴忉㠳罄番粲㸽䡚ゞঘ叧扂䷙ֺ⬔ࣾ䎳禛䪱ൔ摶⬬䤪勱⚆佹䎺み㚁˲俘᭬欬寱烖擎k撍檊䳹်❴瞉㉱糇䕨Ჹ癈犗壪⧶剆╦侵᪨⯔朠Ỳ⏆խ㊶䕈㪏㒵⥪尫Ӗ䫥᧪⽸忩ᷲ䳅睭ʿⅆ橼哨⨖匋ⓢ䷽᱓屡∉䛡䟇㕨⢴啊珜礎朊叞䔿ढ़ሲ⚔䑉ࠂ㧨㽭㺶慉ᩮ咱⥠㈼䓖䥁ˏ൰⧚ⅲ埅ᅪ䆰ᰦڏ⒫⦒䎬䙉නḲ㺔簹宱ࢇ畭䆺嵃ᩬᓜ᧨㏙┊䱅੨Ȋᛩ㑲ᒅ䤢傽擺㑸⣉槜⍃☞䪑ᶦ㲬掎㩓ང棪熾ڻ橺ᓖ㳊↷⠖䠱ᅑ最慒緅䝬µ癉䚘㔉槴勸擶䤃ᓒ㉬姀ᅒ妈ர䦿䐣⚔䳒᧿⏷╓㝡ܦゔ按懲䱠䳫ڱⵑ⚋ഊ榖删旎体Ḟ䊰ᖹ㯲亅ᝬ妴忠♮哀椱磟䚹修㘤砉ᥲ嗄ے憾䵈᚛ᒰ妤㏂攲䤫ᔚ㝴神᯳‥䓬墥ᚃᒧ槗印枑ୢᆦ⃤䱖䝓㺆牱▴㵖穨ഘ娅㊒擌爓ᛆ㘎௩宲忇彬়祕㊓ⳗ榲勰搵侒ᓄ㣌涉ᵳ坅Ƴ捈㚛ⳕ䥿劲昙严ጠ᜴們曉ᦄ曩粶╔婸潩椪㉸枥䬶椶⟴牉㧒掇拯㒫ᭁ楝⳽⨍ၨ擠Cᵦ㓌等䯒҇㫯新剏嚆ಡ姊㏮摗啁Ҧ⬌潩⫒ᾇ滨㭌ٷ䲻兞ኪ⚅丧ᥨ෬幹⍃㶇⪭亱㵄嚓瓞⥀献敼冝㪌她泓䳅ᐓν竩㚖Ხ⨉䆎ޮ䭍ᇖ⛬囹櫌㮅廬Ꮀ琦嚎᳔㦤刹明䵘ᷚⷌ剜ᇓ窆嫯ඹ权嚆䳰妵叉暛㗇Ꮖ✄䃙㣒㭅㧬溰㍍࿇洈㍙ჽ䰥ᱦⰌ縹匃擆憪㘲㉘❹亹㋞⟽䦲䠖ー嫙ᡓq仪粽杙崎㦯㎁杝侧᳆⇬惹ᖒ䣅淩᮳՟♶᳛妆猵春倛⌴⃙孓宄䗩ᬄ䝐Ṣ崀禲猜攻䶷ᘒ⏴繀氝Մ৩㚴作檆峤憴犕摳㜯ኻ剜抙即Ễ嵩⾮佘庒㳹㦀㉓擇䬚揶䈼䰉ᬒ∅⧫枷坙ᶣ㳞⥭獅杷䣏ᘊ㏔丹捓夘淪粺䝚晵咶秹ᰤ㦈灗ጪ㒜箹≒䣆宺坚Ẉᳲ刀獀攧䷜ᛖⰿ㲹ᴓօ䉭ர皏棒秧狗曫亇ᝯ䷔䟢dz喇暾浙庎㳩祒巇旚䶍ᤞ㢆ΌⰓ ୨皾杖癱ᒳ礡猃摿䬿᷎ℜ淉巓䧇O�Ὀ皜崏奷ᶅ昲䉞ᥦ㛜絎㦣孅偍狁䃙繴̓樟卽敤נ嚸ἢ擙㈫碣㣪▶᩠͕㳚ԩ删❰䨡ᅮ㲜䰙榼ᗘ倬ƿ⃛幫甚թ㎦栓一厎⡢嫩師眄㪮⬴ᙈ䆛೬如எ⑨ⰛჁ㹔窀ᒢ䄅ṳ岷ⱔ♾㓴䓢協᠌䡀化⣌䒙ራ䃋㺬潀慻操楧ⓥ播䬏ᩁ⊌獹弓璇ὔㆿ湅ኈ㳽㥳牂㯨⺐喓嗢婙ᔪ丅ዪ粹ヘ㹬ᓫֲଖ䟔伥ᾆ☢䌙宱儶㷪⊸ドᚔ缪Ֆ獒ទ䢠度㣢戙匫澄版⍧筄兤؍၂ᗿ䤛ᴱ☼咥専ᵇᷬ⑸䃅ᆖ䳪䕺椣䦝ᵱ㵌梡䁒电㏯ᚾ惐䅢ᴂ؏㋠旔⧄ၑ⛢昙⊓竅ᗖ忣杞纀⋞ၦԒᗣ䬊ᴡ⤜倥䝲嵢᠒㚽䃖ž拕䗷礤ᐤ⽠宱⧢彙䧒砶牉䑲穎ᅸԍ䕥జᓼⴋṡ㼂犥ப眷磯瞶㍉㩨䊺䕦㉄៴ⶨ嘪㨂沥ᕓᦄ䅊ぶ䝖ॺ䊽䉞犩⛭䴠场㔲䛥䞒嬵ⅉ㮾筙㙼ᓆ㨈䪞⛫䩓ᤁ㠲玹喫仅ొ㮰䣇ㆁ䲪╽爰ࢄ吱ⱂ䱉ᛓᄵᅩ㖰磍㱳抧क़䩺ᗫ伄媱㜄ᓹ㏓Ӏധ竀㉆湤勘r䫼ᔣ㑓涾⒂䅥ឪ䡍䩿ᓍຆ劮∵લᜳ仂ޮ㶜媙ȓ⦄థᎻፂ㩾粵╔䩂旲⮷ᚉ亡篳ആ桌㞻磓Ű体秀㏽᚜⡦䘩㈂䑅繪挵摌ƹ㣔军⊿▽牝᛫亿恨劰ㆠ〱㽅䪬斷ೕᠢ㋄旴䯑ᒦ⺤巒ⵒ䞮́ᦶ◯晽就͙䘔玮朲営㾌嚅柢☷啋扴❃ॳዿ秈䮱៚俸廑⛼徹֪ܷ歉⬰ᓞ楿㌎敫ૻᗦ倌咀夲神庫㨵ᘰ羸ᣇ㺝焋▰୵ᜮ壙㚂沙⊓椵仮倎楠惝ֈ刯ᓦⳤ圄㛲䵙䷫➷䃨側擌祿勝┭㎤斲Ⰸ圑㝬䓀䩪☆݉䡳䳗१狷敡攩䣳ᨱⴌ瀙�梶⭊ⁿ䍅ٰ拖䫏᠇俷ሞ⨪伅ᡊ偵ይቾ㳆湮ે旟䬏䒎⪌匩↲稅♫硷⡋籸Èᙡ㋒敷㊡⿅ᝥ⥒檥㼣䰴ᣩ傸䋟ᆒ稏玃ⓑ⬀曥㹀慅䅊態㉸彀桙Ŕ⼘琋擖䬬ⓔ奙痓⮴磎晼棞楨糅ᖧ䱲嬗ጱ㿥Գᨶᣏ乿䢿ⅺ暁ᗁ劙ᗀ䵝ᰚ㚲丅偓♵慊塵㋀Ⅴ૩无⮛ᖙ⡕ㇻ᜵㕋᬴ᭌᑲ⋏㚃秞⫉ᓮ⣛ᐾ⥼䵥䡊煶࣊㑸狌ᖑ拸嗱玭晦⥸弾㴂窹晴ᛪᱻ杓禗棰┨⪢喂⤪囉㔪䝙勋噶፮敶ᑘ♧䬃ᗕ䫕dž−匥⏊羵栢摦㱎ㆱ惒ⓙ䈿犚嘲⼊垢ཊ捹纓␇⹉䵶奎㹠㋾╡䫯⠞ⰴ勁⺜知瞫Є儫厴╜㕭㋟ᦧ⮌圈伐嫾㟢姆緋浀仌䕾敜㖍˭ؑ䬫ា⧌庁⍰䚅埋❵㱈侹惟宦䃫ᕿ䮾埱⭧ἕ㠺暅ᣋぴ惫⾺佞▚⫈㕷㏗擉ⷿၕ㎌僵✝准⽭汱䫙Ɖ糒碈⩏旚Ⰵḭ㘊䷙げ⓵ὔ⩱烜岀櫱䖺⪼坃䷂婹⣒卅犋榴廉ƍ㫂⫂⦖玶嗹⨝ᓆ㕊浵浀㷪㕷獛湹泪ᔡ犅呾ⴊᵵ㢪䣕穪䯇Պ㕳ᛃᅵ救䑕䯇穬℈䲵㹂巅ڊ窥㗏歼Ⳕ涎䔨㦺ଆ哴⾚哕⋊橕縓殷囏婷㛊ຖὶ㗶毽嘍⤝ს⥴䇕䡪۟涇㋟禭叀唲䩍㹺璥≊䇵勍ୱ້繦ଈ畗犬哱⤛᭖⣲汕峴珈ݼೞ䵲㫤֥櫳啶⮥ᛮ⻢佉៳㗙廋坽ⷻ疍ᬇ㕅段埃䰅ώ㖺掕瞱ㆶ盈せ浱㫕喍毻昆『庍⦜孵ϫ年橉佷狘㵣䫃㗅橭呥⪊彝㩊瓕੪ᓶ旎潾曄ർ㫦䖦每ᓏ⩓Ꮭ㉼娕縊ჷ⊾㻓䦍撓痭櫱嗳⸶噝ₜ搕ᅪὴ㧍䮺ˈ൵竲㕕ட啓ⴚ奭⁊欥䫋឴㓍㽿拄喐䲯畭⪠㖟⤦夭┌咕犝⡖࿏ᒸ໔㵬ڵ䔸ᩇᓡⵡ夭ㄒ娭睳摷秋ᵻ竘㕷ⓐ氿牨㗇ⲕጹ㈺汹ẋ斄ˬ惷擄㶔۟Կ玂搰浧梶㱲䮘䍩䪰Ϭካ咣䎊櫅畇毻垨椱凉ল岭⩡≕ያ⁻ỉ䖏೦┴埃Ⲹ⍲砅䬓ᐶಋ瞵仏晽窤喑匿垈榎寥㌊眥ຫ灗♌㣿结䶖撵偕䩜㕟⪖垃⸜伭㑲幕绩囒⦎务疟ვᙨ濒呍㦚箕樝⅕倣⎿ৎ⥸✆വ㋙┽⩇ᚉ㖌牕ᗫ浊䃻্綖᪣╌吘㓓䧥ᅹ⢴紭Ẋ摔࣊䓸ᛎ晱⛼ി㐈㠐毉啥㨒歭㟳㕖䛨㓶େ慿䛋嘁⫚旽⻉彜㕦刭⋪㊵⚊絳㇙綋㬎ᮘ敘桥ዓ㗦啭犝圆ⲉ䅷曁浭᪥䷞ᐣ⾦幍㧦䥭⦊浵㹮擰ཚ玚⛒专㘴榱屳ⷼ淨ᮻጅ溍喷䍲▛月ॕ䬎㟐漑偳ㅺ投看Ôሮ㩺㓚ɪڿ䧙欋标⤟ṽ㠶刵枺⡶庍噼䗌㎚ۘⶻ⣱剳㻺猅绊ݕẍ˳䇟捱ᛁ甬ᰑ㔯⼮偫㳪碹ຫ䓖犍ዴड़䭰狐ⴸ嬜斍⢶场⪚妭惓睗憊恷務ᶃ勥畑㓔氓᥋⋚業欋䶴惈牳姏⩷⳧䵀嫙㙲湹剳秭ᖪ抵⺏㉶᳗ᩱ⬑ⶏ᭶ᙌ妉㲼䐭嫕ᚈ㣿哊㦘狯痎孓哷⢵従⩚乙揳絕ר嵴᧙殂˓┳⨲攚溺幎⋦慍ۓ凔㚈۾㫕纑暻欖ఙ曌檥創㹖墵⬒佈ᡋ書䷊䍦楶模⧙⤥⎝㜄⇵簋Ǜୄ櫺䗂䭳嚳业䮎啕⬙ᄕⴌ倭Ē巖棲硟⎛沾浬䫛㙣ⱊ坅ㄶ籕狊ⓖ䦫ድ嗏祮嚰淕䪴᠒榢嫵⭚䶙溊㔴㞋泽᷏岌皦涮宺㕲洝ᬁ≼卅淺㌆纈㕽繜㭾礶楳嫹㓮椅坛⅚䌍曻ᛗឈᝍ㭷圏凳籄㞄⸱峃Ⅶ綍畋ྍ櫷緈ވ䜓㘚䥛㓨䘳ᣫ㳶矅᪆妍嫺募፡眙浭孳㗵Ᵽ卫㢖䈽㑛瓗㩉⎽盚炕㝒㔸版疗ⴣ尵ㄖ䳍揺᷷ၭ凴滏的᳷ᤸň眗嫋㙖欕ൻ筗ᾎ懺緗ދℑ瘚嫶㔊䲜嗳ゴሽ寺漒㋯䧸⏞䝵⫦Ḉ婺㓉欃垭㼴漹䅻㿖Ṳ奶糉䭦Ⳡ㕇娷圖榞儧㆖篵㘊忕洍㉹狆ա䪹ᗄ᭭椉⪵哳⦮搽嫫⺗ᄱ䟿杠ˣᵴ㘔楥嘧⍮張晚憗ಊ巔筸眃▐檕⒎條冧┺缍⣚㢔洏㻲㇌喋䬓浩㩄喏⨍ᯝ㳎喽䖺禕焈ɶ┾ও䲤祐剐㓶濡囇㈦砽Ὓũⶶ䝇坼ᓳ妍⮙㚙泩廪㡎垽ㄒ㆖紎㋗╪ຯ娃㫏㓴槈墾㲦炽䭳⊔勉嗱Ꮐ㹻✗ᩔᕹ假㸊伍䟺篔䔉时Ꮫ㞈檾⦺૮㝩楒咗㌖玽咜㇖䴏瑿ۚ掚溾娊㮒疕濫尞⍖玉᭗ト剷᳙ޞ᧣劷ួ梱ᇗ⬎国�㖔嗍䏽峂䕤ỹ䕱媺枖源兗ゆ䪍ᷚ姖爉ſ䟒㍾嬝楉䪐ᑻ⡇吻⢾淽乓ᔗ㕍叵㷜嶋㪮㠝ⵧ坎⬶宍曛㣕ዪẰǀ❨廰ඝ⪿㙃梃怗㍮猽熚椄ᘏ汩⁎$⁷橉ᥰ⢷፬ۏ㪃棕✈༉ᰥ⽮庣�箎ㆋ海廏ⓓ⼨枘䤠嘃毼掠桍廘Ė稧λ澋儋㙾懝㞕伔䍳㯾䀼潺䭼愞稽瓻洯偘ᕠᦆរȕ␏毹毎⽹卟㶖穵燧殌挿㕞碝ᔚ佥ḉ߽俉ආ⻜䷹㪅睽楧壅佞毝峍䈔㐌ガⵃ㝷狩䪪⠖༝殗䱘㲝棛癕己㟰濚塜ᓁ㹝竻璡㈏叧夣झ⁃焔⥬ᳰ㟋徘֑経䒋ޞ爃板㛐䙈㊸凨⍃忍㽧∭紶䩸ᗩ䫣咯㤚抝Ǽ㸕ᴥ濸吳㾅㪍紷竫Ҳ¬䋟↟ၰᢊࣕ扶濿尥罽ἄ浜窦墟汒䈍ㄆྜྷ倛庄ᒀ翾櫫㾝㼕灃ⱛ瞛涿堟⨡䐣ᰛࠬ䛒㿽燽່⽞䕝笉檖«毛ℾ濽ḗΎ矽忇ê⾚㋸ۉ槅琱Ͽ⇜ଉ晘琮䪁䦰㿊楱纲編筯皰῏彠畴攣減㰮汏綯⿓ç溾綘݇疋也嶣㱮単焦ĉ>濳ₘℊ缈䫬糐ྏ歰㙂㼡唝乺瀬䠻俹傒ᠻ㮞Е竔ධ≰㩫ᤧᢣ䬧㗳䀋絻⩎ℍ䇢Ҫ٤൸ᣐ㽿⤔亥⢚琳㠊硒悓䖘ܖΟ㭫疐᱐㨀戔弣擴㸗簿⒊獒潶⎘䍊簌淅᧴䥁棭窅喢夦皧ᄔ梆㛴ᄥϢ䑨㾰痐و⸭䭳࣑練筈䄞䆦㶞桒ྴᩈ㕰恚ᥣ㣠ᔯ欧䢋⽧⇅廅ޚཊ×剎䜣ᐚ㼗䁶摘ᢙ䷟−ᑭܚอ爈㥠⏁梣ἦ㽁☾ⱔᢂ℁㼖ⷲ穢ຐᢸ㪙庁団Ԧ夯㎌傃メ⇀᷄䄑楗漚斐糁烄宧ᶠ☉䌼哓㞘战ͻ৮ὧ⛕⏣ວ伯縻働嚾烯惕䉙ࣄṍ偛⨱拔fᰓ䄾࡙ⷞ㝃㑬䶀᱘㽶匱䎺匒懛焸ㄧ䴡怿㼅䅒ᳩ፸፰懼嵣ᱧ弬卢剓檿䥓ᇡ告ࣉྞ矩ዸȱ囌书教⧃㱗晊憹͗㪹یר憘੦盩粯㤹妪⒒⣧ࡋ䪫ኤ吒᪫ᬨ潦磥൦檮䝅橐Փ⚲䑰牼涭ഖസ㿐氁䆣哔暭ᄿދ㒔紷䓳㩗婲疊抩ᴈ歱羍熫溭䌤䋳ⵧ棼ӑ㇅▫䋟欵尧и炃⟂ᚯ椸᱘撉瘰恱䜮う㍜⭰㱵㺪拧匼穑牍癶㇌啎ⱡ䞆᱁ᣠᴘⷨ⒘䡇瀐〦Ⲋဥ㈌⏑䟍༒Ω᩸癞ⶃ㒙⺩㙞ⲍཁҳ焍捓ಣఌ㎸翌入ㆂ䎬㬼ʳ沜瑣棋纻竨◷ぁ戝挛ᚭ䔻៴沆㤂熦燻䜨ⓟ⟜ॸ羑焃埓⎬䆪ṑေ燢৬⡓ಝ欶᎘礑掅妽瞭㠠ᙒ၅礇+㨖ქ䛀ӌ㰘绑嗃ڧ熬䆯繞慒璏燢१函䙶᪢㘼㈑桵柦⃦悻穟幁璒হ燡䟀Ŋ伝潖ㅮ瓬ࣧ䘯彁爣䊞ӭ⬄癉䛐伱᳦泂ォ瘳橆▯⬽䟩ⲋ変㘄➻๑ᡸ戈䬳ዦ߂燃̱湙够哜採墜Ằ㱽㙡奴慇䪠ҿ″礬Ɽ≙Ꮒ♐买௭恘戈砡ᠭ揈㙔ʔ㱶䨕ᏪᎬ丰䵸㞤甩旱涧Ⱝ涎ѓಐԏ续捶❮ྑẒ㗣᪑旱緡伓ළႦᐲत壊㵥ዧಲܒ㏈ς⣀罇ዤ¿⹖࢛ʀ熰吘䃢丙ᦶჄ矴び僇㹬⊹╓ṙ┋ၱᎷ䚕Ⱥ䳲㧸摩坰ˆⶢ竏㱜ᣓ烬⧼⍒⚘亵ᰴ砬皑奆祭䪸恪㇂ᱢҡ䭙䟼刊㶄㝩刕嫆熮಼崰偺撒㇡匿戾䜣ᄂp狑糳毉浳⌺篰撑夝⧯ፇश䱾Ṻ㣔炤櫺䝡㲭溮嬹纶㥋Უ䞽ᯔ㸸杸淳ᨃဢ玥䥺璔瓣椇厪楎䷞櫖ሔ橱䁽均彦㺼竿ŋ┍ਂᎵ䝐䴱ᤖ屔欦咳照䁭䆸偭ڗ➂䦢Ꮸ某伆櫒姼妅ㆠ系壬㉗㲧䚚ᔜ揔ᬎ琳Ὲ摬琺暥ᲇ哭⾎͚窏ᵽ皡禬柞佩˺ⶹ柭ᡲ泮Ị奾䶆䌑掋✔䱙Ა㹬秪䃓盧ỷ▸Ⴚ篜侷㇖搝䙞砍ⱶ㧤祹筓҆瓇懊⭗Ⲝ厛㍳䚦申们㩗㔿᧓円⍮䦽䕘柅ㆅ娌ⵗ⫟ඇ⬙ᠣࡷ૽庇䭰ȿ㡸攚樝Ꭾ❅乺殖㗤爎峙ᄆ䶕ᅮ擸淰䳪奻䷷后㠘Ʈ㕬湙䥓⸻嫮䋽秉᧴獬䫞㝒䧮㬼漹罓₋⾯熻粋⳹᧮㌴杋䷞᳭唗㻙撓宱婯掺⊶溍ᴔ䛻㍡朙眹ᨆㇼ瓩䋓皱㧯ঽヲẘ崕㦾珕晪㚯Ἥ幯亙摕矺䌺穽߄厒秌␥窌亁浼㾄璉曳ᨆ⬶㞻悈侩秃ڦ㮶曏ؕ帒✙垓楻召疾❹溝卽禢ₘ小穕ᰪ㊉Ⓠ湳祆叭檺Ὓⳟ紊䧺⵿晴䶕Ǝ㛟⫙䁍ᡲྫྷι秴纓ᴞ劤ఙ栀⾷嚉㥙湓眆罗㺉惝⚑̄滑午ᝍ㞀宾ぜ缥獉䈶燮䮿朷ȹ潊坵珧䨷ᗷᢁ㊳㦥怫制㇅►憖ἴ冺㍶⫏祐娱㸽㮹潭溆园憿❓⺙紂̉ஃ∓Ḿ㋃ 卓㠚䪔㿮䣛ړ䎗㧀ପឋᕈ孞㋂捥啭③䊼䕓纕គˏᎩ❒䳸弁㢜棥徹ܶ㹯Ȿ敐嗃拲⧌匡♌ᦠ�糹筨珦㉏瑼㽘ㆌ䋧洐䯪ᚢⰾ῁㼜捩櫓獛䥌屸ᥓঝ疋禮ᶺૻ佐沚㺌敌慫ࢶ剕≹烕䛅ㅱ榫吀៊ⷘ榑噅㚥夓㕻浀⧊㓑䦐ᴐؓⱊ殉㣜狖喃㋦硍ٺㅜ←侇◃ቸ䵰崹㑀殺惓ᚷⷄ箩桒ᒍ㣭娈䯜᠌Ⳬᾩ㑘窊点伇獴睚⦚፲䮵ឺ咉䧩ィ㢮堅粷ޕ㽏௩㋰娌㏮笑Λ᫆尌澙翓熆⍶箿㵼禓猐䗇䬿ᚸ侧ⳁ㯳㊥槫䚺屹䓗獆ଜ□䭆柹⑿ᦁ㿴泮䮭⯬㩸䭕榊捣ᓜ⮝ឩⶏạㆪ撅敋熷甖♹䓕祚䬚疄嚋槈屙㛋✶縓塶͖楸ዖ熅奩旧㐉ᛏ㞾帲潥奫玶ᕎ௩䊷ঀ⽲ᓋ掊ᘰ⾯ᦡ㇎㖅䒳兦╹ၴߜ崘֧掰殜ⵘ弑㋊棵垫¶㓌耋狘䖈乹嘄匶嘭䴞狑㾊癸惫㎆㗖ⶸ䫖㦞ଆ◍䮒爽俪嫍崌烮塕思剀挃㳔یᬓ瞜⬠垠⺦岟渺瑙掓⍚凎፹䛕㷈泪姕䍇䰕ᖆ嶭㍣㠥瓫ඇ竮㿏曞໊ആ᧰䭷ᗡ䳣᷄ヱ㙥䆫海䫔免囚䚗㫖殡ᚆ⼔榹㷪灖嗋㣷糏奫盟গ䓺䖾欼圭云ᡍ㚰濵瀙凷♍晾䃕փ泲ᒸ⭾圁ⱬ廕㠊氄牋䃷济⇈䝔⦅⋷姹殸歃期九㤊扙匓櫠㡃崊㨡␡笅喧ͣ嚍ⳡ⪝㌚燵堋䉡懷⎽⻐Ꮞ⮂㧾䰝嚳㗞屍㱚扖皓偗煌ü佒䇋嫩疺欸晁仞嵨㆚杵䮅໎⭸䍖䧆܀෴䰐氀泇Ṇ㘦棖盃僪⒌䃿滕緗纉୷実忝㏄绕硅潷寏彽滑䆙竬ͯ界㙄ⶾ廍㶚玕佋䇷ႌ㽺ኽ㶞ግ痷巳嚋ḍ㉺晹碻Ƕႍ杼峗獟園欪㙀⿕ᰲ㐦湔栫⠷梍愿曌曱⅗獖㝍哖俓㉒槭䖻⩗㦴ߩ㧔斖爳䷋涖堜ⵥ堆秥殻⽧咏畊ם熋曳嗧ఆ坽ⷂ報従㟅䫋Ꮼ䋽晜㛁䜂ⷚᮁ杒氰嵥㑋☪拫ፗ֍哸燘ೋ䜏ᖾ㞍ⴌ婽㟒惭狋▶桏哿Ǒ䎄孾泔ᘭ⸬婋㱦籍楻畷啮Ⓕ䣜䆗䛲ᒱ㎿氊漺檮㡲曖嵫珷涎䵉ᓙ绞㜘㬗⭫ⶵ奺其牭嚻䯶燄Ϳ凐㮘㗬⧓㚶孫㉘斚峍旗ƕ仾ᵘঅ䜕㘇嬴㜛㟅姛㖃ⶭ碍嚷徏罺旚䮗卪ⷒᬫ㘧㖓⸧㮢慶䑛窇͍烺ྶ嶕峮බ宴㝢濙忴圮緕嬫璖巏瓔⎇ᷫ⸝ᝲ淝廓彂纵簫㲖┎Ӻ叒ޒඈ嗉欩ᝡ浹够ᝊ植䰵䕷毺ዺڵ曻代ᔆ㰌㏐ⴓ姷枽繺愲ஓ⸪㘬擗౧滗ڰ嘐䃫堷㋆㹽夐⦗忛圅巁ខ⼔巍᳀哨歀ほ䂎璽畽犖滉䞦ᯑ䕢漑ഹȼ⃬᭕⁰➎汯ッ൷歌䛸峔灩滲伹盋⬈厐⃗ᜩ寳㡕丨Ẋ淐ᛂ✆䷬ᬪᅣ涎埆‾笭㤬䀐哯淸濬侎е䎑፣㝕庍㣂ᔯڛᾕ㕃珹⟒孵岖㖫ᐁ浶桯थ淯➕汖欗叧㟟戩渵ಳ畋澪✼䇾憝㌃睕甭楹婣澖び䲖箝敤椋峥㿌㼅ܺ䦗硣ѐὛ疐ᱼ緉篬䱸槏屶⺐⧐㹒渗寯篸緈ᾞ弞窓ऊ瞅䨏峕ୟ簄⋆ᾕ碱⪑㻶喤⭓秘孿岟㩙Ἕ丛煢堍ᴤãℯ哬緫ࣟ盈㉙擊㶁䅞䟛䯨瀍翻�㲦ȈΠӐ⃮①炈њ᳅启耏偝埓缊ᩬߐະẮ╼ʡ梣稧ḩᠽ奴ℰ➅碵Ϩ䱯瞓瀀㢮佡慆㵒刯Ӱᡛ暠\"䑅ឣ瘤䝙亓䬅㧤朿䈛㉾ܦ䤻ĩₔՁ掜睰恗劣檠侠犫ၹ߸䳴᳂র燎払䲮洮䬍摚䬀儞哖�ޖ奔㣰磸ॽ厘̠ᯣ⟻粿䐾懽岙ܹŊ猳ᕐ熰գ矄✯ᤏ牅碚㼿࠶႘Đ矿ᔤ㤨翞簆ᆧ㜯ਿണᢖመ絟ܳलẠỹĸᴠ暆炊澠煵ङ炑䏬ኾཬΘ㺞Ʊ攩厸犮樊妵櫎ས刀ଲ㓎༺ˤ㡬༱椹㵧㯆䃨㩙啬綉⍙ҁ们㦨∔䀉梁惃䱧ጮ派杢ಖℤㇼ凾䝓Ȇ䋤ಟᤣ㋧ᢙ㲩ᩝ夡ᤋ懥漄暋༅爨䋤ࠂᵠ⋈⽠墢攢加祓弱掸䁇ӈԿ܃巧㎮愡夣㟴礘爉揀挛ླ嘘禊ᴃ瓦ⵀཆ噘岒Ԃ⪃␈䟭࿖Ჴ㷸稱䀳痧⾯眽Ŝ岗⊩揳䝬䆶ẜ㳤犩渃䝤堅㢼幙粞ԉ朴↱Lj乁ᴨ᧤竑爃棧㋽Լ墶ᒗ+栤佤➧ྱᶼ㭄疑玳幇㎯༼ㅙ㲝䔀䧧揁⟿ູ拲㾌䎩榃棇≯⬽敞念ԌᏂ䟪ခḴ綨ள癇ṯ梽神ઐ礘䧶ᐌ₪倃:㢴犺ରᧇ繩嚿幚ኚ⒞牚凇⠚奘ᫎң䜸ៃ⿴㥪ᒽؑ窔ႂк䚇€ົ⽐㳬࠹棞ょ䌐柳⫆皃ഊ儾⼶⟅ໜ䟦㷖䁼啓䦆䄮方㍘⮬圥⸠ᢌ$䁱̀桇ؠ⭊琁啫ᶥડ㦿࠷汜椋ᵙ栆䓹楶煣漳䈎ᛪ㏇㜴娓䠪杨ᗋ᳴䂸䷹燠崀᭢掾㨳丬⒧ᄜ㥉枌�䘌繹犐▇勅οᑦທᴆ㨈琁ഓ保澽ዼ級䃪䐠♵爩癧䜻摩㨟㏊材兴⌾㾮ᑹ皰㠜珮᱐彘㹯左⏆炉䚖灕ɞ㬚Սܗ㵒㩊䀦₊̑ളᲐឧᥠȷ䇤⌜㐁᰷罋ᒡ嵛䀡甙⠷向䜢㣾ᱶت䅺נ᳢䑏潪ࣛ暨ᄹljம㑡ർ䍖ӌ約ᥠⲔ⢀Ṡ卧ᆘ㦰∩௲㧐α㥆䥥推☤祡㑿棘न按癇ఞⓂ⼓†ł॥ጃ㸯ఊ⺀DZ㲃䁄᠊ಷ盨剽獠 ሲ䷅癫翜⩎籼怠জ匟华䰖擺⽜ჰ㬏㍆ʲᗬᓱ㙿孀剩㌖ὔ効䡼届⪇༅无⸄᐀㹼珕壒俨汷権㛉✔樴ⅰ䱼ᅪ侱搬兾ᶣഩ圮欹圵ፅ㨒ᕙഽว崚奾㳟ₔ䉁ሌᠺ㲴⁰㥰䨴⡰ຈ俎㐣䀤㸷◙碞伂䐒੶ࡪῸኈ㕽櫘俀垩嘏橈㤔撩揸䑠ࢮ࿂棷䓎刂۞⛁ᬄ哔㤵暍⥞ѱ㦫⾨֖㰄䊇絒⡇䶛㗲囵怴ࡂ䵙熡愋沨揎ᰂ千༧9⁁ௐ㡊⁶尸ͺ焟⪹罬緎懥仛݂ℐ⌁氇ႁ敮恵㦱桀ો䥔怐络ቯ欆ሗⰚ垇探䈽ؚ䐭測㵒䒏ᛃФ涬掭尸%㣠ý㧁ഫΨ⸼ㇱ㤱滛塁嗬ᯞ垚↞劃㴼䦭瘔ዸ璎㉙凜ᶢ܉㱶䢐㝮敁彔㻦畣༻䫼䊎ཾ泥䗮✇嗣⯘㜹䂉幓䀄䋭狴 ㉙㝢⠵巻䃀䗨ᾤ⥗置劢素.倾⼸᠊㋗凩䫽獤⮜䃴淧᩵㠊渴ẋ㧶矍翆㧗䎹૽獠#皖瑅ᗻ䫗ࠠ櫿ן倯㤫ⷬ}㞝煭䐁㥭ȍ璒ߗត滾㷞箑圏渍寀矢⾇⇛㼮禊᧻南㺪槾⛚㶩伜ᷩ氵ф炶恻䐈偽硼ࡷ㶑祁ព佤灠̺瞖⺱䧷㱺䍽潔ഠ嘡䲒寚枛ᴣ师爮睅ᤳ巀玮䬋巘䯎榢㉆殒氫⠵௩炟㘛崵㨙懨籤患恂[粼弅塊箱瞓濧幯㺾痤ઘᢌฏᲐ媹刼㼋㸙٥眾ᣏ屽㧾畾ʛ燔縏殣䀁徚灪縗業䛚ᾈὫӮᦎ㊚ᗈ⨰Ꮰ䯦Ⳣ⡐㐚睙炿䢠综䔣橓䪤梭穈℗䬟Ĺ㢙矞冰㴧ↄડ督彥倈㡝㹹札嶭め恛愷岰続綣盡Բ樾笌呂戫䕦⣢⧁ᒬᅳↁ絻®┯炁摝柙焐儝˄ょ㳎Ϭ㹴ӵ樢πԥ籱ⵚㄑ成彔吙ཀྵ⅝煌㻖൩疧窯牯ѝށ焖∂䠥矄溤㺐ı煨౧吹ा穡⒙㈣ሁ姶L⁺ὡὪ㪑缒㓞㮉Ⳳ柡埛ᔵ炳揫ኟᖜỎ尨禨祫ᒮ㗌昡幢ᜨᅪ繿呝䮯࿇戜㻾➩畤ᴘ伤㒄夽㑾㕤氱ᭅ玣လẬ㱈㷱璃碮㪌タ撒滁漯㈓ᡖ⠔⬌㴪❓㨩峭䐷玭䵞ᶂ䃐瞭⍇㮬䔢ᾺⰆ䷹弰ᣔ幥僾竜㖗刹ᨨ倧坯⹖弧㨀ބԓ尠乹⊡喡箑搴⠠)Р枙模夡哋窡ᅔ娢牣Ἑ勸㰻䊔楮繀玾㾿⬠厖ᨂⷾఙ俑斕䓬禚睓盨݀满䭞嚝娋㏮柝俋㠮㵼砹睙䃠㗯嬯嶠㊚羝㼠怴ុ係潉徬籚॓稇櫷ⱇ㍞⚜純娌ᱯ枥ޟῖ㵌簥琏ᠷ屏⁺⢫焧䌙؋籶牯䊴庉㱂篙繍構橏榾ᣝ庚挘娛琏ႜ⾁搞㴲硔Ы櫺ɤ⡾宱䆝ଗ樐⭛嚊Ԧ夹㶫㶦狫狔ᩏ䟏泜䪤猕稗௯ី䜤帡㸪祅籋晷䭰✹۟㨬㱂㘁䁍័Ȇ廥㶕㷙罋檻䩏╾泟囘猙ⴻగ៕侜弩㼌篵籯ᒷ惌ㅾᓟ㜤焯Ჶ懿慯瞋极㾦箵璫戇篯篏䓼喙㬖嘍毷⾾彖㾚繅砋惷攡⌡潪枢ೢோ搥၌€đ區㙴ٻ涳ϖ䶮䴁⮟ଅ㈣㞺濇煥Ў煻琁㮏䊉◞ᮙ㢝ԉ嵊Ⴞ澽庻㱬ℽ矻痗䖄甦ᾖ䂾⪘攊浈㳂緟သἦ掃意幨䯟㎨䅒疹❛嘣漬供㠼穝繀䄗幆ឈ䆨燁噃䴽㟒哗怅䒩劝缌ᮤ䋪秦ੇ˜漒唈㯰㇃ㇳ⛔䱥㿑ɵ烋积䠡灼撕Ȑ㐼ࠕ礃澆㶞卡箠ଧ昘宆峎⢟䔮梑䐚∆䐌‐㼘㬝⋣筁ȯ稯箉㢟ञ弽ᢨ㌥ᑍₘ㾸爜ᇃ瞧缗圏㾉咟㔢㈛維䠍ྪΈ劵戃縃棄䃀♟珜侚孬᐀⟪ઞὪࡨ籔纪癔к⣀⠁刿勘⨙䤙⠞ྱڤ㽴纪ѳ燇笳㵟ᵋ岝杁Ⱛࠤ恉㡎㹷捪h೯䖿⭞Ϟ羚禛㐄❙侪⢶㾀⥄絓秠ᷯ幚䝟Ḳ崝愗㾈᠁ާ潯ㅉę缓瞇桡摿ᣞ䬒⟙l䃮៨两忦梲网纓眳柯婿໋㾇榱☕ຑ᠀ᴛࢥ㿾㠂㖉Ჷ瑏婿ⲳ⊜ᄚ学Ⰶ堅៵㾂桙喉ᠷ杏䔬䔰礈㾛㦝Ⱋ堑䁾忕幸籥砻狸ߏ瞀ㇿ䀿䜘ᠩᰘࠖ摦彔ᆅ港㦻玷福县旱䀧礏慕⾭徽䀂緕稲䣷攏暿槝㽱优園氇៩濃忉㼇ኪ沭琒ᇏ叿䷞抟㜞嘞簓缗濌ࡪ嬺絭Ż綅第 ᣠ憞䜝亦࠙䕔⿴彠罏潵窴全濂捿⒞㒮欷ؕࠑᅵ厧ᥱ紃练澂ᄘ潊男纝㴞₌⠍ᡉ` 䜊簱竖䥯根䞿䝟⎲᨞吐ఒ男࿌䙼繎縳瘚䃧旡噣⺞秀瞧䂡⠕晰ᩬ彻㺧㺫粷碓ᙿ电䄱⽰䏂狗⠋⟵媅㽄ຏ䴐╁͙῾₿濍䶡‣民ឿ斆ῨѦ繭纄ṭ⦏殝ӭ⇥⑀ㅧ氒ັ濽忬礸罁类綗紏撣矟原ᛀ䌤Ⅻ愡懹⣠罰⦣粝翋白盀ट⎰搚模ငၣ屢⢗䋇縇瑾堊㪟㏿猜吘弐僠砶ႄ紦纚棣ُ煿㉟絟㌉昜䰞⟄『忳戦羦䇁僨痏狿翲倏榞翿ᰛఘ媷忶ᩢ羐₇ᇮڥ猗矽ᆟ碴社䀧ᰐ惲䀈耚翣织緇剏熿籝⬟㏾欞⼚孮〃‟䀁翉纻缯篥俁䲣ᆟᐞ墹㠛琓怜翿ᙳ耛缀k叟禜搠ᢟ篠痿ᤃ䀘漊翶㿋㑿繣尒␟祧ケ㠣㨔⮀̣㬒ᄮ䀹㩶㤛㦍㦓㯆˺ę͍⍛ŵ㯚篆筕㮠Ճ㭆劀ٺ䎠ڠҝ樀ࠞ䍤捠ѿʳ㧠ࠔ㭱ɀٛ̀࠙ˀ׆磌禊禷∰֩㣃㧑㰀ۍ硆Āּ₰ܑ䈁̍㥾䅰՛ЙО䇀ѐࠔ抑㥵㣑㤀אߐң礜䁨Ѡ۶ᅠܑ㣠ְࠐрћĨچÃ㮻ϰ祻⁈րҨਸԫ⋨⋨ږ㤉䐐≈ڧ䍈ߩ㬐؝⏛ဨڈӰވҨ؈ِԮ祸Ըԫ熘ڸՈ℈ݑ慸ݸӴ⊾䄐۠߈ٰݘؙΈװҊ禨ݕ㤤ޘӶ剄ԧ↲̘݀㉈⏪̤ج↤٘҈Հݤӕ㬈פࠈַ⊄Ӡɨߐ㧄ָ۟ċ稐↸ބ㦄磴࠘ބڃ䌄ш㮰شӀۤԂ篤ܝ⁴Ԉէ⋔քו㪓竧≈䆶॔ڄ礉䎦禱狏㩴٠ڤӈڰ֔ѤиȨӘܴь窴Ҙℶ穌ӬՄܼ߬ݬք״٬Ӂ煌ФӨ灌ټٴߔ۳䊔Ӥ㮔дݰԴҬڨִԮ穜մ݆倢ӬѬی愶竬Ӣ篌ᡢӌՈޤࠄ٤ܔܨڂ̜ؼۑ礸ĢҨ禢ތ䌂٢ޯ筌Ӝԣ䇜ݔ㢜݂֜ؔטмڍ㢲ּ߾恒ְℕ捌拒ڲ֧䎲۹ɲތդӀ۲Ьרᢒْߢ⊪Ӓٰ⏼րᢒڒ۸ع㩂ѣ㪜ֈքДҚ筕㦐€Ԡݼח媐姒ۥ㰊תߢъՊղӊ߀ر示֪ө䀨宐Ȃ愺زې奌僚ۢӸҺۈڌՂؒӂӤتߊӺՐ孜ֻ⊦ېԠ穓⋴ڋ栿˦ސߌ߸ܒԌޜԦݺջⅼࠓ⃦࠘܊ߠ匆ެמ䅛樶֦ڠ⎒ؚؐۆӲׂߘࠔ憆ֶގ⊶զ֠᪐τِᩦτވ恶јࠚݲۂҴԪ҂՝䁥↖و᧖ۦܷቮהܶӨ熮ٔښҤٖĖӆࠒ۰߆جջ⁎ۮя森Զ֢᪄㫚ւ婀δ㬺ӎՆيߠѺ܌պ֎ַ↾ަװ挄㥚ш䃞ܾԠ㪾ߞՎԄپֺݾࠖٺܪ٥ᄾނԫ熾۞ݬ㥸筱�ۿ獡Ѱиξ߀ˎݶخࠌܮࠔ恁վ䎡Ӷ儁߆šި穁ݪҝ栱ۡ݁ہնߎئ۶ײݕ㮱Ձԉ䉑Ӗތ䄓ሬǡܘ䢔㩱؞ܚؖ߁ۘױցݕ㢑ٚ՞ܛ儑ࠆب䆩ٖ״㯒ʑܑтࠞفةۊڎҡߔ㡉ٚݑՙ䋩בب䁩㦑Դ䤹ԞҔ؞٬秎Ц،߂ࠔ抹ࠒ⏹٩㪱ҐԹՉںٹׁӱ߉ܩܦջ⋙ѩ۴䐙ٺ䊉㬹ޝゥֹۜѹٶ䅹ЮԩԮܙַ⎥ࠒⅅ։㭙רܚ䂥יۈҙݱݹԜݕ㪅Хӌ䄵є䆚ʪ䊨筞夯䄐䈐䀨䆆̕䄂↪损νϟĶ䎼䋱Ɇ䐀䁄䁇恚ݟ㥒ʀ兏ጪö尃㥁犗掗ÇɵLJ˫ÃƇϼ㦩ଖ煗НƯŎ憉˼᪰ӨͰǭĴƚК匐拙�ԃʑ㠰̲y憀ʕݗ̀Ȱ䎀Ͱ½ЩF䋊秠̨ʼ䇳Έₗ慯ʬƟŬ秽мअ႗悴碁݊͒抈Į㰋㯜ԛ扠䉕Ӊŀ䁈ʟΟA䁱ϟãذ䆙Ϟ₅內惶㡑√ӿ折ň˽ض⍹恈Žؘȃچνڐ䅀ĘŽܴʳԵ¼ଝܟÆ䈠䈣ڪ̣Ҏ㪣Ѳޣףմ䎝Ƀۣٙ䋓ȓ݃גľ䇈⊗悃ـɻጋူ䃪䏰πƁЍӴ㨽ހȤĽڝۉ̖ɨ䅽ӽׄ䌖ư 䏄㮁䊥͘䌖ȴΕݨͰNjһ՞㢝ݻҟλހňʑ㤋ҋԹ[ܴʑ㬃܋Ѣ䆻ژ³ޛӗ̛ػԜ䊛ǻܛ䁇揆ƭŊጝ炟İ䃶磧ׄう�䂎ȕ℧ނȂ�ᯯƈ⌶㠹愠 "}
The complete round-trip took 44.8 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.6.2", "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":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":7}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-9699-J0CkApgtwDLY-.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-9699-J0CkApgtwDLY-.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-9699-J0CkApgtwDLY-.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-9699-J0CkApgtwDLY-.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-9699-J0CkApgtwDLY-.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-9699-J0CkApgtwDLY-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9699-J0CkApgtwDLY-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":131,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-9699-J0CkApgtwDLY-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":1}}}} -
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 14.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.6.2", "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) :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r) :help Show help information (aliases: :h, :?) :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) :quit End the repl (aliases: :q, :exit) :version Prints the version of flowR as well as the current version of R Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command. :benchmark Benchmark the static backwards slicer :export-quads Export quads of the normalized AST of a given R code file :slicer Static backwards executable slicer for R :stats Generate usage Statistics for R scripts :summarizer Summarize the results of the benchmark You can combine commands by separating them with a semicolon ;.{ "type": "response-repl-execution", "id": "1", "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)\n :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n :help Show help information (aliases: :h, :?)\n :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)\n :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)\n :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)\n :quit End the repl (aliases: :q, :exit)\n :version Prints the version of flowR as well as the current version of R\n\nFurthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.\n :benchmark Benchmark the static backwards slicer\n :export-quads Export quads of the normalized AST of a given R code file\n :slicer Static backwards executable slicer for R\n :stats Generate usage Statistics for R scripts\n :summarizer Summarize the results of the benchmark\n\nYou can combine commands by separating them with a semicolon ;.\n", "stream": "stdout" } -
end-repl-execution(response)Show Details
{ "type": "end-repl-execution", "id": "1" }
The complete round-trip took 2.1 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-repl-execution)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts.-
. object
- type string [required] The type of the message. Allows only the values: 'request-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
ansi boolean [optional]
Should ansi formatting be enabled for the response? Is
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.6.2", "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":{"parsed":"[1,1,1,15,10,0,\"expr\",false,\"library(ggplot)\"],[1,1,1,7,1,3,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[1,1,1,7,3,10,\"expr\",false,\"library\"],[1,8,1,8,2,10,\"'('\",true,\"(\"],[1,9,1,14,4,6,\"SYMBOL\",true,\"ggplot\"],[1,9,1,14,6,10,\"expr\",false,\"ggplot\"],[1,15,1,15,5,10,\"')'\",true,\")\"],[2,1,2,14,23,0,\"expr\",false,\"library(dplyr)\"],[2,1,2,7,14,16,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[2,1,2,7,16,23,\"expr\",false,\"library\"],[2,8,2,8,15,23,\"'('\",true,\"(\"],[2,9,2,13,17,19,\"SYMBOL\",true,\"dplyr\"],[2,9,2,13,19,23,\"expr\",false,\"dplyr\"],[2,14,2,14,18,23,\"')'\",true,\")\"],[3,1,3,14,36,0,\"expr\",false,\"library(readr)\"],[3,1,3,7,27,29,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[3,1,3,7,29,36,\"expr\",false,\"library\"],[3,8,3,8,28,36,\"'('\",true,\"(\"],[3,9,3,13,30,32,\"SYMBOL\",true,\"readr\"],[3,9,3,13,32,36,\"expr\",false,\"readr\"],[3,14,3,14,31,36,\"')'\",true,\")\"],[5,1,5,25,42,-59,\"COMMENT\",true,\"# read data with read_csv\"],[6,1,6,28,59,0,\"expr\",false,\"data <- read_csv('data.csv')\"],[6,1,6,4,45,47,\"SYMBOL\",true,\"data\"],[6,1,6,4,47,59,\"expr\",false,\"data\"],[6,6,6,7,46,59,\"LEFT_ASSIGN\",true,\"<-\"],[6,9,6,28,57,59,\"expr\",false,\"read_csv('data.csv')\"],[6,9,6,16,48,50,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[6,9,6,16,50,57,\"expr\",false,\"read_csv\"],[6,17,6,17,49,57,\"'('\",true,\"(\"],[6,18,6,27,51,53,\"STR_CONST\",true,\"'data.csv'\"],[6,18,6,27,53,57,\"expr\",false,\"'data.csv'\"],[6,28,6,28,52,57,\"')'\",true,\")\"],[7,1,7,30,76,0,\"expr\",false,\"data2 <- read_csv('data2.csv')\"],[7,1,7,5,62,64,\"SYMBOL\",true,\"data2\"],[7,1,7,5,64,76,\"expr\",false,\"data2\"],[7,7,7,8,63,76,\"LEFT_ASSIGN\",true,\"<-\"],[7,10,7,30,74,76,\"expr\",false,\"read_csv('data2.csv')\"],[7,10,7,17,65,67,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[7,10,7,17,67,74,\"expr\",false,\"read_csv\"],[7,18,7,18,66,74,\"'('\",true,\"(\"],[7,19,7,29,68,70,\"STR_CONST\",true,\"'data2.csv'\"],[7,19,7,29,70,74,\"expr\",false,\"'data2.csv'\"],[7,30,7,30,69,74,\"')'\",true,\")\"],[9,1,9,17,98,0,\"expr\",false,\"m <- mean(data$x)\"],[9,1,9,1,81,83,\"SYMBOL\",true,\"m\"],[9,1,9,1,83,98,\"expr\",false,\"m\"],[9,3,9,4,82,98,\"LEFT_ASSIGN\",true,\"<-\"],[9,6,9,17,96,98,\"expr\",false,\"mean(data$x)\"],[9,6,9,9,84,86,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[9,6,9,9,86,96,\"expr\",false,\"mean\"],[9,10,9,10,85,96,\"'('\",true,\"(\"],[9,11,9,16,91,96,\"expr\",false,\"data$x\"],[9,11,9,14,87,89,\"SYMBOL\",true,\"data\"],[9,11,9,14,89,91,\"expr\",false,\"data\"],[9,15,9,15,88,91,\"'$'\",true,\"$\"],[9,16,9,16,90,91,\"SYMBOL\",true,\"x\"],[9,17,9,17,92,96,\"')'\",true,\")\"],[10,1,10,8,110,0,\"expr\",false,\"print(m)\"],[10,1,10,5,101,103,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[10,1,10,5,103,110,\"expr\",false,\"print\"],[10,6,10,6,102,110,\"'('\",true,\"(\"],[10,7,10,7,104,106,\"SYMBOL\",true,\"m\"],[10,7,10,7,106,110,\"expr\",false,\"m\"],[10,8,10,8,105,110,\"')'\",true,\")\"],[12,1,14,20,158,0,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y)) +\\n\\tgeom_point()\"],[12,1,13,33,149,158,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y))\"],[12,1,12,4,116,118,\"SYMBOL\",true,\"data\"],[12,1,12,4,118,149,\"expr\",false,\"data\"],[12,6,12,8,117,149,\"SPECIAL\",true,\"%>%\"],[13,9,13,33,147,149,\"expr\",false,\"ggplot(aes(x = x, y = y))\"],[13,9,13,14,120,122,\"SYMBOL_FUNCTION_CALL\",true,\"ggplot\"],[13,9,13,14,122,147,\"expr\",false,\"ggplot\"],[13,15,13,15,121,147,\"'('\",true,\"(\"],[13,16,13,32,142,147,\"expr\",false,\"aes(x = x, y = y)\"],[13,16,13,18,123,125,\"SYMBOL_FUNCTION_CALL\",true,\"aes\"],[13,16,13,18,125,142,\"expr\",false,\"aes\"],[13,19,13,19,124,142,\"'('\",true,\"(\"],[13,20,13,20,126,142,\"SYMBOL_SUB\",true,\"x\"],[13,22,13,22,127,142,\"EQ_SUB\",true,\"=\"],[13,24,13,24,128,130,\"SYMBOL\",true,\"x\"],[13,24,13,24,130,142,\"expr\",false,\"x\"],[13,25,13,25,129,142,\"','\",true,\",\"],[13,27,13,27,134,142,\"SYMBOL_SUB\",true,\"y\"],[13,29,13,29,135,142,\"EQ_SUB\",true,\"=\"],[13,31,13,31,136,138,\"SYMBOL\",true,\"y\"],[13,31,13,31,138,142,\"expr\",false,\"y\"],[13,32,13,32,137,142,\"')'\",true,\")\"],[13,33,13,33,143,147,\"')'\",true,\")\"],[13,35,13,35,148,158,\"'+'\",true,\"+\"],[14,9,14,20,156,158,\"expr\",false,\"geom_point()\"],[14,9,14,18,151,153,\"SYMBOL_FUNCTION_CALL\",true,\"geom_point\"],[14,9,14,18,153,156,\"expr\",false,\"geom_point\"],[14,19,14,19,152,156,\"'('\",true,\"(\"],[14,20,14,20,154,156,\"')'\",true,\")\"],[16,1,16,22,184,0,\"expr\",false,\"plot(data2$x, data2$y)\"],[16,1,16,4,163,165,\"SYMBOL_FUNCTION_CALL\",true,\"plot\"],[16,1,16,4,165,184,\"expr\",false,\"plot\"],[16,5,16,5,164,184,\"'('\",true,\"(\"],[16,6,16,12,170,184,\"expr\",false,\"data2$x\"],[16,6,16,10,166,168,\"SYMBOL\",true,\"data2\"],[16,6,16,10,168,170,\"expr\",false,\"data2\"],[16,11,16,11,167,170,\"'$'\",true,\"$\"],[16,12,16,12,169,170,\"SYMBOL\",true,\"x\"],[16,13,16,13,171,184,\"','\",true,\",\"],[16,15,16,21,179,184,\"expr\",false,\"data2$y\"],[16,15,16,19,175,177,\"SYMBOL\",true,\"data2\"],[16,15,16,19,177,179,\"expr\",false,\"data2\"],[16,20,16,20,176,179,\"'$'\",true,\"$\"],[16,21,16,21,178,179,\"SYMBOL\",true,\"y\"],[16,22,16,22,180,184,\"')'\",true,\")\"],[17,1,17,24,209,0,\"expr\",false,\"points(data2$x, data2$y)\"],[17,1,17,6,188,190,\"SYMBOL_FUNCTION_CALL\",true,\"points\"],[17,1,17,6,190,209,\"expr\",false,\"points\"],[17,7,17,7,189,209,\"'('\",true,\"(\"],[17,8,17,14,195,209,\"expr\",false,\"data2$x\"],[17,8,17,12,191,193,\"SYMBOL\",true,\"data2\"],[17,8,17,12,193,195,\"expr\",false,\"data2\"],[17,13,17,13,192,195,\"'$'\",true,\"$\"],[17,14,17,14,194,195,\"SYMBOL\",true,\"x\"],[17,15,17,15,196,209,\"','\",true,\",\"],[17,17,17,23,204,209,\"expr\",false,\"data2$y\"],[17,17,17,21,200,202,\"SYMBOL\",true,\"data2\"],[17,17,17,21,202,204,\"expr\",false,\"data2\"],[17,22,17,22,201,204,\"'$'\",true,\"$\"],[17,23,17,23,203,204,\"SYMBOL\",true,\"y\"],[17,24,17,24,205,209,\"')'\",true,\")\"],[19,1,19,20,235,0,\"expr\",false,\"print(mean(data2$k))\"],[19,1,19,5,215,217,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[19,1,19,5,217,235,\"expr\",false,\"print\"],[19,6,19,6,216,235,\"'('\",true,\"(\"],[19,7,19,19,230,235,\"expr\",false,\"mean(data2$k)\"],[19,7,19,10,218,220,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[19,7,19,10,220,230,\"expr\",false,\"mean\"],[19,11,19,11,219,230,\"'('\",true,\"(\"],[19,12,19,18,225,230,\"expr\",false,\"data2$k\"],[19,12,19,16,221,223,\"SYMBOL\",true,\"data2\"],[19,12,19,16,223,225,\"expr\",false,\"data2\"],[19,17,19,17,222,225,\"'$'\",true,\"$\"],[19,18,19,18,224,225,\"SYMBOL\",true,\"k\"],[19,19,19,19,226,230,\"')'\",true,\")\"],[19,20,19,20,231,235,\"')'\",true,\")\"]",".meta":{"timing":4}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,9,13,14],"value":{"type":"RFunctionCall","named":true,"location":[13,9,13,14],"lexeme":"ggplot","functionName":{"type":"RSymbol","location":[13,9,13,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":40,"parent":50,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,27,13,27],"lexeme":"y","name":{"type":"RSymbol","location":[13,27,13,27],"content":"y","lexeme":"y","info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":45,"parent":47,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[16,15,16,21],"lexeme":"data2$y","value":{"type":"RAccess","location":[16,20,16,20],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,15,16,19],"content":"data2","lexeme":"data2","info":{"fullRange":[16,15,16,19],"additionalTokens":[],"id":62,"parent":65,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[17,17,17,23],"lexeme":"data2$y","value":{"type":"RAccess","location":[17,22,17,22],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,17,17,21],"content":"data2","lexeme":"data2","info":{"fullRange":[17,17,17,21],"additionalTokens":[],"id":74,"parent":77,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.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-9699-AUbYKPncDLTw-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-9699-AUbYKPncDLTw-.R","role":"root","index":0}},".meta":{"timing":2}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-9699-AUbYKPncDLTw-.R"],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],"cfgQuick":{"graph":{"rootVertices":[90,0,3,"3-exit",2,1,"2-exit",4,7,"7-exit",6,5,"6-exit",8,11,"11-exit",10,9,"10-exit",12,13,16,"16-exit",15,14,"15-exit",17,"17-exit",18,19,22,"22-exit",21,20,"21-exit",23,"23-exit",24,25,31,"31-exit",30,26,29,28,27,"28-exit","29-exit","30-exit",32,"32-exit",33,36,"36-exit",35,34,"35-exit",37,52,"52-exit",39,38,"39-exit",51,40,50,"50-exit",49,41,48,"48-exit",44,42,43,"44-exit",47,45,46,"47-exit","49-exit","51-exit",53,54,"54-exit",55,"55-exit",56,67,"67-exit",61,57,60,59,58,"59-exit","60-exit","61-exit",66,62,65,64,63,"64-exit","65-exit","66-exit",68,79,"79-exit",73,69,72,71,70,"71-exit","72-exit","73-exit",78,74,77,76,75,"76-exit","77-exit","78-exit",80,89,"89-exit",88,81,87,"87-exit",86,82,85,84,83,"84-exit","85-exit","86-exit","88-exit","90-exit"],"vertexInformation":[[90,{"id":90,"type":"expr","end":["90-exit"]}],[0,{"id":0,"type":"expr"}],[3,{"id":3,"type":"stm","mid":[0],"end":["3-exit"]}],["3-exit",{"id":"3-exit","type":"end","root":3}],[2,{"id":2,"type":"expr","mid":[2],"end":["2-exit"]}],[1,{"id":1,"type":"expr"}],["2-exit",{"id":"2-exit","type":"end","root":2}],[4,{"id":4,"type":"expr"}],[7,{"id":7,"type":"stm","mid":[4],"end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],[6,{"id":6,"type":"expr","mid":[6],"end":["6-exit"]}],[5,{"id":5,"type":"expr"}],["6-exit",{"id":"6-exit","type":"end","root":6}],[8,{"id":8,"type":"expr"}],[11,{"id":11,"type":"stm","mid":[8],"end":["11-exit"]}],["11-exit",{"id":"11-exit","type":"end","root":11}],[10,{"id":10,"type":"expr","mid":[10],"end":["10-exit"]}],[9,{"id":9,"type":"expr"}],["10-exit",{"id":"10-exit","type":"end","root":10}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr"}],[16,{"id":16,"type":"expr","mid":[13],"end":["16-exit"]}],["16-exit",{"id":"16-exit","type":"end","root":16}],[15,{"id":15,"type":"expr","mid":[15],"end":["15-exit"]}],[14,{"id":14,"type":"expr"}],["15-exit",{"id":"15-exit","type":"end","root":15}],[17,{"id":17,"type":"expr","end":["17-exit"]}],["17-exit",{"id":"17-exit","type":"end","root":17}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr"}],[22,{"id":22,"type":"expr","mid":[19],"end":["22-exit"]}],["22-exit",{"id":"22-exit","type":"end","root":22}],[21,{"id":21,"type":"expr","mid":[21],"end":["21-exit"]}],[20,{"id":20,"type":"expr"}],["21-exit",{"id":"21-exit","type":"end","root":21}],[23,{"id":23,"type":"expr","end":["23-exit"]}],["23-exit",{"id":"23-exit","type":"end","root":23}],[24,{"id":24,"type":"expr"}],[25,{"id":25,"type":"expr"}],[31,{"id":31,"type":"expr","mid":[25],"end":["31-exit"]}],["31-exit",{"id":"31-exit","type":"end","root":31}],[30,{"id":30,"type":"expr","mid":[30],"end":["30-exit"]}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"expr","mid":[26],"end":["29-exit"]}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["29-exit",{"id":"29-exit","type":"end","root":29}],["30-exit",{"id":"30-exit","type":"end","root":30}],[32,{"id":32,"type":"expr","end":["32-exit"]}],["32-exit",{"id":"32-exit","type":"end","root":32}],[33,{"id":33,"type":"expr"}],[36,{"id":36,"type":"stm","mid":[33],"end":["36-exit"]}],["36-exit",{"id":"36-exit","type":"end","root":36}],[35,{"id":35,"type":"expr","mid":[35],"end":["35-exit"]}],[34,{"id":34,"type":"expr"}],["35-exit",{"id":"35-exit","type":"end","root":35}],[37,{"id":37,"type":"expr"}],[52,{"id":52,"type":"expr","mid":[37],"end":["52-exit"]}],["52-exit",{"id":"52-exit","type":"end","root":52}],[39,{"id":39,"type":"expr","mid":[39],"end":["39-exit"]}],[38,{"id":38,"type":"expr"}],["39-exit",{"id":"39-exit","type":"end","root":39}],[51,{"id":51,"type":"expr","mid":[51],"end":["51-exit"]}],[40,{"id":40,"type":"expr"}],[50,{"id":50,"type":"expr","mid":[40],"end":["50-exit"]}],["50-exit",{"id":"50-exit","type":"end","root":50}],[49,{"id":49,"type":"expr","mid":[49],"end":["49-exit"]}],[41,{"id":41,"type":"expr"}],[48,{"id":48,"type":"expr","mid":[41],"end":["48-exit"]}],["48-exit",{"id":"48-exit","type":"end","root":48}],[44,{"id":44,"type":"expr","mid":[42],"end":["44-exit"]}],[42,{"id":42,"type":"expr"}],[43,{"id":43,"type":"expr"}],["44-exit",{"id":"44-exit","type":"end","root":44}],[47,{"id":47,"type":"expr","mid":[45],"end":["47-exit"]}],[45,{"id":45,"type":"expr"}],[46,{"id":46,"type":"expr"}],["47-exit",{"id":"47-exit","type":"end","root":47}],["49-exit",{"id":"49-exit","type":"end","root":49}],["51-exit",{"id":"51-exit","type":"end","root":51}],[53,{"id":53,"type":"expr"}],[54,{"id":54,"type":"expr","mid":[53],"end":["54-exit"]}],["54-exit",{"id":"54-exit","type":"end","root":54}],[55,{"id":55,"type":"expr","end":["55-exit"]}],["55-exit",{"id":"55-exit","type":"end","root":55}],[56,{"id":56,"type":"expr"}],[67,{"id":67,"type":"stm","mid":[56],"end":["67-exit"]}],["67-exit",{"id":"67-exit","type":"end","root":67}],[61,{"id":61,"type":"expr","mid":[61],"end":["61-exit"]}],[57,{"id":57,"type":"expr"}],[60,{"id":60,"type":"expr","mid":[57],"end":["60-exit"]}],[59,{"id":59,"type":"expr","mid":[59],"end":["59-exit"]}],[58,{"id":58,"type":"expr"}],["59-exit",{"id":"59-exit","type":"end","root":59}],["60-exit",{"id":"60-exit","type":"end","root":60}],["61-exit",{"id":"61-exit","type":"end","root":61}],[66,{"id":66,"type":"expr","mid":[66],"end":["66-exit"]}],[62,{"id":62,"type":"expr"}],[65,{"id":65,"type":"expr","mid":[62],"end":["65-exit"]}],[64,{"id":64,"type":"expr","mid":[64],"end":["64-exit"]}],[63,{"id":63,"type":"expr"}],["64-exit",{"id":"64-exit","type":"end","root":64}],["65-exit",{"id":"65-exit","type":"end","root":65}],["66-exit",{"id":"66-exit","type":"end","root":66}],[68,{"id":68,"type":"expr"}],[79,{"id":79,"type":"stm","mid":[68],"end":["79-exit"]}],["79-exit",{"id":"79-exit","type":"end","root":79}],[73,{"id":73,"type":"expr","mid":[73],"end":["73-exit"]}],[69,{"id":69,"type":"expr"}],[72,{"id":72,"type":"expr","mid":[69],"end":["72-exit"]}],[71,{"id":71,"type":"expr","mid":[71],"end":["71-exit"]}],[70,{"id":70,"type":"expr"}],["71-exit",{"id":"71-exit","type":"end","root":71}],["72-exit",{"id":"72-exit","type":"end","root":72}],["73-exit",{"id":"73-exit","type":"end","root":73}],[78,{"id":78,"type":"expr","mid":[78],"end":["78-exit"]}],[74,{"id":74,"type":"expr"}],[77,{"id":77,"type":"expr","mid":[74],"end":["77-exit"]}],[76,{"id":76,"type":"expr","mid":[76],"end":["76-exit"]}],[75,{"id":75,"type":"expr"}],["76-exit",{"id":"76-exit","type":"end","root":76}],["77-exit",{"id":"77-exit","type":"end","root":77}],["78-exit",{"id":"78-exit","type":"end","root":78}],[80,{"id":80,"type":"expr"}],[89,{"id":89,"type":"stm","mid":[80],"end":["89-exit"]}],["89-exit",{"id":"89-exit","type":"end","root":89}],[88,{"id":88,"type":"expr","mid":[88],"end":["88-exit"]}],[81,{"id":81,"type":"expr"}],[87,{"id":87,"type":"expr","mid":[81],"end":["87-exit"]}],["87-exit",{"id":"87-exit","type":"end","root":87}],[86,{"id":86,"type":"expr","mid":[86],"end":["86-exit"]}],[82,{"id":82,"type":"expr"}],[85,{"id":85,"type":"expr","mid":[82],"end":["85-exit"]}],[84,{"id":84,"type":"expr","mid":[84],"end":["84-exit"]}],[83,{"id":83,"type":"expr"}],["84-exit",{"id":"84-exit","type":"end","root":84}],["85-exit",{"id":"85-exit","type":"end","root":85}],["86-exit",{"id":"86-exit","type":"end","root":86}],["88-exit",{"id":"88-exit","type":"end","root":88}],["90-exit",{"id":"90-exit","type":"end","root":90}]],"bbChildren":[],"edgeInformation":[[3,[[90,{"label":0}]]],[0,[[3,{"label":0}]]],[1,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[2,[[0,{"label":0}]]],["3-exit",[["2-exit",{"label":0}]]],[7,[["3-exit",{"label":0}]]],[4,[[7,{"label":0}]]],[5,[[6,{"label":0}]]],["6-exit",[[5,{"label":0}]]],[6,[[4,{"label":0}]]],["7-exit",[["6-exit",{"label":0}]]],[11,[["7-exit",{"label":0}]]],[8,[[11,{"label":0}]]],[9,[[10,{"label":0}]]],["10-exit",[[9,{"label":0}]]],[10,[[8,{"label":0}]]],["11-exit",[["10-exit",{"label":0}]]],[17,[["11-exit",{"label":0}]]],[13,[[16,{"label":0}]]],[14,[[15,{"label":0}]]],["15-exit",[[14,{"label":0}]]],[15,[[13,{"label":0}]]],["16-exit",[["15-exit",{"label":0}]]],[16,[[12,{"label":0}]]],[12,[[17,{"label":0}]]],["17-exit",[["16-exit",{"label":0}]]],[23,[["17-exit",{"label":0}]]],[19,[[22,{"label":0}]]],[20,[[21,{"label":0}]]],["21-exit",[[20,{"label":0}]]],[21,[[19,{"label":0}]]],["22-exit",[["21-exit",{"label":0}]]],[22,[[18,{"label":0}]]],[18,[[23,{"label":0}]]],["23-exit",[["22-exit",{"label":0}]]],[32,[["23-exit",{"label":0}]]],[25,[[31,{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],[29,[[30,{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[30,[[25,{"label":0}]]],["31-exit",[["30-exit",{"label":0}]]],[31,[[24,{"label":0}]]],[24,[[32,{"label":0}]]],["32-exit",[["31-exit",{"label":0}]]],[36,[["32-exit",{"label":0}]]],[33,[[36,{"label":0}]]],[34,[[35,{"label":0}]]],["35-exit",[[34,{"label":0}]]],[35,[[33,{"label":0}]]],["36-exit",[["35-exit",{"label":0}]]],[55,[["36-exit",{"label":0}]]],[37,[[52,{"label":0}]]],[38,[[39,{"label":0}]]],["39-exit",[[38,{"label":0}]]],[39,[[37,{"label":0}]]],[40,[[50,{"label":0}]]],[41,[[48,{"label":0}]]],[42,[[44,{"label":0}]]],[43,[[42,{"label":0}]]],["44-exit",[[43,{"label":0}]]],[44,[[41,{"label":0}]]],[45,[[47,{"label":0}]]],[46,[[45,{"label":0}]]],["47-exit",[[46,{"label":0}]]],[47,[["44-exit",{"label":0}]]],["48-exit",[["47-exit",{"label":0}]]],[48,[[49,{"label":0}]]],["49-exit",[["48-exit",{"label":0}]]],[49,[[40,{"label":0}]]],["50-exit",[["49-exit",{"label":0}]]],[50,[[51,{"label":0}]]],["51-exit",[["50-exit",{"label":0}]]],[51,[["39-exit",{"label":0}]]],["52-exit",[["51-exit",{"label":0}]]],[53,[[54,{"label":0}]]],["54-exit",[[53,{"label":0}]]],[54,[["52-exit",{"label":0}]]],[52,[[55,{"label":0}]]],["55-exit",[["54-exit",{"label":0}]]],[67,[["55-exit",{"label":0}]]],[56,[[67,{"label":0}]]],[57,[[60,{"label":0}]]],[58,[[59,{"label":0}]]],["59-exit",[[58,{"label":0}]]],[59,[[57,{"label":0}]]],["60-exit",[["59-exit",{"label":0}]]],[60,[[61,{"label":0}]]],["61-exit",[["60-exit",{"label":0}]]],[61,[[56,{"label":0}]]],[62,[[65,{"label":0}]]],[63,[[64,{"label":0}]]],["64-exit",[[63,{"label":0}]]],[64,[[62,{"label":0}]]],["65-exit",[["64-exit",{"label":0}]]],[65,[[66,{"label":0}]]],["66-exit",[["65-exit",{"label":0}]]],[66,[["61-exit",{"label":0}]]],["67-exit",[["66-exit",{"label":0}]]],[79,[["67-exit",{"label":0}]]],[68,[[79,{"label":0}]]],[69,[[72,{"label":0}]]],[70,[[71,{"label":0}]]],["71-exit",[[70,{"label":0}]]],[71,[[69,{"label":0}]]],["72-exit",[["71-exit",{"label":0}]]],[72,[[73,{"label":0}]]],["73-exit",[["72-exit",{"label":0}]]],[73,[[68,{"label":0}]]],[74,[[77,{"label":0}]]],[75,[[76,{"label":0}]]],["76-exit",[[75,{"label":0}]]],[76,[[74,{"label":0}]]],["77-exit",[["76-exit",{"label":0}]]],[77,[[78,{"label":0}]]],["78-exit",[["77-exit",{"label":0}]]],[78,[["73-exit",{"label":0}]]],["79-exit",[["78-exit",{"label":0}]]],[89,[["79-exit",{"label":0}]]],[80,[[89,{"label":0}]]],[81,[[87,{"label":0}]]],[82,[[85,{"label":0}]]],[83,[[84,{"label":0}]]],["84-exit",[[83,{"label":0}]]],[84,[[82,{"label":0}]]],["85-exit",[["84-exit",{"label":0}]]],[85,[[86,{"label":0}]]],["86-exit",[["85-exit",{"label":0}]]],[86,[[81,{"label":0}]]],["87-exit",[["86-exit",{"label":0}]]],[87,[[88,{"label":0}]]],["88-exit",[["87-exit",{"label":0}]]],[88,[[80,{"label":0}]]],["89-exit",[["88-exit",{"label":0}]]],["90-exit",[["89-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["90-exit"],"entryPoints":[90]},".meta":{"timing":7}}}} -
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 28.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 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'
-
. 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 the dataflow graph for "x <- 2".
Note
If you develop flowR, you may want to launch the repl using the npm run main-dev command, this way, you get a non-minified version of flowR with debug information and hot-reloading of source files.
Available Commands
We currently offer the following commands (this with a [*] suffix are available with and without the star):
| Command | Description |
|---|---|
| :quit | End the repl (aliases: :q, :exit) |
| :execute | Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r) |
| :controlflow[*] | Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) |
| :controlflowbb[*] | Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) |
| :dataflow[*] | Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) |
| :normalize[*] | Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) |
| :dataflowsimple[*] | Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) |
| :parse | Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) |
| :version | Prints the version of flowR as well as the current version of R |
| :query[*] | Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) |
| :help | Show help information (aliases: :h, :?) |
To retrieve a URL to the mermaid diagram of the dataflow of a given expression,
use :dataflow* (or :dataflow to get the mermaid code in the cli):
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.6.2, R v4.5.0 (r-shell engine)
R> :dataflow* y <- 1 + 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 2.5 ms (including parse and normalize, using the r-shell engine) within the generation environment. We encountered no unknown side effects during the analysis.
y <- 1 + 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.6.2, R v4.5.0 (r-shell engine)
R> :parse file://test/testfiles/example.ROutput
exprlist
├ expr
│ ├ expr
│ │ ╰ SYMBOL "sum" (1:1─3)
│ ├ LEFT_ASSIGN "<-" (1:5─6)
│ ╰ expr
│ ╰ NUM_CONST "0" (1:8)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "product" (2:1─7)
│ ├ LEFT_ASSIGN "<-" (2:9─10)
│ ╰ expr
│ ╰ NUM_CONST "1" (2:12)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "w" (3:1)
│ ├ LEFT_ASSIGN "<-" (3:3─4)
│ ╰ expr
│ ╰ NUM_CONST "7" (3:6)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "N" (4:1)
│ ├ LEFT_ASSIGN "<-" (4:3─4)
│ ╰ expr
│ ╰ NUM_CONST "10" (4:6─7)
├ expr
│ ├ FOR "for" (6:1─3)
│ ├ forcond
│ │ ├ ( "(" (6:5)
│ │ ├ SYMBOL "i" (6:6)
│ │ ├ IN "in" (6:8─9)
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ NUM_CONST "1" (6:11)
│ │ │ ├ : ":" (6:12)
│ │ │ ╰ expr
│ │ │ ├ ( "(" (6:13)
│ │ │ ├ expr
│ │ │ │ ├ expr
│ │ │ │ │ ╰ SYMBOL "N" (6:14)
│ │ │ │ ├ - "-" (6:15)
│ │ │ │ ╰ expr
│ │ │ │ ╰ NUM_CONST "1" (6:16)
│ │ │ ╰ ) ")" (6:17)
│ │ ╰ ) ")" (6:18)
│ ╰ expr
│ ├ { "{" (6:20)
│ ├ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "sum" (7:3─5)
│ │ ├ LEFT_ASSIGN "<-" (7:7─8)
│ │ ╰ expr
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ SYMBOL "sum" (7:10─12)
│ │ │ ├ + "+" (7:14)
│ │ │ ╰ expr
│ │ │ ╰ SYMBOL "i" (7:16)
│ │ ├ + "+" (7:18)
│ │ ╰ expr
│ │ ╰ SYMBOL "w" (7:20)
│ ├ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "product" (8:3─9)
│ │ ├ LEFT_ASSIGN "<-" (8:11─12)
│ │ ╰ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "product" (8:14─20)
│ │ ├ * "*" (8:22)
│ │ ╰ expr
│ │ ╰ SYMBOL "i" (8:24)
│ ╰ } "}" (9:1)
├ expr
│ ├ expr
│ │ ╰ SYMBOL_FUNCTION_CALL "cat" (11:1─3)
│ ├ ( "(" (11:4)
│ ├ expr
│ │ ╰ STR_CONST "\"Sum:\"" (11:5─10)
│ ├ , "," (11:11)
│ ├ expr
│ │ ╰ SYMBOL "sum" (11:13─15)
│ ├ , "," (11:16)
│ ├ expr
│ │ ╰ STR_CONST "\"\\n\"" (11:18─21)
│ ╰ ) ")" (11:22)
╰ expr
├ expr
│ ╰ SYMBOL_FUNCTION_CALL "cat" (12:1─3)
├ ( "(" (12:4)
├ expr
│ ╰ STR_CONST "\"Product:\"" (12:5─14)
├ , "," (12:15)
├ expr
│ ╰ SYMBOL "product" (12:17─23)
├ , "," (12:24)
├ expr
│ ╰ STR_CONST "\"\\n\"" (12:26─29)
╰ ) ")" (12:30)
Retrieve the parsed AST of the example file.
File Content
sum <- 0
product <- 1
w <- 7
N <- 10
for (i in 1:(N-1)) {
sum <- sum + i + w
product <- product * i
}
cat("Sum:", sum, "\n")
cat("Product:", product, "\n")As flowR directly transforms this AST the output focuses on being human-readable instead of being machine-readable.
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": {}
}
]
}
}
},
"engines": [
{
"type": "r-shell"
}
],
"solver": {
"variables": "alias",
"evalStrings": true,
"pointerTracking": true,
"resolveSource": {
"dropPaths": "no",
"ignoreCapitalization": true,
"inferWorkingDirectory": "active-script",
"searchPath": []
},
"slicer": {
"threshold": 50
}
},
"abstractInterpretation": {
"dataFrame": {
"maxColNames": 20,
"wideningThreshold": 4,
"readLoadedData": {
"readExternalFiles": true,
"maxReadLines": 1000000
}
}
}
}Configure Built-In Semantics
semantics/environment/overwriteBuiltins accepts two keys:
-
loadDefaults(boolean, 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.
-
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 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
- 🧹 Linting & Testing (Benchmark Page)
⁉️ FAQ- ℹ️ Extra Information