@gnwebsoft/ui 3.0.8 → 3.0.9

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 (44) hide show
  1. package/dist/chunk-3OPVOWQK.js +140 -0
  2. package/dist/chunk-AEOF2TUF.cjs +2273 -0
  3. package/dist/chunk-ALHC7RLK.js +575 -0
  4. package/dist/chunk-BRRLB22L.js +72 -0
  5. package/dist/chunk-CHZU4PZB.js +2273 -0
  6. package/dist/chunk-EBRUE2WR.cjs +1 -1
  7. package/dist/chunk-HEHPKM4B.cjs +140 -0
  8. package/dist/chunk-K2EJ4YKO.cjs +72 -0
  9. package/dist/chunk-MVPLBJRK.cjs +1 -1
  10. package/dist/chunk-XY4U6A77.cjs +575 -0
  11. package/dist/components/index.cjs +1 -1
  12. package/dist/{enhanced-z-I7EHVS.d.cts → enhanced-CDTkKUlj.d.ts} +5 -5
  13. package/dist/{enhanced-z-I7EHVS.d.ts → enhanced-ZQoS03Cd.d.cts} +5 -5
  14. package/dist/events-BcHVCLBz.d.cts +77 -0
  15. package/dist/events-BcHVCLBz.d.ts +77 -0
  16. package/dist/hooks/index.cjs +3 -3
  17. package/dist/hooks/index.d.cts +3 -2
  18. package/dist/hooks/index.d.ts +3 -2
  19. package/dist/hooks/index.js +1 -1
  20. package/dist/index.cjs +67 -6
  21. package/dist/index.d.cts +4 -3
  22. package/dist/index.d.ts +4 -3
  23. package/dist/index.js +65 -4
  24. package/dist/types/index.cjs +31 -2
  25. package/dist/types/index.d.cts +588 -1
  26. package/dist/types/index.d.ts +588 -1
  27. package/dist/types/index.js +30 -1
  28. package/dist/utils/index.cjs +37 -3
  29. package/dist/utils/index.d.cts +329 -13
  30. package/dist/utils/index.d.ts +329 -13
  31. package/dist/utils/index.js +35 -1
  32. package/dist/wrappers/index.cjs +4 -4
  33. package/dist/wrappers/index.d.cts +11 -9
  34. package/dist/wrappers/index.d.ts +11 -9
  35. package/dist/wrappers/index.js +2 -2
  36. package/package.json +2 -2
  37. package/dist/chunk-4H3AFH7A.js +0 -505
  38. package/dist/chunk-DE62KYFK.js +0 -122
  39. package/dist/chunk-DEPJRTVT.js +0 -1
  40. package/dist/chunk-FD57PCAC.cjs +0 -1
  41. package/dist/chunk-JCXHX2PZ.js +0 -2265
  42. package/dist/chunk-MW2UCDTI.cjs +0 -2265
  43. package/dist/chunk-R2YK4LTT.cjs +0 -122
  44. package/dist/chunk-ZC7FGYL2.cjs +0 -505
@@ -1,505 +0,0 @@
1
- // src/utils/api.ts
2
- var makeRequest = async (url, options = {}) => {
3
- const response = await fetch(url, options);
4
- if (response.ok) {
5
- const apiData = await response.json();
6
- return {
7
- apiData,
8
- status: response.status
9
- };
10
- } else if (response.status === 404) {
11
- const apiData = await response.json();
12
- const data = {
13
- status: response.status,
14
- title: apiData.title
15
- };
16
- return data;
17
- }
18
- const apiResponse = await response.json();
19
- return apiResponse;
20
- };
21
- var api = class {
22
- static async filter(url, postModel) {
23
- const alteredOptions = {
24
- headers: {
25
- "Content-Type": "application/json",
26
- Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
27
- },
28
- body: JSON.stringify({ ...postModel, ...postModel.filterModel }),
29
- method: "POST"
30
- };
31
- const apiResponse = await makeRequest(url, alteredOptions);
32
- return apiResponse;
33
- }
34
- static async post(url, body = {}) {
35
- const alteredOptions = {
36
- headers: {
37
- "Content-Type": "application/json",
38
- Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
39
- },
40
- body: JSON.stringify(body),
41
- method: "POST"
42
- };
43
- const apiResponse = await makeRequest(url, alteredOptions);
44
- return apiResponse;
45
- }
46
- static async get(url) {
47
- const alteredOptions = {
48
- headers: {
49
- "Content-Type": "application/json",
50
- Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
51
- },
52
- method: "GET"
53
- };
54
- const data = await makeRequest(url, alteredOptions);
55
- return data;
56
- }
57
- static async delete(url) {
58
- const alteredOptions = {
59
- headers: {
60
- "Content-Type": "application/json",
61
- Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
62
- },
63
- method: "DELETE"
64
- };
65
- const data = await makeRequest(url, alteredOptions);
66
- return data;
67
- }
68
- static async put(url, body = {}) {
69
- const alteredOptions = {
70
- headers: {
71
- "Content-Type": "application/json",
72
- Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
73
- },
74
- body: JSON.stringify(body),
75
- method: "PUT"
76
- };
77
- const apiResponse = await makeRequest(url, alteredOptions);
78
- return apiResponse;
79
- }
80
- static async fetch(url, options = {}) {
81
- const alteredOptions = {
82
- headers: {
83
- "Content-Type": "application/json",
84
- Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
85
- },
86
- ...options
87
- };
88
- const result = await fetch(url, alteredOptions);
89
- return result;
90
- }
91
- static async tempFetch(url, options = {}) {
92
- const alteredOptions = {
93
- headers: {
94
- "Content-Type": "application/json"
95
- },
96
- ...options
97
- };
98
- const apiResponse = await makeRequest(url, alteredOptions);
99
- return apiResponse;
100
- }
101
- static async upload(url, formData) {
102
- const alteredOptions = {
103
- headers: {
104
- Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
105
- },
106
- body: formData,
107
- method: "POST"
108
- };
109
- const apiResponse = await makeRequest(url, alteredOptions);
110
- return apiResponse;
111
- }
112
- };
113
-
114
- // src/utils/api2.ts
115
- var makeRequest2 = async (url, options = {}) => {
116
- const response = await fetch(url, options);
117
- if (response.ok) {
118
- const apiData = await response.json();
119
- return {
120
- apiData,
121
- status: response.status
122
- };
123
- } else if (response.status === 404) {
124
- const apiData = await response.json();
125
- const data = {
126
- status: response.status,
127
- title: apiData.title
128
- };
129
- return data;
130
- }
131
- const apiResponse = await response.json();
132
- return apiResponse;
133
- };
134
- var api2 = class {
135
- static async filter(url, postModel) {
136
- const alteredOptions = {
137
- headers: {
138
- "Content-Type": "application/json",
139
- Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
140
- },
141
- body: JSON.stringify({ ...postModel, ...postModel.filterModel }),
142
- method: "POST"
143
- };
144
- const apiResponse = await makeRequest2(url, alteredOptions);
145
- return apiResponse;
146
- }
147
- static async post(url, body = {}) {
148
- const alteredOptions = {
149
- headers: {
150
- "Content-Type": "application/json",
151
- Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
152
- },
153
- body: JSON.stringify(body),
154
- method: "POST"
155
- };
156
- const apiResponse = await makeRequest2(url, alteredOptions);
157
- return apiResponse;
158
- }
159
- static async get(url) {
160
- const alteredOptions = {
161
- headers: {
162
- "Content-Type": "application/json",
163
- Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
164
- },
165
- method: "GET"
166
- };
167
- const data = await makeRequest2(url, alteredOptions);
168
- return data;
169
- }
170
- static async delete(url) {
171
- const alteredOptions = {
172
- headers: {
173
- "Content-Type": "application/json",
174
- Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
175
- },
176
- method: "DELETE"
177
- };
178
- const data = await makeRequest2(url, alteredOptions);
179
- return data;
180
- }
181
- static async put(url, body = {}) {
182
- const alteredOptions = {
183
- headers: {
184
- "Content-Type": "application/json",
185
- Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
186
- },
187
- body: JSON.stringify(body),
188
- method: "PUT"
189
- };
190
- const apiResponse = await makeRequest2(url, alteredOptions);
191
- return apiResponse;
192
- }
193
- static async fetch(url, options = {}) {
194
- const alteredOptions = {
195
- headers: {
196
- "Content-Type": "application/json",
197
- Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
198
- },
199
- ...options
200
- };
201
- const result = await fetch(url, alteredOptions);
202
- return result;
203
- }
204
- static async tempFetch(url, options = {}) {
205
- const alteredOptions = {
206
- headers: {
207
- "Content-Type": "application/json"
208
- },
209
- ...options
210
- };
211
- const apiResponse = await makeRequest2(url, alteredOptions);
212
- return apiResponse;
213
- }
214
- static async upload(url, formData) {
215
- const alteredOptions = {
216
- headers: {
217
- Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
218
- },
219
- body: formData,
220
- method: "POST"
221
- };
222
- const apiResponse = await makeRequest2(url, alteredOptions);
223
- return apiResponse;
224
- }
225
- };
226
-
227
- // src/utils/flattenObjectKeys.ts
228
- var isNested = (obj) => typeof obj === "object" && obj !== null;
229
- var isArray = (obj) => Array.isArray(obj);
230
- var flattenObjectKeys = (obj, prefix = "") => {
231
- if (!isNested(obj)) {
232
- return {
233
- [prefix]: obj
234
- };
235
- }
236
- return Object.keys(obj).reduce((acc, key) => {
237
- const currentPrefix = prefix.length ? `${prefix}.` : "";
238
- if (isNested(obj[key]) && Object.keys(obj[key]).length) {
239
- if (isArray(obj[key]) && obj[key].length) {
240
- obj[key].forEach((item, index) => {
241
- Object.assign(
242
- acc,
243
- flattenObjectKeys(item, `${currentPrefix + key}.${index}`)
244
- );
245
- });
246
- } else {
247
- Object.assign(acc, flattenObjectKeys(obj[key], currentPrefix + key));
248
- }
249
- acc[currentPrefix + key] = obj[key];
250
- } else {
251
- acc[currentPrefix + key] = obj[key];
252
- }
253
- return acc;
254
- }, {});
255
- };
256
-
257
- // src/utils/getTimezone.ts
258
- function getTimezone(adapter, value) {
259
- return value == null || !adapter.utils.isValid(value) ? null : adapter.utils.getTimezone(value);
260
- }
261
-
262
- // src/utils/handleServerErrors.ts
263
- var handleServerErrors = function handleServerErrors2(args) {
264
- const { errors, setError } = args;
265
- for (const key in errors) {
266
- const isKeyInVariables = Object.keys(flattenObjectKeys(errors)).includes(
267
- key
268
- );
269
- if (!isKeyInVariables) {
270
- continue;
271
- }
272
- const fieldError = errors[key];
273
- let errorMessage = "";
274
- if (Array.isArray(fieldError)) {
275
- errorMessage = fieldError.join(" ");
276
- }
277
- if (typeof fieldError === "string") {
278
- errorMessage = fieldError;
279
- }
280
- if (typeof fieldError === "boolean" && fieldError) {
281
- errorMessage = "Field is not valid.";
282
- }
283
- setError(key, {
284
- message: errorMessage
285
- });
286
- }
287
- };
288
-
289
- // src/utils/propertyExists.ts
290
- function propertyExists(obj, prop) {
291
- return typeof obj === "object" && obj !== null && Object.prototype.hasOwnProperty.call(obj, prop);
292
- }
293
-
294
- // src/utils/readValueAsDate.ts
295
- function readValueAsDate(adapter, value) {
296
- if (typeof value === "string") {
297
- if (value === "") {
298
- return null;
299
- }
300
- return adapter.utils.date(value);
301
- }
302
- return value;
303
- }
304
-
305
- // src/utils/removeLeadingTrailingSlashes.ts
306
- var removeLeadingTrailingSlashes = (route) => {
307
- return route.replace(/^\/|\/$/g, "");
308
- };
309
-
310
- // src/utils/schemaTools.ts
311
- import dayjs from "dayjs";
312
- import { z } from "zod";
313
- var schemaTools = {
314
- // Date validations
315
- date: ({ message } = {}) => z.coerce.string().transform((c) => c === "null" || c === "undefined" ? null : c).refine((c) => !!c, { message: message || "Date is required" }).refine((c) => c ? dayjs(c).isValid() : true, {
316
- message: message || "Invalid date"
317
- }),
318
- nullableDate: ({ message } = {}) => z.coerce.string().transform((c) => c === "null" ? null : c).transform((c) => c === "undefined" ? null : c).refine((c) => !c && c !== null ? dayjs(c).isValid() : true, {
319
- message: message || "Invalid date"
320
- }),
321
- dateRange: ({ message } = {}) => z.object({
322
- start: z.coerce.date(),
323
- end: z.coerce.date()
324
- }).refine((data) => data.start <= data.end, {
325
- message: message || "Start date must be before or equal to end date"
326
- }),
327
- // String validations
328
- requiredString: ({ message, min, max } = {}) => z.string().trim().min(min || 1, message || `String must be at least ${min || 1} characters`).max(max || 255, message || `String must be at most ${max || 255} characters`),
329
- email: ({ message } = {}) => z.string().email(message || "Invalid email address").max(254, "Email must be at most 254 characters"),
330
- url: ({ message } = {}) => z.string().url(message || "Invalid URL format"),
331
- phone: ({ message } = {}) => z.string().regex(/^[\+]?[1-9][\d]{0,15}$/, message || "Invalid phone number format"),
332
- alphanumeric: ({ message } = {}) => z.string().regex(/^[a-zA-Z0-9]+$/, message || "Only letters and numbers are allowed"),
333
- slug: ({ message } = {}) => z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, message || "Invalid slug format"),
334
- // Number validations
335
- positiveNumber: ({ message, min, max } = {}) => z.number().positive(message || "Number must be positive").min(min || 0.01, `Number must be at least ${min || 0.01}`).max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
336
- nonNegativeNumber: ({ message, max } = {}) => z.number().min(0, message || "Number must be non-negative").max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
337
- integer: ({ message, min, max } = {}) => z.number().int(message || "Must be an integer").min(min || Number.MIN_SAFE_INTEGER, `Number must be at least ${min || Number.MIN_SAFE_INTEGER}`).max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
338
- percentage: ({ message } = {}) => z.number().min(0, message || "Percentage must be between 0 and 100").max(100, message || "Percentage must be between 0 and 100"),
339
- // Array validations
340
- nonEmptyArray: (schema, { message } = {}) => z.array(schema).min(1, message || "At least one item is required"),
341
- uniqueArray: (schema, { message } = {}) => z.array(schema).refine((items) => new Set(items).size === items.length, {
342
- message: message || "All items must be unique"
343
- }),
344
- // Boolean validations
345
- requiredBoolean: ({ message } = {}) => z.boolean({
346
- message: message || "This field is required"
347
- }),
348
- // Object validations
349
- nonEmptyObject: (schema, { message } = {}) => schema.refine((obj) => Object.keys(obj).length > 0, {
350
- message: message || "Object cannot be empty"
351
- }),
352
- // File validations
353
- fileSize: ({ maxSize, message }) => z.instanceof(File).refine((file) => file.size <= maxSize, {
354
- message: message || `File size must be less than ${Math.round(maxSize / 1024 / 1024)}MB`
355
- }),
356
- fileType: ({ allowedTypes, message }) => z.instanceof(File).refine((file) => allowedTypes.includes(file.type), {
357
- message: message || `File type must be one of: ${allowedTypes.join(", ")}`
358
- }),
359
- // Custom validators
360
- conditional: (condition, trueSchema, falseSchema) => z.union([trueSchema, falseSchema]).superRefine((data, ctx) => {
361
- const shouldUseTrue = condition(data);
362
- const schema = shouldUseTrue ? trueSchema : falseSchema;
363
- const result = schema.safeParse(data);
364
- if (!result.success) {
365
- ctx.addIssue({
366
- code: z.ZodIssueCode.custom,
367
- message: result.error.message
368
- });
369
- }
370
- }),
371
- transform: {
372
- toLowerCase: z.string().transform((val) => val.toLowerCase()),
373
- toUpperCase: z.string().transform((val) => val.toUpperCase()),
374
- trim: z.string().transform((val) => val.trim()),
375
- toNumber: z.string().transform((val) => Number(val)),
376
- toBoolean: z.string().transform((val) => val === "true"),
377
- parseJson: (schema) => z.string().transform((val, ctx) => {
378
- try {
379
- const parsed = JSON.parse(val);
380
- const result = schema.safeParse(parsed);
381
- if (result.success) return result.data;
382
- ctx.addIssue({
383
- code: z.ZodIssueCode.custom,
384
- message: result.error.message
385
- });
386
- return z.NEVER;
387
- } catch {
388
- ctx.addIssue({
389
- code: z.ZodIssueCode.custom,
390
- message: "Invalid JSON"
391
- });
392
- return z.NEVER;
393
- }
394
- })
395
- }
396
- };
397
-
398
- // src/utils/watch/core.ts
399
- import { useWatch } from "react-hook-form";
400
- var useWatchForm = (control) => useWatch({ control });
401
- var useWatchField = (control, name) => useWatch({ control, name });
402
- var useWatchFields = (control, names) => useWatch({ control, name: names });
403
-
404
- // src/utils/watch/utilities.ts
405
- import { useMemo, useState, useEffect } from "react";
406
- import { useWatch as useWatch2 } from "react-hook-form";
407
- var useWatchTransform = (control, name, transform) => {
408
- const value = useWatch2({ control, name });
409
- return useMemo(() => transform(value), [value, transform]);
410
- };
411
- var useWatchDefault = (control, name, defaultValue) => {
412
- const value = useWatch2({ control, name });
413
- return value ?? defaultValue;
414
- };
415
- var useWatchBoolean = (control, name, defaultValue = false) => {
416
- const value = useWatch2({ control, name });
417
- return Boolean(value ?? defaultValue);
418
- };
419
- var useWatchBatch = (control, fields) => {
420
- const values = useWatch2({ control, name: fields });
421
- return useMemo(() => {
422
- const result = {};
423
- fields.forEach((field, index) => {
424
- result[field] = values[index];
425
- });
426
- return result;
427
- }, [values, fields]);
428
- };
429
- var useWatchConditional = (control, name, shouldWatch, fallback) => {
430
- const activeValue = useWatch2({
431
- control,
432
- name,
433
- disabled: !shouldWatch
434
- });
435
- return shouldWatch ? activeValue : fallback;
436
- };
437
- var useWatchDebounced = (control, name, delay = 300) => {
438
- const value = useWatch2({ control, name });
439
- const [debouncedValue, setDebouncedValue] = useState(value);
440
- useEffect(() => {
441
- const timer = setTimeout(() => {
442
- setDebouncedValue(value);
443
- }, delay);
444
- return () => clearTimeout(timer);
445
- }, [value, delay]);
446
- return debouncedValue;
447
- };
448
- var useWatchSelector = (control, name, selector, deps = []) => {
449
- const value = useWatch2({ control, name });
450
- return useMemo(
451
- () => selector(value),
452
- [value, selector, ...deps]
453
- // eslint-disable-line react-hooks/exhaustive-deps
454
- );
455
- };
456
-
457
- // src/utils/watch/index.ts
458
- var typedWatch = {
459
- // === CORE FUNCTIONS ===
460
- /** Watch entire form */
461
- form: useWatchForm,
462
- /** Watch single field */
463
- field: useWatchField,
464
- /** Watch multiple fields */
465
- fields: useWatchFields,
466
- // === UTILITY FUNCTIONS ===
467
- /** Watch with transformation */
468
- transform: useWatchTransform,
469
- /** Watch with default value */
470
- withDefault: useWatchDefault,
471
- /** Watch as boolean */
472
- boolean: useWatchBoolean,
473
- /** Watch multiple with custom keys */
474
- batch: useWatchBatch,
475
- /** Watch conditionally */
476
- conditional: useWatchConditional,
477
- /** Watch with debouncing */
478
- debounced: useWatchDebounced,
479
- /** Watch with selector */
480
- selector: useWatchSelector
481
- };
482
-
483
- export {
484
- api,
485
- api2,
486
- flattenObjectKeys,
487
- getTimezone,
488
- handleServerErrors,
489
- propertyExists,
490
- readValueAsDate,
491
- removeLeadingTrailingSlashes,
492
- schemaTools,
493
- useWatchForm,
494
- useWatchField,
495
- useWatchFields,
496
- useWatchTransform,
497
- useWatchDefault,
498
- useWatchBoolean,
499
- useWatchBatch,
500
- useWatchConditional,
501
- useWatchDebounced,
502
- useWatchSelector,
503
- typedWatch
504
- };
505
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWxzL2FwaS50cyIsICIuLi9zcmMvdXRpbHMvYXBpMi50cyIsICIuLi9zcmMvdXRpbHMvZmxhdHRlbk9iamVjdEtleXMudHMiLCAiLi4vc3JjL3V0aWxzL2dldFRpbWV6b25lLnRzIiwgIi4uL3NyYy91dGlscy9oYW5kbGVTZXJ2ZXJFcnJvcnMudHMiLCAiLi4vc3JjL3V0aWxzL3Byb3BlcnR5RXhpc3RzLnRzIiwgIi4uL3NyYy91dGlscy9yZWFkVmFsdWVBc0RhdGUudHMiLCAiLi4vc3JjL3V0aWxzL3JlbW92ZUxlYWRpbmdUcmFpbGluZ1NsYXNoZXMudHMiLCAiLi4vc3JjL3V0aWxzL3NjaGVtYVRvb2xzLnRzIiwgIi4uL3NyYy91dGlscy93YXRjaC9jb3JlLnRzIiwgIi4uL3NyYy91dGlscy93YXRjaC91dGlsaXRpZXMudHMiLCAiLi4vc3JjL3V0aWxzL3dhdGNoL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL0FwaVJlc3BvbnNlXCI7XG5cbmltcG9ydCB0eXBlIHsgTGlzdFJlc3BvbnNlLCBQb3N0TW9kZWwgfSBmcm9tIFwiQC90eXBlc1wiO1xuXG5jb25zdCBtYWtlUmVxdWVzdCA9IGFzeW5jIDxUPihcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSA9IHt9XG4pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtcblxuICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBhcGlEYXRhOiBUID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaURhdGEsXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgY29uc3QgYXBpRGF0YTogQXBpUmVzcG9uc2U8VD4gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBjb25zdCBkYXRhOiBBcGlSZXNwb25zZTxUPiA9IHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgdGl0bGU6IGFwaURhdGEudGl0bGUsXG4gICAgfTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgY29uc3QgYXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlPFQ+ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gIHJldHVybiBhcGlSZXNwb25zZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGFwaSB7XG4gIHN0YXRpYyBhc3luYyBmaWx0ZXI8VCwgVEZpbHRlcj4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcG9zdE1vZGVsOiBQb3N0TW9kZWw8VEZpbHRlcj5cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxMaXN0UmVzcG9uc2U8VD4+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG5cbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgLi4ucG9zdE1vZGVsLCAuLi5wb3N0TW9kZWwuZmlsdGVyTW9kZWwgfSksXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIH07XG5cbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PExpc3RSZXNwb25zZTxUPj4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcG9zdDxUPih1cmw6IHN0cmluZywgYm9keTogYW55ID0ge30pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0PFQ+KHVybDogc3RyaW5nKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIH07XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGU8VD4odXJsOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHB1dDxUPih1cmw6IHN0cmluZywgYm9keTogYW55ID0ge30pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBmZXRjaCh1cmw6IHN0cmluZywgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaCh1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdGVtcEZldGNoPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IGFueSA9IHt9XG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdXBsb2FkPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGZvcm1EYXRhOiBGb3JtRGF0YVxuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IGZvcm1EYXRhLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUmVzcG9uc2UgfSBmcm9tIFwiLi4vdHlwZXMvQXBpUmVzcG9uc2VcIjtcblxuaW1wb3J0IHR5cGUgeyBMaXN0UmVzcG9uc2UsIFBvc3RNb2RlbCB9IGZyb20gXCJAL3R5cGVzXCI7XG5cbmNvbnN0IG1ha2VSZXF1ZXN0ID0gYXN5bmMgPFQ+KFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogYW55ID0ge31cbik6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+ID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpO1xuXG4gIGlmIChyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGFwaURhdGE6IFQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXBpRGF0YSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIH07XG4gIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICBjb25zdCBhcGlEYXRhOiBBcGlSZXNwb25zZTxUPiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGNvbnN0IGRhdGE6IEFwaVJlc3BvbnNlPFQ+ID0ge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICB0aXRsZTogYXBpRGF0YS50aXRsZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBjb25zdCBhcGlSZXNwb25zZTogQXBpUmVzcG9uc2U8VD4gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgcmV0dXJuIGFwaVJlc3BvbnNlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgYXBpMiB7XG4gIHN0YXRpYyBhc3luYyBmaWx0ZXI8VCwgVEZpbHRlcj4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcG9zdE1vZGVsOiBQb3N0TW9kZWw8VEZpbHRlcj5cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxMaXN0UmVzcG9uc2U8VD4+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcblxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyAuLi5wb3N0TW9kZWwsIC4uLnBvc3RNb2RlbC5maWx0ZXJNb2RlbCB9KSxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8TGlzdFJlc3BvbnNlPFQ+Pih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBwb3N0PFQ+KHVybDogc3RyaW5nLCBib2R5OiBhbnkgPSB7fSk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIH07XG5cbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldDxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIH07XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGU8VD4odXJsOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICB9O1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcHV0PFQ+KHVybDogc3RyaW5nLCBib2R5OiBhbnkgPSB7fSk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZmV0Y2godXJsOiBzdHJpbmcsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaCh1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdGVtcEZldGNoPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IGFueSA9IHt9XG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdXBsb2FkPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGZvcm1EYXRhOiBGb3JtRGF0YVxuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIH07XG5cbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIG5lc3RlZCBvYmplY3QgKG5vdCBudWxsIGFuZCBub3QgYW4gYXJyYXkpLlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgbmVzdGVkIG9iamVjdFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBpc05lc3RlZCA9IChvYmo6IGFueSkgPT4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBvYmogIT09IG51bGw7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXlcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgaXNBcnJheSA9IChvYmo6IGFueSkgPT4gQXJyYXkuaXNBcnJheShvYmopO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGFuIG9iamVjdCBpbnRvIGEgZmxhdCBzdHJ1Y3R1cmUgd2l0aCBkb3Qtbm90YXRpb24ga2V5cy5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gdGFrZXMgYSBuZXN0ZWQgb2JqZWN0IGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgZmxhdCBvYmplY3RcbiAqIHdoZXJlIG5lc3RlZCBwcm9wZXJ0aWVzIGFyZSByZXByZXNlbnRlZCB1c2luZyBkb3Qgbm90YXRpb24uIEl0IGhhbmRsZXMgYm90aFxuICogbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cywgcHJlc2VydmluZyBhbGwgbGV2ZWxzIG9mIHRoZSBvcmlnaW5hbCBzdHJ1Y3R1cmVcbiAqIGFzIHNlcGFyYXRlIGtleXMgaW4gdGhlIHJlc3VsdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgb2JqZWN0IGZsYXR0ZW5pbmc6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IG5lc3RlZCA9IHtcbiAqICAgdXNlcjoge1xuICogICAgIG5hbWU6ICdKb2huJyxcbiAqICAgICBhZGRyZXNzOiB7XG4gKiAgICAgICBjaXR5OiAnTmV3IFlvcmsnLFxuICogICAgICAgemlwOiAnMTAwMDEnXG4gKiAgICAgfVxuICogICB9XG4gKiB9O1xuICpcbiAqIGNvbnN0IGZsYXR0ZW5lZCA9IGZsYXR0ZW5PYmplY3RLZXlzKG5lc3RlZCk7XG4gKiAvLyBSZXN1bHQ6XG4gKiAvLyB7XG4gKiAvLyAgICd1c2VyJzogeyBuYW1lOiAnSm9obicsIGFkZHJlc3M6IHsgY2l0eTogJ05ldyBZb3JrJywgemlwOiAnMTAwMDEnIH0gfSxcbiAqIC8vICAgJ3VzZXIubmFtZSc6ICdKb2huJyxcbiAqIC8vICAgJ3VzZXIuYWRkcmVzcyc6IHsgY2l0eTogJ05ldyBZb3JrJywgemlwOiAnMTAwMDEnIH0sXG4gKiAvLyAgICd1c2VyLmFkZHJlc3MuY2l0eSc6ICdOZXcgWW9yaycsXG4gKiAvLyAgICd1c2VyLmFkZHJlc3MuemlwJzogJzEwMDAxJ1xuICogLy8gfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFycmF5IGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiBjb25zdCB3aXRoQXJyYXlzID0ge1xuICogICBpdGVtczogW1xuICogICAgIHsgaWQ6IDEsIG5hbWU6ICdJdGVtIDEnIH0sXG4gKiAgICAgeyBpZDogMiwgbmFtZTogJ0l0ZW0gMicgfVxuICogICBdXG4gKiB9O1xuICpcbiAqIGNvbnN0IGZsYXR0ZW5lZCA9IGZsYXR0ZW5PYmplY3RLZXlzKHdpdGhBcnJheXMpO1xuICogLy8gUmVzdWx0IGluY2x1ZGVzOlxuICogLy8ge1xuICogLy8gICAnaXRlbXMnOiBbLi4uXSxcbiAqIC8vICAgJ2l0ZW1zLjAnOiB7IGlkOiAxLCBuYW1lOiAnSXRlbSAxJyB9LFxuICogLy8gICAnaXRlbXMuMC5pZCc6IDEsXG4gKiAvLyAgICdpdGVtcy4wLm5hbWUnOiAnSXRlbSAxJyxcbiAqIC8vICAgJ2l0ZW1zLjEnOiB7IGlkOiAyLCBuYW1lOiAnSXRlbSAyJyB9LFxuICogLy8gICAnaXRlbXMuMS5pZCc6IDIsXG4gKiAvLyAgICdpdGVtcy4xLm5hbWUnOiAnSXRlbSAyJ1xuICogLy8gfVxuICogYGBgXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gZmxhdHRlblxuICogQHBhcmFtIHByZWZpeCAtIEludGVybmFsIHBhcmFtZXRlciBmb3IgYnVpbGRpbmcga2V5IHBhdGhzICh1c2VkIGluIHJlY3Vyc2lvbilcbiAqIEByZXR1cm5zIEEgZmxhdCBvYmplY3Qgd2l0aCBkb3Qtbm90YXRpb24ga2V5cyByZXByZXNlbnRpbmcgdGhlIG9yaWdpbmFsIHN0cnVjdHVyZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGZsYXR0ZW5PYmplY3RLZXlzID0gKG9iajogYW55LCBwcmVmaXggPSBcIlwiKSA9PiB7XG4gIGlmICghaXNOZXN0ZWQob2JqKSkge1xuICAgIHJldHVybiB7XG4gICAgICBbcHJlZml4XTogb2JqLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFByZWZpeCA9IHByZWZpeC5sZW5ndGggPyBgJHtwcmVmaXh9LmAgOiBcIlwiO1xuXG4gICAgaWYgKGlzTmVzdGVkKG9ialtrZXldKSAmJiBPYmplY3Qua2V5cyhvYmpba2V5XSkubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNBcnJheShvYmpba2V5XSkgJiYgb2JqW2tleV0ubGVuZ3RoKSB7XG4gICAgICAgIG9ialtrZXldLmZvckVhY2goKGl0ZW06IHVua25vd25bXSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICBhY2MsXG4gICAgICAgICAgICBmbGF0dGVuT2JqZWN0S2V5cyhpdGVtLCBgJHtjdXJyZW50UHJlZml4ICsga2V5fS4ke2luZGV4fWApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3QuYXNzaWduKGFjYywgZmxhdHRlbk9iamVjdEtleXMob2JqW2tleV0sIGN1cnJlbnRQcmVmaXggKyBrZXkpKTtcbiAgICAgIH1cblxuICAgICAgLy8gRXZlbiBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdCwgaXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBrZXkgYXMgd2VsbFxuICAgICAgYWNjW2N1cnJlbnRQcmVmaXggKyBrZXldID0gb2JqW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjY1tjdXJyZW50UHJlZml4ICsga2V5XSA9IG9ialtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBQaWNrZXJWYWxpZERhdGUgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgdHlwZSB7IERheWpzIH0gZnJvbSBcImRheWpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lem9uZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogVERhdGVcbik6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCAhYWRhcHRlci51dGlscy5pc1ZhbGlkKHZhbHVlIGFzIHVua25vd24gYXMgRGF5anMpXG4gICAgPyBudWxsXG4gICAgOiBhZGFwdGVyLnV0aWxzLmdldFRpbWV6b25lKHZhbHVlIGFzIHVua25vd24gYXMgRGF5anMpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIFBhdGgsIFVzZUZvcm1TZXRFcnJvciB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgZmxhdHRlbk9iamVjdEtleXMgfSBmcm9tIFwiLi9mbGF0dGVuT2JqZWN0S2V5c1wiO1xuXG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tIFwiQC90eXBlc1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGhhbmRsZVNlcnZlckVycm9ycyBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmludGVyZmFjZSBIYW5kbGVTZXJ2ZXJFcnJvcnNUeXBlPFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXM+IHtcbiAgLyoqXG4gICAqIFNlcnZlciB2YWxpZGF0aW9uIGVycm9ycyBvYmplY3QgY29udGFpbmluZyBmaWVsZC1zcGVjaWZpYyBlcnJvciBtZXNzYWdlc1xuICAgKiBAZXhhbXBsZSB7IGVtYWlsOiAnRW1haWwgaXMgYWxyZWFkeSB0YWtlbicsIHBhc3N3b3JkOiBbJ1RvbyBzaG9ydCcsICdNdXN0IGNvbnRhaW4gbnVtYmVycyddIH1cbiAgICovXG4gIGVycm9ycz86IFZhbGlkYXRpb25FcnJvcnM7XG4gIC8qKlxuICAgKiBUaGUgc2V0RXJyb3IgZnVuY3Rpb24gZnJvbSByZWFjdC1ob29rLWZvcm0gZm9yIHNldHRpbmcgZmllbGQgZXJyb3JzXG4gICAqL1xuICBzZXRFcnJvcjogVXNlRm9ybVNldEVycm9yPFRGaWVsZFZhbHVlcz47XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHNlcnZlciB2YWxpZGF0aW9uIGVycm9ycyBhbmQgYXBwbGllcyB0aGVtIHRvIHJlYWN0LWhvb2stZm9ybSBmaWVsZHMuXG4gKlxuICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIHRha2VzIHZhbGlkYXRpb24gZXJyb3JzIGZyb20gYSBzZXJ2ZXIgcmVzcG9uc2UgYW5kIGF1dG9tYXRpY2FsbHlcbiAqIGFwcGxpZXMgdGhlbSB0byB0aGUgY29ycmVzcG9uZGluZyBmb3JtIGZpZWxkcyB1c2luZyByZWFjdC1ob29rLWZvcm0ncyBzZXRFcnJvciBmdW5jdGlvbi5cbiAqIEl0IHN1cHBvcnRzIHZhcmlvdXMgZXJyb3IgZm9ybWF0cyBpbmNsdWRpbmcgc3RyaW5ncywgYXJyYXlzIG9mIHN0cmluZ3MsIGFuZCBib29sZWFuIGZsYWdzLlxuICpcbiAqIFRoZSBmdW5jdGlvbiB1c2VzIG9iamVjdCBmbGF0dGVuaW5nIHRvIGhhbmRsZSBuZXN0ZWQgZXJyb3Igc3RydWN0dXJlcyBhbmQgZW5zdXJlc1xuICogdGhhdCBvbmx5IHZhbGlkIGZpZWxkIHBhdGhzIGFyZSBwcm9jZXNzZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc2VydmVyIHJlc3BvbnNlOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VGb3JtKCk7XG4gKlxuICogdHJ5IHtcbiAqICAgYXdhaXQgc3VibWl0Rm9ybShkYXRhKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGhhbmRsZVNlcnZlckVycm9ycyh7XG4gKiAgICAgZXJyb3JzOiBlcnJvci5yZXNwb25zZS5kYXRhLmVycm9ycyxcbiAqICAgICBzZXRFcnJvclxuICogICB9KTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGRpZmZlcmVudCBlcnJvciBmb3JtYXRzOlxuICogYGBgdHN4XG4gKiBjb25zdCBzZXJ2ZXJFcnJvcnMgPSB7XG4gKiAgIGVtYWlsOiAnRW1haWwgaXMgYWxyZWFkeSB0YWtlbicsXG4gKiAgIHBhc3N3b3JkOiBbJ1RvbyBzaG9ydCcsICdNdXN0IGNvbnRhaW4gbnVtYmVycyddLFxuICogICB0ZXJtczogdHJ1ZSAvLyBCb29sZWFuIGZsYWcgaW5kaWNhdGluZyBpbnZhbGlkXG4gKiB9O1xuICpcbiAqIGhhbmRsZVNlcnZlckVycm9ycyh7IGVycm9yczogc2VydmVyRXJyb3JzLCBzZXRFcnJvciB9KTtcbiAqIC8vIFJlc3VsdHMgaW46XG4gKiAvLyAtIGVtYWlsIGZpZWxkIHNob3dzOiBcIkVtYWlsIGlzIGFscmVhZHkgdGFrZW5cIlxuICogLy8gLSBwYXNzd29yZCBmaWVsZCBzaG93czogXCJUb28gc2hvcnQgTXVzdCBjb250YWluIG51bWJlcnNcIlxuICogLy8gLSB0ZXJtcyBmaWVsZCBzaG93czogXCJGaWVsZCBpcyBub3QgdmFsaWQuXCJcbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICpcbiAqIEBwYXJhbSBhcmdzIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyBlcnJvcnMgYW5kIHNldEVycm9yIGZ1bmN0aW9uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgaGFuZGxlU2VydmVyRXJyb3JzID0gZnVuY3Rpb24gaGFuZGxlU2VydmVyRXJyb3JzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzXG4+KGFyZ3M6IEhhbmRsZVNlcnZlckVycm9yc1R5cGU8VEZpZWxkVmFsdWVzPikge1xuICBjb25zdCB7IGVycm9ycywgc2V0RXJyb3IgfSA9IGFyZ3M7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gZXJyb3JzKSB7XG4gICAgY29uc3QgaXNLZXlJblZhcmlhYmxlcyA9IE9iamVjdC5rZXlzKGZsYXR0ZW5PYmplY3RLZXlzKGVycm9ycykpLmluY2x1ZGVzKFxuICAgICAga2V5XG4gICAgKTtcblxuICAgIGlmICghaXNLZXlJblZhcmlhYmxlcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRFcnJvciA9IGVycm9yc1trZXldO1xuXG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IFwiXCI7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZEVycm9yKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gZmllbGRFcnJvci5qb2luKFwiIFwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZpZWxkRXJyb3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IGZpZWxkRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWVsZEVycm9yID09PSBcImJvb2xlYW5cIiAmJiBmaWVsZEVycm9yKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIkZpZWxkIGlzIG5vdCB2YWxpZC5cIjtcbiAgICB9XG5cbiAgICBzZXRFcnJvcihrZXkgYXMgUGF0aDxURmllbGRWYWx1ZXM+LCB7XG4gICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgfSk7XG4gIH1cbn07XG4iLCAiLyoqXG4gKiBUeXBlLXNhZmUgcHJvcGVydHkgZXhpc3RlbmNlIGNoZWNrZXIgdGhhdCBhY3RzIGFzIGEgdHlwZSBndWFyZC5cbiAqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBwcm9wZXJ0eSBleGlzdHMgb24gYW4gb2JqZWN0IGFuZCBuYXJyb3dzIHRoZSBUeXBlU2NyaXB0IHR5cGVcbiAqIHRvIGluY2x1ZGUgdGhhdCBwcm9wZXJ0eS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNhZmVseSBhY2Nlc3NpbmcgcHJvcGVydGllcyBvblxuICogb2JqZWN0cyBvZiB1bmtub3duIHN0cnVjdHVyZSB3aGlsZSBtYWludGFpbmluZyB0eXBlIHNhZmV0eS5cbiAqXG4gKiBAdGVtcGxhdGUgWCAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgY2hlY2tlZFxuICogQHRlbXBsYXRlIFkgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkga2V5IChleHRlbmRzIFByb3BlcnR5S2V5KVxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBwcm9wIC0gVGhlIHByb3BlcnR5IGtleSB0byBjaGVjayBmb3IgZXhpc3RlbmNlXG4gKlxuICogQHJldHVybnMgQSB0eXBlIHByZWRpY2F0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgb2JqZWN0LlxuICogICAgICAgICAgSWYgdHJ1ZSwgdGhlIG9iamVjdCB0eXBlIGlzIG5hcnJvd2VkIHRvIGluY2x1ZGUgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGF0YTogdW5rbm93biA9IHsgbmFtZTogXCJKb2huXCIsIGFnZTogMzAgfTtcbiAqXG4gKiBpZiAocHJvcGVydHlFeGlzdHMoZGF0YSwgXCJuYW1lXCIpKSB7XG4gKiAgIC8vIFR5cGVTY3JpcHQgbm93IGtub3dzIGRhdGEgaGFzIGEgJ25hbWUnIHByb3BlcnR5XG4gKiAgIGNvbnNvbGUubG9nKGRhdGEubmFtZSk7IC8vIFR5cGUtc2FmZSBhY2Nlc3NcbiAqIH1cbiAqXG4gKiAvLyBDaGVjayBmb3IgbmVzdGVkIHByb3BlcnR5IGV4aXN0ZW5jZVxuICogaWYgKHByb3BlcnR5RXhpc3RzKG9iaiwgXCJ1c2VyXCIpICYmIHByb3BlcnR5RXhpc3RzKG9iai51c2VyLCBcImlkXCIpKSB7XG4gKiAgIGNvbnNvbGUubG9nKG9iai51c2VyLmlkKTsgLy8gU2FmZSBuZXN0ZWQgYWNjZXNzXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAc2luY2UgMi4xOC40NVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHlFeGlzdHM8WCwgWSBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgICBvYmo6IFgsXG4gICAgcHJvcDogWVxuKTogb2JqIGlzIFggJiBSZWNvcmQ8WSwgdW5rbm93bj4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgb2JqICE9PSBudWxsICYmXG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApXG4gICAgKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBpY2tlclZhbGlkRGF0ZSB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRWYWx1ZUFzRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IFREYXRlXG4pOiBURGF0ZSB8IG51bGwge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKSBhcyBURGF0ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cbiIsICJleHBvcnQgY29uc3QgcmVtb3ZlTGVhZGluZ1RyYWlsaW5nU2xhc2hlcyA9IChyb3V0ZTogc3RyaW5nKSA9PiB7XHJcbiAgcmV0dXJuIHJvdXRlLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKTtcclxufTtcclxuIiwgImltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBjb25zdCBzY2hlbWFUb29scyA9IHtcbiAgLy8gRGF0ZSB2YWxpZGF0aW9uc1xuICBkYXRlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5jb2VyY2VcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnRyYW5zZm9ybSgoYykgPT4gKGMgPT09IFwibnVsbFwiIHx8IGMgPT09IFwidW5kZWZpbmVkXCIgPyBudWxsIDogYykpXG4gICAgICAucmVmaW5lKChjKSA9PiAhIWMsIHsgbWVzc2FnZTogbWVzc2FnZSB8fCBcIkRhdGUgaXMgcmVxdWlyZWRcIiB9KVxuICAgICAgLnJlZmluZSgoYykgPT4gKGMgPyBkYXlqcyhjKS5pc1ZhbGlkKCkgOiB0cnVlKSwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiSW52YWxpZCBkYXRlXCIsXG4gICAgICB9KSxcblxuICBudWxsYWJsZURhdGU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmNvZXJjZVxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJhbnNmb3JtKChjKSA9PiAoYyA9PT0gXCJudWxsXCIgPyBudWxsIDogYykpXG4gICAgICAudHJhbnNmb3JtKChjKSA9PiAoYyA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBjKSlcbiAgICAgIC5yZWZpbmUoKGMpID0+ICghYyAmJiBjICE9PSBudWxsID8gZGF5anMoYykuaXNWYWxpZCgpIDogdHJ1ZSksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBcIkludmFsaWQgZGF0ZVwiLFxuICAgICAgfSksXG5cbiAgZGF0ZVJhbmdlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5vYmplY3Qoe1xuICAgICAgc3RhcnQ6IHouY29lcmNlLmRhdGUoKSxcbiAgICAgIGVuZDogei5jb2VyY2UuZGF0ZSgpLFxuICAgIH0pLnJlZmluZSgoZGF0YSkgPT4gZGF0YS5zdGFydCA8PSBkYXRhLmVuZCwge1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBcIlN0YXJ0IGRhdGUgbXVzdCBiZSBiZWZvcmUgb3IgZXF1YWwgdG8gZW5kIGRhdGVcIixcbiAgICB9KSxcblxuICAvLyBTdHJpbmcgdmFsaWRhdGlvbnNcbiAgcmVxdWlyZWRTdHJpbmc6ICh7IG1lc3NhZ2UsIG1pbiwgbWF4IH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWluPzogbnVtYmVyOyBtYXg/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICAgIC5taW4obWluIHx8IDEsIG1lc3NhZ2UgfHwgYFN0cmluZyBtdXN0IGJlIGF0IGxlYXN0ICR7bWluIHx8IDF9IGNoYXJhY3RlcnNgKVxuICAgICAgLm1heChtYXggfHwgMjU1LCBtZXNzYWdlIHx8IGBTdHJpbmcgbXVzdCBiZSBhdCBtb3N0ICR7bWF4IHx8IDI1NX0gY2hhcmFjdGVyc2ApLFxuXG4gIGVtYWlsOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKVxuICAgICAgLmVtYWlsKG1lc3NhZ2UgfHwgXCJJbnZhbGlkIGVtYWlsIGFkZHJlc3NcIilcbiAgICAgIC5tYXgoMjU0LCBcIkVtYWlsIG11c3QgYmUgYXQgbW9zdCAyNTQgY2hhcmFjdGVyc1wiKSxcblxuICB1cmw6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LnN0cmluZygpXG4gICAgICAudXJsKG1lc3NhZ2UgfHwgXCJJbnZhbGlkIFVSTCBmb3JtYXRcIiksXG5cbiAgcGhvbmU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LnN0cmluZygpXG4gICAgICAucmVnZXgoL15bXFwrXT9bMS05XVtcXGRdezAsMTV9JC8sIG1lc3NhZ2UgfHwgXCJJbnZhbGlkIHBob25lIG51bWJlciBmb3JtYXRcIiksXG5cbiAgYWxwaGFudW1lcmljOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KC9eW2EtekEtWjAtOV0rJC8sIG1lc3NhZ2UgfHwgXCJPbmx5IGxldHRlcnMgYW5kIG51bWJlcnMgYXJlIGFsbG93ZWRcIiksXG5cbiAgc2x1ZzogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKClcbiAgICAgIC5yZWdleCgvXlthLXowLTldKyg/Oi1bYS16MC05XSspKiQvLCBtZXNzYWdlIHx8IFwiSW52YWxpZCBzbHVnIGZvcm1hdFwiKSxcblxuICAvLyBOdW1iZXIgdmFsaWRhdGlvbnNcbiAgcG9zaXRpdmVOdW1iZXI6ICh7IG1lc3NhZ2UsIG1pbiwgbWF4IH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWluPzogbnVtYmVyOyBtYXg/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHoubnVtYmVyKClcbiAgICAgIC5wb3NpdGl2ZShtZXNzYWdlIHx8IFwiTnVtYmVyIG11c3QgYmUgcG9zaXRpdmVcIilcbiAgICAgIC5taW4obWluIHx8IDAuMDEsIGBOdW1iZXIgbXVzdCBiZSBhdCBsZWFzdCAke21pbiB8fCAwLjAxfWApXG4gICAgICAubWF4KG1heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgYE51bWJlciBtdXN0IGJlIGF0IG1vc3QgJHttYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YCksXG5cbiAgbm9uTmVnYXRpdmVOdW1iZXI6ICh7IG1lc3NhZ2UsIG1heCB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IG1heD86IG51bWJlciB9ID0ge30pID0+XG4gICAgei5udW1iZXIoKVxuICAgICAgLm1pbigwLCBtZXNzYWdlIHx8IFwiTnVtYmVyIG11c3QgYmUgbm9uLW5lZ2F0aXZlXCIpXG4gICAgICAubWF4KG1heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgYE51bWJlciBtdXN0IGJlIGF0IG1vc3QgJHttYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YCksXG5cbiAgaW50ZWdlcjogKHsgbWVzc2FnZSwgbWluLCBtYXggfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtaW4/OiBudW1iZXI7IG1heD86IG51bWJlciB9ID0ge30pID0+XG4gICAgei5udW1iZXIoKVxuICAgICAgLmludChtZXNzYWdlIHx8IFwiTXVzdCBiZSBhbiBpbnRlZ2VyXCIpXG4gICAgICAubWluKG1pbiB8fCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiwgYE51bWJlciBtdXN0IGJlIGF0IGxlYXN0ICR7bWluIHx8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSfWApXG4gICAgICAubWF4KG1heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgYE51bWJlciBtdXN0IGJlIGF0IG1vc3QgJHttYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YCksXG5cbiAgcGVyY2VudGFnZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHoubnVtYmVyKClcbiAgICAgIC5taW4oMCwgbWVzc2FnZSB8fCBcIlBlcmNlbnRhZ2UgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMFwiKVxuICAgICAgLm1heCgxMDAsIG1lc3NhZ2UgfHwgXCJQZXJjZW50YWdlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDBcIiksXG5cbiAgLy8gQXJyYXkgdmFsaWRhdGlvbnNcbiAgbm9uRW1wdHlBcnJheTogPFQ+KHNjaGVtYTogei5ab2RTY2hlbWE8VD4sIHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouYXJyYXkoc2NoZW1hKVxuICAgICAgLm1pbigxLCBtZXNzYWdlIHx8IFwiQXQgbGVhc3Qgb25lIGl0ZW0gaXMgcmVxdWlyZWRcIiksXG5cbiAgdW5pcXVlQXJyYXk6IDxUPihzY2hlbWE6IHouWm9kU2NoZW1hPFQ+LCB7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmFycmF5KHNjaGVtYSlcbiAgICAgIC5yZWZpbmUoKGl0ZW1zKSA9PiBuZXcgU2V0KGl0ZW1zKS5zaXplID09PSBpdGVtcy5sZW5ndGgsIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBcIkFsbCBpdGVtcyBtdXN0IGJlIHVuaXF1ZVwiLFxuICAgICAgfSksXG5cbiAgLy8gQm9vbGVhbiB2YWxpZGF0aW9uc1xuICByZXF1aXJlZEJvb2xlYW46ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmJvb2xlYW4oe1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIixcbiAgICB9KSxcblxuICAvLyBPYmplY3QgdmFsaWRhdGlvbnNcbiAgbm9uRW1wdHlPYmplY3Q6IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHNjaGVtYTogei5ab2RTY2hlbWE8VD4sIHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHNjaGVtYS5yZWZpbmUoKG9iaikgPT4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPiAwLCB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiT2JqZWN0IGNhbm5vdCBiZSBlbXB0eVwiLFxuICAgIH0pLFxuXG4gIC8vIEZpbGUgdmFsaWRhdGlvbnNcbiAgZmlsZVNpemU6ICh7IG1heFNpemUsIG1lc3NhZ2UgfTogeyBtYXhTaXplOiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfSkgPT5cbiAgICB6Lmluc3RhbmNlb2YoRmlsZSlcbiAgICAgIC5yZWZpbmUoKGZpbGUpID0+IGZpbGUuc2l6ZSA8PSBtYXhTaXplLCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgYEZpbGUgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiAke01hdGgucm91bmQobWF4U2l6ZSAvIDEwMjQgLyAxMDI0KX1NQmAsXG4gICAgICB9KSxcblxuICBmaWxlVHlwZTogKHsgYWxsb3dlZFR5cGVzLCBtZXNzYWdlIH06IHsgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXTsgbWVzc2FnZT86IHN0cmluZyB9KSA9PlxuICAgIHouaW5zdGFuY2VvZihGaWxlKVxuICAgICAgLnJlZmluZSgoZmlsZSkgPT4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKGZpbGUudHlwZSksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBgRmlsZSB0eXBlIG11c3QgYmUgb25lIG9mOiAke2FsbG93ZWRUeXBlcy5qb2luKFwiLCBcIil9YCxcbiAgICAgIH0pLFxuXG4gIC8vIEN1c3RvbSB2YWxpZGF0b3JzXG4gIGNvbmRpdGlvbmFsOiA8VCwgVT4oXG4gICAgY29uZGl0aW9uOiAoZGF0YTogVCkgPT4gYm9vbGVhbixcbiAgICB0cnVlU2NoZW1hOiB6LlpvZFNjaGVtYTxVPixcbiAgICBmYWxzZVNjaGVtYTogei5ab2RTY2hlbWE8VT5cbiAgKSA9PlxuICAgIHoudW5pb24oW3RydWVTY2hlbWEsIGZhbHNlU2NoZW1hXSlcbiAgICAgIC5zdXBlclJlZmluZSgoZGF0YSwgY3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNob3VsZFVzZVRydWUgPSBjb25kaXRpb24oZGF0YSBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICBjb25zdCBzY2hlbWEgPSBzaG91bGRVc2VUcnVlID8gdHJ1ZVNjaGVtYSA6IGZhbHNlU2NoZW1hO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuc2FmZVBhcnNlKGRhdGEpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICBjb2RlOiB6LlpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQuZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSksXG5cbiAgdHJhbnNmb3JtOiB7XG4gICAgdG9Mb3dlckNhc2U6IHouc3RyaW5nKCkudHJhbnNmb3JtKCh2YWwpID0+IHZhbC50b0xvd2VyQ2FzZSgpKSxcbiAgICB0b1VwcGVyQ2FzZTogei5zdHJpbmcoKS50cmFuc2Zvcm0oKHZhbCkgPT4gdmFsLnRvVXBwZXJDYXNlKCkpLFxuICAgIHRyaW06IHouc3RyaW5nKCkudHJhbnNmb3JtKCh2YWwpID0+IHZhbC50cmltKCkpLFxuICAgIHRvTnVtYmVyOiB6LnN0cmluZygpLnRyYW5zZm9ybSgodmFsKSA9PiBOdW1iZXIodmFsKSksXG4gICAgdG9Cb29sZWFuOiB6LnN0cmluZygpLnRyYW5zZm9ybSgodmFsKSA9PiB2YWwgPT09IFwidHJ1ZVwiKSxcbiAgICBwYXJzZUpzb246IDxUPihzY2hlbWE6IHouWm9kU2NoZW1hPFQ+KSA9PiBcbiAgICAgIHouc3RyaW5nKCkudHJhbnNmb3JtKCh2YWwsIGN0eCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodmFsKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuc2FmZVBhcnNlKHBhcnNlZCk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgICBcbiAgICAgICAgICBjdHguYWRkSXNzdWUoe1xuICAgICAgICAgICAgY29kZTogei5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0LmVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gei5ORVZFUjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICAgIGNvZGU6IHouWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiSW52YWxpZCBKU09OXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gei5ORVZFUjtcbiAgICAgICAgfVxuICAgICAgfSksXG4gIH0sXG59O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgUGF0aCxcbiAgQ29udHJvbCxcbiAgUGF0aFZhbHVlLFxuICBGaWVsZFZhbHVlcyxcbiAgRGVlcFBhcnRpYWxTa2lwQXJyYXlLZXksXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7IHVzZVdhdGNoIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG4vKipcbiAqIENvcmUgd2F0Y2ggZnVuY3Rpb25zIGZvciBSZWFjdCBIb29rIEZvcm1cbiAqIFRoZXNlIGFyZSB0aGUgcHJpbWFyeSBidWlsZGluZyBibG9ja3MgZm9yIGZvcm0gd2F0Y2hpbmdcbiAqL1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byBlbnN1cmUgYXJyYXkgZWxlbWVudHMgYXJlIGFsbCBQYXRoPFQ+XG4gKi9cbmV4cG9ydCB0eXBlIFBhdGhBcnJheTxUIGV4dGVuZHMgRmllbGRWYWx1ZXM+ID0gUmVhZG9ubHlBcnJheTxQYXRoPFQ+PjtcblxuLyoqXG4gKiBIb29rIHRvIHdhdGNoIGVudGlyZSBmb3JtIC0gcmV0dXJucyBhbGwgZm9ybSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVdhdGNoRm9ybSA9IDxURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcz4oXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPlxuKTogRGVlcFBhcnRpYWxTa2lwQXJyYXlLZXk8VEZpZWxkVmFsdWVzPiA9PiB1c2VXYXRjaCh7IGNvbnRyb2wgfSk7XG5cbi8qKlxuICogSG9vayB0byB3YXRjaCBzaW5nbGUgZmllbGQgYnkgcGF0aCAtIHN1cHBvcnRzIGFueSBuZXN0ZWQgcGF0aFxuICovXG5leHBvcnQgY29uc3QgdXNlV2F0Y2hGaWVsZCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgUGF0aDxURmllbGRWYWx1ZXM+XG4+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXG4gIG5hbWU6IFROYW1lXG4pOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gPT4gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xuXG4vKipcbiAqIEhvb2sgdG8gd2F0Y2ggbXVsdGlwbGUgZmllbGRzIGJ5IHBhdGhzIC0gcmV0dXJucyBhcnJheSBvZiB2YWx1ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVdhdGNoRmllbGRzID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWVzIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxQYXRoPFRGaWVsZFZhbHVlcz4+XG4+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXG4gIG5hbWVzOiBUTmFtZXNcbik6IEFycmF5PFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lc1tudW1iZXJdPj4gPT4gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lOiBuYW1lcyB9KSBhcyBBcnJheTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZXNbbnVtYmVyXT4+O1xuIiwgImltcG9ydCB7IHVzZU1lbW8sIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgUGF0aCxcbiAgQ29udHJvbCxcbiAgUGF0aFZhbHVlLFxuICBGaWVsZFZhbHVlcyxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHsgdXNlV2F0Y2ggfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbi8qKlxuICogVXRpbGl0eSB3YXRjaCBmdW5jdGlvbnMgZm9yIFJlYWN0IEhvb2sgRm9ybVxuICogRW5oYW5jZWQgZnVuY3Rpb25hbGl0eSBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzXG4gKi9cblxuLyoqXG4gKiBXYXRjaCBmaWVsZCB3aXRoIHRyYW5zZm9ybWF0aW9uL3NlbGVjdG9yXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaFRyYW5zZm9ybSA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3V0cHV0XG4+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXG4gIG5hbWU6IFROYW1lLFxuICB0cmFuc2Zvcm06ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUT3V0cHV0XG4pOiBUT3V0cHV0ID0+IHtcbiAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWUgfSk7XG5cbiAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gdHJhbnNmb3JtKHZhbHVlKSwgW3ZhbHVlLCB0cmFuc2Zvcm1dKTtcbn07XG5cbi8qKlxuICogV2F0Y2ggZmllbGQgd2l0aCBkZWZhdWx0IGZhbGxiYWNrIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaERlZmF1bHQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lOiBUTmFtZSxcbiAgZGVmYXVsdFZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbik6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPiA9PiB7XG4gIGNvbnN0IHZhbHVlID0gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xuXG4gIHJldHVybiB2YWx1ZSA/PyBkZWZhdWx0VmFsdWU7XG59O1xuXG4vKipcbiAqIFdhdGNoIGZpZWxkIGFzIGJvb2xlYW4gd2l0aCBndWFyYW50ZWVkIGJvb2xlYW4gcmV0dXJuXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaEJvb2xlYW4gPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lOiBUTmFtZSxcbiAgZGVmYXVsdFZhbHVlID0gZmFsc2Vcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB2YWx1ZSA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZSB9KTtcblxuICByZXR1cm4gQm9vbGVhbih2YWx1ZSA/PyBkZWZhdWx0VmFsdWUpO1xufTtcblxuLyoqXG4gKiBXYXRjaCBtdWx0aXBsZSBmaWVsZHMgYW5kIHJldHVybiBhbiBvYmplY3Qgd2l0aCBmaWVsZCBwYXRocyBhcyBrZXlzXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaEJhdGNoID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVEZpZWxkcyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8UGF0aDxURmllbGRWYWx1ZXM+PlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBmaWVsZHM6IFRGaWVsZHNcbik6IHsgW0sgaW4gVEZpZWxkc1tudW1iZXJdXTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgSz4gfSA9PiB7XG4gIGNvbnN0IHZhbHVlcyA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZTogZmllbGRzIH0pO1xuXG4gIHJldHVybiB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyB7IFtLIGluIFRGaWVsZHNbbnVtYmVyXV06IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIEs+IH07XG5cbiAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICByZXN1bHRbZmllbGQgYXMgVEZpZWxkc1tudW1iZXJdXSA9IHZhbHVlc1tpbmRleF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbdmFsdWVzLCBmaWVsZHNdKTtcbn07XG5cbi8qKlxuICogV2F0Y2ggZmllbGQgY29uZGl0aW9uYWxseSBiYXNlZCBvbiBib29sZWFuIGZsYWdcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVdhdGNoQ29uZGl0aW9uYWwgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lOiBUTmFtZSxcbiAgc2hvdWxkV2F0Y2g6IGJvb2xlYW4sXG4gIGZhbGxiYWNrPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4pOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBhY3RpdmVWYWx1ZSA9IHVzZVdhdGNoKHtcbiAgICBjb250cm9sLFxuICAgIG5hbWUsXG4gICAgZGlzYWJsZWQ6ICFzaG91bGRXYXRjaFxuICB9KTtcblxuICByZXR1cm4gc2hvdWxkV2F0Y2ggPyBhY3RpdmVWYWx1ZSA6IGZhbGxiYWNrO1xufTtcblxuLyoqXG4gKiBXYXRjaCBmaWVsZCB3aXRoIGRlYm91bmNlZCB1cGRhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaERlYm91bmNlZCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgUGF0aDxURmllbGRWYWx1ZXM+XG4+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXG4gIG5hbWU6IFROYW1lLFxuICBkZWxheSA9IDMwMFxuKTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+ID0+IHtcbiAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWUgfSk7XG4gIGNvbnN0IFtkZWJvdW5jZWRWYWx1ZSwgc2V0RGVib3VuY2VkVmFsdWVdID0gdXNlU3RhdGU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+Pih2YWx1ZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc2V0RGVib3VuY2VkVmFsdWUodmFsdWUpO1xuICAgIH0sIGRlbGF5KTtcblxuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9LCBbdmFsdWUsIGRlbGF5XSk7XG5cbiAgcmV0dXJuIGRlYm91bmNlZFZhbHVlO1xufTtcblxuLyoqXG4gKiBXYXRjaCBmaWVsZCB3aXRoIG1lbW9pemVkIHNlbGVjdG9yIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaFNlbGVjdG9yID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPdXRwdXRcbj4oXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPixcbiAgbmFtZTogVE5hbWUsXG4gIHNlbGVjdG9yOiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVE91dHB1dCxcbiAgZGVwczogUmVhY3QuRGVwZW5kZW5jeUxpc3QgPSBbXVxuKTogVE91dHB1dCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xuXG4gIHJldHVybiB1c2VNZW1vKFxuICAgICgpID0+IHNlbGVjdG9yKHZhbHVlKSxcbiAgICBbdmFsdWUsIHNlbGVjdG9yLCAuLi5kZXBzXSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICApO1xufTtcbiIsICIvKipcbiAqIEVuaGFuY2VkIFR5cGVTY3JpcHQgdXRpbGl0aWVzIGZvciBSZWFjdCBIb29rIEZvcm0ncyB1c2VXYXRjaFxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBzZXQgb2YgdHlwZS1zYWZlIHdhdGNoIGZ1bmN0aW9uc1xuICogd2l0aCBiZXR0ZXIgZXJnb25vbWljcyBhbmQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyB1c2VXYXRjaEZpZWxkLCB1c2VXYXRjaEJvb2xlYW4sIHR5cGVkV2F0Y2ggfSBmcm9tICdzcmMvdXRpbHMvd2F0Y2gnO1xuICpcbiAqIC8vIERpcmVjdCB1c2FnZSAoaW5zaWRlIFJlYWN0IGNvbXBvbmVudHMpXG4gKiBjb25zdCBlbWFpbCA9IHVzZVdhdGNoRmllbGQoY29udHJvbCwgJ3VzZXIuZW1haWwnKTtcbiAqIGNvbnN0IGlzQWRtaW4gPSB1c2VXYXRjaEJvb2xlYW4oY29udHJvbCwgJ3VzZXIuaXNBZG1pbicpO1xuICpcbiAqIC8vIE9iamVjdC1iYXNlZCB1c2FnZSAoaW5zaWRlIFJlYWN0IGNvbXBvbmVudHMpXG4gKiBjb25zdCBlbWFpbCA9IHR5cGVkV2F0Y2guZmllbGQoY29udHJvbCwgJ3VzZXIuZW1haWwnKTtcbiAqIGNvbnN0IGlzQWRtaW4gPSB0eXBlZFdhdGNoLmJvb2xlYW4oY29udHJvbCwgJ3VzZXIuaXNBZG1pbicpO1xuICogYGBgXG4gKi9cblxuLy8gQ29yZSBmdW5jdGlvbnNcbmV4cG9ydCB7IHVzZVdhdGNoRm9ybSwgdXNlV2F0Y2hGaWVsZCwgdXNlV2F0Y2hGaWVsZHMgfSBmcm9tICcuL2NvcmUnO1xuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xuZXhwb3J0IHtcbiAgdXNlV2F0Y2hCYXRjaCxcbiAgdXNlV2F0Y2hEZWZhdWx0LFxuICB1c2VXYXRjaEJvb2xlYW4sXG4gIHVzZVdhdGNoU2VsZWN0b3IsXG4gIHVzZVdhdGNoVHJhbnNmb3JtLFxuICB1c2VXYXRjaERlYm91bmNlZCxcbiAgdXNlV2F0Y2hDb25kaXRpb25hbCxcbn0gZnJvbSAnLi91dGlsaXRpZXMnO1xuXG5leHBvcnQgdHlwZSB7IFBhdGhBcnJheSB9IGZyb20gJy4vY29yZSc7XG5cbi8vIEltcG9ydCBhbGwgZnVuY3Rpb25zIGZvciBkZWZhdWx0IGV4cG9ydFxuaW1wb3J0IHsgdXNlV2F0Y2hGb3JtLCB1c2VXYXRjaEZpZWxkLCB1c2VXYXRjaEZpZWxkcyB9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQge1xuICB1c2VXYXRjaEJhdGNoLFxuICB1c2VXYXRjaERlZmF1bHQsXG4gIHVzZVdhdGNoQm9vbGVhbixcbiAgdXNlV2F0Y2hTZWxlY3RvcixcbiAgdXNlV2F0Y2hUcmFuc2Zvcm0sXG4gIHVzZVdhdGNoRGVib3VuY2VkLFxuICB1c2VXYXRjaENvbmRpdGlvbmFsLFxufSBmcm9tICcuL3V0aWxpdGllcyc7XG5cbi8qKlxuICogT3JnYW5pemVkIHV0aWxpdGllcyBieSB1c2UgY2FzZVxuICogUHJvdmlkZXMgYSBjb252ZW5pZW50IG9iamVjdC1iYXNlZCBBUEkgZm9yIGFsbCB3YXRjaCBmdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVkV2F0Y2ggPSB7XG4gIC8vID09PSBDT1JFIEZVTkNUSU9OUyA9PT1cbiAgLyoqIFdhdGNoIGVudGlyZSBmb3JtICovXG4gIGZvcm06IHVzZVdhdGNoRm9ybSxcbiAgLyoqIFdhdGNoIHNpbmdsZSBmaWVsZCAqL1xuICBmaWVsZDogdXNlV2F0Y2hGaWVsZCxcbiAgLyoqIFdhdGNoIG11bHRpcGxlIGZpZWxkcyAqL1xuICBmaWVsZHM6IHVzZVdhdGNoRmllbGRzLFxuXG4gIC8vID09PSBVVElMSVRZIEZVTkNUSU9OUyA9PT1cbiAgLyoqIFdhdGNoIHdpdGggdHJhbnNmb3JtYXRpb24gKi9cbiAgdHJhbnNmb3JtOiB1c2VXYXRjaFRyYW5zZm9ybSxcbiAgLyoqIFdhdGNoIHdpdGggZGVmYXVsdCB2YWx1ZSAqL1xuICB3aXRoRGVmYXVsdDogdXNlV2F0Y2hEZWZhdWx0LFxuICAvKiogV2F0Y2ggYXMgYm9vbGVhbiAqL1xuICBib29sZWFuOiB1c2VXYXRjaEJvb2xlYW4sXG4gIC8qKiBXYXRjaCBtdWx0aXBsZSB3aXRoIGN1c3RvbSBrZXlzICovXG4gIGJhdGNoOiB1c2VXYXRjaEJhdGNoLFxuICAvKiogV2F0Y2ggY29uZGl0aW9uYWxseSAqL1xuICBjb25kaXRpb25hbDogdXNlV2F0Y2hDb25kaXRpb25hbCxcbiAgLyoqIFdhdGNoIHdpdGggZGVib3VuY2luZyAqL1xuICBkZWJvdW5jZWQ6IHVzZVdhdGNoRGVib3VuY2VkLFxuICAvKiogV2F0Y2ggd2l0aCBzZWxlY3RvciAqL1xuICBzZWxlY3RvcjogdXNlV2F0Y2hTZWxlY3Rvcixcbn0gYXMgY29uc3Q7XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBSUEsSUFBTSxjQUFjLE9BQ2xCLEtBQ0EsVUFBZSxDQUFDLE1BQ1k7QUFDNUIsUUFBTSxXQUFXLE1BQU0sTUFBTSxLQUFLLE9BQU87QUFFekMsTUFBSSxTQUFTLElBQUk7QUFDZixVQUFNLFVBQWEsTUFBTSxTQUFTLEtBQUs7QUFFdkMsV0FBTztBQUFBLE1BQ0w7QUFBQSxNQUNBLFFBQVEsU0FBUztBQUFBLElBQ25CO0FBQUEsRUFDRixXQUFXLFNBQVMsV0FBVyxLQUFLO0FBQ2xDLFVBQU0sVUFBMEIsTUFBTSxTQUFTLEtBQUs7QUFFcEQsVUFBTSxPQUF1QjtBQUFBLE1BQzNCLFFBQVEsU0FBUztBQUFBLE1BQ2pCLE9BQU8sUUFBUTtBQUFBLElBQ2pCO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGNBQThCLE1BQU0sU0FBUyxLQUFLO0FBRXhELFNBQU87QUFDVDtBQUVBLElBQXFCLE1BQXJCLE1BQXlCO0FBQUEsRUFDdkIsYUFBYSxPQUNYLEtBQ0EsV0FDdUM7QUFDdkMsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsYUFBYSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQy9EO0FBQUEsTUFFQSxNQUFNLEtBQUssVUFBVSxFQUFFLEdBQUcsV0FBVyxHQUFHLFVBQVUsWUFBWSxDQUFDO0FBQUEsTUFDL0QsUUFBUTtBQUFBLElBQ1Y7QUFFQSxVQUFNLGNBQWMsTUFBTSxZQUE2QixLQUFLLGNBQWM7QUFFMUUsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGFBQWEsS0FBUSxLQUFhLE9BQVksQ0FBQyxHQUE0QjtBQUN6RSxVQUFNLGlCQUFpQjtBQUFBLE1BQ3JCLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWUsVUFBVSxhQUFhLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDL0Q7QUFBQSxNQUNBLE1BQU0sS0FBSyxVQUFVLElBQUk7QUFBQSxNQUN6QixRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sY0FBYyxNQUFNLFlBQWUsS0FBSyxjQUFjO0FBRTVELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLElBQU8sS0FBc0M7QUFDeEQsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsYUFBYSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQy9EO0FBQUEsTUFDQSxRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sT0FBTyxNQUFNLFlBQWUsS0FBSyxjQUFjO0FBRXJELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLE9BQVUsS0FBc0M7QUFDM0QsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsYUFBYSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQy9EO0FBQUEsTUFDQSxRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sT0FBTyxNQUFNLFlBQWUsS0FBSyxjQUFjO0FBRXJELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLElBQU8sS0FBYSxPQUFZLENBQUMsR0FBNEI7QUFDeEUsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsYUFBYSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQy9EO0FBQUEsTUFDQSxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDekIsUUFBUTtBQUFBLElBQ1Y7QUFFQSxVQUFNLGNBQWMsTUFBTSxZQUFlLEtBQUssY0FBYztBQUU1RCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYSxNQUFNLEtBQWEsVUFBZSxDQUFDLEdBQXNCO0FBQ3BFLFVBQU0saUJBQWlCO0FBQUEsTUFDckIsU0FBUztBQUFBLFFBQ1AsZ0JBQWdCO0FBQUEsUUFDaEIsZUFBZSxVQUFVLGFBQWEsUUFBUSxjQUFjLENBQUM7QUFBQSxNQUMvRDtBQUFBLE1BQ0EsR0FBRztBQUFBLElBQ0w7QUFFQSxVQUFNLFNBQVMsTUFBTSxNQUFNLEtBQUssY0FBYztBQUU5QyxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYSxVQUNYLEtBQ0EsVUFBZSxDQUFDLEdBQ1M7QUFDekIsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxNQUNsQjtBQUFBLE1BQ0EsR0FBRztBQUFBLElBQ0w7QUFDQSxVQUFNLGNBQWMsTUFBTSxZQUFlLEtBQUssY0FBYztBQUU1RCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYSxPQUNYLEtBQ0EsVUFDeUI7QUFDekIsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxlQUFlLFVBQVUsYUFBYSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQy9EO0FBQUEsTUFDQSxNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sY0FBYyxNQUFNLFlBQWUsS0FBSyxjQUFjO0FBRTVELFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ3hKQSxJQUFNQSxlQUFjLE9BQ2xCLEtBQ0EsVUFBZSxDQUFDLE1BQ1k7QUFDNUIsUUFBTSxXQUFXLE1BQU0sTUFBTSxLQUFLLE9BQU87QUFFekMsTUFBSSxTQUFTLElBQUk7QUFDZixVQUFNLFVBQWEsTUFBTSxTQUFTLEtBQUs7QUFFdkMsV0FBTztBQUFBLE1BQ0w7QUFBQSxNQUNBLFFBQVEsU0FBUztBQUFBLElBQ25CO0FBQUEsRUFDRixXQUFXLFNBQVMsV0FBVyxLQUFLO0FBQ2xDLFVBQU0sVUFBMEIsTUFBTSxTQUFTLEtBQUs7QUFFcEQsVUFBTSxPQUF1QjtBQUFBLE1BQzNCLFFBQVEsU0FBUztBQUFBLE1BQ2pCLE9BQU8sUUFBUTtBQUFBLElBQ2pCO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGNBQThCLE1BQU0sU0FBUyxLQUFLO0FBRXhELFNBQU87QUFDVDtBQUVBLElBQXFCLE9BQXJCLE1BQTBCO0FBQUEsRUFDeEIsYUFBYSxPQUNYLEtBQ0EsV0FDdUM7QUFDdkMsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsZUFBZSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQ2pFO0FBQUEsTUFFQSxNQUFNLEtBQUssVUFBVSxFQUFFLEdBQUcsV0FBVyxHQUFHLFVBQVUsWUFBWSxDQUFDO0FBQUEsTUFDL0QsUUFBUTtBQUFBLElBQ1Y7QUFFQSxVQUFNLGNBQWMsTUFBTUEsYUFBNkIsS0FBSyxjQUFjO0FBRTFFLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLEtBQVEsS0FBYSxPQUFZLENBQUMsR0FBNEI7QUFDekUsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsZUFBZSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQ2pFO0FBQUEsTUFDQSxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsTUFDekIsUUFBUTtBQUFBLElBQ1Y7QUFFQSxVQUFNLGNBQWMsTUFBTUEsYUFBZSxLQUFLLGNBQWM7QUFFNUQsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLGFBQWEsSUFBTyxLQUFzQztBQUN4RCxVQUFNLGlCQUFpQjtBQUFBLE1BQ3JCLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWUsVUFBVSxlQUFlLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDakU7QUFBQSxNQUNBLFFBQVE7QUFBQSxJQUNWO0FBRUEsVUFBTSxPQUFPLE1BQU1BLGFBQWUsS0FBSyxjQUFjO0FBRXJELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLE9BQVUsS0FBc0M7QUFDM0QsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsZUFBZSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQ2pFO0FBQUEsTUFDQSxRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sT0FBTyxNQUFNQSxhQUFlLEtBQUssY0FBYztBQUVyRCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYSxJQUFPLEtBQWEsT0FBWSxDQUFDLEdBQTRCO0FBQ3hFLFVBQU0saUJBQWlCO0FBQUEsTUFDckIsU0FBUztBQUFBLFFBQ1AsZ0JBQWdCO0FBQUEsUUFDaEIsZUFBZSxVQUFVLGVBQWUsUUFBUSxjQUFjLENBQUM7QUFBQSxNQUNqRTtBQUFBLE1BQ0EsTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLE1BQ3pCLFFBQVE7QUFBQSxJQUNWO0FBRUEsVUFBTSxjQUFjLE1BQU1BLGFBQWUsS0FBSyxjQUFjO0FBRTVELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLE1BQU0sS0FBYSxVQUFlLENBQUMsR0FBc0I7QUFDcEUsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFVBQVUsZUFBZSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQ2pFO0FBQUEsTUFDQSxHQUFHO0FBQUEsSUFDTDtBQUVBLFVBQU0sU0FBUyxNQUFNLE1BQU0sS0FBSyxjQUFjO0FBRTlDLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxhQUFhLFVBQ1gsS0FDQSxVQUFlLENBQUMsR0FDUztBQUN6QixVQUFNLGlCQUFpQjtBQUFBLE1BQ3JCLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLE1BQ2xCO0FBQUEsTUFDQSxHQUFHO0FBQUEsSUFDTDtBQUNBLFVBQU0sY0FBYyxNQUFNQSxhQUFlLEtBQUssY0FBYztBQUU1RCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYSxPQUNYLEtBQ0EsVUFDeUI7QUFDekIsVUFBTSxpQkFBaUI7QUFBQSxNQUNyQixTQUFTO0FBQUEsUUFDUCxlQUFlLFVBQVUsZUFBZSxRQUFRLGNBQWMsQ0FBQztBQUFBLE1BQ2pFO0FBQUEsTUFDQSxNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sY0FBYyxNQUFNQSxhQUFlLEtBQUssY0FBYztBQUU1RCxXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUNwSkEsSUFBTSxXQUFXLENBQUMsUUFBYSxPQUFPLFFBQVEsWUFBWSxRQUFRO0FBVWxFLElBQU0sVUFBVSxDQUFDLFFBQWEsTUFBTSxRQUFRLEdBQUc7QUErRHhDLElBQU0sb0JBQW9CLENBQUMsS0FBVSxTQUFTLE9BQU87QUFDMUQsTUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLFdBQU87QUFBQSxNQUNMLENBQUMsTUFBTSxHQUFHO0FBQUEsSUFDWjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLE9BQU8sS0FBSyxHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUssUUFBUTtBQUMzQyxVQUFNLGdCQUFnQixPQUFPLFNBQVMsR0FBRyxNQUFNLE1BQU07QUFFckQsUUFBSSxTQUFTLElBQUksR0FBRyxDQUFDLEtBQUssT0FBTyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsUUFBUTtBQUN0RCxVQUFJLFFBQVEsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsRUFBRSxRQUFRO0FBQ3hDLFlBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFpQixVQUFrQjtBQUNuRCxpQkFBTztBQUFBLFlBQ0w7QUFBQSxZQUNBLGtCQUFrQixNQUFNLEdBQUcsZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLEVBQUU7QUFBQSxVQUMzRDtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0gsT0FBTztBQUNMLGVBQU8sT0FBTyxLQUFLLGtCQUFrQixJQUFJLEdBQUcsR0FBRyxnQkFBZ0IsR0FBRyxDQUFDO0FBQUEsTUFDckU7QUFHQSxVQUFJLGdCQUFnQixHQUFHLElBQUksSUFBSSxHQUFHO0FBQUEsSUFDcEMsT0FBTztBQUNMLFVBQUksZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLEdBQUc7QUFBQSxJQUNwQztBQUVBLFdBQU87QUFBQSxFQUNULEdBQUcsQ0FBQyxDQUE0QjtBQUNsQzs7O0FDM0dPLFNBQVMsWUFDZCxTQUNBLE9BQ2U7QUFDZixTQUFPLFNBQVMsUUFBUSxDQUFDLFFBQVEsTUFBTSxRQUFRLEtBQXlCLElBQ3BFLE9BQ0EsUUFBUSxNQUFNLFlBQVksS0FBeUI7QUFDekQ7OztBQzZETyxJQUFNLHFCQUFxQixTQUFTQyxvQkFFekMsTUFBNEM7QUFDNUMsUUFBTSxFQUFFLFFBQVEsU0FBUyxJQUFJO0FBRTdCLGFBQVcsT0FBTyxRQUFRO0FBQ3hCLFVBQU0sbUJBQW1CLE9BQU8sS0FBSyxrQkFBa0IsTUFBTSxDQUFDLEVBQUU7QUFBQSxNQUM5RDtBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUMsa0JBQWtCO0FBQ3JCO0FBQUEsSUFDRjtBQUVBLFVBQU0sYUFBYSxPQUFPLEdBQUc7QUFFN0IsUUFBSSxlQUFlO0FBRW5CLFFBQUksTUFBTSxRQUFRLFVBQVUsR0FBRztBQUM3QixxQkFBZSxXQUFXLEtBQUssR0FBRztBQUFBLElBQ3BDO0FBRUEsUUFBSSxPQUFPLGVBQWUsVUFBVTtBQUNsQyxxQkFBZTtBQUFBLElBQ2pCO0FBRUEsUUFBSSxPQUFPLGVBQWUsYUFBYSxZQUFZO0FBQ2pELHFCQUFlO0FBQUEsSUFDakI7QUFFQSxhQUFTLEtBQTJCO0FBQUEsTUFDbEMsU0FBUztBQUFBLElBQ1gsQ0FBQztBQUFBLEVBQ0g7QUFDRjs7O0FDekVPLFNBQVMsZUFDWixLQUNBLE1BQzZCO0FBQzdCLFNBQ0ksT0FBTyxRQUFRLFlBQ2YsUUFBUSxRQUNSLE9BQU8sVUFBVSxlQUFlLEtBQUssS0FBSyxJQUFJO0FBRXREOzs7QUN2Q08sU0FBUyxnQkFDZCxTQUNBLE9BQ2M7QUFDZCxNQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLFFBQUksVUFBVSxJQUFJO0FBQ2hCLGFBQU87QUFBQSxJQUNUO0FBRUEsV0FBTyxRQUFRLE1BQU0sS0FBSyxLQUFLO0FBQUEsRUFDakM7QUFFQSxTQUFPO0FBQ1Q7OztBQ2hCTyxJQUFNLCtCQUErQixDQUFDLFVBQWtCO0FBQzdELFNBQU8sTUFBTSxRQUFRLFlBQVksRUFBRTtBQUNyQzs7O0FDRkEsT0FBTyxXQUFXO0FBQ2xCLFNBQVMsU0FBUztBQUVYLElBQU0sY0FBYztBQUFBO0FBQUEsRUFFekIsTUFBTSxDQUFDLEVBQUUsUUFBUSxJQUEwQixDQUFDLE1BQzFDLEVBQUUsT0FDQyxPQUFPLEVBQ1AsVUFBVSxDQUFDLE1BQU8sTUFBTSxVQUFVLE1BQU0sY0FBYyxPQUFPLENBQUUsRUFDL0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLFdBQVcsbUJBQW1CLENBQUMsRUFDN0QsT0FBTyxDQUFDLE1BQU8sSUFBSSxNQUFNLENBQUMsRUFBRSxRQUFRLElBQUksTUFBTztBQUFBLElBQzlDLFNBQVMsV0FBVztBQUFBLEVBQ3RCLENBQUM7QUFBQSxFQUVMLGNBQWMsQ0FBQyxFQUFFLFFBQVEsSUFBMEIsQ0FBQyxNQUNsRCxFQUFFLE9BQ0MsT0FBTyxFQUNQLFVBQVUsQ0FBQyxNQUFPLE1BQU0sU0FBUyxPQUFPLENBQUUsRUFDMUMsVUFBVSxDQUFDLE1BQU8sTUFBTSxjQUFjLE9BQU8sQ0FBRSxFQUMvQyxPQUFPLENBQUMsTUFBTyxDQUFDLEtBQUssTUFBTSxPQUFPLE1BQU0sQ0FBQyxFQUFFLFFBQVEsSUFBSSxNQUFPO0FBQUEsSUFDN0QsU0FBUyxXQUFXO0FBQUEsRUFDdEIsQ0FBQztBQUFBLEVBRUwsV0FBVyxDQUFDLEVBQUUsUUFBUSxJQUEwQixDQUFDLE1BQy9DLEVBQUUsT0FBTztBQUFBLElBQ1AsT0FBTyxFQUFFLE9BQU8sS0FBSztBQUFBLElBQ3JCLEtBQUssRUFBRSxPQUFPLEtBQUs7QUFBQSxFQUNyQixDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLEtBQUssS0FBSztBQUFBLElBQzFDLFNBQVMsV0FBVztBQUFBLEVBQ3RCLENBQUM7QUFBQTtBQUFBLEVBR0gsZ0JBQWdCLENBQUMsRUFBRSxTQUFTLEtBQUssSUFBSSxJQUFzRCxDQUFDLE1BQzFGLEVBQUUsT0FBTyxFQUNOLEtBQUssRUFDTCxJQUFJLE9BQU8sR0FBRyxXQUFXLDJCQUEyQixPQUFPLENBQUMsYUFBYSxFQUN6RSxJQUFJLE9BQU8sS0FBSyxXQUFXLDBCQUEwQixPQUFPLEdBQUcsYUFBYTtBQUFBLEVBRWpGLE9BQU8sQ0FBQyxFQUFFLFFBQVEsSUFBMEIsQ0FBQyxNQUMzQyxFQUFFLE9BQU8sRUFDTixNQUFNLFdBQVcsdUJBQXVCLEVBQ3hDLElBQUksS0FBSyxzQ0FBc0M7QUFBQSxFQUVwRCxLQUFLLENBQUMsRUFBRSxRQUFRLElBQTBCLENBQUMsTUFDekMsRUFBRSxPQUFPLEVBQ04sSUFBSSxXQUFXLG9CQUFvQjtBQUFBLEVBRXhDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsSUFBMEIsQ0FBQyxNQUMzQyxFQUFFLE9BQU8sRUFDTixNQUFNLDBCQUEwQixXQUFXLDZCQUE2QjtBQUFBLEVBRTdFLGNBQWMsQ0FBQyxFQUFFLFFBQVEsSUFBMEIsQ0FBQyxNQUNsRCxFQUFFLE9BQU8sRUFDTixNQUFNLGtCQUFrQixXQUFXLHNDQUFzQztBQUFBLEVBRTlFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsSUFBMEIsQ0FBQyxNQUMxQyxFQUFFLE9BQU8sRUFDTixNQUFNLDhCQUE4QixXQUFXLHFCQUFxQjtBQUFBO0FBQUEsRUFHekUsZ0JBQWdCLENBQUMsRUFBRSxTQUFTLEtBQUssSUFBSSxJQUFzRCxDQUFDLE1BQzFGLEVBQUUsT0FBTyxFQUNOLFNBQVMsV0FBVyx5QkFBeUIsRUFDN0MsSUFBSSxPQUFPLE1BQU0sMkJBQTJCLE9BQU8sSUFBSSxFQUFFLEVBQ3pELElBQUksT0FBTyxPQUFPLGtCQUFrQiwwQkFBMEIsT0FBTyxPQUFPLGdCQUFnQixFQUFFO0FBQUEsRUFFbkcsbUJBQW1CLENBQUMsRUFBRSxTQUFTLElBQUksSUFBd0MsQ0FBQyxNQUMxRSxFQUFFLE9BQU8sRUFDTixJQUFJLEdBQUcsV0FBVyw2QkFBNkIsRUFDL0MsSUFBSSxPQUFPLE9BQU8sa0JBQWtCLDBCQUEwQixPQUFPLE9BQU8sZ0JBQWdCLEVBQUU7QUFBQSxFQUVuRyxTQUFTLENBQUMsRUFBRSxTQUFTLEtBQUssSUFBSSxJQUFzRCxDQUFDLE1BQ25GLEVBQUUsT0FBTyxFQUNOLElBQUksV0FBVyxvQkFBb0IsRUFDbkMsSUFBSSxPQUFPLE9BQU8sa0JBQWtCLDJCQUEyQixPQUFPLE9BQU8sZ0JBQWdCLEVBQUUsRUFDL0YsSUFBSSxPQUFPLE9BQU8sa0JBQWtCLDBCQUEwQixPQUFPLE9BQU8sZ0JBQWdCLEVBQUU7QUFBQSxFQUVuRyxZQUFZLENBQUMsRUFBRSxRQUFRLElBQTBCLENBQUMsTUFDaEQsRUFBRSxPQUFPLEVBQ04sSUFBSSxHQUFHLFdBQVcsc0NBQXNDLEVBQ3hELElBQUksS0FBSyxXQUFXLHNDQUFzQztBQUFBO0FBQUEsRUFHL0QsZUFBZSxDQUFJLFFBQXdCLEVBQUUsUUFBUSxJQUEwQixDQUFDLE1BQzlFLEVBQUUsTUFBTSxNQUFNLEVBQ1gsSUFBSSxHQUFHLFdBQVcsK0JBQStCO0FBQUEsRUFFdEQsYUFBYSxDQUFJLFFBQXdCLEVBQUUsUUFBUSxJQUEwQixDQUFDLE1BQzVFLEVBQUUsTUFBTSxNQUFNLEVBQ1gsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLEtBQUssRUFBRSxTQUFTLE1BQU0sUUFBUTtBQUFBLElBQ3ZELFNBQVMsV0FBVztBQUFBLEVBQ3RCLENBQUM7QUFBQTtBQUFBLEVBR0wsaUJBQWlCLENBQUMsRUFBRSxRQUFRLElBQTBCLENBQUMsTUFDckQsRUFBRSxRQUFRO0FBQUEsSUFDUixTQUFTLFdBQVc7QUFBQSxFQUN0QixDQUFDO0FBQUE7QUFBQSxFQUdILGdCQUFnQixDQUFvQyxRQUF3QixFQUFFLFFBQVEsSUFBMEIsQ0FBQyxNQUMvRyxPQUFPLE9BQU8sQ0FBQyxRQUFRLE9BQU8sS0FBSyxHQUFHLEVBQUUsU0FBUyxHQUFHO0FBQUEsSUFDbEQsU0FBUyxXQUFXO0FBQUEsRUFDdEIsQ0FBQztBQUFBO0FBQUEsRUFHSCxVQUFVLENBQUMsRUFBRSxTQUFTLFFBQVEsTUFDNUIsRUFBRSxXQUFXLElBQUksRUFDZCxPQUFPLENBQUMsU0FBUyxLQUFLLFFBQVEsU0FBUztBQUFBLElBQ3RDLFNBQVMsV0FBVywrQkFBK0IsS0FBSyxNQUFNLFVBQVUsT0FBTyxJQUFJLENBQUM7QUFBQSxFQUN0RixDQUFDO0FBQUEsRUFFTCxVQUFVLENBQUMsRUFBRSxjQUFjLFFBQVEsTUFDakMsRUFBRSxXQUFXLElBQUksRUFDZCxPQUFPLENBQUMsU0FBUyxhQUFhLFNBQVMsS0FBSyxJQUFJLEdBQUc7QUFBQSxJQUNsRCxTQUFTLFdBQVcsNkJBQTZCLGFBQWEsS0FBSyxJQUFJLENBQUM7QUFBQSxFQUMxRSxDQUFDO0FBQUE7QUFBQSxFQUdMLGFBQWEsQ0FDWCxXQUNBLFlBQ0EsZ0JBRUEsRUFBRSxNQUFNLENBQUMsWUFBWSxXQUFXLENBQUMsRUFDOUIsWUFBWSxDQUFDLE1BQU0sUUFBUTtBQUMxQixVQUFNLGdCQUFnQixVQUFVLElBQW9CO0FBQ3BELFVBQU0sU0FBUyxnQkFBZ0IsYUFBYTtBQUM1QyxVQUFNLFNBQVMsT0FBTyxVQUFVLElBQUk7QUFFcEMsUUFBSSxDQUFDLE9BQU8sU0FBUztBQUNuQixVQUFJLFNBQVM7QUFBQSxRQUNYLE1BQU0sRUFBRSxhQUFhO0FBQUEsUUFDckIsU0FBUyxPQUFPLE1BQU07QUFBQSxNQUN4QixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0YsQ0FBQztBQUFBLEVBRUwsV0FBVztBQUFBLElBQ1QsYUFBYSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxJQUFJLFlBQVksQ0FBQztBQUFBLElBQzVELGFBQWEsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUM7QUFBQSxJQUM1RCxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDO0FBQUEsSUFDOUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUFBLElBQ25ELFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsUUFBUSxNQUFNO0FBQUEsSUFDdkQsV0FBVyxDQUFJLFdBQ2IsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLEtBQUssUUFBUTtBQUNqQyxVQUFJO0FBQ0YsY0FBTSxTQUFTLEtBQUssTUFBTSxHQUFHO0FBQzdCLGNBQU0sU0FBUyxPQUFPLFVBQVUsTUFBTTtBQUV0QyxZQUFJLE9BQU8sUUFBUyxRQUFPLE9BQU87QUFFbEMsWUFBSSxTQUFTO0FBQUEsVUFDWCxNQUFNLEVBQUUsYUFBYTtBQUFBLFVBQ3JCLFNBQVMsT0FBTyxNQUFNO0FBQUEsUUFDeEIsQ0FBQztBQUVELGVBQU8sRUFBRTtBQUFBLE1BQ1gsUUFBUTtBQUNOLFlBQUksU0FBUztBQUFBLFVBQ1gsTUFBTSxFQUFFLGFBQWE7QUFBQSxVQUNyQixTQUFTO0FBQUEsUUFDWCxDQUFDO0FBRUQsZUFBTyxFQUFFO0FBQUEsTUFDWDtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0w7QUFDRjs7O0FDaktBLFNBQVMsZ0JBQWdCO0FBZWxCLElBQU0sZUFBZSxDQUMxQixZQUMwQyxTQUFTLEVBQUUsUUFBUSxDQUFDO0FBS3pELElBQU0sZ0JBQWdCLENBSTNCLFNBQ0EsU0FDbUMsU0FBUyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBS3hELElBQU0saUJBQWlCLENBSTVCLFNBQ0EsVUFDbUQsU0FBUyxFQUFFLFNBQVMsTUFBTSxNQUFNLENBQUM7OztBQzlDdEYsU0FBUyxTQUFTLFVBQVUsaUJBQWlCO0FBTzdDLFNBQVMsWUFBQUMsaUJBQWdCO0FBVWxCLElBQU0sb0JBQW9CLENBSy9CLFNBQ0EsTUFDQSxjQUNZO0FBQ1osUUFBTSxRQUFRQSxVQUFTLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFFeEMsU0FBTyxRQUFRLE1BQU0sVUFBVSxLQUFLLEdBQUcsQ0FBQyxPQUFPLFNBQVMsQ0FBQztBQUMzRDtBQUtPLElBQU0sa0JBQWtCLENBSTdCLFNBQ0EsTUFDQSxpQkFDbUM7QUFDbkMsUUFBTSxRQUFRQSxVQUFTLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFFeEMsU0FBTyxTQUFTO0FBQ2xCO0FBS08sSUFBTSxrQkFBa0IsQ0FJN0IsU0FDQSxNQUNBLGVBQWUsVUFDSDtBQUNaLFFBQU0sUUFBUUEsVUFBUyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBRXhDLFNBQU8sUUFBUSxTQUFTLFlBQVk7QUFDdEM7QUFLTyxJQUFNLGdCQUFnQixDQUkzQixTQUNBLFdBQzJEO0FBQzNELFFBQU0sU0FBU0EsVUFBUyxFQUFFLFNBQVMsTUFBTSxPQUFPLENBQUM7QUFFakQsU0FBTyxRQUFRLE1BQU07QUFDbkIsVUFBTSxTQUFTLENBQUM7QUFFaEIsV0FBTyxRQUFRLENBQUMsT0FBTyxVQUFVO0FBQy9CLGFBQU8sS0FBd0IsSUFBSSxPQUFPLEtBQUs7QUFBQSxJQUNqRCxDQUFDO0FBRUQsV0FBTztBQUFBLEVBQ1QsR0FBRyxDQUFDLFFBQVEsTUFBTSxDQUFDO0FBQ3JCO0FBS08sSUFBTSxzQkFBc0IsQ0FJakMsU0FDQSxNQUNBLGFBQ0EsYUFDK0M7QUFDL0MsUUFBTSxjQUFjQSxVQUFTO0FBQUEsSUFDM0I7QUFBQSxJQUNBO0FBQUEsSUFDQSxVQUFVLENBQUM7QUFBQSxFQUNiLENBQUM7QUFFRCxTQUFPLGNBQWMsY0FBYztBQUNyQztBQUtPLElBQU0sb0JBQW9CLENBSS9CLFNBQ0EsTUFDQSxRQUFRLFFBQzJCO0FBQ25DLFFBQU0sUUFBUUEsVUFBUyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ3hDLFFBQU0sQ0FBQyxnQkFBZ0IsaUJBQWlCLElBQUksU0FBeUMsS0FBSztBQUUxRixZQUFVLE1BQU07QUFDZCxVQUFNLFFBQVEsV0FBVyxNQUFNO0FBQzdCLHdCQUFrQixLQUFLO0FBQUEsSUFDekIsR0FBRyxLQUFLO0FBRVIsV0FBTyxNQUFNLGFBQWEsS0FBSztBQUFBLEVBQ2pDLEdBQUcsQ0FBQyxPQUFPLEtBQUssQ0FBQztBQUVqQixTQUFPO0FBQ1Q7QUFLTyxJQUFNLG1CQUFtQixDQUs5QixTQUNBLE1BQ0EsVUFDQSxPQUE2QixDQUFDLE1BQ2xCO0FBQ1osUUFBTSxRQUFRQSxVQUFTLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFFeEMsU0FBTztBQUFBLElBQ0wsTUFBTSxTQUFTLEtBQUs7QUFBQSxJQUNwQixDQUFDLE9BQU8sVUFBVSxHQUFHLElBQUk7QUFBQTtBQUFBLEVBQzNCO0FBQ0Y7OztBQ25HTyxJQUFNLGFBQWE7QUFBQTtBQUFBO0FBQUEsRUFHeEIsTUFBTTtBQUFBO0FBQUEsRUFFTixPQUFPO0FBQUE7QUFBQSxFQUVQLFFBQVE7QUFBQTtBQUFBO0FBQUEsRUFJUixXQUFXO0FBQUE7QUFBQSxFQUVYLGFBQWE7QUFBQTtBQUFBLEVBRWIsU0FBUztBQUFBO0FBQUEsRUFFVCxPQUFPO0FBQUE7QUFBQSxFQUVQLGFBQWE7QUFBQTtBQUFBLEVBRWIsV0FBVztBQUFBO0FBQUEsRUFFWCxVQUFVO0FBQ1o7IiwKICAibmFtZXMiOiBbIm1ha2VSZXF1ZXN0IiwgImhhbmRsZVNlcnZlckVycm9ycyIsICJ1c2VXYXRjaCJdCn0K