@dcl/sdk 7.29.1-35901015152.commit-d1b7b96 → 7.29.1-35917671376.commit-046b268

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.
@@ -0,0 +1,118 @@
1
+ /// <reference types="@dcl/js-runtime" />
2
+ import { ExplorerUi, GrowOnlyValueSetComponentDefinition, PBExplorerItemPurchaseResult, PBExplorerUiEventsResult } from '@dcl/ecs';
3
+ import { OpenExplorerUiResult } from '~system/RestrictedActions';
4
+ export { ExplorerUi, OpenExplorerUiResult };
5
+ /** @public */
6
+ export type CorrelatedEvent = {
7
+ timestamp: number;
8
+ requestId: number;
9
+ };
10
+ /**
11
+ * A named stream of events that this helper can collect and stop on.
12
+ * @public
13
+ */
14
+ export type Channel<N extends string = string, T extends CorrelatedEvent = CorrelatedEvent> = {
15
+ readonly name: N;
16
+ readonly component: GrowOnlyValueSetComponentDefinition<T>;
17
+ };
18
+ /** @public */
19
+ export type AnyChannel = Channel<string, any>;
20
+ /**
21
+ * Wraps a grow-only result component as a {@link Channel}. The name must be unique within a scene.
22
+ * @public
23
+ */
24
+ export declare function channel<N extends string, T extends CorrelatedEvent>(name: N, component: GrowOnlyValueSetComponentDefinition<T>): Channel<N, T>;
25
+ /** Panel lifecycle events: opened and closed. @public */
26
+ export declare const ExplorerUiEvents: Channel<'explorerUi', PBExplorerUiEventsResult>;
27
+ /** Outcome of an `EU_ITEM_PURCHASE` flow: purchased, dismissed or failed. @public */
28
+ export declare const ItemPurchase: Channel<'itemPurchase', PBExplorerItemPurchaseResult>;
29
+ /**
30
+ * The `$case` names of a channel's event union.
31
+ * @public
32
+ */
33
+ export type CaseOf<C extends AnyChannel> = C extends Channel<any, infer T> ? Extract<T[keyof T], {
34
+ $case: string;
35
+ }>['$case'] : never;
36
+ /** @public */
37
+ export type Variant<C extends AnyChannel = AnyChannel, K extends string = string> = {
38
+ readonly channel: C;
39
+ readonly $case: K;
40
+ };
41
+ /** @public */
42
+ export declare function variant<C extends AnyChannel, K extends CaseOf<C>>(ch: C, $case: K): Variant<C, K>;
43
+ /**
44
+ * What ends the wait before the panel closes: any event on a channel, or one `$case` of it.
45
+ * @public
46
+ */
47
+ export type StopCondition = AnyChannel | Variant;
48
+ /** @public */
49
+ export type Collected<C> = C extends Channel<infer N, infer T> ? {
50
+ channel: N;
51
+ event: T;
52
+ } : never;
53
+ /**
54
+ * How the wait ended.
55
+ * - `closed`: the panel this call opened was closed.
56
+ * - `matched`: `until` fired first, so the panel may still be on screen.
57
+ * - `notOpened`: this call did not open anything. `openResult` says why.
58
+ * - `timedOut`: `timeoutMs` elapsed first.
59
+ *
60
+ * `events` always holds everything collected, the event that stopped the wait included.
61
+ * @public
62
+ */
63
+ export type WaitOutcome<C extends readonly AnyChannel[]> = {
64
+ $case: 'closed';
65
+ events: readonly Collected<C[number]>[];
66
+ } | {
67
+ $case: 'matched';
68
+ events: readonly Collected<C[number]>[];
69
+ } | {
70
+ $case: 'notOpened';
71
+ openResult: OpenExplorerUiResult;
72
+ } | {
73
+ $case: 'timedOut';
74
+ events: readonly Collected<C[number]>[];
75
+ };
76
+ /** @public */
77
+ export type WaitOptions<C extends readonly AnyChannel[]> = {
78
+ /** Channels whose events land in `events`. Defaults to none. */
79
+ collect?: C;
80
+ /** Stops the wait early. The panel closing always stops it regardless. */
81
+ until?: StopCondition;
82
+ /**
83
+ * Bounds the wait, in milliseconds. On expiry the promise resolves with `$case: 'timedOut'`.
84
+ * No default, because a panel can stay open for minutes. Without it, an explorer that opens
85
+ * a panel and then emits no `closed` leaves the promise pending for the scene's whole life.
86
+ */
87
+ timeoutMs?: number;
88
+ };
89
+ /** @public */
90
+ export type OpenExplorerUiRequest = {
91
+ ui: Exclude<ExplorerUi, ExplorerUi.EU_ITEM_PURCHASE>;
92
+ itemPurchase?: undefined;
93
+ } | {
94
+ ui: ExplorerUi.EU_ITEM_PURCHASE;
95
+ itemPurchase: {
96
+ urn: string;
97
+ };
98
+ };
99
+ /**
100
+ * Signature of {@link openExplorerUiAndWait}. The second overload takes a bare `ui`, so a
101
+ * computed panel value needs no narrowing.
102
+ * @public
103
+ */
104
+ export interface OpenExplorerUiAndWait {
105
+ <const C extends readonly AnyChannel[] = []>(request: OpenExplorerUiRequest, options?: WaitOptions<C>): Promise<WaitOutcome<C>>;
106
+ (ui: Exclude<ExplorerUi, ExplorerUi.EU_ITEM_PURCHASE>): Promise<WaitOutcome<[]>>;
107
+ }
108
+ /**
109
+ * Opens an explorer panel and waits for the session it started. The wait ends when the panel
110
+ * closes. See {@link WaitOptions} to collect events, to stop earlier or to bound the wait.
111
+ *
112
+ * Every lifecycle outcome resolves, see {@link WaitOutcome}. The promise rejects only when an
113
+ * event cannot be attributed to a call at all: an explorer too old to echo `request_id`
114
+ * paired with a panel that can coexist with another one.
115
+ *
116
+ * @public
117
+ */
118
+ export declare const openExplorerUiAndWait: OpenExplorerUiAndWait;
@@ -0,0 +1,235 @@
1
+ import { engine, ExplorerItemPurchaseResult, ExplorerUi, ExplorerUiEventsResult } from '@dcl/ecs';
2
+ import { openExplorerUi, OpenExplorerUiResult } from '~system/RestrictedActions';
3
+ export { ExplorerUi, OpenExplorerUiResult };
4
+ // What an explorer that does not echo request_id, or a user-initiated action, leaves on the wire.
5
+ const UNCORRELATED = 0;
6
+ // Panels that can be on screen next to another panel. The `ui` field alone cannot attribute
7
+ // their events, so an event on one of these panels must carry a request_id.
8
+ const CONCURRENT_PANELS = [7 /* ExplorerUi.EU_ITEM_PURCHASE */];
9
+ /**
10
+ * Wraps a grow-only result component as a {@link Channel}. The name must be unique within a scene.
11
+ * @public
12
+ */
13
+ export function channel(name, component) {
14
+ return { name, component };
15
+ }
16
+ /** Panel lifecycle events: opened and closed. @public */
17
+ export const ExplorerUiEvents = /* @__PURE__ */ channel('explorerUi', ExplorerUiEventsResult);
18
+ /** Outcome of an `EU_ITEM_PURCHASE` flow: purchased, dismissed or failed. @public */
19
+ export const ItemPurchase = /* @__PURE__ */ channel('itemPurchase', ExplorerItemPurchaseResult);
20
+ /** @public */
21
+ export function variant(ch, $case) {
22
+ return { channel: ch, $case };
23
+ }
24
+ /** @internal exposed for tests */
25
+ export const EXPLORER_UI_WAIT_TIMEOUT_SYSTEM = 'explorer-ui-wait-timeout';
26
+ // Lowest priority sorts this system last, so when it removes itself mid-tick it splices the
27
+ // last element of the array the engine is iterating and skips no other system.
28
+ const TIMEOUT_SYSTEM_PRIORITY = Number.MIN_SAFE_INTEGER;
29
+ // ts-proto renders a `oneof` as one wrapper property `{ $case, [$case]: value }`. Finding that
30
+ // property by shape keeps the helper independent of the name each message gave it: `event` on
31
+ // one message, `status` on another.
32
+ function caseOf(event) {
33
+ for (const key of Object.keys(event)) {
34
+ const value = event[key];
35
+ if (value && typeof value === 'object' && typeof value.$case === 'string') {
36
+ return value.$case;
37
+ }
38
+ }
39
+ return undefined;
40
+ }
41
+ function normalizeStop(stop) {
42
+ return '$case' in stop ? { channel: stop.channel, $case: stop.$case } : { channel: stop, $case: undefined };
43
+ }
44
+ /** @internal test seam. The production instance is {@link openExplorerUiAndWait}. */
45
+ export function create(deps) {
46
+ const { engine: engineInstance, openExplorerUi: openExplorerUiFn, explorerUiEvents } = deps;
47
+ const root = engineInstance.RootEntity;
48
+ const sessions = new Map();
49
+ // Keyed by name, so two wrappers around the same component arm one listener, not two.
50
+ const armed = new Map();
51
+ // Starts at 1 so a minted id never collides with UNCORRELATED.
52
+ let nextRequestId = 1;
53
+ let timeoutSystemAdded = false;
54
+ function arm(ch) {
55
+ const bound = armed.get(ch.name);
56
+ if (bound) {
57
+ if (bound !== ch.component) {
58
+ throw new Error(`openExplorerUiAndWait: channel name '${ch.name}' is already bound to a different component. ` +
59
+ `Channel names identify a stream, so they have to be unique within a scene.`);
60
+ }
61
+ return;
62
+ }
63
+ armed.set(ch.name, ch.component);
64
+ const name = ch.name;
65
+ // onChange has no unsubscribe, so one listener per channel lives for the engine's lifetime.
66
+ ch.component.onChange(root, (value) => {
67
+ // `undefined` arrives on DELETE_ENTITY. Otherwise `value` is one appended element,
68
+ // not the whole set.
69
+ if (value)
70
+ deliver(name, value);
71
+ });
72
+ }
73
+ function attribute(session, name, event) {
74
+ if (event.requestId === session.requestId)
75
+ return 'yes';
76
+ if (event.requestId !== UNCORRELATED)
77
+ return 'no';
78
+ // Only the lifecycle channel carries a second discriminator, `ui`, and it identifies a
79
+ // session only while panels cannot coexist. A second call for the same panel is answered
80
+ // WAS_ALREADY_OPEN, so at most one session per non-concurrent panel is ever live.
81
+ if (session.correlationRequired || name !== explorerUiEvents.name)
82
+ return 'ambiguous';
83
+ return event.ui === session.ui ? 'yes' : 'no';
84
+ }
85
+ function deliver(name, event) {
86
+ // Settling deletes from `sessions` mid-iteration, which a Map tolerates. Nothing adds.
87
+ for (const session of sessions.values()) {
88
+ if (!session.watched.has(name))
89
+ continue;
90
+ const attribution = attribute(session, name, event);
91
+ if (attribution === 'no')
92
+ continue;
93
+ if (attribution === 'ambiguous') {
94
+ failSession(session, new Error(`openExplorerUiAndWait: got a '${name}' event with no request_id, and nothing else identifies ` +
95
+ `the call it belongs to. This explorer does not echo OpenExplorerUiRequest.request_id.`));
96
+ continue;
97
+ }
98
+ accept(session, name, event);
99
+ }
100
+ }
101
+ function accept(session, name, event) {
102
+ if (session.collect.has(name))
103
+ session.events.push({ channel: name, event });
104
+ // The close is terminal and wins over `until`, because `matched` would tell the caller
105
+ // that the panel is still on screen.
106
+ if (name === explorerUiEvents.name && caseOf(event) === 'closed') {
107
+ settleSession(session, { $case: 'closed', events: session.events });
108
+ return;
109
+ }
110
+ const until = session.until;
111
+ if (!until || until.channel !== name)
112
+ return;
113
+ if (until.$case === undefined || until.$case === caseOf(event)) {
114
+ settleSession(session, { $case: 'matched', events: session.events });
115
+ }
116
+ }
117
+ function settleSession(session, outcome) {
118
+ if (session.settled)
119
+ return;
120
+ session.settled = true;
121
+ sessions.delete(session.requestId);
122
+ session.settle(outcome);
123
+ maybeRemoveTimeoutSystem();
124
+ }
125
+ function failSession(session, error) {
126
+ if (session.settled)
127
+ return;
128
+ session.settled = true;
129
+ sessions.delete(session.requestId);
130
+ session.fail(error);
131
+ maybeRemoveTimeoutSystem();
132
+ }
133
+ function hasTimedSession() {
134
+ for (const session of sessions.values()) {
135
+ if (session.timeoutMs !== undefined)
136
+ return true;
137
+ }
138
+ return false;
139
+ }
140
+ function maybeRemoveTimeoutSystem() {
141
+ if (!timeoutSystemAdded || hasTimedSession())
142
+ return;
143
+ timeoutSystemAdded = false;
144
+ engineInstance.removeSystem(EXPLORER_UI_WAIT_TIMEOUT_SYSTEM);
145
+ }
146
+ function ensureTimeoutSystem() {
147
+ if (timeoutSystemAdded)
148
+ return;
149
+ timeoutSystemAdded = true;
150
+ // The scene runtime has no timers, so elapsed time is accumulated from the engine's dt.
151
+ engineInstance.addSystem((dt) => {
152
+ for (const session of sessions.values()) {
153
+ if (session.timeoutMs === undefined)
154
+ continue;
155
+ session.elapsedMs += dt * 1000;
156
+ if (session.elapsedMs >= session.timeoutMs) {
157
+ settleSession(session, { $case: 'timedOut', events: session.events });
158
+ }
159
+ }
160
+ maybeRemoveTimeoutSystem();
161
+ }, TIMEOUT_SYSTEM_PRIORITY, EXPLORER_UI_WAIT_TIMEOUT_SYSTEM);
162
+ }
163
+ async function openExplorerUiAndWait(request, options) {
164
+ const { ui, itemPurchase } = typeof request === 'number' ? { ui: request, itemPurchase: undefined } : request;
165
+ const requestId = nextRequestId++;
166
+ const collect = options?.collect ?? [];
167
+ const collectNames = new Set();
168
+ for (const ch of collect)
169
+ collectNames.add(ch.name);
170
+ const stop = options?.until ? normalizeStop(options.until) : undefined;
171
+ const watched = new Set(collectNames);
172
+ watched.add(explorerUiEvents.name);
173
+ if (stop)
174
+ watched.add(stop.channel.name);
175
+ // Armed before the RPC, because events can land while the RPC is in flight. A listener
176
+ // that is already up is what makes replaying the accumulated set unnecessary.
177
+ arm(explorerUiEvents);
178
+ for (const ch of collect)
179
+ arm(ch);
180
+ if (stop)
181
+ arm(stop.channel);
182
+ let settle;
183
+ let fail;
184
+ const outcome = new Promise((resolve, reject) => {
185
+ settle = resolve;
186
+ fail = reject;
187
+ });
188
+ const session = {
189
+ requestId,
190
+ ui,
191
+ correlationRequired: CONCURRENT_PANELS.includes(ui),
192
+ collect: collectNames,
193
+ watched,
194
+ until: stop ? { channel: stop.channel.name, $case: stop.$case } : undefined,
195
+ events: [],
196
+ timeoutMs: options?.timeoutMs,
197
+ elapsedMs: 0,
198
+ settled: false,
199
+ settle,
200
+ fail
201
+ };
202
+ sessions.set(requestId, session);
203
+ if (session.timeoutMs !== undefined)
204
+ ensureTimeoutSystem();
205
+ try {
206
+ const { openResult } = await openExplorerUiFn({ ui, requestId, itemPurchase });
207
+ // This call opened nothing, so no event carrying this request id is coming.
208
+ if (openResult !== OpenExplorerUiResult.OPENED) {
209
+ settleSession(session, { $case: 'notOpened', openResult });
210
+ }
211
+ }
212
+ catch (error) {
213
+ // Routed through the session rather than rethrown, so that `outcome` is never left
214
+ // pending and unobserved.
215
+ failSession(session, error);
216
+ }
217
+ return outcome;
218
+ }
219
+ // The implementation takes both argument forms and is blind to `collect`. The cast is what
220
+ // gives callers the two overloads that relate them.
221
+ return { openExplorerUiAndWait: openExplorerUiAndWait };
222
+ }
223
+ const helper = /* @__PURE__ */ create({ engine, openExplorerUi, explorerUiEvents: ExplorerUiEvents });
224
+ /**
225
+ * Opens an explorer panel and waits for the session it started. The wait ends when the panel
226
+ * closes. See {@link WaitOptions} to collect events, to stop earlier or to bound the wait.
227
+ *
228
+ * Every lifecycle outcome resolves, see {@link WaitOutcome}. The promise rejects only when an
229
+ * event cannot be attributed to a call at all: an explorer too old to echo `request_id`
230
+ * paired with a panel that can coexist with another one.
231
+ *
232
+ * @public
233
+ */
234
+ export const openExplorerUiAndWait = helper.openExplorerUiAndWait;
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXhwbG9yZXItdWkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTiwwQkFBMEIsRUFDMUIsVUFBVSxFQUNWLHNCQUFzQixFQUt2QixNQUFNLFVBQVUsQ0FBQTtBQUNqQixPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFaEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxDQUFBO0FBRTNDLGtHQUFrRztBQUNsRyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUE7QUFFdEIsNEZBQTRGO0FBQzVGLDRFQUE0RTtBQUM1RSxNQUFNLGlCQUFpQixHQUEwQixxQ0FBNkIsQ0FBQTtBQW9COUU7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FDckIsSUFBTyxFQUNQLFNBQWlEO0lBRWpELE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUE7QUFDNUIsQ0FBQztBQUVELHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBb0QsZUFBZSxDQUFDLE9BQU8sQ0FDdEcsWUFBWSxFQUNaLHNCQUFzQixDQUN2QixDQUFBO0FBRUQscUZBQXFGO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBMEQsZUFBZSxDQUFDLE9BQU8sQ0FDeEcsY0FBYyxFQUNkLDBCQUEwQixDQUMzQixDQUFBO0FBZUQsY0FBYztBQUNkLE1BQU0sVUFBVSxPQUFPLENBQTRDLEVBQUssRUFBRSxLQUFRO0lBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFBO0FBQy9CLENBQUM7QUEyREQsa0NBQWtDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLDBCQUEwQixDQUFBO0FBRXpFLDRGQUE0RjtBQUM1RiwrRUFBK0U7QUFDL0UsTUFBTSx1QkFB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QUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQTtBQUVyRzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBMEIsTUFBTSxDQUFDLHFCQUFxQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZW5naW5lLFxuICBFeHBsb3Jlckl0ZW1QdXJjaGFzZVJlc3VsdCxcbiAgRXhwbG9yZXJVaSxcbiAgRXhwbG9yZXJVaUV2ZW50c1Jlc3VsdCxcbiAgR3Jvd09ubHlWYWx1ZVNldENvbXBvbmVudERlZmluaXRpb24sXG4gIElFbmdpbmUsXG4gIFBCRXhwbG9yZXJJdGVtUHVyY2hhc2VSZXN1bHQsXG4gIFBCRXhwbG9yZXJVaUV2ZW50c1Jlc3VsdFxufSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IG9wZW5FeHBsb3JlclVpLCBPcGVuRXhwbG9yZXJVaVJlc3VsdCB9IGZyb20gJ35zeXN0ZW0vUmVzdHJpY3RlZEFjdGlvbnMnXG5cbmV4cG9ydCB7IEV4cGxvcmVyVWksIE9wZW5FeHBsb3JlclVpUmVzdWx0IH1cblxuLy8gV2hhdCBhbiBleHBsb3JlciB0aGF0IGRvZXMgbm90IGVjaG8gcmVxdWVzdF9pZCwgb3IgYSB1c2VyLWluaXRpYXRlZCBhY3Rpb24sIGxlYXZlcyBvbiB0aGUgd2lyZS5cbmNvbnN0IFVOQ09SUkVMQVRFRCA9IDBcblxuLy8gUGFuZWxzIHRoYXQgY2FuIGJlIG9uIHNjcmVlbiBuZXh0IHRvIGFub3RoZXIgcGFuZWwuIFRoZSBgdWlgIGZpZWxkIGFsb25lIGNhbm5vdCBhdHRyaWJ1dGVcbi8vIHRoZWlyIGV2ZW50cywgc28gYW4gZXZlbnQgb24gb25lIG9mIHRoZXNlIHBhbmVscyBtdXN0IGNhcnJ5IGEgcmVxdWVzdF9pZC5cbmNvbnN0IENPTkNVUlJFTlRfUEFORUxTOiByZWFkb25seSBFeHBsb3JlclVpW10gPSBbRXhwbG9yZXJVaS5FVV9JVEVNX1BVUkNIQVNFXVxuXG4vKiogQHB1YmxpYyAqL1xuZXhwb3J0IHR5cGUgQ29ycmVsYXRlZEV2ZW50ID0ge1xuICB0aW1lc3RhbXA6IG51bWJlclxuICByZXF1ZXN0SWQ6IG51bWJlclxufVxuXG4vKipcbiAqIEEgbmFtZWQgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IHRoaXMgaGVscGVyIGNhbiBjb2xsZWN0IGFuZCBzdG9wIG9uLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBDaGFubmVsPE4gZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFQgZXh0ZW5kcyBDb3JyZWxhdGVkRXZlbnQgPSBDb3JyZWxhdGVkRXZlbnQ+ID0ge1xuICByZWFkb25seSBuYW1lOiBOXG4gIHJlYWRvbmx5IGNvbXBvbmVudDogR3Jvd09ubHlWYWx1ZVNldENvbXBvbmVudERlZmluaXRpb248VD5cbn1cblxuLyoqIEBwdWJsaWMgKi9cbmV4cG9ydCB0eXBlIEFueUNoYW5uZWwgPSBDaGFubmVsPHN0cmluZywgYW55PlxuXG4vKipcbiAqIFdyYXBzIGEgZ3Jvdy1vbmx5IHJlc3VsdCBjb21wb25lbnQgYXMgYSB7QGxpbmsgQ2hhbm5lbH0uIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHNjZW5lLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbDxOIGV4dGVuZHMgc3RyaW5nLCBUIGV4dGVuZHMgQ29ycmVsYXRlZEV2ZW50PihcbiAgbmFtZTogTixcbiAgY29tcG9uZW50OiBHcm93T25seVZhbHVlU2V0Q29tcG9uZW50RGVmaW5pdGlvbjxUPlxuKTogQ2hhbm5lbDxOLCBUPiB7XG4gIHJldHVybiB7IG5hbWUsIGNvbXBvbmVudCB9XG59XG5cbi8qKiBQYW5lbCBsaWZlY3ljbGUgZXZlbnRzOiBvcGVuZWQgYW5kIGNsb3NlZC4gQHB1YmxpYyAqL1xuZXhwb3J0IGNvbnN0IEV4cGxvcmVyVWlFdmVudHM6IENoYW5uZWw8J2V4cGxvcmVyVWknLCBQQkV4cGxvcmVyVWlFdmVudHNSZXN1bHQ+ID0gLyogQF9fUFVSRV9fICovIGNoYW5uZWwoXG4gICdleHBsb3JlclVpJyxcbiAgRXhwbG9yZXJVaUV2ZW50c1Jlc3VsdFxuKVxuXG4vKiogT3V0Y29tZSBvZiBhbiBgRVVfSVRFTV9QVVJDSEFTRWAgZmxvdzogcHVyY2hhc2VkLCBkaXNtaXNzZWQgb3IgZmFpbGVkLiBAcHVibGljICovXG5leHBvcnQgY29uc3QgSXRlbVB1cmNoYXNlOiBDaGFubmVsPCdpdGVtUHVyY2hhc2UnLCBQQkV4cGxvcmVySXRlbVB1cmNoYXNlUmVzdWx0PiA9IC8qIEBfX1BVUkVfXyAqLyBjaGFubmVsKFxuICAnaXRlbVB1cmNoYXNlJyxcbiAgRXhwbG9yZXJJdGVtUHVyY2hhc2VSZXN1bHRcbilcblxuLyoqXG4gKiBUaGUgYCRjYXNlYCBuYW1lcyBvZiBhIGNoYW5uZWwncyBldmVudCB1bmlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgQ2FzZU9mPEMgZXh0ZW5kcyBBbnlDaGFubmVsPiA9XG4gIEMgZXh0ZW5kcyBDaGFubmVsPGFueSwgaW5mZXIgVD4gPyBFeHRyYWN0PFRba2V5b2YgVF0sIHsgJGNhc2U6IHN0cmluZyB9PlsnJGNhc2UnXSA6IG5ldmVyXG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgdHlwZSBWYXJpYW50PEMgZXh0ZW5kcyBBbnlDaGFubmVsID0gQW55Q2hhbm5lbCwgSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIHJlYWRvbmx5IGNoYW5uZWw6IENcbiAgcmVhZG9ubHkgJGNhc2U6IEtcbn1cblxuLyoqIEBwdWJsaWMgKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpYW50PEMgZXh0ZW5kcyBBbnlDaGFubmVsLCBLIGV4dGVuZHMgQ2FzZU9mPEM+PihjaDogQywgJGNhc2U6IEspOiBWYXJpYW50PEMsIEs+IHtcbiAgcmV0dXJuIHsgY2hhbm5lbDogY2gsICRjYXNlIH1cbn1cblxuLyoqXG4gKiBXaGF0IGVuZHMgdGhlIHdhaXQgYmVmb3JlIHRoZSBwYW5lbCBjbG9zZXM6IGFueSBldmVudCBvbiBhIGNoYW5uZWwsIG9yIG9uZSBgJGNhc2VgIG9mIGl0LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBTdG9wQ29uZGl0aW9uID0gQW55Q2hhbm5lbCB8IFZhcmlhbnRcblxuLyoqIEBwdWJsaWMgKi9cbmV4cG9ydCB0eXBlIENvbGxlY3RlZDxDPiA9IEMgZXh0ZW5kcyBDaGFubmVsPGluZmVyIE4sIGluZmVyIFQ+ID8geyBjaGFubmVsOiBOOyBldmVudDogVCB9IDogbmV2ZXJcblxuLyoqXG4gKiBIb3cgdGhlIHdhaXQgZW5kZWQuXG4gKiAtIGBjbG9zZWRgOiB0aGUgcGFuZWwgdGhpcyBjYWxsIG9wZW5lZCB3YXMgY2xvc2VkLlxuICogLSBgbWF0Y2hlZGA6IGB1bnRpbGAgZmlyZWQgZmlyc3QsIHNvIHRoZSBwYW5lbCBtYXkgc3RpbGwgYmUgb24gc2NyZWVuLlxuICogLSBgbm90T3BlbmVkYDogdGhpcyBjYWxsIGRpZCBub3Qgb3BlbiBhbnl0aGluZy4gYG9wZW5SZXN1bHRgIHNheXMgd2h5LlxuICogLSBgdGltZWRPdXRgOiBgdGltZW91dE1zYCBlbGFwc2VkIGZpcnN0LlxuICpcbiAqIGBldmVudHNgIGFsd2F5cyBob2xkcyBldmVyeXRoaW5nIGNvbGxlY3RlZCwgdGhlIGV2ZW50IHRoYXQgc3RvcHBlZCB0aGUgd2FpdCBpbmNsdWRlZC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgV2FpdE91dGNvbWU8QyBleHRlbmRzIHJlYWRvbmx5IEFueUNoYW5uZWxbXT4gPVxuICB8IHsgJGNhc2U6ICdjbG9zZWQnOyBldmVudHM6IHJlYWRvbmx5IENvbGxlY3RlZDxDW251bWJlcl0+W10gfVxuICB8IHsgJGNhc2U6ICdtYXRjaGVkJzsgZXZlbnRzOiByZWFkb25seSBDb2xsZWN0ZWQ8Q1tudW1iZXJdPltdIH1cbiAgfCB7ICRjYXNlOiAnbm90T3BlbmVkJzsgb3BlblJlc3VsdDogT3BlbkV4cGxvcmVyVWlSZXN1bHQgfVxuICB8IHsgJGNhc2U6ICd0aW1lZE91dCc7IGV2ZW50czogcmVhZG9ubHkgQ29sbGVjdGVkPENbbnVtYmVyXT5bXSB9XG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgdHlwZSBXYWl0T3B0aW9uczxDIGV4dGVuZHMgcmVhZG9ubHkgQW55Q2hhbm5lbFtdPiA9IHtcbiAgLyoqIENoYW5uZWxzIHdob3NlIGV2ZW50cyBsYW5kIGluIGBldmVudHNgLiBEZWZhdWx0cyB0byBub25lLiAqL1xuICBjb2xsZWN0PzogQ1xuICAvKiogU3RvcHMgdGhlIHdhaXQgZWFybHkuIFRoZSBwYW5lbCBjbG9zaW5nIGFsd2F5cyBzdG9wcyBpdCByZWdhcmRsZXNzLiAqL1xuICB1bnRpbD86IFN0b3BDb25kaXRpb25cbiAgLyoqXG4gICAqIEJvdW5kcyB0aGUgd2FpdCwgaW4gbWlsbGlzZWNvbmRzLiBPbiBleHBpcnkgdGhlIHByb21pc2UgcmVzb2x2ZXMgd2l0aCBgJGNhc2U6ICd0aW1lZE91dCdgLlxuICAgKiBObyBkZWZhdWx0LCBiZWNhdXNlIGEgcGFuZWwgY2FuIHN0YXkgb3BlbiBmb3IgbWludXRlcy4gV2l0aG91dCBpdCwgYW4gZXhwbG9yZXIgdGhhdCBvcGVuc1xuICAgKiBhIHBhbmVsIGFuZCB0aGVuIGVtaXRzIG5vIGBjbG9zZWRgIGxlYXZlcyB0aGUgcHJvbWlzZSBwZW5kaW5nIGZvciB0aGUgc2NlbmUncyB3aG9sZSBsaWZlLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyXG59XG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgdHlwZSBPcGVuRXhwbG9yZXJVaVJlcXVlc3QgPVxuICB8IHsgdWk6IEV4Y2x1ZGU8RXhwbG9yZXJVaSwgRXhwbG9yZXJVaS5FVV9JVEVNX1BVUkNIQVNFPjsgaXRlbVB1cmNoYXNlPzogdW5kZWZpbmVkIH1cbiAgfCB7IHVpOiBFeHBsb3JlclVpLkVVX0lURU1fUFVSQ0hBU0U7IGl0ZW1QdXJjaGFzZTogeyB1cm46IHN0cmluZyB9IH1cblxuLyoqXG4gKiBTaWduYXR1cmUgb2Yge0BsaW5rIG9wZW5FeHBsb3JlclVpQW5kV2FpdH0uIFRoZSBzZWNvbmQgb3ZlcmxvYWQgdGFrZXMgYSBiYXJlIGB1aWAsIHNvIGFcbiAqIGNvbXB1dGVkIHBhbmVsIHZhbHVlIG5lZWRzIG5vIG5hcnJvd2luZy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuRXhwbG9yZXJVaUFuZFdhaXQge1xuICA8Y29uc3QgQyBleHRlbmRzIHJlYWRvbmx5IEFueUNoYW5uZWxbXSA9IFtdPihcbiAgICByZXF1ZXN0OiBPcGVuRXhwbG9yZXJVaVJlcXVlc3QsXG4gICAgb3B0aW9ucz86IFdhaXRPcHRpb25zPEM+XG4gICk6IFByb21pc2U8V2FpdE91dGNvbWU8Qz4+XG4gICh1aTogRXhjbHVkZTxFeHBsb3JlclVpLCBFeHBsb3JlclVpLkVVX0lURU1fUFVSQ0hBU0U+KTogUHJvbWlzZTxXYWl0T3V0Y29tZTxbXT4+XG59XG5cbi8qKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdHMgKi9cbmV4cG9ydCBjb25zdCBFWFBMT1JFUl9VSV9XQUlUX1RJTUVPVVRfU1lTVEVNID0gJ2V4cGxvcmVyLXVpLXdhaXQtdGltZW91dCdcblxuLy8gTG93ZXN0IHByaW9yaXR5IHNvcnRzIHRoaXMgc3lzdGVtIGxhc3QsIHNvIHdoZW4gaXQgcmVtb3ZlcyBpdHNlbGYgbWlkLXRpY2sgaXQgc3BsaWNlcyB0aGVcbi8vIGxhc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgdGhlIGVuZ2luZSBpcyBpdGVyYXRpbmcgYW5kIHNraXBzIG5vIG90aGVyIHN5c3RlbS5cbmNvbnN0IFRJTUVPVVRfU1lTVEVNX1BSSU9SSVRZID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcblxudHlwZSBPcGVuRXhwbG9yZXJVaUZuID0gKGJvZHk6IHtcbiAgdWk6IEV4cGxvcmVyVWlcbiAgcmVxdWVzdElkPzogbnVtYmVyXG4gIGl0ZW1QdXJjaGFzZT86IHsgdXJuOiBzdHJpbmcgfVxufSkgPT4gUHJvbWlzZTx7IG9wZW5SZXN1bHQ6IE9wZW5FeHBsb3JlclVpUmVzdWx0IH0+XG5cbnR5cGUgQ29sbGVjdGVkRXZlbnQgPSB7IGNoYW5uZWw6IHN0cmluZzsgZXZlbnQ6IENvcnJlbGF0ZWRFdmVudCB9XG5cbnR5cGUgU2Vzc2lvbiA9IHtcbiAgcmVxdWVzdElkOiBudW1iZXJcbiAgdWk6IEV4cGxvcmVyVWlcbiAgY29ycmVsYXRpb25SZXF1aXJlZDogYm9vbGVhblxuICBjb2xsZWN0OiBSZWFkb25seVNldDxzdHJpbmc+XG4gIHdhdGNoZWQ6IFJlYWRvbmx5U2V0PHN0cmluZz5cbiAgdW50aWw6IHsgY2hhbm5lbDogc3RyaW5nOyAkY2FzZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gfCB1bmRlZmluZWRcbiAgZXZlbnRzOiBDb2xsZWN0ZWRFdmVudFtdXG4gIHRpbWVvdXRNczogbnVtYmVyIHwgdW5kZWZpbmVkXG4gIGVsYXBzZWRNczogbnVtYmVyXG4gIHNldHRsZWQ6IGJvb2xlYW5cbiAgc2V0dGxlOiAob3V0Y29tZTogV2FpdE91dGNvbWU8bmV2ZXJbXT4pID0+IHZvaWRcbiAgZmFpbDogKGVycm9yOiBFcnJvcikgPT4gdm9pZFxufVxuXG50eXBlIEF0dHJpYnV0aW9uID0gJ3llcycgfCAnbm8nIHwgJ2FtYmlndW91cydcblxuLy8gdHMtcHJvdG8gcmVuZGVycyBhIGBvbmVvZmAgYXMgb25lIHdyYXBwZXIgcHJvcGVydHkgYHsgJGNhc2UsIFskY2FzZV06IHZhbHVlIH1gLiBGaW5kaW5nIHRoYXRcbi8vIHByb3BlcnR5IGJ5IHNoYXBlIGtlZXBzIHRoZSBoZWxwZXIgaW5kZXBlbmRlbnQgb2YgdGhlIG5hbWUgZWFjaCBtZXNzYWdlIGdhdmUgaXQ6IGBldmVudGAgb25cbi8vIG9uZSBtZXNzYWdlLCBgc3RhdHVzYCBvbiBhbm90aGVyLlxuZnVuY3Rpb24gY2FzZU9mKGV2ZW50OiBDb3JyZWxhdGVkRXZlbnQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhldmVudCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mICh2YWx1ZSBhcyB7ICRjYXNlPzogdW5rbm93biB9KS4kY2FzZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgeyAkY2FzZTogc3RyaW5nIH0pLiRjYXNlXG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RvcChzdG9wOiBTdG9wQ29uZGl0aW9uKTogeyBjaGFubmVsOiBBbnlDaGFubmVsOyAkY2FzZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0ge1xuICByZXR1cm4gJyRjYXNlJyBpbiBzdG9wID8geyBjaGFubmVsOiBzdG9wLmNoYW5uZWwsICRjYXNlOiBzdG9wLiRjYXNlIH0gOiB7IGNoYW5uZWw6IHN0b3AsICRjYXNlOiB1bmRlZmluZWQgfVxufVxuXG4vKiogQGludGVybmFsIHRlc3Qgc2VhbS4gVGhlIHByb2R1Y3Rpb24gaW5zdGFuY2UgaXMge0BsaW5rIG9wZW5FeHBsb3JlclVpQW5kV2FpdH0uICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKGRlcHM6IHtcbiAgZW5naW5lOiBJRW5naW5lXG4gIG9wZW5FeHBsb3JlclVpOiBPcGVuRXhwbG9yZXJVaUZuXG4gIGV4cGxvcmVyVWlFdmVudHM6IENoYW5uZWw8J2V4cGxvcmVyVWknLCBQQkV4cGxvcmVyVWlFdmVudHNSZXN1bHQ+XG59KSB7XG4gIGNvbnN0IHsgZW5naW5lOiBlbmdpbmVJbnN0YW5jZSwgb3BlbkV4cGxvcmVyVWk6IG9wZW5FeHBsb3JlclVpRm4sIGV4cGxvcmVyVWlFdmVudHMgfSA9IGRlcHNcbiAgY29uc3Qgcm9vdCA9IGVuZ2luZUluc3RhbmNlLlJvb3RFbnRpdHlcblxuICBjb25zdCBzZXNzaW9ucyA9IG5ldyBNYXA8bnVtYmVyLCBTZXNzaW9uPigpXG4gIC8vIEtleWVkIGJ5IG5hbWUsIHNvIHR3byB3cmFwcGVycyBhcm91bmQgdGhlIHNhbWUgY29tcG9uZW50IGFybSBvbmUgbGlzdGVuZXIsIG5vdCB0d28uXG4gIGNvbnN0IGFybWVkID0gbmV3IE1hcDxzdHJpbmcsIEdyb3dPbmx5VmFsdWVTZXRDb21wb25lbnREZWZpbml0aW9uPGFueT4+KClcbiAgLy8gU3RhcnRzIGF0IDEgc28gYSBtaW50ZWQgaWQgbmV2ZXIgY29sbGlkZXMgd2l0aCBVTkNPUlJFTEFURUQuXG4gIGxldCBuZXh0UmVxdWVzdElkID0gMVxuICBsZXQgdGltZW91dFN5c3RlbUFkZGVkID0gZmFsc2VcblxuICBmdW5jdGlvbiBhcm0oY2g6IEFueUNoYW5uZWwpIHtcbiAgICBjb25zdCBib3VuZCA9IGFybWVkLmdldChjaC5uYW1lKVxuICAgIGlmIChib3VuZCkge1xuICAgICAgaWYgKGJvdW5kICE9PSBjaC5jb21wb25lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBvcGVuRXhwbG9yZXJVaUFuZFdhaXQ6IGNoYW5uZWwgbmFtZSAnJHtjaC5uYW1lfScgaXMgYWxyZWFkeSBib3VuZCB0byBhIGRpZmZlcmVudCBjb21wb25lbnQuIGAgK1xuICAgICAgICAgICAgYENoYW5uZWwgbmFtZXMgaWRlbnRpZnkgYSBzdHJlYW0sIHNvIHRoZXkgaGF2ZSB0byBiZSB1bmlxdWUgd2l0aGluIGEgc2NlbmUuYFxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgYXJtZWQuc2V0KGNoLm5hbWUsIGNoLmNvbXBvbmVudClcbiAgICBjb25zdCBuYW1lID0gY2gubmFtZVxuICAgIC8vIG9uQ2hhbmdlIGhhcyBubyB1bnN1YnNjcmliZSwgc28gb25lIGxpc3RlbmVyIHBlciBjaGFubmVsIGxpdmVzIGZvciB0aGUgZW5naW5lJ3MgbGlmZXRpbWUuXG4gICAgY2guY29tcG9uZW50Lm9uQ2hhbmdlKHJvb3QsICh2YWx1ZTogQ29ycmVsYXRlZEV2ZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAvLyBgdW5kZWZpbmVkYCBhcnJpdmVzIG9uIERFTEVURV9FTlRJVFkuIE90aGVyd2lzZSBgdmFsdWVgIGlzIG9uZSBhcHBlbmRlZCBlbGVtZW50LFxuICAgICAgLy8gbm90IHRoZSB3aG9sZSBzZXQuXG4gICAgICBpZiAodmFsdWUpIGRlbGl2ZXIobmFtZSwgdmFsdWUpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZShzZXNzaW9uOiBTZXNzaW9uLCBuYW1lOiBzdHJpbmcsIGV2ZW50OiBDb3JyZWxhdGVkRXZlbnQpOiBBdHRyaWJ1dGlvbiB7XG4gICAgaWYgKGV2ZW50LnJlcXVlc3RJZCA9PT0gc2Vzc2lvbi5yZXF1ZXN0SWQpIHJldHVybiAneWVzJ1xuICAgIGlmIChldmVudC5yZXF1ZXN0SWQgIT09IFVOQ09SUkVMQVRFRCkgcmV0dXJuICdubydcbiAgICAvLyBPbmx5IHRoZSBsaWZlY3ljbGUgY2hhbm5lbCBjYXJyaWVzIGEgc2Vjb25kIGRpc2NyaW1pbmF0b3IsIGB1aWAsIGFuZCBpdCBpZGVudGlmaWVzIGFcbiAgICAvLyBzZXNzaW9uIG9ubHkgd2hpbGUgcGFuZWxzIGNhbm5vdCBjb2V4aXN0LiBBIHNlY29uZCBjYWxsIGZvciB0aGUgc2FtZSBwYW5lbCBpcyBhbnN3ZXJlZFxuICAgIC8vIFdBU19BTFJFQURZX09QRU4sIHNvIGF0IG1vc3Qgb25lIHNlc3Npb24gcGVyIG5vbi1jb25jdXJyZW50IHBhbmVsIGlzIGV2ZXIgbGl2ZS5cbiAgICBpZiAoc2Vzc2lvbi5jb3JyZWxhdGlvblJlcXVpcmVkIHx8IG5hbWUgIT09IGV4cGxvcmVyVWlFdmVudHMubmFtZSkgcmV0dXJuICdhbWJpZ3VvdXMnXG4gICAgcmV0dXJuIChldmVudCBhcyBQQkV4cGxvcmVyVWlFdmVudHNSZXN1bHQpLnVpID09PSBzZXNzaW9uLnVpID8gJ3llcycgOiAnbm8nXG4gIH1cblxuICBmdW5jdGlvbiBkZWxpdmVyKG5hbWU6IHN0cmluZywgZXZlbnQ6IENvcnJlbGF0ZWRFdmVudCkge1xuICAgIC8vIFNldHRsaW5nIGRlbGV0ZXMgZnJvbSBgc2Vzc2lvbnNgIG1pZC1pdGVyYXRpb24sIHdoaWNoIGEgTWFwIHRvbGVyYXRlcy4gTm90aGluZyBhZGRzLlxuICAgIGZvciAoY29uc3Qgc2Vzc2lvbiBvZiBzZXNzaW9ucy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFzZXNzaW9uLndhdGNoZWQuaGFzKG5hbWUpKSBjb250aW51ZVxuICAgICAgY29uc3QgYXR0cmlidXRpb24gPSBhdHRyaWJ1dGUoc2Vzc2lvbiwgbmFtZSwgZXZlbnQpXG4gICAgICBpZiAoYXR0cmlidXRpb24gPT09ICdubycpIGNvbnRpbnVlXG4gICAgICBpZiAoYXR0cmlidXRpb24gPT09ICdhbWJpZ3VvdXMnKSB7XG4gICAgICAgIGZhaWxTZXNzaW9uKFxuICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYG9wZW5FeHBsb3JlclVpQW5kV2FpdDogZ290IGEgJyR7bmFtZX0nIGV2ZW50IHdpdGggbm8gcmVxdWVzdF9pZCwgYW5kIG5vdGhpbmcgZWxzZSBpZGVudGlmaWVzIGAgK1xuICAgICAgICAgICAgICBgdGhlIGNhbGwgaXQgYmVsb25ncyB0by4gVGhpcyBleHBsb3JlciBkb2VzIG5vdCBlY2hvIE9wZW5FeHBsb3JlclVpUmVxdWVzdC5yZXF1ZXN0X2lkLmBcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGFjY2VwdChzZXNzaW9uLCBuYW1lLCBldmVudClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhY2NlcHQoc2Vzc2lvbjogU2Vzc2lvbiwgbmFtZTogc3RyaW5nLCBldmVudDogQ29ycmVsYXRlZEV2ZW50KSB7XG4gICAgaWYgKHNlc3Npb24uY29sbGVjdC5oYXMobmFtZSkpIHNlc3Npb24uZXZlbnRzLnB1c2goeyBjaGFubmVsOiBuYW1lLCBldmVudCB9KVxuXG4gICAgLy8gVGhlIGNsb3NlIGlzIHRlcm1pbmFsIGFuZCB3aW5zIG92ZXIgYHVudGlsYCwgYmVjYXVzZSBgbWF0Y2hlZGAgd291bGQgdGVsbCB0aGUgY2FsbGVyXG4gICAgLy8gdGhhdCB0aGUgcGFuZWwgaXMgc3RpbGwgb24gc2NyZWVuLlxuICAgIGlmIChuYW1lID09PSBleHBsb3JlclVpRXZlbnRzLm5hbWUgJiYgY2FzZU9mKGV2ZW50KSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHNldHRsZVNlc3Npb24oc2Vzc2lvbiwgeyAkY2FzZTogJ2Nsb3NlZCcsIGV2ZW50czogc2Vzc2lvbi5ldmVudHMgYXMgbmV2ZXJbXSB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdW50aWwgPSBzZXNzaW9uLnVudGlsXG4gICAgaWYgKCF1bnRpbCB8fCB1bnRpbC5jaGFubmVsICE9PSBuYW1lKSByZXR1cm5cbiAgICBpZiAodW50aWwuJGNhc2UgPT09IHVuZGVmaW5lZCB8fCB1bnRpbC4kY2FzZSA9PT0gY2FzZU9mKGV2ZW50KSkge1xuICAgICAgc2V0dGxlU2Vzc2lvbihzZXNzaW9uLCB7ICRjYXNlOiAnbWF0Y2hlZCcsIGV2ZW50czogc2Vzc2lvbi5ldmVudHMgYXMgbmV2ZXJbXSB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZVNlc3Npb24oc2Vzc2lvbjogU2Vzc2lvbiwgb3V0Y29tZTogV2FpdE91dGNvbWU8bmV2ZXJbXT4pIHtcbiAgICBpZiAoc2Vzc2lvbi5zZXR0bGVkKSByZXR1cm5cbiAgICBzZXNzaW9uLnNldHRsZWQgPSB0cnVlXG4gICAgc2Vzc2lvbnMuZGVsZXRlKHNlc3Npb24ucmVxdWVzdElkKVxuICAgIHNlc3Npb24uc2V0dGxlKG91dGNvbWUpXG4gICAgbWF5YmVSZW1vdmVUaW1lb3V0U3lzdGVtKClcbiAgfVxuXG4gIGZ1bmN0aW9uIGZhaWxTZXNzaW9uKHNlc3Npb246IFNlc3Npb24sIGVycm9yOiBFcnJvcikge1xuICAgIGlmIChzZXNzaW9uLnNldHRsZWQpIHJldHVyblxuICAgIHNlc3Npb24uc2V0dGxlZCA9IHRydWVcbiAgICBzZXNzaW9ucy5kZWxldGUoc2Vzc2lvbi5yZXF1ZXN0SWQpXG4gICAgc2Vzc2lvbi5mYWlsKGVycm9yKVxuICAgIG1heWJlUmVtb3ZlVGltZW91dFN5c3RlbSgpXG4gIH1cblxuICBmdW5jdGlvbiBoYXNUaW1lZFNlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzZXNzaW9uIG9mIHNlc3Npb25zLnZhbHVlcygpKSB7XG4gICAgICBpZiAoc2Vzc2lvbi50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmdW5jdGlvbiBtYXliZVJlbW92ZVRpbWVvdXRTeXN0ZW0oKSB7XG4gICAgaWYgKCF0aW1lb3V0U3lzdGVtQWRkZWQgfHwgaGFzVGltZWRTZXNzaW9uKCkpIHJldHVyblxuICAgIHRpbWVvdXRTeXN0ZW1BZGRlZCA9IGZhbHNlXG4gICAgZW5naW5lSW5zdGFuY2UucmVtb3ZlU3lzdGVtKEVYUExPUkVSX1VJX1dBSVRfVElNRU9VVF9TWVNURU0pXG4gIH1cblxuICBmdW5jdGlvbiBlbnN1cmVUaW1lb3V0U3lzdGVtKCkge1xuICAgIGlmICh0aW1lb3V0U3lzdGVtQWRkZWQpIHJldHVyblxuICAgIHRpbWVvdXRTeXN0ZW1BZGRlZCA9IHRydWVcbiAgICAvLyBUaGUgc2NlbmUgcnVudGltZSBoYXMgbm8gdGltZXJzLCBzbyBlbGFwc2VkIHRpbWUgaXMgYWNjdW11bGF0ZWQgZnJvbSB0aGUgZW5naW5lJ3MgZHQuXG4gICAgZW5naW5lSW5zdGFuY2UuYWRkU3lzdGVtKFxuICAgICAgKGR0OiBudW1iZXIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBzZXNzaW9uIG9mIHNlc3Npb25zLnZhbHVlcygpKSB7XG4gICAgICAgICAgaWYgKHNlc3Npb24udGltZW91dE1zID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgc2Vzc2lvbi5lbGFwc2VkTXMgKz0gZHQgKiAxMDAwXG4gICAgICAgICAgaWYgKHNlc3Npb24uZWxhcHNlZE1zID49IHNlc3Npb24udGltZW91dE1zKSB7XG4gICAgICAgICAgICBzZXR0bGVTZXNzaW9uKHNlc3Npb24sIHsgJGNhc2U6ICd0aW1lZE91dCcsIGV2ZW50czogc2Vzc2lvbi5ldmVudHMgYXMgbmV2ZXJbXSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZVJlbW92ZVRpbWVvdXRTeXN0ZW0oKVxuICAgICAgfSxcbiAgICAgIFRJTUVPVVRfU1lTVEVNX1BSSU9SSVRZLFxuICAgICAgRVhQTE9SRVJfVUlfV0FJVF9USU1FT1VUX1NZU1RFTVxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW5FeHBsb3JlclVpQW5kV2FpdChcbiAgICByZXF1ZXN0OiBPcGVuRXhwbG9yZXJVaVJlcXVlc3QgfCBFeGNsdWRlPEV4cGxvcmVyVWksIEV4cGxvcmVyVWkuRVVfSVRFTV9QVVJDSEFTRT4sXG4gICAgb3B0aW9ucz86IFdhaXRPcHRpb25zPHJlYWRvbmx5IEFueUNoYW5uZWxbXT5cbiAgKTogUHJvbWlzZTxXYWl0T3V0Y29tZTxuZXZlcltdPj4ge1xuICAgIGNvbnN0IHsgdWksIGl0ZW1QdXJjaGFzZSB9ID0gdHlwZW9mIHJlcXVlc3QgPT09ICdudW1iZXInID8geyB1aTogcmVxdWVzdCwgaXRlbVB1cmNoYXNlOiB1bmRlZmluZWQgfSA6IHJlcXVlc3RcbiAgICBjb25zdCByZXF1ZXN0SWQgPSBuZXh0UmVxdWVzdElkKytcblxuICAgIGNvbnN0IGNvbGxlY3QgPSBvcHRpb25zPy5jb2xsZWN0ID8/IFtdXG4gICAgY29uc3QgY29sbGVjdE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNvbGxlY3QpIGNvbGxlY3ROYW1lcy5hZGQoY2gubmFtZSlcblxuICAgIGNvbnN0IHN0b3AgPSBvcHRpb25zPy51bnRpbCA/IG5vcm1hbGl6ZVN0b3Aob3B0aW9ucy51bnRpbCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCB3YXRjaGVkID0gbmV3IFNldDxzdHJpbmc+KGNvbGxlY3ROYW1lcylcbiAgICB3YXRjaGVkLmFkZChleHBsb3JlclVpRXZlbnRzLm5hbWUpXG4gICAgaWYgKHN0b3ApIHdhdGNoZWQuYWRkKHN0b3AuY2hhbm5lbC5uYW1lKVxuXG4gICAgLy8gQXJtZWQgYmVmb3JlIHRoZSBSUEMsIGJlY2F1c2UgZXZlbnRzIGNhbiBsYW5kIHdoaWxlIHRoZSBSUEMgaXMgaW4gZmxpZ2h0LiBBIGxpc3RlbmVyXG4gICAgLy8gdGhhdCBpcyBhbHJlYWR5IHVwIGlzIHdoYXQgbWFrZXMgcmVwbGF5aW5nIHRoZSBhY2N1bXVsYXRlZCBzZXQgdW5uZWNlc3NhcnkuXG4gICAgYXJtKGV4cGxvcmVyVWlFdmVudHMpXG4gICAgZm9yIChjb25zdCBjaCBvZiBjb2xsZWN0KSBhcm0oY2gpXG4gICAgaWYgKHN0b3ApIGFybShzdG9wLmNoYW5uZWwpXG5cbiAgICBsZXQgc2V0dGxlITogKG91dGNvbWU6IFdhaXRPdXRjb21lPG5ldmVyW10+KSA9PiB2b2lkXG4gICAgbGV0IGZhaWwhOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkXG4gICAgY29uc3Qgb3V0Y29tZSA9IG5ldyBQcm9taXNlPFdhaXRPdXRjb21lPG5ldmVyW10+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZXR0bGUgPSByZXNvbHZlXG4gICAgICBmYWlsID0gcmVqZWN0XG4gICAgfSlcblxuICAgIGNvbnN0IHNlc3Npb246IFNlc3Npb24gPSB7XG4gICAgICByZXF1ZXN0SWQsXG4gICAgICB1aSxcbiAgICAgIGNvcnJlbGF0aW9uUmVxdWlyZWQ6IENPTkNVUlJFTlRfUEFORUxTLmluY2x1ZGVzKHVpKSxcbiAgICAgIGNvbGxlY3Q6IGNvbGxlY3ROYW1lcyxcbiAgICAgIHdhdGNoZWQsXG4gICAgICB1bnRpbDogc3RvcCA/IHsgY2hhbm5lbDogc3RvcC5jaGFubmVsLm5hbWUsICRjYXNlOiBzdG9wLiRjYXNlIH0gOiB1bmRlZmluZWQsXG4gICAgICBldmVudHM6IFtdLFxuICAgICAgdGltZW91dE1zOiBvcHRpb25zPy50aW1lb3V0TXMsXG4gICAgICBlbGFwc2VkTXM6IDAsXG4gICAgICBzZXR0bGVkOiBmYWxzZSxcbiAgICAgIHNldHRsZSxcbiAgICAgIGZhaWxcbiAgICB9XG4gICAgc2Vzc2lvbnMuc2V0KHJlcXVlc3RJZCwgc2Vzc2lvbilcbiAgICBpZiAoc2Vzc2lvbi50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCkgZW5zdXJlVGltZW91dFN5c3RlbSgpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBvcGVuUmVzdWx0IH0gPSBhd2FpdCBvcGVuRXhwbG9yZXJVaUZuKHsgdWksIHJlcXVlc3RJZCwgaXRlbVB1cmNoYXNlIH0pXG4gICAgICAvLyBUaGlzIGNhbGwgb3BlbmVkIG5vdGhpbmcsIHNvIG5vIGV2ZW50IGNhcnJ5aW5nIHRoaXMgcmVxdWVzdCBpZCBpcyBjb21pbmcuXG4gICAgICBpZiAob3BlblJlc3VsdCAhPT0gT3BlbkV4cGxvcmVyVWlSZXN1bHQuT1BFTkVEKSB7XG4gICAgICAgIHNldHRsZVNlc3Npb24oc2Vzc2lvbiwgeyAkY2FzZTogJ25vdE9wZW5lZCcsIG9wZW5SZXN1bHQgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUm91dGVkIHRocm91Z2ggdGhlIHNlc3Npb24gcmF0aGVyIHRoYW4gcmV0aHJvd24sIHNvIHRoYXQgYG91dGNvbWVgIGlzIG5ldmVyIGxlZnRcbiAgICAgIC8vIHBlbmRpbmcgYW5kIHVub2JzZXJ2ZWQuXG4gICAgICBmYWlsU2Vzc2lvbihzZXNzaW9uLCBlcnJvciBhcyBFcnJvcilcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0Y29tZVxuICB9XG5cbiAgLy8gVGhlIGltcGxlbWVudGF0aW9uIHRha2VzIGJvdGggYXJndW1lbnQgZm9ybXMgYW5kIGlzIGJsaW5kIHRvIGBjb2xsZWN0YC4gVGhlIGNhc3QgaXMgd2hhdFxuICAvLyBnaXZlcyBjYWxsZXJzIHRoZSB0d28gb3ZlcmxvYWRzIHRoYXQgcmVsYXRlIHRoZW0uXG4gIHJldHVybiB7IG9wZW5FeHBsb3JlclVpQW5kV2FpdDogb3BlbkV4cGxvcmVyVWlBbmRXYWl0IGFzIE9wZW5FeHBsb3JlclVpQW5kV2FpdCB9XG59XG5cbmNvbnN0IGhlbHBlciA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGUoeyBlbmdpbmUsIG9wZW5FeHBsb3JlclVpLCBleHBsb3JlclVpRXZlbnRzOiBFeHBsb3JlclVpRXZlbnRzIH0pXG5cbi8qKlxuICogT3BlbnMgYW4gZXhwbG9yZXIgcGFuZWwgYW5kIHdhaXRzIGZvciB0aGUgc2Vzc2lvbiBpdCBzdGFydGVkLiBUaGUgd2FpdCBlbmRzIHdoZW4gdGhlIHBhbmVsXG4gKiBjbG9zZXMuIFNlZSB7QGxpbmsgV2FpdE9wdGlvbnN9IHRvIGNvbGxlY3QgZXZlbnRzLCB0byBzdG9wIGVhcmxpZXIgb3IgdG8gYm91bmQgdGhlIHdhaXQuXG4gKlxuICogRXZlcnkgbGlmZWN5Y2xlIG91dGNvbWUgcmVzb2x2ZXMsIHNlZSB7QGxpbmsgV2FpdE91dGNvbWV9LiBUaGUgcHJvbWlzZSByZWplY3RzIG9ubHkgd2hlbiBhblxuICogZXZlbnQgY2Fubm90IGJlIGF0dHJpYnV0ZWQgdG8gYSBjYWxsIGF0IGFsbDogYW4gZXhwbG9yZXIgdG9vIG9sZCB0byBlY2hvIGByZXF1ZXN0X2lkYFxuICogcGFpcmVkIHdpdGggYSBwYW5lbCB0aGF0IGNhbiBjb2V4aXN0IHdpdGggYW5vdGhlciBvbmUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgb3BlbkV4cGxvcmVyVWlBbmRXYWl0OiBPcGVuRXhwbG9yZXJVaUFuZFdhaXQgPSBoZWxwZXIub3BlbkV4cGxvcmVyVWlBbmRXYWl0XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import { Observable } from './Observable';
2
+ /**
3
+ * @internal
4
+ * Raw `localeChanged` events drained from the renderer by `pollEvents`.
5
+ * Kept side-effect free so `observables` doesn't load `platform` for every scene.
6
+ */
7
+ export const localeChangedEvents = new Observable();
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UtZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ludGVybmFsL2xhbmd1YWdlLWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXpDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLFVBQVUsRUFBc0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICcuL09ic2VydmFibGUnXG5cbi8qKlxuICogQGludGVybmFsXG4gKiBSYXcgYGxvY2FsZUNoYW5nZWRgIGV2ZW50cyBkcmFpbmVkIGZyb20gdGhlIHJlbmRlcmVyIGJ5IGBwb2xsRXZlbnRzYC5cbiAqIEtlcHQgc2lkZS1lZmZlY3QgZnJlZSBzbyBgb2JzZXJ2YWJsZXNgIGRvZXNuJ3QgbG9hZCBgcGxhdGZvcm1gIGZvciBldmVyeSBzY2VuZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvY2FsZUNoYW5nZWRFdmVudHMgPSBuZXcgT2JzZXJ2YWJsZTx7IGxvY2FsZTogc3RyaW5nIH0+KClcbiJdfQ==
package/observables.d.ts CHANGED
@@ -29,6 +29,10 @@ export interface IEvents {
29
29
  sender: string;
30
30
  message: string;
31
31
  };
32
+ /** Triggered when the player switches the client language. `locale` is a BCP-47 tag */
33
+ localeChanged: {
34
+ locale: string;
35
+ };
32
36
  /**
33
37
  * This is triggered once the scene should start.
34
38
  */
package/observables.js CHANGED
@@ -2,6 +2,7 @@ import { Observable } from './internal/Observable';
2
2
  import { AvatarBase, AvatarEmoteCommand, AvatarEquippedData, PlayerIdentityData, PointerEventsResult, RealmInfo, engine } from '@dcl/ecs';
3
3
  import { subscribe } from '~system/EngineApi';
4
4
  import players from './players';
5
+ import { localeChangedEvents } from './internal/language-events';
5
6
  /**
6
7
  * @internal
7
8
  * This function generates a callback that is passed to the Observable
@@ -98,6 +99,10 @@ export async function pollEvents(sendBatch) {
98
99
  onCommsMessage.notifyObservers(data);
99
100
  break;
100
101
  }
102
+ case 'localeChanged': {
103
+ localeChangedEvents.notifyObservers(data);
104
+ break;
105
+ }
101
106
  }
102
107
  }
103
108
  }
@@ -245,4 +250,4 @@ function processObservables() {
245
250
  engine.addSystem(observableSystem);
246
251
  return { subscribe };
247
252
  }
248
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvb2JzZXJ2YWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2xELE9BQU8sRUFDTCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUVsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLFNBQVMsRUFFVCxNQUFNLEVBQ1AsTUFBTSxVQUFVLENBQUE7QUFDakIsT0FBTyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRixPQUFPLE9BQU8sTUFBTSxXQUFXLENBQUE7QUEwRi9COzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFNBQXdCO0lBQ2hELE9BQU8sR0FBRyxFQUFFO1FBQ1YsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ3pCLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDdkQ7YUFBTTtZQUNMLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtTQUMvQztJQUNILENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxVQUFVLENBQTBCLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUE7QUFDL0c7OzhNQUU4TTtBQUM5TSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQUE7QUFFbEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksVUFBVSxDQUEwQixnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFBO0FBRS9HOzs4TUFFOE07QUFDOU0sTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLHNCQUFzQixD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QUU7WUFDZixVQUFVLEdBQUcsSUFBSSxDQUFBO1lBQ2pCLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtTQUMzQztRQUNELElBQUksY0FBYztZQUFFLE9BQU07UUFDMUIsY0FBYyxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsT0FBTyxDQUFBO0lBQzdFLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFFbEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFBO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAnLi9pbnRlcm5hbC9PYnNlcnZhYmxlJ1xuaW1wb3J0IHtcbiAgQXZhdGFyQmFzZSxcbiAgQXZhdGFyRW1vdGVDb21tYW5kLFxuICBBdmF0YXJFcXVpcHBlZERhdGEsXG4gIEVudGl0eSxcbiAgUGxheWVySWRlbnRpdHlEYXRhLFxuICBQb2ludGVyRXZlbnRzUmVzdWx0LFxuICBSZWFsbUluZm8sXG4gIFZlY3RvcjNUeXBlLFxuICBlbmdpbmVcbn0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBNYW55RW50aXR5QWN0aW9uLCBTZW5kQmF0Y2hSZXNwb25zZSwgc3Vic2NyaWJlIH0gZnJvbSAnfnN5c3RlbS9FbmdpbmVBcGknXG5pbXBvcnQgcGxheWVycyBmcm9tICcuL3BsYXllcnMnXG5cbi8vLyAtLS0gRVZFTlRTIC0tLVxuXG4vKiogQHB1YmxpYyAqL1xuZXhwb3J0IHR5cGUgSUV2ZW50TmFtZXMgPSBrZXlvZiBJRXZlbnRzXG5cbi8qKlxuICogQHB1YmxpY1xuICogTm90ZTogRG9uJ3QgdXNlIGBvbmAgcHJlZml4IGZvciBJRXZlbnRzIHRvIGF2b2lkIHJlZHVuZGFuY3kgd2l0aCBgZXZlbnQub24oXCJvbkV2ZW50TmFtZVwiKWAgc3ludGF4LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudHMge1xuICBwbGF5ZXJFeHByZXNzaW9uOiB7XG4gICAgZXhwcmVzc2lvbklkOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGdldHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgZW50ZXJzIHRoZSBzY2VuZVxuICAgKi9cbiAgb25FbnRlclNjZW5lOiB7XG4gICAgdXNlcklkOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGdldHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBzY2VuZVxuICAgKi9cbiAgb25MZWF2ZVNjZW5lOiB7XG4gICAgdXNlcklkOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGdldHMgdHJpZ2dlcmVkIGFmdGVyIHJlY2VpdmluZyBhIGNvbW1zIG1lc3NhZ2UuXG4gICAqL1xuICBjb21tczoge1xuICAgIHNlbmRlcjogc3RyaW5nXG4gICAgbWVzc2FnZTogc3RyaW5nXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyB0cmlnZ2VyZWQgb25jZSB0aGUgc2NlbmUgc2hvdWxkIHN0YXJ0LlxuICAgKi9cbiAgc2NlbmVTdGFydDogdW5rbm93blxuXG4gIC8qKiBUaGlzIGlzIHRyaWdnZXJlZCBhdCBsZWFzdCBmb3IgZWFjaCB2aWRlb1N0YXR1cyBjaGFuZ2UgKi9cbiAgdmlkZW9FdmVudDoge1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcbiAgICB2aWRlb0NsaXBJZDogc3RyaW5nXG4gICAgLyoqIFN0YXR1cywgY2FuIGJlIE5PTkUgPSAwLCBFUlJPUiA9IDEsIExPQURJTkcgPSAyLCBSRUFEWSA9IDMsIFBMQVlJTkcgPSA0LEJVRkZFUklORyA9IDUgKi9cbiAgICB2aWRlb1N0YXR1czogbnVtYmVyXG4gICAgLyoqIEN1cnJlbnQgb2Zmc2V0IHBvc2l0aW9uIGluIHNlY29uZHMgKi9cbiAgICBjdXJyZW50T2Zmc2V0OiBudW1iZXJcbiAgICAvKiogVmlkZW8gbGVuZ3RoIGluIHNlY29uZHMuIENhbiBiZSAtMSAqL1xuICAgIHRvdGFsVmlkZW9MZW5ndGg6IG51bWJlclxuICB9XG5cbiAgLyoqIFRoaXMgaXMgdHJpZ2dlciBldmVyeXRpbWUgYSBwcm9maWxlIGlzIGNoYW5nZWQgKi9cbiAgcHJvZmlsZUNoYW5nZWQ6IHtcbiAgICBldGhBZGRyZXNzOiBzdHJpbmdcbiAgICB2ZXJzaW9uOiBudW1iZXJcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiBwZWVyJ3MgYXZhdGFyIGlzIGNvbm5lY3RlZCBhbmQgdmlzaWJsZSAqL1xuICBwbGF5ZXJDb25uZWN0ZWQ6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqIFRyaWdnZXJlZCB3aGVuIHBlZXIgZGlzY29ubmVjdCBhbmQvb3IgaXQgYXZhdGFyIGlzIHNldCBpbnZpc2libGUgYnkgY29tbXMgKi9cbiAgcGxheWVyRGlzY29ubmVjdGVkOiB7XG4gICAgdXNlcklkOiBzdHJpbmdcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiBjdXJyZW50IHJlYWxtIG9yIGlzbGFuZCBjaGFuZ2VzICovXG4gIG9uUmVhbG1DaGFuZ2VkOiB7XG4gICAgZG9tYWluOiBzdHJpbmdcbiAgICByb29tOiBzdHJpbmdcbiAgICBzZXJ2ZXJOYW1lOiBzdHJpbmdcbiAgICBkaXNwbGF5TmFtZTogc3RyaW5nXG4gIH1cblxuICAvKiogVHJpZ2dlcmVkIHdoZW4gb3RoZXIgcGxheWVyJ3MgYXZhdGFyIGlzIGNsaWNrZWQgKi9cbiAgcGxheWVyQ2xpY2tlZDoge1xuICAgIHVzZXJJZDogc3RyaW5nXG4gICAgcmF5OiB7XG4gICAgICBvcmlnaW46IFZlY3RvcjNUeXBlXG4gICAgICBkaXJlY3Rpb246IFZlY3RvcjNUeXBlXG4gICAgICBkaXN0YW5jZTogbnVtYmVyXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIGNhbGxiYWNrIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBPYnNlcnZhYmxlXG4gKiBjb25zdHJ1Y3RvciB0byBzdWJzY3JpYmUgdG8gdGhlIGV2ZW50cyBvZiB0aGUgRGVjZW50cmFsYW5kSW50ZXJmYWNlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmliZXIoZXZlbnROYW1lOiBrZXlvZiBJRXZlbnRzKSB7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2NvbW1zJykge1xuICAgICAgc3Vic2NyaWJlKHsgZXZlbnRJZDogZXZlbnROYW1lIH0pLmNhdGNoKGNvbnNvbGUuZXJyb3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIFNESzdDb21wb25lbnRzT2JzZXJ2YWJsZT8uc3Vic2NyaWJlKGV2ZW50TmFtZSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGVzZSBldmVudHMgYXJlIHRyaWdnZXJlZCBhZnRlciB5b3VyIGNoYXJhY3RlciBlbnRlcnMgdGhlIHNjZW5lLlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uRW50ZXJTY2VuZU9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydvbkVudGVyU2NlbmUnXT4oY3JlYXRlU3Vic2NyaWJlcignb25FbnRlclNjZW5lJykpXG4vKiogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuIFVzZSBvbkVudGVyU2NlbmVPYnNlcnZhYmxlIGluc3RlYWQuICovXG5leHBvcnQgY29uc3Qgb25FbnRlclNjZW5lID0gb25FbnRlclNjZW5lT2JzZXJ2YWJsZVxuXG4vKipcbiAqIFRoZXNlIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGFmdGVyIHlvdXIgY2hhcmFjdGVyIGxlYXZlcyB0aGUgc2NlbmUuXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ29uTGVhdmVTY2VuZSddPihjcmVhdGVTdWJzY3JpYmVyKCdvbkxlYXZlU2NlbmUnKSlcblxuLyoqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLiBVc2Ugb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZSBpbnN0ZWFkLiAqL1xuZXhwb3J0IGNvbnN0IG9uTGVhdmVTY2VuZSA9IG9uTGVhdmVTY2VuZU9ic2VydmFibGVcblxuLyoqXG4gKiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBhZnRlciBhbGwgdGhlIHJlc291cmNlcyBvZiB0aGUgc2NlbmUgd2VyZSBsb2FkZWQgKG1vZGVscywgdGV4dHVyZXMsIGV0Yy4uLilcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblNjZW5lUmVhZHlPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snc2NlbmVTdGFydCddPihjcmVhdGVTdWJzY3JpYmVyKCdzY2VuZVN0YXJ0JykpXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUGxheWVyRXhwcmVzc2lvbk9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydwbGF5ZXJFeHByZXNzaW9uJ10+KFxuICBjcmVhdGVTdWJzY3JpYmVyKCdwbGF5ZXJFeHByZXNzaW9uJylcbilcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25WaWRlb0V2ZW50ID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1sndmlkZW9FdmVudCddPihjcmVhdGVTdWJzY3JpYmVyKCd2aWRlb0V2ZW50JykpXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUHJvZmlsZUNoYW5nZWQgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydwcm9maWxlQ2hhbmdlZCddPihjcmVhdGVTdWJzY3JpYmVyKCdwcm9maWxlQ2hhbmdlZCcpKVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblBsYXllckNvbm5lY3RlZE9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydwbGF5ZXJDb25uZWN0ZWQnXT4oXG4gIGNyZWF0ZVN1YnNjcmliZXIoJ3BsYXllckNvbm5lY3RlZCcpXG4pXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUGxheWVyRGlzY29ubmVjdGVkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3BsYXllckRpc2Nvbm5lY3RlZCddPihcbiAgY3JlYXRlU3Vic2NyaWJlcigncGxheWVyRGlzY29ubmVjdGVkJylcbilcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25SZWFsbUNoYW5nZWRPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snb25SZWFsbUNoYW5nZWQnXT4oY3JlYXRlU3Vic2NyaWJlcignb25SZWFsbUNoYW5nZWQnKSlcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25QbGF5ZXJDbGlja2VkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3BsYXllckNsaWNrZWQnXT4oY3JlYXRlU3Vic2NyaWJlcigncGxheWVyQ2xpY2tlZCcpKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uQ29tbXNNZXNzYWdlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snY29tbXMnXT4oY3JlYXRlU3Vic2NyaWJlcignY29tbXMnKSlcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBkZXByZWNhdGVkIHRoaXMgaXMgYW4gT0xEIEFQSS5cbiAqIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgU0RLNiBzZW5kQmF0Y2ggdG8gcG9sbCBldmVudHMgZnJvbSB0aGUgcmVuZGVyZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBvbGxFdmVudHMoc2VuZEJhdGNoOiAoYm9keTogTWFueUVudGl0eUFjdGlvbikgPT4gUHJvbWlzZTxTZW5kQmF0Y2hSZXNwb25zZT4pIHtcbiAgY29uc3QgeyBldmVudHMgfSA9IGF3YWl0IHNlbmRCYXRjaCh7IGFjdGlvbnM6IFtdIH0pXG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoZS5nZW5lcmljKSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShlLmdlbmVyaWMuZXZlbnREYXRhKVxuICAgICAgc3dpdGNoIChlLmdlbmVyaWMuZXZlbnRJZCkge1xuICAgICAgICBjYXNlICdjb21tcyc6IHtcbiAgICAgICAgICBvbkNvbW1zTWVzc2FnZS5ub3RpZnlPYnNlcnZlcnMoZGF0YSBhcyBJRXZlbnRzWydjb21tcyddKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgU0RLN0NvbXBvbmVudHNPYnNlcnZhYmxlID0gcHJvY2Vzc09ic2VydmFibGVzKClcbmZ1bmN0aW9uIHByb2Nlc3NPYnNlcnZhYmxlcygpIHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQ8a2V5b2YgSUV2ZW50cz4oKVxuXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShldmVudE5hbWU6IGtleW9mIElFdmVudHMpIHtcbiAgICBpZiAoc3Vic2NyaXB0aW9ucy5oYXMoZXZlbnROYW1lKSkgcmV0dXJuXG4gICAgc3dpdGNoIChldmVudE5hbWUpIHtcbiAgICAgIGNhc2UgJ3BsYXllckNsaWNrZWQnOiB7XG4gICAgICAgIHN1YnNjcmliZVBsYXllckNsaWNrKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29uRW50ZXJTY2VuZSc6XG4gICAgICBjYXNlICdwbGF5ZXJDb25uZWN0ZWQnOiB7XG4gICAgICAgIHN1YnNjcmliZUVudGVyU2NlbmUoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnb25MZWF2ZVNjZW5lJzpcbiAgICAgIGNhc2UgJ3BsYXllckRpc2Nvbm5lY3RlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlTGVhdmVTY2VuZSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdvblJlYWxtQ2hhbmdlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlUmVhbG1DaGFuZ2UoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAncGxheWVyRXhwcmVzc2lvbic6IHtcbiAgICAgICAgc3Vic2NyaWJlUGxheWVyRXhwcmVzc2lvbigpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdwcm9maWxlQ2hhbmdlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlUHJvZmlsZUNoYW5nZSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIHN1YnNjcmlwdGlvbnMuYWRkKGV2ZW50TmFtZSlcbiAgfVxuICAvKipcbiAgICogUExBWUVSIEVOVEVSL0NPTk5FQ1RFRCBvYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmVFbnRlclNjZW5lKCkge1xuICAgIHBsYXllcnMub25FbnRlclNjZW5lKChwbGF5ZXIpID0+IHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb25zLmhhcygnb25FbnRlclNjZW5lJykpIHtcbiAgICAgICAgb25FbnRlclNjZW5lT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyB1c2VySWQ6IHBsYXllci51c2VySWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHN1YnNjcmlwdGlvbnMuaGFzKCdwbGF5ZXJDb25uZWN0ZWQnKSkge1xuICAgICAgICBvblBsYXllckNvbm5lY3RlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHsgdXNlcklkOiBwbGF5ZXIudXNlcklkIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvKipcbiAgICogUExBWUVSIExFQVZFL0RJU0NPTk5FQ1RFRCBvYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmVMZWF2ZVNjZW5lKCkge1xuICAgIHBsYXllcnMub25MZWF2ZVNjZW5lKCh1c2VySWQpID0+IHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb25zLmhhcygnb25MZWF2ZVNjZW5lJykpIHtcbiAgICAgICAgb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyB1c2VySWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHN1YnNjcmlwdGlvbnMuaGFzKCdwbGF5ZXJEaXNjb25uZWN0ZWQnKSkge1xuICAgICAgICBvblBsYXllckRpc2Nvbm5lY3RlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHsgdXNlcklkIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvKipcbiAgICogUkVBTE0gQ0hBTkdFIG9ic2VydmFibGVcbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZVJlYWxtQ2hhbmdlKCkge1xuICAgIFJlYWxtSW5mby5vbkNoYW5nZShlbmdpbmUuUm9vdEVudGl0eSwgKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgb25SZWFsbUNoYW5nZWRPYnNlcnZhYmxlLm5vdGlmeU9ic2VydmVycyh7XG4gICAgICAgICAgZG9tYWluOiB2YWx1ZS5iYXNlVXJsLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiB2YWx1ZS5yZWFsbU5hbWUsXG4gICAgICAgICAgcm9vbTogdmFsdWUucm9vbSA/PyAnJyxcbiAgICAgICAgICBzZXJ2ZXJOYW1lOiB2YWx1ZS5yZWFsbU5hbWVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIC8qKlxuICAgKiBQTEFZRVIvQVZBVEFSIENMSUNLRUQgb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlUGxheWVyQ2xpY2soKSB7XG4gICAgY29uc3QgcGxheWVyRW50aXRpZXMgPSBuZXcgU2V0PEVudGl0eT4oKVxuICAgIGVuZ2luZS5hZGRTeXN0ZW0oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBbZW50aXR5XSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBsYXllcklkZW50aXR5RGF0YSkpIHtcbiAgICAgICAgaWYgKHBsYXllckVudGl0aWVzLmhhcyhlbnRpdHkpKSBjb250aW51ZVxuICAgICAgICBwbGF5ZXJFbnRpdGllcy5hZGQoZW50aXR5KVxuXG4gICAgICAgIFBvaW50ZXJFdmVudHNSZXN1bHQub25DaGFuZ2UoZW50aXR5LCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhPy5oaXQpIHtcbiAgICAgICAgICAgIG9uUGxheWVyQ2xpY2tlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgdXNlcklkOiBQbGF5ZXJJZGVudGl0eURhdGEuZ2V0T3JOdWxsKGVudGl0eSk/LmFkZHJlc3MgPz8gJycsXG4gICAgICAgICAgICAgIHJheToge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogZGF0YS5oaXQuZGlyZWN0aW9uISxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogZGF0YS5oaXQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogZGF0YS5oaXQuZ2xvYmFsT3JpZ2luIVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBsYXllciBleHByZXNzaW9uIG9ic2VydmFibGVcbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZVBsYXllckV4cHJlc3Npb24oKSB7XG4gICAgQXZhdGFyRW1vdGVDb21tYW5kLm9uQ2hhbmdlKGVuZ2luZS5QbGF5ZXJFbnRpdHksICh2YWx1ZSkgPT4ge1xuICAgICAgb25QbGF5ZXJFeHByZXNzaW9uT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyBleHByZXNzaW9uSWQ6IHZhbHVlPy5lbW90ZVVybiA/PyAnJyB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUFJPRklMRSBDSEFOR0Ugb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlUHJvZmlsZUNoYW5nZSgpIHtcbiAgICBBdmF0YXJCYXNlLm9uQ2hhbmdlKGVuZ2luZS5QbGF5ZXJFbnRpdHksICgpID0+IHtcbiAgICAgIGlmICghcHJvZmlsZUFkZHJlc3MpIHJldHVyblxuICAgICAgb25Qcm9maWxlQ2hhbmdlZC5ub3RpZnlPYnNlcnZlcnMoeyBldGhBZGRyZXNzOiBwcm9maWxlQWRkcmVzcywgdmVyc2lvbjogMCB9KVxuICAgIH0pXG5cbiAgICBBdmF0YXJFcXVpcHBlZERhdGEub25DaGFuZ2UoZW5naW5lLlBsYXllckVudGl0eSwgKCkgPT4ge1xuICAgICAgaWYgKCFwcm9maWxlQWRkcmVzcykgcmV0dXJuXG4gICAgICBvblByb2ZpbGVDaGFuZ2VkLm5vdGlmeU9ic2VydmVycyh7IGV0aEFkZHJlc3M6IHByb2ZpbGVBZGRyZXNzLCB2ZXJzaW9uOiAwIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8vIEZsYWcgdG8gY2FsbCBvbmNlIHRoZSBzY2VuZSBpcyBpbml0YWxpemVkLlxuICBsZXQgc2NlbmVSZWFkeSA9IGZhbHNlXG4gIGxldCBwcm9maWxlQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZVN5c3RlbSgpIHtcbiAgICBpZiAoc2NlbmVSZWFkeSAmJiBwcm9maWxlQWRkcmVzcykge1xuICAgICAgcmV0dXJuIGVuZ2luZS5yZW1vdmVTeXN0ZW0ob2JzZXJ2YWJsZVN5c3RlbSlcbiAgICB9XG4gICAgaWYgKCFzY2VuZVJlYWR5KSB7XG4gICAgICBzY2VuZVJlYWR5ID0gdHJ1ZVxuICAgICAgb25TY2VuZVJlYWR5T2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoe30pXG4gICAgfVxuICAgIGlmIChwcm9maWxlQWRkcmVzcykgcmV0dXJuXG4gICAgcHJvZmlsZUFkZHJlc3MgPSBQbGF5ZXJJZGVudGl0eURhdGEuZ2V0T3JOdWxsKGVuZ2luZS5QbGF5ZXJFbnRpdHkpPy5hZGRyZXNzXG4gIH1cblxuICBlbmdpbmUuYWRkU3lzdGVtKG9ic2VydmFibGVTeXN0ZW0pXG5cbiAgcmV0dXJuIHsgc3Vic2NyaWJlIH1cbn1cbiJdfQ==
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvb2JzZXJ2YWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2xELE9BQU8sRUFDTCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUVsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLFNBQVMsRUFFVCxNQUFNLEVBQ1AsTUFBTSxVQUFVLENBQUE7QUFDakIsT0FBTyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRixPQUFPLE9BQU8sTUFBTSxXQUFXLENBQUE7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUErRmhFOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFNBQXdCO0lBQ2hELE9BQU8sR0FBRyxFQUFFO1FBQ1YsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ3pCLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDdkQ7YUFBTTtZQUNMLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtTQUMvQztJQUNILENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxVQUFVLENBQTBCLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUE7QUFDL0c7OzhNQUU4TTtBQUM5TSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQUE7QUFFbEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksVUFBVSxDQUEwQixnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFBO0FBRS9HOzs4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QWtDLENBQUE7SUFFdEMsU0FBUyxnQkFBZ0I7UUFDdkIsSUFBSSxVQUFVLElBQUksY0FBYyxFQUFFO1lBQ2hDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1NBQzdDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLFVBQVUsR0FBRyxJQUFJLENBQUE7WUFDakIsc0JBQXNCLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1NBQzNDO1FBQ0QsSUFBSSxjQUFjO1lBQUUsT0FBTTtRQUMxQixjQUFjLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxPQUFPLENBQUE7SUFDN0UsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUVsQyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUE7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICcuL2ludGVybmFsL09ic2VydmFibGUnXG5pbXBvcnQge1xuICBBdmF0YXJCYXNlLFxuICBBdmF0YXJFbW90ZUNvbW1hbmQsXG4gIEF2YXRhckVxdWlwcGVkRGF0YSxcbiAgRW50aXR5LFxuICBQbGF5ZXJJZGVudGl0eURhdGEsXG4gIFBvaW50ZXJFdmVudHNSZXN1bHQsXG4gIFJlYWxtSW5mbyxcbiAgVmVjdG9yM1R5cGUsXG4gIGVuZ2luZVxufSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IE1hbnlFbnRpdHlBY3Rpb24sIFNlbmRCYXRjaFJlc3BvbnNlLCBzdWJzY3JpYmUgfSBmcm9tICd+c3lzdGVtL0VuZ2luZUFwaSdcbmltcG9ydCBwbGF5ZXJzIGZyb20gJy4vcGxheWVycydcbmltcG9ydCB7IGxvY2FsZUNoYW5nZWRFdmVudHMgfSBmcm9tICcuL2ludGVybmFsL2xhbmd1YWdlLWV2ZW50cydcblxuLy8vIC0tLSBFVkVOVFMgLS0tXG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgdHlwZSBJRXZlbnROYW1lcyA9IGtleW9mIElFdmVudHNcblxuLyoqXG4gKiBAcHVibGljXG4gKiBOb3RlOiBEb24ndCB1c2UgYG9uYCBwcmVmaXggZm9yIElFdmVudHMgdG8gYXZvaWQgcmVkdW5kYW5jeSB3aXRoIGBldmVudC5vbihcIm9uRXZlbnROYW1lXCIpYCBzeW50YXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50cyB7XG4gIHBsYXllckV4cHJlc3Npb246IHtcbiAgICBleHByZXNzaW9uSWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBlbnRlcnMgdGhlIHNjZW5lXG4gICAqL1xuICBvbkVudGVyU2NlbmU6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhlIHNjZW5lXG4gICAqL1xuICBvbkxlYXZlU2NlbmU6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQgYWZ0ZXIgcmVjZWl2aW5nIGEgY29tbXMgbWVzc2FnZS5cbiAgICovXG4gIGNvbW1zOiB7XG4gICAgc2VuZGVyOiBzdHJpbmdcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiB0aGUgcGxheWVyIHN3aXRjaGVzIHRoZSBjbGllbnQgbGFuZ3VhZ2UuIGBsb2NhbGVgIGlzIGEgQkNQLTQ3IHRhZyAqL1xuICBsb2NhbGVDaGFuZ2VkOiB7XG4gICAgbG9jYWxlOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHRyaWdnZXJlZCBvbmNlIHRoZSBzY2VuZSBzaG91bGQgc3RhcnQuXG4gICAqL1xuICBzY2VuZVN0YXJ0OiB1bmtub3duXG5cbiAgLyoqIFRoaXMgaXMgdHJpZ2dlcmVkIGF0IGxlYXN0IGZvciBlYWNoIHZpZGVvU3RhdHVzIGNoYW5nZSAqL1xuICB2aWRlb0V2ZW50OiB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xuICAgIHZpZGVvQ2xpcElkOiBzdHJpbmdcbiAgICAvKiogU3RhdHVzLCBjYW4gYmUgTk9ORSA9IDAsIEVSUk9SID0gMSwgTE9BRElORyA9IDIsIFJFQURZID0gMywgUExBWUlORyA9IDQsQlVGRkVSSU5HID0gNSAqL1xuICAgIHZpZGVvU3RhdHVzOiBudW1iZXJcbiAgICAvKiogQ3VycmVudCBvZmZzZXQgcG9zaXRpb24gaW4gc2Vjb25kcyAqL1xuICAgIGN1cnJlbnRPZmZzZXQ6IG51bWJlclxuICAgIC8qKiBWaWRlbyBsZW5ndGggaW4gc2Vjb25kcy4gQ2FuIGJlIC0xICovXG4gICAgdG90YWxWaWRlb0xlbmd0aDogbnVtYmVyXG4gIH1cblxuICAvKiogVGhpcyBpcyB0cmlnZ2VyIGV2ZXJ5dGltZSBhIHByb2ZpbGUgaXMgY2hhbmdlZCAqL1xuICBwcm9maWxlQ2hhbmdlZDoge1xuICAgIGV0aEFkZHJlc3M6IHN0cmluZ1xuICAgIHZlcnNpb246IG51bWJlclxuICB9XG5cbiAgLyoqIFRyaWdnZXJlZCB3aGVuIHBlZXIncyBhdmF0YXIgaXMgY29ubmVjdGVkIGFuZCB2aXNpYmxlICovXG4gIHBsYXllckNvbm5lY3RlZDoge1xuICAgIHVzZXJJZDogc3RyaW5nXG4gIH1cblxuICAvKiogVHJpZ2dlcmVkIHdoZW4gcGVlciBkaXNjb25uZWN0IGFuZC9vciBpdCBhdmF0YXIgaXMgc2V0IGludmlzaWJsZSBieSBjb21tcyAqL1xuICBwbGF5ZXJEaXNjb25uZWN0ZWQ6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqIFRyaWdnZXJlZCB3aGVuIGN1cnJlbnQgcmVhbG0gb3IgaXNsYW5kIGNoYW5nZXMgKi9cbiAgb25SZWFsbUNoYW5nZWQ6IHtcbiAgICBkb21haW46IHN0cmluZ1xuICAgIHJvb206IHN0cmluZ1xuICAgIHNlcnZlck5hbWU6IHN0cmluZ1xuICAgIGRpc3BsYXlOYW1lOiBzdHJpbmdcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiBvdGhlciBwbGF5ZXIncyBhdmF0YXIgaXMgY2xpY2tlZCAqL1xuICBwbGF5ZXJDbGlja2VkOiB7XG4gICAgdXNlcklkOiBzdHJpbmdcbiAgICByYXk6IHtcbiAgICAgIG9yaWdpbjogVmVjdG9yM1R5cGVcbiAgICAgIGRpcmVjdGlvbjogVmVjdG9yM1R5cGVcbiAgICAgIGRpc3RhbmNlOiBudW1iZXJcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGEgY2FsbGJhY2sgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIE9ic2VydmFibGVcbiAqIGNvbnN0cnVjdG9yIHRvIHN1YnNjcmliZSB0byB0aGUgZXZlbnRzIG9mIHRoZSBEZWNlbnRyYWxhbmRJbnRlcmZhY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3Vic2NyaWJlcihldmVudE5hbWU6IGtleW9mIElFdmVudHMpIHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoZXZlbnROYW1lID09PSAnY29tbXMnKSB7XG4gICAgICBzdWJzY3JpYmUoeyBldmVudElkOiBldmVudE5hbWUgfSkuY2F0Y2goY29uc29sZS5lcnJvcilcbiAgICB9IGVsc2Uge1xuICAgICAgU0RLN0NvbXBvbmVudHNPYnNlcnZhYmxlPy5zdWJzY3JpYmUoZXZlbnROYW1lKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZXNlIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGFmdGVyIHlvdXIgY2hhcmFjdGVyIGVudGVycyB0aGUgc2NlbmUuXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25FbnRlclNjZW5lT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ29uRW50ZXJTY2VuZSddPihjcmVhdGVTdWJzY3JpYmVyKCdvbkVudGVyU2NlbmUnKSlcbi8qKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC4gVXNlIG9uRW50ZXJTY2VuZU9ic2VydmFibGUgaW5zdGVhZC4gKi9cbmV4cG9ydCBjb25zdCBvbkVudGVyU2NlbmUgPSBvbkVudGVyU2NlbmVPYnNlcnZhYmxlXG5cbi8qKlxuICogVGhlc2UgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgYWZ0ZXIgeW91ciBjaGFyYWN0ZXIgbGVhdmVzIHRoZSBzY2VuZS5cbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvbkxlYXZlU2NlbmVPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snb25MZWF2ZVNjZW5lJ10+KGNyZWF0ZVN1YnNjcmliZXIoJ29uTGVhdmVTY2VuZScpKVxuXG4vKiogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuIFVzZSBvbkxlYXZlU2NlbmVPYnNlcnZhYmxlIGluc3RlYWQuICovXG5leHBvcnQgY29uc3Qgb25MZWF2ZVNjZW5lID0gb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZVxuXG4vKipcbiAqIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIGFmdGVyIGFsbCB0aGUgcmVzb3VyY2VzIG9mIHRoZSBzY2VuZSB3ZXJlIGxvYWRlZCAobW9kZWxzLCB0ZXh0dXJlcywgZXRjLi4uKVxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uU2NlbmVSZWFkeU9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydzY2VuZVN0YXJ0J10+KGNyZWF0ZVN1YnNjcmliZXIoJ3NjZW5lU3RhcnQnKSlcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25QbGF5ZXJFeHByZXNzaW9uT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3BsYXllckV4cHJlc3Npb24nXT4oXG4gIGNyZWF0ZVN1YnNjcmliZXIoJ3BsYXllckV4cHJlc3Npb24nKVxuKVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblZpZGVvRXZlbnQgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWyd2aWRlb0V2ZW50J10+KGNyZWF0ZVN1YnNjcmliZXIoJ3ZpZGVvRXZlbnQnKSlcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25Qcm9maWxlQ2hhbmdlZCA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3Byb2ZpbGVDaGFuZ2VkJ10+KGNyZWF0ZVN1YnNjcmliZXIoJ3Byb2ZpbGVDaGFuZ2VkJykpXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUGxheWVyQ29ubmVjdGVkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3BsYXllckNvbm5lY3RlZCddPihcbiAgY3JlYXRlU3Vic2NyaWJlcigncGxheWVyQ29ubmVjdGVkJylcbilcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25QbGF5ZXJEaXNjb25uZWN0ZWRPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1sncGxheWVyRGlzY29ubmVjdGVkJ10+KFxuICBjcmVhdGVTdWJzY3JpYmVyKCdwbGF5ZXJEaXNjb25uZWN0ZWQnKVxuKVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblJlYWxtQ2hhbmdlZE9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydvblJlYWxtQ2hhbmdlZCddPihjcmVhdGVTdWJzY3JpYmVyKCdvblJlYWxtQ2hhbmdlZCcpKVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblBsYXllckNsaWNrZWRPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1sncGxheWVyQ2xpY2tlZCddPihjcmVhdGVTdWJzY3JpYmVyKCdwbGF5ZXJDbGlja2VkJykpXG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25Db21tc01lc3NhZ2UgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydjb21tcyddPihjcmVhdGVTdWJzY3JpYmVyKCdjb21tcycpKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGRlcHJlY2F0ZWQgdGhpcyBpcyBhbiBPTEQgQVBJLlxuICogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBTREs2IHNlbmRCYXRjaCB0byBwb2xsIGV2ZW50cyBmcm9tIHRoZSByZW5kZXJlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9sbEV2ZW50cyhzZW5kQmF0Y2g6IChib2R5OiBNYW55RW50aXR5QWN0aW9uKSA9PiBQcm9taXNlPFNlbmRCYXRjaFJlc3BvbnNlPikge1xuICBjb25zdCB7IGV2ZW50cyB9ID0gYXdhaXQgc2VuZEJhdGNoKHsgYWN0aW9uczogW10gfSlcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmdlbmVyaWMpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGUuZ2VuZXJpYy5ldmVudERhdGEpXG4gICAgICBzd2l0Y2ggKGUuZ2VuZXJpYy5ldmVudElkKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1zJzoge1xuICAgICAgICAgIG9uQ29tbXNNZXNzYWdlLm5vdGlmeU9ic2VydmVycyhkYXRhIGFzIElFdmVudHNbJ2NvbW1zJ10pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdsb2NhbGVDaGFuZ2VkJzoge1xuICAgICAgICAgIGxvY2FsZUNoYW5nZWRFdmVudHMubm90aWZ5T2JzZXJ2ZXJzKGRhdGEgYXMgSUV2ZW50c1snbG9jYWxlQ2hhbmdlZCddKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgU0RLN0NvbXBvbmVudHNPYnNlcnZhYmxlID0gcHJvY2Vzc09ic2VydmFibGVzKClcbmZ1bmN0aW9uIHByb2Nlc3NPYnNlcnZhYmxlcygpIHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQ8a2V5b2YgSUV2ZW50cz4oKVxuXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShldmVudE5hbWU6IGtleW9mIElFdmVudHMpIHtcbiAgICBpZiAoc3Vic2NyaXB0aW9ucy5oYXMoZXZlbnROYW1lKSkgcmV0dXJuXG4gICAgc3dpdGNoIChldmVudE5hbWUpIHtcbiAgICAgIGNhc2UgJ3BsYXllckNsaWNrZWQnOiB7XG4gICAgICAgIHN1YnNjcmliZVBsYXllckNsaWNrKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29uRW50ZXJTY2VuZSc6XG4gICAgICBjYXNlICdwbGF5ZXJDb25uZWN0ZWQnOiB7XG4gICAgICAgIHN1YnNjcmliZUVudGVyU2NlbmUoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnb25MZWF2ZVNjZW5lJzpcbiAgICAgIGNhc2UgJ3BsYXllckRpc2Nvbm5lY3RlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlTGVhdmVTY2VuZSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdvblJlYWxtQ2hhbmdlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlUmVhbG1DaGFuZ2UoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAncGxheWVyRXhwcmVzc2lvbic6IHtcbiAgICAgICAgc3Vic2NyaWJlUGxheWVyRXhwcmVzc2lvbigpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdwcm9maWxlQ2hhbmdlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlUHJvZmlsZUNoYW5nZSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIHN1YnNjcmlwdGlvbnMuYWRkKGV2ZW50TmFtZSlcbiAgfVxuICAvKipcbiAgICogUExBWUVSIEVOVEVSL0NPTk5FQ1RFRCBvYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmVFbnRlclNjZW5lKCkge1xuICAgIHBsYXllcnMub25FbnRlclNjZW5lKChwbGF5ZXIpID0+IHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb25zLmhhcygnb25FbnRlclNjZW5lJykpIHtcbiAgICAgICAgb25FbnRlclNjZW5lT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyB1c2VySWQ6IHBsYXllci51c2VySWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHN1YnNjcmlwdGlvbnMuaGFzKCdwbGF5ZXJDb25uZWN0ZWQnKSkge1xuICAgICAgICBvblBsYXllckNvbm5lY3RlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHsgdXNlcklkOiBwbGF5ZXIudXNlcklkIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvKipcbiAgICogUExBWUVSIExFQVZFL0RJU0NPTk5FQ1RFRCBvYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmVMZWF2ZVNjZW5lKCkge1xuICAgIHBsYXllcnMub25MZWF2ZVNjZW5lKCh1c2VySWQpID0+IHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb25zLmhhcygnb25MZWF2ZVNjZW5lJykpIHtcbiAgICAgICAgb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyB1c2VySWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHN1YnNjcmlwdGlvbnMuaGFzKCdwbGF5ZXJEaXNjb25uZWN0ZWQnKSkge1xuICAgICAgICBvblBsYXllckRpc2Nvbm5lY3RlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHsgdXNlcklkIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvKipcbiAgICogUkVBTE0gQ0hBTkdFIG9ic2VydmFibGVcbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZVJlYWxtQ2hhbmdlKCkge1xuICAgIFJlYWxtSW5mby5vbkNoYW5nZShlbmdpbmUuUm9vdEVudGl0eSwgKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgb25SZWFsbUNoYW5nZWRPYnNlcnZhYmxlLm5vdGlmeU9ic2VydmVycyh7XG4gICAgICAgICAgZG9tYWluOiB2YWx1ZS5iYXNlVXJsLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiB2YWx1ZS5yZWFsbU5hbWUsXG4gICAgICAgICAgcm9vbTogdmFsdWUucm9vbSA/PyAnJyxcbiAgICAgICAgICBzZXJ2ZXJOYW1lOiB2YWx1ZS5yZWFsbU5hbWVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIC8qKlxuICAgKiBQTEFZRVIvQVZBVEFSIENMSUNLRUQgb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlUGxheWVyQ2xpY2soKSB7XG4gICAgY29uc3QgcGxheWVyRW50aXRpZXMgPSBuZXcgU2V0PEVudGl0eT4oKVxuICAgIGVuZ2luZS5hZGRTeXN0ZW0oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBbZW50aXR5XSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBsYXllcklkZW50aXR5RGF0YSkpIHtcbiAgICAgICAgaWYgKHBsYXllckVudGl0aWVzLmhhcyhlbnRpdHkpKSBjb250aW51ZVxuICAgICAgICBwbGF5ZXJFbnRpdGllcy5hZGQoZW50aXR5KVxuXG4gICAgICAgIFBvaW50ZXJFdmVudHNSZXN1bHQub25DaGFuZ2UoZW50aXR5LCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhPy5oaXQpIHtcbiAgICAgICAgICAgIG9uUGxheWVyQ2xpY2tlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgdXNlcklkOiBQbGF5ZXJJZGVudGl0eURhdGEuZ2V0T3JOdWxsKGVudGl0eSk/LmFkZHJlc3MgPz8gJycsXG4gICAgICAgICAgICAgIHJheToge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogZGF0YS5oaXQuZGlyZWN0aW9uISxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogZGF0YS5oaXQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogZGF0YS5oaXQuZ2xvYmFsT3JpZ2luIVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBsYXllciBleHByZXNzaW9uIG9ic2VydmFibGVcbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZVBsYXllckV4cHJlc3Npb24oKSB7XG4gICAgQXZhdGFyRW1vdGVDb21tYW5kLm9uQ2hhbmdlKGVuZ2luZS5QbGF5ZXJFbnRpdHksICh2YWx1ZSkgPT4ge1xuICAgICAgb25QbGF5ZXJFeHByZXNzaW9uT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyBleHByZXNzaW9uSWQ6IHZhbHVlPy5lbW90ZVVybiA/PyAnJyB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUFJPRklMRSBDSEFOR0Ugb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlUHJvZmlsZUNoYW5nZSgpIHtcbiAgICBBdmF0YXJCYXNlLm9uQ2hhbmdlKGVuZ2luZS5QbGF5ZXJFbnRpdHksICgpID0+IHtcbiAgICAgIGlmICghcHJvZmlsZUFkZHJlc3MpIHJldHVyblxuICAgICAgb25Qcm9maWxlQ2hhbmdlZC5ub3RpZnlPYnNlcnZlcnMoeyBldGhBZGRyZXNzOiBwcm9maWxlQWRkcmVzcywgdmVyc2lvbjogMCB9KVxuICAgIH0pXG5cbiAgICBBdmF0YXJFcXVpcHBlZERhdGEub25DaGFuZ2UoZW5naW5lLlBsYXllckVudGl0eSwgKCkgPT4ge1xuICAgICAgaWYgKCFwcm9maWxlQWRkcmVzcykgcmV0dXJuXG4gICAgICBvblByb2ZpbGVDaGFuZ2VkLm5vdGlmeU9ic2VydmVycyh7IGV0aEFkZHJlc3M6IHByb2ZpbGVBZGRyZXNzLCB2ZXJzaW9uOiAwIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8vIEZsYWcgdG8gY2FsbCBvbmNlIHRoZSBzY2VuZSBpcyBpbml0YWxpemVkLlxuICBsZXQgc2NlbmVSZWFkeSA9IGZhbHNlXG4gIGxldCBwcm9maWxlQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZVN5c3RlbSgpIHtcbiAgICBpZiAoc2NlbmVSZWFkeSAmJiBwcm9maWxlQWRkcmVzcykge1xuICAgICAgcmV0dXJuIGVuZ2luZS5yZW1vdmVTeXN0ZW0ob2JzZXJ2YWJsZVN5c3RlbSlcbiAgICB9XG4gICAgaWYgKCFzY2VuZVJlYWR5KSB7XG4gICAgICBzY2VuZVJlYWR5ID0gdHJ1ZVxuICAgICAgb25TY2VuZVJlYWR5T2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoe30pXG4gICAgfVxuICAgIGlmIChwcm9maWxlQWRkcmVzcykgcmV0dXJuXG4gICAgcHJvZmlsZUFkZHJlc3MgPSBQbGF5ZXJJZGVudGl0eURhdGEuZ2V0T3JOdWxsKGVuZ2luZS5QbGF5ZXJFbnRpdHkpPy5hZGRyZXNzXG4gIH1cblxuICBlbmdpbmUuYWRkU3lzdGVtKG9ic2VydmFibGVTeXN0ZW0pXG5cbiAgcmV0dXJuIHsgc3Vic2NyaWJlIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@dcl/sdk",
3
3
  "description": "",
4
- "version": "7.29.1-35901015152.commit-d1b7b96",
4
+ "version": "7.29.1-35917671376.commit-046b268",
5
5
  "author": "Decentraland",
6
6
  "dependencies": {
7
- "@dcl/ecs": "7.29.1-35901015152.commit-d1b7b96",
7
+ "@dcl/ecs": "7.29.1-35917671376.commit-046b268",
8
8
  "@dcl/ecs-math": "2.1.0",
9
- "@dcl/js-runtime": "7.29.1-35901015152.commit-d1b7b96",
10
- "@dcl/react-ecs": "7.29.1-35901015152.commit-d1b7b96",
11
- "@dcl/sdk-commands": "7.29.1-35901015152.commit-d1b7b96"
9
+ "@dcl/js-runtime": "7.29.1-35917671376.commit-046b268",
10
+ "@dcl/react-ecs": "7.29.1-35917671376.commit-046b268",
11
+ "@dcl/sdk-commands": "7.29.1-35917671376.commit-046b268"
12
12
  },
13
13
  "keywords": [],
14
14
  "license": "Apache-2.0",
@@ -33,5 +33,5 @@
33
33
  },
34
34
  "types": "./index.d.ts",
35
35
  "typings": "./index.d.ts",
36
- "commit": "d1b7b964cd184465c1b65118e47b5dc6be68a184"
36
+ "commit": "046b268beee66a9d2d67dda7834087a8052f4f9c"
37
37
  }
@@ -1,5 +1,21 @@
1
+ import { Observable } from '../internal/Observable';
1
2
  export type Platform = 'mobile' | 'desktop' | 'web';
3
+ /**
4
+ * Triggered when the player switches the client language mid-session.
5
+ * Older clients never emit it.
6
+ * @public
7
+ */
8
+ export declare const onPlayerLanguageChanged: Observable<{
9
+ language: string;
10
+ }>;
2
11
  export declare function getPlatform(): Platform | null;
3
12
  export declare function isMobile(): boolean;
4
13
  export declare function isDesktop(): boolean;
5
14
  export declare function isWeb(): boolean;
15
+ /**
16
+ * Player's client language as a BCP-47 tag (e.g. `'es'`, `'pt-BR'`).
17
+ * Returns `'en'` until the explorer responds, and on clients that don't report a locale.
18
+ * Use `onPlayerLanguageChanged` to react to mid-session changes.
19
+ * @public
20
+ */
21
+ export declare function getPlayerLanguage(): string;