@wandelbots/wandelbots-js-react-components 4.7.1 → 4.7.2-pr.feat-RB-3348-remove-v1-usage.553.eede090
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.
- package/README.md +0 -21
- package/dist/3d.cjs.js +1 -1
- package/dist/3d.es.js +1 -1
- package/dist/{MotionGroupVisualizer-7Mw9PINy.js → MotionGroupVisualizer--j-KhrNT.js} +529 -567
- package/dist/MotionGroupVisualizer--j-KhrNT.js.map +1 -0
- package/dist/MotionGroupVisualizer-TrHq4Etp.cjs +2 -0
- package/dist/MotionGroupVisualizer-TrHq4Etp.cjs.map +1 -0
- package/dist/components/3d-viewport/CoordinateSystemTransform.d.ts +1 -1
- package/dist/components/3d-viewport/CoordinateSystemTransform.d.ts.map +1 -1
- package/dist/components/3d-viewport/SafetyZonesRenderer.d.ts +1 -2
- package/dist/components/3d-viewport/SafetyZonesRenderer.d.ts.map +1 -1
- package/dist/components/3d-viewport/TrajectoryRenderer.d.ts +2 -2
- package/dist/components/3d-viewport/TrajectoryRenderer.d.ts.map +1 -1
- package/dist/components/3d-viewport/collider/ColliderCollection.d.ts +1 -1
- package/dist/components/3d-viewport/collider/ColliderElement.d.ts +1 -1
- package/dist/components/3d-viewport/collider/CollisionSceneRenderer.d.ts +2 -2
- package/dist/components/3d-viewport/collider/CollisionSceneRenderer.d.ts.map +1 -1
- package/dist/components/3d-viewport/collider/colliderShapeToBufferGeometry.d.ts +1 -1
- package/dist/core.cjs.js +1 -1
- package/dist/core.es.js +37 -39
- package/dist/core.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +51 -55
- package/dist/index.es.js.map +1 -1
- package/dist/interpolation-7jeNXp6c.cjs +42 -0
- package/dist/interpolation-7jeNXp6c.cjs.map +1 -0
- package/dist/{interpolation-B8AcxfdD.js → interpolation-DbcWWD5r.js} +3635 -3115
- package/dist/interpolation-DbcWWD5r.js.map +1 -0
- package/dist/lib/ConnectedMotionGroup.d.ts +0 -1
- package/dist/lib/ConnectedMotionGroup.d.ts.map +1 -1
- package/dist/lib/MotionStreamConnection.d.ts +0 -1
- package/dist/lib/MotionStreamConnection.d.ts.map +1 -1
- package/dist/themes/createDarkTheme.d.ts.map +1 -1
- package/dist/themes/themeTypes.d.ts +0 -4
- package/dist/themes/themeTypes.d.ts.map +1 -1
- package/dist/{theming-BKpqgTRM.js → theming-CljdqiO8.js} +2745 -2703
- package/dist/theming-CljdqiO8.js.map +1 -0
- package/dist/theming-DgOebzEE.cjs +115 -0
- package/dist/theming-DgOebzEE.cjs.map +1 -0
- package/package.json +1 -6
- package/src/components/3d-viewport/CoordinateSystemTransform.tsx +29 -18
- package/src/components/3d-viewport/SafetyZonesRenderer.tsx +12 -95
- package/src/components/3d-viewport/TrajectoryRenderer.tsx +11 -11
- package/src/components/3d-viewport/collider/ColliderCollection.tsx +1 -1
- package/src/components/3d-viewport/collider/ColliderElement.tsx +1 -1
- package/src/components/3d-viewport/collider/CollisionSceneRenderer.tsx +2 -2
- package/src/components/3d-viewport/collider/colliderShapeToBufferGeometry.ts +1 -1
- package/src/index.ts +0 -1
- package/src/lib/ConnectedMotionGroup.ts +0 -5
- package/src/lib/MotionStreamConnection.ts +0 -5
- package/src/themes/createDarkTheme.ts +1 -22
- package/src/themes/themeTypes.ts +0 -3
- package/dist/LoadingCover-B3UN1lnU.js +0 -81
- package/dist/LoadingCover-B3UN1lnU.js.map +0 -1
- package/dist/LoadingCover-DXcsXWDy.cjs +0 -2
- package/dist/LoadingCover-DXcsXWDy.cjs.map +0 -1
- package/dist/MotionGroupVisualizer-7Mw9PINy.js.map +0 -1
- package/dist/MotionGroupVisualizer-C0ll-LQF.cjs +0 -2
- package/dist/MotionGroupVisualizer-C0ll-LQF.cjs.map +0 -1
- package/dist/WandelscriptEditor-6sAoniLC.cjs +0 -2
- package/dist/WandelscriptEditor-6sAoniLC.cjs.map +0 -1
- package/dist/WandelscriptEditor-kWC2VyG_.js +0 -140
- package/dist/WandelscriptEditor-kWC2VyG_.js.map +0 -1
- package/dist/components/wandelscript-editor/WandelscriptEditor.d.ts +0 -16
- package/dist/components/wandelscript-editor/WandelscriptEditor.d.ts.map +0 -1
- package/dist/components/wandelscript-editor/wandelscript.tmLanguage.d.ts +0 -45
- package/dist/components/wandelscript-editor/wandelscript.tmLanguage.d.ts.map +0 -1
- package/dist/externalizeComponent-B98tgTPP.cjs +0 -24
- package/dist/externalizeComponent-B98tgTPP.cjs.map +0 -1
- package/dist/externalizeComponent-BOqKMZMc.js +0 -526
- package/dist/externalizeComponent-BOqKMZMc.js.map +0 -1
- package/dist/interpolation-B8AcxfdD.js.map +0 -1
- package/dist/interpolation-SWzo5zr4.cjs +0 -20
- package/dist/interpolation-SWzo5zr4.cjs.map +0 -1
- package/dist/theming-BKpqgTRM.js.map +0 -1
- package/dist/theming-CatQaIl_.cjs +0 -115
- package/dist/theming-CatQaIl_.cjs.map +0 -1
- package/dist/wandelscript.cjs.js +0 -2
- package/dist/wandelscript.cjs.js.map +0 -1
- package/dist/wandelscript.d.ts +0 -2
- package/dist/wandelscript.d.ts.map +0 -1
- package/dist/wandelscript.es.js +0 -5
- package/dist/wandelscript.es.js.map +0 -1
- package/src/components/wandelscript-editor/WandelscriptEditor.tsx +0 -142
- package/src/components/wandelscript-editor/wandelscript.tmLanguage.ts +0 -62
- package/src/wandelscript.ts +0 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wandelbots/wandelbots-js-react-components",
|
|
3
|
-
"version": "4.7.
|
|
3
|
+
"version": "4.7.2-pr.feat-RB-3348-remove-v1-usage.553.eede090",
|
|
4
4
|
"description": "React UI toolkit for building applications on top of the Wandelbots platform",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -26,11 +26,6 @@
|
|
|
26
26
|
"types": "./dist/3d.d.ts",
|
|
27
27
|
"import": "./dist/3d.es.js",
|
|
28
28
|
"require": "./dist/3d.cjs.js"
|
|
29
|
-
},
|
|
30
|
-
"./wandelscript": {
|
|
31
|
-
"types": "./dist/wandelscript.d.ts",
|
|
32
|
-
"import": "./dist/wandelscript.es.js",
|
|
33
|
-
"require": "./dist/wandelscript.cjs.js"
|
|
34
29
|
}
|
|
35
30
|
},
|
|
36
31
|
"types": "./dist/index.d.ts",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CoordinateSystem } from "@wandelbots/nova-js/
|
|
1
|
+
import type { CoordinateSystem } from "@wandelbots/nova-js/v2"
|
|
2
2
|
import type { ReactNode } from "react"
|
|
3
3
|
import { Quaternion, Vector3 } from "three"
|
|
4
4
|
|
|
@@ -14,28 +14,39 @@ export const CoordinateSystemTransform = ({
|
|
|
14
14
|
children: ReactNode
|
|
15
15
|
}) => {
|
|
16
16
|
const position = new Vector3(
|
|
17
|
-
(coordinateSystem?.position?.
|
|
18
|
-
(coordinateSystem?.position?.
|
|
19
|
-
(coordinateSystem?.position?.
|
|
17
|
+
(coordinateSystem?.position?.[0] ?? 0) / 1000,
|
|
18
|
+
(coordinateSystem?.position?.[1] ?? 0) / 1000,
|
|
19
|
+
(coordinateSystem?.position?.[2] ?? 0) / 1000,
|
|
20
20
|
)
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
const orientationType = coordinateSystem?.orientation_type
|
|
23
|
+
|
|
24
|
+
let quaternion: Quaternion
|
|
25
|
+
|
|
26
|
+
if (orientationType === "QUATERNION") {
|
|
27
|
+
quaternion = new Quaternion(
|
|
28
|
+
coordinateSystem?.orientation?.[0] ?? 0,
|
|
29
|
+
coordinateSystem?.orientation?.[1] ?? 0,
|
|
30
|
+
coordinateSystem?.orientation?.[2] ?? 0,
|
|
31
|
+
coordinateSystem?.orientation?.[3] ?? 1,
|
|
27
32
|
)
|
|
28
|
-
|
|
33
|
+
} else {
|
|
34
|
+
if (orientationType && orientationType !== "ROTATION_VECTOR") {
|
|
35
|
+
console.warn(
|
|
36
|
+
`Unsupported orientation type ${orientationType}. Only ROTATION_VECTOR and QUATERNION are supported.`,
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
// Default to ROTATION_VECTOR
|
|
40
|
+
const rotationVector = new Vector3(
|
|
41
|
+
coordinateSystem?.orientation?.[0] ?? 0,
|
|
42
|
+
coordinateSystem?.orientation?.[1] ?? 0,
|
|
43
|
+
coordinateSystem?.orientation?.[2] ?? 0,
|
|
44
|
+
)
|
|
45
|
+
const magnitude = rotationVector.length()
|
|
46
|
+
const axis = rotationVector.normalize()
|
|
47
|
+
quaternion = new Quaternion().setFromAxisAngle(axis, magnitude)
|
|
29
48
|
}
|
|
30
49
|
|
|
31
|
-
const rotationVector = new Vector3(
|
|
32
|
-
rotation?.angles[0] ?? 0,
|
|
33
|
-
rotation?.angles[1] ?? 0,
|
|
34
|
-
rotation?.angles[2] ?? 0,
|
|
35
|
-
)
|
|
36
|
-
const magnitude = rotationVector.length()
|
|
37
|
-
const axis = rotationVector.normalize()
|
|
38
|
-
const quaternion = new Quaternion().setFromAxisAngle(axis, magnitude)
|
|
39
50
|
return (
|
|
40
51
|
<group position={position} quaternion={quaternion}>
|
|
41
52
|
{children}
|
|
@@ -12,12 +12,11 @@ import type {
|
|
|
12
12
|
Capsule,
|
|
13
13
|
RectangularCapsule,
|
|
14
14
|
} from "@wandelbots/nova-js/v2"
|
|
15
|
-
import type { Geometry, SafetySetupSafetyZone } from "@wandelbots/nova-js/v1"
|
|
16
15
|
|
|
17
16
|
import { dhParametersToPlaneSize, orientationToQuaternion, verticesToCoplanarity } from "../utils/converters"
|
|
18
17
|
|
|
19
18
|
export type SafetyZonesRendererProps = {
|
|
20
|
-
safetyZones:
|
|
19
|
+
safetyZones: MotionGroupDescription["safety_zones"]
|
|
21
20
|
dhParameters?: DHParameter[]
|
|
22
21
|
} & ThreeElements["group"]
|
|
23
22
|
|
|
@@ -45,14 +44,6 @@ export function SafetyZonesRenderer({
|
|
|
45
44
|
*/
|
|
46
45
|
const planeSize = dhParametersToPlaneSize(dhParameters ?? [])
|
|
47
46
|
|
|
48
|
-
/**
|
|
49
|
-
* Warning during runtime stating the deprecation of the V1 safety zones
|
|
50
|
-
*/
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
Array.isArray(safetyZones) &&
|
|
53
|
-
console.warn("SafetyZonesRenderer: The support of V1 safety zones is deprecated. Please migrate to V2 safety zones.")
|
|
54
|
-
}, [safetyZones])
|
|
55
|
-
|
|
56
47
|
/**
|
|
57
48
|
* Helper function to render plane, sphere, and capsule meshes
|
|
58
49
|
* @param id number
|
|
@@ -134,13 +125,18 @@ export function SafetyZonesRenderer({
|
|
|
134
125
|
* Basically a rounded box with a rectangular cross-section.
|
|
135
126
|
*/
|
|
136
127
|
case "rectangular_capsule": {
|
|
137
|
-
const shape =
|
|
128
|
+
const shape = zone.shape as RectangularCapsule
|
|
138
129
|
const rcRadius = shape.radius / 1000
|
|
139
130
|
const width = shape.sphere_center_distance_x / 1000
|
|
140
131
|
const height = shape.sphere_center_distance_y / 1000
|
|
141
132
|
const depth = rcRadius * 2
|
|
142
133
|
|
|
143
|
-
geometry =
|
|
134
|
+
geometry = (
|
|
135
|
+
<primitive
|
|
136
|
+
object={new RoundedBoxGeometry(width, height, depth, 2, rcRadius)}
|
|
137
|
+
attach="geometry"
|
|
138
|
+
/>
|
|
139
|
+
)
|
|
144
140
|
break
|
|
145
141
|
}
|
|
146
142
|
|
|
@@ -158,98 +154,19 @@ export function SafetyZonesRenderer({
|
|
|
158
154
|
quaternion={orientationToQuaternion(orientation)}
|
|
159
155
|
>
|
|
160
156
|
{geometry}
|
|
161
|
-
<meshStandardMaterial
|
|
162
|
-
{...materialProps}
|
|
163
|
-
polygonOffsetFactor={-id}
|
|
164
|
-
/>
|
|
157
|
+
<meshStandardMaterial {...materialProps} polygonOffsetFactor={-id} />
|
|
165
158
|
</mesh>
|
|
166
159
|
)
|
|
167
160
|
}
|
|
168
161
|
|
|
169
162
|
/**
|
|
170
|
-
* Helper
|
|
163
|
+
* Helper variable render safety zones
|
|
171
164
|
*/
|
|
172
|
-
const
|
|
165
|
+
const renderedSafetyZones = useMemo(() => {
|
|
173
166
|
return Object.values(safetyZones ?? {}).map((zone: Collider, index: number) => {
|
|
174
167
|
return renderMesh(index, zone)
|
|
175
168
|
})
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Helper function to V1 safety zones
|
|
180
|
-
* @deprecated this render function is to be seen as a temporary measure, as the support
|
|
181
|
-
* for the V1 safety zones is to be removed in the future
|
|
182
|
-
*/
|
|
183
|
-
const renderV1SafetyZones = () => {
|
|
184
|
-
if (Array.isArray(safetyZones)) {
|
|
185
|
-
return (safetyZones as SafetySetupSafetyZone[]).map((zone: SafetySetupSafetyZone, index) => {
|
|
186
|
-
let geometries: Geometry[] = []
|
|
187
|
-
if (zone.geometry) {
|
|
188
|
-
if (zone.geometry.compound) {
|
|
189
|
-
geometries = zone.geometry.compound.child_geometries
|
|
190
|
-
} else if (zone.geometry.convex_hull) {
|
|
191
|
-
geometries = [zone.geometry]
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
return geometries.map((geometry, i) => {
|
|
196
|
-
if (!geometry.convex_hull) return null
|
|
197
|
-
|
|
198
|
-
const vertices = geometry.convex_hull.vertices.map(
|
|
199
|
-
(v) => new THREE.Vector3(v.x / 1000, v.y / 1000, v.z / 1000),
|
|
200
|
-
)
|
|
201
|
-
|
|
202
|
-
// Check if the vertices are on the same plane and only define a plane
|
|
203
|
-
// Algorithm has troubles with vertices that are on the same plane so we
|
|
204
|
-
// add a new vertex slightly moved along the normal direction
|
|
205
|
-
const coplanarityResult = verticesToCoplanarity(vertices)
|
|
206
|
-
|
|
207
|
-
if (coplanarityResult.isCoplanar && coplanarityResult.normal) {
|
|
208
|
-
// Add a new vertex slightly moved along the normal direction
|
|
209
|
-
const offset = 0.0001
|
|
210
|
-
const newVertex = new THREE.Vector3().addVectors(
|
|
211
|
-
vertices[0],
|
|
212
|
-
coplanarityResult.normal.multiplyScalar(offset),
|
|
213
|
-
)
|
|
214
|
-
vertices.push(newVertex)
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
let convexGeometry
|
|
218
|
-
try {
|
|
219
|
-
convexGeometry = new ConvexGeometry(vertices)
|
|
220
|
-
} catch (error) {
|
|
221
|
-
console.log("Error creating ConvexGeometry:", error)
|
|
222
|
-
return null
|
|
223
|
-
}
|
|
224
|
-
return (
|
|
225
|
-
<mesh key={`${index}-${i}`} geometry={convexGeometry}>
|
|
226
|
-
<meshStandardMaterial
|
|
227
|
-
key={index}
|
|
228
|
-
attach="material"
|
|
229
|
-
color="#009f4d"
|
|
230
|
-
opacity={0.2}
|
|
231
|
-
depthTest={false}
|
|
232
|
-
depthWrite={false}
|
|
233
|
-
transparent
|
|
234
|
-
polygonOffset
|
|
235
|
-
polygonOffsetFactor={-i}
|
|
236
|
-
/>
|
|
237
|
-
</mesh>
|
|
238
|
-
)
|
|
239
|
-
})
|
|
240
|
-
})
|
|
241
|
-
}
|
|
242
|
-
return null
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Helper variable to render both api versions of safety zones
|
|
247
|
-
*/
|
|
248
|
-
const renderedSafetyZones = useMemo(() => {
|
|
249
|
-
return Array.isArray(safetyZones)
|
|
250
|
-
? renderV1SafetyZones()
|
|
251
|
-
: renderV2SafetyZones()
|
|
252
|
-
}, [safetyZones, renderV1SafetyZones, renderV2SafetyZones])
|
|
169
|
+
}, [safetyZones])
|
|
253
170
|
|
|
254
171
|
return (
|
|
255
172
|
<group {...props}>
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { Line } from "@react-three/drei"
|
|
2
|
-
import type {
|
|
2
|
+
import type { Pose } from "@wandelbots/nova-js/v2"
|
|
3
3
|
import * as THREE from "three"
|
|
4
4
|
|
|
5
5
|
export type TrajectoryRendererProps = {
|
|
6
|
-
trajectory:
|
|
6
|
+
trajectory: Pose[]
|
|
7
7
|
} & React.JSX.IntrinsicElements["group"]
|
|
8
8
|
|
|
9
9
|
export function TrajectoryRenderer({
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}: TrajectoryRendererProps) {
|
|
10
|
+
trajectory,
|
|
11
|
+
...props
|
|
12
|
+
}: TrajectoryRendererProps) {
|
|
13
13
|
const points =
|
|
14
|
-
trajectory
|
|
15
|
-
?.map((
|
|
16
|
-
if (
|
|
14
|
+
trajectory
|
|
15
|
+
?.map((pose: Pose) => {
|
|
16
|
+
if (pose.position?.length) {
|
|
17
17
|
return new THREE.Vector3(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
-
|
|
18
|
+
pose.position[0] / 1000,
|
|
19
|
+
pose.position[2] / 1000,
|
|
20
|
+
-pose.position[1] / 1000,
|
|
21
21
|
)
|
|
22
22
|
}
|
|
23
23
|
return null
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CollisionSetup } from "@wandelbots/nova-api/v2"
|
|
2
2
|
import ColliderCollection, {
|
|
3
3
|
type MeshChildrenProvider,
|
|
4
4
|
} from "./ColliderCollection"
|
|
5
5
|
|
|
6
6
|
type CollisionSceneRendererProps = {
|
|
7
|
-
scene:
|
|
7
|
+
scene: CollisionSetup
|
|
8
8
|
meshChildrenProvider: MeshChildrenProvider
|
|
9
9
|
}
|
|
10
10
|
|
package/src/index.ts
CHANGED
|
@@ -258,11 +258,6 @@ export class ConnectedMotionGroup {
|
|
|
258
258
|
return this.description.motion_group_model
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
-
get wandelscriptIdentifier() {
|
|
262
|
-
const num = this.motionGroupId.split("@")[0]
|
|
263
|
-
return `${this.controllerId.replace(/-/g, "_")}_${num}`
|
|
264
|
-
}
|
|
265
|
-
|
|
266
261
|
/** Jogging velocity in radians for rotation and joint movement */
|
|
267
262
|
get joggingVelocityRads() {
|
|
268
263
|
return (this.joggingVelocity * Math.PI) / 180
|
|
@@ -170,11 +170,6 @@ export class MotionStreamConnection {
|
|
|
170
170
|
return this.controller.controller
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
-
get wandelscriptIdentifier() {
|
|
174
|
-
const num = this.motionGroupId.split("@")[0]
|
|
175
|
-
return `${this.controllerId.replace(/-/g, "_")}_${num}`
|
|
176
|
-
}
|
|
177
|
-
|
|
178
173
|
get joints() {
|
|
179
174
|
return this.initialMotionState.joint_position.map((_, i) => {
|
|
180
175
|
return {
|
|
@@ -338,28 +338,7 @@ export function createDarkTheme(): Theme {
|
|
|
338
338
|
VelocitySlider: {
|
|
339
339
|
sliderLegendColor: baseTheme.palette.text.primary,
|
|
340
340
|
},
|
|
341
|
-
}
|
|
342
|
-
WandelscriptEditor: {
|
|
343
|
-
monacoTheme: {
|
|
344
|
-
base: "vs-dark",
|
|
345
|
-
inherit: true,
|
|
346
|
-
rules: [
|
|
347
|
-
{
|
|
348
|
-
token: "keyword",
|
|
349
|
-
foreground: "#b349a9ff",
|
|
350
|
-
},
|
|
351
|
-
],
|
|
352
|
-
colors: {
|
|
353
|
-
"editor.background": rgbToHex(
|
|
354
|
-
baseTheme.palette.backgroundPaperElevation?.[5] ?? "",
|
|
355
|
-
),
|
|
356
|
-
"editor.foreground": "#d4d4d4",
|
|
357
|
-
"editorLineNumber.foreground": "#797979",
|
|
358
|
-
"editorLineNumber.activeForeground": "#e9e9e9",
|
|
359
|
-
"editor.lineHighlightBorder": "#e9e9e911",
|
|
360
|
-
},
|
|
361
|
-
},
|
|
362
|
-
},
|
|
341
|
+
}
|
|
363
342
|
},
|
|
364
343
|
} as Theme
|
|
365
344
|
}
|
package/src/themes/themeTypes.ts
CHANGED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { t as l, j as t } from "./externalizeComponent-BOqKMZMc.js";
|
|
2
|
-
import { useTheme as c, Stack as i, CircularProgress as g, capitalize as d } from "@mui/material";
|
|
3
|
-
import { lowerFirst as u } from "lodash-es";
|
|
4
|
-
import { useState as f, useEffect as x } from "react";
|
|
5
|
-
import { AxiosError as a } from "axios";
|
|
6
|
-
function T(e, r) {
|
|
7
|
-
throw new Error(r + ` ${JSON.stringify(e)}`);
|
|
8
|
-
}
|
|
9
|
-
function h(e) {
|
|
10
|
-
var r, s, o, n;
|
|
11
|
-
return e instanceof a && e.code === "ERR_NETWORK" ? "Failed to connect to the server. Please check your internet connection." : e instanceof a && e.response ? `${(r = e.response) == null ? void 0 : r.status} ${(s = e.response) == null ? void 0 : s.statusText} from ${(o = e.response) == null ? void 0 : o.config.url}: ${JSON.stringify((n = e.response) == null ? void 0 : n.data)}` : e instanceof Error ? e.message : `Unexpected error: ${l(e) || e}`;
|
|
12
|
-
}
|
|
13
|
-
const k = (e) => {
|
|
14
|
-
const r = e.softTimeout || 3e3, [s, o] = f(!1), n = c();
|
|
15
|
-
return x(() => {
|
|
16
|
-
const m = setTimeout(() => {
|
|
17
|
-
o(!0);
|
|
18
|
-
}, r);
|
|
19
|
-
return () => clearTimeout(m);
|
|
20
|
-
}), /* @__PURE__ */ t.jsx(
|
|
21
|
-
i,
|
|
22
|
-
{
|
|
23
|
-
width: "100%",
|
|
24
|
-
height: "100%",
|
|
25
|
-
alignItems: "center",
|
|
26
|
-
justifyContent: "center",
|
|
27
|
-
sx: { color: n.palette.text.primary },
|
|
28
|
-
children: e.error ? /* @__PURE__ */ t.jsx(
|
|
29
|
-
w,
|
|
30
|
-
{
|
|
31
|
-
loadingMessage: e.message,
|
|
32
|
-
error: e.error
|
|
33
|
-
}
|
|
34
|
-
) : /* @__PURE__ */ t.jsxs(t.Fragment, { children: [
|
|
35
|
-
/* @__PURE__ */ t.jsx(g, { sx: { marginBottom: "24px" } }),
|
|
36
|
-
!!e.message && /* @__PURE__ */ t.jsx("div", { children: e.message }),
|
|
37
|
-
/* @__PURE__ */ t.jsx(
|
|
38
|
-
i,
|
|
39
|
-
{
|
|
40
|
-
sx: {
|
|
41
|
-
visibility: s ? "visible" : "hidden",
|
|
42
|
-
marginTop: "1rem",
|
|
43
|
-
color: n.palette.text.secondary
|
|
44
|
-
},
|
|
45
|
-
children: "This is taking longer than expected..."
|
|
46
|
-
}
|
|
47
|
-
)
|
|
48
|
-
] })
|
|
49
|
-
}
|
|
50
|
-
);
|
|
51
|
-
}, w = (e) => {
|
|
52
|
-
const r = h(e.error), s = e.error instanceof Error ? e.error.stack : null, o = c();
|
|
53
|
-
return /* @__PURE__ */ t.jsxs(
|
|
54
|
-
i,
|
|
55
|
-
{
|
|
56
|
-
sx: {
|
|
57
|
-
maxHeight: "100%",
|
|
58
|
-
maxWidth: "min(100%, 800px)",
|
|
59
|
-
padding: 2,
|
|
60
|
-
overflow: "auto",
|
|
61
|
-
color: o.palette.error.main,
|
|
62
|
-
"& pre": {
|
|
63
|
-
whiteSpace: "pre-wrap",
|
|
64
|
-
wordBreak: "break-word",
|
|
65
|
-
paddingBottom: "3rem"
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
children: [
|
|
69
|
-
(e.loadingMessage ? `Error while ${u(d(e.loadingMessage))} - ` : "") + r,
|
|
70
|
-
/* @__PURE__ */ t.jsx("br", {}),
|
|
71
|
-
s && /* @__PURE__ */ t.jsx("pre", { children: s })
|
|
72
|
-
]
|
|
73
|
-
}
|
|
74
|
-
);
|
|
75
|
-
};
|
|
76
|
-
export {
|
|
77
|
-
k as L,
|
|
78
|
-
w as a,
|
|
79
|
-
T as b
|
|
80
|
-
};
|
|
81
|
-
//# sourceMappingURL=LoadingCover-B3UN1lnU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingCover-B3UN1lnU.js","sources":["../src/components/utils/errorHandling.ts","../src/components/LoadingCover.tsx"],"sourcesContent":["import { AxiosError } from \"axios\"\nimport { tryStringifyJson } from \"./converters\"\n\n// Please note: These helper functions also exist in nova.js\n// (with slightly different formatting), and will be unified\n// at some point in the future.\n\nexport function delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function makeShortErrorMessage(err: unknown) {\n if (err instanceof AxiosError && err.code === \"ERR_NETWORK\") {\n return \"Failed to connect to the server. Please check your internet connection.\"\n } else if (err instanceof AxiosError && err.response) {\n return `${err.response?.status} ${err.response?.statusText}: ${JSON.stringify(err.response?.data)}`\n } else if (err instanceof Error) {\n return err.message\n } else {\n return `Unexpected error: ${err}`\n }\n}\n\nexport function assertUnreachable(x: never, msg: string): never {\n throw new Error(msg + ` ${JSON.stringify(x)}`)\n}\n\nexport function makeErrorMessage(err: unknown) {\n if (err instanceof AxiosError && err.code === \"ERR_NETWORK\") {\n return \"Failed to connect to the server. Please check your internet connection.\"\n } else if (err instanceof AxiosError && err.response) {\n return `${err.response?.status} ${err.response?.statusText} from ${err.response?.config.url}: ${JSON.stringify(err.response?.data)}`\n } else if (err instanceof Error) {\n return err.message\n } else {\n return `Unexpected error: ${tryStringifyJson(err) || err}`\n }\n}\n","import { capitalize, CircularProgress, Stack, useTheme } from \"@mui/material\"\nimport { lowerFirst } from \"lodash-es\"\nimport { useEffect, useState } from \"react\"\nimport { makeErrorMessage } from \"./utils/errorHandling\"\n\nexport const LoadingCover = (props: {\n message?: string\n error?: unknown\n softTimeout?: number\n}) => {\n const softTimeout = props.softTimeout || 3000\n\n const [showSlowLoadingMessage, setShowSlowLoadingMessage] = useState(false)\n const theme = useTheme()\n\n useEffect(() => {\n const timeout = setTimeout(() => {\n setShowSlowLoadingMessage(true)\n }, softTimeout)\n\n return () => clearTimeout(timeout)\n })\n\n return (\n <Stack\n width=\"100%\"\n height=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n sx={{ color: theme.palette.text.primary }}\n >\n {props.error ? (\n <LoadingErrorMessage\n loadingMessage={props.message}\n error={props.error}\n />\n ) : (\n <>\n <CircularProgress sx={{ marginBottom: \"24px\" }} />\n {!!props.message && <div>{props.message}</div>}\n <Stack\n sx={{\n visibility: showSlowLoadingMessage ? \"visible\" : \"hidden\",\n marginTop: \"1rem\",\n color: theme.palette.text.secondary,\n }}\n >\n {\"This is taking longer than expected...\"}\n </Stack>\n </>\n )}\n </Stack>\n )\n}\n\nexport const LoadingErrorMessage = (props: {\n loadingMessage?: string\n error: unknown\n}) => {\n const errorMessage = makeErrorMessage(props.error)\n const stack = props.error instanceof Error ? props.error.stack : null\n const theme = useTheme()\n\n return (\n <Stack\n sx={{\n maxHeight: \"100%\",\n maxWidth: \"min(100%, 800px)\",\n padding: 2,\n overflow: \"auto\",\n color: theme.palette.error.main,\n \"& pre\": {\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n paddingBottom: \"3rem\",\n },\n }}\n >\n {(props.loadingMessage\n ? `Error while ${lowerFirst(capitalize(props.loadingMessage))} - `\n : \"\") + errorMessage}\n <br />\n {stack && <pre>{stack}</pre>}\n </Stack>\n )\n}\n"],"names":["assertUnreachable","x","msg","makeErrorMessage","err","AxiosError","_a","_b","_c","_d","tryStringifyJson","LoadingCover","props","softTimeout","showSlowLoadingMessage","setShowSlowLoadingMessage","useState","theme","useTheme","useEffect","timeout","jsx","Stack","LoadingErrorMessage","jsxs","Fragment","CircularProgress","errorMessage","stack","lowerFirst","capitalize"],"mappings":";;;;;AAuBO,SAASA,EAAkBC,GAAUC,GAAoB;AAC9D,QAAM,IAAI,MAAMA,IAAM,IAAI,KAAK,UAAUD,CAAC,CAAC,EAAE;AAC/C;AAEO,SAASE,EAAiBC,GAAc;;AAC7C,SAAIA,aAAeC,KAAcD,EAAI,SAAS,gBACrC,4EACEA,aAAeC,KAAcD,EAAI,WACnC,IAAGE,IAAAF,EAAI,aAAJ,gBAAAE,EAAc,MAAM,KAAIC,IAAAH,EAAI,aAAJ,gBAAAG,EAAc,UAAU,UAASC,IAAAJ,EAAI,aAAJ,gBAAAI,EAAc,OAAO,GAAG,KAAK,KAAK,WAAUC,IAAAL,EAAI,aAAJ,gBAAAK,EAAc,IAAI,CAAC,KACzHL,aAAe,QACjBA,EAAI,UAEJ,qBAAqBM,EAAiBN,CAAG,KAAKA,CAAG;AAE5D;AChCO,MAAMO,IAAe,CAACC,MAIvB;AACJ,QAAMC,IAAcD,EAAM,eAAe,KAEnC,CAACE,GAAwBC,CAAyB,IAAIC,EAAS,EAAK,GACpEC,IAAQC,EAAA;AAEd,SAAAC,EAAU,MAAM;AACd,UAAMC,IAAU,WAAW,MAAM;AAC/B,MAAAL,EAA0B,EAAI;AAAA,IAChC,GAAGF,CAAW;AAEd,WAAO,MAAM,aAAaO,CAAO;AAAA,EACnC,CAAC,GAGCC,gBAAAA,EAAAA;AAAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,YAAW;AAAA,MACX,gBAAe;AAAA,MACf,IAAI,EAAE,OAAOL,EAAM,QAAQ,KAAK,QAAA;AAAA,MAE/B,YAAM,QACLI,gBAAAA,EAAAA;AAAAA,QAACE;AAAA,QAAA;AAAA,UACC,gBAAgBX,EAAM;AAAA,UACtB,OAAOA,EAAM;AAAA,QAAA;AAAA,MAAA,IAGfY,gBAAAA,EAAAA,KAAAC,YAAA,EACE,UAAA;AAAA,QAAAJ,gBAAAA,EAAAA,IAACK,GAAA,EAAiB,IAAI,EAAE,cAAc,UAAU;AAAA,QAC/C,CAAC,CAACd,EAAM,WAAWS,gBAAAA,EAAAA,IAAC,OAAA,EAAK,YAAM,SAAQ;AAAA,QACxCA,gBAAAA,EAAAA;AAAAA,UAACC;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,YAAYR,IAAyB,YAAY;AAAA,cACjD,WAAW;AAAA,cACX,OAAOG,EAAM,QAAQ,KAAK;AAAA,YAAA;AAAA,YAG3B,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACH,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAIR,GAEaM,IAAsB,CAACX,MAG9B;AACJ,QAAMe,IAAexB,EAAiBS,EAAM,KAAK,GAC3CgB,IAAQhB,EAAM,iBAAiB,QAAQA,EAAM,MAAM,QAAQ,MAC3DK,IAAQC,EAAA;AAEd,SACEM,gBAAAA,EAAAA;AAAAA,IAACF;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAOL,EAAM,QAAQ,MAAM;AAAA,QAC3B,SAAS;AAAA,UACP,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,eAAe;AAAA,QAAA;AAAA,MACjB;AAAA,MAGA,UAAA;AAAA,SAAAL,EAAM,iBACJ,eAAeiB,EAAWC,EAAWlB,EAAM,cAAc,CAAC,CAAC,QAC3D,MAAMe;AAAA,8BACT,MAAA,EAAG;AAAA,QACHC,KAASP,gBAAAA,EAAAA,IAAC,OAAA,EAAK,UAAAO,EAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG5B;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const t=require("./externalizeComponent-B98tgTPP.cjs"),o=require("@mui/material"),u=require("lodash-es"),a=require("react"),c=require("axios");function m(e,s){throw new Error(s+` ${JSON.stringify(e)}`)}function g(e){var s,r,n,i;return e instanceof c.AxiosError&&e.code==="ERR_NETWORK"?"Failed to connect to the server. Please check your internet connection.":e instanceof c.AxiosError&&e.response?`${(s=e.response)==null?void 0:s.status} ${(r=e.response)==null?void 0:r.statusText} from ${(n=e.response)==null?void 0:n.config.url}: ${JSON.stringify((i=e.response)==null?void 0:i.data)}`:e instanceof Error?e.message:`Unexpected error: ${t.tryStringifyJson(e)||e}`}const d=e=>{const s=e.softTimeout||3e3,[r,n]=a.useState(!1),i=o.useTheme();return a.useEffect(()=>{const l=setTimeout(()=>{n(!0)},s);return()=>clearTimeout(l)}),t.jsxRuntimeExports.jsx(o.Stack,{width:"100%",height:"100%",alignItems:"center",justifyContent:"center",sx:{color:i.palette.text.primary},children:e.error?t.jsxRuntimeExports.jsx(x,{loadingMessage:e.message,error:e.error}):t.jsxRuntimeExports.jsxs(t.jsxRuntimeExports.Fragment,{children:[t.jsxRuntimeExports.jsx(o.CircularProgress,{sx:{marginBottom:"24px"}}),!!e.message&&t.jsxRuntimeExports.jsx("div",{children:e.message}),t.jsxRuntimeExports.jsx(o.Stack,{sx:{visibility:r?"visible":"hidden",marginTop:"1rem",color:i.palette.text.secondary},children:"This is taking longer than expected..."})]})})},x=e=>{const s=g(e.error),r=e.error instanceof Error?e.error.stack:null,n=o.useTheme();return t.jsxRuntimeExports.jsxs(o.Stack,{sx:{maxHeight:"100%",maxWidth:"min(100%, 800px)",padding:2,overflow:"auto",color:n.palette.error.main,"& pre":{whiteSpace:"pre-wrap",wordBreak:"break-word",paddingBottom:"3rem"}},children:[(e.loadingMessage?`Error while ${u.lowerFirst(o.capitalize(e.loadingMessage))} - `:"")+s,t.jsxRuntimeExports.jsx("br",{}),r&&t.jsxRuntimeExports.jsx("pre",{children:r})]})};exports.LoadingCover=d;exports.LoadingErrorMessage=x;exports.assertUnreachable=m;
|
|
2
|
-
//# sourceMappingURL=LoadingCover-DXcsXWDy.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingCover-DXcsXWDy.cjs","sources":["../src/components/utils/errorHandling.ts","../src/components/LoadingCover.tsx"],"sourcesContent":["import { AxiosError } from \"axios\"\nimport { tryStringifyJson } from \"./converters\"\n\n// Please note: These helper functions also exist in nova.js\n// (with slightly different formatting), and will be unified\n// at some point in the future.\n\nexport function delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function makeShortErrorMessage(err: unknown) {\n if (err instanceof AxiosError && err.code === \"ERR_NETWORK\") {\n return \"Failed to connect to the server. Please check your internet connection.\"\n } else if (err instanceof AxiosError && err.response) {\n return `${err.response?.status} ${err.response?.statusText}: ${JSON.stringify(err.response?.data)}`\n } else if (err instanceof Error) {\n return err.message\n } else {\n return `Unexpected error: ${err}`\n }\n}\n\nexport function assertUnreachable(x: never, msg: string): never {\n throw new Error(msg + ` ${JSON.stringify(x)}`)\n}\n\nexport function makeErrorMessage(err: unknown) {\n if (err instanceof AxiosError && err.code === \"ERR_NETWORK\") {\n return \"Failed to connect to the server. Please check your internet connection.\"\n } else if (err instanceof AxiosError && err.response) {\n return `${err.response?.status} ${err.response?.statusText} from ${err.response?.config.url}: ${JSON.stringify(err.response?.data)}`\n } else if (err instanceof Error) {\n return err.message\n } else {\n return `Unexpected error: ${tryStringifyJson(err) || err}`\n }\n}\n","import { capitalize, CircularProgress, Stack, useTheme } from \"@mui/material\"\nimport { lowerFirst } from \"lodash-es\"\nimport { useEffect, useState } from \"react\"\nimport { makeErrorMessage } from \"./utils/errorHandling\"\n\nexport const LoadingCover = (props: {\n message?: string\n error?: unknown\n softTimeout?: number\n}) => {\n const softTimeout = props.softTimeout || 3000\n\n const [showSlowLoadingMessage, setShowSlowLoadingMessage] = useState(false)\n const theme = useTheme()\n\n useEffect(() => {\n const timeout = setTimeout(() => {\n setShowSlowLoadingMessage(true)\n }, softTimeout)\n\n return () => clearTimeout(timeout)\n })\n\n return (\n <Stack\n width=\"100%\"\n height=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n sx={{ color: theme.palette.text.primary }}\n >\n {props.error ? (\n <LoadingErrorMessage\n loadingMessage={props.message}\n error={props.error}\n />\n ) : (\n <>\n <CircularProgress sx={{ marginBottom: \"24px\" }} />\n {!!props.message && <div>{props.message}</div>}\n <Stack\n sx={{\n visibility: showSlowLoadingMessage ? \"visible\" : \"hidden\",\n marginTop: \"1rem\",\n color: theme.palette.text.secondary,\n }}\n >\n {\"This is taking longer than expected...\"}\n </Stack>\n </>\n )}\n </Stack>\n )\n}\n\nexport const LoadingErrorMessage = (props: {\n loadingMessage?: string\n error: unknown\n}) => {\n const errorMessage = makeErrorMessage(props.error)\n const stack = props.error instanceof Error ? props.error.stack : null\n const theme = useTheme()\n\n return (\n <Stack\n sx={{\n maxHeight: \"100%\",\n maxWidth: \"min(100%, 800px)\",\n padding: 2,\n overflow: \"auto\",\n color: theme.palette.error.main,\n \"& pre\": {\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n paddingBottom: \"3rem\",\n },\n }}\n >\n {(props.loadingMessage\n ? `Error while ${lowerFirst(capitalize(props.loadingMessage))} - `\n : \"\") + errorMessage}\n <br />\n {stack && <pre>{stack}</pre>}\n </Stack>\n )\n}\n"],"names":["assertUnreachable","x","msg","makeErrorMessage","err","AxiosError","_a","_b","_c","_d","tryStringifyJson","LoadingCover","props","softTimeout","showSlowLoadingMessage","setShowSlowLoadingMessage","useState","theme","useTheme","useEffect","timeout","jsx","Stack","LoadingErrorMessage","jsxs","Fragment","CircularProgress","errorMessage","stack","lowerFirst","capitalize"],"mappings":"4JAuBO,SAASA,EAAkBC,EAAUC,EAAoB,CAC9D,MAAM,IAAI,MAAMA,EAAM,IAAI,KAAK,UAAUD,CAAC,CAAC,EAAE,CAC/C,CAEO,SAASE,EAAiBC,EAAc,aAC7C,OAAIA,aAAeC,EAAAA,YAAcD,EAAI,OAAS,cACrC,0EACEA,aAAeC,cAAcD,EAAI,SACnC,IAAGE,EAAAF,EAAI,WAAJ,YAAAE,EAAc,MAAM,KAAIC,EAAAH,EAAI,WAAJ,YAAAG,EAAc,UAAU,UAASC,EAAAJ,EAAI,WAAJ,YAAAI,EAAc,OAAO,GAAG,KAAK,KAAK,WAAUC,EAAAL,EAAI,WAAJ,YAAAK,EAAc,IAAI,CAAC,GACzHL,aAAe,MACjBA,EAAI,QAEJ,qBAAqBM,EAAAA,iBAAiBN,CAAG,GAAKA,CAAG,EAE5D,CChCO,MAAMO,EAAgBC,GAIvB,CACJ,MAAMC,EAAcD,EAAM,aAAe,IAEnC,CAACE,EAAwBC,CAAyB,EAAIC,EAAAA,SAAS,EAAK,EACpEC,EAAQC,EAAAA,SAAA,EAEdC,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAU,WAAW,IAAM,CAC/BL,EAA0B,EAAI,CAChC,EAAGF,CAAW,EAEd,MAAO,IAAM,aAAaO,CAAO,CACnC,CAAC,EAGCC,EAAAA,kBAAAA,IAACC,EAAAA,MAAA,CACC,MAAM,OACN,OAAO,OACP,WAAW,SACX,eAAe,SACf,GAAI,CAAE,MAAOL,EAAM,QAAQ,KAAK,OAAA,EAE/B,WAAM,MACLI,EAAAA,kBAAAA,IAACE,EAAA,CACC,eAAgBX,EAAM,QACtB,MAAOA,EAAM,KAAA,CAAA,EAGfY,EAAAA,kBAAAA,KAAAC,6BAAA,CACE,SAAA,CAAAJ,EAAAA,kBAAAA,IAACK,EAAAA,iBAAA,CAAiB,GAAI,CAAE,aAAc,QAAU,EAC/C,CAAC,CAACd,EAAM,SAAWS,EAAAA,kBAAAA,IAAC,MAAA,CAAK,WAAM,QAAQ,EACxCA,EAAAA,kBAAAA,IAACC,EAAAA,MAAA,CACC,GAAI,CACF,WAAYR,EAAyB,UAAY,SACjD,UAAW,OACX,MAAOG,EAAM,QAAQ,KAAK,SAAA,EAG3B,SAAA,wCAAA,CAAA,CACH,CAAA,CACF,CAAA,CAAA,CAIR,EAEaM,EAAuBX,GAG9B,CACJ,MAAMe,EAAexB,EAAiBS,EAAM,KAAK,EAC3CgB,EAAQhB,EAAM,iBAAiB,MAAQA,EAAM,MAAM,MAAQ,KAC3DK,EAAQC,EAAAA,SAAA,EAEd,OACEM,EAAAA,kBAAAA,KAACF,EAAAA,MAAA,CACC,GAAI,CACF,UAAW,OACX,SAAU,mBACV,QAAS,EACT,SAAU,OACV,MAAOL,EAAM,QAAQ,MAAM,KAC3B,QAAS,CACP,WAAY,WACZ,UAAW,aACX,cAAe,MAAA,CACjB,EAGA,SAAA,EAAAL,EAAM,eACJ,eAAeiB,EAAAA,WAAWC,EAAAA,WAAWlB,EAAM,cAAc,CAAC,CAAC,MAC3D,IAAMe,0BACT,KAAA,EAAG,EACHC,GAASP,EAAAA,kBAAAA,IAAC,MAAA,CAAK,SAAAO,CAAA,CAAM,CAAA,CAAA,CAAA,CAG5B"}
|