├── public
├── robots.txt
├── favicon.ico
├── logo192.png
├── logo512.png
├── manifest.json
└── index.html
├── src
├── types
│ ├── flame-graph.ts
│ └── js-self-profiling.ts
├── index.tsx
├── index.css
├── plugins
│ └── MyPlugin.ts
├── utils
│ └── samples.ts
├── core
│ └── flame-graph-adaptor
│ │ ├── index.ts
│ │ ├── transfromSamplesToStack.ts
│ │ └── transformStackToFlameChart.ts
├── components
│ ├── chart-detail
│ │ └── index.tsx
│ ├── samples
│ │ └── index.tsx
│ ├── drag-bar
│ │ └── index.tsx
│ ├── flame-chart
│ │ └── index.tsx
│ └── header
│ │ └── index.tsx
├── App.tsx
└── test-data
│ ├── pauseFunc.json
│ ├── profiling-2025-07-20T06-35-22.json
│ └── edit-three.json
├── index.html
├── .gitignore
├── tsconfig.json
├── package.json
├── README.md
├── 使用说明.md
├── server.js
└── js-self-profiling-demo.html
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhangmingyuan666/js-self-profiling-frame-graph/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhangmingyuan666/js-self-profiling-frame-graph/HEAD/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhangmingyuan666/js-self-profiling-frame-graph/HEAD/public/logo512.png
--------------------------------------------------------------------------------
/src/types/flame-graph.ts:
--------------------------------------------------------------------------------
1 | export interface IFlameGraphData {
2 | name?: string,
3 | start?: number,
4 | duration?: number,
5 | children?: IFlameGraphData[]
6 | }
7 |
8 | export interface IFlameGraphDataRoot {
9 | children?: IFlameGraphData[]
10 | }
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 |
6 | const root = ReactDOM.createRoot(
7 | document.getElementById('root') as HTMLElement
8 | );
9 | root.render(
10 | //
11 |
12 | //
13 | );
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/src/plugins/MyPlugin.ts:
--------------------------------------------------------------------------------
1 | import {UIPlugin} from 'flame-chart-js';
2 |
3 | export class MyPlugin extends UIPlugin {
4 | constructor({name = 'myOwnPlugin'}) {
5 | super(name);
6 | }
7 |
8 | height = 100; // height of the plugin in pixels
9 |
10 | // this method will be called on each render
11 | override render() {
12 | // do something
13 | console.log(this);
14 | this.renderEngine.addRectToRenderQueue('red', 100, 0, 10);
15 | }
16 | }
--------------------------------------------------------------------------------
/src/utils/samples.ts:
--------------------------------------------------------------------------------
1 | import {nanoid} from 'nanoid';
2 | export function samplesFactory(name: string, data: any) {
3 | return {
4 | name,
5 | data,
6 | key: nanoid(),
7 | };
8 | }
9 |
10 | export function initJSONSamples(json: any[]) {
11 | return json.map((jsonData: any, index: number) => {
12 | return samplesFactory(`test${index}`, jsonData);
13 | });
14 | }
15 |
16 | export function getNumberWithToFixed(fixedNumber: number = 3) {
17 | return Number(fixedNumber.toFixed(3));
18 | }
19 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": [
5 | "dom",
6 | "dom.iterable",
7 | "esnext"
8 | ],
9 | "allowJs": true,
10 | "skipLibCheck": true,
11 | "esModuleInterop": true,
12 | "allowSyntheticDefaultImports": true,
13 | "strict": true,
14 | "forceConsistentCasingInFileNames": true,
15 | "noFallthroughCasesInSwitch": true,
16 | "module": "esnext",
17 | "moduleResolution": "node",
18 | "resolveJsonModule": true,
19 | "isolatedModules": true,
20 | "noEmit": true,
21 | "jsx": "react-jsx"
22 | },
23 | "include": [
24 | "src"
25 | ]
26 | }
27 |
--------------------------------------------------------------------------------
/src/core/flame-graph-adaptor/index.ts:
--------------------------------------------------------------------------------
1 | import {IJsSelfProfilingJSON} from '../../types/js-self-profiling';
2 | import {transformSamplesToFlameJsAdaptor} from './transformStackToFlameChart';
3 | import {transfromSamplesToStack} from './transfromSamplesToStack';
4 |
5 | export default function flameGraphAdaptor(sourceData: IJsSelfProfilingJSON) {
6 | // 做一层深拷贝,因为没有复杂数据,所以直接用这个方法进行
7 | sourceData = JSON.parse(JSON.stringify(sourceData));
8 | const {samples: sourceDataWithStack} = transfromSamplesToStack(sourceData);
9 | // console.log(sourceDataWithStack);
10 |
11 | const ans = transformSamplesToFlameJsAdaptor(sourceDataWithStack);
12 | // console.log(ans);
13 | return ans;
14 | }
15 |
--------------------------------------------------------------------------------
/src/types/js-self-profiling.ts:
--------------------------------------------------------------------------------
1 | export interface IFrame {
2 | column?: number;
3 | line?: number;
4 | name: string;
5 | resourceId?: number;
6 | }
7 |
8 | export interface IStack {
9 | frameId: number;
10 | parentId?: number;
11 | }
12 |
13 | export interface ISample {
14 | timestamp: number;
15 | index?: number;
16 | stackId?: number;
17 | stack?: IFrameRecordData[];
18 | }
19 |
20 | export interface ISampleAfterTransformStack extends ISample {
21 | index: number;
22 | stackId: number;
23 | stack: IFrameRecordData[];
24 | }
25 |
26 | export interface IJsSelfProfilingJSON {
27 | frames: IFrame[];
28 | resources: string[];
29 | samples: ISample[];
30 | stacks: IStack[];
31 | }
32 |
33 | export interface IFrameRecordData extends IFrame {
34 | name: string;
35 | resourceURI: string;
36 | }
37 |
--------------------------------------------------------------------------------
/src/components/chart-detail/index.tsx:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 | import {Card, Empty, Descriptions} from 'antd'
3 |
4 | const ChartDetail: React.FC = ({
5 | data
6 | }) => {
7 | const {
8 | info,
9 | duration,
10 | start,
11 | } = data || {}
12 | const {
13 | column, line, name, resourceURI
14 | } = info || {}
15 |
16 | return
17 | {data ?
19 | {column}
20 | {line}
21 | {resourceURI}
22 | {name}
23 | {duration}
24 | {start}
25 |
26 | : }
27 |
28 | }
29 |
30 | export default ChartDetail
31 |
32 | const ChartDetailContainer = styled.div`
33 | height: 100%;
34 | .descContainer {
35 | margin-left: 10px;
36 | }
37 | `
--------------------------------------------------------------------------------
/src/components/samples/index.tsx:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 | import {Divider, Tag, Space} from 'antd'
3 | interface ISamples {
4 | list: any
5 | onSetListIndex: any
6 | currentIndex: number
7 | }
8 |
9 | const Samples: React.FC = ({
10 | onSetListIndex,
11 | currentIndex,
12 | list
13 | }) => {
14 | const onSelect = (index: number) => {
15 | onSetListIndex(index)
16 | }
17 |
18 | return
19 | DataList
20 |
21 | {
22 | list.map((item: any, index: number) => {
23 | return onSelect(index)}
27 | className="tags"
28 | >
29 | {item.name}
30 |
31 | })
32 | }
33 |
34 |
35 | }
36 |
37 | export default Samples
38 |
39 | const SamplesContainer = styled.div`
40 | display: flex;
41 | flex-direction: column;
42 |
43 | .tags {
44 | display: flex;
45 | align-items: center;
46 | justify-content: center;
47 | height: 40px
48 | }
49 | `
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import FlameGraph from './components/flame-chart';
2 | import Header from './components/header'
3 | import Samples from './components/samples'
4 | import styled from 'styled-components'
5 | import {useEffect, useState} from 'react';
6 | import EditorTest from './test-data/editorTest.json'
7 | import PauseFunc from './test-data/pauseFunc.json'
8 | import EditFoo from './test-data/edit-foo.json'
9 | import EditTwo from './test-data/edit-two.json'
10 | import EditThree from './test-data/edit-three.json'
11 | import {initJSONSamples} from './utils/samples';
12 | function App() {
13 | const [JSONSamples, setJSONSamples] = useState([])
14 | const [currentIndex, setCurrentIndex] = useState(0)
15 |
16 | useEffect(() => {
17 | const ans: any = initJSONSamples([PauseFunc, EditorTest, EditFoo, EditTwo, EditThree])
18 | setJSONSamples(ans)
19 | }, [])
20 |
21 | return (
22 |
23 |
24 |
25 | {
26 | JSONSamples.length &&
27 | }
28 |
29 | );
30 | }
31 |
32 | export default App;
33 |
34 | const AppContainer = styled.div`
35 | min-width: 400px;
36 | padding: 0 20px;
37 | margin: 0 auto;
38 | `
39 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "js-self-profiling-frame-graph",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^5.16.5",
7 | "@testing-library/react": "^13.4.0",
8 | "@testing-library/user-event": "^13.5.0",
9 | "@types/jest": "^27.5.2",
10 | "@types/node": "^16.18.18",
11 | "@types/react": "^18.0.28",
12 | "@types/react-dom": "^18.0.11",
13 | "antd": "^5.3.3",
14 | "flame-chart-js": "^2.3.1",
15 | "nanoid": "^4.0.2",
16 | "react": "^18.2.0",
17 | "react-dom": "^18.2.0",
18 | "react-scripts": "5.0.1",
19 | "styled-components": "^5.3.9",
20 | "typescript": "^4.9.5",
21 | "use-resize-observer": "^9.1.0",
22 | "web-vitals": "^2.1.4"
23 | },
24 | "scripts": {
25 | "start": "react-scripts start",
26 | "build": "react-scripts build",
27 | "test": "react-scripts test",
28 | "eject": "react-scripts eject"
29 | },
30 | "eslintConfig": {
31 | "extends": [
32 | "react-app",
33 | "react-app/jest"
34 | ]
35 | },
36 | "browserslist": {
37 | "production": [
38 | ">0.2%",
39 | "not dead",
40 | "not op_mini all"
41 | ],
42 | "development": [
43 | "last 1 chrome version",
44 | "last 1 firefox version",
45 | "last 1 safari version"
46 | ]
47 | },
48 | "devDependencies": {
49 | "@types/styled-components": "^5.1.26"
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 |
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # js-self-profiling-frame-chart
2 |
3 | A frame chart which display js-self-profiling json data
4 |
5 | 用于将`js-self-profiling` 导出的`json`数据转化为火焰图
6 |
7 | 
8 | 
9 |
10 | # 效果概览
11 |
12 | 查看预览效果(vercel)
13 |
14 | 您可以上传您的js-self-profiling json数据到如上vercel站点中
15 |
16 |
17 |
18 | # 如何使用
19 |
20 | 1. `npm i`
21 | 2. `npm start`
22 |
23 | # 如何加载数据?
24 |
25 | 需要导入js-self-profiling的数据
26 |
27 | 将它在`src/components/flame-chart.ts`中引入,或者拖拽放入主项目即可即可
28 |
29 | ## Example
30 |
31 | ```tsx
32 | import EditorTest from '../../test-data/editorTest.json'
33 |
34 | const chartData = flameGraphAdaptor(EditorTest)
35 | ```
36 |
37 | ## 如何获取到`js-self-profiling` 数据
38 |
39 | ### 让Chrome有使用`js-self-profiling`的权限
40 |
41 | 对于新兴API,在Chrome中默认禁止使用,而如果您想要开启这个功能,请在你项目的html响应的请求头中添加
42 |
43 | `Document-Policy: js-profiling`
44 |
45 | 如下静态代码即最小demo,您可以
46 |
47 | ```js
48 | // 当前文件路径dirname
49 | const folderPath = path.resolve(__dirname, "./static");
50 |
51 | const server = http.createServer((req, res) => {
52 | // 收到 127.0.0.1:3000/index.html 我们返回index.html资源
53 | try {
54 | // 获取路径后缀 index.html
55 | const info = url.parse(req.url);
56 |
57 | // 文件夹路径 + 需要获取的资源路径
58 | const filePath = path.resolve(folderPath, "./" + info.path);
59 |
60 | // 流读取
61 | const fileStream = fs.createReadStream(filePath);
62 |
63 | // 设置响应头,以让chorme允许您采用js-self-profiling规范
64 | res.setHeader('Document-Policy', 'js-profiling')
65 | fileStream.pipe(res);
66 | } catch (err) {
67 | console.log('err');
68 | }
69 | });
70 | ```
71 |
72 | 总而言之,只要想办法让您的项目中的html文件的网络响应具有此响应头,就可以使用`js-self-profiling` API
73 |
74 | ### 如何获取`js-self-profiling`数据
75 |
76 | ```tsx
77 | // start
78 | const profiler = new Profiler({ sampleInterval: 10, maxBufferSize: 10000 });
79 |
80 | setTimeout(async () => {
81 | // select
82 | const trace = await profiler.stop();
83 | const traceJson = JSON.stringify(trace);
84 | console.log(traceJson);
85 | }, 5000);
86 | ```
87 |
88 | 此时`traceJson` 数据就是我们期望的`js-self-profiling`数据
89 |
90 | 将`traceJson`数据放入此项目中,即可实现基本的数据分析
91 |
92 | # 如果出现分析错误或存疑
93 |
94 | 联系 Email:`2369558390@qq.com`
95 |
96 |
--------------------------------------------------------------------------------
/src/components/drag-bar/index.tsx:
--------------------------------------------------------------------------------
1 | import {useEffect, useRef, useState} from 'react'
2 | import styled from 'styled-components'
3 |
4 | enum STATUS {
5 | idle = 'idle',
6 | dragging = 'dragging'
7 | }
8 |
9 | interface IDragBar {
10 | containerRef: any
11 | setDragBar: any
12 | }
13 |
14 | const minLeft = 30;
15 | const minRight = 80;
16 |
17 | export const DragBar: React.FC = ({
18 | containerRef,
19 | setDragBar
20 | }) => {
21 | const dragBarRef = useRef()
22 | const statusRef = useRef(STATUS.idle)
23 | const [, forceUpdate] = useState({})
24 |
25 | useEffect(() => {
26 | if (containerRef.current) {
27 | containerRef.current.addEventListener('mousemove', (e: React.MouseEvent) => {
28 | e.preventDefault()
29 | if (statusRef.current === STATUS.dragging && containerRef.current) {
30 | const {x = 0, width = 0} = containerRef.current?.getBoundingClientRect() || {}
31 | const offsetWithPercentage = Math.floor((e.clientX - x) / width * 100)
32 |
33 | if (offsetWithPercentage < minLeft) {
34 | setDragBar(minLeft)
35 | return
36 | }
37 | if (offsetWithPercentage > minRight) {
38 | setDragBar(minRight)
39 | return
40 | }
41 | setDragBar(offsetWithPercentage)
42 | }
43 | })
44 |
45 | containerRef.current.addEventListener('mouseup', (e: React.MouseEvent) => {
46 | e.preventDefault()
47 | statusRef.current = STATUS.idle;
48 | forceUpdate({})
49 | })
50 | }
51 | }, [])
52 |
53 | const onMouseDown = (e: React.MouseEvent) => {
54 | e.preventDefault()
55 | statusRef.current = STATUS.dragging
56 | }
57 |
58 | const onMouseUp = (e: React.MouseEvent) => {
59 | e.preventDefault()
60 | statusRef.current = STATUS.idle
61 | }
62 |
63 | return
67 |
68 |
69 |
70 |
71 | }
72 |
73 | export default DragBar
74 |
75 | const DragBarContainer = styled.div`
76 | width: 10px;
77 | transition: all 0.15s;
78 |
79 | .dragBar {
80 | height: 100%;
81 | display: flex;
82 | background: #ccc;
83 | flex-direction: column;
84 | transition: 0.5s all;
85 |
86 | &:hover {
87 | background: #000;
88 | }
89 | }
90 |
91 | .dragBar-active {
92 | background: #000;
93 | }
94 | `
95 |
96 |
--------------------------------------------------------------------------------
/src/core/flame-graph-adaptor/transfromSamplesToStack.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * @author zhangmingyuan01
3 | * @description 提供将js-self-profiling的json数据转换为有stack属性的调用栈数据结构的数据结构
4 | * stack: [{fun1}, {fun2}, {fun3}] 呈现出调用栈
5 | */
6 |
7 | import {getNumberWithToFixed} from '../../utils/samples';
8 | import {IFrameRecordData, IJsSelfProfilingJSON, ISample} from '../../types/js-self-profiling';
9 |
10 | /**
11 | * @description 入口函数,用于进行上述转换
12 | * @param sourceData js-self-profiling 导出的数据
13 | * @returns sourceData中的samples数组中,如果存在函数调用栈,那么都被添加上当前时间戳对应的所有函数调用栈(key: stack)
14 | */
15 | export function transfromSamplesToStack(sourceData: IJsSelfProfilingJSON) {
16 | const {
17 | samples, // samples[i]函数执行时间下标,升序
18 | // resources, // resources[i]资源uri
19 | // frames, // frames[i] i下表下的函数对象,包含函数名和函数的line和col
20 | // stacks, // stacks[i] 调用栈记录
21 | } = sourceData;
22 |
23 | // 遍历samples,为存在stackId的sample添加stack数据结构
24 | samples.forEach((sample: ISample, i: number) => {
25 | const {stackId, timestamp} = sample;
26 | sample.timestamp = getNumberWithToFixed(timestamp);
27 |
28 | // 只有有函数调用栈的才需要被处理
29 | if (stackId) {
30 | handleStack(stackId, sample, sourceData, i);
31 | }
32 | });
33 |
34 | // 因为需要把绝对时间转换为相对时间,所以必须加入一个虚拟的时间作为结尾,这个时间为10ms
35 | addLastSample(samples);
36 |
37 | return sourceData;
38 | }
39 |
40 | /**
41 | * @description 用于为每个samples依据自己的顶层stackId而计算出所有的调用栈,收集在stack数据结构里(dfs)
42 | * @param stackId 标识当前调用栈顶的id
43 | * @param sample js-self-profiling的samples数据,此时已经有了
44 | * @param sourceData js-self-profiling的全部数据
45 | * @param i 标识当前stack中的是在大samples哪个index中,日后方便查询,进行相对时间的计算(持续时间: t2-t1)
46 | */
47 | function handleStack(stackId: number, sample: ISample, sourceData: IJsSelfProfilingJSON, i: number) {
48 | // frameId是当前stack中frame的下标;parentId是父亲的stack的下标
49 | const {frameId, parentId} = sourceData.stacks[stackId];
50 | // 当前栈顶函数对应的frame
51 | const frame = sourceData.frames[frameId];
52 |
53 | // 标识当前函数调用栈对应的资源
54 | let {resourceId} = frame;
55 | resourceId = resourceId ?? -1;
56 | const resource = resourceId >= 0 ? sourceData.resources[resourceId] : ''; // 当前地址
57 |
58 | // 记录当前数据,如果没有函数名视为是匿名函数
59 | const recordData: IFrameRecordData = {
60 | ...frame,
61 | name: frame.name || '(anonymous)',
62 | resourceURI: resource,
63 | };
64 |
65 | // 为什么需要给他index? 后续需要将绝对时间转化为相对时间的计算,必要情况下需要进行index之间的时间记录
66 | sample.index = i;
67 |
68 | // 把每个函数调用栈中函数的对应信息记录在stack数组里
69 | sample.stack = sample.stack || [];
70 | sample.stack.unshift(recordData);
71 |
72 | // 如果有父调用栈,递归处理
73 | if (parentId) {
74 | handleStack(parentId, sample, sourceData, i);
75 | }
76 | }
77 |
78 | /**
79 | * @description 因为需要把绝对时间转换为相对时间,所以必须加入一个虚拟的时间作为结尾,这个时间为10ms
80 | * @param samples
81 | */
82 | function addLastSample(samples: ISample[]) {
83 | const lastSample = samples[samples.length - 1];
84 | const lastTimeStamp: ISample = {
85 | // 为最后一个
86 | timestamp: lastSample.timestamp + 10,
87 | };
88 |
89 | samples.push(lastTimeStamp);
90 | }
91 |
92 |
--------------------------------------------------------------------------------
/使用说明.md:
--------------------------------------------------------------------------------
1 | # JS Self Profiling 数据生成工具使用说明
2 |
3 | ## 概述
4 |
5 | 这个工具包含一个 HTML 页面和一个 HTTP 服务器,用于生成符合 `js-self-profiling` 规范的性能分析数据。生成的 JSON 数据可以直接导入到您的火焰图项目中进行分析。
6 |
7 | ## 文件说明
8 |
9 | - `js-self-profiling-demo.html` - 主要的演示页面,包含性能分析功能
10 | - `server.js` - HTTP 服务器,提供正确的响应头支持
11 | - `使用说明.md` - 本说明文档
12 |
13 | ## 使用步骤
14 |
15 | ### 1. 启动服务器
16 |
17 | ```bash
18 | node server.js
19 | ```
20 |
21 | 服务器将在 `http://localhost:3000` 启动。
22 |
23 | ### 2. 访问演示页面
24 |
25 | 在 Chrome 浏览器中打开:
26 |
27 | ```
28 | http://localhost:3000/js-self-profiling-demo.html
29 | ```
30 |
31 | ### 3. 使用性能分析工具
32 |
33 | 1. **开始分析**:点击"开始分析"按钮启动性能分析器
34 | 2. **生成数据**:在分析期间执行以下操作:
35 | - 点击"执行计算任务"按钮
36 | - 在页面上进行交互
37 | - 滚动页面
38 | - 执行其他 JavaScript 操作
39 | 3. **停止分析**:点击"停止分析"按钮结束分析
40 | 4. **保存数据**:
41 | - 点击"下载数据"按钮保存 JSON 文件到本地
42 | - 点击"保存到项目"按钮将数据直接保存到项目的 `src/test-data` 目录
43 |
44 | ## 重要注意事项
45 |
46 | ### 浏览器要求
47 |
48 | - **必须使用 Chrome 浏览器**(js-self-profiling API 目前只在 Chrome 中实现)
49 | - 建议使用 Chrome 94 或更高版本
50 |
51 | ### 访问方式
52 |
53 | - **必须通过 HTTP 服务器访问**,不能直接打开 HTML 文件(file://协议)
54 | - 服务器会自动设置 `Document-Policy: js-profiling` 响应头
55 |
56 | ### API 支持检查
57 |
58 | 页面会自动检查浏览器是否支持 js-self-profiling API,如果不支持会显示错误信息。
59 |
60 | ## 生成的数据格式
61 |
62 | 下载的 JSON 文件包含以下主要字段:
63 |
64 | ```json
65 | {
66 | "samples": [...], // 性能样本数据
67 | "resources": [...], // 资源信息
68 | "frames": [...], // 函数帧信息
69 | "stacks": [...] // 调用栈信息
70 | }
71 | ```
72 |
73 | ## 数据导入到火焰图项目
74 |
75 | ### 方式一:手动导入(下载数据)
76 |
77 | 1. 将下载的 JSON 文件复制到您的火焰图项目中
78 | 2. 在 `src/components/flame-chart.ts` 中导入数据:
79 |
80 | ```tsx
81 | import YourProfilingData from '../../path/to/your-data.json';
82 |
83 | const chartData = flameGraphAdaptor(YourProfilingData);
84 | ```
85 |
86 | ### 方式二:自动保存到项目(推荐)
87 |
88 | 1. 点击"保存到项目"按钮,数据会自动保存到 `src/test-data` 目录
89 | 2. 保存成功后,页面会显示导入代码示例
90 | 3. 直接复制显示的代码到您的项目中使用
91 |
92 | ## 故障排除
93 |
94 | ### 问题:API 不可用
95 |
96 | **解决方案**:
97 |
98 | 1. 确保使用 Chrome 浏览器
99 | 2. 确保通过 HTTP 服务器访问(http://localhost:3000)
100 | 3. 检查 Chrome 版本是否支持 js-self-profiling
101 |
102 | ### 问题:服务器启动失败
103 |
104 | **解决方案**:
105 |
106 | 1. 确保端口 3000 未被占用
107 | 2. 检查 Node.js 是否正确安装
108 | 3. 尝试使用其他端口(修改 server.js 中的 PORT 变量)
109 |
110 | ### 问题:下载的数据为空
111 |
112 | **解决方案**:
113 |
114 | 1. 确保在分析期间执行了足够的操作
115 | 2. 检查浏览器控制台是否有错误信息
116 | 3. 尝试延长分析时间
117 |
118 | ### 问题:保存到项目失败
119 |
120 | **解决方案**:
121 |
122 | 1. 确保服务器正在运行
123 | 2. 检查 `src/test-data` 目录是否存在且有写入权限
124 | 3. 查看浏览器控制台是否有网络错误
125 | 4. 确保数据已成功生成(先完成分析再保存)
126 |
127 | ## 技术细节
128 |
129 | ### 性能分析器配置
130 |
131 | ```javascript
132 | new Profiler({
133 | sampleInterval: 10, // 采样间隔(毫秒)
134 | maxBufferSize: 10000, // 最大缓冲区大小
135 | });
136 | ```
137 |
138 | ### 响应头设置
139 |
140 | 服务器自动设置以下响应头:
141 |
142 | ```
143 | Document-Policy: js-profiling
144 | ```
145 |
146 | 这允许 Chrome 浏览器启用 js-self-profiling API。
147 |
148 | ### API 端点
149 |
150 | 服务器提供以下 API 端点:
151 |
152 | - `POST /api/save-data` - 保存性能分析数据到 `src/test-data` 目录
153 | - `GET /api/list-test-data` - 获取 `src/test-data` 目录中的文件列表
154 |
155 | ## 联系支持
156 |
157 | 如果遇到问题,请联系:`2369558390@qq.com`
158 |
--------------------------------------------------------------------------------
/src/components/flame-chart/index.tsx:
--------------------------------------------------------------------------------
1 | import {FlameChart, FlameChartContainer, FlameChartPlugin, TimeGridPlugin} from 'flame-chart-js';
2 | import {useCallback, useEffect, useRef, useState} from 'react';
3 | import flameGraphAdaptor from '../../core/flame-graph-adaptor';
4 | import {MyPlugin} from '../../plugins/MyPlugin';
5 | import EditorTest from '../../test-data/editorTest.json'
6 | import PauseFunc from '../../test-data/pauseFunc.json'
7 | import useResizeObserver from 'use-resize-observer';
8 | import ChartDetail from '../chart-detail';
9 | import styled from 'styled-components'
10 | import {Divider, message} from 'antd'
11 | import DragBar from '../drag-bar';
12 |
13 | interface IFlameGraph {
14 | currentSamples: any,
15 | currentIndex: number
16 | }
17 |
18 | const DEFAULT_OFFSET = 70;
19 | const WIDTH_OF_DRAGBAR = 10;
20 |
21 | const FlameGraph: React.FC = ({
22 | currentSamples,
23 | currentIndex
24 | }) => {
25 | const chartRef = useRef(); //拿到canvas容器
26 | const boxRef = useRef(); // 拿到container容器
27 | const chartShadowRef = useRef();
28 | const detailBoxRef = useRef();
29 | const containerRef = useRef()
30 | const [selectInfo, setSelectInfo] = useState(null)
31 | const {data} = currentSamples
32 |
33 | const [offset, setOffset] = useState(DEFAULT_OFFSET);
34 |
35 | const leftCalc = `calc(${offset}% - ${WIDTH_OF_DRAGBAR}px)`
36 | const rightCalc = `calc(100% - ${offset}% - ${WIDTH_OF_DRAGBAR}px)`
37 |
38 | const initialize = useCallback(() => {
39 | try {
40 | if (chartRef.current && boxRef.current) {
41 | const {width = 0, height = 0} = boxRef.current.getBoundingClientRect();
42 |
43 | chartRef.current.width = width;
44 | chartRef.current.height = height - 3;
45 |
46 | const chartData = flameGraphAdaptor(data)
47 | const canvas = chartRef.current
48 |
49 | const flameChart = new FlameChart({
50 | canvas, // mandatory
51 | //timeseries: [/* ... */],
52 | timeframeTimeseries: [/* ... */],
53 | data: [
54 | chartData as any,
55 | ],
56 | settings: {
57 | options: {
58 | timeUnits: 'ms',
59 | },
60 | },
61 | });
62 | flameChart.on('select', (element: any) => {
63 | const {node} = element || {}
64 | if (node) {
65 | const {source} = node
66 | if (source) {
67 | setSelectInfo(source)
68 | }
69 | }
70 | });
71 | chartShadowRef.current = flameChart
72 | }
73 | } catch (err) {
74 | message.error("Please upload data in json-self-profiling format")
75 | }
76 | }, [data, chartRef]);
77 |
78 | useEffect(() => {
79 | initialize()
80 | }, [initialize])
81 |
82 | useResizeObserver({
83 | ref: boxRef,
84 | onResize: ({width = 0, height = 0}) => {
85 | chartShadowRef.current?.resize(width, height - 3)
86 | },
87 | });
88 |
89 |
90 | return
91 | Chart
92 |
93 |
96 |
97 |
98 |
99 |
102 |
103 |
104 |
105 |
106 | }
107 |
108 | export default FlameGraph
109 |
110 | const ChartContainer = styled.div`
111 | .board {
112 | height: 600px;
113 | display: flex;
114 | .boxContainer {
115 | height: 100%;
116 | }
117 |
118 | .detailBox {
119 | height: 100%;
120 | }
121 | }
122 |
123 | `
--------------------------------------------------------------------------------
/src/components/header/index.tsx:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components'
2 | import {Button, message} from 'antd'
3 | import React, {useRef, useState} from 'react';
4 | import {samplesFactory} from '../../utils/samples';
5 |
6 | interface IHeader {
7 | setList: any
8 | list: any[]
9 | }
10 | const Header: React.FC = ({setList, list}) => {
11 | function App() {
12 | const [isDragging, setIsDragging] = useState(false);
13 | const uploadFileRef = useRef()
14 |
15 | function handleDragEnter(event: React.DragEvent) {
16 | event.preventDefault();
17 | setIsDragging(true);
18 | }
19 |
20 | function handleDragLeave(event: React.DragEvent) {
21 | event.preventDefault();
22 | setIsDragging(false);
23 | }
24 |
25 | function handleDrop(event: React.DragEvent) {
26 | event.preventDefault();
27 | setIsDragging(false);
28 | const files = event.dataTransfer.files;
29 | handleFiles(files);
30 | }
31 |
32 | function onchange(event: any) {
33 | if (uploadFileRef.current) {
34 | handleFiles(uploadFileRef.current.files)
35 | }
36 | }
37 |
38 | function handleFiles(files: any) {
39 | for (const file of files) {
40 | // 在这里处理文件内容
41 | const {name, type} = file
42 | if (type !== "application/json") {
43 | message.error("Please upload data in json-self-profiling format")
44 | continue
45 | }
46 | const reader = new FileReader();
47 | reader.onload = () => {
48 | const data = JSON.parse(reader.result as string);
49 | const sample = samplesFactory(name, data)
50 | setList((prev: any) => {
51 | return [...prev, sample]
52 | })
53 | };
54 | reader.readAsText(file);
55 | }
56 | }
57 |
58 | return (
59 |
76 | );
77 | }
78 |
79 |
80 | return
81 |
82 |
js-self-profiling-frame-graph
83 |
A framework that parses the JSON exported by js-self-profiling-api into a flame graph
84 |
85 |
88 |
89 | }
90 |
91 | const HeaderContainer = styled.div`
92 | display:flex;
93 | justify-content: space-between;
94 | align-items: center;
95 | height: 60px;
96 | margin-bottom: 10px;
97 | border-bottom: 1px solid #ccc;
98 |
99 | .header-logo {
100 | .header-title {
101 | font-size: 16px;
102 | }
103 |
104 | .header-desc {
105 | font-size: 12px;
106 | color: rgb(113 105 105);
107 | }
108 | }
109 |
110 | /* 隐藏默认的文件选择按钮 */
111 | input[type="file"] {
112 | display: none;
113 | }
114 |
115 | /* 自定义文件选择按钮 */
116 | .upload-btn {
117 | display: inline-block;
118 | width: 100%;
119 | height: 100%;
120 | cursor: pointer;
121 | }
122 |
123 |
124 | /* 将自定义按钮与文件名称组合在一起 */
125 | .upload-container {
126 | position: relative;
127 | display: inline-block;
128 | width: 100%;
129 | height: 100%;
130 | }
131 |
132 | .upload-container input[type="file"] {
133 | position: absolute;
134 | left: 0;
135 | top: 0;
136 | opacity: 0;
137 | cursor: pointer;
138 | width: 100%;
139 | height: 100%;
140 | }
141 | `
142 |
143 | export default Header
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | const http = require('http');
2 | const fs = require('fs');
3 | const path = require('path');
4 | const url = require('url');
5 |
6 | const PORT = 3000;
7 | const TEST_DATA_DIR = path.join(__dirname, 'src', 'test-data');
8 |
9 | // 创建HTTP服务器
10 | const server = http.createServer((req, res) => {
11 | try {
12 | // 解析请求URL
13 | const parsedUrl = url.parse(req.url);
14 | let filePath = parsedUrl.pathname;
15 |
16 | // 处理保存数据的API请求
17 | if (filePath === '/api/save-data' && req.method === 'POST') {
18 | handleSaveData(req, res);
19 | return;
20 | }
21 |
22 | // 处理获取test-data目录文件列表的API请求
23 | if (filePath === '/api/list-test-data' && req.method === 'GET') {
24 | handleListTestData(req, res);
25 | return;
26 | }
27 |
28 | // 默认提供HTML文件
29 | if (filePath === '/') {
30 | filePath = '/js-self-profiling-demo.html';
31 | }
32 |
33 | // 构建完整的文件路径
34 | const fullPath = path.join(__dirname, filePath);
35 |
36 | // 检查文件是否存在
37 | if (!fs.existsSync(fullPath)) {
38 | res.writeHead(404, { 'Content-Type': 'text/plain' });
39 | res.end('文件未找到');
40 | return;
41 | }
42 |
43 | // 读取文件
44 | const fileStream = fs.createReadStream(fullPath);
45 |
46 | // 设置响应头
47 | // 关键:设置Document-Policy响应头以允许js-self-profiling API
48 | res.setHeader('Document-Policy', 'js-profiling');
49 |
50 | // 根据文件扩展名设置Content-Type
51 | const ext = path.extname(fullPath);
52 | let contentType = 'text/plain';
53 |
54 | switch (ext) {
55 | case '.html':
56 | contentType = 'text/html';
57 | break;
58 | case '.js':
59 | contentType = 'application/javascript';
60 | break;
61 | case '.css':
62 | contentType = 'text/css';
63 | break;
64 | case '.json':
65 | contentType = 'application/json';
66 | break;
67 | }
68 |
69 | res.setHeader('Content-Type', contentType);
70 |
71 | // 流式传输文件内容
72 | fileStream.pipe(res);
73 |
74 | } catch (err) {
75 | console.error('服务器错误:', err);
76 | res.writeHead(500, { 'Content-Type': 'text/plain' });
77 | res.end('服务器内部错误');
78 | }
79 | });
80 |
81 | // 处理保存数据的API
82 | function handleSaveData(req, res) {
83 | let body = '';
84 |
85 | req.on('data', chunk => {
86 | body += chunk.toString();
87 | });
88 |
89 | req.on('end', () => {
90 | try {
91 | const data = JSON.parse(body);
92 | const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-');
93 | const filename = `profiling-${timestamp}.json`;
94 | const filepath = path.join(TEST_DATA_DIR, filename);
95 |
96 | // 确保test-data目录存在
97 | if (!fs.existsSync(TEST_DATA_DIR)) {
98 | fs.mkdirSync(TEST_DATA_DIR, { recursive: true });
99 | }
100 |
101 | // 写入文件
102 | fs.writeFileSync(filepath, JSON.stringify(data, null, 2));
103 |
104 | res.writeHead(200, {
105 | 'Content-Type': 'application/json',
106 | 'Access-Control-Allow-Origin': '*',
107 | 'Access-Control-Allow-Methods': 'POST, OPTIONS',
108 | 'Access-Control-Allow-Headers': 'Content-Type'
109 | });
110 | res.end(JSON.stringify({
111 | success: true,
112 | message: '数据保存成功',
113 | filename: filename,
114 | filepath: filepath
115 | }));
116 |
117 | console.log(`✅ 数据已保存到: ${filepath}`);
118 |
119 | } catch (error) {
120 | console.error('保存数据时出错:', error);
121 | res.writeHead(500, {
122 | 'Content-Type': 'application/json',
123 | 'Access-Control-Allow-Origin': '*'
124 | });
125 | res.end(JSON.stringify({
126 | success: false,
127 | message: '保存数据失败: ' + error.message
128 | }));
129 | }
130 | });
131 | }
132 |
133 | // 处理获取test-data目录文件列表的API
134 | function handleListTestData(req, res) {
135 | try {
136 | if (!fs.existsSync(TEST_DATA_DIR)) {
137 | res.writeHead(200, {
138 | 'Content-Type': 'application/json',
139 | 'Access-Control-Allow-Origin': '*'
140 | });
141 | res.end(JSON.stringify({ files: [] }));
142 | return;
143 | }
144 |
145 | const files = fs.readdirSync(TEST_DATA_DIR)
146 | .filter(file => file.endsWith('.json'))
147 | .map(file => ({
148 | name: file,
149 | path: `src/test-data/${file}`,
150 | size: fs.statSync(path.join(TEST_DATA_DIR, file)).size,
151 | modified: fs.statSync(path.join(TEST_DATA_DIR, file)).mtime
152 | }));
153 |
154 | res.writeHead(200, {
155 | 'Content-Type': 'application/json',
156 | 'Access-Control-Allow-Origin': '*'
157 | });
158 | res.end(JSON.stringify({ files }));
159 |
160 | } catch (error) {
161 | console.error('获取文件列表时出错:', error);
162 | res.writeHead(500, {
163 | 'Content-Type': 'application/json',
164 | 'Access-Control-Allow-Origin': '*'
165 | });
166 | res.end(JSON.stringify({
167 | success: false,
168 | message: '获取文件列表失败: ' + error.message
169 | }));
170 | }
171 | }
172 |
173 | // 启动服务器
174 | server.listen(PORT, () => {
175 | console.log(`🚀 服务器已启动在 http://localhost:${PORT}`);
176 | console.log(`📄 访问 js-self-profiling 演示页面: http://localhost:${PORT}/js-self-profiling-demo.html`);
177 | console.log(`⚠️ 重要提示:`);
178 | console.log(` 1. 确保使用 Chrome 浏览器访问`);
179 | console.log(` 2. 服务器已设置 Document-Policy: js-profiling 响应头`);
180 | console.log(` 3. 如果API不可用,请检查Chrome版本是否支持js-self-profiling`);
181 | console.log(`\n按 Ctrl+C 停止服务器`);
182 | });
183 |
184 | // 优雅关闭
185 | process.on('SIGINT', () => {
186 | console.log('\n🛑 正在关闭服务器...');
187 | server.close(() => {
188 | console.log('✅ 服务器已关闭');
189 | process.exit(0);
190 | });
191 | });
--------------------------------------------------------------------------------
/src/core/flame-graph-adaptor/transformStackToFlameChart.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * @author zhangmingyuan01
3 | * @description 将已经带着stack的samples们转化成火焰图的数据结构
4 | * 关键 -> stack的纵向结构转化为横向的数据结构
5 | */
6 |
7 | import {getNumberWithToFixed} from '../../utils/samples';
8 | import {IFlameGraphData, IFlameGraphDataRoot} from '../../types/flame-graph';
9 | import {ISample, ISampleAfterTransformStack} from '../../types/js-self-profiling';
10 |
11 | /**
12 | * @description 入口函数,主要做了两件事情
13 | * 1. 明确有持续函数调用的区间,分而治之(快慢指针)
14 | * 2. 将有持续函数调用的区间通过处理(回溯算法+快慢指针),将纵向的stack数据结构转化为横向的火焰图数据结构
15 | * @param samples 已经有stack数据结构的samples
16 | * @returns 返回横向的火焰图数据结构
17 | */
18 | export function transformSamplesToFlameJsAdaptor(samples: ISample[]) {
19 | const n = samples.length;
20 | const duplicateSamples: ISampleAfterTransformStack[][] = [];
21 |
22 | // 1. 明确有持续函数调用的区间,分而治之(快慢指针)
23 | duplicateSamplesAction(0, n, samples, duplicateSamples);
24 |
25 | const ans: IFlameGraphDataRoot = {
26 | children: [],
27 | };
28 |
29 | for (let i = 0; i < duplicateSamples.length; i++) {
30 | // 此部分区间的samples,我们需要单独进行组装
31 | const partialSamples = duplicateSamples[i];
32 | const childrenData: IFlameGraphData = {};
33 | handleChildrenOfEachLevel(0, partialSamples.length, partialSamples, childrenData, 0, samples);
34 | if (childrenData.children) {
35 | ans.children!.push(childrenData.children[0]);
36 | }
37 | }
38 |
39 | return ans;
40 | }
41 |
42 | /**
43 | *
44 | * @param slow 慢指针
45 | * @param n 总样本量
46 | * @param samples 待有stack的samples
47 | * @param ans 收集结果的数组 ISampleAfterTransformStack[][] 此数据结构的每个元素都具有stack 可以确定有调用栈持续
48 | * @param currentStackIndex 当前深度,由于我们只有对于函数是否存在的需求,所以只需要知道有没有stack就行,我们拿0即可(代表第一层)
49 | */
50 | function duplicateSamplesAction(slow: number, n: number,
51 | samples: ISample[], ans: ISampleAfterTransformStack[][], currentStackIndex: number = 0) {
52 | while (slow < n) {
53 | // 获取当前慢指针所对应的stack
54 | const currentSample = samples[slow];
55 | const currentStack = currentSample.stack;
56 |
57 | // 如果当前函数没有调用栈,那么不需要进行标记
58 | if (!currentStack) {
59 | slow++;
60 | continue;
61 | }
62 |
63 | // 获取当前stack的 currentStackIndex:深度 的函数名
64 | const currentStackName = currentStack[currentStackIndex].name;
65 |
66 | // 收集连续区间的数组
67 | const partialStack: ISampleAfterTransformStack[] = [];
68 |
69 | for (let fast = slow; fast < n; fast++) {
70 | // 获取快指针所对应的sample
71 | const currentTargetSample = samples[fast];
72 | const {stack: currentTargetSampleStack} = currentTargetSample;
73 |
74 | /**
75 | * 如果快指针所对应的samples出现以下情况
76 | * 1. 没有stack了
77 | * 2. 函数名改变了(或者是其他指标改变了)
78 | * 反正可以证明当前函数终止
79 | * 那么此时说明,当前底层函数调用阻塞(火焰图的底层调用栈)结束
80 | * 1. 终止本次循环
81 | * 2. 把慢指针放到快指针的位置,如下同理
82 | */
83 | if (!currentTargetSampleStack ||
84 | currentTargetSampleStack[currentStackIndex].name !== currentStackName) {
85 | slow = fast;
86 | break;
87 | }
88 |
89 | // 如果可以走到这一步,那么可以证明当前这个区间是有函数执行区间的,所以可以用 ISampleAfterTransformStack 类型进行标识
90 | // 将当前栈和当前栈的对应信息放入当前区间
91 | partialStack.push(currentTargetSample as ISampleAfterTransformStack);
92 |
93 | // 此时fast快指针已经到了最后一个元素,查看是否可以通过下方检测
94 | if (fast === n - 1) {
95 | slow = fast;
96 | break;
97 | }
98 | }
99 |
100 | // 收集当前区间,并放入ans中,然后继续计算下一个区间
101 | ans.push(partialStack);
102 | slow++;
103 | }
104 | }
105 |
106 | /**
107 | * @description 核心函数:将有函数调用栈的samples区间转化为火焰图的数据结构
108 | * 首先进行本层遍历,直到出现函数名改变或者空调用栈,此时进行DFS收集数据
109 | * 随后收集至没有子调用栈了,回到本层继续遍历,继续手机
110 | * @param slow 慢指针
111 | * @param n 当前区间的总长度
112 | * @param samples 具有stack的所有samples
113 | * @param flameResultData 当前这一层的数据结构(最为最终数据结构的一个子数据结构)
114 | * @param depth 当前深度
115 | * @param allSamples 所有samples
116 | */
117 | function handleChildrenOfEachLevel(slow: number, n: number, samples: ISampleAfterTransformStack[],
118 | flameResultData: IFlameGraphData, depth = 0, allSamples: ISample[]
119 | ) {
120 | while (slow < n) {
121 | // 此时慢指针对应的的sample一定有stack,但是stack数组的currentStackIndex深度中不保证有调用栈
122 | let currentSample = samples[slow];
123 | let currentStack = currentSample.stack;
124 |
125 | // 如果currentStackIndex深度下没有调用栈了,那么推进慢指针,拦截处理
126 | if (!currentStack[depth]) {
127 | slow++;
128 | continue;
129 | }
130 |
131 | // 如果currentStackIndex深度下没有调用栈了,那么推进慢指针,拦截处理
132 | for (let fast = slow; fast < n; fast++) {
133 | // 推进当前快指针
134 | const currentTargetSample = samples[fast];
135 | const currentTargetSampleStack = currentTargetSample.stack;
136 | // 如果j出现了空,那么进行dfs
137 | /**
138 | * 如果快指针所对应的samples出现以下情况
139 | * 1. 没有stack了
140 | * 2. 函数名改变了(或者是其他指标改变了)
141 | * 反正可以证明当前函数终止
142 | * 那么此时说明,当前底层函数调用阻塞(火焰图的底层调用栈)结束
143 | * 1. 终止本次循环
144 | * 2. 把慢指针放到快指针的位置,如下同理
145 | */
146 | if (!currentTargetSampleStack[depth]
147 | || currentTargetSampleStack[depth].name !== currentSample.stack[depth].name) {
148 |
149 | // 记录当前区间的数据到最终数据结构里
150 | const currentFlameResultData = handleCurrentStackToFlameChildren(
151 | currentSample,
152 | samples[fast - 1],
153 | allSamples,
154 | depth,
155 | flameResultData
156 | );
157 |
158 | // 递归继续处理子调用栈
159 | handleChildrenOfEachLevel(slow, fast,
160 | samples, currentFlameResultData, depth + 1, allSamples);
161 |
162 | // DFS的完后回到本层,需要保持本层的状态,因此需要将慢指针继续推进至有调用栈,如下
163 | slow = fast;
164 | while (slow < n && !samples[slow].stack[depth]) {
165 | slow++;
166 | }
167 |
168 | currentSample = samples[slow] || {};
169 | currentStack = currentSample.stack || [];
170 | fast = slow;
171 | continue;
172 | }
173 |
174 | if (fast === n - 1) {
175 | // 此时j已经到了最后一个元素,仍然可以通过上方监测
176 | // 记录当前区间的数据到最终数据结构里
177 | const currentFlameResultData = handleCurrentStackToFlameChildren(
178 | currentSample,
179 | samples[fast],
180 | allSamples,
181 | depth,
182 | flameResultData
183 | );
184 |
185 | // 递归继续处理子调用栈
186 | handleChildrenOfEachLevel(slow, fast + 1,
187 | samples, currentFlameResultData, depth + 1, allSamples);
188 |
189 | slow = fast;
190 | continue;
191 | }
192 | }
193 |
194 | slow++;
195 | }
196 | }
197 |
198 | /**
199 | * @description 用于计算相对时间(t2-t1),封装当前调用栈信息,放入flameResultData容器中,作为children(子火焰图)
200 | * @param startSample 起始sample
201 | * @param endSample 结束sample
202 | * @param allSamples 所有samples
203 | * @param depth 当前深度
204 | * @param flameResultData 本层火焰图数据结构容器
205 | * @returns
206 | */
207 | function handleCurrentStackToFlameChildren(
208 | startSample: ISampleAfterTransformStack,
209 | endSample: ISampleAfterTransformStack,
210 | allSamples: ISample[],
211 | depth: number,
212 | flameResultData: IFlameGraphData
213 | ) {
214 |
215 | flameResultData.children = flameResultData.children || [];
216 | // 获取前后时间戳
217 | const {timestamp: startTime} = startSample;
218 | const {timestamp: endTime} = allSamples[endSample.index + 1];
219 | const diffTime = getNumberWithToFixed(endTime - startTime);
220 |
221 | // 获取当前stack的深度中,到底函数的信息
222 | const currentFunctionInfo = startSample.stack[depth];
223 | const {name} = currentFunctionInfo;
224 |
225 | const remarkData = {
226 | name,
227 | info: currentFunctionInfo,
228 | type: name,
229 | start: startTime,
230 | duration: diffTime,
231 | children: [],
232 | };
233 | flameResultData.children.push(remarkData);
234 |
235 | return remarkData;
236 | }
237 |
--------------------------------------------------------------------------------
/js-self-profiling-demo.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | JS Self Profiling Demo
8 |
141 |
142 |
143 |
144 |
145 |
JS Self Profiling 性能分析工具
146 |
147 |
148 | 状态: 准备就绪 - 点击"开始分析"按钮开始性能分析
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
模拟工作负载
160 |
在分析期间,您可以执行以下操作来生成性能数据:
161 |
162 | - 点击"执行计算任务"按钮
163 | - 在页面上进行交互
164 | - 滚动页面
165 |
166 |
167 |
170 |
171 |
172 |
173 |
分析结果
174 |
等待开始分析...
175 |
176 |
177 |
178 |
423 |
424 |
425 |
--------------------------------------------------------------------------------
/src/test-data/pauseFunc.json:
--------------------------------------------------------------------------------
1 | {
2 | "frames": [
3 | {
4 | "column": 24,
5 | "line": 14,
6 | "name": "init",
7 | "resourceId": 0
8 | },
9 | {
10 | "column": 11,
11 | "line": 11,
12 | "name": "",
13 | "resourceId": 0
14 | },
15 | {
16 | "column": 14,
17 | "line": 3287,
18 | "name": "LRUCache",
19 | "resourceId": 1
20 | },
21 | {
22 | "column": 16,
23 | "line": 1906,
24 | "name": "3",
25 | "resourceId": 1
26 | },
27 | {
28 | "column": 39,
29 | "line": 6,
30 | "name": "__webpack_require__",
31 | "resourceId": 1
32 | },
33 | {
34 | "column": 16,
35 | "line": 498,
36 | "name": "12",
37 | "resourceId": 1
38 | },
39 | {
40 | "column": 16,
41 | "line": 11322,
42 | "name": "9",
43 | "resourceId": 1
44 | },
45 | {
46 | "column": 37,
47 | "line": 2837,
48 | "name": "",
49 | "resourceId": 1
50 | },
51 | {
52 | "column": 16,
53 | "line": 2834,
54 | "name": "38",
55 | "resourceId": 1
56 | },
57 | {
58 | "column": 16,
59 | "line": 1352,
60 | "name": "208",
61 | "resourceId": 1
62 | },
63 | {
64 | "column": 19,
65 | "line": 1,
66 | "name": "",
67 | "resourceId": 1
68 | },
69 | {
70 | "column": 1,
71 | "line": 1,
72 | "name": "",
73 | "resourceId": 1
74 | },
75 | {
76 | "column": 42300,
77 | "line": 1,
78 | "name": "r",
79 | "resourceId": 2
80 | },
81 | {
82 | "column": 41371,
83 | "line": 1,
84 | "name": "",
85 | "resourceId": 2
86 | },
87 | {
88 | "column": 2,
89 | "line": 1,
90 | "name": "",
91 | "resourceId": 2
92 | },
93 | {
94 | "column": 1,
95 | "line": 1,
96 | "name": "",
97 | "resourceId": 2
98 | },
99 | {
100 | "name": "setTimeout"
101 | },
102 | {
103 | "column": 17,
104 | "line": 1,
105 | "name": "i",
106 | "resourceId": 3
107 | },
108 | {
109 | "column": 2,
110 | "line": 1,
111 | "name": "",
112 | "resourceId": 3
113 | },
114 | {
115 | "column": 1,
116 | "line": 1,
117 | "name": "",
118 | "resourceId": 3
119 | },
120 | {
121 | "column": 23,
122 | "line": 34,
123 | "name": "pausecomp",
124 | "resourceId": 0
125 | },
126 | {
127 | "column": 26,
128 | "line": 27,
129 | "name": "myfunc",
130 | "resourceId": 0
131 | },
132 | {
133 | "column": 44,
134 | "line": 9,
135 | "name": "",
136 | "resourceId": 0
137 | }
138 | ],
139 | "resources": [
140 | "http://localhost:8888/index.html",
141 | "chrome-extension://fmkadmapgofadopljbjfkapdkoienihi/build/installHook.js",
142 | "chrome-extension://nhdogjmejiglipccpnnnanhbledajbpd/build/detector.js",
143 | "chrome-extension://ienfalfjdbdpebioblfackkekamfmbnh/app/detect_angular_for_extension_icon_bundle.js"
144 | ],
145 | "samples": [
146 | {
147 | "stackId": 1,
148 | "timestamp": 54.84000000357628
149 | },
150 | {
151 | "timestamp": 54.91999998688698
152 | },
153 | {
154 | "timestamp": 55.34000000357628
155 | },
156 | {
157 | "timestamp": 55.34000000357628
158 | },
159 | {
160 | "timestamp": 55.37999999523163
161 | },
162 | {
163 | "timestamp": 55.41999998688698
164 | },
165 | {
166 | "timestamp": 55.54999998211861
167 | },
168 | {
169 | "timestamp": 55.75499999523163
170 | },
171 | {
172 | "timestamp": 61.34000000357628
173 | },
174 | {
175 | "timestamp": 61.54499998688698
176 | },
177 | {
178 | "timestamp": 61.87999999523163
179 | },
180 | {
181 | "stackId": 15,
182 | "timestamp": 67.12999999523163
183 | },
184 | {
185 | "timestamp": 67.59000000357628
186 | },
187 | {
188 | "timestamp": 70.25499999523163
189 | },
190 | {
191 | "timestamp": 78.4249999821186
192 | },
193 | {
194 | "timestamp": 78.84000000357628
195 | },
196 | {
197 | "timestamp": 78.96000000834465
198 | },
199 | {
200 | "timestamp": 78.96000000834465
201 | },
202 | {
203 | "timestamp": 79.16999998688698
204 | },
205 | {
206 | "stackId": 19,
207 | "timestamp": 82.41999998688698
208 | },
209 | {
210 | "stackId": 19,
211 | "timestamp": 82.50499999523163
212 | },
213 | {
214 | "stackId": 19,
215 | "timestamp": 82.54499998688698
216 | },
217 | {
218 | "timestamp": 87.54499998688698
219 | },
220 | {
221 | "timestamp": 87.54499998688698
222 | },
223 | {
224 | "timestamp": 90.34000000357628
225 | },
226 | {
227 | "timestamp": 90.9249999821186
228 | },
229 | {
230 | "stackId": 23,
231 | "timestamp": 91.12999999523163
232 | },
233 | {
234 | "timestamp": 91.16999998688698
235 | },
236 | {
237 | "timestamp": 91.59000000357628
238 | },
239 | {
240 | "timestamp": 91.59000000357628
241 | },
242 | {
243 | "timestamp": 91.59000000357628
244 | },
245 | {
246 | "timestamp": 93.62999999523163
247 | },
248 | {
249 | "timestamp": 101.63499999046326
250 | },
251 | {
252 | "timestamp": 105.84000000357628
253 | },
254 | {
255 | "timestamp": 115.25499999523163
256 | },
257 | {
258 | "timestamp": 114.08500000834465
259 | },
260 | {
261 | "timestamp": 126.62999999523163
262 | },
263 | {
264 | "timestamp": 128.7999999821186
265 | },
266 | {
267 | "timestamp": 137.2999999821186
268 | },
269 | {
270 | "timestamp": 141.46500000357628
271 | },
272 | {
273 | "timestamp": 154.71500000357628
274 | },
275 | {
276 | "timestamp": 149.2999999821186
277 | },
278 | {
279 | "timestamp": 168.50499999523163
280 | },
281 | {
282 | "timestamp": 160.75499999523163
283 | },
284 | {
285 | "timestamp": 170.7999999821186
286 | },
287 | {
288 | "timestamp": 182.12999999523163
289 | },
290 | {
291 | "timestamp": 180.96500000357628
292 | },
293 | {
294 | "timestamp": 184.66999998688698
295 | },
296 | {
297 | "timestamp": 192.4249999821186
298 | },
299 | {
300 | "timestamp": 194.4249999821186
301 | },
302 | {
303 | "timestamp": 194.4249999821186
304 | },
305 | {
306 | "timestamp": 194.4249999821186
307 | },
308 | {
309 | "timestamp": 209.21000000834465
310 | },
311 | {
312 | "timestamp": 204.87999999523163
313 | },
314 | {
315 | "timestamp": 222.21500000357628
316 | },
317 | {
318 | "timestamp": 217.21500000357628
319 | },
320 | {
321 | "timestamp": 229.5499999821186
322 | },
323 | {
324 | "timestamp": 235.1749999821186
325 | },
326 | {
327 | "timestamp": 248.96000000834465
328 | },
329 | {
330 | "timestamp": 242.09000000357628
331 | },
332 | {
333 | "timestamp": 252.16999998688698
334 | },
335 | {
336 | "timestamp": 262.669999986887
337 | },
338 | {
339 | "timestamp": 274.3400000035763
340 | },
341 | {
342 | "timestamp": 286.8799999952316
343 | },
344 | {
345 | "timestamp": 296.9249999821186
346 | },
347 | {
348 | "timestamp": 309.5049999952316
349 | },
350 | {
351 | "timestamp": 321.1299999952316
352 | },
353 | {
354 | "timestamp": 331.2549999952316
355 | },
356 | {
357 | "timestamp": 341.5049999952316
358 | },
359 | {
360 | "timestamp": 354.0049999952316
361 | },
362 | {
363 | "timestamp": 366.5049999952316
364 | },
365 | {
366 | "timestamp": 378.1749999821186
367 | },
368 | {
369 | "timestamp": 390.6299999952316
370 | },
371 | {
372 | "timestamp": 403.1299999952316
373 | },
374 | {
375 | "timestamp": 422.919999986887
376 | },
377 | {
378 | "timestamp": 413.2999999821186
379 | },
380 | {
381 | "timestamp": 435.2999999821186
382 | },
383 | {
384 | "timestamp": 424.169999986887
385 | },
386 | {
387 | "timestamp": 435.8799999952316
388 | },
389 | {
390 | "timestamp": 448.13499999046326
391 | },
392 | {
393 | "timestamp": 446.5499999821186
394 | },
395 | {
396 | "timestamp": 459.08500000834465
397 | },
398 | {
399 | "timestamp": 462.2999999821186
400 | },
401 | {
402 | "timestamp": 469.4249999821186
403 | },
404 | {
405 | "timestamp": 475.50999999046326
406 | },
407 | {
408 | "timestamp": 488.6749999821186
409 | },
410 | {
411 | "timestamp": 481.2999999821186
412 | },
413 | {
414 | "timestamp": 501.7150000035763
415 | },
416 | {
417 | "timestamp": 491.3799999952316
418 | },
419 | {
420 | "timestamp": 501.9249999821186
421 | },
422 | {
423 | "timestamp": 516.0049999952316
424 | },
425 | {
426 | "timestamp": 511.9650000035763
427 | },
428 | {
429 | "timestamp": 524.4650000035763
430 | },
431 | {
432 | "timestamp": 528.419999986887
433 | },
434 | {
435 | "timestamp": 528.419999986887
436 | },
437 | {
438 | "timestamp": 528.419999986887
439 | },
440 | {
441 | "timestamp": 537.0049999952316
442 | },
443 | {
444 | "timestamp": 541.8350000083447
445 | },
446 | {
447 | "timestamp": 555.8849999904633
448 | },
449 | {
450 | "timestamp": 549.4650000035763
451 | },
452 | {
453 | "timestamp": 569.0900000035763
454 | },
455 | {
456 | "timestamp": 559.5099999904633
457 | },
458 | {
459 | "timestamp": 569.6349999904633
460 | },
461 | {
462 | "timestamp": 579.7150000035763
463 | },
464 | {
465 | "timestamp": 591.3350000083447
466 | },
467 | {
468 | "timestamp": 601.5049999952316
469 | },
470 | {
471 | "timestamp": 611.544999986887
472 | },
473 | {
474 | "timestamp": 621.5900000035763
475 | },
476 | {
477 | "timestamp": 632.7999999821186
478 | },
479 | {
480 | "timestamp": 645.3400000035763
481 | },
482 | {
483 | "timestamp": 657.8799999952316
484 | },
485 | {
486 | "timestamp": 670.419999986887
487 | },
488 | {
489 | "timestamp": 684.4650000035763
490 | },
491 | {
492 | "timestamp": 680.4650000035763
493 | },
494 | {
495 | "timestamp": 693.419999986887
496 | },
497 | {
498 | "timestamp": 693.419999986887
499 | },
500 | {
501 | "timestamp": 693.419999986887
502 | },
503 | {
504 | "timestamp": 693.5049999952316
505 | },
506 | {
507 | "timestamp": 693.6299999952316
508 | },
509 | {
510 | "timestamp": 690.5900000035763
511 | },
512 | {
513 | "timestamp": 701.1299999952316
514 | },
515 | {
516 | "timestamp": 701.5499999821186
517 | },
518 | {
519 | "timestamp": 715.9249999821186
520 | },
521 | {
522 | "timestamp": 711.5499999821186
523 | },
524 | {
525 | "timestamp": 728.2599999904633
526 | },
527 | {
528 | "timestamp": 722.5049999952316
529 | },
530 | {
531 | "timestamp": 733.9249999821186
532 | },
533 | {
534 | "timestamp": 742.419999986887
535 | },
536 | {
537 | "timestamp": 746.5049999952316
538 | },
539 | {
540 | "timestamp": 754.6749999821186
541 | },
542 | {
543 | "timestamp": 756.6749999821186
544 | },
545 | {
546 | "timestamp": 770.8400000035763
547 | },
548 | {
549 | "timestamp": 769.2100000083447
550 | },
551 | {
552 | "timestamp": 781.2150000035763
553 | },
554 | {
555 | "timestamp": 779.2549999952316
556 | },
557 | {
558 | "timestamp": 791.7999999821186
559 | },
560 | {
561 | "timestamp": 799.2549999952316
562 | },
563 | {
564 | "timestamp": 799.2999999821186
565 | },
566 | {
567 | "timestamp": 800.0049999952316
568 | },
569 | {
570 | "timestamp": 800.2150000035763
571 | },
572 | {
573 | "timestamp": 800.2150000035763
574 | },
575 | {
576 | "timestamp": 800.2150000035763
577 | },
578 | {
579 | "timestamp": 800.2150000035763
580 | },
581 | {
582 | "timestamp": 800.2150000035763
583 | },
584 | {
585 | "timestamp": 802.0049999952316
586 | },
587 | {
588 | "timestamp": 808.2150000035763
589 | },
590 | {
591 | "timestamp": 808.2549999952316
592 | },
593 | {
594 | "timestamp": 814.5049999952316
595 | },
596 | {
597 | "timestamp": 824.6749999821186
598 | },
599 | {
600 | "timestamp": 834.794999986887
601 | },
602 | {
603 | "timestamp": 847.2999999821186
604 | },
605 | {
606 | "timestamp": 857.419999986887
607 | },
608 | {
609 | "timestamp": 869.9650000035763
610 | },
611 | {
612 | "timestamp": 885.419999986887
613 | },
614 | {
615 | "timestamp": 885.4650000035763
616 | },
617 | {
618 | "timestamp": 881.1299999952316
619 | },
620 | {
621 | "timestamp": 885.7549999952316
622 | },
623 | {
624 | "timestamp": 885.794999986887
625 | },
626 | {
627 | "stackId": 26,
628 | "timestamp": 893.169999986887
629 | },
630 | {
631 | "stackId": 26,
632 | "timestamp": 905.7150000035763
633 | },
634 | {
635 | "stackId": 26,
636 | "timestamp": 918.294999986887
637 | },
638 | {
639 | "stackId": 26,
640 | "timestamp": 930.794999986887
641 | },
642 | {
643 | "stackId": 26,
644 | "timestamp": 941.669999986887
645 | },
646 | {
647 | "stackId": 26,
648 | "timestamp": 951.7549999952316
649 | },
650 | {
651 | "stackId": 26,
652 | "timestamp": 964.2549999952316
653 | },
654 | {
655 | "stackId": 26,
656 | "timestamp": 974.2999999821186
657 | },
658 | {
659 | "stackId": 26,
660 | "timestamp": 984.5900000035763
661 | },
662 | {
663 | "stackId": 26,
664 | "timestamp": 996.4650000035763
665 | },
666 | {
667 | "stackId": 26,
668 | "timestamp": 1009.0049999952316
669 | },
670 | {
671 | "stackId": 26,
672 | "timestamp": 1019.169999986887
673 | },
674 | {
675 | "stackId": 26,
676 | "timestamp": 1029.294999986887
677 | },
678 | {
679 | "stackId": 25,
680 | "timestamp": 1035.9600000083447
681 | }
682 | ],
683 | "stacks": [
684 | {
685 | "frameId": 1
686 | },
687 | {
688 | "frameId": 0,
689 | "parentId": 0
690 | },
691 | {
692 | "frameId": 11
693 | },
694 | {
695 | "frameId": 10,
696 | "parentId": 2
697 | },
698 | {
699 | "frameId": 4,
700 | "parentId": 3
701 | },
702 | {
703 | "frameId": 9,
704 | "parentId": 4
705 | },
706 | {
707 | "frameId": 4,
708 | "parentId": 5
709 | },
710 | {
711 | "frameId": 8,
712 | "parentId": 6
713 | },
714 | {
715 | "frameId": 7,
716 | "parentId": 7
717 | },
718 | {
719 | "frameId": 4,
720 | "parentId": 8
721 | },
722 | {
723 | "frameId": 6,
724 | "parentId": 9
725 | },
726 | {
727 | "frameId": 4,
728 | "parentId": 10
729 | },
730 | {
731 | "frameId": 5,
732 | "parentId": 11
733 | },
734 | {
735 | "frameId": 4,
736 | "parentId": 12
737 | },
738 | {
739 | "frameId": 3,
740 | "parentId": 13
741 | },
742 | {
743 | "frameId": 2,
744 | "parentId": 14
745 | },
746 | {
747 | "frameId": 15
748 | },
749 | {
750 | "frameId": 14,
751 | "parentId": 16
752 | },
753 | {
754 | "frameId": 13,
755 | "parentId": 17
756 | },
757 | {
758 | "frameId": 12,
759 | "parentId": 18
760 | },
761 | {
762 | "frameId": 19
763 | },
764 | {
765 | "frameId": 18,
766 | "parentId": 20
767 | },
768 | {
769 | "frameId": 17,
770 | "parentId": 21
771 | },
772 | {
773 | "frameId": 16,
774 | "parentId": 22
775 | },
776 | {
777 | "frameId": 22
778 | },
779 | {
780 | "frameId": 21,
781 | "parentId": 24
782 | },
783 | {
784 | "frameId": 20,
785 | "parentId": 25
786 | }
787 | ]
788 | }
--------------------------------------------------------------------------------
/src/test-data/profiling-2025-07-20T06-35-22.json:
--------------------------------------------------------------------------------
1 | {
2 | "frames": [
3 | {
4 | "name": "Profiler"
5 | },
6 | {
7 | "column": 38,
8 | "line": 214,
9 | "name": "startProfiling",
10 | "resourceId": 0
11 | },
12 | {
13 | "column": 28,
14 | "line": 347,
15 | "name": "main",
16 | "resourceId": 0
17 | },
18 | {
19 | "column": 33,
20 | "line": 398,
21 | "name": "executeWorkload",
22 | "resourceId": 0
23 | },
24 | {
25 | "column": 32,
26 | "line": 348,
27 | "name": "beforeTask",
28 | "resourceId": 0
29 | },
30 | {
31 | "column": 31,
32 | "line": 354,
33 | "name": "afterTask",
34 | "resourceId": 0
35 | },
36 | {
37 | "column": 28,
38 | "line": 385,
39 | "name": "afterTask1",
40 | "resourceId": 0
41 | },
42 | {
43 | "column": 28,
44 | "line": 391,
45 | "name": "afterTask2",
46 | "resourceId": 0
47 | },
48 | {
49 | "column": 37,
50 | "line": 341,
51 | "name": "taskInAsyncFunction",
52 | "resourceId": 0
53 | },
54 | {
55 | "column": 33,
56 | "line": 361,
57 | "name": "task2",
58 | "resourceId": 0
59 | }
60 | ],
61 | "resources": [
62 | "http://localhost:3000/"
63 | ],
64 | "samples": [
65 | {
66 | "stackId": 1,
67 | "timestamp": 462.7600000053644
68 | },
69 | {
70 | "timestamp": 475.0949999988079
71 | },
72 | {
73 | "timestamp": 484.8449999988079
74 | },
75 | {
76 | "timestamp": 487.64000000059605
77 | },
78 | {
79 | "timestamp": 500.18000000715256
80 | },
81 | {
82 | "timestamp": 512.6750000119209
83 | },
84 | {
85 | "timestamp": 525.0949999988079
86 | },
87 | {
88 | "timestamp": 537.5900000035763
89 | },
90 | {
91 | "timestamp": 550.0949999988079
92 | },
93 | {
94 | "timestamp": 560.3850000053644
95 | },
96 | {
97 | "timestamp": 562.765000000596
98 | },
99 | {
100 | "timestamp": 572.8850000053644
101 | },
102 | {
103 | "timestamp": 583.9650000035763
104 | },
105 | {
106 | "timestamp": 596.5100000053644
107 | },
108 | {
109 | "timestamp": 597.3850000053644
110 | },
111 | {
112 | "timestamp": 609.0500000119209
113 | },
114 | {
115 | "timestamp": 621.9250000119209
116 | },
117 | {
118 | "timestamp": 634.4250000119209
119 | },
120 | {
121 | "timestamp": 646.4650000035763
122 | },
123 | {
124 | "timestamp": 659.0100000053644
125 | },
126 | {
127 | "timestamp": 671.4250000119209
128 | },
129 | {
130 | "timestamp": 683.4250000119209
131 | },
132 | {
133 | "timestamp": 693.6800000071526
134 | },
135 | {
136 | "timestamp": 704.3050000071526
137 | },
138 | {
139 | "timestamp": 716.7199999988079
140 | },
141 | {
142 | "timestamp": 729.2600000053644
143 | },
144 | {
145 | "timestamp": 741.7199999988079
146 | },
147 | {
148 | "timestamp": 754.2199999988079
149 | },
150 | {
151 | "timestamp": 766.7199999988079
152 | },
153 | {
154 | "timestamp": 779.2600000053644
155 | },
156 | {
157 | "timestamp": 791.8050000071526
158 | },
159 | {
160 | "timestamp": 804.3000000119209
161 | },
162 | {
163 | "timestamp": 816.8449999988079
164 | },
165 | {
166 | "timestamp": 829.3449999988079
167 | },
168 | {
169 | "timestamp": 841.8850000053644
170 | },
171 | {
172 | "timestamp": 854.3449999988079
173 | },
174 | {
175 | "timestamp": 866.8850000053644
176 | },
177 | {
178 | "timestamp": 879.4250000119209
179 | },
180 | {
181 | "timestamp": 892.0100000053644
182 | },
183 | {
184 | "timestamp": 904.5550000071526
185 | },
186 | {
187 | "timestamp": 917.0949999988079
188 | },
189 | {
190 | "timestamp": 929.2600000053644
191 | },
192 | {
193 | "timestamp": 941.7600000053644
194 | },
195 | {
196 | "timestamp": 954.2600000053644
197 | },
198 | {
199 | "timestamp": 966.7600000053644
200 | },
201 | {
202 | "timestamp": 979.3449999988079
203 | },
204 | {
205 | "timestamp": 991.8850000053644
206 | },
207 | {
208 | "timestamp": 1004.3449999988079
209 | },
210 | {
211 | "timestamp": 1016.8850000053644
212 | },
213 | {
214 | "timestamp": 1029.3400000035763
215 | },
216 | {
217 | "timestamp": 1041.969999998808
218 | },
219 | {
220 | "timestamp": 1054.3050000071526
221 | },
222 | {
223 | "timestamp": 1066.8050000071526
224 | },
225 | {
226 | "timestamp": 1079.2600000053644
227 | },
228 | {
229 | "timestamp": 1091.844999998808
230 | },
231 | {
232 | "timestamp": 1104.3850000053644
233 | },
234 | {
235 | "timestamp": 1116.9300000071526
236 | },
237 | {
238 | "timestamp": 1129.5100000053644
239 | },
240 | {
241 | "timestamp": 1141.800000011921
242 | },
243 | {
244 | "timestamp": 1154.300000011921
245 | },
246 | {
247 | "timestamp": 1166.8850000053644
248 | },
249 | {
250 | "timestamp": 1179.469999998808
251 | },
252 | {
253 | "timestamp": 1192.0100000053644
254 | },
255 | {
256 | "timestamp": 1204.469999998808
257 | },
258 | {
259 | "timestamp": 1217.050000011921
260 | },
261 | {
262 | "timestamp": 1229.5550000071526
263 | },
264 | {
265 | "timestamp": 1242.050000011921
266 | },
267 | {
268 | "timestamp": 1254.594999998808
269 | },
270 | {
271 | "timestamp": 1267.1350000053644
272 | },
273 | {
274 | "timestamp": 1279.6350000053644
275 | },
276 | {
277 | "timestamp": 1292.1800000071526
278 | },
279 | {
280 | "timestamp": 1304.765000000596
281 | },
282 | {
283 | "timestamp": 1316.8050000071526
284 | },
285 | {
286 | "timestamp": 1329.344999998808
287 | },
288 | {
289 | "timestamp": 1341.8850000053644
290 | },
291 | {
292 | "timestamp": 1354.2600000053644
293 | },
294 | {
295 | "timestamp": 1366.7150000035763
296 | },
297 | {
298 | "timestamp": 1377.219999998808
299 | },
300 | {
301 | "timestamp": 1389.719999998808
302 | },
303 | {
304 | "timestamp": 1402.050000011921
305 | },
306 | {
307 | "timestamp": 1412.5900000035763
308 | },
309 | {
310 | "timestamp": 1425.1350000053644
311 | },
312 | {
313 | "timestamp": 1435.5100000053644
314 | },
315 | {
316 | "timestamp": 1447.300000011921
317 | },
318 | {
319 | "timestamp": 1459.3850000053644
320 | },
321 | {
322 | "timestamp": 1471.844999998808
323 | },
324 | {
325 | "timestamp": 1484.425000011921
326 | },
327 | {
328 | "timestamp": 1496.925000011921
329 | },
330 | {
331 | "timestamp": 1509.469999998808
332 | },
333 | {
334 | "timestamp": 1521.9650000035763
335 | },
336 | {
337 | "timestamp": 1534.5100000053644
338 | },
339 | {
340 | "timestamp": 1547.0100000053644
341 | },
342 | {
343 | "timestamp": 1559.5900000035763
344 | },
345 | {
346 | "timestamp": 1571.469999998808
347 | },
348 | {
349 | "timestamp": 1583.344999998808
350 | },
351 | {
352 | "timestamp": 1593.9650000035763
353 | },
354 | {
355 | "timestamp": 1604.2600000053644
356 | },
357 | {
358 | "timestamp": 1616.765000000596
359 | },
360 | {
361 | "timestamp": 1629.550000011921
362 | },
363 | {
364 | "timestamp": 1641.6350000053644
365 | },
366 | {
367 | "timestamp": 1654.2150000035763
368 | },
369 | {
370 | "timestamp": 1665.594999998808
371 | },
372 | {
373 | "timestamp": 1677.3850000053644
374 | },
375 | {
376 | "timestamp": 1689.844999998808
377 | },
378 | {
379 | "timestamp": 1701.219999998808
380 | },
381 | {
382 | "stackId": 3,
383 | "timestamp": 1715.719999998808
384 | },
385 | {
386 | "stackId": 4,
387 | "timestamp": 1717.469999998808
388 | },
389 | {
390 | "stackId": 4,
391 | "timestamp": 1728.2600000053644
392 | },
393 | {
394 | "stackId": 4,
395 | "timestamp": 1740.800000011921
396 | },
397 | {
398 | "stackId": 4,
399 | "timestamp": 1752.050000011921
400 | },
401 | {
402 | "stackId": 4,
403 | "timestamp": 1764.550000011921
404 | },
405 | {
406 | "stackId": 4,
407 | "timestamp": 1776.0100000053644
408 | },
409 | {
410 | "stackId": 4,
411 | "timestamp": 1788.5550000071526
412 | },
413 | {
414 | "stackId": 4,
415 | "timestamp": 1801.0550000071526
416 | },
417 | {
418 | "stackId": 4,
419 | "timestamp": 1813.550000011921
420 | },
421 | {
422 | "stackId": 4,
423 | "timestamp": 1826.0900000035763
424 | },
425 | {
426 | "stackId": 4,
427 | "timestamp": 1838.6350000053644
428 | },
429 | {
430 | "stackId": 4,
431 | "timestamp": 1851.0100000053644
432 | },
433 | {
434 | "stackId": 4,
435 | "timestamp": 1863.5550000071526
436 | },
437 | {
438 | "stackId": 4,
439 | "timestamp": 1876.0550000071526
440 | },
441 | {
442 | "stackId": 4,
443 | "timestamp": 1888.594999998808
444 | },
445 | {
446 | "stackId": 4,
447 | "timestamp": 1901.015000000596
448 | },
449 | {
450 | "stackId": 4,
451 | "timestamp": 1913.5550000071526
452 | },
453 | {
454 | "stackId": 4,
455 | "timestamp": 1926.094999998808
456 | },
457 | {
458 | "stackId": 4,
459 | "timestamp": 1938.594999998808
460 | },
461 | {
462 | "stackId": 4,
463 | "timestamp": 1951.0100000053644
464 | },
465 | {
466 | "stackId": 4,
467 | "timestamp": 1961.719999998808
468 | },
469 | {
470 | "stackId": 4,
471 | "timestamp": 1974.265000000596
472 | },
473 | {
474 | "stackId": 4,
475 | "timestamp": 1985.4300000071526
476 | },
477 | {
478 | "stackId": 4,
479 | "timestamp": 1997.969999998808
480 | },
481 | {
482 | "stackId": 4,
483 | "timestamp": 2010.2600000053644
484 | },
485 | {
486 | "stackId": 4,
487 | "timestamp": 2022.800000011921
488 | },
489 | {
490 | "stackId": 4,
491 | "timestamp": 2034.344999998808
492 | },
493 | {
494 | "stackId": 4,
495 | "timestamp": 2046.8850000053644
496 | },
497 | {
498 | "stackId": 4,
499 | "timestamp": 2059.390000000596
500 | },
501 | {
502 | "stackId": 4,
503 | "timestamp": 2071.925000011921
504 | },
505 | {
506 | "stackId": 4,
507 | "timestamp": 2084.3400000035763
508 | },
509 | {
510 | "stackId": 4,
511 | "timestamp": 2096.890000000596
512 | },
513 | {
514 | "stackId": 4,
515 | "timestamp": 2109.3850000053644
516 | },
517 | {
518 | "stackId": 4,
519 | "timestamp": 2121.8850000053644
520 | },
521 | {
522 | "stackId": 4,
523 | "timestamp": 2134.4300000071526
524 | },
525 | {
526 | "stackId": 4,
527 | "timestamp": 2146.925000011921
528 | },
529 | {
530 | "stackId": 4,
531 | "timestamp": 2159.425000011921
532 | },
533 | {
534 | "stackId": 4,
535 | "timestamp": 2171.969999998808
536 | },
537 | {
538 | "stackId": 4,
539 | "timestamp": 2184.344999998808
540 | },
541 | {
542 | "stackId": 4,
543 | "timestamp": 2191.3850000053644
544 | },
545 | {
546 | "stackId": 5,
547 | "timestamp": 2192.1800000071526
548 | },
549 | {
550 | "stackId": 5,
551 | "timestamp": 2196.8850000053644
552 | },
553 | {
554 | "stackId": 5,
555 | "timestamp": 2209.4300000071526
556 | },
557 | {
558 | "stackId": 5,
559 | "timestamp": 2221.8850000053644
560 | },
561 | {
562 | "stackId": 5,
563 | "timestamp": 2234.3400000035763
564 | },
565 | {
566 | "stackId": 5,
567 | "timestamp": 2245.890000000596
568 | },
569 | {
570 | "stackId": 5,
571 | "timestamp": 2258.3850000053644
572 | },
573 | {
574 | "stackId": 5,
575 | "timestamp": 2270.925000011921
576 | },
577 | {
578 | "stackId": 5,
579 | "timestamp": 2283.469999998808
580 | },
581 | {
582 | "stackId": 5,
583 | "timestamp": 2295.8850000053644
584 | },
585 | {
586 | "stackId": 5,
587 | "timestamp": 2308.3850000053644
588 | },
589 | {
590 | "stackId": 5,
591 | "timestamp": 2320.8850000053644
592 | },
593 | {
594 | "stackId": 5,
595 | "timestamp": 2333.3850000053644
596 | },
597 | {
598 | "stackId": 5,
599 | "timestamp": 2345.925000011921
600 | },
601 | {
602 | "stackId": 5,
603 | "timestamp": 2358.3400000035763
604 | },
605 | {
606 | "stackId": 5,
607 | "timestamp": 2370.890000000596
608 | },
609 | {
610 | "stackId": 5,
611 | "timestamp": 2383.4300000071526
612 | },
613 | {
614 | "stackId": 5,
615 | "timestamp": 2395.925000011921
616 | },
617 | {
618 | "stackId": 5,
619 | "timestamp": 2408.469999998808
620 | },
621 | {
622 | "stackId": 5,
623 | "timestamp": 2420.8850000053644
624 | },
625 | {
626 | "stackId": 5,
627 | "timestamp": 2433.3850000053644
628 | },
629 | {
630 | "stackId": 5,
631 | "timestamp": 2445.8850000053644
632 | },
633 | {
634 | "stackId": 5,
635 | "timestamp": 2458.3850000053644
636 | },
637 | {
638 | "stackId": 5,
639 | "timestamp": 2470.8850000053644
640 | },
641 | {
642 | "stackId": 5,
643 | "timestamp": 2483.3850000053644
644 | },
645 | {
646 | "stackId": 5,
647 | "timestamp": 2495.969999998808
648 | },
649 | {
650 | "stackId": 5,
651 | "timestamp": 2508.3850000053644
652 | },
653 | {
654 | "stackId": 5,
655 | "timestamp": 2520.8850000053644
656 | },
657 | {
658 | "stackId": 5,
659 | "timestamp": 2533.425000011921
660 | },
661 | {
662 | "stackId": 5,
663 | "timestamp": 2545.890000000596
664 | },
665 | {
666 | "stackId": 5,
667 | "timestamp": 2558.3850000053644
668 | },
669 | {
670 | "stackId": 5,
671 | "timestamp": 2570.925000011921
672 | },
673 | {
674 | "stackId": 5,
675 | "timestamp": 2583.469999998808
676 | },
677 | {
678 | "stackId": 5,
679 | "timestamp": 2595.969999998808
680 | },
681 | {
682 | "stackId": 5,
683 | "timestamp": 2608.5100000053644
684 | },
685 | {
686 | "stackId": 5,
687 | "timestamp": 2620.9650000035763
688 | },
689 | {
690 | "stackId": 5,
691 | "timestamp": 2633.550000011921
692 | },
693 | {
694 | "stackId": 5,
695 | "timestamp": 2645.969999998808
696 | },
697 | {
698 | "stackId": 5,
699 | "timestamp": 2652.1350000053644
700 | },
701 | {
702 | "stackId": 6,
703 | "timestamp": 2652.8850000053644
704 | },
705 | {
706 | "stackId": 6,
707 | "timestamp": 2658.5100000053644
708 | },
709 | {
710 | "stackId": 6,
711 | "timestamp": 2670.969999998808
712 | },
713 | {
714 | "stackId": 6,
715 | "timestamp": 2683.469999998808
716 | },
717 | {
718 | "stackId": 6,
719 | "timestamp": 2695.1350000053644
720 | },
721 | {
722 | "stackId": 6,
723 | "timestamp": 2707.4300000071526
724 | },
725 | {
726 | "stackId": 6,
727 | "timestamp": 2718.719999998808
728 | },
729 | {
730 | "stackId": 6,
731 | "timestamp": 2729.300000011921
732 | },
733 | {
734 | "stackId": 6,
735 | "timestamp": 2741.800000011921
736 | },
737 | {
738 | "stackId": 6,
739 | "timestamp": 2754.344999998808
740 | },
741 | {
742 | "stackId": 6,
743 | "timestamp": 2766.8050000071526
744 | },
745 | {
746 | "stackId": 6,
747 | "timestamp": 2779.344999998808
748 | },
749 | {
750 | "stackId": 6,
751 | "timestamp": 2791.800000011921
752 | },
753 | {
754 | "stackId": 6,
755 | "timestamp": 2804.344999998808
756 | },
757 | {
758 | "stackId": 6,
759 | "timestamp": 2816.8850000053644
760 | },
761 | {
762 | "stackId": 6,
763 | "timestamp": 2829.3850000053644
764 | },
765 | {
766 | "stackId": 6,
767 | "timestamp": 2841.8850000053644
768 | },
769 | {
770 | "stackId": 6,
771 | "timestamp": 2854.4300000071526
772 | },
773 | {
774 | "stackId": 6,
775 | "timestamp": 2866.9300000071526
776 | },
777 | {
778 | "stackId": 6,
779 | "timestamp": 2879.425000011921
780 | },
781 | {
782 | "stackId": 6,
783 | "timestamp": 2891.969999998808
784 | },
785 | {
786 | "stackId": 6,
787 | "timestamp": 2904.5100000053644
788 | },
789 | {
790 | "stackId": 6,
791 | "timestamp": 2917.0100000053644
792 | },
793 | {
794 | "stackId": 6,
795 | "timestamp": 2929.5100000053644
796 | },
797 | {
798 | "stackId": 6,
799 | "timestamp": 2942.0550000071526
800 | },
801 | {
802 | "stackId": 6,
803 | "timestamp": 2954.550000011921
804 | },
805 | {
806 | "stackId": 6,
807 | "timestamp": 2967.0550000071526
808 | },
809 | {
810 | "stackId": 6,
811 | "timestamp": 2979.5550000071526
812 | },
813 | {
814 | "stackId": 6,
815 | "timestamp": 2992.094999998808
816 | },
817 | {
818 | "stackId": 6,
819 | "timestamp": 3004.594999998808
820 | },
821 | {
822 | "stackId": 6,
823 | "timestamp": 3017.1350000053644
824 | },
825 | {
826 | "stackId": 6,
827 | "timestamp": 3029.6350000053644
828 | },
829 | {
830 | "stackId": 6,
831 | "timestamp": 3041.765000000596
832 | },
833 | {
834 | "stackId": 6,
835 | "timestamp": 3054.265000000596
836 | },
837 | {
838 | "stackId": 6,
839 | "timestamp": 3066.800000011921
840 | },
841 | {
842 | "stackId": 6,
843 | "timestamp": 3079.2600000053644
844 | },
845 | {
846 | "stackId": 6,
847 | "timestamp": 3091.7600000053644
848 | },
849 | {
850 | "stackId": 6,
851 | "timestamp": 3104.2600000053644
852 | },
853 | {
854 | "stackId": 6,
855 | "timestamp": 3110.675000011921
856 | },
857 | {
858 | "stackId": 7,
859 | "timestamp": 3111.344999998808
860 | },
861 | {
862 | "stackId": 7,
863 | "timestamp": 3116.8050000071526
864 | },
865 | {
866 | "stackId": 7,
867 | "timestamp": 3129.344999998808
868 | },
869 | {
870 | "stackId": 7,
871 | "timestamp": 3141.8850000053644
872 | },
873 | {
874 | "stackId": 7,
875 | "timestamp": 3154.3850000053644
876 | },
877 | {
878 | "stackId": 7,
879 | "timestamp": 3166.9300000071526
880 | },
881 | {
882 | "stackId": 7,
883 | "timestamp": 3179.425000011921
884 | },
885 | {
886 | "stackId": 7,
887 | "timestamp": 3191.969999998808
888 | },
889 | {
890 | "stackId": 7,
891 | "timestamp": 3204.4650000035763
892 | },
893 | {
894 | "stackId": 7,
895 | "timestamp": 3216.7600000053644
896 | },
897 | {
898 | "stackId": 7,
899 | "timestamp": 3229.265000000596
900 | },
901 | {
902 | "stackId": 7,
903 | "timestamp": 3241.800000011921
904 | },
905 | {
906 | "stackId": 7,
907 | "timestamp": 3254.300000011921
908 | },
909 | {
910 | "stackId": 7,
911 | "timestamp": 3266.844999998808
912 | },
913 | {
914 | "stackId": 7,
915 | "timestamp": 3279.344999998808
916 | },
917 | {
918 | "stackId": 7,
919 | "timestamp": 3291.8850000053644
920 | },
921 | {
922 | "stackId": 7,
923 | "timestamp": 3304.4300000071526
924 | },
925 | {
926 | "stackId": 7,
927 | "timestamp": 3316.844999998808
928 | },
929 | {
930 | "stackId": 7,
931 | "timestamp": 3329.3850000053644
932 | },
933 | {
934 | "stackId": 7,
935 | "timestamp": 3341.8850000053644
936 | },
937 | {
938 | "stackId": 7,
939 | "timestamp": 3352.5100000053644
940 | },
941 | {
942 | "stackId": 7,
943 | "timestamp": 3365.0100000053644
944 | },
945 | {
946 | "stackId": 7,
947 | "timestamp": 3376.050000011921
948 | },
949 | {
950 | "stackId": 7,
951 | "timestamp": 3388.550000011921
952 | },
953 | {
954 | "stackId": 7,
955 | "timestamp": 3401.050000011921
956 | },
957 | {
958 | "stackId": 7,
959 | "timestamp": 3413.594999998808
960 | },
961 | {
962 | "stackId": 7,
963 | "timestamp": 3426.1350000053644
964 | },
965 | {
966 | "stackId": 7,
967 | "timestamp": 3438.675000011921
968 | },
969 | {
970 | "stackId": 7,
971 | "timestamp": 3451.0100000053644
972 | },
973 | {
974 | "stackId": 7,
975 | "timestamp": 3463.5550000071526
976 | },
977 | {
978 | "stackId": 7,
979 | "timestamp": 3476.050000011921
980 | },
981 | {
982 | "stackId": 7,
983 | "timestamp": 3488.594999998808
984 | },
985 | {
986 | "stackId": 7,
987 | "timestamp": 3501.0100000053644
988 | },
989 | {
990 | "stackId": 7,
991 | "timestamp": 3513.5100000053644
992 | },
993 | {
994 | "stackId": 7,
995 | "timestamp": 3526.050000011921
996 | },
997 | {
998 | "stackId": 7,
999 | "timestamp": 3538.515000000596
1000 | },
1001 | {
1002 | "stackId": 7,
1003 | "timestamp": 3551.094999998808
1004 | },
1005 | {
1006 | "stackId": 7,
1007 | "timestamp": 3563.6350000053644
1008 | },
1009 | {
1010 | "stackId": 7,
1011 | "timestamp": 3566.844999998808
1012 | },
1013 | {
1014 | "stackId": 9,
1015 | "timestamp": 3570.300000011921
1016 | },
1017 | {
1018 | "stackId": 9,
1019 | "timestamp": 3576.1800000071526
1020 | },
1021 | {
1022 | "stackId": 9,
1023 | "timestamp": 3588.675000011921
1024 | },
1025 | {
1026 | "stackId": 9,
1027 | "timestamp": 3601.0100000053644
1028 | },
1029 | {
1030 | "stackId": 9,
1031 | "timestamp": 3612.5550000071526
1032 | },
1033 | {
1034 | "stackId": 9,
1035 | "timestamp": 3625.094999998808
1036 | },
1037 | {
1038 | "stackId": 9,
1039 | "timestamp": 3637.5900000035763
1040 | },
1041 | {
1042 | "stackId": 9,
1043 | "timestamp": 3650.1350000053644
1044 | },
1045 | {
1046 | "stackId": 9,
1047 | "timestamp": 3662.6350000053644
1048 | },
1049 | {
1050 | "stackId": 9,
1051 | "timestamp": 3675.1350000053644
1052 | },
1053 | {
1054 | "stackId": 9,
1055 | "timestamp": 3687.594999998808
1056 | },
1057 | {
1058 | "stackId": 9,
1059 | "timestamp": 3700.050000011921
1060 | },
1061 | {
1062 | "stackId": 9,
1063 | "timestamp": 3710.3850000053644
1064 | },
1065 | {
1066 | "stackId": 9,
1067 | "timestamp": 3722.8850000053644
1068 | },
1069 | {
1070 | "stackId": 9,
1071 | "timestamp": 3734.3850000053644
1072 | },
1073 | {
1074 | "stackId": 9,
1075 | "timestamp": 3746.9300000071526
1076 | },
1077 | {
1078 | "stackId": 9,
1079 | "timestamp": 3759.3850000053644
1080 | },
1081 | {
1082 | "stackId": 9,
1083 | "timestamp": 3771.8850000053644
1084 | },
1085 | {
1086 | "stackId": 9,
1087 | "timestamp": 3784.344999998808
1088 | },
1089 | {
1090 | "stackId": 9,
1091 | "timestamp": 3796.8850000053644
1092 | },
1093 | {
1094 | "stackId": 9,
1095 | "timestamp": 3809.344999998808
1096 | },
1097 | {
1098 | "stackId": 9,
1099 | "timestamp": 3821.8850000053644
1100 | },
1101 | {
1102 | "stackId": 9,
1103 | "timestamp": 3834.3850000053644
1104 | },
1105 | {
1106 | "stackId": 9,
1107 | "timestamp": 3846.9300000071526
1108 | },
1109 | {
1110 | "stackId": 9,
1111 | "timestamp": 3858.3850000053644
1112 | },
1113 | {
1114 | "stackId": 9,
1115 | "timestamp": 3870.925000011921
1116 | },
1117 | {
1118 | "stackId": 9,
1119 | "timestamp": 3883.469999998808
1120 | },
1121 | {
1122 | "stackId": 9,
1123 | "timestamp": 3895.9650000035763
1124 | },
1125 | {
1126 | "stackId": 9,
1127 | "timestamp": 3908.469999998808
1128 | },
1129 | {
1130 | "stackId": 9,
1131 | "timestamp": 3921.0100000053644
1132 | },
1133 | {
1134 | "stackId": 9,
1135 | "timestamp": 3933.5100000053644
1136 | },
1137 | {
1138 | "stackId": 9,
1139 | "timestamp": 3946.0100000053644
1140 | },
1141 | {
1142 | "stackId": 9,
1143 | "timestamp": 3958.5100000053644
1144 | },
1145 | {
1146 | "stackId": 9,
1147 | "timestamp": 3971.050000011921
1148 | },
1149 | {
1150 | "stackId": 9,
1151 | "timestamp": 3983.550000011921
1152 | },
1153 | {
1154 | "stackId": 9,
1155 | "timestamp": 3996.050000011921
1156 | },
1157 | {
1158 | "stackId": 9,
1159 | "timestamp": 4008.594999998808
1160 | },
1161 | {
1162 | "stackId": 9,
1163 | "timestamp": 4021.094999998808
1164 | },
1165 | {
1166 | "stackId": 9,
1167 | "timestamp": 4025.6350000053644
1168 | },
1169 | {
1170 | "stackId": 9,
1171 | "timestamp": 4033.594999998808
1172 | },
1173 | {
1174 | "stackId": 9,
1175 | "timestamp": 4046.094999998808
1176 | },
1177 | {
1178 | "stackId": 9,
1179 | "timestamp": 4058.594999998808
1180 | },
1181 | {
1182 | "stackId": 9,
1183 | "timestamp": 4071.1350000053644
1184 | },
1185 | {
1186 | "stackId": 9,
1187 | "timestamp": 4083.640000000596
1188 | },
1189 | {
1190 | "stackId": 9,
1191 | "timestamp": 4096.135000005364
1192 | },
1193 | {
1194 | "stackId": 9,
1195 | "timestamp": 4108.640000000596
1196 | },
1197 | {
1198 | "stackId": 9,
1199 | "timestamp": 4121.175000011921
1200 | },
1201 | {
1202 | "stackId": 9,
1203 | "timestamp": 4133.680000007153
1204 | },
1205 | {
1206 | "stackId": 9,
1207 | "timestamp": 4146.175000011921
1208 | },
1209 | {
1210 | "stackId": 9,
1211 | "timestamp": 4158.675000011921
1212 | },
1213 | {
1214 | "stackId": 9,
1215 | "timestamp": 4171.219999998808
1216 | },
1217 | {
1218 | "stackId": 9,
1219 | "timestamp": 4183.719999998808
1220 | },
1221 | {
1222 | "stackId": 9,
1223 | "timestamp": 4196.260000005364
1224 | },
1225 | {
1226 | "stackId": 9,
1227 | "timestamp": 4208.805000007153
1228 | },
1229 | {
1230 | "stackId": 9,
1231 | "timestamp": 4221.305000007153
1232 | },
1233 | {
1234 | "stackId": 9,
1235 | "timestamp": 4233.800000011921
1236 | },
1237 | {
1238 | "stackId": 9,
1239 | "timestamp": 4246.344999998808
1240 | },
1241 | {
1242 | "stackId": 9,
1243 | "timestamp": 4258.844999998808
1244 | },
1245 | {
1246 | "stackId": 9,
1247 | "timestamp": 4271.344999998808
1248 | },
1249 | {
1250 | "stackId": 9,
1251 | "timestamp": 4283.844999998808
1252 | },
1253 | {
1254 | "stackId": 9,
1255 | "timestamp": 4296.385000005364
1256 | },
1257 | {
1258 | "stackId": 9,
1259 | "timestamp": 4308.885000005364
1260 | },
1261 | {
1262 | "stackId": 9,
1263 | "timestamp": 4321.385000005364
1264 | },
1265 | {
1266 | "stackId": 9,
1267 | "timestamp": 4333.930000007153
1268 | },
1269 | {
1270 | "stackId": 9,
1271 | "timestamp": 4346.385000005364
1272 | },
1273 | {
1274 | "stackId": 9,
1275 | "timestamp": 4358.885000005364
1276 | },
1277 | {
1278 | "stackId": 9,
1279 | "timestamp": 4371.385000005364
1280 | },
1281 | {
1282 | "stackId": 9,
1283 | "timestamp": 4383.925000011921
1284 | },
1285 | {
1286 | "stackId": 9,
1287 | "timestamp": 4396.385000005364
1288 | },
1289 | {
1290 | "stackId": 9,
1291 | "timestamp": 4408.885000005364
1292 | },
1293 | {
1294 | "stackId": 9,
1295 | "timestamp": 4421.385000005364
1296 | },
1297 | {
1298 | "stackId": 9,
1299 | "timestamp": 4433.969999998808
1300 | },
1301 | {
1302 | "stackId": 9,
1303 | "timestamp": 4446.469999998808
1304 | },
1305 | {
1306 | "stackId": 9,
1307 | "timestamp": 4458.969999998808
1308 | },
1309 | {
1310 | "stackId": 9,
1311 | "timestamp": 4471.510000005364
1312 | },
1313 | {
1314 | "stackId": 9,
1315 | "timestamp": 4480.765000000596
1316 | },
1317 | {
1318 | "timestamp": 4484.055000007153
1319 | },
1320 | {
1321 | "timestamp": 4496.550000011921
1322 | },
1323 | {
1324 | "timestamp": 4509.140000000596
1325 | },
1326 | {
1327 | "timestamp": 4521.635000005364
1328 | },
1329 | {
1330 | "timestamp": 4534.135000005364
1331 | },
1332 | {
1333 | "timestamp": 4546.675000011921
1334 | },
1335 | {
1336 | "timestamp": 4559.219999998808
1337 | },
1338 | {
1339 | "timestamp": 4571.260000005364
1340 | },
1341 | {
1342 | "timestamp": 4583.760000005364
1343 | },
1344 | {
1345 | "timestamp": 4596.344999998808
1346 | },
1347 | {
1348 | "timestamp": 4608.844999998808
1349 | },
1350 | {
1351 | "timestamp": 4621.390000000596
1352 | },
1353 | {
1354 | "timestamp": 4633.885000005364
1355 | },
1356 | {
1357 | "timestamp": 4646.430000007153
1358 | },
1359 | {
1360 | "timestamp": 4658.925000011921
1361 | },
1362 | {
1363 | "timestamp": 4671.510000005364
1364 | },
1365 | {
1366 | "timestamp": 4684.010000005364
1367 | },
1368 | {
1369 | "timestamp": 4696.555000007153
1370 | },
1371 | {
1372 | "timestamp": 4709.135000005364
1373 | },
1374 | {
1375 | "timestamp": 4721.635000005364
1376 | },
1377 | {
1378 | "timestamp": 4733.219999998808
1379 | },
1380 | {
1381 | "timestamp": 4745.719999998808
1382 | },
1383 | {
1384 | "timestamp": 4756.844999998808
1385 | },
1386 | {
1387 | "timestamp": 4769.344999998808
1388 | },
1389 | {
1390 | "timestamp": 4781.890000000596
1391 | },
1392 | {
1393 | "timestamp": 4794.425000011921
1394 | },
1395 | {
1396 | "timestamp": 4805.265000000596
1397 | },
1398 | {
1399 | "timestamp": 4816.015000000596
1400 | },
1401 | {
1402 | "timestamp": 4828.550000011921
1403 | },
1404 | {
1405 | "timestamp": 4841.010000005364
1406 | },
1407 | {
1408 | "timestamp": 4851.675000011921
1409 | },
1410 | {
1411 | "timestamp": 4863.219999998808
1412 | },
1413 | {
1414 | "timestamp": 4875.800000011921
1415 | },
1416 | {
1417 | "timestamp": 4888.300000011921
1418 | },
1419 | {
1420 | "timestamp": 4899.510000005364
1421 | },
1422 | {
1423 | "timestamp": 4912.055000007153
1424 | },
1425 | {
1426 | "timestamp": 4923.094999998808
1427 | },
1428 | {
1429 | "timestamp": 4934.135000005364
1430 | },
1431 | {
1432 | "timestamp": 4945.180000007153
1433 | },
1434 | {
1435 | "timestamp": 4955.300000011921
1436 | },
1437 | {
1438 | "timestamp": 4966.305000007153
1439 | },
1440 | {
1441 | "timestamp": 4978.844999998808
1442 | },
1443 | {
1444 | "timestamp": 4989.050000011921
1445 | },
1446 | {
1447 | "timestamp": 5000.260000005364
1448 | },
1449 | {
1450 | "timestamp": 5010.385000005364
1451 | },
1452 | {
1453 | "timestamp": 5021.385000005364
1454 | },
1455 | {
1456 | "timestamp": 5033.760000005364
1457 | },
1458 | {
1459 | "timestamp": 5045.550000011921
1460 | },
1461 | {
1462 | "timestamp": 5055.635000005364
1463 | },
1464 | {
1465 | "timestamp": 5068.175000011921
1466 | },
1467 | {
1468 | "timestamp": 5080.719999998808
1469 | },
1470 | {
1471 | "timestamp": 5093.260000005364
1472 | },
1473 | {
1474 | "timestamp": 5105.510000005364
1475 | },
1476 | {
1477 | "timestamp": 5117.800000011921
1478 | },
1479 | {
1480 | "timestamp": 5130.300000011921
1481 | },
1482 | {
1483 | "timestamp": 5141.925000011921
1484 | },
1485 | {
1486 | "timestamp": 5154.385000005364
1487 | },
1488 | {
1489 | "timestamp": 5165.050000011921
1490 | },
1491 | {
1492 | "timestamp": 5177.550000011921
1493 | },
1494 | {
1495 | "timestamp": 5190.094999998808
1496 | },
1497 | {
1498 | "timestamp": 5200.760000005364
1499 | },
1500 | {
1501 | "timestamp": 5213.340000003576
1502 | },
1503 | {
1504 | "timestamp": 5225.885000005364
1505 | },
1506 | {
1507 | "timestamp": 5237.094999998808
1508 | },
1509 | {
1510 | "timestamp": 5249.635000005364
1511 | },
1512 | {
1513 | "timestamp": 5260.385000005364
1514 | },
1515 | {
1516 | "timestamp": 5272.890000000596
1517 | },
1518 | {
1519 | "timestamp": 5285.469999998808
1520 | },
1521 | {
1522 | "timestamp": 5295.555000007153
1523 | },
1524 | {
1525 | "timestamp": 5307.260000005364
1526 | },
1527 | {
1528 | "timestamp": 5319.390000000596
1529 | },
1530 | {
1531 | "timestamp": 5331.925000011921
1532 | },
1533 | {
1534 | "timestamp": 5343.425000011921
1535 | },
1536 | {
1537 | "timestamp": 5355.469999998808
1538 | },
1539 | {
1540 | "timestamp": 5367.010000005364
1541 | },
1542 | {
1543 | "timestamp": 5379.550000011921
1544 | },
1545 | {
1546 | "timestamp": 5392.090000003576
1547 | },
1548 | {
1549 | "timestamp": 5404.594999998808
1550 | },
1551 | {
1552 | "timestamp": 5420.885000005364
1553 | },
1554 | {
1555 | "timestamp": 5432.675000011921
1556 | },
1557 | {
1558 | "timestamp": 5445.219999998808
1559 | },
1560 | {
1561 | "timestamp": 5457.805000007153
1562 | },
1563 | {
1564 | "timestamp": 5470.385000005364
1565 | },
1566 | {
1567 | "timestamp": 5481.390000000596
1568 | },
1569 | {
1570 | "timestamp": 5492.925000011921
1571 | },
1572 | {
1573 | "timestamp": 5505.469999998808
1574 | },
1575 | {
1576 | "timestamp": 5518.010000005364
1577 | },
1578 | {
1579 | "timestamp": 5530.550000011921
1580 | },
1581 | {
1582 | "timestamp": 5543.135000005364
1583 | },
1584 | {
1585 | "timestamp": 5555.675000011921
1586 | },
1587 | {
1588 | "timestamp": 5565.965000003576
1589 | },
1590 | {
1591 | "timestamp": 5577.805000007153
1592 | },
1593 | {
1594 | "timestamp": 5590.180000007153
1595 | },
1596 | {
1597 | "timestamp": 5602.715000003576
1598 | },
1599 | {
1600 | "timestamp": 5613.550000011921
1601 | },
1602 | {
1603 | "timestamp": 5625.760000005364
1604 | },
1605 | {
1606 | "timestamp": 5638.300000011921
1607 | },
1608 | {
1609 | "timestamp": 5650.805000007153
1610 | },
1611 | {
1612 | "timestamp": 5663.344999998808
1613 | },
1614 | {
1615 | "timestamp": 5675.844999998808
1616 | },
1617 | {
1618 | "timestamp": 5686.215000003576
1619 | },
1620 | {
1621 | "timestamp": 5697.260000005364
1622 | },
1623 | {
1624 | "timestamp": 5708.340000003576
1625 | },
1626 | {
1627 | "timestamp": 5719.094999998808
1628 | },
1629 | {
1630 | "timestamp": 5730.135000005364
1631 | },
1632 | {
1633 | "timestamp": 5742.140000000596
1634 | },
1635 | {
1636 | "timestamp": 5754.760000005364
1637 | },
1638 | {
1639 | "timestamp": 5767.260000005364
1640 | },
1641 | {
1642 | "timestamp": 5779.800000011921
1643 | },
1644 | {
1645 | "timestamp": 5792.305000007153
1646 | },
1647 | {
1648 | "timestamp": 5804.844999998808
1649 | },
1650 | {
1651 | "timestamp": 5817.385000005364
1652 | },
1653 | {
1654 | "timestamp": 5828.385000005364
1655 | },
1656 | {
1657 | "timestamp": 5839.425000011921
1658 | },
1659 | {
1660 | "timestamp": 5850.930000007153
1661 | },
1662 | {
1663 | "timestamp": 5862.050000011921
1664 | },
1665 | {
1666 | "timestamp": 5873.140000000596
1667 | },
1668 | {
1669 | "timestamp": 5884.135000005364
1670 | },
1671 | {
1672 | "timestamp": 5895.215000003576
1673 | },
1674 | {
1675 | "timestamp": 5905.385000005364
1676 | },
1677 | {
1678 | "timestamp": 5916.469999998808
1679 | },
1680 | {
1681 | "timestamp": 5927.594999998808
1682 | },
1683 | {
1684 | "timestamp": 5938.010000005364
1685 | },
1686 | {
1687 | "timestamp": 5949.675000011921
1688 | },
1689 | {
1690 | "timestamp": 5961.510000005364
1691 | },
1692 | {
1693 | "timestamp": 5972.469999998808
1694 | },
1695 | {
1696 | "timestamp": 5987.510000005364
1697 | },
1698 | {
1699 | "timestamp": 6000.090000003576
1700 | },
1701 | {
1702 | "timestamp": 6012.719999998808
1703 | },
1704 | {
1705 | "timestamp": 6023.760000005364
1706 | },
1707 | {
1708 | "timestamp": 6034.719999998808
1709 | },
1710 | {
1711 | "timestamp": 6045.930000007153
1712 | },
1713 | {
1714 | "timestamp": 6058.430000007153
1715 | },
1716 | {
1717 | "timestamp": 6070.965000003576
1718 | },
1719 | {
1720 | "timestamp": 6083.550000011921
1721 | },
1722 | {
1723 | "timestamp": 6096.094999998808
1724 | },
1725 | {
1726 | "timestamp": 6108.425000011921
1727 | },
1728 | {
1729 | "timestamp": 6120.925000011921
1730 | },
1731 | {
1732 | "timestamp": 6133.510000005364
1733 | },
1734 | {
1735 | "timestamp": 6143.760000005364
1736 | },
1737 | {
1738 | "timestamp": 6155.344999998808
1739 | },
1740 | {
1741 | "timestamp": 6167.719999998808
1742 | },
1743 | {
1744 | "timestamp": 6180.265000000596
1745 | },
1746 | {
1747 | "timestamp": 6192.885000005364
1748 | },
1749 | {
1750 | "timestamp": 6205.515000000596
1751 | },
1752 | {
1753 | "timestamp": 6217.760000005364
1754 | },
1755 | {
1756 | "timestamp": 6230.425000011921
1757 | },
1758 | {
1759 | "timestamp": 6242.300000011921
1760 | },
1761 | {
1762 | "timestamp": 6254.840000003576
1763 | },
1764 | {
1765 | "timestamp": 6266.635000005364
1766 | },
1767 | {
1768 | "timestamp": 6277.719999998808
1769 | },
1770 | {
1771 | "timestamp": 6288.715000003576
1772 | },
1773 | {
1774 | "timestamp": 6301.094999998808
1775 | },
1776 | {
1777 | "timestamp": 6313.635000005364
1778 | },
1779 | {
1780 | "timestamp": 6326.175000011921
1781 | },
1782 | {
1783 | "timestamp": 6337.300000011921
1784 | },
1785 | {
1786 | "timestamp": 6347.510000005364
1787 | },
1788 | {
1789 | "timestamp": 6357.680000007153
1790 | },
1791 | {
1792 | "timestamp": 6370.219999998808
1793 | },
1794 | {
1795 | "timestamp": 6382.760000005364
1796 | },
1797 | {
1798 | "timestamp": 6395.305000007153
1799 | },
1800 | {
1801 | "timestamp": 6405.590000003576
1802 | },
1803 | {
1804 | "timestamp": 6418.260000005364
1805 | },
1806 | {
1807 | "timestamp": 6429.219999998808
1808 | },
1809 | {
1810 | "timestamp": 6441.840000003576
1811 | },
1812 | {
1813 | "timestamp": 6454.385000005364
1814 | },
1815 | {
1816 | "timestamp": 6464.675000011921
1817 | },
1818 | {
1819 | "timestamp": 6477.135000005364
1820 | },
1821 | {
1822 | "timestamp": 6487.844999998808
1823 | },
1824 | {
1825 | "timestamp": 6499.675000011921
1826 | },
1827 | {
1828 | "timestamp": 6510.260000005364
1829 | },
1830 | {
1831 | "timestamp": 6522.844999998808
1832 | },
1833 | {
1834 | "timestamp": 6533.550000011921
1835 | },
1836 | {
1837 | "timestamp": 6544.469999998808
1838 | },
1839 | {
1840 | "timestamp": 6557.010000005364
1841 | },
1842 | {
1843 | "timestamp": 6567.090000003576
1844 | },
1845 | {
1846 | "timestamp": 6579.680000007153
1847 | },
1848 | {
1849 | "timestamp": 6591.594999998808
1850 | },
1851 | {
1852 | "timestamp": 6604.094999998808
1853 | },
1854 | {
1855 | "timestamp": 6616.594999998808
1856 | },
1857 | {
1858 | "timestamp": 6627.635000005364
1859 | },
1860 | {
1861 | "timestamp": 6638.675000011921
1862 | },
1863 | {
1864 | "timestamp": 6649.719999998808
1865 | },
1866 | {
1867 | "timestamp": 6660.760000005364
1868 | },
1869 | {
1870 | "timestamp": 6671.800000011921
1871 | },
1872 | {
1873 | "timestamp": 6682.844999998808
1874 | },
1875 | {
1876 | "timestamp": 6693.885000005364
1877 | },
1878 | {
1879 | "timestamp": 6704.930000007153
1880 | },
1881 | {
1882 | "timestamp": 6715.300000011921
1883 | },
1884 | {
1885 | "timestamp": 6725.344999998808
1886 | },
1887 | {
1888 | "timestamp": 6735.550000011921
1889 | },
1890 | {
1891 | "timestamp": 6747.844999998808
1892 | },
1893 | {
1894 | "timestamp": 6760.390000000596
1895 | },
1896 | {
1897 | "timestamp": 6770.800000011921
1898 | },
1899 | {
1900 | "timestamp": 6783.260000005364
1901 | },
1902 | {
1903 | "timestamp": 6795.175000011921
1904 | },
1905 | {
1906 | "timestamp": 6805.215000003576
1907 | },
1908 | {
1909 | "timestamp": 6815.300000011921
1910 | },
1911 | {
1912 | "timestamp": 6827.344999998808
1913 | },
1914 | {
1915 | "timestamp": 6837.635000005364
1916 | },
1917 | {
1918 | "timestamp": 6850.305000007153
1919 | },
1920 | {
1921 | "timestamp": 6861.969999998808
1922 | },
1923 | {
1924 | "timestamp": 6875.180000007153
1925 | },
1926 | {
1927 | "timestamp": 6886.385000005364
1928 | },
1929 | {
1930 | "timestamp": 6897.425000011921
1931 | },
1932 | {
1933 | "timestamp": 6909.965000003576
1934 | },
1935 | {
1936 | "timestamp": 6922.594999998808
1937 | },
1938 | {
1939 | "timestamp": 6935.219999998808
1940 | },
1941 | {
1942 | "timestamp": 6947.260000005364
1943 | },
1944 | {
1945 | "timestamp": 6958.969999998808
1946 | },
1947 | {
1948 | "timestamp": 6971.510000005364
1949 | },
1950 | {
1951 | "timestamp": 6982.430000007153
1952 | },
1953 | {
1954 | "timestamp": 6992.760000005364
1955 | },
1956 | {
1957 | "timestamp": 7004.594999998808
1958 | },
1959 | {
1960 | "timestamp": 7017.094999998808
1961 | },
1962 | {
1963 | "timestamp": 7029.635000005364
1964 | },
1965 | {
1966 | "timestamp": 7042.175000011921
1967 | },
1968 | {
1969 | "timestamp": 7054.719999998808
1970 | },
1971 | {
1972 | "timestamp": 7067.260000005364
1973 | },
1974 | {
1975 | "timestamp": 7079.800000011921
1976 | },
1977 | {
1978 | "timestamp": 7092.390000000596
1979 | },
1980 | {
1981 | "timestamp": 7105.010000005364
1982 | },
1983 | {
1984 | "timestamp": 7116.760000005364
1985 | },
1986 | {
1987 | "timestamp": 7129.305000007153
1988 | },
1989 | {
1990 | "timestamp": 7141.844999998808
1991 | },
1992 | {
1993 | "timestamp": 7154.385000005364
1994 | },
1995 | {
1996 | "timestamp": 7166.925000011921
1997 | },
1998 | {
1999 | "timestamp": 7177.390000000596
2000 | },
2001 | {
2002 | "timestamp": 7189.094999998808
2003 | },
2004 | {
2005 | "timestamp": 7201.010000005364
2006 | },
2007 | {
2008 | "timestamp": 7213.510000005364
2009 | },
2010 | {
2011 | "timestamp": 7225.885000005364
2012 | },
2013 | {
2014 | "timestamp": 7237.594999998808
2015 | },
2016 | {
2017 | "timestamp": 7249.844999998808
2018 | },
2019 | {
2020 | "timestamp": 7260.925000011921
2021 | },
2022 | {
2023 | "timestamp": 7273.469999998808
2024 | },
2025 | {
2026 | "timestamp": 7286.010000005364
2027 | },
2028 | {
2029 | "timestamp": 7300.300000011921
2030 | },
2031 | {
2032 | "timestamp": 7312.805000007153
2033 | },
2034 | {
2035 | "timestamp": 7325.635000005364
2036 | },
2037 | {
2038 | "timestamp": 7335.890000000596
2039 | },
2040 | {
2041 | "timestamp": 7349.555000007153
2042 | },
2043 | {
2044 | "timestamp": 7363.390000000596
2045 | },
2046 | {
2047 | "timestamp": 7376.010000005364
2048 | },
2049 | {
2050 | "timestamp": 7388.094999998808
2051 | },
2052 | {
2053 | "timestamp": 7400.305000007153
2054 | },
2055 | {
2056 | "timestamp": 7412.469999998808
2057 | },
2058 | {
2059 | "timestamp": 7425.260000005364
2060 | },
2061 | {
2062 | "timestamp": 7437.800000011921
2063 | },
2064 | {
2065 | "timestamp": 7450.050000011921
2066 | },
2067 | {
2068 | "timestamp": 7462.550000011921
2069 | },
2070 | {
2071 | "timestamp": 7475.094999998808
2072 | },
2073 | {
2074 | "timestamp": 7487.555000007153
2075 | },
2076 | {
2077 | "timestamp": 7500.135000005364
2078 | },
2079 | {
2080 | "timestamp": 7512.635000005364
2081 | },
2082 | {
2083 | "timestamp": 7525.219999998808
2084 | },
2085 | {
2086 | "timestamp": 7537.800000011921
2087 | },
2088 | {
2089 | "timestamp": 7549.635000005364
2090 | },
2091 | {
2092 | "timestamp": 7562.175000011921
2093 | },
2094 | {
2095 | "timestamp": 7574.675000011921
2096 | },
2097 | {
2098 | "timestamp": 7587.219999998808
2099 | },
2100 | {
2101 | "timestamp": 7599.719999998808
2102 | },
2103 | {
2104 | "timestamp": 7612.260000005364
2105 | },
2106 | {
2107 | "timestamp": 7627.260000005364
2108 | },
2109 | {
2110 | "timestamp": 7639.719999998808
2111 | },
2112 | {
2113 | "timestamp": 7652.300000011921
2114 | },
2115 | {
2116 | "timestamp": 7663.219999998808
2117 | },
2118 | {
2119 | "timestamp": 7675.344999998808
2120 | },
2121 | {
2122 | "timestamp": 7685.555000007153
2123 | },
2124 | {
2125 | "timestamp": 7696.469999998808
2126 | },
2127 | {
2128 | "timestamp": 7708.760000005364
2129 | }
2130 | ],
2131 | "stacks": [
2132 | {
2133 | "frameId": 1
2134 | },
2135 | {
2136 | "frameId": 0,
2137 | "parentId": 0
2138 | },
2139 | {
2140 | "frameId": 3
2141 | },
2142 | {
2143 | "frameId": 2,
2144 | "parentId": 2
2145 | },
2146 | {
2147 | "frameId": 4,
2148 | "parentId": 3
2149 | },
2150 | {
2151 | "frameId": 5,
2152 | "parentId": 3
2153 | },
2154 | {
2155 | "frameId": 6,
2156 | "parentId": 2
2157 | },
2158 | {
2159 | "frameId": 7,
2160 | "parentId": 2
2161 | },
2162 | {
2163 | "frameId": 9
2164 | },
2165 | {
2166 | "frameId": 8,
2167 | "parentId": 8
2168 | }
2169 | ]
2170 | }
--------------------------------------------------------------------------------
/src/test-data/edit-three.json:
--------------------------------------------------------------------------------
1 | {
2 | "frames": [
3 | {
4 | "name": "Profiler"
5 | },
6 | {
7 | "column": 38,
8 | "line": 214,
9 | "name": "startProfiling",
10 | "resourceId": 0
11 | },
12 | {
13 | "column": 28,
14 | "line": 347,
15 | "name": "main",
16 | "resourceId": 0
17 | },
18 | {
19 | "column": 33,
20 | "line": 398,
21 | "name": "executeWorkload",
22 | "resourceId": 0
23 | },
24 | {
25 | "column": 32,
26 | "line": 348,
27 | "name": "beforeTask",
28 | "resourceId": 0
29 | },
30 | {
31 | "column": 31,
32 | "line": 354,
33 | "name": "afterTask",
34 | "resourceId": 0
35 | },
36 | {
37 | "column": 28,
38 | "line": 385,
39 | "name": "afterTask1",
40 | "resourceId": 0
41 | },
42 | {
43 | "column": 28,
44 | "line": 391,
45 | "name": "afterTask2",
46 | "resourceId": 0
47 | },
48 | {
49 | "column": 37,
50 | "line": 341,
51 | "name": "taskInAsyncFunction",
52 | "resourceId": 0
53 | },
54 | {
55 | "column": 33,
56 | "line": 361,
57 | "name": "task2",
58 | "resourceId": 0
59 | }
60 | ],
61 | "resources": [
62 | "http://localhost:3000/"
63 | ],
64 | "samples": [
65 | {
66 | "stackId": 1,
67 | "timestamp": 462.7600000053644
68 | },
69 | {
70 | "timestamp": 475.0949999988079
71 | },
72 | {
73 | "timestamp": 484.8449999988079
74 | },
75 | {
76 | "timestamp": 487.64000000059605
77 | },
78 | {
79 | "timestamp": 500.18000000715256
80 | },
81 | {
82 | "timestamp": 512.6750000119209
83 | },
84 | {
85 | "timestamp": 525.0949999988079
86 | },
87 | {
88 | "timestamp": 537.5900000035763
89 | },
90 | {
91 | "timestamp": 550.0949999988079
92 | },
93 | {
94 | "timestamp": 560.3850000053644
95 | },
96 | {
97 | "timestamp": 562.765000000596
98 | },
99 | {
100 | "timestamp": 572.8850000053644
101 | },
102 | {
103 | "timestamp": 583.9650000035763
104 | },
105 | {
106 | "timestamp": 596.5100000053644
107 | },
108 | {
109 | "timestamp": 597.3850000053644
110 | },
111 | {
112 | "timestamp": 609.0500000119209
113 | },
114 | {
115 | "timestamp": 621.9250000119209
116 | },
117 | {
118 | "timestamp": 634.4250000119209
119 | },
120 | {
121 | "timestamp": 646.4650000035763
122 | },
123 | {
124 | "timestamp": 659.0100000053644
125 | },
126 | {
127 | "timestamp": 671.4250000119209
128 | },
129 | {
130 | "timestamp": 683.4250000119209
131 | },
132 | {
133 | "timestamp": 693.6800000071526
134 | },
135 | {
136 | "timestamp": 704.3050000071526
137 | },
138 | {
139 | "timestamp": 716.7199999988079
140 | },
141 | {
142 | "timestamp": 729.2600000053644
143 | },
144 | {
145 | "timestamp": 741.7199999988079
146 | },
147 | {
148 | "timestamp": 754.2199999988079
149 | },
150 | {
151 | "timestamp": 766.7199999988079
152 | },
153 | {
154 | "timestamp": 779.2600000053644
155 | },
156 | {
157 | "timestamp": 791.8050000071526
158 | },
159 | {
160 | "timestamp": 804.3000000119209
161 | },
162 | {
163 | "timestamp": 816.8449999988079
164 | },
165 | {
166 | "timestamp": 829.3449999988079
167 | },
168 | {
169 | "timestamp": 841.8850000053644
170 | },
171 | {
172 | "timestamp": 854.3449999988079
173 | },
174 | {
175 | "timestamp": 866.8850000053644
176 | },
177 | {
178 | "timestamp": 879.4250000119209
179 | },
180 | {
181 | "timestamp": 892.0100000053644
182 | },
183 | {
184 | "timestamp": 904.5550000071526
185 | },
186 | {
187 | "timestamp": 917.0949999988079
188 | },
189 | {
190 | "timestamp": 929.2600000053644
191 | },
192 | {
193 | "timestamp": 941.7600000053644
194 | },
195 | {
196 | "timestamp": 954.2600000053644
197 | },
198 | {
199 | "timestamp": 966.7600000053644
200 | },
201 | {
202 | "timestamp": 979.3449999988079
203 | },
204 | {
205 | "timestamp": 991.8850000053644
206 | },
207 | {
208 | "timestamp": 1004.3449999988079
209 | },
210 | {
211 | "timestamp": 1016.8850000053644
212 | },
213 | {
214 | "timestamp": 1029.3400000035763
215 | },
216 | {
217 | "timestamp": 1041.969999998808
218 | },
219 | {
220 | "timestamp": 1054.3050000071526
221 | },
222 | {
223 | "timestamp": 1066.8050000071526
224 | },
225 | {
226 | "timestamp": 1079.2600000053644
227 | },
228 | {
229 | "timestamp": 1091.844999998808
230 | },
231 | {
232 | "timestamp": 1104.3850000053644
233 | },
234 | {
235 | "timestamp": 1116.9300000071526
236 | },
237 | {
238 | "timestamp": 1129.5100000053644
239 | },
240 | {
241 | "timestamp": 1141.800000011921
242 | },
243 | {
244 | "timestamp": 1154.300000011921
245 | },
246 | {
247 | "timestamp": 1166.8850000053644
248 | },
249 | {
250 | "timestamp": 1179.469999998808
251 | },
252 | {
253 | "timestamp": 1192.0100000053644
254 | },
255 | {
256 | "timestamp": 1204.469999998808
257 | },
258 | {
259 | "timestamp": 1217.050000011921
260 | },
261 | {
262 | "timestamp": 1229.5550000071526
263 | },
264 | {
265 | "timestamp": 1242.050000011921
266 | },
267 | {
268 | "timestamp": 1254.594999998808
269 | },
270 | {
271 | "timestamp": 1267.1350000053644
272 | },
273 | {
274 | "timestamp": 1279.6350000053644
275 | },
276 | {
277 | "timestamp": 1292.1800000071526
278 | },
279 | {
280 | "timestamp": 1304.765000000596
281 | },
282 | {
283 | "timestamp": 1316.8050000071526
284 | },
285 | {
286 | "timestamp": 1329.344999998808
287 | },
288 | {
289 | "timestamp": 1341.8850000053644
290 | },
291 | {
292 | "timestamp": 1354.2600000053644
293 | },
294 | {
295 | "timestamp": 1366.7150000035763
296 | },
297 | {
298 | "timestamp": 1377.219999998808
299 | },
300 | {
301 | "timestamp": 1389.719999998808
302 | },
303 | {
304 | "timestamp": 1402.050000011921
305 | },
306 | {
307 | "timestamp": 1412.5900000035763
308 | },
309 | {
310 | "timestamp": 1425.1350000053644
311 | },
312 | {
313 | "timestamp": 1435.5100000053644
314 | },
315 | {
316 | "timestamp": 1447.300000011921
317 | },
318 | {
319 | "timestamp": 1459.3850000053644
320 | },
321 | {
322 | "timestamp": 1471.844999998808
323 | },
324 | {
325 | "timestamp": 1484.425000011921
326 | },
327 | {
328 | "timestamp": 1496.925000011921
329 | },
330 | {
331 | "timestamp": 1509.469999998808
332 | },
333 | {
334 | "timestamp": 1521.9650000035763
335 | },
336 | {
337 | "timestamp": 1534.5100000053644
338 | },
339 | {
340 | "timestamp": 1547.0100000053644
341 | },
342 | {
343 | "timestamp": 1559.5900000035763
344 | },
345 | {
346 | "timestamp": 1571.469999998808
347 | },
348 | {
349 | "timestamp": 1583.344999998808
350 | },
351 | {
352 | "timestamp": 1593.9650000035763
353 | },
354 | {
355 | "timestamp": 1604.2600000053644
356 | },
357 | {
358 | "timestamp": 1616.765000000596
359 | },
360 | {
361 | "timestamp": 1629.550000011921
362 | },
363 | {
364 | "timestamp": 1641.6350000053644
365 | },
366 | {
367 | "timestamp": 1654.2150000035763
368 | },
369 | {
370 | "timestamp": 1665.594999998808
371 | },
372 | {
373 | "timestamp": 1677.3850000053644
374 | },
375 | {
376 | "timestamp": 1689.844999998808
377 | },
378 | {
379 | "timestamp": 1701.219999998808
380 | },
381 | {
382 | "stackId": 3,
383 | "timestamp": 1715.719999998808
384 | },
385 | {
386 | "stackId": 4,
387 | "timestamp": 1717.469999998808
388 | },
389 | {
390 | "stackId": 4,
391 | "timestamp": 1728.2600000053644
392 | },
393 | {
394 | "stackId": 4,
395 | "timestamp": 1740.800000011921
396 | },
397 | {
398 | "stackId": 4,
399 | "timestamp": 1752.050000011921
400 | },
401 | {
402 | "stackId": 4,
403 | "timestamp": 1764.550000011921
404 | },
405 | {
406 | "stackId": 4,
407 | "timestamp": 1776.0100000053644
408 | },
409 | {
410 | "stackId": 4,
411 | "timestamp": 1788.5550000071526
412 | },
413 | {
414 | "stackId": 4,
415 | "timestamp": 1801.0550000071526
416 | },
417 | {
418 | "stackId": 4,
419 | "timestamp": 1813.550000011921
420 | },
421 | {
422 | "stackId": 4,
423 | "timestamp": 1826.0900000035763
424 | },
425 | {
426 | "stackId": 4,
427 | "timestamp": 1838.6350000053644
428 | },
429 | {
430 | "stackId": 4,
431 | "timestamp": 1851.0100000053644
432 | },
433 | {
434 | "stackId": 4,
435 | "timestamp": 1863.5550000071526
436 | },
437 | {
438 | "stackId": 4,
439 | "timestamp": 1876.0550000071526
440 | },
441 | {
442 | "stackId": 4,
443 | "timestamp": 1888.594999998808
444 | },
445 | {
446 | "stackId": 4,
447 | "timestamp": 1901.015000000596
448 | },
449 | {
450 | "stackId": 4,
451 | "timestamp": 1913.5550000071526
452 | },
453 | {
454 | "stackId": 4,
455 | "timestamp": 1926.094999998808
456 | },
457 | {
458 | "stackId": 4,
459 | "timestamp": 1938.594999998808
460 | },
461 | {
462 | "stackId": 4,
463 | "timestamp": 1951.0100000053644
464 | },
465 | {
466 | "stackId": 4,
467 | "timestamp": 1961.719999998808
468 | },
469 | {
470 | "stackId": 4,
471 | "timestamp": 1974.265000000596
472 | },
473 | {
474 | "stackId": 4,
475 | "timestamp": 1985.4300000071526
476 | },
477 | {
478 | "stackId": 4,
479 | "timestamp": 1997.969999998808
480 | },
481 | {
482 | "stackId": 4,
483 | "timestamp": 2010.2600000053644
484 | },
485 | {
486 | "stackId": 4,
487 | "timestamp": 2022.800000011921
488 | },
489 | {
490 | "stackId": 4,
491 | "timestamp": 2034.344999998808
492 | },
493 | {
494 | "stackId": 4,
495 | "timestamp": 2046.8850000053644
496 | },
497 | {
498 | "stackId": 4,
499 | "timestamp": 2059.390000000596
500 | },
501 | {
502 | "stackId": 4,
503 | "timestamp": 2071.925000011921
504 | },
505 | {
506 | "stackId": 4,
507 | "timestamp": 2084.3400000035763
508 | },
509 | {
510 | "stackId": 4,
511 | "timestamp": 2096.890000000596
512 | },
513 | {
514 | "stackId": 4,
515 | "timestamp": 2109.3850000053644
516 | },
517 | {
518 | "stackId": 4,
519 | "timestamp": 2121.8850000053644
520 | },
521 | {
522 | "stackId": 4,
523 | "timestamp": 2134.4300000071526
524 | },
525 | {
526 | "stackId": 4,
527 | "timestamp": 2146.925000011921
528 | },
529 | {
530 | "stackId": 4,
531 | "timestamp": 2159.425000011921
532 | },
533 | {
534 | "stackId": 4,
535 | "timestamp": 2171.969999998808
536 | },
537 | {
538 | "stackId": 4,
539 | "timestamp": 2184.344999998808
540 | },
541 | {
542 | "stackId": 4,
543 | "timestamp": 2191.3850000053644
544 | },
545 | {
546 | "stackId": 5,
547 | "timestamp": 2192.1800000071526
548 | },
549 | {
550 | "stackId": 5,
551 | "timestamp": 2196.8850000053644
552 | },
553 | {
554 | "stackId": 5,
555 | "timestamp": 2209.4300000071526
556 | },
557 | {
558 | "stackId": 5,
559 | "timestamp": 2221.8850000053644
560 | },
561 | {
562 | "stackId": 5,
563 | "timestamp": 2234.3400000035763
564 | },
565 | {
566 | "stackId": 5,
567 | "timestamp": 2245.890000000596
568 | },
569 | {
570 | "stackId": 5,
571 | "timestamp": 2258.3850000053644
572 | },
573 | {
574 | "stackId": 5,
575 | "timestamp": 2270.925000011921
576 | },
577 | {
578 | "stackId": 5,
579 | "timestamp": 2283.469999998808
580 | },
581 | {
582 | "stackId": 5,
583 | "timestamp": 2295.8850000053644
584 | },
585 | {
586 | "stackId": 5,
587 | "timestamp": 2308.3850000053644
588 | },
589 | {
590 | "stackId": 5,
591 | "timestamp": 2320.8850000053644
592 | },
593 | {
594 | "stackId": 5,
595 | "timestamp": 2333.3850000053644
596 | },
597 | {
598 | "stackId": 5,
599 | "timestamp": 2345.925000011921
600 | },
601 | {
602 | "stackId": 5,
603 | "timestamp": 2358.3400000035763
604 | },
605 | {
606 | "stackId": 5,
607 | "timestamp": 2370.890000000596
608 | },
609 | {
610 | "stackId": 5,
611 | "timestamp": 2383.4300000071526
612 | },
613 | {
614 | "stackId": 5,
615 | "timestamp": 2395.925000011921
616 | },
617 | {
618 | "stackId": 5,
619 | "timestamp": 2408.469999998808
620 | },
621 | {
622 | "stackId": 5,
623 | "timestamp": 2420.8850000053644
624 | },
625 | {
626 | "stackId": 5,
627 | "timestamp": 2433.3850000053644
628 | },
629 | {
630 | "stackId": 5,
631 | "timestamp": 2445.8850000053644
632 | },
633 | {
634 | "stackId": 5,
635 | "timestamp": 2458.3850000053644
636 | },
637 | {
638 | "stackId": 5,
639 | "timestamp": 2470.8850000053644
640 | },
641 | {
642 | "stackId": 5,
643 | "timestamp": 2483.3850000053644
644 | },
645 | {
646 | "stackId": 5,
647 | "timestamp": 2495.969999998808
648 | },
649 | {
650 | "stackId": 5,
651 | "timestamp": 2508.3850000053644
652 | },
653 | {
654 | "stackId": 5,
655 | "timestamp": 2520.8850000053644
656 | },
657 | {
658 | "stackId": 5,
659 | "timestamp": 2533.425000011921
660 | },
661 | {
662 | "stackId": 5,
663 | "timestamp": 2545.890000000596
664 | },
665 | {
666 | "stackId": 5,
667 | "timestamp": 2558.3850000053644
668 | },
669 | {
670 | "stackId": 5,
671 | "timestamp": 2570.925000011921
672 | },
673 | {
674 | "stackId": 5,
675 | "timestamp": 2583.469999998808
676 | },
677 | {
678 | "stackId": 5,
679 | "timestamp": 2595.969999998808
680 | },
681 | {
682 | "stackId": 5,
683 | "timestamp": 2608.5100000053644
684 | },
685 | {
686 | "stackId": 5,
687 | "timestamp": 2620.9650000035763
688 | },
689 | {
690 | "stackId": 5,
691 | "timestamp": 2633.550000011921
692 | },
693 | {
694 | "stackId": 5,
695 | "timestamp": 2645.969999998808
696 | },
697 | {
698 | "stackId": 5,
699 | "timestamp": 2652.1350000053644
700 | },
701 | {
702 | "stackId": 6,
703 | "timestamp": 2652.8850000053644
704 | },
705 | {
706 | "stackId": 6,
707 | "timestamp": 2658.5100000053644
708 | },
709 | {
710 | "stackId": 6,
711 | "timestamp": 2670.969999998808
712 | },
713 | {
714 | "stackId": 6,
715 | "timestamp": 2683.469999998808
716 | },
717 | {
718 | "stackId": 6,
719 | "timestamp": 2695.1350000053644
720 | },
721 | {
722 | "stackId": 6,
723 | "timestamp": 2707.4300000071526
724 | },
725 | {
726 | "stackId": 6,
727 | "timestamp": 2718.719999998808
728 | },
729 | {
730 | "stackId": 6,
731 | "timestamp": 2729.300000011921
732 | },
733 | {
734 | "stackId": 6,
735 | "timestamp": 2741.800000011921
736 | },
737 | {
738 | "stackId": 6,
739 | "timestamp": 2754.344999998808
740 | },
741 | {
742 | "stackId": 6,
743 | "timestamp": 2766.8050000071526
744 | },
745 | {
746 | "stackId": 6,
747 | "timestamp": 2779.344999998808
748 | },
749 | {
750 | "stackId": 6,
751 | "timestamp": 2791.800000011921
752 | },
753 | {
754 | "stackId": 6,
755 | "timestamp": 2804.344999998808
756 | },
757 | {
758 | "stackId": 6,
759 | "timestamp": 2816.8850000053644
760 | },
761 | {
762 | "stackId": 6,
763 | "timestamp": 2829.3850000053644
764 | },
765 | {
766 | "stackId": 6,
767 | "timestamp": 2841.8850000053644
768 | },
769 | {
770 | "stackId": 6,
771 | "timestamp": 2854.4300000071526
772 | },
773 | {
774 | "stackId": 6,
775 | "timestamp": 2866.9300000071526
776 | },
777 | {
778 | "stackId": 6,
779 | "timestamp": 2879.425000011921
780 | },
781 | {
782 | "stackId": 6,
783 | "timestamp": 2891.969999998808
784 | },
785 | {
786 | "stackId": 6,
787 | "timestamp": 2904.5100000053644
788 | },
789 | {
790 | "stackId": 6,
791 | "timestamp": 2917.0100000053644
792 | },
793 | {
794 | "stackId": 6,
795 | "timestamp": 2929.5100000053644
796 | },
797 | {
798 | "stackId": 6,
799 | "timestamp": 2942.0550000071526
800 | },
801 | {
802 | "stackId": 6,
803 | "timestamp": 2954.550000011921
804 | },
805 | {
806 | "stackId": 6,
807 | "timestamp": 2967.0550000071526
808 | },
809 | {
810 | "stackId": 6,
811 | "timestamp": 2979.5550000071526
812 | },
813 | {
814 | "stackId": 6,
815 | "timestamp": 2992.094999998808
816 | },
817 | {
818 | "stackId": 6,
819 | "timestamp": 3004.594999998808
820 | },
821 | {
822 | "stackId": 6,
823 | "timestamp": 3017.1350000053644
824 | },
825 | {
826 | "stackId": 6,
827 | "timestamp": 3029.6350000053644
828 | },
829 | {
830 | "stackId": 6,
831 | "timestamp": 3041.765000000596
832 | },
833 | {
834 | "stackId": 6,
835 | "timestamp": 3054.265000000596
836 | },
837 | {
838 | "stackId": 6,
839 | "timestamp": 3066.800000011921
840 | },
841 | {
842 | "stackId": 6,
843 | "timestamp": 3079.2600000053644
844 | },
845 | {
846 | "stackId": 6,
847 | "timestamp": 3091.7600000053644
848 | },
849 | {
850 | "stackId": 6,
851 | "timestamp": 3104.2600000053644
852 | },
853 | {
854 | "stackId": 6,
855 | "timestamp": 3110.675000011921
856 | },
857 | {
858 | "stackId": 7,
859 | "timestamp": 3111.344999998808
860 | },
861 | {
862 | "stackId": 7,
863 | "timestamp": 3116.8050000071526
864 | },
865 | {
866 | "stackId": 7,
867 | "timestamp": 3129.344999998808
868 | },
869 | {
870 | "stackId": 7,
871 | "timestamp": 3141.8850000053644
872 | },
873 | {
874 | "stackId": 7,
875 | "timestamp": 3154.3850000053644
876 | },
877 | {
878 | "stackId": 7,
879 | "timestamp": 3166.9300000071526
880 | },
881 | {
882 | "stackId": 7,
883 | "timestamp": 3179.425000011921
884 | },
885 | {
886 | "stackId": 7,
887 | "timestamp": 3191.969999998808
888 | },
889 | {
890 | "stackId": 7,
891 | "timestamp": 3204.4650000035763
892 | },
893 | {
894 | "stackId": 7,
895 | "timestamp": 3216.7600000053644
896 | },
897 | {
898 | "stackId": 7,
899 | "timestamp": 3229.265000000596
900 | },
901 | {
902 | "stackId": 7,
903 | "timestamp": 3241.800000011921
904 | },
905 | {
906 | "stackId": 7,
907 | "timestamp": 3254.300000011921
908 | },
909 | {
910 | "stackId": 7,
911 | "timestamp": 3266.844999998808
912 | },
913 | {
914 | "stackId": 7,
915 | "timestamp": 3279.344999998808
916 | },
917 | {
918 | "stackId": 7,
919 | "timestamp": 3291.8850000053644
920 | },
921 | {
922 | "stackId": 7,
923 | "timestamp": 3304.4300000071526
924 | },
925 | {
926 | "stackId": 7,
927 | "timestamp": 3316.844999998808
928 | },
929 | {
930 | "stackId": 7,
931 | "timestamp": 3329.3850000053644
932 | },
933 | {
934 | "stackId": 7,
935 | "timestamp": 3341.8850000053644
936 | },
937 | {
938 | "stackId": 7,
939 | "timestamp": 3352.5100000053644
940 | },
941 | {
942 | "stackId": 7,
943 | "timestamp": 3365.0100000053644
944 | },
945 | {
946 | "stackId": 7,
947 | "timestamp": 3376.050000011921
948 | },
949 | {
950 | "stackId": 7,
951 | "timestamp": 3388.550000011921
952 | },
953 | {
954 | "stackId": 7,
955 | "timestamp": 3401.050000011921
956 | },
957 | {
958 | "stackId": 7,
959 | "timestamp": 3413.594999998808
960 | },
961 | {
962 | "stackId": 7,
963 | "timestamp": 3426.1350000053644
964 | },
965 | {
966 | "stackId": 7,
967 | "timestamp": 3438.675000011921
968 | },
969 | {
970 | "stackId": 7,
971 | "timestamp": 3451.0100000053644
972 | },
973 | {
974 | "stackId": 7,
975 | "timestamp": 3463.5550000071526
976 | },
977 | {
978 | "stackId": 7,
979 | "timestamp": 3476.050000011921
980 | },
981 | {
982 | "stackId": 7,
983 | "timestamp": 3488.594999998808
984 | },
985 | {
986 | "stackId": 7,
987 | "timestamp": 3501.0100000053644
988 | },
989 | {
990 | "stackId": 7,
991 | "timestamp": 3513.5100000053644
992 | },
993 | {
994 | "stackId": 7,
995 | "timestamp": 3526.050000011921
996 | },
997 | {
998 | "stackId": 7,
999 | "timestamp": 3538.515000000596
1000 | },
1001 | {
1002 | "stackId": 7,
1003 | "timestamp": 3551.094999998808
1004 | },
1005 | {
1006 | "stackId": 7,
1007 | "timestamp": 3563.6350000053644
1008 | },
1009 | {
1010 | "stackId": 7,
1011 | "timestamp": 3566.844999998808
1012 | },
1013 | {
1014 | "stackId": 9,
1015 | "timestamp": 3570.300000011921
1016 | },
1017 | {
1018 | "stackId": 9,
1019 | "timestamp": 3576.1800000071526
1020 | },
1021 | {
1022 | "stackId": 9,
1023 | "timestamp": 3588.675000011921
1024 | },
1025 | {
1026 | "stackId": 9,
1027 | "timestamp": 3601.0100000053644
1028 | },
1029 | {
1030 | "stackId": 9,
1031 | "timestamp": 3612.5550000071526
1032 | },
1033 | {
1034 | "stackId": 9,
1035 | "timestamp": 3625.094999998808
1036 | },
1037 | {
1038 | "stackId": 9,
1039 | "timestamp": 3637.5900000035763
1040 | },
1041 | {
1042 | "stackId": 9,
1043 | "timestamp": 3650.1350000053644
1044 | },
1045 | {
1046 | "stackId": 9,
1047 | "timestamp": 3662.6350000053644
1048 | },
1049 | {
1050 | "stackId": 9,
1051 | "timestamp": 3675.1350000053644
1052 | },
1053 | {
1054 | "stackId": 9,
1055 | "timestamp": 3687.594999998808
1056 | },
1057 | {
1058 | "stackId": 9,
1059 | "timestamp": 3700.050000011921
1060 | },
1061 | {
1062 | "stackId": 9,
1063 | "timestamp": 3710.3850000053644
1064 | },
1065 | {
1066 | "stackId": 9,
1067 | "timestamp": 3722.8850000053644
1068 | },
1069 | {
1070 | "stackId": 9,
1071 | "timestamp": 3734.3850000053644
1072 | },
1073 | {
1074 | "stackId": 9,
1075 | "timestamp": 3746.9300000071526
1076 | },
1077 | {
1078 | "stackId": 9,
1079 | "timestamp": 3759.3850000053644
1080 | },
1081 | {
1082 | "stackId": 9,
1083 | "timestamp": 3771.8850000053644
1084 | },
1085 | {
1086 | "stackId": 9,
1087 | "timestamp": 3784.344999998808
1088 | },
1089 | {
1090 | "stackId": 9,
1091 | "timestamp": 3796.8850000053644
1092 | },
1093 | {
1094 | "stackId": 9,
1095 | "timestamp": 3809.344999998808
1096 | },
1097 | {
1098 | "stackId": 9,
1099 | "timestamp": 3821.8850000053644
1100 | },
1101 | {
1102 | "stackId": 9,
1103 | "timestamp": 3834.3850000053644
1104 | },
1105 | {
1106 | "stackId": 9,
1107 | "timestamp": 3846.9300000071526
1108 | },
1109 | {
1110 | "stackId": 9,
1111 | "timestamp": 3858.3850000053644
1112 | },
1113 | {
1114 | "stackId": 9,
1115 | "timestamp": 3870.925000011921
1116 | },
1117 | {
1118 | "stackId": 9,
1119 | "timestamp": 3883.469999998808
1120 | },
1121 | {
1122 | "stackId": 9,
1123 | "timestamp": 3895.9650000035763
1124 | },
1125 | {
1126 | "stackId": 9,
1127 | "timestamp": 3908.469999998808
1128 | },
1129 | {
1130 | "stackId": 9,
1131 | "timestamp": 3921.0100000053644
1132 | },
1133 | {
1134 | "stackId": 9,
1135 | "timestamp": 3933.5100000053644
1136 | },
1137 | {
1138 | "stackId": 9,
1139 | "timestamp": 3946.0100000053644
1140 | },
1141 | {
1142 | "stackId": 9,
1143 | "timestamp": 3958.5100000053644
1144 | },
1145 | {
1146 | "stackId": 9,
1147 | "timestamp": 3971.050000011921
1148 | },
1149 | {
1150 | "stackId": 9,
1151 | "timestamp": 3983.550000011921
1152 | },
1153 | {
1154 | "stackId": 9,
1155 | "timestamp": 3996.050000011921
1156 | },
1157 | {
1158 | "stackId": 9,
1159 | "timestamp": 4008.594999998808
1160 | },
1161 | {
1162 | "stackId": 9,
1163 | "timestamp": 4021.094999998808
1164 | },
1165 | {
1166 | "stackId": 9,
1167 | "timestamp": 4025.6350000053644
1168 | },
1169 | {
1170 | "stackId": 9,
1171 | "timestamp": 4033.594999998808
1172 | },
1173 | {
1174 | "stackId": 9,
1175 | "timestamp": 4046.094999998808
1176 | },
1177 | {
1178 | "stackId": 9,
1179 | "timestamp": 4058.594999998808
1180 | },
1181 | {
1182 | "stackId": 9,
1183 | "timestamp": 4071.1350000053644
1184 | },
1185 | {
1186 | "stackId": 9,
1187 | "timestamp": 4083.640000000596
1188 | },
1189 | {
1190 | "stackId": 9,
1191 | "timestamp": 4096.135000005364
1192 | },
1193 | {
1194 | "stackId": 9,
1195 | "timestamp": 4108.640000000596
1196 | },
1197 | {
1198 | "stackId": 9,
1199 | "timestamp": 4121.175000011921
1200 | },
1201 | {
1202 | "stackId": 9,
1203 | "timestamp": 4133.680000007153
1204 | },
1205 | {
1206 | "stackId": 9,
1207 | "timestamp": 4146.175000011921
1208 | },
1209 | {
1210 | "stackId": 9,
1211 | "timestamp": 4158.675000011921
1212 | },
1213 | {
1214 | "stackId": 9,
1215 | "timestamp": 4171.219999998808
1216 | },
1217 | {
1218 | "stackId": 9,
1219 | "timestamp": 4183.719999998808
1220 | },
1221 | {
1222 | "stackId": 9,
1223 | "timestamp": 4196.260000005364
1224 | },
1225 | {
1226 | "stackId": 9,
1227 | "timestamp": 4208.805000007153
1228 | },
1229 | {
1230 | "stackId": 9,
1231 | "timestamp": 4221.305000007153
1232 | },
1233 | {
1234 | "stackId": 9,
1235 | "timestamp": 4233.800000011921
1236 | },
1237 | {
1238 | "stackId": 9,
1239 | "timestamp": 4246.344999998808
1240 | },
1241 | {
1242 | "stackId": 9,
1243 | "timestamp": 4258.844999998808
1244 | },
1245 | {
1246 | "stackId": 9,
1247 | "timestamp": 4271.344999998808
1248 | },
1249 | {
1250 | "stackId": 9,
1251 | "timestamp": 4283.844999998808
1252 | },
1253 | {
1254 | "stackId": 9,
1255 | "timestamp": 4296.385000005364
1256 | },
1257 | {
1258 | "stackId": 9,
1259 | "timestamp": 4308.885000005364
1260 | },
1261 | {
1262 | "stackId": 9,
1263 | "timestamp": 4321.385000005364
1264 | },
1265 | {
1266 | "stackId": 9,
1267 | "timestamp": 4333.930000007153
1268 | },
1269 | {
1270 | "stackId": 9,
1271 | "timestamp": 4346.385000005364
1272 | },
1273 | {
1274 | "stackId": 9,
1275 | "timestamp": 4358.885000005364
1276 | },
1277 | {
1278 | "stackId": 9,
1279 | "timestamp": 4371.385000005364
1280 | },
1281 | {
1282 | "stackId": 9,
1283 | "timestamp": 4383.925000011921
1284 | },
1285 | {
1286 | "stackId": 9,
1287 | "timestamp": 4396.385000005364
1288 | },
1289 | {
1290 | "stackId": 9,
1291 | "timestamp": 4408.885000005364
1292 | },
1293 | {
1294 | "stackId": 9,
1295 | "timestamp": 4421.385000005364
1296 | },
1297 | {
1298 | "stackId": 9,
1299 | "timestamp": 4433.969999998808
1300 | },
1301 | {
1302 | "stackId": 9,
1303 | "timestamp": 4446.469999998808
1304 | },
1305 | {
1306 | "stackId": 9,
1307 | "timestamp": 4458.969999998808
1308 | },
1309 | {
1310 | "stackId": 9,
1311 | "timestamp": 4471.510000005364
1312 | },
1313 | {
1314 | "stackId": 9,
1315 | "timestamp": 4480.765000000596
1316 | },
1317 | {
1318 | "timestamp": 4484.055000007153
1319 | },
1320 | {
1321 | "timestamp": 4496.550000011921
1322 | },
1323 | {
1324 | "timestamp": 4509.140000000596
1325 | },
1326 | {
1327 | "timestamp": 4521.635000005364
1328 | },
1329 | {
1330 | "timestamp": 4534.135000005364
1331 | },
1332 | {
1333 | "timestamp": 4546.675000011921
1334 | },
1335 | {
1336 | "timestamp": 4559.219999998808
1337 | },
1338 | {
1339 | "timestamp": 4571.260000005364
1340 | },
1341 | {
1342 | "timestamp": 4583.760000005364
1343 | },
1344 | {
1345 | "timestamp": 4596.344999998808
1346 | },
1347 | {
1348 | "timestamp": 4608.844999998808
1349 | },
1350 | {
1351 | "timestamp": 4621.390000000596
1352 | },
1353 | {
1354 | "timestamp": 4633.885000005364
1355 | },
1356 | {
1357 | "timestamp": 4646.430000007153
1358 | },
1359 | {
1360 | "timestamp": 4658.925000011921
1361 | },
1362 | {
1363 | "timestamp": 4671.510000005364
1364 | },
1365 | {
1366 | "timestamp": 4684.010000005364
1367 | },
1368 | {
1369 | "timestamp": 4696.555000007153
1370 | },
1371 | {
1372 | "timestamp": 4709.135000005364
1373 | },
1374 | {
1375 | "timestamp": 4721.635000005364
1376 | },
1377 | {
1378 | "timestamp": 4733.219999998808
1379 | },
1380 | {
1381 | "timestamp": 4745.719999998808
1382 | },
1383 | {
1384 | "timestamp": 4756.844999998808
1385 | },
1386 | {
1387 | "timestamp": 4769.344999998808
1388 | },
1389 | {
1390 | "timestamp": 4781.890000000596
1391 | },
1392 | {
1393 | "timestamp": 4794.425000011921
1394 | },
1395 | {
1396 | "timestamp": 4805.265000000596
1397 | },
1398 | {
1399 | "timestamp": 4816.015000000596
1400 | },
1401 | {
1402 | "timestamp": 4828.550000011921
1403 | },
1404 | {
1405 | "timestamp": 4841.010000005364
1406 | },
1407 | {
1408 | "timestamp": 4851.675000011921
1409 | },
1410 | {
1411 | "timestamp": 4863.219999998808
1412 | },
1413 | {
1414 | "timestamp": 4875.800000011921
1415 | },
1416 | {
1417 | "timestamp": 4888.300000011921
1418 | },
1419 | {
1420 | "timestamp": 4899.510000005364
1421 | },
1422 | {
1423 | "timestamp": 4912.055000007153
1424 | },
1425 | {
1426 | "timestamp": 4923.094999998808
1427 | },
1428 | {
1429 | "timestamp": 4934.135000005364
1430 | },
1431 | {
1432 | "timestamp": 4945.180000007153
1433 | },
1434 | {
1435 | "timestamp": 4955.300000011921
1436 | },
1437 | {
1438 | "timestamp": 4966.305000007153
1439 | },
1440 | {
1441 | "timestamp": 4978.844999998808
1442 | },
1443 | {
1444 | "timestamp": 4989.050000011921
1445 | },
1446 | {
1447 | "timestamp": 5000.260000005364
1448 | },
1449 | {
1450 | "timestamp": 5010.385000005364
1451 | },
1452 | {
1453 | "timestamp": 5021.385000005364
1454 | },
1455 | {
1456 | "timestamp": 5033.760000005364
1457 | },
1458 | {
1459 | "timestamp": 5045.550000011921
1460 | },
1461 | {
1462 | "timestamp": 5055.635000005364
1463 | },
1464 | {
1465 | "timestamp": 5068.175000011921
1466 | },
1467 | {
1468 | "timestamp": 5080.719999998808
1469 | },
1470 | {
1471 | "timestamp": 5093.260000005364
1472 | },
1473 | {
1474 | "timestamp": 5105.510000005364
1475 | },
1476 | {
1477 | "timestamp": 5117.800000011921
1478 | },
1479 | {
1480 | "timestamp": 5130.300000011921
1481 | },
1482 | {
1483 | "timestamp": 5141.925000011921
1484 | },
1485 | {
1486 | "timestamp": 5154.385000005364
1487 | },
1488 | {
1489 | "timestamp": 5165.050000011921
1490 | },
1491 | {
1492 | "timestamp": 5177.550000011921
1493 | },
1494 | {
1495 | "timestamp": 5190.094999998808
1496 | },
1497 | {
1498 | "timestamp": 5200.760000005364
1499 | },
1500 | {
1501 | "timestamp": 5213.340000003576
1502 | },
1503 | {
1504 | "timestamp": 5225.885000005364
1505 | },
1506 | {
1507 | "timestamp": 5237.094999998808
1508 | },
1509 | {
1510 | "timestamp": 5249.635000005364
1511 | },
1512 | {
1513 | "timestamp": 5260.385000005364
1514 | },
1515 | {
1516 | "timestamp": 5272.890000000596
1517 | },
1518 | {
1519 | "timestamp": 5285.469999998808
1520 | },
1521 | {
1522 | "timestamp": 5295.555000007153
1523 | },
1524 | {
1525 | "timestamp": 5307.260000005364
1526 | },
1527 | {
1528 | "timestamp": 5319.390000000596
1529 | },
1530 | {
1531 | "timestamp": 5331.925000011921
1532 | },
1533 | {
1534 | "timestamp": 5343.425000011921
1535 | },
1536 | {
1537 | "timestamp": 5355.469999998808
1538 | },
1539 | {
1540 | "timestamp": 5367.010000005364
1541 | },
1542 | {
1543 | "timestamp": 5379.550000011921
1544 | },
1545 | {
1546 | "timestamp": 5392.090000003576
1547 | },
1548 | {
1549 | "timestamp": 5404.594999998808
1550 | },
1551 | {
1552 | "timestamp": 5420.885000005364
1553 | },
1554 | {
1555 | "timestamp": 5432.675000011921
1556 | },
1557 | {
1558 | "timestamp": 5445.219999998808
1559 | },
1560 | {
1561 | "timestamp": 5457.805000007153
1562 | },
1563 | {
1564 | "timestamp": 5470.385000005364
1565 | },
1566 | {
1567 | "timestamp": 5481.390000000596
1568 | },
1569 | {
1570 | "timestamp": 5492.925000011921
1571 | },
1572 | {
1573 | "timestamp": 5505.469999998808
1574 | },
1575 | {
1576 | "timestamp": 5518.010000005364
1577 | },
1578 | {
1579 | "timestamp": 5530.550000011921
1580 | },
1581 | {
1582 | "timestamp": 5543.135000005364
1583 | },
1584 | {
1585 | "timestamp": 5555.675000011921
1586 | },
1587 | {
1588 | "timestamp": 5565.965000003576
1589 | },
1590 | {
1591 | "timestamp": 5577.805000007153
1592 | },
1593 | {
1594 | "timestamp": 5590.180000007153
1595 | },
1596 | {
1597 | "timestamp": 5602.715000003576
1598 | },
1599 | {
1600 | "timestamp": 5613.550000011921
1601 | },
1602 | {
1603 | "timestamp": 5625.760000005364
1604 | },
1605 | {
1606 | "timestamp": 5638.300000011921
1607 | },
1608 | {
1609 | "timestamp": 5650.805000007153
1610 | },
1611 | {
1612 | "timestamp": 5663.344999998808
1613 | },
1614 | {
1615 | "timestamp": 5675.844999998808
1616 | },
1617 | {
1618 | "timestamp": 5686.215000003576
1619 | },
1620 | {
1621 | "timestamp": 5697.260000005364
1622 | },
1623 | {
1624 | "timestamp": 5708.340000003576
1625 | },
1626 | {
1627 | "timestamp": 5719.094999998808
1628 | },
1629 | {
1630 | "timestamp": 5730.135000005364
1631 | },
1632 | {
1633 | "timestamp": 5742.140000000596
1634 | },
1635 | {
1636 | "timestamp": 5754.760000005364
1637 | },
1638 | {
1639 | "timestamp": 5767.260000005364
1640 | },
1641 | {
1642 | "timestamp": 5779.800000011921
1643 | },
1644 | {
1645 | "timestamp": 5792.305000007153
1646 | },
1647 | {
1648 | "timestamp": 5804.844999998808
1649 | },
1650 | {
1651 | "timestamp": 5817.385000005364
1652 | },
1653 | {
1654 | "timestamp": 5828.385000005364
1655 | },
1656 | {
1657 | "timestamp": 5839.425000011921
1658 | },
1659 | {
1660 | "timestamp": 5850.930000007153
1661 | },
1662 | {
1663 | "timestamp": 5862.050000011921
1664 | },
1665 | {
1666 | "timestamp": 5873.140000000596
1667 | },
1668 | {
1669 | "timestamp": 5884.135000005364
1670 | },
1671 | {
1672 | "timestamp": 5895.215000003576
1673 | },
1674 | {
1675 | "timestamp": 5905.385000005364
1676 | },
1677 | {
1678 | "timestamp": 5916.469999998808
1679 | },
1680 | {
1681 | "timestamp": 5927.594999998808
1682 | },
1683 | {
1684 | "timestamp": 5938.010000005364
1685 | },
1686 | {
1687 | "timestamp": 5949.675000011921
1688 | },
1689 | {
1690 | "timestamp": 5961.510000005364
1691 | },
1692 | {
1693 | "timestamp": 5972.469999998808
1694 | },
1695 | {
1696 | "timestamp": 5987.510000005364
1697 | },
1698 | {
1699 | "timestamp": 6000.090000003576
1700 | },
1701 | {
1702 | "timestamp": 6012.719999998808
1703 | },
1704 | {
1705 | "timestamp": 6023.760000005364
1706 | },
1707 | {
1708 | "timestamp": 6034.719999998808
1709 | },
1710 | {
1711 | "timestamp": 6045.930000007153
1712 | },
1713 | {
1714 | "timestamp": 6058.430000007153
1715 | },
1716 | {
1717 | "timestamp": 6070.965000003576
1718 | },
1719 | {
1720 | "timestamp": 6083.550000011921
1721 | },
1722 | {
1723 | "timestamp": 6096.094999998808
1724 | },
1725 | {
1726 | "timestamp": 6108.425000011921
1727 | },
1728 | {
1729 | "timestamp": 6120.925000011921
1730 | },
1731 | {
1732 | "timestamp": 6133.510000005364
1733 | },
1734 | {
1735 | "timestamp": 6143.760000005364
1736 | },
1737 | {
1738 | "timestamp": 6155.344999998808
1739 | },
1740 | {
1741 | "timestamp": 6167.719999998808
1742 | },
1743 | {
1744 | "timestamp": 6180.265000000596
1745 | },
1746 | {
1747 | "timestamp": 6192.885000005364
1748 | },
1749 | {
1750 | "timestamp": 6205.515000000596
1751 | },
1752 | {
1753 | "timestamp": 6217.760000005364
1754 | },
1755 | {
1756 | "timestamp": 6230.425000011921
1757 | },
1758 | {
1759 | "timestamp": 6242.300000011921
1760 | },
1761 | {
1762 | "timestamp": 6254.840000003576
1763 | },
1764 | {
1765 | "timestamp": 6266.635000005364
1766 | },
1767 | {
1768 | "timestamp": 6277.719999998808
1769 | },
1770 | {
1771 | "timestamp": 6288.715000003576
1772 | },
1773 | {
1774 | "timestamp": 6301.094999998808
1775 | },
1776 | {
1777 | "timestamp": 6313.635000005364
1778 | },
1779 | {
1780 | "timestamp": 6326.175000011921
1781 | },
1782 | {
1783 | "timestamp": 6337.300000011921
1784 | },
1785 | {
1786 | "timestamp": 6347.510000005364
1787 | },
1788 | {
1789 | "timestamp": 6357.680000007153
1790 | },
1791 | {
1792 | "timestamp": 6370.219999998808
1793 | },
1794 | {
1795 | "timestamp": 6382.760000005364
1796 | },
1797 | {
1798 | "timestamp": 6395.305000007153
1799 | },
1800 | {
1801 | "timestamp": 6405.590000003576
1802 | },
1803 | {
1804 | "timestamp": 6418.260000005364
1805 | },
1806 | {
1807 | "timestamp": 6429.219999998808
1808 | },
1809 | {
1810 | "timestamp": 6441.840000003576
1811 | },
1812 | {
1813 | "timestamp": 6454.385000005364
1814 | },
1815 | {
1816 | "timestamp": 6464.675000011921
1817 | },
1818 | {
1819 | "timestamp": 6477.135000005364
1820 | },
1821 | {
1822 | "timestamp": 6487.844999998808
1823 | },
1824 | {
1825 | "timestamp": 6499.675000011921
1826 | },
1827 | {
1828 | "timestamp": 6510.260000005364
1829 | },
1830 | {
1831 | "timestamp": 6522.844999998808
1832 | },
1833 | {
1834 | "timestamp": 6533.550000011921
1835 | },
1836 | {
1837 | "timestamp": 6544.469999998808
1838 | },
1839 | {
1840 | "timestamp": 6557.010000005364
1841 | },
1842 | {
1843 | "timestamp": 6567.090000003576
1844 | },
1845 | {
1846 | "timestamp": 6579.680000007153
1847 | },
1848 | {
1849 | "timestamp": 6591.594999998808
1850 | },
1851 | {
1852 | "timestamp": 6604.094999998808
1853 | },
1854 | {
1855 | "timestamp": 6616.594999998808
1856 | },
1857 | {
1858 | "timestamp": 6627.635000005364
1859 | },
1860 | {
1861 | "timestamp": 6638.675000011921
1862 | },
1863 | {
1864 | "timestamp": 6649.719999998808
1865 | },
1866 | {
1867 | "timestamp": 6660.760000005364
1868 | },
1869 | {
1870 | "timestamp": 6671.800000011921
1871 | },
1872 | {
1873 | "timestamp": 6682.844999998808
1874 | },
1875 | {
1876 | "timestamp": 6693.885000005364
1877 | },
1878 | {
1879 | "timestamp": 6704.930000007153
1880 | },
1881 | {
1882 | "timestamp": 6715.300000011921
1883 | },
1884 | {
1885 | "timestamp": 6725.344999998808
1886 | },
1887 | {
1888 | "timestamp": 6735.550000011921
1889 | },
1890 | {
1891 | "timestamp": 6747.844999998808
1892 | },
1893 | {
1894 | "timestamp": 6760.390000000596
1895 | },
1896 | {
1897 | "timestamp": 6770.800000011921
1898 | },
1899 | {
1900 | "timestamp": 6783.260000005364
1901 | },
1902 | {
1903 | "timestamp": 6795.175000011921
1904 | },
1905 | {
1906 | "timestamp": 6805.215000003576
1907 | },
1908 | {
1909 | "timestamp": 6815.300000011921
1910 | },
1911 | {
1912 | "timestamp": 6827.344999998808
1913 | },
1914 | {
1915 | "timestamp": 6837.635000005364
1916 | },
1917 | {
1918 | "timestamp": 6850.305000007153
1919 | },
1920 | {
1921 | "timestamp": 6861.969999998808
1922 | },
1923 | {
1924 | "timestamp": 6875.180000007153
1925 | },
1926 | {
1927 | "timestamp": 6886.385000005364
1928 | },
1929 | {
1930 | "timestamp": 6897.425000011921
1931 | },
1932 | {
1933 | "timestamp": 6909.965000003576
1934 | },
1935 | {
1936 | "timestamp": 6922.594999998808
1937 | },
1938 | {
1939 | "timestamp": 6935.219999998808
1940 | },
1941 | {
1942 | "timestamp": 6947.260000005364
1943 | },
1944 | {
1945 | "timestamp": 6958.969999998808
1946 | },
1947 | {
1948 | "timestamp": 6971.510000005364
1949 | },
1950 | {
1951 | "timestamp": 6982.430000007153
1952 | },
1953 | {
1954 | "timestamp": 6992.760000005364
1955 | },
1956 | {
1957 | "timestamp": 7004.594999998808
1958 | },
1959 | {
1960 | "timestamp": 7017.094999998808
1961 | },
1962 | {
1963 | "timestamp": 7029.635000005364
1964 | },
1965 | {
1966 | "timestamp": 7042.175000011921
1967 | },
1968 | {
1969 | "timestamp": 7054.719999998808
1970 | },
1971 | {
1972 | "timestamp": 7067.260000005364
1973 | },
1974 | {
1975 | "timestamp": 7079.800000011921
1976 | },
1977 | {
1978 | "timestamp": 7092.390000000596
1979 | },
1980 | {
1981 | "timestamp": 7105.010000005364
1982 | },
1983 | {
1984 | "timestamp": 7116.760000005364
1985 | },
1986 | {
1987 | "timestamp": 7129.305000007153
1988 | },
1989 | {
1990 | "timestamp": 7141.844999998808
1991 | },
1992 | {
1993 | "timestamp": 7154.385000005364
1994 | },
1995 | {
1996 | "timestamp": 7166.925000011921
1997 | },
1998 | {
1999 | "timestamp": 7177.390000000596
2000 | },
2001 | {
2002 | "timestamp": 7189.094999998808
2003 | },
2004 | {
2005 | "timestamp": 7201.010000005364
2006 | },
2007 | {
2008 | "timestamp": 7213.510000005364
2009 | },
2010 | {
2011 | "timestamp": 7225.885000005364
2012 | },
2013 | {
2014 | "timestamp": 7237.594999998808
2015 | },
2016 | {
2017 | "timestamp": 7249.844999998808
2018 | },
2019 | {
2020 | "timestamp": 7260.925000011921
2021 | },
2022 | {
2023 | "timestamp": 7273.469999998808
2024 | },
2025 | {
2026 | "timestamp": 7286.010000005364
2027 | },
2028 | {
2029 | "timestamp": 7300.300000011921
2030 | },
2031 | {
2032 | "timestamp": 7312.805000007153
2033 | },
2034 | {
2035 | "timestamp": 7325.635000005364
2036 | },
2037 | {
2038 | "timestamp": 7335.890000000596
2039 | },
2040 | {
2041 | "timestamp": 7349.555000007153
2042 | },
2043 | {
2044 | "timestamp": 7363.390000000596
2045 | },
2046 | {
2047 | "timestamp": 7376.010000005364
2048 | },
2049 | {
2050 | "timestamp": 7388.094999998808
2051 | },
2052 | {
2053 | "timestamp": 7400.305000007153
2054 | },
2055 | {
2056 | "timestamp": 7412.469999998808
2057 | },
2058 | {
2059 | "timestamp": 7425.260000005364
2060 | },
2061 | {
2062 | "timestamp": 7437.800000011921
2063 | },
2064 | {
2065 | "timestamp": 7450.050000011921
2066 | },
2067 | {
2068 | "timestamp": 7462.550000011921
2069 | },
2070 | {
2071 | "timestamp": 7475.094999998808
2072 | },
2073 | {
2074 | "timestamp": 7487.555000007153
2075 | },
2076 | {
2077 | "timestamp": 7500.135000005364
2078 | },
2079 | {
2080 | "timestamp": 7512.635000005364
2081 | },
2082 | {
2083 | "timestamp": 7525.219999998808
2084 | },
2085 | {
2086 | "timestamp": 7537.800000011921
2087 | },
2088 | {
2089 | "timestamp": 7549.635000005364
2090 | },
2091 | {
2092 | "timestamp": 7562.175000011921
2093 | },
2094 | {
2095 | "timestamp": 7574.675000011921
2096 | },
2097 | {
2098 | "timestamp": 7587.219999998808
2099 | },
2100 | {
2101 | "timestamp": 7599.719999998808
2102 | },
2103 | {
2104 | "timestamp": 7612.260000005364
2105 | },
2106 | {
2107 | "timestamp": 7627.260000005364
2108 | },
2109 | {
2110 | "timestamp": 7639.719999998808
2111 | },
2112 | {
2113 | "timestamp": 7652.300000011921
2114 | },
2115 | {
2116 | "timestamp": 7663.219999998808
2117 | },
2118 | {
2119 | "timestamp": 7675.344999998808
2120 | },
2121 | {
2122 | "timestamp": 7685.555000007153
2123 | },
2124 | {
2125 | "timestamp": 7696.469999998808
2126 | },
2127 | {
2128 | "timestamp": 7708.760000005364
2129 | }
2130 | ],
2131 | "stacks": [
2132 | {
2133 | "frameId": 1
2134 | },
2135 | {
2136 | "frameId": 0,
2137 | "parentId": 0
2138 | },
2139 | {
2140 | "frameId": 3
2141 | },
2142 | {
2143 | "frameId": 2,
2144 | "parentId": 2
2145 | },
2146 | {
2147 | "frameId": 4,
2148 | "parentId": 3
2149 | },
2150 | {
2151 | "frameId": 5,
2152 | "parentId": 3
2153 | },
2154 | {
2155 | "frameId": 6,
2156 | "parentId": 2
2157 | },
2158 | {
2159 | "frameId": 7,
2160 | "parentId": 2
2161 | },
2162 | {
2163 | "frameId": 9
2164 | },
2165 | {
2166 | "frameId": 8,
2167 | "parentId": 8
2168 | }
2169 | ]
2170 | }
--------------------------------------------------------------------------------