@angular-devkit/core 7.2.0-beta.1 → 7.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/node/_golden-api.d.ts +12 -0
  2. package/node/_golden-api.js +24 -0
  3. package/node/experimental/index.d.ts +9 -0
  4. package/node/experimental/index.js +12 -0
  5. package/node/experimental/job-registry.d.ts +22 -0
  6. package/node/experimental/job-registry.js +70 -0
  7. package/node/fs.d.ts +2 -4
  8. package/node/fs.js +25 -28
  9. package/node/index.d.ts +3 -1
  10. package/node/index.js +5 -2
  11. package/node/resolve.js +4 -4
  12. package/package.json +2 -2
  13. package/src/exception/exception.d.ts +1 -1
  14. package/src/exception/exception.js +2 -2
  15. package/src/experimental/jobs/README.md +495 -0
  16. package/src/experimental/jobs/api.d.ts +345 -0
  17. package/src/experimental/jobs/api.js +68 -0
  18. package/src/experimental/jobs/architecture.md +257 -0
  19. package/src/experimental/jobs/create-job-handler.d.ts +50 -0
  20. package/src/experimental/jobs/create-job-handler.js +145 -0
  21. package/src/experimental/jobs/dispatcher.d.ts +32 -0
  22. package/src/experimental/jobs/dispatcher.js +42 -0
  23. package/src/experimental/jobs/exception.d.ts +15 -0
  24. package/src/experimental/jobs/exception.js +23 -0
  25. package/src/experimental/jobs/index.d.ts +14 -0
  26. package/src/experimental/jobs/index.js +20 -0
  27. package/src/experimental/jobs/simple-registry.d.ts +44 -0
  28. package/src/experimental/jobs/simple-registry.js +74 -0
  29. package/src/experimental/jobs/simple-scheduler.d.ts +74 -0
  30. package/src/experimental/jobs/simple-scheduler.js +367 -0
  31. package/src/experimental/jobs/strategy.d.ts +15 -0
  32. package/src/experimental/jobs/strategy.js +55 -0
  33. package/src/experimental.d.ts +2 -1
  34. package/src/experimental.js +3 -1
  35. package/src/json/schema/index.d.ts +1 -0
  36. package/src/json/schema/index.js +2 -1
  37. package/src/json/schema/registry.d.ts +2 -1
  38. package/src/json/schema/registry.js +10 -1
  39. package/src/json/schema/schema.d.ts +15 -0
  40. package/src/json/schema/schema.js +52 -0
  41. package/src/json/schema/utility.d.ts +2 -9
  42. package/src/json/schema/utility.js +1 -1
  43. package/src/json/schema/visitor.d.ts +2 -1
  44. package/src/json/schema/visitor.js +5 -1
  45. package/src/logger/logger.d.ts +1 -0
  46. package/src/logger/logger.js +4 -1
  47. package/src/utils/index.d.ts +9 -0
  48. package/src/utils/index.js +1 -1
@@ -0,0 +1,345 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google Inc. All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { Observable, Observer } from 'rxjs';
9
+ import { JsonObject, JsonValue, schema } from '../../json/index';
10
+ import { LogEntry, LoggerApi } from '../../logger/index';
11
+ import { DeepReadonly } from '../../utils/index';
12
+ /**
13
+ * A job name is just a string (needs to be serializable).
14
+ */
15
+ export declare type JobName = string;
16
+ /**
17
+ * The job handler function, which is a method that's executed for the job.
18
+ */
19
+ export interface JobHandler<ArgT extends JsonValue, InputT extends JsonValue, OutputT extends JsonValue> {
20
+ (argument: ArgT, context: JobHandlerContext<ArgT, InputT, OutputT>): Observable<JobOutboundMessage<OutputT>>;
21
+ jobDescription: Partial<JobDescription>;
22
+ }
23
+ /**
24
+ * The context in which the job is run.
25
+ */
26
+ export interface JobHandlerContext<MinimumArgumentValueT extends JsonValue = JsonValue, MinimumInputValueT extends JsonValue = JsonValue, MinimumOutputValueT extends JsonValue = JsonValue> {
27
+ readonly description: JobDescription;
28
+ readonly scheduler: Scheduler<MinimumArgumentValueT, MinimumInputValueT, MinimumOutputValueT>;
29
+ readonly dependencies: Job<JsonValue, JsonValue, JsonValue>[];
30
+ readonly inboundBus: Observable<JobInboundMessage<MinimumInputValueT>>;
31
+ }
32
+ /**
33
+ * Metadata associated with a job.
34
+ */
35
+ export interface JobDescription extends JsonObject {
36
+ readonly name: JobName;
37
+ readonly argument: DeepReadonly<schema.JsonSchema>;
38
+ readonly input: DeepReadonly<schema.JsonSchema>;
39
+ readonly output: DeepReadonly<schema.JsonSchema>;
40
+ }
41
+ /**
42
+ * Messages that can be sent TO a job. The job needs to listen to those.
43
+ */
44
+ export declare enum JobInboundMessageKind {
45
+ Ping = "ip",
46
+ Stop = "is",
47
+ Input = "in"
48
+ }
49
+ /** Base interface for the all job inbound messages. */
50
+ export interface JobInboundMessageBase extends JsonObject {
51
+ /**
52
+ * The kind of message this is.
53
+ */
54
+ readonly kind: JobInboundMessageKind;
55
+ }
56
+ /**
57
+ * A ping to the job. The job should reply with a pong as soon as possible.
58
+ */
59
+ export interface JobInboundMessagePing extends JobInboundMessageBase {
60
+ readonly kind: JobInboundMessageKind.Ping;
61
+ /**
62
+ * An ID that should be returned in the corresponding Pong.
63
+ */
64
+ readonly id: number;
65
+ }
66
+ /**
67
+ * Stop the job. This is handled by the job itself and jobs might not handle it. It will also
68
+ * unsubscribe from the Observable<>.
69
+ * This is equivalent to SIGTERM.
70
+ */
71
+ export interface JobInboundMessageStop extends JobInboundMessageBase {
72
+ readonly kind: JobInboundMessageKind.Stop;
73
+ }
74
+ /**
75
+ * A Job wants to send a message to a channel. This can be marshaled, and the Job object
76
+ * has helpers to transform this into an observable. The context also can create RxJS subjects that
77
+ * marshall messages through a channel.
78
+ */
79
+ export interface JobInboundMessageInput<InputT extends JsonValue> extends JobInboundMessageBase {
80
+ readonly kind: JobInboundMessageKind.Input;
81
+ /**
82
+ * The input being sent to the job.
83
+ */
84
+ readonly value: InputT;
85
+ }
86
+ export declare type JobInboundMessage<InputT extends JsonValue> = JobInboundMessagePing | JobInboundMessageStop | JobInboundMessageInput<InputT>;
87
+ /**
88
+ * Kind of messages that can be outputted from a job.
89
+ */
90
+ export declare enum JobOutboundMessageKind {
91
+ OnReady = "c",
92
+ Start = "s",
93
+ End = "e",
94
+ Pong = "p",
95
+ Log = "l",
96
+ Output = "o",
97
+ ChannelCreate = "cn",
98
+ ChannelMessage = "cm",
99
+ ChannelError = "ce",
100
+ ChannelComplete = "cc"
101
+ }
102
+ /** Base interface for the all job messages. */
103
+ export interface JobOutboundMessageBase {
104
+ /**
105
+ * The job description.
106
+ */
107
+ readonly description: JobDescription;
108
+ /**
109
+ * The kind of message this is.
110
+ */
111
+ readonly kind: JobOutboundMessageKind;
112
+ }
113
+ /**
114
+ * The job has been created and will validate its input.
115
+ */
116
+ export interface JobOutboundMessageOnReady extends JobOutboundMessageBase {
117
+ readonly kind: JobOutboundMessageKind.OnReady;
118
+ }
119
+ /**
120
+ * The job started. This is done by the job itself.
121
+ */
122
+ export interface JobOutboundMessageStart extends JobOutboundMessageBase {
123
+ readonly kind: JobOutboundMessageKind.Start;
124
+ }
125
+ /**
126
+ * A logging message, supporting the logging.LogEntry.
127
+ */
128
+ export interface JobOutboundMessageLog extends JobOutboundMessageBase {
129
+ readonly kind: JobOutboundMessageKind.Log;
130
+ readonly entry: LogEntry;
131
+ }
132
+ /**
133
+ * An output value is available.
134
+ */
135
+ export interface JobOutboundMessageOutput<OutputT extends JsonValue> extends JobOutboundMessageBase {
136
+ readonly kind: JobOutboundMessageKind.Output;
137
+ /**
138
+ * The message being outputted from the job.
139
+ */
140
+ readonly value: OutputT;
141
+ }
142
+ /**
143
+ * Base interface for all job message related to channels.
144
+ */
145
+ export interface JobOutboundMessageChannelBase extends JobOutboundMessageBase {
146
+ /**
147
+ * The name of the channel.
148
+ */
149
+ readonly name: string;
150
+ }
151
+ /**
152
+ * A job wants to send a message to a channel. This can be marshaled, and the Job object
153
+ * has helpers to transform this into an observable. The context also can create RxJS subjects that
154
+ * marshall messages through a channel.
155
+ */
156
+ export interface JobOutboundMessageChannelMessage extends JobOutboundMessageChannelBase {
157
+ readonly kind: JobOutboundMessageKind.ChannelMessage;
158
+ /**
159
+ * The message being sent to the channel.
160
+ */
161
+ readonly message: JsonValue;
162
+ }
163
+ /**
164
+ * A job wants to send an error to one of its channel. This is the equivalent of throwing through
165
+ * an Observable. The side channel will not receive any more messages after this, and will not
166
+ * complete.
167
+ */
168
+ export interface JobOutboundMessageChannelError extends JobOutboundMessageChannelBase {
169
+ readonly kind: JobOutboundMessageKind.ChannelError;
170
+ /**
171
+ * The error message being sent to the channel.
172
+ */
173
+ readonly error: JsonValue;
174
+ }
175
+ /**
176
+ * A job wants to create a new channel.
177
+ */
178
+ export interface JobOutboundMessageChannelCreate extends JobOutboundMessageChannelBase {
179
+ readonly kind: JobOutboundMessageKind.ChannelCreate;
180
+ }
181
+ /**
182
+ * A job wants to close the channel, as completed. This is done automatically when the job ends,
183
+ * or can be done from the job to close it. A closed channel might be reopened, but the user
184
+ * need to recall getChannel().
185
+ */
186
+ export interface JobOutboundMessageChannelComplete extends JobOutboundMessageChannelBase {
187
+ readonly kind: JobOutboundMessageKind.ChannelComplete;
188
+ }
189
+ /**
190
+ * OnEnd of the job run.
191
+ */
192
+ export interface JobOutboundMessageEnd extends JobOutboundMessageBase {
193
+ readonly kind: JobOutboundMessageKind.End;
194
+ }
195
+ /**
196
+ * A pong response from a ping input. The id is the same as the one passed in.
197
+ */
198
+ export interface JobOutboundMessagePong extends JobOutboundMessageBase {
199
+ readonly kind: JobOutboundMessageKind.Pong;
200
+ /**
201
+ * The ID that was passed in the `Ping` messages.
202
+ */
203
+ readonly id: number;
204
+ }
205
+ /**
206
+ * Generic message type.
207
+ */
208
+ export declare type JobOutboundMessage<OutputT extends JsonValue> = JobOutboundMessageOnReady | JobOutboundMessageStart | JobOutboundMessageLog | JobOutboundMessageOutput<OutputT> | JobOutboundMessageChannelCreate | JobOutboundMessageChannelMessage | JobOutboundMessageChannelError | JobOutboundMessageChannelComplete | JobOutboundMessageEnd | JobOutboundMessagePong;
209
+ /**
210
+ * The state of a job. These are changed as the job reports a new state through its messages.
211
+ */
212
+ export declare enum JobState {
213
+ /**
214
+ * The job was queued and is waiting to start.
215
+ */
216
+ Queued = "queued",
217
+ /**
218
+ * The job description was found, its dependencies (see "Synchronizing and Dependencies")
219
+ * are done running, and the job's argument is validated and the job's code will be executed.
220
+ */
221
+ Ready = "ready",
222
+ /**
223
+ * The job has been started. The job implementation is expected to send this as soon as its
224
+ * work is starting.
225
+ */
226
+ Started = "started",
227
+ /**
228
+ * The job has ended and is done running.
229
+ */
230
+ Ended = "ended",
231
+ /**
232
+ * An error occured and the job stopped because of internal state.
233
+ */
234
+ Errored = "errored"
235
+ }
236
+ /**
237
+ * A Job instance, returned from scheduling a job. A Job instance is _not_ serializable.
238
+ */
239
+ export interface Job<ArgumentT extends JsonValue = JsonValue, InputT extends JsonValue = JsonValue, OutputT extends JsonValue = JsonValue> {
240
+ /**
241
+ * Description of the job. Resolving the job's description can be done asynchronously, so this
242
+ * is an observable that will resolve when it's ready.
243
+ */
244
+ readonly description: Observable<JobDescription>;
245
+ /**
246
+ * Argument sent when scheduling the job. This is a copy of the argument.
247
+ */
248
+ readonly argument: ArgumentT;
249
+ /**
250
+ * The input to the job. This goes through the input channel as messages.
251
+ */
252
+ readonly input: Observer<InputT>;
253
+ /**
254
+ * Outputs of this job.
255
+ */
256
+ readonly output: Observable<OutputT>;
257
+ /**
258
+ * The current state of the job.
259
+ */
260
+ readonly state: JobState;
261
+ /**
262
+ * Get a channel that validates against the schema. Messages will be filtered by the schema.
263
+ * @param name The name of the channel.
264
+ * @param schema A schema to use to validate messages.
265
+ */
266
+ getChannel<T extends JsonValue>(name: string, schema?: schema.JsonSchema): Observable<T>;
267
+ /**
268
+ * Pings the job and wait for the resulting Pong before completing.
269
+ */
270
+ ping(): Observable<never>;
271
+ /**
272
+ * Stops the job from running. This is different than unsubscribing from the output as in it
273
+ * sends the JobInboundMessageKind.Stop raw input to the job.
274
+ */
275
+ stop(): void;
276
+ /**
277
+ * The JobInboundMessage messages TO the job.
278
+ */
279
+ readonly inboundBus: Observer<JobInboundMessage<InputT>>;
280
+ /**
281
+ * The JobOutboundMessage FROM the job.
282
+ */
283
+ readonly outboundBus: Observable<JobOutboundMessage<OutputT>>;
284
+ }
285
+ /**
286
+ * Options for scheduling jobs.
287
+ */
288
+ export interface ScheduleJobOptions {
289
+ /**
290
+ * Where should logging be passed in. By default logging will be dropped.
291
+ */
292
+ logger?: LoggerApi;
293
+ /**
294
+ * Jobs that need to finish before scheduling this job. These dependencies will be passed
295
+ * to the job itself in its context.
296
+ */
297
+ dependencies?: Job | Job[];
298
+ }
299
+ export interface Registry<MinimumArgumentValueT extends JsonValue = JsonValue, MinimumInputValueT extends JsonValue = JsonValue, MinimumOutputValueT extends JsonValue = JsonValue> {
300
+ /**
301
+ * Get a job handler.
302
+ * @param name The name of the job to get a handler from.
303
+ */
304
+ get<A extends MinimumArgumentValueT, I extends MinimumInputValueT, O extends MinimumOutputValueT>(name: JobName): Observable<JobHandler<A, I, O> | null>;
305
+ }
306
+ /**
307
+ * An interface that can schedule jobs.
308
+ */
309
+ export interface Scheduler<MinimumArgumentValueT extends JsonValue = JsonValue, MinimumInputValueT extends JsonValue = JsonValue, MinimumOutputValueT extends JsonValue = JsonValue> {
310
+ /**
311
+ * Get a job description for a named job.
312
+ *
313
+ * @param name The name of the job.
314
+ * @returns A description, or null if no description is available for this job.
315
+ */
316
+ getDescription(name: JobName): Observable<JobDescription | null>;
317
+ /**
318
+ * Returns true if the job name has been registered.
319
+ * @param name The name of the job.
320
+ * @returns True if the job exists, false otherwise.
321
+ */
322
+ has(name: JobName): Observable<boolean>;
323
+ /**
324
+ * Pause the scheduler, temporary queueing _new_ jobs. Returns a resume function that should be
325
+ * used to resume execution. If multiple `pause()` were called, all their resume functions must
326
+ * be called before the Scheduler actually starts new jobs. Additional calls to the same resume
327
+ * function will have no effect.
328
+ *
329
+ * Jobs already running are NOT paused. This is pausing the scheduler only.
330
+ *
331
+ * @returns A function that can be run to resume the scheduler. If multiple `pause()` calls
332
+ * were made, all their return function must be called (in any order) before the
333
+ * scheduler can resume.
334
+ */
335
+ pause(): () => void;
336
+ /**
337
+ * Schedule a job to be run, using its name.
338
+ * @param name The name of job to be run.
339
+ * @param argument The argument to send to the job when starting it.
340
+ * @param options Scheduling options.
341
+ * @returns The job being run.
342
+ */
343
+ schedule<A extends MinimumArgumentValueT, I extends MinimumInputValueT, O extends MinimumOutputValueT>(name: JobName, argument: A, options?: ScheduleJobOptions): Job<A, I, O>;
344
+ }
345
+ export declare function isJobHandler<A extends JsonValue, I extends JsonValue, O extends JsonValue>(value: any): value is JobHandler<A, I, O>;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Messages that can be sent TO a job. The job needs to listen to those.
5
+ */
6
+ var JobInboundMessageKind;
7
+ (function (JobInboundMessageKind) {
8
+ JobInboundMessageKind["Ping"] = "ip";
9
+ JobInboundMessageKind["Stop"] = "is";
10
+ // Channel specific messages.
11
+ JobInboundMessageKind["Input"] = "in";
12
+ // Input channel does not allow completion / error. Erroring this will just close the Subject
13
+ // but not notify the job.
14
+ })(JobInboundMessageKind = exports.JobInboundMessageKind || (exports.JobInboundMessageKind = {}));
15
+ /**
16
+ * Kind of messages that can be outputted from a job.
17
+ */
18
+ var JobOutboundMessageKind;
19
+ (function (JobOutboundMessageKind) {
20
+ // Lifecycle specific messages.
21
+ JobOutboundMessageKind["OnReady"] = "c";
22
+ JobOutboundMessageKind["Start"] = "s";
23
+ JobOutboundMessageKind["End"] = "e";
24
+ JobOutboundMessageKind["Pong"] = "p";
25
+ // Feedback messages.
26
+ JobOutboundMessageKind["Log"] = "l";
27
+ JobOutboundMessageKind["Output"] = "o";
28
+ // Channel specific messages.
29
+ JobOutboundMessageKind["ChannelCreate"] = "cn";
30
+ JobOutboundMessageKind["ChannelMessage"] = "cm";
31
+ JobOutboundMessageKind["ChannelError"] = "ce";
32
+ JobOutboundMessageKind["ChannelComplete"] = "cc";
33
+ })(JobOutboundMessageKind = exports.JobOutboundMessageKind || (exports.JobOutboundMessageKind = {}));
34
+ /**
35
+ * The state of a job. These are changed as the job reports a new state through its messages.
36
+ */
37
+ var JobState;
38
+ (function (JobState) {
39
+ /**
40
+ * The job was queued and is waiting to start.
41
+ */
42
+ JobState["Queued"] = "queued";
43
+ /**
44
+ * The job description was found, its dependencies (see "Synchronizing and Dependencies")
45
+ * are done running, and the job's argument is validated and the job's code will be executed.
46
+ */
47
+ JobState["Ready"] = "ready";
48
+ /**
49
+ * The job has been started. The job implementation is expected to send this as soon as its
50
+ * work is starting.
51
+ */
52
+ JobState["Started"] = "started";
53
+ /**
54
+ * The job has ended and is done running.
55
+ */
56
+ JobState["Ended"] = "ended";
57
+ /**
58
+ * An error occured and the job stopped because of internal state.
59
+ */
60
+ JobState["Errored"] = "errored";
61
+ })(JobState = exports.JobState || (exports.JobState = {}));
62
+ function isJobHandler(value) {
63
+ return typeof value == 'function'
64
+ && typeof value.jobDescription == 'object'
65
+ && value.jobDescription !== null;
66
+ }
67
+ exports.isJobHandler = isJobHandler;
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJwYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9jb3JlL3NyYy9leHBlcmltZW50YWwvam9icy9hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnRUE7O0dBRUc7QUFDSCxJQUFZLHFCQVFYO0FBUkQsV0FBWSxxQkFBcUI7SUFDL0Isb0NBQVcsQ0FBQTtJQUNYLG9DQUFXLENBQUE7SUFFWCw2QkFBNkI7SUFDN0IscUNBQVksQ0FBQTtJQUNaLDZGQUE2RjtJQUM3RiwwQkFBMEI7QUFDNUIsQ0FBQyxFQVJXLHFCQUFxQixHQUFyQiw2QkFBcUIsS0FBckIsNkJBQXFCLFFBUWhDO0FBbUREOztHQUVHO0FBQ0gsSUFBWSxzQkFnQlg7QUFoQkQsV0FBWSxzQkFBc0I7SUFDaEMsK0JBQStCO0lBQy9CLHVDQUFhLENBQUE7SUFDYixxQ0FBVyxDQUFBO0lBQ1gsbUNBQVMsQ0FBQTtJQUNULG9DQUFVLENBQUE7SUFFVixxQkFBcUI7SUFDckIsbUNBQVMsQ0FBQTtJQUNULHNDQUFZLENBQUE7SUFFWiw2QkFBNkI7SUFDN0IsOENBQW9CLENBQUE7SUFDcEIsK0NBQXFCLENBQUE7SUFDckIsNkNBQW1CLENBQUE7SUFDbkIsZ0RBQXNCLENBQUE7QUFDeEIsQ0FBQyxFQWhCVyxzQkFBc0IsR0FBdEIsOEJBQXNCLEtBQXRCLDhCQUFzQixRQWdCakM7QUE4SUQ7O0dBRUc7QUFDSCxJQUFZLFFBdUJYO0FBdkJELFdBQVksUUFBUTtJQUNsQjs7T0FFRztJQUNILDZCQUFpQixDQUFBO0lBQ2pCOzs7T0FHRztJQUNILDJCQUFlLENBQUE7SUFDZjs7O09BR0c7SUFDSCwrQkFBbUIsQ0FBQTtJQUNuQjs7T0FFRztJQUNILDJCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILCtCQUFtQixDQUFBO0FBQ3JCLENBQUMsRUF2QlcsUUFBUSxHQUFSLGdCQUFRLEtBQVIsZ0JBQVEsUUF1Qm5CO0FBMEpELFNBQWdCLFlBQVksQ0FNMUIsS0FBVTtJQUNWLE9BQU8sT0FBTyxLQUFLLElBQUksVUFBVTtXQUMxQixPQUFPLEtBQUssQ0FBQyxjQUFjLElBQUksUUFBUTtXQUN2QyxLQUFLLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQztBQUN2QyxDQUFDO0FBVkQsb0NBVUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSnNvbk9iamVjdCwgSnNvblZhbHVlLCBzY2hlbWEgfSBmcm9tICcuLi8uLi9qc29uL2luZGV4JztcbmltcG9ydCB7IExvZ0VudHJ5LCBMb2dnZXJBcGkgfSBmcm9tICcuLi8uLi9sb2dnZXIvaW5kZXgnO1xuaW1wb3J0IHsgRGVlcFJlYWRvbmx5IH0gZnJvbSAnLi4vLi4vdXRpbHMvaW5kZXgnO1xuXG4vKipcbiAqIEEgam9iIG5hbWUgaXMganVzdCBhIHN0cmluZyAobmVlZHMgdG8gYmUgc2VyaWFsaXphYmxlKS5cbiAqL1xuZXhwb3J0IHR5cGUgSm9iTmFtZSA9IHN0cmluZztcblxuXG4vKipcbiAqIFRoZSBqb2IgaGFuZGxlciBmdW5jdGlvbiwgd2hpY2ggaXMgYSBtZXRob2QgdGhhdCdzIGV4ZWN1dGVkIGZvciB0aGUgam9iLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYkhhbmRsZXI8XG4gIEFyZ1QgZXh0ZW5kcyBKc29uVmFsdWUsXG4gIElucHV0VCBleHRlbmRzIEpzb25WYWx1ZSxcbiAgT3V0cHV0VCBleHRlbmRzIEpzb25WYWx1ZSxcbj4ge1xuICAoXG4gICAgYXJndW1lbnQ6IEFyZ1QsXG4gICAgY29udGV4dDogSm9iSGFuZGxlckNvbnRleHQ8QXJnVCwgSW5wdXRULCBPdXRwdXRUPixcbiAgKTogT2JzZXJ2YWJsZTxKb2JPdXRib3VuZE1lc3NhZ2U8T3V0cHV0VD4+O1xuXG4gIGpvYkRlc2NyaXB0aW9uOiBQYXJ0aWFsPEpvYkRlc2NyaXB0aW9uPjtcbn1cblxuXG4vKipcbiAqIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBqb2IgaXMgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYkhhbmRsZXJDb250ZXh0PFxuICBNaW5pbXVtQXJndW1lbnRWYWx1ZVQgZXh0ZW5kcyBKc29uVmFsdWUgPSBKc29uVmFsdWUsXG4gIE1pbmltdW1JbnB1dFZhbHVlVCBleHRlbmRzIEpzb25WYWx1ZSA9IEpzb25WYWx1ZSxcbiAgTWluaW11bU91dHB1dFZhbHVlVCBleHRlbmRzIEpzb25WYWx1ZSA9IEpzb25WYWx1ZSxcbj4ge1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogSm9iRGVzY3JpcHRpb247XG4gIHJlYWRvbmx5IHNjaGVkdWxlcjogU2NoZWR1bGVyPE1pbmltdW1Bcmd1bWVudFZhbHVlVCwgTWluaW11bUlucHV0VmFsdWVULCBNaW5pbXVtT3V0cHV0VmFsdWVUPjtcblxuICAvLyBJbiB0aGlzIGNvbnRleHQsIEpzb25WYWx1ZSBpcyBjb21wYXJhYmxlIHRvIGBhbnlgLlxuICByZWFkb25seSBkZXBlbmRlbmNpZXM6IEpvYjxKc29uVmFsdWUsIEpzb25WYWx1ZSwgSnNvblZhbHVlPltdO1xuXG4gIHJlYWRvbmx5IGluYm91bmRCdXM6IE9ic2VydmFibGU8Sm9iSW5ib3VuZE1lc3NhZ2U8TWluaW11bUlucHV0VmFsdWVUPj47XG59XG5cblxuLyoqXG4gKiBNZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBqb2IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iRGVzY3JpcHRpb24gZXh0ZW5kcyBKc29uT2JqZWN0IHtcbiAgcmVhZG9ubHkgbmFtZTogSm9iTmFtZTtcblxuICByZWFkb25seSBhcmd1bWVudDogRGVlcFJlYWRvbmx5PHNjaGVtYS5Kc29uU2NoZW1hPjtcbiAgcmVhZG9ubHkgaW5wdXQ6IERlZXBSZWFkb25seTxzY2hlbWEuSnNvblNjaGVtYT47XG4gIHJlYWRvbmx5IG91dHB1dDogRGVlcFJlYWRvbmx5PHNjaGVtYS5Kc29uU2NoZW1hPjtcbn1cblxuLyoqXG4gKiBNZXNzYWdlcyB0aGF0IGNhbiBiZSBzZW50IFRPIGEgam9iLiBUaGUgam9iIG5lZWRzIHRvIGxpc3RlbiB0byB0aG9zZS5cbiAqL1xuZXhwb3J0IGVudW0gSm9iSW5ib3VuZE1lc3NhZ2VLaW5kIHtcbiAgUGluZyA9ICdpcCcsXG4gIFN0b3AgPSAnaXMnLFxuXG4gIC8vIENoYW5uZWwgc3BlY2lmaWMgbWVzc2FnZXMuXG4gIElucHV0ID0gJ2luJyxcbiAgLy8gSW5wdXQgY2hhbm5lbCBkb2VzIG5vdCBhbGxvdyBjb21wbGV0aW9uIC8gZXJyb3IuIEVycm9yaW5nIHRoaXMgd2lsbCBqdXN0IGNsb3NlIHRoZSBTdWJqZWN0XG4gIC8vIGJ1dCBub3Qgbm90aWZ5IHRoZSBqb2IuXG59XG5cbi8qKiBCYXNlIGludGVyZmFjZSBmb3IgdGhlIGFsbCBqb2IgaW5ib3VuZCBtZXNzYWdlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iSW5ib3VuZE1lc3NhZ2VCYXNlIGV4dGVuZHMgSnNvbk9iamVjdCB7XG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiBtZXNzYWdlIHRoaXMgaXMuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBKb2JJbmJvdW5kTWVzc2FnZUtpbmQ7XG59XG5cbi8qKlxuICogQSBwaW5nIHRvIHRoZSBqb2IuIFRoZSBqb2Igc2hvdWxkIHJlcGx5IHdpdGggYSBwb25nIGFzIHNvb24gYXMgcG9zc2libGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iSW5ib3VuZE1lc3NhZ2VQaW5nIGV4dGVuZHMgSm9iSW5ib3VuZE1lc3NhZ2VCYXNlIHtcbiAgcmVhZG9ubHkga2luZDogSm9iSW5ib3VuZE1lc3NhZ2VLaW5kLlBpbmc7XG5cbiAgLyoqXG4gICAqIEFuIElEIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIFBvbmcuXG4gICAqL1xuICByZWFkb25seSBpZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFN0b3AgdGhlIGpvYi4gVGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBqb2IgaXRzZWxmIGFuZCBqb2JzIG1pZ2h0IG5vdCBoYW5kbGUgaXQuIEl0IHdpbGwgYWxzb1xuICogdW5zdWJzY3JpYmUgZnJvbSB0aGUgT2JzZXJ2YWJsZTw+LlxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIFNJR1RFUk0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iSW5ib3VuZE1lc3NhZ2VTdG9wIGV4dGVuZHMgSm9iSW5ib3VuZE1lc3NhZ2VCYXNlIHtcbiAgcmVhZG9ubHkga2luZDogSm9iSW5ib3VuZE1lc3NhZ2VLaW5kLlN0b3A7XG59XG5cbi8qKlxuICogQSBKb2Igd2FudHMgdG8gc2VuZCBhIG1lc3NhZ2UgdG8gYSBjaGFubmVsLiBUaGlzIGNhbiBiZSBtYXJzaGFsZWQsIGFuZCB0aGUgSm9iIG9iamVjdFxuICogaGFzIGhlbHBlcnMgdG8gdHJhbnNmb3JtIHRoaXMgaW50byBhbiBvYnNlcnZhYmxlLiBUaGUgY29udGV4dCBhbHNvIGNhbiBjcmVhdGUgUnhKUyBzdWJqZWN0cyB0aGF0XG4gKiBtYXJzaGFsbCBtZXNzYWdlcyB0aHJvdWdoIGEgY2hhbm5lbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JJbmJvdW5kTWVzc2FnZUlucHV0PElucHV0VCBleHRlbmRzIEpzb25WYWx1ZT4gZXh0ZW5kcyBKb2JJbmJvdW5kTWVzc2FnZUJhc2Uge1xuICByZWFkb25seSBraW5kOiBKb2JJbmJvdW5kTWVzc2FnZUtpbmQuSW5wdXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBiZWluZyBzZW50IHRvIHRoZSBqb2IuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogSW5wdXRUO1xufVxuXG5leHBvcnQgdHlwZSBKb2JJbmJvdW5kTWVzc2FnZTxJbnB1dFQgZXh0ZW5kcyBKc29uVmFsdWU+ID1cbiAgSm9iSW5ib3VuZE1lc3NhZ2VQaW5nXG4gIHwgSm9iSW5ib3VuZE1lc3NhZ2VTdG9wXG4gIHwgSm9iSW5ib3VuZE1lc3NhZ2VJbnB1dDxJbnB1dFQ+XG4gIDtcblxuLyoqXG4gKiBLaW5kIG9mIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIG91dHB1dHRlZCBmcm9tIGEgam9iLlxuICovXG5leHBvcnQgZW51bSBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kIHtcbiAgLy8gTGlmZWN5Y2xlIHNwZWNpZmljIG1lc3NhZ2VzLlxuICBPblJlYWR5ID0gJ2MnLFxuICBTdGFydCA9ICdzJyxcbiAgRW5kID0gJ2UnLFxuICBQb25nID0gJ3AnLFxuXG4gIC8vIEZlZWRiYWNrIG1lc3NhZ2VzLlxuICBMb2cgPSAnbCcsXG4gIE91dHB1dCA9ICdvJyxcblxuICAvLyBDaGFubmVsIHNwZWNpZmljIG1lc3NhZ2VzLlxuICBDaGFubmVsQ3JlYXRlID0gJ2NuJyxcbiAgQ2hhbm5lbE1lc3NhZ2UgPSAnY20nLFxuICBDaGFubmVsRXJyb3IgPSAnY2UnLFxuICBDaGFubmVsQ29tcGxldGUgPSAnY2MnLFxufVxuXG4vKiogQmFzZSBpbnRlcmZhY2UgZm9yIHRoZSBhbGwgam9iIG1lc3NhZ2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JPdXRib3VuZE1lc3NhZ2VCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBqb2IgZGVzY3JpcHRpb24uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogSm9iRGVzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIG1lc3NhZ2UgdGhpcyBpcy5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IEpvYk91dGJvdW5kTWVzc2FnZUtpbmQ7XG59XG5cbi8qKlxuICogVGhlIGpvYiBoYXMgYmVlbiBjcmVhdGVkIGFuZCB3aWxsIHZhbGlkYXRlIGl0cyBpbnB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JPdXRib3VuZE1lc3NhZ2VPblJlYWR5IGV4dGVuZHMgSm9iT3V0Ym91bmRNZXNzYWdlQmFzZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IEpvYk91dGJvdW5kTWVzc2FnZUtpbmQuT25SZWFkeTtcbn1cblxuLyoqXG4gKiBUaGUgam9iIHN0YXJ0ZWQuIFRoaXMgaXMgZG9uZSBieSB0aGUgam9iIGl0c2VsZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JPdXRib3VuZE1lc3NhZ2VTdGFydCBleHRlbmRzIEpvYk91dGJvdW5kTWVzc2FnZUJhc2Uge1xuICByZWFkb25seSBraW5kOiBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kLlN0YXJ0O1xufVxuXG4vKipcbiAqIEEgbG9nZ2luZyBtZXNzYWdlLCBzdXBwb3J0aW5nIHRoZSBsb2dnaW5nLkxvZ0VudHJ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYk91dGJvdW5kTWVzc2FnZUxvZyBleHRlbmRzIEpvYk91dGJvdW5kTWVzc2FnZUJhc2Uge1xuICByZWFkb25seSBraW5kOiBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kLkxvZztcbiAgcmVhZG9ubHkgZW50cnk6IExvZ0VudHJ5O1xufVxuXG4vKipcbiAqIEFuIG91dHB1dCB2YWx1ZSBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iT3V0Ym91bmRNZXNzYWdlT3V0cHV0PFxuICBPdXRwdXRUIGV4dGVuZHMgSnNvblZhbHVlLFxuPiBleHRlbmRzIEpvYk91dGJvdW5kTWVzc2FnZUJhc2Uge1xuICByZWFkb25seSBraW5kOiBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kLk91dHB1dDtcblxuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgYmVpbmcgb3V0cHV0dGVkIGZyb20gdGhlIGpvYi5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBPdXRwdXRUO1xufVxuXG5cbi8qKlxuICogQmFzZSBpbnRlcmZhY2UgZm9yIGFsbCBqb2IgbWVzc2FnZSByZWxhdGVkIHRvIGNoYW5uZWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYk91dGJvdW5kTWVzc2FnZUNoYW5uZWxCYXNlIGV4dGVuZHMgSm9iT3V0Ym91bmRNZXNzYWdlQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGpvYiB3YW50cyB0byBzZW5kIGEgbWVzc2FnZSB0byBhIGNoYW5uZWwuIFRoaXMgY2FuIGJlIG1hcnNoYWxlZCwgYW5kIHRoZSBKb2Igb2JqZWN0XG4gKiBoYXMgaGVscGVycyB0byB0cmFuc2Zvcm0gdGhpcyBpbnRvIGFuIG9ic2VydmFibGUuIFRoZSBjb250ZXh0IGFsc28gY2FuIGNyZWF0ZSBSeEpTIHN1YmplY3RzIHRoYXRcbiAqIG1hcnNoYWxsIG1lc3NhZ2VzIHRocm91Z2ggYSBjaGFubmVsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYk91dGJvdW5kTWVzc2FnZUNoYW5uZWxNZXNzYWdlIGV4dGVuZHMgSm9iT3V0Ym91bmRNZXNzYWdlQ2hhbm5lbEJhc2Uge1xuICByZWFkb25seSBraW5kOiBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kLkNoYW5uZWxNZXNzYWdlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSBiZWluZyBzZW50IHRvIHRoZSBjaGFubmVsLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZTogSnNvblZhbHVlO1xufVxuXG4vKipcbiAqIEEgam9iIHdhbnRzIHRvIHNlbmQgYW4gZXJyb3IgdG8gb25lIG9mIGl0cyBjaGFubmVsLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRocm93aW5nIHRocm91Z2hcbiAqIGFuIE9ic2VydmFibGUuIFRoZSBzaWRlIGNoYW5uZWwgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbW9yZSBtZXNzYWdlcyBhZnRlciB0aGlzLCBhbmQgd2lsbCBub3RcbiAqIGNvbXBsZXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYk91dGJvdW5kTWVzc2FnZUNoYW5uZWxFcnJvciBleHRlbmRzIEpvYk91dGJvdW5kTWVzc2FnZUNoYW5uZWxCYXNlIHtcbiAgcmVhZG9ubHkga2luZDogSm9iT3V0Ym91bmRNZXNzYWdlS2luZC5DaGFubmVsRXJyb3I7XG5cbiAgLyoqXG4gICAqIFRoZSBlcnJvciBtZXNzYWdlIGJlaW5nIHNlbnQgdG8gdGhlIGNoYW5uZWwuXG4gICAqL1xuICByZWFkb25seSBlcnJvcjogSnNvblZhbHVlO1xufVxuXG4vKipcbiAqIEEgam9iIHdhbnRzIHRvIGNyZWF0ZSBhIG5ldyBjaGFubmVsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYk91dGJvdW5kTWVzc2FnZUNoYW5uZWxDcmVhdGUgZXh0ZW5kcyBKb2JPdXRib3VuZE1lc3NhZ2VDaGFubmVsQmFzZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IEpvYk91dGJvdW5kTWVzc2FnZUtpbmQuQ2hhbm5lbENyZWF0ZTtcbn1cblxuLyoqXG4gKiBBIGpvYiB3YW50cyB0byBjbG9zZSB0aGUgY2hhbm5lbCwgYXMgY29tcGxldGVkLiBUaGlzIGlzIGRvbmUgYXV0b21hdGljYWxseSB3aGVuIHRoZSBqb2IgZW5kcyxcbiAqIG9yIGNhbiBiZSBkb25lIGZyb20gdGhlIGpvYiB0byBjbG9zZSBpdC4gQSBjbG9zZWQgY2hhbm5lbCBtaWdodCBiZSByZW9wZW5lZCwgYnV0IHRoZSB1c2VyXG4gKiBuZWVkIHRvIHJlY2FsbCBnZXRDaGFubmVsKCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iT3V0Ym91bmRNZXNzYWdlQ2hhbm5lbENvbXBsZXRlIGV4dGVuZHMgSm9iT3V0Ym91bmRNZXNzYWdlQ2hhbm5lbEJhc2Uge1xuICByZWFkb25seSBraW5kOiBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kLkNoYW5uZWxDb21wbGV0ZTtcbn1cblxuLyoqXG4gKiBPbkVuZCBvZiB0aGUgam9iIHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JPdXRib3VuZE1lc3NhZ2VFbmQgZXh0ZW5kcyBKb2JPdXRib3VuZE1lc3NhZ2VCYXNlIHtcbiAgcmVhZG9ubHkga2luZDogSm9iT3V0Ym91bmRNZXNzYWdlS2luZC5FbmQ7XG59XG5cbi8qKlxuICogQSBwb25nIHJlc3BvbnNlIGZyb20gYSBwaW5nIGlucHV0LiBUaGUgaWQgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBwYXNzZWQgaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSm9iT3V0Ym91bmRNZXNzYWdlUG9uZyBleHRlbmRzIEpvYk91dGJvdW5kTWVzc2FnZUJhc2Uge1xuICByZWFkb25seSBraW5kOiBKb2JPdXRib3VuZE1lc3NhZ2VLaW5kLlBvbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCB0aGF0IHdhcyBwYXNzZWQgaW4gdGhlIGBQaW5nYCBtZXNzYWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XG59XG5cbi8qKlxuICogR2VuZXJpYyBtZXNzYWdlIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIEpvYk91dGJvdW5kTWVzc2FnZTxPdXRwdXRUIGV4dGVuZHMgSnNvblZhbHVlPiA9XG4gIEpvYk91dGJvdW5kTWVzc2FnZU9uUmVhZHlcbiAgfCBKb2JPdXRib3VuZE1lc3NhZ2VTdGFydFxuICB8IEpvYk91dGJvdW5kTWVzc2FnZUxvZ1xuICB8IEpvYk91dGJvdW5kTWVzc2FnZU91dHB1dDxPdXRwdXRUPlxuICB8IEpvYk91dGJvdW5kTWVzc2FnZUNoYW5uZWxDcmVhdGVcbiAgfCBKb2JPdXRib3VuZE1lc3NhZ2VDaGFubmVsTWVzc2FnZVxuICB8IEpvYk91dGJvdW5kTWVzc2FnZUNoYW5uZWxFcnJvclxuICB8IEpvYk91dGJvdW5kTWVzc2FnZUNoYW5uZWxDb21wbGV0ZVxuICB8IEpvYk91dGJvdW5kTWVzc2FnZUVuZFxuICB8IEpvYk91dGJvdW5kTWVzc2FnZVBvbmdcbiAgO1xuXG5cbi8qKlxuICogVGhlIHN0YXRlIG9mIGEgam9iLiBUaGVzZSBhcmUgY2hhbmdlZCBhcyB0aGUgam9iIHJlcG9ydHMgYSBuZXcgc3RhdGUgdGhyb3VnaCBpdHMgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCBlbnVtIEpvYlN0YXRlIHtcbiAgLyoqXG4gICAqIFRoZSBqb2Igd2FzIHF1ZXVlZCBhbmQgaXMgd2FpdGluZyB0byBzdGFydC5cbiAgICovXG4gIFF1ZXVlZCA9ICdxdWV1ZWQnLFxuICAvKipcbiAgICogVGhlIGpvYiBkZXNjcmlwdGlvbiB3YXMgZm91bmQsIGl0cyBkZXBlbmRlbmNpZXMgKHNlZSBcIlN5bmNocm9uaXppbmcgYW5kIERlcGVuZGVuY2llc1wiKVxuICAgKiBhcmUgZG9uZSBydW5uaW5nLCBhbmQgdGhlIGpvYidzIGFyZ3VtZW50IGlzIHZhbGlkYXRlZCBhbmQgdGhlIGpvYidzIGNvZGUgd2lsbCBiZSBleGVjdXRlZC5cbiAgICovXG4gIFJlYWR5ID0gJ3JlYWR5JyxcbiAgLyoqXG4gICAqIFRoZSBqb2IgaGFzIGJlZW4gc3RhcnRlZC4gVGhlIGpvYiBpbXBsZW1lbnRhdGlvbiBpcyBleHBlY3RlZCB0byBzZW5kIHRoaXMgYXMgc29vbiBhcyBpdHNcbiAgICogd29yayBpcyBzdGFydGluZy5cbiAgICovXG4gIFN0YXJ0ZWQgPSAnc3RhcnRlZCcsXG4gIC8qKlxuICAgKiBUaGUgam9iIGhhcyBlbmRlZCBhbmQgaXMgZG9uZSBydW5uaW5nLlxuICAgKi9cbiAgRW5kZWQgPSAnZW5kZWQnLFxuICAvKipcbiAgICogQW4gZXJyb3Igb2NjdXJlZCBhbmQgdGhlIGpvYiBzdG9wcGVkIGJlY2F1c2Ugb2YgaW50ZXJuYWwgc3RhdGUuXG4gICAqL1xuICBFcnJvcmVkID0gJ2Vycm9yZWQnLFxufVxuXG5cbi8qKlxuICogQSBKb2IgaW5zdGFuY2UsIHJldHVybmVkIGZyb20gc2NoZWR1bGluZyBhIGpvYi4gQSBKb2IgaW5zdGFuY2UgaXMgX25vdF8gc2VyaWFsaXphYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYjxcbiAgQXJndW1lbnRUIGV4dGVuZHMgSnNvblZhbHVlID0gSnNvblZhbHVlLFxuICBJbnB1dFQgZXh0ZW5kcyBKc29uVmFsdWUgPSBKc29uVmFsdWUsXG4gIE91dHB1dFQgZXh0ZW5kcyBKc29uVmFsdWUgPSBKc29uVmFsdWUsXG4+IHtcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBqb2IuIFJlc29sdmluZyB0aGUgam9iJ3MgZGVzY3JpcHRpb24gY2FuIGJlIGRvbmUgYXN5bmNocm9ub3VzbHksIHNvIHRoaXNcbiAgICogaXMgYW4gb2JzZXJ2YWJsZSB0aGF0IHdpbGwgcmVzb2x2ZSB3aGVuIGl0J3MgcmVhZHkuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogT2JzZXJ2YWJsZTxKb2JEZXNjcmlwdGlvbj47XG5cbiAgLyoqXG4gICAqIEFyZ3VtZW50IHNlbnQgd2hlbiBzY2hlZHVsaW5nIHRoZSBqb2IuIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBhcmd1bWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGFyZ3VtZW50OiBBcmd1bWVudFQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCB0byB0aGUgam9iLiBUaGlzIGdvZXMgdGhyb3VnaCB0aGUgaW5wdXQgY2hhbm5lbCBhcyBtZXNzYWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0OiBPYnNlcnZlcjxJbnB1dFQ+O1xuXG4gIC8qKlxuICAgKiBPdXRwdXRzIG9mIHRoaXMgam9iLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0OiBPYnNlcnZhYmxlPE91dHB1dFQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgam9iLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGU6IEpvYlN0YXRlO1xuXG4gIC8qKlxuICAgKiBHZXQgYSBjaGFubmVsIHRoYXQgdmFsaWRhdGVzIGFnYWluc3QgdGhlIHNjaGVtYS4gTWVzc2FnZXMgd2lsbCBiZSBmaWx0ZXJlZCBieSB0aGUgc2NoZW1hLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbC5cbiAgICogQHBhcmFtIHNjaGVtYSBBIHNjaGVtYSB0byB1c2UgdG8gdmFsaWRhdGUgbWVzc2FnZXMuXG4gICAqL1xuICBnZXRDaGFubmVsPFQgZXh0ZW5kcyBKc29uVmFsdWU+KG5hbWU6IHN0cmluZywgc2NoZW1hPzogc2NoZW1hLkpzb25TY2hlbWEpOiBPYnNlcnZhYmxlPFQ+O1xuXG4gIC8qKlxuICAgKiBQaW5ncyB0aGUgam9iIGFuZCB3YWl0IGZvciB0aGUgcmVzdWx0aW5nIFBvbmcgYmVmb3JlIGNvbXBsZXRpbmcuXG4gICAqL1xuICBwaW5nKCk6IE9ic2VydmFibGU8bmV2ZXI+O1xuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgam9iIGZyb20gcnVubmluZy4gVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB1bnN1YnNjcmliaW5nIGZyb20gdGhlIG91dHB1dCBhcyBpbiBpdFxuICAgKiBzZW5kcyB0aGUgSm9iSW5ib3VuZE1lc3NhZ2VLaW5kLlN0b3AgcmF3IGlucHV0IHRvIHRoZSBqb2IuXG4gICAqL1xuICBzdG9wKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBKb2JJbmJvdW5kTWVzc2FnZSBtZXNzYWdlcyBUTyB0aGUgam9iLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5ib3VuZEJ1czogT2JzZXJ2ZXI8Sm9iSW5ib3VuZE1lc3NhZ2U8SW5wdXRUPj47XG5cbiAgLyoqXG4gICAqIFRoZSBKb2JPdXRib3VuZE1lc3NhZ2UgRlJPTSB0aGUgam9iLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0Ym91bmRCdXM6IE9ic2VydmFibGU8Sm9iT3V0Ym91bmRNZXNzYWdlPE91dHB1dFQ+Pjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzY2hlZHVsaW5nIGpvYnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVKb2JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHNob3VsZCBsb2dnaW5nIGJlIHBhc3NlZCBpbi4gQnkgZGVmYXVsdCBsb2dnaW5nIHdpbGwgYmUgZHJvcHBlZC5cbiAgICovXG4gIGxvZ2dlcj86IExvZ2dlckFwaTtcblxuICAvKipcbiAgICogSm9icyB0aGF0IG5lZWQgdG8gZmluaXNoIGJlZm9yZSBzY2hlZHVsaW5nIHRoaXMgam9iLiBUaGVzZSBkZXBlbmRlbmNpZXMgd2lsbCBiZSBwYXNzZWRcbiAgICogdG8gdGhlIGpvYiBpdHNlbGYgaW4gaXRzIGNvbnRleHQuXG4gICAqL1xuICBkZXBlbmRlbmNpZXM/OiBKb2IgfCBKb2JbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeTxcbiAgTWluaW11bUFyZ3VtZW50VmFsdWVUIGV4dGVuZHMgSnNvblZhbHVlID0gSnNvblZhbHVlLFxuICBNaW5pbXVtSW5wdXRWYWx1ZVQgZXh0ZW5kcyBKc29uVmFsdWUgPSBKc29uVmFsdWUsXG4gIE1pbmltdW1PdXRwdXRWYWx1ZVQgZXh0ZW5kcyBKc29uVmFsdWUgPSBKc29uVmFsdWUsXG4+IHtcbiAgLyoqXG4gICAqIEdldCBhIGpvYiBoYW5kbGVyLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgam9iIHRvIGdldCBhIGhhbmRsZXIgZnJvbS5cbiAgICovXG4gIGdldDxcbiAgICBBIGV4dGVuZHMgTWluaW11bUFyZ3VtZW50VmFsdWVULFxuICAgIEkgZXh0ZW5kcyBNaW5pbXVtSW5wdXRWYWx1ZVQsXG4gICAgTyBleHRlbmRzIE1pbmltdW1PdXRwdXRWYWx1ZVQsXG4gID4obmFtZTogSm9iTmFtZSk6IE9ic2VydmFibGU8Sm9iSGFuZGxlcjxBLCBJLCBPPiB8IG51bGw+O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IGNhbiBzY2hlZHVsZSBqb2JzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlcjxcbiAgTWluaW11bUFyZ3VtZW50VmFsdWVUIGV4dGVuZHMgSnNvblZhbHVlID0gSnNvblZhbHVlLFxuICBNaW5pbXVtSW5wdXRWYWx1ZVQgZXh0ZW5kcyBKc29uVmFsdWUgPSBKc29uVmFsdWUsXG4gIE1pbmltdW1PdXRwdXRWYWx1ZVQgZXh0ZW5kcyBKc29uVmFsdWUgPSBKc29uVmFsdWUsXG4+IHtcbiAgLyoqXG4gICAqIEdldCBhIGpvYiBkZXNjcmlwdGlvbiBmb3IgYSBuYW1lZCBqb2IuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBqb2IuXG4gICAqIEByZXR1cm5zIEEgZGVzY3JpcHRpb24sIG9yIG51bGwgaWYgbm8gZGVzY3JpcHRpb24gaXMgYXZhaWxhYmxlIGZvciB0aGlzIGpvYi5cbiAgICovXG4gIGdldERlc2NyaXB0aW9uKG5hbWU6IEpvYk5hbWUpOiBPYnNlcnZhYmxlPEpvYkRlc2NyaXB0aW9uIHwgbnVsbD47XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgam9iIG5hbWUgaGFzIGJlZW4gcmVnaXN0ZXJlZC5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGpvYi5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgam9iIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaGFzKG5hbWU6IEpvYk5hbWUpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBQYXVzZSB0aGUgc2NoZWR1bGVyLCB0ZW1wb3JhcnkgcXVldWVpbmcgX25ld18gam9icy4gUmV0dXJucyBhIHJlc3VtZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZVxuICAgKiB1c2VkIHRvIHJlc3VtZSBleGVjdXRpb24uIElmIG11bHRpcGxlIGBwYXVzZSgpYCB3ZXJlIGNhbGxlZCwgYWxsIHRoZWlyIHJlc3VtZSBmdW5jdGlvbnMgbXVzdFxuICAgKiBiZSBjYWxsZWQgYmVmb3JlIHRoZSBTY2hlZHVsZXIgYWN0dWFsbHkgc3RhcnRzIG5ldyBqb2JzLiBBZGRpdGlvbmFsIGNhbGxzIHRvIHRoZSBzYW1lIHJlc3VtZVxuICAgKiBmdW5jdGlvbiB3aWxsIGhhdmUgbm8gZWZmZWN0LlxuICAgKlxuICAgKiBKb2JzIGFscmVhZHkgcnVubmluZyBhcmUgTk9UIHBhdXNlZC4gVGhpcyBpcyBwYXVzaW5nIHRoZSBzY2hlZHVsZXIgb25seS5cbiAgICpcbiAgICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBydW4gdG8gcmVzdW1lIHRoZSBzY2hlZHVsZXIuIElmIG11bHRpcGxlIGBwYXVzZSgpYCBjYWxsc1xuICAgKiAgICAgICAgICB3ZXJlIG1hZGUsIGFsbCB0aGVpciByZXR1cm4gZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgKGluIGFueSBvcmRlcikgYmVmb3JlIHRoZVxuICAgKiAgICAgICAgICBzY2hlZHVsZXIgY2FuIHJlc3VtZS5cbiAgICovXG4gIHBhdXNlKCk6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlIGEgam9iIHRvIGJlIHJ1biwgdXNpbmcgaXRzIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIGpvYiB0byBiZSBydW4uXG4gICAqIEBwYXJhbSBhcmd1bWVudCBUaGUgYXJndW1lbnQgdG8gc2VuZCB0byB0aGUgam9iIHdoZW4gc3RhcnRpbmcgaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIFNjaGVkdWxpbmcgb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIGpvYiBiZWluZyBydW4uXG4gICAqL1xuICBzY2hlZHVsZTxcbiAgICBBIGV4dGVuZHMgTWluaW11bUFyZ3VtZW50VmFsdWVULFxuICAgIEkgZXh0ZW5kcyBNaW5pbXVtSW5wdXRWYWx1ZVQsXG4gICAgTyBleHRlbmRzIE1pbmltdW1PdXRwdXRWYWx1ZVQsXG4gID4oXG4gICAgbmFtZTogSm9iTmFtZSxcbiAgICBhcmd1bWVudDogQSxcbiAgICBvcHRpb25zPzogU2NoZWR1bGVKb2JPcHRpb25zLFxuICApOiBKb2I8QSwgSSwgTz47XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSm9iSGFuZGxlcjxcbiAgQSBleHRlbmRzIEpzb25WYWx1ZSxcbiAgSSBleHRlbmRzIEpzb25WYWx1ZSxcbiAgTyBleHRlbmRzIEpzb25WYWx1ZSxcbi8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHVua25vd25cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbj4odmFsdWU6IGFueSk6IHZhbHVlIGlzIEpvYkhhbmRsZXI8QSwgSSwgTz4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbidcbiAgICAgICYmIHR5cGVvZiB2YWx1ZS5qb2JEZXNjcmlwdGlvbiA9PSAnb2JqZWN0J1xuICAgICAgJiYgdmFsdWUuam9iRGVzY3JpcHRpb24gIT09IG51bGw7XG59XG4iXX0=