@smarterplan/ngx-smarterplan-core 1.4.11 → 1.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/esm2022/lib/services/matterport-import.service.mjs +2 -57
  2. package/esm2022/lib/services/matterport-navigation.service.mjs +131 -1
  3. package/esm2022/lib/services/matterport-tag-copy.service.mjs +865 -0
  4. package/esm2022/lib/services/matterport-tag.service.mjs +175 -54
  5. package/esm2022/lib/services/matterport.service.mjs +267 -39
  6. package/esm2022/lib/services/models/equipment.service.mjs +16 -1
  7. package/esm2022/lib/services/models/navigation.service.mjs +4 -1
  8. package/esm2022/lib/services/models/poi.service.mjs +86 -8
  9. package/esm2022/lib/services/models/ticket.service.mjs +3 -2
  10. package/esm2022/lib/services/s3.service.mjs +12 -1
  11. package/esm2022/lib/services/utils/matterport-transform.util.mjs +39 -0
  12. package/esm2022/lib/services/viewer.service.mjs +8 -1
  13. package/esm2022/lib/types.service.mjs +9 -1
  14. package/esm2022/public-api.mjs +4 -1
  15. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +1590 -156
  16. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  17. package/lib/services/matterport-navigation.service.d.ts +25 -0
  18. package/lib/services/matterport-tag-copy.service.d.ts +129 -0
  19. package/lib/services/matterport-tag.service.d.ts +61 -7
  20. package/lib/services/matterport.service.d.ts +81 -1
  21. package/lib/services/models/equipment.service.d.ts +8 -0
  22. package/lib/services/models/poi.service.d.ts +14 -0
  23. package/lib/services/s3.service.d.ts +8 -0
  24. package/lib/services/utils/matterport-transform.util.d.ts +21 -0
  25. package/lib/types.service.d.ts +18 -0
  26. package/package.json +1 -1
  27. package/public-api.d.ts +2 -0
@@ -145,6 +145,9 @@ export class MatterportNavigationService {
145
145
  else {
146
146
  console.warn('No matterport floor found to move to');
147
147
  }
148
+ console.log("action_go_to_floor.floorMatterport", floorMatterport);
149
+ console.log("action_go_to_floor.floorName", floorName);
150
+ console.log("action_go_to_floor.matterportFloorSequence", matterportFloorSequence);
148
151
  }
149
152
  /**
150
153
  * Navigate to a sweep. The caller can pass either a sid or a uuid;
@@ -175,6 +178,9 @@ export class MatterportNavigationService {
175
178
  await sdk.Camera.setRotation(rotation, { speed: 100 });
176
179
  }
177
180
  }, 1000);
181
+ console.log("action_go_to_sweep.sweep", sweep);
182
+ console.log("action_go_to_sweep.rotation", rotation);
183
+ console.log("action_go_to_sweep.resolvedSid", resolvedSid);
178
184
  }
179
185
  /**
180
186
  * Disable forbidden sweeps. Resolves each sweep ID to sid before calling SDK.
@@ -194,6 +200,130 @@ export class MatterportNavigationService {
194
200
  }));
195
201
  console.log('removed sweeps:', removed);
196
202
  }
203
+ /**
204
+ * Move to a position
205
+ * @param sdk
206
+ * @param position
207
+ * @param rotation
208
+ * @param options
209
+ */
210
+ async move_to_position(sdk, position, rotation, options) {
211
+ // Validate SDK
212
+ if (!sdk) {
213
+ throw new Error('Matterport SDK instance is required');
214
+ }
215
+ // Merge options with defaults
216
+ const { transition = 'FLY', durationMs = 800, anglesInDegrees = true, offset = { x: 0, y: 0, z: 0 } } = options || {};
217
+ const degToRad = (d) => d * Math.PI / 180;
218
+ // Prepare rotation values (default to 0 when not provided)
219
+ const yaw = rotation?.yaw ?? 0;
220
+ const pitch = rotation?.pitch ?? 0;
221
+ const roll = rotation?.roll ?? 0;
222
+ // Convert to radians if angles are provided in degrees
223
+ const rotYaw = anglesInDegrees ? degToRad(yaw) : yaw;
224
+ const rotPitch = anglesInDegrees ? degToRad(pitch) : pitch;
225
+ const rotRoll = anglesInDegrees ? degToRad(roll) : roll;
226
+ // Preserve previous transition flag and mark as in-transition
227
+ const prevInTransition = this.inTransitionMode;
228
+ this.inTransitionMode = true;
229
+ try {
230
+ // Attempt to use Camera.lookAt when available
231
+ if (sdk?.Camera?.lookAt) {
232
+ const lookAtOpts = {};
233
+ // Prefer SDK constants when available, otherwise use fallback string
234
+ if (sdk.Camera.TransitionType && sdk.Camera.TransitionType[transition]) {
235
+ lookAtOpts.transition = sdk.Camera.TransitionType[transition];
236
+ }
237
+ else {
238
+ lookAtOpts.transition = transition;
239
+ }
240
+ lookAtOpts.duration = durationMs;
241
+ if (offset)
242
+ lookAtOpts.offset = offset;
243
+ try {
244
+ await sdk.Camera.lookAt(position, lookAtOpts);
245
+ }
246
+ catch (err) {
247
+ // If lookAt fails, continue to fallbacks below
248
+ if (isDevMode())
249
+ console.debug('Camera.lookAt failed, falling back to setState', err);
250
+ }
251
+ }
252
+ // If lookAt is not present or failed, try setState for position
253
+ if (!sdk?.Camera?.lookAt && sdk?.Camera?.setState) {
254
+ const statePos = {
255
+ position: { x: position.x, y: position.y, z: position.z }
256
+ };
257
+ try {
258
+ await sdk.Camera.setState(statePos);
259
+ }
260
+ catch (err) {
261
+ if (isDevMode())
262
+ console.debug('Camera.setState(position) failed', err);
263
+ }
264
+ }
265
+ // Apply rotation if provided
266
+ if (rotation) {
267
+ // Prefer setRotation when available
268
+ if (sdk?.Camera?.setRotation) {
269
+ // Try Vector2 signature { x: yaw, y: pitch } first
270
+ try {
271
+ await sdk.Camera.setRotation({ x: rotYaw, y: rotPitch }, { speed: Math.max(10, Math.floor(durationMs / 10)) });
272
+ }
273
+ catch (err1) {
274
+ // If that fails, try Vector3 signature { x: pitch, y: yaw, z: roll }
275
+ try {
276
+ await sdk.Camera.setRotation({ x: rotPitch, y: rotYaw, z: rotRoll }, { speed: Math.max(10, Math.floor(durationMs / 10)) });
277
+ }
278
+ catch (err2) {
279
+ if (isDevMode())
280
+ console.debug('Camera.setRotation failed with multiple signatures', err1, err2);
281
+ // Fallback to setState with rotation if available
282
+ if (sdk?.Camera?.setState) {
283
+ try {
284
+ await sdk.Camera.setState({
285
+ rotation: { x: rotPitch, y: rotYaw, z: rotRoll },
286
+ position: { x: position.x, y: position.y, z: position.z }
287
+ });
288
+ }
289
+ catch (err3) {
290
+ if (isDevMode())
291
+ console.debug('Fallback Camera.setState(rotation) failed', err3);
292
+ }
293
+ }
294
+ }
295
+ }
296
+ }
297
+ else if (sdk?.Camera?.setState) {
298
+ // If setRotation is not available, use setState to apply rotation
299
+ try {
300
+ await sdk.Camera.setState({
301
+ rotation: { x: rotPitch, y: rotYaw, z: rotRoll },
302
+ position: { x: position.x, y: position.y, z: position.z }
303
+ });
304
+ }
305
+ catch (err) {
306
+ if (isDevMode())
307
+ console.debug('Camera.setState(rotation) failed', err);
308
+ }
309
+ }
310
+ else {
311
+ if (isDevMode())
312
+ console.warn('No method available to apply rotation (setRotation/setState not found)');
313
+ }
314
+ }
315
+ // Wait a bit to allow transition animations to complete
316
+ await wait(durationMs + 120);
317
+ }
318
+ catch (err) {
319
+ // Re-throw after ensuring flags are restored in finally
320
+ throw err;
321
+ }
322
+ finally {
323
+ // Restore previous transition flag
324
+ this.inTransitionMode = prevInTransition;
325
+ }
326
+ }
197
327
  /**
198
328
  * Returns the current sweep as a **uuid** (for database matching).
199
329
  * The SDK's poseCamera.sweep is a sid; we translate it.
@@ -233,4 +363,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
233
363
  providedIn: 'root',
234
364
  }]
235
365
  }], ctorParameters: () => [] });
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC1uYXZpZ2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL21hdHRlcnBvcnQtbmF2aWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFLMUMsTUFBTSxPQUFPLDJCQUEyQjtJQUMvQixlQUFlLEdBQVEsSUFBSSxDQUFDO0lBQzVCLE1BQU0sR0FBeUIsSUFBSSxDQUFDO0lBQ3BDLE1BQU0sR0FBaUUsSUFBSSxDQUFDO0lBQzVFLGVBQWUsR0FBYSxFQUFFLENBQUM7SUFFL0IsWUFBWSxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzlDLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7SUFDdkQsMEVBQTBFO0lBQ25FLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUyxDQUFDO0lBRXJDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDMUIsaUJBQWlCLEdBQWUsVUFBVSxDQUFDLE9BQU8sQ0FBQztJQUNuRCxZQUFZLEdBQVUsRUFBRSxDQUFDO0lBQ2hDLDRHQUE0RztJQUNyRyxvQkFBb0IsR0FBa0IsSUFBSSxDQUFDO0lBRWxELDZDQUE2QztJQUM3QyxxR0FBcUc7SUFDckcsMkdBQTJHO0lBQ25HLFNBQVMsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMzQyxTQUFTLEdBQXdCLElBQUksR0FBRyxF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Z0JBQzlDLE1BQU07WUFDUixLQUFLLGFBQWE7Z0JBQ2hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO2dCQUMzQyxNQUFNO1lBQ1IsS0FBSyxvQkFBb0I7Z0JBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO2dCQUNsRCxNQUFNO1lBQ1I7Z0JBQ0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDaEQsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDeEQsQ0FBQzt3R0F4T1UsMkJBQTJCOzRHQUEzQiwyQkFBMkIsY0FGMUIsTUFBTTs7NEZBRVAsMkJBQTJCO2tCQUh2QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENhbWVyYU1vZGUgfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgd2FpdCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlIHtcclxuICBwdWJsaWMgc3dlZXBDb2xsZWN0aW9uOiBhbnkgPSBudWxsO1xyXG4gIHB1YmxpYyBzd2VlcHM6IEFycmF5PHN0cmluZz4gfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgZmxvb3JzOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgc2VxdWVuY2U6IG51bWJlciB9PiB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBmb3JiaWRkZW5Td2VlcHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50U3dlZXA6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHVibGljIG9uQ2FtZXJhTW9kZUNoYW5nZWQgPSBuZXcgU3ViamVjdDxDYW1lcmFNb2RlPigpO1xyXG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgc2V0IG9mIGN1cnJlbnQgcm9vbXMgY2hhbmdlcyAoc2RrLlJvb20uY3VycmVudCkuICovXHJcbiAgcHVibGljIG9uUm9vbUNoYW5nZWQgPSBuZXcgU3ViamVjdDxhbnlbXT4oKTtcclxuXHJcbiAgcHVibGljIGluVHJhbnNpdGlvbk1vZGUgPSBmYWxzZTtcclxuICBwdWJsaWMgaW5UcmFuc2l0aW9uU3dlZXAgPSBmYWxzZTtcclxuICBwdWJsaWMgY3VycmVudENhbWVyYU1vZGU6IENhbWVyYU1vZGUgPSBDYW1lcmFNb2RlLk9VVFNJREU7XHJcbiAgcHVibGljIGN1cnJlbnRSb29tczogYW55W10gPSBbXTtcclxuICAvKiogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBmbG9vciBjdXJyZW50bHkgdmlzaWJsZSBpbiBzZGsuRmxvb3IuY3VycmVudCAobnVsbCA9IHNpbmdsZS1mbG9vciBvciB1bmtub3duKS4gKi9cclxuICBwdWJsaWMgY3VycmVudEZsb29yU2VxdWVuY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDilIDilIAgQmlkaXJlY3Rpb25hbCBzaWQg4oaUIHV1aWQgbG9va3VwIG1hcHMg4pSA4pSAXHJcbiAgLy8gc2lkICA9IHNob3J0IHJ1bnRpbWUga2V5IHVzZWQgYnkgTWF0dGVycG9ydCBTREsgKGNvbGxlY3Rpb24ga2V5cywgU3dlZXAubW92ZVRvLCBDYW1lcmEucG9zZS5zd2VlcClcclxuICAvLyB1dWlkID0gcGVyc2lzdGVudCBpZGVudGlmaWVyIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UgKHpvbmUuc3dlZXBJRHMsIHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCwgc3RhcnRTd2VlcElEKVxyXG4gIHByaXZhdGUgc2lkVG9VdWlkOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgdXVpZFRvU2lkOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAvLyDilIDilIAgU3dlZXAgSUQgdHJhbnNsYXRpb24gaGVscGVycyDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIHRoZSBiaWRpcmVjdGlvbmFsIHNpZCDihpQgdXVpZCBtYXBzIGZyb20gdGhlIHN3ZWVwIGNvbGxlY3Rpb24uXHJcbiAgICogTXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgc3dlZXAgY29sbGVjdGlvbiBpcyB1cGRhdGVkLlxyXG4gICAqL1xyXG4gIGJ1aWxkU3dlZXBJZE1hcHMoY29sbGVjdGlvbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNpZFRvVXVpZC5jbGVhcigpO1xyXG4gICAgdGhpcy51dWlkVG9TaWQuY2xlYXIoKTtcclxuICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuO1xyXG4gICAgZm9yIChjb25zdCBzaWQgb2YgT2JqZWN0LmtleXMoY29sbGVjdGlvbikpIHtcclxuICAgICAgY29uc3Qgc3dlZXBEYXRhID0gY29sbGVjdGlvbltzaWRdO1xyXG4gICAgICBjb25zdCB1dWlkID0gc3dlZXBEYXRhPy51dWlkO1xyXG4gICAgICBpZiAodXVpZCAmJiB1dWlkICE9PSBzaWQpIHtcclxuICAgICAgICB0aGlzLnNpZFRvVXVpZC5zZXQoc2lkLCB1dWlkKTtcclxuICAgICAgICB0aGlzLnV1aWRUb1NpZC5zZXQodXVpZCwgc2lkKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBBbHNvIG1hcCBzaWTihpJzaWQgYW5kIHV1aWTihpJ1dWlkIGZvciBwYXNzLXRocm91Z2ggY2FzZXNcclxuICAgICAgdGhpcy5zaWRUb1V1aWQuc2V0KHNpZCwgdXVpZCB8fCBzaWQpO1xyXG4gICAgICBpZiAodXVpZCkge1xyXG4gICAgICAgIHRoaXMudXVpZFRvU2lkLnNldCh1dWlkLCBzaWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhgW01hdHRlcnBvcnROYXZpZ2F0aW9uXSBCdWlsdCBzd2VlcCBJRCBtYXBzOiAke3RoaXMuc2lkVG9VdWlkLnNpemV9IHNpZHMsICR7dGhpcy51dWlkVG9TaWQuc2l6ZX0gdXVpZHNgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc29sdmVzIGFueSBzd2VlcCBpZGVudGlmaWVyIChzaWQgb3IgdXVpZCkgdG8gdGhlIFNESyBydW50aW1lICoqc2lkKiouXHJcbiAgICogVGhpcyBpcyB3aGF0IHNkay5Td2VlcC5tb3ZlVG8oKSBhbmQgc2RrLlN3ZWVwLmRpc2FibGUoKSBleHBlY3QuXHJcbiAgICogRmFsbHMgYmFjayB0byB0aGUgaW5wdXQgaWYgbm8gbWFwcGluZyBleGlzdHMuXHJcbiAgICovXHJcbiAgcmVzb2x2ZVN3ZWVwU2lkKGlkT3JVdWlkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFpZE9yVXVpZCkgcmV0dXJuIGlkT3JVdWlkO1xyXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IGEga25vd24gc2lkIChleGlzdHMgYXMgYSBrZXkgaW4gc3dlZXBDb2xsZWN0aW9uKSwgcmV0dXJuIGl0XHJcbiAgICBpZiAodGhpcy5zaWRUb1V1aWQuaGFzKGlkT3JVdWlkKSkgcmV0dXJuIGlkT3JVdWlkO1xyXG4gICAgLy8gT3RoZXJ3aXNlIHRyeSB0byBtYXAgZnJvbSB1dWlkIOKGkiBzaWRcclxuICAgIHJldHVybiB0aGlzLnV1aWRUb1NpZC5nZXQoaWRPclV1aWQpID8/IGlkT3JVdWlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZXMgYW55IHN3ZWVwIGlkZW50aWZpZXIgKHNpZCBvciB1dWlkKSB0byB0aGUgcGVyc2lzdGVudCAqKnV1aWQqKi5cclxuICAgKiBUaGlzIGlzIHdoYXQgdGhlIGRhdGFiYXNlIHN0b3JlcyAoem9uZS5zd2VlcElEcywgcG9pLm1hdHRlcnBvcnRTd2VlcElEKS5cclxuICAgKiBGYWxscyBiYWNrIHRvIHRoZSBpbnB1dCBpZiBubyBtYXBwaW5nIGV4aXN0cy5cclxuICAgKi9cclxuICByZXNvbHZlU3dlZXBVdWlkKHNpZE9yVXVpZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc2lkT3JVdWlkKSByZXR1cm4gc2lkT3JVdWlkO1xyXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IGEga25vd24gdXVpZCwgcmV0dXJuIGl0XHJcbiAgICBpZiAodGhpcy51dWlkVG9TaWQuaGFzKHNpZE9yVXVpZCkpIHJldHVybiBzaWRPclV1aWQ7XHJcbiAgICAvLyBPdGhlcndpc2UgdHJ5IHRvIG1hcCBmcm9tIHNpZCDihpIgdXVpZFxyXG4gICAgcmV0dXJuIHRoaXMuc2lkVG9VdWlkLmdldChzaWRPclV1aWQpID8/IHNpZE9yVXVpZDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl90b29sYm94X2Zsb29ycGxhbihzZGs6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuaW5UcmFuc2l0aW9uTW9kZSB8fCB0aGlzLmluVHJhbnNpdGlvblN3ZWVwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd2aWV3ZXIgaXMgaW4gdHJhbnNpdGlvbiwgY2Fubm90IGdvIGZsb29ycGxhbicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCBzZGsuTW9kZS5tb3ZlVG8oJ21vZGUuZmxvb3JwbGFuJyk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdjYW5ub3QgZ28gdG8gZmxvb3JwbGFuJywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldyhzZGs6IGFueSkge1xyXG4gICAgc2RrLk1vZGUubW92ZVRvKCdtb2RlLmluc2lkZScpO1xyXG4gIH1cclxuXHJcbiAgYWN0aW9uU2hvd0FsbEZsb29ycyhzZGs6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgc2RrLkZsb29yLnNob3dBbGwoKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2Nhbm5vdCBzaG93IGFsbCBmbG9vcnMnLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl90b29sYm94X2RvbGxob3VzZShzZGs6IGFueSkge1xyXG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmluVHJhbnNpdGlvbk1vZGUgfHwgdGhpcy5pblRyYW5zaXRpb25Td2VlcCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCd2aWV3ZXIgaXMgaW4gdHJhbnNpdGlvbiwgY2Fubm90IGdvIGRvbGxob3VzZScpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHNkay5Nb2RlLm1vdmVUbygnbW9kZS5kb2xsaG91c2UnKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdjYW5ub3QgZ28gdG8gZG9sbGhvdXNlJywgZSk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEyMDApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWN0aW9uX2dvX3RvX2Zsb29yKHNkazogYW55LCBmbG9vck5hbWU6IHN0cmluZywgbWF0dGVycG9ydEZsb29yU2VxdWVuY2U6IG51bWJlciA9IG51bGwpIHtcclxuICAgIGlmICghdGhpcy5mbG9vcnMpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0Zsb29yIGFyZSBub3QgbG9hZGVkIHlldCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgZmxvb3JNYXR0ZXJwb3J0ID0gdGhpcy5mbG9vcnMuZmluZChcclxuICAgICAgKGZsb29yKSA9PiBmbG9vci5zZXF1ZW5jZSA9PT0gbWF0dGVycG9ydEZsb29yU2VxdWVuY2VcclxuICAgICk7XHJcbiAgICBpZiAoIWZsb29yTWF0dGVycG9ydCkge1xyXG4gICAgICBmbG9vck1hdHRlcnBvcnQgPSB0aGlzLmZsb29ycy5maW5kKFxyXG4gICAgICAgIChmbG9vcikgPT4gZmxvb3JOYW1lLmluY2x1ZGVzKGZsb29yLm5hbWUpICYmIGZsb29yLm5hbWUgIT0gJydcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICghZmxvb3JNYXR0ZXJwb3J0KSB7XHJcbiAgICAgIGZsb29yTWF0dGVycG9ydCA9IHRoaXMuZmxvb3JzLmZpbmQoKGZsb29yKSA9PlxyXG4gICAgICAgIGZsb29yTmFtZS5pbmNsdWRlcyhmbG9vci5pZClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChmbG9vck1hdHRlcnBvcnQpIHtcclxuICAgICAgbGV0IHJldHJ5ID0gdHJ1ZTtcclxuICAgICAgd2hpbGUgKHJldHJ5KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGZsb29ySW5kZXggPSBhd2FpdCBzZGsuRmxvb3IubW92ZVRvKGZsb29yTWF0dGVycG9ydC5zZXF1ZW5jZSk7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKFwibW92ZWQgdG8gZmxvb3JJbmRleFwiLCBmbG9vckluZGV4KTtcclxuICAgICAgICAgIHJldHJ5ID0gZmFsc2U7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdDYW5ub3QgbW92ZSB0byBGbG9vcicsIGVycm9yKTtcclxuICAgICAgICAgIGF3YWl0IHdhaXQoMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTm8gbWF0dGVycG9ydCBmbG9vciBmb3VuZCB0byBtb3ZlIHRvJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOYXZpZ2F0ZSB0byBhIHN3ZWVwLiBUaGUgY2FsbGVyIGNhbiBwYXNzIGVpdGhlciBhIHNpZCBvciBhIHV1aWQ7XHJcbiAgICogdGhpcyBtZXRob2QgcmVzb2x2ZXMgaXQgdG8gdGhlIFNESyBzaWQgYmVmb3JlIGNhbGxpbmcgU3dlZXAubW92ZVRvKCkuXHJcbiAgICovXHJcbiAgYXN5bmMgYWN0aW9uX2dvX3RvX3N3ZWVwKHNkazogYW55LCBzd2VlcDogc3RyaW5nLCByb3RhdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSB8IG51bGwpIHtcclxuICAgIGNvbnN0IHJlc29sdmVkU2lkID0gdGhpcy5yZXNvbHZlU3dlZXBTaWQoc3dlZXApO1xyXG4gICAgaWYgKHRoaXMuZm9yYmlkZGVuU3dlZXBzLmluY2x1ZGVzKHN3ZWVwKSB8fCB0aGlzLmZvcmJpZGRlblN3ZWVwcy5pbmNsdWRlcyhyZXNvbHZlZFNpZCkpIHtcclxuICAgICAgY29uc29sZS5sb2coJ3VzZXIgaXMgbm90IGFsbG93ZWQgdG8gZ28gdG8gdGhpcyBzd2VlcCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgcmVzb2x2ZWRTaWQgIT09IHN3ZWVwKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYFthY3Rpb25fZ29fdG9fc3dlZXBdIFJlc29sdmVkIHV1aWQgXCIke3N3ZWVwfVwiIOKGkiBzaWQgXCIke3Jlc29sdmVkU2lkfVwiYCk7XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmluVHJhbnNpdGlvblN3ZWVwID0gdHJ1ZTtcclxuICAgICAgICBhd2FpdCBzZGsuU3dlZXAubW92ZVRvKHJlc29sdmVkU2lkLCB7XHJcbiAgICAgICAgICB0cmFuc2l0aW9uOiBzZGsuQ2FtZXJhLlRyYW5zaXRpb25UeXBlLklOU1RBTlQsXHJcbiAgICAgICAgICB0cmFuc2l0aW9uVGltZTogMTUwMFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIHRoaXMuaW5UcmFuc2l0aW9uU3dlZXAgPSBmYWxzZTtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ2Fubm90IG1vdmUgdG8gc3dlZXAnLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJvdGF0aW9uKSB7XHJcbiAgICAgICAgYXdhaXQgc2RrLkNhbWVyYS5zZXRSb3RhdGlvbihyb3RhdGlvbiwgeyBzcGVlZDogMTAwIH0pO1xyXG4gICAgICB9XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc2FibGUgZm9yYmlkZGVuIHN3ZWVwcy4gUmVzb2x2ZXMgZWFjaCBzd2VlcCBJRCB0byBzaWQgYmVmb3JlIGNhbGxpbmcgU0RLLlxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZUZvcmJpZGRlblN3ZWVwcyhzZGs6IGFueSwgZm9yYmlkZGVuU3dlZXBzOiBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5mb3JiaWRkZW5Td2VlcHMgPSBbLi4uZm9yYmlkZGVuU3dlZXBzXTtcclxuICAgIGxldCByZW1vdmVkID0gMDtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBmb3JiaWRkZW5Td2VlcHMubWFwKGFzeW5jIChzd2VlcCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkU2lkID0gdGhpcy5yZXNvbHZlU3dlZXBTaWQoc3dlZXApO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCBzZGsuU3dlZXAuZGlzYWJsZShyZXNvbHZlZFNpZCk7XHJcbiAgICAgICAgICByZW1vdmVkICs9IDE7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gICAgY29uc29sZS5sb2coJ3JlbW92ZWQgc3dlZXBzOicsIHJlbW92ZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzd2VlcCBhcyBhICoqdXVpZCoqIChmb3IgZGF0YWJhc2UgbWF0Y2hpbmcpLlxyXG4gICAqIFRoZSBTREsncyBwb3NlQ2FtZXJhLnN3ZWVwIGlzIGEgc2lkOyB3ZSB0cmFuc2xhdGUgaXQuXHJcbiAgICovXHJcbiAgZ2V0Q3VycmVudFN3ZWVwKHBvc2VDYW1lcmE6IGFueSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3Qgc2lkID0gcG9zZUNhbWVyYT8uc3dlZXAgfHwgbnVsbDtcclxuICAgIGlmICghc2lkKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLnJlc29sdmVTd2VlcFV1aWQoc2lkKTtcclxuICB9XHJcblxyXG4gIHNldENhbWVyYU1vZGUobW9kZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmluVHJhbnNpdGlvblN3ZWVwID0gZmFsc2U7XHJcbiAgICBzd2l0Y2ggKG1vZGUpIHtcclxuICAgICAgY2FzZSAnbW9kZS5kb2xsaG91c2UnOlxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1vZGUgPSBDYW1lcmFNb2RlLkRPTExIT1VTRTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbW9kZS5mbG9vcnBsYW4nOlxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1vZGUgPSBDYW1lcmFNb2RlLkZMT09SUExBTjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbW9kZS5pbnNpZGUnOlxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1vZGUgPSBDYW1lcmFNb2RlLklOU0lERTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbW9kZS50cmFuc2l0aW9uaW5nJzpcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYW1lcmFNb2RlID0gQ2FtZXJhTW9kZS5UUkFOU0lUSU9OSU5HO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1vZGUgPSBDYW1lcmFNb2RlLk9VVFNJREU7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uQ2FtZXJhTW9kZUNoYW5nZWQubmV4dCh0aGlzLmN1cnJlbnRDYW1lcmFNb2RlKTtcclxuICB9XHJcbn1cclxuIl19
366
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC1uYXZpZ2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL21hdHRlcnBvcnQtbmF2aWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFLMUMsTUFBTSxPQUFPLDJCQUEyQjtJQUMvQixlQUFlLEdBQVEsSUFBSSxDQUFDO0lBQzVCLE1BQU0sR0FBeUIsSUFBSSxDQUFDO0lBQ3BDLE1BQU0sR0FBaUUsSUFBSSxDQUFDO0lBQzVFLGVBQWUsR0FBYSxFQUFFLENBQUM7SUFFL0IsWUFBWSxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzlDLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7SUFDdkQsMEVBQTBFO0lBQ25FLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUyxDQUFDO0lBRXJDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDMUIsaUJBQWlCLEdBQWUsVUFBVSxDQUFDLE9BQU8sQ0FBQztJQUNuRCxZQUFZLEdBQVUsRUFBRSxDQUFDO0lBQ2hDLDRHQUE0RztJQUNyRyxvQkFBb0IsR0FBa0IsSUFBSSxDQUFDO0lBRWxELDZDQUE2QztJQUM3QyxxR0FBcUc7SUFDckcsMkdBQTJHO0lBQ25HLFNBQVMsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMzQyxTQUFTLEdBQXdCLElBQUksR0FBRyxF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LENBQUMsTUFBTSxDQUFDO2dCQUMzQyxNQUFNO1lBQ1IsS0FBSyxvQkFBb0I7Z0JBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO2dCQUNsRCxNQUFNO1lBQ1I7Z0JBQ0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDaEQsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDeEQsQ0FBQzt3R0FuWFUsMkJBQTJCOzRHQUEzQiwyQkFBMkIsY0FGMUIsTUFBTTs7NEZBRVAsMkJBQTJCO2tCQUh2QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENhbWVyYU1vZGUgfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgd2FpdCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlIHtcclxuICBwdWJsaWMgc3dlZXBDb2xsZWN0aW9uOiBhbnkgPSBudWxsO1xyXG4gIHB1YmxpYyBzd2VlcHM6IEFycmF5PHN0cmluZz4gfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgZmxvb3JzOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgc2VxdWVuY2U6IG51bWJlciB9PiB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBmb3JiaWRkZW5Td2VlcHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50U3dlZXA6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHVibGljIG9uQ2FtZXJhTW9kZUNoYW5nZWQgPSBuZXcgU3ViamVjdDxDYW1lcmFNb2RlPigpO1xyXG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgc2V0IG9mIGN1cnJlbnQgcm9vbXMgY2hhbmdlcyAoc2RrLlJvb20uY3VycmVudCkuICovXHJcbiAgcHVibGljIG9uUm9vbUNoYW5nZWQgPSBuZXcgU3ViamVjdDxhbnlbXT4oKTtcclxuXHJcbiAgcHVibGljIGluVHJhbnNpdGlvbk1vZGUgPSBmYWxzZTtcclxuICBwdWJsaWMgaW5UcmFuc2l0aW9uU3dlZXAgPSBmYWxzZTtcclxuICBwdWJsaWMgY3VycmVudENhbWVyYU1vZGU6IENhbWVyYU1vZGUgPSBDYW1lcmFNb2RlLk9VVFNJREU7XHJcbiAgcHVibGljIGN1cnJlbnRSb29tczogYW55W10gPSBbXTtcclxuICAvKiogU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBmbG9vciBjdXJyZW50bHkgdmlzaWJsZSBpbiBzZGsuRmxvb3IuY3VycmVudCAobnVsbCA9IHNpbmdsZS1mbG9vciBvciB1bmtub3duKS4gKi9cclxuICBwdWJsaWMgY3VycmVudEZsb29yU2VxdWVuY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDilIDilIAgQmlkaXJlY3Rpb25hbCBzaWQg4oaUIHV1aWQgbG9va3VwIG1hcHMg4pSA4pSAXHJcbiAgLy8gc2lkICA9IHNob3J0IHJ1bnRpbWUga2V5IHVzZWQgYnkgTWF0dGVycG9ydCBTREsgKGNvbGxlY3Rpb24ga2V5cywgU3dlZXAubW92ZVRvLCBDYW1lcmEucG9zZS5zd2VlcClcclxuICAvLyB1dWlkID0gcGVyc2lzdGVudCBpZGVudGlmaWVyIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UgKHpvbmUuc3dlZXBJRHMsIHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCwgc3RhcnRTd2VlcElEKVxyXG4gIHByaXZhdGUgc2lkVG9VdWlkOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgdXVpZFRvU2lkOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAvLyDilIDilIAgU3dlZXAgSUQgdHJhbnNsYXRpb24gaGVscGVycyDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIHRoZSBiaWRpcmVjdGlvbmFsIHNpZCDihpQgdXVpZCBtYXBzIGZyb20gdGhlIHN3ZWVwIGNvbGxlY3Rpb24uXHJcbiAgICogTXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgc3dlZXAgY29sbGVjdGlvbiBpcyB1cGRhdGVkLlxyXG4gICAqL1xyXG4gIGJ1aWxkU3dlZXBJZE1hcHMoY29sbGVjdGlvbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNpZFRvVXVpZC5jbGVhcigpO1xyXG4gICAgdGhpcy51dWlkVG9TaWQuY2xlYXIoKTtcclxuICAgIGlmICghY29sbGVjdGlvbikgcmV0dXJuO1xyXG4gICAgZm9yIChjb25zdCBzaWQgb2YgT2JqZWN0LmtleXMoY29sbGVjdGlvbikpIHtcclxuICAgICAgY29uc3Qgc3dlZXBEYXRhID0gY29sbGVjdGlvbltzaWRdO1xyXG4gICAgICBjb25zdCB1dWlkID0gc3dlZXBEYXRhPy51dWlkO1xyXG4gICAgICBpZiAodXVpZCAmJiB1dWlkICE9PSBzaWQpIHtcclxuICAgICAgICB0aGlzLnNpZFRvVXVpZC5zZXQoc2lkLCB1dWlkKTtcclxuICAgICAgICB0aGlzLnV1aWRUb1NpZC5zZXQodXVpZCwgc2lkKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBBbHNvIG1hcCBzaWTihpJzaWQgYW5kIHV1aWTihpJ1dWlkIGZvciBwYXNzLXRocm91Z2ggY2FzZXNcclxuICAgICAgdGhpcy5zaWRUb1V1aWQuc2V0KHNpZCwgdXVpZCB8fCBzaWQpO1xyXG4gICAgICBpZiAodXVpZCkge1xyXG4gICAgICAgIHRoaXMudXVpZFRvU2lkLnNldCh1dWlkLCBzaWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhgW01hdHRlcnBvcnROYXZpZ2F0aW9uXSBCdWlsdCBzd2VlcCBJRCBtYXBzOiAke3RoaXMuc2lkVG9VdWlkLnNpemV9IHNpZHMsICR7dGhpcy51dWlkVG9TaWQuc2l6ZX0gdXVpZHNgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc29sdmVzIGFueSBzd2VlcCBpZGVudGlmaWVyIChzaWQgb3IgdXVpZCkgdG8gdGhlIFNESyBydW50aW1lICoqc2lkKiouXHJcbiAgICogVGhpcyBpcyB3aGF0IHNkay5Td2VlcC5tb3ZlVG8oKSBhbmQgc2RrLlN3ZWVwLmRpc2FibGUoKSBleHBlY3QuXHJcbiAgICogRmFsbHMgYmFjayB0byB0aGUgaW5wdXQgaWYgbm8gbWFwcGluZyBleGlzdHMuXHJcbiAgICovXHJcbiAgcmVzb2x2ZVN3ZWVwU2lkKGlkT3JVdWlkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFpZE9yVXVpZCkgcmV0dXJuIGlkT3JVdWlkO1xyXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IGEga25vd24gc2lkIChleGlzdHMgYXMgYSBrZXkgaW4gc3dlZXBDb2xsZWN0aW9uKSwgcmV0dXJuIGl0XHJcbiAgICBpZiAodGhpcy5zaWRUb1V1aWQuaGFzKGlkT3JVdWlkKSkgcmV0dXJuIGlkT3JVdWlkO1xyXG4gICAgLy8gT3RoZXJ3aXNlIHRyeSB0byBtYXAgZnJvbSB1dWlkIOKGkiBzaWRcclxuICAgIHJldHVybiB0aGlzLnV1aWRUb1NpZC5nZXQoaWRPclV1aWQpID8/IGlkT3JVdWlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZXMgYW55IHN3ZWVwIGlkZW50aWZpZXIgKHNpZCBvciB1dWlkKSB0byB0aGUgcGVyc2lzdGVudCAqKnV1aWQqKi5cclxuICAgKiBUaGlzIGlzIHdoYXQgdGhlIGRhdGFiYXNlIHN0b3JlcyAoem9uZS5zd2VlcElEcywgcG9pLm1hdHRlcnBvcnRTd2VlcElEKS5cclxuICAgKiBGYWxscyBiYWNrIHRvIHRoZSBpbnB1dCBpZiBubyBtYXBwaW5nIGV4aXN0cy5cclxuICAgKi9cclxuICByZXNvbHZlU3dlZXBVdWlkKHNpZE9yVXVpZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc2lkT3JVdWlkKSByZXR1cm4gc2lkT3JVdWlkO1xyXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IGEga25vd24gdXVpZCwgcmV0dXJuIGl0XHJcbiAgICBpZiAodGhpcy51dWlkVG9TaWQuaGFzKHNpZE9yVXVpZCkpIHJldHVybiBzaWRPclV1aWQ7XHJcbiAgICAvLyBPdGhlcndpc2UgdHJ5IHRvIG1hcCBmcm9tIHNpZCDihpIgdXVpZFxyXG4gICAgcmV0dXJuIHRoaXMuc2lkVG9VdWlkLmdldChzaWRPclV1aWQpID8/IHNpZE9yVXVpZDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl90b29sYm94X2Zsb29ycGxhbihzZGs6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuaW5UcmFuc2l0aW9uTW9kZSB8fCB0aGlzLmluVHJhbnNpdGlvblN3ZWVwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd2aWV3ZXIgaXMgaW4gdHJhbnNpdGlvbiwgY2Fubm90IGdvIGZsb29ycGxhbicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCBzZGsuTW9kZS5tb3ZlVG8oJ21vZGUuZmxvb3JwbGFuJyk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdjYW5ub3QgZ28gdG8gZmxvb3JwbGFuJywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldyhzZGs6IGFueSkge1xyXG4gICAgc2RrLk1vZGUubW92ZVRvKCdtb2RlLmluc2lkZScpO1xyXG4gIH1cclxuXHJcbiAgYWN0aW9uU2hvd0FsbEZsb29ycyhzZGs6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgc2RrLkZsb29yLnNob3dBbGwoKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2Nhbm5vdCBzaG93IGFsbCBmbG9vcnMnLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl90b29sYm94X2RvbGxob3VzZShzZGs6IGFueSkge1xyXG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmluVHJhbnNpdGlvbk1vZGUgfHwgdGhpcy5pblRyYW5zaXRpb25Td2VlcCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCd2aWV3ZXIgaXMgaW4gdHJhbnNpdGlvbiwgY2Fubm90IGdvIGRvbGxob3VzZScpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHNkay5Nb2RlLm1vdmVUbygnbW9kZS5kb2xsaG91c2UnKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdjYW5ub3QgZ28gdG8gZG9sbGhvdXNlJywgZSk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEyMDApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWN0aW9uX2dvX3RvX2Zsb29yKHNkazogYW55LCBmbG9vck5hbWU6IHN0cmluZywgbWF0dGVycG9ydEZsb29yU2VxdWVuY2U6IG51bWJlciA9IG51bGwpIHtcclxuICAgIGlmICghdGhpcy5mbG9vcnMpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0Zsb29yIGFyZSBub3QgbG9hZGVkIHlldCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgZmxvb3JNYXR0ZXJwb3J0ID0gdGhpcy5mbG9vcnMuZmluZChcclxuICAgICAgKGZsb29yKSA9PiBmbG9vci5zZXF1ZW5jZSA9PT0gbWF0dGVycG9ydEZsb29yU2VxdWVuY2VcclxuICAgICk7XHJcbiAgICBpZiAoIWZsb29yTWF0dGVycG9ydCkge1xyXG4gICAgICBmbG9vck1hdHRlcnBvcnQgPSB0aGlzLmZsb29ycy5maW5kKFxyXG4gICAgICAgIChmbG9vcikgPT4gZmxvb3JOYW1lLmluY2x1ZGVzKGZsb29yLm5hbWUpICYmIGZsb29yLm5hbWUgIT0gJydcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICghZmxvb3JNYXR0ZXJwb3J0KSB7XHJcbiAgICAgIGZsb29yTWF0dGVycG9ydCA9IHRoaXMuZmxvb3JzLmZpbmQoKGZsb29yKSA9PlxyXG4gICAgICAgIGZsb29yTmFtZS5pbmNsdWRlcyhmbG9vci5pZClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChmbG9vck1hdHRlcnBvcnQpIHtcclxuICAgICAgbGV0IHJldHJ5ID0gdHJ1ZTtcclxuICAgICAgd2hpbGUgKHJldHJ5KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGZsb29ySW5kZXggPSBhd2FpdCBzZGsuRmxvb3IubW92ZVRvKGZsb29yTWF0dGVycG9ydC5zZXF1ZW5jZSk7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKFwibW92ZWQgdG8gZmxvb3JJbmRleFwiLCBmbG9vckluZGV4KTtcclxuICAgICAgICAgIHJldHJ5ID0gZmFsc2U7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdDYW5ub3QgbW92ZSB0byBGbG9vcicsIGVycm9yKTtcclxuICAgICAgICAgIGF3YWl0IHdhaXQoMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTm8gbWF0dGVycG9ydCBmbG9vciBmb3VuZCB0byBtb3ZlIHRvJyk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcImFjdGlvbl9nb190b19mbG9vci5mbG9vck1hdHRlcnBvcnRcIiwgZmxvb3JNYXR0ZXJwb3J0KTtcclxuICAgIGNvbnNvbGUubG9nKFwiYWN0aW9uX2dvX3RvX2Zsb29yLmZsb29yTmFtZVwiLCBmbG9vck5hbWUpO1xyXG4gICAgY29uc29sZS5sb2coXCJhY3Rpb25fZ29fdG9fZmxvb3IubWF0dGVycG9ydEZsb29yU2VxdWVuY2VcIiwgbWF0dGVycG9ydEZsb29yU2VxdWVuY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGUgdG8gYSBzd2VlcC4gVGhlIGNhbGxlciBjYW4gcGFzcyBlaXRoZXIgYSBzaWQgb3IgYSB1dWlkO1xyXG4gICAqIHRoaXMgbWV0aG9kIHJlc29sdmVzIGl0IHRvIHRoZSBTREsgc2lkIGJlZm9yZSBjYWxsaW5nIFN3ZWVwLm1vdmVUbygpLlxyXG4gICAqL1xyXG4gIGFzeW5jIGFjdGlvbl9nb190b19zd2VlcChzZGs6IGFueSwgc3dlZXA6IHN0cmluZywgcm90YXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0gfCBudWxsKSB7XHJcbiAgICBjb25zdCByZXNvbHZlZFNpZCA9IHRoaXMucmVzb2x2ZVN3ZWVwU2lkKHN3ZWVwKTtcclxuICAgIGlmICh0aGlzLmZvcmJpZGRlblN3ZWVwcy5pbmNsdWRlcyhzd2VlcCkgfHwgdGhpcy5mb3JiaWRkZW5Td2VlcHMuaW5jbHVkZXMocmVzb2x2ZWRTaWQpKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd1c2VyIGlzIG5vdCBhbGxvd2VkIHRvIGdvIHRvIHRoaXMgc3dlZXAnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHJlc29sdmVkU2lkICE9PSBzd2VlcCkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKGBbYWN0aW9uX2dvX3RvX3N3ZWVwXSBSZXNvbHZlZCB1dWlkIFwiJHtzd2VlcH1cIiDihpIgc2lkIFwiJHtyZXNvbHZlZFNpZH1cImApO1xyXG4gICAgfVxyXG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5pblRyYW5zaXRpb25Td2VlcCA9IHRydWU7XHJcbiAgICAgICAgYXdhaXQgc2RrLlN3ZWVwLm1vdmVUbyhyZXNvbHZlZFNpZCwge1xyXG4gICAgICAgICAgdHJhbnNpdGlvbjogc2RrLkNhbWVyYS5UcmFuc2l0aW9uVHlwZS5JTlNUQU5ULFxyXG4gICAgICAgICAgdHJhbnNpdGlvblRpbWU6IDE1MDBcclxuICAgICAgICB9KTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICB0aGlzLmluVHJhbnNpdGlvblN3ZWVwID0gZmFsc2U7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0Nhbm5vdCBtb3ZlIHRvIHN3ZWVwJywgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyb3RhdGlvbikge1xyXG4gICAgICAgIGF3YWl0IHNkay5DYW1lcmEuc2V0Um90YXRpb24ocm90YXRpb24sIHsgc3BlZWQ6IDEwMCB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwMCk7XHJcbiAgICBjb25zb2xlLmxvZyhcImFjdGlvbl9nb190b19zd2VlcC5zd2VlcFwiLCBzd2VlcCk7XHJcbiAgICBjb25zb2xlLmxvZyhcImFjdGlvbl9nb190b19zd2VlcC5yb3RhdGlvblwiLCByb3RhdGlvbik7XHJcbiAgICBjb25zb2xlLmxvZyhcImFjdGlvbl9nb190b19zd2VlcC5yZXNvbHZlZFNpZFwiLCByZXNvbHZlZFNpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNhYmxlIGZvcmJpZGRlbiBzd2VlcHMuIFJlc29sdmVzIGVhY2ggc3dlZXAgSUQgdG8gc2lkIGJlZm9yZSBjYWxsaW5nIFNESy5cclxuICAgKi9cclxuICBhc3luYyByZW1vdmVGb3JiaWRkZW5Td2VlcHMoc2RrOiBhbnksIGZvcmJpZGRlblN3ZWVwczogc3RyaW5nW10pIHtcclxuICAgIHRoaXMuZm9yYmlkZGVuU3dlZXBzID0gWy4uLmZvcmJpZGRlblN3ZWVwc107XHJcbiAgICBsZXQgcmVtb3ZlZCA9IDA7XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgZm9yYmlkZGVuU3dlZXBzLm1hcChhc3luYyAoc3dlZXApID0+IHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZFNpZCA9IHRoaXMucmVzb2x2ZVN3ZWVwU2lkKHN3ZWVwKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgc2RrLlN3ZWVwLmRpc2FibGUocmVzb2x2ZWRTaWQpO1xyXG4gICAgICAgICAgcmVtb3ZlZCArPSAxO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIGNvbnNvbGUubG9nKCdyZW1vdmVkIHN3ZWVwczonLCByZW1vdmVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vdmUgdG8gYSBwb3NpdGlvblxyXG4gICAqIEBwYXJhbSBzZGsgXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uIFxyXG4gICAqIEBwYXJhbSByb3RhdGlvbiBcclxuICAgKiBAcGFyYW0gb3B0aW9ucyBcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgbW92ZV90b19wb3NpdGlvbihcclxuICAgIHNkazogYW55LFxyXG4gICAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9LFxyXG4gICAgcm90YXRpb246IHsgeWF3OiBudW1iZXI7IHBpdGNoPzogbnVtYmVyOyByb2xsPzogbnVtYmVyIH0gfCBudWxsLFxyXG4gICAgb3B0aW9ucz86IHtcclxuICAgICAgdHJhbnNpdGlvbj86ICdGTFknIHwgJ0lOU1RBTlQnIHwgJ0lNTUVESUFURSc7XHJcbiAgICAgIGR1cmF0aW9uTXM/OiBudW1iZXI7XHJcbiAgICAgIGFuZ2xlc0luRGVncmVlcz86IGJvb2xlYW47XHJcbiAgICAgIG9mZnNldD86IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gICAgfVxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gVmFsaWRhdGUgU0RLXHJcbiAgICBpZiAoIXNkaykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hdHRlcnBvcnQgU0RLIGluc3RhbmNlIGlzIHJlcXVpcmVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTWVyZ2Ugb3B0aW9ucyB3aXRoIGRlZmF1bHRzXHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHRyYW5zaXRpb24gPSAnRkxZJyxcclxuICAgICAgZHVyYXRpb25NcyA9IDgwMCxcclxuICAgICAgYW5nbGVzSW5EZWdyZWVzID0gdHJ1ZSxcclxuICAgICAgb2Zmc2V0ID0geyB4OiAwLCB5OiAwLCB6OiAwIH1cclxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xyXG5cclxuICAgIGNvbnN0IGRlZ1RvUmFkID0gKGQ6IG51bWJlcikgPT4gZCAqIE1hdGguUEkgLyAxODA7XHJcblxyXG4gICAgLy8gUHJlcGFyZSByb3RhdGlvbiB2YWx1ZXMgKGRlZmF1bHQgdG8gMCB3aGVuIG5vdCBwcm92aWRlZClcclxuICAgIGNvbnN0IHlhdyA9IHJvdGF0aW9uPy55YXcgPz8gMDtcclxuICAgIGNvbnN0IHBpdGNoID0gcm90YXRpb24/LnBpdGNoID8/IDA7XHJcbiAgICBjb25zdCByb2xsID0gcm90YXRpb24/LnJvbGwgPz8gMDtcclxuXHJcbiAgICAvLyBDb252ZXJ0IHRvIHJhZGlhbnMgaWYgYW5nbGVzIGFyZSBwcm92aWRlZCBpbiBkZWdyZWVzXHJcbiAgICBjb25zdCByb3RZYXcgPSBhbmdsZXNJbkRlZ3JlZXMgPyBkZWdUb1JhZCh5YXcpIDogeWF3O1xyXG4gICAgY29uc3Qgcm90UGl0Y2ggPSBhbmdsZXNJbkRlZ3JlZXMgPyBkZWdUb1JhZChwaXRjaCkgOiBwaXRjaDtcclxuICAgIGNvbnN0IHJvdFJvbGwgPSBhbmdsZXNJbkRlZ3JlZXMgPyBkZWdUb1JhZChyb2xsKSA6IHJvbGw7XHJcblxyXG4gICAgLy8gUHJlc2VydmUgcHJldmlvdXMgdHJhbnNpdGlvbiBmbGFnIGFuZCBtYXJrIGFzIGluLXRyYW5zaXRpb25cclxuICAgIGNvbnN0IHByZXZJblRyYW5zaXRpb24gPSB0aGlzLmluVHJhbnNpdGlvbk1vZGU7XHJcbiAgICB0aGlzLmluVHJhbnNpdGlvbk1vZGUgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIEF0dGVtcHQgdG8gdXNlIENhbWVyYS5sb29rQXQgd2hlbiBhdmFpbGFibGVcclxuICAgICAgaWYgKHNkaz8uQ2FtZXJhPy5sb29rQXQpIHtcclxuICAgICAgICBjb25zdCBsb29rQXRPcHRzOiBhbnkgPSB7fTtcclxuICAgICAgICAvLyBQcmVmZXIgU0RLIGNvbnN0YW50cyB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBmYWxsYmFjayBzdHJpbmdcclxuICAgICAgICBpZiAoc2RrLkNhbWVyYS5UcmFuc2l0aW9uVHlwZSAmJiBzZGsuQ2FtZXJhLlRyYW5zaXRpb25UeXBlW3RyYW5zaXRpb25dKSB7XHJcbiAgICAgICAgICBsb29rQXRPcHRzLnRyYW5zaXRpb24gPSBzZGsuQ2FtZXJhLlRyYW5zaXRpb25UeXBlW3RyYW5zaXRpb25dO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsb29rQXRPcHRzLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsb29rQXRPcHRzLmR1cmF0aW9uID0gZHVyYXRpb25NcztcclxuICAgICAgICBpZiAob2Zmc2V0KSBsb29rQXRPcHRzLm9mZnNldCA9IG9mZnNldDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGF3YWl0IHNkay5DYW1lcmEubG9va0F0KHBvc2l0aW9uLCBsb29rQXRPcHRzKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgIC8vIElmIGxvb2tBdCBmYWlscywgY29udGludWUgdG8gZmFsbGJhY2tzIGJlbG93XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUuZGVidWcoJ0NhbWVyYS5sb29rQXQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gc2V0U3RhdGUnLCBlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSWYgbG9va0F0IGlzIG5vdCBwcmVzZW50IG9yIGZhaWxlZCwgdHJ5IHNldFN0YXRlIGZvciBwb3NpdGlvblxyXG4gICAgICBpZiAoIXNkaz8uQ2FtZXJhPy5sb29rQXQgJiYgc2RrPy5DYW1lcmE/LnNldFN0YXRlKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhdGVQb3M6IGFueSA9IHtcclxuICAgICAgICAgIHBvc2l0aW9uOiB7IHg6IHBvc2l0aW9uLngsIHk6IHBvc2l0aW9uLnksIHo6IHBvc2l0aW9uLnogfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGF3YWl0IHNkay5DYW1lcmEuc2V0U3RhdGUoc3RhdGVQb3MpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLmRlYnVnKCdDYW1lcmEuc2V0U3RhdGUocG9zaXRpb24pIGZhaWxlZCcsIGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBBcHBseSByb3RhdGlvbiBpZiBwcm92aWRlZFxyXG4gICAgICBpZiAocm90YXRpb24pIHtcclxuICAgICAgICAvLyBQcmVmZXIgc2V0Um90YXRpb24gd2hlbiBhdmFpbGFibGVcclxuICAgICAgICBpZiAoc2RrPy5DYW1lcmE/LnNldFJvdGF0aW9uKSB7XHJcbiAgICAgICAgICAvLyBUcnkgVmVjdG9yMiBzaWduYXR1cmUgeyB4OiB5YXcsIHk6IHBpdGNoIH0gZmlyc3RcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNkay5DYW1lcmEuc2V0Um90YXRpb24oeyB4OiByb3RZYXcsIHk6IHJvdFBpdGNoIH0sIHsgc3BlZWQ6IE1hdGgubWF4KDEwLCBNYXRoLmZsb29yKGR1cmF0aW9uTXMgLyAxMCkpIH0pO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyMSkge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGF0IGZhaWxzLCB0cnkgVmVjdG9yMyBzaWduYXR1cmUgeyB4OiBwaXRjaCwgeTogeWF3LCB6OiByb2xsIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBhd2FpdCBzZGsuQ2FtZXJhLnNldFJvdGF0aW9uKHsgeDogcm90UGl0Y2gsIHk6IHJvdFlhdywgejogcm90Um9sbCB9LCB7IHNwZWVkOiBNYXRoLm1heCgxMCwgTWF0aC5mbG9vcihkdXJhdGlvbk1zIC8gMTApKSB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyMikge1xyXG4gICAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS5kZWJ1ZygnQ2FtZXJhLnNldFJvdGF0aW9uIGZhaWxlZCB3aXRoIG11bHRpcGxlIHNpZ25hdHVyZXMnLCBlcnIxLCBlcnIyKTtcclxuICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBzZXRTdGF0ZSB3aXRoIHJvdGF0aW9uIGlmIGF2YWlsYWJsZVxyXG4gICAgICAgICAgICAgIGlmIChzZGs/LkNhbWVyYT8uc2V0U3RhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHNkay5DYW1lcmEuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiB7IHg6IHJvdFBpdGNoLCB5OiByb3RZYXcsIHo6IHJvdFJvbGwgfSxcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogeyB4OiBwb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55LCB6OiBwb3NpdGlvbi56IH1cclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS5kZWJ1ZygnRmFsbGJhY2sgQ2FtZXJhLnNldFN0YXRlKHJvdGF0aW9uKSBmYWlsZWQnLCBlcnIzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHNkaz8uQ2FtZXJhPy5zZXRTdGF0ZSkge1xyXG4gICAgICAgICAgLy8gSWYgc2V0Um90YXRpb24gaXMgbm90IGF2YWlsYWJsZSwgdXNlIHNldFN0YXRlIHRvIGFwcGx5IHJvdGF0aW9uXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBzZGsuQ2FtZXJhLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICByb3RhdGlvbjogeyB4OiByb3RQaXRjaCwgeTogcm90WWF3LCB6OiByb3RSb2xsIH0sXHJcbiAgICAgICAgICAgICAgcG9zaXRpb246IHsgeDogcG9zaXRpb24ueCwgeTogcG9zaXRpb24ueSwgejogcG9zaXRpb24ueiB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS5kZWJ1ZygnQ2FtZXJhLnNldFN0YXRlKHJvdGF0aW9uKSBmYWlsZWQnLCBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignTm8gbWV0aG9kIGF2YWlsYWJsZSB0byBhcHBseSByb3RhdGlvbiAoc2V0Um90YXRpb24vc2V0U3RhdGUgbm90IGZvdW5kKScpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gV2FpdCBhIGJpdCB0byBhbGxvdyB0cmFuc2l0aW9uIGFuaW1hdGlvbnMgdG8gY29tcGxldGVcclxuICAgICAgYXdhaXQgd2FpdChkdXJhdGlvbk1zICsgMTIwKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAvLyBSZS10aHJvdyBhZnRlciBlbnN1cmluZyBmbGFncyBhcmUgcmVzdG9yZWQgaW4gZmluYWxseVxyXG4gICAgICB0aHJvdyBlcnI7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICAvLyBSZXN0b3JlIHByZXZpb3VzIHRyYW5zaXRpb24gZmxhZ1xyXG4gICAgICB0aGlzLmluVHJhbnNpdGlvbk1vZGUgPSBwcmV2SW5UcmFuc2l0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3dlZXAgYXMgYSAqKnV1aWQqKiAoZm9yIGRhdGFiYXNlIG1hdGNoaW5nKS5cclxuICAgKiBUaGUgU0RLJ3MgcG9zZUNhbWVyYS5zd2VlcCBpcyBhIHNpZDsgd2UgdHJhbnNsYXRlIGl0LlxyXG4gICAqL1xyXG4gIGdldEN1cnJlbnRTd2VlcChwb3NlQ2FtZXJhOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IHNpZCA9IHBvc2VDYW1lcmE/LnN3ZWVwIHx8IG51bGw7XHJcbiAgICBpZiAoIXNpZCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU3dlZXBVdWlkKHNpZCk7XHJcbiAgfVxyXG5cclxuICBzZXRDYW1lcmFNb2RlKG1vZGU6IHN0cmluZykge1xyXG4gICAgdGhpcy5pblRyYW5zaXRpb25Td2VlcCA9IGZhbHNlO1xyXG4gICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgIGNhc2UgJ21vZGUuZG9sbGhvdXNlJzpcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYW1lcmFNb2RlID0gQ2FtZXJhTW9kZS5ET0xMSE9VU0U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ21vZGUuZmxvb3JwbGFuJzpcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYW1lcmFNb2RlID0gQ2FtZXJhTW9kZS5GTE9PUlBMQU47XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ21vZGUuaW5zaWRlJzpcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYW1lcmFNb2RlID0gQ2FtZXJhTW9kZS5JTlNJREU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ21vZGUudHJhbnNpdGlvbmluZyc6XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FtZXJhTW9kZSA9IENhbWVyYU1vZGUuVFJBTlNJVElPTklORztcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYW1lcmFNb2RlID0gQ2FtZXJhTW9kZS5PVVRTSURFO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkNhbWVyYU1vZGVDaGFuZ2VkLm5leHQodGhpcy5jdXJyZW50Q2FtZXJhTW9kZSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==