@carto/kepler.gl 0.0.85 → 0.0.86-alpha.deck9.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/dist/actions/action-wrapper.js +36 -41
- package/dist/actions/actions.js +15 -21
- package/dist/actions/identity-actions.js +14 -20
- package/dist/actions/index.js +16 -16
- package/dist/actions/map-state-actions.js +12 -18
- package/dist/actions/map-style-actions.js +30 -46
- package/dist/actions/provider-actions.js +49 -73
- package/dist/actions/ui-state-actions.js +73 -113
- package/dist/actions/vis-state-actions.js +152 -148
- package/dist/cloud-providers/index.js +6 -7
- package/dist/cloud-providers/provider.js +189 -279
- package/dist/components/bottom-widget.js +105 -117
- package/dist/components/common/action-panel.js +122 -74
- package/dist/components/common/animation-control/animation-control.js +69 -54
- package/dist/components/common/animation-control/animation-controller.js +134 -160
- package/dist/components/common/animation-control/animation-speed-slider.js +47 -54
- package/dist/components/common/animation-control/floating-time-display.js +120 -100
- package/dist/components/common/animation-control/playback-controls.js +147 -144
- package/dist/components/common/animation-control/speed-control.js +31 -23
- package/dist/components/common/checkbox.js +56 -70
- package/dist/components/common/color-legend.js +83 -110
- package/dist/components/common/data-table/button.js +31 -23
- package/dist/components/common/data-table/canvas.js +11 -5
- package/dist/components/common/data-table/cell-size.js +51 -61
- package/dist/components/common/data-table/grid.js +40 -59
- package/dist/components/common/data-table/index.js +464 -348
- package/dist/components/common/data-table/option-dropdown.js +50 -33
- package/dist/components/common/dataset-label.js +17 -13
- package/dist/components/common/error-boundary.js +27 -45
- package/dist/components/common/field-selector.js +99 -139
- package/dist/components/common/field-token.js +24 -9
- package/dist/components/common/file-uploader/file-drop.js +96 -115
- package/dist/components/common/file-uploader/file-upload-progress.js +68 -45
- package/dist/components/common/file-uploader/file-upload.js +215 -187
- package/dist/components/common/file-uploader/upload-button.js +35 -22
- package/dist/components/common/histogram-plot.js +47 -58
- package/dist/components/common/icons/add.js +14 -27
- package/dist/components/common/icons/anchor_window.js +16 -18
- package/dist/components/common/icons/arrow-down-alt.js +14 -27
- package/dist/components/common/icons/arrow-down-solid.js +14 -27
- package/dist/components/common/icons/arrow-down.js +14 -27
- package/dist/components/common/icons/arrow-left.js +17 -30
- package/dist/components/common/icons/arrow-right.js +14 -27
- package/dist/components/common/icons/arrow-up-alt.js +15 -28
- package/dist/components/common/icons/arrow-up-solid.js +14 -27
- package/dist/components/common/icons/arrow-up.js +14 -27
- package/dist/components/common/icons/base.js +39 -57
- package/dist/components/common/icons/bug.js +16 -29
- package/dist/components/common/icons/cancel.js +14 -27
- package/dist/components/common/icons/checkmark.js +18 -31
- package/dist/components/common/icons/chevron-right.js +20 -33
- package/dist/components/common/icons/clipboard.js +15 -28
- package/dist/components/common/icons/clock.js +16 -29
- package/dist/components/common/icons/close.js +19 -32
- package/dist/components/common/icons/code-alt.js +16 -29
- package/dist/components/common/icons/copy.js +18 -31
- package/dist/components/common/icons/crosshairs.js +16 -29
- package/dist/components/common/icons/cube-3d.js +18 -31
- package/dist/components/common/icons/cursor-click.js +18 -31
- package/dist/components/common/icons/data-table.js +15 -28
- package/dist/components/common/icons/db.js +15 -28
- package/dist/components/common/icons/delete.js +16 -29
- package/dist/components/common/icons/docs.js +30 -43
- package/dist/components/common/icons/drag-n-drop.js +16 -29
- package/dist/components/common/icons/draw-polygon.js +33 -46
- package/dist/components/common/icons/email.js +18 -31
- package/dist/components/common/icons/expand.js +16 -29
- package/dist/components/common/icons/eye-seen.js +16 -29
- package/dist/components/common/icons/eye-unseen.js +16 -29
- package/dist/components/common/icons/file-type.js +35 -19
- package/dist/components/common/icons/file.js +14 -27
- package/dist/components/common/icons/files.js +14 -26
- package/dist/components/common/icons/filter-funnel.js +14 -27
- package/dist/components/common/icons/free-window.js +16 -18
- package/dist/components/common/icons/gear.js +16 -29
- package/dist/components/common/icons/hash.js +14 -27
- package/dist/components/common/icons/histogram.js +15 -27
- package/dist/components/common/icons/index.js +156 -156
- package/dist/components/common/icons/info.js +25 -38
- package/dist/components/common/icons/layers.js +14 -27
- package/dist/components/common/icons/left-arrow.js +16 -29
- package/dist/components/common/icons/legend.js +14 -27
- package/dist/components/common/icons/line-chart.js +14 -27
- package/dist/components/common/icons/login.js +17 -30
- package/dist/components/common/icons/logout.js +16 -29
- package/dist/components/common/icons/map-icon.js +18 -32
- package/dist/components/common/icons/map.js +18 -32
- package/dist/components/common/icons/messages.js +14 -27
- package/dist/components/common/icons/minus.js +14 -27
- package/dist/components/common/icons/order-by-dataset.js +15 -17
- package/dist/components/common/icons/order-by-list.js +7 -9
- package/dist/components/common/icons/pause.js +14 -27
- package/dist/components/common/icons/picture.js +14 -26
- package/dist/components/common/icons/pin.js +17 -30
- package/dist/components/common/icons/play.js +14 -27
- package/dist/components/common/icons/polygon.js +35 -48
- package/dist/components/common/icons/rectangle.js +36 -49
- package/dist/components/common/icons/reduce.js +17 -30
- package/dist/components/common/icons/reset.js +14 -27
- package/dist/components/common/icons/rocket.js +14 -27
- package/dist/components/common/icons/save.js +16 -29
- package/dist/components/common/icons/save2.js +20 -33
- package/dist/components/common/icons/search.js +16 -29
- package/dist/components/common/icons/settings.js +16 -29
- package/dist/components/common/icons/share.js +14 -27
- package/dist/components/common/icons/split.js +42 -55
- package/dist/components/common/icons/square-select.js +16 -29
- package/dist/components/common/icons/swap-horizontal.js +18 -31
- package/dist/components/common/icons/table.js +14 -27
- package/dist/components/common/icons/trash.js +16 -29
- package/dist/components/common/icons/upload.js +14 -27
- package/dist/components/common/icons/vert-dots.js +52 -65
- package/dist/components/common/icons/vert-three-dots.js +27 -40
- package/dist/components/common/icons/warning.js +26 -39
- package/dist/components/common/image-preview.js +71 -33
- package/dist/components/common/info-helper.js +36 -29
- package/dist/components/common/item-selector/accessor.js +7 -13
- package/dist/components/common/item-selector/chickleted-input.js +72 -56
- package/dist/components/common/item-selector/dropdown-list.js +182 -214
- package/dist/components/common/item-selector/item-selector-submenu.js +34 -55
- package/dist/components/common/item-selector/item-selector.js +183 -194
- package/dist/components/common/item-selector/typeahead.js +236 -248
- package/dist/components/common/line-chart.js +80 -58
- package/dist/components/common/loading-spinner.js +46 -31
- package/dist/components/common/logo.js +61 -48
- package/dist/components/common/map-layer-selector.js +31 -25
- package/dist/components/common/modal.js +167 -106
- package/dist/components/common/portaled.js +169 -189
- package/dist/components/common/progress-bar.js +27 -24
- package/dist/components/common/range-brush.js +176 -215
- package/dist/components/common/range-plot.js +52 -63
- package/dist/components/common/range-slider.js +206 -231
- package/dist/components/common/slider/mouse-event.js +59 -66
- package/dist/components/common/slider/slider-bar-handle.js +51 -61
- package/dist/components/common/slider/slider-handle.js +127 -102
- package/dist/components/common/slider/slider.js +143 -162
- package/dist/components/common/styled-components.js +518 -256
- package/dist/components/common/switch.js +11 -11
- package/dist/components/common/time-range-slider-time-title.js +49 -32
- package/dist/components/common/time-range-slider.js +56 -45
- package/dist/components/common/time-slider-marker.js +71 -52
- package/dist/components/common/tippy-tooltip.js +89 -59
- package/dist/components/common/toolbar-item.js +53 -45
- package/dist/components/common/toolbar.js +24 -18
- package/dist/components/common/vertical-toolbar.js +13 -6
- package/dist/components/container.js +87 -119
- package/dist/components/context.js +6 -8
- package/dist/components/editor/constants.js +4 -4
- package/dist/components/editor/editor.js +122 -157
- package/dist/components/editor/feature-action-panel.js +52 -59
- package/dist/components/editor/feature-styles.js +46 -29
- package/dist/components/editor/handle-style.js +38 -29
- package/dist/components/filters/components.js +8 -4
- package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +33 -43
- package/dist/components/filters/filter-panels/multi-select-filter-panel.js +20 -21
- package/dist/components/filters/filter-panels/new-filter-panel.js +24 -31
- package/dist/components/filters/filter-panels/polygon-filter-panel.js +26 -31
- package/dist/components/filters/filter-panels/range-filter-panel.js +20 -21
- package/dist/components/filters/filter-panels/single-select-filter-panel.js +20 -21
- package/dist/components/filters/filter-panels/time-range-filter-panel.js +28 -31
- package/dist/components/filters/index.js +10 -10
- package/dist/components/filters/multi-select-filter.js +11 -9
- package/dist/components/filters/polygon-filter.js +26 -41
- package/dist/components/filters/range-filter.js +9 -7
- package/dist/components/filters/single-select-filter.js +11 -13
- package/dist/components/filters/time-range-filter.js +16 -14
- package/dist/components/filters/time-widget.js +125 -84
- package/dist/components/geocoder/geocoder.js +158 -177
- package/dist/components/geocoder-panel.js +66 -87
- package/dist/components/index.js +328 -329
- package/dist/components/injector.js +44 -63
- package/dist/components/kepler-gl.js +325 -361
- package/dist/components/map/coordinate-info.js +18 -16
- package/dist/components/map/layer-hover-info.js +108 -86
- package/dist/components/map/layer-selector-panel.js +50 -48
- package/dist/components/map/locale-panel.js +38 -44
- package/dist/components/map/map-control-panel.js +70 -47
- package/dist/components/map/map-control-toolbar.js +9 -6
- package/dist/components/map/map-control-tooltip.js +10 -8
- package/dist/components/map/map-control.js +35 -27
- package/dist/components/map/map-draw-panel.js +38 -48
- package/dist/components/map/map-legend-panel.js +47 -50
- package/dist/components/map/map-legend.js +133 -116
- package/dist/components/map/map-popover.js +155 -100
- package/dist/components/map/split-map-button.js +30 -34
- package/dist/components/map/toggle-3d-button.js +25 -27
- package/dist/components/map-container.js +313 -359
- package/dist/components/maps-layout.js +16 -26
- package/dist/components/modal-container.js +359 -355
- package/dist/components/modals/add-map-style-modal.js +233 -194
- package/dist/components/modals/cloud-tile.js +96 -67
- package/dist/components/modals/data-table-modal.js +155 -152
- package/dist/components/modals/delete-data-modal.js +20 -20
- package/dist/components/modals/error-display.js +9 -7
- package/dist/components/modals/export-data-modal.js +118 -140
- package/dist/components/modals/export-image-modal.js +82 -69
- package/dist/components/modals/export-map-modal/components.js +20 -18
- package/dist/components/modals/export-map-modal/export-html-map.js +82 -74
- package/dist/components/modals/export-map-modal/export-json-map.js +65 -45
- package/dist/components/modals/export-map-modal/export-map-modal.js +42 -47
- package/dist/components/modals/image-modal-container.js +20 -21
- package/dist/components/modals/load-data-modal.js +28 -30
- package/dist/components/modals/load-storage-map.js +277 -178
- package/dist/components/modals/loading-dialog.js +41 -19
- package/dist/components/modals/modal-dialog.js +4 -6
- package/dist/components/modals/modal-tabs.js +83 -48
- package/dist/components/modals/overwrite-map-modal.js +41 -30
- package/dist/components/modals/provider-modal-container.js +23 -42
- package/dist/components/modals/save-map-modal.js +107 -83
- package/dist/components/modals/share-map-modal.js +101 -95
- package/dist/components/modals/status-panel.js +63 -43
- package/dist/components/modals/storage-map-viewer.js +133 -70
- package/dist/components/notification-panel/notification-item.js +94 -97
- package/dist/components/notification-panel.js +35 -43
- package/dist/components/performance.js +49 -53
- package/dist/components/plot-container.js +151 -169
- package/dist/components/side-panel/cloud-storage-dropdown.js +13 -15
- package/dist/components/side-panel/common/dataset-info.js +16 -12
- package/dist/components/side-panel/common/dataset-tag.js +48 -27
- package/dist/components/side-panel/common/dataset-title.js +119 -116
- package/dist/components/side-panel/common/source-data-catalog.js +31 -32
- package/dist/components/side-panel/common/source-data-selector.js +52 -77
- package/dist/components/side-panel/custom-panel.js +6 -8
- package/dist/components/side-panel/filter-manager.js +48 -62
- package/dist/components/side-panel/filter-panel/filter-panel-header.js +35 -25
- package/dist/components/side-panel/filter-panel/filter-panel.js +46 -64
- package/dist/components/side-panel/interaction-manager.js +20 -18
- package/dist/components/side-panel/interaction-panel/brush-config.js +17 -17
- package/dist/components/side-panel/interaction-panel/interaction-panel.js +76 -95
- package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +118 -143
- package/dist/components/side-panel/interaction-panel/tooltip-config.js +95 -76
- package/dist/components/side-panel/layer-manager.js +105 -115
- package/dist/components/side-panel/layer-panel/add-layer-button.js +92 -54
- package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +5 -5
- package/dist/components/side-panel/layer-panel/color-palette.js +50 -37
- package/dist/components/side-panel/layer-panel/color-range-selector.js +196 -207
- package/dist/components/side-panel/layer-panel/color-selector.js +104 -110
- package/dist/components/side-panel/layer-panel/column-selector.js +34 -22
- package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +4 -4
- package/dist/components/side-panel/layer-panel/custom-palette.js +248 -205
- package/dist/components/side-panel/layer-panel/custom-picker.js +51 -69
- package/dist/components/side-panel/layer-panel/dataset-layer-group.js +37 -42
- package/dist/components/side-panel/layer-panel/dataset-layer-section.js +31 -27
- package/dist/components/side-panel/layer-panel/dataset-section.js +45 -35
- package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +14 -13
- package/dist/components/side-panel/layer-panel/hex-column-config.js +32 -55
- package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +5 -5
- package/dist/components/side-panel/layer-panel/layer-column-config.js +42 -46
- package/dist/components/side-panel/layer-panel/layer-config-group.js +178 -144
- package/dist/components/side-panel/layer-panel/layer-configurator.js +826 -830
- package/dist/components/side-panel/layer-panel/layer-list.js +101 -94
- package/dist/components/side-panel/layer-panel/layer-panel-header.js +124 -82
- package/dist/components/side-panel/layer-panel/layer-panel.js +111 -105
- package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +67 -58
- package/dist/components/side-panel/layer-panel/layer-type-list-item.js +47 -32
- package/dist/components/side-panel/layer-panel/layer-type-selector.js +30 -41
- package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +42 -43
- package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +55 -57
- package/dist/components/side-panel/layer-panel/single-color-palette.js +48 -33
- package/dist/components/side-panel/layer-panel/text-label-panel.js +81 -116
- package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +88 -102
- package/dist/components/side-panel/layer-panel/vis-config-slider.js +99 -85
- package/dist/components/side-panel/layer-panel/vis-config-switch.js +38 -29
- package/dist/components/side-panel/map-manager.js +70 -89
- package/dist/components/side-panel/map-style-panel/map-layer-selector.js +72 -60
- package/dist/components/side-panel/map-style-panel/map-style-selector.js +64 -42
- package/dist/components/side-panel/panel-dropdown.js +21 -37
- package/dist/components/side-panel/panel-header-action.js +60 -65
- package/dist/components/side-panel/panel-header.js +165 -184
- package/dist/components/side-panel/panel-tab.js +35 -29
- package/dist/components/side-panel/panel-title.js +15 -18
- package/dist/components/side-panel/panel-toggle.js +30 -31
- package/dist/components/side-panel/side-bar.js +100 -91
- package/dist/components/side-panel.js +108 -123
- package/dist/connect/keplergl-connect.js +17 -26
- package/dist/connect/with-local-selector.js +31 -63
- package/dist/constants/action-types.js +113 -115
- package/dist/constants/color-palette.js +14 -16
- package/dist/constants/color-ranges.js +23 -28
- package/dist/constants/custom-color-ranges.js +12 -12
- package/dist/constants/default-settings.js +323 -254
- package/dist/constants/index.js +63 -63
- package/dist/constants/keyevent.js +4 -4
- package/dist/constants/tooltip.js +5 -5
- package/dist/constants/user-feedbacks.js +9 -5
- package/dist/constants/user-guides.js +10 -10
- package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +37 -63
- package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +52 -56
- package/dist/deckgl-layers/cluster-layer/cluster-layer.js +165 -168
- package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +24 -43
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.d.ts +2 -2
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +27 -40
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +27 -40
- package/dist/deckgl-layers/layer-utils/cluster-utils.js +60 -68
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.d.ts +4 -4
- package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +281 -282
- package/dist/deckgl-layers/layer-utils/shader-utils.js +2 -2
- package/dist/deckgl-layers/line-layer/line-layer.js +62 -70
- package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +37 -51
- package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +65 -85
- package/dist/index.js +15 -16
- package/dist/layers/aggregation-layer.js +299 -331
- package/dist/layers/arc-layer/arc-layer-icon.js +27 -41
- package/dist/layers/arc-layer/arc-layer.js +174 -201
- package/dist/layers/base-layer.d.ts +1 -1
- package/dist/layers/base-layer.js +1371 -1544
- package/dist/layers/cluster-layer/cluster-layer-icon.js +30 -44
- package/dist/layers/cluster-layer/cluster-layer.js +89 -103
- package/dist/layers/default-layer-icon.js +39 -53
- package/dist/layers/geojson-layer/geojson-layer-icon.js +42 -55
- package/dist/layers/geojson-layer/geojson-layer.js +292 -353
- package/dist/layers/geojson-layer/geojson-utils.js +31 -36
- package/dist/layers/grid-layer/grid-layer-icon.js +87 -100
- package/dist/layers/grid-layer/grid-layer.js +51 -61
- package/dist/layers/grid-layer/grid-utils.js +13 -9
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +21 -35
- package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +225 -260
- package/dist/layers/h3-hexagon-layer/h3-utils.js +16 -16
- package/dist/layers/heatmap-layer/heatmap-layer-icon.js +39 -52
- package/dist/layers/heatmap-layer/heatmap-layer.js +140 -171
- package/dist/layers/hexagon-layer/hexagon-layer-icon.js +51 -64
- package/dist/layers/hexagon-layer/hexagon-layer.js +49 -63
- package/dist/layers/hexagon-layer/hexagon-utils.js +15 -14
- package/dist/layers/icon-layer/icon-info-modal.js +82 -75
- package/dist/layers/icon-layer/icon-layer-icon.js +24 -37
- package/dist/layers/icon-layer/icon-layer.js +274 -303
- package/dist/layers/index.js +43 -29
- package/dist/layers/layer-factory.js +25 -41
- package/dist/layers/layer-text-label.js +21 -23
- package/dist/layers/layer-update.js +16 -18
- package/dist/layers/line-layer/line-layer-icon.js +30 -43
- package/dist/layers/line-layer/line-layer.js +123 -142
- package/dist/layers/mapbox-utils.js +61 -62
- package/dist/layers/mapboxgl-layer.js +124 -169
- package/dist/layers/point-layer/point-layer-icon.js +45 -59
- package/dist/layers/point-layer/point-layer.d.ts +2 -2
- package/dist/layers/point-layer/point-layer.js +355 -386
- package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +208 -238
- package/dist/layers/s2-geometry-layer/s2-layer-icon.js +21 -35
- package/dist/layers/s2-geometry-layer/s2-utils.js +9 -8
- package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +24 -25
- package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +102 -115
- package/dist/layers/scenegraph-layer/scenegraph-layer.js +148 -172
- package/dist/layers/trip-layer/trip-info-modal.js +50 -30
- package/dist/layers/trip-layer/trip-layer-icon.js +40 -53
- package/dist/layers/trip-layer/trip-layer.js +239 -307
- package/dist/layers/trip-layer/trip-utils.js +34 -50
- package/dist/layers/types.js +2 -2
- package/dist/localization/formatted-message.js +8 -10
- package/dist/localization/index.js +7 -7
- package/dist/localization/locales.js +6 -9
- package/dist/localization/messages.js +13 -10
- package/dist/localization/translations/ca.js +11 -13
- package/dist/localization/translations/cn.js +11 -13
- package/dist/localization/translations/en.js +11 -13
- package/dist/localization/translations/es.js +11 -13
- package/dist/localization/translations/fi.js +11 -13
- package/dist/localization/translations/ja.js +11 -13
- package/dist/localization/translations/pt.js +11 -13
- package/dist/localization/translations/ru.js +11 -13
- package/dist/middleware/index.js +3 -5
- package/dist/processors/data-processor.js +164 -201
- package/dist/processors/file-handler.js +111 -233
- package/dist/processors/index.js +4 -4
- package/dist/reducers/combined-updaters.js +41 -41
- package/dist/reducers/composer-helpers.js +20 -45
- package/dist/reducers/composers.js +9 -8
- package/dist/reducers/core.js +31 -35
- package/dist/reducers/index.js +21 -22
- package/dist/reducers/map-state-updaters.js +65 -47
- package/dist/reducers/map-state.js +23 -15
- package/dist/reducers/map-style-updaters.js +233 -159
- package/dist/reducers/map-style.js +30 -16
- package/dist/reducers/provider-state-updaters.js +217 -229
- package/dist/reducers/provider-state.js +29 -17
- package/dist/reducers/root.js +86 -58
- package/dist/reducers/ui-state-updaters.js +337 -218
- package/dist/reducers/ui-state.js +45 -16
- package/dist/reducers/vis-state-merger.js +205 -209
- package/dist/reducers/vis-state-selectors.js +5 -19
- package/dist/reducers/vis-state-updaters.js +1003 -876
- package/dist/reducers/vis-state.js +75 -16
- package/dist/schemas/dataset-schema.js +84 -108
- package/dist/schemas/index.js +28 -29
- package/dist/schemas/map-state-schema.js +21 -18
- package/dist/schemas/map-style-schema.js +47 -55
- package/dist/schemas/schema-manager.js +147 -161
- package/dist/schemas/schema-utils.js +8 -9
- package/dist/schemas/schema.js +72 -87
- package/dist/schemas/versions.js +3 -3
- package/dist/schemas/vis-state-schema.js +441 -583
- package/dist/styles/base.js +1217 -1021
- package/dist/styles/index.js +3 -3
- package/dist/styles/media-breakpoints.js +23 -18
- package/dist/tasks/tasks.js +36 -39
- package/dist/templates/export-map-html.js +233 -4
- package/dist/utils/aggregate-utils.js +13 -16
- package/dist/utils/color-utils.js +29 -37
- package/dist/utils/custom-scales.js +3 -3
- package/dist/utils/data-scale-utils.js +6 -13
- package/dist/utils/data-utils.js +60 -83
- package/dist/utils/dataset-utils.js +48 -77
- package/dist/utils/dom-to-image.js +108 -163
- package/dist/utils/dom-utils.js +88 -105
- package/dist/utils/export-utils.js +116 -103
- package/dist/utils/filter-utils.js +379 -374
- package/dist/utils/gl-utils.js +16 -15
- package/dist/utils/gpu-filter-utils.js +54 -73
- package/dist/utils/index.js +47 -48
- package/dist/utils/interaction-utils.js +53 -46
- package/dist/utils/layer-utils.js +89 -78
- package/dist/utils/locale-utils.js +24 -16
- package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +67 -76
- package/dist/utils/map-style-utils/mapbox-utils.js +4 -3
- package/dist/utils/mapbox-utils.js +3 -4
- package/dist/utils/notifications-utils.js +33 -38
- package/dist/utils/observe-dimensions.js +42 -54
- package/dist/utils/projection-utils.js +14 -11
- package/dist/utils/split-map-utils.js +30 -33
- package/dist/utils/table-utils/data-container-utils.js +15 -14
- package/dist/utils/table-utils/data-row.js +58 -65
- package/dist/utils/table-utils/index.js +2 -2
- package/dist/utils/table-utils/indexed-data-container.js +105 -173
- package/dist/utils/table-utils/kepler-table.js +362 -386
- package/dist/utils/table-utils/row-data-container.js +99 -164
- package/dist/utils/utils.js +29 -30
- package/package.json +21 -21
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.ts +2 -2
- package/src/deckgl-layers/layer-utils/cpu-aggregator.ts +21 -11
- package/src/layers/base-layer.ts +17 -10
|
@@ -6,15 +6,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.copyTable = copyTable;
|
|
8
8
|
exports.copyTableAndUpdate = copyTableAndUpdate;
|
|
9
|
-
exports
|
|
9
|
+
exports.default = void 0;
|
|
10
10
|
exports.findPointFieldPairs = findPointFieldPairs;
|
|
11
11
|
exports.pinTableColumns = pinTableColumns;
|
|
12
12
|
exports.removeSuffixAndDelimiters = removeSuffixAndDelimiters;
|
|
13
13
|
exports.sortDatasetByColumn = sortDatasetByColumn;
|
|
14
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
15
14
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
16
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
17
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
18
15
|
var _console = require("global/console");
|
|
19
16
|
var _defaultSettings = require("../../constants/default-settings");
|
|
20
17
|
var _d3Array = require("d3-array");
|
|
@@ -25,11 +22,7 @@ var _dataUtils = require("../data-utils");
|
|
|
25
22
|
var _dataScaleUtils = require("../data-scale-utils");
|
|
26
23
|
var _dataContainerUtils = require("./data-container-utils");
|
|
27
24
|
var _colorUtils = require("../color-utils");
|
|
28
|
-
|
|
29
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
30
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
31
|
-
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; }
|
|
32
|
-
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; } // Copyright (c) 2022 Uber Technologies, Inc.
|
|
25
|
+
// Copyright (c) 2022 Uber Technologies, Inc.
|
|
33
26
|
//
|
|
34
27
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
35
28
|
// of this software and associated documentation files (the "Software"), to deal
|
|
@@ -48,24 +41,43 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
48
41
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
49
42
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
50
43
|
// THE SOFTWARE.
|
|
44
|
+
|
|
51
45
|
// import {validateInputData} from 'processors/data-processor';
|
|
46
|
+
|
|
52
47
|
// Unique identifier of each field
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
(0,
|
|
48
|
+
const FID_KEY = 'name';
|
|
49
|
+
class KeplerTable {
|
|
50
|
+
constructor(_ref) {
|
|
51
|
+
let {
|
|
52
|
+
info = {},
|
|
53
|
+
data,
|
|
54
|
+
color,
|
|
55
|
+
metadata,
|
|
56
|
+
supportedFilterTypes
|
|
57
|
+
} = _ref;
|
|
58
|
+
(0, _defineProperty2.default)(this, "id", void 0);
|
|
59
|
+
(0, _defineProperty2.default)(this, "type", void 0);
|
|
60
|
+
(0, _defineProperty2.default)(this, "label", void 0);
|
|
61
|
+
(0, _defineProperty2.default)(this, "color", void 0);
|
|
62
|
+
// fields and data
|
|
63
|
+
(0, _defineProperty2.default)(this, "fields", void 0);
|
|
64
|
+
(0, _defineProperty2.default)(this, "dataContainer", void 0);
|
|
65
|
+
(0, _defineProperty2.default)(this, "allIndexes", void 0);
|
|
66
|
+
(0, _defineProperty2.default)(this, "filteredIndex", void 0);
|
|
67
|
+
(0, _defineProperty2.default)(this, "filteredIdxCPU", void 0);
|
|
68
|
+
(0, _defineProperty2.default)(this, "filteredIndexForDomain", void 0);
|
|
69
|
+
(0, _defineProperty2.default)(this, "fieldPairs", void 0);
|
|
70
|
+
(0, _defineProperty2.default)(this, "gpuFilter", void 0);
|
|
71
|
+
(0, _defineProperty2.default)(this, "filterRecord", void 0);
|
|
72
|
+
(0, _defineProperty2.default)(this, "filterRecordCPU", void 0);
|
|
73
|
+
(0, _defineProperty2.default)(this, "changedFilters", void 0);
|
|
74
|
+
// table-injected metadata
|
|
75
|
+
(0, _defineProperty2.default)(this, "sortColumn", void 0);
|
|
76
|
+
(0, _defineProperty2.default)(this, "sortOrder", void 0);
|
|
77
|
+
(0, _defineProperty2.default)(this, "pinnedColumns", void 0);
|
|
78
|
+
(0, _defineProperty2.default)(this, "supportedFilterTypes", void 0);
|
|
79
|
+
// table-injected metadata
|
|
80
|
+
(0, _defineProperty2.default)(this, "metadata", void 0);
|
|
69
81
|
// TODO - what to do if validation fails? Can kepler handle exceptions?
|
|
70
82
|
// const validatedData = validateInputData(data);
|
|
71
83
|
// if (!validatedData) {
|
|
@@ -73,33 +85,34 @@ var KeplerTable = /*#__PURE__*/function () {
|
|
|
73
85
|
// }
|
|
74
86
|
|
|
75
87
|
// @ts-expect-error
|
|
76
|
-
|
|
88
|
+
const dataContainer = (0, _dataContainerUtils.createDataContainer)(data.rows, {
|
|
77
89
|
fields: data.fields
|
|
78
90
|
});
|
|
79
|
-
|
|
91
|
+
const datasetInfo = {
|
|
80
92
|
id: (0, _utils.generateHashId)(4),
|
|
81
|
-
label: 'new dataset'
|
|
82
|
-
|
|
83
|
-
|
|
93
|
+
label: 'new dataset',
|
|
94
|
+
...(info || {})
|
|
95
|
+
};
|
|
96
|
+
const dataId = datasetInfo.id;
|
|
84
97
|
// @ts-expect-error
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
var allIndexes = dataContainer.getPlainIndex();
|
|
98
|
+
const fields = data.fields.map((f, i) => ({
|
|
99
|
+
...f,
|
|
100
|
+
fieldIdx: i,
|
|
101
|
+
id: f.name,
|
|
102
|
+
displayName: f.displayName || f.name,
|
|
103
|
+
valueAccessor: _dataUtils.maybeToDate.bind(null,
|
|
104
|
+
// is time
|
|
105
|
+
f.type === _defaultSettings.ALL_FIELD_TYPES.timestamp || f.type === _defaultSettings.ALL_FIELD_TYPES.date, i, f.format, dataContainer)
|
|
106
|
+
}));
|
|
107
|
+
const allIndexes = dataContainer.getPlainIndex();
|
|
96
108
|
this.id = datasetInfo.id;
|
|
97
109
|
this.label = datasetInfo.label;
|
|
98
110
|
this.color = color;
|
|
99
|
-
this.metadata =
|
|
111
|
+
this.metadata = {
|
|
112
|
+
...metadata,
|
|
100
113
|
id: datasetInfo.id,
|
|
101
114
|
label: datasetInfo.label
|
|
102
|
-
}
|
|
115
|
+
};
|
|
103
116
|
this.dataContainer = dataContainer;
|
|
104
117
|
this.allIndexes = allIndexes;
|
|
105
118
|
this.filteredIndex = allIndexes;
|
|
@@ -116,298 +129,283 @@ var KeplerTable = /*#__PURE__*/function () {
|
|
|
116
129
|
* Get field
|
|
117
130
|
* @param columnName
|
|
118
131
|
*/
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
});
|
|
125
|
-
this._assetField(columnName, field);
|
|
126
|
-
return field;
|
|
127
|
-
}
|
|
132
|
+
getColumnField(columnName) {
|
|
133
|
+
const field = this.fields.find(fd => fd[FID_KEY] === columnName);
|
|
134
|
+
this._assetField(columnName, field);
|
|
135
|
+
return field;
|
|
136
|
+
}
|
|
128
137
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
});
|
|
139
|
-
this._assetField(columnName, Boolean(fieldIdx > -1));
|
|
140
|
-
return fieldIdx;
|
|
141
|
-
}
|
|
138
|
+
/**
|
|
139
|
+
* Get fieldIdx
|
|
140
|
+
* @param columnName
|
|
141
|
+
*/
|
|
142
|
+
getColumnFieldIdx(columnName) {
|
|
143
|
+
const fieldIdx = this.fields.findIndex(fd => fd[FID_KEY] === columnName);
|
|
144
|
+
this._assetField(columnName, Boolean(fieldIdx > -1));
|
|
145
|
+
return fieldIdx;
|
|
146
|
+
}
|
|
142
147
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}) : null;
|
|
153
|
-
}
|
|
148
|
+
/**
|
|
149
|
+
* Get the value of a cell
|
|
150
|
+
*/
|
|
151
|
+
getValue(columnName, rowIdx) {
|
|
152
|
+
const field = this.getColumnField(columnName);
|
|
153
|
+
return field ? field.valueAccessor({
|
|
154
|
+
index: rowIdx
|
|
155
|
+
}) : null;
|
|
156
|
+
}
|
|
154
157
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
158
|
+
/**
|
|
159
|
+
* Updates existing field with a new object
|
|
160
|
+
* @param fieldIdx
|
|
161
|
+
* @param newField
|
|
162
|
+
*/
|
|
163
|
+
updateColumnField(fieldIdx, newField) {
|
|
164
|
+
this.fields = Object.assign([...this.fields], {
|
|
165
|
+
[fieldIdx]: newField
|
|
166
|
+
});
|
|
167
|
+
}
|
|
165
168
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
this.color = newColor;
|
|
174
|
-
}
|
|
169
|
+
/**
|
|
170
|
+
* Update dataset color by custom color
|
|
171
|
+
* @param newColor
|
|
172
|
+
*/
|
|
173
|
+
updateTableColor(newColor) {
|
|
174
|
+
this.color = newColor;
|
|
175
|
+
}
|
|
175
176
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (!fieldDomain) {
|
|
193
|
-
return null;
|
|
194
|
-
}
|
|
195
|
-
var filterProps = (0, _filterUtils.getFilterProps)(field, fieldDomain);
|
|
196
|
-
var newField = _objectSpread(_objectSpread({}, field), {}, {
|
|
197
|
-
filterProps: filterProps
|
|
198
|
-
});
|
|
199
|
-
this.updateColumnField(fieldIdx, newField);
|
|
200
|
-
return filterProps;
|
|
177
|
+
/**
|
|
178
|
+
* Save filterProps to field and retrieve it
|
|
179
|
+
* @param columnName
|
|
180
|
+
*/
|
|
181
|
+
getColumnFilterProps(columnName) {
|
|
182
|
+
const fieldIdx = this.getColumnFieldIdx(columnName);
|
|
183
|
+
if (fieldIdx < 0) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const field = this.fields[fieldIdx];
|
|
187
|
+
if (field.hasOwnProperty('filterProps')) {
|
|
188
|
+
return field.filterProps;
|
|
189
|
+
}
|
|
190
|
+
const fieldDomain = this.getColumnFilterDomain(field);
|
|
191
|
+
if (!fieldDomain) {
|
|
192
|
+
return null;
|
|
201
193
|
}
|
|
194
|
+
const filterProps = (0, _filterUtils.getFilterProps)(field, fieldDomain);
|
|
195
|
+
const newField = {
|
|
196
|
+
...field,
|
|
197
|
+
filterProps
|
|
198
|
+
};
|
|
199
|
+
this.updateColumnField(fieldIdx, newField);
|
|
200
|
+
return filterProps;
|
|
201
|
+
}
|
|
202
202
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
this.filteredIndexForDomain = this.allIndexes;
|
|
228
|
-
return this;
|
|
229
|
-
}
|
|
230
|
-
this.changedFilters = (0, _filterUtils.diffFilters)(filterRecord, oldFilterRecord);
|
|
231
|
-
|
|
232
|
-
// generate 2 sets of filter result
|
|
233
|
-
// filteredIndex used to calculate layer data
|
|
234
|
-
// filteredIndexForDomain used to calculate layer Domain
|
|
235
|
-
var shouldCalDomain = Boolean(this.changedFilters.dynamicDomain);
|
|
236
|
-
var shouldCalIndex = Boolean(this.changedFilters.cpu);
|
|
237
|
-
var filterResult = {};
|
|
238
|
-
if (shouldCalDomain || shouldCalIndex) {
|
|
239
|
-
var dynamicDomainFilters = shouldCalDomain ? filterRecord.dynamicDomain : null;
|
|
240
|
-
var cpuFilters = shouldCalIndex ? filterRecord.cpu : null;
|
|
241
|
-
var filterFuncs = filters.reduce(function (acc, filter) {
|
|
242
|
-
var fieldIndex = (0, _gpuFilterUtils.getDatasetFieldIndexForFilter)(_this.id, filter);
|
|
243
|
-
var field = fieldIndex !== -1 ? fields[fieldIndex] : null;
|
|
244
|
-
return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, filter.id, (0, _filterUtils.getFilterFunction)(field, _this.id, filter, layers, dataContainer)));
|
|
245
|
-
}, {});
|
|
246
|
-
filterResult = (0, _filterUtils.filterDataByFilterTypes)({
|
|
247
|
-
dynamicDomainFilters: dynamicDomainFilters,
|
|
248
|
-
cpuFilters: cpuFilters,
|
|
249
|
-
filterFuncs: filterFuncs
|
|
250
|
-
}, dataContainer);
|
|
251
|
-
}
|
|
252
|
-
this.filteredIndex = filterResult.filteredIndex || this.filteredIndex;
|
|
253
|
-
this.filteredIndexForDomain = filterResult.filteredIndexForDomain || this.filteredIndexForDomain;
|
|
203
|
+
/**
|
|
204
|
+
* Apply filters to dataset, return the filtered dataset with updated `gpuFilter`, `filterRecord`, `filteredIndex`, `filteredIndexForDomain`
|
|
205
|
+
* @param filters
|
|
206
|
+
* @param layers
|
|
207
|
+
* @param opt
|
|
208
|
+
*/
|
|
209
|
+
filterTable(filters, layers, opt) {
|
|
210
|
+
const {
|
|
211
|
+
dataContainer,
|
|
212
|
+
id: dataId,
|
|
213
|
+
filterRecord: oldFilterRecord,
|
|
214
|
+
fields
|
|
215
|
+
} = this;
|
|
216
|
+
|
|
217
|
+
// if there is no filters
|
|
218
|
+
const filterRecord = (0, _filterUtils.getFilterRecord)(dataId, filters, opt || {});
|
|
219
|
+
this.filterRecord = filterRecord;
|
|
220
|
+
this.gpuFilter = (0, _gpuFilterUtils.getGpuFilterProps)(filters, dataId, fields);
|
|
221
|
+
|
|
222
|
+
// const newDataset = set(['filterRecord'], filterRecord, dataset);
|
|
223
|
+
|
|
224
|
+
if (!filters.length) {
|
|
225
|
+
this.filteredIndex = this.allIndexes;
|
|
226
|
+
this.filteredIndexForDomain = this.allIndexes;
|
|
254
227
|
return this;
|
|
255
228
|
}
|
|
229
|
+
this.changedFilters = (0, _filterUtils.diffFilters)(filterRecord, oldFilterRecord);
|
|
230
|
+
|
|
231
|
+
// generate 2 sets of filter result
|
|
232
|
+
// filteredIndex used to calculate layer data
|
|
233
|
+
// filteredIndexForDomain used to calculate layer Domain
|
|
234
|
+
const shouldCalDomain = Boolean(this.changedFilters.dynamicDomain);
|
|
235
|
+
const shouldCalIndex = Boolean(this.changedFilters.cpu);
|
|
236
|
+
let filterResult = {};
|
|
237
|
+
if (shouldCalDomain || shouldCalIndex) {
|
|
238
|
+
const dynamicDomainFilters = shouldCalDomain ? filterRecord.dynamicDomain : null;
|
|
239
|
+
const cpuFilters = shouldCalIndex ? filterRecord.cpu : null;
|
|
240
|
+
const filterFuncs = filters.reduce((acc, filter) => {
|
|
241
|
+
const fieldIndex = (0, _gpuFilterUtils.getDatasetFieldIndexForFilter)(this.id, filter);
|
|
242
|
+
const field = fieldIndex !== -1 ? fields[fieldIndex] : null;
|
|
243
|
+
return {
|
|
244
|
+
...acc,
|
|
245
|
+
[filter.id]: (0, _filterUtils.getFilterFunction)(field, this.id, filter, layers, dataContainer)
|
|
246
|
+
};
|
|
247
|
+
}, {});
|
|
248
|
+
filterResult = (0, _filterUtils.filterDataByFilterTypes)({
|
|
249
|
+
dynamicDomainFilters,
|
|
250
|
+
cpuFilters,
|
|
251
|
+
filterFuncs
|
|
252
|
+
}, dataContainer);
|
|
253
|
+
}
|
|
254
|
+
this.filteredIndex = filterResult.filteredIndex || this.filteredIndex;
|
|
255
|
+
this.filteredIndexForDomain = filterResult.filteredIndexForDomain || this.filteredIndexForDomain;
|
|
256
|
+
return this;
|
|
257
|
+
}
|
|
256
258
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
this.filteredIdxCPU = this.allIndexes;
|
|
273
|
-
this.filterRecordCPU = (0, _filterUtils.getFilterRecord)(this.id, filters, opt);
|
|
274
|
-
return this;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// no gpu filter
|
|
278
|
-
if (!filters.find(function (f) {
|
|
279
|
-
return f.gpu;
|
|
280
|
-
})) {
|
|
281
|
-
this.filteredIdxCPU = this.filteredIndex;
|
|
282
|
-
this.filterRecordCPU = (0, _filterUtils.getFilterRecord)(this.id, filters, opt);
|
|
283
|
-
return this;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// make a copy for cpu filtering
|
|
287
|
-
var copied = copyTable(this);
|
|
288
|
-
copied.filterRecord = this.filterRecordCPU;
|
|
289
|
-
copied.filteredIndex = this.filteredIdxCPU || [];
|
|
290
|
-
var filtered = copied.filterTable(filters, layers, opt);
|
|
291
|
-
this.filteredIdxCPU = filtered.filteredIndex;
|
|
292
|
-
this.filterRecordCPU = filtered.filterRecord;
|
|
259
|
+
/**
|
|
260
|
+
* Apply filters to a dataset all on CPU, assign to `filteredIdxCPU`, `filterRecordCPU`
|
|
261
|
+
* @param filters
|
|
262
|
+
* @param layers
|
|
263
|
+
*/
|
|
264
|
+
filterTableCPU(filters, layers) {
|
|
265
|
+
const opt = {
|
|
266
|
+
cpuOnly: true,
|
|
267
|
+
ignoreDomain: true
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
// no filter
|
|
271
|
+
if (!filters.length) {
|
|
272
|
+
this.filteredIdxCPU = this.allIndexes;
|
|
273
|
+
this.filterRecordCPU = (0, _filterUtils.getFilterRecord)(this.id, filters, opt);
|
|
293
274
|
return this;
|
|
294
275
|
}
|
|
295
276
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
key: "getColumnFilterDomain",
|
|
302
|
-
value: function getColumnFilterDomain(field) {
|
|
303
|
-
var dataContainer = this.dataContainer;
|
|
304
|
-
var valueAccessor = field.valueAccessor;
|
|
305
|
-
var domain;
|
|
306
|
-
switch (field.type) {
|
|
307
|
-
case _defaultSettings.ALL_FIELD_TYPES.real:
|
|
308
|
-
case _defaultSettings.ALL_FIELD_TYPES.integer:
|
|
309
|
-
// calculate domain and step
|
|
310
|
-
return (0, _filterUtils.getNumericFieldDomain)(dataContainer, valueAccessor);
|
|
311
|
-
case _defaultSettings.ALL_FIELD_TYPES["boolean"]:
|
|
312
|
-
return {
|
|
313
|
-
domain: [true, false]
|
|
314
|
-
};
|
|
315
|
-
case _defaultSettings.ALL_FIELD_TYPES.string:
|
|
316
|
-
case _defaultSettings.ALL_FIELD_TYPES.date:
|
|
317
|
-
domain = (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor);
|
|
318
|
-
return {
|
|
319
|
-
domain: domain
|
|
320
|
-
};
|
|
321
|
-
case _defaultSettings.ALL_FIELD_TYPES.timestamp:
|
|
322
|
-
return (0, _filterUtils.getTimestampFieldDomain)(dataContainer, valueAccessor);
|
|
323
|
-
default:
|
|
324
|
-
return {
|
|
325
|
-
domain: (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor)
|
|
326
|
-
};
|
|
327
|
-
}
|
|
277
|
+
// no gpu filter
|
|
278
|
+
if (!filters.find(f => f.gpu)) {
|
|
279
|
+
this.filteredIdxCPU = this.filteredIndex;
|
|
280
|
+
this.filterRecordCPU = (0, _filterUtils.getFilterRecord)(this.id, filters, opt);
|
|
281
|
+
return this;
|
|
328
282
|
}
|
|
329
283
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}, {
|
|
367
|
-
key: "calculateLegend",
|
|
368
|
-
value: function calculateLegend(leftField, rightField) {
|
|
369
|
-
var limitOfNumberOfLegendEntries = 20;
|
|
370
|
-
var leftValues = this.dataContainer.mapIndex(leftField.valueAccessor);
|
|
371
|
-
var rightValues = this.dataContainer.mapIndex(rightField.valueAccessor);
|
|
372
|
-
var pairing = leftValues.reduce(function (previous, current, idx) {
|
|
373
|
-
previous.push([current, rightValues[idx]]);
|
|
374
|
-
return previous;
|
|
375
|
-
}, []);
|
|
376
|
-
return (0, _dataUtils.uniqueSortedPairByFrequency)(pairing).map(function (row) {
|
|
284
|
+
// make a copy for cpu filtering
|
|
285
|
+
const copied = copyTable(this);
|
|
286
|
+
copied.filterRecord = this.filterRecordCPU;
|
|
287
|
+
copied.filteredIndex = this.filteredIdxCPU || [];
|
|
288
|
+
const filtered = copied.filterTable(filters, layers, opt);
|
|
289
|
+
this.filteredIdxCPU = filtered.filteredIndex;
|
|
290
|
+
this.filterRecordCPU = filtered.filterRecord;
|
|
291
|
+
return this;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Calculate field domain based on field type and data
|
|
296
|
+
* for Filter
|
|
297
|
+
*/
|
|
298
|
+
getColumnFilterDomain(field) {
|
|
299
|
+
const {
|
|
300
|
+
dataContainer
|
|
301
|
+
} = this;
|
|
302
|
+
const {
|
|
303
|
+
valueAccessor
|
|
304
|
+
} = field;
|
|
305
|
+
let domain;
|
|
306
|
+
switch (field.type) {
|
|
307
|
+
case _defaultSettings.ALL_FIELD_TYPES.real:
|
|
308
|
+
case _defaultSettings.ALL_FIELD_TYPES.integer:
|
|
309
|
+
// calculate domain and step
|
|
310
|
+
return (0, _filterUtils.getNumericFieldDomain)(dataContainer, valueAccessor);
|
|
311
|
+
case _defaultSettings.ALL_FIELD_TYPES.boolean:
|
|
312
|
+
return {
|
|
313
|
+
domain: [true, false]
|
|
314
|
+
};
|
|
315
|
+
case _defaultSettings.ALL_FIELD_TYPES.string:
|
|
316
|
+
case _defaultSettings.ALL_FIELD_TYPES.date:
|
|
317
|
+
domain = (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor);
|
|
377
318
|
return {
|
|
378
|
-
|
|
379
|
-
|
|
319
|
+
domain
|
|
320
|
+
};
|
|
321
|
+
case _defaultSettings.ALL_FIELD_TYPES.timestamp:
|
|
322
|
+
return (0, _filterUtils.getTimestampFieldDomain)(dataContainer, valueAccessor);
|
|
323
|
+
default:
|
|
324
|
+
return {
|
|
325
|
+
domain: (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor)
|
|
380
326
|
};
|
|
381
|
-
}).slice(0, limitOfNumberOfLegendEntries + 1); // Limit to limitOfNumberOfLegendEntries + 1, then limit to limitOfNumberOfLegendEntries in LegendManagers
|
|
382
327
|
}
|
|
328
|
+
}
|
|
383
329
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
330
|
+
/**
|
|
331
|
+
* Get the domain of this column based on scale type
|
|
332
|
+
*/
|
|
333
|
+
getColumnLayerDomain(field, scaleType) {
|
|
334
|
+
const {
|
|
335
|
+
dataContainer,
|
|
336
|
+
filteredIndexForDomain
|
|
337
|
+
} = this;
|
|
338
|
+
if (!_defaultSettings.SCALE_TYPES[scaleType]) {
|
|
339
|
+
_console.console.error(`scale type ${scaleType} not supported`);
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
const {
|
|
343
|
+
valueAccessor
|
|
344
|
+
} = field;
|
|
345
|
+
const indexValueAccessor = i => valueAccessor({
|
|
346
|
+
index: i
|
|
347
|
+
});
|
|
348
|
+
const sortFunction = (0, _dataUtils.getSortingFunction)(field.type);
|
|
349
|
+
switch (scaleType) {
|
|
350
|
+
case _defaultSettings.SCALE_TYPES.ordinal:
|
|
351
|
+
case _defaultSettings.SCALE_TYPES.point:
|
|
352
|
+
// do not recalculate ordinal domain based on filtered data
|
|
353
|
+
// don't need to update ordinal domain every time
|
|
354
|
+
return (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor);
|
|
355
|
+
case _defaultSettings.SCALE_TYPES.quantile:
|
|
356
|
+
return (0, _dataScaleUtils.getQuantileDomain)(filteredIndexForDomain, indexValueAccessor, sortFunction);
|
|
357
|
+
case _defaultSettings.SCALE_TYPES.log:
|
|
358
|
+
return (0, _dataScaleUtils.getLogDomain)(filteredIndexForDomain, indexValueAccessor);
|
|
359
|
+
case _defaultSettings.SCALE_TYPES.quantize:
|
|
360
|
+
case _defaultSettings.SCALE_TYPES.linear:
|
|
361
|
+
case _defaultSettings.SCALE_TYPES.sqrt:
|
|
362
|
+
default:
|
|
363
|
+
return (0, _dataScaleUtils.getLinearDomain)(filteredIndexForDomain, indexValueAccessor);
|
|
408
364
|
}
|
|
409
|
-
}
|
|
410
|
-
|
|
365
|
+
}
|
|
366
|
+
calculateLegend(leftField, rightField) {
|
|
367
|
+
const limitOfNumberOfLegendEntries = 20;
|
|
368
|
+
const leftValues = this.dataContainer.mapIndex(leftField.valueAccessor);
|
|
369
|
+
const rightValues = this.dataContainer.mapIndex(rightField.valueAccessor);
|
|
370
|
+
const pairing = leftValues.reduce((previous, current, idx) => {
|
|
371
|
+
previous.push([current, rightValues[idx]]);
|
|
372
|
+
return previous;
|
|
373
|
+
}, []);
|
|
374
|
+
return (0, _dataUtils.uniqueSortedPairByFrequency)(pairing).map(row => {
|
|
375
|
+
return {
|
|
376
|
+
label: row.left,
|
|
377
|
+
color: (0, _colorUtils.checkColorOrFallback)(row.right)
|
|
378
|
+
};
|
|
379
|
+
}).slice(0, limitOfNumberOfLegendEntries + 1); // Limit to limitOfNumberOfLegendEntries + 1, then limit to limitOfNumberOfLegendEntries in LegendManagers
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Get a sample of rows to calculate layer boundaries
|
|
384
|
+
*/
|
|
385
|
+
// getSampleData(rows)
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Parse cell value based on column type and return a string representation
|
|
389
|
+
* Value the field value, type the field type
|
|
390
|
+
*/
|
|
391
|
+
// parseFieldValue(value, type)
|
|
392
|
+
|
|
393
|
+
// sortDatasetByColumn()
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Assert whether field exist
|
|
397
|
+
* @param fieldName
|
|
398
|
+
* @param condition
|
|
399
|
+
*/
|
|
400
|
+
_assetField(fieldName, condition) {
|
|
401
|
+
if (!condition) {
|
|
402
|
+
_console.console.error(`${fieldName} doesnt exist in dataset ${this.id}`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// HELPER FUNCTIONS (MAINLY EXPORTED FOR TEST...)
|
|
408
|
+
|
|
411
409
|
function removeSuffixAndDelimiters(layerName, suffix) {
|
|
412
410
|
return layerName.replace(new RegExp(suffix, 'ig'), '').replace(/[_,.]+/g, ' ').trim();
|
|
413
411
|
}
|
|
@@ -419,64 +417,44 @@ function removeSuffixAndDelimiters(layerName, suffix) {
|
|
|
419
417
|
* @returns found point fields
|
|
420
418
|
*/
|
|
421
419
|
function findPointFieldPairs(fields) {
|
|
422
|
-
|
|
423
|
-
return f.name.toLowerCase();
|
|
424
|
-
});
|
|
420
|
+
const allNames = fields.map(f => f.name.toLowerCase());
|
|
425
421
|
|
|
426
422
|
// get list of all fields with matching suffixes
|
|
427
|
-
|
|
428
|
-
|
|
423
|
+
const acc = [];
|
|
424
|
+
const result = allNames.reduce((carry, fieldName, idx) => {
|
|
429
425
|
// This search for pairs will early exit if found.
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
}
|
|
456
|
-
},
|
|
457
|
-
suffix: suffixPair
|
|
458
|
-
});
|
|
459
|
-
return {
|
|
460
|
-
v: carry
|
|
461
|
-
};
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
},
|
|
465
|
-
_ret;
|
|
466
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
467
|
-
_ret = _loop();
|
|
468
|
-
if (_ret) return _ret.v;
|
|
426
|
+
for (const suffixPair of _defaultSettings.TRIP_POINT_FIELDS) {
|
|
427
|
+
// match first suffix```
|
|
428
|
+
if (fieldName.endsWith(suffixPair[0])) {
|
|
429
|
+
// match second suffix
|
|
430
|
+
const otherPattern = new RegExp(`${suffixPair[0]}\$`);
|
|
431
|
+
const partner = fieldName.replace(otherPattern, suffixPair[1]);
|
|
432
|
+
const partnerIdx = allNames.findIndex(d => d === partner);
|
|
433
|
+
if (partnerIdx > -1) {
|
|
434
|
+
const defaultName = removeSuffixAndDelimiters(fieldName, suffixPair[0]);
|
|
435
|
+
carry.push({
|
|
436
|
+
defaultName,
|
|
437
|
+
pair: {
|
|
438
|
+
lat: {
|
|
439
|
+
fieldIdx: idx,
|
|
440
|
+
value: fields[idx].name
|
|
441
|
+
},
|
|
442
|
+
lng: {
|
|
443
|
+
fieldIdx: partnerIdx,
|
|
444
|
+
value: fields[partnerIdx].name
|
|
445
|
+
}
|
|
446
|
+
},
|
|
447
|
+
suffix: suffixPair
|
|
448
|
+
});
|
|
449
|
+
return carry;
|
|
450
|
+
}
|
|
469
451
|
}
|
|
470
|
-
} catch (err) {
|
|
471
|
-
_iterator.e(err);
|
|
472
|
-
} finally {
|
|
473
|
-
_iterator.f();
|
|
474
452
|
}
|
|
475
453
|
return carry;
|
|
476
454
|
}, acc);
|
|
477
455
|
|
|
478
456
|
// prioritize the 'latitude'/'longitude' pair
|
|
479
|
-
result.sort(
|
|
457
|
+
result.sort((a, b) => {
|
|
480
458
|
if (a.defaultName === '' && a.suffix[0] === 'latitude') return -1;
|
|
481
459
|
if (b.defaultName === '' && b.suffix[0] === 'latitude') return 1;
|
|
482
460
|
return 0;
|
|
@@ -492,47 +470,45 @@ function findPointFieldPairs(fields) {
|
|
|
492
470
|
* @type
|
|
493
471
|
*/
|
|
494
472
|
function sortDatasetByColumn(dataset, column, mode) {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
473
|
+
const {
|
|
474
|
+
allIndexes,
|
|
475
|
+
fields,
|
|
476
|
+
dataContainer
|
|
477
|
+
} = dataset;
|
|
478
|
+
const fieldIndex = fields.findIndex(f => f.name === column);
|
|
501
479
|
if (fieldIndex < 0) {
|
|
502
480
|
return dataset;
|
|
503
481
|
}
|
|
504
|
-
|
|
482
|
+
const sortBy = _defaultSettings.SORT_ORDER[mode || ''] || _defaultSettings.SORT_ORDER.ASCENDING;
|
|
505
483
|
if (sortBy === _defaultSettings.SORT_ORDER.UNSORT) {
|
|
506
484
|
dataset.sortColumn = {};
|
|
507
485
|
dataset.sortOrder = null;
|
|
508
486
|
return dataset;
|
|
509
487
|
}
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
488
|
+
const sortFunction = sortBy === _defaultSettings.SORT_ORDER.ASCENDING ? _d3Array.ascending : _d3Array.descending;
|
|
489
|
+
const sortOrder = allIndexes.slice().sort((a, b) => sortFunction(dataContainer.valueAt(a, fieldIndex), dataContainer.valueAt(b, fieldIndex)));
|
|
490
|
+
dataset.sortColumn = {
|
|
491
|
+
[column]: sortBy
|
|
492
|
+
};
|
|
515
493
|
dataset.sortOrder = sortOrder;
|
|
516
494
|
return dataset;
|
|
517
495
|
}
|
|
518
496
|
function pinTableColumns(dataset, column) {
|
|
519
|
-
|
|
497
|
+
const field = dataset.getColumnField(column);
|
|
520
498
|
if (!field) {
|
|
521
499
|
return dataset;
|
|
522
500
|
}
|
|
523
|
-
|
|
501
|
+
let pinnedColumns;
|
|
524
502
|
if (Array.isArray(dataset.pinnedColumns) && dataset.pinnedColumns.includes(field.name)) {
|
|
525
503
|
// unpin it
|
|
526
|
-
pinnedColumns = dataset.pinnedColumns.filter(
|
|
527
|
-
return co !== field.name;
|
|
528
|
-
});
|
|
504
|
+
pinnedColumns = dataset.pinnedColumns.filter(co => co !== field.name);
|
|
529
505
|
} else {
|
|
530
506
|
pinnedColumns = (dataset.pinnedColumns || []).concat(field.name);
|
|
531
507
|
}
|
|
532
508
|
|
|
533
509
|
// @ts-ignore
|
|
534
510
|
return copyTableAndUpdate(dataset, {
|
|
535
|
-
pinnedColumns
|
|
511
|
+
pinnedColumns
|
|
536
512
|
});
|
|
537
513
|
}
|
|
538
514
|
function copyTable(original) {
|
|
@@ -544,11 +520,11 @@ function copyTable(original) {
|
|
|
544
520
|
* @returns
|
|
545
521
|
*/
|
|
546
522
|
function copyTableAndUpdate(original) {
|
|
547
|
-
|
|
548
|
-
return Object.entries(options).reduce(
|
|
523
|
+
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
524
|
+
return Object.entries(options).reduce((acc, entry) => {
|
|
549
525
|
acc[entry[0]] = entry[1];
|
|
550
526
|
return acc;
|
|
551
527
|
}, copyTable(original));
|
|
552
528
|
}
|
|
553
|
-
var _default = exports
|
|
554
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc29sZSIsInJlcXVpcmUiLCJfZGVmYXVsdFNldHRpbmdzIiwiX2QzQXJyYXkiLCJfdXRpbHMiLCJfZ3B1RmlsdGVyVXRpbHMiLCJfZmlsdGVyVXRpbHMiLCJfZGF0YVV0aWxzIiwiX2RhdGFTY2FsZVV0aWxzIiwiX2RhdGFDb250YWluZXJVdGlscyIsIl9jb2xvclV0aWxzIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJvd25LZXlzIiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiRklEX0tFWSIsIktlcGxlclRhYmxlIiwiX3JlZiIsIl9yZWYkaW5mbyIsImluZm8iLCJkYXRhIiwiY29sb3IiLCJtZXRhZGF0YSIsInN1cHBvcnRlZEZpbHRlclR5cGVzIiwiX2NsYXNzQ2FsbENoZWNrMiIsImRhdGFDb250YWluZXIiLCJjcmVhdGVEYXRhQ29udGFpbmVyIiwicm93cyIsImZpZWxkcyIsImRhdGFzZXRJbmZvIiwiaWQiLCJnZW5lcmF0ZUhhc2hJZCIsImxhYmVsIiwiZGF0YUlkIiwibWFwIiwiaSIsImZpZWxkSWR4IiwiZGlzcGxheU5hbWUiLCJ2YWx1ZUFjY2Vzc29yIiwibWF5YmVUb0RhdGUiLCJiaW5kIiwidHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsImRhdGUiLCJmb3JtYXQiLCJhbGxJbmRleGVzIiwiZ2V0UGxhaW5JbmRleCIsImZpbHRlcmVkSW5kZXgiLCJmaWx0ZXJlZEluZGV4Rm9yRG9tYWluIiwiZmllbGRQYWlycyIsImZpbmRQb2ludEZpZWxkUGFpcnMiLCJncHVGaWx0ZXIiLCJnZXRHcHVGaWx0ZXJQcm9wcyIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJnZXRDb2x1bW5GaWVsZCIsImNvbHVtbk5hbWUiLCJmaWVsZCIsImZpbmQiLCJmZCIsIl9hc3NldEZpZWxkIiwiZ2V0Q29sdW1uRmllbGRJZHgiLCJmaW5kSW5kZXgiLCJCb29sZWFuIiwiZ2V0VmFsdWUiLCJyb3dJZHgiLCJpbmRleCIsInVwZGF0ZUNvbHVtbkZpZWxkIiwibmV3RmllbGQiLCJhc3NpZ24iLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwidXBkYXRlVGFibGVDb2xvciIsIm5ld0NvbG9yIiwiZ2V0Q29sdW1uRmlsdGVyUHJvcHMiLCJoYXNPd25Qcm9wZXJ0eSIsImZpbHRlclByb3BzIiwiZmllbGREb21haW4iLCJnZXRDb2x1bW5GaWx0ZXJEb21haW4iLCJnZXRGaWx0ZXJQcm9wcyIsImZpbHRlclRhYmxlIiwiZmlsdGVycyIsImxheWVycyIsIm9wdCIsIl90aGlzIiwib2xkRmlsdGVyUmVjb3JkIiwiZmlsdGVyUmVjb3JkIiwiZ2V0RmlsdGVyUmVjb3JkIiwiY2hhbmdlZEZpbHRlcnMiLCJkaWZmRmlsdGVycyIsInNob3VsZENhbERvbWFpbiIsImR5bmFtaWNEb21haW4iLCJzaG91bGRDYWxJbmRleCIsImNwdSIsImZpbHRlclJlc3VsdCIsImR5bmFtaWNEb21haW5GaWx0ZXJzIiwiY3B1RmlsdGVycyIsImZpbHRlckZ1bmNzIiwicmVkdWNlIiwiYWNjIiwiZmllbGRJbmRleCIsImdldERhdGFzZXRGaWVsZEluZGV4Rm9yRmlsdGVyIiwiZ2V0RmlsdGVyRnVuY3Rpb24iLCJmaWx0ZXJEYXRhQnlGaWx0ZXJUeXBlcyIsImZpbHRlclRhYmxlQ1BVIiwiY3B1T25seSIsImlnbm9yZURvbWFpbiIsImZpbHRlcmVkSWR4Q1BVIiwiZmlsdGVyUmVjb3JkQ1BVIiwiZ3B1IiwiY29waWVkIiwiY29weVRhYmxlIiwiZmlsdGVyZWQiLCJkb21haW4iLCJyZWFsIiwiaW50ZWdlciIsImdldE51bWVyaWNGaWVsZERvbWFpbiIsInN0cmluZyIsImdldE9yZGluYWxEb21haW4iLCJnZXRUaW1lc3RhbXBGaWVsZERvbWFpbiIsImdldENvbHVtbkxheWVyRG9tYWluIiwic2NhbGVUeXBlIiwiU0NBTEVfVFlQRVMiLCJDb25zb2xlIiwiZXJyb3IiLCJjb25jYXQiLCJpbmRleFZhbHVlQWNjZXNzb3IiLCJzb3J0RnVuY3Rpb24iLCJnZXRTb3J0aW5nRnVuY3Rpb24iLCJvcmRpbmFsIiwicG9pbnQiLCJxdWFudGlsZSIsImdldFF1YW50aWxlRG9tYWluIiwibG9nIiwiZ2V0TG9nRG9tYWluIiwicXVhbnRpemUiLCJsaW5lYXIiLCJzcXJ0IiwiZ2V0TGluZWFyRG9tYWluIiwiY2FsY3VsYXRlTGVnZW5kIiwibGVmdEZpZWxkIiwicmlnaHRGaWVsZCIsImxpbWl0T2ZOdW1iZXJPZkxlZ2VuZEVudHJpZXMiLCJsZWZ0VmFsdWVzIiwibWFwSW5kZXgiLCJyaWdodFZhbHVlcyIsInBhaXJpbmciLCJwcmV2aW91cyIsImN1cnJlbnQiLCJpZHgiLCJ1bmlxdWVTb3J0ZWRQYWlyQnlGcmVxdWVuY3kiLCJyb3ciLCJsZWZ0IiwiY2hlY2tDb2xvck9yRmFsbGJhY2siLCJyaWdodCIsImZpZWxkTmFtZSIsImNvbmRpdGlvbiIsInJlbW92ZVN1ZmZpeEFuZERlbGltaXRlcnMiLCJsYXllck5hbWUiLCJzdWZmaXgiLCJyZXBsYWNlIiwiUmVnRXhwIiwidHJpbSIsImFsbE5hbWVzIiwidG9Mb3dlckNhc2UiLCJyZXN1bHQiLCJjYXJyeSIsIl9pdGVyYXRvciIsIlRSSVBfUE9JTlRfRklFTERTIiwiX3N0ZXAiLCJfbG9vcCIsInN1ZmZpeFBhaXIiLCJlbmRzV2l0aCIsIm90aGVyUGF0dGVybiIsInBhcnRuZXIiLCJwYXJ0bmVySWR4IiwiZCIsImRlZmF1bHROYW1lIiwicGFpciIsImxhdCIsImxuZyIsInYiLCJfcmV0IiwiZXJyIiwic29ydCIsImIiLCJzb3J0RGF0YXNldEJ5Q29sdW1uIiwiZGF0YXNldCIsImNvbHVtbiIsIm1vZGUiLCJzb3J0QnkiLCJTT1JUX09SREVSIiwiQVNDRU5ESU5HIiwiVU5TT1JUIiwic29ydENvbHVtbiIsInNvcnRPcmRlciIsImFzY2VuZGluZyIsImRlc2NlbmRpbmciLCJ2YWx1ZUF0IiwicGluVGFibGVDb2x1bW5zIiwicGlubmVkQ29sdW1ucyIsImluY2x1ZGVzIiwiY28iLCJjb3B5VGFibGVBbmRVcGRhdGUiLCJvcmlnaW5hbCIsImNyZWF0ZSIsImdldFByb3RvdHlwZU9mIiwib3B0aW9ucyIsInVuZGVmaW5lZCIsImVudHJpZXMiLCJlbnRyeSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90YWJsZS11dGlscy9rZXBsZXItdGFibGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC9jb25zb2xlJztcbmltcG9ydCB7VFJJUF9QT0lOVF9GSUVMRFMsIFNPUlRfT1JERVJ9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcbmltcG9ydCB7YXNjZW5kaW5nLCBkZXNjZW5kaW5nfSBmcm9tICdkMy1hcnJheSc7XG5cbi8vIGltcG9ydCB7dmFsaWRhdGVJbnB1dERhdGF9IGZyb20gJ3Byb2Nlc3NvcnMvZGF0YS1wcm9jZXNzb3InO1xuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZH0gZnJvbSAndXRpbHMvdXRpbHMnO1xuaW1wb3J0IHtnZXRHcHVGaWx0ZXJQcm9wcywgZ2V0RGF0YXNldEZpZWxkSW5kZXhGb3JGaWx0ZXJ9IGZyb20gJ3V0aWxzL2dwdS1maWx0ZXItdXRpbHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsdGVyUHJvcHMsXG4gIGdldEZpbHRlclJlY29yZCxcbiAgZGlmZkZpbHRlcnMsXG4gIGdldEZpbHRlckZ1bmN0aW9uLFxuICBmaWx0ZXJEYXRhQnlGaWx0ZXJUeXBlcyxcbiAgZ2V0TnVtZXJpY0ZpZWxkRG9tYWluLFxuICBnZXRUaW1lc3RhbXBGaWVsZERvbWFpbixcbiAgRmlsdGVyUmVzdWx0XG59IGZyb20gJ3V0aWxzL2ZpbHRlci11dGlscyc7XG5pbXBvcnQge21heWJlVG9EYXRlLCBnZXRTb3J0aW5nRnVuY3Rpb259IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZ2V0UXVhbnRpbGVEb21haW4sXG4gIGdldE9yZGluYWxEb21haW4sXG4gIGdldExvZ0RvbWFpbixcbiAgZ2V0TGluZWFyRG9tYWluXG59IGZyb20gJ3V0aWxzL2RhdGEtc2NhbGUtdXRpbHMnO1xuXG5pbXBvcnQge0FMTF9GSUVMRF9UWVBFUywgU0NBTEVfVFlQRVN9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuaW1wb3J0IHtjcmVhdGVEYXRhQ29udGFpbmVyfSBmcm9tICcuL2RhdGEtY29udGFpbmVyLXV0aWxzJztcbmltcG9ydCB7dW5pcXVlU29ydGVkUGFpckJ5RnJlcXVlbmN5fSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcbmltcG9ydCB7Y2hlY2tDb2xvck9yRmFsbGJhY2t9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcblxuaW1wb3J0IHtSR0JDb2xvcn0gZnJvbSAncmVkdWNlcnMvdHlwZXMnO1xuaW1wb3J0IHtMYXllcn0gZnJvbSAnbGF5ZXJzJztcbmltcG9ydCB7RmllbGREb21haW4sIEZpbHRlcn0gZnJvbSAncmVkdWNlcnMvdmlzLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZX0gZnJvbSAnLi9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXR9IGZyb20gJ2FjdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBGaWVsZCA9IHtcbiAgYW5hbHl6ZXJUeXBlOiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIGZvcm1hdDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGZpZWxkSWR4OiBudW1iZXI7XG4gIHZhbHVlQWNjZXNzb3Iodjoge2luZGV4OiBudW1iZXJ9KTogYW55O1xuICBmaWx0ZXJQcm9wcz86IGFueTtcbiAgbWV0YWRhdGE/OiBhbnk7XG59O1xuXG5leHBvcnQgdHlwZSBHcHVGaWx0ZXIgPSB7XG4gIGZpbHRlclJhbmdlOiBudW1iZXJbXVtdO1xuICBmaWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzOiBhbnk7XG4gIGZpbHRlclZhbHVlQWNjZXNzb3I6IChcbiAgICBkYzogRGF0YUNvbnRhaW5lckludGVyZmFjZVxuICApID0+IChcbiAgICBnZXRJbmRleD86IChhbnkpID0+IG51bWJlcixcbiAgICBnZXREYXRhPzogKGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlLCBkOiBhbnksIGZpZWxkSW5kZXg6IG51bWJlcikgPT4gYW55XG4gICkgPT4gKGQ6IGFueSkgPT4gbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRmllbGRQYWlyID0ge1xuICBkZWZhdWx0TmFtZTogc3RyaW5nO1xuICBwYWlyOiB7XG4gICAgW2tleTogc3RyaW5nXToge1xuICAgICAgZmllbGRJZHg6IG51bWJlcjtcbiAgICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgc3VmZml4OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlclJlY29yZCA9IHtcbiAgZHluYW1pY0RvbWFpbjogRmlsdGVyW107XG4gIGZpeGVkRG9tYWluOiBGaWx0ZXJbXTtcbiAgY3B1OiBGaWx0ZXJbXTtcbiAgZ3B1OiBGaWx0ZXJbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlckRhdGFzZXRPcHQgPSB7XG4gIC8vIG9ubHkgYWxsb3cgY3B1IGZpbHRlcmluZ1xuICBjcHVPbmx5PzogYm9vbGVhbjtcbiAgLy8gaWdub3JlIGZpbHRlciBmb3IgZG9tYWluIGNhbGN1bGF0aW9uXG4gIGlnbm9yZURvbWFpbj86IGJvb2xlYW47XG59O1xuXG4vLyBVbmlxdWUgaWRlbnRpZmllciBvZiBlYWNoIGZpZWxkXG5jb25zdCBGSURfS0VZID0gJ25hbWUnO1xuXG5jbGFzcyBLZXBsZXJUYWJsZSB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgdHlwZT86IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgY29sb3I6IFJHQkNvbG9yO1xuXG4gIC8vIGZpZWxkcyBhbmQgZGF0YVxuICBmaWVsZHM6IEZpZWxkW107XG5cbiAgZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZTtcblxuICBhbGxJbmRleGVzOiBudW1iZXJbXTtcbiAgZmlsdGVyZWRJbmRleDogbnVtYmVyW107XG4gIGZpbHRlcmVkSWR4Q1BVPzogbnVtYmVyW107XG4gIGZpbHRlcmVkSW5kZXhGb3JEb21haW46IG51bWJlcltdO1xuICBmaWVsZFBhaXJzOiBGaWVsZFBhaXJbXTtcbiAgZ3B1RmlsdGVyOiBHcHVGaWx0ZXI7XG4gIGZpbHRlclJlY29yZD86IEZpbHRlclJlY29yZDtcbiAgZmlsdGVyUmVjb3JkQ1BVPzogRmlsdGVyUmVjb3JkO1xuICBjaGFuZ2VkRmlsdGVycz86IGFueTtcblxuICAvLyB0YWJsZS1pbmplY3RlZCBtZXRhZGF0YVxuICBzb3J0Q29sdW1uPzoge1xuICAgIC8vIGNvbHVtbiBuYW1lOiBzb3J0ZWQgaWR4XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nOyAvLyBBU0NFTkRJTkcgfCBERVNDRU5ESU5HIHwgVU5TT1JUXG4gIH07XG4gIHNvcnRPcmRlcj86IG51bWJlcltdIHwgbnVsbDtcblxuICBwaW5uZWRDb2x1bW5zPzogc3RyaW5nW107XG4gIHN1cHBvcnRlZEZpbHRlclR5cGVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgLy8gdGFibGUtaW5qZWN0ZWQgbWV0YWRhdGFcbiAgbWV0YWRhdGE6IG9iamVjdDtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW5mbyA9IHt9LFxuICAgIGRhdGEsXG4gICAgY29sb3IsXG4gICAgbWV0YWRhdGEsXG4gICAgc3VwcG9ydGVkRmlsdGVyVHlwZXNcbiAgfToge1xuICAgIGluZm8/OiBQcm90b0RhdGFzZXRbJ2luZm8nXTtcbiAgICBkYXRhOiBQcm90b0RhdGFzZXRbJ2RhdGEnXTtcbiAgICBjb2xvcjogUkdCQ29sb3I7XG4gICAgbWV0YWRhdGE/OiBQcm90b0RhdGFzZXRbJ21ldGFkYXRhJ107XG4gICAgc3VwcG9ydGVkRmlsdGVyVHlwZXM/OiBQcm90b0RhdGFzZXRbJ3N1cHBvcnRlZEZpbHRlclR5cGVzJ107XG4gIH0pIHtcbiAgICAvLyBUT0RPIC0gd2hhdCB0byBkbyBpZiB2YWxpZGF0aW9uIGZhaWxzPyBDYW4ga2VwbGVyIGhhbmRsZSBleGNlcHRpb25zP1xuICAgIC8vIGNvbnN0IHZhbGlkYXRlZERhdGEgPSB2YWxpZGF0ZUlucHV0RGF0YShkYXRhKTtcbiAgICAvLyBpZiAoIXZhbGlkYXRlZERhdGEpIHtcbiAgICAvLyAgIHJldHVybiB0aGlzO1xuICAgIC8vIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBjb25zdCBkYXRhQ29udGFpbmVyID0gY3JlYXRlRGF0YUNvbnRhaW5lcihkYXRhLnJvd3MsIHtmaWVsZHM6IGRhdGEuZmllbGRzfSk7XG5cbiAgICBjb25zdCBkYXRhc2V0SW5mbyA9IHtcbiAgICAgIGlkOiBnZW5lcmF0ZUhhc2hJZCg0KSxcbiAgICAgIGxhYmVsOiAnbmV3IGRhdGFzZXQnLFxuICAgICAgLi4uKGluZm8gfHwge30pXG4gICAgfTtcbiAgICBjb25zdCBkYXRhSWQgPSBkYXRhc2V0SW5mby5pZDtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgY29uc3QgZmllbGRzOiBGaWVsZFtdID0gZGF0YS5maWVsZHMubWFwKChmLCBpKSA9PiAoe1xuICAgICAgLi4uZixcbiAgICAgIGZpZWxkSWR4OiBpLFxuICAgICAgaWQ6IGYubmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiBmLmRpc3BsYXlOYW1lIHx8IGYubmFtZSxcbiAgICAgIHZhbHVlQWNjZXNzb3I6IG1heWJlVG9EYXRlLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIC8vIGlzIHRpbWVcbiAgICAgICAgZi50eXBlID09PSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wIHx8IGYudHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLmRhdGUsXG4gICAgICAgIGksXG4gICAgICAgIGYuZm9ybWF0LFxuICAgICAgICBkYXRhQ29udGFpbmVyXG4gICAgICApXG4gICAgfSkpO1xuXG4gICAgY29uc3QgYWxsSW5kZXhlcyA9IGRhdGFDb250YWluZXIuZ2V0UGxhaW5JbmRleCgpO1xuXG4gICAgdGhpcy5pZCA9IGRhdGFzZXRJbmZvLmlkO1xuICAgIHRoaXMubGFiZWwgPSBkYXRhc2V0SW5mby5sYWJlbDtcbiAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAgdGhpcy5tZXRhZGF0YSA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgaWQ6IGRhdGFzZXRJbmZvLmlkLFxuICAgICAgbGFiZWw6IGRhdGFzZXRJbmZvLmxhYmVsXG4gICAgfTtcblxuICAgIHRoaXMuZGF0YUNvbnRhaW5lciA9IGRhdGFDb250YWluZXI7XG4gICAgdGhpcy5hbGxJbmRleGVzID0gYWxsSW5kZXhlcztcbiAgICB0aGlzLmZpbHRlcmVkSW5kZXggPSBhbGxJbmRleGVzO1xuICAgIHRoaXMuZmlsdGVyZWRJbmRleEZvckRvbWFpbiA9IGFsbEluZGV4ZXM7XG4gICAgdGhpcy5maWVsZFBhaXJzID0gZmluZFBvaW50RmllbGRQYWlycyhmaWVsZHMpO1xuICAgIHRoaXMuZmllbGRzID0gZmllbGRzO1xuICAgIHRoaXMuZ3B1RmlsdGVyID0gZ2V0R3B1RmlsdGVyUHJvcHMoW10sIGRhdGFJZCwgZmllbGRzKTtcbiAgICBpZiAoc3VwcG9ydGVkRmlsdGVyVHlwZXMpIHtcbiAgICAgIHRoaXMuc3VwcG9ydGVkRmlsdGVyVHlwZXMgPSBzdXBwb3J0ZWRGaWx0ZXJUeXBlcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpZWxkXG4gICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAqL1xuICBnZXRDb2x1bW5GaWVsZChjb2x1bW5OYW1lOiBzdHJpbmcpOiBGaWVsZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcy5maW5kKGZkID0+IGZkW0ZJRF9LRVldID09PSBjb2x1bW5OYW1lKTtcbiAgICB0aGlzLl9hc3NldEZpZWxkKGNvbHVtbk5hbWUsIGZpZWxkKTtcbiAgICByZXR1cm4gZmllbGQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpZWxkSWR4XG4gICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAqL1xuICBnZXRDb2x1bW5GaWVsZElkeChjb2x1bW5OYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGZpZWxkSWR4ID0gdGhpcy5maWVsZHMuZmluZEluZGV4KGZkID0+IGZkW0ZJRF9LRVldID09PSBjb2x1bW5OYW1lKTtcbiAgICB0aGlzLl9hc3NldEZpZWxkKGNvbHVtbk5hbWUsIEJvb2xlYW4oZmllbGRJZHggPiAtMSkpO1xuICAgIHJldHVybiBmaWVsZElkeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgY2VsbFxuICAgKi9cbiAgZ2V0VmFsdWUoY29sdW1uTmFtZTogc3RyaW5nLCByb3dJZHg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmdldENvbHVtbkZpZWxkKGNvbHVtbk5hbWUpO1xuICAgIHJldHVybiBmaWVsZCA/IGZpZWxkLnZhbHVlQWNjZXNzb3Ioe2luZGV4OiByb3dJZHh9KSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBleGlzdGluZyBmaWVsZCB3aXRoIGEgbmV3IG9iamVjdFxuICAgKiBAcGFyYW0gZmllbGRJZHhcbiAgICogQHBhcmFtIG5ld0ZpZWxkXG4gICAqL1xuICB1cGRhdGVDb2x1bW5GaWVsZChmaWVsZElkeDogbnVtYmVyLCBuZXdGaWVsZDogRmllbGQpOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkcyA9IE9iamVjdC5hc3NpZ24oWy4uLnRoaXMuZmllbGRzXSwge1tmaWVsZElkeF06IG5ld0ZpZWxkfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRhdGFzZXQgY29sb3IgYnkgY3VzdG9tIGNvbG9yXG4gICAqIEBwYXJhbSBuZXdDb2xvclxuICAgKi9cbiAgdXBkYXRlVGFibGVDb2xvcihuZXdDb2xvcjogUkdCQ29sb3IpOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9yID0gbmV3Q29sb3I7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBmaWx0ZXJQcm9wcyB0byBmaWVsZCBhbmQgcmV0cmlldmUgaXRcbiAgICogQHBhcmFtIGNvbHVtbk5hbWVcbiAgICovXG4gIGdldENvbHVtbkZpbHRlclByb3BzKGNvbHVtbk5hbWU6IHN0cmluZyk6IEZpZWxkWydmaWx0ZXJQcm9wcyddIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmllbGRJZHggPSB0aGlzLmdldENvbHVtbkZpZWxkSWR4KGNvbHVtbk5hbWUpO1xuICAgIGlmIChmaWVsZElkeCA8IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzW2ZpZWxkSWR4XTtcbiAgICBpZiAoZmllbGQuaGFzT3duUHJvcGVydHkoJ2ZpbHRlclByb3BzJykpIHtcbiAgICAgIHJldHVybiBmaWVsZC5maWx0ZXJQcm9wcztcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZERvbWFpbiA9IHRoaXMuZ2V0Q29sdW1uRmlsdGVyRG9tYWluKGZpZWxkKTtcbiAgICBpZiAoIWZpZWxkRG9tYWluKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJQcm9wcyA9IGdldEZpbHRlclByb3BzKGZpZWxkLCBmaWVsZERvbWFpbik7XG4gICAgY29uc3QgbmV3RmllbGQgPSB7XG4gICAgICAuLi5maWVsZCxcbiAgICAgIGZpbHRlclByb3BzXG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlQ29sdW1uRmllbGQoZmllbGRJZHgsIG5ld0ZpZWxkKTtcblxuICAgIHJldHVybiBmaWx0ZXJQcm9wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBmaWx0ZXJzIHRvIGRhdGFzZXQsIHJldHVybiB0aGUgZmlsdGVyZWQgZGF0YXNldCB3aXRoIHVwZGF0ZWQgYGdwdUZpbHRlcmAsIGBmaWx0ZXJSZWNvcmRgLCBgZmlsdGVyZWRJbmRleGAsIGBmaWx0ZXJlZEluZGV4Rm9yRG9tYWluYFxuICAgKiBAcGFyYW0gZmlsdGVyc1xuICAgKiBAcGFyYW0gbGF5ZXJzXG4gICAqIEBwYXJhbSBvcHRcbiAgICovXG4gIGZpbHRlclRhYmxlKGZpbHRlcnM6IEZpbHRlcltdLCBsYXllcnM6IExheWVyW10sIG9wdD86IEZpbHRlckRhdGFzZXRPcHQpOiBLZXBsZXJUYWJsZSB7XG4gICAgY29uc3Qge2RhdGFDb250YWluZXIsIGlkOiBkYXRhSWQsIGZpbHRlclJlY29yZDogb2xkRmlsdGVyUmVjb3JkLCBmaWVsZHN9ID0gdGhpcztcblxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGZpbHRlcnNcbiAgICBjb25zdCBmaWx0ZXJSZWNvcmQgPSBnZXRGaWx0ZXJSZWNvcmQoZGF0YUlkLCBmaWx0ZXJzLCBvcHQgfHwge30pO1xuXG4gICAgdGhpcy5maWx0ZXJSZWNvcmQgPSBmaWx0ZXJSZWNvcmQ7XG4gICAgdGhpcy5ncHVGaWx0ZXIgPSBnZXRHcHVGaWx0ZXJQcm9wcyhmaWx0ZXJzLCBkYXRhSWQsIGZpZWxkcyk7XG5cbiAgICAvLyBjb25zdCBuZXdEYXRhc2V0ID0gc2V0KFsnZmlsdGVyUmVjb3JkJ10sIGZpbHRlclJlY29yZCwgZGF0YXNldCk7XG5cbiAgICBpZiAoIWZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkSW5kZXggPSB0aGlzLmFsbEluZGV4ZXM7XG4gICAgICB0aGlzLmZpbHRlcmVkSW5kZXhGb3JEb21haW4gPSB0aGlzLmFsbEluZGV4ZXM7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZWRGaWx0ZXJzID0gZGlmZkZpbHRlcnMoZmlsdGVyUmVjb3JkLCBvbGRGaWx0ZXJSZWNvcmQpO1xuXG4gICAgLy8gZ2VuZXJhdGUgMiBzZXRzIG9mIGZpbHRlciByZXN1bHRcbiAgICAvLyBmaWx0ZXJlZEluZGV4IHVzZWQgdG8gY2FsY3VsYXRlIGxheWVyIGRhdGFcbiAgICAvLyBmaWx0ZXJlZEluZGV4Rm9yRG9tYWluIHVzZWQgdG8gY2FsY3VsYXRlIGxheWVyIERvbWFpblxuICAgIGNvbnN0IHNob3VsZENhbERvbWFpbiA9IEJvb2xlYW4odGhpcy5jaGFuZ2VkRmlsdGVycy5keW5hbWljRG9tYWluKTtcbiAgICBjb25zdCBzaG91bGRDYWxJbmRleCA9IEJvb2xlYW4odGhpcy5jaGFuZ2VkRmlsdGVycy5jcHUpO1xuXG4gICAgbGV0IGZpbHRlclJlc3VsdDogRmlsdGVyUmVzdWx0ID0ge307XG4gICAgaWYgKHNob3VsZENhbERvbWFpbiB8fCBzaG91bGRDYWxJbmRleCkge1xuICAgICAgY29uc3QgZHluYW1pY0RvbWFpbkZpbHRlcnMgPSBzaG91bGRDYWxEb21haW4gPyBmaWx0ZXJSZWNvcmQuZHluYW1pY0RvbWFpbiA6IG51bGw7XG4gICAgICBjb25zdCBjcHVGaWx0ZXJzID0gc2hvdWxkQ2FsSW5kZXggPyBmaWx0ZXJSZWNvcmQuY3B1IDogbnVsbDtcblxuICAgICAgY29uc3QgZmlsdGVyRnVuY3MgPSBmaWx0ZXJzLnJlZHVjZSgoYWNjLCBmaWx0ZXIpID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRJbmRleCA9IGdldERhdGFzZXRGaWVsZEluZGV4Rm9yRmlsdGVyKHRoaXMuaWQsIGZpbHRlcik7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRJbmRleCAhPT0gLTEgPyBmaWVsZHNbZmllbGRJbmRleF0gOiBudWxsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIFtmaWx0ZXIuaWRdOiBnZXRGaWx0ZXJGdW5jdGlvbihmaWVsZCwgdGhpcy5pZCwgZmlsdGVyLCBsYXllcnMsIGRhdGFDb250YWluZXIpXG4gICAgICAgIH07XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGZpbHRlclJlc3VsdCA9IGZpbHRlckRhdGFCeUZpbHRlclR5cGVzKFxuICAgICAgICB7ZHluYW1pY0RvbWFpbkZpbHRlcnMsIGNwdUZpbHRlcnMsIGZpbHRlckZ1bmNzfSxcbiAgICAgICAgZGF0YUNvbnRhaW5lclxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcmVkSW5kZXggPSBmaWx0ZXJSZXN1bHQuZmlsdGVyZWRJbmRleCB8fCB0aGlzLmZpbHRlcmVkSW5kZXg7XG4gICAgdGhpcy5maWx0ZXJlZEluZGV4Rm9yRG9tYWluID1cbiAgICAgIGZpbHRlclJlc3VsdC5maWx0ZXJlZEluZGV4Rm9yRG9tYWluIHx8IHRoaXMuZmlsdGVyZWRJbmRleEZvckRvbWFpbjtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGZpbHRlcnMgdG8gYSBkYXRhc2V0IGFsbCBvbiBDUFUsIGFzc2lnbiB0byBgZmlsdGVyZWRJZHhDUFVgLCBgZmlsdGVyUmVjb3JkQ1BVYFxuICAgKiBAcGFyYW0gZmlsdGVyc1xuICAgKiBAcGFyYW0gbGF5ZXJzXG4gICAqL1xuICBmaWx0ZXJUYWJsZUNQVShmaWx0ZXJzOiBGaWx0ZXJbXSwgbGF5ZXJzOiBMYXllcltdKTogS2VwbGVyVGFibGUge1xuICAgIGNvbnN0IG9wdCA9IHtcbiAgICAgIGNwdU9ubHk6IHRydWUsXG4gICAgICBpZ25vcmVEb21haW46IHRydWVcbiAgICB9O1xuXG4gICAgLy8gbm8gZmlsdGVyXG4gICAgaWYgKCFmaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWx0ZXJlZElkeENQVSA9IHRoaXMuYWxsSW5kZXhlcztcbiAgICAgIHRoaXMuZmlsdGVyUmVjb3JkQ1BVID0gZ2V0RmlsdGVyUmVjb3JkKHRoaXMuaWQsIGZpbHRlcnMsIG9wdCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBubyBncHUgZmlsdGVyXG4gICAgaWYgKCFmaWx0ZXJzLmZpbmQoZiA9PiBmLmdwdSkpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJZHhDUFUgPSB0aGlzLmZpbHRlcmVkSW5kZXg7XG4gICAgICB0aGlzLmZpbHRlclJlY29yZENQVSA9IGdldEZpbHRlclJlY29yZCh0aGlzLmlkLCBmaWx0ZXJzLCBvcHQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBhIGNvcHkgZm9yIGNwdSBmaWx0ZXJpbmdcbiAgICBjb25zdCBjb3BpZWQgPSBjb3B5VGFibGUodGhpcyk7XG5cbiAgICBjb3BpZWQuZmlsdGVyUmVjb3JkID0gdGhpcy5maWx0ZXJSZWNvcmRDUFU7XG4gICAgY29waWVkLmZpbHRlcmVkSW5kZXggPSB0aGlzLmZpbHRlcmVkSWR4Q1BVIHx8IFtdO1xuXG4gICAgY29uc3QgZmlsdGVyZWQgPSBjb3BpZWQuZmlsdGVyVGFibGUoZmlsdGVycywgbGF5ZXJzLCBvcHQpO1xuXG4gICAgdGhpcy5maWx0ZXJlZElkeENQVSA9IGZpbHRlcmVkLmZpbHRlcmVkSW5kZXg7XG4gICAgdGhpcy5maWx0ZXJSZWNvcmRDUFUgPSBmaWx0ZXJlZC5maWx0ZXJSZWNvcmQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgZmllbGQgZG9tYWluIGJhc2VkIG9uIGZpZWxkIHR5cGUgYW5kIGRhdGFcbiAgICogZm9yIEZpbHRlclxuICAgKi9cbiAgZ2V0Q29sdW1uRmlsdGVyRG9tYWluKGZpZWxkOiBGaWVsZCk6IEZpZWxkRG9tYWluIHtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lcn0gPSB0aGlzO1xuICAgIGNvbnN0IHt2YWx1ZUFjY2Vzc29yfSA9IGZpZWxkO1xuXG4gICAgbGV0IGRvbWFpbjtcblxuICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgY2FzZSBBTExfRklFTERfVFlQRVMucmVhbDpcbiAgICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXI6XG4gICAgICAgIC8vIGNhbGN1bGF0ZSBkb21haW4gYW5kIHN0ZXBcbiAgICAgICAgcmV0dXJuIGdldE51bWVyaWNGaWVsZERvbWFpbihkYXRhQ29udGFpbmVyLCB2YWx1ZUFjY2Vzc29yKTtcblxuICAgICAgY2FzZSBBTExfRklFTERfVFlQRVMuYm9vbGVhbjpcbiAgICAgICAgcmV0dXJuIHtkb21haW46IFt0cnVlLCBmYWxzZV19O1xuXG4gICAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmc6XG4gICAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5kYXRlOlxuICAgICAgICBkb21haW4gPSBnZXRPcmRpbmFsRG9tYWluKGRhdGFDb250YWluZXIsIHZhbHVlQWNjZXNzb3IpO1xuICAgICAgICByZXR1cm4ge2RvbWFpbn07XG5cbiAgICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgICAgcmV0dXJuIGdldFRpbWVzdGFtcEZpZWxkRG9tYWluKGRhdGFDb250YWluZXIsIHZhbHVlQWNjZXNzb3IpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge2RvbWFpbjogZ2V0T3JkaW5hbERvbWFpbihkYXRhQ29udGFpbmVyLCB2YWx1ZUFjY2Vzc29yKX07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqICBHZXQgdGhlIGRvbWFpbiBvZiB0aGlzIGNvbHVtbiBiYXNlZCBvbiBzY2FsZSB0eXBlXG4gICAqL1xuICBnZXRDb2x1bW5MYXllckRvbWFpbihcbiAgICBmaWVsZDogRmllbGQsXG4gICAgc2NhbGVUeXBlOiBzdHJpbmdcbiAgKTogbnVtYmVyW10gfCBzdHJpbmdbXSB8IFtudW1iZXIsIG51bWJlcl0gfCBudWxsIHtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lciwgZmlsdGVyZWRJbmRleEZvckRvbWFpbn0gPSB0aGlzO1xuXG4gICAgaWYgKCFTQ0FMRV9UWVBFU1tzY2FsZVR5cGVdKSB7XG4gICAgICBDb25zb2xlLmVycm9yKGBzY2FsZSB0eXBlICR7c2NhbGVUeXBlfSBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7dmFsdWVBY2Nlc3Nvcn0gPSBmaWVsZDtcbiAgICBjb25zdCBpbmRleFZhbHVlQWNjZXNzb3IgPSBpID0+IHZhbHVlQWNjZXNzb3Ioe2luZGV4OiBpfSk7XG4gICAgY29uc3Qgc29ydEZ1bmN0aW9uID0gZ2V0U29ydGluZ0Z1bmN0aW9uKGZpZWxkLnR5cGUpO1xuXG4gICAgc3dpdGNoIChzY2FsZVR5cGUpIHtcbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMub3JkaW5hbDpcbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMucG9pbnQ6XG4gICAgICAgIC8vIGRvIG5vdCByZWNhbGN1bGF0ZSBvcmRpbmFsIGRvbWFpbiBiYXNlZCBvbiBmaWx0ZXJlZCBkYXRhXG4gICAgICAgIC8vIGRvbid0IG5lZWQgdG8gdXBkYXRlIG9yZGluYWwgZG9tYWluIGV2ZXJ5IHRpbWVcbiAgICAgICAgcmV0dXJuIGdldE9yZGluYWxEb21haW4oZGF0YUNvbnRhaW5lciwgdmFsdWVBY2Nlc3Nvcik7XG5cbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMucXVhbnRpbGU6XG4gICAgICAgIHJldHVybiBnZXRRdWFudGlsZURvbWFpbihmaWx0ZXJlZEluZGV4Rm9yRG9tYWluLCBpbmRleFZhbHVlQWNjZXNzb3IsIHNvcnRGdW5jdGlvbik7XG5cbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMubG9nOlxuICAgICAgICByZXR1cm4gZ2V0TG9nRG9tYWluKGZpbHRlcmVkSW5kZXhGb3JEb21haW4sIGluZGV4VmFsdWVBY2Nlc3Nvcik7XG5cbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMucXVhbnRpemU6XG4gICAgICBjYXNlIFNDQUxFX1RZUEVTLmxpbmVhcjpcbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMuc3FydDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBnZXRMaW5lYXJEb21haW4oZmlsdGVyZWRJbmRleEZvckRvbWFpbiwgaW5kZXhWYWx1ZUFjY2Vzc29yKTtcbiAgICB9XG4gIH1cblxuICBjYWxjdWxhdGVMZWdlbmQobGVmdEZpZWxkLCByaWdodEZpZWxkKSB7XG4gICAgY29uc3QgbGltaXRPZk51bWJlck9mTGVnZW5kRW50cmllcyA9IDIwO1xuICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSB0aGlzLmRhdGFDb250YWluZXIubWFwSW5kZXgobGVmdEZpZWxkLnZhbHVlQWNjZXNzb3IpO1xuICAgIGNvbnN0IHJpZ2h0VmFsdWVzID0gdGhpcy5kYXRhQ29udGFpbmVyLm1hcEluZGV4KHJpZ2h0RmllbGQudmFsdWVBY2Nlc3Nvcik7XG5cbiAgICBjb25zdCBwYWlyaW5nID0gbGVmdFZhbHVlcy5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50LCBpZHgpID0+IHtcbiAgICAgIHByZXZpb3VzLnB1c2goW2N1cnJlbnQsIHJpZ2h0VmFsdWVzW2lkeF1dKTtcbiAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gdW5pcXVlU29ydGVkUGFpckJ5RnJlcXVlbmN5KHBhaXJpbmcpXG4gICAgICAubWFwKHJvdyA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWw6IHJvdy5sZWZ0LFxuICAgICAgICAgIGNvbG9yOiBjaGVja0NvbG9yT3JGYWxsYmFjayhyb3cucmlnaHQpXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLnNsaWNlKDAsIGxpbWl0T2ZOdW1iZXJPZkxlZ2VuZEVudHJpZXMgKyAxKTsgLy8gTGltaXQgdG8gbGltaXRPZk51bWJlck9mTGVnZW5kRW50cmllcyArIDEsIHRoZW4gbGltaXQgdG8gbGltaXRPZk51bWJlck9mTGVnZW5kRW50cmllcyBpbiBMZWdlbmRNYW5hZ2Vyc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNhbXBsZSBvZiByb3dzIHRvIGNhbGN1bGF0ZSBsYXllciBib3VuZGFyaWVzXG4gICAqL1xuICAvLyBnZXRTYW1wbGVEYXRhKHJvd3MpXG5cbiAgLyoqXG4gICAqIFBhcnNlIGNlbGwgdmFsdWUgYmFzZWQgb24gY29sdW1uIHR5cGUgYW5kIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBWYWx1ZSB0aGUgZmllbGQgdmFsdWUsIHR5cGUgdGhlIGZpZWxkIHR5cGVcbiAgICovXG4gIC8vIHBhcnNlRmllbGRWYWx1ZSh2YWx1ZSwgdHlwZSlcblxuICAvLyBzb3J0RGF0YXNldEJ5Q29sdW1uKClcblxuICAvKipcbiAgICogQXNzZXJ0IHdoZXRoZXIgZmllbGQgZXhpc3RcbiAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgKiBAcGFyYW0gY29uZGl0aW9uXG4gICAqL1xuICBfYXNzZXRGaWVsZChmaWVsZE5hbWU6IHN0cmluZywgY29uZGl0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgQ29uc29sZS5lcnJvcihgJHtmaWVsZE5hbWV9IGRvZXNudCBleGlzdCBpbiBkYXRhc2V0ICR7dGhpcy5pZH1gKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OUyAoTUFJTkxZIEVYUE9SVEVEIEZPUiBURVNULi4uKVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlU3VmZml4QW5kRGVsaW1pdGVycyhsYXllck5hbWUsIHN1ZmZpeCkge1xuICByZXR1cm4gbGF5ZXJOYW1lXG4gICAgLnJlcGxhY2UobmV3IFJlZ0V4cChzdWZmaXgsICdpZycpLCAnJylcbiAgICAucmVwbGFjZSgvW18sLl0rL2csICcgJylcbiAgICAudHJpbSgpO1xufVxuXG4vKipcbiAqIEZpbmQgcG9pbnQgZmllbGRzIHBhaXJzIGZyb20gZmllbGRzXG4gKlxuICogQHBhcmFtIGZpZWxkc1xuICogQHJldHVybnMgZm91bmQgcG9pbnQgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUG9pbnRGaWVsZFBhaXJzKGZpZWxkczogRmllbGRbXSk6IEZpZWxkUGFpcltdIHtcbiAgY29uc3QgYWxsTmFtZXMgPSBmaWVsZHMubWFwKGYgPT4gZi5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuXG4gIC8vIGdldCBsaXN0IG9mIGFsbCBmaWVsZHMgd2l0aCBtYXRjaGluZyBzdWZmaXhlc1xuICBjb25zdCBhY2M6IEZpZWxkUGFpcltdID0gW107XG4gIGNvbnN0IHJlc3VsdCA9IGFsbE5hbWVzLnJlZHVjZSgoY2FycnksIGZpZWxkTmFtZSwgaWR4KSA9PiB7XG4gICAgLy8gVGhpcyBzZWFyY2ggZm9yIHBhaXJzIHdpbGwgZWFybHkgZXhpdCBpZiBmb3VuZC5cbiAgICBmb3IgKGNvbnN0IHN1ZmZpeFBhaXIgb2YgVFJJUF9QT0lOVF9GSUVMRFMpIHtcbiAgICAgIC8vIG1hdGNoIGZpcnN0IHN1ZmZpeGBgYFxuICAgICAgaWYgKGZpZWxkTmFtZS5lbmRzV2l0aChzdWZmaXhQYWlyWzBdKSkge1xuICAgICAgICAvLyBtYXRjaCBzZWNvbmQgc3VmZml4XG4gICAgICAgIGNvbnN0IG90aGVyUGF0dGVybiA9IG5ldyBSZWdFeHAoYCR7c3VmZml4UGFpclswXX1cXCRgKTtcbiAgICAgICAgY29uc3QgcGFydG5lciA9IGZpZWxkTmFtZS5yZXBsYWNlKG90aGVyUGF0dGVybiwgc3VmZml4UGFpclsxXSk7XG5cbiAgICAgICAgY29uc3QgcGFydG5lcklkeCA9IGFsbE5hbWVzLmZpbmRJbmRleChkID0+IGQgPT09IHBhcnRuZXIpO1xuICAgICAgICBpZiAocGFydG5lcklkeCA+IC0xKSB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdE5hbWUgPSByZW1vdmVTdWZmaXhBbmREZWxpbWl0ZXJzKGZpZWxkTmFtZSwgc3VmZml4UGFpclswXSk7XG5cbiAgICAgICAgICBjYXJyeS5wdXNoKHtcbiAgICAgICAgICAgIGRlZmF1bHROYW1lLFxuICAgICAgICAgICAgcGFpcjoge1xuICAgICAgICAgICAgICBsYXQ6IHtcbiAgICAgICAgICAgICAgICBmaWVsZElkeDogaWR4LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZHNbaWR4XS5uYW1lXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGxuZzoge1xuICAgICAgICAgICAgICAgIGZpZWxkSWR4OiBwYXJ0bmVySWR4LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZHNbcGFydG5lcklkeF0ubmFtZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3VmZml4OiBzdWZmaXhQYWlyXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNhcnJ5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYXJyeTtcbiAgfSwgYWNjKTtcblxuICAvLyBwcmlvcml0aXplIHRoZSAnbGF0aXR1ZGUnLydsb25naXR1ZGUnIHBhaXJcbiAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5kZWZhdWx0TmFtZSA9PT0gJycgJiYgYS5zdWZmaXhbMF0gPT09ICdsYXRpdHVkZScpIHJldHVybiAtMTtcbiAgICBpZiAoYi5kZWZhdWx0TmFtZSA9PT0gJycgJiYgYi5zdWZmaXhbMF0gPT09ICdsYXRpdHVkZScpIHJldHVybiAxO1xuICAgIHJldHVybiAwO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gZGF0YXNldFxuICogQHBhcmFtIGNvbHVtblxuICogQHBhcmFtIG1vZGVcbiAqIEB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0RGF0YXNldEJ5Q29sdW1uKFxuICBkYXRhc2V0OiBLZXBsZXJUYWJsZSxcbiAgY29sdW1uOiBzdHJpbmcsXG4gIG1vZGU/OiBzdHJpbmdcbik6IEtlcGxlclRhYmxlIHtcbiAgY29uc3Qge2FsbEluZGV4ZXMsIGZpZWxkcywgZGF0YUNvbnRhaW5lcn0gPSBkYXRhc2V0O1xuICBjb25zdCBmaWVsZEluZGV4ID0gZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gY29sdW1uKTtcbiAgaWYgKGZpZWxkSW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGRhdGFzZXQ7XG4gIH1cblxuICBjb25zdCBzb3J0QnkgPSBTT1JUX09SREVSW21vZGUgfHwgJyddIHx8IFNPUlRfT1JERVIuQVNDRU5ESU5HO1xuXG4gIGlmIChzb3J0QnkgPT09IFNPUlRfT1JERVIuVU5TT1JUKSB7XG4gICAgZGF0YXNldC5zb3J0Q29sdW1uID0ge307XG4gICAgZGF0YXNldC5zb3J0T3JkZXIgPSBudWxsO1xuXG4gICAgcmV0dXJuIGRhdGFzZXQ7XG4gIH1cblxuICBjb25zdCBzb3J0RnVuY3Rpb24gPSBzb3J0QnkgPT09IFNPUlRfT1JERVIuQVNDRU5ESU5HID8gYXNjZW5kaW5nIDogZGVzY2VuZGluZztcbiAgY29uc3Qgc29ydE9yZGVyID0gYWxsSW5kZXhlc1xuICAgIC5zbGljZSgpXG4gICAgLnNvcnQoKGEsIGIpID0+XG4gICAgICBzb3J0RnVuY3Rpb24oZGF0YUNvbnRhaW5lci52YWx1ZUF0KGEsIGZpZWxkSW5kZXgpLCBkYXRhQ29udGFpbmVyLnZhbHVlQXQoYiwgZmllbGRJbmRleCkpXG4gICAgKTtcblxuICBkYXRhc2V0LnNvcnRDb2x1bW4gPSB7XG4gICAgW2NvbHVtbl06IHNvcnRCeVxuICB9O1xuICBkYXRhc2V0LnNvcnRPcmRlciA9IHNvcnRPcmRlcjtcblxuICByZXR1cm4gZGF0YXNldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBpblRhYmxlQ29sdW1ucyhkYXRhc2V0OiBLZXBsZXJUYWJsZSwgY29sdW1uOiBzdHJpbmcpOiBLZXBsZXJUYWJsZSB7XG4gIGNvbnN0IGZpZWxkID0gZGF0YXNldC5nZXRDb2x1bW5GaWVsZChjb2x1bW4pO1xuICBpZiAoIWZpZWxkKSB7XG4gICAgcmV0dXJuIGRhdGFzZXQ7XG4gIH1cblxuICBsZXQgcGlubmVkQ29sdW1ucztcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YXNldC5waW5uZWRDb2x1bW5zKSAmJiBkYXRhc2V0LnBpbm5lZENvbHVtbnMuaW5jbHVkZXMoZmllbGQubmFtZSkpIHtcbiAgICAvLyB1bnBpbiBpdFxuICAgIHBpbm5lZENvbHVtbnMgPSBkYXRhc2V0LnBpbm5lZENvbHVtbnMuZmlsdGVyKGNvID0+IGNvICE9PSBmaWVsZC5uYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBwaW5uZWRDb2x1bW5zID0gKGRhdGFzZXQucGlubmVkQ29sdW1ucyB8fCBbXSkuY29uY2F0KGZpZWxkLm5hbWUpO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gY29weVRhYmxlQW5kVXBkYXRlKGRhdGFzZXQsIHtwaW5uZWRDb2x1bW5zfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29weVRhYmxlPFQgZXh0ZW5kcyB7fT4ob3JpZ2luYWw6IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpKSwgb3JpZ2luYWwpO1xufVxuXG4vKipcbiAqIEB0eXBlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRhYmxlQW5kVXBkYXRlPFQgZXh0ZW5kcyB7fT4ob3JpZ2luYWw6IFQsIG9wdGlvbnM6IFBhcnRpYWw8VD4gPSB7fSk6IFQge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMob3B0aW9ucykucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgYWNjW2VudHJ5WzBdXSA9IGVudHJ5WzFdO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIGNvcHlUYWJsZShvcmlnaW5hbCkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBLZXBsZXJUYWJsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZ0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUdBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGVBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFlBQUEsR0FBQUwsT0FBQTtBQVVBLElBQUFNLFVBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGVBQUEsR0FBQVAsT0FBQTtBQVNBLElBQUFRLG1CQUFBLEdBQUFSLE9BQUE7QUFFQSxJQUFBUyxXQUFBLEdBQUFULE9BQUE7QUFBdUQsU0FBQVUsMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FBQUcsTUFBQSxDQUFBQyxRQUFBLEtBQUFKLENBQUEscUJBQUFFLENBQUEsUUFBQUcsS0FBQSxDQUFBQyxPQUFBLENBQUFOLENBQUEsTUFBQUUsQ0FBQSxHQUFBSywyQkFBQSxDQUFBUCxDQUFBLE1BQUFDLENBQUEsSUFBQUQsQ0FBQSx1QkFBQUEsQ0FBQSxDQUFBUSxNQUFBLElBQUFOLENBQUEsS0FBQUYsQ0FBQSxHQUFBRSxDQUFBLE9BQUFPLEVBQUEsTUFBQUMsQ0FBQSxZQUFBQSxFQUFBLGVBQUFDLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFBLEVBQUEsV0FBQUgsRUFBQSxJQUFBVCxDQUFBLENBQUFRLE1BQUEsS0FBQUssSUFBQSxXQUFBQSxJQUFBLE1BQUFDLEtBQUEsRUFBQWQsQ0FBQSxDQUFBUyxFQUFBLFVBQUFSLENBQUEsV0FBQUEsRUFBQUQsQ0FBQSxVQUFBQSxDQUFBLEtBQUFlLENBQUEsRUFBQUwsQ0FBQSxnQkFBQU0sU0FBQSxpSkFBQUMsQ0FBQSxFQUFBQyxDQUFBLE9BQUFDLENBQUEsZ0JBQUFSLENBQUEsV0FBQUEsRUFBQSxJQUFBVCxDQUFBLEdBQUFBLENBQUEsQ0FBQWtCLElBQUEsQ0FBQXBCLENBQUEsTUFBQVksQ0FBQSxXQUFBQSxFQUFBLFFBQUFaLENBQUEsR0FBQUUsQ0FBQSxDQUFBbUIsSUFBQSxXQUFBSCxDQUFBLEdBQUFsQixDQUFBLENBQUFhLElBQUEsRUFBQWIsQ0FBQSxLQUFBQyxDQUFBLFdBQUFBLEVBQUFELENBQUEsSUFBQW1CLENBQUEsT0FBQUYsQ0FBQSxHQUFBakIsQ0FBQSxLQUFBZSxDQUFBLFdBQUFBLEVBQUEsVUFBQUcsQ0FBQSxZQUFBaEIsQ0FBQSxjQUFBQSxDQUFBLDhCQUFBaUIsQ0FBQSxRQUFBRixDQUFBO0FBQUEsU0FBQVYsNEJBQUFQLENBQUEsRUFBQWtCLENBQUEsUUFBQWxCLENBQUEsMkJBQUFBLENBQUEsU0FBQXNCLGlCQUFBLENBQUF0QixDQUFBLEVBQUFrQixDQUFBLE9BQUFoQixDQUFBLE1BQUFxQixRQUFBLENBQUFILElBQUEsQ0FBQXBCLENBQUEsRUFBQXdCLEtBQUEsNkJBQUF0QixDQUFBLElBQUFGLENBQUEsQ0FBQXlCLFdBQUEsS0FBQXZCLENBQUEsR0FBQUYsQ0FBQSxDQUFBeUIsV0FBQSxDQUFBQyxJQUFBLGFBQUF4QixDQUFBLGNBQUFBLENBQUEsR0FBQUcsS0FBQSxDQUFBc0IsSUFBQSxDQUFBM0IsQ0FBQSxvQkFBQUUsQ0FBQSwrQ0FBQTBCLElBQUEsQ0FBQTFCLENBQUEsSUFBQW9CLGlCQUFBLENBQUF0QixDQUFBLEVBQUFrQixDQUFBO0FBQUEsU0FBQUksa0JBQUF0QixDQUFBLEVBQUFrQixDQUFBLGFBQUFBLENBQUEsSUFBQUEsQ0FBQSxHQUFBbEIsQ0FBQSxDQUFBUSxNQUFBLE1BQUFVLENBQUEsR0FBQWxCLENBQUEsQ0FBQVEsTUFBQSxZQUFBUCxDQUFBLE1BQUFXLENBQUEsR0FBQVAsS0FBQSxDQUFBYSxDQUFBLEdBQUFqQixDQUFBLEdBQUFpQixDQUFBLEVBQUFqQixDQUFBLElBQUFXLENBQUEsQ0FBQVgsQ0FBQSxJQUFBRCxDQUFBLENBQUFDLENBQUEsVUFBQVcsQ0FBQTtBQUFBLFNBQUFpQixRQUFBNUIsQ0FBQSxFQUFBRCxDQUFBLFFBQUFFLENBQUEsR0FBQTRCLE1BQUEsQ0FBQUMsSUFBQSxDQUFBOUIsQ0FBQSxPQUFBNkIsTUFBQSxDQUFBRSxxQkFBQSxRQUFBZixDQUFBLEdBQUFhLE1BQUEsQ0FBQUUscUJBQUEsQ0FBQS9CLENBQUEsR0FBQUQsQ0FBQSxLQUFBaUIsQ0FBQSxHQUFBQSxDQUFBLENBQUFnQixNQUFBLFdBQUFqQyxDQUFBLFdBQUE4QixNQUFBLENBQUFJLHdCQUFBLENBQUFqQyxDQUFBLEVBQUFELENBQUEsRUFBQW1DLFVBQUEsT0FBQWpDLENBQUEsQ0FBQWtDLElBQUEsQ0FBQUMsS0FBQSxDQUFBbkMsQ0FBQSxFQUFBZSxDQUFBLFlBQUFmLENBQUE7QUFBQSxTQUFBb0MsY0FBQXJDLENBQUEsYUFBQUQsQ0FBQSxNQUFBQSxDQUFBLEdBQUF1QyxTQUFBLENBQUEvQixNQUFBLEVBQUFSLENBQUEsVUFBQUUsQ0FBQSxXQUFBcUMsU0FBQSxDQUFBdkMsQ0FBQSxJQUFBdUMsU0FBQSxDQUFBdkMsQ0FBQSxRQUFBQSxDQUFBLE9BQUE2QixPQUFBLENBQUFDLE1BQUEsQ0FBQTVCLENBQUEsT0FBQXNDLE9BQUEsV0FBQXhDLENBQUEsUUFBQXlDLGdCQUFBLGFBQUF4QyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxDQUFBRixDQUFBLFNBQUE4QixNQUFBLENBQUFZLHlCQUFBLEdBQUFaLE1BQUEsQ0FBQWEsZ0JBQUEsQ0FBQTFDLENBQUEsRUFBQTZCLE1BQUEsQ0FBQVkseUJBQUEsQ0FBQXhDLENBQUEsS0FBQTJCLE9BQUEsQ0FBQUMsTUFBQSxDQUFBNUIsQ0FBQSxHQUFBc0MsT0FBQSxXQUFBeEMsQ0FBQSxJQUFBOEIsTUFBQSxDQUFBYyxjQUFBLENBQUEzQyxDQUFBLEVBQUFELENBQUEsRUFBQThCLE1BQUEsQ0FBQUksd0JBQUEsQ0FBQWhDLENBQUEsRUFBQUYsQ0FBQSxpQkFBQUMsQ0FBQSxJQWpEdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQWtGQTtBQUNBLElBQU00QyxPQUFPLEdBQUcsTUFBTTtBQUFDLElBRWpCQyxXQUFXO0VBT2Y7O0VBZUE7O0VBU0E7O0VBR0EsU0FBQUEsWUFBQUMsSUFBQSxFQVlHO0lBQUEsSUFBQUMsU0FBQSxHQUFBRCxJQUFBLENBWERFLElBQUk7TUFBSkEsSUFBSSxHQUFBRCxTQUFBLGNBQUcsQ0FBQyxDQUFDLEdBQUFBLFNBQUE7TUFDVEUsSUFBSSxHQUFBSCxJQUFBLENBQUpHLElBQUk7TUFDSkMsS0FBSyxHQUFBSixJQUFBLENBQUxJLEtBQUs7TUFDTEMsUUFBUSxHQUFBTCxJQUFBLENBQVJLLFFBQVE7TUFDUkMsb0JBQW9CLEdBQUFOLElBQUEsQ0FBcEJNLG9CQUFvQjtJQUFBLElBQUFDLGdCQUFBLG1CQUFBUixXQUFBO0lBUXBCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7O0lBRUE7SUFDQSxJQUFNUyxhQUFhLEdBQUcsSUFBQUMsdUNBQW1CLEVBQUNOLElBQUksQ0FBQ08sSUFBSSxFQUFFO01BQUNDLE1BQU0sRUFBRVIsSUFBSSxDQUFDUTtJQUFNLENBQUMsQ0FBQztJQUUzRSxJQUFNQyxXQUFXLEdBQUFyQixhQUFBO01BQ2ZzQixFQUFFLEVBQUUsSUFBQUMscUJBQWMsRUFBQyxDQUFDLENBQUM7TUFDckJDLEtBQUssRUFBRTtJQUFhLEdBQ2hCYixJQUFJLElBQUksQ0FBQyxDQUFDLENBQ2Y7SUFDRCxJQUFNYyxNQUFNLEdBQUdKLFdBQVcsQ0FBQ0MsRUFBRTtJQUM3QjtJQUNBLElBQU1GLE1BQWUsR0FBR1IsSUFBSSxDQUFDUSxNQUFNLENBQUNNLEdBQUcsQ0FBQyxVQUFDakQsQ0FBQyxFQUFFa0QsQ0FBQztNQUFBLE9BQUEzQixhQUFBLENBQUFBLGFBQUEsS0FDeEN2QixDQUFDO1FBQ0ptRCxRQUFRLEVBQUVELENBQUM7UUFDWEwsRUFBRSxFQUFFN0MsQ0FBQyxDQUFDVyxJQUFJO1FBQ1Z5QyxXQUFXLEVBQUVwRCxDQUFDLENBQUNvRCxXQUFXLElBQUlwRCxDQUFDLENBQUNXLElBQUk7UUFDcEMwQyxhQUFhLEVBQUVDLHNCQUFXLENBQUNDLElBQUksQ0FDN0IsSUFBSTtRQUNKO1FBQ0F2RCxDQUFDLENBQUN3RCxJQUFJLEtBQUtDLGdDQUFlLENBQUNDLFNBQVMsSUFBSTFELENBQUMsQ0FBQ3dELElBQUksS0FBS0MsZ0NBQWUsQ0FBQ0UsSUFBSSxFQUN2RVQsQ0FBQyxFQUNEbEQsQ0FBQyxDQUFDNEQsTUFBTSxFQUNScEIsYUFDRjtNQUFDO0lBQUEsQ0FDRCxDQUFDO0lBRUgsSUFBTXFCLFVBQVUsR0FBR3JCLGFBQWEsQ0FBQ3NCLGFBQWEsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQ2pCLEVBQUUsR0FBR0QsV0FBVyxDQUFDQyxFQUFFO0lBQ3hCLElBQUksQ0FBQ0UsS0FBSyxHQUFHSCxXQUFXLENBQUNHLEtBQUs7SUFDOUIsSUFBSSxDQUFDWCxLQUFLLEdBQUdBLEtBQUs7SUFDbEIsSUFBSSxDQUFDQyxRQUFRLEdBQUFkLGFBQUEsQ0FBQUEsYUFBQSxLQUNSYyxRQUFRO01BQ1hRLEVBQUUsRUFBRUQsV0FBVyxDQUFDQyxFQUFFO01BQ2xCRSxLQUFLLEVBQUVILFdBQVcsQ0FBQ0c7SUFBSyxFQUN6QjtJQUVELElBQUksQ0FBQ1AsYUFBYSxHQUFHQSxhQUFhO0lBQ2xDLElBQUksQ0FBQ3FCLFVBQVUsR0FBR0EsVUFBVTtJQUM1QixJQUFJLENBQUNFLGFBQWEsR0FBR0YsVUFBVTtJQUMvQixJQUFJLENBQUNHLHNCQUFzQixHQUFHSCxVQUFVO0lBQ3hDLElBQUksQ0FBQ0ksVUFBVSxHQUFHQyxtQkFBbUIsQ0FBQ3ZCLE1BQU0sQ0FBQztJQUM3QyxJQUFJLENBQUNBLE1BQU0sR0FBR0EsTUFBTTtJQUNwQixJQUFJLENBQUN3QixTQUFTLEdBQUcsSUFBQUMsaUNBQWlCLEVBQUMsRUFBRSxFQUFFcEIsTUFBTSxFQUFFTCxNQUFNLENBQUM7SUFDdEQsSUFBSUwsb0JBQW9CLEVBQUU7TUFDeEIsSUFBSSxDQUFDQSxvQkFBb0IsR0FBR0Esb0JBQW9CO0lBQ2xEO0VBQ0Y7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7RUFIRSxXQUFBK0IsYUFBQSxhQUFBdEMsV0FBQTtJQUFBdUMsR0FBQTtJQUFBdkUsS0FBQSxFQUlBLFNBQUF3RSxjQUFjQSxDQUFDQyxVQUFrQixFQUFxQjtNQUNwRCxJQUFNQyxLQUFLLEdBQUcsSUFBSSxDQUFDOUIsTUFBTSxDQUFDK0IsSUFBSSxDQUFDLFVBQUFDLEVBQUU7UUFBQSxPQUFJQSxFQUFFLENBQUM3QyxPQUFPLENBQUMsS0FBSzBDLFVBQVU7TUFBQSxFQUFDO01BQ2hFLElBQUksQ0FBQ0ksV0FBVyxDQUFDSixVQUFVLEVBQUVDLEtBQUssQ0FBQztNQUNuQyxPQUFPQSxLQUFLO0lBQ2Q7O0lBRUE7QUFDRjtBQUNBO0FBQ0E7RUFIRTtJQUFBSCxHQUFBO0lBQUF2RSxLQUFBLEVBSUEsU0FBQThFLGlCQUFpQkEsQ0FBQ0wsVUFBa0IsRUFBVTtNQUM1QyxJQUFNckIsUUFBUSxHQUFHLElBQUksQ0FBQ1IsTUFBTSxDQUFDbUMsU0FBUyxDQUFDLFVBQUFILEVBQUU7UUFBQSxPQUFJQSxFQUFFLENBQUM3QyxPQUFPLENBQUMsS0FBSzBDLFVBQVU7TUFBQSxFQUFDO01BQ3hFLElBQUksQ0FBQ0ksV0FBVyxDQUFDSixVQUFVLEVBQUVPLE9BQU8sQ0FBQzVCLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3BELE9BQU9BLFFBQVE7SUFDakI7O0lBRUE7QUFDRjtBQUNBO0VBRkU7SUFBQW1CLEdBQUE7SUFBQXZFLEtBQUEsRUFHQSxTQUFBaUYsUUFBUUEsQ0FBQ1IsVUFBa0IsRUFBRVMsTUFBYyxFQUFPO01BQ2hELElBQU1SLEtBQUssR0FBRyxJQUFJLENBQUNGLGNBQWMsQ0FBQ0MsVUFBVSxDQUFDO01BQzdDLE9BQU9DLEtBQUssR0FBR0EsS0FBSyxDQUFDcEIsYUFBYSxDQUFDO1FBQUM2QixLQUFLLEVBQUVEO01BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSTtJQUM1RDs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBSkU7SUFBQVgsR0FBQTtJQUFBdkUsS0FBQSxFQUtBLFNBQUFvRixpQkFBaUJBLENBQUNoQyxRQUFnQixFQUFFaUMsUUFBZSxFQUFRO01BQ3pELElBQUksQ0FBQ3pDLE1BQU0sR0FBRzVCLE1BQU0sQ0FBQ3NFLE1BQU0sS0FBQUMsbUJBQUEsYUFBSyxJQUFJLENBQUMzQyxNQUFNLE9BQUFqQixnQkFBQSxpQkFBS3lCLFFBQVEsRUFBR2lDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZFOztJQUVBO0FBQ0Y7QUFDQTtBQUNBO0VBSEU7SUFBQWQsR0FBQTtJQUFBdkUsS0FBQSxFQUlBLFNBQUF3RixnQkFBZ0JBLENBQUNDLFFBQWtCLEVBQVE7TUFDekMsSUFBSSxDQUFDcEQsS0FBSyxHQUFHb0QsUUFBUTtJQUN2Qjs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtFQUhFO0lBQUFsQixHQUFBO0lBQUF2RSxLQUFBLEVBSUEsU0FBQTBGLG9CQUFvQkEsQ0FBQ2pCLFVBQWtCLEVBQTJDO01BQ2hGLElBQU1yQixRQUFRLEdBQUcsSUFBSSxDQUFDMEIsaUJBQWlCLENBQUNMLFVBQVUsQ0FBQztNQUNuRCxJQUFJckIsUUFBUSxHQUFHLENBQUMsRUFBRTtRQUNoQixPQUFPLElBQUk7TUFDYjtNQUNBLElBQU1zQixLQUFLLEdBQUcsSUFBSSxDQUFDOUIsTUFBTSxDQUFDUSxRQUFRLENBQUM7TUFDbkMsSUFBSXNCLEtBQUssQ0FBQ2lCLGNBQWMsQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUN2QyxPQUFPakIsS0FBSyxDQUFDa0IsV0FBVztNQUMxQjtNQUVBLElBQU1DLFdBQVcsR0FBRyxJQUFJLENBQUNDLHFCQUFxQixDQUFDcEIsS0FBSyxDQUFDO01BQ3JELElBQUksQ0FBQ21CLFdBQVcsRUFBRTtRQUNoQixPQUFPLElBQUk7TUFDYjtNQUVBLElBQU1ELFdBQVcsR0FBRyxJQUFBRywyQkFBYyxFQUFDckIsS0FBSyxFQUFFbUIsV0FBVyxDQUFDO01BQ3RELElBQU1SLFFBQVEsR0FBQTdELGFBQUEsQ0FBQUEsYUFBQSxLQUNUa0QsS0FBSztRQUNSa0IsV0FBVyxFQUFYQTtNQUFXLEVBQ1o7TUFFRCxJQUFJLENBQUNSLGlCQUFpQixDQUFDaEMsUUFBUSxFQUFFaUMsUUFBUSxDQUFDO01BRTFDLE9BQU9PLFdBQVc7SUFDcEI7O0lBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEU7SUFBQXJCLEdBQUE7SUFBQXZFLEtBQUEsRUFNQSxTQUFBZ0csV0FBV0EsQ0FBQ0MsT0FBaUIsRUFBRUMsTUFBZSxFQUFFQyxHQUFzQixFQUFlO01BQUEsSUFBQUMsS0FBQTtNQUNuRixJQUFPM0QsYUFBYSxHQUF1RCxJQUFJLENBQXhFQSxhQUFhO1FBQU1RLE1BQU0sR0FBMkMsSUFBSSxDQUF6REgsRUFBRTtRQUF3QnVELGVBQWUsR0FBWSxJQUFJLENBQTdDQyxZQUFZO1FBQW1CMUQsTUFBTSxHQUFJLElBQUksQ0FBZEEsTUFBTTs7TUFFdkU7TUFDQSxJQUFNMEQsWUFBWSxHQUFHLElBQUFDLDRCQUFlLEVBQUN0RCxNQUFNLEVBQUVnRCxPQUFPLEVBQUVFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztNQUVoRSxJQUFJLENBQUNHLFlBQVksR0FBR0EsWUFBWTtNQUNoQyxJQUFJLENBQUNsQyxTQUFTLEdBQUcsSUFBQUMsaUNBQWlCLEVBQUM0QixPQUFPLEVBQUVoRCxNQUFNLEVBQUVMLE1BQU0sQ0FBQzs7TUFFM0Q7O01BRUEsSUFBSSxDQUFDcUQsT0FBTyxDQUFDdkcsTUFBTSxFQUFFO1FBQ25CLElBQUksQ0FBQ3NFLGFBQWEsR0FBRyxJQUFJLENBQUNGLFVBQVU7UUFDcEMsSUFBSSxDQUFDRyxzQkFBc0IsR0FBRyxJQUFJLENBQUNILFVBQVU7UUFDN0MsT0FBTyxJQUFJO01BQ2I7TUFFQSxJQUFJLENBQUMwQyxjQUFjLEdBQUcsSUFBQUMsd0JBQVcsRUFBQ0gsWUFBWSxFQUFFRCxlQUFlLENBQUM7O01BRWhFO01BQ0E7TUFDQTtNQUNBLElBQU1LLGVBQWUsR0FBRzFCLE9BQU8sQ0FBQyxJQUFJLENBQUN3QixjQUFjLENBQUNHLGFBQWEsQ0FBQztNQUNsRSxJQUFNQyxjQUFjLEdBQUc1QixPQUFPLENBQUMsSUFBSSxDQUFDd0IsY0FBYyxDQUFDSyxHQUFHLENBQUM7TUFFdkQsSUFBSUMsWUFBMEIsR0FBRyxDQUFDLENBQUM7TUFDbkMsSUFBSUosZUFBZSxJQUFJRSxjQUFjLEVBQUU7UUFDckMsSUFBTUcsb0JBQW9CLEdBQUdMLGVBQWUsR0FBR0osWUFBWSxDQUFDSyxhQUFhLEdBQUcsSUFBSTtRQUNoRixJQUFNSyxVQUFVLEdBQUdKLGNBQWMsR0FBR04sWUFBWSxDQUFDTyxHQUFHLEdBQUcsSUFBSTtRQUUzRCxJQUFNSSxXQUFXLEdBQUdoQixPQUFPLENBQUNpQixNQUFNLENBQUMsVUFBQ0MsR0FBRyxFQUFFaEcsTUFBTSxFQUFLO1VBQ2xELElBQU1pRyxVQUFVLEdBQUcsSUFBQUMsNkNBQTZCLEVBQUNqQixLQUFJLENBQUN0RCxFQUFFLEVBQUUzQixNQUFNLENBQUM7VUFDakUsSUFBTXVELEtBQUssR0FBRzBDLFVBQVUsS0FBSyxDQUFDLENBQUMsR0FBR3hFLE1BQU0sQ0FBQ3dFLFVBQVUsQ0FBQyxHQUFHLElBQUk7VUFFM0QsT0FBQTVGLGFBQUEsQ0FBQUEsYUFBQSxLQUNLMkYsR0FBRyxXQUFBeEYsZ0JBQUEsaUJBQ0xSLE1BQU0sQ0FBQzJCLEVBQUUsRUFBRyxJQUFBd0UsOEJBQWlCLEVBQUM1QyxLQUFLLEVBQUUwQixLQUFJLENBQUN0RCxFQUFFLEVBQUUzQixNQUFNLEVBQUUrRSxNQUFNLEVBQUV6RCxhQUFhLENBQUM7UUFFakYsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRU5xRSxZQUFZLEdBQUcsSUFBQVMsb0NBQXVCLEVBQ3BDO1VBQUNSLG9CQUFvQixFQUFwQkEsb0JBQW9CO1VBQUVDLFVBQVUsRUFBVkEsVUFBVTtVQUFFQyxXQUFXLEVBQVhBO1FBQVcsQ0FBQyxFQUMvQ3hFLGFBQ0YsQ0FBQztNQUNIO01BRUEsSUFBSSxDQUFDdUIsYUFBYSxHQUFHOEMsWUFBWSxDQUFDOUMsYUFBYSxJQUFJLElBQUksQ0FBQ0EsYUFBYTtNQUNyRSxJQUFJLENBQUNDLHNCQUFzQixHQUN6QjZDLFlBQVksQ0FBQzdDLHNCQUFzQixJQUFJLElBQUksQ0FBQ0Esc0JBQXNCO01BRXBFLE9BQU8sSUFBSTtJQUNiOztJQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFKRTtJQUFBTSxHQUFBO0lBQUF2RSxLQUFBLEVBS0EsU0FBQXdILGNBQWNBLENBQUN2QixPQUFpQixFQUFFQyxNQUFlLEVBQWU7TUFDOUQsSUFBTUMsR0FBRyxHQUFHO1FBQ1ZzQixPQUFPLEVBQUUsSUFBSTtRQUNiQyxZQUFZLEVBQUU7TUFDaEIsQ0FBQzs7TUFFRDtNQUNBLElBQUksQ0FBQ3pCLE9BQU8sQ0FBQ3ZHLE1BQU0sRUFBRTtRQUNuQixJQUFJLENBQUNpSSxjQUFjLEdBQUcsSUFBSSxDQUFDN0QsVUFBVTtRQUNyQyxJQUFJLENBQUM4RCxlQUFlLEdBQUcsSUFBQXJCLDRCQUFlLEVBQUMsSUFBSSxDQUFDekQsRUFBRSxFQUFFbUQsT0FBTyxFQUFFRSxHQUFHLENBQUM7UUFDN0QsT0FBTyxJQUFJO01BQ2I7O01BRUE7TUFDQSxJQUFJLENBQUNGLE9BQU8sQ0FBQ3RCLElBQUksQ0FBQyxVQUFBMUUsQ0FBQztRQUFBLE9BQUlBLENBQUMsQ0FBQzRILEdBQUc7TUFBQSxFQUFDLEVBQUU7UUFDN0IsSUFBSSxDQUFDRixjQUFjLEdBQUcsSUFBSSxDQUFDM0QsYUFBYTtRQUN4QyxJQUFJLENBQUM0RCxlQUFlLEdBQUcsSUFBQXJCLDRCQUFlLEVBQUMsSUFBSSxDQUFDekQsRUFBRSxFQUFFbUQsT0FBTyxFQUFFRSxHQUFHLENBQUM7UUFDN0QsT0FBTyxJQUFJO01BQ2I7O01BRUE7TUFDQSxJQUFNMkIsTUFBTSxHQUFHQyxTQUFTLENBQUMsSUFBSSxDQUFDO01BRTlCRCxNQUFNLENBQUN4QixZQUFZLEdBQUcsSUFBSSxDQUFDc0IsZUFBZTtNQUMxQ0UsTUFBTSxDQUFDOUQsYUFBYSxHQUFHLElBQUksQ0FBQzJELGNBQWMsSUFBSSxFQUFFO01BRWhELElBQU1LLFFBQVEsR0FBR0YsTUFBTSxDQUFDOUIsV0FBVyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsR0FBRyxDQUFDO01BRXpELElBQUksQ0FBQ3dCLGNBQWMsR0FBR0ssUUFBUSxDQUFDaEUsYUFBYTtNQUM1QyxJQUFJLENBQUM0RCxlQUFlLEdBQUdJLFFBQVEsQ0FBQzFCLFlBQVk7TUFFNUMsT0FBTyxJQUFJO0lBQ2I7O0lBRUE7QUFDRjtBQUNBO0FBQ0E7RUFIRTtJQUFBL0IsR0FBQTtJQUFBdkUsS0FBQSxFQUlBLFNBQUE4RixxQkFBcUJBLENBQUNwQixLQUFZLEVBQWU7TUFDL0MsSUFBT2pDLGFBQWEsR0FBSSxJQUFJLENBQXJCQSxhQUFhO01BQ3BCLElBQU9hLGFBQWEsR0FBSW9CLEtBQUssQ0FBdEJwQixhQUFhO01BRXBCLElBQUkyRSxNQUFNO01BRVYsUUFBUXZELEtBQUssQ0FBQ2pCLElBQUk7UUFDaEIsS0FBS0MsZ0NBQWUsQ0FBQ3dFLElBQUk7UUFDekIsS0FBS3hFLGdDQUFlLENBQUN5RSxPQUFPO1VBQzFCO1VBQ0EsT0FBTyxJQUFBQyxrQ0FBcUIsRUFBQzNGLGFBQWEsRUFBRWEsYUFBYSxDQUFDO1FBRTVELEtBQUtJLGdDQUFlLFdBQVE7VUFDMUIsT0FBTztZQUFDdUUsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUs7VUFBQyxDQUFDO1FBRWhDLEtBQUt2RSxnQ0FBZSxDQUFDMkUsTUFBTTtRQUMzQixLQUFLM0UsZ0NBQWUsQ0FBQ0UsSUFBSTtVQUN2QnFFLE1BQU0sR0FBRyxJQUFBSyxnQ0FBZ0IsRUFBQzdGLGFBQWEsRUFBRWEsYUFBYSxDQUFDO1VBQ3ZELE9BQU87WUFBQzJFLE1BQU0sRUFBTkE7VUFBTSxDQUFDO1FBRWpCLEtBQUt2RSxnQ0FBZSxDQUFDQyxTQUFTO1VBQzVCLE9BQU8sSUFBQTRFLG9DQUF1QixFQUFDOUYsYUFBYSxFQUFFYSxhQUFhLENBQUM7UUFFOUQ7VUFDRSxPQUFPO1lBQUMyRSxNQUFNLEVBQUUsSUFBQUssZ0NBQWdCLEVBQUM3RixhQUFhLEVBQUVhLGFBQWE7VUFBQyxDQUFDO01BQ25FO0lBQ0Y7O0lBRUE7QUFDRjtBQUNBO0VBRkU7SUFBQWlCLEdBQUE7SUFBQXZFLEtBQUEsRUFHQSxTQUFBd0ksb0JBQW9CQSxDQUNsQjlELEtBQVksRUFDWitELFNBQWlCLEVBQzhCO01BQy9DLElBQU9oRyxhQUFhLEdBQTRCLElBQUksQ0FBN0NBLGFBQWE7UUFBRXdCLHNCQUFzQixHQUFJLElBQUksQ0FBOUJBLHNCQUFzQjtNQUU1QyxJQUFJLENBQUN5RSw0QkFBVyxDQUFDRCxTQUFTLENBQUMsRUFBRTtRQUMzQkUsZ0JBQU8sQ0FBQ0MsS0FBSyxlQUFBQyxNQUFBLENBQWVKLFNBQVMsbUJBQWdCLENBQUM7UUFDdEQsT0FBTyxJQUFJO01BQ2I7TUFFQSxJQUFPbkYsYUFBYSxHQUFJb0IsS0FBSyxDQUF0QnBCLGFBQWE7TUFDcEIsSUFBTXdGLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBa0JBLENBQUczRixDQUFDO1FBQUEsT0FBSUcsYUFBYSxDQUFDO1VBQUM2QixLQUFLLEVBQUVoQztRQUFDLENBQUMsQ0FBQztNQUFBO01BQ3pELElBQU00RixZQUFZLEdBQUcsSUFBQUMsNkJBQWtCLEVBQUN0RSxLQUFLLENBQUNqQixJQUFJLENBQUM7TUFFbkQsUUFBUWdGLFNBQVM7UUFDZixLQUFLQyw0QkFBVyxDQUFDTyxPQUFPO1FBQ3hCLEtBQUtQLDRCQUFXLENBQUNRLEtBQUs7VUFDcEI7VUFDQTtVQUNBLE9BQU8sSUFBQVosZ0NBQWdCLEVBQUM3RixhQUFhLEVBQUVhLGFBQWEsQ0FBQztRQUV2RCxLQUFLb0YsNEJBQVcsQ0FBQ1MsUUFBUTtVQUN2QixPQUFPLElBQUFDLGlDQUFpQixFQUFDbkYsc0JBQXNCLEVBQUU2RSxrQkFBa0IsRUFBRUMsWUFBWSxDQUFDO1FBRXBGLEtBQUtMLDRCQUFXLENBQUNXLEdBQUc7VUFDbEIsT0FBTyxJQUFBQyw0QkFBWSxFQUFDckYsc0JBQXNCLEVBQUU2RSxrQkFBa0IsQ0FBQztRQUVqRSxLQUFLSiw0QkFBVyxDQUFDYSxRQUFRO1FBQ3pCLEtBQUtiLDRCQUFXLENBQUNjLE1BQU07UUFDdkIsS0FBS2QsNEJBQVcsQ0FBQ2UsSUFBSTtRQUNyQjtVQUNFLE9BQU8sSUFBQUMsK0JBQWUsRUFBQ3pGLHNCQUFzQixFQUFFNkUsa0JBQWtCLENBQUM7TUFDdEU7SUFDRjtFQUFDO0lBQUF2RSxHQUFBO0lBQUF2RSxLQUFBLEVBRUQsU0FBQTJKLGVBQWVBLENBQUNDLFNBQVMsRUFBRUMsVUFBVSxFQUFFO01BQ3JDLElBQU1DLDRCQUE0QixHQUFHLEVBQUU7TUFDdkMsSUFBTUMsVUFBVSxHQUFHLElBQUksQ0FBQ3RILGFBQWEsQ0FBQ3VILFFBQVEsQ0FBQ0osU0FBUyxDQUFDdEcsYUFBYSxDQUFDO01BQ3ZFLElBQU0yRyxXQUFXLEdBQUcsSUFBSSxDQUFDeEgsYUFBYSxDQUFDdUgsUUFBUSxDQUFDSCxVQUFVLENBQUN2RyxhQUFhLENBQUM7TUFFekUsSUFBTTRHLE9BQU8sR0FBR0gsVUFBVSxDQUFDN0MsTUFBTSxDQUFDLFVBQUNpRCxRQUFRLEVBQUVDLE9BQU8sRUFBRUMsR0FBRyxFQUFLO1FBQzVERixRQUFRLENBQUM3SSxJQUFJLENBQUMsQ0FBQzhJLE9BQU8sRUFBRUgsV0FBVyxDQUFDSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU9GLFFBQVE7TUFDakIsQ0FBQyxFQUFFLEVBQUUsQ0FBQztNQUVOLE9BQU8sSUFBQUcsc0NBQTJCLEVBQUNKLE9BQU8sQ0FBQyxDQUN4Q2hILEdBQUcsQ0FBQyxVQUFBcUgsR0FBRyxFQUFJO1FBQ1YsT0FBTztVQUNMdkgsS0FBSyxFQUFFdUgsR0FBRyxDQUFDQyxJQUFJO1VBQ2ZuSSxLQUFLLEVBQUUsSUFBQW9JLGdDQUFvQixFQUFDRixHQUFHLENBQUNHLEtBQUs7UUFDdkMsQ0FBQztNQUNILENBQUMsQ0FBQyxDQUNEaEssS0FBSyxDQUFDLENBQUMsRUFBRW9KLDRCQUE0QixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQ7O0lBRUE7QUFDRjtBQUNBO0lBQ0U7O0lBRUE7QUFDRjtBQUNBO0FBQ0E7SUFDRTs7SUFFQTs7SUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBSkU7SUFBQXZGLEdBQUE7SUFBQXZFLEtBQUEsRUFLQSxTQUFBNkUsV0FBV0EsQ0FBQzhGLFNBQWlCLEVBQUVDLFNBQWMsRUFBUTtNQUNuRCxJQUFJLENBQUNBLFNBQVMsRUFBRTtRQUNkakMsZ0JBQU8sQ0FBQ0MsS0FBSyxJQUFBQyxNQUFBLENBQUk4QixTQUFTLCtCQUFBOUIsTUFBQSxDQUE0QixJQUFJLENBQUMvRixFQUFFLENBQUUsQ0FBQztNQUNsRTtJQUNGO0VBQUM7QUFBQSxLQUdIO0FBRU8sU0FBUytILHlCQUF5QkEsQ0FBQ0MsU0FBUyxFQUFFQyxNQUFNLEVBQUU7RUFDM0QsT0FBT0QsU0FBUyxDQUNiRSxPQUFPLENBQUMsSUFBSUMsTUFBTSxDQUFDRixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ3JDQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUN2QkUsSUFBSSxDQUFDLENBQUM7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTL0csbUJBQW1CQSxDQUFDdkIsTUFBZSxFQUFlO0VBQ2hFLElBQU11SSxRQUFRLEdBQUd2SSxNQUFNLENBQUNNLEdBQUcsQ0FBQyxVQUFBakQsQ0FBQztJQUFBLE9BQUlBLENBQUMsQ0FBQ1csSUFBSSxDQUFDd0ssV0FBVyxDQUFDLENBQUM7RUFBQSxFQUFDOztFQUV0RDtFQUNBLElBQU1qRSxHQUFnQixHQUFHLEVBQUU7RUFDM0IsSUFBTWtFLE1BQU0sR0FBR0YsUUFBUSxDQUFDakUsTUFBTSxDQUFDLFVBQUNvRSxLQUFLLEVBQUVYLFNBQVMsRUFBRU4sR0FBRyxFQUFLO0lBQ3hEO0lBQUEsSUFBQWtCLFNBQUEsR0FBQXRNLDBCQUFBLENBQ3lCdU0sa0NBQWlCO01BQUFDLEtBQUE7SUFBQTtNQUFBLElBQUFDLEtBQUEsWUFBQUEsTUFBQSxFQUFFO1VBQUEsSUFBakNDLFVBQVUsR0FBQUYsS0FBQSxDQUFBekwsS0FBQTtVQUNuQjtVQUNBLElBQUkySyxTQUFTLENBQUNpQixRQUFRLENBQUNELFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3JDO1lBQ0EsSUFBTUUsWUFBWSxHQUFHLElBQUlaLE1BQU0sSUFBQXBDLE1BQUEsQ0FBSThDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBSSxDQUFDO1lBQ3JELElBQU1HLE9BQU8sR0FBR25CLFNBQVMsQ0FBQ0ssT0FBTyxDQUFDYSxZQUFZLEVBQUVGLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU5RCxJQUFNSSxVQUFVLEdBQUdaLFFBQVEsQ0FBQ3BHLFNBQVMsQ0FBQyxVQUFBaUgsQ0FBQztjQUFBLE9BQUlBLENBQUMsS0FBS0YsT0FBTztZQUFBLEVBQUM7WUFDekQsSUFBSUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFO2NBQ25CLElBQU1FLFdBQVcsR0FBR3BCLHlCQUF5QixDQUFDRixTQUFTLEVBQUVnQixVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Y0FFdkVMLEtBQUssQ0FBQ2hLLElBQUksQ0FBQztnQkFDVDJLLFdBQVcsRUFBWEEsV0FBVztnQkFDWEMsSUFBSSxFQUFFO2tCQUNKQyxHQUFHLEVBQUU7b0JBQ0gvSSxRQUFRLEVBQUVpSCxHQUFHO29CQUNickssS0FBSyxFQUFFNEMsTUFBTSxDQUFDeUgsR0FBRyxDQUFDLENBQUN6SjtrQkFDckIsQ0FBQztrQkFDRHdMLEdBQUcsRUFBRTtvQkFDSGhKLFFBQVEsRUFBRTJJLFVBQVU7b0JBQ3BCL0wsS0FBSyxFQUFFNEMsTUFBTSxDQUFDbUosVUFBVSxDQUFDLENBQUNuTDtrQkFDNUI7Z0JBQ0YsQ0FBQztnQkFDRG1LLE1BQU0sRUFBRVk7Y0FDVixDQUFDLENBQUM7Y0FBQztnQkFBQVUsQ0FBQSxFQUNJZjtjQUFLO1lBQ2Q7VUFDRjtRQUNGLENBQUM7UUFBQWdCLElBQUE7TUE1QkQsS0FBQWYsU0FBQSxDQUFBMUwsQ0FBQSxNQUFBNEwsS0FBQSxHQUFBRixTQUFBLENBQUF6TCxDQUFBLElBQUFDLElBQUE7UUFBQXVNLElBQUEsR0FBQVosS0FBQTtRQUFBLElBQUFZLElBQUEsU0FBQUEsSUFBQSxDQUFBRCxDQUFBO01BQUE7SUE0QkMsU0FBQUUsR0FBQTtNQUFBaEIsU0FBQSxDQUFBcE0sQ0FBQSxDQUFBb04sR0FBQTtJQUFBO01BQUFoQixTQUFBLENBQUF0TCxDQUFBO0lBQUE7SUFDRCxPQUFPcUwsS0FBSztFQUNkLENBQUMsRUFBRW5FLEdBQUcsQ0FBQzs7RUFFUDtFQUNBa0UsTUFBTSxDQUFDbUIsSUFBSSxDQUFDLFVBQUNwTSxDQUFDLEVBQUVxTSxDQUFDLEVBQUs7SUFDcEIsSUFBSXJNLENBQUMsQ0FBQzZMLFdBQVcsS0FBSyxFQUFFLElBQUk3TCxDQUFDLENBQUMySyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pFLElBQUkwQixDQUFDLENBQUNSLFdBQVcsS0FBSyxFQUFFLElBQUlRLENBQUMsQ0FBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLEVBQUUsT0FBTyxDQUFDO0lBQ2hFLE9BQU8sQ0FBQztFQUNWLENBQUMsQ0FBQztFQUVGLE9BQU9NLE1BQU07QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNxQixtQkFBbUJBLENBQ2pDQyxPQUFvQixFQUNwQkMsTUFBYyxFQUNkQyxJQUFhLEVBQ0E7RUFDYixJQUFPL0ksVUFBVSxHQUEyQjZJLE9BQU8sQ0FBNUM3SSxVQUFVO0lBQUVsQixNQUFNLEdBQW1CK0osT0FBTyxDQUFoQy9KLE1BQU07SUFBRUgsYUFBYSxHQUFJa0ssT0FBTyxDQUF4QmxLLGFBQWE7RUFDeEMsSUFBTTJFLFVBQVUsR0FBR3hFLE1BQU0sQ0FBQ21DLFNBQVMsQ0FBQyxVQUFBOUUsQ0FBQztJQUFBLE9BQUlBLENBQUMsQ0FBQ1csSUFBSSxLQUFLZ00sTUFBTTtFQUFBLEVBQUM7RUFDM0QsSUFBSXhGLFVBQVUsR0FBRyxDQUFDLEVBQUU7SUFDbEIsT0FBT3VGLE9BQU87RUFDaEI7RUFFQSxJQUFNRyxNQUFNLEdBQUdDLDJCQUFVLENBQUNGLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSUUsMkJBQVUsQ0FBQ0MsU0FBUztFQUU3RCxJQUFJRixNQUFNLEtBQUtDLDJCQUFVLENBQUNFLE1BQU0sRUFBRTtJQUNoQ04sT0FBTyxDQUFDTyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCUCxPQUFPLENBQUNRLFNBQVMsR0FBRyxJQUFJO0lBRXhCLE9BQU9SLE9BQU87RUFDaEI7RUFFQSxJQUFNNUQsWUFBWSxHQUFHK0QsTUFBTSxLQUFLQywyQkFBVSxDQUFDQyxTQUFTLEdBQUdJLGtCQUFTLEdBQUdDLG1CQUFVO0VBQzdFLElBQU1GLFNBQVMsR0FBR3JKLFVBQVUsQ0FDekJwRCxLQUFLLENBQUMsQ0FBQyxDQUNQOEwsSUFBSSxDQUFDLFVBQUNwTSxDQUFDLEVBQUVxTSxDQUFDO0lBQUEsT0FDVDFELFlBQVksQ0FBQ3RHLGFBQWEsQ0FBQzZLLE9BQU8sQ0FBQ2xOLENBQUMsRUFBRWdILFVBQVUsQ0FBQyxFQUFFM0UsYUFBYSxDQUFDNkssT0FBTyxDQUFDYixDQUFDLEVBQUVyRixVQUFVLENBQUMsQ0FBQztFQUFBLENBQzFGLENBQUM7RUFFSHVGLE9BQU8sQ0FBQ08sVUFBVSxPQUFBdkwsZ0JBQUEsaUJBQ2ZpTCxNQUFNLEVBQUdFLE1BQU0sQ0FDakI7RUFDREgsT0FBTyxDQUFDUSxTQUFTLEdBQUdBLFNBQVM7RUFFN0IsT0FBT1IsT0FBTztBQUNoQjtBQUVPLFNBQVNZLGVBQWVBLENBQUNaLE9BQW9CLEVBQUVDLE1BQWMsRUFBZTtFQUNqRixJQUFNbEksS0FBSyxHQUFHaUksT0FBTyxDQUFDbkksY0FBYyxDQUFDb0ksTUFBTSxDQUFDO0VBQzVDLElBQUksQ0FBQ2xJLEtBQUssRUFBRTtJQUNWLE9BQU9pSSxPQUFPO0VBQ2hCO0VBRUEsSUFBSWEsYUFBYTtFQUNqQixJQUFJak8sS0FBSyxDQUFDQyxPQUFPLENBQUNtTixPQUFPLENBQUNhLGFBQWEsQ0FBQyxJQUFJYixPQUFPLENBQUNhLGFBQWEsQ0FBQ0MsUUFBUSxDQUFDL0ksS0FBSyxDQUFDOUQsSUFBSSxDQUFDLEVBQUU7SUFDdEY7SUFDQTRNLGFBQWEsR0FBR2IsT0FBTyxDQUFDYSxhQUFhLENBQUNyTSxNQUFNLENBQUMsVUFBQXVNLEVBQUU7TUFBQSxPQUFJQSxFQUFFLEtBQUtoSixLQUFLLENBQUM5RCxJQUFJO0lBQUEsRUFBQztFQUN2RSxDQUFDLE1BQU07SUFDTDRNLGFBQWEsR0FBRyxDQUFDYixPQUFPLENBQUNhLGFBQWEsSUFBSSxFQUFFLEVBQUUzRSxNQUFNLENBQUNuRSxLQUFLLENBQUM5RCxJQUFJLENBQUM7RUFDbEU7O0VBRUE7RUFDQSxPQUFPK00sa0JBQWtCLENBQUNoQixPQUFPLEVBQUU7SUFBQ2EsYUFBYSxFQUFiQTtFQUFhLENBQUMsQ0FBQztBQUNyRDtBQUNPLFNBQVN6RixTQUFTQSxDQUFlNkYsUUFBVyxFQUFLO0VBQ3RELE9BQU81TSxNQUFNLENBQUNzRSxNQUFNLENBQUN0RSxNQUFNLENBQUM2TSxNQUFNLENBQUM3TSxNQUFNLENBQUM4TSxjQUFjLENBQUNGLFFBQVEsQ0FBQyxDQUFDLEVBQUVBLFFBQVEsQ0FBQztBQUNoRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNELGtCQUFrQkEsQ0FBZUMsUUFBVyxFQUErQjtFQUFBLElBQTdCRyxPQUFtQixHQUFBdE0sU0FBQSxDQUFBL0IsTUFBQSxRQUFBK0IsU0FBQSxRQUFBdU0sU0FBQSxHQUFBdk0sU0FBQSxNQUFHLENBQUMsQ0FBQztFQUNwRixPQUFPVCxNQUFNLENBQUNpTixPQUFPLENBQUNGLE9BQU8sQ0FBQyxDQUFDN0csTUFBTSxDQUFDLFVBQUNDLEdBQUcsRUFBRStHLEtBQUssRUFBSztJQUNwRC9HLEdBQUcsQ0FBQytHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8vRyxHQUFHO0VBQ1osQ0FBQyxFQUFFWSxTQUFTLENBQUM2RixRQUFRLENBQUMsQ0FBQztBQUN6QjtBQUFDLElBQUFPLFFBQUEsR0FBQUMsT0FBQSxjQUVjcE0sV0FBVyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
529
|
+
var _default = exports.default = KeplerTable;
|
|
530
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc29sZSIsInJlcXVpcmUiLCJfZGVmYXVsdFNldHRpbmdzIiwiX2QzQXJyYXkiLCJfdXRpbHMiLCJfZ3B1RmlsdGVyVXRpbHMiLCJfZmlsdGVyVXRpbHMiLCJfZGF0YVV0aWxzIiwiX2RhdGFTY2FsZVV0aWxzIiwiX2RhdGFDb250YWluZXJVdGlscyIsIl9jb2xvclV0aWxzIiwiRklEX0tFWSIsIktlcGxlclRhYmxlIiwiY29uc3RydWN0b3IiLCJfcmVmIiwiaW5mbyIsImRhdGEiLCJjb2xvciIsIm1ldGFkYXRhIiwic3VwcG9ydGVkRmlsdGVyVHlwZXMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImRhdGFDb250YWluZXIiLCJjcmVhdGVEYXRhQ29udGFpbmVyIiwicm93cyIsImZpZWxkcyIsImRhdGFzZXRJbmZvIiwiaWQiLCJnZW5lcmF0ZUhhc2hJZCIsImxhYmVsIiwiZGF0YUlkIiwibWFwIiwiZiIsImkiLCJmaWVsZElkeCIsIm5hbWUiLCJkaXNwbGF5TmFtZSIsInZhbHVlQWNjZXNzb3IiLCJtYXliZVRvRGF0ZSIsImJpbmQiLCJ0eXBlIiwiQUxMX0ZJRUxEX1RZUEVTIiwidGltZXN0YW1wIiwiZGF0ZSIsImZvcm1hdCIsImFsbEluZGV4ZXMiLCJnZXRQbGFpbkluZGV4IiwiZmlsdGVyZWRJbmRleCIsImZpbHRlcmVkSW5kZXhGb3JEb21haW4iLCJmaWVsZFBhaXJzIiwiZmluZFBvaW50RmllbGRQYWlycyIsImdwdUZpbHRlciIsImdldEdwdUZpbHRlclByb3BzIiwiZ2V0Q29sdW1uRmllbGQiLCJjb2x1bW5OYW1lIiwiZmllbGQiLCJmaW5kIiwiZmQiLCJfYXNzZXRGaWVsZCIsImdldENvbHVtbkZpZWxkSWR4IiwiZmluZEluZGV4IiwiQm9vbGVhbiIsImdldFZhbHVlIiwicm93SWR4IiwiaW5kZXgiLCJ1cGRhdGVDb2x1bW5GaWVsZCIsIm5ld0ZpZWxkIiwiT2JqZWN0IiwiYXNzaWduIiwidXBkYXRlVGFibGVDb2xvciIsIm5ld0NvbG9yIiwiZ2V0Q29sdW1uRmlsdGVyUHJvcHMiLCJoYXNPd25Qcm9wZXJ0eSIsImZpbHRlclByb3BzIiwiZmllbGREb21haW4iLCJnZXRDb2x1bW5GaWx0ZXJEb21haW4iLCJnZXRGaWx0ZXJQcm9wcyIsImZpbHRlclRhYmxlIiwiZmlsdGVycyIsImxheWVycyIsIm9wdCIsImZpbHRlclJlY29yZCIsIm9sZEZpbHRlclJlY29yZCIsImdldEZpbHRlclJlY29yZCIsImxlbmd0aCIsImNoYW5nZWRGaWx0ZXJzIiwiZGlmZkZpbHRlcnMiLCJzaG91bGRDYWxEb21haW4iLCJkeW5hbWljRG9tYWluIiwic2hvdWxkQ2FsSW5kZXgiLCJjcHUiLCJmaWx0ZXJSZXN1bHQiLCJkeW5hbWljRG9tYWluRmlsdGVycyIsImNwdUZpbHRlcnMiLCJmaWx0ZXJGdW5jcyIsInJlZHVjZSIsImFjYyIsImZpbHRlciIsImZpZWxkSW5kZXgiLCJnZXREYXRhc2V0RmllbGRJbmRleEZvckZpbHRlciIsImdldEZpbHRlckZ1bmN0aW9uIiwiZmlsdGVyRGF0YUJ5RmlsdGVyVHlwZXMiLCJmaWx0ZXJUYWJsZUNQVSIsImNwdU9ubHkiLCJpZ25vcmVEb21haW4iLCJmaWx0ZXJlZElkeENQVSIsImZpbHRlclJlY29yZENQVSIsImdwdSIsImNvcGllZCIsImNvcHlUYWJsZSIsImZpbHRlcmVkIiwiZG9tYWluIiwicmVhbCIsImludGVnZXIiLCJnZXROdW1lcmljRmllbGREb21haW4iLCJib29sZWFuIiwic3RyaW5nIiwiZ2V0T3JkaW5hbERvbWFpbiIsImdldFRpbWVzdGFtcEZpZWxkRG9tYWluIiwiZ2V0Q29sdW1uTGF5ZXJEb21haW4iLCJzY2FsZVR5cGUiLCJTQ0FMRV9UWVBFUyIsIkNvbnNvbGUiLCJlcnJvciIsImluZGV4VmFsdWVBY2Nlc3NvciIsInNvcnRGdW5jdGlvbiIsImdldFNvcnRpbmdGdW5jdGlvbiIsIm9yZGluYWwiLCJwb2ludCIsInF1YW50aWxlIiwiZ2V0UXVhbnRpbGVEb21haW4iLCJsb2ciLCJnZXRMb2dEb21haW4iLCJxdWFudGl6ZSIsImxpbmVhciIsInNxcnQiLCJnZXRMaW5lYXJEb21haW4iLCJjYWxjdWxhdGVMZWdlbmQiLCJsZWZ0RmllbGQiLCJyaWdodEZpZWxkIiwibGltaXRPZk51bWJlck9mTGVnZW5kRW50cmllcyIsImxlZnRWYWx1ZXMiLCJtYXBJbmRleCIsInJpZ2h0VmFsdWVzIiwicGFpcmluZyIsInByZXZpb3VzIiwiY3VycmVudCIsImlkeCIsInB1c2giLCJ1bmlxdWVTb3J0ZWRQYWlyQnlGcmVxdWVuY3kiLCJyb3ciLCJsZWZ0IiwiY2hlY2tDb2xvck9yRmFsbGJhY2siLCJyaWdodCIsInNsaWNlIiwiZmllbGROYW1lIiwiY29uZGl0aW9uIiwicmVtb3ZlU3VmZml4QW5kRGVsaW1pdGVycyIsImxheWVyTmFtZSIsInN1ZmZpeCIsInJlcGxhY2UiLCJSZWdFeHAiLCJ0cmltIiwiYWxsTmFtZXMiLCJ0b0xvd2VyQ2FzZSIsInJlc3VsdCIsImNhcnJ5Iiwic3VmZml4UGFpciIsIlRSSVBfUE9JTlRfRklFTERTIiwiZW5kc1dpdGgiLCJvdGhlclBhdHRlcm4iLCJwYXJ0bmVyIiwicGFydG5lcklkeCIsImQiLCJkZWZhdWx0TmFtZSIsInBhaXIiLCJsYXQiLCJ2YWx1ZSIsImxuZyIsInNvcnQiLCJhIiwiYiIsInNvcnREYXRhc2V0QnlDb2x1bW4iLCJkYXRhc2V0IiwiY29sdW1uIiwibW9kZSIsInNvcnRCeSIsIlNPUlRfT1JERVIiLCJBU0NFTkRJTkciLCJVTlNPUlQiLCJzb3J0Q29sdW1uIiwic29ydE9yZGVyIiwiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyIsInZhbHVlQXQiLCJwaW5UYWJsZUNvbHVtbnMiLCJwaW5uZWRDb2x1bW5zIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5jbHVkZXMiLCJjbyIsImNvbmNhdCIsImNvcHlUYWJsZUFuZFVwZGF0ZSIsIm9yaWdpbmFsIiwiY3JlYXRlIiwiZ2V0UHJvdG90eXBlT2YiLCJvcHRpb25zIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZW50cmllcyIsImVudHJ5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL3RhYmxlLXV0aWxzL2tlcGxlci10YWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL2NvbnNvbGUnO1xuaW1wb3J0IHtUUklQX1BPSU5UX0ZJRUxEUywgU09SVF9PUkRFUn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHthc2NlbmRpbmcsIGRlc2NlbmRpbmd9IGZyb20gJ2QzLWFycmF5JztcblxuLy8gaW1wb3J0IHt2YWxpZGF0ZUlucHV0RGF0YX0gZnJvbSAncHJvY2Vzc29ycy9kYXRhLXByb2Nlc3Nvcic7XG5pbXBvcnQge2dlbmVyYXRlSGFzaElkfSBmcm9tICd1dGlscy91dGlscyc7XG5pbXBvcnQge2dldEdwdUZpbHRlclByb3BzLCBnZXREYXRhc2V0RmllbGRJbmRleEZvckZpbHRlcn0gZnJvbSAndXRpbHMvZ3B1LWZpbHRlci11dGlscyc7XG5pbXBvcnQge1xuICBnZXRGaWx0ZXJQcm9wcyxcbiAgZ2V0RmlsdGVyUmVjb3JkLFxuICBkaWZmRmlsdGVycyxcbiAgZ2V0RmlsdGVyRnVuY3Rpb24sXG4gIGZpbHRlckRhdGFCeUZpbHRlclR5cGVzLFxuICBnZXROdW1lcmljRmllbGREb21haW4sXG4gIGdldFRpbWVzdGFtcEZpZWxkRG9tYWluLFxuICBGaWx0ZXJSZXN1bHRcbn0gZnJvbSAndXRpbHMvZmlsdGVyLXV0aWxzJztcbmltcG9ydCB7bWF5YmVUb0RhdGUsIGdldFNvcnRpbmdGdW5jdGlvbn0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5pbXBvcnQge1xuICBnZXRRdWFudGlsZURvbWFpbixcbiAgZ2V0T3JkaW5hbERvbWFpbixcbiAgZ2V0TG9nRG9tYWluLFxuICBnZXRMaW5lYXJEb21haW5cbn0gZnJvbSAndXRpbHMvZGF0YS1zY2FsZS11dGlscyc7XG5cbmltcG9ydCB7QUxMX0ZJRUxEX1RZUEVTLCBTQ0FMRV9UWVBFU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5pbXBvcnQge2NyZWF0ZURhdGFDb250YWluZXJ9IGZyb20gJy4vZGF0YS1jb250YWluZXItdXRpbHMnO1xuaW1wb3J0IHt1bmlxdWVTb3J0ZWRQYWlyQnlGcmVxdWVuY3l9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuaW1wb3J0IHtjaGVja0NvbG9yT3JGYWxsYmFja30gZnJvbSAndXRpbHMvY29sb3ItdXRpbHMnO1xuXG5pbXBvcnQge1JHQkNvbG9yfSBmcm9tICdyZWR1Y2Vycy90eXBlcyc7XG5pbXBvcnQge0xheWVyfSBmcm9tICdsYXllcnMnO1xuaW1wb3J0IHtGaWVsZERvbWFpbiwgRmlsdGVyfSBmcm9tICdyZWR1Y2Vycy92aXMtc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtEYXRhQ29udGFpbmVySW50ZXJmYWNlfSBmcm9tICcuL2RhdGEtY29udGFpbmVyLWludGVyZmFjZSc7XG5pbXBvcnQge1Byb3RvRGF0YXNldH0gZnJvbSAnYWN0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIEZpZWxkID0ge1xuICBhbmFseXplclR5cGU6IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgZm9ybWF0OiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgZmllbGRJZHg6IG51bWJlcjtcbiAgdmFsdWVBY2Nlc3Nvcih2OiB7aW5kZXg6IG51bWJlcn0pOiBhbnk7XG4gIGZpbHRlclByb3BzPzogYW55O1xuICBtZXRhZGF0YT86IGFueTtcbn07XG5cbmV4cG9ydCB0eXBlIEdwdUZpbHRlciA9IHtcbiAgZmlsdGVyUmFuZ2U6IG51bWJlcltdW107XG4gIGZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnM6IGFueTtcbiAgZmlsdGVyVmFsdWVBY2Nlc3NvcjogKFxuICAgIGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlXG4gICkgPT4gKFxuICAgIGdldEluZGV4PzogKGFueSkgPT4gbnVtYmVyLFxuICAgIGdldERhdGE/OiAoZGM6IERhdGFDb250YWluZXJJbnRlcmZhY2UsIGQ6IGFueSwgZmllbGRJbmRleDogbnVtYmVyKSA9PiBhbnlcbiAgKSA9PiAoZDogYW55KSA9PiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBGaWVsZFBhaXIgPSB7XG4gIGRlZmF1bHROYW1lOiBzdHJpbmc7XG4gIHBhaXI6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBmaWVsZElkeDogbnVtYmVyO1xuICAgICAgdmFsdWU6IHN0cmluZztcbiAgICB9O1xuICB9O1xuICBzdWZmaXg6IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgRmlsdGVyUmVjb3JkID0ge1xuICBkeW5hbWljRG9tYWluOiBGaWx0ZXJbXTtcbiAgZml4ZWREb21haW46IEZpbHRlcltdO1xuICBjcHU6IEZpbHRlcltdO1xuICBncHU6IEZpbHRlcltdO1xufTtcblxuZXhwb3J0IHR5cGUgRmlsdGVyRGF0YXNldE9wdCA9IHtcbiAgLy8gb25seSBhbGxvdyBjcHUgZmlsdGVyaW5nXG4gIGNwdU9ubHk/OiBib29sZWFuO1xuICAvLyBpZ25vcmUgZmlsdGVyIGZvciBkb21haW4gY2FsY3VsYXRpb25cbiAgaWdub3JlRG9tYWluPzogYm9vbGVhbjtcbn07XG5cbi8vIFVuaXF1ZSBpZGVudGlmaWVyIG9mIGVhY2ggZmllbGRcbmNvbnN0IEZJRF9LRVkgPSAnbmFtZSc7XG5cbmNsYXNzIEtlcGxlclRhYmxlIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICB0eXBlPzogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBjb2xvcjogUkdCQ29sb3I7XG5cbiAgLy8gZmllbGRzIGFuZCBkYXRhXG4gIGZpZWxkczogRmllbGRbXTtcblxuICBkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlO1xuXG4gIGFsbEluZGV4ZXM6IG51bWJlcltdO1xuICBmaWx0ZXJlZEluZGV4OiBudW1iZXJbXTtcbiAgZmlsdGVyZWRJZHhDUFU/OiBudW1iZXJbXTtcbiAgZmlsdGVyZWRJbmRleEZvckRvbWFpbjogbnVtYmVyW107XG4gIGZpZWxkUGFpcnM6IEZpZWxkUGFpcltdO1xuICBncHVGaWx0ZXI6IEdwdUZpbHRlcjtcbiAgZmlsdGVyUmVjb3JkPzogRmlsdGVyUmVjb3JkO1xuICBmaWx0ZXJSZWNvcmRDUFU/OiBGaWx0ZXJSZWNvcmQ7XG4gIGNoYW5nZWRGaWx0ZXJzPzogYW55O1xuXG4gIC8vIHRhYmxlLWluamVjdGVkIG1ldGFkYXRhXG4gIHNvcnRDb2x1bW4/OiB7XG4gICAgLy8gY29sdW1uIG5hbWU6IHNvcnRlZCBpZHhcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7IC8vIEFTQ0VORElORyB8IERFU0NFTkRJTkcgfCBVTlNPUlRcbiAgfTtcbiAgc29ydE9yZGVyPzogbnVtYmVyW10gfCBudWxsO1xuXG4gIHBpbm5lZENvbHVtbnM/OiBzdHJpbmdbXTtcbiAgc3VwcG9ydGVkRmlsdGVyVHlwZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAvLyB0YWJsZS1pbmplY3RlZCBtZXRhZGF0YVxuICBtZXRhZGF0YTogb2JqZWN0O1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBpbmZvID0ge30sXG4gICAgZGF0YSxcbiAgICBjb2xvcixcbiAgICBtZXRhZGF0YSxcbiAgICBzdXBwb3J0ZWRGaWx0ZXJUeXBlc1xuICB9OiB7XG4gICAgaW5mbz86IFByb3RvRGF0YXNldFsnaW5mbyddO1xuICAgIGRhdGE6IFByb3RvRGF0YXNldFsnZGF0YSddO1xuICAgIGNvbG9yOiBSR0JDb2xvcjtcbiAgICBtZXRhZGF0YT86IFByb3RvRGF0YXNldFsnbWV0YWRhdGEnXTtcbiAgICBzdXBwb3J0ZWRGaWx0ZXJUeXBlcz86IFByb3RvRGF0YXNldFsnc3VwcG9ydGVkRmlsdGVyVHlwZXMnXTtcbiAgfSkge1xuICAgIC8vIFRPRE8gLSB3aGF0IHRvIGRvIGlmIHZhbGlkYXRpb24gZmFpbHM/IENhbiBrZXBsZXIgaGFuZGxlIGV4Y2VwdGlvbnM/XG4gICAgLy8gY29uc3QgdmFsaWRhdGVkRGF0YSA9IHZhbGlkYXRlSW5wdXREYXRhKGRhdGEpO1xuICAgIC8vIGlmICghdmFsaWRhdGVkRGF0YSkge1xuICAgIC8vICAgcmV0dXJuIHRoaXM7XG4gICAgLy8gfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGNvbnN0IGRhdGFDb250YWluZXIgPSBjcmVhdGVEYXRhQ29udGFpbmVyKGRhdGEucm93cywge2ZpZWxkczogZGF0YS5maWVsZHN9KTtcblxuICAgIGNvbnN0IGRhdGFzZXRJbmZvID0ge1xuICAgICAgaWQ6IGdlbmVyYXRlSGFzaElkKDQpLFxuICAgICAgbGFiZWw6ICduZXcgZGF0YXNldCcsXG4gICAgICAuLi4oaW5mbyB8fCB7fSlcbiAgICB9O1xuICAgIGNvbnN0IGRhdGFJZCA9IGRhdGFzZXRJbmZvLmlkO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBjb25zdCBmaWVsZHM6IEZpZWxkW10gPSBkYXRhLmZpZWxkcy5tYXAoKGYsIGkpID0+ICh7XG4gICAgICAuLi5mLFxuICAgICAgZmllbGRJZHg6IGksXG4gICAgICBpZDogZi5uYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IGYuZGlzcGxheU5hbWUgfHwgZi5uYW1lLFxuICAgICAgdmFsdWVBY2Nlc3NvcjogbWF5YmVUb0RhdGUuYmluZChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgLy8gaXMgdGltZVxuICAgICAgICBmLnR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAgfHwgZi50eXBlID09PSBBTExfRklFTERfVFlQRVMuZGF0ZSxcbiAgICAgICAgaSxcbiAgICAgICAgZi5mb3JtYXQsXG4gICAgICAgIGRhdGFDb250YWluZXJcbiAgICAgIClcbiAgICB9KSk7XG5cbiAgICBjb25zdCBhbGxJbmRleGVzID0gZGF0YUNvbnRhaW5lci5nZXRQbGFpbkluZGV4KCk7XG5cbiAgICB0aGlzLmlkID0gZGF0YXNldEluZm8uaWQ7XG4gICAgdGhpcy5sYWJlbCA9IGRhdGFzZXRJbmZvLmxhYmVsO1xuICAgIHRoaXMuY29sb3IgPSBjb2xvcjtcbiAgICB0aGlzLm1ldGFkYXRhID0ge1xuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICBpZDogZGF0YXNldEluZm8uaWQsXG4gICAgICBsYWJlbDogZGF0YXNldEluZm8ubGFiZWxcbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhQ29udGFpbmVyID0gZGF0YUNvbnRhaW5lcjtcbiAgICB0aGlzLmFsbEluZGV4ZXMgPSBhbGxJbmRleGVzO1xuICAgIHRoaXMuZmlsdGVyZWRJbmRleCA9IGFsbEluZGV4ZXM7XG4gICAgdGhpcy5maWx0ZXJlZEluZGV4Rm9yRG9tYWluID0gYWxsSW5kZXhlcztcbiAgICB0aGlzLmZpZWxkUGFpcnMgPSBmaW5kUG9pbnRGaWVsZFBhaXJzKGZpZWxkcyk7XG4gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgdGhpcy5ncHVGaWx0ZXIgPSBnZXRHcHVGaWx0ZXJQcm9wcyhbXSwgZGF0YUlkLCBmaWVsZHMpO1xuICAgIGlmIChzdXBwb3J0ZWRGaWx0ZXJUeXBlcykge1xuICAgICAgdGhpcy5zdXBwb3J0ZWRGaWx0ZXJUeXBlcyA9IHN1cHBvcnRlZEZpbHRlclR5cGVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmllbGRcbiAgICogQHBhcmFtIGNvbHVtbk5hbWVcbiAgICovXG4gIGdldENvbHVtbkZpZWxkKGNvbHVtbk5hbWU6IHN0cmluZyk6IEZpZWxkIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoZmQgPT4gZmRbRklEX0tFWV0gPT09IGNvbHVtbk5hbWUpO1xuICAgIHRoaXMuX2Fzc2V0RmllbGQoY29sdW1uTmFtZSwgZmllbGQpO1xuICAgIHJldHVybiBmaWVsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmllbGRJZHhcbiAgICogQHBhcmFtIGNvbHVtbk5hbWVcbiAgICovXG4gIGdldENvbHVtbkZpZWxkSWR4KGNvbHVtbk5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgZmllbGRJZHggPSB0aGlzLmZpZWxkcy5maW5kSW5kZXgoZmQgPT4gZmRbRklEX0tFWV0gPT09IGNvbHVtbk5hbWUpO1xuICAgIHRoaXMuX2Fzc2V0RmllbGQoY29sdW1uTmFtZSwgQm9vbGVhbihmaWVsZElkeCA+IC0xKSk7XG4gICAgcmV0dXJuIGZpZWxkSWR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgb2YgYSBjZWxsXG4gICAqL1xuICBnZXRWYWx1ZShjb2x1bW5OYW1lOiBzdHJpbmcsIHJvd0lkeDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2V0Q29sdW1uRmllbGQoY29sdW1uTmFtZSk7XG4gICAgcmV0dXJuIGZpZWxkID8gZmllbGQudmFsdWVBY2Nlc3Nvcih7aW5kZXg6IHJvd0lkeH0pIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGV4aXN0aW5nIGZpZWxkIHdpdGggYSBuZXcgb2JqZWN0XG4gICAqIEBwYXJhbSBmaWVsZElkeFxuICAgKiBAcGFyYW0gbmV3RmllbGRcbiAgICovXG4gIHVwZGF0ZUNvbHVtbkZpZWxkKGZpZWxkSWR4OiBudW1iZXIsIG5ld0ZpZWxkOiBGaWVsZCk6IHZvaWQge1xuICAgIHRoaXMuZmllbGRzID0gT2JqZWN0LmFzc2lnbihbLi4udGhpcy5maWVsZHNdLCB7W2ZpZWxkSWR4XTogbmV3RmllbGR9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZGF0YXNldCBjb2xvciBieSBjdXN0b20gY29sb3JcbiAgICogQHBhcmFtIG5ld0NvbG9yXG4gICAqL1xuICB1cGRhdGVUYWJsZUNvbG9yKG5ld0NvbG9yOiBSR0JDb2xvcik6IHZvaWQge1xuICAgIHRoaXMuY29sb3IgPSBuZXdDb2xvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGZpbHRlclByb3BzIHRvIGZpZWxkIGFuZCByZXRyaWV2ZSBpdFxuICAgKiBAcGFyYW0gY29sdW1uTmFtZVxuICAgKi9cbiAgZ2V0Q29sdW1uRmlsdGVyUHJvcHMoY29sdW1uTmFtZTogc3RyaW5nKTogRmllbGRbJ2ZpbHRlclByb3BzJ10gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaWVsZElkeCA9IHRoaXMuZ2V0Q29sdW1uRmllbGRJZHgoY29sdW1uTmFtZSk7XG4gICAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHNbZmllbGRJZHhdO1xuICAgIGlmIChmaWVsZC5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyUHJvcHMnKSkge1xuICAgICAgcmV0dXJuIGZpZWxkLmZpbHRlclByb3BzO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkRG9tYWluID0gdGhpcy5nZXRDb2x1bW5GaWx0ZXJEb21haW4oZmllbGQpO1xuICAgIGlmICghZmllbGREb21haW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclByb3BzID0gZ2V0RmlsdGVyUHJvcHMoZmllbGQsIGZpZWxkRG9tYWluKTtcbiAgICBjb25zdCBuZXdGaWVsZCA9IHtcbiAgICAgIC4uLmZpZWxkLFxuICAgICAgZmlsdGVyUHJvcHNcbiAgICB9O1xuXG4gICAgdGhpcy51cGRhdGVDb2x1bW5GaWVsZChmaWVsZElkeCwgbmV3RmllbGQpO1xuXG4gICAgcmV0dXJuIGZpbHRlclByb3BzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGZpbHRlcnMgdG8gZGF0YXNldCwgcmV0dXJuIHRoZSBmaWx0ZXJlZCBkYXRhc2V0IHdpdGggdXBkYXRlZCBgZ3B1RmlsdGVyYCwgYGZpbHRlclJlY29yZGAsIGBmaWx0ZXJlZEluZGV4YCwgYGZpbHRlcmVkSW5kZXhGb3JEb21haW5gXG4gICAqIEBwYXJhbSBmaWx0ZXJzXG4gICAqIEBwYXJhbSBsYXllcnNcbiAgICogQHBhcmFtIG9wdFxuICAgKi9cbiAgZmlsdGVyVGFibGUoZmlsdGVyczogRmlsdGVyW10sIGxheWVyczogTGF5ZXJbXSwgb3B0PzogRmlsdGVyRGF0YXNldE9wdCk6IEtlcGxlclRhYmxlIHtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lciwgaWQ6IGRhdGFJZCwgZmlsdGVyUmVjb3JkOiBvbGRGaWx0ZXJSZWNvcmQsIGZpZWxkc30gPSB0aGlzO1xuXG4gICAgLy8gaWYgdGhlcmUgaXMgbm8gZmlsdGVyc1xuICAgIGNvbnN0IGZpbHRlclJlY29yZCA9IGdldEZpbHRlclJlY29yZChkYXRhSWQsIGZpbHRlcnMsIG9wdCB8fCB7fSk7XG5cbiAgICB0aGlzLmZpbHRlclJlY29yZCA9IGZpbHRlclJlY29yZDtcbiAgICB0aGlzLmdwdUZpbHRlciA9IGdldEdwdUZpbHRlclByb3BzKGZpbHRlcnMsIGRhdGFJZCwgZmllbGRzKTtcblxuICAgIC8vIGNvbnN0IG5ld0RhdGFzZXQgPSBzZXQoWydmaWx0ZXJSZWNvcmQnXSwgZmlsdGVyUmVjb3JkLCBkYXRhc2V0KTtcblxuICAgIGlmICghZmlsdGVycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJbmRleCA9IHRoaXMuYWxsSW5kZXhlcztcbiAgICAgIHRoaXMuZmlsdGVyZWRJbmRleEZvckRvbWFpbiA9IHRoaXMuYWxsSW5kZXhlcztcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlZEZpbHRlcnMgPSBkaWZmRmlsdGVycyhmaWx0ZXJSZWNvcmQsIG9sZEZpbHRlclJlY29yZCk7XG5cbiAgICAvLyBnZW5lcmF0ZSAyIHNldHMgb2YgZmlsdGVyIHJlc3VsdFxuICAgIC8vIGZpbHRlcmVkSW5kZXggdXNlZCB0byBjYWxjdWxhdGUgbGF5ZXIgZGF0YVxuICAgIC8vIGZpbHRlcmVkSW5kZXhGb3JEb21haW4gdXNlZCB0byBjYWxjdWxhdGUgbGF5ZXIgRG9tYWluXG4gICAgY29uc3Qgc2hvdWxkQ2FsRG9tYWluID0gQm9vbGVhbih0aGlzLmNoYW5nZWRGaWx0ZXJzLmR5bmFtaWNEb21haW4pO1xuICAgIGNvbnN0IHNob3VsZENhbEluZGV4ID0gQm9vbGVhbih0aGlzLmNoYW5nZWRGaWx0ZXJzLmNwdSk7XG5cbiAgICBsZXQgZmlsdGVyUmVzdWx0OiBGaWx0ZXJSZXN1bHQgPSB7fTtcbiAgICBpZiAoc2hvdWxkQ2FsRG9tYWluIHx8IHNob3VsZENhbEluZGV4KSB7XG4gICAgICBjb25zdCBkeW5hbWljRG9tYWluRmlsdGVycyA9IHNob3VsZENhbERvbWFpbiA/IGZpbHRlclJlY29yZC5keW5hbWljRG9tYWluIDogbnVsbDtcbiAgICAgIGNvbnN0IGNwdUZpbHRlcnMgPSBzaG91bGRDYWxJbmRleCA/IGZpbHRlclJlY29yZC5jcHUgOiBudWxsO1xuXG4gICAgICBjb25zdCBmaWx0ZXJGdW5jcyA9IGZpbHRlcnMucmVkdWNlKChhY2MsIGZpbHRlcikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZEluZGV4ID0gZ2V0RGF0YXNldEZpZWxkSW5kZXhGb3JGaWx0ZXIodGhpcy5pZCwgZmlsdGVyKTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZEluZGV4ICE9PSAtMSA/IGZpZWxkc1tmaWVsZEluZGV4XSA6IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgW2ZpbHRlci5pZF06IGdldEZpbHRlckZ1bmN0aW9uKGZpZWxkLCB0aGlzLmlkLCBmaWx0ZXIsIGxheWVycywgZGF0YUNvbnRhaW5lcilcbiAgICAgICAgfTtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgZmlsdGVyUmVzdWx0ID0gZmlsdGVyRGF0YUJ5RmlsdGVyVHlwZXMoXG4gICAgICAgIHtkeW5hbWljRG9tYWluRmlsdGVycywgY3B1RmlsdGVycywgZmlsdGVyRnVuY3N9LFxuICAgICAgICBkYXRhQ29udGFpbmVyXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyZWRJbmRleCA9IGZpbHRlclJlc3VsdC5maWx0ZXJlZEluZGV4IHx8IHRoaXMuZmlsdGVyZWRJbmRleDtcbiAgICB0aGlzLmZpbHRlcmVkSW5kZXhGb3JEb21haW4gPVxuICAgICAgZmlsdGVyUmVzdWx0LmZpbHRlcmVkSW5kZXhGb3JEb21haW4gfHwgdGhpcy5maWx0ZXJlZEluZGV4Rm9yRG9tYWluO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgZmlsdGVycyB0byBhIGRhdGFzZXQgYWxsIG9uIENQVSwgYXNzaWduIHRvIGBmaWx0ZXJlZElkeENQVWAsIGBmaWx0ZXJSZWNvcmRDUFVgXG4gICAqIEBwYXJhbSBmaWx0ZXJzXG4gICAqIEBwYXJhbSBsYXllcnNcbiAgICovXG4gIGZpbHRlclRhYmxlQ1BVKGZpbHRlcnM6IEZpbHRlcltdLCBsYXllcnM6IExheWVyW10pOiBLZXBsZXJUYWJsZSB7XG4gICAgY29uc3Qgb3B0ID0ge1xuICAgICAgY3B1T25seTogdHJ1ZSxcbiAgICAgIGlnbm9yZURvbWFpbjogdHJ1ZVxuICAgIH07XG5cbiAgICAvLyBubyBmaWx0ZXJcbiAgICBpZiAoIWZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkSWR4Q1BVID0gdGhpcy5hbGxJbmRleGVzO1xuICAgICAgdGhpcy5maWx0ZXJSZWNvcmRDUFUgPSBnZXRGaWx0ZXJSZWNvcmQodGhpcy5pZCwgZmlsdGVycywgb3B0KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIG5vIGdwdSBmaWx0ZXJcbiAgICBpZiAoIWZpbHRlcnMuZmluZChmID0+IGYuZ3B1KSkge1xuICAgICAgdGhpcy5maWx0ZXJlZElkeENQVSA9IHRoaXMuZmlsdGVyZWRJbmRleDtcbiAgICAgIHRoaXMuZmlsdGVyUmVjb3JkQ1BVID0gZ2V0RmlsdGVyUmVjb3JkKHRoaXMuaWQsIGZpbHRlcnMsIG9wdCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBtYWtlIGEgY29weSBmb3IgY3B1IGZpbHRlcmluZ1xuICAgIGNvbnN0IGNvcGllZCA9IGNvcHlUYWJsZSh0aGlzKTtcblxuICAgIGNvcGllZC5maWx0ZXJSZWNvcmQgPSB0aGlzLmZpbHRlclJlY29yZENQVTtcbiAgICBjb3BpZWQuZmlsdGVyZWRJbmRleCA9IHRoaXMuZmlsdGVyZWRJZHhDUFUgfHwgW107XG5cbiAgICBjb25zdCBmaWx0ZXJlZCA9IGNvcGllZC5maWx0ZXJUYWJsZShmaWx0ZXJzLCBsYXllcnMsIG9wdCk7XG5cbiAgICB0aGlzLmZpbHRlcmVkSWR4Q1BVID0gZmlsdGVyZWQuZmlsdGVyZWRJbmRleDtcbiAgICB0aGlzLmZpbHRlclJlY29yZENQVSA9IGZpbHRlcmVkLmZpbHRlclJlY29yZDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBmaWVsZCBkb21haW4gYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgZGF0YVxuICAgKiBmb3IgRmlsdGVyXG4gICAqL1xuICBnZXRDb2x1bW5GaWx0ZXJEb21haW4oZmllbGQ6IEZpZWxkKTogRmllbGREb21haW4ge1xuICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyfSA9IHRoaXM7XG4gICAgY29uc3Qge3ZhbHVlQWNjZXNzb3J9ID0gZmllbGQ7XG5cbiAgICBsZXQgZG9tYWluO1xuXG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5yZWFsOlxuICAgICAgY2FzZSBBTExfRklFTERfVFlQRVMuaW50ZWdlcjpcbiAgICAgICAgLy8gY2FsY3VsYXRlIGRvbWFpbiBhbmQgc3RlcFxuICAgICAgICByZXR1cm4gZ2V0TnVtZXJpY0ZpZWxkRG9tYWluKGRhdGFDb250YWluZXIsIHZhbHVlQWNjZXNzb3IpO1xuXG4gICAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5ib29sZWFuOlxuICAgICAgICByZXR1cm4ge2RvbWFpbjogW3RydWUsIGZhbHNlXX07XG5cbiAgICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZzpcbiAgICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmRhdGU6XG4gICAgICAgIGRvbWFpbiA9IGdldE9yZGluYWxEb21haW4oZGF0YUNvbnRhaW5lciwgdmFsdWVBY2Nlc3Nvcik7XG4gICAgICAgIHJldHVybiB7ZG9tYWlufTtcblxuICAgICAgY2FzZSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wOlxuICAgICAgICByZXR1cm4gZ2V0VGltZXN0YW1wRmllbGREb21haW4oZGF0YUNvbnRhaW5lciwgdmFsdWVBY2Nlc3Nvcik7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7ZG9tYWluOiBnZXRPcmRpbmFsRG9tYWluKGRhdGFDb250YWluZXIsIHZhbHVlQWNjZXNzb3IpfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIEdldCB0aGUgZG9tYWluIG9mIHRoaXMgY29sdW1uIGJhc2VkIG9uIHNjYWxlIHR5cGVcbiAgICovXG4gIGdldENvbHVtbkxheWVyRG9tYWluKFxuICAgIGZpZWxkOiBGaWVsZCxcbiAgICBzY2FsZVR5cGU6IHN0cmluZ1xuICApOiBudW1iZXJbXSB8IHN0cmluZ1tdIHwgW251bWJlciwgbnVtYmVyXSB8IG51bGwge1xuICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyLCBmaWx0ZXJlZEluZGV4Rm9yRG9tYWlufSA9IHRoaXM7XG5cbiAgICBpZiAoIVNDQUxFX1RZUEVTW3NjYWxlVHlwZV0pIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoYHNjYWxlIHR5cGUgJHtzY2FsZVR5cGV9IG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHt2YWx1ZUFjY2Vzc29yfSA9IGZpZWxkO1xuICAgIGNvbnN0IGluZGV4VmFsdWVBY2Nlc3NvciA9IGkgPT4gdmFsdWVBY2Nlc3Nvcih7aW5kZXg6IGl9KTtcbiAgICBjb25zdCBzb3J0RnVuY3Rpb24gPSBnZXRTb3J0aW5nRnVuY3Rpb24oZmllbGQudHlwZSk7XG5cbiAgICBzd2l0Y2ggKHNjYWxlVHlwZSkge1xuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5vcmRpbmFsOlxuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5wb2ludDpcbiAgICAgICAgLy8gZG8gbm90IHJlY2FsY3VsYXRlIG9yZGluYWwgZG9tYWluIGJhc2VkIG9uIGZpbHRlcmVkIGRhdGFcbiAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byB1cGRhdGUgb3JkaW5hbCBkb21haW4gZXZlcnkgdGltZVxuICAgICAgICByZXR1cm4gZ2V0T3JkaW5hbERvbWFpbihkYXRhQ29udGFpbmVyLCB2YWx1ZUFjY2Vzc29yKTtcblxuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5xdWFudGlsZTpcbiAgICAgICAgcmV0dXJuIGdldFF1YW50aWxlRG9tYWluKGZpbHRlcmVkSW5kZXhGb3JEb21haW4sIGluZGV4VmFsdWVBY2Nlc3Nvciwgc29ydEZ1bmN0aW9uKTtcblxuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5sb2c6XG4gICAgICAgIHJldHVybiBnZXRMb2dEb21haW4oZmlsdGVyZWRJbmRleEZvckRvbWFpbiwgaW5kZXhWYWx1ZUFjY2Vzc29yKTtcblxuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5xdWFudGl6ZTpcbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMubGluZWFyOlxuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5zcXJ0OlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGdldExpbmVhckRvbWFpbihmaWx0ZXJlZEluZGV4Rm9yRG9tYWluLCBpbmRleFZhbHVlQWNjZXNzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGN1bGF0ZUxlZ2VuZChsZWZ0RmllbGQsIHJpZ2h0RmllbGQpIHtcbiAgICBjb25zdCBsaW1pdE9mTnVtYmVyT2ZMZWdlbmRFbnRyaWVzID0gMjA7XG4gICAgY29uc3QgbGVmdFZhbHVlcyA9IHRoaXMuZGF0YUNvbnRhaW5lci5tYXBJbmRleChsZWZ0RmllbGQudmFsdWVBY2Nlc3Nvcik7XG4gICAgY29uc3QgcmlnaHRWYWx1ZXMgPSB0aGlzLmRhdGFDb250YWluZXIubWFwSW5kZXgocmlnaHRGaWVsZC52YWx1ZUFjY2Vzc29yKTtcblxuICAgIGNvbnN0IHBhaXJpbmcgPSBsZWZ0VmFsdWVzLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQsIGlkeCkgPT4ge1xuICAgICAgcHJldmlvdXMucHVzaChbY3VycmVudCwgcmlnaHRWYWx1ZXNbaWR4XV0pO1xuICAgICAgcmV0dXJuIHByZXZpb3VzO1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiB1bmlxdWVTb3J0ZWRQYWlyQnlGcmVxdWVuY3kocGFpcmluZylcbiAgICAgIC5tYXAocm93ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDogcm93LmxlZnQsXG4gICAgICAgICAgY29sb3I6IGNoZWNrQ29sb3JPckZhbGxiYWNrKHJvdy5yaWdodClcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuc2xpY2UoMCwgbGltaXRPZk51bWJlck9mTGVnZW5kRW50cmllcyArIDEpOyAvLyBMaW1pdCB0byBsaW1pdE9mTnVtYmVyT2ZMZWdlbmRFbnRyaWVzICsgMSwgdGhlbiBsaW1pdCB0byBsaW1pdE9mTnVtYmVyT2ZMZWdlbmRFbnRyaWVzIGluIExlZ2VuZE1hbmFnZXJzXG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2FtcGxlIG9mIHJvd3MgdG8gY2FsY3VsYXRlIGxheWVyIGJvdW5kYXJpZXNcbiAgICovXG4gIC8vIGdldFNhbXBsZURhdGEocm93cylcblxuICAvKipcbiAgICogUGFyc2UgY2VsbCB2YWx1ZSBiYXNlZCBvbiBjb2x1bW4gdHlwZSBhbmQgcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAqIFZhbHVlIHRoZSBmaWVsZCB2YWx1ZSwgdHlwZSB0aGUgZmllbGQgdHlwZVxuICAgKi9cbiAgLy8gcGFyc2VGaWVsZFZhbHVlKHZhbHVlLCB0eXBlKVxuXG4gIC8vIHNvcnREYXRhc2V0QnlDb2x1bW4oKVxuXG4gIC8qKlxuICAgKiBBc3NlcnQgd2hldGhlciBmaWVsZCBleGlzdFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICovXG4gIF9hc3NldEZpZWxkKGZpZWxkTmFtZTogc3RyaW5nLCBjb25kaXRpb246IGFueSk6IHZvaWQge1xuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBDb25zb2xlLmVycm9yKGAke2ZpZWxkTmFtZX0gZG9lc250IGV4aXN0IGluIGRhdGFzZXQgJHt0aGlzLmlkfWApO1xuICAgIH1cbiAgfVxufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TIChNQUlOTFkgRVhQT1JURUQgRk9SIFRFU1QuLi4pXG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTdWZmaXhBbmREZWxpbWl0ZXJzKGxheWVyTmFtZSwgc3VmZml4KSB7XG4gIHJldHVybiBsYXllck5hbWVcbiAgICAucmVwbGFjZShuZXcgUmVnRXhwKHN1ZmZpeCwgJ2lnJyksICcnKVxuICAgIC5yZXBsYWNlKC9bXywuXSsvZywgJyAnKVxuICAgIC50cmltKCk7XG59XG5cbi8qKlxuICogRmluZCBwb2ludCBmaWVsZHMgcGFpcnMgZnJvbSBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZmllbGRzXG4gKiBAcmV0dXJucyBmb3VuZCBwb2ludCBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQb2ludEZpZWxkUGFpcnMoZmllbGRzOiBGaWVsZFtdKTogRmllbGRQYWlyW10ge1xuICBjb25zdCBhbGxOYW1lcyA9IGZpZWxkcy5tYXAoZiA9PiBmLm5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgLy8gZ2V0IGxpc3Qgb2YgYWxsIGZpZWxkcyB3aXRoIG1hdGNoaW5nIHN1ZmZpeGVzXG4gIGNvbnN0IGFjYzogRmllbGRQYWlyW10gPSBbXTtcbiAgY29uc3QgcmVzdWx0ID0gYWxsTmFtZXMucmVkdWNlKChjYXJyeSwgZmllbGROYW1lLCBpZHgpID0+IHtcbiAgICAvLyBUaGlzIHNlYXJjaCBmb3IgcGFpcnMgd2lsbCBlYXJseSBleGl0IGlmIGZvdW5kLlxuICAgIGZvciAoY29uc3Qgc3VmZml4UGFpciBvZiBUUklQX1BPSU5UX0ZJRUxEUykge1xuICAgICAgLy8gbWF0Y2ggZmlyc3Qgc3VmZml4YGBgXG4gICAgICBpZiAoZmllbGROYW1lLmVuZHNXaXRoKHN1ZmZpeFBhaXJbMF0pKSB7XG4gICAgICAgIC8vIG1hdGNoIHNlY29uZCBzdWZmaXhcbiAgICAgICAgY29uc3Qgb3RoZXJQYXR0ZXJuID0gbmV3IFJlZ0V4cChgJHtzdWZmaXhQYWlyWzBdfVxcJGApO1xuICAgICAgICBjb25zdCBwYXJ0bmVyID0gZmllbGROYW1lLnJlcGxhY2Uob3RoZXJQYXR0ZXJuLCBzdWZmaXhQYWlyWzFdKTtcblxuICAgICAgICBjb25zdCBwYXJ0bmVySWR4ID0gYWxsTmFtZXMuZmluZEluZGV4KGQgPT4gZCA9PT0gcGFydG5lcik7XG4gICAgICAgIGlmIChwYXJ0bmVySWR4ID4gLTEpIHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0TmFtZSA9IHJlbW92ZVN1ZmZpeEFuZERlbGltaXRlcnMoZmllbGROYW1lLCBzdWZmaXhQYWlyWzBdKTtcblxuICAgICAgICAgIGNhcnJ5LnB1c2goe1xuICAgICAgICAgICAgZGVmYXVsdE5hbWUsXG4gICAgICAgICAgICBwYWlyOiB7XG4gICAgICAgICAgICAgIGxhdDoge1xuICAgICAgICAgICAgICAgIGZpZWxkSWR4OiBpZHgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkc1tpZHhdLm5hbWVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbG5nOiB7XG4gICAgICAgICAgICAgICAgZmllbGRJZHg6IHBhcnRuZXJJZHgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkc1twYXJ0bmVySWR4XS5uYW1lXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWZmaXg6IHN1ZmZpeFBhaXJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY2Fycnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhcnJ5O1xuICB9LCBhY2MpO1xuXG4gIC8vIHByaW9yaXRpemUgdGhlICdsYXRpdHVkZScvJ2xvbmdpdHVkZScgcGFpclxuICByZXN1bHQuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmRlZmF1bHROYW1lID09PSAnJyAmJiBhLnN1ZmZpeFswXSA9PT0gJ2xhdGl0dWRlJykgcmV0dXJuIC0xO1xuICAgIGlmIChiLmRlZmF1bHROYW1lID09PSAnJyAmJiBiLnN1ZmZpeFswXSA9PT0gJ2xhdGl0dWRlJykgcmV0dXJuIDE7XG4gICAgcmV0dXJuIDA7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBkYXRhc2V0XG4gKiBAcGFyYW0gY29sdW1uXG4gKiBAcGFyYW0gbW9kZVxuICogQHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnREYXRhc2V0QnlDb2x1bW4oXG4gIGRhdGFzZXQ6IEtlcGxlclRhYmxlLFxuICBjb2x1bW46IHN0cmluZyxcbiAgbW9kZT86IHN0cmluZ1xuKTogS2VwbGVyVGFibGUge1xuICBjb25zdCB7YWxsSW5kZXhlcywgZmllbGRzLCBkYXRhQ29udGFpbmVyfSA9IGRhdGFzZXQ7XG4gIGNvbnN0IGZpZWxkSW5kZXggPSBmaWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBjb2x1bW4pO1xuICBpZiAoZmllbGRJbmRleCA8IDApIHtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIGNvbnN0IHNvcnRCeSA9IFNPUlRfT1JERVJbbW9kZSB8fCAnJ10gfHwgU09SVF9PUkRFUi5BU0NFTkRJTkc7XG5cbiAgaWYgKHNvcnRCeSA9PT0gU09SVF9PUkRFUi5VTlNPUlQpIHtcbiAgICBkYXRhc2V0LnNvcnRDb2x1bW4gPSB7fTtcbiAgICBkYXRhc2V0LnNvcnRPcmRlciA9IG51bGw7XG5cbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIGNvbnN0IHNvcnRGdW5jdGlvbiA9IHNvcnRCeSA9PT0gU09SVF9PUkRFUi5BU0NFTkRJTkcgPyBhc2NlbmRpbmcgOiBkZXNjZW5kaW5nO1xuICBjb25zdCBzb3J0T3JkZXIgPSBhbGxJbmRleGVzXG4gICAgLnNsaWNlKClcbiAgICAuc29ydCgoYSwgYikgPT5cbiAgICAgIHNvcnRGdW5jdGlvbihkYXRhQ29udGFpbmVyLnZhbHVlQXQoYSwgZmllbGRJbmRleCksIGRhdGFDb250YWluZXIudmFsdWVBdChiLCBmaWVsZEluZGV4KSlcbiAgICApO1xuXG4gIGRhdGFzZXQuc29ydENvbHVtbiA9IHtcbiAgICBbY29sdW1uXTogc29ydEJ5XG4gIH07XG4gIGRhdGFzZXQuc29ydE9yZGVyID0gc29ydE9yZGVyO1xuXG4gIHJldHVybiBkYXRhc2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGluVGFibGVDb2x1bW5zKGRhdGFzZXQ6IEtlcGxlclRhYmxlLCBjb2x1bW46IHN0cmluZyk6IEtlcGxlclRhYmxlIHtcbiAgY29uc3QgZmllbGQgPSBkYXRhc2V0LmdldENvbHVtbkZpZWxkKGNvbHVtbik7XG4gIGlmICghZmllbGQpIHtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIGxldCBwaW5uZWRDb2x1bW5zO1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhc2V0LnBpbm5lZENvbHVtbnMpICYmIGRhdGFzZXQucGlubmVkQ29sdW1ucy5pbmNsdWRlcyhmaWVsZC5uYW1lKSkge1xuICAgIC8vIHVucGluIGl0XG4gICAgcGlubmVkQ29sdW1ucyA9IGRhdGFzZXQucGlubmVkQ29sdW1ucy5maWx0ZXIoY28gPT4gY28gIT09IGZpZWxkLm5hbWUpO1xuICB9IGVsc2Uge1xuICAgIHBpbm5lZENvbHVtbnMgPSAoZGF0YXNldC5waW5uZWRDb2x1bW5zIHx8IFtdKS5jb25jYXQoZmllbGQubmFtZSk7XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBjb3B5VGFibGVBbmRVcGRhdGUoZGF0YXNldCwge3Bpbm5lZENvbHVtbnN9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb3B5VGFibGU8VCBleHRlbmRzIHt9PihvcmlnaW5hbDogVCk6IFQge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbCkpLCBvcmlnaW5hbCk7XG59XG5cbi8qKlxuICogQHR5cGVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5VGFibGVBbmRVcGRhdGU8VCBleHRlbmRzIHt9PihvcmlnaW5hbDogVCwgb3B0aW9uczogUGFydGlhbDxUPiA9IHt9KTogVCB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhvcHRpb25zKS5yZWR1Y2UoKGFjYywgZW50cnkpID0+IHtcbiAgICBhY2NbZW50cnlbMF1dID0gZW50cnlbMV07XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgY29weVRhYmxlKG9yaWdpbmFsKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEtlcGxlclRhYmxlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQW9CQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxnQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBR0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksZUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssWUFBQSxHQUFBTCxPQUFBO0FB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TUFBTSxDQUFDO0VBQzVDLElBQUksQ0FBQ2pJLEtBQUssRUFBRTtJQUNWLE9BQU9nSSxPQUFPO0VBQ2hCO0VBRUEsSUFBSWEsYUFBYTtFQUNqQixJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ2YsT0FBTyxDQUFDYSxhQUFhLENBQUMsSUFBSWIsT0FBTyxDQUFDYSxhQUFhLENBQUNHLFFBQVEsQ0FBQ2hKLEtBQUssQ0FBQ3BCLElBQUksQ0FBQyxFQUFFO0lBQ3RGO0lBQ0FpSyxhQUFhLEdBQUdiLE9BQU8sQ0FBQ2EsYUFBYSxDQUFDbkcsTUFBTSxDQUFDdUcsRUFBRSxJQUFJQSxFQUFFLEtBQUtqSixLQUFLLENBQUNwQixJQUFJLENBQUM7RUFDdkUsQ0FBQyxNQUFNO0lBQ0xpSyxhQUFhLEdBQUcsQ0FBQ2IsT0FBTyxDQUFDYSxhQUFhLElBQUksRUFBRSxFQUFFSyxNQUFNLENBQUNsSixLQUFLLENBQUNwQixJQUFJLENBQUM7RUFDbEU7O0VBRUE7RUFDQSxPQUFPdUssa0JBQWtCLENBQUNuQixPQUFPLEVBQUU7SUFBQ2E7RUFBYSxDQUFDLENBQUM7QUFDckQ7QUFDTyxTQUFTdkYsU0FBU0EsQ0FBZThGLFFBQVcsRUFBSztFQUN0RCxPQUFPeEksTUFBTSxDQUFDQyxNQUFNLENBQUNELE1BQU0sQ0FBQ3lJLE1BQU0sQ0FBQ3pJLE1BQU0sQ0FBQzBJLGNBQWMsQ0FBQ0YsUUFBUSxDQUFDLENBQUMsRUFBRUEsUUFBUSxDQUFDO0FBQ2hGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Qsa0JBQWtCQSxDQUFlQyxRQUFXLEVBQStCO0VBQUEsSUFBN0JHLE9BQW1CLEdBQUFDLFNBQUEsQ0FBQTNILE1BQUEsUUFBQTJILFNBQUEsUUFBQUMsU0FBQSxHQUFBRCxTQUFBLE1BQUcsQ0FBQyxDQUFDO0VBQ3BGLE9BQU81SSxNQUFNLENBQUM4SSxPQUFPLENBQUNILE9BQU8sQ0FBQyxDQUFDL0csTUFBTSxDQUFDLENBQUNDLEdBQUcsRUFBRWtILEtBQUssS0FBSztJQUNwRGxILEdBQUcsQ0FBQ2tILEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU9sSCxHQUFHO0VBQ1osQ0FBQyxFQUFFYSxTQUFTLENBQUM4RixRQUFRLENBQUMsQ0FBQztBQUN6QjtBQUFDLElBQUFRLFFBQUEsR0FBQUMsT0FBQSxDQUFBL0wsT0FBQSxHQUVjVCxXQUFXIiwiaWdub3JlTGlzdCI6W119
|