@carto/kepler.gl 0.0.80 → 0.1.0-alpha.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/README.md +652 -42
- package/dist/actions/action-wrapper.d.ts +115 -0
- package/dist/actions/actions.d.ts +195 -0
- package/dist/actions/identity-actions.d.ts +61 -0
- package/dist/actions/index.d.ts +9 -0
- package/dist/actions/map-state-actions.d.ts +69 -0
- package/dist/actions/map-style-actions.d.ts +146 -0
- package/dist/actions/provider-actions.d.ts +153 -0
- package/dist/actions/ui-state-actions.d.ts +300 -0
- package/dist/actions/vis-state-actions.d.ts +821 -0
- package/dist/bundle.js +75163 -0
- package/dist/bundle.js.map +1 -0
- package/dist/cloud-providers/index.d.ts +2 -0
- package/dist/cloud-providers/provider.d.ts +176 -0
- package/dist/components/bottom-widget.d.ts +47 -0
- package/dist/components/common/action-panel.d.ts +27 -0
- package/dist/components/common/animation-control/animation-control.d.ts +24 -0
- package/dist/components/common/animation-control/animation-controller.d.ts +16 -0
- package/dist/components/common/animation-control/animation-speed-slider.d.ts +12 -0
- package/dist/components/common/animation-control/floating-time-display.d.ts +9 -0
- package/dist/components/common/animation-control/playback-controls.d.ts +72 -0
- package/dist/components/common/animation-control/speed-control.d.ts +13 -0
- package/dist/components/common/checkbox.d.ts +35 -0
- package/dist/components/common/color-legend.d.ts +43 -0
- package/dist/components/common/data-table/button.d.ts +8 -0
- package/dist/components/common/data-table/canvas.d.ts +2 -0
- package/dist/components/common/data-table/cell-size.d.ts +36 -0
- package/dist/components/common/data-table/grid.d.ts +7 -0
- package/dist/components/common/data-table/index.d.ts +143 -0
- package/dist/components/common/data-table/option-dropdown.d.ts +14 -0
- package/dist/components/common/dataset-label.d.ts +10 -0
- package/dist/components/common/error-boundary.d.ts +16 -0
- package/dist/components/common/field-selector.d.ts +47 -0
- package/dist/components/common/field-token.d.ts +45 -0
- package/dist/components/common/file-uploader/file-drop.d.ts +54 -0
- package/dist/components/common/file-uploader/file-upload-progress.d.ts +8 -0
- package/dist/components/common/file-uploader/file-upload.d.ts +27 -0
- package/dist/components/common/file-uploader/upload-button.d.ts +8 -0
- package/dist/components/common/histogram-plot.d.ts +3 -0
- package/dist/components/common/icons/add.d.ts +9 -0
- package/dist/components/common/icons/anchor_window.d.ts +11 -0
- package/dist/components/common/icons/arrow-down-alt.d.ts +9 -0
- package/dist/components/common/icons/arrow-down-solid.d.ts +9 -0
- package/dist/components/common/icons/arrow-down.d.ts +9 -0
- package/dist/components/common/icons/arrow-left.d.ts +9 -0
- package/dist/components/common/icons/arrow-right.d.ts +9 -0
- package/dist/components/common/icons/arrow-up-alt.d.ts +9 -0
- package/dist/components/common/icons/arrow-up-solid.d.ts +9 -0
- package/dist/components/common/icons/arrow-up.d.ts +9 -0
- package/dist/components/common/icons/base.d.ts +29 -0
- package/dist/components/common/icons/bug.d.ts +9 -0
- package/dist/components/common/icons/cancel.d.ts +9 -0
- package/dist/components/common/icons/checkmark.d.ts +10 -0
- package/dist/components/common/icons/clipboard.d.ts +9 -0
- package/dist/components/common/icons/clock.d.ts +9 -0
- package/dist/components/common/icons/close.d.ts +9 -0
- package/dist/components/common/icons/code-alt.d.ts +9 -0
- package/dist/components/common/icons/copy.d.ts +9 -0
- package/dist/components/common/icons/crosshairs.d.ts +9 -0
- package/dist/components/common/icons/cube-3d.d.ts +9 -0
- package/dist/components/common/icons/cursor-click.d.ts +9 -0
- package/dist/components/common/icons/data-table.d.ts +10 -0
- package/dist/components/common/icons/db.d.ts +10 -0
- package/dist/components/common/icons/delete.d.ts +9 -0
- package/dist/components/common/icons/docs.d.ts +9 -0
- package/dist/components/common/icons/drag-n-drop.d.ts +9 -0
- package/dist/components/common/icons/draw-polygon.d.ts +10 -0
- package/dist/components/common/icons/email.d.ts +9 -0
- package/dist/components/common/icons/expand.d.ts +9 -0
- package/dist/components/common/icons/eye-seen.d.ts +9 -0
- package/dist/components/common/icons/eye-unseen.d.ts +9 -0
- package/dist/components/common/icons/file-type.d.ts +8 -0
- package/dist/components/common/icons/file.d.ts +9 -0
- package/dist/components/common/icons/files.d.ts +9 -0
- package/dist/components/common/icons/filter-funnel.d.ts +9 -0
- package/dist/components/common/icons/free-window.d.ts +11 -0
- package/dist/components/common/icons/gear.d.ts +9 -0
- package/dist/components/common/icons/hash.d.ts +9 -0
- package/dist/components/common/icons/histogram.d.ts +9 -0
- package/dist/components/common/icons/index.d.ts +78 -0
- package/dist/components/common/icons/info.d.ts +12 -0
- package/dist/components/common/icons/layers.d.ts +9 -0
- package/dist/components/common/icons/left-arrow.d.ts +9 -0
- package/dist/components/common/icons/legend.d.ts +9 -0
- package/dist/components/common/icons/line-chart.d.ts +9 -0
- package/dist/components/common/icons/login.d.ts +9 -0
- package/dist/components/common/icons/logout.d.ts +9 -0
- package/dist/components/common/icons/map-icon.d.ts +11 -0
- package/dist/components/common/icons/map.d.ts +11 -0
- package/dist/components/common/icons/messages.d.ts +9 -0
- package/dist/components/common/icons/minus.d.ts +9 -0
- package/dist/components/common/icons/order-by-dataset.d.ts +12 -0
- package/dist/components/common/icons/order-by-list.d.ts +12 -0
- package/dist/components/common/icons/pause.d.ts +9 -0
- package/dist/components/common/icons/picture.d.ts +9 -0
- package/dist/components/common/icons/pin.d.ts +9 -0
- package/dist/components/common/icons/play.d.ts +9 -0
- package/dist/components/common/icons/polygon.d.ts +10 -0
- package/dist/components/common/icons/rectangle.d.ts +10 -0
- package/dist/components/common/icons/reduce.d.ts +9 -0
- package/dist/components/common/icons/reset.d.ts +9 -0
- package/dist/components/common/icons/rocket.d.ts +9 -0
- package/dist/components/common/icons/save.d.ts +9 -0
- package/dist/components/common/icons/save2.d.ts +9 -0
- package/dist/components/common/icons/search.d.ts +9 -0
- package/dist/components/common/icons/settings.d.ts +9 -0
- package/dist/components/common/icons/share.d.ts +9 -0
- package/dist/components/common/icons/split.d.ts +9 -0
- package/dist/components/common/icons/square-select.d.ts +9 -0
- package/dist/components/common/icons/table.d.ts +9 -0
- package/dist/components/common/icons/trash.d.ts +9 -0
- package/dist/components/common/icons/upload.d.ts +9 -0
- package/dist/components/common/icons/vert-dots.d.ts +9 -0
- package/dist/components/common/icons/vert-three-dots.d.ts +9 -0
- package/dist/components/common/icons/warning.d.ts +10 -0
- package/dist/components/common/image-preview.d.ts +15 -0
- package/dist/components/common/info-helper.d.ts +11 -0
- package/dist/components/common/item-selector/accessor.d.ts +7 -0
- package/dist/components/common/item-selector/chickleted-input.d.ts +21 -0
- package/dist/components/common/item-selector/dropdown-list.d.ts +68 -0
- package/dist/components/common/item-selector/item-selector.d.ts +91 -0
- package/dist/components/common/item-selector/typeahead.d.ts +115 -0
- package/dist/components/common/line-chart.d.ts +34 -0
- package/dist/components/common/loading-spinner.d.ts +9 -0
- package/dist/components/common/logo.d.ts +8 -0
- package/dist/components/common/map-layer-selector.d.ts +13 -0
- package/dist/components/common/modal.d.ts +49 -0
- package/dist/components/common/portaled.d.ts +527 -0
- package/dist/components/common/progress-bar.d.ts +12 -0
- package/dist/components/common/range-brush.d.ts +19 -0
- package/dist/components/common/range-plot.d.ts +35 -0
- package/dist/components/common/range-slider.d.ts +32 -0
- package/dist/components/common/slider/mouse-event.d.ts +27 -0
- package/dist/components/common/slider/slider-bar-handle.d.ts +29 -0
- package/dist/components/common/slider/slider-handle.d.ts +33 -0
- package/dist/components/common/slider/slider.d.ts +70 -0
- package/dist/components/common/styled-components.d.ts +119 -0
- package/dist/components/common/switch.d.ts +16 -0
- package/dist/components/common/time-range-slider-time-title.d.ts +9 -0
- package/dist/components/common/time-range-slider.d.ts +32 -0
- package/dist/components/common/time-slider-marker.d.ts +21 -0
- package/dist/components/common/tippy-tooltip.d.ts +4 -0
- package/dist/components/common/toolbar-item.d.ts +14 -0
- package/dist/components/common/toolbar.d.ts +5 -0
- package/dist/components/common/vertical-toolbar.d.ts +3 -0
- package/dist/components/container.d.ts +39 -0
- package/dist/components/context.d.ts +7 -0
- package/dist/components/editor/constants.d.ts +17 -0
- package/dist/components/editor/editor.d.ts +29 -0
- package/dist/components/editor/feature-action-panel.d.ts +27 -0
- package/dist/components/editor/feature-styles.d.ts +24 -0
- package/dist/components/editor/handle-style.d.ts +38 -0
- package/dist/components/filters/components.d.ts +3 -0
- package/dist/components/filters/filter-panels/filter-panel-with-field-select.d.ts +10 -0
- package/dist/components/filters/filter-panels/multi-select-filter-panel.d.ts +9 -0
- package/dist/components/filters/filter-panels/new-filter-panel.d.ts +12 -0
- package/dist/components/filters/filter-panels/polygon-filter-panel.d.ts +9 -0
- package/dist/components/filters/filter-panels/range-filter-panel.d.ts +9 -0
- package/dist/components/filters/filter-panels/single-select-filter-panel.d.ts +9 -0
- package/dist/components/filters/filter-panels/time-range-filter-panel.d.ts +8 -0
- package/dist/components/filters/filter-panels/types.d.ts +36 -0
- package/dist/components/filters/index.d.ts +5 -0
- package/dist/components/filters/multi-select-filter.d.ts +3 -0
- package/dist/components/filters/polygon-filter.d.ts +4 -0
- package/dist/components/filters/range-filter.d.ts +8 -0
- package/dist/components/filters/single-select-filter.d.ts +3 -0
- package/dist/components/filters/time-range-filter.d.ts +28 -0
- package/dist/components/filters/time-widget.d.ts +14 -0
- package/dist/components/filters/types.d.ts +53 -0
- package/dist/components/geocoder/geocoder.d.ts +33 -0
- package/dist/components/geocoder-panel.d.ts +28 -0
- package/dist/components/index.d.ts +165 -0
- package/dist/components/injector.d.ts +25 -0
- package/dist/components/kepler-gl.d.ts +302 -0
- package/dist/components/map/coordinate-info.d.ts +7 -0
- package/dist/components/map/layer-hover-info.d.ts +13 -0
- package/dist/components/map/layer-selector-panel.d.ts +22 -0
- package/dist/components/map/locale-panel.d.ts +16 -0
- package/dist/components/map/map-control-panel.d.ts +14 -0
- package/dist/components/map/map-control-toolbar.d.ts +2 -0
- package/dist/components/map/map-control-tooltip.d.ts +7 -0
- package/dist/components/map/map-control.d.ts +44 -0
- package/dist/components/map/map-draw-panel.d.ts +21 -0
- package/dist/components/map/map-legend-panel.d.ts +23 -0
- package/dist/components/map/map-legend.d.ts +55 -0
- package/dist/components/map/map-popover.d.ts +37 -0
- package/dist/components/map/split-map-button.d.ts +19 -0
- package/dist/components/map/toggle-3d-button.d.ts +16 -0
- package/dist/components/map-container.d.ts +58 -0
- package/dist/components/maps-layout.d.ts +10 -0
- package/dist/components/modal-container.d.ts +65 -0
- package/dist/components/modals/add-map-style-modal.d.ts +17 -0
- package/dist/components/modals/cloud-tile.d.ts +15 -0
- package/dist/components/modals/data-table-modal.d.ts +29 -0
- package/dist/components/modals/delete-data-modal.d.ts +10 -0
- package/dist/components/modals/error-display.d.ts +6 -0
- package/dist/components/modals/export-data-modal.d.ts +25 -0
- package/dist/components/modals/export-image-modal.d.ts +18 -0
- package/dist/components/modals/export-map-modal/components.d.ts +8 -0
- package/dist/components/modals/export-map-modal/export-html-map.d.ts +12 -0
- package/dist/components/modals/export-map-modal/export-json-map.d.ts +9 -0
- package/dist/components/modals/export-map-modal/export-map-modal.d.ts +27 -0
- package/dist/components/modals/image-modal-container.d.ts +18 -0
- package/dist/components/modals/load-data-modal.d.ts +33 -0
- package/dist/components/modals/load-storage-map.d.ts +26 -0
- package/dist/components/modals/loading-dialog.d.ts +7 -0
- package/dist/components/modals/modal-dialog.d.ts +2 -0
- package/dist/components/modals/modal-tabs.d.ts +27 -0
- package/dist/components/modals/overwrite-map-modal.d.ts +16 -0
- package/dist/components/modals/provider-modal-container.d.ts +23 -0
- package/dist/components/modals/save-map-modal.d.ts +29 -0
- package/dist/components/modals/share-map-modal.d.ts +30 -0
- package/dist/components/modals/status-panel.d.ts +13 -0
- package/dist/components/modals/storage-map-viewer.d.ts +21 -0
- package/dist/components/notification-panel/notification-item.d.ts +66 -0
- package/dist/components/notification-panel.d.ts +61 -0
- package/dist/components/performance.d.ts +4 -0
- package/dist/components/plot-container.d.ts +24 -0
- package/dist/components/side-panel/cloud-storage-dropdown.d.ts +6 -0
- package/dist/components/side-panel/common/dataset-info.d.ts +3 -0
- package/dist/components/side-panel/common/dataset-tag.d.ts +3 -0
- package/dist/components/side-panel/common/dataset-title.d.ts +8 -0
- package/dist/components/side-panel/common/source-data-catalog.d.ts +9 -0
- package/dist/components/side-panel/common/source-data-selector.d.ts +8 -0
- package/dist/components/side-panel/common/types.d.ts +58 -0
- package/dist/components/side-panel/custom-panel.d.ts +9 -0
- package/dist/components/side-panel/filter-manager.d.ts +20 -0
- package/dist/components/side-panel/filter-panel/filter-panel-header.d.ts +21 -0
- package/dist/components/side-panel/filter-panel/filter-panel.d.ts +23 -0
- package/dist/components/side-panel/interaction-manager.d.ts +14 -0
- package/dist/components/side-panel/interaction-panel/brush-config.d.ts +15 -0
- package/dist/components/side-panel/interaction-panel/interaction-panel.d.ts +19 -0
- package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.d.ts +28 -0
- package/dist/components/side-panel/interaction-panel/tooltip-config.d.ts +38 -0
- package/dist/components/side-panel/layer-manager.d.ts +46 -0
- package/dist/components/side-panel/layer-panel/add-layer-button.d.ts +10 -0
- package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.d.ts +8 -0
- package/dist/components/side-panel/layer-panel/color-palette.d.ts +13 -0
- package/dist/components/side-panel/layer-panel/color-range-selector.d.ts +129 -0
- package/dist/components/side-panel/layer-panel/color-selector.d.ts +101 -0
- package/dist/components/side-panel/layer-panel/column-selector.d.ts +22 -0
- package/dist/components/side-panel/layer-panel/custom-markers-config-group.d.ts +6 -0
- package/dist/components/side-panel/layer-panel/custom-palette.d.ts +38 -0
- package/dist/components/side-panel/layer-panel/custom-picker.d.ts +67 -0
- package/dist/components/side-panel/layer-panel/dataset-layer-group.d.ts +24 -0
- package/dist/components/side-panel/layer-panel/dataset-layer-section.d.ts +25 -0
- package/dist/components/side-panel/layer-panel/dataset-section.d.ts +26 -0
- package/dist/components/side-panel/layer-panel/dimension-scale-selector.d.ts +10 -0
- package/dist/components/side-panel/layer-panel/hex-column-config.d.ts +62 -0
- package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.d.ts +8 -0
- package/dist/components/side-panel/layer-panel/layer-column-config.d.ts +20 -0
- package/dist/components/side-panel/layer-panel/layer-config-group.d.ts +37 -0
- package/dist/components/side-panel/layer-panel/layer-configurator.d.ts +415 -0
- package/dist/components/side-panel/layer-panel/layer-list.d.ts +20 -0
- package/dist/components/side-panel/layer-panel/layer-panel-header.d.ts +43 -0
- package/dist/components/side-panel/layer-panel/layer-panel.d.ts +40 -0
- package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.d.ts +17 -0
- package/dist/components/side-panel/layer-panel/layer-type-list-item.d.ts +11 -0
- package/dist/components/side-panel/layer-panel/layer-type-selector.d.ts +23 -0
- package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.d.ts +23 -0
- package/dist/components/side-panel/layer-panel/panel-view-list-toggle.d.ts +36 -0
- package/dist/components/side-panel/layer-panel/single-color-palette.d.ts +12 -0
- package/dist/components/side-panel/layer-panel/text-label-panel.d.ts +18 -0
- package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.d.ts +35 -0
- package/dist/components/side-panel/layer-panel/vis-config-slider.d.ts +20 -0
- package/dist/components/side-panel/layer-panel/vis-config-switch.d.ts +16 -0
- package/dist/components/side-panel/map-manager.d.ts +21 -0
- package/dist/components/side-panel/map-style-panel/map-layer-selector.d.ts +19 -0
- package/dist/components/side-panel/map-style-panel/map-style-selector.d.ts +16 -0
- package/dist/components/side-panel/panel-dropdown.d.ts +18 -0
- package/dist/components/side-panel/panel-header-action.d.ts +20 -0
- package/dist/components/side-panel/panel-header.d.ts +78 -0
- package/dist/components/side-panel/panel-tab.d.ts +20 -0
- package/dist/components/side-panel/panel-title.d.ts +4 -0
- package/dist/components/side-panel/panel-toggle.d.ts +14 -0
- package/dist/components/side-panel/side-bar.d.ts +76 -0
- package/dist/components/side-panel.d.ts +134 -0
- package/dist/components/types.d.ts +44 -0
- package/dist/connect/keplergl-connect.d.ts +5 -0
- package/dist/connect/with-local-selector.d.ts +6 -0
- package/dist/constants/action-types.d.ts +111 -0
- package/dist/constants/color-palette.d.ts +491 -0
- package/dist/constants/color-ranges.d.ts +24 -0
- package/dist/constants/custom-color-ranges.d.ts +37 -0
- package/dist/constants/default-settings.d.ts +773 -0
- package/dist/constants/index.d.ts +9 -0
- package/dist/constants/keyevent.d.ts +2 -0
- package/dist/constants/tooltip.d.ts +165 -0
- package/dist/constants/user-feedbacks.d.ts +5 -0
- package/dist/constants/user-guides.d.ts +9 -0
- package/dist/deckgl-layers/3d-building-layer/3d-building-layer.d.ts +13 -0
- package/dist/deckgl-layers/3d-building-layer/3d-building-utils.d.ts +7 -0
- package/dist/deckgl-layers/column-layer/enhanced-column-layer.d.ts +6 -0
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.d.ts +13 -0
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.d.ts +13 -0
- package/dist/deckgl-layers/layer-utils/cluster-utils.d.ts +12 -0
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.d.ts +91 -0
- package/dist/deckgl-layers/layer-utils/shader-utils.d.ts +1 -0
- package/dist/deckgl-layers/line-layer/line-layer.d.ts +12 -0
- package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.d.ts +8 -0
- package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.d.ts +18 -0
- package/dist/index.d.ts +11 -0
- package/dist/layers/aggregation-layer.d.ts +70 -0
- package/dist/layers/arc-layer/arc-layer-icon.d.ts +16 -0
- package/dist/layers/arc-layer/arc-layer.d.ts +143 -0
- package/dist/layers/base-layer.d.ts +436 -0
- package/dist/layers/cluster-layer/cluster-layer-icon.d.ts +16 -0
- package/dist/layers/cluster-layer/cluster-layer.d.ts +39 -0
- package/dist/layers/default-layer-icon.d.ts +14 -0
- package/dist/layers/geojson-layer/geojson-layer-icon.d.ts +15 -0
- package/dist/layers/geojson-layer/geojson-layer.d.ts +230 -0
- package/dist/layers/geojson-layer/geojson-utils.d.ts +44 -0
- package/dist/layers/grid-layer/grid-layer-icon.d.ts +15 -0
- package/dist/layers/grid-layer/grid-layer.d.ts +74 -0
- package/dist/layers/grid-layer/grid-utils.d.ts +24 -0
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.d.ts +16 -0
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.d.ts +170 -0
- package/dist/layers/h3-hexagon-layer/h3-utils.d.ts +20 -0
- package/dist/layers/heatmap-layer/heatmap-layer-icon.d.ts +15 -0
- package/dist/layers/heatmap-layer/heatmap-layer.d.ts +144 -0
- package/dist/layers/hexagon-layer/hexagon-layer-icon.d.ts +15 -0
- package/dist/layers/hexagon-layer/hexagon-layer.d.ts +78 -0
- package/dist/layers/hexagon-layer/hexagon-utils.d.ts +7 -0
- package/dist/layers/icon-layer/icon-info-modal.d.ts +3 -0
- package/dist/layers/icon-layer/icon-layer-icon.d.ts +15 -0
- package/dist/layers/icon-layer/icon-layer.d.ts +119 -0
- package/dist/layers/index.d.ts +53 -0
- package/dist/layers/layer-factory.d.ts +150 -0
- package/dist/layers/layer-text-label.d.ts +7 -0
- package/dist/layers/layer-update.d.ts +9 -0
- package/dist/layers/line-layer/line-layer-icon.d.ts +15 -0
- package/dist/layers/line-layer/line-layer.d.ts +136 -0
- package/dist/layers/mapbox-utils.d.ts +57 -0
- package/dist/layers/mapboxgl-layer.d.ts +87 -0
- package/dist/layers/point-layer/point-layer-icon.d.ts +15 -0
- package/dist/layers/point-layer/point-layer.d.ts +272 -0
- package/dist/layers/s2-geometry-layer/s2-geometry-layer.d.ts +189 -0
- package/dist/layers/s2-geometry-layer/s2-layer-icon.d.ts +15 -0
- package/dist/layers/s2-geometry-layer/s2-utils.d.ts +7 -0
- package/dist/layers/scenegraph-layer/scenegraph-info-modal.d.ts +3 -0
- package/dist/layers/scenegraph-layer/scenegraph-layer-icon.d.ts +15 -0
- package/dist/layers/scenegraph-layer/scenegraph-layer.d.ts +80 -0
- package/dist/layers/trip-layer/trip-info-modal.d.ts +3 -0
- package/dist/layers/trip-layer/trip-layer-icon.d.ts +15 -0
- package/dist/layers/trip-layer/trip-layer.d.ts +157 -0
- package/dist/layers/trip-layer/trip-utils.d.ts +31 -0
- package/dist/layers/types.d.ts +15 -0
- package/dist/localization/formatted-message.d.ts +12 -0
- package/dist/localization/index.d.ts +5 -0
- package/dist/localization/locales.d.ts +27 -0
- package/dist/localization/messages.d.ts +4 -0
- package/dist/localization/translations/ca.d.ts +438 -0
- package/dist/localization/translations/cn.d.ts +441 -0
- package/dist/localization/translations/en.d.ts +466 -0
- package/dist/localization/translations/es.d.ts +438 -0
- package/dist/localization/translations/fi.d.ts +410 -0
- package/dist/localization/translations/ja.d.ts +439 -0
- package/dist/localization/translations/pt.d.ts +410 -0
- package/dist/localization/translations/ru.d.ts +447 -0
- package/dist/middleware/index.d.ts +8 -0
- package/dist/processors/data-processor.d.ts +242 -0
- package/dist/processors/file-handler.d.ts +28 -0
- package/dist/processors/index.d.ts +3 -0
- package/dist/processors/types.d.ts +21 -0
- package/dist/reducers/combined-updaters.d.ts +52 -0
- package/dist/reducers/composer-helpers.d.ts +21 -0
- package/dist/reducers/composers.d.ts +12 -0
- package/dist/reducers/core.d.ts +65 -0
- package/dist/reducers/index.d.ts +19 -0
- package/dist/reducers/map-state-updaters.d.ts +96 -0
- package/dist/reducers/map-state.d.ts +4 -0
- package/dist/reducers/map-style-updaters.d.ts +204 -0
- package/dist/reducers/map-style.d.ts +16 -0
- package/dist/reducers/provider-state-updaters.d.ts +41 -0
- package/dist/reducers/provider-state.d.ts +4 -0
- package/dist/reducers/root.d.ts +24 -0
- package/dist/reducers/types.d.ts +16 -0
- package/dist/reducers/ui-state-updaters.d.ts +434 -0
- package/dist/reducers/ui-state.d.ts +3 -0
- package/dist/reducers/vis-state-merger.d.ts +110 -0
- package/dist/reducers/vis-state-selectors.d.ts +10 -0
- package/dist/reducers/vis-state-updaters.d.ts +645 -0
- package/dist/reducers/vis-state.d.ts +4 -0
- package/dist/schemas/dataset-schema.d.ts +17 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/map-state-schema.d.ts +23 -0
- package/dist/schemas/map-style-schema.d.ts +38 -0
- package/dist/schemas/schema-manager.d.ts +271 -0
- package/dist/schemas/schema-utils.d.ts +11 -0
- package/dist/schemas/schema.d.ts +37 -0
- package/dist/schemas/versions.d.ts +5 -0
- package/dist/schemas/vis-state-schema.d.ts +214 -0
- package/dist/styles/base.d.ts +1530 -0
- package/dist/styles/index.d.ts +2 -0
- package/dist/styles/media-breakpoints.d.ts +13 -0
- package/dist/tasks/tasks.d.ts +15 -0
- package/dist/templates/export-map-html.d.ts +9 -0
- package/dist/utils/aggregate-utils.d.ts +3 -0
- package/dist/utils/color-utils.d.ts +44 -0
- package/dist/utils/data-scale-utils.d.ts +23 -0
- package/dist/utils/data-utils.d.ts +115 -0
- package/dist/utils/dataset-utils.d.ts +38 -0
- package/dist/utils/dom-to-image.d.ts +73 -0
- package/dist/utils/dom-utils.d.ts +20 -0
- package/dist/utils/export-utils.d.ts +56 -0
- package/dist/utils/filter-utils.d.ts +267 -0
- package/dist/utils/gl-utils.d.ts +1 -0
- package/dist/utils/gpu-filter-utils.d.ts +28 -0
- package/dist/utils/index.d.ts +22 -0
- package/dist/utils/interaction-utils.d.ts +36 -0
- package/dist/utils/layer-utils.d.ts +54 -0
- package/dist/utils/locale-utils.d.ts +2 -0
- package/dist/utils/map-info-utils.d.ts +1 -0
- package/dist/utils/map-style-utils/mapbox-gl-style-editor.d.ts +64 -0
- package/dist/utils/map-style-utils/mapbox-utils.d.ts +3 -0
- package/dist/utils/mapbox-utils.d.ts +7 -0
- package/dist/utils/notifications-utils.d.ts +54 -0
- package/dist/utils/observe-dimensions.d.ts +15 -0
- package/dist/utils/projection-utils.d.ts +12 -0
- package/dist/utils/searcher-utils.d.ts +1 -0
- package/dist/utils/split-map-utils.d.ts +29 -0
- package/dist/utils/table-utils/data-container-interface.d.ts +115 -0
- package/dist/utils/table-utils/data-container-utils.d.ts +29 -0
- package/dist/utils/table-utils/data-row.d.ts +59 -0
- package/dist/utils/table-utils/index.d.ts +1 -0
- package/dist/utils/table-utils/indexed-data-container.d.ts +34 -0
- package/dist/utils/table-utils/kepler-table.d.ts +168 -0
- package/dist/utils/table-utils/row-data-container.d.ts +31 -0
- package/dist/utils/utils.d.ts +98 -0
- package/package.json +167 -94
- package/src/actions/action-wrapper.ts +183 -0
- package/src/actions/actions.ts +259 -0
- package/src/actions/identity-actions.ts +116 -0
- package/src/actions/map-state-actions.ts +116 -0
- package/src/actions/map-style-actions.ts +243 -0
- package/src/actions/provider-actions.ts +218 -0
- package/src/actions/ui-state-actions.ts +490 -0
- package/src/actions/vis-state-actions.ts +1279 -0
- package/src/cloud-providers/index.ts +22 -0
- package/src/cloud-providers/provider.ts +276 -0
- package/src/components/bottom-widget.tsx +277 -0
- package/src/components/common/action-panel.tsx +207 -0
- package/src/components/common/animation-control/animation-control.tsx +157 -0
- package/src/components/common/animation-control/animation-controller.ts +250 -0
- package/src/components/common/animation-control/animation-speed-slider.tsx +86 -0
- package/src/components/common/animation-control/floating-time-display.tsx +209 -0
- package/src/components/common/animation-control/playback-controls.tsx +316 -0
- package/src/components/common/animation-control/speed-control.tsx +71 -0
- package/src/components/common/checkbox.tsx +137 -0
- package/src/components/common/color-legend.tsx +203 -0
- package/src/components/common/data-table/button.tsx +54 -0
- package/src/components/common/data-table/cell-size.ts +185 -0
- package/src/components/common/data-table/grid.tsx +57 -0
- package/src/components/common/data-table/index.tsx +693 -0
- package/src/components/common/data-table/option-dropdown.tsx +122 -0
- package/src/components/common/dataset-label.tsx +48 -0
- package/src/components/common/error-boundary.tsx +47 -0
- package/src/components/common/field-selector.tsx +242 -0
- package/src/components/common/field-token.tsx +60 -0
- package/src/components/common/file-uploader/file-drop.tsx +209 -0
- package/src/components/common/file-uploader/file-upload-progress.tsx +123 -0
- package/src/components/common/file-uploader/file-upload.tsx +319 -0
- package/src/components/common/file-uploader/upload-button.tsx +89 -0
- package/src/components/common/histogram-plot.tsx +125 -0
- package/src/components/common/icons/add.tsx +37 -0
- package/src/components/common/icons/anchor_window.tsx +49 -0
- package/src/components/common/icons/arrow-down-alt.tsx +37 -0
- package/src/components/common/icons/arrow-down-solid.tsx +37 -0
- package/src/components/common/icons/arrow-down.tsx +40 -0
- package/src/components/common/icons/arrow-left.tsx +42 -0
- package/src/components/common/icons/arrow-right.tsx +40 -0
- package/src/components/common/icons/arrow-up-alt.tsx +40 -0
- package/src/components/common/icons/arrow-up-solid.tsx +37 -0
- package/src/components/common/icons/arrow-up.tsx +40 -0
- package/src/components/common/icons/base.tsx +95 -0
- package/src/components/common/icons/bug.tsx +40 -0
- package/src/components/common/icons/cancel.tsx +37 -0
- package/src/components/common/icons/checkmark.tsx +39 -0
- package/src/components/common/icons/chevron-right.js +1 -1
- package/src/components/common/icons/clipboard.tsx +40 -0
- package/src/components/common/icons/clock.tsx +38 -0
- package/src/components/common/icons/close.tsx +43 -0
- package/src/components/common/icons/code-alt.tsx +37 -0
- package/src/components/common/icons/copy.tsx +38 -0
- package/src/components/common/icons/crosshairs.tsx +37 -0
- package/src/components/common/icons/cube-3d.tsx +39 -0
- package/src/components/common/icons/cursor-click.tsx +43 -0
- package/src/components/common/icons/data-table.tsx +40 -0
- package/src/components/common/icons/db.tsx +40 -0
- package/src/components/common/icons/delete.tsx +39 -0
- package/src/components/common/icons/docs.tsx +40 -0
- package/src/components/common/icons/drag-n-drop.tsx +38 -0
- package/src/components/common/icons/draw-polygon.tsx +51 -0
- package/src/components/common/icons/email.tsx +39 -0
- package/src/components/common/icons/expand.tsx +39 -0
- package/src/components/common/icons/eye-seen.tsx +38 -0
- package/src/components/common/icons/eye-unseen.tsx +38 -0
- package/src/components/common/icons/file-type.tsx +71 -0
- package/src/components/common/icons/file.tsx +37 -0
- package/src/components/common/icons/files.tsx +37 -0
- package/src/components/common/icons/filter-funnel.tsx +37 -0
- package/src/components/common/icons/free-window.tsx +48 -0
- package/src/components/common/icons/gear.tsx +40 -0
- package/src/components/common/icons/hash.tsx +37 -0
- package/src/components/common/icons/histogram.tsx +42 -0
- package/src/components/common/icons/index.tsx +98 -0
- package/src/components/common/icons/info.tsx +48 -0
- package/src/components/common/icons/layers.tsx +37 -0
- package/src/components/common/icons/left-arrow.tsx +37 -0
- package/src/components/common/icons/legend.tsx +37 -0
- package/src/components/common/icons/line-chart.tsx +40 -0
- package/src/components/common/icons/login.tsx +41 -0
- package/src/components/common/icons/logout.tsx +38 -0
- package/src/components/common/icons/map-icon.tsx +62 -0
- package/src/components/common/icons/map.tsx +62 -0
- package/src/components/common/icons/messages.tsx +37 -0
- package/src/components/common/icons/minus.tsx +39 -0
- package/src/components/common/icons/order-by-dataset.tsx +49 -0
- package/src/components/common/icons/order-by-list.tsx +39 -0
- package/src/components/common/icons/pause.tsx +37 -0
- package/src/components/common/icons/picture.tsx +37 -0
- package/src/components/common/icons/pin.tsx +42 -0
- package/src/components/common/icons/play.tsx +37 -0
- package/src/components/common/icons/polygon.tsx +65 -0
- package/src/components/common/icons/rectangle.tsx +66 -0
- package/src/components/common/icons/reduce.tsx +42 -0
- package/src/components/common/icons/reset.tsx +37 -0
- package/src/components/common/icons/rocket.tsx +37 -0
- package/src/components/common/icons/save.tsx +38 -0
- package/src/components/common/icons/save2.tsx +42 -0
- package/src/components/common/icons/search.tsx +38 -0
- package/src/components/common/icons/settings.tsx +39 -0
- package/src/components/common/icons/share.tsx +37 -0
- package/src/components/common/icons/split.tsx +57 -0
- package/src/components/common/icons/square-select.tsx +38 -0
- package/src/components/common/icons/swap-horizontal.js +1 -1
- package/src/components/common/icons/table.tsx +41 -0
- package/src/components/common/icons/trash.tsx +45 -0
- package/src/components/common/icons/upload.tsx +37 -0
- package/src/components/common/icons/vert-dots.tsx +44 -0
- package/src/components/common/icons/vert-three-dots.tsx +39 -0
- package/src/components/common/icons/warning.tsx +40 -0
- package/src/components/common/image-preview.tsx +118 -0
- package/src/components/common/info-helper.tsx +91 -0
- package/src/components/common/item-selector/accessor.ts +45 -0
- package/src/components/common/item-selector/chickleted-input.tsx +153 -0
- package/src/components/common/item-selector/dropdown-list.tsx +269 -0
- package/src/components/common/item-selector/item-selector-submenu.js +1 -1
- package/src/components/common/item-selector/item-selector.d.ts +24 -27
- package/src/components/common/item-selector/item-selector.tsx +373 -0
- package/src/components/common/item-selector/typeahead.tsx +533 -0
- package/src/components/common/line-chart.tsx +170 -0
- package/src/components/common/loading-spinner.tsx +75 -0
- package/src/components/common/logo.tsx +88 -0
- package/src/components/common/map-layer-selector.tsx +64 -0
- package/src/components/common/modal.tsx +238 -0
- package/src/components/common/portaled.tsx +311 -0
- package/src/components/common/progress-bar.tsx +74 -0
- package/src/components/common/range-brush.tsx +276 -0
- package/src/components/common/range-plot.tsx +145 -0
- package/src/components/common/range-slider.tsx +320 -0
- package/src/components/common/slider/mouse-event.ts +122 -0
- package/src/components/common/slider/slider-bar-handle.tsx +106 -0
- package/src/components/common/slider/slider-handle.tsx +210 -0
- package/src/components/common/slider/slider.tsx +234 -0
- package/src/components/common/styled-components.tsx +714 -0
- package/src/components/common/switch.tsx +47 -0
- package/src/components/common/time-range-slider-time-title.tsx +87 -0
- package/src/components/common/time-range-slider.tsx +171 -0
- package/src/components/common/time-slider-marker.tsx +187 -0
- package/src/components/common/tippy-tooltip.tsx +130 -0
- package/src/components/common/toolbar-item.tsx +99 -0
- package/src/components/common/toolbar.tsx +49 -0
- package/src/components/common/vertical-toolbar.tsx +35 -0
- package/src/components/container.d.ts +8 -0
- package/src/components/container.tsx +189 -0
- package/src/components/context.ts +32 -0
- package/src/components/editor/editor.tsx +234 -0
- package/src/components/editor/feature-action-panel.tsx +155 -0
- package/src/components/editor/feature-styles.ts +76 -0
- package/src/components/editor/handle-style.ts +89 -0
- package/src/components/filters/filter-panels/filter-panel-with-field-select.tsx +118 -0
- package/src/components/filters/filter-panels/multi-select-filter-panel.tsx +63 -0
- package/src/components/filters/filter-panels/new-filter-panel.tsx +100 -0
- package/src/components/filters/filter-panels/polygon-filter-panel.tsx +84 -0
- package/src/components/filters/filter-panels/range-filter-panel.tsx +63 -0
- package/src/components/filters/filter-panels/single-select-filter-panel.tsx +63 -0
- package/src/components/filters/filter-panels/time-range-filter-panel.tsx +92 -0
- package/src/components/filters/filter-panels/types.ts +40 -0
- package/src/components/filters/multi-select-filter.tsx +37 -0
- package/src/components/filters/polygon-filter.tsx +74 -0
- package/src/components/filters/range-filter.tsx +44 -0
- package/src/components/filters/single-select-filter.tsx +50 -0
- package/src/components/filters/time-range-filter.tsx +76 -0
- package/src/components/filters/time-widget.tsx +240 -0
- package/src/components/filters/types.ts +78 -0
- package/src/components/geocoder/geocoder.tsx +307 -0
- package/src/components/geocoder-panel.tsx +199 -0
- package/src/components/index.ts +269 -0
- package/src/components/injector.d.ts +33 -0
- package/src/components/injector.tsx +171 -0
- package/src/components/kepler-gl.d.ts +1 -2
- package/src/components/kepler-gl.tsx +585 -0
- package/src/components/map/coordinate-info.tsx +58 -0
- package/src/components/map/layer-hover-info.tsx +192 -0
- package/src/components/map/layer-selector-panel.tsx +122 -0
- package/src/components/map/locale-panel.tsx +110 -0
- package/src/components/map/map-control-panel.tsx +142 -0
- package/src/components/map/map-control-tooltip.tsx +45 -0
- package/src/components/map/map-control.tsx +138 -0
- package/src/components/map/map-draw-panel.tsx +145 -0
- package/src/components/map/map-legend-panel.tsx +167 -0
- package/src/components/map/map-legend.tsx +284 -0
- package/src/components/map/map-popover.tsx +268 -0
- package/src/components/map/split-map-button.tsx +98 -0
- package/src/components/map/toggle-3d-button.tsx +90 -0
- package/src/components/map-container.tsx +549 -0
- package/src/components/maps-layout.tsx +45 -0
- package/src/components/modal-container.tsx +555 -0
- package/src/components/modals/add-map-style-modal.tsx +304 -0
- package/src/components/modals/cloud-tile.tsx +181 -0
- package/src/components/modals/data-table-modal.tsx +241 -0
- package/src/components/modals/delete-data-modal.tsx +55 -0
- package/src/components/modals/error-display.tsx +43 -0
- package/src/components/modals/export-data-modal.tsx +201 -0
- package/src/components/modals/export-image-modal.tsx +155 -0
- package/src/components/modals/export-map-modal/export-html-map.tsx +164 -0
- package/src/components/modals/export-map-modal/export-json-map.tsx +112 -0
- package/src/components/modals/export-map-modal/export-map-modal.tsx +109 -0
- package/src/components/modals/image-modal-container.tsx +86 -0
- package/src/components/modals/load-data-modal.tsx +120 -0
- package/src/components/modals/load-storage-map.tsx +414 -0
- package/src/components/modals/loading-dialog.tsx +77 -0
- package/src/components/modals/modal-tabs.tsx +137 -0
- package/src/components/modals/overwrite-map-modal.tsx +113 -0
- package/src/components/modals/provider-modal-container.tsx +62 -0
- package/src/components/modals/save-map-modal.tsx +277 -0
- package/src/components/modals/share-map-modal.tsx +217 -0
- package/src/components/modals/status-panel.tsx +106 -0
- package/src/components/modals/storage-map-viewer.tsx +190 -0
- package/src/components/notification-panel/notification-item.tsx +143 -0
- package/src/components/notification-panel.tsx +75 -0
- package/src/components/performance.tsx +105 -0
- package/src/components/plot-container.tsx +243 -0
- package/src/components/side-panel/common/dataset-info.tsx +46 -0
- package/src/components/side-panel/common/dataset-tag.tsx +86 -0
- package/src/components/side-panel/common/dataset-title.tsx +187 -0
- package/src/components/side-panel/common/source-data-catalog.tsx +67 -0
- package/src/components/side-panel/common/source-data-selector.tsx +90 -0
- package/src/components/side-panel/common/types.ts +76 -0
- package/src/components/side-panel/filter-manager.tsx +120 -0
- package/src/components/side-panel/filter-panel/filter-panel-header.tsx +96 -0
- package/src/components/side-panel/filter-panel/filter-panel.tsx +125 -0
- package/src/components/side-panel/interaction-manager.tsx +59 -0
- package/src/components/side-panel/interaction-panel/brush-config.tsx +58 -0
- package/src/components/side-panel/interaction-panel/interaction-panel.tsx +124 -0
- package/src/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.tsx +243 -0
- package/src/components/side-panel/interaction-panel/tooltip-config.tsx +238 -0
- package/src/components/side-panel/layer-manager.tsx +242 -0
- package/src/components/side-panel/layer-panel/add-layer-button.tsx +208 -0
- package/src/components/side-panel/layer-panel/color-dimension-scale-selector.tsx +33 -0
- package/src/components/side-panel/layer-panel/color-palette.tsx +98 -0
- package/src/components/side-panel/layer-panel/color-range-selector.tsx +388 -0
- package/src/components/side-panel/layer-panel/color-selector.tsx +200 -0
- package/src/components/side-panel/layer-panel/column-selector.tsx +102 -0
- package/src/components/side-panel/layer-panel/custom-markers-config-group.tsx +30 -0
- package/src/components/side-panel/layer-panel/custom-palette.tsx +301 -0
- package/src/components/side-panel/layer-panel/custom-picker.tsx +99 -0
- package/src/components/side-panel/layer-panel/dataset-layer-group.tsx +99 -0
- package/src/components/side-panel/layer-panel/dataset-layer-section.tsx +100 -0
- package/src/components/side-panel/layer-panel/dataset-section.tsx +125 -0
- package/src/components/side-panel/layer-panel/dimension-scale-selector.tsx +64 -0
- package/src/components/side-panel/layer-panel/hex-column-config.tsx +53 -0
- package/src/components/side-panel/layer-panel/layer-column-config.tsx +115 -0
- package/src/components/side-panel/layer-panel/layer-config-group.tsx +259 -0
- package/src/components/side-panel/layer-panel/layer-configurator.tsx +1419 -0
- package/src/components/side-panel/layer-panel/layer-list.tsx +193 -0
- package/src/components/side-panel/layer-panel/layer-panel-header.tsx +273 -0
- package/src/components/side-panel/layer-panel/layer-panel.tsx +197 -0
- package/src/components/side-panel/layer-panel/layer-type-dropdown-list.tsx +118 -0
- package/src/components/side-panel/layer-panel/layer-type-list-item.tsx +92 -0
- package/src/components/side-panel/layer-panel/layer-type-selector.tsx +115 -0
- package/src/components/side-panel/layer-panel/layer-visibility-by-zoom.tsx +123 -0
- package/src/components/side-panel/layer-panel/panel-view-list-toggle.tsx +132 -0
- package/src/components/side-panel/layer-panel/single-color-palette.tsx +94 -0
- package/src/components/side-panel/layer-panel/text-label-panel.tsx +189 -0
- package/src/components/side-panel/layer-panel/vis-config-by-field-selector.tsx +187 -0
- package/src/components/side-panel/layer-panel/vis-config-slider.tsx +237 -0
- package/src/components/side-panel/layer-panel/vis-config-switch.tsx +86 -0
- package/src/components/side-panel/map-manager.tsx +123 -0
- package/src/components/side-panel/map-style-panel/map-layer-selector.tsx +145 -0
- package/src/components/side-panel/map-style-panel/map-style-selector.tsx +122 -0
- package/src/components/side-panel/panel-dropdown.tsx +54 -0
- package/src/components/side-panel/panel-header-action.tsx +114 -0
- package/src/components/side-panel/panel-header.tsx +386 -0
- package/src/components/side-panel/panel-tab.tsx +79 -0
- package/src/components/side-panel/panel-title.tsx +35 -0
- package/src/components/side-panel/panel-toggle.tsx +72 -0
- package/src/components/side-panel/side-bar.tsx +141 -0
- package/src/components/side-panel.tsx +261 -0
- package/src/components/types.ts +41 -0
- package/src/connect/keplergl-connect.ts +48 -0
- package/src/connect/with-local-selector.tsx +70 -0
- package/src/constants/action-types.ts +188 -0
- package/src/constants/color-ranges.ts +87 -0
- package/src/constants/default-settings.ts +1051 -0
- package/src/constants/index.ts +84 -0
- package/src/deckgl-layers/3d-building-layer/3d-building-layer.ts +63 -0
- package/src/deckgl-layers/3d-building-layer/3d-building-utils.ts +211 -0
- package/src/deckgl-layers/3d-building-layer/types.ts +29 -0
- package/src/deckgl-layers/column-layer/enhanced-column-layer.ts +63 -0
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.ts +70 -0
- package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.ts +70 -0
- package/src/deckgl-layers/layer-utils/cluster-utils.ts +78 -0
- package/src/deckgl-layers/layer-utils/cpu-aggregator.ts +671 -0
- package/src/deckgl-layers/layer-utils/shader-utils.ts +41 -0
- package/src/deckgl-layers/line-layer/line-layer.ts +126 -0
- package/src/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.ts +68 -0
- package/src/deckgl-layers/svg-icon-layer/svg-icon-layer.ts +102 -0
- package/src/index.ts +54 -0
- package/src/layers/aggregation-layer.ts +400 -0
- package/src/layers/arc-layer/arc-layer-icon.tsx +67 -0
- package/src/layers/arc-layer/arc-layer.ts +294 -0
- package/src/layers/base-layer.ts +1744 -0
- package/src/layers/cluster-layer/cluster-layer.ts +162 -0
- package/src/layers/geojson-layer/geojson-layer-icon.tsx +68 -0
- package/src/layers/geojson-layer/geojson-layer.ts +462 -0
- package/src/layers/geojson-layer/geojson-utils.ts +200 -0
- package/src/layers/grid-layer/grid-layer-icon.tsx +53 -0
- package/src/layers/grid-layer/grid-layer.ts +154 -0
- package/src/layers/grid-layer/grid-utils.ts +84 -0
- package/src/layers/h3-hexagon-layer/h3-hexagon-layer.ts +340 -0
- package/src/layers/h3-hexagon-layer/h3-utils.ts +67 -0
- package/src/layers/heatmap-layer/heatmap-layer.ts +255 -0
- package/src/layers/hexagon-layer/hexagon-layer.ts +157 -0
- package/src/layers/hexagon-layer/hexagon-utils.ts +64 -0
- package/src/layers/icon-layer/icon-info-modal.tsx +155 -0
- package/src/layers/icon-layer/icon-layer.ts +396 -0
- package/src/layers/index.ts +81 -0
- package/src/layers/layer-factory.ts +707 -0
- package/src/layers/layer-text-label.ts +62 -0
- package/src/layers/layer-update.ts +70 -0
- package/src/layers/line-layer/line-layer.ts +223 -0
- package/src/layers/mapbox-utils.ts +204 -0
- package/src/layers/mapboxgl-layer.ts +176 -0
- package/src/layers/point-layer/point-layer.ts +507 -0
- package/src/layers/s2-geometry-layer/s2-geometry-layer.ts +369 -0
- package/src/layers/s2-geometry-layer/s2-utils.ts +42 -0
- package/src/layers/scenegraph-layer/scenegraph-layer.ts +237 -0
- package/src/layers/trip-layer/trip-layer.ts +356 -0
- package/src/layers/trip-layer/trip-utils.ts +177 -0
- package/src/localization/formatted-message.tsx +42 -0
- package/src/localization/index.ts +29 -0
- package/src/localization/locales.ts +53 -0
- package/src/localization/messages.ts +40 -0
- package/src/localization/translations/ca.ts +476 -0
- package/src/localization/translations/cn.ts +477 -0
- package/src/localization/translations/en.ts +504 -0
- package/src/localization/translations/es.ts +477 -0
- package/src/localization/translations/fi.ts +448 -0
- package/src/localization/translations/ja.ts +477 -0
- package/src/localization/translations/pt.ts +449 -0
- package/src/localization/translations/ru.ts +488 -0
- package/src/middleware/index.ts +35 -0
- package/src/processors/data-processor.ts +723 -0
- package/src/processors/file-handler.ts +250 -0
- package/src/processors/index.ts +23 -0
- package/src/processors/types.ts +22 -0
- package/src/reducers/combined-updaters.ts +215 -0
- package/src/reducers/composer-helpers.ts +75 -0
- package/src/reducers/core.ts +111 -0
- package/src/reducers/index.ts +116 -0
- package/src/reducers/map-state-updaters.ts +271 -0
- package/src/reducers/map-state.ts +47 -0
- package/src/reducers/map-style-updaters.ts +638 -0
- package/src/reducers/map-style.ts +53 -0
- package/src/reducers/provider-state-updaters.ts +454 -0
- package/src/reducers/provider-state.ts +53 -0
- package/src/reducers/root.ts +230 -0
- package/src/reducers/types.ts +18 -0
- package/src/reducers/ui-state-updaters.ts +925 -0
- package/src/reducers/ui-state.ts +75 -0
- package/src/reducers/vis-state-merger.ts +625 -0
- package/src/reducers/vis-state-selectors.ts +35 -0
- package/src/reducers/vis-state-updaters.ts +2567 -0
- package/src/reducers/vis-state.ts +157 -0
- package/src/schemas/dataset-schema.ts +141 -0
- package/src/schemas/index.ts +52 -0
- package/src/schemas/schema-manager.ts +445 -0
- package/src/schemas/schema.ts +122 -0
- package/src/schemas/vis-state-schema.ts +761 -0
- package/src/styles/base.ts +1642 -0
- package/src/styles/media-breakpoints.ts +56 -0
- package/src/tasks/tasks.ts +92 -0
- package/src/typedefs/deckgl.d.ts +25 -0
- package/src/utils/aggregate-utils.ts +71 -0
- package/src/utils/color-utils.ts +135 -0
- package/src/utils/data-scale-utils.ts +73 -0
- package/src/utils/data-utils.ts +459 -0
- package/src/utils/dataset-utils.ts +261 -0
- package/src/utils/dom-to-image.ts +533 -0
- package/src/utils/dom-utils.ts +354 -0
- package/src/utils/export-utils.ts +265 -0
- package/src/utils/filter-utils.ts +1181 -0
- package/src/utils/gpu-filter-utils.ts +249 -0
- package/src/utils/index.ts +72 -0
- package/src/utils/interaction-utils.ts +212 -0
- package/src/utils/layer-utils.ts +248 -0
- package/src/utils/map-style-utils/mapbox-gl-style-editor.ts +227 -0
- package/src/utils/notifications-utils.ts +89 -0
- package/src/utils/observe-dimensions.ts +127 -0
- package/src/utils/split-map-utils.ts +104 -0
- package/src/utils/table-utils/data-container-interface.ts +140 -0
- package/src/utils/table-utils/data-container-utils.ts +90 -0
- package/src/utils/table-utils/data-row.ts +110 -0
- package/src/utils/table-utils/indexed-data-container.ts +184 -0
- package/src/utils/table-utils/kepler-table.ts +638 -0
- package/src/utils/table-utils/row-data-container.ts +178 -0
- package/src/utils/utils.ts +228 -0
- package/CHANGELOG.md +0 -979
- package/actions.js +0 -21
- package/cloud-providers.js +0 -21
- package/components.js +0 -21
- package/constants.js +0 -21
- package/dist/actions/action-wrapper.js +0 -190
- package/dist/actions/actions.js +0 -189
- package/dist/actions/identity-actions.js +0 -96
- package/dist/actions/index.js +0 -144
- package/dist/actions/map-state-actions.js +0 -103
- package/dist/actions/map-style-actions.js +0 -152
- package/dist/actions/provider-actions.js +0 -113
- package/dist/actions/ui-state-actions.js +0 -288
- package/dist/actions/vis-state-actions.js +0 -985
- package/dist/cloud-providers/index.js +0 -22
- package/dist/cloud-providers/provider.js +0 -347
- package/dist/components/bottom-widget.js +0 -214
- package/dist/components/common/action-panel.js +0 -135
- package/dist/components/common/animation-control/animation-control.js +0 -128
- package/dist/components/common/animation-control/animation-controller.js +0 -250
- package/dist/components/common/animation-control/animation-speed-slider.js +0 -91
- package/dist/components/common/animation-control/floating-time-display.js +0 -146
- package/dist/components/common/animation-control/playback-controls.js +0 -262
- package/dist/components/common/animation-control/speed-control.js +0 -70
- package/dist/components/common/checkbox.js +0 -134
- package/dist/components/common/color-legend.js +0 -217
- package/dist/components/common/data-table/button.js +0 -53
- package/dist/components/common/data-table/canvas.js +0 -43
- package/dist/components/common/data-table/cell-size.js +0 -170
- package/dist/components/common/data-table/grid.js +0 -83
- package/dist/components/common/data-table/index.js +0 -472
- package/dist/components/common/data-table/option-dropdown.js +0 -99
- package/dist/components/common/dataset-label.js +0 -44
- package/dist/components/common/error-boundary.js +0 -78
- package/dist/components/common/field-selector.js +0 -248
- package/dist/components/common/field-token.js +0 -47
- package/dist/components/common/file-uploader/file-drop.js +0 -212
- package/dist/components/common/file-uploader/file-upload-progress.js +0 -104
- package/dist/components/common/file-uploader/file-upload.js +0 -265
- package/dist/components/common/file-uploader/upload-button.js +0 -100
- package/dist/components/common/histogram-plot.js +0 -107
- package/dist/components/common/icons/add.js +0 -64
- package/dist/components/common/icons/anchor_window.js +0 -56
- package/dist/components/common/icons/arrow-down-alt.js +0 -64
- package/dist/components/common/icons/arrow-down-solid .js +0 -64
- package/dist/components/common/icons/arrow-down.js +0 -64
- package/dist/components/common/icons/arrow-left.js +0 -67
- package/dist/components/common/icons/arrow-right.js +0 -64
- package/dist/components/common/icons/arrow-up-alt.js +0 -65
- package/dist/components/common/icons/arrow-up-solid.js +0 -64
- package/dist/components/common/icons/arrow-up.js +0 -64
- package/dist/components/common/icons/base.js +0 -106
- package/dist/components/common/icons/bug.js +0 -66
- package/dist/components/common/icons/cancel.js +0 -64
- package/dist/components/common/icons/checkmark.js +0 -70
- package/dist/components/common/icons/chevron-right.js +0 -69
- package/dist/components/common/icons/clipboard.js +0 -65
- package/dist/components/common/icons/clock.js +0 -66
- package/dist/components/common/icons/close.js +0 -69
- package/dist/components/common/icons/code-alt.js +0 -67
- package/dist/components/common/icons/copy.js +0 -69
- package/dist/components/common/icons/crosshairs.js +0 -67
- package/dist/components/common/icons/cube-3d.js +0 -68
- package/dist/components/common/icons/cursor-click.js +0 -68
- package/dist/components/common/icons/data-table.js +0 -65
- package/dist/components/common/icons/db.js +0 -65
- package/dist/components/common/icons/delete.js +0 -65
- package/dist/components/common/icons/docs.js +0 -80
- package/dist/components/common/icons/drag-n-drop.js +0 -66
- package/dist/components/common/icons/draw-polygon.js +0 -87
- package/dist/components/common/icons/email.js +0 -68
- package/dist/components/common/icons/expand.js +0 -66
- package/dist/components/common/icons/eye-seen.js +0 -66
- package/dist/components/common/icons/eye-unseen.js +0 -66
- package/dist/components/common/icons/file-type.js +0 -52
- package/dist/components/common/icons/file.js +0 -64
- package/dist/components/common/icons/files.js +0 -64
- package/dist/components/common/icons/filter-funnel.js +0 -64
- package/dist/components/common/icons/free-window.js +0 -56
- package/dist/components/common/icons/gear.js +0 -66
- package/dist/components/common/icons/hash.js +0 -64
- package/dist/components/common/icons/histogram.js +0 -63
- package/dist/components/common/icons/index.js +0 -537
- package/dist/components/common/icons/info.js +0 -77
- package/dist/components/common/icons/layers.js +0 -64
- package/dist/components/common/icons/left-arrow.js +0 -67
- package/dist/components/common/icons/legend.js +0 -64
- package/dist/components/common/icons/line-chart.js +0 -63
- package/dist/components/common/icons/login.js +0 -66
- package/dist/components/common/icons/logout.js +0 -65
- package/dist/components/common/icons/map-icon.js +0 -72
- package/dist/components/common/icons/map.js +0 -72
- package/dist/components/common/icons/messages.js +0 -64
- package/dist/components/common/icons/minus.js +0 -64
- package/dist/components/common/icons/pause.js +0 -64
- package/dist/components/common/icons/picture.js +0 -64
- package/dist/components/common/icons/pin.js +0 -64
- package/dist/components/common/icons/play.js +0 -64
- package/dist/components/common/icons/polygon.js +0 -89
- package/dist/components/common/icons/rectangle.js +0 -90
- package/dist/components/common/icons/reduce.js +0 -67
- package/dist/components/common/icons/reset.js +0 -64
- package/dist/components/common/icons/rocket.js +0 -64
- package/dist/components/common/icons/save.js +0 -66
- package/dist/components/common/icons/save2.js +0 -70
- package/dist/components/common/icons/search.js +0 -66
- package/dist/components/common/icons/settings.js +0 -66
- package/dist/components/common/icons/share.js +0 -64
- package/dist/components/common/icons/split.js +0 -92
- package/dist/components/common/icons/square-select.js +0 -66
- package/dist/components/common/icons/swap-horizontal.js +0 -67
- package/dist/components/common/icons/table.js +0 -63
- package/dist/components/common/icons/trash.js +0 -66
- package/dist/components/common/icons/upload.js +0 -65
- package/dist/components/common/icons/vert-dots.js +0 -102
- package/dist/components/common/icons/vert-three-dots.js +0 -77
- package/dist/components/common/icons/warning.js +0 -78
- package/dist/components/common/image-preview.js +0 -80
- package/dist/components/common/info-helper.js +0 -85
- package/dist/components/common/item-selector/accessor.js +0 -54
- package/dist/components/common/item-selector/chickleted-input.js +0 -116
- package/dist/components/common/item-selector/dropdown-list.js +0 -289
- package/dist/components/common/item-selector/item-selector-submenu.js +0 -90
- package/dist/components/common/item-selector/item-selector.js +0 -315
- package/dist/components/common/item-selector/typeahead.js +0 -450
- package/dist/components/common/line-chart.js +0 -128
- package/dist/components/common/loading-spinner.js +0 -66
- package/dist/components/common/logo.js +0 -94
- package/dist/components/common/map-layer-selector.js +0 -57
- package/dist/components/common/modal.js +0 -179
- package/dist/components/common/portaled.js +0 -276
- package/dist/components/common/progress-bar.js +0 -65
- package/dist/components/common/range-brush.js +0 -278
- package/dist/components/common/range-plot.js +0 -143
- package/dist/components/common/range-slider.js +0 -320
- package/dist/components/common/slider/mouse-event.js +0 -110
- package/dist/components/common/slider/slider-bar-handle.js +0 -114
- package/dist/components/common/slider/slider-handle.js +0 -158
- package/dist/components/common/slider/slider.js +0 -241
- package/dist/components/common/styled-components.js +0 -290
- package/dist/components/common/switch.js +0 -53
- package/dist/components/common/time-range-slider-time-title.js +0 -79
- package/dist/components/common/time-range-slider.js +0 -134
- package/dist/components/common/time-slider-marker.js +0 -136
- package/dist/components/common/toolbar-item.js +0 -73
- package/dist/components/common/toolbar.js +0 -44
- package/dist/components/common/vertical-toolbar.js +0 -33
- package/dist/components/container.js +0 -196
- package/dist/components/context.js +0 -38
- package/dist/components/editor/constants.js +0 -45
- package/dist/components/editor/editor.js +0 -242
- package/dist/components/editor/feature-action-panel.js +0 -146
- package/dist/components/editor/feature-styles.js +0 -67
- package/dist/components/editor/handle-style.js +0 -78
- package/dist/components/filters/components.js +0 -31
- package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +0 -99
- package/dist/components/filters/filter-panels/multi-select-filter-panel.js +0 -73
- package/dist/components/filters/filter-panels/new-filter-panel.js +0 -91
- package/dist/components/filters/filter-panels/polygon-filter-panel.js +0 -90
- package/dist/components/filters/filter-panels/range-filter-panel.js +0 -73
- package/dist/components/filters/filter-panels/single-select-filter-panel.js +0 -73
- package/dist/components/filters/filter-panels/time-range-filter-panel.js +0 -83
- package/dist/components/filters/index.js +0 -42
- package/dist/components/filters/multi-select-filter.js +0 -48
- package/dist/components/filters/polygon-filter.js +0 -86
- package/dist/components/filters/range-filter.js +0 -48
- package/dist/components/filters/single-select-filter.js +0 -57
- package/dist/components/filters/time-range-filter.js +0 -75
- package/dist/components/filters/time-widget.js +0 -163
- package/dist/components/geocoder/geocoder.js +0 -282
- package/dist/components/geocoder-panel.js +0 -199
- package/dist/components/index.js +0 -1343
- package/dist/components/injector.js +0 -162
- package/dist/components/kepler-gl.js +0 -470
- package/dist/components/map/coordinate-info.js +0 -59
- package/dist/components/map/layer-hover-info.js +0 -168
- package/dist/components/map/layer-selector-panel.js +0 -103
- package/dist/components/map/locale-panel.js +0 -99
- package/dist/components/map/map-control-panel.js +0 -82
- package/dist/components/map/map-control-toolbar.js +0 -35
- package/dist/components/map/map-control-tooltip.js +0 -48
- package/dist/components/map/map-control.js +0 -79
- package/dist/components/map/map-draw-panel.js +0 -125
- package/dist/components/map/map-legend-panel.js +0 -107
- package/dist/components/map/map-legend.js +0 -226
- package/dist/components/map/map-popover.js +0 -188
- package/dist/components/map/split-map-button.js +0 -86
- package/dist/components/map/toggle-3d-button.js +0 -75
- package/dist/components/map-container.js +0 -515
- package/dist/components/maps-layout.js +0 -56
- package/dist/components/modal-container.js +0 -484
- package/dist/components/modals/add-map-style-modal.js +0 -258
- package/dist/components/modals/cloud-tile.js +0 -124
- package/dist/components/modals/data-table-modal.js +0 -219
- package/dist/components/modals/delete-data-modal.js +0 -58
- package/dist/components/modals/error-display.js +0 -44
- package/dist/components/modals/export-data-modal.js +0 -210
- package/dist/components/modals/export-image-modal.js +0 -139
- package/dist/components/modals/export-map-modal/components.js +0 -51
- package/dist/components/modals/export-map-modal/export-html-map.js +0 -141
- package/dist/components/modals/export-map-modal/export-json-map.js +0 -87
- package/dist/components/modals/export-map-modal/export-map-modal.js +0 -113
- package/dist/components/modals/image-modal-container.js +0 -83
- package/dist/components/modals/load-data-modal.js +0 -93
- package/dist/components/modals/load-storage-map.js +0 -253
- package/dist/components/modals/loading-dialog.js +0 -54
- package/dist/components/modals/modal-dialog.js +0 -33
- package/dist/components/modals/modal-tabs.js +0 -99
- package/dist/components/modals/overwrite-map-modal.js +0 -81
- package/dist/components/modals/provider-modal-container.js +0 -84
- package/dist/components/modals/save-map-modal.js +0 -202
- package/dist/components/modals/share-map-modal.js +0 -191
- package/dist/components/modals/status-panel.js +0 -82
- package/dist/components/modals/storage-map-viewer.js +0 -122
- package/dist/components/notification-panel/notification-item.js +0 -150
- package/dist/components/notification-panel.js +0 -81
- package/dist/components/performance.js +0 -109
- package/dist/components/plot-container.js +0 -245
- package/dist/components/side-panel/cloud-storage-dropdown.js +0 -57
- package/dist/components/side-panel/common/dataset-info.js +0 -50
- package/dist/components/side-panel/common/dataset-tag.js +0 -51
- package/dist/components/side-panel/common/dataset-title.js +0 -155
- package/dist/components/side-panel/common/source-data-catalog.js +0 -64
- package/dist/components/side-panel/common/source-data-selector.js +0 -114
- package/dist/components/side-panel/custom-panel.js +0 -56
- package/dist/components/side-panel/filter-manager.js +0 -121
- package/dist/components/side-panel/filter-panel/filter-panel-header.js +0 -70
- package/dist/components/side-panel/filter-panel/filter-panel.js +0 -126
- package/dist/components/side-panel/interaction-manager.js +0 -51
- package/dist/components/side-panel/interaction-panel/brush-config.js +0 -58
- package/dist/components/side-panel/interaction-panel/interaction-panel.js +0 -145
- package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +0 -210
- package/dist/components/side-panel/interaction-panel/tooltip-config.js +0 -151
- package/dist/components/side-panel/layer-manager.js +0 -290
- package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +0 -38
- package/dist/components/side-panel/layer-panel/color-palette.js +0 -87
- package/dist/components/side-panel/layer-panel/color-range-selector.js +0 -366
- package/dist/components/side-panel/layer-panel/color-selector.js +0 -198
- package/dist/components/side-panel/layer-panel/column-selector.js +0 -66
- package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +0 -36
- package/dist/components/side-panel/layer-panel/custom-palette.js +0 -284
- package/dist/components/side-panel/layer-panel/custom-picker.js +0 -115
- package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +0 -53
- package/dist/components/side-panel/layer-panel/hex-column-config.js +0 -75
- package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +0 -18
- package/dist/components/side-panel/layer-panel/layer-column-config.js +0 -97
- package/dist/components/side-panel/layer-panel/layer-config-group.js +0 -211
- package/dist/components/side-panel/layer-panel/layer-configurator.js +0 -970
- package/dist/components/side-panel/layer-panel/layer-panel-header.js +0 -208
- package/dist/components/side-panel/layer-panel/layer-panel.js +0 -180
- package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +0 -95
- package/dist/components/side-panel/layer-panel/layer-type-list-item.js +0 -75
- package/dist/components/side-panel/layer-panel/layer-type-selector.js +0 -93
- package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +0 -106
- package/dist/components/side-panel/layer-panel/single-color-palette.js +0 -99
- package/dist/components/side-panel/layer-panel/text-label-panel.js +0 -164
- package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +0 -161
- package/dist/components/side-panel/layer-panel/vis-config-slider.js +0 -81
- package/dist/components/side-panel/layer-panel/vis-config-switch.js +0 -83
- package/dist/components/side-panel/map-manager.js +0 -141
- package/dist/components/side-panel/map-style-panel/map-layer-selector.js +0 -103
- package/dist/components/side-panel/map-style-panel/map-style-selector.js +0 -80
- package/dist/components/side-panel/panel-dropdown.js +0 -79
- package/dist/components/side-panel/panel-header-action.js +0 -116
- package/dist/components/side-panel/panel-header.js +0 -313
- package/dist/components/side-panel/panel-tab.js +0 -72
- package/dist/components/side-panel/panel-title.js +0 -39
- package/dist/components/side-panel/panel-toggle.js +0 -72
- package/dist/components/side-panel/side-bar.js +0 -148
- package/dist/components/side-panel.js +0 -233
- package/dist/connect/keplergl-connect.js +0 -59
- package/dist/connect/with-local-selector.js +0 -105
- package/dist/constants/action-types.js +0 -179
- package/dist/constants/color-palette.js +0 -536
- package/dist/constants/color-ranges.js +0 -81
- package/dist/constants/custom-color-ranges.js +0 -410
- package/dist/constants/default-settings.js +0 -820
- package/dist/constants/index.js +0 -362
- package/dist/constants/keyevent.js +0 -43
- package/dist/constants/tooltip.js +0 -202
- package/dist/constants/user-feedbacks.js +0 -32
- package/dist/constants/user-guides.js +0 -36
- package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +0 -85
- package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +0 -181
- package/dist/deckgl-layers/cluster-layer/cluster-layer.js +0 -313
- package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +0 -75
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +0 -95
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +0 -95
- package/dist/deckgl-layers/layer-utils/cluster-utils.js +0 -108
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +0 -586
- package/dist/deckgl-layers/layer-utils/shader-utils.js +0 -46
- package/dist/deckgl-layers/line-layer/line-layer.js +0 -104
- package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +0 -74
- package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +0 -114
- package/dist/index.js +0 -136
- package/dist/layers/aggregation-layer.js +0 -382
- package/dist/layers/arc-layer/arc-layer-icon.js +0 -77
- package/dist/layers/arc-layer/arc-layer.js +0 -250
- package/dist/layers/base-layer.js +0 -1687
- package/dist/layers/cluster-layer/cluster-layer-icon.js +0 -80
- package/dist/layers/cluster-layer/cluster-layer.js +0 -140
- package/dist/layers/default-layer-icon.js +0 -87
- package/dist/layers/geojson-layer/geojson-layer-icon.js +0 -91
- package/dist/layers/geojson-layer/geojson-layer.js +0 -413
- package/dist/layers/geojson-layer/geojson-utils.js +0 -171
- package/dist/layers/grid-layer/grid-layer-icon.js +0 -136
- package/dist/layers/grid-layer/grid-layer.js +0 -104
- package/dist/layers/grid-layer/grid-utils.js +0 -59
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +0 -71
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +0 -314
- package/dist/layers/h3-hexagon-layer/h3-utils.js +0 -86
- package/dist/layers/heatmap-layer/heatmap-layer-icon.js +0 -88
- package/dist/layers/heatmap-layer/heatmap-layer.js +0 -242
- package/dist/layers/hexagon-layer/hexagon-layer-icon.js +0 -100
- package/dist/layers/hexagon-layer/hexagon-layer.js +0 -108
- package/dist/layers/hexagon-layer/hexagon-utils.js +0 -62
- package/dist/layers/icon-layer/icon-info-modal.js +0 -114
- package/dist/layers/icon-layer/icon-layer-icon.js +0 -73
- package/dist/layers/icon-layer/icon-layer.js +0 -354
- package/dist/layers/index.js +0 -96
- package/dist/layers/layer-factory.js +0 -502
- package/dist/layers/layer-text-label.js +0 -62
- package/dist/layers/layer-update.js +0 -74
- package/dist/layers/line-layer/line-layer-icon.js +0 -79
- package/dist/layers/line-layer/line-layer.js +0 -189
- package/dist/layers/mapbox-utils.js +0 -191
- package/dist/layers/mapboxgl-layer.js +0 -195
- package/dist/layers/point-layer/point-layer-icon.js +0 -94
- package/dist/layers/point-layer/point-layer.js +0 -443
- package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +0 -302
- package/dist/layers/s2-geometry-layer/s2-layer-icon.js +0 -70
- package/dist/layers/s2-geometry-layer/s2-utils.js +0 -45
- package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +0 -54
- package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +0 -151
- package/dist/layers/scenegraph-layer/scenegraph-layer.js +0 -227
- package/dist/layers/trip-layer/trip-info-modal.js +0 -59
- package/dist/layers/trip-layer/trip-layer-icon.js +0 -89
- package/dist/layers/trip-layer/trip-layer.js +0 -361
- package/dist/layers/trip-layer/trip-utils.js +0 -181
- package/dist/layers/types.js +0 -44
- package/dist/localization/en.js +0 -494
- package/dist/localization/formatted-message.js +0 -40
- package/dist/localization/index.js +0 -54
- package/dist/localization/locales.js +0 -59
- package/dist/middleware/index.js +0 -44
- package/dist/processors/data-processor.js +0 -720
- package/dist/processors/file-handler.js +0 -356
- package/dist/processors/index.js +0 -104
- package/dist/reducers/combined-updaters.js +0 -184
- package/dist/reducers/composer-helpers.js +0 -111
- package/dist/reducers/composers.js +0 -40
- package/dist/reducers/core.js +0 -123
- package/dist/reducers/index.js +0 -125
- package/dist/reducers/map-state-updaters.js +0 -227
- package/dist/reducers/map-state.js +0 -52
- package/dist/reducers/map-style-updaters.js +0 -487
- package/dist/reducers/map-style.js +0 -51
- package/dist/reducers/provider-state-updaters.js +0 -466
- package/dist/reducers/provider-state.js +0 -53
- package/dist/reducers/root.js +0 -212
- package/dist/reducers/ui-state-updaters.js +0 -755
- package/dist/reducers/ui-state.js +0 -53
- package/dist/reducers/vis-state-merger.js +0 -565
- package/dist/reducers/vis-state-selectors.js +0 -47
- package/dist/reducers/vis-state-updaters.js +0 -2156
- package/dist/reducers/vis-state.js +0 -53
- package/dist/schemas/dataset-schema.js +0 -169
- package/dist/schemas/index.js +0 -125
- package/dist/schemas/map-state-schema.js +0 -53
- package/dist/schemas/map-style-schema.js +0 -108
- package/dist/schemas/schema-manager.js +0 -244
- package/dist/schemas/schema-utils.js +0 -58
- package/dist/schemas/schema.js +0 -119
- package/dist/schemas/versions.js +0 -34
- package/dist/schemas/vis-state-schema.js +0 -906
- package/dist/styles/base.js +0 -1297
- package/dist/styles/index.js +0 -28
- package/dist/styles/media-breakpoints.js +0 -51
- package/dist/tasks/tasks.js +0 -94
- package/dist/templates/export-map-html.js +0 -42
- package/dist/utils/aggregate-utils.js +0 -71
- package/dist/utils/color-utils.js +0 -129
- package/dist/utils/custom-scales.js +0 -22
- package/dist/utils/data-scale-utils.js +0 -75
- package/dist/utils/data-utils.js +0 -462
- package/dist/utils/dataset-utils.js +0 -237
- package/dist/utils/dom-to-image.js +0 -479
- package/dist/utils/dom-utils.js +0 -343
- package/dist/utils/export-utils.js +0 -260
- package/dist/utils/filter-utils.js +0 -1136
- package/dist/utils/gl-utils.js +0 -43
- package/dist/utils/gpu-filter-utils.js +0 -248
- package/dist/utils/index.js +0 -220
- package/dist/utils/interaction-utils.js +0 -177
- package/dist/utils/layer-utils.js +0 -201
- package/dist/utils/locale-utils.js +0 -56
- package/dist/utils/map-info-utils.js +0 -31
- package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +0 -213
- package/dist/utils/map-style-utils/mapbox-utils.js +0 -33
- package/dist/utils/mapbox-utils.js +0 -36
- package/dist/utils/notifications-utils.js +0 -90
- package/dist/utils/observe-dimensions.js +0 -142
- package/dist/utils/projection-utils.js +0 -72
- package/dist/utils/searcher-utils.js +0 -42
- package/dist/utils/split-map-utils.js +0 -112
- package/dist/utils/table-utils/data-container-utils.js +0 -73
- package/dist/utils/table-utils/data-row.js +0 -71
- package/dist/utils/table-utils/index.js +0 -19
- package/dist/utils/table-utils/indexed-data-container.js +0 -222
- package/dist/utils/table-utils/kepler-table.js +0 -520
- package/dist/utils/table-utils/row-data-container.js +0 -217
- package/dist/utils/utils.js +0 -216
- package/layers.js +0 -21
- package/localization.js +0 -21
- package/middleware.js +0 -21
- package/processors.js +0 -21
- package/reducers.js +0 -21
- package/schemas.js +0 -21
- package/src/actions/action-wrapper.js +0 -183
- package/src/actions/actions.d.ts +0 -104
- package/src/actions/actions.js +0 -178
- package/src/actions/identity-actions.d.ts +0 -53
- package/src/actions/identity-actions.js +0 -83
- package/src/actions/index.d.ts +0 -23
- package/src/actions/map-state-actions.d.ts +0 -46
- package/src/actions/map-state-actions.js +0 -90
- package/src/actions/map-style-actions.d.ts +0 -116
- package/src/actions/map-style-actions.js +0 -135
- package/src/actions/provider-actions.d.ts +0 -203
- package/src/actions/provider-actions.js +0 -94
- package/src/actions/ui-state-actions.d.ts +0 -200
- package/src/actions/ui-state-actions.js +0 -272
- package/src/actions/vis-state-actions.d.ts +0 -502
- package/src/actions/vis-state-actions.js +0 -919
- package/src/cloud-providers/index.d.ts +0 -53
- package/src/cloud-providers/index.js +0 -21
- package/src/cloud-providers/provider.js +0 -233
- package/src/components/bottom-widget.d.ts +0 -33
- package/src/components/bottom-widget.js +0 -235
- package/src/components/common/action-panel.d.ts +0 -24
- package/src/components/common/action-panel.js +0 -177
- package/src/components/common/animation-control/animation-control.js +0 -155
- package/src/components/common/animation-control/animation-controller.js +0 -224
- package/src/components/common/animation-control/animation-speed-slider.js +0 -79
- package/src/components/common/animation-control/floating-time-display.js +0 -192
- package/src/components/common/animation-control/playback-controls.js +0 -278
- package/src/components/common/animation-control/speed-control.js +0 -71
- package/src/components/common/checkbox.js +0 -128
- package/src/components/common/color-legend.js +0 -198
- package/src/components/common/data-table/button.js +0 -47
- package/src/components/common/data-table/cell-size.js +0 -180
- package/src/components/common/data-table/grid.js +0 -55
- package/src/components/common/data-table/index.js +0 -620
- package/src/components/common/data-table/option-dropdown.js +0 -110
- package/src/components/common/dataset-label.js +0 -40
- package/src/components/common/error-boundary.js +0 -43
- package/src/components/common/field-selector.js +0 -233
- package/src/components/common/field-token.js +0 -56
- package/src/components/common/file-uploader/file-drop.d.ts +0 -19
- package/src/components/common/file-uploader/file-drop.js +0 -196
- package/src/components/common/file-uploader/file-upload-progress.d.ts +0 -11
- package/src/components/common/file-uploader/file-upload-progress.js +0 -110
- package/src/components/common/file-uploader/file-upload.d.ts +0 -22
- package/src/components/common/file-uploader/file-upload.js +0 -301
- package/src/components/common/file-uploader/upload-button.d.ts.wip +0 -11
- package/src/components/common/file-uploader/upload-button.js +0 -83
- package/src/components/common/histogram-plot.js +0 -102
- package/src/components/common/icons/add.js +0 -43
- package/src/components/common/icons/anchor_window.js +0 -53
- package/src/components/common/icons/arrow-down-alt.js +0 -43
- package/src/components/common/icons/arrow-down-solid .js +0 -43
- package/src/components/common/icons/arrow-down.js +0 -46
- package/src/components/common/icons/arrow-left.js +0 -48
- package/src/components/common/icons/arrow-right.js +0 -46
- package/src/components/common/icons/arrow-up-alt.js +0 -46
- package/src/components/common/icons/arrow-up-solid.js +0 -43
- package/src/components/common/icons/arrow-up.js +0 -46
- package/src/components/common/icons/base.js +0 -90
- package/src/components/common/icons/bug.js +0 -46
- package/src/components/common/icons/cancel.js +0 -43
- package/src/components/common/icons/checkmark.js +0 -45
- package/src/components/common/icons/clipboard.js +0 -46
- package/src/components/common/icons/clock.js +0 -44
- package/src/components/common/icons/close.js +0 -49
- package/src/components/common/icons/code-alt.js +0 -43
- package/src/components/common/icons/copy.js +0 -44
- package/src/components/common/icons/crosshairs.js +0 -43
- package/src/components/common/icons/cube-3d.js +0 -45
- package/src/components/common/icons/cursor-click.js +0 -49
- package/src/components/common/icons/data-table.js +0 -45
- package/src/components/common/icons/db.js +0 -45
- package/src/components/common/icons/delete.js +0 -44
- package/src/components/common/icons/docs.js +0 -46
- package/src/components/common/icons/drag-n-drop.js +0 -44
- package/src/components/common/icons/draw-polygon.js +0 -60
- package/src/components/common/icons/email.js +0 -45
- package/src/components/common/icons/expand.js +0 -45
- package/src/components/common/icons/eye-seen.js +0 -44
- package/src/components/common/icons/eye-unseen.js +0 -44
- package/src/components/common/icons/file-type.js +0 -57
- package/src/components/common/icons/file.js +0 -43
- package/src/components/common/icons/files.js +0 -42
- package/src/components/common/icons/filter-funnel.js +0 -43
- package/src/components/common/icons/free-window.js +0 -53
- package/src/components/common/icons/gear.js +0 -45
- package/src/components/common/icons/hash.js +0 -43
- package/src/components/common/icons/histogram.js +0 -47
- package/src/components/common/icons/index.js +0 -96
- package/src/components/common/icons/info.js +0 -54
- package/src/components/common/icons/layers.js +0 -43
- package/src/components/common/icons/left-arrow.js +0 -43
- package/src/components/common/icons/legend.js +0 -43
- package/src/components/common/icons/line-chart.js +0 -45
- package/src/components/common/icons/login.js +0 -46
- package/src/components/common/icons/logout.js +0 -43
- package/src/components/common/icons/map-icon.js +0 -69
- package/src/components/common/icons/map.js +0 -69
- package/src/components/common/icons/messages.js +0 -43
- package/src/components/common/icons/minus.js +0 -45
- package/src/components/common/icons/pause.js +0 -43
- package/src/components/common/icons/picture.js +0 -43
- package/src/components/common/icons/pin.js +0 -43
- package/src/components/common/icons/play.js +0 -43
- package/src/components/common/icons/polygon.js +0 -74
- package/src/components/common/icons/rectangle.js +0 -75
- package/src/components/common/icons/reduce.js +0 -48
- package/src/components/common/icons/reset.js +0 -43
- package/src/components/common/icons/rocket.js +0 -43
- package/src/components/common/icons/save.js +0 -44
- package/src/components/common/icons/save2.js +0 -47
- package/src/components/common/icons/search.js +0 -44
- package/src/components/common/icons/settings.js +0 -45
- package/src/components/common/icons/share.js +0 -43
- package/src/components/common/icons/split.js +0 -63
- package/src/components/common/icons/square-select.js +0 -44
- package/src/components/common/icons/table.js +0 -46
- package/src/components/common/icons/trash.js +0 -51
- package/src/components/common/icons/upload.js +0 -44
- package/src/components/common/icons/vert-dots.js +0 -50
- package/src/components/common/icons/vert-three-dots.js +0 -45
- package/src/components/common/icons/warning.js +0 -46
- package/src/components/common/image-preview.js +0 -111
- package/src/components/common/info-helper.js +0 -84
- package/src/components/common/item-selector/accessor.js +0 -45
- package/src/components/common/item-selector/chickleted-input.js +0 -143
- package/src/components/common/item-selector/dropdown-list.js +0 -258
- package/src/components/common/item-selector/item-selector.js +0 -360
- package/src/components/common/item-selector/typeahead.js +0 -507
- package/src/components/common/line-chart.js +0 -134
- package/src/components/common/loading-spinner.js +0 -64
- package/src/components/common/logo.js +0 -92
- package/src/components/common/map-layer-selector.d.ts +0 -10
- package/src/components/common/map-layer-selector.js +0 -54
- package/src/components/common/modal.js +0 -233
- package/src/components/common/portaled.js +0 -264
- package/src/components/common/progress-bar.d.ts +0 -13
- package/src/components/common/progress-bar.js +0 -49
- package/src/components/common/range-brush.js +0 -256
- package/src/components/common/range-plot.js +0 -139
- package/src/components/common/range-slider.js +0 -299
- package/src/components/common/slider/mouse-event.js +0 -97
- package/src/components/common/slider/slider-bar-handle.js +0 -97
- package/src/components/common/slider/slider-handle.js +0 -181
- package/src/components/common/slider/slider.js +0 -213
- package/src/components/common/styled-components.js +0 -657
- package/src/components/common/switch.js +0 -50
- package/src/components/common/time-range-slider-time-title.js +0 -76
- package/src/components/common/time-range-slider.js +0 -163
- package/src/components/common/time-slider-marker.js +0 -168
- package/src/components/common/toolbar-item.d.ts +0 -14
- package/src/components/common/toolbar-item.js +0 -83
- package/src/components/common/toolbar.js +0 -45
- package/src/components/common/vertical-toolbar.js +0 -35
- package/src/components/container.js +0 -173
- package/src/components/context.d.ts +0 -10
- package/src/components/context.js +0 -32
- package/src/components/editor/editor.js +0 -218
- package/src/components/editor/feature-action-panel.js +0 -143
- package/src/components/editor/feature-styles.js +0 -75
- package/src/components/editor/handle-style.js +0 -89
- package/src/components/filters/filter-panels/filter-panel-types.d.ts +0 -28
- package/src/components/filters/filter-panels/filter-panel-with-field-select.js +0 -124
- package/src/components/filters/filter-panels/multi-select-filter-panel.js +0 -75
- package/src/components/filters/filter-panels/new-filter-panel.js +0 -99
- package/src/components/filters/filter-panels/polygon-filter-panel.js +0 -96
- package/src/components/filters/filter-panels/range-filter-panel.js +0 -75
- package/src/components/filters/filter-panels/single-select-filter-panel.js +0 -75
- package/src/components/filters/filter-panels/time-range-filter-panel.js +0 -95
- package/src/components/filters/multi-select-filter.js +0 -36
- package/src/components/filters/polygon-filter.d.ts +0 -13
- package/src/components/filters/polygon-filter.js +0 -73
- package/src/components/filters/range-filter.js +0 -43
- package/src/components/filters/single-select-filter.js +0 -49
- package/src/components/filters/time-range-filter.js +0 -68
- package/src/components/filters/time-widget.js +0 -228
- package/src/components/geocoder/geocoder.d.ts +0 -33
- package/src/components/geocoder/geocoder.js +0 -272
- package/src/components/geocoder-panel.js +0 -191
- package/src/components/index.js +0 -247
- package/src/components/injector.js +0 -161
- package/src/components/kepler-gl.js +0 -518
- package/src/components/map/coordinate-info.js +0 -53
- package/src/components/map/layer-hover-info.d.ts +0 -12
- package/src/components/map/layer-hover-info.js +0 -185
- package/src/components/map/layer-selector-panel.d.ts +0 -16
- package/src/components/map/layer-selector-panel.js +0 -106
- package/src/components/map/locale-panel.d.ts +0 -12
- package/src/components/map/locale-panel.js +0 -91
- package/src/components/map/map-control-panel.d.ts +0 -11
- package/src/components/map/map-control-panel.js +0 -98
- package/src/components/map/map-control-tooltip.d.ts +0 -8
- package/src/components/map/map-control-tooltip.js +0 -40
- package/src/components/map/map-control.d.ts +0 -37
- package/src/components/map/map-control.js +0 -100
- package/src/components/map/map-draw-panel.d.ts +0 -16
- package/src/components/map/map-draw-panel.js +0 -125
- package/src/components/map/map-legend-panel.d.ts +0 -20
- package/src/components/map/map-legend-panel.js +0 -100
- package/src/components/map/map-legend.d.ts +0 -58
- package/src/components/map/map-legend.js +0 -228
- package/src/components/map/map-popover.d.ts +0 -28
- package/src/components/map/map-popover.js +0 -250
- package/src/components/map/split-map-button.d.ts +0 -19
- package/src/components/map/split-map-button.js +0 -82
- package/src/components/map/toggle-3d-button.d.ts +0 -16
- package/src/components/map/toggle-3d-button.js +0 -75
- package/src/components/map-container.d.ts +0 -18
- package/src/components/map-container.js +0 -499
- package/src/components/maps-layout.d.ts +0 -5
- package/src/components/maps-layout.js +0 -40
- package/src/components/modal-container.d.ts +0 -37
- package/src/components/modal-container.js +0 -543
- package/src/components/modals/add-map-style-modal.js +0 -298
- package/src/components/modals/cloud-tile.js +0 -147
- package/src/components/modals/data-table-modal.js +0 -217
- package/src/components/modals/delete-data-modal.js +0 -48
- package/src/components/modals/error-display.js +0 -39
- package/src/components/modals/export-data-modal.js +0 -193
- package/src/components/modals/export-image-modal.d.ts +0 -21
- package/src/components/modals/export-image-modal.js +0 -144
- package/src/components/modals/export-map-modal/export-html-map.d.ts +0 -21
- package/src/components/modals/export-map-modal/export-html-map.js +0 -145
- package/src/components/modals/export-map-modal/export-json-map.js +0 -100
- package/src/components/modals/export-map-modal/export-map-modal.js +0 -114
- package/src/components/modals/image-modal-container.d.ts +0 -13
- package/src/components/modals/image-modal-container.js +0 -76
- package/src/components/modals/load-data-modal.d.ts +0 -30
- package/src/components/modals/load-data-modal.js +0 -94
- package/src/components/modals/load-storage-map.js +0 -381
- package/src/components/modals/loading-dialog.js +0 -69
- package/src/components/modals/modal-tabs.js +0 -126
- package/src/components/modals/overwrite-map-modal.d.ts +0 -18
- package/src/components/modals/overwrite-map-modal.js +0 -97
- package/src/components/modals/provider-modal-container.d.ts +0 -12
- package/src/components/modals/provider-modal-container.js +0 -60
- package/src/components/modals/save-map-modal.d.ts +0 -32
- package/src/components/modals/save-map-modal.js +0 -244
- package/src/components/modals/share-map-modal.js +0 -208
- package/src/components/modals/status-panel.js +0 -95
- package/src/components/modals/storage-map-viewer.js +0 -177
- package/src/components/notification-panel/notification-item.js +0 -132
- package/src/components/notification-panel.js +0 -72
- package/src/components/performance.js +0 -103
- package/src/components/plot-container.js +0 -228
- package/src/components/side-panel/common/dataset-info.js +0 -45
- package/src/components/side-panel/common/dataset-tag.js +0 -55
- package/src/components/side-panel/common/dataset-title.js +0 -146
- package/src/components/side-panel/common/source-data-catalog.js +0 -61
- package/src/components/side-panel/common/source-data-selector.js +0 -79
- package/src/components/side-panel/filter-manager.js +0 -105
- package/src/components/side-panel/filter-panel/filter-panel-header.js +0 -83
- package/src/components/side-panel/filter-panel/filter-panel.js +0 -126
- package/src/components/side-panel/interaction-manager.js +0 -46
- package/src/components/side-panel/interaction-panel/brush-config.js +0 -51
- package/src/components/side-panel/interaction-panel/interaction-panel.js +0 -115
- package/src/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +0 -199
- package/src/components/side-panel/interaction-panel/tooltip-config.js +0 -190
- package/src/components/side-panel/layer-manager.js +0 -290
- package/src/components/side-panel/layer-panel/color-dimension-scale-selector.js +0 -33
- package/src/components/side-panel/layer-panel/color-palette.js +0 -90
- package/src/components/side-panel/layer-panel/color-range-selector.js +0 -359
- package/src/components/side-panel/layer-panel/color-selector.js +0 -196
- package/src/components/side-panel/layer-panel/column-selector.js +0 -70
- package/src/components/side-panel/layer-panel/custom-markers-config-group.js +0 -30
- package/src/components/side-panel/layer-panel/custom-palette.js +0 -296
- package/src/components/side-panel/layer-panel/custom-picker.js +0 -88
- package/src/components/side-panel/layer-panel/dimension-scale-selector.js +0 -48
- package/src/components/side-panel/layer-panel/hex-column-config.js +0 -45
- package/src/components/side-panel/layer-panel/layer-column-config.js +0 -113
- package/src/components/side-panel/layer-panel/layer-config-group.js +0 -237
- package/src/components/side-panel/layer-panel/layer-configurator.js +0 -1412
- package/src/components/side-panel/layer-panel/layer-panel-header.js +0 -236
- package/src/components/side-panel/layer-panel/layer-panel.js +0 -171
- package/src/components/side-panel/layer-panel/layer-type-dropdown-list.js +0 -105
- package/src/components/side-panel/layer-panel/layer-type-list-item.js +0 -83
- package/src/components/side-panel/layer-panel/layer-type-selector.js +0 -89
- package/src/components/side-panel/layer-panel/layer-visibility-by-zoom.js +0 -123
- package/src/components/side-panel/layer-panel/single-color-palette.js +0 -98
- package/src/components/side-panel/layer-panel/text-label-panel.js +0 -179
- package/src/components/side-panel/layer-panel/vis-config-by-field-selector.js +0 -163
- package/src/components/side-panel/layer-panel/vis-config-slider.js +0 -82
- package/src/components/side-panel/layer-panel/vis-config-switch.js +0 -87
- package/src/components/side-panel/map-manager.js +0 -114
- package/src/components/side-panel/map-style-panel/map-layer-selector.js +0 -128
- package/src/components/side-panel/map-style-panel/map-style-selector.js +0 -111
- package/src/components/side-panel/panel-dropdown.js +0 -53
- package/src/components/side-panel/panel-header-action.js +0 -106
- package/src/components/side-panel/panel-header.js +0 -321
- package/src/components/side-panel/panel-tab.js +0 -62
- package/src/components/side-panel/panel-title.js +0 -32
- package/src/components/side-panel/panel-toggle.js +0 -70
- package/src/components/side-panel/side-bar.js +0 -136
- package/src/components/side-panel.d.ts +0 -33
- package/src/components/side-panel.js +0 -253
- package/src/connect/keplergl-connect.js +0 -47
- package/src/connect/with-local-selector.d.ts +0 -11
- package/src/connect/with-local-selector.js +0 -67
- package/src/constants/action-types.d.ts +0 -135
- package/src/constants/action-types.js +0 -184
- package/src/constants/color-ranges.js +0 -72
- package/src/constants/default-settings.js +0 -994
- package/src/constants/index.js +0 -80
- package/src/deckgl-layers/3d-building-layer/3d-building-layer.js +0 -56
- package/src/deckgl-layers/3d-building-layer/3d-building-utils.js +0 -192
- package/src/deckgl-layers/column-layer/enhanced-column-layer.js +0 -63
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +0 -70
- package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +0 -70
- package/src/deckgl-layers/layer-utils/cluster-utils.js +0 -76
- package/src/deckgl-layers/layer-utils/cpu-aggregator.js +0 -583
- package/src/deckgl-layers/layer-utils/shader-utils.js +0 -41
- package/src/deckgl-layers/line-layer/line-layer.js +0 -122
- package/src/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +0 -57
- package/src/deckgl-layers/svg-icon-layer/svg-icon-layer.js +0 -85
- package/src/index.js +0 -52
- package/src/layers/aggregation-layer.js +0 -356
- package/src/layers/arc-layer/arc-layer-icon.js +0 -67
- package/src/layers/arc-layer/arc-layer.js +0 -221
- package/src/layers/base-layer.js +0 -1545
- package/src/layers/cluster-layer/cluster-layer.js +0 -125
- package/src/layers/geojson-layer/geojson-layer-icon.js +0 -68
- package/src/layers/geojson-layer/geojson-layer.js +0 -344
- package/src/layers/geojson-layer/geojson-utils.js +0 -179
- package/src/layers/grid-layer/grid-layer-icon.js +0 -53
- package/src/layers/grid-layer/grid-layer.js +0 -95
- package/src/layers/grid-layer/grid-utils.js +0 -71
- package/src/layers/h3-hexagon-layer/h3-hexagon-layer.js +0 -264
- package/src/layers/h3-hexagon-layer/h3-utils.js +0 -65
- package/src/layers/heatmap-layer/heatmap-layer.js +0 -226
- package/src/layers/hexagon-layer/hexagon-layer.js +0 -95
- package/src/layers/hexagon-layer/hexagon-utils.js +0 -63
- package/src/layers/icon-layer/icon-info-modal.js +0 -155
- package/src/layers/icon-layer/icon-layer.js +0 -324
- package/src/layers/index.d.ts +0 -128
- package/src/layers/index.js +0 -72
- package/src/layers/layer-factory.d.ts +0 -149
- package/src/layers/layer-factory.js +0 -487
- package/src/layers/layer-text-label.js +0 -62
- package/src/layers/layer-update.js +0 -71
- package/src/layers/line-layer/line-layer.js +0 -161
- package/src/layers/mapbox-utils.js +0 -195
- package/src/layers/mapboxgl-layer.js +0 -154
- package/src/layers/point-layer/point-layer.js +0 -412
- package/src/layers/s2-geometry-layer/s2-geometry-layer.js +0 -265
- package/src/layers/s2-geometry-layer/s2-utils.js +0 -36
- package/src/layers/scenegraph-layer/scenegraph-layer.js +0 -182
- package/src/layers/trip-layer/trip-layer.js +0 -295
- package/src/layers/trip-layer/trip-utils.js +0 -169
- package/src/localization/en.js +0 -504
- package/src/localization/formatted-message.js +0 -33
- package/src/localization/index.js +0 -32
- package/src/localization/locales.js +0 -46
- package/src/middleware/index.js +0 -34
- package/src/processors/data-processor.d.ts +0 -57
- package/src/processors/data-processor.js +0 -684
- package/src/processors/file-handler.d.ts +0 -46
- package/src/processors/file-handler.js +0 -220
- package/src/processors/index.js +0 -44
- package/src/reducers/combined-updaters.d.ts +0 -26
- package/src/reducers/combined-updaters.js +0 -198
- package/src/reducers/composer-helpers.d.ts +0 -32
- package/src/reducers/composer-helpers.js +0 -70
- package/src/reducers/core.d.ts +0 -25
- package/src/reducers/core.js +0 -97
- package/src/reducers/index.d.ts +0 -118
- package/src/reducers/index.js +0 -53
- package/src/reducers/map-state-updaters.d.ts +0 -64
- package/src/reducers/map-state-updaters.js +0 -224
- package/src/reducers/map-state.js +0 -47
- package/src/reducers/map-style-updaters.d.ts +0 -76
- package/src/reducers/map-style-updaters.js +0 -541
- package/src/reducers/map-style.js +0 -53
- package/src/reducers/provider-state-updaters.d.ts +0 -88
- package/src/reducers/provider-state-updaters.js +0 -428
- package/src/reducers/provider-state.js +0 -53
- package/src/reducers/root.js +0 -230
- package/src/reducers/types.d.ts +0 -10
- package/src/reducers/ui-state-updaters.d.ts +0 -198
- package/src/reducers/ui-state-updaters.js +0 -766
- package/src/reducers/ui-state.js +0 -73
- package/src/reducers/vis-state-merger.d.ts +0 -78
- package/src/reducers/vis-state-merger.js +0 -557
- package/src/reducers/vis-state-selectors.js +0 -35
- package/src/reducers/vis-state-updaters.d.ts +0 -534
- package/src/reducers/vis-state-updaters.js +0 -2137
- package/src/reducers/vis-state.js +0 -155
- package/src/schemas/dataset-schema.js +0 -141
- package/src/schemas/index.d.ts +0 -24
- package/src/schemas/index.js +0 -42
- package/src/schemas/schema-manager.d.ts +0 -229
- package/src/schemas/schema-manager.js +0 -228
- package/src/schemas/schema.d.ts +0 -47
- package/src/schemas/schema.js +0 -90
- package/src/schemas/versions.d.ts +0 -23
- package/src/schemas/vis-state-schema.js +0 -754
- package/src/styles/base.js +0 -1620
- package/src/styles/media-breakpoints.js +0 -47
- package/src/tasks/tasks.js +0 -92
- package/src/typedefs/README.md +0 -3
- package/src/typedefs/deck.gl__core.d.ts +0 -64
- package/src/typedefs/deck.gl__mesh-layers.d.ts +0 -33
- package/src/utils/aggregate-utils.js +0 -71
- package/src/utils/color-utils.js +0 -115
- package/src/utils/data-scale-utils.d.ts +0 -26
- package/src/utils/data-scale-utils.js +0 -61
- package/src/utils/data-utils.d.ts +0 -46
- package/src/utils/data-utils.js +0 -447
- package/src/utils/dataset-utils.d.ts +0 -10
- package/src/utils/dataset-utils.js +0 -255
- package/src/utils/dom-to-image.js +0 -533
- package/src/utils/dom-utils.js +0 -354
- package/src/utils/export-utils.js +0 -247
- package/src/utils/filter-utils.d.ts +0 -192
- package/src/utils/filter-utils.js +0 -1114
- package/src/utils/gpu-filter-utils.d.ts +0 -28
- package/src/utils/gpu-filter-utils.js +0 -253
- package/src/utils/index.d.ts +0 -5
- package/src/utils/index.js +0 -55
- package/src/utils/interaction-utils.d.ts +0 -36
- package/src/utils/interaction-utils.js +0 -185
- package/src/utils/layer-utils.d.ts +0 -78
- package/src/utils/layer-utils.js +0 -206
- package/src/utils/map-style-utils/mapbox-gl-style-editor.js +0 -201
- package/src/utils/notifications-utils.js +0 -83
- package/src/utils/observe-dimensions.d.ts +0 -18
- package/src/utils/observe-dimensions.js +0 -115
- package/src/utils/split-map-utils.js +0 -104
- package/src/utils/table-utils/data-container-interface.d.ts +0 -140
- package/src/utils/table-utils/data-container-utils.d.ts +0 -43
- package/src/utils/table-utils/data-container-utils.js +0 -61
- package/src/utils/table-utils/data-row.d.ts +0 -65
- package/src/utils/table-utils/data-row.js +0 -54
- package/src/utils/table-utils/index.d.ts +0 -1
- package/src/utils/table-utils/indexed-data-container.d.ts +0 -26
- package/src/utils/table-utils/indexed-data-container.js +0 -152
- package/src/utils/table-utils/kepler-table.d.ts +0 -114
- package/src/utils/table-utils/kepler-table.js +0 -508
- package/src/utils/table-utils/row-data-container.d.ts +0 -30
- package/src/utils/table-utils/row-data-container.js +0 -151
- package/src/utils/utils.js +0 -202
- package/styles.js +0 -21
- /package/src/actions/{index.js → index.ts} +0 -0
- /package/src/components/common/data-table/{canvas.js → canvas.tsx} +0 -0
- /package/src/components/editor/{constants.js → constants.ts} +0 -0
- /package/src/components/filters/{components.js → components.ts} +0 -0
- /package/src/components/filters/{index.js → index.ts} +0 -0
- /package/src/components/map/{map-control-toolbar.js → map-control-toolbar.tsx} +0 -0
- /package/src/components/modals/export-map-modal/{components.js → components.tsx} +0 -0
- /package/src/components/modals/{modal-dialog.js → modal-dialog.tsx} +0 -0
- /package/src/components/side-panel/{cloud-storage-dropdown.js → cloud-storage-dropdown.tsx} +0 -0
- /package/src/components/side-panel/{custom-panel.js → custom-panel.tsx} +0 -0
- /package/src/components/side-panel/layer-panel/{layer-aggregation-resolution.js → layer-aggregation-resolution.tsx} +0 -0
- /package/src/constants/{color-palette.js → color-palette.ts} +0 -0
- /package/src/constants/{custom-color-ranges.js → custom-color-ranges.ts} +0 -0
- /package/src/constants/{keyevent.js → keyevent.ts} +0 -0
- /package/src/constants/{tooltip.js → tooltip.ts} +0 -0
- /package/src/constants/{user-feedbacks.js → user-feedbacks.ts} +0 -0
- /package/src/constants/{user-guides.js → user-guides.ts} +0 -0
- /package/src/layers/cluster-layer/{cluster-layer-icon.js → cluster-layer-icon.tsx} +0 -0
- /package/src/layers/{default-layer-icon.js → default-layer-icon.tsx} +0 -0
- /package/src/layers/h3-hexagon-layer/{h3-hexagon-layer-icon.js → h3-hexagon-layer-icon.tsx} +0 -0
- /package/src/layers/heatmap-layer/{heatmap-layer-icon.js → heatmap-layer-icon.tsx} +0 -0
- /package/src/layers/hexagon-layer/{hexagon-layer-icon.js → hexagon-layer-icon.tsx} +0 -0
- /package/src/layers/icon-layer/{icon-layer-icon.js → icon-layer-icon.tsx} +0 -0
- /package/src/layers/line-layer/{line-layer-icon.js → line-layer-icon.tsx} +0 -0
- /package/src/layers/point-layer/{point-layer-icon.js → point-layer-icon.tsx} +0 -0
- /package/src/layers/s2-geometry-layer/{s2-layer-icon.js → s2-layer-icon.tsx} +0 -0
- /package/src/layers/scenegraph-layer/{scenegraph-info-modal.js → scenegraph-info-modal.tsx} +0 -0
- /package/src/layers/scenegraph-layer/{scenegraph-layer-icon.js → scenegraph-layer-icon.tsx} +0 -0
- /package/src/layers/trip-layer/{trip-info-modal.js → trip-info-modal.tsx} +0 -0
- /package/src/layers/trip-layer/{trip-layer-icon.js → trip-layer-icon.tsx} +0 -0
- /package/src/layers/{types.js → types.ts} +0 -0
- /package/src/reducers/{composers.js → composers.ts} +0 -0
- /package/src/schemas/{map-state-schema.js → map-state-schema.ts} +0 -0
- /package/src/schemas/{map-style-schema.js → map-style-schema.ts} +0 -0
- /package/src/schemas/{schema-utils.js → schema-utils.ts} +0 -0
- /package/src/schemas/{versions.js → versions.ts} +0 -0
- /package/src/styles/{index.js → index.ts} +0 -0
- /package/src/templates/{export-map-html.js → export-map-html.ts} +0 -0
- /package/src/utils/{gl-utils.js → gl-utils.ts} +0 -0
- /package/src/utils/{locale-utils.js → locale-utils.ts} +0 -0
- /package/src/utils/{map-info-utils.js → map-info-utils.ts} +0 -0
- /package/src/utils/map-style-utils/{mapbox-utils.js → mapbox-utils.ts} +0 -0
- /package/src/utils/{mapbox-utils.js → mapbox-utils.ts} +0 -0
- /package/src/utils/{projection-utils.js → projection-utils.ts} +0 -0
- /package/src/utils/{searcher-utils.js → searcher-utils.ts} +0 -0
- /package/src/utils/table-utils/{index.js → index.ts} +0 -0
|
@@ -1,1687 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.layerColors = exports["default"] = exports.colorMaker = exports.OVERLAY_TYPE = exports.LAYER_ID_LENGTH = void 0;
|
|
8
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
12
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
14
|
-
var _window = require("global/window");
|
|
15
|
-
var _keymirror = _interopRequireDefault(require("keymirror"));
|
|
16
|
-
var _extensions = require("@deck.gl/extensions");
|
|
17
|
-
var _core = require("@deck.gl/core");
|
|
18
|
-
var _carto = require("@deck.gl/carto");
|
|
19
|
-
var _defaultLayerIcon = _interopRequireDefault(require("./default-layer-icon"));
|
|
20
|
-
var _layerUpdate = require("./layer-update");
|
|
21
|
-
var _d3Color = require("d3-color");
|
|
22
|
-
var _defaultSettings = require("../constants/default-settings");
|
|
23
|
-
var _colorRanges = require("../constants/color-ranges");
|
|
24
|
-
var _customColorRanges = require("../constants/custom-color-ranges");
|
|
25
|
-
var _layerFactory = require("./layer-factory");
|
|
26
|
-
var _utils = require("../utils/utils");
|
|
27
|
-
var _dataUtils = require("../utils/data-utils");
|
|
28
|
-
var _dataContainerUtils = require("../utils/table-utils/data-container-utils");
|
|
29
|
-
var _colorUtils = require("../utils/color-utils");
|
|
30
|
-
var _layerUtils = require("../utils/layer-utils");
|
|
31
|
-
var _d3Scale = require("d3-scale");
|
|
32
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
33
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
34
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
35
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
36
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
37
|
-
var _marked = /*#__PURE__*/_regenerator["default"].mark(generateColor); // Copyright (c) 2022 Uber Technologies, Inc.
|
|
38
|
-
//
|
|
39
|
-
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
40
|
-
// of this software and associated documentation files (the "Software"), to deal
|
|
41
|
-
// in the Software without restriction, including without limitation the rights
|
|
42
|
-
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
43
|
-
// copies of the Software, and to permit persons to whom the Software is
|
|
44
|
-
// furnished to do so, subject to the following conditions:
|
|
45
|
-
//
|
|
46
|
-
// The above copyright notice and this permission notice shall be included in
|
|
47
|
-
// all copies or substantial portions of the Software.
|
|
48
|
-
//
|
|
49
|
-
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
50
|
-
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
51
|
-
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
52
|
-
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
53
|
-
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
54
|
-
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
55
|
-
// THE SOFTWARE.
|
|
56
|
-
/** @typedef {import('./index').Layer} LayerClass} */
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Approx. number of points to sample in a large data set
|
|
60
|
-
* @type {number}
|
|
61
|
-
*/
|
|
62
|
-
var LAYER_ID_LENGTH = exports.LAYER_ID_LENGTH = 6;
|
|
63
|
-
|
|
64
|
-
// Note, this is is SVG of solid circle encoded as data-uri
|
|
65
|
-
var FALLBACK_ICON = 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNTAiLz4NCjwvc3ZnPg==';
|
|
66
|
-
var MAX_SAMPLE_SIZE = 5000;
|
|
67
|
-
var defaultDomain = [0, 1];
|
|
68
|
-
var dataFilterExtension = new _extensions.DataFilterExtension({
|
|
69
|
-
filterSize: _defaultSettings.MAX_GPU_FILTERS
|
|
70
|
-
});
|
|
71
|
-
var collisionFilterExtension = new _extensions.CollisionFilterExtension();
|
|
72
|
-
var defaultDataAccessor = function defaultDataAccessor(dc) {
|
|
73
|
-
return function (d) {
|
|
74
|
-
return d;
|
|
75
|
-
};
|
|
76
|
-
};
|
|
77
|
-
var defaultGetFieldValue = function defaultGetFieldValue(field, d) {
|
|
78
|
-
return field.valueAccessor(d);
|
|
79
|
-
};
|
|
80
|
-
var scaleIdentity = function scaleIdentity(v) {
|
|
81
|
-
return v;
|
|
82
|
-
};
|
|
83
|
-
var OVERLAY_TYPE = exports.OVERLAY_TYPE = (0, _keymirror["default"])({
|
|
84
|
-
deckgl: null,
|
|
85
|
-
mapboxgl: null
|
|
86
|
-
});
|
|
87
|
-
var layerColors = exports.layerColors = Object.values(_customColorRanges.DataVizColors).map(_colorUtils.hexToRgb);
|
|
88
|
-
function generateColor() {
|
|
89
|
-
var index;
|
|
90
|
-
return _regenerator["default"].wrap(function generateColor$(_context) {
|
|
91
|
-
while (1) switch (_context.prev = _context.next) {
|
|
92
|
-
case 0:
|
|
93
|
-
index = 0;
|
|
94
|
-
case 1:
|
|
95
|
-
if (!(index < layerColors.length + 1)) {
|
|
96
|
-
_context.next = 7;
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
if (index === layerColors.length) {
|
|
100
|
-
index = 0;
|
|
101
|
-
}
|
|
102
|
-
_context.next = 5;
|
|
103
|
-
return layerColors[index++];
|
|
104
|
-
case 5:
|
|
105
|
-
_context.next = 1;
|
|
106
|
-
break;
|
|
107
|
-
case 7:
|
|
108
|
-
case "end":
|
|
109
|
-
return _context.stop();
|
|
110
|
-
}
|
|
111
|
-
}, _marked);
|
|
112
|
-
}
|
|
113
|
-
var colorMaker = exports.colorMaker = generateColor();
|
|
114
|
-
|
|
115
|
-
/** @type {LayerClass} */
|
|
116
|
-
var Layer = /*#__PURE__*/function () {
|
|
117
|
-
function Layer() {
|
|
118
|
-
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
119
|
-
(0, _classCallCheck2["default"])(this, Layer);
|
|
120
|
-
this.id = props.id || (0, _utils.generateHashId)(LAYER_ID_LENGTH);
|
|
121
|
-
// meta
|
|
122
|
-
this.meta = {};
|
|
123
|
-
|
|
124
|
-
// legendSettings
|
|
125
|
-
this.legendSettings = {};
|
|
126
|
-
|
|
127
|
-
// visConfigSettings
|
|
128
|
-
this.visConfigSettings = {};
|
|
129
|
-
|
|
130
|
-
// interactivitySettings
|
|
131
|
-
this._interactivitySettings = {};
|
|
132
|
-
|
|
133
|
-
// @ts-ignore
|
|
134
|
-
this.config = this.getDefaultLayerConfig(_objectSpread({
|
|
135
|
-
columns: this.getLayerColumns()
|
|
136
|
-
}, props));
|
|
137
|
-
}
|
|
138
|
-
(0, _createClass2["default"])(Layer, [{
|
|
139
|
-
key: "layerIcon",
|
|
140
|
-
get: function get() {
|
|
141
|
-
return _defaultLayerIcon["default"];
|
|
142
|
-
}
|
|
143
|
-
}, {
|
|
144
|
-
key: "overlayType",
|
|
145
|
-
get: function get() {
|
|
146
|
-
return OVERLAY_TYPE.deckgl;
|
|
147
|
-
}
|
|
148
|
-
}, {
|
|
149
|
-
key: "type",
|
|
150
|
-
get: function get() {
|
|
151
|
-
return null;
|
|
152
|
-
}
|
|
153
|
-
}, {
|
|
154
|
-
key: "name",
|
|
155
|
-
get: function get() {
|
|
156
|
-
return this.type;
|
|
157
|
-
}
|
|
158
|
-
}, {
|
|
159
|
-
key: "isAggregated",
|
|
160
|
-
get: function get() {
|
|
161
|
-
return false;
|
|
162
|
-
}
|
|
163
|
-
}, {
|
|
164
|
-
key: "requiredLayerColumns",
|
|
165
|
-
get: function get() {
|
|
166
|
-
return [];
|
|
167
|
-
}
|
|
168
|
-
}, {
|
|
169
|
-
key: "optionalColumns",
|
|
170
|
-
get: function get() {
|
|
171
|
-
return [];
|
|
172
|
-
}
|
|
173
|
-
}, {
|
|
174
|
-
key: "noneLayerDataAffectingProps",
|
|
175
|
-
get: function get() {
|
|
176
|
-
return ['label', 'opacity', 'thickness', 'isVisible', 'hidden'];
|
|
177
|
-
}
|
|
178
|
-
}, {
|
|
179
|
-
key: "visualChannels",
|
|
180
|
-
get: function get() {
|
|
181
|
-
return {
|
|
182
|
-
color: {
|
|
183
|
-
property: 'color',
|
|
184
|
-
field: 'colorField',
|
|
185
|
-
scale: 'colorScale',
|
|
186
|
-
domain: 'colorDomain',
|
|
187
|
-
range: 'colorRange',
|
|
188
|
-
key: 'color',
|
|
189
|
-
channelScaleType: _defaultSettings.CHANNEL_SCALES.color,
|
|
190
|
-
nullValue: _defaultSettings.NO_VALUE_COLOR,
|
|
191
|
-
defaultValue: function defaultValue(config) {
|
|
192
|
-
return config.color;
|
|
193
|
-
}
|
|
194
|
-
},
|
|
195
|
-
size: {
|
|
196
|
-
property: 'size',
|
|
197
|
-
field: 'sizeField',
|
|
198
|
-
scale: 'sizeScale',
|
|
199
|
-
domain: 'sizeDomain',
|
|
200
|
-
range: 'sizeRange',
|
|
201
|
-
key: 'size',
|
|
202
|
-
channelScaleType: _defaultSettings.CHANNEL_SCALES.size,
|
|
203
|
-
nullValue: 0,
|
|
204
|
-
defaultValue: 1
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/*
|
|
210
|
-
* Column pairs maps layer column to a specific field pairs,
|
|
211
|
-
* By default, it is set to null
|
|
212
|
-
*/
|
|
213
|
-
}, {
|
|
214
|
-
key: "columnPairs",
|
|
215
|
-
get: function get() {
|
|
216
|
-
return null;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/*
|
|
220
|
-
* Default point column pairs, can be used for point based layers: point, icon etc.
|
|
221
|
-
*/
|
|
222
|
-
}, {
|
|
223
|
-
key: "defaultPointColumnPairs",
|
|
224
|
-
get: function get() {
|
|
225
|
-
return {
|
|
226
|
-
lat: {
|
|
227
|
-
pair: 'lng',
|
|
228
|
-
fieldPairKey: 'lat'
|
|
229
|
-
},
|
|
230
|
-
lng: {
|
|
231
|
-
pair: 'lat',
|
|
232
|
-
fieldPairKey: 'lng'
|
|
233
|
-
}
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/*
|
|
238
|
-
* Default link column pairs, can be used for link based layers: arc, line etc
|
|
239
|
-
*/
|
|
240
|
-
}, {
|
|
241
|
-
key: "defaultLinkColumnPairs",
|
|
242
|
-
get: function get() {
|
|
243
|
-
return {
|
|
244
|
-
lat0: {
|
|
245
|
-
pair: 'lng0',
|
|
246
|
-
fieldPairKey: 'lat'
|
|
247
|
-
},
|
|
248
|
-
lng0: {
|
|
249
|
-
pair: 'lat0',
|
|
250
|
-
fieldPairKey: 'lng'
|
|
251
|
-
},
|
|
252
|
-
lat1: {
|
|
253
|
-
pair: 'lng1',
|
|
254
|
-
fieldPairKey: 'lat'
|
|
255
|
-
},
|
|
256
|
-
lng1: {
|
|
257
|
-
pair: 'lat1',
|
|
258
|
-
fieldPairKey: 'lng'
|
|
259
|
-
}
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Return a React component for to render layer instructions in a modal
|
|
265
|
-
* @returns {object} - an object
|
|
266
|
-
* @example
|
|
267
|
-
* return {
|
|
268
|
-
* id: 'iconInfo',
|
|
269
|
-
* template: IconInfoModal,
|
|
270
|
-
* modalProps: {
|
|
271
|
-
* title: 'How to draw icons'
|
|
272
|
-
* };
|
|
273
|
-
* }
|
|
274
|
-
*/
|
|
275
|
-
}, {
|
|
276
|
-
key: "layerInfoModal",
|
|
277
|
-
get: function get() {
|
|
278
|
-
return null;
|
|
279
|
-
}
|
|
280
|
-
}, {
|
|
281
|
-
key: "interactivitySettings",
|
|
282
|
-
get: function get() {
|
|
283
|
-
return this._interactivitySettings;
|
|
284
|
-
},
|
|
285
|
-
set: function set(interactivitySettings) {
|
|
286
|
-
this._interactivitySettings = interactivitySettings;
|
|
287
|
-
}
|
|
288
|
-
}, {
|
|
289
|
-
key: "hasTooltip",
|
|
290
|
-
get: function get() {
|
|
291
|
-
var _this$interactivitySe, _this$interactivitySe2, _this$interactivitySe3, _this$interactivitySe4;
|
|
292
|
-
return Boolean(((_this$interactivitySe = this.interactivitySettings) === null || _this$interactivitySe === void 0 ? void 0 : (_this$interactivitySe2 = _this$interactivitySe.hover) === null || _this$interactivitySe2 === void 0 ? void 0 : _this$interactivitySe2.fields.length) || ((_this$interactivitySe3 = this.interactivitySettings) === null || _this$interactivitySe3 === void 0 ? void 0 : (_this$interactivitySe4 = _this$interactivitySe3.click) === null || _this$interactivitySe4 === void 0 ? void 0 : _this$interactivitySe4.fields.length));
|
|
293
|
-
}
|
|
294
|
-
}, {
|
|
295
|
-
key: "hasInteractivity",
|
|
296
|
-
get: function get() {
|
|
297
|
-
var _this$interactivitySe5;
|
|
298
|
-
return Boolean(this.hasTooltip && ((_this$interactivitySe5 = this.interactivitySettings) === null || _this$interactivitySe5 === void 0 ? void 0 : _this$interactivitySe5.enabled));
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/*
|
|
302
|
-
* Given a dataset, automatically find props to create layer based on it
|
|
303
|
-
* and return the props and previous found layers.
|
|
304
|
-
* By default, no layers will be found
|
|
305
|
-
*/
|
|
306
|
-
}, {
|
|
307
|
-
key: "getDefaultLayerConfig",
|
|
308
|
-
value: function getDefaultLayerConfig() {
|
|
309
|
-
var _props$visibilityByZo, _props$visibilityByZo2;
|
|
310
|
-
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
311
|
-
return {
|
|
312
|
-
dataId: props.dataId || null,
|
|
313
|
-
visibilityByZoom: {
|
|
314
|
-
min: ((_props$visibilityByZo = props.visibilityByZoom) === null || _props$visibilityByZo === void 0 ? void 0 : _props$visibilityByZo.min) || _defaultSettings.ZOOM_LEVEL_LIMITS.min,
|
|
315
|
-
max: ((_props$visibilityByZo2 = props.visibilityByZoom) === null || _props$visibilityByZo2 === void 0 ? void 0 : _props$visibilityByZo2.max) || _defaultSettings.ZOOM_LEVEL_LIMITS.max
|
|
316
|
-
},
|
|
317
|
-
label: props.label || _layerFactory.DEFAULT_LAYER_LABEL,
|
|
318
|
-
color: props.color || colorMaker.next().value,
|
|
319
|
-
columns: props.columns || null,
|
|
320
|
-
isVisible: props.isVisible || false,
|
|
321
|
-
isConfigActive: props.isConfigActive || false,
|
|
322
|
-
highlightColor: props.highlightColor || _layerFactory.DEFAULT_HIGHLIGHT_COLOR,
|
|
323
|
-
hidden: props.hidden || false,
|
|
324
|
-
// TODO: refactor this into separate visual Channel config
|
|
325
|
-
// color by field, domain is set by filters, field, scale type
|
|
326
|
-
colorField: null,
|
|
327
|
-
colorDomain: [0, 1],
|
|
328
|
-
colorScale: _defaultSettings.SCALE_TYPES.quantile,
|
|
329
|
-
// color by size, domain is set by filters, field, scale type
|
|
330
|
-
sizeDomain: [0, 1],
|
|
331
|
-
sizeScale: _defaultSettings.SCALE_TYPES.linear,
|
|
332
|
-
sizeField: null,
|
|
333
|
-
radiusField: null,
|
|
334
|
-
visConfig: {},
|
|
335
|
-
textLabel: [_layerFactory.DEFAULT_TEXT_LABEL],
|
|
336
|
-
colorUI: {
|
|
337
|
-
color: _layerFactory.DEFAULT_COLOR_UI,
|
|
338
|
-
colorRange: _layerFactory.DEFAULT_COLOR_UI
|
|
339
|
-
},
|
|
340
|
-
animation: {
|
|
341
|
-
enabled: false
|
|
342
|
-
}
|
|
343
|
-
};
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* Get the description of a visualChannel config
|
|
348
|
-
* @param key
|
|
349
|
-
* @returns {{label: string, measure: (string|string)}}
|
|
350
|
-
*/
|
|
351
|
-
}, {
|
|
352
|
-
key: "getVisualChannelDescription",
|
|
353
|
-
value: function getVisualChannelDescription(key) {
|
|
354
|
-
// e.g. label: Color, measure: Vehicle Type
|
|
355
|
-
return {
|
|
356
|
-
label: this.visConfigSettings[this.visualChannels[key].range].label,
|
|
357
|
-
measure: this.config[this.visualChannels[key].field] ? this.config[this.visualChannels[key].field].displayName || this.config[this.visualChannels[key].field].name : this.visualChannels[key].defaultMeasure
|
|
358
|
-
};
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Assign a field to layer column, return column config
|
|
363
|
-
* @param key - Column Key
|
|
364
|
-
* @param field - Selected field
|
|
365
|
-
* @returns {{}} - Column config
|
|
366
|
-
*/
|
|
367
|
-
}, {
|
|
368
|
-
key: "assignColumn",
|
|
369
|
-
value: function assignColumn(key, field) {
|
|
370
|
-
// field value could be null for optional columns
|
|
371
|
-
var update = field ? {
|
|
372
|
-
value: field.name,
|
|
373
|
-
fieldIdx: field.fieldIdx
|
|
374
|
-
} : {
|
|
375
|
-
value: null,
|
|
376
|
-
fieldIdx: -1
|
|
377
|
-
};
|
|
378
|
-
return _objectSpread(_objectSpread({}, this.config.columns), {}, (0, _defineProperty2["default"])({}, key, _objectSpread(_objectSpread({}, this.config.columns[key]), update)));
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
/**
|
|
382
|
-
* Assign a field pair to column config, return column config
|
|
383
|
-
* @param key - Column Key
|
|
384
|
-
* @param pair - field Pair
|
|
385
|
-
* @returns {object} - Column config
|
|
386
|
-
*/
|
|
387
|
-
}, {
|
|
388
|
-
key: "assignColumnPairs",
|
|
389
|
-
value: function assignColumnPairs(key, pair) {
|
|
390
|
-
var _this$columnPairs, _this$columnPairs2, _this$columnPairs3;
|
|
391
|
-
if (!this.columnPairs || !((_this$columnPairs = this.columnPairs) !== null && _this$columnPairs !== void 0 && _this$columnPairs[key])) {
|
|
392
|
-
// should not end in this state
|
|
393
|
-
return this.config.columns;
|
|
394
|
-
}
|
|
395
|
-
var _this$columnPairs$key = (_this$columnPairs2 = this.columnPairs) === null || _this$columnPairs2 === void 0 ? void 0 : _this$columnPairs2[key],
|
|
396
|
-
partnerKey = _this$columnPairs$key.pair,
|
|
397
|
-
fieldPairKey = _this$columnPairs$key.fieldPairKey;
|
|
398
|
-
var _this$columnPairs$par = (_this$columnPairs3 = this.columnPairs) === null || _this$columnPairs3 === void 0 ? void 0 : _this$columnPairs3[partnerKey],
|
|
399
|
-
partnerFieldPairKey = _this$columnPairs$par.fieldPairKey;
|
|
400
|
-
return _objectSpread(_objectSpread({}, this.config.columns), {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, key, pair[fieldPairKey]), partnerKey, pair[partnerFieldPairKey]));
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
/**
|
|
404
|
-
* Calculate a radius zoom multiplier to render points, so they are visible in all zoom level
|
|
405
|
-
* @param {object} mapState
|
|
406
|
-
* @param {number} mapState.zoom - actual zoom
|
|
407
|
-
* @param {number | void} mapState.zoomOffset - zoomOffset when render in the plot container for export image
|
|
408
|
-
* @returns {number}
|
|
409
|
-
*/
|
|
410
|
-
}, {
|
|
411
|
-
key: "getZoomFactor",
|
|
412
|
-
value: function getZoomFactor(_ref) {
|
|
413
|
-
var zoom = _ref.zoom,
|
|
414
|
-
_ref$zoomOffset = _ref.zoomOffset,
|
|
415
|
-
zoomOffset = _ref$zoomOffset === void 0 ? 0 : _ref$zoomOffset;
|
|
416
|
-
return Math.pow(2, Math.max(14 - zoom + zoomOffset, 0));
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
/**
|
|
420
|
-
* Calculate a elevation zoom multiplier to render points, so they are visible in all zoom level
|
|
421
|
-
* @param {object} mapState
|
|
422
|
-
* @param {number} mapState.zoom - actual zoom
|
|
423
|
-
* @param {number | void} mapState.zoomOffset - zoomOffset when render in the plot container for export image
|
|
424
|
-
* @returns {number}
|
|
425
|
-
*/
|
|
426
|
-
}, {
|
|
427
|
-
key: "getElevationZoomFactor",
|
|
428
|
-
value: function getElevationZoomFactor(_ref2) {
|
|
429
|
-
var zoom = _ref2.zoom,
|
|
430
|
-
_ref2$zoomOffset = _ref2.zoomOffset,
|
|
431
|
-
zoomOffset = _ref2$zoomOffset === void 0 ? 0 : _ref2$zoomOffset;
|
|
432
|
-
return this.config.visConfig.enableElevationZoomFactor ? Math.pow(2, Math.max(8 - zoom + zoomOffset, 0)) : 1;
|
|
433
|
-
}
|
|
434
|
-
}, {
|
|
435
|
-
key: "formatLayerData",
|
|
436
|
-
value: function formatLayerData(datasets, filteredIndex) {
|
|
437
|
-
return {};
|
|
438
|
-
}
|
|
439
|
-
}, {
|
|
440
|
-
key: "renderLayer",
|
|
441
|
-
value: function renderLayer() {
|
|
442
|
-
return [];
|
|
443
|
-
}
|
|
444
|
-
}, {
|
|
445
|
-
key: "getHoverData",
|
|
446
|
-
value: function getHoverData(object, dataContainer) {
|
|
447
|
-
if (!object) {
|
|
448
|
-
return null;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// By default, each entry of layerData should have an index of a row in the original data container.
|
|
452
|
-
// Each layer can implement its own getHoverData method
|
|
453
|
-
return dataContainer.row(object.index);
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
/**
|
|
457
|
-
* When change layer type, try to copy over layer configs as much as possible
|
|
458
|
-
* @param configToCopy - config to copy over
|
|
459
|
-
* @param visConfigSettings - visConfig settings of config to copy
|
|
460
|
-
*/
|
|
461
|
-
}, {
|
|
462
|
-
key: "assignConfigToLayer",
|
|
463
|
-
value: function assignConfigToLayer(configToCopy, visConfigSettings) {
|
|
464
|
-
var _this = this;
|
|
465
|
-
// don't deep merge visualChannel field
|
|
466
|
-
// don't deep merge color range, reversed: is not a key by default
|
|
467
|
-
var shallowCopy = ['colorRange', 'strokeColorRange'].concat(Object.values(this.visualChannels).map(function (v) {
|
|
468
|
-
return v.field;
|
|
469
|
-
}));
|
|
470
|
-
|
|
471
|
-
// don't copy over domain and animation
|
|
472
|
-
var notToCopy = ['animation'].concat(Object.values(this.visualChannels).map(function (v) {
|
|
473
|
-
return v.domain;
|
|
474
|
-
}));
|
|
475
|
-
// if range is for the same property group copy it, otherwise, not to copy
|
|
476
|
-
Object.values(this.visualChannels).forEach(function (v) {
|
|
477
|
-
if (configToCopy.visConfig[v.range] && _this.visConfigSettings[v.range] && visConfigSettings[v.range].group !== _this.visConfigSettings[v.range].group) {
|
|
478
|
-
notToCopy.push(v.range);
|
|
479
|
-
}
|
|
480
|
-
});
|
|
481
|
-
|
|
482
|
-
// don't copy over visualChannel range
|
|
483
|
-
var currentConfig = this.config;
|
|
484
|
-
var copied = this.copyLayerConfig(currentConfig, configToCopy, {
|
|
485
|
-
shallowCopy: shallowCopy,
|
|
486
|
-
notToCopy: notToCopy
|
|
487
|
-
});
|
|
488
|
-
this.updateLayerConfig(copied);
|
|
489
|
-
// validate visualChannel field type and scale types
|
|
490
|
-
Object.keys(this.visualChannels).forEach(function (channel) {
|
|
491
|
-
_this.validateVisualChannel(channel);
|
|
492
|
-
});
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
/*
|
|
496
|
-
* Recursively copy config over to an empty layer
|
|
497
|
-
* when received saved config, or copy config over from a different layer type
|
|
498
|
-
* make sure to only copy over value to existing keys
|
|
499
|
-
* @param {object} currentConfig - existing config to be override
|
|
500
|
-
* @param {object} configToCopy - new Config to copy over
|
|
501
|
-
* @param {string[]} shallowCopy - array of properties to not to be deep copied
|
|
502
|
-
* @param {string[]} notToCopy - array of properties not to copy
|
|
503
|
-
* @returns {object} - copied config
|
|
504
|
-
*/
|
|
505
|
-
}, {
|
|
506
|
-
key: "copyLayerConfig",
|
|
507
|
-
value: function copyLayerConfig(currentConfig, configToCopy) {
|
|
508
|
-
var _this2 = this;
|
|
509
|
-
var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
|
|
510
|
-
_ref3$shallowCopy = _ref3.shallowCopy,
|
|
511
|
-
shallowCopy = _ref3$shallowCopy === void 0 ? [] : _ref3$shallowCopy,
|
|
512
|
-
_ref3$notToCopy = _ref3.notToCopy,
|
|
513
|
-
notToCopy = _ref3$notToCopy === void 0 ? [] : _ref3$notToCopy;
|
|
514
|
-
var copied = {};
|
|
515
|
-
Object.keys(currentConfig).forEach(function (key) {
|
|
516
|
-
if ((0, _utils.isPlainObject)(currentConfig[key]) && (0, _utils.isPlainObject)(configToCopy[key]) && !shallowCopy.includes(key) && !notToCopy.includes(key)) {
|
|
517
|
-
// recursively assign object value
|
|
518
|
-
copied[key] = _this2.copyLayerConfig(currentConfig[key], configToCopy[key], {
|
|
519
|
-
shallowCopy: shallowCopy,
|
|
520
|
-
notToCopy: notToCopy
|
|
521
|
-
});
|
|
522
|
-
} else if ((0, _dataUtils.notNullorUndefined)(configToCopy[key]) && !notToCopy.includes(key)) {
|
|
523
|
-
// copy
|
|
524
|
-
copied[key] = configToCopy[key];
|
|
525
|
-
} else {
|
|
526
|
-
// keep existing
|
|
527
|
-
copied[key] = currentConfig[key];
|
|
528
|
-
}
|
|
529
|
-
});
|
|
530
|
-
return copied;
|
|
531
|
-
}
|
|
532
|
-
}, {
|
|
533
|
-
key: "registerVisConfig",
|
|
534
|
-
value: function registerVisConfig(layerVisConfigs) {
|
|
535
|
-
var _this3 = this;
|
|
536
|
-
Object.keys(layerVisConfigs).forEach(function (item) {
|
|
537
|
-
if (typeof item === 'string' && _layerFactory.LAYER_VIS_CONFIGS[layerVisConfigs[item]]) {
|
|
538
|
-
// if assigned one of default LAYER_CONFIGS
|
|
539
|
-
_this3.config.visConfig[item] = _layerFactory.LAYER_VIS_CONFIGS[layerVisConfigs[item]].defaultValue;
|
|
540
|
-
_this3.visConfigSettings[item] = _layerFactory.LAYER_VIS_CONFIGS[layerVisConfigs[item]];
|
|
541
|
-
} else if (['type', 'defaultValue'].every(function (p) {
|
|
542
|
-
return layerVisConfigs[item].hasOwnProperty(p);
|
|
543
|
-
})) {
|
|
544
|
-
// if provided customized visConfig, and has type && defaultValue
|
|
545
|
-
// TODO: further check if customized visConfig is valid
|
|
546
|
-
_this3.config.visConfig[item] = layerVisConfigs[item].defaultValue;
|
|
547
|
-
_this3.visConfigSettings[item] = layerVisConfigs[item];
|
|
548
|
-
}
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
}, {
|
|
552
|
-
key: "getLayerColumns",
|
|
553
|
-
value: function getLayerColumns() {
|
|
554
|
-
var columnValidators = this.columnValidators || {};
|
|
555
|
-
var required = this.requiredLayerColumns.reduce(function (accu, key) {
|
|
556
|
-
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, columnValidators[key] ? {
|
|
557
|
-
value: null,
|
|
558
|
-
fieldIdx: -1,
|
|
559
|
-
validator: columnValidators[key]
|
|
560
|
-
} : {
|
|
561
|
-
value: null,
|
|
562
|
-
fieldIdx: -1
|
|
563
|
-
}));
|
|
564
|
-
}, {});
|
|
565
|
-
var optional = this.optionalColumns.reduce(function (accu, key) {
|
|
566
|
-
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, {
|
|
567
|
-
value: null,
|
|
568
|
-
fieldIdx: -1,
|
|
569
|
-
optional: true
|
|
570
|
-
}));
|
|
571
|
-
}, {});
|
|
572
|
-
return _objectSpread(_objectSpread({}, required), optional);
|
|
573
|
-
}
|
|
574
|
-
}, {
|
|
575
|
-
key: "updateLayerConfig",
|
|
576
|
-
value: function updateLayerConfig(newConfig) {
|
|
577
|
-
this.config = _objectSpread(_objectSpread({}, this.config), newConfig);
|
|
578
|
-
return this;
|
|
579
|
-
}
|
|
580
|
-
}, {
|
|
581
|
-
key: "updateLayerVisConfig",
|
|
582
|
-
value: function updateLayerVisConfig(newVisConfig) {
|
|
583
|
-
this.config.visConfig = _objectSpread(_objectSpread({}, this.config.visConfig), newVisConfig);
|
|
584
|
-
return this;
|
|
585
|
-
}
|
|
586
|
-
}, {
|
|
587
|
-
key: "updateLayerColorUI",
|
|
588
|
-
value: function updateLayerColorUI(prop, newConfig) {
|
|
589
|
-
var _this$config = this.config,
|
|
590
|
-
previous = _this$config.colorUI,
|
|
591
|
-
visConfig = _this$config.visConfig;
|
|
592
|
-
if (!(0, _utils.isPlainObject)(newConfig) || typeof prop !== 'string') {
|
|
593
|
-
return this;
|
|
594
|
-
}
|
|
595
|
-
var colorUIProp = Object.entries(newConfig).reduce(function (accu, _ref4) {
|
|
596
|
-
var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
|
|
597
|
-
key = _ref5[0],
|
|
598
|
-
value = _ref5[1];
|
|
599
|
-
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, (0, _utils.isPlainObject)(accu[key]) && (0, _utils.isPlainObject)(value) ? _objectSpread(_objectSpread({}, accu[key]), value) : value));
|
|
600
|
-
}, previous[prop] || _layerFactory.DEFAULT_COLOR_UI);
|
|
601
|
-
var colorUI = _objectSpread(_objectSpread({}, previous), {}, (0, _defineProperty2["default"])({}, prop, colorUIProp));
|
|
602
|
-
this.updateLayerConfig({
|
|
603
|
-
colorUI: colorUI
|
|
604
|
-
});
|
|
605
|
-
// if colorUI[prop] is colorRange. If type is hexColor then it's also a range
|
|
606
|
-
var isColorRange = visConfig[prop] && (visConfig[prop].colors || visConfig[prop].type === _colorRanges.hexColor);
|
|
607
|
-
if (isColorRange) {
|
|
608
|
-
this.updateColorUIByColorRange(newConfig, prop);
|
|
609
|
-
this.updateColorRangeByColorUI(newConfig, previous, prop);
|
|
610
|
-
this.updateCustomPalette(newConfig, previous, prop);
|
|
611
|
-
}
|
|
612
|
-
return this;
|
|
613
|
-
}
|
|
614
|
-
}, {
|
|
615
|
-
key: "updateCustomPalette",
|
|
616
|
-
value: function updateCustomPalette(newConfig, previous, prop) {
|
|
617
|
-
if (!newConfig.colorRangeConfig || !newConfig.colorRangeConfig.custom) {
|
|
618
|
-
return;
|
|
619
|
-
}
|
|
620
|
-
var _this$config2 = this.config,
|
|
621
|
-
colorUI = _this$config2.colorUI,
|
|
622
|
-
visConfig = _this$config2.visConfig;
|
|
623
|
-
if (!visConfig[prop]) return;
|
|
624
|
-
var colors = visConfig[prop].colors;
|
|
625
|
-
var customPalette = _objectSpread(_objectSpread({}, colorUI[prop].customPalette), {}, {
|
|
626
|
-
name: 'Custom Palette',
|
|
627
|
-
colors: (0, _toConsumableArray2["default"])(colors)
|
|
628
|
-
});
|
|
629
|
-
this.updateLayerConfig({
|
|
630
|
-
colorUI: _objectSpread(_objectSpread({}, colorUI), {}, (0, _defineProperty2["default"])({}, prop, _objectSpread(_objectSpread({}, colorUI[prop]), {}, {
|
|
631
|
-
customPalette: customPalette
|
|
632
|
-
})))
|
|
633
|
-
});
|
|
634
|
-
}
|
|
635
|
-
/**
|
|
636
|
-
* if open dropdown and prop is color range
|
|
637
|
-
* Automatically set colorRangeConfig's step, reversed and type
|
|
638
|
-
* @param {*} newConfig
|
|
639
|
-
* @param {*} prop
|
|
640
|
-
*/
|
|
641
|
-
}, {
|
|
642
|
-
key: "updateColorUIByColorRange",
|
|
643
|
-
value: function updateColorUIByColorRange(newConfig, prop) {
|
|
644
|
-
var _visConfig$prop$color;
|
|
645
|
-
if (typeof newConfig.showDropdown !== 'number') return;
|
|
646
|
-
var _this$config3 = this.config,
|
|
647
|
-
colorUI = _this$config3.colorUI,
|
|
648
|
-
visConfig = _this$config3.visConfig;
|
|
649
|
-
this.updateLayerConfig({
|
|
650
|
-
colorUI: _objectSpread(_objectSpread({}, colorUI), {}, (0, _defineProperty2["default"])({}, prop, _objectSpread(_objectSpread({}, colorUI[prop]), {}, {
|
|
651
|
-
colorRangeConfig: _objectSpread(_objectSpread({}, colorUI[prop].colorRangeConfig), {}, {
|
|
652
|
-
type: visConfig[prop].type,
|
|
653
|
-
steps: (_visConfig$prop$color = visConfig[prop].colors) === null || _visConfig$prop$color === void 0 ? void 0 : _visConfig$prop$color.length,
|
|
654
|
-
reversed: Boolean(visConfig[prop].reversed),
|
|
655
|
-
hexColumn: this.getHexColumn(prop),
|
|
656
|
-
isHexColumn: this.isColoredByColorColumn(prop)
|
|
657
|
-
})
|
|
658
|
-
})))
|
|
659
|
-
});
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
// eslint-disable-next-line complexity
|
|
663
|
-
}, {
|
|
664
|
-
key: "updateColorRangeByColorUI",
|
|
665
|
-
value: function updateColorRangeByColorUI(newConfig, previous, prop) {
|
|
666
|
-
// only update colorRange if changes in UI is made to 'reversed', 'steps' or steps
|
|
667
|
-
var shouldUpdate = newConfig.colorRangeConfig && ['reversed', 'steps'].some(function (key) {
|
|
668
|
-
return newConfig.colorRangeConfig.hasOwnProperty(key) && newConfig.colorRangeConfig[key] !== (previous[prop] || _layerFactory.DEFAULT_COLOR_UI).colorRangeConfig[key];
|
|
669
|
-
});
|
|
670
|
-
if (!shouldUpdate) return;
|
|
671
|
-
var _this$config4 = this.config,
|
|
672
|
-
colorUI = _this$config4.colorUI,
|
|
673
|
-
visConfig = _this$config4.visConfig;
|
|
674
|
-
var _colorUI$prop$colorRa = colorUI[prop].colorRangeConfig,
|
|
675
|
-
steps = _colorUI$prop$colorRa.steps,
|
|
676
|
-
reversed = _colorUI$prop$colorRa.reversed;
|
|
677
|
-
var colorRange = visConfig[prop];
|
|
678
|
-
// find based on step or reversed
|
|
679
|
-
var update;
|
|
680
|
-
if (newConfig.colorRangeConfig.hasOwnProperty('steps')) {
|
|
681
|
-
var group = (0, _colorUtils.getColorGroupByName)(colorRange);
|
|
682
|
-
if (group) {
|
|
683
|
-
var sameGroup = _colorRanges.COLOR_RANGES.filter(function (cr) {
|
|
684
|
-
return (0, _colorUtils.getColorGroupByName)(cr) === group;
|
|
685
|
-
});
|
|
686
|
-
update = sameGroup.find(function (cr) {
|
|
687
|
-
return cr.colors.length === steps;
|
|
688
|
-
});
|
|
689
|
-
if (update && colorRange.reversed) {
|
|
690
|
-
update = (0, _colorUtils.reverseColorRange)(true, update);
|
|
691
|
-
}
|
|
692
|
-
if (update && colorRange.colorMap) {
|
|
693
|
-
update = this.updateColorMap(prop, colorRange.colorMap, update);
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
if (newConfig.colorRangeConfig.hasOwnProperty('reversed')) {
|
|
698
|
-
update = (0, _colorUtils.reverseColorRange)(reversed, update || colorRange);
|
|
699
|
-
}
|
|
700
|
-
if (update) {
|
|
701
|
-
this.updateLayerVisConfig((0, _defineProperty2["default"])({}, prop, update));
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
}, {
|
|
705
|
-
key: "updateColorMap",
|
|
706
|
-
value: function updateColorMap(prop, colorMap, colorRange) {
|
|
707
|
-
var _this$config$field;
|
|
708
|
-
// @ts-ignore
|
|
709
|
-
var _Object$values$find = Object.values(this.visualChannels).find(function (value) {
|
|
710
|
-
return value.range === prop;
|
|
711
|
-
}),
|
|
712
|
-
field = _Object$values$find.field,
|
|
713
|
-
domain = _Object$values$find.domain;
|
|
714
|
-
var type = (_this$config$field = this.config[field]) === null || _this$config$field === void 0 ? void 0 : _this$config$field.type;
|
|
715
|
-
if (type === 'string' || type === 'boolean' || type === 'date') {
|
|
716
|
-
return this.updateCategoryColorMap(colorMap, this.config[domain], colorRange);
|
|
717
|
-
}
|
|
718
|
-
|
|
719
|
-
// If no type or type is not string, boolean or date
|
|
720
|
-
return this.updateNumericColorMap(colorMap, this.config[domain], colorRange);
|
|
721
|
-
}
|
|
722
|
-
}, {
|
|
723
|
-
key: "updateCategoryColorMap",
|
|
724
|
-
value: function updateCategoryColorMap(colorMap, domain, colorRange) {
|
|
725
|
-
var colors = colorRange.colors;
|
|
726
|
-
var assignedCategories = [];
|
|
727
|
-
if (colorRange.type === _colorRanges.hexColor) {
|
|
728
|
-
return _objectSpread(_objectSpread({}, colorRange), {}, {
|
|
729
|
-
colorMap: []
|
|
730
|
-
});
|
|
731
|
-
}
|
|
732
|
-
var newColorMap = colorMap.slice(0, colors.length).map(function (cMap, index) {
|
|
733
|
-
assignedCategories.push(cMap[0]);
|
|
734
|
-
return [cMap[0], colors[index]];
|
|
735
|
-
});
|
|
736
|
-
var unassignedColors = colors.slice(newColorMap.length, colors.length);
|
|
737
|
-
var _iterator = _createForOfIteratorHelper(unassignedColors),
|
|
738
|
-
_step;
|
|
739
|
-
try {
|
|
740
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
741
|
-
var color = _step.value;
|
|
742
|
-
var category = domain.find(function (d) {
|
|
743
|
-
return !assignedCategories.includes(d);
|
|
744
|
-
});
|
|
745
|
-
if (!category) {
|
|
746
|
-
break;
|
|
747
|
-
}
|
|
748
|
-
assignedCategories.push(category);
|
|
749
|
-
newColorMap.push([category, color]);
|
|
750
|
-
}
|
|
751
|
-
} catch (err) {
|
|
752
|
-
_iterator.e(err);
|
|
753
|
-
} finally {
|
|
754
|
-
_iterator.f();
|
|
755
|
-
}
|
|
756
|
-
return _objectSpread(_objectSpread({}, colorRange), {}, {
|
|
757
|
-
colorMap: newColorMap
|
|
758
|
-
});
|
|
759
|
-
}
|
|
760
|
-
}, {
|
|
761
|
-
key: "updateNumericColorMap",
|
|
762
|
-
value: function updateNumericColorMap(colorMap, domain, update) {
|
|
763
|
-
var colors = update.colors;
|
|
764
|
-
var newColorMap = colorMap.slice(0, colors.length);
|
|
765
|
-
newColorMap = newColorMap.map(function (cMap, index) {
|
|
766
|
-
var value = index === newColorMap.length - 1 ? null : cMap[0];
|
|
767
|
-
return [value, colors[index]];
|
|
768
|
-
});
|
|
769
|
-
var unassignedColors = colors.slice(newColorMap.length, colors.length);
|
|
770
|
-
if (unassignedColors.length > 0) {
|
|
771
|
-
var colorMapValues = colorMap.map(function (c) {
|
|
772
|
-
return c[0];
|
|
773
|
-
}).filter(function (c) {
|
|
774
|
-
return typeof c === 'number';
|
|
775
|
-
});
|
|
776
|
-
var maxValue = Math.max.apply(Math, (0, _toConsumableArray2["default"])(colorMapValues).concat([domain[domain.length - 1]]));
|
|
777
|
-
var prevValue = newColorMap[newColorMap.length - 2][0];
|
|
778
|
-
var step = (maxValue - prevValue) / (unassignedColors.length + 1);
|
|
779
|
-
newColorMap[newColorMap.length - 1][0] = prevValue + step;
|
|
780
|
-
var _iterator2 = _createForOfIteratorHelper(unassignedColors.entries()),
|
|
781
|
-
_step2;
|
|
782
|
-
try {
|
|
783
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
784
|
-
var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
|
|
785
|
-
i = _step2$value[0],
|
|
786
|
-
color = _step2$value[1];
|
|
787
|
-
var value = i === unassignedColors.length - 1 ? null : prevValue + step * (i + 2);
|
|
788
|
-
newColorMap.push([value, color]);
|
|
789
|
-
}
|
|
790
|
-
} catch (err) {
|
|
791
|
-
_iterator2.e(err);
|
|
792
|
-
} finally {
|
|
793
|
-
_iterator2.f();
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
return _objectSpread(_objectSpread({}, update), {}, {
|
|
797
|
-
colorMap: newColorMap
|
|
798
|
-
});
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
/**
|
|
802
|
-
* Check whether layer has all columns
|
|
803
|
-
* @returns {boolean} yes or no
|
|
804
|
-
*/
|
|
805
|
-
}, {
|
|
806
|
-
key: "hasAllColumns",
|
|
807
|
-
value: function hasAllColumns() {
|
|
808
|
-
var columns = this.config.columns;
|
|
809
|
-
return columns && Object.values(columns).every(function (v) {
|
|
810
|
-
return Boolean(v.optional || v.value && v.fieldIdx > -1);
|
|
811
|
-
});
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
/**
|
|
815
|
-
* Check whether layer has data
|
|
816
|
-
*
|
|
817
|
-
* @param {Array | Object} layerData
|
|
818
|
-
* @returns {boolean} yes or no
|
|
819
|
-
*/
|
|
820
|
-
}, {
|
|
821
|
-
key: "hasLayerData",
|
|
822
|
-
value: function hasLayerData(layerData) {
|
|
823
|
-
if (!layerData) {
|
|
824
|
-
return false;
|
|
825
|
-
}
|
|
826
|
-
return Boolean(layerData.data && layerData.data.length);
|
|
827
|
-
}
|
|
828
|
-
}, {
|
|
829
|
-
key: "isValidToSave",
|
|
830
|
-
value: function isValidToSave() {
|
|
831
|
-
return this.type && this.hasAllColumns();
|
|
832
|
-
}
|
|
833
|
-
}, {
|
|
834
|
-
key: "shouldRenderLayer",
|
|
835
|
-
value: function shouldRenderLayer(data) {
|
|
836
|
-
return this.type && this.hasAllColumns() && this.hasLayerData(data) && typeof this.renderLayer === 'function';
|
|
837
|
-
}
|
|
838
|
-
}, {
|
|
839
|
-
key: "getColorScale",
|
|
840
|
-
value: function getColorScale(colorScale, colorDomain, colorRange) {
|
|
841
|
-
if (colorRange.type === _colorRanges.hexColor) {
|
|
842
|
-
return function (_, color) {
|
|
843
|
-
var _rgb = (0, _d3Color.rgb)(color),
|
|
844
|
-
r = _rgb.r,
|
|
845
|
-
g = _rgb.g,
|
|
846
|
-
b = _rgb.b;
|
|
847
|
-
return [r, g, b].some(isNaN) ? _defaultSettings.UNKNOWN_COLOR : [r, g, b];
|
|
848
|
-
};
|
|
849
|
-
} else if (Array.isArray(colorRange.colorMap)) {
|
|
850
|
-
var cMap = new Map();
|
|
851
|
-
colorRange.colorMap.forEach(function (_ref6) {
|
|
852
|
-
var _ref7 = (0, _slicedToArray2["default"])(_ref6, 2),
|
|
853
|
-
k = _ref7[0],
|
|
854
|
-
v = _ref7[1];
|
|
855
|
-
cMap.set(k, typeof v === 'string' ? (0, _colorUtils.hexToRgb)(v) : v);
|
|
856
|
-
});
|
|
857
|
-
|
|
858
|
-
// @ts-ignore d3 scale
|
|
859
|
-
var scale = _defaultSettings.SCALE_FUNC[colorScale]().domain(Array.from(cMap.keys())).range(Array.from(cMap.values())).unknown(_defaultSettings.UNKNOWN_COLOR);
|
|
860
|
-
return scale;
|
|
861
|
-
}
|
|
862
|
-
return this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(_colorUtils.hexToRgb));
|
|
863
|
-
}
|
|
864
|
-
}, {
|
|
865
|
-
key: "getCustomMarkersScale",
|
|
866
|
-
value: function getCustomMarkersScale(range, fallbackIcon) {
|
|
867
|
-
var unknownValue = fallbackIcon || FALLBACK_ICON;
|
|
868
|
-
if (!range) {
|
|
869
|
-
return function () {
|
|
870
|
-
return unknownValue;
|
|
871
|
-
};
|
|
872
|
-
}
|
|
873
|
-
var mapping = new Map();
|
|
874
|
-
if (range.othersMarker) {
|
|
875
|
-
unknownValue = range.othersMarker;
|
|
876
|
-
}
|
|
877
|
-
var _iterator3 = _createForOfIteratorHelper(range.markerMap),
|
|
878
|
-
_step3;
|
|
879
|
-
try {
|
|
880
|
-
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
881
|
-
var _step3$value = _step3.value,
|
|
882
|
-
value = _step3$value.value,
|
|
883
|
-
markerUrl = _step3$value.markerUrl;
|
|
884
|
-
if (markerUrl) {
|
|
885
|
-
mapping.set(value, markerUrl);
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
|
|
889
|
-
// @ts-ignore d3 scale
|
|
890
|
-
} catch (err) {
|
|
891
|
-
_iterator3.e(err);
|
|
892
|
-
} finally {
|
|
893
|
-
_iterator3.f();
|
|
894
|
-
}
|
|
895
|
-
var scale = (0, _d3Scale.scaleOrdinal)().domain(Array.from(mapping.keys())).range(Array.from(mapping.values())).unknown(unknownValue);
|
|
896
|
-
return scale;
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
/**
|
|
900
|
-
* Mapping from visual channels to deck.gl accesors
|
|
901
|
-
* @param {Object} param Parameters
|
|
902
|
-
* @param {Function} param.dataAccessor Access kepler.gl layer data from deck.gl layer
|
|
903
|
-
* @param {import('utils/table-utils/data-container-interface').DataContainerInterface} param.dataContainer DataContainer to use use with dataAccessor
|
|
904
|
-
* @return {Object} attributeAccessors - deck.gl layer attribute accessors
|
|
905
|
-
*/
|
|
906
|
-
}, {
|
|
907
|
-
key: "getAttributeAccessors",
|
|
908
|
-
value: function getAttributeAccessors(_ref8) {
|
|
909
|
-
var _this4 = this;
|
|
910
|
-
var _ref8$dataAccessor = _ref8.dataAccessor,
|
|
911
|
-
dataAccessor = _ref8$dataAccessor === void 0 ? defaultDataAccessor : _ref8$dataAccessor,
|
|
912
|
-
dataContainer = _ref8.dataContainer;
|
|
913
|
-
var attributeAccessors = {};
|
|
914
|
-
|
|
915
|
-
// eslint-disable-next-line complexity
|
|
916
|
-
Object.keys(this.visualChannels).forEach(function (channel) {
|
|
917
|
-
var _this4$visualChannels = _this4.visualChannels[channel],
|
|
918
|
-
field = _this4$visualChannels.field,
|
|
919
|
-
fixed = _this4$visualChannels.fixed,
|
|
920
|
-
scale = _this4$visualChannels.scale,
|
|
921
|
-
domain = _this4$visualChannels.domain,
|
|
922
|
-
range = _this4$visualChannels.range,
|
|
923
|
-
accessor = _this4$visualChannels.accessor,
|
|
924
|
-
defaultValue = _this4$visualChannels.defaultValue,
|
|
925
|
-
getAttributeValue = _this4$visualChannels.getAttributeValue,
|
|
926
|
-
nullValue = _this4$visualChannels.nullValue,
|
|
927
|
-
channelScaleType = _this4$visualChannels.channelScaleType,
|
|
928
|
-
aggregation = _this4$visualChannels.aggregation;
|
|
929
|
-
var shouldGetScale = Boolean((scale || channelScaleType === _defaultSettings.CHANNEL_SCALES.identity) && _this4.config[field]);
|
|
930
|
-
if (shouldGetScale) {
|
|
931
|
-
var args = [_this4.config[scale], _this4.config[domain], _this4.config.visConfig[range]];
|
|
932
|
-
var isFixed = fixed && _this4.config.visConfig[fixed];
|
|
933
|
-
// It's important to declare as const all the parameters that we are going to be use in the getEncodedChannelValue call
|
|
934
|
-
// otherwise, the oldLayerData parameter in formatLayerData method will be wrong (you can check the formatLayerData TileLayer method in Builder as example)
|
|
935
|
-
var fieldConfig = _this4.config[field];
|
|
936
|
-
var aggregationValue = _this4.config.visConfig[aggregation];
|
|
937
|
-
var scaleFunction = channelScaleType === _defaultSettings.CHANNEL_SCALES.identity ? scaleIdentity : channelScaleType === _defaultSettings.CHANNEL_SCALES.color ? _this4.getColorScale.apply(_this4, args) : channelScaleType === _defaultSettings.CHANNEL_SCALES.customMarker ? _this4.getCustomMarkersScale(_this4.config.visConfig[range], _this4.config.visConfig.customMarkersUrl) : _this4.getVisChannelScale.apply(_this4, args.concat([isFixed]));
|
|
938
|
-
attributeAccessors[accessor] = function (d) {
|
|
939
|
-
return _this4.getEncodedChannelValue({
|
|
940
|
-
channel: channel,
|
|
941
|
-
dataContainer: dataContainer,
|
|
942
|
-
scale: scaleFunction,
|
|
943
|
-
data: dataAccessor(dataContainer)(d),
|
|
944
|
-
field: fieldConfig,
|
|
945
|
-
_aggregation: aggregationValue,
|
|
946
|
-
nullValue: nullValue
|
|
947
|
-
});
|
|
948
|
-
};
|
|
949
|
-
} else if (typeof getAttributeValue === 'function') {
|
|
950
|
-
attributeAccessors[accessor] = getAttributeValue(_this4.config);
|
|
951
|
-
} else {
|
|
952
|
-
attributeAccessors[accessor] = typeof defaultValue === 'function' ? defaultValue(_this4.config) : defaultValue;
|
|
953
|
-
}
|
|
954
|
-
if (!(accessor in attributeAccessors)) {
|
|
955
|
-
_window.console.warn("Failed to provide accessor function for ".concat(accessor || channel));
|
|
956
|
-
}
|
|
957
|
-
});
|
|
958
|
-
return attributeAccessors;
|
|
959
|
-
}
|
|
960
|
-
}, {
|
|
961
|
-
key: "getVisChannelScale",
|
|
962
|
-
value: function getVisChannelScale(scale, domain, range, fixed) {
|
|
963
|
-
if (scale === _defaultSettings.SCALE_TYPES.ordinal) {
|
|
964
|
-
// @ts-ignore d3-scale type
|
|
965
|
-
return _defaultSettings.SCALE_FUNC[scale]().domain(domain.slice(0, range.length)).range(range).unknown(_defaultSettings.UNKNOWN_COLOR);
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
// for `count` aggregation, we domain is actually `[0, Infinity]` so it doesn't make sense
|
|
969
|
-
// to use it, so skip specyfying this domains
|
|
970
|
-
var domainIsInfinite = domain && domain[0] === 0 && domain[1] === Infinity;
|
|
971
|
-
var scaleFactory = _defaultSettings.SCALE_FUNC[fixed ? 'linear' : scale];
|
|
972
|
-
// @ts-ignore d3-scale type
|
|
973
|
-
var result = scaleFactory();
|
|
974
|
-
if (domain && !domainIsInfinite) {
|
|
975
|
-
result = result.domain(domain);
|
|
976
|
-
}
|
|
977
|
-
return result.range(fixed ? domain : range);
|
|
978
|
-
}
|
|
979
|
-
|
|
980
|
-
/**
|
|
981
|
-
* Get longitude and latitude bounds of the data.
|
|
982
|
-
* @param {import('utils/table-utils/data-container-interface').DataContainerInterface} dataContainer DataContainer to calculate bounds for.
|
|
983
|
-
* @param {(d: {index: number}, dc: import('utils/table-utils/data-container-interface').DataContainerInterface) => number[]} getPosition Access kepler.gl layer data from deck.gl layer
|
|
984
|
-
* @return {number[]|null} bounds of the data.
|
|
985
|
-
*/
|
|
986
|
-
}, {
|
|
987
|
-
key: "getPointsBounds",
|
|
988
|
-
value: function getPointsBounds(dataContainer, getPosition) {
|
|
989
|
-
// no need to loop through the entire dataset
|
|
990
|
-
// get a sample of data to calculate bounds
|
|
991
|
-
var sampleData = dataContainer.numRows() > MAX_SAMPLE_SIZE ? (0, _dataContainerUtils.getSampleData)(dataContainer, MAX_SAMPLE_SIZE) : dataContainer;
|
|
992
|
-
var points = sampleData.mapIndex(getPosition);
|
|
993
|
-
var latBounds = (0, _dataUtils.getLatLngBounds)(points, 1, [-90, 90]);
|
|
994
|
-
var lngBounds = (0, _dataUtils.getLatLngBounds)(points, 0, [-180, 180]);
|
|
995
|
-
if (!latBounds || !lngBounds) {
|
|
996
|
-
return null;
|
|
997
|
-
}
|
|
998
|
-
return [lngBounds[0], latBounds[0], lngBounds[1], latBounds[1]];
|
|
999
|
-
}
|
|
1000
|
-
}, {
|
|
1001
|
-
key: "getChangedTriggers",
|
|
1002
|
-
value: function getChangedTriggers(dataUpdateTriggers) {
|
|
1003
|
-
var triggerChanged = (0, _layerUpdate.diffUpdateTriggers)(dataUpdateTriggers, this._oldDataUpdateTriggers);
|
|
1004
|
-
this._oldDataUpdateTriggers = dataUpdateTriggers;
|
|
1005
|
-
return triggerChanged;
|
|
1006
|
-
}
|
|
1007
|
-
}, {
|
|
1008
|
-
key: "getEncodedChannelValue",
|
|
1009
|
-
value: function getEncodedChannelValue(_ref9) {
|
|
1010
|
-
var channel = _ref9.channel,
|
|
1011
|
-
scale = _ref9.scale,
|
|
1012
|
-
data = _ref9.data,
|
|
1013
|
-
field = _ref9.field,
|
|
1014
|
-
dataContainer = _ref9.dataContainer,
|
|
1015
|
-
_aggregation = _ref9._aggregation,
|
|
1016
|
-
_ref9$nullValue = _ref9.nullValue,
|
|
1017
|
-
nullValue = _ref9$nullValue === void 0 ? _defaultSettings.NO_VALUE_COLOR : _ref9$nullValue,
|
|
1018
|
-
_ref9$getValue = _ref9.getValue,
|
|
1019
|
-
getValue = _ref9$getValue === void 0 ? defaultGetFieldValue : _ref9$getValue;
|
|
1020
|
-
var colorColumnValue;
|
|
1021
|
-
var type = field.type;
|
|
1022
|
-
var value = getValue(field, data);
|
|
1023
|
-
var channelConfig = this.config.visConfig[this.visualChannels[channel].range];
|
|
1024
|
-
var channelField = this.config[this.visualChannels[channel].field];
|
|
1025
|
-
if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.type) === _colorRanges.hexColor) {
|
|
1026
|
-
var columnField = {
|
|
1027
|
-
id: channelField.colorColumn,
|
|
1028
|
-
name: channelField.colorColumn,
|
|
1029
|
-
fieldIdx: channelField.colorColumnIdx,
|
|
1030
|
-
valueAccessor: function valueAccessor(d) {
|
|
1031
|
-
return dataContainer.valueAt(d.index, channelField.colorColumnIdx);
|
|
1032
|
-
}
|
|
1033
|
-
};
|
|
1034
|
-
colorColumnValue = getValue(columnField, data);
|
|
1035
|
-
} else if (!(0, _dataUtils.notNullorUndefined)(value)) {
|
|
1036
|
-
return nullValue;
|
|
1037
|
-
}
|
|
1038
|
-
var attributeValue;
|
|
1039
|
-
if (type === _defaultSettings.ALL_FIELD_TYPES.timestamp) {
|
|
1040
|
-
// shouldn't need to convert here
|
|
1041
|
-
// scale Function should take care of it
|
|
1042
|
-
attributeValue = scale(new Date(value), colorColumnValue);
|
|
1043
|
-
} else {
|
|
1044
|
-
attributeValue = scale(value, colorColumnValue);
|
|
1045
|
-
}
|
|
1046
|
-
if (!(0, _dataUtils.notNullorUndefined)(attributeValue)) {
|
|
1047
|
-
attributeValue = nullValue;
|
|
1048
|
-
}
|
|
1049
|
-
return attributeValue;
|
|
1050
|
-
}
|
|
1051
|
-
}, {
|
|
1052
|
-
key: "updateMeta",
|
|
1053
|
-
value: function updateMeta(meta) {
|
|
1054
|
-
this.meta = _objectSpread(_objectSpread({}, this.meta), meta);
|
|
1055
|
-
}
|
|
1056
|
-
}, {
|
|
1057
|
-
key: "updateLayerLegend",
|
|
1058
|
-
value: function updateLayerLegend(settings) {
|
|
1059
|
-
this.legendSettings = settings;
|
|
1060
|
-
}
|
|
1061
|
-
}, {
|
|
1062
|
-
key: "getDataUpdateTriggers",
|
|
1063
|
-
value: function getDataUpdateTriggers(_ref10) {
|
|
1064
|
-
var filteredIndex = _ref10.filteredIndex,
|
|
1065
|
-
id = _ref10.id,
|
|
1066
|
-
allData = _ref10.allData;
|
|
1067
|
-
var columns = this.config.columns;
|
|
1068
|
-
return _objectSpread({
|
|
1069
|
-
getData: {
|
|
1070
|
-
datasetId: id,
|
|
1071
|
-
allData: allData,
|
|
1072
|
-
columns: columns,
|
|
1073
|
-
filteredIndex: filteredIndex
|
|
1074
|
-
},
|
|
1075
|
-
getMeta: {
|
|
1076
|
-
datasetId: id,
|
|
1077
|
-
allData: allData,
|
|
1078
|
-
columns: columns
|
|
1079
|
-
}
|
|
1080
|
-
}, (this.config.textLabel || []).reduce(function (accu, tl, i) {
|
|
1081
|
-
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, "getLabelCharacterSet-".concat(i), tl.field ? tl.field.name : null));
|
|
1082
|
-
}, {}));
|
|
1083
|
-
}
|
|
1084
|
-
}, {
|
|
1085
|
-
key: "updateData",
|
|
1086
|
-
value: function updateData(datasets, oldLayerData) {
|
|
1087
|
-
if (!this.config.dataId) {
|
|
1088
|
-
return {};
|
|
1089
|
-
}
|
|
1090
|
-
var dataset = this.getDataset(datasets);
|
|
1091
|
-
var dataContainer = dataset.dataContainer;
|
|
1092
|
-
this.updateVisualChannelFields(dataset);
|
|
1093
|
-
this.updateHexColorDomain(dataset);
|
|
1094
|
-
var getPosition = this.getPositionAccessor(dataContainer);
|
|
1095
|
-
var dataUpdateTriggers = this.getDataUpdateTriggers(dataset);
|
|
1096
|
-
var triggerChanged = this.getChangedTriggers(dataUpdateTriggers);
|
|
1097
|
-
if (triggerChanged.getMeta) {
|
|
1098
|
-
this.updateLayerMeta(dataContainer, getPosition);
|
|
1099
|
-
}
|
|
1100
|
-
var data = [];
|
|
1101
|
-
if (!triggerChanged.getData && oldLayerData && oldLayerData.data) {
|
|
1102
|
-
// same data
|
|
1103
|
-
data = oldLayerData.data;
|
|
1104
|
-
} else {
|
|
1105
|
-
data = this.calculateDataAttribute(dataset, getPosition);
|
|
1106
|
-
}
|
|
1107
|
-
return {
|
|
1108
|
-
data: data,
|
|
1109
|
-
triggerChanged: triggerChanged
|
|
1110
|
-
};
|
|
1111
|
-
}
|
|
1112
|
-
|
|
1113
|
-
/**
|
|
1114
|
-
* Update styled fields to match ones from new dataset.
|
|
1115
|
-
*
|
|
1116
|
-
* @param {Object} dataset
|
|
1117
|
-
*/
|
|
1118
|
-
}, {
|
|
1119
|
-
key: "updateVisualChannelFields",
|
|
1120
|
-
value: function updateVisualChannelFields(dataset) {
|
|
1121
|
-
var _this5 = this;
|
|
1122
|
-
var _loop = function _loop() {
|
|
1123
|
-
var _this5$config$visConf;
|
|
1124
|
-
var _Object$values$_i = _Object$values[_i],
|
|
1125
|
-
field = _Object$values$_i.field,
|
|
1126
|
-
range = _Object$values$_i.range;
|
|
1127
|
-
var oldField = _this5.config[field];
|
|
1128
|
-
var isUsingHexColorCode = (_this5$config$visConf = _this5.config.visConfig[range]) === null || _this5$config$visConf === void 0 ? void 0 : _this5$config$visConf.hexColor;
|
|
1129
|
-
if (!oldField) {
|
|
1130
|
-
return {
|
|
1131
|
-
v: void 0
|
|
1132
|
-
};
|
|
1133
|
-
}
|
|
1134
|
-
var newDataSetField = dataset.fields.find(function (fd) {
|
|
1135
|
-
return fd.name === oldField.name;
|
|
1136
|
-
}) || null;
|
|
1137
|
-
if (isUsingHexColorCode) {
|
|
1138
|
-
newDataSetField = _objectSpread(_objectSpread({}, newDataSetField), {}, {
|
|
1139
|
-
colorColumn: newDataSetField.colorColumn || oldField.colorColumn,
|
|
1140
|
-
colorColumnIdx: newDataSetField.colorColumnIdx || oldField.colorColumnIdx
|
|
1141
|
-
});
|
|
1142
|
-
}
|
|
1143
|
-
_this5.updateLayerConfig((0, _defineProperty2["default"])({}, field, newDataSetField));
|
|
1144
|
-
},
|
|
1145
|
-
_ret;
|
|
1146
|
-
for (var _i = 0, _Object$values = Object.values(this.visualChannels); _i < _Object$values.length; _i++) {
|
|
1147
|
-
_ret = _loop();
|
|
1148
|
-
if (_ret) return _ret.v;
|
|
1149
|
-
}
|
|
1150
|
-
}
|
|
1151
|
-
|
|
1152
|
-
/**
|
|
1153
|
-
* helper function to update one layer domain when state.data changed
|
|
1154
|
-
* if state.data change is due ot update filter, newFiler will be passed
|
|
1155
|
-
* called by updateAllLayerDomainData
|
|
1156
|
-
* @param {Object} datasets
|
|
1157
|
-
* @param {Object} newFilter
|
|
1158
|
-
* @returns {object} layer
|
|
1159
|
-
*/
|
|
1160
|
-
}, {
|
|
1161
|
-
key: "updateLayerDomain",
|
|
1162
|
-
value: function updateLayerDomain(datasets, newFilter) {
|
|
1163
|
-
var _this6 = this;
|
|
1164
|
-
var table = this.getDataset(datasets);
|
|
1165
|
-
if (!table) {
|
|
1166
|
-
return this;
|
|
1167
|
-
}
|
|
1168
|
-
Object.values(this.visualChannels).forEach(function (channel) {
|
|
1169
|
-
var scale = channel.scale;
|
|
1170
|
-
var scaleType = _this6.config[scale];
|
|
1171
|
-
|
|
1172
|
-
// ordinal domain is based on dataContainer, if only filter changed
|
|
1173
|
-
// no need to update ordinal domain
|
|
1174
|
-
if (!newFilter || scaleType !== _defaultSettings.SCALE_TYPES.ordinal) {
|
|
1175
|
-
var domain = channel.domain;
|
|
1176
|
-
var updatedDomain = _this6.calculateLayerDomain(table, channel);
|
|
1177
|
-
_this6.updateLayerConfig((0, _defineProperty2["default"])({}, domain, updatedDomain));
|
|
1178
|
-
}
|
|
1179
|
-
});
|
|
1180
|
-
return this;
|
|
1181
|
-
}
|
|
1182
|
-
}, {
|
|
1183
|
-
key: "getDataset",
|
|
1184
|
-
value: function getDataset(datasets) {
|
|
1185
|
-
return this.config.dataId ? datasets[this.config.dataId] : null;
|
|
1186
|
-
}
|
|
1187
|
-
|
|
1188
|
-
/**
|
|
1189
|
-
* Validate visual channel field and scales based on supported field & scale type
|
|
1190
|
-
* @param channel
|
|
1191
|
-
*/
|
|
1192
|
-
}, {
|
|
1193
|
-
key: "validateVisualChannel",
|
|
1194
|
-
value: function validateVisualChannel(channel) {
|
|
1195
|
-
this.validateFieldType(channel);
|
|
1196
|
-
this.validateScale(channel);
|
|
1197
|
-
}
|
|
1198
|
-
|
|
1199
|
-
/**
|
|
1200
|
-
* Validate field type based on channelScaleType
|
|
1201
|
-
*/
|
|
1202
|
-
}, {
|
|
1203
|
-
key: "validateFieldType",
|
|
1204
|
-
value: function validateFieldType(channel) {
|
|
1205
|
-
var visualChannel = this.visualChannels[channel];
|
|
1206
|
-
var field = visualChannel.field,
|
|
1207
|
-
channelScaleType = visualChannel.channelScaleType,
|
|
1208
|
-
supportedFieldTypes = visualChannel.supportedFieldTypes;
|
|
1209
|
-
if (this.config[field]) {
|
|
1210
|
-
// if field is selected, check if field type is supported
|
|
1211
|
-
var channelSupportedFieldTypes = supportedFieldTypes || _defaultSettings.CHANNEL_SCALE_SUPPORTED_FIELDS[channelScaleType];
|
|
1212
|
-
if (!channelSupportedFieldTypes.includes(this.config[field].type)) {
|
|
1213
|
-
// field type is not supported, set it back to null
|
|
1214
|
-
// set scale back to default
|
|
1215
|
-
this.updateLayerConfig((0, _defineProperty2["default"])({}, field, null));
|
|
1216
|
-
}
|
|
1217
|
-
}
|
|
1218
|
-
}
|
|
1219
|
-
|
|
1220
|
-
/**
|
|
1221
|
-
* Validate scale type based on aggregation
|
|
1222
|
-
*/
|
|
1223
|
-
}, {
|
|
1224
|
-
key: "validateScale",
|
|
1225
|
-
value: function validateScale(channel) {
|
|
1226
|
-
var visualChannel = this.visualChannels[channel];
|
|
1227
|
-
var scale = visualChannel.scale,
|
|
1228
|
-
range = visualChannel.range;
|
|
1229
|
-
if (!scale || this.isColoredByColorColumn(range) && this.config[scale] === _defaultSettings.SCALE_TYPES.identity) {
|
|
1230
|
-
// visualChannel doesn't have scale
|
|
1231
|
-
return;
|
|
1232
|
-
}
|
|
1233
|
-
var scaleOptions = this.getScaleOptions(channel);
|
|
1234
|
-
// check if current selected scale is
|
|
1235
|
-
// supported, if not, change to default
|
|
1236
|
-
if (!scaleOptions.includes(this.config[scale])) {
|
|
1237
|
-
this.updateLayerConfig((0, _defineProperty2["default"])({}, scale, scaleOptions[0]));
|
|
1238
|
-
}
|
|
1239
|
-
}
|
|
1240
|
-
|
|
1241
|
-
/**
|
|
1242
|
-
* Get scale options based on current field
|
|
1243
|
-
* @param {string} channel
|
|
1244
|
-
* @returns {string[]}
|
|
1245
|
-
*/
|
|
1246
|
-
}, {
|
|
1247
|
-
key: "getScaleOptions",
|
|
1248
|
-
value: function getScaleOptions(channel) {
|
|
1249
|
-
var visualChannel = this.visualChannels[channel];
|
|
1250
|
-
var field = visualChannel.field,
|
|
1251
|
-
scale = visualChannel.scale,
|
|
1252
|
-
channelScaleType = visualChannel.channelScaleType;
|
|
1253
|
-
return this.config[field] ? _defaultSettings.FIELD_OPTS[this.config[field].type].scale[channelScaleType] : [this.getDefaultLayerConfig()[scale]];
|
|
1254
|
-
}
|
|
1255
|
-
}, {
|
|
1256
|
-
key: "updateLayerVisualChannel",
|
|
1257
|
-
value: function updateLayerVisualChannel(dataset, channel) {
|
|
1258
|
-
var visualChannel = this.visualChannels[channel];
|
|
1259
|
-
this.validateVisualChannel(channel);
|
|
1260
|
-
// calculate layer channel domain
|
|
1261
|
-
var updatedDomain = this.calculateLayerDomain(dataset, visualChannel);
|
|
1262
|
-
this.updateLayerConfig((0, _defineProperty2["default"])({}, visualChannel.domain, updatedDomain));
|
|
1263
|
-
}
|
|
1264
|
-
}, {
|
|
1265
|
-
key: "getVisualChannelUpdateTriggers",
|
|
1266
|
-
value: function getVisualChannelUpdateTriggers() {
|
|
1267
|
-
var _this7 = this;
|
|
1268
|
-
var updateTriggers = {};
|
|
1269
|
-
Object.values(this.visualChannels).forEach(function (visualChannel) {
|
|
1270
|
-
// field range scale domain
|
|
1271
|
-
var accessor = visualChannel.accessor,
|
|
1272
|
-
field = visualChannel.field,
|
|
1273
|
-
scale = visualChannel.scale,
|
|
1274
|
-
domain = visualChannel.domain,
|
|
1275
|
-
range = visualChannel.range,
|
|
1276
|
-
defaultValue = visualChannel.defaultValue,
|
|
1277
|
-
fixed = visualChannel.fixed;
|
|
1278
|
-
updateTriggers[accessor] = _objectSpread((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, field, _this7.config[field]), scale, _this7.config[scale]), domain, _this7.config[domain]), range, _this7.config.visConfig[range]), "defaultValue", typeof defaultValue === 'function' ? defaultValue(_this7.config) : defaultValue), fixed ? (0, _defineProperty2["default"])({}, fixed, _this7.config.visConfig[fixed]) : {});
|
|
1279
|
-
});
|
|
1280
|
-
return updateTriggers;
|
|
1281
|
-
}
|
|
1282
|
-
}, {
|
|
1283
|
-
key: "calculateLayerDomain",
|
|
1284
|
-
value: function calculateLayerDomain(dataset, visualChannel) {
|
|
1285
|
-
var scale = visualChannel.scale;
|
|
1286
|
-
var field = this.config[visualChannel.field];
|
|
1287
|
-
if (!field || !scale) {
|
|
1288
|
-
// if colorField or sizeField were set back to null
|
|
1289
|
-
return defaultDomain;
|
|
1290
|
-
}
|
|
1291
|
-
var scaleType = this.config[scale];
|
|
1292
|
-
var dataSetField = dataset.fields.find(function (f) {
|
|
1293
|
-
return f.name === field.name;
|
|
1294
|
-
});
|
|
1295
|
-
if (!scaleType || !dataSetField) {
|
|
1296
|
-
// if new dataset doesn't contain previously set field
|
|
1297
|
-
return defaultDomain;
|
|
1298
|
-
}
|
|
1299
|
-
return dataset.getColumnLayerDomain(dataSetField, scaleType) || defaultDomain;
|
|
1300
|
-
}
|
|
1301
|
-
}, {
|
|
1302
|
-
key: "updateHexColorDomain",
|
|
1303
|
-
value: function updateHexColorDomain(dataset) {
|
|
1304
|
-
var _this8 = this;
|
|
1305
|
-
if (!dataset) {
|
|
1306
|
-
return this;
|
|
1307
|
-
}
|
|
1308
|
-
Object.values(this.visualChannels).forEach(function (channel) {
|
|
1309
|
-
var channelConfig = _this8.config.visConfig[channel.range];
|
|
1310
|
-
var field = _this8.config[channel.field];
|
|
1311
|
-
if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.type) === _colorRanges.hexColor && field !== null && field !== void 0 && field.colorColumn) {
|
|
1312
|
-
var dataSetField = dataset.fields.find(function (f) {
|
|
1313
|
-
return f.name === field.colorColumn;
|
|
1314
|
-
});
|
|
1315
|
-
var colors = dataset.getColumnLayerDomain(dataSetField, _defaultSettings.SCALE_TYPES.ordinal).map(function (c) {
|
|
1316
|
-
return (0, _colorUtils.checkColorOrFallback)(c);
|
|
1317
|
-
});
|
|
1318
|
-
_this8.updateLayerVisConfig((0, _defineProperty2["default"])({}, channel.range, _objectSpread(_objectSpread({}, channelConfig), {}, {
|
|
1319
|
-
colors: colors
|
|
1320
|
-
})));
|
|
1321
|
-
}
|
|
1322
|
-
});
|
|
1323
|
-
return this;
|
|
1324
|
-
}
|
|
1325
|
-
}, {
|
|
1326
|
-
key: "calculateHexColumnLegend",
|
|
1327
|
-
value: function calculateHexColumnLegend(datasets) {
|
|
1328
|
-
var _this9 = this;
|
|
1329
|
-
var dataset = this.getDataset(datasets);
|
|
1330
|
-
if (!datasets) {
|
|
1331
|
-
return;
|
|
1332
|
-
}
|
|
1333
|
-
var legendSettings = Object.keys(this.visualChannels).reduce(function (legends, channel) {
|
|
1334
|
-
var _this9$visualChannels = _this9.visualChannels[channel],
|
|
1335
|
-
range = _this9$visualChannels.range,
|
|
1336
|
-
channelField = _this9$visualChannels.field;
|
|
1337
|
-
var channelConfig = _this9.config.visConfig[range];
|
|
1338
|
-
var field = _this9.config[channelField];
|
|
1339
|
-
if ((channelConfig === null || channelConfig === void 0 ? void 0 : channelConfig.type) === _colorRanges.hexColor && field !== null && field !== void 0 && field.colorColumn) {
|
|
1340
|
-
var dataSetField = dataset.fields.find(function (f) {
|
|
1341
|
-
return f.name === field.colorColumn;
|
|
1342
|
-
});
|
|
1343
|
-
var legend = dataset.calculateLegend(field, dataSetField);
|
|
1344
|
-
legends[channel] = legend;
|
|
1345
|
-
}
|
|
1346
|
-
return legends;
|
|
1347
|
-
}, {});
|
|
1348
|
-
this.updateLayerLegend(legendSettings);
|
|
1349
|
-
}
|
|
1350
|
-
}, {
|
|
1351
|
-
key: "hasHoveredObject",
|
|
1352
|
-
value: function hasHoveredObject(objectInfo) {
|
|
1353
|
-
return this.isLayerHovered(objectInfo) && objectInfo.object ? objectInfo.object : null;
|
|
1354
|
-
}
|
|
1355
|
-
}, {
|
|
1356
|
-
key: "isLayerHovered",
|
|
1357
|
-
value: function isLayerHovered(objectInfo) {
|
|
1358
|
-
var _objectInfo$layer, _objectInfo$layer$pro;
|
|
1359
|
-
return (objectInfo === null || objectInfo === void 0 ? void 0 : objectInfo.picked) && (objectInfo === null || objectInfo === void 0 ? void 0 : (_objectInfo$layer = objectInfo.layer) === null || _objectInfo$layer === void 0 ? void 0 : (_objectInfo$layer$pro = _objectInfo$layer.props) === null || _objectInfo$layer$pro === void 0 ? void 0 : _objectInfo$layer$pro.id) === this.id;
|
|
1360
|
-
}
|
|
1361
|
-
}, {
|
|
1362
|
-
key: "getRadiusScaleByZoom",
|
|
1363
|
-
value: function getRadiusScaleByZoom(mapState) {
|
|
1364
|
-
var radiusChannel = Object.values(this.visualChannels).find(function (vc) {
|
|
1365
|
-
return vc.property === 'radius';
|
|
1366
|
-
});
|
|
1367
|
-
if (!radiusChannel) {
|
|
1368
|
-
return 1;
|
|
1369
|
-
}
|
|
1370
|
-
var field = radiusChannel.field;
|
|
1371
|
-
var radius = this.config.visConfig.radius;
|
|
1372
|
-
|
|
1373
|
-
// @ts-ignore
|
|
1374
|
-
return (this.config[field] ? 1 : radius) * this.getZoomFactor(mapState);
|
|
1375
|
-
}
|
|
1376
|
-
}, {
|
|
1377
|
-
key: "getRadiusScale",
|
|
1378
|
-
value: function getRadiusScale() {
|
|
1379
|
-
var radiusChannel = Object.values(this.visualChannels).find(function (vc) {
|
|
1380
|
-
return vc.property === 'radius';
|
|
1381
|
-
});
|
|
1382
|
-
if (!radiusChannel || this.config[radiusChannel.field]) {
|
|
1383
|
-
return 1;
|
|
1384
|
-
}
|
|
1385
|
-
return this.config.visConfig.radius;
|
|
1386
|
-
}
|
|
1387
|
-
}, {
|
|
1388
|
-
key: "getMaxMarkerSize",
|
|
1389
|
-
value: function getMaxMarkerSize() {
|
|
1390
|
-
var _this$config5 = this.config,
|
|
1391
|
-
radiusField = _this$config5.radiusField,
|
|
1392
|
-
sizeField = _this$config5.sizeField,
|
|
1393
|
-
visConfig = _this$config5.visConfig;
|
|
1394
|
-
var radiusRange = visConfig.radiusRange,
|
|
1395
|
-
radius = visConfig.radius;
|
|
1396
|
-
var field = radiusField || sizeField;
|
|
1397
|
-
return Math.ceil(field && radiusRange ? radiusRange[1] : radius);
|
|
1398
|
-
}
|
|
1399
|
-
}, {
|
|
1400
|
-
key: "shouldCalculateLayerData",
|
|
1401
|
-
value: function shouldCalculateLayerData(props) {
|
|
1402
|
-
var _this10 = this;
|
|
1403
|
-
return props.some(function (p) {
|
|
1404
|
-
return !_this10.noneLayerDataAffectingProps.includes(p);
|
|
1405
|
-
});
|
|
1406
|
-
}
|
|
1407
|
-
}, {
|
|
1408
|
-
key: "getBrushingExtensionProps",
|
|
1409
|
-
value: function getBrushingExtensionProps(interactionConfig, brushingTarget) {
|
|
1410
|
-
var brush = interactionConfig.brush;
|
|
1411
|
-
return {
|
|
1412
|
-
// brushing
|
|
1413
|
-
autoHighlight: !brush.enabled,
|
|
1414
|
-
brushingRadius: brush.config.size * 1000,
|
|
1415
|
-
brushingTarget: brushingTarget || 'source',
|
|
1416
|
-
brushingEnabled: brush.enabled
|
|
1417
|
-
};
|
|
1418
|
-
}
|
|
1419
|
-
}, {
|
|
1420
|
-
key: "getDefaultDeckLayerProps",
|
|
1421
|
-
value: function getDefaultDeckLayerProps(_ref12) {
|
|
1422
|
-
var idx = _ref12.idx,
|
|
1423
|
-
gpuFilter = _ref12.gpuFilter,
|
|
1424
|
-
mapState = _ref12.mapState,
|
|
1425
|
-
visible = _ref12.visible,
|
|
1426
|
-
maskPolygon = _ref12.maskPolygon;
|
|
1427
|
-
var maskExtensionProps = (0, _layerUtils.getMaskExtensionProps)(maskPolygon);
|
|
1428
|
-
return _objectSpread(_objectSpread({}, maskExtensionProps), {}, {
|
|
1429
|
-
id: this.id,
|
|
1430
|
-
idx: idx,
|
|
1431
|
-
coordinateSystem: _core.COORDINATE_SYSTEM.LNGLAT,
|
|
1432
|
-
pickable: this.hasInteractivity,
|
|
1433
|
-
wrapLongitude: true,
|
|
1434
|
-
parameters: {
|
|
1435
|
-
depthTest: Boolean(mapState.dragRotate || this.config.visConfig.enable3d)
|
|
1436
|
-
},
|
|
1437
|
-
hidden: this.config.hidden,
|
|
1438
|
-
visibilityByZoom: this.config.visibilityByZoom,
|
|
1439
|
-
// visconfig
|
|
1440
|
-
opacity: this.config.visConfig.opacity,
|
|
1441
|
-
highlightColor: this.config.highlightColor,
|
|
1442
|
-
// data filtering
|
|
1443
|
-
extensions: [dataFilterExtension].concat((0, _toConsumableArray2["default"])(maskExtensionProps.extensions)),
|
|
1444
|
-
filterRange: gpuFilter ? gpuFilter.filterRange : undefined,
|
|
1445
|
-
// layer should be visible and if splitMap, shown in to one of panel
|
|
1446
|
-
visible: this.config.isVisible && visible
|
|
1447
|
-
});
|
|
1448
|
-
}
|
|
1449
|
-
}, {
|
|
1450
|
-
key: "getDefaultHoverLayerProps",
|
|
1451
|
-
value: function getDefaultHoverLayerProps() {
|
|
1452
|
-
return {
|
|
1453
|
-
id: "".concat(this.id, "-hovered"),
|
|
1454
|
-
pickable: false,
|
|
1455
|
-
wrapLongitude: true,
|
|
1456
|
-
coordinateSystem: _core.COORDINATE_SYSTEM.LNGLAT
|
|
1457
|
-
};
|
|
1458
|
-
}
|
|
1459
|
-
}, {
|
|
1460
|
-
key: "renderTextLabelLayer",
|
|
1461
|
-
value: function renderTextLabelLayer(_ref13, renderOpts) {
|
|
1462
|
-
var getPosition = _ref13.getPosition,
|
|
1463
|
-
getRadius = _ref13.getRadius,
|
|
1464
|
-
radiusScale = _ref13.radiusScale,
|
|
1465
|
-
updateTriggers = _ref13.updateTriggers,
|
|
1466
|
-
sharedProps = _ref13.sharedProps;
|
|
1467
|
-
var data = renderOpts.data;
|
|
1468
|
-
var _this$config6 = this.config,
|
|
1469
|
-
textLabel = _this$config6.textLabel,
|
|
1470
|
-
visibilityByZoom = _this$config6.visibilityByZoom;
|
|
1471
|
-
var extensions = [].concat((0, _toConsumableArray2["default"])(sharedProps.extensions), [collisionFilterExtension]);
|
|
1472
|
-
if (!data || !data.textLabels || !data.textLabels[0] || !data.textLabels[0].getText) {
|
|
1473
|
-
return [];
|
|
1474
|
-
}
|
|
1475
|
-
var _textLabel = (0, _slicedToArray2["default"])(textLabel, 2),
|
|
1476
|
-
mainLabel = _textLabel[0],
|
|
1477
|
-
secondaryLabel = _textLabel[1];
|
|
1478
|
-
var alignment = mainLabel.alignment,
|
|
1479
|
-
anchor = mainLabel.anchor,
|
|
1480
|
-
getColor = mainLabel.color,
|
|
1481
|
-
mainField = mainLabel.field,
|
|
1482
|
-
outlineColor = mainLabel.outlineColor,
|
|
1483
|
-
sizeScale = mainLabel.size;
|
|
1484
|
-
var _ref14 = secondaryLabel || {},
|
|
1485
|
-
getSecondaryColor = _ref14.color,
|
|
1486
|
-
secondaryField = _ref14.field,
|
|
1487
|
-
secondaryOutlineColor = _ref14.outlineColor,
|
|
1488
|
-
secondarySizeScale = _ref14.size;
|
|
1489
|
-
return [new _carto._PointLabelLayer(_objectSpread(_objectSpread(_objectSpread({}, sharedProps), {}, {
|
|
1490
|
-
// Recreate layer when labels change otherwise rendering breaks
|
|
1491
|
-
// TODO could be more efficient with updateTriggers?
|
|
1492
|
-
id: "".concat(this.id, "-").concat(mainField === null || mainField === void 0 ? void 0 : mainField.name, "-").concat(secondaryField === null || secondaryField === void 0 ? void 0 : secondaryField.name, "-label"),
|
|
1493
|
-
data: data.data,
|
|
1494
|
-
visibilityByZoom: visibilityByZoom,
|
|
1495
|
-
extensions: extensions,
|
|
1496
|
-
characterSet: 'auto',
|
|
1497
|
-
collisionEnabled: true,
|
|
1498
|
-
collisionGroup: "".concat(this.id, "-labels"),
|
|
1499
|
-
getText: data.textLabels[0].getText,
|
|
1500
|
-
getColor: getColor,
|
|
1501
|
-
sizeScale: sizeScale,
|
|
1502
|
-
outlineColor: outlineColor
|
|
1503
|
-
}, secondaryField && {
|
|
1504
|
-
getSecondaryText: data.textLabels[1].getText,
|
|
1505
|
-
getSecondaryColor: getSecondaryColor,
|
|
1506
|
-
secondarySizeScale: secondarySizeScale,
|
|
1507
|
-
secondaryOutlineColor: secondaryOutlineColor
|
|
1508
|
-
}), {}, {
|
|
1509
|
-
// Position
|
|
1510
|
-
getPosition: getPosition,
|
|
1511
|
-
getRadius: getRadius,
|
|
1512
|
-
radiusScale: radiusScale,
|
|
1513
|
-
getTextAnchor: anchor,
|
|
1514
|
-
getAlignmentBaseline: alignment,
|
|
1515
|
-
// Style
|
|
1516
|
-
fontFamily: 'Inter, sans',
|
|
1517
|
-
fontSettings: {
|
|
1518
|
-
sdf: true
|
|
1519
|
-
},
|
|
1520
|
-
fontWeight: 500,
|
|
1521
|
-
outlineWidth: 4,
|
|
1522
|
-
parameters: {
|
|
1523
|
-
// text will always show on top of all layers
|
|
1524
|
-
depthTest: false
|
|
1525
|
-
},
|
|
1526
|
-
getFilterValue: data.getFilterValue,
|
|
1527
|
-
updateTriggers: _objectSpread(_objectSpread({}, updateTriggers), {}, {
|
|
1528
|
-
getText: mainField === null || mainField === void 0 ? void 0 : mainField.name,
|
|
1529
|
-
getColor: mainField === null || mainField === void 0 ? void 0 : mainField.color,
|
|
1530
|
-
getTextAnchor: mainLabel.anchor,
|
|
1531
|
-
getAlignmentBaseline: mainLabel.alignment,
|
|
1532
|
-
getSecondaryText: secondaryField === null || secondaryField === void 0 ? void 0 : secondaryField.name
|
|
1533
|
-
})
|
|
1534
|
-
}))];
|
|
1535
|
-
}
|
|
1536
|
-
|
|
1537
|
-
/**
|
|
1538
|
-
* Create deck.gl `IconLayer` "autoPack" mode accessor for custom markers.
|
|
1539
|
-
*
|
|
1540
|
-
* @param {*} iconUrlAccessor deck.gl accessor (or value) that resolves to URL of icon for given row
|
|
1541
|
-
* @returns deck.gl accessor that returns UnpackedIcon ready to consume by IconLayer
|
|
1542
|
-
*/
|
|
1543
|
-
}, {
|
|
1544
|
-
key: "getCustomMarkerIconAccessor",
|
|
1545
|
-
value: function getCustomMarkerIconAccessor(iconUrlAccessor) {
|
|
1546
|
-
var mask = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
1547
|
-
var maxIconSize = this.getMaxMarkerSize();
|
|
1548
|
-
return function (d) {
|
|
1549
|
-
var wantedUrl = typeof iconUrlAccessor === 'function' ? iconUrlAccessor(d) : iconUrlAccessor;
|
|
1550
|
-
var iconOk = Boolean(wantedUrl);
|
|
1551
|
-
mask = iconOk ? mask : true;
|
|
1552
|
-
var url = iconOk ? wantedUrl : FALLBACK_ICON;
|
|
1553
|
-
return {
|
|
1554
|
-
id: "".concat(url, "@@").concat(maxIconSize, "@").concat(mask ? 'm' : 'c'),
|
|
1555
|
-
url: url,
|
|
1556
|
-
width: maxIconSize,
|
|
1557
|
-
height: maxIconSize,
|
|
1558
|
-
mask: mask
|
|
1559
|
-
};
|
|
1560
|
-
};
|
|
1561
|
-
}
|
|
1562
|
-
}, {
|
|
1563
|
-
key: "calculateDataAttribute",
|
|
1564
|
-
value: function calculateDataAttribute(keplerTable, getPosition) {
|
|
1565
|
-
// implemented in subclasses
|
|
1566
|
-
return [];
|
|
1567
|
-
}
|
|
1568
|
-
}, {
|
|
1569
|
-
key: "updateLayerMeta",
|
|
1570
|
-
value: function updateLayerMeta(dataContainer, getPosition) {
|
|
1571
|
-
// implemented in subclasses
|
|
1572
|
-
}
|
|
1573
|
-
}, {
|
|
1574
|
-
key: "getPositionAccessor",
|
|
1575
|
-
value: function getPositionAccessor(dataContainer) {
|
|
1576
|
-
// implemented in subclasses
|
|
1577
|
-
return function () {
|
|
1578
|
-
return null;
|
|
1579
|
-
};
|
|
1580
|
-
}
|
|
1581
|
-
}, {
|
|
1582
|
-
key: "getHexColumn",
|
|
1583
|
-
value: function getHexColumn(range) {
|
|
1584
|
-
var _Object$values2, _Object$values2$find;
|
|
1585
|
-
var field = (_Object$values2 = Object.values(this.visualChannels)) === null || _Object$values2 === void 0 ? void 0 : (_Object$values2$find = _Object$values2.find(function (value) {
|
|
1586
|
-
return value.range === range;
|
|
1587
|
-
})) === null || _Object$values2$find === void 0 ? void 0 : _Object$values2$find.field;
|
|
1588
|
-
if (field) {
|
|
1589
|
-
var _this$config$field2;
|
|
1590
|
-
return (_this$config$field2 = this.config[field]) === null || _this$config$field2 === void 0 ? void 0 : _this$config$field2.colorColumn;
|
|
1591
|
-
}
|
|
1592
|
-
}
|
|
1593
|
-
}, {
|
|
1594
|
-
key: "isColoredByColorColumn",
|
|
1595
|
-
value: function isColoredByColorColumn(range) {
|
|
1596
|
-
var _this$config$visConfi;
|
|
1597
|
-
return (_this$config$visConfi = this.config.visConfig[range]) === null || _this$config$visConfi === void 0 ? void 0 : _this$config$visConfi.hexColor;
|
|
1598
|
-
}
|
|
1599
|
-
}], [{
|
|
1600
|
-
key: "findDefaultLayerProps",
|
|
1601
|
-
value: function findDefaultLayerProps(dataset, foundLayers) {
|
|
1602
|
-
return {
|
|
1603
|
-
props: [],
|
|
1604
|
-
foundLayers: foundLayers
|
|
1605
|
-
};
|
|
1606
|
-
}
|
|
1607
|
-
|
|
1608
|
-
/**
|
|
1609
|
-
* Given a array of preset required column names
|
|
1610
|
-
* found field that has the same name to set as layer column
|
|
1611
|
-
*
|
|
1612
|
-
* @param {object} defaultFields
|
|
1613
|
-
* @param {object[]} allFields
|
|
1614
|
-
* @returns {object[] | null} all possible required layer column pairs
|
|
1615
|
-
*/
|
|
1616
|
-
}, {
|
|
1617
|
-
key: "findDefaultColumnField",
|
|
1618
|
-
value: function findDefaultColumnField(defaultFields, allFields) {
|
|
1619
|
-
// find all matched fields for each required col
|
|
1620
|
-
var requiredColumns = Object.keys(defaultFields).reduce(function (prev, key) {
|
|
1621
|
-
var requiredFields = allFields.filter(function (f) {
|
|
1622
|
-
return f.name === defaultFields[key] || defaultFields[key].includes(f.name);
|
|
1623
|
-
});
|
|
1624
|
-
prev[key] = requiredFields.length ? requiredFields.map(function (f) {
|
|
1625
|
-
return {
|
|
1626
|
-
value: f.name,
|
|
1627
|
-
fieldIdx: f.fieldIdx
|
|
1628
|
-
};
|
|
1629
|
-
}) : null;
|
|
1630
|
-
return prev;
|
|
1631
|
-
}, {});
|
|
1632
|
-
if (!Object.values(requiredColumns).every(Boolean)) {
|
|
1633
|
-
// if any field missing, return null
|
|
1634
|
-
return null;
|
|
1635
|
-
}
|
|
1636
|
-
return this.getAllPossibleColumnParis(requiredColumns);
|
|
1637
|
-
}
|
|
1638
|
-
}, {
|
|
1639
|
-
key: "getAllPossibleColumnParis",
|
|
1640
|
-
value: function getAllPossibleColumnParis(requiredColumns) {
|
|
1641
|
-
// for multiple matched field for one required column, return multiple
|
|
1642
|
-
// combinations, e. g. if column a has 2 matched, column b has 3 matched
|
|
1643
|
-
// 6 possible column pairs will be returned
|
|
1644
|
-
var allKeys = Object.keys(requiredColumns);
|
|
1645
|
-
var pointers = allKeys.map(function (k, i) {
|
|
1646
|
-
return i === allKeys.length - 1 ? -1 : 0;
|
|
1647
|
-
});
|
|
1648
|
-
var countPerKey = allKeys.map(function (k) {
|
|
1649
|
-
return requiredColumns[k].length;
|
|
1650
|
-
});
|
|
1651
|
-
var pairs = [];
|
|
1652
|
-
|
|
1653
|
-
/* eslint-disable no-loop-func */
|
|
1654
|
-
while (incrementPointers(pointers, countPerKey, pointers.length - 1)) {
|
|
1655
|
-
var newPair = pointers.reduce(function (prev, cuur, i) {
|
|
1656
|
-
prev[allKeys[i]] = requiredColumns[allKeys[i]][cuur];
|
|
1657
|
-
return prev;
|
|
1658
|
-
}, {});
|
|
1659
|
-
pairs.push(newPair);
|
|
1660
|
-
}
|
|
1661
|
-
/* eslint-enable no-loop-func */
|
|
1662
|
-
|
|
1663
|
-
// recursively increment pointers
|
|
1664
|
-
function incrementPointers(pts, counts, index) {
|
|
1665
|
-
if (index === 0 && pts[0] === counts[0] - 1) {
|
|
1666
|
-
// nothing to increment
|
|
1667
|
-
return false;
|
|
1668
|
-
}
|
|
1669
|
-
if (pts[index] + 1 < counts[index]) {
|
|
1670
|
-
pts[index] = pts[index] + 1;
|
|
1671
|
-
return true;
|
|
1672
|
-
}
|
|
1673
|
-
pts[index] = 0;
|
|
1674
|
-
return incrementPointers(pts, counts, index - 1);
|
|
1675
|
-
}
|
|
1676
|
-
return pairs;
|
|
1677
|
-
}
|
|
1678
|
-
}, {
|
|
1679
|
-
key: "hexToRgb",
|
|
1680
|
-
value: function hexToRgb(c) {
|
|
1681
|
-
return (0, _colorUtils.hexToRgb)(c);
|
|
1682
|
-
}
|
|
1683
|
-
}]);
|
|
1684
|
-
return Layer;
|
|
1685
|
-
}();
|
|
1686
|
-
var _default = exports["default"] = Layer;
|
|
1687
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwicmVxdWlyZSIsIl9rZXltaXJyb3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2V4dGVuc2lvbnMiLCJfY29yZSIsIl9jYXJ0byIsIl9kZWZhdWx0TGF5ZXJJY29uIiwiX2xheWVyVXBkYXRlIiwiX2QzQ29sb3IiLCJfZGVmYXVsdFNldHRpbmdzIiwiX2NvbG9yUmFuZ2VzIiwiX2N1c3RvbUNvbG9yUmFuZ2VzIiwiX2xheWVyRmFjdG9yeSIsIl91dGlscyIsIl9kYXRhVXRpbHMiLCJfZGF0YUNvbnRhaW5lclV0aWxzIiwiX2NvbG9yVXRpbHMiLCJfbGF5ZXJVdGlscyIsIl9kM1NjYWxlIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJvIiwiYWxsb3dBcnJheUxpa2UiLCJpdCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiaSIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImUiLCJfZSIsImYiLCJUeXBlRXJyb3IiLCJub3JtYWxDb21wbGV0aW9uIiwiZGlkRXJyIiwiZXJyIiwiY2FsbCIsInN0ZXAiLCJuZXh0IiwiX2UyIiwibWluTGVuIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJhcnIiLCJsZW4iLCJhcnIyIiwib3duS2V5cyIsInIiLCJ0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX21hcmtlZCIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJnZW5lcmF0ZUNvbG9yIiwiTEFZRVJfSURfTEVOR1RIIiwiZXhwb3J0cyIsIkZBTExCQUNLX0lDT04iLCJNQVhfU0FNUExFX1NJWkUiLCJkZWZhdWx0RG9tYWluIiwiZGF0YUZpbHRlckV4dGVuc2lvbiIsIkRhdGFGaWx0ZXJFeHRlbnNpb24iLCJmaWx0ZXJTaXplIiwiTUFYX0dQVV9GSUxURVJTIiwiY29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uIiwiQ29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uIiwiZGVmYXVsdERhdGFBY2Nlc3NvciIsImRjIiwiZCIsImRlZmF1bHRHZXRGaWVsZFZhbHVlIiwiZmllbGQiLCJ2YWx1ZUFjY2Vzc29yIiwic2NhbGVJZGVudGl0eSIsInYiLCJPVkVSTEFZX1RZUEUiLCJrZXltaXJyb3IiLCJkZWNrZ2wiLCJtYXBib3hnbCIsImxheWVyQ29sb3JzIiwidmFsdWVzIiwiRGF0YVZpekNvbG9ycyIsIm1hcCIsImhleFRvUmdiIiwiaW5kZXgiLCJ3cmFwIiwiZ2VuZXJhdGVDb2xvciQiLCJfY29udGV4dCIsInByZXYiLCJzdG9wIiwiY29sb3JNYWtlciIsIkxheWVyIiwicHJvcHMiLCJ1bmRlZmluZWQiLCJfY2xhc3NDYWxsQ2hlY2syIiwiaWQiLCJnZW5lcmF0ZUhhc2hJZCIsIm1ldGEiLCJsZWdlbmRTZXR0aW5ncyIsInZpc0NvbmZpZ1NldHRpbmdzIiwiX2ludGVyYWN0aXZpdHlTZXR0aW5ncyIsImNvbmZpZyIsImdldERlZmF1bHRMYXllckNvbmZpZyIsImNvbHVtbnMiLCJnZXRMYXllckNvbHVtbnMiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwiZ2V0IiwiRGVmYXVsdExheWVySWNvbiIsInR5cGUiLCJjb2xvciIsInByb3BlcnR5Iiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsIm51bGxWYWx1ZSIsIk5PX1ZBTFVFX0NPTE9SIiwiZGVmYXVsdFZhbHVlIiwic2l6ZSIsImxhdCIsInBhaXIiLCJmaWVsZFBhaXJLZXkiLCJsbmciLCJsYXQwIiwibG5nMCIsImxhdDEiLCJsbmcxIiwic2V0IiwiaW50ZXJhY3Rpdml0eVNldHRpbmdzIiwiX3RoaXMkaW50ZXJhY3Rpdml0eVNlIiwiX3RoaXMkaW50ZXJhY3Rpdml0eVNlMiIsIl90aGlzJGludGVyYWN0aXZpdHlTZTMiLCJfdGhpcyRpbnRlcmFjdGl2aXR5U2U0IiwiQm9vbGVhbiIsImhvdmVyIiwiZmllbGRzIiwiY2xpY2siLCJfdGhpcyRpbnRlcmFjdGl2aXR5U2U1IiwiaGFzVG9vbHRpcCIsImVuYWJsZWQiLCJfcHJvcHMkdmlzaWJpbGl0eUJ5Wm8iLCJfcHJvcHMkdmlzaWJpbGl0eUJ5Wm8yIiwiZGF0YUlkIiwidmlzaWJpbGl0eUJ5Wm9vbSIsIm1pbiIsIlpPT01fTEVWRUxfTElNSVRTIiwibWF4IiwibGFiZWwiLCJERUZBVUxUX0xBWUVSX0xBQkVMIiwiaXNWaXNpYmxlIiwiaXNDb25maWdBY3RpdmUiLCJoaWdobGlnaHRDb2xvciIsIkRFRkFVTFRfSElHSExJR0hUX0NPTE9SIiwiaGlkZGVuIiwiY29sb3JGaWVsZCIsImNvbG9yRG9tYWluIiwiY29sb3JTY2FsZSIsIlNDQUxFX1RZUEVTIiwicXVhbnRpbGUiLCJzaXplRG9tYWluIiwic2l6ZVNjYWxlIiwibGluZWFyIiwic2l6ZUZpZWxkIiwicmFkaXVzRmllbGQiLCJ2aXNDb25maWciLCJ0ZXh0TGFiZWwiLCJERUZBVUxUX1RFWFRfTEFCRUwiLCJjb2xvclVJIiwiREVGQVVMVF9DT0xPUl9VSSIsImNvbG9yUmFuZ2UiLCJhbmltYXRpb24iLCJnZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24iLCJ2aXN1YWxDaGFubmVscyIsIm1lYXN1cmUiLCJkaXNwbGF5TmFtZSIsImRlZmF1bHRNZWFzdXJlIiwiYXNzaWduQ29sdW1uIiwidXBkYXRlIiwiZmllbGRJZHgiLCJhc3NpZ25Db2x1bW5QYWlycyIsIl90aGlzJGNvbHVtblBhaXJzIiwiX3RoaXMkY29sdW1uUGFpcnMyIiwiX3RoaXMkY29sdW1uUGFpcnMzIiwiY29sdW1uUGFpcnMiLCJfdGhpcyRjb2x1bW5QYWlycyRrZXkiLCJwYXJ0bmVyS2V5IiwiX3RoaXMkY29sdW1uUGFpcnMkcGFyIiwicGFydG5lckZpZWxkUGFpcktleSIsImdldFpvb21GYWN0b3IiLCJfcmVmIiwiem9vbSIsIl9yZWYkem9vbU9mZnNldCIsInpvb21PZmZzZXQiLCJNYXRoIiwicG93IiwiZ2V0RWxldmF0aW9uWm9vbUZhY3RvciIsIl9yZWYyIiwiX3JlZjIkem9vbU9mZnNldCIsImVuYWJsZUVsZXZhdGlvblpvb21GYWN0b3IiLCJmb3JtYXRMYXllckRhdGEiLCJkYXRhc2V0cyIsImZpbHRlcmVkSW5kZXgiLCJyZW5kZXJMYXllciIsImdldEhvdmVyRGF0YSIsIm9iamVjdCIsImRhdGFDb250YWluZXIiLCJyb3ciLCJhc3NpZ25Db25maWdUb0xheWVyIiwiY29uZmlnVG9Db3B5IiwiX3RoaXMiLCJzaGFsbG93Q29weSIsImNvbmNhdCIsIm5vdFRvQ29weSIsImdyb3VwIiwiY3VycmVudENvbmZpZyIsImNvcGllZCIsImNvcHlMYXllckNvbmZpZyIsInVwZGF0ZUxheWVyQ29uZmlnIiwiY2hhbm5lbCIsInZhbGlkYXRlVmlzdWFsQ2hhbm5lbCIsIl90aGlzMiIsIl9yZWYzIiwiX3JlZjMkc2hhbGxvd0NvcHkiLCJfcmVmMyRub3RUb0NvcHkiLCJpc1BsYWluT2JqZWN0IiwiaW5jbHVkZXMiLCJub3ROdWxsb3JVbmRlZmluZWQiLCJyZWdpc3RlclZpc0NvbmZpZyIsImxheWVyVmlzQ29uZmlncyIsIl90aGlzMyIsIml0ZW0iLCJMQVlFUl9WSVNfQ09ORklHUyIsImV2ZXJ5IiwicCIsImhhc093blByb3BlcnR5IiwiY29sdW1uVmFsaWRhdG9ycyIsInJlcXVpcmVkIiwicmVxdWlyZWRMYXllckNvbHVtbnMiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdG9yIiwib3B0aW9uYWwiLCJvcHRpb25hbENvbHVtbnMiLCJuZXdDb25maWciLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsIm5ld1Zpc0NvbmZpZyIsInVwZGF0ZUxheWVyQ29sb3JVSSIsInByb3AiLCJfdGhpcyRjb25maWciLCJwcmV2aW91cyIsImNvbG9yVUlQcm9wIiwiZW50cmllcyIsIl9yZWY0IiwiX3JlZjUiLCJfc2xpY2VkVG9BcnJheTIiLCJpc0NvbG9yUmFuZ2UiLCJjb2xvcnMiLCJoZXhDb2xvciIsInVwZGF0ZUNvbG9yVUlCeUNvbG9yUmFuZ2UiLCJ1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJIiwidXBkYXRlQ3VzdG9tUGFsZXR0ZSIsImNvbG9yUmFuZ2VDb25maWciLCJjdXN0b20iLCJfdGhpcyRjb25maWcyIiwiY3VzdG9tUGFsZXR0ZSIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJfdmlzQ29uZmlnJHByb3AkY29sb3IiLCJzaG93RHJvcGRvd24iLCJfdGhpcyRjb25maWczIiwic3RlcHMiLCJyZXZlcnNlZCIsImhleENvbHVtbiIsImdldEhleENvbHVtbiIsImlzSGV4Q29sdW1uIiwiaXNDb2xvcmVkQnlDb2xvckNvbHVtbiIsInNob3VsZFVwZGF0ZSIsInNvbWUiLCJfdGhpcyRjb25maWc0IiwiX2NvbG9yVUkkcHJvcCRjb2xvclJhIiwiZ2V0Q29sb3JHcm91cEJ5TmFtZSIsInNhbWVHcm91cCIsIkNPTE9SX1JBTkdFUyIsImNyIiwiZmluZCIsInJldmVyc2VDb2xvclJhbmdlIiwiY29sb3JNYXAiLCJ1cGRhdGVDb2xvck1hcCIsIl90aGlzJGNvbmZpZyRmaWVsZCIsIl9PYmplY3QkdmFsdWVzJGZpbmQiLCJ1cGRhdGVDYXRlZ29yeUNvbG9yTWFwIiwidXBkYXRlTnVtZXJpY0NvbG9yTWFwIiwiYXNzaWduZWRDYXRlZ29yaWVzIiwibmV3Q29sb3JNYXAiLCJjTWFwIiwidW5hc3NpZ25lZENvbG9ycyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiY2F0ZWdvcnkiLCJjb2xvck1hcFZhbHVlcyIsImMiLCJtYXhWYWx1ZSIsInByZXZWYWx1ZSIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfc3RlcDIkdmFsdWUiLCJoYXNBbGxDb2x1bW5zIiwiaGFzTGF5ZXJEYXRhIiwibGF5ZXJEYXRhIiwiZGF0YSIsImlzVmFsaWRUb1NhdmUiLCJzaG91bGRSZW5kZXJMYXllciIsImdldENvbG9yU2NhbGUiLCJfIiwiX3JnYiIsInJnYiIsImciLCJiIiwiaXNOYU4iLCJVTktOT1dOX0NPTE9SIiwiTWFwIiwiX3JlZjYiLCJfcmVmNyIsImsiLCJTQ0FMRV9GVU5DIiwidW5rbm93biIsImdldFZpc0NoYW5uZWxTY2FsZSIsImdldEN1c3RvbU1hcmtlcnNTY2FsZSIsImZhbGxiYWNrSWNvbiIsInVua25vd25WYWx1ZSIsIm1hcHBpbmciLCJvdGhlcnNNYXJrZXIiLCJfaXRlcmF0b3IzIiwibWFya2VyTWFwIiwiX3N0ZXAzIiwiX3N0ZXAzJHZhbHVlIiwibWFya2VyVXJsIiwic2NhbGVPcmRpbmFsIiwiZ2V0QXR0cmlidXRlQWNjZXNzb3JzIiwiX3JlZjgiLCJfdGhpczQiLCJfcmVmOCRkYXRhQWNjZXNzb3IiLCJkYXRhQWNjZXNzb3IiLCJhdHRyaWJ1dGVBY2Nlc3NvcnMiLCJfdGhpczQkdmlzdWFsQ2hhbm5lbHMiLCJmaXhlZCIsImFjY2Vzc29yIiwiZ2V0QXR0cmlidXRlVmFsdWUiLCJhZ2dyZWdhdGlvbiIsInNob3VsZEdldFNjYWxlIiwiaWRlbnRpdHkiLCJhcmdzIiwiaXNGaXhlZCIsImZpZWxkQ29uZmlnIiwiYWdncmVnYXRpb25WYWx1ZSIsInNjYWxlRnVuY3Rpb24iLCJjdXN0b21NYXJrZXIiLCJjdXN0b21NYXJrZXJzVXJsIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsIl9hZ2dyZWdhdGlvbiIsIkNvbnNvbGUiLCJ3YXJuIiwib3JkaW5hbCIsImRvbWFpbklzSW5maW5pdGUiLCJJbmZpbml0eSIsInNjYWxlRmFjdG9yeSIsInJlc3VsdCIsImdldFBvaW50c0JvdW5kcyIsImdldFBvc2l0aW9uIiwic2FtcGxlRGF0YSIsIm51bVJvd3MiLCJnZXRTYW1wbGVEYXRhIiwicG9pbnRzIiwibWFwSW5kZXgiLCJsYXRCb3VuZHMiLCJnZXRMYXRMbmdCb3VuZHMiLCJsbmdCb3VuZHMiLCJnZXRDaGFuZ2VkVHJpZ2dlcnMiLCJkYXRhVXBkYXRlVHJpZ2dlcnMiLCJ0cmlnZ2VyQ2hhbmdlZCIsImRpZmZVcGRhdGVUcmlnZ2VycyIsIl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMiLCJfcmVmOSIsIl9yZWY5JG51bGxWYWx1ZSIsIl9yZWY5JGdldFZhbHVlIiwiZ2V0VmFsdWUiLCJjb2xvckNvbHVtblZhbHVlIiwiY2hhbm5lbENvbmZpZyIsImNoYW5uZWxGaWVsZCIsImNvbHVtbkZpZWxkIiwiY29sb3JDb2x1bW4iLCJjb2xvckNvbHVtbklkeCIsInZhbHVlQXQiLCJhdHRyaWJ1dGVWYWx1ZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsIkRhdGUiLCJ1cGRhdGVNZXRhIiwidXBkYXRlTGF5ZXJMZWdlbmQiLCJzZXR0aW5ncyIsImdldERhdGFVcGRhdGVUcmlnZ2VycyIsIl9yZWYxMCIsImFsbERhdGEiLCJnZXREYXRhIiwiZGF0YXNldElkIiwiZ2V0TWV0YSIsInRsIiwidXBkYXRlRGF0YSIsIm9sZExheWVyRGF0YSIsImRhdGFzZXQiLCJnZXREYXRhc2V0IiwidXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyIsInVwZGF0ZUhleENvbG9yRG9tYWluIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsInVwZGF0ZUxheWVyTWV0YSIsImNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUiLCJfdGhpczUiLCJfbG9vcCIsIl90aGlzNSRjb25maWckdmlzQ29uZiIsIl9PYmplY3QkdmFsdWVzJF9pIiwiX09iamVjdCR2YWx1ZXMiLCJfaSIsIm9sZEZpZWxkIiwiaXNVc2luZ0hleENvbG9yQ29kZSIsIm5ld0RhdGFTZXRGaWVsZCIsImZkIiwiX3JldCIsInVwZGF0ZUxheWVyRG9tYWluIiwibmV3RmlsdGVyIiwiX3RoaXM2IiwidGFibGUiLCJzY2FsZVR5cGUiLCJ1cGRhdGVkRG9tYWluIiwiY2FsY3VsYXRlTGF5ZXJEb21haW4iLCJ2YWxpZGF0ZUZpZWxkVHlwZSIsInZhbGlkYXRlU2NhbGUiLCJ2aXN1YWxDaGFubmVsIiwic3VwcG9ydGVkRmllbGRUeXBlcyIsImNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzIiwiQ0hBTk5FTF9TQ0FMRV9TVVBQT1JURURfRklFTERTIiwic2NhbGVPcHRpb25zIiwiZ2V0U2NhbGVPcHRpb25zIiwiRklFTERfT1BUUyIsInVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbCIsImdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycyIsIl90aGlzNyIsInVwZGF0ZVRyaWdnZXJzIiwiZGF0YVNldEZpZWxkIiwiZ2V0Q29sdW1uTGF5ZXJEb21haW4iLCJfdGhpczgiLCJjaGVja0NvbG9yT3JGYWxsYmFjayIsImNhbGN1bGF0ZUhleENvbHVtbkxlZ2VuZCIsIl90aGlzOSIsImxlZ2VuZHMiLCJfdGhpczkkdmlzdWFsQ2hhbm5lbHMiLCJsZWdlbmQiLCJjYWxjdWxhdGVMZWdlbmQiLCJoYXNIb3ZlcmVkT2JqZWN0Iiwib2JqZWN0SW5mbyIsImlzTGF5ZXJIb3ZlcmVkIiwiX29iamVjdEluZm8kbGF5ZXIiLCJfb2JqZWN0SW5mbyRsYXllciRwcm8iLCJwaWNrZWQiLCJsYXllciIsImdldFJhZGl1c1NjYWxlQnlab29tIiwibWFwU3RhdGUiLCJyYWRpdXNDaGFubmVsIiwidmMiLCJyYWRpdXMiLCJnZXRSYWRpdXNTY2FsZSIsImdldE1heE1hcmtlclNpemUiLCJfdGhpcyRjb25maWc1IiwicmFkaXVzUmFuZ2UiLCJjZWlsIiwic2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhIiwiX3RoaXMxMCIsIm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcyIsImdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImJydXNoaW5nVGFyZ2V0IiwiYnJ1c2giLCJhdXRvSGlnaGxpZ2h0IiwiYnJ1c2hpbmdSYWRpdXMiLCJicnVzaGluZ0VuYWJsZWQiLCJnZXREZWZhdWx0RGVja0xheWVyUHJvcHMiLCJfcmVmMTIiLCJpZHgiLCJncHVGaWx0ZXIiLCJ2aXNpYmxlIiwibWFza1BvbHlnb24iLCJtYXNrRXh0ZW5zaW9uUHJvcHMiLCJnZXRNYXNrRXh0ZW5zaW9uUHJvcHMiLCJjb29yZGluYXRlU3lzdGVtIiwiQ09PUkRJTkFURV9TWVNURU0iLCJMTkdMQVQiLCJwaWNrYWJsZSIsImhhc0ludGVyYWN0aXZpdHkiLCJ3cmFwTG9uZ2l0dWRlIiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsImRyYWdSb3RhdGUiLCJlbmFibGUzZCIsIm9wYWNpdHkiLCJleHRlbnNpb25zIiwiZmlsdGVyUmFuZ2UiLCJnZXREZWZhdWx0SG92ZXJMYXllclByb3BzIiwicmVuZGVyVGV4dExhYmVsTGF5ZXIiLCJfcmVmMTMiLCJyZW5kZXJPcHRzIiwiZ2V0UmFkaXVzIiwicmFkaXVzU2NhbGUiLCJzaGFyZWRQcm9wcyIsIl90aGlzJGNvbmZpZzYiLCJ0ZXh0TGFiZWxzIiwiZ2V0VGV4dCIsIl90ZXh0TGFiZWwiLCJtYWluTGFiZWwiLCJzZWNvbmRhcnlMYWJlbCIsImFsaWdubWVudCIsImFuY2hvciIsImdldENvbG9yIiwibWFpbkZpZWxkIiwib3V0bGluZUNvbG9yIiwiX3JlZjE0IiwiZ2V0U2Vjb25kYXJ5Q29sb3IiLCJzZWNvbmRhcnlGaWVsZCIsInNlY29uZGFyeU91dGxpbmVDb2xvciIsInNlY29uZGFyeVNpemVTY2FsZSIsIlBvaW50TGFiZWxMYXllciIsImNoYXJhY3RlclNldCIsImNvbGxpc2lvbkVuYWJsZWQiLCJjb2xsaXNpb25Hcm91cCIsImdldFNlY29uZGFyeVRleHQiLCJnZXRUZXh0QW5jaG9yIiwiZ2V0QWxpZ25tZW50QmFzZWxpbmUiLCJmb250RmFtaWx5IiwiZm9udFNldHRpbmdzIiwic2RmIiwiZm9udFdlaWdodCIsIm91dGxpbmVXaWR0aCIsImdldEZpbHRlclZhbHVlIiwiZ2V0Q3VzdG9tTWFya2VySWNvbkFjY2Vzc29yIiwiaWNvblVybEFjY2Vzc29yIiwibWFzayIsIm1heEljb25TaXplIiwid2FudGVkVXJsIiwiaWNvbk9rIiwidXJsIiwid2lkdGgiLCJoZWlnaHQiLCJrZXBsZXJUYWJsZSIsIl9PYmplY3QkdmFsdWVzMiIsIl9PYmplY3QkdmFsdWVzMiRmaW5kIiwiX3RoaXMkY29uZmlnJGZpZWxkMiIsIl90aGlzJGNvbmZpZyR2aXNDb25maSIsImZpbmREZWZhdWx0TGF5ZXJQcm9wcyIsImZvdW5kTGF5ZXJzIiwiZmluZERlZmF1bHRDb2x1bW5GaWVsZCIsImRlZmF1bHRGaWVsZHMiLCJhbGxGaWVsZHMiLCJyZXF1aXJlZENvbHVtbnMiLCJyZXF1aXJlZEZpZWxkcyIsImdldEFsbFBvc3NpYmxlQ29sdW1uUGFyaXMiLCJhbGxLZXlzIiwicG9pbnRlcnMiLCJjb3VudFBlcktleSIsInBhaXJzIiwiaW5jcmVtZW50UG9pbnRlcnMiLCJuZXdQYWlyIiwiY3V1ciIsInB0cyIsImNvdW50cyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xheWVycy9iYXNlLWxheWVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMiBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBrZXltaXJyb3IgZnJvbSAna2V5bWlycm9yJztcbmltcG9ydCB7Q29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uLCBEYXRhRmlsdGVyRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcbmltcG9ydCB7Q09PUkRJTkFURV9TWVNURU0sIExheWVyIGFzIERlY2tMYXllcn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge19Qb2ludExhYmVsTGF5ZXIgYXMgUG9pbnRMYWJlbExheWVyfSBmcm9tICdAZGVjay5nbC9jYXJ0byc7XG5pbXBvcnQgRGVmYXVsdExheWVySWNvbiBmcm9tICcuL2RlZmF1bHQtbGF5ZXItaWNvbic7XG5pbXBvcnQge2RpZmZVcGRhdGVUcmlnZ2Vyc30gZnJvbSAnLi9sYXllci11cGRhdGUnO1xuaW1wb3J0IHtyZ2J9IGZyb20gJ2QzLWNvbG9yJztcblxuaW1wb3J0IHtcbiAgQUxMX0ZJRUxEX1RZUEVTLFxuICBOT19WQUxVRV9DT0xPUixcbiAgU0NBTEVfVFlQRVMsXG4gIENIQU5ORUxfU0NBTEVTLFxuICBGSUVMRF9PUFRTLFxuICBTQ0FMRV9GVU5DLFxuICBDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFMsXG4gIE1BWF9HUFVfRklMVEVSUyxcbiAgVU5LTk9XTl9DT0xPUixcbiAgWk9PTV9MRVZFTF9MSU1JVFNcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtDT0xPUl9SQU5HRVMsIGhleENvbG9yfSBmcm9tICdjb25zdGFudHMvY29sb3ItcmFuZ2VzJztcbmltcG9ydCB7RGF0YVZpekNvbG9yc30gZnJvbSAnY29uc3RhbnRzL2N1c3RvbS1jb2xvci1yYW5nZXMnO1xuaW1wb3J0IHtcbiAgTEFZRVJfVklTX0NPTkZJR1MsXG4gIERFRkFVTFRfVEVYVF9MQUJFTCxcbiAgREVGQVVMVF9DT0xPUl9VSSxcbiAgREVGQVVMVF9ISUdITElHSFRfQ09MT1IsXG4gIERFRkFVTFRfTEFZRVJfTEFCRUxcbn0gZnJvbSAnLi9sYXllci1mYWN0b3J5JztcblxuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZCwgaXNQbGFpbk9iamVjdH0gZnJvbSAndXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQge2dldExhdExuZ0JvdW5kcywgbm90TnVsbG9yVW5kZWZpbmVkfSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcbmltcG9ydCB7Z2V0U2FtcGxlRGF0YX0gZnJvbSAndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItdXRpbHMnO1xuXG5pbXBvcnQge2hleFRvUmdiLCBnZXRDb2xvckdyb3VwQnlOYW1lLCByZXZlcnNlQ29sb3JSYW5nZSwgY2hlY2tDb2xvck9yRmFsbGJhY2t9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcbmltcG9ydCB7Z2V0TWFza0V4dGVuc2lvblByb3BzfSBmcm9tICd1dGlscy9sYXllci11dGlscyc7XG5pbXBvcnQge3NjYWxlT3JkaW5hbH0gZnJvbSAnZDMtc2NhbGUnO1xuXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi9pbmRleCcpLkxheWVyfSBMYXllckNsYXNzfSAqL1xuXG4vKipcbiAqIEFwcHJveC4gbnVtYmVyIG9mIHBvaW50cyB0byBzYW1wbGUgaW4gYSBsYXJnZSBkYXRhIHNldFxuICogQHR5cGUge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IExBWUVSX0lEX0xFTkdUSCA9IDY7XG5cbi8vIE5vdGUsIHRoaXMgaXMgaXMgU1ZHIG9mIHNvbGlkIGNpcmNsZSBlbmNvZGVkIGFzIGRhdGEtdXJpXG5jb25zdCBGQUxMQkFDS19JQ09OID1cbiAgJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxQSE4yWnlCMmFXVjNRbTk0UFNJd0lEQWdNVEF3SURFd01DSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklqNE5DaUFnUEdOcGNtTnNaU0JqZUQwaU5UQWlJR041UFNJMU1DSWdjajBpTlRBaUx6NE5Dand2YzNablBnPT0nO1xuXG5jb25zdCBNQVhfU0FNUExFX1NJWkUgPSA1MDAwO1xuY29uc3QgZGVmYXVsdERvbWFpbiA9IFswLCAxXTtcbmNvbnN0IGRhdGFGaWx0ZXJFeHRlbnNpb24gPSBuZXcgRGF0YUZpbHRlckV4dGVuc2lvbih7ZmlsdGVyU2l6ZTogTUFYX0dQVV9GSUxURVJTfSk7XG5jb25zdCBjb2xsaXNpb25GaWx0ZXJFeHRlbnNpb24gPSBuZXcgQ29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uKCk7XG5cbmNvbnN0IGRlZmF1bHREYXRhQWNjZXNzb3IgPSBkYyA9PiBkID0+IGQ7XG5jb25zdCBkZWZhdWx0R2V0RmllbGRWYWx1ZSA9IChmaWVsZCwgZCkgPT4gZmllbGQudmFsdWVBY2Nlc3NvcihkKTtcbmNvbnN0IHNjYWxlSWRlbnRpdHkgPSB2ID0+IHY7XG5cbmV4cG9ydCBjb25zdCBPVkVSTEFZX1RZUEUgPSBrZXltaXJyb3Ioe1xuICBkZWNrZ2w6IG51bGwsXG4gIG1hcGJveGdsOiBudWxsXG59KTtcblxuZXhwb3J0IGNvbnN0IGxheWVyQ29sb3JzID0gT2JqZWN0LnZhbHVlcyhEYXRhVml6Q29sb3JzKS5tYXAoaGV4VG9SZ2IpO1xuZnVuY3Rpb24qIGdlbmVyYXRlQ29sb3IoKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IGxheWVyQ29sb3JzLmxlbmd0aCArIDEpIHtcbiAgICBpZiAoaW5kZXggPT09IGxheWVyQ29sb3JzLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICB5aWVsZCBsYXllckNvbG9yc1tpbmRleCsrXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29sb3JNYWtlciA9IGdlbmVyYXRlQ29sb3IoKTtcblxuLyoqIEB0eXBlIHtMYXllckNsYXNzfSAqL1xuY2xhc3MgTGF5ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IHByb3BzLmlkIHx8IGdlbmVyYXRlSGFzaElkKExBWUVSX0lEX0xFTkdUSCk7XG4gICAgLy8gbWV0YVxuICAgIHRoaXMubWV0YSA9IHt9O1xuXG4gICAgLy8gbGVnZW5kU2V0dGluZ3NcbiAgICB0aGlzLmxlZ2VuZFNldHRpbmdzID0ge307XG5cbiAgICAvLyB2aXNDb25maWdTZXR0aW5nc1xuICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3MgPSB7fTtcblxuICAgIC8vIGludGVyYWN0aXZpdHlTZXR0aW5nc1xuICAgIHRoaXMuX2ludGVyYWN0aXZpdHlTZXR0aW5ncyA9IHt9O1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXREZWZhdWx0TGF5ZXJDb25maWcoe1xuICAgICAgY29sdW1uczogdGhpcy5nZXRMYXllckNvbHVtbnMoKSxcbiAgICAgIC4uLnByb3BzXG4gICAgfSk7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBEZWZhdWx0TGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IG92ZXJsYXlUeXBlKCkge1xuICAgIHJldHVybiBPVkVSTEFZX1RZUEUuZGVja2dsO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlO1xuICB9XG5cbiAgZ2V0IGlzQWdncmVnYXRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgcmVxdWlyZWRMYXllckNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IG9wdGlvbmFsQ29sdW1ucygpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgbm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzKCkge1xuICAgIHJldHVybiBbJ2xhYmVsJywgJ29wYWNpdHknLCAndGhpY2tuZXNzJywgJ2lzVmlzaWJsZScsICdoaWRkZW4nXTtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjb2xvcicsXG4gICAgICAgIGZpZWxkOiAnY29sb3JGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnY29sb3JTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ2NvbG9yRG9tYWluJyxcbiAgICAgICAgcmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgICAgICAga2V5OiAnY29sb3InLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5jb2xvcixcbiAgICAgICAgbnVsbFZhbHVlOiBOT19WQUxVRV9DT0xPUixcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb25maWcgPT4gY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICBwcm9wZXJ0eTogJ3NpemUnLFxuICAgICAgICBmaWVsZDogJ3NpemVGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnc2l6ZVNjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnc2l6ZURvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnc2l6ZVJhbmdlJyxcbiAgICAgICAga2V5OiAnc2l6ZScsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLnNpemUsXG4gICAgICAgIG51bGxWYWx1ZTogMCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAxXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qXG4gICAqIENvbHVtbiBwYWlycyBtYXBzIGxheWVyIGNvbHVtbiB0byBhIHNwZWNpZmljIGZpZWxkIHBhaXJzLFxuICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gbnVsbFxuICAgKi9cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLypcbiAgICogRGVmYXVsdCBwb2ludCBjb2x1bW4gcGFpcnMsIGNhbiBiZSB1c2VkIGZvciBwb2ludCBiYXNlZCBsYXllcnM6IHBvaW50LCBpY29uIGV0Yy5cbiAgICovXG4gIGdldCBkZWZhdWx0UG9pbnRDb2x1bW5QYWlycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0OiB7cGFpcjogJ2xuZycsIGZpZWxkUGFpcktleTogJ2xhdCd9LFxuICAgICAgbG5nOiB7cGFpcjogJ2xhdCcsIGZpZWxkUGFpcktleTogJ2xuZyd9XG4gICAgfTtcbiAgfVxuXG4gIC8qXG4gICAqIERlZmF1bHQgbGluayBjb2x1bW4gcGFpcnMsIGNhbiBiZSB1c2VkIGZvciBsaW5rIGJhc2VkIGxheWVyczogYXJjLCBsaW5lIGV0Y1xuICAgKi9cbiAgZ2V0IGRlZmF1bHRMaW5rQ29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdDA6IHtwYWlyOiAnbG5nMCcsIGZpZWxkUGFpcktleTogJ2xhdCd9LFxuICAgICAgbG5nMDoge3BhaXI6ICdsYXQwJywgZmllbGRQYWlyS2V5OiAnbG5nJ30sXG4gICAgICBsYXQxOiB7cGFpcjogJ2xuZzEnLCBmaWVsZFBhaXJLZXk6ICdsYXQnfSxcbiAgICAgIGxuZzE6IHtwYWlyOiAnbGF0MScsIGZpZWxkUGFpcktleTogJ2xuZyd9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBSZWFjdCBjb21wb25lbnQgZm9yIHRvIHJlbmRlciBsYXllciBpbnN0cnVjdGlvbnMgaW4gYSBtb2RhbFxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIGFuIG9iamVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiAgcmV0dXJuIHtcbiAgICogICAgaWQ6ICdpY29uSW5mbycsXG4gICAqICAgIHRlbXBsYXRlOiBJY29uSW5mb01vZGFsLFxuICAgKiAgICBtb2RhbFByb3BzOiB7XG4gICAqICAgICAgdGl0bGU6ICdIb3cgdG8gZHJhdyBpY29ucydcbiAgICogICB9O1xuICAgKiB9XG4gICAqL1xuICBnZXQgbGF5ZXJJbmZvTW9kYWwoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpdml0eVNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGl2aXR5U2V0dGluZ3M7XG4gIH1cblxuICBzZXQgaW50ZXJhY3Rpdml0eVNldHRpbmdzKGludGVyYWN0aXZpdHlTZXR0aW5ncykge1xuICAgIHRoaXMuX2ludGVyYWN0aXZpdHlTZXR0aW5ncyA9IGludGVyYWN0aXZpdHlTZXR0aW5ncztcbiAgfVxuXG4gIGdldCBoYXNUb29sdGlwKCkge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmhvdmVyPy5maWVsZHMubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpdml0eVNldHRpbmdzPy5jbGljaz8uZmllbGRzLmxlbmd0aFxuICAgICk7XG4gIH1cblxuICBnZXQgaGFzSW50ZXJhY3Rpdml0eSgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmhhc1Rvb2x0aXAgJiYgdGhpcy5pbnRlcmFjdGl2aXR5U2V0dGluZ3M/LmVuYWJsZWQpO1xuICB9XG5cbiAgLypcbiAgICogR2l2ZW4gYSBkYXRhc2V0LCBhdXRvbWF0aWNhbGx5IGZpbmQgcHJvcHMgdG8gY3JlYXRlIGxheWVyIGJhc2VkIG9uIGl0XG4gICAqIGFuZCByZXR1cm4gdGhlIHByb3BzIGFuZCBwcmV2aW91cyBmb3VuZCBsYXllcnMuXG4gICAqIEJ5IGRlZmF1bHQsIG5vIGxheWVycyB3aWxsIGJlIGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIGZvdW5kTGF5ZXJzKSB7XG4gICAgcmV0dXJuIHtwcm9wczogW10sIGZvdW5kTGF5ZXJzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGFycmF5IG9mIHByZXNldCByZXF1aXJlZCBjb2x1bW4gbmFtZXNcbiAgICogZm91bmQgZmllbGQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0byBzZXQgYXMgbGF5ZXIgY29sdW1uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkZWZhdWx0RmllbGRzXG4gICAqIEBwYXJhbSB7b2JqZWN0W119IGFsbEZpZWxkc1xuICAgKiBAcmV0dXJucyB7b2JqZWN0W10gfCBudWxsfSBhbGwgcG9zc2libGUgcmVxdWlyZWQgbGF5ZXIgY29sdW1uIHBhaXJzXG4gICAqL1xuICBzdGF0aWMgZmluZERlZmF1bHRDb2x1bW5GaWVsZChkZWZhdWx0RmllbGRzLCBhbGxGaWVsZHMpIHtcbiAgICAvLyBmaW5kIGFsbCBtYXRjaGVkIGZpZWxkcyBmb3IgZWFjaCByZXF1aXJlZCBjb2xcbiAgICBjb25zdCByZXF1aXJlZENvbHVtbnMgPSBPYmplY3Qua2V5cyhkZWZhdWx0RmllbGRzKS5yZWR1Y2UoKHByZXYsIGtleSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWlyZWRGaWVsZHMgPSBhbGxGaWVsZHMuZmlsdGVyKFxuICAgICAgICBmID0+IGYubmFtZSA9PT0gZGVmYXVsdEZpZWxkc1trZXldIHx8IGRlZmF1bHRGaWVsZHNba2V5XS5pbmNsdWRlcyhmLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBwcmV2W2tleV0gPSByZXF1aXJlZEZpZWxkcy5sZW5ndGhcbiAgICAgICAgPyByZXF1aXJlZEZpZWxkcy5tYXAoZiA9PiAoe1xuICAgICAgICAgICAgdmFsdWU6IGYubmFtZSxcbiAgICAgICAgICAgIGZpZWxkSWR4OiBmLmZpZWxkSWR4XG4gICAgICAgICAgfSkpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9KTtcblxuICAgIGlmICghT2JqZWN0LnZhbHVlcyhyZXF1aXJlZENvbHVtbnMpLmV2ZXJ5KEJvb2xlYW4pKSB7XG4gICAgICAvLyBpZiBhbnkgZmllbGQgbWlzc2luZywgcmV0dXJuIG51bGxcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEFsbFBvc3NpYmxlQ29sdW1uUGFyaXMocmVxdWlyZWRDb2x1bW5zKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRBbGxQb3NzaWJsZUNvbHVtblBhcmlzKHJlcXVpcmVkQ29sdW1ucykge1xuICAgIC8vIGZvciBtdWx0aXBsZSBtYXRjaGVkIGZpZWxkIGZvciBvbmUgcmVxdWlyZWQgY29sdW1uLCByZXR1cm4gbXVsdGlwbGVcbiAgICAvLyBjb21iaW5hdGlvbnMsIGUuIGcuIGlmIGNvbHVtbiBhIGhhcyAyIG1hdGNoZWQsIGNvbHVtbiBiIGhhcyAzIG1hdGNoZWRcbiAgICAvLyA2IHBvc3NpYmxlIGNvbHVtbiBwYWlycyB3aWxsIGJlIHJldHVybmVkXG4gICAgY29uc3QgYWxsS2V5cyA9IE9iamVjdC5rZXlzKHJlcXVpcmVkQ29sdW1ucyk7XG4gICAgY29uc3QgcG9pbnRlcnMgPSBhbGxLZXlzLm1hcCgoaywgaSkgPT4gKChpID09PSBhbGxLZXlzLmxlbmd0aCAtIDEgPyAtMSA6IDApKSk7XG4gICAgY29uc3QgY291bnRQZXJLZXkgPSBhbGxLZXlzLm1hcChrID0+IHJlcXVpcmVkQ29sdW1uc1trXS5sZW5ndGgpO1xuICAgIGNvbnN0IHBhaXJzID0gW107XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb29wLWZ1bmMgKi9cbiAgICB3aGlsZSAoaW5jcmVtZW50UG9pbnRlcnMocG9pbnRlcnMsIGNvdW50UGVyS2V5LCBwb2ludGVycy5sZW5ndGggLSAxKSkge1xuICAgICAgY29uc3QgbmV3UGFpciA9IHBvaW50ZXJzLnJlZHVjZSgocHJldiwgY3V1ciwgaSkgPT4ge1xuICAgICAgICBwcmV2W2FsbEtleXNbaV1dID0gcmVxdWlyZWRDb2x1bW5zW2FsbEtleXNbaV1dW2N1dXJdO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgcGFpcnMucHVzaChuZXdQYWlyKTtcbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuICAgIC8vIHJlY3Vyc2l2ZWx5IGluY3JlbWVudCBwb2ludGVyc1xuICAgIGZ1bmN0aW9uIGluY3JlbWVudFBvaW50ZXJzKHB0cywgY291bnRzLCBpbmRleCkge1xuICAgICAgaWYgKGluZGV4ID09PSAwICYmIHB0c1swXSA9PT0gY291bnRzWzBdIC0gMSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGluY3JlbWVudFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChwdHNbaW5kZXhdICsgMSA8IGNvdW50c1tpbmRleF0pIHtcbiAgICAgICAgcHRzW2luZGV4XSA9IHB0c1tpbmRleF0gKyAxO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcHRzW2luZGV4XSA9IDA7XG4gICAgICByZXR1cm4gaW5jcmVtZW50UG9pbnRlcnMocHRzLCBjb3VudHMsIGluZGV4IC0gMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhaXJzO1xuICB9XG5cbiAgc3RhdGljIGhleFRvUmdiKGMpIHtcbiAgICByZXR1cm4gaGV4VG9SZ2IoYyk7XG4gIH1cblxuICBnZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhSWQ6IHByb3BzLmRhdGFJZCB8fCBudWxsLFxuICAgICAgdmlzaWJpbGl0eUJ5Wm9vbToge1xuICAgICAgICBtaW46IHByb3BzLnZpc2liaWxpdHlCeVpvb20/Lm1pbiB8fCBaT09NX0xFVkVMX0xJTUlUUy5taW4sXG4gICAgICAgIG1heDogcHJvcHMudmlzaWJpbGl0eUJ5Wm9vbT8ubWF4IHx8IFpPT01fTEVWRUxfTElNSVRTLm1heFxuICAgICAgfSxcbiAgICAgIGxhYmVsOiBwcm9wcy5sYWJlbCB8fCBERUZBVUxUX0xBWUVSX0xBQkVMLFxuICAgICAgY29sb3I6IHByb3BzLmNvbG9yIHx8IGNvbG9yTWFrZXIubmV4dCgpLnZhbHVlLFxuICAgICAgY29sdW1uczogcHJvcHMuY29sdW1ucyB8fCBudWxsLFxuICAgICAgaXNWaXNpYmxlOiBwcm9wcy5pc1Zpc2libGUgfHwgZmFsc2UsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogcHJvcHMuaXNDb25maWdBY3RpdmUgfHwgZmFsc2UsXG4gICAgICBoaWdobGlnaHRDb2xvcjogcHJvcHMuaGlnaGxpZ2h0Q29sb3IgfHwgREVGQVVMVF9ISUdITElHSFRfQ09MT1IsXG4gICAgICBoaWRkZW46IHByb3BzLmhpZGRlbiB8fCBmYWxzZSxcblxuICAgICAgLy8gVE9ETzogcmVmYWN0b3IgdGhpcyBpbnRvIHNlcGFyYXRlIHZpc3VhbCBDaGFubmVsIGNvbmZpZ1xuICAgICAgLy8gY29sb3IgYnkgZmllbGQsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIGNvbG9yRmllbGQ6IG51bGwsXG4gICAgICBjb2xvckRvbWFpbjogWzAsIDFdLFxuICAgICAgY29sb3JTY2FsZTogU0NBTEVfVFlQRVMucXVhbnRpbGUsXG5cbiAgICAgIC8vIGNvbG9yIGJ5IHNpemUsIGRvbWFpbiBpcyBzZXQgYnkgZmlsdGVycywgZmllbGQsIHNjYWxlIHR5cGVcbiAgICAgIHNpemVEb21haW46IFswLCAxXSxcbiAgICAgIHNpemVTY2FsZTogU0NBTEVfVFlQRVMubGluZWFyLFxuICAgICAgc2l6ZUZpZWxkOiBudWxsLFxuICAgICAgcmFkaXVzRmllbGQ6IG51bGwsXG5cbiAgICAgIHZpc0NvbmZpZzoge30sXG5cbiAgICAgIHRleHRMYWJlbDogW0RFRkFVTFRfVEVYVF9MQUJFTF0sXG5cbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgY29sb3I6IERFRkFVTFRfQ09MT1JfVUksXG4gICAgICAgIGNvbG9yUmFuZ2U6IERFRkFVTFRfQ09MT1JfVUlcbiAgICAgIH0sXG4gICAgICBhbmltYXRpb246IHtlbmFibGVkOiBmYWxzZX1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgYSB2aXN1YWxDaGFubmVsIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zIHt7bGFiZWw6IHN0cmluZywgbWVhc3VyZTogKHN0cmluZ3xzdHJpbmcpfX1cbiAgICovXG4gIGdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbihrZXkpIHtcbiAgICAvLyBlLmcuIGxhYmVsOiBDb2xvciwgbWVhc3VyZTogVmVoaWNsZSBUeXBlXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5yYW5nZV0ubGFiZWwsXG4gICAgICBtZWFzdXJlOiB0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZmllbGRdXG4gICAgICAgID8gKHRoaXMuY29uZmlnW3RoaXMudmlzdWFsQ2hhbm5lbHNba2V5XS5maWVsZF0uZGlzcGxheU5hbWUgfHxcbiAgICAgICAgICB0aGlzLmNvbmZpZ1t0aGlzLnZpc3VhbENoYW5uZWxzW2tleV0uZmllbGRdLm5hbWUpXG4gICAgICAgIDogdGhpcy52aXN1YWxDaGFubmVsc1trZXldLmRlZmF1bHRNZWFzdXJlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ24gYSBmaWVsZCB0byBsYXllciBjb2x1bW4sIHJldHVybiBjb2x1bW4gY29uZmlnXG4gICAqIEBwYXJhbSBrZXkgLSBDb2x1bW4gS2V5XG4gICAqIEBwYXJhbSBmaWVsZCAtIFNlbGVjdGVkIGZpZWxkXG4gICAqIEByZXR1cm5zIHt7fX0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW4oa2V5LCBmaWVsZCkge1xuICAgIC8vIGZpZWxkIHZhbHVlIGNvdWxkIGJlIG51bGwgZm9yIG9wdGlvbmFsIGNvbHVtbnNcbiAgICBjb25zdCB1cGRhdGUgPSBmaWVsZFxuICAgICAgPyB7XG4gICAgICAgICAgdmFsdWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgZmllbGRJZHg6IGZpZWxkLmZpZWxkSWR4XG4gICAgICAgIH1cbiAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBba2V5XToge1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5jb2x1bW5zW2tleV0sXG4gICAgICAgIC4uLnVwZGF0ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzaWduIGEgZmllbGQgcGFpciB0byBjb2x1bW4gY29uZmlnLCByZXR1cm4gY29sdW1uIGNvbmZpZ1xuICAgKiBAcGFyYW0ga2V5IC0gQ29sdW1uIEtleVxuICAgKiBAcGFyYW0gcGFpciAtIGZpZWxkIFBhaXJcbiAgICogQHJldHVybnMge29iamVjdH0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW5QYWlycyhrZXksIHBhaXIpIHtcbiAgICBpZiAoIXRoaXMuY29sdW1uUGFpcnMgfHwgIXRoaXMuY29sdW1uUGFpcnM/LltrZXldKSB7XG4gICAgICAvLyBzaG91bGQgbm90IGVuZCBpbiB0aGlzIHN0YXRlXG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuY29sdW1ucztcbiAgICB9XG5cbiAgICBjb25zdCB7cGFpcjogcGFydG5lcktleSwgZmllbGRQYWlyS2V5fSA9IHRoaXMuY29sdW1uUGFpcnM/LltrZXldO1xuICAgIGNvbnN0IHtmaWVsZFBhaXJLZXk6IHBhcnRuZXJGaWVsZFBhaXJLZXl9ID0gdGhpcy5jb2x1bW5QYWlycz8uW3BhcnRuZXJLZXldO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBba2V5XTogcGFpcltmaWVsZFBhaXJLZXldLFxuICAgICAgW3BhcnRuZXJLZXldOiBwYWlyW3BhcnRuZXJGaWVsZFBhaXJLZXldXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYSByYWRpdXMgem9vbSBtdWx0aXBsaWVyIHRvIHJlbmRlciBwb2ludHMsIHNvIHRoZXkgYXJlIHZpc2libGUgaW4gYWxsIHpvb20gbGV2ZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IG1hcFN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXBTdGF0ZS56b29tIC0gYWN0dWFsIHpvb21cbiAgICogQHBhcmFtIHtudW1iZXIgfCB2b2lkfSBtYXBTdGF0ZS56b29tT2Zmc2V0IC0gem9vbU9mZnNldCB3aGVuIHJlbmRlciBpbiB0aGUgcGxvdCBjb250YWluZXIgZm9yIGV4cG9ydCBpbWFnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0Wm9vbUZhY3Rvcih7em9vbSwgem9vbU9mZnNldCA9IDB9KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGgubWF4KDE0IC0gem9vbSArIHpvb21PZmZzZXQsIDApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYSBlbGV2YXRpb24gem9vbSBtdWx0aXBsaWVyIHRvIHJlbmRlciBwb2ludHMsIHNvIHRoZXkgYXJlIHZpc2libGUgaW4gYWxsIHpvb20gbGV2ZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IG1hcFN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXBTdGF0ZS56b29tIC0gYWN0dWFsIHpvb21cbiAgICogQHBhcmFtIHtudW1iZXIgfCB2b2lkfSBtYXBTdGF0ZS56b29tT2Zmc2V0IC0gem9vbU9mZnNldCB3aGVuIHJlbmRlciBpbiB0aGUgcGxvdCBjb250YWluZXIgZm9yIGV4cG9ydCBpbWFnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0RWxldmF0aW9uWm9vbUZhY3Rvcih7em9vbSwgem9vbU9mZnNldCA9IDB9KSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnZpc0NvbmZpZy5lbmFibGVFbGV2YXRpb25ab29tRmFjdG9yXG4gICAgICA/IE1hdGgucG93KDIsIE1hdGgubWF4KDggLSB6b29tICsgem9vbU9mZnNldCwgMCkpXG4gICAgICA6IDE7XG4gIH1cblxuICBmb3JtYXRMYXllckRhdGEoZGF0YXNldHMsIGZpbHRlcmVkSW5kZXgpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZW5kZXJMYXllcigpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXRIb3ZlckRhdGEob2JqZWN0LCBkYXRhQ29udGFpbmVyKSB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIGVhY2ggZW50cnkgb2YgbGF5ZXJEYXRhIHNob3VsZCBoYXZlIGFuIGluZGV4IG9mIGEgcm93IGluIHRoZSBvcmlnaW5hbCBkYXRhIGNvbnRhaW5lci5cbiAgICAvLyBFYWNoIGxheWVyIGNhbiBpbXBsZW1lbnQgaXRzIG93biBnZXRIb3ZlckRhdGEgbWV0aG9kXG4gICAgcmV0dXJuIGRhdGFDb250YWluZXIucm93KG9iamVjdC5pbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBjaGFuZ2UgbGF5ZXIgdHlwZSwgdHJ5IHRvIGNvcHkgb3ZlciBsYXllciBjb25maWdzIGFzIG11Y2ggYXMgcG9zc2libGVcbiAgICogQHBhcmFtIGNvbmZpZ1RvQ29weSAtIGNvbmZpZyB0byBjb3B5IG92ZXJcbiAgICogQHBhcmFtIHZpc0NvbmZpZ1NldHRpbmdzIC0gdmlzQ29uZmlnIHNldHRpbmdzIG9mIGNvbmZpZyB0byBjb3B5XG4gICAqL1xuICBhc3NpZ25Db25maWdUb0xheWVyKGNvbmZpZ1RvQ29weSwgdmlzQ29uZmlnU2V0dGluZ3MpIHtcbiAgICAvLyBkb24ndCBkZWVwIG1lcmdlIHZpc3VhbENoYW5uZWwgZmllbGRcbiAgICAvLyBkb24ndCBkZWVwIG1lcmdlIGNvbG9yIHJhbmdlLCByZXZlcnNlZDogaXMgbm90IGEga2V5IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBzaGFsbG93Q29weSA9IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ10uY29uY2F0KFxuICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5tYXAodiA9PiB2LmZpZWxkKVxuICAgICk7XG5cbiAgICAvLyBkb24ndCBjb3B5IG92ZXIgZG9tYWluIGFuZCBhbmltYXRpb25cbiAgICBjb25zdCBub3RUb0NvcHkgPSBbJ2FuaW1hdGlvbiddLmNvbmNhdChPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLm1hcCh2ID0+IHYuZG9tYWluKSk7XG4gICAgLy8gaWYgcmFuZ2UgaXMgZm9yIHRoZSBzYW1lIHByb3BlcnR5IGdyb3VwIGNvcHkgaXQsIG90aGVyd2lzZSwgbm90IHRvIGNvcHlcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2godiA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZ1RvQ29weS52aXNDb25maWdbdi5yYW5nZV0gJiZcbiAgICAgICAgdGhpcy52aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXSAmJlxuICAgICAgICB2aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXS5ncm91cCAhPT0gdGhpcy52aXNDb25maWdTZXR0aW5nc1t2LnJhbmdlXS5ncm91cFxuICAgICAgKSB7XG4gICAgICAgIG5vdFRvQ29weS5wdXNoKHYucmFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZG9uJ3QgY29weSBvdmVyIHZpc3VhbENoYW5uZWwgcmFuZ2VcbiAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgY29waWVkID0gdGhpcy5jb3B5TGF5ZXJDb25maWcoY3VycmVudENvbmZpZywgY29uZmlnVG9Db3B5LCB7XG4gICAgICBzaGFsbG93Q29weSxcbiAgICAgIG5vdFRvQ29weVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoY29waWVkKTtcbiAgICAvLyB2YWxpZGF0ZSB2aXN1YWxDaGFubmVsIGZpZWxkIHR5cGUgYW5kIHNjYWxlIHR5cGVzXG4gICAgT2JqZWN0LmtleXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgLypcbiAgICogUmVjdXJzaXZlbHkgY29weSBjb25maWcgb3ZlciB0byBhbiBlbXB0eSBsYXllclxuICAgKiB3aGVuIHJlY2VpdmVkIHNhdmVkIGNvbmZpZywgb3IgY29weSBjb25maWcgb3ZlciBmcm9tIGEgZGlmZmVyZW50IGxheWVyIHR5cGVcbiAgICogbWFrZSBzdXJlIHRvIG9ubHkgY29weSBvdmVyIHZhbHVlIHRvIGV4aXN0aW5nIGtleXNcbiAgICogQHBhcmFtIHtvYmplY3R9IGN1cnJlbnRDb25maWcgLSBleGlzdGluZyBjb25maWcgdG8gYmUgb3ZlcnJpZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1RvQ29weSAtIG5ldyBDb25maWcgdG8gY29weSBvdmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNoYWxsb3dDb3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyB0byBub3QgdG8gYmUgZGVlcCBjb3BpZWRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbm90VG9Db3B5IC0gYXJyYXkgb2YgcHJvcGVydGllcyBub3QgdG8gY29weVxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIGNvcGllZCBjb25maWdcbiAgICovXG4gIGNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnLCBjb25maWdUb0NvcHksIHtzaGFsbG93Q29weSA9IFtdLCBub3RUb0NvcHkgPSBbXX0gPSB7fSkge1xuICAgIGNvbnN0IGNvcGllZCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNQbGFpbk9iamVjdChjdXJyZW50Q29uZmlnW2tleV0pICYmXG4gICAgICAgIGlzUGxhaW5PYmplY3QoY29uZmlnVG9Db3B5W2tleV0pICYmXG4gICAgICAgICFzaGFsbG93Q29weS5pbmNsdWRlcyhrZXkpICYmXG4gICAgICAgICFub3RUb0NvcHkuaW5jbHVkZXMoa2V5KVxuICAgICAgKSB7XG4gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGFzc2lnbiBvYmplY3QgdmFsdWVcbiAgICAgICAgY29waWVkW2tleV0gPSB0aGlzLmNvcHlMYXllckNvbmZpZyhjdXJyZW50Q29uZmlnW2tleV0sIGNvbmZpZ1RvQ29weVtrZXldLCB7XG4gICAgICAgICAgc2hhbGxvd0NvcHksXG4gICAgICAgICAgbm90VG9Db3B5XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChub3ROdWxsb3JVbmRlZmluZWQoY29uZmlnVG9Db3B5W2tleV0pICYmICFub3RUb0NvcHkuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAvLyBjb3B5XG4gICAgICAgIGNvcGllZFtrZXldID0gY29uZmlnVG9Db3B5W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBrZWVwIGV4aXN0aW5nXG4gICAgICAgIGNvcGllZFtrZXldID0gY3VycmVudENvbmZpZ1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvcGllZDtcbiAgfVxuXG4gIHJlZ2lzdGVyVmlzQ29uZmlnKGxheWVyVmlzQ29uZmlncykge1xuICAgIE9iamVjdC5rZXlzKGxheWVyVmlzQ29uZmlncykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgJiYgTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXSkge1xuICAgICAgICAvLyBpZiBhc3NpZ25lZCBvbmUgb2YgZGVmYXVsdCBMQVlFUl9DT05GSUdTXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IExBWUVSX1ZJU19DT05GSUdTW2xheWVyVmlzQ29uZmlnc1tpdGVtXV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzW2l0ZW1dID0gTEFZRVJfVklTX0NPTkZJR1NbbGF5ZXJWaXNDb25maWdzW2l0ZW1dXTtcbiAgICAgIH0gZWxzZSBpZiAoWyd0eXBlJywgJ2RlZmF1bHRWYWx1ZSddLmV2ZXJ5KHAgPT4gbGF5ZXJWaXNDb25maWdzW2l0ZW1dLmhhc093blByb3BlcnR5KHApKSkge1xuICAgICAgICAvLyBpZiBwcm92aWRlZCBjdXN0b21pemVkIHZpc0NvbmZpZywgYW5kIGhhcyB0eXBlICYmIGRlZmF1bHRWYWx1ZVxuICAgICAgICAvLyBUT0RPOiBmdXJ0aGVyIGNoZWNrIGlmIGN1c3RvbWl6ZWQgdmlzQ29uZmlnIGlzIHZhbGlkXG4gICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tpdGVtXSA9IGxheWVyVmlzQ29uZmlnc1tpdGVtXS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMudmlzQ29uZmlnU2V0dGluZ3NbaXRlbV0gPSBsYXllclZpc0NvbmZpZ3NbaXRlbV07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRMYXllckNvbHVtbnMoKSB7XG4gICAgY29uc3QgY29sdW1uVmFsaWRhdG9ycyA9IHRoaXMuY29sdW1uVmFsaWRhdG9ycyB8fCB7fTtcbiAgICBjb25zdCByZXF1aXJlZCA9IHRoaXMucmVxdWlyZWRMYXllckNvbHVtbnMucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGNvbHVtblZhbGlkYXRvcnNba2V5XVxuICAgICAgICAgID8ge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTEsIHZhbGlkYXRvcjogY29sdW1uVmFsaWRhdG9yc1trZXldfVxuICAgICAgICAgIDoge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTF9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25hbCA9IHRoaXMub3B0aW9uYWxDb2x1bW5zLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgb3B0aW9uYWw6IHRydWV9XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7Li4ucmVxdWlyZWQsIC4uLm9wdGlvbmFsfTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29uZmlnKG5ld0NvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gey4uLnRoaXMuY29uZmlnLCAuLi5uZXdDb25maWd9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJWaXNDb25maWcobmV3VmlzQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcudmlzQ29uZmlnID0gey4uLnRoaXMuY29uZmlnLnZpc0NvbmZpZywgLi4ubmV3VmlzQ29uZmlnfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUxheWVyQ29sb3JVSShwcm9wLCBuZXdDb25maWcpIHtcbiAgICBjb25zdCB7Y29sb3JVSTogcHJldmlvdXMsIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghaXNQbGFpbk9iamVjdChuZXdDb25maWcpIHx8IHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JVSVByb3AgPSBPYmplY3QuZW50cmllcyhuZXdDb25maWcpLnJlZHVjZSgoYWNjdSwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XTogaXNQbGFpbk9iamVjdChhY2N1W2tleV0pICYmIGlzUGxhaW5PYmplY3QodmFsdWUpID8gey4uLmFjY3Vba2V5XSwgLi4udmFsdWV9IDogdmFsdWVcbiAgICAgIH07XG4gICAgfSwgcHJldmlvdXNbcHJvcF0gfHwgREVGQVVMVF9DT0xPUl9VSSk7XG5cbiAgICBjb25zdCBjb2xvclVJID0ge1xuICAgICAgLi4ucHJldmlvdXMsXG4gICAgICBbcHJvcF06IGNvbG9yVUlQcm9wXG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe2NvbG9yVUl9KTtcbiAgICAvLyBpZiBjb2xvclVJW3Byb3BdIGlzIGNvbG9yUmFuZ2UuIElmIHR5cGUgaXMgaGV4Q29sb3IgdGhlbiBpdCdzIGFsc28gYSByYW5nZVxuICAgIGNvbnN0IGlzQ29sb3JSYW5nZSA9XG4gICAgICB2aXNDb25maWdbcHJvcF0gJiYgKHZpc0NvbmZpZ1twcm9wXS5jb2xvcnMgfHwgdmlzQ29uZmlnW3Byb3BdLnR5cGUgPT09IGhleENvbG9yKTtcblxuICAgIGlmIChpc0NvbG9yUmFuZ2UpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29sb3JVSUJ5Q29sb3JSYW5nZShuZXdDb25maWcsIHByb3ApO1xuICAgICAgdGhpcy51cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApO1xuICAgICAgdGhpcy51cGRhdGVDdXN0b21QYWxldHRlKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlQ3VzdG9tUGFsZXR0ZShuZXdDb25maWcsIHByZXZpb3VzLCBwcm9wKSB7XG4gICAgaWYgKCFuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZyB8fCAhbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuY3VzdG9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2NvbG9yVUksIHZpc0NvbmZpZ30gPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghdmlzQ29uZmlnW3Byb3BdKSByZXR1cm47XG4gICAgY29uc3Qge2NvbG9yc30gPSB2aXNDb25maWdbcHJvcF07XG4gICAgY29uc3QgY3VzdG9tUGFsZXR0ZSA9IHtcbiAgICAgIC4uLmNvbG9yVUlbcHJvcF0uY3VzdG9tUGFsZXR0ZSxcbiAgICAgIG5hbWU6ICdDdXN0b20gUGFsZXR0ZScsXG4gICAgICBjb2xvcnM6IFsuLi5jb2xvcnNdXG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgLi4uY29sb3JVSSxcbiAgICAgICAgW3Byb3BdOiB7XG4gICAgICAgICAgLi4uY29sb3JVSVtwcm9wXSxcbiAgICAgICAgICBjdXN0b21QYWxldHRlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogaWYgb3BlbiBkcm9wZG93biBhbmQgcHJvcCBpcyBjb2xvciByYW5nZVxuICAgKiBBdXRvbWF0aWNhbGx5IHNldCBjb2xvclJhbmdlQ29uZmlnJ3Mgc3RlcCwgcmV2ZXJzZWQgYW5kIHR5cGVcbiAgICogQHBhcmFtIHsqfSBuZXdDb25maWdcbiAgICogQHBhcmFtIHsqfSBwcm9wXG4gICAqL1xuICB1cGRhdGVDb2xvclVJQnlDb2xvclJhbmdlKG5ld0NvbmZpZywgcHJvcCkge1xuICAgIGlmICh0eXBlb2YgbmV3Q29uZmlnLnNob3dEcm9wZG93biAhPT0gJ251bWJlcicpIHJldHVybjtcblxuICAgIGNvbnN0IHtjb2xvclVJLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICBjb2xvclVJOiB7XG4gICAgICAgIC4uLmNvbG9yVUksXG4gICAgICAgIFtwcm9wXToge1xuICAgICAgICAgIC4uLmNvbG9yVUlbcHJvcF0sXG4gICAgICAgICAgY29sb3JSYW5nZUNvbmZpZzoge1xuICAgICAgICAgICAgLi4uY29sb3JVSVtwcm9wXS5jb2xvclJhbmdlQ29uZmlnLFxuICAgICAgICAgICAgdHlwZTogdmlzQ29uZmlnW3Byb3BdLnR5cGUsXG4gICAgICAgICAgICBzdGVwczogdmlzQ29uZmlnW3Byb3BdLmNvbG9ycz8ubGVuZ3RoLFxuICAgICAgICAgICAgcmV2ZXJzZWQ6IEJvb2xlYW4odmlzQ29uZmlnW3Byb3BdLnJldmVyc2VkKSxcbiAgICAgICAgICAgIGhleENvbHVtbjogdGhpcy5nZXRIZXhDb2x1bW4ocHJvcCksXG4gICAgICAgICAgICBpc0hleENvbHVtbjogdGhpcy5pc0NvbG9yZWRCeUNvbG9yQ29sdW1uKHByb3ApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICB1cGRhdGVDb2xvclJhbmdlQnlDb2xvclVJKG5ld0NvbmZpZywgcHJldmlvdXMsIHByb3ApIHtcbiAgICAvLyBvbmx5IHVwZGF0ZSBjb2xvclJhbmdlIGlmIGNoYW5nZXMgaW4gVUkgaXMgbWFkZSB0byAncmV2ZXJzZWQnLCAnc3RlcHMnIG9yIHN0ZXBzXG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlID1cbiAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnICYmXG4gICAgICBbJ3JldmVyc2VkJywgJ3N0ZXBzJ10uc29tZShcbiAgICAgICAga2V5ID0+XG4gICAgICAgICAgbmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSAmJlxuICAgICAgICAgIG5ld0NvbmZpZy5jb2xvclJhbmdlQ29uZmlnW2tleV0gIT09XG4gICAgICAgICAgICAocHJldmlvdXNbcHJvcF0gfHwgREVGQVVMVF9DT0xPUl9VSSkuY29sb3JSYW5nZUNvbmZpZ1trZXldXG4gICAgICApO1xuICAgIGlmICghc2hvdWxkVXBkYXRlKSByZXR1cm47XG5cbiAgICBjb25zdCB7Y29sb3JVSSwgdmlzQ29uZmlnfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHtzdGVwcywgcmV2ZXJzZWR9ID0gY29sb3JVSVtwcm9wXS5jb2xvclJhbmdlQ29uZmlnO1xuICAgIGNvbnN0IGNvbG9yUmFuZ2UgPSB2aXNDb25maWdbcHJvcF07XG4gICAgLy8gZmluZCBiYXNlZCBvbiBzdGVwIG9yIHJldmVyc2VkXG4gICAgbGV0IHVwZGF0ZTtcbiAgICBpZiAobmV3Q29uZmlnLmNvbG9yUmFuZ2VDb25maWcuaGFzT3duUHJvcGVydHkoJ3N0ZXBzJykpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ2V0Q29sb3JHcm91cEJ5TmFtZShjb2xvclJhbmdlKTtcblxuICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgIGNvbnN0IHNhbWVHcm91cCA9IENPTE9SX1JBTkdFUy5maWx0ZXIoY3IgPT4gZ2V0Q29sb3JHcm91cEJ5TmFtZShjcikgPT09IGdyb3VwKTtcblxuICAgICAgICB1cGRhdGUgPSBzYW1lR3JvdXAuZmluZChjciA9PiBjci5jb2xvcnMubGVuZ3RoID09PSBzdGVwcyk7XG5cbiAgICAgICAgaWYgKHVwZGF0ZSAmJiBjb2xvclJhbmdlLnJldmVyc2VkKSB7XG4gICAgICAgICAgdXBkYXRlID0gcmV2ZXJzZUNvbG9yUmFuZ2UodHJ1ZSwgdXBkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGUgJiYgY29sb3JSYW5nZS5jb2xvck1hcCkge1xuICAgICAgICAgIHVwZGF0ZSA9IHRoaXMudXBkYXRlQ29sb3JNYXAocHJvcCwgY29sb3JSYW5nZS5jb2xvck1hcCwgdXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXdDb25maWcuY29sb3JSYW5nZUNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncmV2ZXJzZWQnKSkge1xuICAgICAgdXBkYXRlID0gcmV2ZXJzZUNvbG9yUmFuZ2UocmV2ZXJzZWQsIHVwZGF0ZSB8fCBjb2xvclJhbmdlKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzQ29uZmlnKHtbcHJvcF06IHVwZGF0ZX0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbG9yTWFwKHByb3AsIGNvbG9yTWFwLCBjb2xvclJhbmdlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHtmaWVsZCwgZG9tYWlufSA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZmluZCh2YWx1ZSA9PiB2YWx1ZS5yYW5nZSA9PT0gcHJvcCk7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuY29uZmlnW2ZpZWxkXT8udHlwZTtcblxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYXRlZ29yeUNvbG9yTWFwKGNvbG9yTWFwLCB0aGlzLmNvbmZpZ1tkb21haW5dLCBjb2xvclJhbmdlKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyB0eXBlIG9yIHR5cGUgaXMgbm90IHN0cmluZywgYm9vbGVhbiBvciBkYXRlXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlTnVtZXJpY0NvbG9yTWFwKGNvbG9yTWFwLCB0aGlzLmNvbmZpZ1tkb21haW5dLCBjb2xvclJhbmdlKTtcbiAgfVxuXG4gIHVwZGF0ZUNhdGVnb3J5Q29sb3JNYXAoY29sb3JNYXAsIGRvbWFpbiwgY29sb3JSYW5nZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IGNvbG9yUmFuZ2UuY29sb3JzO1xuICAgIGNvbnN0IGFzc2lnbmVkQ2F0ZWdvcmllcyA9IFtdO1xuICAgIGlmIChjb2xvclJhbmdlLnR5cGUgPT09IGhleENvbG9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb2xvclJhbmdlLFxuICAgICAgICBjb2xvck1hcDogW11cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbG9yTWFwID0gY29sb3JNYXAuc2xpY2UoMCwgY29sb3JzLmxlbmd0aCkubWFwKChjTWFwLCBpbmRleCkgPT4ge1xuICAgICAgYXNzaWduZWRDYXRlZ29yaWVzLnB1c2goY01hcFswXSk7XG4gICAgICByZXR1cm4gW2NNYXBbMF0sIGNvbG9yc1tpbmRleF1dO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuYXNzaWduZWRDb2xvcnMgPSBjb2xvcnMuc2xpY2UobmV3Q29sb3JNYXAubGVuZ3RoLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIGZvciAoY29uc3QgY29sb3Igb2YgdW5hc3NpZ25lZENvbG9ycykge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBkb21haW4uZmluZChkID0+ICFhc3NpZ25lZENhdGVnb3JpZXMuaW5jbHVkZXMoZCkpO1xuICAgICAgaWYgKCFjYXRlZ29yeSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGFzc2lnbmVkQ2F0ZWdvcmllcy5wdXNoKGNhdGVnb3J5KTtcbiAgICAgIG5ld0NvbG9yTWFwLnB1c2goW2NhdGVnb3J5LCBjb2xvcl0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29sb3JSYW5nZSxcbiAgICAgIGNvbG9yTWFwOiBuZXdDb2xvck1hcFxuICAgIH07XG4gIH1cblxuICB1cGRhdGVOdW1lcmljQ29sb3JNYXAoY29sb3JNYXAsIGRvbWFpbiwgdXBkYXRlKSB7XG4gICAgY29uc3QgY29sb3JzID0gdXBkYXRlLmNvbG9ycztcbiAgICBsZXQgbmV3Q29sb3JNYXAgPSBjb2xvck1hcC5zbGljZSgwLCBjb2xvcnMubGVuZ3RoKTtcblxuICAgIG5ld0NvbG9yTWFwID0gbmV3Q29sb3JNYXAubWFwKChjTWFwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbmRleCA9PT0gbmV3Q29sb3JNYXAubGVuZ3RoIC0gMSA/IG51bGwgOiBjTWFwWzBdO1xuICAgICAgcmV0dXJuIFt2YWx1ZSwgY29sb3JzW2luZGV4XV07XG4gICAgfSk7XG4gICAgY29uc3QgdW5hc3NpZ25lZENvbG9ycyA9IGNvbG9ycy5zbGljZShuZXdDb2xvck1hcC5sZW5ndGgsIGNvbG9ycy5sZW5ndGgpO1xuXG4gICAgaWYgKHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY29sb3JNYXBWYWx1ZXMgPSBjb2xvck1hcC5tYXAoYyA9PiBjWzBdKS5maWx0ZXIoYyA9PiB0eXBlb2YgYyA9PT0gJ251bWJlcicpO1xuICAgICAgY29uc3QgbWF4VmFsdWUgPSBNYXRoLm1heCguLi5jb2xvck1hcFZhbHVlcywgZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSk7XG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBuZXdDb2xvck1hcFtuZXdDb2xvck1hcC5sZW5ndGggLSAyXVswXTtcbiAgICAgIGNvbnN0IHN0ZXAgPSAobWF4VmFsdWUgLSBwcmV2VmFsdWUpIC8gKHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoICsgMSk7XG4gICAgICBuZXdDb2xvck1hcFtuZXdDb2xvck1hcC5sZW5ndGggLSAxXVswXSA9IHByZXZWYWx1ZSArIHN0ZXA7XG5cbiAgICAgIGZvciAoY29uc3QgW2ksIGNvbG9yXSBvZiB1bmFzc2lnbmVkQ29sb3JzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGkgPT09IHVuYXNzaWduZWRDb2xvcnMubGVuZ3RoIC0gMSA/IG51bGwgOiBwcmV2VmFsdWUgKyAoc3RlcCAqIChpICsgMikpO1xuICAgICAgICBuZXdDb2xvck1hcC5wdXNoKFt2YWx1ZSwgY29sb3JdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnVwZGF0ZSxcbiAgICAgIGNvbG9yTWFwOiBuZXdDb2xvck1hcFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciBsYXllciBoYXMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHllcyBvciBub1xuICAgKi9cbiAgaGFzQWxsQ29sdW1ucygpIHtcbiAgICBjb25zdCB7Y29sdW1uc30gPSB0aGlzLmNvbmZpZztcbiAgICByZXR1cm4gKFxuICAgICAgKGNvbHVtbnMgJiZcbiAgICAgIE9iamVjdC52YWx1ZXMoY29sdW1ucykuZXZlcnkodiA9PiB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHYub3B0aW9uYWwgfHwgKHYudmFsdWUgJiYgdi5maWVsZElkeCA+IC0xKSk7XG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgbGF5ZXIgaGFzIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheSB8IE9iamVjdH0gbGF5ZXJEYXRhXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB5ZXMgb3Igbm9cbiAgICovXG4gIGhhc0xheWVyRGF0YShsYXllckRhdGEpIHtcbiAgICBpZiAoIWxheWVyRGF0YSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gQm9vbGVhbihsYXllckRhdGEuZGF0YSAmJiBsYXllckRhdGEuZGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgaXNWYWxpZFRvU2F2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlICYmIHRoaXMuaGFzQWxsQ29sdW1ucygpO1xuICB9XG5cbiAgc2hvdWxkUmVuZGVyTGF5ZXIoZGF0YSkge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy50eXBlICYmXG4gICAgICB0aGlzLmhhc0FsbENvbHVtbnMoKSAmJlxuICAgICAgdGhpcy5oYXNMYXllckRhdGEoZGF0YSkgJiZcbiAgICAgIHR5cGVvZiB0aGlzLnJlbmRlckxheWVyID09PSAnZnVuY3Rpb24nKVxuICAgICk7XG4gIH1cblxuICBnZXRDb2xvclNjYWxlKGNvbG9yU2NhbGUsIGNvbG9yRG9tYWluLCBjb2xvclJhbmdlKSB7XG4gICAgaWYgKGNvbG9yUmFuZ2UudHlwZSA9PT0gaGV4Q29sb3IpIHtcbiAgICAgIHJldHVybiAoXywgY29sb3IpID0+IHtcbiAgICAgICAgY29uc3Qge3IsIGcsIGJ9ID0gcmdiKGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIFtyLCBnLCBiXS5zb21lKGlzTmFOKSA/IFVOS05PV05fQ09MT1IgOiBbciwgZywgYl07XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb2xvclJhbmdlLmNvbG9yTWFwKSkge1xuICAgICAgY29uc3QgY01hcCA9IG5ldyBNYXAoKTtcbiAgICAgIGNvbG9yUmFuZ2UuY29sb3JNYXAuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgIGNNYXAuc2V0KGssIHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IGhleFRvUmdiKHYpIDogdik7XG4gICAgICB9KTtcblxuICAgICAgLy8gQHRzLWlnbm9yZSBkMyBzY2FsZVxuICAgICAgY29uc3Qgc2NhbGUgPSBTQ0FMRV9GVU5DW2NvbG9yU2NhbGVdKClcbiAgICAgICAgLmRvbWFpbihBcnJheS5mcm9tKGNNYXAua2V5cygpKSlcbiAgICAgICAgLnJhbmdlKEFycmF5LmZyb20oY01hcC52YWx1ZXMoKSkpXG4gICAgICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShjb2xvclNjYWxlLCBjb2xvckRvbWFpbiwgY29sb3JSYW5nZS5jb2xvcnMubWFwKGhleFRvUmdiKSk7XG4gIH1cblxuICBnZXRDdXN0b21NYXJrZXJzU2NhbGUocmFuZ2UsIGZhbGxiYWNrSWNvbikge1xuICAgIGxldCB1bmtub3duVmFsdWUgPSBmYWxsYmFja0ljb24gfHwgRkFMTEJBQ0tfSUNPTjtcbiAgICBpZiAoIXJhbmdlKSB7XG4gICAgICByZXR1cm4gKCkgPT4gdW5rbm93blZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcHBpbmcgPSBuZXcgTWFwKCk7XG5cbiAgICBpZiAocmFuZ2Uub3RoZXJzTWFya2VyKSB7XG4gICAgICB1bmtub3duVmFsdWUgPSByYW5nZS5vdGhlcnNNYXJrZXI7XG4gICAgfVxuICAgIGZvciAoY29uc3Qge3ZhbHVlLCBtYXJrZXJVcmx9IG9mIHJhbmdlLm1hcmtlck1hcCkge1xuICAgICAgaWYgKG1hcmtlclVybCkge1xuICAgICAgICBtYXBwaW5nLnNldCh2YWx1ZSwgbWFya2VyVXJsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlIGQzIHNjYWxlXG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZU9yZGluYWwoKVxuICAgICAgLmRvbWFpbihBcnJheS5mcm9tKG1hcHBpbmcua2V5cygpKSlcbiAgICAgIC5yYW5nZShBcnJheS5mcm9tKG1hcHBpbmcudmFsdWVzKCkpKVxuICAgICAgLnVua25vd24odW5rbm93blZhbHVlKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIHZpc3VhbCBjaGFubmVscyB0byBkZWNrLmdsIGFjY2Vzb3JzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbSBQYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtLmRhdGFBY2Nlc3NvciBBY2Nlc3Mga2VwbGVyLmdsIGxheWVyIGRhdGEgZnJvbSBkZWNrLmdsIGxheWVyXG4gICAqIEBwYXJhbSB7aW1wb3J0KCd1dGlscy90YWJsZS11dGlscy9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnKS5EYXRhQ29udGFpbmVySW50ZXJmYWNlfSBwYXJhbS5kYXRhQ29udGFpbmVyIERhdGFDb250YWluZXIgdG8gdXNlIHVzZSB3aXRoIGRhdGFBY2Nlc3NvclxuICAgKiBAcmV0dXJuIHtPYmplY3R9IGF0dHJpYnV0ZUFjY2Vzc29ycyAtIGRlY2suZ2wgbGF5ZXIgYXR0cmlidXRlIGFjY2Vzc29yc1xuICAgKi9cbiAgZ2V0QXR0cmlidXRlQWNjZXNzb3JzKHtkYXRhQWNjZXNzb3IgPSBkZWZhdWx0RGF0YUFjY2Vzc29yLCBkYXRhQ29udGFpbmVyfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZUFjY2Vzc29ycyA9IHt9O1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICBPYmplY3Qua2V5cyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmaWVsZCxcbiAgICAgICAgZml4ZWQsXG4gICAgICAgIHNjYWxlLFxuICAgICAgICBkb21haW4sXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBhY2Nlc3NvcixcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICAgICAgbnVsbFZhbHVlLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlLFxuICAgICAgICBhZ2dyZWdhdGlvblxuICAgICAgfSA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG5cbiAgICAgIGNvbnN0IHNob3VsZEdldFNjYWxlID0gQm9vbGVhbihcbiAgICAgICAgKHNjYWxlIHx8IGNoYW5uZWxTY2FsZVR5cGUgPT09IENIQU5ORUxfU0NBTEVTLmlkZW50aXR5KSAmJiB0aGlzLmNvbmZpZ1tmaWVsZF1cbiAgICAgICk7XG5cbiAgICAgIGlmIChzaG91bGRHZXRTY2FsZSkge1xuICAgICAgICBjb25zdCBhcmdzID0gW3RoaXMuY29uZmlnW3NjYWxlXSwgdGhpcy5jb25maWdbZG9tYWluXSwgdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXV07XG4gICAgICAgIGNvbnN0IGlzRml4ZWQgPSBmaXhlZCAmJiB0aGlzLmNvbmZpZy52aXNDb25maWdbZml4ZWRdO1xuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBkZWNsYXJlIGFzIGNvbnN0IGFsbCB0aGUgcGFyYW1ldGVycyB0aGF0IHdlIGFyZSBnb2luZyB0byBiZSB1c2UgaW4gdGhlIGdldEVuY29kZWRDaGFubmVsVmFsdWUgY2FsbFxuICAgICAgICAvLyBvdGhlcndpc2UsIHRoZSBvbGRMYXllckRhdGEgcGFyYW1ldGVyIGluIGZvcm1hdExheWVyRGF0YSBtZXRob2Qgd2lsbCBiZSB3cm9uZyAoeW91IGNhbiBjaGVjayB0aGUgZm9ybWF0TGF5ZXJEYXRhIFRpbGVMYXllciBtZXRob2QgaW4gQnVpbGRlciBhcyBleGFtcGxlKVxuICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IHRoaXMuY29uZmlnW2ZpZWxkXTtcbiAgICAgICAgY29uc3QgYWdncmVnYXRpb25WYWx1ZSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1thZ2dyZWdhdGlvbl07XG5cbiAgICAgICAgY29uc3Qgc2NhbGVGdW5jdGlvbiA9XG4gICAgICAgICAgY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuaWRlbnRpdHlcbiAgICAgICAgICAgID8gc2NhbGVJZGVudGl0eVxuICAgICAgICAgICAgOiBjaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5jb2xvclxuICAgICAgICAgICAgPyB0aGlzLmdldENvbG9yU2NhbGUoLi4uYXJncylcbiAgICAgICAgICAgIDogY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuY3VzdG9tTWFya2VyXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q3VzdG9tTWFya2Vyc1NjYWxlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0sXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcudmlzQ29uZmlnLmN1c3RvbU1hcmtlcnNVcmxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZSguLi5hcmdzLCBpc0ZpeGVkKTtcblxuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID0gZCA9PlxuICAgICAgICAgIHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSh7XG4gICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgZGF0YUNvbnRhaW5lcixcbiAgICAgICAgICAgIHNjYWxlOiBzY2FsZUZ1bmN0aW9uLFxuICAgICAgICAgICAgZGF0YTogZGF0YUFjY2Vzc29yKGRhdGFDb250YWluZXIpKGQpLFxuICAgICAgICAgICAgZmllbGQ6IGZpZWxkQ29uZmlnLFxuICAgICAgICAgICAgX2FnZ3JlZ2F0aW9uOiBhZ2dyZWdhdGlvblZhbHVlLFxuICAgICAgICAgICAgbnVsbFZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBnZXRBdHRyaWJ1dGVWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhdHRyaWJ1dGVBY2Nlc3NvcnNbYWNjZXNzb3JdID0gZ2V0QXR0cmlidXRlVmFsdWUodGhpcy5jb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlQWNjZXNzb3JzW2FjY2Vzc29yXSA9XG4gICAgICAgICAgdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGRlZmF1bHRWYWx1ZSh0aGlzLmNvbmZpZykgOiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghKGFjY2Vzc29yIGluIGF0dHJpYnV0ZUFjY2Vzc29ycykpIHtcbiAgICAgICAgQ29uc29sZS53YXJuKGBGYWlsZWQgdG8gcHJvdmlkZSBhY2Nlc3NvciBmdW5jdGlvbiBmb3IgJHthY2Nlc3NvciB8fCBjaGFubmVsfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZUFjY2Vzc29ycztcbiAgfVxuXG4gIGdldFZpc0NoYW5uZWxTY2FsZShzY2FsZSwgZG9tYWluLCByYW5nZSwgZml4ZWQpIHtcbiAgICBpZiAoc2NhbGUgPT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgZDMtc2NhbGUgdHlwZVxuICAgICAgcmV0dXJuIFNDQUxFX0ZVTkNbc2NhbGVdKClcbiAgICAgICAgLmRvbWFpbihkb21haW4uc2xpY2UoMCwgcmFuZ2UubGVuZ3RoKSlcbiAgICAgICAgLnJhbmdlKHJhbmdlKVxuICAgICAgICAudW5rbm93bihVTktOT1dOX0NPTE9SKTtcbiAgICB9XG5cbiAgICAvLyBmb3IgYGNvdW50YCBhZ2dyZWdhdGlvbiwgd2UgZG9tYWluIGlzIGFjdHVhbGx5IGBbMCwgSW5maW5pdHldYCBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2VcbiAgICAvLyB0byB1c2UgaXQsIHNvIHNraXAgc3BlY3lmeWluZyB0aGlzIGRvbWFpbnNcbiAgICBjb25zdCBkb21haW5Jc0luZmluaXRlID0gZG9tYWluICYmIChkb21haW5bMF0gPT09IDAgJiYgZG9tYWluWzFdID09PSBJbmZpbml0eSk7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3J5ID0gU0NBTEVfRlVOQ1tmaXhlZCA/ICdsaW5lYXInIDogc2NhbGVdO1xuICAgIC8vIEB0cy1pZ25vcmUgZDMtc2NhbGUgdHlwZVxuICAgIGxldCByZXN1bHQgPSBzY2FsZUZhY3RvcnkoKTtcbiAgICBpZiAoZG9tYWluICYmICFkb21haW5Jc0luZmluaXRlKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZG9tYWluKGRvbWFpbik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQucmFuZ2UoZml4ZWQgPyBkb21haW4gOiByYW5nZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgYm91bmRzIG9mIHRoZSBkYXRhLlxuICAgKiBAcGFyYW0ge2ltcG9ydCgndXRpbHMvdGFibGUtdXRpbHMvZGF0YS1jb250YWluZXItaW50ZXJmYWNlJykuRGF0YUNvbnRhaW5lckludGVyZmFjZX0gZGF0YUNvbnRhaW5lciBEYXRhQ29udGFpbmVyIHRvIGNhbGN1bGF0ZSBib3VuZHMgZm9yLlxuICAgKiBAcGFyYW0geyhkOiB7aW5kZXg6IG51bWJlcn0sIGRjOiBpbXBvcnQoJ3V0aWxzL3RhYmxlLXV0aWxzL2RhdGEtY29udGFpbmVyLWludGVyZmFjZScpLkRhdGFDb250YWluZXJJbnRlcmZhY2UpID0+IG51bWJlcltdfSBnZXRQb3NpdGlvbiBBY2Nlc3Mga2VwbGVyLmdsIGxheWVyIGRhdGEgZnJvbSBkZWNrLmdsIGxheWVyXG4gICAqIEByZXR1cm4ge251bWJlcltdfG51bGx9IGJvdW5kcyBvZiB0aGUgZGF0YS5cbiAgICovXG4gIGdldFBvaW50c0JvdW5kcyhkYXRhQ29udGFpbmVyLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIG5vIG5lZWQgdG8gbG9vcCB0aHJvdWdoIHRoZSBlbnRpcmUgZGF0YXNldFxuICAgIC8vIGdldCBhIHNhbXBsZSBvZiBkYXRhIHRvIGNhbGN1bGF0ZSBib3VuZHNcbiAgICBjb25zdCBzYW1wbGVEYXRhID1cbiAgICAgIGRhdGFDb250YWluZXIubnVtUm93cygpID4gTUFYX1NBTVBMRV9TSVpFXG4gICAgICAgID8gZ2V0U2FtcGxlRGF0YShkYXRhQ29udGFpbmVyLCBNQVhfU0FNUExFX1NJWkUpXG4gICAgICAgIDogZGF0YUNvbnRhaW5lcjtcblxuICAgIGNvbnN0IHBvaW50cyA9IHNhbXBsZURhdGEubWFwSW5kZXgoZ2V0UG9zaXRpb24pO1xuXG4gICAgY29uc3QgbGF0Qm91bmRzID0gZ2V0TGF0TG5nQm91bmRzKHBvaW50cywgMSwgWy05MCwgOTBdKTtcbiAgICBjb25zdCBsbmdCb3VuZHMgPSBnZXRMYXRMbmdCb3VuZHMocG9pbnRzLCAwLCBbLTE4MCwgMTgwXSk7XG5cbiAgICBpZiAoIWxhdEJvdW5kcyB8fCAhbG5nQm91bmRzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gW2xuZ0JvdW5kc1swXSwgbGF0Qm91bmRzWzBdLCBsbmdCb3VuZHNbMV0sIGxhdEJvdW5kc1sxXV07XG4gIH1cblxuICBnZXRDaGFuZ2VkVHJpZ2dlcnMoZGF0YVVwZGF0ZVRyaWdnZXJzKSB7XG4gICAgY29uc3QgdHJpZ2dlckNoYW5nZWQgPSBkaWZmVXBkYXRlVHJpZ2dlcnMoZGF0YVVwZGF0ZVRyaWdnZXJzLCB0aGlzLl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMpO1xuICAgIHRoaXMuX29sZERhdGFVcGRhdGVUcmlnZ2VycyA9IGRhdGFVcGRhdGVUcmlnZ2VycztcblxuICAgIHJldHVybiB0cmlnZ2VyQ2hhbmdlZDtcbiAgfVxuXG4gIGdldEVuY29kZWRDaGFubmVsVmFsdWUoe1xuICAgIGNoYW5uZWwsXG4gICAgc2NhbGUsXG4gICAgZGF0YSxcbiAgICBmaWVsZCxcbiAgICBkYXRhQ29udGFpbmVyLFxuICAgIC8vIEluIGJ1aWxkZXIgd2Ugb3ZlcndyaXRlIHRoZSBnZXRWYWx1ZSBmdW5jdGlvbiBhbmQgd2UgdXNlIHRoZSBfYWdncmVnYXRpb24gcGFyYW1ldGVyIGluIHNwYXRpYWwgaW5kZXggbGF5ZXJzIGFzIHRoZSBRdWFka2V5TGF5ZXIuXG4gICAgX2FnZ3JlZ2F0aW9uLFxuICAgIG51bGxWYWx1ZSA9IE5PX1ZBTFVFX0NPTE9SLFxuICAgIGdldFZhbHVlID0gZGVmYXVsdEdldEZpZWxkVmFsdWVcbiAgfSkge1xuICAgIGxldCBjb2xvckNvbHVtblZhbHVlO1xuICAgIGNvbnN0IHt0eXBlfSA9IGZpZWxkO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0VmFsdWUoZmllbGQsIGRhdGEpO1xuICAgIGNvbnN0IGNoYW5uZWxDb25maWcgPSB0aGlzLmNvbmZpZy52aXNDb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXS5yYW5nZV07XG4gICAgY29uc3QgY2hhbm5lbEZpZWxkID0gdGhpcy5jb25maWdbdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXS5maWVsZF07XG5cbiAgICBpZiAoY2hhbm5lbENvbmZpZz8udHlwZSA9PT0gaGV4Q29sb3IpIHtcbiAgICAgIGNvbnN0IGNvbHVtbkZpZWxkID0ge1xuICAgICAgICBpZDogY2hhbm5lbEZpZWxkLmNvbG9yQ29sdW1uLFxuICAgICAgICBuYW1lOiBjaGFubmVsRmllbGQuY29sb3JDb2x1bW4sXG4gICAgICAgIGZpZWxkSWR4OiBjaGFubmVsRmllbGQuY29sb3JDb2x1bW5JZHgsXG4gICAgICAgIHZhbHVlQWNjZXNzb3I6IGQgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhQ29udGFpbmVyLnZhbHVlQXQoZC5pbmRleCwgY2hhbm5lbEZpZWxkLmNvbG9yQ29sdW1uSWR4KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29sb3JDb2x1bW5WYWx1ZSA9IGdldFZhbHVlKGNvbHVtbkZpZWxkLCBkYXRhKTtcbiAgICB9IGVsc2UgaWYgKCFub3ROdWxsb3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbFZhbHVlO1xuICAgIH1cblxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZTtcbiAgICBpZiAodHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcCkge1xuICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdG8gY29udmVydCBoZXJlXG4gICAgICAvLyBzY2FsZSBGdW5jdGlvbiBzaG91bGQgdGFrZSBjYXJlIG9mIGl0XG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHNjYWxlKG5ldyBEYXRlKHZhbHVlKSwgY29sb3JDb2x1bW5WYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gc2NhbGUodmFsdWUsIGNvbG9yQ29sdW1uVmFsdWUpO1xuICAgIH1cblxuICAgIGlmICghbm90TnVsbG9yVW5kZWZpbmVkKGF0dHJpYnV0ZVZhbHVlKSkge1xuICAgICAgYXR0cmlidXRlVmFsdWUgPSBudWxsVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlO1xuICB9XG5cbiAgdXBkYXRlTWV0YShtZXRhKSB7XG4gICAgdGhpcy5tZXRhID0gey4uLnRoaXMubWV0YSwgLi4ubWV0YX07XG4gIH1cblxuICB1cGRhdGVMYXllckxlZ2VuZChzZXR0aW5ncykge1xuICAgIHRoaXMubGVnZW5kU2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgfVxuXG4gIGdldERhdGFVcGRhdGVUcmlnZ2Vycyh7ZmlsdGVyZWRJbmRleCwgaWQsIGFsbERhdGF9KSB7XG4gICAgY29uc3Qge2NvbHVtbnN9ID0gdGhpcy5jb25maWc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0RGF0YToge2RhdGFzZXRJZDogaWQsIGFsbERhdGEsIGNvbHVtbnMsIGZpbHRlcmVkSW5kZXh9LFxuICAgICAgZ2V0TWV0YToge2RhdGFzZXRJZDogaWQsIGFsbERhdGEsIGNvbHVtbnN9LFxuICAgICAgLi4uKHRoaXMuY29uZmlnLnRleHRMYWJlbCB8fCBbXSkucmVkdWNlKFxuICAgICAgICAoYWNjdSwgdGwsIGkpID0+ICh7XG4gICAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgICBbYGdldExhYmVsQ2hhcmFjdGVyU2V0LSR7aX1gXTogdGwuZmllbGQgPyB0bC5maWVsZC5uYW1lIDogbnVsbFxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kYXRhSWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldChkYXRhc2V0cyk7XG4gICAgY29uc3Qge2RhdGFDb250YWluZXJ9ID0gZGF0YXNldDtcblxuICAgIHRoaXMudXBkYXRlVmlzdWFsQ2hhbm5lbEZpZWxkcyhkYXRhc2V0KTtcbiAgICB0aGlzLnVwZGF0ZUhleENvbG9yRG9tYWluKGRhdGFzZXQpO1xuXG4gICAgY29uc3QgZ2V0UG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcik7XG4gICAgY29uc3QgZGF0YVVwZGF0ZVRyaWdnZXJzID0gdGhpcy5nZXREYXRhVXBkYXRlVHJpZ2dlcnMoZGF0YXNldCk7XG4gICAgY29uc3QgdHJpZ2dlckNoYW5nZWQgPSB0aGlzLmdldENoYW5nZWRUcmlnZ2VycyhkYXRhVXBkYXRlVHJpZ2dlcnMpO1xuXG4gICAgaWYgKHRyaWdnZXJDaGFuZ2VkLmdldE1ldGEpIHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJNZXRhKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBsZXQgZGF0YSA9IFtdO1xuXG4gICAgaWYgKCF0cmlnZ2VyQ2hhbmdlZC5nZXREYXRhICYmIG9sZExheWVyRGF0YSAmJiBvbGRMYXllckRhdGEuZGF0YSkge1xuICAgICAgLy8gc2FtZSBkYXRhXG4gICAgICBkYXRhID0gb2xkTGF5ZXJEYXRhLmRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0aGlzLmNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUoZGF0YXNldCwgZ2V0UG9zaXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB7ZGF0YSwgdHJpZ2dlckNoYW5nZWR9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzdHlsZWQgZmllbGRzIHRvIG1hdGNoIG9uZXMgZnJvbSBuZXcgZGF0YXNldC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRcbiAgICovXG4gIHVwZGF0ZVZpc3VhbENoYW5uZWxGaWVsZHMoZGF0YXNldCkge1xuICAgIGZvciAoY29uc3Qge2ZpZWxkLCByYW5nZX0gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKSkge1xuICAgICAgY29uc3Qgb2xkRmllbGQgPSB0aGlzLmNvbmZpZ1tmaWVsZF07XG4gICAgICBjb25zdCBpc1VzaW5nSGV4Q29sb3JDb2RlID0gdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXT8uaGV4Q29sb3I7XG4gICAgICBpZiAoIW9sZEZpZWxkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBuZXdEYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGZkID0+IGZkLm5hbWUgPT09IG9sZEZpZWxkLm5hbWUpIHx8IG51bGw7XG4gICAgICBpZiAoaXNVc2luZ0hleENvbG9yQ29kZSkge1xuICAgICAgICBuZXdEYXRhU2V0RmllbGQgPSB7XG4gICAgICAgICAgLi4ubmV3RGF0YVNldEZpZWxkLFxuICAgICAgICAgIGNvbG9yQ29sdW1uOiBuZXdEYXRhU2V0RmllbGQuY29sb3JDb2x1bW4gfHwgb2xkRmllbGQuY29sb3JDb2x1bW4sXG4gICAgICAgICAgY29sb3JDb2x1bW5JZHg6IG5ld0RhdGFTZXRGaWVsZC5jb2xvckNvbHVtbklkeCB8fCBvbGRGaWVsZC5jb2xvckNvbHVtbklkeFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W2ZpZWxkXTogbmV3RGF0YVNldEZpZWxkfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgb25lIGxheWVyIGRvbWFpbiB3aGVuIHN0YXRlLmRhdGEgY2hhbmdlZFxuICAgKiBpZiBzdGF0ZS5kYXRhIGNoYW5nZSBpcyBkdWUgb3QgdXBkYXRlIGZpbHRlciwgbmV3RmlsZXIgd2lsbCBiZSBwYXNzZWRcbiAgICogY2FsbGVkIGJ5IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YXNldHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG5ld0ZpbHRlclxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBsYXllclxuICAgKi9cbiAgdXBkYXRlTGF5ZXJEb21haW4oZGF0YXNldHMsIG5ld0ZpbHRlcikge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5nZXREYXRhc2V0KGRhdGFzZXRzKTtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgY29uc3Qge3NjYWxlfSA9IGNoYW5uZWw7XG4gICAgICBjb25zdCBzY2FsZVR5cGUgPSB0aGlzLmNvbmZpZ1tzY2FsZV07XG5cbiAgICAgIC8vIG9yZGluYWwgZG9tYWluIGlzIGJhc2VkIG9uIGRhdGFDb250YWluZXIsIGlmIG9ubHkgZmlsdGVyIGNoYW5nZWRcbiAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlIG9yZGluYWwgZG9tYWluXG4gICAgICBpZiAoIW5ld0ZpbHRlciB8fCBzY2FsZVR5cGUgIT09IFNDQUxFX1RZUEVTLm9yZGluYWwpIHtcbiAgICAgICAgY29uc3Qge2RvbWFpbn0gPSBjaGFubmVsO1xuICAgICAgICBjb25zdCB1cGRhdGVkRG9tYWluID0gdGhpcy5jYWxjdWxhdGVMYXllckRvbWFpbih0YWJsZSwgY2hhbm5lbCk7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1tkb21haW5dOiB1cGRhdGVkRG9tYWlufSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldERhdGFzZXQoZGF0YXNldHMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YUlkID8gZGF0YXNldHNbdGhpcy5jb25maWcuZGF0YUlkXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdmlzdWFsIGNoYW5uZWwgZmllbGQgYW5kIHNjYWxlcyBiYXNlZCBvbiBzdXBwb3J0ZWQgZmllbGQgJiBzY2FsZSB0eXBlXG4gICAqIEBwYXJhbSBjaGFubmVsXG4gICAqL1xuICB2YWxpZGF0ZVZpc3VhbENoYW5uZWwoY2hhbm5lbCkge1xuICAgIHRoaXMudmFsaWRhdGVGaWVsZFR5cGUoY2hhbm5lbCk7XG4gICAgdGhpcy52YWxpZGF0ZVNjYWxlKGNoYW5uZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZpZWxkIHR5cGUgYmFzZWQgb24gY2hhbm5lbFNjYWxlVHlwZVxuICAgKi9cbiAgdmFsaWRhdGVGaWVsZFR5cGUoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtmaWVsZCwgY2hhbm5lbFNjYWxlVHlwZSwgc3VwcG9ydGVkRmllbGRUeXBlc30gPSB2aXN1YWxDaGFubmVsO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgLy8gaWYgZmllbGQgaXMgc2VsZWN0ZWQsIGNoZWNrIGlmIGZpZWxkIHR5cGUgaXMgc3VwcG9ydGVkXG4gICAgICBjb25zdCBjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcyA9XG4gICAgICAgIHN1cHBvcnRlZEZpZWxkVHlwZXMgfHwgQ0hBTk5FTF9TQ0FMRV9TVVBQT1JURURfRklFTERTW2NoYW5uZWxTY2FsZVR5cGVdO1xuXG4gICAgICBpZiAoIWNoYW5uZWxTdXBwb3J0ZWRGaWVsZFR5cGVzLmluY2x1ZGVzKHRoaXMuY29uZmlnW2ZpZWxkXS50eXBlKSkge1xuICAgICAgICAvLyBmaWVsZCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIHNldCBpdCBiYWNrIHRvIG51bGxcbiAgICAgICAgLy8gc2V0IHNjYWxlIGJhY2sgdG8gZGVmYXVsdFxuICAgICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtbZmllbGRdOiBudWxsfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHNjYWxlIHR5cGUgYmFzZWQgb24gYWdncmVnYXRpb25cbiAgICovXG4gIHZhbGlkYXRlU2NhbGUoY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHtzY2FsZSwgcmFuZ2V9ID0gdmlzdWFsQ2hhbm5lbDtcbiAgICBpZiAoXG4gICAgICAhc2NhbGUgfHxcbiAgICAgICh0aGlzLmlzQ29sb3JlZEJ5Q29sb3JDb2x1bW4ocmFuZ2UpICYmIHRoaXMuY29uZmlnW3NjYWxlXSA9PT0gU0NBTEVfVFlQRVMuaWRlbnRpdHkpXG4gICAgKSB7XG4gICAgICAvLyB2aXN1YWxDaGFubmVsIGRvZXNuJ3QgaGF2ZSBzY2FsZVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY2FsZU9wdGlvbnMgPSB0aGlzLmdldFNjYWxlT3B0aW9ucyhjaGFubmVsKTtcbiAgICAvLyBjaGVjayBpZiBjdXJyZW50IHNlbGVjdGVkIHNjYWxlIGlzXG4gICAgLy8gc3VwcG9ydGVkLCBpZiBub3QsIGNoYW5nZSB0byBkZWZhdWx0XG4gICAgaWYgKCFzY2FsZU9wdGlvbnMuaW5jbHVkZXModGhpcy5jb25maWdbc2NhbGVdKSkge1xuICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7W3NjYWxlXTogc2NhbGVPcHRpb25zWzBdfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzY2FsZSBvcHRpb25zIGJhc2VkIG9uIGN1cnJlbnQgZmllbGRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZ2V0U2NhbGVPcHRpb25zKGNoYW5uZWwpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVsID0gdGhpcy52aXN1YWxDaGFubmVsc1tjaGFubmVsXTtcbiAgICBjb25zdCB7ZmllbGQsIHNjYWxlLCBjaGFubmVsU2NhbGVUeXBlfSA9IHZpc3VhbENoYW5uZWw7XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWdbZmllbGRdXG4gICAgICA/IEZJRUxEX09QVFNbdGhpcy5jb25maWdbZmllbGRdLnR5cGVdLnNjYWxlW2NoYW5uZWxTY2FsZVR5cGVdXG4gICAgICA6IFt0aGlzLmdldERlZmF1bHRMYXllckNvbmZpZygpW3NjYWxlXV07XG4gIH1cblxuICB1cGRhdGVMYXllclZpc3VhbENoYW5uZWwoZGF0YXNldCwgY2hhbm5lbCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWwgPSB0aGlzLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICAgIHRoaXMudmFsaWRhdGVWaXN1YWxDaGFubmVsKGNoYW5uZWwpO1xuICAgIC8vIGNhbGN1bGF0ZSBsYXllciBjaGFubmVsIGRvbWFpblxuICAgIGNvbnN0IHVwZGF0ZWREb21haW4gPSB0aGlzLmNhbGN1bGF0ZUxheWVyRG9tYWluKGRhdGFzZXQsIHZpc3VhbENoYW5uZWwpO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe1t2aXN1YWxDaGFubmVsLmRvbWFpbl06IHVwZGF0ZWREb21haW59KTtcbiAgfVxuXG4gIGdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycygpIHtcbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHt9O1xuICAgIE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykuZm9yRWFjaCh2aXN1YWxDaGFubmVsID0+IHtcbiAgICAgIC8vIGZpZWxkIHJhbmdlIHNjYWxlIGRvbWFpblxuICAgICAgY29uc3Qge2FjY2Vzc29yLCBmaWVsZCwgc2NhbGUsIGRvbWFpbiwgcmFuZ2UsIGRlZmF1bHRWYWx1ZSwgZml4ZWR9ID0gdmlzdWFsQ2hhbm5lbDtcblxuICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdID0ge1xuICAgICAgICBbZmllbGRdOiB0aGlzLmNvbmZpZ1tmaWVsZF0sXG4gICAgICAgIFtzY2FsZV06IHRoaXMuY29uZmlnW3NjYWxlXSxcbiAgICAgICAgW2RvbWFpbl06IHRoaXMuY29uZmlnW2RvbWFpbl0sXG4gICAgICAgIFtyYW5nZV06IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV0sXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGRlZmF1bHRWYWx1ZSh0aGlzLmNvbmZpZykgOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgIC4uLihmaXhlZCA/IHtbZml4ZWRdOiB0aGlzLmNvbmZpZy52aXNDb25maWdbZml4ZWRdfSA6IHt9KVxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdXBkYXRlVHJpZ2dlcnM7XG4gIH1cblxuICBjYWxjdWxhdGVMYXllckRvbWFpbihkYXRhc2V0LCB2aXN1YWxDaGFubmVsKSB7XG4gICAgY29uc3Qge3NjYWxlfSA9IHZpc3VhbENoYW5uZWw7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmNvbmZpZ1t2aXN1YWxDaGFubmVsLmZpZWxkXTtcbiAgICBpZiAoIWZpZWxkIHx8ICFzY2FsZSkge1xuICAgICAgLy8gaWYgY29sb3JGaWVsZCBvciBzaXplRmllbGQgd2VyZSBzZXQgYmFjayB0byBudWxsXG4gICAgICByZXR1cm4gZGVmYXVsdERvbWFpbjtcbiAgICB9XG5cbiAgICBjb25zdCBzY2FsZVR5cGUgPSB0aGlzLmNvbmZpZ1tzY2FsZV07XG4gICAgY29uc3QgZGF0YVNldEZpZWxkID0gZGF0YXNldC5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGQubmFtZSk7XG4gICAgaWYgKCFzY2FsZVR5cGUgfHwgIWRhdGFTZXRGaWVsZCkge1xuICAgICAgLy8gaWYgbmV3IGRhdGFzZXQgZG9lc24ndCBjb250YWluIHByZXZpb3VzbHkgc2V0IGZpZWxkXG4gICAgICByZXR1cm4gZGVmYXVsdERvbWFpbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YXNldC5nZXRDb2x1bW5MYXllckRvbWFpbihkYXRhU2V0RmllbGQsIHNjYWxlVHlwZSkgfHwgZGVmYXVsdERvbWFpbjtcbiAgfVxuXG4gIHVwZGF0ZUhleENvbG9yRG9tYWluKGRhdGFzZXQpIHtcbiAgICBpZiAoIWRhdGFzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICBjb25zdCBjaGFubmVsQ29uZmlnID0gdGhpcy5jb25maWcudmlzQ29uZmlnW2NoYW5uZWwucmFuZ2VdO1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmNvbmZpZ1tjaGFubmVsLmZpZWxkXTtcblxuICAgICAgaWYgKGNoYW5uZWxDb25maWc/LnR5cGUgPT09IGhleENvbG9yICYmIGZpZWxkPy5jb2xvckNvbHVtbikge1xuICAgICAgICBjb25zdCBkYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBmaWVsZC5jb2xvckNvbHVtbik7XG4gICAgICAgIGNvbnN0IGNvbG9ycyA9IGRhdGFzZXRcbiAgICAgICAgICAuZ2V0Q29sdW1uTGF5ZXJEb21haW4oZGF0YVNldEZpZWxkLCBTQ0FMRV9UWVBFUy5vcmRpbmFsKVxuICAgICAgICAgIC5tYXAoYyA9PiBjaGVja0NvbG9yT3JGYWxsYmFjayhjKSk7XG4gICAgICAgIHRoaXMudXBkYXRlTGF5ZXJWaXNDb25maWcoe1xuICAgICAgICAgIFtjaGFubmVsLnJhbmdlXTogey4uLmNoYW5uZWxDb25maWcsIGNvbG9yc31cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNhbGN1bGF0ZUhleENvbHVtbkxlZ2VuZChkYXRhc2V0cykge1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoZGF0YXNldHMpO1xuICAgIGlmICghZGF0YXNldHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsZWdlbmRTZXR0aW5ncyA9IE9iamVjdC5rZXlzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLnJlZHVjZSgobGVnZW5kcywgY2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3Qge3JhbmdlLCBmaWVsZDogY2hhbm5lbEZpZWxkfSA9IHRoaXMudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gICAgICBjb25zdCBjaGFubmVsQ29uZmlnID0gdGhpcy5jb25maWcudmlzQ29uZmlnW3JhbmdlXTtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWdbY2hhbm5lbEZpZWxkXTtcblxuICAgICAgaWYgKGNoYW5uZWxDb25maWc/LnR5cGUgPT09IGhleENvbG9yICYmIGZpZWxkPy5jb2xvckNvbHVtbikge1xuICAgICAgICBjb25zdCBkYXRhU2V0RmllbGQgPSBkYXRhc2V0LmZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBmaWVsZC5jb2xvckNvbHVtbik7XG4gICAgICAgIGNvbnN0IGxlZ2VuZCA9IGRhdGFzZXQuY2FsY3VsYXRlTGVnZW5kKGZpZWxkLCBkYXRhU2V0RmllbGQpO1xuICAgICAgICBsZWdlbmRzW2NoYW5uZWxdID0gbGVnZW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxlZ2VuZHM7XG4gICAgfSwge30pO1xuICAgIHRoaXMudXBkYXRlTGF5ZXJMZWdlbmQobGVnZW5kU2V0dGluZ3MpO1xuICB9XG5cbiAgaGFzSG92ZXJlZE9iamVjdChvYmplY3RJbmZvKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNMYXllckhvdmVyZWQob2JqZWN0SW5mbykgJiYgb2JqZWN0SW5mby5vYmplY3QgPyBvYmplY3RJbmZvLm9iamVjdCA6IG51bGw7XG4gIH1cblxuICBpc0xheWVySG92ZXJlZChvYmplY3RJbmZvKSB7XG4gICAgcmV0dXJuIG9iamVjdEluZm8/LnBpY2tlZCAmJiBvYmplY3RJbmZvPy5sYXllcj8ucHJvcHM/LmlkID09PSB0aGlzLmlkO1xuICB9XG5cbiAgZ2V0UmFkaXVzU2NhbGVCeVpvb20obWFwU3RhdGUpIHtcbiAgICBjb25zdCByYWRpdXNDaGFubmVsID0gT2JqZWN0LnZhbHVlcyh0aGlzLnZpc3VhbENoYW5uZWxzKS5maW5kKHZjID0+IHZjLnByb3BlcnR5ID09PSAncmFkaXVzJyk7XG5cbiAgICBpZiAoIXJhZGl1c0NoYW5uZWwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gcmFkaXVzQ2hhbm5lbC5maWVsZDtcbiAgICBjb25zdCB7cmFkaXVzfSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZztcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnW2ZpZWxkXSA/IDEgOiByYWRpdXMpICogdGhpcy5nZXRab29tRmFjdG9yKG1hcFN0YXRlKTtcbiAgfVxuXG4gIGdldFJhZGl1c1NjYWxlKCkge1xuICAgIGNvbnN0IHJhZGl1c0NoYW5uZWwgPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpLmZpbmQodmMgPT4gdmMucHJvcGVydHkgPT09ICdyYWRpdXMnKTtcblxuICAgIGlmICghcmFkaXVzQ2hhbm5lbCB8fCB0aGlzLmNvbmZpZ1tyYWRpdXNDaGFubmVsLmZpZWxkXSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnZpc0NvbmZpZy5yYWRpdXM7XG4gIH1cblxuICBnZXRNYXhNYXJrZXJTaXplKCkge1xuICAgIGNvbnN0IHtyYWRpdXNGaWVsZCwgc2l6ZUZpZWxkLCB2aXNDb25maWd9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3Qge3JhZGl1c1JhbmdlLCByYWRpdXN9ID0gdmlzQ29uZmlnO1xuICAgIGNvbnN0IGZpZWxkID0gcmFkaXVzRmllbGQgfHwgc2l6ZUZpZWxkO1xuICAgIHJldHVybiBNYXRoLmNlaWwoKGZpZWxkICYmIHJhZGl1c1JhbmdlID8gcmFkaXVzUmFuZ2VbMV0gOiByYWRpdXMpKTtcbiAgfVxuXG4gIHNob3VsZENhbGN1bGF0ZUxheWVyRGF0YShwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy5zb21lKHAgPT4gIXRoaXMubm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzLmluY2x1ZGVzKHApKTtcbiAgfVxuXG4gIGdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMoaW50ZXJhY3Rpb25Db25maWcsIGJydXNoaW5nVGFyZ2V0KSB7XG4gICAgY29uc3Qge2JydXNofSA9IGludGVyYWN0aW9uQ29uZmlnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGJydXNoaW5nXG4gICAgICBhdXRvSGlnaGxpZ2h0OiAhYnJ1c2guZW5hYmxlZCxcbiAgICAgIGJydXNoaW5nUmFkaXVzOiBicnVzaC5jb25maWcuc2l6ZSAqIDEwMDAsXG4gICAgICBicnVzaGluZ1RhcmdldDogYnJ1c2hpbmdUYXJnZXQgfHwgJ3NvdXJjZScsXG4gICAgICBicnVzaGluZ0VuYWJsZWQ6IGJydXNoLmVuYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdERlY2tMYXllclByb3BzKHtpZHgsIGdwdUZpbHRlciwgbWFwU3RhdGUsIHZpc2libGUsIG1hc2tQb2x5Z29ufSkge1xuICAgIGNvbnN0IG1hc2tFeHRlbnNpb25Qcm9wcyA9IGdldE1hc2tFeHRlbnNpb25Qcm9wcyhtYXNrUG9seWdvbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1hc2tFeHRlbnNpb25Qcm9wcyxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgaWR4LFxuICAgICAgY29vcmRpbmF0ZVN5c3RlbTogQ09PUkRJTkFURV9TWVNURU0uTE5HTEFULFxuICAgICAgcGlja2FibGU6IHRoaXMuaGFzSW50ZXJhY3Rpdml0eSxcbiAgICAgIHdyYXBMb25naXR1ZGU6IHRydWUsXG4gICAgICBwYXJhbWV0ZXJzOiB7ZGVwdGhUZXN0OiBCb29sZWFuKG1hcFN0YXRlLmRyYWdSb3RhdGUgfHwgdGhpcy5jb25maWcudmlzQ29uZmlnLmVuYWJsZTNkKX0sXG4gICAgICBoaWRkZW46IHRoaXMuY29uZmlnLmhpZGRlbixcbiAgICAgIHZpc2liaWxpdHlCeVpvb206IHRoaXMuY29uZmlnLnZpc2liaWxpdHlCeVpvb20sXG4gICAgICAvLyB2aXNjb25maWdcbiAgICAgIG9wYWNpdHk6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5vcGFjaXR5LFxuICAgICAgaGlnaGxpZ2h0Q29sb3I6IHRoaXMuY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuICAgICAgLy8gZGF0YSBmaWx0ZXJpbmdcbiAgICAgIGV4dGVuc2lvbnM6IFtkYXRhRmlsdGVyRXh0ZW5zaW9uLCAuLi5tYXNrRXh0ZW5zaW9uUHJvcHMuZXh0ZW5zaW9uc10sXG4gICAgICBmaWx0ZXJSYW5nZTogZ3B1RmlsdGVyID8gZ3B1RmlsdGVyLmZpbHRlclJhbmdlIDogdW5kZWZpbmVkLFxuICAgICAgLy8gbGF5ZXIgc2hvdWxkIGJlIHZpc2libGUgYW5kIGlmIHNwbGl0TWFwLCBzaG93biBpbiB0byBvbmUgb2YgcGFuZWxcbiAgICAgIHZpc2libGU6IHRoaXMuY29uZmlnLmlzVmlzaWJsZSAmJiB2aXNpYmxlXG4gICAgfTtcbiAgfVxuXG4gIGdldERlZmF1bHRIb3ZlckxheWVyUHJvcHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgJHt0aGlzLmlkfS1ob3ZlcmVkYCxcbiAgICAgIHBpY2thYmxlOiBmYWxzZSxcbiAgICAgIHdyYXBMb25naXR1ZGU6IHRydWUsXG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5MTkdMQVRcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyVGV4dExhYmVsTGF5ZXIoXG4gICAge2dldFBvc2l0aW9uLCBnZXRSYWRpdXMsIHJhZGl1c1NjYWxlLCB1cGRhdGVUcmlnZ2Vycywgc2hhcmVkUHJvcHN9LFxuICAgIHJlbmRlck9wdHNcbiAgKSB7XG4gICAgY29uc3Qge2RhdGF9ID0gcmVuZGVyT3B0cztcbiAgICBjb25zdCB7dGV4dExhYmVsLCB2aXNpYmlsaXR5Qnlab29tfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbLi4uc2hhcmVkUHJvcHMuZXh0ZW5zaW9ucywgY29sbGlzaW9uRmlsdGVyRXh0ZW5zaW9uXTtcblxuICAgIGlmICghZGF0YSB8fCAhZGF0YS50ZXh0TGFiZWxzIHx8ICFkYXRhLnRleHRMYWJlbHNbMF0gfHwgIWRhdGEudGV4dExhYmVsc1swXS5nZXRUZXh0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgW21haW5MYWJlbCwgc2Vjb25kYXJ5TGFiZWxdID0gdGV4dExhYmVsO1xuICAgIGNvbnN0IHtcbiAgICAgIGFsaWdubWVudCxcbiAgICAgIGFuY2hvcixcbiAgICAgIGNvbG9yOiBnZXRDb2xvcixcbiAgICAgIGZpZWxkOiBtYWluRmllbGQsXG4gICAgICBvdXRsaW5lQ29sb3IsXG4gICAgICBzaXplOiBzaXplU2NhbGVcbiAgICB9ID0gbWFpbkxhYmVsO1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbG9yOiBnZXRTZWNvbmRhcnlDb2xvcixcbiAgICAgIGZpZWxkOiBzZWNvbmRhcnlGaWVsZCxcbiAgICAgIG91dGxpbmVDb2xvcjogc2Vjb25kYXJ5T3V0bGluZUNvbG9yLFxuICAgICAgc2l6ZTogc2Vjb25kYXJ5U2l6ZVNjYWxlXG4gICAgfSA9IHNlY29uZGFyeUxhYmVsIHx8IHt9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBQb2ludExhYmVsTGF5ZXIoe1xuICAgICAgICAuLi5zaGFyZWRQcm9wcyxcblxuICAgICAgICAvLyBSZWNyZWF0ZSBsYXllciB3aGVuIGxhYmVscyBjaGFuZ2Ugb3RoZXJ3aXNlIHJlbmRlcmluZyBicmVha3NcbiAgICAgICAgLy8gVE9ETyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudCB3aXRoIHVwZGF0ZVRyaWdnZXJzP1xuICAgICAgICBpZDogYCR7dGhpcy5pZH0tJHttYWluRmllbGQ/Lm5hbWV9LSR7c2Vjb25kYXJ5RmllbGQ/Lm5hbWV9LWxhYmVsYCxcbiAgICAgICAgZGF0YTogZGF0YS5kYXRhLFxuICAgICAgICB2aXNpYmlsaXR5Qnlab29tLFxuICAgICAgICBleHRlbnNpb25zLFxuXG4gICAgICAgIGNoYXJhY3RlclNldDogJ2F1dG8nLFxuICAgICAgICBjb2xsaXNpb25FbmFibGVkOiB0cnVlLFxuICAgICAgICBjb2xsaXNpb25Hcm91cDogYCR7dGhpcy5pZH0tbGFiZWxzYCxcblxuICAgICAgICBnZXRUZXh0OiBkYXRhLnRleHRMYWJlbHNbMF0uZ2V0VGV4dCxcbiAgICAgICAgZ2V0Q29sb3IsXG4gICAgICAgIHNpemVTY2FsZSxcbiAgICAgICAgb3V0bGluZUNvbG9yLFxuXG4gICAgICAgIC4uLihzZWNvbmRhcnlGaWVsZCAmJiB7XG4gICAgICAgICAgZ2V0U2Vjb25kYXJ5VGV4dDogZGF0YS50ZXh0TGFiZWxzWzFdLmdldFRleHQsXG4gICAgICAgICAgZ2V0U2Vjb25kYXJ5Q29sb3IsXG4gICAgICAgICAgc2Vjb25kYXJ5U2l6ZVNjYWxlLFxuICAgICAgICAgIHNlY29uZGFyeU91dGxpbmVDb2xvclxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBQb3NpdGlvblxuICAgICAgICBnZXRQb3NpdGlvbixcbiAgICAgICAgZ2V0UmFkaXVzLFxuICAgICAgICByYWRpdXNTY2FsZSxcbiAgICAgICAgZ2V0VGV4dEFuY2hvcjogYW5jaG9yLFxuICAgICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZTogYWxpZ25tZW50LFxuXG4gICAgICAgIC8vIFN0eWxlXG4gICAgICAgIGZvbnRGYW1pbHk6ICdJbnRlciwgc2FucycsXG4gICAgICAgIGZvbnRTZXR0aW5nczoge3NkZjogdHJ1ZX0sXG4gICAgICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICAgICAgb3V0bGluZVdpZHRoOiA0LFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgLy8gdGV4dCB3aWxsIGFsd2F5cyBzaG93IG9uIHRvcCBvZiBhbGwgbGF5ZXJzXG4gICAgICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgICAgICB9LFxuXG4gICAgICAgIGdldEZpbHRlclZhbHVlOiBkYXRhLmdldEZpbHRlclZhbHVlLFxuICAgICAgICB1cGRhdGVUcmlnZ2Vyczoge1xuICAgICAgICAgIC4uLnVwZGF0ZVRyaWdnZXJzLFxuICAgICAgICAgIGdldFRleHQ6IG1haW5GaWVsZD8ubmFtZSxcbiAgICAgICAgICBnZXRDb2xvcjogbWFpbkZpZWxkPy5jb2xvcixcbiAgICAgICAgICBnZXRUZXh0QW5jaG9yOiBtYWluTGFiZWwuYW5jaG9yLFxuICAgICAgICAgIGdldEFsaWdubWVudEJhc2VsaW5lOiBtYWluTGFiZWwuYWxpZ25tZW50LFxuICAgICAgICAgIGdldFNlY29uZGFyeVRleHQ6IHNlY29uZGFyeUZpZWxkPy5uYW1lXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZGVjay5nbCBgSWNvbkxheWVyYCBcImF1dG9QYWNrXCIgbW9kZSBhY2Nlc3NvciBmb3IgY3VzdG9tIG1hcmtlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gaWNvblVybEFjY2Vzc29yIGRlY2suZ2wgYWNjZXNzb3IgKG9yIHZhbHVlKSB0aGF0IHJlc29sdmVzIHRvIFVSTCBvZiBpY29uIGZvciBnaXZlbiByb3dcbiAgICogQHJldHVybnMgZGVjay5nbCBhY2Nlc3NvciB0aGF0IHJldHVybnMgVW5wYWNrZWRJY29uIHJlYWR5IHRvIGNvbnN1bWUgYnkgSWNvbkxheWVyXG4gICAqL1xuICBnZXRDdXN0b21NYXJrZXJJY29uQWNjZXNzb3IoaWNvblVybEFjY2Vzc29yLCBtYXNrID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1heEljb25TaXplID0gdGhpcy5nZXRNYXhNYXJrZXJTaXplKCk7XG5cbiAgICByZXR1cm4gZCA9PiB7XG4gICAgICBjb25zdCB3YW50ZWRVcmwgPVxuICAgICAgICAodHlwZW9mIGljb25VcmxBY2Nlc3NvciA9PT0gJ2Z1bmN0aW9uJykgPyBpY29uVXJsQWNjZXNzb3IoZCkgOiBpY29uVXJsQWNjZXNzb3I7XG4gICAgICBjb25zdCBpY29uT2sgPSBCb29sZWFuKHdhbnRlZFVybCk7XG4gICAgICBtYXNrID0gaWNvbk9rID8gbWFzayA6IHRydWU7XG4gICAgICBjb25zdCB1cmwgPSBpY29uT2sgPyB3YW50ZWRVcmwgOiBGQUxMQkFDS19JQ09OO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGAke3VybH1AQCR7bWF4SWNvblNpemV9QCR7bWFzayA/ICdtJyA6ICdjJ31gLFxuICAgICAgICB1cmwsXG4gICAgICAgIHdpZHRoOiBtYXhJY29uU2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBtYXhJY29uU2l6ZSxcbiAgICAgICAgbWFza1xuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGF0YUF0dHJpYnV0ZShrZXBsZXJUYWJsZSwgZ2V0UG9zaXRpb24pIHtcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJNZXRhKGRhdGFDb250YWluZXIsIGdldFBvc2l0aW9uKSB7XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xuICB9XG5cbiAgZ2V0UG9zaXRpb25BY2Nlc3NvcihkYXRhQ29udGFpbmVyKSB7XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlc1xuICAgIHJldHVybiAoKSA9PiBudWxsO1xuICB9XG5cbiAgZ2V0SGV4Q29sdW1uKHJhbmdlKSB7XG4gICAgY29uc3QgZmllbGQgPSBPYmplY3QudmFsdWVzKHRoaXMudmlzdWFsQ2hhbm5lbHMpPy5maW5kKHZhbHVlID0+IHZhbHVlLnJhbmdlID09PSByYW5nZSk/LmZpZWxkO1xuICAgIGlmIChmaWVsZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnW2ZpZWxkXT8uY29sb3JDb2x1bW47XG4gICAgfVxuICB9XG5cbiAgaXNDb2xvcmVkQnlDb2xvckNvbHVtbihyYW5nZSkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy52aXNDb25maWdbcmFuZ2VdPy5oZXhDb2xvcjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMYXllcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztB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
|