ngx-hana-nameserver-history-viewer 1.1.3 → 1.1.9-3.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/esm2020/ngx-hana-nameserver-history-viewer.mjs +5 -0
- package/esm2020/public-api.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +68 -0
- package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +22 -0
- package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +3 -0
- package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +112 -0
- package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/index.mjs +9 -0
- package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +42 -0
- package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +550 -0
- package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +69 -0
- package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +41 -0
- package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +40 -0
- package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +70 -0
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +90 -0
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +49 -0
- package/esm2020/src/nameserver-history-viewer/index.mjs +3 -0
- package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +63 -0
- package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +323 -0
- package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +390 -0
- package/esm2020/src/nameserver-history-viewer/services/index.mjs +4 -0
- package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +557 -0
- package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +6 -0
- package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +8 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +9 -0
- package/esm2020/src/nameserver-history-viewer/types/index.mjs +28 -0
- package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +14 -0
- package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +17 -0
- package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +10 -0
- package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +14 -0
- package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +25 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +57 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +139 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +41 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +106 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +168 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +114 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +527 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +154 -0
- package/esm2020/src/nameserver-history-viewer/utils/index.mjs +5 -0
- package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +101 -0
- package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +162 -0
- package/{dist/fesm2015/ngx-hana-nameserver-history-viewer.js → fesm2015/ngx-hana-nameserver-history-viewer.mjs} +829 -2561
- package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
- package/fesm2020/ngx-hana-nameserver-history-viewer.mjs +4081 -0
- package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
- package/ngx-hana-nameserver-history-viewer.d.ts +5 -0
- package/package.json +66 -88
- package/{dist/public-api.d.ts → public-api.d.ts} +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/alert/alert.component.d.ts +4 -1
- package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +8 -0
- package/{dist/src → src}/nameserver-history-viewer/components/alert/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +3 -0
- package/{dist/src → src}/nameserver-history-viewer/components/file-drop-input/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/instruction/index.d.ts +0 -0
- package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +17 -0
- package/{dist/src → src}/nameserver-history-viewer/components/nameserver-history.component.d.ts +33 -14
- package/{dist/src → src}/nameserver-history-viewer/components/port-selector/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +4 -1
- package/{dist/src → src}/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +3 -0
- package/{dist/src → src}/nameserver-history-viewer/components/progress-bar/index.d.ts +0 -0
- package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +6 -0
- package/{dist/src → src}/nameserver-history-viewer/components/time-range-selector/index.d.ts +0 -0
- package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +19 -0
- package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +3 -0
- package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +3 -0
- package/src/nameserver-history-viewer/index.d.ts +2 -0
- package/src/nameserver-history-viewer/nameserver-history.module.d.ts +19 -0
- package/{dist/src → src}/nameserver-history-viewer/services/chart.service.d.ts +4 -1
- package/{dist/src → src}/nameserver-history-viewer/services/file.service.d.ts +3 -0
- package/{dist/src → src}/nameserver-history-viewer/services/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/services/ui.service.d.ts +5 -2
- package/{dist/src → src}/nameserver-history-viewer/types/abort.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/alert.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/chart-content-data-item.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/chart-content-data.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/chart-content-header.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/chart-content-time.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/chart-content.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/color-rgba.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/html-element.type.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/item.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/legend-color.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-backup.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-columnstore.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-host.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-item.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-persistence.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-rowstore.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-server.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-sql.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-sync-primitives.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-threads.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/port.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/scale-group.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/unit-category.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/unit.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chart-util.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/data_culling.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +1 -1
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/utils.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-zoom/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/file-util.d.ts +6 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/time-util.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/ui-util.d.ts +0 -0
- package/.idea/codeStyles/Project.xml +0 -17
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/ngx-hana-nameserver-history-viewer.iml +0 -13
- package/.idea/vcs.xml +0 -6
- package/.travis.yml +0 -35
- package/angular.json +0 -125
- package/dist/LICENSE +0 -21
- package/dist/README.md +0 -93
- package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.js +0 -6761
- package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.js.map +0 -1
- package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.min.js +0 -2
- package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.min.js.map +0 -1
- package/dist/esm2015/ngx-hana-nameserver-history-viewer.js +0 -10
- package/dist/esm2015/public-api.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/alert/alert.component.js +0 -114
- package/dist/esm2015/src/nameserver-history-viewer/components/alert/alert.module.js +0 -21
- package/dist/esm2015/src/nameserver-history-viewer/components/alert/index.js +0 -7
- package/dist/esm2015/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -141
- package/dist/esm2015/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/index.js +0 -13
- package/dist/esm2015/src/nameserver-history-viewer/components/instruction/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -62
- package/dist/esm2015/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -868
- package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
- package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -60
- package/dist/esm2015/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -35
- package/dist/esm2015/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -68
- package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -151
- package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -80
- package/dist/esm2015/src/nameserver-history-viewer/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/nameserver-history.module.js +0 -42
- package/dist/esm2015/src/nameserver-history-viewer/services/chart.service.js +0 -504
- package/dist/esm2015/src/nameserver-history-viewer/services/file.service.js +0 -488
- package/dist/esm2015/src/nameserver-history-viewer/services/index.js +0 -8
- package/dist/esm2015/src/nameserver-history-viewer/services/ui.service.js +0 -922
- package/dist/esm2015/src/nameserver-history-viewer/types/abort.types.js +0 -13
- package/dist/esm2015/src/nameserver-history-viewer/types/alert.types.js +0 -13
- package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
- package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
- package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
- package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
- package/dist/esm2015/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
- package/dist/esm2015/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/types/html-element.type.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/types/index.js +0 -32
- package/dist/esm2015/src/nameserver-history-viewer/types/item.types.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -25
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
- package/dist/esm2015/src/nameserver-history-viewer/types/port.types.js +0 -17
- package/dist/esm2015/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
- package/dist/esm2015/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
- package/dist/esm2015/src/nameserver-history-viewer/types/unit.types.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/utils/chart-util.js +0 -38
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -222
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -166
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -311
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -130
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -827
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/utils/file-util.js +0 -186
- package/dist/esm2015/src/nameserver-history-viewer/utils/index.js +0 -9
- package/dist/esm2015/src/nameserver-history-viewer/utils/time-util.js +0 -139
- package/dist/esm2015/src/nameserver-history-viewer/utils/ui-util.js +0 -239
- package/dist/esm5/ngx-hana-nameserver-history-viewer.js +0 -10
- package/dist/esm5/public-api.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/alert/alert.component.js +0 -146
- package/dist/esm5/src/nameserver-history-viewer/components/alert/alert.module.js +0 -25
- package/dist/esm5/src/nameserver-history-viewer/components/alert/index.js +0 -7
- package/dist/esm5/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -155
- package/dist/esm5/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/index.js +0 -13
- package/dist/esm5/src/nameserver-history-viewer/components/instruction/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -67
- package/dist/esm5/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -1116
- package/dist/esm5/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
- package/dist/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -85
- package/dist/esm5/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -26
- package/dist/esm5/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -58
- package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -180
- package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -110
- package/dist/esm5/src/nameserver-history-viewer/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/nameserver-history.module.js +0 -46
- package/dist/esm5/src/nameserver-history-viewer/services/chart.service.js +0 -659
- package/dist/esm5/src/nameserver-history-viewer/services/file.service.js +0 -609
- package/dist/esm5/src/nameserver-history-viewer/services/index.js +0 -8
- package/dist/esm5/src/nameserver-history-viewer/services/ui.service.js +0 -1141
- package/dist/esm5/src/nameserver-history-viewer/types/abort.types.js +0 -13
- package/dist/esm5/src/nameserver-history-viewer/types/alert.types.js +0 -13
- package/dist/esm5/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
- package/dist/esm5/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
- package/dist/esm5/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
- package/dist/esm5/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
- package/dist/esm5/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
- package/dist/esm5/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/types/html-element.type.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/types/index.js +0 -32
- package/dist/esm5/src/nameserver-history-viewer/types/item.types.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -25
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
- package/dist/esm5/src/nameserver-history-viewer/types/port.types.js +0 -17
- package/dist/esm5/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
- package/dist/esm5/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
- package/dist/esm5/src/nameserver-history-viewer/types/unit.types.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/utils/chart-util.js +0 -39
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -316
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -240
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -366
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -142
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -827
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/utils/file-util.js +0 -187
- package/dist/esm5/src/nameserver-history-viewer/utils/index.js +0 -9
- package/dist/esm5/src/nameserver-history-viewer/utils/time-util.js +0 -139
- package/dist/esm5/src/nameserver-history-viewer/utils/ui-util.js +0 -241
- package/dist/fesm2015/ngx-hana-nameserver-history-viewer.js.map +0 -1
- package/dist/fesm5/ngx-hana-nameserver-history-viewer.js +0 -6887
- package/dist/fesm5/ngx-hana-nameserver-history-viewer.js.map +0 -1
- package/dist/ngx-hana-nameserver-history-viewer.d.ts +0 -5
- package/dist/ngx-hana-nameserver-history-viewer.metadata.json +0 -1
- package/dist/package.json +0 -90
- package/dist/src/nameserver-history-viewer/components/alert/alert.module.d.ts +0 -2
- package/dist/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +0 -14
- package/dist/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +0 -3
- package/dist/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +0 -16
- package/dist/src/nameserver-history-viewer/index.d.ts +0 -1
- package/dist/src/nameserver-history-viewer/nameserver-history.module.d.ts +0 -2
- package/ng-package.json +0 -7
- package/public-api.ts +0 -1
- package/src/assets/GitHub-Mark-32px.png +0 -0
- package/src/demo/app.component.html +0 -42
- package/src/demo/app.component.scss +0 -155
- package/src/demo/app.component.ts +0 -157
- package/src/demo/app.module.ts +0 -30
- package/src/demo/demo-service.ts +0 -479
- package/src/demo/demo-util.spec.ts +0 -112
- package/src/demo/demo-util.ts +0 -121
- package/src/demo/index.html +0 -13
- package/src/demo/main.ts +0 -12
- package/src/demo/small-demo.gif +0 -0
- package/src/demo/styles.css +0 -5
- package/src/environments/environment.prod.ts +0 -3
- package/src/environments/environment.ts +0 -15
- package/src/karma.conf.js +0 -31
- package/src/nameserver-history-viewer/components/alert/alert.component.html +0 -10
- package/src/nameserver-history-viewer/components/alert/alert.component.scss +0 -78
- package/src/nameserver-history-viewer/components/alert/alert.component.ts +0 -67
- package/src/nameserver-history-viewer/components/alert/alert.module.ts +0 -14
- package/src/nameserver-history-viewer/components/alert/index.ts +0 -6
- package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.scss +0 -37
- package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.spec.ts +0 -47
- package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.ts +0 -101
- package/src/nameserver-history-viewer/components/file-drop-input/index.ts +0 -1
- package/src/nameserver-history-viewer/components/index.ts +0 -8
- package/src/nameserver-history-viewer/components/instruction/index.ts +0 -1
- package/src/nameserver-history-viewer/components/instruction/instruction.component.html +0 -33
- package/src/nameserver-history-viewer/components/instruction/instruction.component.scss +0 -49
- package/src/nameserver-history-viewer/components/instruction/instruction.component.ts +0 -30
- package/src/nameserver-history-viewer/components/nameserver-history.component.html +0 -70
- package/src/nameserver-history-viewer/components/nameserver-history.component.scss +0 -191
- package/src/nameserver-history-viewer/components/nameserver-history.component.spec.ts +0 -193
- package/src/nameserver-history-viewer/components/nameserver-history.component.ts +0 -666
- package/src/nameserver-history-viewer/components/port-selector/index.ts +0 -1
- package/src/nameserver-history-viewer/components/port-selector/port-selector.component.ts +0 -55
- package/src/nameserver-history-viewer/components/port-selector/port-selector.service.spec.ts +0 -16
- package/src/nameserver-history-viewer/components/port-selector/port-selector.service.ts +0 -40
- package/src/nameserver-history-viewer/components/progress-bar/index.ts +0 -1
- package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.scss +0 -47
- package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.ts +0 -27
- package/src/nameserver-history-viewer/components/time-range-selector/index.ts +0 -1
- package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.scss +0 -31
- package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.ts +0 -46
- package/src/nameserver-history-viewer/components/timezone-selector/index.ts +0 -1
- package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.ts +0 -82
- package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.spec.ts +0 -12
- package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.ts +0 -53
- package/src/nameserver-history-viewer/index.ts +0 -1
- package/src/nameserver-history-viewer/nameserver-history.module.ts +0 -45
- package/src/nameserver-history-viewer/services/chart.service.ts +0 -343
- package/src/nameserver-history-viewer/services/file.service.spec.ts +0 -3364
- package/src/nameserver-history-viewer/services/file.service.ts +0 -450
- package/src/nameserver-history-viewer/services/index.ts +0 -3
- package/src/nameserver-history-viewer/services/ui.service.spec.ts +0 -43
- package/src/nameserver-history-viewer/services/ui.service.ts +0 -601
- package/src/nameserver-history-viewer/types/abort.types.ts +0 -4
- package/src/nameserver-history-viewer/types/alert.types.ts +0 -6
- package/src/nameserver-history-viewer/types/chart-content-data-item.types.ts +0 -4
- package/src/nameserver-history-viewer/types/chart-content-data.types.ts +0 -6
- package/src/nameserver-history-viewer/types/chart-content-header.types.ts +0 -4
- package/src/nameserver-history-viewer/types/chart-content-time.types.ts +0 -3
- package/src/nameserver-history-viewer/types/chart-content.types.ts +0 -10
- package/src/nameserver-history-viewer/types/color-rgba.types.ts +0 -6
- package/src/nameserver-history-viewer/types/html-element.type.ts +0 -7
- package/src/nameserver-history-viewer/types/index.ts +0 -27
- package/src/nameserver-history-viewer/types/item.types.ts +0 -12
- package/src/nameserver-history-viewer/types/legend-color.types.ts +0 -5
- package/src/nameserver-history-viewer/types/load-history-info-backup.types.ts +0 -8
- package/src/nameserver-history-viewer/types/load-history-info-columnstore.types.ts +0 -9
- package/src/nameserver-history-viewer/types/load-history-info-host.types.ts +0 -17
- package/src/nameserver-history-viewer/types/load-history-info-item.types.ts +0 -14
- package/src/nameserver-history-viewer/types/load-history-info-persistence.types.ts +0 -12
- package/src/nameserver-history-viewer/types/load-history-info-rowstore.types.ts +0 -7
- package/src/nameserver-history-viewer/types/load-history-info-server.types.ts +0 -11
- package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.ts +0 -11
- package/src/nameserver-history-viewer/types/load-history-info-sql.types.ts +0 -17
- package/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.ts +0 -6
- package/src/nameserver-history-viewer/types/load-history-info-threads.types.ts +0 -10
- package/src/nameserver-history-viewer/types/load-history-info.types.ts +0 -24
- package/src/nameserver-history-viewer/types/port.types.ts +0 -5
- package/src/nameserver-history-viewer/types/scale-group.types.ts +0 -15
- package/src/nameserver-history-viewer/types/unit-category.types.ts +0 -8
- package/src/nameserver-history-viewer/types/unit.types.ts +0 -12
- package/src/nameserver-history-viewer/utils/chart-util.spec.ts +0 -22
- package/src/nameserver-history-viewer/utils/chart-util.ts +0 -30
- package/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.ts +0 -104
- package/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.ts +0 -95
- package/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.ts +0 -196
- package/src/nameserver-history-viewer/utils/chartjs-downsample/index.ts +0 -44
- package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.ts +0 -158
- package/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.ts +0 -249
- package/src/nameserver-history-viewer/utils/chartjs-downsample/utils.ts +0 -122
- package/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.ts +0 -602
- package/src/nameserver-history-viewer/utils/chartjs-zoom/index.ts +0 -1
- package/src/nameserver-history-viewer/utils/file-util.spec.ts +0 -108
- package/src/nameserver-history-viewer/utils/file-util.ts +0 -149
- package/src/nameserver-history-viewer/utils/index.ts +0 -4
- package/src/nameserver-history-viewer/utils/time-util.spec.ts +0 -21
- package/src/nameserver-history-viewer/utils/time-util.ts +0 -113
- package/src/nameserver-history-viewer/utils/ui-util.spec.ts +0 -87
- package/src/nameserver-history-viewer/utils/ui-util.ts +0 -171
- package/src/polyfills.ts +0 -80
- package/src/test.ts +0 -20
- package/src/tsconfig.app.json +0 -12
- package/src/tsconfig.spec.json +0 -19
- package/tsconfig.json +0 -22
- package/tslint.json +0 -130
|
@@ -1,1141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
4
|
-
*/
|
|
5
|
-
import * as tslib_1 from "tslib";
|
|
6
|
-
import { Injectable } from '@angular/core';
|
|
7
|
-
import { getIgnoredLineNumFromTail, isUnitTimeRelated, getValueByUnit, getRoundedValue, calculateYScale } from '../utils';
|
|
8
|
-
import { ScaleGroup, Unit, UnitType, Item } from '../types';
|
|
9
|
-
// Using dynamic flag to fix the issue of ng-packagr #696: Lambda not supported
|
|
10
|
-
// @dynamic
|
|
11
|
-
var UIService = /** @class */ (function () {
|
|
12
|
-
function UIService() {
|
|
13
|
-
this._DEFAULT_DISPLAY_ITEMS = ['cpuUsed', 'indexserverMemUsed', 'mvccNum'];
|
|
14
|
-
this._HIDED_COLUMNS = [Item.yScaleGroup, Item.description];
|
|
15
|
-
this._MEASURE_COLUMNS = [Item.max, Item.average, Item.sum, Item.last];
|
|
16
|
-
this._loadHistoryInfos = {};
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* get the colors for legends
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* get the colors for legends
|
|
23
|
-
* @param {?=} alpha
|
|
24
|
-
* @return {?}
|
|
25
|
-
*/
|
|
26
|
-
UIService.getColors = /**
|
|
27
|
-
* get the colors for legends
|
|
28
|
-
* @param {?=} alpha
|
|
29
|
-
* @return {?}
|
|
30
|
-
*/
|
|
31
|
-
function (alpha) {
|
|
32
|
-
if (alpha === void 0) { alpha = null; }
|
|
33
|
-
if (alpha == null) {
|
|
34
|
-
alpha = 0.8;
|
|
35
|
-
}
|
|
36
|
-
return {
|
|
37
|
-
cpuUsed: this._getRgbColor(199, 21, 133, alpha),
|
|
38
|
-
// mediumvioletred
|
|
39
|
-
memoryResident: this._getRgbColor(238, 130, 238, alpha),
|
|
40
|
-
// violet
|
|
41
|
-
memoryTotalResident: this._getRgbColor(72, 61, 139, alpha),
|
|
42
|
-
// darkslateblue
|
|
43
|
-
memoryUsed: this._getRgbColor(0, 0, 205, alpha),
|
|
44
|
-
// mediumblue
|
|
45
|
-
memoryLimit: this._getRgbColor(255, 105, 180, alpha),
|
|
46
|
-
// hotpink
|
|
47
|
-
memorySize: this._getRgbColor(70, 130, 180, alpha),
|
|
48
|
-
// steelblue
|
|
49
|
-
diskUsed: this._getRgbColor(25, 25, 112, alpha),
|
|
50
|
-
// midnightblue
|
|
51
|
-
diskSize: this._getRgbColor(0, 255, 255, alpha),
|
|
52
|
-
// aqua
|
|
53
|
-
networkIn: this._getRgbColor(102, 51, 153, alpha),
|
|
54
|
-
// rebeccapurple
|
|
55
|
-
networkOut: this._getRgbColor(245, 222, 179, alpha),
|
|
56
|
-
// wheat
|
|
57
|
-
swapIn: this._getRgbColor(47, 79, 79, alpha),
|
|
58
|
-
// darkslategray
|
|
59
|
-
swapOut: this._getRgbColor(205, 92, 92, alpha),
|
|
60
|
-
// indianred
|
|
61
|
-
indexserverCpu: this._getRgbColor(255, 99, 71, alpha),
|
|
62
|
-
// tomato
|
|
63
|
-
indexserverCpuSys: this._getRgbColor(255, 20, 147, alpha),
|
|
64
|
-
// deeppink
|
|
65
|
-
indexserverMemUsed: this._getRgbColor(0, 255, 0, alpha),
|
|
66
|
-
// lime
|
|
67
|
-
indexserverMemLimit: this._getRgbColor(139, 0, 0, alpha),
|
|
68
|
-
// darkred
|
|
69
|
-
indexserverHandles: this._getRgbColor(139, 0, 139, alpha),
|
|
70
|
-
// darkmagenta
|
|
71
|
-
indexserverPingtime: this._getRgbColor(189, 183, 107, alpha),
|
|
72
|
-
// darkkhaki
|
|
73
|
-
indexserverSwapIn: this._getRgbColor(112, 128, 144, alpha),
|
|
74
|
-
// slategray
|
|
75
|
-
sqlConnections: this._getRgbColor(85, 107, 47, alpha),
|
|
76
|
-
// darkolivegreen
|
|
77
|
-
internalConnections: this._getRgbColor(46, 139, 87, alpha),
|
|
78
|
-
// seagreen
|
|
79
|
-
externalConnections: this._getRgbColor(147, 112, 219, alpha),
|
|
80
|
-
// mediumpurple
|
|
81
|
-
idleConnections: this._getRgbColor(216, 191, 216, alpha),
|
|
82
|
-
// thistle
|
|
83
|
-
sqlTransactions: this._getRgbColor(220, 20, 60, alpha),
|
|
84
|
-
// crimson
|
|
85
|
-
internalTransactions: this._getRgbColor(186, 85, 211, alpha),
|
|
86
|
-
// mediumorchid
|
|
87
|
-
externalTransactions: this._getRgbColor(221, 160, 221, alpha),
|
|
88
|
-
// plum
|
|
89
|
-
userTransactions: this._getRgbColor(210, 105, 30, alpha),
|
|
90
|
-
// chocolate
|
|
91
|
-
sqlBlockedTrans: this._getRgbColor(0, 0, 255, alpha),
|
|
92
|
-
// blue
|
|
93
|
-
sqlStatements: this._getRgbColor(188, 143, 143, alpha),
|
|
94
|
-
// rosybrown
|
|
95
|
-
cidRange: this._getRgbColor(32, 178, 170, alpha),
|
|
96
|
-
// lightseagreen
|
|
97
|
-
tidRange: this._getRgbColor(124, 252, 0, alpha),
|
|
98
|
-
// lawngreen
|
|
99
|
-
pendingRequestCount: this._getRgbColor(160, 32, 240, alpha),
|
|
100
|
-
// purple3
|
|
101
|
-
mvccNum: this._getRgbColor(65, 105, 225, alpha),
|
|
102
|
-
// royalblue
|
|
103
|
-
acquiredRecordLocks: this._getRgbColor(0, 250, 154, alpha),
|
|
104
|
-
// mediumspringgreen
|
|
105
|
-
searchCount: this._getRgbColor(127, 255, 212, alpha),
|
|
106
|
-
// aquamarine
|
|
107
|
-
indexingCount: this._getRgbColor(0, 191, 255, alpha),
|
|
108
|
-
// deepskyblue
|
|
109
|
-
mergeCount: this._getRgbColor(135, 206, 235, alpha),
|
|
110
|
-
// skyblue
|
|
111
|
-
unloadCount: this._getRgbColor(255, 165, 0, alpha),
|
|
112
|
-
// orange
|
|
113
|
-
indexserverThreads: this._getRgbColor(0, 100, 0, alpha),
|
|
114
|
-
// darkgreen
|
|
115
|
-
waitingThreads: this._getRgbColor(176, 48, 96, alpha),
|
|
116
|
-
// maroon3
|
|
117
|
-
totalThreads: this._getRgbColor(100, 149, 237, alpha),
|
|
118
|
-
// cornflower
|
|
119
|
-
activeSqlExecutors: this._getRgbColor(175, 238, 238, alpha),
|
|
120
|
-
// paleturquoise
|
|
121
|
-
waitingSqlExecutors: this._getRgbColor(50, 205, 50, alpha),
|
|
122
|
-
// limegreen
|
|
123
|
-
totalSqlExecutors: this._getRgbColor(240, 230, 140, alpha),
|
|
124
|
-
// khaki
|
|
125
|
-
dataWriteSize: this._getRgbColor(102, 205, 170, alpha),
|
|
126
|
-
// mediumaquamarine
|
|
127
|
-
dataWriteTime: this._getRgbColor(169, 169, 169, alpha),
|
|
128
|
-
// darkgray
|
|
129
|
-
logWriteSize: this._getRgbColor(160, 82, 45, alpha),
|
|
130
|
-
// sienna
|
|
131
|
-
logWriteTime: this._getRgbColor(128, 128, 0, alpha),
|
|
132
|
-
// olive
|
|
133
|
-
dataReadSize: this._getRgbColor(255, 215, 0, alpha),
|
|
134
|
-
// gold
|
|
135
|
-
dataReadTime: this._getRgbColor(95, 158, 160, alpha),
|
|
136
|
-
// cadetblue
|
|
137
|
-
logReadSize: this._getRgbColor(255, 0, 0, alpha),
|
|
138
|
-
// red
|
|
139
|
-
logReadTime: this._getRgbColor(184, 134, 11, alpha),
|
|
140
|
-
// darkgoldenrod
|
|
141
|
-
dataBackupWriteSize: this._getRgbColor(255, 255, 0, alpha),
|
|
142
|
-
// yellow
|
|
143
|
-
dataBackupWriteTime: this._getRgbColor(154, 205, 50, alpha),
|
|
144
|
-
// yellowgreen
|
|
145
|
-
logBackupWriteSize: this._getRgbColor(0, 0, 139, alpha),
|
|
146
|
-
// darkblue
|
|
147
|
-
logBackupWriteTime: this._getRgbColor(219, 112, 147, alpha),
|
|
148
|
-
// palevioletred
|
|
149
|
-
mutexCollisionCount: this._getRgbColor(244, 164, 96, alpha),
|
|
150
|
-
// sandybrown
|
|
151
|
-
readWriteLockCollisionCount: this._getRgbColor(233, 150, 122, alpha),
|
|
152
|
-
// darksalmon
|
|
153
|
-
admissinControlAdmitCount: this._getRgbColor(143, 188, 143, alpha),
|
|
154
|
-
// darkseagreen
|
|
155
|
-
admissionControlRejectCount: this._getRgbColor(255, 0, 255, alpha),
|
|
156
|
-
// fuchsia
|
|
157
|
-
admissionControlWaitingRequests: this._getRgbColor(153, 50, 204, alpha),
|
|
158
|
-
// darkorchid
|
|
159
|
-
admissionControlWaitTime: this._getRgbColor(144, 238, 144, alpha),
|
|
160
|
-
};
|
|
161
|
-
};
|
|
162
|
-
Object.defineProperty(UIService, "_unitType", {
|
|
163
|
-
get: /**
|
|
164
|
-
* @private
|
|
165
|
-
* @return {?}
|
|
166
|
-
*/
|
|
167
|
-
function () {
|
|
168
|
-
/** @type {?} */
|
|
169
|
-
var unitType = {};
|
|
170
|
-
unitType[Unit.PCT] = UnitType.TypeEA;
|
|
171
|
-
unitType[Unit.MS] = UnitType.TypeEA;
|
|
172
|
-
unitType[Unit.Empty] = UnitType.TypeEA;
|
|
173
|
-
unitType[Unit.GB] = UnitType.TypeGB;
|
|
174
|
-
unitType[Unit.MB] = UnitType.TypeMB;
|
|
175
|
-
unitType[Unit.MBPerSec] = UnitType.TypeMBSec;
|
|
176
|
-
unitType[Unit.SecPerSec] = UnitType.TypeSecSec;
|
|
177
|
-
unitType[Unit.StmtPerSec] = UnitType.TypeSec;
|
|
178
|
-
unitType[Unit.ReqPerSec] = UnitType.TypeSec;
|
|
179
|
-
unitType[Unit.ColPerSec] = UnitType.TypeSec;
|
|
180
|
-
return unitType;
|
|
181
|
-
},
|
|
182
|
-
enumerable: true,
|
|
183
|
-
configurable: true
|
|
184
|
-
});
|
|
185
|
-
Object.defineProperty(UIService, "_YScaleGroupList", {
|
|
186
|
-
/**
|
|
187
|
-
* get yScale group list from the enum ScaleGroup
|
|
188
|
-
*/
|
|
189
|
-
get: /**
|
|
190
|
-
* get yScale group list from the enum ScaleGroup
|
|
191
|
-
* @private
|
|
192
|
-
* @return {?}
|
|
193
|
-
*/
|
|
194
|
-
function () {
|
|
195
|
-
return Object.keys(ScaleGroup).filter((/**
|
|
196
|
-
* @param {?} key
|
|
197
|
-
* @return {?}
|
|
198
|
-
*/
|
|
199
|
-
function (key) { return !isNaN(Number(ScaleGroup[key])); })).map((/**
|
|
200
|
-
* @param {?} key
|
|
201
|
-
* @return {?}
|
|
202
|
-
*/
|
|
203
|
-
function (key) { return ScaleGroup[key]; }));
|
|
204
|
-
},
|
|
205
|
-
enumerable: true,
|
|
206
|
-
configurable: true
|
|
207
|
-
});
|
|
208
|
-
/**
|
|
209
|
-
* Generate one item by the provided attributes and values
|
|
210
|
-
* @param args the dynamic parameter of [attribute, value]
|
|
211
|
-
*/
|
|
212
|
-
/**
|
|
213
|
-
* Generate one item by the provided attributes and values
|
|
214
|
-
* @private
|
|
215
|
-
* @param {...?} args the dynamic parameter of [attribute, value]
|
|
216
|
-
* @return {?}
|
|
217
|
-
*/
|
|
218
|
-
UIService._generateLoadHistoryInfoItem = /**
|
|
219
|
-
* Generate one item by the provided attributes and values
|
|
220
|
-
* @private
|
|
221
|
-
* @param {...?} args the dynamic parameter of [attribute, value]
|
|
222
|
-
* @return {?}
|
|
223
|
-
*/
|
|
224
|
-
function () {
|
|
225
|
-
var args = [];
|
|
226
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
227
|
-
args[_i] = arguments[_i];
|
|
228
|
-
}
|
|
229
|
-
/** @type {?} */
|
|
230
|
-
var obj = {};
|
|
231
|
-
if (!args || args.length <= 0) {
|
|
232
|
-
return obj;
|
|
233
|
-
}
|
|
234
|
-
args.forEach((/**
|
|
235
|
-
* @param {?} item
|
|
236
|
-
* @return {?}
|
|
237
|
-
*/
|
|
238
|
-
function (item) {
|
|
239
|
-
if (item && item.length >= 2) {
|
|
240
|
-
obj[item[0]] = item[1];
|
|
241
|
-
}
|
|
242
|
-
}));
|
|
243
|
-
return obj;
|
|
244
|
-
};
|
|
245
|
-
/**
|
|
246
|
-
* generate the loadHistoryInfo object with default values.
|
|
247
|
-
*/
|
|
248
|
-
/**
|
|
249
|
-
* generate the loadHistoryInfo object with default values.
|
|
250
|
-
* @private
|
|
251
|
-
* @return {?}
|
|
252
|
-
*/
|
|
253
|
-
UIService._generateLoadHistoryInfo = /**
|
|
254
|
-
* generate the loadHistoryInfo object with default values.
|
|
255
|
-
* @private
|
|
256
|
-
* @return {?}
|
|
257
|
-
*/
|
|
258
|
-
function () {
|
|
259
|
-
// minimum value for YScale of swapIn, swapOut, indexserverSwapIn is 100 (according to hana studio)
|
|
260
|
-
/** @type {?} */
|
|
261
|
-
var infoItem = UIService._generateLoadHistoryInfoItem;
|
|
262
|
-
// just for making the name shorter...
|
|
263
|
-
/** @type {?} */
|
|
264
|
-
var cpuUsed = infoItem([Item.kpi, 'CPU'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.CPU], [Item.unit, Unit.PCT], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'CPU Used by all processes']);
|
|
265
|
-
/** @type {?} */
|
|
266
|
-
var memoryResident = infoItem([Item.kpi, 'Database Resident Memory'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Physical memory used for all HANA processes']);
|
|
267
|
-
/** @type {?} */
|
|
268
|
-
var memoryTotalResident = infoItem([Item.kpi, 'Total Resident Memory'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Physical memory used for all processes']);
|
|
269
|
-
/** @type {?} */
|
|
270
|
-
var memoryUsed = infoItem([Item.kpi, 'Database Used Memory'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory used for all HANA processes']);
|
|
271
|
-
/** @type {?} */
|
|
272
|
-
var memoryLimit = infoItem([Item.kpi, 'Database Allocation Limit'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory allocation limit for all processes of HANA instance']);
|
|
273
|
-
/** @type {?} */
|
|
274
|
-
var memorySize = infoItem([Item.kpi, 'Physical Memory Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Physical memory size']);
|
|
275
|
-
/** @type {?} */
|
|
276
|
-
var diskUsed = infoItem([Item.kpi, 'Disk Used'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Disk], [Item.unit, Unit.GB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Disk used']);
|
|
277
|
-
/** @type {?} */
|
|
278
|
-
var diskSize = infoItem([Item.kpi, 'Disk Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Disk], [Item.unit, Unit.GB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Disk size']);
|
|
279
|
-
/** @type {?} */
|
|
280
|
-
var networkIn = infoItem([Item.kpi, 'Network In'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Network], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from network by all processes']);
|
|
281
|
-
/** @type {?} */
|
|
282
|
-
var networkOut = infoItem([Item.kpi, 'Network Out'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Network], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to network by all processes']);
|
|
283
|
-
/** @type {?} */
|
|
284
|
-
var swapIn = infoItem([Item.kpi, 'Swap In'], [Item.yScale, 100], [Item.yScaleGroup, ScaleGroup.Swap], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from swap by all processes (pswpin line in /proc/vmstat * sysconf(_SC_PAGESIZE))']);
|
|
285
|
-
/** @type {?} */
|
|
286
|
-
var swapOut = infoItem([Item.kpi, 'Swap Out'], [Item.yScale, 100], [Item.yScaleGroup, ScaleGroup.Swap], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written To swap by all processes (pswpout line in /proc/vmstat * sysconf(_SC_PAGESIZE))']);
|
|
287
|
-
/** @type {?} */
|
|
288
|
-
var indexserverCpu = infoItem([Item.kpi, 'Index Server CPU'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.CPU], [Item.unit, Unit.PCT], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'CPU used by Service']);
|
|
289
|
-
/** @type {?} */
|
|
290
|
-
var indexserverCpuSys = infoItem([Item.kpi, 'System CPU'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.CPU], [Item.unit, Unit.PCT], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'OS Kernel/System CPU used by Service']);
|
|
291
|
-
/** @type {?} */
|
|
292
|
-
var indexserverMemUsed = infoItem([Item.kpi, 'Memory Used'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory used by Service']);
|
|
293
|
-
/** @type {?} */
|
|
294
|
-
var indexserverMemLimit = infoItem([Item.kpi, 'Memory Allocation Limit'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory allocation limit for Service']);
|
|
295
|
-
/** @type {?} */
|
|
296
|
-
var indexserverHandles = infoItem([Item.kpi, 'Handles'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open handles']);
|
|
297
|
-
/** @type {?} */
|
|
298
|
-
var indexserverPingtime = infoItem([Item.kpi, 'Ping Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.MS], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Duration of Service ping request (THREAD_METHOD=\'__nsWatchdog\'). This request includes the collection of service specific KPI\'s']);
|
|
299
|
-
/** @type {?} */
|
|
300
|
-
var indexserverSwapIn = infoItem([Item.kpi, 'Index Server Swap In'], [Item.yScale, 100], [Item.yScaleGroup, ScaleGroup.Swap], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from swap by Service (column 12(majflt) in /proc/<pid>/stat * sysconf(_SC_PAGESIZE))']);
|
|
301
|
-
/** @type {?} */
|
|
302
|
-
var sqlConnections = infoItem([Item.kpi, 'Open Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL connections']);
|
|
303
|
-
/** @type {?} */
|
|
304
|
-
var internalConnections = infoItem([Item.kpi, 'Internal Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL internal connections']);
|
|
305
|
-
/** @type {?} */
|
|
306
|
-
var externalConnections = infoItem([Item.kpi, 'External Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL external connections']);
|
|
307
|
-
/** @type {?} */
|
|
308
|
-
var idleConnections = infoItem([Item.kpi, 'Idle Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL idle connections']);
|
|
309
|
-
/** @type {?} */
|
|
310
|
-
var sqlTransactions = infoItem([Item.kpi, 'Open Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL transactions']);
|
|
311
|
-
/** @type {?} */
|
|
312
|
-
var internalTransactions = infoItem([Item.kpi, 'Internal Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of internal transactions']);
|
|
313
|
-
/** @type {?} */
|
|
314
|
-
var externalTransactions = infoItem([Item.kpi, 'External Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of external transactions']);
|
|
315
|
-
/** @type {?} */
|
|
316
|
-
var userTransactions = infoItem([Item.kpi, 'User Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of user transactions']);
|
|
317
|
-
/** @type {?} */
|
|
318
|
-
var sqlBlockedTrans = infoItem([Item.kpi, 'Blocked Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of blocked SQL transactions']);
|
|
319
|
-
/** @type {?} */
|
|
320
|
-
var sqlStatements = infoItem([Item.kpi, 'Statements'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Stmt], [Item.unit, Unit.StmtPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of finished SQL statements']);
|
|
321
|
-
/** @type {?} */
|
|
322
|
-
var cidRange = infoItem([Item.kpi, 'Active Commit ID Range'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Range between newest and oldest active commit ID']);
|
|
323
|
-
/** @type {?} */
|
|
324
|
-
var tidRange = infoItem([Item.kpi, 'Active Transaction ID Range'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Range between newest and oldest active transaction ID']);
|
|
325
|
-
/** @type {?} */
|
|
326
|
-
var pendingRequestCount = infoItem([Item.kpi, 'Pending Request Count'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of pending session requests']);
|
|
327
|
-
/** @type {?} */
|
|
328
|
-
var mvccNum = infoItem([Item.kpi, 'Active Versions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of active MVCC versions']);
|
|
329
|
-
/** @type {?} */
|
|
330
|
-
var acquiredRecordLocks = infoItem([Item.kpi, 'Acquired Record Locks'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of acquired record locks']);
|
|
331
|
-
/** @type {?} */
|
|
332
|
-
var searchCount = infoItem([Item.kpi, 'Read Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of read requests (select)']);
|
|
333
|
-
/** @type {?} */
|
|
334
|
-
var indexingCount = infoItem([Item.kpi, 'Write Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of write requests (insert,update,delete)']);
|
|
335
|
-
/** @type {?} */
|
|
336
|
-
var mergeCount = infoItem([Item.kpi, 'Merge Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of merge requests']);
|
|
337
|
-
/** @type {?} */
|
|
338
|
-
var unloadCount = infoItem([Item.kpi, 'Column Unloads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of column unloads']);
|
|
339
|
-
/** @type {?} */
|
|
340
|
-
var indexserverThreads = infoItem([Item.kpi, 'Active Threads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of active threads']);
|
|
341
|
-
/** @type {?} */
|
|
342
|
-
var waitingThreads = infoItem([Item.kpi, 'Waiting Threads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of waiting threads']);
|
|
343
|
-
/** @type {?} */
|
|
344
|
-
var totalThreads = infoItem([Item.kpi, 'Total Threads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Total number of threads']);
|
|
345
|
-
/** @type {?} */
|
|
346
|
-
var activeSqlExecutors = infoItem([Item.kpi, 'Active SqlExecutors'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of active SqlExecutors']);
|
|
347
|
-
/** @type {?} */
|
|
348
|
-
var waitingSqlExecutors = infoItem([Item.kpi, 'Waiting SqlExecutors'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of waiting SqlExecutors']);
|
|
349
|
-
/** @type {?} */
|
|
350
|
-
var totalSqlExecutors = infoItem([Item.kpi, 'Total SqlExecutors'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Total number of SqlExecutors']);
|
|
351
|
-
/** @type {?} */
|
|
352
|
-
var dataWriteSize = infoItem([Item.kpi, 'Data Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to data area']);
|
|
353
|
-
/** @type {?} */
|
|
354
|
-
var dataWriteTime = infoItem([Item.kpi, 'Data Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to data area']);
|
|
355
|
-
/** @type {?} */
|
|
356
|
-
var logWriteSize = infoItem([Item.kpi, 'Log Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to log area']);
|
|
357
|
-
/** @type {?} */
|
|
358
|
-
var logWriteTime = infoItem([Item.kpi, 'Log Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to log area']);
|
|
359
|
-
/** @type {?} */
|
|
360
|
-
var dataReadSize = infoItem([Item.kpi, 'Data Read Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from data area']);
|
|
361
|
-
/** @type {?} */
|
|
362
|
-
var dataReadTime = infoItem([Item.kpi, 'Data Read Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for reading from data area']);
|
|
363
|
-
/** @type {?} */
|
|
364
|
-
var logReadSize = infoItem([Item.kpi, 'Log Read Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from log area']);
|
|
365
|
-
/** @type {?} */
|
|
366
|
-
var logReadTime = infoItem([Item.kpi, 'Log Read Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for reading from log area']);
|
|
367
|
-
/** @type {?} */
|
|
368
|
-
var dataBackupWriteSize = infoItem([Item.kpi, 'Data Backup Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to data backup']);
|
|
369
|
-
/** @type {?} */
|
|
370
|
-
var dataBackupWriteTime = infoItem([Item.kpi, 'Data Backup Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to data backup']);
|
|
371
|
-
/** @type {?} */
|
|
372
|
-
var logBackupWriteSize = infoItem([Item.kpi, 'Log Backup Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to log backup']);
|
|
373
|
-
/** @type {?} */
|
|
374
|
-
var logBackupWriteTime = infoItem([Item.kpi, 'Log Backup Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to log backup']);
|
|
375
|
-
/** @type {?} */
|
|
376
|
-
var mutexCollisionCount = infoItem([Item.kpi, 'Mutex Collisions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ColPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of collisions on mutexes']);
|
|
377
|
-
/** @type {?} */
|
|
378
|
-
var readWriteLockCollisionCount = infoItem([Item.kpi, 'Read/Write Lock Collisions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ColPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of collisions on read/write locks']);
|
|
379
|
-
/** @type {?} */
|
|
380
|
-
var admissinControlAdmitCount = infoItem([Item.kpi, 'Admitted Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests admitted by admission control']);
|
|
381
|
-
/** @type {?} */
|
|
382
|
-
var admissionControlRejectCount = infoItem([Item.kpi, 'Rejected Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests rejected by admission control']);
|
|
383
|
-
/** @type {?} */
|
|
384
|
-
var admissionControlWaitingRequests = infoItem([Item.kpi, 'Waiting Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests waiting in admission control queue']);
|
|
385
|
-
/** @type {?} */
|
|
386
|
-
var admissionControlWaitTime = infoItem([Item.kpi, 'Wait Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Total wait time of session requests queued in admission control queue']);
|
|
387
|
-
/** @type {?} */
|
|
388
|
-
var admissionControlEnqueueCount = infoItem([Item.kpi, 'Enqueued Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests enqueued by admission control']);
|
|
389
|
-
/** @type {?} */
|
|
390
|
-
var admissionControlDequeueCount = infoItem([Item.kpi, 'Dequeued Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests dequeued by admission control']);
|
|
391
|
-
/** @type {?} */
|
|
392
|
-
var admissionControlTimeoutCount = infoItem([Item.kpi, 'Timed out Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of timed out session requests in admission control queue']);
|
|
393
|
-
// generate Host
|
|
394
|
-
/** @type {?} */
|
|
395
|
-
var loadHistoryInfoHost = {
|
|
396
|
-
cpuUsed: cpuUsed,
|
|
397
|
-
memoryResident: memoryResident,
|
|
398
|
-
memoryTotalResident: memoryTotalResident,
|
|
399
|
-
memoryUsed: memoryUsed,
|
|
400
|
-
memoryLimit: memoryLimit,
|
|
401
|
-
memorySize: memorySize,
|
|
402
|
-
diskUsed: diskUsed,
|
|
403
|
-
diskSize: diskSize,
|
|
404
|
-
networkIn: networkIn,
|
|
405
|
-
networkOut: networkOut,
|
|
406
|
-
swapIn: swapIn,
|
|
407
|
-
swapOut: swapOut,
|
|
408
|
-
};
|
|
409
|
-
// generate Index Server
|
|
410
|
-
/** @type {?} */
|
|
411
|
-
var loadHistoryInfoIndexServer = {
|
|
412
|
-
indexserverCpu: indexserverCpu,
|
|
413
|
-
indexserverCpuSys: indexserverCpuSys,
|
|
414
|
-
indexserverMemUsed: indexserverMemUsed,
|
|
415
|
-
indexserverMemLimit: indexserverMemLimit,
|
|
416
|
-
indexserverHandles: indexserverHandles,
|
|
417
|
-
indexserverPingtime: indexserverPingtime,
|
|
418
|
-
indexserverSwapIn: indexserverSwapIn,
|
|
419
|
-
};
|
|
420
|
-
// generate SQL
|
|
421
|
-
/** @type {?} */
|
|
422
|
-
var loadHistoryInfoSQL = {
|
|
423
|
-
sqlConnections: sqlConnections,
|
|
424
|
-
internalConnections: internalConnections,
|
|
425
|
-
externalConnections: externalConnections,
|
|
426
|
-
idleConnections: idleConnections,
|
|
427
|
-
sqlTransactions: sqlTransactions,
|
|
428
|
-
internalTransactions: internalTransactions,
|
|
429
|
-
externalTransactions: externalTransactions,
|
|
430
|
-
userTransactions: userTransactions,
|
|
431
|
-
sqlBlockedTrans: sqlBlockedTrans,
|
|
432
|
-
sqlStatements: sqlStatements,
|
|
433
|
-
cidRange: cidRange,
|
|
434
|
-
tidRange: tidRange,
|
|
435
|
-
pendingRequestCount: pendingRequestCount,
|
|
436
|
-
};
|
|
437
|
-
// generate Row Store
|
|
438
|
-
/** @type {?} */
|
|
439
|
-
var loadHistoryInfoRowStore = {
|
|
440
|
-
mvccNum: mvccNum,
|
|
441
|
-
acquiredRecordLocks: acquiredRecordLocks,
|
|
442
|
-
};
|
|
443
|
-
// generate Column Store
|
|
444
|
-
/** @type {?} */
|
|
445
|
-
var loadHistoryInfoColumnStore = {
|
|
446
|
-
searchCount: searchCount,
|
|
447
|
-
indexingCount: indexingCount,
|
|
448
|
-
mergeCount: mergeCount,
|
|
449
|
-
unloadCount: unloadCount,
|
|
450
|
-
};
|
|
451
|
-
// generate Threads
|
|
452
|
-
/** @type {?} */
|
|
453
|
-
var loadHistoryInfoThreads = {
|
|
454
|
-
indexserverThreads: indexserverThreads,
|
|
455
|
-
waitingThreads: waitingThreads,
|
|
456
|
-
totalThreads: totalThreads,
|
|
457
|
-
activeSqlExecutors: activeSqlExecutors,
|
|
458
|
-
waitingSqlExecutors: waitingSqlExecutors,
|
|
459
|
-
totalSqlExecutors: totalSqlExecutors,
|
|
460
|
-
};
|
|
461
|
-
// generate Persistence
|
|
462
|
-
/** @type {?} */
|
|
463
|
-
var loadHistoryInfoPersistence = {
|
|
464
|
-
dataWriteSize: dataWriteSize,
|
|
465
|
-
dataWriteTime: dataWriteTime,
|
|
466
|
-
logWriteSize: logWriteSize,
|
|
467
|
-
logWriteTime: logWriteTime,
|
|
468
|
-
dataReadSize: dataReadSize,
|
|
469
|
-
dataReadTime: dataReadTime,
|
|
470
|
-
logReadSize: logReadSize,
|
|
471
|
-
logReadTime: logReadTime,
|
|
472
|
-
};
|
|
473
|
-
// generate Backup
|
|
474
|
-
/** @type {?} */
|
|
475
|
-
var loadHistoryInfoBackup = {
|
|
476
|
-
dataBackupWriteSize: dataBackupWriteSize,
|
|
477
|
-
dataBackupWriteTime: dataBackupWriteTime,
|
|
478
|
-
logBackupWriteSize: logBackupWriteSize,
|
|
479
|
-
logBackupWriteTime: logBackupWriteTime,
|
|
480
|
-
};
|
|
481
|
-
// generate Synchronization Primitives
|
|
482
|
-
/** @type {?} */
|
|
483
|
-
var loadHistoryInfoSynchronizationPrimitives = {
|
|
484
|
-
mutexCollisionCount: mutexCollisionCount,
|
|
485
|
-
readWriteLockCollisionCount: readWriteLockCollisionCount,
|
|
486
|
-
};
|
|
487
|
-
// Session Admission Control
|
|
488
|
-
/** @type {?} */
|
|
489
|
-
var loadHistoryInfoSessionAdmissionControl = {
|
|
490
|
-
admissinControlAdmitCount: admissinControlAdmitCount,
|
|
491
|
-
admissionControlRejectCount: admissionControlRejectCount,
|
|
492
|
-
admissionControlWaitingRequests: admissionControlWaitingRequests,
|
|
493
|
-
admissionControlWaitTime: admissionControlWaitTime,
|
|
494
|
-
admissionControlEnqueueCount: admissionControlEnqueueCount,
|
|
495
|
-
admissionControlDequeueCount: admissionControlDequeueCount,
|
|
496
|
-
admissionControlTimeoutCount: admissionControlTimeoutCount,
|
|
497
|
-
};
|
|
498
|
-
return {
|
|
499
|
-
'Host': loadHistoryInfoHost,
|
|
500
|
-
'Index Server': loadHistoryInfoIndexServer,
|
|
501
|
-
'SQL': loadHistoryInfoSQL,
|
|
502
|
-
'Row Store': loadHistoryInfoRowStore,
|
|
503
|
-
'Column Store': loadHistoryInfoColumnStore,
|
|
504
|
-
'Threads': loadHistoryInfoThreads,
|
|
505
|
-
'Persistence': loadHistoryInfoPersistence,
|
|
506
|
-
'Backup': loadHistoryInfoBackup,
|
|
507
|
-
'Synchronization Primitives': loadHistoryInfoSynchronizationPrimitives,
|
|
508
|
-
'Session Admission Control': loadHistoryInfoSessionAdmissionControl
|
|
509
|
-
};
|
|
510
|
-
};
|
|
511
|
-
/**
|
|
512
|
-
* get rgbcolor object via red, green, blue and alpha.
|
|
513
|
-
*/
|
|
514
|
-
/**
|
|
515
|
-
* get rgbcolor object via red, green, blue and alpha.
|
|
516
|
-
* @private
|
|
517
|
-
* @param {?} red
|
|
518
|
-
* @param {?} green
|
|
519
|
-
* @param {?} blue
|
|
520
|
-
* @param {?} alpha
|
|
521
|
-
* @return {?}
|
|
522
|
-
*/
|
|
523
|
-
UIService._getRgbColor = /**
|
|
524
|
-
* get rgbcolor object via red, green, blue and alpha.
|
|
525
|
-
* @private
|
|
526
|
-
* @param {?} red
|
|
527
|
-
* @param {?} green
|
|
528
|
-
* @param {?} blue
|
|
529
|
-
* @param {?} alpha
|
|
530
|
-
* @return {?}
|
|
531
|
-
*/
|
|
532
|
-
function (red, green, blue, alpha) {
|
|
533
|
-
return { red: red, green: green, blue: blue, alpha: alpha };
|
|
534
|
-
};
|
|
535
|
-
/**
|
|
536
|
-
* @private
|
|
537
|
-
* @param {?} item
|
|
538
|
-
* @param {?} yScale
|
|
539
|
-
* @return {?}
|
|
540
|
-
*/
|
|
541
|
-
UIService._getYScaleForItem = /**
|
|
542
|
-
* @private
|
|
543
|
-
* @param {?} item
|
|
544
|
-
* @param {?} yScale
|
|
545
|
-
* @return {?}
|
|
546
|
-
*/
|
|
547
|
-
function (item, yScale) {
|
|
548
|
-
return yScale > item[Item.yScale] ? (item[Item.unit] === Unit.PCT ? 100 : yScale) : item[Item.yScale];
|
|
549
|
-
};
|
|
550
|
-
/**
|
|
551
|
-
* @private
|
|
552
|
-
* @param {?} groupItems
|
|
553
|
-
* @return {?}
|
|
554
|
-
*/
|
|
555
|
-
UIService._getMaxValueOfGroup = /**
|
|
556
|
-
* @private
|
|
557
|
-
* @param {?} groupItems
|
|
558
|
-
* @return {?}
|
|
559
|
-
*/
|
|
560
|
-
function (groupItems) {
|
|
561
|
-
/** @type {?} */
|
|
562
|
-
var max = 0;
|
|
563
|
-
if (groupItems) {
|
|
564
|
-
max = groupItems.reduce((/**
|
|
565
|
-
* @param {?} maxValue
|
|
566
|
-
* @param {?} current
|
|
567
|
-
* @return {?}
|
|
568
|
-
*/
|
|
569
|
-
function (maxValue, current) {
|
|
570
|
-
return current.Max > maxValue ? current.Max : maxValue;
|
|
571
|
-
}), 0);
|
|
572
|
-
}
|
|
573
|
-
return max;
|
|
574
|
-
};
|
|
575
|
-
/**
|
|
576
|
-
* @private
|
|
577
|
-
* @param {?} port
|
|
578
|
-
* @return {?}
|
|
579
|
-
*/
|
|
580
|
-
UIService.prototype._getLoadHistoryInfo = /**
|
|
581
|
-
* @private
|
|
582
|
-
* @param {?} port
|
|
583
|
-
* @return {?}
|
|
584
|
-
*/
|
|
585
|
-
function (port) {
|
|
586
|
-
if (!this._loadHistoryInfos[port]) {
|
|
587
|
-
this._loadHistoryInfos[port] = UIService._generateLoadHistoryInfo();
|
|
588
|
-
}
|
|
589
|
-
return this._loadHistoryInfos[port];
|
|
590
|
-
};
|
|
591
|
-
/**
|
|
592
|
-
* @private
|
|
593
|
-
* @param {?} itemKey
|
|
594
|
-
* @param {?} port
|
|
595
|
-
* @return {?}
|
|
596
|
-
*/
|
|
597
|
-
UIService.prototype._getProcessingUnit = /**
|
|
598
|
-
* @private
|
|
599
|
-
* @param {?} itemKey
|
|
600
|
-
* @param {?} port
|
|
601
|
-
* @return {?}
|
|
602
|
-
*/
|
|
603
|
-
function (itemKey, port) {
|
|
604
|
-
/** @type {?} */
|
|
605
|
-
var historyDetailItem = this._getItemByKey(itemKey, port);
|
|
606
|
-
if (historyDetailItem) {
|
|
607
|
-
/** @type {?} */
|
|
608
|
-
var unit = historyDetailItem.Unit;
|
|
609
|
-
if (!unit) {
|
|
610
|
-
unit = '';
|
|
611
|
-
}
|
|
612
|
-
return UIService._unitType[unit];
|
|
613
|
-
}
|
|
614
|
-
};
|
|
615
|
-
/**
|
|
616
|
-
* @private
|
|
617
|
-
* @param {?} key
|
|
618
|
-
* @param {?} overview
|
|
619
|
-
* @param {?} unit
|
|
620
|
-
* @param {?} port
|
|
621
|
-
* @return {?}
|
|
622
|
-
*/
|
|
623
|
-
UIService.prototype._setOverview = /**
|
|
624
|
-
* @private
|
|
625
|
-
* @param {?} key
|
|
626
|
-
* @param {?} overview
|
|
627
|
-
* @param {?} unit
|
|
628
|
-
* @param {?} port
|
|
629
|
-
* @return {?}
|
|
630
|
-
*/
|
|
631
|
-
function (key, overview, unit, port) {
|
|
632
|
-
/** @type {?} */
|
|
633
|
-
var historyDetailItem = this._getItemByKey(key, port);
|
|
634
|
-
if (historyDetailItem) {
|
|
635
|
-
historyDetailItem.Max = overview.Max >= 0 ? overview.Max : 0;
|
|
636
|
-
historyDetailItem.Average = overview.Average >= 0 ? overview.Average : 0;
|
|
637
|
-
// only TYPE_CONVERSION_MBSEC and TYPE_CONVERTION_SEC (eg: MB/s, req/s stmt/s...) need sum
|
|
638
|
-
historyDetailItem.Sum = isUnitTimeRelated(unit) ? (overview.Sum >= 0 ? overview.Sum : 0) : '-';
|
|
639
|
-
historyDetailItem.Last = overview.Last >= 0 ? overview.Last : 0;
|
|
640
|
-
}
|
|
641
|
-
};
|
|
642
|
-
/**
|
|
643
|
-
* convert unit values (eg: byte to MB or GB) and generate the control data (sum, max, avg) for one row
|
|
644
|
-
*/
|
|
645
|
-
/**
|
|
646
|
-
* convert unit values (eg: byte to MB or GB) and generate the control data (sum, max, avg) for one row
|
|
647
|
-
* @private
|
|
648
|
-
* @param {?} row
|
|
649
|
-
* @param {?} key
|
|
650
|
-
* @param {?} unit
|
|
651
|
-
* @param {?} port
|
|
652
|
-
* @return {?}
|
|
653
|
-
*/
|
|
654
|
-
UIService.prototype._convertUnitAndGenerateRowControlData = /**
|
|
655
|
-
* convert unit values (eg: byte to MB or GB) and generate the control data (sum, max, avg) for one row
|
|
656
|
-
* @private
|
|
657
|
-
* @param {?} row
|
|
658
|
-
* @param {?} key
|
|
659
|
-
* @param {?} unit
|
|
660
|
-
* @param {?} port
|
|
661
|
-
* @return {?}
|
|
662
|
-
*/
|
|
663
|
-
function (row, key, unit, port) {
|
|
664
|
-
var _this = this;
|
|
665
|
-
return new Promise((/**
|
|
666
|
-
* @param {?} resolve
|
|
667
|
-
* @return {?}
|
|
668
|
-
*/
|
|
669
|
-
function (resolve) {
|
|
670
|
-
if (row) {
|
|
671
|
-
/** @type {?} */
|
|
672
|
-
var overview_1 = { Sum: 0, Max: 0, Average: 0, Last: 0 };
|
|
673
|
-
/** @type {?} */
|
|
674
|
-
var ignoredTailLineNum_1 = getIgnoredLineNumFromTail();
|
|
675
|
-
/** @type {?} */
|
|
676
|
-
var invalidCount_1 = 0;
|
|
677
|
-
// convert unit and calculate the overview data, skip the first, and last three rows.
|
|
678
|
-
row.forEach((/**
|
|
679
|
-
* @param {?} item
|
|
680
|
-
* @param {?} index
|
|
681
|
-
* @param {?} arrayData
|
|
682
|
-
* @return {?}
|
|
683
|
-
*/
|
|
684
|
-
function (item, index, arrayData) {
|
|
685
|
-
// skip ignored line(s) from tail
|
|
686
|
-
if (index <= row.length - ignoredTailLineNum_1 - 1) {
|
|
687
|
-
if (arrayData[index].y >= 0) {
|
|
688
|
-
arrayData[index].y = getValueByUnit(item.y, unit);
|
|
689
|
-
overview_1.Sum += arrayData[index].y;
|
|
690
|
-
if (isUnitTimeRelated(unit)) {
|
|
691
|
-
if (index === 0) {
|
|
692
|
-
// according to hana studio, for those time related column, the first value is set to 0
|
|
693
|
-
arrayData[index].y = 0;
|
|
694
|
-
}
|
|
695
|
-
else {
|
|
696
|
-
// get value for unit like: MB/s (value / seconds)
|
|
697
|
-
/** @type {?} */
|
|
698
|
-
var timeDiff = arrayData[index].x - arrayData[index - 1].x;
|
|
699
|
-
arrayData[index].y = timeDiff !== 0 ? arrayData[index].y * 1000 / timeDiff : 0;
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
arrayData[index].y = getRoundedValue(arrayData[index].y);
|
|
703
|
-
if (arrayData[index].y > overview_1.Max) {
|
|
704
|
-
overview_1.Max = arrayData[index].y;
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
else {
|
|
708
|
-
// set value to 0, for those points with value -1 or < 0
|
|
709
|
-
arrayData[index].y = 0;
|
|
710
|
-
// invalid count + 1, for calculating the average (not time relative)
|
|
711
|
-
invalidCount_1++;
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
}));
|
|
715
|
-
if (row.length >= (ignoredTailLineNum_1 + invalidCount_1)) {
|
|
716
|
-
if (isUnitTimeRelated(unit)) {
|
|
717
|
-
/** @type {?} */
|
|
718
|
-
var timePeriod = row[row.length - ignoredTailLineNum_1 - 1].x - row[0].x;
|
|
719
|
-
overview_1.Average = timePeriod !== 0 ? getRoundedValue(overview_1.Sum * 1000 / timePeriod) : 0;
|
|
720
|
-
}
|
|
721
|
-
else {
|
|
722
|
-
/** @type {?} */
|
|
723
|
-
var validItemCount = row.length - ignoredTailLineNum_1 - invalidCount_1;
|
|
724
|
-
overview_1.Average = validItemCount > 0 ? getRoundedValue(overview_1.Sum / validItemCount) : 0;
|
|
725
|
-
}
|
|
726
|
-
overview_1.Last = row[row.length - ignoredTailLineNum_1 - 1].y;
|
|
727
|
-
overview_1.Sum = getRoundedValue(overview_1.Sum);
|
|
728
|
-
overview_1.Max = getRoundedValue(overview_1.Max);
|
|
729
|
-
// remove those ignored lines
|
|
730
|
-
row.length = row.length - ignoredTailLineNum_1;
|
|
731
|
-
}
|
|
732
|
-
_this._setOverview(key, overview_1, unit, port);
|
|
733
|
-
}
|
|
734
|
-
resolve();
|
|
735
|
-
}));
|
|
736
|
-
};
|
|
737
|
-
/**
|
|
738
|
-
* Loop from all history items, put those history items which
|
|
739
|
-
* have the same yScaleGroup together, using yScaleGroup as key.
|
|
740
|
-
* eg: {__SCALE_GROUP_CPU:[item1, item2...], __SCALE_GROUP_UNKNOWN:[item3, item4...]}
|
|
741
|
-
*/
|
|
742
|
-
/**
|
|
743
|
-
* Loop from all history items, put those history items which
|
|
744
|
-
* have the same yScaleGroup together, using yScaleGroup as key.
|
|
745
|
-
* eg: {__SCALE_GROUP_CPU:[item1, item2...], __SCALE_GROUP_UNKNOWN:[item3, item4...]}
|
|
746
|
-
* @private
|
|
747
|
-
* @param {?} port
|
|
748
|
-
* @return {?}
|
|
749
|
-
*/
|
|
750
|
-
UIService.prototype._getYScaleGroupWithHistoryItems = /**
|
|
751
|
-
* Loop from all history items, put those history items which
|
|
752
|
-
* have the same yScaleGroup together, using yScaleGroup as key.
|
|
753
|
-
* eg: {__SCALE_GROUP_CPU:[item1, item2...], __SCALE_GROUP_UNKNOWN:[item3, item4...]}
|
|
754
|
-
* @private
|
|
755
|
-
* @param {?} port
|
|
756
|
-
* @return {?}
|
|
757
|
-
*/
|
|
758
|
-
function (port) {
|
|
759
|
-
/** @type {?} */
|
|
760
|
-
var yScaleGroup = {};
|
|
761
|
-
/** @type {?} */
|
|
762
|
-
var loadHistoryInfo = this._getLoadHistoryInfo(port);
|
|
763
|
-
Object.keys(loadHistoryInfo).forEach((/**
|
|
764
|
-
* @param {?} parentKey
|
|
765
|
-
* @return {?}
|
|
766
|
-
*/
|
|
767
|
-
function (parentKey) {
|
|
768
|
-
Object.keys(loadHistoryInfo[parentKey]).forEach((/**
|
|
769
|
-
* @param {?} childKey
|
|
770
|
-
* @return {?}
|
|
771
|
-
*/
|
|
772
|
-
function (childKey) {
|
|
773
|
-
/** @type {?} */
|
|
774
|
-
var detailItem = loadHistoryInfo[parentKey][childKey];
|
|
775
|
-
/** @type {?} */
|
|
776
|
-
var yScaleGroupKey = detailItem._YScaleGroup;
|
|
777
|
-
if (!yScaleGroup[yScaleGroupKey]) {
|
|
778
|
-
yScaleGroup[yScaleGroupKey] = [];
|
|
779
|
-
}
|
|
780
|
-
yScaleGroup[yScaleGroupKey].push(detailItem);
|
|
781
|
-
}));
|
|
782
|
-
}));
|
|
783
|
-
return yScaleGroup;
|
|
784
|
-
};
|
|
785
|
-
/**
|
|
786
|
-
* @private
|
|
787
|
-
* @param {?} groupItems
|
|
788
|
-
* @param {?} group
|
|
789
|
-
* @return {?}
|
|
790
|
-
*/
|
|
791
|
-
UIService.prototype._setYScaleOfGroup = /**
|
|
792
|
-
* @private
|
|
793
|
-
* @param {?} groupItems
|
|
794
|
-
* @param {?} group
|
|
795
|
-
* @return {?}
|
|
796
|
-
*/
|
|
797
|
-
function (groupItems, group) {
|
|
798
|
-
if (groupItems) {
|
|
799
|
-
if (group === ScaleGroup.Unknown) {
|
|
800
|
-
groupItems.forEach((/**
|
|
801
|
-
* @param {?} item
|
|
802
|
-
* @return {?}
|
|
803
|
-
*/
|
|
804
|
-
function (item) { return item[Item.yScale] = UIService._getYScaleForItem(item, calculateYScale(item.Max)); }));
|
|
805
|
-
}
|
|
806
|
-
else {
|
|
807
|
-
/** @type {?} */
|
|
808
|
-
var yScale_1 = calculateYScale(UIService._getMaxValueOfGroup(groupItems));
|
|
809
|
-
groupItems.forEach((/**
|
|
810
|
-
* @param {?} item
|
|
811
|
-
* @return {?}
|
|
812
|
-
*/
|
|
813
|
-
function (item) { return item[Item.yScale] = UIService._getYScaleForItem(item, yScale_1); }));
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
};
|
|
817
|
-
/**
|
|
818
|
-
* @private
|
|
819
|
-
* @param {?} key
|
|
820
|
-
* @param {?} port
|
|
821
|
-
* @return {?}
|
|
822
|
-
*/
|
|
823
|
-
UIService.prototype._getItemByKey = /**
|
|
824
|
-
* @private
|
|
825
|
-
* @param {?} key
|
|
826
|
-
* @param {?} port
|
|
827
|
-
* @return {?}
|
|
828
|
-
*/
|
|
829
|
-
function (key, port) {
|
|
830
|
-
var e_1, _a;
|
|
831
|
-
/** @type {?} */
|
|
832
|
-
var loadHistoryInfo = this._getLoadHistoryInfo(port);
|
|
833
|
-
try {
|
|
834
|
-
for (var _b = tslib_1.__values(Object.keys(loadHistoryInfo)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
835
|
-
var itemKey = _c.value;
|
|
836
|
-
if (key in loadHistoryInfo[itemKey]) {
|
|
837
|
-
return loadHistoryInfo[itemKey][key];
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
842
|
-
finally {
|
|
843
|
-
try {
|
|
844
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
845
|
-
}
|
|
846
|
-
finally { if (e_1) throw e_1.error; }
|
|
847
|
-
}
|
|
848
|
-
};
|
|
849
|
-
/**
|
|
850
|
-
* reset the load history info object, to prevent memory leak
|
|
851
|
-
*/
|
|
852
|
-
/**
|
|
853
|
-
* reset the load history info object, to prevent memory leak
|
|
854
|
-
* @return {?}
|
|
855
|
-
*/
|
|
856
|
-
UIService.prototype.clearLoadHistoryInfos = /**
|
|
857
|
-
* reset the load history info object, to prevent memory leak
|
|
858
|
-
* @return {?}
|
|
859
|
-
*/
|
|
860
|
-
function () {
|
|
861
|
-
this._loadHistoryInfos = {};
|
|
862
|
-
};
|
|
863
|
-
/**
|
|
864
|
-
* get all the data for the selection table
|
|
865
|
-
*/
|
|
866
|
-
/**
|
|
867
|
-
* get all the data for the selection table
|
|
868
|
-
* @param {?} headerKeys
|
|
869
|
-
* @param {?} port
|
|
870
|
-
* @param {?} defaultDisplayItems
|
|
871
|
-
* @return {?}
|
|
872
|
-
*/
|
|
873
|
-
UIService.prototype.getSelectionTableRows = /**
|
|
874
|
-
* get all the data for the selection table
|
|
875
|
-
* @param {?} headerKeys
|
|
876
|
-
* @param {?} port
|
|
877
|
-
* @param {?} defaultDisplayItems
|
|
878
|
-
* @return {?}
|
|
879
|
-
*/
|
|
880
|
-
function (headerKeys, port, defaultDisplayItems) {
|
|
881
|
-
/** @type {?} */
|
|
882
|
-
var rows = [];
|
|
883
|
-
/** @type {?} */
|
|
884
|
-
var loadHistoryInfo = this._getLoadHistoryInfo(port);
|
|
885
|
-
/** @type {?} */
|
|
886
|
-
var defaultItems = defaultDisplayItems && defaultDisplayItems.length > 0 ? defaultDisplayItems : this._DEFAULT_DISPLAY_ITEMS;
|
|
887
|
-
Object.keys(loadHistoryInfo).forEach((/**
|
|
888
|
-
* @param {?} keyParent
|
|
889
|
-
* @return {?}
|
|
890
|
-
*/
|
|
891
|
-
function (keyParent) {
|
|
892
|
-
rows.push({ KPI: keyParent, header: true });
|
|
893
|
-
/** @type {?} */
|
|
894
|
-
var len = rows.length;
|
|
895
|
-
rows.push.apply(rows, tslib_1.__spread(Object.keys(loadHistoryInfo[keyParent])
|
|
896
|
-
.filter((/**
|
|
897
|
-
* @param {?} keyChild
|
|
898
|
-
* @return {?}
|
|
899
|
-
*/
|
|
900
|
-
function (keyChild) { return headerKeys.includes(keyChild); }))
|
|
901
|
-
.map((/**
|
|
902
|
-
* @param {?} keyChild
|
|
903
|
-
* @return {?}
|
|
904
|
-
*/
|
|
905
|
-
function (keyChild) {
|
|
906
|
-
loadHistoryInfo[keyParent][keyChild].header = false;
|
|
907
|
-
loadHistoryInfo[keyParent][keyChild].checked = defaultItems.includes(keyChild);
|
|
908
|
-
return loadHistoryInfo[keyParent][keyChild];
|
|
909
|
-
}))));
|
|
910
|
-
if (len === rows.length) {
|
|
911
|
-
// no sub items, remove the header
|
|
912
|
-
rows.pop();
|
|
913
|
-
}
|
|
914
|
-
}));
|
|
915
|
-
return rows;
|
|
916
|
-
};
|
|
917
|
-
/**
|
|
918
|
-
* get all hidden columns. Those hidden columns = input hidden columns + default hidden columns
|
|
919
|
-
* @param hideMeasureColumns the array contains the columns list that need to be hidden.
|
|
920
|
-
*/
|
|
921
|
-
/**
|
|
922
|
-
* get all hidden columns. Those hidden columns = input hidden columns + default hidden columns
|
|
923
|
-
* @param {?} hideMeasureColumns the array contains the columns list that need to be hidden.
|
|
924
|
-
* @return {?}
|
|
925
|
-
*/
|
|
926
|
-
UIService.prototype.getHiddenColumns = /**
|
|
927
|
-
* get all hidden columns. Those hidden columns = input hidden columns + default hidden columns
|
|
928
|
-
* @param {?} hideMeasureColumns the array contains the columns list that need to be hidden.
|
|
929
|
-
* @return {?}
|
|
930
|
-
*/
|
|
931
|
-
function (hideMeasureColumns) {
|
|
932
|
-
var _this = this;
|
|
933
|
-
// only measure columns can be hidden
|
|
934
|
-
/** @type {?} */
|
|
935
|
-
var hideColumns = hideMeasureColumns ? hideMeasureColumns.filter((/**
|
|
936
|
-
* @param {?} column
|
|
937
|
-
* @return {?}
|
|
938
|
-
*/
|
|
939
|
-
function (column) { return _this._MEASURE_COLUMNS.includes(column); })) : [];
|
|
940
|
-
return hideColumns ? this._HIDED_COLUMNS.concat(hideColumns) : this._HIDED_COLUMNS;
|
|
941
|
-
};
|
|
942
|
-
/**
|
|
943
|
-
* get header information and format it to {headKey: key, headText: text}
|
|
944
|
-
*/
|
|
945
|
-
/**
|
|
946
|
-
* get header information and format it to {headKey: key, headText: text}
|
|
947
|
-
* @param {?} keys
|
|
948
|
-
* @param {?} port
|
|
949
|
-
* @return {?}
|
|
950
|
-
*/
|
|
951
|
-
UIService.prototype.getHeader = /**
|
|
952
|
-
* get header information and format it to {headKey: key, headText: text}
|
|
953
|
-
* @param {?} keys
|
|
954
|
-
* @param {?} port
|
|
955
|
-
* @return {?}
|
|
956
|
-
*/
|
|
957
|
-
function (keys, port) {
|
|
958
|
-
var _this = this;
|
|
959
|
-
return keys.map((/**
|
|
960
|
-
* @param {?} key
|
|
961
|
-
* @return {?}
|
|
962
|
-
*/
|
|
963
|
-
function (key) {
|
|
964
|
-
/** @type {?} */
|
|
965
|
-
var item = _this._getItemByKey(key, port);
|
|
966
|
-
if (item != null && 'KPI' in item) {
|
|
967
|
-
return ({ key: key, text: item.KPI });
|
|
968
|
-
}
|
|
969
|
-
else {
|
|
970
|
-
console.warn(key + " is not configured.");
|
|
971
|
-
}
|
|
972
|
-
})).filter((/**
|
|
973
|
-
* @param {?} key
|
|
974
|
-
* @return {?}
|
|
975
|
-
*/
|
|
976
|
-
function (key) { return key != null; }));
|
|
977
|
-
};
|
|
978
|
-
/**
|
|
979
|
-
* Get the selected items, which need to be displayed on the chart.
|
|
980
|
-
* @param headerKeys array that contains the keys of header
|
|
981
|
-
* @param port the relative port
|
|
982
|
-
* @param defaultDisplayItems the items list that will be displayed by default.
|
|
983
|
-
*/
|
|
984
|
-
/**
|
|
985
|
-
* Get the selected items, which need to be displayed on the chart.
|
|
986
|
-
* @param {?} headerKeys array that contains the keys of header
|
|
987
|
-
* @param {?} port the relative port
|
|
988
|
-
* @param {?} defaultDisplayItems the items list that will be displayed by default.
|
|
989
|
-
* @return {?}
|
|
990
|
-
*/
|
|
991
|
-
UIService.prototype.getDisplayItems = /**
|
|
992
|
-
* Get the selected items, which need to be displayed on the chart.
|
|
993
|
-
* @param {?} headerKeys array that contains the keys of header
|
|
994
|
-
* @param {?} port the relative port
|
|
995
|
-
* @param {?} defaultDisplayItems the items list that will be displayed by default.
|
|
996
|
-
* @return {?}
|
|
997
|
-
*/
|
|
998
|
-
function (headerKeys, port, defaultDisplayItems) {
|
|
999
|
-
/** @type {?} */
|
|
1000
|
-
var selectionTable = this.getSelectionTableRows(headerKeys, port, defaultDisplayItems);
|
|
1001
|
-
return selectionTable.filter((/**
|
|
1002
|
-
* @param {?} row
|
|
1003
|
-
* @return {?}
|
|
1004
|
-
*/
|
|
1005
|
-
function (row) { return row.checked; })).map((/**
|
|
1006
|
-
* @param {?} row
|
|
1007
|
-
* @return {?}
|
|
1008
|
-
*/
|
|
1009
|
-
function (row) { return row.KPI; }));
|
|
1010
|
-
};
|
|
1011
|
-
/**
|
|
1012
|
-
* Get the Y Scale by the keys and port
|
|
1013
|
-
*/
|
|
1014
|
-
/**
|
|
1015
|
-
* Get the Y Scale by the keys and port
|
|
1016
|
-
* @param {?} keys
|
|
1017
|
-
* @param {?} port
|
|
1018
|
-
* @return {?}
|
|
1019
|
-
*/
|
|
1020
|
-
UIService.prototype.getYScale = /**
|
|
1021
|
-
* Get the Y Scale by the keys and port
|
|
1022
|
-
* @param {?} keys
|
|
1023
|
-
* @param {?} port
|
|
1024
|
-
* @return {?}
|
|
1025
|
-
*/
|
|
1026
|
-
function (keys, port) {
|
|
1027
|
-
var _this = this;
|
|
1028
|
-
/** @type {?} */
|
|
1029
|
-
var yScales = [];
|
|
1030
|
-
if (keys) {
|
|
1031
|
-
keys.forEach((/**
|
|
1032
|
-
* @param {?} key
|
|
1033
|
-
* @return {?}
|
|
1034
|
-
*/
|
|
1035
|
-
function (key) {
|
|
1036
|
-
yScales.push(_this._getItemByKey(key, port)[Item.yScale]);
|
|
1037
|
-
}));
|
|
1038
|
-
}
|
|
1039
|
-
return yScales;
|
|
1040
|
-
};
|
|
1041
|
-
/**
|
|
1042
|
-
* Generate Y Scale for the port
|
|
1043
|
-
*/
|
|
1044
|
-
/**
|
|
1045
|
-
* Generate Y Scale for the port
|
|
1046
|
-
* @param {?} port
|
|
1047
|
-
* @return {?}
|
|
1048
|
-
*/
|
|
1049
|
-
UIService.prototype.generateYScale = /**
|
|
1050
|
-
* Generate Y Scale for the port
|
|
1051
|
-
* @param {?} port
|
|
1052
|
-
* @return {?}
|
|
1053
|
-
*/
|
|
1054
|
-
function (port) {
|
|
1055
|
-
var _this = this;
|
|
1056
|
-
/** @type {?} */
|
|
1057
|
-
var yScaleGroup = this._getYScaleGroupWithHistoryItems(port);
|
|
1058
|
-
UIService._YScaleGroupList.forEach((/**
|
|
1059
|
-
* @param {?} group
|
|
1060
|
-
* @return {?}
|
|
1061
|
-
*/
|
|
1062
|
-
function (group) {
|
|
1063
|
-
/** @type {?} */
|
|
1064
|
-
var historyItems = yScaleGroup[group];
|
|
1065
|
-
if (historyItems) {
|
|
1066
|
-
_this._setYScaleOfGroup(historyItems, group);
|
|
1067
|
-
}
|
|
1068
|
-
}));
|
|
1069
|
-
};
|
|
1070
|
-
/**
|
|
1071
|
-
* convert unit values (eg: byte to MB or GB) and generate the control data (sum, max, avg)
|
|
1072
|
-
* @param data the nameserver history data
|
|
1073
|
-
* @param header header list
|
|
1074
|
-
* @param port selected port
|
|
1075
|
-
*/
|
|
1076
|
-
/**
|
|
1077
|
-
* convert unit values (eg: byte to MB or GB) and generate the control data (sum, max, avg)
|
|
1078
|
-
* @param {?} data the nameserver history data
|
|
1079
|
-
* @param {?} header header list
|
|
1080
|
-
* @param {?} port selected port
|
|
1081
|
-
* @return {?}
|
|
1082
|
-
*/
|
|
1083
|
-
UIService.prototype.convertUnitAndGenerateControlData = /**
|
|
1084
|
-
* convert unit values (eg: byte to MB or GB) and generate the control data (sum, max, avg)
|
|
1085
|
-
* @param {?} data the nameserver history data
|
|
1086
|
-
* @param {?} header header list
|
|
1087
|
-
* @param {?} port selected port
|
|
1088
|
-
* @return {?}
|
|
1089
|
-
*/
|
|
1090
|
-
function (data, header, port) {
|
|
1091
|
-
var _this = this;
|
|
1092
|
-
/** @type {?} */
|
|
1093
|
-
var promises = [];
|
|
1094
|
-
if (data && header) {
|
|
1095
|
-
data.forEach((/**
|
|
1096
|
-
* @param {?} row
|
|
1097
|
-
* @param {?} index
|
|
1098
|
-
* @return {?}
|
|
1099
|
-
*/
|
|
1100
|
-
function (row, index) {
|
|
1101
|
-
if (row) {
|
|
1102
|
-
// get detail history item key, like indexserverCpu
|
|
1103
|
-
/** @type {?} */
|
|
1104
|
-
var itemKey = header[index];
|
|
1105
|
-
/** @type {?} */
|
|
1106
|
-
var unit = _this._getProcessingUnit(itemKey, port);
|
|
1107
|
-
promises.push(_this._convertUnitAndGenerateRowControlData(row, itemKey, unit, port));
|
|
1108
|
-
}
|
|
1109
|
-
}));
|
|
1110
|
-
}
|
|
1111
|
-
return Promise.all(promises);
|
|
1112
|
-
};
|
|
1113
|
-
UIService.decorators = [
|
|
1114
|
-
{ type: Injectable }
|
|
1115
|
-
];
|
|
1116
|
-
return UIService;
|
|
1117
|
-
}());
|
|
1118
|
-
export { UIService };
|
|
1119
|
-
if (false) {
|
|
1120
|
-
/**
|
|
1121
|
-
* @type {?}
|
|
1122
|
-
* @private
|
|
1123
|
-
*/
|
|
1124
|
-
UIService.prototype._DEFAULT_DISPLAY_ITEMS;
|
|
1125
|
-
/**
|
|
1126
|
-
* @type {?}
|
|
1127
|
-
* @private
|
|
1128
|
-
*/
|
|
1129
|
-
UIService.prototype._HIDED_COLUMNS;
|
|
1130
|
-
/**
|
|
1131
|
-
* @type {?}
|
|
1132
|
-
* @private
|
|
1133
|
-
*/
|
|
1134
|
-
UIService.prototype._MEASURE_COLUMNS;
|
|
1135
|
-
/**
|
|
1136
|
-
* @type {?}
|
|
1137
|
-
* @private
|
|
1138
|
-
*/
|
|
1139
|
-
UIService.prototype._loadHistoryInfos;
|
|
1140
|
-
}
|
|
1141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1oYW5hLW5hbWVzZXJ2ZXItaGlzdG9yeS12aWV3ZXIvIiwic291cmNlcyI6WyJzcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci9zZXJ2aWNlcy91aS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUgsT0FBTyxFQWlCTCxVQUFVLEVBQ1YsSUFBSSxFQUNKLFFBQVEsRUFDUixJQUFJLEVBQ0wsTUFBTSxVQUFVLENBQUM7OztBQUlsQjtJQUFBO1FBRW1CLDJCQUFzQixHQUFhLENBQUMsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hGLG1CQUFjLEdBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRSxxQkFBZ0IsR0FBYSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRixzQkFBaUIsR0FBRyxFQUFFLENBQUM7SUF1akJqQyxDQUFDO0lBcmpCQzs7T0FFRzs7Ozs7O0lBQ1csbUJBQVM7Ozs7O0lBQXZCLFVBQXdCLEtBQW9CO1FBQXBCLHNCQUFBLEVBQUEsWUFBb0I7UUFDMUMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ2pCLEtBQUssR0FBRyxHQUFHLENBQUM7U0FDYjtRQUNELE9BQU87WUFDTCxPQUFPLEVBQTBCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDOztZQUN2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USxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQXlCLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsMkJBQTJCLENBQUMsQ0FBQzs7WUFDdFMsY0FBYyxHQUFvQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsNkNBQTZDLENBQUMsQ0FBQzs7WUFDeFQsbUJBQW1CLEdBQWUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7O1lBQ25ULFVBQVUsR0FBd0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBUSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLG9DQUFvQyxDQUFDLENBQUM7O1lBQy9TLFdBQVcsR0FBdUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSwyQkFBMkIsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDREQUE0RCxDQUFDLENBQUM7O1lBQ3ZVLFVBQVUsR0FBd0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBUSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHNCQUFzQixDQUFDLENBQUM7O1lBQ2pTLFFBQVEsR0FBMEIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7O1lBQ3RSLFFBQVEsR0FBMEIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7O1lBQ3RSLFNBQVMsR0FBeUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENB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QUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxrREFBa0QsQ0FBQyxDQUFDOztZQUM3VCxRQUFRLEdBQTBCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsNkJBQTZCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSx1REFBdUQsQ0FBQyxDQUFDOztZQUNsVSxtQkFBbUIsR0FBZSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLHVCQUF1QixDQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsb0NBQW9DLENBQUMsQ0FBQzs7WUFDL1MsT0FBTyxHQUEyQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQzs7WUFDM1MsbUJBQW1CLEdBQWUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7O1lBQzVTLFdBQVcsR0FBdUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDOztZQUM3UyxhQUFhLEdBQXFCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxpREFBaUQsQ0FBQyxDQUFDOztZQUM1VCxVQUFVLEdBQXdCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDOztZQUNyUyxXQUFXLEdBQXVCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxD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LEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDhCQUE4QixDQUFDLENBQUM7O1lBQ3pTLGFBQWEsR0FBcUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBYSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDRCQUE0QixDQUFDLENBQUM7O1lBQ3ZTLGFBQWEsR0FBcUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBYSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLG9DQUFvQyxDQUFDLENBQUM7O1lBQy9TLFlBQVksR0FBc0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLENBQUM7O1lBQ3RTLFlBQVksR0FBc0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7O1lBQzlTLFlBQVksR0FBc0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLENBQUM7O1lBQ3RTLFlBQVksR0FBc0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHNDQUFzQyxDQUFDLENBQUM7O1lBQ2pULFdBQVcsR0FB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QyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsMERBQTBELENBQUMsQ0FBQzs7WUFDclUsNEJBQTRCLEdBQU0sUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDBEQUEwRCxDQUFDLENBQUM7O1lBQ3JVLDRCQUE0QixHQUFNLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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WUFBWSxFQUFFO2dCQUNoQixLQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzdDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7Ozs7Ozs7O0lBQ0kscURBQWlDOzs7Ozs7O0lBQXhDLFVBQXlDLElBQThCLEVBQUUsTUFBZ0IsRUFBRSxJQUFZO1FBQXZHLGlCQWFDOztZQVpPLFFBQVEsR0FBRyxFQUFFO1FBQ25CLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRTtZQUNsQixJQUFJLENBQUMsT0FBTzs7Ozs7WUFBQyxVQUFDLEdBQUcsRUFBRSxLQUFLO2dCQUN0QixJQUFJLEdBQUcsRUFBRTs7O3dCQUVELE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDOzt3QkFDdkIsSUFBSSxHQUFHLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO29CQUNuRCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUNyRjtZQUNILENBQUMsRUFBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7Z0JBM2pCRixVQUFVOztJQTRqQlgsZ0JBQUM7Q0FBQSxBQTVqQkQsSUE0akJDO1NBM2pCWSxTQUFTOzs7Ozs7SUFDcEIsMkNBQWlHOzs7OztJQUNqRyxtQ0FBaUY7Ozs7O0lBQ2pGLHFDQUE0Rjs7Ozs7SUFDNUYsc0NBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBnZXRJZ25vcmVkTGluZU51bUZyb21UYWlsLCBpc1VuaXRUaW1lUmVsYXRlZCwgZ2V0VmFsdWVCeVVuaXQsIGdldFJvdW5kZWRWYWx1ZSwgY2FsY3VsYXRlWVNjYWxlIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIENvbG9yUmdiYSxcclxuICBMb2FkSGlzdG9yeUluZm8sXHJcbiAgTG9hZEhpc3RvcnlJbmZvQmFja3VwLFxyXG4gIExvYWRIaXN0b3J5SW5mb0NvbHVtblN0b3JlLFxyXG4gIExvYWRIaXN0b3J5SW5mb0hvc3QsXHJcbiAgTG9hZEhpc3RvcnlJbmZvSW5kZXhTZXJ2ZXIsXHJcbiAgTG9hZEhpc3RvcnlJbmZvSXRlbSxcclxuICBMb2FkSGlzdG9yeUluZm9QZXJzaXN0ZW5jZSxcclxuICBMb2FkSGlzdG9yeUluZm9Sb3dTdG9yZSxcclxuICBMb2FkSGlzdG9yeUluZm9TZXNzaW9uQWRtaXNzaW9uQ29udHJvbCxcclxuICBMb2FkSGlzdG9yeUluZm9TUUwsXHJcbiAgTG9hZEhpc3RvcnlJbmZvU3luY1ByaW1pdGl2ZXMsXHJcbiAgTG9hZEhpc3RvcnlJbmZvVGhyZWFkcyxcclxuICBDaGFydENvbnRlbnREYXRhSXRlbSxcclxuICBDaGFydENvbnRlbnRIZWFkZXIsXHJcbiAgTGVnZW5kQ29sb3IsXHJcbiAgU2NhbGVHcm91cCxcclxuICBVbml0LFxyXG4gIFVuaXRUeXBlLFxyXG4gIEl0ZW1cclxufSBmcm9tICcuLi90eXBlcyc7XHJcblxyXG4vLyBVc2luZyBkeW5hbWljIGZsYWcgdG8gZml4IHRoZSBpc3N1ZSBvZiBuZy1wYWNrYWdyICM2OTY6IExhbWJkYSBub3Qgc3VwcG9ydGVkXHJcbi8vIEBkeW5hbWljXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFVJU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfREVGQVVMVF9ESVNQTEFZX0lURU1TOiBzdHJpbmdbXSA9IFsnY3B1VXNlZCcsICdpbmRleHNlcnZlck1lbVVzZWQnLCAnbXZjY051bSddO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX0hJREVEX0NPTFVNTlM6IHN0cmluZ1tdID0gW0l0ZW0ueVNjYWxlR3JvdXAsIEl0ZW0uZGVzY3JpcHRpb25dO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX01FQVNVUkVfQ09MVU1OUzogc3RyaW5nW10gPSBbSXRlbS5tYXgsIEl0ZW0uYXZlcmFnZSwgSXRlbS5zdW0sIEl0ZW0ubGFzdF07XHJcbiAgcHJpdmF0ZSBfbG9hZEhpc3RvcnlJbmZvcyA9IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBnZXQgdGhlIGNvbG9ycyBmb3IgbGVnZW5kc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q29sb3JzKGFscGhhOiBudW1iZXIgPSBudWxsKTogTGVnZW5kQ29sb3Ige1xyXG4gICAgaWYgKGFscGhhID09IG51bGwpIHtcclxuICAgICAgYWxwaGEgPSAwLjg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjcHVVc2VkICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxOTksIDIxLCAxMzMsIGFscGhhKSwgLy8gbWVkaXVtdmlvbGV0cmVkXHJcbiAgICAgIG1lbW9yeVJlc2lkZW50ICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIzOCwgMTMwLCAyMzgsIGFscGhhKSwgLy8gdmlvbGV0XHJcbiAgICAgIG1lbW9yeVRvdGFsUmVzaWRlbnQgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDcyLCA2MSwgMTM5LCBhbHBoYSksIC8vIGRhcmtzbGF0ZWJsdWVcclxuICAgICAgbWVtb3J5VXNlZCAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMCwgMjA1LCBhbHBoYSksIC8vIG1lZGl1bWJsdWVcclxuICAgICAgbWVtb3J5TGltaXQgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjU1LCAxMDUsIDE4MCwgYWxwaGEpLCAvLyBob3RwaW5rXHJcbiAgICAgIG1lbW9yeVNpemUgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDcwLCAxMzAsIDE4MCwgYWxwaGEpLCAvLyBzdGVlbGJsdWVcclxuICAgICAgZGlza1VzZWQgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjUsIDI1LCAxMTIsIGFscGhhKSwgLy8gbWlkbmlnaHRibHVlXHJcbiAgICAgIGRpc2tTaXplICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDAsIDI1NSwgMjU1LCBhbHBoYSksIC8vIGFxdWFcclxuICAgICAgbmV0d29ya0luICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTAyLCA1MSwgMTUzLCBhbHBoYSksIC8vIHJlYmVjY2FwdXJwbGVcclxuICAgICAgbmV0d29ya091dCAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjQ1LCAyMjIsIDE3OSwgYWxwaGEpLCAvLyB3aGVhdFxyXG4gICAgICBzd2FwSW4gICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcig0NywgNzksIDc5LCBhbHBoYSksIC8vIGRhcmtzbGF0ZWdyYXlcclxuICAgICAgc3dhcE91dCAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjA1LCA5MiwgOTIsIGFscGhhKSwgLy8gaW5kaWFucmVkXHJcbiAgICAgIGluZGV4c2VydmVyQ3B1ICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1NSwgOTksIDcxLCBhbHBoYSksIC8vIHRvbWF0b1xyXG4gICAgICBpbmRleHNlcnZlckNwdVN5cyAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyNTUsIDIwLCAxNDcsIGFscGhhKSwgLy8gZGVlcHBpbmtcclxuICAgICAgaW5kZXhzZXJ2ZXJNZW1Vc2VkICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMjU1LCAwLCBhbHBoYSksIC8vIGxpbWVcclxuICAgICAgaW5kZXhzZXJ2ZXJNZW1MaW1pdCAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTM5LCAwLCAwLCBhbHBoYSksIC8vIGRhcmtyZWRcclxuICAgICAgaW5kZXhzZXJ2ZXJIYW5kbGVzICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTM5LCAwLCAxMzksIGFscGhhKSwgLy8gZGFya21hZ2VudGFcclxuICAgICAgaW5kZXhzZXJ2ZXJQaW5ndGltZSAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTg5LCAxODMsIDEwNywgYWxwaGEpLCAvLyBkYXJra2hha2lcclxuICAgICAgaW5kZXhzZXJ2ZXJTd2FwSW4gICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTEyLCAxMjgsIDE0NCwgYWxwaGEpLCAvLyBzbGF0ZWdyYXlcclxuICAgICAgc3FsQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoODUsIDEwNywgNDcsIGFscGhhKSwgLy8gZGFya29saXZlZ3JlZW5cclxuICAgICAgaW50ZXJuYWxDb25uZWN0aW9ucyAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoNDYsIDEzOSwgODcsIGFscGhhKSwgLy8gc2VhZ3JlZW5cclxuICAgICAgZXh0ZXJuYWxDb25uZWN0aW9ucyAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTQ3LCAxMTIsIDIxOSwgYWxwaGEpLCAvLyBtZWRpdW1wdXJwbGVcclxuICAgICAgaWRsZUNvbm5lY3Rpb25zICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjE2LCAxOTEsIDIxNiwgYWxwaGEpLCAvLyB0aGlzdGxlXHJcbiAgICAgIHNxbFRyYW5zYWN0aW9ucyAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIyMCwgMjAsIDYwLCBhbHBoYSksIC8vIGNyaW1zb25cclxuICAgICAgaW50ZXJuYWxUcmFuc2FjdGlvbnMgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTg2LCA4NSwgMjExLCBhbHBoYSksIC8vIG1lZGl1bW9yY2hpZFxyXG4gICAgICBleHRlcm5hbFRyYW5zYWN0aW9ucyAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyMjEsIDE2MCwgMjIxLCBhbHBoYSksIC8vIHBsdW1cclxuICAgICAgdXNlclRyYW5zYWN0aW9ucyAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjEwLCAxMDUsIDMwLCBhbHBoYSksIC8vIGNob2NvbGF0ZVxyXG4gICAgICBzcWxCbG9ja2VkVHJhbnMgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigwLCAwLCAyNTUsIGFscGhhKSwgLy8gYmx1ZVxyXG4gICAgICBzcWxTdGF0ZW1lbnRzICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxODgsIDE0MywgMTQzLCBhbHBoYSksIC8vIHJvc3licm93blxyXG4gICAgICBjaWRSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigzMiwgMTc4LCAxNzAsIGFscGhhKSwgLy8gbGlnaHRzZWFncmVlblxyXG4gICAgICB0aWRSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxMjQsIDI1MiwgMCwgYWxwaGEpLCAvLyBsYXduZ3JlZW5cclxuICAgICAgcGVuZGluZ1JlcXVlc3RDb3VudCAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTYwLCAzMiwgMjQwLCBhbHBoYSksIC8vIHB1cnBsZTNcclxuICAgICAgbXZjY051bSAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoNjUsIDEwNSwgMjI1LCBhbHBoYSksIC8vIHJveWFsYmx1ZVxyXG4gICAgICBhY3F1aXJlZFJlY29yZExvY2tzICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigwLCAyNTAsIDE1NCwgYWxwaGEpLCAvLyBtZWRpdW1zcHJpbmdncmVlblxyXG4gICAgICBzZWFyY2hDb3VudCAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxMjcsIDI1NSwgMjEyLCBhbHBoYSksIC8vIGFxdWFtYXJpbmVcclxuICAgICAgaW5kZXhpbmdDb3VudCAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMTkxLCAyNTUsIGFscGhhKSwgLy8gZGVlcHNreWJsdWVcclxuICAgICAgbWVyZ2VDb3VudCAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTM1LCAyMDYsIDIzNSwgYWxwaGEpLCAvLyBza3libHVlXHJcbiAgICAgIHVubG9hZENvdW50ICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1NSwgMTY1LCAwLCBhbHBoYSksIC8vIG9yYW5nZVxyXG4gICAgICBpbmRleHNlcnZlclRocmVhZHMgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigwLCAxMDAsIDAsIGFscGhhKSwgLy8gZGFya2dyZWVuXHJcbiAgICAgIHdhaXRpbmdUaHJlYWRzICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE3NiwgNDgsIDk2LCBhbHBoYSksIC8vIG1hcm9vbjNcclxuICAgICAgdG90YWxUaHJlYWRzICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTAwLCAxNDksIDIzNywgYWxwaGEpLCAvLyBjb3JuZmxvd2VyXHJcbiAgICAgIGFjdGl2ZVNxbEV4ZWN1dG9ycyAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE3NSwgMjM4LCAyMzgsIGFscGhhKSwgLy8gcGFsZXR1cnF1b2lzZVxyXG4gICAgICB3YWl0aW5nU3FsRXhlY3V0b3JzICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcig1MCwgMjA1LCA1MCwgYWxwaGEpLCAvLyBsaW1lZ3JlZW5cclxuICAgICAgdG90YWxTcWxFeGVjdXRvcnMgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjQwLCAyMzAsIDE0MCwgYWxwaGEpLCAvLyBraGFraVxyXG4gICAgICBkYXRhV3JpdGVTaXplICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxMDIsIDIwNSwgMTcwLCBhbHBoYSksIC8vIG1lZGl1bWFxdWFtYXJpbmVcclxuICAgICAgZGF0YVdyaXRlVGltZSAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTY5LCAxNjksIDE2OSwgYWxwaGEpLCAvLyBkYXJrZ3JheVxyXG4gICAgICBsb2dXcml0ZVNpemUgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxNjAsIDgyLCA0NSwgYWxwaGEpLCAvLyBzaWVubmFcclxuICAgICAgbG9nV3JpdGVUaW1lICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTI4LCAxMjgsIDAsIGFscGhhKSwgLy8gb2xpdmVcclxuICAgICAgZGF0YVJlYWRTaXplICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjU1LCAyMTUsIDAsIGFscGhhKSwgLy8gZ29sZFxyXG4gICAgICBkYXRhUmVhZFRpbWUgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcig5NSwgMTU4LCAxNjAsIGFscGhhKSwgLy8gY2FkZXRibHVlXHJcbiAgICAgIGxvZ1JlYWRTaXplICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1NSwgMCwgMCwgYWxwaGEpLCAvLyByZWRcclxuICAgICAgbG9nUmVhZFRpbWUgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTg0LCAxMzQsIDExLCBhbHBoYSksIC8vIGRhcmtnb2xkZW5yb2RcclxuICAgICAgZGF0YUJhY2t1cFdyaXRlU2l6ZSAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjU1LCAyNTUsIDAsIGFscGhhKSwgLy8geWVsbG93XHJcbiAgICAgIGRhdGFCYWNrdXBXcml0ZVRpbWUgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE1NCwgMjA1LCA1MCwgYWxwaGEpLCAvLyB5ZWxsb3dncmVlblxyXG4gICAgICBsb2dCYWNrdXBXcml0ZVNpemUgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigwLCAwLCAxMzksIGFscGhhKSwgLy8gZGFya2JsdWVcclxuICAgICAgbG9nQmFja3VwV3JpdGVUaW1lICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjE5LCAxMTIsIDE0NywgYWxwaGEpLCAvLyBwYWxldmlvbGV0cmVkXHJcbiAgICAgIG11dGV4Q29sbGlzaW9uQ291bnQgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI0NCwgMTY0LCA5NiwgYWxwaGEpLCAvLyBzYW5keWJyb3duXHJcbiAgICAgIHJlYWRXcml0ZUxvY2tDb2xsaXNpb25Db3VudCAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIzMywgMTUwLCAxMjIsIGFscGhhKSwgLy8gZGFya3NhbG1vblxyXG4gICAgICBhZG1pc3NpbkNvbnRyb2xBZG1pdENvdW50ICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxNDMsIDE4OCwgMTQzLCBhbHBoYSksIC8vIGRhcmtzZWFncmVlblxyXG4gICAgICBhZG1pc3Npb25Db250cm9sUmVqZWN0Q291bnQgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyNTUsIDAsIDI1NSwgYWxwaGEpLCAvLyBmdWNoc2lhXHJcbiAgICAgIGFkbWlzc2lvbkNvbnRyb2xXYWl0aW5nUmVxdWVzdHM6IHRoaXMuX2dldFJnYkNvbG9yKDE1MywgNTAsIDIwNCwgYWxwaGEpLCAvLyBkYXJrb3JjaGlkXHJcbiAgICAgIGFkbWlzc2lvbkNvbnRyb2xXYWl0VGltZSAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE0NCwgMjM4LCAxNDQsIGFscGhhKSwgLy8gbGlnaHRncmVlblxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGdldCBfdW5pdFR5cGUoKTogYW55IHtcclxuICAgIGNvbnN0IHVuaXRUeXBlID0ge307XHJcbiAgICB1bml0VHlwZVtVbml0LlBDVF0gPSBVbml0VHlwZS5UeXBlRUE7XHJcbiAgICB1bml0VHlwZVtVbml0Lk1TXSA9IFVuaXRUeXBlLlR5cGVFQTtcclxuICAgIHVuaXRUeXBlW1VuaXQuRW1wdHldID0gVW5pdFR5cGUuVHlwZUVBO1xyXG4gICAgdW5pdFR5cGVbVW5pdC5HQl0gPSBVbml0VHlwZS5UeXBlR0I7XHJcbiAgICB1bml0VHlwZVtVbml0Lk1CXSA9IFVuaXRUeXBlLlR5cGVNQjtcclxuICAgIHVuaXRUeXBlW1VuaXQuTUJQZXJTZWNdID0gVW5pdFR5cGUuVHlwZU1CU2VjO1xyXG4gICAgdW5pdFR5cGVbVW5pdC5TZWNQZXJTZWNdID0gVW5pdFR5cGUuVHlwZVNlY1NlYztcclxuICAgIHVuaXRUeXBlW1VuaXQuU3RtdFBlclNlY10gPSBVbml0VHlwZS5UeXBlU2VjO1xyXG4gICAgdW5pdFR5cGVbVW5pdC5SZXFQZXJTZWNdID0gVW5pdFR5cGUuVHlwZVNlYztcclxuICAgIHVuaXRUeXBlW1VuaXQuQ29sUGVyU2VjXSA9IFVuaXRUeXBlLlR5cGVTZWM7XHJcbiAgICByZXR1cm4gdW5pdFR5cGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgeVNjYWxlIGdyb3VwIGxpc3QgZnJvbSB0aGUgZW51bSBTY2FsZUdyb3VwXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0IF9ZU2NhbGVHcm91cExpc3QoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFNjYWxlR3JvdXApLmZpbHRlcihrZXkgPT4gIWlzTmFOKE51bWJlcihTY2FsZUdyb3VwW2tleV0pKSkubWFwKGtleSA9PiBTY2FsZUdyb3VwW2tleV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgb25lIGl0ZW0gYnkgdGhlIHByb3ZpZGVkIGF0dHJpYnV0ZXMgYW5kIHZhbHVlc1xyXG4gICAqIEBwYXJhbSBhcmdzIHRoZSBkeW5hbWljIHBhcmFtZXRlciBvZiBbYXR0cmlidXRlLCB2YWx1ZV1cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfZ2VuZXJhdGVMb2FkSGlzdG9yeUluZm9JdGVtKC4uLmFyZ3MpOiBMb2FkSGlzdG9yeUluZm9JdGVtIHtcclxuICAgIGNvbnN0IG9iaiA9IHt9O1xyXG4gICAgaWYgKCFhcmdzIHx8IGFyZ3MubGVuZ3RoIDw9IDApIHtcclxuICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBhcmdzLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgIGlmIChpdGVtICYmIGl0ZW0ubGVuZ3RoID49IDIpIHtcclxuICAgICAgICBvYmpbaXRlbVswXV0gPSBpdGVtWzFdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZW5lcmF0ZSB0aGUgbG9hZEhpc3RvcnlJbmZvIG9iamVjdCB3aXRoIGRlZmF1bHQgdmFsdWVzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZW5lcmF0ZUxvYWRIaXN0b3J5SW5mbygpOiBMb2FkSGlzdG9yeUluZm8ge1xyXG4gICAgLy8gbWluaW11bSB2YWx1ZSBmb3IgWVNjYWxlIG9mIHN3YXBJbiwgc3dhcE91dCwgaW5kZXhzZXJ2ZXJTd2FwSW4gaXMgMTAwIChhY2NvcmRpbmcgdG8gaGFuYSBzdHVkaW8pXHJcbiAgICBjb25zdCBpbmZvSXRlbSA9IFVJU2VydmljZS5fZ2VuZXJhdGVMb2FkSGlzdG9yeUluZm9JdGVtOyAvLyBqdXN0IGZvciBtYWtpbmcgdGhlIG5hbWUgc2hvcnRlci4uLlxyXG4gICAgY29uc3QgY3B1VXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0NQVScgICAgICAgICAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLkNQVSAgICBdLCBbSXRlbS51bml0LCBVbml0LlBDVCAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdDUFUgVXNlZCBieSBhbGwgcHJvY2Vzc2VzJ10pO1xyXG4gICAgY29uc3QgbWVtb3J5UmVzaWRlbnQgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0RhdGFiYXNlIFJlc2lkZW50IE1lbW9yeScgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLk1lbW9yeSBdLCBbSXRlbS51bml0LCBVbml0Lk1CICAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdQaHlzaWNhbCBtZW1vcnkgdXNlZCBmb3IgYWxsIEhBTkEgcHJvY2Vzc2VzJ10pO1xyXG4gICAgY29uc3QgbWVtb3J5VG90YWxSZXNpZGVudCAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1RvdGFsIFJlc2lkZW50IE1lbW9yeScgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLk1lbW9yeSBdLCBbSXRlbS51bml0LCBVbml0Lk1CICAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdQaHlzaWNhbCBtZW1vcnkgdXNlZCBmb3IgYWxsIHByb2Nlc3NlcyddKTtcclxuICAgIGNvbnN0IG1lbW9yeVVzZWQgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdEYXRhYmFzZSBVc2VkIE1lbW9yeScgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5NZW1vcnkgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQiAgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTWVtb3J5IHVzZWQgZm9yIGFsbCBIQU5BIHByb2Nlc3NlcyddKTtcclxuICAgIGNvbnN0IG1lbW9yeUxpbWl0ICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdEYXRhYmFzZSBBbGxvY2F0aW9uIExpbWl0JyAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5NZW1vcnkgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQiAgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTWVtb3J5IGFsbG9jYXRpb24gbGltaXQgZm9yIGFsbCBwcm9jZXNzZXMgb2YgSEFOQSBpbnN0YW5jZSddKTtcclxuICAgIGNvbnN0IG1lbW9yeVNpemUgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdQaHlzaWNhbCBNZW1vcnkgU2l6ZScgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5NZW1vcnkgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQiAgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnUGh5c2ljYWwgbWVtb3J5IHNpemUnXSk7XHJcbiAgICBjb25zdCBkaXNrVXNlZCAgICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGlzayBVc2VkJyAgICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuRGlzayAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuR0IgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0Rpc2sgdXNlZCddKTtcclxuICAgIGNvbnN0IGRpc2tTaXplICAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdEaXNrIFNpemUnICAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5EaXNrICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5HQiAgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnRGlzayBzaXplJ10pO1xyXG4gICAgY29uc3QgbmV0d29ya0luICAgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ05ldHdvcmsgSW4nICAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLk5ldHdvcmtdLCBbSXRlbS51bml0LCBVbml0Lk1CUGVyU2VjICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdCeXRlcyByZWFkIGZyb20gbmV0d29yayBieSBhbGwgcHJvY2Vzc2VzJ10pO1xyXG4gICAgY29uc3QgbmV0d29ya091dCAgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ05ldHdvcmsgT3V0JyAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLk5ldHdvcmtdLCBbSXRlbS51bml0LCBVbml0Lk1CUGVyU2VjICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdCeXRlcyB3cml0dGVuIHRvIG5ldHdvcmsgYnkgYWxsIHByb2Nlc3NlcyddKTtcclxuICAgIGNvbnN0IHN3YXBJbiAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdTd2FwIEluJyAgICAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAxMDBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Td2FwICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgcmVhZCBmcm9tIHN3YXAgYnkgYWxsIHByb2Nlc3NlcyAocHN3cGluIGxpbmUgaW4gL3Byb2Mvdm1zdGF0ICogc3lzY29uZihfU0NfUEFHRVNJWkUpKSddKTtcclxuICAgIGNvbnN0IHN3YXBPdXQgICAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdTd2FwIE91dCcgICAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAxMDBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Td2FwICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgd3JpdHRlbiBUbyBzd2FwIGJ5IGFsbCBwcm9jZXNzZXMgKHBzd3BvdXQgbGluZSBpbiAvcHJvYy92bXN0YXQgKiBzeXNjb25mKF9TQ19QQUdFU0laRSkpJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJDcHUgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0luZGV4IFNlcnZlciBDUFUnICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLkNQVSAgICBdLCBbSXRlbS51bml0LCBVbml0LlBDVCAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdDUFUgdXNlZCBieSBTZXJ2aWNlJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJDcHVTeXMgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1N5c3RlbSBDUFUnICAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLkNQVSAgICBdLCBbSXRlbS51bml0LCBVbml0LlBDVCAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdPUyBLZXJuZWwvU3lzdGVtIENQVSB1c2VkIGJ5IFNlcnZpY2UnXSk7XHJcbiAgICBjb25zdCBpbmRleHNlcnZlck1lbVVzZWQgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnTWVtb3J5IFVzZWQnICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuTWVtb3J5IF0sIFtJdGVtLnVuaXQsIFVuaXQuTUIgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ01lbW9yeSB1c2VkIGJ5IFNlcnZpY2UnXSk7XHJcbiAgICBjb25zdCBpbmRleHNlcnZlck1lbUxpbWl0ICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnTWVtb3J5IEFsbG9jYXRpb24gTGltaXQnICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuTWVtb3J5IF0sIFtJdGVtLnVuaXQsIFVuaXQuTUIgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ01lbW9yeSBhbGxvY2F0aW9uIGxpbWl0IGZvciBTZXJ2aWNlJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJIYW5kbGVzICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0hhbmRsZXMnICAgICAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygb3BlbiBoYW5kbGVzJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJQaW5ndGltZSAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1BpbmcgVGltZScgICAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0Lk1TICAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdEdXJhdGlvbiBvZiBTZXJ2aWNlIHBpbmcgcmVxdWVzdCAoVEhSRUFEX01FVEhPRD1cXCdfX25zV2F0Y2hkb2dcXCcpLiBUaGlzIHJlcXVlc3QgaW5jbHVkZXMgdGhlIGNvbGxlY3Rpb24gb2Ygc2VydmljZSBzcGVjaWZpYyBLUElcXCdzJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJTd2FwSW4gICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0luZGV4IFNlcnZlciBTd2FwIEluJyAgICAgICBdLCBbSXRlbS55U2NhbGUsIDEwMF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlN3YXAgICBdLCBbSXRlbS51bml0LCBVbml0Lk1CUGVyU2VjICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdCeXRlcyByZWFkIGZyb20gc3dhcCBieSBTZXJ2aWNlIChjb2x1bW4gMTIobWFqZmx0KSBpbiAvcHJvYy88cGlkPi9zdGF0ICogc3lzY29uZihfU0NfUEFHRVNJWkUpKSddKTtcclxuICAgIGNvbnN0IHNxbENvbm5lY3Rpb25zICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdPcGVuIENvbm5lY3Rpb25zJyAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Db25uICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIG9wZW4gU1FMIGNvbm5lY3Rpb25zJ10pO1xyXG4gICAgY29uc3QgaW50ZXJuYWxDb25uZWN0aW9ucyAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0ludGVybmFsIENvbm5lY3Rpb25zJyAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLkNvbm4gICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygb3BlbiBTUUwgaW50ZXJuYWwgY29ubmVjdGlvbnMnXSk7XHJcbiAgICBjb25zdCBleHRlcm5hbENvbm5lY3Rpb25zICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRXh0ZXJuYWwgQ29ubmVjdGlvbnMnICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuQ29ubiAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBvcGVuIFNRTCBleHRlcm5hbCBjb25uZWN0aW9ucyddKTtcclxuICAgIGNvbnN0IGlkbGVDb25uZWN0aW9ucyAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdJZGxlIENvbm5lY3Rpb25zJyAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Db25uICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIG9wZW4gU1FMIGlkbGUgY29ubmVjdGlvbnMnXSk7XHJcbiAgICBjb25zdCBzcWxUcmFuc2FjdGlvbnMgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnT3BlbiBUcmFuc2FjdGlvbnMnICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVHJhbnMgIF0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBvcGVuIFNRTCB0cmFuc2FjdGlvbnMnXSk7XHJcbiAgICBjb25zdCBpbnRlcm5hbFRyYW5zYWN0aW9ucyAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnSW50ZXJuYWwgVHJhbnNhY3Rpb25zJyAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVHJhbnMgIF0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBpbnRlcm5hbCB0cmFuc2FjdGlvbnMnXSk7XHJcbiAgICBjb25zdCBleHRlcm5hbFRyYW5zYWN0aW9ucyAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRXh0ZXJuYWwgVHJhbnNhY3Rpb25zJyAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVHJhbnMgIF0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBleHRlcm5hbCB0cmFuc2FjdGlvbnMnXSk7XHJcbiAgICBjb25zdCB1c2VyVHJhbnNhY3Rpb25zICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnVXNlciBUcmFuc2FjdGlvbnMnICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVHJhbnMgIF0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiB1c2VyIHRyYW5zYWN0aW9ucyddKTtcclxuICAgIGNvbnN0IHNxbEJsb2NrZWRUcmFucyAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdCbG9ja2VkIFRyYW5zYWN0aW9ucycgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIGJsb2NrZWQgU1FMIHRyYW5zYWN0aW9ucyddKTtcclxuICAgIGNvbnN0IHNxbFN0YXRlbWVudHMgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdTdGF0ZW1lbnRzJyAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5TdG10ICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5TdG10UGVyU2VjIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIGZpbmlzaGVkIFNRTCBzdGF0ZW1lbnRzJ10pO1xyXG4gICAgY29uc3QgY2lkUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FjdGl2ZSBDb21taXQgSUQgUmFuZ2UnICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdSYW5nZSBiZXR3ZWVuIG5ld2VzdCBhbmQgb2xkZXN0IGFjdGl2ZSBjb21taXQgSUQnXSk7XHJcbiAgICBjb25zdCB0aWRSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnQWN0aXZlIFRyYW5zYWN0aW9uIElEIFJhbmdlJ10sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1JhbmdlIGJldHdlZW4gbmV3ZXN0IGFuZCBvbGRlc3QgYWN0aXZlIHRyYW5zYWN0aW9uIElEJ10pO1xyXG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3RDb3VudCAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1BlbmRpbmcgUmVxdWVzdCBDb3VudCcgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgcGVuZGluZyBzZXNzaW9uIHJlcXVlc3RzJ10pO1xyXG4gICAgY29uc3QgbXZjY051bSAgICAgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FjdGl2ZSBWZXJzaW9ucycgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgYWN0aXZlIE1WQ0MgdmVyc2lvbnMnXSk7XHJcbiAgICBjb25zdCBhY3F1aXJlZFJlY29yZExvY2tzICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnQWNxdWlyZWQgUmVjb3JkIExvY2tzJyAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBhY3F1aXJlZCByZWNvcmQgbG9ja3MnXSk7XHJcbiAgICBjb25zdCBzZWFyY2hDb3VudCAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnUmVhZCBSZXF1ZXN0cycgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuUmVxICAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiByZWFkIHJlcXVlc3RzIChzZWxlY3QpJ10pO1xyXG4gICAgY29uc3QgaW5kZXhpbmdDb3VudCAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1dyaXRlIFJlcXVlc3RzJyAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlJlcSAgICBdLCBbSXRlbS51bml0LCBVbml0LlJlcVBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygd3JpdGUgcmVxdWVzdHMgKGluc2VydCx1cGRhdGUsZGVsZXRlKSddKTtcclxuICAgIGNvbnN0IG1lcmdlQ291bnQgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdNZXJnZSBSZXF1ZXN0cycgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5SZXEgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5SZXFQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIG1lcmdlIHJlcXVlc3RzJ10pO1xyXG4gICAgY29uc3QgdW5sb2FkQ291bnQgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0NvbHVtbiBVbmxvYWRzJyAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlJlcSAgICBdLCBbSXRlbS51bml0LCBVbml0LlJlcVBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgY29sdW1uIHVubG9hZHMnXSk7XHJcbiAgICBjb25zdCBpbmRleHNlcnZlclRocmVhZHMgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnQWN0aXZlIFRocmVhZHMnICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBhY3RpdmUgdGhyZWFkcyddKTtcclxuICAgIGNvbnN0IHdhaXRpbmdUaHJlYWRzICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdXYWl0aW5nIFRocmVhZHMnICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHdhaXRpbmcgdGhyZWFkcyddKTtcclxuICAgIGNvbnN0IHRvdGFsVGhyZWFkcyAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdUb3RhbCBUaHJlYWRzJyAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnVG90YWwgbnVtYmVyIG9mIHRocmVhZHMnXSk7XHJcbiAgICBjb25zdCBhY3RpdmVTcWxFeGVjdXRvcnMgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnQWN0aXZlIFNxbEV4ZWN1dG9ycycgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBhY3RpdmUgU3FsRXhlY3V0b3JzJ10pO1xyXG4gICAgY29uc3Qgd2FpdGluZ1NxbEV4ZWN1dG9ycyAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1dhaXRpbmcgU3FsRXhlY3V0b3JzJyAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygd2FpdGluZyBTcWxFeGVjdXRvcnMnXSk7XHJcbiAgICBjb25zdCB0b3RhbFNxbEV4ZWN1dG9ycyAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnVG90YWwgU3FsRXhlY3V0b3JzJyAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1RvdGFsIG51bWJlciBvZiBTcWxFeGVjdXRvcnMnXSk7XHJcbiAgICBjb25zdCBkYXRhV3JpdGVTaXplICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YSBXcml0ZSBTaXplJyAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuV1JTaXplIF0sIFtJdGVtLnVuaXQsIFVuaXQuTUJQZXJTZWMgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0J5dGVzIHdyaXR0ZW4gdG8gZGF0YSBhcmVhJ10pO1xyXG4gICAgY29uc3QgZGF0YVdyaXRlVGltZSAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0RhdGEgV3JpdGUgVGltZScgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSVGltZSBdLCBbSXRlbS51bml0LCBVbml0LlNlY1BlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUaW1lIHVzZWQgZm9yIHdyaXRpbmcgdG8gZGF0YSBhcmVhJ10pO1xyXG4gICAgY29uc3QgbG9nV3JpdGVTaXplICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0xvZyBXcml0ZSBTaXplJyAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSU2l6ZSBdLCBbSXRlbS51bml0LCBVbml0Lk1CUGVyU2VjICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdCeXRlcyB3cml0dGVuIHRvIGxvZyBhcmVhJ10pO1xyXG4gICAgY29uc3QgbG9nV3JpdGVUaW1lICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0xvZyBXcml0ZSBUaW1lJyAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSVGltZSBdLCBbSXRlbS51bml0LCBVbml0LlNlY1BlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUaW1lIHVzZWQgZm9yIHdyaXRpbmcgdG8gbG9nIGFyZWEnXSk7XHJcbiAgICBjb25zdCBkYXRhUmVhZFNpemUgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YSBSZWFkIFNpemUnICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuV1JTaXplIF0sIFtJdGVtLnVuaXQsIFVuaXQuTUJQZXJTZWMgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0J5dGVzIHJlYWQgZnJvbSBkYXRhIGFyZWEnXSk7XHJcbiAgICBjb25zdCBkYXRhUmVhZFRpbWUgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YSBSZWFkIFRpbWUnICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuV1JUaW1lIF0sIFtJdGVtLnVuaXQsIFVuaXQuU2VjUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1RpbWUgdXNlZCBmb3IgcmVhZGluZyBmcm9tIGRhdGEgYXJlYSddKTtcclxuICAgIGNvbnN0IGxvZ1JlYWRTaXplICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdMb2cgUmVhZCBTaXplJyAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlNpemUgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgcmVhZCBmcm9tIGxvZyBhcmVhJ10pO1xyXG4gICAgY29uc3QgbG9nUmVhZFRpbWUgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0xvZyBSZWFkIFRpbWUnICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSVGltZSBdLCBbSXRlbS51bml0LCBVbml0LlNlY1BlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUaW1lIHVzZWQgZm9yIHJlYWRpbmcgZnJvbSBsb2cgYXJlYSddKTtcclxuICAgIGNvbnN0IGRhdGFCYWNrdXBXcml0ZVNpemUgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdEYXRhIEJhY2t1cCBXcml0ZSBTaXplJyAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlNpemUgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgd3JpdHRlbiB0byBkYXRhIGJhY2t1cCddKTtcclxuICAgIGNvbnN0IGRhdGFCYWNrdXBXcml0ZVRpbWUgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdEYXRhIEJhY2t1cCBXcml0ZSBUaW1lJyAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlRpbWUgXSwgW0l0ZW0udW5pdCwgVW5pdC5TZWNQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnVGltZSB1c2VkIGZvciB3cml0aW5nIHRvIGRhdGEgYmFja3VwJ10pO1xyXG4gICAgY29uc3QgbG9nQmFja3VwV3JpdGVTaXplICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0xvZyBCYWNrdXAgV3JpdGUgU2l6ZScgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSU2l6ZSBdLCBbSXRlbS51bml0LCBVbml0Lk1CUGVyU2VjICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdCeXRlcyB3cml0dGVuIHRvIGxvZyBiYWNrdXAnXSk7XHJcbiAgICBjb25zdCBsb2dCYWNrdXBXcml0ZVRpbWUgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnTG9nIEJhY2t1cCBXcml0ZSBUaW1lJyAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuV1JUaW1lIF0sIFtJdGVtLnVuaXQsIFVuaXQuU2VjUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1RpbWUgdXNlZCBmb3Igd3JpdGluZyB0byBsb2cgYmFja3VwJ10pO1xyXG4gICAgY29uc3QgbXV0ZXhDb2xsaXNpb25Db3VudCAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ011dGV4IENvbGxpc2lvbnMnICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkNvbFBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgY29sbGlzaW9ucyBvbiBtdXRleGVzJ10pO1xyXG4gICAgY29uc3QgcmVhZFdyaXRlTG9ja0NvbGxpc2lvbkNvdW50ICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1JlYWQvV3JpdGUgTG9jayBDb2xsaXNpb25zJyBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkNvbFBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgY29sbGlzaW9ucyBvbiByZWFkL3dyaXRlIGxvY2tzJ10pO1xyXG4gICAgY29uc3QgYWRtaXNzaW5Db250cm9sQWRtaXRDb3VudCAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FkbWl0dGVkIFJlcXVlc3RzJyAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LlJlcVBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygc2Vzc2lvbiByZXF1ZXN0cyBhZG1pdHRlZCBieSBhZG1pc3Npb24gY29udHJvbCddKTtcclxuICAgIGNvbnN0IGFkbWlzc2lvbkNvbnRyb2xSZWplY3RDb3VudCAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdSZWplY3RlZCBSZXF1ZXN0cycgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5SZXFQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHNlc3Npb24gcmVxdWVzdHMgcmVqZWN0ZWQgYnkgYWRtaXNzaW9uIGNvbnRyb2wnXSk7XHJcbiAgICBjb25zdCBhZG1pc3Npb25Db250cm9sV2FpdGluZ1JlcXVlc3RzID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnV2FpdGluZyBSZXF1ZXN0cycgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBzZXNzaW9uIHJlcXVlc3RzIHdhaXRpbmcgaW4gYWRtaXNzaW9uIGNvbnRyb2wgcXVldWUnXSk7XHJcbiAgICBjb25zdCBhZG1pc3Npb25Db250cm9sV2FpdFRpbWUgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnV2FpdCBUaW1lJyAgICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuU2VjUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1RvdGFsIHdhaXQgdGltZSBvZiBzZXNzaW9uIHJlcXVlc3RzIHF1ZXVlZCBpbiBhZG1pc3Npb24gY29udHJvbCBxdWV1ZSddKTtcclxuICAgIGNvbnN0IGFkbWlzc2lvbkNvbnRyb2xFbnF1ZXVlQ291bnQgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdFbnF1ZXVlZCBSZXF1ZXN0cycgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5SZXFQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHNlc3Npb24gcmVxdWVzdHMgZW5xdWV1ZWQgYnkgYWRtaXNzaW9uIGNvbnRyb2wnXSk7XHJcbiAgICBjb25zdCBhZG1pc3Npb25Db250cm9sRGVxdWV1ZUNvdW50ICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGVxdWV1ZWQgUmVxdWVzdHMnICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBzZXNzaW9uIHJlcXVlc3RzIGRlcXVldWVkIGJ5IGFkbWlzc2lvbiBjb250cm9sJ10pO1xyXG4gICAgY29uc3QgYWRtaXNzaW9uQ29udHJvbFRpbWVvdXRDb3VudCAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1RpbWVkIG91dCBSZXF1ZXN0cycgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5SZXFQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHRpbWVkIG91dCBzZXNzaW9uIHJlcXVlc3RzIGluIGFkbWlzc2lvbiBjb250cm9sIHF1ZXVlJ10pO1xyXG5cclxuICAgIC8vIGdlbmVyYXRlIEhvc3RcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mb0hvc3Q6IExvYWRIaXN0b3J5SW5mb0hvc3QgPSB7XHJcbiAgICAgIGNwdVVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiBjcHVVc2VkICAgICAgICAgICAgLFxyXG4gICAgICBtZW1vcnlSZXNpZGVudCAgICAgICAgICAgICAgICAgIDogbWVtb3J5UmVzaWRlbnQgICAgICxcclxuICAgICAgbWVtb3J5VG90YWxSZXNpZGVudCAgICAgICAgICAgICA6IG1lbW9yeVRvdGFsUmVzaWRlbnQsXHJcbiAgICAgIG1lbW9yeVVzZWQgICAgICAgICAgICAgICAgICAgICAgOiBtZW1vcnlVc2VkICAgICAgICAgLFxyXG4gICAgICBtZW1vcnlMaW1pdCAgICAgICAgICAgICAgICAgICAgIDogbWVtb3J5TGltaXQgICAgICAgICxcclxuICAgICAgbWVtb3J5U2l6ZSAgICAgICAgICAgICAgICAgICAgICA6IG1lbW9yeVNpemUgICAgICAgICAsXHJcbiAgICAgIGRpc2tVc2VkICAgICAgICAgICAgICAgICAgICAgICAgOiBkaXNrVXNlZCAgICAgICAgICAgLFxyXG4gICAgICBkaXNrU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIDogZGlza1NpemUgICAgICAgICAgICxcclxuICAgICAgbmV0d29ya0luICAgICAgICAgICAgICAgICAgICAgICA6IG5ldHdvcmtJbiAgICAgICAgICAsXHJcbiAgICAgIG5ldHdvcmtPdXQgICAgICAgICAgICAgICAgICAgICAgOiBuZXR3b3JrT3V0ICAgICAgICAgLFxyXG4gICAgICBzd2FwSW4gICAgICAgICAgICAgICAgICAgICAgICAgIDogc3dhcEluICAgICAgICAgICAgICxcclxuICAgICAgc3dhcE91dCAgICAgICAgICAgICAgICAgICAgICAgICA6IHN3YXBPdXQgICAgICAgICAgICAsXHJcbiAgICB9O1xyXG4gICAgLy8gZ2VuZXJhdGUgSW5kZXggU2VydmVyXHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm9JbmRleFNlcnZlcjogTG9hZEhpc3RvcnlJbmZvSW5kZXhTZXJ2ZXIgPSB7XHJcbiAgICAgIGluZGV4c2VydmVyQ3B1ICAgICAgICAgICAgICAgICAgOiBpbmRleHNlcnZlckNwdSAgICAgICxcclxuICAgICAgaW5kZXhzZXJ2ZXJDcHVTeXMgICAgICAgICAgICAgICA6IGluZGV4c2VydmVyQ3B1U3lzICAgLFxyXG4gICAgICBpbmRleHNlcnZlck1lbVVzZWQgICAgICAgICAgICAgIDogaW5kZXhzZXJ2ZXJNZW1Vc2VkICAsXHJcbiAgICAgIGluZGV4c2VydmVyTWVtTGltaXQgICAgICAgICAgICAgOiBpbmRleHNlcnZlck1lbUxpbWl0ICxcclxuICAgICAgaW5kZXhzZXJ2ZXJIYW5kbGVzICAgICAgICAgICAgICA6IGluZGV4c2VydmVySGFuZGxlcyAgLFxyXG4gICAgICBpbmRleHNlcnZlclBpbmd0aW1lICAgICAgICAgICAgIDogaW5kZXhzZXJ2ZXJQaW5ndGltZSAsXHJcbiAgICAgIGluZGV4c2VydmVyU3dhcEluICAgICAgICAgICAgICAgOiBpbmRleHNlcnZlclN3YXBJbiAgICxcclxuICAgIH07XHJcbiAgICAvLyBnZW5lcmF0ZSBTUUxcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mb1NRTDogTG9hZEhpc3RvcnlJbmZvU1FMID0ge1xyXG4gICAgICBzcWxDb25uZWN0aW9ucyAgICAgICAgICAgICAgICAgIDogc3FsQ29ubmVjdGlvbnMgICAgICAsXHJcbiAgICAgIGludGVybmFsQ29ubmVjdGlvbnMgICAgICAgICAgICAgOiBpbnRlcm5hbENvbm5lY3Rpb25zICxcclxuICAgICAgZXh0ZXJuYWxDb25uZWN0aW9ucyAgICAgICAgICAgICA6IGV4dGVybmFsQ29ubmVjdGlvbnMgLFxyXG4gICAgICBpZGxlQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAgIDogaWRsZUNvbm5lY3Rpb25zICAgICAsXHJcbiAgICAgIHNxbFRyYW5zYWN0aW9ucyAgICAgICAgICAgICAgICAgOiBzcWxUcmFuc2FjdGlvbnMgICAgICxcclxuICAgICAgaW50ZXJuYWxUcmFuc2FjdGlvbnMgICAgICAgICAgICA6IGludGVybmFsVHJhbnNhY3Rpb25zLFxyXG4gICAgICBleHRlcm5hbFRyYW5zYWN0aW9ucyAgICAgICAgICAgIDogZXh0ZXJuYWxUcmFuc2FjdGlvbnMsXHJcbiAgICAgIHVzZXJUcmFuc2FjdGlvbnMgICAgICAgICAgICAgICAgOiB1c2VyVHJhbnNhY3Rpb25zICAgICxcclxuICAgICAgc3FsQmxvY2tlZFRyYW5zICAgICAgICAgICAgICAgICA6IHNxbEJsb2NrZWRUcmFucyAgICAgLFxyXG4gICAgICBzcWxTdGF0ZW1lbnRzICAgICAgICAgICAgICAgICAgIDogc3FsU3RhdGVtZW50cyAgICAgICAsXHJcbiAgICAgIGNpZFJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgOiBjaWRSYW5nZSAgICAgICAgICAgICxcclxuICAgICAgdGlkUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICA6IHRpZFJhbmdlICAgICAgICAgICAgLFxyXG4gICAgICBwZW5kaW5nUmVxdWVzdENvdW50ICAgICAgICAgICAgIDogcGVuZGluZ1JlcXVlc3RDb3VudCAsXHJcbiAgICB9O1xyXG4gICAgLy8gZ2VuZXJhdGUgUm93IFN0b3JlXHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm9Sb3dTdG9yZTogTG9hZEhpc3RvcnlJbmZvUm93U3RvcmUgPSB7XHJcbiAgICAgIG12Y2NOdW0gICAgICAgICAgICAgICAgICAgICAgICAgOiBtdmNjTnVtICAgICAgICAgICAgLFxyXG4gICAgICBhY3F1aXJlZFJlY29yZExvY2tzICAgICAgICAgICAgIDogYWNxdWlyZWRSZWNvcmRMb2NrcyxcclxuICAgIH07XHJcbiAgICAvLyBnZW5lcmF0ZSBDb2x1bW4gU3RvcmVcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mb0NvbHVtblN0b3JlOiBMb2FkSGlzdG9yeUluZm9Db2x1bW5TdG9yZSA9IHtcclxuICAgICAgc2VhcmNoQ291bnQgICAgICAgICAgICAgICAgICAgICA6IHNlYXJjaENvdW50ICAsXHJcbiAgICAgIGluZGV4aW5nQ291bnQgICAgICAgICAgICAgICAgICAgOiBpbmRleGluZ0NvdW50LFxyXG4gICAgICBtZXJnZUNvdW50ICAgICAgICAgICAgICAgICAgICAgIDogbWVyZ2VDb3VudCAgICxcclxuICAgICAgdW5sb2FkQ291bnQgICAgICAgICAgICAgICAgICAgICA6IHVubG9hZENvdW50ICAsXHJcbiAgICB9O1xyXG4gICAgLy8gZ2VuZXJhdGUgVGhyZWFkc1xyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvVGhyZWFkczogTG9hZEhpc3RvcnlJbmZvVGhyZWFkcyA9IHtcclxuICAgICAgaW5kZXhzZXJ2ZXJUaHJlYWRzICAgICAgICAgICAgICA6IGluZGV4c2VydmVyVGhyZWFkcyAsXHJcbiAgICAgIHdhaXRpbmdUaHJlYWRzICAgICAgICAgICAgICAgICAgOiB3YWl0aW5nVGhyZWFkcyAgICAgLFxyXG4gICAgICB0b3RhbFRocmVhZHMgICAgICAgICAgICAgICAgICAgIDogdG90YWxUaHJlYWRzICAgICAgICxcclxuICAgICAgYWN0aXZlU3FsRXhlY3V0b3JzICAgICAgICAgICAgICA6IGFjdGl2ZVNxbEV4ZWN1dG9ycyAsXHJcbiAgICAgIHdhaXRpbmdTcWxFeGVjdXRvcnMgICAgICAgICAgICAgOiB3YWl0aW5nU3FsRXhlY3V0b3JzLFxyXG4gICAgICB0b3RhbFNxbEV4ZWN1dG9ycyAgICAgICAgICAgICAgIDogdG90YWxTcWxFeGVjdXRvcnMgICxcclxuICAgIH07XHJcbiAgICAvLyBnZW5lcmF0ZSBQZXJzaXN0ZW5jZVxyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvUGVyc2lzdGVuY2U6IExvYWRIaXN0b3J5SW5mb1BlcnNpc3RlbmNlID0ge1xyXG4gICAgICBkYXRhV3JpdGVTaXplICAgICAgICAgICAgICAgICAgIDogZGF0YVdyaXRlU2l6ZSxcclxuICAgICAgZGF0YVdyaXRlVGltZSAgICAgICAgICAgICAgICAgICA6IGRhdGFXcml0ZVRpbWUsXHJcbiAgICAgIGxvZ1dyaXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgOiBsb2dXcml0ZVNpemUgLFxyXG4gICAgICBsb2dXcml0ZVRpbWUgICAgICAgICAgICAgICAgICAgIDogbG9nV3JpdGVUaW1lICxcclxuXHJcbiAgICAgIGRhdGFSZWFkU2l6ZSAgICAgICAgICAgICAgICAgICAgOiBkYXRhUmVhZFNpemUgLFxyXG4gICAgICBkYXRhUmVhZFRpbWUgICAgICAgICAgICAgICAgICAgIDogZGF0YVJlYWRUaW1lICxcclxuICAgICAgbG9nUmVhZFNpemUgICAgICAgICAgICAgICAgICAgICA6IGxvZ1JlYWRTaXplICAsXHJcbiAgICAgIGxvZ1JlYWRUaW1lICAgICAgICAgICAgICAgICAgICAgOiBsb2dSZWFkVGltZSAgLFxyXG4gICAgfTtcclxuICAgIC8vIGdlbmVyYXRlIEJhY2t1cFxyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvQmFja3VwOiBMb2FkSGlzdG9yeUluZm9CYWNrdXAgPSB7XHJcbiAgICAgIGRhdGFCYWNrdXBXcml0ZVNpemUgICAgICAgICAgICAgOiBkYXRhQmFja3VwV3JpdGVTaXplLFxyXG4gICAgICBkYXRhQmFja3VwV3JpdGVUaW1lICAgICAgICAgICAgIDogZGF0YUJhY2t1cFdyaXRlVGltZSxcclxuICAgICAgbG9nQmFja3VwV3JpdGVTaXplICAgICAgICAgICAgICA6IGxvZ0JhY2t1cFdyaXRlU2l6ZSAsXHJcbiAgICAgIGxvZ0JhY2t1cFdyaXRlVGltZSAgICAgICAgICAgICAgOiBsb2dCYWNrdXBXcml0ZVRpbWUgLFxyXG4gICAgfTtcclxuICAgIC8vIGdlbmVyYXRlIFN5bmNocm9uaXphdGlvbiBQcmltaXRpdmVzXHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm9TeW5jaHJvbml6YXRpb25QcmltaXRpdmVzOiBMb2FkSGlzdG9yeUluZm9TeW5jUHJpbWl0aXZlcyA9IHtcclxuICAgICAgbXV0ZXhDb2xsaXNpb25Db3VudCAgICAgICAgICAgICA6IG11dGV4Q29sbGlzaW9uQ291bnQgICAgICAgICxcclxuICAgICAgcmVhZFdyaXRlTG9ja0NvbGxpc2lvbkNvdW50ICAgICA6IHJlYWRXcml0ZUxvY2tDb2xsaXNpb25Db3VudCxcclxuICAgIH07XHJcbiAgICAvLyBTZXNzaW9uIEFkbWlzc2lvbiBDb250cm9sXHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm9TZXNzaW9uQWRtaXNzaW9uQ29udHJvbDogTG9hZEhpc3RvcnlJbmZvU2Vzc2lvbkFkbWlzc2lvbkNvbnRyb2wgPSB7XHJcbiAgICAgIGFkbWlzc2luQ29udHJvbEFkbWl0Q291bnQgICAgICAgOiBhZG1pc3NpbkNvbnRyb2xBZG1pdENvdW50ICAgICAgLFxyXG4gICAgICBhZG1pc3Npb25Db250cm9sUmVqZWN0Q291bnQgICAgIDogYWRtaXNzaW9uQ29udHJvbFJlamVjdENvdW50ICAgICxcclxuICAgICAgYWRtaXNzaW9uQ29udHJvbFdhaXRpbmdSZXF1ZXN0cyA6IGFkbWlzc2lvbkNvbnRyb2xXYWl0aW5nUmVxdWVzdHMsXHJcbiAgICAgIGFkbWlzc2lvbkNvbnRyb2xXYWl0VGltZSAgICAgICAgOiBhZG1pc3Npb25Db250cm9sV2FpdFRpbWUgICAgICAgLFxyXG4gICAgICBhZG1pc3Npb25Db250cm9sRW5xdWV1ZUNvdW50ICAgIDogYWRtaXNzaW9uQ29udHJvbEVucXVldWVDb3VudCAgICxcclxuICAgICAgYWRtaXNzaW9uQ29udHJvbERlcXVldWVDb3VudCAgICA6IGFkbWlzc2lvbkNvbnRyb2xEZXF1ZXVlQ291bnQgICAsXHJcbiAgICAgIGFkbWlzc2lvbkNvbnRyb2xUaW1lb3V0Q291bnQgICAgOiBhZG1pc3Npb25Db250cm9sVGltZW91dENvdW50ICAgLFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAnSG9zdCc6IGxvYWRIaXN0b3J5SW5mb0hvc3QsXHJcbiAgICAgICdJbmRleCBTZXJ2ZXInOiBsb2FkSGlzdG9yeUluZm9JbmRleFNlcnZlcixcclxuICAgICAgJ1NRTCc6IGxvYWRIaXN0b3J5SW5mb1NRTCxcclxuICAgICAgJ1JvdyBTdG9yZSc6IGxvYWRIaXN0b3J5SW5mb1Jvd1N0b3JlLFxyXG4gICAgICAnQ29sdW1uIFN0b3JlJzogbG9hZEhpc3RvcnlJbmZvQ29sdW1uU3RvcmUsXHJcbiAgICAgICdUaHJlYWRzJzogbG9hZEhpc3RvcnlJbmZvVGhyZWFkcyxcclxuICAgICAgJ1BlcnNpc3RlbmNlJzogbG9hZEhpc3RvcnlJbmZvUGVyc2lzdGVuY2UsXHJcbiAgICAgICdCYWNrdXAnOiBsb2FkSGlzdG9yeUluZm9CYWNrdXAsXHJcbiAgICAgICdTeW5jaHJvbml6YXRpb24gUHJpbWl0aXZlcyc6IGxvYWRIaXN0b3J5SW5mb1N5bmNocm9uaXphdGlvblByaW1pdGl2ZXMsXHJcbiAgICAgICdTZXNzaW9uIEFkbWlzc2lvbiBDb250cm9sJzogbG9hZEhpc3RvcnlJbmZvU2Vzc2lvbkFkbWlzc2lvbkNvbnRyb2xcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgcmdiY29sb3Igb2JqZWN0IHZpYSByZWQsIGdyZWVuLCBibHVlIGFuZCBhbHBoYS5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfZ2V0UmdiQ29sb3IocmVkOiBudW1iZXIsIGdyZWVuOiBudW1iZXIsIGJsdWU6IG51bWJlciwgYWxwaGE6IG51bWJlcik6IENvbG9yUmdiYSB7XHJcbiAgICByZXR1cm4ge3JlZDogcmVkLCBncmVlbjogZ3JlZW4sIGJsdWU6IGJsdWUsIGFscGhhOiBhbHBoYX07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBfZ2V0WVNjYWxlRm9ySXRlbShpdGVtOiBhbnksIHlTY2FsZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB5U2NhbGUgPiBpdGVtW0l0ZW0ueVNjYWxlXSA/IChpdGVtW0l0ZW0udW5pdF0gPT09IFVuaXQuUENUID8gMTAwIDogeVNjYWxlKSA6IGl0ZW1bSXRlbS55U2NhbGVdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2dldE1heFZhbHVlT2ZHcm91cChncm91cEl0ZW1zOiBhbnkpOiBudW1iZXIge1xyXG4gICAgbGV0IG1heCA9IDA7XHJcbiAgICBpZiAoZ3JvdXBJdGVtcykge1xyXG4gICAgICBtYXggPSBncm91cEl0ZW1zLnJlZHVjZSgobWF4VmFsdWUsIGN1cnJlbnQpID0+IHtcclxuICAgICAgICByZXR1cm4gY3VycmVudC5NYXggPiBtYXhWYWx1ZSA/IGN1cnJlbnQuTWF4IDogbWF4VmFsdWU7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1heDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldExvYWRIaXN0b3J5SW5mbyhwb3J0OiBzdHJpbmcpOiBMb2FkSGlzdG9yeUluZm8ge1xyXG4gICAgaWYgKCF0aGlzLl9sb2FkSGlzdG9yeUluZm9zW3BvcnRdKSB7XHJcbiAgICAgIHRoaXMuX2xvYWRIaXN0b3J5SW5mb3NbcG9ydF0gPSBVSVNlcnZpY2UuX2dlbmVyYXRlTG9hZEhpc3RvcnlJbmZvKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fbG9hZEhpc3RvcnlJbmZvc1twb3J0XTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFByb2Nlc3NpbmdVbml0KGl0ZW1LZXk6IHN0cmluZywgcG9ydDogc3RyaW5nKTogVW5pdFR5cGUge1xyXG4gICAgY29uc3QgaGlzdG9yeURldGFpbEl0ZW06IExvYWRIaXN0b3J5SW5mb0l0ZW0gPSB0aGlzLl9nZXRJdGVtQnlLZXkoaXRlbUtleSwgcG9ydCk7XHJcbiAgICBpZiAoaGlzdG9yeURldGFpbEl0ZW0pIHtcclxuICAgICAgbGV0IHVuaXQgPSBoaXN0b3J5RGV0YWlsSXRlbS5Vbml0O1xyXG4gICAgICBpZiAoIXVuaXQpIHtcclxuICAgICAgICB1bml0ID0gJyc7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIFVJU2VydmljZS5fdW5pdFR5cGVbdW5pdF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRPdmVydmlldyAoa2V5OiBzdHJpbmcsIG92ZXJ2aWV3OiBMb2FkSGlzdG9yeUluZm9JdGVtLCB1bml0OiBVbml0VHlwZSwgcG9ydDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBoaXN0b3J5RGV0YWlsSXRlbSA9IHRoaXMuX2dldEl0ZW1CeUtleShrZXksIHBvcnQpO1xyXG4gICAgaWYgKGhpc3RvcnlEZXRhaWxJdGVtKSB7XHJcbiAgICAgIGhpc3RvcnlEZXRhaWxJdGVtLk1heCA9IG92ZXJ2aWV3Lk1heCA+PSAwID8gb3ZlcnZpZXcuTWF4IDogMDtcclxuICAgICAgaGlzdG9yeURldGFpbEl0ZW0uQXZlcmFnZSA9IG92ZXJ2aWV3LkF2ZXJhZ2UgPj0gMCA/IG92ZXJ2aWV3LkF2ZXJhZ2UgOiAwO1xyXG4gICAgICAvLyBvbmx5IFRZUEVfQ09OVkVSU0lPTl9NQlNFQyBhbmQgVFlQRV9DT05WRVJUSU9OX1NFQyAoZWc6IE1CL3MsIHJlcS9zIHN0bXQvcy4uLikgbmVlZCBzdW1cclxuICAgICAgaGlzdG9yeURldGFpbEl0ZW0uU3VtID0gaXNVbml0VGltZVJlbGF0ZWQodW5pdCkgPyAob3ZlcnZpZXcuU3VtID49IDAgPyBvdmVydmlldy5TdW0gOiAwKSA6ICctJztcclxuICAgICAgaGlzdG9yeURldGFpbEl0ZW0uTGFzdCA9IG92ZXJ2aWV3Lkxhc3QgPj0gMCA/IG92ZXJ2aWV3Lkxhc3QgOiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY29udmVydCB1bml0IHZhbHVlcyAoZWc6IGJ5dGUgdG8gTUIgb3IgR0IpIGFuZCBnZW5lcmF0ZSB0aGUgY29udHJvbCBkYXRhIChzdW0sIG1heCwgYXZnKSBmb3Igb25lIHJvd1xyXG4gICAqL1xyXG4gIHByaXZhdGUgX2NvbnZlcnRVbml0QW5kR2VuZXJhdGVSb3dDb250cm9sRGF0YShyb3c6IENoYXJ0Q29udGVudERhdGFJdGVtW10sIGtleTogc3RyaW5nLCB1bml0OiBVbml0VHlwZSwgcG9ydDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgIGNvbnN0IG92ZXJ2aWV3OiBMb2FkSGlzdG9yeUluZm9JdGVtID0ge1N1bTogMCwgTWF4OiAwLCBBdmVyYWdlOiAwLCBMYXN0OiAwfTtcclxuICAgICAgICBjb25zdCBpZ25vcmVkVGFpbExpbmVOdW0gPSBnZXRJZ25vcmVkTGluZU51bUZyb21UYWlsKCk7XHJcbiAgICAgICAgbGV0IGludmFsaWRDb3VudCA9IDA7XHJcbiAgICAgICAgLy8gY29udmVydCB1bml0IGFuZCBjYWxjdWxhdGUgdGhlIG92ZXJ2aWV3IGRhdGEsIHNraXAgdGhlIGZpcnN0LCBhbmQgbGFzdCB0aHJlZSByb3dzLlxyXG4gICAgICAgIHJvdy5mb3JFYWNoKChpdGVtLCBpbmRleCwgYXJyYXlEYXRhKSA9PiB7XHJcbiAgICAgICAgICAvLyBza2lwIGlnbm9yZWQgbGluZShzKSBmcm9tIHRhaWxcclxuICAgICAgICAgIGlmIChpbmRleCA8PSByb3cubGVuZ3RoIC0gaWdub3JlZFRhaWxMaW5lTnVtIC0gMSkge1xyXG4gICAgICAgICAgICBpZiAoYXJyYXlEYXRhW2luZGV4XS55ID49IDApIHtcclxuICAgICAgICAgICAgICBhcnJheURhdGFbaW5kZXhdLnkgPSBnZXRWYWx1ZUJ5VW5pdChpdGVtLnksIHVuaXQpO1xyXG4gICAgICAgICAgICAgIG92ZXJ2aWV3LlN1bSArPSBhcnJheURhdGFbaW5kZXhdLnk7XHJcbiAgICAgICAgICAgICAgaWYgKGlzVW5pdFRpbWVSZWxhdGVkKHVuaXQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIGhhbmEgc3R1ZGlvLCBmb3IgdGhvc2UgdGltZSByZWxhdGVkIGNvbHVtbiwgdGhlIGZpcnN0IHZhbHVlIGlzIHNldCB0byAwXHJcbiAgICAgICAgICAgICAgICAgIGFycmF5RGF0YVtpbmRleF0ueSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAvLyBnZXQgdmFsdWUgZm9yIHVuaXQgbGlrZTogTUIvcyAgKHZhbHVlIC8gc2Vjb25kcylcclxuICAgICAgICAgICAgICAgICAgY29uc3QgdGltZURpZmYgPSBhcnJheURhdGFbaW5kZXhdLnggLSBhcnJheURhdGFbaW5kZXggLSAxXS54O1xyXG4gICAgICAgICAgICAgICAgICBhcnJheURhdGFbaW5kZXhdLnkgPSB0aW1lRGlmZiAhPT0gMCA/IGFycmF5RGF0YVtpbmRleF0ueSAqIDEwMDAgLyB0aW1lRGlmZiA6IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGFycmF5RGF0YVtpbmRleF0ueSA9IGdldFJvdW5kZWRWYWx1ZShhcnJheURhdGFbaW5kZXhdLnkpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoYXJyYXlEYXRhW2luZGV4XS55ID4gb3ZlcnZpZXcuTWF4KSB7XHJcbiAgICAgICAgICAgICAgICBvdmVydmlldy5NYXggPSBhcnJheURhdGFbaW5kZXhdLnk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIHNldCB2YWx1ZSB0byAwLCBmb3IgdGhvc2UgcG9pbnRzIHdpdGggdmFsdWUgLTEgb3IgPCAwXHJcbiAgICAgICAgICAgICAgYXJyYXlEYXRhW2luZGV4XS55ID0gMDtcclxuICAgICAgICAgICAgICAvLyBpbnZhbGlkIGNvdW50ICsgMSwgZm9yIGNhbGN1bGF0aW5nIHRoZSBhdmVyYWdlIChub3QgdGltZSByZWxhdGl2ZSlcclxuICAgICAgICAgICAgICBpbnZhbGlkQ291bnQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAocm93Lmxlbmd0aCA+PSAoaWdub3JlZFRhaWxMaW5lTnVtICsgaW52YWxpZENvdW50KSkge1xyXG4gICAgICAgICAgaWYgKGlzVW5pdFRpbWVSZWxhdGVkKHVuaXQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbWVQZXJpb2QgPSByb3dbcm93Lmxlbmd0aCAtIGlnbm9yZWRUYWlsTGluZU51bSAtIDFdLnggLSByb3dbMF0ueDtcclxuICAgICAgICAgICAgb3ZlcnZpZXcuQXZlcmFnZSA9IHRpbWVQZXJpb2QgIT09IDAgPyBnZXRSb3VuZGVkVmFsdWUob3ZlcnZpZXcuU3VtICogMTAwMCAvIHRpbWVQZXJpb2QpIDogMDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkSXRlbUNvdW50ID0gcm93Lmxlbmd0aCAtIGlnbm9yZWRUYWlsTGluZU51bSAtIGludmFsaWRDb3VudDtcclxuICAgICAgICAgICAgb3ZlcnZpZXcuQXZlcmFnZSA9IHZhbGlkSXRlbUNvdW50ID4gMCA/IGdldFJvdW5kZWRWYWx1ZShvdmVydmlldy5TdW0gLyB2YWxpZEl0ZW1Db3VudCkgOiAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgb3ZlcnZpZXcuTGFzdCA9IHJvd1tyb3cubGVuZ3RoIC0gaWdub3JlZFRhaWxMaW5lTnVtIC0gMV0ueTtcclxuICAgICAgICAgIG92ZXJ2aWV3LlN1bSA9IGdldFJvdW5kZWRWYWx1ZShvdmVydmlldy5TdW0pO1xyXG4gICAgICAgICAgb3ZlcnZpZXcuTWF4ID0gZ2V0Um91bmRlZFZhbHVlKG92ZXJ2aWV3Lk1heCk7XHJcblxyXG4gICAgICAgICAgLy8gcmVtb3ZlIHRob3NlIGlnbm9yZWQgbGluZXNcclxuICAgICAgICAgIHJvdy5sZW5ndGggPSByb3cubGVuZ3RoIC0gaWdub3JlZFRhaWxMaW5lTnVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9zZXRPdmVydmlldyhrZXksIG92ZXJ2aWV3LCB1bml0LCBwb3J0KTtcclxuICAgICAgfVxyXG4gICAgICByZXNvbHZlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvb3AgZnJvbSBhbGwgaGlzdG9yeSBpdGVtcywgcHV0IHRob3NlIGhpc3RvcnkgaXRlbXMgd2hpY2hcclxuICAgKiBoYXZlIHRoZSBzYW1lIHlTY2FsZUdyb3VwIHRvZ2V0aGVyLCB1c2luZyB5U2NhbGVHcm91cCBhcyBrZXkuXHJcbiAgICogZWc6IHtfX1NDQUxFX0dST1VQX0NQVTpbaXRlbTEsIGl0ZW0yLi4uXSwgX19TQ0FMRV9HUk9VUF9VTktOT1dOOltpdGVtMywgaXRlbTQuLi5dfVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2dldFlTY2FsZUdyb3VwV2l0aEhpc3RvcnlJdGVtcyhwb3J0OiBzdHJpbmcpOiB7fSB7XHJcbiAgICBjb25zdCB5U2NhbGVHcm91cCA9IHt9O1xyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvID0gdGhpcy5fZ2V0TG9hZEhpc3RvcnlJbmZvKHBvcnQpO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKGxvYWRIaXN0b3J5SW5mbykuZm9yRWFjaChwYXJlbnRLZXkgPT4ge1xyXG4gICAgICBPYmplY3Qua2V5cyhsb2FkSGlzdG9yeUluZm9bcGFyZW50S2V5XSkuZm9yRWFjaChjaGlsZEtleSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGV0YWlsSXRlbSA9IGxvYWRIaXN0b3J5SW5mb1twYXJlbnRLZXldW2NoaWxkS2V5XTtcclxuICAgICAgICBjb25zdCB5U2NhbGVHcm91cEtleSA9IGRldGFpbEl0ZW0uX1lTY2FsZUdyb3VwO1xyXG4gICAgICAgIGlmICgheVNjYWxlR3JvdXBbeVNjYWxlR3JvdXBLZXldKSB7XHJcbiAgICAgICAgICB5U2NhbGVHcm91cFt5U2NhbGVHcm91cEtleV0gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgeVNjYWxlR3JvdXBbeVNjYWxlR3JvdXBLZXldLnB1c2goZGV0YWlsSXRlbSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4geVNjYWxlR3JvdXA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRZU2NhbGVPZkdyb3VwKGdyb3VwSXRlbXM6IGFueSwgZ3JvdXA6IFNjYWxlR3JvdXApIHtcclxuICAgIGlmIChncm91cEl0ZW1zKSB7XHJcbiAgICAgIGlmIChncm91cCA9PT0gU2NhbGVHcm91cC5Vbmtub3duKSB7XHJcbiAgICAgICAgZ3JvdXBJdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbVtJdGVtLnlTY2FsZV0gPSBVSVNlcnZpY2UuX2dldFlTY2FsZUZvckl0ZW0oaXRlbSwgY2FsY3VsYXRlWVNjYWxlKGl0ZW0uTWF4KSkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHlTY2FsZSA9IGNhbGN1bGF0ZVlTY2FsZShVSVNlcnZpY2UuX2dldE1heFZhbHVlT2ZHcm91cChncm91cEl0ZW1zKSk7XHJcbiAgICAgICAgZ3JvdXBJdGVtcy5mb3JFYWNoKGl0ZW0gPT4gIGl0ZW1bSXRlbS55U2NhbGVdID0gVUlTZXJ2aWNlLl9nZXRZU2NhbGVGb3JJdGVtKGl0ZW0sIHlTY2FsZSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRJdGVtQnlLZXkoa2V5OiBzdHJpbmcsIHBvcnQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm8gPSB0aGlzLl9nZXRMb2FkSGlzdG9yeUluZm8ocG9ydCk7XHJcbiAgICBmb3IgKCBjb25zdCBpdGVtS2V5IG9mIE9iamVjdC5rZXlzKGxvYWRIaXN0b3J5SW5mbykpIHtcclxuICAgICAgaWYgKGtleSBpbiBsb2FkSGlzdG9yeUluZm9baXRlbUtleV0pIHtcclxuICAgICAgICByZXR1cm4gbG9hZEhpc3RvcnlJbmZvW2l0ZW1LZXldW2tleV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJlc2V0IHRoZSBsb2FkIGhpc3RvcnkgaW5mbyBvYmplY3QsIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtcclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXJMb2FkSGlzdG9yeUluZm9zKCkge1xyXG4gICAgdGhpcy5fbG9hZEhpc3RvcnlJbmZvcyA9IHt9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IGFsbCB0aGUgZGF0YSBmb3IgdGhlIHNlbGVjdGlvbiB0YWJsZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRTZWxlY3Rpb25UYWJsZVJvd3MoaGVhZGVyS2V5czogc3RyaW5nW10sIHBvcnQ6IHN0cmluZywgZGVmYXVsdERpc3BsYXlJdGVtczogc3RyaW5nW10pOiBhbnlbXSB7XHJcbiAgICBjb25zdCByb3dzOiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvID0gdGhpcy5fZ2V0TG9hZEhpc3RvcnlJbmZvKHBvcnQpO1xyXG5cclxuICAgIGNvbnN0IGRlZmF1bHRJdGVtcyA9IGRlZmF1bHREaXNwbGF5SXRlbXMgJiYgZGVmYXVsdERpc3BsYXlJdGVtcy5sZW5ndGggPiAwID8gZGVmYXVsdERpc3BsYXlJdGVtcyA6IHRoaXMuX0RFRkFVTFRfRElTUExBWV9JVEVNUztcclxuXHJcbiAgICBPYmplY3Qua2V5cyhsb2FkSGlzdG9yeUluZm8pLmZvckVhY2goa2V5UGFyZW50ID0+IHtcclxuICAgICAgcm93cy5wdXNoKHtLUEk6IGtleVBhcmVudCwgaGVhZGVyOiB0cnVlfSk7XHJcbiAgICAgIGNvbnN0IGxlbiA9IHJvd3MubGVuZ3RoO1xyXG4gICAgICByb3dzLnB1c2goLi4uT2JqZWN0LmtleXMobG9hZEhpc3RvcnlJbmZvW2tleVBhcmVudF0pXHJcbiAgICAgICAgLmZpbHRlcihrZXlDaGlsZCA9PiBoZWFkZXJLZXlzLmluY2x1ZGVzKGtleUNoaWxkKSlcclxuICAgICAgICAubWFwKGtleUNoaWxkID0+IHtcclxuICAgICAgICAgIGxvYWRIaXN0b3J5SW5mb1trZXlQYXJlbnRdW2tleUNoaWxkXS5oZWFkZXIgPSBmYWxzZTtcclxuICAgICAgICAgIGxvYWRIaXN0b3J5SW5mb1trZXlQYXJlbnRdW2tleUNoaWxkXS5jaGVja2VkID0gZGVmYXVsdEl0ZW1zLmluY2x1ZGVzKGtleUNoaWxkKTtcclxuICAgICAgICAgIHJldHVybiBsb2FkSGlzdG9yeUluZm9ba2V5UGFyZW50XVtrZXlDaGlsZF07XHJcbiAgICAgIH0pKTtcclxuICAgICAgaWYgKGxlbiA9PT0gcm93cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyBubyBzdWIgaXRlbXMsIHJlbW92ZSB0aGUgaGVhZGVyXHJcbiAgICAgICAgcm93cy5wb3AoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJvd3M7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgYWxsIGhpZGRlbiBjb2x1bW5zLiBUaG9zZSBoaWRkZW4gY29sdW1ucyA9IGlucHV0IGhpZGRlbiBjb2x1bW5zICsgZGVmYXVsdCBoaWRkZW4gY29sdW1uc1xyXG4gICAqIEBwYXJhbSBoaWRlTWVhc3VyZUNvbHVtbnMgdGhlIGFycmF5IGNvbnRhaW5zIHRoZSBjb2x1bW5zIGxpc3QgdGhhdCBuZWVkIHRvIGJlIGhpZGRlbi5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0SGlkZGVuQ29sdW1ucyhoaWRlTWVhc3VyZUNvbHVtbnM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgLy8gb25seSBtZWFzdXJlIGNvbHVtbnMgY2FuIGJlIGhpZGRlblxyXG4gICAgY29uc3QgaGlkZUNvbHVtbnMgPSBoaWRlTWVhc3VyZUNvbHVtbnMgPyBoaWRlTWVhc3VyZUNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiB0aGlzLl9NRUFTVVJFX0NPTFVNTlMuaW5jbHVkZXMoY29sdW1uKSkgOiBbXTtcclxuICAgIHJldHVybiBoaWRlQ29sdW1ucyA/IHRoaXMuX0hJREVEX0NPTFVNTlMuY29uY2F0KGhpZGVDb2x1bW5zKSA6IHRoaXMuX0hJREVEX0NPTFVNTlM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgaGVhZGVyIGluZm9ybWF0aW9uIGFuZCBmb3JtYXQgaXQgdG8ge2hlYWRLZXk6IGtleSwgaGVhZFRleHQ6IHRleHR9XHJcbiAgICovXHJcbiAgcHVibGljIGdldEhlYWRlcihrZXlzOiBzdHJpbmdbXSwgcG9ydDogc3RyaW5nKTogQ2hhcnRDb250ZW50SGVhZGVyW10ge1xyXG4gICAgcmV0dXJuIGtleXMubWFwKGtleSA9PiB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9nZXRJdGVtQnlLZXkoa2V5LCBwb3J0KTtcclxuICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiAnS1BJJyBpbiBpdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuICh7a2V5OiBrZXksIHRleHQ6IGl0ZW0uS1BJfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGAke2tleX0gaXMgbm90IGNvbmZpZ3VyZWQuYCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmZpbHRlcihrZXkgPT4ga2V5ICE9IG51bGwgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgc2VsZWN0ZWQgaXRlbXMsIHdoaWNoIG5lZWQgdG8gYmUgZGlzcGxheWVkIG9uIHRoZSBjaGFydC5cclxuICAgKiBAcGFyYW0gaGVhZGVyS2V5cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBrZXlzIG9mIGhlYWRlclxyXG4gICAqIEBwYXJhbSBwb3J0IHRoZSByZWxhdGl2ZSBwb3J0XHJcbiAgICogQHBhcmFtIGRlZmF1bHREaXNwbGF5SXRlbXMgdGhlIGl0ZW1zIGxpc3QgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBieSBkZWZhdWx0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXREaXNwbGF5SXRlbXMoaGVhZGVyS2V5czogc3RyaW5nW10sIHBvcnQ6IHN0cmluZywgZGVmYXVsdERpc3BsYXlJdGVtczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25UYWJsZSA9IHRoaXMuZ2V0U2VsZWN0aW9uVGFibGVSb3dzKGhlYWRlcktleXMsIHBvcnQsIGRlZmF1bHREaXNwbGF5SXRlbXMpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGlvblRhYmxlLmZpbHRlcihyb3cgPT4gcm93LmNoZWNrZWQpLm1hcChyb3cgPT4gcm93LktQSSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIFkgU2NhbGUgYnkgdGhlIGtleXMgYW5kIHBvcnRcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0WVNjYWxlKGtleXM6IHN0cmluZ1tdLCBwb3J0OiBzdHJpbmcpOiBudW1iZXJbXSB7XHJcbiAgICBjb25zdCB5U2NhbGVzID0gW107XHJcbiAgICBpZiAoa2V5cykge1xyXG4gICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICB5U2NhbGVzLnB1c2godGhpcy5fZ2V0SXRlbUJ5S2V5KGtleSwgcG9ydClbSXRlbS55U2NhbGVdKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geVNjYWxlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIFkgU2NhbGUgZm9yIHRoZSBwb3J0XHJcbiAgICovXHJcbiAgcHVibGljIGdlbmVyYXRlWVNjYWxlKHBvcnQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgeVNjYWxlR3JvdXAgPSB0aGlzLl9nZXRZU2NhbGVHcm91cFdpdGhIaXN0b3J5SXRlbXMocG9ydCk7XHJcbiAgICBVSVNlcnZpY2UuX1lTY2FsZUdyb3VwTGlzdC5mb3JFYWNoKGdyb3VwID0+IHtcclxuICAgICAgY29uc3QgaGlzdG9yeUl0ZW1zID0geVNjYWxlR3JvdXBbZ3JvdXBdO1xyXG4gICAgICBpZiAoaGlzdG9yeUl0ZW1zKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0WVNjYWxlT2ZHcm91cChoaXN0b3J5SXRlbXMsIGdyb3VwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBjb252ZXJ0IHVuaXQgdmFsdWVzIChlZzogYnl0ZSB0byBNQiBvciBHQikgYW5kIGdlbmVyYXRlIHRoZSBjb250cm9sIGRhdGEgKHN1bSwgbWF4LCBhdmcpXHJcbiAgICogQHBhcmFtIGRhdGEgdGhlIG5hbWVzZXJ2ZXIgaGlzdG9yeSBkYXRhXHJcbiAgICogQHBhcmFtIGhlYWRlciBoZWFkZXIgbGlzdFxyXG4gICAqIEBwYXJhbSBwb3J0IHNlbGVjdGVkIHBvcnRcclxuICAgKi9cclxuICBwdWJsaWMgY29udmVydFVuaXRBbmRHZW5lcmF0ZUNvbnRyb2xEYXRhKGRhdGE6IENoYXJ0Q29udGVudERhdGFJdGVtW11bXSwgaGVhZGVyOiBzdHJpbmdbXSwgcG9ydDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHByb21pc2VzID0gW107XHJcbiAgICBpZiAoZGF0YSAmJiBoZWFkZXIpIHtcclxuICAgICAgZGF0YS5mb3JFYWNoKChyb3csIGluZGV4KSA9PiB7XHJcbiAgICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgICAgLy8gZ2V0IGRldGFpbCBoaXN0b3J5IGl0ZW0ga2V5LCBsaWtlIGluZGV4c2VydmVyQ3B1XHJcbiAgICAgICAgICBjb25zdCBpdGVtS2V5ID0gaGVhZGVyW2luZGV4XTtcclxuICAgICAgICAgIGNvbnN0IHVuaXQgPSB0aGlzLl9nZXRQcm9jZXNzaW5nVW5pdChpdGVtS2V5LCBwb3J0KTtcclxuICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fY29udmVydFVuaXRBbmRHZW5lcmF0ZVJvd0NvbnRyb2xEYXRhKHJvdywgaXRlbUtleSwgdW5pdCwgcG9ydCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gIH1cclxufVxyXG5cclxuIl19
|