@colijnit/configurator 261.1.1 → 261.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{fesm2015/colijnit-configurator.js → fesm2022/colijnit-configurator.mjs} +19092 -18478
- package/fesm2022/colijnit-configurator.mjs.map +1 -0
- package/index.d.ts +3301 -0
- package/lib/components/answer-card/style/_layout.scss +3 -3
- package/lib/components/answers-slideout/style/_layout.scss +1 -0
- package/package.json +17 -13
- package/bundles/colijnit-configurator.umd.js +0 -20167
- package/bundles/colijnit-configurator.umd.js.map +0 -1
- package/colijnit-configurator.d.ts +0 -5
- package/esm2015/colijnit-configurator.js +0 -5
- package/esm2015/lib/builder.js +0 -795
- package/esm2015/lib/components/answer-card/answer-card.component.js +0 -313
- package/esm2015/lib/components/answer-card/answer-card.module.js +0 -50
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +0 -182
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +0 -34
- package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +0 -490
- package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +0 -61
- package/esm2015/lib/components/color-filter/color-filter.component.js +0 -59
- package/esm2015/lib/components/color-filter/color-filter.module.js +0 -26
- package/esm2015/lib/components/configurator/configurator.component.js +0 -133
- package/esm2015/lib/components/configurator/configurator.module.js +0 -42
- package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +0 -222
- package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +0 -48
- package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +0 -82
- package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +0 -163
- package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +0 -49
- package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +0 -33
- package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +0 -60
- package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +0 -17
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +0 -46
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +0 -26
- package/esm2015/lib/components/element-buttons/element-buttons.component.js +0 -168
- package/esm2015/lib/components/element-buttons/element-buttons.module.js +0 -30
- package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +0 -186
- package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +0 -34
- package/esm2015/lib/components/image-zoom/image-zoom.component.js +0 -61
- package/esm2015/lib/components/image-zoom/image-zoom.module.js +0 -30
- package/esm2015/lib/components/lite-selector/lite-selector.component.js +0 -206
- package/esm2015/lib/components/lite-selector/lite-selector.module.js +0 -34
- package/esm2015/lib/components/product-configurator/product-configurator.component.js +0 -184
- package/esm2015/lib/components/product-configurator/product-configurator.module.js +0 -72
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +0 -237
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +0 -38
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +0 -284
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +0 -42
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +0 -72
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +0 -34
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +0 -82
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +0 -30
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +0 -80
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +0 -34
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +0 -93
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +0 -34
- package/esm2015/lib/components/progress-bar/progress-bar.component.js +0 -55
- package/esm2015/lib/components/progress-bar/progress-bar.module.js +0 -29
- package/esm2015/lib/components/scene-options/scene-options.component.js +0 -164
- package/esm2015/lib/components/scene-options/scene-options.module.js +0 -38
- package/esm2015/lib/components/selections-summary/selections-summary.component.js +0 -163
- package/esm2015/lib/components/selections-summary/selections-summary.module.js +0 -45
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +0 -171
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +0 -34
- package/esm2015/lib/components/slideout/slideout.component.js +0 -83
- package/esm2015/lib/components/slideout/slideout.module.js +0 -17
- package/esm2015/lib/components/summary-line/summary-line.component.js +0 -273
- package/esm2015/lib/components/summary-line/summary-line.module.js +0 -44
- package/esm2015/lib/components/tag-filter/tag-filter.component.js +0 -39
- package/esm2015/lib/components/tag-filter/tag-filter.module.js +0 -21
- package/esm2015/lib/components/threedselector/threedselector.component.js +0 -155
- package/esm2015/lib/components/threedselector/threedselector.module.js +0 -34
- package/esm2015/lib/core/helper/variation-helper.js +0 -553
- package/esm2015/lib/core/shader/floor-fade.shader.js +0 -33
- package/esm2015/lib/core/textures/depth-data-texture.js +0 -19
- package/esm2015/lib/directives/directives.module.js +0 -26
- package/esm2015/lib/directives/visibility-observer-master.directive.js +0 -53
- package/esm2015/lib/directives/visibility-observer.directive.js +0 -54
- package/esm2015/lib/enum/ar-feature.enum.js +0 -14
- package/esm2015/lib/enum/configuration-key.enum.js +0 -41
- package/esm2015/lib/enum/configuration-template.enum.js +0 -6
- package/esm2015/lib/enum/device-size-type.js +0 -7
- package/esm2015/lib/enum/device-tier.enum.js +0 -7
- package/esm2015/lib/enum/icon.enum.js +0 -113
- package/esm2015/lib/enum/item-type.enum.js +0 -23
- package/esm2015/lib/enum/light.enum.js +0 -9
- package/esm2015/lib/enum/navigator-type.enum.js +0 -6
- package/esm2015/lib/enum/output-encoding.enum.js +0 -9
- package/esm2015/lib/enum/result-type.enum.js +0 -21
- package/esm2015/lib/enum/scene-event.enum.js +0 -12
- package/esm2015/lib/enum/shadow-map-type.enum.js +0 -8
- package/esm2015/lib/enum/texture-type.js +0 -9
- package/esm2015/lib/enum/tone-mapping-local.enum.js +0 -12
- package/esm2015/lib/enum/view-mode.enum.js +0 -7
- package/esm2015/lib/enum/xr-mode.enum.js +0 -6
- package/esm2015/lib/environments/environment.js +0 -8
- package/esm2015/lib/interfaces/aa-options.interface.js +0 -2
- package/esm2015/lib/interfaces/adjustable-element.interface.js +0 -2
- package/esm2015/lib/interfaces/ao-options.interface.js +0 -2
- package/esm2015/lib/interfaces/changes.interface.js +0 -2
- package/esm2015/lib/interfaces/configuration-data.interface.js +0 -2
- package/esm2015/lib/interfaces/light-preset.interface.js +0 -2
- package/esm2015/lib/interfaces/post-processing-setting.interface.js +0 -2
- package/esm2015/lib/interfaces/scene-option-button.interface.js +0 -6
- package/esm2015/lib/interfaces/screen-size-info.js +0 -2
- package/esm2015/lib/interfaces/setting.interface.js +0 -2
- package/esm2015/lib/interfaces/texture.interface.js +0 -2
- package/esm2015/lib/interfaces/vignette-options.interface.js +0 -2
- package/esm2015/lib/model/ar-position-indicator.js +0 -18
- package/esm2015/lib/model/camera-settings.js +0 -14
- package/esm2015/lib/model/configuration-result-object.js +0 -6
- package/esm2015/lib/model/configurator-error-message.js +0 -9
- package/esm2015/lib/model/configurator-settings.js +0 -25
- package/esm2015/lib/model/custom-button.js +0 -16
- package/esm2015/lib/model/factory.js +0 -28
- package/esm2015/lib/model/icon.js +0 -112
- package/esm2015/lib/model/intersected-objects.js +0 -7
- package/esm2015/lib/model/light-preset.js +0 -73
- package/esm2015/lib/model/light-properties.js +0 -45
- package/esm2015/lib/model/material.js +0 -11
- package/esm2015/lib/model/metadata.js +0 -2
- package/esm2015/lib/model/render-parameters.js +0 -16
- package/esm2015/lib/model/setting-options.js +0 -71
- package/esm2015/lib/model/settings.js +0 -16
- package/esm2015/lib/model/shadow-properties.js +0 -10
- package/esm2015/lib/model/skin.js +0 -3
- package/esm2015/lib/model/texture.js +0 -76
- package/esm2015/lib/model/variation-settings.js +0 -54
- package/esm2015/lib/model/variation.js +0 -3
- package/esm2015/lib/model/xr-reticle.js +0 -79
- package/esm2015/lib/modules/render/enum/scene-type.enum.js +0 -6
- package/esm2015/lib/modules/render/model/ar-parameters.js +0 -12
- package/esm2015/lib/modules/render/model/scene-setting.js +0 -6
- package/esm2015/lib/modules/render/model/scene-settings.js +0 -3
- package/esm2015/lib/pipes/append.pipe.js +0 -21
- package/esm2015/lib/pipes/google-translate.pipe.js +0 -21
- package/esm2015/lib/pipes/localize.pipe.js +0 -28
- package/esm2015/lib/pipes/pipes.module.js +0 -41
- package/esm2015/lib/pipes/prepend.pipe.js +0 -21
- package/esm2015/lib/pipes/strip-html.pipe.js +0 -17
- package/esm2015/lib/services/app-event.service.js +0 -36
- package/esm2015/lib/services/app-initializer.service.js +0 -27
- package/esm2015/lib/services/ar.service.js +0 -844
- package/esm2015/lib/services/build-furniture-base.service.js +0 -1181
- package/esm2015/lib/services/build-furniture-without-scene.service.js +0 -86
- package/esm2015/lib/services/build-furniture.service.js +0 -169
- package/esm2015/lib/services/bundle-initialzer.service.js +0 -113
- package/esm2015/lib/services/camera.service.js +0 -123
- package/esm2015/lib/services/configuration.service.js +0 -79
- package/esm2015/lib/services/configurator-connector.service.js +0 -830
- package/esm2015/lib/services/configurator.service.js +0 -285
- package/esm2015/lib/services/configuring.service.js +0 -119
- package/esm2015/lib/services/controls.js +0 -799
- package/esm2015/lib/services/debug.service.js +0 -43
- package/esm2015/lib/services/dictionary.service.js +0 -65
- package/esm2015/lib/services/dynamic-camera.service.js +0 -96
- package/esm2015/lib/services/floor-plane.service.js +0 -252
- package/esm2015/lib/services/font.service.js +0 -27
- package/esm2015/lib/services/google-translate.service.js +0 -79
- package/esm2015/lib/services/icon-cache.service.js +0 -44
- package/esm2015/lib/services/intersection.service.js +0 -47
- package/esm2015/lib/services/item.service.js +0 -75
- package/esm2015/lib/services/json-utils.service.js +0 -48
- package/esm2015/lib/services/light-creation.service.js +0 -35
- package/esm2015/lib/services/light-presets.service.js +0 -157
- package/esm2015/lib/services/lights.service.js +0 -146
- package/esm2015/lib/services/load-furniture-base.service.js +0 -164
- package/esm2015/lib/services/load-furniture-without-scene.service.js +0 -45
- package/esm2015/lib/services/load-furniture.service.js +0 -72
- package/esm2015/lib/services/loader.service.js +0 -32
- package/esm2015/lib/services/locator.service.js +0 -11
- package/esm2015/lib/services/message-board.service.js +0 -50
- package/esm2015/lib/services/post-processing.service.js +0 -378
- package/esm2015/lib/services/product-configurator.service.js +0 -16
- package/esm2015/lib/services/progress.service.js +0 -20
- package/esm2015/lib/services/scene-event.service.js +0 -246
- package/esm2015/lib/services/scene-options.service.js +0 -24
- package/esm2015/lib/services/scene.service.js +0 -313
- package/esm2015/lib/services/screen-size-analysis.service.js +0 -97
- package/esm2015/lib/services/settings.service.js +0 -142
- package/esm2015/lib/services/switch-build-furniture.service.js +0 -37
- package/esm2015/lib/services/switch-load-furniture.service.js +0 -35
- package/esm2015/lib/services/threedselector.service.js +0 -72
- package/esm2015/lib/services/utils.service.js +0 -207
- package/esm2015/lib/services/variation-cache.service.js +0 -143
- package/esm2015/lib/services/variation.service.js +0 -490
- package/esm2015/lib/services/view-mode.service.js +0 -37
- package/esm2015/lib/services/vr.service.js +0 -191
- package/esm2015/lib/services/xr.service.js +0 -294
- package/esm2015/lib/utils/asset.utils.js +0 -120
- package/esm2015/lib/utils/base-utils.js +0 -9
- package/esm2015/lib/utils/color.utils.js +0 -30
- package/esm2015/lib/utils/debug.utils.js +0 -9
- package/esm2015/lib/utils/device.utils.js +0 -25
- package/esm2015/lib/utils/file.utils.js +0 -167
- package/esm2015/lib/utils/image.utils.js +0 -61
- package/esm2015/lib/utils/json-parser.utils.js +0 -180
- package/esm2015/lib/utils/material.utils.js +0 -433
- package/esm2015/lib/utils/object.utils.js +0 -360
- package/esm2015/lib/utils/relative-position.utils.js +0 -75
- package/esm2015/lib/utils/rotation-helper.utils.js +0 -15
- package/esm2015/lib/utils/scene-3d.utils.js +0 -213
- package/esm2015/lib/utils/scene-utils.js +0 -191
- package/esm2015/lib/utils/text-utils.js +0 -68
- package/esm2015/lib/utils/threed.utils.js +0 -281
- package/esm2015/lib/utils/variation-utils.js +0 -459
- package/esm2015/public-api.js +0 -65
- package/fesm2015/colijnit-configurator.js.map +0 -1
- package/lib/builder.d.ts +0 -83
- package/lib/components/answer-card/answer-card.component.d.ts +0 -58
- package/lib/components/answer-card/answer-card.module.d.ts +0 -11
- package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +0 -38
- package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +0 -10
- package/lib/components/answers-slideout/answers-slideout.component.d.ts +0 -86
- package/lib/components/answers-slideout/answers-slideout.module.d.ts +0 -16
- package/lib/components/color-filter/color-filter.component.d.ts +0 -20
- package/lib/components/color-filter/color-filter.module.d.ts +0 -8
- package/lib/components/configurator/configurator.component.d.ts +0 -37
- package/lib/components/configurator/configurator.module.d.ts +0 -12
- package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +0 -30
- package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +0 -13
- package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +0 -16
- package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +0 -26
- package/lib/components/configurator-loader/configurator-loader.component.d.ts +0 -7
- package/lib/components/configurator-loader/configurator-loader.module.d.ts +0 -9
- package/lib/components/configurator-scene/configurator-scene.component.d.ts +0 -24
- package/lib/components/configurator-scene/configurator-scene.module.d.ts +0 -7
- package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +0 -7
- package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +0 -8
- package/lib/components/element-buttons/element-buttons.component.d.ts +0 -32
- package/lib/components/element-buttons/element-buttons.module.d.ts +0 -9
- package/lib/components/element-toolbar/element-toolbar.component.d.ts +0 -27
- package/lib/components/element-toolbar/element-toolbar.module.d.ts +0 -10
- package/lib/components/image-zoom/image-zoom.component.d.ts +0 -15
- package/lib/components/image-zoom/image-zoom.module.d.ts +0 -9
- package/lib/components/lite-selector/lite-selector.component.d.ts +0 -40
- package/lib/components/lite-selector/lite-selector.module.d.ts +0 -10
- package/lib/components/product-configurator/product-configurator.component.d.ts +0 -50
- package/lib/components/product-configurator/product-configurator.module.d.ts +0 -15
- package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +0 -35
- package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +0 -11
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +0 -31
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +0 -13
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +0 -20
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +0 -10
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +0 -20
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +0 -10
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +0 -21
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +0 -10
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +0 -21
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +0 -10
- package/lib/components/progress-bar/progress-bar.component.d.ts +0 -10
- package/lib/components/progress-bar/progress-bar.module.d.ts +0 -8
- package/lib/components/scene-options/scene-options.component.d.ts +0 -24
- package/lib/components/scene-options/scene-options.module.d.ts +0 -11
- package/lib/components/selections-summary/selections-summary.component.d.ts +0 -38
- package/lib/components/selections-summary/selections-summary.module.d.ts +0 -12
- package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +0 -27
- package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +0 -10
- package/lib/components/slideout/slideout.component.d.ts +0 -22
- package/lib/components/slideout/slideout.module.d.ts +0 -7
- package/lib/components/summary-line/summary-line.component.d.ts +0 -50
- package/lib/components/summary-line/summary-line.module.d.ts +0 -11
- package/lib/components/tag-filter/tag-filter.component.d.ts +0 -9
- package/lib/components/tag-filter/tag-filter.module.d.ts +0 -7
- package/lib/components/threedselector/threedselector.component.d.ts +0 -38
- package/lib/components/threedselector/threedselector.module.d.ts +0 -10
- package/lib/core/helper/variation-helper.d.ts +0 -25
- package/lib/core/shader/floor-fade.shader.d.ts +0 -5
- package/lib/core/textures/depth-data-texture.d.ts +0 -5
- package/lib/directives/directives.module.d.ts +0 -8
- package/lib/directives/visibility-observer-master.directive.d.ts +0 -12
- package/lib/directives/visibility-observer.directive.d.ts +0 -16
- package/lib/enum/ar-feature.enum.d.ts +0 -12
- package/lib/enum/configuration-key.enum.d.ts +0 -39
- package/lib/enum/configuration-template.enum.d.ts +0 -4
- package/lib/enum/device-size-type.d.ts +0 -5
- package/lib/enum/device-tier.enum.d.ts +0 -5
- package/lib/enum/icon.enum.d.ts +0 -111
- package/lib/enum/item-type.enum.d.ts +0 -21
- package/lib/enum/light.enum.d.ts +0 -7
- package/lib/enum/navigator-type.enum.d.ts +0 -4
- package/lib/enum/output-encoding.enum.d.ts +0 -7
- package/lib/enum/result-type.enum.d.ts +0 -19
- package/lib/enum/scene-event.enum.d.ts +0 -10
- package/lib/enum/shadow-map-type.enum.d.ts +0 -6
- package/lib/enum/texture-type.d.ts +0 -7
- package/lib/enum/tone-mapping-local.enum.d.ts +0 -10
- package/lib/enum/view-mode.enum.d.ts +0 -5
- package/lib/enum/xr-mode.enum.d.ts +0 -4
- package/lib/environments/environment.d.ts +0 -4
- package/lib/interfaces/aa-options.interface.d.ts +0 -4
- package/lib/interfaces/adjustable-element.interface.d.ts +0 -5
- package/lib/interfaces/ao-options.interface.d.ts +0 -18
- package/lib/interfaces/changes.interface.d.ts +0 -9
- package/lib/interfaces/configuration-data.interface.d.ts +0 -40
- package/lib/interfaces/light-preset.interface.d.ts +0 -22
- package/lib/interfaces/post-processing-setting.interface.d.ts +0 -11
- package/lib/interfaces/scene-option-button.interface.d.ts +0 -19
- package/lib/interfaces/screen-size-info.d.ts +0 -10
- package/lib/interfaces/setting.interface.d.ts +0 -8
- package/lib/interfaces/texture.interface.d.ts +0 -44
- package/lib/interfaces/vignette-options.interface.d.ts +0 -4
- package/lib/model/ar-position-indicator.d.ts +0 -4
- package/lib/model/camera-settings.d.ts +0 -12
- package/lib/model/configuration-result-object.d.ts +0 -30
- package/lib/model/configurator-error-message.d.ts +0 -8
- package/lib/model/configurator-settings.d.ts +0 -62
- package/lib/model/custom-button.d.ts +0 -10
- package/lib/model/factory.d.ts +0 -5
- package/lib/model/icon.d.ts +0 -4
- package/lib/model/intersected-objects.d.ts +0 -6
- package/lib/model/light-preset.d.ts +0 -33
- package/lib/model/light-properties.d.ts +0 -25
- package/lib/model/material.d.ts +0 -41
- package/lib/model/metadata.d.ts +0 -78
- package/lib/model/render-parameters.d.ts +0 -12
- package/lib/model/setting-options.d.ts +0 -67
- package/lib/model/settings.d.ts +0 -10
- package/lib/model/shadow-properties.d.ts +0 -7
- package/lib/model/skin.d.ts +0 -15
- package/lib/model/texture.d.ts +0 -52
- package/lib/model/variation-settings.d.ts +0 -55
- package/lib/model/variation.d.ts +0 -11
- package/lib/model/xr-reticle.d.ts +0 -17
- package/lib/modules/render/enum/scene-type.enum.d.ts +0 -4
- package/lib/modules/render/model/ar-parameters.d.ts +0 -9
- package/lib/modules/render/model/scene-setting.d.ts +0 -13
- package/lib/modules/render/model/scene-settings.d.ts +0 -4
- package/lib/pipes/append.pipe.d.ts +0 -7
- package/lib/pipes/google-translate.pipe.d.ts +0 -11
- package/lib/pipes/localize.pipe.d.ts +0 -10
- package/lib/pipes/pipes.module.d.ts +0 -11
- package/lib/pipes/prepend.pipe.d.ts +0 -7
- package/lib/pipes/strip-html.pipe.d.ts +0 -7
- package/lib/services/app-event.service.d.ts +0 -32
- package/lib/services/app-initializer.service.d.ts +0 -14
- package/lib/services/ar.service.d.ts +0 -120
- package/lib/services/build-furniture-base.service.d.ts +0 -117
- package/lib/services/build-furniture-without-scene.service.d.ts +0 -14
- package/lib/services/build-furniture.service.d.ts +0 -14
- package/lib/services/bundle-initialzer.service.d.ts +0 -45
- package/lib/services/camera.service.d.ts +0 -44
- package/lib/services/configuration.service.d.ts +0 -18
- package/lib/services/configurator-connector.service.d.ts +0 -140
- package/lib/services/configurator.service.d.ts +0 -62
- package/lib/services/configuring.service.d.ts +0 -46
- package/lib/services/controls.d.ts +0 -11
- package/lib/services/debug.service.d.ts +0 -16
- package/lib/services/dictionary.service.d.ts +0 -15
- package/lib/services/dynamic-camera.service.d.ts +0 -21
- package/lib/services/floor-plane.service.d.ts +0 -47
- package/lib/services/font.service.d.ts +0 -10
- package/lib/services/google-translate.service.d.ts +0 -26
- package/lib/services/icon-cache.service.d.ts +0 -21
- package/lib/services/intersection.service.d.ts +0 -11
- package/lib/services/item.service.d.ts +0 -18
- package/lib/services/json-utils.service.d.ts +0 -7
- package/lib/services/light-creation.service.d.ts +0 -9
- package/lib/services/light-presets.service.d.ts +0 -34
- package/lib/services/lights.service.d.ts +0 -34
- package/lib/services/load-furniture-base.service.d.ts +0 -37
- package/lib/services/load-furniture-without-scene.service.d.ts +0 -9
- package/lib/services/load-furniture.service.d.ts +0 -9
- package/lib/services/loader.service.d.ts +0 -11
- package/lib/services/locator.service.d.ts +0 -7
- package/lib/services/message-board.service.d.ts +0 -18
- package/lib/services/post-processing.service.d.ts +0 -74
- package/lib/services/product-configurator.service.d.ts +0 -11
- package/lib/services/progress.service.d.ts +0 -9
- package/lib/services/scene-event.service.d.ts +0 -72
- package/lib/services/scene-options.service.d.ts +0 -11
- package/lib/services/scene.service.d.ts +0 -71
- package/lib/services/screen-size-analysis.service.d.ts +0 -32
- package/lib/services/settings.service.d.ts +0 -24
- package/lib/services/switch-build-furniture.service.d.ts +0 -21
- package/lib/services/switch-load-furniture.service.d.ts +0 -21
- package/lib/services/threedselector.service.d.ts +0 -17
- package/lib/services/utils.service.d.ts +0 -24
- package/lib/services/variation-cache.service.d.ts +0 -23
- package/lib/services/variation.service.d.ts +0 -26
- package/lib/services/view-mode.service.d.ts +0 -17
- package/lib/services/vr.service.d.ts +0 -42
- package/lib/services/xr.service.d.ts +0 -56
- package/lib/utils/asset.utils.d.ts +0 -19
- package/lib/utils/base-utils.d.ts +0 -4
- package/lib/utils/color.utils.d.ts +0 -8
- package/lib/utils/debug.utils.d.ts +0 -3
- package/lib/utils/device.utils.d.ts +0 -7
- package/lib/utils/file.utils.d.ts +0 -30
- package/lib/utils/image.utils.d.ts +0 -9
- package/lib/utils/json-parser.utils.d.ts +0 -9
- package/lib/utils/material.utils.d.ts +0 -34
- package/lib/utils/object.utils.d.ts +0 -32
- package/lib/utils/relative-position.utils.d.ts +0 -12
- package/lib/utils/rotation-helper.utils.d.ts +0 -6
- package/lib/utils/scene-3d.utils.d.ts +0 -8
- package/lib/utils/scene-utils.d.ts +0 -7
- package/lib/utils/text-utils.d.ts +0 -4
- package/lib/utils/threed.utils.d.ts +0 -20
- package/lib/utils/variation-utils.d.ts +0 -18
- package/public-api.d.ts +0 -60
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import { Box3, Euler, Mesh, Object3D, Quaternion, Vector2, Vector3 } from 'three';
|
|
2
|
-
import { Selection } from '@colijnit/configuratorapi/build/model/selection';
|
|
3
|
-
import { HdecoPositioning } from '@colijnit/configuratorapi/build/enum/hdeco-positioning.enum';
|
|
4
|
-
export class Scene3DUtil {
|
|
5
|
-
static updatePivot(obj) {
|
|
6
|
-
const boundingBox = new Box3().setFromObject(obj);
|
|
7
|
-
const bbCenterPivot = new Vector3();
|
|
8
|
-
boundingBox.getCenter(bbCenterPivot);
|
|
9
|
-
const delta = new Vector3().sub(bbCenterPivot).setY(Math.abs(Math.min(boundingBox.min.y, 0)));
|
|
10
|
-
obj.children.forEach((child) => {
|
|
11
|
-
child.position.add(delta);
|
|
12
|
-
});
|
|
13
|
-
obj.updateWorldMatrix(false, true);
|
|
14
|
-
}
|
|
15
|
-
static TrySelectorConnection(scene, parent, part1, part2, isFirstElement, createAddableFn) {
|
|
16
|
-
let addable;
|
|
17
|
-
if (createAddableFn) {
|
|
18
|
-
addable = part2;
|
|
19
|
-
part2 = createAddableFn(addable);
|
|
20
|
-
}
|
|
21
|
-
if (part1 && part2) {
|
|
22
|
-
let con1;
|
|
23
|
-
let con2;
|
|
24
|
-
// if part2 is an addable and decoConnection is present, then no need to iterate through connectors
|
|
25
|
-
if (addable && addable instanceof Selection && addable.decoConnection && addable.hdecoPositioning === HdecoPositioning.Variable) {
|
|
26
|
-
con1 = part1.children.find(c => c.name === addable.decoConnection);
|
|
27
|
-
if (!con1) {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
for (let ii = 0; ii < part2.children.length; ii++) {
|
|
31
|
-
con2 = part2.children[ii];
|
|
32
|
-
// if these connectors can connect connect them
|
|
33
|
-
if (!con1.userData.connected && !con2.userData.connected && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
|
|
34
|
-
// if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
|
|
35
|
-
// if addable, continue this loop with a new addable
|
|
36
|
-
if (addable) {
|
|
37
|
-
const newPart2 = createAddableFn(addable, part2, part1);
|
|
38
|
-
// reference of part2 changed, so refresh con2
|
|
39
|
-
this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
return this.SelectorConnect(scene, parent, con1, con2);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
for (let i = 0; i < part1.children.length; i++) {
|
|
49
|
-
for (let ii = 0; ii < part2.children.length; ii++) {
|
|
50
|
-
con1 = part1.children[i];
|
|
51
|
-
con2 = part2.children[ii];
|
|
52
|
-
let con1Connected = false;
|
|
53
|
-
if (con1 && con1.userData) {
|
|
54
|
-
con1Connected = con1.userData.connected;
|
|
55
|
-
}
|
|
56
|
-
let con2Connected = false;
|
|
57
|
-
if (con2 && con2.userData) {
|
|
58
|
-
con2Connected = con2.userData.connected;
|
|
59
|
-
}
|
|
60
|
-
// if these connectors can connect connect them
|
|
61
|
-
if (!con1Connected && !con2Connected && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
|
|
62
|
-
// if addable, continue this loop with a new addable
|
|
63
|
-
if (addable) {
|
|
64
|
-
const newPart2 = createAddableFn(addable, part2, part1);
|
|
65
|
-
// reference of part2 changed, so refresh con2
|
|
66
|
-
this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
return this.SelectorConnect(scene, parent, con1, con2);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
// public static TrySelectorConnection(scene: Scene, parent: Object3D,
|
|
79
|
-
// part1: any, part2: any, createAddableFn?: Function): boolean {
|
|
80
|
-
// let addable: any;
|
|
81
|
-
// if (createAddableFn) {
|
|
82
|
-
// addable = part2;
|
|
83
|
-
// part2 = createAddableFn(addable);
|
|
84
|
-
// }
|
|
85
|
-
// for (let i = 0; i < part1.children.length; i++) {
|
|
86
|
-
// for (let ii = 0; ii < part2.children.length; ii++) {
|
|
87
|
-
// const con1: Object3D = part1.children[i];
|
|
88
|
-
// const con2: Object3D = part2.children[ii];
|
|
89
|
-
// // if these connectors can connect connect them
|
|
90
|
-
// if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(con1, con2)) {
|
|
91
|
-
// // if addable, continue this loop with a new addable
|
|
92
|
-
// if (addable) {
|
|
93
|
-
// const newPart2: Object3D = createAddableFn(addable, part2, part1);
|
|
94
|
-
// // reference of part2 changed, so refresh con2
|
|
95
|
-
// this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
|
|
96
|
-
// } else {
|
|
97
|
-
// return this.SelectorConnect(scene, parent, con1, con2);
|
|
98
|
-
// }
|
|
99
|
-
// }
|
|
100
|
-
// }
|
|
101
|
-
// }
|
|
102
|
-
// return false;
|
|
103
|
-
// }
|
|
104
|
-
static Convert3DPointToScreenPoint(point, camera, width, height) {
|
|
105
|
-
if (!point) {
|
|
106
|
-
return new Vector2();
|
|
107
|
-
}
|
|
108
|
-
const vector = point.clone().project(camera);
|
|
109
|
-
vector.x = (vector.x + 1) / 2 * width;
|
|
110
|
-
vector.y = -(vector.y - 1) / 2 * height;
|
|
111
|
-
return new Vector2(vector.x, vector.y);
|
|
112
|
-
}
|
|
113
|
-
static CanSelectorConnect(consPart1, con1, con2, startWithMale) {
|
|
114
|
-
const con1Name = (con1 instanceof Object3D || con1 instanceof Mesh) ? con1.name : con1.connector;
|
|
115
|
-
const con2Name = (con2 instanceof Object3D || con2 instanceof Mesh) ? con2.name : con2.connector;
|
|
116
|
-
const sameParent = (con1 instanceof Object3D || con1 instanceof Mesh) &&
|
|
117
|
-
(con2 instanceof Object3D || con2 instanceof Mesh) ? con1.parent === con2.parent : false;
|
|
118
|
-
if (!con1Name || !con2Name) {
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
const parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
|
|
122
|
-
if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
|
|
123
|
-
const connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
|
|
124
|
-
parts1[1] === parts2[1] && parts1[2] !== parts2[2];
|
|
125
|
-
return connectable;
|
|
126
|
-
}
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
// public static CanSelectorConnect(con1: Object3D | any, con2: Object3D | any): boolean {
|
|
130
|
-
// const con1Name: string = con1 instanceof Object3D ? con1.name : con1.connector;
|
|
131
|
-
// const con2Name: string = con2 instanceof Object3D ? con2.name : con2.connector;
|
|
132
|
-
// const sameParent: boolean = con1 instanceof Object3D && con2 instanceof Object3D ? con1.parent === con2.parent : false;
|
|
133
|
-
// const parts1: string[] = con1Name.toUpperCase().split('_'),
|
|
134
|
-
// parts2: string[] = con2Name.toUpperCase().split('_');
|
|
135
|
-
// if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
|
|
136
|
-
// const connectable: boolean = parts1[0] === 'C' && parts2[0] === 'C' &&
|
|
137
|
-
// parts1[1] === parts2[1] && parts1[2] !== parts2[2];
|
|
138
|
-
// return connectable;
|
|
139
|
-
// }
|
|
140
|
-
// return false;
|
|
141
|
-
// }
|
|
142
|
-
static SelectorConnect(scene, parent, con1, con2) {
|
|
143
|
-
if (!scene || !parent) {
|
|
144
|
-
return false;
|
|
145
|
-
}
|
|
146
|
-
con1['connectedTo'] = con2 && con2.parent ? con2.parent.name : '';
|
|
147
|
-
con2['connectedTo'] = con1 && con1.parent ? con1.parent.name : '';
|
|
148
|
-
con1.userData.connectedTo = con2 && con2.parent ? con2.parent.name : '';
|
|
149
|
-
con1.userData.connected = false;
|
|
150
|
-
con2.userData.connectedTo = con1 && con1.parent ? con1.parent.name : '';
|
|
151
|
-
con2.userData.connected = false;
|
|
152
|
-
const motherRotation = new Euler(0, 0, 0);
|
|
153
|
-
const motherPosition = new Vector3(0, 0, 0);
|
|
154
|
-
parent.updateMatrixWorld();
|
|
155
|
-
motherRotation.copy(parent.rotation);
|
|
156
|
-
parent.getWorldPosition(motherPosition);
|
|
157
|
-
parent.rotation.set(0, 0, 0);
|
|
158
|
-
parent.position.set(0, 0, 0);
|
|
159
|
-
scene.updateMatrixWorld(true);
|
|
160
|
-
const con1Quat = new Quaternion();
|
|
161
|
-
if (con1) {
|
|
162
|
-
con1.getWorldQuaternion(con1Quat);
|
|
163
|
-
}
|
|
164
|
-
const con2Quat = new Quaternion();
|
|
165
|
-
if (con2) {
|
|
166
|
-
con2.getWorldQuaternion(con2Quat);
|
|
167
|
-
}
|
|
168
|
-
const con1QuatParent = new Quaternion();
|
|
169
|
-
if (con1 && con1.parent) {
|
|
170
|
-
con1.parent.getWorldQuaternion(con1QuatParent);
|
|
171
|
-
}
|
|
172
|
-
const con2QuatParent = new Quaternion();
|
|
173
|
-
if (con2 && con2.parent) {
|
|
174
|
-
con2.parent.getWorldQuaternion(con2QuatParent);
|
|
175
|
-
}
|
|
176
|
-
const rotation = new Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
|
|
177
|
-
if (con2 && con2.parent) {
|
|
178
|
-
con2.parent.quaternion.copy(rotation);
|
|
179
|
-
}
|
|
180
|
-
// Update because the matrix has been tempered with
|
|
181
|
-
scene.updateMatrixWorld(true);
|
|
182
|
-
// Move the connectors towards eachother
|
|
183
|
-
const con1Pos = new Vector3();
|
|
184
|
-
if (con1) {
|
|
185
|
-
con1.getWorldPosition(con1Pos);
|
|
186
|
-
}
|
|
187
|
-
const con2Pos = new Vector3();
|
|
188
|
-
if (con2) {
|
|
189
|
-
con2.getWorldPosition(con2Pos);
|
|
190
|
-
}
|
|
191
|
-
const move = con1Pos.sub(con2Pos);
|
|
192
|
-
if (con2 && con2.parent) {
|
|
193
|
-
con2.parent.position.x += move.x;
|
|
194
|
-
con2.parent.position.y += move.y;
|
|
195
|
-
con2.parent.position.z += move.z;
|
|
196
|
-
}
|
|
197
|
-
// reset parent's objects rotation and position
|
|
198
|
-
parent.rotation.copy(motherRotation);
|
|
199
|
-
parent.position.copy(motherPosition);
|
|
200
|
-
scene.updateMatrixWorld(true);
|
|
201
|
-
// Set the connected flag
|
|
202
|
-
if (con1) {
|
|
203
|
-
// con1['connected'] = true;
|
|
204
|
-
con1.userData.connected = true;
|
|
205
|
-
}
|
|
206
|
-
if (con2) {
|
|
207
|
-
// con2['connected'] = true;
|
|
208
|
-
con2.userData.connected = true;
|
|
209
|
-
}
|
|
210
|
-
return true;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtM2QudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25maWd1cmF0b3Ivc3JjL2xpYi91dGlscy9zY2VuZS0zZC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsSUFBSSxFQUFVLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQy9GLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUMxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw2REFBNkQsQ0FBQztBQUU3RixNQUFNLE9BQU8sV0FBVztJQUVmLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBYTtRQUNyQyxNQUFNLFdBQVcsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RCxNQUFNLGFBQWEsR0FBWSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckMsTUFBTSxLQUFLLEdBQVksSUFBSSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNsQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7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ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0JveDMsIENhbWVyYSwgRXVsZXIsIE1lc2gsIE9iamVjdDNELCBRdWF0ZXJuaW9uLCBTY2VuZSwgVmVjdG9yMiwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9zZWxlY3Rpb24nO1xyXG5pbXBvcnQge0hkZWNvUG9zaXRpb25pbmd9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9oZGVjby1wb3NpdGlvbmluZy5lbnVtJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTY2VuZTNEVXRpbCB7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlUGl2b3Qob2JqOiBPYmplY3QzRCkge1xyXG4gICAgY29uc3QgYm91bmRpbmdCb3g6IEJveDMgPSBuZXcgQm94MygpLnNldEZyb21PYmplY3Qob2JqKTtcclxuICAgIGNvbnN0IGJiQ2VudGVyUGl2b3Q6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygpO1xyXG4gICAgYm91bmRpbmdCb3guZ2V0Q2VudGVyKGJiQ2VudGVyUGl2b3QpO1xyXG4gICAgY29uc3QgZGVsdGE6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygpLnN1YihiYkNlbnRlclBpdm90KS5zZXRZKE1hdGguYWJzKE1hdGgubWluKGJvdW5kaW5nQm94Lm1pbi55LCAwKSkpO1xyXG5cclxuICAgIG9iai5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgIGNoaWxkLnBvc2l0aW9uLmFkZChkZWx0YSk7XHJcbiAgICB9KTtcclxuICAgIG9iai51cGRhdGVXb3JsZE1hdHJpeChmYWxzZSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIFRyeVNlbGVjdG9yQ29ubmVjdGlvbihcclxuICAgIHNjZW5lOiBTY2VuZSxcclxuICAgIHBhcmVudDogT2JqZWN0M0QsXHJcbiAgICBwYXJ0MTogYW55LFxyXG4gICAgcGFydDI6IGFueSxcclxuICAgIGlzRmlyc3RFbGVtZW50OiBib29sZWFuLFxyXG4gICAgY3JlYXRlQWRkYWJsZUZuPzogRnVuY3Rpb25cclxuICApOiBib29sZWFuIHtcclxuICAgIGxldCBhZGRhYmxlOiBhbnk7XHJcbiAgICBpZiAoY3JlYXRlQWRkYWJsZUZuKSB7XHJcbiAgICAgIGFkZGFibGUgPSBwYXJ0MjtcclxuICAgICAgcGFydDIgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSk7XHJcbiAgICB9XHJcbiAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgbGV0IGNvbjE6IE9iamVjdDNEO1xyXG4gICAgICBsZXQgY29uMjogT2JqZWN0M0Q7XHJcbiAgICAgIC8vIGlmIHBhcnQyIGlzIGFuIGFkZGFibGUgYW5kIGRlY29Db25uZWN0aW9uIGlzIHByZXNlbnQsIHRoZW4gbm8gbmVlZCB0byBpdGVyYXRlIHRocm91Z2ggY29ubmVjdG9yc1xyXG4gICAgICBpZiAoYWRkYWJsZSAmJiBhZGRhYmxlIGluc3RhbmNlb2YgU2VsZWN0aW9uICYmIGFkZGFibGUuZGVjb0Nvbm5lY3Rpb24gJiYgYWRkYWJsZS5oZGVjb1Bvc2l0aW9uaW5nID09PSBIZGVjb1Bvc2l0aW9uaW5nLlZhcmlhYmxlKSB7XHJcbiAgICAgICAgY29uMSA9IHBhcnQxLmNoaWxkcmVuLmZpbmQoYyA9PiBjLm5hbWUgPT09IGFkZGFibGUuZGVjb0Nvbm5lY3Rpb24pO1xyXG4gICAgICAgIGlmICghY29uMSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICBjb24yID0gcGFydDIuY2hpbGRyZW5baWldO1xyXG4gICAgICAgICAgLy8gaWYgdGhlc2UgY29ubmVjdG9ycyBjYW4gY29ubmVjdCBjb25uZWN0IHRoZW1cclxuICAgICAgICAgIGlmICghY29uMS51c2VyRGF0YS5jb25uZWN0ZWQgJiYgIWNvbjIudXNlckRhdGEuY29ubmVjdGVkICYmIHRoaXMuQ2FuU2VsZWN0b3JDb25uZWN0KHBhcnQxLmNoaWxkcmVuLCBjb24xLCBjb24yLCBpc0ZpcnN0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgLy8gaWYgKCFjb24xWydjb25uZWN0ZWQnXSAmJiAhY29uMlsnY29ubmVjdGVkJ10gJiYgdGhpcy5DYW5TZWxlY3RvckNvbm5lY3QocGFydDEuY2hpbGRyZW4sIGNvbjEsIGNvbjIsIGlzRmlyc3RFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgICAgICAgICAgIGlmIChhZGRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbmV3UGFydDI6IGFueSA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlLCBwYXJ0MiwgcGFydDEpO1xyXG4gICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgICAgICAgICAgICB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBuZXdQYXJ0Mi5jaGlsZHJlbltpaV0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBjb24yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQxLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbjEgPSBwYXJ0MS5jaGlsZHJlbltpXTtcclxuICAgICAgICAgICAgY29uMiA9IHBhcnQyLmNoaWxkcmVuW2lpXTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjb24xQ29ubmVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChjb24xICYmIGNvbjEudXNlckRhdGEpIHtcclxuICAgICAgICAgICAgICBjb24xQ29ubmVjdGVkID0gY29uMS51c2VyRGF0YS5jb25uZWN0ZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGNvbjJDb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGNvbjIgJiYgY29uMi51c2VyRGF0YSkge1xyXG4gICAgICAgICAgICAgIGNvbjJDb25uZWN0ZWQgPSBjb24yLnVzZXJEYXRhLmNvbm5lY3RlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiB0aGVzZSBjb25uZWN0b3JzIGNhbiBjb25uZWN0IGNvbm5lY3QgdGhlbVxyXG4gICAgICAgICAgICBpZiAoIWNvbjFDb25uZWN0ZWQgJiYgIWNvbjJDb25uZWN0ZWQgJiYgdGhpcy5DYW5TZWxlY3RvckNvbm5lY3QocGFydDEuY2hpbGRyZW4sIGNvbjEsIGNvbjIsIGlzRmlyc3RFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAgICAgICAgICAgICBpZiAoYWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UGFydDI6IGFueSA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlLCBwYXJ0MiwgcGFydDEpO1xyXG4gICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIG9mIHBhcnQyIGNoYW5nZWQsIHNvIHJlZnJlc2ggY29uMlxyXG4gICAgICAgICAgICAgICAgdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgbmV3UGFydDIuY2hpbGRyZW5baWldKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuU2VsZWN0b3JDb25uZWN0KHNjZW5lLCBwYXJlbnQsIGNvbjEsIGNvbjIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIHN0YXRpYyBUcnlTZWxlY3RvckNvbm5lY3Rpb24oc2NlbmU6IFNjZW5lLCBwYXJlbnQ6IE9iamVjdDNELFxyXG4gIC8vICAgICBwYXJ0MTogYW55LCBwYXJ0MjogYW55LCBjcmVhdGVBZGRhYmxlRm4/OiBGdW5jdGlvbik6IGJvb2xlYW4ge1xyXG4gIC8vICAgICBsZXQgYWRkYWJsZTogYW55O1xyXG4gIC8vICAgICBpZiAoY3JlYXRlQWRkYWJsZUZuKSB7XHJcbiAgLy8gICAgICAgICBhZGRhYmxlID0gcGFydDI7XHJcbiAgLy8gICAgICAgICBwYXJ0MiA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQxLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgY29uMTogT2JqZWN0M0QgPSBwYXJ0MS5jaGlsZHJlbltpXTtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBjb24yOiBPYmplY3QzRCA9IHBhcnQyLmNoaWxkcmVuW2lpXTtcclxuICAvLyAgICAgICAgICAgICAvLyBpZiB0aGVzZSBjb25uZWN0b3JzIGNhbiBjb25uZWN0IGNvbm5lY3QgdGhlbVxyXG4gIC8vICAgICAgICAgICAgIGlmICghY29uMVsnY29ubmVjdGVkJ10gJiYgIWNvbjJbJ2Nvbm5lY3RlZCddICYmIHRoaXMuQ2FuU2VsZWN0b3JDb25uZWN0KGNvbjEsIGNvbjIpKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAvLyAgICAgICAgICAgICAgICAgaWYgKGFkZGFibGUpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQyOiBPYmplY3QzRCA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlLCBwYXJ0MiwgcGFydDEpO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIG9mIHBhcnQyIGNoYW5nZWQsIHNvIHJlZnJlc2ggY29uMlxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgbmV3UGFydDIuY2hpbGRyZW5baWldKTtcclxuICAvLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBjb24yKTtcclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgICByZXR1cm4gZmFsc2U7XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIENvbnZlcnQzRFBvaW50VG9TY3JlZW5Qb2ludChwb2ludDogVmVjdG9yMywgY2FtZXJhOiBDYW1lcmEsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogVmVjdG9yMiB7XHJcbiAgICBpZiAoIXBvaW50KSB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMigpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmVjdG9yOiBWZWN0b3IzID0gcG9pbnQuY2xvbmUoKS5wcm9qZWN0KGNhbWVyYSk7XHJcbiAgICB2ZWN0b3IueCA9ICh2ZWN0b3IueCArIDEpIC8gMiAqIHdpZHRoO1xyXG4gICAgdmVjdG9yLnkgPSAtKHZlY3Rvci55IC0gMSkgLyAyICogaGVpZ2h0O1xyXG4gICAgcmV0dXJuIG5ldyBWZWN0b3IyKHZlY3Rvci54LCB2ZWN0b3IueSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIENhblNlbGVjdG9yQ29ubmVjdChcclxuICAgIGNvbnNQYXJ0MTogT2JqZWN0M0RbXSxcclxuICAgIGNvbjE6IE9iamVjdDNEIHwgYW55LFxyXG4gICAgY29uMjogT2JqZWN0M0QgfCBhbnksXHJcbiAgICBzdGFydFdpdGhNYWxlPzogYm9vbGVhblxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY29uMU5hbWU6IHN0cmluZyA9IChjb24xIGluc3RhbmNlb2YgT2JqZWN0M0QgfHwgY29uMSBpbnN0YW5jZW9mIE1lc2gpID8gY29uMS5uYW1lIDogY29uMS5jb25uZWN0b3I7XHJcbiAgICBjb25zdCBjb24yTmFtZTogc3RyaW5nID0gKGNvbjIgaW5zdGFuY2VvZiBPYmplY3QzRCB8fCBjb24yIGluc3RhbmNlb2YgTWVzaCkgPyBjb24yLm5hbWUgOiBjb24yLmNvbm5lY3RvcjtcclxuICAgIGNvbnN0IHNhbWVQYXJlbnQ6IGJvb2xlYW4gPSAoY29uMSBpbnN0YW5jZW9mIE9iamVjdDNEIHx8IGNvbjEgaW5zdGFuY2VvZiBNZXNoKSAmJlxyXG4gICAgKGNvbjIgaW5zdGFuY2VvZiBPYmplY3QzRCB8fCBjb24yIGluc3RhbmNlb2YgTWVzaCkgPyBjb24xLnBhcmVudCA9PT0gY29uMi5wYXJlbnQgOiBmYWxzZTtcclxuXHJcbiAgICBpZiAoIWNvbjFOYW1lIHx8ICFjb24yTmFtZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJ0czE6IHN0cmluZ1tdID0gY29uMU5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpLFxyXG4gICAgICBwYXJ0czI6IHN0cmluZ1tdID0gY29uMk5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpO1xyXG5cclxuICAgIGlmIChwYXJ0czEubGVuZ3RoID49IDMgJiYgcGFydHMyLmxlbmd0aCA+PSAzICYmICFzYW1lUGFyZW50KSB7XHJcbiAgICAgIGNvbnN0IGNvbm5lY3RhYmxlOiBib29sZWFuID0gcGFydHMxWzBdID09PSAnQycgJiYgcGFydHMyWzBdID09PSAnQycgJiZcclxuICAgICAgICBwYXJ0czFbMV0gPT09IHBhcnRzMlsxXSAmJiBwYXJ0czFbMl0gIT09IHBhcnRzMlsyXTtcclxuICAgICAgcmV0dXJuIGNvbm5lY3RhYmxlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIHN0YXRpYyBDYW5TZWxlY3RvckNvbm5lY3QoY29uMTogT2JqZWN0M0QgfCBhbnksIGNvbjI6IE9iamVjdDNEIHwgYW55KTogYm9vbGVhbiB7XHJcbiAgLy8gICAgIGNvbnN0IGNvbjFOYW1lOiBzdHJpbmcgPSBjb24xIGluc3RhbmNlb2YgT2JqZWN0M0QgPyBjb24xLm5hbWUgOiBjb24xLmNvbm5lY3RvcjtcclxuICAvLyAgICAgY29uc3QgY29uMk5hbWU6IHN0cmluZyA9IGNvbjIgaW5zdGFuY2VvZiBPYmplY3QzRCA/IGNvbjIubmFtZSA6IGNvbjIuY29ubmVjdG9yO1xyXG4gIC8vICAgICBjb25zdCBzYW1lUGFyZW50OiBib29sZWFuID0gY29uMSBpbnN0YW5jZW9mIE9iamVjdDNEICYmIGNvbjIgaW5zdGFuY2VvZiBPYmplY3QzRCA/IGNvbjEucGFyZW50ID09PSBjb24yLnBhcmVudCA6IGZhbHNlO1xyXG4gIC8vICAgICBjb25zdCBwYXJ0czE6IHN0cmluZ1tdID0gY29uMU5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpLFxyXG4gIC8vICAgICAgICAgcGFydHMyOiBzdHJpbmdbXSA9IGNvbjJOYW1lLnRvVXBwZXJDYXNlKCkuc3BsaXQoJ18nKTtcclxuICAvLyAgICAgaWYgKHBhcnRzMS5sZW5ndGggPj0gMyAmJiBwYXJ0czIubGVuZ3RoID49IDMgJiYgIXNhbWVQYXJlbnQpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlOiBib29sZWFuID0gcGFydHMxWzBdID09PSAnQycgJiYgcGFydHMyWzBdID09PSAnQycgJiZcclxuICAvLyAgICAgICAgICAgICBwYXJ0czFbMV0gPT09IHBhcnRzMlsxXSAmJiBwYXJ0czFbMl0gIT09IHBhcnRzMlsyXTtcclxuICAvLyAgICAgICAgIHJldHVybiBjb25uZWN0YWJsZTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICByZXR1cm4gZmFsc2U7XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBTZWxlY3RvckNvbm5lY3Qoc2NlbmU6IFNjZW5lLCBwYXJlbnQ6IE9iamVjdDNELCBjb24xOiBPYmplY3QzRCwgY29uMjogT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAgIGlmICghc2NlbmUgfHwgIXBhcmVudCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb24xWydjb25uZWN0ZWRUbyddID0gY29uMiAmJiBjb24yLnBhcmVudCA/IGNvbjIucGFyZW50Lm5hbWUgOiAnJztcclxuICAgIGNvbjJbJ2Nvbm5lY3RlZFRvJ10gPSBjb24xICYmIGNvbjEucGFyZW50ID8gY29uMS5wYXJlbnQubmFtZSA6ICcnO1xyXG5cclxuICAgIGNvbjEudXNlckRhdGEuY29ubmVjdGVkVG8gPSBjb24yICYmIGNvbjIucGFyZW50ID8gY29uMi5wYXJlbnQubmFtZSA6ICcnO1xyXG4gICAgY29uMS51c2VyRGF0YS5jb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgIGNvbjIudXNlckRhdGEuY29ubmVjdGVkVG8gPSBjb24xICYmIGNvbjEucGFyZW50ID8gY29uMS5wYXJlbnQubmFtZSA6ICcnO1xyXG4gICAgY29uMi51c2VyRGF0YS5jb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBtb3RoZXJSb3RhdGlvbjogRXVsZXIgPSBuZXcgRXVsZXIoMCwgMCwgMCk7XHJcbiAgICBjb25zdCBtb3RoZXJQb3NpdGlvbjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApO1xyXG5cclxuICAgIHBhcmVudC51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG4gICAgbW90aGVyUm90YXRpb24uY29weShwYXJlbnQucm90YXRpb24pO1xyXG4gICAgcGFyZW50LmdldFdvcmxkUG9zaXRpb24obW90aGVyUG9zaXRpb24pO1xyXG5cclxuICAgIHBhcmVudC5yb3RhdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICBwYXJlbnQucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG5cclxuICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgIGNvbnN0IGNvbjFRdWF0OiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24xKSB7XHJcbiAgICAgIGNvbjEuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbjJRdWF0OiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24yKSB7XHJcbiAgICAgIGNvbjIuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjJRdWF0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24xICYmIGNvbjEucGFyZW50KSB7XHJcbiAgICAgIGNvbjEucGFyZW50LmdldFdvcmxkUXVhdGVybmlvbihjb24xUXVhdFBhcmVudCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb24yUXVhdFBhcmVudDogUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcbiAgICBpZiAoY29uMiAmJiBjb24yLnBhcmVudCkge1xyXG4gICAgICBjb24yLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXRQYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvdGF0aW9uOiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgICBjb24xUXVhdC5pbnZlcnQoKSxcclxuICAgICAgY29uMlF1YXRcclxuICAgICkubXVsdGlwbHkoXHJcbiAgICAgIG5ldyBRdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhcclxuICAgICAgICBjb24xUXVhdFBhcmVudCxcclxuICAgICAgICBjb24xUXVhdFBhcmVudFxyXG4gICAgICApXHJcbiAgICApO1xyXG4gICAgaWYgKGNvbjIgJiYgY29uMi5wYXJlbnQpIHtcclxuICAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAgIH1cclxuICAgIC8vIFVwZGF0ZSBiZWNhdXNlIHRoZSBtYXRyaXggaGFzIGJlZW4gdGVtcGVyZWQgd2l0aFxyXG4gICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgLy8gTW92ZSB0aGUgY29ubmVjdG9ycyB0b3dhcmRzIGVhY2hvdGhlclxyXG4gICAgY29uc3QgY29uMVBvczogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICBpZiAoY29uMSkge1xyXG4gICAgICBjb24xLmdldFdvcmxkUG9zaXRpb24oY29uMVBvcyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb24yUG9zOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcclxuICAgIGlmIChjb24yKSB7XHJcbiAgICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtb3ZlOiBWZWN0b3IzID0gY29uMVBvcy5zdWIoY29uMlBvcyk7XHJcbiAgICBpZiAoY29uMiAmJiBjb24yLnBhcmVudCkge1xyXG4gICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi54ICs9IG1vdmUueDtcclxuICAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueSArPSBtb3ZlLnk7XHJcbiAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnogKz0gbW92ZS56O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlc2V0IHBhcmVudCdzIG9iamVjdHMgcm90YXRpb24gYW5kIHBvc2l0aW9uXHJcbiAgICBwYXJlbnQucm90YXRpb24uY29weShtb3RoZXJSb3RhdGlvbik7XHJcbiAgICBwYXJlbnQucG9zaXRpb24uY29weShtb3RoZXJQb3NpdGlvbik7XHJcblxyXG4gICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gICAgaWYgKGNvbjEpIHtcclxuICAgICAgLy8gY29uMVsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICBjb24xLnVzZXJEYXRhLmNvbm5lY3RlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY29uMikge1xyXG4gICAgICAvLyBjb24yWydjb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgIGNvbjIudXNlckRhdGEuY29ubmVjdGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxufVxyXG5cclxuIl19
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import * as THREE from 'three';
|
|
2
|
-
import { Selection } from '@colijnit/configuratorapi/build/model/selection';
|
|
3
|
-
export class SceneUtils {
|
|
4
|
-
static TrySelectorConnection(scene, parent, part1, part2, isFirstElement, createAddableFn) {
|
|
5
|
-
let addable;
|
|
6
|
-
if (createAddableFn) {
|
|
7
|
-
addable = part2;
|
|
8
|
-
part2 = createAddableFn(addable);
|
|
9
|
-
}
|
|
10
|
-
if (part1 && part2) {
|
|
11
|
-
let con1;
|
|
12
|
-
let con2;
|
|
13
|
-
// if part2 is an addable and decoConnection is present, then no need to iterate through connectors
|
|
14
|
-
if (addable && addable instanceof Selection && addable.decoConnection) {
|
|
15
|
-
con1 = part1.children.find(c => c.name === addable.decoConnection);
|
|
16
|
-
if (!con1) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
for (let ii = 0; ii < part2.children.length; ii++) {
|
|
20
|
-
con2 = part2.children[ii];
|
|
21
|
-
// if these connectors can connect connect them
|
|
22
|
-
if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
|
|
23
|
-
// if addable, continue this loop with a new addable
|
|
24
|
-
if (addable) {
|
|
25
|
-
const newPart2 = createAddableFn(addable, part2, part1);
|
|
26
|
-
// reference of part2 changed, so refresh con2
|
|
27
|
-
this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
return this.SelectorConnect(scene, parent, con1, con2);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
for (let i = 0; i < part1.children.length; i++) {
|
|
37
|
-
for (let ii = 0; ii < part2.children.length; ii++) {
|
|
38
|
-
con1 = part1.children[i];
|
|
39
|
-
con2 = part2.children[ii];
|
|
40
|
-
// if these connectors can connect connect them
|
|
41
|
-
if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
|
|
42
|
-
// if addable, continue this loop with a new addable
|
|
43
|
-
if (addable) {
|
|
44
|
-
const newPart2 = createAddableFn(addable, part2, part1);
|
|
45
|
-
// reference of part2 changed, so refresh con2
|
|
46
|
-
this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
return this.SelectorConnect(scene, parent, con1, con2);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
// public static TrySelectorConnection(scene: THREE.Scene, parent: THREE.Object3D,
|
|
59
|
-
// part1: any, part2: any, createAddableFn?: Function): boolean {
|
|
60
|
-
// let addable: any;
|
|
61
|
-
// if (createAddableFn) {
|
|
62
|
-
// addable = part2;
|
|
63
|
-
// part2 = createAddableFn(addable);
|
|
64
|
-
// }
|
|
65
|
-
// for (let i = 0; i < part1.children.length; i++) {
|
|
66
|
-
// for (let ii = 0; ii < part2.children.length; ii++) {
|
|
67
|
-
// const con1: THREE.Object3D = part1.children[i];
|
|
68
|
-
// const con2: THREE.Object3D = part2.children[ii];
|
|
69
|
-
// // if these connectors can connect connect them
|
|
70
|
-
// if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(con1, con2)) {
|
|
71
|
-
// // if addable, continue this loop with a new addable
|
|
72
|
-
// if (addable) {
|
|
73
|
-
// const newPart2: THREE.Object3D = createAddableFn(addable, part2, part1);
|
|
74
|
-
// // reference of part2 changed, so refresh con2
|
|
75
|
-
// this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
|
|
76
|
-
// } else {
|
|
77
|
-
// return this.SelectorConnect(scene, parent, con1, con2);
|
|
78
|
-
// }
|
|
79
|
-
// }
|
|
80
|
-
// }
|
|
81
|
-
// }
|
|
82
|
-
// return false;
|
|
83
|
-
// }
|
|
84
|
-
static Convert3DPointToScreenPoint(point, camera, width, height) {
|
|
85
|
-
if (!point) {
|
|
86
|
-
return new THREE.Vector2();
|
|
87
|
-
}
|
|
88
|
-
const vector = point.clone().project(camera);
|
|
89
|
-
vector.x = (vector.x + 1) / 2 * width;
|
|
90
|
-
vector.y = -(vector.y - 1) / 2 * height;
|
|
91
|
-
return new THREE.Vector2(vector.x, vector.y);
|
|
92
|
-
}
|
|
93
|
-
static CanSelectorConnect(consPart1, con1, con2, startWithMale) {
|
|
94
|
-
// const con1Name: string = (con1.constructor.name === 'Mesh' || con1.constructor.name === 'Object3D') ? con1.name : con1.connector;
|
|
95
|
-
const con1Name = (con1 instanceof THREE.Object3D || con1 instanceof THREE.Mesh) ? con1.name : con1.connector;
|
|
96
|
-
// const con2Name: string = (con2.constructor.name === 'Mesh' || con2.constructor.name === 'Object3D') ? con2.name : con2.connector;
|
|
97
|
-
const con2Name = (con2 instanceof THREE.Object3D || con2 instanceof THREE.Mesh) ? con2.name : con2.connector;
|
|
98
|
-
// const sameParent: boolean = (con1.constructor.name === 'Mesh' || con1.constructor.name === 'Object3D') &&
|
|
99
|
-
// (con2.constructor.name === 'Mesh' || con2.constructor.name === 'Object3D') ? con1.parent === con2.parent : false;
|
|
100
|
-
const sameParent = (con1 instanceof THREE.Object3D || con1 instanceof THREE.Mesh) &&
|
|
101
|
-
(con2 instanceof THREE.Object3D || con2 instanceof THREE.Mesh) ? con1.parent === con2.parent : false;
|
|
102
|
-
if (!con1Name || !con2Name) {
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
105
|
-
const parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
|
|
106
|
-
if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
|
|
107
|
-
const connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
|
|
108
|
-
parts1[1] === parts2[1] && parts1[2] !== parts2[2];
|
|
109
|
-
return connectable;
|
|
110
|
-
}
|
|
111
|
-
return false;
|
|
112
|
-
}
|
|
113
|
-
// public static CanSelectorConnect(con1: THREE.Object3D | any, con2: THREE.Object3D | any): boolean {
|
|
114
|
-
// const con1Name: string = con1 instanceof THREE.Object3D ? con1.name : con1.connector;
|
|
115
|
-
// const con2Name: string = con2 instanceof THREE.Object3D ? con2.name : con2.connector;
|
|
116
|
-
// const sameParent: boolean = con1 instanceof THREE.Object3D && con2 instanceof THREE.Object3D ? con1.parent === con2.parent : false;
|
|
117
|
-
// const parts1: string[] = con1Name.toUpperCase().split('_'),
|
|
118
|
-
// parts2: string[] = con2Name.toUpperCase().split('_');
|
|
119
|
-
// if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
|
|
120
|
-
// const connectable: boolean = parts1[0] === 'C' && parts2[0] === 'C' &&
|
|
121
|
-
// parts1[1] === parts2[1] && parts1[2] !== parts2[2];
|
|
122
|
-
// return connectable;
|
|
123
|
-
// }
|
|
124
|
-
// return false;
|
|
125
|
-
// }
|
|
126
|
-
static SelectorConnect(scene, parent, con1, con2) {
|
|
127
|
-
if (!scene || !parent) {
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
con1['connectedTo'] = con2 && con2.parent ? con2.parent.name : '';
|
|
131
|
-
con2['connectedTo'] = con1 && con1.parent ? con1.parent.name : '';
|
|
132
|
-
const motherRotation = new THREE.Euler(0, 0, 0);
|
|
133
|
-
const motherPosition = new THREE.Vector3(0, 0, 0);
|
|
134
|
-
parent.updateMatrixWorld();
|
|
135
|
-
motherRotation.copy(parent.rotation);
|
|
136
|
-
parent.getWorldPosition(motherPosition);
|
|
137
|
-
parent.rotation.set(0, 0, 0);
|
|
138
|
-
parent.position.set(0, 0, 0);
|
|
139
|
-
scene.updateMatrixWorld(true);
|
|
140
|
-
const con1Quat = new THREE.Quaternion();
|
|
141
|
-
if (con1) {
|
|
142
|
-
con1.getWorldQuaternion(con1Quat);
|
|
143
|
-
}
|
|
144
|
-
const con2Quat = new THREE.Quaternion();
|
|
145
|
-
if (con2) {
|
|
146
|
-
con2.getWorldQuaternion(con2Quat);
|
|
147
|
-
}
|
|
148
|
-
const con1QuatParent = new THREE.Quaternion();
|
|
149
|
-
if (con1 && con1.parent) {
|
|
150
|
-
con1.parent.getWorldQuaternion(con1QuatParent);
|
|
151
|
-
}
|
|
152
|
-
const con2QuatParent = new THREE.Quaternion();
|
|
153
|
-
if (con2 && con2.parent) {
|
|
154
|
-
con2.parent.getWorldQuaternion(con2QuatParent);
|
|
155
|
-
}
|
|
156
|
-
const rotation = new THREE.Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new THREE.Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
|
|
157
|
-
if (con2 && con2.parent) {
|
|
158
|
-
con2.parent.quaternion.copy(rotation);
|
|
159
|
-
}
|
|
160
|
-
// Update because the matrix has been tempered with
|
|
161
|
-
scene.updateMatrixWorld(true);
|
|
162
|
-
// Move the connectors towards eachother
|
|
163
|
-
const con1Pos = new THREE.Vector3();
|
|
164
|
-
if (con1) {
|
|
165
|
-
con1.getWorldPosition(con1Pos);
|
|
166
|
-
}
|
|
167
|
-
const con2Pos = new THREE.Vector3();
|
|
168
|
-
if (con2) {
|
|
169
|
-
con2.getWorldPosition(con2Pos);
|
|
170
|
-
}
|
|
171
|
-
const move = con1Pos.sub(con2Pos);
|
|
172
|
-
if (con2 && con2.parent) {
|
|
173
|
-
con2.parent.position.x += move.x;
|
|
174
|
-
con2.parent.position.y += move.y;
|
|
175
|
-
con2.parent.position.z += move.z;
|
|
176
|
-
}
|
|
177
|
-
// reset parent's objects rotation and position
|
|
178
|
-
parent.rotation.copy(motherRotation);
|
|
179
|
-
parent.position.copy(motherPosition);
|
|
180
|
-
scene.updateMatrixWorld(true);
|
|
181
|
-
// Set the connected flag
|
|
182
|
-
if (con1) {
|
|
183
|
-
con1['connected'] = true;
|
|
184
|
-
}
|
|
185
|
-
if (con2) {
|
|
186
|
-
con2['connected'] = true;
|
|
187
|
-
}
|
|
188
|
-
return true;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25maWd1cmF0b3Ivc3JjL2xpYi91dGlscy9zY2VuZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saURBQWlELENBQUM7QUFFMUUsTUFBTSxPQUFPLFVBQVU7SUFFZCxNQUFNLENBQUMscUJBQXFCLENBQ2pDLEtBQWtCLEVBQ2xCLE1BQXNCLEVBQ3RCLEtBQVUsRUFDVixLQUFVLEVBQ1YsY0FBdUIsRUFDdkIsZUFBMEI7UUFFMUIsSUFBSSxPQUFZLENBQUM7UUFDakIsSUFBSSxlQUFlLEVBQUU7WUFDbkIsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFO1lBQ2xCLElBQUksSUFBb0IsQ0FBQztZQUN6QixJQUFJLElBQW9CLENBQUM7WUFDekIsbUdBQW1HO1lBQ25HLElBQUksT0FBTyxJQUFJLE9BQU8sWUFBWSxTQUFTLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDckUsSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1QsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFO29CQUNqRCxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FB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RSxDQUFDO1FBQ25ELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsTUFBTSxJQUFJLEdBQWtCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNsQztRQUVELCtDQUErQztRQUMvQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVyQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUIseUJBQXlCO1FBQ3pCLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUMxQjtRQUNELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUMxQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQWlFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTY2VuZVV0aWxzIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBUcnlTZWxlY3RvckNvbm5lY3Rpb24oXHJcbiAgICBzY2VuZTogVEhSRUUuU2NlbmUsXHJcbiAgICBwYXJlbnQ6IFRIUkVFLk9iamVjdDNELFxyXG4gICAgcGFydDE6IGFueSxcclxuICAgIHBhcnQyOiBhbnksXHJcbiAgICBpc0ZpcnN0RWxlbWVudDogYm9vbGVhbixcclxuICAgIGNyZWF0ZUFkZGFibGVGbj86IEZ1bmN0aW9uXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYWRkYWJsZTogYW55O1xyXG4gICAgaWYgKGNyZWF0ZUFkZGFibGVGbikge1xyXG4gICAgICBhZGRhYmxlID0gcGFydDI7XHJcbiAgICAgIHBhcnQyID0gY3JlYXRlQWRkYWJsZUZuKGFkZGFibGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBhcnQxICYmIHBhcnQyKSB7XHJcbiAgICAgIGxldCBjb24xOiBUSFJFRS5PYmplY3QzRDtcclxuICAgICAgbGV0IGNvbjI6IFRIUkVFLk9iamVjdDNEO1xyXG4gICAgICAvLyBpZiBwYXJ0MiBpcyBhbiBhZGRhYmxlIGFuZCBkZWNvQ29ubmVjdGlvbiBpcyBwcmVzZW50LCB0aGVuIG5vIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGNvbm5lY3RvcnNcclxuICAgICAgaWYgKGFkZGFibGUgJiYgYWRkYWJsZSBpbnN0YW5jZW9mIFNlbGVjdGlvbiAmJiBhZGRhYmxlLmRlY29Db25uZWN0aW9uKSB7XHJcbiAgICAgICAgY29uMSA9IHBhcnQxLmNoaWxkcmVuLmZpbmQoYyA9PiBjLm5hbWUgPT09IGFkZGFibGUuZGVjb0Nvbm5lY3Rpb24pO1xyXG4gICAgICAgIGlmICghY29uMSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICBjb24yID0gcGFydDIuY2hpbGRyZW5baWldO1xyXG4gICAgICAgICAgLy8gaWYgdGhlc2UgY29ubmVjdG9ycyBjYW4gY29ubmVjdCBjb25uZWN0IHRoZW1cclxuICAgICAgICAgIGlmICghY29uMVsnY29ubmVjdGVkJ10gJiYgIWNvbjJbJ2Nvbm5lY3RlZCddICYmIHRoaXMuQ2FuU2VsZWN0b3JDb25uZWN0KHBhcnQxLmNoaWxkcmVuLCBjb24xLCBjb24yLCBpc0ZpcnN0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgLy8gaWYgYWRkYWJsZSwgY29udGludWUgdGhpcyBsb29wIHdpdGggYSBuZXcgYWRkYWJsZVxyXG4gICAgICAgICAgICBpZiAoYWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQyOiBhbnkgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAgICAgICAgICAgICAvLyByZWZlcmVuY2Ugb2YgcGFydDIgY2hhbmdlZCwgc28gcmVmcmVzaCBjb24yXHJcbiAgICAgICAgICAgICAgdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgbmV3UGFydDIuY2hpbGRyZW5baWldKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0MS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHBhcnQyLmNoaWxkcmVuLmxlbmd0aDsgaWkrKykge1xyXG4gICAgICAgICAgICBjb24xID0gcGFydDEuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGNvbjIgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXNlIGNvbm5lY3RvcnMgY2FuIGNvbm5lY3QgY29ubmVjdCB0aGVtXHJcbiAgICAgICAgICAgIGlmICghY29uMVsnY29ubmVjdGVkJ10gJiYgIWNvbjJbJ2Nvbm5lY3RlZCddICYmIHRoaXMuQ2FuU2VsZWN0b3JDb25uZWN0KHBhcnQxLmNoaWxkcmVuLCBjb24xLCBjb24yLCBpc0ZpcnN0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgICAgICAgICAgICAgaWYgKGFkZGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQyOiBhbnkgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgICAgICAgICAgICAgIHRoaXMuU2VsZWN0b3JDb25uZWN0KHNjZW5lLCBwYXJlbnQsIGNvbjEsIG5ld1BhcnQyLmNoaWxkcmVuW2lpXSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBjb24yKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBzdGF0aWMgVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHNjZW5lOiBUSFJFRS5TY2VuZSwgcGFyZW50OiBUSFJFRS5PYmplY3QzRCxcclxuICAvLyAgICAgcGFydDE6IGFueSwgcGFydDI6IGFueSwgY3JlYXRlQWRkYWJsZUZuPzogRnVuY3Rpb24pOiBib29sZWFuIHtcclxuICAvLyAgICAgbGV0IGFkZGFibGU6IGFueTtcclxuICAvLyAgICAgaWYgKGNyZWF0ZUFkZGFibGVGbikge1xyXG4gIC8vICAgICAgICAgYWRkYWJsZSA9IHBhcnQyO1xyXG4gIC8vICAgICAgICAgcGFydDIgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0MS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHBhcnQyLmNoaWxkcmVuLmxlbmd0aDsgaWkrKykge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGNvbjE6IFRIUkVFLk9iamVjdDNEID0gcGFydDEuY2hpbGRyZW5baV07XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgY29uMjogVEhSRUUuT2JqZWN0M0QgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgLy8gICAgICAgICAgICAgLy8gaWYgdGhlc2UgY29ubmVjdG9ycyBjYW4gY29ubmVjdCBjb25uZWN0IHRoZW1cclxuICAvLyAgICAgICAgICAgICBpZiAoIWNvbjFbJ2Nvbm5lY3RlZCddICYmICFjb24yWydjb25uZWN0ZWQnXSAmJiB0aGlzLkNhblNlbGVjdG9yQ29ubmVjdChjb24xLCBjb24yKSkge1xyXG4gIC8vICAgICAgICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgLy8gICAgICAgICAgICAgICAgIGlmIChhZGRhYmxlKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXJ0MjogVEhSRUUuT2JqZWN0M0QgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2VsZWN0b3JDb25uZWN0KHNjZW5lLCBwYXJlbnQsIGNvbjEsIG5ld1BhcnQyLmNoaWxkcmVuW2lpXSk7XHJcbiAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBDb252ZXJ0M0RQb2ludFRvU2NyZWVuUG9pbnQocG9pbnQ6IFRIUkVFLlZlY3RvcjMsIGNhbWVyYTogVEhSRUUuQ2FtZXJhLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFRIUkVFLlZlY3RvcjIge1xyXG4gICAgaWYgKCFwb2ludCkge1xyXG4gICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHZlY3RvcjogVEhSRUUuVmVjdG9yMyA9IHBvaW50LmNsb25lKCkucHJvamVjdChjYW1lcmEpO1xyXG4gICAgdmVjdG9yLnggPSAodmVjdG9yLnggKyAxKSAvIDIgKiB3aWR0aDtcclxuICAgIHZlY3Rvci55ID0gLSh2ZWN0b3IueSAtIDEpIC8gMiAqIGhlaWdodDtcclxuICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMih2ZWN0b3IueCwgdmVjdG9yLnkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBDYW5TZWxlY3RvckNvbm5lY3QoXHJcbiAgICBjb25zUGFydDE6IFRIUkVFLk9iamVjdDNEW10sIGNvbjE6IFRIUkVFLk9iamVjdDNEIHwgYW55LCBjb24yOiBUSFJFRS5PYmplY3QzRCB8IGFueSwgc3RhcnRXaXRoTWFsZT86IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIC8vIGNvbnN0IGNvbjFOYW1lOiBzdHJpbmcgPSAoY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSA/IGNvbjEubmFtZSA6IGNvbjEuY29ubmVjdG9yO1xyXG4gICAgY29uc3QgY29uMU5hbWU6IHN0cmluZyA9IChjb24xIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgfHwgY29uMSBpbnN0YW5jZW9mIFRIUkVFLk1lc2gpID8gY29uMS5uYW1lIDogY29uMS5jb25uZWN0b3I7XHJcbiAgICAvLyBjb25zdCBjb24yTmFtZTogc3RyaW5nID0gKGNvbjIuY29uc3RydWN0b3IubmFtZSA9PT0gJ01lc2gnIHx8IGNvbjIuY29uc3RydWN0b3IubmFtZSA9PT0gJ09iamVjdDNEJykgPyBjb24yLm5hbWUgOiBjb24yLmNvbm5lY3RvcjtcclxuICAgIGNvbnN0IGNvbjJOYW1lOiBzdHJpbmcgPSAoY29uMiBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEIHx8IGNvbjIgaW5zdGFuY2VvZiBUSFJFRS5NZXNoKSA/IGNvbjIubmFtZSA6IGNvbjIuY29ubmVjdG9yO1xyXG4gICAgLy8gY29uc3Qgc2FtZVBhcmVudDogYm9vbGVhbiA9IChjb24xLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNZXNoJyB8fCBjb24xLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPYmplY3QzRCcpICYmXHJcbiAgICAvLyAoY29uMi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSA/IGNvbjEucGFyZW50ID09PSBjb24yLnBhcmVudCA6IGZhbHNlO1xyXG4gICAgY29uc3Qgc2FtZVBhcmVudDogYm9vbGVhbiA9IChjb24xIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgfHwgY29uMSBpbnN0YW5jZW9mIFRIUkVFLk1lc2gpICYmXHJcbiAgICAoY29uMiBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEIHx8IGNvbjIgaW5zdGFuY2VvZiBUSFJFRS5NZXNoKSA/IGNvbjEucGFyZW50ID09PSBjb24yLnBhcmVudCA6IGZhbHNlO1xyXG5cclxuICAgIGlmICghY29uMU5hbWUgfHwgIWNvbjJOYW1lKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBhcnRzMTogc3RyaW5nW10gPSBjb24xTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyksXHJcbiAgICAgIHBhcnRzMjogc3RyaW5nW10gPSBjb24yTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyk7XHJcbiAgICBpZiAocGFydHMxLmxlbmd0aCA+PSAzICYmIHBhcnRzMi5sZW5ndGggPj0gMyAmJiAhc2FtZVBhcmVudCkge1xyXG4gICAgICBjb25zdCBjb25uZWN0YWJsZTogYm9vbGVhbiA9IHBhcnRzMVswXSA9PT0gJ0MnICYmIHBhcnRzMlswXSA9PT0gJ0MnICYmXHJcbiAgICAgICAgcGFydHMxWzFdID09PSBwYXJ0czJbMV0gJiYgcGFydHMxWzJdICE9PSBwYXJ0czJbMl07XHJcbiAgICAgIHJldHVybiBjb25uZWN0YWJsZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBzdGF0aWMgQ2FuU2VsZWN0b3JDb25uZWN0KGNvbjE6IFRIUkVFLk9iamVjdDNEIHwgYW55LCBjb24yOiBUSFJFRS5PYmplY3QzRCB8IGFueSk6IGJvb2xlYW4ge1xyXG4gIC8vICAgICBjb25zdCBjb24xTmFtZTogc3RyaW5nID0gY29uMSBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEID8gY29uMS5uYW1lIDogY29uMS5jb25uZWN0b3I7XHJcbiAgLy8gICAgIGNvbnN0IGNvbjJOYW1lOiBzdHJpbmcgPSBjb24yIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24yLm5hbWUgOiBjb24yLmNvbm5lY3RvcjtcclxuICAvLyAgICAgY29uc3Qgc2FtZVBhcmVudDogYm9vbGVhbiA9IGNvbjEgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCAmJiBjb24yIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24xLnBhcmVudCA9PT0gY29uMi5wYXJlbnQgOiBmYWxzZTtcclxuICAvLyAgICAgY29uc3QgcGFydHMxOiBzdHJpbmdbXSA9IGNvbjFOYW1lLnRvVXBwZXJDYXNlKCkuc3BsaXQoJ18nKSxcclxuICAvLyAgICAgICAgIHBhcnRzMjogc3RyaW5nW10gPSBjb24yTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyk7XHJcbiAgLy8gICAgIGlmIChwYXJ0czEubGVuZ3RoID49IDMgJiYgcGFydHMyLmxlbmd0aCA+PSAzICYmICFzYW1lUGFyZW50KSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBjb25uZWN0YWJsZTogYm9vbGVhbiA9IHBhcnRzMVswXSA9PT0gJ0MnICYmIHBhcnRzMlswXSA9PT0gJ0MnICYmXHJcbiAgLy8gICAgICAgICAgICAgcGFydHMxWzFdID09PSBwYXJ0czJbMV0gJiYgcGFydHMxWzJdICE9PSBwYXJ0czJbMl07XHJcbiAgLy8gICAgICAgICByZXR1cm4gY29ubmVjdGFibGU7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgU2VsZWN0b3JDb25uZWN0KHNjZW5lOiBUSFJFRS5TY2VuZSwgcGFyZW50OiBUSFJFRS5PYmplY3QzRCwgY29uMTogVEhSRUUuT2JqZWN0M0QsIGNvbjI6IFRIUkVFLk9iamVjdDNEKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXNjZW5lIHx8ICFwYXJlbnQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uMVsnY29ubmVjdGVkVG8nXSA9IGNvbjIgJiYgY29uMi5wYXJlbnQgPyBjb24yLnBhcmVudC5uYW1lIDogJyc7XHJcbiAgICBjb24yWydjb25uZWN0ZWRUbyddID0gY29uMSAmJiBjb24xLnBhcmVudCA/IGNvbjEucGFyZW50Lm5hbWUgOiAnJztcclxuXHJcbiAgICBjb25zdCBtb3RoZXJSb3RhdGlvbjogVEhSRUUuRXVsZXIgPSBuZXcgVEhSRUUuRXVsZXIoMCwgMCwgMCk7XHJcbiAgICBjb25zdCBtb3RoZXJQb3NpdGlvbjogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIDApO1xyXG5cclxuICAgIHBhcmVudC51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG4gICAgbW90aGVyUm90YXRpb24uY29weShwYXJlbnQucm90YXRpb24pO1xyXG4gICAgcGFyZW50LmdldFdvcmxkUG9zaXRpb24obW90aGVyUG9zaXRpb24pO1xyXG5cclxuICAgIHBhcmVudC5yb3RhdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICBwYXJlbnQucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG5cclxuICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgIGNvbnN0IGNvbjFRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24xKSB7XHJcbiAgICAgIGNvbjEuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbjJRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24yKSB7XHJcbiAgICAgIGNvbjIuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjJRdWF0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24xICYmIGNvbjEucGFyZW50KSB7XHJcbiAgICAgIGNvbjEucGFyZW50LmdldFdvcmxkUXVhdGVybmlvbihjb24xUXVhdFBhcmVudCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb24yUXVhdFBhcmVudDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICBpZiAoY29uMiAmJiBjb24yLnBhcmVudCkge1xyXG4gICAgICBjb24yLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXRQYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvdGF0aW9uOiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgICBjb24xUXVhdC5pbnZlcnQoKSxcclxuICAgICAgY29uMlF1YXRcclxuICAgICkubXVsdGlwbHkoXHJcbiAgICAgIG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhcclxuICAgICAgICBjb24xUXVhdFBhcmVudCxcclxuICAgICAgICBjb24xUXVhdFBhcmVudFxyXG4gICAgICApXHJcbiAgICApO1xyXG4gICAgaWYgKGNvbjIgJiYgY29uMi5wYXJlbnQpIHtcclxuICAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAgIH1cclxuICAgIC8vIFVwZGF0ZSBiZWNhdXNlIHRoZSBtYXRyaXggaGFzIGJlZW4gdGVtcGVyZWQgd2l0aFxyXG4gICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgLy8gTW92ZSB0aGUgY29ubmVjdG9ycyB0b3dhcmRzIGVhY2hvdGhlclxyXG4gICAgY29uc3QgY29uMVBvczogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBpZiAoY29uMSkge1xyXG4gICAgICBjb24xLmdldFdvcmxkUG9zaXRpb24oY29uMVBvcyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb24yUG9zOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGlmIChjb24yKSB7XHJcbiAgICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtb3ZlOiBUSFJFRS5WZWN0b3IzID0gY29uMVBvcy5zdWIoY29uMlBvcyk7XHJcbiAgICBpZiAoY29uMiAmJiBjb24yLnBhcmVudCkge1xyXG4gICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi54ICs9IG1vdmUueDtcclxuICAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueSArPSBtb3ZlLnk7XHJcbiAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnogKz0gbW92ZS56O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlc2V0IHBhcmVudCdzIG9iamVjdHMgcm90YXRpb24gYW5kIHBvc2l0aW9uXHJcbiAgICBwYXJlbnQucm90YXRpb24uY29weShtb3RoZXJSb3RhdGlvbik7XHJcbiAgICBwYXJlbnQucG9zaXRpb24uY29weShtb3RoZXJQb3NpdGlvbik7XHJcblxyXG4gICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gICAgaWYgKGNvbjEpIHtcclxuICAgICAgY29uMVsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbjIpIHtcclxuICAgICAgY29uMlsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIHN0YXRpYyBTZWxlY3RvckNvbm5lY3Qoc2NlbmU6IFRIUkVFLlNjZW5lLCBwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBjb24xOiBUSFJFRS5PYmplY3QzRCwgY29uMjogVEhSRUUuT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAvLyAgICAgaWYgKCFzY2VuZSB8fCAhcGFyZW50KSB7XHJcbiAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgY29uMVsnY29ubmVjdGVkVG8nXSA9IGNvbjIucGFyZW50Lm5hbWU7XHJcbiAgLy8gICAgIGNvbjJbJ2Nvbm5lY3RlZFRvJ10gPSBjb24xLnBhcmVudC5uYW1lO1xyXG4gIC8vXHJcbiAgLy8gICAgIGNvbnN0IG1vdGhlclJvdGF0aW9uOiBUSFJFRS5FdWxlciA9IG5ldyBUSFJFRS5FdWxlcigwLCAwLCAwKTtcclxuICAvLyAgICAgY29uc3QgbW90aGVyUG9zaXRpb246IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCAwKTtcclxuICAvL1xyXG4gIC8vICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAvLyAgICAgbW90aGVyUm90YXRpb24uY29weShwYXJlbnQucm90YXRpb24pO1xyXG4gIC8vICAgICBwYXJlbnQuZ2V0V29ybGRQb3NpdGlvbihtb3RoZXJQb3NpdGlvbik7XHJcbiAgLy9cclxuICAvLyAgICAgcGFyZW50LnJvdGF0aW9uLnNldCgwLCAwLCAwKTtcclxuICAvLyAgICAgcGFyZW50LnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAvL1xyXG4gIC8vICAgICBjb25zdCBjb24xUXVhdDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgLy8gICAgIGNvbjEuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0KTtcclxuICAvLyAgICAgY29uc3QgY29uMlF1YXQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gIC8vICAgICBjb24yLmdldFdvcmxkUXVhdGVybmlvbihjb24yUXVhdCk7XHJcbiAgLy8gICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAvLyAgICAgY29uMS5wYXJlbnQuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0UGFyZW50KTtcclxuICAvLyAgICAgY29uc3QgY29uMlF1YXRQYXJlbnQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gIC8vICAgICBjb24yLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXRQYXJlbnQpO1xyXG4gIC8vXHJcbiAgLy8gICAgIGNvbnN0IHJvdGF0aW9uOiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gIC8vICAgICAgICAgY29uMVF1YXQuaW52ZXJ0KCksXHJcbiAgLy8gICAgICAgICBjb24yUXVhdFxyXG4gIC8vICAgICApLm11bHRpcGx5KFxyXG4gIC8vICAgICAgICAgbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gIC8vICAgICAgICAgICAgIGNvbjFRdWF0UGFyZW50LFxyXG4gIC8vICAgICAgICAgICAgIGNvbjFRdWF0UGFyZW50XHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICk7XHJcbiAgLy9cclxuICAvLyAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAvLyAgICAgLy8gVXBkYXRlIGJlY2F1c2UgdGhlIG1hdHJpeCBoYXMgYmVlbiB0ZW1wZXJlZCB3aXRoXHJcbiAgLy8gICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG4gIC8vXHJcbiAgLy8gICAgIC8vIE1vdmUgdGhlIGNvbm5lY3RvcnMgdG93YXJkcyBlYWNob3RoZXJcclxuICAvLyAgICAgY29uc3QgY29uMVBvczogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgLy8gICAgIGNvbjEuZ2V0V29ybGRQb3NpdGlvbihjb24xUG9zKTtcclxuICAvLyAgICAgY29uc3QgY29uMlBvczogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgLy8gICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuICAvL1xyXG4gIC8vICAgICBjb25zdCBtb3ZlOiBUSFJFRS5WZWN0b3IzID0gY29uMVBvcy5zdWIoY29uMlBvcyk7XHJcbiAgLy8gICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnggKz0gbW92ZS54O1xyXG4gIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi55ICs9IG1vdmUueTtcclxuICAvLyAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueiArPSBtb3ZlLno7XHJcbiAgLy9cclxuICAvLyAgICAgLy8gcmVzZXQgcGFyZW50J3Mgb2JqZWN0cyByb3RhdGlvbiBhbmQgcG9zaXRpb25cclxuICAvLyAgICAgcGFyZW50LnJvdGF0aW9uLmNvcHkobW90aGVyUm90YXRpb24pO1xyXG4gIC8vICAgICBwYXJlbnQucG9zaXRpb24uY29weShtb3RoZXJQb3NpdGlvbik7XHJcbiAgLy9cclxuICAvLyAgICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcbiAgLy9cclxuICAvLyAgICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gIC8vICAgICBjb24xWydjb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgLy8gICAgIGNvbjJbJ2Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAvLyAgICAgcmV0dXJuIHRydWU7XHJcbiAgLy8gfVxyXG5cclxufVxyXG4iXX0=
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import * as THREE from 'three';
|
|
2
|
-
import { Mesh, MeshBasicMaterial, PlaneGeometry } from 'three';
|
|
3
|
-
import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry';
|
|
4
|
-
import { FontService } from '../services/font.service';
|
|
5
|
-
import { ServiceLocator } from '../services/locator.service';
|
|
6
|
-
const textHeight = 0.01;
|
|
7
|
-
export function makeTextMesh(text, font, color = 0xFF00FF, size = 0.08, beveled = false, depthTest = true, label) {
|
|
8
|
-
if (!font) {
|
|
9
|
-
const fontService = ServiceLocator.injector.get(FontService);
|
|
10
|
-
font = fontService.monospaceFont;
|
|
11
|
-
}
|
|
12
|
-
if (label) {
|
|
13
|
-
label = label + ': ';
|
|
14
|
-
}
|
|
15
|
-
if (!label) {
|
|
16
|
-
label = '';
|
|
17
|
-
}
|
|
18
|
-
const textGeo = new TextGeometry(label + text, {
|
|
19
|
-
font: font,
|
|
20
|
-
size: size,
|
|
21
|
-
depth: textHeight,
|
|
22
|
-
curveSegments: 4,
|
|
23
|
-
bevelEnabled: beveled,
|
|
24
|
-
bevelThickness: 0.01,
|
|
25
|
-
bevelSize: 0.01
|
|
26
|
-
});
|
|
27
|
-
textGeo.computeBoundingBox();
|
|
28
|
-
textGeo.computeVertexNormals();
|
|
29
|
-
const materials = [
|
|
30
|
-
new THREE.MeshBasicMaterial({ color: color, depthTest: depthTest })
|
|
31
|
-
];
|
|
32
|
-
if (beveled) {
|
|
33
|
-
materials.push(new THREE.MeshBasicMaterial({ color: 0xffffff, depthTest: depthTest }));
|
|
34
|
-
}
|
|
35
|
-
return new THREE.Mesh(textGeo, materials);
|
|
36
|
-
}
|
|
37
|
-
export function createTextWithBackground(text, font, fontSize = 0.08, textColor = 0xFF00FF, backgroundColor = 0xFFFFFF, backgroundOpacity = 0.7, padding = 1.2, label) {
|
|
38
|
-
if (label) {
|
|
39
|
-
label = label + ': ';
|
|
40
|
-
}
|
|
41
|
-
if (!label) {
|
|
42
|
-
label = '';
|
|
43
|
-
}
|
|
44
|
-
const textGeometry = new TextGeometry(label + text, {
|
|
45
|
-
font: font,
|
|
46
|
-
size: fontSize,
|
|
47
|
-
depth: textHeight
|
|
48
|
-
});
|
|
49
|
-
textGeometry.computeBoundingBox();
|
|
50
|
-
const textWidthBlock = textGeometry.boundingBox.max.x - textGeometry.boundingBox.min.x;
|
|
51
|
-
const textHeightBlock = textGeometry.boundingBox.max.y - textGeometry.boundingBox.min.y;
|
|
52
|
-
textGeometry.translate(-0.5 * textWidthBlock, -2 * textHeight, 0);
|
|
53
|
-
const textMaterial = new MeshBasicMaterial({ color: textColor });
|
|
54
|
-
const textMesh = new Mesh(textGeometry, textMaterial);
|
|
55
|
-
const backgroundGeometry = new PlaneGeometry(textWidthBlock + padding * fontSize, textHeightBlock + padding * fontSize);
|
|
56
|
-
const backgroundMaterial = new MeshBasicMaterial({
|
|
57
|
-
color: backgroundColor,
|
|
58
|
-
transparent: true,
|
|
59
|
-
opacity: backgroundOpacity
|
|
60
|
-
});
|
|
61
|
-
const backgroundMesh = new Mesh(backgroundGeometry, backgroundMaterial);
|
|
62
|
-
backgroundMesh.position.z = -0.01; // prevent z-fighting
|
|
63
|
-
const mesh = new Mesh();
|
|
64
|
-
mesh.add(backgroundMesh);
|
|
65
|
-
mesh.add(textMesh);
|
|
66
|
-
return mesh;
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmZpZ3VyYXRvci9zcmMvbGliL3V0aWxzL3RleHQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFN0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFM0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBRXhCLE1BQU0sVUFBVSxZQUFZLENBQzFCLElBQVksRUFDWixJQUFXLEVBQ1gsUUFBYSxRQUFRLEVBQ3JCLE9BQWUsSUFBSSxFQUNuQixVQUFtQixLQUFLLEVBQ3hCLFlBQXFCLElBQUksRUFDekIsS0FBYztJQUVkLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDVCxNQUFNLFdBQVcsR0FBZ0IsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUUsSUFBSSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7S0FDbEM7SUFDRCxJQUFJLEtBQUssRUFBRTtRQUNULEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO0tBQ3RCO0lBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNWLEtBQUssR0FBRyxFQUFFLENBQUM7S0FDWjtJQUVELE1BQU0sT0FBTyxHQUFRLElBQUksWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUU7UUFDbEQsSUFBSSxFQUFFLElBQUk7UUFDVixJQUFJLEVBQUUsSUFBSTtRQUNWLEtBQUssRUFBRSxVQUFVO1FBQ2pC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Q0FBQyxDQUFDO0lBQ25CLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtNZXNoLCBNZXNoQmFzaWNNYXRlcmlhbCwgUGxhbmVHZW9tZXRyeX0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0ZvbnR9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0ZvbnRMb2FkZXInO1xyXG5pbXBvcnQge1RleHRHZW9tZXRyeX0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2dlb21ldHJpZXMvVGV4dEdlb21ldHJ5JztcclxuaW1wb3J0IHtGb250U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvZm9udC5zZXJ2aWNlJztcclxuaW1wb3J0IHtTZXJ2aWNlTG9jYXRvcn0gZnJvbSAnLi4vc2VydmljZXMvbG9jYXRvci5zZXJ2aWNlJztcclxuXHJcbmNvbnN0IHRleHRIZWlnaHQgPSAwLjAxO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VUZXh0TWVzaChcclxuICB0ZXh0OiBzdHJpbmcsXHJcbiAgZm9udD86IEZvbnQsXHJcbiAgY29sb3I6IGFueSA9IDB4RkYwMEZGLFxyXG4gIHNpemU6IG51bWJlciA9IDAuMDgsXHJcbiAgYmV2ZWxlZDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gIGRlcHRoVGVzdDogYm9vbGVhbiA9IHRydWUsXHJcbiAgbGFiZWw/OiBzdHJpbmdcclxuKTogTWVzaCB7XHJcbiAgaWYgKCFmb250KSB7XHJcbiAgICBjb25zdCBmb250U2VydmljZTogRm9udFNlcnZpY2UgPSBTZXJ2aWNlTG9jYXRvci5pbmplY3Rvci5nZXQoRm9udFNlcnZpY2UpO1xyXG4gICAgZm9udCA9IGZvbnRTZXJ2aWNlLm1vbm9zcGFjZUZvbnQ7XHJcbiAgfVxyXG4gIGlmIChsYWJlbCkge1xyXG4gICAgbGFiZWwgPSBsYWJlbCArICc6ICc7XHJcbiAgfVxyXG4gIGlmICghbGFiZWwpIHtcclxuICAgIGxhYmVsID0gJyc7XHJcbiAgfVxyXG5cclxuICBjb25zdCB0ZXh0R2VvOiBhbnkgPSBuZXcgVGV4dEdlb21ldHJ5KGxhYmVsICsgdGV4dCwge1xyXG4gICAgZm9udDogZm9udCxcclxuICAgIHNpemU6IHNpemUsXHJcbiAgICBkZXB0aDogdGV4dEhlaWdodCxcclxuICAgIGN1cnZlU2VnbWVudHM6IDQsXHJcbiAgICBiZXZlbEVuYWJsZWQ6IGJldmVsZWQsXHJcbiAgICBiZXZlbFRoaWNrbmVzczogMC4wMSxcclxuICAgIGJldmVsU2l6ZTogMC4wMVxyXG4gIH0pO1xyXG4gIHRleHRHZW8uY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbiAgdGV4dEdlby5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xyXG5cclxuICBjb25zdCBtYXRlcmlhbHM6IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsW10gPSBbXHJcbiAgICBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe2NvbG9yOiBjb2xvciwgZGVwdGhUZXN0OiBkZXB0aFRlc3R9KVxyXG4gIF07XHJcbiAgaWYgKGJldmVsZWQpIHtcclxuICAgIG1hdGVyaWFscy5wdXNoKG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6IDB4ZmZmZmZmLCBkZXB0aFRlc3Q6IGRlcHRoVGVzdH0pKTtcclxuICB9XHJcbiAgcmV0dXJuIG5ldyBUSFJFRS5NZXNoKHRleHRHZW8sIG1hdGVyaWFscyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXh0V2l0aEJhY2tncm91bmQoXHJcbiAgdGV4dDogc3RyaW5nLFxyXG4gIGZvbnQ6IEZvbnQsXHJcbiAgZm9udFNpemU6IG51bWJlciA9IDAuMDgsXHJcbiAgdGV4dENvbG9yOiBhbnkgPSAweEZGMDBGRixcclxuICBiYWNrZ3JvdW5kQ29sb3I6IGFueSA9IDB4RkZGRkZGLFxyXG4gIGJhY2tncm91bmRPcGFjaXR5OiBudW1iZXIgPSAwLjcsXHJcbiAgcGFkZGluZzogbnVtYmVyID0gMS4yLFxyXG4gIGxhYmVsPzogc3RyaW5nXHJcbik6IE1lc2gge1xyXG5cclxuICBpZiAobGFiZWwpIHtcclxuICAgIGxhYmVsID0gbGFiZWwgKyAnOiAnO1xyXG4gIH1cclxuICBpZiAoIWxhYmVsKSB7XHJcbiAgICBsYWJlbCA9ICcnO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdGV4dEdlb21ldHJ5OiBUZXh0R2VvbWV0cnkgPSBuZXcgVGV4dEdlb21ldHJ5KGxhYmVsICsgdGV4dCwge1xyXG4gICAgZm9udDogZm9udCxcclxuICAgIHNpemU6IGZvbnRTaXplLFxyXG4gICAgZGVwdGg6IHRleHRIZWlnaHRcclxuICB9KTtcclxuXHJcbiAgdGV4dEdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG4gIGNvbnN0IHRleHRXaWR0aEJsb2NrID0gdGV4dEdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC54IC0gdGV4dEdlb21ldHJ5LmJvdW5kaW5nQm94Lm1pbi54O1xyXG4gIGNvbnN0IHRleHRIZWlnaHRCbG9jayA9IHRleHRHZW9tZXRyeS5ib3VuZGluZ0JveC5tYXgueSAtIHRleHRHZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueTtcclxuICB0ZXh0R2VvbWV0cnkudHJhbnNsYXRlKC0wLjUgKiB0ZXh0V2lkdGhCbG9jaywgLTIgKiB0ZXh0SGVpZ2h0LCAwKTtcclxuXHJcbiAgY29uc3QgdGV4dE1hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6IHRleHRDb2xvcn0pO1xyXG4gIGNvbnN0IHRleHRNZXNoOiBNZXNoID0gbmV3IE1lc2godGV4dEdlb21ldHJ5LCB0ZXh0TWF0ZXJpYWwpO1xyXG5cclxuICBjb25zdCBiYWNrZ3JvdW5kR2VvbWV0cnk6IFBsYW5lR2VvbWV0cnkgPSBuZXcgUGxhbmVHZW9tZXRyeSh0ZXh0V2lkdGhCbG9jayArIHBhZGRpbmcgKiBmb250U2l6ZSwgdGV4dEhlaWdodEJsb2NrICsgcGFkZGluZyAqIGZvbnRTaXplKTtcclxuICBjb25zdCBiYWNrZ3JvdW5kTWF0ZXJpYWw6IE1lc2hCYXNpY01hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKHtcclxuICAgIGNvbG9yOiBiYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgIG9wYWNpdHk6IGJhY2tncm91bmRPcGFjaXR5XHJcbiAgfSk7XHJcbiAgY29uc3QgYmFja2dyb3VuZE1lc2g6IE1lc2ggPSBuZXcgTWVzaChiYWNrZ3JvdW5kR2VvbWV0cnksIGJhY2tncm91bmRNYXRlcmlhbCk7XHJcblxyXG4gIGJhY2tncm91bmRNZXNoLnBvc2l0aW9uLnogPSAtMC4wMTsgLy8gcHJldmVudCB6LWZpZ2h0aW5nXHJcblxyXG4gIGNvbnN0IG1lc2g6IE1lc2ggPSBuZXcgTWVzaCgpO1xyXG4gIG1lc2guYWRkKGJhY2tncm91bmRNZXNoKTtcclxuICBtZXNoLmFkZCh0ZXh0TWVzaCk7XHJcbiAgcmV0dXJuIG1lc2g7XHJcbn1cclxuIl19
|