-
Notifications
You must be signed in to change notification settings - Fork 0
/
README.html
630 lines (544 loc) · 153 KB
/
README.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
<!DOCTYPE html><html><head>
<title>README</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css">
<style>
/**
* prism.js Github theme based on GitHub's theme.
* @author Sam Clarke
*/
code[class*="language-"],
pre[class*="language-"] {
color: #333;
background: none;
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.4;
-moz-tab-size: 8;
-o-tab-size: 8;
tab-size: 8;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
/* Code blocks */
pre[class*="language-"] {
padding: .8em;
overflow: auto;
/* border: 1px solid #ddd; */
border-radius: 3px;
/* background: #fff; */
background: #f5f5f5;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
background: #f5f5f5;
}
.token.comment,
.token.blockquote {
color: #969896;
}
.token.cdata {
color: #183691;
}
.token.doctype,
.token.punctuation,
.token.variable,
.token.macro.property {
color: #333;
}
.token.operator,
.token.important,
.token.keyword,
.token.rule,
.token.builtin {
color: #a71d5d;
}
.token.string,
.token.url,
.token.regex,
.token.attr-value {
color: #183691;
}
.token.property,
.token.number,
.token.boolean,
.token.entity,
.token.atrule,
.token.constant,
.token.symbol,
.token.command,
.token.code {
color: #0086b3;
}
.token.tag,
.token.selector,
.token.prolog {
color: #63a35c;
}
.token.function,
.token.namespace,
.token.pseudo-element,
.token.class,
.token.class-name,
.token.pseudo-class,
.token.id,
.token.url-reference .token.variable,
.token.attr-name {
color: #795da3;
}
.token.entity {
cursor: help;
}
.token.title,
.token.title .token.punctuation {
font-weight: bold;
color: #1d3e81;
}
.token.list {
color: #ed6a43;
}
.token.inserted {
background-color: #eaffea;
color: #55a532;
}
.token.deleted {
background-color: #ffecec;
color: #bd2c00;
}
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
/* JSON */
.language-json .token.property {
color: #183691;
}
.language-markup .token.tag .token.punctuation {
color: #333;
}
/* CSS */
code.language-css,
.language-css .token.function {
color: #0086b3;
}
/* YAML */
.language-yaml .token.atrule {
color: #63a35c;
}
code.language-yaml {
color: #183691;
}
/* Ruby */
.language-ruby .token.function {
color: #333;
}
/* Markdown */
.language-markdown .token.url {
color: #795da3;
}
/* Makefile */
.language-makefile .token.symbol {
color: #795da3;
}
.language-makefile .token.variable {
color: #183691;
}
.language-makefile .token.builtin {
color: #0086b3;
}
/* Bash */
.language-bash .token.keyword {
color: #0086b3;
}
/* highlight */
pre[data-line] {
position: relative;
padding: 1em 0 1em 3em;
}
pre[data-line] .line-highlight-wrapper {
position: absolute;
top: 0;
left: 0;
background-color: transparent;
display: block;
width: 100%;
}
pre[data-line] .line-highlight {
position: absolute;
left: 0;
right: 0;
padding: inherit 0;
margin-top: 1em;
background: hsla(24, 20%, 50%,.08);
background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
pointer-events: none;
line-height: inherit;
white-space: pre;
}
pre[data-line] .line-highlight:before,
pre[data-line] .line-highlight[data-end]:after {
content: attr(data-start);
position: absolute;
top: .4em;
left: .6em;
min-width: 1em;
padding: 0 .5em;
background-color: hsla(24, 20%, 50%,.4);
color: hsl(24, 20%, 95%);
font: bold 65%/1.5 sans-serif;
text-align: center;
vertical-align: .3em;
border-radius: 999px;
text-shadow: none;
box-shadow: 0 1px white;
}
pre[data-line] .line-highlight[data-end]:after {
content: attr(data-end);
top: auto;
bottom: .4em;
}html body{font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6;color:#333;background-color:#fff;overflow:initial;box-sizing:border-box;word-wrap:break-word}html body>:first-child{margin-top:0}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{line-height:1.2;margin-top:1em;margin-bottom:16px;color:#000}html body h1{font-size:2.25em;font-weight:300;padding-bottom:.3em}html body h2{font-size:1.75em;font-weight:400;padding-bottom:.3em}html body h3{font-size:1.5em;font-weight:500}html body h4{font-size:1.25em;font-weight:600}html body h5{font-size:1.1em;font-weight:600}html body h6{font-size:1em;font-weight:600}html body h1,html body h2,html body h3,html body h4,html body h5{font-weight:600}html body h5{font-size:1em}html body h6{color:#5c5c5c}html body strong{color:#000}html body del{color:#5c5c5c}html body a:not([href]){color:inherit;text-decoration:none}html body a{color:#08c;text-decoration:none}html body a:hover{color:#00a3f5;text-decoration:none}html body img{max-width:100%}html body>p{margin-top:0;margin-bottom:16px;word-wrap:break-word}html body>ul,html body>ol{margin-bottom:16px}html body ul,html body ol{padding-left:2em}html body ul.no-list,html body ol.no-list{padding:0;list-style-type:none}html body ul ul,html body ul ol,html body ol ol,html body ol ul{margin-top:0;margin-bottom:0}html body li{margin-bottom:0}html body li.task-list-item{list-style:none}html body li>p{margin-top:0;margin-bottom:0}html body .task-list-item-checkbox{margin:0 .2em .25em -1.8em;vertical-align:middle}html body .task-list-item-checkbox:hover{cursor:pointer}html body blockquote{margin:16px 0;font-size:inherit;padding:0 15px;color:#5c5c5c;background-color:#f0f0f0;border-left:4px solid #d6d6d6}html body blockquote>:first-child{margin-top:0}html body blockquote>:last-child{margin-bottom:0}html body hr{height:4px;margin:32px 0;background-color:#d6d6d6;border:0 none}html body table{margin:10px 0 15px 0;border-collapse:collapse;border-spacing:0;display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}html body table th{font-weight:bold;color:#000}html body table td,html body table th{border:1px solid #d6d6d6;padding:6px 13px}html body dl{padding:0}html body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:bold}html body dl dd{padding:0 16px;margin-bottom:16px}html body code{font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:.85em !important;color:#000;background-color:#f0f0f0;border-radius:3px;padding:.2em 0}html body code::before,html body code::after{letter-spacing:-0.2em;content:"\00a0"}html body pre>code{padding:0;margin:0;font-size:.85em !important;word-break:normal;white-space:pre;background:transparent;border:0}html body .highlight{margin-bottom:16px}html body .highlight pre,html body pre{padding:1em;overflow:auto;font-size:.85em !important;line-height:1.45;border:#d6d6d6;border-radius:3px}html body .highlight pre{margin-bottom:0;word-break:normal}html body pre code,html body pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}html body pre code:before,html body pre tt:before,html body pre code:after,html body pre tt:after{content:normal}html body p,html body blockquote,html body ul,html body ol,html body dl,html body pre{margin-top:0;margin-bottom:16px}html body kbd{color:#000;border:1px solid #d6d6d6;border-bottom:2px solid #c7c7c7;padding:2px 4px;background-color:#f0f0f0;border-radius:3px}@media print{html body{background-color:#fff}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{color:#000;page-break-after:avoid}html body blockquote{color:#5c5c5c}html body pre{page-break-inside:avoid}html body table{display:table}html body img{display:block;max-width:100%;max-height:100%}html body pre,html body code{word-wrap:break-word;white-space:pre}}.markdown-preview{width:100%;height:100%;box-sizing:border-box}.markdown-preview .pagebreak,.markdown-preview .newpage{page-break-before:always}.markdown-preview pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}.markdown-preview pre.line-numbers>code{position:relative}.markdown-preview pre.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:1em;font-size:100%;left:0;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.markdown-preview pre.line-numbers .line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.markdown-preview pre.line-numbers .line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}.markdown-preview .mathjax-exps .MathJax_Display{text-align:center !important}.markdown-preview:not([for="preview"]) .code-chunk .btn-group{display:none}.markdown-preview:not([for="preview"]) .code-chunk .status{display:none}.markdown-preview:not([for="preview"]) .code-chunk .output-div{margin-bottom:16px}.scrollbar-style::-webkit-scrollbar{width:8px}.scrollbar-style::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}.scrollbar-style::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,0.66);border:4px solid rgba(150,150,150,0.66);background-clip:content-box}html body[for="html-export"]:not([data-presentation-mode]){position:relative;width:100%;height:100%;top:0;left:0;margin:0;padding:0;overflow:auto}html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{position:relative;top:0}@media screen and (min-width:914px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{padding:2em calc(50% - 457px + 2em)}}@media screen and (max-width:914px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{font-size:14px !important;padding:1em}}@media print{html body[for="html-export"]:not([data-presentation-mode]) #sidebar-toc-btn{display:none}}html body[for="html-export"]:not([data-presentation-mode]) #sidebar-toc-btn{position:fixed;bottom:8px;left:8px;font-size:28px;cursor:pointer;color:inherit;z-index:99;width:32px;text-align:center;opacity:.4}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] #sidebar-toc-btn{opacity:1}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc{position:fixed;top:0;left:0;width:300px;height:100%;padding:32px 0 48px 0;font-size:14px;box-shadow:0 0 4px rgba(150,150,150,0.33);box-sizing:border-box;overflow:auto;background-color:inherit}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar{width:8px}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,0.66);border:4px solid rgba(150,150,150,0.66);background-clip:content-box}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc a{text-decoration:none}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc ul{padding:0 1.6em;margin-top:.8em}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc li{margin-bottom:.8em}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc ul{list-style-type:none}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{left:300px;width:calc(100% - 300px);padding:2em calc(50% - 457px - 150px);margin:0;box-sizing:border-box}@media screen and (max-width:1274px){html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{width:100%}}html body[for="html-export"]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .markdown-preview{left:50%;transform:translateX(-50%)}html body[for="html-export"]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .md-sidebar-toc{display:none}
/* Please visit the URL below for more information: */
/* https://shd101wyy.github.io/markdown-preview-enhanced/#/customize-css */
</style>
</head>
<body for="html-export">
<div class="mume markdown-preview ">
<h1 class="mume-header" id="apache-beam-native-experiment">Apache Beam native experiment</h1>
<p>This is an experiment to run a Beam pipeline <em>locally</em> as GraalVM native image.
Goal of the experiment is to see if it is possible to run the Beam <code>MinimalWordCount</code> example as native executable
locally and evaluate if it is a feasible approach to quickly process smaller datasets in Cloud environments in terms of
performance and resource consumption. Our expectation is too see much lower memory usage for native images, as well as
faster startup times.</p>
<p>For this experiment we are targeting Beam’s <code>DirectRunner</code> lacking any suitable alternative local runner.
The primary focus of <code>DirectRunner</code> is to test pipelines and their components for correctness, rather than performance.
So we’ll have to interpret results in that context.</p>
<p>While both the <code>SparkRunner</code> and <code>FlinkRunner</code> support a local, non-clustered mode, getting these frameworks to work on
native images is significantly more involved and out of scope for this initial investigation. Though, we’re planning to
look into these in a follow up.</p>
<h2 class="mume-header" id="challenges">Challenges</h2>
<p>Java frameworks such as Apache Beam often make heavy use of reflection. Obviously that plays badly with ahead-of-time
compilation used to build native images. Another troublesome feature in this context is runtime code generation as
possible on the JVM. Both of these have to be dealt with to run Apache Beam as native image.</p>
<p>To offer simpler and more flexible ways of writing pipelines for users, Beam is relying heavily on <strong>runtime code
generation</strong> using <code>ByteBuddy</code>. Compared to an alternative reflection based approach, such generated code will
generally provide superior performance.
Despite runtime code generation being used for various features in Beam, there’s just one usage we absolutely have to
address here: Beam dynamically generates an invoker class for every <code>DoFn</code>, whether provided by the user or the Beam
SDK itself. This is even the case for rather primitive <code>DoFns</code> to map, flapMap or filter data.
Beam schemas are also heavily based on runtime code generation to support efficient getters and setters for rows.
Schemas are a necessary foundation for Beam SQL. Both are considered out of scope for this experiment.</p>
<p>When generating code at runtime, <strong>reflection</strong> is typically used to gather the necessary metadata. While runtime code
generation is tackled with the point above, in Beam part of the metadata is kept as <code>DoFnSignature</code> and used at
runtime. Another, less obvious, usage of reflection is Beam’s configuration mechanism, <code>PipelineOptions</code>. These
are implemented using dynamic proxies and there’s a huge number of possible interfaces / combinations.</p>
<h2 class="mume-header" id="environment-setup">Environment setup</h2>
<p>To follow along, make sure you have a GraalVM installed locally. Additionally, you have to install the
<a href="https://graalvm.github.io/native-build-tools/latest/gradle-plugin.html#_installing_graalvm_native_image_tool">native-image tool</a>
.</p>
<pre data-role="codeBlock" data-info="bash" class="language-bash"><span class="token comment"># install GraalVM using SDKman!</span>
sdk <span class="token function">install</span> java <span class="token number">22.3</span>.r11-grl
sdk default java <span class="token number">22.3</span>.r11-grl
<span class="token comment"># install native-image tool</span>
gu <span class="token function">install</span> native-image
</pre><h2 class="mume-header" id="preparing-the-native-image">Preparing the native image</h2>
<h3 class="mume-header" id="generate-native-image-configuration">Generate native image configuration</h3>
<p>At first, we generate the native-image configuration from an instrumented run with the GraalVM agent. Before your first
run, you will have to download the sample data
using <a href="https://cloud.google.com/storage/docs/gsutil_install#install">gsutil</a>.</p>
<p>The agent generates configuration files that record usage of reflection, dynamic proxies and, if enabled, even supports
extracting dynamic classes generated at runtime (more on this <a href="#graal-agent-class-define-support">later</a>).</p>
<pre data-role="codeBlock" data-info="bash" class="language-bash">gsutil <span class="token function">cp</span> gs://apache-beam-samples/shakespeare/kinglear.txt /tmp/data/kinglear.txt
gradle -Pagent run
gradle metadataCopy --task run --dir src/graal/resources/META-INF/native-image
</pre><p>Unfortunately, as we’ll soon notice, this configuration is not sufficient yet to build an image that can be run
successfully.</p>
<h4 class="mume-header" id="randomized-behavior-in-directrunner">Randomized behavior in DirectRunner</h4>
<p>First, to prevent any potential traps with randomized behavior in <code>DirectRunner</code>, we simply patch respective code for
the purpose of this investigation. This way we don’t risk comparing apples and oranges when later evaluating our
results.</p>
<p>Random generators can prove tricky in native images. If initialized at build time, results won’t be random anymore.
Instead, each run will produce the very same sequence of numbers as the seed value was already created at build time.
Luckily, recent versions of GraalVM catch this at build time and fail compilation.</p>
<p><a href="https://github.com/mosche/beam/tree/beam-native-image">beam-native-image</a> contains the necessary patches for direct
runner. To keep following, pull that branch and build a local Snapshot version of the direct runner.</p>
<pre data-role="codeBlock" data-info="bash" class="language-bash">gradle -Ppublishing -PdistMgmtSnapshotsUrl<span class="token operator">=~</span>/.m2/repository/ -p runners/direct-java publishToMavenLocal -PenableCheckerFramework<span class="token operator">=</span>false
</pre><p>Last, but not least, target parallelism of direct runner is set to 4 in the <code>MinimalWordCount</code> application itself.</p>
<h3 class="mume-header" id="fix-usage-of-dynamic-proxies-with-pipelineoptions">Fix usage of dynamic proxies with PipelineOptions</h3>
<p>If attempting to run a native image compiled using the generated configuration, we’ll immediately notice that the agent
did not capture all required combinations of interfaces used for <code>PipelineOptions</code>, and order matters.</p>
<p>Unfortunately the number of interfaces is far to large to naively generate all possible permutations.
Instead we have to make sure we create dynamic proxies from a stable, deterministic order of interfaces.</p>
<p>This requires a small change to Beam’s <code>PipelineOptionsFactory</code> to sort the interfaces before dynamic proxies are
created:</p>
<pre data-role="codeBlock" data-info="java" class="language-java"><span class="token class-name">Arrays</span><span class="token punctuation">.</span><span class="token function">sort</span><span class="token punctuation">(</span>interfaces<span class="token punctuation">,</span> <span class="token keyword keyword-new">new</span> <span class="token class-name">Comparator</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Class</span><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">></span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span> <span class="token keyword keyword-public">public</span> <span class="token keyword keyword-int">int</span> <span class="token function">compare</span><span class="token punctuation">(</span><span class="token class-name">Class</span><span class="token generics"><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">></span></span> c1<span class="token punctuation">,</span> <span class="token class-name">Class</span><span class="token generics"><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">></span></span> c2<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword keyword-return">return</span> c1<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">compareTo</span><span class="token punctuation">(</span>c2<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Class</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">T</span><span class="token punctuation">></span></span> allProxyClass <span class="token operator">=</span> <span class="token class-name">Proxy</span><span class="token punctuation">.</span><span class="token function">getProxyClass</span><span class="token punctuation">(</span><span class="token class-name">ReflectHelpers</span><span class="token punctuation">.</span><span class="token function">findClassLoader</span><span class="token punctuation">(</span>interfaces<span class="token punctuation">)</span><span class="token punctuation">,</span> interfaces<span class="token punctuation">)</span><span class="token punctuation">;</span>
</pre><p>The above mentioned branch <a href="https://github.com/mosche/beam/tree/beam-native-image">beam-native-image</a> contains this fix
as well. This time we have to publish a Snapshot for Beam’s core locally.</p>
<pre data-role="codeBlock" data-info="bash" class="language-bash">gradle -Ppublishing -PdistMgmtSnapshotsUrl<span class="token operator">=~</span>/.m2/repository/ -p sdks/java/core publishToMavenLocal -PenableCheckerFramework<span class="token operator">=</span>false
</pre><p>Once done, make sure to <a href="#generate-native-image-configuration">re-generate the image configuration</a> so changes are
reflected in <code>proxy-config.json</code>.</p>
<h3 class="mume-header" id="generate-dynamic-dofn-invokers-at-build-time">Generate dynamic DoFn invokers at build time</h3>
<p>Next, we want to support the generated <code>DoFnInvoker</code> classes in the native image. Luckily, these classes have a stable
deterministic name, making this task a lot easier.</p>
<h4 class="mume-header" id="graal-agent-class-define-support">Graal agent class define support</h4>
<p>Unfortunately, it is not possible to simply use the
agent’s <a href="https://www.graalvm.org/22.1/reference-manual/native-image/ExperimentalAgentOptions/#support-for-predefined-classes">class define support</a> (
enabled using <code>experimental-class-define-support</code>) to extract the generated <code>DoFnInvoker</code> classes automatically during
an instrumented pipeline run and inject them into the native image.</p>
<p>Beam has to load DoFn invokers using the system classloader as well to gain (package) private access. If
loaded from a different classloader, packages would not be considered the same despite having matching names.
Unfortunately, the agent skips all classes loaded using the system classloader and hence doesn’t extract the generated
invokers. See <a href="https://github.com/oracle/graal/issues/4248">this issue</a> for more details.</p>
<p>Lacking an out of the box solution, we’ll have to tackle this manually.</p>
<h4 class="mume-header" id="index-classpath-with-jandex">Index classpath with jandex</h4>
<p>First, we’ll need to find all <code>DoFns</code> that require an invoker. We can
use <a href="https://smallrye.io/jandex/jandex/3.0.5/index.html"><code>jandex</code></a> to index relevant parts of
the classpath and easily query for all <code>DoFn</code> implementations. This avoids having to load the entire classpath compared
to using a reflection based approach.</p>
<p>To index parts of the classpath, our <code>build.gradle</code> defines an intransitive configuration <code>jandexOnly</code>. Classes of jars
of this configuration, excluding their transitive dependencies, are indexed in addition to the project’s sources. In our
case we’re indexing Beam <code>core</code> and <code>direct-java</code>.</p>
<pre data-role="codeBlock" data-info="groovy" class="language-groovy">jandexMain <span class="token punctuation">{</span>
inputFiles<span class="token punctuation">.</span><span class="token function">from</span><span class="token punctuation">(</span>
configurations<span class="token punctuation">.</span>jandexOnly
<span class="token punctuation">.</span>filter <span class="token punctuation">{</span> it<span class="token punctuation">.</span>name<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.jar'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span>
<span class="token punctuation">.</span>collect <span class="token punctuation">{</span> <span class="token function">zipTree</span><span class="token punctuation">(</span>it<span class="token punctuation">)</span><span class="token punctuation">.</span>filter <span class="token punctuation">{</span> it<span class="token punctuation">.</span>name<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.class'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</pre><h4 class="mume-header" id="generate-invokers-using-native-build-feature-iteration-1">Generate invokers using native build feature (Iteration 1)</h4>
<p>Next, we implement a native <a href="https://build-native-java-apps.cc/developer-guide/feature/">build feature</a> that intercepts
image generation to generate <code>DoFn</code> invoker classes before actually analyzing what must be included in the native
image in the following build stage.</p>
<p>The additional <code>graal</code> source set defined for this experiment contains code that is executed during native image
generation. <code>PredefinedDoFnInvokerFeature</code> generates the invoker classes for all <code>DoFn</code> subclasses using ByteBuddy by
means of the <code>generateInvokerClass</code> utility in Beam. Note however, this required
a <a href="https://github.com/mosche/beam/tree/beam-native-image">tiny patch</a> to <code>ByteBuddyDoFnInvokerFactory</code> to open up
visibility of <code>generateInvokerClass</code> so we can access the utility. That patch is already included in the snapshot of
Beam’s <code>core</code> we’ve build above.</p>
<p>Despite invoker classes and respective constructors already being listed in <code>reflect-config.json</code> after
the <a href="#generate-native-image-configuration">agent run</a>, we have to re-register the generated classes in the feature.
Previously, when processing <code>reflect-config.json</code>, the generated invoker classes were skipped as they simply didn’t
exist yet.</p>
<pre data-role="codeBlock" data-info="java" class="language-java"><span class="token class-name">Index</span> index <span class="token operator">=</span> <span class="token keyword keyword-new">new</span> <span class="token class-name">IndexReader</span><span class="token punctuation">(</span><span class="token keyword keyword-new">new</span> <span class="token class-name">FileInputStream</span><span class="token punctuation">(</span>jandex<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword keyword-for">for</span> <span class="token punctuation">(</span><span class="token class-name">ClassInfo</span> delegate <span class="token operator">:</span> index<span class="token punctuation">.</span><span class="token function">getAllKnownSubclasses</span><span class="token punctuation">(</span><span class="token class-name">DoFn</span><span class="token punctuation">.</span><span class="token keyword keyword-class">class</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">Class</span><span class="token generics"><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">></span></span> clazz <span class="token operator">=</span> <span class="token class-name">Class</span><span class="token punctuation">.</span><span class="token function">forName</span><span class="token punctuation">(</span>delegate<span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token function">contextLoader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">DoFnSignature</span> signature <span class="token operator">=</span> <span class="token class-name">DoFnSignatures</span><span class="token punctuation">.</span><span class="token function">getSignature</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token class-name">Class</span><span class="token punctuation">)</span> clazz<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Dynamically generate invoker class using ByteBuddy / Beam.</span>
<span class="token class-name">Class</span><span class="token generics"><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">></span></span> invokerClass <span class="token operator">=</span> <span class="token function">generateInvokerClass</span><span class="token punctuation">(</span>signature<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Register the invoker class and constructor for inclusion in the image.</span>
<span class="token class-name">RuntimeReflection</span><span class="token punctuation">.</span><span class="token function">register</span><span class="token punctuation">(</span>invokerClass<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">RuntimeReflection</span><span class="token punctuation">.</span><span class="token function">register</span><span class="token punctuation">(</span>invokerClass<span class="token punctuation">.</span><span class="token function">getConstructor</span><span class="token punctuation">(</span>clazz<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</pre><p>Last, to be picked up, we have to register the feature as build argument in the
Gradle <a href="https://graalvm.github.io/native-build-tools/latest/gradle-plugin.html#_introduction">native</a> plugin.</p>
<pre data-role="codeBlock" data-info="groovy" class="language-groovy">graalvmNative <span class="token punctuation">{</span>
binaries <span class="token punctuation">{</span>
main <span class="token punctuation">{</span>
buildArgs <span class="token string">'--features=beam.dofns.PredefinedDoFnInvokerFeature'</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</pre><h4 class="mume-header" id="generate-invokers-using-native-build-feature-iteration-2">Generate invokers using native build feature (Iteration 2)</h4>
<p>Reflecting upon the previous attempt, we’ve generated all possible <code>DoFn</code> signatures and invokers available on the
classpath despite being used or not. And as we’re registering all of these for runtime reflecting, everything will
be included in the native image.</p>
<p>Luckily we can simplify the build process, so we don’t even have to index the classpath anymore. Instead of
identifying <code>DoFn</code> invokers using jandex, we can extract the ones used at runtime from the agent
generated <code>reflect-config.json</code>.</p>
<p>And if doing so early enough in the native build before <code>reflect-config.json</code> is actually processed, we can even remove
some entries that won’t be used at runtime anymore because we’ve done the necessary work during the build already.</p>
<h3 class="mume-header" id="load-pre-built-invokers">Load pre-built invokers</h3>
<p>Having all invokers already pre-built into the image, we obviously don’t want to invoke <code>ByteBuddy</code> anymore when
later calling <code>generateInvokerClass</code> at runtime. We
therefore <a href="https://build-native-java-apps.cc/developer-guide/substitution/">substitute</a> respective bytecode during
compilation to just load the right invoker by name:</p>
<pre data-role="codeBlock" data-info="java" class="language-java"><span class="token annotation punctuation">@TargetClass</span><span class="token punctuation">(</span><span class="token class-name">ByteBuddyDoFnInvokerFactory</span><span class="token punctuation">.</span><span class="token keyword keyword-class">class</span><span class="token punctuation">)</span>
<span class="token keyword keyword-public">public</span> <span class="token keyword keyword-final">final</span> <span class="token keyword keyword-class">class</span> <span class="token class-name">SubstituteByteBuddyDoFnInvokerFactory</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Substitute</span>
<span class="token keyword keyword-private">private</span> <span class="token keyword keyword-static">static</span> <span class="token class-name">Class</span><span class="token generics"><span class="token punctuation"><</span><span class="token operator">?</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">DoFnInvoker</span><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">,</span> <span class="token operator">?</span><span class="token punctuation">></span><span class="token punctuation">></span></span> <span class="token function">generateInvokerClass</span><span class="token punctuation">(</span><span class="token class-name">DoFnSignature</span> signature<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">Class</span><span class="token generics"><span class="token punctuation"><</span><span class="token operator">?</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">DoFn</span><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">,</span> <span class="token operator">?</span><span class="token punctuation">></span><span class="token punctuation">></span></span> fnClass <span class="token operator">=</span> signature<span class="token punctuation">.</span><span class="token function">fnClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword keyword-try">try</span> <span class="token punctuation">{</span>
<span class="token keyword keyword-return">return</span> <span class="token punctuation">(</span><span class="token class-name">Class</span><span class="token punctuation">)</span> <span class="token class-name">Class</span><span class="token punctuation">.</span><span class="token function">forName</span><span class="token punctuation">(</span>fnClass<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token class-name">PredefinedDoFnInvokerFeature</span><span class="token punctuation">.</span>INVOKER_SUFFIX<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword keyword-catch">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClassNotFoundException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword keyword-throw">throw</span> <span class="token keyword keyword-new">new</span> <span class="token class-name">RuntimeException</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</pre><h3 class="mume-header" id="class-initialization">Class initialization</h3>
<p>In native images classes can either be initialized at runtime or at build time.
While initialization at build time has many advantages such as shorter startup times, the semantics can be totally
different compared to initialization at runtime when first used as required by the JVM. The goal is to statically
initialize as many classes as possible while keeping semantics of the application correct.</p>
<p>A common pitfall used to be statically initialized random number generators as mentioned in the context of direct
runner <a href="#randomized-behavior-in-directrunner">above</a>. More recent versions of GraalVM will fail the build if such an
instance is detected. In our we have to force runtime initialization of Beam’s <code>TupleTag</code> (and dependents) due to it’s
static <code>Random</code> field (despite it being initialized with seed <code>0</code>).</p>
<h3 class="mume-header" id="optional-improve-dofnsignature-lookup">Optional: Improve DoFnSignature lookup</h3>
<p>Finally, we can remove the code path to generate <code>DoFnSignature</code>s. All required signatures have
already been generated during image generation in the above feature and will be stored in the image.</p>
<p>As <code>signatureCache</code> has become read-only, we can also replace the <code>ConcurrentHashMap</code> with a
standard <code>HashMap</code>. Though, that’s more to showcase the possibilities, rather than fixing a real
performance bottleneck.</p>
<pre data-role="codeBlock" data-info="java" class="language-java"><span class="token annotation punctuation">@TargetClass</span><span class="token punctuation">(</span><span class="token class-name">DoFnSignatures</span><span class="token punctuation">.</span><span class="token keyword keyword-class">class</span><span class="token punctuation">)</span>
<span class="token keyword keyword-public">public</span> <span class="token keyword keyword-final">final</span> <span class="token keyword keyword-class">class</span> <span class="token class-name">SubstituteDoFnSignatures</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Alias</span>
<span class="token annotation punctuation">@RecomputeFieldValue</span><span class="token punctuation">(</span>kind <span class="token operator">=</span> <span class="token class-name">Kind<span class="token punctuation">.</span>Custom</span><span class="token punctuation">,</span> declClass <span class="token operator">=</span> <span class="token class-name">MapTransformer</span><span class="token punctuation">.</span><span class="token keyword keyword-class">class</span><span class="token punctuation">,</span> isFinal <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token keyword keyword-private">private</span> <span class="token keyword keyword-static">static</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Class</span><span class="token punctuation"><</span><span class="token operator">?</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">DoFn</span><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">,</span> <span class="token operator">?</span><span class="token punctuation">></span><span class="token punctuation">></span><span class="token punctuation">,</span> <span class="token class-name">DoFnSignature</span><span class="token punctuation">></span></span> signatureCache<span class="token punctuation">;</span>
<span class="token keyword keyword-public">public</span> <span class="token keyword keyword-static">static</span> <span class="token keyword keyword-class">class</span> <span class="token class-name">MapTransformer</span> <span class="token keyword keyword-implements">implements</span> <span class="token class-name">FieldValueTransformer</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword keyword-public">public</span> <span class="token class-name">Object</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">Object</span> receiver<span class="token punctuation">,</span> <span class="token class-name">Object</span> originalValue<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword keyword-return">return</span> <span class="token keyword keyword-new">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token class-name">Map</span><span class="token punctuation">)</span> originalValue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Substitute</span>
<span class="token keyword keyword-public">public</span> <span class="token keyword keyword-static">static</span> <span class="token generics"><span class="token punctuation"><</span><span class="token class-name">FnT</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">DoFn</span><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">,</span> <span class="token operator">?</span><span class="token punctuation">></span><span class="token punctuation">></span></span> <span class="token class-name">DoFnSignature</span> <span class="token function">getSignature</span><span class="token punctuation">(</span><span class="token class-name">Class</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">FnT</span><span class="token punctuation">></span></span> fn<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword keyword-return">return</span> signatureCache<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>fn<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// don't call parseSignature if absent</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Delete</span>
<span class="token keyword keyword-private">private</span> <span class="token keyword keyword-static">static</span> <span class="token class-name">DoFnSignature</span> <span class="token function">parseSignature</span><span class="token punctuation">(</span><span class="token class-name">Class</span><span class="token generics"><span class="token punctuation"><</span><span class="token operator">?</span> <span class="token keyword keyword-extends">extends</span> <span class="token class-name">DoFn</span><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">,</span> <span class="token operator">?</span><span class="token punctuation">></span><span class="token punctuation">></span></span> fnClass<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword keyword-return">return</span> <span class="token keyword keyword-null">null</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</pre><h3 class="mume-header" id="evaluation">Evaluation</h3>
<p>In the following we’re going to evaluate performance and memory usage of the native pipeline against the same pipeline
running on multiple JVMs using an uber jar. Each run is repeated 50 times on a MacBook Pro to gather sufficient data.
The <code>time</code> command is used to gather basic runtime metrics.</p>
<pre data-role="codeBlock" data-info="bash" class="language-bash">gradle nativeCompile
gradle shadowJar
<span class="token comment"># Configure zsh time command to emit Json for easier postprocessing</span>
<span class="token assign-left variable">TIMEFMT</span><span class="token operator">=</span><span class="token string">'{"time_user_ms": "%mU", "time_system_ms": "%mS", "time_elapsed_ms": "%mE", "rss_max_kb": %M, "cpu_percentage": "%P"}'</span>
<span class="token comment"># Trigger 50 instrumented pipeline runs each</span>
repeat <span class="token number">50</span> <span class="token function">time</span> java -jar build/libs/beam-native-experiment-1.0-SNAPSHOT-all.jar <span class="token operator">&></span> /dev/null
repeat <span class="token number">50</span> <span class="token function">time</span> build/native/nativeCompile/beam-native-experiment <span class="token operator">&></span> /dev/null
</pre><h5 class="mume-header" id="summary-of-results">Summary of results</h5>
<p>The boxplot charts below visualize performance (time elapsed) and memory usage (max RSS) of the native image as well as
multiple JVMs based on 50 benchmark runs each. For Java 8, the G1 garbage collector was configured, which became the
default for Java 11.</p>
<p>Results are surprising considering our initial expectations; specifically we’re looking at the first iteration here.
Memory usage only improved ~ 29% (median) compared to the best performing JVM (Java 8 using G1 GC). On the other hand,
performance also improved ~ 27% (median) compared to the best performing JVM (GraalVM CE 22.3.0). The latter was
certainly not expected as native images are not necessarily known for great performance. The JVM JIT compiler does a
great job optimizing code at runtime, which can’t be done with native images. The fact that we were able to push some
costly initialization code (such as generation of <code>DoFn</code> signatures and invokers) into the native image build might
have helped there.</p>
<p>As expected, results of the 2nd iteration, that slightly refines the generation of <code>DoFn</code> invokers, are very similar.
The code executed at runtime is identical. The only difference is that we’re not including unused <code>DoFn</code> signatures and
invokers in the native image anymore. Though, considering this, it is unexpected to see a slightly higher memory usage.</p>
<p><!--?xml version="1.0" encoding="utf-8"?-->
<svg class="marks" width="1073" height="349" viewBox="0 0 1073 349" version="1.1" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink"><rect width="1073" height="349" style="fill: white;"/><g transform="translate(65,11)"><g class="mark-group role-frame root"><g transform="translate(0,0)"><path class="background" d="M0,0h0v300h0Z" style="fill: none;"/><g><g class="mark-group role-scope concat_0_group"><g transform="translate(0,0)"><path class="background" d="M0.5,0.5h100v300h-100Z" style="fill: none; stroke: #ddd;"/><g><g class="mark-group role-axis"><g transform="translate(0.5,0.5)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-rule role-axis-grid" style="pointer-events: none;"><line transform="translate(0,300)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,267)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,233)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,200)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,167)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,133)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,100)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,67)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,33)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,0)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-group role-axis"><g transform="translate(0.5,300.5)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-rule role-axis-tick" style="pointer-events: none;"><line transform="translate(10,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(30,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(50,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(70,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(90,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-rule role-axis-domain" style="pointer-events: none;"><line transform="translate(0,0)" x2="100" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-text role-axis-title" style="pointer-events: none;"><text text-anchor="middle" transform="translate(50,19)" style="font-family: sans-serif; font-size: 11px; font-weight: bold; fill: #000; opacity: 1;">Runtime system</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-group role-axis"><g transform="translate(0.5,0.5)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-rule role-axis-tick" style="pointer-events: none;"><line transform="translate(0,300)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,267)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,233)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,200)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,167)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,133)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,100)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,67)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,33)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,0)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-text role-axis-label" style="pointer-events: none;"><text text-anchor="end" transform="translate(-7,303)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">0</text><text text-anchor="end" transform="translate(-7,269.66666666666663)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">20,000</text><text text-anchor="end" transform="translate(-7,236.33333333333334)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">40,000</text><text text-anchor="end" transform="translate(-7,203.00000000000003)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">60,000</text><text text-anchor="end" transform="translate(-7,169.66666666666669)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">80,000</text><text text-anchor="end" transform="translate(-7,136.33333333333331)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">100,000</text><text text-anchor="end" transform="translate(-7,103.00000000000001)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">120,000</text><text text-anchor="end" transform="translate(-7,69.66666666666666)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">140,000</text><text text-anchor="end" transform="translate(-7,36.33333333333335)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">160,000</text><text text-anchor="end" transform="translate(-7,3)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">180,000</text></g><g class="mark-rule role-axis-domain" style="pointer-events: none;"><line transform="translate(0,300)" x2="0" y2="-300" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-text role-axis-title" style="pointer-events: none;"><text text-anchor="middle" transform="translate(-47.1474609375,150) rotate(-90) translate(0,-2)" style="font-family: sans-serif; font-size: 11px; font-weight: bold; fill: #000; opacity: 1;">Total time elapsed (ms)</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-symbol role-mark concat_0_layer_0_layer_0_marks"><path transform="translate(10,21.83333333333335)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #4c78a8; stroke-width: 2; opacity: 0.7;"/><path transform="translate(30,194.90166666666667)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #4c78a8; stroke-width: 2; opacity: 0.7;"/><path transform="translate(50,49.39666666666667)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #4c78a8; stroke-width: 2; opacity: 0.7;"/><path transform="translate(50,48.635000000000005)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #4c78a8; stroke-width: 2; opacity: 0.7;"/><path transform="translate(50,31.338333333333335)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #4c78a8; stroke-width: 2; opacity: 0.7;"/></g><g class="mark-rule role-mark concat_0_layer_0_layer_1_layer_0_marks"><line transform="translate(10,186.22)" x2="0" y2="-33.29833333333332" style="fill: none; stroke: black;"/><line transform="translate(30,148.16333333333333)" x2="0" y2="-25.309583333333336" style="fill: none; stroke: black;"/><line transform="translate(50,223.755)" x2="0" y2="-45.094166666666695" style="fill: none; stroke: black;"/><line transform="translate(70,249.41500000000002)" x2="0" y2="-17.46333333333334" style="fill: none; stroke: black;"/><line transform="translate(90,248.885)" x2="0" y2="-13.54249999999999" style="fill: none; stroke: black;"/></g><g class="mark-rule role-mark concat_0_layer_0_layer_1_layer_1_marks"><line transform="translate(10,110.37833333333332)" x2="0" y2="-48.46666666666666" style="fill: none; stroke: black;"/><line transform="translate(30,83.05541666666669)" x2="0" y2="-39.362083333333345" style="fill: none; stroke: black;"/><line transform="translate(50,128.0275)" x2="0" y2="-74.97916666666666" style="fill: none; stroke: black;"/><line transform="translate(70,174.85875000000001)" x2="0" y2="-15.313750000000027" style="fill: none; stroke: black;"/><line transform="translate(90,178.12750000000003)" x2="0" y2="-42.16750000000002" style="fill: none; stroke: black;"/></g><g class="mark-rect role-mark concat_0_layer_1_layer_0_marks"><path d="M3,110.37833333333332h14v42.543333333333365h-14Z" style="fill: #66c2a5;"/><path d="M23,83.05541666666669h14v39.798333333333304h-14Z" style="fill: #fc8d62;"/><path d="M43,128.0275h14v50.6333333333333h-14Z" style="fill: #8da0cb;"/><path d="M63,174.85875000000001h14v57.09291666666667h-14Z" style="fill: #e78ac3;"/><path d="M83,178.12750000000003h14v57.214999999999975h-14Z" style="fill: #a6d854;"/></g><g class="mark-rect role-mark concat_0_layer_1_layer_1_marks"><path d="M3,128.08166666666668h14v1h-14Z" style="fill: white; opacity: 0.7;"/><path d="M23,101.31416666666667h14v1h-14Z" style="fill: white; opacity: 0.7;"/><path d="M43,157.41h14v1h-14Z" style="fill: white; opacity: 0.7;"/><path d="M63,196.50083333333333h14v1h-14Z" style="fill: white; opacity: 0.7;"/><path d="M83,197.64583333333334h14v1h-14Z" style="fill: white; opacity: 0.7;"/></g></g><path class="foreground" d="" style="display: none; fill: none;"/></g></g><g class="mark-group role-scope concat_1_group"><g transform="translate(269,0)"><path class="background" d="M0.5,0.5h100v300h-100Z" style="fill: none; stroke: #ddd;"/><g><g class="mark-group role-axis"><g transform="translate(0.5,0.5)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-rule role-axis-grid" style="pointer-events: none;"><line transform="translate(0,300)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,254)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,208)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,162)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,115)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,69)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,23)" x2="100" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-group role-axis"><g transform="translate(0.5,300.5)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-rule role-axis-tick" style="pointer-events: none;"><line transform="translate(10,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(30,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(50,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(70,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(90,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-rule role-axis-domain" style="pointer-events: none;"><line transform="translate(0,0)" x2="100" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-text role-axis-title" style="pointer-events: none;"><text text-anchor="middle" transform="translate(50,19)" style="font-family: sans-serif; font-size: 11px; font-weight: bold; fill: #000; opacity: 1;">Runtime system</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-group role-axis"><g transform="translate(0.5,0.5)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-rule role-axis-tick" style="pointer-events: none;"><line transform="translate(0,300)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,254)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,208)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,162)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,115)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,69)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,23)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-text role-axis-label" style="pointer-events: none;"><text text-anchor="end" transform="translate(-7,303)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">0</text><text text-anchor="end" transform="translate(-7,256.8461538461538)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">200,000</text><text text-anchor="end" transform="translate(-7,210.69230769230768)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">400,000</text><text text-anchor="end" transform="translate(-7,164.53846153846152)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">600,000</text><text text-anchor="end" transform="translate(-7,118.38461538461537)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">800,000</text><text text-anchor="end" transform="translate(-7,72.23076923076921)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">1,000,000</text><text text-anchor="end" transform="translate(-7,26.076923076923062)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">1,200,000</text></g><g class="mark-rule role-axis-domain" style="pointer-events: none;"><line transform="translate(0,300)" x2="0" y2="-300" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-text role-axis-title" style="pointer-events: none;"><text text-anchor="middle" transform="translate(-55.4873046875,150) rotate(-90) translate(0,-2)" style="font-family: sans-serif; font-size: 11px; font-weight: bold; fill: #000; opacity: 1;">Max RSS (kb)</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-symbol role-mark concat_1_layer_0_layer_0_marks"><path transform="translate(50,17.174769230769215)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #4c78a8; stroke-width: 2; opacity: 0.7;"/><path transform="translate(50,21.512307692307708)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #4c78a8; stroke-width: 2; opacity: 0.7;"/><path transform="translate(50,24.91476923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #4c78a8; stroke-width: 2; opacity: 0.7;"/></g><g class="mark-rule role-mark concat_1_layer_0_layer_1_layer_0_marks"><line transform="translate(10,36.58799999999999)" x2="0" y2="-5.321538461538445" style="fill: none; stroke: black;"/><line transform="translate(30,150.76246153846154)" x2="0" y2="-3.32076923076923" style="fill: none; stroke: black;"/><line transform="translate(50,53.68984615384617)" x2="0" y2="-9.237461538461545" style="fill: none; stroke: black;"/><line transform="translate(70,240.97015384615386)" x2="0" y2="-31.143230769230797" style="fill: none; stroke: black;"/><line transform="translate(90,235.11969230769233)" x2="0" y2="-26.004461538461555" style="fill: none; stroke: black;"/></g><g class="mark-rule role-mark concat_1_layer_0_layer_1_layer_1_marks"><line transform="translate(10,25.703999999999994)" x2="0" y2="-7.7953846153846165" style="fill: none; stroke: black;"/><line transform="translate(30,142.92276923076923)" x2="0" y2="-2.6824615384615242" style="fill: none; stroke: black;"/><line transform="translate(50,37.062)" x2="0" y2="-8.117999999999995" style="fill: none; stroke: black;"/><line transform="translate(70,175.41323076923078)" x2="0" y2="-49.06430769230769" style="fill: none; stroke: black;"/><line transform="translate(90,161.23107692307696)" x2="0" y2="-42.57046153846157" style="fill: none; stroke: black;"/></g><g class="mark-rect role-mark concat_1_layer_1_layer_0_marks"><path d="M3,25.703999999999994h14v5.562461538461548h-14Z" style="fill: #66c2a5;"/><path d="M23,142.92276923076923h14v4.518923076923073h-14Z" style="fill: #fc8d62;"/><path d="M43,37.062h14v7.390384615384626h-14Z" style="fill: #8da0cb;"/><path d="M63,175.41323076923078h14v34.41369230769229h-14Z" style="fill: #e78ac3;"/><path d="M83,161.23107692307696h14v47.88415384615382h-14Z" style="fill: #a6d854;"/></g><g class="mark-rect role-mark concat_1_layer_1_layer_1_marks"><path d="M3,28.160615384615372h14v1h-14Z" style="fill: white; opacity: 0.7;"/><path d="M23,144.8223076923077h14v1h-14Z" style="fill: white; opacity: 0.7;"/><path d="M43,40.68215384615386h14v1h-14Z" style="fill: white; opacity: 0.7;"/><path d="M63,190.1836923076923h14v1h-14Z" style="fill: white; opacity: 0.7;"/><path d="M83,187.04938461538458h14v1h-14Z" style="fill: white; opacity: 0.7;"/></g></g><path class="foreground" d="" style="display: none; fill: none;"/></g></g><g class="mark-group role-scope concat_2_group"><g transform="translate(538,0)"><path class="background" d="M0.5,0.5h300v300h-300Z" style="fill: none; stroke: #ddd;"/><g><g class="mark-group role-axis"><g transform="translate(0.5,300.5)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-rule role-axis-grid" style="pointer-events: none;"><line transform="translate(0,-300)" x2="0" y2="300" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(33,-300)" x2="0" y2="300" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(67,-300)" x2="0" y2="300" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(100,-300)" x2="0" y2="300" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(133,-300)" x2="0" y2="300" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(167,-300)" x2="0" y2="300" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(200,-300)" x2="0" y2="300" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(233,-300)" x2="0" y2="300" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(267,-300)" x2="0" y2="300" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(300,-300)" x2="0" y2="300" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-group role-axis"><g transform="translate(0.5,0.5)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-rule role-axis-grid" style="pointer-events: none;"><line transform="translate(0,300)" x2="300" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,254)" x2="300" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,208)" x2="300" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,162)" x2="300" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,115)" x2="300" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,69)" x2="300" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/><line transform="translate(0,23)" x2="300" y2="0" style="fill: none; stroke: #ddd; stroke-width: 1; opacity: 1;"/></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-group role-axis"><g transform="translate(0.5,300.5)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-rule role-axis-tick" style="pointer-events: none;"><line transform="translate(0,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(33,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(67,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(100,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(133,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(167,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(200,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(233,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(267,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(300,0)" x2="0" y2="5" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-text role-axis-label" style="pointer-events: none;"><text text-anchor="start" transform="translate(0,15)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">0</text><text text-anchor="middle" transform="translate(33.33333333333333,15)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 0;">20,000</text><text text-anchor="middle" transform="translate(66.66666666666666,15)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">40,000</text><text text-anchor="middle" transform="translate(100,15)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 0;">60,000</text><text text-anchor="middle" transform="translate(133.33333333333331,15)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">80,000</text><text text-anchor="middle" transform="translate(166.66666666666669,15)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 0;">100,000</text><text text-anchor="middle" transform="translate(200,15)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">120,000</text><text text-anchor="middle" transform="translate(233.33333333333334,15)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 0;">140,000</text><text text-anchor="middle" transform="translate(266.66666666666663,15)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">160,000</text><text text-anchor="end" transform="translate(300,15)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 0;">180,000</text></g><g class="mark-rule role-axis-domain" style="pointer-events: none;"><line transform="translate(0,0)" x2="300" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-text role-axis-title" style="pointer-events: none;"><text text-anchor="middle" transform="translate(150,30)" style="font-family: sans-serif; font-size: 11px; font-weight: bold; fill: #000; opacity: 1;">Total time elapsed (ms)</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-group role-axis"><g transform="translate(0.5,0.5)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-rule role-axis-tick" style="pointer-events: none;"><line transform="translate(0,300)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,254)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,208)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,162)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,115)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,69)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/><line transform="translate(0,23)" x2="-5" y2="0" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-text role-axis-label" style="pointer-events: none;"><text text-anchor="end" transform="translate(-7,303)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">0</text><text text-anchor="end" transform="translate(-7,256.8461538461538)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">200,000</text><text text-anchor="end" transform="translate(-7,210.69230769230768)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">400,000</text><text text-anchor="end" transform="translate(-7,164.53846153846152)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">600,000</text><text text-anchor="end" transform="translate(-7,118.38461538461537)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">800,000</text><text text-anchor="end" transform="translate(-7,72.23076923076921)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">1,000,000</text><text text-anchor="end" transform="translate(-7,26.076923076923062)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">1,200,000</text></g><g class="mark-rule role-axis-domain" style="pointer-events: none;"><line transform="translate(0,300)" x2="0" y2="-300" style="fill: none; stroke: #888; stroke-width: 1; opacity: 1;"/></g><g class="mark-text role-axis-title" style="pointer-events: none;"><text text-anchor="middle" transform="translate(-55.4873046875,150) rotate(-90) translate(0,-2)" style="font-family: sans-serif; font-size: 11px; font-weight: bold; fill: #000; opacity: 1;">Max RSS (kb)</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-symbol role-mark concat_2_marks"><path transform="translate(168.18166666666667,32.37415384615384)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(181.845,30.870461538461548)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(193.78166666666664,26.23199999999999)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(189.14,32.70369230769232)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(182.41333333333336,18.963692307692305)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(174.60666666666665,24.740307692307706)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(189.90333333333334,28.660615384615372)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(199.39666666666668,25.703999999999994)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(217.405,30.20584615384616)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(173.29333333333332,31.19907692307693)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(230.21833333333333,23.21630769230768)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(278.16666666666663,30.549230769230785)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(238.08833333333334,26.34923076923078)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(207.11333333333332,22.07723076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(234.79333333333335,26.492307692307694)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(127.17333333333333,25.271999999999995)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(153.84333333333333,28.833230769230767)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(151.805,28.263692307692313)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(141.73833333333334,32.07784615384617)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(141.72833333333332,27.86676923076922)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(129.19166666666666,17.908615384615377)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(122.56833333333333,24.88707692307691)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(165.51666666666668,33.947076923076914)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(132.84166666666667,30.272307692307677)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(171.41833333333332,29.697230769230764)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(144.23,27.65446153846153)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(147.07833333333332,30.29169230769231)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(154.95,33.676615384615395)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(129.76333333333335,31.654153846153854)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(113.77999999999999,32.45999999999999)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(189.62166666666667,24.53169230769231)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(167.85666666666668,27.046153846153842)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(153.78166666666667,27.633230769230764)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(141.36833333333334,25.384615384615394)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(162.01500000000001,33.82615384615386)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(144.74666666666667,23.412)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(144.575,36.58799999999999)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(169.11499999999998,28.943076923076937)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(200.04999999999998,32.550461538461526)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(183.90833333333333,34.427076923076925)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(182.98833333333332,28.656000000000013)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(207.87166666666667,28.76123076923076)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(221.41833333333332,28.031076923076924)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(188.80333333333334,20.328000000000014)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(180.715,25.139999999999997)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(174.87166666666667,29.382461538461524)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(175.965,33.816923076923075)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(151.29666666666668,27.51692307692307)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(153.27,31.26646153846154)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #66c2a5; stroke-width: 2; opacity: 0.7;"/><path transform="translate(176.19666666666666,144.65538461538463)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(176.32,142.464)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(237.04166666666666,141.73753846153843)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(159.27333333333334,143.3686153846154)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(210.42833333333334,148.20830769230767)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(235.98666666666668,150.76246153846154)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(240.145,149.95753846153846)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(194.56,146.6196923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(210.35833333333335,150.3849230769231)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(158.63000000000002,140.6363076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(192.06,144.91476923076922)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(193.45166666666665,145.4436923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(215.34333333333333,149.5070769230769)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(180.57999999999998,143.67415384615384)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(205.89166666666665,144.1430769230769)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(216.95166666666665,146.9649230769231)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(211.54500000000002,147.67107692307692)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(105.09833333333334,140.2403076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(247.32333333333332,145.9836923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(164.59,144.3563076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(214.415,143.12676923076924)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(173.38,143.4876923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(173.59333333333333,142.76399999999998)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(186.655,146.97784615384617)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(203.86666666666667,143.33907692307693)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(226.38333333333333,144.31476923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(231.04,142.95323076923074)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(256.3066666666667,145.48615384615385)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(152.76166666666668,142.07538461538462)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(229.05833333333334,147.05261538461536)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(163.72666666666666,141.44215384615384)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(190.71,142.5323076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(254.51833333333335,147.28246153846152)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(183.72833333333332,147.9683076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(186.28833333333333,148.51846153846154)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(200.71166666666664,148.6790769230769)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(167.82833333333332,142.31076923076924)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(196.05833333333334,148.69753846153844)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(197.02333333333334,141.72)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(199.34833333333336,148.62369230769232)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(186.35166666666666,149.15169230769231)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(151.83666666666667,147.05353846153847)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(203.17833333333334,146.51076923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(179.625,142.9126153846154)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(246.94166666666666,142.90615384615384)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(225.28,146.89846153846153)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(203.995,147.4947692307692)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(216.92333333333335,145.20092307692306)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(236.02666666666667,145.48153846153846)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(171.51,142.88676923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #fc8d62; stroke-width: 2; opacity: 0.7;"/><path transform="translate(103.215,44.98799999999999)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(152.1483333333333,41.56984615384617)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(125.73666666666666,39.77353846153846)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(121.03999999999999,44.288307692307704)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(90.445,42.497538461538454)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(215.055,36.69507692307693)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(135.04666666666665,42.9193846153846)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(142.33166666666668,38.80246153846155)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(155.65166666666664,38.16276923076922)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(157.54166666666669,17.174769230769215)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(157.74,44.2153846153846)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(141.84833333333333,41.25784615384616)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(101.5,38.861538461538444)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(144.18666666666667,44.74430769230769)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(146.3,21.512307692307708)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(114.21333333333334,38.61046153846153)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(126.065,36.57876923076924)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(139.71,39.13661538461539)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(172.25500000000002,44.75907692307693)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(246.95166666666665,30.55384615384614)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(171.125,42.806769230769234)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(159.88000000000002,29.36215384615386)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(250.60333333333332,38.540307692307685)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(178.30166666666665,24.91476923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(224.12166666666667,34.31538461538462)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(251.36499999999998,35.36769230769232)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(144.76333333333332,41.33076923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(268.6616666666667,47.90953846153847)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(237.18166666666667,36.211384615384624)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(103.44833333333334,47.65846153846155)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(190.33999999999997,36.63876923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(186.53333333333333,48.54553846153847)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(210.43333333333334,39.68307692307692)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(100.22833333333334,42.97384615384614)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(148.63666666666666,39.459692307692315)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(76.24499999999999,28.944000000000003)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(97.345,44.71107692307692)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(136.94166666666666,42.93692307692307)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(122.23666666666666,41.80061538461539)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(128.395,45.72184615384616)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(102.265,38.232923076923065)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(126.39,44.00861538461537)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(140.525,44.507076923076916)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(173.805,41.106461538461524)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(133.68166666666667,53.68984615384617)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(83.39833333333333,38.29015384615386)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(115.22,45.16707692307691)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(163.95333333333332,53.335384615384626)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(108.245,30.150461538461528)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(122.60333333333332,44.967692307692296)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #8da0cb; stroke-width: 2; opacity: 0.7;"/><path transform="translate(51.32333333333333,216.0073846153846)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(125.38833333333334,167.3593846153846)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(121.82000000000001,222.04153846153847)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(72.99833333333333,190.94123076923074)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(124.4,210.00369230769232)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(51.81333333333334,160.97815384615387)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(50.95333333333333,200.38892307692308)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(56.02833333333333,193.55446153846154)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(102.06,228.50676923076924)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(120.96333333333334,208.476)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(116.40166666666667,214.76584615384616)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(80.56166666666667,182.0916923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(129.31,195.80953846153847)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(106.72500000000001,209.29661538461536)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(112.43166666666667,169.35876923076924)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(111.715,200.9953846153846)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(137.33333333333334,187.1630769230769)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(114.13333333333333,182.94184615384617)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(88.655,220.02092307692308)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(59.455,202.68092307692308)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(82.11833333333334,188.17476923076924)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(137.505,218.68615384615384)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(54.1,187.84984615384616)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(90.075,211.6606153846154)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(136.30166666666668,158.94184615384614)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(140.455,169.49630769230768)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(95.75333333333333,145.0883076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(127.75166666666667,178.92184615384613)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(134.46333333333334,240.97015384615386)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(132.95333333333335,176.42953846153844)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(62.28666666666667,175.07446153846155)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(50.585,190.42615384615388)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(51.24166666666666,201.94892307692308)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(126.83666666666666,216.0323076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(52.39333333333333,170.79323076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(59.28333333333333,157.96984615384616)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(131.00833333333333,219.3572307692308)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(132.48333333333335,177.7606153846154)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(104.60166666666666,182.7710769230769)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(66.39833333333334,126.34892307692309)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(93.30499999999999,219.0009230769231)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(88.78166666666665,209.12584615384617)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(118.01499999999999,193.77784615384616)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(90.45166666666667,134.23199999999997)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(51.468333333333334,191.21723076923075)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(103.93833333333333,186.60276923076924)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(132.76333333333335,185.9326153846154)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(87.10166666666666,169.10861538461538)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(117.73833333333333,212.8273846153846)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(76.47333333333333,167.9566153846154)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #e78ac3; stroke-width: 2; opacity: 0.7;"/><path transform="translate(101.77333333333334,168.78276923076922)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(104.36999999999999,213.46523076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(102.40333333333334,179.82553846153843)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(51.915000000000006,215.51723076923076)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(105.85166666666666,187.2867692307692)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(52.20666666666666,206.02338461538463)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(79.50166666666667,196.65138461538461)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(110.64333333333333,196.12338461538462)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(56.973333333333336,126.97292307692308)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(67.04666666666667,215.58553846153845)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(101.935,213.72276923076925)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(52.748333333333335,219.012)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(105.985,140.6483076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(109.59333333333332,212.5430769230769)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(54.24333333333333,118.66061538461538)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(107.63166666666666,192.3710769230769)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(51.115,158.24215384615385)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(108.63,208.02276923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(94.37,198.72092307692307)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(110.46000000000001,235.11969230769233)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(62.43333333333333,182.37969230769232)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(51.894999999999996,158.99076923076922)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(139.18833333333333,160.0043076923077)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(118.13499999999999,119.89846153846156)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(157.305,218.3916923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(64.04833333333333,198.4476923076923)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(93.06666666666666,209.47938461538462)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(115.68166666666666,213.75230769230768)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(123.11833333333334,215.19046153846153)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(123.13499999999999,144.708)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(132.18666666666667,214.20646153846155)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(164.04,185.96123076923078)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(51.11666666666667,182.592)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(130.645,202.3052307692308)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(59.64333333333333,156.6507692307692)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(92.085,200.63353846153845)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(52.22666666666666,187.81199999999998)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(144.57166666666666,164.91138461538463)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(83.55000000000001,136.24892307692306)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(66.48833333333333,206.05938461538463)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(163.27833333333334,196.52584615384617)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(147.565,146.76)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(96.56,180.51507692307692)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(82.78833333333333,176.33169230769232)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(53.13666666666666,185.84307692307692)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(67.99499999999999,147.17538461538462)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(152.62333333333333,121.94215384615386)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(135.13,225.93323076923076)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(66.485,178.2969230769231)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/><path transform="translate(140.79833333333335,182.82553846153843)" d="M2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,-2.7386127875258306,0A2.7386127875258306,2.7386127875258306,0,1,1,2.7386127875258306,0" style="fill: none; stroke: #a6d854; stroke-width: 2; opacity: 0.7;"/></g></g><path class="foreground" d="" style="display: none; fill: none;"/></g></g><g class="mark-group role-legend"><g transform="translate(858,0)"><path class="background" d="M0,0h145v93h-145Z" style="pointer-events: none; fill: none;"/><g><g class="mark-group role-legend-entry"><g transform="translate(0,16)"><path class="background" d="M0,0h0v0h0Z" style="pointer-events: none; fill: none;"/><g><g class="mark-group role-scope"><g transform="translate(0,0)"><path class="background" d="M0,0h144.76953125v12.5h-144.76953125Z" style="pointer-events: none; fill: none; opacity: 1;"/><g><g class="mark-symbol role-legend-symbol" style="pointer-events: none;"><path transform="translate(6,6)" d="M5,0A5,5,0,1,1,-5,0A5,5,0,1,1,5,0" style="fill: #66c2a5; stroke: #66c2a5; stroke-width: 1.5; opacity: 0.7;"/></g><g class="mark-text role-legend-label" style="pointer-events: none;"><text text-anchor="start" transform="translate(16,9)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">Corretto 11.0.16</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g><g transform="translate(0,16)"><path class="background" d="M0,0h144.76953125v12.5h-144.76953125Z" style="pointer-events: none; fill: none; opacity: 1;"/><g><g class="mark-symbol role-legend-symbol" style="pointer-events: none;"><path transform="translate(6,6)" d="M5,0A5,5,0,1,1,-5,0A5,5,0,1,1,5,0" style="fill: #fc8d62; stroke: #fc8d62; stroke-width: 1.5; opacity: 0.7;"/></g><g class="mark-text role-legend-label" style="pointer-events: none;"><text text-anchor="start" transform="translate(16,9)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">Corretto 8.322 (G1)</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g><g transform="translate(0,32)"><path class="background" d="M0,0h144.76953125v12.5h-144.76953125Z" style="pointer-events: none; fill: none; opacity: 1;"/><g><g class="mark-symbol role-legend-symbol" style="pointer-events: none;"><path transform="translate(6,6)" d="M5,0A5,5,0,1,1,-5,0A5,5,0,1,1,5,0" style="fill: #8da0cb; stroke: #8da0cb; stroke-width: 1.5; opacity: 0.7;"/></g><g class="mark-text role-legend-label" style="pointer-events: none;"><text text-anchor="start" transform="translate(16,9)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">GraalVM CE 22.3.0 (11.0.17)</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g><g transform="translate(0,48)"><path class="background" d="M0,0h144.76953125v12.5h-144.76953125Z" style="pointer-events: none; fill: none; opacity: 1;"/><g><g class="mark-symbol role-legend-symbol" style="pointer-events: none;"><path transform="translate(6,6)" d="M5,0A5,5,0,1,1,-5,0A5,5,0,1,1,5,0" style="fill: #e78ac3; stroke: #e78ac3; stroke-width: 1.5; opacity: 0.7;"/></g><g class="mark-text role-legend-label" style="pointer-events: none;"><text text-anchor="start" transform="translate(16,9)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">Native (Iteration 1)</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g><g transform="translate(0,64)"><path class="background" d="M0,0h144.76953125v12.5h-144.76953125Z" style="pointer-events: none; fill: none; opacity: 1;"/><g><g class="mark-symbol role-legend-symbol" style="pointer-events: none;"><path transform="translate(6,6)" d="M5,0A5,5,0,1,1,-5,0A5,5,0,1,1,5,0" style="fill: #a6d854; stroke: #a6d854; stroke-width: 1.5; opacity: 0.7;"/></g><g class="mark-text role-legend-label" style="pointer-events: none;"><text text-anchor="start" transform="translate(16,9)" style="font-family: sans-serif; font-size: 10px; fill: #000; opacity: 1;">Native (Iteration 2)</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g><g class="mark-text role-legend-title" style="pointer-events: none;"><text text-anchor="start" transform="translate(0,9)" style="font-family: sans-serif; font-size: 11px; font-weight: bold; fill: #000; opacity: 1;">Runtime system</text></g></g><path class="foreground" d="" style="pointer-events: none; display: none; fill: none;"/></g></g></g><path class="foreground" d="" style="display: none; fill: none;"/></g></g></g></svg></p><table>
<thead>
<tr>
<th></th>
<th>Runtime system</th>
<th>Q1</th>
<th>Median</th>
<th>Q3</th>
<th>Max</th>
</tr>
</thead>
<tbody>
<tr>
<td>Time elapsed</td>
<td>Native - Iteration 1</td>
<td>40.8 s</td>
<td>61.8 s</td>
<td>75.1 s</td>
<td>84,3 s</td>
</tr>
<tr>
<td></td>
<td>Native - Iteration 2</td>
<td>38.8 s</td>
<td>61.1 s</td>
<td>73.1 s</td>
<td>98.4 s</td>
</tr>
<tr>
<td></td>
<td>JVM - Corretto 8.322 (G1)</td>
<td>106.3 s</td>
<td>118.9 s</td>
<td>130.2 s</td>
<td>153.8 s</td>
</tr>
<tr>
<td></td>
<td>JVM - Corretto 11.0.16</td>
<td>88.2 s</td>
<td>102.8 s</td>
<td>113.8 s</td>
<td>166.9 s</td>
</tr>
<tr>
<td></td>
<td>JVM - GraalVM CE 22.3.0 (11.0.17)</td>
<td>72.8 s</td>
<td>85.2 s</td>
<td>103.2 s</td>
<td>161.2 s</td>
</tr>
<tr>
<td>Max RSS</td>
<td>Native - Iteration 1</td>
<td>390.8 Mb</td>
<td>473.7 Mb</td>
<td>539.9 Mb</td>
<td>752.5 s</td>
</tr>
<tr>
<td></td>
<td>Native - Iteration 2</td>
<td>393.8 Mb</td>
<td>487.3 Mb</td>
<td>601.3 Mb</td>
<td>785.8 Mb</td>
</tr>
<tr>
<td></td>
<td>JVM - Corretto 8.322 (G1)</td>
<td>661.1 Mb</td>
<td>670.3 Mb</td>
<td>680.7 Mb</td>
<td>692.3 Mb</td>
</tr>
<tr>
<td></td>
<td>JVM - Corretto 11.0.16</td>
<td>1164.5 Mb</td>
<td>1175.8 Mb</td>
<td>1188.6 Mb</td>
<td>1222.4 Mb</td>
</tr>
<tr>
<td></td>
<td>JVM - GraalVM CE 22.3.0 (11.0.17)</td>
<td>1107.3 Mb</td>
<td>1121.5 Mb</td>
<td>1139.4 Mb</td>
<td>1225.6 Mb</td>
</tr>
</tbody>
</table>
<h3 class="mume-header" id="next-steps">Next steps</h3>
<p>The results seen in this investigation are promising. It is absolutely feasible to run a Beam pipeline locally as native
image. However, the unexpected high memory usage of the native pipeline - despite the improvement - is somehow a bit
disappointing. Though, this might be an issue of the local runner.</p>
<p>The next step here is to investigate this further with a more performance oriented runner, either using Spark or Flink
or even a new lightweight in-memory runner developed from scratch.</p>
</div>
</body></html>