Skip to content

Instantly share code, notes, and snippets.

@nicholaswmin
Created February 21, 2026 06:52
Show Gist options
  • Select an option

  • Save nicholaswmin/697fdc8d9546544027ea2874d927d9bd to your computer and use it in GitHub Desktop.

Select an option

Save nicholaswmin/697fdc8d9546544027ea2874d927d9bd to your computer and use it in GitHub Desktop.
autopen — simulate Apple Pencil/Touch/Pointer input (Bitpaper experiments)

autopen

Simulate Apple Pencil Pro input on a DOM element. Dispatches realistic Pointer, Mouse, and Touch events.

Usage

import { Autopen } from './index.js'

const pen = new Autopen('/hello.json')
const items = await pen.draw(canvas)

Files

  • index.js — Autopen class
  • hello.json — 5-stroke "hello" handwriting, 924 points interpolated from 60Hz mouse input to 240Hz with sub-pixel coords
  • README.md

License

MIT

[
[
{
"x": 184.1,
"y": 207.7,
"createdAt": 1771653393483
},
{
"x": 184.2,
"y": 208.1,
"createdAt": 1771653393487
},
{
"x": 184,
"y": 208.3,
"createdAt": 1771653393491
},
{
"x": 183.9,
"y": 208.1,
"createdAt": 1771653393495
},
{
"x": 183.8,
"y": 208,
"createdAt": 1771653393499
},
{
"x": 183.9,
"y": 208.1,
"createdAt": 1771653393503
},
{
"x": 184.3,
"y": 207.9,
"createdAt": 1771653393507
},
{
"x": 183.7,
"y": 207.8,
"createdAt": 1771653393511
},
{
"x": 183.9,
"y": 207.8,
"createdAt": 1771653393515
},
{
"x": 183.7,
"y": 208.1,
"createdAt": 1771653393519
},
{
"x": 184,
"y": 208,
"createdAt": 1771653393523
},
{
"x": 184,
"y": 208,
"createdAt": 1771653393527
},
{
"x": 184.2,
"y": 208.3,
"createdAt": 1771653393531
},
{
"x": 183.8,
"y": 207.8,
"createdAt": 1771653393535
},
{
"x": 183.7,
"y": 208.2,
"createdAt": 1771653393539
},
{
"x": 184.3,
"y": 208,
"createdAt": 1771653393543
},
{
"x": 183.7,
"y": 208.2,
"createdAt": 1771653393547
},
{
"x": 184,
"y": 207.8,
"createdAt": 1771653393551
},
{
"x": 183.8,
"y": 208.1,
"createdAt": 1771653393555
},
{
"x": 184,
"y": 207.9,
"createdAt": 1771653393559
},
{
"x": 184.1,
"y": 208,
"createdAt": 1771653393563
},
{
"x": 183.8,
"y": 208.2,
"createdAt": 1771653393567
},
{
"x": 184,
"y": 208.2,
"createdAt": 1771653393571
},
{
"x": 183.7,
"y": 207.8,
"createdAt": 1771653393575
},
{
"x": 183.8,
"y": 207.8,
"createdAt": 1771653393579
},
{
"x": 184.2,
"y": 208,
"createdAt": 1771653393583
},
{
"x": 183.8,
"y": 207.7,
"createdAt": 1771653393587
},
{
"x": 184.2,
"y": 207.8,
"createdAt": 1771653393591
},
{
"x": 183.9,
"y": 208.1,
"createdAt": 1771653393595
},
{
"x": 184.2,
"y": 207.9,
"createdAt": 1771653393599
},
{
"x": 184,
"y": 207.8,
"createdAt": 1771653393603
},
{
"x": 184.1,
"y": 208,
"createdAt": 1771653393607
},
{
"x": 183.8,
"y": 208.1,
"createdAt": 1771653393611
},
{
"x": 183.9,
"y": 208,
"createdAt": 1771653393615
},
{
"x": 183.8,
"y": 207.9,
"createdAt": 1771653393619
},
{
"x": 184,
"y": 207.8,
"createdAt": 1771653393623
},
{
"x": 184.2,
"y": 208.1,
"createdAt": 1771653393627
},
{
"x": 183.9,
"y": 208.2,
"createdAt": 1771653393631
},
{
"x": 184,
"y": 208.7,
"createdAt": 1771653393635
},
{
"x": 184.3,
"y": 208.9,
"createdAt": 1771653393639
},
{
"x": 184.1,
"y": 209.5,
"createdAt": 1771653393643
},
{
"x": 184,
"y": 210.2,
"createdAt": 1771653393647
},
{
"x": 184.2,
"y": 211.1,
"createdAt": 1771653393651
},
{
"x": 184.2,
"y": 212.2,
"createdAt": 1771653393655
},
{
"x": 184,
"y": 213.2,
"createdAt": 1771653393659
},
{
"x": 184.2,
"y": 213.9,
"createdAt": 1771653393663
},
{
"x": 184.1,
"y": 215.2,
"createdAt": 1771653393667
},
{
"x": 183.7,
"y": 216.8,
"createdAt": 1771653393671
},
{
"x": 184.3,
"y": 218.7,
"createdAt": 1771653393675
},
{
"x": 183.7,
"y": 220.3,
"createdAt": 1771653393679
},
{
"x": 184.1,
"y": 222.2,
"createdAt": 1771653393683
},
{
"x": 184.1,
"y": 223.9,
"createdAt": 1771653393687
},
{
"x": 183.8,
"y": 225.8,
"createdAt": 1771653393691
},
{
"x": 183.8,
"y": 228.1,
"createdAt": 1771653393695
},
{
"x": 184.3,
"y": 230.7,
"createdAt": 1771653393699
},
{
"x": 184,
"y": 234,
"createdAt": 1771653393703
},
{
"x": 183.9,
"y": 237,
"createdAt": 1771653393707
},
{
"x": 184.2,
"y": 240.3,
"createdAt": 1771653393711
},
{
"x": 184,
"y": 243.4,
"createdAt": 1771653393715
},
{
"x": 183.9,
"y": 247.3,
"createdAt": 1771653393719
},
{
"x": 184.2,
"y": 250.5,
"createdAt": 1771653393723
},
{
"x": 184.1,
"y": 253.7,
"createdAt": 1771653393727
},
{
"x": 184.3,
"y": 257.7,
"createdAt": 1771653393731
},
{
"x": 183.7,
"y": 261.6,
"createdAt": 1771653393735
},
{
"x": 184.1,
"y": 265.2,
"createdAt": 1771653393739
},
{
"x": 183.8,
"y": 269,
"createdAt": 1771653393743
},
{
"x": 184.1,
"y": 273.1,
"createdAt": 1771653393747
},
{
"x": 184.7,
"y": 277.5,
"createdAt": 1771653393751
},
{
"x": 184.5,
"y": 281.7,
"createdAt": 1771653393755
},
{
"x": 185.2,
"y": 285.9,
"createdAt": 1771653393759
},
{
"x": 185.4,
"y": 289.3,
"createdAt": 1771653393763
},
{
"x": 185.5,
"y": 293.1,
"createdAt": 1771653393767
},
{
"x": 185.6,
"y": 296.6,
"createdAt": 1771653393771
},
{
"x": 186.2,
"y": 300,
"createdAt": 1771653393775
},
{
"x": 186.1,
"y": 302.7,
"createdAt": 1771653393779
},
{
"x": 186.6,
"y": 304.9,
"createdAt": 1771653393783
},
{
"x": 187,
"y": 307.5,
"createdAt": 1771653393787
},
{
"x": 186.7,
"y": 309.8,
"createdAt": 1771653393791
},
{
"x": 187,
"y": 311.8,
"createdAt": 1771653393795
},
{
"x": 187.4,
"y": 313.7,
"createdAt": 1771653393799
},
{
"x": 187.9,
"y": 316,
"createdAt": 1771653393803
},
{
"x": 188.1,
"y": 318,
"createdAt": 1771653393807
},
{
"x": 188,
"y": 318.8,
"createdAt": 1771653393811
},
{
"x": 188.6,
"y": 319.7,
"createdAt": 1771653393815
},
{
"x": 188.9,
"y": 321.1,
"createdAt": 1771653393819
},
{
"x": 188.9,
"y": 322.1,
"createdAt": 1771653393823
},
{
"x": 189.1,
"y": 322.2,
"createdAt": 1771653393827
},
{
"x": 189.1,
"y": 322.5,
"createdAt": 1771653393831
},
{
"x": 189.2,
"y": 322.5,
"createdAt": 1771653393835
},
{
"x": 189,
"y": 323.1,
"createdAt": 1771653393839
},
{
"x": 189,
"y": 323.2,
"createdAt": 1771653393843
},
{
"x": 189.1,
"y": 323.1,
"createdAt": 1771653393847
},
{
"x": 189.2,
"y": 323.5,
"createdAt": 1771653393851
},
{
"x": 188.8,
"y": 323.7,
"createdAt": 1771653393855
},
{
"x": 189.1,
"y": 323.7,
"createdAt": 1771653393859
},
{
"x": 188.7,
"y": 323.5,
"createdAt": 1771653393863
},
{
"x": 189.3,
"y": 323.8,
"createdAt": 1771653393867
},
{
"x": 189,
"y": 323.9,
"createdAt": 1771653393871
},
{
"x": 189.3,
"y": 324,
"createdAt": 1771653393875
},
{
"x": 189.5,
"y": 323.6,
"createdAt": 1771653393879
},
{
"x": 189.7,
"y": 323.3,
"createdAt": 1771653393883
},
{
"x": 189.8,
"y": 323.3,
"createdAt": 1771653393887
},
{
"x": 189.9,
"y": 321.6,
"createdAt": 1771653393891
},
{
"x": 189.9,
"y": 320.5,
"createdAt": 1771653393895
},
{
"x": 190.2,
"y": 319.3,
"createdAt": 1771653393899
},
{
"x": 190,
"y": 318.2,
"createdAt": 1771653393903
},
{
"x": 189.8,
"y": 315.4,
"createdAt": 1771653393907
},
{
"x": 189.8,
"y": 313.1,
"createdAt": 1771653393911
},
{
"x": 190.1,
"y": 310.5,
"createdAt": 1771653393915
},
{
"x": 189.9,
"y": 308.2,
"createdAt": 1771653393919
},
{
"x": 190.4,
"y": 303.5,
"createdAt": 1771653393923
},
{
"x": 190.9,
"y": 299.3,
"createdAt": 1771653393927
},
{
"x": 191.6,
"y": 295,
"createdAt": 1771653393931
},
{
"x": 192,
"y": 290.8,
"createdAt": 1771653393935
},
{
"x": 192.2,
"y": 285.8,
"createdAt": 1771653393939
},
{
"x": 192.3,
"y": 280.6,
"createdAt": 1771653393943
},
{
"x": 192.8,
"y": 275.2,
"createdAt": 1771653393947
},
{
"x": 193.3,
"y": 270.1,
"createdAt": 1771653393951
},
{
"x": 193.6,
"y": 265.7,
"createdAt": 1771653393955
},
{
"x": 194.8,
"y": 261,
"createdAt": 1771653393959
},
{
"x": 195.4,
"y": 256.2,
"createdAt": 1771653393963
},
{
"x": 196,
"y": 252,
"createdAt": 1771653393967
},
{
"x": 196.9,
"y": 248.9,
"createdAt": 1771653393971
},
{
"x": 197.3,
"y": 245.6,
"createdAt": 1771653393975
},
{
"x": 198.4,
"y": 242.4,
"createdAt": 1771653393979
},
{
"x": 198.8,
"y": 238.8,
"createdAt": 1771653393983
},
{
"x": 199.6,
"y": 237.5,
"createdAt": 1771653393987
},
{
"x": 199.9,
"y": 235.4,
"createdAt": 1771653393991
},
{
"x": 200.6,
"y": 233.9,
"createdAt": 1771653393995
},
{
"x": 201.2,
"y": 232.1,
"createdAt": 1771653393999
},
{
"x": 201.7,
"y": 231,
"createdAt": 1771653394003
},
{
"x": 202.1,
"y": 230.2,
"createdAt": 1771653394007
},
{
"x": 202.5,
"y": 229.1,
"createdAt": 1771653394011
},
{
"x": 203,
"y": 228.3,
"createdAt": 1771653394015
},
{
"x": 203.3,
"y": 228,
"createdAt": 1771653394019
},
{
"x": 203.6,
"y": 227.6,
"createdAt": 1771653394023
},
{
"x": 203.9,
"y": 227,
"createdAt": 1771653394027
},
{
"x": 203.9,
"y": 226.7,
"createdAt": 1771653394031
},
{
"x": 204.4,
"y": 227,
"createdAt": 1771653394035
},
{
"x": 204.8,
"y": 226.6,
"createdAt": 1771653394039
},
{
"x": 205.4,
"y": 226,
"createdAt": 1771653394043
},
{
"x": 206.3,
"y": 226.3,
"createdAt": 1771653394047
},
{
"x": 206.4,
"y": 226.1,
"createdAt": 1771653394051
},
{
"x": 206.2,
"y": 225.8,
"createdAt": 1771653394055
},
{
"x": 206.6,
"y": 226.2,
"createdAt": 1771653394059
},
{
"x": 207.3,
"y": 225.9,
"createdAt": 1771653394063
},
{
"x": 207.7,
"y": 226.1,
"createdAt": 1771653394067
},
{
"x": 208.1,
"y": 226.4,
"createdAt": 1771653394071
},
{
"x": 208.4,
"y": 226.7,
"createdAt": 1771653394075
},
{
"x": 209.1,
"y": 227.2,
"createdAt": 1771653394079
},
{
"x": 209.5,
"y": 227.7,
"createdAt": 1771653394083
},
{
"x": 210.3,
"y": 228.4,
"createdAt": 1771653394087
},
{
"x": 211.5,
"y": 229.3,
"createdAt": 1771653394091
},
{
"x": 212.2,
"y": 230.2,
"createdAt": 1771653394095
},
{
"x": 213.3,
"y": 231.6,
"createdAt": 1771653394099
},
{
"x": 214.2,
"y": 233.2,
"createdAt": 1771653394103
},
{
"x": 215.5,
"y": 235.3,
"createdAt": 1771653394107
},
{
"x": 217.2,
"y": 236.9,
"createdAt": 1771653394111
},
{
"x": 218.5,
"y": 239.8,
"createdAt": 1771653394115
},
{
"x": 219.8,
"y": 242.2,
"createdAt": 1771653394119
},
{
"x": 221.4,
"y": 244.7,
"createdAt": 1771653394123
},
{
"x": 223.2,
"y": 246.7,
"createdAt": 1771653394127
},
{
"x": 224.3,
"y": 250.1,
"createdAt": 1771653394131
},
{
"x": 225.4,
"y": 253.3,
"createdAt": 1771653394135
},
{
"x": 226.8,
"y": 256.7,
"createdAt": 1771653394139
},
{
"x": 227.8,
"y": 260.2,
"createdAt": 1771653394143
},
{
"x": 229.6,
"y": 263.7,
"createdAt": 1771653394147
},
{
"x": 231.1,
"y": 266.8,
"createdAt": 1771653394151
},
{
"x": 232.2,
"y": 270.3,
"createdAt": 1771653394155
},
{
"x": 233.9,
"y": 274.2,
"createdAt": 1771653394159
},
{
"x": 235.2,
"y": 276.7,
"createdAt": 1771653394163
},
{
"x": 236.6,
"y": 279.8,
"createdAt": 1771653394167
},
{
"x": 237.5,
"y": 283.1,
"createdAt": 1771653394171
},
{
"x": 238.7,
"y": 286.2,
"createdAt": 1771653394175
},
{
"x": 239.8,
"y": 288.1,
"createdAt": 1771653394179
},
{
"x": 240.4,
"y": 290.2,
"createdAt": 1771653394183
},
{
"x": 241.3,
"y": 292.8,
"createdAt": 1771653394187
},
{
"x": 241.8,
"y": 295.1,
"createdAt": 1771653394191
},
{
"x": 242.3,
"y": 296.1,
"createdAt": 1771653394195
},
{
"x": 242.2,
"y": 297.8,
"createdAt": 1771653394199
},
{
"x": 242.7,
"y": 298.9,
"createdAt": 1771653394203
},
{
"x": 243,
"y": 300,
"createdAt": 1771653394207
},
{
"x": 243.3,
"y": 300.6,
"createdAt": 1771653394211
},
{
"x": 243.7,
"y": 300.8,
"createdAt": 1771653394215
},
{
"x": 243.9,
"y": 301.6,
"createdAt": 1771653394219
},
{
"x": 243.8,
"y": 301.9,
"createdAt": 1771653394223
}
],
[
{
"x": 265,
"y": 248,
"createdAt": 1771653394898
},
{
"x": 264.7,
"y": 247.9,
"createdAt": 1771653394902
},
{
"x": 265.2,
"y": 247.8,
"createdAt": 1771653394906
},
{
"x": 264.9,
"y": 247.7,
"createdAt": 1771653394910
},
{
"x": 264.9,
"y": 248.2,
"createdAt": 1771653394914
},
{
"x": 264.8,
"y": 247.9,
"createdAt": 1771653394918
},
{
"x": 265.2,
"y": 248,
"createdAt": 1771653394922
},
{
"x": 265,
"y": 247.9,
"createdAt": 1771653394926
},
{
"x": 264.7,
"y": 247.9,
"createdAt": 1771653394930
},
{
"x": 265,
"y": 247.9,
"createdAt": 1771653394934
},
{
"x": 264.9,
"y": 248.1,
"createdAt": 1771653394938
},
{
"x": 264.7,
"y": 248,
"createdAt": 1771653394942
},
{
"x": 264.8,
"y": 248.1,
"createdAt": 1771653394946
},
{
"x": 264.9,
"y": 248.2,
"createdAt": 1771653394950
},
{
"x": 265.2,
"y": 247.7,
"createdAt": 1771653394954
},
{
"x": 265,
"y": 248,
"createdAt": 1771653394958
},
{
"x": 265,
"y": 247.9,
"createdAt": 1771653394962
},
{
"x": 264.9,
"y": 247.8,
"createdAt": 1771653394966
},
{
"x": 264.9,
"y": 248.1,
"createdAt": 1771653394970
},
{
"x": 265.1,
"y": 248.3,
"createdAt": 1771653394974
},
{
"x": 265.1,
"y": 247.9,
"createdAt": 1771653394978
},
{
"x": 264.8,
"y": 248.1,
"createdAt": 1771653394982
},
{
"x": 265.2,
"y": 248,
"createdAt": 1771653394986
},
{
"x": 264.9,
"y": 248.1,
"createdAt": 1771653394990
},
{
"x": 265.3,
"y": 248,
"createdAt": 1771653394994
},
{
"x": 265.1,
"y": 247.8,
"createdAt": 1771653394998
},
{
"x": 264.8,
"y": 248.2,
"createdAt": 1771653395002
},
{
"x": 264.9,
"y": 248.4,
"createdAt": 1771653395006
},
{
"x": 265.2,
"y": 249,
"createdAt": 1771653395010
},
{
"x": 265.3,
"y": 248.9,
"createdAt": 1771653395014
},
{
"x": 264.7,
"y": 249,
"createdAt": 1771653395018
},
{
"x": 264.8,
"y": 249.5,
"createdAt": 1771653395022
},
{
"x": 264.8,
"y": 249.9,
"createdAt": 1771653395026
},
{
"x": 264.9,
"y": 250.1,
"createdAt": 1771653395030
},
{
"x": 265,
"y": 250,
"createdAt": 1771653395034
},
{
"x": 265.1,
"y": 250.2,
"createdAt": 1771653395038
},
{
"x": 265.4,
"y": 250.3,
"createdAt": 1771653395042
},
{
"x": 265.2,
"y": 250.2,
"createdAt": 1771653395046
},
{
"x": 265,
"y": 249.9,
"createdAt": 1771653395050
},
{
"x": 265.2,
"y": 250,
"createdAt": 1771653395054
},
{
"x": 265.5,
"y": 250.1,
"createdAt": 1771653395058
},
{
"x": 265.5,
"y": 249.7,
"createdAt": 1771653395062
},
{
"x": 265.4,
"y": 250,
"createdAt": 1771653395066
},
{
"x": 265.1,
"y": 250.2,
"createdAt": 1771653395070
},
{
"x": 265.6,
"y": 250,
"createdAt": 1771653395074
},
{
"x": 265.4,
"y": 250.1,
"createdAt": 1771653395078
},
{
"x": 265.4,
"y": 250,
"createdAt": 1771653395082
},
{
"x": 265.8,
"y": 249.7,
"createdAt": 1771653395086
},
{
"x": 265.4,
"y": 249.7,
"createdAt": 1771653395090
},
{
"x": 265.8,
"y": 250.2,
"createdAt": 1771653395094
},
{
"x": 265.3,
"y": 249.9,
"createdAt": 1771653395098
},
{
"x": 265.9,
"y": 250.2,
"createdAt": 1771653395102
},
{
"x": 265.5,
"y": 249.8,
"createdAt": 1771653395106
},
{
"x": 265.4,
"y": 249.8,
"createdAt": 1771653395110
},
{
"x": 265.7,
"y": 250,
"createdAt": 1771653395114
},
{
"x": 265.7,
"y": 249.9,
"createdAt": 1771653395118
},
{
"x": 265.5,
"y": 249.7,
"createdAt": 1771653395122
},
{
"x": 265.9,
"y": 249.9,
"createdAt": 1771653395126
},
{
"x": 265.8,
"y": 250,
"createdAt": 1771653395130
},
{
"x": 266,
"y": 250.1,
"createdAt": 1771653395134
},
{
"x": 265.9,
"y": 249.9,
"createdAt": 1771653395138
},
{
"x": 266,
"y": 250,
"createdAt": 1771653395142
},
{
"x": 265.8,
"y": 250.3,
"createdAt": 1771653395146
},
{
"x": 266,
"y": 250.1,
"createdAt": 1771653395150
},
{
"x": 266.3,
"y": 250.2,
"createdAt": 1771653395154
},
{
"x": 266.7,
"y": 249.8,
"createdAt": 1771653395158
},
{
"x": 267.1,
"y": 250.3,
"createdAt": 1771653395162
},
{
"x": 267.7,
"y": 250,
"createdAt": 1771653395166
},
{
"x": 268.1,
"y": 249.7,
"createdAt": 1771653395170
},
{
"x": 268.7,
"y": 249.2,
"createdAt": 1771653395174
},
{
"x": 269.2,
"y": 249.2,
"createdAt": 1771653395178
},
{
"x": 269.5,
"y": 248,
"createdAt": 1771653395182
},
{
"x": 269.4,
"y": 247.5,
"createdAt": 1771653395186
},
{
"x": 269.9,
"y": 246.5,
"createdAt": 1771653395190
},
{
"x": 270.2,
"y": 246.1,
"createdAt": 1771653395194
},
{
"x": 270.5,
"y": 244.8,
"createdAt": 1771653395198
},
{
"x": 270.8,
"y": 244.3,
"createdAt": 1771653395202
},
{
"x": 270.7,
"y": 242.8,
"createdAt": 1771653395206
},
{
"x": 270.9,
"y": 242.3,
"createdAt": 1771653395210
},
{
"x": 271.4,
"y": 241,
"createdAt": 1771653395214
},
{
"x": 271.4,
"y": 240.3,
"createdAt": 1771653395218
},
{
"x": 271.5,
"y": 240,
"createdAt": 1771653395222
},
{
"x": 272.2,
"y": 238.9,
"createdAt": 1771653395226
},
{
"x": 272.1,
"y": 237.7,
"createdAt": 1771653395230
},
{
"x": 272.8,
"y": 237.1,
"createdAt": 1771653395234
},
{
"x": 272.9,
"y": 236.3,
"createdAt": 1771653395238
},
{
"x": 273.2,
"y": 234.8,
"createdAt": 1771653395242
},
{
"x": 272.8,
"y": 234.2,
"createdAt": 1771653395246
},
{
"x": 272.9,
"y": 233.6,
"createdAt": 1771653395250
},
{
"x": 272.8,
"y": 232.7,
"createdAt": 1771653395254
},
{
"x": 273,
"y": 232.1,
"createdAt": 1771653395258
},
{
"x": 272.9,
"y": 231.4,
"createdAt": 1771653395262
},
{
"x": 273,
"y": 230.3,
"createdAt": 1771653395266
},
{
"x": 272.8,
"y": 229.5,
"createdAt": 1771653395270
},
{
"x": 273,
"y": 229.2,
"createdAt": 1771653395274
},
{
"x": 272.9,
"y": 228.1,
"createdAt": 1771653395278
},
{
"x": 272.8,
"y": 227.2,
"createdAt": 1771653395282
},
{
"x": 272.4,
"y": 226.1,
"createdAt": 1771653395286
},
{
"x": 272.3,
"y": 224.7,
"createdAt": 1771653395290
},
{
"x": 271.8,
"y": 224.3,
"createdAt": 1771653395294
},
{
"x": 271.2,
"y": 223.3,
"createdAt": 1771653395298
},
{
"x": 270.3,
"y": 222.7,
"createdAt": 1771653395302
},
{
"x": 269.9,
"y": 221.7,
"createdAt": 1771653395306
},
{
"x": 269.5,
"y": 221.4,
"createdAt": 1771653395310
},
{
"x": 269.2,
"y": 220.5,
"createdAt": 1771653395314
},
{
"x": 268.7,
"y": 219.5,
"createdAt": 1771653395318
},
{
"x": 267.9,
"y": 218.9,
"createdAt": 1771653395322
},
{
"x": 267.8,
"y": 218.2,
"createdAt": 1771653395326
},
{
"x": 267,
"y": 218.2,
"createdAt": 1771653395330
},
{
"x": 266.3,
"y": 217.7,
"createdAt": 1771653395334
},
{
"x": 266.3,
"y": 216.8,
"createdAt": 1771653395338
},
{
"x": 265.5,
"y": 216.4,
"createdAt": 1771653395342
},
{
"x": 265.2,
"y": 215.7,
"createdAt": 1771653395346
},
{
"x": 265.1,
"y": 215.4,
"createdAt": 1771653395350
},
{
"x": 264.8,
"y": 215.2,
"createdAt": 1771653395354
},
{
"x": 264.8,
"y": 215,
"createdAt": 1771653395358
},
{
"x": 264.6,
"y": 215.1,
"createdAt": 1771653395362
},
{
"x": 264.2,
"y": 215,
"createdAt": 1771653395366
},
{
"x": 264.2,
"y": 215.2,
"createdAt": 1771653395370
},
{
"x": 263.7,
"y": 215.2,
"createdAt": 1771653395374
},
{
"x": 263.7,
"y": 215.3,
"createdAt": 1771653395378
},
{
"x": 263.7,
"y": 215,
"createdAt": 1771653395382
},
{
"x": 263.9,
"y": 215.2,
"createdAt": 1771653395386
},
{
"x": 264,
"y": 214.9,
"createdAt": 1771653395390
},
{
"x": 263.5,
"y": 215.2,
"createdAt": 1771653395394
},
{
"x": 263.4,
"y": 215,
"createdAt": 1771653395398
},
{
"x": 263.6,
"y": 214.8,
"createdAt": 1771653395402
},
{
"x": 263.6,
"y": 214.9,
"createdAt": 1771653395406
},
{
"x": 263.2,
"y": 215.2,
"createdAt": 1771653395410
},
{
"x": 263.2,
"y": 214.8,
"createdAt": 1771653395414
},
{
"x": 263.3,
"y": 215.2,
"createdAt": 1771653395418
},
{
"x": 263.1,
"y": 215.3,
"createdAt": 1771653395422
},
{
"x": 263.5,
"y": 214.8,
"createdAt": 1771653395426
},
{
"x": 263,
"y": 214.8,
"createdAt": 1771653395430
},
{
"x": 263.3,
"y": 214.8,
"createdAt": 1771653395434
},
{
"x": 263.2,
"y": 215.2,
"createdAt": 1771653395438
},
{
"x": 263.1,
"y": 215.3,
"createdAt": 1771653395442
},
{
"x": 263,
"y": 215.2,
"createdAt": 1771653395446
},
{
"x": 263.3,
"y": 215.2,
"createdAt": 1771653395450
},
{
"x": 262.9,
"y": 214.9,
"createdAt": 1771653395454
},
{
"x": 263.1,
"y": 214.9,
"createdAt": 1771653395458
},
{
"x": 263,
"y": 215.4,
"createdAt": 1771653395462
},
{
"x": 263.3,
"y": 215,
"createdAt": 1771653395466
},
{
"x": 262.9,
"y": 215.5,
"createdAt": 1771653395470
},
{
"x": 262.8,
"y": 215.2,
"createdAt": 1771653395474
},
{
"x": 263.1,
"y": 215.6,
"createdAt": 1771653395478
},
{
"x": 262.8,
"y": 215.4,
"createdAt": 1771653395482
},
{
"x": 262.8,
"y": 215.6,
"createdAt": 1771653395486
},
{
"x": 263.3,
"y": 215.4,
"createdAt": 1771653395490
},
{
"x": 263.1,
"y": 215.7,
"createdAt": 1771653395494
},
{
"x": 263,
"y": 215.6,
"createdAt": 1771653395498
},
{
"x": 263.3,
"y": 215.8,
"createdAt": 1771653395502
},
{
"x": 263,
"y": 216.2,
"createdAt": 1771653395506
},
{
"x": 263.3,
"y": 216.5,
"createdAt": 1771653395510
},
{
"x": 262.8,
"y": 217.4,
"createdAt": 1771653395514
},
{
"x": 263.2,
"y": 218.1,
"createdAt": 1771653395518
},
{
"x": 262.8,
"y": 219.3,
"createdAt": 1771653395522
},
{
"x": 262.9,
"y": 220.7,
"createdAt": 1771653395526
},
{
"x": 262.7,
"y": 222.6,
"createdAt": 1771653395530
},
{
"x": 262.4,
"y": 224.1,
"createdAt": 1771653395534
},
{
"x": 262,
"y": 225.8,
"createdAt": 1771653395538
},
{
"x": 261.5,
"y": 228.4,
"createdAt": 1771653395542
},
{
"x": 260.9,
"y": 230.8,
"createdAt": 1771653395546
},
{
"x": 260.6,
"y": 233.6,
"createdAt": 1771653395550
},
{
"x": 259.8,
"y": 235.9,
"createdAt": 1771653395554
},
{
"x": 259.7,
"y": 238.1,
"createdAt": 1771653395558
},
{
"x": 259.2,
"y": 240.6,
"createdAt": 1771653395562
},
{
"x": 258.7,
"y": 242.7,
"createdAt": 1771653395566
},
{
"x": 257.7,
"y": 244.8,
"createdAt": 1771653395570
},
{
"x": 257.7,
"y": 246.5,
"createdAt": 1771653395574
},
{
"x": 257.5,
"y": 248.8,
"createdAt": 1771653395578
},
{
"x": 257.2,
"y": 250.3,
"createdAt": 1771653395582
},
{
"x": 257,
"y": 252.1,
"createdAt": 1771653395586
},
{
"x": 256.7,
"y": 253,
"createdAt": 1771653395590
},
{
"x": 256.9,
"y": 253.7,
"createdAt": 1771653395594
},
{
"x": 256.9,
"y": 254.7,
"createdAt": 1771653395598
},
{
"x": 257.2,
"y": 256,
"createdAt": 1771653395602
},
{
"x": 256.8,
"y": 256.7,
"createdAt": 1771653395606
},
{
"x": 257,
"y": 257,
"createdAt": 1771653395610
},
{
"x": 256.9,
"y": 257.4,
"createdAt": 1771653395614
},
{
"x": 257.1,
"y": 258.2,
"createdAt": 1771653395618
},
{
"x": 257.1,
"y": 258.2,
"createdAt": 1771653395622
},
{
"x": 256.9,
"y": 258.8,
"createdAt": 1771653395626
},
{
"x": 257.3,
"y": 258.9,
"createdAt": 1771653395630
},
{
"x": 256.8,
"y": 259.1,
"createdAt": 1771653395634
},
{
"x": 257.2,
"y": 259.6,
"createdAt": 1771653395638
},
{
"x": 257.8,
"y": 259.9,
"createdAt": 1771653395642
},
{
"x": 258.4,
"y": 260.5,
"createdAt": 1771653395646
},
{
"x": 258.9,
"y": 261,
"createdAt": 1771653395650
},
{
"x": 260.2,
"y": 261.6,
"createdAt": 1771653395654
},
{
"x": 261.1,
"y": 262.2,
"createdAt": 1771653395658
},
{
"x": 262.2,
"y": 263.3,
"createdAt": 1771653395662
},
{
"x": 262.8,
"y": 264.1,
"createdAt": 1771653395666
},
{
"x": 264.5,
"y": 264.5,
"createdAt": 1771653395670
},
{
"x": 265.5,
"y": 265.4,
"createdAt": 1771653395674
},
{
"x": 266.7,
"y": 266.4,
"createdAt": 1771653395678
},
{
"x": 268.2,
"y": 266.8,
"createdAt": 1771653395682
},
{
"x": 269.4,
"y": 267.5,
"createdAt": 1771653395686
},
{
"x": 270.3,
"y": 268.4,
"createdAt": 1771653395690
},
{
"x": 271.8,
"y": 269.3,
"createdAt": 1771653395694
},
{
"x": 272.9,
"y": 269.7,
"createdAt": 1771653395698
},
{
"x": 274.1,
"y": 270.8,
"createdAt": 1771653395702
},
{
"x": 275.6,
"y": 271.5,
"createdAt": 1771653395706
},
{
"x": 276.6,
"y": 272.2,
"createdAt": 1771653395710
},
{
"x": 278.2,
"y": 272.9,
"createdAt": 1771653395714
},
{
"x": 278.7,
"y": 273.1,
"createdAt": 1771653395718
},
{
"x": 279.6,
"y": 273.7,
"createdAt": 1771653395722
},
{
"x": 280.4,
"y": 273.9,
"createdAt": 1771653395726
},
{
"x": 281.2,
"y": 274,
"createdAt": 1771653395730
},
{
"x": 281.2,
"y": 274,
"createdAt": 1771653395734
},
{
"x": 281.8,
"y": 274.3,
"createdAt": 1771653395738
},
{
"x": 281.5,
"y": 274.9,
"createdAt": 1771653395742
},
{
"x": 282.1,
"y": 275,
"createdAt": 1771653395746
},
{
"x": 282.5,
"y": 275.1,
"createdAt": 1771653395750
},
{
"x": 282.7,
"y": 275.1,
"createdAt": 1771653395754
},
{
"x": 283,
"y": 275,
"createdAt": 1771653395758
},
{
"x": 282.7,
"y": 274.8,
"createdAt": 1771653395762
},
{
"x": 283.5,
"y": 275.1,
"createdAt": 1771653395766
},
{
"x": 283.5,
"y": 274.7,
"createdAt": 1771653395770
},
{
"x": 283.8,
"y": 275,
"createdAt": 1771653395774
},
{
"x": 284,
"y": 275.3,
"createdAt": 1771653395778
},
{
"x": 284.2,
"y": 275.1,
"createdAt": 1771653395782
},
{
"x": 284.4,
"y": 275.1,
"createdAt": 1771653395786
},
{
"x": 284.2,
"y": 274.8,
"createdAt": 1771653395790
},
{
"x": 284.5,
"y": 274.8,
"createdAt": 1771653395794
},
{
"x": 284.6,
"y": 274.9,
"createdAt": 1771653395798
},
{
"x": 284.4,
"y": 275.3,
"createdAt": 1771653395802
},
{
"x": 284.7,
"y": 274.9,
"createdAt": 1771653395806
},
{
"x": 284.6,
"y": 275.1,
"createdAt": 1771653395810
},
{
"x": 284.4,
"y": 274.8,
"createdAt": 1771653395814
},
{
"x": 285.1,
"y": 274.9,
"createdAt": 1771653395818
},
{
"x": 284.8,
"y": 275,
"createdAt": 1771653395822
},
{
"x": 284.8,
"y": 275.1,
"createdAt": 1771653395826
},
{
"x": 284.9,
"y": 275.1,
"createdAt": 1771653395830
},
{
"x": 285.4,
"y": 275.1,
"createdAt": 1771653395834
},
{
"x": 285.9,
"y": 274.9,
"createdAt": 1771653395838
},
{
"x": 286.7,
"y": 275,
"createdAt": 1771653395842
},
{
"x": 286.8,
"y": 275.2,
"createdAt": 1771653395846
},
{
"x": 287.6,
"y": 274.8,
"createdAt": 1771653395850
},
{
"x": 288.5,
"y": 274.8,
"createdAt": 1771653395854
},
{
"x": 289.1,
"y": 274.7,
"createdAt": 1771653395858
},
{
"x": 290.1,
"y": 275.1,
"createdAt": 1771653395862
},
{
"x": 291.3,
"y": 274.9,
"createdAt": 1771653395866
},
{
"x": 292.2,
"y": 274.6,
"createdAt": 1771653395870
},
{
"x": 293,
"y": 274.2,
"createdAt": 1771653395874
},
{
"x": 293.9,
"y": 274.2,
"createdAt": 1771653395878
},
{
"x": 295,
"y": 274,
"createdAt": 1771653395882
},
{
"x": 295.5,
"y": 274.2,
"createdAt": 1771653395886
},
{
"x": 296.3,
"y": 274,
"createdAt": 1771653395890
},
{
"x": 297.1,
"y": 273.7,
"createdAt": 1771653395894
},
{
"x": 297.1,
"y": 273.6,
"createdAt": 1771653395898
},
{
"x": 297.5,
"y": 273.3,
"createdAt": 1771653395902
},
{
"x": 297.6,
"y": 273.1,
"createdAt": 1771653395906
},
{
"x": 297.7,
"y": 273.1,
"createdAt": 1771653395910
},
{
"x": 298.2,
"y": 273.1,
"createdAt": 1771653395914
},
{
"x": 298.3,
"y": 272.8,
"createdAt": 1771653395918
},
{
"x": 298.8,
"y": 273.3,
"createdAt": 1771653395922
},
{
"x": 299,
"y": 273.3,
"createdAt": 1771653395926
},
{
"x": 299.5,
"y": 272.5,
"createdAt": 1771653395930
},
{
"x": 299.7,
"y": 272.2,
"createdAt": 1771653395934
},
{
"x": 299.7,
"y": 272.3,
"createdAt": 1771653395938
},
{
"x": 299.8,
"y": 272,
"createdAt": 1771653395942
},
{
"x": 299.8,
"y": 271.8,
"createdAt": 1771653395946
},
{
"x": 299.8,
"y": 272,
"createdAt": 1771653395950
},
{
"x": 300,
"y": 271.8,
"createdAt": 1771653395954
},
{
"x": 300.2,
"y": 271.7,
"createdAt": 1771653395958
},
{
"x": 300,
"y": 271.4,
"createdAt": 1771653395962
},
{
"x": 300,
"y": 271.7,
"createdAt": 1771653395966
},
{
"x": 300.3,
"y": 271.5,
"createdAt": 1771653395970
},
{
"x": 300.1,
"y": 271.6,
"createdAt": 1771653395974
},
{
"x": 300.2,
"y": 271.2,
"createdAt": 1771653395978
},
{
"x": 300.2,
"y": 271.3,
"createdAt": 1771653395982
},
{
"x": 299.9,
"y": 270.8,
"createdAt": 1771653395986
},
{
"x": 299.9,
"y": 271.2,
"createdAt": 1771653395990
},
{
"x": 300,
"y": 270.7,
"createdAt": 1771653395994
},
{
"x": 299.9,
"y": 270.2,
"createdAt": 1771653395998
},
{
"x": 299.8,
"y": 269.5,
"createdAt": 1771653396002
},
{
"x": 300.3,
"y": 269.1,
"createdAt": 1771653396006
},
{
"x": 300.1,
"y": 268.7,
"createdAt": 1771653396010
},
{
"x": 299.9,
"y": 268,
"createdAt": 1771653396014
},
{
"x": 300.1,
"y": 267.3,
"createdAt": 1771653396018
},
{
"x": 300,
"y": 267,
"createdAt": 1771653396022
},
{
"x": 300.2,
"y": 265.9,
"createdAt": 1771653396026
},
{
"x": 300.6,
"y": 265.1,
"createdAt": 1771653396030
},
{
"x": 300.5,
"y": 264.1,
"createdAt": 1771653396034
},
{
"x": 300.8,
"y": 262.7,
"createdAt": 1771653396038
},
{
"x": 301.3,
"y": 261.8,
"createdAt": 1771653396042
},
{
"x": 301.7,
"y": 260.3,
"createdAt": 1771653396046
},
{
"x": 302,
"y": 259,
"createdAt": 1771653396050
},
{
"x": 301.9,
"y": 258.1,
"createdAt": 1771653396054
},
{
"x": 302.4,
"y": 257,
"createdAt": 1771653396058
},
{
"x": 302.5,
"y": 256.4,
"createdAt": 1771653396062
},
{
"x": 302.7,
"y": 255.9,
"createdAt": 1771653396066
},
{
"x": 302.7,
"y": 254.7,
"createdAt": 1771653396070
},
{
"x": 303.3,
"y": 254.2,
"createdAt": 1771653396074
},
{
"x": 303.5,
"y": 253.7,
"createdAt": 1771653396078
},
{
"x": 303.8,
"y": 253,
"createdAt": 1771653396082
},
{
"x": 304.1,
"y": 252.1,
"createdAt": 1771653396086
},
{
"x": 303.9,
"y": 251.8,
"createdAt": 1771653396090
},
{
"x": 303.8,
"y": 251.3,
"createdAt": 1771653396094
},
{
"x": 304,
"y": 251.2,
"createdAt": 1771653396098
},
{
"x": 304,
"y": 250.8,
"createdAt": 1771653396102
}
],
[
{
"x": 310.9,
"y": 172.9,
"createdAt": 1771653396681
},
{
"x": 310.8,
"y": 172.8,
"createdAt": 1771653396685
},
{
"x": 310.9,
"y": 173.3,
"createdAt": 1771653396689
},
{
"x": 310.9,
"y": 173.4,
"createdAt": 1771653396693
},
{
"x": 311.2,
"y": 173.3,
"createdAt": 1771653396697
},
{
"x": 310.8,
"y": 173.5,
"createdAt": 1771653396701
},
{
"x": 311,
"y": 173,
"createdAt": 1771653396705
},
{
"x": 311.3,
"y": 173.2,
"createdAt": 1771653396709
},
{
"x": 311.1,
"y": 173.6,
"createdAt": 1771653396713
},
{
"x": 311.1,
"y": 173.4,
"createdAt": 1771653396717
},
{
"x": 311.2,
"y": 173.6,
"createdAt": 1771653396721
},
{
"x": 311,
"y": 173.8,
"createdAt": 1771653396725
},
{
"x": 310.9,
"y": 173.8,
"createdAt": 1771653396729
},
{
"x": 311.2,
"y": 173.4,
"createdAt": 1771653396733
},
{
"x": 310.9,
"y": 173.9,
"createdAt": 1771653396737
},
{
"x": 310.8,
"y": 174,
"createdAt": 1771653396741
},
{
"x": 311.2,
"y": 173.8,
"createdAt": 1771653396745
},
{
"x": 311.1,
"y": 173.7,
"createdAt": 1771653396749
},
{
"x": 311.1,
"y": 173.8,
"createdAt": 1771653396753
},
{
"x": 310.9,
"y": 174.1,
"createdAt": 1771653396757
},
{
"x": 310.8,
"y": 174.2,
"createdAt": 1771653396761
},
{
"x": 310.9,
"y": 174.2,
"createdAt": 1771653396765
},
{
"x": 310.7,
"y": 174.4,
"createdAt": 1771653396769
},
{
"x": 310.9,
"y": 173.9,
"createdAt": 1771653396773
},
{
"x": 311.2,
"y": 174.4,
"createdAt": 1771653396777
},
{
"x": 310.8,
"y": 174.5,
"createdAt": 1771653396781
},
{
"x": 310.8,
"y": 174.4,
"createdAt": 1771653396785
},
{
"x": 310.8,
"y": 174.5,
"createdAt": 1771653396789
},
{
"x": 310.8,
"y": 174.5,
"createdAt": 1771653396793
},
{
"x": 310.9,
"y": 174.5,
"createdAt": 1771653396797
},
{
"x": 311.2,
"y": 174.3,
"createdAt": 1771653396801
},
{
"x": 311.2,
"y": 174.9,
"createdAt": 1771653396805
},
{
"x": 310.8,
"y": 174.5,
"createdAt": 1771653396809
},
{
"x": 311,
"y": 174.7,
"createdAt": 1771653396813
},
{
"x": 311.1,
"y": 175,
"createdAt": 1771653396817
},
{
"x": 311.2,
"y": 175.1,
"createdAt": 1771653396821
},
{
"x": 310.8,
"y": 174.6,
"createdAt": 1771653396825
},
{
"x": 310.8,
"y": 175.1,
"createdAt": 1771653396829
},
{
"x": 310.8,
"y": 174.8,
"createdAt": 1771653396833
},
{
"x": 311,
"y": 176.8,
"createdAt": 1771653396837
},
{
"x": 310.8,
"y": 178.9,
"createdAt": 1771653396841
},
{
"x": 310.8,
"y": 180.9,
"createdAt": 1771653396845
},
{
"x": 311.1,
"y": 182.8,
"createdAt": 1771653396849
},
{
"x": 311.8,
"y": 188.4,
"createdAt": 1771653396853
},
{
"x": 312.2,
"y": 193.7,
"createdAt": 1771653396857
},
{
"x": 313.5,
"y": 199.3,
"createdAt": 1771653396861
},
{
"x": 314.3,
"y": 204.8,
"createdAt": 1771653396865
},
{
"x": 315.4,
"y": 213,
"createdAt": 1771653396869
},
{
"x": 316.9,
"y": 221.7,
"createdAt": 1771653396873
},
{
"x": 318.4,
"y": 229.7,
"createdAt": 1771653396877
},
{
"x": 320.2,
"y": 238.1,
"createdAt": 1771653396881
},
{
"x": 321,
"y": 244.5,
"createdAt": 1771653396885
},
{
"x": 322.5,
"y": 250.8,
"createdAt": 1771653396889
},
{
"x": 323.5,
"y": 257.5,
"createdAt": 1771653396893
},
{
"x": 324.9,
"y": 264.2,
"createdAt": 1771653396897
},
{
"x": 325.1,
"y": 268,
"createdAt": 1771653396901
},
{
"x": 325.7,
"y": 272.2,
"createdAt": 1771653396905
},
{
"x": 325.7,
"y": 276,
"createdAt": 1771653396909
},
{
"x": 326,
"y": 280.1,
"createdAt": 1771653396913
},
{
"x": 326.8,
"y": 282.9,
"createdAt": 1771653396917
},
{
"x": 326.8,
"y": 285.3,
"createdAt": 1771653396921
},
{
"x": 327.7,
"y": 288.3,
"createdAt": 1771653396925
},
{
"x": 328.1,
"y": 290.9,
"createdAt": 1771653396929
},
{
"x": 328.1,
"y": 292.2,
"createdAt": 1771653396933
},
{
"x": 328.3,
"y": 293.4,
"createdAt": 1771653396937
},
{
"x": 327.7,
"y": 294.7,
"createdAt": 1771653396941
},
{
"x": 328,
"y": 295.7,
"createdAt": 1771653396945
},
{
"x": 328.2,
"y": 295.9,
"createdAt": 1771653396949
},
{
"x": 327.8,
"y": 296.5,
"createdAt": 1771653396953
},
{
"x": 327.8,
"y": 296.2,
"createdAt": 1771653396957
},
{
"x": 328,
"y": 296.7,
"createdAt": 1771653396961
},
{
"x": 327.9,
"y": 296.7,
"createdAt": 1771653396965
},
{
"x": 328.1,
"y": 296.8,
"createdAt": 1771653396969
},
{
"x": 328.2,
"y": 296.9,
"createdAt": 1771653396973
},
{
"x": 327.9,
"y": 296.9,
"createdAt": 1771653396977
}
],
[
{
"x": 343.1,
"y": 169,
"createdAt": 1771653397781
},
{
"x": 343.2,
"y": 169,
"createdAt": 1771653397785
},
{
"x": 343,
"y": 169.3,
"createdAt": 1771653397789
},
{
"x": 342.8,
"y": 169.1,
"createdAt": 1771653397793
},
{
"x": 343,
"y": 168.9,
"createdAt": 1771653397797
},
{
"x": 343.1,
"y": 169.2,
"createdAt": 1771653397801
},
{
"x": 342.8,
"y": 169.4,
"createdAt": 1771653397805
},
{
"x": 343,
"y": 169.1,
"createdAt": 1771653397809
},
{
"x": 342.8,
"y": 169.2,
"createdAt": 1771653397813
},
{
"x": 343.2,
"y": 169.3,
"createdAt": 1771653397817
},
{
"x": 343.2,
"y": 169.5,
"createdAt": 1771653397821
},
{
"x": 343,
"y": 169.2,
"createdAt": 1771653397825
},
{
"x": 343.2,
"y": 169.1,
"createdAt": 1771653397829
},
{
"x": 343.1,
"y": 169.2,
"createdAt": 1771653397833
},
{
"x": 343.3,
"y": 169.2,
"createdAt": 1771653397837
},
{
"x": 343,
"y": 169.2,
"createdAt": 1771653397841
},
{
"x": 342.8,
"y": 169.7,
"createdAt": 1771653397845
},
{
"x": 342.9,
"y": 169.3,
"createdAt": 1771653397849
},
{
"x": 343.1,
"y": 169.7,
"createdAt": 1771653397853
},
{
"x": 342.9,
"y": 169.3,
"createdAt": 1771653397857
},
{
"x": 343,
"y": 169.4,
"createdAt": 1771653397861
},
{
"x": 342.7,
"y": 169.7,
"createdAt": 1771653397865
},
{
"x": 343.2,
"y": 169.3,
"createdAt": 1771653397869
},
{
"x": 343.1,
"y": 169.3,
"createdAt": 1771653397873
},
{
"x": 342.9,
"y": 169.8,
"createdAt": 1771653397877
},
{
"x": 343.2,
"y": 169.8,
"createdAt": 1771653397881
},
{
"x": 343.1,
"y": 170,
"createdAt": 1771653397885
},
{
"x": 343.2,
"y": 169.8,
"createdAt": 1771653397889
},
{
"x": 343.3,
"y": 170,
"createdAt": 1771653397893
},
{
"x": 342.9,
"y": 169.6,
"createdAt": 1771653397897
},
{
"x": 343.3,
"y": 169.9,
"createdAt": 1771653397901
},
{
"x": 343,
"y": 169.6,
"createdAt": 1771653397905
},
{
"x": 343.2,
"y": 170.1,
"createdAt": 1771653397909
},
{
"x": 342.8,
"y": 169.6,
"createdAt": 1771653397913
},
{
"x": 343.2,
"y": 169.8,
"createdAt": 1771653397917
},
{
"x": 343.2,
"y": 169.9,
"createdAt": 1771653397921
},
{
"x": 343.3,
"y": 170.1,
"createdAt": 1771653397925
},
{
"x": 342.8,
"y": 169.9,
"createdAt": 1771653397929
},
{
"x": 342.9,
"y": 169.8,
"createdAt": 1771653397933
},
{
"x": 343.1,
"y": 172,
"createdAt": 1771653397937
},
{
"x": 343,
"y": 174,
"createdAt": 1771653397941
},
{
"x": 342.9,
"y": 176,
"createdAt": 1771653397945
},
{
"x": 343.1,
"y": 178.3,
"createdAt": 1771653397949
},
{
"x": 342.9,
"y": 181.6,
"createdAt": 1771653397953
},
{
"x": 343.1,
"y": 185.1,
"createdAt": 1771653397957
},
{
"x": 342.9,
"y": 188.3,
"createdAt": 1771653397961
},
{
"x": 343.2,
"y": 192.1,
"createdAt": 1771653397965
},
{
"x": 343.1,
"y": 195.5,
"createdAt": 1771653397969
},
{
"x": 342.7,
"y": 198.2,
"createdAt": 1771653397973
},
{
"x": 342.8,
"y": 201.7,
"createdAt": 1771653397977
},
{
"x": 343,
"y": 204.8,
"createdAt": 1771653397981
},
{
"x": 343,
"y": 207.2,
"createdAt": 1771653397985
},
{
"x": 343,
"y": 210.3,
"createdAt": 1771653397989
},
{
"x": 342.7,
"y": 212.8,
"createdAt": 1771653397993
},
{
"x": 343.2,
"y": 214.7,
"createdAt": 1771653397997
},
{
"x": 343.2,
"y": 216.8,
"createdAt": 1771653398001
},
{
"x": 342.7,
"y": 218.9,
"createdAt": 1771653398005
},
{
"x": 343,
"y": 220.8,
"createdAt": 1771653398009
},
{
"x": 343,
"y": 222.8,
"createdAt": 1771653398013
},
{
"x": 343.1,
"y": 224.1,
"createdAt": 1771653398017
},
{
"x": 343.2,
"y": 225.4,
"createdAt": 1771653398021
},
{
"x": 343.2,
"y": 226.7,
"createdAt": 1771653398025
},
{
"x": 343.1,
"y": 228,
"createdAt": 1771653398029
},
{
"x": 342.9,
"y": 229,
"createdAt": 1771653398033
},
{
"x": 343,
"y": 230.7,
"createdAt": 1771653398037
},
{
"x": 343,
"y": 231.6,
"createdAt": 1771653398041
},
{
"x": 343.2,
"y": 233,
"createdAt": 1771653398045
},
{
"x": 343.9,
"y": 234.7,
"createdAt": 1771653398049
},
{
"x": 344.4,
"y": 236.4,
"createdAt": 1771653398053
},
{
"x": 345,
"y": 238.1,
"createdAt": 1771653398057
},
{
"x": 345.8,
"y": 239.9,
"createdAt": 1771653398061
},
{
"x": 347.8,
"y": 243.1,
"createdAt": 1771653398065
},
{
"x": 349,
"y": 246.6,
"createdAt": 1771653398069
},
{
"x": 350.7,
"y": 249.8,
"createdAt": 1771653398073
},
{
"x": 352.3,
"y": 252.9,
"createdAt": 1771653398077
},
{
"x": 353.7,
"y": 255.8,
"createdAt": 1771653398081
},
{
"x": 355.6,
"y": 258.9,
"createdAt": 1771653398085
},
{
"x": 357.1,
"y": 262,
"createdAt": 1771653398089
},
{
"x": 359.2,
"y": 265.1,
"createdAt": 1771653398093
},
{
"x": 360.5,
"y": 267.1,
"createdAt": 1771653398097
},
{
"x": 361.3,
"y": 269.8,
"createdAt": 1771653398101
},
{
"x": 362.5,
"y": 271.7,
"createdAt": 1771653398105
},
{
"x": 364.1,
"y": 274.1,
"createdAt": 1771653398109
},
{
"x": 364.6,
"y": 275.6,
"createdAt": 1771653398113
},
{
"x": 365.7,
"y": 276.8,
"createdAt": 1771653398117
},
{
"x": 366,
"y": 278.7,
"createdAt": 1771653398121
},
{
"x": 366.9,
"y": 279.8,
"createdAt": 1771653398125
},
{
"x": 367.4,
"y": 280.7,
"createdAt": 1771653398129
},
{
"x": 367.2,
"y": 281,
"createdAt": 1771653398133
},
{
"x": 367.6,
"y": 281.8,
"createdAt": 1771653398137
},
{
"x": 368.1,
"y": 281.8,
"createdAt": 1771653398141
},
{
"x": 368.2,
"y": 282.5,
"createdAt": 1771653398145
},
{
"x": 368.6,
"y": 282.4,
"createdAt": 1771653398149
},
{
"x": 369,
"y": 282.9,
"createdAt": 1771653398153
},
{
"x": 369.2,
"y": 283.2,
"createdAt": 1771653398157
},
{
"x": 369.3,
"y": 283.4,
"createdAt": 1771653398161
},
{
"x": 369,
"y": 283.1,
"createdAt": 1771653398165
},
{
"x": 369.1,
"y": 283.2,
"createdAt": 1771653398169
},
{
"x": 369.1,
"y": 283.2,
"createdAt": 1771653398173
},
{
"x": 369.2,
"y": 283.1,
"createdAt": 1771653398177
},
{
"x": 369.2,
"y": 283.5,
"createdAt": 1771653398181
},
{
"x": 368.9,
"y": 283.3,
"createdAt": 1771653398185
},
{
"x": 368.8,
"y": 283.4,
"createdAt": 1771653398189
},
{
"x": 368.7,
"y": 284,
"createdAt": 1771653398193
},
{
"x": 369.1,
"y": 283.5,
"createdAt": 1771653398197
},
{
"x": 368.9,
"y": 283.6,
"createdAt": 1771653398201
},
{
"x": 368.8,
"y": 284,
"createdAt": 1771653398205
},
{
"x": 368.9,
"y": 284,
"createdAt": 1771653398209
},
{
"x": 368.7,
"y": 284.3,
"createdAt": 1771653398213
},
{
"x": 369,
"y": 283.9,
"createdAt": 1771653398217
},
{
"x": 369.1,
"y": 284,
"createdAt": 1771653398221
},
{
"x": 369,
"y": 284.1,
"createdAt": 1771653398225
},
{
"x": 368.9,
"y": 284.1,
"createdAt": 1771653398229
},
{
"x": 368.9,
"y": 284.4,
"createdAt": 1771653398233
},
{
"x": 368.9,
"y": 284.1,
"createdAt": 1771653398237
},
{
"x": 368.9,
"y": 284.6,
"createdAt": 1771653398241
},
{
"x": 368.9,
"y": 284.7,
"createdAt": 1771653398245
},
{
"x": 369,
"y": 284.8,
"createdAt": 1771653398249
},
{
"x": 368.9,
"y": 284.8,
"createdAt": 1771653398253
},
{
"x": 369.2,
"y": 285,
"createdAt": 1771653398257
},
{
"x": 368.9,
"y": 285,
"createdAt": 1771653398261
},
{
"x": 369,
"y": 284.6,
"createdAt": 1771653398265
},
{
"x": 369.3,
"y": 285.1,
"createdAt": 1771653398269
},
{
"x": 368.8,
"y": 285,
"createdAt": 1771653398273
},
{
"x": 369.2,
"y": 285.1,
"createdAt": 1771653398277
},
{
"x": 369,
"y": 285.2,
"createdAt": 1771653398281
},
{
"x": 369.1,
"y": 285.3,
"createdAt": 1771653398285
},
{
"x": 369.4,
"y": 285.3,
"createdAt": 1771653398289
},
{
"x": 369.6,
"y": 285.6,
"createdAt": 1771653398293
},
{
"x": 369.6,
"y": 285.4,
"createdAt": 1771653398297
},
{
"x": 369.7,
"y": 286,
"createdAt": 1771653398301
},
{
"x": 369.6,
"y": 286.1,
"createdAt": 1771653398305
},
{
"x": 370,
"y": 285.8,
"createdAt": 1771653398309
}
],
[
{
"x": 395.8,
"y": 233.8,
"createdAt": 1771653398964
},
{
"x": 395.7,
"y": 234.2,
"createdAt": 1771653398968
},
{
"x": 395.9,
"y": 233.7,
"createdAt": 1771653398972
},
{
"x": 395.8,
"y": 234,
"createdAt": 1771653398976
},
{
"x": 396,
"y": 233.8,
"createdAt": 1771653398980
},
{
"x": 396,
"y": 234.2,
"createdAt": 1771653398984
},
{
"x": 395.7,
"y": 234.2,
"createdAt": 1771653398988
},
{
"x": 396,
"y": 234.2,
"createdAt": 1771653398992
},
{
"x": 396.1,
"y": 233.8,
"createdAt": 1771653398996
},
{
"x": 395.6,
"y": 233.9,
"createdAt": 1771653399000
},
{
"x": 396.1,
"y": 233.7,
"createdAt": 1771653399004
},
{
"x": 395.8,
"y": 233.9,
"createdAt": 1771653399008
},
{
"x": 395.6,
"y": 234.2,
"createdAt": 1771653399012
},
{
"x": 395.9,
"y": 234.2,
"createdAt": 1771653399016
},
{
"x": 395.9,
"y": 234,
"createdAt": 1771653399020
},
{
"x": 395.6,
"y": 233.9,
"createdAt": 1771653399024
},
{
"x": 395.6,
"y": 233.9,
"createdAt": 1771653399028
},
{
"x": 395.5,
"y": 234.1,
"createdAt": 1771653399032
},
{
"x": 395.6,
"y": 233.9,
"createdAt": 1771653399036
},
{
"x": 396,
"y": 233.7,
"createdAt": 1771653399040
},
{
"x": 395.5,
"y": 234.2,
"createdAt": 1771653399044
},
{
"x": 395.4,
"y": 233.9,
"createdAt": 1771653399048
},
{
"x": 395.6,
"y": 234,
"createdAt": 1771653399052
},
{
"x": 395.7,
"y": 234.2,
"createdAt": 1771653399056
},
{
"x": 395.5,
"y": 234,
"createdAt": 1771653399060
},
{
"x": 395.6,
"y": 234,
"createdAt": 1771653399064
},
{
"x": 395.8,
"y": 234,
"createdAt": 1771653399068
},
{
"x": 395.6,
"y": 234.1,
"createdAt": 1771653399072
},
{
"x": 395.8,
"y": 234.1,
"createdAt": 1771653399076
},
{
"x": 395.3,
"y": 234.2,
"createdAt": 1771653399080
},
{
"x": 395.8,
"y": 233.9,
"createdAt": 1771653399084
},
{
"x": 395.4,
"y": 233.8,
"createdAt": 1771653399088
},
{
"x": 395.6,
"y": 234.1,
"createdAt": 1771653399092
},
{
"x": 395.3,
"y": 233.7,
"createdAt": 1771653399096
},
{
"x": 395.4,
"y": 234.1,
"createdAt": 1771653399100
},
{
"x": 395.1,
"y": 234.1,
"createdAt": 1771653399104
},
{
"x": 395.5,
"y": 233.9,
"createdAt": 1771653399108
},
{
"x": 395.3,
"y": 234,
"createdAt": 1771653399112
},
{
"x": 395.1,
"y": 234.3,
"createdAt": 1771653399116
},
{
"x": 395.5,
"y": 233.9,
"createdAt": 1771653399120
},
{
"x": 395.1,
"y": 234,
"createdAt": 1771653399124
},
{
"x": 395.3,
"y": 234,
"createdAt": 1771653399128
},
{
"x": 395.2,
"y": 234.1,
"createdAt": 1771653399132
},
{
"x": 395.3,
"y": 234.3,
"createdAt": 1771653399136
},
{
"x": 395.3,
"y": 233.9,
"createdAt": 1771653399140
},
{
"x": 395.4,
"y": 233.8,
"createdAt": 1771653399144
},
{
"x": 395.1,
"y": 234.1,
"createdAt": 1771653399148
},
{
"x": 395.2,
"y": 234,
"createdAt": 1771653399152
},
{
"x": 395.3,
"y": 234.3,
"createdAt": 1771653399156
},
{
"x": 395.4,
"y": 234.2,
"createdAt": 1771653399160
},
{
"x": 395.4,
"y": 234.1,
"createdAt": 1771653399164
},
{
"x": 395,
"y": 234.2,
"createdAt": 1771653399168
},
{
"x": 395.1,
"y": 234.1,
"createdAt": 1771653399172
},
{
"x": 395,
"y": 234.1,
"createdAt": 1771653399176
},
{
"x": 395.2,
"y": 233.9,
"createdAt": 1771653399180
},
{
"x": 395.2,
"y": 234.3,
"createdAt": 1771653399184
},
{
"x": 395.3,
"y": 234.7,
"createdAt": 1771653399188
},
{
"x": 395,
"y": 234.7,
"createdAt": 1771653399192
},
{
"x": 395.1,
"y": 235.2,
"createdAt": 1771653399196
},
{
"x": 394.7,
"y": 236.1,
"createdAt": 1771653399200
},
{
"x": 394.5,
"y": 236.7,
"createdAt": 1771653399204
},
{
"x": 394.4,
"y": 237.2,
"createdAt": 1771653399208
},
{
"x": 394.5,
"y": 237.2,
"createdAt": 1771653399212
},
{
"x": 393.8,
"y": 237.7,
"createdAt": 1771653399216
},
{
"x": 393.8,
"y": 238.9,
"createdAt": 1771653399220
},
{
"x": 393.4,
"y": 239.6,
"createdAt": 1771653399224
},
{
"x": 393,
"y": 240.1,
"createdAt": 1771653399228
},
{
"x": 392.9,
"y": 241.2,
"createdAt": 1771653399232
},
{
"x": 393,
"y": 241.3,
"createdAt": 1771653399236
},
{
"x": 392.8,
"y": 241.6,
"createdAt": 1771653399240
},
{
"x": 392.2,
"y": 241.7,
"createdAt": 1771653399244
},
{
"x": 392,
"y": 242.1,
"createdAt": 1771653399248
},
{
"x": 392.3,
"y": 242.4,
"createdAt": 1771653399252
},
{
"x": 392.2,
"y": 242.7,
"createdAt": 1771653399256
},
{
"x": 392,
"y": 243,
"createdAt": 1771653399260
},
{
"x": 392.1,
"y": 243.1,
"createdAt": 1771653399264
},
{
"x": 392,
"y": 243.3,
"createdAt": 1771653399268
},
{
"x": 391.9,
"y": 243.5,
"createdAt": 1771653399272
},
{
"x": 391.9,
"y": 243.7,
"createdAt": 1771653399276
},
{
"x": 391.8,
"y": 243.7,
"createdAt": 1771653399280
},
{
"x": 392.2,
"y": 244.3,
"createdAt": 1771653399284
},
{
"x": 392.3,
"y": 244.8,
"createdAt": 1771653399288
},
{
"x": 392.1,
"y": 244.6,
"createdAt": 1771653399292
},
{
"x": 391.9,
"y": 245.2,
"createdAt": 1771653399296
},
{
"x": 392.4,
"y": 245.7,
"createdAt": 1771653399300
},
{
"x": 392.3,
"y": 246.6,
"createdAt": 1771653399304
},
{
"x": 392.5,
"y": 247,
"createdAt": 1771653399308
},
{
"x": 393,
"y": 248.1,
"createdAt": 1771653399312
},
{
"x": 393.1,
"y": 248.8,
"createdAt": 1771653399316
},
{
"x": 393.5,
"y": 250,
"createdAt": 1771653399320
},
{
"x": 393.5,
"y": 251.1,
"createdAt": 1771653399324
},
{
"x": 393.7,
"y": 252.1,
"createdAt": 1771653399328
},
{
"x": 394.6,
"y": 252.5,
"createdAt": 1771653399332
},
{
"x": 394.7,
"y": 253.8,
"createdAt": 1771653399336
},
{
"x": 395.8,
"y": 254.5,
"createdAt": 1771653399340
},
{
"x": 396,
"y": 254.9,
"createdAt": 1771653399344
},
{
"x": 396.2,
"y": 255.7,
"createdAt": 1771653399348
},
{
"x": 396.6,
"y": 256.3,
"createdAt": 1771653399352
},
{
"x": 396.9,
"y": 256.7,
"createdAt": 1771653399356
},
{
"x": 396.7,
"y": 257.2,
"createdAt": 1771653399360
},
{
"x": 397.2,
"y": 257,
"createdAt": 1771653399364
},
{
"x": 396.8,
"y": 257.3,
"createdAt": 1771653399368
},
{
"x": 396.7,
"y": 258,
"createdAt": 1771653399372
},
{
"x": 396.7,
"y": 257.8,
"createdAt": 1771653399376
},
{
"x": 397.4,
"y": 258.1,
"createdAt": 1771653399380
},
{
"x": 397.8,
"y": 258.3,
"createdAt": 1771653399384
},
{
"x": 397.7,
"y": 258.6,
"createdAt": 1771653399388
},
{
"x": 398.3,
"y": 258.9,
"createdAt": 1771653399392
},
{
"x": 398.8,
"y": 259.2,
"createdAt": 1771653399396
},
{
"x": 399,
"y": 259.5,
"createdAt": 1771653399400
},
{
"x": 399.5,
"y": 259.8,
"createdAt": 1771653399404
},
{
"x": 400.1,
"y": 259.8,
"createdAt": 1771653399408
},
{
"x": 401,
"y": 260,
"createdAt": 1771653399412
},
{
"x": 401.4,
"y": 260.6,
"createdAt": 1771653399416
},
{
"x": 402.2,
"y": 260.5,
"createdAt": 1771653399420
},
{
"x": 402.9,
"y": 260.8,
"createdAt": 1771653399424
},
{
"x": 403.6,
"y": 261.2,
"createdAt": 1771653399428
},
{
"x": 404.3,
"y": 261.4,
"createdAt": 1771653399432
},
{
"x": 405.4,
"y": 261.5,
"createdAt": 1771653399436
},
{
"x": 406.1,
"y": 262.1,
"createdAt": 1771653399440
},
{
"x": 407.3,
"y": 262.2,
"createdAt": 1771653399444
},
{
"x": 407.8,
"y": 262.2,
"createdAt": 1771653399448
},
{
"x": 409.1,
"y": 262.1,
"createdAt": 1771653399452
},
{
"x": 410.2,
"y": 261.8,
"createdAt": 1771653399456
},
{
"x": 410.8,
"y": 262.1,
"createdAt": 1771653399460
},
{
"x": 412.1,
"y": 261.9,
"createdAt": 1771653399464
},
{
"x": 412.8,
"y": 262.1,
"createdAt": 1771653399468
},
{
"x": 414.2,
"y": 261.9,
"createdAt": 1771653399472
},
{
"x": 414.5,
"y": 262,
"createdAt": 1771653399476
},
{
"x": 415.3,
"y": 262.2,
"createdAt": 1771653399480
},
{
"x": 415.3,
"y": 261.8,
"createdAt": 1771653399484
},
{
"x": 416.2,
"y": 261.8,
"createdAt": 1771653399488
},
{
"x": 416.4,
"y": 261.9,
"createdAt": 1771653399492
},
{
"x": 417.3,
"y": 261.8,
"createdAt": 1771653399496
},
{
"x": 417.5,
"y": 261.9,
"createdAt": 1771653399500
},
{
"x": 417.8,
"y": 261.9,
"createdAt": 1771653399504
},
{
"x": 418.5,
"y": 261.8,
"createdAt": 1771653399508
},
{
"x": 418.7,
"y": 262.2,
"createdAt": 1771653399512
},
{
"x": 418.5,
"y": 262.2,
"createdAt": 1771653399516
},
{
"x": 418.8,
"y": 261.8,
"createdAt": 1771653399520
},
{
"x": 419.5,
"y": 261,
"createdAt": 1771653399524
},
{
"x": 420,
"y": 260.3,
"createdAt": 1771653399528
},
{
"x": 420.5,
"y": 259.7,
"createdAt": 1771653399532
},
{
"x": 420.9,
"y": 259,
"createdAt": 1771653399536
},
{
"x": 421.5,
"y": 258.2,
"createdAt": 1771653399540
},
{
"x": 421.9,
"y": 257.1,
"createdAt": 1771653399544
},
{
"x": 422.3,
"y": 256,
"createdAt": 1771653399548
},
{
"x": 422.9,
"y": 254.9,
"createdAt": 1771653399552
},
{
"x": 423.4,
"y": 254.2,
"createdAt": 1771653399556
},
{
"x": 423.5,
"y": 252.9,
"createdAt": 1771653399560
},
{
"x": 423.9,
"y": 251.7,
"createdAt": 1771653399564
},
{
"x": 423.8,
"y": 251.1,
"createdAt": 1771653399568
},
{
"x": 424.5,
"y": 250.4,
"createdAt": 1771653399572
},
{
"x": 424.5,
"y": 249.7,
"createdAt": 1771653399576
},
{
"x": 424.9,
"y": 248.7,
"createdAt": 1771653399580
},
{
"x": 424.9,
"y": 248.3,
"createdAt": 1771653399584
},
{
"x": 425.1,
"y": 247.3,
"createdAt": 1771653399588
},
{
"x": 425.4,
"y": 246.4,
"createdAt": 1771653399592
},
{
"x": 425.5,
"y": 245.7,
"createdAt": 1771653399596
},
{
"x": 425.9,
"y": 244.8,
"createdAt": 1771653399600
},
{
"x": 426.1,
"y": 244.3,
"createdAt": 1771653399604
},
{
"x": 425.8,
"y": 243.9,
"createdAt": 1771653399608
},
{
"x": 425.9,
"y": 243.8,
"createdAt": 1771653399612
},
{
"x": 426.3,
"y": 243.2,
"createdAt": 1771653399616
},
{
"x": 425.9,
"y": 242.7,
"createdAt": 1771653399620
},
{
"x": 426,
"y": 242.6,
"createdAt": 1771653399624
},
{
"x": 425.8,
"y": 242.2,
"createdAt": 1771653399628
},
{
"x": 425.9,
"y": 242.1,
"createdAt": 1771653399632
},
{
"x": 425.7,
"y": 241.8,
"createdAt": 1771653399636
},
{
"x": 425.7,
"y": 241.6,
"createdAt": 1771653399640
},
{
"x": 425.4,
"y": 241.4,
"createdAt": 1771653399644
},
{
"x": 425.3,
"y": 240.8,
"createdAt": 1771653399648
},
{
"x": 423.9,
"y": 240.7,
"createdAt": 1771653399652
},
{
"x": 422.8,
"y": 240.6,
"createdAt": 1771653399656
},
{
"x": 421.9,
"y": 240,
"createdAt": 1771653399660
},
{
"x": 420.8,
"y": 240,
"createdAt": 1771653399664
},
{
"x": 420,
"y": 240,
"createdAt": 1771653399668
},
{
"x": 418.5,
"y": 239.4,
"createdAt": 1771653399672
},
{
"x": 417.2,
"y": 239.3,
"createdAt": 1771653399676
},
{
"x": 416.1,
"y": 239.3,
"createdAt": 1771653399680
},
{
"x": 415,
"y": 238.5,
"createdAt": 1771653399684
},
{
"x": 413.5,
"y": 238.4,
"createdAt": 1771653399688
},
{
"x": 412.5,
"y": 238.5,
"createdAt": 1771653399692
},
{
"x": 410.8,
"y": 238.3,
"createdAt": 1771653399696
},
{
"x": 410,
"y": 237.8,
"createdAt": 1771653399700
},
{
"x": 408.8,
"y": 238.2,
"createdAt": 1771653399704
},
{
"x": 407.9,
"y": 237.9,
"createdAt": 1771653399708
},
{
"x": 406.9,
"y": 237.7,
"createdAt": 1771653399712
},
{
"x": 406.4,
"y": 237.7,
"createdAt": 1771653399716
},
{
"x": 405.3,
"y": 237.8,
"createdAt": 1771653399720
},
{
"x": 404.9,
"y": 237.5,
"createdAt": 1771653399724
},
{
"x": 403.9,
"y": 237,
"createdAt": 1771653399728
},
{
"x": 403.7,
"y": 236.9,
"createdAt": 1771653399732
},
{
"x": 403.5,
"y": 236.9,
"createdAt": 1771653399736
},
{
"x": 403,
"y": 236.8,
"createdAt": 1771653399740
},
{
"x": 402.7,
"y": 237,
"createdAt": 1771653399744
},
{
"x": 403,
"y": 237.1,
"createdAt": 1771653399748
},
{
"x": 402.8,
"y": 236.9,
"createdAt": 1771653399752
},
{
"x": 402.2,
"y": 236.7,
"createdAt": 1771653399756
},
{
"x": 401.7,
"y": 237.3,
"createdAt": 1771653399760
},
{
"x": 401.8,
"y": 237.1,
"createdAt": 1771653399764
},
{
"x": 401.9,
"y": 237,
"createdAt": 1771653399768
},
{
"x": 401.8,
"y": 237.2,
"createdAt": 1771653399772
},
{
"x": 401.7,
"y": 237,
"createdAt": 1771653399776
},
{
"x": 401.6,
"y": 237.1,
"createdAt": 1771653399780
},
{
"x": 401,
"y": 236.8,
"createdAt": 1771653399784
},
{
"x": 401,
"y": 236.8,
"createdAt": 1771653399788
},
{
"x": 400.8,
"y": 237,
"createdAt": 1771653399792
},
{
"x": 400.7,
"y": 237.6,
"createdAt": 1771653399796
},
{
"x": 400.4,
"y": 237.8,
"createdAt": 1771653399800
},
{
"x": 400.5,
"y": 238.2,
"createdAt": 1771653399804
},
{
"x": 400,
"y": 239,
"createdAt": 1771653399808
},
{
"x": 399,
"y": 239.9,
"createdAt": 1771653399812
},
{
"x": 398.6,
"y": 240.3,
"createdAt": 1771653399816
},
{
"x": 397.5,
"y": 241.5,
"createdAt": 1771653399820
},
{
"x": 397.2,
"y": 241.9,
"createdAt": 1771653399824
},
{
"x": 396.5,
"y": 242.7,
"createdAt": 1771653399828
},
{
"x": 395.3,
"y": 243.1,
"createdAt": 1771653399832
},
{
"x": 394.9,
"y": 243.8,
"createdAt": 1771653399836
},
{
"x": 394,
"y": 244.1,
"createdAt": 1771653399840
},
{
"x": 393.3,
"y": 244.3,
"createdAt": 1771653399844
},
{
"x": 392.9,
"y": 244.8,
"createdAt": 1771653399848
},
{
"x": 392.2,
"y": 245.5,
"createdAt": 1771653399852
},
{
"x": 392,
"y": 245.9,
"createdAt": 1771653399856
},
{
"x": 391.4,
"y": 246.3,
"createdAt": 1771653399860
},
{
"x": 390.9,
"y": 246.9,
"createdAt": 1771653399864
},
{
"x": 390.2,
"y": 247.6,
"createdAt": 1771653399868
},
{
"x": 389.8,
"y": 247.9,
"createdAt": 1771653399872
}
]
]
/*
* Autopen — simulate Apple Pencil Pro input on a DOM element.
*
* Construction:
* - new Autopen(strokes) stroke arrays inline
* - new Autopen('/hello.json') fetch stroke arrays from URL
* - new Autopen(src, { pauseAtPoint: 20 })
*
* Drawing:
* - const items = await sketch.draw(canvas)
* - dispatches PointerEvent, MouseEvent, TouchEvent per point
* - all events fire on the target element and bubble naturally
* - returns PaperJS items created (one per stroke)
*
* Stroke format:
* - [[{ x, y, createdAt }, ...], ...]
* - timing deltas between points are replayed as-is
* - 240Hz / 4ms deltas with sub-pixel coords for realism
*
* Hooks:
* - pen.register(20, (pt, i) => { ... })
* - fires callback when global point index reaches N
* - chainable: pen.register(20, fn).register(50, fn)
*
* Pause/resume:
* - pauseAtPoint halts after the Nth point across all strokes
* - call pen.resume() to continue
*
* Event cascade (per point):
* - PointerEvent (pointerType: 'pen', pressure curve, tilt)
* - MouseEvent (synthesized, matches browser behavior)
* - TouchEvent (skipped when Touch constructor unavailable)
*
* Lifecycle per stroke:
* - hover approach (4 pointermoves converging on first point)
* - pointerdown + mousedown + touchstart
* - pointermove + mousemove + touchmove (per drag point)
* - pointerup + mouseup + touchend
* - hover depart (3 pointermoves drifting away)
*/
const delay = ms =>
new Promise(r => setTimeout(r, ms))
const lerp = (a, b, t) => a + (b - a) * t
let nextId = 100
const pointerId = () => nextId++
const canTouch = typeof Touch !== 'undefined'
const tilt = () => ({
tiltX: 20 + (Math.random() - 0.5) * 4,
tiltY: -15 + (Math.random() - 0.5) * 4
})
const pressure = (i, total) => {
const t = i / (total - 1 || 1)
const noise = (Math.random() - 0.5) * 0.08
if (t < 0.15) return 0.15 + (t / 0.15) * 0.30
if (t > 0.85) return 0.45 - ((t - 0.85) / 0.15) * 0.30
return 0.45 + noise
}
const hoverTrail = (from, to, steps) =>
Array.from({ length: steps }, (_, i) => ({
x: lerp(from.x, to.x, (i + 1) / (steps + 1)),
y: lerp(from.y, to.y, (i + 1) / (steps + 1))
}))
const pointerOpts = (x, y, id, p, extra = {}) => ({
clientX: x,
clientY: y,
pageX: x + window.scrollX,
pageY: y + window.scrollY,
screenX: x,
screenY: y,
pointerId: id,
pointerType: 'pen',
isPrimary: true,
pressure: p,
width: 1,
height: 1,
bubbles: true,
cancelable: true,
composed: true,
...tilt(),
...extra
})
const mouseOpts = (x, y, extra = {}) => ({
clientX: x,
clientY: y,
pageX: x + window.scrollX,
pageY: y + window.scrollY,
screenX: x,
screenY: y,
bubbles: true,
cancelable: true,
composed: true,
...extra
})
const touchObj = (x, y, target, id) =>
canTouch
? new Touch({
identifier: id,
target,
clientX: x,
clientY: y,
pageX: x + window.scrollX,
pageY: y + window.scrollY,
screenX: x,
screenY: y,
radiusX: 0.5,
radiusY: 0.5,
force: 0
})
: null
const touchOpts = (touch, extra = {}) => ({
bubbles: true,
cancelable: true,
composed: true,
touches: [touch],
targetTouches: [touch],
changedTouches: [touch],
...extra
})
const dispatchTouch = (target, type, touch, extra) => {
if (!touch) return
target.dispatchEvent(
new TouchEvent(type, touchOpts(touch, extra))
)
}
class Autopen {
#strokes
#canvas
#id
#len
#pauseAt
#resumeFn
#globalIdx
#src
#strokeIdx
#hooks
constructor(src, { pauseAtPoint } = {}) {
if (typeof src === 'string')
this.#src = src
else if (Array.isArray(src))
this.#strokes = src
else
throw new TypeError(
`expected strokes array or URL, got ${typeof src}`
)
if (pauseAtPoint != null && (!Number.isInteger(pauseAtPoint) || pauseAtPoint < 1))
throw new TypeError(
`pauseAtPoint must be a positive integer, got ${pauseAtPoint}`
)
this.#pauseAt = pauseAtPoint ?? null
this.#resumeFn = null
this.#hooks = new Map()
}
register(point, fn) {
if (!Number.isInteger(point) || point < 1)
throw new TypeError(
`point must be a positive integer, got ${point}`
)
if (typeof fn !== 'function')
throw new TypeError(
`callback must be a function, got ${typeof fn}`
)
this.#hooks.set(point, fn)
return this
}
resume() {
if (!this.#resumeFn)
throw new Error('not paused')
console.log('[Autopen] resumed')
this.#resumeFn()
this.#resumeFn = null
}
async #load() {
if (this.#strokes) return
const res = await fetch(this.#src)
if (!res.ok)
throw new Error(`${this.#src}: ${res.status}`)
this.#strokes = await res.json()
}
async *#timed(pts) {
yield pts[0]
for (let i = 1; i < pts.length; i++) {
await delay(pts[i].createdAt - pts[i - 1].createdAt)
yield pts[i]
}
}
#down(pt) {
const c = this.#canvas
const id = this.#id
const origin = { x: pt.x - 12, y: pt.y - 18 }
const trail = hoverTrail(origin, pt, 4)
const tag = `[Autopen] stroke ${this.#strokeIdx}`
console.log(
`${tag} — approaching (${pt.x}, ${pt.y})`
)
c.dispatchEvent(new PointerEvent(
'pointerover',
pointerOpts(trail[0].x, trail[0].y, id, 0)
))
c.dispatchEvent(new PointerEvent(
'pointerenter',
pointerOpts(
trail[0].x, trail[0].y, id, 0,
{ bubbles: false }
)
))
for (const h of trail)
c.dispatchEvent(new PointerEvent(
'pointermove',
pointerOpts(h.x, h.y, id, 0)
))
console.log(
`${tag} — down at (${pt.x}, ${pt.y})`
)
const p0 = pressure(0, this.#len)
c.dispatchEvent(new PointerEvent(
'pointerdown',
pointerOpts(
pt.x, pt.y, id, p0,
{ button: 0, buttons: 1 }
)
))
c.dispatchEvent(new MouseEvent(
'mousedown',
mouseOpts(pt.x, pt.y, { button: 0, buttons: 1 })
))
c.dispatchEvent(new PointerEvent(
'gotpointercapture',
pointerOpts(pt.x, pt.y, id, p0)
))
dispatchTouch(
c, 'touchstart',
touchObj(pt.x, pt.y, c, id)
)
console.log(`${tag} — dragging`)
}
#drag(pt, i) {
const c = this.#canvas
const id = this.#id
const p = pressure(i, this.#len)
c.dispatchEvent(new PointerEvent(
'pointermove',
pointerOpts(pt.x, pt.y, id, p)
))
c.dispatchEvent(new MouseEvent(
'mousemove',
mouseOpts(pt.x, pt.y)
))
dispatchTouch(
c, 'touchmove',
touchObj(pt.x, pt.y, c, id)
)
}
#up(pt) {
const c = this.#canvas
const id = this.#id
const tag = `[Autopen] stroke ${this.#strokeIdx}`
console.log(
`${tag} — up at (${pt.x}, ${pt.y})`
)
c.dispatchEvent(new PointerEvent(
'pointerup',
pointerOpts(
pt.x, pt.y, id, 0,
{ button: 0, buttons: 0 }
)
))
c.dispatchEvent(new MouseEvent(
'mouseup',
mouseOpts(pt.x, pt.y, { button: 0, buttons: 0 })
))
const touch = touchObj(pt.x, pt.y, c, id)
dispatchTouch(
c, 'touchend', touch,
{ touches: [], targetTouches: [] }
)
c.dispatchEvent(new PointerEvent(
'lostpointercapture',
pointerOpts(pt.x, pt.y, id, 0)
))
const depart = { x: pt.x + 10, y: pt.y - 15 }
const trail = hoverTrail(pt, depart, 3)
for (const h of trail)
c.dispatchEvent(new PointerEvent(
'pointermove',
pointerOpts(h.x, h.y, id, 0)
))
c.dispatchEvent(new PointerEvent(
'pointerout',
pointerOpts(depart.x, depart.y, id, 0)
))
c.dispatchEvent(new PointerEvent(
'pointerleave',
pointerOpts(
depart.x, depart.y, id, 0,
{ bubbles: false }
)
))
console.log(`${tag} — departing`)
}
async #stroke(pts) {
this.#id = pointerId()
this.#len = pts.length
let i = 0
for await (const pt of this.#timed(pts)) {
i === 0 ? this.#down(pt) : this.#drag(pt, i)
this.#globalIdx++
if (this.#hooks.has(this.#globalIdx))
this.#hooks.get(this.#globalIdx)(pt, this.#globalIdx)
if (
this.#pauseAt !== null &&
this.#globalIdx === this.#pauseAt
) {
console.log(
`[Autopen] paused at point ${this.#globalIdx}` +
` — call .resume() to continue`
)
await new Promise(r => { this.#resumeFn = r })
}
i++
}
this.#up(pts.at(-1))
}
async draw(el) {
if (!(el instanceof Element))
throw new TypeError(
`expected a DOM element, got ${typeof el}`
)
await this.#load()
this.#canvas = el
this.#globalIdx = 0
const items = []
const before = paper.project.activeLayer.children.length
for (let s = 0; s < this.#strokes.length; s++) {
const pts = this.#strokes[s]
this.#strokeIdx = s + 1
if (s > 0) {
const prev = this.#strokes[s - 1].at(-1)
await delay(pts[0].createdAt - prev.createdAt)
}
await this.#stroke(pts)
const kids = paper.project.activeLayer.children
if (kids.length > before + items.length)
items.push(kids.at(-1))
}
return items
}
}
export { Autopen }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment