From 520fab5c932c563dcf2fc21d453ca25227bcffa3 Mon Sep 17 00:00:00 2001 From: didier amyot Date: Mon, 5 Feb 2024 17:20:35 -0500 Subject: [PATCH 01/11] started new ui --- frontend/index-old.html | 90 ++++++++++++++++++++++++++ frontend/index.html | 16 +---- frontend/main-old.js | 118 ++++++++++++++++++++++++++++++++++ frontend/main.js | 139 ++++++++++++++++++++++++++++++++++++++-- frontend/style.css | 4 ++ 5 files changed, 348 insertions(+), 19 deletions(-) create mode 100644 frontend/index-old.html create mode 100644 frontend/main-old.js diff --git a/frontend/index-old.html b/frontend/index-old.html new file mode 100644 index 0000000..23ac777 --- /dev/null +++ b/frontend/index-old.html @@ -0,0 +1,90 @@ + + + + + Dodgeball Tracker + + + + + + + + + +

Dodgeball Tracker

+ +
+ +

+
+ + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html index 15b27cc..1cefe89 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,29 +2,17 @@ - Animation + Dodgeball Tracker + -

Hello, world!

-

-
- - -
- - - - - \ No newline at end of file diff --git a/frontend/main-old.js b/frontend/main-old.js new file mode 100644 index 0000000..f031426 --- /dev/null +++ b/frontend/main-old.js @@ -0,0 +1,118 @@ +import anime from "https://esm.sh/animejs@3.2.2"; +import m from "https://esm.sh/mithril@2.2.2" +import colormap from "https://esm.sh/colormap@2.3.2" + + +const second = 1000; + +const canvasWidth = Number.parseFloat(document.querySelector("svg").getAttribute("width")); +const canvasHeight = Number.parseFloat(document.querySelector("svg").getAttribute("height")); + +function gaussianRandom(mean=0, stdev=1) { + const u = 1 - Math.random(); // Converting [0,1) to (0,1] + const v = Math.random(); + const z = Math.sqrt( -2.0 * Math.log( u ) ) * Math.cos( 2.0 * Math.PI * v ); + // Transform to the desired mean and standard deviation: + return z * stdev + mean; +} + +function* brownian(n){ + let x = 0; + for(let i = 0; i < n; i ++){ + x += gaussianRandom(0, 10); + console.log(x); + yield x; + } +} + +function* pseudoBrownian(n, limit){ + let x = 0; + for(let i = 0; i < n; i ++){ + let delta = gaussianRandom(0, 10); + if(Math.abs(x + delta) > limit){ + delta = -1 * delta + } + x += delta; + yield x; + } +} + +function* keyFrames(duration, framePerSeconds){ + const deltaX = canvasWidth / (duration * framePerSeconds); + const limit = 0.75 * (canvasHeight / 2); + for(const deltaY of pseudoBrownian(duration * framePerSeconds, limit)){ + yield {translateX: `+=${deltaX}`, translateY: deltaY}; + } +} + +const duration = 60; +const timeline = anime.timeline({ + duration: duration * second, + autoplay: false, + easing: 'linear'}); + +for(let i = 1; i <= 12; i++){ + timeline.add({ + targets: `#rect-${i}`, + keyframes: Array.from(keyFrames(duration, 30)), + }, 0) +} + + +document.querySelector('#play').onclick = timeline.play; +document.querySelector('#pause').onclick = timeline.pause; +document.querySelector('#seek').onclick = function(){ + const seekVal = Number.parseFloat(second * document.querySelector('#seek-value').value); + timeline.pause(); + timeline.seek(seekVal); +} + + +function generatePoints(points, frames){ + const lst = []; + const colors = colormap({ + colormap: 'viridis', + nshades: new Set(points.map(p => p.objectId)).size, + format: 'hex', + alpha: 1 + }); + for(const point of points){ + if(frames.indexOf(point.frameIndex) !== -1){ + lst.push(m("text", {x: point.y, y: point.x, fill: colors[point.objectId]}, point.objectId)); + } + } + return m("g", lst); +} + +function getTimeStamp(points, frameId){ + for(const point of points){ + if(point.frameIndex === frameId){ + return `${point.frameTimestamp / 1000} seconds`; + } + } +} + +const url = "/dodgeball-tracker/outputs/output-lmbn_n_cuhk03_d.json"; +const resp = await fetch(url); +const points = await resp.json(); + +function range(min, max){ + const ret = []; + while(min < max){ + ret.push(min); + min ++; + } + return ret +} + +function getCourtLines(){ + return [ + m("line", {x1: 450, x2: 450, y1: 0, y2: 450, class: "court-border"}), + m("line", {x1: 300, x2: 300, y1: 0, y2: 450, class: "return-line"}), + m("line", {x1: 600, x2: 600, y1: 0, y2: 450, class: "return-line"}) + ] +} + + +m.render(document.getElementById("first"), generatePoints(points.points, range(-10, 400))); +m.render(document.getElementById("first-ts"), m("span", getTimeStamp(points.points, 80))); \ No newline at end of file diff --git a/frontend/main.js b/frontend/main.js index 9638bf2..0eeec6e 100644 --- a/frontend/main.js +++ b/frontend/main.js @@ -2,6 +2,72 @@ import m from "https://esm.sh/mithril@2.2.2" import colormap from "https://esm.sh/colormap@2.3.2" import {range} from "./util.js"; + +// const second = 1000; + +// const canvasWidth = Number.parseFloat(document.querySelector("svg").getAttribute("width")); +// const canvasHeight = Number.parseFloat(document.querySelector("svg").getAttribute("height")); + +function gaussianRandom(mean=0, stdev=1) { + const u = 1 - Math.random(); // Converting [0,1) to (0,1] + const v = Math.random(); + const z = Math.sqrt( -2.0 * Math.log( u ) ) * Math.cos( 2.0 * Math.PI * v ); + // Transform to the desired mean and standard deviation: + return z * stdev + mean; +} + +function* brownian(n){ + let x = 0; + for(let i = 0; i < n; i ++){ + x += gaussianRandom(0, 10); + console.log(x); + yield x; + } +} + +function* pseudoBrownian(n, limit){ + let x = 0; + for(let i = 0; i < n; i ++){ + let delta = gaussianRandom(0, 10); + if(Math.abs(x + delta) > limit){ + delta = -1 * delta + } + x += delta; + yield x; + } +} + +function* keyFrames(duration, framePerSeconds){ + const deltaX = canvasWidth / (duration * framePerSeconds); + const limit = 0.75 * (canvasHeight / 2); + for(const deltaY of pseudoBrownian(duration * framePerSeconds, limit)){ + yield {translateX: `+=${deltaX}`, translateY: deltaY}; + } +} + +// const duration = 60; +// const timeline = anime.timeline({ +// duration: duration * second, +// autoplay: false, +// easing: 'linear'}); +// +// for(let i = 1; i <= 12; i++){ +// timeline.add({ +// targets: `#rect-${i}`, +// keyframes: Array.from(keyFrames(duration, 30)), +// }, 0) +// } + + +// document.querySelector('#play').onclick = timeline.play; +// document.querySelector('#pause').onclick = timeline.pause; +// document.querySelector('#seek').onclick = function(){ +// const seekVal = Number.parseFloat(second * document.querySelector('#seek-value').value); +// timeline.pause(); +// timeline.seek(seekVal); +// } + + function generatePoints(points, frames){ const lst = []; const colors = colormap({ @@ -26,11 +92,74 @@ function getTimeStamp(points, frameId){ } } -const url = "/dodgeball-tracker/outputs/output-lmbn_n_cuhk03_d.json"; -const resp = await fetch(url); -const points = await resp.json(); +// const url = "/dodgeball-tracker/outputs/output-lmbn_n_cuhk03_d.json"; +// const resp = await fetch(url); +// const points = await resp.json(); -m.render(document.getElementById("first"), generatePoints(points.points, range(-10, 400))); -m.render(document.getElementById("first-ts"), m("span", getTimeStamp(points.points, 80))); \ No newline at end of file +function getCourtLines(){ + return [ + m("line", {x1: 450, x2: 450, y1: 0, y2: 450, class: "court-border"}), + m("line", {x1: 300, x2: 300, y1: 0, y2: 450, class: "return-line"}), + m("line", {x1: 600, x2: 600, y1: 0, y2: 450, class: "return-line"}) + ] +} +class WorkingTabs{ + + tabs(){ + return m("div.tabs", + m("ul", + m("li.is-active", m("a", "Info")), + m("li", m("a", "Video Player")))); + } + + info(){ + const options = [ + m("option", "one"), + m("option", "two"), + ] + return m("div.field", + m("label.label", "Dataset"), + m("div.control", + m("div.select", + m("select", options)))); + } + view(){ + return m("div", + this.tabs(), + this.info()) + } +} + +const Court = { + view: function(){ + const margin = 50 + return m("svg.court-side", { width: 900 + 2 * margin, height: 450 + 2 * margin}, [ + m("g.court-border#court", {transform: `translate(${margin} ${margin})`}, [ + m("rect", {width: 900, height: 450, style: 'background-color: pink;'}), + getCourtLines() + ]) + ]) + } + +} + +// m.render(document.getElementById("new"), drawCourt()); + +// m.render(document.getElementById("first"), generatePoints(points.points, range(-10, 400))); +// m.render(document.getElementById("first-ts"), m("span", getTimeStamp(points.points, 80))); + +const Main = { + view: function(){ + return m("div", [ + m("h1.title.is-1", "DodgeBall Tracker"), + m("div.columns.is-centered", + m("m.column.is-three-quarters", + m(Court), + m(WorkingTabs))) + ]) + } +} + +m.mount(document.body, Main); \ No newline at end of file diff --git a/frontend/style.css b/frontend/style.css index d7a1533..68bcd18 100644 --- a/frontend/style.css +++ b/frontend/style.css @@ -5,6 +5,10 @@ fill: gray; } +.court-side { + background-color: pink; +} + .return-line { stroke: blue; stroke-width: 2px; From e9da24b54d8ca31317010763fb8d43b85435c12d Mon Sep 17 00:00:00 2001 From: didier amyot Date: Tue, 13 Feb 2024 08:46:53 -0500 Subject: [PATCH 02/11] improved UI --- frontend/main.js | 42 +++------ frontend/server.tsx | 0 visualizer/deno.json | 14 +++ visualizer/public/images/js_logo.svg | 4 + visualizer/public/scripts/auth.js | 33 +++++++ visualizer/server.ts | 9 ++ visualizer/src/api/mod.tsx | 65 ++++++++++++++ visualizer/src/api/tab.tsx | 73 ++++++++++++++++ visualizer/src/login.ts | 25 ++++++ visualizer/src/server.ts | 45 ++++++++++ visualizer/src/services/matches.ts | 41 +++++++++ visualizer/src/views/base.tsx | 48 +++++++++++ visualizer/src/views/mod.tsx | 124 +++++++++++++++++++++++++++ 13 files changed, 491 insertions(+), 32 deletions(-) create mode 100644 frontend/server.tsx create mode 100644 visualizer/deno.json create mode 100644 visualizer/public/images/js_logo.svg create mode 100644 visualizer/public/scripts/auth.js create mode 100644 visualizer/server.ts create mode 100644 visualizer/src/api/mod.tsx create mode 100644 visualizer/src/api/tab.tsx create mode 100644 visualizer/src/login.ts create mode 100644 visualizer/src/server.ts create mode 100644 visualizer/src/services/matches.ts create mode 100644 visualizer/src/views/base.tsx create mode 100644 visualizer/src/views/mod.tsx diff --git a/frontend/main.js b/frontend/main.js index 0eeec6e..9ea08b1 100644 --- a/frontend/main.js +++ b/frontend/main.js @@ -2,12 +2,6 @@ import m from "https://esm.sh/mithril@2.2.2" import colormap from "https://esm.sh/colormap@2.3.2" import {range} from "./util.js"; - -// const second = 1000; - -// const canvasWidth = Number.parseFloat(document.querySelector("svg").getAttribute("width")); -// const canvasHeight = Number.parseFloat(document.querySelector("svg").getAttribute("height")); - function gaussianRandom(mean=0, stdev=1) { const u = 1 - Math.random(); // Converting [0,1) to (0,1] const v = Math.random(); @@ -45,28 +39,6 @@ function* keyFrames(duration, framePerSeconds){ } } -// const duration = 60; -// const timeline = anime.timeline({ -// duration: duration * second, -// autoplay: false, -// easing: 'linear'}); -// -// for(let i = 1; i <= 12; i++){ -// timeline.add({ -// targets: `#rect-${i}`, -// keyframes: Array.from(keyFrames(duration, 30)), -// }, 0) -// } - - -// document.querySelector('#play').onclick = timeline.play; -// document.querySelector('#pause').onclick = timeline.pause; -// document.querySelector('#seek').onclick = function(){ -// const seekVal = Number.parseFloat(second * document.querySelector('#seek-value').value); -// timeline.pause(); -// timeline.seek(seekVal); -// } - function generatePoints(points, frames){ const lst = []; @@ -105,7 +77,15 @@ function getCourtLines(){ m("line", {x1: 600, x2: 600, y1: 0, y2: 450, class: "return-line"}) ] } + + class WorkingTabs{ + #datasets = [] + + async oninit(){ + const url = "/dodgeball-tracker/outputs/index.json" + this.#datasets = (await m.request({method: "GET", url: url}))?.index ?? []; + } tabs(){ return m("div.tabs", @@ -115,16 +95,14 @@ class WorkingTabs{ } info(){ - const options = [ - m("option", "one"), - m("option", "two"), - ] + const options = this.#datasets.map(ds => m('option', {value: ds.id}, ds.label)); return m("div.field", m("label.label", "Dataset"), m("div.control", m("div.select", m("select", options)))); } + view(){ return m("div", this.tabs(), diff --git a/frontend/server.tsx b/frontend/server.tsx new file mode 100644 index 0000000..e69de29 diff --git a/visualizer/deno.json b/visualizer/deno.json new file mode 100644 index 0000000..7b3fa7f --- /dev/null +++ b/visualizer/deno.json @@ -0,0 +1,14 @@ +{ + "imports": { + "preact": "https://esm.sh/preact@10.19.2", + "preact/": "https://esm.sh/preact@10.19.2/", + "@preact/signals": "https://esm.sh/*@preact/signals@1.2.1", + "@preact/signals-core": "https://esm.sh/*@preact/signals-core@1.5.0", + "$std/": "https://deno.land/std@0.208.0/" + }, + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "preact" + } + +} diff --git a/visualizer/public/images/js_logo.svg b/visualizer/public/images/js_logo.svg new file mode 100644 index 0000000..9650ca7 --- /dev/null +++ b/visualizer/public/images/js_logo.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/visualizer/public/scripts/auth.js b/visualizer/public/scripts/auth.js new file mode 100644 index 0000000..10500d5 --- /dev/null +++ b/visualizer/public/scripts/auth.js @@ -0,0 +1,33 @@ +const sessionLocalStorageKey = 'dgt-session'; + +let cachedPathVariables = null; + +function getPathVariables(){ + if (cachedPathVariables !== null) { + return cachedPathVariables; + } + const raw = document.getElementById("url-placeholders")?.textContent || "{}" + cachedPathVariables = Object.entries(JSON.parse(raw)?.pathVariables || {}) + return cachedPathVariables + +} + +window.addEventListener('login', function (evt) { + localStorage.setItem(sessionLocalStorageKey, evt.detail.value); + document.location.href = "/"; +}); + +window.addEventListener('logout', function (evt) { + window.localStorage.removeItem(sessionLocalStorageKey); + document.location.href = "/login.html"; +}); + +window.addEventListener('htmx:configRequest', function(evt) { + evt.detail.headers['dgt-session'] = localStorage.getItem(sessionLocalStorageKey); + + function reducer(path, [key, value]){ + return path.replace(key, value) + } + + evt.detail.path = getPathVariables().reduce(reducer, evt.detail.path) +}); diff --git a/visualizer/server.ts b/visualizer/server.ts new file mode 100644 index 0000000..9e72fef --- /dev/null +++ b/visualizer/server.ts @@ -0,0 +1,9 @@ +import {app} from "./src/server.ts"; +import Logger from "https://deno.land/x/logger@v1.1.5/logger.ts"; + + + +const logger = new Logger() +const port = 8000 +logger.info(`Starting web server on port ${port}`) +await app.listen({ port }); \ No newline at end of file diff --git a/visualizer/src/api/mod.tsx b/visualizer/src/api/mod.tsx new file mode 100644 index 0000000..aa6c01b --- /dev/null +++ b/visualizer/src/api/mod.tsx @@ -0,0 +1,65 @@ +import {Router} from "https://deno.land/x/oak/mod.ts"; +import {FileMatchService} from "../services/matches.ts"; +import {ViewTabService} from "./tab.tsx"; + + +export const apiRouter = new Router( {prefix: '/api/v1'}); + +async function getMatchService(): Promise { + const f = "/home/didier/alldressed-programming/dodgeball-tracker/outputs/index.json" + return new FileMatchService(f) +} + +apiRouter.get('/ping', (ctx) => { + ctx.response.body = pong +}) + +apiRouter.get("/match/:id/title", async function(ctx){ + const service = await getMatchService() + const match = await service.getMatchInfoById(ctx.params.id) + ctx.response.body = (Match: {match.label}) +}); + +apiRouter.get("/match/:id/pane/info", async function(ctx){ + const service = await getMatchService() + const match = await service.getMatchInfoById(ctx.params.id) + const viewService = new ViewTabService(); + ctx.response.body = viewService.infoTab(match) +}); + +apiRouter.get("/match/:id/pane/player", async function(ctx){ + const service = await getMatchService() + const match = await service.getMatchInfoById(ctx.params.id) + const viewService = new ViewTabService(); + ctx.response.body = viewService.playerTab(match) +}); + +apiRouter.get("/match/:id/pane/player/data", async function(ctx){ + ctx.response.body = +}); + +apiRouter.get('/list-matches', async (ctx) => { + const matchService = await getMatchService() + const rows = []; + for await (const match of matchService.getAllMatchInfo()){ + rows.push( + + { match.label } + { match.originalVideoUrl } + + ) + } + ctx.response.body = (
+ + + + + + + + + {rows} + +
LabelVideo Link
+
) +}) diff --git a/visualizer/src/api/tab.tsx b/visualizer/src/api/tab.tsx new file mode 100644 index 0000000..c222215 --- /dev/null +++ b/visualizer/src/api/tab.tsx @@ -0,0 +1,73 @@ +import {MatchInfo} from "../services/matches.ts"; + +export class ViewTabService { + + infoTab(matchInfo: MatchInfo){ + return ( + + + + + + + + + + + + + + + + + + + +
Label{matchInfo.label}
Id{matchInfo.id}
Date{matchInfo.matchDate}
Video URL + {matchInfo.originalVideoUrl} +
) + + } + + playerTab(matchInfo: MatchInfo){ + return (
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
) + + } + +} \ No newline at end of file diff --git a/visualizer/src/login.ts b/visualizer/src/login.ts new file mode 100644 index 0000000..a2da694 --- /dev/null +++ b/visualizer/src/login.ts @@ -0,0 +1,25 @@ +import { Router } from "https://deno.land/x/oak/mod.ts"; + + +export const loginRouter = new Router(); + +export function isLoggedIn(ctx){ + return ctx.request.headers.get('dgt-session') +} + + +loginRouter.post("/api/v1/login", async (ctx)=> { + const username = (await ctx.request.body().value).get("username"); + ctx.response.headers.append("HX-Trigger", JSON.stringify({'login': username})); + ctx.response.body = username; +}); + +loginRouter.post("/api/v1/logout", (ctx)=> { + ctx.response.headers.append("HX-Trigger", "logout"); + ctx.response.body = ""; +}); + + + + + diff --git a/visualizer/src/server.ts b/visualizer/src/server.ts new file mode 100644 index 0000000..fc2155c --- /dev/null +++ b/visualizer/src/server.ts @@ -0,0 +1,45 @@ +import { Application } from "https://deno.land/x/oak/mod.ts"; +import staticFiles from "https://deno.land/x/static_files@1.1.6/mod.ts"; +import {loginRouter, isLoggedIn} from "./login.ts"; +import {apiRouter} from "./api/mod.tsx"; +import {viewRouter} from "./views/mod.tsx"; +import {renderToString} from "https://esm.sh/preact-render-to-string@5.1.19?deps=preact@10.5.15"; +import Logger from "https://deno.land/x/logger@v1.1.5/logger.ts"; + +const logger = new Logger(); +export const app = new Application(); + +function isReactComponent(x){ + return !!x && Object.hasOwn(x, "type") && Object.hasOwn(x, "props") +} + +async function reactRendererMiddleware(ctx, next){ + await next(); + if(isReactComponent(ctx.response.body)){ + logger.info("Converting react component to string.") + ctx.response.body = renderToString(ctx.response.body) + + } +} + +async function loggingMiddleware(ctx, next){ + if(!isLoggedIn(ctx)){ + logger.info("user not logged in.") + ctx.response.headers.append("HX-Redirect", "/login.html"); + return + } + logger.info('user logged in') + await next(); +} + + +app.use(loginRouter.routes()); +app.use(viewRouter.routes()); +app.use(staticFiles("public", {brotli: true, fetch: true})); +app.use(loggingMiddleware) +app.use(reactRendererMiddleware) +app.use(apiRouter.routes()); + + + + diff --git a/visualizer/src/services/matches.ts b/visualizer/src/services/matches.ts new file mode 100644 index 0000000..3bb1ed2 --- /dev/null +++ b/visualizer/src/services/matches.ts @@ -0,0 +1,41 @@ + +export type MatchInfo = { + id: string, + originalVideoUrl: string, + matchDate: string, + label: string +} + +export interface MatchService { + + getAllMatchInfo(): AsyncIterator; + getMatchInfoById(id: string): Promise; + +} + +export class FileMatchService implements MatchService{ + + readonly #indexFile: string + + constructor(indexFile: string) { + this.#indexFile = indexFile; + } + + async *getAllMatchInfo(): AsyncIterator{ + const data = await Deno.readTextFile(this.#indexFile) + const ret = JSON.parse(data) as {matches: MatchInfo[]} + yield* ret.matches + } + + async getMatchInfoById(id: string): Promise{ + for await(const mi of this.getAllMatchInfo()){ + if(mi.id === id){ + return mi + } + } + } + + + + +} \ No newline at end of file diff --git a/visualizer/src/views/base.tsx b/visualizer/src/views/base.tsx new file mode 100644 index 0000000..e9269bc --- /dev/null +++ b/visualizer/src/views/base.tsx @@ -0,0 +1,48 @@ +export function Head(){ + return ( + + + + JS Reading App + + + + + + ) +} + + +export function NavBar(){ + return () +} + +export function Body({pathVariables, children}){ + const urlPlaceHolders = { + pathVariables: Object.fromEntries(Object.entries(pathVariables ?? {}).map(([k, v]) => [`:${k}`, v])) + } + return ( + { children } + + + ) +} \ No newline at end of file diff --git a/visualizer/src/views/mod.tsx b/visualizer/src/views/mod.tsx new file mode 100644 index 0000000..930df5f --- /dev/null +++ b/visualizer/src/views/mod.tsx @@ -0,0 +1,124 @@ +import { Router } from "https://deno.land/x/oak/mod.ts"; +import {renderToString} from "https://esm.sh/preact-render-to-string@5.1.19?deps=preact@10.5.15"; +import * as base from './base.tsx'; +import {Head} from "./base.tsx"; +export const viewRouter = new Router(); + +function renderPageToString(page){ + return `${renderToString(page)}` +} + + +function Court(){ + const margin = 50; + const returnLine = {stroke: 'blue', strokeWidth: '2px'} + const courtBorder = {stroke: 'red', strokeWidth: '4px', fill: 'gray' } + const lines = [ + , + , + , + ] + return ( + + + { lines } + + + ) +} + +viewRouter.get("/match/:id/:tab", (ctx) => { + const page = ( + + + +
+ +
+
+
+

 

+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+
+
+ foo bar toto +
+
+
+
+
+ ) + ctx.response.body = renderPageToString(page) +}) + + +viewRouter.get("/index.html", (ctx) => { + const page = ( + + + +
+
+
+
+
+ ) + ctx.response.body = renderPageToString(page) +}) + +viewRouter.redirect("/", "/index.html") + +viewRouter.get("/login.html", (ctx) => { + const page = ( + + + +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ ) + ctx.response.body = renderPageToString(page) +}) From 8005b38b6703fbfccaeb58d470c6e2fb0dd85de8 Mon Sep 17 00:00:00 2001 From: didier amyot Date: Wed, 23 Oct 2024 07:07:46 -0400 Subject: [PATCH 03/11] Migrated to nix for dependency managment --- dodgeballtracker/__init__.py | 24 - dodgeballtracker/__main__.py | 28 + dodgeballtracker/logic.py | 16 +- download-video | 7 + flake.lock | 130 + flake.nix | 25 + outputs/output.json | 23888 -------------------------------- visualizer/src/api/mod.tsx | 2 +- visualizer/src/api/tab.tsx | 3 +- visualizer/src/views/base.tsx | 2 +- visualizer/src/views/mod.tsx | 1 + 11 files changed, 206 insertions(+), 23920 deletions(-) create mode 100644 dodgeballtracker/__main__.py create mode 100755 download-video create mode 100644 flake.lock create mode 100644 flake.nix delete mode 100644 outputs/output.json diff --git a/dodgeballtracker/__init__.py b/dodgeballtracker/__init__.py index d70bc79..e69de29 100644 --- a/dodgeballtracker/__init__.py +++ b/dodgeballtracker/__init__.py @@ -1,24 +0,0 @@ -from pathlib import Path - -from dodgeballtracker.logic import (DetectedObjectBox, - DodgeballTracker, - get_court_perspective_transform) -import numpy as np - - -here = Path(__file__).parent -input_dir = here / '..' / 'data' -output_dir = here / '..' / 'outputs' - -if __name__ == "__main__": - detected_box_objects = [ - DetectedObjectBox.from_viridis(threshold) for threshold in np.arange(0.5, 1, 0.05) - ] - input_video = input_dir / "micro.mp4" - output_video = output_dir / "output-lmbn_n_cuhk03_d.mp4" - - transformation_matrix = get_court_perspective_transform() - - dodgeball_tracker = DodgeballTracker(input_video, output_video, detected_box_objects, transformation_matrix) - - dodgeball_tracker.main() diff --git a/dodgeballtracker/__main__.py b/dodgeballtracker/__main__.py new file mode 100644 index 0000000..3a5a70d --- /dev/null +++ b/dodgeballtracker/__main__.py @@ -0,0 +1,28 @@ +from pathlib import Path + +from dodgeballtracker.logic import (DetectedObjectBox, + DodgeballTracker, + get_court_perspective_transform) +import numpy as np +import logging + + +here = Path(__file__).parent +input_dir = here / '..' / 'data' +output_dir = here / '..' / 'outputs' + +if __name__ == "__main__": + logging.basicConfig(filename='tracker.log', level=logging.DEBUG) + + detected_box_objects = [ + DetectedObjectBox.from_viridis(threshold) for threshold in np.arange(0.5, 1, 0.05) + ] + + input_video = input_dir / "small.mp4" + output_video = output_dir / "foo.mp4" + + transformation_matrix = get_court_perspective_transform() + + dodgeball_tracker = DodgeballTracker(input_video, output_video, detected_box_objects, transformation_matrix) + + dodgeball_tracker.main() diff --git a/dodgeballtracker/logic.py b/dodgeballtracker/logic.py index 3262fa4..e1e9b50 100644 --- a/dodgeballtracker/logic.py +++ b/dodgeballtracker/logic.py @@ -7,7 +7,7 @@ import cv2 from dodgeballtracker.helper import create_video_writer, iter_frames import matplotlib import numpy as np -from boxmot import DeepOCSORT +from boxmot import DeepOcSort as DeepOCSORT @@ -125,19 +125,20 @@ class DodgeballTracker: def _get_tracker(self): return DeepOCSORT( - model_weights=Path('lmbn_n_cuhk03_d.pt'), # which ReID model to use - device=torch.device("mps"), - fp16=True, + Path('lmbn_n_cuhk03_d.pt'), # which ReID model to use + torch.device("cpu"), + True, ) def _get_detection_model(self): """ load the pre-trained YOLOv8n model """ - return YOLO("yolov8n.pt") + return YOLO("yolo11n.pt", verbose=True) def main(self): # define some constants + print("started") video_cap = cv2.VideoCapture(str(self.input_path)) writer = create_video_writer(video_cap, str(self.output_path)) @@ -150,12 +151,15 @@ class DodgeballTracker: # run the YOLO model on the frame res = [] detections = self.run_model_on_frame(model, frame) + print("ici?") for data in detections.boxes.data.tolist(): + print("la?") is_good_box = self.plot_boxe_to_frame(data, frame) if is_good_box: res.append(data) # show the frame to our screen + print("tracker?") data_ = tracker.update(np.array(res), frame) self.print_tracker_data(data_, i, ts) @@ -163,8 +167,10 @@ class DodgeballTracker: if cv2.waitKey(1) == ord("q"): break + print("fini") video_cap.release() writer.release() cv2.destroyAllWindows() self.persist_points() + print("finished") diff --git a/download-video b/download-video new file mode 100755 index 0000000..fbebc1b --- /dev/null +++ b/download-video @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +yt-dlp --write-info-json \ + --output data/full.mp4 \ + 'https://www.youtube.com/watch?v=Spu6OlAZHUo' + +ffmpeg -ss 00:19:15.00 -i data/full.mp4.webm -t 00:00:30.00 -c copy data/small.mp4 diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..cb814bb --- /dev/null +++ b/flake.lock @@ -0,0 +1,130 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1729595756, + "narHash": "sha256-rNaLWDqjgy23Y6M3K/e7Kiyimq04ikDMrErpqgXWcV0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "782740762fb281404740b6b7084d356c3dab1173", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1729595756, + "narHash": "sha256-rNaLWDqjgy23Y6M3K/e7Kiyimq04ikDMrErpqgXWcV0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "782740762fb281404740b6b7084d356c3dab1173", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "opencv-python-related": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1729677213, + "narHash": "sha256-n+g2ROk4ytvZW84+vjaQMarVI/sFoiEUXxMxPnlM9BU=", + "owner": "all-dressed-programming", + "repo": "opencv-python-related", + "rev": "fb816cdf83b7779962c6b8479b377b2927a9ea2d", + "type": "gitlab" + }, + "original": { + "owner": "all-dressed-programming", + "repo": "opencv-python-related", + "type": "gitlab" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "opencv-python-related": "opencv-python-related" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..f279941 --- /dev/null +++ b/flake.nix @@ -0,0 +1,25 @@ +{ + description = "Pre-built CPU-only OpenCV packages for Python. "; + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + opencv-python-related.url = "gitlab:all-dressed-programming/opencv-python-related"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils, opencv-python-related }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + pythonPackages = pkgs.python312Packages // opencv-python-related.packages.${system}.python312Packages; + virtual-env = pkgs.python312.withPackages (ps: [ ps.matplotlib + pythonPackages.opencv4 + pythonPackages.boxmot + pythonPackages.ultralytics ]); + + in { + packages = { + env = virtual-env; + }; + devShells.default = pkgs.mkShell { buildInputs = [ virtual-env pkgs.yt-dlp pkgs.ffmpeg_7]; }; + }); +} diff --git a/outputs/output.json b/outputs/output.json deleted file mode 100644 index bc737f5..0000000 --- a/outputs/output.json +++ /dev/null @@ -1,23888 +0,0 @@ -{ - "points": [ - { - "x": 552.3171748885943, - "y": 633.3246077802279, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 11 - }, - { - "x": 545.2074865603806, - "y": 692.6744691787319, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 10 - }, - { - "x": 431.72548812409593, - "y": 64.92838060192503, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 9 - }, - { - "x": 38.3199994669869, - "y": 28.015846173246494, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 8 - }, - { - "x": 416.5374767020817, - "y": 586.1624077475268, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 7 - }, - { - "x": -68.80491930707653, - "y": 509.8167047006555, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 6 - }, - { - "x": 62.82682503062192, - "y": 712.334840918019, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 5 - }, - { - "x": 199.99879468380885, - "y": 151.06260145446447, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 4 - }, - { - "x": 102.25932586843874, - "y": 787.26767564053, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 3 - }, - { - "x": 299.60585139521226, - "y": 752.0041324256705, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 2 - }, - { - "x": 113.62737501248185, - "y": 52.01183523318224, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 1 - }, - { - "x": 226.9222352497459, - "y": 868.7594222357136, - "frameIndex": 0, - "frameTimestamp": 0.0, - "objectId": 0 - }, - { - "x": 544.9490274765116, - "y": 692.6711221973316, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 10 - }, - { - "x": 431.72548812409593, - "y": 64.92838060192503, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 9 - }, - { - "x": 37.786972490270486, - "y": 24.15929670230485, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 6 - }, - { - "x": 417.37821075121633, - "y": 584.5875798152139, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 8 - }, - { - "x": -68.25673424042431, - "y": 511.64030449312736, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 7 - }, - { - "x": 62.0573970304601, - "y": 711.1255161566556, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 5 - }, - { - "x": 198.20908836192302, - "y": 147.76402186862217, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 4 - }, - { - "x": 101.91734956610196, - "y": 784.250722881834, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 3 - }, - { - "x": 298.8214497359266, - "y": 753.0895024719842, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 1 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 2 - }, - { - "x": 227.54349774462972, - "y": 868.7666901962585, - "frameIndex": 1, - "frameTimestamp": 40.0, - "objectId": 0 - }, - { - "x": 544.534189061906, - "y": 693.9302842968591, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 10 - }, - { - "x": 431.2843684381686, - "y": 64.92074756547403, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 9 - }, - { - "x": 37.25128908338944, - "y": 20.283527464271735, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 6 - }, - { - "x": 417.95799656381024, - "y": 584.595516860861, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 8 - }, - { - "x": -68.80491930707653, - "y": 509.8167047006555, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 7 - }, - { - "x": 61.53916998641601, - "y": 709.9160628939537, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 5 - }, - { - "x": 197.6271095674176, - "y": 154.27689543337647, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 4 - }, - { - "x": 101.68567866956752, - "y": 784.2478791836674, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 3 - }, - { - "x": 298.3398107880153, - "y": 753.0834781513478, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 1 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 2 - }, - { - "x": 227.722121291119, - "y": 867.9602694295586, - "frameIndex": 2, - "frameTimestamp": 80.0, - "objectId": 0 - }, - { - "x": 545.2074865603806, - "y": 692.6744691787319, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 11 - }, - { - "x": 430.40212094939176, - "y": 64.90548135211876, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 8 - }, - { - "x": 38.3199994669869, - "y": 28.015846173246494, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 5 - }, - { - "x": 415.9496030294157, - "y": 570.0598749369764, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 10 - }, - { - "x": -69.35497978113325, - "y": 507.9868661527677, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 7 - }, - { - "x": 60.48461732363135, - "y": 706.2739531146366, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 6 - }, - { - "x": 195.83601529406369, - "y": 150.99317427749594, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 4 - }, - { - "x": 100.83628596377663, - "y": 782.2161515885656, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 3 - }, - { - "x": 297.3765232245442, - "y": 753.0714293891524, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 1 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 2 - }, - { - "x": 227.92944270084348, - "y": 867.9626959832262, - "frameIndex": 3, - "frameTimestamp": 120.0, - "objectId": 0 - }, - { - "x": 544.534189061906, - "y": 693.9302842968591, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 11 - }, - { - "x": 429.9609931464925, - "y": 64.89784817521361, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 9 - }, - { - "x": 38.3199994669869, - "y": 28.015846173246494, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 5 - }, - { - "x": 416.6835388310638, - "y": 578.181794471084, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 10 - }, - { - "x": -69.59410728676689, - "y": 506.1551946714739, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 7 - }, - { - "x": 59.97580404129985, - "y": 706.267434238138, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 6 - }, - { - "x": 195.41972412428532, - "y": 150.9862313391347, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 4 - }, - { - "x": 101.02955585537279, - "y": 783.2304603676605, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 3 - }, - { - "x": 296.5870976945399, - "y": 749.7672147074455, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 2 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 1 - }, - { - "x": 228.05240586557173, - "y": 865.5275328744165, - "frameIndex": 4, - "frameTimestamp": 160.0, - "objectId": 0 - }, - { - "x": 551.845886895473, - "y": 630.4269058512443, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 8 - }, - { - "x": 544.534189061906, - "y": 693.9302842968591, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 12 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 9 - }, - { - "x": 39.752782047027765, - "y": 31.869097686043325, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 5 - }, - { - "x": 418.4601202161768, - "y": 579.8129321522273, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 10 - }, - { - "x": -69.04269805194048, - "y": 507.9912924812157, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 7 - }, - { - "x": 59.70653068530905, - "y": 705.0476873161607, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 6 - }, - { - "x": 193.88903196471634, - "y": 154.21463589137664, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 3 - }, - { - "x": 100.33364913810651, - "y": 783.221913426994, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 4 - }, - { - "x": 295.49162916220774, - "y": 747.5426199450369, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 2 - }, - { - "x": 112.84046238572189, - "y": 48.264844296023, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 1 - }, - { - "x": 228.32896800714886, - "y": 861.4324750529977, - "frameIndex": 5, - "frameTimestamp": 200.0, - "objectId": 0 - }, - { - "x": -68.76802468318826, - "y": 444.1704247318718, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 12 - }, - { - "x": 551.0162046732073, - "y": 630.415801821545, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 9 - }, - { - "x": 544.534189061906, - "y": 693.9302842968591, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 11 - }, - { - "x": 430.3916943107879, - "y": 61.21632072558571, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 8 - }, - { - "x": 40.203973973980965, - "y": 31.87698721079823, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 6 - }, - { - "x": 417.6136314455646, - "y": 581.4029209640146, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 10 - }, - { - "x": -68.49317202936496, - "y": 509.82111951841523, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 7 - }, - { - "x": 60.47081670371858, - "y": 705.0574857357537, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 5 - }, - { - "x": 192.64296299129902, - "y": 154.1938819927607, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 4 - }, - { - "x": 100.56561879033835, - "y": 783.2247624163842, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 2 - }, - { - "x": 294.9891955772091, - "y": 743.0790453547448, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 3 - }, - { - "x": 112.84046238572189, - "y": 48.264844296023, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 1 - }, - { - "x": 228.6643917669612, - "y": 858.9547765473309, - "frameIndex": 6, - "frameTimestamp": 240.0, - "objectId": 0 - }, - { - "x": -67.77527750756076, - "y": 444.18493505963045, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 12 - }, - { - "x": 551.2927664783447, - "y": 630.4195031790231, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 9 - }, - { - "x": 544.2760952585917, - "y": 693.9269443165236, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 10 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 8 - }, - { - "x": 40.72840249771477, - "y": 35.69542943044182, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 6 - }, - { - "x": 418.43406814367137, - "y": 578.2058363818559, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 11 - }, - { - "x": -69.04269805194048, - "y": 507.9912924812157, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 7 - }, - { - "x": 60.47081670371858, - "y": 705.0574857357537, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 5 - }, - { - "x": 192.08930815967798, - "y": 150.93068638781605, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 4 - }, - { - "x": 100.37175733401007, - "y": 782.2104431112915, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 3 - }, - { - "x": 294.67000161499334, - "y": 739.7006138335475, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 2 - }, - { - "x": 112.736902824513, - "y": 51.996380915181774, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 0 - }, - { - "x": 228.79146671376404, - "y": 856.4574189532281, - "frameIndex": 7, - "frameTimestamp": 280.0, - "objectId": 1 - }, - { - "x": 551.845886895473, - "y": 630.4269058512443, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 9 - }, - { - "x": 544.6905674630733, - "y": 692.6677752038935, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 11 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 8 - }, - { - "x": 41.2502496295458, - "y": 39.49507615102134, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 5 - }, - { - "x": 418.2740704046735, - "y": 586.186161899829, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 10 - }, - { - "x": -69.04269805194048, - "y": 507.9912924812157, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 7 - }, - { - "x": 59.96129359157226, - "y": 705.0509534675649, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 6 - }, - { - "x": 191.25668011043385, - "y": 150.91679974874356, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 4 - }, - { - "x": 99.47971319920657, - "y": 781.1849578958661, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 3 - }, - { - "x": 294.6306851195725, - "y": 730.5671668295996, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 2 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 1 - }, - { - "x": 229.58054551634703, - "y": 854.7911721214496, - "frameIndex": 8, - "frameTimestamp": 320.0, - "objectId": 0 - }, - { - "x": 552.3990030551129, - "y": 630.4343084664854, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 9 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 8 - }, - { - "x": 41.699214597738646, - "y": 39.502903078161744, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 6 - }, - { - "x": 417.1442866158057, - "y": 587.751993931005, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 10 - }, - { - "x": -69.04269805194048, - "y": 507.9912924812157, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 7 - }, - { - "x": 61.27319615078594, - "y": 708.706486976137, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 5 - }, - { - "x": 189.7196695040311, - "y": 144.33832059424074, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 4 - }, - { - "x": 99.28396895923892, - "y": 780.1654382168962, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 3 - }, - { - "x": 294.30523137786, - "y": 727.0867781323102, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 2 - }, - { - "x": 112.84046238572189, - "y": 48.264844296023, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 1 - }, - { - "x": 230.399262113644, - "y": 853.960145636367, - "frameIndex": 9, - "frameTimestamp": 360.0, - "objectId": 0 - }, - { - "x": 553.2286693118897, - "y": 630.4454122825113, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 10 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 8 - }, - { - "x": 41.62854826555908, - "y": 35.71114557096141, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 6 - }, - { - "x": 415.69940648991974, - "y": 587.7322458915994, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 9 - }, - { - "x": -69.04269805194048, - "y": 507.9912924812157, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 7 - }, - { - "x": 59.13426433857189, - "y": 700.1410211908252, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 5 - }, - { - "x": 189.02946498275602, - "y": 147.6107150863103, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 4 - }, - { - "x": 99.4321929342151, - "y": 776.0727318230959, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 3 - }, - { - "x": 294.91701230638705, - "y": 724.7611854250936, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 2 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 1 - }, - { - "x": 231.31951538558144, - "y": 856.4872101182006, - "frameIndex": 10, - "frameTimestamp": 400.0, - "objectId": 0 - }, - { - "x": 552.6755595383901, - "y": 630.4380097527386, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 10 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 8 - }, - { - "x": 42.59713614878428, - "y": 39.51855678625856, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 6 - }, - { - "x": 414.3192760583185, - "y": 590.8609782827749, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 9 - }, - { - "x": -69.04269805194048, - "y": 507.9912924812157, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 7 - }, - { - "x": 58.555535398517875, - "y": 695.1789441752796, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 4 - }, - { - "x": 189.02946498275602, - "y": 147.6107150863103, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 5 - }, - { - "x": 98.51439677165858, - "y": 768.7939628566694, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 3 - }, - { - "x": 294.66794276608425, - "y": 724.7580211513255, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 1 - }, - { - "x": 112.84046238572189, - "y": 48.264844296023, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 2 - }, - { - "x": 232.60681344506008, - "y": 857.3372326791331, - "frameIndex": 11, - "frameTimestamp": 440.0, - "objectId": 0 - }, - { - "x": 551.7476533383324, - "y": 628.973265749324, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 10 - }, - { - "x": 428.6228723744156, - "y": 61.1856680621817, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 7 - }, - { - "x": 44.9045036941519, - "y": 43.33063658390064, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 6 - }, - { - "x": 413.77628454907017, - "y": 592.4199008076348, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 8 - }, - { - "x": -67.55793827601377, - "y": 509.8343638572724, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 9 - }, - { - "x": 57.174177411430314, - "y": 688.8885972431758, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 4 - }, - { - "x": 186.79196185878868, - "y": 144.28935889203564, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 5 - }, - { - "x": 97.1031320220987, - "y": 761.3761243590109, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 3 - }, - { - "x": 294.7253377643331, - "y": 723.5872760669837, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 1 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 2 - }, - { - "x": 234.98300162870186, - "y": 859.8582078884815, - "frameIndex": 12, - "frameTimestamp": 480.0, - "objectId": 0 - }, - { - "x": 551.1936875875991, - "y": 628.9658461655894, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 10 - }, - { - "x": 428.6228723744156, - "y": 61.1856680621817, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 7 - }, - { - "x": 45.35234532779381, - "y": 43.33843221546937, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 6 - }, - { - "x": 415.2451136599948, - "y": 594.001294521829, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 8 - }, - { - "x": -67.55793827601377, - "y": 509.8343638572724, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 9 - }, - { - "x": 54.08843101469982, - "y": 676.0321494301489, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 4 - }, - { - "x": 185.11893264056195, - "y": 144.2613798831013, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 5 - }, - { - "x": 96.07917101878671, - "y": 755.9940177395139, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 3 - }, - { - "x": 294.3619742603329, - "y": 725.9224100748067, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 1 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 2 - }, - { - "x": 237.72618189271697, - "y": 860.7176298188573, - "frameIndex": 13, - "frameTimestamp": 520.0, - "objectId": 0 - }, - { - "x": 549.5317647118526, - "y": 628.9435870711943, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 10 - }, - { - "x": 428.6228723744156, - "y": 61.1856680621817, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 7 - }, - { - "x": 44.45665927926112, - "y": 43.322840903918255, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 6 - }, - { - "x": 416.6808713010144, - "y": 594.0208552480472, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 5 - }, - { - "x": -66.70067439848032, - "y": 511.6623211020843, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 8 - }, - { - "x": 52.88423250529118, - "y": 668.147619824831, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 4 - }, - { - "x": 181.62974903344988, - "y": 124.17755400946275, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 9 - }, - { - "x": 95.66580459657004, - "y": 753.8212961709249, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 3 - }, - { - "x": 294.1132431030502, - "y": 725.9192521182846, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 1 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 2 - }, - { - "x": 240.04457903386947, - "y": 861.5701296886145, - "frameIndex": 14, - "frameTimestamp": 560.0, - "objectId": 0 - }, - { - "x": 549.4298388065076, - "y": 627.4854310641663, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 10 - }, - { - "x": 427.7553135458907, - "y": 64.85968158839475, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 8 - }, - { - "x": 44.45665927926112, - "y": 43.322840903918255, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 7 - }, - { - "x": 418.1166002829194, - "y": 594.0404155838144, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 5 - }, - { - "x": -66.38946645615391, - "y": 511.6667243669112, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 9 - }, - { - "x": 51.418758932031984, - "y": 661.4653924447306, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 4 - }, - { - "x": 181.44538715152686, - "y": 137.58631333021896, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 6 - }, - { - "x": 96.18088535702064, - "y": 752.739657694486, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 3 - }, - { - "x": 294.1698011002098, - "y": 724.7516925709446, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 2 - }, - { - "x": 113.62737501248185, - "y": 52.01183523318224, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 1 - }, - { - "x": 242.96193004593894, - "y": 860.7791781632482, - "frameIndex": 15, - "frameTimestamp": 600.0, - "objectId": 0 - }, - { - "x": 548.875007999517, - "y": 627.4779942703288, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 10 - }, - { - "x": 427.7553135458907, - "y": 64.85968158839475, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 5 - }, - { - "x": 44.45665927926112, - "y": 43.322840903918255, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 9 - }, - { - "x": 417.2551663328222, - "y": 594.0286794292077, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 6 - }, - { - "x": -66.38946645615391, - "y": 511.6667243669112, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 8 - }, - { - "x": 50.201093254901075, - "y": 654.6880037963796, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 4 - }, - { - "x": 176.2261927237725, - "y": 134.16893808337863, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 7 - }, - { - "x": 96.24914336393222, - "y": 750.5557361913521, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 3 - }, - { - "x": 293.97710085915446, - "y": 723.577764093849, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 2 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 1 - }, - { - "x": 245.28273609982247, - "y": 862.4549996051666, - "frameIndex": 16, - "frameTimestamp": 640.0, - "objectId": 0 - }, - { - "x": 427.7553135458907, - "y": 64.85968158839475, - "frameIndex": 17, - "frameTimestamp": 680.0, - "objectId": 5 - }, - { - "x": 44.841891113132654, - "y": 39.5576902037824, - "frameIndex": 17, - "frameTimestamp": 680.0, - "objectId": 8 - }, - { - "x": 417.5423121291962, - "y": 594.032591496361, - "frameIndex": 17, - "frameTimestamp": 680.0, - "objectId": 6 - }, - { - "x": -66.07825985582804, - "y": 511.67112761275, - "frameIndex": 17, - "frameTimestamp": 680.0, - "objectId": 7 - }, - { - "x": 48.96531106858114, - "y": 647.8097807186517, - "frameIndex": 17, - "frameTimestamp": 680.0, - "objectId": 3 - }, - { - "x": 171.26046125408988, - "y": 120.61040769564524, - "frameIndex": 17, - "frameTimestamp": 680.0, - "objectId": 9 - }, - { - "x": 96.52522417490819, - "y": 749.4624632593576, - "frameIndex": 17, - "frameTimestamp": 680.0, - "objectId": 4 - }, - { - "x": 294.34040721082727, - "y": 721.2297716527779, - "frameIndex": 17, - "frameTimestamp": 680.0, - "objectId": 2 - }, - { - "x": 113.28678804659278, - "y": 48.272601923436255, - "frameIndex": 17, - "frameTimestamp": 680.0, - "objectId": 1 - }, - { - "x": 246.98072390559395, - "y": 865.7493959309626, - "frameIndex": 17, - "frameTimestamp": 680.0, - "objectId": 0 - }, - { - "x": 427.7553135458907, - "y": 64.85968158839475, - "frameIndex": 18, - "frameTimestamp": 720.0, - "objectId": 5 - }, - { - "x": 44.841891113132654, - "y": 39.5576902037824, - "frameIndex": 18, - "frameTimestamp": 720.0, - "objectId": 9 - }, - { - "x": 418.7161197309338, - "y": 595.6049862122892, - "frameIndex": 18, - "frameTimestamp": 720.0, - "objectId": 6 - }, - { - "x": -66.07825985582804, - "y": 511.67112761275, - "frameIndex": 18, - "frameTimestamp": 720.0, - "objectId": 8 - }, - { - "x": 49.47716885153791, - "y": 646.4319055011734, - "frameIndex": 18, - "frameTimestamp": 720.0, - "objectId": 3 - }, - { - "x": 168.83794041483233, - "y": 137.37489322727367, - "frameIndex": 18, - "frameTimestamp": 720.0, - "objectId": 7 - }, - { - "x": 96.28340797089604, - "y": 749.4594367924902, - "frameIndex": 18, - "frameTimestamp": 720.0, - "objectId": 4 - }, - { - "x": 295.1315475220786, - "y": 715.3013959101554, - "frameIndex": 18, - "frameTimestamp": 720.0, - "objectId": 2 - }, - { - "x": 113.18214029363004, - "y": 52.00410809804776, - "frameIndex": 18, - "frameTimestamp": 720.0, - "objectId": 1 - }, - { - "x": 247.40279423409856, - "y": 866.5682869352013, - "frameIndex": 18, - "frameTimestamp": 720.0, - "objectId": 0 - }, - { - "x": 428.19645487757475, - "y": 64.86731499939897, - "frameIndex": 19, - "frameTimestamp": 760.0, - "objectId": 7 - }, - { - "x": 44.841891113132654, - "y": 39.5576902037824, - "frameIndex": 19, - "frameTimestamp": 760.0, - "objectId": 9 - }, - { - "x": 421.00958373052447, - "y": 595.6362074943595, - "frameIndex": 19, - "frameTimestamp": 760.0, - "objectId": 8 - }, - { - "x": -65.45585068114327, - "y": 511.6799340474648, - "frameIndex": 19, - "frameTimestamp": 760.0, - "objectId": 6 - }, - { - "x": 52.141065257301115, - "y": 657.4300118852843, - "frameIndex": 19, - "frameTimestamp": 760.0, - "objectId": 4 - }, - { - "x": 166.09573963220674, - "y": 140.6436803953978, - "frameIndex": 19, - "frameTimestamp": 760.0, - "objectId": 5 - }, - { - "x": 96.8371260197395, - "y": 747.2641794889406, - "frameIndex": 19, - "frameTimestamp": 760.0, - "objectId": 3 - }, - { - "x": 296.00662054992273, - "y": 712.9141420732815, - "frameIndex": 19, - "frameTimestamp": 760.0, - "objectId": 2 - }, - { - "x": 113.28678804659278, - "y": 48.272601923436255, - "frameIndex": 19, - "frameTimestamp": 760.0, - "objectId": 1 - }, - { - "x": 247.622255597703, - "y": 868.1931867339099, - "frameIndex": 19, - "frameTimestamp": 760.0, - "objectId": 0 - }, - { - "x": 545.0509341528909, - "y": 624.4996587113671, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 10 - }, - { - "x": 428.6228723744156, - "y": 61.1856680621817, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 7 - }, - { - "x": 45.29083372107989, - "y": 39.56551674111051, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 6 - }, - { - "x": 421.60357846331584, - "y": 597.1957625439615, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 8 - }, - { - "x": -64.83344687435648, - "y": 511.68874040622933, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 4 - }, - { - "x": 51.84514839018125, - "y": 656.0698878459335, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 3 - }, - { - "x": 163.58870545827608, - "y": 133.95672217880795, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 9 - }, - { - "x": 96.90758574383536, - "y": 745.0511453454473, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 1 - }, - { - "x": 295.6204424979441, - "y": 710.4974242468967, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 2 - }, - { - "x": 113.39194873726854, - "y": 44.522805530548084, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 5 - }, - { - "x": 247.83512611650153, - "y": 869.0040757709711, - "frameIndex": 20, - "frameTimestamp": 800.0, - "objectId": 0 - }, - { - "x": 544.662937073366, - "y": 623.0241615156237, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 10 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 8 - }, - { - "x": 44.841891113132654, - "y": 39.5576902037824, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 6 - }, - { - "x": 421.3173533535161, - "y": 597.1918692040908, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 5 - }, - { - "x": -64.52224698390314, - "y": 511.69314355713055, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 4 - }, - { - "x": 52.409720231782025, - "y": 657.4335446612598, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 2 - }, - { - "x": 160.64418380012694, - "y": 140.55238613529824, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 9 - }, - { - "x": 97.7705722817637, - "y": 748.3784234253196, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 3 - }, - { - "x": 295.98103523690804, - "y": 703.1855278101117, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 1 - }, - { - "x": 113.49762614621875, - "y": 40.75458411297461, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 7 - }, - { - "x": 248.46109679992065, - "y": 869.8179574739552, - "frameIndex": 21, - "frameTimestamp": 840.0, - "objectId": 0 - }, - { - "x": 542.9906492074867, - "y": 623.0016954815073, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 9 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 7 - }, - { - "x": 45.29083372107989, - "y": 39.56551674111051, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 6 - }, - { - "x": 421.03112710467286, - "y": 597.1879758487266, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 4 - }, - { - "x": -63.89985122883322, - "y": 511.701949801972, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 5 - }, - { - "x": 52.94702717799219, - "y": 657.4406101737251, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 3 - }, - { - "x": 157.5271548613129, - "y": 150.3542559530521, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 8 - }, - { - "x": 98.73909523029222, - "y": 748.3905524261024, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 1 - }, - { - "x": 295.90718377108993, - "y": 699.4799418902661, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 2 - }, - { - "x": 115.51837489554867, - "y": 48.31138933996207, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 11 - }, - { - "x": 250.52898160966137, - "y": 869.8421374473032, - "frameIndex": 22, - "frameTimestamp": 880.0, - "objectId": 0 - }, - { - "x": 542.7119307797567, - "y": 622.9979510916603, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 9 - }, - { - "x": 544.2270658940845, - "y": 690.1218589977664, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 10 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 7 - }, - { - "x": 45.73977353411389, - "y": 39.57334322971427, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 4 - }, - { - "x": 420.45867118982835, - "y": 597.1801890915166, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 5 - }, - { - "x": -63.89985122883322, - "y": 511.701949801972, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 6 - }, - { - "x": 53.215679149732566, - "y": 657.4441429102149, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 3 - }, - { - "x": 156.91315171404162, - "y": 153.59878421195094, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 8 - }, - { - "x": 98.9812239341941, - "y": 748.3935846508356, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 1 - }, - { - "x": 296.02904013149015, - "y": 696.9943117955396, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 2 - }, - { - "x": 116.41099028975778, - "y": 48.3269039703287, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 11 - }, - { - "x": 253.01008391812118, - "y": 870.6758533419409, - "frameIndex": 23, - "frameTimestamp": 920.0, - "objectId": 0 - }, - { - "x": 542.0405751233902, - "y": 621.5140917080121, - "frameIndex": 24, - "frameTimestamp": 960.0, - "objectId": 9 - }, - { - "x": 544.2270658940845, - "y": 690.1218589977664, - "frameIndex": 24, - "frameTimestamp": 960.0, - "objectId": 8 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 24, - "frameTimestamp": 960.0, - "objectId": 6 - }, - { - "x": 45.22901898243051, - "y": 35.77400817138059, - "frameIndex": 24, - "frameTimestamp": 960.0, - "objectId": 5 - }, - { - "x": 419.5999787745644, - "y": 597.1685088394966, - "frameIndex": 24, - "frameTimestamp": 960.0, - "objectId": 4 - }, - { - "x": -63.89985122883322, - "y": 511.701949801972, - "frameIndex": 24, - "frameTimestamp": 960.0, - "objectId": 7 - }, - { - "x": 54.045652719830336, - "y": 658.8072855074714, - "frameIndex": 24, - "frameTimestamp": 960.0, - "objectId": 3 - }, - { - "x": 99.54283334370496, - "y": 746.192618146246, - "frameIndex": 24, - "frameTimestamp": 960.0, - "objectId": 1 - }, - { - "x": 295.25756385989047, - "y": 696.9843618062292, - "frameIndex": 24, - "frameTimestamp": 960.0, - "objectId": 2 - }, - { - "x": 257.97287526777643, - "y": 869.9291796023654, - "frameIndex": 24, - "frameTimestamp": 960.0, - "objectId": 0 - }, - { - "x": 541.7614241482192, - "y": 621.5103386427342, - "frameIndex": 25, - "frameTimestamp": 1000.0, - "objectId": 10 - }, - { - "x": 543.9678647244938, - "y": 690.1184978259599, - "frameIndex": 25, - "frameTimestamp": 1000.0, - "objectId": 6 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 25, - "frameTimestamp": 1000.0, - "objectId": 8 - }, - { - "x": 45.22901898243051, - "y": 35.77400817138059, - "frameIndex": 25, - "frameTimestamp": 1000.0, - "objectId": 4 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 25, - "frameTimestamp": 1000.0, - "objectId": 5 - }, - { - "x": -63.89985122883322, - "y": 511.701949801972, - "frameIndex": 25, - "frameTimestamp": 1000.0, - "objectId": 9 - }, - { - "x": 53.752980090512025, - "y": 657.4512083437094, - "frameIndex": 25, - "frameTimestamp": 1000.0, - "objectId": 3 - }, - { - "x": 99.41589656700188, - "y": 742.8569120451975, - "frameIndex": 25, - "frameTimestamp": 1000.0, - "objectId": 1 - }, - { - "x": 294.74324175224933, - "y": 696.9777284207813, - "frameIndex": 25, - "frameTimestamp": 1000.0, - "objectId": 2 - }, - { - "x": 260.9044837517256, - "y": 866.726466958382, - "frameIndex": 25, - "frameTimestamp": 1000.0, - "objectId": 0 - }, - { - "x": 541.3671439906094, - "y": 620.0256450163944, - "frameIndex": 26, - "frameTimestamp": 1040.0, - "objectId": 10 - }, - { - "x": 543.9678647244938, - "y": 690.1184978259599, - "frameIndex": 26, - "frameTimestamp": 1040.0, - "objectId": 6 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 26, - "frameTimestamp": 1040.0, - "objectId": 9 - }, - { - "x": 45.73977353411389, - "y": 39.57334322971427, - "frameIndex": 26, - "frameTimestamp": 1040.0, - "objectId": 5 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 26, - "frameTimestamp": 1040.0, - "objectId": 4 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 26, - "frameTimestamp": 1040.0, - "objectId": 8 - }, - { - "x": 53.165040879559676, - "y": 654.7270351283672, - "frameIndex": 26, - "frameTimestamp": 1040.0, - "objectId": 3 - }, - { - "x": 98.25111262615174, - "y": 733.8192350016542, - "frameIndex": 26, - "frameTimestamp": 1040.0, - "objectId": 2 - }, - { - "x": 294.42724045902764, - "y": 698.2190207460617, - "frameIndex": 26, - "frameTimestamp": 1040.0, - "objectId": 1 - }, - { - "x": 264.0070768032711, - "y": 867.5748115370615, - "frameIndex": 26, - "frameTimestamp": 1040.0, - "objectId": 0 - }, - { - "x": 435.7063724736517, - "y": 917.9092305131231, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 7 - }, - { - "x": 540.2488023462649, - "y": 620.0105978810456, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 10 - }, - { - "x": 543.9678647244938, - "y": 690.1184978259599, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 6 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 8 - }, - { - "x": 46.18871055226073, - "y": 39.581169669593876, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 4 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 5 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 9 - }, - { - "x": 52.30337319890759, - "y": 651.9831541341349, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 3 - }, - { - "x": 98.07949619177154, - "y": 731.5307762168638, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 1 - }, - { - "x": 294.42724045902764, - "y": 698.2190207460617, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 2 - }, - { - "x": 266.5278297677905, - "y": 865.9785119382087, - "frameIndex": 27, - "frameTimestamp": 1080.0, - "objectId": 0 - }, - { - "x": 435.32057808194, - "y": 917.9048425008694, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 7 - }, - { - "x": 541.251660324923, - "y": 618.5401306563018, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 9 - }, - { - "x": 543.9678647244938, - "y": 690.1184978259599, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 6 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 10 - }, - { - "x": 47.59151177817725, - "y": 43.37740964712622, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 4 - }, - { - "x": 418.45503960699887, - "y": 597.1529349532165, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 5 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 8 - }, - { - "x": 51.13697544553001, - "y": 647.8384820378498, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 3 - }, - { - "x": 97.94434895042696, - "y": 728.0763256926843, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 1 - }, - { - "x": 293.8556878533215, - "y": 699.4535184966813, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 2 - }, - { - "x": 269.81553505699094, - "y": 867.6428281995227, - "frameIndex": 28, - "frameTimestamp": 1120.0, - "objectId": 0 - }, - { - "x": 435.1276801099973, - "y": 917.902648485915, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 5 - }, - { - "x": 540.528389388919, - "y": 620.0143596868353, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 9 - }, - { - "x": 544.6432473032266, - "y": 688.8518513535595, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 7 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 10 - }, - { - "x": 47.20051253532167, - "y": 47.12395028296972, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 3 - }, - { - "x": 418.4294315888973, - "y": 595.6010834820304, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 6 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 8 - }, - { - "x": 47.436175860047264, - "y": 629.4616683693465, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 4 - }, - { - "x": 98.19240271879917, - "y": 728.0794670523868, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 2 - }, - { - "x": 294.1704396574712, - "y": 698.2157109209177, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 1 - }, - { - "x": 274.5368207376935, - "y": 869.316450756718, - "frameIndex": 29, - "frameTimestamp": 1160.0, - "objectId": 0 - }, - { - "x": 435.1276801099973, - "y": 917.902648485915, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 5 - }, - { - "x": 540.2488023462649, - "y": 620.0105978810456, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 9 - }, - { - "x": 544.6432473032266, - "y": 688.8518513535595, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 6 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 10 - }, - { - "x": 47.20051253532167, - "y": 47.12395028296972, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 4 - }, - { - "x": 418.4294315888973, - "y": 595.6010834820304, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 7 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 8 - }, - { - "x": 48.02368476544445, - "y": 630.9049386331845, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 3 - }, - { - "x": 98.23024303206799, - "y": 726.9227702394599, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 2 - }, - { - "x": 293.8556878533215, - "y": 699.4535184966813, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 1 - }, - { - "x": 281.6384487896457, - "y": 867.7812737383448, - "frameIndex": 30, - "frameTimestamp": 1200.0, - "objectId": 0 - }, - { - "x": 435.32057808194, - "y": 917.9048425008694, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 5 - }, - { - "x": 539.9692142158882, - "y": 620.0068360606207, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 10 - }, - { - "x": 544.6432473032266, - "y": 688.8518513535595, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 7 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 11 - }, - { - "x": 46.75377755957609, - "y": 47.116185541217064, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 4 - }, - { - "x": 418.7161197309338, - "y": 595.6049862122892, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 6 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 9 - }, - { - "x": 50.202665080835885, - "y": 642.2627617433457, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 3 - }, - { - "x": 150.0822942790966, - "y": 156.72513772219776, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 8 - }, - { - "x": 97.77072661556241, - "y": 725.7566140513903, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 2 - }, - { - "x": 294.2875576764968, - "y": 695.7229587911875, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 1 - }, - { - "x": 287.7325174853212, - "y": 866.2270568337549, - "frameIndex": 31, - "frameTimestamp": 1240.0, - "objectId": 0 - }, - { - "x": 435.32057808194, - "y": 917.9048425008694, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 5 - }, - { - "x": 538.9698547565688, - "y": 621.4728071881216, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 10 - }, - { - "x": 544.6432473032266, - "y": 688.8518513535595, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 7 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 11 - }, - { - "x": 47.20051253532167, - "y": 47.12395028296972, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 3 - }, - { - "x": 418.4294315888973, - "y": 595.6010834820304, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 6 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 8 - }, - { - "x": 49.929583807592266, - "y": 642.2591420911745, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 4 - }, - { - "x": 151.32626534238392, - "y": 156.74582871200005, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 9 - }, - { - "x": 96.3136594702298, - "y": 724.5746269939339, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 2 - }, - { - "x": 294.1470819944349, - "y": 693.2127281154598, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 1 - }, - { - "x": 291.47387296591836, - "y": 866.2709100995758, - "frameIndex": 32, - "frameTimestamp": 1280.0, - "objectId": 0 - }, - { - "x": 435.32057808194, - "y": 917.9048425008694, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 5 - }, - { - "x": 537.815228295458, - "y": 624.4025260136004, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 11 - }, - { - "x": 544.2270658940845, - "y": 690.1218589977664, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 8 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 9 - }, - { - "x": 46.75377755957609, - "y": 47.116185541217064, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 3 - }, - { - "x": 418.16880196734536, - "y": 597.1490414429101, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 6 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 7 - }, - { - "x": 49.38341815861144, - "y": 642.2519027457089, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 4 - }, - { - "x": 154.22878097930214, - "y": 156.79410629916953, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 10 - }, - { - "x": 95.60083896100593, - "y": 723.3988861607518, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 1 - }, - { - "x": 294.5237925567267, - "y": 690.6949109663607, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 2 - }, - { - "x": 293.4131305365295, - "y": 868.7291372451143, - "frameIndex": 33, - "frameTimestamp": 1320.0, - "objectId": 0 - }, - { - "x": 435.1276801099973, - "y": 917.902648485915, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 5 - }, - { - "x": 538.093538146252, - "y": 624.406262067436, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 10 - }, - { - "x": 544.6432473032266, - "y": 688.8518513535595, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 8 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 9 - }, - { - "x": 46.75377755957609, - "y": 47.116185541217064, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 3 - }, - { - "x": 418.16880196734536, - "y": 597.1490414429101, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 4 - }, - { - "x": -61.721508356462444, - "y": 511.732771060835, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 7 - }, - { - "x": 49.68743728253927, - "y": 643.6530089932371, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 6 - }, - { - "x": 154.22878097930214, - "y": 156.79410629916953, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 11 - }, - { - "x": 95.38558249375096, - "y": 722.2262625737451, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 2 - }, - { - "x": 294.96284120256297, - "y": 686.8895437821479, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 1 - }, - { - "x": 294.44878634679503, - "y": 868.7412588798652, - "frameIndex": 34, - "frameTimestamp": 1360.0, - "objectId": 0 - }, - { - "x": 435.32057808194, - "y": 917.9048425008694, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 5 - }, - { - "x": 537.3795038338907, - "y": 625.8625359918495, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 10 - }, - { - "x": 544.6432473032266, - "y": 688.8518513535595, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 7 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 9 - }, - { - "x": 46.30703981627465, - "y": 47.10842075136125, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 3 - }, - { - "x": 418.45503960699887, - "y": 597.1529349532165, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 4 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 8 - }, - { - "x": 49.68743728253927, - "y": 643.6530089932371, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 6 - }, - { - "x": 94.38653579709043, - "y": 722.2135703061496, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 2 - }, - { - "x": 295.54414670216846, - "y": 685.6194668965288, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 1 - }, - { - "x": 295.60628830294604, - "y": 873.5761860493492, - "frameIndex": 35, - "frameTimestamp": 1400.0000000000002, - "objectId": 0 - }, - { - "x": 435.1276801099973, - "y": 917.902648485915, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 5 - }, - { - "x": 536.8237300572061, - "y": 625.8550809079965, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 11 - }, - { - "x": 544.6432473032266, - "y": 688.8518513535595, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 9 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 7 - }, - { - "x": 45.86029930539167, - "y": 47.100655913401745, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 3 - }, - { - "x": 418.45503960699887, - "y": 597.1529349532165, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 4 - }, - { - "x": -60.87567937971191, - "y": 513.55431600567, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 6 - }, - { - "x": 51.62413532638249, - "y": 645.0715539808799, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 8 - }, - { - "x": 93.16888483165212, - "y": 721.0249865672654, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 2 - }, - { - "x": 295.40566708904566, - "y": 683.0514381127145, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 1 - }, - { - "x": 296.58538343874346, - "y": 874.3848213768696, - "frameIndex": 36, - "frameTimestamp": 1440.0, - "objectId": 0 - }, - { - "x": 435.1276801099973, - "y": 917.902648485915, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 6 - }, - { - "x": 536.8237300572061, - "y": 625.8550809079965, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 10 - }, - { - "x": 429.49465357160915, - "y": 57.49377328216689, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 9 - }, - { - "x": 46.30703981627465, - "y": 47.10842075136125, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 3 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 4 - }, - { - "x": -60.56502495807387, - "y": 513.5587075438779, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 7 - }, - { - "x": 50.778129302820176, - "y": 643.6674553901638, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 8 - }, - { - "x": 92.91877458507129, - "y": 721.0218070369191, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 2 - }, - { - "x": 295.34458399165385, - "y": 684.3355993606938, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 1 - }, - { - "x": 297.3570046632906, - "y": 875.1892290593497, - "frameIndex": 37, - "frameTimestamp": 1480.0, - "objectId": 0 - }, - { - "x": 434.7418826139283, - "y": 917.8982604383527, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 5 - }, - { - "x": 536.5458415570982, - "y": 625.8513533444501, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 10 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 9 - }, - { - "x": 45.86029930539167, - "y": 47.100655913401745, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 3 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 4 - }, - { - "x": -61.09913675560552, - "y": 511.7415769639196, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 7 - }, - { - "x": 51.32346912658168, - "y": 643.6746785066875, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 8 - }, - { - "x": 147.17961161658903, - "y": 156.67685735688906, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 6 - }, - { - "x": 92.16843863877875, - "y": 721.012268379692, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 2 - }, - { - "x": 295.0837389881936, - "y": 684.3322122365462, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 1 - }, - { - "x": 298.38326262880696, - "y": 875.201194979491, - "frameIndex": 38, - "frameTimestamp": 1520.0, - "objectId": 0 - }, - { - "x": 434.9347816206608, - "y": 917.9004544650763, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 6 - }, - { - "x": 536.5458415570982, - "y": 625.8513533444501, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 12 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 11 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 10 - }, - { - "x": 46.30703981627465, - "y": 47.10842075136125, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 3 - }, - { - "x": 419.02751146897754, - "y": 597.1607219273452, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 5 - }, - { - "x": -60.56502495807387, - "y": 513.5587075438779, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 7 - }, - { - "x": 49.41476169977696, - "y": 643.6493973598634, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 8 - }, - { - "x": 147.59428772697575, - "y": 156.68375467100236, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 4 - }, - { - "x": 91.41809488256605, - "y": 721.0027296231809, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 2 - }, - { - "x": 294.82289303956566, - "y": 684.3288251001254, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 1 - }, - { - "x": 299.5620031772203, - "y": 876.0085415224278, - "frameIndex": 39, - "frameTimestamp": 1560.0, - "objectId": 0 - }, - { - "x": 434.9347816206608, - "y": 917.9004544650763, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 7 - }, - { - "x": 536.5458415570982, - "y": 625.8513533444501, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 12 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 11 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 10 - }, - { - "x": 44.9045036941519, - "y": 43.33063658390064, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 3 - }, - { - "x": 419.31374569131657, - "y": 597.1646153911681, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 4 - }, - { - "x": -60.87567937971191, - "y": 513.55431600567, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 8 - }, - { - "x": 48.59672876493574, - "y": 643.6385623778006, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 9 - }, - { - "x": 144.86073121519468, - "y": 153.39804515300116, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 5 - }, - { - "x": 90.41762439197365, - "y": 720.9900111267225, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 2 - }, - { - "x": 295.20533147248216, - "y": 681.7601858412162, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 1 - }, - { - "x": 300.1770473867072, - "y": 876.0157093991628, - "frameIndex": 40, - "frameTimestamp": 1600.0, - "objectId": 0 - }, - { - "x": 178.50321883997344, - "y": 41.887844108240884, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 6 - }, - { - "x": 434.9347816206608, - "y": 917.9004544650763, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 8 - }, - { - "x": 536.5458415570982, - "y": 625.8513533444501, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 12 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 11 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 10 - }, - { - "x": 43.113109346836595, - "y": 43.299453573485714, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 5 - }, - { - "x": 419.5999787745644, - "y": 597.1685088394966, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 4 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 7 - }, - { - "x": 49.14208508592622, - "y": 643.6457857128328, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 9 - }, - { - "x": 144.69150484219418, - "y": 156.63547263869503, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 3 - }, - { - "x": 91.19649673694288, - "y": 719.8235634086986, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 2 - }, - { - "x": 294.9437363114534, - "y": 681.756784300019, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 1 - }, - { - "x": 301.20210939160705, - "y": 876.0276557242944, - "frameIndex": 41, - "frameTimestamp": 1640.0000000000002, - "objectId": 0 - }, - { - "x": 183.8803654222735, - "y": 41.98158535199984, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 3 - }, - { - "x": 434.7418826139283, - "y": 917.8982604383527, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 8 - }, - { - "x": 536.8237300572061, - "y": 625.8550809079965, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 12 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 11 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 9 - }, - { - "x": 43.113109346836595, - "y": 43.299453573485714, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 6 - }, - { - "x": 419.5999787745644, - "y": 597.1685088394966, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 5 - }, - { - "x": -61.721508356462444, - "y": 511.732771060835, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 7 - }, - { - "x": 49.14208508592622, - "y": 643.6457857128328, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 10 - }, - { - "x": 143.44741923916507, - "y": 156.61477974375146, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 4 - }, - { - "x": 91.47589659471231, - "y": 718.6475385821414, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 2 - }, - { - "x": 295.20533147248216, - "y": 681.7601858412162, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 1 - }, - { - "x": 302.84217823843454, - "y": 876.0467694906702, - "frameIndex": 42, - "frameTimestamp": 1680.0, - "objectId": 0 - }, - { - "x": 189.84381140480258, - "y": 34.49358367720846, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 3 - }, - { - "x": 434.9347816206608, - "y": 917.9004544650763, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 8 - }, - { - "x": 536.5458415570982, - "y": 625.8513533444501, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 10 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 9 - }, - { - "x": 44.07330958552979, - "y": 47.06959608051908, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 7 - }, - { - "x": 419.8862107187276, - "y": 597.1724022723306, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 5 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 6 - }, - { - "x": 50.202665080835885, - "y": 642.2627617433457, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 12 - }, - { - "x": 142.04049060095568, - "y": 159.8169856926174, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 2 - }, - { - "x": 90.9742890470074, - "y": 718.6411536920775, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 4 - }, - { - "x": 295.52836053064283, - "y": 680.4720312095279, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 1 - }, - { - "x": 304.48220971898, - "y": 876.0658828215699, - "frameIndex": 43, - "frameTimestamp": 1720.0, - "objectId": 0 - }, - { - "x": 194.34621844322598, - "y": 34.57231259424914, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 4 - }, - { - "x": 435.51347553649066, - "y": 917.9070365099386, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 8 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 12 - }, - { - "x": 545.0606189402529, - "y": 687.5782116429568, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 10 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 9 - }, - { - "x": 44.07330958552979, - "y": 47.06959608051908, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 7 - }, - { - "x": 419.8862107187276, - "y": 597.1724022723306, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 5 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 6 - }, - { - "x": 48.837248372933054, - "y": 642.2446633454122, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 11 - }, - { - "x": 142.04049060095568, - "y": 159.8169856926174, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 2 - }, - { - "x": 90.9742890470074, - "y": 718.6411536920775, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 3 - }, - { - "x": 295.92810238490273, - "y": 683.058226701391, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 44, - "frameTimestamp": 1760.0, - "objectId": 0 - }, - { - "x": 197.63393786726192, - "y": 38.434929553930125, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 4 - }, - { - "x": 435.7063724736517, - "y": 917.9092305131231, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 8 - }, - { - "x": 535.8352507185435, - "y": 627.3032130841216, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 12 - }, - { - "x": 545.4791859183333, - "y": 686.3009242627484, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 10 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 9 - }, - { - "x": 43.62655523635322, - "y": 47.06183100203502, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 6 - }, - { - "x": 420.45867118982835, - "y": 597.1801890915166, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 5 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 7 - }, - { - "x": 48.86940744098105, - "y": 643.6421740521453, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 11 - }, - { - "x": 141.6267231037134, - "y": 159.81011275164508, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 2 - }, - { - "x": 91.00261930737933, - "y": 717.4586859848229, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 3 - }, - { - "x": 297.36741776530073, - "y": 685.6431262073462, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 1 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 45, - "frameTimestamp": 1800.0, - "objectId": 0 - }, - { - "x": 201.99966464427175, - "y": 34.70614046140908, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 2 - }, - { - "x": 435.51347553649066, - "y": 917.9070365099386, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 8 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 12 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 10 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 9 - }, - { - "x": 44.07330958552979, - "y": 47.06959608051908, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 5 - }, - { - "x": 420.7448997167792, - "y": 597.1840824778686, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 6 - }, - { - "x": -62.03269616969209, - "y": 511.72836808081365, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 7 - }, - { - "x": 49.625473070094195, - "y": 640.8538506077631, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 11 - }, - { - "x": 141.6267231037134, - "y": 159.81011275164508, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 3 - }, - { - "x": 90.50031840626687, - "y": 717.452288148352, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 4 - }, - { - "x": 298.1488055130975, - "y": 685.6532657285439, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 1 - }, - { - "x": 304.014503902078, - "y": 876.8522247262275, - "frameIndex": 46, - "frameTimestamp": 1840.0, - "objectId": 0 - }, - { - "x": 206.5013120039366, - "y": 34.78485609473608, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 1 - }, - { - "x": 436.0921647958125, - "y": 917.9136185018376, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 8 - }, - { - "x": 536.2679519824713, - "y": 625.8476257664901, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 12 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 11 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 9 - }, - { - "x": 44.07330958552979, - "y": 47.06959608051908, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 5 - }, - { - "x": 421.2962615884879, - "y": 595.6401100846196, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 6 - }, - { - "x": -62.343885324800716, - "y": 511.7239650818063, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 7 - }, - { - "x": 45.193077316723176, - "y": 617.7895266121623, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 13 - }, - { - "x": 140.288596070707, - "y": 153.32189396773646, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 3 - }, - { - "x": 91.50491670862161, - "y": 717.4650837767155, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 4 - }, - { - "x": 298.604156745135, - "y": 686.9367622694689, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 2 - }, - { - "x": 304.48220971898, - "y": 876.0658828215699, - "frameIndex": 47, - "frameTimestamp": 1880.0000000000002, - "objectId": 0 - }, - { - "x": 212.6503086800437, - "y": 46.25060738305466, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 2 - }, - { - "x": 435.8992688934249, - "y": 917.9114245104228, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 10 - }, - { - "x": 535.8352507185435, - "y": 627.3032130841216, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 8 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 9 - }, - { - "x": 43.62655523635322, - "y": 47.06183100203502, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 5 - }, - { - "x": 421.03112710467286, - "y": 597.1879758487266, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 6 - }, - { - "x": -63.50539872259916, - "y": 509.8917540090768, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 7 - }, - { - "x": 139.45726760521725, - "y": 153.3080477785949, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 3 - }, - { - "x": 90.75146929430917, - "y": 717.4554870721598, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 4 - }, - { - "x": 299.12432964418593, - "y": 686.9435075726844, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 48, - "frameTimestamp": 1920.0, - "objectId": 0 - }, - { - "x": 218.09673567245522, - "y": 50.0943132749425, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 1 - }, - { - "x": 435.7063724736517, - "y": 917.9092305131231, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 11 - }, - { - "x": 535.8352507185435, - "y": 627.3032130841216, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 12 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 9 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 10 - }, - { - "x": 42.733038234766724, - "y": 47.04630070074754, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 5 - }, - { - "x": 421.00958373052447, - "y": 595.6362074943595, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 6 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 7 - }, - { - "x": 138.10304344180582, - "y": 146.76020461342756, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 4 - }, - { - "x": 91.25376844548201, - "y": 717.4618848863414, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 3 - }, - { - "x": 299.4510995780665, - "y": 685.6701646859626, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 2 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 49, - "frameTimestamp": 1960.0, - "objectId": 0 - }, - { - "x": 49.41924872515981, - "y": 605.9151100675941, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 7 - }, - { - "x": 223.44464325944463, - "y": 50.18726574919426, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 1 - }, - { - "x": 435.7063724736517, - "y": 917.9092305131231, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 12 - }, - { - "x": 537.7774921879513, - "y": 627.3292463346346, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 11 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 9 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 10 - }, - { - "x": 42.28627558230537, - "y": 47.038535477943334, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 5 - }, - { - "x": 420.7229047299136, - "y": 595.6323048885445, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 6 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 8 - }, - { - "x": 136.85030086992808, - "y": 146.7392828473783, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 4 - }, - { - "x": 90.75146929430917, - "y": 717.4554870721598, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 3 - }, - { - "x": 300.02964245592034, - "y": 689.4994765581772, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 2 - }, - { - "x": 304.48220971898, - "y": 876.0658828215699, - "frameIndex": 50, - "frameTimestamp": 2000.0, - "objectId": 0 - }, - { - "x": 49.70293442712654, - "y": 605.918941756124, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 8 - }, - { - "x": 228.4061170904336, - "y": 54.003842624014084, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 1 - }, - { - "x": 435.8992688934249, - "y": 917.9114245104228, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 12 - }, - { - "x": 537.5000323345647, - "y": 627.3255273419223, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 11 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 7 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 10 - }, - { - "x": 42.733038234766724, - "y": 47.04630070074754, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 5 - }, - { - "x": 420.45867118982835, - "y": 597.1801890915166, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 6 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 9 - }, - { - "x": 135.32853572657515, - "y": 143.42870706129847, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 3 - }, - { - "x": 90.72348396430874, - "y": 718.6379612303855, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 4 - }, - { - "x": 299.83734562272446, - "y": 688.2266849042933, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 2 - }, - { - "x": 304.0722053518628, - "y": 876.0611045296702, - "frameIndex": 51, - "frameTimestamp": 2040.0, - "objectId": 0 - }, - { - "x": 49.38664459958623, - "y": 604.4023979689084, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 10 - }, - { - "x": 229.73967863116815, - "y": 54.026986843903366, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 1 - }, - { - "x": 537.5000323345647, - "y": 627.3255273419223, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 7 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 9 - }, - { - "x": 42.665253806691275, - "y": 43.29165769984473, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 5 - }, - { - "x": 420.45867118982835, - "y": 597.1801890915166, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 6 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 8 - }, - { - "x": 134.6153871200405, - "y": 149.97213160662324, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 2 - }, - { - "x": 91.47589659471231, - "y": 718.6475385821414, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 4 - }, - { - "x": 299.90458194506573, - "y": 686.9536254361174, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 3 - }, - { - "x": 304.0722053518628, - "y": 876.0611045296702, - "frameIndex": 52, - "frameTimestamp": 2080.0, - "objectId": 0 - }, - { - "x": 49.38664459958623, - "y": 604.4023979689084, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 7 - }, - { - "x": 229.29516086122337, - "y": 54.019272151556606, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 4 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 8 - }, - { - "x": 429.0650819368986, - "y": 61.19333129870879, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 10 - }, - { - "x": 42.217395485167565, - "y": 43.28386177778809, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 5 - }, - { - "x": 420.17244152381335, - "y": 597.1762956896705, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 6 - }, - { - "x": -62.203634548417554, - "y": 515.3390023521403, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 9 - }, - { - "x": 134.59231214910812, - "y": 159.6932667171262, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 1 - }, - { - "x": 92.47910121947962, - "y": 718.66030822899, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 2 - }, - { - "x": 299.38441468416704, - "y": 686.9468802060142, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 3 - }, - { - "x": 304.8922117507844, - "y": 876.0706610862538, - "frameIndex": 53, - "frameTimestamp": 2120.0, - "objectId": 0 - }, - { - "x": 49.9548976426415, - "y": 604.4100792126867, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 7 - }, - { - "x": 231.9113515698103, - "y": 50.33442638602559, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 1 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 8 - }, - { - "x": 428.637593503452, - "y": 64.87494836358262, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 9 - }, - { - "x": 40.87380383206692, - "y": 43.26047372111886, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 5 - }, - { - "x": 420.17244152381335, - "y": 597.1762956896705, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 6 - }, - { - "x": -62.203634548417554, - "y": 515.3390023521403, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 10 - }, - { - "x": 133.35087423096178, - "y": 159.67264564469048, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 2 - }, - { - "x": 92.47910121947962, - "y": 718.66030822899, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 4 - }, - { - "x": 298.9963148003735, - "y": 684.3830178101109, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 3 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 54, - "frameTimestamp": 2160.0, - "objectId": 0 - }, - { - "x": 50.23902248491787, - "y": 604.4139198118769, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 6 - }, - { - "x": 233.64693605944154, - "y": 46.61609812563223, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 1 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 8 - }, - { - "x": 429.0787294235475, - "y": 64.88258168094592, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 10 - }, - { - "x": 40.87380383206692, - "y": 43.26047372111886, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 5 - }, - { - "x": 420.45867118982835, - "y": 597.1801890915166, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 7 - }, - { - "x": -62.203634548417554, - "y": 515.3390023521403, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 9 - }, - { - "x": 131.28176351124154, - "y": 159.63827640124708, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 3 - }, - { - "x": 92.69923983341796, - "y": 719.8426793141592, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 4 - }, - { - "x": 298.6697259662633, - "y": 685.6600253481976, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 2 - }, - { - "x": 304.42404735549593, - "y": 876.8569953940993, - "frameIndex": 55, - "frameTimestamp": 2200.0, - "objectId": 0 - }, - { - "x": 50.2076450142804, - "y": 602.89652080997, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 6 - }, - { - "x": 237.22022053206564, - "y": 46.6782987053607, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 1 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 8 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 9 - }, - { - "x": 40.87380383206692, - "y": 43.26047372111886, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 5 - }, - { - "x": 420.7448997167792, - "y": 597.1840824778686, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 7 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 10 - }, - { - "x": 130.45410258989247, - "y": 159.6245284275773, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 4 - }, - { - "x": 92.69923983341796, - "y": 719.8426793141592, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 3 - }, - { - "x": 298.2790142975206, - "y": 683.0887747407664, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 2 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 56, - "frameTimestamp": 2240.0, - "objectId": 0 - }, - { - "x": 49.85913858856495, - "y": 599.8436255762156, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 7 - }, - { - "x": 241.63199958498072, - "y": 39.20311593578766, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 1 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 8 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 9 - }, - { - "x": 40.87380383206692, - "y": 43.26047372111886, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 5 - }, - { - "x": 421.03112710467286, - "y": 597.1879758487266, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 6 - }, - { - "x": -63.89985122883322, - "y": 511.701949801972, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 11 - }, - { - "x": 129.2125933857919, - "y": 159.60390617103673, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 4 - }, - { - "x": 93.20014723772587, - "y": 719.849051194095, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 2 - }, - { - "x": 298.5416861358571, - "y": 677.9153944258975, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 3 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 57, - "frameTimestamp": 2280.0000000000005, - "objectId": 0 - }, - { - "x": 51.00096076283342, - "y": 599.859096066181, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 7 - }, - { - "x": 246.13641147008795, - "y": 43.06691176047993, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 1 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 11 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 8 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 9 - }, - { - "x": 40.94597101794025, - "y": 47.01523952088299, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 6 - }, - { - "x": 421.3173533535161, - "y": 597.1918692040908, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 5 - }, - { - "x": -62.51376939870938, - "y": 515.3346220339926, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 10 - }, - { - "x": 127.81766205185868, - "y": 153.1141843579193, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 4 - }, - { - "x": 93.45059963467831, - "y": 719.8522371174598, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 2 - }, - { - "x": 298.1472101023483, - "y": 675.2993723538087, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 3 - }, - { - "x": 304.2192759200463, - "y": 876.8546100635563, - "frameIndex": 58, - "frameTimestamp": 2320.0, - "objectId": 0 - }, - { - "x": 52.14276485717586, - "y": 599.8745663111824, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 7 - }, - { - "x": 248.36402550735676, - "y": 39.32065408256003, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 1 - }, - { - "x": 535.0028454487313, - "y": 627.2920557613796, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 11 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 8 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 10 - }, - { - "x": 40.499197294072424, - "y": 47.00747410564565, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 6 - }, - { - "x": 421.60357846331584, - "y": 597.1957625439615, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 5 - }, - { - "x": -62.82390558181012, - "y": 515.3302416970204, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 9 - }, - { - "x": 128.7987522317894, - "y": 159.59703200657893, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 4 - }, - { - "x": 93.45059963467831, - "y": 719.8522371174598, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 3 - }, - { - "x": 297.02924386429544, - "y": 676.5921227677962, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 2 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 59, - "frameTimestamp": 2360.0, - "objectId": 0 - }, - { - "x": 50.684728092835115, - "y": 598.3235735121333, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 8 - }, - { - "x": 251.9541820164657, - "y": 39.38333660154759, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 5 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 7 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 11 - }, - { - "x": 39.97806215596605, - "y": 43.244881441252176, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 6 - }, - { - "x": 421.03112710467286, - "y": 597.1879758487266, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 4 - }, - { - "x": -62.51376939870938, - "y": 515.3346220339926, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 9 - }, - { - "x": 128.7987522317894, - "y": 159.59703200657893, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 3 - }, - { - "x": 92.94969397064064, - "y": 719.8458652596614, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 2 - }, - { - "x": 296.6393537675202, - "y": 679.1904176658821, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 1 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 60, - "frameTimestamp": 2400.0, - "objectId": 0 - }, - { - "x": 47.82565823306553, - "y": 598.2848057656221, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 7 - }, - { - "x": 254.64668193849192, - "y": 39.43034643999285, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 4 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 8 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 11 - }, - { - "x": 39.53018714562776, - "y": 43.23708522869127, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 6 - }, - { - "x": 420.45867118982835, - "y": 597.1801890915166, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 5 - }, - { - "x": -62.203634548417554, - "y": 515.3390023521403, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 9 - }, - { - "x": 128.3849087014349, - "y": 159.59015780264835, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 3 - }, - { - "x": 93.45059963467831, - "y": 719.8522371174598, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 2 - }, - { - "x": 296.0522985309299, - "y": 680.478848717041, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 1 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 61, - "frameTimestamp": 2440.0, - "objectId": 0 - }, - { - "x": 259.11830062394625, - "y": 43.293228528490296, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 3 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 8 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 11 - }, - { - "x": 40.05242080228867, - "y": 46.99970864229878, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 6 - }, - { - "x": 419.8862107187276, - "y": 597.1724022723306, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 5 - }, - { - "x": -62.203634548417554, - "y": 515.3390023521403, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 9 - }, - { - "x": 127.55721451158806, - "y": 159.5764092763677, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 4 - }, - { - "x": 93.95150181820267, - "y": 719.8586089309837, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 2 - }, - { - "x": 295.92810238490273, - "y": 683.058226701391, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 1 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 62, - "frameTimestamp": 2480.0, - "objectId": 0 - }, - { - "x": 265.86434803874744, - "y": 39.626201848118015, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 4 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 8 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 11 - }, - { - "x": 39.605641542563276, - "y": 46.99194313084219, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 5 - }, - { - "x": 419.31374569131657, - "y": 597.1646153911681, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 6 - }, - { - "x": -62.203634548417554, - "y": 515.3390023521403, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 9 - }, - { - "x": 127.55721451158806, - "y": 159.5764092763677, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 3 - }, - { - "x": 93.95150181820267, - "y": 719.8586089309837, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 2 - }, - { - "x": 295.80461682422833, - "y": 685.6228468347624, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 1 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 63, - "frameTimestamp": 2520.0, - "objectId": 0 - }, - { - "x": 270.75524622099215, - "y": 43.49609853345053, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 1 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 8 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 11 - }, - { - "x": 39.53018714562776, - "y": 43.23708522869127, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 6 - }, - { - "x": 419.02751146897754, - "y": 597.1607219273452, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 5 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 9 - }, - { - "x": 126.72951081608767, - "y": 159.56266059219215, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 4 - }, - { - "x": 93.95150181820267, - "y": 719.8586089309837, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 3 - }, - { - "x": 296.0650860038373, - "y": 685.6262267607664, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 2 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 64, - "frameTimestamp": 2560.0, - "objectId": 0 - }, - { - "x": 275.28583715814466, - "y": 39.79069681348198, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 3 - }, - { - "x": 535.9900613333194, - "y": 625.8438981741165, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 9 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 11 - }, - { - "x": 40.05242080228867, - "y": 46.99970864229878, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 5 - }, - { - "x": 419.02751146897754, - "y": 597.1607219273452, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 7 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 8 - }, - { - "x": 125.19836252432589, - "y": 156.31124290312064, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 2 - }, - { - "x": 92.4487848260534, - "y": 719.839493357588, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 6 - }, - { - "x": 295.6818357679067, - "y": 688.1728354109124, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 1 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 65, - "frameTimestamp": 2600.0, - "objectId": 0 - }, - { - "x": 277.9155087888873, - "y": 43.620925318155415, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 4 - }, - { - "x": 535.9900613333194, - "y": 625.8438981741165, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 9 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 8 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 11 - }, - { - "x": 39.605641542563276, - "y": 46.99194313084219, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 5 - }, - { - "x": 419.02751146897754, - "y": 597.1607219273452, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 6 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 7 - }, - { - "x": 124.24634269402785, - "y": 159.52141359226866, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 2 - }, - { - "x": 91.19649673694288, - "y": 719.8235634086986, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 3 - }, - { - "x": 296.13941978778087, - "y": 689.4490991339494, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 66, - "frameTimestamp": 2640.0, - "objectId": 0 - }, - { - "x": 279.2579787469495, - "y": 43.644328958292704, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 3 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 8 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 11 - }, - { - "x": 40.05242080228867, - "y": 46.99970864229878, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 6 - }, - { - "x": 419.02751146897754, - "y": 597.1607219273452, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 5 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 7 - }, - { - "x": 36.10086840577268, - "y": 546.456695042609, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 9 - }, - { - "x": 122.82868415270788, - "y": 153.03109044921496, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 4 - }, - { - "x": 92.1983289485424, - "y": 719.8363073899482, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 2 - }, - { - "x": 297.05067880823026, - "y": 691.9907237964759, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 1 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 67, - "frameTimestamp": 2680.0, - "objectId": 0 - }, - { - "x": 279.70546317026924, - "y": 43.6521300746957, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 1 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 9 - }, - { - "x": 429.94949290505957, - "y": 61.20865763041036, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 11 - }, - { - "x": 40.05242080228867, - "y": 46.99970864229878, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 6 - }, - { - "x": 419.02751146897754, - "y": 597.1607219273452, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 5 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 8 - }, - { - "x": 37.35942121786968, - "y": 548.1711951996131, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 7 - }, - { - "x": 120.83770085899287, - "y": 126.53017601619108, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 4 - }, - { - "x": 92.4487848260534, - "y": 719.839493357588, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 3 - }, - { - "x": 297.05067880823026, - "y": 691.9907237964759, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 2 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 68, - "frameTimestamp": 2720.0, - "objectId": 0 - }, - { - "x": 278.8104915422967, - "y": 43.63652779340199, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 1 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 8 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 11 - }, - { - "x": 39.53018714562776, - "y": 43.23708522869127, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 4 - }, - { - "x": 419.02751146897754, - "y": 597.1607219273452, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 5 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 7 - }, - { - "x": 36.345817192390435, - "y": 544.7575069232723, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 9 - }, - { - "x": 118.33981687028556, - "y": 99.0185298663811, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 6 - }, - { - "x": 92.1983289485424, - "y": 719.8363073899482, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 3 - }, - { - "x": 297.11366622253433, - "y": 690.7284264053378, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 2 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 69, - "frameTimestamp": 2760.0000000000005, - "objectId": 0 - }, - { - "x": 277.97746476354166, - "y": 39.837691421670975, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 2 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 8 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 11 - }, - { - "x": 39.08230935372968, - "y": 43.229288967711554, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 4 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 6 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 7 - }, - { - "x": 35.07127692235841, - "y": 551.5167034480847, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 9 - }, - { - "x": 116.50932871193876, - "y": 88.41628145530836, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 5 - }, - { - "x": 92.1983289485424, - "y": 719.8363073899482, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 3 - }, - { - "x": 297.11366622253433, - "y": 690.7284264053378, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 1 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 70, - "frameTimestamp": 2800.0000000000005, - "objectId": 0 - }, - { - "x": 280.6689917442998, - "y": 39.88468427299888, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 1 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 12 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 8 - }, - { - "x": 429.50728878043816, - "y": 61.20099448811827, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 11 - }, - { - "x": 37.65842925647665, - "y": 39.432458979631896, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 4 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 5 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 9 - }, - { - "x": 32.97432520016711, - "y": 551.4875922730412, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 7 - }, - { - "x": 115.09019974893616, - "y": 77.66869454176565, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 6 - }, - { - "x": 92.1983289485424, - "y": 719.8363073899482, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 3 - }, - { - "x": 296.5334469208569, - "y": 691.9840348596159, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 2 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 71, - "frameTimestamp": 2840.0, - "objectId": 0 - }, - { - "x": 283.3604181060612, - "y": 39.93167536756445, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 1 - }, - { - "x": 535.9900613333194, - "y": 625.8438981741165, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 12 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 7 - }, - { - "x": 429.0787294235475, - "y": 64.88258168094592, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 11 - }, - { - "x": 37.2907703700213, - "y": 43.198103439594064, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 4 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 6 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 9 - }, - { - "x": 30.918029166729994, - "y": 544.6819000008531, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 8 - }, - { - "x": 110.45640847989229, - "y": 36.91284907436252, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 5 - }, - { - "x": 92.4487848260534, - "y": 719.839493357588, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 3 - }, - { - "x": 295.5597532041264, - "y": 690.7083172866453, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 2 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 72, - "frameTimestamp": 2880.0, - "objectId": 0 - }, - { - "x": 202.30906969004815, - "y": 915.2545775513723, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 9 - }, - { - "x": 286.58359029077644, - "y": 36.185171745869425, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 3 - }, - { - "x": 535.9900613333194, - "y": 625.8438981741165, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 10 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 7 - }, - { - "x": 428.19645487757475, - "y": 64.86731499939897, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 11 - }, - { - "x": 36.84287866993559, - "y": 43.1903069365129, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 5 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 4 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 8 - }, - { - "x": 37.00397262098332, - "y": 546.4692642635246, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 12 - }, - { - "x": 107.04354945471191, - "y": -10.112888756484699, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 6 - }, - { - "x": 92.4487848260534, - "y": 719.839493357588, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 2 - }, - { - "x": 294.64292082171914, - "y": 688.1593725518474, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 73, - "frameTimestamp": 2920.0, - "objectId": 0 - }, - { - "x": 203.4701995612324, - "y": 915.2677842029265, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 6 - }, - { - "x": 289.64002168576656, - "y": 40.04131442358335, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 4 - }, - { - "x": 535.9900613333194, - "y": 625.8438981741165, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 11 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 5 - }, - { - "x": 428.19645487757475, - "y": 64.86731499939897, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 10 - }, - { - "x": 36.311450493903166, - "y": 39.40897673629178, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 8 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 3 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 7 - }, - { - "x": 39.00777354543171, - "y": 543.0863919272472, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 9 - }, - { - "x": 92.69923983341796, - "y": 719.8426793141592, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 2 - }, - { - "x": 293.60399088188933, - "y": 688.1459094984863, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 74, - "frameTimestamp": 2960.0, - "objectId": 0 - }, - { - "x": 204.24427574403606, - "y": 915.2765885190292, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 7 - }, - { - "x": 292.4288075220119, - "y": 36.28738099051476, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 4 - }, - { - "x": 535.9900613333194, - "y": 625.8438981741165, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 11 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 5 - }, - { - "x": 428.19645487757475, - "y": 64.86731499939897, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 10 - }, - { - "x": 35.051284052180975, - "y": 43.15912043996707, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 8 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 3 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 6 - }, - { - "x": 42.16783979223871, - "y": 548.238061218225, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 9 - }, - { - "x": 92.94969397064064, - "y": 719.8458652596614, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 2 - }, - { - "x": 291.9338257129336, - "y": 690.6613943215715, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 75, - "frameTimestamp": 3000.0, - "objectId": 0 - }, - { - "x": 204.8248274222917, - "y": 915.2831916940181, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 4 - }, - { - "x": 293.47607402633224, - "y": 47.6575509107947, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 3 - }, - { - "x": 535.9900613333194, - "y": 625.8438981741165, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 8 - }, - { - "x": 428.19645487757475, - "y": 64.86731499939897, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 11 - }, - { - "x": 35.41345067505447, - "y": 39.39332166373141, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 9 - }, - { - "x": 418.74127610754067, - "y": 597.156828448028, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 5 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 6 - }, - { - "x": 45.33772847463859, - "y": 555.014239847747, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 7 - }, - { - "x": 92.69923983341796, - "y": 719.8426793141592, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 2 - }, - { - "x": 290.897812884454, - "y": 690.6479873260137, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 76, - "frameTimestamp": 3040.0, - "objectId": 0 - }, - { - "x": 205.59888904827704, - "y": 915.291995844552, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 5 - }, - { - "x": 294.9182788549699, - "y": 43.917339185426336, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 3 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 6 - }, - { - "x": 428.19645487757475, - "y": 64.86731499939897, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 10 - }, - { - "x": 36.84287866993559, - "y": 43.1903069365129, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 11 - }, - { - "x": 418.45503960699887, - "y": 597.1529349532165, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 4 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 8 - }, - { - "x": 48.50183059094025, - "y": 563.3502663008925, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 9 - }, - { - "x": 119.17715967212123, - "y": 59.52011418385439, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 7 - }, - { - "x": 93.20014723772587, - "y": 719.849051194095, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 2 - }, - { - "x": 289.60277588218617, - "y": 690.631228310238, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 77, - "frameTimestamp": 3080.0, - "objectId": 0 - }, - { - "x": 205.792403155081, - "y": 915.2941968674029, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 5 - }, - { - "x": 294.9182788549699, - "y": 43.917339185426336, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 2 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 6 - }, - { - "x": 428.637593503452, - "y": 64.87494836358262, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 10 - }, - { - "x": 36.7604462101615, - "y": 39.41680419947149, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 11 - }, - { - "x": 418.16880196734536, - "y": 597.1490414429101, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 4 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 7 - }, - { - "x": 50.37572661970766, - "y": 568.2871634970261, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 9 - }, - { - "x": 120.7807111695653, - "y": 77.76644267464522, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 8 - }, - { - "x": 91.69741458306277, - "y": 719.8299354214613, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 3 - }, - { - "x": 289.1364891658896, - "y": 689.3584129093113, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 78, - "frameTimestamp": 3120.0, - "objectId": 0 - }, - { - "x": 205.792403155081, - "y": 915.2941968674029, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 4 - }, - { - "x": 295.36566594795937, - "y": 43.9251386050436, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 3 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 6 - }, - { - "x": 428.637593503452, - "y": 64.87494836358262, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 9 - }, - { - "x": 37.73865928841765, - "y": 43.20589989425403, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 7 - }, - { - "x": 418.4294315888973, - "y": 595.6010834820304, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 5 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 8 - }, - { - "x": 48.054381655018865, - "y": 569.8816953051022, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 10 - }, - { - "x": 117.2669212742013, - "y": 91.96965504774, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 11 - }, - { - "x": 92.1983289485424, - "y": 719.8363073899482, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 2 - }, - { - "x": 288.5667295066449, - "y": 690.6178208805492, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 79, - "frameTimestamp": 3160.0, - "objectId": 0 - }, - { - "x": 206.3236236860312, - "y": 914.59461162904, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 4 - }, - { - "x": 295.8130502605487, - "y": 43.93293797618928, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 3 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 6 - }, - { - "x": 429.0787294235475, - "y": 64.88258168094592, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 9 - }, - { - "x": 38.26528715548005, - "y": 46.96864630780872, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 10 - }, - { - "x": 418.14274230415145, - "y": 595.5971807362157, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 5 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 7 - }, - { - "x": 47.829189325051004, - "y": 585.8599583096177, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 8 - }, - { - "x": 114.66541939299957, - "y": 91.92522544770804, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 11 - }, - { - "x": 93.91921036490746, - "y": 721.0345250921167, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 2 - }, - { - "x": 289.0331669053072, - "y": 691.8870398740382, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 80, - "frameTimestamp": 3200.0, - "objectId": 0 - }, - { - "x": 206.5173415101946, - "y": 914.5968159177976, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 4 - }, - { - "x": 295.4705917251762, - "y": 40.14311355581508, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 3 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 7 - }, - { - "x": 429.0787294235475, - "y": 64.88258168094592, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 9 - }, - { - "x": 37.2907703700213, - "y": 43.198103439594064, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 11 - }, - { - "x": 418.9780239160442, - "y": 594.0521515978631, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 5 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 8 - }, - { - "x": 46.39608079321692, - "y": 598.2654213159499, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 6 - }, - { - "x": 113.79823123300811, - "y": 91.91041522466755, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 10 - }, - { - "x": 94.13677195954625, - "y": 722.2103972117663, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 2 - }, - { - "x": 289.4481211796541, - "y": 688.0920553419946, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 1 - }, - { - "x": 304.6872110267951, - "y": 876.0682719573139, - "frameIndex": 81, - "frameTimestamp": 3240.0, - "objectId": 0 - }, - { - "x": 207.14698734638927, - "y": 915.3096038617963, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 3 - }, - { - "x": 295.022103102922, - "y": 40.13528314605187, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 2 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 7 - }, - { - "x": 429.5198626378859, - "y": 64.8902149514894, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 8 - }, - { - "x": 36.39498418813461, - "y": 43.18251038500997, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 11 - }, - { - "x": 419.528348334544, - "y": 592.4983292123351, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 5 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 10 - }, - { - "x": 45.29166908364203, - "y": 599.7817411665978, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 6 - }, - { - "x": 112.59770618569078, - "y": 88.349380965373, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 9 - }, - { - "x": 94.38653579709043, - "y": 722.2135703061496, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 4 - }, - { - "x": 289.91986756268244, - "y": 682.9801549570001, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 1 - }, - { - "x": 304.6288182084296, - "y": 876.8593807178567, - "frameIndex": 82, - "frameTimestamp": 3280.0000000000005, - "objectId": 0 - }, - { - "x": 207.53400672229458, - "y": 915.3140058069785, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 4 - }, - { - "x": 294.5736116865316, - "y": 40.12745268750442, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 2 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 8 - }, - { - "x": 429.0923108038998, - "y": 68.5539619097932, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 7 - }, - { - "x": 36.031307815774234, - "y": 46.92981730718075, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 9 - }, - { - "x": 420.10352941377755, - "y": 592.5061717078531, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 5 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 10 - }, - { - "x": 42.72234034930617, - "y": 599.7469294636041, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 3 - }, - { - "x": 111.29378483557066, - "y": 88.32707999523217, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 11 - }, - { - "x": 95.10200132459916, - "y": 723.3925527862576, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 6 - }, - { - "x": 290.4964731262685, - "y": 681.6989562083984, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 1 - }, - { - "x": 304.8922117507844, - "y": 876.0706610862538, - "frameIndex": 83, - "frameTimestamp": 3320.0000000000005, - "objectId": 0 - }, - { - "x": 207.92102401878432, - "y": 915.3184077285094, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 4 - }, - { - "x": 294.5736116865316, - "y": 40.12745268750442, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 2 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 8 - }, - { - "x": 429.0923108038998, - "y": 68.5539619097932, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 7 - }, - { - "x": 36.84287866993559, - "y": 43.1903069365129, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 10 - }, - { - "x": 420.3911182285206, - "y": 592.5100929320939, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 6 - }, - { - "x": -63.27746084148766, - "y": 511.7107559708654, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 11 - }, - { - "x": 44.27230480059683, - "y": 614.8218105484749, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 3 - }, - { - "x": 111.7284279065146, - "y": 88.33451369677105, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 9 - }, - { - "x": 95.60083896100593, - "y": 723.3988861607518, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 5 - }, - { - "x": 290.38836729726575, - "y": 684.2712419031116, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 1 - }, - { - "x": 304.2772078273367, - "y": 876.063493679022, - "frameIndex": 84, - "frameTimestamp": 3360.0, - "objectId": 0 - }, - { - "x": 208.30803923587513, - "y": 915.3228096263894, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 3 - }, - { - "x": 294.1251174759785, - "y": 40.11962218017203, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 2 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 9 - }, - { - "x": 429.0923108038998, - "y": 68.5539619097932, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 7 - }, - { - "x": 37.37170372391138, - "y": 46.9531148518956, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 10 - }, - { - "x": 420.4137070451502, - "y": 594.071711308933, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 6 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 11 - }, - { - "x": 44.990753974361375, - "y": 620.7240734931286, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 4 - }, - { - "x": 112.59770618569078, - "y": 88.349380965373, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 8 - }, - { - "x": 95.06827280743555, - "y": 724.5588253136276, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 5 - }, - { - "x": 290.952129185472, - "y": 689.3819249998301, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 1 - }, - { - "x": 303.6621986494128, - "y": 876.0563262105538, - "frameIndex": 85, - "frameTimestamp": 3400.0, - "objectId": 0 - }, - { - "x": 208.30803923587513, - "y": 915.3228096263894, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 5 - }, - { - "x": 293.676620471237, - "y": 40.11179162405448, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 3 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 9 - }, - { - "x": 429.53237558971597, - "y": 68.56156546106423, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 8 - }, - { - "x": 36.84287866993559, - "y": 43.1903069365129, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 10 - }, - { - "x": 420.7229047299136, - "y": 595.6323048885445, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 7 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 11 - }, - { - "x": 43.51172934369561, - "y": 617.7669560616561, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 2 - }, - { - "x": 108.68587136943383, - "y": 88.28247684464107, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 4 - }, - { - "x": 95.78085296812301, - "y": 725.7313822507525, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 6 - }, - { - "x": 292.5083556135897, - "y": 689.4020777483105, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 1 - }, - { - "x": 303.4571944224317, - "y": 876.0539370407894, - "frameIndex": 86, - "frameTimestamp": 3440.0, - "objectId": 0 - }, - { - "x": 208.50154606465128, - "y": 915.3250105664602, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 4 - }, - { - "x": 292.6813016831165, - "y": 43.87834136025264, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 3 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 9 - }, - { - "x": 429.53237558971597, - "y": 68.56156546106423, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 7 - }, - { - "x": 36.84287866993559, - "y": 43.1903069365129, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 10 - }, - { - "x": 421.00958373052447, - "y": 595.6362074943595, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 8 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 11 - }, - { - "x": 41.358916002896066, - "y": 620.6753933731626, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 1 - }, - { - "x": 106.94720997077185, - "y": 88.25274051435312, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 5 - }, - { - "x": 96.45600841498806, - "y": 728.0574773074655, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 6 - }, - { - "x": 293.74681228750603, - "y": 690.684856099537, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 2 - }, - { - "x": 303.51433300519864, - "y": 875.2610220214499, - "frameIndex": 87, - "frameTimestamp": 3480.0, - "objectId": 0 - }, - { - "x": 208.50154606465128, - "y": 915.3250105664602, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 4 - }, - { - "x": 290.35190171853503, - "y": 47.60316807891966, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 2 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 12 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 10 - }, - { - "x": 429.53237558971597, - "y": 68.56156546106423, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 7 - }, - { - "x": 38.78934173246944, - "y": 50.713006611172645, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 9 - }, - { - "x": 421.27510316725466, - "y": 594.0834469481722, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 8 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 11 - }, - { - "x": 40.33330133990218, - "y": 623.5810909245147, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 3 - }, - { - "x": 106.5125380682344, - "y": 88.2453063197074, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 6 - }, - { - "x": 96.95212534115534, - "y": 728.063760145778, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 5 - }, - { - "x": 294.604257007806, - "y": 694.4746179687648, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 1 - }, - { - "x": 302.74972783314604, - "y": 874.4567302005639, - "frameIndex": 88, - "frameTimestamp": 3520.0, - "objectId": 0 - }, - { - "x": -63.91932539466368, - "y": 423.36931433601643, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 13 - }, - { - "x": 208.50154606465128, - "y": 915.3250105664602, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 5 - }, - { - "x": 289.8147695497326, - "y": 51.34085102619031, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 2 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 12 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 10 - }, - { - "x": 429.9609931464925, - "y": 64.89784817521361, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 8 - }, - { - "x": 37.45224210533051, - "y": 50.689800987105606, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 9 - }, - { - "x": 420.9879722728172, - "y": 594.0795350840424, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 6 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 11 - }, - { - "x": 41.15770907580594, - "y": 632.2445536195218, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 3 - }, - { - "x": 106.16306355942832, - "y": 84.68173581509402, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 7 - }, - { - "x": 96.24308972722764, - "y": 726.8975889261025, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 4 - }, - { - "x": 295.51472353573365, - "y": 696.9876784811806, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 1 - }, - { - "x": 299.9796603441138, - "y": 872.8282334224465, - "frameIndex": 89, - "frameTimestamp": 3560.0, - "objectId": 0 - }, - { - "x": 208.30803923587513, - "y": 915.3228096263894, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 5 - }, - { - "x": 289.8147695497326, - "y": 51.34085102619031, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 2 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 12 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 9 - }, - { - "x": 430.3916943107879, - "y": 61.21632072558571, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 6 - }, - { - "x": 37.37170372391138, - "y": 46.9531148518956, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 10 - }, - { - "x": 421.5829383038105, - "y": 595.644012659325, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 7 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 11 - }, - { - "x": 42.2408162826994, - "y": 640.7558963166241, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 3 - }, - { - "x": 105.29163238878597, - "y": 84.66681022094596, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 8 - }, - { - "x": 96.49148688603664, - "y": 726.9007366282339, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 4 - }, - { - "x": 296.40947183598644, - "y": 694.4979317947541, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 1 - }, - { - "x": 294.8309216433227, - "y": 872.7681148433882, - "frameIndex": 90, - "frameTimestamp": 3600.0, - "objectId": 0 - }, - { - "x": 208.11453188725352, - "y": 915.3206086804058, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 5 - }, - { - "x": 289.90558032076206, - "y": 47.595398910274064, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 3 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 12 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 10 - }, - { - "x": 431.26776909578894, - "y": 57.524546046923014, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 7 - }, - { - "x": 37.37170372391138, - "y": 46.9531148518956, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 9 - }, - { - "x": 422.15628830656146, - "y": 595.6518177620709, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 6 - }, - { - "x": -62.65507582179709, - "y": 511.71956206381253, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 11 - }, - { - "x": 42.408352682668514, - "y": 646.3384141980634, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 4 - }, - { - "x": 104.85591285278808, - "y": 84.65934735620594, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 8 - }, - { - "x": 97.20018252384946, - "y": 728.0669015487193, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 2 - }, - { - "x": 295.8937007900694, - "y": 694.4912707612707, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 1 - }, - { - "x": 289.26987019691194, - "y": 872.7031819480798, - "frameIndex": 91, - "frameTimestamp": 3640.0, - "objectId": 0 - }, - { - "x": 207.92102401878432, - "y": 915.3184077285094, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 4 - }, - { - "x": 289.8147695497326, - "y": 51.34085102619031, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 2 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 12 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 10 - }, - { - "x": 432.1481180446155, - "y": 53.814760063685455, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 8 - }, - { - "x": 38.71207471918472, - "y": 46.97641196359754, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 9 - }, - { - "x": 421.9099274911292, - "y": 598.7465157162425, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 6 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 11 - }, - { - "x": 44.42598804656558, - "y": 660.0292309339709, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 5 - }, - { - "x": 104.7738242458852, - "y": 88.21556909281699, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 7 - }, - { - "x": 98.61179059327023, - "y": 730.3897150728908, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 1 - }, - { - "x": 295.19763736726105, - "y": 698.2289501506517, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 3 - }, - { - "x": 283.7785532262276, - "y": 871.0354600534534, - "frameIndex": 92, - "frameTimestamp": 3680.0, - "objectId": 0 - }, - { - "x": 207.7275156304653, - "y": 915.3162067707002, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 4 - }, - { - "x": 289.9968373182761, - "y": 43.8315423703916, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 5 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 12 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 9 - }, - { - "x": 431.711041146521, - "y": 57.53223911957057, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 8 - }, - { - "x": 38.6344287802459, - "y": 43.22149265831233, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 10 - }, - { - "x": 423.60712233926296, - "y": 597.2230154892402, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 7 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 11 - }, - { - "x": 43.92898704160406, - "y": 661.3671130383368, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 3 - }, - { - "x": 103.03506848287904, - "y": 88.18583114861542, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 6 - }, - { - "x": 100.01574001550529, - "y": 732.6999262255931, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 1 - }, - { - "x": 296.22482042007226, - "y": 698.2421891914767, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 2 - }, - { - "x": 278.3524827867316, - "y": 872.5757064912211, - "frameIndex": 93, - "frameTimestamp": 3720.0, - "objectId": 0 - }, - { - "x": 207.7275156304653, - "y": 915.3162067707002, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 3 - }, - { - "x": 289.54941685846535, - "y": 43.82374236908155, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 5 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 12 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 9 - }, - { - "x": 432.59757705178606, - "y": 57.54762512261918, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 8 - }, - { - "x": 36.594359515202896, - "y": 31.81386963061296, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 11 - }, - { - "x": 422.5577695780605, - "y": 604.8933001759592, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 6 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 10 - }, - { - "x": 45.67869779221536, - "y": 666.7284972470102, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 4 - }, - { - "x": 102.52383564130018, - "y": 91.7178661089584, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 7 - }, - { - "x": 101.24926001964819, - "y": 732.7155082215887, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 1 - }, - { - "x": 296.92523918654115, - "y": 694.5045927805126, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 2 - }, - { - "x": 275.54568231031107, - "y": 870.1346601029908, - "frameIndex": 94, - "frameTimestamp": 3760.0000000000005, - "objectId": 0 - }, - { - "x": 207.7275156304653, - "y": 915.3162067707002, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 3 - }, - { - "x": 289.64002168576656, - "y": 40.04131442358335, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 4 - }, - { - "x": 535.4342768114158, - "y": 625.8364429461286, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 12 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 9 - }, - { - "x": 433.48410202895434, - "y": 57.56301093600855, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 8 - }, - { - "x": 37.127707065520774, - "y": 35.632562906594224, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 11 - }, - { - "x": 421.2010612168964, - "y": 609.4283229670376, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 5 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 10 - }, - { - "x": 46.75172045548727, - "y": 677.2349371031962, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 7 - }, - { - "x": 102.52383564130018, - "y": 91.7178661089584, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 6 - }, - { - "x": 101.65812881983838, - "y": 735.0007413583268, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 1 - }, - { - "x": 297.69888328365585, - "y": 694.5145841696681, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 2 - }, - { - "x": 273.134443687654, - "y": 867.6816924003501, - "frameIndex": 95, - "frameTimestamp": 3800.0000000000005, - "objectId": 0 - }, - { - "x": 207.53400672229458, - "y": 915.3140058069785, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 2 - }, - { - "x": 289.90558032076206, - "y": 47.595398910274064, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 4 - }, - { - "x": 535.7121696096365, - "y": 625.8401705673293, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 11 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 9 - }, - { - "x": 435.2585148585606, - "y": 53.868822157141295, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 6 - }, - { - "x": 39.97806215596605, - "y": 43.244881441252176, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 12 - }, - { - "x": 420.441697841458, - "y": 615.4236020866981, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 7 - }, - { - "x": -62.65507582179709, - "y": 511.71956206381253, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 10 - }, - { - "x": 45.12960058213464, - "y": 684.9260350418501, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 8 - }, - { - "x": 102.44766102571818, - "y": 95.24056113384964, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 5 - }, - { - "x": 102.31016902191085, - "y": 737.2767658074584, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 0 - }, - { - "x": 297.95676280172256, - "y": 694.5179146088581, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 3 - }, - { - "x": 269.5889339626578, - "y": 868.450291506747, - "frameIndex": 96, - "frameTimestamp": 3840.0, - "objectId": 1 - }, - { - "x": 207.14698734638927, - "y": 915.3096038617963, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 3 - }, - { - "x": 288.1202670584223, - "y": 47.56432175401482, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 4 - }, - { - "x": 535.9900613333194, - "y": 625.8438981741165, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 11 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 8 - }, - { - "x": 435.7003666627783, - "y": 57.601474639745746, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 7 - }, - { - "x": 39.903337953973924, - "y": 39.4715950772271, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 12 - }, - { - "x": 420.20555135694934, - "y": 618.3954321984651, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 5 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 10 - }, - { - "x": 46.37760221403553, - "y": 692.5234301511424, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 9 - }, - { - "x": 100.64536761306664, - "y": 98.71719922411692, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 6 - }, - { - "x": 101.40724098225935, - "y": 741.7646266510724, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 0 - }, - { - "x": 298.15036481380395, - "y": 695.7728122230262, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 2 - }, - { - "x": 266.5278297677905, - "y": 865.9785119382087, - "frameIndex": 97, - "frameTimestamp": 3880.0, - "objectId": 1 - }, - { - "x": 206.75996589105162, - "y": 915.3052018929629, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 4 - }, - { - "x": 286.3349095208501, - "y": 47.53324382705144, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 2 - }, - { - "x": 535.9900613333194, - "y": 625.8438981741165, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 11 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 9 - }, - { - "x": 436.14006517739057, - "y": 61.3159366754288, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 5 - }, - { - "x": 38.1604372805401, - "y": 20.29949754675663, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 12 - }, - { - "x": 420.4856056159939, - "y": 618.3992002905883, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 6 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 10 - }, - { - "x": 46.64621294856877, - "y": 702.4372261700154, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 7 - }, - { - "x": 98.91884730540043, - "y": 98.68779715199663, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 8 - }, - { - "x": 101.81132579535053, - "y": 744.0013195476739, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 0 - }, - { - "x": 298.2791425560137, - "y": 698.2686667064152, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 3 - }, - { - "x": 263.64173409499483, - "y": 864.3113916135939, - "frameIndex": 98, - "frameTimestamp": 3920.0, - "objectId": 1 - }, - { - "x": 206.56645438359047, - "y": 915.3030008996769, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 4 - }, - { - "x": 285.88856321825904, - "y": 47.525474224884775, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 2 - }, - { - "x": 536.2679519824713, - "y": 625.8476257664901, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 11 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 7 - }, - { - "x": 437.0243891465883, - "y": 61.33126149948854, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 5 - }, - { - "x": 37.62435202950459, - "y": 16.40442901286697, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 13 - }, - { - "x": 419.45925486156233, - "y": 624.2807676880444, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 6 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 10 - }, - { - "x": 45.2536590482192, - "y": 707.2918501048671, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 8 - }, - { - "x": 96.32898930697893, - "y": 98.64369272338777, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 9 - }, - { - "x": 102.37094039587281, - "y": 748.4360347277081, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 1 - }, - { - "x": 298.1511313038468, - "y": 700.7471777145394, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 3 - }, - { - "x": 256.97250037711046, - "y": 864.2331443900052, - "frameIndex": 99, - "frameTimestamp": 3960.0, - "objectId": 0 - }, - { - "x": 205.792403155081, - "y": 915.2941968674029, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 5 - }, - { - "x": 285.44221414833714, - "y": 47.51770457454674, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 3 - }, - { - "x": 536.2679519824713, - "y": 625.8476257664901, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 11 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 8 - }, - { - "x": 437.0187133249513, - "y": 65.01997338771545, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 4 - }, - { - "x": 419.20462685127814, - "y": 625.7399294778122, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 6 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 10 - }, - { - "x": 43.69188302133202, - "y": 706.0588058989731, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 7 - }, - { - "x": 94.97587158963783, - "y": 102.1116135697243, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 9 - }, - { - "x": 101.03836555043253, - "y": 751.7094335905567, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 1 - }, - { - "x": 297.7087069549858, - "y": 709.313249839855, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 2 - }, - { - "x": 249.26443164087632, - "y": 864.9603698709958, - "frameIndex": 100, - "frameTimestamp": 4000.0, - "objectId": 0 - }, - { - "x": 205.40537442159817, - "y": 915.2897948157882, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 5 - }, - { - "x": 285.44221414833714, - "y": 47.51770457454674, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 3 - }, - { - "x": 536.2679519824713, - "y": 625.8476257664901, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 8 - }, - { - "x": 436.5730459803248, - "y": 68.6832159544082, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 4 - }, - { - "x": 419.20462685127814, - "y": 625.7399294778122, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 6 - }, - { - "x": -62.343885324800716, - "y": 511.7239650818063, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 9 - }, - { - "x": 46.01597162147767, - "y": 707.3016103831251, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 7 - }, - { - "x": 91.29736995650043, - "y": 87.98508126110478, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 10 - }, - { - "x": 100.03453886591215, - "y": 752.7878006407524, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 2 - }, - { - "x": 297.2692105159075, - "y": 712.930286509023, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 1 - }, - { - "x": 242.55481917060328, - "y": 861.5996241973127, - "frameIndex": 101, - "frameTimestamp": 4040.0, - "objectId": 0 - }, - { - "x": 510.4450426738624, - "y": 261.7077221341253, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 10 - }, - { - "x": 205.01834360860758, - "y": 915.2853927405213, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 6 - }, - { - "x": 286.2528266134817, - "y": 51.27894056800026, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 4 - }, - { - "x": 536.5458415570982, - "y": 625.8513533444501, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 8 - }, - { - "x": 436.13302427380836, - "y": 68.67561314747226, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 3 - }, - { - "x": 418.926709024865, - "y": 625.73620434656, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 5 - }, - { - "x": -62.343885324800716, - "y": 511.7239650818063, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 9 - }, - { - "x": 44.887299517531964, - "y": 712.1057513480927, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 7 - }, - { - "x": 90.81394272432425, - "y": 91.5178793772642, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 11 - }, - { - "x": 98.83029427453256, - "y": 752.7727562465117, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 1 - }, - { - "x": 297.2748243777078, - "y": 717.7139390434442, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 2 - }, - { - "x": 237.30730559569952, - "y": 860.7127057579912, - "frameIndex": 102, - "frameTimestamp": 4080.0, - "objectId": 0 - }, - { - "x": 510.60549368310024, - "y": 258.9140318152161, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 10 - }, - { - "x": 203.85723869242162, - "y": 915.2721863728043, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 4 - }, - { - "x": 285.8075713546581, - "y": 51.271201545343686, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 5 - }, - { - "x": 536.2679519824713, - "y": 625.8476257664901, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 12 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 8 - }, - { - "x": 435.69056800958674, - "y": 72.32120710403242, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 2 - }, - { - "x": 420.22783489208337, - "y": 619.876371597984, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 6 - }, - { - "x": -62.343885324800716, - "y": 511.7239650818063, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 9 - }, - { - "x": 45.062423424464676, - "y": 718.0567481822865, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 7 - }, - { - "x": 91.8096745426164, - "y": 112.43276365749378, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 11 - }, - { - "x": 97.0088541494202, - "y": 749.4685161626352, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 3 - }, - { - "x": 296.5311397950689, - "y": 722.4355585219398, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 1 - }, - { - "x": 233.32785925740274, - "y": 860.665925751286, - "frameIndex": 103, - "frameTimestamp": 4120.0, - "objectId": 0 - }, - { - "x": 510.2208814117381, - "y": 258.9078919046584, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 12 - }, - { - "x": 203.08315835045155, - "y": 915.2633820093952, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 5 - }, - { - "x": 286.2528266134817, - "y": 51.27894056800026, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 6 - }, - { - "x": 536.2679519824713, - "y": 625.8476257664901, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 11 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 8 - }, - { - "x": 434.3759184213046, - "y": 83.15318979155772, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 4 - }, - { - "x": 419.6916595224288, - "y": 621.3452585932743, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 1 - }, - { - "x": -63.19367433652004, - "y": 509.896168502656, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 9 - }, - { - "x": 48.871337996698664, - "y": 729.7605958444105, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 7 - }, - { - "x": 92.18622985204179, - "y": 115.86513446219777, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 10 - }, - { - "x": 95.34920797855995, - "y": 748.3481002103932, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 3 - }, - { - "x": 296.1030682981628, - "y": 725.9445154649499, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 2 - }, - { - "x": 230.42118118688765, - "y": 861.4570578803238, - "frameIndex": 104, - "frameTimestamp": 4160.0, - "objectId": 0 - }, - { - "x": 510.2208814117381, - "y": 258.9078919046584, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 13 - }, - { - "x": 202.30906969004815, - "y": 915.2545775513723, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 5 - }, - { - "x": 286.6980791185142, - "y": 51.28667954279306, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 6 - }, - { - "x": 536.2679519824713, - "y": 625.8476257664901, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 11 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 8 - }, - { - "x": 434.3759184213046, - "y": 83.15318979155772, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 3 - }, - { - "x": 38.39918932856161, - "y": 31.845428815608024, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 12 - }, - { - "x": 420.2721968506814, - "y": 622.8246188995107, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 4 - }, - { - "x": -62.343885324800716, - "y": 511.7239650818063, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 9 - }, - { - "x": 46.61113747049736, - "y": 728.5806891003483, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 7 - }, - { - "x": 91.3329616502335, - "y": 115.85070592244062, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 10 - }, - { - "x": 93.68511483470108, - "y": 747.2246821366301, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 2 - }, - { - "x": 296.1030682981628, - "y": 725.9445154649499, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 1 - }, - { - "x": 227.463011201766, - "y": 860.5969820822314, - "frameIndex": 105, - "frameTimestamp": 4200.0, - "objectId": 0 - }, - { - "x": 201.34144716654282, - "y": 915.243571845791, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 6 - }, - { - "x": 287.5885758673075, - "y": 51.30215734878862, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 5 - }, - { - "x": 536.2679519824713, - "y": 625.8476257664901, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 11 - }, - { - "x": 544.9585601324433, - "y": 686.2941591870679, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 8 - }, - { - "x": 433.50711790342086, - "y": 86.72187761494531, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 4 - }, - { - "x": 37.33352569994907, - "y": 24.151343618631742, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 12 - }, - { - "x": 418.9986887285018, - "y": 630.0981900551413, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 7 - }, - { - "x": -62.343885324800716, - "y": 511.7239650818063, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 9 - }, - { - "x": 50.27032736353853, - "y": 746.6806583195897, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 3 - }, - { - "x": 90.95440315995447, - "y": 112.41828092131881, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 10 - }, - { - "x": 92.6560675672791, - "y": 749.414038571174, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 2 - }, - { - "x": 296.41141145160356, - "y": 724.7801708377966, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 1 - }, - { - "x": 225.15883307778756, - "y": 860.5698955332681, - "frameIndex": 106, - "frameTimestamp": 4240.0, - "objectId": 0 - }, - { - "x": 199.7932240929366, - "y": 915.2259624093547, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 7 - }, - { - "x": 287.5885758673075, - "y": 51.30215734878862, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 6 - }, - { - "x": 536.2679519824713, - "y": 625.8476257664901, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 11 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 9 - }, - { - "x": 432.6424548625894, - "y": 90.27357032418158, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 4 - }, - { - "x": 419.07001391215863, - "y": 634.4205117104536, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 5 - }, - { - "x": -62.57022960381736, - "y": 509.9049974326097, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 8 - }, - { - "x": 50.61793339928801, - "y": 751.0791593815719, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 2 - }, - { - "x": 89.28811992540523, - "y": 108.9479134908814, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 10 - }, - { - "x": 91.87363667657775, - "y": 751.5948710611398, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 3 - }, - { - "x": 296.84923856650516, - "y": 725.9539890399185, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 1 - }, - { - "x": 223.72588506008208, - "y": 861.3783903190175, - "frameIndex": 107, - "frameTimestamp": 4280.0, - "objectId": 0 - }, - { - "x": 199.2126318614199, - "y": 915.2193587731147, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 7 - }, - { - "x": 287.5885758673075, - "y": 51.30215734878862, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 6 - }, - { - "x": 537.5000323345647, - "y": 627.3255273419223, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 11 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 9 - }, - { - "x": 430.91646667763473, - "y": 93.79358752917874, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 3 - }, - { - "x": 419.4148373357339, - "y": 638.7073577077747, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 2 - }, - { - "x": -62.343885324800716, - "y": 511.7239650818063, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 8 - }, - { - "x": 51.46685913119928, - "y": 756.5175391553773, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 5 - }, - { - "x": 91.18709278000935, - "y": 126.03088614421658, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 10 - }, - { - "x": 90.40001879940513, - "y": 752.6674384491872, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 4 - }, - { - "x": 296.977177625258, - "y": 728.28257215134, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 1 - }, - { - "x": 223.27354159900617, - "y": 860.5477331668178, - "frameIndex": 108, - "frameTimestamp": 4320.0, - "objectId": 0 - }, - { - "x": 198.24496774331763, - "y": 915.208352594438, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 11 - }, - { - "x": 287.5885758673075, - "y": 51.30215734878862, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 6 - }, - { - "x": 537.5000323345647, - "y": 627.3255273419223, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 7 - }, - { - "x": 430.05102312786306, - "y": 93.77878584596348, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 3 - }, - { - "x": 420.7855410267335, - "y": 638.725606693839, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 2 - }, - { - "x": -62.03269616969209, - "y": 511.72836808081365, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 8 - }, - { - "x": 51.30223402210971, - "y": 759.7380913523759, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 5 - }, - { - "x": 89.96152101077485, - "y": 122.63179458679473, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 9 - }, - { - "x": 91.49298160323626, - "y": 757.016374207679, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 4 - }, - { - "x": 297.5991580398568, - "y": 730.6047596517941, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 1 - }, - { - "x": 222.50519714178753, - "y": 862.1875011070814, - "frameIndex": 109, - "frameTimestamp": 4360.0, - "objectId": 0 - }, - { - "x": 287.5885758673075, - "y": 51.30215734878862, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 6 - }, - { - "x": 537.9352733125747, - "y": 625.8699910180495, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 7 - }, - { - "x": 429.1986385620661, - "y": 97.29696291421264, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 2 - }, - { - "x": 419.0784727475199, - "y": 651.3202074044741, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 3 - }, - { - "x": -62.343885324800716, - "y": 511.7239650818063, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 8 - }, - { - "x": 49.180680246488635, - "y": 760.7803053471731, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 5 - }, - { - "x": 87.91978784517458, - "y": 115.79299005556547, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 9 - }, - { - "x": 93.22991256367648, - "y": 763.456182927972, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 4 - }, - { - "x": 297.90990253486564, - "y": 734.056648263885, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 1 - }, - { - "x": 222.26120606180564, - "y": 861.3611808151052, - "frameIndex": 110, - "frameTimestamp": 4400.0, - "objectId": 0 - }, - { - "x": 287.14332886978093, - "y": 51.29441846972229, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 7 - }, - { - "x": 535.5577833665318, - "y": 627.2994939908998, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 6 - }, - { - "x": 428.33523052086787, - "y": 97.28221724971321, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 2 - }, - { - "x": 420.40957265790496, - "y": 649.9526165341543, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 3 - }, - { - "x": -62.03269616969209, - "y": 511.72836808081365, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 8 - }, - { - "x": 47.77917970886183, - "y": 761.8287110471898, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 5 - }, - { - "x": 85.89525055537983, - "y": 105.43194479277476, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 10 - }, - { - "x": 91.5382108524455, - "y": 764.4951428157912, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 4 - }, - { - "x": 299.0126287350336, - "y": 740.8831251226891, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 1 - }, - { - "x": 222.0166531961702, - "y": 860.5329579335531, - "frameIndex": 111, - "frameTimestamp": 4440.0, - "objectId": 0 - }, - { - "x": 282.29320522728113, - "y": -361.8934684222225, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 12 - }, - { - "x": -56.74026022532527, - "y": 421.34582494700345, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 13 - }, - { - "x": 286.9488300797227, - "y": 39.994327427747095, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 7 - }, - { - "x": 535.8352507185435, - "y": 627.3032130841216, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 6 - }, - { - "x": 428.33523052086787, - "y": 97.28221724971321, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 3 - }, - { - "x": 421.2020797371412, - "y": 648.5737821255292, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 4 - }, - { - "x": -62.03269616969209, - "y": 511.72836808081365, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 8 - }, - { - "x": 51.76012282853902, - "y": 769.2616633419459, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 5 - }, - { - "x": 86.25022917189278, - "y": 112.33862280090088, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 10 - }, - { - "x": 89.53908406877179, - "y": 768.68283364942, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 2 - }, - { - "x": 299.7302434713584, - "y": 749.8066009687317, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 1 - }, - { - "x": 221.17871540861776, - "y": 860.523107634796, - "frameIndex": 112, - "frameTimestamp": 4480.0, - "objectId": 0 - }, - { - "x": 282.29320522728113, - "y": -361.8934684222225, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 12 - }, - { - "x": 194.95481250871805, - "y": 915.1709304810117, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 4 - }, - { - "x": 286.2528266134817, - "y": 51.27894056800026, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 7 - }, - { - "x": 535.8352507185435, - "y": 627.3032130841216, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 6 - }, - { - "x": 427.47181211437265, - "y": 97.26747140819079, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 3 - }, - { - "x": 420.22493013432216, - "y": 655.4663341792403, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 5 - }, - { - "x": -62.03269616969209, - "y": 511.72836808081365, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 9 - }, - { - "x": 51.9976498105165, - "y": 779.583682001058, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 8 - }, - { - "x": 85.35980143864201, - "y": 115.74970136208532, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 10 - }, - { - "x": 88.33480856916343, - "y": 769.7142529856244, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 1 - }, - { - "x": 300.98878512347744, - "y": 753.1166114160553, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 2 - }, - { - "x": 219.4645243351356, - "y": 859.6756927695113, - "frameIndex": 113, - "frameTimestamp": 4520.000000000001, - "objectId": 0 - }, - { - "x": 282.29320522728113, - "y": -361.8934684222225, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 12 - }, - { - "x": 193.9870911936657, - "y": 915.1599236517791, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 4 - }, - { - "x": 285.646769975708, - "y": 58.707974716389984, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 8 - }, - { - "x": 535.8352507185435, - "y": 627.3032130841216, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 7 - }, - { - "x": 425.7872321548658, - "y": 104.25425807489654, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 5 - }, - { - "x": 420.51519488171255, - "y": 656.839001116759, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 6 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 10 - }, - { - "x": 49.184717153164335, - "y": 787.6168551628249, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 3 - }, - { - "x": 84.07977414528075, - "y": 115.7280564388908, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 9 - }, - { - "x": 91.81791080251182, - "y": 771.8418733209821, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 2 - }, - { - "x": 301.0380683209938, - "y": 756.385422124488, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 1 - }, - { - "x": 219.04505962000798, - "y": 859.6707593826243, - "frameIndex": 114, - "frameTimestamp": 4560.000000000001, - "objectId": 0 - }, - { - "x": 282.29320522728113, - "y": -361.8934684222225, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 12 - }, - { - "x": 193.40645216464426, - "y": 915.1533194832657, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 4 - }, - { - "x": 286.6153108998503, - "y": 55.01407450304942, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 7 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 8 - }, - { - "x": 424.49817988370353, - "y": 104.23230593933502, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 5 - }, - { - "x": 422.4334952627817, - "y": 659.5898199885701, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 6 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 9 - }, - { - "x": 49.11516998433969, - "y": 793.5606746596302, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 1 - }, - { - "x": 82.77076499035455, - "y": 119.11616322939717, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 10 - }, - { - "x": 91.03220075857712, - "y": 774.9388860291024, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 2 - }, - { - "x": 301.5820920713542, - "y": 755.3056951534945, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 3 - }, - { - "x": 218.58625090002988, - "y": 858.8361880233015, - "frameIndex": 115, - "frameTimestamp": 4600.000000000001, - "objectId": 0 - }, - { - "x": 282.29320522728113, - "y": -361.8934684222225, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 13 - }, - { - "x": 193.21290478162624, - "y": 915.1511180819324, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 5 - }, - { - "x": 285.7269745683878, - "y": 54.99865725325401, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 6 - }, - { - "x": 535.8352507185435, - "y": 627.3032130841216, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 11 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 7 - }, - { - "x": 424.8814947012393, - "y": 97.22323282145251, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 8 - }, - { - "x": 421.380851634325, - "y": 660.9327066536326, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 4 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 9 - }, - { - "x": 46.45785109331551, - "y": 796.4672293016732, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 3 - }, - { - "x": 82.3450712487197, - "y": 119.10897492901185, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 10 - }, - { - "x": 92.26028405398132, - "y": 772.8855727383462, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 1 - }, - { - "x": 301.27792723994173, - "y": 756.3884168252722, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 2 - }, - { - "x": 217.78665081711884, - "y": 859.6559590495746, - "frameIndex": 116, - "frameTimestamp": 4640.0, - "objectId": 0 - }, - { - "x": 512.5285241708527, - "y": 258.9447308752143, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 12 - }, - { - "x": 193.21290478162624, - "y": 915.1511180819324, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 4 - }, - { - "x": 286.2528266134817, - "y": 51.27894056800026, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 6 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 7 - }, - { - "x": 424.0684906591904, - "y": 104.22498847338197, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 8 - }, - { - "x": 423.25455403175073, - "y": 660.9573632028597, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 5 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 9 - }, - { - "x": 45.441973068437875, - "y": 800.33945093822, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 2 - }, - { - "x": 81.8658108436441, - "y": 125.8739240457581, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 10 - }, - { - "x": 92.96522702403713, - "y": 772.8942807134706, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 1 - }, - { - "x": 303.3968590231469, - "y": 753.1467315077773, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 3 - }, - { - "x": 216.77938207994484, - "y": 860.471391686114, - "frameIndex": 117, - "frameTimestamp": 4680.0, - "objectId": 0 - }, - { - "x": 512.5285241708527, - "y": 258.9447308752143, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 12 - }, - { - "x": 192.8258084555612, - "y": 915.146715261522, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 4 - }, - { - "x": 286.2528266134817, - "y": 51.27894056800026, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 6 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 7 - }, - { - "x": 428.35028455247385, - "y": 100.79850405194313, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 8 - }, - { - "x": 422.52321377936556, - "y": 666.33495670731, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 5 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 10 - }, - { - "x": 44.177896392354775, - "y": 803.2123143942666, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 3 - }, - { - "x": 80.17090281804332, - "y": 125.84538330187667, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 9 - }, - { - "x": 93.9354575665245, - "y": 771.8680460678249, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 1 - }, - { - "x": 305.1846115872131, - "y": 755.3507007314676, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 2 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 118, - "frameTimestamp": 4720.0, - "objectId": 0 - }, - { - "x": 192.43871004944356, - "y": 915.1423124174527, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 5 - }, - { - "x": 286.17114410430713, - "y": 55.006365901931666, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 6 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 7 - }, - { - "x": 426.1968357879743, - "y": 100.76177913951193, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 8 - }, - { - "x": 422.29340787763414, - "y": 669.0019574955865, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 4 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 9 - }, - { - "x": 42.264529276078925, - "y": 800.3008183933188, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 3 - }, - { - "x": 78.91951702602097, - "y": 122.44559832149379, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 11 - }, - { - "x": 95.5176058740691, - "y": 773.9613486132158, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 1 - }, - { - "x": 305.76528000807843, - "y": 757.5280707543418, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 2 - }, - { - "x": 216.36038393871132, - "y": 860.4664661929197, - "frameIndex": 119, - "frameTimestamp": 4760.0, - "objectId": 0 - }, - { - "x": 192.05160956325668, - "y": 915.1379095497249, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 4 - }, - { - "x": 286.17114410430713, - "y": 55.006365901931666, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 5 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 7 - }, - { - "x": 432.6569886553013, - "y": 100.87195057811584, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 11 - }, - { - "x": 421.27126915191667, - "y": 671.6430513183815, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 6 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 9 - }, - { - "x": 42.21255645511249, - "y": 805.1020858408149, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 3 - }, - { - "x": 76.39913308564768, - "y": 115.59817882871573, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 14 - }, - { - "x": 97.29116556589149, - "y": 777.0739104970287, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 1 - }, - { - "x": 306.1039976277263, - "y": 759.6910149370638, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 2 - }, - { - "x": 216.36038393871132, - "y": 860.4664661929197, - "frameIndex": 120, - "frameTimestamp": 4800.0, - "objectId": 0 - }, - { - "x": -53.235727494485474, - "y": 431.96677394500034, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 12 - }, - { - "x": 191.66450699698368, - "y": 915.1335066583385, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 5 - }, - { - "x": 285.7269745683878, - "y": 54.99865725325401, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 6 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 11 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 7 - }, - { - "x": 430.0839062066311, - "y": 104.3274290186652, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 10 - }, - { - "x": 420.29682988549985, - "y": 676.8932068529305, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 4 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 9 - }, - { - "x": 45.94369385568741, - "y": 822.8657619312589, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 2 - }, - { - "x": 75.53362951632113, - "y": 118.99395635006371, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 14 - }, - { - "x": 98.9781534834381, - "y": 782.1933174587485, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 1 - }, - { - "x": 305.99369835334187, - "y": 765.0371794275723, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 3 - }, - { - "x": 216.56988331400504, - "y": 860.4689289430984, - "frameIndex": 121, - "frameTimestamp": 4840.0, - "objectId": 0 - }, - { - "x": 512.3083177139156, - "y": 256.1331242583629, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 13 - }, - { - "x": -52.56677778278467, - "y": 431.9766091567997, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 12 - }, - { - "x": 191.4709549338097, - "y": 915.1313052037733, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 5 - }, - { - "x": 285.2828022920668, - "y": 54.99094855701628, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 6 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 9 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 7 - }, - { - "x": 431.7956684660577, - "y": 100.85726162472793, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 8 - }, - { - "x": 419.5733643176358, - "y": 680.7911478391802, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 4 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 11 - }, - { - "x": 47.022481822814825, - "y": 829.2034665855588, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 1 - }, - { - "x": 101.48829740061302, - "y": 789.2540762804779, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 2 - }, - { - "x": 305.8848278245238, - "y": 770.3140931559512, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 3 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 122, - "frameTimestamp": 4880.0, - "objectId": 0 - }, - { - "x": 421.8593398051511, - "y": 97.17161912313543, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 11 - }, - { - "x": 512.6937355305387, - "y": 256.13928455710555, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 14 - }, - { - "x": -51.89783427231229, - "y": 431.9864442774258, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 12 - }, - { - "x": 191.27740235060787, - "y": 915.1291037432931, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 5 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 9 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 6 - }, - { - "x": 433.0876448816776, - "y": 100.87929498884088, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 10 - }, - { - "x": 420.29682988549985, - "y": 676.8932068529305, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 4 - }, - { - "x": -62.03269616969209, - "y": 511.72836808081365, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 8 - }, - { - "x": 46.88826288358952, - "y": 831.880163048529, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 2 - }, - { - "x": 102.58527900581086, - "y": 796.1743259441262, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 1 - }, - { - "x": 305.54307140625633, - "y": 775.5201989217409, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 3 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 123, - "frameTimestamp": 4920.0, - "objectId": 0 - }, - { - "x": 533.0191216353581, - "y": 40.494334008974946, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 13 - }, - { - "x": 515.1674072669766, - "y": 587.5115260753756, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 15 - }, - { - "x": 421.8593398051511, - "y": 97.17161912313543, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 11 - }, - { - "x": 512.1439221891217, - "y": 258.93859112891914, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 14 - }, - { - "x": -52.23230525240031, - "y": 431.9815267285094, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 12 - }, - { - "x": 191.08384924737612, - "y": 915.1269022768981, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 8 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 7 - }, - { - "x": 434.3795980881027, - "y": 100.90132795714423, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 10 - }, - { - "x": 418.1686201319163, - "y": 689.7600898067209, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 4 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 9 - }, - { - "x": 48.645696855433776, - "y": 839.82224106809, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 1 - }, - { - "x": 102.96021676390075, - "y": 798.1301224440066, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 2 - }, - { - "x": 304.0777033382543, - "y": 783.7006516666419, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 3 - }, - { - "x": 216.82070899332425, - "y": 861.2972567363842, - "frameIndex": 124, - "frameTimestamp": 4960.0, - "objectId": 0 - }, - { - "x": 533.0191216353581, - "y": 40.494334008974946, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 13 - }, - { - "x": 282.76406161342027, - "y": 47.47108566089771, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 6 - }, - { - "x": 423.5863010095906, - "y": 97.20111293059273, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 12 - }, - { - "x": 512.1439221891217, - "y": 258.93859112891914, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 14 - }, - { - "x": -52.79217988846361, - "y": 429.87495670008724, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 11 - }, - { - "x": 190.89029562411238, - "y": 915.1247008045882, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 7 - }, - { - "x": 434.3795980881027, - "y": 100.90132795714423, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 9 - }, - { - "x": 418.42790478833984, - "y": 689.7634497668407, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 4 - }, - { - "x": -61.721508356462444, - "y": 511.732771060835, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 8 - }, - { - "x": 47.568508060282085, - "y": 839.8094388108291, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 1 - }, - { - "x": 102.38525464510667, - "y": 801.0317885611911, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 2 - }, - { - "x": 302.95829467688884, - "y": 786.7184466037412, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 3 - }, - { - "x": 216.82070899332425, - "y": 861.2972567363842, - "frameIndex": 125, - "frameTimestamp": 5000.0, - "objectId": 0 - }, - { - "x": 532.5710077714792, - "y": 40.486498307113074, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 12 - }, - { - "x": 427.93560126692574, - "y": 104.29084409319789, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 9 - }, - { - "x": 512.1439221891217, - "y": 258.93859112891914, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 13 - }, - { - "x": -49.67135405443781, - "y": 434.1098129028069, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 11 - }, - { - "x": 190.89029562411238, - "y": 915.1247008045882, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 7 - }, - { - "x": 418.42790478833984, - "y": 689.7634497668407, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 4 - }, - { - "x": -61.721508356462444, - "y": 511.732771060835, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 8 - }, - { - "x": 44.98318929944484, - "y": 839.7787126131309, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 1 - }, - { - "x": 103.53994698565427, - "y": 805.8456852721108, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 2 - }, - { - "x": 301.95316527382323, - "y": 791.7077643880555, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 3 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 126, - "frameTimestamp": 5040.0, - "objectId": 0 - }, - { - "x": 423.5863010095906, - "y": 97.20111293059273, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 11 - }, - { - "x": 512.1439221891217, - "y": 258.93859112891914, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 14 - }, - { - "x": -49.55658081908804, - "y": 432.0208664816447, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 12 - }, - { - "x": 190.89029562411238, - "y": 915.1247008045882, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 5 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 6 - }, - { - "x": 418.9239803463481, - "y": 688.497000595077, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 3 - }, - { - "x": -60.87567937971191, - "y": 513.55431600567, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 8 - }, - { - "x": 43.78460197880415, - "y": 842.3676843393648, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 2 - }, - { - "x": 102.41307579814163, - "y": 805.8320218703757, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 1 - }, - { - "x": 302.4123062959793, - "y": 791.7133842698717, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 4 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 127, - "frameTimestamp": 5080.0, - "objectId": 0 - }, - { - "x": 512.1439221891217, - "y": 258.93859112891914, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 13 - }, - { - "x": -48.55320973535911, - "y": 432.03561851299963, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 12 - }, - { - "x": 191.08384924737612, - "y": 915.1269022768981, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 5 - }, - { - "x": 275.56594029656924, - "y": 51.09319081278367, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 7 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 10 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 6 - }, - { - "x": 418.9464712971289, - "y": 689.7701696507438, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 3 - }, - { - "x": -61.721508356462444, - "y": 511.732771060835, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 9 - }, - { - "x": 43.26798871215015, - "y": 845.8041016988957, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 2 - }, - { - "x": 101.51156616435497, - "y": 805.821090995196, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 1 - }, - { - "x": 302.12050838822415, - "y": 792.7025825860422, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 4 - }, - { - "x": 216.44390453035754, - "y": 862.1163175313229, - "frameIndex": 128, - "frameTimestamp": 5120.0, - "objectId": 0 - }, - { - "x": 512.1439221891217, - "y": 258.93859112891914, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 13 - }, - { - "x": -47.884303430446614, - "y": 432.04545308661216, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 12 - }, - { - "x": 191.08384924737612, - "y": 915.1269022768981, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 5 - }, - { - "x": 270.623579642163, - "y": 54.7365348970144, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 9 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 11 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 6 - }, - { - "x": 426.1968357879743, - "y": 100.76177913951193, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 7 - }, - { - "x": 418.4741704972551, - "y": 692.2989472492505, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 3 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 10 - }, - { - "x": 42.44590981235173, - "y": 846.649980102552, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 2 - }, - { - "x": 66.21537040137497, - "y": 135.65396790671628, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 8 - }, - { - "x": 101.43489004402451, - "y": 807.7235790545363, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 1 - }, - { - "x": 301.89122647773013, - "y": 792.6997777586753, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 4 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 129, - "frameTimestamp": 5160.0, - "objectId": 0 - }, - { - "x": 512.1439221891217, - "y": 258.93859112891914, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 13 - }, - { - "x": -45.54318019260798, - "y": 432.0798733763435, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 12 - }, - { - "x": 191.27740235060787, - "y": 915.1291037432931, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 5 - }, - { - "x": 270.22190220882624, - "y": 51.00030559465453, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 10 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 9 - }, - { - "x": 545.4791859183333, - "y": 686.3009242627484, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 7 - }, - { - "x": 426.62753069912173, - "y": 100.76912420996686, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 6 - }, - { - "x": 418.28562973596, - "y": 696.0719270296389, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 3 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 8 - }, - { - "x": 41.41254574925887, - "y": 847.4913715380974, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 2 - }, - { - "x": 65.79448534844646, - "y": 135.64690989068197, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 11 - }, - { - "x": 101.621240516664, - "y": 808.6740315401648, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 1 - }, - { - "x": 301.4940213230817, - "y": 791.7021444703934, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 4 - }, - { - "x": 216.40219219675575, - "y": 861.2923392995555, - "frameIndex": 130, - "frameTimestamp": 5200.0, - "objectId": 0 - }, - { - "x": 511.596429897044, - "y": 261.72608036532097, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 13 - }, - { - "x": -43.870995811076455, - "y": 432.1044586138768, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 12 - }, - { - "x": 191.66450699698368, - "y": 915.1335066583385, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 5 - }, - { - "x": 270.623579642163, - "y": 54.7365348970144, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 10 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 11 - }, - { - "x": 545.4791859183333, - "y": 686.3009242627484, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 8 - }, - { - "x": 427.48891278399896, - "y": 100.78381421892296, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 6 - }, - { - "x": 418.1220528497635, - "y": 701.0540769200309, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 4 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 9 - }, - { - "x": 41.1566918411078, - "y": 851.7267574617644, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 2 - }, - { - "x": 65.80502409024, - "y": 138.96416596827254, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 7 - }, - { - "x": 101.24807948029861, - "y": 806.7707799436994, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 1 - }, - { - "x": 302.01526044504544, - "y": 790.7132465092969, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 3 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 131, - "frameTimestamp": 5240.0, - "objectId": 0 - }, - { - "x": 511.596429897044, - "y": 261.72608036532097, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 13 - }, - { - "x": -42.533276206400075, - "y": 432.1241263936965, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 11 - }, - { - "x": 192.05160956325668, - "y": 915.1379095497249, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 6 - }, - { - "x": 269.6937461201926, - "y": 58.431518019159256, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 12 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 10 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 7 - }, - { - "x": 428.33523052086787, - "y": 97.28221724971321, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 5 - }, - { - "x": 417.475289129446, - "y": 707.1976688275698, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 4 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 9 - }, - { - "x": 43.199269773056244, - "y": 860.9043289856822, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 2 - }, - { - "x": 66.22494133536556, - "y": 138.97119809549972, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 8 - }, - { - "x": 101.28618699424509, - "y": 805.8183582550408, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 1 - }, - { - "x": 301.89122647773013, - "y": 792.6997777586753, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 3 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 132, - "frameTimestamp": 5280.0, - "objectId": 0 - }, - { - "x": 511.596429897044, - "y": 261.72608036532097, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 14 - }, - { - "x": -42.533276206400075, - "y": 432.1241263936965, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 12 - }, - { - "x": 192.24516006635986, - "y": 915.1401109865462, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 6 - }, - { - "x": 267.44204798905963, - "y": 62.08565667270725, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 8 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 11 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 9 - }, - { - "x": 429.1986385620661, - "y": 97.29696291421264, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 4 - }, - { - "x": 416.86226553913315, - "y": 714.4594942834735, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 5 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 10 - }, - { - "x": 44.512400324689814, - "y": 868.2390351302757, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 3 - }, - { - "x": 67.07236880873255, - "y": 142.287220778088, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 7 - }, - { - "x": 101.73694462979623, - "y": 805.8238237268071, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 1 - }, - { - "x": 301.996521808137, - "y": 794.6791233650316, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 2 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 133, - "frameTimestamp": 5320.0, - "objectId": 0 - }, - { - "x": 511.596429897044, - "y": 261.72608036532097, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 13 - }, - { - "x": -41.530002777760295, - "y": 432.1388769892805, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 12 - }, - { - "x": 192.43871004944356, - "y": 915.1423124174527, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 6 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 11 - }, - { - "x": 545.2188734968632, - "y": 686.2975417310345, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 8 - }, - { - "x": 429.1986385620661, - "y": 97.29696291421264, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 4 - }, - { - "x": 415.392011902947, - "y": 727.4590394256613, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 5 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 9 - }, - { - "x": 44.71612113203848, - "y": 873.8317235961864, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 3 - }, - { - "x": 66.65341979942428, - "y": 142.28021445808673, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 7 - }, - { - "x": 101.92338144051412, - "y": 806.7789635696538, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 2 - }, - { - "x": 301.6282715409463, - "y": 800.5496108763767, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 1 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 134, - "frameTimestamp": 5360.0, - "objectId": 0 - }, - { - "x": 511.596429897044, - "y": 261.72608036532097, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 13 - }, - { - "x": -42.533276206400075, - "y": 432.1241263936965, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 12 - }, - { - "x": 192.24516006635986, - "y": 915.1401109865462, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 7 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 10 - }, - { - "x": 545.4791859183333, - "y": 686.3009242627484, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 8 - }, - { - "x": 429.63033869573724, - "y": 97.30433568007975, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 4 - }, - { - "x": 414.5090419460806, - "y": 732.0853096168671, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 5 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 9 - }, - { - "x": 44.888201918608694, - "y": 878.5558077129785, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 3 - }, - { - "x": 66.65341979942428, - "y": 142.28021445808673, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 6 - }, - { - "x": 102.03140251181503, - "y": 809.6248594420687, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 2 - }, - { - "x": 300.86163194383164, - "y": 809.1897906160348, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 0 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 135, - "frameTimestamp": 5400.0, - "objectId": 1 - }, - { - "x": 259.46705436586404, - "y": 65.62313359594239, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 9 - }, - { - "x": 511.596429897044, - "y": 261.72608036532097, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 13 - }, - { - "x": -42.86770378256655, - "y": 432.1192094829249, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 12 - }, - { - "x": 192.05160956325668, - "y": 915.1379095497249, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 11 - }, - { - "x": 545.4791859183333, - "y": 686.3009242627484, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 7 - }, - { - "x": 430.0620362381541, - "y": 97.31170840169212, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 4 - }, - { - "x": 414.5637374034786, - "y": 734.3858878987847, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 6 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 8 - }, - { - "x": 44.246597537621284, - "y": 877.7657401632658, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 3 - }, - { - "x": 68.32920123091888, - "y": 142.30823949383196, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 10 - }, - { - "x": 103.17557073169755, - "y": 814.3333282750951, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 2 - }, - { - "x": 300.0049979723831, - "y": 815.775248741849, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 1 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 136, - "frameTimestamp": 5440.0, - "objectId": 0 - }, - { - "x": 259.04115358495153, - "y": 61.94028947361675, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 12 - }, - { - "x": 511.596429897044, - "y": 261.72608036532097, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 13 - }, - { - "x": -42.86770378256655, - "y": 432.1192094829249, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 10 - }, - { - "x": 191.85805854013202, - "y": 915.1357081069891, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 9 - }, - { - "x": 545.4791859183333, - "y": 686.3009242627484, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 7 - }, - { - "x": 430.05102312786306, - "y": 93.77878584596348, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 4 - }, - { - "x": 414.5909740841373, - "y": 735.5315061818372, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 6 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 8 - }, - { - "x": 44.50884811408853, - "y": 879.3322673061215, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 3 - }, - { - "x": 68.74439345022522, - "y": 139.01338999883276, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 11 - }, - { - "x": 104.26471438862816, - "y": 819.9048569966159, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 2 - }, - { - "x": 299.3322005471064, - "y": 819.4857517830649, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 1 - }, - { - "x": 216.61145089901743, - "y": 861.2947980215416, - "frameIndex": 137, - "frameTimestamp": 5480.0, - "objectId": 0 - }, - { - "x": 259.056432802336, - "y": 58.24717951795122, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 10 - }, - { - "x": 511.596429897044, - "y": 261.72608036532097, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 14 - }, - { - "x": 282.858822669567, - "y": -361.8820146092222, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 11 - }, - { - "x": -41.195581401464345, - "y": 432.14379380889875, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 12 - }, - { - "x": 191.66450699698368, - "y": 915.1335066583385, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 5 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 9 - }, - { - "x": 545.4791859183333, - "y": 686.3009242627484, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 7 - }, - { - "x": 429.63033869573724, - "y": 97.30433568007975, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 4 - }, - { - "x": 415.57481974767904, - "y": 735.5439420683751, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 6 - }, - { - "x": -62.03269616969209, - "y": 511.72836808081365, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 8 - }, - { - "x": 43.489313498404115, - "y": 879.3204299063336, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 3 - }, - { - "x": 105.20224336831319, - "y": 823.5769963957632, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 1 - }, - { - "x": 299.49683729315416, - "y": 820.411741867746, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 2 - }, - { - "x": 216.82070899332425, - "y": 861.2972567363842, - "frameIndex": 138, - "frameTimestamp": 5520.000000000001, - "objectId": 0 - }, - { - "x": 258.1699190871715, - "y": 58.23181674685754, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 10 - }, - { - "x": 533.5068972541824, - "y": 32.85381637749557, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 14 - }, - { - "x": 510.828840464173, - "y": 261.713841577198, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 13 - }, - { - "x": 281.6379014317391, - "y": -355.89378874808693, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 11 - }, - { - "x": -40.86116157510912, - "y": 432.148710605729, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 12 - }, - { - "x": 191.08384924737612, - "y": 915.1269022768981, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 5 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 9 - }, - { - "x": 545.0606189402529, - "y": 687.5782116429568, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 7 - }, - { - "x": 429.63033869573724, - "y": 97.30433568007975, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 4 - }, - { - "x": 415.3550251069944, - "y": 736.6833358671278, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 6 - }, - { - "x": -62.79734721944553, - "y": 508.0798150282426, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 8 - }, - { - "x": 42.500886151507025, - "y": 880.0880894626858, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 3 - }, - { - "x": 106.30677042219926, - "y": 828.1169100429962, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 2 - }, - { - "x": 299.44013311236654, - "y": 821.3328232473932, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 1 - }, - { - "x": 216.82070899332425, - "y": 861.2972567363842, - "frameIndex": 139, - "frameTimestamp": 5560.000000000001, - "objectId": 0 - }, - { - "x": 256.3880359184399, - "y": 61.8943805185119, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 11 - }, - { - "x": 534.1608411857592, - "y": 36.69926072337126, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 12 - }, - { - "x": 281.6379014317391, - "y": -355.89378874808693, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 10 - }, - { - "x": -40.19232657217757, - "y": 432.1585441310264, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 13 - }, - { - "x": 190.69674148081455, - "y": 915.1224993263637, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 9 - }, - { - "x": 545.4791859183333, - "y": 686.3009242627484, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 8 - }, - { - "x": 430.0620362381541, - "y": 97.31170840169212, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 4 - }, - { - "x": 416.31269516405035, - "y": 735.5532688716507, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 6 - }, - { - "x": -62.79734721944553, - "y": 508.0798150282426, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 7 - }, - { - "x": 41.48245990393509, - "y": 880.0762704333672, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 1 - }, - { - "x": 108.05082174964006, - "y": 832.6104318248057, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 2 - }, - { - "x": 299.82491217553127, - "y": 822.256980524406, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 3 - }, - { - "x": 216.86194108692848, - "y": 862.1212269357687, - "frameIndex": 140, - "frameTimestamp": 5600.000000000001, - "objectId": 0 - }, - { - "x": 255.06703513043104, - "y": 58.178045558502305, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 9 - }, - { - "x": 533.4672327051844, - "y": 40.50216966198025, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 12 - }, - { - "x": 281.6379014317391, - "y": -355.89378874808693, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 11 - }, - { - "x": 190.30963163410826, - "y": 915.1180963521697, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 4 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 7 - }, - { - "x": 430.92542354931845, - "y": 97.32645371215486, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 5 - }, - { - "x": 416.06673753299265, - "y": 735.5501599478567, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 6 - }, - { - "x": -62.25850925717635, - "y": 509.90941186898436, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 8 - }, - { - "x": 40.464019273570514, - "y": 880.0644512371337, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 1 - }, - { - "x": 108.65790431473896, - "y": 833.5058151726033, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 2 - }, - { - "x": 299.82491217553127, - "y": 822.256980524406, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 3 - }, - { - "x": 216.6529231119233, - "y": 862.1187722371075, - "frameIndex": 141, - "frameTimestamp": 5640.0, - "objectId": 0 - }, - { - "x": 254.1804722980552, - "y": 58.1626819362357, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 11 - }, - { - "x": 534.1608411857592, - "y": 36.69926072337126, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 12 - }, - { - "x": 282.11090400154757, - "y": -349.9084272745541, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 10 - }, - { - "x": 190.11607593069562, - "y": 915.1158948562005, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 9 - }, - { - "x": 545.0606189402529, - "y": 687.5782116429568, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 8 - }, - { - "x": 430.92542354931845, - "y": 97.32645371215486, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 4 - }, - { - "x": 416.31269516405035, - "y": 735.5532688716507, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 6 - }, - { - "x": -62.25850925717635, - "y": 509.90941186898436, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 7 - }, - { - "x": 39.24187153141772, - "y": 880.0502679813202, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 2 - }, - { - "x": 108.87521116601168, - "y": 833.5084084343853, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 1 - }, - { - "x": 299.32713655662735, - "y": 823.1682967876162, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 3 - }, - { - "x": 216.6529231119233, - "y": 862.1187722371075, - "frameIndex": 142, - "frameTimestamp": 5680.0, - "objectId": 0 - }, - { - "x": 252.40731388663136, - "y": 58.13195412422155, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 9 - }, - { - "x": 534.8578859061288, - "y": 32.877511607056654, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 12 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 13 - }, - { - "x": 281.54877315526215, - "y": -349.91976367952816, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 11 - }, - { - "x": 189.72896296374068, - "y": 915.111491846517, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 5 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 7 - }, - { - "x": 431.78880049574593, - "y": 97.34119884560403, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 4 - }, - { - "x": 417.0505630108782, - "y": 735.5625955792462, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 6 - }, - { - "x": -62.25850925717635, - "y": 509.90941186898436, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 8 - }, - { - "x": 38.83448434801799, - "y": 880.0455401759676, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 1 - }, - { - "x": 109.13865377090892, - "y": 832.6234203225678, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 2 - }, - { - "x": 298.44550489482754, - "y": 823.1576984752608, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 3 - }, - { - "x": 216.6529231119233, - "y": 862.1187722371075, - "frameIndex": 143, - "frameTimestamp": 5720.0, - "objectId": 0 - }, - { - "x": 250.63927893448397, - "y": 61.79490531256222, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 8 - }, - { - "x": 536.7149482738495, - "y": 25.18489191182689, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 14 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 12 - }, - { - "x": 281.54877315526215, - "y": -349.91976367952816, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 11 - }, - { - "x": 189.5354057001943, - "y": 915.1092903328027, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 5 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 10 - }, - { - "x": 545.0606189402529, - "y": 687.5782116429568, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 7 - }, - { - "x": 432.6521670776231, - "y": 97.35594380204283, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 4 - }, - { - "x": 417.76552083154206, - "y": 734.426384183295, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 6 - }, - { - "x": -61.41032188510316, - "y": 511.7371740218704, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 9 - }, - { - "x": 38.59534669044381, - "y": 879.2636080576573, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 2 - }, - { - "x": 110.05619210276302, - "y": 831.7441294015604, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 1 - }, - { - "x": 297.39747673989604, - "y": 822.2277842561216, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 3 - }, - { - "x": 216.6529231119233, - "y": 862.1187722371075, - "frameIndex": 144, - "frameTimestamp": 5760.0, - "objectId": 0 - }, - { - "x": 250.19080447026232, - "y": 58.093543295141146, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 7 - }, - { - "x": 537.620062838653, - "y": 25.200815523522596, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 13 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 12 - }, - { - "x": 281.54877315526215, - "y": -349.91976367952816, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 11 - }, - { - "x": 189.34184791659908, - "y": 915.1070888131734, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 6 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 10 - }, - { - "x": 545.0606189402529, - "y": 687.5782116429568, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 8 - }, - { - "x": 433.50993307733535, - "y": 90.28842821336637, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 4 - }, - { - "x": 418.25809024742057, - "y": 734.4326142209145, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 5 - }, - { - "x": -61.721508356462444, - "y": 511.732771060835, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 9 - }, - { - "x": 38.630789893304275, - "y": 880.0431762632759, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 2 - }, - { - "x": 111.31426856224977, - "y": 832.6493967300431, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 1 - }, - { - "x": 296.9561160480067, - "y": 822.2224757379291, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 3 - }, - { - "x": 216.6529231119233, - "y": 862.1187722371075, - "frameIndex": 145, - "frameTimestamp": 5800.0, - "objectId": 0 - }, - { - "x": 248.87033829574878, - "y": 61.764295959124354, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 8 - }, - { - "x": 538.0726158463245, - "y": 25.208777254165383, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 13 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 14 - }, - { - "x": 281.54877315526215, - "y": -349.91976367952816, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 11 - }, - { - "x": 189.34184791659908, - "y": 915.1070888131734, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 5 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 10 - }, - { - "x": 544.8006779932672, - "y": 687.5748362581618, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 7 - }, - { - "x": 433.94366826093, - "y": 90.2958570907535, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 4 - }, - { - "x": 417.78842328827915, - "y": 735.5719221911638, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 6 - }, - { - "x": -61.721508356462444, - "y": 511.732771060835, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 9 - }, - { - "x": 38.427094863244676, - "y": 880.0408123439071, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 3 - }, - { - "x": 112.01656021402809, - "y": 831.7675479125703, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 2 - }, - { - "x": 296.0733865460153, - "y": 822.211858603902, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 1 - }, - { - "x": 216.6529231119233, - "y": 862.1187722371075, - "frameIndex": 146, - "frameTimestamp": 5840.0, - "objectId": 0 - }, - { - "x": 247.08757666446738, - "y": 58.039766148080226, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 7 - }, - { - "x": 538.0726158463245, - "y": 25.208777254165383, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 14 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 13 - }, - { - "x": 281.54877315526215, - "y": -349.91976367952816, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 12 - }, - { - "x": 189.5354057001943, - "y": 915.1092903328027, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 5 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 10 - }, - { - "x": 544.5407361060236, - "y": 687.5714608611578, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 8 - }, - { - "x": 433.94366826093, - "y": 90.2958570907535, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 4 - }, - { - "x": 417.54247070351903, - "y": 735.5688133311554, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 6 - }, - { - "x": -62.03269616969209, - "y": 511.72836808081365, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 9 - }, - { - "x": 38.1875011311649, - "y": 879.2588727295354, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 2 - }, - { - "x": 113.22121061844341, - "y": 833.5602720282769, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 0 - }, - { - "x": 295.3082105955647, - "y": 824.0350945215332, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 3 - }, - { - "x": 216.6529231119233, - "y": 862.1187722371075, - "frameIndex": 147, - "frameTimestamp": 5880.0, - "objectId": 1 - }, - { - "x": 247.08757666446738, - "y": 58.039766148080226, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 8 - }, - { - "x": 538.9777133123418, - "y": 25.224700565043445, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 14 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 13 - }, - { - "x": 281.0740260525848, - "y": -355.90518373675684, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 12 - }, - { - "x": 189.72896296374068, - "y": 915.111491846517, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 5 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 11 - }, - { - "x": 544.2807932785165, - "y": 687.5680854519441, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 7 - }, - { - "x": 433.94366826093, - "y": 90.2958570907535, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 4 - }, - { - "x": 417.02666038284383, - "y": 734.4170390468685, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 6 - }, - { - "x": -62.88195129692901, - "y": 509.90058297716683, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 9 - }, - { - "x": 37.81600632096662, - "y": 880.033720545738, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 2 - }, - { - "x": 58.851588228389595, - "y": 161.64802750553136, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 10 - }, - { - "x": 113.60434593732435, - "y": 834.4508364137823, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 0 - }, - { - "x": 293.9584170026559, - "y": 828.5614703893089, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 3 - }, - { - "x": 216.86194108692848, - "y": 862.1212269357687, - "frameIndex": 148, - "frameTimestamp": 5920.0, - "objectId": 1 - }, - { - "x": 245.75758095192288, - "y": 58.01671808989687, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 8 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 13 - }, - { - "x": 281.54877315526215, - "y": -349.91976367952816, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 12 - }, - { - "x": 189.92251970724047, - "y": 915.1136933543163, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 4 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 11 - }, - { - "x": 543.7609048026925, - "y": 687.5613345968881, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 7 - }, - { - "x": 434.3759184213046, - "y": 83.15318979155772, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 5 - }, - { - "x": 416.8046079029887, - "y": 735.5594866873455, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 6 - }, - { - "x": -62.88195129692901, - "y": 509.90058297716683, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 9 - }, - { - "x": 37.3718030929526, - "y": 879.2494019929504, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 1 - }, - { - "x": 58.43828034790791, - "y": 161.64117140710061, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 10 - }, - { - "x": 114.91179568309501, - "y": 837.9893953750283, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 0 - }, - { - "x": 293.27731353853454, - "y": 833.0416451408774, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 3 - }, - { - "x": 216.86194108692848, - "y": 862.1212269357687, - "frameIndex": 149, - "frameTimestamp": 5960.0, - "objectId": 2 - }, - { - "x": 247.10135420198594, - "y": 61.73368585375027, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 8 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 12 - }, - { - "x": 281.0740260525848, - "y": -355.90518373675684, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 13 - }, - { - "x": 190.50318681748058, - "y": 915.1202978422243, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 4 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 11 - }, - { - "x": 542.9810650368544, - "y": 687.5512082227312, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 7 - }, - { - "x": 433.9383107340262, - "y": 79.54483950249605, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 5 - }, - { - "x": 416.8046079029887, - "y": 735.5594866873455, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 6 - }, - { - "x": -62.88195129692901, - "y": 509.90058297716683, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 10 - }, - { - "x": 37.3718030929526, - "y": 879.2494019929504, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 2 - }, - { - "x": 58.02497009835106, - "y": 161.63431526937092, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 9 - }, - { - "x": 115.61522764593597, - "y": 840.6181657617796, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 0 - }, - { - "x": 292.7730212055381, - "y": 838.3513529467118, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 3 - }, - { - "x": 216.86194108692848, - "y": 862.1212269357687, - "frameIndex": 150, - "frameTimestamp": 6000.0, - "objectId": 1 - }, - { - "x": 246.65910138850958, - "y": 61.72603320991343, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 9 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 12 - }, - { - "x": 281.6379014317391, - "y": -355.89378874808693, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 13 - }, - { - "x": 191.08384924737612, - "y": 915.1269022768981, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 4 - }, - { - "x": 537.3795038338907, - "y": 625.8625359918495, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 11 - }, - { - "x": 542.2012168083718, - "y": 687.5410817386849, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 7 - }, - { - "x": 433.93650767501634, - "y": 75.92661798419812, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 5 - }, - { - "x": 416.8046079029887, - "y": 735.5594866873455, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 6 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 10 - }, - { - "x": 37.16787714179053, - "y": 879.2470342920664, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 2 - }, - { - "x": 57.640483180484104, - "y": 164.8263185223916, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 8 - }, - { - "x": 116.47401213886225, - "y": 844.0935064247988, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 0 - }, - { - "x": 292.67833799620104, - "y": 840.1053604004085, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 3 - }, - { - "x": 216.86194108692848, - "y": 862.1212269357687, - "frameIndex": 151, - "frameTimestamp": 6040.0, - "objectId": 1 - }, - { - "x": 245.75758095192288, - "y": 58.01671808989687, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 9 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 12 - }, - { - "x": 281.54877315526215, - "y": -349.91976367952816, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 13 - }, - { - "x": 191.4709549338097, - "y": 915.1313052037733, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 14 - }, - { - "x": 537.3795038338907, - "y": 625.8625359918495, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 11 - }, - { - "x": 541.7879198924325, - "y": 688.8147997707955, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 6 - }, - { - "x": 432.6227495333011, - "y": 75.90398511209371, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 5 - }, - { - "x": 416.78037187995903, - "y": 734.4139239800601, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 4 - }, - { - "x": -62.343885324800716, - "y": 511.7239650818063, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 10 - }, - { - "x": 36.72244930371863, - "y": 878.4609542853689, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 2 - }, - { - "x": 56.371705408964786, - "y": 161.60689032545457, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 7 - }, - { - "x": 117.32475968731059, - "y": 847.5363230725608, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 0 - }, - { - "x": 292.15417756825707, - "y": 841.8459736921855, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 3 - }, - { - "x": 217.07095845537557, - "y": 862.1236816273065, - "frameIndex": 152, - "frameTimestamp": 6080.0, - "objectId": 1 - }, - { - "x": 244.85165053375115, - "y": 54.28925805523572, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 8 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 12 - }, - { - "x": 281.54877315526215, - "y": -349.91976367952816, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 14 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 11 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 7 - }, - { - "x": 432.6177636906016, - "y": 72.2681924554417, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 4 - }, - { - "x": 416.75607007141275, - "y": 733.2652517925477, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 5 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 10 - }, - { - "x": 36.72244930371863, - "y": 878.4609542853689, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 0 - }, - { - "x": 55.54505884929107, - "y": 161.59317761769327, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 9 - }, - { - "x": 117.42807259140983, - "y": 849.2419040221968, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 2 - }, - { - "x": 291.2488901824771, - "y": 842.7055503888762, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 3 - }, - { - "x": 216.86194108692848, - "y": 862.1212269357687, - "frameIndex": 153, - "frameTimestamp": 6120.0, - "objectId": 1 - }, - { - "x": 88.42065037915614, - "y": 36.52811464229831, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 5 - }, - { - "x": 243.05024096878165, - "y": 50.52803244843594, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 6 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 12 - }, - { - "x": 281.54877315526215, - "y": -349.91976367952816, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 14 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 13 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 8 - }, - { - "x": 431.7397954845637, - "y": 72.25304499693632, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 4 - }, - { - "x": 418.1234000040214, - "y": 727.4937178510046, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 7 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 9 - }, - { - "x": 36.51829364116322, - "y": 878.4585828120618, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 0 - }, - { - "x": 55.54505884929107, - "y": 161.59317761769327, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 10 - }, - { - "x": 117.90011125521349, - "y": 851.7891668461784, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 3 - }, - { - "x": 289.91679953483083, - "y": 843.5580175982201, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 2 - }, - { - "x": 216.86194108692848, - "y": 862.1212269357687, - "frameIndex": 154, - "frameTimestamp": 6160.0, - "objectId": 1 - }, - { - "x": 87.47896319202503, - "y": 40.30099375813843, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 9 - }, - { - "x": 240.40728208837587, - "y": 54.21212517652941, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 5 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 13 - }, - { - "x": 281.0740260525848, - "y": -355.90518373675684, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 14 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 12 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 7 - }, - { - "x": 431.30080736227217, - "y": 72.24547119833964, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 4 - }, - { - "x": 418.10073661532635, - "y": 726.3261581111416, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 6 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 8 - }, - { - "x": 36.76002350951863, - "y": 879.2422988702126, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 0 - }, - { - "x": 53.928963493108576, - "y": 164.7648328258988, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 11 - }, - { - "x": 117.7900032285877, - "y": 853.4725036986891, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 2 - }, - { - "x": 289.27340763683594, - "y": 843.5503748441846, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 3 - }, - { - "x": 216.86194108692848, - "y": 862.1212269357687, - "frameIndex": 155, - "frameTimestamp": 6200.0, - "objectId": 1 - }, - { - "x": 87.92764039970405, - "y": 40.30881566867223, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 10 - }, - { - "x": 239.9628301578118, - "y": 54.2044116268379, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 5 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 11 - }, - { - "x": 281.0740260525848, - "y": -355.90518373675684, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 13 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 12 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 8 - }, - { - "x": 429.9838269180133, - "y": 72.22274952516906, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 4 - }, - { - "x": 417.852093095246, - "y": 726.3229992496957, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 6 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 7 - }, - { - "x": 36.76002350951863, - "y": 879.2422988702126, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 0 - }, - { - "x": 51.45451089828578, - "y": 164.72384060329284, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 9 - }, - { - "x": 118.10240215486276, - "y": 855.1530310196902, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 2 - }, - { - "x": 288.4997174527757, - "y": 841.8025187891682, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 3 - }, - { - "x": 216.86194108692848, - "y": 862.1212269357687, - "frameIndex": 156, - "frameTimestamp": 6240.0, - "objectId": 1 - }, - { - "x": 91.56902825885548, - "y": 36.583083904981805, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 9 - }, - { - "x": 237.33370430994012, - "y": 57.870737168949674, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 5 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 12 - }, - { - "x": 281.0740260525848, - "y": -355.90518373675684, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 14 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 11 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 7 - }, - { - "x": 428.66682235716206, - "y": 72.2000274359184, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 4 - }, - { - "x": 418.3045483110913, - "y": 723.9845983879333, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 6 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 8 - }, - { - "x": 36.31413740066202, - "y": 878.4562113320412, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 0 - }, - { - "x": 50.62967449703688, - "y": 164.71017621649304, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 10 - }, - { - "x": 117.68040425721941, - "y": 855.1480580897277, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 2 - }, - { - "x": 288.67230048694023, - "y": 842.6749279350529, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 3 - }, - { - "x": 217.07095845537557, - "y": 862.1236816273065, - "frameIndex": 157, - "frameTimestamp": 6280.0, - "objectId": 1 - }, - { - "x": 94.65746343725893, - "y": 40.42613848518148, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 8 - }, - { - "x": 235.962639343992, - "y": 54.13498753731046, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 4 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 12 - }, - { - "x": 281.54877315526215, - "y": -349.91976367952816, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 13 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 11 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 7 - }, - { - "x": 428.2278154775213, - "y": 72.1924533137039, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 5 - }, - { - "x": 418.94452430663495, - "y": 718.0757250720708, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 6 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 10 - }, - { - "x": 36.5560958284038, - "y": 879.2399311492427, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 0 - }, - { - "x": 48.56754221503985, - "y": 164.67601456566038, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 9 - }, - { - "x": 117.04740277807288, - "y": 855.1405986401913, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 1 - }, - { - "x": 288.67230048694023, - "y": 842.6749279350529, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 3 - }, - { - "x": 217.3206336834812, - "y": 862.948210165597, - "frameIndex": 158, - "frameTimestamp": 6320.0, - "objectId": 2 - }, - { - "x": 97.21732290747957, - "y": 47.993297070035744, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 8 - }, - { - "x": 235.03041426968286, - "y": 50.388639102042895, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 5 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 13 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 12 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 9 - }, - { - "x": 427.3497936790566, - "y": 72.17730493057613, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 7 - }, - { - "x": 420.2916821442589, - "y": 708.4538725024099, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 4 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 10 - }, - { - "x": 36.31413740066202, - "y": 878.4562113320412, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 0 - }, - { - "x": 47.330234539518, - "y": 164.65551710623316, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 11 - }, - { - "x": 117.04740277807288, - "y": 855.1405986401913, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 2 - }, - { - "x": 288.457580516302, - "y": 842.6723760144281, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 3 - }, - { - "x": 216.48552126927044, - "y": 862.9384074021212, - "frameIndex": 159, - "frameTimestamp": 6360.0, - "objectId": 1 - }, - { - "x": 99.00299594984838, - "y": 48.02433401762565, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 8 - }, - { - "x": 234.58484215438517, - "y": 50.38089457207464, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 6 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 13 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 12 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 9 - }, - { - "x": 426.9107787601837, - "y": 72.16973066966202, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 10 - }, - { - "x": 421.46857273762157, - "y": 702.3344532658134, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 4 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 7 - }, - { - "x": 36.31413740066202, - "y": 878.4562113320412, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 0 - }, - { - "x": 45.680457946977924, - "y": 164.6281866132292, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 11 - }, - { - "x": 116.62539870348915, - "y": 855.1356256374384, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 2 - }, - { - "x": 288.37360403805064, - "y": 844.4059511737055, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 3 - }, - { - "x": 214.56271000060028, - "y": 862.0942248587016, - "frameIndex": 160, - "frameTimestamp": 6400.0, - "objectId": 1 - }, - { - "x": 101.2350250506485, - "y": 48.06312912097149, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 9 - }, - { - "x": 234.1392672823308, - "y": 50.37314999419107, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 5 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 13 - }, - { - "x": 201.92202224039215, - "y": 915.2501752868804, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 6 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 12 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 8 - }, - { - "x": 426.8919464843305, - "y": 68.5159434555605, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 10 - }, - { - "x": 421.9259702453795, - "y": 698.6180469057198, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 4 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 7 - }, - { - "x": 36.31413740066202, - "y": 878.4562113320412, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 0 - }, - { - "x": 44.91305957657662, - "y": 167.79972601155131, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 11 - }, - { - "x": 115.83392246451713, - "y": 854.288834847519, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 2 - }, - { - "x": 288.37360403805064, - "y": 844.4059511737055, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 3 - }, - { - "x": 214.14466009937547, - "y": 862.0893152975365, - "frameIndex": 161, - "frameTimestamp": 6440.0, - "objectId": 1 - }, - { - "x": 104.19439027523792, - "y": 55.56350968888346, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 5 - }, - { - "x": 234.18470543682773, - "y": 54.10413114858057, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 8 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 13 - }, - { - "x": 203.276679215792, - "y": 915.2655831091176, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 6 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 11 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 9 - }, - { - "x": 426.8919464843305, - "y": 68.5159434555605, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 10 - }, - { - "x": 422.6279484812111, - "y": 693.6147118923299, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 4 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 7 - }, - { - "x": 36.31413740066202, - "y": 878.4562113320412, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 0 - }, - { - "x": 45.901544264257176, - "y": 177.2832712302179, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 12 - }, - { - "x": 115.62267293912235, - "y": 854.2863442024282, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 2 - }, - { - "x": 288.587818983114, - "y": 844.4084945114815, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 3 - }, - { - "x": 213.77133905050636, - "y": 862.906547635857, - "frameIndex": 162, - "frameTimestamp": 6480.0, - "objectId": 1 - }, - { - "x": 107.93069770279047, - "y": 48.1795072239348, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 9 - }, - { - "x": 233.74021510173617, - "y": 54.09641693237089, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 5 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 12 - }, - { - "x": 496.5044076684393, - "y": 255.88052356637698, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 14 - }, - { - "x": 204.24427574403606, - "y": 915.2765885190292, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 8 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 11 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 6 - }, - { - "x": 426.8919464843305, - "y": 68.5159434555605, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 10 - }, - { - "x": 422.86932295041356, - "y": 692.3558247200646, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 4 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 7 - }, - { - "x": 36.10998058221269, - "y": 878.4538398453072, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 0 - }, - { - "x": 46.010609689823994, - "y": 183.52622740372473, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 13 - }, - { - "x": 115.04060307155305, - "y": 853.4400720895884, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 2 - }, - { - "x": 288.20107502867825, - "y": 843.5376367690023, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 3 - }, - { - "x": 213.39887044166247, - "y": 863.7219139086096, - "frameIndex": 163, - "frameTimestamp": 6520.000000000001, - "objectId": 1 - }, - { - "x": 106.05801073858436, - "y": 51.88046744412549, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 10 - }, - { - "x": 232.80252612537052, - "y": 50.349915973042975, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 6 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 12 - }, - { - "x": 495.73339634185754, - "y": 255.86820016070945, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 14 - }, - { - "x": 205.59888904827704, - "y": 915.291995844552, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 5 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 11 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 7 - }, - { - "x": 426.451865542146, - "y": 68.50833962513563, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 9 - }, - { - "x": 422.86932295041356, - "y": 692.3558247200646, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 4 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 8 - }, - { - "x": 35.905823185812665, - "y": 878.4514683518597, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 0 - }, - { - "x": 45.658748009485244, - "y": 186.6202235605267, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 13 - }, - { - "x": 115.04060307155305, - "y": 853.4400720895884, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 2 - }, - { - "x": 287.986606590296, - "y": 843.5350891311969, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 3 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 164, - "frameTimestamp": 6560.000000000001, - "objectId": 1 - }, - { - "x": 109.62016353112269, - "y": 51.94228929860428, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 14 - }, - { - "x": 233.34310300517888, - "y": 57.801582351237954, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 6 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 13 - }, - { - "x": 494.4500061791186, - "y": 258.65612728206264, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 11 - }, - { - "x": 206.17942980907284, - "y": 915.2985988953658, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 5 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 12 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 7 - }, - { - "x": 425.99072116058954, - "y": 64.8291474761623, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 9 - }, - { - "x": 422.61079200537824, - "y": 692.3524790826973, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 4 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 8 - }, - { - "x": 35.905823185812665, - "y": 878.4514683518597, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 0 - }, - { - "x": 44.382853928704584, - "y": 183.49947493857854, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 10 - }, - { - "x": 115.25209911479246, - "y": 853.4425668726715, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 2 - }, - { - "x": 287.55766779675827, - "y": 843.5299938328172, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 3 - }, - { - "x": 213.2355631123425, - "y": 864.5378633486816, - "frameIndex": 165, - "frameTimestamp": 6600.000000000001, - "objectId": 1 - }, - { - "x": 232.30690867224024, - "y": 46.59277211255537, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 8 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 13 - }, - { - "x": 493.17202086424567, - "y": 261.4323133737659, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 11 - }, - { - "x": 207.09849185686994, - "y": 914.6034287485024, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 4 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 12 - }, - { - "x": 541.4213601171068, - "y": 687.5309551447478, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 6 - }, - { - "x": 424.66724845942326, - "y": 64.80624640034985, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 7 - }, - { - "x": 423.1278529661588, - "y": 692.3591703454056, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 5 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 9 - }, - { - "x": 35.70166521145959, - "y": 878.4490968516986, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 0 - }, - { - "x": 44.44064216623045, - "y": 186.60022994748115, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 10 - }, - { - "x": 115.46359453744391, - "y": 853.4450616484345, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 2 - }, - { - "x": 287.59869422946844, - "y": 842.6621682558149, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 3 - }, - { - "x": 212.9817705367619, - "y": 863.7170202565202, - "frameIndex": 166, - "frameTimestamp": 6640.000000000001, - "objectId": 1 - }, - { - "x": 233.29572202327347, - "y": 54.08870266854961, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 7 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 15 - }, - { - "x": 521.763300589627, - "y": -333.25351213932703, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 14 - }, - { - "x": 492.28249308744245, - "y": 264.2029331351261, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 10 - }, - { - "x": 208.30803923587513, - "y": 915.3228096263894, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 4 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 12 - }, - { - "x": 540.7495908872841, - "y": 688.8013261029682, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 5 - }, - { - "x": 424.66724845942326, - "y": 64.80624640034985, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 9 - }, - { - "x": 423.84171977847757, - "y": 687.2842945899486, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 8 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 6 - }, - { - "x": 35.49750665915093, - "y": 878.4467253448241, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 0 - }, - { - "x": 44.03460231269246, - "y": 186.59356533474855, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 11 - }, - { - "x": 116.25641965787561, - "y": 854.2938161158011, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 2 - }, - { - "x": 287.38397105667553, - "y": 842.6596162971327, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 3 - }, - { - "x": 212.81893899817436, - "y": 864.5329776441681, - "frameIndex": 167, - "frameTimestamp": 6680.0, - "objectId": 1 - }, - { - "x": 232.85122620141448, - "y": 54.08098835711602, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 5 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 16 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 14 - }, - { - "x": 491.0144156327648, - "y": 266.9558384742549, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 10 - }, - { - "x": 208.88855816267537, - "y": 915.3294124288639, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 4 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 12 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 6 - }, - { - "x": 425.08509798958534, - "y": 61.124360473674564, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 11 - }, - { - "x": 423.33794337333586, - "y": 688.5542383309413, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 8 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 7 - }, - { - "x": 35.49750665915093, - "y": 878.4467253448241, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 1 - }, - { - "x": 43.22251574682108, - "y": 186.58023599670503, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 9 - }, - { - "x": 117.41503820443758, - "y": 855.9804513237128, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 2 - }, - { - "x": 287.20986370726513, - "y": 841.7871812378892, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 3 - }, - { - "x": 212.81893899817436, - "y": 864.5329776441681, - "frameIndex": 168, - "frameTimestamp": 6720.0, - "objectId": 0 - }, - { - "x": 115.8535073536521, - "y": 52.05047019289948, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 13 - }, - { - "x": 232.40672763613355, - "y": 54.073273998069936, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 4 - }, - { - "x": 515.1674072669766, - "y": 587.5115260753756, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 16 - }, - { - "x": 521.763300589627, - "y": -333.25351213932703, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 14 - }, - { - "x": 491.7789832406435, - "y": 266.96799952595734, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 9 - }, - { - "x": 209.46907241092242, - "y": 915.3360151781247, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 6 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 12 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 5 - }, - { - "x": 423.7583877296756, - "y": 61.10136935048952, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 11 - }, - { - "x": 420.2428712123329, - "y": 689.7869691485414, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 10 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 8 - }, - { - "x": 35.49750665915093, - "y": 878.4467253448241, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 1 - }, - { - "x": 42.410420035760346, - "y": 186.56690650855526, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 7 - }, - { - "x": 118.20284735358688, - "y": 856.8233187388867, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 2 - }, - { - "x": 286.779907323151, - "y": 841.7820686597291, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 3 - }, - { - "x": 212.61062603740731, - "y": 864.5305347813137, - "frameIndex": 169, - "frameTimestamp": 6760.0, - "objectId": 0 - }, - { - "x": 117.8480351064935, - "y": 59.49711530944253, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 11 - }, - { - "x": 231.51772227520493, - "y": 54.05784513713802, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 5 - }, - { - "x": 516.7431955509328, - "y": 585.9478483884667, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 16 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 14 - }, - { - "x": 492.6655778073255, - "y": 264.20903378880826, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 9 - }, - { - "x": -35.84505016533641, - "y": 432.2224598237365, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 15 - }, - { - "x": 210.43658576136983, - "y": 915.3470196419753, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 4 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 10 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 6 - }, - { - "x": 422.84508100409494, - "y": 57.37836865705473, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 13 - }, - { - "x": 421.2030193375802, - "y": 684.6860644248337, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 12 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 7 - }, - { - "x": 35.49750665915093, - "y": 878.4467253448241, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 1 - }, - { - "x": 40.786201177453016, - "y": 186.5402470819266, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 8 - }, - { - "x": 118.56829845339858, - "y": 857.6592862996887, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 2 - }, - { - "x": 286.52507196108024, - "y": 842.6494083862887, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 3 - }, - { - "x": 212.5646682165266, - "y": 863.7121265760928, - "frameIndex": 170, - "frameTimestamp": 6800.0, - "objectId": 0 - }, - { - "x": 120.62821071162729, - "y": 55.848298313402275, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 9 - }, - { - "x": 231.9113515698103, - "y": 50.33442638602559, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 4 - }, - { - "x": 515.1674072669766, - "y": 587.5115260753756, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 17 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 15 - }, - { - "x": 489.98394189804213, - "y": 264.1663285303232, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 13 - }, - { - "x": -36.70979426819372, - "y": 430.11164128628064, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 14 - }, - { - "x": 210.63008687198348, - "y": 915.349220517008, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 11 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 6 - }, - { - "x": 421.95842487642875, - "y": 57.36298056752296, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 10 - }, - { - "x": 424.72494667895967, - "y": 673.009665712238, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 12 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 7 - }, - { - "x": 35.70166521145959, - "y": 878.4490968516986, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 1 - }, - { - "x": 39.56801302645151, - "y": 186.5202521179072, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 8 - }, - { - "x": 119.19909861456844, - "y": 857.6667088651261, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 2 - }, - { - "x": 286.31034558606115, - "y": 842.6468563895487, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 3 - }, - { - "x": 212.77321967856238, - "y": 863.7145734198488, - "frameIndex": 171, - "frameTimestamp": 6840.0, - "objectId": 0 - }, - { - "x": 125.51321862531259, - "y": 55.93295268150169, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 9 - }, - { - "x": 231.86022733569834, - "y": 46.58499667841352, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 4 - }, - { - "x": 521.763300589627, - "y": -333.25351213932703, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 16 - }, - { - "x": 489.2177418363825, - "y": 264.1541267353027, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 14 - }, - { - "x": -37.71483836218246, - "y": 430.0968500450364, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 15 - }, - { - "x": 211.0170875337518, - "y": 915.3536222493361, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 11 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 6 - }, - { - "x": 421.104893789585, - "y": 61.05538583178838, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 10 - }, - { - "x": 426.4543756762583, - "y": 659.6427697495562, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 12 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 7 - }, - { - "x": 35.70166521145959, - "y": 878.4490968516986, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 1 - }, - { - "x": 36.49954194819446, - "y": 177.12834073186457, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 8 - }, - { - "x": 119.19909861456844, - "y": 857.6667088651261, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 2 - }, - { - "x": 286.31034558606115, - "y": 842.6468563895487, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 3 - }, - { - "x": 212.77321967856238, - "y": 863.7145734198488, - "frameIndex": 172, - "frameTimestamp": 6880.0, - "objectId": 0 - }, - { - "x": 161.4623679884579, - "y": -63.34392199896211, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 9 - }, - { - "x": 128.03736378726177, - "y": 59.67342917552466, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 8 - }, - { - "x": 232.80252612537052, - "y": 50.349915973042975, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 4 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 16 - }, - { - "x": 489.2177418363825, - "y": 264.1541267353027, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 13 - }, - { - "x": -36.513844872191186, - "y": 432.2126268908909, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 15 - }, - { - "x": 210.82358746277683, - "y": 915.3514213861283, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 5 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 12 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 6 - }, - { - "x": 420.6626352818348, - "y": 61.04772174706806, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 14 - }, - { - "x": 427.1810213110691, - "y": 650.0422400960052, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 11 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 7 - }, - { - "x": 35.70166521145959, - "y": 878.4490968516986, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 1 - }, - { - "x": 36.983090750616206, - "y": 180.26405106559062, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 10 - }, - { - "x": 119.61962898830502, - "y": 857.6716572059946, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 2 - }, - { - "x": 286.52507196108024, - "y": 842.6494083862887, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 3 - }, - { - "x": 212.77321967856238, - "y": 863.7145734198488, - "frameIndex": 173, - "frameTimestamp": 6920.0, - "objectId": 0 - }, - { - "x": 165.54243570272746, - "y": -67.59248110324305, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 15 - }, - { - "x": 129.95384760931026, - "y": 56.009906219192146, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 7 - }, - { - "x": 226.05311784058512, - "y": 46.48391164588688, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 6 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 16 - }, - { - "x": 487.9560638850679, - "y": 266.90719297404723, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 12 - }, - { - "x": -36.513844872191186, - "y": 432.2126268908909, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 14 - }, - { - "x": 210.82358746277683, - "y": 915.3514213861283, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 4 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 10 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 5 - }, - { - "x": 419.7781101080499, - "y": 61.03239343624894, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 9 - }, - { - "x": 425.81355668009587, - "y": 648.6348619034113, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 11 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 8 - }, - { - "x": 35.70166521145959, - "y": 878.4490968516986, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 2 - }, - { - "x": 35.194358588465484, - "y": 173.96502362392405, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 13 - }, - { - "x": 120.25041994839849, - "y": 857.6790796631636, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 1 - }, - { - "x": 286.52507196108024, - "y": 842.6494083862887, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 3 - }, - { - "x": 212.77321967856238, - "y": 863.7145734198488, - "frameIndex": 174, - "frameTimestamp": 6960.0, - "objectId": 0 - }, - { - "x": 171.99547231887598, - "y": -63.15262574226302, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 11 - }, - { - "x": 132.02410030415123, - "y": 59.742414773140176, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 7 - }, - { - "x": 230.57456905957838, - "y": 50.311191646112604, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 5 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 16 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 17 - }, - { - "x": 488.45153360857586, - "y": 264.1419248102358, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 14 - }, - { - "x": -36.37478268117029, - "y": 430.11657165424447, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 15 - }, - { - "x": 210.82358746277683, - "y": 915.3514213861283, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 4 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 12 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 6 - }, - { - "x": 419.335843441965, - "y": 61.02472921014939, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 10 - }, - { - "x": 424.18601034425166, - "y": 648.6133047819259, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 9 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 8 - }, - { - "x": 35.70166521145959, - "y": 878.4490968516986, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 2 - }, - { - "x": 32.97787247315412, - "y": 167.60226908397226, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 13 - }, - { - "x": 121.09146597434803, - "y": 857.6889761716741, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 0 - }, - { - "x": 286.52507196108024, - "y": 842.6494083862887, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 3 - }, - { - "x": 212.9817705367619, - "y": 863.7170202565202, - "frameIndex": 175, - "frameTimestamp": 7000.0, - "objectId": 1 - }, - { - "x": 177.93669419869445, - "y": -58.745072489337545, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 12 - }, - { - "x": 132.02410030415123, - "y": 59.742414773140176, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 6 - }, - { - "x": 230.41055771444357, - "y": 39.007194604410465, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 11 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 16 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 15 - }, - { - "x": 487.7973452724582, - "y": 261.3466171500024, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 14 - }, - { - "x": -37.37982210868899, - "y": 430.1017804816766, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 17 - }, - { - "x": 211.21058708491063, - "y": 915.3558231066315, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 4 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 10 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 7 - }, - { - "x": 418.4513019512853, - "y": 61.009400616567895, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 9 - }, - { - "x": 424.3803439795082, - "y": 641.6067307998028, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 5 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 8 - }, - { - "x": 35.70166521145959, - "y": 878.4490968516986, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 2 - }, - { - "x": 32.24061770774955, - "y": 170.76028855204402, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 13 - }, - { - "x": 121.66317447123538, - "y": 858.5254365511872, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 0 - }, - { - "x": 286.5649281681541, - "y": 841.7795123591989, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 3 - }, - { - "x": 213.02725135648524, - "y": 864.5354204999574, - "frameIndex": 176, - "frameTimestamp": 7040.0, - "objectId": 1 - }, - { - "x": 182.4178931915616, - "y": -54.38675977261308, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 14 - }, - { - "x": 131.28598295252272, - "y": 56.03299135594011, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 5 - }, - { - "x": 232.30690867224024, - "y": 46.59277211255537, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 13 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 16 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 17 - }, - { - "x": 487.52511421895576, - "y": 258.5455790223654, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 12 - }, - { - "x": -37.71483836218246, - "y": 430.0968500450364, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 15 - }, - { - "x": 210.82358746277683, - "y": 915.3514213861283, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 6 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 11 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 7 - }, - { - "x": 418.00902712664004, - "y": 61.00173624908508, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 9 - }, - { - "x": 422.50386662270876, - "y": 644.3980928736629, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 4 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 8 - }, - { - "x": 35.70166521145959, - "y": 878.4490968516986, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 1 - }, - { - "x": 31.91641554553911, - "y": 173.91093677585482, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 10 - }, - { - "x": 122.14275970567358, - "y": 857.7013466449156, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 0 - }, - { - "x": 286.52507196108024, - "y": 842.6494083862887, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 3 - }, - { - "x": 212.9817705367619, - "y": 863.7170202565202, - "frameIndex": 177, - "frameTimestamp": 7080.0, - "objectId": 2 - }, - { - "x": 188.13174314778814, - "y": -54.28332818283154, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 14 - }, - { - "x": 131.7300225951642, - "y": 56.040686306700366, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 4 - }, - { - "x": 233.64693605944154, - "y": 46.61609812563223, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 13 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 16 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 17 - }, - { - "x": 487.1403784398058, - "y": 258.53943714014224, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 11 - }, - { - "x": -39.054918931381785, - "y": 430.0771280695487, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 15 - }, - { - "x": 210.63008687198348, - "y": 915.349220517008, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 6 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 10 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 7 - }, - { - "x": 416.23990063210573, - "y": 60.971078307864005, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 9 - }, - { - "x": 419.2570816058136, - "y": 645.756854665919, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 5 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 8 - }, - { - "x": 35.905823185812665, - "y": 878.4514683518597, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 1 - }, - { - "x": 32.90403618087671, - "y": 180.19692299251926, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 12 - }, - { - "x": 123.19403810274413, - "y": 857.7137169377205, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 0 - }, - { - "x": 286.8201117599882, - "y": 840.9101207331067, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 3 - }, - { - "x": 212.9817705367619, - "y": 863.7170202565202, - "frameIndex": 178, - "frameTimestamp": 7120.0, - "objectId": 2 - }, - { - "x": 198.41386840130582, - "y": -45.61069231045358, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 13 - }, - { - "x": 130.09912640631228, - "y": 52.29770568203388, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 3 - }, - { - "x": 232.80252612537052, - "y": 50.349915973042975, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 14 - }, - { - "x": 516.164205758776, - "y": 585.9399222400342, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 17 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 16 - }, - { - "x": 486.7556406016884, - "y": 258.5332952250497, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 12 - }, - { - "x": -38.5202661880566, - "y": 432.18312754549163, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 15 - }, - { - "x": 210.0495819806729, - "y": 915.3426178741726, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 5 - }, - { - "x": 536.1127169993044, - "y": 627.3069321629847, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 11 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 7 - }, - { - "x": 414.91302720475124, - "y": 60.94808435708118, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 9 - }, - { - "x": 416.88816739824995, - "y": 649.9060089471732, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 6 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 8 - }, - { - "x": 35.905823185812665, - "y": 878.4514683518597, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 1 - }, - { - "x": 33.80154581453581, - "y": 183.32556919467766, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 10 - }, - { - "x": 124.24530116589519, - "y": 857.7260870500926, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 0 - }, - { - "x": 286.779907323151, - "y": 841.7820686597291, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 4 - }, - { - "x": 212.9817705367619, - "y": 863.7170202565202, - "frameIndex": 179, - "frameTimestamp": 7160.0, - "objectId": 2 - }, - { - "x": 130.39789545962097, - "y": 56.017601312186564, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 4 - }, - { - "x": 516.164205758776, - "y": 585.9399222400342, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 14 - }, - { - "x": 522.3201193324417, - "y": -333.24232865549527, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 15 - }, - { - "x": 486.37090070458754, - "y": 258.5271532770879, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 12 - }, - { - "x": -38.85467516512872, - "y": 432.1782109081726, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 13 - }, - { - "x": 210.0495819806729, - "y": 915.3426178741726, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 11 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 6 - }, - { - "x": 414.0284313211607, - "y": 60.93275482090193, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 9 - }, - { - "x": 418.9849893877423, - "y": 645.7532454798577, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 10 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 7 - }, - { - "x": 36.10998058221269, - "y": 878.4538398453072, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 1 - }, - { - "x": 36.065888826091694, - "y": 192.62158149639268, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 8 - }, - { - "x": 125.02336226171, - "y": 858.5649562194344, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 0 - }, - { - "x": 287.20986370726513, - "y": 841.7871812378892, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 3 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 180, - "frameTimestamp": 7200.0, - "objectId": 2 - }, - { - "x": 129.20885770309894, - "y": 52.28225489555104, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 4 - }, - { - "x": 486.37090070458754, - "y": 258.5271532770879, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 11 - }, - { - "x": -40.19232657217757, - "y": 432.1585441310264, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 12 - }, - { - "x": 210.43658576136983, - "y": 915.3470196419753, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 5 - }, - { - "x": 536.3901822088209, - "y": 627.3106512274893, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 10 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 6 - }, - { - "x": 414.0284313211607, - "y": 60.93275482090193, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 9 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 7 - }, - { - "x": 36.10998058221269, - "y": 878.4538398453072, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 1 - }, - { - "x": 38.491580073064775, - "y": 192.66129246605652, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 8 - }, - { - "x": 125.44337472068945, - "y": 858.5698960484182, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 0 - }, - { - "x": 287.42484093638797, - "y": 841.7897375155193, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 3 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 181, - "frameTimestamp": 7240.0, - "objectId": 2 - }, - { - "x": 127.87343402810396, - "y": 52.25907835795939, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 3 - }, - { - "x": 485.98615874848645, - "y": 258.5210112962564, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 11 - }, - { - "x": -40.99179017424602, - "y": 434.23729818087014, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 12 - }, - { - "x": 210.24308413093365, - "y": 915.3448187610301, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 5 - }, - { - "x": 538.6501546144972, - "y": 624.413734131703, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 10 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 6 - }, - { - "x": 414.0284313211607, - "y": 60.93275482090193, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 8 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 7 - }, - { - "x": 35.905823185812665, - "y": 878.4514683518597, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 1 - }, - { - "x": 42.31628573542138, - "y": 201.8601903118151, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 9 - }, - { - "x": 126.28339229566377, - "y": 858.5797756200237, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 0 - }, - { - "x": 287.6398175235586, - "y": 841.7922937855157, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 4 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 182, - "frameTimestamp": 7280.0, - "objectId": 2 - }, - { - "x": 125.0238727917741, - "y": 44.72528378972126, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 3 - }, - { - "x": 485.87772089130254, - "y": 261.31600980306587, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 13 - }, - { - "x": -42.99467379053066, - "y": 434.2078798623607, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 14 - }, - { - "x": 210.0495819806729, - "y": 915.3426178741726, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 7 - }, - { - "x": 538.2131564401823, - "y": 625.8737185095298, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 11 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 5 - }, - { - "x": 413.586129299684, - "y": 60.925089982113846, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 8 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 6 - }, - { - "x": 35.905823185812665, - "y": 878.4514683518597, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 2 - }, - { - "x": 44.32419631269329, - "y": 201.8929346045389, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 9 - }, - { - "x": 126.91339905186724, - "y": 858.5871852231625, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 0 - }, - { - "x": 288.88701981715616, - "y": 842.6774798480666, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 4 - }, - { - "x": 213.44387426574883, - "y": 864.5403061903411, - "frameIndex": 183, - "frameTimestamp": 7320.0, - "objectId": 1 - }, - { - "x": 123.55151550980234, - "y": 48.4510140967406, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 4 - }, - { - "x": 486.26164986811335, - "y": 261.3221313378346, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 13 - }, - { - "x": -47.19194336345767, - "y": 425.7377149720044, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 14 - }, - { - "x": 209.46907241092242, - "y": 915.3360151781247, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 10 - }, - { - "x": 538.2131564401823, - "y": 625.8737185095298, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 12 - }, - { - "x": 541.9412655182662, - "y": 687.5377062195827, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 5 - }, - { - "x": 413.19613147979436, - "y": 64.60775275603577, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 8 - }, - { - "x": 426.40478244314716, - "y": 622.9069432220604, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 11 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 6 - }, - { - "x": 36.10998058221269, - "y": 878.4538398453072, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 2 - }, - { - "x": 46.681516859827205, - "y": 198.89945944815298, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 9 - }, - { - "x": 127.33340049650624, - "y": 858.592124922605, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 0 - }, - { - "x": 289.3596071109864, - "y": 841.8127436706891, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 3 - }, - { - "x": 213.44387426574883, - "y": 864.5403061903411, - "frameIndex": 184, - "frameTimestamp": 7360.0, - "objectId": 1 - }, - { - "x": 227.6396606807533, - "y": 61.39692505892856, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 5 - }, - { - "x": 121.32017736974908, - "y": 48.41223100304713, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 4 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 16 - }, - { - "x": 486.9190926539985, - "y": 264.1175205699541, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 11 - }, - { - "x": -48.873428348044705, - "y": 425.7129193807667, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 14 - }, - { - "x": 208.69505237358393, - "y": 915.3272115006182, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 13 - }, - { - "x": 538.2131564401823, - "y": 625.8737185095298, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 12 - }, - { - "x": 541.9412655182662, - "y": 687.5377062195827, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 8 - }, - { - "x": 413.637362117068, - "y": 64.61538771236407, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 6 - }, - { - "x": 425.5404909784898, - "y": 619.9477979832196, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 10 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 7 - }, - { - "x": 36.10998058221269, - "y": 878.4538398453072, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 2 - }, - { - "x": 45.713577505214666, - "y": 189.70715245630657, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 9 - }, - { - "x": 127.5434003009848, - "y": 858.5945947615313, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 0 - }, - { - "x": 289.6616939787105, - "y": 840.0694531191394, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 3 - }, - { - "x": 213.44387426574883, - "y": 864.5403061903411, - "frameIndex": 185, - "frameTimestamp": 7400.0, - "objectId": 1 - }, - { - "x": 231.62088950825992, - "y": 61.46581535271802, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 4 - }, - { - "x": 118.7607623348474, - "y": 44.61626109524817, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 5 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 16 - }, - { - "x": 522.0311398876637, - "y": -339.14087057789715, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 15 - }, - { - "x": 488.45153360857586, - "y": 264.1419248102358, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 12 - }, - { - "x": -50.89443063371846, - "y": 432.00119678741754, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 14 - }, - { - "x": 208.11453188725352, - "y": 915.3206086804058, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 13 - }, - { - "x": 538.2131564401823, - "y": 625.8737185095298, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 11 - }, - { - "x": 541.9412655182662, - "y": 687.5377062195827, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 7 - }, - { - "x": 414.9610377892183, - "y": 64.63829230034106, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 6 - }, - { - "x": 421.625940329851, - "y": 619.8951685266716, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 10 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 9 - }, - { - "x": 36.31413740066202, - "y": 878.4562113320412, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 2 - }, - { - "x": 44.382853928704584, - "y": 183.49947493857854, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 8 - }, - { - "x": 127.9633980742732, - "y": 858.5995344177945, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 0 - }, - { - "x": 289.83330863632267, - "y": 840.9459686820569, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 3 - }, - { - "x": 213.44387426574883, - "y": 864.5403061903411, - "frameIndex": 186, - "frameTimestamp": 7440.0, - "objectId": 1 - }, - { - "x": 234.27491979762007, - "y": 61.511740099644655, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 6 - }, - { - "x": 119.86037231281354, - "y": 52.12001011351732, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 5 - }, - { - "x": 521.206477533036, - "y": -333.2646957097992, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 14 - }, - { - "x": 488.5651806731214, - "y": 261.3588598599456, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 13 - }, - { - "x": 207.53400672229458, - "y": 915.3140058069785, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 11 - }, - { - "x": 537.9352733125747, - "y": 625.8699910180495, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 12 - }, - { - "x": 541.9412655182662, - "y": 687.5377062195827, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 8 - }, - { - "x": 416.72590079378296, - "y": 64.66883109530876, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 4 - }, - { - "x": 419.94821054326536, - "y": 619.8726121684001, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 10 - }, - { - "x": -63.05029777588208, - "y": 513.5235747088814, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 9 - }, - { - "x": 36.10998058221269, - "y": 878.4538398453072, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 3 - }, - { - "x": 45.252715014607524, - "y": 186.6135590603699, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 7 - }, - { - "x": 128.17339604308853, - "y": 858.6020042351314, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 0 - }, - { - "x": 290.0045176144071, - "y": 841.8204122516819, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 2 - }, - { - "x": 213.44387426574883, - "y": 864.5403061903411, - "frameIndex": 187, - "frameTimestamp": 7480.0, - "objectId": 1 - }, - { - "x": 236.044218988226, - "y": 61.54235565738408, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 6 - }, - { - "x": 118.64248041364398, - "y": 48.36568970566716, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 5 - }, - { - "x": 522.0311398876637, - "y": -339.14087057789715, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 14 - }, - { - "x": 488.94909529813293, - "y": 261.36498116588285, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 12 - }, - { - "x": 207.34049729426988, - "y": 915.3118048373437, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 11 - }, - { - "x": 537.9352733125747, - "y": 625.8699910180495, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 13 - }, - { - "x": 541.5283390476008, - "y": 688.811431372089, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 8 - }, - { - "x": 417.60831605724115, - "y": 64.68410021179963, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 4 - }, - { - "x": 419.59893379407197, - "y": 615.4122453811041, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 10 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 9 - }, - { - "x": 36.352167570633206, - "y": 879.2375634215773, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 3 - }, - { - "x": 48.50091496162915, - "y": 186.66687401095064, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 7 - }, - { - "x": 128.3833934000214, - "y": 858.604474045272, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 0 - }, - { - "x": 290.04345256876377, - "y": 845.2899958509312, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 2 - }, - { - "x": 213.44387426574883, - "y": 864.5403061903411, - "frameIndex": 188, - "frameTimestamp": 7520.000000000001, - "objectId": 1 - }, - { - "x": 235.56013102944186, - "y": 57.84000216749388, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 6 - }, - { - "x": 118.19618791580817, - "y": 48.3579326546638, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 3 - }, - { - "x": 522.0311398876637, - "y": -339.14087057789715, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 14 - }, - { - "x": 490.4847332964304, - "y": 261.389466062743, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 12 - }, - { - "x": 206.95347687865055, - "y": 915.3074028803361, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 8 - }, - { - "x": 537.9352733125747, - "y": 625.8699910180495, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 13 - }, - { - "x": 541.9412655182662, - "y": 687.5377062195827, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 9 - }, - { - "x": 418.49072049508226, - "y": 64.69936914096631, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 5 - }, - { - "x": 418.9641669855199, - "y": 610.9064826139177, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 7 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 11 - }, - { - "x": 36.14823873620429, - "y": 879.2351956872167, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 4 - }, - { - "x": 51.74896860168619, - "y": 186.7201865600939, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 10 - }, - { - "x": 128.3833934000214, - "y": 858.604474045272, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 0 - }, - { - "x": 290.2574108036156, - "y": 845.2925348565799, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 2 - }, - { - "x": 213.02725135648524, - "y": 864.5354204999574, - "frameIndex": 189, - "frameTimestamp": 7560.000000000001, - "objectId": 1 - }, - { - "x": 237.33370430994012, - "y": 57.870737168949674, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 6 - }, - { - "x": 117.41859642640517, - "y": 44.59289785668256, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 2 - }, - { - "x": 522.0311398876637, - "y": -339.14087057789715, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 15 - }, - { - "x": 490.8686376706495, - "y": 261.3955872052371, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 12 - }, - { - "x": 206.3729423562649, - "y": 915.3007999004781, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 9 - }, - { - "x": 537.9352733125747, - "y": 625.8699910180495, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 13 - }, - { - "x": 541.9412655182662, - "y": 687.5377062195827, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 8 - }, - { - "x": 419.8143068542475, - "y": 64.72227218349151, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 5 - }, - { - "x": 418.45013204509047, - "y": 613.9023313843386, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 7 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 10 - }, - { - "x": 36.31413740066202, - "y": 878.4562113320412, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 4 - }, - { - "x": 55.469134573313276, - "y": 192.9392318586178, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 11 - }, - { - "x": 128.59339014507458, - "y": 858.6069438482161, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 0 - }, - { - "x": 291.4956394896608, - "y": 846.1694099620933, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 3 - }, - { - "x": 213.02725135648524, - "y": 864.5354204999574, - "frameIndex": 190, - "frameTimestamp": 7600.000000000001, - "objectId": 1 - }, - { - "x": 237.7405293592517, - "y": 54.165843164287686, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 7 - }, - { - "x": 116.52380526887404, - "y": 44.577322122603526, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 2 - }, - { - "x": 516.0345191095809, - "y": 587.5233869422793, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 15 - }, - { - "x": 522.0311398876637, - "y": -339.14087057789715, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 14 - }, - { - "x": 491.7570719025028, - "y": 258.6131375575339, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 12 - }, - { - "x": 205.98591674201225, - "y": 915.296397884341, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 11 - }, - { - "x": 538.2131564401823, - "y": 625.8737185095298, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 13 - }, - { - "x": 541.9412655182662, - "y": 687.5377062195827, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 9 - }, - { - "x": 421.5790507786672, - "y": 64.75280891792288, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 5 - }, - { - "x": 417.9392669546487, - "y": 616.8797059413529, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 6 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 10 - }, - { - "x": 36.51829364116322, - "y": 878.4585828120618, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 4 - }, - { - "x": 61.58991969674066, - "y": 202.17449789076088, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 8 - }, - { - "x": 128.59339014507458, - "y": 858.6069438482161, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 0 - }, - { - "x": 291.92304440227855, - "y": 846.1744793434227, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 3 - }, - { - "x": 213.07262829958236, - "y": 865.351951545418, - "frameIndex": 191, - "frameTimestamp": 7640.000000000001, - "objectId": 1 - }, - { - "x": 239.48598380666013, - "y": 50.466081766473046, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 9 - }, - { - "x": 114.73418962831384, - "y": 44.54617007434474, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 4 - }, - { - "x": 567.2589100304589, - "y": 74.59113668425546, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 14 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 17 - }, - { - "x": 522.0311398876637, - "y": -339.14087057789715, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 16 - }, - { - "x": 492.40423466659814, - "y": 261.4200714483375, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 13 - }, - { - "x": 205.40537442159817, - "y": 915.2897948157882, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 11 - }, - { - "x": 538.2131564401823, - "y": 625.8737185095298, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 12 - }, - { - "x": 541.6813132878461, - "y": 687.5343306882704, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 7 - }, - { - "x": 422.46140650369637, - "y": 64.76807700417407, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 5 - }, - { - "x": 418.45013204509047, - "y": 613.9023313843386, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 8 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 10 - }, - { - "x": 36.31413740066202, - "y": 878.4562113320412, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 3 - }, - { - "x": 65.62550553896888, - "y": 208.2635384463389, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 6 - }, - { - "x": 128.59339014507458, - "y": 858.6069438482161, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 0 - }, - { - "x": 292.13674590701686, - "y": 846.1770140228014, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 2 - }, - { - "x": 213.07262829958236, - "y": 865.351951545418, - "frameIndex": 192, - "frameTimestamp": 7680.0, - "objectId": 1 - }, - { - "x": 241.29617772055906, - "y": 54.2275521330976, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 9 - }, - { - "x": 113.83936514487105, - "y": 44.53059376015767, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 4 - }, - { - "x": 567.8138901725939, - "y": 78.23300116046087, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 14 - }, - { - "x": 516.164205758776, - "y": 585.9399222400342, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 17 - }, - { - "x": 522.0311398876637, - "y": -339.14087057789715, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 16 - }, - { - "x": 493.17202086424567, - "y": 261.4323133737659, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 13 - }, - { - "x": 205.21185927504243, - "y": 915.2875937811112, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 11 - }, - { - "x": 537.9352733125747, - "y": 625.8699910180495, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 12 - }, - { - "x": 541.6813132878461, - "y": 687.5343306882704, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 7 - }, - { - "x": 423.343751404204, - "y": 64.78334490312017, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 5 - }, - { - "x": 418.9641669855199, - "y": 610.9064826139177, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 8 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 10 - }, - { - "x": 36.31413740066202, - "y": 878.4562113320412, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 3 - }, - { - "x": 69.222721599566, - "y": 208.32205031782928, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 6 - }, - { - "x": 128.3833934000214, - "y": 858.604474045272, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 0 - }, - { - "x": 291.75510064271936, - "y": 845.310307684834, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 2 - }, - { - "x": 213.02725135648524, - "y": 864.5354204999574, - "frameIndex": 193, - "frameTimestamp": 7720.0, - "objectId": 1 - }, - { - "x": 280.33937744077554, - "y": -344.0050616447786, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 16 - }, - { - "x": 114.39465393433036, - "y": 40.77022223986162, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 4 - }, - { - "x": 567.4940994795041, - "y": 81.8423228136855, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 14 - }, - { - "x": 522.0311398876637, - "y": -339.14087057789715, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 15 - }, - { - "x": 492.92581940620494, - "y": 266.98624086100716, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 12 - }, - { - "x": 204.8248274222917, - "y": 915.2831916940181, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 9 - }, - { - "x": 538.2131564401823, - "y": 625.8737185095298, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 11 - }, - { - "x": 541.6813132878461, - "y": 687.5343306882704, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 6 - }, - { - "x": 424.6428639554845, - "y": 61.11669681306847, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 5 - }, - { - "x": 419.50505412090746, - "y": 609.405397539513, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 7 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 10 - }, - { - "x": 36.96395061398004, - "y": 879.244666584487, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 3 - }, - { - "x": 71.22294719889425, - "y": 205.34969325882264, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 8 - }, - { - "x": 128.3833934000214, - "y": 858.604474045272, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 0 - }, - { - "x": 292.183006302415, - "y": 845.315385567851, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 2 - }, - { - "x": 213.02725135648524, - "y": 864.5354204999574, - "frameIndex": 194, - "frameTimestamp": 7760.0, - "objectId": 1 - }, - { - "x": 281.0740260525848, - "y": -355.90518373675684, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 16 - }, - { - "x": 114.73418962831384, - "y": 44.54617007434474, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 4 - }, - { - "x": 568.0458513639791, - "y": 85.4492903353356, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 13 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 14 - }, - { - "x": 492.3010072400309, - "y": 272.4875643079052, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 12 - }, - { - "x": 204.43779349000798, - "y": 915.278789583272, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 6 - }, - { - "x": 538.6501546144972, - "y": 624.413734131703, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 11 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 7 - }, - { - "x": 425.94829137598526, - "y": 57.4322254765685, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 8 - }, - { - "x": 421.2010612168964, - "y": 609.4283229670376, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 9 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 10 - }, - { - "x": 37.3718030929526, - "y": 879.2494019929504, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 3 - }, - { - "x": 72.82511441386666, - "y": 205.37578729932318, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 5 - }, - { - "x": 128.450200086014, - "y": 857.7755656953321, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 0 - }, - { - "x": 292.5641470133662, - "y": 846.1820833589853, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 2 - }, - { - "x": 213.2355631123425, - "y": 864.5378633486816, - "frameIndex": 195, - "frameTimestamp": 7800.0, - "objectId": 1 - }, - { - "x": 282.11090400154757, - "y": -349.9084272745541, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 16 - }, - { - "x": 114.84316364202664, - "y": 40.778041230323254, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 4 - }, - { - "x": 235.92155023010983, - "y": 50.404128018234594, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 13 - }, - { - "x": 570.4364457331678, - "y": 78.27818144342493, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 14 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 15 - }, - { - "x": 492.8034943532254, - "y": 269.74570654219104, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 12 - }, - { - "x": 204.05075747817463, - "y": 915.2743874488734, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 7 - }, - { - "x": 538.6501546144972, - "y": 624.413734131703, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 11 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 6 - }, - { - "x": 426.3713099063732, - "y": 53.71435282945549, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 9 - }, - { - "x": 422.8970283213658, - "y": 609.451247853985, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 8 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 10 - }, - { - "x": 37.98357748657232, - "y": 879.256505055432, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 3 - }, - { - "x": 72.82511441386666, - "y": 205.37578729932318, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 5 - }, - { - "x": 128.66043859229976, - "y": 857.7780395518186, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 0 - }, - { - "x": 292.9915455822314, - "y": 846.1871526650725, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 2 - }, - { - "x": 213.2355631123425, - "y": 864.5378633486816, - "frameIndex": 196, - "frameTimestamp": 7840.0, - "objectId": 1 - }, - { - "x": 114.84316364202664, - "y": 40.778041230323254, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 4 - }, - { - "x": 234.1392672823308, - "y": 50.37314999419107, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 13 - }, - { - "x": 571.7476876177587, - "y": 78.30077096651095, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 14 - }, - { - "x": 516.0345191095809, - "y": 587.5233869422793, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 16 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 15 - }, - { - "x": 493.184966412965, - "y": 269.7517668300026, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 12 - }, - { - "x": 204.05075747817463, - "y": 915.2743874488734, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 8 - }, - { - "x": 538.6501546144972, - "y": 624.413734131703, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 11 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 7 - }, - { - "x": 426.796400001715, - "y": 49.9782733802154, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 6 - }, - { - "x": 422.37002811388714, - "y": 612.4561678899647, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 9 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 10 - }, - { - "x": 37.98357748657232, - "y": 879.256505055432, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 3 - }, - { - "x": 72.82511441386666, - "y": 205.37578729932318, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 5 - }, - { - "x": 128.66043859229976, - "y": 857.7780395518186, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 0 - }, - { - "x": 293.3712871828428, - "y": 847.0518050349102, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 2 - }, - { - "x": 213.28070210180272, - "y": 865.3543904250718, - "frameIndex": 197, - "frameTimestamp": 7880.0, - "objectId": 1 - }, - { - "x": 114.84316364202664, - "y": 40.778041230323254, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 4 - }, - { - "x": 233.69368965349395, - "y": 50.36540536839148, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 13 - }, - { - "x": 572.1847629282364, - "y": 78.30830071592816, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 15 - }, - { - "x": 516.0345191095809, - "y": 587.5233869422793, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 14 - }, - { - "x": 494.32937044677084, - "y": 269.7699475004886, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 10 - }, - { - "x": 203.85723869242162, - "y": 915.2721863728043, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 11 - }, - { - "x": 536.6676463470989, - "y": 627.3143702776351, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 12 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 6 - }, - { - "x": 428.11670459332584, - "y": 46.23942319491824, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 8 - }, - { - "x": 422.9699307356291, - "y": 615.4576714050809, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 7 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 9 - }, - { - "x": 38.1875011311649, - "y": 879.2588727295354, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 3 - }, - { - "x": 72.024035256745, - "y": 205.36274035155472, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 5 - }, - { - "x": 128.66043859229976, - "y": 857.7780395518186, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 0 - }, - { - "x": 293.96333294088913, - "y": 847.9169538365062, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 2 - }, - { - "x": 213.28070210180272, - "y": 865.3543904250718, - "frameIndex": 198, - "frameTimestamp": 7920.0, - "objectId": 1 - }, - { - "x": 114.84316364202664, - "y": 40.778041230323254, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 3 - }, - { - "x": 233.29572202327347, - "y": 54.08870266854961, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 7 - }, - { - "x": 574.269127710507, - "y": 74.7120829562182, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 14 - }, - { - "x": 516.3235540658748, - "y": 587.5273405327837, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 16 - }, - { - "x": 495.6016993122518, - "y": 267.02880284447536, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 11 - }, - { - "x": 203.85723869242162, - "y": 915.2721863728043, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 13 - }, - { - "x": 538.6501546144972, - "y": 624.413734131703, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 12 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 6 - }, - { - "x": 428.11670459332584, - "y": 46.23942319491824, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 9 - }, - { - "x": 423.00604487818293, - "y": 618.4331124594754, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 8 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 10 - }, - { - "x": 38.79926860513504, - "y": 879.2659757116754, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 4 - }, - { - "x": 71.2248051098847, - "y": 202.33162018091667, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 5 - }, - { - "x": 128.66043859229976, - "y": 857.7780395518186, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 0 - }, - { - "x": 294.1765278800479, - "y": 847.919479963232, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 2 - }, - { - "x": 213.28070210180272, - "y": 865.3543904250718, - "frameIndex": 199, - "frameTimestamp": 7960.0, - "objectId": 1 - }, - { - "x": 115.29167055885112, - "y": 40.78586017213074, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 4 - }, - { - "x": 232.89968921025553, - "y": 57.79389824605762, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 6 - }, - { - "x": 575.5834673828756, - "y": 74.73475906853334, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 16 - }, - { - "x": 516.3235540658748, - "y": 587.5273405327837, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 14 - }, - { - "x": 496.3662181339241, - "y": 267.04096312019465, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 13 - }, - { - "x": 203.85723869242162, - "y": 915.2721863728043, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 11 - }, - { - "x": 538.6501546144972, - "y": 624.413734131703, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 12 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 8 - }, - { - "x": 429.0098211794277, - "y": 46.25499313676781, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 9 - }, - { - "x": 423.00604487818293, - "y": 618.4331124594754, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 7 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 10 - }, - { - "x": 39.81886952920634, - "y": 879.2778138813427, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 3 - }, - { - "x": 71.2248051098847, - "y": 202.33162018091667, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 5 - }, - { - "x": 128.66043859229976, - "y": 857.7780395518186, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 0 - }, - { - "x": 295.0293013228946, - "y": 847.9295843953245, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 2 - }, - { - "x": 213.65218481670678, - "y": 864.5427490249357, - "frameIndex": 200, - "frameTimestamp": 8000.0, - "objectId": 1 - }, - { - "x": 115.62900300291254, - "y": 44.56174619515874, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 4 - }, - { - "x": 232.01285343013615, - "y": 57.77852989376413, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 6 - }, - { - "x": 576.5553698019647, - "y": 78.38359569089391, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 16 - }, - { - "x": 516.3235540658748, - "y": 587.5273405327837, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 14 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 15 - }, - { - "x": 498.0285495471665, - "y": 264.29443952700177, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 13 - }, - { - "x": 203.6637193867749, - "y": 915.2699852908221, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 11 - }, - { - "x": 538.9284612319606, - "y": 624.4174701421341, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 12 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 8 - }, - { - "x": 429.0098211794277, - "y": 46.25499313676781, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 9 - }, - { - "x": 424.3903829874716, - "y": 616.9665714396791, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 7 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 10 - }, - { - "x": 39.784714890231236, - "y": 878.4965255793857, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 3 - }, - { - "x": 70.8243589853957, - "y": 199.2936798838011, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 5 - }, - { - "x": 128.66043859229976, - "y": 857.7780395518186, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 0 - }, - { - "x": 295.242493105173, - "y": 847.9321104846449, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 1 - }, - { - "x": 213.44387426574883, - "y": 864.5403061903411, - "frameIndex": 201, - "frameTimestamp": 8040.000000000001, - "objectId": 2 - }, - { - "x": 115.62900300291254, - "y": 44.56174619515874, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 3 - }, - { - "x": 231.62088950825992, - "y": 61.46581535271802, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 8 - }, - { - "x": 575.4405101723827, - "y": 85.57631127218534, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 16 - }, - { - "x": 516.7431955509328, - "y": 585.9478483884667, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 14 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 15 - }, - { - "x": 501.85899870505966, - "y": 264.35543972499124, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 13 - }, - { - "x": 204.05075747817463, - "y": 915.2743874488734, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 11 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 12 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 7 - }, - { - "x": 429.4691972948969, - "y": 50.02479907454685, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 9 - }, - { - "x": 424.9513222548153, - "y": 616.9741245930777, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 6 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 10 - }, - { - "x": 40.80544119000312, - "y": 878.5083823417384, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 4 - }, - { - "x": 71.62623072931288, - "y": 202.3381664873798, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 5 - }, - { - "x": 128.66043859229976, - "y": 857.7780395518186, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 0 - }, - { - "x": 295.0293013228946, - "y": 847.9295843953245, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 2 - }, - { - "x": 213.44387426574883, - "y": 864.5403061903411, - "frameIndex": 202, - "frameTimestamp": 8080.0, - "objectId": 1 - }, - { - "x": 116.07640552446006, - "y": 44.569534183052134, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 3 - }, - { - "x": 231.17854161764257, - "y": 61.4581610636877, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 8 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 14 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 17 - }, - { - "x": 503.6287414454409, - "y": 267.15647928981946, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 12 - }, - { - "x": 203.85723869242162, - "y": 915.2721863728043, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 9 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 13 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 7 - }, - { - "x": 429.4691972948969, - "y": 50.02479907454685, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 10 - }, - { - "x": 425.2463611870301, - "y": 618.463255611967, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 6 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 11 - }, - { - "x": 41.85802813140368, - "y": 879.3014897185658, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 4 - }, - { - "x": 71.2248051098847, - "y": 202.33162018091667, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 5 - }, - { - "x": 128.66043859229976, - "y": 857.7780395518186, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 0 - }, - { - "x": 294.8161089092456, - "y": 847.9270582985232, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 2 - }, - { - "x": 213.2355631123425, - "y": 864.5378633486816, - "frameIndex": 203, - "frameTimestamp": 8120.000000000001, - "objectId": 1 - }, - { - "x": 116.07640552446006, - "y": 44.569534183052134, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 3 - }, - { - "x": 231.17854161764257, - "y": 61.4581610636877, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 10 - }, - { - "x": 516.0345191095809, - "y": 587.5233869422793, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 14 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 17 - }, - { - "x": 505.5398098458123, - "y": 267.1868763421981, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 13 - }, - { - "x": 204.05075747817463, - "y": 915.2743874488734, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 9 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 7 - }, - { - "x": 429.4691972948969, - "y": 50.02479907454685, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 8 - }, - { - "x": 426.37929554185473, - "y": 619.9590753512452, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 6 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 11 - }, - { - "x": 41.794206623298095, - "y": 877.7372398693981, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 4 - }, - { - "x": 72.42907526320444, - "y": 202.35125899096386, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 5 - }, - { - "x": 128.450200086014, - "y": 857.7755656953321, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 0 - }, - { - "x": 294.1765278800479, - "y": 847.919479963232, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 2 - }, - { - "x": 213.2355631123425, - "y": 864.5378633486816, - "frameIndex": 204, - "frameTimestamp": 8160.0, - "objectId": 1 - }, - { - "x": 256.25999871473914, - "y": -87.88756462272868, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 15 - }, - { - "x": 117.30359462977574, - "y": 48.34241840856142, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 3 - }, - { - "x": 231.1260067294853, - "y": 57.76316135222413, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 10 - }, - { - "x": 516.0345191095809, - "y": 587.5233869422793, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 16 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 18 - }, - { - "x": 506.53521334369987, - "y": 269.96385664547273, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 14 - }, - { - "x": 204.05075747817463, - "y": 915.2743874488734, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 8 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 12 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 7 - }, - { - "x": 429.4691972948969, - "y": 50.02479907454685, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 9 - }, - { - "x": 426.13915176228505, - "y": 624.370371036768, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 5 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 11 - }, - { - "x": 42.13975335023499, - "y": 876.1707385881937, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 4 - }, - { - "x": 72.82511441386666, - "y": 205.37578729932318, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 6 - }, - { - "x": 128.23996096643853, - "y": 857.7730918316292, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 0 - }, - { - "x": 292.89734877427134, - "y": 847.9043230906576, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 2 - }, - { - "x": 213.2355631123425, - "y": 864.5378633486816, - "frameIndex": 205, - "frameTimestamp": 8200.0, - "objectId": 1 - }, - { - "x": -62.93412721213809, - "y": 221.01550198827687, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 15 - }, - { - "x": 256.25999871473914, - "y": -87.88756462272868, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 17 - }, - { - "x": 116.85729384152778, - "y": 48.33466121346151, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 3 - }, - { - "x": 231.56943144488983, - "y": 57.7708456466501, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 10 - }, - { - "x": 579.3550214506532, - "y": 85.64355235832036, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 14 - }, - { - "x": 516.3235540658748, - "y": 587.5273405327837, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 13 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 18 - }, - { - "x": 507.6794048637809, - "y": 269.98203393984153, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 16 - }, - { - "x": 203.85723869242162, - "y": 915.2721863728043, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 8 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 12 - }, - { - "x": 541.2687572651355, - "y": 688.8080629612159, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 7 - }, - { - "x": 428.5932141024484, - "y": 53.75297195089992, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 9 - }, - { - "x": 425.87433254132554, - "y": 625.8293283099409, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 5 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 11 - }, - { - "x": 41.83891524707858, - "y": 873.7982077541897, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 4 - }, - { - "x": 73.22565065470036, - "y": 205.38231071884672, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 6 - }, - { - "x": 128.0297212335707, - "y": 857.7706179607097, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 0 - }, - { - "x": 292.25775069754087, - "y": 847.8967445533718, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 2 - }, - { - "x": 213.44387426574883, - "y": 864.5403061903411, - "frameIndex": 206, - "frameTimestamp": 8240.0, - "objectId": 1 - }, - { - "x": -62.53804897803445, - "y": 221.0219038155183, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 16 - }, - { - "x": 255.79031356006269, - "y": -96.8391323641004, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 17 - }, - { - "x": 116.85729384152778, - "y": 48.33466121346151, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 4 - }, - { - "x": 231.1260067294853, - "y": 57.76316135222413, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 10 - }, - { - "x": 579.7899539830378, - "y": 85.65102336396941, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 15 - }, - { - "x": 516.3235540658748, - "y": 587.5273405327837, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 14 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 18 - }, - { - "x": 507.9070229912691, - "y": 272.73519210918323, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 13 - }, - { - "x": 203.85723869242162, - "y": 915.2721863728043, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 8 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 12 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 7 - }, - { - "x": 428.5932141024484, - "y": 53.75297195089992, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 9 - }, - { - "x": 425.90120392599135, - "y": 628.7413285752165, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 5 - }, - { - "x": -60.87567937971191, - "y": 513.55431600567, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 11 - }, - { - "x": 39.6783329207336, - "y": 866.5689129009684, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 3 - }, - { - "x": 72.42457594788765, - "y": 205.36926384355922, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 6 - }, - { - "x": 127.8194808874078, - "y": 857.7681440825738, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 0 - }, - { - "x": 290.55212804414913, - "y": 847.8765347914228, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 2 - }, - { - "x": 213.39887044166247, - "y": 863.7219139086096, - "frameIndex": 207, - "frameTimestamp": 8280.0, - "objectId": 1 - }, - { - "x": -61.85543581790441, - "y": 223.96305713601328, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 14 - }, - { - "x": 116.85729384152778, - "y": 48.33466121346151, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 4 - }, - { - "x": 231.1260067294853, - "y": 57.76316135222413, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 11 - }, - { - "x": 580.1384821761071, - "y": 82.05983684657481, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 16 - }, - { - "x": 516.3235540658748, - "y": 587.5273405327837, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 13 - }, - { - "x": 508.82357817115434, - "y": 270.0002109448727, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 15 - }, - { - "x": 204.24427574403606, - "y": 915.2765885190292, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 6 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 12 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 7 - }, - { - "x": 428.5932141024484, - "y": 53.75297195089992, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 9 - }, - { - "x": 424.8529912525384, - "y": 634.4976760473355, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 5 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 10 - }, - { - "x": 38.139388782384785, - "y": 860.0223164958173, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 3 - }, - { - "x": 72.81975819802557, - "y": 208.38055927021074, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 8 - }, - { - "x": 126.3477812917807, - "y": 857.7508267335542, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 0 - }, - { - "x": 289.9125091306198, - "y": 847.8689560072443, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 2 - }, - { - "x": 213.39887044166247, - "y": 863.7219139086096, - "frameIndex": 208, - "frameTimestamp": 8320.0, - "objectId": 1 - }, - { - "x": -61.85543581790441, - "y": 223.96305713601328, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 14 - }, - { - "x": 116.85729384152778, - "y": 48.33466121346151, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 4 - }, - { - "x": 231.1260067294853, - "y": 57.76316135222413, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 11 - }, - { - "x": 580.5744556850253, - "y": 82.06733664774613, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 17 - }, - { - "x": 516.3235540658748, - "y": 587.5273405327837, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 15 - }, - { - "x": 510.3491142508586, - "y": 270.0244465015119, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 16 - }, - { - "x": 204.24427574403606, - "y": 915.2765885190292, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 6 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 8 - }, - { - "x": 427.70446066109315, - "y": 53.73752444549148, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 9 - }, - { - "x": 423.54368013848233, - "y": 640.1811016326116, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 5 - }, - { - "x": -60.65298028879158, - "y": 515.3609036605159, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 10 - }, - { - "x": 35.77721904797211, - "y": 849.9737568981598, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 2 - }, - { - "x": 71.22294719889425, - "y": 205.34969325882264, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 7 - }, - { - "x": 125.23336879715967, - "y": 858.5674261375246, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 0 - }, - { - "x": 289.486093364416, - "y": 847.8639034470492, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 3 - }, - { - "x": 213.39887044166247, - "y": 863.7219139086096, - "frameIndex": 209, - "frameTimestamp": 8360.0, - "objectId": 1 - }, - { - "x": -61.85543581790441, - "y": 223.96305713601328, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 15 - }, - { - "x": 116.85729384152778, - "y": 48.33466121346151, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 4 - }, - { - "x": 230.68257928389764, - "y": 57.755477010485535, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 11 - }, - { - "x": 516.612587859893, - "y": 587.5312941073898, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 14 - }, - { - "x": 204.24427574403606, - "y": 915.2765885190292, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 6 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 7 - }, - { - "x": 427.2600798219036, - "y": 53.72980062120297, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 9 - }, - { - "x": 422.2686216612705, - "y": 647.1944413549443, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 5 - }, - { - "x": -60.65298028879158, - "y": 515.3609036605159, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 10 - }, - { - "x": 36.20215312527504, - "y": 849.9787768294715, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 1 - }, - { - "x": 68.81620445738726, - "y": 202.29234157672332, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 8 - }, - { - "x": 122.77352858400502, - "y": 857.7087688422506, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 2 - }, - { - "x": 289.486093364416, - "y": 847.8639034470492, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 3 - }, - { - "x": 213.44387426574883, - "y": 864.5403061903411, - "frameIndex": 210, - "frameTimestamp": 8400.0, - "objectId": 0 - }, - { - "x": -58.60131188927961, - "y": 241.33346997377743, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 16 - }, - { - "x": 254.3376375258181, - "y": -110.46175475098885, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 14 - }, - { - "x": 116.41099028975778, - "y": 48.3269039703287, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 4 - }, - { - "x": 230.62870594028416, - "y": 54.04241608575034, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 11 - }, - { - "x": 516.612587859893, - "y": 587.5312941073898, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 15 - }, - { - "x": 204.05075747817463, - "y": 915.2743874488734, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 6 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 9 - }, - { - "x": 426.81569623700545, - "y": 53.72207674919115, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 7 - }, - { - "x": 421.2422207425732, - "y": 651.3488248723538, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 5 - }, - { - "x": -60.65298028879158, - "y": 515.3609036605159, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 10 - }, - { - "x": 35.18855511033765, - "y": 846.5640745987721, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 2 - }, - { - "x": 68.01850595723351, - "y": 205.29750343820962, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 8 - }, - { - "x": 121.45315753273925, - "y": 858.5229665107453, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 1 - }, - { - "x": 289.2728845341503, - "y": 847.8613771557289, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 3 - }, - { - "x": 213.2355631123425, - "y": 864.5378633486816, - "frameIndex": 211, - "frameTimestamp": 8440.0, - "objectId": 0 - }, - { - "x": -58.211169798038206, - "y": 241.33972112179657, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 16 - }, - { - "x": 116.85729384152778, - "y": 48.33466121346151, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 4 - }, - { - "x": 230.57456905957838, - "y": 50.311191646112604, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 12 - }, - { - "x": 516.0345191095809, - "y": 587.5233869422793, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 14 - }, - { - "x": 204.05075747817463, - "y": 915.2743874488734, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 9 - }, - { - "x": 426.39159621358385, - "y": 57.43991911823851, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 6 - }, - { - "x": 420.7427982253086, - "y": 654.1002721098658, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 5 - }, - { - "x": -60.65298028879158, - "y": 515.3609036605159, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 10 - }, - { - "x": 35.82893931555975, - "y": 846.5716548439193, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 2 - }, - { - "x": 64.80169122455764, - "y": 202.22687432039848, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 8 - }, - { - "x": 120.19304305034144, - "y": 858.5081461169449, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 0 - }, - { - "x": 289.2728845341503, - "y": 847.8613771557289, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 3 - }, - { - "x": 213.48877530294754, - "y": 865.3568292976802, - "frameIndex": 212, - "frameTimestamp": 8480.0, - "objectId": 1 - }, - { - "x": -58.32659153925914, - "y": 244.18118429708971, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 16 - }, - { - "x": 116.85729384152778, - "y": 48.33466121346151, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 4 - }, - { - "x": 230.57456905957838, - "y": 50.311191646112604, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 12 - }, - { - "x": 516.0345191095809, - "y": 587.5233869422793, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 15 - }, - { - "x": 512.8545645189363, - "y": 272.81369701714675, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 14 - }, - { - "x": 204.8248274222917, - "y": 915.2831916940181, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 6 - }, - { - "x": 537.6573891104798, - "y": 625.8662635121561, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 11 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 9 - }, - { - "x": 425.5049838059838, - "y": 57.42453178747699, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 5 - }, - { - "x": 420.7427982253086, - "y": 654.1002721098658, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 7 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 10 - }, - { - "x": 35.534039923072356, - "y": 844.8548495180929, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 2 - }, - { - "x": 64.81392229203911, - "y": 205.24531129798524, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 8 - }, - { - "x": 121.03312181984049, - "y": 858.5180264082686, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 0 - }, - { - "x": 289.2728845341503, - "y": 847.8613771557289, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 3 - }, - { - "x": 213.57827042203832, - "y": 866.9842935455174, - "frameIndex": 213, - "frameTimestamp": 8520.0, - "objectId": 1 - }, - { - "x": 116.85729384152778, - "y": 48.33466121346151, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 4 - }, - { - "x": 231.02016598660867, - "y": 50.31893660733587, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 12 - }, - { - "x": 516.0345191095809, - "y": 587.5233869422793, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 15 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 14 - }, - { - "x": 513.9962565116574, - "y": 272.8318127670217, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 13 - }, - { - "x": 205.01834360860758, - "y": 915.2853927405213, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 11 - }, - { - "x": 541.0091745450316, - "y": 688.8046945381756, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 8 - }, - { - "x": 425.5049838059838, - "y": 57.42453178747699, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 5 - }, - { - "x": 419.7085906863844, - "y": 656.8283639065517, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 6 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 10 - }, - { - "x": 35.70738930391887, - "y": 843.9972340787406, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 2 - }, - { - "x": 64.41333931926223, - "y": 205.23878711735173, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 9 - }, - { - "x": 122.29322161494254, - "y": 858.5328466293292, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 1 - }, - { - "x": 289.2728845341503, - "y": 847.8613771557289, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 3 - }, - { - "x": 213.57827042203832, - "y": 866.9842935455174, - "frameIndex": 214, - "frameTimestamp": 8560.0, - "objectId": 0 - }, - { - "x": 116.85729384152778, - "y": 48.33466121346151, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 4 - }, - { - "x": 231.46576015667753, - "y": 50.32668152064001, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 12 - }, - { - "x": 516.0345191095809, - "y": 587.5233869422793, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 14 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 15 - }, - { - "x": 513.9962565116574, - "y": 272.8318127670217, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 13 - }, - { - "x": 204.63131071609246, - "y": 915.2809906416016, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 8 - }, - { - "x": 425.0616735035538, - "y": 57.41683805096377, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 5 - }, - { - "x": 418.14430837686916, - "y": 659.5333369806017, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 6 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 9 - }, - { - "x": 35.45221882711164, - "y": 843.1325198891365, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 2 - }, - { - "x": 59.558705284692905, - "y": 199.10972677311713, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 10 - }, - { - "x": 123.49219434852017, - "y": 859.3747629351267, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 1 - }, - { - "x": 290.1257160665636, - "y": 847.8714822761189, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 3 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 215, - "frameTimestamp": 8600.0, - "objectId": 0 - }, - { - "x": 116.41099028975778, - "y": 48.3269039703287, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 4 - }, - { - "x": 232.85122620141448, - "y": 54.08098835711602, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 13 - }, - { - "x": 515.7454829910047, - "y": 587.5194333358767, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 14 - }, - { - "x": 514.3768164794277, - "y": 272.83785128637066, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 12 - }, - { - "x": 204.63131071609246, - "y": 915.2809906416016, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 6 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 8 - }, - { - "x": 424.61836046867035, - "y": 57.409144267028175, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 5 - }, - { - "x": 417.55760194147496, - "y": 656.7999974294546, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 7 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 10 - }, - { - "x": 34.94007375753473, - "y": 841.3969777749378, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 2 - }, - { - "x": 58.75394837702947, - "y": 199.09658616535106, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 9 - }, - { - "x": 124.60334735504055, - "y": 858.560016361663, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 1 - }, - { - "x": 290.33892237107244, - "y": 847.8740085375118, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 3 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 216, - "frameTimestamp": 8640.0, - "objectId": 0 - }, - { - "x": 116.41099028975778, - "y": 48.3269039703287, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 4 - }, - { - "x": 231.0732154795062, - "y": 54.05013063525143, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 11 - }, - { - "x": 515.7454829910047, - "y": 587.5194333358767, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 13 - }, - { - "x": 513.9962565116574, - "y": 272.8318127670217, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 14 - }, - { - "x": 205.01834360860758, - "y": 915.2853927405213, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 6 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 8 - }, - { - "x": 424.17504470130797, - "y": 57.401450435669986, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 7 - }, - { - "x": 416.5089800783854, - "y": 658.1509984927972, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 5 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 10 - }, - { - "x": 34.94007375753473, - "y": 841.3969777749378, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 3 - }, - { - "x": 54.55572466972939, - "y": 183.66666793917324, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 9 - }, - { - "x": 124.39333898381533, - "y": 858.5575464219816, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 1 - }, - { - "x": 289.95605461958314, - "y": 847.0113179108616, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 2 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 217, - "frameTimestamp": 8680.0, - "objectId": 0 - }, - { - "x": 116.41099028975778, - "y": 48.3269039703287, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 5 - }, - { - "x": 230.68257928389764, - "y": 57.755477010485535, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 10 - }, - { - "x": 515.7454829910047, - "y": 587.5194333358767, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 13 - }, - { - "x": 205.21185927504243, - "y": 915.2875937811112, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 8 - }, - { - "x": 424.17504470130797, - "y": 57.401450435669986, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 6 - }, - { - "x": 415.9720094434417, - "y": 658.1439222089782, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 4 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 11 - }, - { - "x": 34.25264554786034, - "y": 840.5210221826568, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 3 - }, - { - "x": 54.695476136903316, - "y": 195.98517986415627, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 9 - }, - { - "x": 123.97332040557063, - "y": 858.5526065210282, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 2 - }, - { - "x": 289.05967507243855, - "y": 847.8588508569267, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 1 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 218, - "frameTimestamp": 8720.0, - "objectId": 0 - }, - { - "x": 116.85729384152778, - "y": 48.33466121346151, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 5 - }, - { - "x": 230.23914910810132, - "y": 57.74779262143412, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 10 - }, - { - "x": 515.7454829910047, - "y": 587.5194333358767, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 13 - }, - { - "x": 205.59888904827704, - "y": 915.291995844552, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 8 - }, - { - "x": 423.73172620144146, - "y": 57.39375655688867, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 6 - }, - { - "x": 414.6591556852045, - "y": 659.4874420563443, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 4 - }, - { - "x": -61.49699223487739, - "y": 513.5455328725407, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 11 - }, - { - "x": 33.779070188987525, - "y": 839.6455530259907, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 3 - }, - { - "x": 53.85239682325275, - "y": 192.91276425940165, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 9 - }, - { - "x": 123.13327590582928, - "y": 858.5427266327564, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 1 - }, - { - "x": 289.0172284906988, - "y": 848.714499970406, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 2 - }, - { - "x": 213.14497478293256, - "y": 862.8991952116081, - "frameIndex": 219, - "frameTimestamp": 8760.0, - "objectId": 0 - }, - { - "x": 117.30359462977574, - "y": 48.34241840856142, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 5 - }, - { - "x": 230.23914910810132, - "y": 57.74779262143412, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 10 - }, - { - "x": 514.4623477830057, - "y": 589.0820979807326, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 13 - }, - { - "x": 205.792403155081, - "y": 915.2941968674029, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 8 - }, - { - "x": 424.149337066311, - "y": 53.67573251490349, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 6 - }, - { - "x": 413.64884200495743, - "y": 662.1837894436749, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 4 - }, - { - "x": -61.18633513864354, - "y": 513.5499244485576, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 12 - }, - { - "x": 32.52303394334224, - "y": 836.1306056252849, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 3 - }, - { - "x": 54.29218317989407, - "y": 195.97858611205692, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 9 - }, - { - "x": 122.29322161494254, - "y": 858.5328466293292, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 1 - }, - { - "x": 288.4244905760515, - "y": 852.1121667007243, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 2 - }, - { - "x": 213.14497478293256, - "y": 862.8991952116081, - "frameIndex": 220, - "frameTimestamp": 8800.0, - "objectId": 0 - }, - { - "x": 117.30359462977574, - "y": 48.34241840856142, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 5 - }, - { - "x": 229.35228056578242, - "y": 57.73242370139062, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 12 - }, - { - "x": 514.7509294724057, - "y": 589.0860421989911, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 13 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 14 - }, - { - "x": 206.3729423562649, - "y": 915.3007999004781, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 10 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 8 - }, - { - "x": 423.7049342607403, - "y": 53.6680083088154, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 6 - }, - { - "x": 412.44315821182084, - "y": 667.5397397755959, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 4 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 11 - }, - { - "x": 30.72548344327557, - "y": 830.7964466355106, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 3 - }, - { - "x": 53.88888796729463, - "y": 195.97199232307915, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 9 - }, - { - "x": 121.87319079776616, - "y": 858.527906584432, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 2 - }, - { - "x": 288.34166391311015, - "y": 853.8016677278072, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 1 - }, - { - "x": 213.14497478293256, - "y": 862.8991952116081, - "frameIndex": 221, - "frameTimestamp": 8840.0, - "objectId": 0 - }, - { - "x": 117.74989265452737, - "y": 48.35017555562861, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 4 - }, - { - "x": 229.35228056578242, - "y": 57.73242370139062, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 10 - }, - { - "x": 516.164205758776, - "y": 585.9399222400342, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 13 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 14 - }, - { - "x": 206.3729423562649, - "y": 915.3007999004781, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 8 - }, - { - "x": 423.7049342607403, - "y": 53.6680083088154, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 6 - }, - { - "x": 412.1097515548499, - "y": 675.4763003531316, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 5 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 12 - }, - { - "x": 29.877904926334782, - "y": 827.2019933940554, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 3 - }, - { - "x": 53.88888796729463, - "y": 195.97199232307915, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 9 - }, - { - "x": 121.45315753273925, - "y": 858.5229665107453, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 2 - }, - { - "x": 288.0482324008912, - "y": 855.4808502540419, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 1 - }, - { - "x": 213.14497478293256, - "y": 862.8991952116081, - "frameIndex": 222, - "frameTimestamp": 8880.0, - "objectId": 0 - }, - { - "x": 117.74989265452737, - "y": 48.35017555562861, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 4 - }, - { - "x": 230.23914910810132, - "y": 57.74779262143412, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 10 - }, - { - "x": 516.164205758776, - "y": 585.9399222400342, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 13 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 14 - }, - { - "x": 206.56645438359047, - "y": 915.3030008996769, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 8 - }, - { - "x": 423.7049342607403, - "y": 53.6680083088154, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 5 - }, - { - "x": 411.0664678058916, - "y": 685.8382709927334, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 6 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 12 - }, - { - "x": 29.192674279800276, - "y": 822.6647124196534, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 2 - }, - { - "x": 53.88888796729463, - "y": 195.97199232307915, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 9 - }, - { - "x": 120.8812053879428, - "y": 857.6865020553728, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 3 - }, - { - "x": 288.38765989670975, - "y": 857.1597155674639, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 1 - }, - { - "x": 213.14497478293256, - "y": 862.8991952116081, - "frameIndex": 223, - "frameTimestamp": 8920.0, - "objectId": 0 - }, - { - "x": 117.74989265452737, - "y": 48.35017555562861, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 4 - }, - { - "x": 229.79571620207142, - "y": 57.74010818506934, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 9 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 13 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 14 - }, - { - "x": 206.95347687865055, - "y": 915.3074028803361, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 8 - }, - { - "x": 424.149337066311, - "y": 53.67573251490349, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 5 - }, - { - "x": 411.3603208705794, - "y": 687.1223322234264, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 6 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 12 - }, - { - "x": 29.192674279800276, - "y": 822.6647124196534, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 2 - }, - { - "x": 53.08229077524953, - "y": 195.95880463448717, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 10 - }, - { - "x": 120.61308365904833, - "y": 858.5130862770018, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 3 - }, - { - "x": 288.5981597149888, - "y": 857.1621961505645, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 1 - }, - { - "x": 213.14497478293256, - "y": 862.8991952116081, - "frameIndex": 224, - "frameTimestamp": 8960.0, - "objectId": 0 - }, - { - "x": 117.74989265452737, - "y": 48.35017555562861, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 4 - }, - { - "x": 229.40912288552082, - "y": 61.427543437428604, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 7 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 14 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 13 - }, - { - "x": 206.17942980907284, - "y": 915.2985988953658, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 8 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 9 - }, - { - "x": 424.149337066311, - "y": 53.67573251490349, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 5 - }, - { - "x": 411.42689097297574, - "y": 689.6727265919999, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 6 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 12 - }, - { - "x": 29.853972503176887, - "y": 822.6726494699467, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 2 - }, - { - "x": 53.08229077524953, - "y": 195.95880463448717, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 10 - }, - { - "x": 120.25041994839849, - "y": 857.6790796631636, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 3 - }, - { - "x": 288.5981597149888, - "y": 857.1621961505645, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 1 - }, - { - "x": 212.93618548331298, - "y": 862.8967443893167, - "frameIndex": 225, - "frameTimestamp": 9000.0, - "objectId": 0 - }, - { - "x": 117.74989265452737, - "y": 48.35017555562861, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 4 - }, - { - "x": 229.79571620207142, - "y": 57.74010818506934, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 8 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 14 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 13 - }, - { - "x": 205.792403155081, - "y": 915.2941968674029, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 7 - }, - { - "x": 537.2225714099645, - "y": 627.3218083348514, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 10 - }, - { - "x": 424.149337066311, - "y": 53.67573251490349, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 5 - }, - { - "x": 411.78424018152674, - "y": 693.4744790839603, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 6 - }, - { - "x": -61.807650668422056, - "y": 513.5411412776189, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 12 - }, - { - "x": 30.074403896822055, - "y": 822.675295137205, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 2 - }, - { - "x": 51.342969897503295, - "y": 186.7135226227741, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 9 - }, - { - "x": 120.04015690843195, - "y": 857.6766055179917, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 3 - }, - { - "x": 288.5981597149888, - "y": 857.1621961505645, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 1 - }, - { - "x": 212.93618548331298, - "y": 862.8967443893167, - "frameIndex": 226, - "frameTimestamp": 9040.000000000002, - "objectId": 0 - }, - { - "x": 117.30359462977574, - "y": 48.34241840856142, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 4 - }, - { - "x": 229.35228056578242, - "y": 57.73242370139062, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 7 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 14 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 13 - }, - { - "x": 205.01834360860758, - "y": 915.2853927405213, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 8 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 9 - }, - { - "x": 424.149337066311, - "y": 53.67573251490349, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 5 - }, - { - "x": 412.26879212847047, - "y": 692.2186437260344, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 6 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 11 - }, - { - "x": 29.976897315298473, - "y": 820.8471676068311, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 1 - }, - { - "x": 50.93696890740927, - "y": 186.7068586479339, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 10 - }, - { - "x": 119.82989325506833, - "y": 857.6741313656021, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 3 - }, - { - "x": 289.0191575050635, - "y": 857.1671572950063, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 2 - }, - { - "x": 212.9817705367619, - "y": 863.7170202565202, - "frameIndex": 227, - "frameTimestamp": 9080.0, - "objectId": 0 - }, - { - "x": 118.19618791580817, - "y": 48.3579326546638, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 5 - }, - { - "x": 229.79571620207142, - "y": 57.74010818506934, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 4 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 13 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 14 - }, - { - "x": 204.63131071609246, - "y": 915.2809906416016, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 7 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 10 - }, - { - "x": 424.149337066311, - "y": 53.67573251490349, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 8 - }, - { - "x": 411.49308218921885, - "y": 692.208605298494, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 6 - }, - { - "x": -62.11831043928623, - "y": 513.536749663792, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 11 - }, - { - "x": 30.370429906594794, - "y": 819.9351016669002, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 1 - }, - { - "x": 52.678988795765996, - "y": 195.9522107348722, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 9 - }, - { - "x": 119.82989325506833, - "y": 857.6741313656021, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 3 - }, - { - "x": 289.6933376542961, - "y": 856.3386482050149, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 2 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 228, - "frameTimestamp": 9120.000000000002, - "objectId": 0 - }, - { - "x": 118.64248041364398, - "y": 48.36568970566716, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 4 - }, - { - "x": 229.79571620207142, - "y": 57.74010818506934, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 6 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 13 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 14 - }, - { - "x": 203.85723869242162, - "y": 915.2721863728043, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 9 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 10 - }, - { - "x": 424.149337066311, - "y": 53.67573251490349, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 8 - }, - { - "x": 413.3334414600962, - "y": 693.4945136367186, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 5 - }, - { - "x": -62.65507582179709, - "y": 511.71956206381253, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 11 - }, - { - "x": 31.034119348075997, - "y": 819.9430800418984, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 2 - }, - { - "x": 51.02301853414383, - "y": 192.86644453278913, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 7 - }, - { - "x": 120.04015690843195, - "y": 857.6766055179917, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 3 - }, - { - "x": 290.1148163470426, - "y": 856.3436174651113, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 1 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 229, - "frameTimestamp": 9160.0, - "objectId": 0 - }, - { - "x": 120.5502780018615, - "y": 44.647411403255894, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 4 - }, - { - "x": 229.29516086122337, - "y": 54.019272151556606, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 7 - }, - { - "x": 516.164205758776, - "y": 585.9399222400342, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 14 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 13 - }, - { - "x": 203.6637193867749, - "y": 915.2699852908221, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 8 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 9 - }, - { - "x": 424.5937371259952, - "y": 53.68345667326519, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 10 - }, - { - "x": 414.8826093725692, - "y": 693.5145477579804, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 5 - }, - { - "x": -62.65507582179709, - "y": 511.71956206381253, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 11 - }, - { - "x": 31.919029102650757, - "y": 819.9537177610182, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 2 - }, - { - "x": 50.66244506298176, - "y": 195.91924068359705, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 6 - }, - { - "x": 119.67641108174057, - "y": 856.8406665245154, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 3 - }, - { - "x": 290.7470297594066, - "y": 856.3510713007064, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 1 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 230, - "frameTimestamp": 9200.000000000002, - "objectId": 0 - }, - { - "x": 121.44501917401581, - "y": 44.66298626723365, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 4 - }, - { - "x": 229.68336693453077, - "y": 50.295701579907416, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 7 - }, - { - "x": 516.164205758776, - "y": 585.9399222400342, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 14 - }, - { - "x": 521.497098908097, - "y": -327.4021500442084, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 13 - }, - { - "x": 202.88963696520906, - "y": 915.2611809037595, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 6 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 9 - }, - { - "x": 425.01447995565456, - "y": 49.94725529006795, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 10 - }, - { - "x": 415.1685323104878, - "y": 694.7767407883731, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 5 - }, - { - "x": -62.966267660689844, - "y": 511.71515902683234, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 11 - }, - { - "x": 32.80392799942747, - "y": 819.964355349614, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 2 - }, - { - "x": 51.10830976485488, - "y": 198.9717430765041, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 8 - }, - { - "x": 119.61962898830502, - "y": 857.6716572059946, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 3 - }, - { - "x": 290.7031240459765, - "y": 857.187001582653, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 0 - }, - { - "x": 213.2355631123425, - "y": 864.5378633486816, - "frameIndex": 231, - "frameTimestamp": 9240.0, - "objectId": 1 - }, - { - "x": 280.5101462570178, - "y": -355.91657881467506, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 15 - }, - { - "x": 125.0238727917741, - "y": 44.72528378972126, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 5 - }, - { - "x": 229.23776173646226, - "y": 50.2879564749246, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 7 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 14 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 13 - }, - { - "x": 202.11554622517644, - "y": 915.2523764220831, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 6 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 9 - }, - { - "x": 424.5937371259952, - "y": 53.68345667326519, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 10 - }, - { - "x": 415.1685323104878, - "y": 694.7767407883731, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 4 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 11 - }, - { - "x": 33.291288635309165, - "y": 820.886989658606, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 3 - }, - { - "x": 50.70588527564904, - "y": 198.96517202092483, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 8 - }, - { - "x": 119.46590382219313, - "y": 856.8381882911398, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 2 - }, - { - "x": 290.7031240459765, - "y": 857.187001582653, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 0 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 232, - "frameTimestamp": 9280.0, - "objectId": 1 - }, - { - "x": 280.5101462570178, - "y": -355.91657881467506, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 15 - }, - { - "x": 126.81323296103344, - "y": 44.7564313909613, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 6 - }, - { - "x": 229.68336693453077, - "y": 50.295701579907416, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 5 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 13 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 14 - }, - { - "x": 201.34144716654282, - "y": 915.243571845791, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 7 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 8 - }, - { - "x": 424.56899304591207, - "y": 49.93950064745275, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 10 - }, - { - "x": 413.7993786838607, - "y": 702.2357395390449, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 4 - }, - { - "x": -62.42897154747854, - "y": 513.5323580310603, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 11 - }, - { - "x": 33.95414862125162, - "y": 820.894953849352, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 3 - }, - { - "x": 49.90102955972796, - "y": 198.95202979975156, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 9 - }, - { - "x": 119.67641108174057, - "y": 856.8406665245154, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 2 - }, - { - "x": 290.7470297594066, - "y": 856.3510713007064, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 0 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 233, - "frameTimestamp": 9320.0, - "objectId": 1 - }, - { - "x": 280.5101462570178, - "y": -355.91657881467506, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 14 - }, - { - "x": 128.29715723466887, - "y": 41.01258832209327, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 6 - }, - { - "x": 229.18008113615537, - "y": 46.53834306081173, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 5 - }, - { - "x": 515.1674072669766, - "y": 587.5115260753756, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 13 - }, - { - "x": 201.14792110208737, - "y": 915.2413706869344, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 9 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 8 - }, - { - "x": 424.12350337682733, - "y": 49.93174595680548, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 10 - }, - { - "x": 413.37800351834204, - "y": 705.9215452248719, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 4 - }, - { - "x": -62.73963399300761, - "y": 513.5279663794234, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 11 - }, - { - "x": 35.50079822891042, - "y": 820.9135366764256, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 3 - }, - { - "x": 49.90102955972796, - "y": 198.95202979975156, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 7 - }, - { - "x": 120.00136211918618, - "y": 855.1754088442169, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 2 - }, - { - "x": 290.9136170939543, - "y": 857.1894820859708, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 0 - }, - { - "x": 212.9817705367619, - "y": 863.7170202565202, - "frameIndex": 234, - "frameTimestamp": 9360.0, - "objectId": 1 - }, - { - "x": 280.5101462570178, - "y": -355.91657881467506, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 14 - }, - { - "x": 128.8893166266919, - "y": 37.23467936559777, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 8 - }, - { - "x": 229.23776173646226, - "y": 50.2879564749246, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 4 - }, - { - "x": 515.1674072669766, - "y": 587.5115260753756, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 13 - }, - { - "x": 201.14792110208737, - "y": 915.2413706869344, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 9 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 7 - }, - { - "x": 424.12350337682733, - "y": 49.93174595680548, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 10 - }, - { - "x": 412.2933194004255, - "y": 713.1978332466311, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 5 - }, - { - "x": -63.27746084148766, - "y": 511.7107559708654, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 11 - }, - { - "x": 36.646329271770945, - "y": 821.8418397892495, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 3 - }, - { - "x": 49.544502176518094, - "y": 201.97806549893636, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 6 - }, - { - "x": 120.84532826627111, - "y": 855.1853543547601, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 2 - }, - { - "x": 290.9136170939543, - "y": 857.1894820859708, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 1 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 235, - "frameTimestamp": 9400.0, - "objectId": 0 - }, - { - "x": 281.6379014317391, - "y": -355.89378874808693, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 14 - }, - { - "x": 128.7271721956107, - "y": 29.599102115588995, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 6 - }, - { - "x": 230.12896937556087, - "y": 50.303446636970016, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 5 - }, - { - "x": 515.1674072669766, - "y": 587.5115260753756, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 13 - }, - { - "x": 200.56733978917433, - "y": 915.2347671748822, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 11 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 8 - }, - { - "x": 424.12350337682733, - "y": 49.93174595680548, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 10 - }, - { - "x": 411.4449072155575, - "y": 719.1700112085942, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 4 - }, - { - "x": -63.27746084148766, - "y": 511.7107559708654, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 9 - }, - { - "x": 36.82647149263441, - "y": 820.9294644967242, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 3 - }, - { - "x": 49.14295360364429, - "y": 201.97151718739212, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 7 - }, - { - "x": 120.4233464280381, - "y": 855.1803816140458, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 2 - }, - { - "x": 291.1241095264663, - "y": 857.1919625820357, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 1 - }, - { - "x": 213.19032079112768, - "y": 863.7194670861072, - "frameIndex": 236, - "frameTimestamp": 9440.0, - "objectId": 0 - }, - { - "x": 282.11090400154757, - "y": -349.9084272745541, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 14 - }, - { - "x": 128.7271721956107, - "y": 29.599102115588995, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 7 - }, - { - "x": 229.62677909576658, - "y": 46.54611878431317, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 5 - }, - { - "x": 516.4537012378462, - "y": 585.9438853222315, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 13 - }, - { - "x": 199.98675379689735, - "y": 915.2281636096072, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 11 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 8 - }, - { - "x": 424.12350337682733, - "y": 49.93174595680548, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 10 - }, - { - "x": 411.5407097537954, - "y": 722.7215973851145, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 3 - }, - { - "x": -63.27746084148766, - "y": 511.7107559708654, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 9 - }, - { - "x": 34.578129286472034, - "y": 815.3683431869734, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 4 - }, - { - "x": 48.74140279473045, - "y": 201.96496883938326, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 6 - }, - { - "x": 120.90372533687935, - "y": 854.3486081398443, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 2 - }, - { - "x": 291.1241095264663, - "y": 857.1919625820357, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 1 - }, - { - "x": 212.93618548331298, - "y": 862.8967443893167, - "frameIndex": 237, - "frameTimestamp": 9480.0, - "objectId": 0 - }, - { - "x": 130.0824170118553, - "y": 29.622835845379274, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 7 - }, - { - "x": 230.52016670328678, - "y": 46.561670086633406, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 6 - }, - { - "x": 514.8783676615107, - "y": 587.5075724212772, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 13 - }, - { - "x": 199.59969386903822, - "y": 915.2237612031885, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 9 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 8 - }, - { - "x": 424.12350337682733, - "y": 49.93174595680548, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 10 - }, - { - "x": 410.95467369565733, - "y": 728.5668463316088, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 3 - }, - { - "x": -63.27746084148766, - "y": 511.7107559708654, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 11 - }, - { - "x": 35.82931776067901, - "y": 813.5207166459754, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 4 - }, - { - "x": 47.93829446870795, - "y": 201.9518720339707, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 5 - }, - { - "x": 121.95988938412616, - "y": 854.3610603798876, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 1 - }, - { - "x": 291.168502283177, - "y": 856.3560404880701, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 2 - }, - { - "x": 212.9817705367619, - "y": 863.7170202565202, - "frameIndex": 238, - "frameTimestamp": 9520.0, - "objectId": 0 - }, - { - "x": 131.437636343834, - "y": 29.646569128876383, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 8 - }, - { - "x": 230.12896937556087, - "y": 50.303446636970016, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 6 - }, - { - "x": 514.4623477830057, - "y": 589.0820979807326, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 13 - }, - { - "x": 199.59969386903822, - "y": 915.2237612031885, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 9 - }, - { - "x": 536.9451094141446, - "y": 627.3180893134224, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 7 - }, - { - "x": 424.56899304591207, - "y": 49.93950064745275, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 10 - }, - { - "x": 411.6672246018569, - "y": 727.4117485414806, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 3 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 11 - }, - { - "x": 34.13654428197556, - "y": 805.9574908765093, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 5 - }, - { - "x": 47.58684457595654, - "y": 204.96473879629625, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 4 - }, - { - "x": 122.32224524427679, - "y": 855.2027587179882, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 1 - }, - { - "x": 291.168502283177, - "y": 856.3560404880701, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 2 - }, - { - "x": 212.93618548331298, - "y": 862.8967443893167, - "frameIndex": 239, - "frameTimestamp": 9560.0, - "objectId": 0 - }, - { - "x": 136.081367993582, - "y": 37.36024934986457, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 6 - }, - { - "x": 230.1841936575132, - "y": 54.034701488634546, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 4 - }, - { - "x": 514.4623477830057, - "y": 589.0820979807326, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 13 - }, - { - "x": 199.2126318614199, - "y": 915.2193587731147, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 9 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 8 - }, - { - "x": 424.56899304591207, - "y": 49.93950064745275, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 10 - }, - { - "x": 412.13305489002073, - "y": 726.2503424224092, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 3 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 11 - }, - { - "x": 30.06054629758685, - "y": 792.3434076773888, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 5 - }, - { - "x": 47.18616588844055, - "y": 204.95821305678405, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 7 - }, - { - "x": 122.38235066954634, - "y": 854.3660412248129, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 1 - }, - { - "x": 291.168502283177, - "y": 856.3560404880701, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 2 - }, - { - "x": 212.93618548331298, - "y": 862.8967443893167, - "frameIndex": 240, - "frameTimestamp": 9600.0, - "objectId": 0 - }, - { - "x": 137.59531740611848, - "y": 33.57996851215974, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 4 - }, - { - "x": 230.62870594028416, - "y": 54.04241608575034, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 7 - }, - { - "x": 514.4623477830057, - "y": 589.0820979807326, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 13 - }, - { - "x": 520.3868509785153, - "y": -327.42440369953084, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 14 - }, - { - "x": 198.82556777402564, - "y": 915.2149563193858, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 9 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 12 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 8 - }, - { - "x": 424.56899304591207, - "y": 49.93950064745275, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 10 - }, - { - "x": 412.13305489002073, - "y": 726.2503424224092, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 3 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 11 - }, - { - "x": 29.344454861823163, - "y": 787.3738733787776, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 5 - }, - { - "x": 46.73361520890685, - "y": 201.93222655236025, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 6 - }, - { - "x": 122.17112033636766, - "y": 854.3635508059996, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 2 - }, - { - "x": 291.37923761972866, - "y": 856.3585250708423, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 1 - }, - { - "x": 212.89049583740047, - "y": 862.0745864430696, - "frameIndex": 241, - "frameTimestamp": 9640.0, - "objectId": 0 - }, - { - "x": 139.22766478653637, - "y": 37.41518227770888, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 2 - }, - { - "x": 231.96222632740555, - "y": 54.06555959141079, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 7 - }, - { - "x": 514.4623477830057, - "y": 589.0820979807326, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 14 - }, - { - "x": 520.3868509785153, - "y": -327.42440369953084, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 13 - }, - { - "x": 198.63203495040722, - "y": 915.2127550836503, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 12 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 8 - }, - { - "x": 425.01447995565456, - "y": 49.94725529006795, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 10 - }, - { - "x": 412.6303806118532, - "y": 726.2566606367276, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 4 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 9 - }, - { - "x": 30.628420379906284, - "y": 785.387715673056, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 6 - }, - { - "x": 46.73361520890685, - "y": 201.93222655236025, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 5 - }, - { - "x": 122.533230913449, - "y": 855.2052450264786, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 3 - }, - { - "x": 291.168502283177, - "y": 856.3560404880701, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 1 - }, - { - "x": 213.09952473090132, - "y": 862.0770412699571, - "frameIndex": 242, - "frameTimestamp": 9680.0, - "objectId": 0 - }, - { - "x": 141.47493554161989, - "y": 37.45441861501565, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 3 - }, - { - "x": 231.9113515698103, - "y": 50.33442638602559, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 7 - }, - { - "x": 514.4623477830057, - "y": 589.0820979807326, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 12 - }, - { - "x": 520.3868509785153, - "y": -327.42440369953084, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 13 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 8 - }, - { - "x": 425.01447995565456, - "y": 49.94725529006795, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 10 - }, - { - "x": 412.1638740533481, - "y": 727.4180541342004, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 4 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 9 - }, - { - "x": 29.780251108735033, - "y": 782.3553954126899, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 6 - }, - { - "x": 45.015822587487946, - "y": 195.82691963470438, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 5 - }, - { - "x": 123.22726581168601, - "y": 854.376002827079, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 2 - }, - { - "x": 291.33460134351526, - "y": 857.1944430708478, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 1 - }, - { - "x": 213.09952473090132, - "y": 862.0770412699571, - "frameIndex": 243, - "frameTimestamp": 9720.0, - "objectId": 0 - }, - { - "x": -48.56911579468584, - "y": 438.28442794553524, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 16 - }, - { - "x": 142.64531598107865, - "y": 41.26272363567523, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 4 - }, - { - "x": 232.40672763613355, - "y": 54.073273998069936, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 8 - }, - { - "x": 514.4623477830057, - "y": 589.0820979807326, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 13 - }, - { - "x": 520.3868509785153, - "y": -327.42440369953084, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 14 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 7 - }, - { - "x": 425.01447995565456, - "y": 49.94725529006795, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 10 - }, - { - "x": 412.0085179458334, - "y": 730.8989853841103, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 3 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 9 - }, - { - "x": 31.58849786881744, - "y": 781.3651826723927, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 6 - }, - { - "x": 45.876616225045865, - "y": 198.88631649351464, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 5 - }, - { - "x": 124.85403251151901, - "y": 855.2325939395146, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 2 - }, - { - "x": 291.33460134351526, - "y": 857.1944430708478, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 1 - }, - { - "x": 213.14497478293256, - "y": 862.8991952116081, - "frameIndex": 244, - "frameTimestamp": 9760.0, - "objectId": 0 - }, - { - "x": -49.45246827256199, - "y": 436.19604122131165, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 15 - }, - { - "x": 142.82326435743278, - "y": 37.477959830108645, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 3 - }, - { - "x": 232.80252612537052, - "y": 50.349915973042975, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 6 - }, - { - "x": 514.4623477830057, - "y": 589.0820979807326, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 12 - }, - { - "x": 520.3868509785153, - "y": -327.42440369953084, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 14 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 8 - }, - { - "x": 424.5937371259952, - "y": 53.68345667326519, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 9 - }, - { - "x": 411.39338273568757, - "y": 735.4910883757955, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 4 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 10 - }, - { - "x": 32.0534698554152, - "y": 781.3708965979688, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 7 - }, - { - "x": 44.5554512527747, - "y": 192.76056404679179, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 5 - }, - { - "x": 125.12828866738087, - "y": 854.3984160052106, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 0 - }, - { - "x": 291.54509254510396, - "y": 857.1969235524072, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 2 - }, - { - "x": 213.39887044166247, - "y": 863.7219139086096, - "frameIndex": 245, - "frameTimestamp": 9800.0, - "objectId": 1 - }, - { - "x": 494.80388530599976, - "y": 506.8149745159989, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 15 - }, - { - "x": -48.78599086182327, - "y": 436.2058208100439, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 12 - }, - { - "x": 143.27270168998828, - "y": 37.485806803927304, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 3 - }, - { - "x": 233.248109267849, - "y": 50.35766069467569, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 7 - }, - { - "x": 514.7509294724057, - "y": 589.0860421989911, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 13 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 14 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 8 - }, - { - "x": 424.5937371259952, - "y": 53.68345667326519, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 10 - }, - { - "x": 411.45626960617113, - "y": 737.7732059834052, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 4 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 9 - }, - { - "x": 33.820431247249545, - "y": 784.4221270176632, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 5 - }, - { - "x": 44.15120903713693, - "y": 192.7539462011026, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 6 - }, - { - "x": 125.76195181006771, - "y": 854.4058869332164, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 1 - }, - { - "x": 291.54509254510396, - "y": 857.1969235524072, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 0 - }, - { - "x": 213.60741948836872, - "y": 863.7243607240275, - "frameIndex": 246, - "frameTimestamp": 9840.0, - "objectId": 2 - }, - { - "x": -49.45246827256199, - "y": 436.19604122131165, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 12 - }, - { - "x": 143.27270168998828, - "y": 37.485806803927304, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 7 - }, - { - "x": 233.248109267849, - "y": 50.35766069467569, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 5 - }, - { - "x": 514.4623477830057, - "y": 589.0820979807326, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 13 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 14 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 8 - }, - { - "x": 425.0381344398179, - "y": 53.6911807839007, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 9 - }, - { - "x": 410.849049912862, - "y": 742.2914543221864, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 3 - }, - { - "x": -63.588655364199234, - "y": 511.7063528959121, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 10 - }, - { - "x": 33.03093756110287, - "y": 782.3953194765691, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 4 - }, - { - "x": 43.282750090215224, - "y": 189.66730561933, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 6 - }, - { - "x": 126.2490382570539, - "y": 853.5722855062621, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 0 - }, - { - "x": 291.5003163820373, - "y": 858.0309072628728, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 1 - }, - { - "x": 214.06880411128813, - "y": 864.5476346729305, - "frameIndex": 247, - "frameTimestamp": 9880.0, - "objectId": 2 - }, - { - "x": -49.89964879413947, - "y": 438.2649234389582, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 12 - }, - { - "x": 142.55154224819964, - "y": 33.666632869934936, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 4 - }, - { - "x": 233.69368965349395, - "y": 50.36540536839148, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 6 - }, - { - "x": 514.4623477830057, - "y": 589.0820979807326, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 13 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 14 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 8 - }, - { - "x": 425.9054454972154, - "y": 49.962764431203446, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 9 - }, - { - "x": 410.37816613134635, - "y": 751.1931125409246, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 5 - }, - { - "x": -63.89985122883322, - "y": 511.701949801972, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 10 - }, - { - "x": 31.771848624410467, - "y": 780.3524362614768, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 3 - }, - { - "x": 43.282750090215224, - "y": 189.66730561933, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 7 - }, - { - "x": 126.9489587115353, - "y": 852.7392539313737, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 2 - }, - { - "x": 291.5003163820373, - "y": 858.0309072628728, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 1 - }, - { - "x": 214.06880411128813, - "y": 864.5476346729305, - "frameIndex": 248, - "frameTimestamp": 9920.0, - "objectId": 0 - }, - { - "x": -49.89964879413947, - "y": 438.2649234389582, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 12 - }, - { - "x": 143.27270168998828, - "y": 37.485806803927304, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 3 - }, - { - "x": 233.69368965349395, - "y": 50.36540536839148, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 7 - }, - { - "x": 515.0395100031851, - "y": 589.0899864014142, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 13 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 14 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 11 - }, - { - "x": 540.9014509546498, - "y": 687.5242040210718, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 8 - }, - { - "x": 427.22357691635955, - "y": 46.223853059718635, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 9 - }, - { - "x": 409.5793077491564, - "y": 756.6548834339866, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 5 - }, - { - "x": -63.89985122883322, - "y": 511.701949801972, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 10 - }, - { - "x": 30.821450038963867, - "y": 775.2266759631573, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 4 - }, - { - "x": 44.093034999670145, - "y": 189.6805880475651, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 6 - }, - { - "x": 127.08048148138883, - "y": 851.052362099348, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 1 - }, - { - "x": 291.2456376417202, - "y": 858.8604951250604, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 2 - }, - { - "x": 214.06880411128813, - "y": 864.5476346729305, - "frameIndex": 249, - "frameTimestamp": 9960.0, - "objectId": 0 - }, - { - "x": -50.78544156129348, - "y": 436.1764817728666, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 14 - }, - { - "x": 142.82326435743278, - "y": 37.477959830108645, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 3 - }, - { - "x": 234.09360631445284, - "y": 46.62387336687659, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 8 - }, - { - "x": 516.7431955509328, - "y": 585.9478483884667, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 13 - }, - { - "x": 520.9419770870555, - "y": -327.4132768289006, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 12 - }, - { - "x": 538.4910384933085, - "y": 625.8774459865973, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 11 - }, - { - "x": 541.4213601171068, - "y": 687.5309551447478, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 9 - }, - { - "x": 427.6701421412137, - "y": 46.23163815148748, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 7 - }, - { - "x": 410.15604759877874, - "y": 759.9106270351298, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 5 - }, - { - "x": -65.37577331581237, - "y": 509.86526664715944, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 10 - }, - { - "x": 30.146498025981384, - "y": 771.07961847898, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 4 - }, - { - "x": 44.093034999670145, - "y": 189.6805880475651, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 6 - }, - { - "x": 127.92927151295953, - "y": 851.0623892256341, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 0 - }, - { - "x": 290.8256241039449, - "y": 858.8555504425364, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 2 - }, - { - "x": 214.11299129995444, - "y": 865.3641458732338, - "frameIndex": 250, - "frameTimestamp": 10000.0, - "objectId": 1 - } - ] -} \ No newline at end of file diff --git a/visualizer/src/api/mod.tsx b/visualizer/src/api/mod.tsx index aa6c01b..c00139b 100644 --- a/visualizer/src/api/mod.tsx +++ b/visualizer/src/api/mod.tsx @@ -35,7 +35,7 @@ apiRouter.get("/match/:id/pane/player", async function(ctx){ }); apiRouter.get("/match/:id/pane/player/data", async function(ctx){ - ctx.response.body = + ctx.response.body = }); apiRouter.get('/list-matches', async (ctx) => { diff --git a/visualizer/src/api/tab.tsx b/visualizer/src/api/tab.tsx index c222215..e79fd81 100644 --- a/visualizer/src/api/tab.tsx +++ b/visualizer/src/api/tab.tsx @@ -32,7 +32,8 @@ export class ViewTabService { playerTab(matchInfo: MatchInfo){ return (
-
diff --git a/visualizer/src/views/base.tsx b/visualizer/src/views/base.tsx index e9269bc..48f55fa 100644 --- a/visualizer/src/views/base.tsx +++ b/visualizer/src/views/base.tsx @@ -8,7 +8,7 @@ export function Head(){ - + ) } diff --git a/visualizer/src/views/mod.tsx b/visualizer/src/views/mod.tsx index 930df5f..b934950 100644 --- a/visualizer/src/views/mod.tsx +++ b/visualizer/src/views/mod.tsx @@ -19,6 +19,7 @@ function Court(){ , ] return ( From 9ada7cc1a81ad04f8773851a5adc8b5938d0466d Mon Sep 17 00:00:00 2001 From: didier amyot Date: Wed, 23 Oct 2024 14:12:05 -0400 Subject: [PATCH 04/11] Added new frontend. --- visualizer/deno.lock | 211 + .../public/vendor/htmx/ext/ajax-header.js | 7 + .../public/vendor/htmx/ext/alpine-morph.js | 16 + .../public/vendor/htmx/ext/class-tools.js | 92 + .../vendor/htmx/ext/client-side-templates.js | 96 + visualizer/public/vendor/htmx/ext/debug.js | 11 + .../public/vendor/htmx/ext/disable-element.js | 18 + .../public/vendor/htmx/ext/event-header.js | 37 + .../public/vendor/htmx/ext/head-support.js | 141 + .../public/vendor/htmx/ext/include-vals.js | 24 + visualizer/public/vendor/htmx/ext/json-enc.js | 12 + .../public/vendor/htmx/ext/loading-states.js | 183 + .../public/vendor/htmx/ext/method-override.js | 11 + .../public/vendor/htmx/ext/morphdom-swap.js | 17 + .../public/vendor/htmx/ext/multi-swap.js | 45 + .../public/vendor/htmx/ext/path-deps.js | 60 + .../public/vendor/htmx/ext/path-params.js | 11 + visualizer/public/vendor/htmx/ext/preload.js | 147 + .../public/vendor/htmx/ext/rails-method.js | 10 + .../public/vendor/htmx/ext/remove-me.js | 27 + .../vendor/htmx/ext/response-targets.js | 130 + visualizer/public/vendor/htmx/ext/restored.js | 15 + visualizer/public/vendor/htmx/ext/sse.js | 355 ++ visualizer/public/vendor/htmx/ext/ws.js | 477 ++ visualizer/public/vendor/htmx/htmx.d.ts | 450 ++ visualizer/public/vendor/htmx/htmx.js | 3919 +++++++++++++++++ visualizer/public/vendor/htmx/htmx.min.js | 1 + visualizer/public/vendor/htmx/htmx.min.js.gz | Bin 0 -> 15625 bytes visualizer/public/vendor/htmx/htmx.test.ts | 96 + visualizer/src/api/mod.tsx | 2 +- 30 files changed, 6620 insertions(+), 1 deletion(-) create mode 100644 visualizer/deno.lock create mode 100644 visualizer/public/vendor/htmx/ext/ajax-header.js create mode 100644 visualizer/public/vendor/htmx/ext/alpine-morph.js create mode 100644 visualizer/public/vendor/htmx/ext/class-tools.js create mode 100644 visualizer/public/vendor/htmx/ext/client-side-templates.js create mode 100644 visualizer/public/vendor/htmx/ext/debug.js create mode 100644 visualizer/public/vendor/htmx/ext/disable-element.js create mode 100644 visualizer/public/vendor/htmx/ext/event-header.js create mode 100644 visualizer/public/vendor/htmx/ext/head-support.js create mode 100644 visualizer/public/vendor/htmx/ext/include-vals.js create mode 100644 visualizer/public/vendor/htmx/ext/json-enc.js create mode 100644 visualizer/public/vendor/htmx/ext/loading-states.js create mode 100644 visualizer/public/vendor/htmx/ext/method-override.js create mode 100644 visualizer/public/vendor/htmx/ext/morphdom-swap.js create mode 100644 visualizer/public/vendor/htmx/ext/multi-swap.js create mode 100644 visualizer/public/vendor/htmx/ext/path-deps.js create mode 100644 visualizer/public/vendor/htmx/ext/path-params.js create mode 100644 visualizer/public/vendor/htmx/ext/preload.js create mode 100644 visualizer/public/vendor/htmx/ext/rails-method.js create mode 100644 visualizer/public/vendor/htmx/ext/remove-me.js create mode 100644 visualizer/public/vendor/htmx/ext/response-targets.js create mode 100644 visualizer/public/vendor/htmx/ext/restored.js create mode 100644 visualizer/public/vendor/htmx/ext/sse.js create mode 100644 visualizer/public/vendor/htmx/ext/ws.js create mode 100644 visualizer/public/vendor/htmx/htmx.d.ts create mode 100644 visualizer/public/vendor/htmx/htmx.js create mode 100644 visualizer/public/vendor/htmx/htmx.min.js create mode 100644 visualizer/public/vendor/htmx/htmx.min.js.gz create mode 100644 visualizer/public/vendor/htmx/htmx.test.ts diff --git a/visualizer/deno.lock b/visualizer/deno.lock new file mode 100644 index 0000000..d0017e1 --- /dev/null +++ b/visualizer/deno.lock @@ -0,0 +1,211 @@ +{ + "version": "3", + "redirects": { + "https://deno.land/x/oak/mod.ts": "https://deno.land/x/oak@v12.6.1/mod.ts", + "https://deno.land/x/oak/mod.tsx": "https://deno.land/x/oak@v12.6.1/mod.tsx" + }, + "remote": { + "https://deno.land/std@0.189.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", + "https://deno.land/std@0.189.0/streams/write_all.ts": "aec90152978581ea62d56bb53a5cbf487e6a89c902f87c5969681ffbdf32b998", + "https://deno.land/std@0.200.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", + "https://deno.land/std@0.200.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.200.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.200.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8", + "https://deno.land/std@0.200.0/bytes/bytes_list.ts": "31d664f4d42fa922066405d0e421c56da89d751886ee77bbe25a88bf0310c9d0", + "https://deno.land/std@0.200.0/bytes/concat.ts": "d26d6f3d7922e6d663dacfcd357563b7bf4a380ce5b9c2bbe0c8586662f25ce2", + "https://deno.land/std@0.200.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", + "https://deno.land/std@0.200.0/bytes/ends_with.ts": "4228811ebc71615d27f065c54b5e815ec1972538772b0f413c0efe05245b472e", + "https://deno.land/std@0.200.0/bytes/equals.ts": "fc190cce412b2136979181b163ec7e05f7e7a947e39102eee4b8c0d62519ddf9", + "https://deno.land/std@0.200.0/bytes/includes_needle.ts": "76a8163126fb2f8bf86fd7f22192c3bb04bf6a20b987a095127c2ca08adf3ba6", + "https://deno.land/std@0.200.0/bytes/index_of_needle.ts": "9c06610e9611b5647ac25952e71a22e09227c9f1b8cbeeb33399bf8bf8a7f649", + "https://deno.land/std@0.200.0/bytes/last_index_of_needle.ts": "f1602f221c3b678bc4f1e1c88a70a15ab7da32c21751dbbc6c957c956951d784", + "https://deno.land/std@0.200.0/bytes/mod.ts": "e869bba1e7a2e3a9cc6c2d55471888429a544e70a840c087672e656e7ba21815", + "https://deno.land/std@0.200.0/bytes/mod.tsx": "e869bba1e7a2e3a9cc6c2d55471888429a544e70a840c087672e656e7ba21815", + "https://deno.land/std@0.200.0/bytes/repeat.ts": "6f5e490d8d72bcbf8d84a6bb04690b9b3eb5822c5a11687bca73a2318a842294", + "https://deno.land/std@0.200.0/bytes/starts_with.ts": "3e607a70c9c09f5140b7a7f17a695221abcc7244d20af3eb47ccbb63f5885135", + "https://deno.land/std@0.200.0/crypto/keystack.ts": "877ab0f19eb7d37ad6495190d3c3e39f58e9c52e0b6a966f82fd6df67ca55f90", + "https://deno.land/std@0.200.0/crypto/timing_safe_equal.ts": "7b0a4d2ef1c17590e0ad6c0cb1776369d2ba80cd99e945005e117851690507fe", + "https://deno.land/std@0.200.0/encoding/base64.ts": "144ae6234c1fbe5b68666c711dc15b1e9ee2aef6d42b3b4345bf9a6c91d70d0d", + "https://deno.land/std@0.200.0/encoding/base64url.ts": "2ed4ba122b20fedf226c5d337cf22ee2024fa73a8f85d915d442af7e9ce1fae1", + "https://deno.land/std@0.200.0/http/_negotiation/common.ts": "14d1a52427ab258a4b7161cd80e1d8a207b7cc64b46e911780f57ead5f4323c6", + "https://deno.land/std@0.200.0/http/_negotiation/encoding.ts": "ff747d107277c88cb7a6a62a08eeb8d56dad91564cbcccb30694d5dc126dcc53", + "https://deno.land/std@0.200.0/http/_negotiation/language.ts": "7bcddd8db3330bdb7ce4fc00a213c5547c1968139864201efd67ef2d0d51887d", + "https://deno.land/std@0.200.0/http/_negotiation/media_type.ts": "58847517cd549384ad677c0fe89e0a4815be36fe7a303ea63cee5f6a1d7e1692", + "https://deno.land/std@0.200.0/http/cookie_map.ts": "64601025a7d24c3ebd80a169ccc99145bdbfc60606935348e1d4366d0bf9010d", + "https://deno.land/std@0.200.0/http/etag.ts": "807382795850cde5c437c74bcc09392bc0fc56de348fc1271f383f4b28935b9f", + "https://deno.land/std@0.200.0/http/http_errors.ts": "bbda34819060af86537cecc9dc8e045f877130808b7e7acde4197c5328e852d0", + "https://deno.land/std@0.200.0/http/http_status.ts": "8a7bcfe3ac025199ad804075385e57f63d055b2aed539d943ccc277616d6f932", + "https://deno.land/std@0.200.0/http/method.ts": "e66c2a015cb46c21ab0bb3589aa4fca43143a506cb324ffdfd42d2edef7bc0c4", + "https://deno.land/std@0.200.0/http/negotiation.ts": "46e74a6bad4b857333a58dc5b50fe8e5a4d5267e97292293ea65f980bd918086", + "https://deno.land/std@0.200.0/http/server_sent_event.ts": "29f707c1afa5278ac0315ac115ee679d6b93596d5af3fad5ef33f04254ca76c1", + "https://deno.land/std@0.200.0/http/user_agent.ts": "35d3c70d0926b0e121b8c1bbc324b3522479158acaa4f0c43928362b7bf4e6f4", + "https://deno.land/std@0.200.0/io/buf_reader.ts": "2bccff0878537ef201c5051fc0db0ce8196388c5ea69d2be6be1900fe48c5f4b", + "https://deno.land/std@0.200.0/io/buf_writer.ts": "48c33c8f00b61dcbc7958706741cec8e59810bd307bc6a326cbd474fe8346dfd", + "https://deno.land/std@0.200.0/io/buffer.ts": "4d6883daeb2e698579c4064170515683d69f40f3de019bfe46c5cf31e74ae793", + "https://deno.land/std@0.200.0/io/copy_n.ts": "c055296297b9d4897d90d1ac056b072dc02614e60c67f438e23fbce052ea4c69", + "https://deno.land/std@0.200.0/io/limited_reader.ts": "6c9a216f8eef39c1ee2a6b37a29372c8fc63455b2eeb91f06d9646f8f759fc8b", + "https://deno.land/std@0.200.0/io/mod.ts": "2665bcccc1fd6e8627cca167c3e92aaecbd9897556b6f69e6d258070ef63fd9b", + "https://deno.land/std@0.200.0/io/mod.tsx": "2665bcccc1fd6e8627cca167c3e92aaecbd9897556b6f69e6d258070ef63fd9b", + "https://deno.land/std@0.200.0/io/multi_reader.ts": "9c2a0a31686c44b277e16da1d97b4686a986edcee48409b84be25eedbc39b271", + "https://deno.land/std@0.200.0/io/read_delim.ts": "c02b93cc546ae8caad8682ae270863e7ace6daec24c1eddd6faabc95a9d876a3", + "https://deno.land/std@0.200.0/io/read_int.ts": "7cb8bcdfaf1107586c3bacc583d11c64c060196cb070bb13ae8c2061404f911f", + "https://deno.land/std@0.200.0/io/read_lines.ts": "c526c12a20a9386dc910d500f9cdea43cba974e853397790bd146817a7eef8cc", + "https://deno.land/std@0.200.0/io/read_long.ts": "f0aaa420e3da1261c5d33c5e729f09922f3d9fa49f046258d4ff7a00d800c71e", + "https://deno.land/std@0.200.0/io/read_range.ts": "46a2263d0f8369b6d9abb0b25d99ceb65ff08d621fc57bcc53832e6979295043", + "https://deno.land/std@0.200.0/io/read_short.ts": "805cb329574b850b84bf14a92c052c59b5977a492cd780c41df8ad40826c1a20", + "https://deno.land/std@0.200.0/io/read_string_delim.ts": "5dc9f53bdf78e7d4ee1e56b9b60352238ab236a71c3e3b2a713c3d78472a53ce", + "https://deno.land/std@0.200.0/io/slice_long_to_bytes.ts": "48d9bace92684e880e46aa4a2520fc3867f9d7ce212055f76ecc11b22f9644b7", + "https://deno.land/std@0.200.0/io/string_reader.ts": "da0f68251b3d5b5112485dfd4d1b1936135c9b4d921182a7edaf47f74c25cc8f", + "https://deno.land/std@0.200.0/io/string_writer.ts": "8a03c5858c24965a54c6538bed15f32a7c72f5704a12bda56f83a40e28e5433e", + "https://deno.land/std@0.200.0/media_types/_db.ts": "7606d83e31f23ce1a7968cbaee852810c2cf477903a095696cdc62eaab7ce570", + "https://deno.land/std@0.200.0/media_types/_util.ts": "916efbd30b6148a716f110e67a4db29d6949bf4048997b754415dd7e42c52378", + "https://deno.land/std@0.200.0/media_types/content_type.ts": "ad98a5aa2d95f5965b2796072284258710a25e520952376ed432b0937ce743bc", + "https://deno.land/std@0.200.0/media_types/extension.ts": "a7cd28c9417143387cdfed27d4e8607ebcf5b1ec27eb8473d5b000144689fe65", + "https://deno.land/std@0.200.0/media_types/extensions_by_type.ts": "43806d6a52a0d6d965ada9d20e60a982feb40bc7a82268178d94edb764694fed", + "https://deno.land/std@0.200.0/media_types/format_media_type.ts": "f5e1073c05526a6f5a516ac5c5587a1abd043bf1039c71cde1166aa4328c8baf", + "https://deno.land/std@0.200.0/media_types/get_charset.ts": "18b88274796fda5d353806bf409eb1d2ddb3f004eb4bd311662c4cdd8ac173db", + "https://deno.land/std@0.200.0/media_types/mod.ts": "d3f0b99f85053bc0b98ecc24eaa3546dfa09b856dc0bbaf60d8956d2cdd710c8", + "https://deno.land/std@0.200.0/media_types/mod.tsx": "d3f0b99f85053bc0b98ecc24eaa3546dfa09b856dc0bbaf60d8956d2cdd710c8", + "https://deno.land/std@0.200.0/media_types/parse_media_type.ts": "8cb0144385c555c9ce81881b7cee3fbb746f23b4af988fecdb7bd01ef8cc35b1", + "https://deno.land/std@0.200.0/media_types/type_by_extension.ts": "daa801eb0f11cdf199445d0f1b656cf116d47dcf9e5b85cc1e6b4469f5ee0432", + "https://deno.land/std@0.200.0/media_types/vendor/mime-db.v1.52.0.ts": "6925bbcae81ca37241e3f55908d0505724358cda3384eaea707773b2c7e99586", + "https://deno.land/std@0.200.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", + "https://deno.land/std@0.200.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.200.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", + "https://deno.land/std@0.200.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", + "https://deno.land/std@0.200.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", + "https://deno.land/std@0.200.0/path/_from_file_url.ts": "7e4e5626089785adddb061f1b9f4932d6b21c7df778e7449531a11e32048245c", + "https://deno.land/std@0.200.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.200.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", + "https://deno.land/std@0.200.0/path/_join.ts": "fd78555bc34d5f188918fc7018dfe8fe2df5bbad94a3b30a433666c03934d77f", + "https://deno.land/std@0.200.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", + "https://deno.land/std@0.200.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", + "https://deno.land/std@0.200.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", + "https://deno.land/std@0.200.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", + "https://deno.land/std@0.200.0/path/_to_file_url.ts": "739bfda583598790b2e77ce227f2bb618f6ebdb939788cea47555b43970ec58c", + "https://deno.land/std@0.200.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", + "https://deno.land/std@0.200.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", + "https://deno.land/std@0.200.0/path/basename.ts": "6f08fbb90dbfcf320765b3abb01f995b1723f75e2534acfd5380e202c802a3aa", + "https://deno.land/std@0.200.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", + "https://deno.land/std@0.200.0/path/dirname.ts": "098996822a31b4c46e1eb52a19540d3c6f9f54b772fc8a197939eeabc29fca2f", + "https://deno.land/std@0.200.0/path/extname.ts": "9b83c62fd16505739541f7a3ab447d8972da39dbf668d47af2f93206c2480893", + "https://deno.land/std@0.200.0/path/format.ts": "cb22f95cc7853d590b87708cc9441785e760d711188facff3d225305a8213aca", + "https://deno.land/std@0.200.0/path/from_file_url.ts": "a6221cfc928928ec4d9786d767dfac98fa2ab746af0786446c9834a07b98817e", + "https://deno.land/std@0.200.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", + "https://deno.land/std@0.200.0/path/is_absolute.ts": "6b3d36352eb7fa29edb53f9e7b09b1aeb022a3c5465764f6cc5b8c41f9736197", + "https://deno.land/std@0.200.0/path/join.ts": "4a2867ff2f3c81ffc9eb3d56dade16db6f8bd3854f269306d23dad4115089c84", + "https://deno.land/std@0.200.0/path/mod.ts": "7765507696cb321994cdacfc19ee3ba61e8e3ebf4bd98fa75a276cf5dc18ce2a", + "https://deno.land/std@0.200.0/path/mod.tsx": "7765507696cb321994cdacfc19ee3ba61e8e3ebf4bd98fa75a276cf5dc18ce2a", + "https://deno.land/std@0.200.0/path/normalize.ts": "7d992cd262b2deefa842d93a8ba2ed51f3949ba595b1d07f627ac2cddbc74808", + "https://deno.land/std@0.200.0/path/parse.ts": "031fe488b3497fb8312fc1dc3c3d6c2d80707edd9c661e18ee9fd20f95edf322", + "https://deno.land/std@0.200.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", + "https://deno.land/std@0.200.0/path/relative.ts": "7db80c5035016174267da16321a742d76e875215c317859a383b12f413c6f5d6", + "https://deno.land/std@0.200.0/path/resolve.ts": "103b62207726a27f28177f397008545804ecb20aaf00623af1f622b18cd80b9f", + "https://deno.land/std@0.200.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", + "https://deno.land/std@0.200.0/path/to_file_url.ts": "dd32f7a01bbf3b15b5df46796659984b372973d9b2d7d59bcf0eb990763a0cb5", + "https://deno.land/std@0.200.0/path/to_namespaced_path.ts": "4e643ab729bf49ccdc166ad48d2de262ff462938fcf2a44a4425588f4a0bd690", + "https://deno.land/std@0.200.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", + "https://deno.land/std@0.200.0/streams/_common.ts": "f45cba84f0d813de3326466095539602364a9ba521f804cc758f7a475cda692d", + "https://deno.land/std@0.200.0/streams/buffer.ts": "6cd773d22cf21bb988a98cc551b5abfc4c3b03516f93eaa3fb6f2f6e16032deb", + "https://deno.land/std@0.200.0/streams/byte_slice_stream.ts": "c46d7c74836fc8c1a9acd9fe211cbe1bbaaee1b36087c834fb03af4991135c3a", + "https://deno.land/std@0.200.0/streams/copy.ts": "75cbc795ff89291df22ddca5252de88b2e16d40c85d02840593386a8a1454f71", + "https://deno.land/std@0.200.0/streams/delimiter_stream.ts": "f69e849b3d1f59f02424497273f411105a6f76a9f13da92aeeb9a2d554236814", + "https://deno.land/std@0.200.0/streams/early_zip_readable_streams.ts": "4005fa74162b943f79899e5d7cb96adcbc0a6b867f9144974ed12d30e0a556e1", + "https://deno.land/std@0.200.0/streams/iterate_reader.ts": "bbec1d45c2df2c0c5920bad0549351446fdc8e0886d99e95959b259dbcdb6072", + "https://deno.land/std@0.200.0/streams/limited_bytes_transform_stream.ts": "05dc592ffaab83257494d22dd53917e56243c26e5e3129b3f13ddbbbc4785048", + "https://deno.land/std@0.200.0/streams/limited_transform_stream.ts": "d69ab790232c1b86f53621ad41ef03c235f2abb4b7a1cd51960ad6e12ee55e38", + "https://deno.land/std@0.200.0/streams/merge_readable_streams.ts": "dc2db0cbf1b14d999aa2aa2a2a1ba24ce58953878f29845ed9319321d0a01fab", + "https://deno.land/std@0.200.0/streams/mod.ts": "c07ec010e700b9ea887dc36ca08729828bc7912f711e4054e24d33fd46282252", + "https://deno.land/std@0.200.0/streams/mod.tsx": "c07ec010e700b9ea887dc36ca08729828bc7912f711e4054e24d33fd46282252", + "https://deno.land/std@0.200.0/streams/read_all.ts": "ee319772fb0fd28302f97343cc48dfcf948f154fd0d755d8efe65814b70533be", + "https://deno.land/std@0.200.0/streams/readable_stream_from_iterable.ts": "a355e97ba8671a4611ae9671c1f33c4a7e6a1b42fbdc9a399338ac3d6f875364", + "https://deno.land/std@0.200.0/streams/readable_stream_from_reader.ts": "bfc416c4576a30aac6b9af22c9dc292c20c6742141ee7c55b5e85460beb0c54e", + "https://deno.land/std@0.200.0/streams/reader_from_iterable.ts": "55f68110dce3f8f2c87b834d95f153bc904257fc65175f9f2abe78455cb8047c", + "https://deno.land/std@0.200.0/streams/reader_from_stream_reader.ts": "fa4971e5615a010e49492c5d1688ca1a4d17472a41e98b498ab89a64ebd7ac73", + "https://deno.land/std@0.200.0/streams/text_delimiter_stream.ts": "20e680ab8b751390e359288ce764f9c47d164af11a263870746eeca4bc7d976b", + "https://deno.land/std@0.200.0/streams/text_line_stream.ts": "0f2c4b33a5fdb2476f2e060974cba1347cefe99a4af33c28a57524b1a34750fa", + "https://deno.land/std@0.200.0/streams/to_transform_stream.ts": "89fd367cafb3b6d80d61e2f4f1fcf66cc75723ecee8d474b495f022264ec6c3b", + "https://deno.land/std@0.200.0/streams/writable_stream_from_writer.ts": "56fff5c82fb736fdd669b567cc0b2bbbe0351002cd13254eae26c366e2bed89a", + "https://deno.land/std@0.200.0/streams/write_all.ts": "aec90152978581ea62d56bb53a5cbf487e6a89c902f87c5969681ffbdf32b998", + "https://deno.land/std@0.200.0/streams/writer_from_stream_writer.ts": "07c7ee025151a190f37fc42cbb01ff93afc949119ebddc6e0d0df14df1bf6950", + "https://deno.land/std@0.200.0/streams/zip_readable_streams.ts": "a9d81aa451240f79230add674809dbee038d93aabe286e2d9671e66591fc86ca", + "https://deno.land/std@0.84.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", + "https://deno.land/std@0.84.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7", + "https://deno.land/std@0.84.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", + "https://deno.land/std@0.84.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", + "https://deno.land/std@0.84.0/path/_util.ts": "f4fa69aa3cbbd8568763bfc43c7236875015ba343602d8bafd332b4b4243681b", + "https://deno.land/std@0.84.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a", + "https://deno.land/std@0.84.0/path/glob.ts": "4a524c1c9da3e79a9fdabdc6e850cd9e41bdf31e442856ffa19c5b123268ca95", + "https://deno.land/std@0.84.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", + "https://deno.land/std@0.84.0/path/mod.tsx": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", + "https://deno.land/std@0.84.0/path/posix.ts": "1408f8ba482a4dc5fc0a7cd7be28bbbff9608d2b3b5ffdcf288ae1228d959add", + "https://deno.land/std@0.84.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c", + "https://deno.land/std@0.84.0/path/win32.ts": "6ca052f54500f00cd7a5172fde62900626ab620dcd5bdcf4e6f5695d001ddef6", + "https://deno.land/std@0.99.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", + "https://deno.land/std@0.99.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7", + "https://deno.land/std@0.99.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", + "https://deno.land/std@0.99.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", + "https://deno.land/std@0.99.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b", + "https://deno.land/std@0.99.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a", + "https://deno.land/std@0.99.0/path/glob.ts": "314ad9ff263b895795208cdd4d5e35a44618ca3c6dd155e226fb15d065008652", + "https://deno.land/std@0.99.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", + "https://deno.land/std@0.99.0/path/mod.tsx": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", + "https://deno.land/std@0.99.0/path/posix.ts": "f56c3c99feb47f30a40ce9d252ef6f00296fa7c0fcb6dd81211bdb3b8b99ca3b", + "https://deno.land/std@0.99.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c", + "https://deno.land/std@0.99.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8", + "https://deno.land/x/logger@v1.1.5/date.ts": "09041dc83c9cddb489b875f45b07336dd894c23b9dd5b47235b94180571a2efa", + "https://deno.land/x/logger@v1.1.5/deps.ts": "1b09212250f8023edd69efb798874ca19bf90c4ed7cdcc1a292dc16c5bb2cf6d", + "https://deno.land/x/logger@v1.1.5/eol.ts": "493acd048c546fd48bcd26365d4dadf3db81ce32c4611ca5b0b19e6de9f9826a", + "https://deno.land/x/logger@v1.1.5/fs.ts": "7d1c7261e9f15d25c6c09df43169a4665bd9da7e2413534aa294f4b184f3fa4e", + "https://deno.land/x/logger@v1.1.5/interface.ts": "7bca0b861b894e914508aab1afdd7e42e598695a50a3efe9db54be8ba4ab3b0e", + "https://deno.land/x/logger@v1.1.5/logger.ts": "d058a83ec4ceb8582449d1a0f1ba4adce9a85d5c05b2fb1cf9920f7f896a0608", + "https://deno.land/x/logger@v1.1.5/stdout.ts": "f11db1f6569681fe58139b07de1f76e205bf28f6e341a50d56d3b13d95c1f6bb", + "https://deno.land/x/logger@v1.1.5/types.ts": "8835d0d56f500112f92b36d8f241f95bccef93f73de203f7cd86de3ab4383d80", + "https://deno.land/x/logger@v1.1.5/writable.ts": "bb60ba4a798a10ac1649e30598c0c346055c0dcacb8f1e9452e4f66ea6680a45", + "https://deno.land/x/logger@v1.1.5/writer.ts": "539ff3a1bdefef897ca1d13d387ee4d84d6491f460020454e9158076f5e09221", + "https://deno.land/x/media_types@v2.7.1/db.ts": "1d95aa3fc1fe076638550640609394f0e157b18b430800e419aa7ece5c151d9c", + "https://deno.land/x/media_types@v2.7.1/deps.ts": "cd4c31e4b5ed8c4d8c61bd2fb38a82d68d3fd2dcf6d43f22511cbe6d9d310e51", + "https://deno.land/x/media_types@v2.7.1/mod.ts": "d63583b978d32eff8b76e1ae5d83cba2fb27baa90cc1bcb0ad15a06122ea8c19", + "https://deno.land/x/media_types@v2.7.1/mod.tsx": "d63583b978d32eff8b76e1ae5d83cba2fb27baa90cc1bcb0ad15a06122ea8c19", + "https://deno.land/x/oak@v12.6.1/application.ts": "3028d3f6fa5ee743de013881550d054372c11d83c45099c2d794033786d27008", + "https://deno.land/x/oak@v12.6.1/body.ts": "1899761b97fc9d776f3710b2637fb047ba29b968609afc6c0e5219b1108e703c", + "https://deno.land/x/oak@v12.6.1/buf_reader.ts": "26640736541598dbd9f2b84a9d0595756afff03c9ca55b66eef1911f7798b56d", + "https://deno.land/x/oak@v12.6.1/content_disposition.ts": "8b8c3cb2fba7138cd5b7f82fc3b5ea39b33db924a824b28261659db7e164621e", + "https://deno.land/x/oak@v12.6.1/context.ts": "895a2d40186b89c28ba3947bf08a9335f1a11fc33133f760082536b74c53d1ca", + "https://deno.land/x/oak@v12.6.1/deps.ts": "267ef76c25592101fe1f6c6d7730664015a9179c974da4f7441297d9367a9514", + "https://deno.land/x/oak@v12.6.1/etag.ts": "32e47726b41698aefdd71faac5aaf2907c9bdd41ef18a7693863be4f8fee115d", + "https://deno.land/x/oak@v12.6.1/forwarded.ts": "e656f96a85574e2a6ee54dc35efc9f72d543c9ae0923760ef426ee7369eef01c", + "https://deno.land/x/oak@v12.6.1/headers.ts": "769fd042d34fbcd5667cbd745b5c65d335cc8430e822dbf1f87d65313cab4b47", + "https://deno.land/x/oak@v12.6.1/helpers.ts": "6b03c6a2be06ec775d54449e442a2bac234aa952948ca758356eab6dc87af618", + "https://deno.land/x/oak@v12.6.1/http_server_native.ts": "98e12c50a959553cfc144bc00999c969fa69ca781cbd96bec563f55691ab82db", + "https://deno.land/x/oak@v12.6.1/http_server_native_request.ts": "552b174b5e13e92de8897d5b6f716b1e5a53543115481d65a651a41e4ca29ec9", + "https://deno.land/x/oak@v12.6.1/isMediaType.ts": "62d638abcf837ece3a8f07a4b7ca59794135cb0d4b73194c7d5837efd4161005", + "https://deno.land/x/oak@v12.6.1/mediaTyper.ts": "042b853fc8e9c3f6c628dd389e03ef481552bf07242efc3f8a1af042102a6105", + "https://deno.land/x/oak@v12.6.1/middleware.ts": "c7f7a0424a6dd99a00e4b8d7d6e131efc0facc8dea781845d713b63df8ef1862", + "https://deno.land/x/oak@v12.6.1/middleware/proxy.ts": "6f2799cf60d926e7a8d13ff757a59d7f0f930407db7ee9b81e7c064138eb89ff", + "https://deno.land/x/oak@v12.6.1/mod.ts": "f6aa47ad1b6099470c9a884cccad9d3ac0fd242ba940896291ab76cd26cf554b", + "https://deno.land/x/oak@v12.6.1/mod.tsx": "f6aa47ad1b6099470c9a884cccad9d3ac0fd242ba940896291ab76cd26cf554b", + "https://deno.land/x/oak@v12.6.1/multipart.ts": "1484e01b98f5135f2aa09f7d0ce1e7be39109bf9f045ac660e941619d04e3d29", + "https://deno.land/x/oak@v12.6.1/range.ts": "1ca15fc1ac21c650c34e6997a75af2af9d9d8eb6fe2d5d1dadeac3dfd4a9c152", + "https://deno.land/x/oak@v12.6.1/request.ts": "32409827e285ee65889b22bbaaea5d6b280258124c2e9a4f724baa8e6d6375b7", + "https://deno.land/x/oak@v12.6.1/response.ts": "094d950a5158f5b3446ca8a7b6e975dd23afb42b38c38517cc2f41dc75b16b4c", + "https://deno.land/x/oak@v12.6.1/router.ts": "0f53d6249f9e8f89f2522b2b810b9302d0f22593c184b16b24b03bf2b7d42ea1", + "https://deno.land/x/oak@v12.6.1/send.ts": "5ec49f106294593f468317a0c885da4f3274bf6d0fe9e16a7304391730b4f4fb", + "https://deno.land/x/oak@v12.6.1/structured_clone.ts": "c3888b14d1eec558345bfbf13d0993d59bd45aaa8588444e35dd558c3a921cd8", + "https://deno.land/x/oak@v12.6.1/testing.ts": "37d684d57bb8e5150fb5eb2677e66b04dcb422709cf2c5a74c1df94d52aa02e2", + "https://deno.land/x/oak@v12.6.1/util.ts": "0a3fdffb114859c2de84e1783efa3a544af4d2af8c6f08e0d25655de9d3e69bb", + "https://deno.land/x/path_to_regexp@v6.2.1/index.ts": "894060567837bae8fc9c5cbd4d0a05e9024672083d5883b525c031eea940e556", + "https://deno.land/x/static_files@1.1.6/mod.ts": "8a9bb05599e53864c54eb22931fe98507818517e0d69f26e099a1d8f4ef2b638", + "https://deno.land/x/static_files@1.1.6/mod.tsx": "8a9bb05599e53864c54eb22931fe98507818517e0d69f26e099a1d8f4ef2b638", + "https://deno.land/x/static_files@1.1.6/src/deps.ts": "fb62be7a780339157bf692a619d6d02ea9662490deca275f488f9f9db917fc4a", + "https://deno.land/x/static_files@1.1.6/src/types.ts": "ef201288626294e9e1b8ee85cdfe2cdfb282e4d78af445df1726050dfa0c0988", + "https://deno.land/x/static_files@1.1.6/src/utils.ts": "9e6172dc97fed01e70a6b063c5afff40e20fe726b3bae0c5f0a962bad74b7107", + "https://esm.sh/preact-render-to-string@5.1.19?deps=preact@10.5.15": "fba6961b9688151eeccc5425e05740009c3e7abee863615e626fb13e1d17e87a", + "https://esm.sh/preact@10.19.2": "41f31ba8eecf666f08289f2205f57c45f74baba5be815a55c15c4cc61086143c", + "https://esm.sh/preact@10.19.2/jsx-runtime": "2a4111d9aa667a3e3776ffd9082d00d63f6960c038d01620d79f80645ecc049d", + "https://esm.sh/stable/preact@10.19.2/denonext/jsx-runtime.js": "f196c14042fc6019f3fed31eec7cfedea4669d0926858939380a5f54bd503798", + "https://esm.sh/stable/preact@10.19.2/denonext/preact.mjs": "dc999b6432dc04d74ad7b692a8801f346294d815266dff915d0f222c120fd0b0", + "https://esm.sh/stable/preact@10.5.15/denonext/preact.mjs": "4e6645aa945a53e44eaa4d882f9f9b4e76c992875fad9ef5791784474a71a116", + "https://esm.sh/v135/preact-render-to-string@5.1.19/X-ZC9wcmVhY3RAMTAuNS4xNQ/denonext/preact-render-to-string.mjs": "3ce1bda513633d15cd313e97ab7eacba9bd50eb4dc95e41861056c6bae1bfac8" + } +} diff --git a/visualizer/public/vendor/htmx/ext/ajax-header.js b/visualizer/public/vendor/htmx/ext/ajax-header.js new file mode 100644 index 0000000..5c6221b --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/ajax-header.js @@ -0,0 +1,7 @@ +htmx.defineExtension('ajax-header', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + evt.detail.headers['X-Requested-With'] = 'XMLHttpRequest'; + } + } +}); \ No newline at end of file diff --git a/visualizer/public/vendor/htmx/ext/alpine-morph.js b/visualizer/public/vendor/htmx/ext/alpine-morph.js new file mode 100644 index 0000000..1872dae --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/alpine-morph.js @@ -0,0 +1,16 @@ +htmx.defineExtension('alpine-morph', { + isInlineSwap: function (swapStyle) { + return swapStyle === 'morph'; + }, + handleSwap: function (swapStyle, target, fragment) { + if (swapStyle === 'morph') { + if (fragment.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { + Alpine.morph(target, fragment.firstElementChild); + return [target]; + } else { + Alpine.morph(target, fragment.outerHTML); + return [target]; + } + } + } +}); \ No newline at end of file diff --git a/visualizer/public/vendor/htmx/ext/class-tools.js b/visualizer/public/vendor/htmx/ext/class-tools.js new file mode 100644 index 0000000..1cf4b42 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/class-tools.js @@ -0,0 +1,92 @@ +(function () { + + function splitOnWhitespace(trigger) { + return trigger.split(/\s+/); + } + + function parseClassOperation(trimmedValue) { + var split = splitOnWhitespace(trimmedValue); + if (split.length > 1) { + var operation = split[0]; + var classDef = split[1].trim(); + var cssClass; + var delay; + if (classDef.indexOf(":") > 0) { + var splitCssClass = classDef.split(':'); + cssClass = splitCssClass[0]; + delay = htmx.parseInterval(splitCssClass[1]); + } else { + cssClass = classDef; + delay = 100; + } + return { + operation: operation, + cssClass: cssClass, + delay: delay + } + } else { + return null; + } + } + + function performOperation(elt, classOperation, classList, currentRunTime) { + setTimeout(function () { + elt.classList[classOperation.operation].call(elt.classList, classOperation.cssClass); + }, currentRunTime) + } + + function toggleOperation(elt, classOperation, classList, currentRunTime) { + setTimeout(function () { + setInterval(function () { + elt.classList[classOperation.operation].call(elt.classList, classOperation.cssClass); + }, classOperation.delay); + }, currentRunTime) + } + + function processClassList(elt, classList) { + var runs = classList.split("&"); + for (var i = 0; i < runs.length; i++) { + var run = runs[i]; + var currentRunTime = 0; + var classOperations = run.split(","); + for (var j = 0; j < classOperations.length; j++) { + var value = classOperations[j]; + var trimmedValue = value.trim(); + var classOperation = parseClassOperation(trimmedValue); + if (classOperation) { + if (classOperation.operation === "toggle") { + toggleOperation(elt, classOperation, classList, currentRunTime); + currentRunTime = currentRunTime + classOperation.delay; + } else { + currentRunTime = currentRunTime + classOperation.delay; + performOperation(elt, classOperation, classList, currentRunTime); + } + } + } + } + } + + function maybeProcessClasses(elt) { + if (elt.getAttribute) { + var classList = elt.getAttribute("classes") || elt.getAttribute("data-classes"); + if (classList) { + processClassList(elt, classList); + } + } + } + + htmx.defineExtension('class-tools', { + onEvent: function (name, evt) { + if (name === "htmx:afterProcessNode") { + var elt = evt.detail.elt; + maybeProcessClasses(elt); + if (elt.querySelectorAll) { + var children = elt.querySelectorAll("[classes], [data-classes]"); + for (var i = 0; i < children.length; i++) { + maybeProcessClasses(children[i]); + } + } + } + } + }); +})(); \ No newline at end of file diff --git a/visualizer/public/vendor/htmx/ext/client-side-templates.js b/visualizer/public/vendor/htmx/ext/client-side-templates.js new file mode 100644 index 0000000..2bace41 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/client-side-templates.js @@ -0,0 +1,96 @@ +htmx.defineExtension('client-side-templates', { + transformResponse : function(text, xhr, elt) { + + var mustacheTemplate = htmx.closest(elt, "[mustache-template]"); + if (mustacheTemplate) { + var data = JSON.parse(text); + var templateId = mustacheTemplate.getAttribute('mustache-template'); + var template = htmx.find("#" + templateId); + if (template) { + return Mustache.render(template.innerHTML, data); + } else { + throw "Unknown mustache template: " + templateId; + } + } + + var mustacheArrayTemplate = htmx.closest(elt, "[mustache-array-template]"); + if (mustacheArrayTemplate) { + var data = JSON.parse(text); + var templateId = mustacheArrayTemplate.getAttribute('mustache-array-template'); + var template = htmx.find("#" + templateId); + if (template) { + return Mustache.render(template.innerHTML, {"data": data }); + } else { + throw "Unknown mustache template: " + templateId; + } + } + + var handlebarsTemplate = htmx.closest(elt, "[handlebars-template]"); + if (handlebarsTemplate) { + var data = JSON.parse(text); + var templateId = handlebarsTemplate.getAttribute('handlebars-template'); + var templateElement = htmx.find('#' + templateId).innerHTML; + var renderTemplate = Handlebars.compile(templateElement); + if (renderTemplate) { + return renderTemplate(data); + } else { + throw "Unknown handlebars template: " + templateId; + } + } + + var handlebarsArrayTemplate = htmx.closest(elt, "[handlebars-array-template]"); + if (handlebarsArrayTemplate) { + var data = JSON.parse(text); + var templateId = handlebarsArrayTemplate.getAttribute('handlebars-array-template'); + var templateElement = htmx.find('#' + templateId).innerHTML; + var renderTemplate = Handlebars.compile(templateElement); + if (renderTemplate) { + return renderTemplate(data); + } else { + throw "Unknown handlebars template: " + templateId; + } + } + + var nunjucksTemplate = htmx.closest(elt, "[nunjucks-template]"); + if (nunjucksTemplate) { + var data = JSON.parse(text); + var templateName = nunjucksTemplate.getAttribute('nunjucks-template'); + var template = htmx.find('#' + templateName); + if (template) { + return nunjucks.renderString(template.innerHTML, data); + } else { + return nunjucks.render(templateName, data); + } + } + + var xsltTemplate = htmx.closest(elt, "[xslt-template]"); + if (xsltTemplate) { + var templateId = xsltTemplate.getAttribute('xslt-template'); + var template = htmx.find("#" + templateId); + if (template) { + var content = template.innerHTML ? new DOMParser().parseFromString(template.innerHTML, 'application/xml') + : template.contentDocument; + var processor = new XSLTProcessor(); + processor.importStylesheet(content); + var data = new DOMParser().parseFromString(text, "application/xml"); + var frag = processor.transformToFragment(data, document); + return new XMLSerializer().serializeToString(frag); + } else { + throw "Unknown XSLT template: " + templateId; + } + } + + var nunjucksArrayTemplate = htmx.closest(elt, "[nunjucks-array-template]"); + if (nunjucksArrayTemplate) { + var data = JSON.parse(text); + var templateName = nunjucksArrayTemplate.getAttribute('nunjucks-array-template'); + var template = htmx.find('#' + templateName); + if (template) { + return nunjucks.renderString(template.innerHTML, {"data": data}); + } else { + return nunjucks.render(templateName, {"data": data}); + } + } + return text; + } +}); diff --git a/visualizer/public/vendor/htmx/ext/debug.js b/visualizer/public/vendor/htmx/ext/debug.js new file mode 100644 index 0000000..861ee74 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/debug.js @@ -0,0 +1,11 @@ +htmx.defineExtension('debug', { + onEvent: function (name, evt) { + if (console.debug) { + console.debug(name, evt); + } else if (console) { + console.log("DEBUG:", name, evt); + } else { + throw "NO CONSOLE SUPPORTED" + } + } +}); diff --git a/visualizer/public/vendor/htmx/ext/disable-element.js b/visualizer/public/vendor/htmx/ext/disable-element.js new file mode 100644 index 0000000..07bef62 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/disable-element.js @@ -0,0 +1,18 @@ +"use strict"; + +// Disable Submit Button +htmx.defineExtension('disable-element', { + onEvent: function (name, evt) { + let elt = evt.detail.elt; + let target = elt.getAttribute("hx-disable-element"); + let targetElements = (target == "self") ? [ elt ] : document.querySelectorAll(target); + + for (var i = 0; i < targetElements.length; i++) { + if (name === "htmx:beforeRequest" && targetElements[i]) { + targetElements[i].disabled = true; + } else if (name == "htmx:afterRequest" && targetElements[i]) { + targetElements[i].disabled = false; + } + } + } +}); \ No newline at end of file diff --git a/visualizer/public/vendor/htmx/ext/event-header.js b/visualizer/public/vendor/htmx/ext/event-header.js new file mode 100644 index 0000000..c7d2933 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/event-header.js @@ -0,0 +1,37 @@ +(function(){ + function stringifyEvent(event) { + var obj = {}; + for (var key in event) { + obj[key] = event[key]; + } + return JSON.stringify(obj, function(key, value){ + if(value instanceof Node){ + var nodeRep = value.tagName; + if (nodeRep) { + nodeRep = nodeRep.toLowerCase(); + if(value.id){ + nodeRep += "#" + value.id; + } + if(value.classList && value.classList.length){ + nodeRep += "." + value.classList.toString().replace(" ", ".") + } + return nodeRep; + } else { + return "Node" + } + } + if (value instanceof Window) return 'Window'; + return value; + }); + } + + htmx.defineExtension('event-header', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + if (evt.detail.triggeringEvent) { + evt.detail.headers['Triggering-Event'] = stringifyEvent(evt.detail.triggeringEvent); + } + } + } + }); +})(); diff --git a/visualizer/public/vendor/htmx/ext/head-support.js b/visualizer/public/vendor/htmx/ext/head-support.js new file mode 100644 index 0000000..67cfc69 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/head-support.js @@ -0,0 +1,141 @@ +//========================================================== +// head-support.js +// +// An extension to htmx 1.0 to add head tag merging. +//========================================================== +(function(){ + + var api = null; + + function log() { + //console.log(arguments); + } + + function mergeHead(newContent, defaultMergeStrategy) { + + if (newContent && newContent.indexOf(' -1) { + const htmlDoc = document.createElement("html"); + // remove svgs to avoid conflicts + var contentWithSvgsRemoved = newContent.replace(/]*>|>)([\s\S]*?)<\/svg>/gim, ''); + // extract head tag + var headTag = contentWithSvgsRemoved.match(/(]*>|>)([\s\S]*?)<\/head>)/im); + + // if the head tag exists... + if (headTag) { + + var added = [] + var removed = [] + var preserved = [] + var nodesToAppend = [] + + htmlDoc.innerHTML = headTag; + var newHeadTag = htmlDoc.querySelector("head"); + var currentHead = document.head; + + if (newHeadTag == null) { + return; + } else { + // put all new head elements into a Map, by their outerHTML + var srcToNewHeadNodes = new Map(); + for (const newHeadChild of newHeadTag.children) { + srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild); + } + } + + + + // determine merge strategy + var mergeStrategy = api.getAttributeValue(newHeadTag, "hx-head") || defaultMergeStrategy; + + // get the current head + for (const currentHeadElt of currentHead.children) { + + // If the current head element is in the map + var inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML); + var isReAppended = currentHeadElt.getAttribute("hx-head") === "re-eval"; + var isPreserved = api.getAttributeValue(currentHeadElt, "hx-preserve") === "true"; + if (inNewContent || isPreserved) { + if (isReAppended) { + // remove the current version and let the new version replace it and re-execute + removed.push(currentHeadElt); + } else { + // this element already exists and should not be re-appended, so remove it from + // the new content map, preserving it in the DOM + srcToNewHeadNodes.delete(currentHeadElt.outerHTML); + preserved.push(currentHeadElt); + } + } else { + if (mergeStrategy === "append") { + // we are appending and this existing element is not new content + // so if and only if it is marked for re-append do we do anything + if (isReAppended) { + removed.push(currentHeadElt); + nodesToAppend.push(currentHeadElt); + } + } else { + // if this is a merge, we remove this content since it is not in the new head + if (api.triggerEvent(document.body, "htmx:removingHeadElement", {headElement: currentHeadElt}) !== false) { + removed.push(currentHeadElt); + } + } + } + } + + // Push the tremaining new head elements in the Map into the + // nodes to append to the head tag + nodesToAppend.push(...srcToNewHeadNodes.values()); + log("to append: ", nodesToAppend); + + for (const newNode of nodesToAppend) { + log("adding: ", newNode); + var newElt = document.createRange().createContextualFragment(newNode.outerHTML); + log(newElt); + if (api.triggerEvent(document.body, "htmx:addingHeadElement", {headElement: newElt}) !== false) { + currentHead.appendChild(newElt); + added.push(newElt); + } + } + + // remove all removed elements, after we have appended the new elements to avoid + // additional network requests for things like style sheets + for (const removedElement of removed) { + if (api.triggerEvent(document.body, "htmx:removingHeadElement", {headElement: removedElement}) !== false) { + currentHead.removeChild(removedElement); + } + } + + api.triggerEvent(document.body, "htmx:afterHeadMerge", {added: added, kept: preserved, removed: removed}); + } + } + } + + htmx.defineExtension("head-support", { + init: function(apiRef) { + // store a reference to the internal API. + api = apiRef; + + htmx.on('htmx:afterSwap', function(evt){ + var serverResponse = evt.detail.xhr.response; + if (api.triggerEvent(document.body, "htmx:beforeHeadMerge", evt.detail)) { + mergeHead(serverResponse, evt.detail.boosted ? "merge" : "append"); + } + }) + + htmx.on('htmx:historyRestore', function(evt){ + if (api.triggerEvent(document.body, "htmx:beforeHeadMerge", evt.detail)) { + if (evt.detail.cacheMiss) { + mergeHead(evt.detail.serverResponse, "merge"); + } else { + mergeHead(evt.detail.item.head, "merge"); + } + } + }) + + htmx.on('htmx:historyItemCreated', function(evt){ + var historyItem = evt.detail.item; + historyItem.head = document.head.outerHTML; + }) + } + }); + +})() \ No newline at end of file diff --git a/visualizer/public/vendor/htmx/ext/include-vals.js b/visualizer/public/vendor/htmx/ext/include-vals.js new file mode 100644 index 0000000..d8f5ce4 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/include-vals.js @@ -0,0 +1,24 @@ +(function(){ + + function mergeObjects(obj1, obj2) { + for (var key in obj2) { + if (obj2.hasOwnProperty(key)) { + obj1[key] = obj2[key]; + } + } + return obj1; + } + + htmx.defineExtension('include-vals', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + var includeValsElt = htmx.closest(evt.detail.elt, "[include-vals],[data-include-vals]"); + if (includeValsElt) { + var includeVals = includeValsElt.getAttribute("include-vals") || includeValsElt.getAttribute("data-include-vals"); + var valuesToInclude = eval("({" + includeVals + "})"); + mergeObjects(evt.detail.parameters, valuesToInclude); + } + } + } + }); +})(); diff --git a/visualizer/public/vendor/htmx/ext/json-enc.js b/visualizer/public/vendor/htmx/ext/json-enc.js new file mode 100644 index 0000000..db0aa36 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/json-enc.js @@ -0,0 +1,12 @@ +htmx.defineExtension('json-enc', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + evt.detail.headers['Content-Type'] = "application/json"; + } + }, + + encodeParameters : function(xhr, parameters, elt) { + xhr.overrideMimeType('text/json'); + return (JSON.stringify(parameters)); + } +}); \ No newline at end of file diff --git a/visualizer/public/vendor/htmx/ext/loading-states.js b/visualizer/public/vendor/htmx/ext/loading-states.js new file mode 100644 index 0000000..c8ab51d --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/loading-states.js @@ -0,0 +1,183 @@ +;(function () { + let loadingStatesUndoQueue = [] + + function loadingStateContainer(target) { + return htmx.closest(target, '[data-loading-states]') || document.body + } + + function mayProcessUndoCallback(target, callback) { + if (document.body.contains(target)) { + callback() + } + } + + function mayProcessLoadingStateByPath(elt, requestPath) { + const pathElt = htmx.closest(elt, '[data-loading-path]') + if (!pathElt) { + return true + } + + return pathElt.getAttribute('data-loading-path') === requestPath + } + + function queueLoadingState(sourceElt, targetElt, doCallback, undoCallback) { + const delayElt = htmx.closest(sourceElt, '[data-loading-delay]') + if (delayElt) { + const delayInMilliseconds = + delayElt.getAttribute('data-loading-delay') || 200 + const timeout = setTimeout(function () { + doCallback() + + loadingStatesUndoQueue.push(function () { + mayProcessUndoCallback(targetElt, undoCallback) + }) + }, delayInMilliseconds) + + loadingStatesUndoQueue.push(function () { + mayProcessUndoCallback(targetElt, function () { clearTimeout(timeout) }) + }) + } else { + doCallback() + loadingStatesUndoQueue.push(function () { + mayProcessUndoCallback(targetElt, undoCallback) + }) + } + } + + function getLoadingStateElts(loadingScope, type, path) { + return Array.from(htmx.findAll(loadingScope, "[" + type + "]")).filter( + function (elt) { return mayProcessLoadingStateByPath(elt, path) } + ) + } + + function getLoadingTarget(elt) { + if (elt.getAttribute('data-loading-target')) { + return Array.from( + htmx.findAll(elt.getAttribute('data-loading-target')) + ) + } + return [elt] + } + + htmx.defineExtension('loading-states', { + onEvent: function (name, evt) { + if (name === 'htmx:beforeRequest') { + const container = loadingStateContainer(evt.target) + + const loadingStateTypes = [ + 'data-loading', + 'data-loading-class', + 'data-loading-class-remove', + 'data-loading-disable', + 'data-loading-aria-busy', + ] + + let loadingStateEltsByType = {} + + loadingStateTypes.forEach(function (type) { + loadingStateEltsByType[type] = getLoadingStateElts( + container, + type, + evt.detail.pathInfo.requestPath + ) + }) + + loadingStateEltsByType['data-loading'].forEach(function (sourceElt) { + getLoadingTarget(sourceElt).forEach(function (targetElt) { + queueLoadingState( + sourceElt, + targetElt, + function () { + targetElt.style.display = + sourceElt.getAttribute('data-loading') || + 'inline-block' }, + function () { targetElt.style.display = 'none' } + ) + }) + }) + + loadingStateEltsByType['data-loading-class'].forEach( + function (sourceElt) { + const classNames = sourceElt + .getAttribute('data-loading-class') + .split(' ') + + getLoadingTarget(sourceElt).forEach(function (targetElt) { + queueLoadingState( + sourceElt, + targetElt, + function () { + classNames.forEach(function (className) { + targetElt.classList.add(className) + }) + }, + function() { + classNames.forEach(function (className) { + targetElt.classList.remove(className) + }) + } + ) + }) + } + ) + + loadingStateEltsByType['data-loading-class-remove'].forEach( + function (sourceElt) { + const classNames = sourceElt + .getAttribute('data-loading-class-remove') + .split(' ') + + getLoadingTarget(sourceElt).forEach(function (targetElt) { + queueLoadingState( + sourceElt, + targetElt, + function () { + classNames.forEach(function (className) { + targetElt.classList.remove(className) + }) + }, + function() { + classNames.forEach(function (className) { + targetElt.classList.add(className) + }) + } + ) + }) + } + ) + + loadingStateEltsByType['data-loading-disable'].forEach( + function (sourceElt) { + getLoadingTarget(sourceElt).forEach(function (targetElt) { + queueLoadingState( + sourceElt, + targetElt, + function() { targetElt.disabled = true }, + function() { targetElt.disabled = false } + ) + }) + } + ) + + loadingStateEltsByType['data-loading-aria-busy'].forEach( + function (sourceElt) { + getLoadingTarget(sourceElt).forEach(function (targetElt) { + queueLoadingState( + sourceElt, + targetElt, + function () { targetElt.setAttribute("aria-busy", "true") }, + function () { targetElt.removeAttribute("aria-busy") } + ) + }) + } + ) + } + + if (name === 'htmx:beforeOnLoad') { + while (loadingStatesUndoQueue.length > 0) { + loadingStatesUndoQueue.shift()() + } + } + }, + }) +})() diff --git a/visualizer/public/vendor/htmx/ext/method-override.js b/visualizer/public/vendor/htmx/ext/method-override.js new file mode 100644 index 0000000..2e3504c --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/method-override.js @@ -0,0 +1,11 @@ +htmx.defineExtension('method-override', { + onEvent: function (name, evt) { + if (name === "htmx:configRequest") { + var method = evt.detail.verb; + if (method !== "get" || method !== "post") { + evt.detail.headers['X-HTTP-Method-Override'] = method.toUpperCase(); + evt.detail.verb = "post"; + } + } + } +}); diff --git a/visualizer/public/vendor/htmx/ext/morphdom-swap.js b/visualizer/public/vendor/htmx/ext/morphdom-swap.js new file mode 100644 index 0000000..a1e53ce --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/morphdom-swap.js @@ -0,0 +1,17 @@ +htmx.defineExtension('morphdom-swap', { + isInlineSwap: function(swapStyle) { + return swapStyle === 'morphdom'; + }, + handleSwap: function (swapStyle, target, fragment) { + if (swapStyle === 'morphdom') { + if (fragment.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { + // IE11 doesn't support DocumentFragment.firstElementChild + morphdom(target, fragment.firstElementChild || fragment.firstChild); + return [target]; + } else { + morphdom(target, fragment.outerHTML); + return [target]; + } + } + } +}); diff --git a/visualizer/public/vendor/htmx/ext/multi-swap.js b/visualizer/public/vendor/htmx/ext/multi-swap.js new file mode 100644 index 0000000..f38f5b0 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/multi-swap.js @@ -0,0 +1,45 @@ +(function () { + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension('multi-swap', { + init: function (apiRef) { + api = apiRef; + }, + isInlineSwap: function (swapStyle) { + return swapStyle.indexOf('multi:') === 0; + }, + handleSwap: function (swapStyle, target, fragment, settleInfo) { + if (swapStyle.indexOf('multi:') === 0) { + var selectorToSwapStyle = {}; + var elements = swapStyle.replace(/^multi\s*:\s*/, '').split(/\s*,\s*/); + + elements.map(function (element) { + var split = element.split(/\s*:\s*/); + var elementSelector = split[0]; + var elementSwapStyle = typeof (split[1]) !== "undefined" ? split[1] : "innerHTML"; + + if (elementSelector.charAt(0) !== '#') { + console.error("HTMX multi-swap: unsupported selector '" + elementSelector + "'. Only ID selectors starting with '#' are supported."); + return; + } + + selectorToSwapStyle[elementSelector] = elementSwapStyle; + }); + + for (var selector in selectorToSwapStyle) { + var swapStyle = selectorToSwapStyle[selector]; + var elementToSwap = fragment.querySelector(selector); + if (elementToSwap) { + api.oobSwap(swapStyle, elementToSwap, settleInfo); + } else { + console.warn("HTMX multi-swap: selector '" + selector + "' not found in source content."); + } + } + + return true; + } + } + }); +})(); \ No newline at end of file diff --git a/visualizer/public/vendor/htmx/ext/path-deps.js b/visualizer/public/vendor/htmx/ext/path-deps.js new file mode 100644 index 0000000..4987e50 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/path-deps.js @@ -0,0 +1,60 @@ +(function(undefined){ + 'use strict'; + + // Save a reference to the global object (window in the browser) + var _root = this; + + function dependsOn(pathSpec, url) { + if (pathSpec === "ignore") { + return false; + } + var dependencyPath = pathSpec.split("/"); + var urlPath = url.split("/"); + for (var i = 0; i < urlPath.length; i++) { + var dependencyElement = dependencyPath.shift(); + var pathElement = urlPath[i]; + if (dependencyElement !== pathElement && dependencyElement !== "*") { + return false; + } + if (dependencyPath.length === 0 || (dependencyPath.length === 1 && dependencyPath[0] === "")) { + return true; + } + } + return false; + } + + function refreshPath(path) { + var eltsWithDeps = htmx.findAll("[path-deps]"); + for (var i = 0; i < eltsWithDeps.length; i++) { + var elt = eltsWithDeps[i]; + if (dependsOn(elt.getAttribute('path-deps'), path)) { + htmx.trigger(elt, "path-deps"); + } + } + } + + htmx.defineExtension('path-deps', { + onEvent: function (name, evt) { + if (name === "htmx:beforeOnLoad") { + var config = evt.detail.requestConfig; + // mutating call + if (config.verb !== "get" && evt.target.getAttribute('path-deps') !== 'ignore') { + refreshPath(config.path); + } + } + } + }); + + /** + * ******************** + * Expose functionality + * ******************** + */ + + _root.PathDeps = { + refresh: function(path) { + refreshPath(path); + } + }; + +}).call(this); diff --git a/visualizer/public/vendor/htmx/ext/path-params.js b/visualizer/public/vendor/htmx/ext/path-params.js new file mode 100644 index 0000000..e251b89 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/path-params.js @@ -0,0 +1,11 @@ +htmx.defineExtension('path-params', { + onEvent: function(name, evt) { + if (name === "htmx:configRequest") { + evt.detail.path = evt.detail.path.replace(/{([^}]+)}/g, function (_, param) { + var val = evt.detail.parameters[param]; + delete evt.detail.parameters[param]; + return val === undefined ? "{" + param + "}" : encodeURIComponent(val); + }) + } + } +}); \ No newline at end of file diff --git a/visualizer/public/vendor/htmx/ext/preload.js b/visualizer/public/vendor/htmx/ext/preload.js new file mode 100644 index 0000000..a749370 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/preload.js @@ -0,0 +1,147 @@ +// This adds the "preload" extension to htmx. By default, this will +// preload the targets of any tags with `href` or `hx-get` attributes +// if they also have a `preload` attribute as well. See documentation +// for more details +htmx.defineExtension("preload", { + + onEvent: function(name, event) { + + // Only take actions on "htmx:afterProcessNode" + if (name !== "htmx:afterProcessNode") { + return; + } + + // SOME HELPER FUNCTIONS WE'LL NEED ALONG THE WAY + + // attr gets the closest non-empty value from the attribute. + var attr = function(node, property) { + if (node == undefined) {return undefined;} + return node.getAttribute(property) || node.getAttribute("data-" + property) || attr(node.parentElement, property) + } + + // load handles the actual HTTP fetch, and uses htmx.ajax in cases where we're + // preloading an htmx resource (this sends the same HTTP headers as a regular htmx request) + var load = function(node) { + + // Called after a successful AJAX request, to mark the + // content as loaded (and prevent additional AJAX calls.) + var done = function(html) { + if (!node.preloadAlways) { + node.preloadState = "DONE" + } + + if (attr(node, "preload-images") == "true") { + document.createElement("div").innerHTML = html // create and populate a node to load linked resources, too. + } + } + + return function() { + + // If this value has already been loaded, then do not try again. + if (node.preloadState !== "READY") { + return; + } + + // Special handling for HX-GET - use built-in htmx.ajax function + // so that headers match other htmx requests, then set + // node.preloadState = TRUE so that requests are not duplicated + // in the future + var hxGet = node.getAttribute("hx-get") || node.getAttribute("data-hx-get") + if (hxGet) { + htmx.ajax("GET", hxGet, { + source: node, + handler:function(elt, info) { + done(info.xhr.responseText); + } + }); + return; + } + + // Otherwise, perform a standard xhr request, then set + // node.preloadState = TRUE so that requests are not duplicated + // in the future. + if (node.getAttribute("href")) { + var r = new XMLHttpRequest(); + r.open("GET", node.getAttribute("href")); + r.onload = function() {done(r.responseText);}; + r.send(); + return; + } + } + } + + // This function processes a specific node and sets up event handlers. + // We'll search for nodes and use it below. + var init = function(node) { + + // If this node DOES NOT include a "GET" transaction, then there's nothing to do here. + if (node.getAttribute("href") + node.getAttribute("hx-get") + node.getAttribute("data-hx-get") == "") { + return; + } + + // Guarantee that we only initialize each node once. + if (node.preloadState !== undefined) { + return; + } + + // Get event name from config. + var on = attr(node, "preload") || "mousedown" + const always = on.indexOf("always") !== -1 + if (always) { + on = on.replace('always', '').trim() + } + + // FALL THROUGH to here means we need to add an EventListener + + // Apply the listener to the node + node.addEventListener(on, function(evt) { + if (node.preloadState === "PAUSE") { // Only add one event listener + node.preloadState = "READY"; // Required for the `load` function to trigger + + // Special handling for "mouseover" events. Wait 100ms before triggering load. + if (on === "mouseover") { + window.setTimeout(load(node), 100); + } else { + load(node)() // all other events trigger immediately. + } + } + }) + + // Special handling for certain built-in event handlers + switch (on) { + + case "mouseover": + // Mirror `touchstart` events (fires immediately) + node.addEventListener("touchstart", load(node)); + + // WHhen the mouse leaves, immediately disable the preload + node.addEventListener("mouseout", function(evt) { + if ((evt.target === node) && (node.preloadState === "READY")) { + node.preloadState = "PAUSE"; + } + }) + break; + + case "mousedown": + // Mirror `touchstart` events (fires immediately) + node.addEventListener("touchstart", load(node)); + break; + } + + // Mark the node as ready to run. + node.preloadState = "PAUSE"; + node.preloadAlways = always; + htmx.trigger(node, "preload:init") // This event can be used to load content immediately. + } + + // Search for all child nodes that have a "preload" attribute + event.target.querySelectorAll("[preload]").forEach(function(node) { + + // Initialize the node with the "preload" attribute + init(node) + + // Initialize all child elements that are anchors or have `hx-get` (use with care) + node.querySelectorAll("a,[hx-get],[data-hx-get]").forEach(init) + }) + } +}) diff --git a/visualizer/public/vendor/htmx/ext/rails-method.js b/visualizer/public/vendor/htmx/ext/rails-method.js new file mode 100644 index 0000000..5d48ecc --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/rails-method.js @@ -0,0 +1,10 @@ +htmx.defineExtension('rails-method', { + onEvent: function (name, evt) { + if (name === "configRequest.htmx") { + var methodOverride = evt.detail.headers['X-HTTP-Method-Override']; + if (methodOverride) { + evt.detail.parameters['_method'] = methodOverride; + } + } + } +}); diff --git a/visualizer/public/vendor/htmx/ext/remove-me.js b/visualizer/public/vendor/htmx/ext/remove-me.js new file mode 100644 index 0000000..42be993 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/remove-me.js @@ -0,0 +1,27 @@ +(function(){ + function maybeRemoveMe(elt) { + var timing = elt.getAttribute("remove-me") || elt.getAttribute("data-remove-me"); + if (timing) { + setTimeout(function () { + elt.parentElement.removeChild(elt); + }, htmx.parseInterval(timing)); + } + } + + htmx.defineExtension('remove-me', { + onEvent: function (name, evt) { + if (name === "htmx:afterProcessNode") { + var elt = evt.detail.elt; + if (elt.getAttribute) { + maybeRemoveMe(elt); + if (elt.querySelectorAll) { + var children = elt.querySelectorAll("[remove-me], [data-remove-me]"); + for (var i = 0; i < children.length; i++) { + maybeRemoveMe(children[i]); + } + } + } + } + } + }); +})(); diff --git a/visualizer/public/vendor/htmx/ext/response-targets.js b/visualizer/public/vendor/htmx/ext/response-targets.js new file mode 100644 index 0000000..dd6fd41 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/response-targets.js @@ -0,0 +1,130 @@ +(function(){ + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + var attrPrefix = 'hx-target-'; + + // IE11 doesn't support string.startsWith + function startsWith(str, prefix) { + return str.substring(0, prefix.length) === prefix + } + + /** + * @param {HTMLElement} elt + * @param {number} respCode + * @returns {HTMLElement | null} + */ + function getRespCodeTarget(elt, respCodeNumber) { + if (!elt || !respCodeNumber) return null; + + var respCode = respCodeNumber.toString(); + + // '*' is the original syntax, as the obvious character for a wildcard. + // The 'x' alternative was added for maximum compatibility with HTML + // templating engines, due to ambiguity around which characters are + // supported in HTML attributes. + // + // Start with the most specific possible attribute and generalize from + // there. + var attrPossibilities = [ + respCode, + + respCode.substr(0, 2) + '*', + respCode.substr(0, 2) + 'x', + + respCode.substr(0, 1) + '*', + respCode.substr(0, 1) + 'x', + respCode.substr(0, 1) + '**', + respCode.substr(0, 1) + 'xx', + + '*', + 'x', + '***', + 'xxx', + ]; + if (startsWith(respCode, '4') || startsWith(respCode, '5')) { + attrPossibilities.push('error'); + } + + for (var i = 0; i < attrPossibilities.length; i++) { + var attr = attrPrefix + attrPossibilities[i]; + var attrValue = api.getClosestAttributeValue(elt, attr); + if (attrValue) { + if (attrValue === "this") { + return api.findThisElement(elt, attr); + } else { + return api.querySelectorExt(elt, attrValue); + } + } + } + + return null; + } + + /** @param {Event} evt */ + function handleErrorFlag(evt) { + if (evt.detail.isError) { + if (htmx.config.responseTargetUnsetsError) { + evt.detail.isError = false; + } + } else if (htmx.config.responseTargetSetsError) { + evt.detail.isError = true; + } + } + + htmx.defineExtension('response-targets', { + + /** @param {import("../htmx").HtmxInternalApi} apiRef */ + init: function (apiRef) { + api = apiRef; + + if (htmx.config.responseTargetUnsetsError === undefined) { + htmx.config.responseTargetUnsetsError = true; + } + if (htmx.config.responseTargetSetsError === undefined) { + htmx.config.responseTargetSetsError = false; + } + if (htmx.config.responseTargetPrefersExisting === undefined) { + htmx.config.responseTargetPrefersExisting = false; + } + if (htmx.config.responseTargetPrefersRetargetHeader === undefined) { + htmx.config.responseTargetPrefersRetargetHeader = true; + } + }, + + /** + * @param {string} name + * @param {Event} evt + */ + onEvent: function (name, evt) { + if (name === "htmx:beforeSwap" && + evt.detail.xhr && + evt.detail.xhr.status !== 200) { + if (evt.detail.target) { + if (htmx.config.responseTargetPrefersExisting) { + evt.detail.shouldSwap = true; + handleErrorFlag(evt); + return true; + } + if (htmx.config.responseTargetPrefersRetargetHeader && + evt.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)) { + evt.detail.shouldSwap = true; + handleErrorFlag(evt); + return true; + } + } + if (!evt.detail.requestConfig) { + return true; + } + var target = getRespCodeTarget(evt.detail.requestConfig.elt, evt.detail.xhr.status); + if (target) { + handleErrorFlag(evt); + evt.detail.shouldSwap = true; + evt.detail.target = target; + } + return true; + } + } + }); +})(); diff --git a/visualizer/public/vendor/htmx/ext/restored.js b/visualizer/public/vendor/htmx/ext/restored.js new file mode 100644 index 0000000..6f65267 --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/restored.js @@ -0,0 +1,15 @@ +htmx.defineExtension('restored', { + onEvent : function(name, evt) { + if (name === 'htmx:restored'){ + var restoredElts = evt.detail.document.querySelectorAll( + "[hx-trigger='restored'],[data-hx-trigger='restored']" + ); + // need a better way to do this, would prefer to just trigger from evt.detail.elt + var foundElt = Array.from(restoredElts).find( + (x) => (x.outerHTML === evt.detail.elt.outerHTML) + ); + var restoredEvent = evt.detail.triggerEvent(foundElt, 'restored'); + } + return; + } +}) \ No newline at end of file diff --git a/visualizer/public/vendor/htmx/ext/sse.js b/visualizer/public/vendor/htmx/ext/sse.js new file mode 100644 index 0000000..943d80a --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/sse.js @@ -0,0 +1,355 @@ +/* +Server Sent Events Extension +============================ +This extension adds support for Server Sent Events to htmx. See /www/extensions/sse.md for usage instructions. + +*/ + +(function() { + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension("sse", { + + /** + * Init saves the provided reference to the internal HTMX API. + * + * @param {import("../htmx").HtmxInternalApi} api + * @returns void + */ + init: function(apiRef) { + // store a reference to the internal API. + api = apiRef; + + // set a function in the public API for creating new EventSource objects + if (htmx.createEventSource == undefined) { + htmx.createEventSource = createEventSource; + } + }, + + /** + * onEvent handles all events passed to this extension. + * + * @param {string} name + * @param {Event} evt + * @returns void + */ + onEvent: function(name, evt) { + + switch (name) { + + case "htmx:beforeCleanupElement": + var internalData = api.getInternalData(evt.target) + // Try to remove remove an EventSource when elements are removed + if (internalData.sseEventSource) { + internalData.sseEventSource.close(); + } + + return; + + // Try to create EventSources when elements are processed + case "htmx:afterProcessNode": + ensureEventSourceOnElement(evt.target); + registerSSE(evt.target); + } + } + }); + + /////////////////////////////////////////////// + // HELPER FUNCTIONS + /////////////////////////////////////////////// + + + /** + * createEventSource is the default method for creating new EventSource objects. + * it is hoisted into htmx.config.createEventSource to be overridden by the user, if needed. + * + * @param {string} url + * @returns EventSource + */ + function createEventSource(url) { + return new EventSource(url, { withCredentials: true }); + } + + function splitOnWhitespace(trigger) { + return trigger.trim().split(/\s+/); + } + + function getLegacySSEURL(elt) { + var legacySSEValue = api.getAttributeValue(elt, "hx-sse"); + if (legacySSEValue) { + var values = splitOnWhitespace(legacySSEValue); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + return value[1]; + } + } + } + } + + function getLegacySSESwaps(elt) { + var legacySSEValue = api.getAttributeValue(elt, "hx-sse"); + var returnArr = []; + if (legacySSEValue != null) { + var values = splitOnWhitespace(legacySSEValue); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "swap") { + returnArr.push(value[1]); + } + } + } + return returnArr; + } + + /** + * registerSSE looks for attributes that can contain sse events, right + * now hx-trigger and sse-swap and adds listeners based on these attributes too + * the closest event source + * + * @param {HTMLElement} elt + */ + function registerSSE(elt) { + // Find closest existing event source + var sourceElement = api.getClosestMatch(elt, hasEventSource); + if (sourceElement == null) { + // api.triggerErrorEvent(elt, "htmx:noSSESourceError") + return null; // no eventsource in parentage, orphaned element + } + + // Set internalData and source + var internalData = api.getInternalData(sourceElement); + var source = internalData.sseEventSource; + + // Add message handlers for every `sse-swap` attribute + queryAttributeOnThisOrChildren(elt, "sse-swap").forEach(function(child) { + + var sseSwapAttr = api.getAttributeValue(child, "sse-swap"); + if (sseSwapAttr) { + var sseEventNames = sseSwapAttr.split(","); + } else { + var sseEventNames = getLegacySSESwaps(child); + } + + for (var i = 0; i < sseEventNames.length; i++) { + var sseEventName = sseEventNames[i].trim(); + var listener = function(event) { + + // If the source is missing then close SSE + if (maybeCloseSSESource(sourceElement)) { + return; + } + + // If the body no longer contains the element, remove the listener + if (!api.bodyContains(child)) { + source.removeEventListener(sseEventName, listener); + } + + // swap the response into the DOM and trigger a notification + swap(child, event.data); + api.triggerEvent(elt, "htmx:sseMessage", event); + }; + + // Register the new listener + api.getInternalData(child).sseEventListener = listener; + source.addEventListener(sseEventName, listener); + } + }); + + // Add message handlers for every `hx-trigger="sse:*"` attribute + queryAttributeOnThisOrChildren(elt, "hx-trigger").forEach(function(child) { + + var sseEventName = api.getAttributeValue(child, "hx-trigger"); + if (sseEventName == null) { + return; + } + + // Only process hx-triggers for events with the "sse:" prefix + if (sseEventName.slice(0, 4) != "sse:") { + return; + } + + // remove the sse: prefix from here on out + sseEventName = sseEventName.substr(4); + + var listener = function() { + if (maybeCloseSSESource(sourceElement)) { + return + } + + if (!api.bodyContains(child)) { + source.removeEventListener(sseEventName, listener); + } + } + }); + } + + /** + * ensureEventSourceOnElement creates a new EventSource connection on the provided element. + * If a usable EventSource already exists, then it is returned. If not, then a new EventSource + * is created and stored in the element's internalData. + * @param {HTMLElement} elt + * @param {number} retryCount + * @returns {EventSource | null} + */ + function ensureEventSourceOnElement(elt, retryCount) { + + if (elt == null) { + return null; + } + + // handle extension source creation attribute + queryAttributeOnThisOrChildren(elt, "sse-connect").forEach(function(child) { + var sseURL = api.getAttributeValue(child, "sse-connect"); + if (sseURL == null) { + return; + } + + ensureEventSource(child, sseURL, retryCount); + }); + + // handle legacy sse, remove for HTMX2 + queryAttributeOnThisOrChildren(elt, "hx-sse").forEach(function(child) { + var sseURL = getLegacySSEURL(child); + if (sseURL == null) { + return; + } + + ensureEventSource(child, sseURL, retryCount); + }); + + } + + function ensureEventSource(elt, url, retryCount) { + var source = htmx.createEventSource(url); + + source.onerror = function(err) { + + // Log an error event + api.triggerErrorEvent(elt, "htmx:sseError", { error: err, source: source }); + + // If parent no longer exists in the document, then clean up this EventSource + if (maybeCloseSSESource(elt)) { + return; + } + + // Otherwise, try to reconnect the EventSource + if (source.readyState === EventSource.CLOSED) { + retryCount = retryCount || 0; + var timeout = Math.random() * (2 ^ retryCount) * 500; + window.setTimeout(function() { + ensureEventSourceOnElement(elt, Math.min(7, retryCount + 1)); + }, timeout); + } + }; + + source.onopen = function(evt) { + api.triggerEvent(elt, "htmx:sseOpen", { source: source }); + } + + api.getInternalData(elt).sseEventSource = source; + } + + /** + * maybeCloseSSESource confirms that the parent element still exists. + * If not, then any associated SSE source is closed and the function returns true. + * + * @param {HTMLElement} elt + * @returns boolean + */ + function maybeCloseSSESource(elt) { + if (!api.bodyContains(elt)) { + var source = api.getInternalData(elt).sseEventSource; + if (source != undefined) { + source.close(); + // source = null + return true; + } + } + return false; + } + + /** + * queryAttributeOnThisOrChildren returns all nodes that contain the requested attributeName, INCLUDING THE PROVIDED ROOT ELEMENT. + * + * @param {HTMLElement} elt + * @param {string} attributeName + */ + function queryAttributeOnThisOrChildren(elt, attributeName) { + + var result = []; + + // If the parent element also contains the requested attribute, then add it to the results too. + if (api.hasAttribute(elt, attributeName)) { + result.push(elt); + } + + // Search all child nodes that match the requested attribute + elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "]").forEach(function(node) { + result.push(node); + }); + + return result; + } + + /** + * @param {HTMLElement} elt + * @param {string} content + */ + function swap(elt, content) { + + api.withExtensions(elt, function(extension) { + content = extension.transformResponse(content, null, elt); + }); + + var swapSpec = api.getSwapSpecification(elt); + var target = api.getTarget(elt); + var settleInfo = api.makeSettleInfo(elt); + + api.selectAndSwap(swapSpec.swapStyle, target, elt, content, settleInfo); + + settleInfo.elts.forEach(function(elt) { + if (elt.classList) { + elt.classList.add(htmx.config.settlingClass); + } + api.triggerEvent(elt, 'htmx:beforeSettle'); + }); + + // Handle settle tasks (with delay if requested) + if (swapSpec.settleDelay > 0) { + setTimeout(doSettle(settleInfo), swapSpec.settleDelay); + } else { + doSettle(settleInfo)(); + } + } + + /** + * doSettle mirrors much of the functionality in htmx that + * settles elements after their content has been swapped. + * TODO: this should be published by htmx, and not duplicated here + * @param {import("../htmx").HtmxSettleInfo} settleInfo + * @returns () => void + */ + function doSettle(settleInfo) { + + return function() { + settleInfo.tasks.forEach(function(task) { + task.call(); + }); + + settleInfo.elts.forEach(function(elt) { + if (elt.classList) { + elt.classList.remove(htmx.config.settlingClass); + } + api.triggerEvent(elt, 'htmx:afterSettle'); + }); + } + } + + function hasEventSource(node) { + return api.getInternalData(node).sseEventSource != null; + } + +})(); diff --git a/visualizer/public/vendor/htmx/ext/ws.js b/visualizer/public/vendor/htmx/ext/ws.js new file mode 100644 index 0000000..05be1ec --- /dev/null +++ b/visualizer/public/vendor/htmx/ext/ws.js @@ -0,0 +1,477 @@ +/* +WebSockets Extension +============================ +This extension adds support for WebSockets to htmx. See /www/extensions/ws.md for usage instructions. +*/ + +(function () { + + /** @type {import("../htmx").HtmxInternalApi} */ + var api; + + htmx.defineExtension("ws", { + + /** + * init is called once, when this extension is first registered. + * @param {import("../htmx").HtmxInternalApi} apiRef + */ + init: function (apiRef) { + + // Store reference to internal API + api = apiRef; + + // Default function for creating new EventSource objects + if (!htmx.createWebSocket) { + htmx.createWebSocket = createWebSocket; + } + + // Default setting for reconnect delay + if (!htmx.config.wsReconnectDelay) { + htmx.config.wsReconnectDelay = "full-jitter"; + } + }, + + /** + * onEvent handles all events passed to this extension. + * + * @param {string} name + * @param {Event} evt + */ + onEvent: function (name, evt) { + + switch (name) { + + // Try to close the socket when elements are removed + case "htmx:beforeCleanupElement": + + var internalData = api.getInternalData(evt.target) + + if (internalData.webSocket) { + internalData.webSocket.close(); + } + return; + + // Try to create websockets when elements are processed + case "htmx:beforeProcessNode": + var parent = evt.target; + + forEach(queryAttributeOnThisOrChildren(parent, "ws-connect"), function (child) { + ensureWebSocket(child) + }); + forEach(queryAttributeOnThisOrChildren(parent, "ws-send"), function (child) { + ensureWebSocketSend(child) + }); + } + } + }); + + function splitOnWhitespace(trigger) { + return trigger.trim().split(/\s+/); + } + + function getLegacyWebsocketURL(elt) { + var legacySSEValue = api.getAttributeValue(elt, "hx-ws"); + if (legacySSEValue) { + var values = splitOnWhitespace(legacySSEValue); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + return value[1]; + } + } + } + } + + /** + * ensureWebSocket creates a new WebSocket on the designated element, using + * the element's "ws-connect" attribute. + * @param {HTMLElement} socketElt + * @returns + */ + function ensureWebSocket(socketElt) { + + // If the element containing the WebSocket connection no longer exists, then + // do not connect/reconnect the WebSocket. + if (!api.bodyContains(socketElt)) { + return; + } + + // Get the source straight from the element's value + var wssSource = api.getAttributeValue(socketElt, "ws-connect") + + if (wssSource == null || wssSource === "") { + var legacySource = getLegacyWebsocketURL(socketElt); + if (legacySource == null) { + return; + } else { + wssSource = legacySource; + } + } + + // Guarantee that the wssSource value is a fully qualified URL + if (wssSource.indexOf("/") === 0) { + var base_part = location.hostname + (location.port ? ':' + location.port : ''); + if (location.protocol === 'https:') { + wssSource = "wss://" + base_part + wssSource; + } else if (location.protocol === 'http:') { + wssSource = "ws://" + base_part + wssSource; + } + } + + var socketWrapper = createWebsocketWrapper(socketElt, function () { + return htmx.createWebSocket(wssSource) + }); + + socketWrapper.addEventListener('message', function (event) { + if (maybeCloseWebSocketSource(socketElt)) { + return; + } + + var response = event.data; + if (!api.triggerEvent(socketElt, "htmx:wsBeforeMessage", { + message: response, + socketWrapper: socketWrapper.publicInterface + })) { + return; + } + + api.withExtensions(socketElt, function (extension) { + response = extension.transformResponse(response, null, socketElt); + }); + + var settleInfo = api.makeSettleInfo(socketElt); + var fragment = api.makeFragment(response); + + if (fragment.children.length) { + var children = Array.from(fragment.children); + for (var i = 0; i < children.length; i++) { + api.oobSwap(api.getAttributeValue(children[i], "hx-swap-oob") || "true", children[i], settleInfo); + } + } + + api.settleImmediately(settleInfo.tasks); + api.triggerEvent(socketElt, "htmx:wsAfterMessage", { message: response, socketWrapper: socketWrapper.publicInterface }) + }); + + // Put the WebSocket into the HTML Element's custom data. + api.getInternalData(socketElt).webSocket = socketWrapper; + } + + /** + * @typedef {Object} WebSocketWrapper + * @property {WebSocket} socket + * @property {Array<{message: string, sendElt: Element}>} messageQueue + * @property {number} retryCount + * @property {(message: string, sendElt: Element) => void} sendImmediately sendImmediately sends message regardless of websocket connection state + * @property {(message: string, sendElt: Element) => void} send + * @property {(event: string, handler: Function) => void} addEventListener + * @property {() => void} handleQueuedMessages + * @property {() => void} init + * @property {() => void} close + */ + /** + * + * @param socketElt + * @param socketFunc + * @returns {WebSocketWrapper} + */ + function createWebsocketWrapper(socketElt, socketFunc) { + var wrapper = { + socket: null, + messageQueue: [], + retryCount: 0, + + /** @type {Object} */ + events: {}, + + addEventListener: function (event, handler) { + if (this.socket) { + this.socket.addEventListener(event, handler); + } + + if (!this.events[event]) { + this.events[event] = []; + } + + this.events[event].push(handler); + }, + + sendImmediately: function (message, sendElt) { + if (!this.socket) { + api.triggerErrorEvent() + } + if (!sendElt || api.triggerEvent(sendElt, 'htmx:wsBeforeSend', { + message: message, + socketWrapper: this.publicInterface + })) { + this.socket.send(message); + sendElt && api.triggerEvent(sendElt, 'htmx:wsAfterSend', { + message: message, + socketWrapper: this.publicInterface + }) + } + }, + + send: function (message, sendElt) { + if (this.socket.readyState !== this.socket.OPEN) { + this.messageQueue.push({ message: message, sendElt: sendElt }); + } else { + this.sendImmediately(message, sendElt); + } + }, + + handleQueuedMessages: function () { + while (this.messageQueue.length > 0) { + var queuedItem = this.messageQueue[0] + if (this.socket.readyState === this.socket.OPEN) { + this.sendImmediately(queuedItem.message, queuedItem.sendElt); + this.messageQueue.shift(); + } else { + break; + } + } + }, + + init: function () { + if (this.socket && this.socket.readyState === this.socket.OPEN) { + // Close discarded socket + this.socket.close() + } + + // Create a new WebSocket and event handlers + /** @type {WebSocket} */ + var socket = socketFunc(); + + // The event.type detail is added for interface conformance with the + // other two lifecycle events (open and close) so a single handler method + // can handle them polymorphically, if required. + api.triggerEvent(socketElt, "htmx:wsConnecting", { event: { type: 'connecting' } }); + + this.socket = socket; + + socket.onopen = function (e) { + wrapper.retryCount = 0; + api.triggerEvent(socketElt, "htmx:wsOpen", { event: e, socketWrapper: wrapper.publicInterface }); + wrapper.handleQueuedMessages(); + } + + socket.onclose = function (e) { + // If socket should not be connected, stop further attempts to establish connection + // If Abnormal Closure/Service Restart/Try Again Later, then set a timer to reconnect after a pause. + if (!maybeCloseWebSocketSource(socketElt) && [1006, 1012, 1013].indexOf(e.code) >= 0) { + var delay = getWebSocketReconnectDelay(wrapper.retryCount); + setTimeout(function () { + wrapper.retryCount += 1; + wrapper.init(); + }, delay); + } + + // Notify client code that connection has been closed. Client code can inspect `event` field + // to determine whether closure has been valid or abnormal + api.triggerEvent(socketElt, "htmx:wsClose", { event: e, socketWrapper: wrapper.publicInterface }) + }; + + socket.onerror = function (e) { + api.triggerErrorEvent(socketElt, "htmx:wsError", { error: e, socketWrapper: wrapper }); + maybeCloseWebSocketSource(socketElt); + }; + + var events = this.events; + Object.keys(events).forEach(function (k) { + events[k].forEach(function (e) { + socket.addEventListener(k, e); + }) + }); + }, + + close: function () { + this.socket.close() + } + } + + wrapper.init(); + + wrapper.publicInterface = { + send: wrapper.send.bind(wrapper), + sendImmediately: wrapper.sendImmediately.bind(wrapper), + queue: wrapper.messageQueue + }; + + return wrapper; + } + + /** + * ensureWebSocketSend attaches trigger handles to elements with + * "ws-send" attribute + * @param {HTMLElement} elt + */ + function ensureWebSocketSend(elt) { + var legacyAttribute = api.getAttributeValue(elt, "hx-ws"); + if (legacyAttribute && legacyAttribute !== 'send') { + return; + } + + var webSocketParent = api.getClosestMatch(elt, hasWebSocket) + processWebSocketSend(webSocketParent, elt); + } + + /** + * hasWebSocket function checks if a node has webSocket instance attached + * @param {HTMLElement} node + * @returns {boolean} + */ + function hasWebSocket(node) { + return api.getInternalData(node).webSocket != null; + } + + /** + * processWebSocketSend adds event listeners to the
element so that + * messages can be sent to the WebSocket server when the form is submitted. + * @param {HTMLElement} socketElt + * @param {HTMLElement} sendElt + */ + function processWebSocketSend(socketElt, sendElt) { + var nodeData = api.getInternalData(sendElt); + var triggerSpecs = api.getTriggerSpecs(sendElt); + triggerSpecs.forEach(function (ts) { + api.addTriggerHandler(sendElt, ts, nodeData, function (elt, evt) { + if (maybeCloseWebSocketSource(socketElt)) { + return; + } + + /** @type {WebSocketWrapper} */ + var socketWrapper = api.getInternalData(socketElt).webSocket; + var headers = api.getHeaders(sendElt, api.getTarget(sendElt)); + var results = api.getInputValues(sendElt, 'post'); + var errors = results.errors; + var rawParameters = results.values; + var expressionVars = api.getExpressionVars(sendElt); + var allParameters = api.mergeObjects(rawParameters, expressionVars); + var filteredParameters = api.filterValues(allParameters, sendElt); + + var sendConfig = { + parameters: filteredParameters, + unfilteredParameters: allParameters, + headers: headers, + errors: errors, + + triggeringEvent: evt, + messageBody: undefined, + socketWrapper: socketWrapper.publicInterface + }; + + if (!api.triggerEvent(elt, 'htmx:wsConfigSend', sendConfig)) { + return; + } + + if (errors && errors.length > 0) { + api.triggerEvent(elt, 'htmx:validation:halted', errors); + return; + } + + var body = sendConfig.messageBody; + if (body === undefined) { + var toSend = Object.assign({}, sendConfig.parameters); + if (sendConfig.headers) + toSend['HEADERS'] = headers; + body = JSON.stringify(toSend); + } + + socketWrapper.send(body, elt); + + if (evt && api.shouldCancel(evt, elt)) { + evt.preventDefault(); + } + }); + }); + } + + /** + * getWebSocketReconnectDelay is the default easing function for WebSocket reconnects. + * @param {number} retryCount // The number of retries that have already taken place + * @returns {number} + */ + function getWebSocketReconnectDelay(retryCount) { + + /** @type {"full-jitter" | ((retryCount:number) => number)} */ + var delay = htmx.config.wsReconnectDelay; + if (typeof delay === 'function') { + return delay(retryCount); + } + if (delay === 'full-jitter') { + var exp = Math.min(retryCount, 6); + var maxDelay = 1000 * Math.pow(2, exp); + return maxDelay * Math.random(); + } + + logError('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"'); + } + + /** + * maybeCloseWebSocketSource checks to the if the element that created the WebSocket + * still exists in the DOM. If NOT, then the WebSocket is closed and this function + * returns TRUE. If the element DOES EXIST, then no action is taken, and this function + * returns FALSE. + * + * @param {*} elt + * @returns + */ + function maybeCloseWebSocketSource(elt) { + if (!api.bodyContains(elt)) { + api.getInternalData(elt).webSocket.close(); + return true; + } + return false; + } + + /** + * createWebSocket is the default method for creating new WebSocket objects. + * it is hoisted into htmx.createWebSocket to be overridden by the user, if needed. + * + * @param {string} url + * @returns WebSocket + */ + function createWebSocket(url) { + var sock = new WebSocket(url, []); + sock.binaryType = htmx.config.wsBinaryType; + return sock; + } + + /** + * queryAttributeOnThisOrChildren returns all nodes that contain the requested attributeName, INCLUDING THE PROVIDED ROOT ELEMENT. + * + * @param {HTMLElement} elt + * @param {string} attributeName + */ + function queryAttributeOnThisOrChildren(elt, attributeName) { + + var result = [] + + // If the parent element also contains the requested attribute, then add it to the results too. + if (api.hasAttribute(elt, attributeName) || api.hasAttribute(elt, "hx-ws")) { + result.push(elt); + } + + // Search all child nodes that match the requested attribute + elt.querySelectorAll("[" + attributeName + "], [data-" + attributeName + "], [data-hx-ws], [hx-ws]").forEach(function (node) { + result.push(node) + }) + + return result + } + + /** + * @template T + * @param {T[]} arr + * @param {(T) => void} func + */ + function forEach(arr, func) { + if (arr) { + for (var i = 0; i < arr.length; i++) { + func(arr[i]); + } + } + } + +})(); + diff --git a/visualizer/public/vendor/htmx/htmx.d.ts b/visualizer/public/vendor/htmx/htmx.d.ts new file mode 100644 index 0000000..197ac52 --- /dev/null +++ b/visualizer/public/vendor/htmx/htmx.d.ts @@ -0,0 +1,450 @@ +// https://htmx.org/reference/#api + +/** + * This method adds a class to the given element. + * + * https://htmx.org/api/#addClass + * + * @param elt the element to add the class to + * @param clazz the class to add + * @param delay the delay (in milliseconds before class is added) + */ +export function addClass(elt: Element, clazz: string, delay?: number): void; + +/** + * Issues an htmx-style AJAX request + * + * https://htmx.org/api/#ajax + * + * @param verb 'GET', 'POST', etc. + * @param path the URL path to make the AJAX + * @param element the element to target (defaults to the **body**) + * @returns Promise that resolves immediately if no request is sent, or when the request is complete + */ +export function ajax(verb: string, path: string, element: Element): Promise; + +/** + * Issues an htmx-style AJAX request + * + * https://htmx.org/api/#ajax + * + * @param verb 'GET', 'POST', etc. + * @param path the URL path to make the AJAX + * @param selector a selector for the target + * @returns Promise that resolves immediately if no request is sent, or when the request is complete + */ +export function ajax(verb: string, path: string, selector: string): Promise; + +/** + * Issues an htmx-style AJAX request + * + * https://htmx.org/api/#ajax + * + * @param verb 'GET', 'POST', etc. + * @param path the URL path to make the AJAX + * @param context a context object that contains any of the following + * @returns Promise that resolves immediately if no request is sent, or when the request is complete + */ +export function ajax( + verb: string, + path: string, + context: Partial<{ source: any; event: any; handler: any; target: any; swap: any; values: any; headers: any; select: any }> +): Promise; + +/** + * Finds the closest matching element in the given elements parentage, inclusive of the element + * + * https://htmx.org/api/#closest + * + * @param elt the element to find the selector from + * @param selector the selector to find + */ +export function closest(elt: Element, selector: string): Element | null; + +/** + * A property holding the configuration htmx uses at runtime. + * + * Note that using a [meta tag](https://htmx.org/docs/#config) is the preferred mechanism for setting these properties. + * + * https://htmx.org/api/#config + */ +export var config: HtmxConfig; + +/** + * A property used to create new [Server Sent Event](https://htmx.org/docs/#sse) sources. This can be updated to provide custom SSE setup. + * + * https://htmx.org/api/#createEventSource + */ +export var createEventSource: (url: string) => EventSource; + +/** + * A property used to create new [WebSocket](https://htmx.org/docs/#websockets). This can be updated to provide custom WebSocket setup. + * + * https://htmx.org/api/#createWebSocket + */ +export var createWebSocket: (url: string) => WebSocket; + +/** + * Defines a new htmx [extension](https://htmx.org/extensions). + * + * https://htmx.org/api/#defineExtension + * + * @param name the extension name + * @param ext the extension definition + */ +export function defineExtension(name: string, ext: HtmxExtension): void; + +/** + * Finds an element matching the selector + * + * https://htmx.org/api/#find + * + * @param selector the selector to match + */ +export function find(selector: string): Element | null; + +/** + * Finds an element matching the selector + * + * https://htmx.org/api/#find + * + * @param elt the root element to find the matching element in, inclusive + * @param selector the selector to match + */ +export function find(elt: Element, selector: string): Element | null; + +/** + * Finds all elements matching the selector + * + * https://htmx.org/api/#findAll + * + * @param selector the selector to match + */ +export function findAll(selector: string): NodeListOf; + +/** + * Finds all elements matching the selector + * + * https://htmx.org/api/#findAll + * + * @param elt the root element to find the matching elements in, inclusive + * @param selector the selector to match + */ +export function findAll(elt: Element, selector: string): NodeListOf; + +/** + * Log all htmx events, useful for debugging. + * + * https://htmx.org/api/#logAll + */ +export function logAll(): void; + +/** + * The logger htmx uses to log with + * + * https://htmx.org/api/#logger + */ +export var logger: (elt: Element, eventName: string, detail: any) => void | null; + +/** + * Removes an event listener from an element + * + * https://htmx.org/api/#off + * + * @param eventName the event name to remove the listener from + * @param listener the listener to remove + */ +export function off(eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Removes an event listener from an element + * + * https://htmx.org/api/#off + * + * @param target the element to remove the listener from + * @param eventName the event name to remove the listener from + * @param listener the listener to remove + */ +export function off(target: string, eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Adds an event listener to an element + * + * https://htmx.org/api/#on + * + * @param eventName the event name to add the listener for + * @param listener the listener to add + */ +export function on(eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Adds an event listener to an element + * + * https://htmx.org/api/#on + * + * @param target the element to add the listener to + * @param eventName the event name to add the listener for + * @param listener the listener to add + */ +export function on(target: string, eventName: string, listener: (evt: Event) => void): (evt: Event) => void; + +/** + * Adds a callback for the **htmx:load** event. This can be used to process new content, for example initializing the content with a javascript library + * + * https://htmx.org/api/#onLoad + * + * @param callback the callback to call on newly loaded content + */ +export function onLoad(callback: (element: Element) => void): void; + +/** + * Parses an interval string consistent with the way htmx does. Useful for plugins that have timing-related attributes. + * + * Caution: Accepts an int followed by either **s** or **ms**. All other values use **parseFloat** + * + * https://htmx.org/api/#parseInterval + * + * @param str timing string + */ +export function parseInterval(str: string): number; + +/** + * Processes new content, enabling htmx behavior. This can be useful if you have content that is added to the DOM outside of the normal htmx request cycle but still want htmx attributes to work. + * + * https://htmx.org/api/#process + * + * @param element element to process + */ +export function process(element: Element): void; + +/** + * Removes an element from the DOM + * + * https://htmx.org/api/#remove + * + * @param elt element to remove + * @param delay the delay (in milliseconds before element is removed) + */ +export function remove(elt: Element, delay?: number): void; + +/** + * Removes a class from the given element + * + * https://htmx.org/api/#removeClass + * + * @param elt element to remove the class from + * @param clazz the class to remove + * @param delay the delay (in milliseconds before class is removed) + */ +export function removeClass(elt: Element, clazz: string, delay?: number): void; + +/** + * Removes the given extension from htmx + * + * https://htmx.org/api/#removeExtension + * + * @param name the name of the extension to remove + */ +export function removeExtension(name: string): void; + +/** + * Takes the given class from its siblings, so that among its siblings, only the given element will have the class. + * + * https://htmx.org/api/#takeClass + * + * @param elt the element that will take the class + * @param clazz the class to take + */ +export function takeClass(elt: Element, clazz: string): void; + +/** + * Toggles the given class on an element + * + * https://htmx.org/api/#toggleClass + * + * @param elt the element to toggle the class on + * @param clazz the class to toggle + */ +export function toggleClass(elt: Element, clazz: string): void; + +/** + * Triggers a given event on an element + * + * https://htmx.org/api/#trigger + * + * @param elt the element to trigger the event on + * @param name the name of the event to trigger + * @param detail details for the event + */ +export function trigger(elt: Element, name: string, detail: any): void; + +/** + * Returns the input values that would resolve for a given element via the htmx value resolution mechanism + * + * https://htmx.org/api/#values + * + * @param elt the element to resolve values on + * @param requestType the request type (e.g. **get** or **post**) non-GET's will include the enclosing form of the element. Defaults to **post** + */ +export function values(elt: Element, requestType?: string): any; + +export const version: string; + +export interface HtmxConfig { + /** + * The attributes to settle during the settling phase. + * @default ["class", "style", "width", "height"] + */ + attributesToSettle?: ["class", "style", "width", "height"] | string[]; + /** + * If the focused element should be scrolled into view. + * @default false + */ + defaultFocusScroll?: boolean; + /** + * The default delay between completing the content swap and settling attributes. + * @default 20 + */ + defaultSettleDelay?: number; + /** + * The default delay between receiving a response from the server and doing the swap. + * @default 0 + */ + defaultSwapDelay?: number; + /** + * The default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted. + * @default "innerHTML" + */ + defaultSwapStyle?: "innerHTML" | string; + /** + * The number of pages to keep in **localStorage** for history support. + * @default 10 + */ + historyCacheSize?: number; + /** + * Whether or not to use history. + * @default true + */ + historyEnabled?: boolean; + /** + * If true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present. + * @default true + */ + includeIndicatorStyles?: boolean; + /** + * The class to place on indicators when a request is in flight. + * @default "htmx-indicator" + */ + indicatorClass?: "htmx-indicator" | string; + /** + * The class to place on triggering elements when a request is in flight. + * @default "htmx-request" + */ + requestClass?: "htmx-request" | string; + /** + * The class to temporarily place on elements that htmx has added to the DOM. + * @default "htmx-added" + */ + addedClass?: "htmx-added" | string; + /** + * The class to place on target elements when htmx is in the settling phase. + * @default "htmx-settling" + */ + settlingClass?: "htmx-settling" | string; + /** + * The class to place on target elements when htmx is in the swapping phase. + * @default "htmx-swapping" + */ + swappingClass?: "htmx-swapping" | string; + /** + * Allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility. + * @default true + */ + allowEval?: boolean; + /** + * Use HTML template tags for parsing content from the server. This allows you to use Out of Band content when returning things like table rows, but it is *not* IE11 compatible. + * @default false + */ + useTemplateFragments?: boolean; + /** + * Allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates. + * @default false + */ + withCredentials?: boolean; + /** + * The default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later**. + * @default "full-jitter" + */ + wsReconnectDelay?: "full-jitter" | string | ((retryCount: number) => number); + // following don't appear in the docs + /** @default false */ + refreshOnHistoryMiss?: boolean; + /** @default 0 */ + timeout?: number; + /** @default "[hx-disable], [data-hx-disable]" */ + disableSelector?: "[hx-disable], [data-hx-disable]" | string; + /** @default "smooth" */ + scrollBehavior?: "smooth" | "auto"; + /** + * If set to false, disables the interpretation of script tags. + * @default true + */ + allowScriptTags?: boolean; + /** + * If set to true, disables htmx-based requests to non-origin hosts. + * @default false + */ + selfRequestsOnly?: boolean; + /** + * Whether or not the target of a boosted element is scrolled into the viewport. + * @default true + */ + scrollIntoViewOnBoost?: boolean; + /** + * If set, the nonce will be added to inline scripts. + * @default '' + */ + inlineScriptNonce?: string; + /** + * The type of binary data being received over the WebSocket connection + * @default 'blob' + */ + wsBinaryType?: 'blob' | 'arraybuffer'; + /** + * If set to true htmx will include a cache-busting parameter in GET requests to avoid caching partial responses by the browser + * @default false + */ + getCacheBusterParam?: boolean; + /** + * If set to true, htmx will use the View Transition API when swapping in new content. + * @default false + */ + globalViewTransitions?: boolean; + /** + * htmx will format requests with these methods by encoding their parameters in the URL, not the request body + * @default ["get"] + */ + methodsThatUseUrlParams?: ('get' | 'head' | 'post' | 'put' | 'delete' | 'connect' | 'options' | 'trace' | 'patch' )[]; + /** + * If set to true htmx will not update the title of the document when a title tag is found in new content + * @default false + */ + ignoreTitle:? boolean; + /** + * The cache to store evaluated trigger specifications into. + * You may define a simple object to use a never-clearing cache, or implement your own system using a [proxy object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy) + * @default null + */ + triggerSpecsCache?: {[trigger: string]: HtmxTriggerSpecification[]}; +} + +/** + * https://htmx.org/extensions/#defining + */ +export interface HtmxExtension { + onEvent?: (name: string, evt: CustomEvent) => any; + transformResponse?: (text: any, xhr: XMLHttpRequest, elt: any) => any; + isInlineSwap?: (swapStyle: any) => any; + handleSwap?: (swapStyle: any, target: any, fragment: any, settleInfo: any) => any; + encodeParameters?: (xhr: XMLHttpRequest, parameters: any, elt: any) => any; +} diff --git a/visualizer/public/vendor/htmx/htmx.js b/visualizer/public/vendor/htmx/htmx.js new file mode 100644 index 0000000..78848ee --- /dev/null +++ b/visualizer/public/vendor/htmx/htmx.js @@ -0,0 +1,3919 @@ +// UMD insanity +// This code sets up support for (in order) AMD, ES6 modules, and globals. +(function (root, factory) { + //@ts-ignore + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + //@ts-ignore + define([], factory); + } else if (typeof module === 'object' && module.exports) { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals + root.htmx = root.htmx || factory(); + } +}(typeof self !== 'undefined' ? self : this, function () { +return (function () { + 'use strict'; + + // Public API + //** @type {import("./htmx").HtmxApi} */ + // TODO: list all methods in public API + var htmx = { + onLoad: onLoadHelper, + process: processNode, + on: addEventListenerImpl, + off: removeEventListenerImpl, + trigger : triggerEvent, + ajax : ajaxHelper, + find : find, + findAll : findAll, + closest : closest, + values : function(elt, type){ + var inputValues = getInputValues(elt, type || "post"); + return inputValues.values; + }, + remove : removeElement, + addClass : addClassToElement, + removeClass : removeClassFromElement, + toggleClass : toggleClassOnElement, + takeClass : takeClassForElement, + defineExtension : defineExtension, + removeExtension : removeExtension, + logAll : logAll, + logNone : logNone, + logger : null, + config : { + historyEnabled:true, + historyCacheSize:10, + refreshOnHistoryMiss:false, + defaultSwapStyle:'innerHTML', + defaultSwapDelay:0, + defaultSettleDelay:20, + includeIndicatorStyles:true, + indicatorClass:'htmx-indicator', + requestClass:'htmx-request', + addedClass:'htmx-added', + settlingClass:'htmx-settling', + swappingClass:'htmx-swapping', + allowEval:true, + allowScriptTags:true, + inlineScriptNonce:'', + attributesToSettle:["class", "style", "width", "height"], + withCredentials:false, + timeout:0, + wsReconnectDelay: 'full-jitter', + wsBinaryType: 'blob', + disableSelector: "[hx-disable], [data-hx-disable]", + useTemplateFragments: false, + scrollBehavior: 'smooth', + defaultFocusScroll: false, + getCacheBusterParam: false, + globalViewTransitions: false, + methodsThatUseUrlParams: ["get"], + selfRequestsOnly: false, + ignoreTitle: false, + scrollIntoViewOnBoost: true, + triggerSpecsCache: null, + }, + parseInterval:parseInterval, + _:internalEval, + createEventSource: function(url){ + return new EventSource(url, {withCredentials:true}) + }, + createWebSocket: function(url){ + var sock = new WebSocket(url, []); + sock.binaryType = htmx.config.wsBinaryType; + return sock; + }, + version: "1.9.10" + }; + + /** @type {import("./htmx").HtmxInternalApi} */ + var internalAPI = { + addTriggerHandler: addTriggerHandler, + bodyContains: bodyContains, + canAccessLocalStorage: canAccessLocalStorage, + findThisElement: findThisElement, + filterValues: filterValues, + hasAttribute: hasAttribute, + getAttributeValue: getAttributeValue, + getClosestAttributeValue: getClosestAttributeValue, + getClosestMatch: getClosestMatch, + getExpressionVars: getExpressionVars, + getHeaders: getHeaders, + getInputValues: getInputValues, + getInternalData: getInternalData, + getSwapSpecification: getSwapSpecification, + getTriggerSpecs: getTriggerSpecs, + getTarget: getTarget, + makeFragment: makeFragment, + mergeObjects: mergeObjects, + makeSettleInfo: makeSettleInfo, + oobSwap: oobSwap, + querySelectorExt: querySelectorExt, + selectAndSwap: selectAndSwap, + settleImmediately: settleImmediately, + shouldCancel: shouldCancel, + triggerEvent: triggerEvent, + triggerErrorEvent: triggerErrorEvent, + withExtensions: withExtensions, + } + + var SVG_TAG = ['g', 'circle', 'rect']; + + var VERBS = ['get', 'post', 'put', 'delete', 'patch']; + var VERB_SELECTOR = VERBS.map(function(verb){ + return "[hx-" + verb + "], [data-hx-" + verb + "]" + }).join(", "); + + var HEAD_TAG_REGEX = makeTagRegEx('head'), + TITLE_TAG_REGEX = makeTagRegEx('title'), + SVG_TAGS_REGEX = makeTagRegEx('svg', true); + + //==================================================================== + // Utilities + //==================================================================== + + /** + * @param {string} tag + * @param {boolean} global + * @returns {RegExp} + */ + function makeTagRegEx(tag, global = false) { + return new RegExp(`<${tag}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${tag}>`, + global ? 'gim' : 'im'); + } + + function parseInterval(str) { + if (str == undefined) { + return undefined; + } + + let interval = NaN; + if (str.slice(-2) == "ms") { + interval = parseFloat(str.slice(0, -2)); + } else if (str.slice(-1) == "s") { + interval = parseFloat(str.slice(0, -1)) * 1000; + } else if (str.slice(-1) == "m") { + interval = parseFloat(str.slice(0, -1)) * 1000 * 60; + } else { + interval = parseFloat(str); + } + return isNaN(interval) ? undefined : interval; + } + + /** + * @param {HTMLElement} elt + * @param {string} name + * @returns {(string | null)} + */ + function getRawAttribute(elt, name) { + return elt.getAttribute && elt.getAttribute(name); + } + + // resolve with both hx and data-hx prefixes + function hasAttribute(elt, qualifiedName) { + return elt.hasAttribute && (elt.hasAttribute(qualifiedName) || + elt.hasAttribute("data-" + qualifiedName)); + } + + /** + * + * @param {HTMLElement} elt + * @param {string} qualifiedName + * @returns {(string | null)} + */ + function getAttributeValue(elt, qualifiedName) { + return getRawAttribute(elt, qualifiedName) || getRawAttribute(elt, "data-" + qualifiedName); + } + + /** + * @param {HTMLElement} elt + * @returns {HTMLElement | null} + */ + function parentElt(elt) { + return elt.parentElement; + } + + /** + * @returns {Document} + */ + function getDocument() { + return document; + } + + /** + * @param {HTMLElement} elt + * @param {(e:HTMLElement) => boolean} condition + * @returns {HTMLElement | null} + */ + function getClosestMatch(elt, condition) { + while (elt && !condition(elt)) { + elt = parentElt(elt); + } + + return elt ? elt : null; + } + + function getAttributeValueWithDisinheritance(initialElement, ancestor, attributeName){ + var attributeValue = getAttributeValue(ancestor, attributeName); + var disinherit = getAttributeValue(ancestor, "hx-disinherit"); + if (initialElement !== ancestor && disinherit && (disinherit === "*" || disinherit.split(" ").indexOf(attributeName) >= 0)) { + return "unset"; + } else { + return attributeValue + } + } + + /** + * @param {HTMLElement} elt + * @param {string} attributeName + * @returns {string | null} + */ + function getClosestAttributeValue(elt, attributeName) { + var closestAttr = null; + getClosestMatch(elt, function (e) { + return closestAttr = getAttributeValueWithDisinheritance(elt, e, attributeName); + }); + if (closestAttr !== "unset") { + return closestAttr; + } + } + + /** + * @param {HTMLElement} elt + * @param {string} selector + * @returns {boolean} + */ + function matches(elt, selector) { + // @ts-ignore: non-standard properties for browser compatibility + // noinspection JSUnresolvedVariable + var matchesFunction = elt.matches || elt.matchesSelector || elt.msMatchesSelector || elt.mozMatchesSelector || elt.webkitMatchesSelector || elt.oMatchesSelector; + return matchesFunction && matchesFunction.call(elt, selector); + } + + /** + * @param {string} str + * @returns {string} + */ + function getStartTag(str) { + var tagMatcher = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i + var match = tagMatcher.exec( str ); + if (match) { + return match[1].toLowerCase(); + } else { + return ""; + } + } + + /** + * + * @param {string} resp + * @param {number} depth + * @returns {Element} + */ + function parseHTML(resp, depth) { + var parser = new DOMParser(); + var responseDoc = parser.parseFromString(resp, "text/html"); + + /** @type {Element} */ + var responseNode = responseDoc.body; + while (depth > 0) { + depth--; + // @ts-ignore + responseNode = responseNode.firstChild; + } + if (responseNode == null) { + // @ts-ignore + responseNode = getDocument().createDocumentFragment(); + } + return responseNode; + } + + + /** + * @param {string} resp + * @returns {Element} + */ + function parseSVG(resp){ + return parseHTML('' + resp + '', 1) + // var parser = new DOMParser(); + // var responseDoc = parser.parseFromString(resp, "image/svg+xml"); + // return responseDoc.firstChild; + } + + function aFullPageResponse(resp) { + return /
", 0); + // @ts-ignore type mismatch between DocumentFragment and Element. + // TODO: Are these close enough for htmx to use interchangeably? + return documentFragment.querySelector('template').content; + } + switch (startTag) { + case "thead": + case "tbody": + case "tfoot": + case "colgroup": + case "caption": + return parseHTML("" + content + "
", 1); + case "col": + return parseHTML("" + content + "
", 2); + case "tr": + return parseHTML("" + content + "
", 2); + case "td": + case "th": + return parseHTML("" + content + "
", 3); + case "script": + case "style": + return parseHTML("
" + content + "
", 1); + default: + return SVG_TAG.indexOf(startTag) !== -1 ? parseSVG(content) : parseHTML(content, 0); + } + } + + /** + * @param {Function} func + */ + function maybeCall(func){ + if(func) { + func(); + } + } + + /** + * @param {any} o + * @param {string} type + * @returns + */ + function isType(o, type) { + return Object.prototype.toString.call(o) === "[object " + type + "]"; + } + + /** + * @param {*} o + * @returns {o is Function} + */ + function isFunction(o) { + return isType(o, "Function"); + } + + /** + * @param {*} o + * @returns {o is Object} + */ + function isRawObject(o) { + return isType(o, "Object"); + } + + /** + * getInternalData retrieves "private" data stored by htmx within an element + * @param {HTMLElement} elt + * @returns {*} + */ + function getInternalData(elt) { + var dataProp = 'htmx-internal-data'; + var data = elt[dataProp]; + if (!data) { + data = elt[dataProp] = {}; + } + return data; + } + + /** + * toArray converts an ArrayLike object into a real array. + * @param {ArrayLike} arr + * @returns {any[]} + */ + function toArray(arr) { + var returnArr = []; + if (arr) { + for (var i = 0; i < arr.length; i++) { + returnArr.push(arr[i]); + } + } + return returnArr + } + + function forEach(arr, func) { + if (arr) { + for (var i = 0; i < arr.length; i++) { + func(arr[i]); + } + } + } + + function isScrolledIntoView(el) { + var rect = el.getBoundingClientRect(); + var elemTop = rect.top; + var elemBottom = rect.bottom; + return elemTop < window.innerHeight && elemBottom >= 0; + } + + function bodyContains(elt) { + // IE Fix + if (elt.getRootNode && elt.getRootNode() instanceof window.ShadowRoot) { + return getDocument().body.contains(elt.getRootNode().host); + } else { + return getDocument().body.contains(elt); + } + } + + function splitOnWhitespace(trigger) { + return trigger.trim().split(/\s+/); + } + + /** + * mergeObjects takes all of the keys from + * obj2 and duplicates them into obj1 + * @param {Object} obj1 + * @param {Object} obj2 + * @returns {Object} + */ + function mergeObjects(obj1, obj2) { + for (var key in obj2) { + if (obj2.hasOwnProperty(key)) { + obj1[key] = obj2[key]; + } + } + return obj1; + } + + function parseJSON(jString) { + try { + return JSON.parse(jString); + } catch(error) { + logError(error); + return null; + } + } + + function canAccessLocalStorage() { + var test = 'htmx:localStorageTest'; + try { + localStorage.setItem(test, test); + localStorage.removeItem(test); + return true; + } catch(e) { + return false; + } + } + + function normalizePath(path) { + try { + var url = new URL(path); + if (url) { + path = url.pathname + url.search; + } + // remove trailing slash, unless index page + if (!(/^\/$/.test(path))) { + path = path.replace(/\/+$/, ''); + } + return path; + } catch (e) { + // be kind to IE11, which doesn't support URL() + return path; + } + } + + //========================================================================================== + // public API + //========================================================================================== + + function internalEval(str){ + return maybeEval(getDocument().body, function () { + return eval(str); + }); + } + + function onLoadHelper(callback) { + var value = htmx.on("htmx:load", function(evt) { + callback(evt.detail.elt); + }); + return value; + } + + function logAll(){ + htmx.logger = function(elt, event, data) { + if(console) { + console.log(event, elt, data); + } + } + } + + function logNone() { + htmx.logger = null + } + + function find(eltOrSelector, selector) { + if (selector) { + return eltOrSelector.querySelector(selector); + } else { + return find(getDocument(), eltOrSelector); + } + } + + function findAll(eltOrSelector, selector) { + if (selector) { + return eltOrSelector.querySelectorAll(selector); + } else { + return findAll(getDocument(), eltOrSelector); + } + } + + function removeElement(elt, delay) { + elt = resolveTarget(elt); + if (delay) { + setTimeout(function(){ + removeElement(elt); + elt = null; + }, delay); + } else { + elt.parentElement.removeChild(elt); + } + } + + function addClassToElement(elt, clazz, delay) { + elt = resolveTarget(elt); + if (delay) { + setTimeout(function(){ + addClassToElement(elt, clazz); + elt = null; + }, delay); + } else { + elt.classList && elt.classList.add(clazz); + } + } + + function removeClassFromElement(elt, clazz, delay) { + elt = resolveTarget(elt); + if (delay) { + setTimeout(function(){ + removeClassFromElement(elt, clazz); + elt = null; + }, delay); + } else { + if (elt.classList) { + elt.classList.remove(clazz); + // if there are no classes left, remove the class attribute + if (elt.classList.length === 0) { + elt.removeAttribute("class"); + } + } + } + } + + function toggleClassOnElement(elt, clazz) { + elt = resolveTarget(elt); + elt.classList.toggle(clazz); + } + + function takeClassForElement(elt, clazz) { + elt = resolveTarget(elt); + forEach(elt.parentElement.children, function(child){ + removeClassFromElement(child, clazz); + }) + addClassToElement(elt, clazz); + } + + function closest(elt, selector) { + elt = resolveTarget(elt); + if (elt.closest) { + return elt.closest(selector); + } else { + // TODO remove when IE goes away + do{ + if (elt == null || matches(elt, selector)){ + return elt; + } + } + while (elt = elt && parentElt(elt)); + return null; + } + } + + function startsWith(str, prefix) { + return str.substring(0, prefix.length) === prefix + } + + function endsWith(str, suffix) { + return str.substring(str.length - suffix.length) === suffix + } + + function normalizeSelector(selector) { + var trimmedSelector = selector.trim(); + if (startsWith(trimmedSelector, "<") && endsWith(trimmedSelector, "/>")) { + return trimmedSelector.substring(1, trimmedSelector.length - 2); + } else { + return trimmedSelector; + } + } + + function querySelectorAllExt(elt, selector) { + if (selector.indexOf("closest ") === 0) { + return [closest(elt, normalizeSelector(selector.substr(8)))]; + } else if (selector.indexOf("find ") === 0) { + return [find(elt, normalizeSelector(selector.substr(5)))]; + } else if (selector === "next") { + return [elt.nextElementSibling] + } else if (selector.indexOf("next ") === 0) { + return [scanForwardQuery(elt, normalizeSelector(selector.substr(5)))]; + } else if (selector === "previous") { + return [elt.previousElementSibling] + } else if (selector.indexOf("previous ") === 0) { + return [scanBackwardsQuery(elt, normalizeSelector(selector.substr(9)))]; + } else if (selector === 'document') { + return [document]; + } else if (selector === 'window') { + return [window]; + } else if (selector === 'body') { + return [document.body]; + } else { + return getDocument().querySelectorAll(normalizeSelector(selector)); + } + } + + var scanForwardQuery = function(start, match) { + var results = getDocument().querySelectorAll(match); + for (var i = 0; i < results.length; i++) { + var elt = results[i]; + if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_PRECEDING) { + return elt; + } + } + } + + var scanBackwardsQuery = function(start, match) { + var results = getDocument().querySelectorAll(match); + for (var i = results.length - 1; i >= 0; i--) { + var elt = results[i]; + if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_FOLLOWING) { + return elt; + } + } + } + + function querySelectorExt(eltOrSelector, selector) { + if (selector) { + return querySelectorAllExt(eltOrSelector, selector)[0]; + } else { + return querySelectorAllExt(getDocument().body, eltOrSelector)[0]; + } + } + + function resolveTarget(arg2) { + if (isType(arg2, 'String')) { + return find(arg2); + } else { + return arg2; + } + } + + function processEventArgs(arg1, arg2, arg3) { + if (isFunction(arg2)) { + return { + target: getDocument().body, + event: arg1, + listener: arg2 + } + } else { + return { + target: resolveTarget(arg1), + event: arg2, + listener: arg3 + } + } + + } + + function addEventListenerImpl(arg1, arg2, arg3) { + ready(function(){ + var eventArgs = processEventArgs(arg1, arg2, arg3); + eventArgs.target.addEventListener(eventArgs.event, eventArgs.listener); + }) + var b = isFunction(arg2); + return b ? arg2 : arg3; + } + + function removeEventListenerImpl(arg1, arg2, arg3) { + ready(function(){ + var eventArgs = processEventArgs(arg1, arg2, arg3); + eventArgs.target.removeEventListener(eventArgs.event, eventArgs.listener); + }) + return isFunction(arg2) ? arg2 : arg3; + } + + //==================================================================== + // Node processing + //==================================================================== + + var DUMMY_ELT = getDocument().createElement("output"); // dummy element for bad selectors + function findAttributeTargets(elt, attrName) { + var attrTarget = getClosestAttributeValue(elt, attrName); + if (attrTarget) { + if (attrTarget === "this") { + return [findThisElement(elt, attrName)]; + } else { + var result = querySelectorAllExt(elt, attrTarget); + if (result.length === 0) { + logError('The selector "' + attrTarget + '" on ' + attrName + " returned no matches!"); + return [DUMMY_ELT] + } else { + return result; + } + } + } + } + + function findThisElement(elt, attribute){ + return getClosestMatch(elt, function (elt) { + return getAttributeValue(elt, attribute) != null; + }) + } + + function getTarget(elt) { + var targetStr = getClosestAttributeValue(elt, "hx-target"); + if (targetStr) { + if (targetStr === "this") { + return findThisElement(elt,'hx-target'); + } else { + return querySelectorExt(elt, targetStr) + } + } else { + var data = getInternalData(elt); + if (data.boosted) { + return getDocument().body; + } else { + return elt; + } + } + } + + function shouldSettleAttribute(name) { + var attributesToSettle = htmx.config.attributesToSettle; + for (var i = 0; i < attributesToSettle.length; i++) { + if (name === attributesToSettle[i]) { + return true; + } + } + return false; + } + + function cloneAttributes(mergeTo, mergeFrom) { + forEach(mergeTo.attributes, function (attr) { + if (!mergeFrom.hasAttribute(attr.name) && shouldSettleAttribute(attr.name)) { + mergeTo.removeAttribute(attr.name) + } + }); + forEach(mergeFrom.attributes, function (attr) { + if (shouldSettleAttribute(attr.name)) { + mergeTo.setAttribute(attr.name, attr.value); + } + }); + } + + function isInlineSwap(swapStyle, target) { + var extensions = getExtensions(target); + for (var i = 0; i < extensions.length; i++) { + var extension = extensions[i]; + try { + if (extension.isInlineSwap(swapStyle)) { + return true; + } + } catch(e) { + logError(e); + } + } + return swapStyle === "outerHTML"; + } + + /** + * + * @param {string} oobValue + * @param {HTMLElement} oobElement + * @param {*} settleInfo + * @returns + */ + function oobSwap(oobValue, oobElement, settleInfo) { + var selector = "#" + getRawAttribute(oobElement, "id"); + var swapStyle = "outerHTML"; + if (oobValue === "true") { + // do nothing + } else if (oobValue.indexOf(":") > 0) { + swapStyle = oobValue.substr(0, oobValue.indexOf(":")); + selector = oobValue.substr(oobValue.indexOf(":") + 1, oobValue.length); + } else { + swapStyle = oobValue; + } + + var targets = getDocument().querySelectorAll(selector); + if (targets) { + forEach( + targets, + function (target) { + var fragment; + var oobElementClone = oobElement.cloneNode(true); + fragment = getDocument().createDocumentFragment(); + fragment.appendChild(oobElementClone); + if (!isInlineSwap(swapStyle, target)) { + fragment = oobElementClone; // if this is not an inline swap, we use the content of the node, not the node itself + } + + var beforeSwapDetails = {shouldSwap: true, target: target, fragment:fragment }; + if (!triggerEvent(target, 'htmx:oobBeforeSwap', beforeSwapDetails)) return; + + target = beforeSwapDetails.target; // allow re-targeting + if (beforeSwapDetails['shouldSwap']){ + swap(swapStyle, target, target, fragment, settleInfo); + } + forEach(settleInfo.elts, function (elt) { + triggerEvent(elt, 'htmx:oobAfterSwap', beforeSwapDetails); + }); + } + ); + oobElement.parentNode.removeChild(oobElement); + } else { + oobElement.parentNode.removeChild(oobElement); + triggerErrorEvent(getDocument().body, "htmx:oobErrorNoTarget", {content: oobElement}); + } + return oobValue; + } + + function handleOutOfBandSwaps(elt, fragment, settleInfo) { + var oobSelects = getClosestAttributeValue(elt, "hx-select-oob"); + if (oobSelects) { + var oobSelectValues = oobSelects.split(","); + for (var i = 0; i < oobSelectValues.length; i++) { + var oobSelectValue = oobSelectValues[i].split(":", 2); + var id = oobSelectValue[0].trim(); + if (id.indexOf("#") === 0) { + id = id.substring(1); + } + var oobValue = oobSelectValue[1] || "true"; + var oobElement = fragment.querySelector("#" + id); + if (oobElement) { + oobSwap(oobValue, oobElement, settleInfo); + } + } + } + forEach(findAll(fragment, '[hx-swap-oob], [data-hx-swap-oob]'), function (oobElement) { + var oobValue = getAttributeValue(oobElement, "hx-swap-oob"); + if (oobValue != null) { + oobSwap(oobValue, oobElement, settleInfo); + } + }); + } + + function handlePreservedElements(fragment) { + forEach(findAll(fragment, '[hx-preserve], [data-hx-preserve]'), function (preservedElt) { + var id = getAttributeValue(preservedElt, "id"); + var oldElt = getDocument().getElementById(id); + if (oldElt != null) { + preservedElt.parentNode.replaceChild(oldElt, preservedElt); + } + }); + } + + function handleAttributes(parentNode, fragment, settleInfo) { + forEach(fragment.querySelectorAll("[id]"), function (newNode) { + var id = getRawAttribute(newNode, "id") + if (id && id.length > 0) { + var normalizedId = id.replace("'", "\\'"); + var normalizedTag = newNode.tagName.replace(':', '\\:'); + var oldNode = parentNode.querySelector(normalizedTag + "[id='" + normalizedId + "']"); + if (oldNode && oldNode !== parentNode) { + var newAttributes = newNode.cloneNode(); + cloneAttributes(newNode, oldNode); + settleInfo.tasks.push(function () { + cloneAttributes(newNode, newAttributes); + }); + } + } + }); + } + + function makeAjaxLoadTask(child) { + return function () { + removeClassFromElement(child, htmx.config.addedClass); + processNode(child); + processScripts(child); + processFocus(child) + triggerEvent(child, 'htmx:load'); + }; + } + + function processFocus(child) { + var autofocus = "[autofocus]"; + var autoFocusedElt = matches(child, autofocus) ? child : child.querySelector(autofocus) + if (autoFocusedElt != null) { + autoFocusedElt.focus(); + } + } + + function insertNodesBefore(parentNode, insertBefore, fragment, settleInfo) { + handleAttributes(parentNode, fragment, settleInfo); + while(fragment.childNodes.length > 0){ + var child = fragment.firstChild; + addClassToElement(child, htmx.config.addedClass); + parentNode.insertBefore(child, insertBefore); + if (child.nodeType !== Node.TEXT_NODE && child.nodeType !== Node.COMMENT_NODE) { + settleInfo.tasks.push(makeAjaxLoadTask(child)); + } + } + } + + // based on https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0, + // derived from Java's string hashcode implementation + function stringHash(string, hash) { + var char = 0; + while (char < string.length){ + hash = (hash << 5) - hash + string.charCodeAt(char++) | 0; // bitwise or ensures we have a 32-bit int + } + return hash; + } + + function attributeHash(elt) { + var hash = 0; + // IE fix + if (elt.attributes) { + for (var i = 0; i < elt.attributes.length; i++) { + var attribute = elt.attributes[i]; + if(attribute.value){ // only include attributes w/ actual values (empty is same as non-existent) + hash = stringHash(attribute.name, hash); + hash = stringHash(attribute.value, hash); + } + } + } + return hash; + } + + function deInitOnHandlers(elt) { + var internalData = getInternalData(elt); + if (internalData.onHandlers) { + for (var i = 0; i < internalData.onHandlers.length; i++) { + const handlerInfo = internalData.onHandlers[i]; + elt.removeEventListener(handlerInfo.event, handlerInfo.listener); + } + delete internalData.onHandlers + } + } + + function deInitNode(element) { + var internalData = getInternalData(element); + if (internalData.timeout) { + clearTimeout(internalData.timeout); + } + if (internalData.webSocket) { + internalData.webSocket.close(); + } + if (internalData.sseEventSource) { + internalData.sseEventSource.close(); + } + if (internalData.listenerInfos) { + forEach(internalData.listenerInfos, function (info) { + if (info.on) { + info.on.removeEventListener(info.trigger, info.listener); + } + }); + } + deInitOnHandlers(element); + forEach(Object.keys(internalData), function(key) { delete internalData[key] }); + } + + function cleanUpElement(element) { + triggerEvent(element, "htmx:beforeCleanupElement") + deInitNode(element); + if (element.children) { // IE + forEach(element.children, function(child) { cleanUpElement(child) }); + } + } + + function swapOuterHTML(target, fragment, settleInfo) { + if (target.tagName === "BODY") { + return swapInnerHTML(target, fragment, settleInfo); + } else { + // @type {HTMLElement} + var newElt + var eltBeforeNewContent = target.previousSibling; + insertNodesBefore(parentElt(target), target, fragment, settleInfo); + if (eltBeforeNewContent == null) { + newElt = parentElt(target).firstChild; + } else { + newElt = eltBeforeNewContent.nextSibling; + } + settleInfo.elts = settleInfo.elts.filter(function(e) { return e != target }); + while(newElt && newElt !== target) { + if (newElt.nodeType === Node.ELEMENT_NODE) { + settleInfo.elts.push(newElt); + } + newElt = newElt.nextElementSibling; + } + cleanUpElement(target); + parentElt(target).removeChild(target); + } + } + + function swapAfterBegin(target, fragment, settleInfo) { + return insertNodesBefore(target, target.firstChild, fragment, settleInfo); + } + + function swapBeforeBegin(target, fragment, settleInfo) { + return insertNodesBefore(parentElt(target), target, fragment, settleInfo); + } + + function swapBeforeEnd(target, fragment, settleInfo) { + return insertNodesBefore(target, null, fragment, settleInfo); + } + + function swapAfterEnd(target, fragment, settleInfo) { + return insertNodesBefore(parentElt(target), target.nextSibling, fragment, settleInfo); + } + function swapDelete(target, fragment, settleInfo) { + cleanUpElement(target); + return parentElt(target).removeChild(target); + } + + function swapInnerHTML(target, fragment, settleInfo) { + var firstChild = target.firstChild; + insertNodesBefore(target, firstChild, fragment, settleInfo); + if (firstChild) { + while (firstChild.nextSibling) { + cleanUpElement(firstChild.nextSibling) + target.removeChild(firstChild.nextSibling); + } + cleanUpElement(firstChild) + target.removeChild(firstChild); + } + } + + function maybeSelectFromResponse(elt, fragment, selectOverride) { + var selector = selectOverride || getClosestAttributeValue(elt, "hx-select"); + if (selector) { + var newFragment = getDocument().createDocumentFragment(); + forEach(fragment.querySelectorAll(selector), function (node) { + newFragment.appendChild(node); + }); + fragment = newFragment; + } + return fragment; + } + + function swap(swapStyle, elt, target, fragment, settleInfo) { + switch (swapStyle) { + case "none": + return; + case "outerHTML": + swapOuterHTML(target, fragment, settleInfo); + return; + case "afterbegin": + swapAfterBegin(target, fragment, settleInfo); + return; + case "beforebegin": + swapBeforeBegin(target, fragment, settleInfo); + return; + case "beforeend": + swapBeforeEnd(target, fragment, settleInfo); + return; + case "afterend": + swapAfterEnd(target, fragment, settleInfo); + return; + case "delete": + swapDelete(target, fragment, settleInfo); + return; + default: + var extensions = getExtensions(elt); + for (var i = 0; i < extensions.length; i++) { + var ext = extensions[i]; + try { + var newElements = ext.handleSwap(swapStyle, target, fragment, settleInfo); + if (newElements) { + if (typeof newElements.length !== 'undefined') { + // if handleSwap returns an array (like) of elements, we handle them + for (var j = 0; j < newElements.length; j++) { + var child = newElements[j]; + if (child.nodeType !== Node.TEXT_NODE && child.nodeType !== Node.COMMENT_NODE) { + settleInfo.tasks.push(makeAjaxLoadTask(child)); + } + } + } + return; + } + } catch (e) { + logError(e); + } + } + if (swapStyle === "innerHTML") { + swapInnerHTML(target, fragment, settleInfo); + } else { + swap(htmx.config.defaultSwapStyle, elt, target, fragment, settleInfo); + } + } + } + + function findTitle(content) { + if (content.indexOf(' -1) { + var contentWithSvgsRemoved = content.replace(SVG_TAGS_REGEX, ''); + var result = contentWithSvgsRemoved.match(TITLE_TAG_REGEX); + if (result) { + return result[2]; + } + } + } + + function selectAndSwap(swapStyle, target, elt, responseText, settleInfo, selectOverride) { + settleInfo.title = findTitle(responseText); + var fragment = makeFragment(responseText); + if (fragment) { + handleOutOfBandSwaps(elt, fragment, settleInfo); + fragment = maybeSelectFromResponse(elt, fragment, selectOverride); + handlePreservedElements(fragment); + return swap(swapStyle, elt, target, fragment, settleInfo); + } + } + + function handleTrigger(xhr, header, elt) { + var triggerBody = xhr.getResponseHeader(header); + if (triggerBody.indexOf("{") === 0) { + var triggers = parseJSON(triggerBody); + for (var eventName in triggers) { + if (triggers.hasOwnProperty(eventName)) { + var detail = triggers[eventName]; + if (!isRawObject(detail)) { + detail = {"value": detail} + } + triggerEvent(elt, eventName, detail); + } + } + } else { + var eventNames = triggerBody.split(",") + for (var i = 0; i < eventNames.length; i++) { + triggerEvent(elt, eventNames[i].trim(), []); + } + } + } + + var WHITESPACE = /\s/; + var WHITESPACE_OR_COMMA = /[\s,]/; + var SYMBOL_START = /[_$a-zA-Z]/; + var SYMBOL_CONT = /[_$a-zA-Z0-9]/; + var STRINGISH_START = ['"', "'", "/"]; + var NOT_WHITESPACE = /[^\s]/; + var COMBINED_SELECTOR_START = /[{(]/; + var COMBINED_SELECTOR_END = /[})]/; + function tokenizeString(str) { + var tokens = []; + var position = 0; + while (position < str.length) { + if(SYMBOL_START.exec(str.charAt(position))) { + var startPosition = position; + while (SYMBOL_CONT.exec(str.charAt(position + 1))) { + position++; + } + tokens.push(str.substr(startPosition, position - startPosition + 1)); + } else if (STRINGISH_START.indexOf(str.charAt(position)) !== -1) { + var startChar = str.charAt(position); + var startPosition = position; + position++; + while (position < str.length && str.charAt(position) !== startChar ) { + if (str.charAt(position) === "\\") { + position++; + } + position++; + } + tokens.push(str.substr(startPosition, position - startPosition + 1)); + } else { + var symbol = str.charAt(position); + tokens.push(symbol); + } + position++; + } + return tokens; + } + + function isPossibleRelativeReference(token, last, paramName) { + return SYMBOL_START.exec(token.charAt(0)) && + token !== "true" && + token !== "false" && + token !== "this" && + token !== paramName && + last !== "."; + } + + function maybeGenerateConditional(elt, tokens, paramName) { + if (tokens[0] === '[') { + tokens.shift(); + var bracketCount = 1; + var conditionalSource = " return (function(" + paramName + "){ return ("; + var last = null; + while (tokens.length > 0) { + var token = tokens[0]; + if (token === "]") { + bracketCount--; + if (bracketCount === 0) { + if (last === null) { + conditionalSource = conditionalSource + "true"; + } + tokens.shift(); + conditionalSource += ")})"; + try { + var conditionFunction = maybeEval(elt,function () { + return Function(conditionalSource)(); + }, + function(){return true}) + conditionFunction.source = conditionalSource; + return conditionFunction; + } catch (e) { + triggerErrorEvent(getDocument().body, "htmx:syntax:error", {error:e, source:conditionalSource}) + return null; + } + } + } else if (token === "[") { + bracketCount++; + } + if (isPossibleRelativeReference(token, last, paramName)) { + conditionalSource += "((" + paramName + "." + token + ") ? (" + paramName + "." + token + ") : (window." + token + "))"; + } else { + conditionalSource = conditionalSource + token; + } + last = tokens.shift(); + } + } + } + + function consumeUntil(tokens, match) { + var result = ""; + while (tokens.length > 0 && !match.test(tokens[0])) { + result += tokens.shift(); + } + return result; + } + + function consumeCSSSelector(tokens) { + var result; + if (tokens.length > 0 && COMBINED_SELECTOR_START.test(tokens[0])) { + tokens.shift(); + result = consumeUntil(tokens, COMBINED_SELECTOR_END).trim(); + tokens.shift(); + } else { + result = consumeUntil(tokens, WHITESPACE_OR_COMMA); + } + return result; + } + + var INPUT_SELECTOR = 'input, textarea, select'; + + /** + * @param {HTMLElement} elt + * @param {string} explicitTrigger + * @param {cache} cache for trigger specs + * @returns {import("./htmx").HtmxTriggerSpecification[]} + */ + function parseAndCacheTrigger(elt, explicitTrigger, cache) { + var triggerSpecs = []; + var tokens = tokenizeString(explicitTrigger); + do { + consumeUntil(tokens, NOT_WHITESPACE); + var initialLength = tokens.length; + var trigger = consumeUntil(tokens, /[,\[\s]/); + if (trigger !== "") { + if (trigger === "every") { + var every = {trigger: 'every'}; + consumeUntil(tokens, NOT_WHITESPACE); + every.pollInterval = parseInterval(consumeUntil(tokens, /[,\[\s]/)); + consumeUntil(tokens, NOT_WHITESPACE); + var eventFilter = maybeGenerateConditional(elt, tokens, "event"); + if (eventFilter) { + every.eventFilter = eventFilter; + } + triggerSpecs.push(every); + } else if (trigger.indexOf("sse:") === 0) { + triggerSpecs.push({trigger: 'sse', sseEvent: trigger.substr(4)}); + } else { + var triggerSpec = {trigger: trigger}; + var eventFilter = maybeGenerateConditional(elt, tokens, "event"); + if (eventFilter) { + triggerSpec.eventFilter = eventFilter; + } + while (tokens.length > 0 && tokens[0] !== ",") { + consumeUntil(tokens, NOT_WHITESPACE) + var token = tokens.shift(); + if (token === "changed") { + triggerSpec.changed = true; + } else if (token === "once") { + triggerSpec.once = true; + } else if (token === "consume") { + triggerSpec.consume = true; + } else if (token === "delay" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); + } else if (token === "from" && tokens[0] === ":") { + tokens.shift(); + if (COMBINED_SELECTOR_START.test(tokens[0])) { + var from_arg = consumeCSSSelector(tokens); + } else { + var from_arg = consumeUntil(tokens, WHITESPACE_OR_COMMA); + if (from_arg === "closest" || from_arg === "find" || from_arg === "next" || from_arg === "previous") { + tokens.shift(); + var selector = consumeCSSSelector(tokens); + // `next` and `previous` allow a selector-less syntax + if (selector.length > 0) { + from_arg += " " + selector; + } + } + } + triggerSpec.from = from_arg; + } else if (token === "target" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.target = consumeCSSSelector(tokens); + } else if (token === "throttle" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); + } else if (token === "queue" && tokens[0] === ":") { + tokens.shift(); + triggerSpec.queue = consumeUntil(tokens, WHITESPACE_OR_COMMA); + } else if (token === "root" && tokens[0] === ":") { + tokens.shift(); + triggerSpec[token] = consumeCSSSelector(tokens); + } else if (token === "threshold" && tokens[0] === ":") { + tokens.shift(); + triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA); + } else { + triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); + } + } + triggerSpecs.push(triggerSpec); + } + } + if (tokens.length === initialLength) { + triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); + } + consumeUntil(tokens, NOT_WHITESPACE); + } while (tokens[0] === "," && tokens.shift()) + if (cache) { + cache[explicitTrigger] = triggerSpecs + } + return triggerSpecs + } + + /** + * @param {HTMLElement} elt + * @returns {import("./htmx").HtmxTriggerSpecification[]} + */ + function getTriggerSpecs(elt) { + var explicitTrigger = getAttributeValue(elt, 'hx-trigger'); + var triggerSpecs = []; + if (explicitTrigger) { + var cache = htmx.config.triggerSpecsCache + triggerSpecs = (cache && cache[explicitTrigger]) || parseAndCacheTrigger(elt, explicitTrigger, cache) + } + + if (triggerSpecs.length > 0) { + return triggerSpecs; + } else if (matches(elt, 'form')) { + return [{trigger: 'submit'}]; + } else if (matches(elt, 'input[type="button"], input[type="submit"]')){ + return [{trigger: 'click'}]; + } else if (matches(elt, INPUT_SELECTOR)) { + return [{trigger: 'change'}]; + } else { + return [{trigger: 'click'}]; + } + } + + function cancelPolling(elt) { + getInternalData(elt).cancelled = true; + } + + function processPolling(elt, handler, spec) { + var nodeData = getInternalData(elt); + nodeData.timeout = setTimeout(function () { + if (bodyContains(elt) && nodeData.cancelled !== true) { + if (!maybeFilterEvent(spec, elt, makeEvent('hx:poll:trigger', { + triggerSpec: spec, + target: elt + }))) { + handler(elt); + } + processPolling(elt, handler, spec); + } + }, spec.pollInterval); + } + + function isLocalLink(elt) { + return location.hostname === elt.hostname && + getRawAttribute(elt,'href') && + getRawAttribute(elt,'href').indexOf("#") !== 0; + } + + function boostElement(elt, nodeData, triggerSpecs) { + if ((elt.tagName === "A" && isLocalLink(elt) && (elt.target === "" || elt.target === "_self")) || elt.tagName === "FORM") { + nodeData.boosted = true; + var verb, path; + if (elt.tagName === "A") { + verb = "get"; + path = getRawAttribute(elt, 'href') + } else { + var rawAttribute = getRawAttribute(elt, "method"); + verb = rawAttribute ? rawAttribute.toLowerCase() : "get"; + if (verb === "get") { + } + path = getRawAttribute(elt, 'action'); + } + triggerSpecs.forEach(function(triggerSpec) { + addEventListener(elt, function(elt, evt) { + if (closest(elt, htmx.config.disableSelector)) { + cleanUpElement(elt) + return + } + issueAjaxRequest(verb, path, elt, evt) + }, nodeData, triggerSpec, true); + }); + } + } + + /** + * + * @param {Event} evt + * @param {HTMLElement} elt + * @returns + */ + function shouldCancel(evt, elt) { + if (evt.type === "submit" || evt.type === "click") { + if (elt.tagName === "FORM") { + return true; + } + if (matches(elt, 'input[type="submit"], button') && closest(elt, 'form') !== null) { + return true; + } + if (elt.tagName === "A" && elt.href && + (elt.getAttribute('href') === '#' || elt.getAttribute('href').indexOf("#") !== 0)) { + return true; + } + } + return false; + } + + function ignoreBoostedAnchorCtrlClick(elt, evt) { + return getInternalData(elt).boosted && elt.tagName === "A" && evt.type === "click" && (evt.ctrlKey || evt.metaKey); + } + + function maybeFilterEvent(triggerSpec, elt, evt) { + var eventFilter = triggerSpec.eventFilter; + if(eventFilter){ + try { + return eventFilter.call(elt, evt) !== true; + } catch(e) { + triggerErrorEvent(getDocument().body, "htmx:eventFilter:error", {error: e, source:eventFilter.source}); + return true; + } + } + return false; + } + + function addEventListener(elt, handler, nodeData, triggerSpec, explicitCancel) { + var elementData = getInternalData(elt); + var eltsToListenOn; + if (triggerSpec.from) { + eltsToListenOn = querySelectorAllExt(elt, triggerSpec.from); + } else { + eltsToListenOn = [elt]; + } + // store the initial values of the elements, so we can tell if they change + if (triggerSpec.changed) { + eltsToListenOn.forEach(function (eltToListenOn) { + var eltToListenOnData = getInternalData(eltToListenOn); + eltToListenOnData.lastValue = eltToListenOn.value; + }) + } + forEach(eltsToListenOn, function (eltToListenOn) { + var eventListener = function (evt) { + if (!bodyContains(elt)) { + eltToListenOn.removeEventListener(triggerSpec.trigger, eventListener); + return; + } + if (ignoreBoostedAnchorCtrlClick(elt, evt)) { + return; + } + if (explicitCancel || shouldCancel(evt, elt)) { + evt.preventDefault(); + } + if (maybeFilterEvent(triggerSpec, elt, evt)) { + return; + } + var eventData = getInternalData(evt); + eventData.triggerSpec = triggerSpec; + if (eventData.handledFor == null) { + eventData.handledFor = []; + } + if (eventData.handledFor.indexOf(elt) < 0) { + eventData.handledFor.push(elt); + if (triggerSpec.consume) { + evt.stopPropagation(); + } + if (triggerSpec.target && evt.target) { + if (!matches(evt.target, triggerSpec.target)) { + return; + } + } + if (triggerSpec.once) { + if (elementData.triggeredOnce) { + return; + } else { + elementData.triggeredOnce = true; + } + } + if (triggerSpec.changed) { + var eltToListenOnData = getInternalData(eltToListenOn) + if (eltToListenOnData.lastValue === eltToListenOn.value) { + return; + } + eltToListenOnData.lastValue = eltToListenOn.value + } + if (elementData.delayed) { + clearTimeout(elementData.delayed); + } + if (elementData.throttle) { + return; + } + + if (triggerSpec.throttle > 0) { + if (!elementData.throttle) { + handler(elt, evt); + elementData.throttle = setTimeout(function () { + elementData.throttle = null; + }, triggerSpec.throttle); + } + } else if (triggerSpec.delay > 0) { + elementData.delayed = setTimeout(function() { handler(elt, evt) }, triggerSpec.delay); + } else { + triggerEvent(elt, 'htmx:trigger') + handler(elt, evt); + } + } + }; + if (nodeData.listenerInfos == null) { + nodeData.listenerInfos = []; + } + nodeData.listenerInfos.push({ + trigger: triggerSpec.trigger, + listener: eventListener, + on: eltToListenOn + }) + eltToListenOn.addEventListener(triggerSpec.trigger, eventListener); + }); + } + + var windowIsScrolling = false // used by initScrollHandler + var scrollHandler = null; + function initScrollHandler() { + if (!scrollHandler) { + scrollHandler = function() { + windowIsScrolling = true + }; + window.addEventListener("scroll", scrollHandler) + setInterval(function() { + if (windowIsScrolling) { + windowIsScrolling = false; + forEach(getDocument().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"), function (elt) { + maybeReveal(elt); + }) + } + }, 200); + } + } + + function maybeReveal(elt) { + if (!hasAttribute(elt,'data-hx-revealed') && isScrolledIntoView(elt)) { + elt.setAttribute('data-hx-revealed', 'true'); + var nodeData = getInternalData(elt); + if (nodeData.initHash) { + triggerEvent(elt, 'revealed'); + } else { + // if the node isn't initialized, wait for it before triggering the request + elt.addEventListener("htmx:afterProcessNode", function(evt) { triggerEvent(elt, 'revealed') }, {once: true}); + } + } + } + + //==================================================================== + // Web Sockets + //==================================================================== + + function processWebSocketInfo(elt, nodeData, info) { + var values = splitOnWhitespace(info); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + ensureWebSocket(elt, value[1], 0); + } + if (value[0] === "send") { + processWebSocketSend(elt); + } + } + } + + function ensureWebSocket(elt, wssSource, retryCount) { + if (!bodyContains(elt)) { + return; // stop ensuring websocket connection when socket bearing element ceases to exist + } + + if (wssSource.indexOf("/") == 0) { // complete absolute paths only + var base_part = location.hostname + (location.port ? ':'+location.port: ''); + if (location.protocol == 'https:') { + wssSource = "wss://" + base_part + wssSource; + } else if (location.protocol == 'http:') { + wssSource = "ws://" + base_part + wssSource; + } + } + var socket = htmx.createWebSocket(wssSource); + socket.onerror = function (e) { + triggerErrorEvent(elt, "htmx:wsError", {error:e, socket:socket}); + maybeCloseWebSocketSource(elt); + }; + + socket.onclose = function (e) { + if ([1006, 1012, 1013].indexOf(e.code) >= 0) { // Abnormal Closure/Service Restart/Try Again Later + var delay = getWebSocketReconnectDelay(retryCount); + setTimeout(function() { + ensureWebSocket(elt, wssSource, retryCount+1); // creates a websocket with a new timeout + }, delay); + } + }; + socket.onopen = function (e) { + retryCount = 0; + } + + getInternalData(elt).webSocket = socket; + socket.addEventListener('message', function (event) { + if (maybeCloseWebSocketSource(elt)) { + return; + } + + var response = event.data; + withExtensions(elt, function(extension){ + response = extension.transformResponse(response, null, elt); + }); + + var settleInfo = makeSettleInfo(elt); + var fragment = makeFragment(response); + var children = toArray(fragment.children); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + oobSwap(getAttributeValue(child, "hx-swap-oob") || "true", child, settleInfo); + } + + settleImmediately(settleInfo.tasks); + }); + } + + function maybeCloseWebSocketSource(elt) { + if (!bodyContains(elt)) { + getInternalData(elt).webSocket.close(); + return true; + } + } + + function processWebSocketSend(elt) { + var webSocketSourceElt = getClosestMatch(elt, function (parent) { + return getInternalData(parent).webSocket != null; + }); + if (webSocketSourceElt) { + elt.addEventListener(getTriggerSpecs(elt)[0].trigger, function (evt) { + var webSocket = getInternalData(webSocketSourceElt).webSocket; + var headers = getHeaders(elt, webSocketSourceElt); + var results = getInputValues(elt, 'post'); + var errors = results.errors; + var rawParameters = results.values; + var expressionVars = getExpressionVars(elt); + var allParameters = mergeObjects(rawParameters, expressionVars); + var filteredParameters = filterValues(allParameters, elt); + filteredParameters['HEADERS'] = headers; + if (errors && errors.length > 0) { + triggerEvent(elt, 'htmx:validation:halted', errors); + return; + } + webSocket.send(JSON.stringify(filteredParameters)); + if(shouldCancel(evt, elt)){ + evt.preventDefault(); + } + }); + } else { + triggerErrorEvent(elt, "htmx:noWebSocketSourceError"); + } + } + + function getWebSocketReconnectDelay(retryCount) { + var delay = htmx.config.wsReconnectDelay; + if (typeof delay === 'function') { + // @ts-ignore + return delay(retryCount); + } + if (delay === 'full-jitter') { + var exp = Math.min(retryCount, 6); + var maxDelay = 1000 * Math.pow(2, exp); + return maxDelay * Math.random(); + } + logError('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"'); + } + + //==================================================================== + // Server Sent Events + //==================================================================== + + function processSSEInfo(elt, nodeData, info) { + var values = splitOnWhitespace(info); + for (var i = 0; i < values.length; i++) { + var value = values[i].split(/:(.+)/); + if (value[0] === "connect") { + processSSESource(elt, value[1]); + } + + if ((value[0] === "swap")) { + processSSESwap(elt, value[1]) + } + } + } + + function processSSESource(elt, sseSrc) { + var source = htmx.createEventSource(sseSrc); + source.onerror = function (e) { + triggerErrorEvent(elt, "htmx:sseError", {error:e, source:source}); + maybeCloseSSESource(elt); + }; + getInternalData(elt).sseEventSource = source; + } + + function processSSESwap(elt, sseEventName) { + var sseSourceElt = getClosestMatch(elt, hasEventSource); + if (sseSourceElt) { + var sseEventSource = getInternalData(sseSourceElt).sseEventSource; + var sseListener = function (event) { + if (maybeCloseSSESource(sseSourceElt)) { + return; + } + if (!bodyContains(elt)) { + sseEventSource.removeEventListener(sseEventName, sseListener); + return; + } + + /////////////////////////// + // TODO: merge this code with AJAX and WebSockets code in the future. + + var response = event.data; + withExtensions(elt, function(extension){ + response = extension.transformResponse(response, null, elt); + }); + + var swapSpec = getSwapSpecification(elt) + var target = getTarget(elt) + var settleInfo = makeSettleInfo(elt); + + selectAndSwap(swapSpec.swapStyle, target, elt, response, settleInfo) + settleImmediately(settleInfo.tasks) + triggerEvent(elt, "htmx:sseMessage", event) + }; + + getInternalData(elt).sseListener = sseListener; + sseEventSource.addEventListener(sseEventName, sseListener); + } else { + triggerErrorEvent(elt, "htmx:noSSESourceError"); + } + } + + function processSSETrigger(elt, handler, sseEventName) { + var sseSourceElt = getClosestMatch(elt, hasEventSource); + if (sseSourceElt) { + var sseEventSource = getInternalData(sseSourceElt).sseEventSource; + var sseListener = function () { + if (!maybeCloseSSESource(sseSourceElt)) { + if (bodyContains(elt)) { + handler(elt); + } else { + sseEventSource.removeEventListener(sseEventName, sseListener); + } + } + }; + getInternalData(elt).sseListener = sseListener; + sseEventSource.addEventListener(sseEventName, sseListener); + } else { + triggerErrorEvent(elt, "htmx:noSSESourceError"); + } + } + + function maybeCloseSSESource(elt) { + if (!bodyContains(elt)) { + getInternalData(elt).sseEventSource.close(); + return true; + } + } + + function hasEventSource(node) { + return getInternalData(node).sseEventSource != null; + } + + //==================================================================== + + function loadImmediately(elt, handler, nodeData, delay) { + var load = function(){ + if (!nodeData.loaded) { + nodeData.loaded = true; + handler(elt); + } + } + if (delay > 0) { + setTimeout(load, delay); + } else { + load(); + } + } + + function processVerbs(elt, nodeData, triggerSpecs) { + var explicitAction = false; + forEach(VERBS, function (verb) { + if (hasAttribute(elt,'hx-' + verb)) { + var path = getAttributeValue(elt, 'hx-' + verb); + explicitAction = true; + nodeData.path = path; + nodeData.verb = verb; + triggerSpecs.forEach(function(triggerSpec) { + addTriggerHandler(elt, triggerSpec, nodeData, function (elt, evt) { + if (closest(elt, htmx.config.disableSelector)) { + cleanUpElement(elt) + return + } + issueAjaxRequest(verb, path, elt, evt) + }) + }); + } + }); + return explicitAction; + } + + function addTriggerHandler(elt, triggerSpec, nodeData, handler) { + if (triggerSpec.sseEvent) { + processSSETrigger(elt, handler, triggerSpec.sseEvent); + } else if (triggerSpec.trigger === "revealed") { + initScrollHandler(); + addEventListener(elt, handler, nodeData, triggerSpec); + maybeReveal(elt); + } else if (triggerSpec.trigger === "intersect") { + var observerOptions = {}; + if (triggerSpec.root) { + observerOptions.root = querySelectorExt(elt, triggerSpec.root) + } + if (triggerSpec.threshold) { + observerOptions.threshold = parseFloat(triggerSpec.threshold); + } + var observer = new IntersectionObserver(function (entries) { + for (var i = 0; i < entries.length; i++) { + var entry = entries[i]; + if (entry.isIntersecting) { + triggerEvent(elt, "intersect"); + break; + } + } + }, observerOptions); + observer.observe(elt); + addEventListener(elt, handler, nodeData, triggerSpec); + } else if (triggerSpec.trigger === "load") { + if (!maybeFilterEvent(triggerSpec, elt, makeEvent("load", {elt: elt}))) { + loadImmediately(elt, handler, nodeData, triggerSpec.delay); + } + } else if (triggerSpec.pollInterval > 0) { + nodeData.polling = true; + processPolling(elt, handler, triggerSpec); + } else { + addEventListener(elt, handler, nodeData, triggerSpec); + } + } + + function evalScript(script) { + if (htmx.config.allowScriptTags && (script.type === "text/javascript" || script.type === "module" || script.type === "") ) { + var newScript = getDocument().createElement("script"); + forEach(script.attributes, function (attr) { + newScript.setAttribute(attr.name, attr.value); + }); + newScript.textContent = script.textContent; + newScript.async = false; + if (htmx.config.inlineScriptNonce) { + newScript.nonce = htmx.config.inlineScriptNonce; + } + var parent = script.parentElement; + + try { + parent.insertBefore(newScript, script); + } catch (e) { + logError(e); + } finally { + // remove old script element, but only if it is still in DOM + if (script.parentElement) { + script.parentElement.removeChild(script); + } + } + } + } + + function processScripts(elt) { + if (matches(elt, "script")) { + evalScript(elt); + } + forEach(findAll(elt, "script"), function (script) { + evalScript(script); + }); + } + + function shouldProcessHxOn(elt) { + var attributes = elt.attributes + for (var j = 0; j < attributes.length; j++) { + var attrName = attributes[j].name + if (startsWith(attrName, "hx-on:") || startsWith(attrName, "data-hx-on:") || + startsWith(attrName, "hx-on-") || startsWith(attrName, "data-hx-on-")) { + return true + } + } + return false + } + + function findHxOnWildcardElements(elt) { + var node = null + var elements = [] + + if (shouldProcessHxOn(elt)) { + elements.push(elt) + } + + if (document.evaluate) { + var iter = document.evaluate('.//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") or' + + ' starts-with(name(), "hx-on-") or starts-with(name(), "data-hx-on-") ]]', elt) + while (node = iter.iterateNext()) elements.push(node) + } else { + var allElements = elt.getElementsByTagName("*") + for (var i = 0; i < allElements.length; i++) { + if (shouldProcessHxOn(allElements[i])) { + elements.push(allElements[i]) + } + } + } + + return elements + } + + function findElementsToProcess(elt) { + if (elt.querySelectorAll) { + var boostedSelector = ", [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]"; + var results = elt.querySelectorAll(VERB_SELECTOR + boostedSelector + ", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws]," + + " [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]"); + return results; + } else { + return []; + } + } + + // Handle submit buttons/inputs that have the form attribute set + // see https://developer.mozilla.org/docs/Web/HTML/Element/button + function maybeSetLastButtonClicked(evt) { + var elt = closest(evt.target, "button, input[type='submit']"); + var internalData = getRelatedFormData(evt) + if (internalData) { + internalData.lastButtonClicked = elt; + } + }; + function maybeUnsetLastButtonClicked(evt){ + var internalData = getRelatedFormData(evt) + if (internalData) { + internalData.lastButtonClicked = null; + } + } + function getRelatedFormData(evt) { + var elt = closest(evt.target, "button, input[type='submit']"); + if (!elt) { + return; + } + var form = resolveTarget('#' + getRawAttribute(elt, 'form')) || closest(elt, 'form'); + if (!form) { + return; + } + return getInternalData(form); + } + function initButtonTracking(elt) { + // need to handle both click and focus in: + // focusin - in case someone tabs in to a button and hits the space bar + // click - on OSX buttons do not focus on click see https://bugs.webkit.org/show_bug.cgi?id=13724 + elt.addEventListener('click', maybeSetLastButtonClicked) + elt.addEventListener('focusin', maybeSetLastButtonClicked) + elt.addEventListener('focusout', maybeUnsetLastButtonClicked) + } + + function countCurlies(line) { + var tokens = tokenizeString(line); + var netCurlies = 0; + for (var i = 0; i < tokens.length; i++) { + const token = tokens[i]; + if (token === "{") { + netCurlies++; + } else if (token === "}") { + netCurlies--; + } + } + return netCurlies; + } + + function addHxOnEventHandler(elt, eventName, code) { + var nodeData = getInternalData(elt); + if (!Array.isArray(nodeData.onHandlers)) { + nodeData.onHandlers = []; + } + var func; + var listener = function (e) { + return maybeEval(elt, function() { + if (!func) { + func = new Function("event", code); + } + func.call(elt, e); + }); + }; + elt.addEventListener(eventName, listener); + nodeData.onHandlers.push({event:eventName, listener:listener}); + } + + function processHxOn(elt) { + var hxOnValue = getAttributeValue(elt, 'hx-on'); + if (hxOnValue) { + var handlers = {} + var lines = hxOnValue.split("\n"); + var currentEvent = null; + var curlyCount = 0; + while (lines.length > 0) { + var line = lines.shift(); + var match = line.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/); + if (curlyCount === 0 && match) { + line.split(":") + currentEvent = match[1].slice(0, -1); // strip last colon + handlers[currentEvent] = match[2]; + } else { + handlers[currentEvent] += line; + } + curlyCount += countCurlies(line); + } + + for (var eventName in handlers) { + addHxOnEventHandler(elt, eventName, handlers[eventName]); + } + } + } + + function processHxOnWildcard(elt) { + // wipe any previous on handlers so that this function takes precedence + deInitOnHandlers(elt) + + for (var i = 0; i < elt.attributes.length; i++) { + var name = elt.attributes[i].name + var value = elt.attributes[i].value + if (startsWith(name, "hx-on") || startsWith(name, "data-hx-on")) { + var afterOnPosition = name.indexOf("-on") + 3; + var nextChar = name.slice(afterOnPosition, afterOnPosition + 1); + if (nextChar === "-" || nextChar === ":") { + var eventName = name.slice(afterOnPosition + 1); + // if the eventName starts with a colon or dash, prepend "htmx" for shorthand support + if (startsWith(eventName, ":")) { + eventName = "htmx" + eventName + } else if (startsWith(eventName, "-")) { + eventName = "htmx:" + eventName.slice(1); + } else if (startsWith(eventName, "htmx-")) { + eventName = "htmx:" + eventName.slice(5); + } + + addHxOnEventHandler(elt, eventName, value) + } + } + } + } + + function initNode(elt) { + if (closest(elt, htmx.config.disableSelector)) { + cleanUpElement(elt) + return; + } + var nodeData = getInternalData(elt); + if (nodeData.initHash !== attributeHash(elt)) { + // clean up any previously processed info + deInitNode(elt); + + nodeData.initHash = attributeHash(elt); + + processHxOn(elt); + + triggerEvent(elt, "htmx:beforeProcessNode") + + if (elt.value) { + nodeData.lastValue = elt.value; + } + + var triggerSpecs = getTriggerSpecs(elt); + var hasExplicitHttpAction = processVerbs(elt, nodeData, triggerSpecs); + + if (!hasExplicitHttpAction) { + if (getClosestAttributeValue(elt, "hx-boost") === "true") { + boostElement(elt, nodeData, triggerSpecs); + } else if (hasAttribute(elt, 'hx-trigger')) { + triggerSpecs.forEach(function (triggerSpec) { + // For "naked" triggers, don't do anything at all + addTriggerHandler(elt, triggerSpec, nodeData, function () { + }) + }) + } + } + + // Handle submit buttons/inputs that have the form attribute set + // see https://developer.mozilla.org/docs/Web/HTML/Element/button + if (elt.tagName === "FORM" || (getRawAttribute(elt, "type") === "submit" && hasAttribute(elt, "form"))) { + initButtonTracking(elt) + } + + var sseInfo = getAttributeValue(elt, 'hx-sse'); + if (sseInfo) { + processSSEInfo(elt, nodeData, sseInfo); + } + + var wsInfo = getAttributeValue(elt, 'hx-ws'); + if (wsInfo) { + processWebSocketInfo(elt, nodeData, wsInfo); + } + triggerEvent(elt, "htmx:afterProcessNode"); + } + } + + function processNode(elt) { + elt = resolveTarget(elt); + if (closest(elt, htmx.config.disableSelector)) { + cleanUpElement(elt) + return; + } + initNode(elt); + forEach(findElementsToProcess(elt), function(child) { initNode(child) }); + // Because it happens second, the new way of adding onHandlers superseeds the old one + // i.e. if there are any hx-on:eventName attributes, the hx-on attribute will be ignored + forEach(findHxOnWildcardElements(elt), processHxOnWildcard); + } + + //==================================================================== + // Event/Log Support + //==================================================================== + + function kebabEventName(str) { + return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(); + } + + function makeEvent(eventName, detail) { + var evt; + if (window.CustomEvent && typeof window.CustomEvent === 'function') { + evt = new CustomEvent(eventName, {bubbles: true, cancelable: true, detail: detail}); + } else { + evt = getDocument().createEvent('CustomEvent'); + evt.initCustomEvent(eventName, true, true, detail); + } + return evt; + } + + function triggerErrorEvent(elt, eventName, detail) { + triggerEvent(elt, eventName, mergeObjects({error:eventName}, detail)); + } + + function ignoreEventForLogging(eventName) { + return eventName === "htmx:afterProcessNode" + } + + /** + * `withExtensions` locates all active extensions for a provided element, then + * executes the provided function using each of the active extensions. It should + * be called internally at every extendable execution point in htmx. + * + * @param {HTMLElement} elt + * @param {(extension:import("./htmx").HtmxExtension) => void} toDo + * @returns void + */ + function withExtensions(elt, toDo) { + forEach(getExtensions(elt), function(extension){ + try { + toDo(extension); + } catch (e) { + logError(e); + } + }); + } + + function logError(msg) { + if(console.error) { + console.error(msg); + } else if (console.log) { + console.log("ERROR: ", msg); + } + } + + function triggerEvent(elt, eventName, detail) { + elt = resolveTarget(elt); + if (detail == null) { + detail = {}; + } + detail["elt"] = elt; + var event = makeEvent(eventName, detail); + if (htmx.logger && !ignoreEventForLogging(eventName)) { + htmx.logger(elt, eventName, detail); + } + if (detail.error) { + logError(detail.error); + triggerEvent(elt, "htmx:error", {errorInfo:detail}) + } + var eventResult = elt.dispatchEvent(event); + var kebabName = kebabEventName(eventName); + if (eventResult && kebabName !== eventName) { + var kebabedEvent = makeEvent(kebabName, event.detail); + eventResult = eventResult && elt.dispatchEvent(kebabedEvent) + } + withExtensions(elt, function (extension) { + eventResult = eventResult && (extension.onEvent(eventName, event) !== false && !event.defaultPrevented) + }); + return eventResult; + } + + //==================================================================== + // History Support + //==================================================================== + var currentPathForHistory = location.pathname+location.search; + + function getHistoryElement() { + var historyElt = getDocument().querySelector('[hx-history-elt],[data-hx-history-elt]'); + return historyElt || getDocument().body; + } + + function saveToHistoryCache(url, content, title, scroll) { + if (!canAccessLocalStorage()) { + return; + } + + if (htmx.config.historyCacheSize <= 0) { + // make sure that an eventually already existing cache is purged + localStorage.removeItem("htmx-history-cache"); + return; + } + + url = normalizePath(url); + + var historyCache = parseJSON(localStorage.getItem("htmx-history-cache")) || []; + for (var i = 0; i < historyCache.length; i++) { + if (historyCache[i].url === url) { + historyCache.splice(i, 1); + break; + } + } + var newHistoryItem = {url:url, content: content, title:title, scroll:scroll}; + triggerEvent(getDocument().body, "htmx:historyItemCreated", {item:newHistoryItem, cache: historyCache}) + historyCache.push(newHistoryItem) + while (historyCache.length > htmx.config.historyCacheSize) { + historyCache.shift(); + } + while(historyCache.length > 0){ + try { + localStorage.setItem("htmx-history-cache", JSON.stringify(historyCache)); + break; + } catch (e) { + triggerErrorEvent(getDocument().body, "htmx:historyCacheError", {cause:e, cache: historyCache}) + historyCache.shift(); // shrink the cache and retry + } + } + } + + function getCachedHistory(url) { + if (!canAccessLocalStorage()) { + return null; + } + + url = normalizePath(url); + + var historyCache = parseJSON(localStorage.getItem("htmx-history-cache")) || []; + for (var i = 0; i < historyCache.length; i++) { + if (historyCache[i].url === url) { + return historyCache[i]; + } + } + return null; + } + + function cleanInnerHtmlForHistory(elt) { + var className = htmx.config.requestClass; + var clone = elt.cloneNode(true); + forEach(findAll(clone, "." + className), function(child){ + removeClassFromElement(child, className); + }); + return clone.innerHTML; + } + + function saveCurrentPageToHistory() { + var elt = getHistoryElement(); + var path = currentPathForHistory || location.pathname+location.search; + + // Allow history snapshot feature to be disabled where hx-history="false" + // is present *anywhere* in the current document we're about to save, + // so we can prevent privileged data entering the cache. + // The page will still be reachable as a history entry, but htmx will fetch it + // live from the server onpopstate rather than look in the localStorage cache + var disableHistoryCache + try { + disableHistoryCache = getDocument().querySelector('[hx-history="false" i],[data-hx-history="false" i]') + } catch (e) { + // IE11: insensitive modifier not supported so fallback to case sensitive selector + disableHistoryCache = getDocument().querySelector('[hx-history="false"],[data-hx-history="false"]') + } + if (!disableHistoryCache) { + triggerEvent(getDocument().body, "htmx:beforeHistorySave", {path: path, historyElt: elt}); + saveToHistoryCache(path, cleanInnerHtmlForHistory(elt), getDocument().title, window.scrollY); + } + + if (htmx.config.historyEnabled) history.replaceState({htmx: true}, getDocument().title, window.location.href); + } + + function pushUrlIntoHistory(path) { + // remove the cache buster parameter, if any + if (htmx.config.getCacheBusterParam) { + path = path.replace(/org\.htmx\.cache-buster=[^&]*&?/, '') + if (endsWith(path, '&') || endsWith(path, "?")) { + path = path.slice(0, -1); + } + } + if(htmx.config.historyEnabled) { + history.pushState({htmx:true}, "", path); + } + currentPathForHistory = path; + } + + function replaceUrlInHistory(path) { + if(htmx.config.historyEnabled) history.replaceState({htmx:true}, "", path); + currentPathForHistory = path; + } + + function settleImmediately(tasks) { + forEach(tasks, function (task) { + task.call(); + }); + } + + function loadHistoryFromServer(path) { + var request = new XMLHttpRequest(); + var details = {path: path, xhr:request}; + triggerEvent(getDocument().body, "htmx:historyCacheMiss", details); + request.open('GET', path, true); + request.setRequestHeader("HX-Request", "true"); + request.setRequestHeader("HX-History-Restore-Request", "true"); + request.setRequestHeader("HX-Current-URL", getDocument().location.href); + request.onload = function () { + if (this.status >= 200 && this.status < 400) { + triggerEvent(getDocument().body, "htmx:historyCacheMissLoad", details); + var fragment = makeFragment(this.response); + // @ts-ignore + fragment = fragment.querySelector('[hx-history-elt],[data-hx-history-elt]') || fragment; + var historyElement = getHistoryElement(); + var settleInfo = makeSettleInfo(historyElement); + var title = findTitle(this.response); + if (title) { + var titleElt = find("title"); + if (titleElt) { + titleElt.innerHTML = title; + } else { + window.document.title = title; + } + } + // @ts-ignore + swapInnerHTML(historyElement, fragment, settleInfo) + settleImmediately(settleInfo.tasks); + currentPathForHistory = path; + triggerEvent(getDocument().body, "htmx:historyRestore", {path: path, cacheMiss:true, serverResponse:this.response}); + } else { + triggerErrorEvent(getDocument().body, "htmx:historyCacheMissLoadError", details); + } + }; + request.send(); + } + + function restoreHistory(path) { + saveCurrentPageToHistory(); + path = path || location.pathname+location.search; + var cached = getCachedHistory(path); + if (cached) { + var fragment = makeFragment(cached.content); + var historyElement = getHistoryElement(); + var settleInfo = makeSettleInfo(historyElement); + swapInnerHTML(historyElement, fragment, settleInfo) + settleImmediately(settleInfo.tasks); + document.title = cached.title; + setTimeout(function () { + window.scrollTo(0, cached.scroll); + }, 0); // next 'tick', so browser has time to render layout + currentPathForHistory = path; + triggerEvent(getDocument().body, "htmx:historyRestore", {path:path, item:cached}); + } else { + if (htmx.config.refreshOnHistoryMiss) { + + // @ts-ignore: optional parameter in reload() function throws error + window.location.reload(true); + } else { + loadHistoryFromServer(path); + } + } + } + + function addRequestIndicatorClasses(elt) { + var indicators = findAttributeTargets(elt, 'hx-indicator'); + if (indicators == null) { + indicators = [elt]; + } + forEach(indicators, function (ic) { + var internalData = getInternalData(ic); + internalData.requestCount = (internalData.requestCount || 0) + 1; + ic.classList["add"].call(ic.classList, htmx.config.requestClass); + }); + return indicators; + } + + function disableElements(elt) { + var disabledElts = findAttributeTargets(elt, 'hx-disabled-elt'); + if (disabledElts == null) { + disabledElts = []; + } + forEach(disabledElts, function (disabledElement) { + var internalData = getInternalData(disabledElement); + internalData.requestCount = (internalData.requestCount || 0) + 1; + disabledElement.setAttribute("disabled", ""); + }); + return disabledElts; + } + + function removeRequestIndicators(indicators, disabled) { + forEach(indicators, function (ic) { + var internalData = getInternalData(ic); + internalData.requestCount = (internalData.requestCount || 0) - 1; + if (internalData.requestCount === 0) { + ic.classList["remove"].call(ic.classList, htmx.config.requestClass); + } + }); + forEach(disabled, function (disabledElement) { + var internalData = getInternalData(disabledElement); + internalData.requestCount = (internalData.requestCount || 0) - 1; + if (internalData.requestCount === 0) { + disabledElement.removeAttribute('disabled'); + } + }); + } + + //==================================================================== + // Input Value Processing + //==================================================================== + + function haveSeenNode(processed, elt) { + for (var i = 0; i < processed.length; i++) { + var node = processed[i]; + if (node.isSameNode(elt)) { + return true; + } + } + return false; + } + + function shouldInclude(elt) { + if(elt.name === "" || elt.name == null || elt.disabled || closest(elt, "fieldset[disabled]")) { + return false; + } + // ignore "submitter" types (see jQuery src/serialize.js) + if (elt.type === "button" || elt.type === "submit" || elt.tagName === "image" || elt.tagName === "reset" || elt.tagName === "file" ) { + return false; + } + if (elt.type === "checkbox" || elt.type === "radio" ) { + return elt.checked; + } + return true; + } + + function addValueToValues(name, value, values) { + // This is a little ugly because both the current value of the named value in the form + // and the new value could be arrays, so we have to handle all four cases :/ + if (name != null && value != null) { + var current = values[name]; + if (current === undefined) { + values[name] = value; + } else if (Array.isArray(current)) { + if (Array.isArray(value)) { + values[name] = current.concat(value); + } else { + current.push(value); + } + } else { + if (Array.isArray(value)) { + values[name] = [current].concat(value); + } else { + values[name] = [current, value]; + } + } + } + } + + function processInputValue(processed, values, errors, elt, validate) { + if (elt == null || haveSeenNode(processed, elt)) { + return; + } else { + processed.push(elt); + } + if (shouldInclude(elt)) { + var name = getRawAttribute(elt,"name"); + var value = elt.value; + if (elt.multiple && elt.tagName === "SELECT") { + value = toArray(elt.querySelectorAll("option:checked")).map(function (e) { return e.value }); + } + // include file inputs + if (elt.files) { + value = toArray(elt.files); + } + addValueToValues(name, value, values); + if (validate) { + validateElement(elt, errors); + } + } + if (matches(elt, 'form')) { + var inputs = elt.elements; + forEach(inputs, function(input) { + processInputValue(processed, values, errors, input, validate); + }); + } + } + + function validateElement(element, errors) { + if (element.willValidate) { + triggerEvent(element, "htmx:validation:validate") + if (!element.checkValidity()) { + errors.push({elt: element, message:element.validationMessage, validity:element.validity}); + triggerEvent(element, "htmx:validation:failed", {message:element.validationMessage, validity:element.validity}) + } + } + } + + /** + * @param {HTMLElement} elt + * @param {string} verb + */ + function getInputValues(elt, verb) { + var processed = []; + var values = {}; + var formValues = {}; + var errors = []; + var internalData = getInternalData(elt); + if (internalData.lastButtonClicked && !bodyContains(internalData.lastButtonClicked)) { + internalData.lastButtonClicked = null + } + + // only validate when form is directly submitted and novalidate or formnovalidate are not set + // or if the element has an explicit hx-validate="true" on it + var validate = (matches(elt, 'form') && elt.noValidate !== true) || getAttributeValue(elt, "hx-validate") === "true"; + if (internalData.lastButtonClicked) { + validate = validate && internalData.lastButtonClicked.formNoValidate !== true; + } + + // for a non-GET include the closest form + if (verb !== 'get') { + processInputValue(processed, formValues, errors, closest(elt, 'form'), validate); + } + + // include the element itself + processInputValue(processed, values, errors, elt, validate); + + // if a button or submit was clicked last, include its value + if (internalData.lastButtonClicked || elt.tagName === "BUTTON" || + (elt.tagName === "INPUT" && getRawAttribute(elt, "type") === "submit")) { + var button = internalData.lastButtonClicked || elt + var name = getRawAttribute(button, "name") + addValueToValues(name, button.value, formValues) + } + + // include any explicit includes + var includes = findAttributeTargets(elt, "hx-include"); + forEach(includes, function(node) { + processInputValue(processed, values, errors, node, validate); + // if a non-form is included, include any input values within it + if (!matches(node, 'form')) { + forEach(node.querySelectorAll(INPUT_SELECTOR), function (descendant) { + processInputValue(processed, values, errors, descendant, validate); + }) + } + }); + + // form values take precedence, overriding the regular values + values = mergeObjects(values, formValues); + + return {errors:errors, values:values}; + } + + function appendParam(returnStr, name, realValue) { + if (returnStr !== "") { + returnStr += "&"; + } + if (String(realValue) === "[object Object]") { + realValue = JSON.stringify(realValue); + } + var s = encodeURIComponent(realValue); + returnStr += encodeURIComponent(name) + "=" + s; + return returnStr; + } + + function urlEncode(values) { + var returnStr = ""; + for (var name in values) { + if (values.hasOwnProperty(name)) { + var value = values[name]; + if (Array.isArray(value)) { + forEach(value, function(v) { + returnStr = appendParam(returnStr, name, v); + }); + } else { + returnStr = appendParam(returnStr, name, value); + } + } + } + return returnStr; + } + + function makeFormData(values) { + var formData = new FormData(); + for (var name in values) { + if (values.hasOwnProperty(name)) { + var value = values[name]; + if (Array.isArray(value)) { + forEach(value, function(v) { + formData.append(name, v); + }); + } else { + formData.append(name, value); + } + } + } + return formData; + } + + //==================================================================== + // Ajax + //==================================================================== + + /** + * @param {HTMLElement} elt + * @param {HTMLElement} target + * @param {string} prompt + * @returns {Object} // TODO: Define/Improve HtmxHeaderSpecification + */ + function getHeaders(elt, target, prompt) { + var headers = { + "HX-Request" : "true", + "HX-Trigger" : getRawAttribute(elt, "id"), + "HX-Trigger-Name" : getRawAttribute(elt, "name"), + "HX-Target" : getAttributeValue(target, "id"), + "HX-Current-URL" : getDocument().location.href, + } + getValuesForElement(elt, "hx-headers", false, headers) + if (prompt !== undefined) { + headers["HX-Prompt"] = prompt; + } + if (getInternalData(elt).boosted) { + headers["HX-Boosted"] = "true"; + } + return headers; + } + + /** + * filterValues takes an object containing form input values + * and returns a new object that only contains keys that are + * specified by the closest "hx-params" attribute + * @param {Object} inputValues + * @param {HTMLElement} elt + * @returns {Object} + */ + function filterValues(inputValues, elt) { + var paramsValue = getClosestAttributeValue(elt, "hx-params"); + if (paramsValue) { + if (paramsValue === "none") { + return {}; + } else if (paramsValue === "*") { + return inputValues; + } else if(paramsValue.indexOf("not ") === 0) { + forEach(paramsValue.substr(4).split(","), function (name) { + name = name.trim(); + delete inputValues[name]; + }); + return inputValues; + } else { + var newValues = {} + forEach(paramsValue.split(","), function (name) { + name = name.trim(); + newValues[name] = inputValues[name]; + }); + return newValues; + } + } else { + return inputValues; + } + } + + function isAnchorLink(elt) { + return getRawAttribute(elt, 'href') && getRawAttribute(elt, 'href').indexOf("#") >=0 + } + + /** + * + * @param {HTMLElement} elt + * @param {string} swapInfoOverride + * @returns {import("./htmx").HtmxSwapSpecification} + */ + function getSwapSpecification(elt, swapInfoOverride) { + var swapInfo = swapInfoOverride ? swapInfoOverride : getClosestAttributeValue(elt, "hx-swap"); + var swapSpec = { + "swapStyle" : getInternalData(elt).boosted ? 'innerHTML' : htmx.config.defaultSwapStyle, + "swapDelay" : htmx.config.defaultSwapDelay, + "settleDelay" : htmx.config.defaultSettleDelay + } + if (htmx.config.scrollIntoViewOnBoost && getInternalData(elt).boosted && !isAnchorLink(elt)) { + swapSpec["show"] = "top" + } + if (swapInfo) { + var split = splitOnWhitespace(swapInfo); + if (split.length > 0) { + for (var i = 0; i < split.length; i++) { + var value = split[i]; + if (value.indexOf("swap:") === 0) { + swapSpec["swapDelay"] = parseInterval(value.substr(5)); + } else if (value.indexOf("settle:") === 0) { + swapSpec["settleDelay"] = parseInterval(value.substr(7)); + } else if (value.indexOf("transition:") === 0) { + swapSpec["transition"] = value.substr(11) === "true"; + } else if (value.indexOf("ignoreTitle:") === 0) { + swapSpec["ignoreTitle"] = value.substr(12) === "true"; + } else if (value.indexOf("scroll:") === 0) { + var scrollSpec = value.substr(7); + var splitSpec = scrollSpec.split(":"); + var scrollVal = splitSpec.pop(); + var selectorVal = splitSpec.length > 0 ? splitSpec.join(":") : null; + swapSpec["scroll"] = scrollVal; + swapSpec["scrollTarget"] = selectorVal; + } else if (value.indexOf("show:") === 0) { + var showSpec = value.substr(5); + var splitSpec = showSpec.split(":"); + var showVal = splitSpec.pop(); + var selectorVal = splitSpec.length > 0 ? splitSpec.join(":") : null; + swapSpec["show"] = showVal; + swapSpec["showTarget"] = selectorVal; + } else if (value.indexOf("focus-scroll:") === 0) { + var focusScrollVal = value.substr("focus-scroll:".length); + swapSpec["focusScroll"] = focusScrollVal == "true"; + } else if (i == 0) { + swapSpec["swapStyle"] = value; + } else { + logError('Unknown modifier in hx-swap: ' + value); + } + } + } + } + return swapSpec; + } + + function usesFormData(elt) { + return getClosestAttributeValue(elt, "hx-encoding") === "multipart/form-data" || + (matches(elt, "form") && getRawAttribute(elt, 'enctype') === "multipart/form-data"); + } + + function encodeParamsForBody(xhr, elt, filteredParameters) { + var encodedParameters = null; + withExtensions(elt, function (extension) { + if (encodedParameters == null) { + encodedParameters = extension.encodeParameters(xhr, filteredParameters, elt); + } + }); + if (encodedParameters != null) { + return encodedParameters; + } else { + if (usesFormData(elt)) { + return makeFormData(filteredParameters); + } else { + return urlEncode(filteredParameters); + } + } + } + + /** + * + * @param {Element} target + * @returns {import("./htmx").HtmxSettleInfo} + */ + function makeSettleInfo(target) { + return {tasks: [], elts: [target]}; + } + + function updateScrollState(content, swapSpec) { + var first = content[0]; + var last = content[content.length - 1]; + if (swapSpec.scroll) { + var target = null; + if (swapSpec.scrollTarget) { + target = querySelectorExt(first, swapSpec.scrollTarget); + } + if (swapSpec.scroll === "top" && (first || target)) { + target = target || first; + target.scrollTop = 0; + } + if (swapSpec.scroll === "bottom" && (last || target)) { + target = target || last; + target.scrollTop = target.scrollHeight; + } + } + if (swapSpec.show) { + var target = null; + if (swapSpec.showTarget) { + var targetStr = swapSpec.showTarget; + if (swapSpec.showTarget === "window") { + targetStr = "body"; + } + target = querySelectorExt(first, targetStr); + } + if (swapSpec.show === "top" && (first || target)) { + target = target || first; + target.scrollIntoView({block:'start', behavior: htmx.config.scrollBehavior}); + } + if (swapSpec.show === "bottom" && (last || target)) { + target = target || last; + target.scrollIntoView({block:'end', behavior: htmx.config.scrollBehavior}); + } + } + } + + /** + * @param {HTMLElement} elt + * @param {string} attr + * @param {boolean=} evalAsDefault + * @param {Object=} values + * @returns {Object} + */ + function getValuesForElement(elt, attr, evalAsDefault, values) { + if (values == null) { + values = {}; + } + if (elt == null) { + return values; + } + var attributeValue = getAttributeValue(elt, attr); + if (attributeValue) { + var str = attributeValue.trim(); + var evaluateValue = evalAsDefault; + if (str === "unset") { + return null; + } + if (str.indexOf("javascript:") === 0) { + str = str.substr(11); + evaluateValue = true; + } else if (str.indexOf("js:") === 0) { + str = str.substr(3); + evaluateValue = true; + } + if (str.indexOf('{') !== 0) { + str = "{" + str + "}"; + } + var varsValues; + if (evaluateValue) { + varsValues = maybeEval(elt,function () {return Function("return (" + str + ")")();}, {}); + } else { + varsValues = parseJSON(str); + } + for (var key in varsValues) { + if (varsValues.hasOwnProperty(key)) { + if (values[key] == null) { + values[key] = varsValues[key]; + } + } + } + } + return getValuesForElement(parentElt(elt), attr, evalAsDefault, values); + } + + function maybeEval(elt, toEval, defaultVal) { + if (htmx.config.allowEval) { + return toEval(); + } else { + triggerErrorEvent(elt, 'htmx:evalDisallowedError'); + return defaultVal; + } + } + + /** + * @param {HTMLElement} elt + * @param {*} expressionVars + * @returns + */ + function getHXVarsForElement(elt, expressionVars) { + return getValuesForElement(elt, "hx-vars", true, expressionVars); + } + + /** + * @param {HTMLElement} elt + * @param {*} expressionVars + * @returns + */ + function getHXValsForElement(elt, expressionVars) { + return getValuesForElement(elt, "hx-vals", false, expressionVars); + } + + /** + * @param {HTMLElement} elt + * @returns {Object} + */ + function getExpressionVars(elt) { + return mergeObjects(getHXVarsForElement(elt), getHXValsForElement(elt)); + } + + function safelySetHeaderValue(xhr, header, headerValue) { + if (headerValue !== null) { + try { + xhr.setRequestHeader(header, headerValue); + } catch (e) { + // On an exception, try to set the header URI encoded instead + xhr.setRequestHeader(header, encodeURIComponent(headerValue)); + xhr.setRequestHeader(header + "-URI-AutoEncoded", "true"); + } + } + } + + function getPathFromResponse(xhr) { + // NB: IE11 does not support this stuff + if (xhr.responseURL && typeof(URL) !== "undefined") { + try { + var url = new URL(xhr.responseURL); + return url.pathname + url.search; + } catch (e) { + triggerErrorEvent(getDocument().body, "htmx:badResponseUrl", {url: xhr.responseURL}); + } + } + } + + function hasHeader(xhr, regexp) { + return regexp.test(xhr.getAllResponseHeaders()) + } + + function ajaxHelper(verb, path, context) { + verb = verb.toLowerCase(); + if (context) { + if (context instanceof Element || isType(context, 'String')) { + return issueAjaxRequest(verb, path, null, null, { + targetOverride: resolveTarget(context), + returnPromise: true + }); + } else { + return issueAjaxRequest(verb, path, resolveTarget(context.source), context.event, + { + handler : context.handler, + headers : context.headers, + values : context.values, + targetOverride: resolveTarget(context.target), + swapOverride: context.swap, + select: context.select, + returnPromise: true + }); + } + } else { + return issueAjaxRequest(verb, path, null, null, { + returnPromise: true + }); + } + } + + function hierarchyForElt(elt) { + var arr = []; + while (elt) { + arr.push(elt); + elt = elt.parentElement; + } + return arr; + } + + function verifyPath(elt, path, requestConfig) { + var sameHost + var url + if (typeof URL === "function") { + url = new URL(path, document.location.href); + var origin = document.location.origin; + sameHost = origin === url.origin; + } else { + // IE11 doesn't support URL + url = path + sameHost = startsWith(path, document.location.origin) + } + + if (htmx.config.selfRequestsOnly) { + if (!sameHost) { + return false; + } + } + return triggerEvent(elt, "htmx:validateUrl", mergeObjects({url: url, sameHost: sameHost}, requestConfig)); + } + + function issueAjaxRequest(verb, path, elt, event, etc, confirmed) { + var resolve = null; + var reject = null; + etc = etc != null ? etc : {}; + if(etc.returnPromise && typeof Promise !== "undefined"){ + var promise = new Promise(function (_resolve, _reject) { + resolve = _resolve; + reject = _reject; + }); + } + if(elt == null) { + elt = getDocument().body; + } + var responseHandler = etc.handler || handleAjaxResponse; + var select = etc.select || null; + + if (!bodyContains(elt)) { + // do not issue requests for elements removed from the DOM + maybeCall(resolve); + return promise; + } + var target = etc.targetOverride || getTarget(elt); + if (target == null || target == DUMMY_ELT) { + triggerErrorEvent(elt, 'htmx:targetError', {target: getAttributeValue(elt, "hx-target")}); + maybeCall(reject); + return promise; + } + + var eltData = getInternalData(elt); + var submitter = eltData.lastButtonClicked; + + if (submitter) { + var buttonPath = getRawAttribute(submitter, "formaction"); + if (buttonPath != null) { + path = buttonPath; + } + + var buttonVerb = getRawAttribute(submitter, "formmethod") + if (buttonVerb != null) { + // ignore buttons with formmethod="dialog" + if (buttonVerb.toLowerCase() !== "dialog") { + verb = buttonVerb; + } + } + } + + var confirmQuestion = getClosestAttributeValue(elt, "hx-confirm"); + // allow event-based confirmation w/ a callback + if (confirmed === undefined) { + var issueRequest = function(skipConfirmation) { + return issueAjaxRequest(verb, path, elt, event, etc, !!skipConfirmation); + } + var confirmDetails = {target: target, elt: elt, path: path, verb: verb, triggeringEvent: event, etc: etc, issueRequest: issueRequest, question: confirmQuestion}; + if (triggerEvent(elt, 'htmx:confirm', confirmDetails) === false) { + maybeCall(resolve); + return promise; + } + } + + var syncElt = elt; + var syncStrategy = getClosestAttributeValue(elt, "hx-sync"); + var queueStrategy = null; + var abortable = false; + if (syncStrategy) { + var syncStrings = syncStrategy.split(":"); + var selector = syncStrings[0].trim(); + if (selector === "this") { + syncElt = findThisElement(elt, 'hx-sync'); + } else { + syncElt = querySelectorExt(elt, selector); + } + // default to the drop strategy + syncStrategy = (syncStrings[1] || 'drop').trim(); + eltData = getInternalData(syncElt); + if (syncStrategy === "drop" && eltData.xhr && eltData.abortable !== true) { + maybeCall(resolve); + return promise; + } else if (syncStrategy === "abort") { + if (eltData.xhr) { + maybeCall(resolve); + return promise; + } else { + abortable = true; + } + } else if (syncStrategy === "replace") { + triggerEvent(syncElt, 'htmx:abort'); // abort the current request and continue + } else if (syncStrategy.indexOf("queue") === 0) { + var queueStrArray = syncStrategy.split(" "); + queueStrategy = (queueStrArray[1] || "last").trim(); + } + } + + if (eltData.xhr) { + if (eltData.abortable) { + triggerEvent(syncElt, 'htmx:abort'); // abort the current request and continue + } else { + if(queueStrategy == null){ + if (event) { + var eventData = getInternalData(event); + if (eventData && eventData.triggerSpec && eventData.triggerSpec.queue) { + queueStrategy = eventData.triggerSpec.queue; + } + } + if (queueStrategy == null) { + queueStrategy = "last"; + } + } + if (eltData.queuedRequests == null) { + eltData.queuedRequests = []; + } + if (queueStrategy === "first" && eltData.queuedRequests.length === 0) { + eltData.queuedRequests.push(function () { + issueAjaxRequest(verb, path, elt, event, etc) + }); + } else if (queueStrategy === "all") { + eltData.queuedRequests.push(function () { + issueAjaxRequest(verb, path, elt, event, etc) + }); + } else if (queueStrategy === "last") { + eltData.queuedRequests = []; // dump existing queue + eltData.queuedRequests.push(function () { + issueAjaxRequest(verb, path, elt, event, etc) + }); + } + maybeCall(resolve); + return promise; + } + } + + var xhr = new XMLHttpRequest(); + eltData.xhr = xhr; + eltData.abortable = abortable; + var endRequestLock = function(){ + eltData.xhr = null; + eltData.abortable = false; + if (eltData.queuedRequests != null && + eltData.queuedRequests.length > 0) { + var queuedRequest = eltData.queuedRequests.shift(); + queuedRequest(); + } + } + var promptQuestion = getClosestAttributeValue(elt, "hx-prompt"); + if (promptQuestion) { + var promptResponse = prompt(promptQuestion); + // prompt returns null if cancelled and empty string if accepted with no entry + if (promptResponse === null || + !triggerEvent(elt, 'htmx:prompt', {prompt: promptResponse, target:target})) { + maybeCall(resolve); + endRequestLock(); + return promise; + } + } + + if (confirmQuestion && !confirmed) { + if(!confirm(confirmQuestion)) { + maybeCall(resolve); + endRequestLock() + return promise; + } + } + + + var headers = getHeaders(elt, target, promptResponse); + + if (verb !== 'get' && !usesFormData(elt)) { + headers['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + if (etc.headers) { + headers = mergeObjects(headers, etc.headers); + } + var results = getInputValues(elt, verb); + var errors = results.errors; + var rawParameters = results.values; + if (etc.values) { + rawParameters = mergeObjects(rawParameters, etc.values); + } + var expressionVars = getExpressionVars(elt); + var allParameters = mergeObjects(rawParameters, expressionVars); + var filteredParameters = filterValues(allParameters, elt); + + if (htmx.config.getCacheBusterParam && verb === 'get') { + filteredParameters['org.htmx.cache-buster'] = getRawAttribute(target, "id") || "true"; + } + + // behavior of anchors w/ empty href is to use the current URL + if (path == null || path === "") { + path = getDocument().location.href; + } + + + var requestAttrValues = getValuesForElement(elt, 'hx-request'); + + var eltIsBoosted = getInternalData(elt).boosted; + + var useUrlParams = htmx.config.methodsThatUseUrlParams.indexOf(verb) >= 0 + + var requestConfig = { + boosted: eltIsBoosted, + useUrlParams: useUrlParams, + parameters: filteredParameters, + unfilteredParameters: allParameters, + headers:headers, + target:target, + verb:verb, + errors:errors, + withCredentials: etc.credentials || requestAttrValues.credentials || htmx.config.withCredentials, + timeout: etc.timeout || requestAttrValues.timeout || htmx.config.timeout, + path:path, + triggeringEvent:event + }; + + if(!triggerEvent(elt, 'htmx:configRequest', requestConfig)){ + maybeCall(resolve); + endRequestLock(); + return promise; + } + + // copy out in case the object was overwritten + path = requestConfig.path; + verb = requestConfig.verb; + headers = requestConfig.headers; + filteredParameters = requestConfig.parameters; + errors = requestConfig.errors; + useUrlParams = requestConfig.useUrlParams; + + if(errors && errors.length > 0){ + triggerEvent(elt, 'htmx:validation:halted', requestConfig) + maybeCall(resolve); + endRequestLock(); + return promise; + } + + var splitPath = path.split("#"); + var pathNoAnchor = splitPath[0]; + var anchor = splitPath[1]; + + var finalPath = path + if (useUrlParams) { + finalPath = pathNoAnchor; + var values = Object.keys(filteredParameters).length !== 0; + if (values) { + if (finalPath.indexOf("?") < 0) { + finalPath += "?"; + } else { + finalPath += "&"; + } + finalPath += urlEncode(filteredParameters); + if (anchor) { + finalPath += "#" + anchor; + } + } + } + + if (!verifyPath(elt, finalPath, requestConfig)) { + triggerErrorEvent(elt, 'htmx:invalidPath', requestConfig) + maybeCall(reject); + return promise; + }; + + xhr.open(verb.toUpperCase(), finalPath, true); + xhr.overrideMimeType("text/html"); + xhr.withCredentials = requestConfig.withCredentials; + xhr.timeout = requestConfig.timeout; + + // request headers + if (requestAttrValues.noHeaders) { + // ignore all headers + } else { + for (var header in headers) { + if (headers.hasOwnProperty(header)) { + var headerValue = headers[header]; + safelySetHeaderValue(xhr, header, headerValue); + } + } + } + + var responseInfo = { + xhr: xhr, target: target, requestConfig: requestConfig, etc: etc, boosted: eltIsBoosted, select: select, + pathInfo: { + requestPath: path, + finalRequestPath: finalPath, + anchor: anchor + } + }; + + xhr.onload = function () { + try { + var hierarchy = hierarchyForElt(elt); + responseInfo.pathInfo.responsePath = getPathFromResponse(xhr); + responseHandler(elt, responseInfo); + removeRequestIndicators(indicators, disableElts); + triggerEvent(elt, 'htmx:afterRequest', responseInfo); + triggerEvent(elt, 'htmx:afterOnLoad', responseInfo); + // if the body no longer contains the element, trigger the event on the closest parent + // remaining in the DOM + if (!bodyContains(elt)) { + var secondaryTriggerElt = null; + while (hierarchy.length > 0 && secondaryTriggerElt == null) { + var parentEltInHierarchy = hierarchy.shift(); + if (bodyContains(parentEltInHierarchy)) { + secondaryTriggerElt = parentEltInHierarchy; + } + } + if (secondaryTriggerElt) { + triggerEvent(secondaryTriggerElt, 'htmx:afterRequest', responseInfo); + triggerEvent(secondaryTriggerElt, 'htmx:afterOnLoad', responseInfo); + } + } + maybeCall(resolve); + endRequestLock(); + } catch (e) { + triggerErrorEvent(elt, 'htmx:onLoadError', mergeObjects({error:e}, responseInfo)); + throw e; + } + } + xhr.onerror = function () { + removeRequestIndicators(indicators, disableElts); + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); + triggerErrorEvent(elt, 'htmx:sendError', responseInfo); + maybeCall(reject); + endRequestLock(); + } + xhr.onabort = function() { + removeRequestIndicators(indicators, disableElts); + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); + triggerErrorEvent(elt, 'htmx:sendAbort', responseInfo); + maybeCall(reject); + endRequestLock(); + } + xhr.ontimeout = function() { + removeRequestIndicators(indicators, disableElts); + triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo); + triggerErrorEvent(elt, 'htmx:timeout', responseInfo); + maybeCall(reject); + endRequestLock(); + } + if(!triggerEvent(elt, 'htmx:beforeRequest', responseInfo)){ + maybeCall(resolve); + endRequestLock() + return promise + } + var indicators = addRequestIndicatorClasses(elt); + var disableElts = disableElements(elt); + + forEach(['loadstart', 'loadend', 'progress', 'abort'], function(eventName) { + forEach([xhr, xhr.upload], function (target) { + target.addEventListener(eventName, function(event){ + triggerEvent(elt, "htmx:xhr:" + eventName, { + lengthComputable:event.lengthComputable, + loaded:event.loaded, + total:event.total + }); + }) + }); + }); + triggerEvent(elt, 'htmx:beforeSend', responseInfo); + var params = useUrlParams ? null : encodeParamsForBody(xhr, elt, filteredParameters) + xhr.send(params); + return promise; + } + + function determineHistoryUpdates(elt, responseInfo) { + + var xhr = responseInfo.xhr; + + //=========================================== + // First consult response headers + //=========================================== + var pathFromHeaders = null; + var typeFromHeaders = null; + if (hasHeader(xhr,/HX-Push:/i)) { + pathFromHeaders = xhr.getResponseHeader("HX-Push"); + typeFromHeaders = "push"; + } else if (hasHeader(xhr,/HX-Push-Url:/i)) { + pathFromHeaders = xhr.getResponseHeader("HX-Push-Url"); + typeFromHeaders = "push"; + } else if (hasHeader(xhr,/HX-Replace-Url:/i)) { + pathFromHeaders = xhr.getResponseHeader("HX-Replace-Url"); + typeFromHeaders = "replace"; + } + + // if there was a response header, that has priority + if (pathFromHeaders) { + if (pathFromHeaders === "false") { + return {} + } else { + return { + type: typeFromHeaders, + path : pathFromHeaders + } + } + } + + //=========================================== + // Next resolve via DOM values + //=========================================== + var requestPath = responseInfo.pathInfo.finalRequestPath; + var responsePath = responseInfo.pathInfo.responsePath; + + var pushUrl = getClosestAttributeValue(elt, "hx-push-url"); + var replaceUrl = getClosestAttributeValue(elt, "hx-replace-url"); + var elementIsBoosted = getInternalData(elt).boosted; + + var saveType = null; + var path = null; + + if (pushUrl) { + saveType = "push"; + path = pushUrl; + } else if (replaceUrl) { + saveType = "replace"; + path = replaceUrl; + } else if (elementIsBoosted) { + saveType = "push"; + path = responsePath || requestPath; // if there is no response path, go with the original request path + } + + if (path) { + // false indicates no push, return empty object + if (path === "false") { + return {}; + } + + // true indicates we want to follow wherever the server ended up sending us + if (path === "true") { + path = responsePath || requestPath; // if there is no response path, go with the original request path + } + + // restore any anchor associated with the request + if (responseInfo.pathInfo.anchor && + path.indexOf("#") === -1) { + path = path + "#" + responseInfo.pathInfo.anchor; + } + + return { + type:saveType, + path: path + } + } else { + return {}; + } + } + + function handleAjaxResponse(elt, responseInfo) { + var xhr = responseInfo.xhr; + var target = responseInfo.target; + var etc = responseInfo.etc; + var requestConfig = responseInfo.requestConfig; + var select = responseInfo.select; + + if (!triggerEvent(elt, 'htmx:beforeOnLoad', responseInfo)) return; + + if (hasHeader(xhr, /HX-Trigger:/i)) { + handleTrigger(xhr, "HX-Trigger", elt); + } + + if (hasHeader(xhr, /HX-Location:/i)) { + saveCurrentPageToHistory(); + var redirectPath = xhr.getResponseHeader("HX-Location"); + var swapSpec; + if (redirectPath.indexOf("{") === 0) { + swapSpec = parseJSON(redirectPath); + // what's the best way to throw an error if the user didn't include this + redirectPath = swapSpec['path']; + delete swapSpec['path']; + } + ajaxHelper('GET', redirectPath, swapSpec).then(function(){ + pushUrlIntoHistory(redirectPath); + }); + return; + } + + var shouldRefresh = hasHeader(xhr, /HX-Refresh:/i) && "true" === xhr.getResponseHeader("HX-Refresh"); + + if (hasHeader(xhr, /HX-Redirect:/i)) { + location.href = xhr.getResponseHeader("HX-Redirect"); + shouldRefresh && location.reload(); + return; + } + + if (shouldRefresh) { + location.reload(); + return; + } + + if (hasHeader(xhr,/HX-Retarget:/i)) { + if (xhr.getResponseHeader("HX-Retarget") === "this") { + responseInfo.target = elt; + } else { + responseInfo.target = querySelectorExt(elt, xhr.getResponseHeader("HX-Retarget")); + } + } + + var historyUpdate = determineHistoryUpdates(elt, responseInfo); + + // by default htmx only swaps on 200 return codes and does not swap + // on 204 'No Content' + // this can be ovverriden by responding to the htmx:beforeSwap event and + // overriding the detail.shouldSwap property + var shouldSwap = xhr.status >= 200 && xhr.status < 400 && xhr.status !== 204; + var serverResponse = xhr.response; + var isError = xhr.status >= 400; + var ignoreTitle = htmx.config.ignoreTitle + var beforeSwapDetails = mergeObjects({shouldSwap: shouldSwap, serverResponse:serverResponse, isError:isError, ignoreTitle:ignoreTitle }, responseInfo); + if (!triggerEvent(target, 'htmx:beforeSwap', beforeSwapDetails)) return; + + target = beforeSwapDetails.target; // allow re-targeting + serverResponse = beforeSwapDetails.serverResponse; // allow updating content + isError = beforeSwapDetails.isError; // allow updating error + ignoreTitle = beforeSwapDetails.ignoreTitle; // allow updating ignoring title + + responseInfo.target = target; // Make updated target available to response events + responseInfo.failed = isError; // Make failed property available to response events + responseInfo.successful = !isError; // Make successful property available to response events + + if (beforeSwapDetails.shouldSwap) { + if (xhr.status === 286) { + cancelPolling(elt); + } + + withExtensions(elt, function (extension) { + serverResponse = extension.transformResponse(serverResponse, xhr, elt); + }); + + // Save current page if there will be a history update + if (historyUpdate.type) { + saveCurrentPageToHistory(); + } + + var swapOverride = etc.swapOverride; + if (hasHeader(xhr,/HX-Reswap:/i)) { + swapOverride = xhr.getResponseHeader("HX-Reswap"); + } + var swapSpec = getSwapSpecification(elt, swapOverride); + + if (swapSpec.hasOwnProperty('ignoreTitle')) { + ignoreTitle = swapSpec.ignoreTitle; + } + + target.classList.add(htmx.config.swappingClass); + + // optional transition API promise callbacks + var settleResolve = null; + var settleReject = null; + + var doSwap = function () { + try { + var activeElt = document.activeElement; + var selectionInfo = {}; + try { + selectionInfo = { + elt: activeElt, + // @ts-ignore + start: activeElt ? activeElt.selectionStart : null, + // @ts-ignore + end: activeElt ? activeElt.selectionEnd : null + }; + } catch (e) { + // safari issue - see https://github.com/microsoft/playwright/issues/5894 + } + + var selectOverride; + if (select) { + selectOverride = select; + } + + if (hasHeader(xhr, /HX-Reselect:/i)) { + selectOverride = xhr.getResponseHeader("HX-Reselect"); + } + + // if we need to save history, do so, before swapping so that relative resources have the correct base URL + if (historyUpdate.type) { + triggerEvent(getDocument().body, 'htmx:beforeHistoryUpdate', mergeObjects({ history: historyUpdate }, responseInfo)); + if (historyUpdate.type === "push") { + pushUrlIntoHistory(historyUpdate.path); + triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path: historyUpdate.path}); + } else { + replaceUrlInHistory(historyUpdate.path); + triggerEvent(getDocument().body, 'htmx:replacedInHistory', {path: historyUpdate.path}); + } + } + + var settleInfo = makeSettleInfo(target); + selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo, selectOverride); + + if (selectionInfo.elt && + !bodyContains(selectionInfo.elt) && + getRawAttribute(selectionInfo.elt, "id")) { + var newActiveElt = document.getElementById(getRawAttribute(selectionInfo.elt, "id")); + var focusOptions = { preventScroll: swapSpec.focusScroll !== undefined ? !swapSpec.focusScroll : !htmx.config.defaultFocusScroll }; + if (newActiveElt) { + // @ts-ignore + if (selectionInfo.start && newActiveElt.setSelectionRange) { + // @ts-ignore + try { + newActiveElt.setSelectionRange(selectionInfo.start, selectionInfo.end); + } catch (e) { + // the setSelectionRange method is present on fields that don't support it, so just let this fail + } + } + newActiveElt.focus(focusOptions); + } + } + + target.classList.remove(htmx.config.swappingClass); + forEach(settleInfo.elts, function (elt) { + if (elt.classList) { + elt.classList.add(htmx.config.settlingClass); + } + triggerEvent(elt, 'htmx:afterSwap', responseInfo); + }); + + if (hasHeader(xhr, /HX-Trigger-After-Swap:/i)) { + var finalElt = elt; + if (!bodyContains(elt)) { + finalElt = getDocument().body; + } + handleTrigger(xhr, "HX-Trigger-After-Swap", finalElt); + } + + var doSettle = function () { + forEach(settleInfo.tasks, function (task) { + task.call(); + }); + forEach(settleInfo.elts, function (elt) { + if (elt.classList) { + elt.classList.remove(htmx.config.settlingClass); + } + triggerEvent(elt, 'htmx:afterSettle', responseInfo); + }); + + if (responseInfo.pathInfo.anchor) { + var anchorTarget = getDocument().getElementById(responseInfo.pathInfo.anchor); + if(anchorTarget) { + anchorTarget.scrollIntoView({block:'start', behavior: "auto"}); + } + } + + if(settleInfo.title && !ignoreTitle) { + var titleElt = find("title"); + if(titleElt) { + titleElt.innerHTML = settleInfo.title; + } else { + window.document.title = settleInfo.title; + } + } + + updateScrollState(settleInfo.elts, swapSpec); + + if (hasHeader(xhr, /HX-Trigger-After-Settle:/i)) { + var finalElt = elt; + if (!bodyContains(elt)) { + finalElt = getDocument().body; + } + handleTrigger(xhr, "HX-Trigger-After-Settle", finalElt); + } + maybeCall(settleResolve); + } + + if (swapSpec.settleDelay > 0) { + setTimeout(doSettle, swapSpec.settleDelay) + } else { + doSettle(); + } + } catch (e) { + triggerErrorEvent(elt, 'htmx:swapError', responseInfo); + maybeCall(settleReject); + throw e; + } + }; + + var shouldTransition = htmx.config.globalViewTransitions + if(swapSpec.hasOwnProperty('transition')){ + shouldTransition = swapSpec.transition; + } + + if(shouldTransition && + triggerEvent(elt, 'htmx:beforeTransition', responseInfo) && + typeof Promise !== "undefined" && document.startViewTransition){ + var settlePromise = new Promise(function (_resolve, _reject) { + settleResolve = _resolve; + settleReject = _reject; + }); + // wrap the original doSwap() in a call to startViewTransition() + var innerDoSwap = doSwap; + doSwap = function() { + document.startViewTransition(function () { + innerDoSwap(); + return settlePromise; + }); + } + } + + + if (swapSpec.swapDelay > 0) { + setTimeout(doSwap, swapSpec.swapDelay) + } else { + doSwap(); + } + } + if (isError) { + triggerErrorEvent(elt, 'htmx:responseError', mergeObjects({error: "Response Status Error Code " + xhr.status + " from " + responseInfo.pathInfo.requestPath}, responseInfo)); + } + } + + //==================================================================== + // Extensions API + //==================================================================== + + /** @type {Object} */ + var extensions = {}; + + /** + * extensionBase defines the default functions for all extensions. + * @returns {import("./htmx").HtmxExtension} + */ + function extensionBase() { + return { + init: function(api) {return null;}, + onEvent : function(name, evt) {return true;}, + transformResponse : function(text, xhr, elt) {return text;}, + isInlineSwap : function(swapStyle) {return false;}, + handleSwap : function(swapStyle, target, fragment, settleInfo) {return false;}, + encodeParameters : function(xhr, parameters, elt) {return null;} + } + } + + /** + * defineExtension initializes the extension and adds it to the htmx registry + * + * @param {string} name + * @param {import("./htmx").HtmxExtension} extension + */ + function defineExtension(name, extension) { + if(extension.init) { + extension.init(internalAPI) + } + extensions[name] = mergeObjects(extensionBase(), extension); + } + + /** + * removeExtension removes an extension from the htmx registry + * + * @param {string} name + */ + function removeExtension(name) { + delete extensions[name]; + } + + /** + * getExtensions searches up the DOM tree to return all extensions that can be applied to a given element + * + * @param {HTMLElement} elt + * @param {import("./htmx").HtmxExtension[]=} extensionsToReturn + * @param {import("./htmx").HtmxExtension[]=} extensionsToIgnore + */ + function getExtensions(elt, extensionsToReturn, extensionsToIgnore) { + + if (elt == undefined) { + return extensionsToReturn; + } + if (extensionsToReturn == undefined) { + extensionsToReturn = []; + } + if (extensionsToIgnore == undefined) { + extensionsToIgnore = []; + } + var extensionsForElement = getAttributeValue(elt, "hx-ext"); + if (extensionsForElement) { + forEach(extensionsForElement.split(","), function(extensionName){ + extensionName = extensionName.replace(/ /g, ''); + if (extensionName.slice(0, 7) == "ignore:") { + extensionsToIgnore.push(extensionName.slice(7)); + return; + } + if (extensionsToIgnore.indexOf(extensionName) < 0) { + var extension = extensions[extensionName]; + if (extension && extensionsToReturn.indexOf(extension) < 0) { + extensionsToReturn.push(extension); + } + } + }); + } + return getExtensions(parentElt(elt), extensionsToReturn, extensionsToIgnore); + } + + //==================================================================== + // Initialization + //==================================================================== + var isReady = false + getDocument().addEventListener('DOMContentLoaded', function() { + isReady = true + }) + + /** + * Execute a function now if DOMContentLoaded has fired, otherwise listen for it. + * + * This function uses isReady because there is no realiable way to ask the browswer whether + * the DOMContentLoaded event has already been fired; there's a gap between DOMContentLoaded + * firing and readystate=complete. + */ + function ready(fn) { + // Checking readyState here is a failsafe in case the htmx script tag entered the DOM by + // some means other than the initial page load. + if (isReady || getDocument().readyState === 'complete') { + fn(); + } else { + getDocument().addEventListener('DOMContentLoaded', fn); + } + } + + function insertIndicatorStyles() { + if (htmx.config.includeIndicatorStyles !== false) { + getDocument().head.insertAdjacentHTML("beforeend", + ""); + } + } + + function getMetaConfig() { + var element = getDocument().querySelector('meta[name="htmx-config"]'); + if (element) { + // @ts-ignore + return parseJSON(element.content); + } else { + return null; + } + } + + function mergeMetaConfig() { + var metaConfig = getMetaConfig(); + if (metaConfig) { + htmx.config = mergeObjects(htmx.config , metaConfig) + } + } + + // initialize the document + ready(function () { + mergeMetaConfig(); + insertIndicatorStyles(); + var body = getDocument().body; + processNode(body); + var restoredElts = getDocument().querySelectorAll( + "[hx-trigger='restored'],[data-hx-trigger='restored']" + ); + body.addEventListener("htmx:abort", function (evt) { + var target = evt.target; + var internalData = getInternalData(target); + if (internalData && internalData.xhr) { + internalData.xhr.abort(); + } + }); + /** @type {(ev: PopStateEvent) => any} */ + const originalPopstate = window.onpopstate ? window.onpopstate.bind(window) : null; + /** @type {(ev: PopStateEvent) => any} */ + window.onpopstate = function (event) { + if (event.state && event.state.htmx) { + restoreHistory(); + forEach(restoredElts, function(elt){ + triggerEvent(elt, 'htmx:restored', { + 'document': getDocument(), + 'triggerEvent': triggerEvent + }); + }); + } else { + if (originalPopstate) { + originalPopstate(event); + } + } + }; + setTimeout(function () { + triggerEvent(body, 'htmx:load', {}); // give ready handlers a chance to load up before firing this event + body = null; // kill reference for gc + }, 0); + }) + + return htmx; + } +)() +})); diff --git a/visualizer/public/vendor/htmx/htmx.min.js b/visualizer/public/vendor/htmx/htmx.min.js new file mode 100644 index 0000000..cf27e8f --- /dev/null +++ b/visualizer/public/vendor/htmx/htmx.min.js @@ -0,0 +1 @@ +(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var Q={onLoad:j,process:Wt,on:me,off:pe,trigger:ce,ajax:kr,find:C,findAll:f,closest:v,values:function(e,t){var r=mr(e,t||"post");return r.values},remove:$,addClass:W,removeClass:n,toggleClass:G,takeClass:J,defineExtension:Fr,removeExtension:Vr,logAll:_,logNone:z,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get"],selfRequestsOnly:false,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=Q.config.wsBinaryType;return t},version:"1.9.10"};var r={addTriggerHandler:Nt,bodyContains:se,canAccessLocalStorage:F,findThisElement:be,filterValues:wr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Ar,getHeaders:br,getInputValues:mr,getInternalData:ae,getSwapSpecification:Er,getTriggerSpecs:ot,getTarget:we,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Re,querySelectorExt:ue,selectAndSwap:ze,settleImmediately:ar,shouldCancel:ct,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R};var w=["g","circle","rect"];var S=["get","post","put","delete","patch"];var i=S.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");var q=e("head"),H=e("title"),L=e("svg",true);function e(e,t=false){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function d(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){return e.parentElement}function re(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function A(e,t,r){var n=te(t,r);var i=te(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function ne(t,r){var n=null;c(t,function(e){return n=A(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function N(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function a(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=re().createDocumentFragment()}return i}function I(e){return a(''+e+"",1)}function k(e){return/",0);return i.querySelector("template").content}switch(r){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return a(""+n+"
",1);case"col":return a(""+n+"
",2);case"tr":return a(""+n+"
",2);case"td":case"th":return a(""+n+"
",3);case"script":case"style":return a("
"+n+"
",1);default:return w.indexOf(r)!==-1?I(n):a(n,0)}}function ie(e){if(e){e()}}function P(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function M(e){return P(e,"Function")}function X(e){return P(e,"Object")}function ae(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function D(e){var t=[];if(e){for(var r=0;r=0}function se(e){if(e.getRootNode&&e.getRootNode()instanceof window.ShadowRoot){return re().body.contains(e.getRootNode().host)}else{return re().body.contains(e)}}function B(e){return e.trim().split(/\s+/)}function le(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function E(e){try{return JSON.parse(e)}catch(e){b(e);return null}}function F(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function V(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\/$/.test(t)){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function t(e){return qr(re().body,function(){return eval(e)})}function j(t){var e=Q.on("htmx:load",function(e){t(e.detail.elt)});return e}function _(){Q.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function z(){Q.logger=null}function C(e,t){if(t){return e.querySelector(t)}else{return C(re(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(re(),e)}}function $(e,t){e=g(e);if(t){setTimeout(function(){$(e);e=null},t)}else{e.parentElement.removeChild(e)}}function W(e,t,r){e=g(e);if(r){setTimeout(function(){W(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=g(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function G(e,t){e=g(e);e.classList.toggle(t)}function J(e,t){e=g(e);oe(e.parentElement.children,function(e){n(e,t)});W(e,t)}function v(e,t){e=g(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function s(e,t){return e.substring(0,t.length)===t}function Z(e,t){return e.substring(e.length-t.length)===t}function K(e){var t=e.trim();if(s(t,"<")&&Z(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function Y(e,t){if(t.indexOf("closest ")===0){return[v(e,K(t.substr(8)))]}else if(t.indexOf("find ")===0){return[C(e,K(t.substr(5)))]}else if(t==="next"){return[e.nextElementSibling]}else if(t.indexOf("next ")===0){return[ve(e,K(t.substr(5)))]}else if(t==="previous"){return[e.previousElementSibling]}else if(t.indexOf("previous ")===0){return[de(e,K(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else{return re().querySelectorAll(K(t))}}var ve=function(e,t){var r=re().querySelectorAll(t);for(var n=0;n=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function ue(e,t){if(t){return Y(e,t)[0]}else{return Y(re().body,e)[0]}}function g(e){if(P(e,"String")){return C(e)}else{return e}}function ge(e,t,r){if(M(t)){return{target:re().body,event:e,listener:t}}else{return{target:g(e),event:t,listener:r}}}function me(t,r,n){zr(function(){var e=ge(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=M(r);return e?r:n}function pe(t,r,n){zr(function(){var e=ge(t,r,n);e.target.removeEventListener(e.event,e.listener)});return M(r)?r:n}var xe=re().createElement("output");function ye(e,t){var r=ne(e,t);if(r){if(r==="this"){return[be(e,t)]}else{var n=Y(e,r);if(n.length===0){b('The selector "'+r+'" on '+t+" returned no matches!");return[xe]}else{return n}}}}function be(e,t){return c(e,function(e){return te(e,t)!=null})}function we(e){var t=ne(e,"hx-target");if(t){if(t==="this"){return be(e,"hx-target")}else{return ue(e,t)}}else{var r=ae(e);if(r.boosted){return re().body}else{return e}}}function Se(e){var t=Q.config.attributesToSettle;for(var r=0;r0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=re().querySelectorAll(t);if(r){oe(r,function(e){var t;var r=i.cloneNode(true);t=re().createDocumentFragment();t.appendChild(r);if(!Ce(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ce(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){je(o,e,e,t,a)}oe(a.elts,function(e){ce(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);fe(re().body,"htmx:oobErrorNoTarget",{content:i})}return e}function Te(e,t,r){var n=ne(e,"hx-select-oob");if(n){var i=n.split(",");for(var a=0;a0){var r=t.replace("'","\\'");var n=e.tagName.replace(":","\\:");var i=o.querySelector(n+"[id='"+r+"']");if(i&&i!==o){var a=e.cloneNode();Ee(e,i);s.tasks.push(function(){Ee(e,a)})}}})}function He(e){return function(){n(e,Q.config.addedClass);Wt(e);kt(e);Le(e);ce(e,"htmx:load")}}function Le(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function m(e,t,r,n){qe(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;W(i,Q.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(He(i))}}}function Ae(e,t){var r=0;while(r-1){var t=e.replace(L,"");var r=t.match(H);if(r){return r[2]}}}function ze(e,t,r,n,i,a){i.title=_e(n);var o=l(n);if(o){Te(r,o,i);o=Ve(r,o,a);Oe(o);return je(e,r,t,o,i)}}function $e(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=E(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!X(o)){o={value:o}}ce(r,a,o)}}}else{var s=n.split(",");for(var l=0;l0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=qr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){fe(re().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(tt(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function y(e,t){var r="";while(e.length>0&&!t.test(e[0])){r+=e.shift()}return r}function nt(e){var t;if(e.length>0&&Ye.test(e[0])){e.shift();t=y(e,Qe).trim();e.shift()}else{t=y(e,x)}return t}var it="input, textarea, select";function at(e,t,r){var n=[];var i=et(t);do{y(i,Ke);var a=i.length;var o=y(i,/[,\[\s]/);if(o!==""){if(o==="every"){var s={trigger:"every"};y(i,Ke);s.pollInterval=d(y(i,/[,\[\s]/));y(i,Ke);var l=rt(e,i,"event");if(l){s.eventFilter=l}n.push(s)}else if(o.indexOf("sse:")===0){n.push({trigger:"sse",sseEvent:o.substr(4)})}else{var u={trigger:o};var l=rt(e,i,"event");if(l){u.eventFilter=l}while(i.length>0&&i[0]!==","){y(i,Ke);var f=i.shift();if(f==="changed"){u.changed=true}else if(f==="once"){u.once=true}else if(f==="consume"){u.consume=true}else if(f==="delay"&&i[0]===":"){i.shift();u.delay=d(y(i,x))}else if(f==="from"&&i[0]===":"){i.shift();if(Ye.test(i[0])){var c=nt(i)}else{var c=y(i,x);if(c==="closest"||c==="find"||c==="next"||c==="previous"){i.shift();var h=nt(i);if(h.length>0){c+=" "+h}}}u.from=c}else if(f==="target"&&i[0]===":"){i.shift();u.target=nt(i)}else if(f==="throttle"&&i[0]===":"){i.shift();u.throttle=d(y(i,x))}else if(f==="queue"&&i[0]===":"){i.shift();u.queue=y(i,x)}else if(f==="root"&&i[0]===":"){i.shift();u[f]=nt(i)}else if(f==="threshold"&&i[0]===":"){i.shift();u[f]=y(i,x)}else{fe(e,"htmx:syntax:error",{token:i.shift()})}}n.push(u)}}if(i.length===a){fe(e,"htmx:syntax:error",{token:i.shift()})}y(i,Ke)}while(i[0]===","&&i.shift());if(r){r[t]=n}return n}function ot(e){var t=te(e,"hx-trigger");var r=[];if(t){var n=Q.config.triggerSpecsCache;r=n&&n[t]||at(e,t,n)}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(h(e,it)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function st(e){ae(e).cancelled=true}function lt(e,t,r){var n=ae(e);n.timeout=setTimeout(function(){if(se(e)&&n.cancelled!==true){if(!vt(r,e,Jt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}lt(e,t,r)}},r.pollInterval)}function ut(e){return location.hostname===e.hostname&&ee(e,"href")&&ee(e,"href").indexOf("#")!==0}function ft(t,r,e){if(t.tagName==="A"&&ut(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=ee(t,"href")}else{var a=ee(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=ee(t,"action")}e.forEach(function(e){dt(t,function(e,t){if(v(e,Q.config.disableSelector)){p(e);return}he(n,i,e,t)},r,e,true)})}}function ct(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&v(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function ht(e,t){return ae(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function vt(e,t,r){var n=e.eventFilter;if(n){try{return n.call(t,r)!==true}catch(e){fe(re().body,"htmx:eventFilter:error",{error:e,source:n.source});return true}}return false}function dt(a,o,e,s,l){var u=ae(a);var t;if(s.from){t=Y(a,s.from)}else{t=[a]}if(s.changed){t.forEach(function(e){var t=ae(e);t.lastValue=e.value})}oe(t,function(n){var i=function(e){if(!se(a)){n.removeEventListener(s.trigger,i);return}if(ht(a,e)){return}if(l||ct(e,a)){e.preventDefault()}if(vt(s,a,e)){return}var t=ae(e);t.triggerSpec=s;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(a)<0){t.handledFor.push(a);if(s.consume){e.stopPropagation()}if(s.target&&e.target){if(!h(e.target,s.target)){return}}if(s.once){if(u.triggeredOnce){return}else{u.triggeredOnce=true}}if(s.changed){var r=ae(n);if(r.lastValue===n.value){return}r.lastValue=n.value}if(u.delayed){clearTimeout(u.delayed)}if(u.throttle){return}if(s.throttle>0){if(!u.throttle){o(a,e);u.throttle=setTimeout(function(){u.throttle=null},s.throttle)}}else if(s.delay>0){u.delayed=setTimeout(function(){o(a,e)},s.delay)}else{ce(a,"htmx:trigger");o(a,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:s.trigger,listener:i,on:n});n.addEventListener(s.trigger,i)})}var gt=false;var mt=null;function pt(){if(!mt){mt=function(){gt=true};window.addEventListener("scroll",mt);setInterval(function(){if(gt){gt=false;oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){xt(e)})}},200)}}function xt(t){if(!o(t,"data-hx-revealed")&&U(t)){t.setAttribute("data-hx-revealed","true");var e=ae(t);if(e.initHash){ce(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ce(t,"revealed")},{once:true})}}}function yt(e,t,r){var n=B(r);for(var i=0;i=0){var t=Et(n);setTimeout(function(){bt(s,r,n+1)},t)}};t.onopen=function(e){n=0};ae(s).webSocket=t;t.addEventListener("message",function(e){if(wt(s)){return}var t=e.data;R(s,function(e){t=e.transformResponse(t,null,s)});var r=T(s);var n=l(t);var i=D(n.children);for(var a=0;a0){ce(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(ct(e,u)){e.preventDefault()}})}else{fe(u,"htmx:noWebSocketSourceError")}}function Et(e){var t=Q.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function Ct(e,t,r){var n=B(r);for(var i=0;i0){setTimeout(i,n)}else{i()}}function At(t,i,e){var a=false;oe(S,function(r){if(o(t,"hx-"+r)){var n=te(t,"hx-"+r);a=true;i.path=n;i.verb=r;e.forEach(function(e){Nt(t,e,i,function(e,t){if(v(e,Q.config.disableSelector)){p(e);return}he(r,n,e,t)})})}});return a}function Nt(n,e,t,r){if(e.sseEvent){Ot(n,r,e.sseEvent)}else if(e.trigger==="revealed"){pt();dt(n,r,t,e);xt(n)}else if(e.trigger==="intersect"){var i={};if(e.root){i.root=ue(n,e.root)}if(e.threshold){i.threshold=parseFloat(e.threshold)}var a=new IntersectionObserver(function(e){for(var t=0;t0){t.polling=true;lt(n,r,e)}else{dt(n,r,t,e)}}function It(e){if(Q.config.allowScriptTags&&(e.type==="text/javascript"||e.type==="module"||e.type==="")){var t=re().createElement("script");oe(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}var r=e.parentElement;try{r.insertBefore(t,e)}catch(e){b(e)}finally{if(e.parentElement){e.parentElement.removeChild(e)}}}}function kt(e){if(h(e,"script")){It(e)}oe(f(e,"script"),function(e){It(e)})}function Pt(e){var t=e.attributes;for(var r=0;r0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Vt(o)}for(var l in r){jt(e,l,r[l])}}}function zt(e){Ie(e);for(var t=0;tQ.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){fe(re().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function er(e){if(!F()){return null}e=V(e);var t=E(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Yt();var r=T(t);var n=_e(this.response);if(n){var i=C("title");if(i){i.innerHTML=n}else{window.document.title=n}}Fe(t,e,r);ar(r.tasks);Kt=a;ce(re().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{fe(re().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function sr(e){rr();e=e||location.pathname+location.search;var t=er(e);if(t){var r=l(t.content);var n=Yt();var i=T(n);Fe(n,r,i);ar(i.tasks);document.title=t.title;setTimeout(function(){window.scrollTo(0,t.scroll)},0);Kt=e;ce(re().body,"htmx:historyRestore",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{or(e)}}}function lr(e){var t=ye(e,"hx-indicator");if(t==null){t=[e]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,Q.config.requestClass)});return t}function ur(e){var t=ye(e,"hx-disabled-elt");if(t==null){t=[]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","")});return t}function fr(e,t){oe(e,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,Q.config.requestClass)}});oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.removeAttribute("disabled")}})}function cr(e,t){for(var r=0;r=0}function Er(e,t){var r=t?t:ne(e,"hx-swap");var n={swapStyle:ae(e).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(e).boosted&&!Sr(e)){n["show"]="top"}if(r){var i=B(r);if(i.length>0){for(var a=0;a0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}else if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}else if(o.indexOf("focus-scroll:")===0){var v=o.substr("focus-scroll:".length);n["focusScroll"]=v=="true"}else if(a==0){n["swapStyle"]=o}else{b("Unknown modifier in hx-swap: "+o)}}}}return n}function Cr(e){return ne(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&ee(e,"enctype")==="multipart/form-data"}function Rr(t,r,n){var i=null;R(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(Cr(r)){return yr(n)}else{return xr(n)}}}function T(e){return{tasks:[],elts:[e]}}function Tr(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=ue(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=ue(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}}function Or(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=te(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=qr(e,function(){return Function("return ("+a+")")()},{})}else{s=E(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return Or(u(e),t,r,n)}function qr(e,t,r){if(Q.config.allowEval){return t()}else{fe(e,"htmx:evalDisallowedError");return r}}function Hr(e,t){return Or(e,"hx-vars",true,t)}function Lr(e,t){return Or(e,"hx-vals",false,t)}function Ar(e){return le(Hr(e),Lr(e))}function Nr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function Ir(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(re().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function O(e,t){return t.test(e.getAllResponseHeaders())}function kr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||P(r,"String")){return he(e,t,null,null,{targetOverride:g(r),returnPromise:true})}else{return he(e,t,g(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:g(r.target),swapOverride:r.swap,select:r.select,returnPromise:true})}}else{return he(e,t,null,null,{returnPromise:true})}}function Pr(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function Mr(e,t,r){var n;var i;if(typeof URL==="function"){i=new URL(t,document.location.href);var a=document.location.origin;n=a===i.origin}else{i=t;n=s(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!n){return false}}return ce(e,"htmx:validateUrl",le({url:i,sameHost:n},r))}function he(t,r,n,i,a,e){var o=null;var s=null;a=a!=null?a:{};if(a.returnPromise&&typeof Promise!=="undefined"){var l=new Promise(function(e,t){o=e;s=t})}if(n==null){n=re().body}var M=a.handler||Dr;var X=a.select||null;if(!se(n)){ie(o);return l}var u=a.targetOverride||we(n);if(u==null||u==xe){fe(n,"htmx:targetError",{target:te(n,"hx-target")});ie(s);return l}var f=ae(n);var c=f.lastButtonClicked;if(c){var h=ee(c,"formaction");if(h!=null){r=h}var v=ee(c,"formmethod");if(v!=null){if(v.toLowerCase()!=="dialog"){t=v}}}var d=ne(n,"hx-confirm");if(e===undefined){var D=function(e){return he(t,r,n,i,a,!!e)};var U={target:u,elt:n,path:r,verb:t,triggeringEvent:i,etc:a,issueRequest:D,question:d};if(ce(n,"htmx:confirm",U)===false){ie(o);return l}}var g=n;var m=ne(n,"hx-sync");var p=null;var x=false;if(m){var B=m.split(":");var F=B[0].trim();if(F==="this"){g=be(n,"hx-sync")}else{g=ue(n,F)}m=(B[1]||"drop").trim();f=ae(g);if(m==="drop"&&f.xhr&&f.abortable!==true){ie(o);return l}else if(m==="abort"){if(f.xhr){ie(o);return l}else{x=true}}else if(m==="replace"){ce(g,"htmx:abort")}else if(m.indexOf("queue")===0){var V=m.split(" ");p=(V[1]||"last").trim()}}if(f.xhr){if(f.abortable){ce(g,"htmx:abort")}else{if(p==null){if(i){var y=ae(i);if(y&&y.triggerSpec&&y.triggerSpec.queue){p=y.triggerSpec.queue}}if(p==null){p="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(p==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(p==="all"){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(p==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){he(t,r,n,i,a)})}ie(o);return l}}var b=new XMLHttpRequest;f.xhr=b;f.abortable=x;var w=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var j=ne(n,"hx-prompt");if(j){var S=prompt(j);if(S===null||!ce(n,"htmx:prompt",{prompt:S,target:u})){ie(o);w();return l}}if(d&&!e){if(!confirm(d)){ie(o);w();return l}}var E=br(n,u,S);if(t!=="get"&&!Cr(n)){E["Content-Type"]="application/x-www-form-urlencoded"}if(a.headers){E=le(E,a.headers)}var _=mr(n,t);var C=_.errors;var R=_.values;if(a.values){R=le(R,a.values)}var z=Ar(n);var $=le(R,z);var T=wr($,n);if(Q.config.getCacheBusterParam&&t==="get"){T["org.htmx.cache-buster"]=ee(u,"id")||"true"}if(r==null||r===""){r=re().location.href}var O=Or(n,"hx-request");var W=ae(n).boosted;var q=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;var H={boosted:W,useUrlParams:q,parameters:T,unfilteredParameters:$,headers:E,target:u,verb:t,errors:C,withCredentials:a.credentials||O.credentials||Q.config.withCredentials,timeout:a.timeout||O.timeout||Q.config.timeout,path:r,triggeringEvent:i};if(!ce(n,"htmx:configRequest",H)){ie(o);w();return l}r=H.path;t=H.verb;E=H.headers;T=H.parameters;C=H.errors;q=H.useUrlParams;if(C&&C.length>0){ce(n,"htmx:validation:halted",H);ie(o);w();return l}var G=r.split("#");var J=G[0];var L=G[1];var A=r;if(q){A=J;var Z=Object.keys(T).length!==0;if(Z){if(A.indexOf("?")<0){A+="?"}else{A+="&"}A+=xr(T);if(L){A+="#"+L}}}if(!Mr(n,A,H)){fe(n,"htmx:invalidPath",H);ie(s);return l}b.open(t.toUpperCase(),A,true);b.overrideMimeType("text/html");b.withCredentials=H.withCredentials;b.timeout=H.timeout;if(O.noHeaders){}else{for(var N in E){if(E.hasOwnProperty(N)){var K=E[N];Nr(b,N,K)}}}var I={xhr:b,target:u,requestConfig:H,etc:a,boosted:W,select:X,pathInfo:{requestPath:r,finalRequestPath:A,anchor:L}};b.onload=function(){try{var e=Pr(n);I.pathInfo.responsePath=Ir(b);M(n,I);fr(k,P);ce(n,"htmx:afterRequest",I);ce(n,"htmx:afterOnLoad",I);if(!se(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(se(r)){t=r}}if(t){ce(t,"htmx:afterRequest",I);ce(t,"htmx:afterOnLoad",I)}}ie(o);w()}catch(e){fe(n,"htmx:onLoadError",le({error:e},I));throw e}};b.onerror=function(){fr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendError",I);ie(s);w()};b.onabort=function(){fr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendAbort",I);ie(s);w()};b.ontimeout=function(){fr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:timeout",I);ie(s);w()};if(!ce(n,"htmx:beforeRequest",I)){ie(o);w();return l}var k=lr(n);var P=ur(n);oe(["loadstart","loadend","progress","abort"],function(t){oe([b,b.upload],function(e){e.addEventListener(t,function(e){ce(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ce(n,"htmx:beforeSend",I);var Y=q?null:Rr(b,n,T);b.send(Y);return l}function Xr(e,t){var r=t.xhr;var n=null;var i=null;if(O(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(O(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(O(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=ne(e,"hx-push-url");var l=ne(e,"hx-replace-url");var u=ae(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function Dr(l,u){var f=u.xhr;var c=u.target;var e=u.etc;var t=u.requestConfig;var h=u.select;if(!ce(l,"htmx:beforeOnLoad",u))return;if(O(f,/HX-Trigger:/i)){$e(f,"HX-Trigger",l)}if(O(f,/HX-Location:/i)){rr();var r=f.getResponseHeader("HX-Location");var v;if(r.indexOf("{")===0){v=E(r);r=v["path"];delete v["path"]}kr("GET",r,v).then(function(){nr(r)});return}var n=O(f,/HX-Refresh:/i)&&"true"===f.getResponseHeader("HX-Refresh");if(O(f,/HX-Redirect:/i)){location.href=f.getResponseHeader("HX-Redirect");n&&location.reload();return}if(n){location.reload();return}if(O(f,/HX-Retarget:/i)){if(f.getResponseHeader("HX-Retarget")==="this"){u.target=l}else{u.target=ue(l,f.getResponseHeader("HX-Retarget"))}}var d=Xr(l,u);var i=f.status>=200&&f.status<400&&f.status!==204;var g=f.response;var a=f.status>=400;var m=Q.config.ignoreTitle;var o=le({shouldSwap:i,serverResponse:g,isError:a,ignoreTitle:m},u);if(!ce(c,"htmx:beforeSwap",o))return;c=o.target;g=o.serverResponse;a=o.isError;m=o.ignoreTitle;u.target=c;u.failed=a;u.successful=!a;if(o.shouldSwap){if(f.status===286){st(l)}R(l,function(e){g=e.transformResponse(g,f,l)});if(d.type){rr()}var s=e.swapOverride;if(O(f,/HX-Reswap:/i)){s=f.getResponseHeader("HX-Reswap")}var v=Er(l,s);if(v.hasOwnProperty("ignoreTitle")){m=v.ignoreTitle}c.classList.add(Q.config.swappingClass);var p=null;var x=null;var y=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var r;if(h){r=h}if(O(f,/HX-Reselect:/i)){r=f.getResponseHeader("HX-Reselect")}if(d.type){ce(re().body,"htmx:beforeHistoryUpdate",le({history:d},u));if(d.type==="push"){nr(d.path);ce(re().body,"htmx:pushedIntoHistory",{path:d.path})}else{ir(d.path);ce(re().body,"htmx:replacedInHistory",{path:d.path})}}var n=T(c);ze(v.swapStyle,c,l,g,n,r);if(t.elt&&!se(t.elt)&&ee(t.elt,"id")){var i=document.getElementById(ee(t.elt,"id"));var a={preventScroll:v.focusScroll!==undefined?!v.focusScroll:!Q.config.defaultFocusScroll};if(i){if(t.start&&i.setSelectionRange){try{i.setSelectionRange(t.start,t.end)}catch(e){}}i.focus(a)}}c.classList.remove(Q.config.swappingClass);oe(n.elts,function(e){if(e.classList){e.classList.add(Q.config.settlingClass)}ce(e,"htmx:afterSwap",u)});if(O(f,/HX-Trigger-After-Swap:/i)){var o=l;if(!se(l)){o=re().body}$e(f,"HX-Trigger-After-Swap",o)}var s=function(){oe(n.tasks,function(e){e.call()});oe(n.elts,function(e){if(e.classList){e.classList.remove(Q.config.settlingClass)}ce(e,"htmx:afterSettle",u)});if(u.pathInfo.anchor){var e=re().getElementById(u.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title&&!m){var t=C("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}Tr(n.elts,v);if(O(f,/HX-Trigger-After-Settle:/i)){var r=l;if(!se(l)){r=re().body}$e(f,"HX-Trigger-After-Settle",r)}ie(p)};if(v.settleDelay>0){setTimeout(s,v.settleDelay)}else{s()}}catch(e){fe(l,"htmx:swapError",u);ie(x);throw e}};var b=Q.config.globalViewTransitions;if(v.hasOwnProperty("transition")){b=v.transition}if(b&&ce(l,"htmx:beforeTransition",u)&&typeof Promise!=="undefined"&&document.startViewTransition){var w=new Promise(function(e,t){p=e;x=t});var S=y;y=function(){document.startViewTransition(function(){S();return w})}}if(v.swapDelay>0){setTimeout(y,v.swapDelay)}else{y()}}if(a){fe(l,"htmx:responseError",le({error:"Response Status Error Code "+f.status+" from "+u.pathInfo.requestPath},u))}}var Ur={};function Br(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Fr(e,t){if(t.init){t.init(r)}Ur[e]=le(Br(),t)}function Vr(e){delete Ur[e]}function jr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=te(e,"hx-ext");if(t){oe(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=Ur[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return jr(u(e),r,n)}var _r=false;re().addEventListener("DOMContentLoaded",function(){_r=true});function zr(e){if(_r||re().readyState==="complete"){e()}else{re().addEventListener("DOMContentLoaded",e)}}function $r(){if(Q.config.includeIndicatorStyles!==false){re().head.insertAdjacentHTML("beforeend","")}}function Wr(){var e=re().querySelector('meta[name="htmx-config"]');if(e){return E(e.content)}else{return null}}function Gr(){var e=Wr();if(e){Q.config=le(Q.config,e)}}zr(function(){Gr();$r();var e=re().body;Wt(e);var t=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=ae(t);if(r&&r.xhr){r.xhr.abort()}});const r=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){sr();oe(t,function(e){ce(e,"htmx:restored",{document:re(),triggerEvent:ce})})}else{if(r){r(e)}}};setTimeout(function(){ce(e,"htmx:load",{});e=null},0)});return Q}()}); \ No newline at end of file diff --git a/visualizer/public/vendor/htmx/htmx.min.js.gz b/visualizer/public/vendor/htmx/htmx.min.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..2d083ecbda4cdfa73a733ecb217a00562d629beb GIT binary patch literal 15625 zcmb2|=HPf=doh)XIin=ELN7NnPcN&OVU2ZW@okGu^{&sBr5G*aOV8SVFJMuyo%+0w z6OZ^A8BbF4_MUL0g-JwU)0-2&-mjMycl7cs+xE>l>Cvk^lV5C4`o&8$g4}9_x)P@L z)qb>4&xw(qSm@;`b9~;+hgV;(+C1}&+d;3|-+LL?L{HXH-EKeS@W+-(O{WkHt&~7C|-_IA` zsYDbiiOsn-M=qa{= zjnvz-VDZbxzFX5|i;R-Lt5k`pExuSdO+j~;|JDqR8!3}sUejObVfXrdyz|kn%j}LB zd=-n0*G(6TeP20aBd5?GLHl(Qsu#om9J+haby};l+wqqwQH;v0kNcOK>^yx!L#W2l z>2CQPp5;%}{(3F?YnC8UJjs9kOKsDNnM}HmS^NZEdWy~55vlfB`s0j=C%iRP|6G0h zwDmdPya_s$J-4=Xb4(Px`g4)&vXU9PZcpa)T}otpceUUo_|La9+mm)_AY7G~_$u8J*)K7ou;q&nQlqHi_eqeiOBzig7 z&#k3P#A4k|y-Sjb+>AW2&+<9vsIwjoe#0VqZqu>lAskG1BA>Zy`u=#V`y%AY-PAXH zeX3_a9?17#>z3%>bMMQ-h1TqeYt6k}E*0$BBk<+rv@_2ll}qk^))Xq6HsH4^5sa$@ps0n_91F+ie&l-HsY% zq`COq)Yv~)?NO}Xy^lV6XBwLs_;0jKd$`u>+n-r!{Z)}x3wtKt7Mc0>Qneqev&;1_ z9gWjg1z#3>kmlF6QzbC#wACDS8}^$lSs$;sKRoWy;_TNTx%~TqPU&qA3J$euZcyu- zlzMh1Q(9uEt)I&tzH3tV*o(>!x6SX=aCF|Rl*E#DoG~O{pv2|#xp{eimaY7<>*c(i z8|{*0?+NR@ZQg$W&(59qzg?3}T_3hUWP8@@^+Hys4tT|Me(39!>z5Su^1@^?4@xS!&`{gyIR_Xa>Ny()OVhZOt`9Et$ zr!0QVa>i4Pw^cA)GvUQnpV`IBtdG0Q;(smm>BU;BFR46L%wcIWJ}oq{mihb5q3`Yy zujNip_dht#^k1H_mudOAk33)QnC#0uH)-d7&EJ=nRaB>(FV^jP_2HW1XJPM^?^{hj z^mDxM_Nm!WdGZAJq3|EN0jUcM8+-rAb-4O+TCoN5ZuLA8wA}mGw`o2OCV%S7=dV3+ z>;3o7_u|=`pR@b3H{Nd!+h1>7@z3bRx8J&R3O>9K*z-m0o9@2 zv6t6DN9p!vwq*@@ajN06b8es6Eb?W~N2P`xsne(Qe{}tD>79WPt3O9zVc$HTS?jc} zzkX`wpc%I5l+$&UE3fNzGKbmOhVHV_bhLuSPyr~a%%QGYbTM7YKJ3e|icFl2O^ z#T-@f>snC6@@}<_Rfxv)%O=b^Uw`p!(vO%}@o>Y$Jy-S}*0Vm6su+H3&aoYy8JVh+ zbp0#uO!4FNH_SWox%Ef*mDidZG>$U--ueB@6tmBj)41+4-_30LsLFpmc|JRPq4kDS z+ZQA_+LT^$Grz`a7?OB>i^9UWieGX*Cwx@o5ty-O8cU$)1m!OY(oa@Oa|mzXP0;q} zTfWl1_vz%=pHHXxeJk~TKj}`b-_dD|VJ|mdEZci-_Jb8ho&k;zLLUZ1$L^nQvX8H- z{%iE#Z;t;Ty6)Ehwa5SW(0NG^cQp>&+j!`vZP8T`7M4M!0@E_q6Tb z3{GdrIZNm~3tYW5MsN1%`LlZbqx5gRE#uBDekMzo$8N%eUA$ zg%4VPpHr;S+puNVj^$y(i;^n)R%EAjW5ZgXP;~wrQtj zyqH5gCvg`~xhHM#N!W6MF~4!{O9{^nalL=1KeyvubYyu!U*EK4M=EMIJlkjeY1fm~ zkU7`q6st*uX&vCuSbFuDnnUNCl|df7clvoMbk=yg9~4+up2nru_vU}x+$9COf`x)! zw0m}j=G=DJ|2(r)(bmwx^rqus)##5|xnJgqKk(zqu-(ZpD|tdX>(aXqV=tZInA?%r z{{C&_!_0HymJ+|^2mvw}NTc-JMpRto>t=OxH};wI0t)eH-+p8p=T z?&uYp?RVBKEl^u^rv2cRuaovY%kkS$!4k@#$iDA5)4$E^9$X2_JHkJ>H~+pq`?dDd zr4#lkTE)&OY=3s+2&2RY5rK0xr5!FO)2CQgKGqFOx8k_>HrFYlkdIAd8)JaC@~UG? z*>s&|T1N-@ND3G;wfB4%@IBS55q073zUpemxlyMAk0~sjc`3#1+k}=D{^c($%Ay3s zZ7$E_Jmfb+b4_*T*XZi=QJ0QKJX{~7B%{@G`G4#0Z&$WoF+5q@6qfRK&Kvc3iMV~4 zhhh!~d{ADxfLHmSAfx7~St`O3n{wsexF7hkY~`xPjnVs#Gze_tO`5Tpr{N|4oGd4Y zbm#b3gQo%CcdXE}UKIUpvZ$`bG#O6sN%sE?XE<-zF6!}EcfveP50!Z@H29TCZQRA3nw;{9jDXa{Ga!x_XfUdpwF8-AP`=G@C0+Rf)swcy(SsMQbbbf!oI=%lzs_scat-HyonMX>V_5Z1=3i9+dtlxX> zW<1Y4rpx>CXCBxy>FcxZ-7!bMzr9c(beQ#c;lH0}RgdMG?c4at{Cc*Qd*ko3hFjlM zIqv0H?*x9Okx{RbcZ>vJ?Y z7M6$T9Op_ZeOp-h*8X(1;h{wnIcoe=+-9l%T{HTL zp4;W`@(HHFt7o{2p0UqQG864!+Wc~*Pe`Muq3>4h$tn9bGJ5V>bTBPuQ({iNv-^&? z#Z&H1uDJd5`nS>qH=htEMYbiec}Wgkh6_#|sOUd+!MHUbqs=Pc=-PFkyR0j2NI9>3 zcJk}T-KQ_FzTLlmeg3)p^Xu2!?W?P^G4(eVY|{vtsC&;}Gk$%n-Aem88BHfHI>oA6?V9S@awd`Y#yKCp2uOh~gGq^H0{5loO zzAR~erzETVqJ%}!Qg>ydCcwZy!tA9sIOT<>{@7MNdv$pZ$vcUc0ze?eb?Cl7UG*O@~AO zu6wfo{hzzHHCH~3`jdU{o!tG~U$Yu2#D%ZVYVve5J(abqVS94^mTLZ#09`|?^vZC( zb4hngyc+|j7nFx&JhFJFTDX2+K;3eF-lH|=SqhJ>nrg8?VE1Nkm#ni<;(s1)^jW4F z?zlkFwOH$K*s0ZBK><~d1F}~8&Yr$^ZjqRdSL6mR^AxkN4Q!WZmujxnyks1Eu=R(B z#SSl-X_@sqyZG{iF3EJT=Djh0_UWpIAOG6xMhuVdI|j5(-u<-xD*q{k`L+rM>aH4{ zU)BGa%djjfy7Xq*&z-wc@DRD83kh^u8-}k`sr{WLR z)IZoUCH8iOi)zGgfB=Yo84}uf3pp zfzo`He*(54LTeI_bEfS{{iw6pQs(eYNuBJ47VF$o zy*KIAq8r@dyI5qFzE1G&eL8K5e(Rchge?e<+!3&q*B4@_hWBsYTvwNdk^&OdtKq3Gxd<6 z$@NQS-e+7AkA*Y0+@CJD>&CwK3ERpXUd!7#2Gsq2@v$al%lQE3Q;U?l-J%)~b?N?D zvZSYPn=X9$y?fqXJI24WVj4U3mbnyp zrRdLzc$)E2PDuEDm4I5sZsu0=wbw7twMgSi6%syvh-GeYW<;|e-;Gb_cWOynGftE7 z4^Z^>sdT+FDQ@Saz#kF6cX5BJTeG3m?(~2CCD!Fv;=@ked33Th+V;IF_rYU7{4x_x zJ=1zz@44vguF#h=DudT)-xWJEB`8_vC#&a#!o^w=1)+N!u05H$nCbnqJC9238eZSr z<^M%UVYO4F?~J7yUb96S9yQOGom+fo-oLuvA7A}?BGQ+h{Ncy1pl8Y!d_JY;*(~O> zEe*P#crtSP*|;28`MC}HyYAMr@or>aZtwfUP{C5fuFcHq-+2`Y3d-cY|1KTbH8U5v4_|=NaV+$6oD(X9P;PZyOq&vLE_YC?c%LQ9*>bhQh;{V0M6)KUR`TPxv z>;Fy6ba)ycEz+0A_(Ck!c=cw37sm>(MSJvH|BL%$_|Ngr#IQ&Gg#kOB_4?dXxp(wD zPt(wokZXeU!y279#v48>R>v=pGx^q?Eh?-T|KRNU+9n0<Au`PmSjUwpH(fDm^E#`+DA=HM{?-6y{&Q&6_&u%BB9<^@n%X ze=W9s&Y!cc=5AH<+ERwKk4o2Q*e?26wu8s!SL=)LR->3>0hSzVE?)JnyE|j^_WsQZ zJ7Q*kH(yra;(Tv`MGkjhz1XHVN)z=LoKdu9ex|C_woY2*^y&;_VTC18kvZ~ODf{1R z-m3G7pQsu2rHV17N$5!1NAX3ECYoE^;A2`)eEiCjFWcA5p4GNScy&JCO`|f?xk?J+ z=ccy5*vkG%b-Ft9{Y)#f^?ez8);F63E36kyoZ{2lJXJP8GIf#M%~#WBPrcHAw8MLq zt&+?GZ?~H3oUc}z2<@A+qvG<+cPnMrac{b`SK`y{1DmJW_wO&*{vfVp&N6jgg@XG= zj(-(cKYfik_MS$gYcjNuSr@{9)M2}7`(&*hBspIJkKA{HT-ien*w}^H{yu zQIfJTWWULm6uCDuHB`eZKi>R*y=?8<+}kI9t-o={rYq#~xuw-*=ar|}oYSx6M4U#3^WB$g_I;VrByc&EvWLpB0xm2(T1N@}%9Xbi6$^BP?AKxiru{V!kdKlor1pg$M?>j>c#!twz4+=s90~;M+2|W_scK5zEQGa zSEX+qn{Qsa-V47Q%M^}mDh}Eu7F{HJF~lU^bEm({QY8sVuvG(OU>8(pH98Pzw+xaQ-L`qxDDQCI;(jy zqrmy@-3xUkr!%GxZJtCeGzjuniT@zIVGp-zth$2ZwWeO~8GpNV*HoB%w0E;X?)qIacdNeJ>O_W_s=nzF`)=$1ed)?S>f9||>uWwdc~j!rJNc8+eBbx=L3{aG zYcJ_OSp6q>67So^8UH45Zck9PEuHtQ;=^vPNh_1ord%;O5;Z#}?5dkXaai>K&4=Z~ zW#=)^yb)HMzN9$y$&$OqTOK*MyS9`GRNTBf*W-H6nz&Y}oU%lN-afY{3|nq_v+uMB zyp&9*r`*(ZIJ#*>g^0bASS7%OL(sQ!f zKalIZ+gh(}$JTNlRXo=-qe$b)u~&zuojfx`esNxlQq@8O}ECExnJSft|rEwpvr zKph@Hm~wHClIx~zVe*O50+N5_J!Tj2bScD-)Xzp8y2O}oj2ji!O-vT{QmzDJv^tG zQTPF=Zk`K;#L#p@CeIoR*(_*<}i zp~%53t-lgF*}+LUO;VF|XE5zH=(Y)dyyerQvn;PlmhQFg)%e<&9==*X;W|&Y(aet< zJuPjnY(C_tCEmOtbmPTKXXJQfjXiBH+^$WU75eh1$wICAX|sMxtov9~%Trs?>U$u# z{;tNm-lC|x@wtim0spHLr(Cj}@iyN?X4kuIY?eWW8BZwDc>gl*s{!K(V>UeHfI0GUe24t z{&>>iE6R+gudrkW2p_o>J^RNzBSmJP?d(gp$cbc!E)ndJf5~7x!-Sc2wUWEe&UM^b zH^OtQlK=CSq)1lv|Gd9Ir68nF{vmtd#${)?KYN}mnSV(|`fJH! zwf-w^=c6+s)h-xaKYKy$n6u{6SG$YWFY}t9*LSq?p3U@gJA0O`{Jmw%%Ku5yhjyKt zep%vzSJwAKYm5p$G-#JSDEp{-ojpEf^|nP0b%xWNf2O?hNsu|cq%3My%G&IkVcF?P zDUD)vMm?+Cf|8|QsI|5(Smwbp>Lq`_zy7nG@ zttzF}JJZVb!69=te`~K^f0e#XldmjTH;?Ccv^4X!MMpMG6x<|tLFbrCk^j88NeZh@ z1uoj1vB74^vFjaCQx3A|2wse@a=LT!`~%Kc-2S{ZJC~l$`;sdpRJ6At_d(lqBc3B? z5`_(Kl}h9w{_SrgzxLD~u?vhov&O&f@V5sxi{NW$rt;gDm-dI!{pZ^r|G&@f>arpU1D9nA-Cy!r znf63ao5^>x!fZi-VO_GFztQ_v$v2E{hGo;8qg<}8$o>;|XhQFKX=O1jANea0Rg-n+ z_$+ST*T3e$hxr!Tf&We75p;fg8jUsu;XGvMcMk?0esZr3oA zpO;?Hv>@Q%F>SqshDr0!bLZ|^H$|)Y7VGN;x-MPo_gcOwZPjo#Tjl$!Td$>Zu|u^bZvFpYzpF-!K{I6Gg?)%qu>G{vn|CKM49E|+hW*VK< ze|Y)W-{U`QSFhS$wo_yER+Y7Slag}htT~!}?gq>K(t|C{H-F9w-+Wx^%Rg~_b@nvN zkK)2DHvH4v-z|GJgZWOI`m&!r3g0wNFW4K_`RG){ms2U*tG|aHu=(v%I8{07hBU(_ zkIKNljMu4ixP*UvY!huPQix!iwxEu)$uZC4^!d=_Oq1VBBA?r79^ZLYH|lYF_q7|H z*X|z5k=*>^R-SyYz|Ml7(vKXxyWLMDgoi%7!osNOz;S5Zv2}&_XSymrEbCb*>hpE+ z(Tr<~M;^?66Vm%O#Mb6ctf}XB>BGXzWlOlDPs==Nx#o z+iKwfwlyz*3;qB7DDc)lyHoeJ1m6E$JAZfhtUQm$T~D9+UX6#t-@0?QD5( z9{4u!HBHuh;IZyT)$v{OrgmIqOY4_pR6lF`QgHmX#q?m~*~!~&ElQGS#NOVy!IxF~ z=mF&=MxBdiXipR}cA9eVXlPJR;>nlWp6yjPWYYgXSzTL--GVU7K#=~w1vKy z^QANQ-@zjJe8q?>YAYAWY`*Gvzw_#!={v%ueSca`XdZ2D^nMT zt~_(=;fr{#u4zU`74r(3zFv_xm1=(TpT&4W%EhpA`Yw0FO#{j=8|=9k@iK79!m0CK zYEC=3=Fnc#l5f$`eK&uteze7R-i);xtgB8b7pl$8X8IC3RixzhnS%B?-%mz%W}cg2 z&>8>pZJhnCtq5MQ-;dUfvqf+P`zjji(3X>)1}8yt?h`Qi)vIbqk|7pH4bad8TgZ z@#TM_BChO-u>8jve*I~tL=MY4F|`Y_86kf={*;v2*9NNw=D)1|;JtB1^}VFGGIdMY zzDzaV(k*`bbK>p%&Fg+lpQ;q068*!wDu?~A&kEtpDub^|zh#bY+%i8~VAGyI$)!i8 zuKlz|-?il4bcw{*FPS43{HdE(>dW&dEd7ch^ZJ!`p6!YqvN;d6m%M$s!#6QK^II#A zrO|h}Y^yo)TV|}0S^Ma++mF(xt?|Vw!CaGqEc6Q;W4P{IUh{BDMDn9&Y1c)5N6cIx z!OipF?$KXmfk(D4Sa{)n-LmAh7q&jFTU0uKiBs|UhZD0y6P=H{?a;~$5&NSNptr?) z>9MCCuRW&+^4(2Rj^+KRu_Z%4X|KZHTdfX`*=>jBh^%my`efDU^na3N@x(~6ByQz% zQ8zB0VRo7ts8{es{r_+8pQ3_u^78-L{7L;heeLDmhYR+9ow`w8!E4?1!ydZgN<8I@ zggSji^FOSx@bp*wx|6Z%!1-Q{^^bcw+=BV$=QP~z5Ndz-x5Mgzj*eg2zKsvfvjqF@ zWvyEGmcxGS(N`S%y{^6LdtkrAb(P5a$E~@AF^jqPx=F|KHS4WCJLi)5zG-awOE@nX z+^tBH*15ql*TC$6<~xSj!JnpPa2$Q`FZJA+@`G;gWKt`NgYU{5iq(8@^T2txHGOv@ z|7QmTYd_y1ekJ$Mi65x}LU(t6TxB!a{o%6YL|J`_wG$_ZKNr4RQf^WEMVrw}{hZK| ziw3v8Dmiu@yS?(xoJkRz`<2%B@LF|mDM zF!hbC^mQk1o_jTAO^zLrQeDSbn^r44=#SG6e|_MS>C8P+cg}IxKi#qSU{U+(IkVo* zJ6jT4G_PXAo~Je+7liTNDax((@$^yEbegy7Z%1hE9#5<6AG6~E z_N}#P@;cq`F^Qd7hwZO0&wdFTOa5l}^Jen4{A|3pQr!QBX{MOfHT>`_7fYQQKPlkd z*CQ@>_Fdf~Ir&KV_m5v%KPK61WA8RN$0OZZZ(OYOtKa29rM0b=QovKzG^Zc$Crnnc zIIv?c*SwoI=5WS028gfDY&}!6%Chd;tZ5Z}*6j^O&x?LL`q%2ry4zvBd)3jqFIn&Q zyRw^|=?~F$XYsWEoi$6d&11fv(G6RR8}<_GSpWU2nN(6B7F8i4czGVn$u(Sl%F6fm zul}XRbZLX{x2o6n#)`{54R6>9#Ra|Gxc7<+gPcdlxipO|<3Qm#N+mlO%Tv=ne7ql~ zBzZYb|5-%Dv_JP3p0pA^<{M)b%rfW4(gVLLE+p73suB5nCQ`tM>*%F_0(N@FhS~Br zel{uaA2;`%`gdQEUF_-Dtl$}kt|$uCtHV-=+7B4@4VYv59*j{bkF#MO9B#FN7pFoxf3a#q&$^#dyP*v)YeiI#R5; z8EP5IZpPoR7AifpXoljO$qJW>qbibBW{7!9@;9lbFsWWJ*c+ng`jwa4G9zuqRSSmM zCrnogg%!0w;huFW!Mw)ujPokB)-y}iWIjtfofBKDJv(^e&S*wX9cC-e^4+&Ib1K*` zH~#$eTcL87(=knxPVv;H+$DBvl=axvi?Tly?3wWD^(+4`U%8&?8Zq45XSPk+x95%Y z*VT&-&t2KSaFg_3wd+DRw>XI2J(R4ui__?@bmD zT&KRNj!k;7QHWVBD^E9%1xUyt`5+$uyfynC~{-a?OP$+eC7tG}g!-wQBL5 zIA^7(srD?fmwlJl7g&bO3XYre-|6|oznff}D~f$07f=5Gc5dC(YR4s)cStD)=Ug~^ zmp68=g0A_ezM7TqfBO{wl0G@(n>*W|CJpAeQNbHeJYaQ zMOGG6A} z!7g&v1{I~H6`gbV?)}+OnZP&0_`z1upDBBs>i*2O`LT1ZYopnhvyYp%GxD3)wE>#o(yy2>S}Q| z+?U?raa=M{__LJTbNNYq=i@AyStY7U!y{(4Z`rYCnuN0dVWrux_6B-RW)Ww|`Pa@> zGb6p#ctTP3d4bL6Z*^ss-WKNwWZ3(?)al(;HjRZBmwYN`H90qVySt@e+~#rs#KWBKI=A$@{{FB6ydEi7RbRonmK7u(HW z{)K$o>>vMst}UezUzzNnu2K^EWzB}_t55v*RDYJdJ$+BjA>Z{<)4q%BUz~gMUf^F> z)9j7UZh!k^{$%o^!bR@Ke`+SNZ#|QqS;=v!q4XR(8>8s8@2ZV?jFtO-vIjpU*4r zNa3m#j2O1womDf*Ah`}Sy0_!*|fZWLRy1{L1DqKH4YwqTG_gp z6_ye*Pt}9k9|lYIc?now6Q31%eT8U)ww&!rzuElWRS|Qmwmr%`xaL~N9mxuIIUlZ1 z?LQ3lr0o*}s-!cjudB1R`P?~%^Olh>Xmg)RLYd8tFg`cCcc-NhmcYJZ2Se@yjT z9>=@1IiY5)MRw8IR^N-i3lgR*i})Al?0$^JMeOWD8Edm--kaQ4QuVzyP3<@>`Lu!m z@rPSyyDe<=LykNwwVM6+fI`gt5m`*tbd|eEUcG({>RdL)ndz4=1$+g+o6B$-U~ibPR0`@=Z9tKB^7Izo3vKm4!`|c z(O~^!wkn6Ponhp<1AI9+u4osdgKdAe=Ex}$5^6J2XNn73bly`y*$TGn=kDZ)n9pgwY=_#pEov_5CC0~IuCY}9lOOecS%~@i+*?a>uCyBb(|4BH z^T;K6cP?kv4w?Py`sd9tcQFl|rXnr)X5z-|CkaOnSVwl=DlPwG3ackkBq5Y*W5*v<3?$D#z~*B0e3-7?c04LJ@a&x3Vhw$8w+jZFPr*C;dO<#q~V?{_17kF@YBgA39H&UZrn0B}3R} z^5NOd3m1D_dpX;p{fw{N-T;?_f?DKn=dv$a}+!>F{A%u z!Hd&P{nJ9(r{A=G^*1?gT7H-uomuj1 zp>>hgkFJ<^ac>toTc6+k{;Sl&f3MruTrj-&&$M@EjbGDdgKN{LJN;X4%f-(lkiEg= zp&;Y5WiM4W+~-?A_gir(Pq6xN;o6no_xvu~-%?*T-9b^N#I0ZN=u#)eZ5`?7=PbGq z8df#$scX>`vsFtb?Y%Vbe*CN-Jtm^bk}Jl|h^sj7wdSmLqe7Z3dvx>+tYw=|50tu=hD=aOHZt4uS)UOy@i>vq4_x^v%tua<(_ zZ!$J&hi`RLJA9x+e}Q%TGR1XKdxc(K^eh&!p7iw04tbgM`J4Vol{~1KbtrB|n1>+e z;jIbHGxV%kzV(T@hfSEE=9q3Q_+!pC@4`S^N7kLn`?|_Yk-3Ly zL&$|q&BrVi|6RPefmMmMy+(xd80UiJv-l$v3^%+Jp1q_jol8E_BAFpWd}ck%dETWO zinULqQaz6ydw4RlBjl2^$Y-tj>fIAV&L247_vU5A`59MEN=SeGzUqteVXj6-Y1bPb z>q7lztykcx-dk5#KArDGeSLZO0{-Bh*~Jn1QvM%2xBLiLCUuKH3wMWxmT! z-M0DQo1LXm#{K0|F*@!0u6|ni@xa~}-S^X`_5Lg3(K^38(Lv$8f{eQO$Iw~ghmRS3 z4!ZREnD@RbGHbslu>5hpx9IV8F8;;|mSta-Ch~qemi>$&>RG_rD_ioirtmiYi2QS3 zNn5yFME-Z{$9cludW(*5Ew$*nT4Z#p*30g1&dsl9u74A>{~k1>ZbSF-ex_9fvf8O*dhHty816j`|W);@NS&s^BZefC4b z%Dz3)j5&$l%(jb%?(_Dy{KjiL@f%n1wppdA2hSZ>djDY8N#T2idp6ZwacsBpi`vKU zW7N0&*w(U`GffjVn8jV>6@2h@hGL=Wp*1(ps2|Y#y(`>KlyBy=A0J${wnqgYZ}4_G zb@wj&k>V|VVS5r*NVBqCt}o(v^e;3><~M4kx|@Sr^@KCo$GmtC$kJZ!#Z33+!R(_D3PN4;eMrBPW&Ew zt8D4G&e&$@mrS|qg|EHf4OhB&J!-Aht_Q_sp>E#CJ09ds7F=IDv30JI@8ih2zD<_9 zgqHo$lV;7p<6Nrj;H)1+dEi*GMszv0D^rX}KI1E!{K2FFf zX8w8N$mz@(A(InjmZk3WNO{8_-}*&-`;%a)a^dT$%QihUeC1}M92I-+NQ~h5Ki=OL zN*HO+zPMBRt+`&;w@LOtQcG^$*|V=N?$_}rd&As&=eZ~U7q$6&-tyn?uM76|{L=rq zW{>6zkH)7zml+oMJ&hF-FLwO({pPi^u8sAN3gbdv1e88m{%^X})`|0$-I1yCRV{fI zcaOtF9?GANcjNcALb0FKtdVC||!_FCkqp|L@DL zI}sCOpG-S-$h9JaZ*PjZ@{~=%7ld|H3vmP=P?Ouz%yy@uZ${}Q+j)0#;^O1;C#7-#A6uWaAF+^pcGca}-k zK4;JH`&=8k2QH)JT=-jUMPqTd0Bqpsz&NBpG8cm=O;KUvn*P`E~Po) z_=f}g4a0vh{*I3PcdSEk#eHdzZ`$~`$KiH z$(6V*E<8VOoE6|cc6g$BjqNl*S7_qnlDjm`btX+H{#dA0`5T(#S%G&g->`fJ0|^Tw=o zWd|pC@}B2&J7HS0cbdm-vxpZ9WHOg;uD<1Y*EwM8p3L(-b!)^${bn7XuTwMo%8kB5 zXIK1xeAJus>>+8RsfSZS1m_xw?*1KYvbp+JIEyDv4gZ+a@y+^2v~l+gbN?Nsd@sAd{kUA;Ww-x;rGbsZ!-=i#8pkNQ?R~Rv>^q!1Z|PsR$tz0U9Gj9C z#hABK_UEB$mHoTBv$uVp5!@Hmo07*dv9a2t)>2=8@4X|>n?i|6}hW-skJP{^@LS*~M+WMt!0slV?(+SoDSzuZ)vPr=$IjKHe{&J$IsyasIoR zrHO_TCk&UH=$+4q;j-#J{zREYGD|1iLV5ARlYhcW%Fg*V8ro={593Mw+|bjqdSZWm z(erq>-5e#Fi&jr&xUFkp`ayMeK)sfV-x`kfY|&R)GkkwdsQOZWU2ead*vu;Vf*o98 zyRSc<=f3*dsh{pUE5l!P%~;0zO7qLhd(WQEYx*H+b9(9Z?6#vX9xED!rX0@==e)RT zh0qq?_^)ZnrlH@At2bRcBe&wfesPPWeKA)K%rL2cGEsZd_cQ!;*1;3=--&D7K0p6o z?GdrV#@bOl%O~hE$q5xNT70p1gIsZvc81PV*L^d51(&yqRoE-NvGJL?LPmEUmv%{H z^4iospFdwY6H^oO(m9-RQ-tOzZ#i0hP@_$y^5_ep^`WA$)@b0dMh* zT}37Vw`+3r^LK~VzW(EQ`QOxqogzDTuF>R?)|0s6f9je+<;0FBEr<9tJ7qE!bp7~V zrr4Nyc8yhR^sy=2Wimf{PtBH^Hu<~hYMBqQtLuITseJo5=fIaGJG@`qE9i2L{%SY( zj{7TKuVb3Jq0Q@V*q@o=Bgn0^boK}Px?^nr??!j%oDDd$%E?7R{@|salr!O7J(WV| z4iz(58ZKkA>NqU)Vp3yx$;oZ1%vUzveY=7y{@y#^-@SK~5~m$nb?(9DhgYXHEy`T+ zp}X|`wSv8!KWpCRT~kw-7GQ2s^A@UV@jQ|;!Jw^lYzIyBWm zrNcbYq9ga|9LF=}b=5apW~_W+t?#wokXi6@ruXWp&nKIC>L`mVrAl!fd1jV&(`L&d z7niL!#m{#HpWZ1mdsSQ2yhnwRc`uD~KHTP5u}vxIFMmz#YRml>7+NYzeK%xeHOM{n zPLA1TJXwCix!@{^ciJ7|p>iC7VaFyOFbLM`J$SJHidvDI=*qJ{-}hdhrt>v0QR>sH zee2SEHoSdv=>3~VjB|D0Moy?tK4<-UwJxh}-h~3^)-SQlGo8*inH5WX6;E%UAt$z_ zasS0*yk!e54u98?KW_Y{L7Cf2Z+EywYg8M*>|v(oK^yXqZ79yrdbloN&6&S?f8)-7 zZ$<$zx z#Su#wudCJ>tUJiON!sJSV0qp%_m>ju0*~J7R2P)4oOXHAPOFHcmv*jE{5Y3ESI7Lc zJ-ft9pII70o?a#Ecm6-$xLv-uU3j8?gLY|7Q(xjj{VCO)#TIg@J!;eS|7%?EZW5Uk zzg|FG`{XgR<~OVVmOl!t@qV_|f!Xt6qNT>Yi`BCXKE-nbjWi34&F;yLwt~)>Quz{H3ye3 zKYcs<|7EZJd_Qc%!Z^+Mi@sJWM?Cvn(R6T=|7(5wH9OfH+H6+bNndO#x_y({$?Og1 z_v&1qw8O{ja?Y3C_y3CT|213v&OAHc)IxdryU8{#Us`ss&$!r~-TozD(UKDl_m&>s zHRJe^!wO~=^Y@poKWy%;_-u9Hu^HJ?sryB%?jCG+@9!zpEUY^6!hUM9O7#uKnj;yT zUNP7e8^2gq9Huan&#%ix`lZQK?Ne+`_b$k@g { - const f = "/home/didier/alldressed-programming/dodgeball-tracker/outputs/index.json" + const f = "/home/didier/all-dressed-programming/dodgeball-tracker/outputs/index.json" return new FileMatchService(f) } From bd776b0a14ab58974e382ff21f7db9ecd635d67d Mon Sep 17 00:00:00 2001 From: didier amyot Date: Sat, 2 Nov 2024 07:28:44 -0400 Subject: [PATCH 05/11] modidied stuff --- dodgeballtracker/logic.py | 22 ++++++++++++++++------ flake.nix | 36 ++++++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/dodgeballtracker/logic.py b/dodgeballtracker/logic.py index e1e9b50..2477fae 100644 --- a/dodgeballtracker/logic.py +++ b/dodgeballtracker/logic.py @@ -1,6 +1,6 @@ import json from pathlib import Path - +import logging import torch from ultralytics import YOLO import cv2 @@ -10,10 +10,22 @@ import numpy as np from boxmot import DeepOcSort as DeepOCSORT +logger = logging.getLogger(__name__) Color = tuple[int, int, int] +def get_best_available_torch_device(): + if torch.cuda.is_available(): + logger.debug("Using the cuda (gpu) torch device.") + return 'cuda' + if torch.backends.mps.is_available(): + logger.debug("Using the mps (apple silicon) torch device.") + return 'mps' + logger.debug("Default to cpu (no apple silicon or cuda) torch device.") + return 'cpu' + + class DetectedObjectBox: def __init__(self, min_threshold: float, color: Color): self.min_threshold = min_threshold @@ -93,7 +105,7 @@ class DodgeballTracker: for d in tracker_data: self.print_box(d, frame_idx, frame_ts) - def plot_boxe_to_frame(self, data, frame): + def plot_box_to_frame(self, data, frame): confidence = float(data[4]) for detected_box_object in self.detected_box_objects: @@ -126,7 +138,7 @@ class DodgeballTracker: def _get_tracker(self): return DeepOCSORT( Path('lmbn_n_cuhk03_d.pt'), # which ReID model to use - torch.device("cpu"), + torch.device(get_best_available_torch_device()), True, ) @@ -151,10 +163,8 @@ class DodgeballTracker: # run the YOLO model on the frame res = [] detections = self.run_model_on_frame(model, frame) - print("ici?") for data in detections.boxes.data.tolist(): - print("la?") - is_good_box = self.plot_boxe_to_frame(data, frame) + is_good_box = self.plot_box_to_frame(data, frame) if is_good_box: res.append(data) diff --git a/flake.nix b/flake.nix index f279941..807b09c 100644 --- a/flake.nix +++ b/flake.nix @@ -2,24 +2,40 @@ description = "Pre-built CPU-only OpenCV packages for Python. "; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; - opencv-python-related.url = "gitlab:all-dressed-programming/opencv-python-related"; + opencv-python-related.url = + "gitlab:all-dressed-programming/opencv-python-related"; + opencv-python-related.home-manager.inputs.nixpkgs.follows = "nixpkgs"; flake-utils.url = "github:numtide/flake-utils"; }; + nixConfig = { + extra-substituters = [ "https://cuda-maintainers.cachix.org" ]; + extra-trusted-public-keys = [ + "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" + ]; + }; + outputs = { self, nixpkgs, flake-utils, opencv-python-related }: flake-utils.lib.eachDefaultSystem (system: let - pkgs = nixpkgs.legacyPackages.${system}; - pythonPackages = pkgs.python312Packages // opencv-python-related.packages.${system}.python312Packages; - virtual-env = pkgs.python312.withPackages (ps: [ ps.matplotlib - pythonPackages.opencv4 - pythonPackages.boxmot - pythonPackages.ultralytics ]); + pkgs = import nixpkgs { + system = system; + config.allowUnfree = true; + }; + pythonPackages = pkgs.python312Packages + // opencv-python-related.packages.${system}.python312Packages; + virtual-env = pkgs.python312.withPackages (ps: [ + ps.matplotlib + ps.torchWithCuda + # pythonPackages.opencv4 + # pythonPackages.boxmot + # pythonPackages.ultralytics + ]); in { - packages = { - env = virtual-env; + packages = { env = virtual-env; }; + devShells.default = pkgs.mkShell { + buildInputs = [ virtual-env pkgs.yt-dlp pkgs.ffmpeg_7 ]; }; - devShells.default = pkgs.mkShell { buildInputs = [ virtual-env pkgs.yt-dlp pkgs.ffmpeg_7]; }; }); } From 7179ff5fc1e750f904c071687103a17c57e4a0fd Mon Sep 17 00:00:00 2001 From: didier amyot Date: Sat, 2 Nov 2024 07:30:23 -0400 Subject: [PATCH 06/11] updated flake --- flake.lock | 32 +++++++++----------------------- flake.nix | 2 +- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/flake.lock b/flake.lock index cb814bb..db535da 100644 --- a/flake.lock +++ b/flake.lock @@ -38,27 +38,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1729595756, - "narHash": "sha256-rNaLWDqjgy23Y6M3K/e7Kiyimq04ikDMrErpqgXWcV0=", + "lastModified": 1730272153, + "narHash": "sha256-B5WRZYsRlJgwVHIV6DvidFN7VX7Fg9uuwkRW9Ha8z+w=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "782740762fb281404740b6b7084d356c3dab1173", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { - "locked": { - "lastModified": 1729595756, - "narHash": "sha256-rNaLWDqjgy23Y6M3K/e7Kiyimq04ikDMrErpqgXWcV0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "782740762fb281404740b6b7084d356c3dab1173", + "rev": "2d2a9ddbe3f2c00747398f3dc9b05f7f2ebb0f53", "type": "github" }, "original": { @@ -71,14 +55,16 @@ "opencv-python-related": { "inputs": { "flake-utils": "flake-utils_2", - "nixpkgs": "nixpkgs_2" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { - "lastModified": 1729677213, - "narHash": "sha256-n+g2ROk4ytvZW84+vjaQMarVI/sFoiEUXxMxPnlM9BU=", + "lastModified": 1730543263, + "narHash": "sha256-bosBOrQgq6OKhGDRg9mHakjx1pof79ZdQhBQUADNlf8=", "owner": "all-dressed-programming", "repo": "opencv-python-related", - "rev": "fb816cdf83b7779962c6b8479b377b2927a9ea2d", + "rev": "eb2f223c301019bcadade89a388790c2e32ce9d6", "type": "gitlab" }, "original": { diff --git a/flake.nix b/flake.nix index 807b09c..4399f74 100644 --- a/flake.nix +++ b/flake.nix @@ -4,7 +4,7 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; opencv-python-related.url = "gitlab:all-dressed-programming/opencv-python-related"; - opencv-python-related.home-manager.inputs.nixpkgs.follows = "nixpkgs"; + opencv-python-related.inputs.nixpkgs.follows = "nixpkgs"; flake-utils.url = "github:numtide/flake-utils"; }; From d7017c756bfb7b466acf8ab329c226c33862fcd4 Mon Sep 17 00:00:00 2001 From: didier amyot Date: Sat, 2 Nov 2024 14:11:18 -0400 Subject: [PATCH 07/11] definitively going somewhere. --- .envrc | 1 + .gitignore | 1 + dodgeballtracker/__main__.py | 57 +++++++++++++++++++++++---- dodgeballtracker/helper.py | 17 ++------ dodgeballtracker/logic.py | 30 +++++++------- dodgeballtracker/video_writer.py | 67 ++++++++++++++++++++++++++++++++ flake.nix | 7 ++-- 7 files changed, 139 insertions(+), 41 deletions(-) create mode 100644 .envrc create mode 100644 dodgeballtracker/video_writer.py diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 6c14865..b46071c 100644 --- a/.gitignore +++ b/.gitignore @@ -159,3 +159,4 @@ env *.pt *.png *.ipynb +.direnv diff --git a/dodgeballtracker/__main__.py b/dodgeballtracker/__main__.py index 3a5a70d..a419fb2 100644 --- a/dodgeballtracker/__main__.py +++ b/dodgeballtracker/__main__.py @@ -1,28 +1,69 @@ +import time +from contextlib import closing from pathlib import Path +from dodgeballtracker.helper import time_tracker from dodgeballtracker.logic import (DetectedObjectBox, DodgeballTracker, get_court_perspective_transform) import numpy as np import logging +import click +from typing import ContextManager +from dodgeballtracker.video_writer import (MP4VVideoWriter, VideoWriter, + MP4VVideoWriterWithFrame) here = Path(__file__).parent input_dir = here / '..' / 'data' output_dir = here / '..' / 'outputs' -if __name__ == "__main__": + +@click.group() +@click.option('--debug/--no-debug', default=False) +def cli(debug): logging.basicConfig(filename='tracker.log', level=logging.DEBUG) - detected_box_objects = [ - DetectedObjectBox.from_viridis(threshold) for threshold in np.arange(0.5, 1, 0.05) - ] - input_video = input_dir / "small.mp4" - output_video = output_dir / "foo.mp4" +def get_output(input_: Path, proposed_output: Path | None) -> Path: + if proposed_output is not None: + return proposed_output + return output_dir / input_.name + + +def get_video_writer(display_frame: bool, + video_input: Path, + video_output: Path) -> ContextManager[VideoWriter]: + if display_frame: + return closing( + MP4VVideoWriterWithFrame.from_frame(video_input, video_output)) + return closing(MP4VVideoWriter.from_frame(video_input, video_output)) + + +@cli.command() +@click.option('--input', '-i', 'input_', + type=click.Path(readable=True, path_type=Path)) +@click.option('--output', '-o', type=click.Path(path_type=Path)) +@click.option('--display-video', '-d', type=bool, is_flag=True, show_default=True, default=False) +def process(input_: Path, output: Path | None, display_video: bool): + output = get_output(input_, output) + detected_box_objects = [ + DetectedObjectBox.from_viridis(threshold) for threshold in + np.arange(0.5, 1, 0.05) + ] transformation_matrix = get_court_perspective_transform() - dodgeball_tracker = DodgeballTracker(input_video, output_video, detected_box_objects, transformation_matrix) + with get_video_writer(display_video, input_, output) as video_writer: + tracker = DodgeballTracker(input_, + output, + video_writer, + detected_box_objects, + transformation_matrix) - dodgeball_tracker.main() + with time_tracker(): + tracker.main() + + +if __name__ == "__main__": + cli() diff --git a/dodgeballtracker/helper.py b/dodgeballtracker/helper.py index 924ae95..41b0747 100644 --- a/dodgeballtracker/helper.py +++ b/dodgeballtracker/helper.py @@ -1,21 +1,10 @@ import contextlib import time import cv2 +import logging +logger = logging.getLogger(__name__) -def create_video_writer(video_cap, output_filename): - - # grab the width, height, and fps of the frames in the video stream. - frame_width = int(video_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) - frame_height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) - fps = int(video_cap.get(cv2.CAP_PROP_FPS)) - - # initialize the FourCC and a video writer object - fourcc = cv2.VideoWriter_fourcc(*'MP4V') - writer = cv2.VideoWriter(output_filename, fourcc, fps, - (frame_width, frame_height)) - - return writer def iter_frames(video_cap): @@ -31,4 +20,4 @@ def time_tracker(): start = time.monotonic() yield end = time.monotonic() - print(f"Time to process 1 frame: {(end-start) * 1000:.0f} milliseconds") \ No newline at end of file + logger.debug(f"Time to process 1 frame: {(end-start) * 1000:.0f} milliseconds") diff --git a/dodgeballtracker/logic.py b/dodgeballtracker/logic.py index 2477fae..d038dd2 100644 --- a/dodgeballtracker/logic.py +++ b/dodgeballtracker/logic.py @@ -4,7 +4,8 @@ import logging import torch from ultralytics import YOLO import cv2 -from dodgeballtracker.helper import create_video_writer, iter_frames +from dodgeballtracker.helper import iter_frames +from dodgeballtracker.video_writer import create_video_writer, VideoWriter import matplotlib import numpy as np from boxmot import DeepOcSort as DeepOCSORT @@ -15,15 +16,15 @@ logger = logging.getLogger(__name__) Color = tuple[int, int, int] -def get_best_available_torch_device(): +def get_best_available_torch_device() -> torch.device: if torch.cuda.is_available(): logger.debug("Using the cuda (gpu) torch device.") - return 'cuda' + return torch.device('cuda:0') if torch.backends.mps.is_available(): logger.debug("Using the mps (apple silicon) torch device.") - return 'mps' + return torch.device('mps') logger.debug("Default to cpu (no apple silicon or cuda) torch device.") - return 'cpu' + return torch.device('cpu') class DetectedObjectBox: @@ -66,16 +67,21 @@ def get_court_perspective_transform(): return cv2.getPerspectiveTransform(empirical_source, empirical_target) + + + class DodgeballTracker: def __init__(self, input_file: Path, output_file: Path, + video_writer: VideoWriter, detected_box_objects: list[DetectedObjectBox], transformation_matrix): self.input_path = input_file self.output_path = output_file self.output_json_path = output_file.with_suffix(".json") + self.video_writer = video_writer self.detected_box_objects = sorted(detected_box_objects, reverse=True) self.transformation_matrix = transformation_matrix self.points = [] @@ -138,7 +144,7 @@ class DodgeballTracker: def _get_tracker(self): return DeepOCSORT( Path('lmbn_n_cuhk03_d.pt'), # which ReID model to use - torch.device(get_best_available_torch_device()), + get_best_available_torch_device(), # torch.cuda.get_device_name(0), #torch.device(get_best_available_torch_device()), True, ) @@ -150,10 +156,8 @@ class DodgeballTracker: def main(self): # define some constants - print("started") - video_cap = cv2.VideoCapture(str(self.input_path)) - writer = create_video_writer(video_cap, str(self.output_path)) + # writer = create_video_writer(video_cap, self.output_path) tracker = self._get_tracker() # load the pre-trained YOLOv8n model @@ -168,19 +172,13 @@ class DodgeballTracker: if is_good_box: res.append(data) - # show the frame to our screen - print("tracker?") data_ = tracker.update(np.array(res), frame) self.print_tracker_data(data_, i, ts) - self.write_frame(writer, frame) + self.video_writer.write_frame(frame) if cv2.waitKey(1) == ord("q"): break - print("fini") video_cap.release() - writer.release() - cv2.destroyAllWindows() self.persist_points() - print("finished") diff --git a/dodgeballtracker/video_writer.py b/dodgeballtracker/video_writer.py new file mode 100644 index 0000000..2d3468e --- /dev/null +++ b/dodgeballtracker/video_writer.py @@ -0,0 +1,67 @@ +import abc +from pathlib import Path + +import cv2 + +def create_video_writer(video_cap: cv2.VideoCapture, output_filename: Path) -> cv2.VideoWriter: + + # grab the width, height, and fps of the frames in the video stream. + frame_width = int(video_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + frame_height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) + fps = int(video_cap.get(cv2.CAP_PROP_FPS)) + + # initialize the FourCC and a video writer object + fourcc = cv2.VideoWriter_fourcc(*'mp4v') + writer = cv2.VideoWriter(str(output_filename.absolute()), + fourcc, + fps, + (frame_width, frame_height)) + + return writer + + +class VideoWriter(abc.ABC): + + @abc.abstractmethod + def write_frame(self, frame) -> None: + pass + + @abc.abstractmethod + def close(self) -> None: + pass + + +class NoopVideoWriter(VideoWriter): + + def write_frame(self, frame) -> None: + pass + + def close(self) -> None: + pass + + +class MP4VVideoWriter(VideoWriter): + + def __init__(self, video_writer: cv2.VideoWriter) -> None: + self._video_writer = video_writer + + def write_frame(self, frame) -> None: + self._video_writer.write(frame) + + def close(self) -> None: + self._video_writer.release() + cv2.destroyAllWindows() + + @classmethod + def from_frame(cls, input_: Path, output: Path) -> VideoWriter: + video_cap = cv2.VideoCapture(str(input_)) + try: + return cls(create_video_writer(video_cap, output)) + finally: + video_cap.release() + + +class MP4VVideoWriterWithFrame(MP4VVideoWriter): + def write_frame(self, frame) -> None: + super().write_frame(frame) + cv2.imshow("Frame", frame) diff --git a/flake.nix b/flake.nix index 4399f74..b7e2372 100644 --- a/flake.nix +++ b/flake.nix @@ -27,9 +27,10 @@ virtual-env = pkgs.python312.withPackages (ps: [ ps.matplotlib ps.torchWithCuda - # pythonPackages.opencv4 - # pythonPackages.boxmot - # pythonPackages.ultralytics + pythonPackages.opencv4 + pythonPackages.boxmot + pythonPackages.ultralytics + pythonPackages.click ]); in { From 152b3b9da534b35c96c5c59315781254a3f7cbde Mon Sep 17 00:00:00 2001 From: didier amyot Date: Sat, 2 Nov 2024 14:57:59 -0400 Subject: [PATCH 08/11] definitively going somewhere. --- dodgeballtracker/helper.py | 4 +++- dodgeballtracker/logic.py | 29 ++++++++--------------------- dodgeballtracker/typing.py | 7 +++++++ dodgeballtracker/video_writer.py | 23 ++++++++++++++++++----- 4 files changed, 36 insertions(+), 27 deletions(-) create mode 100644 dodgeballtracker/typing.py diff --git a/dodgeballtracker/helper.py b/dodgeballtracker/helper.py index 41b0747..4fac932 100644 --- a/dodgeballtracker/helper.py +++ b/dodgeballtracker/helper.py @@ -1,5 +1,7 @@ import contextlib import time +from typing import Iterator +from dodgeballtracker.typing import VideoFrame, VideoTimestamp import cv2 import logging @@ -7,7 +9,7 @@ logger = logging.getLogger(__name__) -def iter_frames(video_cap): +def iter_frames(video_cap) -> Iterator[tuple[VideoFrame, VideoTimestamp]]: while 1: ret, frame = video_cap.read() if not ret: diff --git a/dodgeballtracker/logic.py b/dodgeballtracker/logic.py index d038dd2..bc021f8 100644 --- a/dodgeballtracker/logic.py +++ b/dodgeballtracker/logic.py @@ -1,4 +1,5 @@ import json +from collections import Counter from pathlib import Path import logging import torch @@ -9,7 +10,7 @@ from dodgeballtracker.video_writer import create_video_writer, VideoWriter import matplotlib import numpy as np from boxmot import DeepOcSort as DeepOCSORT - +from .typing import VideoFrame logger = logging.getLogger(__name__) @@ -111,7 +112,7 @@ class DodgeballTracker: for d in tracker_data: self.print_box(d, frame_idx, frame_ts) - def plot_box_to_frame(self, data, frame): + def plot_box_to_frame(self, data, frame: VideoFrame): confidence = float(data[4]) for detected_box_object in self.detected_box_objects: @@ -121,22 +122,9 @@ class DodgeballTracker: return True return False - def run_model_on_frame(self, model, frame): + def run_model_on_frame(self, model, frame: VideoFrame): return model(frame)[0] - def crazy_experiment(self, frame): - cv2.putText(frame, - "Hello world", - (50, 50), - cv2.FONT_HERSHEY_SIMPLEX, - 2, - (0, 255, 0), 8) - cv2.line(frame, (0, 0), (511, 511), (255, 0, 0), 5) - pts = np.array([[50, 50], [500, 50], [500, 500], [50, 500], [50, 50]], np.int32) - pts = pts.reshape((-1, 1, 2)) - - cv2.polylines(frame, pts, True, (0, 255, 255), 8) - def persist_points(self): with open(self.output_json_path, "wt") as file_: json.dump({"points": self.points}, file_, indent=4) @@ -144,7 +132,7 @@ class DodgeballTracker: def _get_tracker(self): return DeepOCSORT( Path('lmbn_n_cuhk03_d.pt'), # which ReID model to use - get_best_available_torch_device(), # torch.cuda.get_device_name(0), #torch.device(get_best_available_torch_device()), + get_best_available_torch_device(), True, ) @@ -157,11 +145,9 @@ class DodgeballTracker: def main(self): # define some constants video_cap = cv2.VideoCapture(str(self.input_path)) - # writer = create_video_writer(video_cap, self.output_path) tracker = self._get_tracker() - - # load the pre-trained YOLOv8n model model = self._get_detection_model() + counter = Counter() for i, (frame, ts) in enumerate(iter_frames(video_cap)): # run the YOLO model on the frame @@ -177,8 +163,9 @@ class DodgeballTracker: self.video_writer.write_frame(frame) - if cv2.waitKey(1) == ord("q"): + if self.video_writer.wait(): break + print(f"counter: {counter}") video_cap.release() self.persist_points() diff --git a/dodgeballtracker/typing.py b/dodgeballtracker/typing.py new file mode 100644 index 0000000..0a011ea --- /dev/null +++ b/dodgeballtracker/typing.py @@ -0,0 +1,7 @@ +from typing import NewType + +type XCoord = float +type YCoord = NewType('YCoord', float) +type Point = tuple[XCoord, YCoord] +type VideoFrame = NewType('Frame', float) +type VideoTimestamp = float diff --git a/dodgeballtracker/video_writer.py b/dodgeballtracker/video_writer.py index 2d3468e..c699a56 100644 --- a/dodgeballtracker/video_writer.py +++ b/dodgeballtracker/video_writer.py @@ -1,6 +1,6 @@ import abc from pathlib import Path - +from dodgeballtracker.typing import VideoFrame import cv2 def create_video_writer(video_cap: cv2.VideoCapture, output_filename: Path) -> cv2.VideoWriter: @@ -23,35 +23,45 @@ def create_video_writer(video_cap: cv2.VideoCapture, output_filename: Path) -> c class VideoWriter(abc.ABC): @abc.abstractmethod - def write_frame(self, frame) -> None: + def write_frame(self, frame: VideoFrame) -> None: pass @abc.abstractmethod def close(self) -> None: pass + @abc.abstractmethod + def wait(self) -> bool: + pass + class NoopVideoWriter(VideoWriter): - def write_frame(self, frame) -> None: + def write_frame(self, frame: VideoFrame) -> None: pass def close(self) -> None: pass + def wait(self) -> bool: + return False + class MP4VVideoWriter(VideoWriter): def __init__(self, video_writer: cv2.VideoWriter) -> None: self._video_writer = video_writer - def write_frame(self, frame) -> None: + def write_frame(self, frame: VideoFrame) -> None: self._video_writer.write(frame) def close(self) -> None: self._video_writer.release() cv2.destroyAllWindows() + def wait(self) -> bool: + return False #cv2.waitKey(1) == ord("q") + @classmethod def from_frame(cls, input_: Path, output: Path) -> VideoWriter: video_cap = cv2.VideoCapture(str(input_)) @@ -62,6 +72,9 @@ class MP4VVideoWriter(VideoWriter): class MP4VVideoWriterWithFrame(MP4VVideoWriter): - def write_frame(self, frame) -> None: + def write_frame(self, frame: VideoFrame) -> None: super().write_frame(frame) cv2.imshow("Frame", frame) + + def wait(self) -> bool: + return cv2.waitKey(1) == ord("q") From 2c798c8ca5f543de10bae8a6c26a9f9414c7391f Mon Sep 17 00:00:00 2001 From: didier amyot Date: Mon, 4 Nov 2024 05:13:31 -0500 Subject: [PATCH 09/11] Commiting with problems in tracking. --- dodgeballtracker/__main__.py | 13 ++++---- dodgeballtracker/logic.py | 51 +++++++++++--------------------- dodgeballtracker/typing.py | 40 +++++++++++++++++++++---- dodgeballtracker/video_writer.py | 49 ++++++++++++++++++++++++++---- flake.nix | 1 + 5 files changed, 105 insertions(+), 49 deletions(-) diff --git a/dodgeballtracker/__main__.py b/dodgeballtracker/__main__.py index a419fb2..10762c2 100644 --- a/dodgeballtracker/__main__.py +++ b/dodgeballtracker/__main__.py @@ -1,17 +1,17 @@ -import time from contextlib import closing from pathlib import Path from dodgeballtracker.helper import time_tracker -from dodgeballtracker.logic import (DetectedObjectBox, - DodgeballTracker, +from dodgeballtracker.logic import (DodgeballTracker, get_court_perspective_transform) import numpy as np import logging import click from typing import ContextManager -from dodgeballtracker.video_writer import (MP4VVideoWriter, VideoWriter, +from dodgeballtracker.video_writer import (MP4VVideoWriter, + VideoWriter, + DetectedObjectBox, MP4VVideoWriterWithFrame) here = Path(__file__).parent @@ -34,10 +34,11 @@ def get_output(input_: Path, proposed_output: Path | None) -> Path: def get_video_writer(display_frame: bool, video_input: Path, video_output: Path) -> ContextManager[VideoWriter]: + thresholds = list(np.arange(0.5, 1, 0.05)) if display_frame: return closing( - MP4VVideoWriterWithFrame.from_frame(video_input, video_output)) - return closing(MP4VVideoWriter.from_frame(video_input, video_output)) + MP4VVideoWriterWithFrame.from_frame(video_input, video_output, thresholds)) + return closing(MP4VVideoWriter.from_frame(video_input, video_output, thresholds)) @cli.command() diff --git a/dodgeballtracker/logic.py b/dodgeballtracker/logic.py index bc021f8..ca5e11d 100644 --- a/dodgeballtracker/logic.py +++ b/dodgeballtracker/logic.py @@ -1,16 +1,14 @@ import json -from collections import Counter from pathlib import Path import logging import torch from ultralytics import YOLO import cv2 from dodgeballtracker.helper import iter_frames -from dodgeballtracker.video_writer import create_video_writer, VideoWriter -import matplotlib +from dodgeballtracker.video_writer import VideoWriter, DetectedObjectBox import numpy as np from boxmot import DeepOcSort as DeepOCSORT -from .typing import VideoFrame +from .typing import VideoFrame, DetectedObject logger = logging.getLogger(__name__) @@ -28,21 +26,6 @@ def get_best_available_torch_device() -> torch.device: return torch.device('cpu') -class DetectedObjectBox: - def __init__(self, min_threshold: float, color: Color): - self.min_threshold = min_threshold - self.color = color - - def __lt__(self, other): - return self.min_threshold < other.min_threshold - - @classmethod - def from_viridis(cls, min_threshold): - cm = matplotlib.colormaps['viridis'] - color: Color = tuple((int(255 * cm(min_threshold)[i]) for i in range(3))) - return cls(min_threshold, color) - - def get_court_perspective_transform(): """ """ @@ -117,13 +100,17 @@ class DodgeballTracker: for detected_box_object in self.detected_box_objects: if detected_box_object.min_threshold < confidence: - xmin, ymin, xmax, ymax = self.extract_box(data) - cv2.rectangle(frame, (xmin, ymin), (xmax, ymax), detected_box_object.color, 2) + # xmin, ymin, xmax, ymax = self.extract_box(data) + # cv2.rectangle(frame, (xmin, ymin), (xmax, ymax), detected_box_object.color, 2) return True return False def run_model_on_frame(self, model, frame: VideoFrame): - return model(frame)[0] + model_outputs = model(frame)[0] + for data in model_outputs.boxes.data.tolist(): + detected_obj = DetectedObject(*data) + if detected_obj.confidence > 0.5: + yield detected_obj def persist_points(self): with open(self.output_json_path, "wt") as file_: @@ -142,30 +129,28 @@ class DodgeballTracker: """ return YOLO("yolo11n.pt", verbose=True) + def update_tracker(self, tracker, detected_objs: list[DetectedObject], frame: VideoFrame) -> None: + important_detected_objs = [do for do in detected_objs if do.confidence > 0.5] + def main(self): # define some constants video_cap = cv2.VideoCapture(str(self.input_path)) tracker = self._get_tracker() model = self._get_detection_model() - counter = Counter() for i, (frame, ts) in enumerate(iter_frames(video_cap)): # run the YOLO model on the frame - res = [] - detections = self.run_model_on_frame(model, frame) - for data in detections.boxes.data.tolist(): - is_good_box = self.plot_box_to_frame(data, frame) - if is_good_box: - res.append(data) - - data_ = tracker.update(np.array(res), frame) - self.print_tracker_data(data_, i, ts) + detected_objs = list(self.run_model_on_frame(model, frame)) + self.video_writer.plot_boxes_to_frame(detected_objs, frame) + # data_ = tracker.update(np.array([dobj.as_nparray() for dobj in detected_objs]), frame) + # if data_: + # print("dkld") + # self.print_tracker_data(data_, i, ts) self.video_writer.write_frame(frame) if self.video_writer.wait(): break - print(f"counter: {counter}") video_cap.release() self.persist_points() diff --git a/dodgeballtracker/typing.py b/dodgeballtracker/typing.py index 0a011ea..334802f 100644 --- a/dodgeballtracker/typing.py +++ b/dodgeballtracker/typing.py @@ -1,7 +1,37 @@ from typing import NewType +from dataclasses import dataclass +import numpy as np -type XCoord = float -type YCoord = NewType('YCoord', float) -type Point = tuple[XCoord, YCoord] -type VideoFrame = NewType('Frame', float) -type VideoTimestamp = float +XCoord = NewType('XCoord', float) +YCoord = NewType('YCoord', float) +Confidence = NewType('Confidence', float) +Category = NewType('Category', float) + + + +@dataclass +class Point: + x: XCoord + y: YCoord + +VideoFrame = NewType('Frame', float) +VideoTimestamp = float + +@dataclass +class DetectedObject: + xmin: XCoord + ymin: YCoord + xmax: XCoord + ymax: YCoord + confidence: Confidence + category: Category + + def as_int_box(self) -> tuple[tuple[int, int], tuple[int, int]]: + return (int(self.xmin), int(self.ymin)), (int(self.xmax), int(self.ymax)) + + def as_nparray(self): + return np.array([self.xmin, self.ymax, self.xmax, self.ymax, self.confidence, self.category]) + + + +Color = tuple[int, int, int] \ No newline at end of file diff --git a/dodgeballtracker/video_writer.py b/dodgeballtracker/video_writer.py index c699a56..293e8f6 100644 --- a/dodgeballtracker/video_writer.py +++ b/dodgeballtracker/video_writer.py @@ -1,8 +1,25 @@ import abc from pathlib import Path -from dodgeballtracker.typing import VideoFrame +from dodgeballtracker.typing import VideoFrame, DetectedObject, Color +import matplotlib import cv2 + +class DetectedObjectBox: + def __init__(self, min_threshold: float, color: Color): + self.min_threshold = min_threshold + self.color = color + + def __lt__(self, other): + return self.min_threshold < other.min_threshold + + @classmethod + def from_viridis(cls, min_threshold): + cm = matplotlib.colormaps['viridis'] + color: Color = tuple((int(255 * cm(min_threshold)[i]) for i in range(3))) + return cls(min_threshold, color) + + def create_video_writer(video_cap: cv2.VideoCapture, output_filename: Path) -> cv2.VideoWriter: # grab the width, height, and fps of the frames in the video stream. @@ -26,6 +43,10 @@ class VideoWriter(abc.ABC): def write_frame(self, frame: VideoFrame) -> None: pass + @abc.abstractmethod + def plot_boxes_to_frame(self, data: list[DetectedObject], frame: VideoFrame) -> None: + pass + @abc.abstractmethod def close(self) -> None: pass @@ -37,6 +58,9 @@ class VideoWriter(abc.ABC): class NoopVideoWriter(VideoWriter): + def plot_boxes_to_frame(self, boxes: list[DetectedObject], frame: VideoFrame) -> None: + pass + def write_frame(self, frame: VideoFrame) -> None: pass @@ -49,24 +73,39 @@ class NoopVideoWriter(VideoWriter): class MP4VVideoWriter(VideoWriter): - def __init__(self, video_writer: cv2.VideoWriter) -> None: + def __init__(self, video_writer: cv2.VideoWriter, thresholds: list[DetectedObjectBox]) -> None: self._video_writer = video_writer + self._thresholds = thresholds def write_frame(self, frame: VideoFrame) -> None: self._video_writer.write(frame) + def plot_box_to_frame(self, data: DetectedObject, frame: VideoFrame) -> None: + confidence = float(data.confidence) + for threshold in self._thresholds: + if threshold.min_threshold < confidence: + # xmin, ymin, xmax, ymax = self._extract_box(data) + cv2.rectangle(frame, *data.as_int_box(), threshold.color, 2) + return + + def plot_boxes_to_frame(self, boxes: list[DetectedObject], frame: VideoFrame) -> None: + for box in boxes: + self.plot_box_to_frame(box, frame) + + def close(self) -> None: self._video_writer.release() cv2.destroyAllWindows() def wait(self) -> bool: - return False #cv2.waitKey(1) == ord("q") + return False @classmethod - def from_frame(cls, input_: Path, output: Path) -> VideoWriter: + def from_frame(cls, input_: Path, output: Path, thresholds: list[float]) -> VideoWriter: + object_drawers = [DetectedObjectBox.from_viridis(t) for t in thresholds] video_cap = cv2.VideoCapture(str(input_)) try: - return cls(create_video_writer(video_cap, output)) + return cls(create_video_writer(video_cap, output), object_drawers) finally: video_cap.release() diff --git a/flake.nix b/flake.nix index b7e2372..359e704 100644 --- a/flake.nix +++ b/flake.nix @@ -27,6 +27,7 @@ virtual-env = pkgs.python312.withPackages (ps: [ ps.matplotlib ps.torchWithCuda + ps.jupyter pythonPackages.opencv4 pythonPackages.boxmot pythonPackages.ultralytics From 35c5ab9a32b2200d183b2654bcc37820b91b8af5 Mon Sep 17 00:00:00 2001 From: didier amyot Date: Mon, 4 Nov 2024 06:18:14 -0500 Subject: [PATCH 10/11] going somewhere. --- .gitignore | 1 + dodgeballtracker/logic.py | 13 ++++++++--- dodgeballtracker/typing.py | 6 +++--- dodgeballtracker/video_writer.py | 2 +- flake.nix | 37 +++++++++++++++++++++++++++++++- 5 files changed, 51 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index b46071c..a56370a 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,4 @@ env *.png *.ipynb .direnv +result diff --git a/dodgeballtracker/logic.py b/dodgeballtracker/logic.py index ca5e11d..b40b1e5 100644 --- a/dodgeballtracker/logic.py +++ b/dodgeballtracker/logic.py @@ -107,9 +107,12 @@ class DodgeballTracker: def run_model_on_frame(self, model, frame: VideoFrame): model_outputs = model(frame)[0] + return model_outputs.boxes.data.cpu().numpy() + # return model_outputs.boxes.data.tolist() + foo = model_outputs.boxes.data for data in model_outputs.boxes.data.tolist(): detected_obj = DetectedObject(*data) - if detected_obj.confidence > 0.5: + if detected_obj.score > 0.5: yield detected_obj def persist_points(self): @@ -130,7 +133,7 @@ class DodgeballTracker: return YOLO("yolo11n.pt", verbose=True) def update_tracker(self, tracker, detected_objs: list[DetectedObject], frame: VideoFrame) -> None: - important_detected_objs = [do for do in detected_objs if do.confidence > 0.5] + important_detected_objs = [do for do in detected_objs if do.score > 0.5] def main(self): # define some constants @@ -141,7 +144,11 @@ class DodgeballTracker: for i, (frame, ts) in enumerate(iter_frames(video_cap)): # run the YOLO model on the frame detected_objs = list(self.run_model_on_frame(model, frame)) - self.video_writer.plot_boxes_to_frame(detected_objs, frame) + data_ = tracker.update( + np.array(detected_objs), frame) + if i == 100: + print(data_) + # self.video_writer.plot_boxes_to_frame(detected_objs, frame) # data_ = tracker.update(np.array([dobj.as_nparray() for dobj in detected_objs]), frame) # if data_: # print("dkld") diff --git a/dodgeballtracker/typing.py b/dodgeballtracker/typing.py index 334802f..d8612e5 100644 --- a/dodgeballtracker/typing.py +++ b/dodgeballtracker/typing.py @@ -4,7 +4,7 @@ import numpy as np XCoord = NewType('XCoord', float) YCoord = NewType('YCoord', float) -Confidence = NewType('Confidence', float) +Score = NewType('Confidence', float) Category = NewType('Category', float) @@ -23,14 +23,14 @@ class DetectedObject: ymin: YCoord xmax: XCoord ymax: YCoord - confidence: Confidence + score: Score category: Category def as_int_box(self) -> tuple[tuple[int, int], tuple[int, int]]: return (int(self.xmin), int(self.ymin)), (int(self.xmax), int(self.ymax)) def as_nparray(self): - return np.array([self.xmin, self.ymax, self.xmax, self.ymax, self.confidence, self.category]) + return np.array([self.xmin, self.ymax, self.xmax, self.ymax, self.score, self.category]) diff --git a/dodgeballtracker/video_writer.py b/dodgeballtracker/video_writer.py index 293e8f6..0c0273f 100644 --- a/dodgeballtracker/video_writer.py +++ b/dodgeballtracker/video_writer.py @@ -81,7 +81,7 @@ class MP4VVideoWriter(VideoWriter): self._video_writer.write(frame) def plot_box_to_frame(self, data: DetectedObject, frame: VideoFrame) -> None: - confidence = float(data.confidence) + confidence = float(data.score) for threshold in self._thresholds: if threshold.min_threshold < confidence: # xmin, ymin, xmax, ymax = self._extract_box(data) diff --git a/flake.nix b/flake.nix index 359e704..5d92b2a 100644 --- a/flake.nix +++ b/flake.nix @@ -22,8 +22,42 @@ system = system; config.allowUnfree = true; }; + pythonPackages = pkgs.python312Packages // opencv-python-related.packages.${system}.python312Packages; + + pandera = pkgs.python3Packages.buildPythonPackage { + version = "0.5.11"; + pname = "lapx"; + pyproject = true; + src = pkgs.python3Packages.fetchPypi { + pname = "pandera"; + version = "0.20.4"; + hash = "sha256-zPYXgpPvnUOT3Ed25HR349LdUcgA7N/t7Gf/9Q9K08I="; + + }; + + propagatedBuildInputs = with pythonPackages; [ multimethod + numpy + pandas + pydantic + typeguard + typing-inspect + wrapt + ]; + + nativeBuildInputs = with pythonPackages; [ + setuptools + ]; + + meta = with pkgs.lib; { + description = "The Open-source Framework for Precision Data Testing"; + homepage = "https://github.com/unionai-oss/pandera"; + license = pkgs.lib.licenses.mit; + maintainers = with maintainers; [ ]; + }; + }; + virtual-env = pkgs.python312.withPackages (ps: [ ps.matplotlib ps.torchWithCuda @@ -32,10 +66,11 @@ pythonPackages.boxmot pythonPackages.ultralytics pythonPackages.click + pandera ]); in { - packages = { env = virtual-env; }; + packages = { env = virtual-env; pandera = pandera; }; devShells.default = pkgs.mkShell { buildInputs = [ virtual-env pkgs.yt-dlp pkgs.ffmpeg_7 ]; }; From af291993a3a0c2561115857c11983735ad4ef1ee Mon Sep 17 00:00:00 2001 From: didier amyot Date: Mon, 4 Nov 2024 18:17:11 -0500 Subject: [PATCH 11/11] added pandera --- dodgeballtracker/logic.py | 39 +++++++++++++++++--------------------- dodgeballtracker/typing.py | 22 +++++++++++++++++++++ 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/dodgeballtracker/logic.py b/dodgeballtracker/logic.py index b40b1e5..c9c6f0d 100644 --- a/dodgeballtracker/logic.py +++ b/dodgeballtracker/logic.py @@ -7,8 +7,10 @@ import cv2 from dodgeballtracker.helper import iter_frames from dodgeballtracker.video_writer import VideoWriter, DetectedObjectBox import numpy as np +import pandas as pd +import pandera as pa from boxmot import DeepOcSort as DeepOCSORT -from .typing import VideoFrame, DetectedObject +from .typing import VideoFrame, DetectedObject_ logger = logging.getLogger(__name__) @@ -105,21 +107,18 @@ class DodgeballTracker: return True return False + @pa.check_output(DetectedObject_) def run_model_on_frame(self, model, frame: VideoFrame): model_outputs = model(frame)[0] - return model_outputs.boxes.data.cpu().numpy() - # return model_outputs.boxes.data.tolist() - foo = model_outputs.boxes.data - for data in model_outputs.boxes.data.tolist(): - detected_obj = DetectedObject(*data) - if detected_obj.score > 0.5: - yield detected_obj + boxes = model_outputs.boxes.data.cpu().numpy() + columns=['xmin', 'ymin', 'xmax', 'ymin', 'score', 'category'] + return pd.DataFrame(boxes, columns=columns) def persist_points(self): with open(self.output_json_path, "wt") as file_: json.dump({"points": self.points}, file_, indent=4) - def _get_tracker(self): + def _get_tracker(self) -> DeepOCSORT: return DeepOCSORT( Path('lmbn_n_cuhk03_d.pt'), # which ReID model to use get_best_available_torch_device(), @@ -132,8 +131,11 @@ class DodgeballTracker: """ return YOLO("yolo11n.pt", verbose=True) - def update_tracker(self, tracker, detected_objs: list[DetectedObject], frame: VideoFrame) -> None: - important_detected_objs = [do for do in detected_objs if do.score > 0.5] + def update_tracker(self, tracker: DeepOCSORT, detected_objs, frame: VideoFrame): + data_ = tracker.update(detected_objs.to_numpy(), frame) + columns = ['xmin', 'ymin', 'xmax', 'ymin', 'object_id', 'score', 'category', 'index'] + return pd.DataFrame(data_, columns=columns) + def main(self): # define some constants @@ -143,18 +145,11 @@ class DodgeballTracker: for i, (frame, ts) in enumerate(iter_frames(video_cap)): # run the YOLO model on the frame - detected_objs = list(self.run_model_on_frame(model, frame)) - data_ = tracker.update( - np.array(detected_objs), frame) - if i == 100: - print(data_) + detected_objs = self.run_model_on_frame(model, frame) + tracked_obj = self.update_tracker(tracker, detected_objs, frame) # self.video_writer.plot_boxes_to_frame(detected_objs, frame) - # data_ = tracker.update(np.array([dobj.as_nparray() for dobj in detected_objs]), frame) - # if data_: - # print("dkld") - # self.print_tracker_data(data_, i, ts) - - self.video_writer.write_frame(frame) + # + # self.video_writer.write_frame(frame) if self.video_writer.wait(): break diff --git a/dodgeballtracker/typing.py b/dodgeballtracker/typing.py index d8612e5..5a9a71a 100644 --- a/dodgeballtracker/typing.py +++ b/dodgeballtracker/typing.py @@ -1,6 +1,8 @@ from typing import NewType from dataclasses import dataclass import numpy as np +import pandera as pa +from pandera.dtypes import Float32 XCoord = NewType('XCoord', float) YCoord = NewType('YCoord', float) @@ -33,5 +35,25 @@ class DetectedObject: return np.array([self.xmin, self.ymax, self.xmax, self.ymax, self.score, self.category]) +DetectedObject_ = pa.DataFrameSchema({ + "xmin": pa.Column(Float32), + "ymin": pa.Column(Float32), + "xmax": pa.Column(Float32), + "ymin": pa.Column(Float32), + "score": pa.Column(Float32), + "category": pa.Column(Float32), +}) + +TrackedDetectedObject_ = pa.DataFrameSchema({ + "xmin": pa.Column(Float32), + "ymin": pa.Column(Float32), + "xmax": pa.Column(Float32), + "ymin": pa.Column(Float32), + "object_id": pa.Column(Float32), + "score": pa.Column(Float32), + "category": pa.Column(Float32), + "index": pa.Column(Float32), +}) + Color = tuple[int, int, int] \ No newline at end of file