@deck.gl-community/graph-layers 9.2.0-beta.2 → 9.2.0-beta.3

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 (232) hide show
  1. package/dist/core/graph-engine.d.ts +63 -21
  2. package/dist/core/graph-engine.d.ts.map +1 -1
  3. package/dist/core/graph-engine.js +155 -75
  4. package/dist/core/graph-engine.js.map +1 -1
  5. package/dist/core/graph-layout.d.ts +22 -18
  6. package/dist/core/graph-layout.d.ts.map +1 -1
  7. package/dist/core/graph-layout.js +33 -18
  8. package/dist/core/graph-layout.js.map +1 -1
  9. package/dist/core/interaction-manager.d.ts +2 -2
  10. package/dist/core/interaction-manager.d.ts.map +1 -1
  11. package/dist/core/interaction-manager.js +7 -5
  12. package/dist/core/interaction-manager.js.map +1 -1
  13. package/dist/graph/arrow-graph.d.ts +69 -0
  14. package/dist/graph/arrow-graph.d.ts.map +1 -0
  15. package/dist/graph/arrow-graph.js +513 -0
  16. package/dist/graph/arrow-graph.js.map +1 -0
  17. package/dist/graph/classic-graph.d.ts +169 -0
  18. package/dist/graph/classic-graph.d.ts.map +1 -0
  19. package/dist/graph/classic-graph.js +390 -0
  20. package/dist/graph/classic-graph.js.map +1 -0
  21. package/dist/graph/edge.d.ts +6 -6
  22. package/dist/graph/edge.d.ts.map +1 -1
  23. package/dist/graph/edge.js.map +1 -1
  24. package/dist/graph/functions/arrow-utils.d.ts +6 -0
  25. package/dist/graph/functions/arrow-utils.d.ts.map +1 -0
  26. package/dist/graph/functions/arrow-utils.js +67 -0
  27. package/dist/graph/functions/arrow-utils.js.map +1 -0
  28. package/dist/graph/functions/create-graph-from-data.d.ts +3 -0
  29. package/dist/graph/functions/create-graph-from-data.d.ts.map +1 -0
  30. package/dist/graph/functions/create-graph-from-data.js +12 -0
  31. package/dist/graph/functions/create-graph-from-data.js.map +1 -0
  32. package/dist/graph/graph-normalization.d.ts +10 -0
  33. package/dist/graph/graph-normalization.d.ts.map +1 -0
  34. package/dist/graph/graph-normalization.js +65 -0
  35. package/dist/graph/graph-normalization.js.map +1 -0
  36. package/dist/graph/graph.d.ts +62 -155
  37. package/dist/graph/graph.d.ts.map +1 -1
  38. package/dist/graph/graph.js +11 -300
  39. package/dist/graph/graph.js.map +1 -1
  40. package/dist/graph/node.d.ts +6 -6
  41. package/dist/graph/node.d.ts.map +1 -1
  42. package/dist/graph/node.js +2 -2
  43. package/dist/graph/node.js.map +1 -1
  44. package/dist/graph-data/arrow-graph-data-builder.d.ts +21 -0
  45. package/dist/graph-data/arrow-graph-data-builder.d.ts.map +1 -0
  46. package/dist/graph-data/arrow-graph-data-builder.js +105 -0
  47. package/dist/graph-data/arrow-graph-data-builder.js.map +1 -0
  48. package/dist/graph-data/graph-data-builder.d.ts +6 -0
  49. package/dist/graph-data/graph-data-builder.d.ts.map +1 -0
  50. package/dist/graph-data/graph-data-builder.js +1 -0
  51. package/dist/graph-data/graph-data-builder.js.map +1 -0
  52. package/dist/graph-data/graph-data.d.ts +40 -0
  53. package/dist/graph-data/graph-data.d.ts.map +1 -0
  54. package/dist/graph-data/graph-data.js +11 -0
  55. package/dist/graph-data/graph-data.js.map +1 -0
  56. package/dist/graph-data/plain-graph-data-builder.d.ts +20 -0
  57. package/dist/graph-data/plain-graph-data-builder.d.ts.map +1 -0
  58. package/dist/graph-data/plain-graph-data-builder.js +105 -0
  59. package/dist/graph-data/plain-graph-data-builder.js.map +1 -0
  60. package/dist/graph-style-schema.cdn.js +1 -1
  61. package/dist/graph-style-schema.json +1 -1
  62. package/dist/index.cjs +6905 -4576
  63. package/dist/index.cjs.map +4 -4
  64. package/dist/index.d.ts +14 -7
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +24 -11
  67. package/dist/index.js.map +1 -1
  68. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -1
  69. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +1 -2
  70. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js.map +1 -1
  71. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts +83 -0
  72. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts.map +1 -0
  73. package/dist/layers/common-layers/grid-layer/grid-layer.js +133 -0
  74. package/dist/layers/common-layers/grid-layer/grid-layer.js.map +1 -0
  75. package/dist/layers/edge-attachment-helper.d.ts.map +1 -1
  76. package/dist/layers/edge-attachment-helper.js +1 -2
  77. package/dist/layers/edge-attachment-helper.js.map +1 -1
  78. package/dist/layers/graph-layer.d.ts +68 -11
  79. package/dist/layers/graph-layer.d.ts.map +1 -1
  80. package/dist/layers/graph-layer.js +435 -50
  81. package/dist/layers/graph-layer.js.map +1 -1
  82. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts +24 -0
  83. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts.map +1 -0
  84. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js +251 -0
  85. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js.map +1 -0
  86. package/dist/layouts/d3-dag/d3-dag-layout.d.ts +46 -61
  87. package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -1
  88. package/dist/layouts/d3-dag/d3-dag-layout.js +85 -270
  89. package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -1
  90. package/dist/layouts/d3-force/d3-force-layout.d.ts +20 -8
  91. package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
  92. package/dist/layouts/d3-force/d3-force-layout.js +39 -20
  93. package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
  94. package/dist/layouts/experimental/force-multi-graph-layout.d.ts +19 -15
  95. package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
  96. package/dist/layouts/experimental/force-multi-graph-layout.js +47 -38
  97. package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
  98. package/dist/layouts/experimental/hive-plot-layout.d.ts +18 -15
  99. package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
  100. package/dist/layouts/experimental/hive-plot-layout.js +33 -34
  101. package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
  102. package/dist/layouts/experimental/radial-layout.d.ts +12 -7
  103. package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
  104. package/dist/layouts/experimental/radial-layout.js +31 -14
  105. package/dist/layouts/experimental/radial-layout.js.map +1 -1
  106. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +11 -8
  107. package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
  108. package/dist/layouts/gpu-force/gpu-force-layout.js +59 -56
  109. package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
  110. package/dist/layouts/simple-layout.d.ts +8 -25
  111. package/dist/layouts/simple-layout.d.ts.map +1 -1
  112. package/dist/layouts/simple-layout.js +13 -17
  113. package/dist/layouts/simple-layout.js.map +1 -1
  114. package/dist/loaders/dot-graph-loader.d.ts +25 -0
  115. package/dist/loaders/dot-graph-loader.d.ts.map +1 -0
  116. package/dist/loaders/dot-graph-loader.js +668 -0
  117. package/dist/loaders/dot-graph-loader.js.map +1 -0
  118. package/dist/loaders/json-graph-loader.d.ts +6 -0
  119. package/dist/loaders/json-graph-loader.d.ts.map +1 -0
  120. package/dist/loaders/json-graph-loader.js +31 -0
  121. package/dist/loaders/json-graph-loader.js.map +1 -0
  122. package/dist/loaders/{edge-parsers.d.ts → parsers/edge-parsers.d.ts} +1 -1
  123. package/dist/loaders/parsers/edge-parsers.d.ts.map +1 -0
  124. package/dist/loaders/{edge-parsers.js → parsers/edge-parsers.js} +1 -1
  125. package/dist/loaders/parsers/edge-parsers.js.map +1 -0
  126. package/dist/loaders/{node-parsers.d.ts → parsers/node-parsers.d.ts} +1 -1
  127. package/dist/loaders/parsers/node-parsers.d.ts.map +1 -0
  128. package/dist/loaders/{node-parsers.js → parsers/node-parsers.js} +1 -1
  129. package/dist/loaders/parsers/node-parsers.js.map +1 -0
  130. package/dist/loaders/parsers/parse-json-graph.d.ts +29 -0
  131. package/dist/loaders/parsers/parse-json-graph.d.ts.map +1 -0
  132. package/dist/loaders/parsers/parse-json-graph.js +78 -0
  133. package/dist/loaders/parsers/parse-json-graph.js.map +1 -0
  134. package/dist/style/graph-style-engine.d.ts +4 -2
  135. package/dist/style/graph-style-engine.d.ts.map +1 -1
  136. package/dist/style/graph-style-engine.js +3 -2
  137. package/dist/style/graph-style-engine.js.map +1 -1
  138. package/dist/style/{style-engine.d.ts → stylesheet-engine.d.ts} +3 -3
  139. package/dist/style/stylesheet-engine.d.ts.map +1 -0
  140. package/dist/style/{style-engine.js → stylesheet-engine.js} +1 -1
  141. package/dist/style/stylesheet-engine.js.map +1 -0
  142. package/dist/utils/collapsed-chains.d.ts +8 -8
  143. package/dist/utils/collapsed-chains.d.ts.map +1 -1
  144. package/dist/utils/collapsed-chains.js +1 -6
  145. package/dist/utils/collapsed-chains.js.map +1 -1
  146. package/dist/utils/rank-grid.d.ts +30 -0
  147. package/dist/utils/rank-grid.d.ts.map +1 -0
  148. package/dist/utils/rank-grid.js +306 -0
  149. package/dist/utils/rank-grid.js.map +1 -0
  150. package/package.json +4 -8
  151. package/src/_disabled/arrow-graph-data.ts.disabled +18 -0
  152. package/src/_disabled/columnar-graph-data-builder.ts.disabled +250 -0
  153. package/src/_disabled/graph-runtime-layout.ts.disabled +29 -0
  154. package/src/core/graph-engine.ts +201 -84
  155. package/src/core/graph-layout.ts +52 -29
  156. package/src/core/interaction-manager.ts +20 -20
  157. package/src/graph/arrow-graph.ts +648 -0
  158. package/src/graph/classic-graph.ts +447 -0
  159. package/src/graph/edge.ts +7 -7
  160. package/src/graph/functions/arrow-utils.ts +72 -0
  161. package/src/graph/functions/convert-arrow-graph-to-classic-graph.ts.disabled +47 -0
  162. package/src/graph/functions/convert-plain-graph-to-arrow-graph.ts.disabled +119 -0
  163. package/src/graph/functions/create-graph-from-data.ts +16 -0
  164. package/src/graph/functions/create-plain-graph-from-data.ts.disabled +176 -0
  165. package/src/graph/graph-normalization.ts +87 -0
  166. package/src/graph/graph.ts +68 -339
  167. package/src/graph/node.ts +9 -9
  168. package/src/graph/tabular-graph.ts.disabled +761 -0
  169. package/src/graph-data/arrow-graph-data-builder.ts +165 -0
  170. package/src/graph-data/graph-data-builder.ts +7 -0
  171. package/src/graph-data/graph-data.ts +57 -0
  172. package/src/graph-data/plain-graph-data-builder.ts +132 -0
  173. package/src/index.ts +53 -13
  174. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +1 -2
  175. package/src/layers/common-layers/grid-layer/grid-layer.ts +237 -0
  176. package/src/layers/edge-attachment-helper.ts +22 -16
  177. package/src/layers/graph-layer.ts +642 -62
  178. package/src/layouts/d3-dag/collapsable-d3-dag-layout.ts +330 -0
  179. package/src/layouts/d3-dag/d3-dag-layout.ts +166 -396
  180. package/src/layouts/d3-force/d3-force-layout.ts +52 -30
  181. package/src/layouts/experimental/force-multi-graph-layout.ts +55 -49
  182. package/src/layouts/experimental/hive-plot-layout.ts +41 -42
  183. package/src/layouts/experimental/radial-layout.ts +39 -20
  184. package/src/layouts/gpu-force/gpu-force-layout.ts +72 -70
  185. package/src/layouts/simple-layout.ts +20 -44
  186. package/src/loaders/{create-graph.ts → deprecated/create-graph.ts.disabled} +6 -6
  187. package/src/loaders/deprecated/json-classic-graph-loader.ts.disabled +33 -0
  188. package/src/loaders/{simple-json-graph-loader.ts → deprecated/simple-json-graph-loader.ts.disabled} +3 -3
  189. package/src/loaders/{table-graph-loader.ts → deprecated/table-graph-loader.ts.disabled} +8 -8
  190. package/src/loaders/dot-graph-loader.ts +860 -0
  191. package/src/loaders/json-graph-loader.ts +48 -0
  192. package/src/loaders/parsers/create-graph-data.ts.disabled +45 -0
  193. package/src/loaders/{edge-parsers.ts → parsers/edge-parsers.ts} +2 -2
  194. package/src/loaders/{node-parsers.ts → parsers/node-parsers.ts} +2 -2
  195. package/src/loaders/parsers/parse-json-graph.ts +134 -0
  196. package/src/style/graph-style-engine.ts +5 -2
  197. package/src/style/{style-engine.ts → stylesheet-engine.ts} +3 -3
  198. package/src/utils/collapsed-chains.ts +11 -17
  199. package/src/utils/rank-grid.ts +426 -0
  200. package/dist/loaders/create-graph.d.ts +0 -12
  201. package/dist/loaders/create-graph.d.ts.map +0 -1
  202. package/dist/loaders/create-graph.js +0 -38
  203. package/dist/loaders/create-graph.js.map +0 -1
  204. package/dist/loaders/edge-parsers.d.ts.map +0 -1
  205. package/dist/loaders/edge-parsers.js.map +0 -1
  206. package/dist/loaders/json-loader.d.ts +0 -7
  207. package/dist/loaders/json-loader.d.ts.map +0 -1
  208. package/dist/loaders/json-loader.js +0 -16
  209. package/dist/loaders/json-loader.js.map +0 -1
  210. package/dist/loaders/node-parsers.d.ts.map +0 -1
  211. package/dist/loaders/node-parsers.js.map +0 -1
  212. package/dist/loaders/simple-json-graph-loader.d.ts +0 -11
  213. package/dist/loaders/simple-json-graph-loader.d.ts.map +0 -1
  214. package/dist/loaders/simple-json-graph-loader.js +0 -20
  215. package/dist/loaders/simple-json-graph-loader.js.map +0 -1
  216. package/dist/loaders/table-graph-loader.d.ts +0 -16
  217. package/dist/loaders/table-graph-loader.d.ts.map +0 -1
  218. package/dist/loaders/table-graph-loader.js +0 -91
  219. package/dist/loaders/table-graph-loader.js.map +0 -1
  220. package/dist/style/style-engine.d.ts.map +0 -1
  221. package/dist/style/style-engine.js.map +0 -1
  222. package/dist/widgets/long-press-button.d.ts +0 -12
  223. package/dist/widgets/long-press-button.d.ts.map +0 -1
  224. package/dist/widgets/long-press-button.js +0 -31
  225. package/dist/widgets/long-press-button.js.map +0 -1
  226. package/dist/widgets/view-control-widget.d.ts +0 -77
  227. package/dist/widgets/view-control-widget.d.ts.map +0 -1
  228. package/dist/widgets/view-control-widget.js +0 -197
  229. package/dist/widgets/view-control-widget.js.map +0 -1
  230. package/src/loaders/json-loader.ts +0 -19
  231. package/src/widgets/long-press-button.tsx +0 -50
  232. package/src/widgets/view-control-widget.tsx +0 -339
@@ -0,0 +1,426 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {Node} from '../graph/node';
6
+
7
+ export type RankAccessor = string | ((node: Node) => number | null | undefined);
8
+ export type LabelAccessor = string | ((node: Node) => string | number | null | undefined);
9
+
10
+ export type RankPosition = {
11
+ rank: number;
12
+ yPosition: number;
13
+ label: string | number;
14
+ };
15
+
16
+ export type MapRanksToYPositionsOptions = {
17
+ rankAccessor?: RankAccessor;
18
+ labelAccessor?: LabelAccessor;
19
+ /** Optional target range for the computed y positions. */
20
+ yRange?: {min?: number; max?: number};
21
+ };
22
+
23
+ type RankAggregate = {sum: number; count: number; label: string | number | null};
24
+
25
+ type RankAggregateState = {
26
+ aggregates: Map<number, RankAggregate>;
27
+ range: {min: number; max: number};
28
+ };
29
+
30
+ function distributeEvenSpacing(positions: RankPosition[], start: number, end: number) {
31
+ const count = positions.length;
32
+ if (count === 0) {
33
+ return;
34
+ }
35
+
36
+ if (count === 1) {
37
+ positions[0].yPosition = start;
38
+ return;
39
+ }
40
+
41
+ const step = (end - start) / (count - 1);
42
+ for (let i = 0; i < count; i++) {
43
+ positions[i].yPosition = start + step * i;
44
+ }
45
+ }
46
+
47
+ function fallbackMonotonicSpacing(positions: RankPosition[]) {
48
+ if (positions.length === 0) {
49
+ return;
50
+ }
51
+
52
+ let previous = positions[0].yPosition;
53
+ for (let i = 1; i < positions.length; i++) {
54
+ const current = positions[i].yPosition;
55
+ if (!(current > previous)) {
56
+ previous += 1;
57
+ positions[i].yPosition = previous;
58
+ } else {
59
+ previous = current;
60
+ }
61
+ }
62
+ }
63
+
64
+ function enforceMonotonicPositions(
65
+ positions: RankPosition[],
66
+ range: {min: number; max: number}
67
+ ) {
68
+ if (positions.length === 0) {
69
+ return;
70
+ }
71
+
72
+ const hasFiniteMin = Number.isFinite(range.min);
73
+ const hasFiniteMax = Number.isFinite(range.max);
74
+
75
+ if (positions.length === 1) {
76
+ if (hasFiniteMin) {
77
+ positions[0].yPosition = range.min;
78
+ }
79
+ return;
80
+ }
81
+
82
+ if (hasFiniteMin && hasFiniteMax && range.max > range.min) {
83
+ distributeEvenSpacing(positions, range.min, range.max);
84
+ return;
85
+ }
86
+
87
+ if (hasFiniteMin) {
88
+ positions[0].yPosition = range.min;
89
+ }
90
+
91
+ fallbackMonotonicSpacing(positions);
92
+ }
93
+
94
+ function resolveTargetRange(
95
+ range: {min: number; max: number},
96
+ override?: {min?: number; max?: number}
97
+ ): {min: number; max: number} {
98
+ const overrideMin = typeof override?.min === 'number' && Number.isFinite(override.min) ? override.min : undefined;
99
+ const overrideMax = typeof override?.max === 'number' && Number.isFinite(override.max) ? override.max : undefined;
100
+
101
+ const candidateMin = overrideMin ?? range.min;
102
+ const candidateMax = overrideMax ?? range.max;
103
+
104
+ const min = Number.isFinite(candidateMin) ? candidateMin : range.min;
105
+ const max = Number.isFinite(candidateMax) ? candidateMax : range.max;
106
+
107
+ return {min, max};
108
+ }
109
+
110
+ function accumulateRank(
111
+ node: Node,
112
+ getRank: (node: Node) => number | null,
113
+ getLabel: (node: Node) => string | number | null,
114
+ getPosition: (node: Node) => [number, number] | null | undefined,
115
+ state: RankAggregateState
116
+ ) {
117
+ const {aggregates, range} = state;
118
+ const rank = getRank(node);
119
+ if (typeof rank !== 'number' || !Number.isFinite(rank)) {
120
+ return;
121
+ }
122
+
123
+ const position = getPosition(node);
124
+ if (!position) {
125
+ return;
126
+ }
127
+
128
+ const [, y] = position;
129
+ if (typeof y !== 'number' || !Number.isFinite(y)) {
130
+ return;
131
+ }
132
+
133
+ const entry = aggregates.get(rank) ?? {sum: 0, count: 0, label: null};
134
+ entry.sum += y;
135
+ entry.count += 1;
136
+
137
+ if (entry.label === null) {
138
+ const label = getLabel(node);
139
+ if (label !== null) {
140
+ entry.label = label;
141
+ }
142
+ }
143
+
144
+ aggregates.set(rank, entry);
145
+ range.min = Math.min(range.min, y);
146
+ range.max = Math.max(range.max, y);
147
+ }
148
+
149
+ function normalizeRankAccessor(accessor: RankAccessor | undefined): (node: Node) => number | null {
150
+ if (!accessor) {
151
+ return (node: Node) => {
152
+ const value = node.getPropertyValue('srank');
153
+ if (typeof value === 'number' && Number.isFinite(value)) {
154
+ return value;
155
+ }
156
+ if (typeof value === 'string') {
157
+ const parsed = Number(value);
158
+ return Number.isFinite(parsed) ? parsed : null;
159
+ }
160
+ return null;
161
+ };
162
+ }
163
+
164
+ if (typeof accessor === 'function') {
165
+ return (node: Node) => {
166
+ const value = accessor(node);
167
+ if (typeof value === 'number' && Number.isFinite(value)) {
168
+ return value;
169
+ }
170
+ if (typeof value === 'string') {
171
+ const parsed = Number(value);
172
+ return Number.isFinite(parsed) ? parsed : null;
173
+ }
174
+ return null;
175
+ };
176
+ }
177
+
178
+ return (node: Node) => {
179
+ const value = node.getPropertyValue(accessor);
180
+ if (typeof value === 'number' && Number.isFinite(value)) {
181
+ return value;
182
+ }
183
+ if (typeof value === 'string') {
184
+ const parsed = Number(value);
185
+ return Number.isFinite(parsed) ? parsed : null;
186
+ }
187
+ return null;
188
+ };
189
+ }
190
+
191
+ function normalizeLabelAccessor(accessor: LabelAccessor | undefined): (node: Node) => string | number | null {
192
+ if (!accessor) {
193
+ return (node: Node) => {
194
+ const value = node.getPropertyValue('rankLabel');
195
+ if (value === undefined || value === null || value === '') {
196
+ return null;
197
+ }
198
+ if (typeof value === 'number' || typeof value === 'string') {
199
+ return value;
200
+ }
201
+ return null;
202
+ };
203
+ }
204
+
205
+ if (typeof accessor === 'function') {
206
+ return (node: Node) => {
207
+ const value = accessor(node);
208
+ if (value === undefined || value === null || value === '') {
209
+ return null;
210
+ }
211
+ if (typeof value === 'number' || typeof value === 'string') {
212
+ return value;
213
+ }
214
+ return null;
215
+ };
216
+ }
217
+
218
+ return (node: Node) => {
219
+ const value = node.getPropertyValue(accessor);
220
+ if (value === undefined || value === null || value === '') {
221
+ return null;
222
+ }
223
+ if (typeof value === 'number' || typeof value === 'string') {
224
+ return value;
225
+ }
226
+ return null;
227
+ };
228
+ }
229
+
230
+ /**
231
+ * Builds a mapping from rank identifiers to averaged y positions.
232
+ */
233
+ export function mapRanksToYPositions(
234
+ nodes: Iterable<Node>,
235
+ getPosition: (node: Node) => [number, number] | null | undefined,
236
+ options?: MapRanksToYPositionsOptions
237
+ ): RankPosition[] {
238
+ const getRank = normalizeRankAccessor(options?.rankAccessor);
239
+ const getLabel = normalizeLabelAccessor(options?.labelAccessor);
240
+
241
+ const state: RankAggregateState = {
242
+ aggregates: new Map<number, RankAggregate>(),
243
+ range: {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY}
244
+ };
245
+
246
+ for (const node of nodes) {
247
+ accumulateRank(node, getRank, getLabel, getPosition, state);
248
+ }
249
+
250
+ const {aggregates, range} = state;
251
+ const positions: RankPosition[] = Array.from(aggregates.entries()).map(([rank, {sum, count, label}]) => ({
252
+ rank,
253
+ yPosition: count ? sum / count : 0,
254
+ label: label ?? rank
255
+ }));
256
+
257
+ positions.sort((a, b) => a.rank - b.rank);
258
+
259
+ const needsRemap = positions.some(
260
+ (entry, index) => index > 0 && entry.yPosition <= positions[index - 1].yPosition
261
+ );
262
+ if (needsRemap) {
263
+ const targetRange = resolveTargetRange(range, options?.yRange);
264
+ enforceMonotonicPositions(positions, targetRange);
265
+ }
266
+
267
+ return positions;
268
+ }
269
+
270
+ export type SelectRankLinesOptions = {
271
+ yMin: number;
272
+ yMax: number;
273
+ maxCount?: number;
274
+ };
275
+
276
+ function locateInsertionIndex(ranks: RankPosition[], target: number): number {
277
+ let low = 0;
278
+ let high = ranks.length - 1;
279
+
280
+ while (low < high) {
281
+ const mid = Math.floor((low + high) / 2);
282
+ if (ranks[mid].yPosition < target) {
283
+ low = mid + 1;
284
+ } else {
285
+ high = mid;
286
+ }
287
+ }
288
+
289
+ return low;
290
+ }
291
+
292
+ function pickNearestAvailableIndex(
293
+ ranks: RankPosition[],
294
+ target: number,
295
+ startIndex: number,
296
+ used: Set<number>
297
+ ): number {
298
+ let bestIndex = -1;
299
+ let bestDistance = Number.POSITIVE_INFINITY;
300
+
301
+ const consider = (index: number) => {
302
+ if (index < 0 || index >= ranks.length || used.has(index)) {
303
+ return;
304
+ }
305
+ const distance = Math.abs(ranks[index].yPosition - target);
306
+ const isCloser = distance < bestDistance;
307
+ const isTie = distance === bestDistance && bestIndex !== -1;
308
+ if (isCloser || (isTie && (ranks[index].yPosition < ranks[bestIndex].yPosition || index < bestIndex))) {
309
+ bestDistance = distance;
310
+ bestIndex = index;
311
+ }
312
+ };
313
+
314
+ consider(startIndex);
315
+ consider(startIndex - 1);
316
+
317
+ for (let offset = 1; bestIndex === -1 && (startIndex - offset >= 0 || startIndex + offset < ranks.length); offset++) {
318
+ consider(startIndex - offset);
319
+ consider(startIndex + offset);
320
+ }
321
+
322
+ return bestIndex;
323
+ }
324
+
325
+ function findFallbackIndex(ranks: RankPosition[], used: Set<number>): number {
326
+ for (let i = 0; i < ranks.length; i++) {
327
+ if (!used.has(i)) {
328
+ return i;
329
+ }
330
+ }
331
+ return -1;
332
+ }
333
+
334
+ function findClosestAvailableIndex(
335
+ ranks: RankPosition[],
336
+ target: number,
337
+ used: Set<number>
338
+ ): number {
339
+ if (ranks.length === 0) {
340
+ return -1;
341
+ }
342
+
343
+ const insertionIndex = locateInsertionIndex(ranks, target);
344
+ const nearest = pickNearestAvailableIndex(ranks, target, insertionIndex, used);
345
+ if (nearest !== -1) {
346
+ return nearest;
347
+ }
348
+
349
+ const fallback = findFallbackIndex(ranks, used);
350
+ if (fallback !== -1) {
351
+ return fallback;
352
+ }
353
+
354
+ return Math.min(Math.max(insertionIndex, 0), ranks.length - 1);
355
+ }
356
+
357
+ function computeTargetRatios(count: number): number[] {
358
+ if (count <= 1) {
359
+ return [0.5];
360
+ }
361
+ const step = 1 / (count - 1);
362
+ return Array.from({length: count}, (_, index) => index * step);
363
+ }
364
+
365
+ function fillRemainingSelections(used: Set<number>, lastIndex: number, maxCount: number) {
366
+ for (let i = 0; used.size < maxCount && i <= lastIndex; i++) {
367
+ used.add(i);
368
+ }
369
+ }
370
+
371
+ function chooseEvenlySpacedIndices(ranks: RankPosition[], maxCount: number): number[] {
372
+ const lastIndex = ranks.length - 1;
373
+ const start = ranks[0].yPosition;
374
+ const end = ranks[lastIndex].yPosition;
375
+ const span = end - start;
376
+ const used = new Set<number>();
377
+
378
+ for (const ratio of computeTargetRatios(maxCount)) {
379
+ const target = span !== 0 ? start + ratio * span : start;
380
+ const index = findClosestAvailableIndex(ranks, target, used);
381
+ if (index !== -1) {
382
+ used.add(index);
383
+ }
384
+ }
385
+
386
+ fillRemainingSelections(used, lastIndex, maxCount);
387
+
388
+ return Array.from(used).sort((a, b) => a - b).slice(0, maxCount);
389
+ }
390
+
391
+ /**
392
+ * Selects a subset of rank positions that are evenly distributed within a range.
393
+ */
394
+ export function selectRankLines(
395
+ ranks: RankPosition[],
396
+ {yMin, yMax, maxCount = 8}: SelectRankLinesOptions
397
+ ): RankPosition[] {
398
+ if (!Number.isFinite(yMin) || !Number.isFinite(yMax) || maxCount <= 0) {
399
+ return [];
400
+ }
401
+
402
+ const min = Math.min(yMin, yMax);
403
+ const max = Math.max(yMin, yMax);
404
+
405
+ const filtered = ranks
406
+ .filter((entry) => Number.isFinite(entry.yPosition) && entry.yPosition >= min && entry.yPosition <= max)
407
+ .sort((a, b) => a.yPosition - b.yPosition);
408
+
409
+ if (filtered.length === 0) {
410
+ return [];
411
+ }
412
+
413
+ if (filtered.length <= maxCount) {
414
+ return filtered;
415
+ }
416
+
417
+ if (maxCount === 1) {
418
+ const midpoint = (filtered[0].yPosition + filtered[filtered.length - 1].yPosition) / 2;
419
+ const index = findClosestAvailableIndex(filtered, midpoint, new Set<number>());
420
+ return index === -1 ? [filtered[0]] : [filtered[index]];
421
+ }
422
+
423
+ const selected = chooseEvenlySpacedIndices(filtered, maxCount);
424
+ return selected.map((index) => filtered[index]);
425
+ }
426
+
@@ -1,12 +0,0 @@
1
- import { Graph } from '../graph/graph';
2
- /**
3
- * @deprecated Use `new Graph(name, nodes, edges)`
4
- * Create a graph from a list of Nodes and edges
5
- */
6
- export declare function createGraph(props: {
7
- name: any;
8
- nodes: any;
9
- edges: any;
10
- nodeParser: any;
11
- edgeParser: any;
12
- }): Graph;
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-graph.d.ts","sourceRoot":"","sources":["../../src/loaders/create-graph.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,KAAK,EAAC,0BAAuB;AAErC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAAC,IAAI,MAAC;IAAC,KAAK,MAAC;IAAC,KAAK,MAAC;IAAC,UAAU,MAAC;IAAC,UAAU,MAAA;CAAC,SA8B9E"}
@@ -1,38 +0,0 @@
1
- // deck.gl-community
2
- // SPDX-License-Identifier: MIT
3
- // Copyright (c) vis.gl contributors
4
- import { Edge } from '../graph/edge';
5
- import { Node } from '../graph/node';
6
- import { Graph } from '../graph/graph';
7
- /**
8
- * @deprecated Use `new Graph(name, nodes, edges)`
9
- * Create a graph from a list of Nodes and edges
10
- */
11
- export function createGraph(props) {
12
- const { name, nodes, edges, nodeParser, edgeParser } = props;
13
- // create a new empty graph
14
- const graph = new Graph();
15
- const graphName = name || Date.now();
16
- graph.setGraphName(graphName);
17
- // add nodes
18
- const glNodes = nodes.map((node) => {
19
- const { id } = nodeParser(node);
20
- return new Node({
21
- id,
22
- data: node
23
- });
24
- });
25
- graph.batchAddNodes(glNodes);
26
- const glEdges = edges.map((edge) => {
27
- const { id, sourceId, targetId, directed } = edgeParser(edge);
28
- return new Edge({
29
- id,
30
- sourceId,
31
- targetId,
32
- directed,
33
- data: edge
34
- });
35
- });
36
- graph.batchAddEdges(glEdges);
37
- return graph;
38
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-graph.js","sourceRoot":"","sources":["../../src/loaders/create-graph.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,IAAI,EAAC,yBAAsB;AACnC,OAAO,EAAC,IAAI,EAAC,yBAAsB;AACnC,OAAO,EAAC,KAAK,EAAC,0BAAuB;AAErC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAmD;IAC7E,MAAM,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAC,GAAG,KAAK,CAAC;IAC3D,2BAA2B;IAC3B,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAE1B,MAAM,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAE9B,YAAY;IACZ,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,EAAC,EAAE,EAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,IAAI,CAAC;YACd,EAAE;YACF,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAE7B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,EAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO,IAAI,IAAI,CAAC;YACd,EAAE;YACF,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"edge-parsers.d.ts","sourceRoot":"","sources":["../../src/loaders/edge-parsers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,WAAW,EAAC,yBAAsB;AAG/C,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAcpE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"edge-parsers.js","sourceRoot":"","sources":["../../src/loaders/edge-parsers.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,KAAK,EAAC,wBAAqB;AAEnC,MAAM,UAAU,eAAe,CAAC,IAAS;IACvC,MAAM,EAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC;IAEhD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACrD,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,QAAQ,IAAI,KAAK;QAC3B,QAAQ;QACR,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -1,7 +0,0 @@
1
- import { basicNodeParser } from './node-parsers';
2
- import { basicEdgeParser } from './edge-parsers';
3
- export declare const JSONLoader: ({ json, nodeParser, edgeParser }: {
4
- json: any;
5
- nodeParser?: typeof basicNodeParser;
6
- edgeParser?: typeof basicEdgeParser;
7
- }) => import("..").Graph;
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-loader.d.ts","sourceRoot":"","sources":["../../src/loaders/json-loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,eAAe,EAAC,0BAAuB;AAC/C,OAAO,EAAC,eAAe,EAAC,0BAAuB;AAG/C,eAAO,MAAM,UAAU,GAAI;;;;CAAkE,uBAS5F,CAAC"}
@@ -1,16 +0,0 @@
1
- // deck.gl-community
2
- // SPDX-License-Identifier: MIT
3
- // Copyright (c) vis.gl contributors
4
- import { createGraph } from './create-graph';
5
- import { basicNodeParser } from './node-parsers';
6
- import { basicEdgeParser } from './edge-parsers';
7
- import { error } from '../utils/log';
8
- export const JSONLoader = ({ json, nodeParser = basicNodeParser, edgeParser = basicEdgeParser }) => {
9
- const { name = 'default', nodes, edges } = json;
10
- if (!nodes) {
11
- error('Invalid graph: nodes is missing.');
12
- return null;
13
- }
14
- const graph = createGraph({ name, nodes, edges, nodeParser, edgeParser });
15
- return graph;
16
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-loader.js","sourceRoot":"","sources":["../../src/loaders/json-loader.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,WAAW,EAAC,0BAAuB;AAC3C,OAAO,EAAC,eAAe,EAAC,0BAAuB;AAC/C,OAAO,EAAC,eAAe,EAAC,0BAAuB;AAC/C,OAAO,EAAC,KAAK,EAAC,wBAAqB;AAEnC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAC,IAAI,EAAE,UAAU,GAAG,eAAe,EAAE,UAAU,GAAG,eAAe,EAAC,EAAE,EAAE;IAC/F,MAAM,EAAC,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAC,GAAG,IAAI,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-parsers.d.ts","sourceRoot":"","sources":["../../src/loaders/node-parsers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,WAAW,EAAC,yBAAsB;AAG/C,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAMlE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-parsers.js","sourceRoot":"","sources":["../../src/loaders/node-parsers.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,KAAK,EAAC,wBAAqB;AAEnC,MAAM,UAAU,eAAe,CAAC,IAAS;IACvC,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC1B,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAC,CAAC;AACvB,CAAC"}
@@ -1,11 +0,0 @@
1
- /** @deprecated Use loadSimpleJSONGraph */
2
- export declare const JSONLoader: ({ json, nodeParser, edgeParser }: {
3
- json: any;
4
- nodeParser: any;
5
- edgeParser: any;
6
- }) => import("..").Graph;
7
- /** A loader for a simple graph format */
8
- export declare function loadSimpleJSONGraph(json: Record<string, unknown>, options?: {
9
- nodeParser: any;
10
- edgeParser: any;
11
- }): import("..").Graph;
@@ -1 +0,0 @@
1
- {"version":3,"file":"simple-json-graph-loader.d.ts","sourceRoot":"","sources":["../../src/loaders/simple-json-graph-loader.ts"],"names":[],"mappings":"AASA,0CAA0C;AAC1C,eAAO,MAAM,UAAU,GAAI;;;;CAA8B,uBACJ,CAAC;AAEtD,0CAA0C;AAC1C,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE;IAAC,UAAU,MAAC;IAAC,UAAU,MAAA;CAAC,sBAWnC"}
@@ -1,20 +0,0 @@
1
- // deck.gl-community
2
- // SPDX-License-Identifier: MIT
3
- // Copyright (c) vis.gl contributors
4
- import { createGraph } from './create-graph';
5
- import { error } from '../utils/log';
6
- import { basicNodeParser } from './node-parsers';
7
- import { basicEdgeParser } from './edge-parsers';
8
- /** @deprecated Use loadSimpleJSONGraph */
9
- export const JSONLoader = ({ json, nodeParser, edgeParser }) => loadSimpleJSONGraph(json, { nodeParser, edgeParser });
10
- /** A loader for a simple graph format */
11
- export function loadSimpleJSONGraph(json, options) {
12
- const { nodeParser = basicNodeParser, edgeParser = basicEdgeParser } = options;
13
- const { name = 'default', nodes, edges } = json;
14
- if (!nodes) {
15
- error('Invalid graph: nodes is missing.');
16
- return null;
17
- }
18
- const graph = createGraph({ name, nodes, edges, nodeParser, edgeParser });
19
- return graph;
20
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"simple-json-graph-loader.js","sourceRoot":"","sources":["../../src/loaders/simple-json-graph-loader.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,WAAW,EAAC,0BAAuB;AAC3C,OAAO,EAAC,KAAK,EAAC,wBAAqB;AACnC,OAAO,EAAC,eAAe,EAAC,0BAAuB;AAC/C,OAAO,EAAC,eAAe,EAAC,0BAAuB;AAE/C,0CAA0C;AAC1C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAC,EAAE,EAAE,CAC3D,mBAAmB,CAAC,IAAI,EAAE,EAAC,UAAU,EAAE,UAAU,EAAC,CAAC,CAAC;AAEtD,0CAA0C;AAC1C,MAAM,UAAU,mBAAmB,CACjC,IAA6B,EAC7B,OAAkC;IAElC,MAAM,EAAC,UAAU,GAAG,eAAe,EAAE,UAAU,GAAG,eAAe,EAAC,GAAG,OAAO,CAAC;IAC7E,MAAM,EAAC,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAC,GAAG,IAAI,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,16 +0,0 @@
1
- import type { NodeOptions } from '../graph/node';
2
- import type { EdgeOptions } from '../graph/edge';
3
- import { Graph } from '../graph/graph';
4
- export type ParseGraphOptions = {
5
- nodeIdField?: string;
6
- edgeSourceField?: string;
7
- edgeTargetField?: string;
8
- edgeDirectedField?: string;
9
- edgeDirected?: boolean;
10
- nodeParser?: (nodeRow: any) => NodeOptions;
11
- edgeParser?: (edgeRow: any) => EdgeOptions;
12
- };
13
- export declare function tableGraphLoader(tables: {
14
- nodes: any[];
15
- edges: any[];
16
- }, options?: ParseGraphOptions): Graph;
@@ -1 +0,0 @@
1
- {"version":3,"file":"table-graph-loader.d.ts","sourceRoot":"","sources":["../../src/loaders/table-graph-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,WAAW,EAAC,yBAAsB;AAC/C,OAAO,KAAK,EAAC,WAAW,EAAC,yBAAsB;AAG/C,OAAO,EAAC,KAAK,EAAC,0BAAuB;AAIrC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,WAAW,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,WAAW,CAAC;CAC5C,CAAC;AAqBF,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE;IAAC,KAAK,EAAE,GAAG,EAAE,CAAC;IAAC,KAAK,EAAE,GAAG,EAAE,CAAA;CAAC,EACpC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,KAAK,CAuDP"}