sketchmark 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +188 -0
  2. package/bin/sketchmark.cjs +2008 -0
  3. package/dist/src/builders/index.d.ts +74 -0
  4. package/dist/src/builders/index.js +230 -0
  5. package/dist/src/compounds.d.ts +13 -0
  6. package/dist/src/compounds.js +118 -0
  7. package/dist/src/deck.d.ts +4 -0
  8. package/dist/src/deck.js +91 -0
  9. package/dist/src/diagnostics.d.ts +5 -0
  10. package/dist/src/diagnostics.js +113 -0
  11. package/dist/src/export/index.d.ts +8 -0
  12. package/dist/src/export/index.js +15 -0
  13. package/dist/src/index.d.ts +19 -0
  14. package/dist/src/index.js +35 -0
  15. package/dist/src/kernel.d.ts +8 -0
  16. package/dist/src/kernel.js +68 -0
  17. package/dist/src/normalize.d.ts +6 -0
  18. package/dist/src/normalize.js +191 -0
  19. package/dist/src/patch.d.ts +5 -0
  20. package/dist/src/patch.js +72 -0
  21. package/dist/src/path-sampling.d.ts +3 -0
  22. package/dist/src/path-sampling.js +275 -0
  23. package/dist/src/player/index.d.ts +68 -0
  24. package/dist/src/player/index.js +600 -0
  25. package/dist/src/project.d.ts +11 -0
  26. package/dist/src/project.js +107 -0
  27. package/dist/src/render/html.d.ts +2 -0
  28. package/dist/src/render/html.js +13 -0
  29. package/dist/src/render/raw-three.d.ts +7 -0
  30. package/dist/src/render/raw-three.js +17 -0
  31. package/dist/src/render/svg.d.ts +3 -0
  32. package/dist/src/render/svg.js +277 -0
  33. package/dist/src/render/three-html.d.ts +2 -0
  34. package/dist/src/render/three-html.js +303 -0
  35. package/dist/src/render/three-preview-svg.d.ts +3 -0
  36. package/dist/src/render/three-preview-svg.js +102 -0
  37. package/dist/src/scenes.d.ts +4 -0
  38. package/dist/src/scenes.js +25 -0
  39. package/dist/src/schema.d.ts +2 -0
  40. package/dist/src/schema.js +403 -0
  41. package/dist/src/sequences.d.ts +43 -0
  42. package/dist/src/sequences.js +109 -0
  43. package/dist/src/shapes/builtins.d.ts +2 -0
  44. package/dist/src/shapes/builtins.js +429 -0
  45. package/dist/src/shapes/common.d.ts +9 -0
  46. package/dist/src/shapes/common.js +75 -0
  47. package/dist/src/shapes/geometry.d.ts +22 -0
  48. package/dist/src/shapes/geometry.js +166 -0
  49. package/dist/src/shapes/index.d.ts +2 -0
  50. package/dist/src/shapes/index.js +18 -0
  51. package/dist/src/shapes/registry.d.ts +9 -0
  52. package/dist/src/shapes/registry.js +35 -0
  53. package/dist/src/shapes/types.d.ts +34 -0
  54. package/dist/src/shapes/types.js +2 -0
  55. package/dist/src/types.d.ts +439 -0
  56. package/dist/src/types.js +2 -0
  57. package/dist/src/utils.d.ts +25 -0
  58. package/dist/src/utils.js +157 -0
  59. package/dist/src/validate.d.ts +2 -0
  60. package/dist/src/validate.js +434 -0
  61. package/dist/tests/run.d.ts +1 -0
  62. package/dist/tests/run.js +651 -0
  63. package/package.json +52 -0
  64. package/schema/visual.schema.json +930 -0
@@ -0,0 +1,930 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://sketchmark.dev/schema/visual.schema.json",
4
+ "title": "Sketchmark Primitive Visual Document",
5
+ "type": "object",
6
+ "required": [
7
+ "version",
8
+ "canvas"
9
+ ],
10
+ "additionalProperties": true,
11
+ "properties": {
12
+ "version": {
13
+ "const": 1
14
+ },
15
+ "canvas": {
16
+ "type": "object",
17
+ "required": [
18
+ "width",
19
+ "height"
20
+ ],
21
+ "additionalProperties": true,
22
+ "properties": {
23
+ "width": {
24
+ "type": "number"
25
+ },
26
+ "height": {
27
+ "type": "number"
28
+ },
29
+ "background": {
30
+ "type": "string"
31
+ },
32
+ "duration": {
33
+ "type": "number"
34
+ },
35
+ "fps": {
36
+ "type": "number"
37
+ },
38
+ "space": {
39
+ "enum": [
40
+ "2d",
41
+ "3d"
42
+ ]
43
+ },
44
+ "renderer": {
45
+ "enum": [
46
+ "svg",
47
+ "three"
48
+ ]
49
+ }
50
+ }
51
+ },
52
+ "elements": {
53
+ "type": "array",
54
+ "items": {
55
+ "$ref": "#/$defs/element"
56
+ }
57
+ },
58
+ "imports": {
59
+ "type": "object",
60
+ "additionalProperties": {
61
+ "type": "string"
62
+ }
63
+ },
64
+ "assets": {
65
+ "type": "object",
66
+ "additionalProperties": {
67
+ "type": "string"
68
+ }
69
+ },
70
+ "exports": {
71
+ "type": "object",
72
+ "additionalProperties": {
73
+ "type": "object",
74
+ "properties": {
75
+ "format": {
76
+ "enum": [
77
+ "svg",
78
+ "html",
79
+ "png",
80
+ "jpg",
81
+ "mp4",
82
+ "webm",
83
+ "pdf",
84
+ "pptx"
85
+ ]
86
+ },
87
+ "sequence": {
88
+ "type": "string"
89
+ },
90
+ "scene": {
91
+ "type": "string"
92
+ }
93
+ },
94
+ "additionalProperties": true
95
+ }
96
+ },
97
+ "scenes": {
98
+ "type": "object",
99
+ "additionalProperties": {
100
+ "type": "object",
101
+ "required": [
102
+ "elements"
103
+ ],
104
+ "properties": {
105
+ "canvas": {
106
+ "type": "object"
107
+ },
108
+ "elements": {
109
+ "type": "array",
110
+ "items": {
111
+ "$ref": "#/$defs/element"
112
+ }
113
+ },
114
+ "steps": {
115
+ "type": "array",
116
+ "items": {
117
+ "$ref": "#/$defs/deckStep"
118
+ }
119
+ }
120
+ },
121
+ "additionalProperties": true
122
+ }
123
+ },
124
+ "sequences": {
125
+ "type": "object",
126
+ "additionalProperties": {
127
+ "type": "object",
128
+ "required": [
129
+ "id",
130
+ "clips"
131
+ ],
132
+ "properties": {
133
+ "id": {
134
+ "type": "string"
135
+ },
136
+ "clips": {
137
+ "type": "array",
138
+ "items": {
139
+ "$ref": "#/$defs/clip"
140
+ }
141
+ }
142
+ },
143
+ "additionalProperties": true
144
+ }
145
+ }
146
+ },
147
+ "$defs": {
148
+ "point2": {
149
+ "type": "array",
150
+ "minItems": 2,
151
+ "maxItems": 2,
152
+ "items": {
153
+ "type": "number"
154
+ }
155
+ },
156
+ "point3": {
157
+ "type": "array",
158
+ "minItems": 3,
159
+ "maxItems": 3,
160
+ "items": {
161
+ "type": "number"
162
+ }
163
+ },
164
+ "endpoint": {
165
+ "oneOf": [
166
+ {
167
+ "$ref": "#/$defs/point2"
168
+ },
169
+ {
170
+ "type": "string"
171
+ }
172
+ ]
173
+ },
174
+ "paint": {
175
+ "oneOf": [
176
+ {
177
+ "type": "string"
178
+ },
179
+ {
180
+ "type": "object",
181
+ "required": [
182
+ "type",
183
+ "from",
184
+ "to",
185
+ "stops"
186
+ ],
187
+ "properties": {
188
+ "type": {
189
+ "const": "linearGradient"
190
+ },
191
+ "from": {
192
+ "$ref": "#/$defs/point2"
193
+ },
194
+ "to": {
195
+ "$ref": "#/$defs/point2"
196
+ },
197
+ "stops": {
198
+ "$ref": "#/$defs/gradientStops"
199
+ }
200
+ },
201
+ "additionalProperties": true
202
+ },
203
+ {
204
+ "type": "object",
205
+ "required": [
206
+ "type",
207
+ "center",
208
+ "radius",
209
+ "stops"
210
+ ],
211
+ "properties": {
212
+ "type": {
213
+ "const": "radialGradient"
214
+ },
215
+ "center": {
216
+ "$ref": "#/$defs/point2"
217
+ },
218
+ "radius": {
219
+ "type": "number"
220
+ },
221
+ "focus": {
222
+ "$ref": "#/$defs/point2"
223
+ },
224
+ "stops": {
225
+ "$ref": "#/$defs/gradientStops"
226
+ }
227
+ },
228
+ "additionalProperties": true
229
+ },
230
+ {
231
+ "type": "object",
232
+ "required": [
233
+ "type",
234
+ "src",
235
+ "width",
236
+ "height"
237
+ ],
238
+ "properties": {
239
+ "type": {
240
+ "const": "pattern"
241
+ },
242
+ "src": {
243
+ "type": "string"
244
+ },
245
+ "x": {
246
+ "type": "number"
247
+ },
248
+ "y": {
249
+ "type": "number"
250
+ },
251
+ "width": {
252
+ "type": "number"
253
+ },
254
+ "height": {
255
+ "type": "number"
256
+ },
257
+ "fit": {
258
+ "$ref": "#/$defs/imageFit"
259
+ },
260
+ "opacity": {
261
+ "type": "number"
262
+ }
263
+ },
264
+ "additionalProperties": true
265
+ }
266
+ ]
267
+ },
268
+ "imageFit": {
269
+ "enum": [
270
+ "fill",
271
+ "contain",
272
+ "cover"
273
+ ]
274
+ },
275
+ "gradientStops": {
276
+ "type": "array",
277
+ "minItems": 2,
278
+ "items": {
279
+ "oneOf": [
280
+ {
281
+ "type": "array",
282
+ "minItems": 2,
283
+ "maxItems": 2,
284
+ "prefixItems": [
285
+ {
286
+ "type": "number"
287
+ },
288
+ {
289
+ "type": "string"
290
+ }
291
+ ]
292
+ },
293
+ {
294
+ "type": "object",
295
+ "required": [
296
+ "offset",
297
+ "color"
298
+ ],
299
+ "properties": {
300
+ "offset": {
301
+ "type": "number"
302
+ },
303
+ "color": {
304
+ "type": "string"
305
+ }
306
+ },
307
+ "additionalProperties": true
308
+ }
309
+ ]
310
+ }
311
+ },
312
+ "effects": {
313
+ "type": "object",
314
+ "properties": {
315
+ "blur": {
316
+ "type": "number"
317
+ },
318
+ "brightness": {
319
+ "type": "number"
320
+ },
321
+ "contrast": {
322
+ "type": "number"
323
+ },
324
+ "saturate": {
325
+ "type": "number"
326
+ },
327
+ "hueRotate": {
328
+ "type": "number"
329
+ },
330
+ "shadow": {
331
+ "type": "object",
332
+ "required": [
333
+ "dx",
334
+ "dy",
335
+ "blur",
336
+ "color"
337
+ ],
338
+ "properties": {
339
+ "dx": {
340
+ "type": "number"
341
+ },
342
+ "dy": {
343
+ "type": "number"
344
+ },
345
+ "blur": {
346
+ "type": "number"
347
+ },
348
+ "color": {
349
+ "type": "string"
350
+ },
351
+ "opacity": {
352
+ "type": "number"
353
+ }
354
+ },
355
+ "additionalProperties": true
356
+ }
357
+ },
358
+ "additionalProperties": true
359
+ },
360
+ "clipShape": {
361
+ "oneOf": [
362
+ {
363
+ "type": "object",
364
+ "required": [
365
+ "type",
366
+ "x",
367
+ "y",
368
+ "width",
369
+ "height"
370
+ ],
371
+ "properties": {
372
+ "type": {
373
+ "const": "rect"
374
+ },
375
+ "x": {
376
+ "type": "number"
377
+ },
378
+ "y": {
379
+ "type": "number"
380
+ },
381
+ "width": {
382
+ "type": "number"
383
+ },
384
+ "height": {
385
+ "type": "number"
386
+ },
387
+ "radius": {
388
+ "type": "number"
389
+ },
390
+ "opacity": {
391
+ "type": "number"
392
+ }
393
+ },
394
+ "additionalProperties": true
395
+ },
396
+ {
397
+ "type": "object",
398
+ "required": [
399
+ "type",
400
+ "cx",
401
+ "cy",
402
+ "radius"
403
+ ],
404
+ "properties": {
405
+ "type": {
406
+ "const": "circle"
407
+ },
408
+ "cx": {
409
+ "type": "number"
410
+ },
411
+ "cy": {
412
+ "type": "number"
413
+ },
414
+ "radius": {
415
+ "type": "number"
416
+ },
417
+ "opacity": {
418
+ "type": "number"
419
+ }
420
+ },
421
+ "additionalProperties": true
422
+ },
423
+ {
424
+ "type": "object",
425
+ "required": [
426
+ "type",
427
+ "d"
428
+ ],
429
+ "properties": {
430
+ "type": {
431
+ "const": "path"
432
+ },
433
+ "d": {
434
+ "type": "string"
435
+ },
436
+ "opacity": {
437
+ "type": "number"
438
+ }
439
+ },
440
+ "additionalProperties": true
441
+ }
442
+ ]
443
+ },
444
+ "imageSource": {
445
+ "type": "object",
446
+ "required": [
447
+ "x",
448
+ "y",
449
+ "width",
450
+ "height",
451
+ "imageWidth",
452
+ "imageHeight"
453
+ ],
454
+ "properties": {
455
+ "x": {
456
+ "type": "number"
457
+ },
458
+ "y": {
459
+ "type": "number"
460
+ },
461
+ "width": {
462
+ "type": "number"
463
+ },
464
+ "height": {
465
+ "type": "number"
466
+ },
467
+ "imageWidth": {
468
+ "type": "number"
469
+ },
470
+ "imageHeight": {
471
+ "type": "number"
472
+ }
473
+ },
474
+ "additionalProperties": true
475
+ },
476
+ "animationValue": {
477
+ "type": "object",
478
+ "additionalProperties": true,
479
+ "properties": {
480
+ "from": {
481
+ "oneOf": [
482
+ {
483
+ "type": "number"
484
+ },
485
+ {
486
+ "type": "string"
487
+ }
488
+ ]
489
+ },
490
+ "to": {
491
+ "oneOf": [
492
+ {
493
+ "type": "number"
494
+ },
495
+ {
496
+ "type": "string"
497
+ }
498
+ ]
499
+ },
500
+ "duration": {
501
+ "type": "number"
502
+ },
503
+ "delay": {
504
+ "type": "number"
505
+ },
506
+ "ease": {
507
+ "type": "string"
508
+ },
509
+ "keyframes": {
510
+ "type": "array",
511
+ "items": {
512
+ "type": "array",
513
+ "minItems": 2,
514
+ "maxItems": 2,
515
+ "prefixItems": [
516
+ {
517
+ "type": "number"
518
+ },
519
+ {
520
+ "oneOf": [
521
+ {
522
+ "type": "number"
523
+ },
524
+ {
525
+ "type": "string"
526
+ }
527
+ ]
528
+ }
529
+ ]
530
+ }
531
+ }
532
+ }
533
+ },
534
+ "clip": {
535
+ "type": "object",
536
+ "required": [
537
+ "scene",
538
+ "duration"
539
+ ],
540
+ "properties": {
541
+ "scene": {
542
+ "type": "string"
543
+ },
544
+ "duration": {
545
+ "type": "number"
546
+ },
547
+ "transition": {
548
+ "oneOf": [
549
+ {
550
+ "enum": [
551
+ "cut",
552
+ "fade"
553
+ ]
554
+ },
555
+ {
556
+ "type": "object",
557
+ "required": [
558
+ "type"
559
+ ],
560
+ "properties": {
561
+ "type": {
562
+ "enum": [
563
+ "cut",
564
+ "fade"
565
+ ]
566
+ },
567
+ "duration": {
568
+ "type": "number"
569
+ }
570
+ },
571
+ "additionalProperties": true
572
+ }
573
+ ]
574
+ }
575
+ },
576
+ "additionalProperties": true
577
+ },
578
+ "deckStep": {
579
+ "type": "object",
580
+ "required": [
581
+ "id"
582
+ ],
583
+ "properties": {
584
+ "id": {
585
+ "type": "string"
586
+ },
587
+ "show": {
588
+ "type": "array",
589
+ "items": {
590
+ "type": "string"
591
+ }
592
+ },
593
+ "hide": {
594
+ "type": "array",
595
+ "items": {
596
+ "type": "string"
597
+ }
598
+ },
599
+ "duration": {
600
+ "type": "number"
601
+ }
602
+ },
603
+ "additionalProperties": true
604
+ },
605
+ "element": {
606
+ "type": "object",
607
+ "required": [
608
+ "type"
609
+ ],
610
+ "additionalProperties": true,
611
+ "properties": {
612
+ "id": {
613
+ "type": "string"
614
+ },
615
+ "type": {
616
+ "enum": [
617
+ "rect",
618
+ "circle",
619
+ "ellipse",
620
+ "line",
621
+ "arrow",
622
+ "arc",
623
+ "curve",
624
+ "polyline",
625
+ "polygon",
626
+ "path",
627
+ "text",
628
+ "image",
629
+ "point",
630
+ "group",
631
+ "cuboid",
632
+ "sphere",
633
+ "plane",
634
+ "line3d",
635
+ "text3d",
636
+ "light"
637
+ ]
638
+ },
639
+ "opacity": {
640
+ "type": "number"
641
+ },
642
+ "fill": {
643
+ "$ref": "#/$defs/paint"
644
+ },
645
+ "stroke": {
646
+ "$ref": "#/$defs/paint"
647
+ },
648
+ "strokeWidth": {
649
+ "type": "number"
650
+ },
651
+ "dashArray": {
652
+ "type": "array",
653
+ "items": {
654
+ "type": "number"
655
+ }
656
+ },
657
+ "strokeCap": {
658
+ "enum": [
659
+ "butt",
660
+ "round",
661
+ "square"
662
+ ]
663
+ },
664
+ "strokeJoin": {
665
+ "enum": [
666
+ "miter",
667
+ "round",
668
+ "bevel"
669
+ ]
670
+ },
671
+ "miterLimit": {
672
+ "type": "number"
673
+ },
674
+ "dashOffset": {
675
+ "type": "number"
676
+ },
677
+ "drawStart": {
678
+ "type": "number"
679
+ },
680
+ "drawEnd": {
681
+ "type": "number"
682
+ },
683
+ "effects": {
684
+ "$ref": "#/$defs/effects"
685
+ },
686
+ "blendMode": {
687
+ "type": "string"
688
+ },
689
+ "rotation": {
690
+ "type": "number"
691
+ },
692
+ "scale": {
693
+ "type": "number"
694
+ },
695
+ "scaleX": {
696
+ "type": "number"
697
+ },
698
+ "scaleY": {
699
+ "type": "number"
700
+ },
701
+ "origin": {
702
+ "oneOf": [
703
+ {
704
+ "type": "string"
705
+ },
706
+ {
707
+ "$ref": "#/$defs/point2"
708
+ }
709
+ ]
710
+ },
711
+ "clip": {
712
+ "$ref": "#/$defs/clipShape"
713
+ },
714
+ "mask": {
715
+ "$ref": "#/$defs/clipShape"
716
+ },
717
+ "animate": {
718
+ "type": "object",
719
+ "additionalProperties": {
720
+ "$ref": "#/$defs/animationValue"
721
+ }
722
+ },
723
+ "metadata": {
724
+ "type": "object",
725
+ "additionalProperties": true
726
+ },
727
+ "align": {
728
+ "enum": [
729
+ "left",
730
+ "center",
731
+ "right"
732
+ ]
733
+ },
734
+ "valign": {
735
+ "enum": [
736
+ "top",
737
+ "middle",
738
+ "bottom"
739
+ ]
740
+ },
741
+ "fontSize": {
742
+ "type": "number"
743
+ },
744
+ "fontFamily": {
745
+ "type": "string"
746
+ },
747
+ "weight": {
748
+ "oneOf": [
749
+ {
750
+ "type": "number"
751
+ },
752
+ {
753
+ "type": "string"
754
+ }
755
+ ]
756
+ },
757
+ "fontStyle": {
758
+ "type": "string"
759
+ },
760
+ "lineHeight": {
761
+ "type": "number"
762
+ },
763
+ "letterSpacing": {
764
+ "type": "number"
765
+ },
766
+ "maxWidth": {
767
+ "type": "number"
768
+ },
769
+ "wrap": {
770
+ "type": "boolean"
771
+ },
772
+ "label": {
773
+ "type": "string"
774
+ },
775
+ "labelX": {
776
+ "type": "number"
777
+ },
778
+ "labelY": {
779
+ "type": "number"
780
+ },
781
+ "progress": {
782
+ "oneOf": [
783
+ {
784
+ "type": "number"
785
+ },
786
+ {
787
+ "$ref": "#/$defs/animationValue"
788
+ }
789
+ ]
790
+ },
791
+ "follow": {
792
+ "type": "string"
793
+ },
794
+ "rotationX": {
795
+ "type": "number"
796
+ },
797
+ "rotationY": {
798
+ "type": "number"
799
+ },
800
+ "rotationZ": {
801
+ "type": "number"
802
+ },
803
+ "scaleZ": {
804
+ "type": "number"
805
+ },
806
+ "x": {
807
+ "type": "number"
808
+ },
809
+ "y": {
810
+ "type": "number"
811
+ },
812
+ "width": {
813
+ "type": "number"
814
+ },
815
+ "height": {
816
+ "type": "number"
817
+ },
818
+ "cx": {
819
+ "type": "number"
820
+ },
821
+ "cy": {
822
+ "type": "number"
823
+ },
824
+ "radius": {
825
+ "type": "number"
826
+ },
827
+ "rx": {
828
+ "type": "number"
829
+ },
830
+ "ry": {
831
+ "type": "number"
832
+ },
833
+ "from": {
834
+ "oneOf": [
835
+ {
836
+ "$ref": "#/$defs/endpoint"
837
+ },
838
+ {
839
+ "$ref": "#/$defs/point3"
840
+ }
841
+ ]
842
+ },
843
+ "to": {
844
+ "oneOf": [
845
+ {
846
+ "$ref": "#/$defs/endpoint"
847
+ },
848
+ {
849
+ "$ref": "#/$defs/point3"
850
+ }
851
+ ]
852
+ },
853
+ "startAngle": {
854
+ "type": "number"
855
+ },
856
+ "endAngle": {
857
+ "type": "number"
858
+ },
859
+ "counterclockwise": {
860
+ "type": "boolean"
861
+ },
862
+ "closed": {
863
+ "type": "boolean"
864
+ },
865
+ "control1": {
866
+ "$ref": "#/$defs/point2"
867
+ },
868
+ "control2": {
869
+ "$ref": "#/$defs/point2"
870
+ },
871
+ "points": {
872
+ "type": "array",
873
+ "items": {
874
+ "$ref": "#/$defs/point2"
875
+ }
876
+ },
877
+ "d": {
878
+ "type": "string"
879
+ },
880
+ "text": {
881
+ "type": "string"
882
+ },
883
+ "lines": {
884
+ "type": "array",
885
+ "items": {
886
+ "type": "string"
887
+ }
888
+ },
889
+ "src": {
890
+ "type": "string"
891
+ },
892
+ "fit": {
893
+ "$ref": "#/$defs/imageFit"
894
+ },
895
+ "source": {
896
+ "$ref": "#/$defs/imageSource"
897
+ },
898
+ "children": {
899
+ "type": "array",
900
+ "items": {
901
+ "$ref": "#/$defs/element"
902
+ }
903
+ },
904
+ "position": {
905
+ "$ref": "#/$defs/point3"
906
+ },
907
+ "size": {
908
+ "oneOf": [
909
+ {
910
+ "$ref": "#/$defs/point3"
911
+ },
912
+ {
913
+ "$ref": "#/$defs/point2"
914
+ }
915
+ ]
916
+ },
917
+ "kind": {
918
+ "enum": [
919
+ "ambient",
920
+ "directional",
921
+ "point"
922
+ ]
923
+ },
924
+ "intensity": {
925
+ "type": "number"
926
+ }
927
+ }
928
+ }
929
+ }
930
+ }