cmat 0.0.13 → 0.0.15
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/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.d.ts +0 -1
- package/components/cascade/cascade-list/cascade-list.component.d.ts +3 -3
- package/components/cascade/cascade-menu/cascade-menu.component.d.ts +0 -1
- package/components/cascade/options.interface.d.ts +1 -1
- package/components/chip-input/chip-input.component.d.ts +0 -1
- package/components/custom-formly/public-api.d.ts +1 -0
- package/components/custom-formly/types/multicheckbox/multicheckbox.component.d.ts +0 -1
- package/components/custom-formly/types/quill/quill.component.d.ts +42 -0
- package/components/custom-formly/types/radio/radio.component.d.ts +0 -1
- package/components/custom-formly/types/repeat/repeat.component.d.ts +0 -1
- package/components/custom-formly/types/select/select.component.d.ts +0 -1
- package/components/custom-formly/types/stepper/horizontal/stepper.component.d.ts +0 -1
- package/components/custom-formly/types/stepper/vertical/stepper.component.d.ts +0 -1
- package/components/custom-formly/types/table/table.component.d.ts +2 -3
- package/components/custom-formly/types/tabs/tab.component.d.ts +0 -1
- package/components/custom-formly/types/tags/tags.component.d.ts +0 -1
- package/components/material-color-picker/material-color-picker.component.d.ts +0 -1
- package/components/material-datetimepicker/calendar-body.d.ts +0 -1
- package/components/material-datetimepicker/calendar.d.ts +3 -4
- package/components/material-datetimepicker/clock.d.ts +2 -3
- package/components/material-datetimepicker/datetimepicker.d.ts +3 -4
- package/components/material-datetimepicker/month-view.d.ts +0 -1
- package/components/navigation/navigation.types.d.ts +1 -1
- package/components/pagination/pagination.component.d.ts +0 -1
- package/components/password-strength/mat-password-strength-validator.d.ts +1 -1
- package/components/popover/popover.component.d.ts +4 -7
- package/components/popover/popover.interfaces.d.ts +1 -2
- package/components/select-tree/select-tree.component.d.ts +0 -1
- package/components/timeline/timeline.component.d.ts +4 -6
- package/components/transfer-picker/filter/filter.component.d.ts +1 -2
- package/components/transfer-picker/interface.d.ts +4 -4
- package/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.d.ts +2 -2
- package/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.d.ts +1 -2
- package/components/transfer-picker/transfer-picker.component.d.ts +5 -5
- package/components/transfer-picker/transfer-picker.service.d.ts +6 -6
- package/components/upload/upload-queue/upload-queue.component.d.ts +1 -1
- package/directives/digit-only/mask.directive.d.ts +2 -0
- package/directives/equal-validator/equal-validator.directive.d.ts +1 -3
- package/esm2022/components/adapter/datetime-adapter.mjs +1 -1
- package/esm2022/components/adapter/dayjs-date-adapter.mjs +5 -5
- package/esm2022/components/adapter/dayjs-datetime-adapter.mjs +4 -4
- package/esm2022/components/adapter/native-datetime-adapter.mjs +4 -4
- package/esm2022/components/breadcrumb/breadcrumb-item.directive.mjs +3 -3
- package/esm2022/components/breadcrumb/breadcrumb.component.mjs +6 -6
- package/esm2022/components/breadcrumb/breadcrumb.service.mjs +9 -12
- package/esm2022/components/card/card.component.mjs +4 -4
- package/esm2022/components/cascade/cascade-bottom-sheet/cascade-bottom-sheet.component.mjs +5 -8
- package/esm2022/components/cascade/cascade-list/cascade-list.component.mjs +12 -10
- package/esm2022/components/cascade/cascade-menu/cascade-menu.component.mjs +5 -8
- package/esm2022/components/cascade/options.interface.mjs +1 -1
- package/esm2022/components/chip-input/chip-input.component.mjs +10 -11
- package/esm2022/components/custom-formly/extension/addons.extension.mjs +2 -2
- package/esm2022/components/custom-formly/public-api.mjs +2 -1
- package/esm2022/components/custom-formly/types/button/button.component.mjs +4 -4
- package/esm2022/components/custom-formly/types/cascade/cascade.component.mjs +4 -4
- package/esm2022/components/custom-formly/types/checklist/checklist.component.mjs +5 -5
- package/esm2022/components/custom-formly/types/chips/chips.component.mjs +5 -5
- package/esm2022/components/custom-formly/types/color-picker/color-picker.component.mjs +3 -3
- package/esm2022/components/custom-formly/types/date-range/date-range.component.mjs +3 -3
- package/esm2022/components/custom-formly/types/datepicker/datepicker.component.mjs +5 -5
- package/esm2022/components/custom-formly/types/multicheckbox/multicheckbox.component.mjs +4 -5
- package/esm2022/components/custom-formly/types/number/number.component.mjs +5 -5
- package/esm2022/components/custom-formly/types/quill/quill.component.mjs +171 -0
- package/esm2022/components/custom-formly/types/radio/radio.component.mjs +5 -6
- package/esm2022/components/custom-formly/types/rating/rating.component.mjs +3 -3
- package/esm2022/components/custom-formly/types/repeat/repeat.component.mjs +5 -8
- package/esm2022/components/custom-formly/types/select/select.component.mjs +5 -8
- package/esm2022/components/custom-formly/types/select-tree/select-tree.component.mjs +4 -4
- package/esm2022/components/custom-formly/types/stepper/horizontal/stepper.component.mjs +5 -8
- package/esm2022/components/custom-formly/types/stepper/vertical/stepper.component.mjs +5 -8
- package/esm2022/components/custom-formly/types/table/table.component.mjs +5 -8
- package/esm2022/components/custom-formly/types/tabs/tab.component.mjs +5 -8
- package/esm2022/components/custom-formly/types/tags/tags.component.mjs +7 -10
- package/esm2022/components/custom-formly/types/textarea/textarea.component.mjs +3 -3
- package/esm2022/components/custom-formly/types/upload/upload.component.mjs +4 -4
- package/esm2022/components/custom-formly/wrappers/addons/addons.component.mjs +4 -4
- package/esm2022/components/custom-formly/wrappers/card/card.component.mjs +3 -3
- package/esm2022/components/custom-formly/wrappers/expansion/expansion.component.mjs +5 -5
- package/esm2022/components/custom-formly/wrappers/panel/panel.component.mjs +3 -3
- package/esm2022/components/date-range/date-range.component.mjs +20 -15
- package/esm2022/components/drawer/drawer.component.mjs +4 -4
- package/esm2022/components/drawer/drawer.service.mjs +3 -3
- package/esm2022/components/fullscreen/fullscreen.component.mjs +5 -5
- package/esm2022/components/highlight/highlight.component.mjs +4 -4
- package/esm2022/components/highlight/highlight.service.mjs +4 -4
- package/esm2022/components/json-editor/json-editor.component.mjs +10 -10
- package/esm2022/components/masonry/masonry.component.mjs +4 -4
- package/esm2022/components/material-color-picker/material-color-picker.component.mjs +7 -8
- package/esm2022/components/material-datetimepicker/calendar-body.mjs +6 -9
- package/esm2022/components/material-datetimepicker/calendar.mjs +9 -15
- package/esm2022/components/material-datetimepicker/clock.mjs +5 -8
- package/esm2022/components/material-datetimepicker/datetimepicker-input.mjs +7 -5
- package/esm2022/components/material-datetimepicker/datetimepicker-intl.mjs +3 -3
- package/esm2022/components/material-datetimepicker/datetimepicker-toggle.mjs +9 -9
- package/esm2022/components/material-datetimepicker/datetimepicker.mjs +14 -15
- package/esm2022/components/material-datetimepicker/month-view.mjs +5 -8
- package/esm2022/components/material-datetimepicker/multi-year-view.mjs +5 -5
- package/esm2022/components/material-datetimepicker/time.mjs +10 -10
- package/esm2022/components/material-datetimepicker/year-view.mjs +5 -5
- package/esm2022/components/navigation/horizontal/components/basic/basic.component.mjs +5 -5
- package/esm2022/components/navigation/horizontal/components/branch/branch.component.mjs +5 -5
- package/esm2022/components/navigation/horizontal/components/divider/divider.component.mjs +3 -3
- package/esm2022/components/navigation/horizontal/components/spacer/spacer.component.mjs +3 -3
- package/esm2022/components/navigation/horizontal/horizontal.component.mjs +5 -5
- package/esm2022/components/navigation/navigation.service.mjs +4 -4
- package/esm2022/components/navigation/navigation.types.mjs +1 -1
- package/esm2022/components/navigation/vertical/components/aside/aside.component.mjs +5 -5
- package/esm2022/components/navigation/vertical/components/basic/basic.component.mjs +3 -3
- package/esm2022/components/navigation/vertical/components/collapsable/collapsable.component.mjs +5 -5
- package/esm2022/components/navigation/vertical/components/divider/divider.component.mjs +3 -3
- package/esm2022/components/navigation/vertical/components/group/group.component.mjs +5 -5
- package/esm2022/components/navigation/vertical/components/spacer/spacer.component.mjs +5 -5
- package/esm2022/components/navigation/vertical/vertical.component.mjs +5 -5
- package/esm2022/components/pagination/pagination.component.mjs +5 -8
- package/esm2022/components/pagination/pagination.directive.mjs +4 -4
- package/esm2022/components/pagination/pagination.pipe.mjs +5 -5
- package/esm2022/components/pagination/pagination.service.mjs +4 -4
- package/esm2022/components/password-strength/mat-pass-toggle-visibility/mat-pass-toggle-visibility.component.mjs +5 -5
- package/esm2022/components/password-strength/mat-password-strength/mat-password-strength.component.mjs +6 -6
- package/esm2022/components/password-strength/mat-password-strength-info/mat-password-strength-info.component.mjs +5 -5
- package/esm2022/components/password-strength/mat-password-strength-validator.mjs +2 -2
- package/esm2022/components/popover/popover-trigger.mjs +6 -8
- package/esm2022/components/popover/popover.component.mjs +8 -9
- package/esm2022/components/popover/popover.interfaces.mjs +1 -1
- package/esm2022/components/popover/popover.target.mjs +3 -3
- package/esm2022/components/progress-bar/progress-bar.component.mjs +4 -4
- package/esm2022/components/rating/rating.component.mjs +11 -7
- package/esm2022/components/select-search/select-no-entries-found.directive.mjs +3 -3
- package/esm2022/components/select-search/select-search-clear.directive.mjs +3 -3
- package/esm2022/components/select-search/select-search.component.mjs +9 -9
- package/esm2022/components/select-tree/select-tree.component.mjs +10 -11
- package/esm2022/components/timeline/timeline-item/timeline-item.component.mjs +11 -11
- package/esm2022/components/timeline/timeline.component.mjs +8 -15
- package/esm2022/components/toast/toast-modal.component.mjs +5 -5
- package/esm2022/components/toast/toast.component.mjs +6 -6
- package/esm2022/components/toast/toast.service.mjs +10 -10
- package/esm2022/components/transfer-picker/filter/filter.component.mjs +6 -9
- package/esm2022/components/transfer-picker/interface.mjs +1 -1
- package/esm2022/components/transfer-picker/search/search.component.mjs +3 -3
- package/esm2022/components/transfer-picker/transfer-picker-source/transfer-picker-source.component.mjs +4 -4
- package/esm2022/components/transfer-picker/transfer-picker-target/transfer-picker-target.component.mjs +5 -8
- package/esm2022/components/transfer-picker/transfer-picker.component.mjs +4 -4
- package/esm2022/components/transfer-picker/transfer-picker.service.mjs +8 -8
- package/esm2022/components/upload/files.util.service.mjs +4 -4
- package/esm2022/components/upload/upload-queue/upload-queue.component.mjs +8 -8
- package/esm2022/components/upload/upload.component.mjs +5 -5
- package/esm2022/directives/animate-on-scroll/animate-on-scroll.directive.mjs +4 -4
- package/esm2022/directives/animate-on-scroll/scroll.service.mjs +3 -3
- package/esm2022/directives/autofocus/autofocus.directive.mjs +3 -3
- package/esm2022/directives/debounce/abstract-debounce.directive.mjs +3 -3
- package/esm2022/directives/debounce/debounce-click.directive.mjs +3 -3
- package/esm2022/directives/debounce/debounce-keyup.directive.mjs +3 -3
- package/esm2022/directives/digit-only/digit-only.directive.mjs +6 -6
- package/esm2022/directives/digit-only/mask.directive.mjs +20 -5
- package/esm2022/directives/equal-validator/equal-validator.directive.mjs +4 -4
- package/esm2022/lib/mock-api/mock-api.interceptor.mjs +4 -4
- package/esm2022/lib/mock-api/mock-api.request-handler.mjs +1 -1
- package/esm2022/lib/mock-api/mock-api.service.mjs +4 -4
- package/esm2022/lib/mock-api/mock-api.types.mjs +1 -1
- package/esm2022/lib/mock-api/mock-api.utils.mjs +1 -2
- package/esm2022/pipes/bytes/bytes.pipe.mjs +4 -4
- package/esm2022/pipes/date-format/date-format.pipe.mjs +3 -3
- package/esm2022/pipes/find-by-key/find-by-key.pipe.mjs +4 -4
- package/esm2022/pipes/group-by/group-by.pipe.mjs +4 -4
- package/esm2022/pipes/keys/keys.pipe.mjs +4 -4
- package/esm2022/pipes/secure/secure-pipe.mjs +3 -3
- package/esm2022/pipes/uppercase/uppercase.pipe.mjs +3 -3
- package/esm2022/public-api.mjs +1 -1
- package/esm2022/services/alert/alert.service.mjs +11 -10
- package/esm2022/services/config/config.service.mjs +3 -3
- package/esm2022/services/config/urlStateConfig.service.mjs +5 -5
- package/esm2022/services/confirmation/confirmation.service.mjs +3 -3
- package/esm2022/services/confirmation/dialog/dialog.component.mjs +3 -3
- package/esm2022/services/data/data.service.mjs +4 -4
- package/esm2022/services/loading/loading.interceptor.mjs +4 -4
- package/esm2022/services/loading/loading.service.mjs +4 -4
- package/esm2022/services/local-storage/local-storage.service.mjs +3 -3
- package/esm2022/services/media-watcher/media-watcher.service.mjs +4 -4
- package/esm2022/services/platform/platform.service.mjs +4 -4
- package/esm2022/services/splash-screen/splash-screen.service.mjs +3 -3
- package/esm2022/services/title/title.service.mjs +4 -4
- package/esm2022/services/translation/translation.service.mjs +4 -4
- package/esm2022/services/utils/utils.service.mjs +9 -11
- package/esm2022/validators/validators.mjs +1 -1
- package/fesm2022/cmat-animations.mjs +1 -1
- package/fesm2022/cmat-components-adapter.mjs +10 -10
- package/fesm2022/cmat-components-adapter.mjs.map +1 -1
- package/fesm2022/cmat-components-breadcrumb.mjs +16 -19
- package/fesm2022/cmat-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/cmat-components-card.mjs +3 -3
- package/fesm2022/cmat-components-card.mjs.map +1 -1
- package/fesm2022/cmat-components-cascade.mjs +19 -23
- package/fesm2022/cmat-components-cascade.mjs.map +1 -1
- package/fesm2022/cmat-components-chip-input.mjs +9 -10
- package/fesm2022/cmat-components-chip-input.mjs.map +1 -1
- package/fesm2022/cmat-components-custom-formly.mjs +257 -115
- package/fesm2022/cmat-components-custom-formly.mjs.map +1 -1
- package/fesm2022/cmat-components-date-range.mjs +20 -15
- package/fesm2022/cmat-components-date-range.mjs.map +1 -1
- package/fesm2022/cmat-components-drawer.mjs +7 -7
- package/fesm2022/cmat-components-drawer.mjs.map +1 -1
- package/fesm2022/cmat-components-fullscreen.mjs +4 -4
- package/fesm2022/cmat-components-fullscreen.mjs.map +1 -1
- package/fesm2022/cmat-components-highlight.mjs +6 -6
- package/fesm2022/cmat-components-highlight.mjs.map +1 -1
- package/fesm2022/cmat-components-json-editor.mjs +9 -9
- package/fesm2022/cmat-components-json-editor.mjs.map +1 -1
- package/fesm2022/cmat-components-masonry.mjs +3 -3
- package/fesm2022/cmat-components-masonry.mjs.map +1 -1
- package/fesm2022/cmat-components-material-color-picker.mjs +6 -7
- package/fesm2022/cmat-components-material-color-picker.mjs.map +1 -1
- package/fesm2022/cmat-components-material-datetimepicker.mjs +70 -83
- package/fesm2022/cmat-components-material-datetimepicker.mjs.map +1 -1
- package/fesm2022/cmat-components-navigation.mjs +48 -48
- package/fesm2022/cmat-components-navigation.mjs.map +1 -1
- package/fesm2022/cmat-components-pagination.mjs +14 -17
- package/fesm2022/cmat-components-pagination.mjs.map +1 -1
- package/fesm2022/cmat-components-password-strength.mjs +15 -15
- package/fesm2022/cmat-components-password-strength.mjs.map +1 -1
- package/fesm2022/cmat-components-popover.mjs +15 -18
- package/fesm2022/cmat-components-popover.mjs.map +1 -1
- package/fesm2022/cmat-components-progress-bar.mjs +3 -3
- package/fesm2022/cmat-components-progress-bar.mjs.map +1 -1
- package/fesm2022/cmat-components-rating.mjs +9 -5
- package/fesm2022/cmat-components-rating.mjs.map +1 -1
- package/fesm2022/cmat-components-select-search.mjs +15 -15
- package/fesm2022/cmat-components-select-search.mjs.map +1 -1
- package/fesm2022/cmat-components-select-tree.mjs +9 -10
- package/fesm2022/cmat-components-select-tree.mjs.map +1 -1
- package/fesm2022/cmat-components-timeline.mjs +17 -24
- package/fesm2022/cmat-components-timeline.mjs.map +1 -1
- package/fesm2022/cmat-components-toast.mjs +18 -18
- package/fesm2022/cmat-components-toast.mjs.map +1 -1
- package/fesm2022/cmat-components-transfer-picker.mjs +25 -31
- package/fesm2022/cmat-components-transfer-picker.mjs.map +1 -1
- package/fesm2022/cmat-components-upload.mjs +14 -14
- package/fesm2022/cmat-components-upload.mjs.map +1 -1
- package/fesm2022/cmat-directives-animate-on-scroll.mjs +6 -6
- package/fesm2022/cmat-directives-animate-on-scroll.mjs.map +1 -1
- package/fesm2022/cmat-directives-autofocus.mjs +3 -3
- package/fesm2022/cmat-directives-debounce.mjs +9 -9
- package/fesm2022/cmat-directives-digit-only.mjs +24 -9
- package/fesm2022/cmat-directives-digit-only.mjs.map +1 -1
- package/fesm2022/cmat-directives-equal-validator.mjs +3 -3
- package/fesm2022/cmat-directives-equal-validator.mjs.map +1 -1
- package/fesm2022/cmat-lib-mock-api.mjs +7 -8
- package/fesm2022/cmat-lib-mock-api.mjs.map +1 -1
- package/fesm2022/cmat-pipes-bytes.mjs +3 -3
- package/fesm2022/cmat-pipes-bytes.mjs.map +1 -1
- package/fesm2022/cmat-pipes-date-format.mjs +3 -3
- package/fesm2022/cmat-pipes-find-by-key.mjs +3 -3
- package/fesm2022/cmat-pipes-find-by-key.mjs.map +1 -1
- package/fesm2022/cmat-pipes-group-by.mjs +3 -3
- package/fesm2022/cmat-pipes-group-by.mjs.map +1 -1
- package/fesm2022/cmat-pipes-keys.mjs +3 -3
- package/fesm2022/cmat-pipes-keys.mjs.map +1 -1
- package/fesm2022/cmat-pipes-secure.mjs +3 -3
- package/fesm2022/cmat-pipes-uppercase.mjs +3 -3
- package/fesm2022/cmat-services-alert.mjs +10 -9
- package/fesm2022/cmat-services-alert.mjs.map +1 -1
- package/fesm2022/cmat-services-config.mjs +7 -7
- package/fesm2022/cmat-services-config.mjs.map +1 -1
- package/fesm2022/cmat-services-confirmation.mjs +6 -6
- package/fesm2022/cmat-services-data.mjs +3 -3
- package/fesm2022/cmat-services-data.mjs.map +1 -1
- package/fesm2022/cmat-services-loading.mjs +6 -6
- package/fesm2022/cmat-services-loading.mjs.map +1 -1
- package/fesm2022/cmat-services-local-storage.mjs +3 -3
- package/fesm2022/cmat-services-media-watcher.mjs +3 -3
- package/fesm2022/cmat-services-media-watcher.mjs.map +1 -1
- package/fesm2022/cmat-services-platform.mjs +3 -3
- package/fesm2022/cmat-services-platform.mjs.map +1 -1
- package/fesm2022/cmat-services-splash-screen.mjs +3 -3
- package/fesm2022/cmat-services-title.mjs +3 -3
- package/fesm2022/cmat-services-title.mjs.map +1 -1
- package/fesm2022/cmat-services-translation.mjs +3 -3
- package/fesm2022/cmat-services-translation.mjs.map +1 -1
- package/fesm2022/cmat-services-utils.mjs +8 -10
- package/fesm2022/cmat-services-utils.mjs.map +1 -1
- package/fesm2022/cmat-validators.mjs.map +1 -1
- package/lib/mock-api/mock-api.request-handler.d.ts +1 -3
- package/lib/mock-api/mock-api.service.d.ts +1 -3
- package/lib/mock-api/mock-api.types.d.ts +2 -4
- package/package.json +76 -67
- package/pipes/group-by/group-by.pipe.d.ts +1 -1
- package/services/config/urlStateConfig.service.d.ts +0 -1
- package/services/translation/translation.service.d.ts +2 -2
- package/services/utils/utils.service.d.ts +5 -7
- package/styles/overrides/angular-material.scss +0 -1
- package/styles/overrides/quill.scss +102 -0
- package/styles/themes.scss +19 -19
|
@@ -11,12 +11,12 @@ import isBetween from 'dayjs/plugin/isBetween';
|
|
|
11
11
|
import { Subject } from 'rxjs';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
13
|
import * as i1 from "@angular/cdk/overlay";
|
|
14
|
-
import * as i2 from "@angular/
|
|
15
|
-
import * as i3 from "@angular/material/
|
|
16
|
-
import * as i4 from "@angular/material/
|
|
17
|
-
import * as i5 from "@angular/material/
|
|
18
|
-
import * as i6 from "@angular/material/
|
|
19
|
-
import * as i7 from "@angular/
|
|
14
|
+
import * as i2 from "@angular/forms";
|
|
15
|
+
import * as i3 from "@angular/material/button";
|
|
16
|
+
import * as i4 from "@angular/material/icon";
|
|
17
|
+
import * as i5 from "@angular/material/datepicker";
|
|
18
|
+
import * as i6 from "@angular/material/form-field";
|
|
19
|
+
import * as i7 from "@angular/material/input";
|
|
20
20
|
export class CmatDateRangeComponent {
|
|
21
21
|
constructor(_overlay, _viewContainerRef, _changeDetectorRef) {
|
|
22
22
|
this._overlay = _overlay;
|
|
@@ -35,7 +35,9 @@ export class CmatDateRangeComponent {
|
|
|
35
35
|
this._timeRegExp = new RegExp('^(0[0-9]|1[0-9]|2[0-4]|[0-9]):([0-5][0-9])(A|(?:AM)|P|(?:PM))?$', 'i');
|
|
36
36
|
this._unsubscribeAll = new Subject();
|
|
37
37
|
dayjs.extend(isBetween);
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
38
39
|
this._onChange = () => { };
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
39
41
|
this._onTouched = () => { };
|
|
40
42
|
this.dateFormat = 'YYYY/MM/DD';
|
|
41
43
|
this.timeFormat = '12';
|
|
@@ -149,7 +151,7 @@ export class CmatDateRangeComponent {
|
|
|
149
151
|
// Set the end date
|
|
150
152
|
this._range.end = end.clone();
|
|
151
153
|
// If the selected end date is before the start date...
|
|
152
|
-
if (this._range.start
|
|
154
|
+
if (this._range.start?.isAfter(this._range.end)) {
|
|
153
155
|
// Set the start date to the end date but keep the start date's time
|
|
154
156
|
const startDate = end.clone().hour(this._range.start.hour()).minute(this._range.start.minute()).second(this._range.start.second());
|
|
155
157
|
// Test this new end date to see if it's ahead of the start date
|
|
@@ -246,6 +248,7 @@ export class CmatDateRangeComponent {
|
|
|
246
248
|
ngOnDestroy() {
|
|
247
249
|
this._unsubscribeAll.next(void 0);
|
|
248
250
|
this._unsubscribeAll.complete();
|
|
251
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
249
252
|
this.writeValue = () => { };
|
|
250
253
|
}
|
|
251
254
|
// -----------------------------------------------------------------------------------------------------
|
|
@@ -287,12 +290,12 @@ export class CmatDateRangeComponent {
|
|
|
287
290
|
// On backdrop click
|
|
288
291
|
overlayRef.backdropClick().subscribe(() => {
|
|
289
292
|
// If template portal exists and attached...
|
|
290
|
-
if (templatePortal
|
|
293
|
+
if (templatePortal?.isAttached) {
|
|
291
294
|
// Detach it
|
|
292
295
|
templatePortal.detach();
|
|
293
296
|
}
|
|
294
297
|
// If overlay exists and attached...
|
|
295
|
-
if (overlayRef
|
|
298
|
+
if (overlayRef?.hasAttached()) {
|
|
296
299
|
// Detach it
|
|
297
300
|
overlayRef.detach();
|
|
298
301
|
overlayRef.dispose();
|
|
@@ -507,16 +510,16 @@ export class CmatDateRangeComponent {
|
|
|
507
510
|
// If meridiem doesn't exist, create a moment using 24-hours format and return in
|
|
508
511
|
return dayjs(value, 'HH:mm').second(0);
|
|
509
512
|
}
|
|
510
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
511
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
513
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CmatDateRangeComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
514
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.1", type: CmatDateRangeComponent, isStandalone: true, selector: "cmat-date-range", inputs: { readonly: "readonly", dateFormat: "dateFormat", timeFormat: "timeFormat", timeRange: "timeRange", range: "range" }, outputs: { rangeChanged: "rangeChanged" }, providers: [
|
|
512
515
|
{
|
|
513
516
|
provide: NG_VALUE_ACCESSOR,
|
|
514
517
|
useExisting: forwardRef(() => CmatDateRangeComponent),
|
|
515
518
|
multi: true
|
|
516
519
|
}
|
|
517
|
-
], viewQueries: [{ propertyName: "_matMonthView1", first: true, predicate: ["matMonthView1"], descendants: true }, { propertyName: "_matMonthView2", first: true, predicate: ["matMonthView2"], descendants: true }, { propertyName: "_pickerPanelOrigin", first: true, predicate: ["pickerPanelOrigin"], descendants: true, read: ElementRef }, { propertyName: "_pickerPanel", first: true, predicate: ["pickerPanel"], descendants: true }], exportAs: ["cmatDateRange"], ngImport: i0, template: "<div role=\"presentation\" class=\"range\" (click)=\"openPickerPanel()\" #pickerPanelOrigin>\n\n <div class=\"start\">\n <div class=\"date\">{{range.startDate}}</div>\n @if (range.startTime) {\n <div class=\"time\">{{range.startTime}}</div>\n }\n </div>\n\n <div class=\"separator\">-</div>\n\n <div class=\"end\">\n <div class=\"date\">{{range.endDate}}</div>\n @if (range.endTime) {\n <div class=\"time\">{{range.endTime}}</div>\n }\n </div>\n\n</div>\n\n<ng-template #pickerPanel>\n\n <!-- Start -->\n <div class=\"start\">\n\n <div class=\"month\">\n <div class=\"month-header\">\n <button type=\"button\" class=\"previous-button\" mat-icon-button (click)=\"prev()\" tabindex=\"1\">\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-left'\"></mat-icon>\n </button>\n <div class=\"month-label\">{{getMonthLabel(1)}}</div>\n </div>\n <mat-month-view [(activeDate)]=\"activeDates.month1\" [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\n (click)=\"$event.stopImmediatePropagation()\" (selectedChange)=\"onSelectedDateChange($event)\"\n #matMonthView1>\n </mat-month-view>\n </div>\n\n @if (timeRange) {\n <mat-form-field class=\"time start-time\">\n <input matInput [autocomplete]=\"'off'\" [formControl]=\"startTimeFormControl\" (blur)=\"updateStartTime($event)\"\n tabindex=\"3\">\n <mat-label>\u5F00\u59CB\u65F6\u95F4</mat-label>\n </mat-form-field>\n }\n\n </div>\n\n <!-- End -->\n <div class=\"end\">\n\n <div class=\"month\">\n <div class=\"month-header\">\n <div class=\"month-label\">{{getMonthLabel(2)}}</div>\n <button type=\"button\" class=\"next-button\" mat-icon-button (click)=\"next()\" tabindex=\"2\">\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-right'\"></mat-icon>\n </button>\n </div>\n <mat-month-view [(activeDate)]=\"activeDates.month2\" [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\n (click)=\"$event.stopImmediatePropagation()\" (selectedChange)=\"onSelectedDateChange($event)\"\n #matMonthView2>\n </mat-month-view>\n </div>\n\n @if (timeRange) {\n <mat-form-field class=\"time end-time\">\n <input matInput [formControl]=\"endTimeFormControl\" (blur)=\"updateEndTime($event)\" tabindex=\"4\">\n <mat-label>\u7ED3\u675F\u65F6\u95F4</mat-label>\n </mat-form-field>\n }\n\n </div>\n\n </ng-template>", styles: ["cmat-date-range{display:flex}cmat-date-range .range{display:flex;width:100%;align-items:center;height:48px;min-height:48px;max-height:48px;cursor:pointer}cmat-date-range .range .start,cmat-date-range .range .end{display:flex;align-items:center;height:100%;padding:0 16px;border-radius:6px;border-width:1px;line-height:1}cmat-date-range .range .date{white-space:nowrap}cmat-date-range .range .date+.time{margin-left:8px}cmat-date-range .range .time{white-space:nowrap}cmat-date-range .separator{margin:0 8px}.cmat-date-range-panel{border-radius:4px;padding:24px}.cmat-date-range-panel .start,.cmat-date-range-panel .end{display:flex;flex-direction:column}.cmat-date-range-panel .start .month,.cmat-date-range-panel .end .month{max-width:196px;min-width:196px;width:196px}.cmat-date-range-panel .start .month .month-header,.cmat-date-range-panel .end .month .month-header{position:relative;display:flex;align-items:center;justify-content:center;height:32px;margin-bottom:16px}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .next-button{position:absolute;width:24px!important;height:24px!important;min-height:24px!important;max-height:24px!important;line-height:24px!important}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .previous-button{left:0}.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .next-button{right:0}.cmat-date-range-panel .start .month .month-header .month-label,.cmat-date-range-panel .end .month .month-header .month-label{font-weight:500}.cmat-date-range-panel .start .month mat-month-view,.cmat-date-range-panel .end .month mat-month-view{display:flex;min-height:188px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table{width:100%;border-collapse:collapse}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true]{display:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true]{visibility:hidden;pointer-events:none;opacity:0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content{background-color:transparent!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today{border:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell{width:28px!important;height:28px!important;padding:2px!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before{content:\"\";position:absolute;inset:2px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before{border-radius:999px 0 0 999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before{right:2px;border-radius:999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before{border-radius:0 999px 999px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content{position:relative;top:0;left:0;width:24px;height:24px;font-size:12px}.cmat-date-range-panel .time{width:100%;max-width:196px}.cmat-date-range-panel .start{align-items:flex-start;margin-right:20px}.cmat-date-range-panel .start .month .month-label{margin-left:8px}.cmat-date-range-panel .end{align-items:flex-end;margin-left:20px}.cmat-date-range-panel .end .month .month-label{margin-right:8px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i4.MatMonthView, selector: "mat-month-view", inputs: ["activeDate", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName", "activeDrag"], outputs: ["selectedChange", "_userSelection", "dragStarted", "dragEnded", "activeDateChange"], exportAs: ["matMonthView"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
520
|
+
], viewQueries: [{ propertyName: "_matMonthView1", first: true, predicate: ["matMonthView1"], descendants: true }, { propertyName: "_matMonthView2", first: true, predicate: ["matMonthView2"], descendants: true }, { propertyName: "_pickerPanelOrigin", first: true, predicate: ["pickerPanelOrigin"], descendants: true, read: ElementRef }, { propertyName: "_pickerPanel", first: true, predicate: ["pickerPanel"], descendants: true }], exportAs: ["cmatDateRange"], ngImport: i0, template: "<div #pickerPanelOrigin role=\"presentation\" class=\"range\" (click)=\"openPickerPanel()\">\n\n <div class=\"start\">\n <div class=\"date\">{{range.startDate}}</div>\n @if (range.startTime) {\n <div class=\"time\">{{range.startTime}}</div>\n }\n </div>\n\n <div class=\"separator\">-</div>\n\n <div class=\"end\">\n <div class=\"date\">{{range.endDate}}</div>\n @if (range.endTime) {\n <div class=\"time\">{{range.endTime}}</div>\n }\n </div>\n\n</div>\n\n<ng-template #pickerPanel>\n\n <!-- Start -->\n <div class=\"start\">\n\n <div class=\"month\">\n <div class=\"month-header\">\n <button type=\"button\" class=\"previous-button\" mat-icon-button tabindex=\"1\" (click)=\"prev()\">\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-left'\"></mat-icon>\n </button>\n <div class=\"month-label\">{{getMonthLabel(1)}}</div>\n </div>\n <mat-month-view #matMonthView1 [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\n [(activeDate)]=\"activeDates.month1\" (click)=\"$event.stopImmediatePropagation()\"\n (selectedChange)=\"onSelectedDateChange($event)\">\n </mat-month-view>\n </div>\n\n @if (timeRange) {\n <mat-form-field class=\"time start-time\">\n <input matInput tabindex=\"3\" [autocomplete]=\"'off'\" [formControl]=\"startTimeFormControl\"\n (blur)=\"updateStartTime($event)\">\n <mat-label>\u5F00\u59CB\u65F6\u95F4</mat-label>\n </mat-form-field>\n }\n\n </div>\n\n <!-- End -->\n <div class=\"end\">\n\n <div class=\"month\">\n <div class=\"month-header\">\n <div class=\"month-label\">{{getMonthLabel(2)}}</div>\n <button type=\"button\" class=\"next-button\" mat-icon-button tabindex=\"2\" (click)=\"next()\">\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-right'\"></mat-icon>\n </button>\n </div>\n <mat-month-view #matMonthView2 [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\n [(activeDate)]=\"activeDates.month2\" (click)=\"$event.stopImmediatePropagation()\"\n (selectedChange)=\"onSelectedDateChange($event)\">\n </mat-month-view>\n </div>\n\n @if (timeRange) {\n <mat-form-field class=\"time end-time\">\n <input matInput tabindex=\"4\" [formControl]=\"endTimeFormControl\" (blur)=\"updateEndTime($event)\">\n <mat-label>\u7ED3\u675F\u65F6\u95F4</mat-label>\n </mat-form-field>\n }\n\n </div>\n\n </ng-template>", styles: ["cmat-date-range{display:flex}cmat-date-range .range{display:flex;width:100%;align-items:center;height:48px;min-height:48px;max-height:48px;cursor:pointer}cmat-date-range .range .start,cmat-date-range .range .end{display:flex;align-items:center;height:100%;padding:0 16px;border-radius:6px;border-width:1px;line-height:1}cmat-date-range .range .date{white-space:nowrap}cmat-date-range .range .date+.time{margin-left:8px}cmat-date-range .range .time{white-space:nowrap}cmat-date-range .separator{margin:0 8px}.cmat-date-range-panel{border-radius:4px;padding:24px}.cmat-date-range-panel .start,.cmat-date-range-panel .end{display:flex;flex-direction:column}.cmat-date-range-panel .start .month,.cmat-date-range-panel .end .month{max-width:196px;min-width:196px;width:196px}.cmat-date-range-panel .start .month .month-header,.cmat-date-range-panel .end .month .month-header{position:relative;display:flex;align-items:center;justify-content:center;height:32px;margin-bottom:16px}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .next-button{position:absolute;width:24px!important;height:24px!important;min-height:24px!important;max-height:24px!important;line-height:24px!important}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .previous-button{left:0}.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .next-button{right:0}.cmat-date-range-panel .start .month .month-header .month-label,.cmat-date-range-panel .end .month .month-header .month-label{font-weight:500}.cmat-date-range-panel .start .month mat-month-view,.cmat-date-range-panel .end .month mat-month-view{display:flex;min-height:188px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table{width:100%;border-collapse:collapse}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true]{display:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true]{visibility:hidden;pointer-events:none;opacity:0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content{background-color:transparent!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today{border:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell{width:28px!important;height:28px!important;padding:2px!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before{content:\"\";position:absolute;inset:2px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before{border-radius:999px 0 0 999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before{right:2px;border-radius:999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before{border-radius:0 999px 999px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content{position:relative;top:0;left:0;width:24px;height:24px;font-size:12px}.cmat-date-range-panel .time{width:100%;max-width:196px}.cmat-date-range-panel .start{align-items:flex-start;margin-right:20px}.cmat-date-range-panel .start .month .month-label{margin-left:8px}.cmat-date-range-panel .end{align-items:flex-end;margin-left:20px}.cmat-date-range-panel .end .month .month-label{margin-right:8px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i5.MatMonthView, selector: "mat-month-view", inputs: ["activeDate", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName", "activeDrag"], outputs: ["selectedChange", "_userSelection", "dragStarted", "dragEnded", "activeDateChange"], exportAs: ["matMonthView"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
518
521
|
}
|
|
519
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
522
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: CmatDateRangeComponent, decorators: [{
|
|
520
523
|
type: Component,
|
|
521
524
|
args: [{ selector: 'cmat-date-range', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatDateRange', providers: [
|
|
522
525
|
{
|
|
@@ -524,7 +527,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
524
527
|
useExisting: forwardRef(() => CmatDateRangeComponent),
|
|
525
528
|
multi: true
|
|
526
529
|
}
|
|
527
|
-
], standalone: true, imports: [
|
|
530
|
+
], standalone: true, imports: [FormsModule, ReactiveFormsModule, MatButtonModule, MatIconModule,
|
|
531
|
+
MatDatepickerModule, MatFormFieldModule,
|
|
532
|
+
MatInputModule], template: "<div #pickerPanelOrigin role=\"presentation\" class=\"range\" (click)=\"openPickerPanel()\">\n\n <div class=\"start\">\n <div class=\"date\">{{range.startDate}}</div>\n @if (range.startTime) {\n <div class=\"time\">{{range.startTime}}</div>\n }\n </div>\n\n <div class=\"separator\">-</div>\n\n <div class=\"end\">\n <div class=\"date\">{{range.endDate}}</div>\n @if (range.endTime) {\n <div class=\"time\">{{range.endTime}}</div>\n }\n </div>\n\n</div>\n\n<ng-template #pickerPanel>\n\n <!-- Start -->\n <div class=\"start\">\n\n <div class=\"month\">\n <div class=\"month-header\">\n <button type=\"button\" class=\"previous-button\" mat-icon-button tabindex=\"1\" (click)=\"prev()\">\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-left'\"></mat-icon>\n </button>\n <div class=\"month-label\">{{getMonthLabel(1)}}</div>\n </div>\n <mat-month-view #matMonthView1 [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\n [(activeDate)]=\"activeDates.month1\" (click)=\"$event.stopImmediatePropagation()\"\n (selectedChange)=\"onSelectedDateChange($event)\">\n </mat-month-view>\n </div>\n\n @if (timeRange) {\n <mat-form-field class=\"time start-time\">\n <input matInput tabindex=\"3\" [autocomplete]=\"'off'\" [formControl]=\"startTimeFormControl\"\n (blur)=\"updateStartTime($event)\">\n <mat-label>\u5F00\u59CB\u65F6\u95F4</mat-label>\n </mat-form-field>\n }\n\n </div>\n\n <!-- End -->\n <div class=\"end\">\n\n <div class=\"month\">\n <div class=\"month-header\">\n <div class=\"month-label\">{{getMonthLabel(2)}}</div>\n <button type=\"button\" class=\"next-button\" mat-icon-button tabindex=\"2\" (click)=\"next()\">\n <mat-icon [svgIcon]=\"'heroicons_outline:chevron-right'\"></mat-icon>\n </button>\n </div>\n <mat-month-view #matMonthView2 [dateFilter]=\"dateFilter()\" [dateClass]=\"dateClass()\"\n [(activeDate)]=\"activeDates.month2\" (click)=\"$event.stopImmediatePropagation()\"\n (selectedChange)=\"onSelectedDateChange($event)\">\n </mat-month-view>\n </div>\n\n @if (timeRange) {\n <mat-form-field class=\"time end-time\">\n <input matInput tabindex=\"4\" [formControl]=\"endTimeFormControl\" (blur)=\"updateEndTime($event)\">\n <mat-label>\u7ED3\u675F\u65F6\u95F4</mat-label>\n </mat-form-field>\n }\n\n </div>\n\n </ng-template>", styles: ["cmat-date-range{display:flex}cmat-date-range .range{display:flex;width:100%;align-items:center;height:48px;min-height:48px;max-height:48px;cursor:pointer}cmat-date-range .range .start,cmat-date-range .range .end{display:flex;align-items:center;height:100%;padding:0 16px;border-radius:6px;border-width:1px;line-height:1}cmat-date-range .range .date{white-space:nowrap}cmat-date-range .range .date+.time{margin-left:8px}cmat-date-range .range .time{white-space:nowrap}cmat-date-range .separator{margin:0 8px}.cmat-date-range-panel{border-radius:4px;padding:24px}.cmat-date-range-panel .start,.cmat-date-range-panel .end{display:flex;flex-direction:column}.cmat-date-range-panel .start .month,.cmat-date-range-panel .end .month{max-width:196px;min-width:196px;width:196px}.cmat-date-range-panel .start .month .month-header,.cmat-date-range-panel .end .month .month-header{position:relative;display:flex;align-items:center;justify-content:center;height:32px;margin-bottom:16px}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .next-button{position:absolute;width:24px!important;height:24px!important;min-height:24px!important;max-height:24px!important;line-height:24px!important}.cmat-date-range-panel .start .month .month-header .previous-button,.cmat-date-range-panel .end .month .month-header .previous-button{left:0}.cmat-date-range-panel .start .month .month-header .next-button,.cmat-date-range-panel .end .month .month-header .next-button{right:0}.cmat-date-range-panel .start .month .month-header .month-label,.cmat-date-range-panel .end .month .month-header .month-label{font-weight:500}.cmat-date-range-panel .start .month mat-month-view,.cmat-date-range-panel .end .month mat-month-view{display:flex;min-height:188px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table{width:100%;border-collapse:collapse}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr[aria-hidden=true]{display:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true],.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr:first-child td:first-child[aria-hidden=true]{visibility:hidden;pointer-events:none;opacity:0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody tr td .mat-calendar-body-cell-content{background-color:transparent!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-today{border:none!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell{width:28px!important;height:28px!important;padding:2px!important}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range:before{content:\"\";position:absolute;inset:2px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start:before{border-radius:999px 0 0 999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-start.cmat-date-range-end:before{right:2px;border-radius:999px}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell.cmat-date-range.cmat-date-range-end:before{border-radius:0 999px 999px 0}.cmat-date-range-panel .start .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content,.cmat-date-range-panel .end .month mat-month-view .mat-calendar-table tbody .mat-calendar-body-cell .mat-calendar-body-cell-content{position:relative;top:0;left:0;width:24px;height:24px;font-size:12px}.cmat-date-range-panel .time{width:100%;max-width:196px}.cmat-date-range-panel .start{align-items:flex-start;margin-right:20px}.cmat-date-range-panel .start .month .month-label{margin-left:8px}.cmat-date-range-panel .end{align-items:flex-end;margin-left:20px}.cmat-date-range-panel .end .month .month-label{margin-right:8px}\n"] }]
|
|
528
533
|
}], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }], propDecorators: { rangeChanged: [{
|
|
529
534
|
type: Output
|
|
530
535
|
}], _matMonthView1: [{
|
|
@@ -550,4 +555,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
550
555
|
}], range: [{
|
|
551
556
|
type: Input
|
|
552
557
|
}] } });
|
|
553
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbWF0L2NvbXBvbmVudHMvZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NtYXQvY29tcG9uZW50cy9kYXRlLXJhbmdlL2RhdGUtcmFuZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFlLFNBQVMsRUFBb0IsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM04sT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQTJDLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQWdCLE1BQU0sT0FBTyxDQUFDO0FBQ3JDLE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7OztBQW9CL0IsTUFBTSxPQUFPLHNCQUFzQjtJQTRCL0IsWUFDWSxRQUFpQixFQUNqQixpQkFBbUMs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Q1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLENBQUM7NEJBQ3JELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKLGNBQ1csSUFBSSxXQUNQLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixDQUFDOzJJQUdqSCxZQUFZO3NCQUE5QixNQUFNO2dCQUM2QixjQUFjO3NCQUFqRCxTQUFTO3VCQUFDLGVBQWU7Z0JBQ1UsY0FBYztzQkFBakQsU0FBUzt1QkFBQyxlQUFlO2dCQUNvQyxrQkFBa0I7c0JBQS9FLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNsQixZQUFZO3NCQUE3QyxTQUFTO3VCQUFDLGFBQWE7Z0JBeUNwQixRQUFRO3NCQURYLEtBQUs7Z0JBVUYsVUFBVTtzQkFEYixLQUFLO2dCQWtCRixVQUFVO3NCQURiLEtBQUs7Z0JBb0JGLFNBQVM7c0JBRFosS0FBSztnQkF5Q0YsS0FBSztzQkFEUixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRvcnMsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDYWxlbmRhckNlbGxDc3NDbGFzc2VzLCBNYXRNb250aFZpZXcsIE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCBkYXlqcywgeyBEYXlqcyB9IGZyb20gJ2RheWpzJztcclxuaW1wb3J0IGlzQmV0d2VlbiBmcm9tICdkYXlqcy9wbHVnaW4vaXNCZXR3ZWVuJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdjbWF0LWRhdGUtcmFuZ2UnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1yYW5nZS5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgZXhwb3J0QXM6ICdjbWF0RGF0ZVJhbmdlJyxcclxuICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENtYXREYXRlUmFuZ2VDb21wb25lbnQpLFxyXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIF0sXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW01hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0RGF0ZXBpY2tlck1vZHVsZSwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDbWF0RGF0ZVJhbmdlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHJhbmdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfT4oKTtcclxuICAgIEBWaWV3Q2hpbGQoJ21hdE1vbnRoVmlldzEnKSBwcml2YXRlIF9tYXRNb250aFZpZXcxOiBNYXRNb250aFZpZXc8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ21hdE1vbnRoVmlldzInKSBwcml2YXRlIF9tYXRNb250aFZpZXcyOiBNYXRNb250aFZpZXc8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3BpY2tlclBhbmVsT3JpZ2luJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgX3BpY2tlclBhbmVsT3JpZ2luOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgncGlja2VyUGFuZWwnKSBwcml2YXRlIF9waWNrZXJQYW5lbDogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICBhY3RpdmVEYXRlczogeyBtb250aDE6IERheWpzIHwgbnVsbDsgbW9udGgyOiBEYXlqcyB8IG51bGwgfSA9IHtcclxuICAgICAgICBtb250aDE6IG51bGwsXHJcbiAgICAgICAgbW9udGgyOiBudWxsXHJcbiAgICB9O1xyXG4gICAgc2V0V2hpY2hEYXRlOiAnc3RhcnQnIHwgJ2VuZCcgPSAnc3RhcnQnO1xyXG4gICAgc3RhcnRUaW1lRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG4gICAgZW5kVGltZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcclxuICAgIHByaXZhdGUgX2RhdGVGb3JtYXQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XHJcbiAgICBwcml2YXRlIF9wcm9ncmFtbWF0aWNDaGFuZ2UhOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfcmFuZ2U6IHsgc3RhcnQ6IERheWpzIHwgbnVsbDsgZW5kOiBEYXlqcyB8IG51bGwgfSA9IHtcclxuICAgICAgICBzdGFydDogbnVsbCxcclxuICAgICAgICBlbmQ6IG51bGxcclxuICAgIH07XHJcbiAgICBwcml2YXRlIF90aW1lRm9ybWF0OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF90aW1lUmFuZ2U6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9yZWFkb25seTogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RpbWVSZWdFeHA6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoJ14oMFswLTldfDFbMC05XXwyWzAtNF18WzAtOV0pOihbMC01XVswLTldKShBfCg/OkFNKXxQfCg/OlBNKSk/JCcsICdpJyk7XHJcbiAgICBwcml2YXRlIF91bnN1YnNjcmliZUFsbDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXHJcbiAgICAgICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICAgICkge1xyXG4gICAgICAgIGRheWpzLmV4dGVuZChpc0JldHdlZW4pO1xyXG5cclxuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9ICgpOiB2b2lkID0+IHsgfTtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7IH07XHJcbiAgICAgICAgdGhpcy5kYXRlRm9ybWF0ID0gJ1lZWVkvTU0vREQnO1xyXG4gICAgICAgIHRoaXMudGltZUZvcm1hdCA9ICcxMic7ICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgcmVhZG9ubHkodmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBnZXQgZGF0ZUZvcm1hdCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlRm9ybWF0O1xyXG4gICAgfVxyXG4gICAgQElucHV0KClcclxuICAgIHNldCBkYXRlRm9ybWF0KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWVcclxuICAgICAgICBpZiAodGhpcy5fZGF0ZUZvcm1hdCA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU3RvcmUgdGhlIHZhbHVlXHJcbiAgICAgICAgdGhpcy5fZGF0ZUZvcm1hdCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0dGVyICYgZ2V0dGVyIGZvciB0aW1lRm9ybWF0IGlucHV0ICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgZ2V0IHRpbWVGb3JtYXQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGltZUZvcm1hdDtcclxuICAgIH1cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgdGltZUZvcm1hdCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lXHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVGb3JtYXQgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCBmb3JtYXQgYmFzZWQgb24gdGhlIHRpbWUgZm9ybWF0IGlucHV0XHJcbiAgICAgICAgdGhpcy5fdGltZUZvcm1hdCA9IHZhbHVlID09PSAnMTInID8gJ2hoOm1tQScgOiAnSEg6bW0nO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXR0ZXIgJiBnZXR0ZXIgZm9yIHRpbWVSYW5nZSBpbnB1dCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIGdldCB0aW1lUmFuZ2UoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVSYW5nZTtcclxuICAgIH1cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgdGltZVJhbmdlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lXHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVSYW5nZSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU3RvcmUgdGhlIHZhbHVlXHJcbiAgICAgICAgdGhpcy5fdGltZVJhbmdlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSB0aW1lIHJhbmdlIHR1cm5lZCBvZmYuLi5cclxuICAgICAgICBpZiAoIXZhbHVlICYmIHRoaXMuX3JhbmdlLnN0YXJ0ICYmIHRoaXMuX3JhbmdlLmVuZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJhbmdlID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuX3JhbmdlLnN0YXJ0LmNsb25lKCkuc3RhcnRPZignZGF5JyksXHJcbiAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuX3JhbmdlLmVuZC5jbG9uZSgpLmVuZE9mKCdkYXknKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHRlciAmIGdldHRlciBmb3IgcmFuZ2UgaW5wdXQgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBnZXQgcmFuZ2UoKTogYW55IHtcclxuICAgICAgICBpZiAodGhpcy5fcmFuZ2Uuc3RhcnQgJiYgdGhpcy5fcmFuZ2UuZW5kKSB7XHJcbiAgICAgICAgICAgIC8vIENsb25lIHRoZSByYW5nZSBzdGFydCBhbmQgZW5kXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fcmFuZ2Uuc3RhcnQuY2xvbmUoKTtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBCdWlsZCBhbmQgcmV0dXJuIHRoZSByYW5nZSBvYmplY3RcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogc3RhcnQuY2xvbmUoKS5mb3JtYXQodGhpcy5kYXRlRm9ybWF0KSxcclxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogdGhpcy50aW1lUmFuZ2UgPyBzdGFydC5jbG9uZSgpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IGVuZC5jbG9uZSgpLmZvcm1hdCh0aGlzLmRhdGVGb3JtYXQpLFxyXG4gICAgICAgICAgICAgICAgZW5kVGltZTogdGhpcy50aW1lUmFuZ2UgPyBlbmQuY2xvbmUoKS5mb3JtYXQodGhpcy50aW1lRm9ybWF0KSA6IG51bGxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB2b2lkIDA7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCByYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCBhbmQgaGFzICdzdGFydCcgYW5kICdlbmQnIHZhbHVlc1xyXG4gICAgICAgIGlmICghdmFsdWUuc3RhcnQgfHwgIXZhbHVlLmVuZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSYW5nZSBpbnB1dCBtdXN0IGhhdmUgXCJzdGFydFwiIGFuZCBcImVuZFwiIHByb3BlcnRpZXMhJyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgc2V0dGluZyBhbiBpbmRpdmlkdWFsIGRhdGUgb3IgYm90aCBvZiB0aGVtXHJcbiAgICAgICAgY29uc3Qgd2hpY2hEYXRlID0gdmFsdWUud2hpY2hEYXRlIHx8IG51bGw7XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlcyBhcyBtb21lbnRcclxuICAgICAgICBjb25zdCBzdGFydCA9IGRheWpzKHZhbHVlLnN0YXJ0KTtcclxuICAgICAgICBjb25zdCBlbmQgPSBkYXlqcyh2YWx1ZS5lbmQpO1xyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgb25seSBzZXR0aW5nIHRoZSBzdGFydCBkYXRlLi4uXHJcbiAgICAgICAgaWYgKHdoaWNoRGF0ZSA9PT0gJ3N0YXJ0Jykge1xyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICAgICAgdGhpcy5fcmFuZ2Uuc3RhcnQgPSBzdGFydC5jbG9uZSgpO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIHN0YXJ0IGRhdGUgaXMgYWZ0ZXIgdGhlIGVuZCBkYXRlLi4uXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5lbmQgJiYgdGhpcy5fcmFuZ2Uuc3RhcnQuaXNBZnRlcih0aGlzLl9yYW5nZS5lbmQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBkYXRlIHRvIHRoZSBzdGFydCBkYXRlIGJ1dCBrZWVwIHRoZSBlbmQgZGF0ZSdzIHRpbWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBzdGFydC5jbG9uZSgpLmhvdXIodGhpcy5fcmFuZ2UuZW5kLmhvdXIoKSkubWludXRlKHRoaXMuX3JhbmdlLmVuZC5taW51dGUoKSkuc2Vjb25kKHRoaXMuX3JhbmdlLmVuZC5zZWNvbmQoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gVGVzdCB0aGlzIG5ldyBlbmQgZGF0ZSB0byBzZWUgaWYgaXQncyBhaGVhZCBvZiB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JhbmdlLnN0YXJ0LmlzQmVmb3JlKGVuZERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncywgc2V0IHRoZSBuZXcgZW5kIGRhdGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZS5lbmQgPSBlbmREYXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgdGhlIGVuZCBkYXRlIHNhbWUgYXMgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZS5lbmQgPSBzdGFydC5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgb25seSBzZXR0aW5nIHRoZSBlbmQgZGF0ZS4uLlxyXG4gICAgICAgIGlmICh3aGljaERhdGUgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZW5kIGRhdGVcclxuICAgICAgICAgICAgdGhpcy5fcmFuZ2UuZW5kID0gZW5kLmNsb25lKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgZW5kIGRhdGUgaXMgYmVmb3JlIHRoZSBzdGFydCBkYXRlLi4uXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5zdGFydC5pc0FmdGVyKHRoaXMuX3JhbmdlLmVuZCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgZGF0ZSB0byB0aGUgZW5kIGRhdGUgYnV0IGtlZXAgdGhlIHN0YXJ0IGRhdGUncyB0aW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBlbmQuY2xvbmUoKS5ob3VyKHRoaXMuX3JhbmdlLnN0YXJ0LmhvdXIoKSkubWludXRlKHRoaXMuX3JhbmdlLnN0YXJ0Lm1pbnV0ZSgpKS5zZWNvbmQodGhpcy5fcmFuZ2Uuc3RhcnQuc2Vjb25kKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFRlc3QgdGhpcyBuZXcgZW5kIGRhdGUgdG8gc2VlIGlmIGl0J3MgYWhlYWQgb2YgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5lbmQuaXNBZnRlcihzdGFydERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncywgc2V0IHRoZSBuZXcgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhbmdlLnN0YXJ0ID0gc3RhcnREYXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgdGhlIHN0YXJ0IGRhdGUgc2FtZSBhcyB0aGUgZW5kIGRhdGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZS5zdGFydCA9IGVuZC5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgc2V0dGluZyBib3RoIGRhdGVzLi4uXHJcbiAgICAgICAgaWYgKCF3aGljaERhdGUpIHtcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgIHRoaXMuX3JhbmdlLnN0YXJ0ID0gc3RhcnQuY2xvbmUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdGFydCBkYXRlIGlzIGJlZm9yZSB0aGUgZW5kIGRhdGUsIHNldCB0aGUgZW5kIGRhdGUgYXMgbm9ybWFsLlxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgZW5kIGRhdGUsIHNldCB0aGUgZW5kIGRhdGUgc2FtZSBhcyB0aGUgc3RhcnQgZGF0ZS5cclxuICAgICAgICAgICAgdGhpcy5fcmFuZ2UuZW5kID0gc3RhcnQuaXNCZWZvcmUoZW5kKSA/IGVuZC5jbG9uZSgpIDogc3RhcnQuY2xvbmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gUHJlcGFyZSBhbm90aGVyIHJhbmdlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBJU08gZm9ybWF0dGVkIHJhbmdlIGRhdGVzXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuX3JhbmdlLnN0YXJ0LmNsb25lKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkudG9JU09TdHJpbmcoKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gRW1pdCB0aGUgcmFuZ2UgY2hhbmdlZCBldmVudCB3aXRoIHRoZSByYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnJhbmdlQ2hhbmdlZC5lbWl0KHJhbmdlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbW9kZWwgd2l0aCB0aGUgcmFuZ2UgaWYgdGhlIGNoYW5nZSB3YXMgbm90IGEgcHJvZ3JhbW1hdGljIGNoYW5nZVxyXG4gICAgICAgICAgICAvLyBCZWNhdXNlIHByb2dyYW1tYXRpYyBjaGFuZ2VzIHRyaWdnZXIgd3JpdGVWYWx1ZSB3aGljaCB0cmlnZ2VycyBvbkNoYW5nZSBhbmQgb25Ub3VjaGVkXHJcbiAgICAgICAgICAgIC8vIGludGVybmFsbHkgY2F1c2luZyB0aGVtIHRvIHRyaWdnZXIgdHdpY2Ugd2hpY2ggYnJlYWtzIHRoZSBmb3JtJ3MgcHJpc3RpbmUgYW5kIHRvdWNoZWRcclxuICAgICAgICAgICAgLy8gc3RhdHVzZXMuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQocmFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIGFjdGl2ZSBkYXRlc1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGVzID0ge1xyXG4gICAgICAgICAgICAgICAgbW9udGgxOiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLFxyXG4gICAgICAgICAgICAgICAgbW9udGgyOiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmFkZCgxLCAnbW9udGgnKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gU2V0IHRoZSB0aW1lIGZvcm0gY29udHJvbHNcclxuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmZvcm1hdCh0aGlzLl90aW1lRm9ybWF0KS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdGhpcy5lbmRUaW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkuZm9ybWF0KHRoaXMuX3RpbWVGb3JtYXQpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUnVuIG5nQWZ0ZXJDb250ZW50SW5pdCBvbiBtb250aCB2aWV3cyB0byB0cmlnZ2VyXHJcbiAgICAgICAgLy8gcmUtcmVuZGVyIG9uIG1vbnRoIHZpZXdzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZVxyXG4gICAgICAgIGlmICh0aGlzLl9tYXRNb250aFZpZXcxICYmIHRoaXMuX21hdE1vbnRoVmlldzIpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWF0TW9udGhWaWV3MS5uZ0FmdGVyQ29udGVudEluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5fbWF0TW9udGhWaWV3Mi5uZ0FmdGVyQ29udGVudEluaXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHRoZSBwcm9ncmFtbWF0aWMgY2hhbmdlIHN0YXR1c1xyXG4gICAgICAgIHRoaXMuX3Byb2dyYW1tYXRpY0NoYW5nZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEAgQ29udHJvbCBWYWx1ZSBBY2Nlc3NvclxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCBvbiBjaGFuZ2VcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZm5cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCBvbiBibHVyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZuXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlIHRvIHZpZXcgZnJvbSBtb2RlbCB3aGVuIHRoZSBmb3JtIG1vZGVsIGNoYW5nZXMgcHJvZ3JhbW1hdGljYWxseVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByYW5nZVxyXG4gICAgICovXHJcbiAgICB3cml0ZVZhbHVlKHJhbmdlOiB7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH0pOiB2b2lkIHtcclxuICAgICAgICAvLyBTZXQgdGhpcyBjaGFuZ2UgYXMgYSBwcm9ncmFtbWF0aWMgb25lXHJcbiAgICAgICAgdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSByYW5nZVxyXG4gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50XHJcbiAgICAgICAgdGhpcy5faW5pdCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBPbiBkZXN0cm95XHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlQWxsLm5leHQodm9pZCAwKTtcclxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZUFsbC5jb21wbGV0ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUgPSAoKTogdm9pZCA9PiB7IH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEAgUHVibGljIG1ldGhvZHNcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPcGVuIHRoZSBwaWNrZXIgcGFuZWxcclxuICAgICAqL1xyXG4gICAgb3BlblBpY2tlclBhbmVsKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnJlYWRvbmx5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgb3ZlcmxheVxyXG4gICAgICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZSh7XHJcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6ICdjbWF0LWRhdGUtcmFuZ2UtcGFuZWwnLFxyXG4gICAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnJyxcclxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpLFxyXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKClcclxuICAgICAgICAgICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuX3BpY2tlclBhbmVsT3JpZ2luKVxyXG4gICAgICAgICAgICAgICAgLndpdGhQb3NpdGlvbnMoW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IDhcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IC04XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXSlcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgcG9ydGFsIGZyb20gdGhlIHRlbXBsYXRlXHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5fcGlja2VyUGFuZWwsIHRoaXMuX3ZpZXdDb250YWluZXJSZWYpO1xyXG5cclxuICAgICAgICAvLyBPbiBiYWNrZHJvcCBjbGlja1xyXG4gICAgICAgIG92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0ZW1wbGF0ZSBwb3J0YWwgZXhpc3RzIGFuZCBhdHRhY2hlZC4uLlxyXG4gICAgICAgICAgICBpZiAodGVtcGxhdGVQb3J0YWwgJiYgdGVtcGxhdGVQb3J0YWwuaXNBdHRhY2hlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gRGV0YWNoIGl0XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBvcnRhbC5kZXRhY2goKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgb3ZlcmxheSBleGlzdHMgYW5kIGF0dGFjaGVkLi4uXHJcbiAgICAgICAgICAgIGlmIChvdmVybGF5UmVmICYmIG92ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gRGV0YWNoIGl0XHJcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZi5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQXR0YWNoIHRoZSBwb3J0YWwgdG8gdGhlIG92ZXJsYXlcclxuICAgICAgICBvdmVybGF5UmVmLmF0dGFjaCh0ZW1wbGF0ZVBvcnRhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgbW9udGggbGFiZWxcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbW9udGhcclxuICAgICAqL1xyXG4gICAgZ2V0TW9udGhMYWJlbChtb250aDogbnVtYmVyKTogc3RyaW5nIHwgdm9pZCB7XHJcbiAgICAgICAgaWYgKG1vbnRoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMT8uY2xvbmUoKS5mb3JtYXQoJ1lZWVkgTU1NTScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlRGF0ZXMubW9udGgyPy5jbG9uZSgpLmZvcm1hdCgnWVlZWSBNTU1NJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRlIGNsYXNzIGZ1bmN0aW9uIHRvIGFkZC9yZW1vdmUgY2xhc3MgbmFtZXMgdG8gY2FsZW5kYXIgZGF5c1xyXG4gICAgICovXHJcbiAgICBkYXRlQ2xhc3MoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gKGRhdGU6IERheWpzKTogTWF0Q2FsZW5kYXJDZWxsQ3NzQ2xhc3NlcyB8IHZvaWQgPT4ge1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGUgaXMgYm90aCBzdGFydCBhbmQgZW5kIGRhdGUuLi5cclxuICAgICAgICAgICAgaWYgKGRhdGUuaXNTYW1lKHRoaXMuX3JhbmdlLnN0YXJ0LCAnZGF5JykgJiYgZGF0ZS5pc1NhbWUodGhpcy5fcmFuZ2UuZW5kLCAnZGF5JykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbJ2NtYXQtZGF0ZS1yYW5nZScsICdjbWF0LWRhdGUtcmFuZ2Utc3RhcnQnLCAnY21hdC1kYXRlLXJhbmdlLWVuZCddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgZGF0ZSBpcyB0aGUgc3RhcnQgZGF0ZS4uLlxyXG4gICAgICAgICAgICBpZiAoZGF0ZS5pc1NhbWUodGhpcy5fcmFuZ2Uuc3RhcnQsICdkYXknKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnY21hdC1kYXRlLXJhbmdlJywgJ2NtYXQtZGF0ZS1yYW5nZS1zdGFydCddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgZGF0ZSBpcyB0aGUgZW5kIGRhdGUuLi5cclxuICAgICAgICAgICAgaWYgKGRhdGUuaXNTYW1lKHRoaXMuX3JhbmdlLmVuZCwgJ2RheScpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWydjbWF0LWRhdGUtcmFuZ2UnLCAnY21hdC1kYXRlLXJhbmdlLWVuZCddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgZGF0ZSBpcyBpbiBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgZGF0ZXMuLi5cclxuICAgICAgICAgICAgaWYgKGRhdGUuaXNCZXR3ZWVuKHRoaXMuX3JhbmdlLnN0YXJ0LCB0aGlzLl9yYW5nZS5lbmQsICdkYXknKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnY21hdC1kYXRlLXJhbmdlJywgJ2NtYXQtZGF0ZS1yYW5nZS1taWQnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0ZSBmaWx0ZXIgdG8gZW5hYmxlL2Rpc2FibGUgY2FsZW5kYXIgZGF5c1xyXG4gICAgICovXHJcbiAgICBkYXRlRmlsdGVyKCk6IGFueSB7XHJcbiAgICAgICAgLy8gSWYgd2UgYXJlIHNlbGVjdGluZyB0aGUgZW5kIGRhdGUsIGRpc2FibGUgYWxsIHRoZSBkYXRlcyB0aGF0IGNvbWVzIGJlZm9yZSB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgIHJldHVybiAoZGF0ZTogRGF5anMpOiBib29sZWFuID0+ICEodGhpcy5zZXRXaGljaERhdGUgPT09ICdlbmQnICYmIGRhdGUuaXNCZWZvcmUodGhpcy5fcmFuZ2Uuc3RhcnQsICdkYXknKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPbiBzZWxlY3RlZCBkYXRlIGNoYW5nZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBkYXRlXHJcbiAgICAgKi9cclxuICAgIG9uU2VsZWN0ZWREYXRlQ2hhbmdlKGRhdGU6IERheWpzKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JhbmdlLnN0YXJ0ICYmIHRoaXMuX3JhbmdlLmVuZCkge1xyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcmFuZ2Ugb2JqZWN0XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1JhbmdlID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuX3JhbmdlLnN0YXJ0LmNsb25lKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIHdoaWNoRGF0ZTogJydcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlcGxhY2UgZWl0aGVyIHRoZSBzdGFydCBvciB0aGUgZW5kIGRhdGUgd2l0aCB0aGUgbmV3IG9uZVxyXG4gICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gd2hpY2ggZGF0ZSB3ZSBhcmUgc2V0dGluZ1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXRXaGljaERhdGUgPT09ICdzdGFydCcpIHtcclxuICAgICAgICAgICAgICAgIG5ld1JhbmdlLnN0YXJ0ID0gZGF5anMobmV3UmFuZ2Uuc3RhcnQpLnllYXIoZGF0ZS55ZWFyKCkpLm1vbnRoKGRhdGUubW9udGgoKSkuZGF0ZShkYXRlLmRhdGUoKSkudG9JU09TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5ld1JhbmdlLmVuZCA9IGRheWpzKG5ld1JhbmdlLmVuZCkueWVhcihkYXRlLnllYXIoKSkubW9udGgoZGF0ZS5tb250aCgpKS5kYXRlKGRhdGUuZGF0ZSgpKS50b0lTT1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlIHdoaWNoIGRhdGUgdG8gdGhlIG5ldyByYW5nZSBvYmplY3RcclxuICAgICAgICAgICAgbmV3UmFuZ2Uud2hpY2hEYXRlID0gdGhpcy5zZXRXaGljaERhdGU7XHJcblxyXG4gICAgICAgICAgICAvLyBTd2l0Y2ggd2hpY2ggZGF0ZSB0byBzZXQgb24gdGhlIG5leHQgcnVuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0V2hpY2hEYXRlID0gdGhpcy5zZXRXaGljaERhdGUgPT09ICdzdGFydCcgPyAnZW5kJyA6ICdzdGFydCc7XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHJhbmdlXHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2UgPSBuZXdSYW5nZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdvIHRvIHByZXZpb3VzIG1vbnRoIG9uIGJvdGggdmlld3NcclxuICAgICAqL1xyXG4gICAgcHJldigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMSA9IGRheWpzKHRoaXMuYWN0aXZlRGF0ZXMubW9udGgxKS5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMiA9IGRheWpzKHRoaXMuYWN0aXZlRGF0ZXMubW9udGgyKS5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdvIHRvIG5leHQgbW9udGggb24gYm90aCB2aWV3c1xyXG4gICAgICovXHJcbiAgICBuZXh0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZXMubW9udGgxID0gZGF5anModGhpcy5hY3RpdmVEYXRlcy5tb250aDEpLmFkZCgxLCAnbW9udGgnKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMiA9IGRheWpzKHRoaXMuYWN0aXZlRGF0ZXMubW9udGgyKS5hZGQoMSwgJ21vbnRoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIHN0YXJ0IHRpbWVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRcclxuICAgICAqL1xyXG4gICAgdXBkYXRlU3RhcnRUaW1lKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICAvLyBQYXJzZSB0aGUgdGltZVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpbWUgPSB0aGlzLl9wYXJzZVRpbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuXHJcbiAgICAgICAgLy8gR28gYmFjayB0byB0aGUgcHJldmlvdXMgdmFsdWUgaWYgdGhlIGZvcm0gY29udHJvbCBpcyBub3QgdmFsaWRcclxuICAgICAgICBpZiAodGhpcy5zdGFydFRpbWVGb3JtQ29udHJvbC5pbnZhbGlkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCkge1xyXG4gICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIHRpbWUgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmZvcm1hdCh0aGlzLl90aW1lRm9ybWF0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHRpbWVcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUodGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgcmFuZ2VcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3JhbmdlLnN0YXJ0ICYmIHRoaXMuX3JhbmdlLmVuZCkge1xyXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG5ldyB0aW1lIHRvIHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuX3JhbmdlLnN0YXJ0LmNsb25lKCkuaG91cihwYXJzZWRUaW1lLmhvdXIoKSkubWludXRlKHBhcnNlZFRpbWUubWludXRlKCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBzdGFydCBkYXRlIGlzIGFmdGVyIHRoZSBjdXJyZW50IGVuZCBkYXRlLFxyXG4gICAgICAgICAgICAvLyB1c2UgdGhlIGVuZCBkYXRlJ3MgdGltZSBhbmQgc2V0IHRoZSBzdGFydCBkYXRlIGFnYWluXHJcbiAgICAgICAgICAgIGlmIChzdGFydERhdGUuaXNBZnRlcih0aGlzLl9yYW5nZS5lbmQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmREYXRlSG91cnMgPSB0aGlzLl9yYW5nZS5lbmQuaG91cigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kRGF0ZU1pbnV0ZXMgPSB0aGlzLl9yYW5nZS5lbmQubWludXRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGUuaG91cihlbmREYXRlSG91cnMpLm1pbnV0ZShlbmREYXRlTWludXRlcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIElmIGV2ZXJ5dGhpbmcgaXMgb2theSwgc2V0IHRoZSBuZXcgZGF0ZVxyXG4gICAgICAgICAgICB0aGlzLnJhbmdlID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0RGF0ZS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgZW5kOiB0aGlzLl9yYW5nZS5lbmQuY2xvbmUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgd2hpY2hEYXRlOiAnc3RhcnQnXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIGVuZCB0aW1lXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUVuZFRpbWUoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIC8vIFBhcnNlIHRoZSB0aW1lXHJcbiAgICAgICAgY29uc3QgcGFyc2VkVGltZSA9IHRoaXMuX3BhcnNlVGltZShldmVudC50YXJnZXQudmFsdWUpO1xyXG5cclxuICAgICAgICAvLyBHbyBiYWNrIHRvIHRoZSBwcmV2aW91cyB2YWx1ZSBpZiB0aGUgZm9ybSBjb250cm9sIGlzIG5vdCB2YWxpZFxyXG4gICAgICAgIGlmICh0aGlzLmVuZFRpbWVGb3JtQ29udHJvbC5pbnZhbGlkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIHRoZSB0aW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lID0gdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkuZm9ybWF0KHRoaXMuX3RpbWVGb3JtYXQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgdGltZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbmRUaW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUodGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgcmFuZ2VcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3JhbmdlLnN0YXJ0ICYmIHRoaXMuX3JhbmdlLmVuZCkge1xyXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG5ldyB0aW1lIHRvIHRoZSBlbmQgZGF0ZVxyXG4gICAgICAgICAgICBjb25zdCBlbmREYXRlID0gdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkuaG91cihwYXJzZWRUaW1lLmhvdXIoKSkubWludXRlKHBhcnNlZFRpbWUubWludXRlKCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBlbmQgZGF0ZSBpcyBiZWZvcmUgdGhlIGN1cnJlbnQgc3RhcnQgZGF0ZSxcclxuICAgICAgICAgICAgLy8gdXNlIHRoZSBzdGFydCBkYXRlJ3MgdGltZSBhbmQgc2V0IHRoZSBlbmQgZGF0ZSBhZ2FpblxyXG4gICAgICAgICAgICBpZiAoZW5kRGF0ZS5pc0JlZm9yZSh0aGlzLl9yYW5nZS5zdGFydCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZUhvdXJzID0gdGhpcy5fcmFuZ2Uuc3RhcnQuaG91cigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlTWludXRlcyA9IHRoaXMuX3JhbmdlLnN0YXJ0Lm1pbnV0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZW5kIGRhdGVcclxuICAgICAgICAgICAgICAgIGVuZERhdGUuaG91cihzdGFydERhdGVIb3VycykubWludXRlKHN0YXJ0RGF0ZU1pbnV0ZXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiBldmVyeXRoaW5nIGlzIG9rYXksIHNldCB0aGUgbmV3IGRhdGVcclxuICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICBlbmQ6IGVuZERhdGUudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIHdoaWNoRGF0ZTogJ2VuZCdcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gQCBQcml2YXRlIG1ldGhvZHNcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICAvLyBTdGFydCBhbmQgZW5kIHRpbWUgZm9ybSBjb250cm9sc1xyXG4gICAgICAgIHRoaXMuc3RhcnRUaW1lRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnBhdHRlcm4odGhpcy5fdGltZVJlZ0V4cCldKTtcclxuICAgICAgICB0aGlzLmVuZFRpbWVGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucGF0dGVybih0aGlzLl90aW1lUmVnRXhwKV0pO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcmFuZ2VcclxuICAgICAgICB0aGlzLl9wcm9ncmFtbWF0aWNDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmFuZ2UgPSB7XHJcbiAgICAgICAgICAgIHN0YXJ0OiBkYXlqcygpLnN0YXJ0T2YoJ2RheScpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAgIGVuZDogZGF5anMoKS5hZGQoMSwgJ2RheScpLmVuZE9mKCdkYXknKS50b0lTT1N0cmluZygpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHRpbWUgcmFuZ2VcclxuICAgICAgICB0aGlzLl9wcm9ncmFtbWF0aWNDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudGltZVJhbmdlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZSB0aGUgdGltZSBmcm9tIHRoZSBpbnB1dHNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdmFsdWVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3BhcnNlVGltZSh2YWx1ZTogc3RyaW5nKTogRGF5anMge1xyXG4gICAgICAgIC8vIFBhcnNlIHRoZSB0aW1lIHVzaW5nIHRoZSB0aW1lIHJlZ2V4cFxyXG4gICAgICAgIGNvbnN0IHRpbWVBcnIgPSB2YWx1ZS5zcGxpdCh0aGlzLl90aW1lUmVnRXhwKS5maWx0ZXIocGFydCA9PiBwYXJ0ICE9PSAnJyk7XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgbWVyaWRpZW1cclxuICAgICAgICBjb25zdCBtZXJpZGllbSA9IHRpbWVBcnJbMl0gfHwgbnVsbDtcclxuXHJcbiAgICAgICAgLy8gSWYgbWVyaWRpZW0gZXhpc3RzLi4uXHJcbiAgICAgICAgaWYgKG1lcmlkaWVtKSB7XHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG1vbWVudCB1c2luZyAxMi1ob3VycyBmb3JtYXQgYW5kIHJldHVybiBpdFxyXG4gICAgICAgICAgICByZXR1cm4gZGF5anModmFsdWUsICdoaDptbUEnKS5zZWNvbmQoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiBtZXJpZGllbSBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgYSBtb21lbnQgdXNpbmcgMjQtaG91cnMgZm9ybWF0IGFuZCByZXR1cm4gaW5cclxuICAgICAgICByZXR1cm4gZGF5anModmFsdWUsICdISDptbScpLnNlY29uZCgwKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IHJvbGU9XCJwcmVzZW50YXRpb25cIiBjbGFzcz1cInJhbmdlXCIgKGNsaWNrKT1cIm9wZW5QaWNrZXJQYW5lbCgpXCIgI3BpY2tlclBhbmVsT3JpZ2luPlxuXG4gIDxkaXYgY2xhc3M9XCJzdGFydFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkYXRlXCI+e3tyYW5nZS5zdGFydERhdGV9fTwvZGl2PlxuICAgIEBpZiAocmFuZ2Uuc3RhcnRUaW1lKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZVwiPnt7cmFuZ2Uuc3RhcnRUaW1lfX08L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJzZXBhcmF0b3JcIj4tPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImVuZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkYXRlXCI+e3tyYW5nZS5lbmREYXRlfX08L2Rpdj5cbiAgICBAaWYgKHJhbmdlLmVuZFRpbWUpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lXCI+e3tyYW5nZS5lbmRUaW1lfX08L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNwaWNrZXJQYW5lbD5cblxuICA8IS0tIFN0YXJ0IC0tPlxuICA8ZGl2IGNsYXNzPVwic3RhcnRcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJtb250aFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLWhlYWRlclwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXZpb3VzLWJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicHJldigpXCIgdGFiaW5kZXg9XCIxXCI+XG4gICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cIidoZXJvaWNvbnNfb3V0bGluZTpjaGV2cm9uLWxlZnQnXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1sYWJlbFwiPnt7Z2V0TW9udGhMYWJlbCgxKX19PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxtYXQtbW9udGgtdmlldyBbKGFjdGl2ZURhdGUpXT1cImFjdGl2ZURhdGVzLm1vbnRoMVwiIFtkYXRlRmlsdGVyXT1cImRhdGVGaWx0ZXIoKVwiIFtkYXRlQ2xhc3NdPVwiZGF0ZUNsYXNzKClcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXCIgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU2VsZWN0ZWREYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAjbWF0TW9udGhWaWV3MT5cbiAgICAgIDwvbWF0LW1vbnRoLXZpZXc+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKHRpbWVSYW5nZSkge1xuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidGltZSBzdGFydC10aW1lXCI+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbYXV0b2NvbXBsZXRlXT1cIidvZmYnXCIgW2Zvcm1Db250cm9sXT1cInN0YXJ0VGltZUZvcm1Db250cm9sXCIgKGJsdXIpPVwidXBkYXRlU3RhcnRUaW1lKCRldmVudClcIlxuICAgICAgICAgIHRhYmluZGV4PVwiM1wiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+5byA5aeL5pe26Ze0PC9tYXQtbGFiZWw+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICB9XG5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRW5kIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJlbmRcIj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtbGFiZWxcIj57e2dldE1vbnRoTGFiZWwoMil9fTwvZGl2PlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmV4dC1idXR0b25cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cIm5leHQoKVwiIHRhYmluZGV4PVwiMlwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cIidoZXJvaWNvbnNfb3V0bGluZTpjaGV2cm9uLXJpZ2h0J1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LW1vbnRoLXZpZXcgWyhhY3RpdmVEYXRlKV09XCJhY3RpdmVEYXRlcy5tb250aDJcIiBbZGF0ZUZpbHRlcl09XCJkYXRlRmlsdGVyKClcIiBbZGF0ZUNsYXNzXT1cImRhdGVDbGFzcygpXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXCIgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU2VsZWN0ZWREYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICNtYXRNb250aFZpZXcyPlxuICAgICAgICA8L21hdC1tb250aC12aWV3PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAodGltZVJhbmdlKSB7XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInRpbWUgZW5kLXRpbWVcIj5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImVuZFRpbWVGb3JtQ29udHJvbFwiIChibHVyKT1cInVwZGF0ZUVuZFRpbWUoJGV2ZW50KVwiIHRhYmluZGV4PVwiNFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+57uT5p2f5pe26Ze0PC9tYXQtbGFiZWw+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICB9XG5cbiAgICA8L2Rpdj5cblxuICA8L25nLXRlbXBsYXRlPiJdfQ==
|
|
558
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbWF0L2NvbXBvbmVudHMvZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NtYXQvY29tcG9uZW50cy9kYXRlLXJhbmdlL2RhdGUtcmFuZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFlLFNBQVMsRUFBb0IsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM04sT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQTJDLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQWdCLE1BQU0sT0FBTyxDQUFDO0FBQ3JDLE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7OztBQXNCL0IsTUFBTSxPQUFPLHNCQUFzQjtJQTRCL0IsWUFDWSxRQUFpQixFQUNqQixpQkFBbUMs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b250ZW50IjpbImltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0b3JzLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Q2FsZW5kYXJDZWxsQ3NzQ2xhc3NlcywgTWF0TW9udGhWaWV3LCBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgZGF5anMsIHsgRGF5anMgfSBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCBpc0JldHdlZW4gZnJvbSAnZGF5anMvcGx1Z2luL2lzQmV0d2Vlbic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY21hdC1kYXRlLXJhbmdlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXJhbmdlLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2RhdGUtcmFuZ2UuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIGV4cG9ydEFzOiAnY21hdERhdGVSYW5nZScsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDbWF0RGF0ZVJhbmdlQ29tcG9uZW50KSxcclxuICAgICAgICAgICAgbXVsdGk6IHRydWVcclxuICAgICAgICB9XHJcbiAgICBdLFxyXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICAgIGltcG9ydHM6IFtGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSxNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIFxyXG4gICAgICAgIE1hdERhdGVwaWNrZXJNb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgXHJcbiAgICAgICAgTWF0SW5wdXRNb2R1bGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDbWF0RGF0ZVJhbmdlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHJhbmdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfT4oKTtcclxuICAgIEBWaWV3Q2hpbGQoJ21hdE1vbnRoVmlldzEnKSBwcml2YXRlIF9tYXRNb250aFZpZXcxOiBNYXRNb250aFZpZXc8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ21hdE1vbnRoVmlldzInKSBwcml2YXRlIF9tYXRNb250aFZpZXcyOiBNYXRNb250aFZpZXc8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3BpY2tlclBhbmVsT3JpZ2luJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgX3BpY2tlclBhbmVsT3JpZ2luOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgncGlja2VyUGFuZWwnKSBwcml2YXRlIF9waWNrZXJQYW5lbDogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICBhY3RpdmVEYXRlczogeyBtb250aDE6IERheWpzIHwgbnVsbDsgbW9udGgyOiBEYXlqcyB8IG51bGwgfSA9IHtcclxuICAgICAgICBtb250aDE6IG51bGwsXHJcbiAgICAgICAgbW9udGgyOiBudWxsXHJcbiAgICB9O1xyXG4gICAgc2V0V2hpY2hEYXRlOiAnc3RhcnQnIHwgJ2VuZCcgPSAnc3RhcnQnO1xyXG4gICAgc3RhcnRUaW1lRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG4gICAgZW5kVGltZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcclxuICAgIHByaXZhdGUgX2RhdGVGb3JtYXQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XHJcbiAgICBwcml2YXRlIF9wcm9ncmFtbWF0aWNDaGFuZ2UhOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfcmFuZ2U6IHsgc3RhcnQ6IERheWpzIHwgbnVsbDsgZW5kOiBEYXlqcyB8IG51bGwgfSA9IHtcclxuICAgICAgICBzdGFydDogbnVsbCxcclxuICAgICAgICBlbmQ6IG51bGxcclxuICAgIH07XHJcbiAgICBwcml2YXRlIF90aW1lRm9ybWF0OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF90aW1lUmFuZ2U6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9yZWFkb25seTogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RpbWVSZWdFeHA6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoJ14oMFswLTldfDFbMC05XXwyWzAtNF18WzAtOV0pOihbMC01XVswLTldKShBfCg/OkFNKXxQfCg/OlBNKSk/JCcsICdpJyk7XHJcbiAgICBwcml2YXRlIF91bnN1YnNjcmliZUFsbDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXHJcbiAgICAgICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICAgICkge1xyXG4gICAgICAgIGRheWpzLmV4dGVuZChpc0JldHdlZW4pO1xyXG5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSAoKTogdm9pZCA9PiB7IH07XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxyXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHsgfTtcclxuICAgICAgICB0aGlzLmRhdGVGb3JtYXQgPSAnWVlZWS9NTS9ERCc7XHJcbiAgICAgICAgdGhpcy50aW1lRm9ybWF0ID0gJzEyJzsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCByZWFkb25seSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIGdldCBkYXRlRm9ybWF0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVGb3JtYXQ7XHJcbiAgICB9XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGRhdGVGb3JtYXQodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIC8vIFJldHVybiBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZVxyXG4gICAgICAgIGlmICh0aGlzLl9kYXRlRm9ybWF0ID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTdG9yZSB0aGUgdmFsdWVcclxuICAgICAgICB0aGlzLl9kYXRlRm9ybWF0ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXR0ZXIgJiBnZXR0ZXIgZm9yIHRpbWVGb3JtYXQgaW5wdXQgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBnZXQgdGltZUZvcm1hdCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lRm9ybWF0O1xyXG4gICAgfVxyXG4gICAgQElucHV0KClcclxuICAgIHNldCB0aW1lRm9ybWF0KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWVcclxuICAgICAgICBpZiAodGhpcy5fdGltZUZvcm1hdCA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IGZvcm1hdCBiYXNlZCBvbiB0aGUgdGltZSBmb3JtYXQgaW5wdXRcclxuICAgICAgICB0aGlzLl90aW1lRm9ybWF0ID0gdmFsdWUgPT09ICcxMicgPyAnaGg6bW1BJyA6ICdISDptbSc7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHRlciAmIGdldHRlciBmb3IgdGltZVJhbmdlIGlucHV0ICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xyXG4gICAgZ2V0IHRpbWVSYW5nZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGltZVJhbmdlO1xyXG4gICAgfVxyXG4gICAgQElucHV0KClcclxuICAgIHNldCB0aW1lUmFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvLyBSZXR1cm4gaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWVcclxuICAgICAgICBpZiAodGhpcy5fdGltZVJhbmdlID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTdG9yZSB0aGUgdmFsdWVcclxuICAgICAgICB0aGlzLl90aW1lUmFuZ2UgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHRpbWUgcmFuZ2UgdHVybmVkIG9mZi4uLlxyXG4gICAgICAgIGlmICghdmFsdWUgJiYgdGhpcy5fcmFuZ2Uuc3RhcnQgJiYgdGhpcy5fcmFuZ2UuZW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fcmFuZ2Uuc3RhcnQuY2xvbmUoKS5zdGFydE9mKCdkYXknKSxcclxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkuZW5kT2YoJ2RheScpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0dGVyICYgZ2V0dGVyIGZvciByYW5nZSBpbnB1dCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcclxuICAgIGdldCByYW5nZSgpOiBhbnkge1xyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIHJhbmdlIHN0YXJ0IGFuZCBlbmRcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLl9yYW5nZS5lbmQuY2xvbmUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEJ1aWxkIGFuZCByZXR1cm4gdGhlIHJhbmdlIG9iamVjdFxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlOiBzdGFydC5jbG9uZSgpLmZvcm1hdCh0aGlzLmRhdGVGb3JtYXQpLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lOiB0aGlzLnRpbWVSYW5nZSA/IHN0YXJ0LmNsb25lKCkuZm9ybWF0KHRoaXMudGltZUZvcm1hdCkgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZTogZW5kLmNsb25lKCkuZm9ybWF0KHRoaXMuZGF0ZUZvcm1hdCksXHJcbiAgICAgICAgICAgICAgICBlbmRUaW1lOiB0aGlzLnRpbWVSYW5nZSA/IGVuZC5jbG9uZSgpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpIDogbnVsbFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHJhbmdlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0IGFuZCBoYXMgJ3N0YXJ0JyBhbmQgJ2VuZCcgdmFsdWVzXHJcbiAgICAgICAgaWYgKCF2YWx1ZS5zdGFydCB8fCAhdmFsdWUuZW5kKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JhbmdlIGlucHV0IG11c3QgaGF2ZSBcInN0YXJ0XCIgYW5kIFwiZW5kXCIgcHJvcGVydGllcyEnKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBzZXR0aW5nIGFuIGluZGl2aWR1YWwgZGF0ZSBvciBib3RoIG9mIHRoZW1cclxuICAgICAgICBjb25zdCB3aGljaERhdGUgPSB2YWx1ZS53aGljaERhdGUgfHwgbnVsbDtcclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSBzdGFydCBhbmQgZW5kIGRhdGVzIGFzIG1vbWVudFxyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gZGF5anModmFsdWUuc3RhcnQpO1xyXG4gICAgICAgIGNvbnN0IGVuZCA9IGRheWpzKHZhbHVlLmVuZCk7XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGFyZSBvbmx5IHNldHRpbmcgdGhlIHN0YXJ0IGRhdGUuLi5cclxuICAgICAgICBpZiAod2hpY2hEYXRlID09PSAnc3RhcnQnKSB7XHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICB0aGlzLl9yYW5nZS5zdGFydCA9IHN0YXJ0LmNsb25lKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgZW5kIGRhdGUuLi5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JhbmdlLmVuZCAmJiB0aGlzLl9yYW5nZS5zdGFydC5pc0FmdGVyKHRoaXMuX3JhbmdlLmVuZCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZW5kIGRhdGUgdG8gdGhlIHN0YXJ0IGRhdGUgYnV0IGtlZXAgdGhlIGVuZCBkYXRlJ3MgdGltZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IHN0YXJ0LmNsb25lKCkuaG91cih0aGlzLl9yYW5nZS5lbmQuaG91cigpKS5taW51dGUodGhpcy5fcmFuZ2UuZW5kLm1pbnV0ZSgpKS5zZWNvbmQodGhpcy5fcmFuZ2UuZW5kLnNlY29uZCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBUZXN0IHRoaXMgbmV3IGVuZCBkYXRlIHRvIHNlZSBpZiBpdCdzIGFoZWFkIG9mIHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmFuZ2Uuc3RhcnQuaXNCZWZvcmUoZW5kRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzLCBzZXQgdGhlIG5ldyBlbmQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhbmdlLmVuZCA9IGVuZERhdGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNldCB0aGUgZW5kIGRhdGUgc2FtZSBhcyB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhbmdlLmVuZCA9IHN0YXJ0LmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGFyZSBvbmx5IHNldHRpbmcgdGhlIGVuZCBkYXRlLi4uXHJcbiAgICAgICAgaWYgKHdoaWNoRGF0ZSA9PT0gJ2VuZCcpIHtcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSBlbmQgZGF0ZVxyXG4gICAgICAgICAgICB0aGlzLl9yYW5nZS5lbmQgPSBlbmQuY2xvbmUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3RlZCBlbmQgZGF0ZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IGRhdGUuLi5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JhbmdlLnN0YXJ0Py5pc0FmdGVyKHRoaXMuX3JhbmdlLmVuZCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgZGF0ZSB0byB0aGUgZW5kIGRhdGUgYnV0IGtlZXAgdGhlIHN0YXJ0IGRhdGUncyB0aW1lXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBlbmQuY2xvbmUoKS5ob3VyKHRoaXMuX3JhbmdlLnN0YXJ0LmhvdXIoKSkubWludXRlKHRoaXMuX3JhbmdlLnN0YXJ0Lm1pbnV0ZSgpKS5zZWNvbmQodGhpcy5fcmFuZ2Uuc3RhcnQuc2Vjb25kKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFRlc3QgdGhpcyBuZXcgZW5kIGRhdGUgdG8gc2VlIGlmIGl0J3MgYWhlYWQgb2YgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS5lbmQuaXNBZnRlcihzdGFydERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncywgc2V0IHRoZSBuZXcgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JhbmdlLnN0YXJ0ID0gc3RhcnREYXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgdGhlIHN0YXJ0IGRhdGUgc2FtZSBhcyB0aGUgZW5kIGRhdGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZS5zdGFydCA9IGVuZC5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgc2V0dGluZyBib3RoIGRhdGVzLi4uXHJcbiAgICAgICAgaWYgKCF3aGljaERhdGUpIHtcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgIHRoaXMuX3JhbmdlLnN0YXJ0ID0gc3RhcnQuY2xvbmUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdGFydCBkYXRlIGlzIGJlZm9yZSB0aGUgZW5kIGRhdGUsIHNldCB0aGUgZW5kIGRhdGUgYXMgbm9ybWFsLlxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgZW5kIGRhdGUsIHNldCB0aGUgZW5kIGRhdGUgc2FtZSBhcyB0aGUgc3RhcnQgZGF0ZS5cclxuICAgICAgICAgICAgdGhpcy5fcmFuZ2UuZW5kID0gc3RhcnQuaXNCZWZvcmUoZW5kKSA/IGVuZC5jbG9uZSgpIDogc3RhcnQuY2xvbmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gUHJlcGFyZSBhbm90aGVyIHJhbmdlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBJU08gZm9ybWF0dGVkIHJhbmdlIGRhdGVzXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuX3JhbmdlLnN0YXJ0LmNsb25lKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkudG9JU09TdHJpbmcoKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gRW1pdCB0aGUgcmFuZ2UgY2hhbmdlZCBldmVudCB3aXRoIHRoZSByYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnJhbmdlQ2hhbmdlZC5lbWl0KHJhbmdlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbW9kZWwgd2l0aCB0aGUgcmFuZ2UgaWYgdGhlIGNoYW5nZSB3YXMgbm90IGEgcHJvZ3JhbW1hdGljIGNoYW5nZVxyXG4gICAgICAgICAgICAvLyBCZWNhdXNlIHByb2dyYW1tYXRpYyBjaGFuZ2VzIHRyaWdnZXIgd3JpdGVWYWx1ZSB3aGljaCB0cmlnZ2VycyBvbkNoYW5nZSBhbmQgb25Ub3VjaGVkXHJcbiAgICAgICAgICAgIC8vIGludGVybmFsbHkgY2F1c2luZyB0aGVtIHRvIHRyaWdnZXIgdHdpY2Ugd2hpY2ggYnJlYWtzIHRoZSBmb3JtJ3MgcHJpc3RpbmUgYW5kIHRvdWNoZWRcclxuICAgICAgICAgICAgLy8gc3RhdHVzZXMuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQocmFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIGFjdGl2ZSBkYXRlc1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURhdGVzID0ge1xyXG4gICAgICAgICAgICAgICAgbW9udGgxOiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLFxyXG4gICAgICAgICAgICAgICAgbW9udGgyOiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmFkZCgxLCAnbW9udGgnKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gU2V0IHRoZSB0aW1lIGZvcm0gY29udHJvbHNcclxuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmZvcm1hdCh0aGlzLl90aW1lRm9ybWF0KS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdGhpcy5lbmRUaW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkuZm9ybWF0KHRoaXMuX3RpbWVGb3JtYXQpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUnVuIG5nQWZ0ZXJDb250ZW50SW5pdCBvbiBtb250aCB2aWV3cyB0byB0cmlnZ2VyXHJcbiAgICAgICAgLy8gcmUtcmVuZGVyIG9uIG1vbnRoIHZpZXdzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZVxyXG4gICAgICAgIGlmICh0aGlzLl9tYXRNb250aFZpZXcxICYmIHRoaXMuX21hdE1vbnRoVmlldzIpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWF0TW9udGhWaWV3MS5uZ0FmdGVyQ29udGVudEluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5fbWF0TW9udGhWaWV3Mi5uZ0FmdGVyQ29udGVudEluaXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJlc2V0IHRoZSBwcm9ncmFtbWF0aWMgY2hhbmdlIHN0YXR1c1xyXG4gICAgICAgIHRoaXMuX3Byb2dyYW1tYXRpY0NoYW5nZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEAgQ29udHJvbCBWYWx1ZSBBY2Nlc3NvclxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCBvbiBjaGFuZ2VcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZm5cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgZm9ybSBtb2RlbCBvbiBibHVyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZuXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlIHRvIHZpZXcgZnJvbSBtb2RlbCB3aGVuIHRoZSBmb3JtIG1vZGVsIGNoYW5nZXMgcHJvZ3JhbW1hdGljYWxseVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByYW5nZVxyXG4gICAgICovXHJcbiAgICB3cml0ZVZhbHVlKHJhbmdlOiB7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH0pOiB2b2lkIHtcclxuICAgICAgICAvLyBTZXQgdGhpcyBjaGFuZ2UgYXMgYSBwcm9ncmFtbWF0aWMgb25lXHJcbiAgICAgICAgdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSByYW5nZVxyXG4gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50XHJcbiAgICAgICAgdGhpcy5faW5pdCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBPbiBkZXN0cm95XHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlQWxsLm5leHQodm9pZCAwKTtcclxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZUFsbC5jb21wbGV0ZSgpO1xyXG5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXHJcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlID0gKCk6IHZvaWQgPT4geyB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBAIFB1YmxpYyBtZXRob2RzXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3BlbiB0aGUgcGlja2VyIHBhbmVsXHJcbiAgICAgKi9cclxuICAgIG9wZW5QaWNrZXJQYW5lbCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5yZWFkb25seSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGhlIG92ZXJsYXlcclxuICAgICAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUoe1xyXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAnY21hdC1kYXRlLXJhbmdlLXBhbmVsJyxcclxuICAgICAgICAgICAgYmFja2Ryb3BDbGFzczogJycsXHJcbiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxyXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcclxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpXHJcbiAgICAgICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9waWNrZXJQYW5lbE9yaWdpbilcclxuICAgICAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiA4XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiAtOFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIF0pXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIHBvcnRhbCBmcm9tIHRoZSB0ZW1wbGF0ZVxyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMuX3BpY2tlclBhbmVsLCB0aGlzLl92aWV3Q29udGFpbmVyUmVmKTtcclxuXHJcbiAgICAgICAgLy8gT24gYmFja2Ryb3AgY2xpY2tcclxuICAgICAgICBvdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGVtcGxhdGUgcG9ydGFsIGV4aXN0cyBhbmQgYXR0YWNoZWQuLi5cclxuICAgICAgICAgICAgaWYgKHRlbXBsYXRlUG9ydGFsPy5pc0F0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZXRhY2ggaXRcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlUG9ydGFsLmRldGFjaCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiBvdmVybGF5IGV4aXN0cyBhbmQgYXR0YWNoZWQuLi5cclxuICAgICAgICAgICAgaWYgKG92ZXJsYXlSZWY/Lmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIERldGFjaCBpdFxyXG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZi5kZXRhY2goKTtcclxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWYuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEF0dGFjaCB0aGUgcG9ydGFsIHRvIHRoZSBvdmVybGF5XHJcbiAgICAgICAgb3ZlcmxheVJlZi5hdHRhY2godGVtcGxhdGVQb3J0YWwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IG1vbnRoIGxhYmVsXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG1vbnRoXHJcbiAgICAgKi9cclxuICAgIGdldE1vbnRoTGFiZWwobW9udGg6IG51bWJlcik6IHN0cmluZyB8IHZvaWQge1xyXG4gICAgICAgIGlmIChtb250aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVEYXRlcy5tb250aDE/LmNsb25lKCkuZm9ybWF0KCdZWVlZIE1NTU0nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMj8uY2xvbmUoKS5mb3JtYXQoJ1lZWVkgTU1NTScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0ZSBjbGFzcyBmdW5jdGlvbiB0byBhZGQvcmVtb3ZlIGNsYXNzIG5hbWVzIHRvIGNhbGVuZGFyIGRheXNcclxuICAgICAqL1xyXG4gICAgZGF0ZUNsYXNzKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIChkYXRlOiBEYXlqcyk6IE1hdENhbGVuZGFyQ2VsbENzc0NsYXNzZXMgfCB2b2lkID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBkYXRlIGlzIGJvdGggc3RhcnQgYW5kIGVuZCBkYXRlLi4uXHJcbiAgICAgICAgICAgIGlmIChkYXRlLmlzU2FtZSh0aGlzLl9yYW5nZS5zdGFydCwgJ2RheScpICYmIGRhdGUuaXNTYW1lKHRoaXMuX3JhbmdlLmVuZCwgJ2RheScpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWydjbWF0LWRhdGUtcmFuZ2UnLCAnY21hdC1kYXRlLXJhbmdlLXN0YXJ0JywgJ2NtYXQtZGF0ZS1yYW5nZS1lbmQnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGUgaXMgdGhlIHN0YXJ0IGRhdGUuLi5cclxuICAgICAgICAgICAgaWYgKGRhdGUuaXNTYW1lKHRoaXMuX3JhbmdlLnN0YXJ0LCAnZGF5JykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbJ2NtYXQtZGF0ZS1yYW5nZScsICdjbWF0LWRhdGUtcmFuZ2Utc3RhcnQnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGUgaXMgdGhlIGVuZCBkYXRlLi4uXHJcbiAgICAgICAgICAgIGlmIChkYXRlLmlzU2FtZSh0aGlzLl9yYW5nZS5lbmQsICdkYXknKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnY21hdC1kYXRlLXJhbmdlJywgJ2NtYXQtZGF0ZS1yYW5nZS1lbmQnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGUgaXMgaW4gYmV0d2VlbiBzdGFydCBhbmQgZW5kIGRhdGVzLi4uXHJcbiAgICAgICAgICAgIGlmIChkYXRlLmlzQmV0d2Vlbih0aGlzLl9yYW5nZS5zdGFydCwgdGhpcy5fcmFuZ2UuZW5kLCAnZGF5JykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbJ2NtYXQtZGF0ZS1yYW5nZScsICdjbWF0LWRhdGUtcmFuZ2UtbWlkJ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGUgZmlsdGVyIHRvIGVuYWJsZS9kaXNhYmxlIGNhbGVuZGFyIGRheXNcclxuICAgICAqL1xyXG4gICAgZGF0ZUZpbHRlcigpOiBhbnkge1xyXG4gICAgICAgIC8vIElmIHdlIGFyZSBzZWxlY3RpbmcgdGhlIGVuZCBkYXRlLCBkaXNhYmxlIGFsbCB0aGUgZGF0ZXMgdGhhdCBjb21lcyBiZWZvcmUgdGhlIHN0YXJ0IGRhdGVcclxuICAgICAgICByZXR1cm4gKGRhdGU6IERheWpzKTogYm9vbGVhbiA9PiAhKHRoaXMuc2V0V2hpY2hEYXRlID09PSAnZW5kJyAmJiBkYXRlLmlzQmVmb3JlKHRoaXMuX3JhbmdlLnN0YXJ0LCAnZGF5JykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT24gc2VsZWN0ZWQgZGF0ZSBjaGFuZ2VcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZGF0ZVxyXG4gICAgICovXHJcbiAgICBvblNlbGVjdGVkRGF0ZUNoYW5nZShkYXRlOiBEYXlqcyk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHJhbmdlIG9iamVjdFxyXG4gICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuX3JhbmdlLmVuZC5jbG9uZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICB3aGljaERhdGU6ICcnXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAvLyBSZXBsYWNlIGVpdGhlciB0aGUgc3RhcnQgb3IgdGhlIGVuZCBkYXRlIHdpdGggdGhlIG5ldyBvbmVcclxuICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHdoaWNoIGRhdGUgd2UgYXJlIHNldHRpbmdcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0V2hpY2hEYXRlID09PSAnc3RhcnQnKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdSYW5nZS5zdGFydCA9IGRheWpzKG5ld1JhbmdlLnN0YXJ0KS55ZWFyKGRhdGUueWVhcigpKS5tb250aChkYXRlLm1vbnRoKCkpLmRhdGUoZGF0ZS5kYXRlKCkpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBuZXdSYW5nZS5lbmQgPSBkYXlqcyhuZXdSYW5nZS5lbmQpLnllYXIoZGF0ZS55ZWFyKCkpLm1vbnRoKGRhdGUubW9udGgoKSkuZGF0ZShkYXRlLmRhdGUoKSkudG9JU09TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSB3aGljaCBkYXRlIHRvIHRoZSBuZXcgcmFuZ2Ugb2JqZWN0XHJcbiAgICAgICAgICAgIG5ld1JhbmdlLndoaWNoRGF0ZSA9IHRoaXMuc2V0V2hpY2hEYXRlO1xyXG5cclxuICAgICAgICAgICAgLy8gU3dpdGNoIHdoaWNoIGRhdGUgdG8gc2V0IG9uIHRoZSBuZXh0IHJ1blxyXG4gICAgICAgICAgICB0aGlzLnNldFdoaWNoRGF0ZSA9IHRoaXMuc2V0V2hpY2hEYXRlID09PSAnc3RhcnQnID8gJ2VuZCcgOiAnc3RhcnQnO1xyXG5cclxuICAgICAgICAgICAgLy8gU2V0IHRoZSByYW5nZVxyXG4gICAgICAgICAgICB0aGlzLnJhbmdlID0gbmV3UmFuZ2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHbyB0byBwcmV2aW91cyBtb250aCBvbiBib3RoIHZpZXdzXHJcbiAgICAgKi9cclxuICAgIHByZXYoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlcy5tb250aDEgPSBkYXlqcyh0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMSkuc3VidHJhY3QoMSwgJ21vbnRoJyk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlcy5tb250aDIgPSBkYXlqcyh0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMikuc3VidHJhY3QoMSwgJ21vbnRoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHbyB0byBuZXh0IG1vbnRoIG9uIGJvdGggdmlld3NcclxuICAgICAqL1xyXG4gICAgbmV4dCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMSA9IGRheWpzKHRoaXMuYWN0aXZlRGF0ZXMubW9udGgxKS5hZGQoMSwgJ21vbnRoJyk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlcy5tb250aDIgPSBkYXlqcyh0aGlzLmFjdGl2ZURhdGVzLm1vbnRoMikuYWRkKDEsICdtb250aCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBzdGFydCB0aW1lXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVN0YXJ0VGltZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgLy8gUGFyc2UgdGhlIHRpbWVcclxuICAgICAgICBjb25zdCBwYXJzZWRUaW1lID0gdGhpcy5fcGFyc2VUaW1lKGV2ZW50LnRhcmdldC52YWx1ZSk7XHJcblxyXG4gICAgICAgIC8vIEdvIGJhY2sgdG8gdGhlIHByZXZpb3VzIHZhbHVlIGlmIHRoZSBmb3JtIGNvbnRyb2wgaXMgbm90IHZhbGlkXHJcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRUaW1lRm9ybUNvbnRyb2wuaW52YWxpZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcmFuZ2Uuc3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIHRoZSB0aW1lICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lID0gdGhpcy5fcmFuZ2Uuc3RhcnQuY2xvbmUoKS5mb3JtYXQodGhpcy5fdGltZUZvcm1hdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB0aW1lXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZUZvcm1Db250cm9sLnNldFZhbHVlKHRpbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1cGRhdGUgdGhlIHJhbmdlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgdGltZSB0byB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLl9yYW5nZS5zdGFydC5jbG9uZSgpLmhvdXIocGFyc2VkVGltZS5ob3VyKCkpLm1pbnV0ZShwYXJzZWRUaW1lLm1pbnV0ZSgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgc3RhcnQgZGF0ZSBpcyBhZnRlciB0aGUgY3VycmVudCBlbmQgZGF0ZSxcclxuICAgICAgICAgICAgLy8gdXNlIHRoZSBlbmQgZGF0ZSdzIHRpbWUgYW5kIHNldCB0aGUgc3RhcnQgZGF0ZSBhZ2FpblxyXG4gICAgICAgICAgICBpZiAoc3RhcnREYXRlLmlzQWZ0ZXIodGhpcy5fcmFuZ2UuZW5kKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kRGF0ZUhvdXJzID0gdGhpcy5fcmFuZ2UuZW5kLmhvdXIoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGVNaW51dGVzID0gdGhpcy5fcmFuZ2UuZW5kLm1pbnV0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgZGF0ZVxyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlLmhvdXIoZW5kRGF0ZUhvdXJzKS5taW51dGUoZW5kRGF0ZU1pbnV0ZXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiBldmVyeXRoaW5nIGlzIG9rYXksIHNldCB0aGUgbmV3IGRhdGVcclxuICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydERhdGUudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2UuZW5kLmNsb25lKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIHdoaWNoRGF0ZTogJ3N0YXJ0J1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBlbmQgdGltZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBldmVudFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVFbmRUaW1lKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICAvLyBQYXJzZSB0aGUgdGltZVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpbWUgPSB0aGlzLl9wYXJzZVRpbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuXHJcbiAgICAgICAgLy8gR28gYmFjayB0byB0aGUgcHJldmlvdXMgdmFsdWUgaWYgdGhlIGZvcm0gY29udHJvbCBpcyBub3QgdmFsaWRcclxuICAgICAgICBpZiAodGhpcy5lbmRUaW1lRm9ybUNvbnRyb2wuaW52YWxpZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcmFuZ2UuZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgdGltZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZSA9IHRoaXMuX3JhbmdlLmVuZC5jbG9uZSgpLmZvcm1hdCh0aGlzLl90aW1lRm9ybWF0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHRpbWVcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5kVGltZUZvcm1Db250cm9sLnNldFZhbHVlKHRpbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1cGRhdGUgdGhlIHJhbmdlXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yYW5nZS5zdGFydCAmJiB0aGlzLl9yYW5nZS5lbmQpIHtcclxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgdGltZSB0byB0aGUgZW5kIGRhdGVcclxuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuX3JhbmdlLmVuZC5jbG9uZSgpLmhvdXIocGFyc2VkVGltZS5ob3VyKCkpLm1pbnV0ZShwYXJzZWRUaW1lLm1pbnV0ZSgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgZW5kIGRhdGUgaXMgYmVmb3JlIHRoZSBjdXJyZW50IHN0YXJ0IGRhdGUsXHJcbiAgICAgICAgICAgIC8vIHVzZSB0aGUgc3RhcnQgZGF0ZSdzIHRpbWUgYW5kIHNldCB0aGUgZW5kIGRhdGUgYWdhaW5cclxuICAgICAgICAgICAgaWYgKGVuZERhdGUuaXNCZWZvcmUodGhpcy5fcmFuZ2Uuc3RhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGVIb3VycyA9IHRoaXMuX3JhbmdlLnN0YXJ0LmhvdXIoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZU1pbnV0ZXMgPSB0aGlzLl9yYW5nZS5zdGFydC5taW51dGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBkYXRlXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlLmhvdXIoc3RhcnREYXRlSG91cnMpLm1pbnV0ZShzdGFydERhdGVNaW51dGVzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgZXZlcnl0aGluZyBpcyBva2F5LCBzZXQgdGhlIG5ldyBkYXRlXHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fcmFuZ2Uuc3RhcnQuY2xvbmUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgZW5kOiBlbmREYXRlLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICB3aGljaERhdGU6ICdlbmQnXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEAgUHJpdmF0ZSBtZXRob2RzXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZVxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gU3RhcnQgYW5kIGVuZCB0aW1lIGZvcm0gY29udHJvbHNcclxuICAgICAgICB0aGlzLnN0YXJ0VGltZUZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5wYXR0ZXJuKHRoaXMuX3RpbWVSZWdFeHApXSk7XHJcbiAgICAgICAgdGhpcy5lbmRUaW1lRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnBhdHRlcm4odGhpcy5fdGltZVJlZ0V4cCldKTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHJhbmdlXHJcbiAgICAgICAgdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJhbmdlID0ge1xyXG4gICAgICAgICAgICBzdGFydDogZGF5anMoKS5zdGFydE9mKCdkYXknKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgICBlbmQ6IGRheWpzKCkuYWRkKDEsICdkYXknKS5lbmRPZignZGF5JykudG9JU09TdHJpbmcoKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCB0aW1lIHJhbmdlXHJcbiAgICAgICAgdGhpcy5fcHJvZ3JhbW1hdGljQ2hhbmdlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnRpbWVSYW5nZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2UgdGhlIHRpbWUgZnJvbSB0aGUgaW5wdXRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9wYXJzZVRpbWUodmFsdWU6IHN0cmluZyk6IERheWpzIHtcclxuICAgICAgICAvLyBQYXJzZSB0aGUgdGltZSB1c2luZyB0aGUgdGltZSByZWdleHBcclxuICAgICAgICBjb25zdCB0aW1lQXJyID0gdmFsdWUuc3BsaXQodGhpcy5fdGltZVJlZ0V4cCkuZmlsdGVyKHBhcnQgPT4gcGFydCAhPT0gJycpO1xyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIG1lcmlkaWVtXHJcbiAgICAgICAgY29uc3QgbWVyaWRpZW0gPSB0aW1lQXJyWzJdIHx8IG51bGw7XHJcblxyXG4gICAgICAgIC8vIElmIG1lcmlkaWVtIGV4aXN0cy4uLlxyXG4gICAgICAgIGlmIChtZXJpZGllbSkge1xyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBtb21lbnQgdXNpbmcgMTItaG91cnMgZm9ybWF0IGFuZCByZXR1cm4gaXRcclxuICAgICAgICAgICAgcmV0dXJuIGRheWpzKHZhbHVlLCAnaGg6bW1BJykuc2Vjb25kKDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgbWVyaWRpZW0gZG9lc24ndCBleGlzdCwgY3JlYXRlIGEgbW9tZW50IHVzaW5nIDI0LWhvdXJzIGZvcm1hdCBhbmQgcmV0dXJuIGluXHJcbiAgICAgICAgcmV0dXJuIGRheWpzKHZhbHVlLCAnSEg6bW0nKS5zZWNvbmQoMCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjcGlja2VyUGFuZWxPcmlnaW4gcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwicmFuZ2VcIiAoY2xpY2spPVwib3BlblBpY2tlclBhbmVsKClcIj5cblxuICA8ZGl2IGNsYXNzPVwic3RhcnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZVwiPnt7cmFuZ2Uuc3RhcnREYXRlfX08L2Rpdj5cbiAgICBAaWYgKHJhbmdlLnN0YXJ0VGltZSkge1xuICAgICAgPGRpdiBjbGFzcz1cInRpbWVcIj57e3JhbmdlLnN0YXJ0VGltZX19PC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yXCI+LTwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJlbmRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZVwiPnt7cmFuZ2UuZW5kRGF0ZX19PC9kaXY+XG4gICAgQGlmIChyYW5nZS5lbmRUaW1lKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZVwiPnt7cmFuZ2UuZW5kVGltZX19PC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cblxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjcGlja2VyUGFuZWw+XG5cbiAgPCEtLSBTdGFydCAtLT5cbiAgPGRpdiBjbGFzcz1cInN0YXJ0XCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwibW9udGhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1oZWFkZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmV2aW91cy1idXR0b25cIiBtYXQtaWNvbi1idXR0b24gdGFiaW5kZXg9XCIxXCIgKGNsaWNrKT1cInByZXYoKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBbc3ZnSWNvbl09XCInaGVyb2ljb25zX291dGxpbmU6Y2hldnJvbi1sZWZ0J1wiPjwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtbGFiZWxcIj57e2dldE1vbnRoTGFiZWwoMSl9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bWF0LW1vbnRoLXZpZXcgI21hdE1vbnRoVmlldzEgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlcigpXCIgW2RhdGVDbGFzc109XCJkYXRlQ2xhc3MoKVwiXG4gICAgICAgIFsoYWN0aXZlRGF0ZSldPVwiYWN0aXZlRGF0ZXMubW9udGgxXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvblNlbGVjdGVkRGF0ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8L21hdC1tb250aC12aWV3PlxuICAgIDwvZGl2PlxuXG4gICAgQGlmICh0aW1lUmFuZ2UpIHtcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInRpbWUgc3RhcnQtdGltZVwiPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdGFiaW5kZXg9XCIzXCIgW2F1dG9jb21wbGV0ZV09XCInb2ZmJ1wiIFtmb3JtQ29udHJvbF09XCJzdGFydFRpbWVGb3JtQ29udHJvbFwiXG4gICAgICAgICAgKGJsdXIpPVwidXBkYXRlU3RhcnRUaW1lKCRldmVudClcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPuW8gOWni+aXtumXtDwvbWF0LWxhYmVsPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfVxuXG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVuZCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZW5kXCI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb250aFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLWxhYmVsXCI+e3tnZXRNb250aExhYmVsKDIpfX08L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5leHQtYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIHRhYmluZGV4PVwiMlwiIChjbGljayk9XCJuZXh0KClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBbc3ZnSWNvbl09XCInaGVyb2ljb25zX291dGxpbmU6Y2hldnJvbi1yaWdodCdcIj48L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1tb250aC12aWV3ICNtYXRNb250aFZpZXcyIFtkYXRlRmlsdGVyXT1cImRhdGVGaWx0ZXIoKVwiIFtkYXRlQ2xhc3NdPVwiZGF0ZUNsYXNzKClcIlxuICAgICAgICAgIFsoYWN0aXZlRGF0ZSldPVwiYWN0aXZlRGF0ZXMubW9udGgyXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uU2VsZWN0ZWREYXRlQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9tYXQtbW9udGgtdmlldz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKHRpbWVSYW5nZSkge1xuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ0aW1lIGVuZC10aW1lXCI+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHRhYmluZGV4PVwiNFwiIFtmb3JtQ29udHJvbF09XCJlbmRUaW1lRm9ybUNvbnRyb2xcIiAoYmx1cik9XCJ1cGRhdGVFbmRUaW1lKCRldmVudClcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPue7k+adn+aXtumXtDwvbWF0LWxhYmVsPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgfVxuXG4gICAgPC9kaXY+XG5cbiAgPC9uZy10ZW1wbGF0ZT4iXX0=
|