shopar-plugin 0.9.3 → 0.9.4-alpha.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.
- package/README.md +2 -2
- package/dist/deepar/VERSION.txt +1 -1
- package/dist/deepar/js/deepar.esm.js +1 -1
- package/dist/deepar/js/deepar.js +1 -1
- package/dist/deepar/js/dynamicModules/xzimg.js +1 -1
- package/dist/deepar/js/dynamicModules/xzimg.js.LICENSE.txt +3 -69
- package/dist/deepar/js/types/DeepAR-shopar-minimal.d.ts +353 -0
- package/dist/deepar/js/types/DeepAR.d.ts +9 -7
- package/dist/deepar/js/types/callbacks.d.ts +2 -2
- package/dist/deepar/js/types/dracoDecoderUtil.d.ts +20 -0
- package/dist/deepar/js/types/dynamicImport.d.ts +8 -0
- package/dist/deepar/js/types/footData.d.ts +12 -0
- package/dist/deepar/js/types/{index.d.ts → index-shopar-minimal.d.ts} +1 -3
- package/dist/deepar/js/types/initParams.d.ts +0 -4
- package/dist/deepar/js/types/version.d.ts +1 -1
- package/dist/deepar/js/types/workers/draco-decoder/index.d.ts +1 -0
- package/dist/deepar/js/workers/draco-decoder.js +1 -0
- package/dist/deepar/models/foot/foot-detector-96x96x6-q8.bin +0 -0
- package/dist/deepar/package.json +2 -2
- package/dist/deepar/split_sum.webp +0 -0
- package/dist/deepar/wasm/deepar.wasm +0 -0
- package/dist/deepar/wasm/draco-decoder.wasm +0 -0
- package/dist/deepar/wasm/libxzimgPoseEstimation.wasm +0 -0
- package/dist/deepar/wasm/tfjs-backend-wasm-simd.wasm +0 -0
- package/dist/deepar/wasm/tfjs-backend-wasm-threaded-simd.wasm +0 -0
- package/dist/deepar/wasm/tfjs-backend-wasm.wasm +0 -0
- package/dist/shopar-analytics.js +1 -1
- package/dist/shopar-deepar.js +2 -2
- package/dist/shopar-plugin.esm.js +1 -1
- package/dist/shopar-plugin.js +1 -1
- package/package.json +1 -1
- package/dist/deepar/js/dynamicModules/mediaPipe.js +0 -1
- package/dist/deepar/models/foot/foot-detection-96x96x6.bin +0 -0
- package/dist/deepar/wasm/dyArcorePhysics.wasm +0 -0
- package/dist/deepar/wasm/dyArcoreScripting.wasm +0 -0
- package/dist/deepar/wasm/dyXzimgMagicFace.wasm +0 -0
|
@@ -1,18 +1,3 @@
|
|
|
1
|
-
/*! *****************************************************************************
|
|
2
|
-
Copyright (c) Microsoft Corporation.
|
|
3
|
-
|
|
4
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
5
|
-
purpose with or without fee is hereby granted.
|
|
6
|
-
|
|
7
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
8
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
9
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
10
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
11
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
12
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
13
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
14
|
-
***************************************************************************** */
|
|
15
|
-
|
|
16
1
|
/**
|
|
17
2
|
* @license
|
|
18
3
|
* Copyright 2017 Google LLC. All Rights Reserved.
|
|
@@ -82,23 +67,6 @@ PERFORMANCE OF THIS SOFTWARE.
|
|
|
82
67
|
* =============================================================================
|
|
83
68
|
*/
|
|
84
69
|
|
|
85
|
-
/**
|
|
86
|
-
* @license
|
|
87
|
-
* Copyright 2019 Google LLC. All Rights Reserved.
|
|
88
|
-
* Licensed under the Apache License, Version 2.0 (the 'License');
|
|
89
|
-
* you may not use this file except in compliance with the License.
|
|
90
|
-
* You may obtain a copy of the License at
|
|
91
|
-
*
|
|
92
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
93
|
-
*
|
|
94
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
95
|
-
* distributed under the License is distributed on an 'AS IS' BASIS,
|
|
96
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
97
|
-
* See the License for the specific language governing permissions and
|
|
98
|
-
* limitations under the License.
|
|
99
|
-
* =============================================================================
|
|
100
|
-
*/
|
|
101
|
-
|
|
102
70
|
/**
|
|
103
71
|
* @license
|
|
104
72
|
* Copyright 2020 Google Inc. All Rights Reserved.
|
|
@@ -133,23 +101,6 @@ PERFORMANCE OF THIS SOFTWARE.
|
|
|
133
101
|
* =============================================================================
|
|
134
102
|
*/
|
|
135
103
|
|
|
136
|
-
/**
|
|
137
|
-
* @license
|
|
138
|
-
* Copyright 2020 Google LLC. All Rights Reserved.
|
|
139
|
-
* Licensed under the Apache License, Version 2.0 (the License);
|
|
140
|
-
* you may not use this file except in compliance with the License.
|
|
141
|
-
* You may obtain a copy of the License at
|
|
142
|
-
*
|
|
143
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
144
|
-
*
|
|
145
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
146
|
-
* distributed under the License is distributed on an AS IS BASIS,
|
|
147
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
148
|
-
* See the License for the specific language governing permissions and
|
|
149
|
-
* limitations under the License.
|
|
150
|
-
* =============================================================================
|
|
151
|
-
*/
|
|
152
|
-
|
|
153
104
|
/**
|
|
154
105
|
* @license
|
|
155
106
|
* Copyright 2021 Google LLC. All Rights Reserved.
|
|
@@ -169,24 +120,7 @@ PERFORMANCE OF THIS SOFTWARE.
|
|
|
169
120
|
|
|
170
121
|
/**
|
|
171
122
|
* @license
|
|
172
|
-
* Copyright
|
|
173
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
174
|
-
* you may not use this file except in compliance with the License.
|
|
175
|
-
* You may obtain a copy of the License at
|
|
176
|
-
*
|
|
177
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
178
|
-
*
|
|
179
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
180
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
181
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
182
|
-
* See the License for the specific language governing permissions and
|
|
183
|
-
* limitations under the License.
|
|
184
|
-
* =============================================================================
|
|
185
|
-
*/
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* @license
|
|
189
|
-
* Copyright 2022 Google LLC. All Rights Reserved.
|
|
123
|
+
* Copyright 2023 Google LLC.
|
|
190
124
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
191
125
|
* you may not use this file except in compliance with the License.
|
|
192
126
|
* You may obtain a copy of the License at
|
|
@@ -203,7 +137,7 @@ PERFORMANCE OF THIS SOFTWARE.
|
|
|
203
137
|
|
|
204
138
|
/**
|
|
205
139
|
* @license
|
|
206
|
-
* Copyright 2023 Google LLC.
|
|
140
|
+
* Copyright 2023 Google LLC. All Rights Reserved.
|
|
207
141
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
208
142
|
* you may not use this file except in compliance with the License.
|
|
209
143
|
* You may obtain a copy of the License at
|
|
@@ -220,7 +154,7 @@ PERFORMANCE OF THIS SOFTWARE.
|
|
|
220
154
|
|
|
221
155
|
/**
|
|
222
156
|
* @license
|
|
223
|
-
* Copyright
|
|
157
|
+
* Copyright 2025 Google LLC. All Rights Reserved.
|
|
224
158
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
225
159
|
* you may not use this file except in compliance with the License.
|
|
226
160
|
* You may obtain a copy of the License at
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { DeepARCallbacks } from "./callbacks";
|
|
2
|
+
import { DeepARParams } from "./initParams";
|
|
3
|
+
import { DracoDecoderUtil } from "./dracoDecoderUtil";
|
|
4
|
+
export declare type ToneMapping = "Linear" | "Reinhard" | "Cineon" | "ACES" | "AGX" | "Neutral";
|
|
5
|
+
/**
|
|
6
|
+
* Initialize the DeepAR SDK.<br><br>
|
|
7
|
+
* @param params Initialization parameters.
|
|
8
|
+
* @example
|
|
9
|
+
* import * as deepar from 'deepar';
|
|
10
|
+
*
|
|
11
|
+
* let deepAR = deepar.initialize({
|
|
12
|
+
* licenseKey: 'your_license_key_here',
|
|
13
|
+
* canvas: document.getElementById('deepar-canvas')
|
|
14
|
+
* });
|
|
15
|
+
*/
|
|
16
|
+
export declare function initialize(params: DeepARParams): Promise<DeepAR>;
|
|
17
|
+
/**
|
|
18
|
+
* Main class for interacting with DeepAR SDK. To get a DeepAR object call {@link initialize}.
|
|
19
|
+
*/
|
|
20
|
+
export declare class DeepAR {
|
|
21
|
+
/**
|
|
22
|
+
* Emscripten module object. Contains all the exposed C/C++ API. Used for interacting with the native SDK.
|
|
23
|
+
* @private
|
|
24
|
+
*/
|
|
25
|
+
private module;
|
|
26
|
+
private dracoDecoder;
|
|
27
|
+
private isPaused;
|
|
28
|
+
/**
|
|
29
|
+
* Callbacks property is used to add/remove/change callbacks called by the DeepAR SDK. See list of all callbacks at {@link DeepARCallbacks}. <br><br>
|
|
30
|
+
* Example: To add/change certain callback:
|
|
31
|
+
* ```javascript
|
|
32
|
+
* let deepAR = deepar.initialize({...});
|
|
33
|
+
* deepAR.callbacks.onFaceVisibilityChanged = () => {
|
|
34
|
+
* // do something
|
|
35
|
+
* };
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* To remove certain callback:
|
|
39
|
+
* ```javascript
|
|
40
|
+
* deepAR.callbacks.onFaceTracked = undefined;
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
callbacks: DeepARCallbacks;
|
|
44
|
+
/**
|
|
45
|
+
* @internal
|
|
46
|
+
* @param module
|
|
47
|
+
* @param dracoDecoder
|
|
48
|
+
*/
|
|
49
|
+
constructor(module: any, dracoDecoder: DracoDecoderUtil);
|
|
50
|
+
/**
|
|
51
|
+
* Switch the AR effect for preview.
|
|
52
|
+
*
|
|
53
|
+
* @param effect A path (URL) to the AR effect file or an ArrayBuffer object of an already fetched AR effect file.
|
|
54
|
+
* @param effectOptions Effect options.
|
|
55
|
+
* @param effectOptions.slot Default value is "DEFAULT_SLOT" if slot is not given. Slot is a container for a given AR effect. When replacing the already loaded AR effect, call switchEffect with that same slot. To remove AR effect entirely, call {@link clearEffect} with the same slot.
|
|
56
|
+
* @param effectOptions.face If AR effect is face filter, select to which face to attach it to. The value should be between 0 and 3. Default value is 0.
|
|
57
|
+
*
|
|
58
|
+
* @throws {@link errors.SwitchEffectCanceled} If the switch effect is canceled by something.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* // Switch filter 1.
|
|
62
|
+
* await deepAR.switchEffect('url/path/to/filter1');
|
|
63
|
+
* // Later switch fo filter 2.
|
|
64
|
+
* await deepAR.switchEffect('url/path/to/filter2');
|
|
65
|
+
*
|
|
66
|
+
* // Remove the current filter.
|
|
67
|
+
* deepAR.clearEffect();
|
|
68
|
+
*
|
|
69
|
+
* // Put two filters at the same time.
|
|
70
|
+
* await deepAR.switchEffect('url/path/to/backgroundReplacement', {slot: 'background'});
|
|
71
|
+
* await deepAR.switchEffect('url/path/to/glasses', {slot: 'faceMask'});
|
|
72
|
+
* // Replace the glasses filter.
|
|
73
|
+
* await deepAR.switchEffect('url/path/to/glasses2', {slot: 'faceMask'});
|
|
74
|
+
* // Remove those filters.
|
|
75
|
+
* deepAR.clearEffect('background');
|
|
76
|
+
* deepAR.clearEffect('faceMask');
|
|
77
|
+
*
|
|
78
|
+
* // Load filters for two people.
|
|
79
|
+
* await deepAR.switchEffect('url/path/to/faceMask1', {face: 0, slot: 'mask1'});
|
|
80
|
+
* await deepAR.switchEffect('url/path/to/faceMask2', {face: 1, slot: 'mask2'});
|
|
81
|
+
* // Clear effect for the second person.
|
|
82
|
+
* deepAR.clearEffect('mask2');
|
|
83
|
+
*/
|
|
84
|
+
switchEffect(effect: string | ArrayBufferLike, effectOptions?: {
|
|
85
|
+
slot?: string;
|
|
86
|
+
face?: number;
|
|
87
|
+
envmap?: string | ArrayBufferLike;
|
|
88
|
+
diamondEnvMap?: string | ArrayBufferLike;
|
|
89
|
+
}): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Clears the given slot of any loaded effects.
|
|
92
|
+
* @param slot The effect slot name. Default is "DEFAULT_SLOT".
|
|
93
|
+
*/
|
|
94
|
+
clearEffect(slot?: string): void;
|
|
95
|
+
/**
|
|
96
|
+
* Starts the camera preview. By default, the camera will be user facing. The returned promise will resolve after the camera starts
|
|
97
|
+
* or it will reject if camera permission was denied.
|
|
98
|
+
* @param cameraOptions Camera options.
|
|
99
|
+
* @param cameraOptions.mirror Mirror the camera horizontally. True by default.
|
|
100
|
+
* @param cameraOptions.mediaStreamConstraints Options passed to MediaDevices.getUserMedia(). The default is the user facing camera.
|
|
101
|
+
* @param cameraOptions.cameraPermissionAsked Callback called when camera permission is asked.
|
|
102
|
+
* @param cameraOptions.cameraPermissionGranted Callback called when camera permission is granted.
|
|
103
|
+
*/
|
|
104
|
+
startCamera(cameraOptions?: {
|
|
105
|
+
mirror?: boolean;
|
|
106
|
+
mediaStreamConstraints?: MediaStreamConstraints;
|
|
107
|
+
cameraPermissionAsked?: () => void;
|
|
108
|
+
cameraPermissionGranted?: () => void;
|
|
109
|
+
}): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Stops the camera preview.
|
|
112
|
+
*/
|
|
113
|
+
stopCamera(): void;
|
|
114
|
+
/**
|
|
115
|
+
* Stops the camera preview or custom video preview set by {@link setVideoElement}.
|
|
116
|
+
*/
|
|
117
|
+
stopVideo(): void;
|
|
118
|
+
/**
|
|
119
|
+
* Used to pass the HTMLVideoElement to the DeepAR SDK. The SDK will use this video as camera source. This method should be used instead of {@link DeepAR.startCamera} when you want to handle getUserMedia outside the SDK or you need to apply the masks to any video stream.
|
|
120
|
+
* To disable automatic camera preview by DeepAR:
|
|
121
|
+
* ```js
|
|
122
|
+
* const deepAR = deepar.initialize({
|
|
123
|
+
* // ...
|
|
124
|
+
* additionalOptions: {
|
|
125
|
+
* cameraConfig: {
|
|
126
|
+
* disableDefaultCamera: true
|
|
127
|
+
* }
|
|
128
|
+
* }
|
|
129
|
+
* });
|
|
130
|
+
* ```
|
|
131
|
+
* @param videoElement Video element.
|
|
132
|
+
* @param mirror Mirror the video horizontally.
|
|
133
|
+
*/
|
|
134
|
+
setVideoElement(videoElement: HTMLVideoElement, mirror: boolean): void;
|
|
135
|
+
/**
|
|
136
|
+
* Change preview element.
|
|
137
|
+
*
|
|
138
|
+
* If DeepAR is initialized with previewElement then this method can be used to change the preview element.
|
|
139
|
+
*
|
|
140
|
+
* @param newPreviewElement The previewElement to change to.
|
|
141
|
+
*/
|
|
142
|
+
changePreviewElement(newPreviewElement: HTMLElement, pixelRatio?: number): void;
|
|
143
|
+
/**
|
|
144
|
+
* Shutdown the DeepAR SDK and release all resources associated with it. It is invalid to call any function from this {@link DeepAR} object after shutdown.
|
|
145
|
+
* After shutdown call, it is possible to call {@link initialize} again.
|
|
146
|
+
*/
|
|
147
|
+
shutdown(): void;
|
|
148
|
+
/**
|
|
149
|
+
* Feed RGBA image to DeepAR as input instead of camera or video. Used for processing single image. Can be used instead of {@link startCamera} or {@link setVideoElement}.
|
|
150
|
+
* Can be called in a loop.
|
|
151
|
+
* @param frame Image.
|
|
152
|
+
* @param width Width of the image.
|
|
153
|
+
* @param height Height of the image.
|
|
154
|
+
* @param mirror Mirror frame horizontally.
|
|
155
|
+
*/
|
|
156
|
+
processFrame(frame: Uint8Array, width: number, height: number, mirror: boolean): void;
|
|
157
|
+
/**
|
|
158
|
+
* If you want to apply DeepAR processing on a single image instead of a camera stream use this method. Can be used instead of {@link startCamera} or {@link DeepAR.setVideoElement}. See example usage <a href="https://github.com/DeepARSDK/photoedit-web-js">here</a>.
|
|
159
|
+
* @param image
|
|
160
|
+
*/
|
|
161
|
+
processImage(image: HTMLImageElement): void;
|
|
162
|
+
/**
|
|
163
|
+
* Pauses the DeepAR processing and rendering on canvas.
|
|
164
|
+
* @param isPause If true, DeepAR will pause. Otherwise, it will resume processing and rendering.
|
|
165
|
+
*/
|
|
166
|
+
setPaused(isPause: boolean): void;
|
|
167
|
+
/**
|
|
168
|
+
* Changes a node or component bool parameter of the currently loaded effect. For more details about changeParameter API read our docs <a href="https://docs.deepar.ai/deepar-sdk/tutorials/change-parameter">here</a>.
|
|
169
|
+
* @param gameObject The name of the node from DeepAR Studio. If multiple nodes share the same name, only the first one will be affected.
|
|
170
|
+
* @param component The name of the component. If the name of the component is null or an empty string, the node itself will be affected.
|
|
171
|
+
* @param parameter The name of the parameter.
|
|
172
|
+
* @param value New parameter value.
|
|
173
|
+
*/
|
|
174
|
+
changeParameterFloat(gameObject: string, component: string, parameter: string, value: number): void;
|
|
175
|
+
/**
|
|
176
|
+
* Changes a node or component float parameter of the currently loaded effect. For more details about changeParameter API read our docs <a href="https://docs.deepar.ai/deepar-sdk/tutorials/change-parameter">here</a>.
|
|
177
|
+
* @param gameObject The name of the node from DeepAR Studio. If multiple nodes share the same name, only the first one will be affected.
|
|
178
|
+
* @param component The name of the component. If the name of the component is null or an empty string, the node itself will be affected.
|
|
179
|
+
* @param parameter The name of the parameter.
|
|
180
|
+
* @param value New parameter value.
|
|
181
|
+
*/
|
|
182
|
+
changeParameterBool(gameObject: string, component: string, parameter: string, value: boolean): void;
|
|
183
|
+
/**
|
|
184
|
+
* Changes a node or component vector parameter of the currently loaded effect. For more details about changeParameter API read our docs <a href="https://docs.deepar.ai/deepar-sdk/tutorials/change-parameter">here</a>.
|
|
185
|
+
* @param gameObject The name of the node from DeepAR Studio. If multiple nodes share the same name, only the first one will be affected.
|
|
186
|
+
* @param component The name of the component. If the name of the component is null or an empty string, the node itself will be affected.
|
|
187
|
+
* @param parameter The name of the parameter.
|
|
188
|
+
* @param x X component of the new parameter vector.
|
|
189
|
+
* @param y Y component of the new parameter vector.
|
|
190
|
+
* @param z Z component of the new parameter vector.
|
|
191
|
+
* @param w W component of the new parameter vector.
|
|
192
|
+
*/
|
|
193
|
+
changeParameterVector(gameObject: string, component: string, parameter: string, x: number, y: number, z: number, w: number): void;
|
|
194
|
+
/**
|
|
195
|
+
* Changes a node or component texture parameter of the currently loaded effect. For more details about changeParameter API read our docs <a href="https://docs.deepar.ai/deepar-sdk/tutorials/change-parameter">here</a>.
|
|
196
|
+
* @param gameObject The name of the node from DeepAR Studio. If multiple nodes share the same name, only the first one will be affected.
|
|
197
|
+
* @param component The name of the component. If the name of the component is null or an empty string, the node itself will be affected.
|
|
198
|
+
* @param parameter The name of the parameter.
|
|
199
|
+
* @param textureUrl Url of the image that is going to be used as texture.
|
|
200
|
+
* @param mode - Request mode used while fetching the texture.
|
|
201
|
+
*/
|
|
202
|
+
changeParameterTexture(gameObject: string, component: string, parameter: string, textureUrl: string, mode?: RequestMode): Promise<void>;
|
|
203
|
+
/**
|
|
204
|
+
* Retrieves the HTML canvas element used for AR preview.
|
|
205
|
+
*
|
|
206
|
+
* The returned canvas is used for DeepAR rendering of camera preview and AR filters.
|
|
207
|
+
* Most commonly canvas is needed when you want to do some postprocessing on it or feed it
|
|
208
|
+
* into some video calling library.
|
|
209
|
+
*
|
|
210
|
+
* @return {HTMLCanvasElement} The HTML canvas element.
|
|
211
|
+
*/
|
|
212
|
+
getCanvas(): HTMLCanvasElement;
|
|
213
|
+
/**
|
|
214
|
+
* Set the FPS of DeepAR rendering.
|
|
215
|
+
* @param fps New FPS.
|
|
216
|
+
*/
|
|
217
|
+
setFps(fps: number): void;
|
|
218
|
+
/**
|
|
219
|
+
* Moves the selected game object from its current position in a tree and sets it as a direct child of a target game object.
|
|
220
|
+
* This is equivalent to moving around a node in the node hierarchy in the DeepAR Studio.
|
|
221
|
+
* @param selectedGameObject Node to move.
|
|
222
|
+
* @param targetGameObject New node parent.
|
|
223
|
+
*/
|
|
224
|
+
moveGameObject(selectedGameObject: string, targetGameObject: string): void;
|
|
225
|
+
setFov(useDefaultFov: boolean, fov?: number): void;
|
|
226
|
+
/**
|
|
227
|
+
* Set read pixels async or sync. Default is async.
|
|
228
|
+
*
|
|
229
|
+
* @param readAsyncPixels True - async, false - sync.
|
|
230
|
+
*/
|
|
231
|
+
setReadPixelsAsync(readAsyncPixels: boolean): void;
|
|
232
|
+
/**
|
|
233
|
+
* Sets a new environment map
|
|
234
|
+
*
|
|
235
|
+
* Sets a new environment map that will be used for rendering materials with new PBR glTF shader.
|
|
236
|
+
* If an effect file using the new PBR glTF shader is currently active, function changes the environment map to the one provided.
|
|
237
|
+
* Otherwise, it is going to override the one passed in with the effect file.
|
|
238
|
+
*
|
|
239
|
+
* @param envmap Path to fetch or ArrayBuffer with an image.
|
|
240
|
+
*/
|
|
241
|
+
setEnvironmentMap(envmap: string | ArrayBuffer): Promise<void>;
|
|
242
|
+
/**
|
|
243
|
+
* Resets environment map
|
|
244
|
+
*
|
|
245
|
+
* Resets the environment map to the default one.
|
|
246
|
+
* If an effect file using the new PBR glTF shader is currently active, function changes the environment map to the default one.
|
|
247
|
+
*/
|
|
248
|
+
resetEnvironmentMap(): void;
|
|
249
|
+
/**
|
|
250
|
+
* Sets tone mapping exposure
|
|
251
|
+
*
|
|
252
|
+
* Sets tone mapping exposure. Value passed here will override value specified within an effect file.
|
|
253
|
+
* @param exposure exposure value
|
|
254
|
+
*/
|
|
255
|
+
setExposure(exposure: number): void;
|
|
256
|
+
/**
|
|
257
|
+
* Gets tone mapping exposure
|
|
258
|
+
* @returns currently active tone mapping exposure or undefined otherwise.
|
|
259
|
+
*/
|
|
260
|
+
getExposure(): number | undefined;
|
|
261
|
+
/**
|
|
262
|
+
* Resets tone mapping exposure
|
|
263
|
+
*
|
|
264
|
+
* Resets tone mapping exposure to the one that was specified within an effect file.
|
|
265
|
+
*/
|
|
266
|
+
resetExposure(): void;
|
|
267
|
+
/**
|
|
268
|
+
* Sets environment map intensity
|
|
269
|
+
*
|
|
270
|
+
* Sets environment map intensity. Value passed here will override value specified within an effect file.
|
|
271
|
+
*
|
|
272
|
+
* @param environmentMapIntensity environment map intensity
|
|
273
|
+
*/
|
|
274
|
+
setEnvironmentMapIntensity(environmentMapIntensity: number): void;
|
|
275
|
+
/**
|
|
276
|
+
* Gets environment map intensity
|
|
277
|
+
* @returns current environment map intensity or undefined otherwise.
|
|
278
|
+
*/
|
|
279
|
+
getEnvironmentMapIntensity(): number | undefined;
|
|
280
|
+
/**
|
|
281
|
+
* Resets environment map intensity
|
|
282
|
+
*
|
|
283
|
+
* Resets environment map intensity to the one that was specified within an effect file.
|
|
284
|
+
*/
|
|
285
|
+
resetEnvironmentMapIntensity(): void;
|
|
286
|
+
/**
|
|
287
|
+
* Sets tone mapping
|
|
288
|
+
*
|
|
289
|
+
* Sets tone mapping. Value passed here will override value specified within an effect file.
|
|
290
|
+
* See here for more details about tone mapping functions: https://modelviewer.dev/examples/tone-mapping
|
|
291
|
+
* @param toneMapping tone mapping function
|
|
292
|
+
*/
|
|
293
|
+
setToneMapping(toneMapping: ToneMapping): void;
|
|
294
|
+
/**
|
|
295
|
+
* Gets currently active tone mapping function.
|
|
296
|
+
* @returns currently active tone mapping or undefined otherwise.
|
|
297
|
+
*/
|
|
298
|
+
getToneMapping(): ToneMapping | undefined;
|
|
299
|
+
/**
|
|
300
|
+
* Resets tone mapping
|
|
301
|
+
*
|
|
302
|
+
* Resets tone mapping to the one that was specified within an effect file.
|
|
303
|
+
*/
|
|
304
|
+
resetToneMapping(): void;
|
|
305
|
+
/**
|
|
306
|
+
* Toggles bloom postprocessing.
|
|
307
|
+
*/
|
|
308
|
+
setBloomEnabled(enabled: boolean): void;
|
|
309
|
+
/**
|
|
310
|
+
* Sets bloom threshold parameter.
|
|
311
|
+
*
|
|
312
|
+
* Value passed here overrides the one specified within an effect file.
|
|
313
|
+
* @param threshold bloom threshold
|
|
314
|
+
*/
|
|
315
|
+
setBloomThreshold(threshold: number): void;
|
|
316
|
+
/**
|
|
317
|
+
* Sets bloom strength parameter.
|
|
318
|
+
*
|
|
319
|
+
* Value passed here overrides the one specified within an effect file.
|
|
320
|
+
* @param strength bloom strength
|
|
321
|
+
*/
|
|
322
|
+
setBloomStrength(strength: number): void;
|
|
323
|
+
/**
|
|
324
|
+
* Sets bloom radius parameter.
|
|
325
|
+
*
|
|
326
|
+
* Value passed here overrides the one specified within an effect file.
|
|
327
|
+
* @param radius bloom radius
|
|
328
|
+
*/
|
|
329
|
+
setBloomRadius(radius: number): void;
|
|
330
|
+
/**
|
|
331
|
+
* Sets new environment map that will be used for rendering materials with diamond shader.
|
|
332
|
+
*
|
|
333
|
+
* Overrides environment map specified within an effect file.
|
|
334
|
+
* @param envmap Path to fetch or ArrayBuffer with an image.
|
|
335
|
+
*/
|
|
336
|
+
setDiamondEnvironmentMap(envmap: string | ArrayBuffer): Promise<void>;
|
|
337
|
+
/**
|
|
338
|
+
* Gets the closest point on a mesh to a given point.
|
|
339
|
+
*
|
|
340
|
+
* @param meshParentNodeName The name of the parent node of the mesh.
|
|
341
|
+
* @param point The point in the same space as a mesh.
|
|
342
|
+
* @returns closest point on the mesh to the given point.
|
|
343
|
+
*/
|
|
344
|
+
getClosestPointOnMesh(meshParentNodeName: string, point: Float32Array): Float32Array;
|
|
345
|
+
/**
|
|
346
|
+
* Gets the transformation between two nodes.
|
|
347
|
+
*
|
|
348
|
+
* @param srcNodeName source node.
|
|
349
|
+
* @param dstNodeName destination node.
|
|
350
|
+
* @returns Matrix that describes the transformation from srcNode to dstNode.
|
|
351
|
+
*/
|
|
352
|
+
getTransformationBetween(srcNodeName: string, dstNodeName: string): Float32Array;
|
|
353
|
+
}
|
|
@@ -4,8 +4,8 @@ import { DeepARCallbacks } from "./callbacks";
|
|
|
4
4
|
import { DeepARParams } from "./initParams";
|
|
5
5
|
import { LogType } from "./logType";
|
|
6
6
|
import { ScriptingAPI } from "./scriptingApi";
|
|
7
|
-
import
|
|
8
|
-
import
|
|
7
|
+
import { FootData } from "./footData";
|
|
8
|
+
import { DynamicDeps } from "./dynamicImport";
|
|
9
9
|
export declare type ToneMapping = "Linear" | "Reinhard" | "Cineon" | "ACES" | "AGX" | "Neutral";
|
|
10
10
|
declare global {
|
|
11
11
|
interface Window extends DynamicDeps {
|
|
@@ -15,10 +15,6 @@ declare global {
|
|
|
15
15
|
require?: (modules: string[], onLoad: (mod: unknown) => void, onError: () => void) => void;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
-
interface DynamicDeps {
|
|
19
|
-
__deeparDynamicJsModule_xzimg__: typeof xzimg;
|
|
20
|
-
__deeparDynamicJsModule_mediaPipe__: typeof mediaPipe;
|
|
21
|
-
}
|
|
22
18
|
/**
|
|
23
19
|
* Initialize the DeepAR SDK.<br><br>
|
|
24
20
|
* @param params Initialization parameters.
|
|
@@ -549,5 +545,11 @@ export declare class DeepAR {
|
|
|
549
545
|
* @param rotation
|
|
550
546
|
*/
|
|
551
547
|
setVideoRotation(rotation: number): void;
|
|
548
|
+
setSubsampleVisionImage(subsample: boolean): void;
|
|
549
|
+
useExternalTrackingData(use: boolean): void;
|
|
550
|
+
setExternalTrackingDataFoot(left: FootData, right: FootData): void;
|
|
551
|
+
getFootData(): {
|
|
552
|
+
left: FootData;
|
|
553
|
+
right: FootData;
|
|
554
|
+
} | null;
|
|
552
555
|
}
|
|
553
|
-
export {};
|
|
@@ -39,7 +39,7 @@ export interface DeepARCallbacks {
|
|
|
39
39
|
* Because this callback is called only once. So if you set this callback after the foot tracking is initialized, it will not be called again.
|
|
40
40
|
* @internal
|
|
41
41
|
*/
|
|
42
|
-
onFootTrackingInitialized?: () => void;
|
|
42
|
+
onFootTrackingInitialized?: (fovY: number, filteringDelay: number, width: number, height: number) => void;
|
|
43
43
|
/**
|
|
44
44
|
* Called when segmentation is fully initialized.
|
|
45
45
|
* Be sure to check {@link DeepAR.isSegmentationInitialized} before setting this callback.
|
|
@@ -52,7 +52,7 @@ export interface DeepARCallbacks {
|
|
|
52
52
|
* Because this callback is called only once. So if you set this callback after the wrist tracking is initialized, it will not be called again.
|
|
53
53
|
* @internal
|
|
54
54
|
*/
|
|
55
|
-
onWristTrackingInitialized?: () => void;
|
|
55
|
+
onWristTrackingInitialized?: (fovY: number, filteringDelay: number, width: number, height: number) => void;
|
|
56
56
|
/**
|
|
57
57
|
* Called when the animation player transitions to a new state.
|
|
58
58
|
* @param newState Name of the new state that is being transitioned to.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface DracoDecoderPaths {
|
|
2
|
+
js: string;
|
|
3
|
+
wasm: string;
|
|
4
|
+
}
|
|
5
|
+
export interface DracoDecoderQueueItem {
|
|
6
|
+
data: ArrayBuffer;
|
|
7
|
+
preserveVertexOrder: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface DracoDecoderResult {
|
|
10
|
+
data: ArrayBuffer;
|
|
11
|
+
vertexCount: number;
|
|
12
|
+
trianglesCount: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class DracoDecoderUtil {
|
|
15
|
+
private decoders;
|
|
16
|
+
private readonly maxDecoders;
|
|
17
|
+
constructor(paths: DracoDecoderPaths);
|
|
18
|
+
decode(item: DracoDecoderQueueItem): Promise<DracoDecoderResult>;
|
|
19
|
+
dispose(): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type * as xzimg from "./dynamicModules/xzimg";
|
|
2
|
+
import type * as mediaPipe from "./dynamicModules/mediaPipe";
|
|
3
|
+
export interface DynamicDeps {
|
|
4
|
+
__deeparDynamicJsModule_xzimg__: typeof xzimg;
|
|
5
|
+
__deeparDynamicJsModule_mediaPipe__: typeof mediaPipe;
|
|
6
|
+
}
|
|
7
|
+
export declare const dynamicImportXzimg: (path: string) => Promise<typeof xzimg>;
|
|
8
|
+
export declare const dynamicImportMediaPipe: (path: string) => Promise<typeof mediaPipe>;
|
|
@@ -7,4 +7,16 @@ export interface FootData {
|
|
|
7
7
|
* True if the foot is detected, false otherwise.
|
|
8
8
|
*/
|
|
9
9
|
detected: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Array of 3 floats containing (x, y, z) scale of the foot in 3D space.
|
|
12
|
+
*/
|
|
13
|
+
scale: number[];
|
|
14
|
+
/**
|
|
15
|
+
* Array of 4 floats containing quat rotation of the foot in 3D space.
|
|
16
|
+
*/
|
|
17
|
+
rotation: number[];
|
|
18
|
+
/**
|
|
19
|
+
* Array of 3 floats containing (x, y, z) position of the foot in 3D space.
|
|
20
|
+
*/
|
|
21
|
+
position: number[];
|
|
10
22
|
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
export * from './version';
|
|
2
|
-
export * from './DeepAR';
|
|
2
|
+
export * from './DeepAR-shopar-minimal';
|
|
3
3
|
export * from './initParams';
|
|
4
4
|
export * from './callbacks';
|
|
5
5
|
export * from './faceData';
|
|
6
6
|
export * from './footData';
|
|
7
7
|
export * from './wristData';
|
|
8
|
-
export * from './scriptingApi';
|
|
9
8
|
export * as errors from './errors';
|
|
10
|
-
export * from './touchType';
|
|
@@ -127,10 +127,6 @@ export interface DeepARParams {
|
|
|
127
127
|
* Path to the tracker model, e.g. "/path/to/deepar/models/face-cnn/face-track-19-v2.bin".
|
|
128
128
|
*/
|
|
129
129
|
trackerPath?: string;
|
|
130
|
-
/**
|
|
131
|
-
* Path to the face model object file, e.g. "/path/to/deepar/models/face/face-rigid.obj".
|
|
132
|
-
*/
|
|
133
|
-
objPath?: string;
|
|
134
130
|
/**
|
|
135
131
|
* Path to tfjs-backend-wasm.wasm file, e.g. "path/to/deepar/wasm/tfjs-backend-wasm.wasm"
|
|
136
132
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{"use strict";var e;const t=(e="undefined"!=typeof document?document.currentScript?.src:void 0,function(t={}){var r,n,o,a,i=t,s=new Promise(((e,t)=>{r=e,n=t})),c=Object.assign({},i),f="";f=self.location.href,e&&(f=e),f=f.startsWith("blob:")?"":f.substr(0,f.replace(/[?#].*/,"").lastIndexOf("/")+1),a=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)},o=e=>fetch(e,{credentials:"same-origin"}).then((e=>e.ok?e.arrayBuffer():Promise.reject(Error(e.status+" : "+e.url))));var u,d=i.print||console.log.bind(console),l=i.printErr||console.error.bind(console);Object.assign(i,c),c=null,i.wasmBinary&&(u=i.wasmBinary);var h,m,p,v,y=!1;function b(){var e=h.buffer;i.HEAP8=m=new Int8Array(e),i.HEAP16=new Int16Array(e),i.HEAPU8=p=new Uint8Array(e),i.HEAPU16=new Uint16Array(e),i.HEAP32=new Int32Array(e),i.HEAPU32=v=new Uint32Array(e),i.HEAPF32=new Float32Array(e),i.HEAPF64=new Float64Array(e)}var w=[],g=[],A=[],R=!1;function I(){var e=i.preRun.shift();w.unshift(e)}var P=0,U=null,E=null;function _(e){throw i.onAbort?.(e),l(e="Aborted("+e+")"),y=!0,e+=". Build with -sASSERTIONS for more info.",R&&M(),e=new WebAssembly.RuntimeError(e),n(e),e}var D,S=e=>e.startsWith("data:application/octet-stream;base64,");function C(e){if(e==D&&u)return new Uint8Array(u);if(a)return a(e);throw"both async and sync fetching of the wasm failed"}function H(e,t,r){return function(e){return u?Promise.resolve().then((()=>C(e))):o(e).then((e=>new Uint8Array(e)),(()=>C(e)))}(e).then((e=>WebAssembly.instantiate(e,t))).then(r,(e=>{l(`failed to asynchronously prepare wasm: ${e}`),_(e)}))}var k=e=>{for(;0<e.length;)e.shift()(i)},j=[null,[],[]],F="undefined"!=typeof TextDecoder?new TextDecoder:void 0,W=(e,t)=>{for(var r=t+NaN,n=t;e[n]&&!(n>=r);)++n;if(16<n-t&&e.buffer&&F)return F.decode(e.subarray(t,n));for(r="";t<n;){var o=e[t++];if(128&o){var a=63&e[t++];if(192==(224&o))r+=String.fromCharCode((31&o)<<6|a);else{var i=63&e[t++];65536>(o=224==(240&o)?(15&o)<<12|a<<6|i:(7&o)<<18|a<<12|i<<6|63&e[t++])?r+=String.fromCharCode(o):(o-=65536,r+=String.fromCharCode(55296|o>>10,56320|1023&o))}}else r+=String.fromCharCode(o)}return r},x={c:()=>{_("")},d:e=>{var t=p.length;if(2147483648<(e>>>=0))return!1;for(var r=1;4>=r;r*=2){var n=t*(1+.2/r);n=Math.min(n,e+100663296);var o=Math;n=Math.max(e,n);e:{o=(o.min.call(o,2147483648,n+(65536-n%65536)%65536)-h.buffer.byteLength+65535)/65536;try{h.grow(o),b();var a=1;break e}catch(e){}a=void 0}if(a)return!0}return!1},e:()=>52,b:function(){return 70},a:(e,t,r,n)=>{for(var o=0,a=0;a<r;a++){var i=v[t>>2],s=v[t+4>>2];t+=8;for(var c=0;c<s;c++){var f=p[i+c],u=j[e];0===f||10===f?((1===e?d:l)(W(u,0)),u.length=0):u.push(f)}o+=s}return v[n>>2]=o,0}},B=function(){function e(e){return B=e.exports,h=B.f,b(),g.unshift(B.g),P--,i.monitorRunDependencies?.(P),0==P&&(null!==U&&(clearInterval(U),U=null),E&&(e=E,E=null,e())),B}var t={a:x};if(P++,i.monitorRunDependencies?.(P),i.instantiateWasm)try{return i.instantiateWasm(t,e)}catch(e){l(`Module.instantiateWasm callback failed with error: ${e}`),n(e)}return D||=S("draco-decoder.wasm")?"draco-decoder.wasm":i.locateFile?i.locateFile("draco-decoder.wasm",f):f+"draco-decoder.wasm",function(e,t){var r=D;return u||"function"!=typeof WebAssembly.instantiateStreaming||S(r)||"function"!=typeof fetch?H(r,e,t):fetch(r,{credentials:"same-origin"}).then((n=>WebAssembly.instantiateStreaming(n,e).then(t,(function(n){return l(`wasm streaming compile failed: ${n}`),l("falling back to ArrayBuffer instantiation"),H(r,e,t)}))))}(t,(function(t){e(t.instance)})).catch(n),{}}();i._malloc=e=>(i._malloc=B.h)(e),i._dracoDecode=(e,t,r)=>(i._dracoDecode=B.i)(e,t,r),i._getDecodedDataPtr=()=>(i._getDecodedDataPtr=B.k)(),i._free=e=>(i._free=B.l)(e);var L,M=()=>(M=B.m)(),O=e=>(O=B.n)(e),T=e=>(T=B.o)(e),N=()=>(N=B.p)();function $(){function e(){if(!L&&(L=!0,i.calledRun=!0,!y)){if(R=!0,k(g),r(i),i.onRuntimeInitialized?.(),i.postRun)for("function"==typeof i.postRun&&(i.postRun=[i.postRun]);i.postRun.length;){var e=i.postRun.shift();A.unshift(e)}k(A)}}if(!(0<P)){if(i.preRun)for("function"==typeof i.preRun&&(i.preRun=[i.preRun]);i.preRun.length;)I();k(w),0<P||(i.setStatus?(i.setStatus("Running..."),setTimeout((function(){setTimeout((function(){i.setStatus("")}),1),e()}),1)):e())}}if(i.cwrap=(e,t,r,n)=>{var o=!r||r.every((e=>"number"===e||"boolean"===e));return"string"!==t&&o&&!n?i["_"+e]:(...n)=>((e,t,r,n)=>{var o={string:e=>{var t=0;if(null!=e&&0!==e){for(var r=t=0;r<e.length;++r){var n=e.charCodeAt(r);127>=n?t++:2047>=n?t+=2:55296<=n&&57343>=n?(t+=4,++r):t+=3}var o=t+1;if(r=t=T(o),n=p,0<o){o=r+o-1;for(var a=0;a<e.length;++a){var i=e.charCodeAt(a);if(55296<=i&&57343>=i&&(i=65536+((1023&i)<<10)|1023&e.charCodeAt(++a)),127>=i){if(r>=o)break;n[r++]=i}else{if(2047>=i){if(r+1>=o)break;n[r++]=192|i>>6}else{if(65535>=i){if(r+2>=o)break;n[r++]=224|i>>12}else{if(r+3>=o)break;n[r++]=240|i>>18,n[r++]=128|i>>12&63}n[r++]=128|i>>6&63}n[r++]=128|63&i}}n[r]=0}}return t},array:e=>{var t=T(e.length);return m.set(e,t),t}};e=i["_"+e];var a,s=[],c=0;if(n)for(var f=0;f<n.length;f++){var u=o[r[f]];u?(0===c&&(c=N()),s[f]=u(n[f])):s[f]=n[f]}return a=r=e(...s),0!==c&&O(c),"string"===t?a?W(p,a):"":"boolean"===t?!!a:a})(e,t,r,n)},E=function e(){L||$(),L||(E=e)},i.preInit)for("function"==typeof i.preInit&&(i.preInit=[i.preInit]);0<i.preInit.length;)i.preInit.pop()();return $(),s});let r=null;self.onmessage=e=>{const o=e.data;if("init"===o.type){const o=e.data,a=URL.createObjectURL(new Blob([o.wasmBuffer],{type:"application/wasm"}));(function(e){return o=this,a=void 0,s=function*(){const o=yield t({locateFile:(t,r)=>e});r=new n(o)},new((i=void 0)||(i=Promise))((function(e,t){function r(e){try{c(s.next(e))}catch(e){t(e)}}function n(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(r,n)}c((s=s.apply(o,a||[])).next())}));var o,a,i,s})(a).then((()=>{URL.revokeObjectURL(a),postMessage({type:"ready"})}))}else if("decode"===o.type){const t=e.data;if(!r)return void console.error("Draco decoder not initialized!");const n=t.data;try{const e=r.decode(n,t.preserveVertexOrder).buffer;postMessage({type:"decoded",data:e,jobId:t.jobId},void 0,[e])}catch(e){console.error("Failed to decode draco mesh"),postMessage({type:"decoded",data:new ArrayBuffer(0),jobId:t.jobId})}}};class n{constructor(e){this.module=e}decode(e,t){const r=this.module._malloc(e.byteLength);this.module.HEAPU8.set(new Uint8Array(e),r);const n=this.module._dracoDecode(r,e.byteLength,t);if(this.module._free(r),0===n)throw new Error("Failed to decode draco mesh");const o=new Uint8Array(n),a=this.module._getDecodedDataPtr();return o.set(this.module.HEAPU8.subarray(a,a+n)),this.module._free(a),o}}})();
|
|
Binary file
|
package/dist/deepar/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "deepar",
|
|
3
|
-
"version": "5.6.
|
|
3
|
+
"version": "5.6.21-shopar-alpha-374",
|
|
4
4
|
"description": "The official DeepAR Web SDK",
|
|
5
5
|
"main": "js/deepar.esm.js",
|
|
6
6
|
"jsdelivr": "js/deepar.js",
|
|
7
|
-
"typings": "js/types/index.d.ts",
|
|
7
|
+
"typings": "js/types/index-shopar-minimal.d.ts",
|
|
8
8
|
"keywords": [
|
|
9
9
|
"deepar",
|
|
10
10
|
"web",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|