@sbb-esta/lyne-elements-dev 4.9.0-dev.1774601733 → 4.9.0-dev.1774848187
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/core/styles/core.scss +13 -65
- package/core.css +37 -34
- package/development/sidebar/sidebar/sidebar.component.js +1 -1
- package/development/sidebar/sidebar-content/sidebar-content.component.js +1 -1
- package/development/sidebar/sidebar-content.js +1 -1
- package/development/sidebar/sidebar-title/sidebar-title.component.js +1 -1
- package/development/sidebar/sidebar-title.js +1 -1
- package/development/sidebar/sidebar.js +1 -1
- package/development/{sidebar-content.component-rgVbuDj-.js → sidebar-content.component-6oadojLp.js} +4 -4
- package/development/{sidebar-title.component-BFkOaVcL.js → sidebar-title.component-DU-ZLEU0.js} +3 -3
- package/development/sidebar.component-BmLRuuec.js +506 -0
- package/development/sidebar.js +3 -3
- package/development/sidebar.pure.js +3 -3
- package/off-brand-theme.css +37 -34
- package/package.json +2 -2
- package/safety-theme.css +37 -34
- package/sidebar/sidebar/sidebar.component.js +1 -1
- package/sidebar/sidebar-content/sidebar-content.component.js +1 -1
- package/sidebar/sidebar-content.js +1 -1
- package/sidebar/sidebar-title/sidebar-title.component.js +1 -1
- package/sidebar/sidebar-title.js +1 -1
- package/sidebar/sidebar.js +1 -1
- package/{sidebar-content.component-da7RYWO6.js → sidebar-content.component-BYmmHoc5.js} +1 -1
- package/{sidebar-title.component-CjWUiisH.js → sidebar-title.component-lEdsEEMO.js} +1 -1
- package/{sidebar.component-Cde1EWDT.js → sidebar.component-BkTSnoNM.js} +2 -2
- package/sidebar.js +3 -3
- package/sidebar.pure.js +3 -3
- package/standard-theme.css +37 -34
- package/development/sidebar.component-hkvDm_fC.js +0 -506
|
@@ -1,506 +0,0 @@
|
|
|
1
|
-
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
-
import { css, html, isServer } from "lit";
|
|
3
|
-
import { eventOptions, property } from "lit/decorators.js";
|
|
4
|
-
import { SbbOpenCloseBaseElement } from "./core/base-elements.js";
|
|
5
|
-
import { forceType, handleDistinctChange } from "./core/decorators.js";
|
|
6
|
-
import { isZeroAnimationDuration } from "./core/dom.js";
|
|
7
|
-
import { SbbAnimationCompleteMixin } from "./core/mixins.js";
|
|
8
|
-
import { boxSizingStyles } from "./core/styles.js";
|
|
9
|
-
import { SbbEscapableOverlayController } from "./core/controllers.js";
|
|
10
|
-
import { ResizeController } from "@lit-labs/observers/resize-controller.js";
|
|
11
|
-
import { SbbFocusTrapController } from "./core/a11y.js";
|
|
12
|
-
//#region src/elements/sidebar/sidebar/sidebar.scss?lit&inline
|
|
13
|
-
var sidebar_default = css`:host {
|
|
14
|
-
display: block;
|
|
15
|
-
width: 20rem;
|
|
16
|
-
--sbb-link-text-decoration-line: none;
|
|
17
|
-
--sbb-sidebar-background-color: var(--sbb-background-color-1);
|
|
18
|
-
--sbb-sidebar-title-padding-block: var(--sbb-spacing-fixed-3x);
|
|
19
|
-
--sbb-sidebar-padding: var(--sbb-spacing-responsive-xs);
|
|
20
|
-
--sbb-sidebar-scrollbar-placeholder-width: var(--sbb-spacing-fixed-3x);
|
|
21
|
-
--sbb-sidebar-border-radius: var(--sbb-border-radius-8x);
|
|
22
|
-
--sbb-sidebar-margin: var(--sbb-spacing-fixed-3x);
|
|
23
|
-
--sbb-sidebar-title-gap: var(--sbb-spacing-fixed-2x);
|
|
24
|
-
--sbb-sidebar__margin: 0;
|
|
25
|
-
--sbb-sidebar__margin-block-start: var(--sbb-sidebar-margin);
|
|
26
|
-
--sbb-sidebar__translate-x: -100%;
|
|
27
|
-
--sbb-sidebar__z-index: 2;
|
|
28
|
-
--sbb-sidebar__padding-inline-end: var(--sbb-sidebar-padding);
|
|
29
|
-
--sbb-sidebar__padding-block-start: var(--sbb-sidebar-padding);
|
|
30
|
-
--sbb-sidebar__border-radius-start: var(--sbb-sidebar-border-radius);
|
|
31
|
-
--sbb-sidebar__border-radius-end: 0;
|
|
32
|
-
--sbb-sidebar__close-button-size: var(--sbb-size-element-xs);
|
|
33
|
-
}
|
|
34
|
-
@supports (scrollbar-gutter: stable) and (not (-webkit-touch-callout: none)) {
|
|
35
|
-
:host {
|
|
36
|
-
--sbb-sidebar__padding-inline-end: calc(
|
|
37
|
-
var(--sbb-sidebar-padding) - var(--sbb-sidebar-scrollbar-placeholder-width)
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
:host([color=milk]) {
|
|
43
|
-
--sbb-sidebar-background-color: var(--sbb-background-color-3);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
:host(:is([mode=over], :is(:state(mode-over-forced),[state--mode-over-forced]):not(:is(:state(mode-over-forced-closing),[state--mode-over-forced-closing])))) {
|
|
47
|
-
--sbb-sidebar__margin: var(--sbb-sidebar-margin);
|
|
48
|
-
--sbb-sidebar__border-radius-end: var(--sbb-sidebar-border-radius);
|
|
49
|
-
--sbb-sidebar__z-index: 3;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
:host(:is(:dir(rtl), [position=end])) {
|
|
53
|
-
--sbb-sidebar__translate-x: 100%;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
:host(:dir(rtl)[position=end]) {
|
|
57
|
-
--sbb-sidebar__translate-x: -100%;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.sbb-sidebar {
|
|
61
|
-
width: inherit;
|
|
62
|
-
max-width: calc(100% - 2 * var(--sbb-sidebar__margin));
|
|
63
|
-
background-color: var(--sbb-sidebar-background-color);
|
|
64
|
-
display: flex;
|
|
65
|
-
flex-direction: column;
|
|
66
|
-
position: absolute;
|
|
67
|
-
overflow: hidden;
|
|
68
|
-
inset-block: 0;
|
|
69
|
-
z-index: var(--sbb-sidebar__z-index);
|
|
70
|
-
border-start-start-radius: var(--sbb-sidebar__border-radius-start);
|
|
71
|
-
border-start-end-radius: var(--sbb-sidebar__border-radius-start);
|
|
72
|
-
border-end-start-radius: var(--sbb-sidebar__border-radius-end);
|
|
73
|
-
border-end-end-radius: var(--sbb-sidebar__border-radius-end);
|
|
74
|
-
margin: var(--sbb-sidebar__margin);
|
|
75
|
-
margin-block-start: var(--sbb-sidebar__margin-block-start);
|
|
76
|
-
transition-duration: var(--sbb-sidebar-container-animation-duration);
|
|
77
|
-
transition-timing-function: var(--sbb-sidebar-container-animation-easing);
|
|
78
|
-
transition-property: width, translate;
|
|
79
|
-
translate: none;
|
|
80
|
-
}
|
|
81
|
-
:host([position=end]) .sbb-sidebar {
|
|
82
|
-
inset-inline-end: 0;
|
|
83
|
-
}
|
|
84
|
-
:host(:is(:state(state-closed),[state--state-closed])) .sbb-sidebar {
|
|
85
|
-
visibility: hidden;
|
|
86
|
-
}
|
|
87
|
-
:host(:is(:is(:state(state-closing),[state--state-closing]), :is(:state(state-closed),[state--state-closed]))) .sbb-sidebar {
|
|
88
|
-
translate: var(--sbb-sidebar__translate-x) 0;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
.sbb-sidebar-title-section {
|
|
92
|
-
display: flex;
|
|
93
|
-
width: 100%;
|
|
94
|
-
gap: var(--sbb-sidebar-title-gap);
|
|
95
|
-
background-color: var(--sbb-sidebar-background-color);
|
|
96
|
-
padding-inline: var(--sbb-sidebar-padding);
|
|
97
|
-
transition: box-shadow var(--sbb-animation-easing) var(--sbb-sidebar-container-animation-duration);
|
|
98
|
-
box-shadow: none;
|
|
99
|
-
}
|
|
100
|
-
:host(:is(:state(scrolled),[state--scrolled])) .sbb-sidebar-title-section {
|
|
101
|
-
box-shadow: var(--sbb-box-shadow-level-5-soft);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
.sbb-sidebar-content-section {
|
|
105
|
-
--sbb-scrollbar-thumb-width: 0.125rem;
|
|
106
|
-
--sbb-scrollbar-thumb-width-hover: 0.25rem;
|
|
107
|
-
--sbb-scrollbar-width-firefox: thin;
|
|
108
|
-
--sbb-scrollbar-color: color-mix(in srgb, var(--sbb-color-black) 30%, transparent);
|
|
109
|
-
--sbb-scrollbar-color: light-dark(
|
|
110
|
-
color-mix(in srgb, var(--sbb-color-black) 30%, transparent),
|
|
111
|
-
color-mix(in srgb, var(--sbb-color-white) 30%, transparent)
|
|
112
|
-
);
|
|
113
|
-
--sbb-scrollbar-color-hover: color-mix(in srgb, var(--sbb-color-black) 60%, transparent);
|
|
114
|
-
--sbb-scrollbar-color-hover: light-dark(
|
|
115
|
-
color-mix(in srgb, var(--sbb-color-black) 60%, transparent),
|
|
116
|
-
color-mix(in srgb, var(--sbb-color-white) 60%, transparent)
|
|
117
|
-
);
|
|
118
|
-
--sbb-scrollbar-track-color: transparent;
|
|
119
|
-
--sbb-scrollbar-width: var(--sbb-spacing-fixed-3x);
|
|
120
|
-
}
|
|
121
|
-
.sbb-sidebar-content-section::-webkit-scrollbar {
|
|
122
|
-
width: var(--sbb-scrollbar-width);
|
|
123
|
-
height: var(--sbb-scrollbar-width);
|
|
124
|
-
background-color: var(--sbb-scrollbar-track-color, transparent);
|
|
125
|
-
}
|
|
126
|
-
.sbb-sidebar-content-section::-webkit-scrollbar-corner {
|
|
127
|
-
background-color: var(--sbb-scrollbar-track-color, transparent);
|
|
128
|
-
}
|
|
129
|
-
.sbb-sidebar-content-section::-webkit-scrollbar-thumb {
|
|
130
|
-
background-color: var(--sbb-scrollbar-color, currentcolor);
|
|
131
|
-
border: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width))) solid transparent;
|
|
132
|
-
border-radius: var(--sbb-border-radius-4x);
|
|
133
|
-
background-clip: padding-box;
|
|
134
|
-
}
|
|
135
|
-
.sbb-sidebar-content-section::-webkit-scrollbar-thumb:hover {
|
|
136
|
-
background-color: var(--sbb-scrollbar-color-hover, currentcolor);
|
|
137
|
-
border-width: calc(0.5 * (var(--sbb-scrollbar-width) - var(--sbb-scrollbar-thumb-width-hover)));
|
|
138
|
-
}
|
|
139
|
-
.sbb-sidebar-content-section::-webkit-scrollbar-button, .sbb-sidebar-content-section::-webkit-scrollbar-corner {
|
|
140
|
-
display: none;
|
|
141
|
-
}
|
|
142
|
-
@supports not selector(::-webkit-scrollbar) {
|
|
143
|
-
.sbb-sidebar-content-section {
|
|
144
|
-
scrollbar-width: var(--sbb-scrollbar-width-firefox);
|
|
145
|
-
scrollbar-color: var(--sbb-scrollbar-color, currentcolor) var(--sbb-scrollbar-track-color, transparent);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
.sbb-sidebar-content-section {
|
|
149
|
-
padding-block-start: var(--sbb-sidebar__padding-block-start);
|
|
150
|
-
padding-inline: var(--sbb-sidebar-padding) var(--sbb-sidebar__padding-inline-end);
|
|
151
|
-
overflow-y: auto;
|
|
152
|
-
flex-grow: 1;
|
|
153
|
-
outline-color: var(--sbb-focus-outline-color);
|
|
154
|
-
}
|
|
155
|
-
@supports (scrollbar-gutter: stable) {
|
|
156
|
-
.sbb-sidebar-content-section {
|
|
157
|
-
scrollbar-gutter: stable;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
::slotted(sbb-sidebar-title) {
|
|
162
|
-
flex-grow: 1;
|
|
163
|
-
margin-block: var(--sbb-sidebar-title-padding-block);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
::slotted(sbb-sidebar-close-button) {
|
|
167
|
-
order: 1;
|
|
168
|
-
margin-inline-end: calc(-1 * (var(--sbb-sidebar-padding) - var(--sbb-sidebar-title-padding-block)));
|
|
169
|
-
margin-block: var(--sbb-sidebar-title-padding-block);
|
|
170
|
-
inset-inline-end: var(--sbb-sidebar-padding);
|
|
171
|
-
}`;
|
|
172
|
-
//#endregion
|
|
173
|
-
//#region src/elements/sidebar/sidebar/sidebar.component.ts
|
|
174
|
-
/**
|
|
175
|
-
* This component corresponds to a sidebar that can be opened on the sidebar container.
|
|
176
|
-
*
|
|
177
|
-
* @slot - Use the unnamed slot to slot any content into the sidebar.
|
|
178
|
-
* @slot title - Use the title slot to add an <sbb-title>.
|
|
179
|
-
*/
|
|
180
|
-
var SbbSidebarElement = (() => {
|
|
181
|
-
let _classSuper = SbbAnimationCompleteMixin(SbbOpenCloseBaseElement);
|
|
182
|
-
let _instanceExtraInitializers = [];
|
|
183
|
-
let _color_decorators;
|
|
184
|
-
let _color_initializers = [];
|
|
185
|
-
let _color_extraInitializers = [];
|
|
186
|
-
let _mode_decorators;
|
|
187
|
-
let _mode_initializers = [];
|
|
188
|
-
let _mode_extraInitializers = [];
|
|
189
|
-
let _position_decorators;
|
|
190
|
-
let _position_initializers = [];
|
|
191
|
-
let _position_extraInitializers = [];
|
|
192
|
-
let _opened_decorators;
|
|
193
|
-
let _opened_initializers = [];
|
|
194
|
-
let _opened_extraInitializers = [];
|
|
195
|
-
let _focusOnOpen_decorators;
|
|
196
|
-
let _focusOnOpen_initializers = [];
|
|
197
|
-
let _focusOnOpen_extraInitializers = [];
|
|
198
|
-
let __detectScrolledState_decorators;
|
|
199
|
-
return class SbbSidebarElement extends _classSuper {
|
|
200
|
-
static {
|
|
201
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
202
|
-
_color_decorators = [property({ reflect: true })];
|
|
203
|
-
_mode_decorators = [forceType((v) => v === "over" ? "over" : "side"), property({ reflect: true })];
|
|
204
|
-
_position_decorators = [
|
|
205
|
-
forceType((v) => v === "end" ? "end" : "start"),
|
|
206
|
-
handleDistinctChange((instance, _newValue, oldValue) => instance._updateSidebarWidth(oldValue)),
|
|
207
|
-
property({ reflect: true })
|
|
208
|
-
];
|
|
209
|
-
_opened_decorators = [forceType(), property({
|
|
210
|
-
type: Boolean,
|
|
211
|
-
reflect: true
|
|
212
|
-
})];
|
|
213
|
-
_focusOnOpen_decorators = [forceType(), property({
|
|
214
|
-
type: Boolean,
|
|
215
|
-
attribute: "focus-on-open"
|
|
216
|
-
})];
|
|
217
|
-
__detectScrolledState_decorators = [eventOptions({ passive: true })];
|
|
218
|
-
__esDecorate(this, null, _color_decorators, {
|
|
219
|
-
kind: "accessor",
|
|
220
|
-
name: "color",
|
|
221
|
-
static: false,
|
|
222
|
-
private: false,
|
|
223
|
-
access: {
|
|
224
|
-
has: (obj) => "color" in obj,
|
|
225
|
-
get: (obj) => obj.color,
|
|
226
|
-
set: (obj, value) => {
|
|
227
|
-
obj.color = value;
|
|
228
|
-
}
|
|
229
|
-
},
|
|
230
|
-
metadata: _metadata
|
|
231
|
-
}, _color_initializers, _color_extraInitializers);
|
|
232
|
-
__esDecorate(this, null, _mode_decorators, {
|
|
233
|
-
kind: "accessor",
|
|
234
|
-
name: "mode",
|
|
235
|
-
static: false,
|
|
236
|
-
private: false,
|
|
237
|
-
access: {
|
|
238
|
-
has: (obj) => "mode" in obj,
|
|
239
|
-
get: (obj) => obj.mode,
|
|
240
|
-
set: (obj, value) => {
|
|
241
|
-
obj.mode = value;
|
|
242
|
-
}
|
|
243
|
-
},
|
|
244
|
-
metadata: _metadata
|
|
245
|
-
}, _mode_initializers, _mode_extraInitializers);
|
|
246
|
-
__esDecorate(this, null, _position_decorators, {
|
|
247
|
-
kind: "accessor",
|
|
248
|
-
name: "position",
|
|
249
|
-
static: false,
|
|
250
|
-
private: false,
|
|
251
|
-
access: {
|
|
252
|
-
has: (obj) => "position" in obj,
|
|
253
|
-
get: (obj) => obj.position,
|
|
254
|
-
set: (obj, value) => {
|
|
255
|
-
obj.position = value;
|
|
256
|
-
}
|
|
257
|
-
},
|
|
258
|
-
metadata: _metadata
|
|
259
|
-
}, _position_initializers, _position_extraInitializers);
|
|
260
|
-
__esDecorate(this, null, _opened_decorators, {
|
|
261
|
-
kind: "accessor",
|
|
262
|
-
name: "opened",
|
|
263
|
-
static: false,
|
|
264
|
-
private: false,
|
|
265
|
-
access: {
|
|
266
|
-
has: (obj) => "opened" in obj,
|
|
267
|
-
get: (obj) => obj.opened,
|
|
268
|
-
set: (obj, value) => {
|
|
269
|
-
obj.opened = value;
|
|
270
|
-
}
|
|
271
|
-
},
|
|
272
|
-
metadata: _metadata
|
|
273
|
-
}, _opened_initializers, _opened_extraInitializers);
|
|
274
|
-
__esDecorate(this, null, _focusOnOpen_decorators, {
|
|
275
|
-
kind: "accessor",
|
|
276
|
-
name: "focusOnOpen",
|
|
277
|
-
static: false,
|
|
278
|
-
private: false,
|
|
279
|
-
access: {
|
|
280
|
-
has: (obj) => "focusOnOpen" in obj,
|
|
281
|
-
get: (obj) => obj.focusOnOpen,
|
|
282
|
-
set: (obj, value) => {
|
|
283
|
-
obj.focusOnOpen = value;
|
|
284
|
-
}
|
|
285
|
-
},
|
|
286
|
-
metadata: _metadata
|
|
287
|
-
}, _focusOnOpen_initializers, _focusOnOpen_extraInitializers);
|
|
288
|
-
__esDecorate(this, null, __detectScrolledState_decorators, {
|
|
289
|
-
kind: "method",
|
|
290
|
-
name: "_detectScrolledState",
|
|
291
|
-
static: false,
|
|
292
|
-
private: false,
|
|
293
|
-
access: {
|
|
294
|
-
has: (obj) => "_detectScrolledState" in obj,
|
|
295
|
-
get: (obj) => obj._detectScrolledState
|
|
296
|
-
},
|
|
297
|
-
metadata: _metadata
|
|
298
|
-
}, null, _instanceExtraInitializers);
|
|
299
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, {
|
|
300
|
-
enumerable: true,
|
|
301
|
-
configurable: true,
|
|
302
|
-
writable: true,
|
|
303
|
-
value: _metadata
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
static {
|
|
307
|
-
this.elementName = "sbb-sidebar";
|
|
308
|
-
}
|
|
309
|
-
static {
|
|
310
|
-
this.styles = [boxSizingStyles, sidebar_default];
|
|
311
|
-
}
|
|
312
|
-
#color_accessor_storage;
|
|
313
|
-
/** Background color of the sidebar. Either `white` or `milk`. */
|
|
314
|
-
get color() {
|
|
315
|
-
return this.#color_accessor_storage;
|
|
316
|
-
}
|
|
317
|
-
set color(value) {
|
|
318
|
-
this.#color_accessor_storage = value;
|
|
319
|
-
}
|
|
320
|
-
#mode_accessor_storage;
|
|
321
|
-
/** Mode of the sidebar; one of 'side' or 'over'. */
|
|
322
|
-
get mode() {
|
|
323
|
-
return this.#mode_accessor_storage;
|
|
324
|
-
}
|
|
325
|
-
set mode(value) {
|
|
326
|
-
this.#mode_accessor_storage = value;
|
|
327
|
-
}
|
|
328
|
-
#position_accessor_storage;
|
|
329
|
-
/** The side that the sidebar is attached to. */
|
|
330
|
-
get position() {
|
|
331
|
-
return this.#position_accessor_storage;
|
|
332
|
-
}
|
|
333
|
-
set position(value) {
|
|
334
|
-
this.#position_accessor_storage = value;
|
|
335
|
-
}
|
|
336
|
-
#opened_accessor_storage;
|
|
337
|
-
/**
|
|
338
|
-
* Whether the sidebar is opened or closed.
|
|
339
|
-
* Can be used to initially set the opened state, where
|
|
340
|
-
* the animation will be skipped.
|
|
341
|
-
*/
|
|
342
|
-
get opened() {
|
|
343
|
-
return this.#opened_accessor_storage;
|
|
344
|
-
}
|
|
345
|
-
set opened(value) {
|
|
346
|
-
this.#opened_accessor_storage = value;
|
|
347
|
-
}
|
|
348
|
-
#focusOnOpen_accessor_storage;
|
|
349
|
-
/**
|
|
350
|
-
* Whether the sidebar should focus the first focusable element automatically when opened.
|
|
351
|
-
* Defaults to false in when mode is set to `side`, otherwise defaults to true.
|
|
352
|
-
* If explicitly enabled, focus will be moved into the sidebar in `side` mode as well.
|
|
353
|
-
*/
|
|
354
|
-
get focusOnOpen() {
|
|
355
|
-
return this.#focusOnOpen_accessor_storage;
|
|
356
|
-
}
|
|
357
|
-
set focusOnOpen(value) {
|
|
358
|
-
this.#focusOnOpen_accessor_storage = value;
|
|
359
|
-
}
|
|
360
|
-
/** Returns the SbbSidebarContainerElement where this sidebar is contained. */
|
|
361
|
-
get container() {
|
|
362
|
-
return this._container;
|
|
363
|
-
}
|
|
364
|
-
constructor() {
|
|
365
|
-
super();
|
|
366
|
-
this.#color_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _color_initializers, "white"));
|
|
367
|
-
this.#mode_accessor_storage = (__runInitializers(this, _color_extraInitializers), __runInitializers(this, _mode_initializers, "side"));
|
|
368
|
-
this.#position_accessor_storage = (__runInitializers(this, _mode_extraInitializers), __runInitializers(this, _position_initializers, "start"));
|
|
369
|
-
this.#opened_accessor_storage = (__runInitializers(this, _position_extraInitializers), __runInitializers(this, _opened_initializers, false));
|
|
370
|
-
this.#focusOnOpen_accessor_storage = (__runInitializers(this, _opened_extraInitializers), __runInitializers(this, _focusOnOpen_initializers, false));
|
|
371
|
-
this._container = (__runInitializers(this, _focusOnOpen_extraInitializers), null);
|
|
372
|
-
this._lastFocusedElement = null;
|
|
373
|
-
this._focusTrapController = new SbbFocusTrapController(this);
|
|
374
|
-
this._escapableOverlayController = new SbbEscapableOverlayController(this);
|
|
375
|
-
this.addController(new ResizeController(this, {
|
|
376
|
-
skipInitial: true,
|
|
377
|
-
callback: () => this._updateSidebarWidth()
|
|
378
|
-
}));
|
|
379
|
-
this.addEventListener?.("click", (e) => {
|
|
380
|
-
if (e.target?.localName === "sbb-sidebar-close-button") this.close();
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
connectedCallback() {
|
|
384
|
-
super.connectedCallback();
|
|
385
|
-
this._container = this.closest?.("sbb-sidebar-container");
|
|
386
|
-
this._updateSidebarWidth();
|
|
387
|
-
if (this.isOpen && this._isModeOver()) this._takeFocus();
|
|
388
|
-
}
|
|
389
|
-
disconnectedCallback() {
|
|
390
|
-
super.disconnectedCallback();
|
|
391
|
-
this.container?.style.removeProperty(this._buildCssWidthVar());
|
|
392
|
-
this._container = null;
|
|
393
|
-
}
|
|
394
|
-
willUpdate(changedProperties) {
|
|
395
|
-
super.willUpdate(changedProperties);
|
|
396
|
-
if (changedProperties.has("opened")) {
|
|
397
|
-
if (this.opened) this.open();
|
|
398
|
-
else if (!this.opened) this.close();
|
|
399
|
-
}
|
|
400
|
-
if (changedProperties.has("mode")) if (this.mode === "over" && this.isOpen) this._takeFocus();
|
|
401
|
-
else this.cedeFocus();
|
|
402
|
-
}
|
|
403
|
-
firstUpdated(changedProperties) {
|
|
404
|
-
super.firstUpdated(changedProperties);
|
|
405
|
-
this._updateSidebarWidth();
|
|
406
|
-
}
|
|
407
|
-
/** Toggles the sidebar visibility. */
|
|
408
|
-
toggle() {
|
|
409
|
-
if (this.state === "opening" || this.state === "opened") this.close();
|
|
410
|
-
else this.open();
|
|
411
|
-
}
|
|
412
|
-
/** Opens the sidebar. */
|
|
413
|
-
open() {
|
|
414
|
-
if (this.state === "opening" || this.state === "opened" || !this.dispatchBeforeOpenEvent()) return;
|
|
415
|
-
this.startAnimation();
|
|
416
|
-
if (!isServer && document.activeElement?.localName !== "body") this._lastFocusedElement = document.activeElement;
|
|
417
|
-
this.opened = true;
|
|
418
|
-
this.state = "opening";
|
|
419
|
-
const isZeroAnimationDuration = this._isZeroAnimationDuration() || !this.isConnected;
|
|
420
|
-
const isDuringInitialization = !this.hasUpdated;
|
|
421
|
-
if (!(isDuringInitialization || isZeroAnimationDuration)) return;
|
|
422
|
-
this.internals.states.add("skip-animation");
|
|
423
|
-
if (isDuringInitialization) this.updateComplete.then(() => this._handleOpening());
|
|
424
|
-
else this._handleOpening();
|
|
425
|
-
}
|
|
426
|
-
_isZeroAnimationDuration() {
|
|
427
|
-
return isZeroAnimationDuration(this, "--sbb-sidebar-container-animation-duration");
|
|
428
|
-
}
|
|
429
|
-
_handleOpening() {
|
|
430
|
-
this.state = "opened";
|
|
431
|
-
setTimeout(() => this.internals.states.delete("skip-animation"));
|
|
432
|
-
this._takeFocus();
|
|
433
|
-
this.stopAnimation();
|
|
434
|
-
this.dispatchOpenEvent();
|
|
435
|
-
}
|
|
436
|
-
/** Closes the sidebar. */
|
|
437
|
-
close() {
|
|
438
|
-
if (this.state === "closing" || this.state === "closed" || !this.dispatchBeforeCloseEvent()) return;
|
|
439
|
-
this.startAnimation();
|
|
440
|
-
const isZeroAnimationDuration = this._isZeroAnimationDuration();
|
|
441
|
-
if (!this.hasUpdated || isZeroAnimationDuration) this.internals.states.add("skip-animation");
|
|
442
|
-
else this.state = "closing";
|
|
443
|
-
this.opened = false;
|
|
444
|
-
if (!this.hasUpdated || isZeroAnimationDuration) this._handleClosing();
|
|
445
|
-
}
|
|
446
|
-
_handleClosing() {
|
|
447
|
-
this.state = "closed";
|
|
448
|
-
setTimeout(() => this.internals.states.delete("skip-animation"));
|
|
449
|
-
this.cedeFocus();
|
|
450
|
-
if (!isServer && (this.contains(document.activeElement) || this._isModeOver())) if (this._lastFocusedElement) this._lastFocusedElement?.focus();
|
|
451
|
-
else document.activeElement.blur();
|
|
452
|
-
this._lastFocusedElement = null;
|
|
453
|
-
this.stopAnimation();
|
|
454
|
-
this.dispatchCloseEvent();
|
|
455
|
-
}
|
|
456
|
-
_takeFocus() {
|
|
457
|
-
if (!this.isConnected) return;
|
|
458
|
-
const isModeOver = this._isModeOver();
|
|
459
|
-
if (isModeOver || this.focusOnOpen) this._focusTrapController.focusInitialElement();
|
|
460
|
-
if (isModeOver) {
|
|
461
|
-
this._escapableOverlayController.connect();
|
|
462
|
-
this._focusTrapController.enabled = true;
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
cedeFocus() {
|
|
466
|
-
this._focusTrapController.enabled = false;
|
|
467
|
-
this._escapableOverlayController.disconnect();
|
|
468
|
-
}
|
|
469
|
-
_updateSidebarWidth(oldPosition) {
|
|
470
|
-
const container = this.container;
|
|
471
|
-
if (!container) return;
|
|
472
|
-
if (oldPosition) container.style.removeProperty(this._buildCssWidthVar(oldPosition));
|
|
473
|
-
const width = this.offsetWidth;
|
|
474
|
-
if (!width) return;
|
|
475
|
-
const newValue = `${width}px`;
|
|
476
|
-
if (container.style.getPropertyValue(this._buildCssWidthVar()) === newValue) return;
|
|
477
|
-
container.style.setProperty(this._buildCssWidthVar(), newValue);
|
|
478
|
-
}
|
|
479
|
-
_buildCssWidthVar(position = this.position) {
|
|
480
|
-
return `--sbb-sidebar-container__${position}-width`;
|
|
481
|
-
}
|
|
482
|
-
_isModeOver() {
|
|
483
|
-
return this.mode === "over" || this.matches(":is(:state(mode-over-forced),[state--mode-over-forced])");
|
|
484
|
-
}
|
|
485
|
-
_onTransitionEnd(event) {
|
|
486
|
-
if (event.propertyName !== "translate" || event.target !== event.currentTarget) return;
|
|
487
|
-
if (this.state === "opening") this._handleOpening();
|
|
488
|
-
else if (this.state === "closing") this._handleClosing();
|
|
489
|
-
}
|
|
490
|
-
_detectScrolledState() {
|
|
491
|
-
this.toggleState("scrolled", (this.shadowRoot?.querySelector(".sbb-sidebar-content-section")?.scrollTop ?? 0) > 0);
|
|
492
|
-
}
|
|
493
|
-
render() {
|
|
494
|
-
return html`<div class="sbb-sidebar" @transitionend=${this._onTransitionEnd}>
|
|
495
|
-
<div class="sbb-sidebar-title-section"><slot name="title-section"></slot></div>
|
|
496
|
-
<div class="sbb-sidebar-content-section" @scroll=${() => this._detectScrolledState()}>
|
|
497
|
-
<slot></slot>
|
|
498
|
-
</div>
|
|
499
|
-
</div>`;
|
|
500
|
-
}
|
|
501
|
-
};
|
|
502
|
-
})();
|
|
503
|
-
//#endregion
|
|
504
|
-
export { SbbSidebarElement as t };
|
|
505
|
-
|
|
506
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci5jb21wb25lbnQtaGt2RG1fZkMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3NpZGViYXIvc2lkZWJhci9zaWRlYmFyLnNjc3M/bGl0JmlubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9zaWRlYmFyL3NpZGViYXIvc2lkZWJhci5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgzMjApfTtcblxuICAtLXNiYi1saW5rLXRleHQtZGVjb3JhdGlvbi1saW5lOiBub25lO1xuICAtLXNiYi1zaWRlYmFyLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTEpO1xuICAtLXNiYi1zaWRlYmFyLXRpdGxlLXBhZGRpbmctYmxvY2s6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTN4KTtcbiAgLS1zYmItc2lkZWJhci1wYWRkaW5nOiB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXhzKTtcbiAgLS1zYmItc2lkZWJhci1zY3JvbGxiYXItcGxhY2Vob2xkZXItd2lkdGg6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTN4KTtcbiAgLS1zYmItc2lkZWJhci1ib3JkZXItcmFkaXVzOiB2YXIoLS1zYmItYm9yZGVyLXJhZGl1cy04eCk7XG4gIC0tc2JiLXNpZGViYXItbWFyZ2luOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0zeCk7XG4gIC0tc2JiLXNpZGViYXItdGl0bGUtZ2FwOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCk7XG4gIC0tc2JiLXNpZGViYXJfX21hcmdpbjogMDtcbiAgLS1zYmItc2lkZWJhcl9fbWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zYmItc2lkZWJhci1tYXJnaW4pO1xuICAtLXNiYi1zaWRlYmFyX190cmFuc2xhdGUteDogLTEwMCU7XG4gIC0tc2JiLXNpZGViYXJfX3otaW5kZXg6IDI7XG4gIC0tc2JiLXNpZGViYXJfX3BhZGRpbmctaW5saW5lLWVuZDogdmFyKC0tc2JiLXNpZGViYXItcGFkZGluZyk7XG4gIC0tc2JiLXNpZGViYXJfX3BhZGRpbmctYmxvY2stc3RhcnQ6IHZhcigtLXNiYi1zaWRlYmFyLXBhZGRpbmcpO1xuICAtLXNiYi1zaWRlYmFyX19ib3JkZXItcmFkaXVzLXN0YXJ0OiB2YXIoLS1zYmItc2lkZWJhci1ib3JkZXItcmFkaXVzKTtcbiAgLS1zYmItc2lkZWJhcl9fYm9yZGVyLXJhZGl1cy1lbmQ6IDA7XG4gIC0tc2JiLXNpZGViYXJfX2Nsb3NlLWJ1dHRvbi1zaXplOiB2YXIoLS1zYmItc2l6ZS1lbGVtZW50LXhzKTtcblxuICAvLyBTdWJ0cmFjdCB0aGUgd2lkdGggb2YgdGhlIHNjcm9sbGJhciBmcm9tIHRoZSBwYWRkaW5nIChFeGNsdWRlIGlPUyBicm93c2VycyBiZWNhdXNlIHRoZXkgdXNlIG92ZXJsYXkgc2Nyb2xsYmFycylcbiAgQHN1cHBvcnRzIChzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGUpIGFuZCAobm90ICgtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmUpKSB7XG4gICAgLS1zYmItc2lkZWJhcl9fcGFkZGluZy1pbmxpbmUtZW5kOiBjYWxjKFxuICAgICAgdmFyKC0tc2JiLXNpZGViYXItcGFkZGluZykgLSB2YXIoLS1zYmItc2lkZWJhci1zY3JvbGxiYXItcGxhY2Vob2xkZXItd2lkdGgpXG4gICAgKTtcbiAgfVxufVxuXG46aG9zdChbY29sb3I9J21pbGsnXSkge1xuICAtLXNiYi1zaWRlYmFyLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1iYWNrZ3JvdW5kLWNvbG9yLTMpO1xufVxuXG46aG9zdCg6aXMoW21vZGU9J292ZXInXSwgOnN0YXRlKG1vZGUtb3Zlci1mb3JjZWQpOm5vdCg6c3RhdGUobW9kZS1vdmVyLWZvcmNlZC1jbG9zaW5nKSkpKSB7XG4gIC0tc2JiLXNpZGViYXJfX21hcmdpbjogdmFyKC0tc2JiLXNpZGViYXItbWFyZ2luKTtcbiAgLS1zYmItc2lkZWJhcl9fYm9yZGVyLXJhZGl1cy1lbmQ6IHZhcigtLXNiYi1zaWRlYmFyLWJvcmRlci1yYWRpdXMpO1xuICAtLXNiYi1zaWRlYmFyX196LWluZGV4OiAzO1xufVxuXG46aG9zdCg6aXMoOmRpcihydGwpLCBbcG9zaXRpb249J2VuZCddKSkge1xuICAtLXNiYi1zaWRlYmFyX190cmFuc2xhdGUteDogMTAwJTtcbn1cblxuOmhvc3QoOmRpcihydGwpW3Bvc2l0aW9uPSdlbmQnXSkge1xuICAtLXNiYi1zaWRlYmFyX190cmFuc2xhdGUteDogLTEwMCU7XG59XG5cbi5zYmItc2lkZWJhciB7XG4gIHdpZHRoOiBpbmhlcml0O1xuICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDIgKiB2YXIoLS1zYmItc2lkZWJhcl9fbWFyZ2luKSk7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1zaWRlYmFyLWJhY2tncm91bmQtY29sb3IpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGluc2V0LWJsb2NrOiAwO1xuICB6LWluZGV4OiB2YXIoLS1zYmItc2lkZWJhcl9fei1pbmRleCk7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IHZhcigtLXNiYi1zaWRlYmFyX19ib3JkZXItcmFkaXVzLXN0YXJ0KTtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IHZhcigtLXNiYi1zaWRlYmFyX19ib3JkZXItcmFkaXVzLXN0YXJ0KTtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IHZhcigtLXNiYi1zaWRlYmFyX19ib3JkZXItcmFkaXVzLWVuZCk7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogdmFyKC0tc2JiLXNpZGViYXJfX2JvcmRlci1yYWRpdXMtZW5kKTtcbiAgbWFyZ2luOiB2YXIoLS1zYmItc2lkZWJhcl9fbWFyZ2luKTtcbiAgbWFyZ2luLWJsb2NrLXN0YXJ0OiB2YXIoLS1zYmItc2lkZWJhcl9fbWFyZ2luLWJsb2NrLXN0YXJ0KTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tc2JiLXNpZGViYXItY29udGFpbmVyLWFuaW1hdGlvbi1kdXJhdGlvbik7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItc2lkZWJhci1jb250YWluZXItYW5pbWF0aW9uLWVhc2luZyk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHdpZHRoLCB0cmFuc2xhdGU7XG4gIHRyYW5zbGF0ZTogbm9uZTtcblxuICA6aG9zdChbcG9zaXRpb249J2VuZCddKSAmIHtcbiAgICBpbnNldC1pbmxpbmUtZW5kOiAwO1xuICB9XG5cbiAgOmhvc3QoOnN0YXRlKHN0YXRlLWNsb3NlZCkpICYge1xuICAgIC8vIFN0b3BzIHRoZSBzaWRlbmF2IGZyb20gcG9raW5nIG91dCAoZS5nLiB3aXRoIHRoZSBib3ggc2hhZG93KSB3aGlsZSBpdCdzIG9mZi1zY3JlZW4uXG4gICAgLy8gV2UgY2FuJ3QgdXNlIGBkaXNwbGF5YCBiZWNhdXNlIGl0IGludGVycnVwdHMgdGhlIHRyYW5zaXRpb24gYW5kIGB0cmFuc2l0aW9uLWJlaGF2aW9yYFxuICAgIC8vIGlzbid0IGF2YWlsYWJsZSBpbiBhbGwgYnJvd3NlcnMuXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICB9XG5cbiAgOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSwgOnN0YXRlKHN0YXRlLWNsb3NlZCkpKSAmIHtcbiAgICB0cmFuc2xhdGU6IHZhcigtLXNiYi1zaWRlYmFyX190cmFuc2xhdGUteCkgMDtcbiAgfVxufVxuXG4uc2JiLXNpZGViYXItdGl0bGUtc2VjdGlvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHdpZHRoOiAxMDAlO1xuICBnYXA6IHZhcigtLXNiYi1zaWRlYmFyLXRpdGxlLWdhcCk7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1zaWRlYmFyLWJhY2tncm91bmQtY29sb3IpO1xuICBwYWRkaW5nLWlubGluZTogdmFyKC0tc2JiLXNpZGViYXItcGFkZGluZyk7XG4gIHRyYW5zaXRpb246IGJveC1zaGFkb3cgdmFyKC0tc2JiLWFuaW1hdGlvbi1lYXNpbmcpIHZhcigtLXNiYi1zaWRlYmFyLWNvbnRhaW5lci1hbmltYXRpb24tZHVyYXRpb24pO1xuICBib3gtc2hhZG93OiBub25lO1xuXG4gIDpob3N0KDpzdGF0ZShzY3JvbGxlZCkpICYge1xuICAgIGJveC1zaGFkb3c6IHZhcigtLXNiYi1ib3gtc2hhZG93LWxldmVsLTUtc29mdCk7XG4gIH1cbn1cblxuLnNiYi1zaWRlYmFyLWNvbnRlbnQtc2VjdGlvbiB7XG4gIEBpbmNsdWRlIHNiYi5zY3JvbGxiYXI7XG5cbiAgcGFkZGluZy1ibG9jay1zdGFydDogdmFyKC0tc2JiLXNpZGViYXJfX3BhZGRpbmctYmxvY2stc3RhcnQpO1xuICBwYWRkaW5nLWlubGluZTogdmFyKC0tc2JiLXNpZGViYXItcGFkZGluZykgdmFyKC0tc2JiLXNpZGViYXJfX3BhZGRpbmctaW5saW5lLWVuZCk7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIGZsZXgtZ3JvdzogMTtcblxuICAvLyBJZiB0aGUgZWxlbWVudCBpcyBzY3JvbGxhYmxlIGFuZCBoYXMgbm8gZm9jdXNhYmxlIGNvbnRlbnQsIGl0IGdldHMgZm9jdXNlZC5cbiAgLy8gVG8gYWRhcHQgdG8gbHluZSBzdHlsZXMgd2UgY29sb3JpemUgaXRcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tc2JiLWZvY3VzLW91dGxpbmUtY29sb3IpO1xuXG4gIEBzdXBwb3J0cyAoc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlKSB7XG4gICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlO1xuICB9XG59XG5cbjo6c2xvdHRlZChzYmItc2lkZWJhci10aXRsZSkge1xuICBmbGV4LWdyb3c6IDE7XG4gIG1hcmdpbi1ibG9jazogdmFyKC0tc2JiLXNpZGViYXItdGl0bGUtcGFkZGluZy1ibG9jayk7XG59XG5cbjo6c2xvdHRlZChzYmItc2lkZWJhci1jbG9zZS1idXR0b24pIHtcbiAgb3JkZXI6IDE7XG5cbiAgLy8gRHVlIHRvIGRlc2lnbiBuZWVkcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlIGNsb3NlIGJ1dHRvbiB0byB0aGUgcmlnaHRcbiAgbWFyZ2luLWlubGluZS1lbmQ6IGNhbGMoXG4gICAgLTEgKiAodmFyKC0tc2JiLXNpZGViYXItcGFkZGluZykgLSB2YXIoLS1zYmItc2lkZWJhci10aXRsZS1wYWRkaW5nLWJsb2NrKSlcbiAgKTtcbiAgbWFyZ2luLWJsb2NrOiB2YXIoLS1zYmItc2lkZWJhci10aXRsZS1wYWRkaW5nLWJsb2NrKTtcbiAgaW5zZXQtaW5saW5lLWVuZDogdmFyKC0tc2JiLXNpZGViYXItcGFkZGluZyk7XG59XG4iLCJpbXBvcnQgeyBSZXNpemVDb250cm9sbGVyIH0gZnJvbSAnQGxpdC1sYWJzL29ic2VydmVycy9yZXNpemUtY29udHJvbGxlci5qcyc7XG5pbXBvcnQgeyB0eXBlIENTU1Jlc3VsdEdyb3VwLCBodG1sLCBpc1NlcnZlciwgdHlwZSBQcm9wZXJ0eVZhbHVlcywgdHlwZSBUZW1wbGF0ZVJlc3VsdCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBldmVudE9wdGlvbnMsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBTYmJGb2N1c1RyYXBDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vY29yZS9hMTF5LnRzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vLi4vY29yZS9iYXNlLWVsZW1lbnRzLnRzJztcbmltcG9ydCB7IFNiYkVzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vY29yZS9jb250cm9sbGVycy50cyc7XG5pbXBvcnQgeyBmb3JjZVR5cGUsIGhhbmRsZURpc3RpbmN0Q2hhbmdlIH0gZnJvbSAnLi4vLi4vY29yZS9kZWNvcmF0b3JzLnRzJztcbmltcG9ydCB7IGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9kb20udHMnO1xuaW1wb3J0IHsgU2JiQW5pbWF0aW9uQ29tcGxldGVNaXhpbiB9IGZyb20gJy4uLy4uL2NvcmUvbWl4aW5zLnRzJztcbmltcG9ydCB7IGJveFNpemluZ1N0eWxlcyB9IGZyb20gJy4uLy4uL2NvcmUvc3R5bGVzLnRzJztcbmltcG9ydCB0eXBlIHsgU2JiU2lkZWJhckNvbnRhaW5lckVsZW1lbnQgfSBmcm9tICcuLi9zaWRlYmFyLWNvbnRhaW5lci9zaWRlYmFyLWNvbnRhaW5lci5jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9zaWRlYmFyLnNjc3M/bGl0JmlubGluZSc7XG5cbi8qKlxuICogVGhpcyBjb21wb25lbnQgY29ycmVzcG9uZHMgdG8gYSBzaWRlYmFyIHRoYXQgY2FuIGJlIG9wZW5lZCBvbiB0aGUgc2lkZWJhciBjb250YWluZXIuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBzbG90IGFueSBjb250ZW50IGludG8gdGhlIHNpZGViYXIuXG4gKiBAc2xvdCB0aXRsZSAtIFVzZSB0aGUgdGl0bGUgc2xvdCB0byBhZGQgYW4gPHNiYi10aXRsZT4uXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJTaWRlYmFyRWxlbWVudCBleHRlbmRzIFNiYkFuaW1hdGlvbkNvbXBsZXRlTWl4aW4oU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQpIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBlbGVtZW50TmFtZTogc3RyaW5nID0gJ3NiYi1zaWRlYmFyJztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgc3R5bGVdO1xuXG4gIC8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzaWRlYmFyLiBFaXRoZXIgYHdoaXRlYCBvciBgbWlsa2AuICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUgfSlcbiAgcHVibGljIGFjY2Vzc29yIGNvbG9yOiAnd2hpdGUnIHwgJ21pbGsnID0gJ3doaXRlJztcblxuICAvKiogTW9kZSBvZiB0aGUgc2lkZWJhcjsgb25lIG9mICdzaWRlJyBvciAnb3ZlcicuICovXG4gIEBmb3JjZVR5cGUoKHYpID0+ICh2ID09PSAnb3ZlcicgPyAnb3ZlcicgOiAnc2lkZScpKVxuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtb2RlOiAnc2lkZScgfCAnb3ZlcicgPSAnc2lkZSc7XG5cbiAgLyoqIFRoZSBzaWRlIHRoYXQgdGhlIHNpZGViYXIgaXMgYXR0YWNoZWQgdG8uICovXG4gIEBmb3JjZVR5cGUoKHYpID0+ICh2ID09PSAnZW5kJyA/ICdlbmQnIDogJ3N0YXJ0JykpXG4gIEBoYW5kbGVEaXN0aW5jdENoYW5nZSgoaW5zdGFuY2UsIF9uZXdWYWx1ZSwgb2xkVmFsdWUpID0+IGluc3RhbmNlLl91cGRhdGVTaWRlYmFyV2lkdGgob2xkVmFsdWUpKVxuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBwb3NpdGlvbjogJ3N0YXJ0JyB8ICdlbmQnID0gJ3N0YXJ0JztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc2lkZWJhciBpcyBvcGVuZWQgb3IgY2xvc2VkLlxuICAgKiBDYW4gYmUgdXNlZCB0byBpbml0aWFsbHkgc2V0IHRoZSBvcGVuZWQgc3RhdGUsIHdoZXJlXG4gICAqIHRoZSBhbmltYXRpb24gd2lsbCBiZSBza2lwcGVkLlxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSlcbiAgcHVibGljIGFjY2Vzc29yIG9wZW5lZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzaWRlYmFyIHNob3VsZCBmb2N1cyB0aGUgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgYXV0b21hdGljYWxseSB3aGVuIG9wZW5lZC5cbiAgICogRGVmYXVsdHMgdG8gZmFsc2UgaW4gd2hlbiBtb2RlIGlzIHNldCB0byBgc2lkZWAsIG90aGVyd2lzZSBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiBJZiBleHBsaWNpdGx5IGVuYWJsZWQsIGZvY3VzIHdpbGwgYmUgbW92ZWQgaW50byB0aGUgc2lkZWJhciBpbiBgc2lkZWAgbW9kZSBhcyB3ZWxsLlxuICAgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ2ZvY3VzLW9uLW9wZW4nIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBmb2N1c09uT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBTYmJTaWRlYmFyQ29udGFpbmVyRWxlbWVudCB3aGVyZSB0aGlzIHNpZGViYXIgaXMgY29udGFpbmVkLiAqL1xuICBwdWJsaWMgZ2V0IGNvbnRhaW5lcigpOiBTYmJTaWRlYmFyQ29udGFpbmVyRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gIH1cbiAgcHJpdmF0ZSBfY29udGFpbmVyOiBTYmJTaWRlYmFyQ29udGFpbmVyRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2xhc3RGb2N1c2VkRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZm9jdXNUcmFwQ29udHJvbGxlciA9IG5ldyBTYmJGb2N1c1RyYXBDb250cm9sbGVyKHRoaXMpO1xuICBwcml2YXRlIF9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlciA9IG5ldyBTYmJFc2NhcGFibGVPdmVybGF5Q29udHJvbGxlcih0aGlzKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZENvbnRyb2xsZXIoXG4gICAgICBuZXcgUmVzaXplQ29udHJvbGxlcih0aGlzLCB7XG4gICAgICAgIHNraXBJbml0aWFsOiB0cnVlLFxuICAgICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5fdXBkYXRlU2lkZWJhcldpZHRoKCksXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGlmICgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQpPy5sb2NhbE5hbWUgPT09ICdzYmItc2lkZWJhci1jbG9zZS1idXR0b24nKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5fY29udGFpbmVyID0gdGhpcy5jbG9zZXN0Py4oJ3NiYi1zaWRlYmFyLWNvbnRhaW5lcicpO1xuICAgIHRoaXMuX3VwZGF0ZVNpZGViYXJXaWR0aCgpO1xuXG4gICAgaWYgKHRoaXMuaXNPcGVuICYmIHRoaXMuX2lzTW9kZU92ZXIoKSkge1xuICAgICAgdGhpcy5fdGFrZUZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5jb250YWluZXI/LnN0eWxlLnJlbW92ZVByb3BlcnR5KHRoaXMuX2J1aWxkQ3NzV2lkdGhWYXIoKSk7XG4gICAgdGhpcy5fY29udGFpbmVyID0gbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnb3BlbmVkJykpIHtcbiAgICAgIGlmICh0aGlzLm9wZW5lZCkge1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3BlbmVkKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdtb2RlJykpIHtcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdvdmVyJyAmJiB0aGlzLmlzT3Blbikge1xuICAgICAgICB0aGlzLl90YWtlRm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2VkZUZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgdGhpcy5fdXBkYXRlU2lkZWJhcldpZHRoKCk7XG4gIH1cblxuICAvKiogVG9nZ2xlcyB0aGUgc2lkZWJhciB2aXNpYmlsaXR5LiAqL1xuICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSAnb3BlbmluZycgfHwgdGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE9wZW5zIHRoZSBzaWRlYmFyLiAqL1xuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnIHx8IHRoaXMuc3RhdGUgPT09ICdvcGVuZWQnIHx8ICF0aGlzLmRpc3BhdGNoQmVmb3JlT3BlbkV2ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XG5cbiAgICBpZiAoIWlzU2VydmVyICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmxvY2FsTmFtZSAhPT0gJ2JvZHknKSB7XG4gICAgICB0aGlzLl9sYXN0Rm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIH1cblxuICAgIHRoaXMub3BlbmVkID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5pbmcnO1xuXG4gICAgY29uc3QgaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24gPSB0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpIHx8ICF0aGlzLmlzQ29ubmVjdGVkO1xuICAgIGNvbnN0IGlzRHVyaW5nSW5pdGlhbGl6YXRpb24gPSAhdGhpcy5oYXNVcGRhdGVkO1xuXG4gICAgaWYgKCEoaXNEdXJpbmdJbml0aWFsaXphdGlvbiB8fCBpc1plcm9BbmltYXRpb25EdXJhdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnc2tpcC1hbmltYXRpb24nKTtcblxuICAgIC8vIFdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIGZpcnN0IHVwZGF0ZSB0byBiZSBjb21wbGV0ZWRcbiAgICAvLyBpbiBvcmRlciB0byBoYXZlIHRoZSBzaXplIG9mIHRoZSBzaWRlYmFyIHJlYWR5IGZvciB0aGUgYW5pbWF0aW9uLlxuICAgIGlmIChpc0R1cmluZ0luaXRpYWxpemF0aW9uKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4gdGhpcy5faGFuZGxlT3BlbmluZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICAgIHRoaXMuX2hhbmRsZU9wZW5pbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24odGhpcywgJy0tc2JiLXNpZGViYXItY29udGFpbmVyLWFuaW1hdGlvbi1kdXJhdGlvbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlT3BlbmluZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5lZCc7XG5cbiAgICAvLyBXZSBoYXZlIHRvIGVuc3VyZSB0aGF0IHJlbW92aW5nIHRoZSBhbmltYXRpb24gc2tpcCBpbnN0cnVjdGlvbiBpcyBkb25lIGEgdGljayBsYXRlci5cbiAgICAvLyBPdGhlcndpc2UsIGl0J3MgcmVtb3ZlZCB0b28gZWFybHkgYW5kIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0LlxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnc2tpcC1hbmltYXRpb24nKSk7XG5cbiAgICB0aGlzLl90YWtlRm9jdXMoKTtcbiAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcbiAgICB0aGlzLmRpc3BhdGNoT3BlbkV2ZW50KCk7XG4gIH1cblxuICAvKiogQ2xvc2VzIHRoZSBzaWRlYmFyLiAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdjbG9zaW5nJyB8fCB0aGlzLnN0YXRlID09PSAnY2xvc2VkJyB8fCAhdGhpcy5kaXNwYXRjaEJlZm9yZUNsb3NlRXZlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcblxuICAgIGNvbnN0IGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uID0gdGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKTtcblxuICAgIGlmICghdGhpcy5oYXNVcGRhdGVkIHx8IGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKSB7XG4gICAgICB0aGlzLmludGVybmFscy5zdGF0ZXMuYWRkKCdza2lwLWFuaW1hdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlID0gJ2Nsb3NpbmcnO1xuICAgIH1cblxuICAgIHRoaXMub3BlbmVkID0gZmFsc2U7XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCB8fCBpc1plcm9BbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgdGhpcy5faGFuZGxlQ2xvc2luZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNsb3NpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIC8vIFdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgcmVtb3ZpbmcgdGhlIGFuaW1hdGlvbiBza2lwIGluc3RydWN0aW9uIGlzIGRvbmUgYSB0aWNrIGxhdGVyLlxuICAgIC8vIE90aGVyd2lzZSwgaXQncyByZW1vdmVkIHRvbyBlYXJseSBhbmQgaXQgZG9lc24ndCBoYXZlIGFueSBlZmZlY3QuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdza2lwLWFuaW1hdGlvbicpKTtcbiAgICB0aGlzLmNlZGVGb2N1cygpO1xuXG4gICAgaWYgKCFpc1NlcnZlciAmJiAodGhpcy5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB8fCB0aGlzLl9pc01vZGVPdmVyKCkpKSB7XG4gICAgICBpZiAodGhpcy5fbGFzdEZvY3VzZWRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuX2xhc3RGb2N1c2VkRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hlcmUgdG8gc2V0IHRoZSBmb2N1cywgYnV0IGhhdmUgdG8gcmVtb3ZlIGl0LCBzbyB3ZSBjYWxsIGJsdXJcbiAgICAgICAgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbGFzdEZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xuICAgIHRoaXMuZGlzcGF0Y2hDbG9zZUV2ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIF90YWtlRm9jdXMoKTogdm9pZCB7XG4gICAgLy8gV2UgcHJldmVudCBjYWxsaW5nIHRoZSBmb2N1cyBzdHVmZiB3aGVuIG5vdCBuZWVkZWRcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNNb2RlT3ZlciA9IHRoaXMuX2lzTW9kZU92ZXIoKTtcblxuICAgIGlmIChpc01vZGVPdmVyIHx8IHRoaXMuZm9jdXNPbk9wZW4pIHtcbiAgICAgIHRoaXMuX2ZvY3VzVHJhcENvbnRyb2xsZXIuZm9jdXNJbml0aWFsRWxlbWVudCgpO1xuICAgIH1cblxuICAgIGlmIChpc01vZGVPdmVyKSB7XG4gICAgICB0aGlzLl9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5jb25uZWN0KCk7XG4gICAgICB0aGlzLl9mb2N1c1RyYXBDb250cm9sbGVyLmVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEludGVybmFsIG1ldGhvZCB0aGF0IHdlIHVzZSBleHRlcm5hbGx5LiBgcHJvdGVjdGVkYCBwcmVzZXJ2ZXMgdHlwZSBpbmZvcm1hdGlvbiBmb3IgdHlwZSBzYWZlIGFjY2Vzcy5cbiAgcHJvdGVjdGVkIGNlZGVGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9mb2N1c1RyYXBDb250cm9sbGVyLmVuYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9lc2NhcGFibGVPdmVybGF5Q29udHJvbGxlci5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVTaWRlYmFyV2lkdGgob2xkUG9zaXRpb24/OiB0aGlzWydwb3NpdGlvbiddKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2xkUG9zaXRpb24pIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0aGlzLl9idWlsZENzc1dpZHRoVmFyKG9sZFBvc2l0aW9uKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLm9mZnNldFdpZHRoO1xuICAgIGlmICghd2lkdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9IGAke3dpZHRofXB4YDtcbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGNvbnRhaW5lci5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuX2J1aWxkQ3NzV2lkdGhWYXIoKSk7XG5cbiAgICBpZiAoYWN0dWFsVmFsdWUgPT09IG5ld1ZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KHRoaXMuX2J1aWxkQ3NzV2lkdGhWYXIoKSwgbmV3VmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRDc3NXaWR0aFZhcihwb3NpdGlvbiA9IHRoaXMucG9zaXRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBgLS1zYmItc2lkZWJhci1jb250YWluZXJfXyR7cG9zaXRpb259LXdpZHRoYDtcbiAgfVxuXG4gIHByaXZhdGUgX2lzTW9kZU92ZXIoKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgdGhlIG1pbmltdW0gc3BhY2UgYXR0cmlidXRlIGlzIHNldCwgdGhlIHNpZGViYXIgc2hvdWxkIGJlaGF2ZSBsaWtlIGluIG1vZGUgb3Zlci5cbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnb3ZlcicgfHwgdGhpcy5tYXRjaGVzKCc6c3RhdGUobW9kZS1vdmVyLWZvcmNlZCknKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVHJhbnNpdGlvbkVuZChldmVudDogVHJhbnNpdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgLy8gV2UgZW5zdXJlIHRoYXQgd2UgcmVhY3QgdG8gdGhlIGZhZGUgaW4gdHJhbnNpdGlvbiBvbiB0aGUgc2JiLXNpZGViYXIgZGl2XG4gICAgaWYgKGV2ZW50LnByb3BlcnR5TmFtZSAhPT0gJ3RyYW5zbGF0ZScgfHwgZXZlbnQudGFyZ2V0ICE9PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2Nsb3NpbmcnKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgQGV2ZW50T3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSlcbiAgcHJpdmF0ZSBfZGV0ZWN0U2Nyb2xsZWRTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVN0YXRlKFxuICAgICAgJ3Njcm9sbGVkJyxcbiAgICAgICh0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoJy5zYmItc2lkZWJhci1jb250ZW50LXNlY3Rpb24nKT8uc2Nyb2xsVG9wID8/IDApID4gMCxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlbmRlcigpOiBUZW1wbGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInNiYi1zaWRlYmFyXCIgQHRyYW5zaXRpb25lbmQ9JHt0aGlzLl9vblRyYW5zaXRpb25FbmR9PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zaWRlYmFyLXRpdGxlLXNlY3Rpb25cIj48c2xvdCBuYW1lPVwidGl0bGUtc2VjdGlvblwiPjwvc2xvdD48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2lkZWJhci1jb250ZW50LXNlY3Rpb25cIiBAc2Nyb2xsPSR7KCkgPT4gdGhpcy5fZGV0ZWN0U2Nyb2xsZWRTdGF0ZSgpfT5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNpZGViYXInOiBTYmJTaWRlYmFyRWxlbWVudDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQ3FCYSwyQkFBaUI7bUJBQVMsMEJBQTBCLHdCQUF3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBQTVFLDBCQUEwQixZQUFrRDs7O3dCQUt0RixTQUFTLEVBQUUsU0FBUyxNQUFNLENBQUMsQ0FBQTt1QkFJM0IsV0FBVyxNQUFPLE1BQU0sU0FBUyxTQUFTLE9BQVEsRUFDbEQsU0FBUyxFQUFFLFNBQVMsTUFBTSxDQUFDLENBQUE7O0lBSTNCLFdBQVcsTUFBTyxNQUFNLFFBQVEsUUFBUSxRQUFTO0lBQ2pELHNCQUFzQixVQUFVLFdBQVcs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
|