pwn 0.4.671 → 0.4.673

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7da5c11247c09b3a6355dd825d5b200c7b54845d2b02b4a91a2b651ac6e0f693
4
- data.tar.gz: 8ae730c8dcc7af833543ac7b999fb075dd53e64cfb8a348791caadc03bf16c4a
3
+ metadata.gz: 66259ccdc59be89f796f56e88a20f9eb5bef320c46a4b7fc268b62f664e50c6e
4
+ data.tar.gz: 162ad18b794121a96802d6f5de739b4fc22eb8c0dda0a780fc6144fedc107af3
5
5
  SHA512:
6
- metadata.gz: 7480b0859bedc2c26bc36fef113eeb0981169f500edfe0d3ece6a69b36a5c5e10bffc052c0640d705620e456233254224df1d5a8bb904b3301189572d8d0a2d9
7
- data.tar.gz: 6486d7ffa7d468d772639c8666594e21b326de1a5acbafad7fdc966746237df97ed43e7883016d98df3692ad2c0b0a7b623a73162885da0f196f0b1260050375
6
+ metadata.gz: 2e6515b72bf8b01805b50cc9e5bb701edf2fb725182c1a1c425188e8d2542badd19cd93cbdf4c358fc2c2cfcb9c49341b4322cc76d596a200548eebe73c4ffd4
7
+ data.tar.gz: 846a1b1ca1f1ef9bc2affdb57ea1accf45f210e86085da968b54d01e45e9f6d6103f8108a7ef7a2888f4ebadd57988f68afafea86925f8c7c4867915388c36a7
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ rvm use ruby-3.2.2@pwn
37
37
  $ rvm list gemsets
38
38
  $ gem install --verbose pwn
39
39
  $ pwn
40
- pwn[v0.4.671]:001 >>> PWN.help
40
+ pwn[v0.4.673]:001 >>> PWN.help
41
41
  ```
42
42
 
43
43
  [![Installing the pwn Security Automation Framework](https://raw.githubusercontent.com/0dayInc/pwn/master/documentation/pwn_install.png)](https://youtu.be/G7iLUY4FzsI)
@@ -52,7 +52,7 @@ $ rvm use ruby-3.2.2@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.4.671]:001 >>> PWN.help
55
+ pwn[v0.4.673]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
 
@@ -2,7 +2,6 @@
2
2
  # frozen_string_literal: false
3
3
 
4
4
  require 'optparse'
5
- require 'nokogiri'
6
5
  require 'pwn'
7
6
 
8
7
  opts = {}
@@ -42,7 +41,7 @@ with_tor = true if opts[:with_tor]
42
41
  with_tor ||= false
43
42
  if with_tor
44
43
  tor_obj = PWN::Plugins::Tor.start
45
- proxy = "socks4://#{tor_obj[:ip]}:#{tor_obj[:port]}"
44
+ proxy = ["socks4://#{tor_obj[:ip]}:#{tor_obj[:port]}"]
46
45
  end
47
46
 
48
47
  File.new(exclude_file, 'w') unless File.exist?(exclude_file)
@@ -106,11 +105,29 @@ latest_tcp_results = "#{nmap_results_root}/nmap_latest_tcp_results"
106
105
  latest_udp_results = "#{nmap_results_root}/nmap_latest_udp_results"
107
106
 
108
107
  begin
108
+ # Per man nmap:
109
+ # The main effects of T0 are serializing the scan so only one port
110
+ # is scanned at a time, and waiting five minutes between sending
111
+ # each probe.
112
+ # T1 and T2 are similar but they only wait 15 seconds and 0.4 seconds,
113
+ # respectively, between probes.
114
+ # T3 is Nmap's default behavior, which includes parallelization.
115
+ # T4 does the equivalent of --max-rtt-timeout 1250ms --min-rtt-timeout 100ms
116
+ # --initial-rtt-timeout 500ms --max-retries 6 and sets the maximum TCP and
117
+ # SCTP scan delay to 10ms.
118
+ # T5 does the equivalent of --max-rtt-timeout 300ms --min-rtt-timeout 50ms
119
+ # --initial-rtt-timeout 250ms --max-retries 2 --host-timeout 15m
120
+ # --script-timeout 10m --max-scan-delay as well as setting the maximum TCP
121
+ # and SCTP scan delay to 5ms. Maximum UDP scan delay is not set by T4 or T5,
122
+ # but it can be set with the --max-scan-delay option.
123
+
109
124
  # Target Discovery Scan
125
+ # Using -T5 template to reduce number of
126
+ # retransmission attempts on filtered ports.
110
127
  PWN::Plugins::NmapIt.port_scan do |nmap|
111
128
  nmap.exclude_file = exclude_file
112
129
  nmap.interface = interface
113
- nmap.aggressive_timing = true
130
+ nmap.insane_timing = true
114
131
  nmap.ping = true
115
132
  nmap.arp_ping = true
116
133
  nmap.icmp_echo_discovery = true
@@ -121,6 +138,7 @@ begin
121
138
  nmap.sctp_init_ping = discovery_ports.values
122
139
  nmap.output_all = latest_discovery_results
123
140
  nmap.targets = ip_range
141
+ nmap.randomize_hosts = true
124
142
  nmap.proxies = proxy if with_tor
125
143
  end
126
144
 
@@ -135,19 +153,24 @@ begin
135
153
  end
136
154
  end
137
155
  end
156
+ sorted_targets = File.readlines(target_file).sort.join
157
+ File.write(target_file, sorted_targets)
138
158
 
139
159
  # Switch Tor Exit Node if with_tor
140
160
  PWN::Plugins::Tor.switch_exit_node(tor_obj: tor_obj) if with_tor
141
161
 
142
162
  # TCP Scan
163
+ # Using -T5 template to reduce number of
164
+ # retransmission attempts on filtered ports.
143
165
  PWN::Plugins::NmapIt.port_scan do |nmap|
144
166
  nmap.target_file = target_file
167
+ nmap.randomize_hosts = true
145
168
  nmap.show_reason = true
146
169
  nmap.exclude_file = exclude_file
147
170
  nmap.interface = interface
148
171
  nmap.min_host_group = 3
149
172
  nmap.host_timeout = '999m'
150
- nmap.aggressive_timing = true
173
+ nmap.insane_timing = true
151
174
  nmap.skip_discovery = true
152
175
  nmap.syn_scan = true
153
176
  nmap.default_script = true
@@ -166,14 +189,17 @@ begin
166
189
  PWN::Plugins::Tor.switch_exit_node(tor_obj: tor_obj) if with_tor
167
190
 
168
191
  # UDP Scan
192
+ # Using -T5 template to reduce number of
193
+ # retransmission attempts on filtered ports.
169
194
  PWN::Plugins::NmapIt.port_scan do |nmap|
170
195
  nmap.target_file = target_file
196
+ nmap.randomize_hosts = true
171
197
  nmap.show_reason = true
172
198
  nmap.exclude_file = exclude_file
173
199
  nmap.interface = interface
174
200
  nmap.min_host_group = 3
175
201
  nmap.host_timeout = '999m'
176
- nmap.aggressive_timing = true
202
+ nmap.insane_timing = true
177
203
  nmap.skip_discovery = true
178
204
  nmap.udp_scan = true
179
205
  nmap.default_script = true
data/lib/pwn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.4.671'
4
+ VERSION = '0.4.673'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.671
4
+ version: 0.4.673
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -1143,7 +1143,6 @@ executables:
1143
1143
  extensions: []
1144
1144
  extra_rdoc_files: []
1145
1145
  files:
1146
- - ".each do |bytes_matched|"
1147
1146
  - ".github/FUNDING.yml"
1148
1147
  - ".github/ISSUE_TEMPLATE/bug_report.md"
1149
1148
  - ".gitignore"
@@ -1,271 +0,0 @@
1
- => [["static void gv_init(void) {\n /* list of builtins, enable demand loading */\n gvc = gvContextPlugins(lt_preloaded_symbols, DEMAND_LOADING);\n}",
2
- "\n /* list of builtins, enable demand loading */\n gvc = gvContextPlugins(lt_preloaded_symbols, DEMAND_LOADING);\n",
3
- "}"],
4
- ["Agraph_t *graph(char *name)\n{\n if (!gvc)\n gv_init();\n return agopen(name, Agundirected, 0);\n}",
5
- "\n if (!gvc)\n gv_init();\n return agopen(name, Agundirected, 0);\n",
6
- "}"],
7
- ["Agraph_t *digraph(char *name)\n{\n if (!gvc)\n gv_init();\n return agopen(name, Agdirected, 0);\n}",
8
- "\n if (!gvc)\n gv_init();\n return agopen(name, Agdirected, 0);\n",
9
- "}"],
10
- ["Agraph_t *strictgraph(char *name)\n{\n if (!gvc)\n gv_init();\n return agopen(name, Agstrictundirected, 0);\n}",
11
- "\n if (!gvc)\n gv_init();\n return agopen(name, Agstrictundirected, 0);\n",
12
- "}"],
13
- ["Agraph_t *strictdigraph(char *name)\n{\n if (!gvc)\n gv_init();\n return agopen(name, Agstrictdirected, 0);\n}",
14
- "\n if (!gvc)\n gv_init();\n return agopen(name, Agstrictdirected, 0);\n",
15
- "}"],
16
- ["Agraph_t *readstring(char *string)\n{\n if (!gvc)\n gv_init();\n return agmemread(string);\n}",
17
- "\n if (!gvc)\n gv_init();\n return agmemread(string);\n",
18
- "}"],
19
- ["Agraph_t *read(FILE *f)\n{\n if (!gvc)\n gv_init();\n return agread(f, NULL);\n}",
20
- "\n if (!gvc)\n gv_init();\n return agread(f, NULL);\n",
21
- "}"],
22
- ["Agraph_t *read(const char *filename)\n{\n FILE *f;\n Agraph_t *g;\n\n f = fopen(filename, \"r\");\n if (!f)\n return NULL;\n if (!gvc)\n gv_init();\n g = agread(f, NULL);\n fclose(f);\n return g;\n}",
23
- "\n FILE *f;\n Agraph_t *g;\n\n f = fopen(filename, \"r\");\n if (!f)\n return NULL;\n if (!gvc)\n gv_init();\n g = agread(f, NULL);\n fclose(f);\n return g;\n",
24
- "}"],
25
- ["Agraph_t *graph(Agraph_t *g, char *name)\n{\n if (!gvc)\n gv_init();\n return agsubg(g, name, 1);\n}",
26
- "\n if (!gvc)\n gv_init();\n return agsubg(g, name, 1);\n",
27
- "}"],
28
- ["Agnode_t *node(Agraph_t *g, char *name)\n{\n if (!gvc)\n return NULL;\n return agnode(g, name, 1);\n}",
29
- "\n if (!gvc)\n return NULL;\n return agnode(g, name, 1);\n",
30
- "}"],
31
- ["Agedge_t *edge(Agraph_t* g, Agnode_t *t, Agnode_t *h)\n{\n if (!gvc || !t || !h || !g)\n return NULL;\n // edges from/to the protonode are not permitted\n if (AGTYPE(t) == AGRAPH || AGTYPE(h) == AGRAPH)\n\treturn NULL;\n return agedge(g, t, h, NULL, 1);\n}",
32
- "\n if (!gvc || !t || !h || !g)\n return NULL;\n // edges from/to the protonode are not permitted\n if (AGTYPE(t) == AGRAPH || AGTYPE(h) == AGRAPH)\n\treturn NULL;\n return agedge(g, t, h, NULL, 1);\n",
33
- "}"],
34
- ["Agedge_t *edge(Agnode_t *t, Agnode_t *h)\n{\n return edge(agraphof(t), t, h);\n}",
35
- "\n return edge(agraphof(t), t, h);\n",
36
- "}"],
37
- ["Agedge_t *edge(char *tname, Agnode_t *h)\n{\n return edge(node(agraphof(h), tname), h);\n}",
38
- "\n return edge(node(agraphof(h), tname), h);\n",
39
- "}"],
40
- ["Agedge_t *edge(Agnode_t *t, char *hname)\n{\n return edge(t, node(agraphof(t), hname));\n}",
41
- "\n return edge(t, node(agraphof(t), hname));\n",
42
- "}"],
43
- ["Agedge_t *edge(Agraph_t *g, char *tname, char *hname)\n{\n return edge(g, node(g, tname), node(g, hname));\n}",
44
- "\n return edge(g, node(g, tname), node(g, hname));\n",
45
- "}"],
46
- ["static char* myagxget(void *obj, Agsym_t *a)\n{\n int len;\n char *val, *hs;\n\n if (!obj || !a)\n return emptystring;\n val = agxget(obj, a);\n if (!val)\n return emptystring;\n if (a->name[0] == 'l' && strcmp(a->name, \"label\") == 0 && aghtmlstr(val)) {\n len = strlen(val);\n hs = (char*)malloc(len + 3);\n hs[0] = '<';\n strcpy(hs+1, val);\n hs[len+1] = '>';\n hs[len+2] = '\\0';\n return hs;\n }\n return val;\n}",
47
- "\n int len;\n char *val, *hs;\n\n if (!obj || !a)\n return emptystring;\n val = agxget(obj, a);\n if (!val)\n return emptystring;\n if (a->name[0] == 'l' && strcmp(a->name, \"label\") == 0 && aghtmlstr(val)) {\n len = strlen(val);\n hs = (char*)malloc(len + 3);\n hs[0] = '<';\n strcpy(hs+1, val);\n hs[len+1] = '>';\n hs[len+2] = '\\0';\n return hs;\n }\n return val;\n",
48
- "}"],
49
- ["char *getv(Agraph_t *g, Agsym_t *a)\n{\n return myagxget(g, a);\n}",
50
- "\n return myagxget(g, a);\n",
51
- "}"],
52
- ["char *getv(Agraph_t *g, char *attr)\n{\n Agsym_t *a;\n\n if (!g || !attr)\n return NULL;\n a = agfindattr(agroot(g), attr);\n return myagxget(g, a);\n}",
53
- "\n Agsym_t *a;\n\n if (!g || !attr)\n return NULL;\n a = agfindattr(agroot(g), attr);\n return myagxget(g, a);\n",
54
- "}"],
55
- ["static void myagxset(void *obj, Agsym_t *a, char *val)\n{\n int len;\n char *hs;\n\n if (a->name[0] == 'l' && val[0] == '<' && strcmp(a->name, \"label\") == 0) {\n len = strlen(val);\n if (val[len-1] == '>') {\n hs = strdup(val+1);\n *(hs+len-2) = '\\0';\n val = agstrdup_html(agraphof(obj),hs);\n free(hs);\n }\n }\n agxset(obj, a, val);\n}",
56
- "\n int len;\n char *hs;\n\n if (a->name[0] == 'l' && val[0] == '<' && strcmp(a->name, \"label\") == 0) {\n len = strlen(val);\n if (val[len-1] == '>') {\n hs = strdup(val+1);\n *(hs+len-2) = '\\0';\n val = agstrdup_html(agraphof(obj),hs);\n free(hs);\n }\n }\n agxset(obj, a, val);\n",
57
- "}"],
58
- ["char *setv(Agraph_t *g, Agsym_t *a, char *val)\n{\n if (!g || !a || !val)\n return NULL;\n myagxset(g, a, val);\n return val;\n}",
59
- "\n if (!g || !a || !val)\n return NULL;\n myagxset(g, a, val);\n return val;\n",
60
- "}"],
61
- ["char *setv(Agraph_t *g, char *attr, char *val)\n{\n Agsym_t *a;\n\n if (!g || !attr || !val)\n return NULL;\n a = agfindattr(agroot(g), attr);\n if (!a)\n a = agraphattr(g->root, attr, emptystring);\n myagxset(g, a, val);\n return val;\n}",
62
- "\n Agsym_t *a;\n\n if (!g || !attr || !val)\n return NULL;\n a = agfindattr(agroot(g), attr);\n if (!a)\n a = agraphattr(g->root, attr, emptystring);\n myagxset(g, a, val);\n return val;\n",
63
- "}"],
64
- ["char *getv(Agnode_t *n, Agsym_t *a)\n{\n if (!n || !a)\n return NULL;\n if (AGTYPE(n) == AGRAPH) // protonode \n\treturn NULL; // FIXME ??\n return myagxget(n, a);\n}",
65
- "\n if (!n || !a)\n return NULL;\n if (AGTYPE(n) == AGRAPH) // protonode \n\treturn NULL; // FIXME ??\n return myagxget(n, a);\n",
66
- "}"],
67
- ["char *getv(Agnode_t *n, char *attr)\n{\n Agraph_t *g;\n Agsym_t *a;\n\n if (!n || !attr)\n return NULL;\n if (AGTYPE(n) == AGRAPH) // protonode \n\treturn NULL; // FIXME ??\n g = agroot(agraphof(n));\n a = agattr(g, AGNODE, attr, NULL);\n return myagxget(n, a);\n}",
68
- "\n Agraph_t *g;\n Agsym_t *a;\n\n if (!n || !attr)\n return NULL;\n if (AGTYPE(n) == AGRAPH) // protonode \n\treturn NULL; // FIXME ??\n g = agroot(agraphof(n));\n a = agattr(g, AGNODE, attr, NULL);\n return myagxget(n, a);\n",
69
- "}"],
70
- ["char *setv(Agnode_t *n, Agsym_t *a, char *val)\n{\n if (!n || !a || !val)\n return NULL;\n if (AGTYPE(n) == AGRAPH) // protonode \n\treturn NULL; // FIXME ??\n myagxset(n, a, val);\n return val;\n}",
71
- "\n if (!n || !a || !val)\n return NULL;\n if (AGTYPE(n) == AGRAPH) // protonode \n\treturn NULL; // FIXME ??\n myagxset(n, a, val);\n return val;\n",
72
- "}"],
73
- ["char *setv(Agnode_t *n, char *attr, char *val)\n{\n Agraph_t *g;\n Agsym_t *a;\n\n if (!n || !attr || !val)\n return NULL;\n if (AGTYPE(n) == AGRAPH) { // protonode \n\tg = (Agraph_t*)n;\n \ta = agattr(g, AGNODE, attr, val); // create default attribute in psuodo protonode\n\t // FIXME? - deal with html in \"label\" attributes\n\treturn val;\n }\n g = agroot(agraphof(n));\n a = agattr(g, AGNODE, attr, NULL);\n if (!a)\n a = agnodeattr(g, attr, emptystring);\n myagxset(n, a, val);\n return val;\n}",
74
- "\n Agraph_t *g;\n Agsym_t *a;\n\n if (!n || !attr || !val)\n return NULL;\n if (AGTYPE(n) == AGRAPH) { // protonode \n\tg = (Agraph_t*)n;\n \ta = agattr(g, AGNODE, attr, val); // create default attribute in psuodo protonode\n\t // FIXME? - deal with html in \"label\" attributes\n\treturn val;\n }\n g = agroot(agraphof(n));\n a = agattr(g, AGNODE, attr, NULL);\n if (!a)\n a = agnodeattr(g, attr, emptystring);\n myagxset(n, a, val);\n return val;\n",
75
- "}"],
76
- ["char *getv(Agedge_t *e, Agsym_t *a)\n{\n if (!e || !a)\n return NULL;\n if (AGTYPE(e) == AGRAPH) // protoedge \n\treturn NULL; // FIXME ??\n return myagxget(e, a);\n}",
77
- "\n if (!e || !a)\n return NULL;\n if (AGTYPE(e) == AGRAPH) // protoedge \n\treturn NULL; // FIXME ??\n return myagxget(e, a);\n",
78
- "}"],
79
- ["char *getv(Agedge_t *e, char *attr)\n{\n Agraph_t *g;\n Agsym_t *a;\n\n if (!e || !attr)\n return NULL;\n if (AGTYPE(e) == AGRAPH) // protoedge \n\treturn NULL; // FIXME ??\n g = agraphof(agtail(e));\n a = agattr(g, AGEDGE, attr, NULL);\n return myagxget(e, a);\n}",
80
- "\n Agraph_t *g;\n Agsym_t *a;\n\n if (!e || !attr)\n return NULL;\n if (AGTYPE(e) == AGRAPH) // protoedge \n\treturn NULL; // FIXME ??\n g = agraphof(agtail(e));\n a = agattr(g, AGEDGE, attr, NULL);\n return myagxget(e, a);\n",
81
- "}"],
82
- ["char *setv(Agedge_t *e, Agsym_t *a, char *val)\n{\n if (!e || !a || !val)\n return NULL;\n if (AGTYPE(e) == AGRAPH) // protoedge \n\treturn NULL; // FIXME ??\n myagxset(e, a, val);\n return val;\n}",
83
- "\n if (!e || !a || !val)\n return NULL;\n if (AGTYPE(e) == AGRAPH) // protoedge \n\treturn NULL; // FIXME ??\n myagxset(e, a, val);\n return val;\n",
84
- "}"],
85
- ["char *setv(Agedge_t *e, char *attr, char *val)\n{\n Agraph_t *g;\n Agsym_t *a;\n\n if (!e || !attr || !val)\n return NULL;\n if (AGTYPE(e) == AGRAPH) { // protoedge \n\tg = (Agraph_t*)e;\n \ta = agattr(g, AGEDGE, attr, val); // create default attribute in pseudo protoedge\n\t // FIXME? - deal with html in \"label\" attributes\n\treturn val;\n }\n g = agroot(agraphof(agtail(e)));\n a = agattr(g, AGEDGE, attr, NULL);\n if (!a)\n a = agattr(g, AGEDGE, attr, emptystring);\n myagxset(e, a, val);\n return val;\n}",
86
- "\n Agraph_t *g;\n Agsym_t *a;\n\n if (!e || !attr || !val)\n return NULL;\n if (AGTYPE(e) == AGRAPH) { // protoedge \n\tg = (Agraph_t*)e;\n \ta = agattr(g, AGEDGE, attr, val); // create default attribute in pseudo protoedge\n\t // FIXME? - deal with html in \"label\" attributes\n\treturn val;\n }\n g = agroot(agraphof(agtail(e)));\n a = agattr(g, AGEDGE, attr, NULL);\n if (!a)\n a = agattr(g, AGEDGE, attr, emptystring);\n myagxset(e, a, val);\n return val;\n",
87
- "}"],
88
- ["Agraph_t *findsubg(Agraph_t *g, char *name)\n{\n if (!g || !name)\n return NULL;\n return agsubg(g, name, 0);\n}",
89
- "\n if (!g || !name)\n return NULL;\n return agsubg(g, name, 0);\n",
90
- "}"],
91
- ["Agnode_t *findnode(Agraph_t *g, char *name)\n{\n if (!g || !name)\n return NULL;\n return agnode(g, name, 0);\n}",
92
- "\n if (!g || !name)\n return NULL;\n return agnode(g, name, 0);\n",
93
- "}"],
94
- ["Agedge_t *findedge(Agnode_t *t, Agnode_t *h)\n{\n if (!t || !h)\n return NULL;\n if (AGTYPE(t) == AGRAPH || AGTYPE(h) == AGRAPH)\n\treturn NULL;\n return agfindedge(agraphof(t), t, h);\n}",
95
- "\n if (!t || !h)\n return NULL;\n if (AGTYPE(t) == AGRAPH || AGTYPE(h) == AGRAPH)\n\treturn NULL;\n return agfindedge(agraphof(t), t, h);\n",
96
- "}"],
97
- ["Agsym_t *findattr(Agraph_t *g, char *name)\n{\n if (!g || !name)\n return NULL;\n return agfindattr(g, name);\n}",
98
- "\n if (!g || !name)\n return NULL;\n return agfindattr(g, name);\n",
99
- "}"],
100
- ["Agsym_t *findattr(Agnode_t *n, char *name)\n{\n if (!n || !name)\n return NULL;\n return agfindattr(n, name);\n}",
101
- "\n if (!n || !name)\n return NULL;\n return agfindattr(n, name);\n",
102
- "}"],
103
- ["Agsym_t *findattr(Agedge_t *e, char *name)\n{\n if (!e || !name)\n return NULL;\n return agfindattr(e, name);\n}",
104
- "\n if (!e || !name)\n return NULL;\n return agfindattr(e, name);\n",
105
- "}"],
106
- ["Agnode_t *headof(Agedge_t *e)\n{\n if (!e)\n return NULL;\n if (AGTYPE(e) == AGRAPH)\n\treturn NULL;\n return aghead(e);\n}",
107
- "\n if (!e)\n return NULL;\n if (AGTYPE(e) == AGRAPH)\n\treturn NULL;\n return aghead(e);\n",
108
- "}"],
109
- ["Agnode_t *tailof(Agedge_t *e)\n{\n if (!e)\n return NULL;\n if (AGTYPE(e) == AGRAPH)\n\treturn NULL;\n return agtail(e);\n}",
110
- "\n if (!e)\n return NULL;\n if (AGTYPE(e) == AGRAPH)\n\treturn NULL;\n return agtail(e);\n",
111
- "}"],
112
- ["Agraph_t *graphof(Agraph_t *g)\n{\n if (!g || g == g->root)\n return NULL;\n return agroot(g);\n}",
113
- "\n if (!g || g == g->root)\n return NULL;\n return agroot(g);\n",
114
- "}"],
115
- ["Agraph_t *graphof(Agedge_t *e)\n{\n if (!e)\n return NULL;\n if (AGTYPE(e) == AGRAPH)\n\treturn (Agraph_t*)e; /* graph of protoedge is itself recast */\n return agraphof(agtail(e));\n}",
116
- "\n if (!e)\n return NULL;\n if (AGTYPE(e) == AGRAPH)\n\treturn (Agraph_t*)e; /* graph of protoedge is itself recast */\n return agraphof(agtail(e));\n",
117
- "}"],
118
- ["Agraph_t *graphof(Agnode_t *n)\n{\n if (!n)\n return NULL;\n if (AGTYPE(n) == AGRAPH)\n\treturn (Agraph_t*)n; /* graph of protonode is itself recast */\n return agraphof(n);\n}",
119
- "\n if (!n)\n return NULL;\n if (AGTYPE(n) == AGRAPH)\n\treturn (Agraph_t*)n; /* graph of protonode is itself recast */\n return agraphof(n);\n",
120
- "}"],
121
- ["Agraph_t *rootof(Agraph_t *g)\n{\n if (!g)\n return NULL;\n return agroot(g);\n}",
122
- "\n if (!g)\n return NULL;\n return agroot(g);\n",
123
- "}"],
124
- ["Agnode_t *protonode(Agraph_t *g)\n{\n if (!g)\n return NULL;\n return (Agnode_t *)g; // gross abuse of the type system!\n}",
125
- "\n if (!g)\n return NULL;\n return (Agnode_t *)g; // gross abuse of the type system!\n",
126
- "}"],
127
- ["Agedge_t *protoedge(Agraph_t *g)\n{\n if (!g)\n return NULL;\n return (Agedge_t *)g; // gross abuse of the type system!\n}",
128
- "\n if (!g)\n return NULL;\n return (Agedge_t *)g; // gross abuse of the type system!\n",
129
- "}"],
130
- ["char *nameof(Agraph_t *g)\n{\n if (!g)\n return NULL;\n return agnameof(g);\n}",
131
- "\n if (!g)\n return NULL;\n return agnameof(g);\n",
132
- "}"],
133
- ["char *nameof(Agnode_t *n)\n{\n if (!n)\n return NULL;\n if (AGTYPE(n) == AGRAPH)\n\treturn NULL;\n return agnameof(n);\n}",
134
- "\n if (!n)\n return NULL;\n if (AGTYPE(n) == AGRAPH)\n\treturn NULL;\n return agnameof(n);\n",
135
- "}"],
136
- ["char *nameof(Agsym_t *a)\n{\n if (!a)\n return NULL;\n return a->name;\n}",
137
- "\n if (!a)\n return NULL;\n return a->name;\n",
138
- "}"],
139
- ["bool ok(Agraph_t *g)\n{\n if (!g) \n return false;\n return true;\n}",
140
- "\n if (!g) \n return false;\n return true;\n",
141
- "}"],
142
- ["bool ok(Agnode_t *n)\n{\n if (!n) \n return false;\n return true;\n}",
143
- "\n if (!n) \n return false;\n return true;\n",
144
- "}"],
145
- ["bool ok(Agedge_t *e)\n{\n if (!e) \n return false;\n return true;\n}",
146
- "\n if (!e) \n return false;\n return true;\n",
147
- "}"],
148
- ["bool ok(Agsym_t *a)\n{\n if (!a) \n return false;\n return true;\n}",
149
- "\n if (!a) \n return false;\n return true;\n",
150
- "}"],
151
- ["Agraph_t *firstsubg(Agraph_t *g)\n{\n if (!g)\n return NULL;\n return agfstsubg(g);\n}",
152
- "\n if (!g)\n return NULL;\n return agfstsubg(g);\n",
153
- "}"],
154
- ["Agraph_t *nextsubg(Agraph_t *g, Agraph_t *sg)\n{\n\n if (!g || !sg)\n return NULL;\n return agnxtsubg(sg);\n}",
155
- "\n\n if (!g || !sg)\n return NULL;\n return agnxtsubg(sg);\n",
156
- "}"],
157
- ["Agraph_t *firstsupg(Agraph_t *g)\n{\n return g->parent;\n}", "\n return g->parent;\n", "}"],
158
- ["Agraph_t *nextsupg(Agraph_t *g, Agraph_t *sg)\n{\n return NULL;\n}",
159
- "\n return NULL;\n",
160
- "}"],
161
- ["Agedge_t *firstout(Agraph_t *g)\n{\n Agnode_t *n;\n Agedge_t *e;\n\n if (!g)\n return NULL;\n for (n = agfstnode(g); n; n = agnxtnode(g, n)) {\n\te = agfstout(g, n);\n\tif (e) return e;\n }\n return NULL;\n}",
162
- "\n Agnode_t *n;\n Agedge_t *e;\n\n if (!g)\n return NULL;\n for (n = agfstnode(g); n; n = agnxtnode(g, n)) {\n\te = agfstout(g, n);\n\tif (e) return e;\n }\n return NULL;\n",
163
- "}"],
164
- ["Agedge_t *nextout(Agraph_t *g, Agedge_t *e)\n{\n Agnode_t *n;\n Agedge_t *ne;\n\n if (!g || !e)\n return NULL;\n ne = agnxtout(g, e);\n if (ne)\n return (ne);\n for (n = agnxtnode(g, agtail(e)); n; n = agnxtnode(g, n)) {\n\tne = agfstout(g, n);\n\tif (ne) return ne;\n }\n return NULL;\n}",
165
- "\n Agnode_t *n;\n Agedge_t *ne;\n\n if (!g || !e)\n return NULL;\n ne = agnxtout(g, e);\n if (ne)\n return (ne);\n for (n = agnxtnode(g, agtail(e)); n; n = agnxtnode(g, n)) {\n\tne = agfstout(g, n);\n\tif (ne) return ne;\n }\n return NULL;\n",
166
- "}"],
167
- ["Agedge_t *firstedge(Agraph_t *g)\n{\n return firstout(g);\n} \n\nAgedge_t *nextedge(Agraph_t *g, Agedge_t *e)\n{\n return nextout(g, e);\n} \n\nAgedge_t *firstout(Agnode_t *n)\n{\n if (!n)\n return NULL;\n return agfstout(agraphof(n), n);\n}",
168
- "\n return firstout(g);\n} \n\nAgedge_t *nextedge(Agraph_t *g, Agedge_t *e)\n{\n return nextout(g, e);\n} \n\nAgedge_t *firstout(Agnode_t *n)\n{\n if (!n)\n return NULL;\n return agfstout(agraphof(n), n);\n",
169
- "}"],
170
- ["Agedge_t *nextout(Agnode_t *n, Agedge_t *e)\n{\n if (!n || !e)\n return NULL;\n return agnxtout(agraphof(n), e);\n}",
171
- "\n if (!n || !e)\n return NULL;\n return agnxtout(agraphof(n), e);\n",
172
- "}"],
173
- ["Agnode_t *firsthead(Agnode_t *n)\n{\n Agedge_t *e;\n\n if (!n)\n return NULL;\n e = agfstout(agraphof(n), n);\n if (!e)\n return NULL;\n return aghead(e);\n}",
174
- "\n Agedge_t *e;\n\n if (!n)\n return NULL;\n e = agfstout(agraphof(n), n);\n if (!e)\n return NULL;\n return aghead(e);\n",
175
- "}"],
176
- ["Agnode_t *nexthead(Agnode_t *n, Agnode_t *h)\n{\n Agedge_t *e;\n Agraph_t *g;\n\n if (!n || !h)\n return NULL;\n g = agraphof(n);\n e = agfindedge(g, n, h);\n if (!e)\n return NULL;\n do {\n e = agnxtout(g, AGMKOUT(e));\n if (!e)\n return NULL;\n } while (aghead(e) == h);\n return aghead(e);\n}",
177
- "\n Agedge_t *e;\n Agraph_t *g;\n\n if (!n || !h)\n return NULL;\n g = agraphof(n);\n e = agfindedge(g, n, h);\n if (!e)\n return NULL;\n do {\n e = agnxtout(g, AGMKOUT(e));\n if (!e)\n return NULL;\n } while (aghead(e) == h);\n return aghead(e);\n",
178
- "}"],
179
- ["Agedge_t *firstedge(Agnode_t *n)\n{\n if (!n)\n return NULL;\n return agfstedge(agraphof(n), n);\n} \n\nAgedge_t *nextedge(Agnode_t *n, Agedge_t *e)\n{\n if (!n || !e)\n return NULL;\n return agnxtedge(agraphof(n), e, n); \n} \n\nAgedge_t *firstin(Agraph_t *g)\n{\n Agnode_t *n;\n\n if (!g)\n return NULL;\n n = agfstnode(g);\n if (!n)\n return NULL;\n return agfstin(g, n);\n}",
180
- "\n if (!n)\n return NULL;\n return agfstedge(agraphof(n), n);\n} \n\nAgedge_t *nextedge(Agnode_t *n, Agedge_t *e)\n{\n if (!n || !e)\n return NULL;\n return agnxtedge(agraphof(n), e, n); \n} \n\nAgedge_t *firstin(Agraph_t *g)\n{\n Agnode_t *n;\n\n if (!g)\n return NULL;\n n = agfstnode(g);\n if (!n)\n return NULL;\n return agfstin(g, n);\n",
181
- "}"],
182
- ["Agedge_t *nextin(Agraph_t *g, Agedge_t *e)\n{\n Agnode_t *n;\n Agedge_t *ne;\n\n if (!g || !e)\n return NULL;\n ne = agnxtin(g, e);\n if (ne)\n return (ne);\n n = agnxtnode(g, aghead(e));\n if (!n)\n return NULL;\n return agfstin(g, n);\n}",
183
- "\n Agnode_t *n;\n Agedge_t *ne;\n\n if (!g || !e)\n return NULL;\n ne = agnxtin(g, e);\n if (ne)\n return (ne);\n n = agnxtnode(g, aghead(e));\n if (!n)\n return NULL;\n return agfstin(g, n);\n",
184
- "}"],
185
- ["Agedge_t *firstin(Agnode_t *n)\n{\n if (!n)\n return NULL;\n return agfstin(agraphof(n), n);\n}",
186
- "\n if (!n)\n return NULL;\n return agfstin(agraphof(n), n);\n",
187
- "}"],
188
- ["Agedge_t *nextin(Agnode_t *n, Agedge_t *e)\n{\n if (!n || !e)\n return NULL;\n return agnxtin(agraphof(n), e);\n}",
189
- "\n if (!n || !e)\n return NULL;\n return agnxtin(agraphof(n), e);\n",
190
- "}"],
191
- ["Agnode_t *firsttail(Agnode_t *n)\n{\n Agedge_t *e;\n\n if (!n)\n return NULL;\n e = agfstin(agraphof(n), n);\n if (!e)\n return NULL;\n return agtail(e);\n}",
192
- "\n Agedge_t *e;\n\n if (!n)\n return NULL;\n e = agfstin(agraphof(n), n);\n if (!e)\n return NULL;\n return agtail(e);\n",
193
- "}"],
194
- ["Agnode_t *nexttail(Agnode_t *n, Agnode_t *t)\n{\n Agedge_t *e;\n Agraph_t *g;\n\n if (!n || !t)\n return NULL;\n g = agraphof(n);\n e = agfindedge(g, t, n);\n if (!e)\n return NULL;\n do {\n e = agnxtin(g, AGMKIN(e));\n if (!e)\n return NULL;\n } while (agtail(e) == t);\n return agtail(e);\n}",
195
- "\n Agedge_t *e;\n Agraph_t *g;\n\n if (!n || !t)\n return NULL;\n g = agraphof(n);\n e = agfindedge(g, t, n);\n if (!e)\n return NULL;\n do {\n e = agnxtin(g, AGMKIN(e));\n if (!e)\n return NULL;\n } while (agtail(e) == t);\n return agtail(e);\n",
196
- "}"],
197
- ["Agnode_t *firstnode(Agraph_t *g)\n{\n if (!g)\n return NULL;\n return agfstnode(g);\n}",
198
- "\n if (!g)\n return NULL;\n return agfstnode(g);\n",
199
- "}"],
200
- ["Agnode_t *nextnode(Agraph_t *g, Agnode_t *n)\n{\n if (!g || !n)\n return NULL;\n return agnxtnode(g, n);\n}",
201
- "\n if (!g || !n)\n return NULL;\n return agnxtnode(g, n);\n",
202
- "}"],
203
- ["Agnode_t *firstnode(Agedge_t *e)\n{\n if (!e)\n return NULL;\n return agtail(e);\n}",
204
- "\n if (!e)\n return NULL;\n return agtail(e);\n",
205
- "}"],
206
- ["Agnode_t *nextnode(Agedge_t *e, Agnode_t *n)\n{\n if (!e || n != agtail(e))\n return NULL;\n return aghead(e);\n}",
207
- "\n if (!e || n != agtail(e))\n return NULL;\n return aghead(e);\n",
208
- "}"],
209
- ["Agsym_t *firstattr(Agraph_t *g)\n{\n if (!g)\n return NULL;\n g = agroot(g);\n return agnxtattr(g,AGRAPH,NULL);\n}",
210
- "\n if (!g)\n return NULL;\n g = agroot(g);\n return agnxtattr(g,AGRAPH,NULL);\n",
211
- "}"],
212
- ["Agsym_t *nextattr(Agraph_t *g, Agsym_t *a)\n{\n if (!g || !a)\n return NULL;\n g = agroot(g);\n return agnxtattr(g,AGRAPH,a);\n}",
213
- "\n if (!g || !a)\n return NULL;\n g = agroot(g);\n return agnxtattr(g,AGRAPH,a);\n",
214
- "}"],
215
- ["Agsym_t *firstattr(Agnode_t *n)\n{\n Agraph_t *g;\n\n if (!n)\n return NULL;\n g = agraphof(n);\n return agnxtattr(g,AGNODE,NULL);\n}",
216
- "\n Agraph_t *g;\n\n if (!n)\n return NULL;\n g = agraphof(n);\n return agnxtattr(g,AGNODE,NULL);\n",
217
- "}"],
218
- ["Agsym_t *nextattr(Agnode_t *n, Agsym_t *a)\n{\n Agraph_t *g;\n\n if (!n || !a)\n return NULL;\n g = agraphof(n);\n return agnxtattr(g,AGNODE,a);\n}",
219
- "\n Agraph_t *g;\n\n if (!n || !a)\n return NULL;\n g = agraphof(n);\n return agnxtattr(g,AGNODE,a);\n",
220
- "}"],
221
- ["Agsym_t *firstattr(Agedge_t *e)\n{\n Agraph_t *g;\n\n if (!e)\n return NULL;\n g = agraphof(agtail(e));\n return agnxtattr(g,AGEDGE,NULL);\n}",
222
- "\n Agraph_t *g;\n\n if (!e)\n return NULL;\n g = agraphof(agtail(e));\n return agnxtattr(g,AGEDGE,NULL);\n",
223
- "}"],
224
- ["Agsym_t *nextattr(Agedge_t *e, Agsym_t *a)\n{\n Agraph_t *g;\n\n if (!e || !a)\n return NULL;\n g = agraphof(agtail(e));\n return agnxtattr(g,AGEDGE,a);\n}",
225
- "\n Agraph_t *g;\n\n if (!e || !a)\n return NULL;\n g = agraphof(agtail(e));\n return agnxtattr(g,AGEDGE,a);\n",
226
- "}"],
227
- ["bool rm(Agraph_t *g)\n{\n if (!g)\n return false;\n#if 0\n Agraph_t* sg;\n for (sg = agfstsubg (g); sg; sg = agnxtsubg (sg))\n\trm(sg);\n if (g == agroot(g))\n\tagclose(g);\n else\n agdelete(agparent(g), g);\n#endif\n /* The rm function appears to have the semantics of agclose, so\n * we should just do that, and let cgraph take care of all the\n * details.\n */\n agclose(g);\n return true;\n}",
228
- "\n if (!g)\n return false;\n#if 0\n Agraph_t* sg;\n for (sg = agfstsubg (g); sg; sg = agnxtsubg (sg))\n\trm(sg);\n if (g == agroot(g))\n\tagclose(g);\n else\n agdelete(agparent(g), g);\n#endif\n /* The rm function appears to have the semantics of agclose, so\n * we should just do that, and let cgraph take care of all the\n * details.\n */\n agclose(g);\n return true;\n",
229
- "}"],
230
- ["bool rm(Agnode_t *n)\n{\n if (!n)\n return false;\n // removal of the protonode is not permitted\n if (agnameof(n)[0] == '\\001' && strcmp (agnameof(n), \"\\001proto\") ==0)\n return false;\n agdelete(agraphof(n), n);\n return true;\n}",
231
- "\n if (!n)\n return false;\n // removal of the protonode is not permitted\n if (agnameof(n)[0] == '\\001' && strcmp (agnameof(n), \"\\001proto\") ==0)\n return false;\n agdelete(agraphof(n), n);\n return true;\n",
232
- "}"],
233
- ["bool rm(Agedge_t *e)\n{\n if (!e)\n return false;\n // removal of the protoedge is not permitted\n if ((agnameof(aghead(e))[0] == '\\001' && strcmp (agnameof(aghead(e)), \"\\001proto\") == 0)\n || (agnameof(agtail(e))[0] == '\\001' && strcmp (agnameof(agtail(e)), \"\\001proto\") == 0))\n return false;\n agdelete(agroot(agraphof(aghead(e))), e);\n return true;\n}",
234
- "\n if (!e)\n return false;\n // removal of the protoedge is not permitted\n if ((agnameof(aghead(e))[0] == '\\001' && strcmp (agnameof(aghead(e)), \"\\001proto\") == 0)\n || (agnameof(agtail(e))[0] == '\\001' && strcmp (agnameof(agtail(e)), \"\\001proto\") == 0))\n return false;\n agdelete(agroot(agraphof(aghead(e))), e);\n return true;\n",
235
- "}"],
236
- ["bool layout(Agraph_t *g, const char *engine)\n{\n int err;\n\n if (!g)\n return false;\n err = gvFreeLayout(gvc, g); /* ignore errors */\n err = gvLayout(gvc, g, engine);\n return (! err);\n}",
237
- "\n int err;\n\n if (!g)\n return false;\n err = gvFreeLayout(gvc, g); /* ignore errors */\n err = gvLayout(gvc, g, engine);\n return (! err);\n",
238
- "}"],
239
- ["bool render(Agraph_t *g)\n{\n if (!g)\n return false;\n attach_attrs(g);\n return true;\n}",
240
- "\n if (!g)\n return false;\n attach_attrs(g);\n return true;\n",
241
- "}"],
242
- ["bool render(Agraph_t *g, const char *format)\n{\n int err;\n\n if (!g)\n return false;\n err = gvRender(gvc, g, format, stdout);\n return (! err);\n}",
243
- "\n int err;\n\n if (!g)\n return false;\n err = gvRender(gvc, g, format, stdout);\n return (! err);\n",
244
- "}"],
245
- ["bool render(Agraph_t *g, const char *format, FILE *f)\n{\n int err;\n\n if (!g)\n return false;\n err = gvRender(gvc, g, format, f);\n return (! err);\n}",
246
- "\n int err;\n\n if (!g)\n return false;\n err = gvRender(gvc, g, format, f);\n return (! err);\n",
247
- "}"],
248
- ["bool renderchannel(Agraph_t *g, const char *format, const char *channelname)\n{\n int err;\n\n if (!g)\n return false;\n gv_channel_writer_init(gvc);\n err = gvRender(gvc, g, format, (FILE*)channelname);\n gv_writer_reset (gvc); /* Reset to default */\n return (! err);\n}",
249
- "\n int err;\n\n if (!g)\n return false;\n gv_channel_writer_init(gvc);\n err = gvRender(gvc, g, format, (FILE*)channelname);\n gv_writer_reset (gvc); /* Reset to default */\n return (! err);\n",
250
- "}"],
251
- ["bool render(Agraph_t *g, const char *format, const char *filename)\n{\n int err;\n\n if (!g)\n return false;\n err = gvRenderFilename(gvc, g, format, filename);\n return (! err);\n}",
252
- "\n int err;\n\n if (!g)\n return false;\n err = gvRenderFilename(gvc, g, format, filename);\n return (! err);\n",
253
- "}"],
254
- ["char* renderresult(Agraph_t *g, const char *format)\n{\n BA ba;\n\n if (!g)\n return NULL;\n if (!GD_alg(g))\n return NULL;\n ba.sz = BUFSIZ;\n ba.data = (char*)malloc(ba.sz*sizeof(char)); /* must be freed by wrapper code */\n ba.len = 0;\n gv_string_writer_init(gvc);\n (void)gvRender(gvc, g, format, (FILE*)&ba);\n gv_writer_reset (gvc); /* Reset to default */\n *((int*)GD_alg(g)) = ba.len;\n return ba.data;\n}",
255
- "\n BA ba;\n\n if (!g)\n return NULL;\n if (!GD_alg(g))\n return NULL;\n ba.sz = BUFSIZ;\n ba.data = (char*)malloc(ba.sz*sizeof(char)); /* must be freed by wrapper code */\n ba.len = 0;\n gv_string_writer_init(gvc);\n (void)gvRender(gvc, g, format, (FILE*)&ba);\n gv_writer_reset (gvc); /* Reset to default */\n *((int*)GD_alg(g)) = ba.len;\n return ba.data;\n",
256
- "}"],
257
- ["void renderresult(Agraph_t *g, const char *format, char *outdata)\n{\n if (!g)\n return;\n gv_string_writer_init(gvc);\n (void)gvRender(gvc, g, format, (FILE*)outdata);\n gv_writer_reset (gvc); /* Reset to default */\n}",
258
- "\n if (!g)\n return;\n gv_string_writer_init(gvc);\n (void)gvRender(gvc, g, format, (FILE*)outdata);\n gv_writer_reset (gvc); /* Reset to default */\n",
259
- "}"],
260
- ["char* renderdata(Agraph_t *g, const char *format)\n{\n int err;\n char *data;\n unsigned int length;\n\n if (!g)\n\treturn NULL;\n err = gvRenderData(gvc, g, format, &data, &length);\n if (err)\n\treturn NULL;\n data = (char*)realloc(data, length + 1);\n return data;\n}",
261
- "\n int err;\n char *data;\n unsigned int length;\n\n if (!g)\n\treturn NULL;\n err = gvRenderData(gvc, g, format, &data, &length);\n if (err)\n\treturn NULL;\n data = (char*)realloc(data, length + 1);\n return data;\n",
262
- "}"],
263
- ["bool write(Agraph_t *g, FILE *f)\n{\n int err;\n\n if (!g)\n return false;\n err = agwrite(g, f);\n return (! err);\n}",
264
- "\n int err;\n\n if (!g)\n return false;\n err = agwrite(g, f);\n return (! err);\n",
265
- "}"],
266
- ["bool write(Agraph_t *g, const char *filename)\n{\n FILE *f;\n int err;\n\n if (!g)\n return false;\n f = fopen(filename, \"w\");\n if (!f)\n return false;\n err = agwrite(g, f);\n fclose(f);\n return (! err);\n}",
267
- "\n FILE *f;\n int err;\n\n if (!g)\n return false;\n f = fopen(filename, \"w\");\n if (!f)\n return false;\n err = agwrite(g, f);\n fclose(f);\n return (! err);\n",
268
- "}"],
269
- ["bool tred(Agraph_t *g)\n{\n int err;\n\n if (!g)\n return false;\n err = gvToolTred(g);\n return (! err);\n}",
270
- "\n int err;\n\n if (!g)\n return false;\n err = gvToolTred(g);\n return (! err);\n",
271
- "}"]]