@aikdna/kdna-core 0.37.0 → 0.37.2

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 (65) hide show
  1. package/README.md +28 -7
  2. package/package.json +11 -1
  3. package/src/public-contract/browser-native/generated-contract.json +3 -3
  4. package/src/public-contract/browser-native/sections/contract.json +2 -2
  5. package/src/public-contract/browser-native/whole.js +30 -1
  6. package/src/public-contract/browser-protected/request.js +77 -0
  7. package/src/public-contract/browser-protected/state.js +200 -0
  8. package/src/public-contract/browserwhole06/contract.json +2 -2
  9. package/src/public-contract/creation06/contract.json +2 -2
  10. package/src/public-contract/creation06/generation-manifest.json +8 -8
  11. package/src/public-contract/execution06/contract.json +2 -2
  12. package/src/public-contract/execution06/generation-manifest.json +8 -8
  13. package/src/public-contract/generated-contract.json +3 -3
  14. package/src/public-contract/issuer-contract.generated.json +6 -6
  15. package/src/public-contract/issuer-validators.generated.js +7 -7
  16. package/src/public-contract/key-grant-issuer-node.d.ts +1 -1
  17. package/src/public-contract/package-set-contract.generated.json +5 -5
  18. package/src/public-contract/package-set-node.d.ts +1 -1
  19. package/src/public-contract/package-set-validators.generated.js +9 -9
  20. package/src/public-contract/packageset06/contract.json +2 -2
  21. package/src/public-contract/packageset06/generation-manifest.json +8 -8
  22. package/src/public-contract/protected-browser-contract/contract.json +11824 -0
  23. package/src/public-contract/protected-browser-contract/descriptor.json +5 -0
  24. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedAdmissionResult.json +443 -0
  25. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedAuthorityContext.json +939 -0
  26. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedBinding.json +156 -0
  27. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedCallResult.json +10489 -0
  28. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedDeliveryToken.json +10 -0
  29. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedExpansionHandle.json +320 -0
  30. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedHostContext.json +677 -0
  31. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedHostObservation.json +208 -0
  32. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedReadAuthority.json +10 -0
  33. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedReadResult.json +10795 -0
  34. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedRequest.json +539 -0
  35. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedRequestAdmission.json +1016 -0
  36. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedSignaturePolicy.json +35 -0
  37. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedSnapshotData.json +8451 -0
  38. package/src/public-contract/protected-browser-contract/schemas/BrowserProtectedTransportCommitResult.json +304 -0
  39. package/src/public-contract/protected-browser-contract/schemas/TrustedBrowserProtectedHost.json +10 -0
  40. package/src/public-contract/protected-browser-contract/types.d.ts +389 -0
  41. package/src/public-contract/protected-browser-contract/validators.cjs +223756 -0
  42. package/src/public-contract/protected-sections-browser.d.ts +11 -0
  43. package/src/public-contract/protected-sections-browser.js +22 -0
  44. package/src/public-contract/protected-sections-browser.mjs +2 -0
  45. package/src/public-contract/protected-source-contract.generated.json +8 -8
  46. package/src/public-contract/protected-source-node.d.ts +1 -1
  47. package/src/public-contract/protection-admission-browser.js +21 -3
  48. package/src/public-contract/protection-contract.generated.json +9 -9
  49. package/src/public-contract/protection-envelope-codec.js +16 -12
  50. package/src/public-contract/protection-node.d.ts +2 -2
  51. package/src/public-contract/protection-validators.generated.js +5 -5
  52. package/src/public-contract/public-contract.d.ts +13 -0
  53. package/src/public-contract/public-contract.js +32 -0
  54. package/src/public-contract/public-contract.mjs +2 -0
  55. package/src/public-contract/retained/contract.json +2 -2
  56. package/src/public-contract/retained/generation-manifest.json +8 -8
  57. package/src/public-contract/retained-browser06/contract.json +2 -2
  58. package/src/public-contract/sectionbytes/contract.json +2 -2
  59. package/src/public-contract/sectionbytes/generation-manifest.json +8 -8
  60. package/src/public-contract/sections/contract.json +2 -2
  61. package/src/public-contract/sections/generation-manifest.json +8 -8
  62. package/src/public-contract/sections-bytes-node.js +31 -0
  63. package/src/public-contract/sections-node.js +36 -1
  64. package/src/public-contract/source-validators.generated.js +6 -6
  65. package/src/public-contract/source06/contract.json +2 -2
@@ -0,0 +1,677 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:kdna:candidate:protected-browser:BrowserProtectedHostContext",
4
+ "title": "BrowserProtectedHostContext",
5
+ "description": "Browser protected retained projection contract. Original base tuple and host-supplied-triple provenance; no native authentication claims.",
6
+ "$ref": "#/$defs/BrowserProtectedHostContext",
7
+ "$defs": {
8
+ "AssetIdentity": {
9
+ "type": "object",
10
+ "properties": {
11
+ "asset_id": {
12
+ "$ref": "#/$defs/Identifier"
13
+ },
14
+ "asset_version": {
15
+ "$ref": "#/$defs/VersionLabel"
16
+ },
17
+ "judgment_version": {
18
+ "$ref": "#/$defs/VersionLabel"
19
+ }
20
+ },
21
+ "required": [
22
+ "asset_id",
23
+ "asset_version",
24
+ "judgment_version"
25
+ ],
26
+ "additionalProperties": false
27
+ },
28
+ "BrowserProtectedBinding": {
29
+ "type": "object",
30
+ "properties": {
31
+ "operation_id": {
32
+ "$ref": "#/$defs/Identifier"
33
+ },
34
+ "snapshot_id": {
35
+ "$ref": "#/$defs/Identifier"
36
+ },
37
+ "capture_id": {
38
+ "$ref": "#/$defs/Identifier"
39
+ },
40
+ "request_id": {
41
+ "$ref": "#/$defs/Identifier"
42
+ },
43
+ "request_digest": {
44
+ "$ref": "#/$defs/Digest"
45
+ },
46
+ "source_request_digest": {
47
+ "$ref": "#/$defs/Digest"
48
+ },
49
+ "read_intent_digest": {
50
+ "$ref": "#/$defs/Digest"
51
+ },
52
+ "tuple": {
53
+ "$ref": "#/$defs/VersionTuple"
54
+ },
55
+ "asset": {
56
+ "$ref": "#/$defs/AssetIdentity"
57
+ },
58
+ "A": {
59
+ "$ref": "#/$defs/Digest"
60
+ },
61
+ "C": {
62
+ "$ref": "#/$defs/Digest"
63
+ },
64
+ "E": {
65
+ "$ref": "#/$defs/Digest"
66
+ }
67
+ },
68
+ "required": [
69
+ "operation_id",
70
+ "snapshot_id",
71
+ "capture_id",
72
+ "request_id",
73
+ "request_digest",
74
+ "source_request_digest",
75
+ "read_intent_digest",
76
+ "tuple",
77
+ "asset",
78
+ "A",
79
+ "C",
80
+ "E"
81
+ ],
82
+ "additionalProperties": false
83
+ },
84
+ "BrowserProtectedExpansionHandle": {
85
+ "oneOf": [
86
+ {
87
+ "$ref": "#/$defs/BrowserProtectedWholeHandle"
88
+ },
89
+ {
90
+ "$ref": "#/$defs/BrowserProtectedSetHandle"
91
+ }
92
+ ]
93
+ },
94
+ "BrowserProtectedHostContext": {
95
+ "type": "object",
96
+ "properties": {
97
+ "request": {
98
+ "$ref": "#/$defs/BrowserProtectedRequest"
99
+ },
100
+ "binding": {
101
+ "$ref": "#/$defs/BrowserProtectedBinding"
102
+ },
103
+ "projection_scope": {
104
+ "type": "array",
105
+ "items": {
106
+ "$ref": "#/$defs/Identifier"
107
+ },
108
+ "uniqueItems": true
109
+ },
110
+ "issued_handle_scopes": {
111
+ "type": "array",
112
+ "items": {
113
+ "$ref": "#/$defs/BrowserProtectedExpansionHandle"
114
+ }
115
+ },
116
+ "protection_receipt": {
117
+ "$ref": "#/$defs/BrowserProtectedReceipt"
118
+ }
119
+ },
120
+ "required": [
121
+ "request",
122
+ "binding",
123
+ "projection_scope",
124
+ "issued_handle_scopes",
125
+ "protection_receipt"
126
+ ],
127
+ "additionalProperties": false
128
+ },
129
+ "BrowserProtectedReceipt": {
130
+ "type": "object",
131
+ "properties": {
132
+ "contract": {
133
+ "type": "string",
134
+ "const": "kdna.protected-browser-observation/0.1.0-candidate"
135
+ },
136
+ "operation_id": {
137
+ "$ref": "#/$defs/Identifier"
138
+ },
139
+ "snapshot_id": {
140
+ "$ref": "#/$defs/Identifier"
141
+ },
142
+ "A": {
143
+ "$ref": "#/$defs/Digest"
144
+ },
145
+ "C": {
146
+ "$ref": "#/$defs/Digest"
147
+ },
148
+ "E": {
149
+ "$ref": "#/$defs/Digest"
150
+ },
151
+ "checked_at_ms": {
152
+ "$ref": "#/$defs/UInt"
153
+ },
154
+ "proof": {
155
+ "type": "string",
156
+ "const": "observation_not_authority"
157
+ },
158
+ "provenance": {
159
+ "type": "string",
160
+ "const": "host_supplied_triple"
161
+ }
162
+ },
163
+ "required": [
164
+ "contract",
165
+ "operation_id",
166
+ "snapshot_id",
167
+ "A",
168
+ "C",
169
+ "E",
170
+ "checked_at_ms",
171
+ "proof",
172
+ "provenance"
173
+ ],
174
+ "additionalProperties": false
175
+ },
176
+ "BrowserProtectedRequest": {
177
+ "oneOf": [
178
+ {
179
+ "$ref": "#/$defs/BrowserProtectedRequest_whole_asset"
180
+ },
181
+ {
182
+ "$ref": "#/$defs/BrowserProtectedRequest_catalog"
183
+ },
184
+ {
185
+ "$ref": "#/$defs/BrowserProtectedRequest_exact_selection"
186
+ },
187
+ {
188
+ "$ref": "#/$defs/BrowserProtectedRequest_expand"
189
+ }
190
+ ]
191
+ },
192
+ "BrowserProtectedRequest_catalog": {
193
+ "type": "object",
194
+ "properties": {
195
+ "request_id": {
196
+ "$ref": "#/$defs/Identifier"
197
+ },
198
+ "tuple": {
199
+ "$ref": "#/$defs/VersionTuple"
200
+ },
201
+ "budget_bytes": {
202
+ "$ref": "#/$defs/UInt"
203
+ },
204
+ "mode": {
205
+ "const": "catalog",
206
+ "type": "string"
207
+ },
208
+ "selection": {
209
+ "const": null,
210
+ "type": "null"
211
+ },
212
+ "handle": {
213
+ "type": "null",
214
+ "const": null
215
+ }
216
+ },
217
+ "required": [
218
+ "request_id",
219
+ "tuple",
220
+ "budget_bytes",
221
+ "mode",
222
+ "selection",
223
+ "handle"
224
+ ],
225
+ "additionalProperties": false
226
+ },
227
+ "BrowserProtectedRequest_exact_selection": {
228
+ "type": "object",
229
+ "properties": {
230
+ "request_id": {
231
+ "$ref": "#/$defs/Identifier"
232
+ },
233
+ "tuple": {
234
+ "$ref": "#/$defs/VersionTuple"
235
+ },
236
+ "budget_bytes": {
237
+ "$ref": "#/$defs/UInt"
238
+ },
239
+ "mode": {
240
+ "const": "exact_selection",
241
+ "type": "string"
242
+ },
243
+ "selection": {
244
+ "$ref": "#/$defs/BrowserProtectedSelection"
245
+ },
246
+ "handle": {
247
+ "type": "null",
248
+ "const": null
249
+ }
250
+ },
251
+ "required": [
252
+ "request_id",
253
+ "tuple",
254
+ "budget_bytes",
255
+ "mode",
256
+ "selection",
257
+ "handle"
258
+ ],
259
+ "additionalProperties": false
260
+ },
261
+ "BrowserProtectedRequest_expand": {
262
+ "type": "object",
263
+ "properties": {
264
+ "request_id": {
265
+ "$ref": "#/$defs/Identifier"
266
+ },
267
+ "tuple": {
268
+ "$ref": "#/$defs/VersionTuple"
269
+ },
270
+ "budget_bytes": {
271
+ "$ref": "#/$defs/UInt"
272
+ },
273
+ "mode": {
274
+ "type": "string",
275
+ "const": "expand"
276
+ },
277
+ "selection": {
278
+ "anyOf": [
279
+ {
280
+ "$ref": "#/$defs/BrowserProtectedSelection"
281
+ },
282
+ {
283
+ "type": "null",
284
+ "const": null
285
+ }
286
+ ]
287
+ },
288
+ "handle": {
289
+ "$ref": "#/$defs/BrowserProtectedExpansionHandle"
290
+ }
291
+ },
292
+ "required": [
293
+ "request_id",
294
+ "tuple",
295
+ "budget_bytes",
296
+ "mode",
297
+ "selection",
298
+ "handle"
299
+ ],
300
+ "additionalProperties": false
301
+ },
302
+ "BrowserProtectedRequest_whole_asset": {
303
+ "type": "object",
304
+ "properties": {
305
+ "request_id": {
306
+ "$ref": "#/$defs/Identifier"
307
+ },
308
+ "tuple": {
309
+ "$ref": "#/$defs/VersionTuple"
310
+ },
311
+ "budget_bytes": {
312
+ "$ref": "#/$defs/UInt"
313
+ },
314
+ "mode": {
315
+ "const": "whole_asset",
316
+ "type": "string"
317
+ },
318
+ "selection": {
319
+ "const": null,
320
+ "type": "null"
321
+ },
322
+ "handle": {
323
+ "type": "null",
324
+ "const": null
325
+ }
326
+ },
327
+ "required": [
328
+ "request_id",
329
+ "tuple",
330
+ "budget_bytes",
331
+ "mode",
332
+ "selection",
333
+ "handle"
334
+ ],
335
+ "additionalProperties": false
336
+ },
337
+ "BrowserProtectedSelection": {
338
+ "type": "object",
339
+ "properties": {
340
+ "asset_id": {
341
+ "$ref": "#/$defs/Identifier"
342
+ },
343
+ "asset_version": {
344
+ "$ref": "#/$defs/VersionLabel"
345
+ },
346
+ "judgment_ids": {
347
+ "type": "array",
348
+ "items": {
349
+ "$ref": "#/$defs/Identifier"
350
+ },
351
+ "minItems": 1
352
+ }
353
+ },
354
+ "required": [
355
+ "asset_id",
356
+ "asset_version",
357
+ "judgment_ids"
358
+ ],
359
+ "additionalProperties": false
360
+ },
361
+ "BrowserProtectedSetHandle": {
362
+ "type": "object",
363
+ "properties": {
364
+ "handle_id": {
365
+ "$ref": "#/$defs/Identifier"
366
+ },
367
+ "asset_id": {
368
+ "$ref": "#/$defs/Identifier"
369
+ },
370
+ "asset_version": {
371
+ "$ref": "#/$defs/VersionLabel"
372
+ },
373
+ "A": {
374
+ "$ref": "#/$defs/Digest"
375
+ },
376
+ "C": {
377
+ "$ref": "#/$defs/Digest"
378
+ },
379
+ "snapshot_id": {
380
+ "$ref": "#/$defs/Identifier"
381
+ },
382
+ "core_version": {
383
+ "$ref": "#/$defs/Identifier"
384
+ },
385
+ "ir_version": {
386
+ "$ref": "#/$defs/Identifier"
387
+ },
388
+ "read_version": {
389
+ "$ref": "#/$defs/Identifier"
390
+ },
391
+ "target": {
392
+ "$ref": "#/$defs/Ref"
393
+ },
394
+ "scope": {
395
+ "type": "array",
396
+ "items": {
397
+ "$ref": "#/$defs/Identifier"
398
+ },
399
+ "minItems": 1,
400
+ "uniqueItems": true
401
+ },
402
+ "issued_at": {
403
+ "$ref": "#/$defs/UInt"
404
+ },
405
+ "expires_at": {
406
+ "$ref": "#/$defs/UInt"
407
+ },
408
+ "host_id": {
409
+ "$ref": "#/$defs/Identifier"
410
+ },
411
+ "host_epoch": {
412
+ "$ref": "#/$defs/Identifier"
413
+ },
414
+ "anchor": {
415
+ "type": "object",
416
+ "properties": {
417
+ "kind": {
418
+ "type": "string",
419
+ "const": "selection_set"
420
+ },
421
+ "selection": {
422
+ "$ref": "#/$defs/BrowserProtectedSelection"
423
+ }
424
+ },
425
+ "required": [
426
+ "kind",
427
+ "selection"
428
+ ],
429
+ "additionalProperties": false
430
+ },
431
+ "binding_kind": {
432
+ "type": "string",
433
+ "const": "protected_selection_set"
434
+ },
435
+ "operation_id": {
436
+ "$ref": "#/$defs/Identifier"
437
+ },
438
+ "capture_id": {
439
+ "$ref": "#/$defs/Identifier"
440
+ }
441
+ },
442
+ "required": [
443
+ "handle_id",
444
+ "asset_id",
445
+ "asset_version",
446
+ "A",
447
+ "C",
448
+ "snapshot_id",
449
+ "core_version",
450
+ "ir_version",
451
+ "read_version",
452
+ "anchor",
453
+ "target",
454
+ "scope",
455
+ "issued_at",
456
+ "expires_at",
457
+ "host_id",
458
+ "host_epoch",
459
+ "binding_kind",
460
+ "operation_id",
461
+ "capture_id"
462
+ ],
463
+ "additionalProperties": false
464
+ },
465
+ "BrowserProtectedWholeHandle": {
466
+ "type": "object",
467
+ "properties": {
468
+ "handle_id": {
469
+ "$ref": "#/$defs/Identifier"
470
+ },
471
+ "asset_id": {
472
+ "$ref": "#/$defs/Identifier"
473
+ },
474
+ "asset_version": {
475
+ "$ref": "#/$defs/VersionLabel"
476
+ },
477
+ "A": {
478
+ "$ref": "#/$defs/Digest"
479
+ },
480
+ "C": {
481
+ "$ref": "#/$defs/Digest"
482
+ },
483
+ "snapshot_id": {
484
+ "$ref": "#/$defs/Identifier"
485
+ },
486
+ "core_version": {
487
+ "$ref": "#/$defs/Identifier"
488
+ },
489
+ "ir_version": {
490
+ "$ref": "#/$defs/Identifier"
491
+ },
492
+ "read_version": {
493
+ "$ref": "#/$defs/Identifier"
494
+ },
495
+ "target": {
496
+ "$ref": "#/$defs/Ref"
497
+ },
498
+ "scope": {
499
+ "type": "array",
500
+ "items": {
501
+ "$ref": "#/$defs/Identifier"
502
+ },
503
+ "minItems": 1,
504
+ "uniqueItems": true
505
+ },
506
+ "issued_at": {
507
+ "$ref": "#/$defs/UInt"
508
+ },
509
+ "expires_at": {
510
+ "$ref": "#/$defs/UInt"
511
+ },
512
+ "host_id": {
513
+ "$ref": "#/$defs/Identifier"
514
+ },
515
+ "host_epoch": {
516
+ "$ref": "#/$defs/Identifier"
517
+ },
518
+ "anchor": {
519
+ "type": "object",
520
+ "properties": {
521
+ "kind": {
522
+ "type": "string",
523
+ "const": "asset"
524
+ }
525
+ },
526
+ "required": [
527
+ "kind"
528
+ ],
529
+ "additionalProperties": false
530
+ }
531
+ },
532
+ "required": [
533
+ "handle_id",
534
+ "asset_id",
535
+ "asset_version",
536
+ "A",
537
+ "C",
538
+ "snapshot_id",
539
+ "core_version",
540
+ "ir_version",
541
+ "read_version",
542
+ "anchor",
543
+ "target",
544
+ "scope",
545
+ "issued_at",
546
+ "expires_at",
547
+ "host_id",
548
+ "host_epoch"
549
+ ],
550
+ "additionalProperties": false
551
+ },
552
+ "Digest": {
553
+ "type": "string",
554
+ "pattern": "^sha256:[0-9a-f]{64}$"
555
+ },
556
+ "Identifier": {
557
+ "type": "string",
558
+ "minLength": 1,
559
+ "maxLength": 256,
560
+ "pattern": "^[^\\u0000-\\u001f\\u007f-\\u009f\\ud800-\\udfff]+$"
561
+ },
562
+ "Ref": {
563
+ "type": "object",
564
+ "properties": {
565
+ "kind": {
566
+ "type": "string",
567
+ "enum": [
568
+ "asset",
569
+ "judgment",
570
+ "result",
571
+ "contract",
572
+ "condition",
573
+ "component",
574
+ "unit",
575
+ "plan",
576
+ "plan_node",
577
+ "policy",
578
+ "branch_entry",
579
+ "candidate",
580
+ "material",
581
+ "shared_declaration",
582
+ "boundary",
583
+ "exception",
584
+ "misuse",
585
+ "reason",
586
+ "source",
587
+ "source_use",
588
+ "resource",
589
+ "relationship",
590
+ "dependency",
591
+ "example",
592
+ "example_result",
593
+ "revision",
594
+ "actor"
595
+ ]
596
+ },
597
+ "id": {
598
+ "$ref": "#/$defs/Identifier"
599
+ },
600
+ "asset": {
601
+ "$ref": "#/$defs/AssetIdentity"
602
+ }
603
+ },
604
+ "required": [
605
+ "kind",
606
+ "id"
607
+ ],
608
+ "additionalProperties": false
609
+ },
610
+ "UInt": {
611
+ "type": "integer",
612
+ "minimum": 0,
613
+ "maximum": 9007199254740991
614
+ },
615
+ "VersionLabel": {
616
+ "$ref": "#/$defs/Identifier"
617
+ },
618
+ "VersionTuple": {
619
+ "type": "object",
620
+ "properties": {
621
+ "container": {
622
+ "const": "0.5.0",
623
+ "type": "string"
624
+ },
625
+ "payload_profile": {
626
+ "const": "kdna.payload.judgment",
627
+ "type": "string"
628
+ },
629
+ "payload_version": {
630
+ "const": "0.5.1",
631
+ "type": "string"
632
+ },
633
+ "core": {
634
+ "const": "kdna.core/0.8.2",
635
+ "type": "string"
636
+ },
637
+ "ir": {
638
+ "const": "kdna.canonical-ir/0.6.1",
639
+ "type": "string"
640
+ },
641
+ "runtime": {
642
+ "const": "kdna.runtime-capsule/0.3.1",
643
+ "type": "string"
644
+ },
645
+ "plan": {
646
+ "const": "kdna.consumption-plan/0.3.1",
647
+ "type": "string"
648
+ },
649
+ "host": {
650
+ "const": "kdna.agent-host/0.3.1",
651
+ "type": "string"
652
+ },
653
+ "trace": {
654
+ "const": "kdna.judgment-trace/0.3.1",
655
+ "type": "string"
656
+ },
657
+ "read": {
658
+ "const": "kdna.read/0.6.4",
659
+ "type": "string"
660
+ }
661
+ },
662
+ "required": [
663
+ "container",
664
+ "payload_profile",
665
+ "payload_version",
666
+ "core",
667
+ "ir",
668
+ "runtime",
669
+ "plan",
670
+ "host",
671
+ "trace",
672
+ "read"
673
+ ],
674
+ "additionalProperties": false
675
+ }
676
+ }
677
+ }