viztracer 1.1.1__cp313-cp313-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. viztracer/__init__.py +19 -0
  2. viztracer/__main__.py +8 -0
  3. viztracer/attach.py +67 -0
  4. viztracer/attach_process/LICENSE +203 -0
  5. viztracer/attach_process/__init__.py +0 -0
  6. viztracer/attach_process/add_code_to_python_process.py +582 -0
  7. viztracer/attach_process/attach_x86.dll +0 -0
  8. viztracer/attach_process/inject_dll_amd64.exe +0 -0
  9. viztracer/attach_process/linux_and_mac/lldb_prepare.py +54 -0
  10. viztracer/attach_process/run_code_on_dllmain_amd64.dll +0 -0
  11. viztracer/attach_process/run_code_on_dllmain_x86.dll +0 -0
  12. viztracer/cellmagic.py +70 -0
  13. viztracer/code_monkey.py +353 -0
  14. viztracer/decorator.py +164 -0
  15. viztracer/event_base.py +81 -0
  16. viztracer/functree.py +135 -0
  17. viztracer/html/flamegraph.html +34 -0
  18. viztracer/html/trace_viewer_embedder.html +203 -0
  19. viztracer/html/trace_viewer_full.html +10207 -0
  20. viztracer/main.py +701 -0
  21. viztracer/modules/eventnode.c +188 -0
  22. viztracer/modules/eventnode.h +73 -0
  23. viztracer/modules/pythoncapi_compat.h +1726 -0
  24. viztracer/modules/quicktime.c +177 -0
  25. viztracer/modules/quicktime.h +104 -0
  26. viztracer/modules/snaptrace.c +2207 -0
  27. viztracer/modules/snaptrace.h +134 -0
  28. viztracer/modules/snaptrace_member.c +483 -0
  29. viztracer/modules/util.c +45 -0
  30. viztracer/modules/util.h +22 -0
  31. viztracer/modules/vcompressor/vc_dump.c +1131 -0
  32. viztracer/modules/vcompressor/vc_dump.h +49 -0
  33. viztracer/modules/vcompressor/vcompressor.c +396 -0
  34. viztracer/modules/vcompressor/vcompressor.h +15 -0
  35. viztracer/patch.py +317 -0
  36. viztracer/report_builder.py +311 -0
  37. viztracer/snaptrace.cp313-win32.pyd +0 -0
  38. viztracer/snaptrace.pyi +77 -0
  39. viztracer/util.py +196 -0
  40. viztracer/vcompressor.cp313-win32.pyd +0 -0
  41. viztracer/vcompressor.pyi +10 -0
  42. viztracer/viewer.py +529 -0
  43. viztracer/vizcounter.py +20 -0
  44. viztracer/vizevent.py +31 -0
  45. viztracer/vizlogging.py +20 -0
  46. viztracer/vizobject.py +28 -0
  47. viztracer/vizplugin.py +143 -0
  48. viztracer/viztracer.py +472 -0
  49. viztracer/web_dist/LICENSE +189 -0
  50. viztracer/web_dist/index.html +127 -0
  51. viztracer/web_dist/service_worker.js +279 -0
  52. viztracer/web_dist/trace_processor +300 -0
  53. viztracer/web_dist/v52.0-6b9586def/assets/MaterialSymbolsOutlined.woff2 +0 -0
  54. viztracer/web_dist/v52.0-6b9586def/assets/Roboto-100.woff2 +0 -0
  55. viztracer/web_dist/v52.0-6b9586def/assets/Roboto-300.woff2 +0 -0
  56. viztracer/web_dist/v52.0-6b9586def/assets/Roboto-400.woff2 +0 -0
  57. viztracer/web_dist/v52.0-6b9586def/assets/Roboto-500.woff2 +0 -0
  58. viztracer/web_dist/v52.0-6b9586def/assets/RobotoCondensed-Light.woff2 +0 -0
  59. viztracer/web_dist/v52.0-6b9586def/assets/RobotoCondensed-Regular.woff2 +0 -0
  60. viztracer/web_dist/v52.0-6b9586def/assets/RobotoMono-Regular.woff2 +0 -0
  61. viztracer/web_dist/v52.0-6b9586def/assets/brand.png +0 -0
  62. viztracer/web_dist/v52.0-6b9586def/assets/catapult_trace_viewer.html +3946 -0
  63. viztracer/web_dist/v52.0-6b9586def/assets/catapult_trace_viewer.js +7539 -0
  64. viztracer/web_dist/v52.0-6b9586def/assets/favicon.png +0 -0
  65. viztracer/web_dist/v52.0-6b9586def/assets/logo-128.png +0 -0
  66. viztracer/web_dist/v52.0-6b9586def/assets/logo-3d.png +0 -0
  67. viztracer/web_dist/v52.0-6b9586def/assets/rec_atrace.png +0 -0
  68. viztracer/web_dist/v52.0-6b9586def/assets/rec_battery_counters.png +0 -0
  69. viztracer/web_dist/v52.0-6b9586def/assets/rec_board_voltage.png +0 -0
  70. viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_coarse.png +0 -0
  71. viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_fine.png +0 -0
  72. viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_freq.png +0 -0
  73. viztracer/web_dist/v52.0-6b9586def/assets/rec_cpu_voltage.png +0 -0
  74. viztracer/web_dist/v52.0-6b9586def/assets/rec_frame_timeline.png +0 -0
  75. viztracer/web_dist/v52.0-6b9586def/assets/rec_ftrace.png +0 -0
  76. viztracer/web_dist/v52.0-6b9586def/assets/rec_gpu_mem_total.png +0 -0
  77. viztracer/web_dist/v52.0-6b9586def/assets/rec_java_heap_dump.png +0 -0
  78. viztracer/web_dist/v52.0-6b9586def/assets/rec_lmk.png +0 -0
  79. viztracer/web_dist/v52.0-6b9586def/assets/rec_logcat.png +0 -0
  80. viztracer/web_dist/v52.0-6b9586def/assets/rec_long_trace.png +0 -0
  81. viztracer/web_dist/v52.0-6b9586def/assets/rec_mem_hifreq.png +0 -0
  82. viztracer/web_dist/v52.0-6b9586def/assets/rec_meminfo.png +0 -0
  83. viztracer/web_dist/v52.0-6b9586def/assets/rec_native_heap_profiler.png +0 -0
  84. viztracer/web_dist/v52.0-6b9586def/assets/rec_one_shot.png +0 -0
  85. viztracer/web_dist/v52.0-6b9586def/assets/rec_profiling.png +0 -0
  86. viztracer/web_dist/v52.0-6b9586def/assets/rec_ps_stats.png +0 -0
  87. viztracer/web_dist/v52.0-6b9586def/assets/rec_ring_buf.png +0 -0
  88. viztracer/web_dist/v52.0-6b9586def/assets/rec_syscalls.png +0 -0
  89. viztracer/web_dist/v52.0-6b9586def/assets/rec_vmstat.png +0 -0
  90. viztracer/web_dist/v52.0-6b9586def/assets/scheduling_latency.png +0 -0
  91. viztracer/web_dist/v52.0-6b9586def/assets/vscode-icon.png +0 -0
  92. viztracer/web_dist/v52.0-6b9586def/engine_bundle.js +3 -0
  93. viztracer/web_dist/v52.0-6b9586def/frontend_bundle.js +5495 -0
  94. viztracer/web_dist/v52.0-6b9586def/index.html +127 -0
  95. viztracer/web_dist/v52.0-6b9586def/manifest.json +52 -0
  96. viztracer/web_dist/v52.0-6b9586def/perfetto.css +5737 -0
  97. viztracer/web_dist/v52.0-6b9586def/stdlib_docs.json +1 -0
  98. viztracer/web_dist/v52.0-6b9586def/trace_config_utils.wasm +0 -0
  99. viztracer/web_dist/v52.0-6b9586def/trace_processor.wasm +0 -0
  100. viztracer/web_dist/v52.0-6b9586def/trace_processor_memory64.wasm +0 -0
  101. viztracer/web_dist/v52.0-6b9586def/traceconv.wasm +0 -0
  102. viztracer/web_dist/v52.0-6b9586def/traceconv_bundle.js +2 -0
  103. viztracer-1.1.1.dist-info/METADATA +326 -0
  104. viztracer-1.1.1.dist-info/RECORD +109 -0
  105. viztracer-1.1.1.dist-info/WHEEL +5 -0
  106. viztracer-1.1.1.dist-info/entry_points.txt +3 -0
  107. viztracer-1.1.1.dist-info/licenses/LICENSE +222 -0
  108. viztracer-1.1.1.dist-info/licenses/NOTICE.txt +27 -0
  109. viztracer-1.1.1.dist-info/top_level.txt +1 -0
viztracer/functree.py ADDED
@@ -0,0 +1,135 @@
1
+ # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2
+ # For details: https://github.com/gaogaotiantian/viztracer/blob/master/NOTICE.txt
3
+
4
+ import bisect
5
+ import copy
6
+ import re
7
+ from typing import Any, Generator
8
+
9
+
10
+ class FuncTreeNode:
11
+ name_regex = r"(.*) \((.*?):([0-9]+)\)"
12
+
13
+ def __init__(self, event: dict[str, Any] | None = None) -> None:
14
+ self.filename: str | None = None
15
+ self.lineno: int | None = None
16
+ self.is_python: bool | None = False
17
+ self.funcname: str | None = None
18
+ self.parent: FuncTreeNode | None = None
19
+ self.children: list[FuncTreeNode] = []
20
+ self.start: float = - (2 ** 64)
21
+ self.end: float = 2 ** 64
22
+ self.event: dict[str, Any] = {}
23
+ if event is None:
24
+ self.event = {"name": "__ROOT__"}
25
+ self.fullname = "__ROOT__"
26
+ else:
27
+ self.event = copy.copy(event)
28
+ self.start = self.event["ts"]
29
+ self.end = self.event["ts"] + self.event["dur"]
30
+ self.fullname = self.event["name"]
31
+ m = re.match(self.name_regex, self.fullname)
32
+ if m:
33
+ self.is_python = True
34
+ self.funcname = m.group(1)
35
+ self.filename = m.group(2)
36
+ self.lineno = int(m.group(3))
37
+
38
+ def is_ancestor(self, other: "FuncTreeNode") -> bool:
39
+ return self.start < other.start and self.end > other.end
40
+
41
+ def is_same(self, other: "FuncTreeNode") -> bool:
42
+ return (self.fullname == other.fullname
43
+ and len(self.children) == len(other.children)
44
+ and all(t[0].is_same(t[1]) for t in zip(self.children, other.children)))
45
+
46
+ def adopt(self, other: "FuncTreeNode") -> None:
47
+ new_children = []
48
+ if self.is_ancestor(other):
49
+ # Build a list is slow
50
+ # In almost all cases, end_idx should be the last, because that's
51
+ # how we record entries.
52
+ # In many cases, if two entries are siblings, start_idx is the
53
+ # last too.
54
+ # Try to skip building the list by checking these common situations
55
+ # first.
56
+ if not self.children:
57
+ # if it's empty, then both indexes are 0
58
+ start_idx = end_idx = 0
59
+ else:
60
+ if other.start > self.children[-1].start:
61
+ start_idx = len(self.children)
62
+ elif other.start < self.children[0].start:
63
+ start_idx = 0
64
+ else:
65
+ start_array = [n.start for n in self.children]
66
+ start_idx = bisect.bisect(start_array, other.start)
67
+ if other.end > self.children[-1].end:
68
+ end_idx = len(self.children)
69
+ else:
70
+ end_array = [n.end for n in self.children]
71
+ end_idx = bisect.bisect(end_array, other.end)
72
+ if (start_idx == end_idx + 1):
73
+ self.children[end_idx].adopt(other)
74
+ elif (start_idx == end_idx):
75
+ other.parent = self
76
+ self.children.insert(start_idx, other)
77
+ elif (start_idx < end_idx):
78
+ def change_parent(node):
79
+ node.parent = other
80
+ new_children = self.children[start_idx:end_idx]
81
+ # force map to run
82
+ list(map(change_parent, new_children))
83
+ other.children = new_children
84
+ other.parent = self
85
+ self.children = self.children[:start_idx] + [other] + self.children[end_idx:]
86
+ else: # pragma: no cover
87
+ raise Exception("This should not be possible")
88
+ elif self.parent is not None:
89
+ self.parent.adopt(other)
90
+ else: # pragma: no cover
91
+ raise Exception("This should not be possible")
92
+
93
+
94
+ class FuncTree: # pragma: no cover
95
+ def __init__(self, pid: int = 0, tid: int = 0) -> None:
96
+ self.root: FuncTreeNode = FuncTreeNode()
97
+ self.curr: FuncTreeNode = self.root
98
+ self.pid: int = pid
99
+ self.tid: int = tid
100
+
101
+ def is_same(self, other: "FuncTree") -> bool:
102
+ return self.root.is_same(other.root)
103
+
104
+ def add_event(self, event: dict[str, Any]) -> None:
105
+ node = FuncTreeNode(event)
106
+
107
+ self.curr.adopt(node)
108
+ self.curr = node
109
+
110
+ def first_ts(self) -> float:
111
+ return self.root.children[0].event["ts"]
112
+
113
+ def first_node(self) -> FuncTreeNode:
114
+ return self.root.children[0]
115
+
116
+ def node_by_timestamp(self, ts: float) -> FuncTreeNode:
117
+ starts = [node.start for node in self.root.children]
118
+ idx = bisect.bisect(starts, ts)
119
+ if idx == 0:
120
+ return self.root.children[0]
121
+ else:
122
+ return self.root.children[idx - 1]
123
+
124
+ def normalize(self, first_ts: float) -> None:
125
+ for node in self.inorder_traverse():
126
+ node.start -= first_ts
127
+ node.end -= first_ts
128
+
129
+ def inorder_traverse(self) -> Generator[FuncTreeNode, None, None]:
130
+ lst = [self.root]
131
+ while lst:
132
+ ret = lst.pop()
133
+ lst.extend(ret.children[::-1])
134
+ yield ret
135
+ return
@@ -0,0 +1,34 @@
1
+ <head>
2
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/d3-flame-graph@3.1.1/dist/d3-flamegraph.css">
3
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
4
+ </head>
5
+ <body>
6
+ <div id="chart" class="container text-center"></div>
7
+ <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
8
+ <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
9
+ <script type="text/javascript" src="https://d3js.org/d3.v4.min.js"></script>
10
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/d3-flame-graph@3.1.1/dist/d3-flamegraph.min.js"></script>
11
+ <script type="text/javascript">
12
+ var data = $data;
13
+
14
+ var charts = [];
15
+ for (var thread in data) {
16
+ var chart = flamegraph()
17
+ .width(1000)
18
+ .title(thread)
19
+ .minFrameSize(5)
20
+ .resetHeightOnZoom(true)
21
+ .setColorMapper((d, originalColor) =>
22
+ d.highlight ? "#6aff8f" : originalColor)
23
+ .label(function(d) {
24
+ return "name: " + d.data.name + " time: " + d.data.value.toString() + " ns"
25
+ });
26
+ var div = document.createElement("div");
27
+ div.setAttribute("id", thread);
28
+ document.getElementById("chart").appendChild(div);
29
+ d3.select("#" + thread)
30
+ .datum(data[thread])
31
+ .call(chart);
32
+ }
33
+ </script>
34
+ </body>
@@ -0,0 +1,203 @@
1
+ <!DOCTYPE html>
2
+ <!--
3
+ Copyright (c) 2014 The Chromium Authors. All rights reserved.
4
+ Use of this source code is governed by a BSD-style license that can be
5
+ found in the LICENSE file.
6
+ Original LICENSE file:
7
+ https://github.com/catapult-project/catapult/blob/master/tracing/LICENSE
8
+ -->
9
+ <head>
10
+ <!-- WebComponent V0 polyfill. You may want to host this in a more suitable
11
+ place. See https://crbug.com/1036492 -->
12
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/0.7.24/webcomponents.min.js"></script>
13
+
14
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.22.0/components/prism-core.min.js" integrity="sha512-hqRrGU7ys5tkcqxx5FIZTBb7PkO2o3mU6U5+qB9b55kgMlBUT4J2wPwQfMCxeJW1fC8pBxuatxoH//z0FInhrA==" crossorigin="anonymous"></script>
15
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.22.0/components/prism-python.min.js" integrity="sha512-EXseTM1JV8e3AonU5PfOUmzbPkUTRm4c4hVxv206gVeWZE/FwzSQBNWrUBaHsN3Idq9k76BEjUlXpluX1UFx6Q==" crossorigin="anonymous"></script>
16
+ <script>
17
+ 'use strict';
18
+
19
+ function onTraceViewerImportFail() {
20
+ document.addEventListener('DOMContentLoaded', function() {
21
+ document.body.textContent =
22
+ 'tracing/bin/trace_viewer_full.html is missing. ' +
23
+ 'Run vulcanize_trace_viewer from $$TRACE_VIEWER and reload.';
24
+ });
25
+ }
26
+ </script>
27
+ <!-- <link rel="import" href="trace_viewer_full.html"
28
+ onerror="onTraceViewerImportFail(event)"> -->
29
+
30
+ $trace_viewer_full
31
+
32
+
33
+ <style>
34
+ html, body {
35
+ box-sizing: border-box;
36
+ overflow: hidden;
37
+ margin: 0px;
38
+ padding: 0;
39
+ width: 100%;
40
+ height: 100%;
41
+ }
42
+ #trace-viewer {
43
+ width: 100%;
44
+ height: 100%;
45
+ }
46
+ #trace-viewer:focus {
47
+ outline: none;
48
+ }
49
+ </style>
50
+ <script>
51
+ 'use strict';
52
+
53
+ var json_data;
54
+ (function() {
55
+ let viewer;
56
+ let url;
57
+ let model;
58
+
59
+ // You can set this to true if you want to hide the WebComponentsV0 polyfill
60
+ // warning.
61
+ window.__hideTraceViewerPolyfillWarning = true;
62
+ json_data = $json_data
63
+
64
+ function load() {
65
+ const req = new XMLHttpRequest();
66
+ const isBinary = /[.]gz$$/.test(url) || /[.]zip$$/.test(url);
67
+ req.overrideMimeType('text/plain; charset=x-user-defined');
68
+ req.open('GET', url, true);
69
+ if (isBinary) req.responseType = 'arraybuffer';
70
+
71
+ req.onreadystatechange = function(event) {
72
+ if (req.readyState !== 4) return;
73
+
74
+ window.setTimeout(function() {
75
+ if (req.status === 200) {
76
+ onResult(isBinary ? req.response : req.responseText);
77
+ } else {
78
+ onResultFail(req.status);
79
+ }
80
+ }, 0);
81
+ };
82
+ req.send(null);
83
+ }
84
+
85
+ function onResultFail(err) {
86
+ const overlay = new tr.ui.b.Overlay();
87
+ overlay.textContent = err + ': ' + url + ' could not be loaded';
88
+ overlay.title = 'Failed to fetch data';
89
+ overlay.visible = true;
90
+ }
91
+
92
+ function onResult(result) {
93
+ model = new tr.Model();
94
+ const i = new tr.importer.Import(model);
95
+ const p = i.importTracesWithProgressDialog([result]);
96
+ p.then(onModelLoaded, onImportFail);
97
+ }
98
+
99
+ function onModelLoaded() {
100
+ viewer.model = model;
101
+ viewer.viewTitle = url;
102
+ }
103
+
104
+ function onImportFail(err) {
105
+ const overlay = new tr.ui.b.Overlay();
106
+ overlay.textContent = tr.b.normalizeException(err).message;
107
+ overlay.title = 'Import error';
108
+ overlay.visible = true;
109
+ }
110
+
111
+ document.addEventListener('WebComponentsReady', function() {
112
+ const container = document.createElement('track-view-container');
113
+ container.id = 'track_view_container';
114
+
115
+ viewer = document.createElement('tr-ui-timeline-view');
116
+ viewer.track_view_container = container;
117
+ Polymer.dom(viewer).appendChild(container);
118
+
119
+ viewer.id = 'trace-viewer';
120
+ viewer.globalMode = true;
121
+ Polymer.dom(document.body).appendChild(viewer);
122
+
123
+ //url = '../test_data/big_trace.json';
124
+ //load();
125
+ model = new tr.Model();
126
+ const i = new tr.importer.Import(model);
127
+ const p = i.importTracesWithProgressDialog([json_data]);
128
+ p.then(onModelLoaded, onImportFail);
129
+ });
130
+
131
+ }());
132
+
133
+ function updateCodeSection() {
134
+ try {
135
+ var viewer = document.getElementById("trace-viewer");
136
+ if (viewer.shadowRoot) {
137
+ var tabRoot = viewer.shadowRoot
138
+ .getElementById("analysis")
139
+ .getElementsByTagName("tr-ui-b-tab-view")[0]
140
+ .shadowRoot
141
+ var threadRoot = tabRoot.getElementById("subView")
142
+ .getElementsByTagName("tr-ui-a-single-thread-slice-sub-view")[0]
143
+ .shadowRoot;
144
+ var table = threadRoot.getElementById("content")
145
+ .shadowRoot
146
+ .getElementById("table")
147
+ var codeViewNode = threadRoot.getElementById("codeView");
148
+ var codeNode = threadRoot.getElementById("code-viewer");
149
+
150
+ var funcName = table.tableRows_[0].value.textContent;
151
+ } else {
152
+ var codeViewNode = document.getElementById("codeView");
153
+ var codeNode = document.getElementById("code-viewer");
154
+ var funcName = document.getElementById("table").tableRows_[0].value.textContent.split("\n")[0];
155
+ }
156
+
157
+ resizeCodeSection();
158
+
159
+ codeNode.innerHTML = "Unable to locate the source code";
160
+ var file_data = json_data["file_info"]["functions"][funcName];
161
+ if (file_data) {
162
+ var file_name = file_data[0];
163
+ var lineno = file_data[1];
164
+ var raw_code = json_data["file_info"]["files"][file_name][0];
165
+ var total_lineno = json_data["file_info"]["files"][file_name][1];
166
+ codeNode.innerHTML = raw_code;
167
+ Prism.highlightAll()
168
+ setTimeout(() => {
169
+ var portion = 5 + codeNode.offsetHeight * (lineno-1) / total_lineno;
170
+ codeViewNode.scrollTo(0, portion);
171
+ }, 100);
172
+ }
173
+ } catch (error) {
174
+ }
175
+ }
176
+
177
+ function resizeCodeSection() {
178
+ try {
179
+ var viewer = document.getElementById("trace-viewer");
180
+ if (viewer.shadowRoot) {
181
+ var tabRoot = viewer.shadowRoot
182
+ .getElementById("analysis")
183
+ .getElementsByTagName("tr-ui-b-tab-view")[0]
184
+ .shadowRoot
185
+ var threadRoot = tabRoot.getElementById("subView")
186
+ .getElementsByTagName("tr-ui-a-single-thread-slice-sub-view")[0]
187
+ .shadowRoot;
188
+
189
+ var height = viewer.shadowRoot.getElementById("analysis").offsetHeight - tabRoot.getElementById("tabs").offsetHeight - 7;
190
+ threadRoot.getElementById("codeView").style.height = height.toString() + "px";
191
+ } else {
192
+ var height = document.getElementById("analysis").offsetHeight - document.getElementById("tabs").offsetHeight - 7;
193
+ document.getElementById("codeView").style.height = height.toString() + "px";
194
+ }
195
+ } catch (error) {
196
+ }
197
+ }
198
+
199
+ </script>
200
+ </head>
201
+ <body>
202
+ </body>
203
+ </html>