@ng-matero/extensions 18.4.1 → 19.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_index.scss +3 -1
- package/alert/_alert-theme.scss +19 -8
- package/alert/alert.d.ts +1 -2
- package/button/button-loading.d.ts +1 -2
- package/checkbox-group/checkbox-group.d.ts +12 -4
- package/colorpicker/_colorpicker-theme.scss +19 -8
- package/colorpicker/colorpicker-input.d.ts +1 -3
- package/colorpicker/colorpicker-toggle.d.ts +3 -3
- package/colorpicker/colorpicker.d.ts +4 -7
- package/column-resize/column-resize-directives/column-resize-flex.d.ts +2 -1
- package/column-resize/column-resize-directives/column-resize.d.ts +2 -1
- package/column-resize/column-resize-notifier.d.ts +0 -1
- package/column-resize/column-resize.d.ts +1 -1
- package/column-resize/event-dispatcher.d.ts +0 -9
- package/column-resize/overlay-handle.d.ts +1 -1
- package/column-resize/resizable.d.ts +1 -1
- package/column-resize/resize-strategy.d.ts +4 -4
- package/core/datetime/datetime-adapter.d.ts +1 -2
- package/core/datetime/native-datetime-adapter.d.ts +3 -3
- package/core/style/_button-common.scss +18 -0
- package/core/theming/_config-validation.scss +4 -4
- package/core/theming/_definition.scss +12 -2
- package/core/theming/prebuilt/azure-blue.scss +10 -22
- package/core/theming/prebuilt/cyan-orange.scss +10 -22
- package/core/theming/prebuilt/magenta-violet.scss +10 -22
- package/core/theming/prebuilt/rose-red.scss +10 -22
- package/core/tokens/_m3-system.scss +273 -0
- package/core/tokens/_m3-tokens.scss +8 -151
- package/core/tokens/_token-utils.scss +102 -43
- package/core/tokens/m2/_index.scss +2 -0
- package/core/tokens/m3/definitions/_index.scss +1 -0
- package/core/tokens/m3/definitions/_md-comp-plain-tooltip.scss +51 -0
- package/core/tokens/m3/index.scss +2 -0
- package/core/tokens/m3/mdc/_plain-tooltip.scss +15 -0
- package/core/tokens/m3/mtx/_alert.scss +14 -14
- package/core/tokens/m3/mtx/_colorpicker.scss +2 -2
- package/core/tokens/m3/mtx/_datetimepicker.scss +2 -2
- package/core/tokens/m3/mtx/_drawer.scss +2 -2
- package/core/tokens/m3/mtx/_grid.scss +2 -2
- package/core/tokens/m3/mtx/_loader.scss +2 -2
- package/core/tokens/m3/mtx/_popover.scss +2 -2
- package/core/tokens/m3/mtx/_progress.scss +2 -2
- package/core/tokens/m3/mtx/_select.scss +2 -2
- package/core/tokens/m3/mtx/_split.scss +2 -2
- package/datetimepicker/_datetimepicker-theme.scss +23 -10
- package/datetimepicker/calendar-body.d.ts +26 -4
- package/datetimepicker/calendar-body.scss +58 -9
- package/datetimepicker/calendar.d.ts +31 -31
- package/datetimepicker/clock.d.ts +11 -5
- package/datetimepicker/datetimepicker-actions.d.ts +9 -5
- package/datetimepicker/datetimepicker-content.scss +15 -0
- package/datetimepicker/datetimepicker-input.d.ts +4 -5
- package/datetimepicker/datetimepicker-module.d.ts +2 -2
- package/datetimepicker/datetimepicker-toggle.d.ts +4 -3
- package/datetimepicker/datetimepicker.d.ts +12 -8
- package/datetimepicker/month-view.d.ts +22 -7
- package/datetimepicker/multi-year-view.d.ts +20 -20
- package/datetimepicker/public-api.d.ts +2 -2
- package/datetimepicker/{time.d.ts → time-view.d.ts} +21 -9
- package/datetimepicker/{time.scss → time-view.scss} +1 -1
- package/datetimepicker/year-view.d.ts +21 -11
- package/dialog/dialog-container.d.ts +1 -2
- package/dialog/dialog.d.ts +0 -1
- package/drawer/_drawer-theme.scss +19 -8
- package/drawer/drawer-container.d.ts +2 -5
- package/drawer/drawer.d.ts +3 -5
- package/fesm2022/mtxAlert.mjs +15 -15
- package/fesm2022/mtxAlert.mjs.map +1 -1
- package/fesm2022/mtxButton.mjs +13 -14
- package/fesm2022/mtxButton.mjs.map +1 -1
- package/fesm2022/mtxCheckboxGroup.mjs +51 -31
- package/fesm2022/mtxCheckboxGroup.mjs.map +1 -1
- package/fesm2022/mtxColorpicker.mjs +91 -109
- package/fesm2022/mtxColorpicker.mjs.map +1 -1
- package/fesm2022/mtxColumnResize.mjs +79 -96
- package/fesm2022/mtxColumnResize.mjs.map +1 -1
- package/fesm2022/mtxCore.mjs +31 -36
- package/fesm2022/mtxCore.mjs.map +1 -1
- package/fesm2022/mtxDatetimepicker.mjs +1181 -1093
- package/fesm2022/mtxDatetimepicker.mjs.map +1 -1
- package/fesm2022/mtxDialog.mjs +30 -41
- package/fesm2022/mtxDialog.mjs.map +1 -1
- package/fesm2022/mtxDrawer.mjs +36 -52
- package/fesm2022/mtxDrawer.mjs.map +1 -1
- package/fesm2022/mtxGrid.mjs +168 -204
- package/fesm2022/mtxGrid.mjs.map +1 -1
- package/fesm2022/mtxLoader.mjs +12 -12
- package/fesm2022/mtxLoader.mjs.map +1 -1
- package/fesm2022/mtxPhotoviewer.mjs +11 -12
- package/fesm2022/mtxPhotoviewer.mjs.map +1 -1
- package/fesm2022/mtxPopover.mjs +106 -119
- package/fesm2022/mtxPopover.mjs.map +1 -1
- package/fesm2022/mtxProgress.mjs +8 -8
- package/fesm2022/mtxProgress.mjs.map +1 -1
- package/fesm2022/mtxSelect.mjs +157 -169
- package/fesm2022/mtxSelect.mjs.map +1 -1
- package/fesm2022/mtxSplit.mjs +39 -40
- package/fesm2022/mtxSplit.mjs.map +1 -1
- package/fesm2022/mtxTooltip.mjs +105 -91
- package/fesm2022/mtxTooltip.mjs.map +1 -1
- package/grid/_grid-theme.scss +23 -10
- package/grid/cell.d.ts +1 -4
- package/grid/column-resize/column-resize-directives/column-resize-flex.d.ts +0 -1
- package/grid/column-resize/column-resize-directives/column-resize.d.ts +0 -1
- package/grid/column-resize/overlay-handle.d.ts +1 -2
- package/grid/column-resize/resizable-directives/resizable.d.ts +2 -3
- package/grid/column-resize/resize-strategy.d.ts +2 -4
- package/grid/grid-pipes.d.ts +0 -2
- package/grid/grid.d.ts +5 -5
- package/grid/grid.scss +5 -6
- package/loader/_loader-theme.scss +19 -8
- package/loader/loader.d.ts +0 -2
- package/package.json +11 -47
- package/photoviewer/photoviewer.d.ts +1 -2
- package/popover/_popover-theme.scss +19 -8
- package/popover/popover-content.d.ts +1 -1
- package/popover/popover-target.d.ts +1 -2
- package/popover/popover-trigger.d.ts +5 -6
- package/popover/popover.d.ts +1 -2
- package/prebuilt-themes/azure-blue.css +1 -1
- package/prebuilt-themes/cyan-orange.css +1 -1
- package/prebuilt-themes/deeppurple-amber.css +1 -1
- package/prebuilt-themes/indigo-pink.css +1 -1
- package/prebuilt-themes/magenta-violet.css +1 -1
- package/prebuilt-themes/pink-bluegrey.css +1 -1
- package/prebuilt-themes/purple-green.css +1 -1
- package/prebuilt-themes/rose-red.css +1 -1
- package/progress/_progress-theme.scss +23 -10
- package/select/_select-theme.scss +23 -10
- package/select/option.d.ts +0 -1
- package/select/select-intl.d.ts +2 -4
- package/select/select.d.ts +8 -7
- package/select/select.scss +3 -3
- package/select/templates.d.ts +0 -12
- package/split/_split-theme.scss +19 -8
- package/split/split-pane.d.ts +3 -4
- package/split/split.d.ts +4 -4
- package/split/split.scss +1 -1
- package/tooltip/_tooltip-theme.scss +11 -4
- package/tooltip/tooltip.d.ts +17 -9
- package/tooltip/tooltip.scss +8 -3
- package/esm2022/alert/alert-module.mjs +0 -17
- package/esm2022/alert/alert.mjs +0 -46
- package/esm2022/alert/mtxAlert.mjs +0 -5
- package/esm2022/alert/public-api.mjs +0 -3
- package/esm2022/button/button-loading.mjs +0 -66
- package/esm2022/button/button-module.mjs +0 -19
- package/esm2022/button/mtxButton.mjs +0 -5
- package/esm2022/button/public-api.mjs +0 -3
- package/esm2022/checkbox-group/checkbox-group-module.mjs +0 -20
- package/esm2022/checkbox-group/checkbox-group.mjs +0 -222
- package/esm2022/checkbox-group/interfaces.mjs +0 -2
- package/esm2022/checkbox-group/mtxCheckboxGroup.mjs +0 -5
- package/esm2022/checkbox-group/public-api.mjs +0 -4
- package/esm2022/colorpicker/colorpicker-animations.mjs +0 -16
- package/esm2022/colorpicker/colorpicker-input.mjs +0 -228
- package/esm2022/colorpicker/colorpicker-module.mjs +0 -64
- package/esm2022/colorpicker/colorpicker-toggle.mjs +0 -102
- package/esm2022/colorpicker/colorpicker.mjs +0 -363
- package/esm2022/colorpicker/mtxColorpicker.mjs +0 -5
- package/esm2022/colorpicker/public-api.mjs +0 -6
- package/esm2022/column-resize/column-resize-directives/column-resize-flex.mjs +0 -40
- package/esm2022/column-resize/column-resize-directives/column-resize.mjs +0 -40
- package/esm2022/column-resize/column-resize-directives/constants.mjs +0 -21
- package/esm2022/column-resize/column-resize-module.mjs +0 -28
- package/esm2022/column-resize/column-resize-notifier.mjs +0 -52
- package/esm2022/column-resize/column-resize.mjs +0 -82
- package/esm2022/column-resize/column-size-store.mjs +0 -20
- package/esm2022/column-resize/event-dispatcher.mjs +0 -70
- package/esm2022/column-resize/mtxColumnResize.mjs +0 -5
- package/esm2022/column-resize/overlay-handle.mjs +0 -146
- package/esm2022/column-resize/polyfill.mjs +0 -19
- package/esm2022/column-resize/public-api.mjs +0 -13
- package/esm2022/column-resize/resizable.mjs +0 -199
- package/esm2022/column-resize/resize-ref.mjs +0 -17
- package/esm2022/column-resize/resize-strategy.mjs +0 -238
- package/esm2022/column-resize/selectors.mjs +0 -13
- package/esm2022/core/datetime/datetime-adapter.mjs +0 -132
- package/esm2022/core/datetime/datetime-formats.mjs +0 -3
- package/esm2022/core/datetime/datetime.module.mjs +0 -38
- package/esm2022/core/datetime/index.mjs +0 -6
- package/esm2022/core/datetime/native-datetime-adapter.mjs +0 -138
- package/esm2022/core/datetime/native-datetime-formats.mjs +0 -20
- package/esm2022/core/mtxCore.mjs +0 -5
- package/esm2022/core/pipes/index.mjs +0 -4
- package/esm2022/core/pipes/is-template-ref.pipe.mjs +0 -14
- package/esm2022/core/pipes/pipes.module.mjs +0 -18
- package/esm2022/core/pipes/to-observable.pipe.mjs +0 -15
- package/esm2022/core/public-api.mjs +0 -3
- package/esm2022/datetimepicker/calendar-body.mjs +0 -77
- package/esm2022/datetimepicker/calendar.mjs +0 -661
- package/esm2022/datetimepicker/clock.mjs +0 -362
- package/esm2022/datetimepicker/datetimepicker-actions.mjs +0 -88
- package/esm2022/datetimepicker/datetimepicker-animations.mjs +0 -44
- package/esm2022/datetimepicker/datetimepicker-errors.mjs +0 -8
- package/esm2022/datetimepicker/datetimepicker-filtertype.mjs +0 -7
- package/esm2022/datetimepicker/datetimepicker-input.mjs +0 -349
- package/esm2022/datetimepicker/datetimepicker-intl.mjs +0 -63
- package/esm2022/datetimepicker/datetimepicker-module.mjs +0 -116
- package/esm2022/datetimepicker/datetimepicker-toggle.mjs +0 -105
- package/esm2022/datetimepicker/datetimepicker-types.mjs +0 -2
- package/esm2022/datetimepicker/datetimepicker.mjs +0 -580
- package/esm2022/datetimepicker/month-view.mjs +0 -148
- package/esm2022/datetimepicker/mtxDatetimepicker.mjs +0 -5
- package/esm2022/datetimepicker/multi-year-view.mjs +0 -215
- package/esm2022/datetimepicker/public-api.mjs +0 -17
- package/esm2022/datetimepicker/time.mjs +0 -470
- package/esm2022/datetimepicker/year-view.mjs +0 -139
- package/esm2022/dialog/dialog-config.mjs +0 -2
- package/esm2022/dialog/dialog-container.mjs +0 -43
- package/esm2022/dialog/dialog-module.mjs +0 -40
- package/esm2022/dialog/dialog.mjs +0 -75
- package/esm2022/dialog/mtxDialog.mjs +0 -5
- package/esm2022/dialog/public-api.mjs +0 -5
- package/esm2022/drawer/drawer-animations.mjs +0 -18
- package/esm2022/drawer/drawer-config.mjs +0 -35
- package/esm2022/drawer/drawer-container.mjs +0 -88
- package/esm2022/drawer/drawer-module.mjs +0 -21
- package/esm2022/drawer/drawer-ref.mjs +0 -99
- package/esm2022/drawer/drawer.mjs +0 -144
- package/esm2022/drawer/mtxDrawer.mjs +0 -5
- package/esm2022/drawer/public-api.mjs +0 -7
- package/esm2022/grid/cell.mjs +0 -132
- package/esm2022/grid/column-menu.mjs +0 -133
- package/esm2022/grid/column-resize/column-resize-directives/column-resize-flex.mjs +0 -38
- package/esm2022/grid/column-resize/column-resize-directives/column-resize.mjs +0 -38
- package/esm2022/grid/column-resize/column-resize-directives/common.mjs +0 -27
- package/esm2022/grid/column-resize/column-resize-module.mjs +0 -42
- package/esm2022/grid/column-resize/index.mjs +0 -8
- package/esm2022/grid/column-resize/overlay-handle.mjs +0 -66
- package/esm2022/grid/column-resize/resizable-directives/common.mjs +0 -29
- package/esm2022/grid/column-resize/resizable-directives/resizable.mjs +0 -64
- package/esm2022/grid/column-resize/resize-strategy.mjs +0 -47
- package/esm2022/grid/expansion-toggle.mjs +0 -65
- package/esm2022/grid/grid-module.mjs +0 -151
- package/esm2022/grid/grid-pipes.mjs +0 -129
- package/esm2022/grid/grid-utils.mjs +0 -56
- package/esm2022/grid/grid.mjs +0 -644
- package/esm2022/grid/interfaces.mjs +0 -2
- package/esm2022/grid/mtxGrid.mjs +0 -5
- package/esm2022/grid/public-api.mjs +0 -18
- package/esm2022/grid/selectable-cell.mjs +0 -53
- package/esm2022/loader/loader-module.mjs +0 -19
- package/esm2022/loader/loader.mjs +0 -57
- package/esm2022/loader/mtxLoader.mjs +0 -5
- package/esm2022/loader/public-api.mjs +0 -3
- package/esm2022/ng-matero-extensions.mjs +0 -5
- package/esm2022/photoviewer/mtxPhotoviewer.mjs +0 -5
- package/esm2022/photoviewer/photoviewer-module.mjs +0 -16
- package/esm2022/photoviewer/photoviewer.mjs +0 -64
- package/esm2022/photoviewer/public-api.mjs +0 -3
- package/esm2022/popover/mtxPopover.mjs +0 -5
- package/esm2022/popover/popover-animations.mjs +0 -25
- package/esm2022/popover/popover-content.mjs +0 -91
- package/esm2022/popover/popover-errors.mjs +0 -27
- package/esm2022/popover/popover-interfaces.mjs +0 -2
- package/esm2022/popover/popover-module.mjs +0 -39
- package/esm2022/popover/popover-target.mjs +0 -18
- package/esm2022/popover/popover-trigger.mjs +0 -480
- package/esm2022/popover/popover-types.mjs +0 -2
- package/esm2022/popover/popover.mjs +0 -325
- package/esm2022/popover/public-api.mjs +0 -9
- package/esm2022/progress/mtxProgress.mjs +0 -5
- package/esm2022/progress/progress-module.mjs +0 -17
- package/esm2022/progress/progress.mjs +0 -43
- package/esm2022/progress/public-api.mjs +0 -3
- package/esm2022/public-api.mjs +0 -5
- package/esm2022/select/mtxSelect.mjs +0 -5
- package/esm2022/select/option.mjs +0 -52
- package/esm2022/select/public-api.mjs +0 -6
- package/esm2022/select/select-intl.mjs +0 -32
- package/esm2022/select/select-module.mjs +0 -89
- package/esm2022/select/select.mjs +0 -611
- package/esm2022/select/templates.mjs +0 -135
- package/esm2022/split/interfaces.mjs +0 -2
- package/esm2022/split/mtxSplit.mjs +0 -5
- package/esm2022/split/public-api.mjs +0 -6
- package/esm2022/split/split-module.mjs +0 -18
- package/esm2022/split/split-pane.mjs +0 -161
- package/esm2022/split/split.mjs +0 -634
- package/esm2022/split/utils.mjs +0 -219
- package/esm2022/tooltip/mtxTooltip.mjs +0 -5
- package/esm2022/tooltip/public-api.mjs +0 -4
- package/esm2022/tooltip/tooltip-animations.mjs +0 -17
- package/esm2022/tooltip/tooltip-module.mjs +0 -41
- package/esm2022/tooltip/tooltip.mjs +0 -915
|
@@ -1,470 +0,0 @@
|
|
|
1
|
-
import { coerceNumberProperty } from '@angular/cdk/coercion';
|
|
2
|
-
import { DOWN_ARROW, UP_ARROW } from '@angular/cdk/keycodes';
|
|
3
|
-
import { booleanAttribute, ChangeDetectionStrategy, Component, Directive, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
4
|
-
import { MatButton } from '@angular/material/button';
|
|
5
|
-
import { MtxClock } from './clock';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@ng-matero/extensions/core";
|
|
8
|
-
import * as i2 from "./datetimepicker-intl";
|
|
9
|
-
function pad(num, size) {
|
|
10
|
-
num = String(num);
|
|
11
|
-
while (num.length < size)
|
|
12
|
-
num = '0' + num;
|
|
13
|
-
return num;
|
|
14
|
-
}
|
|
15
|
-
export class MtxTimeInput {
|
|
16
|
-
set timeInterval(value) {
|
|
17
|
-
this._interval = coerceNumberProperty(value);
|
|
18
|
-
}
|
|
19
|
-
set timeMin(value) {
|
|
20
|
-
this._min = coerceNumberProperty(value);
|
|
21
|
-
}
|
|
22
|
-
set timeMax(value) {
|
|
23
|
-
this._max = coerceNumberProperty(value);
|
|
24
|
-
}
|
|
25
|
-
set timeValue(value) {
|
|
26
|
-
this._value = coerceNumberProperty(value);
|
|
27
|
-
if (!this.hasFocus) {
|
|
28
|
-
this.writeValue(this._value);
|
|
29
|
-
}
|
|
30
|
-
this.writePlaceholder(this._value);
|
|
31
|
-
}
|
|
32
|
-
constructor(element, cdr) {
|
|
33
|
-
this.element = element;
|
|
34
|
-
this.cdr = cdr;
|
|
35
|
-
this._interval = 1;
|
|
36
|
-
this._min = 0;
|
|
37
|
-
this._max = Infinity;
|
|
38
|
-
this.timeValueChanged = new EventEmitter();
|
|
39
|
-
this.keyDownListener = this.keyDownHandler.bind(this);
|
|
40
|
-
this.keyPressListener = this.keyPressHandler.bind(this);
|
|
41
|
-
this.inputEventListener = this.inputChangedHandler.bind(this);
|
|
42
|
-
this.inputElement.addEventListener('keydown', this.keyDownListener, {
|
|
43
|
-
passive: true,
|
|
44
|
-
});
|
|
45
|
-
// Do not passive since we want to be able to preventDefault()
|
|
46
|
-
this.inputElement.addEventListener('keypress', this.keyPressListener);
|
|
47
|
-
this.inputElement.addEventListener('input', this.inputEventListener, {
|
|
48
|
-
passive: true,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
get hasFocus() {
|
|
52
|
-
return this.element.nativeElement && this.element?.nativeElement === document?.activeElement;
|
|
53
|
-
}
|
|
54
|
-
get inputElement() {
|
|
55
|
-
return this.element.nativeElement;
|
|
56
|
-
}
|
|
57
|
-
// We look here at the placeholder value, because we write '' into the value on focus
|
|
58
|
-
// placeholder should always be up to date with "currentValue"
|
|
59
|
-
get valid() {
|
|
60
|
-
// At the start _value is undefined therefore this would result in not valid and
|
|
61
|
-
// make a ugly warning border afterwards we can safely check
|
|
62
|
-
if (this._value) {
|
|
63
|
-
const currentValue = String(this.inputElement.value);
|
|
64
|
-
// It can be that currentValue is empty due to we removing the value on focus,
|
|
65
|
-
// if that is the case we should check previous value which should be in the placeholder
|
|
66
|
-
if (currentValue.length) {
|
|
67
|
-
return this._value == this.inputElement.value;
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
return this._value == this.inputElement.placeholder;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
get invalid() {
|
|
76
|
-
return !this.valid;
|
|
77
|
-
}
|
|
78
|
-
blur() {
|
|
79
|
-
this.writeValue(this._value);
|
|
80
|
-
this.writePlaceholder(this._value);
|
|
81
|
-
}
|
|
82
|
-
focus() {
|
|
83
|
-
this.writeValue('');
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Write value to inputElement
|
|
87
|
-
* @param value NumberInput
|
|
88
|
-
*/
|
|
89
|
-
writeValue(value) {
|
|
90
|
-
if (value !== '') {
|
|
91
|
-
this.inputElement.value = pad(value, 2);
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
this.inputElement.value = '';
|
|
95
|
-
}
|
|
96
|
-
this.cdr.markForCheck();
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Writes value to placeholder
|
|
100
|
-
* @param value NumberInput
|
|
101
|
-
*/
|
|
102
|
-
writePlaceholder(value) {
|
|
103
|
-
this.inputElement.placeholder = pad(value, 2);
|
|
104
|
-
this.cdr.markForCheck();
|
|
105
|
-
}
|
|
106
|
-
keyDownHandler(event) {
|
|
107
|
-
if (String(this.inputElement.value).length > 0) {
|
|
108
|
-
let value = null;
|
|
109
|
-
if (event.keyCode === UP_ARROW) {
|
|
110
|
-
value = coerceNumberProperty(this._value);
|
|
111
|
-
value += this._interval;
|
|
112
|
-
event.stopPropagation();
|
|
113
|
-
}
|
|
114
|
-
else if (event.keyCode === DOWN_ARROW) {
|
|
115
|
-
value = coerceNumberProperty(this._value);
|
|
116
|
-
value -= this._interval;
|
|
117
|
-
event.stopPropagation();
|
|
118
|
-
}
|
|
119
|
-
// if value has changed
|
|
120
|
-
if (typeof value === 'number') {
|
|
121
|
-
this.writeValue(value);
|
|
122
|
-
this.writePlaceholder(value);
|
|
123
|
-
this.clampInputValue();
|
|
124
|
-
this.timeValueChanged.emit(this._value);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Prevent non number inputs in the inputElement with the exception of Enter/BackSpace
|
|
130
|
-
* @param event KeyboardEvent
|
|
131
|
-
*/
|
|
132
|
-
keyPressHandler(event) {
|
|
133
|
-
const key = event?.key ?? null;
|
|
134
|
-
if (isNaN(Number(key)) && key !== 'Enter') {
|
|
135
|
-
event.preventDefault();
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
inputChangedHandler() {
|
|
139
|
-
this.clampInputValue();
|
|
140
|
-
this.timeValueChanged.emit(this._value);
|
|
141
|
-
}
|
|
142
|
-
clampInputValue() {
|
|
143
|
-
if (this.inputElement?.value === '') {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
const value = coerceNumberProperty(this.inputElement?.value ?? null);
|
|
147
|
-
// if this._min === 0, we should allow 0
|
|
148
|
-
if (value || (this._min === 0 && value === 0)) {
|
|
149
|
-
const clampedValue = Math.min(Math.max(value, this._min), this._max);
|
|
150
|
-
if (clampedValue !== value) {
|
|
151
|
-
this.writeValue(clampedValue);
|
|
152
|
-
this.writePlaceholder(clampedValue);
|
|
153
|
-
}
|
|
154
|
-
this._value = clampedValue;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Remove event listeners on destruction
|
|
159
|
-
*/
|
|
160
|
-
ngOnDestroy() {
|
|
161
|
-
this.inputElement.removeEventListener('keydown', this.keyDownListener);
|
|
162
|
-
this.inputElement.removeEventListener('keypress', this.keyPressListener);
|
|
163
|
-
this.inputElement.removeEventListener('input', this.inputEventListener);
|
|
164
|
-
}
|
|
165
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxTimeInput, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
166
|
-
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0", type: MtxTimeInput, isStandalone: true, selector: "input.mtx-time-input", inputs: { timeInterval: "timeInterval", timeMin: "timeMin", timeMax: "timeMax", timeValue: "timeValue" }, outputs: { timeValueChanged: "timeValueChanged" }, host: { listeners: { "blur": "blur($event)", "focus": "focus($event)" } }, exportAs: ["mtxTimeInput"], ngImport: i0 }); }
|
|
167
|
-
}
|
|
168
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxTimeInput, decorators: [{
|
|
169
|
-
type: Directive,
|
|
170
|
-
args: [{
|
|
171
|
-
selector: 'input.mtx-time-input',
|
|
172
|
-
host: {
|
|
173
|
-
'(blur)': 'blur($event)',
|
|
174
|
-
'(focus)': 'focus($event)',
|
|
175
|
-
},
|
|
176
|
-
exportAs: 'mtxTimeInput',
|
|
177
|
-
standalone: true,
|
|
178
|
-
}]
|
|
179
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { timeInterval: [{
|
|
180
|
-
type: Input,
|
|
181
|
-
args: ['timeInterval']
|
|
182
|
-
}], timeMin: [{
|
|
183
|
-
type: Input,
|
|
184
|
-
args: ['timeMin']
|
|
185
|
-
}], timeMax: [{
|
|
186
|
-
type: Input,
|
|
187
|
-
args: ['timeMax']
|
|
188
|
-
}], timeValue: [{
|
|
189
|
-
type: Input,
|
|
190
|
-
args: ['timeValue']
|
|
191
|
-
}], timeValueChanged: [{
|
|
192
|
-
type: Output
|
|
193
|
-
}] } });
|
|
194
|
-
export class MtxTime {
|
|
195
|
-
/** The date to display in this clock view. */
|
|
196
|
-
get activeDate() {
|
|
197
|
-
return this._activeDate;
|
|
198
|
-
}
|
|
199
|
-
set activeDate(value) {
|
|
200
|
-
this._activeDate = this._adapter.clampDate(value, this.minDate, this.maxDate);
|
|
201
|
-
}
|
|
202
|
-
/** The currently selected date. */
|
|
203
|
-
get selected() {
|
|
204
|
-
return this._selected;
|
|
205
|
-
}
|
|
206
|
-
set selected(value) {
|
|
207
|
-
this._selected = this._adapter.getValidDateOrNull(this._adapter.deserialize(value));
|
|
208
|
-
if (this._selected) {
|
|
209
|
-
this.activeDate = this._selected;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
/** The minimum selectable date. */
|
|
213
|
-
get minDate() {
|
|
214
|
-
return this._minDate;
|
|
215
|
-
}
|
|
216
|
-
set minDate(value) {
|
|
217
|
-
this._minDate = this._adapter.getValidDateOrNull(this._adapter.deserialize(value));
|
|
218
|
-
}
|
|
219
|
-
/** The maximum selectable date. */
|
|
220
|
-
get maxDate() {
|
|
221
|
-
return this._maxDate;
|
|
222
|
-
}
|
|
223
|
-
set maxDate(value) {
|
|
224
|
-
this._maxDate = this._adapter.getValidDateOrNull(this._adapter.deserialize(value));
|
|
225
|
-
}
|
|
226
|
-
/** Whether the clock should be started in hour or minute view. */
|
|
227
|
-
get clockView() {
|
|
228
|
-
return this._clockView;
|
|
229
|
-
}
|
|
230
|
-
set clockView(value) {
|
|
231
|
-
this._clockView = value;
|
|
232
|
-
}
|
|
233
|
-
get isHourView() {
|
|
234
|
-
return this._clockView === 'hour';
|
|
235
|
-
}
|
|
236
|
-
get isMinuteView() {
|
|
237
|
-
return this._clockView === 'hour';
|
|
238
|
-
}
|
|
239
|
-
get hour() {
|
|
240
|
-
if (!this.activeDate) {
|
|
241
|
-
if (this.twelvehour) {
|
|
242
|
-
return '12';
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
return '00';
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
const hour = Number(this._adapter.getHour(this.activeDate));
|
|
249
|
-
if (!this.twelvehour) {
|
|
250
|
-
return this.prefixWithZero(hour);
|
|
251
|
-
}
|
|
252
|
-
if (hour === 0) {
|
|
253
|
-
return '12';
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
return this.prefixWithZero(hour > 12 ? hour - 12 : hour);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
get minute() {
|
|
260
|
-
if (this.activeDate) {
|
|
261
|
-
return this.prefixWithZero(this._adapter.getMinute(this.activeDate));
|
|
262
|
-
}
|
|
263
|
-
return '00';
|
|
264
|
-
}
|
|
265
|
-
prefixWithZero(value) {
|
|
266
|
-
if (value < 10) {
|
|
267
|
-
return '0' + String(value);
|
|
268
|
-
}
|
|
269
|
-
return String(value);
|
|
270
|
-
}
|
|
271
|
-
constructor(_adapter, _changeDetectorRef, _datetimepickerIntl) {
|
|
272
|
-
this._adapter = _adapter;
|
|
273
|
-
this._changeDetectorRef = _changeDetectorRef;
|
|
274
|
-
this._datetimepickerIntl = _datetimepickerIntl;
|
|
275
|
-
/** Emits when the currently selected date changes. */
|
|
276
|
-
this.selectedChange = new EventEmitter();
|
|
277
|
-
/** Emits when any date changes. */
|
|
278
|
-
this.activeDateChange = new EventEmitter();
|
|
279
|
-
/** Emits when any date is selected. */
|
|
280
|
-
this._userSelection = new EventEmitter();
|
|
281
|
-
/** Emits when AM/PM button are clicked. */
|
|
282
|
-
this.ampmChange = new EventEmitter();
|
|
283
|
-
/** Emits when AM/PM button are clicked. */
|
|
284
|
-
this.clockViewChange = new EventEmitter();
|
|
285
|
-
/** Step over minutes. */
|
|
286
|
-
this.interval = 1;
|
|
287
|
-
/** Input for action buttons. */
|
|
288
|
-
this.actionsPortal = null;
|
|
289
|
-
/** Whether the time input should be auto-focused after view init. */
|
|
290
|
-
this.autoFocus = true;
|
|
291
|
-
/** Whether the clock uses 12 hour format. */
|
|
292
|
-
this.twelvehour = false;
|
|
293
|
-
/** Whether the time is now in AM or PM. */
|
|
294
|
-
this.AMPM = 'AM';
|
|
295
|
-
/** Whether the clock is in hour view. */
|
|
296
|
-
this._clockView = 'hour';
|
|
297
|
-
this.datetimepickerIntlChangesSubscription = this._datetimepickerIntl.changes.subscribe(() => {
|
|
298
|
-
this._changeDetectorRef.detectChanges();
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
ngOnChanges(changes) {
|
|
302
|
-
// when clockView changes by input we should focus the correct input
|
|
303
|
-
if (changes.clockView) {
|
|
304
|
-
if (changes.clockView.currentValue !== changes.clockView.previousValue && this.autoFocus) {
|
|
305
|
-
this.focusInputElement();
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
ngAfterViewInit() {
|
|
310
|
-
if (this.autoFocus) {
|
|
311
|
-
this.focusInputElement();
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
ngOnDestroy() {
|
|
315
|
-
if (this.datetimepickerIntlChangesSubscription) {
|
|
316
|
-
this.datetimepickerIntlChangesSubscription.unsubscribe();
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
focusInputElement() {
|
|
320
|
-
if (this.clockView === 'hour') {
|
|
321
|
-
if (this.hourInputElement) {
|
|
322
|
-
this.hourInputElement.nativeElement.focus();
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
if (this.minuteInputElement) {
|
|
327
|
-
this.minuteInputElement.nativeElement.focus();
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
_handleHourInputChange(value) {
|
|
332
|
-
const hour = coerceNumberProperty(value);
|
|
333
|
-
if (hour || hour === 0) {
|
|
334
|
-
const newValue = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._updateHourForAmPm(hour), this._adapter.getMinute(this.activeDate));
|
|
335
|
-
this._activeDate = this._adapter.clampDate(newValue, this.minDate, this.maxDate);
|
|
336
|
-
this.activeDateChange.emit(this.activeDate);
|
|
337
|
-
if (this.actionsPortal) {
|
|
338
|
-
this.selectedChange.emit(this.activeDate);
|
|
339
|
-
}
|
|
340
|
-
// If previously we did set [mtxValue]="13" and the input changed to 6, and the clamping
|
|
341
|
-
// will make it "13" again then the hourInputDirective will not have been updated
|
|
342
|
-
// since "13" === "13" same reference so no change detected by directly setting it within
|
|
343
|
-
// this handler, we handle this usecase
|
|
344
|
-
if (this.hourInputDirective) {
|
|
345
|
-
this.hourInputDirective.timeValue = this.hour;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
_updateHourForAmPm(value) {
|
|
350
|
-
if (!this.twelvehour) {
|
|
351
|
-
return value;
|
|
352
|
-
}
|
|
353
|
-
// value should be between 1-12
|
|
354
|
-
if (this.AMPM === 'AM') {
|
|
355
|
-
if (value === 0 || value === 12) {
|
|
356
|
-
return 0;
|
|
357
|
-
}
|
|
358
|
-
return value;
|
|
359
|
-
}
|
|
360
|
-
// PM
|
|
361
|
-
else {
|
|
362
|
-
if (value === 0 || value === 12) {
|
|
363
|
-
return 12;
|
|
364
|
-
}
|
|
365
|
-
// other cases, we should add 12 to the value aka 3:00 PM = 3 + 12 = 15:00
|
|
366
|
-
return value + 12;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
_handleMinuteInputChange(value) {
|
|
370
|
-
const minute = coerceNumberProperty(value);
|
|
371
|
-
if (minute || minute === 0) {
|
|
372
|
-
const newValue = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this.activeDate), minute);
|
|
373
|
-
this._activeDate = this._adapter.clampDate(newValue, this.minDate, this.maxDate);
|
|
374
|
-
this.activeDateChange.emit(this.activeDate);
|
|
375
|
-
if (this.actionsPortal) {
|
|
376
|
-
this.selectedChange.emit(this.activeDate);
|
|
377
|
-
}
|
|
378
|
-
// If previously we did set [mtxValue]="40" and the input changed to 30, and the clamping
|
|
379
|
-
// will make it "40" again then the minuteInputDirective will not have been updated
|
|
380
|
-
// since "40" === "40" same reference so no change detected by directly setting it within
|
|
381
|
-
// this handler, we handle this usecase
|
|
382
|
-
if (this.minuteInputDirective) {
|
|
383
|
-
this.minuteInputDirective.timeValue = this.minute;
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
_handleFocus(clockView) {
|
|
388
|
-
this.clockView = clockView;
|
|
389
|
-
this.clockViewChange.emit(clockView);
|
|
390
|
-
}
|
|
391
|
-
_timeSelected(date) {
|
|
392
|
-
if (this.clockView === 'hour') {
|
|
393
|
-
this.clockView = 'minute';
|
|
394
|
-
}
|
|
395
|
-
this._activeDate = this.selected = date;
|
|
396
|
-
}
|
|
397
|
-
_onActiveDateChange(date) {
|
|
398
|
-
this._activeDate = date;
|
|
399
|
-
this.activeDateChange.emit(date);
|
|
400
|
-
}
|
|
401
|
-
_handleSelection() {
|
|
402
|
-
if (this.actionsPortal && this._selected) {
|
|
403
|
-
this.selectedChange.emit(this._selected);
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
_handleOk() {
|
|
407
|
-
if (this._selected) {
|
|
408
|
-
this.selectedChange.emit(this._selected);
|
|
409
|
-
}
|
|
410
|
-
this._userSelection.emit();
|
|
411
|
-
}
|
|
412
|
-
_handleCancel() {
|
|
413
|
-
this._userSelection.emit();
|
|
414
|
-
}
|
|
415
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxTime, deps: [{ token: i1.DatetimeAdapter }, { token: i0.ChangeDetectorRef }, { token: i2.MtxDatetimepickerIntl }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
416
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: MtxTime, isStandalone: true, selector: "mtx-time", inputs: { dateFilter: "dateFilter", interval: "interval", actionsPortal: "actionsPortal", autoFocus: ["autoFocus", "autoFocus", booleanAttribute], twelvehour: ["twelvehour", "twelvehour", booleanAttribute], AMPM: "AMPM", activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", clockView: "clockView" }, outputs: { selectedChange: "selectedChange", activeDateChange: "activeDateChange", _userSelection: "_userSelection", ampmChange: "ampmChange", clockViewChange: "clockViewChange" }, host: { classAttribute: "mtx-time" }, viewQueries: [{ propertyName: "hourInputElement", first: true, predicate: ["hourInput"], descendants: true, read: (ElementRef) }, { propertyName: "hourInputDirective", first: true, predicate: ["hourInput"], descendants: true, read: MtxTimeInput }, { propertyName: "minuteInputElement", first: true, predicate: ["minuteInput"], descendants: true, read: (ElementRef) }, { propertyName: "minuteInputDirective", first: true, predicate: ["minuteInput"], descendants: true, read: MtxTimeInput }], exportAs: ["mtxTime"], usesOnChanges: true, ngImport: i0, template: "<div class=\"mtx-time-input-wrapper\">\n <div class=\"mtx-time-input-inner\">\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'hour'\"\n [class.mtx-time-input-warning]=\"!hourInput.valid\"\n #hourInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"twelvehour ? 1 : 0\"\n [timeMax]=\"twelvehour ? 12 : 23\"\n [timeValue]=\"hour\"\n (timeValueChanged)=\"_handleHourInputChange($event)\"\n (focus)=\"_handleFocus('hour')\" />\n\n <div class=\"mtx-time-seperator\">:</div>\n\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'minute'\"\n [class.mtx-time-input-warning]=\"!minuteInput.valid\"\n #minuteInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"0\"\n [timeMax]=\"59\"\n [timeValue]=\"minute\"\n (timeValueChanged)=\"_handleMinuteInputChange($event)\"\n [timeInterval]=\"interval\"\n (focus)=\"_handleFocus('minute')\" />\n\n @if (twelvehour) {\n <div class=\"mtx-time-ampm\">\n <button mat-button type=\"button\" class=\"mtx-time-am\"\n [class.mtx-time-ampm-active]=\"AMPM === 'AM'\" aria-label=\"AM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('AM')\">AM</button>\n <button mat-button type=\"button\" class=\"mtx-time-pm\"\n [class.mtx-time-ampm-active]=\"AMPM === 'PM'\" aria-label=\"PM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('PM')\">PM</button>\n </div>\n }\n </div>\n</div>\n\n<mtx-clock (selectedChange)=\"_timeSelected($event)\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (_userSelection)=\"_handleSelection()\"\n [AMPM]=\"AMPM\"\n [dateFilter]=\"dateFilter\"\n [actionButtons]=\"!!actionsPortal\"\n [interval]=\"interval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected\"\n [startView]=\"clockView\"\n [twelvehour]=\"twelvehour\">\n</mtx-clock>\n\n@if (!actionsPortal) {\n <div class=\"mtx-time-button-wrapper\">\n <button class=\"mtx-time-cancel-button\" mat-button type=\"button\" (click)=\"_handleCancel()\">\n {{ _datetimepickerIntl.cancelLabel }}\n </button>\n <button class=\"mtx-time-ok-button\" mat-button type=\"button\" (click)=\"_handleOk()\"\n [disabled]=\"minuteInputDirective?.invalid || hourInputDirective?.invalid\">\n {{ _datetimepickerIntl.okLabel }}\n </button>\n </div>\n}\n", styles: [".mtx-time{display:block;outline:none;-webkit-user-select:none;user-select:none}.mtx-time-input-wrapper{padding:8px 0;text-align:center}.mtx-time-input-inner{display:inline-flex;height:56px}.mtx-time-input{box-sizing:border-box;width:72px;height:100%;padding:0;font-size:36px;text-align:center;border:2px solid transparent;appearance:none;outline:none;border-radius:var(--mtx-datetimepicker-selector-container-shape, var(--mat-app-corner-small));background-color:var(--mtx-datetimepicker-time-input-background-color, var(--mat-app-surface-container-highest));color:var(--mtx-datetimepicker-time-input-text-color, var(--mat-app-on-surface))}.mtx-time-input.mtx-time-input-active{background-color:var(--mtx-datetimepicker-time-input-active-state-background-color, var(--mat-app-primary-container));color:var(--mtx-datetimepicker-time-input-active-state-text-color, var(--mat-app-on-primary-container))}.mtx-time-input.mtx-time-input-active:focus{border-color:var(--mtx-datetimepicker-time-input-focus-state-outline-color, var(--mat-app-primary));background-color:var(--mtx-datetimepicker-time-input-focus-state-background-color, var(--mat-app-primary-container))}.mtx-time-input.mtx-time-input-active:focus::placeholder{color:var(--mtx-datetimepicker-time-input-focus-state-placeholder-text-color, var(--mat-app-on-primary-container))}.mtx-time-input.mtx-time-input-warning{border-color:var(--mtx-datetimepicker-time-input-warn-state-outline-color, var(--mat-app-error))}.mtx-time-seperator{display:inline-flex;justify-content:center;align-items:center;width:24px;font-size:36px}.mtx-time-ampm{display:inline-flex;flex-direction:column;margin-left:12px}[dir=rtl] .mtx-time-ampm{margin-left:auto;margin-right:12px}.mtx-time-ampm .mtx-time-am,.mtx-time-ampm .mtx-time-pm{--mdc-text-button-label-text-weight: 400;flex:1;width:40px;min-width:auto;border-width:1px;border-style:solid;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-text-color, var(--mat-app-on-surface));--mdc-text-button-container-shape: var(--mtx-datetimepicker-selector-container-shape, var(--mat-app-corner-small));border-color:var(--mtx-datetimepicker-time-ampm-outline-color, var(--mat-app-outline))}.mtx-time-ampm .mtx-time-am.mtx-time-ampm-active,.mtx-time-ampm .mtx-time-pm.mtx-time-ampm-active{--mdc-text-button-label-text-weight: 500;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-selected-state-text-color, var(--mat-app-on-tertiary-container));background-color:var(--mtx-datetimepicker-time-ampm-selected-state-background-color, var(--mat-app-tertiary-container))}.mtx-time-ampm .mtx-time-am .mat-mdc-button-touch-target,.mtx-time-ampm .mtx-time-pm .mat-mdc-button-touch-target{height:100%}.mtx-time-ampm .mtx-time-am{border-bottom-left-radius:0;border-bottom-right-radius:0}.mtx-time-ampm .mtx-time-pm{border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.mtx-time-button-wrapper{display:flex;justify-content:flex-end;padding-top:8px}.mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MtxClock, selector: "mtx-clock", inputs: ["dateFilter", "interval", "actionButtons", "twelvehour", "AMPM", "activeDate", "selected", "minDate", "maxDate", "startView"], outputs: ["selectedChange", "activeDateChange", "_userSelection"], exportAs: ["mtxClock"] }, { kind: "directive", type: MtxTimeInput, selector: "input.mtx-time-input", inputs: ["timeInterval", "timeMin", "timeMax", "timeValue"], outputs: ["timeValueChanged"], exportAs: ["mtxTimeInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
417
|
-
}
|
|
418
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxTime, decorators: [{
|
|
419
|
-
type: Component,
|
|
420
|
-
args: [{ selector: 'mtx-time', exportAs: 'mtxTime', host: {
|
|
421
|
-
class: 'mtx-time',
|
|
422
|
-
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatButton, MtxClock, MtxTimeInput], template: "<div class=\"mtx-time-input-wrapper\">\n <div class=\"mtx-time-input-inner\">\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'hour'\"\n [class.mtx-time-input-warning]=\"!hourInput.valid\"\n #hourInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"twelvehour ? 1 : 0\"\n [timeMax]=\"twelvehour ? 12 : 23\"\n [timeValue]=\"hour\"\n (timeValueChanged)=\"_handleHourInputChange($event)\"\n (focus)=\"_handleFocus('hour')\" />\n\n <div class=\"mtx-time-seperator\">:</div>\n\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'minute'\"\n [class.mtx-time-input-warning]=\"!minuteInput.valid\"\n #minuteInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"0\"\n [timeMax]=\"59\"\n [timeValue]=\"minute\"\n (timeValueChanged)=\"_handleMinuteInputChange($event)\"\n [timeInterval]=\"interval\"\n (focus)=\"_handleFocus('minute')\" />\n\n @if (twelvehour) {\n <div class=\"mtx-time-ampm\">\n <button mat-button type=\"button\" class=\"mtx-time-am\"\n [class.mtx-time-ampm-active]=\"AMPM === 'AM'\" aria-label=\"AM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('AM')\">AM</button>\n <button mat-button type=\"button\" class=\"mtx-time-pm\"\n [class.mtx-time-ampm-active]=\"AMPM === 'PM'\" aria-label=\"PM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('PM')\">PM</button>\n </div>\n }\n </div>\n</div>\n\n<mtx-clock (selectedChange)=\"_timeSelected($event)\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (_userSelection)=\"_handleSelection()\"\n [AMPM]=\"AMPM\"\n [dateFilter]=\"dateFilter\"\n [actionButtons]=\"!!actionsPortal\"\n [interval]=\"interval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected\"\n [startView]=\"clockView\"\n [twelvehour]=\"twelvehour\">\n</mtx-clock>\n\n@if (!actionsPortal) {\n <div class=\"mtx-time-button-wrapper\">\n <button class=\"mtx-time-cancel-button\" mat-button type=\"button\" (click)=\"_handleCancel()\">\n {{ _datetimepickerIntl.cancelLabel }}\n </button>\n <button class=\"mtx-time-ok-button\" mat-button type=\"button\" (click)=\"_handleOk()\"\n [disabled]=\"minuteInputDirective?.invalid || hourInputDirective?.invalid\">\n {{ _datetimepickerIntl.okLabel }}\n </button>\n </div>\n}\n", styles: [".mtx-time{display:block;outline:none;-webkit-user-select:none;user-select:none}.mtx-time-input-wrapper{padding:8px 0;text-align:center}.mtx-time-input-inner{display:inline-flex;height:56px}.mtx-time-input{box-sizing:border-box;width:72px;height:100%;padding:0;font-size:36px;text-align:center;border:2px solid transparent;appearance:none;outline:none;border-radius:var(--mtx-datetimepicker-selector-container-shape, var(--mat-app-corner-small));background-color:var(--mtx-datetimepicker-time-input-background-color, var(--mat-app-surface-container-highest));color:var(--mtx-datetimepicker-time-input-text-color, var(--mat-app-on-surface))}.mtx-time-input.mtx-time-input-active{background-color:var(--mtx-datetimepicker-time-input-active-state-background-color, var(--mat-app-primary-container));color:var(--mtx-datetimepicker-time-input-active-state-text-color, var(--mat-app-on-primary-container))}.mtx-time-input.mtx-time-input-active:focus{border-color:var(--mtx-datetimepicker-time-input-focus-state-outline-color, var(--mat-app-primary));background-color:var(--mtx-datetimepicker-time-input-focus-state-background-color, var(--mat-app-primary-container))}.mtx-time-input.mtx-time-input-active:focus::placeholder{color:var(--mtx-datetimepicker-time-input-focus-state-placeholder-text-color, var(--mat-app-on-primary-container))}.mtx-time-input.mtx-time-input-warning{border-color:var(--mtx-datetimepicker-time-input-warn-state-outline-color, var(--mat-app-error))}.mtx-time-seperator{display:inline-flex;justify-content:center;align-items:center;width:24px;font-size:36px}.mtx-time-ampm{display:inline-flex;flex-direction:column;margin-left:12px}[dir=rtl] .mtx-time-ampm{margin-left:auto;margin-right:12px}.mtx-time-ampm .mtx-time-am,.mtx-time-ampm .mtx-time-pm{--mdc-text-button-label-text-weight: 400;flex:1;width:40px;min-width:auto;border-width:1px;border-style:solid;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-text-color, var(--mat-app-on-surface));--mdc-text-button-container-shape: var(--mtx-datetimepicker-selector-container-shape, var(--mat-app-corner-small));border-color:var(--mtx-datetimepicker-time-ampm-outline-color, var(--mat-app-outline))}.mtx-time-ampm .mtx-time-am.mtx-time-ampm-active,.mtx-time-ampm .mtx-time-pm.mtx-time-ampm-active{--mdc-text-button-label-text-weight: 500;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-selected-state-text-color, var(--mat-app-on-tertiary-container));background-color:var(--mtx-datetimepicker-time-ampm-selected-state-background-color, var(--mat-app-tertiary-container))}.mtx-time-ampm .mtx-time-am .mat-mdc-button-touch-target,.mtx-time-ampm .mtx-time-pm .mat-mdc-button-touch-target{height:100%}.mtx-time-ampm .mtx-time-am{border-bottom-left-radius:0;border-bottom-right-radius:0}.mtx-time-ampm .mtx-time-pm{border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.mtx-time-button-wrapper{display:flex;justify-content:flex-end;padding-top:8px}.mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"] }]
|
|
423
|
-
}], ctorParameters: () => [{ type: i1.DatetimeAdapter }, { type: i0.ChangeDetectorRef }, { type: i2.MtxDatetimepickerIntl }], propDecorators: { selectedChange: [{
|
|
424
|
-
type: Output
|
|
425
|
-
}], activeDateChange: [{
|
|
426
|
-
type: Output
|
|
427
|
-
}], _userSelection: [{
|
|
428
|
-
type: Output
|
|
429
|
-
}], ampmChange: [{
|
|
430
|
-
type: Output
|
|
431
|
-
}], clockViewChange: [{
|
|
432
|
-
type: Output
|
|
433
|
-
}], dateFilter: [{
|
|
434
|
-
type: Input
|
|
435
|
-
}], interval: [{
|
|
436
|
-
type: Input
|
|
437
|
-
}], actionsPortal: [{
|
|
438
|
-
type: Input
|
|
439
|
-
}], autoFocus: [{
|
|
440
|
-
type: Input,
|
|
441
|
-
args: [{ transform: booleanAttribute }]
|
|
442
|
-
}], hourInputElement: [{
|
|
443
|
-
type: ViewChild,
|
|
444
|
-
args: ['hourInput', { read: (ElementRef) }]
|
|
445
|
-
}], hourInputDirective: [{
|
|
446
|
-
type: ViewChild,
|
|
447
|
-
args: ['hourInput', { read: MtxTimeInput }]
|
|
448
|
-
}], minuteInputElement: [{
|
|
449
|
-
type: ViewChild,
|
|
450
|
-
args: ['minuteInput', { read: (ElementRef) }]
|
|
451
|
-
}], minuteInputDirective: [{
|
|
452
|
-
type: ViewChild,
|
|
453
|
-
args: ['minuteInput', { read: MtxTimeInput }]
|
|
454
|
-
}], twelvehour: [{
|
|
455
|
-
type: Input,
|
|
456
|
-
args: [{ transform: booleanAttribute }]
|
|
457
|
-
}], AMPM: [{
|
|
458
|
-
type: Input
|
|
459
|
-
}], activeDate: [{
|
|
460
|
-
type: Input
|
|
461
|
-
}], selected: [{
|
|
462
|
-
type: Input
|
|
463
|
-
}], minDate: [{
|
|
464
|
-
type: Input
|
|
465
|
-
}], maxDate: [{
|
|
466
|
-
type: Input
|
|
467
|
-
}], clockView: [{
|
|
468
|
-
type: Input
|
|
469
|
-
}] } });
|
|
470
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvZGF0ZXRpbWVwaWNrZXIvdGltZS50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvZGF0ZXRpbWVwaWNrZXIvdGltZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0QsT0FBTyxFQUVMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJckQsT0FBTyxFQUFFLFFBQVEsRUFBZ0IsTUFBTSxTQUFTLENBQUM7Ozs7QUFLakQsU0FBUyxHQUFHLENBQUMsR0FBZ0IsRUFBRSxJQUFZO0lBQ3pDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUk7UUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMxQyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFXRCxNQUFNLE9BQU8sWUFBWTtJQUN2QixJQUNJLFlBQVksQ0FBQyxLQUFrQjtRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFHRCxJQUNJLE9BQU8sQ0FBQyxLQUFrQjtRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENB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QUdZLGVBQWU7c0JBQWpDLE1BQU07Z0JBR0UsVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR2tDLFNBQVM7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBRzVCLGdCQUFnQjtzQkFEekIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQSxVQUE0QixDQUFBLEVBQUU7Z0JBSXBELGtCQUFrQjtzQkFEM0IsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO2dCQUlwQyxrQkFBa0I7c0JBRDNCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUEsVUFBNEIsQ0FBQSxFQUFFO2dCQUl0RCxvQkFBb0I7c0JBRDdCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRTtnQkFNUixVQUFVO3NCQUFqRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUc3QixJQUFJO3NCQUFaLEtBQUs7Z0JBSUYsVUFBVTtzQkFEYixLQUFLO2dCQVdGLFFBQVE7c0JBRFgsS0FBSztnQkFjRixPQUFPO3NCQURWLEtBQUs7Z0JBWUYsT0FBTztzQkFEVixLQUFLO2dCQVdGLFNBQVM7c0JBRFosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZU51bWJlclByb3BlcnR5LCBOdW1iZXJJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBVUF9BUlJPVyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uTGlrZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBEYXRldGltZUFkYXB0ZXIgfSBmcm9tICdAbmctbWF0ZXJvL2V4dGVuc2lvbnMvY29yZSc7XG5pbXBvcnQgeyBNdHhDbG9jaywgTXR4Q2xvY2tWaWV3IH0gZnJvbSAnLi9jbG9jayc7XG5pbXBvcnQgeyBNdHhEYXRldGltZXBpY2tlckZpbHRlclR5cGUgfSBmcm9tICcuL2RhdGV0aW1lcGlja2VyLWZpbHRlcnR5cGUnO1xuaW1wb3J0IHsgTXR4RGF0ZXRpbWVwaWNrZXJJbnRsIH0gZnJvbSAnLi9kYXRldGltZXBpY2tlci1pbnRsJztcbmltcG9ydCB7IE10eEFNUE0gfSBmcm9tICcuL2RhdGV0aW1lcGlja2VyLXR5cGVzJztcblxuZnVuY3Rpb24gcGFkKG51bTogTnVtYmVySW5wdXQsIHNpemU6IG51bWJlcikge1xuICBudW0gPSBTdHJpbmcobnVtKTtcbiAgd2hpbGUgKG51bS5sZW5ndGggPCBzaXplKSBudW0gPSAnMCcgKyBudW07XG4gIHJldHVybiBudW07XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2lucHV0Lm10eC10aW1lLWlucHV0JyxcbiAgaG9zdDoge1xuICAgICcoYmx1ciknOiAnYmx1cigkZXZlbnQpJyxcbiAgICAnKGZvY3VzKSc6ICdmb2N1cygkZXZlbnQpJyxcbiAgfSxcbiAgZXhwb3J0QXM6ICdtdHhUaW1lSW5wdXQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBNdHhUaW1lSW5wdXQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBASW5wdXQoJ3RpbWVJbnRlcnZhbCcpXG4gIHNldCB0aW1lSW50ZXJ2YWwodmFsdWU6IE51bWJlcklucHV0KSB7XG4gICAgdGhpcy5faW50ZXJ2YWwgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfaW50ZXJ2YWw6IG51bWJlciA9IDE7XG5cbiAgQElucHV0KCd0aW1lTWluJylcbiAgc2V0IHRpbWVNaW4odmFsdWU6IE51bWJlcklucHV0KSB7XG4gICAgdGhpcy5fbWluID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX21pbiA9IDA7XG5cbiAgQElucHV0KCd0aW1lTWF4JylcbiAgc2V0IHRpbWVNYXgodmFsdWU6IE51bWJlcklucHV0KSB7XG4gICAgdGhpcy5fbWF4ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX21heCA9IEluZmluaXR5O1xuXG4gIEBJbnB1dCgndGltZVZhbHVlJylcbiAgc2V0IHRpbWVWYWx1ZSh2YWx1ZTogTnVtYmVySW5wdXQpIHtcbiAgICB0aGlzLl92YWx1ZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAoIXRoaXMuaGFzRm9jdXMpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMud3JpdGVQbGFjZWhvbGRlcih0aGlzLl92YWx1ZSk7XG4gIH1cblxuICBAT3V0cHV0KCkgdGltZVZhbHVlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TnVtYmVySW5wdXQ+KCk7XG5cbiAgcHJpdmF0ZSBfdmFsdWU6IE51bWJlcklucHV0O1xuXG4gIHByaXZhdGUga2V5RG93bkxpc3RlbmVyID0gdGhpcy5rZXlEb3duSGFuZGxlci5iaW5kKHRoaXMpO1xuICBwcml2YXRlIGtleVByZXNzTGlzdGVuZXIgPSB0aGlzLmtleVByZXNzSGFuZGxlci5iaW5kKHRoaXMpO1xuICBwcml2YXRlIGlucHV0RXZlbnRMaXN0ZW5lciA9IHRoaXMuaW5wdXRDaGFuZ2VkSGFuZGxlci5iaW5kKHRoaXMpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5RG93bkxpc3RlbmVyLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gRG8gbm90IHBhc3NpdmUgc2luY2Ugd2Ugd2FudCB0byBiZSBhYmxlIHRvIHByZXZlbnREZWZhdWx0KClcbiAgICB0aGlzLmlucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIHRoaXMua2V5UHJlc3NMaXN0ZW5lcik7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB0aGlzLmlucHV0RXZlbnRMaXN0ZW5lciwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBoYXNGb2N1cygpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5lbGVtZW50Py5uYXRpdmVFbGVtZW50ID09PSBkb2N1bWVudD8uYWN0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGdldCBpbnB1dEVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIH1cblxuICAvLyBXZSBsb29rIGhlcmUgYXQgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLCBiZWNhdXNlIHdlIHdyaXRlICcnIGludG8gdGhlIHZhbHVlIG9uIGZvY3VzXG4gIC8vIHBsYWNlaG9sZGVyIHNob3VsZCBhbHdheXMgYmUgdXAgdG8gZGF0ZSB3aXRoIFwiY3VycmVudFZhbHVlXCJcbiAgZ2V0IHZhbGlkKCkge1xuICAgIC8vIEF0IHRoZSBzdGFydCBfdmFsdWUgaXMgdW5kZWZpbmVkIHRoZXJlZm9yZSB0aGlzIHdvdWxkIHJlc3VsdCBpbiBub3QgdmFsaWQgYW5kXG4gICAgLy8gbWFrZSBhIHVnbHkgd2FybmluZyBib3JkZXIgYWZ0ZXJ3YXJkcyB3ZSBjYW4gc2FmZWx5IGNoZWNrXG4gICAgaWYgKHRoaXMuX3ZhbHVlKSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBTdHJpbmcodGhpcy5pbnB1dEVsZW1lbnQudmFsdWUpO1xuXG4gICAgICAvLyBJdCBjYW4gYmUgdGhhdCBjdXJyZW50VmFsdWUgaXMgZW1wdHkgZHVlIHRvIHdlIHJlbW92aW5nIHRoZSB2YWx1ZSBvbiBmb2N1cyxcbiAgICAgIC8vIGlmIHRoYXQgaXMgdGhlIGNhc2Ugd2Ugc2hvdWxkIGNoZWNrIHByZXZpb3VzIHZhbHVlIHdoaWNoIHNob3VsZCBiZSBpbiB0aGUgcGxhY2Vob2xkZXJcbiAgICAgIGlmIChjdXJyZW50VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZSA9PSB0aGlzLmlucHV0RWxlbWVudC52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZSA9PSB0aGlzLmlucHV0RWxlbWVudC5wbGFjZWhvbGRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgaW52YWxpZCgpIHtcbiAgICByZXR1cm4gIXRoaXMudmFsaWQ7XG4gIH1cblxuICBibHVyKCkge1xuICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy53cml0ZVBsYWNlaG9sZGVyKHRoaXMuX3ZhbHVlKTtcbiAgfVxuXG4gIGZvY3VzKCkge1xuICAgIHRoaXMud3JpdGVWYWx1ZSgnJyk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgdmFsdWUgdG8gaW5wdXRFbGVtZW50XG4gICAqIEBwYXJhbSB2YWx1ZSBOdW1iZXJJbnB1dFxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogTnVtYmVySW5wdXQpIHtcbiAgICBpZiAodmFsdWUgIT09ICcnKSB7XG4gICAgICB0aGlzLmlucHV0RWxlbWVudC52YWx1ZSA9IHBhZCh2YWx1ZSwgMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB2YWx1ZSB0byBwbGFjZWhvbGRlclxuICAgKiBAcGFyYW0gdmFsdWUgTnVtYmVySW5wdXRcbiAgICovXG4gIHdyaXRlUGxhY2Vob2xkZXIodmFsdWU6IE51bWJlcklucHV0KSB7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnQucGxhY2Vob2xkZXIgPSBwYWQodmFsdWUsIDIpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAga2V5RG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoU3RyaW5nKHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgdmFsdWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IFVQX0FSUk9XKSB7XG4gICAgICAgIHZhbHVlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodGhpcy5fdmFsdWUpO1xuICAgICAgICB2YWx1ZSArPSB0aGlzLl9pbnRlcnZhbDtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUNvZGUgPT09IERPV05fQVJST1cpIHtcbiAgICAgICAgdmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh0aGlzLl92YWx1ZSk7XG4gICAgICAgIHZhbHVlIC09IHRoaXMuX2ludGVydmFsO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMud3JpdGVQbGFjZWhvbGRlcih2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2xhbXBJbnB1dFZhbHVlKCk7XG4gICAgICAgIHRoaXMudGltZVZhbHVlQ2hhbmdlZC5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJldmVudCBub24gbnVtYmVyIGlucHV0cyBpbiB0aGUgaW5wdXRFbGVtZW50IHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBFbnRlci9CYWNrU3BhY2VcbiAgICogQHBhcmFtIGV2ZW50IEtleWJvYXJkRXZlbnRcbiAgICovXG4gIGtleVByZXNzSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGtleSA9IGV2ZW50Py5rZXkgPz8gbnVsbDtcbiAgICBpZiAoaXNOYU4oTnVtYmVyKGtleSkpICYmIGtleSAhPT0gJ0VudGVyJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBpbnB1dENoYW5nZWRIYW5kbGVyKCkge1xuICAgIHRoaXMuY2xhbXBJbnB1dFZhbHVlKCk7XG4gICAgdGhpcy50aW1lVmFsdWVDaGFuZ2VkLmVtaXQodGhpcy5fdmFsdWUpO1xuICB9XG5cbiAgY2xhbXBJbnB1dFZhbHVlKCkge1xuICAgIGlmICh0aGlzLmlucHV0RWxlbWVudD8udmFsdWUgPT09ICcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh0aGlzLmlucHV0RWxlbWVudD8udmFsdWUgPz8gbnVsbCk7XG4gICAgLy8gaWYgdGhpcy5fbWluID09PSAwLCB3ZSBzaG91bGQgYWxsb3cgMFxuICAgIGlmICh2YWx1ZSB8fCAodGhpcy5fbWluID09PSAwICYmIHZhbHVlID09PSAwKSkge1xuICAgICAgY29uc3QgY2xhbXBlZFZhbHVlID0gTWF0aC5taW4oTWF0aC5tYXgodmFsdWUsIHRoaXMuX21pbiksIHRoaXMuX21heCk7XG4gICAgICBpZiAoY2xhbXBlZFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUoY2xhbXBlZFZhbHVlKTtcbiAgICAgICAgdGhpcy53cml0ZVBsYWNlaG9sZGVyKGNsYW1wZWRWYWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLl92YWx1ZSA9IGNsYW1wZWRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBvbiBkZXN0cnVjdGlvblxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5RG93bkxpc3RlbmVyKTtcbiAgICB0aGlzLmlucHV0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIHRoaXMua2V5UHJlc3NMaXN0ZW5lcik7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB0aGlzLmlucHV0RXZlbnRMaXN0ZW5lcik7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXR4LXRpbWUnLFxuICB0ZW1wbGF0ZVVybDogJ3RpbWUuaHRtbCcsXG4gIHN0eWxlVXJsOiAndGltZS5zY3NzJyxcbiAgZXhwb3J0QXM6ICdtdHhUaW1lJyxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnbXR4LXRpbWUnLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW01hdEJ1dHRvbiwgTXR4Q2xvY2ssIE10eFRpbWVJbnB1dF0sXG59KVxuZXhwb3J0IGNsYXNzIE10eFRpbWU8RD4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBFbWl0cyB3aGVuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZSBjaGFuZ2VzLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0ZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEQ+KCk7XG5cbiAgLyoqIEVtaXRzIHdoZW4gYW55IGRhdGUgY2hhbmdlcy4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGFjdGl2ZURhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEQ+KCk7XG5cbiAgLyoqIEVtaXRzIHdoZW4gYW55IGRhdGUgaXMgc2VsZWN0ZWQuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBfdXNlclNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiBBTS9QTSBidXR0b24gYXJlIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBhbXBtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNdHhBTVBNPigpO1xuXG4gIC8qKiBFbWl0cyB3aGVuIEFNL1BNIGJ1dHRvbiBhcmUgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNsb2NrVmlld0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TXR4Q2xvY2tWaWV3PigpO1xuXG4gIC8qKiBBIGZ1bmN0aW9uIHVzZWQgdG8gZmlsdGVyIHdoaWNoIGRhdGVzIGFyZSBzZWxlY3RhYmxlLiAqL1xuICBASW5wdXQoKSBkYXRlRmlsdGVyITogKGRhdGU6IEQsIHR5cGU6IE10eERhdGV0aW1lcGlja2VyRmlsdGVyVHlwZSkgPT4gYm9vbGVhbjtcblxuICAvKiogU3RlcCBvdmVyIG1pbnV0ZXMuICovXG4gIEBJbnB1dCgpIGludGVydmFsOiBudW1iZXIgPSAxO1xuXG4gIC8qKiBJbnB1dCBmb3IgYWN0aW9uIGJ1dHRvbnMuICovXG4gIEBJbnB1dCgpIGFjdGlvbnNQb3J0YWw6IFRlbXBsYXRlUG9ydGFsIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHRpbWUgaW5wdXQgc2hvdWxkIGJlIGF1dG8tZm9jdXNlZCBhZnRlciB2aWV3IGluaXQuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBhdXRvRm9jdXMgPSB0cnVlO1xuXG4gIEBWaWV3Q2hpbGQoJ2hvdXJJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PiB9KVxuICBwcm90ZWN0ZWQgaG91cklucHV0RWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PiB8IHVuZGVmaW5lZDtcblxuICBAVmlld0NoaWxkKCdob3VySW5wdXQnLCB7IHJlYWQ6IE10eFRpbWVJbnB1dCB9KVxuICBwcm90ZWN0ZWQgaG91cklucHV0RGlyZWN0aXZlOiBNdHhUaW1lSW5wdXQgfCB1bmRlZmluZWQ7XG5cbiAgQFZpZXdDaGlsZCgnbWludXRlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4gfSlcbiAgcHJvdGVjdGVkIG1pbnV0ZUlucHV0RWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PiB8IHVuZGVmaW5lZDtcblxuICBAVmlld0NoaWxkKCdtaW51dGVJbnB1dCcsIHsgcmVhZDogTXR4VGltZUlucHV0IH0pXG4gIHByb3RlY3RlZCBtaW51dGVJbnB1dERpcmVjdGl2ZTogTXR4VGltZUlucHV0IHwgdW5kZWZpbmVkO1xuXG4gIGRhdGV0aW1lcGlja2VySW50bENoYW5nZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbkxpa2U7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNsb2NrIHVzZXMgMTIgaG91ciBmb3JtYXQuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSB0d2VsdmVob3VyID0gZmFsc2U7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHRpbWUgaXMgbm93IGluIEFNIG9yIFBNLiAqL1xuICBASW5wdXQoKSBBTVBNOiBNdHhBTVBNID0gJ0FNJztcblxuICAvKiogVGhlIGRhdGUgdG8gZGlzcGxheSBpbiB0aGlzIGNsb2NrIHZpZXcuICovXG4gIEBJbnB1dCgpXG4gIGdldCBhY3RpdmVEYXRlKCk6IEQge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXRlO1xuICB9XG4gIHNldCBhY3RpdmVEYXRlKHZhbHVlOiBEKSB7XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuY2xhbXBEYXRlKHZhbHVlLCB0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfYWN0aXZlRGF0ZSE6IEQ7XG5cbiAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZS4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHNlbGVjdGVkKCk6IEQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XG4gIH1cbiAgc2V0IHNlbGVjdGVkKHZhbHVlOiBEIHwgbnVsbCkge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gdGhpcy5fYWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fYWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZCkge1xuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5fc2VsZWN0ZWQ7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX3NlbGVjdGVkITogRCB8IG51bGw7XG5cbiAgLyoqIFRoZSBtaW5pbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgQElucHV0KClcbiAgZ2V0IG1pbkRhdGUoKTogRCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xuICB9XG5cbiAgc2V0IG1pbkRhdGUodmFsdWU6IEQgfCBudWxsKSB7XG4gICAgdGhpcy5fbWluRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2FkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgfVxuICBwcml2YXRlIF9taW5EYXRlITogRCB8IG51bGw7XG5cbiAgLyoqIFRoZSBtYXhpbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgQElucHV0KClcbiAgZ2V0IG1heERhdGUoKTogRCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICB9XG4gIHNldCBtYXhEYXRlKHZhbHVlOiBEIHwgbnVsbCkge1xuICAgIHRoaXMuX21heERhdGUgPSB0aGlzLl9hZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9hZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gIH1cbiAgcHJpdmF0ZSBfbWF4RGF0ZSE6IEQgfCBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjbG9jayBzaG91bGQgYmUgc3RhcnRlZCBpbiBob3VyIG9yIG1pbnV0ZSB2aWV3LiAqL1xuICBASW5wdXQoKVxuICBnZXQgY2xvY2tWaWV3KCkge1xuICAgIHJldHVybiB0aGlzLl9jbG9ja1ZpZXc7XG4gIH1cbiAgc2V0IGNsb2NrVmlldyh2YWx1ZTogTXR4Q2xvY2tWaWV3KSB7XG4gICAgdGhpcy5fY2xvY2tWaWV3ID0gdmFsdWU7XG4gIH1cbiAgLyoqIFdoZXRoZXIgdGhlIGNsb2NrIGlzIGluIGhvdXIgdmlldy4gKi9cbiAgcHJpdmF0ZSBfY2xvY2tWaWV3OiBNdHhDbG9ja1ZpZXcgPSAnaG91cic7XG5cbiAgZ2V0IGlzSG91clZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb2NrVmlldyA9PT0gJ2hvdXInO1xuICB9XG5cbiAgZ2V0IGlzTWludXRlVmlldygpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xvY2tWaWV3ID09PSAnaG91cic7XG4gIH1cblxuICBnZXQgaG91cigpIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlRGF0ZSkge1xuICAgICAgaWYgKHRoaXMudHdlbHZlaG91cikge1xuICAgICAgICByZXR1cm4gJzEyJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnMDAnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhvdXIgPSBOdW1iZXIodGhpcy5fYWRhcHRlci5nZXRIb3VyKHRoaXMuYWN0aXZlRGF0ZSkpO1xuICAgIGlmICghdGhpcy50d2VsdmVob3VyKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVmaXhXaXRoWmVybyhob3VyKTtcbiAgICB9XG5cbiAgICBpZiAoaG91ciA9PT0gMCkge1xuICAgICAgcmV0dXJuICcxMic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByZWZpeFdpdGhaZXJvKGhvdXIgPiAxMiA/IGhvdXIgLSAxMiA6IGhvdXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBtaW51dGUoKSB7XG4gICAgaWYgKHRoaXMuYWN0aXZlRGF0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJlZml4V2l0aFplcm8odGhpcy5fYWRhcHRlci5nZXRNaW51dGUodGhpcy5hY3RpdmVEYXRlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICcwMCc7XG4gIH1cblxuICBwcmVmaXhXaXRoWmVybyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlIDwgMTApIHtcbiAgICAgIHJldHVybiAnMCcgKyBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfYWRhcHRlcjogRGF0ZXRpbWVBZGFwdGVyPEQ+LFxuICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgX2RhdGV0aW1lcGlja2VySW50bDogTXR4RGF0ZXRpbWVwaWNrZXJJbnRsXG4gICkge1xuICAgIHRoaXMuZGF0ZXRpbWVwaWNrZXJJbnRsQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMuX2RhdGV0aW1lcGlja2VySW50bC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gd2hlbiBjbG9ja1ZpZXcgY2hhbmdlcyBieSBpbnB1dCB3ZSBzaG91bGQgZm9jdXMgdGhlIGNvcnJlY3QgaW5wdXRcbiAgICBpZiAoY2hhbmdlcy5jbG9ja1ZpZXcpIHtcbiAgICAgIGlmIChjaGFuZ2VzLmNsb2NrVmlldy5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuY2xvY2tWaWV3LnByZXZpb3VzVmFsdWUgJiYgdGhpcy5hdXRvRm9jdXMpIHtcbiAgICAgICAgdGhpcy5mb2N1c0lucHV0RWxlbWVudCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hdXRvRm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXNJbnB1dEVsZW1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRldGltZXBpY2tlckludGxDaGFuZ2VzU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRhdGV0aW1lcGlja2VySW50bENoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBmb2N1c0lucHV0RWxlbWVudCgpIHtcbiAgICBpZiAodGhpcy5jbG9ja1ZpZXcgPT09ICdob3VyJykge1xuICAgICAgaWYgKHRoaXMuaG91cklucHV0RWxlbWVudCkge1xuICAgICAgICB0aGlzLmhvdXJJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5taW51dGVJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5taW51dGVJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9oYW5kbGVIb3VySW5wdXRDaGFuZ2UodmFsdWU6IE51bWJlcklucHV0KSB7XG4gICAgY29uc3QgaG91ciA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAoaG91ciB8fCBob3VyID09PSAwKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuX2FkYXB0ZXIuY3JlYXRlRGF0ZXRpbWUoXG4gICAgICAgIHRoaXMuX2FkYXB0ZXIuZ2V0WWVhcih0aGlzLmFjdGl2ZURhdGUpLFxuICAgICAgICB0aGlzLl9hZGFwdGVyLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSksXG4gICAgICAgIHRoaXMuX2FkYXB0ZXIuZ2V0RGF0ZSh0aGlzLmFjdGl2ZURhdGUpLFxuICAgICAgICB0aGlzLl91cGRhdGVIb3VyRm9yQW1QbShob3VyKSxcbiAgICAgICAgdGhpcy5fYWRhcHRlci5nZXRNaW51dGUodGhpcy5hY3RpdmVEYXRlKVxuICAgICAgKTtcblxuICAgICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHRoaXMuX2FkYXB0ZXIuY2xhbXBEYXRlKG5ld1ZhbHVlLCB0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZSk7XG4gICAgICB0aGlzLmFjdGl2ZURhdGVDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZURhdGUpO1xuXG4gICAgICBpZiAodGhpcy5hY3Rpb25zUG9ydGFsKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBwcmV2aW91c2x5IHdlIGRpZCBzZXQgW210eFZhbHVlXT1cIjEzXCIgYW5kIHRoZSBpbnB1dCBjaGFuZ2VkIHRvIDYsIGFuZCB0aGUgY2xhbXBpbmdcbiAgICAgIC8vIHdpbGwgbWFrZSBpdCBcIjEzXCIgYWdhaW4gdGhlbiB0aGUgaG91cklucHV0RGlyZWN0aXZlIHdpbGwgbm90IGhhdmUgYmVlbiB1cGRhdGVkXG4gICAgICAvLyBzaW5jZSBcIjEzXCIgPT09IFwiMTNcIiBzYW1lIHJlZmVyZW5jZSBzbyBubyBjaGFuZ2UgZGV0ZWN0ZWQgYnkgZGlyZWN0bHkgc2V0dGluZyBpdCB3aXRoaW5cbiAgICAgIC8vIHRoaXMgaGFuZGxlciwgd2UgaGFuZGxlIHRoaXMgdXNlY2FzZVxuICAgICAgaWYgKHRoaXMuaG91cklucHV0RGlyZWN0aXZlKSB7XG4gICAgICAgIHRoaXMuaG91cklucHV0RGlyZWN0aXZlLnRpbWVWYWx1ZSA9IHRoaXMuaG91cjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSG91ckZvckFtUG0odmFsdWU6IG51bWJlcikge1xuICAgIGlmICghdGhpcy50d2VsdmVob3VyKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gdmFsdWUgc2hvdWxkIGJlIGJldHdlZW4gMS0xMlxuICAgIGlmICh0aGlzLkFNUE0gPT09ICdBTScpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCB8fCB2YWx1ZSA9PT0gMTIpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8vIFBNXG4gICAgZWxzZSB7XG4gICAgICBpZiAodmFsdWUgPT09IDAgfHwgdmFsdWUgPT09IDEyKSB7XG4gICAgICAgIHJldHVybiAxMjtcbiAgICAgIH1cblxuICAgICAgLy8gb3RoZXIgY2FzZXMsIHdlIHNob3VsZCBhZGQgMTIgdG8gdGhlIHZhbHVlIGFrYSAzOjAwIFBNID0gMyArIDEyID0gMTU6MDBcbiAgICAgIHJldHVybiB2YWx1ZSArIDEyO1xuICAgIH1cbiAgfVxuXG4gIF9oYW5kbGVNaW51dGVJbnB1dENoYW5nZSh2YWx1ZTogTnVtYmVySW5wdXQpIHtcbiAgICBjb25zdCBtaW51dGUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG4gICAgaWYgKG1pbnV0ZSB8fCBtaW51dGUgPT09IDApIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5fYWRhcHRlci5jcmVhdGVEYXRldGltZShcbiAgICAgICAgdGhpcy5fYWRhcHRlci5nZXRZZWFyKHRoaXMuYWN0aXZlRGF0ZSksXG4gICAgICAgIHRoaXMuX2FkYXB0ZXIuZ2V0TW9udGgodGhpcy5hY3RpdmVEYXRlKSxcbiAgICAgICAgdGhpcy5fYWRhcHRlci5nZXREYXRlKHRoaXMuYWN0aXZlRGF0ZSksXG4gICAgICAgIHRoaXMuX2FkYXB0ZXIuZ2V0SG91cih0aGlzLmFjdGl2ZURhdGUpLFxuICAgICAgICBtaW51dGVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLl9hZGFwdGVyLmNsYW1wRGF0ZShuZXdWYWx1ZSwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpO1xuICAgICAgdGhpcy5hY3RpdmVEYXRlQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVEYXRlKTtcblxuICAgICAgaWYgKHRoaXMuYWN0aW9uc1BvcnRhbCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVEYXRlKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgcHJldmlvdXNseSB3ZSBkaWQgc2V0IFttdHhWYWx1ZV09XCI0MFwiIGFuZCB0aGUgaW5wdXQgY2hhbmdlZCB0byAzMCwgYW5kIHRoZSBjbGFtcGluZ1xuICAgICAgLy8gd2lsbCBtYWtlIGl0IFwiNDBcIiBhZ2FpbiB0aGVuIHRoZSBtaW51dGVJbnB1dERpcmVjdGl2ZSB3aWxsIG5vdCBoYXZlIGJlZW4gdXBkYXRlZFxuICAgICAgLy8gc2luY2UgXCI0MFwiID09PSBcIjQwXCIgc2FtZSByZWZlcmVuY2Ugc28gbm8gY2hhbmdlIGRldGVjdGVkIGJ5IGRpcmVjdGx5IHNldHRpbmcgaXQgd2l0aGluXG4gICAgICAvLyB0aGlzIGhhbmRsZXIsIHdlIGhhbmRsZSB0aGlzIHVzZWNhc2VcbiAgICAgIGlmICh0aGlzLm1pbnV0ZUlucHV0RGlyZWN0aXZlKSB7XG4gICAgICAgIHRoaXMubWludXRlSW5wdXREaXJlY3RpdmUudGltZVZhbHVlID0gdGhpcy5taW51dGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZUZvY3VzKGNsb2NrVmlldzogTXR4Q2xvY2tWaWV3KSB7XG4gICAgdGhpcy5jbG9ja1ZpZXcgPSBjbG9ja1ZpZXc7XG4gICAgdGhpcy5jbG9ja1ZpZXdDaGFuZ2UuZW1pdChjbG9ja1ZpZXcpO1xuICB9XG5cbiAgX3RpbWVTZWxlY3RlZChkYXRlOiBEKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xvY2tWaWV3ID09PSAnaG91cicpIHtcbiAgICAgIHRoaXMuY2xvY2tWaWV3ID0gJ21pbnV0ZSc7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSB0aGlzLnNlbGVjdGVkID0gZGF0ZTtcbiAgfVxuXG4gIF9vbkFjdGl2ZURhdGVDaGFuZ2UoZGF0ZTogRCkge1xuICAgIHRoaXMuX2FjdGl2ZURhdGUgPSBkYXRlO1xuICAgIHRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICB9XG5cbiAgX2hhbmRsZVNlbGVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5hY3Rpb25zUG9ydGFsICYmIHRoaXMuX3NlbGVjdGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5fc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIF9oYW5kbGVPaygpIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZCk7XG4gICAgfVxuICAgIHRoaXMuX3VzZXJTZWxlY3Rpb24uZW1pdCgpO1xuICB9XG5cbiAgX2hhbmRsZUNhbmNlbCgpIHtcbiAgICB0aGlzLl91c2VyU2VsZWN0aW9uLmVtaXQoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm10eC10aW1lLWlucHV0LXdyYXBwZXJcIj5cbiAgPGRpdiBjbGFzcz1cIm10eC10aW1lLWlucHV0LWlubmVyXCI+XG4gICAgPGlucHV0IGNsYXNzPVwibXR4LXRpbWUtaW5wdXRcIlxuICAgICAgW2NsYXNzLm10eC10aW1lLWlucHV0LWFjdGl2ZV09XCJjbG9ja1ZpZXcgPT09ICdob3VyJ1wiXG4gICAgICBbY2xhc3MubXR4LXRpbWUtaW5wdXQtd2FybmluZ109XCIhaG91cklucHV0LnZhbGlkXCJcbiAgICAgICNob3VySW5wdXQ9XCJtdHhUaW1lSW5wdXRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICBtYXhsZW5ndGg9XCIyXCJcbiAgICAgIFt0aW1lTWluXT1cInR3ZWx2ZWhvdXIgPyAxIDogMFwiXG4gICAgICBbdGltZU1heF09XCJ0d2VsdmVob3VyID8gMTIgOiAyM1wiXG4gICAgICBbdGltZVZhbHVlXT1cImhvdXJcIlxuICAgICAgKHRpbWVWYWx1ZUNoYW5nZWQpPVwiX2hhbmRsZUhvdXJJbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChmb2N1cyk9XCJfaGFuZGxlRm9jdXMoJ2hvdXInKVwiIC8+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXR4LXRpbWUtc2VwZXJhdG9yXCI+OjwvZGl2PlxuXG4gICAgPGlucHV0IGNsYXNzPVwibXR4LXRpbWUtaW5wdXRcIlxuICAgICAgW2NsYXNzLm10eC10aW1lLWlucHV0LWFjdGl2ZV09XCJjbG9ja1ZpZXcgPT09ICdtaW51dGUnXCJcbiAgICAgIFtjbGFzcy5tdHgtdGltZS1pbnB1dC13YXJuaW5nXT1cIiFtaW51dGVJbnB1dC52YWxpZFwiXG4gICAgICAjbWludXRlSW5wdXQ9XCJtdHhUaW1lSW5wdXRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICBtYXhsZW5ndGg9XCIyXCJcbiAgICAgIFt0aW1lTWluXT1cIjBcIlxuICAgICAgW3RpbWVNYXhdPVwiNTlcIlxuICAgICAgW3RpbWVWYWx1ZV09XCJtaW51dGVcIlxuICAgICAgKHRpbWVWYWx1ZUNoYW5nZWQpPVwiX2hhbmRsZU1pbnV0ZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgW3RpbWVJbnRlcnZhbF09XCJpbnRlcnZhbFwiXG4gICAgICAoZm9jdXMpPVwiX2hhbmRsZUZvY3VzKCdtaW51dGUnKVwiIC8+XG5cbiAgICBAaWYgKHR3ZWx2ZWhvdXIpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtdHgtdGltZS1hbXBtXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtdHgtdGltZS1hbVwiXG4gICAgICAgICAgW2NsYXNzLm10eC10aW1lLWFtcG0tYWN0aXZlXT1cIkFNUE0gPT09ICdBTSdcIiBhcmlhLWxhYmVsPVwiQU1cIlxuICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgKGNsaWNrKT1cImFtcG1DaGFuZ2UuZW1pdCgnQU0nKVwiPkFNPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtdHgtdGltZS1wbVwiXG4gICAgICAgICAgW2NsYXNzLm10eC10aW1lLWFtcG0tYWN0aXZlXT1cIkFNUE0gPT09ICdQTSdcIiBhcmlhLWxhYmVsPVwiUE1cIlxuICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgKGNsaWNrKT1cImFtcG1DaGFuZ2UuZW1pdCgnUE0nKVwiPlBNPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxtdHgtY2xvY2sgKHNlbGVjdGVkQ2hhbmdlKT1cIl90aW1lU2VsZWN0ZWQoJGV2ZW50KVwiXG4gIChhY3RpdmVEYXRlQ2hhbmdlKT1cIl9vbkFjdGl2ZURhdGVDaGFuZ2UoJGV2ZW50KVwiXG4gIChfdXNlclNlbGVjdGlvbik9XCJfaGFuZGxlU2VsZWN0aW9uKClcIlxuICBbQU1QTV09XCJBTVBNXCJcbiAgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlclwiXG4gIFthY3Rpb25CdXR0b25zXT1cIiEhYWN0aW9uc1BvcnRhbFwiXG4gIFtpbnRlcnZhbF09XCJpbnRlcnZhbFwiXG4gIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcbiAgW3NlbGVjdGVkXT1cInNlbGVjdGVkXCJcbiAgW3N0YXJ0Vmlld109XCJjbG9ja1ZpZXdcIlxuICBbdHdlbHZlaG91cl09XCJ0d2VsdmVob3VyXCI+XG48L210eC1jbG9jaz5cblxuQGlmICghYWN0aW9uc1BvcnRhbCkge1xuICA8ZGl2IGNsYXNzPVwibXR4LXRpbWUtYnV0dG9uLXdyYXBwZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwibXR4LXRpbWUtY2FuY2VsLWJ1dHRvblwiIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJfaGFuZGxlQ2FuY2VsKClcIj5cbiAgICAgIHt7IF9kYXRldGltZXBpY2tlckludGwuY2FuY2VsTGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwibXR4LXRpbWUtb2stYnV0dG9uXCIgbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIl9oYW5kbGVPaygpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJtaW51dGVJbnB1dERpcmVjdGl2ZT8uaW52YWxpZCB8fCBob3VySW5wdXREaXJlY3RpdmU/LmludmFsaWRcIj5cbiAgICAgIHt7IF9kYXRldGltZXBpY2tlckludGwub2tMYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbn1cbiJdfQ==
|