@colijnit/configurator 259.1.2 → 259.1.4

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 (33) hide show
  1. package/app/components/selections/selections.component.d.ts +1 -1
  2. package/bundles/colijnit-configurator.umd.js +225 -135
  3. package/bundles/colijnit-configurator.umd.js.map +1 -1
  4. package/colijnit-configurator.metadata.json +1 -1
  5. package/esm2015/app/builder.js +81 -43
  6. package/esm2015/app/components/selections/selections.component.js +2 -2
  7. package/esm2015/app/services/configurator.service.js +15 -11
  8. package/esm2015/app/utils/object.utils.js +14 -12
  9. package/esm2015/helper/variation-helper.js +5 -9
  10. package/esm2015/utils/base-utils.js +9 -0
  11. package/esm2015/utils/image.utils.js +27 -29
  12. package/esm2015/utils/scene-utils.js +38 -15
  13. package/esm2015/utils/threed.utils.js +14 -12
  14. package/esm2015/utils/variation-utils.js +1 -1
  15. package/fesm2015/colijnit-configurator.js +196 -126
  16. package/fesm2015/colijnit-configurator.js.map +1 -1
  17. package/helper/variation-helper.d.ts +2 -3
  18. package/package.json +4 -4
  19. package/utils/base-utils.d.ts +4 -0
  20. package/utils/image.utils.d.ts +2 -1
  21. package/utils/threed.utils.d.ts +2 -2
  22. package/colijnit-configurator-259.1.1.tgz +0 -0
  23. package/configurator/index.html +0 -14
  24. package/configurator/main.js +0 -3555
  25. package/configurator/main.js.map +0 -1
  26. package/configurator/polyfills.js +0 -5683
  27. package/configurator/polyfills.js.map +0 -1
  28. package/configurator/runtime.js +0 -149
  29. package/configurator/runtime.js.map +0 -1
  30. package/configurator/styles.css +0 -48
  31. package/configurator/styles.css.map +0 -1
  32. package/configurator/vendor.js +0 -210213
  33. package/configurator/vendor.js.map +0 -1
@@ -1,39 +1,37 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import * as THREE from 'three';
3
+ import { BaseUtils } from './base-utils';
3
4
  // @dynamic
4
- export class ImageUtils {
5
+ export class ImageUtils extends BaseUtils {
5
6
  static CreateTextureFromBase64(id, base64, material, defaultFlip = false) {
6
- return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
7
+ var _a, _b;
8
+ return __awaiter(this, void 0, void 0, function* () {
7
9
  if (ImageUtils.textures.has(id)) {
8
- resolve(ImageUtils.textures.get(id));
10
+ return ImageUtils.textures.get(id);
9
11
  }
10
- else {
11
- if (!base64) {
12
- resolve(new THREE.Texture());
13
- }
14
- else {
15
- if (window.hasOwnProperty('textureLoader')) {
16
- resolve(yield window.textureLoader(base64));
17
- }
18
- else {
19
- const loader = new THREE.TextureLoader();
20
- loader.load(base64, (texture) => {
21
- texture.anisotropy = 16;
22
- texture.wrapS = THREE.RepeatWrapping;
23
- texture.wrapT = THREE.RepeatWrapping;
24
- texture.repeat = new THREE.Vector2(material ? material.repeatX : 1, material ? material.repeatY : 1);
25
- texture.flipY = defaultFlip;
26
- texture.needsUpdate = true;
27
- ImageUtils.textures.set(id, texture);
28
- resolve(texture);
29
- }, () => {
30
- }, () => {
31
- resolve(new THREE.Texture());
32
- });
33
- }
12
+ try {
13
+ if (window.textureLoader) {
14
+ const texture = yield window.textureLoader(base64, material);
15
+ ImageUtils.textures.set(id, texture);
16
+ return texture;
34
17
  }
18
+ const loader = new THREE.TextureLoader();
19
+ const texture = yield new Promise((resolve, reject) => {
20
+ loader.load(base64, resolve, undefined, (err) => reject(err));
21
+ });
22
+ texture.anisotropy = 16;
23
+ texture.wrapS = THREE.RepeatWrapping;
24
+ texture.wrapT = THREE.RepeatWrapping;
25
+ texture.repeat = new THREE.Vector2((_a = material === null || material === void 0 ? void 0 : material.repeatX) !== null && _a !== void 0 ? _a : 1, (_b = material === null || material === void 0 ? void 0 : material.repeatY) !== null && _b !== void 0 ? _b : 1);
26
+ texture.flipY = defaultFlip;
27
+ texture.needsUpdate = true;
28
+ ImageUtils.textures.set(id, texture);
29
+ return texture;
30
+ }
31
+ catch (err) {
32
+ return null;
35
33
  }
36
- }));
34
+ });
37
35
  }
38
36
  static getDocBodyWithMimeTypeDefinition(fileName, documentBody) {
39
37
  if (documentBody === null) {
@@ -65,4 +63,4 @@ export class ImageUtils {
65
63
  }
66
64
  }
67
65
  ImageUtils.textures = new Map();
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvaW1hZ2UudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRy9CLFdBQVc7QUFDWCxNQUFNLE9BQU8sVUFBVTtJQUlkLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFVLEVBQUUsTUFBYyxFQUFFLFFBQWtCLEVBQUUsY0FBdUIsS0FBSztRQUNoSCxPQUFPLElBQUksT0FBTyxDQUFnQixDQUFPLE9BQU8sRUFBRSxFQUFFO1lBQ2xELElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQy9CLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3RDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ1gsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQzlCO3FCQUFNO29CQUNMLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRTt3QkFDMUMsT0FBTyxDQUFDLE1BQU8sTUFBYyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3FCQUN0RDt5QkFBTTt3QkFDTCxNQUFNLE1BQU0sR0FBd0IsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQzlELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBc0IsRUFBRSxFQUFFOzRCQUMzQyxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQzs0QkFDeEIsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDOzRCQUNyQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7NEJBQ3JDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3JHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDOzRCQUM1QixPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs0QkFDM0IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRCQUNyQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ25CLENBQUMsRUFDRCxHQUFHLEVBQUU7d0JBQ0wsQ0FBQyxFQUNELEdBQUcsRUFBRTs0QkFDSCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzt3QkFDL0IsQ0FBQyxDQUFDLENBQUM7cUJBQ047aUJBQ0Y7YUFDRjtRQUNILENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sTUFBTSxDQUFDLGdDQUFnQyxDQUFDLFFBQWdCLEVBQUUsWUFBb0I7UUFDbkYsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO1lBQ3pCLE9BQU8sWUFBWSxDQUFDO1NBQ3JCO1FBQ0QsTUFBTSxhQUFhLEdBQVcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdFLFFBQVEsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ25DLEtBQUssS0FBSyxDQUFDO1lBQ1gsS0FBSyxNQUFNO2dCQUNULE9BQU8sd0JBQXdCLEdBQUcsWUFBWSxDQUFDO1lBQ2pELEtBQUssS0FBSztnQkFDUixPQUFPLHdCQUF3QixHQUFHLFlBQVksQ0FBQztZQUNqRCxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyx3QkFBd0IsR0FBRyxZQUFZLENBQUM7WUFDakQsS0FBSyxLQUFLO2dCQUNSLE9BQU8sd0JBQXdCLEdBQUcsWUFBWSxDQUFDO1lBQ2pEO2dCQUNFLE9BQU8sd0JBQXdCLEdBQUcsWUFBWSxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUVNLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBd0I7UUFDN0QsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVTtRQUN0QixVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzlCLENBQUM7O0FBaEVhLG1CQUFRLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQge01hdGVyaWFsfSBmcm9tICcuLi9tb2RlbC9tYXRlcmlhbCc7XG5cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgSW1hZ2VVdGlscyB7XG5cbiAgcHVibGljIHN0YXRpYyB0ZXh0dXJlczogTWFwPHN0cmluZywgVEhSRUUuVGV4dHVyZT4gPSBuZXcgTWFwKCk7XG5cbiAgcHVibGljIHN0YXRpYyBDcmVhdGVUZXh0dXJlRnJvbUJhc2U2NChpZDogc3RyaW5nLCBiYXNlNjQ6IHN0cmluZywgbWF0ZXJpYWw6IE1hdGVyaWFsLCBkZWZhdWx0RmxpcDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxUSFJFRS5UZXh0dXJlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFRIUkVFLlRleHR1cmU+KGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoSW1hZ2VVdGlscy50ZXh0dXJlcy5oYXMoaWQpKSB7XG4gICAgICAgIHJlc29sdmUoSW1hZ2VVdGlscy50ZXh0dXJlcy5nZXQoaWQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghYmFzZTY0KSB7XG4gICAgICAgICAgcmVzb2x2ZShuZXcgVEhSRUUuVGV4dHVyZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAod2luZG93Lmhhc093blByb3BlcnR5KCd0ZXh0dXJlTG9hZGVyJykpIHtcbiAgICAgICAgICAgIHJlc29sdmUoYXdhaXQgKHdpbmRvdyBhcyBhbnkpLnRleHR1cmVMb2FkZXIoYmFzZTY0KSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlcjogVEhSRUUuVGV4dHVyZUxvYWRlciA9IG5ldyBUSFJFRS5UZXh0dXJlTG9hZGVyKCk7XG4gICAgICAgICAgICBsb2FkZXIubG9hZChiYXNlNjQsICh0ZXh0dXJlOiBUSFJFRS5UZXh0dXJlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gMTY7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS53cmFwUyA9IFRIUkVFLlJlcGVhdFdyYXBwaW5nO1xuICAgICAgICAgICAgICAgIHRleHR1cmUud3JhcFQgPSBUSFJFRS5SZXBlYXRXcmFwcGluZztcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLnJlcGVhdCA9IG5ldyBUSFJFRS5WZWN0b3IyKG1hdGVyaWFsID8gbWF0ZXJpYWwucmVwZWF0WCA6IDEsIG1hdGVyaWFsID8gbWF0ZXJpYWwucmVwZWF0WSA6IDEpO1xuICAgICAgICAgICAgICAgIHRleHR1cmUuZmxpcFkgPSBkZWZhdWx0RmxpcDtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBJbWFnZVV0aWxzLnRleHR1cmVzLnNldChpZCwgdGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0ZXh0dXJlKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgVEhSRUUuVGV4dHVyZSgpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldERvY0JvZHlXaXRoTWltZVR5cGVEZWZpbml0aW9uKGZpbGVOYW1lOiBzdHJpbmcsIGRvY3VtZW50Qm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoZG9jdW1lbnRCb2R5ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnRCb2R5O1xuICAgIH1cbiAgICBjb25zdCBmaWxlRXh0ZW5zaW9uOiBzdHJpbmcgPSBmaWxlTmFtZS5zdWJzdHIoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpO1xuICAgIHN3aXRjaCAoZmlsZUV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICdqcGcnOlxuICAgICAgY2FzZSAnanBlZyc6XG4gICAgICAgIHJldHVybiAnZGF0YTppbWFnZS9qcGc7YmFzZTY0LCcgKyBkb2N1bWVudEJvZHk7XG4gICAgICBjYXNlICdwbmcnOlxuICAgICAgICByZXR1cm4gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnICsgZG9jdW1lbnRCb2R5O1xuICAgICAgY2FzZSAnZ2lmJzpcbiAgICAgICAgcmV0dXJuICdkYXRhOmltYWdlL2dpZjtiYXNlNjQsJyArIGRvY3VtZW50Qm9keTtcbiAgICAgIGNhc2UgJ2JtcCc6XG4gICAgICAgIHJldHVybiAnZGF0YTppbWFnZS9ibXA7YmFzZTY0LCcgKyBkb2N1bWVudEJvZHk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnICsgZG9jdW1lbnRCb2R5O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Rml4ZWRJbWFnZUZpbGVwYXRoVXJsKGltYWdlRmlsZXBhdGhVcmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGltYWdlRmlsZXBhdGhVcmwucmVwbGFjZSgnL2NvbnRlbnQvJywgJy9jb250ZW50NDMvJyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIENsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgSW1hZ2VVdGlscy50ZXh0dXJlcy5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIHZhbHVlLmRpc3Bvc2UoKTtcbiAgICB9KTtcbiAgICBJbWFnZVV0aWxzLnRleHR1cmVzLmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvaW1hZ2UudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRS9CLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFdkMsV0FBVztBQUNYLE1BQU0sT0FBTyxVQUFXLFNBQVEsU0FBUztJQUloQyxNQUFNLENBQU8sdUJBQXVCLENBQUMsRUFBVSxFQUFFLE1BQWMsRUFBRSxRQUFrQixFQUFFLGNBQXVCLEtBQUs7OztZQUN0SCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUMvQixPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3BDO1lBQ0QsSUFBSTtnQkFDRixJQUFLLE1BQWMsQ0FBQyxhQUFhLEVBQUU7b0JBQ2pDLE1BQU0sT0FBTyxHQUFrQixNQUFPLE1BQWMsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUNyRixVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3JDLE9BQU8sT0FBTyxDQUFDO2lCQUNoQjtnQkFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxPQUFPLEdBQWtCLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7b0JBQ25FLE1BQU0sQ0FBQyxJQUFJLENBQ1QsTUFBTSxFQUNOLE9BQU8sRUFDUCxTQUFTLEVBQ1QsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FDckIsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO2dCQUNyQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7Z0JBQ3JDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUNoQyxNQUFBLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxPQUFPLG1DQUFJLENBQUMsRUFDdEIsTUFBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsT0FBTyxtQ0FBSSxDQUFDLENBQ3ZCLENBQUM7Z0JBQ0YsT0FBTyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUUzQixVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sT0FBTyxDQUFDO2FBQ2hCO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osT0FBTyxJQUFJLENBQUM7YUFDYjs7S0FDRjtJQUVNLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFnQixFQUFFLFlBQW9CO1FBQ25GLElBQUksWUFBWSxLQUFLLElBQUksRUFBRTtZQUN6QixPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUNELE1BQU0sYUFBYSxHQUFXLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RSxRQUFRLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNuQyxLQUFLLEtBQUssQ0FBQztZQUNYLEtBQUssTUFBTTtnQkFDVCxPQUFPLHdCQUF3QixHQUFHLFlBQVksQ0FBQztZQUNqRCxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyx3QkFBd0IsR0FBRyxZQUFZLENBQUM7WUFDakQsS0FBSyxLQUFLO2dCQUNSLE9BQU8sd0JBQXdCLEdBQUcsWUFBWSxDQUFDO1lBQ2pELEtBQUssS0FBSztnQkFDUixPQUFPLHdCQUF3QixHQUFHLFlBQVksQ0FBQztZQUNqRDtnQkFDRSxPQUFPLHdCQUF3QixHQUFHLFlBQVksQ0FBQztTQUNsRDtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsd0JBQXdCLENBQUMsZ0JBQXdCO1FBQzdELE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQVU7UUFDdEIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QixDQUFDOztBQW5FYSxtQkFBUSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtNYXRlcmlhbH0gZnJvbSAnLi4vbW9kZWwvbWF0ZXJpYWwnO1xuaW1wb3J0IHtCYXNlVXRpbHN9IGZyb20gJy4vYmFzZS11dGlscyc7XG5cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgSW1hZ2VVdGlscyBleHRlbmRzIEJhc2VVdGlscyB7XG5cbiAgcHVibGljIHN0YXRpYyB0ZXh0dXJlczogTWFwPHN0cmluZywgVEhSRUUuVGV4dHVyZT4gPSBuZXcgTWFwKCk7XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBDcmVhdGVUZXh0dXJlRnJvbUJhc2U2NChpZDogc3RyaW5nLCBiYXNlNjQ6IHN0cmluZywgbWF0ZXJpYWw6IE1hdGVyaWFsLCBkZWZhdWx0RmxpcDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxUSFJFRS5UZXh0dXJlPiB7XG4gICAgaWYgKEltYWdlVXRpbHMudGV4dHVyZXMuaGFzKGlkKSkge1xuICAgICAgcmV0dXJuIEltYWdlVXRpbHMudGV4dHVyZXMuZ2V0KGlkKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmICgod2luZG93IGFzIGFueSkudGV4dHVyZUxvYWRlcikge1xuICAgICAgICBjb25zdCB0ZXh0dXJlOiBUSFJFRS5UZXh0dXJlID0gYXdhaXQgKHdpbmRvdyBhcyBhbnkpLnRleHR1cmVMb2FkZXIoYmFzZTY0LCBtYXRlcmlhbCk7XG4gICAgICAgIEltYWdlVXRpbHMudGV4dHVyZXMuc2V0KGlkLCB0ZXh0dXJlKTtcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gICAgICB9XG4gICAgICBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpO1xuICAgICAgY29uc3QgdGV4dHVyZTogVEhSRUUuVGV4dHVyZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbG9hZGVyLmxvYWQoXG4gICAgICAgICAgYmFzZTY0LFxuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIChlcnIpID0+IHJlamVjdChlcnIpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHRleHR1cmUuYW5pc290cm9weSA9IDE2O1xuICAgICAgdGV4dHVyZS53cmFwUyA9IFRIUkVFLlJlcGVhdFdyYXBwaW5nO1xuICAgICAgdGV4dHVyZS53cmFwVCA9IFRIUkVFLlJlcGVhdFdyYXBwaW5nO1xuICAgICAgdGV4dHVyZS5yZXBlYXQgPSBuZXcgVEhSRUUuVmVjdG9yMihcbiAgICAgICAgbWF0ZXJpYWw/LnJlcGVhdFggPz8gMSxcbiAgICAgICAgbWF0ZXJpYWw/LnJlcGVhdFkgPz8gMVxuICAgICAgKTtcbiAgICAgIHRleHR1cmUuZmxpcFkgPSBkZWZhdWx0RmxpcDtcbiAgICAgIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG4gICAgICBJbWFnZVV0aWxzLnRleHR1cmVzLnNldChpZCwgdGV4dHVyZSk7XG4gICAgICByZXR1cm4gdGV4dHVyZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RG9jQm9keVdpdGhNaW1lVHlwZURlZmluaXRpb24oZmlsZU5hbWU6IHN0cmluZywgZG9jdW1lbnRCb2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChkb2N1bWVudEJvZHkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudEJvZHk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVFeHRlbnNpb246IHN0cmluZyA9IGZpbGVOYW1lLnN1YnN0cihmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7XG4gICAgc3dpdGNoIChmaWxlRXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2pwZyc6XG4gICAgICBjYXNlICdqcGVnJzpcbiAgICAgICAgcmV0dXJuICdkYXRhOmltYWdlL2pwZztiYXNlNjQsJyArIGRvY3VtZW50Qm9keTtcbiAgICAgIGNhc2UgJ3BuZyc6XG4gICAgICAgIHJldHVybiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgKyBkb2N1bWVudEJvZHk7XG4gICAgICBjYXNlICdnaWYnOlxuICAgICAgICByZXR1cm4gJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCwnICsgZG9jdW1lbnRCb2R5O1xuICAgICAgY2FzZSAnYm1wJzpcbiAgICAgICAgcmV0dXJuICdkYXRhOmltYWdlL2JtcDtiYXNlNjQsJyArIGRvY3VtZW50Qm9keTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgKyBkb2N1bWVudEJvZHk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRGaXhlZEltYWdlRmlsZXBhdGhVcmwoaW1hZ2VGaWxlcGF0aFVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaW1hZ2VGaWxlcGF0aFVybC5yZXBsYWNlKCcvY29udGVudC8nLCAnL2NvbnRlbnQ0My8nKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgQ2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICBJbWFnZVV0aWxzLnRleHR1cmVzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgdmFsdWUuZGlzcG9zZSgpO1xuICAgIH0pO1xuICAgIEltYWdlVXRpbHMudGV4dHVyZXMuY2xlYXIoKTtcbiAgfVxuXG59XG4iXX0=
@@ -95,6 +95,9 @@ export class SceneUtils {
95
95
  const con2Name = (con2.constructor.name === 'Mesh' || con2.constructor.name === 'Object3D') ? con2.name : con2.connector;
96
96
  const sameParent = (con1.constructor.name === 'Mesh' || con1.constructor.name === 'Object3D') &&
97
97
  (con2.constructor.name === 'Mesh' || con2.constructor.name === 'Object3D') ? con1.parent === con2.parent : false;
98
+ if (!con1Name || !con2Name) {
99
+ return false;
100
+ }
98
101
  const parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
99
102
  if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
100
103
  const connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
@@ -120,8 +123,8 @@ export class SceneUtils {
120
123
  if (!scene || !parent) {
121
124
  return false;
122
125
  }
123
- con1['connectedTo'] = con2.parent.name;
124
- con2['connectedTo'] = con1.parent.name;
126
+ con1['connectedTo'] = con2 && con2.parent ? con2.parent.name : '';
127
+ con2['connectedTo'] = con1 && con1.parent ? con1.parent.name : '';
125
128
  const motherRotation = new THREE.Euler(0, 0, 0);
126
129
  const motherPosition = new THREE.Vector3(0, 0, 0);
127
130
  parent.updateMatrixWorld();
@@ -131,34 +134,54 @@ export class SceneUtils {
131
134
  parent.position.set(0, 0, 0);
132
135
  scene.updateMatrixWorld(true);
133
136
  const con1Quat = new THREE.Quaternion();
134
- con1.getWorldQuaternion(con1Quat);
137
+ if (con1) {
138
+ con1.getWorldQuaternion(con1Quat);
139
+ }
135
140
  const con2Quat = new THREE.Quaternion();
136
- con2.getWorldQuaternion(con2Quat);
141
+ if (con2) {
142
+ con2.getWorldQuaternion(con2Quat);
143
+ }
137
144
  const con1QuatParent = new THREE.Quaternion();
138
- con1.parent.getWorldQuaternion(con1QuatParent);
145
+ if (con1 && con1.parent) {
146
+ con1.parent.getWorldQuaternion(con1QuatParent);
147
+ }
139
148
  const con2QuatParent = new THREE.Quaternion();
140
- con2.parent.getWorldQuaternion(con2QuatParent);
149
+ if (con2 && con2.parent) {
150
+ con2.parent.getWorldQuaternion(con2QuatParent);
151
+ }
141
152
  const rotation = new THREE.Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new THREE.Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
142
- con2.parent.quaternion.copy(rotation);
153
+ if (con2 && con2.parent) {
154
+ con2.parent.quaternion.copy(rotation);
155
+ }
143
156
  // Update because the matrix has been tempered with
144
157
  scene.updateMatrixWorld(true);
145
158
  // Move the connectors towards eachother
146
159
  const con1Pos = new THREE.Vector3();
147
- con1.getWorldPosition(con1Pos);
160
+ if (con1) {
161
+ con1.getWorldPosition(con1Pos);
162
+ }
148
163
  const con2Pos = new THREE.Vector3();
149
- con2.getWorldPosition(con2Pos);
164
+ if (con2) {
165
+ con2.getWorldPosition(con2Pos);
166
+ }
150
167
  const move = con1Pos.sub(con2Pos);
151
- con2.parent.position.x += move.x;
152
- con2.parent.position.y += move.y;
153
- con2.parent.position.z += move.z;
168
+ if (con2 && con2.parent) {
169
+ con2.parent.position.x += move.x;
170
+ con2.parent.position.y += move.y;
171
+ con2.parent.position.z += move.z;
172
+ }
154
173
  // reset parent's objects rotation and position
155
174
  parent.rotation.copy(motherRotation);
156
175
  parent.position.copy(motherPosition);
157
176
  scene.updateMatrixWorld(true);
158
177
  // Set the connected flag
159
- con1['connected'] = true;
160
- con2['connected'] = true;
178
+ if (con1) {
179
+ con1['connected'] = true;
180
+ }
181
+ if (con2) {
182
+ con2['connected'] = true;
183
+ }
161
184
  return true;
162
185
  }
163
186
  }
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvc2NlbmUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBRTFFLE1BQU0sT0FBTyxVQUFVO0lBRVosTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQWtCLEVBQUUsTUFBc0IsRUFDNUUsS0FBVSxFQUFFLEtBQVUsRUFBRSxjQUF1QixFQUFFLGVBQTBCO1FBQ3pFLElBQUksT0FBWSxDQUFDO1FBQ2pCLElBQUksZUFBZSxFQUFFO1lBQ2pCLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksS0FBSyxJQUFJLEtBQUssRUFBRTtZQUNoQixJQUFJLElBQW9CLENBQUM7WUFDekIsSUFBSSxJQUFvQixDQUFDO1lBQ3pCLG1HQUFtRztZQUNuRyxJQUFJLE9BQU8sSUFBSSxPQUFPLFlBQVksU0FBUyxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUU7Z0JBQ25FLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNQLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtnQkFDRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0JBQy9DLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMxQiwrQ0FBK0M7b0JB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QUMsY0FBYyxDQUFDLENBQUM7UUFFckMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlCLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQWlFSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTY2VuZVV0aWxzIHtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFRyeVNlbGVjdG9yQ29ubmVjdGlvbihzY2VuZTogVEhSRUUuU2NlbmUsIHBhcmVudDogVEhSRUUuT2JqZWN0M0QsXHJcbiAgICAgIHBhcnQxOiBhbnksIHBhcnQyOiBhbnksIGlzRmlyc3RFbGVtZW50OiBib29sZWFuLCBjcmVhdGVBZGRhYmxlRm4/OiBGdW5jdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBhZGRhYmxlOiBhbnk7XHJcbiAgICAgICAgaWYgKGNyZWF0ZUFkZGFibGVGbikge1xyXG4gICAgICAgICAgICBhZGRhYmxlID0gcGFydDI7XHJcbiAgICAgICAgICAgIHBhcnQyID0gY3JlYXRlQWRkYWJsZUZuKGFkZGFibGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgICAgICAgbGV0IGNvbjE6IFRIUkVFLk9iamVjdDNEO1xyXG4gICAgICAgICAgICBsZXQgY29uMjogVEhSRUUuT2JqZWN0M0Q7XHJcbiAgICAgICAgICAgIC8vIGlmIHBhcnQyIGlzIGFuIGFkZGFibGUgYW5kIGRlY29Db25uZWN0aW9uIGlzIHByZXNlbnQsIHRoZW4gbm8gbmVlZCB0byBpdGVyYXRlIHRocm91Z2ggY29ubmVjdG9yc1xyXG4gICAgICAgICAgICBpZiAoYWRkYWJsZSAmJiBhZGRhYmxlIGluc3RhbmNlb2YgU2VsZWN0aW9uICYmIGFkZGFibGUuZGVjb0Nvbm5lY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbjEgPSBwYXJ0MS5jaGlsZHJlbi5maW5kKGMgPT4gYy5uYW1lID09PSBhZGRhYmxlLmRlY29Db25uZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIGlmICghY29uMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBwYXJ0Mi5jaGlsZHJlbi5sZW5ndGg7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb24yID0gcGFydDIuY2hpbGRyZW5baWldO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXNlIGNvbm5lY3RvcnMgY2FuIGNvbm5lY3QgY29ubmVjdCB0aGVtXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb24xWydjb25uZWN0ZWQnXSAmJiAhY29uMlsnY29ubmVjdGVkJ10gJiYgdGhpcy5DYW5TZWxlY3RvckNvbm5lY3QocGFydDEuY2hpbGRyZW4sIGNvbjEsIGNvbjIsIGlzRmlyc3RFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXJ0MjogYW55ID0gY3JlYXRlQWRkYWJsZUZuKGFkZGFibGUsIHBhcnQyLCBwYXJ0MSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2Ugb2YgcGFydDIgY2hhbmdlZCwgc28gcmVmcmVzaCBjb24yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBuZXdQYXJ0Mi5jaGlsZHJlbltpaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuU2VsZWN0b3JDb25uZWN0KHNjZW5lLCBwYXJlbnQsIGNvbjEsIGNvbjIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0MS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBwYXJ0Mi5jaGlsZHJlbi5sZW5ndGg7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uMSA9IHBhcnQxLmNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb24yID0gcGFydDIuY2hpbGRyZW5baWldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVzZSBjb25uZWN0b3JzIGNhbiBjb25uZWN0IGNvbm5lY3QgdGhlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbjFbJ2Nvbm5lY3RlZCddICYmICFjb24yWydjb25uZWN0ZWQnXSAmJiB0aGlzLkNhblNlbGVjdG9yQ29ubmVjdChwYXJ0MS5jaGlsZHJlbiwgY29uMSwgY29uMiwgaXNGaXJzdEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQyOiBhbnkgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2Ugb2YgcGFydDIgY2hhbmdlZCwgc28gcmVmcmVzaCBjb24yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgbmV3UGFydDIuY2hpbGRyZW5baWldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuU2VsZWN0b3JDb25uZWN0KHNjZW5lLCBwYXJlbnQsIGNvbjEsIGNvbjIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIFRyeVNlbGVjdG9yQ29ubmVjdGlvbihzY2VuZTogVEhSRUUuU2NlbmUsIHBhcmVudDogVEhSRUUuT2JqZWN0M0QsXHJcbiAgICAvLyAgICAgcGFydDE6IGFueSwgcGFydDI6IGFueSwgY3JlYXRlQWRkYWJsZUZuPzogRnVuY3Rpb24pOiBib29sZWFuIHtcclxuICAgIC8vICAgICBsZXQgYWRkYWJsZTogYW55O1xyXG4gICAgLy8gICAgIGlmIChjcmVhdGVBZGRhYmxlRm4pIHtcclxuICAgIC8vICAgICAgICAgYWRkYWJsZSA9IHBhcnQyO1xyXG4gICAgLy8gICAgICAgICBwYXJ0MiA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0MS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBjb24xOiBUSFJFRS5PYmplY3QzRCA9IHBhcnQxLmNoaWxkcmVuW2ldO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgY29uMjogVEhSRUUuT2JqZWN0M0QgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBpZiB0aGVzZSBjb25uZWN0b3JzIGNhbiBjb25uZWN0IGNvbm5lY3QgdGhlbVxyXG4gICAgLy8gICAgICAgICAgICAgaWYgKCFjb24xWydjb25uZWN0ZWQnXSAmJiAhY29uMlsnY29ubmVjdGVkJ10gJiYgdGhpcy5DYW5TZWxlY3RvckNvbm5lY3QoY29uMSwgY29uMikpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKGFkZGFibGUpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFydDI6IFRIUkVFLk9iamVjdDNEID0gY3JlYXRlQWRkYWJsZUZuKGFkZGFibGUsIHBhcnQyLCBwYXJ0MSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgbmV3UGFydDIuY2hpbGRyZW5baWldKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbnZlcnQzRFBvaW50VG9TY3JlZW5Qb2ludChwb2ludDogVEhSRUUuVmVjdG9yMywgY2FtZXJhOiBUSFJFRS5DYW1lcmEsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogVEhSRUUuVmVjdG9yMiB7XHJcbiAgICAgICAgaWYgKCFwb2ludCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmVjdG9yOiBUSFJFRS5WZWN0b3IzID0gcG9pbnQuY2xvbmUoKS5wcm9qZWN0KGNhbWVyYSk7XHJcbiAgICAgICAgdmVjdG9yLnggPSAodmVjdG9yLnggKyAxKSAvIDIgKiB3aWR0aDtcclxuICAgICAgICB2ZWN0b3IueSA9IC0odmVjdG9yLnkgLSAxKSAvIDIgKiBoZWlnaHQ7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IyKHZlY3Rvci54LCB2ZWN0b3IueSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQ2FuU2VsZWN0b3JDb25uZWN0KFxyXG4gICAgICBjb25zUGFydDE6IFRIUkVFLk9iamVjdDNEW10sIGNvbjE6IFRIUkVFLk9iamVjdDNEIHwgYW55LCBjb24yOiBUSFJFRS5PYmplY3QzRCB8IGFueSwgc3RhcnRXaXRoTWFsZT86IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBjb24xTmFtZTogc3RyaW5nID0gKGNvbjEuY29uc3RydWN0b3IubmFtZSA9PT0gJ01lc2gnIHx8IGNvbjEuY29uc3RydWN0b3IubmFtZSA9PT0gJ09iamVjdDNEJykgPyBjb24xLm5hbWUgOiBjb24xLmNvbm5lY3RvcjtcclxuICAgICAgICBjb25zdCBjb24yTmFtZTogc3RyaW5nID0gKGNvbjIuY29uc3RydWN0b3IubmFtZSA9PT0gJ01lc2gnIHx8IGNvbjIuY29uc3RydWN0b3IubmFtZSA9PT0gJ09iamVjdDNEJykgPyBjb24yLm5hbWUgOiBjb24yLmNvbm5lY3RvcjtcclxuICAgICAgICBjb25zdCBzYW1lUGFyZW50OiBib29sZWFuID0gKGNvbjEuY29uc3RydWN0b3IubmFtZSA9PT0gJ01lc2gnIHx8IGNvbjEuY29uc3RydWN0b3IubmFtZSA9PT0gJ09iamVjdDNEJykgJiZcclxuICAgICAgICAoY29uMi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSA/IGNvbjEucGFyZW50ID09PSBjb24yLnBhcmVudCA6IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHBhcnRzMTogc3RyaW5nW10gPSBjb24xTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyksXHJcbiAgICAgICAgICBwYXJ0czI6IHN0cmluZ1tdID0gY29uMk5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpO1xyXG4gICAgICAgIGlmIChwYXJ0czEubGVuZ3RoID49IDMgJiYgcGFydHMyLmxlbmd0aCA+PSAzICYmICFzYW1lUGFyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlOiBib29sZWFuID0gcGFydHMxWzBdID09PSAnQycgJiYgcGFydHMyWzBdID09PSAnQycgJiZcclxuICAgICAgICAgICAgICBwYXJ0czFbMV0gPT09IHBhcnRzMlsxXSAmJiBwYXJ0czFbMl0gIT09IHBhcnRzMlsyXTtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3RhYmxlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHN0YXRpYyBDYW5TZWxlY3RvckNvbm5lY3QoY29uMTogVEhSRUUuT2JqZWN0M0QgfCBhbnksIGNvbjI6IFRIUkVFLk9iamVjdDNEIHwgYW55KTogYm9vbGVhbiB7XHJcbiAgICAvLyAgICAgY29uc3QgY29uMU5hbWU6IHN0cmluZyA9IGNvbjEgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCA/IGNvbjEubmFtZSA6IGNvbjEuY29ubmVjdG9yO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbjJOYW1lOiBzdHJpbmcgPSBjb24yIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24yLm5hbWUgOiBjb24yLmNvbm5lY3RvcjtcclxuICAgIC8vICAgICBjb25zdCBzYW1lUGFyZW50OiBib29sZWFuID0gY29uMSBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEICYmIGNvbjIgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCA/IGNvbjEucGFyZW50ID09PSBjb24yLnBhcmVudCA6IGZhbHNlO1xyXG4gICAgLy8gICAgIGNvbnN0IHBhcnRzMTogc3RyaW5nW10gPSBjb24xTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyksXHJcbiAgICAvLyAgICAgICAgIHBhcnRzMjogc3RyaW5nW10gPSBjb24yTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyk7XHJcbiAgICAvLyAgICAgaWYgKHBhcnRzMS5sZW5ndGggPj0gMyAmJiBwYXJ0czIubGVuZ3RoID49IDMgJiYgIXNhbWVQYXJlbnQpIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgY29ubmVjdGFibGU6IGJvb2xlYW4gPSBwYXJ0czFbMF0gPT09ICdDJyAmJiBwYXJ0czJbMF0gPT09ICdDJyAmJlxyXG4gICAgLy8gICAgICAgICAgICAgcGFydHMxWzFdID09PSBwYXJ0czJbMV0gJiYgcGFydHMxWzJdICE9PSBwYXJ0czJbMl07XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBjb25uZWN0YWJsZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIFNlbGVjdG9yQ29ubmVjdChzY2VuZTogVEhSRUUuU2NlbmUsIHBhcmVudDogVEhSRUUuT2JqZWN0M0QsIGNvbjE6IFRIUkVFLk9iamVjdDNELCBjb24yOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghc2NlbmUgfHwgIXBhcmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbjFbJ2Nvbm5lY3RlZFRvJ10gPSBjb24yLnBhcmVudC5uYW1lO1xyXG4gICAgICAgIGNvbjJbJ2Nvbm5lY3RlZFRvJ10gPSBjb24xLnBhcmVudC5uYW1lO1xyXG5cclxuICAgICAgICBjb25zdCBtb3RoZXJSb3RhdGlvbjogVEhSRUUuRXVsZXIgPSBuZXcgVEhSRUUuRXVsZXIoMCwgMCwgMCk7XHJcbiAgICAgICAgY29uc3QgbW90aGVyUG9zaXRpb246IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCAwKTtcclxuXHJcbiAgICAgICAgcGFyZW50LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcbiAgICAgICAgbW90aGVyUm90YXRpb24uY29weShwYXJlbnQucm90YXRpb24pO1xyXG4gICAgICAgIHBhcmVudC5nZXRXb3JsZFBvc2l0aW9uKG1vdGhlclBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgcGFyZW50LnJvdGF0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgICAgICBwYXJlbnQucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG5cclxuICAgICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29uMVF1YXQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gICAgICAgIGNvbjEuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0KTtcclxuICAgICAgICBjb25zdCBjb24yUXVhdDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAgICAgY29uMi5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXQpO1xyXG4gICAgICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBjb24xLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMVF1YXRQYXJlbnQpO1xyXG4gICAgICAgIGNvbnN0IGNvbjJRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBjb24yLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXRQYXJlbnQpO1xyXG5cclxuICAgICAgICBjb25zdCByb3RhdGlvbjogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhcclxuICAgICAgICAgIGNvbjFRdWF0LmludmVydCgpLFxyXG4gICAgICAgICAgY29uMlF1YXRcclxuICAgICAgICApLm11bHRpcGx5KFxyXG4gICAgICAgICAgbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgICAgICAgICBjb24xUXVhdFBhcmVudCxcclxuICAgICAgICAgICAgY29uMVF1YXRQYXJlbnRcclxuICAgICAgICAgIClcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb24yLnBhcmVudC5xdWF0ZXJuaW9uLmNvcHkocm90YXRpb24pO1xyXG4gICAgICAgIC8vIFVwZGF0ZSBiZWNhdXNlIHRoZSBtYXRyaXggaGFzIGJlZW4gdGVtcGVyZWQgd2l0aFxyXG4gICAgICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgICAgICAvLyBNb3ZlIHRoZSBjb25uZWN0b3JzIHRvd2FyZHMgZWFjaG90aGVyXHJcbiAgICAgICAgY29uc3QgY29uMVBvczogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICAgICAgY29uMS5nZXRXb3JsZFBvc2l0aW9uKGNvbjFQb3MpO1xyXG4gICAgICAgIGNvbnN0IGNvbjJQb3M6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuXHJcbiAgICAgICAgY29uc3QgbW92ZTogVEhSRUUuVmVjdG9yMyA9IGNvbjFQb3Muc3ViKGNvbjJQb3MpO1xyXG4gICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnggKz0gbW92ZS54O1xyXG4gICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnkgKz0gbW92ZS55O1xyXG4gICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnogKz0gbW92ZS56O1xyXG5cclxuICAgICAgICAvLyByZXNldCBwYXJlbnQncyBvYmplY3RzIHJvdGF0aW9uIGFuZCBwb3NpdGlvblxyXG4gICAgICAgIHBhcmVudC5yb3RhdGlvbi5jb3B5KG1vdGhlclJvdGF0aW9uKTtcclxuICAgICAgICBwYXJlbnQucG9zaXRpb24uY29weShtb3RoZXJQb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIGNvbm5lY3RlZCBmbGFnXHJcbiAgICAgICAgY29uMVsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICAgIGNvbjJbJ2Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHN0YXRpYyBTZWxlY3RvckNvbm5lY3Qoc2NlbmU6IFRIUkVFLlNjZW5lLCBwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBjb24xOiBUSFJFRS5PYmplY3QzRCwgY29uMjogVEhSRUUuT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAgIC8vICAgICBpZiAoIXNjZW5lIHx8ICFwYXJlbnQpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBjb24xWydjb25uZWN0ZWRUbyddID0gY29uMi5wYXJlbnQubmFtZTtcclxuICAgIC8vICAgICBjb24yWydjb25uZWN0ZWRUbyddID0gY29uMS5wYXJlbnQubmFtZTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgY29uc3QgbW90aGVyUm90YXRpb246IFRIUkVFLkV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKDAsIDAsIDApO1xyXG4gICAgLy8gICAgIGNvbnN0IG1vdGhlclBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG4gICAgLy8gICAgIG1vdGhlclJvdGF0aW9uLmNvcHkocGFyZW50LnJvdGF0aW9uKTtcclxuICAgIC8vICAgICBwYXJlbnQuZ2V0V29ybGRQb3NpdGlvbihtb3RoZXJQb3NpdGlvbik7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHBhcmVudC5yb3RhdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAvLyAgICAgcGFyZW50LnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgY29uc3QgY29uMVF1YXQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gICAgLy8gICAgIGNvbjEuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0KTtcclxuICAgIC8vICAgICBjb25zdCBjb24yUXVhdDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAvLyAgICAgY29uMi5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXQpO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIC8vICAgICBjb24xLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMVF1YXRQYXJlbnQpO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbjJRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXRQYXJlbnQpO1xyXG4gICAgLy9cclxuICAgIC8vICAgICBjb25zdCByb3RhdGlvbjogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhcclxuICAgIC8vICAgICAgICAgY29uMVF1YXQuaW52ZXJ0KCksXHJcbiAgICAvLyAgICAgICAgIGNvbjJRdWF0XHJcbiAgICAvLyAgICAgKS5tdWx0aXBseShcclxuICAgIC8vICAgICAgICAgbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgLy8gICAgICAgICAgICAgY29uMVF1YXRQYXJlbnQsXHJcbiAgICAvLyAgICAgICAgICAgICBjb24xUXVhdFBhcmVudFxyXG4gICAgLy8gICAgICAgICApXHJcbiAgICAvLyAgICAgKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAgIC8vICAgICAvLyBVcGRhdGUgYmVjYXVzZSB0aGUgbWF0cml4IGhhcyBiZWVuIHRlbXBlcmVkIHdpdGhcclxuICAgIC8vICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gTW92ZSB0aGUgY29ubmVjdG9ycyB0b3dhcmRzIGVhY2hvdGhlclxyXG4gICAgLy8gICAgIGNvbnN0IGNvbjFQb3M6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgLy8gICAgIGNvbjEuZ2V0V29ybGRQb3NpdGlvbihjb24xUG9zKTtcclxuICAgIC8vICAgICBjb25zdCBjb24yUG9zOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIC8vICAgICBjb24yLmdldFdvcmxkUG9zaXRpb24oY29uMlBvcyk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIGNvbnN0IG1vdmU6IFRIUkVFLlZlY3RvcjMgPSBjb24xUG9zLnN1Yihjb24yUG9zKTtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi54ICs9IG1vdmUueDtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi55ICs9IG1vdmUueTtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi56ICs9IG1vdmUuejtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gcmVzZXQgcGFyZW50J3Mgb2JqZWN0cyByb3RhdGlvbiBhbmQgcG9zaXRpb25cclxuICAgIC8vICAgICBwYXJlbnQucm90YXRpb24uY29weShtb3RoZXJSb3RhdGlvbik7XHJcbiAgICAvLyAgICAgcGFyZW50LnBvc2l0aW9uLmNvcHkobW90aGVyUG9zaXRpb24pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gICAgLy8gICAgIGNvbjFbJ2Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgIC8vICAgICBjb24yWydjb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAvLyAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyB9XHJcblxyXG59XHJcbiJdfQ==
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvc2NlbmUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBRTFFLE1BQU0sT0FBTyxVQUFVO0lBRVosTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQWtCLEVBQUUsTUFBc0IsRUFDNUUsS0FBVSxFQUFFLEtBQVUsRUFBRSxjQUF1QixFQUFFLGVBQTBCO1FBQ3pFLElBQUksT0FBWSxDQUFDO1FBQ2pCLElBQUksZUFBZSxFQUFFO1lBQ2pCLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksS0FBSyxJQUFJLEtBQUssRUFBRTtZQUNoQixJQUFJLElBQW9CLENBQUM7WUFDekIsSUFBSSxJQUFvQixDQUFDO1lBQ3pCLG1HQUFtRztZQUNuRyxJQUFJLE9BQU8sSUFBSSxPQUFPLFlBQVksU0FBUyxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUU7Z0JBQ25FLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNQLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtnQkFDRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0JBQy9DLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMxQiwrQ0FBK0M7b0JB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Q0FBQztRQUNuRCxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsQztRQUVELE1BQU0sSUFBSSxHQUFrQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFFRCwrQ0FBK0M7UUFDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFckMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlCLHlCQUF5QjtRQUN6QixJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBaUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9zZWxlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNjZW5lVXRpbHMge1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHNjZW5lOiBUSFJFRS5TY2VuZSwgcGFyZW50OiBUSFJFRS5PYmplY3QzRCxcclxuICAgICAgcGFydDE6IGFueSwgcGFydDI6IGFueSwgaXNGaXJzdEVsZW1lbnQ6IGJvb2xlYW4sIGNyZWF0ZUFkZGFibGVGbj86IEZ1bmN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGFkZGFibGU6IGFueTtcclxuICAgICAgICBpZiAoY3JlYXRlQWRkYWJsZUZuKSB7XHJcbiAgICAgICAgICAgIGFkZGFibGUgPSBwYXJ0MjtcclxuICAgICAgICAgICAgcGFydDIgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXJ0MSAmJiBwYXJ0Mikge1xyXG4gICAgICAgICAgICBsZXQgY29uMTogVEhSRUUuT2JqZWN0M0Q7XHJcbiAgICAgICAgICAgIGxldCBjb24yOiBUSFJFRS5PYmplY3QzRDtcclxuICAgICAgICAgICAgLy8gaWYgcGFydDIgaXMgYW4gYWRkYWJsZSBhbmQgZGVjb0Nvbm5lY3Rpb24gaXMgcHJlc2VudCwgdGhlbiBubyBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCBjb25uZWN0b3JzXHJcbiAgICAgICAgICAgIGlmIChhZGRhYmxlICYmIGFkZGFibGUgaW5zdGFuY2VvZiBTZWxlY3Rpb24gJiYgYWRkYWJsZS5kZWNvQ29ubmVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY29uMSA9IHBhcnQxLmNoaWxkcmVuLmZpbmQoYyA9PiBjLm5hbWUgPT09IGFkZGFibGUuZGVjb0Nvbm5lY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb24xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHBhcnQyLmNoaWxkcmVuLmxlbmd0aDsgaWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbjIgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlc2UgY29ubmVjdG9ycyBjYW4gY29ubmVjdCBjb25uZWN0IHRoZW1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbjFbJ2Nvbm5lY3RlZCddICYmICFjb24yWydjb25uZWN0ZWQnXSAmJiB0aGlzLkNhblNlbGVjdG9yQ29ubmVjdChwYXJ0MS5jaGlsZHJlbiwgY29uMSwgY29uMiwgaXNGaXJzdEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQyOiBhbnkgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2VsZWN0b3JDb25uZWN0KHNjZW5lLCBwYXJlbnQsIGNvbjEsIG5ld1BhcnQyLmNoaWxkcmVuW2lpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQxLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHBhcnQyLmNoaWxkcmVuLmxlbmd0aDsgaWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb24xID0gcGFydDEuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbjIgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXNlIGNvbm5lY3RvcnMgY2FuIGNvbm5lY3QgY29ubmVjdCB0aGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uMVsnY29ubmVjdGVkJ10gJiYgIWNvbjJbJ2Nvbm5lY3RlZCddICYmIHRoaXMuQ2FuU2VsZWN0b3JDb25uZWN0KHBhcnQxLmNoaWxkcmVuLCBjb24xLCBjb24yLCBpc0ZpcnN0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFydDI6IGFueSA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlLCBwYXJ0MiwgcGFydDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBuZXdQYXJ0Mi5jaGlsZHJlbltpaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHNjZW5lOiBUSFJFRS5TY2VuZSwgcGFyZW50OiBUSFJFRS5PYmplY3QzRCxcclxuICAgIC8vICAgICBwYXJ0MTogYW55LCBwYXJ0MjogYW55LCBjcmVhdGVBZGRhYmxlRm4/OiBGdW5jdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgLy8gICAgIGxldCBhZGRhYmxlOiBhbnk7XHJcbiAgICAvLyAgICAgaWYgKGNyZWF0ZUFkZGFibGVGbikge1xyXG4gICAgLy8gICAgICAgICBhZGRhYmxlID0gcGFydDI7XHJcbiAgICAvLyAgICAgICAgIHBhcnQyID0gY3JlYXRlQWRkYWJsZUZuKGFkZGFibGUpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQxLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBwYXJ0Mi5jaGlsZHJlbi5sZW5ndGg7IGlpKyspIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IGNvbjE6IFRIUkVFLk9iamVjdDNEID0gcGFydDEuY2hpbGRyZW5baV07XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBjb24yOiBUSFJFRS5PYmplY3QzRCA9IHBhcnQyLmNoaWxkcmVuW2lpXTtcclxuICAgIC8vICAgICAgICAgICAgIC8vIGlmIHRoZXNlIGNvbm5lY3RvcnMgY2FuIGNvbm5lY3QgY29ubmVjdCB0aGVtXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoIWNvbjFbJ2Nvbm5lY3RlZCddICYmICFjb24yWydjb25uZWN0ZWQnXSAmJiB0aGlzLkNhblNlbGVjdG9yQ29ubmVjdChjb24xLCBjb24yKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoYWRkYWJsZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXJ0MjogVEhSRUUuT2JqZWN0M0QgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIG9mIHBhcnQyIGNoYW5nZWQsIHNvIHJlZnJlc2ggY29uMlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBuZXdQYXJ0Mi5jaGlsZHJlbltpaV0pO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBjb24yKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQ29udmVydDNEUG9pbnRUb1NjcmVlblBvaW50KHBvaW50OiBUSFJFRS5WZWN0b3IzLCBjYW1lcmE6IFRIUkVFLkNhbWVyYSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBUSFJFRS5WZWN0b3IyIHtcclxuICAgICAgICBpZiAoIXBvaW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB2ZWN0b3I6IFRIUkVFLlZlY3RvcjMgPSBwb2ludC5jbG9uZSgpLnByb2plY3QoY2FtZXJhKTtcclxuICAgICAgICB2ZWN0b3IueCA9ICh2ZWN0b3IueCArIDEpIC8gMiAqIHdpZHRoO1xyXG4gICAgICAgIHZlY3Rvci55ID0gLSh2ZWN0b3IueSAtIDEpIC8gMiAqIGhlaWdodDtcclxuICAgICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjIodmVjdG9yLngsIHZlY3Rvci55KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDYW5TZWxlY3RvckNvbm5lY3QoXHJcbiAgICAgIGNvbnNQYXJ0MTogVEhSRUUuT2JqZWN0M0RbXSwgY29uMTogVEhSRUUuT2JqZWN0M0QgfCBhbnksIGNvbjI6IFRIUkVFLk9iamVjdDNEIHwgYW55LCBzdGFydFdpdGhNYWxlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGNvbjFOYW1lOiBzdHJpbmcgPSAoY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSA/IGNvbjEubmFtZSA6IGNvbjEuY29ubmVjdG9yO1xyXG4gICAgICAgIGNvbnN0IGNvbjJOYW1lOiBzdHJpbmcgPSAoY29uMi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSA/IGNvbjIubmFtZSA6IGNvbjIuY29ubmVjdG9yO1xyXG4gICAgICAgIGNvbnN0IHNhbWVQYXJlbnQ6IGJvb2xlYW4gPSAoY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSAmJlxyXG4gICAgICAgIChjb24yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNZXNoJyB8fCBjb24yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPYmplY3QzRCcpID8gY29uMS5wYXJlbnQgPT09IGNvbjIucGFyZW50IDogZmFsc2U7XHJcbiAgICAgICAgaWYgKCFjb24xTmFtZSB8fCAhY29uMk5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJ0czE6IHN0cmluZ1tdID0gY29uMU5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpLFxyXG4gICAgICAgICAgcGFydHMyOiBzdHJpbmdbXSA9IGNvbjJOYW1lLnRvVXBwZXJDYXNlKCkuc3BsaXQoJ18nKTtcclxuICAgICAgICBpZiAocGFydHMxLmxlbmd0aCA+PSAzICYmIHBhcnRzMi5sZW5ndGggPj0gMyAmJiAhc2FtZVBhcmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0YWJsZTogYm9vbGVhbiA9IHBhcnRzMVswXSA9PT0gJ0MnICYmIHBhcnRzMlswXSA9PT0gJ0MnICYmXHJcbiAgICAgICAgICAgICAgcGFydHMxWzFdID09PSBwYXJ0czJbMV0gJiYgcGFydHMxWzJdICE9PSBwYXJ0czJbMl07XHJcbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0YWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgQ2FuU2VsZWN0b3JDb25uZWN0KGNvbjE6IFRIUkVFLk9iamVjdDNEIHwgYW55LCBjb24yOiBUSFJFRS5PYmplY3QzRCB8IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbjFOYW1lOiBzdHJpbmcgPSBjb24xIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24xLm5hbWUgOiBjb24xLmNvbm5lY3RvcjtcclxuICAgIC8vICAgICBjb25zdCBjb24yTmFtZTogc3RyaW5nID0gY29uMiBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEID8gY29uMi5uYW1lIDogY29uMi5jb25uZWN0b3I7XHJcbiAgICAvLyAgICAgY29uc3Qgc2FtZVBhcmVudDogYm9vbGVhbiA9IGNvbjEgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCAmJiBjb24yIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24xLnBhcmVudCA9PT0gY29uMi5wYXJlbnQgOiBmYWxzZTtcclxuICAgIC8vICAgICBjb25zdCBwYXJ0czE6IHN0cmluZ1tdID0gY29uMU5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpLFxyXG4gICAgLy8gICAgICAgICBwYXJ0czI6IHN0cmluZ1tdID0gY29uMk5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpO1xyXG4gICAgLy8gICAgIGlmIChwYXJ0czEubGVuZ3RoID49IDMgJiYgcGFydHMyLmxlbmd0aCA+PSAzICYmICFzYW1lUGFyZW50KSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlOiBib29sZWFuID0gcGFydHMxWzBdID09PSAnQycgJiYgcGFydHMyWzBdID09PSAnQycgJiZcclxuICAgIC8vICAgICAgICAgICAgIHBhcnRzMVsxXSA9PT0gcGFydHMyWzFdICYmIHBhcnRzMVsyXSAhPT0gcGFydHMyWzJdO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gY29ubmVjdGFibGU7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBTZWxlY3RvckNvbm5lY3Qoc2NlbmU6IFRIUkVFLlNjZW5lLCBwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBjb24xOiBUSFJFRS5PYmplY3QzRCwgY29uMjogVEhSRUUuT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXNjZW5lIHx8ICFwYXJlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb24xWydjb25uZWN0ZWRUbyddID0gY29uMiAmJiBjb24yLnBhcmVudCA/IGNvbjIucGFyZW50Lm5hbWUgOiAnJztcclxuICAgICAgICBjb24yWydjb25uZWN0ZWRUbyddID0gY29uMSAmJiBjb24xLnBhcmVudCA/IGNvbjEucGFyZW50Lm5hbWUgOiAnJztcclxuXHJcbiAgICAgICAgY29uc3QgbW90aGVyUm90YXRpb246IFRIUkVFLkV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKDAsIDAsIDApO1xyXG4gICAgICAgIGNvbnN0IG1vdGhlclBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMCwgMCk7XHJcblxyXG4gICAgICAgIHBhcmVudC51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG4gICAgICAgIG1vdGhlclJvdGF0aW9uLmNvcHkocGFyZW50LnJvdGF0aW9uKTtcclxuICAgICAgICBwYXJlbnQuZ2V0V29ybGRQb3NpdGlvbihtb3RoZXJQb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHBhcmVudC5yb3RhdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgcGFyZW50LnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuXHJcbiAgICAgICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbjFRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBpZiAoY29uMSkge1xyXG4gICAgICAgICAgICBjb24xLmdldFdvcmxkUXVhdGVybmlvbihjb24xUXVhdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbjJRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBpZiAoY29uMikge1xyXG4gICAgICAgICAgICBjb24yLmdldFdvcmxkUXVhdGVybmlvbihjb24yUXVhdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBpZiAoY29uMSAmJiBjb24xLnBhcmVudCkge1xyXG4gICAgICAgICAgICBjb24xLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMVF1YXRQYXJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb24yUXVhdFBhcmVudDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAgICAgaWYgKGNvbjIgJiYgY29uMi5wYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uMi5wYXJlbnQuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjJRdWF0UGFyZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJvdGF0aW9uOiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgICAgICAgY29uMVF1YXQuaW52ZXJ0KCksXHJcbiAgICAgICAgICBjb24yUXVhdFxyXG4gICAgICAgICkubXVsdGlwbHkoXHJcbiAgICAgICAgICBuZXcgVEhSRUUuUXVhdGVybmlvbigpLm11bHRpcGx5UXVhdGVybmlvbnMoXHJcbiAgICAgICAgICAgIGNvbjFRdWF0UGFyZW50LFxyXG4gICAgICAgICAgICBjb24xUXVhdFBhcmVudFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGNvbjIgJiYgY29uMi5wYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIGJlY2F1c2UgdGhlIG1hdHJpeCBoYXMgYmVlbiB0ZW1wZXJlZCB3aXRoXHJcbiAgICAgICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIE1vdmUgdGhlIGNvbm5lY3RvcnMgdG93YXJkcyBlYWNob3RoZXJcclxuICAgICAgICBjb25zdCBjb24xUG9zOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgICAgICBpZiAoY29uMSkge1xyXG4gICAgICAgICAgICBjb24xLmdldFdvcmxkUG9zaXRpb24oY29uMVBvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbjJQb3M6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgICAgIGlmIChjb24yKSB7XHJcbiAgICAgICAgICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vdmU6IFRIUkVFLlZlY3RvcjMgPSBjb24xUG9zLnN1Yihjb24yUG9zKTtcclxuICAgICAgICBpZiAoY29uMiAmJiBjb24yLnBhcmVudCkge1xyXG4gICAgICAgICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi54ICs9IG1vdmUueDtcclxuICAgICAgICAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueSArPSBtb3ZlLnk7XHJcbiAgICAgICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnogKz0gbW92ZS56O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmVzZXQgcGFyZW50J3Mgb2JqZWN0cyByb3RhdGlvbiBhbmQgcG9zaXRpb25cclxuICAgICAgICBwYXJlbnQucm90YXRpb24uY29weShtb3RoZXJSb3RhdGlvbik7XHJcbiAgICAgICAgcGFyZW50LnBvc2l0aW9uLmNvcHkobW90aGVyUG9zaXRpb24pO1xyXG5cclxuICAgICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gICAgICAgIGlmIChjb24xKSB7XHJcbiAgICAgICAgICAgIGNvbjFbJ2Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbjIpIHtcclxuICAgICAgICAgICAgY29uMlsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHN0YXRpYyBTZWxlY3RvckNvbm5lY3Qoc2NlbmU6IFRIUkVFLlNjZW5lLCBwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBjb24xOiBUSFJFRS5PYmplY3QzRCwgY29uMjogVEhSRUUuT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAgIC8vICAgICBpZiAoIXNjZW5lIHx8ICFwYXJlbnQpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBjb24xWydjb25uZWN0ZWRUbyddID0gY29uMi5wYXJlbnQubmFtZTtcclxuICAgIC8vICAgICBjb24yWydjb25uZWN0ZWRUbyddID0gY29uMS5wYXJlbnQubmFtZTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgY29uc3QgbW90aGVyUm90YXRpb246IFRIUkVFLkV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKDAsIDAsIDApO1xyXG4gICAgLy8gICAgIGNvbnN0IG1vdGhlclBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG4gICAgLy8gICAgIG1vdGhlclJvdGF0aW9uLmNvcHkocGFyZW50LnJvdGF0aW9uKTtcclxuICAgIC8vICAgICBwYXJlbnQuZ2V0V29ybGRQb3NpdGlvbihtb3RoZXJQb3NpdGlvbik7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHBhcmVudC5yb3RhdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAvLyAgICAgcGFyZW50LnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgY29uc3QgY29uMVF1YXQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gICAgLy8gICAgIGNvbjEuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0KTtcclxuICAgIC8vICAgICBjb25zdCBjb24yUXVhdDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAvLyAgICAgY29uMi5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXQpO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIC8vICAgICBjb24xLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMVF1YXRQYXJlbnQpO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbjJRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXRQYXJlbnQpO1xyXG4gICAgLy9cclxuICAgIC8vICAgICBjb25zdCByb3RhdGlvbjogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhcclxuICAgIC8vICAgICAgICAgY29uMVF1YXQuaW52ZXJ0KCksXHJcbiAgICAvLyAgICAgICAgIGNvbjJRdWF0XHJcbiAgICAvLyAgICAgKS5tdWx0aXBseShcclxuICAgIC8vICAgICAgICAgbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgLy8gICAgICAgICAgICAgY29uMVF1YXRQYXJlbnQsXHJcbiAgICAvLyAgICAgICAgICAgICBjb24xUXVhdFBhcmVudFxyXG4gICAgLy8gICAgICAgICApXHJcbiAgICAvLyAgICAgKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAgIC8vICAgICAvLyBVcGRhdGUgYmVjYXVzZSB0aGUgbWF0cml4IGhhcyBiZWVuIHRlbXBlcmVkIHdpdGhcclxuICAgIC8vICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gTW92ZSB0aGUgY29ubmVjdG9ycyB0b3dhcmRzIGVhY2hvdGhlclxyXG4gICAgLy8gICAgIGNvbnN0IGNvbjFQb3M6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgLy8gICAgIGNvbjEuZ2V0V29ybGRQb3NpdGlvbihjb24xUG9zKTtcclxuICAgIC8vICAgICBjb25zdCBjb24yUG9zOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIC8vICAgICBjb24yLmdldFdvcmxkUG9zaXRpb24oY29uMlBvcyk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIGNvbnN0IG1vdmU6IFRIUkVFLlZlY3RvcjMgPSBjb24xUG9zLnN1Yihjb24yUG9zKTtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi54ICs9IG1vdmUueDtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi55ICs9IG1vdmUueTtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi56ICs9IG1vdmUuejtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gcmVzZXQgcGFyZW50J3Mgb2JqZWN0cyByb3RhdGlvbiBhbmQgcG9zaXRpb25cclxuICAgIC8vICAgICBwYXJlbnQucm90YXRpb24uY29weShtb3RoZXJSb3RhdGlvbik7XHJcbiAgICAvLyAgICAgcGFyZW50LnBvc2l0aW9uLmNvcHkobW90aGVyUG9zaXRpb24pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gICAgLy8gICAgIGNvbjFbJ2Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgIC8vICAgICBjb24yWydjb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAvLyAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyB9XHJcblxyXG59XHJcbiJdfQ==
@@ -10,7 +10,7 @@ export class ThreedUtils {
10
10
  objs.forEach(o => ObjectUtils.DisposeObject(o));
11
11
  this._objectCache.clear();
12
12
  }
13
- download3DSource(fileName, assetPath) {
13
+ download3DSource(fileName, setVisibleFalse = true) {
14
14
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
15
15
  fileName = fileName.replace('.unity3d', '');
16
16
  let lookupFileName = fileName + (fileName.indexOf('.glb') < 0 ? '.glb' : '');
@@ -18,7 +18,7 @@ export class ThreedUtils {
18
18
  resolve(this._objectCache.get(lookupFileName));
19
19
  return;
20
20
  }
21
- this.loadGlbSource(lookupFileName)
21
+ this.loadGlbSource(lookupFileName, setVisibleFalse)
22
22
  .then((obj) => {
23
23
  this._objectCache.set(lookupFileName, obj);
24
24
  resolve(obj);
@@ -94,19 +94,21 @@ export class ThreedUtils {
94
94
  }
95
95
  });
96
96
  }
97
- loadGlbSource(file) {
97
+ loadGlbSource(file, setVisibleFalse = true) {
98
98
  return __awaiter(this, void 0, void 0, function* () {
99
99
  const obj = yield this.loadGlbModel(file, false);
100
100
  if (obj) {
101
- obj.children = obj.children.filter(c => !(c instanceof THREE.Camera));
101
+ obj.children = obj.children.filter(c => !(c instanceof THREE.Camera || (c.constructor.name && c.constructor.name.toLowerCase().indexOf('camera') > -1)));
102
102
  obj.children.sort((a, b) => a['name'] < b['name'] ? 1 : -1);
103
103
  obj.children.forEach((c) => {
104
104
  c.traverse((t) => {
105
105
  t.visible = !t.name.toLowerCase().startsWith('c_');
106
106
  });
107
- c.visible = false;
107
+ if (setVisibleFalse) {
108
+ c.visible = false;
109
+ }
108
110
  });
109
- if (obj.children.length === 1 && obj.children[0] instanceof THREE.Group) { // flatten children
111
+ if (obj.children.length === 1 && (obj.children[0] instanceof THREE.Group || obj.children[0].constructor.name === 'Group')) { // flatten children
110
112
  const children = obj.children[0].children.slice();
111
113
  const name = obj.children[0].name;
112
114
  obj.children.length = 0;
@@ -138,11 +140,11 @@ export class ThreedUtils {
138
140
  _cleanedUpObjects(object, cleanUp = true) {
139
141
  let obj = new THREE.Object3D();
140
142
  object.children.forEach((c) => {
141
- if (!(c instanceof THREE.Camera)) {
142
- if (cleanUp && c instanceof THREE.Group || (c.children.length === 1 && c.children[0] instanceof THREE.Group)) {
143
+ if (!(c instanceof THREE.Camera || (c.constructor.name && c.constructor.name.toLowerCase().indexOf('camera') > -1))) {
144
+ if (cleanUp && (c instanceof THREE.Group || c.constructor.name === 'Group') || (c.children.length === 1 && (c.children[0] instanceof THREE.Group || c.children[0].constructor.name === 'Group'))) {
143
145
  this._addGroupChildrenToObject(c, obj);
144
146
  }
145
- else if ((cleanUp && !(c instanceof THREE.Mesh)) || (!(c instanceof THREE.Mesh) && !c.name && c.children.length > 0)) {
147
+ else if ((cleanUp && !(c instanceof THREE.Mesh || c.constructor.name === 'Mesh')) || (!(c instanceof THREE.Mesh || c.constructor.name === 'Mesh') && !c.name && c.children.length > 0)) {
146
148
  c.children.forEach((child) => {
147
149
  child.translateY(c.position.y);
148
150
  });
@@ -176,7 +178,7 @@ export class ThreedUtils {
176
178
  }
177
179
  _addGroupChildrenToObject(group, obj, cleanUp = true) {
178
180
  group.children.forEach((gc) => {
179
- if (cleanUp && gc instanceof THREE.Group) {
181
+ if (cleanUp && (gc instanceof THREE.Group || gc.constructor.name === 'Group')) {
180
182
  this._addGroupChildrenToObject(gc, obj);
181
183
  }
182
184
  else {
@@ -190,7 +192,7 @@ export class ThreedUtils {
190
192
  _iterateChildren(children, callback) {
191
193
  for (let i = 0; i < children.length; i++) {
192
194
  const child = children[i];
193
- if (child instanceof THREE.Mesh) {
195
+ if (child instanceof THREE.Mesh || child.constructor.name === 'Mesh') {
194
196
  callback(child);
195
197
  }
196
198
  else {
@@ -221,4 +223,4 @@ export class ThreedUtils {
221
223
  });
222
224
  }
223
225
  }
224
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVkLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL3RocmVlZC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzNDLE1BQU0sT0FBTyxXQUFXO0lBQXhCO1FBRVUsaUJBQVksR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQXdOaEUsQ0FBQztJQXROUSxVQUFVO1FBQ2YsTUFBTSxJQUFJLEdBQXFCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsUUFBZ0IsRUFBRSxTQUFpQjtRQUN6RCxPQUFPLElBQUksT0FBTyxDQUFDLENBQU8sT0FBaUIsRUFBRSxNQUFnQixFQUFFLEVBQUU7WUFDL0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLElBQUksY0FBYyxHQUFXLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENB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LENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNyQzthQUNGO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsT0FBTyxFQUFFLENBQUM7YUFDWDtRQUNILENBQUM7S0FBQTtDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSBcInRocmVlXCI7XG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tIFwiLi9vYmplY3QudXRpbHNcIjtcbmltcG9ydCB7RmlsZVV0aWxzfSBmcm9tIFwiLi9maWxlLnV0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBUaHJlZWRVdGlscyB7XG5cbiAgcHJpdmF0ZSBfb2JqZWN0Q2FjaGU6IE1hcDxzdHJpbmcsIFRIUkVFLk9iamVjdDNEPiA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICBjb25zdCBvYmpzOiBUSFJFRS5PYmplY3QzRFtdID0gQXJyYXkuZnJvbSh0aGlzLl9vYmplY3RDYWNoZS52YWx1ZXMoKSk7XG4gICAgb2Jqcy5mb3JFYWNoKG8gPT4gT2JqZWN0VXRpbHMuRGlzcG9zZU9iamVjdChvKSk7XG4gICAgdGhpcy5fb2JqZWN0Q2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZDNEU291cmNlKGZpbGVOYW1lOiBzdHJpbmcsIGFzc2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgnLnVuaXR5M2QnLCAnJyk7XG4gICAgICBsZXQgbG9va3VwRmlsZU5hbWU6IHN0cmluZyA9IGZpbGVOYW1lICsgKGZpbGVOYW1lLmluZGV4T2YoJy5nbGInKSA8IDAgPyAnLmdsYicgOiAnJyk7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGxvb2t1cEZpbGVOYW1lKSkge1xuICAgICAgICByZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChsb29rdXBGaWxlTmFtZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRHbGJTb3VyY2UobG9va3VwRmlsZU5hbWUpXG4gICAgICAgICAgLnRoZW4oKG9iajogVEhSRUUuT2JqZWN0M0QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29iamVjdENhY2hlLnNldChsb29rdXBGaWxlTmFtZSwgb2JqKTtcbiAgICAgICAgICAgIHJlc29sdmUob2JqKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoYEdMQiBzb3VyY2Ugbm90IGZvdW5kISAoJHtsb29rdXBGaWxlTmFtZX0pYCk7XG4gICAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZEZpbGVBc1RleHQoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4gcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgZmlsZVJlYWRlci5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcbiAgICAgIGZpbGVSZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkSnNvbk1vZGVsKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLl9vYmplY3RDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChmaWxlUGF0aCkpO1xuICAgIH1cbiAgICBjb25zdCBqc29uOiBzdHJpbmcgPSBhd2FpdCB0aGlzLl9yZWFkSnNvbkZpbGUoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5PYmplY3RMb2FkZXIoKTtcbiAgICBsb2FkZXIuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb2JqID0gbG9hZGVyLnBhcnNlKGpzb24pO1xuICAgICAgICB0aGlzLl9vYmplY3RDYWNoZS5zZXQoZmlsZVBhdGgsIG9iaik7XG4gICAgICAgIHJlc29sdmUob2JqKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRKc29uT2JqZWN0TW9kZWwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuX29iamVjdENhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fb2JqZWN0Q2FjaGUuZ2V0KGZpbGVQYXRoKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5PYmplY3RMb2FkZXIoKTtcbiAgICBsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oJ0Fub255bW91cycpO1xuICAgIGxvYWRlci5zZXRSZXNvdXJjZVBhdGgoJycpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsb2FkZXIubG9hZChmaWxlUGF0aCxcbiAgICAgICAgKG9iamVjdDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb2JqOiBUSFJFRS5PYmplY3QzRCA9IChvYmplY3QudHlwZSA9PT0gJ1NjZW5lJyAmJiBvYmplY3QuY2hpbGRyZW5bMF0udHlwZSA9PT0gJ09iamVjdDNEJykgPyBvYmplY3QuY2hpbGRyZW5bMF0gOiBvYmplY3Q7XG4gICAgICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGZpbGVQYXRoLCBvYmopO1xuICAgICAgICAgIHJlc29sdmUob2JqIGFzIFRIUkVFLk9iamVjdDNEKTtcbiAgICAgICAgfSxcbiAgICAgICAgeGhyID0+IG51bGwsXG4gICAgICAgIGVycm9yID0+IHJlamVjdChlcnJvcilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZEdsYk1vZGVsKGZpbGU6IHN0cmluZywgY2xlYW5VcDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XG4gICAgaWYgKHRoaXMuX29iamVjdENhY2hlLmhhcyhmaWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9vYmplY3RDYWNoZS5nZXQoZmlsZSkpO1xuICAgIH1cbiAgICBpZiAoIXdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnbG9hZEdMVEYnKSkge1xuICAgICAgY29uc29sZS5lcnJvcignbG9hZEdMVEYgbm90IGRlZmluZWQgaW4gd2luZG93IGdsb2JhbCcpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgICAgLy8gY29uc3QgbG9hZGVyID0gbmV3IEdMVEZMb2FkZXIoKTtcbiAgICBjb25zdCBvYmo6IFRIUkVFLk9iamVjdDNEID0gYXdhaXQgKHdpbmRvdyBhcyBhbnkpLmxvYWRHTFRGKGZpbGUpO1xuICAgIGlmIChvYmopIHtcbiAgICAgIHRoaXMuX2NsZWFuZWRVcE9iamVjdHMob2JqLCBjbGVhblVwKTtcbiAgICAgIHRoaXMuX29iamVjdENhY2hlLnNldChmaWxlLCBvYmopO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRHbGJTb3VyY2UoZmlsZTogc3RyaW5nKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xuICAgIGNvbnN0IG9iaiA9IGF3YWl0IHRoaXMubG9hZEdsYk1vZGVsKGZpbGUsIGZhbHNlKTtcbiAgICBpZiAob2JqKSB7XG4gICAgICBvYmouY2hpbGRyZW4gPSBvYmouY2hpbGRyZW4uZmlsdGVyKGMgPT4gIShjIGluc3RhbmNlb2YgVEhSRUUuQ2FtZXJhKSk7XG4gICAgICBvYmouY2hpbGRyZW4uc29ydCgoYSwgYikgPT4gYVsnbmFtZSddIDwgYlsnbmFtZSddID8gMSA6IC0xKTtcbiAgICAgIG9iai5jaGlsZHJlbi5mb3JFYWNoKChjOiBUSFJFRS5PYmplY3QzRCkgPT4ge1xuICAgICAgICBjLnRyYXZlcnNlKCh0OiBUSFJFRS5PYmplY3QzRCkgPT4ge1xuICAgICAgICAgIHQudmlzaWJsZSA9ICF0Lm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdjXycpO1xuICAgICAgICB9KTtcbiAgICAgICAgYy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIGlmIChvYmouY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG9iai5jaGlsZHJlblswXSBpbnN0YW5jZW9mIFRIUkVFLkdyb3VwKSB7IC8vIGZsYXR0ZW4gY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY2hpbGRyZW46IGFueSA9IG9iai5jaGlsZHJlblswXS5jaGlsZHJlbi5zbGljZSgpO1xuICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBvYmouY2hpbGRyZW5bMF0ubmFtZTtcbiAgICAgICAgb2JqLmNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IHBhcmVudDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgICAgICAgcGFyZW50Lm5hbWUgPSBuYW1lO1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgb2JqLmFkZChwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHRleHR1cmVGcm9tVXJsKHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyB1cmwgPSB0aGlzLl9pbmNsdWRlQmFzZVVybCh1cmwpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0dXJlTG9hZGVyID0gbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKTtcbiAgICAgIC8vIHRleHR1cmVMb2FkZXIuc2V0QmFzZVUodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmFzc2V0UGF0aCk7XG4gICAgICB0ZXh0dXJlTG9hZGVyLmxvYWQodXJsLFxuICAgICAgICAodGV4dHVyZTogVEhSRUUuVGV4dHVyZSkgPT4ge1xuICAgICAgICAgIHRleHR1cmUud3JhcFQgPSBUSFJFRS5SZXBlYXRXcmFwcGluZztcbiAgICAgICAgICB0ZXh0dXJlLndyYXBTID0gVEhSRUUuUmVwZWF0V3JhcHBpbmc7XG4gICAgICAgICAgdGV4dHVyZS5yZXBlYXQuc2V0KDEsIDEpO1xuICAgICAgICAgIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKHRleHR1cmUpO1xuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgICAgICByZWplY3RcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbmVkVXBPYmplY3RzKG9iamVjdDogVEhSRUUuT2JqZWN0M0QsIGNsZWFuVXA6IGJvb2xlYW4gPSB0cnVlKTogVEhSRUUuT2JqZWN0M0Qge1xuICAgIGxldCBvYmo6IFRIUkVFLk9iamVjdDNEID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XG4gICAgb2JqZWN0LmNoaWxkcmVuLmZvckVhY2goKGM6IFRIUkVFLk9iamVjdDNEKSA9PiB7XG4gICAgICBpZiAoIShjIGluc3RhbmNlb2YgVEhSRUUuQ2FtZXJhKSkge1xuICAgICAgICBpZiAoY2xlYW5VcCAmJiBjIGluc3RhbmNlb2YgVEhSRUUuR3JvdXAgfHwgKGMuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIGMuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBUSFJFRS5Hcm91cCkpIHtcbiAgICAgICAgICB0aGlzLl9hZGRHcm91cENoaWxkcmVuVG9PYmplY3QoYywgb2JqKTtcbiAgICAgICAgfSBlbHNlIGlmICgoY2xlYW5VcCAmJiAhKGMgaW5zdGFuY2VvZiBUSFJFRS5NZXNoKSkgfHwgKCEoYyBpbnN0YW5jZW9mIFRIUkVFLk1lc2gpICYmICFjLm5hbWUgJiYgYy5jaGlsZHJlbi5sZW5ndGggPiAwKSkge1xuICAgICAgICAgIGMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGNoaWxkLnRyYW5zbGF0ZVkoYy5wb3NpdGlvbi55KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjLnRyYW5zbGF0ZVkoLWMucG9zaXRpb24ueSk7XG4gICAgICAgICAgaWYgKG9iai5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBvYmouYWRkKGMuY2xvbmUoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IGMuY2xvbmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgKGMucG9zaXRpb24ueSA+IDAgfHwgYy5wb3NpdGlvbi55IDwgMCkge1xuICAgICAgICAgIC8vICAgYy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgIC8vICAgICBjaGlsZC50cmFuc2xhdGVZKGMucG9zaXRpb24ueSk7XG4gICAgICAgICAgLy8gICB9KTtcbiAgICAgICAgICAvLyAgIGMudHJhbnNsYXRlWSgtYy5wb3NpdGlvbi55KTtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgb2JqLmFkZChjLmNsb25lKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqKTtcbiAgICBjb25zdCBiYkNlbnRlclBpdm90ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBib3VuZGluZ0JveC5nZXRDZW50ZXIoYmJDZW50ZXJQaXZvdCk7XG4gICAgY29uc3QgZGVsdGE6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpLmFkZChiYkNlbnRlclBpdm90KS5uZWdhdGUoKTtcbiAgICBvYmouY2hpbGRyZW4uZm9yRWFjaCgoY2MpID0+IHtcbiAgICAgIGNjLnBvc2l0aW9uLmFkZChkZWx0YSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZEdyb3VwQ2hpbGRyZW5Ub09iamVjdChncm91cDogVEhSRUUuT2JqZWN0M0QsIG9iajogVEhSRUUuT2JqZWN0M0QsIGNsZWFuVXA6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgZ3JvdXAuY2hpbGRyZW4uZm9yRWFjaCgoZ2M6IFRIUkVFLk9iamVjdDNEKSA9PiB7XG4gICAgICBpZiAoY2xlYW5VcCAmJiBnYyBpbnN0YW5jZW9mIFRIUkVFLkdyb3VwKSB7XG4gICAgICAgIHRoaXMuX2FkZEdyb3VwQ2hpbGRyZW5Ub09iamVjdChnYywgb2JqKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdjLnRyYW5zbGF0ZVgoLWdyb3VwLnBvc2l0aW9uLngpO1xuICAgICAgICBnYy50cmFuc2xhdGVZKGdyb3VwLnBvc2l0aW9uLnkpO1xuICAgICAgICAvLyBnYy50cmFuc2xhdGVaKC1ncm91cC5wb3NpdGlvbi56KTtcbiAgICAgICAgb2JqLmFkZChnYy5jbG9uZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2l0ZXJhdGVDaGlsZHJlbihjaGlsZHJlbjogVEhSRUUuT2JqZWN0M0RbXSwgY2FsbGJhY2s6IChjaGlsZDogVEhSRUUuTWVzaCkgPT4ge30pOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZDogVEhSRUUuT2JqZWN0M0QgPSBjaGlsZHJlbltpXTtcbiAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRIUkVFLk1lc2gpIHtcbiAgICAgICAgY2FsbGJhY2soY2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXRlcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVhZEpzb25GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZpbGVQYXRoKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGVtcHR5ID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmNsb25lKCkudGV4dCgpLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgZW1wdHkgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlbXB0eSA/IHt9IDogcmVzcG9uc2UuanNvbigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxufVxuIl19
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVkLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL3RocmVlZC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzNDLE1BQU0sT0FBTyxXQUFXO0lBQXhCO1FBRVUsaUJBQVksR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQTBOaEUsQ0FBQztJQXhOUSxVQUFVO1FBQ2YsTUFBTSxJQUFJLEdBQXFCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsUUFBZ0IsRUFBRSxrQkFBMkIsSUFBSTtRQUN2RSxPQUFPLElBQUksT0FBTyxDQUFDLENBQU8sT0FBaUIsRUFBRSxNQUFnQixFQUFFLEVBQUU7WUFDL0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLElBQUksY0FBYyxHQUFXLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxj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LE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxNQUFNLEtBQUssR0FBbUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQUksS0FBSyxZQUFZLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUNwRSxRQUFRLENBQUMsS0FBbUIsQ0FBQyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7SUFDSCxDQUFDO0lBRWEsYUFBYSxDQUFDLFFBQWdCOztZQUMxQyxJQUFJO2dCQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFLENBQUM7aUJBQ1g7cUJBQU07b0JBQ0wsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO29CQUNsQixNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDM0MsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFOzRCQUNoQixLQUFLLEdBQUcsSUFBSSxDQUFDO3lCQUNkO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDckM7YUFDRjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sRUFBRSxDQUFDO2FBQ1g7UUFDSCxDQUFDO0tBQUE7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gXCJ0aHJlZVwiO1xuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4vb2JqZWN0LnV0aWxzXCI7XG5pbXBvcnQge0ZpbGVVdGlsc30gZnJvbSBcIi4vZmlsZS51dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgVGhyZWVkVXRpbHMge1xuXG4gIHByaXZhdGUgX29iamVjdENhY2hlOiBNYXA8c3RyaW5nLCBUSFJFRS5PYmplY3QzRD4gPSBuZXcgTWFwKCk7XG5cbiAgcHVibGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgY29uc3Qgb2JqczogVEhSRUUuT2JqZWN0M0RbXSA9IEFycmF5LmZyb20odGhpcy5fb2JqZWN0Q2FjaGUudmFsdWVzKCkpO1xuICAgIG9ianMuZm9yRWFjaChvID0+IE9iamVjdFV0aWxzLkRpc3Bvc2VPYmplY3QobykpO1xuICAgIHRoaXMuX29iamVjdENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWQzRFNvdXJjZShmaWxlTmFtZTogc3RyaW5nLCBzZXRWaXNpYmxlRmFsc2U6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgnLnVuaXR5M2QnLCAnJyk7XG4gICAgICBsZXQgbG9va3VwRmlsZU5hbWU6IHN0cmluZyA9IGZpbGVOYW1lICsgKGZpbGVOYW1lLmluZGV4T2YoJy5nbGInKSA8IDAgPyAnLmdsYicgOiAnJyk7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGxvb2t1cEZpbGVOYW1lKSkge1xuICAgICAgICByZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChsb29rdXBGaWxlTmFtZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRHbGJTb3VyY2UobG9va3VwRmlsZU5hbWUsIHNldFZpc2libGVGYWxzZSlcbiAgICAgICAgICAudGhlbigob2JqOiBUSFJFRS5PYmplY3QzRCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGxvb2t1cEZpbGVOYW1lLCBvYmopO1xuICAgICAgICAgICAgcmVzb2x2ZShvYmopO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChgR0xCIHNvdXJjZSBub3QgZm91bmQhICgke2xvb2t1cEZpbGVOYW1lfSlgKTtcbiAgICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkRmlsZUFzVGV4dChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiByZXNvbHZlKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgICBmaWxlUmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgZmlsZVJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRKc29uTW9kZWwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuX29iamVjdENhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fb2JqZWN0Q2FjaGUuZ2V0KGZpbGVQYXRoKSk7XG4gICAgfVxuICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGF3YWl0IHRoaXMuX3JlYWRKc29uRmlsZShmaWxlUGF0aCk7XG4gICAgY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLk9iamVjdExvYWRlcigpO1xuICAgIGxvYWRlci5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvYmogPSBsb2FkZXIucGFyc2UoanNvbik7XG4gICAgICAgIHRoaXMuX29iamVjdENhY2hlLnNldChmaWxlUGF0aCwgb2JqKTtcbiAgICAgICAgcmVzb2x2ZShvYmopO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZEpzb25PYmplY3RNb2RlbChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9vYmplY3RDYWNoZS5nZXQoZmlsZVBhdGgpKTtcbiAgICB9XG4gICAgY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLk9iamVjdExvYWRlcigpO1xuICAgIGxvYWRlci5zZXRDcm9zc09yaWdpbignQW5vbnltb3VzJyk7XG4gICAgbG9hZGVyLnNldFJlc291cmNlUGF0aCgnJyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxvYWRlci5sb2FkKGZpbGVQYXRoLFxuICAgICAgICAob2JqZWN0OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBvYmo6IFRIUkVFLk9iamVjdDNEID0gKG9iamVjdC50eXBlID09PSAnU2NlbmUnICYmIG9iamVjdC5jaGlsZHJlblswXS50eXBlID09PSAnT2JqZWN0M0QnKSA/IG9iamVjdC5jaGlsZHJlblswXSA6IG9iamVjdDtcbiAgICAgICAgICB0aGlzLl9vYmplY3RDYWNoZS5zZXQoZmlsZVBhdGgsIG9iaik7XG4gICAgICAgICAgcmVzb2x2ZShvYmogYXMgVEhSRUUuT2JqZWN0M0QpO1xuICAgICAgICB9LFxuICAgICAgICB4aHIgPT4gbnVsbCxcbiAgICAgICAgZXJyb3IgPT4gcmVqZWN0KGVycm9yKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkR2xiTW9kZWwoZmlsZTogc3RyaW5nLCBjbGVhblVwOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8VEhSRUUuT2JqZWN0M0Q+IHtcbiAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGZpbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChmaWxlKSk7XG4gICAgfVxuICAgIGlmICghd2luZG93Lmhhc093blByb3BlcnR5KCdsb2FkR0xURicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdsb2FkR0xURiBub3QgZGVmaW5lZCBpbiB3aW5kb3cgZ2xvYmFsJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgICAvLyBjb25zdCBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xuICAgIGNvbnN0IG9iajogVEhSRUUuT2JqZWN0M0QgPSBhd2FpdCAod2luZG93IGFzIGFueSkubG9hZEdMVEYoZmlsZSk7XG4gICAgaWYgKG9iaikge1xuICAgICAgdGhpcy5fY2xlYW5lZFVwT2JqZWN0cyhvYmosIGNsZWFuVXApO1xuICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGZpbGUsIG9iaik7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZEdsYlNvdXJjZShmaWxlOiBzdHJpbmcsIHNldFZpc2libGVGYWxzZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XG4gICAgY29uc3Qgb2JqID0gYXdhaXQgdGhpcy5sb2FkR2xiTW9kZWwoZmlsZSwgZmFsc2UpO1xuICAgIGlmIChvYmopIHtcbiAgICAgIG9iai5jaGlsZHJlbiA9IG9iai5jaGlsZHJlbi5maWx0ZXIoYyA9PiAhKGMgaW5zdGFuY2VvZiBUSFJFRS5DYW1lcmEgfHwgKGMuY29uc3RydWN0b3IubmFtZSAmJiBjLmNvbnN0cnVjdG9yLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjYW1lcmEnKSA+IC0xKSkpO1xuICAgICAgb2JqLmNoaWxkcmVuLnNvcnQoKGEsIGIpID0+IGFbJ25hbWUnXSA8IGJbJ25hbWUnXSA/IDEgOiAtMSk7XG4gICAgICBvYmouY2hpbGRyZW4uZm9yRWFjaCgoYzogVEhSRUUuT2JqZWN0M0QpID0+IHtcbiAgICAgICAgYy50cmF2ZXJzZSgodDogVEhSRUUuT2JqZWN0M0QpID0+IHtcbiAgICAgICAgICB0LnZpc2libGUgPSAhdC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnY18nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzZXRWaXNpYmxlRmFsc2UpIHtcbiAgICAgICAgICBjLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAob2JqLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiAob2JqLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgVEhSRUUuR3JvdXAgfHwgb2JqLmNoaWxkcmVuWzBdLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdHcm91cCcpKSB7IC8vIGZsYXR0ZW4gY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY2hpbGRyZW46IGFueSA9IG9iai5jaGlsZHJlblswXS5jaGlsZHJlbi5zbGljZSgpO1xuICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBvYmouY2hpbGRyZW5bMF0ubmFtZTtcbiAgICAgICAgb2JqLmNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IHBhcmVudDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgICAgICAgcGFyZW50Lm5hbWUgPSBuYW1lO1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgb2JqLmFkZChwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHRleHR1cmVGcm9tVXJsKHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyB1cmwgPSB0aGlzLl9pbmNsdWRlQmFzZVVybCh1cmwpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0dXJlTG9hZGVyID0gbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKTtcbiAgICAgIC8vIHRleHR1cmVMb2FkZXIuc2V0QmFzZVUodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmFzc2V0UGF0aCk7XG4gICAgICB0ZXh0dXJlTG9hZGVyLmxvYWQodXJsLFxuICAgICAgICAodGV4dHVyZTogVEhSRUUuVGV4dHVyZSkgPT4ge1xuICAgICAgICAgIHRleHR1cmUud3JhcFQgPSBUSFJFRS5SZXBlYXRXcmFwcGluZztcbiAgICAgICAgICB0ZXh0dXJlLndyYXBTID0gVEhSRUUuUmVwZWF0V3JhcHBpbmc7XG4gICAgICAgICAgdGV4dHVyZS5yZXBlYXQuc2V0KDEsIDEpO1xuICAgICAgICAgIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKHRleHR1cmUpO1xuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgICAgICByZWplY3RcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbmVkVXBPYmplY3RzKG9iamVjdDogVEhSRUUuT2JqZWN0M0QsIGNsZWFuVXA6IGJvb2xlYW4gPSB0cnVlKTogVEhSRUUuT2JqZWN0M0Qge1xuICAgIGxldCBvYmo6IFRIUkVFLk9iamVjdDNEID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XG4gICAgb2JqZWN0LmNoaWxkcmVuLmZvckVhY2goKGM6IFRIUkVFLk9iamVjdDNEKSA9PiB7XG4gICAgICBpZiAoIShjIGluc3RhbmNlb2YgVEhSRUUuQ2FtZXJhIHx8IChjLmNvbnN0cnVjdG9yLm5hbWUgJiYgYy5jb25zdHJ1Y3Rvci5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY2FtZXJhJykgPiAtMSkpKSB7XG4gICAgICAgIGlmIChjbGVhblVwICYmIChjIGluc3RhbmNlb2YgVEhSRUUuR3JvdXAgfHwgYy5jb25zdHJ1Y3Rvci5uYW1lID09PSAnR3JvdXAnKSB8fCAoYy5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgKGMuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBUSFJFRS5Hcm91cCB8fCBjLmNoaWxkcmVuWzBdLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdHcm91cCcpKSkge1xuICAgICAgICAgIHRoaXMuX2FkZEdyb3VwQ2hpbGRyZW5Ub09iamVjdChjLCBvYmopO1xuICAgICAgICB9IGVsc2UgaWYgKChjbGVhblVwICYmICEoYyBpbnN0YW5jZW9mIFRIUkVFLk1lc2ggfHwgYy5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcpKSB8fCAoIShjIGluc3RhbmNlb2YgVEhSRUUuTWVzaCB8fCBjLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNZXNoJykgJiYgIWMubmFtZSAmJiBjLmNoaWxkcmVuLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgYy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgY2hpbGQudHJhbnNsYXRlWShjLnBvc2l0aW9uLnkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGMudHJhbnNsYXRlWSgtYy5wb3NpdGlvbi55KTtcbiAgICAgICAgICBpZiAob2JqLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG9iai5hZGQoYy5jbG9uZSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqID0gYy5jbG9uZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiAoYy5wb3NpdGlvbi55ID4gMCB8fCBjLnBvc2l0aW9uLnkgPCAwKSB7XG4gICAgICAgICAgLy8gICBjLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgLy8gICAgIGNoaWxkLnRyYW5zbGF0ZVkoYy5wb3NpdGlvbi55KTtcbiAgICAgICAgICAvLyAgIH0pO1xuICAgICAgICAgIC8vICAgYy50cmFuc2xhdGVZKC1jLnBvc2l0aW9uLnkpO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgICBvYmouYWRkKGMuY2xvbmUoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBib3VuZGluZ0JveCA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmopO1xuICAgIGNvbnN0IGJiQ2VudGVyUGl2b3QgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIGJvdW5kaW5nQm94LmdldENlbnRlcihiYkNlbnRlclBpdm90KTtcbiAgICBjb25zdCBkZWx0YTogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCkuYWRkKGJiQ2VudGVyUGl2b3QpLm5lZ2F0ZSgpO1xuICAgIG9iai5jaGlsZHJlbi5mb3JFYWNoKChjYykgPT4ge1xuICAgICAgY2MucG9zaXRpb24uYWRkKGRlbHRhKTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkR3JvdXBDaGlsZHJlblRvT2JqZWN0KGdyb3VwOiBUSFJFRS5PYmplY3QzRCwgb2JqOiBUSFJFRS5PYmplY3QzRCwgY2xlYW5VcDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBncm91cC5jaGlsZHJlbi5mb3JFYWNoKChnYzogVEhSRUUuT2JqZWN0M0QpID0+IHtcbiAgICAgIGlmIChjbGVhblVwICYmIChnYyBpbnN0YW5jZW9mIFRIUkVFLkdyb3VwIHx8IGdjLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdHcm91cCcpKSB7XG4gICAgICAgIHRoaXMuX2FkZEdyb3VwQ2hpbGRyZW5Ub09iamVjdChnYywgb2JqKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdjLnRyYW5zbGF0ZVgoLWdyb3VwLnBvc2l0aW9uLngpO1xuICAgICAgICBnYy50cmFuc2xhdGVZKGdyb3VwLnBvc2l0aW9uLnkpO1xuICAgICAgICAvLyBnYy50cmFuc2xhdGVaKC1ncm91cC5wb3NpdGlvbi56KTtcbiAgICAgICAgb2JqLmFkZChnYy5jbG9uZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2l0ZXJhdGVDaGlsZHJlbihjaGlsZHJlbjogVEhSRUUuT2JqZWN0M0RbXSwgY2FsbGJhY2s6IChjaGlsZDogVEhSRUUuTWVzaCkgPT4ge30pOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZDogVEhSRUUuT2JqZWN0M0QgPSBjaGlsZHJlbltpXTtcbiAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRIUkVFLk1lc2ggfHwgY2hpbGQuY29uc3RydWN0b3IubmFtZSA9PT0gJ01lc2gnKSB7XG4gICAgICAgIGNhbGxiYWNrKGNoaWxkIGFzIFRIUkVFLk1lc2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXRlcmF0ZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVhZEpzb25GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZpbGVQYXRoKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGVtcHR5ID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmNsb25lKCkudGV4dCgpLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgZW1wdHkgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlbXB0eSA/IHt9IDogcmVzcG9uc2UuanNvbigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxufVxuIl19