@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.
- package/autocomplete/autocomplete-base-element.js +1 -1
- package/autocomplete/autocomplete.component.js +1 -1
- package/{autocomplete-base-element-DFRA5eoY.js → autocomplete-base-element-DarHnnYC.js} +1 -1
- package/autocomplete.js +1 -1
- package/autocomplete.pure.js +1 -1
- package/custom-elements.json +24 -24
- package/date-input/date-input.component.js +1 -1
- package/{date-input.component-C6UN7HzO.js → date-input.component-B3f_GThS.js} +1 -1
- package/date-input.js +1 -1
- package/date-input.pure.js +1 -1
- package/development/autocomplete/autocomplete-base-element.js +1 -1
- package/development/autocomplete/autocomplete.component.js +1 -1
- package/development/autocomplete-base-element-YwfObJzm.js +678 -0
- package/development/autocomplete.js +1 -1
- package/development/autocomplete.pure.js +1 -1
- package/development/date-input/date-input.component.js +1 -1
- package/development/date-input.component-UP1afzgy.js +307 -0
- package/development/date-input.js +1 -1
- package/development/date-input.pure.js +1 -1
- package/development/form-field/form-field/form-field.component.js +1 -1
- package/development/form-field/form-field.js +1 -1
- package/development/form-field.component-DnUA6Uds.js +650 -0
- package/development/form-field.js +1 -1
- package/development/form-field.pure.js +1 -1
- package/development/select/select.component.js +1 -1
- package/development/select.component-Il_cpCFV.js +784 -0
- package/development/select.js +1 -1
- package/development/select.pure.js +1 -1
- package/development/time-input/time-input.component.js +1 -1
- package/development/time-input.component-XS0aJ6M7.js +191 -0
- package/development/time-input.js +1 -1
- package/development/time-input.pure.js +1 -1
- package/form-field/form-field/form-field.component.js +1 -1
- package/form-field/form-field.js +1 -1
- package/{form-field.component-BKjqLhmy.js → form-field.component-D2R9BpyQ.js} +1 -1
- package/form-field.js +1 -1
- package/form-field.pure.js +1 -1
- package/package.json +2 -2
- package/select/select.component.js +1 -1
- package/{select.component-A-TwBa65.js → select.component-DMzvfiNM.js} +1 -1
- package/select.js +1 -1
- package/select.pure.js +1 -1
- package/time-input/time-input.component.js +1 -1
- package/{time-input.component-KSyUufTP.js → time-input.component-Jv2xorV5.js} +1 -1
- package/time-input.js +1 -1
- package/time-input.pure.js +1 -1
- package/development/autocomplete-base-element-CNoHrX63.js +0 -678
- package/development/date-input.component-B7Eq5hCB.js +0 -307
- package/development/form-field.component-KEFq2rmY.js +0 -650
- package/development/select.component-DNMAVhaz.js +0 -784
- 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/LmdldFJhbmdlQXQoMCk7XG4gICAgcmV0dXJuICEhcmFuZ2UgJiYgcmFuZ2Uuc3RhcnRPZmZzZXQgIT09IHJhbmdlLmVuZE9mZnNldDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXRpbWUtaW5wdXQnOiBTYmJUaW1lSW5wdXRFbGVtZW50O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQ2dCQSxJQUFNLDJCQUEyQjtBQUNqQyxJQUFNLDhCQUE4QjtBQUNwQyxJQUFNLDZCQUE2QjtBQUNuQyxJQUFNLDBCQUEwQjs7OztJQVVuQiw2QkFBbUI7bUJBQVMsNEJBQTRCLFdBQVc7OztjQUFuRSw0QkFBNEIsWUFBdUM7OztrQ0EwQjdFLFNBQVMsRUFBRSxXQUFXLE9BQU8sQ0FBQyxDQUFBO0FBQy9CLGdCQUFBLE1BQUEsTUFBQSw2QkFBQTtJQUFBLE1BQUE7SUFBQSxNQUFBO0lBQUEsUUFBQTtJQUFBLFNBQUE7SUFBQSxRQUFBO0tBQUEsTUFBQSxRQUFBLGlCQUFBO0tBQUEsTUFBQSxLQUFBLFVBQUE7QUFBQSxVQUFXLGNBQVc7O0tBQUE7SUFBQSxVQUFBO0lBQUEsRUFBQSxNQUFBLDJCQUFBOzs7Ozs7Ozs7QUExQlUsUUFBQSxjQUFzQjs7O0FBQy9CLFFBQUEsU0FBeUIsVUFBVSxtQkFBTTs7Ozs7O0VBTWhFLElBQW9CLE1BQU0sT0FBYTtBQUNyQyxXQUNFLE9BQU8sVUFBVSxXQUNiLE1BQU0sUUFBUSw2QkFBNkIsR0FBRyxDQUFDLFVBQVUsR0FBRyxFQUFFLEdBQzlEO0FBQ04sUUFBSyxlQUFlLE1BQU07QUFHMUIsT0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLFFBQVEsU0FBUyxJQUFJLEtBQUssZ0JBQWdCLEtBQy9ELFNBQVEsS0FBSyxhQUFhO0FBRTVCLFNBQU0sUUFBUTs7RUFFaEIsSUFBb0IsUUFBSztBQUN2QixVQUFPLE1BQU0sU0FBUzs7O0VBS3hCLElBQVcsWUFBWSxNQUFpQjtBQUN0QyxPQUFJLGdCQUFnQixRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxFQUFFO0FBQ2xELFNBQUssZUFBZTtLQUNsQixPQUFPLEtBQUssVUFBVTtLQUN0QixTQUFTLEtBQUssWUFBQTtLQUNmO0lBQ0QsTUFBTSxpQkFBaUIsS0FBSyxhQUFhO0FBQ3pDLFFBQUksS0FBSyxVQUFVLGVBQ2pCLE1BQUssUUFBUTtVQUVWO0FBQ0wsU0FBSyxlQUFlO0FBQ3BCLFNBQUssUUFBUTs7O0VBR2pCLElBQVcsY0FBVztBQUNwQixPQUFJLEtBQUssZ0JBQWdCLEtBQUssYUFBYSxLQUFLLGFBQWEsRUFBRTtJQUM3RCxNQUFNLHVCQUFPLElBQUksS0FBSyxFQUFFO0FBQ3hCLFNBQUssU0FBUyxLQUFLLGFBQWEsTUFBTTtBQUN0QyxTQUFLLFdBQVcsS0FBSyxhQUFhLFFBQVE7QUFDMUMsV0FBTztTQUVQLFFBQU87O0VBYVgsY0FBQTtBQUNFLFVBQU87QUFYRCxRQUFBLGVBcERHLGtCQUFBLE1BQUEsMkJBQW1CO0FBNER0QixRQUFBLFlBQVksSUFBSSxzQkFBc0IsS0FBSztBQUlqRCxRQUFLLG1CQUFtQixnQkFBZ0IsS0FBSyx3QkFBd0IsRUFBRSxFQUFFLFNBQVMsTUFBTSxDQUFDO0FBQ3pGLFFBQUssbUJBQW1CLGdCQUN0QixpQkFBaUIsU0FBUyxvQkFBb0IsS0FBSyxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FDbkY7QUFDRCxRQUFLLG1CQUFtQixZQUFZLFVBQVUsS0FBSyxtQkFBbUIsTUFBTSxDQUFDOztFQUcvRCxvQkFBaUI7QUFDL0IsU0FBTSxtQkFBbUI7QUFDekIsUUFBSyxjQUFjO0FBQ25CLFFBQUssZ0JBQWdCOztFQUdQLHVCQUFvQjtBQUNsQyxTQUFNLHNCQUFzQjs7RUFHWCxrQkFBZTtBQUNoQyxRQUFLLGdCQUFnQjtHQUNyQixNQUFNLFlBQVksS0FBSyxnQkFBZ0IsT0FBTyxLQUFLLGFBQWEsR0FBRztBQUNuRSxRQUFLLFVBQVUsYUFBYSxXQUFXLEtBQUssTUFBTTs7RUFHNUMsZUFBZSxRQUFRLEtBQUssT0FBSztBQUN2QyxPQUFJLEtBQUssY0FBYyxPQUFPLE9BQU87QUFDbkMsU0FBSyxlQUFlLEtBQUssWUFBWSxNQUFNO0FBQzNDLFNBQUssY0FBYyxDQUFDLE9BQU8sS0FBSyxnQkFBZ0IsS0FBSzs7OztFQUtqRCxZQUFZLE9BQXlCO0dBQzNDLE1BQU0sZUFBZSxPQUFPLE1BQU07QUFDbEMsT0FBSSxDQUFDLGFBQ0gsUUFBTztHQUlULE1BQU0sUUFDSixhQUFhLE1BQU0sMkJBQTJCLElBQUksYUFBYSxNQUFNLHdCQUF3QjtBQUMvRixPQUFJLE1BQ0YsUUFBTztJQUFFLE9BQU8sQ0FBQyxNQUFNLE1BQU07SUFBRyxTQUFTLENBQUMsTUFBTSxNQUFNO0lBQUc7QUFHM0QsVUFBTzs7RUFHRCx5QkFBc0I7QUFDNUIsT0FBSSxLQUFLLGFBQWE7SUFDcEIsTUFBTSxnQkFBZ0IsS0FBSyxhQUFhO0FBQ3hDLFFBQUksS0FBSyxVQUFVLGNBQ2pCLE9BQU0sUUFBUTs7O0VBS1osY0FBVztHQUNqQixNQUFNLFFBQVEsS0FBSztBQUNuQixPQUFJLENBQUMsTUFDSCxRQUFPO0FBSVQsVUFBTyxHQUZPLE9BQU8sTUFBTSxVQUFVLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUV4QyxHQURDLE9BQU8sTUFBTSxZQUFZLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSTs7RUFJMUMsa0JBQWtCLE1BQVk7QUFDL0MsVUFBTyxLQUNKLFFBQVEsNkJBQTZCLEdBQUcsQ0FDeEMsVUFBVSxHQUFHLEtBQUssS0FBSyxhQUFhLFVBQVUsR0FBRzs7RUFHbkMsZUFBZSxNQUE2QjtBQUM3RCxVQUNFLE1BQU0sZUFBZSxLQUFLLElBQzFCO0lBQUM7SUFBZTtJQUFPO0lBQU87SUFBYSxDQUFDLFNBQVMsS0FBZTs7RUFJckQsV0FBUTtBQUN6QixTQUFNLFVBQVU7QUFDaEIsT0FBSSxDQUFDLEtBQUssTUFDUixNQUFLLHVCQUF1QjtZQUNuQixDQUFDLEtBQUssYUFDZixNQUFLLGdCQUFnQixZQUFZLGdCQUFnQixLQUFLLFNBQVMsU0FBUztZQUMvRCxDQUFDLEtBQUssYUFBYSxLQUFLLGFBQWEsQ0FDOUMsTUFBSyxnQkFBZ0IsaUJBQWlCLFlBQVksS0FBSyxTQUFTLFNBQVM7T0FFekUsTUFBSyx1QkFBdUI7O0VBSXhCLHdCQUFxQjtBQUMxQixJQUFDLFlBQVksZ0JBQTBCLENBQUMsU0FBUyxNQUFNLEtBQUssbUJBQW1CLEVBQUUsQ0FBQzs7O0VBSTdFLGFBQWEsTUFBVTtBQUM3QixVQUFPLEtBQUssUUFBUSxNQUFNLEtBQUssVUFBVTs7O0VBSW5DLG1CQUFtQixPQUFvQjtBQWdCN0MsT0FDRSxNQUFNLFdBQ04sTUFBTSxVQUNOLE1BQU0sV0FsQmM7SUFDcEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0QsQ0FNZSxTQUFTLE1BQU0sSUFBSSxJQUNoQyx5QkFBeUIsS0FBSyxNQUFNLElBQUksS0FBSyxLQUFLLE1BQU0sU0FBUyxLQUFLLEtBQUssZUFBZSxFQUUzRjtBQUdGLFNBQU0sZ0JBQWdCO0FBQ3RCLE9BQUksS0FBSyxNQUFNLFVBQVUsRUFDdkIsa0JBQWlCLFNBQVMsa0JBQWtCLEtBQUssVUFBVSxTQUFTOztFQUloRSxnQkFBYTtHQUNuQixNQUFNLFFBQVEsT0FBTyxjQUFjLEVBQUUsV0FBVyxFQUFFO0FBQ2xELFVBQU8sQ0FBQyxDQUFDLFNBQVMsTUFBTSxnQkFBZ0IsTUFBTSJ9
|