@sbb-esta/lyne-elements-dev 4.9.0-dev.1775050914 → 4.9.0-dev.1775054429

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.
Files changed (51) hide show
  1. package/autocomplete/autocomplete-base-element.js +1 -1
  2. package/autocomplete/autocomplete.component.js +1 -1
  3. package/{autocomplete-base-element-DFRA5eoY.js → autocomplete-base-element-DarHnnYC.js} +1 -1
  4. package/autocomplete.js +1 -1
  5. package/autocomplete.pure.js +1 -1
  6. package/custom-elements.json +24 -24
  7. package/date-input/date-input.component.js +1 -1
  8. package/{date-input.component-C6UN7HzO.js → date-input.component-B3f_GThS.js} +1 -1
  9. package/date-input.js +1 -1
  10. package/date-input.pure.js +1 -1
  11. package/development/autocomplete/autocomplete-base-element.js +1 -1
  12. package/development/autocomplete/autocomplete.component.js +1 -1
  13. package/development/autocomplete-base-element-YwfObJzm.js +678 -0
  14. package/development/autocomplete.js +1 -1
  15. package/development/autocomplete.pure.js +1 -1
  16. package/development/date-input/date-input.component.js +1 -1
  17. package/development/date-input.component-UP1afzgy.js +307 -0
  18. package/development/date-input.js +1 -1
  19. package/development/date-input.pure.js +1 -1
  20. package/development/form-field/form-field/form-field.component.js +1 -1
  21. package/development/form-field/form-field.js +1 -1
  22. package/development/form-field.component-DnUA6Uds.js +650 -0
  23. package/development/form-field.js +1 -1
  24. package/development/form-field.pure.js +1 -1
  25. package/development/select/select.component.js +1 -1
  26. package/development/select.component-Il_cpCFV.js +784 -0
  27. package/development/select.js +1 -1
  28. package/development/select.pure.js +1 -1
  29. package/development/time-input/time-input.component.js +1 -1
  30. package/development/time-input.component-XS0aJ6M7.js +191 -0
  31. package/development/time-input.js +1 -1
  32. package/development/time-input.pure.js +1 -1
  33. package/form-field/form-field/form-field.component.js +1 -1
  34. package/form-field/form-field.js +1 -1
  35. package/{form-field.component-BKjqLhmy.js → form-field.component-D2R9BpyQ.js} +1 -1
  36. package/form-field.js +1 -1
  37. package/form-field.pure.js +1 -1
  38. package/package.json +2 -2
  39. package/select/select.component.js +1 -1
  40. package/{select.component-A-TwBa65.js → select.component-DMzvfiNM.js} +1 -1
  41. package/select.js +1 -1
  42. package/select.pure.js +1 -1
  43. package/time-input/time-input.component.js +1 -1
  44. package/{time-input.component-KSyUufTP.js → time-input.component-Jv2xorV5.js} +1 -1
  45. package/time-input.js +1 -1
  46. package/time-input.pure.js +1 -1
  47. package/development/autocomplete-base-element-CNoHrX63.js +0 -678
  48. package/development/date-input.component-B7Eq5hCB.js +0 -307
  49. package/development/form-field.component-KEFq2rmY.js +0 -650
  50. package/development/select.component-DNMAVhaz.js +0 -784
  51. package/development/time-input.component-B4HBAe0K.js +0 -191
@@ -1,191 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { isServer, unsafeCSS } from "lit";
3
- import { property } from "lit/decorators.js";
4
- import { SbbElement } from "./core/base-elements.js";
5
- import { SbbFormAssociatedInputMixin } from "./core/mixins.js";
6
- import { SbbLanguageController } from "./core/controllers.js";
7
- import { i18nTimeInputChange, i18nTimeInvalid, i18nTimeMax, i18nTimeMaxLength } from "./core/i18n.js";
8
- import { sbbLiveAnnouncer } from "./core/a11y.js";
9
- //#region src/elements/time-input/time-input.scss?inline
10
- var time_input_default = ":host {\n display: inline-flex;\n min-width: var(--sbb-time-input-max-width);\n max-width: var(--sbb-time-input-max-width);\n cursor: text;\n align-items: center;\n}\n@media (forced-colors: active) {\n :host {\n color: FieldText;\n }\n}\n\n:host(:disabled) {\n cursor: var(--sbb-cursor-default);\n}\n\n:host(:focus) {\n text-overflow: initial !important;\n}\n\n:host(:empty)::after {\n content: attr(placeholder);\n color: var(--sbb-color-5);\n -webkit-text-fill-color: var(--sbb-color-5);\n opacity: 1;\n}\n@media (forced-colors: active) {\n :host(:empty)::after {\n color: GrayText;\n }\n}";
11
- //#endregion
12
- //#region src/elements/time-input/time-input.component.ts
13
- var REGEX_ALLOWED_CHARACTERS = /[0-9.:,\-;_hH]/;
14
- var REGEX_DISALLOWED_CHARACTERS = /[^0-9.:,\-;_hH]/g;
15
- var REGEX_GROUPS_WITHOUT_COLON = /^([0-9]{1,2})([0-9]{2})$/;
16
- var REGEX_GROUPS_WITH_COLON = /^([0-9]{1,2})?[.:,\-;_hH]?([0-9]{1,2})?$/;
17
- /**
18
- * Custom input for a time.
19
- */
20
- var SbbTimeInputElement = (() => {
21
- let _classSuper = SbbFormAssociatedInputMixin(SbbElement);
22
- let _instanceExtraInitializers = [];
23
- let _set_valueAsDate_decorators;
24
- return class SbbTimeInputElement extends _classSuper {
25
- static {
26
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
27
- _set_valueAsDate_decorators = [property({ attribute: false })];
28
- __esDecorate(this, null, _set_valueAsDate_decorators, {
29
- kind: "setter",
30
- name: "valueAsDate",
31
- static: false,
32
- private: false,
33
- access: {
34
- has: (obj) => "valueAsDate" in obj,
35
- set: (obj, value) => {
36
- obj.valueAsDate = value;
37
- }
38
- },
39
- metadata: _metadata
40
- }, null, _instanceExtraInitializers);
41
- if (_metadata) Object.defineProperty(this, Symbol.metadata, {
42
- enumerable: true,
43
- configurable: true,
44
- writable: true,
45
- value: _metadata
46
- });
47
- }
48
- static {
49
- this.elementName = "sbb-time-input";
50
- }
51
- static {
52
- this.styles = unsafeCSS(time_input_default);
53
- }
54
- /**
55
- * The value of the time input. Reflects the current text value
56
- * of this input.
57
- */
58
- set value(value) {
59
- value = typeof value === "string" ? value.replace(REGEX_DISALLOWED_CHARACTERS, "").substring(0, 5) : "";
60
- this._tryParseValue(value);
61
- if (!isServer && !this.matches(":focus") && this.valueAsDate !== null) value = this._formatTime();
62
- super.value = value;
63
- }
64
- get value() {
65
- return super.value ?? "";
66
- }
67
- /** Formats the current input's value as date. */
68
- set valueAsDate(date) {
69
- if (date instanceof Date && !isNaN(date.valueOf())) {
70
- this._valueAsTime = {
71
- hours: date.getHours(),
72
- minutes: date.getMinutes()
73
- };
74
- const formattedValue = this._formatTime();
75
- if (this.value !== formattedValue) this.value = formattedValue;
76
- } else {
77
- this._valueAsTime = null;
78
- this.value = "";
79
- }
80
- }
81
- get valueAsDate() {
82
- if (this._valueAsTime && this._isTimeValid(this._valueAsTime)) {
83
- const date = /* @__PURE__ */ new Date(0);
84
- date.setHours(this._valueAsTime.hours);
85
- date.setMinutes(this._valueAsTime.minutes);
86
- return date;
87
- } else return null;
88
- }
89
- constructor() {
90
- super();
91
- this._valueAsTime = __runInitializers(this, _instanceExtraInitializers);
92
- this._language = new SbbLanguageController(this);
93
- this.addEventListener?.("change", () => this._updateValueDateFormat(), { capture: true });
94
- this.addEventListener?.("change", () => sbbLiveAnnouncer.announce(i18nTimeInputChange(this.value)[this._language.current]));
95
- this.addEventListener?.("keydown", (event) => this._preventCharInsert(event));
96
- }
97
- connectedCallback() {
98
- super.connectedCallback();
99
- this.inputMode ||= "numeric";
100
- this.placeholder ||= "HH:MM";
101
- }
102
- disconnectedCallback() {
103
- super.disconnectedCallback();
104
- }
105
- updateFormValue() {
106
- this._tryParseValue();
107
- const formValue = this.valueAsDate !== null ? this._formatTime() : null;
108
- this.internals.setFormValue(formValue, this.value);
109
- }
110
- _tryParseValue(value = this.value) {
111
- if (this._valueCache?.[0] !== value) {
112
- this._valueAsTime = this._parseValue(value);
113
- this._valueCache = [value, this._valueAsTime ?? null];
114
- }
115
- }
116
- /** Validate input against the defined RegExps. */
117
- _parseValue(value) {
118
- const trimmedValue = value?.trim();
119
- if (!trimmedValue) return null;
120
- const match = trimmedValue.match(REGEX_GROUPS_WITHOUT_COLON) ?? trimmedValue.match(REGEX_GROUPS_WITH_COLON);
121
- if (match) return {
122
- hours: +match[1] || 0,
123
- minutes: +match[2] || 0
124
- };
125
- return null;
126
- }
127
- _updateValueDateFormat() {
128
- if (this.valueAsDate) {
129
- const formattedDate = this._formatTime();
130
- if (this.value !== formattedDate) super.value = formattedDate;
131
- }
132
- }
133
- _formatTime() {
134
- const value = this.valueAsDate;
135
- if (!value) return "";
136
- return `${String(value.getHours()).padStart(2, "0")}:${String(value.getMinutes()).padStart(2, "0")}`;
137
- }
138
- preparePastedText(text) {
139
- return text.replace(REGEX_DISALLOWED_CHARACTERS, "").substring(0, 5 - (this.textContent?.length ?? 0));
140
- }
141
- shouldValidate(name) {
142
- return super.shouldValidate(name) || [
143
- "valueAsDate",
144
- "min",
145
- "max",
146
- "dateFilter"
147
- ].includes(name);
148
- }
149
- validate() {
150
- super.validate();
151
- if (!this.value) this._removeValidityErrors();
152
- else if (!this._valueAsTime) this.setValidityFlag("badInput", i18nTimeInvalid[this.language.current]);
153
- else if (!this._isTimeValid(this._valueAsTime)) this.setValidityFlag("rangeOverflow", i18nTimeMax[this.language.current]);
154
- else this._removeValidityErrors();
155
- }
156
- _removeValidityErrors() {
157
- ["badInput", "rangeOverflow"].forEach((f) => this.removeValidityFlag(f));
158
- }
159
- /** Checks if values of hours and minutes are possible, to avoid non-existent times. */
160
- _isTimeValid(time) {
161
- return time.hours < 24 && time.minutes < 60;
162
- }
163
- /** Only allow typing numbers and separator keys. */
164
- _preventCharInsert(event) {
165
- if (event.ctrlKey || event.altKey || event.metaKey || [
166
- "Backspace",
167
- "Tab",
168
- "Enter",
169
- "ArrowUp",
170
- "ArrowDown",
171
- "ArrowLeft",
172
- "ArrowRight",
173
- "Home",
174
- "End",
175
- "PageUp",
176
- "PageDown",
177
- "Delete"
178
- ].includes(event.key) || REGEX_ALLOWED_CHARACTERS.test(event.key) && (this.value.length < 5 || this._hasSelection())) return;
179
- event.preventDefault();
180
- if (this.value.length >= 5) sbbLiveAnnouncer.announce(i18nTimeMaxLength[this._language.current]);
181
- }
182
- _hasSelection() {
183
- const range = window.getSelection()?.getRangeAt(0);
184
- return !!range && range.startOffset !== range.endOffset;
185
- }
186
- };
187
- })();
188
- //#endregion
189
- export { SbbTimeInputElement as t };
190
-
191
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1pbnB1dC5jb21wb25lbnQtQjRIQkFlMEsuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3RpbWUtaW5wdXQvdGltZS1pbnB1dC5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy90aW1lLWlucHV0L3RpbWUtaW5wdXQuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIkB1c2UgJy4uL2NvcmUvc3R5bGVzJyBhcyBzYmI7XG5cbjpob3N0IHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG5cbiAgLy8gV2l0aCBzYmItZm9ybS1maWVsZFt3aWR0aD1cImNvbGxhcHNlZFwiXSwgdGhlIGRlZmF1bHQgbWluIHdpZHRoIG9mIGFcbiAgLy8gYW4gaW5saW5lIGVsZW1lbnQgaXMgYmFzaWNhbGx5IG5vdGhpbmcgKGV4Y2VwdCBwb3RlbnRpYWxseSB0aGUgcGxhY2Vob2xkZXIpLlxuICAvLyBEdWUgdG8gdGhpcywgd2Ugc2V0IGEgbWluaW11bSB3aWR0aCBmb3IgdGhlIHRpbWUgaW5wdXQgZWxlbWVudC5cbiAgLy8gV2UgYWxzbyBjYW5ub3QgdXNlIHdpZHRoLCBhcyB0aGUgZm9ybSBmaWVsZCBvdmVyd3JpdGVzIHRoYXQgcHJvcGVydHkuXG4gIG1pbi13aWR0aDogdmFyKC0tc2JiLXRpbWUtaW5wdXQtbWF4LXdpZHRoKTtcblxuICAvLyBUaGUgdGltZSBpbnB1dCBhbHNvIGhhcyBhIHZlcnkgc3BlY2lmaWMgZGltZW5zaW9uLCBzbyB3ZSBhbHNvIHNldCB0aGUgbWF4aW11bSB3aWR0aC5cbiAgbWF4LXdpZHRoOiB2YXIoLS1zYmItdGltZS1pbnB1dC1tYXgtd2lkdGgpO1xuICBjdXJzb3I6IHRleHQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgIGNvbG9yOiBGaWVsZFRleHQ7XG4gIH1cbn1cblxuOmhvc3QoOmRpc2FibGVkKSB7XG4gIGN1cnNvcjogdmFyKC0tc2JiLWN1cnNvci1kZWZhdWx0KTtcbn1cblxuOmhvc3QoOmZvY3VzKSB7XG4gIHRleHQtb3ZlcmZsb3c6IGluaXRpYWwgIWltcG9ydGFudDtcbn1cblxuOmhvc3QoOmVtcHR5KTo6YWZ0ZXIge1xuICBjb250ZW50OiBhdHRyKHBsYWNlaG9sZGVyKTtcbiAgQGluY2x1ZGUgc2JiLnBsYWNlaG9sZGVyO1xuICBAaW5jbHVkZSBzYmIuaWYtZm9yY2VkLWNvbG9ycyB7XG4gICAgY29sb3I6IEdyYXlUZXh0O1xuICB9XG59XG4iLCJpbXBvcnQgeyB0eXBlIENTU1Jlc3VsdEdyb3VwLCBpc1NlcnZlciwgdW5zYWZlQ1NTIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBzYmJMaXZlQW5ub3VuY2VyIH0gZnJvbSAnLi4vY29yZS9hMTF5LnRzJztcbmltcG9ydCB7IFNiYkVsZW1lbnQgfSBmcm9tICcuLi9jb3JlL2Jhc2UtZWxlbWVudHMudHMnO1xuaW1wb3J0IHsgU2JiTGFuZ3VhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29yZS9jb250cm9sbGVycy50cyc7XG5pbXBvcnQge1xuICBpMThuVGltZUlucHV0Q2hhbmdlLFxuICBpMThuVGltZUludmFsaWQsXG4gIGkxOG5UaW1lTWF4LFxuICBpMThuVGltZU1heExlbmd0aCxcbn0gZnJvbSAnLi4vY29yZS9pMThuLnRzJztcbmltcG9ydCB7IFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRNaXhpbiB9IGZyb20gJy4uL2NvcmUvbWl4aW5zLnRzJztcblxuaW1wb3J0IHN0eWxlIGZyb20gJy4vdGltZS1pbnB1dC5zY3NzP2lubGluZSc7XG5cbmNvbnN0IFJFR0VYX0FMTE9XRURfQ0hBUkFDVEVSUyA9IC9bMC05LjosXFwtO19oSF0vO1xuY29uc3QgUkVHRVhfRElTQUxMT1dFRF9DSEFSQUNURVJTID0gL1teMC05LjosXFwtO19oSF0vZztcbmNvbnN0IFJFR0VYX0dST1VQU19XSVRIT1VUX0NPTE9OID0gL14oWzAtOV17MSwyfSkoWzAtOV17Mn0pJC87XG5jb25zdCBSRUdFWF9HUk9VUFNfV0lUSF9DT0xPTiA9IC9eKFswLTldezEsMn0pP1suOixcXC07X2hIXT8oWzAtOV17MSwyfSk/JC87XG5cbmludGVyZmFjZSBUaW1lIHtcbiAgaG91cnM6IG51bWJlcjtcbiAgbWludXRlczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEN1c3RvbSBpbnB1dCBmb3IgYSB0aW1lLlxuICovXG5leHBvcnQgY2xhc3MgU2JiVGltZUlucHV0RWxlbWVudCBleHRlbmRzIFNiYkZvcm1Bc3NvY2lhdGVkSW5wdXRNaXhpbihTYmJFbGVtZW50KSB7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZWxlbWVudE5hbWU6IHN0cmluZyA9ICdzYmItdGltZS1pbnB1dCc7XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHVuc2FmZUNTUyhzdHlsZSk7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgdGltZSBpbnB1dC4gUmVmbGVjdHMgdGhlIGN1cnJlbnQgdGV4dCB2YWx1ZVxuICAgKiBvZiB0aGlzIGlucHV0LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFsdWUgPVxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IHZhbHVlLnJlcGxhY2UoUkVHRVhfRElTQUxMT1dFRF9DSEFSQUNURVJTLCAnJykuc3Vic3RyaW5nKDAsIDUpXG4gICAgICAgIDogJyc7XG4gICAgdGhpcy5fdHJ5UGFyc2VWYWx1ZSh2YWx1ZSk7XG4gICAgLy8gQXMgbG9uZyBhcyB0aGlzIGVsZW1lbnQgaGFzIGZvY3VzIHdlIGRlbGF5IGF1dG9tYXRpY2FsbHkgdXBkYXRpbmdcbiAgICAvLyB0aGUgdmFsdWUgd2l0aCB0aGUgZm9ybWF0dGVkIHN0cmluZyBvZiB0aGUgcGFyc2VkIGRhdGUuXG4gICAgaWYgKCFpc1NlcnZlciAmJiAhdGhpcy5tYXRjaGVzKCc6Zm9jdXMnKSAmJiB0aGlzLnZhbHVlQXNEYXRlICE9PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuX2Zvcm1hdFRpbWUoKTtcbiAgICB9XG4gICAgc3VwZXIudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbHVlID8/ICcnO1xuICB9XG5cbiAgLyoqIEZvcm1hdHMgdGhlIGN1cnJlbnQgaW5wdXQncyB2YWx1ZSBhcyBkYXRlLiAqL1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBzZXQgdmFsdWVBc0RhdGUoZGF0ZTogRGF0ZSB8IG51bGwpIHtcbiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKGRhdGUudmFsdWVPZigpKSkge1xuICAgICAgdGhpcy5fdmFsdWVBc1RpbWUgPSB7XG4gICAgICAgIGhvdXJzOiBkYXRlLmdldEhvdXJzKCksXG4gICAgICAgIG1pbnV0ZXM6IGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5fZm9ybWF0VGltZSgpO1xuICAgICAgaWYgKHRoaXMudmFsdWUgIT09IGZvcm1hdHRlZFZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVBc1RpbWUgPSBudWxsO1xuICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlQXNEYXRlKCk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAodGhpcy5fdmFsdWVBc1RpbWUgJiYgdGhpcy5faXNUaW1lVmFsaWQodGhpcy5fdmFsdWVBc1RpbWUpKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgICBkYXRlLnNldEhvdXJzKHRoaXMuX3ZhbHVlQXNUaW1lLmhvdXJzKTtcbiAgICAgIGRhdGUuc2V0TWludXRlcyh0aGlzLl92YWx1ZUFzVGltZS5taW51dGVzKTtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWVBc1RpbWU/OiBUaW1lIHwgbnVsbDtcblxuICAvKipcbiAgICogU3RvcmVzIHRoZSBsYXN0IHN0cmluZyBhbmQgcGFyc2VkIGRhdGUgb2JqZWN0IHZhbHVlIHRvIHByZXZlbnQgcmVwZWF0ZWRcbiAgICogcGFyc2luZyBvZiB0aGUgc3RyaW5nIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsdWVDYWNoZT86IFtzdHJpbmcsIFRpbWUgfCBudWxsXTtcblxuICBwcml2YXRlIF9sYW5ndWFnZSA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NoYW5nZScsICgpID0+IHRoaXMuX3VwZGF0ZVZhbHVlRGF0ZUZvcm1hdCgpLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NoYW5nZScsICgpID0+XG4gICAgICBzYmJMaXZlQW5ub3VuY2VyLmFubm91bmNlKGkxOG5UaW1lSW5wdXRDaGFuZ2UodGhpcy52YWx1ZSlbdGhpcy5fbGFuZ3VhZ2UuY3VycmVudF0pLFxuICAgICk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2tleWRvd24nLCAoZXZlbnQpID0+IHRoaXMuX3ByZXZlbnRDaGFySW5zZXJ0KGV2ZW50KSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmlucHV0TW9kZSB8fD0gJ251bWVyaWMnO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgfHw9ICdISDpNTSc7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5fdHJ5UGFyc2VWYWx1ZSgpO1xuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMudmFsdWVBc0RhdGUgIT09IG51bGwgPyB0aGlzLl9mb3JtYXRUaW1lKCkgOiBudWxsO1xuICAgIHRoaXMuaW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtVmFsdWUsIHRoaXMudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJ5UGFyc2VWYWx1ZSh2YWx1ZSA9IHRoaXMudmFsdWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdmFsdWVDYWNoZT8uWzBdICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWVBc1RpbWUgPSB0aGlzLl9wYXJzZVZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuX3ZhbHVlQ2FjaGUgPSBbdmFsdWUsIHRoaXMuX3ZhbHVlQXNUaW1lID8/IG51bGxdO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBpbnB1dCBhZ2FpbnN0IHRoZSBkZWZpbmVkIFJlZ0V4cHMuICovXG4gIHByaXZhdGUgX3BhcnNlVmFsdWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRpbWUgfCBudWxsIHtcbiAgICBjb25zdCB0cmltbWVkVmFsdWUgPSB2YWx1ZT8udHJpbSgpO1xuICAgIGlmICghdHJpbW1lZFZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IHRoZSBpbnB1dCBpcyAzIG9yIDQgZGlnaXRzOyBzcGxpdCBsaWtlOiBBQj86Q0RcbiAgICBjb25zdCBtYXRjaCA9XG4gICAgICB0cmltbWVkVmFsdWUubWF0Y2goUkVHRVhfR1JPVVBTX1dJVEhPVVRfQ09MT04pID8/IHRyaW1tZWRWYWx1ZS5tYXRjaChSRUdFWF9HUk9VUFNfV0lUSF9DT0xPTik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4geyBob3VyczogK21hdGNoWzFdIHx8IDAsIG1pbnV0ZXM6ICttYXRjaFsyXSB8fCAwIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWYWx1ZURhdGVGb3JtYXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsdWVBc0RhdGUpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLl9mb3JtYXRUaW1lKCk7XG4gICAgICBpZiAodGhpcy52YWx1ZSAhPT0gZm9ybWF0dGVkRGF0ZSkge1xuICAgICAgICBzdXBlci52YWx1ZSA9IGZvcm1hdHRlZERhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZm9ybWF0VGltZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZUFzRGF0ZTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IGhvdXJzID0gU3RyaW5nKHZhbHVlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgbWludXRlcyA9IFN0cmluZyh2YWx1ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke2hvdXJzfToke21pbnV0ZXN9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwcmVwYXJlUGFzdGVkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZShSRUdFWF9ESVNBTExPV0VEX0NIQVJBQ1RFUlMsICcnKVxuICAgICAgLnN1YnN0cmluZygwLCA1IC0gKHRoaXMudGV4dENvbnRlbnQ/Lmxlbmd0aCA/PyAwKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkVmFsaWRhdGUobmFtZTogUHJvcGVydHlLZXkgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuc2hvdWxkVmFsaWRhdGUobmFtZSkgfHxcbiAgICAgIFsndmFsdWVBc0RhdGUnLCAnbWluJywgJ21heCcsICdkYXRlRmlsdGVyJ10uaW5jbHVkZXMobmFtZSBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB2YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBzdXBlci52YWxpZGF0ZSgpO1xuICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5fcmVtb3ZlVmFsaWRpdHlFcnJvcnMoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl92YWx1ZUFzVGltZSkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoJ2JhZElucHV0JywgaTE4blRpbWVJbnZhbGlkW3RoaXMubGFuZ3VhZ2UuY3VycmVudF0pO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzVGltZVZhbGlkKHRoaXMuX3ZhbHVlQXNUaW1lKSkge1xuICAgICAgdGhpcy5zZXRWYWxpZGl0eUZsYWcoJ3JhbmdlT3ZlcmZsb3cnLCBpMThuVGltZU1heFt0aGlzLmxhbmd1YWdlLmN1cnJlbnRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVtb3ZlVmFsaWRpdHlFcnJvcnMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVWYWxpZGl0eUVycm9ycygpOiB2b2lkIHtcbiAgICAoWydiYWRJbnB1dCcsICdyYW5nZU92ZXJmbG93J10gYXMgY29uc3QpLmZvckVhY2goKGYpID0+IHRoaXMucmVtb3ZlVmFsaWRpdHlGbGFnKGYpKTtcbiAgfVxuXG4gIC8qKiBDaGVja3MgaWYgdmFsdWVzIG9mIGhvdXJzIGFuZCBtaW51dGVzIGFyZSBwb3NzaWJsZSwgdG8gYXZvaWQgbm9uLWV4aXN0ZW50IHRpbWVzLiAqL1xuICBwcml2YXRlIF9pc1RpbWVWYWxpZCh0aW1lOiBUaW1lKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRpbWUuaG91cnMgPCAyNCAmJiB0aW1lLm1pbnV0ZXMgPCA2MDtcbiAgfVxuXG4gIC8qKiAgT25seSBhbGxvdyB0eXBpbmcgbnVtYmVycyBhbmQgc2VwYXJhdG9yIGtleXMuICovXG4gIHByaXZhdGUgX3ByZXZlbnRDaGFySW5zZXJ0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgYWx3YXlzQWxsb3dlZCA9IFtcbiAgICAgICdCYWNrc3BhY2UnLFxuICAgICAgJ1RhYicsXG4gICAgICAnRW50ZXInLFxuICAgICAgJ0Fycm93VXAnLFxuICAgICAgJ0Fycm93RG93bicsXG4gICAgICAnQXJyb3dMZWZ0JyxcbiAgICAgICdBcnJvd1JpZ2h0JyxcbiAgICAgICdIb21lJyxcbiAgICAgICdFbmQnLFxuICAgICAgJ1BhZ2VVcCcsXG4gICAgICAnUGFnZURvd24nLFxuICAgICAgJ0RlbGV0ZScsXG4gICAgXTtcblxuICAgIGlmIChcbiAgICAgIGV2ZW50LmN0cmxLZXkgfHxcbiAgICAgIGV2ZW50LmFsdEtleSB8fFxuICAgICAgZXZlbnQubWV0YUtleSB8fFxuICAgICAgYWx3YXlzQWxsb3dlZC5pbmNsdWRlcyhldmVudC5rZXkpIHx8XG4gICAgICAoUkVHRVhfQUxMT1dFRF9DSEFSQUNURVJTLnRlc3QoZXZlbnQua2V5KSAmJiAodGhpcy52YWx1ZS5sZW5ndGggPCA1IHx8IHRoaXMuX2hhc1NlbGVjdGlvbigpKSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLnZhbHVlLmxlbmd0aCA+PSA1KSB7XG4gICAgICBzYmJMaXZlQW5ub3VuY2VyLmFubm91bmNlKGkxOG5UaW1lTWF4TGVuZ3RoW3RoaXMuX2xhbmd1YWdlLmN1cnJlbnRdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmFuZ2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LmdldFJhbmdlQXQoMCk7XG4gICAgcmV0dXJuICEhcmFuZ2UgJiYgcmFuZ2Uuc3RhcnRPZmZzZXQgIT09IHJhbmdlLmVuZE9mZnNldDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRpbWUtaW5wdXQnOiBTYmJUaW1lSW5wdXRFbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQ2dCQSxJQUFNLDJCQUEyQjtBQUNqQyxJQUFNLDhCQUE4QjtBQUNwQyxJQUFNLDZCQUE2QjtBQUNuQyxJQUFNLDBCQUEwQjs7OztJQVVuQiw2QkFBbUI7bUJBQVMsNEJBQTRCLFdBQVc7OztjQUFuRSw0QkFBNEIsWUFBdUM7OztrQ0EwQjdFLFNBQVMsRUFBRSxXQUFXLE9BQU8sQ0FBQyxDQUFBO0FBQy9CLGdCQUFBLE1BQUEsTUFBQSw2QkFBQTtJQUFBLE1BQUE7SUFBQSxNQUFBO0lBQUEsUUFBQTtJQUFBLFNBQUE7SUFBQSxRQUFBO0tBQUEsTUFBQSxRQUFBLGlCQUFBO0tBQUEsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFXLGNBQVc7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSxNQUFBLDJCQUFBOzs7Ozs7Ozs7QUExQlUsUUFBQSxjQUFzQjs7O0FBQy9CLFFBQUEsU0FBeUIsVUFBVSxtQkFBTTs7Ozs7O0VBTWhFLElBQW9CLE1BQU0sT0FBYTtBQUNyQyxXQUNFLE9BQU8sVUFBVSxXQUNiLE1BQU0sUUFBUSw2QkFBNkIsR0FBRyxDQUFDLFVBQVUsR0FBRyxF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