dcl-npc-toolkit 1.0.6-20230515144908.commit-f43b9c1 → 1.0.7-20230516200558.commit-a07eb6f

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.
@@ -0,0 +1,10 @@
1
+ import { Entity } from '@dcl/sdk/ecs';
2
+ import { Dialog } from './types';
3
+ export declare let bubblesTexture: string;
4
+ export declare let bubbles: Map<Entity, any>;
5
+ export declare function createDialogBubble(npc: Entity, height?: number, sound?: string): void;
6
+ export declare function openBubble(npc: Entity, dialog: Dialog[], start?: number): void;
7
+ export declare function closeBubble(npc: Entity): void;
8
+ export declare function closeBubbleEndAll(npc: Entity): void;
9
+ export declare function next(npc: Entity): void;
10
+ export declare function getBubbleTextLength(text: string): 40 | undefined;
package/dist/bubble.js ADDED
@@ -0,0 +1,367 @@
1
+ import { AudioSource, Billboard, engine, Material, MeshRenderer, TextShape, Transform, VisibilityComponent } from '@dcl/sdk/ecs';
2
+ import { Color4, Vector3 } from '@dcl/sdk/math';
3
+ import { addLineBreaks } from './dialog';
4
+ import { IsTypingBubble } from './components';
5
+ export let bubblesTexture = 'https://decentraland.org/images/ui/dialog-bubbles.png';
6
+ export let bubbles = new Map();
7
+ let textSize = 1;
8
+ let textYPos = 0;
9
+ let maxLengthShortBubble = 8;
10
+ let maxLengthNormalBubble = 25;
11
+ let maxLengthLongBubble = 50;
12
+ let maxLengthHugeBubble = 100;
13
+ let shortBubbleXOffset = 0.1;
14
+ let normalBubbleXOffset = 0.5;
15
+ let longBubbleXOffset = 0.8;
16
+ let hugeBubbleXOffset = 0.8;
17
+ let shortBubbleYOffset = -0.2;
18
+ let normalBubbleYOffset = -0.2;
19
+ let longBubbleYOffset = 0;
20
+ let hugeBubbleYOffset = 0.2;
21
+ let shortBubbleTextWidth = 0.7;
22
+ let normalBubbleTextWidth = 1.5;
23
+ let longBubbleTextWidth = 2;
24
+ let hugeBubbleTextWidth = 1.5;
25
+ let shortBubbleX = 116 * 0.005;
26
+ let shortBubbleY = 84 * 0.005;
27
+ let normalBubbleX = 286 * 0.005;
28
+ let normalBubbleY = 84 * 0.005;
29
+ let longBubbleX = 497 * 0.005;
30
+ let longBubbleY = 153 * 0.005;
31
+ let hugeBubbleX = 497 * 0.005;
32
+ let hugeBubbleY = 239 * 0.005;
33
+ let defaultYOffset = 2.5;
34
+ export function createDialogBubble(npc, height, sound) {
35
+ let baseYOffset = height ? height : defaultYOffset;
36
+ let root = engine.addEntity();
37
+ Billboard.create(root, {
38
+ billboardMode: 2
39
+ });
40
+ Transform.create(root, {
41
+ parent: npc
42
+ });
43
+ let container = engine.addEntity();
44
+ Transform.create(container, {
45
+ parent: root,
46
+ position: Vector3.create(shortBubbleXOffset, baseYOffset, 0)
47
+ });
48
+ let panel = engine.addEntity();
49
+ Transform.create(panel, {
50
+ parent: container,
51
+ scale: Vector3.create(2, 1, 1),
52
+ });
53
+ MeshRenderer.setPlane(panel, setUVSection(bubbleOptions.normal, 1024, 1024));
54
+ VisibilityComponent.create(panel, { visible: false });
55
+ Material.setBasicMaterial(panel, {
56
+ texture: Material.Texture.Common({
57
+ src: bubblesTexture
58
+ })
59
+ });
60
+ let text = engine.addEntity();
61
+ Transform.create(text, {
62
+ position: Vector3.create(0, textYPos, -.05),
63
+ parent: container
64
+ });
65
+ TextShape.create(text, {
66
+ text: "",
67
+ fontSize: textSize,
68
+ font: 0,
69
+ textColor: Color4.create(0, 0, 0, 1),
70
+ textAlign: 4
71
+ });
72
+ VisibilityComponent.create(text, { visible: false });
73
+ bubbles.set(npc, {
74
+ container: container,
75
+ panel: panel,
76
+ text: text,
77
+ baseYOffset: baseYOffset,
78
+ isBubbleOpen: false,
79
+ typing: false,
80
+ visibleText: "",
81
+ visibleChars: 0,
82
+ fullText: "",
83
+ timer: 0,
84
+ speed: 30,
85
+ script: [],
86
+ index: 0,
87
+ sound: sound ? sound : undefined,
88
+ soundPlayer: sound ? engine.addEntity() : undefined,
89
+ });
90
+ }
91
+ export function openBubble(npc, dialog, start) {
92
+ let bubble = bubbles.get(npc);
93
+ bubble.script = addLineBreaks(dialog, true);
94
+ bubble.index = start ? start : 0;
95
+ let currentText = dialog[bubble.index] ? dialog[bubble.index] : { text: '' };
96
+ bubble.currentText = currentText;
97
+ if (currentText.audio) {
98
+ AudioSource.createOrReplace(bubble.soundPlayer, {
99
+ audioClipUrl: currentText.audio,
100
+ loop: false,
101
+ playing: false
102
+ });
103
+ let audio = AudioSource.getMutable(bubble.soundPlayer);
104
+ audio.volume = 0.5;
105
+ audio.playing = true;
106
+ }
107
+ else if (bubble.sound) {
108
+ AudioSource.createOrReplace(bubble.soundPlayer, {
109
+ audioClipUrl: bubble.sound,
110
+ loop: false,
111
+ playing: false
112
+ });
113
+ let audio = AudioSource.getMutable(bubble.soundPlayer);
114
+ audio.volume = 0.5;
115
+ audio.playing = true;
116
+ }
117
+ let text = bubble.text;
118
+ TextShape.getMutable(text).fontSize = currentText.fontSize ? currentText.fontSize : textSize;
119
+ Transform.getMutable(text).position.y = currentText.offsetY ? currentText.offsetY + textYPos : textYPos;
120
+ Transform.getMutable(text).position.x = currentText.offsetX ? currentText.offsetX : 0;
121
+ VisibilityComponent.getMutable(bubble.panel).visible = true;
122
+ if (currentText.text.length < maxLengthHugeBubble) {
123
+ currentText.text.slice(0, maxLengthHugeBubble);
124
+ }
125
+ beginTyping(npc, currentText.text, bubble.index, currentText.timeOn ? currentText.timeOn : undefined, currentText.typeSpeed ? currentText.typeSpeed : undefined);
126
+ adjustBubble(npc, currentText.text.length);
127
+ layoutDialogWindow(npc, bubble.index);
128
+ bubble.isBubbleOpen = true;
129
+ }
130
+ export function closeBubble(npc) {
131
+ let bubble = bubbles.get(npc);
132
+ if (bubble.isBubbleOpen) {
133
+ bubble.isBubbleOpen = false;
134
+ bubble.typing = false;
135
+ bubble.visibleText = "";
136
+ bubble.visibleChars = 0;
137
+ bubble.fullText = "";
138
+ bubble.timer = 0;
139
+ bubble.index = 0;
140
+ bubble.script = [];
141
+ bubble.buttons = 0;
142
+ bubble.margin = 0;
143
+ bubble.currentText = null;
144
+ TextShape.getMutable(bubble.text).text = "";
145
+ VisibilityComponent.getMutable(bubble.text).visible = false;
146
+ VisibilityComponent.getMutable(bubble.panel).visible = false;
147
+ }
148
+ }
149
+ export function closeBubbleEndAll(npc) {
150
+ let bubble = bubbles.get(npc);
151
+ if (bubble.isBubbleOpen) {
152
+ bubble.done = true;
153
+ closeBubble(npc);
154
+ }
155
+ }
156
+ const DEFAULT_SPEED = 45;
157
+ const DEFAULT_TIME_ON = 3;
158
+ function beginTyping(npc, text, textId, timeOn, speed) {
159
+ let dialogData = bubbles.get(npc);
160
+ dialogData.fullText = dialogData.script[dialogData.index].text;
161
+ dialogData.typing = true;
162
+ dialogData.done = false;
163
+ dialogData.visibleText = "";
164
+ dialogData.visibleChars = 0;
165
+ dialogData.timer = 0;
166
+ dialogData.buttons = 0;
167
+ dialogData.timeOn = timeOn ? timeOn : DEFAULT_TIME_ON;
168
+ dialogData.speed = speed ? speed : DEFAULT_SPEED;
169
+ dialogData.openTime = Math.floor(Date.now());
170
+ if (dialogData.speed <= 0) {
171
+ rushText(npc);
172
+ }
173
+ else {
174
+ if (!IsTypingBubble.has(npc)) {
175
+ console.log('creating typuing bubble');
176
+ IsTypingBubble.create(npc);
177
+ }
178
+ }
179
+ }
180
+ function rushText(npc) {
181
+ let dialogData = bubbles.get(npc);
182
+ dialogData.typing = false;
183
+ dialogData.timer = 0;
184
+ dialogData.visibleChars = dialogData.fullText.length;
185
+ dialogData.visibleText = dialogData.fullText;
186
+ }
187
+ function adjustBubble(npc, textLength) {
188
+ let bubble = bubbles.get(npc);
189
+ if (textLength < maxLengthShortBubble) {
190
+ MeshRenderer.setPlane(bubble.panel, setUVSection(bubbleOptions.short, 1024, 1024));
191
+ Transform.getMutable(bubble.panel).scale.x = shortBubbleX;
192
+ Transform.getMutable(bubble.panel).scale.y = shortBubbleY;
193
+ Transform.getMutable(bubble.container).position.x = shortBubbleXOffset;
194
+ Transform.getMutable(bubble.container).position.y = bubble.baseYOffset + shortBubbleYOffset;
195
+ TextShape.getMutable(bubble.text).width = shortBubbleTextWidth;
196
+ }
197
+ else if (textLength < maxLengthNormalBubble) {
198
+ MeshRenderer.setPlane(bubble.panel, setUVSection(bubbleOptions.normal, 1024, 1024));
199
+ Transform.getMutable(bubble.panel).scale.x = normalBubbleX;
200
+ Transform.getMutable(bubble.panel).scale.y = normalBubbleY;
201
+ Transform.getMutable(bubble.container).position.x = normalBubbleXOffset;
202
+ Transform.getMutable(bubble.container).position.y = bubble.baseYOffset + normalBubbleYOffset;
203
+ TextShape.getMutable(bubble.text).width = normalBubbleTextWidth;
204
+ }
205
+ else if (textLength < maxLengthLongBubble) {
206
+ MeshRenderer.setPlane(bubble.panel, setUVSection(bubbleOptions.long, 1024, 1024));
207
+ Transform.getMutable(bubble.panel).scale.x = longBubbleX;
208
+ Transform.getMutable(bubble.panel).scale.y = longBubbleY;
209
+ Transform.getMutable(bubble.container).position.x = longBubbleXOffset;
210
+ Transform.getMutable(bubble.container).position.y = bubble.baseYOffset + longBubbleYOffset;
211
+ TextShape.getMutable(bubble.text).width = longBubbleTextWidth;
212
+ }
213
+ else {
214
+ MeshRenderer.setPlane(bubble.panel, setUVSection(bubbleOptions.huge, 1024, 1024));
215
+ Transform.getMutable(bubble.panel).scale.x = hugeBubbleX;
216
+ Transform.getMutable(bubble.panel).scale.y = hugeBubbleY;
217
+ Transform.getMutable(bubble.container).position.x = hugeBubbleXOffset;
218
+ Transform.getMutable(bubble.container).position.y = bubble.baseYOffset + hugeBubbleYOffset;
219
+ TextShape.getMutable(bubble.text).width = hugeBubbleTextWidth;
220
+ }
221
+ }
222
+ function layoutDialogWindow(npc, textId) {
223
+ let bubble = bubbles.get(npc);
224
+ let currentText = bubble.script[textId]
225
+ ? bubble.script[textId]
226
+ : { text: '' };
227
+ let textY = currentText.offsetY ? currentText.offsetY + textYPos : textYPos;
228
+ if (currentText.buttons && currentText.buttons.length >= 3) {
229
+ textY += 50;
230
+ }
231
+ else if (currentText.buttons && currentText.buttons.length >= 1) {
232
+ textY += 24;
233
+ }
234
+ TextShape.getMutable(bubble.text).fontSize = currentText.fontSize
235
+ ? currentText.fontSize
236
+ : textSize;
237
+ VisibilityComponent.getMutable(bubble.text).visible = true;
238
+ Transform.getMutable(bubble.text).position.y = textY;
239
+ if (currentText.audio) {
240
+ AudioSource.createOrReplace(bubble.soundPlayer, {
241
+ audioClipUrl: currentText.audio,
242
+ loop: false,
243
+ playing: false
244
+ });
245
+ let audio = AudioSource.getMutable(bubble.soundPlayer);
246
+ audio.volume = 0.5;
247
+ audio.playing = true;
248
+ }
249
+ else if (bubble.sound) {
250
+ AudioSource.createOrReplace(bubble.soundPlayer, {
251
+ audioClipUrl: bubble.sound,
252
+ loop: false,
253
+ playing: false
254
+ });
255
+ let audio = AudioSource.getMutable(bubble.soundPlayer);
256
+ audio.volume = 0.5;
257
+ audio.playing = true;
258
+ }
259
+ }
260
+ export function next(npc) {
261
+ console.log('next text');
262
+ let bubble = bubbles.get(npc);
263
+ let currentText = bubble.script[bubble.index];
264
+ if (!currentText) {
265
+ currentText = bubble.script[bubble.index - 1];
266
+ }
267
+ if (currentText.triggeredByNext) {
268
+ currentText.triggeredByNext();
269
+ }
270
+ if (currentText.isEndOfDialog) {
271
+ closeBubble(npc);
272
+ return;
273
+ }
274
+ bubble.index++;
275
+ currentText = bubble.script[bubble.index];
276
+ if (currentText.text.length < maxLengthHugeBubble) {
277
+ currentText.text.slice(0, maxLengthHugeBubble);
278
+ }
279
+ TextShape.getMutable(bubble.text).text = "";
280
+ adjustBubble(npc, currentText.text.length);
281
+ beginTyping(npc, currentText.text, bubble.index, currentText.timeOn ? currentText.timeOn : undefined, currentText.typeSpeed ? currentText.typeSpeed : undefined);
282
+ layoutDialogWindow(npc, bubble.index);
283
+ }
284
+ function setUVSection(section, sizeX, sizeY) {
285
+ return setUVs({ x: section.sourceLeft / sizeX, y: (sizeY - section.sourceTop - section.sourceHeight) / sizeY }, { x: (section.sourceLeft + section.sourceWidth) / sizeX, y: (sizeY - section.sourceTop - section.sourceHeight) / sizeY }, { x: (section.sourceLeft + section.sourceWidth) / sizeX, y: (sizeY - section.sourceTop) / sizeY }, { x: section.sourceLeft / sizeX, y: (sizeY - section.sourceTop) / sizeY });
286
+ }
287
+ function setUVs(_uv00, _uv10, _uv11, _uv01) {
288
+ return [
289
+ _uv00.x,
290
+ _uv00.y,
291
+ _uv10.x,
292
+ _uv10.y,
293
+ _uv11.x,
294
+ _uv11.y,
295
+ _uv01.x,
296
+ _uv01.y,
297
+ _uv00.x,
298
+ _uv00.y,
299
+ _uv10.x,
300
+ _uv10.y,
301
+ _uv11.x,
302
+ _uv11.y,
303
+ _uv01.x,
304
+ _uv01.y,
305
+ ];
306
+ }
307
+ let bubbleOptions = {
308
+ short: {
309
+ sourceWidth: 116 * 2,
310
+ sourceHeight: 84 * 2,
311
+ sourceLeft: 305 * 2,
312
+ sourceTop: 417 * 2,
313
+ },
314
+ normal: {
315
+ sourceWidth: 286 * 2,
316
+ sourceHeight: 84 * 2,
317
+ sourceLeft: 8 * 2,
318
+ sourceTop: 417 * 2,
319
+ },
320
+ long: {
321
+ sourceWidth: 497 * 2,
322
+ sourceHeight: 153 * 2,
323
+ sourceLeft: 6 * 2,
324
+ sourceTop: 254 * 2,
325
+ },
326
+ huge: {
327
+ sourceWidth: 497 * 2,
328
+ sourceHeight: 239 * 2,
329
+ sourceLeft: 6 * 2,
330
+ sourceTop: 7 * 2,
331
+ },
332
+ };
333
+ export function getBubbleTextLength(text) {
334
+ if (text.length >= maxLengthHugeBubble) {
335
+ return 40;
336
+ }
337
+ else if (text.length >= maxLengthLongBubble) {
338
+ return 40;
339
+ }
340
+ else if (text.length >= maxLengthNormalBubble) {
341
+ return 40;
342
+ }
343
+ else if (text.length >= maxLengthShortBubble) {
344
+ return 40;
345
+ }
346
+ }
347
+ function setUVs2(rows, cols) {
348
+ return [
349
+ 0,
350
+ 0,
351
+ cols,
352
+ 0,
353
+ cols,
354
+ rows,
355
+ 0,
356
+ rows,
357
+ cols,
358
+ 0,
359
+ 0,
360
+ 0,
361
+ 0,
362
+ rows,
363
+ cols,
364
+ rows,
365
+ ];
366
+ }
367
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnViYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2J1YmJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQVksV0FBVyxFQUFlLFNBQVMsRUFBaUIsTUFBTSxFQUEyQyxRQUFRLEVBQWMsWUFBWSxFQUFtQyxTQUFTLEVBQUMsU0FBUyxFQUFpQixtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUcxUSxPQUFPLEVBQVMsTUFBTSxFQUFjLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFN0MsTUFBTSxDQUFDLElBQUksY0FBYyxHQUFHLHVEQUF1RCxDQUFBO0FBRW5GLE1BQU0sQ0FBQyxJQUFJLE9BQU8sR0FBcUIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtBQUVoRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUE7QUFDaEIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFBO0FBRWhCLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFBO0FBQzVCLElBQUkscUJBQXFCLEdBQUcsRUFBRSxDQUFBO0FBQzlCLElBQUksbUJBQW1CLEdBQUcsRUFBRSxDQUFBO0FBQzVCLElBQUksbUJBQW1CLEdBQUcsR0FBRyxDQUFBO0FBRTdCLElBQUksa0JBQWtCLEdBQUcsR0FBRyxDQUFBO0FBQzVCLElBQUksbUJBQW1CLEdBQUcsR0FBRyxDQUFBO0FBQzdCLElBQUksaUJBQWlCLEdBQUcsR0FBRyxDQUFBO0FBQzNCLElBQUksaUJBQWlCLEdBQUcsR0FBRyxDQUFBO0FBRTNCLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLENBQUE7QUFDN0IsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLEdBQUcsQ0FBQTtBQUM5QixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQTtBQUN6QixJQUFJLGlCQUFpQixH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STtRQUNKLElBQUk7UUFFSixDQUFDO1FBQ0QsSUFBSTtRQUdKLElBQUk7UUFDSixDQUFDO1FBRUQsQ0FBQztRQUNELENBQUM7UUFFRCxDQUFDO1FBQ0QsSUFBSTtRQUVKLElBQUk7UUFDSixJQUFJO0tBQ0wsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IEFuaW1hdG9yLCBBdWRpb1NvdXJjZSwgQXZhdGFyU2hhcGUsIEJpbGxib2FyZCwgQmlsbGJvYXJkTW9kZSwgZW5naW5lLCBFbnRpdHksIEZvbnQsIEdsdGZDb250YWluZXIsIElucHV0QWN0aW9uLE1hdGVyaWFsLE1lc2hDb2xsaWRlcixNZXNoUmVuZGVyZXIscG9pbnRlckV2ZW50c1N5c3RlbSxUZXh0QWxpZ25Nb2RlLFRleHRTaGFwZSxUcmFuc2Zvcm0sIFRyYW5zZm9ybVR5cGUsIFZpc2liaWxpdHlDb21wb25lbnQgfSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAZGNsLXNkay91dGlscydcbmltcG9ydCB7IERpYWxvZywgSW1hZ2VTZWN0aW9uIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IENvbG9yMyxDb2xvcjQsIFF1YXRlcm5pb24sIFZlY3RvcjMgfSBmcm9tICdAZGNsL3Nkay9tYXRoJ1xuaW1wb3J0IHsgYWRkTGluZUJyZWFrcyB9IGZyb20gJy4vZGlhbG9nJ1xuaW1wb3J0IHsgSXNUeXBpbmdCdWJibGUgfSBmcm9tICcuL2NvbXBvbmVudHMnXG5cbmV4cG9ydCBsZXQgYnViYmxlc1RleHR1cmUgPSAnaHR0cHM6Ly9kZWNlbnRyYWxhbmQub3JnL2ltYWdlcy91aS9kaWFsb2ctYnViYmxlcy5wbmcnXG5cbmV4cG9ydCBsZXQgYnViYmxlczogTWFwPEVudGl0eSwgYW55PiA9IG5ldyBNYXAoKVxuXG5sZXQgdGV4dFNpemUgPSAxXG5sZXQgdGV4dFlQb3MgPSAwICAgIFxuXG5sZXQgbWF4TGVuZ3RoU2hvcnRCdWJibGUgPSA4XG5sZXQgbWF4TGVuZ3RoTm9ybWFsQnViYmxlID0gMjVcbmxldCBtYXhMZW5ndGhMb25nQnViYmxlID0gNTBcbmxldCBtYXhMZW5ndGhIdWdlQnViYmxlID0gMTAwXG5cbmxldCBzaG9ydEJ1YmJsZVhPZmZzZXQgPSAwLjFcbmxldCBub3JtYWxCdWJibGVYT2Zmc2V0ID0gMC41XG5sZXQgbG9uZ0J1YmJsZVhPZmZzZXQgPSAwLjhcbmxldCBodWdlQnViYmxlWE9mZnNldCA9IDAuOFxuXG5sZXQgc2hvcnRCdWJibGVZT2Zmc2V0ID0gLTAuMlxubGV0IG5vcm1hbEJ1YmJsZVlPZmZzZXQgPSAtMC4yXG5sZXQgbG9uZ0J1YmJsZVlPZmZzZXQgPSAwXG5sZXQgaHVnZUJ1YmJsZVlPZmZzZXQgPSAwLjJcblxubGV0IHNob3J0QnViYmxlVGV4dFdpZHRoID0gMC43XG5sZXQgbm9ybWFsQnViYmxlVGV4dFdpZHRoID0gMS41XG5sZXQgbG9uZ0J1YmJsZVRleHRXaWR0aCA9IDJcbmxldCBodWdlQnViYmxlVGV4dFdpZHRoID0gMS41XG5cbmxldCBzaG9ydEJ1YmJsZVggPSAxMTYgKiAwLjAwNVxubGV0IHNob3J0QnViYmxlWSA9IDg0ICogMC4wMDVcblxubGV0IG5vcm1hbEJ1YmJsZVggPSAyODYgKiAwLjAwNVxubGV0IG5vcm1hbEJ1YmJsZVkgPSA4NCAqIDAuMDA1XG5cbmxldCBsb25nQnViYmxlWCA9IDQ5NyAqIDAuMDA1XG5sZXQgbG9uZ0J1YmJsZVkgPSAxNTMgKiAwLjAwNVxuXG5sZXQgaHVnZUJ1YmJsZVggPSA0OTcgKiAwLjAwNVxubGV0IGh1Z2VCdWJibGVZID0gMjM5ICogMC4wMDVcblxubGV0IGRlZmF1bHRZT2Zmc2V0ID0gMi41XG5cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGlhbG9nQnViYmxlKG5wYzpFbnRpdHksIGhlaWdodD86bnVtYmVyLCBzb3VuZD86c3RyaW5nKXtcbiAgICBsZXQgYmFzZVlPZmZzZXQgPSBoZWlnaHQgPyBoZWlnaHQgOiBkZWZhdWx0WU9mZnNldFxuXG4gICAgbGV0IHJvb3QgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgICBCaWxsYm9hcmQuY3JlYXRlKHJvb3Qse1xuICAgICAgICBiaWxsYm9hcmRNb2RlOkJpbGxib2FyZE1vZGUuQk1fWVxuICAgIH0pXG5cbiAgICBUcmFuc2Zvcm0uY3JlYXRlKHJvb3Qse1xuICAgICAgICBwYXJlbnQ6bnBjXG4gICAgfSlcblxuICAgIGxldCBjb250YWluZXIgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgICBUcmFuc2Zvcm0uY3JlYXRlKGNvbnRhaW5lcix7XG4gICAgICAgIHBhcmVudDpyb290LFxuICAgICAgICBwb3NpdGlvbjpWZWN0b3IzLmNyZWF0ZShzaG9ydEJ1YmJsZVhPZmZzZXQsYmFzZVlPZmZzZXQsMClcbiAgICB9KVxuXG4gICAgbGV0IHBhbmVsID0gZW5naW5lLmFkZEVudGl0eSgpXG4gICAgVHJhbnNmb3JtLmNyZWF0ZShwYW5lbCx7XG4gICAgICAgIHBhcmVudDpjb250YWluZXIsXG4gICAgICAgIHNjYWxlOiBWZWN0b3IzLmNyZWF0ZSgyLDEsMSksXG4gICAgICAgIC8vcm90YXRpb246UXVhdGVybmlvbi5mcm9tRXVsZXJEZWdyZWVzKDAsMCw5MClcbiAgICB9KVxuICAgIE1lc2hSZW5kZXJlci5zZXRQbGFuZShwYW5lbCxcbiAgICAgICAgc2V0VVZTZWN0aW9uKFxuICAgICAgICBidWJibGVPcHRpb25zLm5vcm1hbCxcbiAgICAgICAgMTAyNCxcbiAgICAgICAgMTAyNFxuICAgICAgKSlcblxuICAgIFZpc2liaWxpdHlDb21wb25lbnQuY3JlYXRlKHBhbmVsLCB7dmlzaWJsZTogZmFsc2V9KVxuXG4gICAgTWF0ZXJpYWwuc2V0QmFzaWNNYXRlcmlhbChwYW5lbCwge1xuICAgICAgICB0ZXh0dXJlOiBNYXRlcmlhbC5UZXh0dXJlLkNvbW1vbih7XG4gICAgICAgICAgc3JjOiBidWJibGVzVGV4dHVyZVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgIGxldCB0ZXh0ID0gZW5naW5lLmFkZEVudGl0eSgpXG4gICAgVHJhbnNmb3JtLmNyZWF0ZSh0ZXh0LHtcbiAgICAgICAgcG9zaXRpb246VmVjdG9yMy5jcmVhdGUoMCx0ZXh0WVBvcywgLS4wNSksXG4gICAgICAgIHBhcmVudDpjb250YWluZXJcbiAgICB9KVxuICAgIFRleHRTaGFwZS5jcmVhdGUodGV4dCwge1xuICAgICAgICB0ZXh0OlwiXCIsIFxuICAgICAgICBmb250U2l6ZTp0ZXh0U2l6ZSxcbiAgICAgICAgZm9udDogRm9udC5GX1NBTlNfU0VSSUYsXG4gICAgICAgIHRleHRDb2xvcjogQ29sb3I0LmNyZWF0ZSgwLDAsMCwxKSxcbiAgICAgICAgdGV4dEFsaWduOlRleHRBbGlnbk1vZGUuVEFNX01JRERMRV9DRU5URVJcbiAgICB9KVxuICAgIFZpc2liaWxpdHlDb21wb25lbnQuY3JlYXRlKHRleHQsIHt2aXNpYmxlOiBmYWxzZX0pXG5cbiAgICBidWJibGVzLnNldChucGMsIHtcbiAgICAgICAgY29udGFpbmVyOmNvbnRhaW5lcixcbiAgICAgICAgcGFuZWw6cGFuZWwsXG4gICAgICAgIHRleHQ6dGV4dCxcbiAgICAgICAgYmFzZVlPZmZzZXQ6IGJhc2VZT2Zmc2V0LFxuICAgICAgICBpc0J1YmJsZU9wZW46ZmFsc2UsXG4gICAgICAgIHR5cGluZzpmYWxzZSxcbiAgICAgICAgdmlzaWJsZVRleHQ6XCJcIixcbiAgICAgICAgdmlzaWJsZUNoYXJzOjAsXG4gICAgICAgIGZ1bGxUZXh0OlwiXCIsXG4gICAgICAgIHRpbWVyOjAsXG4gICAgICAgIHNwZWVkOjMwLFxuICAgICAgICBzY3JpcHQ6W10sXG4gICAgICAgIGluZGV4OjAsXG4gICAgICAgIHNvdW5kOiBzb3VuZCA/IHNvdW5kIDogdW5kZWZpbmVkLFxuICAgICAgICBzb3VuZFBsYXllcjogc291bmQgPyBlbmdpbmUuYWRkRW50aXR5KCkgOiB1bmRlZmluZWQsXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9wZW5CdWJibGUobnBjOkVudGl0eSwgZGlhbG9nOkRpYWxvZ1tdLCBzdGFydD86bnVtYmVyKXtcbiAgICBsZXQgYnViYmxlID0gYnViYmxlcy5nZXQobnBjKVxuXG4gICAgYnViYmxlLnNjcmlwdCA9IGFkZExpbmVCcmVha3MoZGlhbG9nLCB0cnVlKVxuICAgIGJ1YmJsZS5pbmRleCA9IHN0YXJ0ID8gc3RhcnQgOiAwXG4gICAgXG4gICAgbGV0IGN1cnJlbnRUZXh0OiBEaWFsb2cgPSBkaWFsb2dbYnViYmxlLmluZGV4XSA/IGRpYWxvZ1tidWJibGUuaW5kZXhdIDogeyB0ZXh0OiAnJyB9XG4gICAgYnViYmxlLmN1cnJlbnRUZXh0ID0gY3VycmVudFRleHRcblxuICAgIGlmIChjdXJyZW50VGV4dC5hdWRpbykge1xuICAgICAgICBBdWRpb1NvdXJjZS5jcmVhdGVPclJlcGxhY2UoYnViYmxlLnNvdW5kUGxheWVyLCB7XG4gICAgICAgICAgICBhdWRpb0NsaXBVcmw6IGN1cnJlbnRUZXh0LmF1ZGlvLFxuICAgICAgICAgICAgbG9vcDogZmFsc2UsXG4gICAgICAgICAgICBwbGF5aW5nOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgICBsZXQgYXVkaW8gPSBBdWRpb1NvdXJjZS5nZXRNdXRhYmxlKGJ1YmJsZS5zb3VuZFBsYXllcilcbiAgICAgICAgYXVkaW8udm9sdW1lID0gMC41XG4gICAgICAgIGF1ZGlvLnBsYXlpbmcgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChidWJibGUuc291bmQpIHtcbiAgICAgICAgQXVkaW9Tb3VyY2UuY3JlYXRlT3JSZXBsYWNlKGJ1YmJsZS5zb3VuZFBsYXllciwge1xuICAgICAgICAgICAgYXVkaW9DbGlwVXJsOiBidWJibGUuc291bmQsXG4gICAgICAgICAgICBsb29wOiBmYWxzZSxcbiAgICAgICAgICAgIHBsYXlpbmc6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICAgIGxldCBhdWRpbyA9IEF1ZGlvU291cmNlLmdldE11dGFibGUoYnViYmxlLnNvdW5kUGxheWVyKVxuICAgICAgICBhdWRpby52b2x1bWUgPSAwLjVcbiAgICAgICAgYXVkaW8ucGxheWluZyA9IHRydWVcbiAgICB9XG5cbiAgICBsZXQgdGV4dCA9IGJ1YmJsZS50ZXh0XG4gICAgVGV4dFNoYXBlLmdldE11dGFibGUodGV4dCkuZm9udFNpemUgPSBjdXJyZW50VGV4dC5mb250U2l6ZSA/IGN1cnJlbnRUZXh0LmZvbnRTaXplIDogdGV4dFNpemVcbiAgICBUcmFuc2Zvcm0uZ2V0TXV0YWJsZSh0ZXh0KS5wb3NpdGlvbi55ID0gY3VycmVudFRleHQub2Zmc2V0WSA/IGN1cnJlbnRUZXh0Lm9mZnNldFkgKyB0ZXh0WVBvcyA6IHRleHRZUG9zXG4gICAgVHJhbnNmb3JtLmdldE11dGFibGUodGV4dCkucG9zaXRpb24ueCA9IGN1cnJlbnRUZXh0Lm9mZnNldFggPyBjdXJyZW50VGV4dC5vZmZzZXRYIDogMFxuXG4gICAgVmlzaWJpbGl0eUNvbXBvbmVudC5nZXRNdXRhYmxlKGJ1YmJsZS5wYW5lbCkudmlzaWJsZSA9IHRydWVcblxuICAgIGlmIChjdXJyZW50VGV4dC50ZXh0Lmxlbmd0aCA8IG1heExlbmd0aEh1Z2VCdWJibGUpIHtcbiAgICAgICAgY3VycmVudFRleHQudGV4dC5zbGljZSgwLCBtYXhMZW5ndGhIdWdlQnViYmxlKVxuICAgICAgfVxuXG4gICAgYmVnaW5UeXBpbmcoXG4gICAgICAgIG5wYyxcbiAgICAgICAgY3VycmVudFRleHQudGV4dCxcbiAgICAgICAgYnViYmxlLmluZGV4LFxuICAgICAgICBjdXJyZW50VGV4dC50aW1lT24gPyBjdXJyZW50VGV4dC50aW1lT24gOiB1bmRlZmluZWQsXG4gICAgICAgIGN1cnJlbnRUZXh0LnR5cGVTcGVlZCA/IGN1cnJlbnRUZXh0LnR5cGVTcGVlZCA6IHVuZGVmaW5lZCBcbiAgICApXG5cbiAgICBhZGp1c3RCdWJibGUobnBjLCBjdXJyZW50VGV4dC50ZXh0Lmxlbmd0aClcbiAgICBsYXlvdXREaWFsb2dXaW5kb3cobnBjLCBidWJibGUuaW5kZXgpXG4gICAgYnViYmxlLmlzQnViYmxlT3BlbiA9IHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlQnViYmxlKG5wYzpFbnRpdHkpe1xuICAgIGxldCBidWJibGUgPSBidWJibGVzLmdldChucGMpXG4gICAgaWYoYnViYmxlLmlzQnViYmxlT3Blbil7XG4gICAgICAgIGJ1YmJsZS5pc0J1YmJsZU9wZW4gPSBmYWxzZVxuICAgICAgICBidWJibGUudHlwaW5nID0gZmFsc2VcbiAgICAgICAgYnViYmxlLnZpc2libGVUZXh0ID0gXCJcIlxuICAgICAgICBidWJibGUudmlzaWJsZUNoYXJzID0gMFxuICAgICAgICBidWJibGUuZnVsbFRleHQgPSBcIlwiXG4gICAgICAgIGJ1YmJsZS50aW1lciA9IDBcbiAgICAgICAgYnViYmxlLmluZGV4ID0gMFxuICAgICAgICBidWJibGUuc2NyaXB0ID0gW11cbiAgICAgICAgYnViYmxlLmJ1dHRvbnMgPSAwXG4gICAgICAgIGJ1YmJsZS5tYXJnaW4gPSAwXG4gICAgICAgIGJ1YmJsZS5jdXJyZW50VGV4dCA9IG51bGxcbiAgICAgICAgVGV4dFNoYXBlLmdldE11dGFibGUoYnViYmxlLnRleHQpLnRleHQgPSBcIlwiXG4gICAgICAgIFZpc2liaWxpdHlDb21wb25lbnQuZ2V0TXV0YWJsZShidWJibGUudGV4dCkudmlzaWJsZSA9IGZhbHNlXG4gICAgICAgIFZpc2liaWxpdHlDb21wb25lbnQuZ2V0TXV0YWJsZShidWJibGUucGFuZWwpLnZpc2libGUgPSBmYWxzZVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlQnViYmxlRW5kQWxsKG5wYzpFbnRpdHkpOiB2b2lkIHtcbiAgICBsZXQgYnViYmxlID0gYnViYmxlcy5nZXQobnBjKVxuICAgIGlmIChidWJibGUuaXNCdWJibGVPcGVuKSB7XG4gICAgICAgIGJ1YmJsZS5kb25lID0gdHJ1ZVxuICAgICAgICBjbG9zZUJ1YmJsZShucGMpXG4gICAgfVxuICB9XG5cbmNvbnN0IERFRkFVTFRfU1BFRUQgPSA0NVxuXG5jb25zdCBERUZBVUxUX1RJTUVfT04gPSAzXG5cbmZ1bmN0aW9uIGJlZ2luVHlwaW5nKG5wYzpFbnRpdHksIHRleHQ6c3RyaW5nLCB0ZXh0SWQ6bnVtYmVyLCB0aW1lT24/Om51bWJlciwgc3BlZWQ/Om51bWJlcil7XG4gICAgbGV0IGRpYWxvZ0RhdGEgPSBidWJibGVzLmdldChucGMpXG4gICAgZGlhbG9nRGF0YS5mdWxsVGV4dCA9IGRpYWxvZ0RhdGEuc2NyaXB0W2RpYWxvZ0RhdGEuaW5kZXhdLnRleHRcbiAgICBkaWFsb2dEYXRhLnR5cGluZyA9IHRydWVcbiAgICBkaWFsb2dEYXRhLmRvbmUgPSBmYWxzZVxuICAgIGRpYWxvZ0RhdGEudmlzaWJsZVRleHQgPSBcIlwiXG4gICAgZGlhbG9nRGF0YS52aXNpYmxlQ2hhcnMgPSAwXG4gICAgZGlhbG9nRGF0YS50aW1lciA9IDBcbiAgICBkaWFsb2dEYXRhLmJ1dHRvbnMgPSAwXG4gICAgZGlhbG9nRGF0YS50aW1lT24gPSB0aW1lT24gPyB0aW1lT24gOiBERUZBVUxUX1RJTUVfT05cbiAgICBkaWFsb2dEYXRhLnNwZWVkID0gc3BlZWQgPyBzcGVlZCA6IERFRkFVTFRfU1BFRURcblxuICAgIGRpYWxvZ0RhdGEub3BlblRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkpXG5cbiAgICBpZihkaWFsb2dEYXRhLnNwZWVkIDw9IDApe1xuICAgICAgICBydXNoVGV4dChucGMpXG4gICAgfVxuICAgIGVsc2V7XG4gICAgICAgIGlmKCFJc1R5cGluZ0J1YmJsZS5oYXMobnBjKSl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY3JlYXRpbmcgdHlwdWluZyBidWJibGUnKVxuICAgICAgICAgICAgSXNUeXBpbmdCdWJibGUuY3JlYXRlKG5wYylcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcnVzaFRleHQobnBjOkVudGl0eSl7XG4gICAgbGV0IGRpYWxvZ0RhdGEgPSBidWJibGVzLmdldChucGMpXG4gICAgZGlhbG9nRGF0YS50eXBpbmcgPSBmYWxzZVxuICAgIGRpYWxvZ0RhdGEudGltZXIgPSAwXG4gICAgZGlhbG9nRGF0YS52aXNpYmxlQ2hhcnMgPSBkaWFsb2dEYXRhLmZ1bGxUZXh0Lmxlbmd0aFxuICAgIGRpYWxvZ0RhdGEudmlzaWJsZVRleHQgPSBkaWFsb2dEYXRhLmZ1bGxUZXh0XG59XG5cbmZ1bmN0aW9uIGFkanVzdEJ1YmJsZShucGM6RW50aXR5LCB0ZXh0TGVuZ3RoOm51bWJlcil7XG4gICAgbGV0IGJ1YmJsZSA9IGJ1YmJsZXMuZ2V0KG5wYylcblxuICAgIGlmICh0ZXh0TGVuZ3RoIDwgbWF4TGVuZ3RoU2hvcnRCdWJibGUpIHtcbiAgICAgICAgTWVzaFJlbmRlcmVyLnNldFBsYW5lKGJ1YmJsZS5wYW5lbCxcbiAgICAgICAgICAgIHNldFVWU2VjdGlvbihcbiAgICAgICAgICAgIGJ1YmJsZU9wdGlvbnMuc2hvcnQsXG4gICAgICAgICAgICAxMDI0LFxuICAgICAgICAgICAgMTAyNFxuICAgICAgICAgICkpXG5cbiAgICAgICAgVHJhbnNmb3JtLmdldE11dGFibGUoYnViYmxlLnBhbmVsKS5zY2FsZS54ID0gc2hvcnRCdWJibGVYXG4gICAgICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKGJ1YmJsZS5wYW5lbCkuc2NhbGUueSA9IHNob3J0QnViYmxlWVxuICAgICAgICBUcmFuc2Zvcm0uZ2V0TXV0YWJsZShidWJibGUuY29udGFpbmVyKS5wb3NpdGlvbi54ID0gc2hvcnRCdWJibGVYT2Zmc2V0XG4gICAgICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKGJ1YmJsZS5jb250YWluZXIpLnBvc2l0aW9uLnkgPSBidWJibGUuYmFzZVlPZmZzZXQgKyBzaG9ydEJ1YmJsZVlPZmZzZXRcbiAgICAgICAgVGV4dFNoYXBlLmdldE11dGFibGUoYnViYmxlLnRleHQpLndpZHRoID0gc2hvcnRCdWJibGVUZXh0V2lkdGhcbiAgICAgIH0gZWxzZSBpZiAodGV4dExlbmd0aCA8IG1heExlbmd0aE5vcm1hbEJ1YmJsZSkge1xuICAgICAgICBNZXNoUmVuZGVyZXIuc2V0UGxhbmUoYnViYmxlLnBhbmVsLFxuICAgICAgICAgICAgc2V0VVZTZWN0aW9uKFxuICAgICAgICAgICAgYnViYmxlT3B0aW9ucy5ub3JtYWwsXG4gICAgICAgICAgICAxMDI0LFxuICAgICAgICAgICAgMTAyNFxuICAgICAgICAgICkpXG5cbiAgICAgICAgVHJhbnNmb3JtLmdldE11dGFibGUoYnViYmxlLnBhbmVsKS5zY2FsZS54ID0gbm9ybWFsQnViYmxlWFxuICAgICAgICBUcmFuc2Zvcm0uZ2V0TXV0YWJsZShidWJibGUucGFuZWwpLnNjYWxlLnkgPSBub3JtYWxCdWJibGVZXG4gICAgICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKGJ1YmJsZS5jb250YWluZXIpLnBvc2l0aW9uLnggPSBub3JtYWxCdWJibGVYT2Zmc2V0XG4gICAgICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKGJ1YmJsZS5jb250YWluZXIpLnBvc2l0aW9uLnkgPSBidWJibGUuYmFzZVlPZmZzZXQgKyBub3JtYWxCdWJibGVZT2Zmc2V0XG4gICAgICAgIFRleHRTaGFwZS5nZXRNdXRhYmxlKGJ1YmJsZS50ZXh0KS53aWR0aCA9IG5vcm1hbEJ1YmJsZVRleHRXaWR0aFxuICAgICAgfSBlbHNlIGlmICh0ZXh0TGVuZ3RoIDwgbWF4TGVuZ3RoTG9uZ0J1YmJsZSkge1xuICAgICAgICBNZXNoUmVuZGVyZXIuc2V0UGxhbmUoYnViYmxlLnBhbmVsLFxuICAgICAgICAgICAgc2V0VVZTZWN0aW9uKFxuICAgICAgICAgICAgYnViYmxlT3B0aW9ucy5sb25nLFxuICAgICAgICAgICAgMTAyNCxcbiAgICAgICAgICAgIDEwMjRcbiAgICAgICAgICApKVxuXG4gICAgICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKGJ1YmJsZS5wYW5lbCkuc2NhbGUueCA9IGxvbmdCdWJibGVYXG4gICAgICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKGJ1YmJsZS5wYW5lbCkuc2NhbGUueSA9IGxvbmdCdWJibGVZXG4gICAgICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKGJ1YmJsZS5jb250YWluZXIpLnBvc2l0aW9uLnggPSBsb25nQnViYmxlWE9mZnNldFxuICAgICAgICBUcmFuc2Zvcm0uZ2V0TXV0YWJsZShidWJibGUuY29udGFpbmVyKS5wb3NpdGlvbi55ID0gYnViYmxlLmJhc2VZT2Zmc2V0ICsgbG9uZ0J1YmJsZVlPZmZzZXRcbiAgICAgICAgVGV4dFNoYXBlLmdldE11dGFibGUoYnViYmxlLnRleHQpLndpZHRoID0gbG9uZ0J1YmJsZVRleHRXaWR0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTWVzaFJlbmRlcmVyLnNldFBsYW5lKGJ1YmJsZS5wYW5lbCxcbiAgICAgICAgICAgIHNldFVWU2VjdGlvbihcbiAgICAgICAgICAgIGJ1YmJsZU9wdGlvbnMuaHVnZSxcbiAgICAgICAgICAgIDEwMjQsXG4gICAgICAgICAgICAxMDI0XG4gICAgICAgICAgKSlcbiAgICAgICAgVHJhbnNmb3JtLmdldE11dGFibGUoYnViYmxlLnBhbmVsKS5zY2FsZS54ID0gaHVnZUJ1YmJsZVhcbiAgICAgICAgVHJhbnNmb3JtLmdldE11dGFibGUoYnViYmxlLnBhbmVsKS5zY2FsZS55ID0gaHVnZUJ1YmJsZVlcbiAgICAgICAgVHJhbnNmb3JtLmdldE11dGFibGUoYnViYmxlLmNvbnRhaW5lcikucG9zaXRpb24ueCA9IGh1Z2VCdWJibGVYT2Zmc2V0XG4gICAgICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKGJ1YmJsZS5jb250YWluZXIpLnBvc2l0aW9uLnkgPSBidWJibGUuYmFzZVlPZmZzZXQgKyBodWdlQnViYmxlWU9mZnNldFxuICAgICAgICBUZXh0U2hhcGUuZ2V0TXV0YWJsZShidWJibGUudGV4dCkud2lkdGggPSBodWdlQnViYmxlVGV4dFdpZHRoXG4gICAgICB9XG59XG5cbi8vIEFkZHMgdGhlIGJ1dHRvbnMgb3IgbW91c2UgaWNvbiBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2Ygd2luZG93XG5mdW5jdGlvbiBsYXlvdXREaWFsb2dXaW5kb3cobnBjOkVudGl0eSwgdGV4dElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgYnViYmxlID0gYnViYmxlcy5nZXQobnBjKVxuICAgIGxldCBjdXJyZW50VGV4dDogRGlhbG9nID0gYnViYmxlLnNjcmlwdFt0ZXh0SWRdXG4gICAgICA/IGJ1YmJsZS5zY3JpcHRbdGV4dElkXVxuICAgICAgOiB7IHRleHQ6ICcnIH1cblxuICAgIC8vIFVwZGF0ZSB0ZXh0XG4gICAgbGV0IHRleHRZID0gY3VycmVudFRleHQub2Zmc2V0WSA/IGN1cnJlbnRUZXh0Lm9mZnNldFkgKyB0ZXh0WVBvcyA6IHRleHRZUG9zXG5cbiAgICBpZiAoY3VycmVudFRleHQuYnV0dG9ucyAmJiBjdXJyZW50VGV4dC5idXR0b25zLmxlbmd0aCA+PSAzKSB7XG4gICAgICB0ZXh0WSArPSA1MFxuICAgIH0gZWxzZSBpZiAoY3VycmVudFRleHQuYnV0dG9ucyAmJiBjdXJyZW50VGV4dC5idXR0b25zLmxlbmd0aCA+PSAxKSB7XG4gICAgICB0ZXh0WSArPSAyNFxuICAgIH1cbiAgICBUZXh0U2hhcGUuZ2V0TXV0YWJsZShidWJibGUudGV4dCkuZm9udFNpemUgPSBjdXJyZW50VGV4dC5mb250U2l6ZVxuICAgID8gY3VycmVudFRleHQuZm9udFNpemVcbiAgICA6IHRleHRTaXplXG4gICAgXG4gICAgVmlzaWJpbGl0eUNvbXBvbmVudC5nZXRNdXRhYmxlKGJ1YmJsZS50ZXh0KS52aXNpYmxlID0gdHJ1ZVxuICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKGJ1YmJsZS50ZXh0KS5wb3NpdGlvbi55ID0gdGV4dFlcblxuICAgIGlmIChjdXJyZW50VGV4dC5hdWRpbykge1xuICAgICAgICBBdWRpb1NvdXJjZS5jcmVhdGVPclJlcGxhY2UoYnViYmxlLnNvdW5kUGxheWVyLCB7XG4gICAgICAgICAgICBhdWRpb0NsaXBVcmw6IGN1cnJlbnRUZXh0LmF1ZGlvLFxuICAgICAgICAgICAgbG9vcDogZmFsc2UsXG4gICAgICAgICAgICBwbGF5aW5nOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgICBsZXQgYXVkaW8gPSBBdWRpb1NvdXJjZS5nZXRNdXRhYmxlKGJ1YmJsZS5zb3VuZFBsYXllcilcbiAgICAgICAgYXVkaW8udm9sdW1lID0gMC41XG4gICAgICAgIGF1ZGlvLnBsYXlpbmcgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChidWJibGUuc291bmQpIHtcbiAgICAgICAgQXVkaW9Tb3VyY2UuY3JlYXRlT3JSZXBsYWNlKGJ1YmJsZS5zb3VuZFBsYXllciwge1xuICAgICAgICAgICAgYXVkaW9DbGlwVXJsOiBidWJibGUuc291bmQsXG4gICAgICAgICAgICBsb29wOiBmYWxzZSxcbiAgICAgICAgICAgIHBsYXlpbmc6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICAgIGxldCBhdWRpbyA9IEF1ZGlvU291cmNlLmdldE11dGFibGUoYnViYmxlLnNvdW5kUGxheWVyKVxuICAgICAgICBhdWRpby52b2x1bWUgPSAwLjVcbiAgICAgICAgYXVkaW8ucGxheWluZyA9IHRydWVcbiAgICB9XG5cbiAgfVxuXG4vLyBQcm9ncmVzc2VzIHRleHRcbmV4cG9ydCBmdW5jdGlvbiBuZXh0KG5wYzpFbnRpdHkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnbmV4dCB0ZXh0JylcbiAgICBsZXQgYnViYmxlID0gYnViYmxlcy5nZXQobnBjKVxuICAgIGxldCBjdXJyZW50VGV4dCA9IGJ1YmJsZS5zY3JpcHRbYnViYmxlLmluZGV4XVxuXG5cdGlmKCFjdXJyZW50VGV4dCl7XG5cdFx0Y3VycmVudFRleHQgPSBidWJibGUuc2NyaXB0W2J1YmJsZS5pbmRleC0xXVxuXHR9XG5cbiAgICBpZiAoY3VycmVudFRleHQudHJpZ2dlcmVkQnlOZXh0KSB7XG4gICAgICBjdXJyZW50VGV4dC50cmlnZ2VyZWRCeU5leHQoKVxuICAgIH1cblxuXHRpZiAoY3VycmVudFRleHQuaXNFbmRPZkRpYWxvZykge1xuXHRcdGNsb3NlQnViYmxlKG5wYylcblx0XHRyZXR1cm5cblx0ICB9XG4gICBcblx0IC8vIFVwZGF0ZSBhY3RpdmUgdGV4dFxuICAgICBidWJibGUuaW5kZXgrK1xuXG4gICAgLy8gVXBkYXRlIGFjdGl2ZSB0ZXh0IHdpdGggbmV3IGFjdGl2ZSB0ZXh0XG4gICAgY3VycmVudFRleHQgPSBidWJibGUuc2NyaXB0W2J1YmJsZS5pbmRleF1cblxuICAgIGlmIChjdXJyZW50VGV4dC50ZXh0Lmxlbmd0aCA8IG1heExlbmd0aEh1Z2VCdWJibGUpIHtcbiAgICAgIGN1cnJlbnRUZXh0LnRleHQuc2xpY2UoMCwgbWF4TGVuZ3RoSHVnZUJ1YmJsZSlcbiAgICB9XG5cbiAgICBUZXh0U2hhcGUuZ2V0TXV0YWJsZShidWJibGUudGV4dCkudGV4dCA9IFwiXCJcblxuICAgIGFkanVzdEJ1YmJsZShucGMsIGN1cnJlbnRUZXh0LnRleHQubGVuZ3RoKVxuXG4gICAgYmVnaW5UeXBpbmcoXG4gICAgICAgIG5wYyxcbiAgICAgICAgY3VycmVudFRleHQudGV4dCxcbiAgICAgICAgYnViYmxlLmluZGV4LFxuICAgICAgICBjdXJyZW50VGV4dC50aW1lT24gPyBjdXJyZW50VGV4dC50aW1lT24gOiB1bmRlZmluZWQsXG4gICAgICAgIGN1cnJlbnRUZXh0LnR5cGVTcGVlZCA/IGN1cnJlbnRUZXh0LnR5cGVTcGVlZCA6IHVuZGVmaW5lZCBcbiAgICApXG5cdGxheW91dERpYWxvZ1dpbmRvdyhucGMsIGJ1YmJsZS5pbmRleClcbiAgfVxuXG5mdW5jdGlvbiBzZXRVVlNlY3Rpb24oXG5cdHNlY3Rpb246IEltYWdlU2VjdGlvbixcblx0c2l6ZVg6IG51bWJlcixcblx0c2l6ZVk6IG51bWJlclxuICApIHtcblx0cmV0dXJuIHNldFVWcyhcbiAgICAgICAge3g6ICBzZWN0aW9uLnNvdXJjZUxlZnQhIC8gc2l6ZVgsIHk6IChzaXplWSAtIHNlY3Rpb24uc291cmNlVG9wISAtIHNlY3Rpb24uc291cmNlSGVpZ2h0KSAvIHNpemVZfSxcbiAgICAgICAge3g6ICAoc2VjdGlvbi5zb3VyY2VMZWZ0ISArIHNlY3Rpb24uc291cmNlV2lkdGgpIC8gc2l6ZVgsIHk6IChzaXplWSAtIHNlY3Rpb24uc291cmNlVG9wISAtIHNlY3Rpb24uc291cmNlSGVpZ2h0KSAvIHNpemVZfSxcbiAgICAgICAge3g6ICAoc2VjdGlvbi5zb3VyY2VMZWZ0ISArIHNlY3Rpb24uc291cmNlV2lkdGgpIC8gc2l6ZVgsIHk6ICAoc2l6ZVkgLSBzZWN0aW9uLnNvdXJjZVRvcCEpIC8gc2l6ZVl9LFxuICAgICAgICB7eDogIHNlY3Rpb24uc291cmNlTGVmdCEgLyBzaXplWCwgeTogKHNpemVZIC0gc2VjdGlvbi5zb3VyY2VUb3AhKSAvIHNpemVZfSxcblx0KVxuICB9XG5cbmZ1bmN0aW9uIHNldFVWcyhcblx0X3V2MDA6IGFueSxcblx0X3V2MTA6IGFueSxcblx0X3V2MTE6IGFueSxcblx0X3V2MDE6IGFueVxuICApIHtcblxuXHRyZXR1cm4gW1xuXHQgIF91djAwLngsXG5cdCAgX3V2MDAueSxcbiAgXG5cdCAgX3V2MTAueCxcblx0ICBfdXYxMC55LFxuICBcblx0ICBfdXYxMS54LFxuXHQgIF91djExLnksXG4gIFxuXHQgIF91djAxLngsXG5cdCAgX3V2MDEueSxcblx0ICAvLy0tLS1cblx0ICBfdXYwMC54LFxuXHQgIF91djAwLnksXG4gIFxuXHQgIF91djEwLngsXG5cdCAgX3V2MTAueSxcbiAgXG5cdCAgX3V2MTEueCxcblx0ICBfdXYxMS55LFxuICBcblx0ICBfdXYwMS54LFxuXHQgIF91djAxLnksXG5cdF1cbiAgfVxuXG4gIGxldCBidWJibGVPcHRpb25zOmFueSA9IHtcbiAgICBzaG9ydDoge1xuICAgICAgc291cmNlV2lkdGg6IDExNiAqIDIsXG4gICAgICBzb3VyY2VIZWlnaHQ6IDg0ICogMixcbiAgICAgIHNvdXJjZUxlZnQ6IDMwNSAqIDIsXG4gICAgICBzb3VyY2VUb3A6IDQxNyAqIDIsXG4gICAgfSxcbiAgICBub3JtYWw6IHtcbiAgICAgIHNvdXJjZVdpZHRoOiAyODYgKiAyLFxuICAgICAgc291cmNlSGVpZ2h0OiA4NCAqIDIsXG4gICAgICBzb3VyY2VMZWZ0OiA4ICogMixcbiAgICAgIHNvdXJjZVRvcDogNDE3ICogMixcbiAgICB9LFxuICAgIGxvbmc6IHtcbiAgICAgIHNvdXJjZVdpZHRoOiA0OTcgKiAyLFxuICAgICAgc291cmNlSGVpZ2h0OiAxNTMgKiAyLFxuICAgICAgc291cmNlTGVmdDogNiAqIDIsXG4gICAgICBzb3VyY2VUb3A6IDI1NCAqIDIsXG4gICAgfSxcbiAgICBodWdlOiB7XG4gICAgICBzb3VyY2VXaWR0aDogNDk3ICogMixcbiAgICAgIHNvdXJjZUhlaWdodDogMjM5ICogMixcbiAgICAgIHNvdXJjZUxlZnQ6IDYgKiAyLFxuICAgICAgc291cmNlVG9wOiA3ICogMixcbiAgICB9LFxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWJibGVUZXh0TGVuZ3RoKHRleHQ6c3RyaW5nKXtcbiAgICBpZih0ZXh0Lmxlbmd0aCA+PSBtYXhMZW5ndGhIdWdlQnViYmxlKXtcbiAgICAgICAgcmV0dXJuIDQwXG4gICAgfVxuICAgIGVsc2UgaWYodGV4dC5sZW5ndGggPj0gbWF4TGVuZ3RoTG9uZ0J1YmJsZSl7XG4gICAgICAgIHJldHVybiA0MFxuICAgIH1cbiAgICBlbHNlIGlmKHRleHQubGVuZ3RoID49IG1heExlbmd0aE5vcm1hbEJ1YmJsZSl7XG4gICAgICAgIHJldHVybiA0MFxuICAgIH1cbiAgICBlbHNlIGlmKHRleHQubGVuZ3RoID49IG1heExlbmd0aFNob3J0QnViYmxlKXtcbiAgICAgICAgcmV0dXJuIDQwXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0VVZzMihyb3dzOiBudW1iZXIsIGNvbHM6IG51bWJlcikge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBOb3J0aCBzaWRlIG9mIHVucm9ydGF0ZWQgcGxhbmVcbiAgICAgIDAsIC8vbG93ZXItbGVmdCBjb3JuZXJcbiAgICAgIDAsXG4gIFxuICAgICAgY29scywgLy9sb3dlci1yaWdodCBjb3JuZXJcbiAgICAgIDAsXG4gIFxuICAgICAgY29scywgLy91cHBlci1yaWdodCBjb3JuZXJcbiAgICAgIHJvd3MsXG4gIFxuICAgICAgMCwgLy91cHBlciBsZWZ0LWNvcm5lclxuICAgICAgcm93cyxcbiAgXG4gICAgICAvLyBTb3V0aCBzaWRlIG9mIHVucm9ydGF0ZWQgcGxhbmVcbiAgICAgIGNvbHMsIC8vIGxvd2VyLXJpZ2h0IGNvcm5lclxuICAgICAgMCxcbiAgXG4gICAgICAwLCAvLyBsb3dlci1sZWZ0IGNvcm5lclxuICAgICAgMCxcbiAgXG4gICAgICAwLCAvLyB1cHBlci1sZWZ0IGNvcm5lclxuICAgICAgcm93cyxcbiAgXG4gICAgICBjb2xzLCAvLyB1cHBlci1yaWdodCBjb3JuZXJcbiAgICAgIHJvd3MsXG4gICAgXVxuICB9Il19
@@ -1,2 +1,3 @@
1
1
  export declare const IsFollowingPath: import("@dcl/sdk/ecs").MapComponentDefinition<import("@dcl/sdk/ecs").MapResult<{}>>;
2
2
  export declare const IsTypingDialog: import("@dcl/sdk/ecs").MapComponentDefinition<import("@dcl/sdk/ecs").MapResult<{}>>;
3
+ export declare const IsTypingBubble: import("@dcl/sdk/ecs").MapComponentDefinition<import("@dcl/sdk/ecs").MapResult<{}>>;
@@ -1,4 +1,5 @@
1
1
  import { engine } from "@dcl/sdk/ecs";
2
2
  export const IsFollowingPath = engine.defineComponent("isFollowingPath", {});
3
3
  export const IsTypingDialog = engine.defineComponent("isTypingDialog", {});
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDNUUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlbmdpbmUgfSBmcm9tIFwiQGRjbC9zZGsvZWNzXCI7XG5cbmV4cG9ydCBjb25zdCBJc0ZvbGxvd2luZ1BhdGggPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KFwiaXNGb2xsb3dpbmdQYXRoXCIsIHt9KVxuZXhwb3J0IGNvbnN0IElzVHlwaW5nRGlhbG9nID0gZW5naW5lLmRlZmluZUNvbXBvbmVudChcImlzVHlwaW5nRGlhbG9nXCIsIHt9KVxuXG4iXX0=
4
+ export const IsTypingBubble = engine.defineComponent("isTypingBubble", {});
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDNUUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDMUUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlbmdpbmUgfSBmcm9tIFwiQGRjbC9zZGsvZWNzXCI7XG5cbmV4cG9ydCBjb25zdCBJc0ZvbGxvd2luZ1BhdGggPSBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KFwiaXNGb2xsb3dpbmdQYXRoXCIsIHt9KVxuZXhwb3J0IGNvbnN0IElzVHlwaW5nRGlhbG9nID0gZW5naW5lLmRlZmluZUNvbXBvbmVudChcImlzVHlwaW5nRGlhbG9nXCIsIHt9KVxuZXhwb3J0IGNvbnN0IElzVHlwaW5nQnViYmxlID0gZW5naW5lLmRlZmluZUNvbXBvbmVudChcImlzVHlwaW5nQnViYmxlXCIsIHt9KVxuXG5cbiJdfQ==
package/dist/dialog.d.ts CHANGED
@@ -23,6 +23,7 @@ export declare function getTextPosition(): {
23
23
  export declare function buttonClick(button: number): void;
24
24
  export declare function closeDialog(npc: Entity): void;
25
25
  export declare function talk(npc: Entity, dialog: Dialog[], startIndex?: number, duration?: number): void;
26
+ export declare function addLineBreaks(dialog: Dialog[], bubble?: boolean): Dialog[];
26
27
  export declare function handleDialogClick(): void;
27
28
  export declare function confirmText(npc: Entity, mode: ConfirmMode): void;
28
29
  export type ImageAtlasData = {