@colijnit/homedecorator 255.1.1
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/_variables.scss +1 -0
- package/app/app.component.scss +30 -0
- package/app/app.version.d.ts +5 -0
- package/app/bundle/threedselector-bundle/threedselector-bundle.component.scss +24 -0
- package/app/bundle/threedselector-bundle/threedselector-selections-bundle.component.scss +4 -0
- package/app/core/components/debug/debug.component.d.ts +17 -0
- package/app/core/components/debug/debug.component.scss +27 -0
- package/app/core/components/error/error-message.component.d.ts +14 -0
- package/app/core/components/error/error-message.component.scss +18 -0
- package/app/core/components/tooltip/tooltip.component.d.ts +17 -0
- package/app/core/components/tooltip/tooltip.component.scss +34 -0
- package/app/core/const/dimensioning.d.ts +24 -0
- package/app/core/core.module.d.ts +27 -0
- package/app/core/directive/autofocus.directive.d.ts +11 -0
- package/app/core/directive/tooltip.directive.d.ts +21 -0
- package/app/core/directive/visibility-observer-master.directive.d.ts +12 -0
- package/app/core/directive/visibility-observer.directive.d.ts +16 -0
- package/app/core/enum/configuration-key.enum.d.ts +35 -0
- package/app/core/enum/export-type.enum.d.ts +5 -0
- package/app/core/enum/google-tag-manager-event.enum.d.ts +12 -0
- package/app/core/enum/icon-name.enum.d.ts +15 -0
- package/app/core/enum/icon.enum.d.ts +33 -0
- package/app/core/enum/light.enum.d.ts +7 -0
- package/app/core/enum/message-type.enum.d.ts +69 -0
- package/app/core/enum/model-type.enum.d.ts +6 -0
- package/app/core/enum/output-encoding.enum.d.ts +4 -0
- package/app/core/enum/shadow-map-type.enum.d.ts +6 -0
- package/app/core/enum/user-role-type.enum.d.ts +18 -0
- package/app/core/enum/view-mode.enum.d.ts +9 -0
- package/app/core/enum/xr-mode.enum.d.ts +4 -0
- package/app/core/interface/adjustable-element.interface.d.ts +5 -0
- package/app/core/interface/category.interface.d.ts +9 -0
- package/app/core/interface/changes.interface.d.ts +9 -0
- package/app/core/interface/child-params.interface.d.ts +3 -0
- package/app/core/interface/configuration-data.interface.d.ts +36 -0
- package/app/core/interface/external-settings.interface.d.ts +6 -0
- package/app/core/interface/info-dialog-data.interface.d.ts +4 -0
- package/app/core/interface/light-preset.interface.d.ts +18 -0
- package/app/core/interface/loading-overlay-data.interface.d.ts +4 -0
- package/app/core/interface/media-resource.interface.d.ts +6 -0
- package/app/core/interface/message-with-payload.interface.d.ts +81 -0
- package/app/core/interface/message-without-payload.interface.d.ts +35 -0
- package/app/core/interface/preset.interface.d.ts +8 -0
- package/app/core/interface/selected-floor-event.interface.d.ts +5 -0
- package/app/core/interface/selected-wall-event.interface.d.ts +6 -0
- package/app/core/interface/texture.interface.d.ts +37 -0
- package/app/core/interface/toolbar-icon.interface.d.ts +8 -0
- package/app/core/model/ar-position-indicator.d.ts +4 -0
- package/app/core/model/camera-settings.d.ts +12 -0
- package/app/core/model/category.d.ts +12 -0
- package/app/core/model/custom-button.d.ts +10 -0
- package/app/core/model/error-message.d.ts +8 -0
- package/app/core/model/export-object.d.ts +5 -0
- package/app/core/model/from-intersection-observer.d.ts +7 -0
- package/app/core/model/homedecorator-settings-options.d.ts +46 -0
- package/app/core/model/homedecorator-settings.d.ts +54 -0
- package/app/core/model/icon.d.ts +4 -0
- package/app/core/model/light-preset.d.ts +27 -0
- package/app/core/model/light-properties.d.ts +25 -0
- package/app/core/model/media-resource.d.ts +7 -0
- package/app/core/model/preset.d.ts +10 -0
- package/app/core/model/ral-color.d.ts +19 -0
- package/app/core/model/shadow-properties.d.ts +7 -0
- package/app/core/model/texture-type.d.ts +6 -0
- package/app/core/model/texture.d.ts +43 -0
- package/app/core/model/three-object.d.ts +1 -0
- package/app/core/model/toast-type.d.ts +5 -0
- package/app/core/model/toast.d.ts +5 -0
- package/app/core/model/xr-reticle.d.ts +17 -0
- package/app/core/pipe/append.pipe.d.ts +7 -0
- package/app/core/pipe/cm-to-measure.pipe.d.ts +10 -0
- package/app/core/pipe/filter.pipe.d.ts +7 -0
- package/app/core/pipe/keys.pipe.d.ts +7 -0
- package/app/core/pipe/localize.pipe.d.ts +10 -0
- package/app/core/pipe/m-to-measure.pipe.d.ts +10 -0
- package/app/core/pipe/prepend.pipe.d.ts +7 -0
- package/app/core/pipe/scm-to-measure.pipe.d.ts +10 -0
- package/app/core/pipe/sm-to-measure.pipe.d.ts +10 -0
- package/app/core/pipe/strip-html.pipe.d.ts +7 -0
- package/app/core/service/3dm-api.d.ts +65 -0
- package/app/core/service/app-state.service.d.ts +49 -0
- package/app/core/service/configuration.service.d.ts +15 -0
- package/app/core/service/debug.service.d.ts +16 -0
- package/app/core/service/dimensioning.service.d.ts +14 -0
- package/app/core/service/dynamic-camera.service.d.ts +23 -0
- package/app/core/service/environment.service.d.ts +8 -0
- package/app/core/service/error.service.d.ts +11 -0
- package/app/core/service/export.service.d.ts +18 -0
- package/app/core/service/file.service.d.ts +9 -0
- package/app/core/service/homedecorator-app-event.service.d.ts +23 -0
- package/app/core/service/homedecorator-app.service.d.ts +58 -0
- package/app/core/service/homedecorator-connector-adapter.service.d.ts +90 -0
- package/app/core/service/homedecorator-connector.service.d.ts +127 -0
- package/app/core/service/homedecorator-dictionary.service.d.ts +15 -0
- package/app/core/service/homedecorator-icon-cache.service.d.ts +21 -0
- package/app/core/service/homedecorator-settings.service.d.ts +23 -0
- package/app/core/service/homedecorator.service.d.ts +14 -0
- package/app/core/service/integration.service.d.ts +16 -0
- package/app/core/service/item-serialization.service.d.ts +78 -0
- package/app/core/service/json-utils.service.d.ts +7 -0
- package/app/core/service/message-bus.service.d.ts +21 -0
- package/app/core/service/permanent-store.service.d.ts +37 -0
- package/app/core/service/presets.service.d.ts +50 -0
- package/app/core/service/progress.service.d.ts +17 -0
- package/app/core/service/ral.service.d.ts +17 -0
- package/app/core/service/skip-button-info.service.d.ts +19 -0
- package/app/core/service/toast.service.d.ts +12 -0
- package/app/core/service/utils.service.d.ts +68 -0
- package/app/core/service/view-mode.service.d.ts +27 -0
- package/app/core/service/web-worker.service.d.ts +18 -0
- package/app/core/utils/clone-utils.d.ts +5 -0
- package/app/core/utils/color.utils.d.ts +7 -0
- package/app/core/utils/file.utils.d.ts +36 -0
- package/app/core/utils/function/is-empty.function.d.ts +1 -0
- package/app/core/utils/function/is-nill.function.d.ts +1 -0
- package/app/core/utils/material.utils.d.ts +33 -0
- package/app/core/utils/object.utils.d.ts +14 -0
- package/app/core/utils/relative-position.utils.d.ts +12 -0
- package/app/core/utils/variation-utils.d.ts +12 -0
- package/app/core/workers/enum/web-worker-message.enum.d.ts +4 -0
- package/app/core/workers/enum/web-worker-type.enum.d.ts +3 -0
- package/app/development/components/selected-child-material-texture.component.d.ts +58 -0
- package/app/development/components/selected-child-material-texture.component.scss +122 -0
- package/app/development/components/selected-child-material.component.d.ts +73 -0
- package/app/development/components/selected-child-material.component.scss +45 -0
- package/app/development/components/selected-child.component.d.ts +8 -0
- package/app/development/components/selected-child.component.scss +40 -0
- package/app/development/components/selected-object-base.d.ts +32 -0
- package/app/development/components/selected-object.component.d.ts +20 -0
- package/app/development/components/selected-object.component.scss +13 -0
- package/app/development/development.module.d.ts +19 -0
- package/app/development/directive/development.directive.d.ts +19 -0
- package/app/development/service/development.service.d.ts +49 -0
- package/app/homedecorator.component.d.ts +42 -0
- package/app/homedecorator.component.scss +34 -0
- package/app/homedecorator.module.d.ts +18 -0
- package/app/plugins/core3d/collision-manager/collision-manager.service.d.ts +23 -0
- package/app/plugins/core3d/collision-manager/floorplan-collision-detection.d.ts +9 -0
- package/app/plugins/core3d/collision-manager/snapping-collision.service.d.ts +47 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.d.ts +17 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.scss +30 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-configurator/ar-gui-configurator.component.d.ts +25 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-configurator/ar-gui-configurator.component.scss +13 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-context-menu/ar-gui-context-menu.component.d.ts +21 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-context-menu/ar-gui-context-menu.component.scss +6 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-notifications/ar-gui-notifications.component.d.ts +11 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-notifications/ar-gui-notifications.component.scss +19 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-root.component.d.ts +16 -0
- package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-root.component.scss +23 -0
- package/app/plugins/core3d/components/lightplan/edit-light/edit-light.component.d.ts +46 -0
- package/app/plugins/core3d/components/lightplan/edit-light/edit-light.component.scss +93 -0
- package/app/plugins/core3d/components/lightplan/edit-lightplan/edit-lightplan.component.d.ts +24 -0
- package/app/plugins/core3d/components/lightplan/edit-lightplan/edit-lightplan.component.scss +93 -0
- package/app/plugins/core3d/components/lightplan/lightplan.component.d.ts +60 -0
- package/app/plugins/core3d/components/lightplan/lightplan.component.scss +102 -0
- package/app/plugins/core3d/components/scene-options/scene-options.component.d.ts +17 -0
- package/app/plugins/core3d/components/scene-options/scene-options.component.scss +54 -0
- package/app/plugins/core3d/core/angles.d.ts +8 -0
- package/app/plugins/core3d/core/corner-utils.d.ts +8 -0
- package/app/plugins/core3d/core/dimensioning.d.ts +19 -0
- package/app/plugins/core3d/core/utils.d.ts +147 -0
- package/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.d.ts +49 -0
- package/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.scss +3 -0
- package/app/plugins/core3d/core3d/core3d.component.d.ts +76 -0
- package/app/plugins/core3d/core3d/core3d.component.scss +27 -0
- package/app/plugins/core3d/core3d.module.d.ts +38 -0
- package/app/plugins/core3d/directive/scene.directive.d.ts +26 -0
- package/app/plugins/core3d/enum/ar-feature.enum.d.ts +12 -0
- package/app/plugins/core3d/enum/direction.enum.d.ts +8 -0
- package/app/plugins/core3d/enum/result-type.enum.d.ts +19 -0
- package/app/plugins/core3d/hud/bounding-measurement-box/bounding-box-measurement.d.ts +28 -0
- package/app/plugins/core3d/hud/bounding-measurement-box/box-measurement.d.ts +17 -0
- package/app/plugins/core3d/hud/bounding-measurement-box/door-or-window-box-measurement.d.ts +29 -0
- package/app/plugins/core3d/hud/bounding-measurement-box/measurable.d.ts +8 -0
- package/app/plugins/core3d/hud/bounding-measurement-box/measurement-utils.d.ts +9 -0
- package/app/plugins/core3d/hud/custom-shape-name-label.d.ts +15 -0
- package/app/plugins/core3d/hud/floor-indicator.d.ts +20 -0
- package/app/plugins/core3d/hud/furniture-measurements.d.ts +12 -0
- package/app/plugins/core3d/hud/indicator-factory.d.ts +7 -0
- package/app/plugins/core3d/hud/measurements.d.ts +46 -0
- package/app/plugins/core3d/hud/on-wall-measurements.d.ts +18 -0
- package/app/plugins/core3d/hud/opening-symbol.d.ts +11 -0
- package/app/plugins/core3d/hud/rotation-helper.d.ts +44 -0
- package/app/plugins/core3d/hud/utils.d.ts +3 -0
- package/app/plugins/core3d/interface/dragged-data.interface.d.ts +10 -0
- package/app/plugins/core3d/interface/edge-visibility-changes.d.ts +5 -0
- package/app/plugins/core3d/interface/model.interface.d.ts +42 -0
- package/app/plugins/core3d/interface/opening.interface.d.ts +6 -0
- package/app/plugins/core3d/interface/scene-option-button.interface.d.ts +17 -0
- package/app/plugins/core3d/interface/scene-update.interface.d.ts +5 -0
- package/app/plugins/core3d/items/base-item.d.ts +97 -0
- package/app/plugins/core3d/items/custom-cylinder-floor-item.d.ts +12 -0
- package/app/plugins/core3d/items/custom-cylinder-wall-item.d.ts +13 -0
- package/app/plugins/core3d/items/custom-floor-item.d.ts +9 -0
- package/app/plugins/core3d/items/custom-objects.d.ts +55 -0
- package/app/plugins/core3d/items/custom-shape-floor-item.d.ts +9 -0
- package/app/plugins/core3d/items/custom-shape-wall-item.d.ts +10 -0
- package/app/plugins/core3d/items/custom-wall-floor-item.d.ts +19 -0
- package/app/plugins/core3d/items/custom-wall-item.d.ts +9 -0
- package/app/plugins/core3d/items/factory.d.ts +24 -0
- package/app/plugins/core3d/items/floor-item.d.ts +13 -0
- package/app/plugins/core3d/items/floor-pin.d.ts +11 -0
- package/app/plugins/core3d/items/floor-plane-item.d.ts +30 -0
- package/app/plugins/core3d/items/furniture.d.ts +3 -0
- package/app/plugins/core3d/items/in-wall-floor-item.d.ts +9 -0
- package/app/plugins/core3d/items/item-group.d.ts +51 -0
- package/app/plugins/core3d/items/item-type.d.ts +21 -0
- package/app/plugins/core3d/items/item.d.ts +84 -0
- package/app/plugins/core3d/items/metadata.d.ts +74 -0
- package/app/plugins/core3d/items/on-floor-item.d.ts +8 -0
- package/app/plugins/core3d/items/pin.d.ts +5 -0
- package/app/plugins/core3d/items/three-mesh.d.ts +8 -0
- package/app/plugins/core3d/items/wall-floor-item.d.ts +8 -0
- package/app/plugins/core3d/items/wall-objects.d.ts +512 -0
- package/app/plugins/core3d/items/wall-pin.d.ts +8 -0
- package/app/plugins/core3d/model/ar-parameters.d.ts +9 -0
- package/app/plugins/core3d/model/box-skin-default.d.ts +5 -0
- package/app/plugins/core3d/model/collision-info.d.ts +6 -0
- package/app/plugins/core3d/model/custom-floor-group-result.d.ts +18 -0
- package/app/plugins/core3d/model/cylinder-skin-default.d.ts +4 -0
- package/app/plugins/core3d/model/dragged-status.d.ts +18 -0
- package/app/plugins/core3d/model/face.d.ts +11 -0
- package/app/plugins/core3d/model/geometry.d.ts +11 -0
- package/app/plugins/core3d/model/scene-event.enum.d.ts +10 -0
- package/app/plugins/core3d/model/skin.d.ts +15 -0
- package/app/plugins/core3d/model/threed-model.d.ts +47 -0
- package/app/plugins/core3d/service/ar.service.d.ts +121 -0
- package/app/plugins/core3d/service/camera.service.d.ts +70 -0
- package/app/plugins/core3d/service/ceiling.service.d.ts +25 -0
- package/app/plugins/core3d/service/controls.d.ts +11 -0
- package/app/plugins/core3d/service/drag-and-drop.service.d.ts +73 -0
- package/app/plugins/core3d/service/error-glow.service.d.ts +18 -0
- package/app/plugins/core3d/service/floor.service.d.ts +43 -0
- package/app/plugins/core3d/service/font.service.d.ts +10 -0
- package/app/plugins/core3d/service/hud.service.d.ts +79 -0
- package/app/plugins/core3d/service/intersection.service.d.ts +10 -0
- package/app/plugins/core3d/service/item-group.service.d.ts +33 -0
- package/app/plugins/core3d/service/item.service.d.ts +37 -0
- package/app/plugins/core3d/service/light-presets.service.d.ts +46 -0
- package/app/plugins/core3d/service/lights.service.d.ts +38 -0
- package/app/plugins/core3d/service/message-board.service.d.ts +18 -0
- package/app/plugins/core3d/service/models.service.d.ts +37 -0
- package/app/plugins/core3d/service/outline.service.d.ts +40 -0
- package/app/plugins/core3d/service/rotation.service.d.ts +57 -0
- package/app/plugins/core3d/service/scene-event.service.d.ts +131 -0
- package/app/plugins/core3d/service/scene-options.service.d.ts +11 -0
- package/app/plugins/core3d/service/scene.service.d.ts +74 -0
- package/app/plugins/core3d/service/vr.service.d.ts +44 -0
- package/app/plugins/core3d/service/wall-measurements.service.d.ts +23 -0
- package/app/plugins/core3d/service/xr.service.d.ts +56 -0
- package/app/plugins/core3d/textures/DepthDataTexture.d.ts +5 -0
- package/app/plugins/core3d/walkthrough-camera-controls/walkthrough-camera-controls.component.d.ts +19 -0
- package/app/plugins/core3d/walkthrough-camera-controls/walkthrough-camera-controls.component.scss +7 -0
- package/app/plugins/furniture-manager/furniture-library/furniture-library.component.d.ts +27 -0
- package/app/plugins/furniture-manager/furniture-library/furniture-library.component.scss +20 -0
- package/app/plugins/furniture-manager/furniture-manager/furniture-manager.component.d.ts +91 -0
- package/app/plugins/furniture-manager/furniture-manager/furniture-manager.component.scss +57 -0
- package/app/plugins/furniture-manager/furniture-manager.module.d.ts +23 -0
- package/app/plugins/help/help/help.component.d.ts +21 -0
- package/app/plugins/help/help/help.component.scss +0 -0
- package/app/plugins/help/help-dialog/help-dialog.component.d.ts +20 -0
- package/app/plugins/help/help-dialog/help-dialog.component.scss +28 -0
- package/app/plugins/help/help.module.d.ts +12 -0
- package/app/plugins/lite-selector/lite-selector/component/animation/animation.component.d.ts +19 -0
- package/app/plugins/lite-selector/lite-selector/component/animation/animation.component.scss +0 -0
- package/app/plugins/lite-selector/lite-selector/component/answer-card/answer-card.component.d.ts +41 -0
- package/app/plugins/lite-selector/lite-selector/component/answer-card/answer-card.component.scss +25 -0
- package/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.d.ts +72 -0
- package/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.scss +146 -0
- package/app/plugins/lite-selector/lite-selector/component/color-filter/color-filter.component.d.ts +19 -0
- package/app/plugins/lite-selector/lite-selector/component/color-filter/color-filter.component.scss +37 -0
- package/app/plugins/lite-selector/lite-selector/component/customizer/customizer.component.d.ts +28 -0
- package/app/plugins/lite-selector/lite-selector/component/customizer/customizer.component.scss +127 -0
- package/app/plugins/lite-selector/lite-selector/component/image-zoom/image-zoom.component.d.ts +9 -0
- package/app/plugins/lite-selector/lite-selector/component/image-zoom/image-zoom.component.scss +47 -0
- package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary-line.component.d.ts +31 -0
- package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary-line.component.scss +11 -0
- package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.d.ts +38 -0
- package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.scss +80 -0
- package/app/plugins/lite-selector/lite-selector/component/tag-filter/tag-filter.component.d.ts +8 -0
- package/app/plugins/lite-selector/lite-selector/component/tag-filter/tag-filter.component.scss +10 -0
- package/app/plugins/lite-selector/lite-selector/lite-selector.component.d.ts +40 -0
- package/app/plugins/lite-selector/lite-selector/lite-selector.component.scss +10 -0
- package/app/plugins/lite-selector/lite-selector/service/customizer.service.d.ts +44 -0
- package/app/plugins/lite-selector/lite-selector.module.d.ts +22 -0
- package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +57 -0
- package/app/plugins/model-uploader/model-previewer/model-preview.component.scss +75 -0
- package/app/plugins/model-uploader/model-uploader/model-upload.component.scss +34 -0
- package/app/plugins/model-uploader/model-uploader/model-uploader.component.d.ts +23 -0
- package/app/plugins/model-uploader/model-uploader.module.d.ts +16 -0
- package/app/plugins/plugin-interface.d.ts +5 -0
- package/app/plugins/plugins.module.d.ts +15 -0
- package/app/plugins/presets/presets/presets.component.d.ts +22 -0
- package/app/plugins/presets/presets/presets.component.scss +0 -0
- package/app/plugins/presets/presets.module.d.ts +10 -0
- package/app/plugins/product-catalog/own-collection-catalog/product-own-collection.component.d.ts +19 -0
- package/app/plugins/product-catalog/own-collection-catalog/product-own-collection.component.scss +4 -0
- package/app/plugins/product-catalog/own-collection-catalog/product-own-collection.module.d.ts +10 -0
- package/app/plugins/product-catalog/product-catalog/product-catalog.component.d.ts +70 -0
- package/app/plugins/product-catalog/product-catalog/product-catalog.component.scss +128 -0
- package/app/plugins/product-catalog/product-catalog.module.d.ts +16 -0
- package/app/plugins/render/enum/connection-status.d.ts +6 -0
- package/app/plugins/render/enum/render-modes.d.ts +5 -0
- package/app/plugins/render/enum/render-status.d.ts +7 -0
- package/app/plugins/render/model/camera-position.d.ts +7 -0
- package/app/plugins/render/model/image-size.d.ts +6 -0
- package/app/plugins/render/model/lightning.d.ts +5 -0
- package/app/plugins/render/model/render-data.d.ts +15 -0
- package/app/plugins/render/model/render-environment.d.ts +6 -0
- package/app/plugins/render/model/render-parameters.d.ts +15 -0
- package/app/plugins/render/model/render-queue-item.d.ts +14 -0
- package/app/plugins/render/model/render-settings.d.ts +9 -0
- package/app/plugins/render/model/render.d.ts +14 -0
- package/app/plugins/render/render-controls/render-controls.component.d.ts +27 -0
- package/app/plugins/render/render-controls/render-controls.component.scss +51 -0
- package/app/plugins/render/render-dialog/render-dialog.component.d.ts +59 -0
- package/app/plugins/render/render-dialog/render-dialog.component.scss +320 -0
- package/app/plugins/render/render.module.d.ts +20 -0
- package/app/plugins/render/service/new-render.service.d.ts +65 -0
- package/app/plugins/render/service/render.service.d.ts +104 -0
- package/app/plugins/room-planner/components/appearance-section/appearance-section.component.d.ts +43 -0
- package/app/plugins/room-planner/components/appearance-section/appearance-section.component.scss +14 -0
- package/app/plugins/room-planner/components/color-picker/color-picker.component.d.ts +11 -0
- package/app/plugins/room-planner/components/color-picker/color-picker.component.scss +0 -0
- package/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.d.ts +49 -0
- package/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.scss +19 -0
- package/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.d.ts +49 -0
- package/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.scss +24 -0
- package/app/plugins/room-planner/components/dimension-input/dimension-input.component.d.ts +22 -0
- package/app/plugins/room-planner/components/dimension-input/dimension-input.component.scss +14 -0
- package/app/plugins/room-planner/components/edit-apply/edit-apply.component.d.ts +19 -0
- package/app/plugins/room-planner/components/edit-apply/edit-apply.component.scss +0 -0
- package/app/plugins/room-planner/components/edit-parameter/edit-parameter.component.d.ts +28 -0
- package/app/plugins/room-planner/components/edit-parameter/edit-parameter.component.scss +23 -0
- package/app/plugins/room-planner/components/file-drop/file-drop.component.d.ts +21 -0
- package/app/plugins/room-planner/components/file-drop/file-drop.component.scss +31 -0
- package/app/plugins/room-planner/components/floorplanner/const/defaults.d.ts +48 -0
- package/app/plugins/room-planner/components/floorplanner/floorplanner-mode.d.ts +9 -0
- package/app/plugins/room-planner/components/floorplanner/floorplanner.component.d.ts +172 -0
- package/app/plugins/room-planner/components/floorplanner/floorplanner.component.scss +48 -0
- package/app/plugins/room-planner/components/floorplanner/service/floorplan.service.d.ts +103 -0
- package/app/plugins/room-planner/components/floorplanner/service/room.service.d.ts +75 -0
- package/app/plugins/room-planner/components/floorplanner/snap-indicator-mode.d.ts +5 -0
- package/app/plugins/room-planner/components/floorplanner/utils/context.utils.d.ts +5 -0
- package/app/plugins/room-planner/components/object-library/object-library.component.d.ts +23 -0
- package/app/plugins/room-planner/components/object-library/object-library.component.scss +43 -0
- package/app/plugins/room-planner/components/ral-color-picker/ral-color-picker.component.d.ts +22 -0
- package/app/plugins/room-planner/components/ral-color-picker/ral-color-picker.component.scss +55 -0
- package/app/plugins/room-planner/components/rgb-color-picker/rgb-color-picker.component.d.ts +11 -0
- package/app/plugins/room-planner/components/rgb-color-picker/rgb-color-picker.component.scss +10 -0
- package/app/plugins/room-planner/components/selected-floor/selected-floor.component.d.ts +16 -0
- package/app/plugins/room-planner/components/selected-floor/selected-floor.component.scss +16 -0
- package/app/plugins/room-planner/components/selected-object/selected-object.component.d.ts +44 -0
- package/app/plugins/room-planner/components/selected-object/selected-object.component.scss +21 -0
- package/app/plugins/room-planner/components/selected-threed-object/selected-threed-object.component.d.ts +57 -0
- package/app/plugins/room-planner/components/selected-threed-object/selected-threed-object.component.scss +35 -0
- package/app/plugins/room-planner/components/selected-wall/selected-wall.component.d.ts +45 -0
- package/app/plugins/room-planner/components/selected-wall/selected-wall.component.scss +31 -0
- package/app/plugins/room-planner/components/settings/settings-options.component.d.ts +18 -0
- package/app/plugins/room-planner/components/settings/settings-options.component.scss +46 -0
- package/app/plugins/room-planner/components/settings/settings.component.d.ts +63 -0
- package/app/plugins/room-planner/components/settings/settings.component.scss +42 -0
- package/app/plugins/room-planner/components/texture-editor/texture-editor.component.d.ts +125 -0
- package/app/plugins/room-planner/components/texture-editor/texture-editor.component.scss +38 -0
- package/app/plugins/room-planner/components/texture-picker/texture-picker.component.d.ts +25 -0
- package/app/plugins/room-planner/components/texture-picker/texture-picker.component.scss +49 -0
- package/app/plugins/room-planner/components/wall-length-input/wall-length-input.component.d.ts +16 -0
- package/app/plugins/room-planner/components/wall-length-input/wall-length-input.component.scss +5 -0
- package/app/plugins/room-planner/const/key.d.ts +10 -0
- package/app/plugins/room-planner/room-planner/room-planner.component.d.ts +236 -0
- package/app/plugins/room-planner/room-planner/room-planner.component.scss +167 -0
- package/app/plugins/room-planner/room-planner.module.d.ts +59 -0
- package/app/plugins/threed-in-photo/components/threed-in-photo-scene/threed-in-photo-scene.component.d.ts +18 -0
- package/app/plugins/threed-in-photo/components/threed-in-photo-scene/threed-in-photo-scene.component.scss +7 -0
- package/app/plugins/threed-in-photo/components/upload-image/upload-image.component.d.ts +18 -0
- package/app/plugins/threed-in-photo/components/upload-image/upload-image.component.scss +7 -0
- package/app/plugins/threed-in-photo/components/view-control/view-control.component.d.ts +30 -0
- package/app/plugins/threed-in-photo/components/view-control/view-control.component.scss +40 -0
- package/app/plugins/threed-in-photo/models/model-output.d.ts +14 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-build.service.d.ts +37 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-connection.service.d.ts +8 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-control.service.d.ts +14 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-event-listeners.service.d.ts +15 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-event.service.d.ts +9 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-initializer.service.d.ts +27 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-render.service.d.ts +20 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-scene.service.d.ts +12 -0
- package/app/plugins/threed-in-photo/services/threed-in-photo-view.service.d.ts +8 -0
- package/app/plugins/threed-in-photo/threed-in-photo.module.d.ts +17 -0
- package/app/plugins/threed-in-photo/utils/utils.d.ts +6 -0
- package/app/plugins/threedselector/element-buttons/element-buttons.component.d.ts +31 -0
- package/app/plugins/threedselector/element-buttons/element-buttons.component.scss +61 -0
- package/app/plugins/threedselector/element-slider/element-slider.component.d.ts +14 -0
- package/app/plugins/threedselector/element-slider/element-slider.component.scss +47 -0
- package/app/plugins/threedselector/element-toolbar/element-toolbar.component.d.ts +26 -0
- package/app/plugins/threedselector/element-toolbar/element-toolbar.component.scss +142 -0
- package/app/plugins/threedselector/threedselector/model/furniture-connected-part-integration.d.ts +7 -0
- package/app/plugins/threedselector/threedselector/model/furniture-integration.d.ts +12 -0
- package/app/plugins/threedselector/threedselector/model/furniture-part-integration.d.ts +14 -0
- package/app/plugins/threedselector/threedselector/model/furniture-part-variation.d.ts +7 -0
- package/app/plugins/threedselector/threedselector/model/material.d.ts +41 -0
- package/app/plugins/threedselector/threedselector/model/variation-settings.d.ts +53 -0
- package/app/plugins/threedselector/threedselector/model/variation.d.ts +11 -0
- package/app/plugins/threedselector/threedselector/service/animation.service.d.ts +22 -0
- package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +186 -0
- package/app/plugins/threedselector/threedselector/service/dimensions.service.d.ts +33 -0
- package/app/plugins/threedselector/threedselector/service/element.service.d.ts +45 -0
- package/app/plugins/threedselector/threedselector/service/light-creation.service.d.ts +9 -0
- package/app/plugins/threedselector/threedselector/service/load-furniture.service.d.ts +74 -0
- package/app/plugins/threedselector/threedselector/service/resize.service.d.ts +13 -0
- package/app/plugins/threedselector/threedselector/service/third-party-model.service.d.ts +66 -0
- package/app/plugins/threedselector/threedselector/service/threedselector.service.d.ts +22 -0
- package/app/plugins/threedselector/threedselector/service/variation-cache.service.d.ts +23 -0
- package/app/plugins/threedselector/threedselector/service/variation.service.d.ts +23 -0
- package/app/plugins/threedselector/threedselector/threedselector.component.d.ts +188 -0
- package/app/plugins/threedselector/threedselector/threedselector.component.scss +82 -0
- package/app/plugins/threedselector/threedselector/utils/asset.utils.d.ts +19 -0
- package/app/plugins/threedselector/threedselector/utils/image.utils.d.ts +6 -0
- package/app/plugins/threedselector/threedselector/utils/json-parser.utils.d.ts +9 -0
- package/app/plugins/threedselector/threedselector/utils/scene-3d.utils.d.ts +10 -0
- package/app/plugins/threedselector/threedselector.module.d.ts +31 -0
- package/app/plugins/toolbar/download-dialog/download-dialog.component.d.ts +14 -0
- package/app/plugins/toolbar/download-dialog/download-dialog.component.scss +22 -0
- package/app/plugins/toolbar/draw-dialog/draw-dialog.component.d.ts +66 -0
- package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +97 -0
- package/app/plugins/toolbar/edit-preset-dialog/edit-preset-dialog.component.d.ts +8 -0
- package/app/plugins/toolbar/edit-preset-dialog/edit-preset-dialog.component.scss +0 -0
- package/app/plugins/toolbar/landing-screen-modal/landing-screen-modal.component.d.ts +36 -0
- package/app/plugins/toolbar/landing-screen-modal/landing-screen-modal.component.scss +71 -0
- package/app/plugins/toolbar/load-from-cloud-dialog/load-from-cloud-dialog.component.d.ts +36 -0
- package/app/plugins/toolbar/load-from-cloud-dialog/load-from-cloud-dialog.component.scss +3 -0
- package/app/plugins/toolbar/open-dialog/open-dialog.component.d.ts +23 -0
- package/app/plugins/toolbar/open-dialog/open-dialog.component.scss +0 -0
- package/app/plugins/toolbar/pdf-crop-dialog/pdf-crop-dialog.component.d.ts +34 -0
- package/app/plugins/toolbar/pdf-crop-dialog/pdf-crop-dialog.component.scss +17 -0
- package/app/plugins/toolbar/save-dialog/save-dialog.component.d.ts +38 -0
- package/app/plugins/toolbar/save-dialog/save-dialog.component.scss +33 -0
- package/app/plugins/toolbar/saved-dialog/saved-dialog.component.d.ts +24 -0
- package/app/plugins/toolbar/saved-dialog/saved-dialog.component.scss +7 -0
- package/app/plugins/toolbar/toolbar/limited-mode-message-component/limited-mode-message.component.d.ts +9 -0
- package/app/plugins/toolbar/toolbar/limited-mode-message-component/limited-mode-message.component.scss +10 -0
- package/app/plugins/toolbar/toolbar/toolbar.component.d.ts +101 -0
- package/app/plugins/toolbar/toolbar/toolbar.component.scss +251 -0
- package/app/plugins/toolbar/toolbar.module.d.ts +44 -0
- package/app/root/root.component.scss +0 -0
- package/app/service/dynamic-script.service.d.ts +8 -0
- package/app/service/google-tag-manager.service.d.ts +19 -0
- package/app/service/local-storage.service.d.ts +18 -0
- package/app/service/service-locator.service.d.ts +4 -0
- package/app/shared/base64-images.d.ts +4 -0
- package/app/shared/button-elevation/button-elevation.component.d.ts +40 -0
- package/app/shared/button-elevation/button-elevation.component.scss +109 -0
- package/app/shared/button-elevation/button-elevation.module.d.ts +16 -0
- package/app/shared/camera-settings-dialog/camera-settings-dialog.component.d.ts +24 -0
- package/app/shared/camera-settings-dialog/camera-settings-dialog.component.scss +30 -0
- package/app/shared/camera-settings-dialog/camera-settings-dialog.module.d.ts +16 -0
- package/app/shared/category-library/category-library.component.d.ts +10 -0
- package/app/shared/category-library/category-library.component.scss +16 -0
- package/app/shared/category-library/category-library.module.d.ts +11 -0
- package/app/shared/context-menu/context-menu.component.d.ts +12 -0
- package/app/shared/context-menu/context-menu.component.scss +25 -0
- package/app/shared/context-menu/context-menu.module.d.ts +14 -0
- package/app/shared/context-menu/item-context-menu/item-context-menu.component.d.ts +30 -0
- package/app/shared/context-menu/item-context-menu/item-context-menu.component.scss +32 -0
- package/app/shared/dialog/dialog.component.d.ts +26 -0
- package/app/shared/dialog/dialog.component.scss +25 -0
- package/app/shared/dialog/dialog.module.d.ts +12 -0
- package/app/shared/dialog/enum/dialog-type.enum.d.ts +6 -0
- package/app/shared/dialog/interface/dialog-config.interface.d.ts +7 -0
- package/app/shared/dialog/service/dialog.service.d.ts +11 -0
- package/app/shared/error-dialog/error-dialog.component.d.ts +11 -0
- package/app/shared/error-dialog/error-dialog.component.scss +0 -0
- package/app/shared/error-dialog/error-dialog.module.d.ts +10 -0
- package/app/shared/export-dialog/export-dialog.component.d.ts +11 -0
- package/app/shared/export-dialog/export-dialog.component.scss +19 -0
- package/app/shared/export-dialog/export-dialog.module.d.ts +11 -0
- package/app/shared/info-dialog/info-dialog.component.d.ts +9 -0
- package/app/shared/info-dialog/info-dialog.component.scss +15 -0
- package/app/shared/info-dialog/info-dialog.module.d.ts +12 -0
- package/app/shared/loader/hd-loader.component.d.ts +6 -0
- package/app/shared/loader/hd-loader.component.scss +44 -0
- package/app/shared/loader/hd-loader.module.d.ts +9 -0
- package/app/shared/loader/loader.component.scss +42 -0
- package/app/shared/loading-overlay/dialog/loading-overlay-dialog.component.d.ts +8 -0
- package/app/shared/loading-overlay/dialog/loading-overlay-dialog.component.scss +3 -0
- package/app/shared/loading-overlay/loading-overlay.component.d.ts +19 -0
- package/app/shared/loading-overlay/loading-overlay.component.scss +9 -0
- package/app/shared/loading-overlay/loading-overlay.module.d.ts +11 -0
- package/app/shared/model-dialog/model-dialog-furniture-list.component.d.ts +35 -0
- package/app/shared/model-dialog/model-dialog-furniture-list.component.scss +221 -0
- package/app/shared/model-dialog/model-dialog.component.d.ts +31 -0
- package/app/shared/model-dialog/model-dialog.component.scss +22 -0
- package/app/shared/model-dialog/model-dialog.module.d.ts +16 -0
- package/app/shared/progress-bar/progress-bar.component.d.ts +9 -0
- package/app/shared/progress-bar/progress-bar.component.scss +11 -0
- package/app/shared/progress-bar/progress-bar.module.d.ts +9 -0
- package/app/shared/register-dialog/register-dialog.component.d.ts +26 -0
- package/app/shared/register-dialog/register-dialog.component.scss +21 -0
- package/app/shared/screen-size-analysis/device-size-type.d.ts +5 -0
- package/app/shared/screen-size-analysis/navigator-type.enum.d.ts +4 -0
- package/app/shared/screen-size-analysis/screen-size-analysis.service.d.ts +27 -0
- package/app/shared/screen-size-analysis/screen-size-config.d.ts +5 -0
- package/app/shared/screen-size-analysis/screen-size-info.d.ts +10 -0
- package/app/shared/slider-input/slider-input.component.d.ts +13 -0
- package/app/shared/slider-input/slider-input.component.scss +12 -0
- package/app/shared/slider-input/slider-input.module.d.ts +13 -0
- package/app/shared/toolbar-icon/toolbar-icon.component.d.ts +12 -0
- package/app/shared/toolbar-icon/toolbar-icon.component.scss +8 -0
- package/app/shared/toolbar-icon/toolbar-icon.module.d.ts +11 -0
- package/app/shared/zoom-controls/zoom-controls.component.d.ts +16 -0
- package/app/shared/zoom-controls/zoom-controls.component.scss +0 -0
- package/app/shared/zoom-controls/zoom-controls.module.d.ts +10 -0
- package/assets/.gitkeep +0 -0
- package/assets/3d-models/pin.mtl +12 -0
- package/assets/3d-models/pin.obj +1083 -0
- package/assets/colors/ral.json +2345 -0
- package/assets/cursors/pencil.png +0 -0
- package/assets/cursors/pencil.svg +1 -0
- package/assets/fonts/helvetiker_regular.ttf +0 -0
- package/assets/fonts/helvetiker_regular.typeface.json +1 -0
- package/assets/fonts/helvetiker_regular.woff +0 -0
- package/assets/fonts/optimer_regular.typeface.json +1 -0
- package/assets/hdri/TSStudio3Point.hdr +135 -0
- package/assets/hdri/ground_MASK.jpg +0 -0
- package/assets/hdri/std_env_v2_A.hdr +0 -0
- package/assets/hdri/std_env_v2_B.hdr +0 -0
- package/assets/hdri/std_env_v2_C.hdr +0 -0
- package/assets/hdri/std_env_v2_D.hdr +0 -0
- package/assets/hdri/std_env_v2_E.hdr +46 -0
- package/assets/icons/add-button.svg +10 -0
- package/assets/icons/ar_circle.svg +7 -0
- package/assets/icons/arrow_point_down.svg +6 -0
- package/assets/icons/brush.svg +1 -0
- package/assets/icons/cart-shopping-regular.svg +1 -0
- package/assets/icons/check.svg +6 -0
- package/assets/icons/cit_powered_white.svg +92 -0
- package/assets/icons/conf_frame.svg +1 -0
- package/assets/icons/conf_plane.svg +1 -0
- package/assets/icons/cross.svg +1 -0
- package/assets/icons/cube-outline.svg +1 -0
- package/assets/icons/cube-unfolded.svg +1 -0
- package/assets/icons/delete-button.svg +16 -0
- package/assets/icons/download.svg +4 -0
- package/assets/icons/edit-button.svg +18 -0
- package/assets/icons/google-cardboard-orange.svg +1 -0
- package/assets/icons/google-cardboard.svg +1 -0
- package/assets/icons/hand-pointer.svg +1 -0
- package/assets/icons/height_adjust.svg +1 -0
- package/assets/icons/magic-wand.svg +57 -0
- package/assets/icons/magnifier.svg +12 -0
- package/assets/icons/measurements.svg +1 -0
- package/assets/icons/move-phone-ar.svg +4 -0
- package/assets/icons/qrcode.svg +1 -0
- package/assets/icons/street-view-orange.svg +5 -0
- package/assets/icons/street-view.svg +6 -0
- package/assets/icons/swap-button.svg +12 -0
- package/assets/icons/tilt-phone.svg +29 -0
- package/assets/icons/triangle_down.svg +1 -0
- package/assets/icons/triangle_up.svg +1 -0
- package/assets/images/colijn-logo.webp +0 -0
- package/assets/images/favicon.ico +0 -0
- package/assets/images/favicon.png +0 -0
- package/assets/images/ione360-logo.webp +0 -0
- package/assets/images/logo.svg +35 -0
- package/assets/workers/indexedDB-web-worker.js +74 -0
- package/bundle-styles.scss +267 -0
- package/bundles/colijnit-homedecorator.umd.js +47374 -0
- package/bundles/colijnit-homedecorator.umd.js.map +1 -0
- package/colijnit-homedecorator.d.ts +5 -0
- package/environments/environment.d.ts +11 -0
- package/esm2015/app/app.version.js +9 -0
- package/esm2015/app/core/components/debug/debug.component.js +57 -0
- package/esm2015/app/core/components/error/error-message.component.js +55 -0
- package/esm2015/app/core/components/tooltip/tooltip.component.js +73 -0
- package/esm2015/app/core/const/dimensioning.js +28 -0
- package/esm2015/app/core/core.module.js +159 -0
- package/esm2015/app/core/directive/autofocus.directive.js +26 -0
- package/esm2015/app/core/directive/tooltip.directive.js +64 -0
- package/esm2015/app/core/directive/visibility-observer-master.directive.js +53 -0
- package/esm2015/app/core/directive/visibility-observer.directive.js +54 -0
- package/esm2015/app/core/enum/configuration-key.enum.js +37 -0
- package/esm2015/app/core/enum/export-type.enum.js +7 -0
- package/esm2015/app/core/enum/google-tag-manager-event.enum.js +14 -0
- package/esm2015/app/core/enum/icon-name.enum.js +17 -0
- package/esm2015/app/core/enum/icon.enum.js +35 -0
- package/esm2015/app/core/enum/light.enum.js +9 -0
- package/esm2015/app/core/enum/message-type.enum.js +71 -0
- package/esm2015/app/core/enum/model-type.enum.js +8 -0
- package/esm2015/app/core/enum/output-encoding.enum.js +6 -0
- package/esm2015/app/core/enum/shadow-map-type.enum.js +8 -0
- package/esm2015/app/core/enum/user-role-type.enum.js +22 -0
- package/esm2015/app/core/enum/view-mode.enum.js +11 -0
- package/esm2015/app/core/enum/xr-mode.enum.js +6 -0
- package/esm2015/app/core/interface/adjustable-element.interface.js +2 -0
- package/esm2015/app/core/interface/category.interface.js +2 -0
- package/esm2015/app/core/interface/changes.interface.js +2 -0
- package/esm2015/app/core/interface/child-params.interface.js +2 -0
- package/esm2015/app/core/interface/configuration-data.interface.js +2 -0
- package/esm2015/app/core/interface/external-settings.interface.js +2 -0
- package/esm2015/app/core/interface/info-dialog-data.interface.js +2 -0
- package/esm2015/app/core/interface/light-preset.interface.js +2 -0
- package/esm2015/app/core/interface/loading-overlay-data.interface.js +2 -0
- package/esm2015/app/core/interface/media-resource.interface.js +2 -0
- package/esm2015/app/core/interface/message-with-payload.interface.js +2 -0
- package/esm2015/app/core/interface/message-without-payload.interface.js +2 -0
- package/esm2015/app/core/interface/preset.interface.js +2 -0
- package/esm2015/app/core/interface/selected-floor-event.interface.js +2 -0
- package/esm2015/app/core/interface/selected-wall-event.interface.js +2 -0
- package/esm2015/app/core/interface/texture.interface.js +2 -0
- package/esm2015/app/core/interface/toolbar-icon.interface.js +2 -0
- package/esm2015/app/core/model/ar-position-indicator.js +21 -0
- package/esm2015/app/core/model/camera-settings.js +14 -0
- package/esm2015/app/core/model/category.js +15 -0
- package/esm2015/app/core/model/custom-button.js +16 -0
- package/esm2015/app/core/model/error-message.js +9 -0
- package/esm2015/app/core/model/export-object.js +3 -0
- package/esm2015/app/core/model/from-intersection-observer.js +64 -0
- package/esm2015/app/core/model/homedecorator-settings-options.js +49 -0
- package/esm2015/app/core/model/homedecorator-settings.js +22 -0
- package/esm2015/app/core/model/icon.js +34 -0
- package/esm2015/app/core/model/light-preset.js +59 -0
- package/esm2015/app/core/model/light-properties.js +45 -0
- package/esm2015/app/core/model/media-resource.js +10 -0
- package/esm2015/app/core/model/preset.js +15 -0
- package/esm2015/app/core/model/ral-color.js +2 -0
- package/esm2015/app/core/model/shadow-properties.js +10 -0
- package/esm2015/app/core/model/texture-type.js +8 -0
- package/esm2015/app/core/model/texture.js +58 -0
- package/esm2015/app/core/model/three-object.js +2 -0
- package/esm2015/app/core/model/toast-type.js +7 -0
- package/esm2015/app/core/model/toast.js +7 -0
- package/esm2015/app/core/model/xr-reticle.js +87 -0
- package/esm2015/app/core/pipe/append.pipe.js +21 -0
- package/esm2015/app/core/pipe/cm-to-measure.pipe.js +20 -0
- package/esm2015/app/core/pipe/filter.pipe.js +20 -0
- package/esm2015/app/core/pipe/keys.pipe.js +22 -0
- package/esm2015/app/core/pipe/localize.pipe.js +28 -0
- package/esm2015/app/core/pipe/m-to-measure.pipe.js +20 -0
- package/esm2015/app/core/pipe/prepend.pipe.js +21 -0
- package/esm2015/app/core/pipe/scm-to-measure.pipe.js +20 -0
- package/esm2015/app/core/pipe/sm-to-measure.pipe.js +20 -0
- package/esm2015/app/core/pipe/strip-html.pipe.js +17 -0
- package/esm2015/app/core/service/3dm-api.js +246 -0
- package/esm2015/app/core/service/app-state.service.js +128 -0
- package/esm2015/app/core/service/configuration.service.js +72 -0
- package/esm2015/app/core/service/debug.service.js +45 -0
- package/esm2015/app/core/service/dimensioning.service.js +45 -0
- package/esm2015/app/core/service/dynamic-camera.service.js +107 -0
- package/esm2015/app/core/service/environment.service.js +17 -0
- package/esm2015/app/core/service/error.service.js +30 -0
- package/esm2015/app/core/service/export.service.js +97 -0
- package/esm2015/app/core/service/file.service.js +44 -0
- package/esm2015/app/core/service/homedecorator-app-event.service.js +27 -0
- package/esm2015/app/core/service/homedecorator-app.service.js +201 -0
- package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +455 -0
- package/esm2015/app/core/service/homedecorator-connector.service.js +604 -0
- package/esm2015/app/core/service/homedecorator-dictionary.service.js +73 -0
- package/esm2015/app/core/service/homedecorator-icon-cache.service.js +43 -0
- package/esm2015/app/core/service/homedecorator-settings.service.js +146 -0
- package/esm2015/app/core/service/homedecorator.service.js +37 -0
- package/esm2015/app/core/service/integration.service.js +56 -0
- package/esm2015/app/core/service/item-serialization.service.js +188 -0
- package/esm2015/app/core/service/json-utils.service.js +56 -0
- package/esm2015/app/core/service/message-bus.service.js +28 -0
- package/esm2015/app/core/service/permanent-store.service.js +135 -0
- package/esm2015/app/core/service/presets.service.js +297 -0
- package/esm2015/app/core/service/progress.service.js +74 -0
- package/esm2015/app/core/service/ral.service.js +98 -0
- package/esm2015/app/core/service/skip-button-info.service.js +60 -0
- package/esm2015/app/core/service/toast.service.js +23 -0
- package/esm2015/app/core/service/utils.service.js +566 -0
- package/esm2015/app/core/service/view-mode.service.js +61 -0
- package/esm2015/app/core/service/web-worker.service.js +44 -0
- package/esm2015/app/core/utils/clone-utils.js +41 -0
- package/esm2015/app/core/utils/color.utils.js +20 -0
- package/esm2015/app/core/utils/file.utils.js +234 -0
- package/esm2015/app/core/utils/function/is-empty.function.js +5 -0
- package/esm2015/app/core/utils/function/is-nill.function.js +5 -0
- package/esm2015/app/core/utils/material.utils.js +407 -0
- package/esm2015/app/core/utils/object.utils.js +191 -0
- package/esm2015/app/core/utils/relative-position.utils.js +74 -0
- package/esm2015/app/core/utils/variation-utils.js +314 -0
- package/esm2015/app/core/workers/enum/web-worker-message.enum.js +6 -0
- package/esm2015/app/core/workers/enum/web-worker-type.enum.js +5 -0
- package/esm2015/app/development/components/selected-child-material-texture.component.js +467 -0
- package/esm2015/app/development/components/selected-child-material.component.js +863 -0
- package/esm2015/app/development/components/selected-child.component.js +64 -0
- package/esm2015/app/development/components/selected-object-base.js +127 -0
- package/esm2015/app/development/components/selected-object.component.js +98 -0
- package/esm2015/app/development/development.module.js +74 -0
- package/esm2015/app/development/directive/development.directive.js +92 -0
- package/esm2015/app/development/service/development.service.js +212 -0
- package/esm2015/app/homedecorator.component.js +285 -0
- package/esm2015/app/homedecorator.module.js +60 -0
- package/esm2015/app/plugins/core3d/collision-manager/collision-manager.service.js +119 -0
- package/esm2015/app/plugins/core3d/collision-manager/floorplan-collision-detection.js +158 -0
- package/esm2015/app/plugins/core3d/collision-manager/snapping-collision.service.js +234 -0
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.js +36 -0
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-configurator/ar-gui-configurator.component.js +49 -0
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-context-menu/ar-gui-context-menu.component.js +77 -0
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-notifications/ar-gui-notifications.component.js +26 -0
- package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-root.component.js +46 -0
- package/esm2015/app/plugins/core3d/components/lightplan/edit-light/edit-light.component.js +197 -0
- package/esm2015/app/plugins/core3d/components/lightplan/edit-lightplan/edit-lightplan.component.js +197 -0
- package/esm2015/app/plugins/core3d/components/lightplan/lightplan.component.js +512 -0
- package/esm2015/app/plugins/core3d/components/scene-options/scene-options.component.js +88 -0
- package/esm2015/app/plugins/core3d/core/angles.js +19 -0
- package/esm2015/app/plugins/core3d/core/corner-utils.js +9 -0
- package/esm2015/app/plugins/core3d/core/dimensioning.js +79 -0
- package/esm2015/app/plugins/core3d/core/utils.js +606 -0
- package/esm2015/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.js +289 -0
- package/esm2015/app/plugins/core3d/core3d/core3d.component.js +243 -0
- package/esm2015/app/plugins/core3d/core3d.module.js +201 -0
- package/esm2015/app/plugins/core3d/directive/scene.directive.js +41 -0
- package/esm2015/app/plugins/core3d/enum/ar-feature.enum.js +14 -0
- package/esm2015/app/plugins/core3d/enum/direction.enum.js +10 -0
- package/esm2015/app/plugins/core3d/enum/result-type.enum.js +21 -0
- package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/bounding-box-measurement.js +99 -0
- package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/box-measurement.js +35 -0
- package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/door-or-window-box-measurement.js +95 -0
- package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/measurable.js +2 -0
- package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/measurement-utils.js +22 -0
- package/esm2015/app/plugins/core3d/hud/custom-shape-name-label.js +31 -0
- package/esm2015/app/plugins/core3d/hud/floor-indicator.js +80 -0
- package/esm2015/app/plugins/core3d/hud/furniture-measurements.js +44 -0
- package/esm2015/app/plugins/core3d/hud/indicator-factory.js +49 -0
- package/esm2015/app/plugins/core3d/hud/measurements.js +165 -0
- package/esm2015/app/plugins/core3d/hud/on-wall-measurements.js +80 -0
- package/esm2015/app/plugins/core3d/hud/opening-symbol.js +74 -0
- package/esm2015/app/plugins/core3d/hud/rotation-helper.js +263 -0
- package/esm2015/app/plugins/core3d/hud/utils.js +30 -0
- package/esm2015/app/plugins/core3d/interface/dragged-data.interface.js +2 -0
- package/esm2015/app/plugins/core3d/interface/edge-visibility-changes.js +2 -0
- package/esm2015/app/plugins/core3d/interface/model.interface.js +2 -0
- package/esm2015/app/plugins/core3d/interface/opening.interface.js +2 -0
- package/esm2015/app/plugins/core3d/interface/scene-option-button.interface.js +6 -0
- package/esm2015/app/plugins/core3d/interface/scene-update.interface.js +2 -0
- package/esm2015/app/plugins/core3d/items/base-item.js +233 -0
- package/esm2015/app/plugins/core3d/items/custom-cylinder-floor-item.js +41 -0
- package/esm2015/app/plugins/core3d/items/custom-cylinder-wall-item.js +45 -0
- package/esm2015/app/plugins/core3d/items/custom-floor-item.js +11 -0
- package/esm2015/app/plugins/core3d/items/custom-objects.js +295 -0
- package/esm2015/app/plugins/core3d/items/custom-shape-floor-item.js +45 -0
- package/esm2015/app/plugins/core3d/items/custom-shape-wall-item.js +37 -0
- package/esm2015/app/plugins/core3d/items/custom-wall-floor-item.js +84 -0
- package/esm2015/app/plugins/core3d/items/custom-wall-item.js +11 -0
- package/esm2015/app/plugins/core3d/items/factory.js +130 -0
- package/esm2015/app/plugins/core3d/items/floor-item.js +29 -0
- package/esm2015/app/plugins/core3d/items/floor-pin.js +31 -0
- package/esm2015/app/plugins/core3d/items/floor-plane-item.js +95 -0
- package/esm2015/app/plugins/core3d/items/furniture.js +2 -0
- package/esm2015/app/plugins/core3d/items/in-wall-floor-item.js +14 -0
- package/esm2015/app/plugins/core3d/items/item-group.js +160 -0
- package/esm2015/app/plugins/core3d/items/item-type.js +23 -0
- package/esm2015/app/plugins/core3d/items/item.js +388 -0
- package/esm2015/app/plugins/core3d/items/metadata.js +2 -0
- package/esm2015/app/plugins/core3d/items/on-floor-item.js +10 -0
- package/esm2015/app/plugins/core3d/items/pin.js +2 -0
- package/esm2015/app/plugins/core3d/items/three-mesh.js +17 -0
- package/esm2015/app/plugins/core3d/items/wall-floor-item.js +9 -0
- package/esm2015/app/plugins/core3d/items/wall-objects.js +2381 -0
- package/esm2015/app/plugins/core3d/items/wall-pin.js +25 -0
- package/esm2015/app/plugins/core3d/model/ar-parameters.js +12 -0
- package/esm2015/app/plugins/core3d/model/box-skin-default.js +17 -0
- package/esm2015/app/plugins/core3d/model/collision-info.js +2 -0
- package/esm2015/app/plugins/core3d/model/custom-floor-group-result.js +13 -0
- package/esm2015/app/plugins/core3d/model/cylinder-skin-default.js +14 -0
- package/esm2015/app/plugins/core3d/model/dragged-status.js +51 -0
- package/esm2015/app/plugins/core3d/model/face.js +18 -0
- package/esm2015/app/plugins/core3d/model/geometry.js +52 -0
- package/esm2015/app/plugins/core3d/model/scene-event.enum.js +12 -0
- package/esm2015/app/plugins/core3d/model/skin.js +2 -0
- package/esm2015/app/plugins/core3d/model/threed-model.js +49 -0
- package/esm2015/app/plugins/core3d/service/ar.service.js +844 -0
- package/esm2015/app/plugins/core3d/service/camera.service.js +340 -0
- package/esm2015/app/plugins/core3d/service/ceiling.service.js +104 -0
- package/esm2015/app/plugins/core3d/service/controls.js +763 -0
- package/esm2015/app/plugins/core3d/service/drag-and-drop.service.js +369 -0
- package/esm2015/app/plugins/core3d/service/error-glow.service.js +131 -0
- package/esm2015/app/plugins/core3d/service/floor.service.js +229 -0
- package/esm2015/app/plugins/core3d/service/font.service.js +27 -0
- package/esm2015/app/plugins/core3d/service/hud.service.js +404 -0
- package/esm2015/app/plugins/core3d/service/intersection.service.js +55 -0
- package/esm2015/app/plugins/core3d/service/item-group.service.js +117 -0
- package/esm2015/app/plugins/core3d/service/item.service.js +205 -0
- package/esm2015/app/plugins/core3d/service/light-presets.service.js +296 -0
- package/esm2015/app/plugins/core3d/service/lights.service.js +190 -0
- package/esm2015/app/plugins/core3d/service/message-board.service.js +60 -0
- package/esm2015/app/plugins/core3d/service/models.service.js +146 -0
- package/esm2015/app/plugins/core3d/service/outline.service.js +150 -0
- package/esm2015/app/plugins/core3d/service/rotation.service.js +183 -0
- package/esm2015/app/plugins/core3d/service/scene-event.service.js +1000 -0
- package/esm2015/app/plugins/core3d/service/scene-options.service.js +24 -0
- package/esm2015/app/plugins/core3d/service/scene.service.js +351 -0
- package/esm2015/app/plugins/core3d/service/vr.service.js +198 -0
- package/esm2015/app/plugins/core3d/service/wall-measurements.service.js +79 -0
- package/esm2015/app/plugins/core3d/service/xr.service.js +397 -0
- package/esm2015/app/plugins/core3d/textures/DepthDataTexture.js +17 -0
- package/esm2015/app/plugins/core3d/walkthrough-camera-controls/walkthrough-camera-controls.component.js +54 -0
- package/esm2015/app/plugins/furniture-manager/furniture-library/furniture-library.component.js +92 -0
- package/esm2015/app/plugins/furniture-manager/furniture-manager/furniture-manager.component.js +458 -0
- package/esm2015/app/plugins/furniture-manager/furniture-manager.module.js +100 -0
- package/esm2015/app/plugins/help/help/help.component.js +71 -0
- package/esm2015/app/plugins/help/help-dialog/help-dialog.component.js +83 -0
- package/esm2015/app/plugins/help/help.module.js +35 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/animation/animation.component.js +36 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/answer-card/answer-card.component.js +187 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.js +417 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/color-filter/color-filter.component.js +44 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/customizer/customizer.component.js +82 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/image-zoom/image-zoom.component.js +27 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary-line.component.js +148 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.js +167 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/component/tag-filter/tag-filter.component.js +25 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/lite-selector.component.js +150 -0
- package/esm2015/app/plugins/lite-selector/lite-selector/service/customizer.service.js +222 -0
- package/esm2015/app/plugins/lite-selector/lite-selector.module.js +108 -0
- package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +470 -0
- package/esm2015/app/plugins/model-uploader/model-uploader/model-uploader.component.js +132 -0
- package/esm2015/app/plugins/model-uploader/model-uploader.module.js +60 -0
- package/esm2015/app/plugins/plugin-interface.js +2 -0
- package/esm2015/app/plugins/plugins.module.js +80 -0
- package/esm2015/app/plugins/presets/presets/presets.component.js +72 -0
- package/esm2015/app/plugins/presets/presets.module.js +33 -0
- package/esm2015/app/plugins/product-catalog/own-collection-catalog/product-own-collection.component.js +57 -0
- package/esm2015/app/plugins/product-catalog/own-collection-catalog/product-own-collection.module.js +34 -0
- package/esm2015/app/plugins/product-catalog/product-catalog/product-catalog.component.js +428 -0
- package/esm2015/app/plugins/product-catalog/product-catalog.module.js +61 -0
- package/esm2015/app/plugins/render/enum/connection-status.js +8 -0
- package/esm2015/app/plugins/render/enum/render-modes.js +7 -0
- package/esm2015/app/plugins/render/enum/render-status.js +9 -0
- package/esm2015/app/plugins/render/model/camera-position.js +6 -0
- package/esm2015/app/plugins/render/model/image-size.js +3 -0
- package/esm2015/app/plugins/render/model/lightning.js +3 -0
- package/esm2015/app/plugins/render/model/render-data.js +6 -0
- package/esm2015/app/plugins/render/model/render-environment.js +3 -0
- package/esm2015/app/plugins/render/model/render-parameters.js +15 -0
- package/esm2015/app/plugins/render/model/render-queue-item.js +11 -0
- package/esm2015/app/plugins/render/model/render-settings.js +12 -0
- package/esm2015/app/plugins/render/model/render.js +10 -0
- package/esm2015/app/plugins/render/render-controls/render-controls.component.js +89 -0
- package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +318 -0
- package/esm2015/app/plugins/render/render.module.js +85 -0
- package/esm2015/app/plugins/render/service/new-render.service.js +302 -0
- package/esm2015/app/plugins/render/service/render.service.js +650 -0
- package/esm2015/app/plugins/room-planner/components/appearance-section/appearance-section.component.js +190 -0
- package/esm2015/app/plugins/room-planner/components/color-picker/color-picker.component.js +32 -0
- package/esm2015/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.js +219 -0
- package/esm2015/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.js +257 -0
- package/esm2015/app/plugins/room-planner/components/dimension-input/dimension-input.component.js +66 -0
- package/esm2015/app/plugins/room-planner/components/edit-apply/edit-apply.component.js +57 -0
- package/esm2015/app/plugins/room-planner/components/edit-parameter/edit-parameter.component.js +79 -0
- package/esm2015/app/plugins/room-planner/components/file-drop/file-drop.component.js +107 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/const/defaults.js +57 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner-mode.js +11 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner.component.js +1303 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/service/floorplan.service.js +536 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/service/room.service.js +330 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/snap-indicator-mode.js +7 -0
- package/esm2015/app/plugins/room-planner/components/floorplanner/utils/context.utils.js +53 -0
- package/esm2015/app/plugins/room-planner/components/object-library/object-library.component.js +63 -0
- package/esm2015/app/plugins/room-planner/components/ral-color-picker/ral-color-picker.component.js +128 -0
- package/esm2015/app/plugins/room-planner/components/rgb-color-picker/rgb-color-picker.component.js +37 -0
- package/esm2015/app/plugins/room-planner/components/selected-floor/selected-floor.component.js +36 -0
- package/esm2015/app/plugins/room-planner/components/selected-object/selected-object.component.js +203 -0
- package/esm2015/app/plugins/room-planner/components/selected-threed-object/selected-threed-object.component.js +139 -0
- package/esm2015/app/plugins/room-planner/components/selected-wall/selected-wall.component.js +102 -0
- package/esm2015/app/plugins/room-planner/components/settings/settings-options.component.js +152 -0
- package/esm2015/app/plugins/room-planner/components/settings/settings.component.js +188 -0
- package/esm2015/app/plugins/room-planner/components/texture-editor/texture-editor.component.js +617 -0
- package/esm2015/app/plugins/room-planner/components/texture-picker/texture-picker.component.js +74 -0
- package/esm2015/app/plugins/room-planner/components/wall-length-input/wall-length-input.component.js +48 -0
- package/esm2015/app/plugins/room-planner/const/key.js +12 -0
- package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +1681 -0
- package/esm2015/app/plugins/room-planner/room-planner.module.js +233 -0
- package/esm2015/app/plugins/threed-in-photo/components/threed-in-photo-scene/threed-in-photo-scene.component.js +43 -0
- package/esm2015/app/plugins/threed-in-photo/components/upload-image/upload-image.component.js +61 -0
- package/esm2015/app/plugins/threed-in-photo/components/view-control/view-control.component.js +164 -0
- package/esm2015/app/plugins/threed-in-photo/models/model-output.js +18 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-build.service.js +243 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-connection.service.js +50 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-control.service.js +33 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-event-listeners.service.js +36 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-event.service.js +19 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-initializer.service.js +53 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-render.service.js +61 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-scene.service.js +37 -0
- package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-view.service.js +21 -0
- package/esm2015/app/plugins/threed-in-photo/threed-in-photo.module.js +67 -0
- package/esm2015/app/plugins/threed-in-photo/utils/utils.js +21 -0
- package/esm2015/app/plugins/threedselector/element-buttons/element-buttons.component.js +95 -0
- package/esm2015/app/plugins/threedselector/element-slider/element-slider.component.js +28 -0
- package/esm2015/app/plugins/threedselector/element-toolbar/element-toolbar.component.js +80 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/furniture-connected-part-integration.js +3 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/furniture-integration.js +13 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/furniture-part-integration.js +6 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/furniture-part-variation.js +3 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/material.js +11 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/variation-settings.js +11 -0
- package/esm2015/app/plugins/threedselector/threedselector/model/variation.js +3 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/animation.service.js +65 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +1343 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/dimensions.service.js +183 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/element.service.js +373 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/light-creation.service.js +35 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/load-furniture.service.js +291 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/resize.service.js +70 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/third-party-model.service.js +156 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/threedselector.service.js +101 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/variation-cache.service.js +133 -0
- package/esm2015/app/plugins/threedselector/threedselector/service/variation.service.js +436 -0
- package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +1116 -0
- package/esm2015/app/plugins/threedselector/threedselector/utils/asset.utils.js +128 -0
- package/esm2015/app/plugins/threedselector/threedselector/utils/image.utils.js +33 -0
- package/esm2015/app/plugins/threedselector/threedselector/utils/json-parser.utils.js +188 -0
- package/esm2015/app/plugins/threedselector/threedselector/utils/scene-3d.utils.js +159 -0
- package/esm2015/app/plugins/threedselector/threedselector.module.js +129 -0
- package/esm2015/app/plugins/toolbar/download-dialog/download-dialog.component.js +33 -0
- package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +279 -0
- package/esm2015/app/plugins/toolbar/edit-preset-dialog/edit-preset-dialog.component.js +22 -0
- package/esm2015/app/plugins/toolbar/landing-screen-modal/landing-screen-modal.component.js +123 -0
- package/esm2015/app/plugins/toolbar/load-from-cloud-dialog/load-from-cloud-dialog.component.js +140 -0
- package/esm2015/app/plugins/toolbar/open-dialog/open-dialog.component.js +83 -0
- package/esm2015/app/plugins/toolbar/pdf-crop-dialog/pdf-crop-dialog.component.js +92 -0
- package/esm2015/app/plugins/toolbar/save-dialog/save-dialog.component.js +146 -0
- package/esm2015/app/plugins/toolbar/saved-dialog/saved-dialog.component.js +66 -0
- package/esm2015/app/plugins/toolbar/toolbar/limited-mode-message-component/limited-mode-message.component.js +26 -0
- package/esm2015/app/plugins/toolbar/toolbar/toolbar.component.js +676 -0
- package/esm2015/app/plugins/toolbar/toolbar.module.js +177 -0
- package/esm2015/app/service/dynamic-script.service.js +56 -0
- package/esm2015/app/service/google-tag-manager.service.js +89 -0
- package/esm2015/app/service/local-storage.service.js +93 -0
- package/esm2015/app/service/service-locator.service.js +4 -0
- package/esm2015/app/shared/base64-images.js +6 -0
- package/esm2015/app/shared/button-elevation/button-elevation.component.js +279 -0
- package/esm2015/app/shared/button-elevation/button-elevation.module.js +60 -0
- package/esm2015/app/shared/camera-settings-dialog/camera-settings-dialog.component.js +197 -0
- package/esm2015/app/shared/camera-settings-dialog/camera-settings-dialog.module.js +58 -0
- package/esm2015/app/shared/category-library/category-library.component.js +27 -0
- package/esm2015/app/shared/category-library/category-library.module.js +39 -0
- package/esm2015/app/shared/context-menu/context-menu.component.js +35 -0
- package/esm2015/app/shared/context-menu/context-menu.module.js +49 -0
- package/esm2015/app/shared/context-menu/item-context-menu/item-context-menu.component.js +93 -0
- package/esm2015/app/shared/dialog/dialog.component.js +119 -0
- package/esm2015/app/shared/dialog/dialog.module.js +45 -0
- package/esm2015/app/shared/dialog/enum/dialog-type.enum.js +8 -0
- package/esm2015/app/shared/dialog/interface/dialog-config.interface.js +2 -0
- package/esm2015/app/shared/dialog/service/dialog.service.js +21 -0
- package/esm2015/app/shared/error-dialog/error-dialog.component.js +24 -0
- package/esm2015/app/shared/error-dialog/error-dialog.module.js +30 -0
- package/esm2015/app/shared/export-dialog/export-dialog.component.js +68 -0
- package/esm2015/app/shared/export-dialog/export-dialog.module.js +35 -0
- package/esm2015/app/shared/info-dialog/info-dialog.component.js +54 -0
- package/esm2015/app/shared/info-dialog/info-dialog.module.js +37 -0
- package/esm2015/app/shared/loader/hd-loader.component.js +24 -0
- package/esm2015/app/shared/loader/hd-loader.module.js +33 -0
- package/esm2015/app/shared/loading-overlay/dialog/loading-overlay-dialog.component.js +26 -0
- package/esm2015/app/shared/loading-overlay/loading-overlay.component.js +55 -0
- package/esm2015/app/shared/loading-overlay/loading-overlay.module.js +42 -0
- package/esm2015/app/shared/model-dialog/model-dialog-furniture-list.component.js +325 -0
- package/esm2015/app/shared/model-dialog/model-dialog.component.js +104 -0
- package/esm2015/app/shared/model-dialog/model-dialog.module.js +64 -0
- package/esm2015/app/shared/progress-bar/progress-bar.component.js +39 -0
- package/esm2015/app/shared/progress-bar/progress-bar.module.js +33 -0
- package/esm2015/app/shared/register-dialog/register-dialog.component.js +112 -0
- package/esm2015/app/shared/screen-size-analysis/device-size-type.js +7 -0
- package/esm2015/app/shared/screen-size-analysis/navigator-type.enum.js +6 -0
- package/esm2015/app/shared/screen-size-analysis/screen-size-analysis.service.js +93 -0
- package/esm2015/app/shared/screen-size-analysis/screen-size-config.js +7 -0
- package/esm2015/app/shared/screen-size-analysis/screen-size-info.js +2 -0
- package/esm2015/app/shared/slider-input/slider-input.component.js +35 -0
- package/esm2015/app/shared/slider-input/slider-input.module.js +46 -0
- package/esm2015/app/shared/toolbar-icon/toolbar-icon.component.js +95 -0
- package/esm2015/app/shared/toolbar-icon/toolbar-icon.module.js +38 -0
- package/esm2015/app/shared/zoom-controls/zoom-controls.component.js +47 -0
- package/esm2015/app/shared/zoom-controls/zoom-controls.module.js +34 -0
- package/esm2015/colijnit-homedecorator.js +5 -0
- package/esm2015/environments/environment.js +17 -0
- package/esm2015/public_api.js +4 -0
- package/fesm2015/colijnit-homedecorator.js +45086 -0
- package/fesm2015/colijnit-homedecorator.js.map +1 -0
- package/homedecorator-globals.scss +361 -0
- package/package.json +48 -0
- package/palette.scss +32 -0
- package/public_api.d.ts +3 -0
- package/styles.scss +377 -0
|
@@ -0,0 +1,1116 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
11
|
+
import { Color, Euler, Light, Mesh, PlaneGeometry, Shape, ShapeGeometry, Vector2, Vector3 } from 'three';
|
|
12
|
+
import { animate, state, style, transition, trigger } from '@angular/animations';
|
|
13
|
+
import { IconName } from '../../../core/enum/icon-name.enum';
|
|
14
|
+
import { ElementToolbarComponent } from '../element-toolbar/element-toolbar.component';
|
|
15
|
+
import { CustomButton } from '../../../core/model/custom-button';
|
|
16
|
+
import { WallItem } from '../../core3d/items/wall-objects';
|
|
17
|
+
import { isItemGroupType, isWallItemGroupType, itemTypeFromPlacement } from '../../core3d/items/factory';
|
|
18
|
+
import { ItemGroup } from '../../core3d/items/item-group';
|
|
19
|
+
import { CustomFloorGroupResult } from '../../core3d/model/custom-floor-group-result';
|
|
20
|
+
import { MessageType } from '../../../core/enum/message-type.enum';
|
|
21
|
+
import { WallItemGroup } from '../../core3d/items/wall-objects';
|
|
22
|
+
import { ObjectUtils } from '../../../core/utils/object.utils';
|
|
23
|
+
import { ModelDialogComponent } from '../../../shared/model-dialog/model-dialog.component';
|
|
24
|
+
import { IconEnum } from '../../../core/enum/icon.enum';
|
|
25
|
+
import { DialogType } from '../../../shared/dialog/enum/dialog-type.enum';
|
|
26
|
+
import { ErrorMessage } from '../../../core/model/error-message';
|
|
27
|
+
import { ResultType } from '../../core3d/enum/result-type.enum';
|
|
28
|
+
import { CustomMesh } from '../../core3d/items/custom-objects';
|
|
29
|
+
import { Toast } from '../../../core/model/toast';
|
|
30
|
+
import { isNill } from '../../../core/utils/function/is-nill.function';
|
|
31
|
+
import { CustomWallFloorItem } from '../../core3d/items/custom-wall-floor-item';
|
|
32
|
+
import { CustomWallItem } from '../../core3d/items/custom-wall-item';
|
|
33
|
+
import { GoogleTagManagerEvent } from '../../../core/enum/google-tag-manager-event.enum';
|
|
34
|
+
import { CameraSettingsDialogComponent } from '../../../shared/camera-settings-dialog/camera-settings-dialog.component';
|
|
35
|
+
import * as i0 from "@angular/core";
|
|
36
|
+
import * as i1 from "../../../shared/screen-size-analysis/screen-size-analysis.service";
|
|
37
|
+
import * as i2 from "@angular/material/dialog";
|
|
38
|
+
import * as i3 from "../../../core/service/homedecorator-app.service";
|
|
39
|
+
import * as i4 from "../../../core/service/homedecorator-connector.service";
|
|
40
|
+
import * as i5 from "../../../core/service/message-bus.service";
|
|
41
|
+
import * as i6 from "./service/load-furniture.service";
|
|
42
|
+
import * as i7 from "./service/build-furniture.service";
|
|
43
|
+
import * as i8 from "../../../core/service/integration.service";
|
|
44
|
+
import * as i9 from "../../../core/service/homedecorator-dictionary.service";
|
|
45
|
+
import * as i10 from "../../../core/service/toast.service";
|
|
46
|
+
import * as i11 from "../../core3d/service/scene.service";
|
|
47
|
+
import * as i12 from "../../../shared/dialog/service/dialog.service";
|
|
48
|
+
import * as i13 from "../../core3d/service/camera.service";
|
|
49
|
+
import * as i14 from "../../../core/service/presets.service";
|
|
50
|
+
import * as i15 from "../../core3d/service/item.service";
|
|
51
|
+
import * as i16 from "../../../core/service/homedecorator-settings.service";
|
|
52
|
+
import * as i17 from "../../core3d/service/scene-options.service";
|
|
53
|
+
import * as i18 from "./service/dimensions.service";
|
|
54
|
+
import * as i19 from "../../../core/service/homedecorator-app-event.service";
|
|
55
|
+
import * as i20 from "../../room-planner/components/floorplanner/service/floorplan.service";
|
|
56
|
+
import * as i21 from "../../core3d/service/floor.service";
|
|
57
|
+
import * as i22 from "../../../core/service/homedecorator-icon-cache.service";
|
|
58
|
+
import * as i23 from "../../core3d/service/ar.service";
|
|
59
|
+
import * as i24 from "../../../service/google-tag-manager.service";
|
|
60
|
+
import * as i25 from "../../../core/service/error.service";
|
|
61
|
+
import * as i26 from "../../core3d/service/rotation.service";
|
|
62
|
+
import * as i27 from "../../room-planner/components/floorplanner/service/room.service";
|
|
63
|
+
import * as i28 from "../../../core/service/app-state.service";
|
|
64
|
+
import * as i29 from "../../../core/service/progress.service";
|
|
65
|
+
import * as i30 from "./service/animation.service";
|
|
66
|
+
import * as i31 from "./service/resize.service";
|
|
67
|
+
import * as i32 from "../../lite-selector/lite-selector/service/customizer.service";
|
|
68
|
+
import * as i33 from "../../../core/service/dynamic-camera.service";
|
|
69
|
+
import * as i34 from "../../threed-in-photo/services/threed-in-photo-initializer.service";
|
|
70
|
+
import * as i35 from "../../render/service/render.service";
|
|
71
|
+
import * as i36 from "../../render/service/new-render.service";
|
|
72
|
+
import * as i37 from "../../../core/service/homedecorator-connector-adapter.service";
|
|
73
|
+
import * as i38 from "../../lite-selector/lite-selector/lite-selector.component";
|
|
74
|
+
import * as i39 from "../element-toolbar/element-toolbar.component";
|
|
75
|
+
import * as i40 from "../element-buttons/element-buttons.component";
|
|
76
|
+
import * as i41 from "../../../shared/toolbar-icon/toolbar-icon.component";
|
|
77
|
+
import * as i42 from "../../lite-selector/lite-selector/component/animation/animation.component";
|
|
78
|
+
import * as i43 from "../../lite-selector/lite-selector/component/customizer/customizer.component";
|
|
79
|
+
import * as i44 from "../element-slider/element-slider.component";
|
|
80
|
+
import * as i45 from "@angular/common";
|
|
81
|
+
import * as i46 from "../../../core/pipe/localize.pipe";
|
|
82
|
+
export class ThreedselectorComponent {
|
|
83
|
+
constructor(screenSizeService, _dialog, _appService, _iOne, _messageBus, _loadFurnitureService, _buildFurnitureService, _integrationService, _dictionaryService, _toastService, _messageService, _sceneService, _dialogService, _cameraService, _presetsService, _itemService, _settingsService, _sceneOptionsService, _dimensionsService, _appEventService, _floorplanService, _floorService, _iconCacheService, _arService, _googleTagManager, _errorService, _rotationService, _roomService, _appStateService, _progressService, _animationService, _resizeService, _customizerService, _dynamicCameraService, _threedInPhotoInitializerService, _renderService, _newRenderService, _connectorAdapterService) {
|
|
84
|
+
this.screenSizeService = screenSizeService;
|
|
85
|
+
this._dialog = _dialog;
|
|
86
|
+
this._appService = _appService;
|
|
87
|
+
this._iOne = _iOne;
|
|
88
|
+
this._messageBus = _messageBus;
|
|
89
|
+
this._loadFurnitureService = _loadFurnitureService;
|
|
90
|
+
this._buildFurnitureService = _buildFurnitureService;
|
|
91
|
+
this._integrationService = _integrationService;
|
|
92
|
+
this._dictionaryService = _dictionaryService;
|
|
93
|
+
this._toastService = _toastService;
|
|
94
|
+
this._messageService = _messageService;
|
|
95
|
+
this._sceneService = _sceneService;
|
|
96
|
+
this._dialogService = _dialogService;
|
|
97
|
+
this._cameraService = _cameraService;
|
|
98
|
+
this._presetsService = _presetsService;
|
|
99
|
+
this._itemService = _itemService;
|
|
100
|
+
this._settingsService = _settingsService;
|
|
101
|
+
this._sceneOptionsService = _sceneOptionsService;
|
|
102
|
+
this._dimensionsService = _dimensionsService;
|
|
103
|
+
this._appEventService = _appEventService;
|
|
104
|
+
this._floorplanService = _floorplanService;
|
|
105
|
+
this._floorService = _floorService;
|
|
106
|
+
this._iconCacheService = _iconCacheService;
|
|
107
|
+
this._arService = _arService;
|
|
108
|
+
this._googleTagManager = _googleTagManager;
|
|
109
|
+
this._errorService = _errorService;
|
|
110
|
+
this._rotationService = _rotationService;
|
|
111
|
+
this._roomService = _roomService;
|
|
112
|
+
this._appStateService = _appStateService;
|
|
113
|
+
this._progressService = _progressService;
|
|
114
|
+
this._animationService = _animationService;
|
|
115
|
+
this._resizeService = _resizeService;
|
|
116
|
+
this._customizerService = _customizerService;
|
|
117
|
+
this._dynamicCameraService = _dynamicCameraService;
|
|
118
|
+
this._threedInPhotoInitializerService = _threedInPhotoInitializerService;
|
|
119
|
+
this._renderService = _renderService;
|
|
120
|
+
this._newRenderService = _newRenderService;
|
|
121
|
+
this._connectorAdapterService = _connectorAdapterService;
|
|
122
|
+
this.iconName = IconName;
|
|
123
|
+
this.customizeButtonClicked = new EventEmitter();
|
|
124
|
+
this.selections = [];
|
|
125
|
+
this.editElementMenu = [];
|
|
126
|
+
this.editAddButtons = [];
|
|
127
|
+
this.editCustomizeButton = [];
|
|
128
|
+
this.resizeButtons = [];
|
|
129
|
+
this.selectedElementPosition = new Vector2();
|
|
130
|
+
this.showElementToolbar = false;
|
|
131
|
+
this.showLiteSelector = false;
|
|
132
|
+
this.showSelections = false;
|
|
133
|
+
this.showAnswers = false;
|
|
134
|
+
this.showCustomizeButtons = false;
|
|
135
|
+
this.showSwapButton = true;
|
|
136
|
+
this.standAlone = false;
|
|
137
|
+
this.shouldShowLabel = false;
|
|
138
|
+
this._skuAlreadySet = false;
|
|
139
|
+
this._itemsFromScratch = [];
|
|
140
|
+
this._itemsNeedUserInput = [];
|
|
141
|
+
this._subs = [];
|
|
142
|
+
this._loadingFromPreset = false;
|
|
143
|
+
this._presetsService.register(this);
|
|
144
|
+
}
|
|
145
|
+
ngOnInit() {
|
|
146
|
+
this._subs.push(this._appEventService.answerCountReceived.subscribe((answerCount) => this._handleAnswerCountReceived(answerCount)), this._messageBus.subscribe(MessageType.LoadIOneFurnitureIntoSceneBySKU, ({ sku, settings, position }) => this._handleLoadIOneFurnitureIntoSceneBySKU(sku, settings, position)), this._messageBus.subscribe(MessageType.CopyIOneFurnitureIntoSceneBySKU, (original) => this._handleCopyIOneFurnitureIntoSceneBySKU(original)), this._buildFurnitureService.configureModeChanged.subscribe(configuringModeChange => this._handleConfigureModeChange(configuringModeChange)), this._buildFurnitureService.toggleSelectedElement.subscribe((element) => this._selectedElementToggle(element)), this._buildFurnitureService.buildFinished.subscribe((result) => this._handleBuildFinished(result)), this._buildFurnitureService.answerSelected.subscribe((result) => this._answerSelected(result)), this._sceneService.onAfterRender.subscribe(() => this._handleRender()), this._appService.skuSet.subscribe(sku => this._handleSkuSet(sku)), this._appEventService.articleInfoReceived.subscribe(info => this._handleInfoClick(info)), this._messageService.subscribe(MessageType.UndefinedErrorOccured, () => this._handleUndefinedErrorOccured()), this._presetsService.afterLoad.subscribe(() => this._afterLoadFromPreset()), this._messageBus.subscribe(MessageType.Undo, () => this._clearItems()), this._messageBus.subscribe(MessageType.Redo, () => this._clearItems()), this._messageBus.subscribe(MessageType.StartWithEmptyRoom, () => this._clearItems()), this._messageBus.subscribe(MessageType.StartWithPreset, () => this._clearItems()), this._messageBus.subscribe(MessageType.LoadRoomFromPreset, () => this._clearItems()), this._messageBus.subscribe(MessageType.LoadRoomFromCloud, () => this._clearItems()), this._messageBus.subscribe(MessageType.NewRoom, () => this._clearItems()), this._messageBus.subscribe(MessageType.ResetRoomplan, () => this._clearItems()), this._messageBus.subscribe(MessageType.LoadScaledDiagram, () => this._clearItems()), this._presetsService.beforeLoad.subscribe(() => this._clearItems()), this._messageService.subscribe(MessageType.ItemSelected, (item) => this.objectSelected(item)), this._messageService.subscribe(MessageType.ItemUnselected, () => this._removeButtons()), this.screenSizeService.screenSizeChanged.subscribe((info) => {
|
|
147
|
+
this.shouldShowLabel = info.isPhoneSize;
|
|
148
|
+
}), this._settingsService.settingsLoaded.subscribe((loaded) => {
|
|
149
|
+
if (loaded) {
|
|
150
|
+
this.showSwapButton = !this._settingsService.settings.options.instantReplace;
|
|
151
|
+
}
|
|
152
|
+
}));
|
|
153
|
+
this._addModelDialogToolbar();
|
|
154
|
+
}
|
|
155
|
+
ngOnDestroy() {
|
|
156
|
+
this._subs.forEach(sub => sub.unsubscribe());
|
|
157
|
+
}
|
|
158
|
+
copySceneInstance(saveAs) {
|
|
159
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
160
|
+
if ( /*!this._settingsService.isPrivate && */saveAs) {
|
|
161
|
+
const furniture = this._itemService.getIOneFurniture();
|
|
162
|
+
return this._handleCopyInstanceForFurniture(furniture);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
return Promise.resolve();
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
loadObjects({ furniture }) {
|
|
170
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
171
|
+
if (!furniture) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
this._loadingFromPreset = true;
|
|
175
|
+
const iONEObjectsToLoad = furniture.filter(o => this._isIONEObject(o));
|
|
176
|
+
furniture
|
|
177
|
+
.filter((o) => isItemGroupType(o.item_type))
|
|
178
|
+
.forEach(g => {
|
|
179
|
+
let groupAdded = false;
|
|
180
|
+
const itemGroup = isWallItemGroupType(g.item_type) ? new WallItemGroup() : new ItemGroup();
|
|
181
|
+
itemGroup.locked = g.locked;
|
|
182
|
+
itemGroup.position.set(g.xpos, g.ypos, g.zpos);
|
|
183
|
+
itemGroup.rotation.set(0, g.rotation, 0);
|
|
184
|
+
const children = g.children;
|
|
185
|
+
children.forEach(ch => {
|
|
186
|
+
if (this._isIONEObject(ch)) {
|
|
187
|
+
if (!groupAdded) {
|
|
188
|
+
this._itemService.addItem(itemGroup);
|
|
189
|
+
groupAdded = true;
|
|
190
|
+
}
|
|
191
|
+
ch.itemGroup = itemGroup;
|
|
192
|
+
iONEObjectsToLoad.push(ch);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
return this._handleLoadIOneFurnitureFromPreset(iONEObjectsToLoad);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
getObjects() {
|
|
200
|
+
// return {furniture: this.threeService.model.saveFurniture()};
|
|
201
|
+
}
|
|
202
|
+
objectSelected(object) {
|
|
203
|
+
this._removeCustomButtons();
|
|
204
|
+
this.showCustomizeButtons = true;
|
|
205
|
+
this.selectedObject = object;
|
|
206
|
+
object.traverse((child) => {
|
|
207
|
+
const customizeButton = child.name && child.name.toLowerCase().startsWith('p_');
|
|
208
|
+
if (customizeButton) {
|
|
209
|
+
this.selectionToCustomize = child.parent;
|
|
210
|
+
this.editCustomizeButton.push(new CustomButton('', () => {
|
|
211
|
+
this.handleCustomizeClick();
|
|
212
|
+
}, this.selectionToCustomize));
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
this._handleRender();
|
|
216
|
+
}
|
|
217
|
+
handleCustomizeClick() {
|
|
218
|
+
this._customizerService.selectedObject = this.selectionToCustomize;
|
|
219
|
+
this._messageService.emit(MessageType.SetLeftSidebar, this.selectedThreedObjectCustomizationSidebar);
|
|
220
|
+
}
|
|
221
|
+
swapElement() {
|
|
222
|
+
if (this._selectedElementObject) {
|
|
223
|
+
this._buildFurnitureService.replaceSelection(ObjectUtils.GetSelectionFromSelectedObject(this._selectedElementObject), this.activeMetadata);
|
|
224
|
+
if (!this._settingsService.settings.options.instantReplace) {
|
|
225
|
+
this._resetSelectedElement();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
deleteElement() {
|
|
230
|
+
if (this._selectedElementObject) {
|
|
231
|
+
this._buildFurnitureService.deleteSelection(ObjectUtils.GetSelectionFromSelectedObject(this._selectedElementObject), this.activeMetadata);
|
|
232
|
+
this._resetSelectedElement();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
cancelElementReplace(rebuild = false) {
|
|
236
|
+
this._buildFurnitureService.cancelAnswer(this.activeMetadata, false, true);
|
|
237
|
+
this._resetSelectedElement();
|
|
238
|
+
}
|
|
239
|
+
openAnimationSidebar() {
|
|
240
|
+
this._messageService.emit(MessageType.SetLeftSidebar, this.selectedThreedObjectAnimationSidebar);
|
|
241
|
+
}
|
|
242
|
+
handleShowChangeSelector(show) {
|
|
243
|
+
if (!show) {
|
|
244
|
+
if (this.showAnswers) {
|
|
245
|
+
this._buildFurnitureService.cancelAnswer(this.activeMetadata);
|
|
246
|
+
}
|
|
247
|
+
this._buildFurnitureService.cancelConfiguringCurrentInstance();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
setModelErrorDialog() {
|
|
251
|
+
this._dialog.open(ModelDialogComponent);
|
|
252
|
+
}
|
|
253
|
+
_clearItems() {
|
|
254
|
+
this._itemsFromScratch.length = 0;
|
|
255
|
+
}
|
|
256
|
+
_handleSkuSet(sku) {
|
|
257
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
258
|
+
if (sku) {
|
|
259
|
+
this._subs.push(this._iOne.controllerInitialized.subscribe((initialized) => __awaiter(this, void 0, void 0, function* () {
|
|
260
|
+
if (initialized) {
|
|
261
|
+
this._prepareStandaloneConfigurator(sku);
|
|
262
|
+
}
|
|
263
|
+
})), this._appService.floorTexturesLoaded.subscribe(textures => this._handleFloorsLoaded(textures)));
|
|
264
|
+
const arButton = {
|
|
265
|
+
id: 2,
|
|
266
|
+
elementId: 'standalone_ar_session',
|
|
267
|
+
tooltip: 'START_AR_SESSION',
|
|
268
|
+
order: 10,
|
|
269
|
+
image: this._iconCacheService.getIconAsBase64(IconEnum.ArCircle),
|
|
270
|
+
toggle: false,
|
|
271
|
+
show: (yield this._arService.arSupported()) &&
|
|
272
|
+
this._settingsService.settings.options.showStandaloneARButton &&
|
|
273
|
+
this._settingsService.settings.options.arEnabled,
|
|
274
|
+
click: () => {
|
|
275
|
+
const object = this._itemService.getConfigurables()[0] /*.cloneVisible()*/;
|
|
276
|
+
if (object) {
|
|
277
|
+
this._sceneService.arMode = true;
|
|
278
|
+
this._sceneService.addObject(object);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
this._sceneOptionsService.addSceneOptionButton(arButton);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
_handleFloorsLoaded(textures) {
|
|
287
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
288
|
+
if (textures) {
|
|
289
|
+
let defaultFloor;
|
|
290
|
+
if (this._settingsService.settings.options.useStandaloneFloors) {
|
|
291
|
+
this._standaloneFloors = this._appService.getFloorsStandalone();
|
|
292
|
+
defaultFloor = this._standaloneFloors.find(f => f.defaultStandalone);
|
|
293
|
+
}
|
|
294
|
+
let floorGeometry;
|
|
295
|
+
if (defaultFloor && defaultFloor.simplePlane) {
|
|
296
|
+
floorGeometry = new PlaneGeometry(6, 6);
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
const corners = [
|
|
300
|
+
this._floorplanService.newCorner(-3, 3),
|
|
301
|
+
this._floorplanService.newCorner(-3, -3),
|
|
302
|
+
this._floorplanService.newCorner(3, -3),
|
|
303
|
+
this._floorplanService.newCorner(3, 3),
|
|
304
|
+
];
|
|
305
|
+
const points = corners.map(corner => new Vector2(corner.x, corner.y));
|
|
306
|
+
const shape = new Shape(points);
|
|
307
|
+
floorGeometry = new ShapeGeometry(shape).center();
|
|
308
|
+
}
|
|
309
|
+
yield this._floorService.generateFloorPlane('white', defaultFloor, undefined, undefined, floorGeometry);
|
|
310
|
+
this._floorService.getFloorPlane().visible = this._settingsService.settings.options.useStandaloneFloors;
|
|
311
|
+
this._sceneService.scene.background = new Color(parseInt(this._settingsService.settings.standaloneSceneBackgroundColor, 0));
|
|
312
|
+
this._sceneService.needsRender = true;
|
|
313
|
+
if (this._standaloneFloors && this._standaloneFloors.length > 1) {
|
|
314
|
+
this._upsertFloorButtons(defaultFloor);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
_upsertFloorButtons(activeFloor) {
|
|
320
|
+
const floorButtons = [];
|
|
321
|
+
let newFloorButton;
|
|
322
|
+
this._standaloneFloors.forEach((f, index) => {
|
|
323
|
+
if (f !== activeFloor) {
|
|
324
|
+
newFloorButton = {
|
|
325
|
+
id: index,
|
|
326
|
+
elementId: `standalone_floor_${f.name}`,
|
|
327
|
+
tooltip: f.name,
|
|
328
|
+
class: 'circle',
|
|
329
|
+
show: false,
|
|
330
|
+
object: f,
|
|
331
|
+
image: this._settingsService.settings.assetPath + f.url,
|
|
332
|
+
click: (floor) => this._changeStandaloneFloor(floor)
|
|
333
|
+
};
|
|
334
|
+
floorButtons.push(newFloorButton);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
const activeFloorButton = {
|
|
338
|
+
id: 10,
|
|
339
|
+
elementId: 'standalone_change_floor',
|
|
340
|
+
tooltip: 'CHANGE_FLOOR',
|
|
341
|
+
order: 8,
|
|
342
|
+
class: 'circle',
|
|
343
|
+
object: activeFloor,
|
|
344
|
+
children: floorButtons,
|
|
345
|
+
show: true,
|
|
346
|
+
image: this._settingsService.settings.assetPath + activeFloor.url
|
|
347
|
+
};
|
|
348
|
+
this._sceneOptionsService.updateSceneOptionButton(activeFloorButton);
|
|
349
|
+
}
|
|
350
|
+
_changeStandaloneFloor(floor) {
|
|
351
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
352
|
+
yield this._floorService.setFloorTexture(null, floor);
|
|
353
|
+
this._upsertFloorButtons(floor);
|
|
354
|
+
this._sceneService.updatePathTracer();
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
_createDownloadButton() {
|
|
358
|
+
const download3DModelButton = {
|
|
359
|
+
id: 100,
|
|
360
|
+
elementId: 'standalone_download_model',
|
|
361
|
+
tooltip: 'DOWNLOAD_MODEL',
|
|
362
|
+
order: 2,
|
|
363
|
+
class: 'circle',
|
|
364
|
+
label: 'cloud_download',
|
|
365
|
+
show: true,
|
|
366
|
+
click: () => this._buildFurnitureService.downloadCurrentCustomFloorgroup()
|
|
367
|
+
};
|
|
368
|
+
this._sceneOptionsService.updateSceneOptionButton(download3DModelButton);
|
|
369
|
+
}
|
|
370
|
+
_createCameraSettingsButton() {
|
|
371
|
+
const cameraSettingsButton = {
|
|
372
|
+
id: 110,
|
|
373
|
+
elementId: 'standalone_camera_settings',
|
|
374
|
+
tooltip: 'CAMERA_SETTINGS',
|
|
375
|
+
order: 1,
|
|
376
|
+
class: 'circle',
|
|
377
|
+
label: 'camera_settings',
|
|
378
|
+
show: true,
|
|
379
|
+
click: () => this._openCameraSettingsDialog()
|
|
380
|
+
};
|
|
381
|
+
this._sceneOptionsService.updateSceneOptionButton(cameraSettingsButton);
|
|
382
|
+
}
|
|
383
|
+
_openCameraSettingsDialog() {
|
|
384
|
+
this._dialog.open(CameraSettingsDialogComponent, {
|
|
385
|
+
width: '600px'
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
_createMeasurementsButton() {
|
|
389
|
+
const button = {
|
|
390
|
+
id: 1,
|
|
391
|
+
elementId: 'standalone_show_measurements',
|
|
392
|
+
tooltip: 'SHOW_MEASUREMENTS',
|
|
393
|
+
order: 11,
|
|
394
|
+
image: this._iconCacheService.getIconAsBase64(IconEnum.Measurements),
|
|
395
|
+
toggle: true,
|
|
396
|
+
tooltipActive: 'HIDE_MEASUREMENTS',
|
|
397
|
+
show: true,
|
|
398
|
+
click: () => { this._dimensionsService.enabled = !this._dimensionsService.enabled; }
|
|
399
|
+
};
|
|
400
|
+
this._sceneOptionsService.addSceneOptionButton(button);
|
|
401
|
+
}
|
|
402
|
+
_handleInfoClick(info) {
|
|
403
|
+
const messageConfig = {
|
|
404
|
+
type: DialogType.Info,
|
|
405
|
+
messages: [new ErrorMessage(info)]
|
|
406
|
+
};
|
|
407
|
+
this._dialogService.showDialog({ data: messageConfig });
|
|
408
|
+
}
|
|
409
|
+
_prepareStandaloneConfigurator(sku) {
|
|
410
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
411
|
+
this._cameraService.camera.position.set(0, 1, 4);
|
|
412
|
+
this._cameraService.camera.lookAt(new Vector3());
|
|
413
|
+
yield ObjectUtils.LoadHDRI(this._settingsService.settings.assetPath + '/assets/hdri/std_env_v2_B.hdr', this._sceneService.scene);
|
|
414
|
+
this._sceneService.scene.children.forEach(c => {
|
|
415
|
+
if (c instanceof Light) {
|
|
416
|
+
this._sceneService.scene.remove(c);
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
this._sceneService.needsRender = true;
|
|
420
|
+
this.standAlone = true;
|
|
421
|
+
this.showLiteSelector = true; // always show the selections when standalone
|
|
422
|
+
this.showSelections = true; // always show the selections when standalone
|
|
423
|
+
this._loadFurnitureService.shouldLoadSelections = true;
|
|
424
|
+
this._skuAlreadySet = true;
|
|
425
|
+
if (this._settingsService.settings.options.showDownloadButton) {
|
|
426
|
+
this._createDownloadButton();
|
|
427
|
+
}
|
|
428
|
+
if (this._settingsService.settings.options.showMeasurementsButton) {
|
|
429
|
+
this._createMeasurementsButton();
|
|
430
|
+
}
|
|
431
|
+
if (this._settingsService.settings.options.development) {
|
|
432
|
+
this._createCameraSettingsButton();
|
|
433
|
+
}
|
|
434
|
+
const result = yield this._loadIOneFurnitureFromSku(new Vector3(0, 0, 0), sku, undefined, true);
|
|
435
|
+
if (result && result.furniture) {
|
|
436
|
+
this._handleFirstBuildStandalone(result.furniture);
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
if (result.resultType === ResultType.NeedsUserInput) {
|
|
440
|
+
this._callBackFnWhenBuildFinished = this._handleFirstBuildStandalone;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
_handleFirstBuildStandalone(item) {
|
|
446
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
447
|
+
this._cameraService.moveCameraToFitObject(item);
|
|
448
|
+
if (this._settingsService.settings.options.cameraPositionFixed) {
|
|
449
|
+
this._rotationService.enableRotationFor(item);
|
|
450
|
+
}
|
|
451
|
+
if (this._settingsService.settings.options.cameraPositionFixedAndScrollbar) {
|
|
452
|
+
this._cameraService.disableRotate();
|
|
453
|
+
this._cameraService.cameraZoomOut();
|
|
454
|
+
this._cameraService.disableZoom();
|
|
455
|
+
}
|
|
456
|
+
this._sceneService.needsRender = true;
|
|
457
|
+
this._callBackFnWhenBuildFinished = undefined;
|
|
458
|
+
if (this._settingsService.settings.cameraConfig) {
|
|
459
|
+
yield this._dynamicCameraService.loadCustomCameraSettings();
|
|
460
|
+
}
|
|
461
|
+
if (this._settingsService.settings.options.enable3DInPhoto) {
|
|
462
|
+
this._threedInPhotoInitializerService.init(null, this._cameraService.camera, this._sceneService.scene, this._sceneService.renderer);
|
|
463
|
+
}
|
|
464
|
+
// save camera settings for render
|
|
465
|
+
this._cameraService.camera.updateMatrixWorld(true);
|
|
466
|
+
this._newRenderService.standAloneCameraMatrix = Array.from(this._cameraService.camera.matrixWorldInverse.elements);
|
|
467
|
+
this._buildFurnitureService.standAloneFirstBuildReady = true;
|
|
468
|
+
this._appEventService.readyToRender.next(true);
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
_handleUndefinedErrorOccured() {
|
|
472
|
+
this.showSelections = false;
|
|
473
|
+
this.showAnswers = false;
|
|
474
|
+
this._buildFurnitureService.cancelConfiguringCurrentInstance();
|
|
475
|
+
}
|
|
476
|
+
_removeButtons() {
|
|
477
|
+
this.editAddButtons.length = 0;
|
|
478
|
+
this.editCustomizeButton.length = 0;
|
|
479
|
+
this.resizeButtons.length = 0;
|
|
480
|
+
}
|
|
481
|
+
_resetSelectedElement() {
|
|
482
|
+
this._selectedElementObject = undefined;
|
|
483
|
+
this._resetElementPosition();
|
|
484
|
+
this._removeAllButtons();
|
|
485
|
+
this.showElementToolbar = false;
|
|
486
|
+
}
|
|
487
|
+
_handleRender() {
|
|
488
|
+
if (this._selectedElementObject || this.selectionToCustomize) {
|
|
489
|
+
this._resetElementPosition();
|
|
490
|
+
if (this.editAddButtons.length || this.editCustomizeButton.length > 0 || this.resizeButtons.length > 0) {
|
|
491
|
+
this._repositionButtons();
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
_selectedElementToggle(element) {
|
|
496
|
+
this.selectedElement = element;
|
|
497
|
+
const obj = element ? element.parent : undefined;
|
|
498
|
+
if (this._selectedElementObject !== obj) {
|
|
499
|
+
this.showElementToolbar = false;
|
|
500
|
+
this._selectedElementObject = obj;
|
|
501
|
+
if (this.selectedElement) {
|
|
502
|
+
this._prepareElementMenu();
|
|
503
|
+
this._prepareAddButtons();
|
|
504
|
+
if (this._settingsService.settings.options.handleParametric) {
|
|
505
|
+
this._prepareOtherButtons();
|
|
506
|
+
}
|
|
507
|
+
const shouldBeHidden = obj.userData && obj.userData.selection && obj.userData.selection.question.indexOf('[hidden]') > -1;
|
|
508
|
+
if (this._settingsService.settings.options.instantReplace) {
|
|
509
|
+
if (shouldBeHidden) {
|
|
510
|
+
this.cancelElementReplace();
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
this.swapElement();
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
setTimeout(() => {
|
|
517
|
+
this.showElementToolbar = true;
|
|
518
|
+
this._sceneService.needsRender = true;
|
|
519
|
+
}, 200);
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
this._resetSelectedElement();
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
_handleBuildFinished(result) {
|
|
527
|
+
this._itemService.glassMaterialCheck(result.furniture);
|
|
528
|
+
if (this.selectedElement && result.furniture) {
|
|
529
|
+
const item = result.furniture;
|
|
530
|
+
if (this.selectedElement instanceof CustomMesh) {
|
|
531
|
+
this._selectedElementObject = this.selectedElement.parent;
|
|
532
|
+
}
|
|
533
|
+
this._prepareAddButtons();
|
|
534
|
+
}
|
|
535
|
+
if (this._callBackFnWhenBuildFinished && this.standAlone) {
|
|
536
|
+
this._callBackFnWhenBuildFinished(result.furniture);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
_resetElementPosition() {
|
|
540
|
+
if (this.selectedElement && !this.standAlone) {
|
|
541
|
+
const yPos = ((this.selectedElement.geometry.boundingBox.max.y - this.selectedElement.geometry.boundingBox.min.y) / 2);
|
|
542
|
+
const pos = new Vector3(0, 0, 0);
|
|
543
|
+
this.selectedElement.getWorldPosition(pos);
|
|
544
|
+
pos.y += yPos;
|
|
545
|
+
this.selectedElementPosition = this._sceneService.positionInSceneToScreen(pos);
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
this.selectedElementPosition = undefined;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
_removeAllButtons() {
|
|
552
|
+
this._removeAddButtons();
|
|
553
|
+
this._removeResizeButtons();
|
|
554
|
+
this._removeCustomButtons();
|
|
555
|
+
}
|
|
556
|
+
_removeCustomButtons() {
|
|
557
|
+
this.editCustomizeButton.length = 0;
|
|
558
|
+
}
|
|
559
|
+
_removeAddButtons() {
|
|
560
|
+
this.editAddButtons.length = 0;
|
|
561
|
+
}
|
|
562
|
+
_removeResizeButtons() {
|
|
563
|
+
this.resizeButtons.length = 0;
|
|
564
|
+
}
|
|
565
|
+
_removeEditItems() {
|
|
566
|
+
this.editElementMenu.length = 0;
|
|
567
|
+
}
|
|
568
|
+
_prepareElementMenu() {
|
|
569
|
+
this._removeEditItems();
|
|
570
|
+
const selection = ObjectUtils.GetSelectionFromSelectedObject(this._selectedElementObject);
|
|
571
|
+
if (this._settingsService.settings.options.showEditPencilConfigurator && selection) {
|
|
572
|
+
let options = this._getOptionsFromSelection(selection);
|
|
573
|
+
options = options.filter(o => {
|
|
574
|
+
return o.nodeType === 'OPT' && this._iOne.isSelectionPublished(o);
|
|
575
|
+
});
|
|
576
|
+
const len = options.length;
|
|
577
|
+
for (let i = 0; i < len; i++) {
|
|
578
|
+
this.editElementMenu.push(new CustomButton(options[i].question, () => {
|
|
579
|
+
this._buildFurnitureService.selectSelection(options[i], this.activeMetadata);
|
|
580
|
+
if (!this._settingsService.settings.options.instantEditMenu) {
|
|
581
|
+
this._resetSelectedElement();
|
|
582
|
+
}
|
|
583
|
+
}));
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
_afterLoadFromPreset() {
|
|
588
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
589
|
+
this._loadingFromPreset = false;
|
|
590
|
+
this._progressService.finishDownloads();
|
|
591
|
+
if (this._itemsFromScratch.length > 0) {
|
|
592
|
+
for (let i = 0; i < this._itemsFromScratch.length; i++) {
|
|
593
|
+
yield this._handleLoadAndBuildFurniture(this._itemsFromScratch[i].metaData, false, false, false, false, true);
|
|
594
|
+
}
|
|
595
|
+
this._itemsFromScratch.length = 0;
|
|
596
|
+
}
|
|
597
|
+
if (this._itemsNeedUserInput.length > 0) {
|
|
598
|
+
for (let i = 0; i < this._itemsNeedUserInput.length; i++) {
|
|
599
|
+
const result = yield this._handleLoadAndBuildFurniture(this._itemsNeedUserInput[i].metaData, false, false, false, false, true);
|
|
600
|
+
this._loadFurnitureService.addToList(this._loadFurnitureService.objectList, result);
|
|
601
|
+
}
|
|
602
|
+
this._itemsNeedUserInput.length = 0;
|
|
603
|
+
}
|
|
604
|
+
if (this._loadFurnitureService.objectListFixed.length > 0 ||
|
|
605
|
+
this._loadFurnitureService.obsoleteObjectCache.length > 0 ||
|
|
606
|
+
this._loadFurnitureService.notFixedObjectCache.length > 0 ||
|
|
607
|
+
this._loadFurnitureService.notLoaded.length > 0) {
|
|
608
|
+
this.setModelErrorDialog();
|
|
609
|
+
}
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
_isIONEObject(o) {
|
|
613
|
+
return !!o.item_schema || o.ione;
|
|
614
|
+
}
|
|
615
|
+
_prepareAddButtons() {
|
|
616
|
+
const selection = ObjectUtils.GetSelectionFromSelectedObject(this._selectedElementObject);
|
|
617
|
+
this._removeAddButtons();
|
|
618
|
+
if (selection) {
|
|
619
|
+
// if (decoNode.gameObjectName.toLowerCase() === 'flat_r' ||
|
|
620
|
+
// decoNode.gameObjectName.toLowerCase() === 'flat_l' ||
|
|
621
|
+
// decoNode.gameObjectName.toLowerCase() === 'flat_d' ||
|
|
622
|
+
// decoNode.gameObjectName.toLowerCase() === 'flat_u' ||
|
|
623
|
+
// decoNode.gameObjectName.toLowerCase() === 'vert_r' ||
|
|
624
|
+
// decoNode.gameObjectName.toLowerCase() === 'vert_l' ||
|
|
625
|
+
// decoNode.gameObjectName.toLowerCase() === 'vert_d' ||
|
|
626
|
+
// decoNode.gameObjectName.toLowerCase() === 'vert_u') {
|
|
627
|
+
// if (decoNode.connectors) {
|
|
628
|
+
// decoNode.connectors.forEach(c => c.linkedRepeatables = 'T');
|
|
629
|
+
// }
|
|
630
|
+
// }
|
|
631
|
+
const len = selection.decoNode ? selection.decoNode.connectors.length : 0;
|
|
632
|
+
for (let i = 0; i < len; i++) {
|
|
633
|
+
let conObject = this._selectedElementObject.getObjectByName(selection.decoNode.connectors[i].connector);
|
|
634
|
+
if (!conObject && this._selectedElementObject.parent) {
|
|
635
|
+
conObject = this._selectedElementObject.parent.getObjectByName(selection.decoNode.connectors[i].connector);
|
|
636
|
+
}
|
|
637
|
+
if (conObject && this._canShowAddButton(selection.decoNode.connectors[i], conObject)) {
|
|
638
|
+
this.editAddButtons.push(new CustomButton('', () => {
|
|
639
|
+
this._handleAddButtonClick(selection, selection.decoNode.connectors[i], this._selectedElementObject);
|
|
640
|
+
}, conObject));
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
if (this.selectedElement) {
|
|
645
|
+
this._sceneService.scene.traverse((child) => {
|
|
646
|
+
if (child.name) {
|
|
647
|
+
const customizeButton = child.name.toLowerCase().startsWith('p_');
|
|
648
|
+
// const customizeOption: any = this._selectedElementObject.getObjectByName()
|
|
649
|
+
if (customizeButton) {
|
|
650
|
+
this.selectionToCustomize = child.parent;
|
|
651
|
+
this.editCustomizeButton.push(new CustomButton('', () => {
|
|
652
|
+
this.handleCustomizeClick();
|
|
653
|
+
}, this._selectedElementObject));
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
});
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
_getOppositeConnectorParts(connector) {
|
|
660
|
+
const connectorPartsArr = connector.split('_');
|
|
661
|
+
connectorPartsArr.pop(); // remove number
|
|
662
|
+
const connectorType = connectorPartsArr[connectorPartsArr.length - 1];
|
|
663
|
+
connectorPartsArr[connectorPartsArr.length - 1] = connectorType.toLowerCase() === 'f' ? 'M' : 'F';
|
|
664
|
+
return connectorPartsArr.join('_');
|
|
665
|
+
}
|
|
666
|
+
_prepareOtherButtons() {
|
|
667
|
+
this._removeResizeButtons();
|
|
668
|
+
if (this._selectedElementObject) {
|
|
669
|
+
const parent = ObjectUtils.GetParentItem(this._selectedElementObject);
|
|
670
|
+
if (parent) { // hide all connectors
|
|
671
|
+
parent.traverse(o => {
|
|
672
|
+
if (o.name && o.name.toLowerCase().startsWith('c_')) {
|
|
673
|
+
o.visible = false;
|
|
674
|
+
}
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
const otherConnectors = this._selectedElementObject.children.filter(c => c instanceof Mesh && (c.name && (c.name.toLowerCase().startsWith('c_sca_') || c.name.toLowerCase().startsWith('c_rep_'))));
|
|
678
|
+
otherConnectors.forEach(o => {
|
|
679
|
+
// o.visible = true
|
|
680
|
+
this.resizeButtons.push(new CustomButton('', () => {
|
|
681
|
+
this._handleResizeButtonClick(o.name, this._selectedElementObject);
|
|
682
|
+
}, o));
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
_handleAddButtonClick(selection, connector, parent) {
|
|
687
|
+
let after;
|
|
688
|
+
if (connector.addAdjust === 2) {
|
|
689
|
+
after = connector.connector.indexOf('_M_') > -1;
|
|
690
|
+
}
|
|
691
|
+
this._buildFurnitureService.baseElementNodeId = parent.userData && parent.userData.selection ? parent.userData.selection.nodeId : 0;
|
|
692
|
+
this._buildFurnitureService.activeConnector = connector;
|
|
693
|
+
this._buildFurnitureService.selectSelection(selection, this.activeMetadata, connector.linkedRepeatables !== 'T', after, connector.connector);
|
|
694
|
+
this._resetSelectedElement();
|
|
695
|
+
}
|
|
696
|
+
_handleResizeButtonClick(connector, parent) {
|
|
697
|
+
this._resizeService.resizeElement(connector, parent);
|
|
698
|
+
}
|
|
699
|
+
_canShowAddButton(connector, conObject) {
|
|
700
|
+
return (!conObject.connected || connector.linkedRepeatables === 'T');
|
|
701
|
+
}
|
|
702
|
+
_repositionButtons() {
|
|
703
|
+
const len = this.editAddButtons.length;
|
|
704
|
+
for (let i = 0; i < len; i++) {
|
|
705
|
+
this._repositionButton(this.editAddButtons[i]);
|
|
706
|
+
}
|
|
707
|
+
const lenr = this.resizeButtons.length;
|
|
708
|
+
for (let r = 0; r < lenr; r++) {
|
|
709
|
+
this._repositionButton(this.resizeButtons[r]);
|
|
710
|
+
}
|
|
711
|
+
const lenc = this.editCustomizeButton.length;
|
|
712
|
+
for (let c = 0; c < lenc; c++) {
|
|
713
|
+
this._repositionButton(this.editCustomizeButton[c]);
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
_repositionButton(button) {
|
|
717
|
+
const pos = new Vector3(0, 0, 0);
|
|
718
|
+
button.data.getWorldPosition(pos);
|
|
719
|
+
const screenPos = this._sceneService.positionInSceneToScreen(pos);
|
|
720
|
+
button.xPos = screenPos.x;
|
|
721
|
+
button.yPos = screenPos.y;
|
|
722
|
+
const distanceToCam = this._cameraService.camera.position.distanceTo(pos);
|
|
723
|
+
button.size = (4 / distanceToCam) * 30;
|
|
724
|
+
button.opacity = Math.max(0.25, 1 - (Math.max(7.0, (Math.round(distanceToCam * 10) / 10)) - 7));
|
|
725
|
+
}
|
|
726
|
+
_getOptionsFromSelection(baseSelection) {
|
|
727
|
+
return this._buildFurnitureService.getOptionsFromSelection(baseSelection);
|
|
728
|
+
}
|
|
729
|
+
_handleAnswerCountReceived(answerCount) {
|
|
730
|
+
this.showAnswers = answerCount > 0;
|
|
731
|
+
if (this.showAnswers) {
|
|
732
|
+
this.showLiteSelector = !this._loadingFromPreset;
|
|
733
|
+
} /* else {
|
|
734
|
+
if (this._initialStartup) {
|
|
735
|
+
// this._iOne.loadSelections();
|
|
736
|
+
this._initialStartup = false;
|
|
737
|
+
}
|
|
738
|
+
}*/
|
|
739
|
+
}
|
|
740
|
+
_handleLoadIOneFurnitureIntoSceneBySKU(sku, settings, position) {
|
|
741
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
742
|
+
const toast = new Toast();
|
|
743
|
+
toast.message = 'MODEL_LOADING';
|
|
744
|
+
this._toastService.showToast(toast);
|
|
745
|
+
yield this._connectorAdapterService.initConnector(settings ? settings.settings : this._settingsService.settings, settings ? settings.name : undefined, false, settings ? settings.externalSourceId : undefined);
|
|
746
|
+
const article = yield this._loadFurnitureService.loadArticle(sku);
|
|
747
|
+
const draggedData = {
|
|
748
|
+
name: sku,
|
|
749
|
+
constructFn: (pos) => __awaiter(this, void 0, void 0, function* () { return this._loadIOneFurnitureFromSku(pos, sku, settings); }),
|
|
750
|
+
type: itemTypeFromPlacement(article.placement),
|
|
751
|
+
iOne: true
|
|
752
|
+
};
|
|
753
|
+
this._messageBus.emit(MessageType.SetDrag, draggedData);
|
|
754
|
+
this._messageBus.emit(MessageType.StartDrag, position);
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
_handleCopyIOneFurnitureIntoSceneBySKU(original) {
|
|
758
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
759
|
+
const toast = new Toast();
|
|
760
|
+
toast.message = 'MODEL_LOADING';
|
|
761
|
+
this._toastService.showToast(toast);
|
|
762
|
+
original.metadata.conversionGTMSend = false;
|
|
763
|
+
const draggedData = {
|
|
764
|
+
name: original.metadata.itemIdentifier,
|
|
765
|
+
constructFn: (pos) => this._loadIOneFurnitureFromOriginal(original.metadata, pos, original.rotation),
|
|
766
|
+
type: original.metadata.itemType,
|
|
767
|
+
iOne: true
|
|
768
|
+
};
|
|
769
|
+
this._messageBus.emit(MessageType.SetDrag, draggedData);
|
|
770
|
+
this._messageBus.emit(MessageType.StartDrag, original.position);
|
|
771
|
+
});
|
|
772
|
+
}
|
|
773
|
+
_loadIOneFurnitureFromOriginal(md, pos, rot) {
|
|
774
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
775
|
+
const newMetaData = Object.assign({}, md);
|
|
776
|
+
newMetaData.rotation = new Euler().copy(rot);
|
|
777
|
+
return this._handleLoadAndBuildFurniture(newMetaData, true, false, false, false, false);
|
|
778
|
+
});
|
|
779
|
+
}
|
|
780
|
+
_loadIOneFurnitureFromSku(pos, sku, settings, standAlone = false) {
|
|
781
|
+
const md = {
|
|
782
|
+
position: pos,
|
|
783
|
+
itemIdentifier: sku,
|
|
784
|
+
externalSettings: settings
|
|
785
|
+
};
|
|
786
|
+
return this._handleLoadAndBuildFurniture(md, false, true, false, standAlone, false);
|
|
787
|
+
}
|
|
788
|
+
_handleCopyInstanceForFurniture(furniture) {
|
|
789
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
790
|
+
const len = furniture.length;
|
|
791
|
+
for (let i = 0; i < len; i++) {
|
|
792
|
+
const customItem = furniture[i];
|
|
793
|
+
if (customItem.metadata && customItem.metadata.itemId) {
|
|
794
|
+
const oldInstance = customItem.metadata.itemId;
|
|
795
|
+
const newInstance = yield this._iOne.copyInstanceAndSaveOriginalConfiguration(oldInstance, null);
|
|
796
|
+
customItem.metadata.itemId = newInstance;
|
|
797
|
+
customItem.userData.itemId = newInstance;
|
|
798
|
+
customItem.metadata.originalItemId = oldInstance;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
});
|
|
802
|
+
}
|
|
803
|
+
_handleLoadIOneFurnitureFromPreset(furniture) {
|
|
804
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
805
|
+
const externalSources = [];
|
|
806
|
+
const catalogData = yield this._connectorAdapterService.getCatalogDefinitionsList();
|
|
807
|
+
if (catalogData) {
|
|
808
|
+
for (const catalogItem of catalogData) {
|
|
809
|
+
if (catalogItem.externalSourceId !== null) {
|
|
810
|
+
const externalData = yield this._connectorAdapterService.getExternalSource(catalogItem.externalSourceId);
|
|
811
|
+
if (externalData) {
|
|
812
|
+
externalSources.push(externalData);
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
const len = furniture.length;
|
|
818
|
+
for (let i = 0; i < len; i++) {
|
|
819
|
+
if (furniture[i].externalSettings && furniture[i].externalSettings.externalSourceId === undefined) {
|
|
820
|
+
const externalSourceObj = externalSources.find(source => source.schema === furniture[i].externalSettings.settings.schema);
|
|
821
|
+
if (externalSourceObj && externalSourceObj.schema !== '') {
|
|
822
|
+
if (furniture[i].externalSettings.settings['username'] !== undefined && furniture[i].externalSettings.settings['password'] !== undefined) {
|
|
823
|
+
furniture[i].externalSettings.settings['username'] = '';
|
|
824
|
+
furniture[i].externalSettings.settings['password'] = '';
|
|
825
|
+
}
|
|
826
|
+
furniture[i].externalSettings.externalSourceId = externalSourceObj.sourceId;
|
|
827
|
+
}
|
|
828
|
+
else {
|
|
829
|
+
console.log('source not available');
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
yield this._loadFurnitureFromItem(furniture[i]);
|
|
833
|
+
}
|
|
834
|
+
this._messageBus.emit(MessageType.ShouldCopyFurnitureFromPreset, true);
|
|
835
|
+
});
|
|
836
|
+
}
|
|
837
|
+
_loadFurnitureFromItem(item) {
|
|
838
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
839
|
+
const position = new Vector3(item.xpos, item.ypos, item.zpos);
|
|
840
|
+
const metadata = {
|
|
841
|
+
itemName: item.item_name,
|
|
842
|
+
itemDescription: item.item_description,
|
|
843
|
+
itemId: item.item_id,
|
|
844
|
+
itemIdentifier: item.item_identifier,
|
|
845
|
+
configurable: !isNill(item.configurable) ? item.configurable : true,
|
|
846
|
+
ione: item.ione,
|
|
847
|
+
schema: item.item_schema,
|
|
848
|
+
resizable: item.resizable,
|
|
849
|
+
elevation: item.elevation,
|
|
850
|
+
elevationFixed: item.elevationFixed,
|
|
851
|
+
elevationAdjustable: item.elevationAdjustable,
|
|
852
|
+
itemType: item.item_type,
|
|
853
|
+
modelUrl: item.model_url,
|
|
854
|
+
texture: item.texture,
|
|
855
|
+
position: position,
|
|
856
|
+
rotation: new Euler(0, item.rotation, 0),
|
|
857
|
+
scale: item.scale,
|
|
858
|
+
centerPivot: true,
|
|
859
|
+
ignoreInvisible: item.ignoreInvisible,
|
|
860
|
+
updatePivotOnCreate: true,
|
|
861
|
+
opening: item.opening,
|
|
862
|
+
locked: item.locked,
|
|
863
|
+
itemGroup: item.itemGroup,
|
|
864
|
+
decos: item.decos,
|
|
865
|
+
selections: item.selections,
|
|
866
|
+
elementConfiguration: item.elementConfiguration,
|
|
867
|
+
onWall: item.onWall,
|
|
868
|
+
externalSettings: item.externalSettings,
|
|
869
|
+
conversionGTMSend: item.conversionGTMSend,
|
|
870
|
+
conversionSubmittedPrice: item.conversionSubmittedPrice
|
|
871
|
+
};
|
|
872
|
+
return this._handleLoadAndBuildFurniture(metadata, true, true, true, false, true, false);
|
|
873
|
+
});
|
|
874
|
+
}
|
|
875
|
+
_handleLoadAndBuildFurniture(furnitureData, shouldCopyInstance, looseOriginalConfiguration, fromPreset, standAlone, fromScratch, showErrorDialog = true) {
|
|
876
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
877
|
+
yield this._connectorAdapterService.initConnector(furnitureData.externalSettings ? furnitureData.externalSettings.settings : this._settingsService.settings, furnitureData.externalSettings ? furnitureData.externalSettings.name : undefined, false, furnitureData.externalSettings ? furnitureData.externalSettings.externalSourceId : null);
|
|
878
|
+
const result = yield this._loadFurnitureService.loadFurniture(furnitureData, shouldCopyInstance, looseOriginalConfiguration, standAlone, fromScratch, fromPreset)
|
|
879
|
+
.catch((errorResult) => {
|
|
880
|
+
if ((typeof errorResult === 'string' && errorResult === 'ECONNABORTED') ||
|
|
881
|
+
errorResult.resultType === ResultType.Timeout) { // timeout
|
|
882
|
+
errorResult = new CustomFloorGroupResult(furnitureData.itemIdentifier, furnitureData.itemName);
|
|
883
|
+
errorResult.errorMessages.push(new ErrorMessage('TIMEOUT'));
|
|
884
|
+
errorResult.resultType = ResultType.Timeout;
|
|
885
|
+
}
|
|
886
|
+
this._messageBus.emit(MessageType.FinishedIOneFurnitureBuild);
|
|
887
|
+
this._handleError(errorResult, showErrorDialog);
|
|
888
|
+
return errorResult;
|
|
889
|
+
});
|
|
890
|
+
this._messageBus.emit(MessageType.FinishedIOneFurnitureBuild);
|
|
891
|
+
if (result) {
|
|
892
|
+
if (result.resultType === ResultType.BuildFromScratch) {
|
|
893
|
+
if (fromPreset) { // start configuring when loading is done
|
|
894
|
+
result.metaData = Object.assign({}, furnitureData);
|
|
895
|
+
this._itemsFromScratch.push(result);
|
|
896
|
+
}
|
|
897
|
+
else {
|
|
898
|
+
furnitureData.position = this._floorplanService.getCenter();
|
|
899
|
+
if (!standAlone) {
|
|
900
|
+
this._dialogService.showDialog({
|
|
901
|
+
data: {
|
|
902
|
+
type: DialogType.Warning,
|
|
903
|
+
title: this._dictionaryService.get('BUILD_PRODUCT_FROM_SCRATCH'),
|
|
904
|
+
messages: [{ message: this._dictionaryService.get('MODEL_HAS_NO_DEFAULTS') }]
|
|
905
|
+
}
|
|
906
|
+
});
|
|
907
|
+
return this._handleLoadAndBuildFurniture(furnitureData, false, true, fromPreset, standAlone, true);
|
|
908
|
+
}
|
|
909
|
+
else {
|
|
910
|
+
this.activeMetadata = result ? result.metaData : null;
|
|
911
|
+
return result;
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
if (result.resultType === ResultType.NeedsUserInput) {
|
|
916
|
+
result.metaData = Object.assign({}, furnitureData);
|
|
917
|
+
if (fromPreset) { // start configuring when loading is done
|
|
918
|
+
this._itemsNeedUserInput.push(result);
|
|
919
|
+
}
|
|
920
|
+
else {
|
|
921
|
+
result.metaData.position = this._floorplanService.getCenter();
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
if (result.resultType === ResultType.ExternalSourceNotAvailable) {
|
|
925
|
+
this._loadFurnitureService.addToList(this._loadFurnitureService.externalSourceNotAvailable, result);
|
|
926
|
+
}
|
|
927
|
+
if (result.furniture) {
|
|
928
|
+
if (shouldCopyInstance) {
|
|
929
|
+
const closestWallEdge = this._roomService.getClosestWallEdge(result.furniture.position.x, result.furniture.position.z);
|
|
930
|
+
if (result.furniture instanceof CustomWallFloorItem && result.furniture.onWall) {
|
|
931
|
+
result.furniture.placeOnEdge(closestWallEdge);
|
|
932
|
+
result.furniture.moveFromFloorToWall();
|
|
933
|
+
}
|
|
934
|
+
else if (result.furniture instanceof WallItem && !(result.furniture instanceof CustomWallFloorItem)) {
|
|
935
|
+
result.furniture.placeOnEdge(closestWallEdge);
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
if (result.furniture instanceof CustomWallItem && standAlone) {
|
|
939
|
+
result.furniture.position.y += result.furniture.halfSize.y;
|
|
940
|
+
}
|
|
941
|
+
if (result.resultType === ResultType.Obsolete) {
|
|
942
|
+
this._loadFurnitureService.addToList(this._loadFurnitureService.obsoleteObjectCache, result);
|
|
943
|
+
}
|
|
944
|
+
if (result.resultType === ResultType.Loaded) {
|
|
945
|
+
if (result.metaData.configurable) {
|
|
946
|
+
this._loadFurnitureService.addToList(this._loadFurnitureService.objectList, result);
|
|
947
|
+
}
|
|
948
|
+
else {
|
|
949
|
+
this._loadFurnitureService.addToList(this._loadFurnitureService.simpleObjectList, result);
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
if (result.resultType === ResultType.ConfigurationFixed) {
|
|
953
|
+
this._loadFurnitureService.addToList(this._loadFurnitureService.objectListFixed, result);
|
|
954
|
+
}
|
|
955
|
+
this._addToSceneGTM(result.furniture);
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
if (!fromPreset) {
|
|
959
|
+
this._progressService.finishDownloads();
|
|
960
|
+
}
|
|
961
|
+
this.activeMetadata = result ? result.metaData : null;
|
|
962
|
+
this._sceneService.needsRender = true;
|
|
963
|
+
return result;
|
|
964
|
+
});
|
|
965
|
+
}
|
|
966
|
+
_answerSelected(result) {
|
|
967
|
+
this._loadFurnitureService.addToList(this._loadFurnitureService.objectList, result);
|
|
968
|
+
}
|
|
969
|
+
_handleError(error, showDialog) {
|
|
970
|
+
if (error.instanceId || error.sku) {
|
|
971
|
+
switch (error.resultType) {
|
|
972
|
+
case ResultType.ArticleNotFound:
|
|
973
|
+
case ResultType.Timeout:
|
|
974
|
+
case ResultType.ConfigurationNotFixed:
|
|
975
|
+
case ResultType.GameobjectNameMismatchInSource:
|
|
976
|
+
case ResultType.NoSelections:
|
|
977
|
+
case ResultType.NoDecoNodes:
|
|
978
|
+
case ResultType.ExternalSourceNotAvailable:
|
|
979
|
+
this._loadFurnitureService.notLoaded.push(error);
|
|
980
|
+
if (showDialog) {
|
|
981
|
+
this._showWarning({ title: 'ERROR', messages: error.errorMessages });
|
|
982
|
+
}
|
|
983
|
+
break;
|
|
984
|
+
default:
|
|
985
|
+
this._loadFurnitureService.notLoaded.push(error);
|
|
986
|
+
if (showDialog) {
|
|
987
|
+
this._showWarning({ title: 'ERROR', messages: [new ErrorMessage('ERROR_LOADING_FURNITURE')] });
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
else {
|
|
992
|
+
if (showDialog) {
|
|
993
|
+
this._showWarning({ title: 'ERROR', messages: [new ErrorMessage('ERROR_LOADING_FURNITURE')] });
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
this._messageBus.emit(MessageType.UndefinedErrorOccured);
|
|
997
|
+
}
|
|
998
|
+
_handleConfigureModeChange(configuringModeChange) {
|
|
999
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1000
|
+
if (this.standAlone) {
|
|
1001
|
+
return;
|
|
1002
|
+
}
|
|
1003
|
+
if (configuringModeChange.configuring) {
|
|
1004
|
+
this._iOne.emptySelections();
|
|
1005
|
+
this._appStateService.undoDisabled = true;
|
|
1006
|
+
this._appStateService.redoDisabled = true;
|
|
1007
|
+
this.activeMetadata = configuringModeChange.metadata;
|
|
1008
|
+
this._handleLoadAndBuildFurniture(configuringModeChange.metadata, false, false, false, false, false);
|
|
1009
|
+
}
|
|
1010
|
+
else {
|
|
1011
|
+
this._appStateService.undoDisabled = false;
|
|
1012
|
+
this._appStateService.redoDisabled = false;
|
|
1013
|
+
}
|
|
1014
|
+
this.showAnswers = false;
|
|
1015
|
+
this.showSelections = configuringModeChange.configuring || this.standAlone;
|
|
1016
|
+
this.showLiteSelector = configuringModeChange.configuring || this.standAlone;
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
_addModelDialogToolbar() {
|
|
1020
|
+
this._messageService.emit(MessageType.RegisterToolbarIcon, {
|
|
1021
|
+
template: this.toolbarIconModels,
|
|
1022
|
+
position: 'top',
|
|
1023
|
+
priority: 800
|
|
1024
|
+
});
|
|
1025
|
+
}
|
|
1026
|
+
_showWarning(config) {
|
|
1027
|
+
this._dialogService.showDialog({ data: config });
|
|
1028
|
+
}
|
|
1029
|
+
_addToSceneGTM(furniture) {
|
|
1030
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1031
|
+
if (furniture && furniture.metadata) {
|
|
1032
|
+
const goodId = yield this._connectorAdapterService.getGoodIdFromArticleNr(furniture.metadata.itemIdentifier);
|
|
1033
|
+
const articleFullObject = yield this._connectorAdapterService.getArticleFullObject(goodId);
|
|
1034
|
+
let articleCategories;
|
|
1035
|
+
if (articleFullObject && articleFullObject.publication !== undefined) {
|
|
1036
|
+
articleCategories = yield this._connectorAdapterService.getArticleCategories(articleFullObject.publication);
|
|
1037
|
+
}
|
|
1038
|
+
let data = {
|
|
1039
|
+
'articleNr': furniture.metadata.itemIdentifier,
|
|
1040
|
+
'product': furniture.metadata.itemName,
|
|
1041
|
+
'schema': furniture.metadata.schema
|
|
1042
|
+
};
|
|
1043
|
+
if (furniture.metadata.externalSettings !== undefined) {
|
|
1044
|
+
const externalData = {
|
|
1045
|
+
'externalSourceName': furniture.metadata.externalSettings.name,
|
|
1046
|
+
'externalSourceUrl': furniture.metadata.externalSettings.settings.url
|
|
1047
|
+
};
|
|
1048
|
+
data = Object.assign(Object.assign({}, data), externalData);
|
|
1049
|
+
}
|
|
1050
|
+
if (articleFullObject) {
|
|
1051
|
+
const articleData = {
|
|
1052
|
+
'brandId': articleFullObject.brandId,
|
|
1053
|
+
'retailFormulas': articleFullObject.retailFormulas,
|
|
1054
|
+
'turnOverGroup': articleFullObject.turnOverGroup
|
|
1055
|
+
};
|
|
1056
|
+
data = Object.assign(Object.assign({}, data), articleData);
|
|
1057
|
+
}
|
|
1058
|
+
if (articleCategories) {
|
|
1059
|
+
const categoryList = [];
|
|
1060
|
+
for (const category of articleCategories) {
|
|
1061
|
+
if (category.description) {
|
|
1062
|
+
categoryList.push(category.description);
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
const categoryData = {
|
|
1066
|
+
'categories': categoryList
|
|
1067
|
+
};
|
|
1068
|
+
data = Object.assign(Object.assign({}, data), categoryData);
|
|
1069
|
+
}
|
|
1070
|
+
this._googleTagManager.sendEvent(GoogleTagManagerEvent.AddToScene, data);
|
|
1071
|
+
}
|
|
1072
|
+
});
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
ThreedselectorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ThreedselectorComponent, deps: [{ token: i1.ScreenSizeAnalysisService }, { token: i2.MatDialog }, { token: i3.HomedecoratorAppService }, { token: i4.HomedecoratorConnectorService }, { token: i5.MessageBusService }, { token: i6.LoadFurnitureService }, { token: i7.BuildFurnitureService }, { token: i8.IntegrationService }, { token: i9.HomedecoratorDictionaryService }, { token: i10.ToastService }, { token: i5.MessageBusService }, { token: i11.SceneService }, { token: i12.DialogService }, { token: i13.CameraService }, { token: i14.PresetsService }, { token: i15.ItemService }, { token: i16.HomedecoratorSettingsService }, { token: i17.SceneOptionsService }, { token: i18.DimensionsService }, { token: i19.HomedecoratorAppEventService }, { token: i20.FloorplanService }, { token: i21.FloorService }, { token: i22.HomedecoratorIconCacheService }, { token: i23.ArService }, { token: i24.GoogleTagManagerService }, { token: i25.ErrorService }, { token: i26.RotationService }, { token: i27.RoomService }, { token: i28.AppStateService }, { token: i29.ProgressService }, { token: i30.AnimationService }, { token: i31.ResizeService }, { token: i32.CustomizerService }, { token: i33.DynamicCameraService }, { token: i34.ThreedInPhotoInitializerService }, { token: i35.RenderService }, { token: i36.NewRenderService }, { token: i37.HomedecoratorConnectorAdapterService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1076
|
+
ThreedselectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ThreedselectorComponent, selector: "rp-threedselector", inputs: { selections: "selections" }, outputs: { customizeButtonClicked: "customizeButtonClicked" }, viewQueries: [{ propertyName: "toolbarIconModels", first: true, predicate: ["toolbarIconModels"], descendants: true, static: true }, { propertyName: "selectedThreedObjectCustomizationSidebar", first: true, predicate: ["selectedThreedObjectCustomizationSidebar"], descendants: true, static: true }, { propertyName: "selectedThreedObjectAnimationSidebar", first: true, predicate: ["selectedThreedObjectAnimationSidebar"], descendants: true, static: true }, { propertyName: "customizeButtonClicked", first: true, predicate: ElementToolbarComponent, descendants: true, static: true }], ngImport: i0, template: "<rp-lite-selector *ngIf=\"!standAlone\" class=\"floating\"\r\n [(show)]=\"showLiteSelector\"\r\n [metadata]=\"activeMetadata\"\r\n [showSelections]=\"showSelections\"\r\n [showAnswers]=\"showAnswers\"\r\n (showChange)=\"handleShowChangeSelector($event)\"\r\n></rp-lite-selector>\r\n<ng-container *ngIf=\"showElementToolbar\">\r\n <rp-element-toolbar class=\"rp-element-toolbar floating\" [class.custom]=\"standAlone\" @showElementToolbar\r\n [editMenu]=\"editElementMenu\"\r\n [showSwap]=\"showSwapButton\"\r\n [showPointer]=\"selectedElementPosition !== undefined\"\r\n (swapClicked)=\"swapElement()\"\r\n (deleteClicked)=\"deleteElement()\"\r\n (animationClicked)=\"openAnimationSidebar()\"\r\n ></rp-element-toolbar>\r\n <rp-element-buttons class=\"rp-element-buttons floating\" @showElementToolbar\r\n [elementPointer]=\"elementToolbar?.elementPointer\"\r\n [addButtons]=\"editAddButtons\"\r\n [customizeButtons]=\"editCustomizeButton\"\r\n [resizeButtons]=\"resizeButtons\"\r\n [elementPosition]=\"selectedElementPosition\"\r\n (customizeButtonClicked)=\"handleCustomizeClick()\"\r\n ></rp-element-buttons>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"showCustomizeButtons\">\r\n <rp-element-buttons class=\"rp-element-buttons floating\"\r\n [elementPointer]=\"elementToolbar?.elementPointer\"\r\n [customizeButtons]=\"editCustomizeButton\"\r\n [elementPosition]=\"selectedElementPosition\"\r\n (customizeButtonClicked)=\"handleCustomizeClick()\"\r\n ></rp-element-buttons>\r\n</ng-container>\r\n\r\n<ng-template #toolbarIconModels>\r\n <rp-toolbar-icon\r\n matIcon=\"format_list_bulleted\"\r\n tooltip=\"{{iconName.Objects | localize}}\"\r\n (onClick)=\"setModelErrorDialog()\"\r\n [showLabel]=\"shouldShowLabel\"\r\n ></rp-toolbar-icon>\r\n</ng-template>\r\n\r\n<ng-template #selectedThreedObjectAnimationSidebar>\r\n <header class=\"drawer__header\">\r\n <h2 class=\"mat-title\" [textContent]=\"'ANIMATE' | localize\"></h2>\r\n </header>\r\n <rp-animation>\r\n\r\n </rp-animation>\r\n</ng-template>\r\n\r\n<ng-template #selectedThreedObjectCustomizationSidebar>\r\n <header class=\"drawer__header\">\r\n <h2 class=\"mat-title\" [textContent]=\"'CUSTOMIZE' | localize\"></h2>\r\n </header>\r\n <rp-customizer\r\n [selection]=\"selectionToCustomize\"\r\n ></rp-customizer>\r\n</ng-template>\r\n\r\n<div class=\"slider-container\">\r\n <rp-element-slider class=\"rp-element-slider\"></rp-element-slider>\r\n</div>\r\n", styles: [":host{position:absolute;top:0;left:0;pointer-events:none;margin:0;padding:0;width:100%;height:100%;overflow:hidden}:host>*{pointer-events:all}.input-wrapper{display:flex;flex-direction:column}.flex-wrap{display:flex;flex-flow:column nowrap;height:100%}.logo-menu-5th{position:absolute;top:220px;left:84px}.logo-menu-5th.front .mat-raised-button{width:170px;text-align:left}.sidebar{position:absolute;left:0;top:0;height:100vh;max-width:30%;width:400px;background:#fff;padding:0 20px;box-shadow:0 0 20px #00000040}.on-top{z-index:3}.solid-background{fill:#fff;background:white}.solid-background>*{fill:#fff;background:white}.button-close{height:36px;width:36px;min-width:initial;padding:0;border:none;position:absolute;right:20px;top:15px;border-radius:50%}.remove-all{position:absolute;top:15px;right:71px}\n"], components: [{ type: i38.LiteSelectorComponent, selector: "rp-lite-selector", inputs: ["showAnswers", "show", "showSelections", "showLabel", "canClose", "metadata", "customDimensions"], outputs: ["showChange", "answerChosen"] }, { type: i39.ElementToolbarComponent, selector: "rp-element-toolbar", inputs: ["editMenu", "showPointer", "showSwap"], outputs: ["deleteClicked", "swapClicked", "animationClicked"] }, { type: i40.ElementButtonsComponent, selector: "rp-element-buttons", inputs: ["addButtons", "customizeButtons", "resizeButtons", "elementPointer", "elementPosition"], outputs: ["customizeButtonClicked"] }, { type: i41.ToolbarIconComponent, selector: "rp-toolbar-icon", inputs: ["matIcon", "svgIcon", "tooltip", "disabled", "showLabel"], outputs: ["onClick"] }, { type: i42.AnimationComponent, selector: "rp-animation" }, { type: i43.CustomizerComponent, selector: "rp-customizer", inputs: ["selection"] }, { type: i44.ElementSliderComponent, selector: "rp-element-slider" }], directives: [{ type: i45.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "localize": i46.LocalizePipe }, animations: [
|
|
1077
|
+
trigger('showElementToolbar', [
|
|
1078
|
+
state('void', style({ 'opacity': '0' })),
|
|
1079
|
+
state('*', style({ 'opacity': '1' })),
|
|
1080
|
+
transition('void => *', animate('500ms ease'))
|
|
1081
|
+
])
|
|
1082
|
+
] /*,
|
|
1083
|
+
changeDetection: ChangeDetectionStrategy.OnPush*/ });
|
|
1084
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ThreedselectorComponent, decorators: [{
|
|
1085
|
+
type: Component,
|
|
1086
|
+
args: [{
|
|
1087
|
+
selector: 'rp-threedselector',
|
|
1088
|
+
templateUrl: './threedselector.component.html',
|
|
1089
|
+
styleUrls: ['./threedselector.component.scss'],
|
|
1090
|
+
animations: [
|
|
1091
|
+
trigger('showElementToolbar', [
|
|
1092
|
+
state('void', style({ 'opacity': '0' })),
|
|
1093
|
+
state('*', style({ 'opacity': '1' })),
|
|
1094
|
+
transition('void => *', animate('500ms ease'))
|
|
1095
|
+
])
|
|
1096
|
+
] /*,
|
|
1097
|
+
changeDetection: ChangeDetectionStrategy.OnPush*/
|
|
1098
|
+
}]
|
|
1099
|
+
}], ctorParameters: function () { return [{ type: i1.ScreenSizeAnalysisService }, { type: i2.MatDialog }, { type: i3.HomedecoratorAppService }, { type: i4.HomedecoratorConnectorService }, { type: i5.MessageBusService }, { type: i6.LoadFurnitureService }, { type: i7.BuildFurnitureService }, { type: i8.IntegrationService }, { type: i9.HomedecoratorDictionaryService }, { type: i10.ToastService }, { type: i5.MessageBusService }, { type: i11.SceneService }, { type: i12.DialogService }, { type: i13.CameraService }, { type: i14.PresetsService }, { type: i15.ItemService }, { type: i16.HomedecoratorSettingsService }, { type: i17.SceneOptionsService }, { type: i18.DimensionsService }, { type: i19.HomedecoratorAppEventService }, { type: i20.FloorplanService }, { type: i21.FloorService }, { type: i22.HomedecoratorIconCacheService }, { type: i23.ArService }, { type: i24.GoogleTagManagerService }, { type: i25.ErrorService }, { type: i26.RotationService }, { type: i27.RoomService }, { type: i28.AppStateService }, { type: i29.ProgressService }, { type: i30.AnimationService }, { type: i31.ResizeService }, { type: i32.CustomizerService }, { type: i33.DynamicCameraService }, { type: i34.ThreedInPhotoInitializerService }, { type: i35.RenderService }, { type: i36.NewRenderService }, { type: i37.HomedecoratorConnectorAdapterService }]; }, propDecorators: { toolbarIconModels: [{
|
|
1100
|
+
type: ViewChild,
|
|
1101
|
+
args: ['toolbarIconModels', { static: true }]
|
|
1102
|
+
}], selectedThreedObjectCustomizationSidebar: [{
|
|
1103
|
+
type: ViewChild,
|
|
1104
|
+
args: ['selectedThreedObjectCustomizationSidebar', { static: true }]
|
|
1105
|
+
}], selectedThreedObjectAnimationSidebar: [{
|
|
1106
|
+
type: ViewChild,
|
|
1107
|
+
args: ['selectedThreedObjectAnimationSidebar', { static: true }]
|
|
1108
|
+
}], customizeButtonClicked: [{
|
|
1109
|
+
type: ViewChild,
|
|
1110
|
+
args: [ElementToolbarComponent, { static: true }]
|
|
1111
|
+
}, {
|
|
1112
|
+
type: Output
|
|
1113
|
+
}], selections: [{
|
|
1114
|
+
type: Input
|
|
1115
|
+
}] } });
|
|
1116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVkc2VsZWN0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hcHAvcGx1Z2lucy90aHJlZWRzZWxlY3Rvci90aHJlZWRzZWxlY3Rvci90aHJlZWRzZWxlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2FwcC9wbHVnaW5zL3RocmVlZHNlbGVjdG9yL3RocmVlZHNlbGVjdG9yL3RocmVlZHNlbGVjdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFlLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBR0wsS0FBSyxFQUVMLEtBQUssRUFBRSxLQUFLLEVBQ1osSUFBSSxFQUdKLGFBQWEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUNuQyxPQUFPLEVBQ1AsT0FBTyxFQUNSLE1BQU0sT0FBTyxDQUFDO0FBSWYsT0FBTyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUUvRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDM0QsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDckYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQy9ELE9BQU8sRUFBVyxRQUFRLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuRSxPQUFPLEVBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFHdkcsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8s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QyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO1lBQ25DLFVBQVUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQy9DLENBQUM7S0FDSCxDQUFBO3FEQUNnRDs0RkFFdEMsdUJBQXVCO2tCQWJuQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFdBQVcsRUFBRSxpQ0FBaUM7b0JBQzlDLFNBQVMsRUFBRSxDQUFDLGlDQUFpQyxDQUFDO29CQUM5QyxVQUFVLEVBQUU7d0JBQ1YsT0FBTyxDQUFDLG9CQUFvQixFQUFFOzRCQUM1QixLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDOzRCQUN0QyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDOzRCQUNuQyxVQUFVLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzt5QkFDL0MsQ0FBQztxQkFDSCxDQUFBO3FFQUNnRDtpQkFDbEQ7cTFDQUltRCxpQkFBaUI7c0JBQWxFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUN1Qix3Q0FBd0M7c0JBQTlHLFNBQVM7dUJBQUMsMENBQTBDLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNGLG9DQUFvQztzQkFBdEcsU0FBUzt1QkFBQyxzQ0FBc0MsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBSTFELHNCQUFzQjtzQkFINUIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7O3NCQUVuRCxNQUFNO2dCQUlBLFVBQVU7c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQXhlc0hlbHBlcixcclxuICBCdWZmZXJBdHRyaWJ1dGUsXHJcbiAgQ29sb3IsXHJcbiAgRGlyZWN0aW9uYWxMaWdodCxcclxuICBFdWxlciwgTGlnaHQsXHJcbiAgTWVzaCxcclxuICBNZXNoU3RhbmRhcmRNYXRlcmlhbCxcclxuICBPYmplY3QzRCwgUGF0aCxcclxuICBQbGFuZUdlb21ldHJ5LCBTaGFwZSwgU2hhcGVHZW9tZXRyeSxcclxuICBWZWN0b3IyLFxyXG4gIFZlY3RvcjNcclxufSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uJztcclxuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7YW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHtBcnRpY2xlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2FydGljbGUnO1xyXG5pbXBvcnQge0ljb25OYW1lfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vaWNvbi1uYW1lLmVudW0nO1xyXG5pbXBvcnQge0VsZW1lbnRUb29sYmFyQ29tcG9uZW50fSBmcm9tICcuLi9lbGVtZW50LXRvb2xiYXIvZWxlbWVudC10b29sYmFyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7Q3VzdG9tQnV0dG9ufSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVsL2N1c3RvbS1idXR0b24nO1xyXG5pbXBvcnQge0hhbGZFZGdlLCBXYWxsSXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL3dhbGwtb2JqZWN0cyc7XHJcbmltcG9ydCB7Q3VzdG9tT2JqZWN0M0R9IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9jdXN0b20tb2JqZWN0cyc7XHJcbmltcG9ydCB7aXNJdGVtR3JvdXBUeXBlLCBpc1dhbGxJdGVtR3JvdXBUeXBlLCBpdGVtVHlwZUZyb21QbGFjZW1lbnR9IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9mYWN0b3J5JztcclxuaW1wb3J0IHtNZXRhZGF0YX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL21ldGFkYXRhJztcclxuaW1wb3J0IHtJdGVtfSBmcm9tICcuLi8uLi9jb3JlM2QvaXRlbXMvaXRlbSc7XHJcbmltcG9ydCB7SXRlbUdyb3VwfSBmcm9tICcuLi8uLi9jb3JlM2QvaXRlbXMvaXRlbS1ncm91cCc7XHJcbmltcG9ydCB7Q3VzdG9tRmxvb3JHcm91cFJlc3VsdH0gZnJvbSAnLi4vLi4vY29yZTNkL21vZGVsL2N1c3RvbS1mbG9vci1ncm91cC1yZXN1bHQnO1xyXG5pbXBvcnQge1RleHR1cmV9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvdGV4dHVyZSc7XHJcbmltcG9ydCB7U2NyZWVuU2l6ZUFuYWx5c2lzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NjcmVlbi1zaXplLWFuYWx5c2lzL3NjcmVlbi1zaXplLWFuYWx5c2lzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JBcHBTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlQnVzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL21lc3NhZ2UtYnVzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xvYWRGdXJuaXR1cmVTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2UvbG9hZC1mdXJuaXR1cmUuc2VydmljZSc7XHJcbmltcG9ydCB7QnVpbGRGdXJuaXR1cmVTZXJ2aWNlLCBDb25maWd1cmluZ01vZGVDaGFuZ2VJbnRlcmZhY2V9IGZyb20gJy4vc2VydmljZS9idWlsZC1mdXJuaXR1cmUuc2VydmljZSc7XHJcbmltcG9ydCB7SW50ZWdyYXRpb25TZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaW50ZWdyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckRpY3Rpb25hcnlTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1kaWN0aW9uYXJ5LnNlcnZpY2UnO1xyXG5pbXBvcnQge1RvYXN0U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3RvYXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7RGlhbG9nU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2RpYWxvZy9zZXJ2aWNlL2RpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHtDYW1lcmFTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9jYW1lcmEuc2VydmljZSc7XHJcbmltcG9ydCB7UHJlc2V0c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9wcmVzZXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9pdGVtLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLXNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lT3B0aW9uc1NlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9zZXJ2aWNlL3NjZW5lLW9wdGlvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7RGltZW5zaW9uc1NlcnZpY2V9IGZyb20gJy4vc2VydmljZS9kaW1lbnNpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JBcHBFdmVudFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWFwcC1ldmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtGbG9vcnBsYW5TZXJ2aWNlfSBmcm9tICcuLi8uLi9yb29tLXBsYW5uZXIvY29tcG9uZW50cy9mbG9vcnBsYW5uZXIvc2VydmljZS9mbG9vcnBsYW4uc2VydmljZSc7XHJcbmltcG9ydCB7Rmxvb3JTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9mbG9vci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9ySWNvbkNhY2hlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItaWNvbi1jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtBclNlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9zZXJ2aWNlL2FyLnNlcnZpY2UnO1xyXG5pbXBvcnQge0dvb2dsZVRhZ01hbmFnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL2dvb2dsZS10YWctbWFuYWdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtFcnJvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9lcnJvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtSb3RhdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9zZXJ2aWNlL3JvdGF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge1Jvb21TZXJ2aWNlfSBmcm9tICcuLi8uLi9yb29tLXBsYW5uZXIvY29tcG9uZW50cy9mbG9vcnBsYW5uZXIvc2VydmljZS9yb29tLnNlcnZpY2UnO1xyXG5pbXBvcnQge0FwcFN0YXRlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2FwcC1zdGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtQcm9ncmVzc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9wcm9ncmVzcy5zZXJ2aWNlJztcclxuaW1wb3J0IHtBbmltYXRpb25TZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2UvYW5pbWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge1Jlc2l6ZVNlcnZpY2V9IGZyb20gJy4vc2VydmljZS9yZXNpemUuc2VydmljZSc7XHJcbmltcG9ydCB7Q3VzdG9taXplclNlcnZpY2V9IGZyb20gJy4uLy4uL2xpdGUtc2VsZWN0b3IvbGl0ZS1zZWxlY3Rvci9zZXJ2aWNlL2N1c3RvbWl6ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7RHluYW1pY0NhbWVyYVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9keW5hbWljLWNhbWVyYS5zZXJ2aWNlJztcclxuaW1wb3J0IHtUaHJlZWRJblBob3RvSW5pdGlhbGl6ZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi90aHJlZWQtaW4tcGhvdG8vc2VydmljZXMvdGhyZWVkLWluLXBob3RvLWluaXRpYWxpemVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1JlbmRlclNlcnZpY2V9IGZyb20gJy4uLy4uL3JlbmRlci9zZXJ2aWNlL3JlbmRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtOZXdSZW5kZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9yZW5kZXIvc2VydmljZS9uZXctcmVuZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JDb25uZWN0b3JBZGFwdGVyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItY29ubmVjdG9yLWFkYXB0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7TWVzc2FnZVR5cGV9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9tZXNzYWdlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7U2NyZWVuU2l6ZUluZm99IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zY3JlZW4tc2l6ZS1hbmFseXNpcy9zY3JlZW4tc2l6ZS1pbmZvJztcclxuaW1wb3J0IHtXYWxsSXRlbUdyb3VwfSBmcm9tICcuLi8uLi9jb3JlM2QvaXRlbXMvd2FsbC1vYmplY3RzJztcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscy9vYmplY3QudXRpbHMnO1xyXG5pbXBvcnQge01vZGVsRGlhbG9nQ29tcG9uZW50fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvbW9kZWwtZGlhbG9nL21vZGVsLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQge1NjZW5lT3B0aW9uQnV0dG9uSW50ZXJmYWNlfSBmcm9tICcuLi8uLi9jb3JlM2QvaW50ZXJmYWNlL3NjZW5lLW9wdGlvbi1idXR0b24uaW50ZXJmYWNlJztcclxuaW1wb3J0IHtJY29uRW51bX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL2ljb24uZW51bSc7XHJcbmltcG9ydCB7RGlhbG9nQ29uZmlnfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZGlhbG9nL2ludGVyZmFjZS9kaWFsb2ctY29uZmlnLmludGVyZmFjZSc7XHJcbmltcG9ydCB7RGlhbG9nVHlwZX0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2RpYWxvZy9lbnVtL2RpYWxvZy10eXBlLmVudW0nO1xyXG5pbXBvcnQge0Vycm9yTWVzc2FnZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9lcnJvci1tZXNzYWdlJztcclxuaW1wb3J0IHtSZXN1bHRUeXBlfSBmcm9tICcuLi8uLi9jb3JlM2QvZW51bS9yZXN1bHQtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtDdXN0b21NZXNofSBmcm9tICcuLi8uLi9jb3JlM2QvaXRlbXMvY3VzdG9tLW9iamVjdHMnO1xyXG5pbXBvcnQge0V4dGVybmFsU2V0dGluZ3NJbnRlcmZhY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL2V4dGVybmFsLXNldHRpbmdzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7VG9hc3R9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvdG9hc3QnO1xyXG5pbXBvcnQge0RyYWdnZWREYXRhfSBmcm9tICcuLi8uLi9jb3JlM2QvaW50ZXJmYWNlL2RyYWdnZWQtZGF0YS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscy9mdW5jdGlvbi9pcy1uaWxsLmZ1bmN0aW9uJztcclxuaW1wb3J0IHtDdXN0b21XYWxsRmxvb3JJdGVtfSBmcm9tICcuLi8uLi9jb3JlM2QvaXRlbXMvY3VzdG9tLXdhbGwtZmxvb3ItaXRlbSc7XHJcbmltcG9ydCB7Q3VzdG9tV2FsbEl0ZW19IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9jdXN0b20td2FsbC1pdGVtJztcclxuaW1wb3J0IHtHb29nbGVUYWdNYW5hZ2VyRXZlbnR9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9nb29nbGUtdGFnLW1hbmFnZXItZXZlbnQuZW51bSc7XHJcbmltcG9ydCB7Q2FtZXJhU2V0dGluZ3NEaWFsb2dDb21wb25lbnR9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9jYW1lcmEtc2V0dGluZ3MtZGlhbG9nL2NhbWVyYS1zZXR0aW5ncy1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHtBcnRpY2xlQ2F0ZWdvcnl9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYXJ0aWNsZS1jYXRlZ29yeSc7XHJcbmltcG9ydCB7RXh0ZXJuYWxTb3VyY2V9IGZyb20gJ0Bjb2xpam5pdC9hcnRpY2xlYXBpL2J1aWxkL21vZGVsL2V4dGVybmFsLXNvdXJjZS5ibyc7XHJcbmltcG9ydCB7Q2F0YWxvZ0RlZmluaXRpb259IGZyb20gJ0Bjb2xpam5pdC9hcnRpY2xlYXBpL2J1aWxkL21vZGVsL2NhdGFsb2ctZGVmaW5pdGlvbi5ibyc7XHJcbmltcG9ydCB7Tm9kZVR5cGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9ub2RlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7TWF0ZXJpYWxVdGlsc30gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscy9tYXRlcmlhbC51dGlscyc7XHJcbmltcG9ydCB7ZGlyZWN0aW9ufSBmcm9tICdodG1sMmNhbnZhcy9kaXN0L3R5cGVzL2Nzcy9wcm9wZXJ0eS1kZXNjcmlwdG9ycy9kaXJlY3Rpb24nO1xyXG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7VXRpbHN9IGZyb20gJy4uLy4uL2NvcmUzZC9jb3JlL3V0aWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncnAtdGhyZWVkc2VsZWN0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90aHJlZWRzZWxlY3Rvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGhyZWVkc2VsZWN0b3IuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdzaG93RWxlbWVudFRvb2xiYXInLCBbXHJcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeydvcGFjaXR5JzogJzAnfSkpLFxyXG4gICAgICBzdGF0ZSgnKicsIHN0eWxlKHsnb3BhY2l0eSc6ICcxJ30pKSxcclxuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgYW5pbWF0ZSgnNTAwbXMgZWFzZScpKVxyXG4gICAgXSlcclxuICBdLyosXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gqL1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGhyZWVkc2VsZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgcHVibGljIHJlYWRvbmx5IGljb25OYW1lOiB0eXBlb2YgSWNvbk5hbWUgPSBJY29uTmFtZTtcclxuXHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25Nb2RlbHMnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0b29sYmFySWNvbk1vZGVsczogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdzZWxlY3RlZFRocmVlZE9iamVjdEN1c3RvbWl6YXRpb25TaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIHNlbGVjdGVkVGhyZWVkT2JqZWN0Q3VzdG9taXphdGlvblNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRUaHJlZWRPYmplY3RBbmltYXRpb25TaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIHNlbGVjdGVkVGhyZWVkT2JqZWN0QW5pbWF0aW9uU2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKEVsZW1lbnRUb29sYmFyQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgY3VzdG9taXplQnV0dG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgZWxlbWVudFRvb2xiYXI6IEVsZW1lbnRUb29sYmFyQ29tcG9uZW50O1xyXG5cclxuICBwdWJsaWMgZWRpdEVsZW1lbnRNZW51OiBDdXN0b21CdXR0b25bXSA9IFtdO1xyXG4gIHB1YmxpYyBlZGl0QWRkQnV0dG9uczogQ3VzdG9tQnV0dG9uW10gPSBbXTtcclxuICBwdWJsaWMgZWRpdEN1c3RvbWl6ZUJ1dHRvbjogQ3VzdG9tQnV0dG9uW10gPSBbXTtcclxuICBwdWJsaWMgcmVzaXplQnV0dG9uczogQ3VzdG9tQnV0dG9uW10gPSBbXTtcclxuXHJcbiAgcHVibGljIHNlbGVjdGVkRWxlbWVudFBvc2l0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgcHVibGljIHNob3dFbGVtZW50VG9vbGJhciA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93TGl0ZVNlbGVjdG9yID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dTZWxlY3Rpb25zID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dBbnN3ZXJzID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dDdXN0b21pemVCdXR0b25zID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dTd2FwQnV0dG9uID0gdHJ1ZTtcclxuICBwdWJsaWMgc3RhbmRBbG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG91bGRTaG93TGFiZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgYWN0aXZlTWV0YWRhdGE6IE1ldGFkYXRhO1xyXG4gIHB1YmxpYyBzZWxlY3Rpb25Ub0N1c3RvbWl6ZTogYW55O1xyXG4gIHB1YmxpYyBzZWxlY3RlZE9iamVjdDogSXRlbSB8IEl0ZW1Hcm91cDtcclxuICBwdWJsaWMgc2VsZWN0ZWRFbGVtZW50OiBNZXNoO1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RlZEVsZW1lbnRPYmplY3Q6IEN1c3RvbU9iamVjdDNEO1xyXG4gIHByaXZhdGUgX3NrdUFscmVhZHlTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pdGVtc0Zyb21TY3JhdGNoOiBDdXN0b21GbG9vckdyb3VwUmVzdWx0W10gPSBbXTtcclxuICBwcml2YXRlIF9pdGVtc05lZWRVc2VySW5wdXQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHRbXSA9IFtdO1xyXG4gIHByaXZhdGUgX3N0YW5kYWxvbmVGbG9vcnM6IFRleHR1cmVbXTtcclxuICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2xvYWRpbmdGcm9tUHJlc2V0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY2FsbEJhY2tGbldoZW5CdWlsZEZpbmlzaGVkOiBGdW5jdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgc2NyZWVuU2l6ZVNlcnZpY2U6IFNjcmVlblNpemVBbmFseXNpc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgX2FwcFNlcnZpY2U6IEhvbWVkZWNvcmF0b3JBcHBTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaU9uZTogSG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlQnVzOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xvYWRGdXJuaXR1cmVTZXJ2aWNlOiBMb2FkRnVybml0dXJlU2VydmljZSxcclxuICAgIHByaXZhdGUgX2J1aWxkRnVybml0dXJlU2VydmljZTogQnVpbGRGdXJuaXR1cmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaW50ZWdyYXRpb25TZXJ2aWNlOiBJbnRlZ3JhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWN0aW9uYXJ5U2VydmljZTogSG9tZWRlY29yYXRvckRpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZUJ1c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zY2VuZVNlcnZpY2U6IFNjZW5lU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jYW1lcmFTZXJ2aWNlOiBDYW1lcmFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcHJlc2V0c1NlcnZpY2U6IFByZXNldHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaXRlbVNlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2V0dGluZ3NTZXJ2aWNlOiBIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2NlbmVPcHRpb25zU2VydmljZTogU2NlbmVPcHRpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpbWVuc2lvbnNTZXJ2aWNlOiBEaW1lbnNpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgX2FwcEV2ZW50U2VydmljZTogSG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgX2Zsb29ycGxhblNlcnZpY2U6IEZsb29ycGxhblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mbG9vclNlcnZpY2U6IEZsb29yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2ljb25DYWNoZVNlcnZpY2U6IEhvbWVkZWNvcmF0b3JJY29uQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfYXJTZXJ2aWNlOiBBclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9nb29nbGVUYWdNYW5hZ2VyOiBHb29nbGVUYWdNYW5hZ2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2Vycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcm90YXRpb25TZXJ2aWNlOiBSb3RhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yb29tU2VydmljZTogUm9vbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hcHBTdGF0ZVNlcnZpY2U6IEFwcFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgX3Byb2dyZXNzU2VydmljZTogUHJvZ3Jlc3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfYW5pbWF0aW9uU2VydmljZTogQW5pbWF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX3Jlc2l6ZVNlcnZpY2U6IFJlc2l6ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jdXN0b21pemVyU2VydmljZTogQ3VzdG9taXplclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9keW5hbWljQ2FtZXJhU2VydmljZTogRHluYW1pY0NhbWVyYVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90aHJlZWRJblBob3RvSW5pdGlhbGl6ZXJTZXJ2aWNlOiBUaHJlZWRJblBob3RvSW5pdGlhbGl6ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcmVuZGVyU2VydmljZTogUmVuZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgX25ld1JlbmRlclNlcnZpY2U6IE5ld1JlbmRlclNlcnZpY2UsXHJcbiAgICAgIHByaXZhdGUgX2Nvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuX3ByZXNldHNTZXJ2aWNlLnJlZ2lzdGVyKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hbnN3ZXJDb3VudFJlY2VpdmVkLnN1YnNjcmliZSgoYW5zd2VyQ291bnQ6IG51bWJlcikgPT4gdGhpcy5faGFuZGxlQW5zd2VyQ291bnRSZWNlaXZlZChhbnN3ZXJDb3VudCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5Mb2FkSU9uZUZ1cm5pdHVyZUludG9TY2VuZUJ5U0tVLFxyXG4gICAgICAgICh7c2t1LCBzZXR0aW5ncywgcG9zaXRpb259OiB7IHNrdTogc3RyaW5nLCBzZXR0aW5nczogYW55LCBwb3NpdGlvbjogeyB4OiBudW1iZXIsIHk6IG51bWJlciwgej86IG51bWJlciB9IH0pID0+XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVMb2FkSU9uZUZ1cm5pdHVyZUludG9TY2VuZUJ5U0tVKHNrdSwgc2V0dGluZ3MsIHBvc2l0aW9uKVxyXG4gICAgICApLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5Db3B5SU9uZUZ1cm5pdHVyZUludG9TY2VuZUJ5U0tVLCAob3JpZ2luYWw6IEl0ZW0pID0+XHJcbiAgICAgICAgdGhpcy5faGFuZGxlQ29weUlPbmVGdXJuaXR1cmVJbnRvU2NlbmVCeVNLVShvcmlnaW5hbClcclxuICAgICAgKSxcclxuICAgICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmNvbmZpZ3VyZU1vZGVDaGFuZ2VkLnN1YnNjcmliZShjb25maWd1cmluZ01vZGVDaGFuZ2UgPT5cclxuICAgICAgICB0aGlzLl9oYW5kbGVDb25maWd1cmVNb2RlQ2hhbmdlKGNvbmZpZ3VyaW5nTW9kZUNoYW5nZSkpLFxyXG4gICAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UudG9nZ2xlU2VsZWN0ZWRFbGVtZW50LnN1YnNjcmliZSgoZWxlbWVudDogTWVzaCkgPT4gdGhpcy5fc2VsZWN0ZWRFbGVtZW50VG9nZ2xlKGVsZW1lbnQpKSxcclxuICAgICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmJ1aWxkRmluaXNoZWQuc3Vic2NyaWJlKChyZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQpID0+IHRoaXMuX2hhbmRsZUJ1aWxkRmluaXNoZWQocmVzdWx0KSksXHJcbiAgICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5hbnN3ZXJTZWxlY3RlZC5zdWJzY3JpYmUoKHJlc3VsdDogQ3VzdG9tRmxvb3JHcm91cFJlc3VsdCkgPT4gdGhpcy5fYW5zd2VyU2VsZWN0ZWQocmVzdWx0KSksXHJcbiAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5vbkFmdGVyUmVuZGVyLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9oYW5kbGVSZW5kZXIoKSksXHJcbiAgICAgIHRoaXMuX2FwcFNlcnZpY2Uuc2t1U2V0LnN1YnNjcmliZShza3UgPT4gdGhpcy5faGFuZGxlU2t1U2V0KHNrdSkpLFxyXG4gICAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2UuYXJ0aWNsZUluZm9SZWNlaXZlZC5zdWJzY3JpYmUoaW5mbyA9PiB0aGlzLl9oYW5kbGVJbmZvQ2xpY2soaW5mbykpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuVW5kZWZpbmVkRXJyb3JPY2N1cmVkLCAoKSA9PiB0aGlzLl9oYW5kbGVVbmRlZmluZWRFcnJvck9jY3VyZWQoKSksXHJcbiAgICAgIHRoaXMuX3ByZXNldHNTZXJ2aWNlLmFmdGVyTG9hZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fYWZ0ZXJMb2FkRnJvbVByZXNldCgpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuVW5kbywgKCkgPT4gdGhpcy5fY2xlYXJJdGVtcygpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuUmVkbywgKCkgPT4gdGhpcy5fY2xlYXJJdGVtcygpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuU3RhcnRXaXRoRW1wdHlSb29tLCAoKSA9PiB0aGlzLl9jbGVhckl0ZW1zKCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TdGFydFdpdGhQcmVzZXQsICgpID0+IHRoaXMuX2NsZWFySXRlbXMoKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkxvYWRSb29tRnJvbVByZXNldCwgKCkgPT4gdGhpcy5fY2xlYXJJdGVtcygpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuTG9hZFJvb21Gcm9tQ2xvdWQsICgpID0+IHRoaXMuX2NsZWFySXRlbXMoKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLk5ld1Jvb20sICgpID0+IHRoaXMuX2NsZWFySXRlbXMoKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlJlc2V0Um9vbXBsYW4sICgpID0+IHRoaXMuX2NsZWFySXRlbXMoKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkxvYWRTY2FsZWREaWFncmFtLCAoKSA9PiB0aGlzLl9jbGVhckl0ZW1zKCkpLFxyXG4gICAgICB0aGlzLl9wcmVzZXRzU2VydmljZS5iZWZvcmVMb2FkLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9jbGVhckl0ZW1zKCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuSXRlbVNlbGVjdGVkLCAoaXRlbSkgPT4gdGhpcy5vYmplY3RTZWxlY3RlZChpdGVtKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5JdGVtVW5zZWxlY3RlZCwgKCkgPT4gdGhpcy5fcmVtb3ZlQnV0dG9ucygpKSxcclxuICAgICAgdGhpcy5zY3JlZW5TaXplU2VydmljZS5zY3JlZW5TaXplQ2hhbmdlZC5zdWJzY3JpYmUoKGluZm86IFNjcmVlblNpemVJbmZvKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG91bGRTaG93TGFiZWwgPSBpbmZvLmlzUGhvbmVTaXplO1xyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzTG9hZGVkLnN1YnNjcmliZSgobG9hZGVkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKGxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93U3dhcEJ1dHRvbiA9ICF0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5pbnN0YW50UmVwbGFjZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX2FkZE1vZGVsRGlhbG9nVG9vbGJhcigpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjb3B5U2NlbmVJbnN0YW5jZShzYXZlQXM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICgvKiF0aGlzLl9zZXR0aW5nc1NlcnZpY2UuaXNQcml2YXRlICYmICovc2F2ZUFzKSB7XHJcbiAgICAgIGNvbnN0IGZ1cm5pdHVyZSA9IHRoaXMuX2l0ZW1TZXJ2aWNlLmdldElPbmVGdXJuaXR1cmUoKTtcclxuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUNvcHlJbnN0YW5jZUZvckZ1cm5pdHVyZShmdXJuaXR1cmUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWRPYmplY3RzKHtmdXJuaXR1cmV9KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICghZnVybml0dXJlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbG9hZGluZ0Zyb21QcmVzZXQgPSB0cnVlO1xyXG4gICAgY29uc3QgaU9ORU9iamVjdHNUb0xvYWQgPSBmdXJuaXR1cmUuZmlsdGVyKG8gPT4gdGhpcy5faXNJT05FT2JqZWN0KG8pKTtcclxuICAgIGZ1cm5pdHVyZVxyXG4gICAgICAuZmlsdGVyKChvKSA9PiBpc0l0ZW1Hcm91cFR5cGUoby5pdGVtX3R5cGUpKVxyXG4gICAgICAuZm9yRWFjaChnID0+IHtcclxuICAgICAgICBsZXQgZ3JvdXBBZGRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1Hcm91cCA9IGlzV2FsbEl0ZW1Hcm91cFR5cGUoZy5pdGVtX3R5cGUpID8gbmV3IFdhbGxJdGVtR3JvdXAoKSA6IG5ldyBJdGVtR3JvdXAoKTtcclxuICAgICAgICBpdGVtR3JvdXAubG9ja2VkID0gZy5sb2NrZWQ7XHJcbiAgICAgICAgaXRlbUdyb3VwLnBvc2l0aW9uLnNldChnLnhwb3MsIGcueXBvcywgZy56cG9zKTtcclxuICAgICAgICBpdGVtR3JvdXAucm90YXRpb24uc2V0KDAsIGcucm90YXRpb24sIDApO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZy5jaGlsZHJlbjtcclxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLl9pc0lPTkVPYmplY3QoY2gpKSB7XHJcbiAgICAgICAgICAgIGlmICghZ3JvdXBBZGRlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLmFkZEl0ZW0oaXRlbUdyb3VwKTtcclxuICAgICAgICAgICAgICBncm91cEFkZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjaC5pdGVtR3JvdXAgPSBpdGVtR3JvdXA7XHJcbiAgICAgICAgICAgIGlPTkVPYmplY3RzVG9Mb2FkLnB1c2goY2gpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZElPbmVGdXJuaXR1cmVGcm9tUHJlc2V0KGlPTkVPYmplY3RzVG9Mb2FkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRPYmplY3RzKCk6IGFueSB7XHJcbiAgICAvLyByZXR1cm4ge2Z1cm5pdHVyZTogdGhpcy50aHJlZVNlcnZpY2UubW9kZWwuc2F2ZUZ1cm5pdHVyZSgpfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvYmplY3RTZWxlY3RlZChvYmplY3Q6IEl0ZW0gfCBJdGVtR3JvdXApIHtcclxuICAgIHRoaXMuX3JlbW92ZUN1c3RvbUJ1dHRvbnMoKTtcclxuICAgIHRoaXMuc2hvd0N1c3RvbWl6ZUJ1dHRvbnMgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdCA9IG9iamVjdDtcclxuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcclxuICAgICAgY29uc3QgY3VzdG9taXplQnV0dG9uOiBhbnkgPSBjaGlsZC5uYW1lICYmIGNoaWxkLm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdwXycpO1xyXG4gICAgICBpZiAoY3VzdG9taXplQnV0dG9uKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Ub0N1c3RvbWl6ZSA9IGNoaWxkLnBhcmVudDtcclxuICAgICAgICB0aGlzLmVkaXRDdXN0b21pemVCdXR0b24ucHVzaChuZXcgQ3VzdG9tQnV0dG9uKCcnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ3VzdG9taXplQ2xpY2soKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvblRvQ3VzdG9taXplKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5faGFuZGxlUmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlQ3VzdG9taXplQ2xpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXN0b21pemVyU2VydmljZS5zZWxlY3RlZE9iamVjdCA9IHRoaXMuc2VsZWN0aW9uVG9DdXN0b21pemU7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLnNlbGVjdGVkVGhyZWVkT2JqZWN0Q3VzdG9taXphdGlvblNpZGViYXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN3YXBFbGVtZW50KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkRWxlbWVudE9iamVjdCkge1xyXG4gICAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UucmVwbGFjZVNlbGVjdGlvbihPYmplY3RVdGlscy5HZXRTZWxlY3Rpb25Gcm9tU2VsZWN0ZWRPYmplY3QodGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0KSwgdGhpcy5hY3RpdmVNZXRhZGF0YSk7XHJcbiAgICAgIGlmICghdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMuaW5zdGFudFJlcGxhY2UpIHtcclxuICAgICAgICB0aGlzLl9yZXNldFNlbGVjdGVkRWxlbWVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlRWxlbWVudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZEVsZW1lbnRPYmplY3QpIHtcclxuICAgICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmRlbGV0ZVNlbGVjdGlvbihPYmplY3RVdGlscy5HZXRTZWxlY3Rpb25Gcm9tU2VsZWN0ZWRPYmplY3QodGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0KSwgdGhpcy5hY3RpdmVNZXRhZGF0YSk7XHJcbiAgICAgIHRoaXMuX3Jlc2V0U2VsZWN0ZWRFbGVtZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuY2VsRWxlbWVudFJlcGxhY2UocmVidWlsZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY2FuY2VsQW5zd2VyKHRoaXMuYWN0aXZlTWV0YWRhdGEsIGZhbHNlLCB0cnVlKTtcclxuICAgIHRoaXMuX3Jlc2V0U2VsZWN0ZWRFbGVtZW50KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BlbkFuaW1hdGlvblNpZGViYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLnNlbGVjdGVkVGhyZWVkT2JqZWN0QW5pbWF0aW9uU2lkZWJhcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlU2hvd0NoYW5nZVNlbGVjdG9yKHNob3c6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICghc2hvdykge1xyXG4gICAgICBpZiAodGhpcy5zaG93QW5zd2Vycykge1xyXG4gICAgICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jYW5jZWxBbnN3ZXIodGhpcy5hY3RpdmVNZXRhZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmNhbmNlbENvbmZpZ3VyaW5nQ3VycmVudEluc3RhbmNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TW9kZWxFcnJvckRpYWxvZygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RpYWxvZy5vcGVuKE1vZGVsRGlhbG9nQ29tcG9uZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFySXRlbXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pdGVtc0Zyb21TY3JhdGNoLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVTa3VTZXQoc2t1OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChza3UpIHtcclxuICAgICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICAgIHRoaXMuX2lPbmUuY29udHJvbGxlckluaXRpYWxpemVkLnN1YnNjcmliZShhc3luYyAoaW5pdGlhbGl6ZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgIGlmIChpbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlU3RhbmRhbG9uZUNvbmZpZ3VyYXRvcihza3UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMuX2FwcFNlcnZpY2UuZmxvb3JUZXh0dXJlc0xvYWRlZC5zdWJzY3JpYmUodGV4dHVyZXMgPT4gdGhpcy5faGFuZGxlRmxvb3JzTG9hZGVkKHRleHR1cmVzKSksXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGFyQnV0dG9uOiBTY2VuZU9wdGlvbkJ1dHRvbkludGVyZmFjZSA9IHtcclxuICAgICAgICBpZDogMixcclxuICAgICAgICBlbGVtZW50SWQ6ICdzdGFuZGFsb25lX2FyX3Nlc3Npb24nLFxyXG4gICAgICAgIHRvb2x0aXA6ICdTVEFSVF9BUl9TRVNTSU9OJyxcclxuICAgICAgICBvcmRlcjogMTAsXHJcbiAgICAgICAgaW1hZ2U6IHRoaXMuX2ljb25DYWNoZVNlcnZpY2UuZ2V0SWNvbkFzQmFzZTY0KEljb25FbnVtLkFyQ2lyY2xlKSxcclxuICAgICAgICB0b2dnbGU6IGZhbHNlLFxyXG4gICAgICAgIHNob3c6IGF3YWl0IHRoaXMuX2FyU2VydmljZS5hclN1cHBvcnRlZCgpICYmXHJcbiAgICAgICAgICB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5zaG93U3RhbmRhbG9uZUFSQnV0dG9uICYmXHJcbiAgICAgICAgICB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5hckVuYWJsZWQsXHJcbiAgICAgICAgY2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG9iamVjdCA9ICh0aGlzLl9pdGVtU2VydmljZS5nZXRDb25maWd1cmFibGVzKClbMF0gYXMgYW55KS8qLmNsb25lVmlzaWJsZSgpKi87XHJcbiAgICAgICAgICBpZiAob2JqZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5hck1vZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9zY2VuZVNlcnZpY2UuYWRkT2JqZWN0KG9iamVjdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLl9zY2VuZU9wdGlvbnNTZXJ2aWNlLmFkZFNjZW5lT3B0aW9uQnV0dG9uKGFyQnV0dG9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUZsb29yc0xvYWRlZCh0ZXh0dXJlczogVGV4dHVyZVtdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGV4dHVyZXMpIHtcclxuICAgICAgbGV0IGRlZmF1bHRGbG9vcjogVGV4dHVyZTtcclxuICAgICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnVzZVN0YW5kYWxvbmVGbG9vcnMpIHtcclxuICAgICAgICB0aGlzLl9zdGFuZGFsb25lRmxvb3JzID0gdGhpcy5fYXBwU2VydmljZS5nZXRGbG9vcnNTdGFuZGFsb25lKCk7XHJcbiAgICAgICAgZGVmYXVsdEZsb29yID0gdGhpcy5fc3RhbmRhbG9uZUZsb29ycy5maW5kKGYgPT4gZi5kZWZhdWx0U3RhbmRhbG9uZSk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGZsb29yR2VvbWV0cnk7XHJcbiAgICAgIGlmIChkZWZhdWx0Rmxvb3IgJiYgZGVmYXVsdEZsb29yLnNpbXBsZVBsYW5lKSB7XHJcbiAgICAgICAgZmxvb3JHZW9tZXRyeSA9IG5ldyBQbGFuZUdlb21ldHJ5KDYsIDYpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNvcm5lcnMgPSBbXHJcbiAgICAgICAgICB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLm5ld0Nvcm5lcigtMywgMyksXHJcbiAgICAgICAgICB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLm5ld0Nvcm5lcigtMywgLTMpLFxyXG4gICAgICAgICAgdGhpcy5fZmxvb3JwbGFuU2VydmljZS5uZXdDb3JuZXIoMywgLTMpLFxyXG4gICAgICAgICAgdGhpcy5fZmxvb3JwbGFuU2VydmljZS5uZXdDb3JuZXIoMywgMyksXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCBwb2ludHMgPSBjb3JuZXJzLm1hcChjb3JuZXIgPT4gbmV3IFZlY3RvcjIoY29ybmVyLngsIGNvcm5lci55KSk7XHJcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBuZXcgU2hhcGUocG9pbnRzKTtcclxuICAgICAgICBmbG9vckdlb21ldHJ5ID0gbmV3IFNoYXBlR2VvbWV0cnkoc2hhcGUpLmNlbnRlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IHRoaXMuX2Zsb29yU2VydmljZS5nZW5lcmF0ZUZsb29yUGxhbmUoJ3doaXRlJywgZGVmYXVsdEZsb29yLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmxvb3JHZW9tZXRyeSk7XHJcbiAgICAgIHRoaXMuX2Zsb29yU2VydmljZS5nZXRGbG9vclBsYW5lKCkudmlzaWJsZSA9IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnVzZVN0YW5kYWxvbmVGbG9vcnM7XHJcbiAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5zY2VuZS5iYWNrZ3JvdW5kID0gbmV3IENvbG9yKHBhcnNlSW50KHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5zdGFuZGFsb25lU2NlbmVCYWNrZ3JvdW5kQ29sb3IsIDApKTtcclxuICAgICAgdGhpcy5fc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAgICAgaWYgKHRoaXMuX3N0YW5kYWxvbmVGbG9vcnMgJiYgdGhpcy5fc3RhbmRhbG9uZUZsb29ycy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgdGhpcy5fdXBzZXJ0Rmxvb3JCdXR0b25zKGRlZmF1bHRGbG9vcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Vwc2VydEZsb29yQnV0dG9ucyhhY3RpdmVGbG9vcjogVGV4dHVyZSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmxvb3JCdXR0b25zOiBTY2VuZU9wdGlvbkJ1dHRvbkludGVyZmFjZVtdID0gW107XHJcbiAgICBsZXQgbmV3Rmxvb3JCdXR0b246IFNjZW5lT3B0aW9uQnV0dG9uSW50ZXJmYWNlO1xyXG4gICAgdGhpcy5fc3RhbmRhbG9uZUZsb29ycy5mb3JFYWNoKChmLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAoZiAhPT0gYWN0aXZlRmxvb3IpIHtcclxuICAgICAgICBuZXdGbG9vckJ1dHRvbiA9IHtcclxuICAgICAgICAgIGlkOiBpbmRleCxcclxuICAgICAgICAgIGVsZW1lbnRJZDogYHN0YW5kYWxvbmVfZmxvb3JfJHtmLm5hbWV9YCxcclxuICAgICAgICAgIHRvb2x0aXA6IGYubmFtZSxcclxuICAgICAgICAgIGNsYXNzOiAnY2lyY2xlJyxcclxuICAgICAgICAgIHNob3c6IGZhbHNlLFxyXG4gICAgICAgICAgb2JqZWN0OiBmLFxyXG4gICAgICAgICAgaW1hZ2U6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGggKyBmLnVybCxcclxuICAgICAgICAgIGNsaWNrOiAoZmxvb3IpID0+IHRoaXMuX2NoYW5nZVN0YW5kYWxvbmVGbG9vcihmbG9vcilcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZsb29yQnV0dG9ucy5wdXNoKG5ld0Zsb29yQnV0dG9uKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBhY3RpdmVGbG9vckJ1dHRvbjogU2NlbmVPcHRpb25CdXR0b25JbnRlcmZhY2UgPSB7XHJcbiAgICAgIGlkOiAxMCxcclxuICAgICAgZWxlbWVudElkOiAnc3RhbmRhbG9uZV9jaGFuZ2VfZmxvb3InLFxyXG4gICAgICB0b29sdGlwOiAnQ0hBTkdFX0ZMT09SJyxcclxuICAgICAgb3JkZXI6IDgsXHJcbiAgICAgIGNsYXNzOiAnY2lyY2xlJyxcclxuICAgICAgb2JqZWN0OiBhY3RpdmVGbG9vcixcclxuICAgICAgY2hpbGRyZW46IGZsb29yQnV0dG9ucyxcclxuICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgaW1hZ2U6IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGggKyBhY3RpdmVGbG9vci51cmxcclxuICAgIH07XHJcbiAgICB0aGlzLl9zY2VuZU9wdGlvbnNTZXJ2aWNlLnVwZGF0ZVNjZW5lT3B0aW9uQnV0dG9uKGFjdGl2ZUZsb29yQnV0dG9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2NoYW5nZVN0YW5kYWxvbmVGbG9vcihmbG9vcjogVGV4dHVyZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5fZmxvb3JTZXJ2aWNlLnNldEZsb29yVGV4dHVyZShudWxsLCBmbG9vcik7XHJcbiAgICB0aGlzLl91cHNlcnRGbG9vckJ1dHRvbnMoZmxvb3IpO1xyXG4gICAgdGhpcy5fc2NlbmVTZXJ2aWNlLnVwZGF0ZVBhdGhUcmFjZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZURvd25sb2FkQnV0dG9uKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZG93bmxvYWQzRE1vZGVsQnV0dG9uOiBTY2VuZU9wdGlvbkJ1dHRvbkludGVyZmFjZSA9IHtcclxuICAgICAgaWQ6IDEwMCxcclxuICAgICAgZWxlbWVudElkOiAnc3RhbmRhbG9uZV9kb3dubG9hZF9tb2RlbCcsXHJcbiAgICAgIHRvb2x0aXA6ICdET1dOTE9BRF9NT0RFTCcsXHJcbiAgICAgIG9yZGVyOiAyLFxyXG4gICAgICBjbGFzczogJ2NpcmNsZScsXHJcbiAgICAgIGxhYmVsOiAnY2xvdWRfZG93bmxvYWQnLFxyXG4gICAgICBzaG93OiB0cnVlLFxyXG4gICAgICBjbGljazogKCkgPT4gdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmRvd25sb2FkQ3VycmVudEN1c3RvbUZsb29yZ3JvdXAoKVxyXG4gICAgfTtcclxuICAgIHRoaXMuX3NjZW5lT3B0aW9uc1NlcnZpY2UudXBkYXRlU2NlbmVPcHRpb25CdXR0b24oZG93bmxvYWQzRE1vZGVsQnV0dG9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUNhbWVyYVNldHRpbmdzQnV0dG9uKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2FtZXJhU2V0dGluZ3NCdXR0b246IFNjZW5lT3B0aW9uQnV0dG9uSW50ZXJmYWNlID0ge1xyXG4gICAgICBpZDogMTEwLFxyXG4gICAgICBlbGVtZW50SWQ6ICdzdGFuZGFsb25lX2NhbWVyYV9zZXR0aW5ncycsXHJcbiAgICAgIHRvb2x0aXA6ICdDQU1FUkFfU0VUVElOR1MnLFxyXG4gICAgICBvcmRlcjogMSxcclxuICAgICAgY2xhc3M6ICdjaXJjbGUnLFxyXG4gICAgICBsYWJlbDogJ2NhbWVyYV9zZXR0aW5ncycsXHJcbiAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLl9vcGVuQ2FtZXJhU2V0dGluZ3NEaWFsb2coKVxyXG4gICAgfTtcclxuICAgIHRoaXMuX3NjZW5lT3B0aW9uc1NlcnZpY2UudXBkYXRlU2NlbmVPcHRpb25CdXR0b24oY2FtZXJhU2V0dGluZ3NCdXR0b24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb3BlbkNhbWVyYVNldHRpbmdzRGlhbG9nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oQ2FtZXJhU2V0dGluZ3NEaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgd2lkdGg6ICc2MDBweCdcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTWVhc3VyZW1lbnRzQnV0dG9uKCk6IHZvaWQge1xyXG4gICAgY29uc3QgYnV0dG9uOiBTY2VuZU9wdGlvbkJ1dHRvbkludGVyZmFjZSA9IHtcclxuICAgICAgaWQ6IDEsXHJcbiAgICAgIGVsZW1lbnRJZDogJ3N0YW5kYWxvbmVfc2hvd19tZWFzdXJlbWVudHMnLFxyXG4gICAgICB0b29sdGlwOiAnU0hPV19NRUFTVVJFTUVOVFMnLFxyXG4gICAgICBvcmRlcjogMTEsXHJcbiAgICAgIGltYWdlOiB0aGlzLl9pY29uQ2FjaGVTZXJ2aWNlLmdldEljb25Bc0Jhc2U2NChJY29uRW51bS5NZWFzdXJlbWVudHMpLFxyXG4gICAgICB0b2dnbGU6IHRydWUsXHJcbiAgICAgIHRvb2x0aXBBY3RpdmU6ICdISURFX01FQVNVUkVNRU5UUycsXHJcbiAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgIGNsaWNrOiAoKSA9PiB7IHRoaXMuX2RpbWVuc2lvbnNTZXJ2aWNlLmVuYWJsZWQgPSAhdGhpcy5fZGltZW5zaW9uc1NlcnZpY2UuZW5hYmxlZDsgfVxyXG4gICAgfTtcclxuICAgIHRoaXMuX3NjZW5lT3B0aW9uc1NlcnZpY2UuYWRkU2NlbmVPcHRpb25CdXR0b24oYnV0dG9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUluZm9DbGljayhpbmZvOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1lc3NhZ2VDb25maWc6IERpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgdHlwZTogRGlhbG9nVHlwZS5JbmZvLFxyXG4gICAgICBtZXNzYWdlczogW25ldyBFcnJvck1lc3NhZ2UoaW5mbyldXHJcbiAgICB9O1xyXG4gICAgdGhpcy5fZGlhbG9nU2VydmljZS5zaG93RGlhbG9nKHtkYXRhOiBtZXNzYWdlQ29uZmlnfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9wcmVwYXJlU3RhbmRhbG9uZUNvbmZpZ3VyYXRvcihza3UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLnBvc2l0aW9uLnNldCgwLCAxLCA0KTtcclxuICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLmxvb2tBdChuZXcgVmVjdG9yMygpKTtcclxuICAgIGF3YWl0IE9iamVjdFV0aWxzLkxvYWRIRFJJKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5hc3NldFBhdGggKyAnL2Fzc2V0cy9oZHJpL3N0ZF9lbnZfdjJfQi5oZHInLCB0aGlzLl9zY2VuZVNlcnZpY2Uuc2NlbmUpO1xyXG4gICAgdGhpcy5fc2NlbmVTZXJ2aWNlLnNjZW5lLmNoaWxkcmVuLmZvckVhY2goYyA9PiB7XHJcbiAgICAgIGlmIChjIGluc3RhbmNlb2YgTGlnaHQpIHtcclxuICAgICAgICB0aGlzLl9zY2VuZVNlcnZpY2Uuc2NlbmUucmVtb3ZlKGMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5zdGFuZEFsb25lID0gdHJ1ZTtcclxuICAgIHRoaXMuc2hvd0xpdGVTZWxlY3RvciA9IHRydWU7IC8vIGFsd2F5cyBzaG93IHRoZSBzZWxlY3Rpb25zIHdoZW4gc3RhbmRhbG9uZVxyXG4gICAgdGhpcy5zaG93U2VsZWN0aW9ucyA9IHRydWU7IC8vIGFsd2F5cyBzaG93IHRoZSBzZWxlY3Rpb25zIHdoZW4gc3RhbmRhbG9uZVxyXG4gICAgdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2Uuc2hvdWxkTG9hZFNlbGVjdGlvbnMgPSB0cnVlO1xyXG4gICAgdGhpcy5fc2t1QWxyZWFkeVNldCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMuc2hvd0Rvd25sb2FkQnV0dG9uKSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZURvd25sb2FkQnV0dG9uKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMuc2hvd01lYXN1cmVtZW50c0J1dHRvbikge1xyXG4gICAgICB0aGlzLl9jcmVhdGVNZWFzdXJlbWVudHNCdXR0b24oKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5kZXZlbG9wbWVudCkge1xyXG4gICAgICB0aGlzLl9jcmVhdGVDYW1lcmFTZXR0aW5nc0J1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdDogQ3VzdG9tRmxvb3JHcm91cFJlc3VsdCA9IGF3YWl0IHRoaXMuX2xvYWRJT25lRnVybml0dXJlRnJvbVNrdShuZXcgVmVjdG9yMygwLCAwLCAwKSwgc2t1LCB1bmRlZmluZWQsIHRydWUpO1xyXG4gICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuZnVybml0dXJlKSB7XHJcbiAgICAgIHRoaXMuX2hhbmRsZUZpcnN0QnVpbGRTdGFuZGFsb25lKHJlc3VsdC5mdXJuaXR1cmUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlID09PSBSZXN1bHRUeXBlLk5lZWRzVXNlcklucHV0KSB7XHJcbiAgICAgICAgdGhpcy5fY2FsbEJhY2tGbldoZW5CdWlsZEZpbmlzaGVkID0gdGhpcy5faGFuZGxlRmlyc3RCdWlsZFN0YW5kYWxvbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUZpcnN0QnVpbGRTdGFuZGFsb25lKGl0ZW06IEl0ZW0pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UubW92ZUNhbWVyYVRvRml0T2JqZWN0KGl0ZW0pO1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLmNhbWVyYVBvc2l0aW9uRml4ZWQpIHtcclxuICAgICAgdGhpcy5fcm90YXRpb25TZXJ2aWNlLmVuYWJsZVJvdGF0aW9uRm9yKGl0ZW0pO1xyXG4gICAgfSBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMuY2FtZXJhUG9zaXRpb25GaXhlZEFuZFNjcm9sbGJhcikge1xyXG4gICAgICB0aGlzLl9jYW1lcmFTZXJ2aWNlLmRpc2FibGVSb3RhdGUoKTtcclxuICAgICAgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmFab29tT3V0KCk7XHJcbiAgICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuZGlzYWJsZVpvb20oKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9jYWxsQmFja0ZuV2hlbkJ1aWxkRmluaXNoZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmNhbWVyYUNvbmZpZykge1xyXG4gICAgICBhd2FpdCB0aGlzLl9keW5hbWljQ2FtZXJhU2VydmljZS5sb2FkQ3VzdG9tQ2FtZXJhU2V0dGluZ3MoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5lbmFibGUzREluUGhvdG8pIHtcclxuICAgICAgdGhpcy5fdGhyZWVkSW5QaG90b0luaXRpYWxpemVyU2VydmljZS5pbml0KG51bGwsIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLCB0aGlzLl9zY2VuZVNlcnZpY2Uuc2NlbmUsIHRoaXMuX3NjZW5lU2VydmljZS5yZW5kZXJlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2F2ZSBjYW1lcmEgc2V0dGluZ3MgZm9yIHJlbmRlclxyXG4gICAgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcbiAgICB0aGlzLl9uZXdSZW5kZXJTZXJ2aWNlLnN0YW5kQWxvbmVDYW1lcmFNYXRyaXggPSBBcnJheS5mcm9tKHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5lbGVtZW50cyk7XHJcbiAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2Uuc3RhbmRBbG9uZUZpcnN0QnVpbGRSZWFkeSA9IHRydWU7XHJcbiAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2UucmVhZHlUb1JlbmRlci5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlVW5kZWZpbmVkRXJyb3JPY2N1cmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93U2VsZWN0aW9ucyA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93QW5zd2VycyA9IGZhbHNlO1xyXG4gICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmNhbmNlbENvbmZpZ3VyaW5nQ3VycmVudEluc3RhbmNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW1vdmVCdXR0b25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0QWRkQnV0dG9ucy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5lZGl0Q3VzdG9taXplQnV0dG9uLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLnJlc2l6ZUJ1dHRvbnMubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Jlc2V0U2VsZWN0ZWRFbGVtZW50KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fcmVzZXRFbGVtZW50UG9zaXRpb24oKTtcclxuICAgIHRoaXMuX3JlbW92ZUFsbEJ1dHRvbnMoKTtcclxuICAgIHRoaXMuc2hvd0VsZW1lbnRUb29sYmFyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVSZW5kZXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0IHx8IHRoaXMuc2VsZWN0aW9uVG9DdXN0b21pemUpIHtcclxuICAgICAgdGhpcy5fcmVzZXRFbGVtZW50UG9zaXRpb24oKTtcclxuICAgICAgaWYgKHRoaXMuZWRpdEFkZEJ1dHRvbnMubGVuZ3RoIHx8IHRoaXMuZWRpdEN1c3RvbWl6ZUJ1dHRvbi5sZW5ndGggPiAwIHx8IHRoaXMucmVzaXplQnV0dG9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3NpdGlvbkJ1dHRvbnMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRFbGVtZW50VG9nZ2xlKGVsZW1lbnQ6IE1lc2gpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gZWxlbWVudDtcclxuICAgIGNvbnN0IG9iajogQ3VzdG9tT2JqZWN0M0QgPSBlbGVtZW50ID8gZWxlbWVudC5wYXJlbnQgYXMgQ3VzdG9tT2JqZWN0M0QgOiB1bmRlZmluZWQ7XHJcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0ICE9PSBvYmopIHtcclxuICAgICAgdGhpcy5zaG93RWxlbWVudFRvb2xiYXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0ID0gb2JqO1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcclxuICAgICAgICB0aGlzLl9wcmVwYXJlRWxlbWVudE1lbnUoKTtcclxuICAgICAgICB0aGlzLl9wcmVwYXJlQWRkQnV0dG9ucygpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5oYW5kbGVQYXJhbWV0cmljKSB7XHJcbiAgICAgICAgICB0aGlzLl9wcmVwYXJlT3RoZXJCdXR0b25zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNob3VsZEJlSGlkZGVuOiBib29sZWFuID0gb2JqLnVzZXJEYXRhICYmIG9iai51c2VyRGF0YS5zZWxlY3Rpb24gJiYgb2JqLnVzZXJEYXRhLnNlbGVjdGlvbi5xdWVzdGlvbi5pbmRleE9mKCdbaGlkZGVuXScpID4gLTE7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLmluc3RhbnRSZXBsYWNlKSB7XHJcbiAgICAgICAgICBpZiAoc2hvdWxkQmVIaWRkZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5jYW5jZWxFbGVtZW50UmVwbGFjZSgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zd2FwRWxlbWVudCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2hvd0VsZW1lbnRUb29sYmFyID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICAgICAgfSwgMjAwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9yZXNldFNlbGVjdGVkRWxlbWVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVCdWlsZEZpbmlzaGVkKHJlc3VsdDogQ3VzdG9tRmxvb3JHcm91cFJlc3VsdCk6IHZvaWQge1xyXG4gICAgdGhpcy5faXRlbVNlcnZpY2UuZ2xhc3NNYXRlcmlhbENoZWNrKHJlc3VsdC5mdXJuaXR1cmUpO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50ICYmIHJlc3VsdC5mdXJuaXR1cmUpIHtcclxuICAgICAgY29uc3QgaXRlbTogSXRlbSA9IHJlc3VsdC5mdXJuaXR1cmU7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbU1lc2gpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZEVsZW1lbnRPYmplY3QgPSA8Q3VzdG9tT2JqZWN0M0Q+dGhpcy5zZWxlY3RlZEVsZW1lbnQucGFyZW50O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3ByZXBhcmVBZGRCdXR0b25zKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fY2FsbEJhY2tGbldoZW5CdWlsZEZpbmlzaGVkICYmIHRoaXMuc3RhbmRBbG9uZSkge1xyXG4gICAgICB0aGlzLl9jYWxsQmFja0ZuV2hlbkJ1aWxkRmluaXNoZWQocmVzdWx0LmZ1cm5pdHVyZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXNldEVsZW1lbnRQb3NpdGlvbigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCAmJiAhdGhpcy5zdGFuZEFsb25lKSB7XHJcbiAgICAgIGNvbnN0IHlQb3M6IG51bWJlciA9ICgodGhpcy5zZWxlY3RlZEVsZW1lbnQuZ2VvbWV0cnkuYm91bmRpbmdCb3gubWF4LnkgLSB0aGlzLnNlbGVjdGVkRWxlbWVudC5nZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueSkgLyAyKTtcclxuICAgICAgY29uc3QgcG9zOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LmdldFdvcmxkUG9zaXRpb24ocG9zKTtcclxuICAgICAgcG9zLnkgKz0geVBvcztcclxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRQb3NpdGlvbiA9IHRoaXMuX3NjZW5lU2VydmljZS5wb3NpdGlvbkluU2NlbmVUb1NjcmVlbihwb3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRQb3NpdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlbW92ZUFsbEJ1dHRvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZW1vdmVBZGRCdXR0b25zKCk7XHJcbiAgICB0aGlzLl9yZW1vdmVSZXNpemVCdXR0b25zKCk7XHJcbiAgICB0aGlzLl9yZW1vdmVDdXN0b21CdXR0b25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW1vdmVDdXN0b21CdXR0b25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0Q3VzdG9taXplQnV0dG9uLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW1vdmVBZGRCdXR0b25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0QWRkQnV0dG9ucy5sZW5ndGggPSAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlUmVzaXplQnV0dG9ucygpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzaXplQnV0dG9ucy5sZW5ndGggPSAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlRWRpdEl0ZW1zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0RWxlbWVudE1lbnUubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZXBhcmVFbGVtZW50TWVudSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlbW92ZUVkaXRJdGVtcygpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBPYmplY3RVdGlscy5HZXRTZWxlY3Rpb25Gcm9tU2VsZWN0ZWRPYmplY3QodGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0KTtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5zaG93RWRpdFBlbmNpbENvbmZpZ3VyYXRvciAmJiBzZWxlY3Rpb24pIHtcclxuICAgICAgbGV0IG9wdGlvbnM6IFNlbGVjdGlvbltdID0gdGhpcy5fZ2V0T3B0aW9uc0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMuZmlsdGVyKG8gPT4ge1xyXG4gICAgICAgIHJldHVybiBvLm5vZGVUeXBlID09PSAnT1BUJyAmJiB0aGlzLl9pT25lLmlzU2VsZWN0aW9uUHVibGlzaGVkKG8pO1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBvcHRpb25zLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIHRoaXMuZWRpdEVsZW1lbnRNZW51LnB1c2gobmV3IEN1c3RvbUJ1dHRvbihvcHRpb25zW2ldLnF1ZXN0aW9uLCAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2Uuc2VsZWN0U2VsZWN0aW9uKG9wdGlvbnNbaV0sIHRoaXMuYWN0aXZlTWV0YWRhdGEpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5pbnN0YW50RWRpdE1lbnUpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzZXRTZWxlY3RlZEVsZW1lbnQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2FmdGVyTG9hZEZyb21QcmVzZXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9sb2FkaW5nRnJvbVByZXNldCA9IGZhbHNlO1xyXG4gICAgdGhpcy5fcHJvZ3Jlc3NTZXJ2aWNlLmZpbmlzaERvd25sb2FkcygpO1xyXG4gICAgaWYgKHRoaXMuX2l0ZW1zRnJvbVNjcmF0Y2gubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2l0ZW1zRnJvbVNjcmF0Y2gubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl9oYW5kbGVMb2FkQW5kQnVpbGRGdXJuaXR1cmUoXHJcbiAgICAgICAgICB0aGlzLl9pdGVtc0Zyb21TY3JhdGNoW2ldLm1ldGFEYXRhLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5faXRlbXNGcm9tU2NyYXRjaC5sZW5ndGggPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2l0ZW1zTmVlZFVzZXJJbnB1dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faXRlbXNOZWVkVXNlcklucHV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0ID0gYXdhaXQgdGhpcy5faGFuZGxlTG9hZEFuZEJ1aWxkRnVybml0dXJlKFxyXG4gICAgICAgICAgdGhpcy5faXRlbXNOZWVkVXNlcklucHV0W2ldLm1ldGFEYXRhLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYWRkVG9MaXN0KHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLm9iamVjdExpc3QsIHJlc3VsdCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5faXRlbXNOZWVkVXNlcklucHV0Lmxlbmd0aCA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLm9iamVjdExpc3RGaXhlZC5sZW5ndGggPiAwIHx8XHJcbiAgICAgIHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLm9ic29sZXRlT2JqZWN0Q2FjaGUubGVuZ3RoID4gMCB8fFxyXG4gICAgICB0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5ub3RGaXhlZE9iamVjdENhY2hlLmxlbmd0aCA+IDAgfHxcclxuICAgICAgdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2Uubm90TG9hZGVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZXRNb2RlbEVycm9yRGlhbG9nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0lPTkVPYmplY3Qobyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhby5pdGVtX3NjaGVtYSB8fCBvLmlvbmU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlQWRkQnV0dG9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gT2JqZWN0VXRpbHMuR2V0U2VsZWN0aW9uRnJvbVNlbGVjdGVkT2JqZWN0KHRoaXMuX3NlbGVjdGVkRWxlbWVudE9iamVjdCk7XHJcbiAgICB0aGlzLl9yZW1vdmVBZGRCdXR0b25zKCk7XHJcbiAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgIC8vIGlmIChkZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZmxhdF9yJyB8fFxyXG4gICAgICAvLyAgIGRlY29Ob2RlLmdhbWVPYmplY3ROYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdmbGF0X2wnIHx8XHJcbiAgICAgIC8vICAgZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZsYXRfZCcgfHxcclxuICAgICAgLy8gICBkZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZmxhdF91JyB8fFxyXG4gICAgICAvLyAgIGRlY29Ob2RlLmdhbWVPYmplY3ROYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd2ZXJ0X3InIHx8XHJcbiAgICAgIC8vICAgZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3ZlcnRfbCcgfHxcclxuICAgICAgLy8gICBkZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS50b0xvd2VyQ2FzZSgpID09PSAndmVydF9kJyB8fFxyXG4gICAgICAvLyAgIGRlY29Ob2RlLmdhbWVPYmplY3ROYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd2ZXJ0X3UnKSB7XHJcbiAgICAgIC8vICAgaWYgKGRlY29Ob2RlLmNvbm5lY3RvcnMpIHtcclxuICAgICAgLy8gICAgIGRlY29Ob2RlLmNvbm5lY3RvcnMuZm9yRWFjaChjID0+IGMubGlua2VkUmVwZWF0YWJsZXMgPSAnVCcpO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICBjb25zdCBsZW46IG51bWJlciA9IHNlbGVjdGlvbi5kZWNvTm9kZSA/IHNlbGVjdGlvbi5kZWNvTm9kZS5jb25uZWN0b3JzLmxlbmd0aCA6IDA7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBsZXQgY29uT2JqZWN0OiBhbnkgPSB0aGlzLl9zZWxlY3RlZEVsZW1lbnRPYmplY3QuZ2V0T2JqZWN0QnlOYW1lKHNlbGVjdGlvbi5kZWNvTm9kZS5jb25uZWN0b3JzW2ldLmNvbm5lY3Rvcik7XHJcbiAgICAgICAgaWYgKCFjb25PYmplY3QgJiYgdGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0LnBhcmVudCkge1xyXG4gICAgICAgICAgY29uT2JqZWN0ID0gdGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0LnBhcmVudC5nZXRPYmplY3RCeU5hbWUoc2VsZWN0aW9uLmRlY29Ob2RlLmNvbm5lY3RvcnNbaV0uY29ubmVjdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbk9iamVjdCAmJiB0aGlzLl9jYW5TaG93QWRkQnV0dG9uKHNlbGVjdGlvbi5kZWNvTm9kZS5jb25uZWN0b3JzW2ldLCBjb25PYmplY3QpKSB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRBZGRCdXR0b25zLnB1c2gobmV3IEN1c3RvbUJ1dHRvbignJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUFkZEJ1dHRvbkNsaWNrKHNlbGVjdGlvbiwgc2VsZWN0aW9uLmRlY29Ob2RlLmNvbm5lY3RvcnNbaV0sIHRoaXMuX3NlbGVjdGVkRWxlbWVudE9iamVjdCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbk9iamVjdCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5zY2VuZS50cmF2ZXJzZSgoY2hpbGQpID0+IHtcclxuICAgICAgICBpZiAoY2hpbGQubmFtZSkge1xyXG4gICAgICAgICAgY29uc3QgY3VzdG9taXplQnV0dG9uOiBhbnkgPSBjaGlsZC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgncF8nKTtcclxuICAgICAgICAgIC8vIGNvbnN0IGN1c3RvbWl6ZU9wdGlvbjogYW55ID0gdGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0LmdldE9iamVjdEJ5TmFtZSgpXHJcbiAgICAgICAgICBpZiAoY3VzdG9taXplQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uVG9DdXN0b21pemUgPSBjaGlsZC5wYXJlbnQ7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdEN1c3RvbWl6ZUJ1dHRvbi5wdXNoKG5ldyBDdXN0b21CdXR0b24oJycsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ3VzdG9taXplQ2xpY2soKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRWxlbWVudE9iamVjdCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRPcHBvc2l0ZUNvbm5lY3RvclBhcnRzKGNvbm5lY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNvbm5lY3RvclBhcnRzQXJyOiBzdHJpbmdbXSA9IGNvbm5lY3Rvci5zcGxpdCgnXycpO1xyXG4gICAgY29ubmVjdG9yUGFydHNBcnIucG9wKCk7IC8vIHJlbW92ZSBudW1iZXJcclxuICAgIGNvbnN0IGNvbm5lY3RvclR5cGU6IHN0cmluZyA9IGNvbm5lY3RvclBhcnRzQXJyW2Nvbm5lY3RvclBhcnRzQXJyLmxlbmd0aCAtIDFdO1xyXG4gICAgY29ubmVjdG9yUGFydHNBcnJbY29ubmVjdG9yUGFydHNBcnIubGVuZ3RoIC0gMV0gPSBjb25uZWN0b3JUeXBlLnRvTG93ZXJDYXNlKCkgPT09ICdmJyA/ICdNJyA6ICdGJztcclxuICAgIHJldHVybiBjb25uZWN0b3JQYXJ0c0Fyci5qb2luKCdfJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlT3RoZXJCdXR0b25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVtb3ZlUmVzaXplQnV0dG9ucygpO1xyXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkRWxlbWVudE9iamVjdCkge1xyXG4gICAgICBjb25zdCBwYXJlbnQ6IEl0ZW0gPSBPYmplY3RVdGlscy5HZXRQYXJlbnRJdGVtKHRoaXMuX3NlbGVjdGVkRWxlbWVudE9iamVjdCk7XHJcbiAgICAgIGlmIChwYXJlbnQpIHsgLy8gaGlkZSBhbGwgY29ubmVjdG9yc1xyXG4gICAgICAgIHBhcmVudC50cmF2ZXJzZShvID0+IHtcclxuICAgICAgICAgIGlmIChvLm5hbWUgJiYgby5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnY18nKSkge1xyXG4gICAgICAgICAgICBvLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBvdGhlckNvbm5lY3RvcnM6IE1lc2hbXSA9IDxNZXNoW10+dGhpcy5fc2VsZWN0ZWRFbGVtZW50T2JqZWN0LmNoaWxkcmVuLmZpbHRlcihcclxuICAgICAgICBjID0+IGMgaW5zdGFuY2VvZiBNZXNoICYmIChjLm5hbWUgJiYgKGMubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2Nfc2NhXycpIHx8IGMubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2NfcmVwXycpKSkpO1xyXG4gICAgICBvdGhlckNvbm5lY3RvcnMuZm9yRWFjaChvID0+IHtcclxuICAgICAgICAvLyBvLnZpc2libGUgPSB0cnVlXHJcbiAgICAgICAgdGhpcy5yZXNpemVCdXR0b25zLnB1c2gobmV3IEN1c3RvbUJ1dHRvbignJywgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5faGFuZGxlUmVzaXplQnV0dG9uQ2xpY2soby5uYW1lLCB0aGlzLl9zZWxlY3RlZEVsZW1lbnRPYmplY3QpO1xyXG4gICAgICAgIH0sIG8pKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVBZGRCdXR0b25DbGljayhzZWxlY3Rpb246IFNlbGVjdGlvbiwgY29ubmVjdG9yOiBhbnksIHBhcmVudDogT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIGxldCBhZnRlcjogYm9vbGVhbjtcclxuICAgIGlmIChjb25uZWN0b3IuYWRkQWRqdXN0ID09PSAyKSB7XHJcbiAgICAgIGFmdGVyID0gY29ubmVjdG9yLmNvbm5lY3Rvci5pbmRleE9mKCdfTV8nKSA+IC0xO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmJhc2VFbGVtZW50Tm9kZUlkID0gcGFyZW50LnVzZXJEYXRhICYmIHBhcmVudC51c2VyRGF0YS5zZWxlY3Rpb24gPyBwYXJlbnQudXNlckRhdGEuc2VsZWN0aW9uLm5vZGVJZCA6IDA7XHJcbiAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuYWN0aXZlQ29ubmVjdG9yID0gY29ubmVjdG9yO1xyXG4gICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLnNlbGVjdFNlbGVjdGlvbihcclxuICAgICAgc2VsZWN0aW9uLCB0aGlzLmFjdGl2ZU1ldGFkYXRhLCBjb25uZWN0b3IubGlua2VkUmVwZWF0YWJsZXMgIT09ICdUJywgYWZ0ZXIsIGNvbm5lY3Rvci5jb25uZWN0b3IpO1xyXG4gICAgdGhpcy5fcmVzZXRTZWxlY3RlZEVsZW1lbnQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZVJlc2l6ZUJ1dHRvbkNsaWNrKGNvbm5lY3RvcjogYW55LCBwYXJlbnQ6IE9iamVjdDNEKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXNpemVTZXJ2aWNlLnJlc2l6ZUVsZW1lbnQoY29ubmVjdG9yLCBwYXJlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuU2hvd0FkZEJ1dHRvbihjb25uZWN0b3I6IGFueSwgY29uT2JqZWN0OiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoIWNvbk9iamVjdC5jb25uZWN0ZWQgfHwgY29ubmVjdG9yLmxpbmtlZFJlcGVhdGFibGVzID09PSAnVCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVwb3NpdGlvbkJ1dHRvbnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuZWRpdEFkZEJ1dHRvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIHRoaXMuX3JlcG9zaXRpb25CdXR0b24odGhpcy5lZGl0QWRkQnV0dG9uc1tpXSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsZW5yOiBudW1iZXIgPSB0aGlzLnJlc2l6ZUJ1dHRvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgcjogbnVtYmVyID0gMDsgciA8IGxlbnI7IHIrKykge1xyXG4gICAgICB0aGlzLl9yZXBvc2l0aW9uQnV0dG9uKHRoaXMucmVzaXplQnV0dG9uc1tyXSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsZW5jOiBudW1iZXIgPSB0aGlzLmVkaXRDdXN0b21pemVCdXR0b24ubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgYzogbnVtYmVyID0gMDsgYyA8IGxlbmM7IGMrKykge1xyXG4gICAgICB0aGlzLl9yZXBvc2l0aW9uQnV0dG9uKHRoaXMuZWRpdEN1c3RvbWl6ZUJ1dHRvbltjXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXBvc2l0aW9uQnV0dG9uKGJ1dHRvbjogQ3VzdG9tQnV0dG9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBwb3M6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAwLCAwKTtcclxuICAgIGJ1dHRvbi5kYXRhLmdldFdvcmxkUG9zaXRpb24ocG9zKTtcclxuICAgIGNvbnN0IHNjcmVlblBvczogVmVjdG9yMiA9IHRoaXMuX3NjZW5lU2VydmljZS5wb3NpdGlvbkluU2NlbmVUb1NjcmVlbihwb3MpO1xyXG4gICAgYnV0dG9uLnhQb3MgPSBzY3JlZW5Qb3MueDtcclxuICAgIGJ1dHRvbi55UG9zID0gc2NyZWVuUG9zLnk7XHJcbiAgICBjb25zdCBkaXN0YW5jZVRvQ2FtOiBudW1iZXIgPSB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYS5wb3NpdGlvbi5kaXN0YW5jZVRvKHBvcyk7XHJcbiAgICBidXR0b24uc2l6ZSA9ICg0IC8gZGlzdGFuY2VUb0NhbSkgKiAzMDtcclxuICAgIGJ1dHRvbi5vcGFjaXR5ID0gTWF0aC5tYXgoMC4yNSwgMSAtIChNYXRoLm1heCg3LjAsIChNYXRoLnJvdW5kKGRpc3RhbmNlVG9DYW0gKiAxMCkgLyAxMCkpIC0gNykpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0T3B0aW9uc0Zyb21TZWxlY3Rpb24oYmFzZVNlbGVjdGlvbjogU2VsZWN0aW9uKTogU2VsZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5nZXRPcHRpb25zRnJvbVNlbGVjdGlvbihiYXNlU2VsZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUFuc3dlckNvdW50UmVjZWl2ZWQoYW5zd2VyQ291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93QW5zd2VycyA9IGFuc3dlckNvdW50ID4gMDtcclxuICAgIGlmICh0aGlzLnNob3dBbnN3ZXJzKSB7XHJcbiAgICAgIHRoaXMuc2hvd0xpdGVTZWxlY3RvciA9ICF0aGlzLl9sb2FkaW5nRnJvbVByZXNldDtcclxuICAgIH0vKiBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxTdGFydHVwKSB7XHJcbiAgICAgICAgLy8gdGhpcy5faU9uZS5sb2FkU2VsZWN0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuX2luaXRpYWxTdGFydHVwID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0qL1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlTG9hZElPbmVGdXJuaXR1cmVJbnRvU2NlbmVCeVNLVShza3U6IHN0cmluZywgc2V0dGluZ3M6IEV4dGVybmFsU2V0dGluZ3NJbnRlcmZhY2UsIHBvc2l0aW9uOiB7IHg6IG51bWJlciwgeTogbnVtYmVyLCB6PzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHRvYXN0ID0gbmV3IFRvYXN0KCk7XHJcbiAgICB0b2FzdC5tZXNzYWdlID0gJ01PREVMX0xPQURJTkcnO1xyXG4gICAgdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3dUb2FzdCh0b2FzdCk7XHJcbiAgICBhd2FpdCB0aGlzLl9jb25uZWN0b3JBZGFwdGVyU2VydmljZS5pbml0Q29ubmVjdG9yKFxyXG4gICAgICAgIHNldHRpbmdzID8gc2V0dGluZ3Muc2V0dGluZ3MgOiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MsXHJcbiAgICAgICAgc2V0dGluZ3MgPyBzZXR0aW5ncy5uYW1lIDogdW5kZWZpbmVkLFxyXG4gICAgICBmYWxzZSxcclxuICAgICAgc2V0dGluZ3MgPyBzZXR0aW5ncy5leHRlcm5hbFNvdXJjZUlkIDogdW5kZWZpbmVkKTtcclxuICAgIGNvbnN0IGFydGljbGU6IEFydGljbGUgPSBhd2FpdCB0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5sb2FkQXJ0aWNsZShza3UpO1xyXG4gICAgY29uc3QgZHJhZ2dlZERhdGE6IERyYWdnZWREYXRhID0ge1xyXG4gICAgICBuYW1lOiBza3UsXHJcbiAgICAgIGNvbnN0cnVjdEZuOiBhc3luYyAocG9zKSA9PiB0aGlzLl9sb2FkSU9uZUZ1cm5pdHVyZUZyb21Ta3UocG9zLCBza3UsIHNldHRpbmdzKSxcclxuICAgICAgdHlwZTogaXRlbVR5cGVGcm9tUGxhY2VtZW50KGFydGljbGUucGxhY2VtZW50KSxcclxuICAgICAgaU9uZTogdHJ1ZVxyXG4gICAgfTtcclxuICAgIHRoaXMuX21lc3NhZ2VCdXMuZW1pdChNZXNzYWdlVHlwZS5TZXREcmFnLCBkcmFnZ2VkRGF0YSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlQnVzLmVtaXQoTWVzc2FnZVR5cGUuU3RhcnREcmFnLCBwb3NpdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVDb3B5SU9uZUZ1cm5pdHVyZUludG9TY2VuZUJ5U0tVKG9yaWdpbmFsOiBJdGVtKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB0b2FzdCA9IG5ldyBUb2FzdCgpO1xyXG4gICAgdG9hc3QubWVzc2FnZSA9ICdNT0RFTF9MT0FESU5HJztcclxuICAgIHRoaXMuX3RvYXN0U2VydmljZS5zaG93VG9hc3QodG9hc3QpO1xyXG4gICAgb3JpZ2luYWwubWV0YWRhdGEuY29udmVyc2lvbkdUTVNlbmQgPSBmYWxzZTtcclxuICAgIGNvbnN0IGRyYWdnZWREYXRhID0ge1xyXG4gICAgICBuYW1lOiBvcmlnaW5hbC5tZXRhZGF0YS5pdGVtSWRlbnRpZmllcixcclxuICAgICAgY29uc3RydWN0Rm46IChwb3MpID0+IHRoaXMuX2xvYWRJT25lRnVybml0dXJlRnJvbU9yaWdpbmFsKG9yaWdpbmFsLm1ldGFkYXRhLCBwb3MsIG9yaWdpbmFsLnJvdGF0aW9uKSxcclxuICAgICAgdHlwZTogb3JpZ2luYWwubWV0YWRhdGEuaXRlbVR5cGUsXHJcbiAgICAgIGlPbmU6IHRydWVcclxuICAgIH07XHJcbiAgICB0aGlzLl9tZXNzYWdlQnVzLmVtaXQoTWVzc2FnZVR5cGUuU2V0RHJhZywgZHJhZ2dlZERhdGEpO1xyXG4gICAgdGhpcy5fbWVzc2FnZUJ1cy5lbWl0KE1lc3NhZ2VUeXBlLlN0YXJ0RHJhZywgb3JpZ2luYWwucG9zaXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfbG9hZElPbmVGdXJuaXR1cmVGcm9tT3JpZ2luYWwobWQ6IE1ldGFkYXRhLCBwb3M6IFZlY3RvcjMsIHJvdDogRXVsZXIpOiBQcm9taXNlPEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+IHtcclxuICAgIGNvbnN0IG5ld01ldGFEYXRhID0gey4uLm1kfTtcclxuICAgIG5ld01ldGFEYXRhLnJvdGF0aW9uID0gbmV3IEV1bGVyKCkuY29weShyb3QpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZUxvYWRBbmRCdWlsZEZ1cm5pdHVyZShuZXdNZXRhRGF0YSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbG9hZElPbmVGdXJuaXR1cmVGcm9tU2t1KFxyXG4gICAgcG9zOiBWZWN0b3IzLCBza3U6IHN0cmluZywgc2V0dGluZ3M/OiBFeHRlcm5hbFNldHRpbmdzSW50ZXJmYWNlLCBzdGFuZEFsb25lOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+IHtcclxuICAgIGNvbnN0IG1kOiBNZXRhZGF0YSA9IHtcclxuICAgICAgcG9zaXRpb246IHBvcyxcclxuICAgICAgaXRlbUlkZW50aWZpZXI6IHNrdSxcclxuICAgICAgZXh0ZXJuYWxTZXR0aW5nczogc2V0dGluZ3NcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEFuZEJ1aWxkRnVybml0dXJlKG1kLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHN0YW5kQWxvbmUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUNvcHlJbnN0YW5jZUZvckZ1cm5pdHVyZShmdXJuaXR1cmU6IEl0ZW1bXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBmdXJuaXR1cmUubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBjb25zdCBjdXN0b21JdGVtOiBJdGVtID0gZnVybml0dXJlW2ldO1xyXG4gICAgICBpZiAoY3VzdG9tSXRlbS5tZXRhZGF0YSAmJiBjdXN0b21JdGVtLm1ldGFkYXRhLml0ZW1JZCkge1xyXG4gICAgICAgIGNvbnN0IG9sZEluc3RhbmNlOiBzdHJpbmcgPSBjdXN0b21JdGVtLm1ldGFkYXRhLml0ZW1JZDtcclxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZTogc3RyaW5nID0gYXdhaXQgdGhpcy5faU9uZS5jb3B5SW5zdGFuY2VBbmRTYXZlT3JpZ2luYWxDb25maWd1cmF0aW9uKG9sZEluc3RhbmNlLCBudWxsKTtcclxuICAgICAgICBjdXN0b21JdGVtLm1ldGFkYXRhLml0ZW1JZCA9IG5ld0luc3RhbmNlO1xyXG4gICAgICAgIGN1c3RvbUl0ZW0udXNlckRhdGEuaXRlbUlkID0gbmV3SW5zdGFuY2U7XHJcbiAgICAgICAgY3VzdG9tSXRlbS5tZXRhZGF0YS5vcmlnaW5hbEl0ZW1JZCA9IG9sZEluc3RhbmNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVMb2FkSU9uZUZ1cm5pdHVyZUZyb21QcmVzZXQoZnVybml0dXJlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBleHRlcm5hbFNvdXJjZXM6IEV4dGVybmFsU291cmNlW10gPSBbXTtcclxuICAgIGNvbnN0IGNhdGFsb2dEYXRhOiBDYXRhbG9nRGVmaW5pdGlvbltdID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yQWRhcHRlclNlcnZpY2UuZ2V0Q2F0YWxvZ0RlZmluaXRpb25zTGlzdCgpO1xyXG4gICAgaWYgKGNhdGFsb2dEYXRhKSB7XHJcbiAgICAgIGZvciAoY29uc3QgY2F0YWxvZ0l0ZW0gb2YgY2F0YWxvZ0RhdGEpIHtcclxuICAgICAgICBpZiAoY2F0YWxvZ0l0ZW0uZXh0ZXJuYWxTb3VyY2VJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY29uc3QgZXh0ZXJuYWxEYXRhOiBFeHRlcm5hbFNvdXJjZSA9IGF3YWl0IHRoaXMuX2Nvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlLmdldEV4dGVybmFsU291cmNlKGNhdGFsb2dJdGVtLmV4dGVybmFsU291cmNlSWQpO1xyXG4gICAgICAgICAgaWYgKGV4dGVybmFsRGF0YSkge1xyXG4gICAgICAgICAgICBleHRlcm5hbFNvdXJjZXMucHVzaChleHRlcm5hbERhdGEpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gZnVybml0dXJlLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBpZiAoZnVybml0dXJlW2ldLmV4dGVybmFsU2V0dGluZ3MgJiYgZnVybml0dXJlW2ldLmV4dGVybmFsU2V0dGluZ3MuZXh0ZXJuYWxTb3VyY2VJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxTb3VyY2VPYmo6IEV4dGVybmFsU291cmNlID1cclxuICAgICAgICAgIGV4dGVybmFsU291cmNlcy5maW5kKHNvdXJjZSA9PiBzb3VyY2Uuc2NoZW1hID09PSBmdXJuaXR1cmVbaV0uZXh0ZXJuYWxTZXR0aW5ncy5zZXR0aW5ncy5zY2hlbWEpO1xyXG4gICAgICAgIGlmIChleHRlcm5hbFNvdXJjZU9iaiAmJiBleHRlcm5hbFNvdXJjZU9iai5zY2hlbWEgIT09ICcnKSB7XHJcbiAgICAgICAgICBpZiAoZnVybml0dXJlW2ldLmV4dGVybmFsU2V0dGluZ3Muc2V0dGluZ3NbJ3VzZXJuYW1lJ10gIT09IHVuZGVmaW5lZCAmJiBmdXJuaXR1cmVbaV0uZXh0ZXJuYWxTZXR0aW5ncy5zZXR0aW5nc1sncGFzc3dvcmQnXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGZ1cm5pdHVyZVtpXS5leHRlcm5hbFNldHRpbmdzLnNldHRpbmdzWyd1c2VybmFtZSddID0gJyc7XHJcbiAgICAgICAgICAgIGZ1cm5pdHVyZVtpXS5leHRlcm5hbFNldHRpbmdzLnNldHRpbmdzWydwYXNzd29yZCddID0gJyc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmdXJuaXR1cmVbaV0uZXh0ZXJuYWxTZXR0aW5ncy5leHRlcm5hbFNvdXJjZUlkID0gZXh0ZXJuYWxTb3VyY2VPYmouc291cmNlSWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdzb3VyY2Ugbm90IGF2YWlsYWJsZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBhd2FpdCB0aGlzLl9sb2FkRnVybml0dXJlRnJvbUl0ZW0oZnVybml0dXJlW2ldKTtcclxuICAgIH1cclxuICAgIHRoaXMuX21lc3NhZ2VCdXMuZW1pdChNZXNzYWdlVHlwZS5TaG91bGRDb3B5RnVybml0dXJlRnJvbVByZXNldCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9sb2FkRnVybml0dXJlRnJvbUl0ZW0oaXRlbTogYW55KTogUHJvbWlzZTxDdXN0b21GbG9vckdyb3VwUmVzdWx0PiB7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKFxyXG4gICAgICBpdGVtLnhwb3MsIGl0ZW0ueXBvcywgaXRlbS56cG9zKTtcclxuICAgIGNvbnN0IG1ldGFkYXRhID0ge1xyXG4gICAgICBpdGVtTmFtZTogaXRlbS5pdGVtX25hbWUsXHJcbiAgICAgIGl0ZW1EZXNjcmlwdGlvbjogaXRlbS5pdGVtX2Rlc2NyaXB0aW9uLFxyXG4gICAgICBpdGVtSWQ6IGl0ZW0uaXRlbV9pZCxcclxuICAgICAgaXRlbUlkZW50aWZpZXI6IGl0ZW0uaXRlbV9pZGVudGlmaWVyLFxyXG4gICAgICBjb25maWd1cmFibGU6ICFpc05pbGwoaXRlbS5jb25maWd1cmFibGUpID8gaXRlbS5jb25maWd1cmFibGUgOiB0cnVlLFxyXG4gICAgICBpb25lOiBpdGVtLmlvbmUsXHJcbiAgICAgIHNjaGVtYTogaXRlbS5pdGVtX3NjaGVtYSxcclxuICAgICAgcmVzaXphYmxlOiBpdGVtLnJlc2l6YWJsZSxcclxuICAgICAgZWxldmF0aW9uOiBpdGVtLmVsZXZhdGlvbixcclxuICAgICAgZWxldmF0aW9uRml4ZWQ6IGl0ZW0uZWxldmF0aW9uRml4ZWQsXHJcbiAgICAgIGVsZXZhdGlvbkFkanVzdGFibGU6IGl0ZW0uZWxldmF0aW9uQWRqdXN0YWJsZSxcclxuICAgICAgaXRlbVR5cGU6IGl0ZW0uaXRlbV90eXBlLFxyXG4gICAgICBtb2RlbFVybDogaXRlbS5tb2RlbF91cmwsXHJcbiAgICAgIHRleHR1cmU6IGl0ZW0udGV4dHVyZSxcclxuICAgICAgcG9zaXRpb246IHBvc2l0aW9uLFxyXG4gICAgICByb3RhdGlvbjogbmV3IEV1bGVyKDAsIGl0ZW0ucm90YXRpb24sIDApLFxyXG4gICAgICBzY2FsZTogaXRlbS5zY2FsZSxcclxuICAgICAgY2VudGVyUGl2b3Q6IHRydWUsXHJcbiAgICAgIGlnbm9yZUludmlzaWJsZTogaXRlbS5pZ25vcmVJbnZpc2libGUsXHJcbiAgICAgIHVwZGF0ZVBpdm90T25DcmVhdGU6IHRydWUsXHJcbiAgICAgIG9wZW5pbmc6IGl0ZW0ub3BlbmluZyxcclxuICAgICAgbG9ja2VkOiBpdGVtLmxvY2tlZCxcclxuICAgICAgaXRlbUdyb3VwOiBpdGVtLml0ZW1Hcm91cCxcclxuICAgICAgZGVjb3M6IGl0ZW0uZGVjb3MsXHJcbiAgICAgIHNlbGVjdGlvbnM6IGl0ZW0uc2VsZWN0aW9ucyxcclxuICAgICAgZWxlbWVudENvbmZpZ3VyYXRpb246IGl0ZW0uZWxlbWVudENvbmZpZ3VyYXRpb24sXHJcbiAgICAgIG9uV2FsbDogaXRlbS5vbldhbGwsXHJcbiAgICAgIGV4dGVybmFsU2V0dGluZ3M6IGl0ZW0uZXh0ZXJuYWxTZXR0aW5ncyxcclxuICAgICAgY29udmVyc2lvbkdUTVNlbmQ6IGl0ZW0uY29udmVyc2lvbkdUTVNlbmQsXHJcbiAgICAgIGNvbnZlcnNpb25TdWJtaXR0ZWRQcmljZTogaXRlbS5jb252ZXJzaW9uU3VibWl0dGVkUHJpY2VcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEFuZEJ1aWxkRnVybml0dXJlKFxyXG4gICAgICBtZXRhZGF0YSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUxvYWRBbmRCdWlsZEZ1cm5pdHVyZShcclxuICAgIGZ1cm5pdHVyZURhdGE6IE1ldGFkYXRhLFxyXG4gICAgc2hvdWxkQ29weUluc3RhbmNlOiBib29sZWFuLFxyXG4gICAgbG9vc2VPcmlnaW5hbENvbmZpZ3VyYXRpb246IGJvb2xlYW4sXHJcbiAgICBmcm9tUHJlc2V0OiBib29sZWFuLFxyXG4gICAgc3RhbmRBbG9uZTogYm9vbGVhbixcclxuICAgIGZyb21TY3JhdGNoOiBib29sZWFuLFxyXG4gICAgc2hvd0Vycm9yRGlhbG9nOiBib29sZWFuID0gdHJ1ZSxcclxuICApOiBQcm9taXNlPEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+IHtcclxuICAgIGF3YWl0IHRoaXMuX2Nvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlLmluaXRDb25uZWN0b3IoXHJcbiAgICAgICAgZnVybml0dXJlRGF0YS5leHRlcm5hbFNldHRpbmdzID8gZnVybml0dXJlRGF0YS5leHRlcm5hbFNldHRpbmdzLnNldHRpbmdzIDogdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLFxyXG4gICAgICAgIGZ1cm5pdHVyZURhdGEuZXh0ZXJuYWxTZXR0aW5ncyA/IGZ1cm5pdHVyZURhdGEuZXh0ZXJuYWxTZXR0aW5ncy5uYW1lIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIGZ1cm5pdHVyZURhdGEuZXh0ZXJuYWxTZXR0aW5ncyA/IGZ1cm5pdHVyZURhdGEuZXh0ZXJuYWxTZXR0aW5ncy5leHRlcm5hbFNvdXJjZUlkIDogbnVsbFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCByZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQgPVxyXG4gICAgICBhd2FpdCB0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5sb2FkRnVybml0dXJlKFxyXG4gICAgICAgIGZ1cm5pdHVyZURhdGEsIHNob3VsZENvcHlJbnN0YW5jZSwgbG9vc2VPcmlnaW5hbENvbmZpZ3VyYXRpb24sIHN0YW5kQWxvbmUsIGZyb21TY3JhdGNoLCBmcm9tUHJlc2V0KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyb3JSZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQpID0+IHtcclxuICAgICAgICAgIGlmICgodHlwZW9mIGVycm9yUmVzdWx0ID09PSAnc3RyaW5nJyAmJiBlcnJvclJlc3VsdCA9PT0gJ0VDT05OQUJPUlRFRCcpIHx8XHJcbiAgICAgICAgICAgIGVycm9yUmVzdWx0LnJlc3VsdFR5cGUgPT09IFJlc3VsdFR5cGUuVGltZW91dCApIHsgLy8gdGltZW91dFxyXG4gICAgICAgICAgICBlcnJvclJlc3VsdCA9IG5ldyBDdXN0b21GbG9vckdyb3VwUmVzdWx0KGZ1cm5pdHVyZURhdGEuaXRlbUlkZW50aWZpZXIsIGZ1cm5pdHVyZURhdGEuaXRlbU5hbWUpO1xyXG4gICAgICAgICAgICBlcnJvclJlc3VsdC5lcnJvck1lc3NhZ2VzLnB1c2gobmV3IEVycm9yTWVzc2FnZSgnVElNRU9VVCcpKTtcclxuICAgICAgICAgICAgZXJyb3JSZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuVGltZW91dDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VCdXMuZW1pdChNZXNzYWdlVHlwZS5GaW5pc2hlZElPbmVGdXJuaXR1cmVCdWlsZCk7XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvcihlcnJvclJlc3VsdCwgc2hvd0Vycm9yRGlhbG9nKTtcclxuICAgICAgICAgIHJldHVybiBlcnJvclJlc3VsdDtcclxuICAgICAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VCdXMuZW1pdChNZXNzYWdlVHlwZS5GaW5pc2hlZElPbmVGdXJuaXR1cmVCdWlsZCk7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIGlmIChyZXN1bHQucmVzdWx0VHlwZSA9PT0gUmVzdWx0VHlwZS5CdWlsZEZyb21TY3JhdGNoKSB7XHJcbiAgICAgICAgaWYgKGZyb21QcmVzZXQpIHsgLy8gc3RhcnQgY29uZmlndXJpbmcgd2hlbiBsb2FkaW5nIGlzIGRvbmVcclxuICAgICAgICAgIHJlc3VsdC5tZXRhRGF0YSA9IHsuLi5mdXJuaXR1cmVEYXRhfTtcclxuICAgICAgICAgIHRoaXMuX2l0ZW1zRnJvbVNjcmF0Y2gucHVzaChyZXN1bHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmdXJuaXR1cmVEYXRhLnBvc2l0aW9uID0gdGhpcy5fZmxvb3JwbGFuU2VydmljZS5nZXRDZW50ZXIoKTtcclxuICAgICAgICAgIGlmICghc3RhbmRBbG9uZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kaWFsb2dTZXJ2aWNlLnNob3dEaWFsb2coe1xyXG4gICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IERpYWxvZ1R5cGUuV2FybmluZyxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLl9kaWN0aW9uYXJ5U2VydmljZS5nZXQoJ0JVSUxEX1BST0RVQ1RfRlJPTV9TQ1JBVENIJyksXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlczogW3ttZXNzYWdlOiB0aGlzLl9kaWN0aW9uYXJ5U2VydmljZS5nZXQoJ01PREVMX0hBU19OT19ERUZBVUxUUycpfV1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlTG9hZEFuZEJ1aWxkRnVybml0dXJlKGZ1cm5pdHVyZURhdGEsIGZhbHNlLCB0cnVlLCBmcm9tUHJlc2V0LCBzdGFuZEFsb25lLCB0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTWV0YWRhdGEgPSByZXN1bHQgPyByZXN1bHQubWV0YURhdGEgOiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAocmVzdWx0LnJlc3VsdFR5cGUgPT09IFJlc3VsdFR5cGUuTmVlZHNVc2VySW5wdXQpIHtcclxuICAgICAgICByZXN1bHQubWV0YURhdGEgPSB7Li4uZnVybml0dXJlRGF0YX07XHJcbiAgICAgICAgaWYgKGZyb21QcmVzZXQpIHsgLy8gc3RhcnQgY29uZmlndXJpbmcgd2hlbiBsb2FkaW5nIGlzIGRvbmVcclxuICAgICAgICAgIHRoaXMuX2l0ZW1zTmVlZFVzZXJJbnB1dC5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdC5tZXRhRGF0YS5wb3NpdGlvbiA9IHRoaXMuX2Zsb29ycGxhblNlcnZpY2UuZ2V0Q2VudGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXN1bHQucmVzdWx0VHlwZSA9PT0gUmVzdWx0VHlwZS5FeHRlcm5hbFNvdXJjZU5vdEF2YWlsYWJsZSkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmFkZFRvTGlzdCh0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5leHRlcm5hbFNvdXJjZU5vdEF2YWlsYWJsZSwgcmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmVzdWx0LmZ1cm5pdHVyZSkge1xyXG4gICAgICAgIGlmIChzaG91bGRDb3B5SW5zdGFuY2UpIHtcclxuICAgICAgICAgIGNvbnN0IGNsb3Nlc3RXYWxsRWRnZTogSGFsZkVkZ2UgPSB0aGlzLl9yb29tU2VydmljZS5nZXRDbG9zZXN0V2FsbEVkZ2UocmVzdWx0LmZ1cm5pdHVyZS5wb3NpdGlvbi54LCByZXN1bHQuZnVybml0dXJlLnBvc2l0aW9uLnopO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdC5mdXJuaXR1cmUgaW5zdGFuY2VvZiBDdXN0b21XYWxsRmxvb3JJdGVtICYmIHJlc3VsdC5mdXJuaXR1cmUub25XYWxsKSB7XHJcbiAgICAgICAgICAgIChyZXN1bHQuZnVybml0dXJlIGFzIEN1c3RvbVdhbGxGbG9vckl0ZW0pLnBsYWNlT25FZGdlKGNsb3Nlc3RXYWxsRWRnZSk7XHJcbiAgICAgICAgICAgIHJlc3VsdC5mdXJuaXR1cmUubW92ZUZyb21GbG9vclRvV2FsbCgpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuZnVybml0dXJlIGluc3RhbmNlb2YgV2FsbEl0ZW0gJiYgIShyZXN1bHQuZnVybml0dXJlIGluc3RhbmNlb2YgQ3VzdG9tV2FsbEZsb29ySXRlbSkpIHtcclxuICAgICAgICAgICAgKHJlc3VsdC5mdXJuaXR1cmUgYXMgV2FsbEl0ZW0pLnBsYWNlT25FZGdlKGNsb3Nlc3RXYWxsRWRnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQuZnVybml0dXJlIGluc3RhbmNlb2YgQ3VzdG9tV2FsbEl0ZW0gJiYgc3RhbmRBbG9uZSkge1xyXG4gICAgICAgICAgcmVzdWx0LmZ1cm5pdHVyZS5wb3NpdGlvbi55ICs9IHJlc3VsdC5mdXJuaXR1cmUuaGFsZlNpemUueTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlID09PSBSZXN1bHRUeXBlLk9ic29sZXRlKSB7XHJcbiAgICAgICAgICB0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5hZGRUb0xpc3QodGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2Uub2Jzb2xldGVPYmplY3RDYWNoZSwgcmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlID09PSBSZXN1bHRUeXBlLkxvYWRlZCkge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdC5tZXRhRGF0YS5jb25maWd1cmFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYWRkVG9MaXN0KHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLm9iamVjdExpc3QsIHJlc3VsdCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5hZGRUb0xpc3QodGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2Uuc2ltcGxlT2JqZWN0TGlzdCwgcmVzdWx0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlID09PSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25GaXhlZCkge1xyXG4gICAgICAgICAgdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UuYWRkVG9MaXN0KHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLm9iamVjdExpc3RGaXhlZCwgcmVzdWx0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2FkZFRvU2NlbmVHVE0ocmVzdWx0LmZ1cm5pdHVyZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghZnJvbVByZXNldCkge1xyXG4gICAgICB0aGlzLl9wcm9ncmVzc1NlcnZpY2UuZmluaXNoRG93bmxvYWRzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdGl2ZU1ldGFkYXRhID0gcmVzdWx0ID8gcmVzdWx0Lm1ldGFEYXRhIDogbnVsbDtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYW5zd2VyU2VsZWN0ZWQocmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0KTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb2FkRnVybml0dXJlU2VydmljZS5hZGRUb0xpc3QodGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2Uub2JqZWN0TGlzdCwgcmVzdWx0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUVycm9yKGVycm9yOiBDdXN0b21GbG9vckdyb3VwUmVzdWx0LCBzaG93RGlhbG9nOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoZXJyb3IuaW5zdGFuY2VJZCB8fCBlcnJvci5za3UpIHtcclxuICAgICAgc3dpdGNoIChlcnJvci5yZXN1bHRUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBSZXN1bHRUeXBlLkFydGljbGVOb3RGb3VuZDpcclxuICAgICAgICBjYXNlIFJlc3VsdFR5cGUuVGltZW91dDpcclxuICAgICAgICBjYXNlIFJlc3VsdFR5cGUuQ29uZmlndXJhdGlvbk5vdEZpeGVkOlxyXG4gICAgICAgIGNhc2UgUmVzdWx0VHlwZS5HYW1lb2JqZWN0TmFtZU1pc21hdGNoSW5Tb3VyY2U6XHJcbiAgICAgICAgY2FzZSBSZXN1bHRUeXBlLk5vU2VsZWN0aW9uczpcclxuICAgICAgICBjYXNlIFJlc3VsdFR5cGUuTm9EZWNvTm9kZXM6XHJcbiAgICAgICAgY2FzZSBSZXN1bHRUeXBlLkV4dGVybmFsU291cmNlTm90QXZhaWxhYmxlOlxyXG4gICAgICAgICAgdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2Uubm90TG9hZGVkLnB1c2goZXJyb3IpO1xyXG4gICAgICAgICAgaWYgKHNob3dEaWFsb2cpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2hvd1dhcm5pbmcoe3RpdGxlOiAnRVJST1InLCBtZXNzYWdlczogZXJyb3IuZXJyb3JNZXNzYWdlc30pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLm5vdExvYWRlZC5wdXNoKGVycm9yKTtcclxuICAgICAgICAgIGlmIChzaG93RGlhbG9nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nob3dXYXJuaW5nKHt0aXRsZTogJ0VSUk9SJywgbWVzc2FnZXM6IFtuZXcgRXJyb3JNZXNzYWdlKCdFUlJPUl9MT0FESU5HX0ZVUk5JVFVSRScpXX0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoc2hvd0RpYWxvZykge1xyXG4gICAgICAgIHRoaXMuX3Nob3dXYXJuaW5nKHt0aXRsZTogJ0VSUk9SJywgbWVzc2FnZXM6IFtuZXcgRXJyb3JNZXNzYWdlKCdFUlJPUl9MT0FESU5HX0ZVUk5JVFVSRScpXX0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9tZXNzYWdlQnVzLmVtaXQoTWVzc2FnZVR5cGUuVW5kZWZpbmVkRXJyb3JPY2N1cmVkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZUNvbmZpZ3VyZU1vZGVDaGFuZ2UoY29uZmlndXJpbmdNb2RlQ2hhbmdlOiBDb25maWd1cmluZ01vZGVDaGFuZ2VJbnRlcmZhY2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLnN0YW5kQWxvbmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZ3VyaW5nTW9kZUNoYW5nZS5jb25maWd1cmluZykge1xyXG4gICAgICB0aGlzLl9pT25lLmVtcHR5U2VsZWN0aW9ucygpO1xyXG4gICAgICB0aGlzLl9hcHBTdGF0ZVNlcnZpY2UudW5kb0Rpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5fYXBwU3RhdGVTZXJ2aWNlLnJlZG9EaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuYWN0aXZlTWV0YWRhdGEgPSBjb25maWd1cmluZ01vZGVDaGFuZ2UubWV0YWRhdGE7XHJcbiAgICAgIHRoaXMuX2hhbmRsZUxvYWRBbmRCdWlsZEZ1cm5pdHVyZShcclxuICAgICAgICBjb25maWd1cmluZ01vZGVDaGFuZ2UubWV0YWRhdGEsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9hcHBTdGF0ZVNlcnZpY2UudW5kb0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX2FwcFN0YXRlU2VydmljZS5yZWRvRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0Fuc3dlcnMgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1NlbGVjdGlvbnMgPSBjb25maWd1cmluZ01vZGVDaGFuZ2UuY29uZmlndXJpbmcgfHwgdGhpcy5zdGFuZEFsb25lO1xyXG4gICAgdGhpcy5zaG93TGl0ZVNlbGVjdG9yID0gY29uZmlndXJpbmdNb2RlQ2hhbmdlLmNvbmZpZ3VyaW5nIHx8IHRoaXMuc3RhbmRBbG9uZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FkZE1vZGVsRGlhbG9nVG9vbGJhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbk1vZGVscyxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogODAwXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Nob3dXYXJuaW5nKGNvbmZpZzogRGlhbG9nQ29uZmlnKSB7XHJcbiAgICB0aGlzLl9kaWFsb2dTZXJ2aWNlLnNob3dEaWFsb2coe2RhdGE6IGNvbmZpZ30pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfYWRkVG9TY2VuZUdUTShmdXJuaXR1cmU6IEl0ZW0pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChmdXJuaXR1cmUgJiYgZnVybml0dXJlLm1ldGFkYXRhKSB7XHJcbiAgICAgIGNvbnN0IGdvb2RJZDogbnVtYmVyID0gYXdhaXQgdGhpcy5fY29ubmVjdG9yQWRhcHRlclNlcnZpY2UuZ2V0R29vZElkRnJvbUFydGljbGVOcihmdXJuaXR1cmUubWV0YWRhdGEuaXRlbUlkZW50aWZpZXIpO1xyXG4gICAgICBjb25zdCBhcnRpY2xlRnVsbE9iamVjdCA9IGF3YWl0IHRoaXMuX2Nvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlLmdldEFydGljbGVGdWxsT2JqZWN0KGdvb2RJZCk7XHJcbiAgICAgIGxldCBhcnRpY2xlQ2F0ZWdvcmllczogQXJ0aWNsZUNhdGVnb3J5W107XHJcbiAgICAgIGlmIChhcnRpY2xlRnVsbE9iamVjdCAmJiBhcnRpY2xlRnVsbE9iamVjdC5wdWJsaWNhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgYXJ0aWNsZUNhdGVnb3JpZXMgPSBhd2FpdCB0aGlzLl9jb25uZWN0b3JBZGFwdGVyU2VydmljZS5nZXRBcnRpY2xlQ2F0ZWdvcmllcyhhcnRpY2xlRnVsbE9iamVjdC5wdWJsaWNhdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICdhcnRpY2xlTnInOiBmdXJuaXR1cmUubWV0YWRhdGEuaXRlbUlkZW50aWZpZXIsXHJcbiAgICAgICAgJ3Byb2R1Y3QnOiBmdXJuaXR1cmUubWV0YWRhdGEuaXRlbU5hbWUsXHJcbiAgICAgICAgJ3NjaGVtYSc6IGZ1cm5pdHVyZS5tZXRhZGF0YS5zY2hlbWFcclxuICAgICAgfTtcclxuICAgICAgaWYgKGZ1cm5pdHVyZS5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBleHRlcm5hbERhdGEgPSB7XHJcbiAgICAgICAgICAnZXh0ZXJuYWxTb3VyY2VOYW1lJzogZnVybml0dXJlLm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MubmFtZSxcclxuICAgICAgICAgICdleHRlcm5hbFNvdXJjZVVybCc6IGZ1cm5pdHVyZS5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLnNldHRpbmdzLnVybFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZGF0YSA9IHsuLi5kYXRhLCAuLi5leHRlcm5hbERhdGF9O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChhcnRpY2xlRnVsbE9iamVjdCkge1xyXG4gICAgICAgIGNvbnN0IGFydGljbGVEYXRhID0ge1xyXG4gICAgICAgICAgJ2JyYW5kSWQnOiBhcnRpY2xlRnVsbE9iamVjdC5icmFuZElkLFxyXG4gICAgICAgICAgJ3JldGFpbEZvcm11bGFzJzogYXJ0aWNsZUZ1bGxPYmplY3QucmV0YWlsRm9ybXVsYXMsXHJcbiAgICAgICAgICAndHVybk92ZXJHcm91cCc6IGFydGljbGVGdWxsT2JqZWN0LnR1cm5PdmVyR3JvdXBcclxuICAgICAgICB9O1xyXG4gICAgICAgIGRhdGEgPSB7Li4uZGF0YSwgLi4uYXJ0aWNsZURhdGF9O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChhcnRpY2xlQ2F0ZWdvcmllcykge1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5TGlzdCA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgYXJ0aWNsZUNhdGVnb3JpZXMpIHtcclxuICAgICAgICAgIGlmIChjYXRlZ29yeS5kZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICBjYXRlZ29yeUxpc3QucHVzaChjYXRlZ29yeS5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5RGF0YSA9IHtcclxuICAgICAgICAgICdjYXRlZ29yaWVzJzogY2F0ZWdvcnlMaXN0XHJcbiAgICAgICAgfTtcclxuICAgICAgICBkYXRhID0gey4uLmRhdGEsIC4uLmNhdGVnb3J5RGF0YX07XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fZ29vZ2xlVGFnTWFuYWdlci5zZW5kRXZlbnQoR29vZ2xlVGFnTWFuYWdlckV2ZW50LkFkZFRvU2NlbmUsIGRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8cnAtbGl0ZS1zZWxlY3RvciAqbmdJZj1cIiFzdGFuZEFsb25lXCIgY2xhc3M9XCJmbG9hdGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgIFsoc2hvdyldPVwic2hvd0xpdGVTZWxlY3RvclwiXHJcbiAgICAgICAgICAgICAgICAgIFttZXRhZGF0YV09XCJhY3RpdmVNZXRhZGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93U2VsZWN0aW9uc109XCJzaG93U2VsZWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93QW5zd2Vyc109XCJzaG93QW5zd2Vyc1wiXHJcbiAgICAgICAgICAgICAgICAgIChzaG93Q2hhbmdlKT1cImhhbmRsZVNob3dDaGFuZ2VTZWxlY3RvcigkZXZlbnQpXCJcclxuPjwvcnAtbGl0ZS1zZWxlY3Rvcj5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dFbGVtZW50VG9vbGJhclwiPlxyXG4gIDxycC1lbGVtZW50LXRvb2xiYXIgY2xhc3M9XCJycC1lbGVtZW50LXRvb2xiYXIgZmxvYXRpbmdcIiBbY2xhc3MuY3VzdG9tXT1cInN0YW5kQWxvbmVcIiBAc2hvd0VsZW1lbnRUb29sYmFyXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZWRpdE1lbnVdPVwiZWRpdEVsZW1lbnRNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93U3dhcF09XCJzaG93U3dhcEJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd1BvaW50ZXJdPVwic2VsZWN0ZWRFbGVtZW50UG9zaXRpb24gIT09IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoc3dhcENsaWNrZWQpPVwic3dhcEVsZW1lbnQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRlQ2xpY2tlZCk9XCJkZWxldGVFbGVtZW50KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGFuaW1hdGlvbkNsaWNrZWQpPVwib3BlbkFuaW1hdGlvblNpZGViYXIoKVwiXHJcbiAgPjwvcnAtZWxlbWVudC10b29sYmFyPlxyXG4gIDxycC1lbGVtZW50LWJ1dHRvbnMgY2xhc3M9XCJycC1lbGVtZW50LWJ1dHRvbnMgZmxvYXRpbmdcIiBAc2hvd0VsZW1lbnRUb29sYmFyXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZWxlbWVudFBvaW50ZXJdPVwiZWxlbWVudFRvb2xiYXI/LmVsZW1lbnRQb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthZGRCdXR0b25zXT1cImVkaXRBZGRCdXR0b25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjdXN0b21pemVCdXR0b25zXT1cImVkaXRDdXN0b21pemVCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3Jlc2l6ZUJ1dHRvbnNdPVwicmVzaXplQnV0dG9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZWxlbWVudFBvc2l0aW9uXT1cInNlbGVjdGVkRWxlbWVudFBvc2l0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjdXN0b21pemVCdXR0b25DbGlja2VkKT1cImhhbmRsZUN1c3RvbWl6ZUNsaWNrKClcIlxyXG4gID48L3JwLWVsZW1lbnQtYnV0dG9ucz5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0N1c3RvbWl6ZUJ1dHRvbnNcIj5cclxuICA8cnAtZWxlbWVudC1idXR0b25zIGNsYXNzPVwicnAtZWxlbWVudC1idXR0b25zIGZsb2F0aW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtlbGVtZW50UG9pbnRlcl09XCJlbGVtZW50VG9vbGJhcj8uZWxlbWVudFBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2N1c3RvbWl6ZUJ1dHRvbnNdPVwiZWRpdEN1c3RvbWl6ZUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZWxlbWVudFBvc2l0aW9uXT1cInNlbGVjdGVkRWxlbWVudFBvc2l0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjdXN0b21pemVCdXR0b25DbGlja2VkKT1cImhhbmRsZUN1c3RvbWl6ZUNsaWNrKClcIlxyXG4gID48L3JwLWVsZW1lbnQtYnV0dG9ucz5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uTW9kZWxzPlxyXG4gIDxycC10b29sYmFyLWljb25cclxuICAgIG1hdEljb249XCJmb3JtYXRfbGlzdF9idWxsZXRlZFwiXHJcbiAgICB0b29sdGlwPVwie3tpY29uTmFtZS5PYmplY3RzIHwgbG9jYWxpemV9fVwiXHJcbiAgICAob25DbGljayk9XCJzZXRNb2RlbEVycm9yRGlhbG9nKClcIlxyXG4gICAgW3Nob3dMYWJlbF09XCJzaG91bGRTaG93TGFiZWxcIlxyXG4gID48L3JwLXRvb2xiYXItaWNvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjc2VsZWN0ZWRUaHJlZWRPYmplY3RBbmltYXRpb25TaWRlYmFyPlxyXG4gIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCIgW3RleHRDb250ZW50XT1cIidBTklNQVRFJyB8IGxvY2FsaXplXCI+PC9oMj5cclxuICA8L2hlYWRlcj5cclxuICA8cnAtYW5pbWF0aW9uPlxyXG5cclxuICA8L3JwLWFuaW1hdGlvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjc2VsZWN0ZWRUaHJlZWRPYmplY3RDdXN0b21pemF0aW9uU2lkZWJhcj5cclxuICA8aGVhZGVyIGNsYXNzPVwiZHJhd2VyX19oZWFkZXJcIj5cclxuICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiIFt0ZXh0Q29udGVudF09XCInQ1VTVE9NSVpFJyB8IGxvY2FsaXplXCI+PC9oMj5cclxuICA8L2hlYWRlcj5cclxuICA8cnAtY3VzdG9taXplclxyXG4gICAgW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25Ub0N1c3RvbWl6ZVwiXHJcbiAgPjwvcnAtY3VzdG9taXplcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxkaXYgY2xhc3M9XCJzbGlkZXItY29udGFpbmVyXCI+XHJcbiAgPHJwLWVsZW1lbnQtc2xpZGVyIGNsYXNzPVwicnAtZWxlbWVudC1zbGlkZXJcIj48L3JwLWVsZW1lbnQtc2xpZGVyPlxyXG48L2Rpdj5cclxuIl19
|