@angular/aria 21.0.3 → 21.1.0-next.1

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 (56) hide show
  1. package/_adev_assets/aria-accordion.json +743 -0
  2. package/_adev_assets/aria-combobox.json +603 -0
  3. package/_adev_assets/aria-grid.json +893 -0
  4. package/_adev_assets/aria-listbox.json +540 -0
  5. package/_adev_assets/aria-menu.json +1049 -0
  6. package/_adev_assets/aria-tabs.json +880 -0
  7. package/_adev_assets/aria-toolbar.json +545 -0
  8. package/_adev_assets/aria-tree.json +853 -0
  9. package/fesm2022/_widget-chunk.mjs +246 -4
  10. package/fesm2022/_widget-chunk.mjs.map +1 -1
  11. package/fesm2022/accordion.mjs +4 -17
  12. package/fesm2022/accordion.mjs.map +1 -1
  13. package/fesm2022/aria.mjs +1 -1
  14. package/fesm2022/aria.mjs.map +1 -1
  15. package/fesm2022/combobox.mjs +120 -96
  16. package/fesm2022/combobox.mjs.map +1 -1
  17. package/fesm2022/grid.mjs +201 -225
  18. package/fesm2022/grid.mjs.map +1 -1
  19. package/fesm2022/listbox.mjs +161 -173
  20. package/fesm2022/listbox.mjs.map +1 -1
  21. package/fesm2022/menu.mjs +238 -256
  22. package/fesm2022/menu.mjs.map +1 -1
  23. package/fesm2022/private.mjs +932 -7
  24. package/fesm2022/private.mjs.map +1 -1
  25. package/fesm2022/tabs.mjs +168 -182
  26. package/fesm2022/tabs.mjs.map +1 -1
  27. package/fesm2022/toolbar.mjs +3 -15
  28. package/fesm2022/toolbar.mjs.map +1 -1
  29. package/fesm2022/tree.mjs +2 -4
  30. package/fesm2022/tree.mjs.map +1 -1
  31. package/package.json +3 -3
  32. package/types/_grid-chunk.d.ts +210 -3
  33. package/types/accordion.d.ts +49 -52
  34. package/types/combobox.d.ts +111 -25
  35. package/types/grid.d.ts +32 -37
  36. package/types/listbox.d.ts +5 -8
  37. package/types/menu.d.ts +113 -113
  38. package/types/private.d.ts +498 -10
  39. package/types/tabs.d.ts +84 -89
  40. package/types/toolbar.d.ts +66 -69
  41. package/types/tree.d.ts +103 -106
  42. package/fesm2022/_combobox-chunk.mjs +0 -425
  43. package/fesm2022/_combobox-chunk.mjs.map +0 -1
  44. package/fesm2022/_combobox-listbox-chunk.mjs +0 -522
  45. package/fesm2022/_combobox-listbox-chunk.mjs.map +0 -1
  46. package/fesm2022/_combobox-popup-chunk.mjs +0 -46
  47. package/fesm2022/_combobox-popup-chunk.mjs.map +0 -1
  48. package/fesm2022/_list-navigation-chunk.mjs +0 -116
  49. package/fesm2022/_list-navigation-chunk.mjs.map +0 -1
  50. package/fesm2022/_pointer-event-manager-chunk.mjs +0 -134
  51. package/fesm2022/_pointer-event-manager-chunk.mjs.map +0 -1
  52. package/types/_combobox-chunk.d.ts +0 -98
  53. package/types/_combobox-chunk.d2.ts +0 -193
  54. package/types/_list-chunk.d.ts +0 -212
  55. package/types/_list-navigation-chunk.d.ts +0 -212
  56. package/types/_listbox-chunk.d.ts +0 -106
package/fesm2022/grid.mjs CHANGED
@@ -1,18 +1,13 @@
1
+ import { _IdGenerator } from '@angular/cdk/a11y';
1
2
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, ElementRef, contentChildren, computed, input, booleanAttribute, afterRenderEffect, Directive, output, model } from '@angular/core';
3
+ import { inject, ElementRef, contentChildren, computed, input, booleanAttribute, afterRenderEffect, Directive, model, output } from '@angular/core';
3
4
  import { Directionality } from '@angular/cdk/bidi';
4
- import { GridPattern, GridCellWidgetPattern, GridCellPattern, GridRowPattern } from './_widget-chunk.mjs';
5
- import { _IdGenerator } from '@angular/cdk/a11y';
6
- import './_pointer-event-manager-chunk.mjs';
7
- import './_list-navigation-chunk.mjs';
8
-
9
- const GRID_CELL = new InjectionToken('GRID_CELL');
10
- const GRID_ROW = new InjectionToken('GRID_ROW');
5
+ import { GridPattern, GridRowPattern, GridCellPattern, GridCellWidgetPattern } from './_widget-chunk.mjs';
11
6
 
12
7
  class Grid {
13
8
  _elementRef = inject(ElementRef);
14
9
  element = this._elementRef.nativeElement;
15
- _rows = contentChildren(GRID_ROW, ...(ngDevMode ? [{
10
+ _rows = contentChildren(GridRow, ...(ngDevMode ? [{
16
11
  debugName: "_rows",
17
12
  descendants: true
18
13
  }] : [{
@@ -190,7 +185,7 @@ class Grid {
190
185
  },
191
186
  queries: [{
192
187
  propertyName: "_rows",
193
- predicate: GRID_ROW,
188
+ predicate: GridRow,
194
189
  descendants: true,
195
190
  isSignal: true
196
191
  }],
@@ -226,7 +221,7 @@ i0.ɵɵngDeclareClassMetadata({
226
221
  propDecorators: {
227
222
  _rows: [{
228
223
  type: i0.ContentChildren,
229
- args: [i0.forwardRef(() => GRID_ROW), {
224
+ args: [i0.forwardRef(() => GridRow), {
230
225
  ...{
231
226
  descendants: true
232
227
  },
@@ -307,134 +302,68 @@ i0.ɵɵngDeclareClassMetadata({
307
302
  }]
308
303
  }
309
304
  });
310
-
311
- class GridCellWidget {
305
+ class GridRow {
312
306
  _elementRef = inject(ElementRef);
313
307
  element = this._elementRef.nativeElement;
314
- active = computed(() => this._pattern.active(), ...(ngDevMode ? [{
315
- debugName: "active"
316
- }] : []));
317
- _cell = inject(GRID_CELL);
318
- id = input(inject(_IdGenerator).getId('ng-grid-cell-widget-', true), ...(ngDevMode ? [{
319
- debugName: "id"
320
- }] : []));
321
- widgetType = input('simple', ...(ngDevMode ? [{
322
- debugName: "widgetType"
323
- }] : []));
324
- disabled = input(false, ...(ngDevMode ? [{
325
- debugName: "disabled",
326
- transform: booleanAttribute
308
+ _cells = contentChildren(GridCell, ...(ngDevMode ? [{
309
+ debugName: "_cells",
310
+ descendants: true
327
311
  }] : [{
328
- transform: booleanAttribute
312
+ descendants: true
329
313
  }]));
330
- focusTarget = input(...(ngDevMode ? [undefined, {
331
- debugName: "focusTarget"
314
+ _cellPatterns = computed(() => this._cells().map(c => c._pattern), ...(ngDevMode ? [{
315
+ debugName: "_cellPatterns"
332
316
  }] : []));
333
- onActivate = output();
334
- onDeactivate = output();
335
- tabindex = input(...(ngDevMode ? [undefined, {
336
- debugName: "tabindex"
317
+ _grid = inject(Grid);
318
+ _gridPattern = computed(() => this._grid._pattern, ...(ngDevMode ? [{
319
+ debugName: "_gridPattern"
337
320
  }] : []));
338
- _tabIndex = computed(() => this.tabindex() ?? (this.focusTarget() ? -1 : this._pattern.tabIndex()), ...(ngDevMode ? [{
339
- debugName: "_tabIndex"
321
+ rowIndex = input(...(ngDevMode ? [undefined, {
322
+ debugName: "rowIndex"
340
323
  }] : []));
341
- _pattern = new GridCellWidgetPattern({
324
+ _pattern = new GridRowPattern({
342
325
  ...this,
343
- element: () => this.element,
344
- cell: () => this._cell._pattern,
345
- focusTarget: computed(() => {
346
- if (this.focusTarget() instanceof ElementRef) {
347
- return this.focusTarget().nativeElement;
348
- }
349
- return this.focusTarget();
350
- })
326
+ cells: this._cellPatterns,
327
+ grid: this._gridPattern
351
328
  });
352
- get isActivated() {
353
- return this._pattern.isActivated.asReadonly();
354
- }
355
- constructor() {
356
- afterRenderEffect(() => {
357
- const activateEvent = this._pattern.lastActivateEvent();
358
- if (activateEvent) {
359
- this.onActivate.emit(activateEvent);
360
- }
361
- });
362
- afterRenderEffect(() => {
363
- const deactivateEvent = this._pattern.lastDeactivateEvent();
364
- if (deactivateEvent) {
365
- this.onDeactivate.emit(deactivateEvent);
366
- }
367
- });
368
- }
369
- activate() {
370
- this._pattern.activate();
371
- }
372
- deactivate() {
373
- this._pattern.deactivate();
374
- }
375
329
  static ɵfac = i0.ɵɵngDeclareFactory({
376
330
  minVersion: "12.0.0",
377
331
  version: "21.0.0",
378
332
  ngImport: i0,
379
- type: GridCellWidget,
333
+ type: GridRow,
380
334
  deps: [],
381
335
  target: i0.ɵɵFactoryTarget.Directive
382
336
  });
383
337
  static ɵdir = i0.ɵɵngDeclareDirective({
384
- minVersion: "17.1.0",
338
+ minVersion: "17.2.0",
385
339
  version: "21.0.0",
386
- type: GridCellWidget,
340
+ type: GridRow,
387
341
  isStandalone: true,
388
- selector: "[ngGridCellWidget]",
342
+ selector: "[ngGridRow]",
389
343
  inputs: {
390
- id: {
391
- classPropertyName: "id",
392
- publicName: "id",
393
- isSignal: true,
394
- isRequired: false,
395
- transformFunction: null
396
- },
397
- widgetType: {
398
- classPropertyName: "widgetType",
399
- publicName: "widgetType",
400
- isSignal: true,
401
- isRequired: false,
402
- transformFunction: null
403
- },
404
- disabled: {
405
- classPropertyName: "disabled",
406
- publicName: "disabled",
407
- isSignal: true,
408
- isRequired: false,
409
- transformFunction: null
410
- },
411
- focusTarget: {
412
- classPropertyName: "focusTarget",
413
- publicName: "focusTarget",
414
- isSignal: true,
415
- isRequired: false,
416
- transformFunction: null
417
- },
418
- tabindex: {
419
- classPropertyName: "tabindex",
420
- publicName: "tabindex",
344
+ rowIndex: {
345
+ classPropertyName: "rowIndex",
346
+ publicName: "rowIndex",
421
347
  isSignal: true,
422
348
  isRequired: false,
423
349
  transformFunction: null
424
350
  }
425
351
  },
426
- outputs: {
427
- onActivate: "onActivate",
428
- onDeactivate: "onDeactivate"
429
- },
430
352
  host: {
353
+ attributes: {
354
+ "role": "row"
355
+ },
431
356
  properties: {
432
- "attr.data-active": "active()",
433
- "attr.data-active-control": "isActivated() ? \"widget\" : \"cell\"",
434
- "tabindex": "_tabIndex()"
357
+ "attr.aria-rowindex": "_pattern.rowIndex()"
435
358
  }
436
359
  },
437
- exportAs: ["ngGridCellWidget"],
360
+ queries: [{
361
+ propertyName: "_cells",
362
+ predicate: GridCell,
363
+ descendants: true,
364
+ isSignal: true
365
+ }],
366
+ exportAs: ["ngGridRow"],
438
367
  ngImport: i0
439
368
  });
440
369
  }
@@ -442,72 +371,38 @@ i0.ɵɵngDeclareClassMetadata({
442
371
  minVersion: "12.0.0",
443
372
  version: "21.0.0",
444
373
  ngImport: i0,
445
- type: GridCellWidget,
374
+ type: GridRow,
446
375
  decorators: [{
447
376
  type: Directive,
448
377
  args: [{
449
- selector: '[ngGridCellWidget]',
450
- exportAs: 'ngGridCellWidget',
378
+ selector: '[ngGridRow]',
379
+ exportAs: 'ngGridRow',
451
380
  host: {
452
- '[attr.data-active]': 'active()',
453
- '[attr.data-active-control]': 'isActivated() ? "widget" : "cell"',
454
- '[tabindex]': '_tabIndex()'
381
+ 'role': 'row',
382
+ '[attr.aria-rowindex]': '_pattern.rowIndex()'
455
383
  }
456
384
  }]
457
385
  }],
458
- ctorParameters: () => [],
459
386
  propDecorators: {
460
- id: [{
461
- type: i0.Input,
462
- args: [{
463
- isSignal: true,
464
- alias: "id",
465
- required: false
466
- }]
467
- }],
468
- widgetType: [{
469
- type: i0.Input,
470
- args: [{
471
- isSignal: true,
472
- alias: "widgetType",
473
- required: false
474
- }]
475
- }],
476
- disabled: [{
477
- type: i0.Input,
478
- args: [{
479
- isSignal: true,
480
- alias: "disabled",
481
- required: false
482
- }]
483
- }],
484
- focusTarget: [{
485
- type: i0.Input,
486
- args: [{
487
- isSignal: true,
488
- alias: "focusTarget",
489
- required: false
387
+ _cells: [{
388
+ type: i0.ContentChildren,
389
+ args: [i0.forwardRef(() => GridCell), {
390
+ ...{
391
+ descendants: true
392
+ },
393
+ isSignal: true
490
394
  }]
491
395
  }],
492
- onActivate: [{
493
- type: i0.Output,
494
- args: ["onActivate"]
495
- }],
496
- onDeactivate: [{
497
- type: i0.Output,
498
- args: ["onDeactivate"]
499
- }],
500
- tabindex: [{
396
+ rowIndex: [{
501
397
  type: i0.Input,
502
398
  args: [{
503
399
  isSignal: true,
504
- alias: "tabindex",
400
+ alias: "rowIndex",
505
401
  required: false
506
402
  }]
507
403
  }]
508
404
  }
509
405
  });
510
-
511
406
  class GridCell {
512
407
  _elementRef = inject(ElementRef);
513
408
  element = this._elementRef.nativeElement;
@@ -523,7 +418,7 @@ class GridCell {
523
418
  _widgetPatterns = computed(() => this._widgets().map(w => w._pattern), ...(ngDevMode ? [{
524
419
  debugName: "_widgetPatterns"
525
420
  }] : []));
526
- _row = inject(GRID_ROW);
421
+ _row = inject(GridRow);
527
422
  textDirection = inject(Directionality).valueSignal;
528
423
  id = input(inject(_IdGenerator).getId('ng-grid-cell-', true), ...(ngDevMode ? [{
529
424
  debugName: "id"
@@ -710,10 +605,6 @@ class GridCell {
710
605
  "tabindex": "_tabIndex()"
711
606
  }
712
607
  },
713
- providers: [{
714
- provide: GRID_CELL,
715
- useExisting: GridCell
716
- }],
717
608
  queries: [{
718
609
  propertyName: "_widgets",
719
610
  predicate: GridCellWidget,
@@ -748,11 +639,7 @@ i0.ɵɵngDeclareClassMetadata({
748
639
  '[attr.aria-colindex]': '_pattern.ariaColIndex()',
749
640
  '[attr.aria-selected]': '_pattern.ariaSelected()',
750
641
  '[tabindex]': '_tabIndex()'
751
- },
752
- providers: [{
753
- provide: GRID_CELL,
754
- useExisting: GridCell
755
- }]
642
+ }
756
643
  }]
757
644
  }],
758
645
  ctorParameters: () => [],
@@ -867,73 +754,133 @@ i0.ɵɵngDeclareClassMetadata({
867
754
  }]
868
755
  }
869
756
  });
870
-
871
- class GridRow {
757
+ class GridCellWidget {
872
758
  _elementRef = inject(ElementRef);
873
759
  element = this._elementRef.nativeElement;
874
- _cells = contentChildren(GRID_CELL, ...(ngDevMode ? [{
875
- debugName: "_cells",
876
- descendants: true
760
+ active = computed(() => this._pattern.active(), ...(ngDevMode ? [{
761
+ debugName: "active"
762
+ }] : []));
763
+ _cell = inject(GridCell);
764
+ id = input(inject(_IdGenerator).getId('ng-grid-cell-widget-', true), ...(ngDevMode ? [{
765
+ debugName: "id"
766
+ }] : []));
767
+ widgetType = input('simple', ...(ngDevMode ? [{
768
+ debugName: "widgetType"
769
+ }] : []));
770
+ disabled = input(false, ...(ngDevMode ? [{
771
+ debugName: "disabled",
772
+ transform: booleanAttribute
877
773
  }] : [{
878
- descendants: true
774
+ transform: booleanAttribute
879
775
  }]));
880
- _cellPatterns = computed(() => this._cells().map(c => c._pattern), ...(ngDevMode ? [{
881
- debugName: "_cellPatterns"
776
+ focusTarget = input(...(ngDevMode ? [undefined, {
777
+ debugName: "focusTarget"
882
778
  }] : []));
883
- _grid = inject(Grid);
884
- _gridPattern = computed(() => this._grid._pattern, ...(ngDevMode ? [{
885
- debugName: "_gridPattern"
779
+ onActivate = output();
780
+ onDeactivate = output();
781
+ tabindex = input(...(ngDevMode ? [undefined, {
782
+ debugName: "tabindex"
886
783
  }] : []));
887
- rowIndex = input(...(ngDevMode ? [undefined, {
888
- debugName: "rowIndex"
784
+ _tabIndex = computed(() => this.tabindex() ?? (this.focusTarget() ? -1 : this._pattern.tabIndex()), ...(ngDevMode ? [{
785
+ debugName: "_tabIndex"
889
786
  }] : []));
890
- _pattern = new GridRowPattern({
787
+ _pattern = new GridCellWidgetPattern({
891
788
  ...this,
892
- cells: this._cellPatterns,
893
- grid: this._gridPattern
789
+ element: () => this.element,
790
+ cell: () => this._cell._pattern,
791
+ focusTarget: computed(() => {
792
+ if (this.focusTarget() instanceof ElementRef) {
793
+ return this.focusTarget().nativeElement;
794
+ }
795
+ return this.focusTarget();
796
+ })
894
797
  });
798
+ get isActivated() {
799
+ return this._pattern.isActivated.asReadonly();
800
+ }
801
+ constructor() {
802
+ afterRenderEffect(() => {
803
+ const activateEvent = this._pattern.lastActivateEvent();
804
+ if (activateEvent) {
805
+ this.onActivate.emit(activateEvent);
806
+ }
807
+ });
808
+ afterRenderEffect(() => {
809
+ const deactivateEvent = this._pattern.lastDeactivateEvent();
810
+ if (deactivateEvent) {
811
+ this.onDeactivate.emit(deactivateEvent);
812
+ }
813
+ });
814
+ }
815
+ activate() {
816
+ this._pattern.activate();
817
+ }
818
+ deactivate() {
819
+ this._pattern.deactivate();
820
+ }
895
821
  static ɵfac = i0.ɵɵngDeclareFactory({
896
822
  minVersion: "12.0.0",
897
823
  version: "21.0.0",
898
824
  ngImport: i0,
899
- type: GridRow,
825
+ type: GridCellWidget,
900
826
  deps: [],
901
827
  target: i0.ɵɵFactoryTarget.Directive
902
828
  });
903
829
  static ɵdir = i0.ɵɵngDeclareDirective({
904
- minVersion: "17.2.0",
830
+ minVersion: "17.1.0",
905
831
  version: "21.0.0",
906
- type: GridRow,
832
+ type: GridCellWidget,
907
833
  isStandalone: true,
908
- selector: "[ngGridRow]",
834
+ selector: "[ngGridCellWidget]",
909
835
  inputs: {
910
- rowIndex: {
911
- classPropertyName: "rowIndex",
912
- publicName: "rowIndex",
836
+ id: {
837
+ classPropertyName: "id",
838
+ publicName: "id",
839
+ isSignal: true,
840
+ isRequired: false,
841
+ transformFunction: null
842
+ },
843
+ widgetType: {
844
+ classPropertyName: "widgetType",
845
+ publicName: "widgetType",
846
+ isSignal: true,
847
+ isRequired: false,
848
+ transformFunction: null
849
+ },
850
+ disabled: {
851
+ classPropertyName: "disabled",
852
+ publicName: "disabled",
853
+ isSignal: true,
854
+ isRequired: false,
855
+ transformFunction: null
856
+ },
857
+ focusTarget: {
858
+ classPropertyName: "focusTarget",
859
+ publicName: "focusTarget",
860
+ isSignal: true,
861
+ isRequired: false,
862
+ transformFunction: null
863
+ },
864
+ tabindex: {
865
+ classPropertyName: "tabindex",
866
+ publicName: "tabindex",
913
867
  isSignal: true,
914
868
  isRequired: false,
915
869
  transformFunction: null
916
870
  }
917
871
  },
872
+ outputs: {
873
+ onActivate: "onActivate",
874
+ onDeactivate: "onDeactivate"
875
+ },
918
876
  host: {
919
- attributes: {
920
- "role": "row"
921
- },
922
877
  properties: {
923
- "attr.aria-rowindex": "_pattern.rowIndex()"
878
+ "attr.data-active": "active()",
879
+ "attr.data-active-control": "isActivated() ? \"widget\" : \"cell\"",
880
+ "tabindex": "_tabIndex()"
924
881
  }
925
882
  },
926
- providers: [{
927
- provide: GRID_ROW,
928
- useExisting: GridRow
929
- }],
930
- queries: [{
931
- propertyName: "_cells",
932
- predicate: GRID_CELL,
933
- descendants: true,
934
- isSignal: true
935
- }],
936
- exportAs: ["ngGridRow"],
883
+ exportAs: ["ngGridCellWidget"],
937
884
  ngImport: i0
938
885
  });
939
886
  }
@@ -941,37 +888,66 @@ i0.ɵɵngDeclareClassMetadata({
941
888
  minVersion: "12.0.0",
942
889
  version: "21.0.0",
943
890
  ngImport: i0,
944
- type: GridRow,
891
+ type: GridCellWidget,
945
892
  decorators: [{
946
893
  type: Directive,
947
894
  args: [{
948
- selector: '[ngGridRow]',
949
- exportAs: 'ngGridRow',
895
+ selector: '[ngGridCellWidget]',
896
+ exportAs: 'ngGridCellWidget',
950
897
  host: {
951
- 'role': 'row',
952
- '[attr.aria-rowindex]': '_pattern.rowIndex()'
953
- },
954
- providers: [{
955
- provide: GRID_ROW,
956
- useExisting: GridRow
957
- }]
898
+ '[attr.data-active]': 'active()',
899
+ '[attr.data-active-control]': 'isActivated() ? "widget" : "cell"',
900
+ '[tabindex]': '_tabIndex()'
901
+ }
958
902
  }]
959
903
  }],
904
+ ctorParameters: () => [],
960
905
  propDecorators: {
961
- _cells: [{
962
- type: i0.ContentChildren,
963
- args: [i0.forwardRef(() => GRID_CELL), {
964
- ...{
965
- descendants: true
966
- },
967
- isSignal: true
906
+ id: [{
907
+ type: i0.Input,
908
+ args: [{
909
+ isSignal: true,
910
+ alias: "id",
911
+ required: false
968
912
  }]
969
913
  }],
970
- rowIndex: [{
914
+ widgetType: [{
971
915
  type: i0.Input,
972
916
  args: [{
973
917
  isSignal: true,
974
- alias: "rowIndex",
918
+ alias: "widgetType",
919
+ required: false
920
+ }]
921
+ }],
922
+ disabled: [{
923
+ type: i0.Input,
924
+ args: [{
925
+ isSignal: true,
926
+ alias: "disabled",
927
+ required: false
928
+ }]
929
+ }],
930
+ focusTarget: [{
931
+ type: i0.Input,
932
+ args: [{
933
+ isSignal: true,
934
+ alias: "focusTarget",
935
+ required: false
936
+ }]
937
+ }],
938
+ onActivate: [{
939
+ type: i0.Output,
940
+ args: ["onActivate"]
941
+ }],
942
+ onDeactivate: [{
943
+ type: i0.Output,
944
+ args: ["onDeactivate"]
945
+ }],
946
+ tabindex: [{
947
+ type: i0.Input,
948
+ args: [{
949
+ isSignal: true,
950
+ alias: "tabindex",
975
951
  required: false
976
952
  }]
977
953
  }]