@igo2/common 1.8.1 → 1.9.3
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/bundles/igo2-common.umd.js +10700 -10473
- package/bundles/igo2-common.umd.js.map +1 -1
- package/esm2015/igo2-common.js +5 -5
- package/esm2015/lib/action/action.module.js +29 -28
- package/esm2015/lib/action/actionbar/actionbar-item.component.js +257 -257
- package/esm2015/lib/action/actionbar/actionbar.component.js +385 -387
- package/esm2015/lib/action/actionbar/actionbar.module.js +59 -58
- package/esm2015/lib/action/index.js +3 -3
- package/esm2015/lib/action/shared/action.enums.js +7 -7
- package/esm2015/lib/action/shared/action.interfaces.js +2 -1
- package/esm2015/lib/action/shared/index.js +4 -4
- package/esm2015/lib/action/shared/store.js +8 -8
- package/esm2015/lib/backdrop/backdrop.component.js +30 -30
- package/esm2015/lib/backdrop/backdrop.module.js +25 -24
- package/esm2015/lib/backdrop/index.js +2 -2
- package/esm2015/lib/badge-icon/badge-icon.directive.js +125 -121
- package/esm2015/lib/badge-icon/badge-icon.module.js +26 -25
- package/esm2015/lib/badge-icon/index.js +2 -2
- package/esm2015/lib/clickout/clickout.directive.js +32 -32
- package/esm2015/lib/clickout/clickout.module.js +24 -23
- package/esm2015/lib/clickout/index.js +2 -2
- package/esm2015/lib/clone/clone.module.js +24 -23
- package/esm2015/lib/clone/clone.pipe.js +24 -24
- package/esm2015/lib/clone/index.js +2 -2
- package/esm2015/lib/collapsible/collapse.directive.js +55 -55
- package/esm2015/lib/collapsible/collapsible.component.js +63 -63
- package/esm2015/lib/collapsible/collapsible.module.js +27 -26
- package/esm2015/lib/collapsible/index.js +3 -3
- package/esm2015/lib/confirm-dialog/confirm-dialog.component.js +50 -51
- package/esm2015/lib/confirm-dialog/confirm-dialog.module.js +29 -28
- package/esm2015/lib/confirm-dialog/confirm-dialog.service.js +22 -23
- package/esm2015/lib/confirm-dialog/index.js +3 -3
- package/esm2015/lib/context-menu/context-menu.directive.js +135 -89
- package/esm2015/lib/context-menu/context-menu.module.js +24 -23
- package/esm2015/lib/context-menu/index.js +2 -2
- package/esm2015/lib/custom-html/custom-html.component.js +32 -32
- package/esm2015/lib/custom-html/custom-html.module.js +49 -48
- package/esm2015/lib/custom-html/custom-html.pipe.js +18 -19
- package/esm2015/lib/custom-html/index.js +3 -3
- package/esm2015/lib/drag-drop/drag-drop.directive.js +88 -88
- package/esm2015/lib/drag-drop/drag-drop.module.js +24 -23
- package/esm2015/lib/drag-drop/index.js +2 -2
- package/esm2015/lib/dynamic-component/dynamic-component.module.js +33 -32
- package/esm2015/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.js +124 -125
- package/esm2015/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.js +30 -29
- package/esm2015/lib/dynamic-component/index.js +3 -3
- package/esm2015/lib/dynamic-component/shared/dynamic-component.interfaces.js +2 -1
- package/esm2015/lib/dynamic-component/shared/dynamic-component.js +174 -174
- package/esm2015/lib/dynamic-component/shared/dynamic-component.service.js +29 -29
- package/esm2015/lib/dynamic-component/shared/index.js +4 -4
- package/esm2015/lib/entity/entity-selector/entity-selector.component.js +201 -202
- package/esm2015/lib/entity/entity-selector/entity-selector.module.js +34 -33
- package/esm2015/lib/entity/entity-table/entity-table-row.directive.js +137 -137
- package/esm2015/lib/entity/entity-table/entity-table.component.js +912 -916
- package/esm2015/lib/entity/entity-table/entity-table.module.js +77 -76
- package/esm2015/lib/entity/entity-table-paginator/entity-table-paginator.component.js +138 -140
- package/esm2015/lib/entity/entity-table-paginator/entity-table-paginator.interface.js +2 -1
- package/esm2015/lib/entity/entity-table-paginator/entity-table-paginator.module.js +30 -29
- package/esm2015/lib/entity/entity.module.js +33 -32
- package/esm2015/lib/entity/index.js +6 -6
- package/esm2015/lib/entity/shared/entity.enums.js +27 -27
- package/esm2015/lib/entity/shared/entity.interfaces.js +2 -1
- package/esm2015/lib/entity/shared/entity.utils.js +67 -67
- package/esm2015/lib/entity/shared/index.js +10 -10
- package/esm2015/lib/entity/shared/state.js +191 -191
- package/esm2015/lib/entity/shared/store.js +288 -288
- package/esm2015/lib/entity/shared/strategies/filter-custom-function.js +79 -79
- package/esm2015/lib/entity/shared/strategies/filter-selection.js +84 -84
- package/esm2015/lib/entity/shared/strategies/index.js +4 -4
- package/esm2015/lib/entity/shared/strategies/strategy.js +75 -75
- package/esm2015/lib/entity/shared/transaction.js +316 -316
- package/esm2015/lib/entity/shared/view.js +315 -315
- package/esm2015/lib/entity/shared/watcher.js +120 -120
- package/esm2015/lib/flexible/flexible.component.js +158 -159
- package/esm2015/lib/flexible/flexible.module.js +24 -23
- package/esm2015/lib/flexible/flexible.type.js +2 -1
- package/esm2015/lib/flexible/index.js +3 -3
- package/esm2015/lib/form/form/form.component.js +125 -125
- package/esm2015/lib/form/form/form.module.js +42 -41
- package/esm2015/lib/form/form-field/form-field-select.component.js +132 -132
- package/esm2015/lib/form/form-field/form-field-text.component.js +108 -108
- package/esm2015/lib/form/form-field/form-field-textarea.component.js +110 -110
- package/esm2015/lib/form/form-field/form-field.component.js +77 -78
- package/esm2015/lib/form/form-field/form-field.module.js +76 -75
- package/esm2015/lib/form/form-field/index.js +5 -5
- package/esm2015/lib/form/form-group/form-group.component.js +110 -110
- package/esm2015/lib/form/form-group/form-group.module.js +42 -41
- package/esm2015/lib/form/form.module.js +51 -50
- package/esm2015/lib/form/index.js +5 -5
- package/esm2015/lib/form/shared/form-field-component.js +7 -7
- package/esm2015/lib/form/shared/form-field.service.js +29 -29
- package/esm2015/lib/form/shared/form.interfaces.js +2 -1
- package/esm2015/lib/form/shared/form.service.js +77 -77
- package/esm2015/lib/form/shared/form.utils.js +40 -40
- package/esm2015/lib/form/shared/index.js +6 -6
- package/esm2015/lib/home-button/home-button.component.js +35 -0
- package/esm2015/lib/home-button/home-button.module.js +43 -0
- package/esm2015/lib/home-button/index.js +2 -0
- package/esm2015/lib/image/image.module.js +24 -23
- package/esm2015/lib/image/index.js +2 -2
- package/esm2015/lib/image/secure-image.pipe.js +48 -51
- package/esm2015/lib/interactive-tour/index.js +5 -5
- package/esm2015/lib/interactive-tour/interactive-tour.component.js +140 -142
- package/esm2015/lib/interactive-tour/interactive-tour.interface.js +2 -1
- package/esm2015/lib/interactive-tour/interactive-tour.loader.js +44 -46
- package/esm2015/lib/interactive-tour/interactive-tour.module.js +42 -41
- package/esm2015/lib/interactive-tour/interactive-tour.service.js +285 -288
- package/esm2015/lib/json-dialog/index.js +3 -3
- package/esm2015/lib/json-dialog/json-dialog.component.js +116 -117
- package/esm2015/lib/json-dialog/json-dialog.module.js +29 -28
- package/esm2015/lib/json-dialog/json-dialog.service.js +24 -25
- package/esm2015/lib/keyvalue/index.js +2 -2
- package/esm2015/lib/keyvalue/keyvalue.module.js +24 -23
- package/esm2015/lib/keyvalue/keyvalue.pipe.js +18 -18
- package/esm2015/lib/list/index.js +3 -3
- package/esm2015/lib/list/list-item.directive.js +165 -165
- package/esm2015/lib/list/list.component.js +266 -266
- package/esm2015/lib/list/list.module.js +29 -28
- package/esm2015/lib/panel/index.js +2 -2
- package/esm2015/lib/panel/panel.component.js +67 -67
- package/esm2015/lib/panel/panel.module.js +19 -18
- package/esm2015/lib/sidenav/index.js +2 -2
- package/esm2015/lib/sidenav/sidenav-shim.directive.js +55 -56
- package/esm2015/lib/sidenav/sidenav.module.js +24 -23
- package/esm2015/lib/spinner/index.js +3 -3
- package/esm2015/lib/spinner/spinner-activity.directive.js +47 -49
- package/esm2015/lib/spinner/spinner.component.js +40 -40
- package/esm2015/lib/spinner/spinner.module.js +21 -20
- package/esm2015/lib/stop-propagation/index.js +3 -3
- package/esm2015/lib/stop-propagation/stop-drop-propagation.directive.js +22 -22
- package/esm2015/lib/stop-propagation/stop-propagation.directive.js +21 -21
- package/esm2015/lib/stop-propagation/stop-propagation.module.js +25 -24
- package/esm2015/lib/table/index.js +6 -6
- package/esm2015/lib/table/table-action-color.enum.js +7 -7
- package/esm2015/lib/table/table-database.js +28 -28
- package/esm2015/lib/table/table-datasource.js +61 -61
- package/esm2015/lib/table/table-model.interface.js +2 -1
- package/esm2015/lib/table/table.component.js +310 -311
- package/esm2015/lib/table/table.module.js +69 -68
- package/esm2015/lib/tool/index.js +3 -3
- package/esm2015/lib/tool/shared/index.js +6 -6
- package/esm2015/lib/tool/shared/tool-component.js +9 -9
- package/esm2015/lib/tool/shared/tool.interface.js +2 -1
- package/esm2015/lib/tool/shared/tool.service.js +43 -43
- package/esm2015/lib/tool/shared/toolbox.enums.js +7 -7
- package/esm2015/lib/tool/shared/toolbox.js +179 -179
- package/esm2015/lib/tool/tool.module.js +34 -33
- package/esm2015/lib/tool/toolbox/toolbox.animation.js +10 -10
- package/esm2015/lib/tool/toolbox/toolbox.component.js +261 -262
- package/esm2015/lib/tool/toolbox/toolbox.module.js +38 -37
- package/esm2015/lib/widget/index.js +3 -3
- package/esm2015/lib/widget/shared/index.js +4 -4
- package/esm2015/lib/widget/shared/widget.interfaces.js +2 -1
- package/esm2015/lib/widget/shared/widget.js +4 -4
- package/esm2015/lib/widget/shared/widget.service.js +20 -21
- package/esm2015/lib/widget/widget-outlet/widget-outlet.component.js +121 -122
- package/esm2015/lib/widget/widget-outlet/widget-outlet.module.js +34 -33
- package/esm2015/lib/widget/widget.module.js +34 -33
- package/esm2015/lib/workspace/index.js +4 -4
- package/esm2015/lib/workspace/shared/index.js +4 -4
- package/esm2015/lib/workspace/shared/store.js +40 -40
- package/esm2015/lib/workspace/shared/workspace.interfaces.js +2 -1
- package/esm2015/lib/workspace/shared/workspace.js +117 -117
- package/esm2015/lib/workspace/workspace-selector/workspace-selector.component.js +54 -55
- package/esm2015/lib/workspace/workspace-selector/workspace-selector.module.js +34 -33
- package/esm2015/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.js +93 -94
- package/esm2015/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.js +34 -33
- package/esm2015/lib/workspace/workspace.module.js +29 -28
- package/esm2015/public_api.js +72 -70
- package/fesm2015/igo2-common.js +9015 -8846
- package/fesm2015/igo2-common.js.map +1 -1
- package/igo2-common.d.ts +5 -5
- package/lib/action/action.module.d.ts +8 -7
- package/lib/action/actionbar/actionbar-item.component.d.ts +78 -78
- package/lib/action/actionbar/actionbar.component.d.ts +146 -146
- package/lib/action/actionbar/actionbar.module.d.ts +20 -19
- package/lib/action/index.d.ts +2 -2
- package/lib/action/shared/action.enums.d.ts +5 -5
- package/lib/action/shared/action.interfaces.d.ts +17 -17
- package/lib/action/shared/index.d.ts +3 -3
- package/lib/action/shared/store.d.ts +8 -8
- package/lib/backdrop/backdrop.component.d.ts +9 -9
- package/lib/backdrop/backdrop.module.d.ts +10 -9
- package/lib/backdrop/index.d.ts +1 -1
- package/lib/badge-icon/badge-icon.directive.d.ts +32 -27
- package/lib/badge-icon/badge-icon.module.d.ts +11 -10
- package/lib/badge-icon/index.d.ts +1 -1
- package/lib/clickout/clickout.directive.d.ts +10 -10
- package/lib/clickout/clickout.module.d.ts +9 -8
- package/lib/clickout/index.d.ts +1 -1
- package/lib/clone/clone.module.d.ts +9 -8
- package/lib/clone/clone.pipe.d.ts +7 -7
- package/lib/clone/index.d.ts +1 -1
- package/lib/collapsible/collapse.directive.d.ts +19 -19
- package/lib/collapsible/collapsible.component.d.ts +13 -13
- package/lib/collapsible/collapsible.module.d.ts +12 -11
- package/lib/collapsible/index.d.ts +2 -2
- package/lib/confirm-dialog/confirm-dialog.component.d.ts +9 -9
- package/lib/confirm-dialog/confirm-dialog.module.d.ts +12 -11
- package/lib/confirm-dialog/confirm-dialog.service.d.ts +10 -10
- package/lib/confirm-dialog/index.d.ts +2 -2
- package/lib/context-menu/context-menu.directive.d.ts +27 -21
- package/lib/context-menu/context-menu.module.d.ts +9 -8
- package/lib/context-menu/index.d.ts +1 -1
- package/lib/custom-html/custom-html.component.d.ts +9 -9
- package/lib/custom-html/custom-html.module.d.ts +16 -15
- package/lib/custom-html/custom-html.pipe.d.ts +10 -10
- package/lib/custom-html/index.d.ts +2 -2
- package/lib/drag-drop/drag-drop.directive.d.ts +14 -14
- package/lib/drag-drop/drag-drop.module.d.ts +9 -8
- package/lib/drag-drop/index.d.ts +1 -1
- package/lib/dynamic-component/dynamic-component.module.d.ts +8 -7
- package/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.d.ts +70 -70
- package/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.d.ts +11 -10
- package/lib/dynamic-component/index.d.ts +2 -2
- package/lib/dynamic-component/shared/dynamic-component.d.ts +88 -88
- package/lib/dynamic-component/shared/dynamic-component.interfaces.d.ts +3 -3
- package/lib/dynamic-component/shared/dynamic-component.service.d.ts +18 -18
- package/lib/dynamic-component/shared/index.d.ts +3 -3
- package/lib/entity/entity-selector/entity-selector.component.d.ts +92 -92
- package/lib/entity/entity-selector/entity-selector.module.d.ts +13 -12
- package/lib/entity/entity-table/entity-table-row.directive.d.ts +69 -69
- package/lib/entity/entity-table/entity-table.component.d.ts +275 -275
- package/lib/entity/entity-table/entity-table.module.d.ts +23 -22
- package/lib/entity/entity-table-paginator/entity-table-paginator.component.d.ts +49 -49
- package/lib/entity/entity-table-paginator/entity-table-paginator.interface.d.ts +8 -8
- package/lib/entity/entity-table-paginator/entity-table-paginator.module.d.ts +11 -10
- package/lib/entity/entity.module.d.ts +10 -9
- package/lib/entity/index.d.ts +5 -5
- package/lib/entity/shared/entity.enums.d.ts +22 -22
- package/lib/entity/shared/entity.interfaces.d.ts +88 -88
- package/lib/entity/shared/entity.utils.d.ts +49 -49
- package/lib/entity/shared/index.d.ts +9 -9
- package/lib/entity/shared/state.d.ts +103 -103
- package/lib/entity/shared/store.d.ts +176 -176
- package/lib/entity/shared/strategies/filter-custom-function.d.ts +51 -51
- package/lib/entity/shared/strategies/filter-selection.d.ts +48 -48
- package/lib/entity/shared/strategies/index.d.ts +3 -3
- package/lib/entity/shared/strategies/strategy.d.ts +56 -56
- package/lib/entity/shared/transaction.d.ts +168 -168
- package/lib/entity/shared/view.d.ts +193 -193
- package/lib/entity/shared/watcher.d.ts +72 -72
- package/lib/flexible/flexible.component.d.ts +41 -41
- package/lib/flexible/flexible.module.d.ts +9 -8
- package/lib/flexible/flexible.type.d.ts +2 -2
- package/lib/flexible/index.d.ts +2 -2
- package/lib/form/form/form.component.d.ts +53 -53
- package/lib/form/form/form.module.d.ts +12 -11
- package/lib/form/form-field/form-field-select.component.d.ts +48 -48
- package/lib/form/form-field/form-field-text.component.d.ts +41 -41
- package/lib/form/form-field/form-field-textarea.component.d.ts +41 -41
- package/lib/form/form-field/form-field.component.d.ts +34 -34
- package/lib/form/form-field/form-field.module.d.ts +21 -20
- package/lib/form/form-field/index.d.ts +4 -4
- package/lib/form/form-group/form-group.component.d.ts +49 -49
- package/lib/form/form-group/form-group.module.d.ts +14 -13
- package/lib/form/form.module.d.ts +13 -12
- package/lib/form/index.d.ts +4 -4
- package/lib/form/shared/form-field-component.d.ts +1 -1
- package/lib/form/shared/form-field.service.d.ts +19 -19
- package/lib/form/shared/form.interfaces.d.ts +57 -57
- package/lib/form/shared/form.service.d.ts +15 -15
- package/lib/form/shared/form.utils.d.ts +11 -11
- package/lib/form/shared/index.d.ts +5 -5
- package/lib/home-button/home-button.component.d.ts +9 -0
- package/lib/home-button/home-button.module.d.ts +15 -0
- package/lib/home-button/index.d.ts +1 -0
- package/lib/image/image.module.d.ts +9 -8
- package/lib/image/index.d.ts +1 -1
- package/lib/image/secure-image.pipe.d.ts +11 -11
- package/lib/interactive-tour/index.d.ts +4 -4
- package/lib/interactive-tour/interactive-tour.component.d.ts +30 -30
- package/lib/interactive-tour/interactive-tour.interface.d.ts +32 -32
- package/lib/interactive-tour/interactive-tour.loader.d.ts +18 -18
- package/lib/interactive-tour/interactive-tour.module.d.ts +12 -11
- package/lib/interactive-tour/interactive-tour.service.d.ts +29 -29
- package/lib/json-dialog/index.d.ts +2 -2
- package/lib/json-dialog/json-dialog.component.d.ts +13 -13
- package/lib/json-dialog/json-dialog.module.d.ts +13 -12
- package/lib/json-dialog/json-dialog.service.d.ts +10 -10
- package/lib/keyvalue/index.d.ts +1 -1
- package/lib/keyvalue/keyvalue.module.d.ts +9 -8
- package/lib/keyvalue/keyvalue.pipe.d.ts +7 -7
- package/lib/list/index.d.ts +2 -2
- package/lib/list/list-item.directive.d.ts +43 -43
- package/lib/list/list.component.d.ts +51 -51
- package/lib/list/list.module.d.ts +14 -13
- package/lib/panel/index.d.ts +1 -1
- package/lib/panel/panel.component.d.ts +11 -11
- package/lib/panel/panel.module.d.ts +8 -7
- package/lib/sidenav/index.d.ts +1 -1
- package/lib/sidenav/sidenav-shim.directive.d.ts +20 -20
- package/lib/sidenav/sidenav.module.d.ts +9 -8
- package/lib/spinner/index.d.ts +2 -2
- package/lib/spinner/spinner-activity.directive.d.ts +32 -32
- package/lib/spinner/spinner.component.d.ts +12 -12
- package/lib/spinner/spinner.module.d.ts +10 -9
- package/lib/stop-propagation/index.d.ts +2 -2
- package/lib/stop-propagation/stop-drop-propagation.directive.d.ts +6 -6
- package/lib/stop-propagation/stop-propagation.directive.d.ts +6 -6
- package/lib/stop-propagation/stop-propagation.module.d.ts +10 -9
- package/lib/table/index.d.ts +5 -5
- package/lib/table/table-action-color.enum.d.ts +5 -5
- package/lib/table/table-database.d.ts +10 -10
- package/lib/table/table-datasource.d.ts +17 -17
- package/lib/table/table-model.interface.d.ts +28 -28
- package/lib/table/table.component.d.ts +40 -40
- package/lib/table/table.module.d.ts +20 -19
- package/lib/tool/index.d.ts +2 -2
- package/lib/tool/shared/index.d.ts +5 -5
- package/lib/tool/shared/tool-component.d.ts +2 -2
- package/lib/tool/shared/tool.interface.d.ts +18 -18
- package/lib/tool/shared/tool.service.d.ts +30 -30
- package/lib/tool/shared/toolbox.d.ts +95 -95
- package/lib/tool/shared/toolbox.enums.d.ts +5 -5
- package/lib/tool/tool.module.d.ts +10 -9
- package/lib/tool/toolbox/toolbox.animation.d.ts +2 -2
- package/lib/tool/toolbox/toolbox.component.d.ts +127 -127
- package/lib/tool/toolbox/toolbox.module.d.ts +13 -12
- package/lib/widget/index.d.ts +2 -2
- package/lib/widget/shared/index.d.ts +3 -3
- package/lib/widget/shared/widget.d.ts +4 -4
- package/lib/widget/shared/widget.interfaces.d.ts +12 -12
- package/lib/widget/shared/widget.service.d.ts +10 -10
- package/lib/widget/widget-outlet/widget-outlet.component.d.ts +71 -71
- package/lib/widget/widget-outlet/widget-outlet.module.d.ts +12 -11
- package/lib/widget/widget.module.d.ts +8 -7
- package/lib/workspace/index.d.ts +3 -3
- package/lib/workspace/shared/index.d.ts +3 -3
- package/lib/workspace/shared/store.d.ts +20 -20
- package/lib/workspace/shared/workspace.d.ts +108 -108
- package/lib/workspace/shared/workspace.interfaces.d.ts +11 -11
- package/lib/workspace/workspace-selector/workspace-selector.component.d.ts +35 -35
- package/lib/workspace/workspace-selector/workspace-selector.module.d.ts +12 -11
- package/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.d.ts +57 -57
- package/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.d.ts +12 -11
- package/lib/workspace/workspace.module.d.ts +9 -8
- package/package.json +8 -7
- package/public_api.d.ts +68 -66
- package/style/common.theming.scss +12 -236
- package/style/partial/action.scss +18 -18
- package/style/partial/common.variables.scss +8 -8
- package/bundles/igo2-common.umd.min.js +0 -17
- package/bundles/igo2-common.umd.min.js.map +0 -1
|
@@ -1,288 +1,288 @@
|
|
|
1
|
-
import { BehaviorSubject } from 'rxjs';
|
|
2
|
-
import { EntityStateManager } from './state';
|
|
3
|
-
import { EntityView } from './view';
|
|
4
|
-
import { getEntityId, getEntityProperty } from './entity.utils';
|
|
5
|
-
/**
|
|
6
|
-
* An entity store class holds any number of entities
|
|
7
|
-
* as well as their state. It can be observed, filtered and sorted and
|
|
8
|
-
* provides methods to insert, update or delete entities.
|
|
9
|
-
*/
|
|
10
|
-
export class EntityStore {
|
|
11
|
-
constructor(entities, options = {}) {
|
|
12
|
-
/**
|
|
13
|
-
* Observable of the raw entities
|
|
14
|
-
*/
|
|
15
|
-
this.entities$ = new BehaviorSubject([]);
|
|
16
|
-
/**
|
|
17
|
-
* Number of entities
|
|
18
|
-
*/
|
|
19
|
-
this.count$ = new BehaviorSubject(0);
|
|
20
|
-
/**
|
|
21
|
-
* Whether the store is empty
|
|
22
|
-
*/
|
|
23
|
-
this.empty$ = new BehaviorSubject(true);
|
|
24
|
-
this._pristine = true;
|
|
25
|
-
/**
|
|
26
|
-
* Strategies
|
|
27
|
-
*/
|
|
28
|
-
this.strategies = [];
|
|
29
|
-
this.getKey = options.getKey ? options.getKey : getEntityId;
|
|
30
|
-
this.getProperty = options.getProperty ? options.getProperty : getEntityProperty;
|
|
31
|
-
this.state = this.createStateManager();
|
|
32
|
-
this.view = this.createDataView();
|
|
33
|
-
this.stateView = this.createStateView();
|
|
34
|
-
this.view.lift();
|
|
35
|
-
this.stateView.lift();
|
|
36
|
-
if (entities.length > 0) {
|
|
37
|
-
this.load(entities);
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
this._index = this.generateIndex(entities);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
get count() { return this.count$.value; }
|
|
44
|
-
get empty() { return this.empty$.value; }
|
|
45
|
-
/**
|
|
46
|
-
* Store index
|
|
47
|
-
*/
|
|
48
|
-
get index() { return this._index; }
|
|
49
|
-
/**
|
|
50
|
-
* Store index
|
|
51
|
-
*/
|
|
52
|
-
get pristine() { return this._pristine; }
|
|
53
|
-
/**
|
|
54
|
-
* Get an entity from the store by key
|
|
55
|
-
* @param key Key
|
|
56
|
-
* @returns Entity
|
|
57
|
-
*/
|
|
58
|
-
get(key) {
|
|
59
|
-
return this.index.get(key);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Get all entities in the store
|
|
63
|
-
* @returns Array of entities
|
|
64
|
-
*/
|
|
65
|
-
all() {
|
|
66
|
-
return this.entities$.value;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Set this store's entities
|
|
70
|
-
* @param entities Entities
|
|
71
|
-
*/
|
|
72
|
-
load(entities, pristine = true) {
|
|
73
|
-
this._index = this.generateIndex(entities);
|
|
74
|
-
this._pristine = pristine;
|
|
75
|
-
this.next();
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Clear the store's entities but keep the state and views intact.
|
|
79
|
-
* Views won't return any data but future data will be subject to the
|
|
80
|
-
* current views filter and sort
|
|
81
|
-
*/
|
|
82
|
-
softClear() {
|
|
83
|
-
if (this.index && this.index.size > 0) {
|
|
84
|
-
this.index.clear();
|
|
85
|
-
this._pristine = true;
|
|
86
|
-
this.next();
|
|
87
|
-
}
|
|
88
|
-
else if (this.index) {
|
|
89
|
-
this.updateCount();
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Clear the store's entities, state and views
|
|
94
|
-
*/
|
|
95
|
-
clear() {
|
|
96
|
-
this.stateView.clear();
|
|
97
|
-
this.view.clear();
|
|
98
|
-
this.state.clear();
|
|
99
|
-
this.softClear();
|
|
100
|
-
}
|
|
101
|
-
destroy() {
|
|
102
|
-
this.stateView.destroy();
|
|
103
|
-
this.view.destroy();
|
|
104
|
-
this.clear();
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Insert an entity into the store
|
|
108
|
-
* @param entity Entity
|
|
109
|
-
*/
|
|
110
|
-
insert(entity) {
|
|
111
|
-
this.insertMany([entity]);
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Insert many entities into the store
|
|
115
|
-
* @param entities Entities
|
|
116
|
-
*/
|
|
117
|
-
insertMany(entities) {
|
|
118
|
-
entities.forEach((entity) => this.index.set(this.getKey(entity), entity));
|
|
119
|
-
this._pristine = false;
|
|
120
|
-
this.next();
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Update or insert an entity into the store
|
|
124
|
-
* @param entity Entity
|
|
125
|
-
*/
|
|
126
|
-
update(entity) {
|
|
127
|
-
this.updateMany([entity]);
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Update or insert many entities into the store
|
|
131
|
-
* @param entities Entities
|
|
132
|
-
*/
|
|
133
|
-
updateMany(entities) {
|
|
134
|
-
entities.forEach((entity) => this.index.set(this.getKey(entity), entity));
|
|
135
|
-
this._pristine = false;
|
|
136
|
-
this.next();
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Delete an entity from the store
|
|
140
|
-
* @param entity Entity
|
|
141
|
-
*/
|
|
142
|
-
delete(entity) {
|
|
143
|
-
this.deleteMany([entity]);
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Delete many entities from the store
|
|
147
|
-
* @param entities Entities
|
|
148
|
-
*/
|
|
149
|
-
deleteMany(entities) {
|
|
150
|
-
entities.forEach((entity) => this.index.delete(this.getKey(entity)));
|
|
151
|
-
this._pristine = false;
|
|
152
|
-
this.next();
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Add a strategy to this store
|
|
156
|
-
* @param strategy Entity store strategy
|
|
157
|
-
* @returns Entity store
|
|
158
|
-
*/
|
|
159
|
-
addStrategy(strategy, activate = false) {
|
|
160
|
-
const existingStrategy = this.strategies.find((_strategy) => {
|
|
161
|
-
return strategy.constructor === _strategy.constructor;
|
|
162
|
-
});
|
|
163
|
-
if (existingStrategy !== undefined) {
|
|
164
|
-
throw new Error('A strategy of this type already exists on that EntityStore.');
|
|
165
|
-
}
|
|
166
|
-
this.strategies.push(strategy);
|
|
167
|
-
strategy.bindStore(this);
|
|
168
|
-
if (activate === true) {
|
|
169
|
-
strategy.activate();
|
|
170
|
-
}
|
|
171
|
-
return this;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Remove a strategy from this store
|
|
175
|
-
* @param strategy Entity store strategy
|
|
176
|
-
* @returns Entity store
|
|
177
|
-
*/
|
|
178
|
-
removeStrategy(strategy) {
|
|
179
|
-
const index = this.strategies.indexOf(strategy);
|
|
180
|
-
if (index >= 0) {
|
|
181
|
-
this.strategies.splice(index, 1);
|
|
182
|
-
strategy.unbindStore(this);
|
|
183
|
-
}
|
|
184
|
-
return this;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Return strategies of a given type
|
|
188
|
-
* @param type Entity store strategy class
|
|
189
|
-
* @returns Strategies
|
|
190
|
-
*/
|
|
191
|
-
getStrategyOfType(type) {
|
|
192
|
-
return this.strategies.find((strategy) => {
|
|
193
|
-
return strategy instanceof type;
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Activate strategies of a given type
|
|
198
|
-
* @param type Entity store strategy class
|
|
199
|
-
*/
|
|
200
|
-
activateStrategyOfType(type) {
|
|
201
|
-
const strategy = this.getStrategyOfType(type);
|
|
202
|
-
if (strategy !== undefined) {
|
|
203
|
-
strategy.activate();
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Deactivate strategies of a given type
|
|
208
|
-
* @param type Entity store strategy class
|
|
209
|
-
*/
|
|
210
|
-
deactivateStrategyOfType(type) {
|
|
211
|
-
const strategy = this.getStrategyOfType(type);
|
|
212
|
-
if (strategy !== undefined) {
|
|
213
|
-
strategy.deactivate();
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Generate a complete index of all the entities
|
|
218
|
-
* @param entities Entities
|
|
219
|
-
* @returns Index
|
|
220
|
-
*/
|
|
221
|
-
generateIndex(entities) {
|
|
222
|
-
const entries = entities.map((entity) => [this.getKey(entity), entity]);
|
|
223
|
-
return new Map(entries);
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Push the index's entities into the entities$ observable
|
|
227
|
-
*/
|
|
228
|
-
next() {
|
|
229
|
-
this.entities$.next(Array.from(this.index.values()));
|
|
230
|
-
this.updateCount();
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Update the store's count and empty
|
|
234
|
-
*/
|
|
235
|
-
updateCount() {
|
|
236
|
-
const count = this.index.size;
|
|
237
|
-
const empty = count === 0;
|
|
238
|
-
this.count$.next(count);
|
|
239
|
-
this.empty$.next(empty);
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Create the entity state manager
|
|
243
|
-
* @returns EntityStateManager
|
|
244
|
-
*/
|
|
245
|
-
createStateManager() {
|
|
246
|
-
return new EntityStateManager({ store: this });
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Create the data view
|
|
250
|
-
* @returns EntityView<E>
|
|
251
|
-
*/
|
|
252
|
-
createDataView() {
|
|
253
|
-
return new EntityView(this.entities$);
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Create the state view
|
|
257
|
-
* @returns EntityView<EntityRecord<E>>
|
|
258
|
-
*/
|
|
259
|
-
createStateView() {
|
|
260
|
-
return new EntityView(this.view.all$())
|
|
261
|
-
.join({
|
|
262
|
-
source: this.state.change$,
|
|
263
|
-
reduce: (entity) => {
|
|
264
|
-
const key = this.getKey(entity);
|
|
265
|
-
const state = this.state.get(entity);
|
|
266
|
-
const currentRecord = this.stateView.get(key);
|
|
267
|
-
if (currentRecord !== undefined &&
|
|
268
|
-
currentRecord.entity === entity &&
|
|
269
|
-
this.statesAreTheSame(currentRecord.state, state)) {
|
|
270
|
-
return currentRecord;
|
|
271
|
-
}
|
|
272
|
-
const revision = currentRecord ? currentRecord.revision + 1 : 1;
|
|
273
|
-
const ref = `${key}-${revision}`;
|
|
274
|
-
return { entity, state, revision, ref };
|
|
275
|
-
}
|
|
276
|
-
})
|
|
277
|
-
.createIndex((record) => this.getKey(record.entity));
|
|
278
|
-
}
|
|
279
|
-
statesAreTheSame(currentState, newState) {
|
|
280
|
-
if (currentState === newState) {
|
|
281
|
-
return true;
|
|
282
|
-
}
|
|
283
|
-
const currentStateIsEmpty = Object.keys(currentState).length === 0;
|
|
284
|
-
const newStateIsEmpty = Object.keys(newState).length === 0;
|
|
285
|
-
return currentStateIsEmpty && newStateIsEmpty;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiL3Nydi9hcHBzL2lnbzItbGliL3BhY2thZ2VzL2NvbW1vbi9zcmMvIiwic291cmNlcyI6WyJsaWIvZW50aXR5L3NoYXJlZC9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdoRTs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUE2RHRCLFlBQVksUUFBYSxFQUFFLFVBQThCLEVBQUU7UUEzRDNEOztXQUVHO1FBQ00sY0FBUyxHQUFHLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRWxEOztXQUVHO1FBQ00sV0FBTSxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBR2pEOztXQUVHO1FBQ00sV0FBTSxHQUFHLElBQUksZUFBZSxDQUFVLElBQUksQ0FBQyxDQUFDO1FBc0M3QyxjQUFTLEdBQVksSUFBSSxDQUFDO1FBRWxDOztXQUVHO1FBQ0ssZUFBVSxHQUEwQixFQUFFLENBQUM7UUFHN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUVqRixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV0QixJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDckI7YUFBTTtZQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7SUFsRUQsSUFBSSxLQUFLLEtBQWEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFNakQsSUFBSSxLQUFLLEtBQWMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUEyQmxEOztPQUVHO0lBQ0gsSUFBSSxLQUFLLEtBQXdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFHdEQ7O09BRUc7SUFDSCxJQUFJLFFBQVEsS0FBYyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBMEJsRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLEdBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksQ0FBQyxRQUFhLEVBQUUsV0FBb0IsSUFBSTtRQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTO1FBQ1AsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNiO2FBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxNQUFTO1FBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxRQUFhO1FBQ3RCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE1BQVM7UUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVSxDQUFDLFFBQWE7UUFDdEIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsTUFBUztRQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsUUFBYTtRQUN0QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxRQUE2QixFQUFFLFdBQW9CLEtBQUs7UUFDbEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQThCLEVBQUUsRUFBRTtZQUMvRSxPQUFPLFFBQVEsQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztTQUNoRjtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekIsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQ3JCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNyQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsUUFBNkI7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsSUFBZ0M7UUFDaEQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQTZCLEVBQUUsRUFBRTtZQUM1RCxPQUFPLFFBQVEsWUFBWSxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsc0JBQXNCLENBQUMsSUFBZ0M7UUFDckQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUMxQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsd0JBQXdCLENBQUMsSUFBZ0M7UUFDdkQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUMxQixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGFBQWEsQ0FBQyxRQUFhO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBMkIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNLLElBQUk7UUFDVixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzlCLE1BQU0sS0FBSyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQjtRQUN4QixPQUFPLElBQUksa0JBQWtCLENBQU8sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYztRQUNwQixPQUFPLElBQUksVUFBVSxDQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZUFBZTtRQUNyQixPQUFPLElBQUksVUFBVSxDQUF3QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzNELElBQUksQ0FBQztZQUNKLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDMUIsTUFBTSxFQUFFLENBQUMsTUFBUyxFQUFzQixFQUFFO2dCQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRTlDLElBQ0UsYUFBYSxLQUFLLFNBQVM7b0JBQzNCLGFBQWEsQ0FBQyxNQUFNLEtBQUssTUFBTTtvQkFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQ2pEO29CQUNBLE9BQU8sYUFBYSxDQUFDO2lCQUN0QjtnQkFFRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFDLENBQUM7WUFDeEMsQ0FBQztTQUNGLENBQUM7YUFDRCxXQUFXLENBQUMsQ0FBQyxNQUEwQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxZQUFlLEVBQUUsUUFBVztRQUNuRCxJQUFJLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBQ25FLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUMzRCxPQUFPLG1CQUFtQixJQUFJLGVBQWUsQ0FBQztJQUNoRCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRW50aXR5U3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZSc7XG5pbXBvcnQgeyBFbnRpdHlWaWV3IH0gZnJvbSAnLi92aWV3JztcbmltcG9ydCB7IEVudGl0eUtleSwgRW50aXR5U3RhdGUsIEVudGl0eVJlY29yZCwgRW50aXR5U3RvcmVPcHRpb25zIH0gZnJvbSAnLi9lbnRpdHkuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRFbnRpdHlJZCwgZ2V0RW50aXR5UHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS51dGlscyc7XG5pbXBvcnQgeyBFbnRpdHlTdG9yZVN0cmF0ZWd5IH0gZnJvbSAnLi9zdHJhdGVnaWVzL3N0cmF0ZWd5JztcblxuLyoqXG4gKiBBbiBlbnRpdHkgc3RvcmUgY2xhc3MgaG9sZHMgYW55IG51bWJlciBvZiBlbnRpdGllc1xuICogYXMgd2VsbCBhcyB0aGVpciBzdGF0ZS4gSXQgY2FuIGJlIG9ic2VydmVkLCBmaWx0ZXJlZCBhbmQgc29ydGVkIGFuZFxuICogcHJvdmlkZXMgbWV0aG9kcyB0byBpbnNlcnQsIHVwZGF0ZSBvciBkZWxldGUgZW50aXRpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnRpdHlTdG9yZTxFIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0LCBTIGV4dGVuZHMgRW50aXR5U3RhdGUgPSBFbnRpdHlTdGF0ZT4ge1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIHRoZSByYXcgZW50aXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGVudGl0aWVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RVtdPihbXSk7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBlbnRpdGllc1xuICAgKi9cbiAgcmVhZG9ubHkgY291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBnZXQgY291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuY291bnQkLnZhbHVlOyB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5XG4gICAqL1xuICByZWFkb25seSBlbXB0eSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmVtcHR5JC52YWx1ZTsgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHkgc3RvcmUgc3RhdGVcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlOiBFbnRpdHlTdGF0ZU1hbmFnZXI8RSwgUz47XG5cbiAgLyoqXG4gICAqIFZpZXcgb2YgYWxsIHRoZSBlbnRpdGllc1xuICAgKi9cbiAgcmVhZG9ubHkgdmlldzogRW50aXR5VmlldzxFPjtcblxuICAvKipcbiAgICogVmlldyBvZiBhbGwgdGhlIGVudGl0aWVzIGFuZCB0aGVpciBzdGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVWaWV3OiBFbnRpdHlWaWV3PEUsIEVudGl0eVJlY29yZDxFLCBTPj47XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBnZXQgYW4gZW50aXR5J3MgaWRcbiAgICovXG4gIHJlYWRvbmx5IGdldEtleTogKEUpID0+IEVudGl0eUtleTtcblxuICAvKipcbiAgICogTWV0aG9kIHRvIGdldCBhbiBlbnRpdHkncyBuYW1lZCBwcm9wZXJ0eVxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0UHJvcGVydHk6IChFLCBwcm9wOiBzdHJpbmcpID0+IGFueTtcblxuICAvKipcbiAgICogU3RvcmUgaW5kZXhcbiAgICovXG4gIGdldCBpbmRleCgpOiBNYXA8RW50aXR5S2V5LCBFPiB7IHJldHVybiB0aGlzLl9pbmRleDsgfVxuICBwcml2YXRlIF9pbmRleDogTWFwPEVudGl0eUtleSwgRT47XG5cbiAgLyoqXG4gICAqIFN0b3JlIGluZGV4XG4gICAqL1xuICBnZXQgcHJpc3RpbmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9wcmlzdGluZTsgfVxuICBwcml2YXRlIF9wcmlzdGluZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFN0cmF0ZWdpZXNcbiAgICovXG4gIHByaXZhdGUgc3RyYXRlZ2llczogRW50aXR5U3RvcmVTdHJhdGVneVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoZW50aXRpZXM6IEVbXSwgb3B0aW9uczogRW50aXR5U3RvcmVPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmdldEtleSA9IG9wdGlvbnMuZ2V0S2V5ID8gb3B0aW9ucy5nZXRLZXkgOiBnZXRFbnRpdHlJZDtcbiAgICB0aGlzLmdldFByb3BlcnR5ID0gb3B0aW9ucy5nZXRQcm9wZXJ0eSA/IG9wdGlvbnMuZ2V0UHJvcGVydHkgOiBnZXRFbnRpdHlQcm9wZXJ0eTtcblxuICAgIHRoaXMuc3RhdGUgPSB0aGlzLmNyZWF0ZVN0YXRlTWFuYWdlcigpO1xuICAgIHRoaXMudmlldyA9IHRoaXMuY3JlYXRlRGF0YVZpZXcoKTtcbiAgICB0aGlzLnN0YXRlVmlldyA9IHRoaXMuY3JlYXRlU3RhdGVWaWV3KCk7XG5cbiAgICB0aGlzLnZpZXcubGlmdCgpO1xuICAgIHRoaXMuc3RhdGVWaWV3LmxpZnQoKTtcblxuICAgIGlmIChlbnRpdGllcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvYWQoZW50aXRpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pbmRleCA9IHRoaXMuZ2VuZXJhdGVJbmRleChlbnRpdGllcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBlbnRpdHkgZnJvbSB0aGUgc3RvcmUgYnkga2V5XG4gICAqIEBwYXJhbSBrZXkgS2V5XG4gICAqIEByZXR1cm5zIEVudGl0eVxuICAgKi9cbiAgZ2V0KGtleTogRW50aXR5S2V5KTogRSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXguZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnRpdGllcyBpbiB0aGUgc3RvcmVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgZW50aXRpZXNcbiAgICovXG4gIGFsbCgpOiBFW10ge1xuICAgIHJldHVybiB0aGlzLmVudGl0aWVzJC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBzdG9yZSdzIGVudGl0aWVzXG4gICAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllc1xuICAgKi9cbiAgbG9hZChlbnRpdGllczogRVtdLCBwcmlzdGluZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLl9pbmRleCA9IHRoaXMuZ2VuZXJhdGVJbmRleChlbnRpdGllcyk7XG4gICAgdGhpcy5fcHJpc3RpbmUgPSBwcmlzdGluZTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgc3RvcmUncyBlbnRpdGllcyBidXQga2VlcCB0aGUgc3RhdGUgYW5kIHZpZXdzIGludGFjdC5cbiAgICogVmlld3Mgd29uJ3QgcmV0dXJuIGFueSBkYXRhIGJ1dCBmdXR1cmUgZGF0YSB3aWxsIGJlIHN1YmplY3QgdG8gdGhlXG4gICAqIGN1cnJlbnQgdmlld3MgZmlsdGVyIGFuZCBzb3J0XG4gICAqL1xuICBzb2Z0Q2xlYXIoKSB7XG4gICAgaWYgKHRoaXMuaW5kZXggJiYgdGhpcy5pbmRleC5zaXplID4gMCkge1xuICAgICAgdGhpcy5pbmRleC5jbGVhcigpO1xuICAgICAgdGhpcy5fcHJpc3RpbmUgPSB0cnVlO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmluZGV4KSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvdW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBzdG9yZSdzIGVudGl0aWVzLCBzdGF0ZSBhbmQgdmlld3NcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuc3RhdGVWaWV3LmNsZWFyKCk7XG4gICAgdGhpcy52aWV3LmNsZWFyKCk7XG4gICAgdGhpcy5zdGF0ZS5jbGVhcigpO1xuICAgIHRoaXMuc29mdENsZWFyKCk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuc3RhdGVWaWV3LmRlc3Ryb3koKTtcbiAgICB0aGlzLnZpZXcuZGVzdHJveSgpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgYW4gZW50aXR5IGludG8gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBlbnRpdHkgRW50aXR5XG4gICAqL1xuICBpbnNlcnQoZW50aXR5OiBFKSB7XG4gICAgdGhpcy5pbnNlcnRNYW55KFtlbnRpdHldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgbWFueSBlbnRpdGllcyBpbnRvIHRoZSBzdG9yZVxuICAgKiBAcGFyYW0gZW50aXRpZXMgRW50aXRpZXNcbiAgICovXG4gIGluc2VydE1hbnkoZW50aXRpZXM6IEVbXSkge1xuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRSkgPT4gdGhpcy5pbmRleC5zZXQodGhpcy5nZXRLZXkoZW50aXR5KSwgZW50aXR5KSk7XG4gICAgdGhpcy5fcHJpc3RpbmUgPSBmYWxzZTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgb3IgaW5zZXJ0IGFuIGVudGl0eSBpbnRvIHRoZSBzdG9yZVxuICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eVxuICAgKi9cbiAgdXBkYXRlKGVudGl0eTogRSkge1xuICAgIHRoaXMudXBkYXRlTWFueShbZW50aXR5XSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG9yIGluc2VydCBtYW55IGVudGl0aWVzIGludG8gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllc1xuICAgKi9cbiAgdXBkYXRlTWFueShlbnRpdGllczogRVtdKSB7XG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5OiBFKSA9PiB0aGlzLmluZGV4LnNldCh0aGlzLmdldEtleShlbnRpdHkpLCBlbnRpdHkpKTtcbiAgICB0aGlzLl9wcmlzdGluZSA9IGZhbHNlO1xuICAgIHRoaXMubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBlbnRpdHkgZnJvbSB0aGUgc3RvcmVcbiAgICogQHBhcmFtIGVudGl0eSBFbnRpdHlcbiAgICovXG4gIGRlbGV0ZShlbnRpdHk6IEUpIHtcbiAgICB0aGlzLmRlbGV0ZU1hbnkoW2VudGl0eV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBtYW55IGVudGl0aWVzIGZyb20gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllc1xuICAgKi9cbiAgZGVsZXRlTWFueShlbnRpdGllczogRVtdKSB7XG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5OiBFKSA9PiB0aGlzLmluZGV4LmRlbGV0ZSh0aGlzLmdldEtleShlbnRpdHkpKSk7XG4gICAgdGhpcy5fcHJpc3RpbmUgPSBmYWxzZTtcbiAgICB0aGlzLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzdHJhdGVneSB0byB0aGlzIHN0b3JlXG4gICAqIEBwYXJhbSBzdHJhdGVneSBFbnRpdHkgc3RvcmUgc3RyYXRlZ3lcbiAgICogQHJldHVybnMgRW50aXR5IHN0b3JlXG4gICAqL1xuICBhZGRTdHJhdGVneShzdHJhdGVneTogRW50aXR5U3RvcmVTdHJhdGVneSwgYWN0aXZhdGU6IGJvb2xlYW4gPSBmYWxzZSk6IEVudGl0eVN0b3JlIHtcbiAgICBjb25zdCBleGlzdGluZ1N0cmF0ZWd5ID0gdGhpcy5zdHJhdGVnaWVzLmZpbmQoKF9zdHJhdGVneTogRW50aXR5U3RvcmVTdHJhdGVneSkgPT4ge1xuICAgICAgcmV0dXJuIHN0cmF0ZWd5LmNvbnN0cnVjdG9yID09PSBfc3RyYXRlZ3kuY29uc3RydWN0b3I7XG4gICAgfSk7XG4gICAgaWYgKGV4aXN0aW5nU3RyYXRlZ3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHN0cmF0ZWd5IG9mIHRoaXMgdHlwZSBhbHJlYWR5IGV4aXN0cyBvbiB0aGF0IEVudGl0eVN0b3JlLicpO1xuICAgIH1cblxuICAgIHRoaXMuc3RyYXRlZ2llcy5wdXNoKHN0cmF0ZWd5KTtcbiAgICBzdHJhdGVneS5iaW5kU3RvcmUodGhpcyk7XG5cbiAgICBpZiAoYWN0aXZhdGUgPT09IHRydWUpIHtcbiAgICAgIHN0cmF0ZWd5LmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgc3RyYXRlZ3kgZnJvbSB0aGlzIHN0b3JlXG4gICAqIEBwYXJhbSBzdHJhdGVneSBFbnRpdHkgc3RvcmUgc3RyYXRlZ3lcbiAgICogQHJldHVybnMgRW50aXR5IHN0b3JlXG4gICAqL1xuICByZW1vdmVTdHJhdGVneShzdHJhdGVneTogRW50aXR5U3RvcmVTdHJhdGVneSk6IEVudGl0eVN0b3JlIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc3RyYXRlZ2llcy5pbmRleE9mKHN0cmF0ZWd5KTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5zdHJhdGVnaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBzdHJhdGVneS51bmJpbmRTdG9yZSh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHN0cmF0ZWdpZXMgb2YgYSBnaXZlbiB0eXBlXG4gICAqIEBwYXJhbSB0eXBlIEVudGl0eSBzdG9yZSBzdHJhdGVneSBjbGFzc1xuICAgKiBAcmV0dXJucyBTdHJhdGVnaWVzXG4gICAqL1xuICBnZXRTdHJhdGVneU9mVHlwZSh0eXBlOiB0eXBlb2YgRW50aXR5U3RvcmVTdHJhdGVneSk6IEVudGl0eVN0b3JlU3RyYXRlZ3kge1xuICAgIHJldHVybiB0aGlzLnN0cmF0ZWdpZXMuZmluZCgoc3RyYXRlZ3k6IEVudGl0eVN0b3JlU3RyYXRlZ3kpID0+IHtcbiAgICAgIHJldHVybiBzdHJhdGVneSBpbnN0YW5jZW9mIHR5cGU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgc3RyYXRlZ2llcyBvZiBhIGdpdmVuIHR5cGVcbiAgICogQHBhcmFtIHR5cGUgRW50aXR5IHN0b3JlIHN0cmF0ZWd5IGNsYXNzXG4gICAqL1xuICBhY3RpdmF0ZVN0cmF0ZWd5T2ZUeXBlKHR5cGU6IHR5cGVvZiBFbnRpdHlTdG9yZVN0cmF0ZWd5KSB7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLmdldFN0cmF0ZWd5T2ZUeXBlKHR5cGUpO1xuICAgIGlmIChzdHJhdGVneSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdHJhdGVneS5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlIHN0cmF0ZWdpZXMgb2YgYSBnaXZlbiB0eXBlXG4gICAqIEBwYXJhbSB0eXBlIEVudGl0eSBzdG9yZSBzdHJhdGVneSBjbGFzc1xuICAgKi9cbiAgZGVhY3RpdmF0ZVN0cmF0ZWd5T2ZUeXBlKHR5cGU6IHR5cGVvZiBFbnRpdHlTdG9yZVN0cmF0ZWd5KSB7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLmdldFN0cmF0ZWd5T2ZUeXBlKHR5cGUpO1xuICAgIGlmIChzdHJhdGVneSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdHJhdGVneS5kZWFjdGl2YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgY29tcGxldGUgaW5kZXggb2YgYWxsIHRoZSBlbnRpdGllc1xuICAgKiBAcGFyYW0gZW50aXRpZXMgRW50aXRpZXNcbiAgICogQHJldHVybnMgSW5kZXhcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVJbmRleChlbnRpdGllczogRVtdKTogTWFwPEVudGl0eUtleSwgRT4ge1xuICAgIGNvbnN0IGVudHJpZXMgPSBlbnRpdGllcy5tYXAoKGVudGl0eTogRSkgPT4gW3RoaXMuZ2V0S2V5KGVudGl0eSksIGVudGl0eV0pO1xuICAgIHJldHVybiBuZXcgTWFwKGVudHJpZXMgYXMgW0VudGl0eUtleSwgRV1bXSk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCB0aGUgaW5kZXgncyBlbnRpdGllcyBpbnRvIHRoZSBlbnRpdGllcyQgb2JzZXJ2YWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBuZXh0KCkge1xuICAgIHRoaXMuZW50aXRpZXMkLm5leHQoQXJyYXkuZnJvbSh0aGlzLmluZGV4LnZhbHVlcygpKSk7XG4gICAgdGhpcy51cGRhdGVDb3VudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc3RvcmUncyBjb3VudCBhbmQgZW1wdHlcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ291bnQoKSB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLmluZGV4LnNpemU7XG4gICAgY29uc3QgZW1wdHkgPSBjb3VudCA9PT0gMDtcbiAgICB0aGlzLmNvdW50JC5uZXh0KGNvdW50KTtcbiAgICB0aGlzLmVtcHR5JC5uZXh0KGVtcHR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGVudGl0eSBzdGF0ZSBtYW5hZ2VyXG4gICAqIEByZXR1cm5zIEVudGl0eVN0YXRlTWFuYWdlclxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0ZU1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBFbnRpdHlTdGF0ZU1hbmFnZXI8RSwgUz4oe3N0b3JlOiB0aGlzfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBkYXRhIHZpZXdcbiAgICogQHJldHVybnMgRW50aXR5VmlldzxFPlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhVmlldygpIHtcbiAgICByZXR1cm4gbmV3IEVudGl0eVZpZXc8RT4odGhpcy5lbnRpdGllcyQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgc3RhdGUgdmlld1xuICAgKiBAcmV0dXJucyBFbnRpdHlWaWV3PEVudGl0eVJlY29yZDxFPj5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU3RhdGVWaWV3KCkge1xuICAgIHJldHVybiBuZXcgRW50aXR5VmlldzxFLCBFbnRpdHlSZWNvcmQ8RSwgUz4+KHRoaXMudmlldy5hbGwkKCkpXG4gICAgICAuam9pbih7XG4gICAgICAgIHNvdXJjZTogdGhpcy5zdGF0ZS5jaGFuZ2UkLFxuICAgICAgICByZWR1Y2U6IChlbnRpdHk6IEUpOiBFbnRpdHlSZWNvcmQ8RSwgUz4gPT4ge1xuICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KGVudGl0eSk7XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlLmdldChlbnRpdHkpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZWNvcmQgPSB0aGlzLnN0YXRlVmlldy5nZXQoa2V5KTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGN1cnJlbnRSZWNvcmQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgY3VycmVudFJlY29yZC5lbnRpdHkgPT09IGVudGl0eSAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZXNBcmVUaGVTYW1lKGN1cnJlbnRSZWNvcmQuc3RhdGUsIHN0YXRlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSZWNvcmQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmV2aXNpb24gPSBjdXJyZW50UmVjb3JkID8gY3VycmVudFJlY29yZC5yZXZpc2lvbiArIDEgOiAxO1xuICAgICAgICAgIGNvbnN0IHJlZiA9IGAke2tleX0tJHtyZXZpc2lvbn1gO1xuICAgICAgICAgIHJldHVybiB7ZW50aXR5LCBzdGF0ZSwgcmV2aXNpb24sIHJlZn07XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY3JlYXRlSW5kZXgoKHJlY29yZDogRW50aXR5UmVjb3JkPEUsIFM+KSA9PiB0aGlzLmdldEtleShyZWNvcmQuZW50aXR5KSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRlc0FyZVRoZVNhbWUoY3VycmVudFN0YXRlOiBTLCBuZXdTdGF0ZTogUyk6IGJvb2xlYW4ge1xuICAgIGlmIChjdXJyZW50U3RhdGUgPT09IG5ld1N0YXRlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50U3RhdGVJc0VtcHR5ID0gT2JqZWN0LmtleXMoY3VycmVudFN0YXRlKS5sZW5ndGggPT09IDA7XG4gICAgY29uc3QgbmV3U3RhdGVJc0VtcHR5ID0gT2JqZWN0LmtleXMobmV3U3RhdGUpLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gY3VycmVudFN0YXRlSXNFbXB0eSAmJiBuZXdTdGF0ZUlzRW1wdHk7XG4gIH1cblxufVxuIl19
|
|
1
|
+
import { BehaviorSubject } from 'rxjs';
|
|
2
|
+
import { EntityStateManager } from './state';
|
|
3
|
+
import { EntityView } from './view';
|
|
4
|
+
import { getEntityId, getEntityProperty } from './entity.utils';
|
|
5
|
+
/**
|
|
6
|
+
* An entity store class holds any number of entities
|
|
7
|
+
* as well as their state. It can be observed, filtered and sorted and
|
|
8
|
+
* provides methods to insert, update or delete entities.
|
|
9
|
+
*/
|
|
10
|
+
export class EntityStore {
|
|
11
|
+
constructor(entities, options = {}) {
|
|
12
|
+
/**
|
|
13
|
+
* Observable of the raw entities
|
|
14
|
+
*/
|
|
15
|
+
this.entities$ = new BehaviorSubject([]);
|
|
16
|
+
/**
|
|
17
|
+
* Number of entities
|
|
18
|
+
*/
|
|
19
|
+
this.count$ = new BehaviorSubject(0);
|
|
20
|
+
/**
|
|
21
|
+
* Whether the store is empty
|
|
22
|
+
*/
|
|
23
|
+
this.empty$ = new BehaviorSubject(true);
|
|
24
|
+
this._pristine = true;
|
|
25
|
+
/**
|
|
26
|
+
* Strategies
|
|
27
|
+
*/
|
|
28
|
+
this.strategies = [];
|
|
29
|
+
this.getKey = options.getKey ? options.getKey : getEntityId;
|
|
30
|
+
this.getProperty = options.getProperty ? options.getProperty : getEntityProperty;
|
|
31
|
+
this.state = this.createStateManager();
|
|
32
|
+
this.view = this.createDataView();
|
|
33
|
+
this.stateView = this.createStateView();
|
|
34
|
+
this.view.lift();
|
|
35
|
+
this.stateView.lift();
|
|
36
|
+
if (entities.length > 0) {
|
|
37
|
+
this.load(entities);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this._index = this.generateIndex(entities);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
get count() { return this.count$.value; }
|
|
44
|
+
get empty() { return this.empty$.value; }
|
|
45
|
+
/**
|
|
46
|
+
* Store index
|
|
47
|
+
*/
|
|
48
|
+
get index() { return this._index; }
|
|
49
|
+
/**
|
|
50
|
+
* Store index
|
|
51
|
+
*/
|
|
52
|
+
get pristine() { return this._pristine; }
|
|
53
|
+
/**
|
|
54
|
+
* Get an entity from the store by key
|
|
55
|
+
* @param key Key
|
|
56
|
+
* @returns Entity
|
|
57
|
+
*/
|
|
58
|
+
get(key) {
|
|
59
|
+
return this.index.get(key);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get all entities in the store
|
|
63
|
+
* @returns Array of entities
|
|
64
|
+
*/
|
|
65
|
+
all() {
|
|
66
|
+
return this.entities$.value;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Set this store's entities
|
|
70
|
+
* @param entities Entities
|
|
71
|
+
*/
|
|
72
|
+
load(entities, pristine = true) {
|
|
73
|
+
this._index = this.generateIndex(entities);
|
|
74
|
+
this._pristine = pristine;
|
|
75
|
+
this.next();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Clear the store's entities but keep the state and views intact.
|
|
79
|
+
* Views won't return any data but future data will be subject to the
|
|
80
|
+
* current views filter and sort
|
|
81
|
+
*/
|
|
82
|
+
softClear() {
|
|
83
|
+
if (this.index && this.index.size > 0) {
|
|
84
|
+
this.index.clear();
|
|
85
|
+
this._pristine = true;
|
|
86
|
+
this.next();
|
|
87
|
+
}
|
|
88
|
+
else if (this.index) {
|
|
89
|
+
this.updateCount();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Clear the store's entities, state and views
|
|
94
|
+
*/
|
|
95
|
+
clear() {
|
|
96
|
+
this.stateView.clear();
|
|
97
|
+
this.view.clear();
|
|
98
|
+
this.state.clear();
|
|
99
|
+
this.softClear();
|
|
100
|
+
}
|
|
101
|
+
destroy() {
|
|
102
|
+
this.stateView.destroy();
|
|
103
|
+
this.view.destroy();
|
|
104
|
+
this.clear();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Insert an entity into the store
|
|
108
|
+
* @param entity Entity
|
|
109
|
+
*/
|
|
110
|
+
insert(entity) {
|
|
111
|
+
this.insertMany([entity]);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Insert many entities into the store
|
|
115
|
+
* @param entities Entities
|
|
116
|
+
*/
|
|
117
|
+
insertMany(entities) {
|
|
118
|
+
entities.forEach((entity) => this.index.set(this.getKey(entity), entity));
|
|
119
|
+
this._pristine = false;
|
|
120
|
+
this.next();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Update or insert an entity into the store
|
|
124
|
+
* @param entity Entity
|
|
125
|
+
*/
|
|
126
|
+
update(entity) {
|
|
127
|
+
this.updateMany([entity]);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Update or insert many entities into the store
|
|
131
|
+
* @param entities Entities
|
|
132
|
+
*/
|
|
133
|
+
updateMany(entities) {
|
|
134
|
+
entities.forEach((entity) => this.index.set(this.getKey(entity), entity));
|
|
135
|
+
this._pristine = false;
|
|
136
|
+
this.next();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Delete an entity from the store
|
|
140
|
+
* @param entity Entity
|
|
141
|
+
*/
|
|
142
|
+
delete(entity) {
|
|
143
|
+
this.deleteMany([entity]);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Delete many entities from the store
|
|
147
|
+
* @param entities Entities
|
|
148
|
+
*/
|
|
149
|
+
deleteMany(entities) {
|
|
150
|
+
entities.forEach((entity) => this.index.delete(this.getKey(entity)));
|
|
151
|
+
this._pristine = false;
|
|
152
|
+
this.next();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Add a strategy to this store
|
|
156
|
+
* @param strategy Entity store strategy
|
|
157
|
+
* @returns Entity store
|
|
158
|
+
*/
|
|
159
|
+
addStrategy(strategy, activate = false) {
|
|
160
|
+
const existingStrategy = this.strategies.find((_strategy) => {
|
|
161
|
+
return strategy.constructor === _strategy.constructor;
|
|
162
|
+
});
|
|
163
|
+
if (existingStrategy !== undefined) {
|
|
164
|
+
throw new Error('A strategy of this type already exists on that EntityStore.');
|
|
165
|
+
}
|
|
166
|
+
this.strategies.push(strategy);
|
|
167
|
+
strategy.bindStore(this);
|
|
168
|
+
if (activate === true) {
|
|
169
|
+
strategy.activate();
|
|
170
|
+
}
|
|
171
|
+
return this;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Remove a strategy from this store
|
|
175
|
+
* @param strategy Entity store strategy
|
|
176
|
+
* @returns Entity store
|
|
177
|
+
*/
|
|
178
|
+
removeStrategy(strategy) {
|
|
179
|
+
const index = this.strategies.indexOf(strategy);
|
|
180
|
+
if (index >= 0) {
|
|
181
|
+
this.strategies.splice(index, 1);
|
|
182
|
+
strategy.unbindStore(this);
|
|
183
|
+
}
|
|
184
|
+
return this;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Return strategies of a given type
|
|
188
|
+
* @param type Entity store strategy class
|
|
189
|
+
* @returns Strategies
|
|
190
|
+
*/
|
|
191
|
+
getStrategyOfType(type) {
|
|
192
|
+
return this.strategies.find((strategy) => {
|
|
193
|
+
return strategy instanceof type;
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Activate strategies of a given type
|
|
198
|
+
* @param type Entity store strategy class
|
|
199
|
+
*/
|
|
200
|
+
activateStrategyOfType(type) {
|
|
201
|
+
const strategy = this.getStrategyOfType(type);
|
|
202
|
+
if (strategy !== undefined) {
|
|
203
|
+
strategy.activate();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Deactivate strategies of a given type
|
|
208
|
+
* @param type Entity store strategy class
|
|
209
|
+
*/
|
|
210
|
+
deactivateStrategyOfType(type) {
|
|
211
|
+
const strategy = this.getStrategyOfType(type);
|
|
212
|
+
if (strategy !== undefined) {
|
|
213
|
+
strategy.deactivate();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Generate a complete index of all the entities
|
|
218
|
+
* @param entities Entities
|
|
219
|
+
* @returns Index
|
|
220
|
+
*/
|
|
221
|
+
generateIndex(entities) {
|
|
222
|
+
const entries = entities.map((entity) => [this.getKey(entity), entity]);
|
|
223
|
+
return new Map(entries);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Push the index's entities into the entities$ observable
|
|
227
|
+
*/
|
|
228
|
+
next() {
|
|
229
|
+
this.entities$.next(Array.from(this.index.values()));
|
|
230
|
+
this.updateCount();
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Update the store's count and empty
|
|
234
|
+
*/
|
|
235
|
+
updateCount() {
|
|
236
|
+
const count = this.index.size;
|
|
237
|
+
const empty = count === 0;
|
|
238
|
+
this.count$.next(count);
|
|
239
|
+
this.empty$.next(empty);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Create the entity state manager
|
|
243
|
+
* @returns EntityStateManager
|
|
244
|
+
*/
|
|
245
|
+
createStateManager() {
|
|
246
|
+
return new EntityStateManager({ store: this });
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Create the data view
|
|
250
|
+
* @returns EntityView<E>
|
|
251
|
+
*/
|
|
252
|
+
createDataView() {
|
|
253
|
+
return new EntityView(this.entities$);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Create the state view
|
|
257
|
+
* @returns EntityView<EntityRecord<E>>
|
|
258
|
+
*/
|
|
259
|
+
createStateView() {
|
|
260
|
+
return new EntityView(this.view.all$())
|
|
261
|
+
.join({
|
|
262
|
+
source: this.state.change$,
|
|
263
|
+
reduce: (entity) => {
|
|
264
|
+
const key = this.getKey(entity);
|
|
265
|
+
const state = this.state.get(entity);
|
|
266
|
+
const currentRecord = this.stateView.get(key);
|
|
267
|
+
if (currentRecord !== undefined &&
|
|
268
|
+
currentRecord.entity === entity &&
|
|
269
|
+
this.statesAreTheSame(currentRecord.state, state)) {
|
|
270
|
+
return currentRecord;
|
|
271
|
+
}
|
|
272
|
+
const revision = currentRecord ? currentRecord.revision + 1 : 1;
|
|
273
|
+
const ref = `${key}-${revision}`;
|
|
274
|
+
return { entity, state, revision, ref };
|
|
275
|
+
}
|
|
276
|
+
})
|
|
277
|
+
.createIndex((record) => this.getKey(record.entity));
|
|
278
|
+
}
|
|
279
|
+
statesAreTheSame(currentState, newState) {
|
|
280
|
+
if (currentState === newState) {
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
const currentStateIsEmpty = Object.keys(currentState).length === 0;
|
|
284
|
+
const newStateIsEmpty = Object.keys(newState).length === 0;
|
|
285
|
+
return currentStateIsEmpty && newStateIsEmpty;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2xpYi9lbnRpdHkvc2hhcmVkL3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2hFOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQTZEdEIsWUFBWSxRQUFhLEVBQUUsVUFBOEIsRUFBRTtRQTNEM0Q7O1dBRUc7UUFDTSxjQUFTLEdBQUcsSUFBSSxlQUFlLENBQU0sRUFBRSxDQUFDLENBQUM7UUFFbEQ7O1dBRUc7UUFDTSxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFHakQ7O1dBRUc7UUFDTSxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUM7UUFzQzdDLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFFbEM7O1dBRUc7UUFDSyxlQUFVLEdBQTBCLEVBQUUsQ0FBQztRQUc3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUM1RCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO1FBRWpGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUks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LE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFlBQWUsRUFBRSxRQUFXO1FBQ25ELElBQUksWUFBWSxLQUFLLFFBQVEsRUFBRTtZQUM3QixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFDbkUsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBQzNELE9BQU8sbUJBQW1CLElBQUksZUFBZSxDQUFDO0lBQ2hELENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgRW50aXR5U3RhdGVNYW5hZ2VyIH0gZnJvbSAnLi9zdGF0ZSc7XHJcbmltcG9ydCB7IEVudGl0eVZpZXcgfSBmcm9tICcuL3ZpZXcnO1xyXG5pbXBvcnQgeyBFbnRpdHlLZXksIEVudGl0eVN0YXRlLCBFbnRpdHlSZWNvcmQsIEVudGl0eVN0b3JlT3B0aW9ucyB9IGZyb20gJy4vZW50aXR5LmludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBnZXRFbnRpdHlJZCwgZ2V0RW50aXR5UHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS51dGlscyc7XHJcbmltcG9ydCB7IEVudGl0eVN0b3JlU3RyYXRlZ3kgfSBmcm9tICcuL3N0cmF0ZWdpZXMvc3RyYXRlZ3knO1xyXG5cclxuLyoqXHJcbiAqIEFuIGVudGl0eSBzdG9yZSBjbGFzcyBob2xkcyBhbnkgbnVtYmVyIG9mIGVudGl0aWVzXHJcbiAqIGFzIHdlbGwgYXMgdGhlaXIgc3RhdGUuIEl0IGNhbiBiZSBvYnNlcnZlZCwgZmlsdGVyZWQgYW5kIHNvcnRlZCBhbmRcclxuICogcHJvdmlkZXMgbWV0aG9kcyB0byBpbnNlcnQsIHVwZGF0ZSBvciBkZWxldGUgZW50aXRpZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRW50aXR5U3RvcmU8RSBleHRlbmRzIG9iamVjdCA9IG9iamVjdCwgUyBleHRlbmRzIEVudGl0eVN0YXRlID0gRW50aXR5U3RhdGU+IHtcclxuXHJcbiAgLyoqXHJcbiAgICogT2JzZXJ2YWJsZSBvZiB0aGUgcmF3IGVudGl0aWVzXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgZW50aXRpZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFW10+KFtdKTtcclxuXHJcbiAgLyoqXHJcbiAgICogTnVtYmVyIG9mIGVudGl0aWVzXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG4gIGdldCBjb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5jb3VudCQudmFsdWU7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgc3RvcmUgaXMgZW1wdHlcclxuICAgKi9cclxuICByZWFkb25seSBlbXB0eSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xyXG4gIGdldCBlbXB0eSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZW1wdHkkLnZhbHVlOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVudGl0eSBzdG9yZSBzdGF0ZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHN0YXRlOiBFbnRpdHlTdGF0ZU1hbmFnZXI8RSwgUz47XHJcblxyXG4gIC8qKlxyXG4gICAqIFZpZXcgb2YgYWxsIHRoZSBlbnRpdGllc1xyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHZpZXc6IEVudGl0eVZpZXc8RT47XHJcblxyXG4gIC8qKlxyXG4gICAqIFZpZXcgb2YgYWxsIHRoZSBlbnRpdGllcyBhbmQgdGhlaXIgc3RhdGVcclxuICAgKi9cclxuICByZWFkb25seSBzdGF0ZVZpZXc6IEVudGl0eVZpZXc8RSwgRW50aXR5UmVjb3JkPEUsIFM+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kIHRvIGdldCBhbiBlbnRpdHkncyBpZFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGdldEtleTogKEUpID0+IEVudGl0eUtleTtcclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kIHRvIGdldCBhbiBlbnRpdHkncyBuYW1lZCBwcm9wZXJ0eVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGdldFByb3BlcnR5OiAoRSwgcHJvcDogc3RyaW5nKSA9PiBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIGluZGV4XHJcbiAgICovXHJcbiAgZ2V0IGluZGV4KCk6IE1hcDxFbnRpdHlLZXksIEU+IHsgcmV0dXJuIHRoaXMuX2luZGV4OyB9XHJcbiAgcHJpdmF0ZSBfaW5kZXg6IE1hcDxFbnRpdHlLZXksIEU+O1xyXG5cclxuICAvKipcclxuICAgKiBTdG9yZSBpbmRleFxyXG4gICAqL1xyXG4gIGdldCBwcmlzdGluZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3ByaXN0aW5lOyB9XHJcbiAgcHJpdmF0ZSBfcHJpc3RpbmU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBTdHJhdGVnaWVzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdHJhdGVnaWVzOiBFbnRpdHlTdG9yZVN0cmF0ZWd5W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoZW50aXRpZXM6IEVbXSwgb3B0aW9uczogRW50aXR5U3RvcmVPcHRpb25zID0ge30pIHtcclxuICAgIHRoaXMuZ2V0S2V5ID0gb3B0aW9ucy5nZXRLZXkgPyBvcHRpb25zLmdldEtleSA6IGdldEVudGl0eUlkO1xyXG4gICAgdGhpcy5nZXRQcm9wZXJ0eSA9IG9wdGlvbnMuZ2V0UHJvcGVydHkgPyBvcHRpb25zLmdldFByb3BlcnR5IDogZ2V0RW50aXR5UHJvcGVydHk7XHJcblxyXG4gICAgdGhpcy5zdGF0ZSA9IHRoaXMuY3JlYXRlU3RhdGVNYW5hZ2VyKCk7XHJcbiAgICB0aGlzLnZpZXcgPSB0aGlzLmNyZWF0ZURhdGFWaWV3KCk7XHJcbiAgICB0aGlzLnN0YXRlVmlldyA9IHRoaXMuY3JlYXRlU3RhdGVWaWV3KCk7XHJcblxyXG4gICAgdGhpcy52aWV3LmxpZnQoKTtcclxuICAgIHRoaXMuc3RhdGVWaWV3LmxpZnQoKTtcclxuXHJcbiAgICBpZiAoZW50aXRpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmxvYWQoZW50aXRpZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5faW5kZXggPSB0aGlzLmdlbmVyYXRlSW5kZXgoZW50aXRpZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFuIGVudGl0eSBmcm9tIHRoZSBzdG9yZSBieSBrZXlcclxuICAgKiBAcGFyYW0ga2V5IEtleVxyXG4gICAqIEByZXR1cm5zIEVudGl0eVxyXG4gICAqL1xyXG4gIGdldChrZXk6IEVudGl0eUtleSk6IEUge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5kZXguZ2V0KGtleSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGVudGl0aWVzIGluIHRoZSBzdG9yZVxyXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGVudGl0aWVzXHJcbiAgICovXHJcbiAgYWxsKCk6IEVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbnRpdGllcyQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhpcyBzdG9yZSdzIGVudGl0aWVzXHJcbiAgICogQHBhcmFtIGVudGl0aWVzIEVudGl0aWVzXHJcbiAgICovXHJcbiAgbG9hZChlbnRpdGllczogRVtdLCBwcmlzdGluZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIHRoaXMuX2luZGV4ID0gdGhpcy5nZW5lcmF0ZUluZGV4KGVudGl0aWVzKTtcclxuICAgIHRoaXMuX3ByaXN0aW5lID0gcHJpc3RpbmU7XHJcbiAgICB0aGlzLm5leHQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBzdG9yZSdzIGVudGl0aWVzIGJ1dCBrZWVwIHRoZSBzdGF0ZSBhbmQgdmlld3MgaW50YWN0LlxyXG4gICAqIFZpZXdzIHdvbid0IHJldHVybiBhbnkgZGF0YSBidXQgZnV0dXJlIGRhdGEgd2lsbCBiZSBzdWJqZWN0IHRvIHRoZVxyXG4gICAqIGN1cnJlbnQgdmlld3MgZmlsdGVyIGFuZCBzb3J0XHJcbiAgICovXHJcbiAgc29mdENsZWFyKCkge1xyXG4gICAgaWYgKHRoaXMuaW5kZXggJiYgdGhpcy5pbmRleC5zaXplID4gMCkge1xyXG4gICAgICB0aGlzLmluZGV4LmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuX3ByaXN0aW5lID0gdHJ1ZTtcclxuICAgICAgdGhpcy5uZXh0KCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5kZXgpIHtcclxuICAgICAgdGhpcy51cGRhdGVDb3VudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIHN0b3JlJ3MgZW50aXRpZXMsIHN0YXRlIGFuZCB2aWV3c1xyXG4gICAqL1xyXG4gIGNsZWFyKCkge1xyXG4gICAgdGhpcy5zdGF0ZVZpZXcuY2xlYXIoKTtcclxuICAgIHRoaXMudmlldy5jbGVhcigpO1xyXG4gICAgdGhpcy5zdGF0ZS5jbGVhcigpO1xyXG4gICAgdGhpcy5zb2Z0Q2xlYXIoKTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnN0YXRlVmlldy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLnZpZXcuZGVzdHJveSgpO1xyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0IGFuIGVudGl0eSBpbnRvIHRoZSBzdG9yZVxyXG4gICAqIEBwYXJhbSBlbnRpdHkgRW50aXR5XHJcbiAgICovXHJcbiAgaW5zZXJ0KGVudGl0eTogRSkge1xyXG4gICAgdGhpcy5pbnNlcnRNYW55KFtlbnRpdHldKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydCBtYW55IGVudGl0aWVzIGludG8gdGhlIHN0b3JlXHJcbiAgICogQHBhcmFtIGVudGl0aWVzIEVudGl0aWVzXHJcbiAgICovXHJcbiAgaW5zZXJ0TWFueShlbnRpdGllczogRVtdKSB7XHJcbiAgICBlbnRpdGllcy5mb3JFYWNoKChlbnRpdHk6IEUpID0+IHRoaXMuaW5kZXguc2V0KHRoaXMuZ2V0S2V5KGVudGl0eSksIGVudGl0eSkpO1xyXG4gICAgdGhpcy5fcHJpc3RpbmUgPSBmYWxzZTtcclxuICAgIHRoaXMubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIG9yIGluc2VydCBhbiBlbnRpdHkgaW50byB0aGUgc3RvcmVcclxuICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eVxyXG4gICAqL1xyXG4gIHVwZGF0ZShlbnRpdHk6IEUpIHtcclxuICAgIHRoaXMudXBkYXRlTWFueShbZW50aXR5XSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgb3IgaW5zZXJ0IG1hbnkgZW50aXRpZXMgaW50byB0aGUgc3RvcmVcclxuICAgKiBAcGFyYW0gZW50aXRpZXMgRW50aXRpZXNcclxuICAgKi9cclxuICB1cGRhdGVNYW55KGVudGl0aWVzOiBFW10pIHtcclxuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRSkgPT4gdGhpcy5pbmRleC5zZXQodGhpcy5nZXRLZXkoZW50aXR5KSwgZW50aXR5KSk7XHJcbiAgICB0aGlzLl9wcmlzdGluZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgYW4gZW50aXR5IGZyb20gdGhlIHN0b3JlXHJcbiAgICogQHBhcmFtIGVudGl0eSBFbnRpdHlcclxuICAgKi9cclxuICBkZWxldGUoZW50aXR5OiBFKSB7XHJcbiAgICB0aGlzLmRlbGV0ZU1hbnkoW2VudGl0eV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIG1hbnkgZW50aXRpZXMgZnJvbSB0aGUgc3RvcmVcclxuICAgKiBAcGFyYW0gZW50aXRpZXMgRW50aXRpZXNcclxuICAgKi9cclxuICBkZWxldGVNYW55KGVudGl0aWVzOiBFW10pIHtcclxuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eTogRSkgPT4gdGhpcy5pbmRleC5kZWxldGUodGhpcy5nZXRLZXkoZW50aXR5KSkpO1xyXG4gICAgdGhpcy5fcHJpc3RpbmUgPSBmYWxzZTtcclxuICAgIHRoaXMubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIGEgc3RyYXRlZ3kgdG8gdGhpcyBzdG9yZVxyXG4gICAqIEBwYXJhbSBzdHJhdGVneSBFbnRpdHkgc3RvcmUgc3RyYXRlZ3lcclxuICAgKiBAcmV0dXJucyBFbnRpdHkgc3RvcmVcclxuICAgKi9cclxuICBhZGRTdHJhdGVneShzdHJhdGVneTogRW50aXR5U3RvcmVTdHJhdGVneSwgYWN0aXZhdGU6IGJvb2xlYW4gPSBmYWxzZSk6IEVudGl0eVN0b3JlIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nU3RyYXRlZ3kgPSB0aGlzLnN0cmF0ZWdpZXMuZmluZCgoX3N0cmF0ZWd5OiBFbnRpdHlTdG9yZVN0cmF0ZWd5KSA9PiB7XHJcbiAgICAgIHJldHVybiBzdHJhdGVneS5jb25zdHJ1Y3RvciA9PT0gX3N0cmF0ZWd5LmNvbnN0cnVjdG9yO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoZXhpc3RpbmdTdHJhdGVneSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzdHJhdGVneSBvZiB0aGlzIHR5cGUgYWxyZWFkeSBleGlzdHMgb24gdGhhdCBFbnRpdHlTdG9yZS4nKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0cmF0ZWdpZXMucHVzaChzdHJhdGVneSk7XHJcbiAgICBzdHJhdGVneS5iaW5kU3RvcmUodGhpcyk7XHJcblxyXG4gICAgaWYgKGFjdGl2YXRlID09PSB0cnVlKSB7XHJcbiAgICAgIHN0cmF0ZWd5LmFjdGl2YXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYSBzdHJhdGVneSBmcm9tIHRoaXMgc3RvcmVcclxuICAgKiBAcGFyYW0gc3RyYXRlZ3kgRW50aXR5IHN0b3JlIHN0cmF0ZWd5XHJcbiAgICogQHJldHVybnMgRW50aXR5IHN0b3JlXHJcbiAgICovXHJcbiAgcmVtb3ZlU3RyYXRlZ3koc3RyYXRlZ3k6IEVudGl0eVN0b3JlU3RyYXRlZ3kpOiBFbnRpdHlTdG9yZSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc3RyYXRlZ2llcy5pbmRleE9mKHN0cmF0ZWd5KTtcclxuICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuc3RyYXRlZ2llcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICBzdHJhdGVneS51bmJpbmRTdG9yZSh0aGlzKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHN0cmF0ZWdpZXMgb2YgYSBnaXZlbiB0eXBlXHJcbiAgICogQHBhcmFtIHR5cGUgRW50aXR5IHN0b3JlIHN0cmF0ZWd5IGNsYXNzXHJcbiAgICogQHJldHVybnMgU3RyYXRlZ2llc1xyXG4gICAqL1xyXG4gIGdldFN0cmF0ZWd5T2ZUeXBlKHR5cGU6IHR5cGVvZiBFbnRpdHlTdG9yZVN0cmF0ZWd5KTogRW50aXR5U3RvcmVTdHJhdGVneSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdHJhdGVnaWVzLmZpbmQoKHN0cmF0ZWd5OiBFbnRpdHlTdG9yZVN0cmF0ZWd5KSA9PiB7XHJcbiAgICAgIHJldHVybiBzdHJhdGVneSBpbnN0YW5jZW9mIHR5cGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjdGl2YXRlIHN0cmF0ZWdpZXMgb2YgYSBnaXZlbiB0eXBlXHJcbiAgICogQHBhcmFtIHR5cGUgRW50aXR5IHN0b3JlIHN0cmF0ZWd5IGNsYXNzXHJcbiAgICovXHJcbiAgYWN0aXZhdGVTdHJhdGVneU9mVHlwZSh0eXBlOiB0eXBlb2YgRW50aXR5U3RvcmVTdHJhdGVneSkge1xyXG4gICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLmdldFN0cmF0ZWd5T2ZUeXBlKHR5cGUpO1xyXG4gICAgaWYgKHN0cmF0ZWd5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgc3RyYXRlZ3kuYWN0aXZhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlYWN0aXZhdGUgc3RyYXRlZ2llcyBvZiBhIGdpdmVuIHR5cGVcclxuICAgKiBAcGFyYW0gdHlwZSBFbnRpdHkgc3RvcmUgc3RyYXRlZ3kgY2xhc3NcclxuICAgKi9cclxuICBkZWFjdGl2YXRlU3RyYXRlZ3lPZlR5cGUodHlwZTogdHlwZW9mIEVudGl0eVN0b3JlU3RyYXRlZ3kpIHtcclxuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5nZXRTdHJhdGVneU9mVHlwZSh0eXBlKTtcclxuICAgIGlmIChzdHJhdGVneSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHN0cmF0ZWd5LmRlYWN0aXZhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgY29tcGxldGUgaW5kZXggb2YgYWxsIHRoZSBlbnRpdGllc1xyXG4gICAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllc1xyXG4gICAqIEByZXR1cm5zIEluZGV4XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUluZGV4KGVudGl0aWVzOiBFW10pOiBNYXA8RW50aXR5S2V5LCBFPiB7XHJcbiAgICBjb25zdCBlbnRyaWVzID0gZW50aXRpZXMubWFwKChlbnRpdHk6IEUpID0+IFt0aGlzLmdldEtleShlbnRpdHkpLCBlbnRpdHldKTtcclxuICAgIHJldHVybiBuZXcgTWFwKGVudHJpZXMgYXMgW0VudGl0eUtleSwgRV1bXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQdXNoIHRoZSBpbmRleCdzIGVudGl0aWVzIGludG8gdGhlIGVudGl0aWVzJCBvYnNlcnZhYmxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBuZXh0KCkge1xyXG4gICAgdGhpcy5lbnRpdGllcyQubmV4dChBcnJheS5mcm9tKHRoaXMuaW5kZXgudmFsdWVzKCkpKTtcclxuICAgIHRoaXMudXBkYXRlQ291bnQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgc3RvcmUncyBjb3VudCBhbmQgZW1wdHlcclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUNvdW50KCkge1xyXG4gICAgY29uc3QgY291bnQgPSB0aGlzLmluZGV4LnNpemU7XHJcbiAgICBjb25zdCBlbXB0eSA9IGNvdW50ID09PSAwO1xyXG4gICAgdGhpcy5jb3VudCQubmV4dChjb3VudCk7XHJcbiAgICB0aGlzLmVtcHR5JC5uZXh0KGVtcHR5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0aGUgZW50aXR5IHN0YXRlIG1hbmFnZXJcclxuICAgKiBAcmV0dXJucyBFbnRpdHlTdGF0ZU1hbmFnZXJcclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZVN0YXRlTWFuYWdlcigpIHtcclxuICAgIHJldHVybiBuZXcgRW50aXR5U3RhdGVNYW5hZ2VyPEUsIFM+KHtzdG9yZTogdGhpc30pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRoZSBkYXRhIHZpZXdcclxuICAgKiBAcmV0dXJucyBFbnRpdHlWaWV3PEU+XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXRhVmlldygpIHtcclxuICAgIHJldHVybiBuZXcgRW50aXR5VmlldzxFPih0aGlzLmVudGl0aWVzJCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgdGhlIHN0YXRlIHZpZXdcclxuICAgKiBAcmV0dXJucyBFbnRpdHlWaWV3PEVudGl0eVJlY29yZDxFPj5cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZVN0YXRlVmlldygpIHtcclxuICAgIHJldHVybiBuZXcgRW50aXR5VmlldzxFLCBFbnRpdHlSZWNvcmQ8RSwgUz4+KHRoaXMudmlldy5hbGwkKCkpXHJcbiAgICAgIC5qb2luKHtcclxuICAgICAgICBzb3VyY2U6IHRoaXMuc3RhdGUuY2hhbmdlJCxcclxuICAgICAgICByZWR1Y2U6IChlbnRpdHk6IEUpOiBFbnRpdHlSZWNvcmQ8RSwgUz4gPT4ge1xyXG4gICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoZW50aXR5KTtcclxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZS5nZXQoZW50aXR5KTtcclxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZWNvcmQgPSB0aGlzLnN0YXRlVmlldy5nZXQoa2V5KTtcclxuXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGN1cnJlbnRSZWNvcmQgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgICBjdXJyZW50UmVjb3JkLmVudGl0eSA9PT0gZW50aXR5ICYmXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGVzQXJlVGhlU2FtZShjdXJyZW50UmVjb3JkLnN0YXRlLCBzdGF0ZSlcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJlY29yZDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCByZXZpc2lvbiA9IGN1cnJlbnRSZWNvcmQgPyBjdXJyZW50UmVjb3JkLnJldmlzaW9uICsgMSA6IDE7XHJcbiAgICAgICAgICBjb25zdCByZWYgPSBgJHtrZXl9LSR7cmV2aXNpb259YDtcclxuICAgICAgICAgIHJldHVybiB7ZW50aXR5LCBzdGF0ZSwgcmV2aXNpb24sIHJlZn07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY3JlYXRlSW5kZXgoKHJlY29yZDogRW50aXR5UmVjb3JkPEUsIFM+KSA9PiB0aGlzLmdldEtleShyZWNvcmQuZW50aXR5KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRlc0FyZVRoZVNhbWUoY3VycmVudFN0YXRlOiBTLCBuZXdTdGF0ZTogUyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gbmV3U3RhdGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY3VycmVudFN0YXRlSXNFbXB0eSA9IE9iamVjdC5rZXlzKGN1cnJlbnRTdGF0ZSkubGVuZ3RoID09PSAwO1xyXG4gICAgY29uc3QgbmV3U3RhdGVJc0VtcHR5ID0gT2JqZWN0LmtleXMobmV3U3RhdGUpLmxlbmd0aCA9PT0gMDtcclxuICAgIHJldHVybiBjdXJyZW50U3RhdGVJc0VtcHR5ICYmIG5ld1N0YXRlSXNFbXB0eTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|