@sbb-esta/lyne-elements-dev 5.0.0-next-dev.1776960216 → 5.0.0-next-dev.1777014673
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/alert/alert/alert.component.js +1 -1
- package/alert/alert-group/alert-group.component.js +1 -1
- package/{alert-group.component-CAjj3FtE.js → alert-group.component-BCYOVicl.js} +5 -7
- package/alert.component-BQsF0R1M.js +161 -0
- package/alert.js +2 -2
- package/alert.pure.js +2 -2
- package/core/styles/core.scss +11 -0
- package/core.css +19 -0
- package/custom-elements.json +956 -956
- package/development/alert/alert/alert.component.d.ts +1 -0
- package/development/alert/alert/alert.component.d.ts.map +1 -1
- package/development/alert/alert/alert.component.js +1 -1
- package/development/alert/alert-group/alert-group.component.d.ts.map +1 -1
- package/development/alert/alert-group/alert-group.component.js +1 -1
- package/development/alert-group.component-D4KxKTd2.js +186 -0
- package/development/alert.component-Pv-Ol6XU.js +213 -0
- package/development/alert.js +2 -2
- package/development/alert.pure.js +2 -2
- package/off-brand-theme.css +19 -0
- package/package.json +2 -2
- package/safety-theme.css +19 -0
- package/standard-theme.css +19 -0
- package/alert.component-C42LwoGa.js +0 -163
- package/development/alert-group.component-DeI6kuwn.js +0 -188
- package/development/alert.component-Cn36k_Hf.js +0 -214
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
import { __esDecorate, __runInitializers } from "tslib";
|
|
2
|
-
import { html, nothing, unsafeCSS } from "lit";
|
|
3
|
-
import { property } from "lit/decorators.js";
|
|
4
|
-
import { SbbDarkModeController, SbbLanguageController, SbbOpenCloseBaseElement, SbbReadonlyMixin, boxSizingStyles, i18nCloseAlert, isLean, isZeroAnimationDuration } from "./core.js";
|
|
5
|
-
import { SbbTransparentButtonElement } from "./button.pure.js";
|
|
6
|
-
import { SbbDividerElement } from "./divider.pure.js";
|
|
7
|
-
import { SbbIconNameMixin } from "./icon.pure.js";
|
|
8
|
-
//#region src/elements/alert/alert/alert.scss?inline
|
|
9
|
-
var alert_default = ":host {\n display: block;\n --sbb-alert-background-color: var(--sbb-background-color-1-inverted);\n --sbb-alert-border-radius: var(--sbb-border-radius-4x);\n --sbb-alert-color: var(--sbb-color-aluminium);\n --sbb-alert-color: light-dark(var(--sbb-color-aluminium), var(--sbb-color-anthracite));\n --sbb-alert-padding: var(--sbb-spacing-responsive-xxs) var(--sbb-spacing-responsive-xs);\n --sbb-alert-icon-size: 1.25rem;\n --sbb-alert-close-icon-margin: var(--sbb-spacing-responsive-xxs);\n --sbb-alert-gap: var(--sbb-spacing-fixed-2x) var(--sbb-spacing-responsive-xs);\n --sbb-alert-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n --sbb-alert-timing-function: ease-in;\n --sbb-alert-title-margin-block: 0;\n}\n@media (min-width: calc(64rem)) {\n :host {\n --sbb-alert-icon-size: 1.75rem;\n }\n}\n@media (forced-colors: active) {\n :host {\n outline: var(--sbb-border-width-1x) solid CanvasText;\n border-radius: var(--sbb-alert-border-radius);\n }\n}\n\n:host(:is(:state(state-opening),[state--state-opening]):not([animation=open], [animation=all])) {\n --sbb-disable-animation-duration: 0s;\n}\n\n:host(:is(:state(state-closing),[state--state-closing]):not([animation=close], [animation=all])) {\n --sbb-disable-animation-duration: 0s;\n}\n\n:host([size=s]) {\n --sbb-alert-gap: var(--sbb-spacing-fixed-1x) var(--sbb-spacing-responsive-xxs);\n --sbb-alert-close-icon-margin: var(--sbb-spacing-responsive-xxxs);\n}\n\n:host([size=l]) {\n --sbb-alert-icon-size: var(--sbb-size-icon-ui-small);\n --sbb-alert-title-margin-block: 0 var(--sbb-spacing-fixed-1x);\n}\n@media (min-width: calc(64rem)) {\n :host([size=l]) {\n --sbb-alert-icon-size: 2.125rem;\n }\n}\n\n:host(:not(:is(:state(dark),[state--dark]))) {\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n}\n\n.sbb-alert__transition-wrapper {\n display: grid;\n grid-template-rows: 0fr;\n opacity: 0;\n}\n:host(:is(:is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) .sbb-alert__transition-wrapper {\n grid-template-rows: 1fr;\n opacity: 1;\n}\n:host(:is(:state(state-opening),[state--state-opening])) .sbb-alert__transition-wrapper {\n animation-name: open, open-opacity;\n animation-fill-mode: forwards;\n animation-duration: var(--sbb-alert-animation-duration);\n animation-timing-function: var(--sbb-alert-timing-function);\n animation-delay: 0s, var(--sbb-alert-animation-duration);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-alert__transition-wrapper {\n animation-name: close-opacity, close;\n animation-fill-mode: forwards;\n animation-duration: var(--sbb-alert-animation-duration);\n animation-timing-function: var(--sbb-alert-timing-function);\n animation-delay: 0s, var(--sbb-disable-animation-duration, var(--sbb-animation-duration-2x));\n}\n\n.sbb-alert__transition-sub-wrapper {\n overflow: hidden;\n}\n\n.sbb-alert {\n --sbb-text-font-size: var(--sbb-text-font-size-s);\n font-family: var(--sbb-typo-font-family);\n font-weight: normal;\n line-height: var(--sbb-typo-line-height-text);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n font-size: var(--sbb-text-font-size);\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: center;\n gap: var(--sbb-alert-gap);\n min-width: fit-content;\n padding: var(--sbb-alert-padding);\n overflow: hidden;\n color: var(--sbb-alert-color);\n background-color: var(--sbb-alert-background-color);\n border-radius: var(--sbb-alert-border-radius);\n}\n@media (min-width: calc(37.5rem)) {\n .sbb-alert {\n grid-template-columns: auto 1fr auto;\n align-items: flex-start;\n }\n}\n\n.sbb-alert__icon {\n display: flex;\n align-items: start;\n padding-block: var(--sbb-spacing-fixed-1x);\n min-width: var(--sbb-alert-icon-size);\n --sbb-icon-svg-width: var(--sbb-alert-icon-size);\n --sbb-icon-svg-height: var(--sbb-alert-icon-size);\n}\n\n.sbb-alert__content {\n color-scheme: only light;\n order: 3;\n grid-column: 1/3;\n}\n@media (min-width: calc(37.5rem)) {\n .sbb-alert__content {\n order: initial;\n grid-column-start: initial;\n grid-column-end: initial;\n }\n}\n\n.sbb-alert__content-slot {\n display: inline;\n margin: 0;\n padding: 0;\n}\n\n.sbb-alert__close-button-wrapper {\n color-scheme: only light;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n height: 100%;\n}\n\n@media (min-width: calc(37.5rem)) {\n .sbb-alert__close-button {\n margin-inline-start: var(--sbb-alert-close-icon-margin);\n }\n}\n\n.sbb-alert__close-button-divider {\n display: none;\n}\n@media (min-width: calc(37.5rem)) {\n .sbb-alert__close-button-divider {\n display: block;\n height: calc(100% - var(--sbb-spacing-fixed-1x) * 2);\n }\n}\n\n@keyframes open {\n from {\n grid-template-rows: 0fr;\n }\n to {\n grid-template-rows: 1fr;\n }\n}\n@keyframes open-opacity {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes close {\n from {\n grid-template-rows: 1fr;\n }\n to {\n grid-template-rows: 0fr;\n }\n}\n@keyframes close-opacity {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n::slotted(sbb-title) {\n margin-block: var(--sbb-alert-title-margin-block);\n}";
|
|
10
|
-
//#endregion
|
|
11
|
-
//#region src/elements/alert/alert/alert.component.ts
|
|
12
|
-
/**
|
|
13
|
-
* It displays messages which require user's attention.
|
|
14
|
-
*
|
|
15
|
-
* @slot - Use the unnamed slot to add content to the `sbb-alert`. At a minimum an `sbb-title` element and a descriptive text should be used.
|
|
16
|
-
* @slot icon - Should be a `sbb-icon` which is displayed next to the title. Styling is optimized for icons of type HIM-CUS.
|
|
17
|
-
* @slot title - Slot for the title. For the standard `sbb-title` element, the slot is automatically assigned when slotted in the unnamed slot.
|
|
18
|
-
*/
|
|
19
|
-
var SbbAlertElement = (() => {
|
|
20
|
-
let _classSuper = SbbIconNameMixin(SbbReadonlyMixin(SbbOpenCloseBaseElement));
|
|
21
|
-
let _size_decorators;
|
|
22
|
-
let _size_initializers = [];
|
|
23
|
-
let _size_extraInitializers = [];
|
|
24
|
-
let _animation_decorators;
|
|
25
|
-
let _animation_initializers = [];
|
|
26
|
-
let _animation_extraInitializers = [];
|
|
27
|
-
return class SbbAlertElement extends _classSuper {
|
|
28
|
-
constructor() {
|
|
29
|
-
super(...arguments);
|
|
30
|
-
this.#size_accessor_storage = __runInitializers(this, _size_initializers, isLean() ? "s" : "m");
|
|
31
|
-
this.#animation_accessor_storage = (__runInitializers(this, _size_extraInitializers), __runInitializers(this, _animation_initializers, "all"));
|
|
32
|
-
this._language = (__runInitializers(this, _animation_extraInitializers), new SbbLanguageController(this));
|
|
33
|
-
this._darkModeController = new SbbDarkModeController(this, () => {
|
|
34
|
-
this._syncLinks();
|
|
35
|
-
this._configureTitle();
|
|
36
|
-
this.requestUpdate();
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
static {
|
|
40
|
-
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
41
|
-
_size_decorators = [property({ reflect: true })];
|
|
42
|
-
_animation_decorators = [property({ reflect: true })];
|
|
43
|
-
__esDecorate(this, null, _size_decorators, {
|
|
44
|
-
kind: "accessor",
|
|
45
|
-
name: "size",
|
|
46
|
-
static: false,
|
|
47
|
-
private: false,
|
|
48
|
-
access: {
|
|
49
|
-
has: (obj) => "size" in obj,
|
|
50
|
-
get: (obj) => obj.size,
|
|
51
|
-
set: (obj, value) => {
|
|
52
|
-
obj.size = value;
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
metadata: _metadata
|
|
56
|
-
}, _size_initializers, _size_extraInitializers);
|
|
57
|
-
__esDecorate(this, null, _animation_decorators, {
|
|
58
|
-
kind: "accessor",
|
|
59
|
-
name: "animation",
|
|
60
|
-
static: false,
|
|
61
|
-
private: false,
|
|
62
|
-
access: {
|
|
63
|
-
has: (obj) => "animation" in obj,
|
|
64
|
-
get: (obj) => obj.animation,
|
|
65
|
-
set: (obj, value) => {
|
|
66
|
-
obj.animation = value;
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
metadata: _metadata
|
|
70
|
-
}, _animation_initializers, _animation_extraInitializers);
|
|
71
|
-
if (_metadata) Object.defineProperty(this, Symbol.metadata, {
|
|
72
|
-
enumerable: true,
|
|
73
|
-
configurable: true,
|
|
74
|
-
writable: true,
|
|
75
|
-
value: _metadata
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
static {
|
|
79
|
-
this.elementName = "sbb-alert";
|
|
80
|
-
}
|
|
81
|
-
static {
|
|
82
|
-
this.elementDependencies = [SbbTransparentButtonElement, SbbDividerElement];
|
|
83
|
-
}
|
|
84
|
-
static {
|
|
85
|
-
this.styles = [boxSizingStyles, unsafeCSS(alert_default)];
|
|
86
|
-
}
|
|
87
|
-
static {
|
|
88
|
-
this.events = {
|
|
89
|
-
beforeopen: "beforeopen",
|
|
90
|
-
open: "open",
|
|
91
|
-
beforeclose: "beforeclose",
|
|
92
|
-
close: "close"
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
#size_accessor_storage;
|
|
96
|
-
/**
|
|
97
|
-
* You can choose between `s`, `m` or `l` size.
|
|
98
|
-
* @default 'm' / 's' (lean)
|
|
99
|
-
*/
|
|
100
|
-
get size() {
|
|
101
|
-
return this.#size_accessor_storage;
|
|
102
|
-
}
|
|
103
|
-
set size(value) {
|
|
104
|
-
this.#size_accessor_storage = value;
|
|
105
|
-
}
|
|
106
|
-
#animation_accessor_storage;
|
|
107
|
-
/** The enabled animations. */
|
|
108
|
-
get animation() {
|
|
109
|
-
return this.#animation_accessor_storage;
|
|
110
|
-
}
|
|
111
|
-
set animation(value) {
|
|
112
|
-
this.#animation_accessor_storage = value;
|
|
113
|
-
}
|
|
114
|
-
/** Open the alert. */
|
|
115
|
-
open() {
|
|
116
|
-
this.state = "opening";
|
|
117
|
-
if (!this.dispatchBeforeOpenEvent()) return;
|
|
118
|
-
if (this._isZeroAnimationDuration()) this._handleOpening();
|
|
119
|
-
}
|
|
120
|
-
/** Close the alert. */
|
|
121
|
-
close() {
|
|
122
|
-
if (this.state === "opened" && this.dispatchBeforeCloseEvent()) {
|
|
123
|
-
this.state = "closing";
|
|
124
|
-
if (this._isZeroAnimationDuration()) this._handleClosing();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
firstUpdated(changedProperties) {
|
|
128
|
-
super.firstUpdated(changedProperties);
|
|
129
|
-
this.open();
|
|
130
|
-
}
|
|
131
|
-
willUpdate(changedProperties) {
|
|
132
|
-
super.willUpdate(changedProperties);
|
|
133
|
-
if (changedProperties.has("size")) this._configureTitle();
|
|
134
|
-
}
|
|
135
|
-
_isZeroAnimationDuration() {
|
|
136
|
-
return isZeroAnimationDuration(this, "--sbb-alert-animation-duration");
|
|
137
|
-
}
|
|
138
|
-
_onAnimationEnd(event) {
|
|
139
|
-
if (this.state === "opening" && event.animationName === "open-opacity") this._handleOpening();
|
|
140
|
-
else if (this.state === "closing" && event.animationName === "close") this._handleClosing();
|
|
141
|
-
}
|
|
142
|
-
_handleOpening() {
|
|
143
|
-
this.state = "opened";
|
|
144
|
-
this.dispatchOpenEvent();
|
|
145
|
-
}
|
|
146
|
-
_handleClosing() {
|
|
147
|
-
this.state = "closed";
|
|
148
|
-
this.dispatchCloseEvent();
|
|
149
|
-
setTimeout(() => this.remove());
|
|
150
|
-
}
|
|
151
|
-
_handleSlotchange() {
|
|
152
|
-
this._syncLinks();
|
|
153
|
-
const title = Array.from(this.children).find((el) => el.localName === "sbb-title");
|
|
154
|
-
if (title) title.slot = "title";
|
|
155
|
-
}
|
|
156
|
-
_syncLinks() {
|
|
157
|
-
Array.from(this.querySelectorAll?.("sbb-link") ?? []).forEach((link) => {
|
|
158
|
-
customElements.upgrade(link);
|
|
159
|
-
link.negative = this._isLightMode();
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
_configureTitle() {
|
|
163
|
-
const title = this.querySelector?.("sbb-title");
|
|
164
|
-
if (title) {
|
|
165
|
-
customElements.upgrade(title);
|
|
166
|
-
title.negative = this._isLightMode();
|
|
167
|
-
title.visualLevel = this.size === "l" ? "3" : "5";
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
_isLightMode() {
|
|
171
|
-
return !this._darkModeController.matches();
|
|
172
|
-
}
|
|
173
|
-
renderIconName() {
|
|
174
|
-
return super.renderIconName() || "info";
|
|
175
|
-
}
|
|
176
|
-
render() {
|
|
177
|
-
return html`
|
|
178
|
-
<div class="sbb-alert__transition-wrapper" @animationend=${this._onAnimationEnd}>
|
|
179
|
-
<!-- sub wrapper needed to properly support fade in animation -->
|
|
180
|
-
<div class="sbb-alert__transition-sub-wrapper">
|
|
181
|
-
<div class="sbb-alert">
|
|
182
|
-
<span class="sbb-alert__icon"> ${this.renderIconSlot()} </span>
|
|
183
|
-
<span class="sbb-alert__content">
|
|
184
|
-
<slot name="title" @slotchange=${this._configureTitle}></slot>
|
|
185
|
-
<p class="sbb-alert__content-slot">
|
|
186
|
-
<slot @slotchange=${this._handleSlotchange}></slot>
|
|
187
|
-
</p>
|
|
188
|
-
</span>
|
|
189
|
-
${!this.readOnly ? html`<span class="sbb-alert__close-button-wrapper">
|
|
190
|
-
<sbb-divider
|
|
191
|
-
orientation="vertical"
|
|
192
|
-
?negative=${this._isLightMode()}
|
|
193
|
-
class="sbb-alert__close-button-divider"
|
|
194
|
-
></sbb-divider>
|
|
195
|
-
<sbb-transparent-button
|
|
196
|
-
?negative=${this._isLightMode()}
|
|
197
|
-
size=${this.size === "l" ? "m" : this.size}
|
|
198
|
-
icon-name="cross-small"
|
|
199
|
-
@click=${() => this.close()}
|
|
200
|
-
aria-label=${i18nCloseAlert[this._language.current]}
|
|
201
|
-
class="sbb-alert__close-button"
|
|
202
|
-
></sbb-transparent-button>
|
|
203
|
-
</span>` : nothing}
|
|
204
|
-
</div>
|
|
205
|
-
</div>
|
|
206
|
-
</div>
|
|
207
|
-
`;
|
|
208
|
-
}
|
|
209
|
-
};
|
|
210
|
-
})();
|
|
211
|
-
//#endregion
|
|
212
|
-
export { SbbAlertElement as t };
|
|
213
|
-
|
|
214
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuY29tcG9uZW50LUNuMzZrX0hmLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9hbGVydC9hbGVydC9hbGVydC5zY3NzP2lubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9hbGVydC9hbGVydC9hbGVydC5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuLy8gT3Blbi9DbG9zZSBhbmltYXRpb24gdmFyc1xuJG9wZW4tYW5pbS1yb3dzLWZyb206IDBmcjtcbiRvcGVuLWFuaW0tcm93cy10bzogMWZyO1xuJG9wZW4tYW5pbS1vcGFjaXR5LWZyb206IDA7XG4kb3Blbi1hbmltLW9wYWNpdHktdG86IDE7XG5cbjpob3N0IHtcbiAgZGlzcGxheTogYmxvY2s7XG5cbiAgLS1zYmItYWxlcnQtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2JiLWJhY2tncm91bmQtY29sb3ItMS1pbnZlcnRlZCk7XG4gIC0tc2JiLWFsZXJ0LWJvcmRlci1yYWRpdXM6IHZhcigtLXNiYi1ib3JkZXItcmFkaXVzLTR4KTtcbiAgLS1zYmItYWxlcnQtY29sb3I6IGxpZ2h0LWRhcmsodmFyKC0tc2JiLWNvbG9yLWFsdW1pbml1bSksIHZhcigtLXNiYi1jb2xvci1hbnRocmFjaXRlKSk7XG4gIC0tc2JiLWFsZXJ0LXBhZGRpbmc6IHZhcigtLXNiYi1zcGFjaW5nLXJlc3BvbnNpdmUteHhzKSB2YXIoLS1zYmItc3BhY2luZy1yZXNwb25zaXZlLXhzKTtcbiAgLS1zYmItYWxlcnQtaWNvbi1zaXplOiAje3NiYi5weC10by1yZW0tYnVpbGQoMjApfTtcbiAgLS1zYmItYWxlcnQtY2xvc2UtaWNvbi1tYXJnaW46IHZhcigtLXNiYi1zcGFjaW5nLXJlc3BvbnNpdmUteHhzKTtcbiAgLS1zYmItYWxlcnQtZ2FwOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0yeCkgdmFyKC0tc2JiLXNwYWNpbmctcmVzcG9uc2l2ZS14cyk7XG4gIC0tc2JiLWFsZXJ0LWFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKFxuICAgIC0tc2JiLWRpc2FibGUtYW5pbWF0aW9uLWR1cmF0aW9uLFxuICAgIHZhcigtLXNiYi1hbmltYXRpb24tZHVyYXRpb24tNngpXG4gICk7XG4gIC0tc2JiLWFsZXJ0LXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjtcbiAgLS1zYmItYWxlcnQtdGl0bGUtbWFyZ2luLWJsb2NrOiAwO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICAtLXNiYi1hbGVydC1pY29uLXNpemU6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgyOCl9O1xuICB9XG5cbiAgQGluY2x1ZGUgc2JiLmlmLWZvcmNlZC1jb2xvcnMge1xuICAgIC8vIFVzZSBvdXRsaW5lIGhlcmUgdG8gbm90IGluZmx1ZW5jZSBjb250ZW50IHBvc2l0aW9uLlxuICAgIC8vIER1ZSB0byBvdmVyZmxvdyBoaWRkZW4gb2YgaW5uZXIgZWxlbWVudHMgaXQncyBwbGFjZWQgb24gaG9zdC5cbiAgICBvdXRsaW5lOiB2YXIoLS1zYmItYm9yZGVyLXdpZHRoLTF4KSBzb2xpZCBDYW52YXNUZXh0O1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXNiYi1hbGVydC1ib3JkZXItcmFkaXVzKTtcbiAgfVxufVxuXG4vLyBCeSBkZWZhdWx0LCB0aGUgb3BlbiBhbmltYXRpb24gaXMgZGlzYWJsZWRcbjpob3N0KDpzdGF0ZShzdGF0ZS1vcGVuaW5nKTpub3QoW2FuaW1hdGlvbj0nb3BlbiddLCBbYW5pbWF0aW9uPSdhbGwnXSkpIHtcbiAgQGluY2x1ZGUgc2JiLmRpc2FibGUtYW5pbWF0aW9uO1xufVxuXG46aG9zdCg6c3RhdGUoc3RhdGUtY2xvc2luZyk6bm90KFthbmltYXRpb249J2Nsb3NlJ10sIFthbmltYXRpb249J2FsbCddKSkge1xuICBAaW5jbHVkZSBzYmIuZGlzYWJsZS1hbmltYXRpb247XG59XG5cbjpob3N0KFtzaXplPSdzJ10pIHtcbiAgLS1zYmItYWxlcnQtZ2FwOiB2YXIoLS1zYmItc3BhY2luZy1maXhlZC0xeCkgdmFyKC0tc2JiLXNwYWNpbmctcmVzcG9uc2l2ZS14eHMpO1xuICAtLXNiYi1hbGVydC1jbG9zZS1pY29uLW1hcmdpbjogdmFyKC0tc2JiLXNwYWNpbmctcmVzcG9uc2l2ZS14eHhzKTtcbn1cblxuOmhvc3QoW3NpemU9J2wnXSkge1xuICAtLXNiYi1hbGVydC1pY29uLXNpemU6IHZhcigtLXNiYi1zaXplLWljb24tdWktc21hbGwpO1xuICAtLXNiYi1hbGVydC10aXRsZS1tYXJnaW4tYmxvY2s6IDAgdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMXgpO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogbGFyZ2UpIHtcbiAgICAtLXNiYi1hbGVydC1pY29uLXNpemU6ICN7c2JiLnB4LXRvLXJlbS1idWlsZCgzNCl9O1xuICB9XG59XG5cbjpob3N0KDpub3QoOnN0YXRlKGRhcmspKSkge1xuICAtLXNiYi1mb2N1cy1vdXRsaW5lLWNvbG9yOiB2YXIoLS1zYmItZm9jdXMtb3V0bGluZS1jb2xvci1kYXJrKTtcbn1cblxuLnNiYi1hbGVydF9fdHJhbnNpdGlvbi13cmFwcGVyIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAjeyRvcGVuLWFuaW0tcm93cy1mcm9tfTtcbiAgb3BhY2l0eTogI3skb3Blbi1hbmltLW9wYWNpdHktZnJvbX07XG5cbiAgOmhvc3QoOmlzKDpzdGF0ZShzdGF0ZS1vcGVuZWQpLCA6c3RhdGUoc3RhdGUtY2xvc2luZykpKSAmIHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6ICN7JG9wZW4tYW5pbS1yb3dzLXRvfTtcbiAgICBvcGFjaXR5OiAjeyRvcGVuLWFuaW0tb3BhY2l0eS10b307XG4gIH1cblxuICA6aG9zdCg6c3RhdGUoc3RhdGUtb3BlbmluZykpICYge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBvcGVuLCBvcGVuLW9wYWNpdHk7XG4gICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7XG4gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1zYmItYWxlcnQtYW5pbWF0aW9uLWR1cmF0aW9uKTtcbiAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1zYmItYWxlcnQtdGltaW5nLWZ1bmN0aW9uKTtcbiAgICBhbmltYXRpb24tZGVsYXk6IDBzLCB2YXIoLS1zYmItYWxlcnQtYW5pbWF0aW9uLWR1cmF0aW9uKTtcbiAgfVxuXG4gIDpob3N0KDpzdGF0ZShzdGF0ZS1jbG9zaW5nKSkgJiB7XG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICBuYW1lOiBjbG9zZS1vcGFjaXR5LCBjbG9zZTtcbiAgICAgIGZpbGwtbW9kZTogZm9yd2FyZHM7XG4gICAgICBkdXJhdGlvbjogdmFyKC0tc2JiLWFsZXJ0LWFuaW1hdGlvbi1kdXJhdGlvbik7XG4gICAgICB0aW1pbmctZnVuY3Rpb246IHZhcigtLXNiYi1hbGVydC10aW1pbmctZnVuY3Rpb24pO1xuICAgICAgZGVsYXk6IDBzLCB2YXIoLS1zYmItZGlzYWJsZS1hbmltYXRpb24tZHVyYXRpb24sIHZhcigtLXNiYi1hbmltYXRpb24tZHVyYXRpb24tMngpKTtcbiAgICB9XG4gIH1cbn1cblxuLnNiYi1hbGVydF9fdHJhbnNpdGlvbi1zdWItd3JhcHBlciB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5zYmItYWxlcnQge1xuICBAaW5jbHVkZSBzYmIudGV4dC1zLS1yZWd1bGFyO1xuXG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIGF1dG87XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogdmFyKC0tc2JiLWFsZXJ0LWdhcCk7XG4gIG1pbi13aWR0aDogZml0LWNvbnRlbnQ7XG4gIHBhZGRpbmc6IHZhcigtLXNiYi1hbGVydC1wYWRkaW5nKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgY29sb3I6IHZhcigtLXNiYi1hbGVydC1jb2xvcik7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNiYi1hbGVydC1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2JiLWFsZXJ0LWJvcmRlci1yYWRpdXMpO1xuXG4gIEBpbmNsdWRlIHNiYi5tcSgkZnJvbTogc21hbGwpIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gMWZyIGF1dG87XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gIH1cbn1cblxuLnNiYi1hbGVydF9faWNvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBzdGFydDtcbiAgcGFkZGluZy1ibG9jazogdmFyKC0tc2JiLXNwYWNpbmctZml4ZWQtMXgpO1xuICBtaW4td2lkdGg6IHZhcigtLXNiYi1hbGVydC1pY29uLXNpemUpO1xuXG4gIC0tc2JiLWljb24tc3ZnLXdpZHRoOiB2YXIoLS1zYmItYWxlcnQtaWNvbi1zaXplKTtcbiAgLS1zYmItaWNvbi1zdmctaGVpZ2h0OiB2YXIoLS1zYmItYWxlcnQtaWNvbi1zaXplKTtcbn1cblxuLnNiYi1hbGVydF9fY29udGVudCB7XG4gIC8vIEFzIHRoZSBiYWNrZ3JvdW5kIHR1cm5zIHdoaXRlLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFsbCBjb250ZW50IGlzIGRpc3BsYXllZCBpbiBsaWdodCBtb2RlLlxuICBjb2xvci1zY2hlbWU6IG9ubHkgbGlnaHQ7XG4gIG9yZGVyOiAzO1xuICBncmlkLWNvbHVtbjogMSAvIDM7XG5cbiAgQGluY2x1ZGUgc2JiLm1xKCRmcm9tOiBzbWFsbCkge1xuICAgIG9yZGVyOiBpbml0aWFsO1xuICAgIGdyaWQtY29sdW1uLXN0YXJ0OiBpbml0aWFsO1xuICAgIGdyaWQtY29sdW1uLWVuZDogaW5pdGlhbDtcbiAgfVxufVxuXG4uc2JiLWFsZXJ0X19jb250ZW50LXNsb3Qge1xuICAvLyBSZXNldCBwYXJhZ3JhcGggc3R5bGVzXG4gIGRpc3BsYXk6IGlubGluZTtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG4uc2JiLWFsZXJ0X19jbG9zZS1idXR0b24td3JhcHBlciB7XG4gIC8vIEFzIHRoZSBiYWNrZ3JvdW5kIHR1cm5zIHdoaXRlLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBidXR0b24gaXMgZGlzcGxheWVkIGluIGxpZ2h0IG1vZGUuXG4gIGNvbG9yLXNjaGVtZTogb25seSBsaWdodDtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uc2JiLWFsZXJ0X19jbG9zZS1idXR0b24ge1xuICBAaW5jbHVkZSBzYmIubXEoJGZyb206IHNtYWxsKSB7XG4gICAgbWFyZ2luLWlubGluZS1zdGFydDogdmFyKC0tc2JiLWFsZXJ0LWNsb3NlLWljb24tbWFyZ2luKTtcbiAgfVxufVxuXG4uc2JiLWFsZXJ0X19jbG9zZS1idXR0b24tZGl2aWRlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG5cbiAgQGluY2x1ZGUgc2JiLm1xKCRmcm9tOiBzbWFsbCkge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGhlaWdodDogY2FsYygxMDAlIC0gKHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTF4KSAqIDIpKTtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIG9wZW4ge1xuICBmcm9tIHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6ICN7JG9wZW4tYW5pbS1yb3dzLWZyb219O1xuICB9XG5cbiAgdG8ge1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogI3skb3Blbi1hbmltLXJvd3MtdG99O1xuICB9XG59XG5cbkBrZXlmcmFtZXMgb3Blbi1vcGFjaXR5IHtcbiAgZnJvbSB7XG4gICAgb3BhY2l0eTogI3skb3Blbi1hbmltLW9wYWNpdHktZnJvbX07XG4gIH1cblxuICB0byB7XG4gICAgb3BhY2l0eTogI3skb3Blbi1hbmltLW9wYWNpdHktdG99O1xuICB9XG59XG5cbkBrZXlmcmFtZXMgY2xvc2Uge1xuICBmcm9tIHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6ICN7JG9wZW4tYW5pbS1yb3dzLXRvfTtcbiAgfVxuXG4gIHRvIHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6ICN7JG9wZW4tYW5pbS1yb3dzLWZyb219O1xuICB9XG59XG5cbkBrZXlmcmFtZXMgY2xvc2Utb3BhY2l0eSB7XG4gIGZyb20ge1xuICAgIG9wYWNpdHk6ICN7JG9wZW4tYW5pbS1vcGFjaXR5LXRvfTtcbiAgfVxuXG4gIHRvIHtcbiAgICBvcGFjaXR5OiAjeyRvcGVuLWFuaW0tb3BhY2l0eS1mcm9tfTtcbiAgfVxufVxuXG46OnNsb3R0ZWQoc2JiLXRpdGxlKSB7XG4gIC8vIE92ZXJ3cml0ZSBzYmItdGl0bGUgZGVmYXVsdCBtYXJnaW5cbiAgbWFyZ2luLWJsb2NrOiB2YXIoLS1zYmItYWxlcnQtdGl0bGUtbWFyZ2luLWJsb2NrKTtcbn1cbiIsImltcG9ydCB7XG4gIHR5cGUgQ1NTUmVzdWx0R3JvdXAsXG4gIGh0bWwsXG4gIG5vdGhpbmcsXG4gIHR5cGUgUHJvcGVydHlWYWx1ZXMsXG4gIHR5cGUgVGVtcGxhdGVSZXN1bHQsXG4gIHVuc2FmZUNTUyxcbn0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBTYmJUcmFuc3BhcmVudEJ1dHRvbkVsZW1lbnQgfSBmcm9tICcuLi8uLi9idXR0b24ucHVyZS50cyc7XG5pbXBvcnQge1xuICBib3hTaXppbmdTdHlsZXMsXG4gIGkxOG5DbG9zZUFsZXJ0LFxuICBpc0xlYW4sXG4gIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uLFxuICBTYmJEYXJrTW9kZUNvbnRyb2xsZXIsXG4gIHR5cGUgU2JiRWxlbWVudFR5cGUsXG4gIFNiYkxhbmd1YWdlQ29udHJvbGxlcixcbiAgU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQsXG4gIFNiYlJlYWRvbmx5TWl4aW4sXG59IGZyb20gJy4uLy4uL2NvcmUudHMnO1xuaW1wb3J0IHsgU2JiRGl2aWRlckVsZW1lbnQgfSBmcm9tICcuLi8uLi9kaXZpZGVyLnB1cmUudHMnO1xuaW1wb3J0IHsgU2JiSWNvbk5hbWVNaXhpbiB9IGZyb20gJy4uLy4uL2ljb24ucHVyZS50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYkxpbmtFbGVtZW50IH0gZnJvbSAnLi4vLi4vbGluay5wdXJlLnRzJztcbmltcG9ydCB0eXBlIHsgU2JiVGl0bGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vdGl0bGUucHVyZS50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL2FsZXJ0LnNjc3M/aW5saW5lJztcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBtZXNzYWdlcyB3aGljaCByZXF1aXJlIHVzZXIncyBhdHRlbnRpb24uXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBhZGQgY29udGVudCB0byB0aGUgYHNiYi1hbGVydGAuIEF0IGEgbWluaW11bSBhbiBgc2JiLXRpdGxlYCBlbGVtZW50IGFuZCBhIGRlc2NyaXB0aXZlIHRleHQgc2hvdWxkIGJlIHVzZWQuXG4gKiBAc2xvdCBpY29uIC0gU2hvdWxkIGJlIGEgYHNiYi1pY29uYCB3aGljaCBpcyBkaXNwbGF5ZWQgbmV4dCB0byB0aGUgdGl0bGUuIFN0eWxpbmcgaXMgb3B0aW1pemVkIGZvciBpY29ucyBvZiB0eXBlIEhJTS1DVVMuXG4gKiBAc2xvdCB0aXRsZSAtIFNsb3QgZm9yIHRoZSB0aXRsZS4gRm9yIHRoZSBzdGFuZGFyZCBgc2JiLXRpdGxlYCBlbGVtZW50LCB0aGUgc2xvdCBpcyBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIHdoZW4gc2xvdHRlZCBpbiB0aGUgdW5uYW1lZCBzbG90LlxuICovXG5leHBvcnQgY2xhc3MgU2JiQWxlcnRFbGVtZW50IGV4dGVuZHMgU2JiSWNvbk5hbWVNaXhpbihTYmJSZWFkb25seU1peGluKFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50KSkge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLWFsZXJ0JztcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBlbGVtZW50RGVwZW5kZW5jaWVzOiBTYmJFbGVtZW50VHlwZVtdID0gW1xuICAgIFNiYlRyYW5zcGFyZW50QnV0dG9uRWxlbWVudCxcbiAgICBTYmJEaXZpZGVyRWxlbWVudCxcbiAgXTtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gW2JveFNpemluZ1N0eWxlcywgdW5zYWZlQ1NTKHN0eWxlKV07XG4gIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIGJlZm9yZW9wZW46ICdiZWZvcmVvcGVuJyxcbiAgICBvcGVuOiAnb3BlbicsXG4gICAgYmVmb3JlY2xvc2U6ICdiZWZvcmVjbG9zZScsXG4gICAgY2xvc2U6ICdjbG9zZScsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gY2hvb3NlIGJldHdlZW4gYHNgLCBgbWAgb3IgYGxgIHNpemUuXG4gICAqIEBkZWZhdWx0ICdtJyAvICdzJyAobGVhbilcbiAgICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUgfSkgcHVibGljIGFjY2Vzc29yIHNpemU6ICdzJyB8ICdtJyB8ICdsJyA9IGlzTGVhbigpID8gJ3MnIDogJ20nO1xuXG4gIC8qKiBUaGUgZW5hYmxlZCBhbmltYXRpb25zLiAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlIH0pIHB1YmxpYyBhY2Nlc3NvciBhbmltYXRpb246ICdvcGVuJyB8ICdjbG9zZScgfCAnYWxsJyB8ICdub25lJyA9ICdhbGwnO1xuXG4gIHByaXZhdGUgX2xhbmd1YWdlID0gbmV3IFNiYkxhbmd1YWdlQ29udHJvbGxlcih0aGlzKTtcbiAgcHJpdmF0ZSBfZGFya01vZGVDb250cm9sbGVyID0gbmV3IFNiYkRhcmtNb2RlQ29udHJvbGxlcih0aGlzLCAoKSA9PiB7XG4gICAgdGhpcy5fc3luY0xpbmtzKCk7XG4gICAgdGhpcy5fY29uZmlndXJlVGl0bGUoKTtcbiAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTtcbiAgfSk7XG5cbiAgLyoqIE9wZW4gdGhlIGFsZXJ0LiAqL1xuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ29wZW5pbmcnO1xuXG4gICAgaWYgKCF0aGlzLmRpc3BhdGNoQmVmb3JlT3BlbkV2ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGR1cmF0aW9uIGlzIHplcm8sIHRoZSBhbmltYXRpb25lbmQgZXZlbnQgaXMgbm90IGFsd2F5cyBmaXJlZCByZWxpYWJseS5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgb3BlbmVkYCBzdGF0ZS5cbiAgICBpZiAodGhpcy5faXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKSkge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgYWxlcnQuICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcgJiYgdGhpcy5kaXNwYXRjaEJlZm9yZUNsb3NlRXZlbnQoKSkge1xuICAgICAgdGhpcy5zdGF0ZSA9ICdjbG9zaW5nJztcblxuICAgICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZGlyZWN0bHkgc2V0IHRoZSBgY2xvc2VkYCBzdGF0ZS5cbiAgICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICB0aGlzLm9wZW4oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2l6ZScpKSB7XG4gICAgICB0aGlzLl9jb25maWd1cmVUaXRsZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1plcm9BbmltYXRpb25EdXJhdGlvbih0aGlzLCAnLS1zYmItYWxlcnQtYW5pbWF0aW9uLWR1cmF0aW9uJyk7XG4gIH1cblxuICBwcml2YXRlIF9vbkFuaW1hdGlvbkVuZChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5pbmcnICYmIGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdvcGVuLW9wYWNpdHknKSB7XG4gICAgICB0aGlzLl9oYW5kbGVPcGVuaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnY2xvc2luZycgJiYgZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgdGhpcy5faGFuZGxlQ2xvc2luZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9wZW5pbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuZWQnO1xuICAgIHRoaXMuZGlzcGF0Y2hPcGVuRXZlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNsb3NpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIHRoaXMuZGlzcGF0Y2hDbG9zZUV2ZW50KCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbW92ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVNsb3RjaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5fc3luY0xpbmtzKCk7XG5cbiAgICBjb25zdCB0aXRsZSA9IEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikuZmluZCgoZWwpID0+IGVsLmxvY2FsTmFtZSA9PT0gJ3NiYi10aXRsZScpO1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgdGl0bGUuc2xvdCA9ICd0aXRsZSc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3luY0xpbmtzKCk6IHZvaWQge1xuICAgIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPy48U2JiTGlua0VsZW1lbnQ+KCdzYmItbGluaycpID8/IFtdKS5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICBjdXN0b21FbGVtZW50cy51cGdyYWRlKGxpbmspO1xuICAgICAgbGluay5uZWdhdGl2ZSA9IHRoaXMuX2lzTGlnaHRNb2RlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jb25maWd1cmVUaXRsZSgpOiB2b2lkIHtcbiAgICBjb25zdCB0aXRsZSA9IHRoaXMucXVlcnlTZWxlY3Rvcj8uPFNiYlRpdGxlRWxlbWVudD4oJ3NiYi10aXRsZScpO1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY3VzdG9tRWxlbWVudHMudXBncmFkZSh0aXRsZSk7XG4gICAgICB0aXRsZS5uZWdhdGl2ZSA9IHRoaXMuX2lzTGlnaHRNb2RlKCk7XG4gICAgICB0aXRsZS52aXN1YWxMZXZlbCA9IHRoaXMuc2l6ZSA9PT0gJ2wnID8gJzMnIDogJzUnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzTGlnaHRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fZGFya01vZGVDb250cm9sbGVyLm1hdGNoZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXJJY29uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci5yZW5kZXJJY29uTmFtZSgpIHx8ICdpbmZvJztcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1hbGVydF9fdHJhbnNpdGlvbi13cmFwcGVyXCIgQGFuaW1hdGlvbmVuZD0ke3RoaXMuX29uQW5pbWF0aW9uRW5kfT5cbiAgICAgICAgPCEtLSBzdWIgd3JhcHBlciBuZWVkZWQgdG8gcHJvcGVybHkgc3VwcG9ydCBmYWRlIGluIGFuaW1hdGlvbiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1hbGVydF9fdHJhbnNpdGlvbi1zdWItd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItYWxlcnRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JiLWFsZXJ0X19pY29uXCI+ICR7dGhpcy5yZW5kZXJJY29uU2xvdCgpfSA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiYi1hbGVydF9fY29udGVudFwiPlxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwidGl0bGVcIiBAc2xvdGNoYW5nZT0ke3RoaXMuX2NvbmZpZ3VyZVRpdGxlfT48L3Nsb3Q+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwic2JiLWFsZXJ0X19jb250ZW50LXNsb3RcIj5cbiAgICAgICAgICAgICAgICA8c2xvdCBAc2xvdGNoYW5nZT0ke3RoaXMuX2hhbmRsZVNsb3RjaGFuZ2V9Pjwvc2xvdD5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgJHshdGhpcy5yZWFkT25seVxuICAgICAgICAgICAgICA/IGh0bWxgPHNwYW4gY2xhc3M9XCJzYmItYWxlcnRfX2Nsb3NlLWJ1dHRvbi13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICA8c2JiLWRpdmlkZXJcbiAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiXG4gICAgICAgICAgICAgICAgICAgID9uZWdhdGl2ZT0ke3RoaXMuX2lzTGlnaHRNb2RlKCl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2JiLWFsZXJ0X19jbG9zZS1idXR0b24tZGl2aWRlclwiXG4gICAgICAgICAgICAgICAgICA+PC9zYmItZGl2aWRlcj5cbiAgICAgICAgICAgICAgICAgIDxzYmItdHJhbnNwYXJlbnQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgID9uZWdhdGl2ZT0ke3RoaXMuX2lzTGlnaHRNb2RlKCl9XG4gICAgICAgICAgICAgICAgICAgIHNpemU9JHt0aGlzLnNpemUgPT09ICdsJyA/ICdtJyA6IHRoaXMuc2l6ZX1cbiAgICAgICAgICAgICAgICAgICAgaWNvbi1uYW1lPVwiY3Jvc3Mtc21hbGxcIlxuICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiB0aGlzLmNsb3NlKCl9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9JHtpMThuQ2xvc2VBbGVydFt0aGlzLl9sYW5ndWFnZS5jdXJyZW50XX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzYmItYWxlcnRfX2Nsb3NlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICA+PC9zYmItdHJhbnNwYXJlbnQtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5gXG4gICAgICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItYWxlcnQnOiBTYmJBbGVydEVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDb0NhLHlCQUFlO21CQUFTLGlCQUFpQixpQkFBaUIsd0JBQXdCLENBQUM7Ozs7Ozs7Y0FBbkYsd0JBQXdCLFlBQTJEOzs7QUFrQmpELFNBQUEsd0JBQUEsa0JBQUEsTUFBQSxvQkFBd0IsUUFBUSxHQUFHLE1BQU0sSUFBRztBQUc1QyxTQUFBLDhCQUFBLGtCQUFBLE1BQUEsd0JBQUEsRUFBQSxrQkFBQSxNQUFBLHlCQUErQyxNQUFLO0FBRXpGLFFBQUEsYUFBUyxrQkFBQSxNQUFBLDZCQUFBLEVBQUcsSUFBSSxzQkFBc0IsS0FBSztBQUMzQyxRQUFBLHNCQUFzQixJQUFJLHNCQUFzQixZQUFXO0FBQ2pFLFNBQUssWUFBWTtBQUNqQixTQUFLLGlCQUFpQjtBQUN0QixTQUFLLGVBQWU7S0FDcEI7Ozs7dUJBVkQsU0FBUyxFQUFFLFNBQVMsTUFBTSxDQUFDLENBQUE7NEJBRzNCLFNBQVMsRUFBRSxTQUFTLE1BQU0sQ0FBQyxDQUFBO0FBSEMsZ0JBQUEsTUFBQSxNQUFBLGtCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsVUFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFJLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBSixPQUFJOztLQUFBO0lBQUEsVUFBQTtJQUFBLEVBQUEsb0JBQUEsd0JBQUE7QUFHcEIsZ0JBQUEsTUFBQSxNQUFBLHVCQUFBO0lBQUEsTUFBQTtJQUFBLE1BQUE7SUFBQSxRQUFBO0lBQUEsU0FBQTtJQUFBLFFBQUE7S0FBQSxNQUFBLFFBQUEsZUFBQTtLQUFBLE1BQUEsUUFBQSxJQUFnQjtLQUFTLE1BQUEsS0FBQSxVQUFBO0FBQUEsVUFBVCxZQUFTOztLQUFBO0lBQUEsVUFBQTtJ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
|