@gnwebsoft/ui 4.0.11 → 4.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2450 @@
1
+ import {
2
+ useEnhancedTransform,
3
+ useTransform
4
+ } from "./chunk-GVWCGJ3F.js";
5
+ import {
6
+ readValueAsDate
7
+ } from "./chunk-FYU2OIMD.js";
8
+
9
+ // src/wrappers/types/common.ts
10
+ function isValidOption(value) {
11
+ return typeof value === "object" && value !== null && "Label" in value && "Value" in value && typeof value.Label === "string" && (typeof value.Value === "string" || typeof value.Value === "number" || typeof value.Value === "boolean");
12
+ }
13
+ function normalizeOptions(options, labelField = "Label", valueField = "Value") {
14
+ return options.map((option) => ({
15
+ Label: String(option[labelField] ?? ""),
16
+ Value: option[valueField],
17
+ disabled: Boolean(option.disabled)
18
+ }));
19
+ }
20
+
21
+ // src/wrappers/AsyncMultiSelect/AsyncMultiSelect.tsx
22
+ import {
23
+ Autocomplete,
24
+ CircularProgress,
25
+ Grid,
26
+ TextField
27
+ } from "@mui/material";
28
+ import match from "autosuggest-highlight/match";
29
+ import parse from "autosuggest-highlight/parse";
30
+ import _, { debounce } from "lodash";
31
+ import {
32
+ useState,
33
+ useRef,
34
+ useMemo,
35
+ useEffect,
36
+ useCallback,
37
+ Fragment
38
+ } from "react";
39
+ import { useController } from "react-hook-form";
40
+ import { jsx, jsxs } from "react/jsx-runtime";
41
+ var Component = function AsyncSelectMultiElement(props) {
42
+ const {
43
+ name,
44
+ disabled,
45
+ control,
46
+ placeholder,
47
+ initialValues,
48
+ label,
49
+ queryFn,
50
+ variant,
51
+ labelField = "Label",
52
+ valueField = "Value",
53
+ ...rest
54
+ } = props;
55
+ const {
56
+ field,
57
+ fieldState: { error }
58
+ } = useController({
59
+ name,
60
+ control
61
+ });
62
+ const multiSelectRef = useRef(null);
63
+ const [selectedOptions, setSelectedOptions] = useState([]);
64
+ const [inputValue, setInputValue] = useState("");
65
+ const [options, setOptions] = useState([]);
66
+ const [loading, setLoading] = useState(false);
67
+ const initialValuesLoaded = useRef(
68
+ !(initialValues && initialValues.length > 0)
69
+ );
70
+ const inputValue2 = useMemo(() => inputValue, [inputValue]);
71
+ const setInputValue2 = useCallback(
72
+ (inputValue3) => setInputValue(inputValue3),
73
+ []
74
+ );
75
+ const fetchData = useMemo(
76
+ () => debounce(
77
+ (payload, callback) => {
78
+ queryFn(payload).then((c) => callback(c));
79
+ },
80
+ 400
81
+ ),
82
+ [queryFn]
83
+ );
84
+ const fillOptions = useCallback(
85
+ (results) => {
86
+ let newOptions = [];
87
+ if (selectedOptions) {
88
+ newOptions = [...selectedOptions];
89
+ }
90
+ if (results) {
91
+ const newlyAdded = _.differenceBy(
92
+ results,
93
+ selectedOptions,
94
+ (c) => c[valueField]
95
+ );
96
+ newOptions = [...newOptions, ...newlyAdded];
97
+ }
98
+ setOptions(newOptions);
99
+ setLoading(false);
100
+ },
101
+ [selectedOptions, valueField]
102
+ );
103
+ useEffect(() => {
104
+ if (initialValuesLoaded.current) return void 0;
105
+ let active = true;
106
+ const payload = {
107
+ query: null,
108
+ initialValues
109
+ };
110
+ setLoading(true);
111
+ fetchData(payload, (results) => {
112
+ if (active && results) {
113
+ setSelectedOptions([...results]);
114
+ field.onChange([...results.map((c) => c[valueField])]);
115
+ initialValuesLoaded.current = true;
116
+ setLoading(false);
117
+ }
118
+ });
119
+ return () => {
120
+ active = false;
121
+ };
122
+ }, [initialValues, fetchData, field, valueField]);
123
+ useEffect(() => {
124
+ let active = true;
125
+ if (inputValue2 === "" || initialValuesLoaded.current === false) {
126
+ setOptions(selectedOptions ? [...selectedOptions] : []);
127
+ return void 0;
128
+ }
129
+ setLoading(true);
130
+ const payload = {
131
+ query: inputValue2,
132
+ initialValues: null
133
+ };
134
+ fetchData(payload, (results) => {
135
+ if (active) {
136
+ fillOptions(results);
137
+ }
138
+ });
139
+ return () => {
140
+ active = false;
141
+ };
142
+ }, [initialValues, inputValue2, fetchData, selectedOptions, fillOptions]);
143
+ const handleChange = (_2, newSelectedOptions, reason) => {
144
+ if (reason === "clear" || newSelectedOptions.length === 0) {
145
+ setSelectedOptions([]);
146
+ field.onChange([]);
147
+ } else if (reason === "selectOption" || reason === "removeOption") {
148
+ setSelectedOptions(newSelectedOptions);
149
+ field.onChange(newSelectedOptions.map((c) => c[valueField]));
150
+ }
151
+ setOptions([]);
152
+ };
153
+ const getOptionValue = (option) => {
154
+ return option ? String(option[valueField]) : "";
155
+ };
156
+ const getOptionLabel = (option) => {
157
+ return option ? String(option[labelField]) : "";
158
+ };
159
+ return /* @__PURE__ */ jsx(
160
+ Autocomplete,
161
+ {
162
+ ref: multiSelectRef,
163
+ multiple: true,
164
+ loading,
165
+ getOptionLabel,
166
+ getOptionKey: getOptionValue,
167
+ isOptionEqualToValue: (option, val) => getOptionValue(option) === getOptionValue(val),
168
+ options,
169
+ value: selectedOptions,
170
+ disabled,
171
+ filterSelectedOptions: true,
172
+ onChange: handleChange,
173
+ onInputChange: (_2, newInputValue) => {
174
+ setInputValue2(newInputValue);
175
+ },
176
+ renderInput: (params) => /* @__PURE__ */ jsx(
177
+ TextField,
178
+ {
179
+ ...params,
180
+ label,
181
+ error: !!error,
182
+ helperText: error ? error.message : "",
183
+ placeholder,
184
+ slotProps: {
185
+ input: {
186
+ ...params.InputProps,
187
+ endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
188
+ loading ? /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: 20 }) : null,
189
+ params.InputProps.endAdornment
190
+ ] })
191
+ }
192
+ },
193
+ variant: variant ? variant : "outlined"
194
+ }
195
+ ),
196
+ renderOption: (props2, option, state) => {
197
+ const { key, ...optionProps } = props2;
198
+ const optionLabel = getOptionLabel(option);
199
+ const matches = match(optionLabel, state.inputValue, { insideWords: true });
200
+ const parts = parse(optionLabel, matches);
201
+ return /* @__PURE__ */ jsx("li", { ...optionProps, children: /* @__PURE__ */ jsx("div", { children: parts.map((part, index) => /* @__PURE__ */ jsx(
202
+ "span",
203
+ {
204
+ style: {
205
+ fontWeight: part.highlight ? 700 : 400
206
+ },
207
+ children: part.text
208
+ },
209
+ index
210
+ )) }) }, key);
211
+ },
212
+ ...rest
213
+ }
214
+ );
215
+ };
216
+ var AsyncSelectMultiElement2 = ({
217
+ gridProps,
218
+ ...props
219
+ }) => {
220
+ if (gridProps) {
221
+ return /* @__PURE__ */ jsx(
222
+ Grid,
223
+ {
224
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
225
+ children: /* @__PURE__ */ jsx(
226
+ Component,
227
+ {
228
+ ...props
229
+ }
230
+ )
231
+ }
232
+ );
233
+ }
234
+ return /* @__PURE__ */ jsx(Component, { ...props });
235
+ };
236
+ AsyncSelectMultiElement2.displayName = "AsyncSelectMulti";
237
+
238
+ // src/wrappers/AsyncMultiSelect2/AsyncMultiSelect2.tsx
239
+ import {
240
+ Autocomplete as Autocomplete2,
241
+ CircularProgress as CircularProgress2,
242
+ Grid as Grid2,
243
+ TextField as TextField2
244
+ } from "@mui/material";
245
+ import { debounce as debounce2 } from "lodash";
246
+ import { useCallback as useCallback2, useEffect as useEffect2, useReducer, useMemo as useMemo2 } from "react";
247
+ import { useController as useController2 } from "react-hook-form";
248
+ import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
249
+ var initialState = {
250
+ options: [],
251
+ selectedOptions: [],
252
+ inputValue: "",
253
+ loading: false,
254
+ initialLoaded: false
255
+ };
256
+ function componentReducer(state, action) {
257
+ switch (action.type) {
258
+ case "SET_OPTIONS":
259
+ return { ...state, options: action.payload, loading: false };
260
+ case "SET_SELECTED_OPTIONS":
261
+ return { ...state, selectedOptions: action.payload };
262
+ case "SET_INPUT_VALUE":
263
+ return { ...state, inputValue: action.payload };
264
+ case "SET_LOADING":
265
+ return { ...state, loading: action.payload };
266
+ case "SET_INITIAL_LOADED":
267
+ return { ...state, initialLoaded: action.payload };
268
+ case "RESET_OPTIONS":
269
+ return { ...state, options: state.selectedOptions };
270
+ default:
271
+ return state;
272
+ }
273
+ }
274
+ var AsyncMultiSelect2Component = ({
275
+ name,
276
+ control,
277
+ placeholder,
278
+ initialValues,
279
+ label,
280
+ queryFn,
281
+ variant = "outlined",
282
+ disabled = false,
283
+ debounceMs = 400,
284
+ loadingText = "Loading...",
285
+ noOptionsText = "No options",
286
+ renderInput,
287
+ ...rest
288
+ }) => {
289
+ const [state, dispatch] = useReducer(componentReducer, initialState);
290
+ const {
291
+ field,
292
+ fieldState: { error }
293
+ } = useController2({
294
+ name,
295
+ control
296
+ });
297
+ const debouncedFetch = useMemo2(
298
+ () => debounce2(async (payload) => {
299
+ try {
300
+ const results = await queryFn(payload);
301
+ const mergedOptions = [
302
+ ...state.selectedOptions,
303
+ ...results.filter(
304
+ (option) => !state.selectedOptions.some(
305
+ (selected) => selected.value === option.value
306
+ )
307
+ )
308
+ ];
309
+ dispatch({ type: "SET_OPTIONS", payload: mergedOptions });
310
+ } catch (_error) {
311
+ dispatch({ type: "SET_LOADING", payload: false });
312
+ }
313
+ }, debounceMs),
314
+ [queryFn, state.selectedOptions, debounceMs]
315
+ );
316
+ useEffect2(() => {
317
+ if (!initialValues?.length || state.initialLoaded) return;
318
+ dispatch({ type: "SET_LOADING", payload: true });
319
+ const payload = {
320
+ query: null,
321
+ initialValues
322
+ };
323
+ queryFn(payload).then((results) => {
324
+ if (results) {
325
+ dispatch({ type: "SET_SELECTED_OPTIONS", payload: results });
326
+ dispatch({ type: "SET_OPTIONS", payload: results });
327
+ dispatch({ type: "SET_INITIAL_LOADED", payload: true });
328
+ field.onChange(results.map((option) => option.value));
329
+ }
330
+ dispatch({ type: "SET_LOADING", payload: false });
331
+ }).catch((_error) => {
332
+ dispatch({ type: "SET_LOADING", payload: false });
333
+ });
334
+ }, [initialValues, state.initialLoaded, queryFn, field]);
335
+ useEffect2(() => {
336
+ if (!state.initialLoaded) return;
337
+ if (state.inputValue === "") {
338
+ dispatch({ type: "RESET_OPTIONS" });
339
+ return;
340
+ }
341
+ dispatch({ type: "SET_LOADING", payload: true });
342
+ const payload = {
343
+ query: state.inputValue,
344
+ initialValues: null
345
+ };
346
+ debouncedFetch(payload);
347
+ }, [state.inputValue, state.initialLoaded, debouncedFetch]);
348
+ const handleChange = useCallback2(
349
+ (event, newValue) => {
350
+ dispatch({ type: "SET_SELECTED_OPTIONS", payload: newValue });
351
+ field.onChange(newValue.map((option) => option.value));
352
+ },
353
+ [field]
354
+ );
355
+ const handleInputChange = useCallback2(
356
+ (event, newInputValue) => {
357
+ dispatch({ type: "SET_INPUT_VALUE", payload: newInputValue });
358
+ },
359
+ []
360
+ );
361
+ const isOptionEqualToValue = useCallback2(
362
+ (option, value) => option.value === value.value,
363
+ []
364
+ );
365
+ const getOptionLabel = useCallback2((option) => option.label, []);
366
+ const defaultRenderInput = useCallback2(
367
+ (params) => /* @__PURE__ */ jsx2(
368
+ TextField2,
369
+ {
370
+ ...params,
371
+ label,
372
+ placeholder,
373
+ variant,
374
+ error: !!error,
375
+ helperText: error?.message,
376
+ slotProps: {
377
+ input: {
378
+ ...params.InputProps,
379
+ endAdornment: /* @__PURE__ */ jsxs2(Fragment2, { children: [
380
+ state.loading && /* @__PURE__ */ jsx2(CircularProgress2, { color: "inherit", size: 20 }),
381
+ params.InputProps.endAdornment
382
+ ] })
383
+ }
384
+ }
385
+ }
386
+ ),
387
+ [
388
+ label,
389
+ placeholder,
390
+ variant,
391
+ error,
392
+ state.loading
393
+ ]
394
+ );
395
+ return /* @__PURE__ */ jsx2(
396
+ Autocomplete2,
397
+ {
398
+ multiple: true,
399
+ options: state.options,
400
+ value: state.selectedOptions,
401
+ loading: state.loading,
402
+ disabled,
403
+ isOptionEqualToValue,
404
+ getOptionLabel,
405
+ filterSelectedOptions: true,
406
+ onChange: handleChange,
407
+ onInputChange: handleInputChange,
408
+ loadingText,
409
+ noOptionsText,
410
+ renderInput: renderInput || defaultRenderInput,
411
+ ...rest
412
+ }
413
+ );
414
+ };
415
+ var AsyncMultiSelect2 = ({
416
+ gridProps = {},
417
+ ...props
418
+ }) => {
419
+ return /* @__PURE__ */ jsx2(Grid2, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx2(AsyncMultiSelect2Component, { ...props }) });
420
+ };
421
+ AsyncMultiSelect2.displayName = "AsyncMultiSelect2";
422
+
423
+ // src/wrappers/CheckboxElement/CheckboxElement.tsx
424
+ import {
425
+ Checkbox,
426
+ FormControl,
427
+ FormControlLabel,
428
+ FormGroup,
429
+ FormHelperText,
430
+ Grid as Grid3
431
+ } from "@mui/material";
432
+ import { useController as useController3 } from "react-hook-form";
433
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
434
+ var Component2 = function CheckboxElement(props) {
435
+ const {
436
+ name,
437
+ control,
438
+ label,
439
+ labelProps,
440
+ helperText,
441
+ parseError,
442
+ transform,
443
+ disabled,
444
+ onChange: customOnChange,
445
+ ...rest
446
+ } = props;
447
+ const {
448
+ field,
449
+ fieldState: { error }
450
+ } = useController3({
451
+ name,
452
+ control,
453
+ disabled
454
+ });
455
+ if (field.value == null || field.value == void 0) {
456
+ field.onChange(false);
457
+ }
458
+ const customOutputTransform = transform?.output;
459
+ const { value, onChange } = useTransform({
460
+ value: field.value,
461
+ onChange: field.onChange,
462
+ transform: {
463
+ input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
464
+ output: typeof customOutputTransform === "function" ? (eventOrValue, _value) => {
465
+ const event = eventOrValue;
466
+ const checked = _value;
467
+ return customOutputTransform(event, checked);
468
+ } : (eventOrValue, _value) => {
469
+ const checked = _value;
470
+ return checked;
471
+ }
472
+ }
473
+ });
474
+ const handleChange = (event, checked) => {
475
+ onChange(event, checked);
476
+ if (typeof customOnChange === "function") {
477
+ customOnChange(event, checked);
478
+ }
479
+ };
480
+ const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
481
+ return /* @__PURE__ */ jsxs3(FormControl, { error: !!error, disabled, children: [
482
+ /* @__PURE__ */ jsx3(FormGroup, { row: true, children: /* @__PURE__ */ jsx3(
483
+ FormControlLabel,
484
+ {
485
+ label: label || "",
486
+ ...labelProps,
487
+ disabled,
488
+ control: /* @__PURE__ */ jsx3(
489
+ Checkbox,
490
+ {
491
+ ...rest,
492
+ color: rest.color || "primary",
493
+ checked: value,
494
+ disabled,
495
+ onChange: handleChange,
496
+ ref: field.ref
497
+ }
498
+ )
499
+ }
500
+ ) }),
501
+ (displayError || helperText) && /* @__PURE__ */ jsx3(FormHelperText, { error: !!error, children: displayError || helperText })
502
+ ] });
503
+ };
504
+ var CheckboxElement2 = ({
505
+ gridProps = {},
506
+ ...props
507
+ }) => {
508
+ return /* @__PURE__ */ jsx3(Grid3, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx3(Component2, { ...props }) });
509
+ };
510
+
511
+ // src/wrappers/CheckboxGroup/CheckboxGroup.tsx
512
+ import {
513
+ Checkbox as Checkbox2,
514
+ FormControl as FormControl2,
515
+ FormControlLabel as FormControlLabel2,
516
+ FormGroup as FormGroup2,
517
+ FormHelperText as FormHelperText2,
518
+ Grid as Grid4
519
+ } from "@mui/material";
520
+ import { useCallback as useCallback3, useEffect as useEffect3, useState as useState2 } from "react";
521
+ import { useController as useController4 } from "react-hook-form";
522
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
523
+ var Component3 = function CheckboxGroup(props) {
524
+ const { name, control, labelProps, options, ...rest } = props;
525
+ const {
526
+ field,
527
+ fieldState: { error }
528
+ } = useController4({
529
+ name,
530
+ control,
531
+ disabled: rest.disabled
532
+ });
533
+ const [selectedValues, setSelectedValues] = useState2(
534
+ options.filter((c) => field.value?.includes(c.Value)).map((c) => c.Value) || []
535
+ );
536
+ useEffect3(() => {
537
+ field.onChange(selectedValues ? [...selectedValues] : []);
538
+ }, [selectedValues, field]);
539
+ const handleChange = useCallback3((event) => {
540
+ const value = Number.parseInt(event.target.value, 10);
541
+ if (Number.isNaN(value)) {
542
+ return;
543
+ }
544
+ if (event.target.checked) {
545
+ setSelectedValues((prev) => [...prev, value]);
546
+ } else {
547
+ setSelectedValues((prev) => prev.filter((item) => item !== value));
548
+ }
549
+ }, []);
550
+ return /* @__PURE__ */ jsxs4(FormControl2, { error: !!error, children: [
551
+ /* @__PURE__ */ jsx4(FormGroup2, { row: true, children: options.map((option) => /* @__PURE__ */ jsx4(
552
+ FormControlLabel2,
553
+ {
554
+ label: option.Label,
555
+ ...labelProps,
556
+ control: /* @__PURE__ */ jsx4(
557
+ Checkbox2,
558
+ {
559
+ ...rest,
560
+ color: rest.color || "primary",
561
+ value: option.Value,
562
+ checked: selectedValues.includes(option.Value),
563
+ onChange: handleChange
564
+ }
565
+ )
566
+ },
567
+ `${option.Value}`
568
+ )) }),
569
+ error && /* @__PURE__ */ jsx4(FormHelperText2, { error: !!error, children: error.message })
570
+ ] });
571
+ };
572
+ var CheckboxGroup2 = ({
573
+ gridProps = {},
574
+ ...props
575
+ }) => {
576
+ return /* @__PURE__ */ jsx4(Grid4, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx4(Component3, { ...props }) });
577
+ };
578
+ CheckboxGroup2.displayName = "CheckboxGroup";
579
+
580
+ // src/wrappers/DatePickerElement/DatePickerElement.tsx
581
+ import { Grid as Grid5 } from "@mui/material";
582
+ import { forwardRef as forwardRef2 } from "react";
583
+
584
+ // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
585
+ import { useForkRef } from "@mui/material";
586
+ import { DatePicker } from "@mui/x-date-pickers";
587
+ import { forwardRef, useCallback as useCallback5, useMemo as useMemo6 } from "react";
588
+ import { useController as useController5 } from "react-hook-form";
589
+
590
+ // src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
591
+ import { useLocalizationContext } from "@mui/x-date-pickers/internals";
592
+ import { useCallback as useCallback4, useMemo as useMemo3 } from "react";
593
+ function readDatePickerValueAsDate(adapter, value) {
594
+ if (value === null || value === void 0) {
595
+ return null;
596
+ }
597
+ if (typeof value === "string") {
598
+ if (value === "") {
599
+ return null;
600
+ }
601
+ const parsedDate = adapter.utils.date(value);
602
+ return parsedDate;
603
+ }
604
+ return value;
605
+ }
606
+ function useDatePickerValue(options) {
607
+ const { field, transform } = options;
608
+ const adapter = useLocalizationContext();
609
+ const value = useMemo3(() => {
610
+ if (typeof transform?.input === "function") {
611
+ return transform.input(field.value);
612
+ }
613
+ return readDatePickerValueAsDate(adapter, field.value);
614
+ }, [field.value, transform?.input, adapter]);
615
+ const onChange = useCallback4(
616
+ (newValue, context) => {
617
+ if (typeof transform?.output === "function") {
618
+ const transformedValue = transform.output(newValue, context);
619
+ field.onChange(transformedValue);
620
+ } else {
621
+ field.onChange(newValue);
622
+ }
623
+ },
624
+ // eslint-disable-next-line react-hooks/exhaustive-deps
625
+ [field.onChange, transform?.output]
626
+ );
627
+ return {
628
+ value,
629
+ onChange
630
+ };
631
+ }
632
+
633
+ // src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
634
+ import { useMemo as useMemo4 } from "react";
635
+ var DEFAULT_ERROR_MESSAGES = {
636
+ invalidDate: "Please enter a valid date",
637
+ minDate: "Date must be after the minimum allowed date",
638
+ maxDate: "Date must be before the maximum allowed date",
639
+ disabledDate: "This date is not allowed",
640
+ required: "This field is required"
641
+ };
642
+ function useDatePickerValidation(options) {
643
+ const { fieldState, validation, parseError, value } = options;
644
+ const validationResult = useMemo4(() => {
645
+ const { error: fieldError, invalid } = fieldState;
646
+ let currentError = fieldError;
647
+ if (!fieldError && value && validation) {
648
+ const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
649
+ if (minDate && value < minDate) {
650
+ currentError = {
651
+ type: "minDate",
652
+ message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
653
+ };
654
+ } else if (maxDate && value > maxDate) {
655
+ currentError = {
656
+ type: "maxDate",
657
+ message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
658
+ };
659
+ } else if (shouldDisableDate && shouldDisableDate(value)) {
660
+ currentError = {
661
+ type: "disabledDate",
662
+ message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
663
+ };
664
+ }
665
+ }
666
+ const hasError = Boolean(currentError);
667
+ return {
668
+ hasError,
669
+ error: currentError,
670
+ invalid: invalid || hasError
671
+ };
672
+ }, [fieldState, validation, value]);
673
+ const errorMessage = useMemo4(() => {
674
+ if (!validationResult.error) {
675
+ return null;
676
+ }
677
+ if (parseError) {
678
+ return parseError(validationResult.error);
679
+ }
680
+ if (typeof validationResult.error === "string") {
681
+ return validationResult.error;
682
+ }
683
+ if ("message" in validationResult.error && validationResult.error.message) {
684
+ return validationResult.error.message;
685
+ }
686
+ if ("type" in validationResult.error) {
687
+ const errorType = validationResult.error.type;
688
+ switch (errorType) {
689
+ case "required":
690
+ return DEFAULT_ERROR_MESSAGES.required;
691
+ case "minDate":
692
+ return DEFAULT_ERROR_MESSAGES.minDate;
693
+ case "maxDate":
694
+ return DEFAULT_ERROR_MESSAGES.maxDate;
695
+ case "disabledDate":
696
+ return DEFAULT_ERROR_MESSAGES.disabledDate;
697
+ case "invalidDate":
698
+ default:
699
+ return DEFAULT_ERROR_MESSAGES.invalidDate;
700
+ }
701
+ }
702
+ return DEFAULT_ERROR_MESSAGES.invalidDate;
703
+ }, [validationResult.error, parseError]);
704
+ return {
705
+ ...validationResult,
706
+ errorMessage
707
+ };
708
+ }
709
+
710
+ // src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
711
+ import { useTheme } from "@mui/material";
712
+ import { useMemo as useMemo5 } from "react";
713
+ function useDatePickerStyles(options = {}) {
714
+ const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
715
+ const theme = useTheme();
716
+ const computedSx = useMemo5(() => {
717
+ const baseStyles = {
718
+ // Input field styling
719
+ "& .MuiOutlinedInput-root": {
720
+ backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
721
+ // Transition for smooth state changes
722
+ transition: theme.transitions.create([
723
+ "background-color",
724
+ "border-color",
725
+ "color"
726
+ ], {
727
+ duration: theme.transitions.duration.short
728
+ }),
729
+ // Error state styling
730
+ ...hasError && {
731
+ borderColor: theme.palette.error.main,
732
+ "&:hover": {
733
+ borderColor: theme.palette.error.main
734
+ },
735
+ "&.Mui-focused": {
736
+ borderColor: theme.palette.error.main,
737
+ boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
738
+ // 25 is 15% opacity in hex
739
+ }
740
+ },
741
+ // Loading state styling
742
+ ...loading && {
743
+ opacity: 0.7,
744
+ pointerEvents: "none"
745
+ }
746
+ },
747
+ // Input element styling
748
+ "& .MuiInputBase-input": {
749
+ cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
750
+ // Read-only specific styling
751
+ ...textReadOnly && !disabled && {
752
+ cursor: "pointer",
753
+ userSelect: "none",
754
+ caretColor: "transparent"
755
+ // Hide text cursor in read-only mode
756
+ },
757
+ // Loading state
758
+ ...loading && {
759
+ cursor: "wait"
760
+ }
761
+ },
762
+ // Required field asterisk styling
763
+ "& .MuiInputLabel-asterisk": {
764
+ color: theme.palette.error.main,
765
+ fontSize: "1.2em"
766
+ },
767
+ // Label styling with better contrast
768
+ "& .MuiInputLabel-root": {
769
+ color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
770
+ // Ensure proper contrast for disabled state
771
+ ...disabled && {
772
+ color: theme.palette.text.disabled
773
+ }
774
+ },
775
+ // Helper text styling
776
+ "& .MuiFormHelperText-root": {
777
+ marginLeft: theme.spacing(1),
778
+ marginRight: theme.spacing(1),
779
+ // Error state
780
+ ...hasError && {
781
+ color: theme.palette.error.main
782
+ }
783
+ },
784
+ // Calendar icon styling
785
+ "& .MuiInputAdornment-root": {
786
+ color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
787
+ },
788
+ // Focus ring for accessibility
789
+ "& .MuiOutlinedInput-root.Mui-focused": {
790
+ outline: `2px solid ${theme.palette.primary.main}50`,
791
+ // 50 is 31% opacity
792
+ outlineOffset: "2px"
793
+ },
794
+ // Enhanced contrast for dark themes
795
+ ...theme.palette.mode === "dark" && {
796
+ "& .MuiOutlinedInput-root": {
797
+ borderWidth: 2
798
+ }
799
+ }
800
+ };
801
+ return customSx ? [baseStyles, customSx] : baseStyles;
802
+ }, [
803
+ theme,
804
+ disabled,
805
+ hasError,
806
+ loading,
807
+ textReadOnly,
808
+ customSx
809
+ ]);
810
+ const className = useMemo5(() => {
811
+ const classes = [];
812
+ if (disabled) classes.push("DatePickerElement--disabled");
813
+ if (hasError) classes.push("DatePickerElement--error");
814
+ if (loading) classes.push("DatePickerElement--loading");
815
+ if (textReadOnly) classes.push("DatePickerElement--readOnly");
816
+ return classes.length > 0 ? classes.join(" ") : void 0;
817
+ }, [disabled, hasError, loading, textReadOnly]);
818
+ return {
819
+ sx: computedSx,
820
+ className
821
+ };
822
+ }
823
+
824
+ // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
825
+ import { jsx as jsx5 } from "react/jsx-runtime";
826
+ var DatePickerElementCore = forwardRef(
827
+ (props, ref) => {
828
+ const {
829
+ name,
830
+ required = false,
831
+ control,
832
+ parseError,
833
+ transform,
834
+ validation,
835
+ label,
836
+ placeholder,
837
+ textReadOnly = false,
838
+ helperText,
839
+ inputProps = {},
840
+ slotProps = {},
841
+ datePickerProps = {},
842
+ variant = "outlined",
843
+ loading = false,
844
+ LoadingComponent,
845
+ ...restProps
846
+ } = props;
847
+ const {
848
+ disabled,
849
+ inputRef: externalInputRef,
850
+ onClose,
851
+ ...restDatePickerProps
852
+ } = datePickerProps;
853
+ const { field, fieldState } = useController5({
854
+ name,
855
+ control,
856
+ defaultValue: null
857
+ // Let react-hook-form handle the default value typing
858
+ });
859
+ const { value, onChange: onValueChange } = useDatePickerValue({
860
+ field,
861
+ transform
862
+ });
863
+ const { hasError, errorMessage, invalid } = useDatePickerValidation({
864
+ fieldState,
865
+ validation,
866
+ parseError,
867
+ value
868
+ });
869
+ const { className } = useDatePickerStyles({
870
+ disabled,
871
+ hasError,
872
+ loading,
873
+ textReadOnly
874
+ });
875
+ const handleInputRef = useForkRef(field.ref, externalInputRef);
876
+ const handleChange = useCallback5(
877
+ (newValue, context) => {
878
+ onValueChange(newValue, context);
879
+ },
880
+ [onValueChange]
881
+ );
882
+ const handleClose = useCallback5(
883
+ (...args) => {
884
+ field.onBlur();
885
+ if (onClose) {
886
+ onClose(...args);
887
+ }
888
+ },
889
+ // eslint-disable-next-line react-hooks/exhaustive-deps
890
+ [field.onBlur, onClose]
891
+ );
892
+ const handleTextFieldBlur = useCallback5(
893
+ (event) => {
894
+ field.onBlur();
895
+ if (typeof inputProps.onBlur === "function") {
896
+ inputProps.onBlur(event);
897
+ }
898
+ },
899
+ // eslint-disable-next-line react-hooks/exhaustive-deps
900
+ [field.onBlur, inputProps.onBlur]
901
+ );
902
+ const memoizedSlotProps = useMemo6(
903
+ () => ({
904
+ ...slotProps,
905
+ actionBar: {
906
+ actions: ["clear", "today", "cancel", "accept"],
907
+ ...slotProps.actionBar
908
+ },
909
+ textField: {
910
+ ...inputProps,
911
+ required,
912
+ placeholder,
913
+ fullWidth: true,
914
+ variant,
915
+ onBlur: handleTextFieldBlur,
916
+ error: hasError,
917
+ helperText: hasError ? errorMessage : helperText,
918
+ inputProps: {
919
+ readOnly: textReadOnly,
920
+ "aria-invalid": invalid,
921
+ "aria-describedby": hasError ? `${name}-error` : void 0,
922
+ ...inputProps.inputProps
923
+ },
924
+ // Add loading indicator if provided
925
+ ...loading && LoadingComponent && {
926
+ InputProps: {
927
+ endAdornment: /* @__PURE__ */ jsx5(LoadingComponent, {}),
928
+ ...inputProps.InputProps
929
+ }
930
+ },
931
+ ...slotProps.textField
932
+ }
933
+ }),
934
+ [
935
+ slotProps,
936
+ inputProps,
937
+ required,
938
+ placeholder,
939
+ variant,
940
+ handleTextFieldBlur,
941
+ hasError,
942
+ errorMessage,
943
+ helperText,
944
+ textReadOnly,
945
+ invalid,
946
+ name,
947
+ loading,
948
+ LoadingComponent
949
+ ]
950
+ );
951
+ return /* @__PURE__ */ jsx5(
952
+ DatePicker,
953
+ {
954
+ ...restProps,
955
+ ...restDatePickerProps,
956
+ ref,
957
+ name,
958
+ value,
959
+ onChange: handleChange,
960
+ onClose: handleClose,
961
+ inputRef: handleInputRef,
962
+ label,
963
+ disabled,
964
+ className,
965
+ slotProps: memoizedSlotProps,
966
+ "aria-invalid": invalid,
967
+ "aria-describedby": hasError ? `${name}-error` : void 0
968
+ }
969
+ );
970
+ }
971
+ );
972
+ DatePickerElementCore.displayName = "DatePickerElementCore";
973
+
974
+ // src/wrappers/DatePickerElement/DatePickerElement.tsx
975
+ import { jsx as jsx6 } from "react/jsx-runtime";
976
+ var DatePickerElement = forwardRef2((props, ref) => {
977
+ const {
978
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
979
+ ...coreProps
980
+ } = props;
981
+ if (gridProps === false) {
982
+ return /* @__PURE__ */ jsx6(
983
+ DatePickerElementCore,
984
+ {
985
+ ref,
986
+ ...coreProps
987
+ }
988
+ );
989
+ }
990
+ return /* @__PURE__ */ jsx6(
991
+ Grid5,
992
+ {
993
+ ref,
994
+ ...gridProps,
995
+ children: /* @__PURE__ */ jsx6(
996
+ DatePickerElementCore,
997
+ {
998
+ ...coreProps
999
+ }
1000
+ )
1001
+ }
1002
+ );
1003
+ });
1004
+ DatePickerElement.displayName = "DatePickerElement";
1005
+
1006
+ // src/wrappers/DatePickerElement/utils.ts
1007
+ function isValidDate(value) {
1008
+ if (value === null || value === void 0) {
1009
+ return false;
1010
+ }
1011
+ if (value instanceof Date) {
1012
+ return !isNaN(value.getTime());
1013
+ }
1014
+ if (typeof value === "object" && value !== null) {
1015
+ if ("isValid" in value && typeof value.isValid === "function") {
1016
+ return value.isValid();
1017
+ }
1018
+ if ("isValid" in value && typeof value.isValid === "boolean") {
1019
+ return value.isValid;
1020
+ }
1021
+ }
1022
+ return false;
1023
+ }
1024
+ function isParsableDateString(value) {
1025
+ if (typeof value !== "string" || value === "") {
1026
+ return false;
1027
+ }
1028
+ const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
1029
+ if (isoDateRegex.test(value)) {
1030
+ return true;
1031
+ }
1032
+ const parsed = new Date(value);
1033
+ return !isNaN(parsed.getTime());
1034
+ }
1035
+ function createDateInputTransform(adapter) {
1036
+ return (value) => {
1037
+ if (value === null || value === void 0) {
1038
+ return null;
1039
+ }
1040
+ if (typeof value === "string") {
1041
+ if (value === "") {
1042
+ return null;
1043
+ }
1044
+ try {
1045
+ const parsed = adapter.utils.date(value);
1046
+ return isValidDate(parsed) ? parsed : null;
1047
+ } catch {
1048
+ return null;
1049
+ }
1050
+ }
1051
+ if (isValidDate(value)) {
1052
+ return value;
1053
+ }
1054
+ return null;
1055
+ };
1056
+ }
1057
+ function createDateOutputTransform(format) {
1058
+ return (value) => {
1059
+ if (value === null || value === void 0) {
1060
+ return null;
1061
+ }
1062
+ if (!isValidDate(value)) {
1063
+ return null;
1064
+ }
1065
+ if (!format) {
1066
+ return value;
1067
+ }
1068
+ try {
1069
+ if (value instanceof Date) {
1070
+ if (format === "iso") {
1071
+ return value.toISOString();
1072
+ }
1073
+ if (format === "date-only") {
1074
+ return value.toISOString().split("T")[0];
1075
+ }
1076
+ }
1077
+ if (typeof value.format === "function") {
1078
+ return value.format(format);
1079
+ }
1080
+ if (typeof value.format === "function") {
1081
+ return value.format(format);
1082
+ }
1083
+ if (typeof value.toFormat === "function") {
1084
+ return value.toFormat(format);
1085
+ }
1086
+ return value;
1087
+ } catch {
1088
+ return null;
1089
+ }
1090
+ };
1091
+ }
1092
+ function createDefaultDatePickerConfig() {
1093
+ return {
1094
+ // Default slot props for consistent behavior
1095
+ slotProps: {
1096
+ actionBar: {
1097
+ actions: ["clear", "today", "cancel", "accept"]
1098
+ },
1099
+ textField: {
1100
+ fullWidth: true,
1101
+ variant: "outlined"
1102
+ }
1103
+ },
1104
+ // Default grid props for layout consistency
1105
+ gridProps: {
1106
+ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
1107
+ },
1108
+ // Default validation configuration
1109
+ validation: {
1110
+ errorMessages: {
1111
+ invalidDate: "Please enter a valid date",
1112
+ minDate: "Date must be after the minimum allowed date",
1113
+ maxDate: "Date must be before the maximum allowed date",
1114
+ disabledDate: "This date is not allowed"
1115
+ }
1116
+ }
1117
+ };
1118
+ }
1119
+ function extractErrorMessage(error) {
1120
+ if (error === null || error === void 0) {
1121
+ return "";
1122
+ }
1123
+ if (typeof error === "string") {
1124
+ return error;
1125
+ }
1126
+ if (typeof error === "object" && error !== null) {
1127
+ if ("message" in error && typeof error.message === "string") {
1128
+ return error.message;
1129
+ }
1130
+ if ("type" in error && typeof error.type === "string") {
1131
+ const errorType = error.type;
1132
+ switch (errorType) {
1133
+ case "invalidDate":
1134
+ return "Please enter a valid date";
1135
+ case "minDate":
1136
+ return "Date is too early";
1137
+ case "maxDate":
1138
+ return "Date is too late";
1139
+ case "disabledDate":
1140
+ return "This date is not available";
1141
+ default:
1142
+ return "Invalid date selection";
1143
+ }
1144
+ }
1145
+ }
1146
+ return "Invalid input";
1147
+ }
1148
+ function createStableKey(config) {
1149
+ try {
1150
+ return JSON.stringify(config, (key, value) => {
1151
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
1152
+ const sorted = {};
1153
+ Object.keys(value).sort().forEach((k) => {
1154
+ sorted[k] = value[k];
1155
+ });
1156
+ return sorted;
1157
+ }
1158
+ return value;
1159
+ });
1160
+ } catch {
1161
+ return Object.keys(config).sort().join("-");
1162
+ }
1163
+ }
1164
+
1165
+ // src/wrappers/PasswordElement/PasswordElement.tsx
1166
+ import Visibility from "@mui/icons-material/Visibility";
1167
+ import VisibilityOff from "@mui/icons-material/VisibilityOff";
1168
+ import {
1169
+ IconButton,
1170
+ InputAdornment,
1171
+ TextField as TextField3,
1172
+ useForkRef as useForkRef2,
1173
+ Grid as Grid6
1174
+ } from "@mui/material";
1175
+ import { useState as useState3 } from "react";
1176
+ import { useController as useController6 } from "react-hook-form";
1177
+ import { jsx as jsx7 } from "react/jsx-runtime";
1178
+ var Component4 = function PasswordEl(props) {
1179
+ const {
1180
+ iconColor,
1181
+ renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx7(Visibility, {}) : /* @__PURE__ */ jsx7(VisibilityOff, {}),
1182
+ slotProps,
1183
+ name,
1184
+ control,
1185
+ inputRef,
1186
+ onBlur,
1187
+ ...rest
1188
+ } = props;
1189
+ const [password, setPassword] = useState3(true);
1190
+ const endAdornment = /* @__PURE__ */ jsx7(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx7(
1191
+ IconButton,
1192
+ {
1193
+ onMouseDown: (e) => e.preventDefault(),
1194
+ onClick: () => setPassword(!password),
1195
+ tabIndex: -1,
1196
+ color: iconColor ?? "default",
1197
+ children: renderIcon(password)
1198
+ }
1199
+ ) });
1200
+ const {
1201
+ field,
1202
+ fieldState: { error }
1203
+ } = useController6({
1204
+ name,
1205
+ control
1206
+ });
1207
+ const handleInputRef = useForkRef2(field.ref, inputRef);
1208
+ return /* @__PURE__ */ jsx7(
1209
+ TextField3,
1210
+ {
1211
+ ...rest,
1212
+ inputRef: handleInputRef,
1213
+ type: password ? "password" : "text",
1214
+ value: field.value ?? "",
1215
+ fullWidth: true,
1216
+ variant: rest.variant ?? "outlined",
1217
+ onChange: (event) => {
1218
+ field.onChange(event);
1219
+ if (typeof rest.onChange === "function") {
1220
+ rest.onChange(event);
1221
+ }
1222
+ },
1223
+ onBlur: (event) => {
1224
+ field.onBlur();
1225
+ if (typeof onBlur === "function") {
1226
+ onBlur(event);
1227
+ }
1228
+ },
1229
+ ...typeof slotProps === "undefined" ? {
1230
+ InputProps: {
1231
+ endAdornment
1232
+ }
1233
+ } : {
1234
+ slotProps: {
1235
+ ...slotProps,
1236
+ input: {
1237
+ endAdornment,
1238
+ ...slotProps?.input
1239
+ }
1240
+ }
1241
+ },
1242
+ error: !!error,
1243
+ helperText: error ? error.message : ""
1244
+ }
1245
+ );
1246
+ };
1247
+ var PasswordElement = ({
1248
+ gridProps = {},
1249
+ ...props
1250
+ }) => {
1251
+ return /* @__PURE__ */ jsx7(Grid6, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx7(Component4, { ...props }) });
1252
+ };
1253
+
1254
+ // src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
1255
+ import {
1256
+ FormControl as FormControl3,
1257
+ FormControlLabel as FormControlLabel3,
1258
+ FormHelperText as FormHelperText3,
1259
+ FormLabel,
1260
+ Radio,
1261
+ RadioGroup,
1262
+ Grid as Grid7
1263
+ } from "@mui/material";
1264
+ import { useController as useController7 } from "react-hook-form";
1265
+ import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
1266
+ var Component5 = function RadioButtonGroup(props) {
1267
+ const {
1268
+ options,
1269
+ label,
1270
+ name,
1271
+ labelKey = "label",
1272
+ valueKey = "id",
1273
+ disabledKey = "disabled",
1274
+ required,
1275
+ emptyOptionLabel,
1276
+ returnObject,
1277
+ row = true,
1278
+ control,
1279
+ type,
1280
+ labelProps,
1281
+ disabled,
1282
+ formLabelProps,
1283
+ radioProps,
1284
+ transform,
1285
+ ...rest
1286
+ } = props;
1287
+ const {
1288
+ field,
1289
+ fieldState: { error }
1290
+ } = useController7({
1291
+ name,
1292
+ disabled,
1293
+ control
1294
+ });
1295
+ const { value, onChange } = useTransform({
1296
+ value: field.value,
1297
+ onChange: field.onChange,
1298
+ transform: {
1299
+ input: typeof transform?.input === "function" ? transform.input : (value2) => {
1300
+ return value2 || "";
1301
+ },
1302
+ output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
1303
+ if (value2 && type === "number") {
1304
+ return Number(value2);
1305
+ }
1306
+ if (value2 && type === "boolean") {
1307
+ return Boolean(value2);
1308
+ }
1309
+ return value2;
1310
+ }
1311
+ }
1312
+ });
1313
+ const onRadioChange = (event, radioValue) => {
1314
+ const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
1315
+ onChange(event, returnValue);
1316
+ if (typeof rest.onChange === "function") {
1317
+ rest.onChange(returnValue);
1318
+ }
1319
+ };
1320
+ return /* @__PURE__ */ jsxs5(FormControl3, { error: !!error, children: [
1321
+ label && /* @__PURE__ */ jsx8(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
1322
+ /* @__PURE__ */ jsxs5(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
1323
+ emptyOptionLabel && /* @__PURE__ */ jsx8(
1324
+ FormControlLabel3,
1325
+ {
1326
+ ...labelProps,
1327
+ control: /* @__PURE__ */ jsx8(
1328
+ Radio,
1329
+ {
1330
+ ...radioProps,
1331
+ checked: !value
1332
+ }
1333
+ ),
1334
+ label: emptyOptionLabel,
1335
+ value: ""
1336
+ }
1337
+ ),
1338
+ options.map((option) => {
1339
+ const optionKey = option[valueKey];
1340
+ const optionDisabled = option[disabledKey] || false;
1341
+ let val = returnObject ? value?.[valueKey] : value;
1342
+ if (type === "number" && val !== void 0) {
1343
+ val = Number(val);
1344
+ } else if (type === "boolean" && val !== void 0) {
1345
+ val = Boolean(val);
1346
+ }
1347
+ const isChecked = val === optionKey;
1348
+ return /* @__PURE__ */ jsx8(
1349
+ FormControlLabel3,
1350
+ {
1351
+ ...labelProps,
1352
+ control: /* @__PURE__ */ jsx8(
1353
+ Radio,
1354
+ {
1355
+ ...radioProps,
1356
+ disabled: disabled || optionDisabled,
1357
+ checked: isChecked
1358
+ }
1359
+ ),
1360
+ value: optionKey,
1361
+ label: option[labelKey]
1362
+ },
1363
+ String(optionKey)
1364
+ );
1365
+ })
1366
+ ] }),
1367
+ error && /* @__PURE__ */ jsx8(FormHelperText3, { children: error.message })
1368
+ ] });
1369
+ };
1370
+ var RadioButtonGroup2 = ({
1371
+ gridProps = {},
1372
+ ...props
1373
+ }) => {
1374
+ return /* @__PURE__ */ jsx8(Grid7, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx8(
1375
+ Component5,
1376
+ {
1377
+ ...props
1378
+ }
1379
+ ) });
1380
+ };
1381
+ RadioButtonGroup2.displayName = "RadioButtonGroup";
1382
+
1383
+ // src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
1384
+ import { Grid as Grid8, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
1385
+ import { useRef as useRef2, useEffect as useEffect4, useCallback as useCallback6, useMemo as useMemo7 } from "react";
1386
+ import { useController as useController8 } from "react-hook-form";
1387
+ import { jsx as jsx9 } from "react/jsx-runtime";
1388
+ var Component6 = function SelectCascadeElement(props) {
1389
+ const {
1390
+ labelField = "Label",
1391
+ valueField = "Value",
1392
+ name,
1393
+ onBlur,
1394
+ onChange,
1395
+ disabled,
1396
+ options: optionsInput,
1397
+ control,
1398
+ loading = false,
1399
+ placeholder,
1400
+ label,
1401
+ dependsOn,
1402
+ textFieldProps = {},
1403
+ variant,
1404
+ isEdit = false,
1405
+ ...rest
1406
+ } = props;
1407
+ const { required, ...restTextProps } = textFieldProps;
1408
+ const options = useMemo7(() => optionsInput || [], [optionsInput]);
1409
+ const getOptionKey = useCallback6(
1410
+ (option) => {
1411
+ if (typeof option === "string" || typeof option === "number")
1412
+ return option;
1413
+ const key = option ? option[valueField] : void 0;
1414
+ return key !== void 0 && key !== null ? String(key) : "";
1415
+ },
1416
+ [valueField]
1417
+ );
1418
+ const getOptionLabel = useCallback6(
1419
+ (option) => {
1420
+ if (typeof option === "string") return option;
1421
+ return option ? String(option[labelField]) : "";
1422
+ },
1423
+ [labelField]
1424
+ );
1425
+ const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
1426
+ const {
1427
+ field,
1428
+ fieldState: { error }
1429
+ } = useController8({
1430
+ name,
1431
+ control
1432
+ });
1433
+ const { field: dependentField } = useController8({
1434
+ name: dependsOn,
1435
+ control
1436
+ });
1437
+ const parentValueRef = useRef2(dependentField.value ?? null);
1438
+ const hasAutoSelected = useRef2(false);
1439
+ useEffect4(() => {
1440
+ if (parentValueRef?.current !== dependentField.value) {
1441
+ hasAutoSelected.current = false;
1442
+ }
1443
+ if (!!field.value && parentValueRef?.current !== dependentField.value) {
1444
+ field.onChange(null);
1445
+ }
1446
+ }, [dependentField.value]);
1447
+ useEffect4(() => {
1448
+ if (!isEdit && !disabled && options.length === 1 && !!dependentField.value && !hasAutoSelected.current && field.value == null) {
1449
+ field.onChange(getOptionKey(options[0]));
1450
+ hasAutoSelected.current = true;
1451
+ }
1452
+ console.log(
1453
+ !isEdit,
1454
+ !disabled,
1455
+ options.length === 1,
1456
+ !!dependentField.value,
1457
+ !hasAutoSelected,
1458
+ field.value
1459
+ );
1460
+ }, [
1461
+ options,
1462
+ field.value,
1463
+ field.onChange,
1464
+ hasAutoSelected,
1465
+ isEdit,
1466
+ disabled,
1467
+ field,
1468
+ getOptionKey,
1469
+ dependentField.onChange
1470
+ ]);
1471
+ return /* @__PURE__ */ jsx9(
1472
+ Autocomplete3,
1473
+ {
1474
+ ...rest,
1475
+ value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
1476
+ loading,
1477
+ options,
1478
+ getOptionKey,
1479
+ getOptionLabel,
1480
+ isOptionEqualToValue,
1481
+ ref: field.ref,
1482
+ disabled: dependentField.value == null || disabled,
1483
+ onChange: (event, newValue, reason) => {
1484
+ field.onChange(newValue ? getOptionKey(newValue) : null);
1485
+ if (onChange && typeof onChange === "function") {
1486
+ onChange(event, newValue, reason);
1487
+ }
1488
+ },
1489
+ onBlur: (event) => {
1490
+ field.onBlur();
1491
+ if (typeof onBlur === "function") {
1492
+ onBlur(event);
1493
+ }
1494
+ },
1495
+ fullWidth: true,
1496
+ renderInput: (params) => /* @__PURE__ */ jsx9(
1497
+ TextField4,
1498
+ {
1499
+ ...params,
1500
+ ...restTextProps,
1501
+ fullWidth: true,
1502
+ error: !!error,
1503
+ required: required || options.length == 0,
1504
+ helperText: error ? error.message : "",
1505
+ placeholder,
1506
+ label,
1507
+ variant: variant ? variant : "outlined"
1508
+ }
1509
+ )
1510
+ }
1511
+ );
1512
+ };
1513
+ var SelectCascadeElement2 = ({
1514
+ gridProps = {},
1515
+ ...props
1516
+ }) => {
1517
+ return /* @__PURE__ */ jsx9(Grid8, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx9(Component6, { ...props }) });
1518
+ };
1519
+ SelectCascadeElement2.displayName = "SelectCascadeElement";
1520
+
1521
+ // src/wrappers/SelectElement/SelectElement.tsx
1522
+ import { Grid as Grid9, TextField as TextField5, Autocomplete as Autocomplete4 } from "@mui/material";
1523
+ import {
1524
+ useMemo as useMemo8,
1525
+ useEffect as useEffect5,
1526
+ useCallback as useCallback7,
1527
+ useRef as useRef3
1528
+ } from "react";
1529
+ import { useController as useController9 } from "react-hook-form";
1530
+ import { jsx as jsx10 } from "react/jsx-runtime";
1531
+ var Component7 = function SelectElement(props) {
1532
+ const {
1533
+ name,
1534
+ control,
1535
+ onChange,
1536
+ isEdit,
1537
+ options: optionsInput,
1538
+ label,
1539
+ variant,
1540
+ disabled,
1541
+ labelKey = "Label",
1542
+ valueKey = "Value",
1543
+ placeholder,
1544
+ textFieldProps = {},
1545
+ ...rest
1546
+ } = props;
1547
+ const { required, ...restTextProps } = textFieldProps;
1548
+ const options = useMemo8(() => optionsInput || [], [optionsInput]);
1549
+ const ignoreAutoSelectRef = useRef3(null);
1550
+ const {
1551
+ field,
1552
+ fieldState: { error }
1553
+ } = useController9({
1554
+ name,
1555
+ control
1556
+ });
1557
+ const getOptionValue = useCallback7(
1558
+ (option) => {
1559
+ if (typeof option === "string") return option;
1560
+ return option ? option[valueKey] : null;
1561
+ },
1562
+ [valueKey]
1563
+ );
1564
+ const getOptionLabel = useCallback7(
1565
+ (option) => {
1566
+ if (typeof option === "string") return option;
1567
+ return option ? String(option[labelKey]) : "";
1568
+ },
1569
+ [labelKey]
1570
+ );
1571
+ const handleChange = (event, newValue, reason) => {
1572
+ const option = newValue;
1573
+ if (reason === "clear" && options.length === 1) {
1574
+ ignoreAutoSelectRef.current = getOptionValue(options[0]);
1575
+ } else {
1576
+ ignoreAutoSelectRef.current = null;
1577
+ }
1578
+ field.onChange(option ? getOptionValue(option) : null);
1579
+ onChange?.(event, newValue, reason);
1580
+ };
1581
+ useEffect5(() => {
1582
+ if (!isEdit && options.length === 1 && (field.value == null || field.value == void 0 || field.value === "")) {
1583
+ const defaultOption = options[0];
1584
+ const defaultValue = getOptionValue(defaultOption);
1585
+ if (ignoreAutoSelectRef.current !== defaultValue) {
1586
+ field.onChange(defaultValue);
1587
+ }
1588
+ }
1589
+ }, [options]);
1590
+ const autocompleteValue = useMemo8(
1591
+ () => options.find((option) => getOptionValue(option) === field.value) ?? null,
1592
+ [field.value, options, getOptionValue]
1593
+ );
1594
+ return /* @__PURE__ */ jsx10(
1595
+ Autocomplete4,
1596
+ {
1597
+ ...rest,
1598
+ filterSelectedOptions: false,
1599
+ options,
1600
+ value: autocompleteValue,
1601
+ onChange: handleChange,
1602
+ disabled: disabled || options.length == 0,
1603
+ getOptionLabel: (option) => getOptionLabel(option),
1604
+ ref: field.ref,
1605
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1606
+ renderInput: (params) => /* @__PURE__ */ jsx10(
1607
+ TextField5,
1608
+ {
1609
+ ...params,
1610
+ ...restTextProps,
1611
+ fullWidth: true,
1612
+ required,
1613
+ error: !!error,
1614
+ helperText: error ? error.message : "",
1615
+ label,
1616
+ placeholder,
1617
+ variant: variant ? variant : "outlined"
1618
+ }
1619
+ )
1620
+ }
1621
+ );
1622
+ };
1623
+ var SelectElement2 = ({
1624
+ gridProps = {},
1625
+ ...props
1626
+ }) => {
1627
+ return /* @__PURE__ */ jsx10(Grid9, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx10(Component7, { ...props }) });
1628
+ };
1629
+ SelectElement2.displayName = "SelectElement";
1630
+
1631
+ // src/wrappers/SelectMultiElement/SelectMultiElement.tsx
1632
+ import CheckBoxIcon from "@mui/icons-material/CheckBox";
1633
+ import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
1634
+ import {
1635
+ Grid as Grid10,
1636
+ Checkbox as Checkbox3,
1637
+ TextField as TextField6,
1638
+ Autocomplete as Autocomplete5,
1639
+ CircularProgress as CircularProgress3
1640
+ } from "@mui/material";
1641
+ import { Fragment as Fragment3, useMemo as useMemo9 } from "react";
1642
+ import { useController as useController10 } from "react-hook-form";
1643
+ import { jsx as jsx11, jsxs as jsxs6 } from "react/jsx-runtime";
1644
+ var Component8 = function SelectMultiElement(props) {
1645
+ const {
1646
+ name,
1647
+ control,
1648
+ onBlur,
1649
+ disabled,
1650
+ options: optionsInput,
1651
+ loading = false,
1652
+ placeholder,
1653
+ label,
1654
+ variant,
1655
+ labelField = "Label",
1656
+ valueField = "Value",
1657
+ ...rest
1658
+ } = props;
1659
+ const options = useMemo9(() => optionsInput || [], [optionsInput]);
1660
+ const {
1661
+ field,
1662
+ fieldState: { error }
1663
+ } = useController10({
1664
+ name,
1665
+ control
1666
+ });
1667
+ const getOptionValue = (option) => {
1668
+ if (typeof option === "string") return option;
1669
+ return option ? option[valueField] : null;
1670
+ };
1671
+ const getOptionLabel = (option) => {
1672
+ if (typeof option === "string") return option;
1673
+ return option ? String(option[labelField]) : "";
1674
+ };
1675
+ const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
1676
+ const handleChange = (_2, selectedOptions, reason) => {
1677
+ if (reason === "clear") {
1678
+ field.onChange([]);
1679
+ } else if (reason === "selectOption" || reason === "removeOption") {
1680
+ const newValues = selectedOptions.map((option) => getOptionValue(option));
1681
+ field.onChange(newValues);
1682
+ }
1683
+ };
1684
+ const icon = /* @__PURE__ */ jsx11(CheckBoxOutlineBlankIcon, { fontSize: "small" });
1685
+ const checkedIcon = /* @__PURE__ */ jsx11(CheckBoxIcon, { fontSize: "small" });
1686
+ return /* @__PURE__ */ jsx11(
1687
+ Autocomplete5,
1688
+ {
1689
+ multiple: true,
1690
+ value: selectedValue,
1691
+ loading,
1692
+ options,
1693
+ getOptionLabel,
1694
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1695
+ filterSelectedOptions: true,
1696
+ disableCloseOnSelect: true,
1697
+ ref: field.ref,
1698
+ disabled: disabled ?? field.disabled ?? options.length == 0,
1699
+ onChange: handleChange,
1700
+ onBlur: (event) => {
1701
+ field.onBlur();
1702
+ if (typeof onBlur === "function") {
1703
+ onBlur(event);
1704
+ }
1705
+ },
1706
+ fullWidth: true,
1707
+ renderOption: (props1, option, { selected }) => {
1708
+ const { key, ...optionProps } = props1;
1709
+ return /* @__PURE__ */ jsxs6("li", { ...optionProps, children: [
1710
+ /* @__PURE__ */ jsx11(
1711
+ Checkbox3,
1712
+ {
1713
+ icon,
1714
+ checkedIcon,
1715
+ checked: selected
1716
+ }
1717
+ ),
1718
+ getOptionLabel(option)
1719
+ ] }, key);
1720
+ },
1721
+ renderInput: (params) => /* @__PURE__ */ jsx11(
1722
+ TextField6,
1723
+ {
1724
+ ...params,
1725
+ label,
1726
+ error: !!error,
1727
+ helperText: error ? error.message : "",
1728
+ placeholder,
1729
+ slotProps: {
1730
+ input: {
1731
+ ...params.InputProps,
1732
+ endAdornment: /* @__PURE__ */ jsxs6(Fragment3, { children: [
1733
+ loading ? /* @__PURE__ */ jsx11(CircularProgress3, { color: "inherit", size: 20 }) : null,
1734
+ params.InputProps.endAdornment
1735
+ ] })
1736
+ }
1737
+ },
1738
+ variant: variant ? variant : "outlined"
1739
+ }
1740
+ ),
1741
+ ...rest
1742
+ }
1743
+ );
1744
+ };
1745
+ var SelectMultiElement2 = ({
1746
+ gridProps = {},
1747
+ ...props
1748
+ }) => {
1749
+ return /* @__PURE__ */ jsx11(Grid10, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx11(Component8, { ...props }) });
1750
+ };
1751
+ SelectMultiElement2.displayName = "SelectMultiElement";
1752
+
1753
+ // src/wrappers/TextFieldElement/TextFieldElement.tsx
1754
+ import { Grid as Grid11, TextField as TextField7, useForkRef as useForkRef3 } from "@mui/material";
1755
+ import { useController as useController11 } from "react-hook-form";
1756
+ import { jsx as jsx12 } from "react/jsx-runtime";
1757
+ var Component9 = function TextFieldElement(props) {
1758
+ const {
1759
+ parseError,
1760
+ name,
1761
+ control,
1762
+ component: TextFieldComponent = TextField7,
1763
+ transform,
1764
+ fieldType = "text",
1765
+ // Default to text type
1766
+ defaultValue,
1767
+ label,
1768
+ placeholder,
1769
+ textFieldProps = {},
1770
+ variant,
1771
+ onChange: customOnChange,
1772
+ enableWarnings = process.env.NODE_ENV === "development",
1773
+ ...rest
1774
+ } = props;
1775
+ const {
1776
+ type,
1777
+ required,
1778
+ helperText,
1779
+ inputRef,
1780
+ onInput,
1781
+ onBlur,
1782
+ disabled,
1783
+ ...restTextProps
1784
+ } = textFieldProps;
1785
+ const {
1786
+ field,
1787
+ fieldState: { error }
1788
+ } = useController11({
1789
+ name,
1790
+ control
1791
+ });
1792
+ const { value, onChange } = useEnhancedTransform(
1793
+ {
1794
+ value: field.value,
1795
+ onChange: field.onChange,
1796
+ transform: transform ? {
1797
+ input: transform.input,
1798
+ output: transform.output
1799
+ } : void 0,
1800
+ fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
1801
+ // Auto-detect number type
1802
+ defaultValue,
1803
+ enableWarnings
1804
+ }
1805
+ );
1806
+ const handleInputRef = useForkRef3(field.ref, inputRef);
1807
+ return /* @__PURE__ */ jsx12(
1808
+ TextFieldComponent,
1809
+ {
1810
+ ...rest,
1811
+ ...restTextProps,
1812
+ name: field.name,
1813
+ value,
1814
+ onChange: (event) => {
1815
+ const input = event.target.value;
1816
+ if (input === "") {
1817
+ field.onChange(null);
1818
+ } else {
1819
+ onChange(event);
1820
+ }
1821
+ if (typeof customOnChange === "function") {
1822
+ customOnChange(event);
1823
+ }
1824
+ return;
1825
+ },
1826
+ onBlur: (event) => {
1827
+ field.onBlur();
1828
+ if (typeof onBlur === "function") {
1829
+ onBlur(event);
1830
+ }
1831
+ },
1832
+ onInput: (event) => {
1833
+ if (typeof onInput === "function") {
1834
+ onInput(event);
1835
+ }
1836
+ },
1837
+ disabled,
1838
+ label,
1839
+ placeholder,
1840
+ fullWidth: true,
1841
+ required,
1842
+ type,
1843
+ error: !!error,
1844
+ helperText: error ? parseError ? parseError(error) : error.message : helperText,
1845
+ inputRef: handleInputRef,
1846
+ variant: variant ? variant : "outlined"
1847
+ }
1848
+ );
1849
+ };
1850
+ var TextFieldElement2 = ({
1851
+ gridProps = {},
1852
+ ...props
1853
+ }) => {
1854
+ return /* @__PURE__ */ jsx12(Grid11, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx12(Component9, { ...props }) });
1855
+ };
1856
+
1857
+ // src/wrappers/TimePickerElement/TimePickerElement.tsx
1858
+ import { Grid as Grid12, useForkRef as useForkRef4 } from "@mui/material";
1859
+ import { TimePicker } from "@mui/x-date-pickers";
1860
+ import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
1861
+ import { useController as useController12 } from "react-hook-form";
1862
+ import { jsx as jsx13 } from "react/jsx-runtime";
1863
+ var Component10 = function TimePickerElement(props) {
1864
+ const {
1865
+ name,
1866
+ required,
1867
+ inputProps,
1868
+ control,
1869
+ textReadOnly,
1870
+ label,
1871
+ placeholder,
1872
+ slotProps,
1873
+ timePickerProps = {},
1874
+ transform,
1875
+ ...rest
1876
+ } = props;
1877
+ const adapter = useLocalizationContext2();
1878
+ const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
1879
+ const {
1880
+ field,
1881
+ fieldState: { error }
1882
+ } = useController12({
1883
+ name,
1884
+ control,
1885
+ defaultValue: null
1886
+ });
1887
+ const { value, onChange } = useTransform({
1888
+ value: field.value,
1889
+ onChange: field.onChange,
1890
+ transform: {
1891
+ input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
1892
+ output: (eventOrValue, value2) => {
1893
+ const actualValue = value2 !== void 0 ? value2 : eventOrValue;
1894
+ if (actualValue === null) return null;
1895
+ return actualValue;
1896
+ }
1897
+ }
1898
+ });
1899
+ const handleInputRef = useForkRef4(field.ref, inputRef);
1900
+ return /* @__PURE__ */ jsx13(
1901
+ TimePicker,
1902
+ {
1903
+ ...rest,
1904
+ ...restTimePickerProps,
1905
+ ...field,
1906
+ value,
1907
+ label,
1908
+ disabled,
1909
+ ...timePickerProps,
1910
+ inputRef: handleInputRef,
1911
+ onClose: (...args) => {
1912
+ field.onBlur();
1913
+ if (onClose) {
1914
+ onClose(...args);
1915
+ }
1916
+ },
1917
+ onChange: (newValue, context) => {
1918
+ onChange(newValue, context);
1919
+ if (typeof timePickerProps.onChange === "function") {
1920
+ timePickerProps.onChange(newValue, context);
1921
+ }
1922
+ },
1923
+ slotProps: {
1924
+ ...slotProps,
1925
+ actionBar: {
1926
+ actions: ["clear", "cancel", "accept"]
1927
+ },
1928
+ textField: {
1929
+ ...inputProps,
1930
+ required,
1931
+ placeholder,
1932
+ fullWidth: true,
1933
+ onBlur: (event) => {
1934
+ field.onBlur();
1935
+ if (typeof inputProps?.onBlur === "function") {
1936
+ inputProps.onBlur(event);
1937
+ }
1938
+ },
1939
+ error: !!error,
1940
+ helperText: error ? error.message : inputProps?.helperText || rest.helperText,
1941
+ inputProps: {
1942
+ readOnly: !!textReadOnly,
1943
+ ...inputProps?.inputProps
1944
+ }
1945
+ }
1946
+ }
1947
+ }
1948
+ );
1949
+ };
1950
+ var TimePickerElement2 = ({
1951
+ gridProps = {},
1952
+ ...props
1953
+ }) => {
1954
+ return /* @__PURE__ */ jsx13(Grid12, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx13(Component10, { ...props }) });
1955
+ };
1956
+ TimePickerElement2.displayName = "TimePickerElement";
1957
+
1958
+ // src/wrappers/AsyncSelect/index.tsx
1959
+ import {
1960
+ Autocomplete as Autocomplete6,
1961
+ CircularProgress as CircularProgress4,
1962
+ Grid as Grid13,
1963
+ TextField as TextField8
1964
+ } from "@mui/material";
1965
+ import { debounce as debounce3 } from "@mui/material/utils";
1966
+ import * as React5 from "react";
1967
+ import {
1968
+ Fragment as Fragment4,
1969
+ useCallback as useCallback8,
1970
+ useEffect as useEffect7,
1971
+ useMemo as useMemo10,
1972
+ useRef as useRef4,
1973
+ useState as useState5
1974
+ } from "react";
1975
+ import {
1976
+ useController as useController13
1977
+ } from "react-hook-form";
1978
+ import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
1979
+ var Component11 = function AsyncSelectElement(props) {
1980
+ const {
1981
+ name,
1982
+ disabled,
1983
+ control,
1984
+ placeholder,
1985
+ initialValue,
1986
+ label,
1987
+ queryFn,
1988
+ variant,
1989
+ labelField = "Label",
1990
+ valueField = "Value",
1991
+ ...rest
1992
+ } = props;
1993
+ const {
1994
+ field,
1995
+ fieldState: { error }
1996
+ } = useController13({
1997
+ name,
1998
+ control
1999
+ });
2000
+ const [loading, setLoading] = useState5(false);
2001
+ const [selectedOption, setSelectedOption] = useState5(null);
2002
+ const [inputValue, setInputValue] = useState5("");
2003
+ const inputValue2 = useMemo10(() => inputValue, [inputValue]);
2004
+ const setInputValue2 = useCallback8(
2005
+ (newValue) => setInputValue(newValue),
2006
+ []
2007
+ );
2008
+ const [options, setOptions] = useState5([]);
2009
+ const initialValueLoaded = useRef4(
2010
+ !initialValue ? true : !(initialValue != null)
2011
+ );
2012
+ const fieldValue = useRef4(field.value);
2013
+ const fetchData = useMemo10(
2014
+ () => debounce3(
2015
+ (payload, callback) => {
2016
+ queryFn(payload).then((c) => callback(c));
2017
+ },
2018
+ 400
2019
+ ),
2020
+ [queryFn]
2021
+ );
2022
+ const fillOptions = useCallback8(
2023
+ (results) => {
2024
+ let newOptions = [];
2025
+ if (selectedOption) {
2026
+ newOptions = [selectedOption];
2027
+ }
2028
+ if (results) {
2029
+ newOptions = [...newOptions, ...results];
2030
+ }
2031
+ setOptions(newOptions);
2032
+ setLoading(false);
2033
+ },
2034
+ [selectedOption]
2035
+ );
2036
+ useEffect7(() => {
2037
+ if (initialValueLoaded.current) return void 0;
2038
+ let active = true;
2039
+ const payload = {
2040
+ query: null,
2041
+ initialValue
2042
+ };
2043
+ setLoading(true);
2044
+ fetchData(payload, (results) => {
2045
+ if (active) {
2046
+ if (!!results && results.length > 0) {
2047
+ fillOptions(results?.filter((c) => c[valueField] == initialValue));
2048
+ setSelectedOption(results[0]);
2049
+ field.onChange(results[0][valueField]);
2050
+ fieldValue.current = results[0][valueField];
2051
+ }
2052
+ initialValueLoaded.current = true;
2053
+ setLoading(false);
2054
+ }
2055
+ });
2056
+ return () => {
2057
+ active = false;
2058
+ };
2059
+ }, [initialValue, fetchData, field, fillOptions, valueField]);
2060
+ React5.useEffect(() => {
2061
+ let active = true;
2062
+ if (inputValue2 === "" || initialValueLoaded.current === false) {
2063
+ setOptions(selectedOption ? [selectedOption] : []);
2064
+ setLoading(false);
2065
+ return void 0;
2066
+ }
2067
+ if (fieldValue.current) {
2068
+ if (field.value === fieldValue.current) {
2069
+ return void 0;
2070
+ }
2071
+ }
2072
+ setLoading(true);
2073
+ const payload = {
2074
+ query: inputValue2,
2075
+ initialValue: null
2076
+ };
2077
+ fetchData(payload, (results) => {
2078
+ if (active) {
2079
+ fillOptions(results);
2080
+ }
2081
+ });
2082
+ return () => {
2083
+ active = false;
2084
+ };
2085
+ }, [
2086
+ initialValue,
2087
+ inputValue2,
2088
+ fetchData,
2089
+ field.value,
2090
+ fillOptions,
2091
+ selectedOption
2092
+ ]);
2093
+ const selectRef = useRef4(null);
2094
+ const handleChange = (_2, newSelectedOption, reason) => {
2095
+ if (reason === "clear") {
2096
+ setSelectedOption(null);
2097
+ field.onChange(null);
2098
+ setLoading(false);
2099
+ } else if (reason === "selectOption" || reason === "removeOption") {
2100
+ if (newSelectedOption) {
2101
+ setSelectedOption(newSelectedOption);
2102
+ field.onChange(newSelectedOption[valueField]);
2103
+ fieldValue.current = newSelectedOption[valueField];
2104
+ setLoading(false);
2105
+ }
2106
+ }
2107
+ setOptions([]);
2108
+ setLoading(false);
2109
+ };
2110
+ useEffect7(() => {
2111
+ if (!field.value) {
2112
+ setInputValue("");
2113
+ setSelectedOption(null);
2114
+ setLoading(false);
2115
+ }
2116
+ }, [field.value]);
2117
+ const getOptionValue = (option) => {
2118
+ return option ? String(option[valueField]) : "";
2119
+ };
2120
+ const getOptionLabel = (option) => {
2121
+ return option ? String(option[labelField]) : "";
2122
+ };
2123
+ return /* @__PURE__ */ jsx14(
2124
+ Autocomplete6,
2125
+ {
2126
+ ...rest,
2127
+ ref: selectRef,
2128
+ fullWidth: true,
2129
+ loading,
2130
+ getOptionLabel,
2131
+ getOptionKey: getOptionValue,
2132
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
2133
+ autoComplete: true,
2134
+ disabled,
2135
+ includeInputInList: true,
2136
+ options,
2137
+ filterOptions: (x) => x,
2138
+ value: selectedOption,
2139
+ filterSelectedOptions: true,
2140
+ onChange: handleChange,
2141
+ onInputChange: (_2, newInputValue) => {
2142
+ setInputValue2(newInputValue);
2143
+ },
2144
+ noOptionsText: "Type Something...",
2145
+ renderInput: (params) => /* @__PURE__ */ jsx14(
2146
+ TextField8,
2147
+ {
2148
+ ...params,
2149
+ label,
2150
+ error: !!error,
2151
+ helperText: error ? error.message : "",
2152
+ placeholder,
2153
+ slotProps: {
2154
+ input: {
2155
+ ...params.InputProps,
2156
+ endAdornment: /* @__PURE__ */ jsxs7(Fragment4, { children: [
2157
+ loading ? /* @__PURE__ */ jsx14(CircularProgress4, { color: "inherit", size: 20 }) : null,
2158
+ params.InputProps.endAdornment
2159
+ ] })
2160
+ }
2161
+ },
2162
+ variant: variant ? variant : "outlined"
2163
+ }
2164
+ ),
2165
+ renderOption: (renderProps, option) => {
2166
+ const { key, ...optionProps } = renderProps;
2167
+ return /* @__PURE__ */ jsx14("li", { ...optionProps, children: option[labelField] }, key);
2168
+ }
2169
+ }
2170
+ );
2171
+ };
2172
+ var AsyncSelectElement2 = ({
2173
+ gridProps = {},
2174
+ ...props
2175
+ }) => {
2176
+ return /* @__PURE__ */ jsx14(Grid13, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx14(
2177
+ Component11,
2178
+ {
2179
+ ...props
2180
+ }
2181
+ ) });
2182
+ };
2183
+ AsyncSelectElement2.displayName = "AsyncSelectElement";
2184
+
2185
+ // src/wrappers/NumberFieldElement/NumberFieldElement.tsx
2186
+ import { Grid as Grid14, TextField as TextField9, useForkRef as useForkRef5 } from "@mui/material";
2187
+ import { useController as useController14 } from "react-hook-form";
2188
+ import { jsx as jsx15 } from "react/jsx-runtime";
2189
+ var Component12 = function NumberFieldElement(props) {
2190
+ const {
2191
+ parseError,
2192
+ name,
2193
+ control,
2194
+ component: TextFieldComponent = TextField9,
2195
+ transform,
2196
+ fieldType = "text",
2197
+ // Default to text type
2198
+ defaultValue,
2199
+ label,
2200
+ placeholder,
2201
+ textFieldProps = {},
2202
+ variant,
2203
+ onChange: customOnChange,
2204
+ enableWarnings = process.env.NODE_ENV === "development",
2205
+ ...rest
2206
+ } = props;
2207
+ const {
2208
+ type = "number",
2209
+ required,
2210
+ helperText,
2211
+ inputRef,
2212
+ onInput,
2213
+ onBlur,
2214
+ disabled,
2215
+ ...restTextProps
2216
+ } = textFieldProps;
2217
+ const {
2218
+ field,
2219
+ fieldState: { error }
2220
+ } = useController14({
2221
+ name,
2222
+ control
2223
+ });
2224
+ const { value, onChange } = useEnhancedTransform(
2225
+ {
2226
+ value: field.value,
2227
+ onChange: field.onChange,
2228
+ transform: transform ? {
2229
+ input: transform.input,
2230
+ output: transform.output
2231
+ } : void 0,
2232
+ fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
2233
+ // Auto-detect number type
2234
+ defaultValue,
2235
+ enableWarnings
2236
+ }
2237
+ );
2238
+ const handleInputRef = useForkRef5(field.ref, inputRef);
2239
+ return /* @__PURE__ */ jsx15(
2240
+ TextFieldComponent,
2241
+ {
2242
+ ...rest,
2243
+ ...restTextProps,
2244
+ name: field.name,
2245
+ value,
2246
+ onChange: (event) => {
2247
+ const input = event.target.value;
2248
+ if (input === "") {
2249
+ field.onChange(null);
2250
+ }
2251
+ onChange(event);
2252
+ if (typeof customOnChange === "function") {
2253
+ customOnChange(event);
2254
+ }
2255
+ },
2256
+ onBlur: (event) => {
2257
+ field.onBlur();
2258
+ if (typeof onBlur === "function") {
2259
+ onBlur(event);
2260
+ }
2261
+ },
2262
+ onInput: (event) => {
2263
+ if (typeof onInput === "function") {
2264
+ onInput(event);
2265
+ }
2266
+ },
2267
+ onWheel: (e) => {
2268
+ e.target.blur();
2269
+ },
2270
+ onKeyDown: (e) => {
2271
+ if (["e", "E", "ArrowDown", "ArrowUp"].includes(e.key)) {
2272
+ e.preventDefault();
2273
+ }
2274
+ },
2275
+ disabled,
2276
+ label,
2277
+ placeholder,
2278
+ fullWidth: true,
2279
+ required,
2280
+ type,
2281
+ error: !!error,
2282
+ helperText: error ? parseError ? parseError(error) : error.message : helperText,
2283
+ inputRef: handleInputRef,
2284
+ variant: variant ? variant : "outlined"
2285
+ }
2286
+ );
2287
+ };
2288
+ var NumberFieldElement2 = ({
2289
+ gridProps = {},
2290
+ ...props
2291
+ }) => {
2292
+ return /* @__PURE__ */ jsx15(Grid14, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx15(Component12, { ...props }) });
2293
+ };
2294
+
2295
+ // src/wrappers/OTPInputElement/OTPInputElement.tsx
2296
+ import { Box, Grid as Grid15, inputBaseClasses } from "@mui/material";
2297
+ import {
2298
+ MuiOtpInput
2299
+ } from "mui-one-time-password-input";
2300
+ import { Controller } from "react-hook-form";
2301
+
2302
+ // src/wrappers/OTPInputElement/HelperText.tsx
2303
+ import FormHelperText4 from "@mui/material/FormHelperText";
2304
+ import { jsx as jsx16 } from "react/jsx-runtime";
2305
+ function HelperText({
2306
+ sx,
2307
+ helperText,
2308
+ errorMessage,
2309
+ disableGutters,
2310
+ ...other
2311
+ }) {
2312
+ if (errorMessage || helperText) {
2313
+ return /* @__PURE__ */ jsx16(
2314
+ FormHelperText4,
2315
+ {
2316
+ error: !!errorMessage,
2317
+ sx: [
2318
+ {
2319
+ mx: disableGutters ? 0 : 1.75
2320
+ },
2321
+ ...Array.isArray(sx) ? sx : [sx]
2322
+ ],
2323
+ ...other,
2324
+ children: errorMessage || helperText
2325
+ }
2326
+ );
2327
+ }
2328
+ return null;
2329
+ }
2330
+
2331
+ // src/wrappers/OTPInputElement/OTPInputElement.tsx
2332
+ import { jsx as jsx17, jsxs as jsxs8 } from "react/jsx-runtime";
2333
+ var Component13 = function OTPInputElement(props) {
2334
+ const {
2335
+ // parseError,
2336
+ name,
2337
+ control,
2338
+ slotProps,
2339
+ helperText,
2340
+ maxSize = 56,
2341
+ placeholder = "-",
2342
+ ...rest
2343
+ } = props;
2344
+ return /* @__PURE__ */ jsx17(
2345
+ Controller,
2346
+ {
2347
+ name,
2348
+ control,
2349
+ render: ({ field, fieldState: { error } }) => /* @__PURE__ */ jsxs8(
2350
+ Box,
2351
+ {
2352
+ ...slotProps?.wrapper,
2353
+ sx: [
2354
+ {
2355
+ display: "flex",
2356
+ justifyContent: "center",
2357
+ [`& .${inputBaseClasses.input}`]: {
2358
+ p: 0,
2359
+ height: "auto",
2360
+ aspectRatio: "1/1",
2361
+ maxWidth: maxSize
2362
+ }
2363
+ },
2364
+ ...Array.isArray(slotProps?.wrapper?.sx) ? slotProps?.wrapper?.sx ?? [] : [slotProps?.wrapper?.sx]
2365
+ ],
2366
+ children: [
2367
+ /* @__PURE__ */ jsx17(
2368
+ MuiOtpInput,
2369
+ {
2370
+ ...field,
2371
+ autoFocus: true,
2372
+ gap: 1.5,
2373
+ length: 4,
2374
+ TextFieldsProps: {
2375
+ placeholder,
2376
+ error: !!error,
2377
+ ...slotProps?.textfield
2378
+ },
2379
+ ...rest
2380
+ }
2381
+ ),
2382
+ /* @__PURE__ */ jsx17(
2383
+ HelperText,
2384
+ {
2385
+ ...slotProps?.helperText,
2386
+ errorMessage: error?.message,
2387
+ helperText
2388
+ }
2389
+ )
2390
+ ]
2391
+ }
2392
+ )
2393
+ }
2394
+ );
2395
+ };
2396
+ var OTPInputElement2 = ({
2397
+ gridProps = {},
2398
+ ...props
2399
+ }) => {
2400
+ return /* @__PURE__ */ jsx17(Grid15, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx17(Component13, { ...props }) });
2401
+ };
2402
+
2403
+ // src/wrappers/Field/index.ts
2404
+ var Field = {
2405
+ Text: TextFieldElement2,
2406
+ Number: NumberFieldElement2,
2407
+ Checkbox: CheckboxElement2,
2408
+ Date: DatePickerElement,
2409
+ RadioGroup: RadioButtonGroup2,
2410
+ Password: PasswordElement,
2411
+ Time: TimePickerElement2,
2412
+ Select: SelectElement2,
2413
+ SelectMulti: SelectMultiElement2,
2414
+ SelectCascade: SelectCascadeElement2,
2415
+ AsyncSelect: AsyncSelectElement2,
2416
+ AsyncMultiSelect: AsyncMultiSelect2,
2417
+ CheckboxGroup: CheckboxGroup2,
2418
+ OTPInput: OTPInputElement2
2419
+ };
2420
+
2421
+ export {
2422
+ isValidOption,
2423
+ normalizeOptions,
2424
+ AsyncSelectMultiElement2 as AsyncSelectMultiElement,
2425
+ AsyncMultiSelect2,
2426
+ CheckboxElement2 as CheckboxElement,
2427
+ CheckboxGroup2 as CheckboxGroup,
2428
+ readDatePickerValueAsDate,
2429
+ useDatePickerValue,
2430
+ useDatePickerValidation,
2431
+ useDatePickerStyles,
2432
+ DatePickerElementCore,
2433
+ DatePickerElement,
2434
+ isValidDate,
2435
+ isParsableDateString,
2436
+ createDateInputTransform,
2437
+ createDateOutputTransform,
2438
+ createDefaultDatePickerConfig,
2439
+ extractErrorMessage,
2440
+ createStableKey,
2441
+ PasswordElement,
2442
+ RadioButtonGroup2 as RadioButtonGroup,
2443
+ SelectCascadeElement2 as SelectCascadeElement,
2444
+ SelectElement2 as SelectElement,
2445
+ SelectMultiElement2 as SelectMultiElement,
2446
+ TextFieldElement2 as TextFieldElement,
2447
+ TimePickerElement2 as TimePickerElement,
2448
+ Field
2449
+ };
2450
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL3R5cGVzL2NvbW1vbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdC9Bc3luY011bHRpU2VsZWN0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdDIvQXN5bmNNdWx0aVNlbGVjdDIudHN4IiwgIi4uL3NyYy93cmFwcGVycy9DaGVja2JveEVsZW1lbnQvQ2hlY2tib3hFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hHcm91cC9DaGVja2JveEdyb3VwLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9EYXRlUGlja2VyRWxlbWVudENvcmUudHN4IiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsdWUudHMiLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L2hvb2tzL3VzZURhdGVQaWNrZXJWYWxpZGF0aW9uLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyU3R5bGVzLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC91dGlscy50cyIsICIuLi9zcmMvd3JhcHBlcnMvUGFzc3dvcmRFbGVtZW50L1Bhc3N3b3JkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1JhZGlvQnV0dG9uR3JvdXAvUmFkaW9CdXR0b25Hcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdENhc2NhZGVFbGVtZW50L1NlbGVjdENhc2NhZGVFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvU2VsZWN0RWxlbWVudC9TZWxlY3RFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvU2VsZWN0TXVsdGlFbGVtZW50L1NlbGVjdE11bHRpRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1RleHRGaWVsZEVsZW1lbnQvVGV4dEZpZWxkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1RpbWVQaWNrZXJFbGVtZW50L1RpbWVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNTZWxlY3QvaW5kZXgudHN4IiwgIi4uL3NyYy93cmFwcGVycy9OdW1iZXJGaWVsZEVsZW1lbnQvTnVtYmVyRmllbGRFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvT1RQSW5wdXRFbGVtZW50L09UUElucHV0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL09UUElucHV0RWxlbWVudC9IZWxwZXJUZXh0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRmllbGQvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29tbW9uIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHdyYXBwZXIgY29tcG9uZW50c1xuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8qKlxuICogQmFzZSBvcHRpb24gdHlwZSBmb3Igc2VsZWN0LWJhc2VkIGNvbXBvbmVudHNcbiAqXG4gKiBAdGVtcGxhdGUgViAtIFRoZSB2YWx1ZSB0eXBlIChzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlT3B0aW9uPFYgPSBzdHJpbmcgfCBudW1iZXI+IHtcbiAgLyoqXG4gICAqIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBvcHRpb25cbiAgICovXG4gIExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uXG4gICAqL1xuICBWYWx1ZTogVjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3B0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmxleGlibGUgb3B0aW9uIHR5cGUgdGhhdCBleHRlbmRzIGJhc2Ugb3B0aW9uIHdpdGggYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gKlxuICogQHRlbXBsYXRlIFQgLSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgb2JqZWN0XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBGbGV4aWJsZU9wdGlvbjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4+ID0gVCAmIEJhc2VPcHRpb247XG5cbi8qKlxuICogT3B0aW9uIHR5cGUgd2l0aCBjdXN0b21pemFibGUga2V5IG5hbWVzXG4gKiBVc2VmdWwgZm9yIGNvbXBvbmVudHMgdGhhdCBhY2NlcHQgY3VzdG9tIGxhYmVsRmllbGQvdmFsdWVGaWVsZCBwcm9wc1xuICpcbiAqIEB0ZW1wbGF0ZSBUVmFsdWVLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgdmFsdWVcbiAqIEB0ZW1wbGF0ZSBUTGFiZWxLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgbGFiZWxcbiAqIEB0ZW1wbGF0ZSBURGlzYWJsZWRLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgZGlzYWJsZWQgZmxhZ1xuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgQ3VzdG9tS2V5T3B0aW9uPFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IFJlY29yZDxUVmFsdWVLZXksIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ICZcbiAgUmVjb3JkPFRMYWJlbEtleSwgc3RyaW5nPiAmXG4gIFBhcnRpYWw8UmVjb3JkPFREaXNhYmxlZEtleSwgYm9vbGVhbj4+ICZcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogTGVnYWN5IG9wdGlvbiB0eXBlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICogVXNlcyBWYWx1ZS9MYWJlbCBuYW1pbmcgY29udmVudGlvblxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBCYXNlT3B0aW9uIG9yIEZsZXhpYmxlT3B0aW9uIGluc3RlYWRcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lPcHRpb24ge1xuICAvKipcbiAgICogRGlzcGxheSBsYWJlbCBmb3IgdGhlIG9wdGlvbiAoY2FwaXRhbGl6ZWQga2V5IG5hbWUpXG4gICAqL1xuICBMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIG9wdGlvbiAoY2FwaXRhbGl6ZWQga2V5IG5hbWUpXG4gICAqL1xuICBWYWx1ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIERpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIG9wdGlvblxuICpcbiAqIEBwYXJhbSBWYWx1ZSAtIFZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkT3B0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQmFzZU9wdGlvbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgJ0xhYmVsJyBpbiB2YWx1ZSAmJlxuICAgICdWYWx1ZScgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLkxhYmVsID09PSAnc3RyaW5nJyAmJlxuICAgICh0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLlZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5WYWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgQmFzZU9wdGlvbikuVmFsdWUgPT09ICdib29sZWFuJylcbiAgKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gbm9ybWFsaXplIG9wdGlvbnMgdG8gQmFzZU9wdGlvbiBmb3JtYXRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgYXJyYXkgdG8gbm9ybWFsaXplXG4gKiBAcGFyYW0gbGFiZWxGaWVsZCAtIEN1c3RvbSBsYWJlbCBmaWVsZCBuYW1lIGluIG9wdGlvbiBvYmplY3RzXG4gKiBAcGFyYW0gdmFsdWVGaWVsZCAtIEN1c3RvbSB2YWx1ZSBmaWVsZCBuYW1lIGluIG9wdGlvbiBvYmplY3RzXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIG9wdGlvbnMgYXJyYXlcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcHRpb25zPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIG9wdGlvbnM6IFRbXSxcbiAgbGFiZWxGaWVsZCA9ICdMYWJlbCcsXG4gIHZhbHVlRmllbGQgPSAnVmFsdWUnXG4pOiBCYXNlT3B0aW9uW10ge1xuICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgTGFiZWw6IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZF0gPz8gJycpLFxuICAgIFZhbHVlOiBvcHRpb25bdmFsdWVGaWVsZF0gYXMgc3RyaW5nIHwgbnVtYmVyLFxuICAgIGRpc2FibGVkOiBCb29sZWFuKG9wdGlvbi5kaXNhYmxlZCksXG4gIH0pKTtcbn1cbiIsICJpbXBvcnQge1xuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvQXV0b2NvbXBsZXRlJztcbmltcG9ydCBtYXRjaCBmcm9tICdhdXRvc3VnZ2VzdC1oaWdobGlnaHQvbWF0Y2gnO1xuaW1wb3J0IHBhcnNlIGZyb20gJ2F1dG9zdWdnZXN0LWhpZ2hsaWdodC9wYXJzZSc7XG5pbXBvcnQgXywgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUmVhY3QsIHtcbiAgdXNlU3RhdGUsXG4gIHVzZVJlZixcbiAgdXNlTWVtbyxcbiAgdXNlRWZmZWN0LFxuICB1c2VDYWxsYmFjayxcbiAgRnJhZ21lbnQsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgSFRNTEF0dHJpYnV0ZXMsIFN5bnRoZXRpY0V2ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jTXVsdGlTZWxlY3RFbGVtZW50UHJvcHMsIE9wdGlvbk9iamVjdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jTXVsdGlTZWxlY3RQYXlsb2FkIH0gZnJvbSAnQC90eXBlcyc7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oXG4gIHByb3BzOiBBc3luY011bHRpU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFRPcHRpb25cbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgaW5pdGlhbFZhbHVlcyxcbiAgICBsYWJlbCxcbiAgICBxdWVyeUZuLFxuICAgIHZhcmlhbnQsXG4gICAgbGFiZWxGaWVsZCA9ICdMYWJlbCcgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlRmllbGQgPSAnVmFsdWUnIGFzIFRWYWx1ZUtleSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBtdWx0aVNlbGVjdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9ucywgc2V0U2VsZWN0ZWRPcHRpb25zXSA9IHVzZVN0YXRlPFRPcHRpb25bXT4oW10pO1xuICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVN0YXRlPHJlYWRvbmx5IFRPcHRpb25bXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGluaXRpYWxWYWx1ZXNMb2FkZWQgPSB1c2VSZWY8Ym9vbGVhbj4oXG4gICAgIShpbml0aWFsVmFsdWVzICYmIGluaXRpYWxWYWx1ZXMubGVuZ3RoID4gMClcbiAgKTtcblxuICBjb25zdCBpbnB1dFZhbHVlMjogc3RyaW5nID0gdXNlTWVtbygoKSA9PiBpbnB1dFZhbHVlLCBbaW5wdXRWYWx1ZV0pO1xuICBjb25zdCBzZXRJbnB1dFZhbHVlMiA9IHVzZUNhbGxiYWNrKFxuICAgIChpbnB1dFZhbHVlOiBzdHJpbmcpID0+IHNldElucHV0VmFsdWUoaW5wdXRWYWx1ZSksXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBmZXRjaERhdGEgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBkZWJvdW5jZShcbiAgICAgICAgKFxuICAgICAgICAgIHBheWxvYWQ6IEFzeW5jTXVsdGlTZWxlY3RQYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4gdm9pZFxuICAgICAgICApID0+IHtcbiAgICAgICAgICBxdWVyeUZuKHBheWxvYWQpLnRoZW4oYyA9PiBjYWxsYmFjayhjKSk7XG4gICAgICAgIH0sXG4gICAgICAgIDQwMFxuICAgICAgKSxcbiAgICBbcXVlcnlGbl1cbiAgKTtcblxuICBjb25zdCBmaWxsT3B0aW9ucyA9IHVzZUNhbGxiYWNrKFxuICAgIChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgICBsZXQgbmV3T3B0aW9uczogcmVhZG9ubHkgVE9wdGlvbltdID0gW107XG5cbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbnMpIHtcbiAgICAgICAgbmV3T3B0aW9ucyA9IFsuLi5zZWxlY3RlZE9wdGlvbnNdO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICBjb25zdCBuZXdseUFkZGVkID0gXy5kaWZmZXJlbmNlQnkoXG4gICAgICAgICAgcmVzdWx0cyxcbiAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMsXG4gICAgICAgICAgYyA9PiBjW3ZhbHVlRmllbGRdXG4gICAgICAgICk7XG5cbiAgICAgICAgbmV3T3B0aW9ucyA9IFsuLi5uZXdPcHRpb25zLCAuLi5uZXdseUFkZGVkXTtcbiAgICAgIH1cblxuICAgICAgc2V0T3B0aW9ucyhuZXdPcHRpb25zKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH0sXG4gICAgW3NlbGVjdGVkT3B0aW9ucywgdmFsdWVGaWVsZF1cbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbml0aWFsVmFsdWVzTG9hZGVkLmN1cnJlbnQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jTXVsdGlTZWxlY3RQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IG51bGwsXG4gICAgICBpbml0aWFsVmFsdWVzLFxuICAgIH07XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuXG4gICAgZmV0Y2hEYXRhKHBheWxvYWQsIChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgICBpZiAoYWN0aXZlICYmIHJlc3VsdHMpIHtcbiAgICAgICAgc2V0U2VsZWN0ZWRPcHRpb25zKFsuLi5yZXN1bHRzXSk7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKFsuLi5yZXN1bHRzLm1hcChjID0+IGNbdmFsdWVGaWVsZF0pXSk7XG4gICAgICAgIGluaXRpYWxWYWx1ZXNMb2FkZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtpbml0aWFsVmFsdWVzLCBmZXRjaERhdGEsIGZpZWxkLCB2YWx1ZUZpZWxkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIGlmIChpbnB1dFZhbHVlMiA9PT0gJycgfHwgaW5pdGlhbFZhbHVlc0xvYWRlZC5jdXJyZW50ID09PSBmYWxzZSkge1xuICAgICAgc2V0T3B0aW9ucyhzZWxlY3RlZE9wdGlvbnMgPyBbLi4uc2VsZWN0ZWRPcHRpb25zXSA6IFtdKTtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuXG4gICAgY29uc3QgcGF5bG9hZDogQXN5bmNNdWx0aVNlbGVjdFBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogaW5wdXRWYWx1ZTIsXG4gICAgICBpbml0aWFsVmFsdWVzOiBudWxsLFxuICAgIH07XG5cbiAgICBmZXRjaERhdGEocGF5bG9hZCwgKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgZmlsbE9wdGlvbnMocmVzdWx0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW2luaXRpYWxWYWx1ZXMsIGlucHV0VmFsdWUyLCBmZXRjaERhdGEsIHNlbGVjdGVkT3B0aW9ucywgZmlsbE9wdGlvbnNdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogU3ludGhldGljRXZlbnQsXG4gICAgbmV3U2VsZWN0ZWRPcHRpb25zOiBUT3B0aW9uW10sXG4gICAgcmVhc29uOiBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb25cbiAgKSA9PiB7XG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJyB8fCBuZXdTZWxlY3RlZE9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbnMoW10pO1xuICAgICAgZmllbGQub25DaGFuZ2UoW10pO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSAnc2VsZWN0T3B0aW9uJyB8fCByZWFzb24gPT09ICdyZW1vdmVPcHRpb24nKSB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbnMobmV3U2VsZWN0ZWRPcHRpb25zKTtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1NlbGVjdGVkT3B0aW9ucy5tYXAoYyA9PiBjW3ZhbHVlRmllbGRdKSk7XG4gICAgfVxuXG4gICAgc2V0T3B0aW9ucyhbXSk7XG4gIH07XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvblt2YWx1ZUZpZWxkXSkgOiAnJztcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGRdKSA6ICcnO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgcmVmPXttdWx0aVNlbGVjdFJlZn1cbiAgICAgIG11bHRpcGxlXG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25WYWx1ZX1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWwpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbClcbiAgICAgIH1cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICB2YWx1ZT17c2VsZWN0ZWRPcHRpb25zfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICAvL2ZpbHRlck9wdGlvbnM9eyhjKSA9PiBjfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9eyhfLCBuZXdJbnB1dFZhbHVlKSA9PiB7XG4gICAgICAgIHNldElucHV0VmFsdWUyKG5ld0lucHV0VmFsdWUpO1xuICAgICAgfX1cbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxuICAgICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgICA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICByZW5kZXJPcHRpb249eyhwcm9wcywgb3B0aW9uLCBzdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9XG4gICAgICAgICAgcHJvcHMgYXMgSFRNTEF0dHJpYnV0ZXM8SFRNTExJRWxlbWVudD4gJiB7IGtleTogc3RyaW5nIH07XG4gICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gZ2V0T3B0aW9uTGFiZWwob3B0aW9uKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IG1hdGNoKG9wdGlvbkxhYmVsLCBzdGF0ZS5pbnB1dFZhbHVlLCB7IGluc2lkZVdvcmRzOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhcnNlKG9wdGlvbkxhYmVsLCBtYXRjaGVzKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIHtwYXJ0cy5tYXAoKHBhcnQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiBwYXJ0LmhpZ2hsaWdodCA/IDcwMCA6IDQwMCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3BhcnQudGV4dH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICAgIH19XG4gICAgICB7Li4ucmVzdH1cbiAgICAvPlxuICApO1xufTtcblxuY29uc3QgQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleVxuICA+LFxuPih7XG4gIGdyaWRQcm9wcyxcbiAgLi4ucHJvcHNcbn06IEFzeW5jTXVsdGlTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBUT3B0aW9uXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPlxuICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPiB7Li4ucHJvcHN9IC8+XG4gICk7XG59O1xuXG5Bc3luY1NlbGVjdE11bHRpRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdBc3luY1NlbGVjdE11bHRpJztcblxuZXhwb3J0IHsgQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQgfTtcbiIsICJpbXBvcnQge1xuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVkdWNlciwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUge1xuICBBc3luY011bHRpU2VsZWN0MlByb3BzLFxuICBBc3luY1NlbGVjdDJQYXlsb2FkLFxuICBPcHRpb24ySXRlbSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmludGVyZmFjZSBDb21wb25lbnRTdGF0ZSB7XG4gIG9wdGlvbnM6IE9wdGlvbjJJdGVtW107XG4gIHNlbGVjdGVkT3B0aW9uczogT3B0aW9uMkl0ZW1bXTtcbiAgaW5wdXRWYWx1ZTogc3RyaW5nO1xuICBsb2FkaW5nOiBib29sZWFuO1xuICBpbml0aWFsTG9hZGVkOiBib29sZWFuO1xufVxuXG50eXBlIENvbXBvbmVudEFjdGlvbiA9XG4gIHwgeyB0eXBlOiAnU0VUX09QVElPTlMnOyBwYXlsb2FkOiBPcHRpb24ySXRlbVtdIH1cbiAgfCB7IHR5cGU6ICdTRVRfU0VMRUNURURfT1BUSU9OUyc7IHBheWxvYWQ6IE9wdGlvbjJJdGVtW10gfVxuICB8IHsgdHlwZTogJ1NFVF9JTlBVVF9WQUxVRSc7IHBheWxvYWQ6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnU0VUX0xPQURJTkcnOyBwYXlsb2FkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6ICdTRVRfSU5JVElBTF9MT0FERUQnOyBwYXlsb2FkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6ICdSRVNFVF9PUFRJT05TJyB9O1xuXG5jb25zdCBpbml0aWFsU3RhdGU6IENvbXBvbmVudFN0YXRlID0ge1xuICBvcHRpb25zOiBbXSxcbiAgc2VsZWN0ZWRPcHRpb25zOiBbXSxcbiAgaW5wdXRWYWx1ZTogJycsXG4gIGxvYWRpbmc6IGZhbHNlLFxuICBpbml0aWFsTG9hZGVkOiBmYWxzZSxcbn07XG5cbmZ1bmN0aW9uIGNvbXBvbmVudFJlZHVjZXIoXG4gIHN0YXRlOiBDb21wb25lbnRTdGF0ZSxcbiAgYWN0aW9uOiBDb21wb25lbnRBY3Rpb25cbik6IENvbXBvbmVudFN0YXRlIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ1NFVF9PUFRJT05TJzpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBvcHRpb25zOiBhY3Rpb24ucGF5bG9hZCwgbG9hZGluZzogZmFsc2UgfTtcbiAgICBjYXNlICdTRVRfU0VMRUNURURfT1BUSU9OUyc6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgc2VsZWN0ZWRPcHRpb25zOiBhY3Rpb24ucGF5bG9hZCB9O1xuICAgIGNhc2UgJ1NFVF9JTlBVVF9WQUxVRSc6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgaW5wdXRWYWx1ZTogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlICdTRVRfTE9BRElORyc6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgbG9hZGluZzogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlICdTRVRfSU5JVElBTF9MT0FERUQnOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGluaXRpYWxMb2FkZWQ6IGFjdGlvbi5wYXlsb2FkIH07XG4gICAgY2FzZSAnUkVTRVRfT1BUSU9OUyc6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgb3B0aW9uczogc3RhdGUuc2VsZWN0ZWRPcHRpb25zIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5jb25zdCBBc3luY011bHRpU2VsZWN0MkNvbXBvbmVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIG5hbWUsXG4gIGNvbnRyb2wsXG4gIHBsYWNlaG9sZGVyLFxuICBpbml0aWFsVmFsdWVzLFxuICBsYWJlbCxcbiAgcXVlcnlGbixcbiAgdmFyaWFudCA9ICdvdXRsaW5lZCcsXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGRlYm91bmNlTXMgPSA0MDAsXG4gIGxvYWRpbmdUZXh0ID0gJ0xvYWRpbmcuLi4nLFxuICBub09wdGlvbnNUZXh0ID0gJ05vIG9wdGlvbnMnLFxuICByZW5kZXJJbnB1dCxcbiAgLi4ucmVzdFxufTogQXN5bmNNdWx0aVNlbGVjdDJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICBjb25zdCBbc3RhdGUsIGRpc3BhdGNoXSA9IHVzZVJlZHVjZXIoY29tcG9uZW50UmVkdWNlciwgaW5pdGlhbFN0YXRlKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBkZWJvdW5jZWRGZXRjaCA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGRlYm91bmNlKGFzeW5jIChwYXlsb2FkOiBBc3luY1NlbGVjdDJQYXlsb2FkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5Rm4ocGF5bG9hZCk7XG5cbiAgICAgICAgICAvLyBNZXJnZSBzZWxlY3RlZCBvcHRpb25zIHdpdGggc2VhcmNoIHJlc3VsdHMsIGF2b2lkaW5nIGR1cGxpY2F0ZXNcbiAgICAgICAgICBjb25zdCBtZXJnZWRPcHRpb25zID0gW1xuICAgICAgICAgICAgLi4uc3RhdGUuc2VsZWN0ZWRPcHRpb25zLFxuICAgICAgICAgICAgLi4ucmVzdWx0cy5maWx0ZXIoXG4gICAgICAgICAgICAgIG9wdGlvbiA9PlxuICAgICAgICAgICAgICAgICFzdGF0ZS5zZWxlY3RlZE9wdGlvbnMuc29tZShcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0+IHNlbGVjdGVkLnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6ICdTRVRfT1BUSU9OUycsIHBheWxvYWQ6IG1lcmdlZE9wdGlvbnMgfSk7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogJ1NFVF9MT0FESU5HJywgcGF5bG9hZDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGRlYm91bmNlTXMpLFxuICAgIFtxdWVyeUZuLCBzdGF0ZS5zZWxlY3RlZE9wdGlvbnMsIGRlYm91bmNlTXNdXG4gICk7XG5cbiAgLy8gTG9hZCBpbml0aWFsIHZhbHVlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaW5pdGlhbFZhbHVlcz8ubGVuZ3RoIHx8IHN0YXRlLmluaXRpYWxMb2FkZWQpIHJldHVybjtcblxuICAgIGRpc3BhdGNoKHsgdHlwZTogJ1NFVF9MT0FESU5HJywgcGF5bG9hZDogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0MlBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogbnVsbCxcbiAgICAgIGluaXRpYWxWYWx1ZXMsXG4gICAgfTtcblxuICAgIHF1ZXJ5Rm4ocGF5bG9hZClcbiAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogJ1NFVF9TRUxFQ1RFRF9PUFRJT05TJywgcGF5bG9hZDogcmVzdWx0cyB9KTtcbiAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6ICdTRVRfT1BUSU9OUycsIHBheWxvYWQ6IHJlc3VsdHMgfSk7XG4gICAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0lOSVRJQUxfTE9BREVEJywgcGF5bG9hZDogdHJ1ZSB9KTtcbiAgICAgICAgICBmaWVsZC5vbkNoYW5nZShyZXN1bHRzLm1hcChvcHRpb24gPT4gb3B0aW9uLnZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwYXRjaCh7IHR5cGU6ICdTRVRfTE9BRElORycsIHBheWxvYWQ6IGZhbHNlIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChfZXJyb3IgPT4ge1xuICAgICAgICBkaXNwYXRjaCh7IHR5cGU6ICdTRVRfTE9BRElORycsIHBheWxvYWQ6IGZhbHNlIH0pO1xuICAgICAgfSk7XG4gIH0sIFtpbml0aWFsVmFsdWVzLCBzdGF0ZS5pbml0aWFsTG9hZGVkLCBxdWVyeUZuLCBmaWVsZF0pO1xuXG4gIC8vIEhhbmRsZSBzZWFyY2ggaW5wdXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc3RhdGUuaW5pdGlhbExvYWRlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHN0YXRlLmlucHV0VmFsdWUgPT09ICcnKSB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6ICdSRVNFVF9PUFRJT05TJyB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKHsgdHlwZTogJ1NFVF9MT0FESU5HJywgcGF5bG9hZDogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0MlBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogc3RhdGUuaW5wdXRWYWx1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZXM6IG51bGwsXG4gICAgfTtcblxuICAgIGRlYm91bmNlZEZldGNoKHBheWxvYWQpO1xuICB9LCBbc3RhdGUuaW5wdXRWYWx1ZSwgc3RhdGUuaW5pdGlhbExvYWRlZCwgZGVib3VuY2VkRmV0Y2hdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdWYWx1ZTogT3B0aW9uMkl0ZW1bXSkgPT4ge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiAnU0VUX1NFTEVDVEVEX09QVElPTlMnLCBwYXlsb2FkOiBuZXdWYWx1ZSB9KTtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlLm1hcChvcHRpb24gPT4gb3B0aW9uLnZhbHVlKSk7XG4gICAgfSxcbiAgICBbZmllbGRdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdJbnB1dFZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogJ1NFVF9JTlBVVF9WQUxVRScsIHBheWxvYWQ6IG5ld0lucHV0VmFsdWUgfSk7XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGlzT3B0aW9uRXF1YWxUb1ZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogT3B0aW9uMkl0ZW0sIHZhbHVlOiBPcHRpb24ySXRlbSkgPT4gb3B0aW9uLnZhbHVlID09PSB2YWx1ZS52YWx1ZSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soKG9wdGlvbjogT3B0aW9uMkl0ZW0pID0+IG9wdGlvbi5sYWJlbCwgW10pO1xuXG4gIGNvbnN0IGRlZmF1bHRSZW5kZXJJbnB1dCA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIHBhcmFtczogUGFyYW1ldGVyczxSZXF1aXJlZDxBc3luY011bHRpU2VsZWN0MlByb3BzPlsncmVuZGVySW5wdXQnXT5bMF1cbiAgICApID0+IChcbiAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnR9XG4gICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICBoZWxwZXJUZXh0PXtlcnJvcj8ubWVzc2FnZX1cbiAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAge3N0YXRlLmxvYWRpbmcgJiYgKFxuICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgKSxcbiAgICBbXG4gICAgICBsYWJlbCxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgdmFyaWFudCxcbiAgICAgIGVycm9yLFxuICAgICAgc3RhdGUubG9hZGluZyxcbiAgICBdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgb3B0aW9ucz17c3RhdGUub3B0aW9uc31cbiAgICAgIHZhbHVlPXtzdGF0ZS5zZWxlY3RlZE9wdGlvbnN9XG4gICAgICBsb2FkaW5nPXtzdGF0ZS5sb2FkaW5nfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9e2lzT3B0aW9uRXF1YWxUb1ZhbHVlfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25JbnB1dENoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICBsb2FkaW5nVGV4dD17bG9hZGluZ1RleHR9XG4gICAgICBub09wdGlvbnNUZXh0PXtub09wdGlvbnNUZXh0fVxuICAgICAgcmVuZGVySW5wdXQ9e3JlbmRlcklucHV0IHx8IGRlZmF1bHRSZW5kZXJJbnB1dH1cbiAgICAgIHsuLi5yZXN0fVxuICAgIC8+XG4gICk7XG59O1xuXG5jb25zdCBBc3luY011bHRpU2VsZWN0MiA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQXN5bmNNdWx0aVNlbGVjdDJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxBc3luY011bHRpU2VsZWN0MkNvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuQXN5bmNNdWx0aVNlbGVjdDIuZGlzcGxheU5hbWUgPSAnQXN5bmNNdWx0aVNlbGVjdDInO1xuXG5leHBvcnQgeyBBc3luY011bHRpU2VsZWN0MiB9O1xuIiwgImltcG9ydCB7XG4gIENoZWNrYm94LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoLCBGaWVsZFZhbHVlcywgUGF0aFZhbHVlIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IENoZWNrYm94RWxlbWVudFByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBsYWJlbFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgcGFyc2VFcnJvcixcbiAgICB0cmFuc2Zvcm0sXG4gICAgZGlzYWJsZWQsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGlmIChmaWVsZC52YWx1ZSA9PSBudWxsIHx8IGZpZWxkLnZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgIGZpZWxkLm9uQ2hhbmdlKGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGN1c3RvbU91dHB1dFRyYW5zZm9ybSA9IHRyYW5zZm9ybT8ub3V0cHV0O1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgYm9vbGVhbj4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogdmFsdWUgPT4gISF2YWx1ZSxcbiAgICAgIG91dHB1dDpcbiAgICAgICAgdHlwZW9mIGN1c3RvbU91dHB1dFRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gKGV2ZW50T3JWYWx1ZSwgX3ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEFkYXB0ZXI6IEV4dHJhY3QgZXZlbnQgYW5kIGNoZWNrZWQgZnJvbSB0aGUgY2hlY2tib3ggb25DaGFuZ2Ugc2lnbmF0dXJlXG4gICAgICAgICAgICAgIC8vIENoZWNrYm94RWxlbWVudCBwYXNzZXMgKGV2ZW50LCBjaGVja2VkKSwgYnV0IHVzZVRyYW5zZm9ybSBleHBlY3RzIChldmVudE9yVmFsdWUsIHZhbHVlKVxuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGV2ZW50T3JWYWx1ZSBhcyBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PjtcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU91dHB1dFRyYW5zZm9ybShldmVudCwgY2hlY2tlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiAoZXZlbnRPclZhbHVlLCBfdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZXh0cmFjdCBjaGVja2VkIHN0YXRlIGZyb20gdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrZWQgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIGNoZWNrZWQ6IGJvb2xlYW5cbiAgKSA9PiB7XG4gICAgb25DaGFuZ2UoZXZlbnQsIGNoZWNrZWQpO1xuICAgIGlmICh0eXBlb2YgY3VzdG9tT25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGlzcGxheUVycm9yOiBSZWFjdE5vZGUgPSBlcnJvclxuICAgID8gdHlwZW9mIHBhcnNlRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcGFyc2VFcnJvcihlcnJvcilcbiAgICAgIDogZXJyb3IubWVzc2FnZVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0gZGlzYWJsZWQ9e2Rpc2FibGVkfT5cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgIGxhYmVsPXtsYWJlbCB8fCAnJ31cbiAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgICAgIGNvbG9yPXtyZXN0LmNvbG9yIHx8ICdwcmltYXJ5J31cbiAgICAgICAgICAgICAgY2hlY2tlZD17dmFsdWV9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgeyhkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dCkgJiYgKFxuICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dH1cbiAgICAgICAgPC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBDaGVja2JveCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgZ3JpZCBsYXlvdXQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIGNoZWNrYm94IGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIHZhbHVlIHRyYW5zZm9ybWF0aW9uLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uIHdpdGggdXNlQ29udHJvbGxlclxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nIHN1cHBvcnRcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gd2l0aCB1c2VUcmFuc2Zvcm0gaG9vayBmb3IgYm9vbGVhbiB2YWx1ZXNcbiAqIC0gQ3VzdG9taXphYmxlIGxhYmVsIGFuZCBwb3NpdGlvbmluZ1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyIHdpdGggcmVzcG9uc2l2ZSBkZXNpZ25cbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eSB3aXRoIGdlbmVyaWMgY29uc3RyYWludHNcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydCB3aXRoIHByb3BlciB0aGVtaW5nXG4gKiAtIEhlbHBlciB0ZXh0IHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgY29udGV4dFxuICogLSBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb25cbiAqIC0gU2ltcGxlIGJvb2xlYW4gdmFsdWUgaGFuZGxpbmcgd2l0aCBvcHRpb25hbCBjdXN0b20gdHJhbnNmb3Jtc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWNjZXB0VGVybXNcIlxuICogICBsYWJlbD1cIkkgYWdyZWUgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCB2YWxpZGF0aW9uIGFuZCBoZWxwZXIgdGV4dDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwibmV3c2xldHRlclwiXG4gKiAgIGxhYmVsPVwiU3Vic2NyaWJlIHRvIG5ld3NsZXR0ZXJcIlxuICogICBoZWxwZXJUZXh0PVwiWW91IGNhbiB1bnN1YnNjcmliZSBhdCBhbnkgdGltZVwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIGFjY2VwdCB0byBjb250aW51ZScgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0IGFuZCBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJpc1B1YmxpY1wiXG4gKiAgIGxhYmVsPVwiTWFrZSB0aGlzIHB1YmxpY1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBsYWJlbFByb3BzPXt7IHN4OiB7IGZvbnRXZWlnaHQ6ICdib2xkJyB9IH19XG4gKiAgIHN4PXt7IGNvbG9yOiAncHJpbWFyeS5tYWluJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHZhbHVlIHRyYW5zZm9ybWF0aW9uIChzdHJpbmcgdG8gYm9vbGVhbik6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInN0YXR1c1wiXG4gKiAgIGxhYmVsPVwiQWN0aXZlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPT09ICdhY3RpdmUnLFxuICogICAgIG91dHB1dDogKGNoZWNrZWQpID0+IGNoZWNrZWQgPyAnYWN0aXZlJyA6ICdpbmFjdGl2ZSdcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogU2ltcGxlIGJvb2xlYW4gZmllbGQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImlzRW5hYmxlZFwiXG4gKiAgIGxhYmVsPVwiRW5hYmxlIGZlYXR1cmVcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb246XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRlcm1zXCJcbiAqICAgbGFiZWw9XCJBY2NlcHQgVGVybXNcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHQoYHZhbGlkYXRpb24uJHtlcnJvci50eXBlfWAsIHsgZmllbGQ6ICdUZXJtcycgfSl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBDaGVja2JveEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lPiB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuZXhwb3J0IHsgQ2hlY2tib3hFbGVtZW50IH07XG5cbmV4cG9ydCB0eXBlIHsgQ2hlY2tib3hFbGVtZW50UHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbiIsICJpbXBvcnQgdHlwZSB7XG4gIENoZWNrYm94UHJvcHMsXG4gIEZvcm1Db250cm9sTGFiZWxQcm9wcyxcbiAgR3JpZFByb3BzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIENoZWNrYm94LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgTGVnYWN5T3B0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgQ2hlY2tib3hHcm91cCBjb21wb25lbnRcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdmFsdWUgYXJyYXkgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgQ2hlY2tib3hHcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+ID0gT21pdDxDaGVja2JveFByb3BzLCAnbmFtZSc+ICYge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICovXG4gIG5hbWU6IFROYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuXG4gIC8qKlxuICAgKiBMYWJlbCBmb3IgdGhlIGNoZWNrYm94IGdyb3VwXG4gICAqL1xuICBsYWJlbD86IEZvcm1Db250cm9sTGFiZWxQcm9wc1snbGFiZWwnXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgRm9ybUNvbnRyb2xMYWJlbFxuICAgKi9cbiAgbGFiZWxQcm9wcz86IE9taXQ8Rm9ybUNvbnRyb2xMYWJlbFByb3BzLCAnbGFiZWwnIHwgJ2NvbnRyb2wnPjtcblxuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyXG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiBvcHRpb25zIGZvciB0aGUgY2hlY2tib3ggZ3JvdXBcbiAgICogQGRlcHJlY2F0ZWQgVXNlIG9wdGlvbnMgd2l0aCBsb3dlcmNhc2Uga2V5cyAobGFiZWwsIHZhbHVlKSBpbnN0ZWFkXG4gICAqL1xuICBvcHRpb25zOiBMZWdhY3lPcHRpb25bXTtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94R3JvdXA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IENoZWNrYm94R3JvdXBQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7IG5hbWUsIGNvbnRyb2wsIGxhYmVsUHJvcHMsIG9wdGlvbnMsIC4uLnJlc3QgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQ6IHJlc3QuZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGNvbnN0IFtzZWxlY3RlZFZhbHVlcywgc2V0U2VsZWN0ZWRWYWx1ZXNdID0gdXNlU3RhdGU8bnVtYmVyW10+KFxuICAgIG9wdGlvbnMuZmlsdGVyKGMgPT4gZmllbGQudmFsdWU/LmluY2x1ZGVzKGMuVmFsdWUpKS5tYXAoYyA9PiBjLlZhbHVlKSB8fCBbXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZmllbGQub25DaGFuZ2Uoc2VsZWN0ZWRWYWx1ZXMgPyBbLi4uc2VsZWN0ZWRWYWx1ZXNdIDogW10pO1xuICB9LCBbc2VsZWN0ZWRWYWx1ZXMsIGZpZWxkXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSwgMTApO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBwYXJzaW5nIHdhcyBzdWNjZXNzZnVsXG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWVzKHByZXYgPT4gWy4uLnByZXYsIHZhbHVlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWVzKHByZXYgPT4gcHJldi5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSB2YWx1ZSkpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICB7b3B0aW9ucy5tYXAob3B0aW9uID0+IChcbiAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAga2V5PXtgJHtvcHRpb24uVmFsdWV9YH1cbiAgICAgICAgICAgIGxhYmVsPXtvcHRpb24uTGFiZWx9XG4gICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCAncHJpbWFyeSd9XG4gICAgICAgICAgICAgICAgdmFsdWU9e29wdGlvbi5WYWx1ZX1cbiAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZFZhbHVlcy5pbmNsdWRlcyhvcHRpb24uVmFsdWUpfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIHtlcnJvciAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dCBlcnJvcj17ISFlcnJvcn0+e2Vycm9yLm1lc3NhZ2V9PC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBDaGVja2JveEdyb3VwIGNvbXBvbmVudCBmb3IgbXVsdGlwbGUgY2hlY2tib3ggc2VsZWN0aW9uLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZ3JvdXAgb2YgY2hlY2tib3hlcyB0aGF0IHdvcmsgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIG1hbmFnaW5nIGFuIGFycmF5IG9mIHNlbGVjdGVkIHZhbHVlcyB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGFuZCBlcnJvciBoYW5kbGluZy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gTXVsdGlwbGUgY2hlY2tib3ggc2VsZWN0aW9uIHdpdGggYXJyYXkgdmFsdWUgbWFuYWdlbWVudFxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydFxuICogLSBOYU4gdmFsaWRhdGlvbiBmb3IgbnVtZXJpYyB2YWx1ZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEdyb3VwXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJzZWxlY3RlZENhdGVnb3JpZXNcIlxuICogICBvcHRpb25zPXtbXG4gKiAgICAgeyBWYWx1ZTogMSwgTGFiZWw6ICdDYXRlZ29yeSAxJyB9LFxuICogICAgIHsgVmFsdWU6IDIsIExhYmVsOiAnQ2F0ZWdvcnkgMicgfSxcbiAqICAgICB7IFZhbHVlOiAzLCBMYWJlbDogJ0NhdGVnb3J5IDMnIH0sXG4gKiAgIF19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hHcm91cFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicGVybWlzc2lvbnNcIlxuICogICBvcHRpb25zPXtwZXJtaXNzaW9uT3B0aW9uc31cbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIGRpc2FibGVkPXshaGFzRWRpdFBlcm1pc3Npb259XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHZhbHVlIGFycmF5IHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IENoZWNrYm94R3JvdXAgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IENoZWNrYm94R3JvdXBQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbkNoZWNrYm94R3JvdXAuZGlzcGxheU5hbWUgPSAnQ2hlY2tib3hHcm91cCc7XG5cbmV4cG9ydCB7IENoZWNrYm94R3JvdXAgfTtcbiIsICJpbXBvcnQgeyBHcmlkIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudENvcmUgfSBmcm9tIFwiLi9EYXRlUGlja2VyRWxlbWVudENvcmVcIjtcbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlckVsZW1lbnRQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQSBmdWxseS1mZWF0dXJlZCwgdHlwZS1zYWZlIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCBmb3IgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IGNvbWJpbmVzIHRoZSBjb3JlIGRhdGUgcGlja2VyIGZ1bmN0aW9uYWxpdHkgd2l0aCBvcHRpb25hbCBHcmlkIGxheW91dCB3cmFwcGluZyxcbiAqIHByb3ZpZGluZyBhIGNvbXBsZXRlIHNvbHV0aW9uIGZvciBmb3JtLWJhc2VkIGRhdGUgc2VsZWN0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBUeXBlU2NyaXB0IHN1cHBvcnQuXG4gKlxuICogS2V5IEZlYXR1cmVzOlxuICogLSBcdUQ4M0NcdURGQUYgKipUeXBlIFNhZmV0eSoqOiBGdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBmb3JtIGZpZWxkIHR5cGVzIGFuZCBkYXRlIHZhbHVlc1xuICogLSBcdUQ4M0RcdUREMjcgKipSZWFjdCBIb29rIEZvcm0gSW50ZWdyYXRpb24qKjogU2VhbWxlc3MgaW50ZWdyYXRpb24gd2l0aCByZWFjdC1ob29rLWZvcm0gdmFsaWRhdGlvblxuICogLSBcdUQ4M0NcdURGQTggKipUaGVtaW5nKio6IEF1dG9tYXRpYyBhZGFwdGF0aW9uIHRvIE1VSSB0aGVtZSB3aXRoIGN1c3RvbWl6YWJsZSBzdHlsZXNcbiAqIC0gXHUyNjdGICoqQWNjZXNzaWJpbGl0eSoqOiBXQ0FHLWNvbXBsaWFudCB3aXRoIHByb3BlciBBUklBIGF0dHJpYnV0ZXMgYW5kIGtleWJvYXJkIG5hdmlnYXRpb25cbiAqIC0gXHVEODNEXHVERTgwICoqUGVyZm9ybWFuY2UqKjogT3B0aW1pemVkIHdpdGggbWVtb2l6YXRpb24gYW5kIGVmZmljaWVudCByZS1yZW5kZXJpbmdcbiAqIC0gXHVEODNEXHVEQ0YxICoqUmVzcG9uc2l2ZSoqOiBCdWlsdC1pbiBHcmlkIGxheW91dCB3aXRoIGNvbmZpZ3VyYWJsZSBicmVha3BvaW50c1xuICogLSBcdUQ4M0RcdURFRTFcdUZFMEYgKipWYWxpZGF0aW9uKio6IENvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlc1xuICogLSBcdUQ4M0RcdUREMDQgKipUcmFuc2Zvcm1hdGlvbioqOiBGbGV4aWJsZSB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGZvcm0gYW5kIHBpY2tlciBmb3JtYXRzXG4gKiAtIFx1RDgzRFx1RENEQSAqKkRldmVsb3BlciBFeHBlcmllbmNlKio6IFJpY2ggVHlwZVNjcmlwdCBJbnRlbGxpU2Vuc2UgYW5kIGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGF1dG9tYXRpYyBHcmlkIHdyYXBwZXI6XG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZUZvcm0gfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuICogaW1wb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnQgfSBmcm9tICdAZ253ZWJzb2Z0L3VpL3dyYXBwZXJzJztcbiAqXG4gKiBmdW5jdGlvbiBNeUZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IGJpcnRoRGF0ZTogc3RyaW5nIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cImJpcnRoRGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJEYXRlIG9mIEJpcnRoXCJcbiAqICAgICAgIHJlcXVpcmVkXG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSB0cmFuc2Zvcm1hdGlvbiBhbmQgdmFsaWRhdGlvbjpcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQWR2YW5jZWRGb3JtKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08eyBzdGFydERhdGU6IERhdGUgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICBuYW1lPVwic3RhcnREYXRlXCJcbiAqICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICBsYWJlbD1cIlByb2plY3QgU3RhcnQgRGF0ZVwiXG4gKiAgICAgICB0cmFuc2Zvcm09e3tcbiAqICAgICAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gbmV3IERhdGUoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS50b0lTT1N0cmluZygpIDogbnVsbFxuICogICAgICAgfX1cbiAqICAgICAgIHZhbGlkYXRpb249e3tcbiAqICAgICAgICAgbWluRGF0ZTogbmV3IERhdGUoKSxcbiAqICAgICAgICAgbWF4RGF0ZTogYWRkWWVhcnMobmV3IERhdGUoKSwgMiksXG4gKiAgICAgICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgICAgICBtaW5EYXRlOiAnU3RhcnQgZGF0ZSBtdXN0IGJlIHRvZGF5IG9yIGxhdGVyJyxcbiAqICAgICAgICAgICBtYXhEYXRlOiAnU3RhcnQgZGF0ZSBjYW5ub3QgYmUgbW9yZSB0aGFuIDIgeWVhcnMgaW4gdGhlIGZ1dHVyZSdcbiAqICAgICAgICAgfVxuICogICAgICAgfX1cbiAqICAgICAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICAgICAgc3g9e3tcbiAqICAgICAgICAgJyYgLk11aUlucHV0TGFiZWwtcm9vdCc6IHtcbiAqICAgICAgICAgICBmb250V2VpZ2h0OiAnYm9sZCdcbiAqICAgICAgICAgfVxuICogICAgICAgfX1cbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGhvdXQgR3JpZCB3cmFwcGVyIGZvciBjdXN0b20gbGF5b3V0czpcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQ3VzdG9tTGF5b3V0KCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08eyBldmVudERhdGU6IHN0cmluZyB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Qm94IGRpc3BsYXk9XCJmbGV4XCIgZ2FwPXsyfT5cbiAqICAgICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgICBuYW1lPVwiZXZlbnREYXRlXCJcbiAqICAgICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgICAgbGFiZWw9XCJFdmVudCBEYXRlXCJcbiAqICAgICAgICAgZ3JpZFByb3BzPXtmYWxzZX0gLy8gRGlzYWJsZXMgR3JpZCB3cmFwcGVyXG4gKiAgICAgICAvPlxuICogICAgICAgPEJ1dHRvbiB0eXBlPVwic3VibWl0XCI+U3VibWl0PC9CdXR0b24+XG4gKiAgICAgPC9Cb3g+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBsb2FkaW5nIHN0YXRlIGFuZCBjdXN0b20gZXJyb3IgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIExvYWRpbmdGb3JtKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3QgW2lzVmFsaWRhdGluZywgc2V0SXNWYWxpZGF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICBuYW1lPVwiYXBwb2ludG1lbnREYXRlXCJcbiAqICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICBsYWJlbD1cIkFwcG9pbnRtZW50IERhdGVcIlxuICogICAgICAgbG9hZGluZz17aXNWYWxpZGF0aW5nfVxuICogICAgICAgTG9hZGluZ0NvbXBvbmVudD17KCkgPT4gPENpcmN1bGFyUHJvZ3Jlc3Mgc2l6ZT17MjB9IC8+fVxuICogICAgICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiB7XG4gKiAgICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yPy50eXBlID09PSAnY3VzdG9tJykge1xuICogICAgICAgICAgIHJldHVybiAnVGhpcyBkYXRlIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgYXBwb2ludG1lbnQnO1xuICogICAgICAgICB9XG4gKiAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgZGF0ZSc7XG4gKiAgICAgICB9fVxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGUgKGluZmVycmVkIGZyb20gY29udHJvbClcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGUgKGluZmVycmVkIGZyb20gbmFtZSBwcm9wKVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlIChpbmZlcnJlZCBmcm9tIHRyYW5zZm9ybSBmdW5jdGlvbnMpXG4gKiBAdGVtcGxhdGUgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSAtIFdoZXRoZXIgYWNjZXNzaWJsZSBmaWVsZCBET00gc3RydWN0dXJlIGlzIGVuYWJsZWRcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHMgd2l0aCBmdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlXG4gKiBAcGFyYW0gcmVmIC0gRm9yd2FyZCByZWYgZm9yIHRoZSByb290IGVsZW1lbnQgKEdyaWQgb3IgRGF0ZVBpY2tlciBjb250YWluZXIpXG4gKiBAcmV0dXJucyBSZW5kZXJlZCBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqL1xuY29uc3QgRGF0ZVBpY2tlckVsZW1lbnQgPSBmb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgRGF0ZVBpY2tlckVsZW1lbnRQcm9wczxhbnksIGFueSwgYW55LCBhbnk+XG4+KDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+KFxuICBwcm9wczogRGF0ZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWUsIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICByZWY6IFJlYWN0LlJlZjxIVE1MRGl2RWxlbWVudD5cbikgPT4ge1xuICBjb25zdCB7XG4gICAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgICAuLi5jb3JlUHJvcHNcbiAgfSA9IHByb3BzO1xuXG4gIC8vIElmIGdyaWRQcm9wcyBpcyBleHBsaWNpdGx5IGZhbHNlLCByZW5kZXIgd2l0aG91dCBHcmlkIHdyYXBwZXJcbiAgaWYgKGdyaWRQcm9wcyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgey4uLmNvcmVQcm9wc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlbmRlciB3aXRoIEdyaWQgd3JhcHBlciBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRcbiAgcmV0dXJuIChcbiAgICA8R3JpZFxuICAgICAgcmVmPXtyZWZ9XG4gICAgICB7Li4uZ3JpZFByb3BzfVxuICAgID5cbiAgICAgIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAgICAgICAgey4uLmNvcmVQcm9wc31cbiAgICAgIC8+XG4gICAgPC9HcmlkPlxuICApO1xufSk7XG5cbi8vIFNldCBkaXNwbGF5IG5hbWUgZm9yIFJlYWN0IERldmVsb3BlciBUb29sc1xuRGF0ZVBpY2tlckVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIkRhdGVQaWNrZXJFbGVtZW50XCI7XG5cbmV4cG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVQaWNrZXJFbGVtZW50O1xuIiwgImltcG9ydCB7IHVzZUZvcmtSZWYgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IERhdGVQaWNrZXIgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCB0eXBlIHtcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG4gIFBpY2tlclZhbGlkRGF0ZSxcbn0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIEZpZWxkUGF0aCB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7XG4gIHVzZURhdGVQaWNrZXJWYWx1ZSxcbiAgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24sXG4gIHVzZURhdGVQaWNrZXJTdHlsZXMsXG59IGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFRoZSBjb3JlIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCB3aXRob3V0IEdyaWQgd3JhcHBlci5cbiAqXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQsIHBlcmZvcm1hbnQgZGF0ZSBwaWNrZXIgY29tcG9uZW50IHRoYXQgaW50ZWdyYXRlcyBzZWFtbGVzc2x5XG4gKiB3aXRoIHJlYWN0LWhvb2stZm9ybSB3aGlsZSBwcm92aWRpbmcgY29tcHJlaGVuc2l2ZSBUeXBlU2NyaXB0IHN1cHBvcnQgYW5kXG4gKiBhY2Nlc3NpYmlsaXR5IGZlYXR1cmVzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBmb3JtIGZpZWxkIHR5cGVzXG4gKiAtIEF1dG9tYXRpYyB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGZvcm0gYW5kIHBpY2tlciBmb3JtYXRzXG4gKiAtIENvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlc1xuICogLSBUaGVtZS1hd2FyZSBzdHlsaW5nIHdpdGggYWNjZXNzaWJpbGl0eSBzdXBwb3J0XG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXplZCB3aXRoIHByb3BlciBtZW1vaXphdGlvblxuICogLSBGb3J3YXJkIHJlZiBzdXBwb3J0IGZvciBhZHZhbmNlZCB1c2UgY2FzZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAqICAgbmFtZT1cImJpcnRoRGF0ZVwiXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgIHJlcXVpcmVkXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHRyYW5zZm9ybWF0aW9uOlxuICogYGBgdHN4XG4gKiA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gKiAgIG5hbWU9XCJzdGFydERhdGVcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIlN0YXJ0IERhdGVcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfX1cbiAqICAgdmFsaWRhdGlvbj17e1xuICogICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcidcbiAqICAgICB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIC0gV2hldGhlciBhY2Nlc3NpYmxlIGZpZWxkIERPTSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZFxuICovXG5jb25zdCBEYXRlUGlja2VyRWxlbWVudENvcmUgPSBmb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPihcbiAgPFxuICAgIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gICAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICAgIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICA+KFxuICAgIHByb3BzOiBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wczxcbiAgICAgIFRGaWVsZFZhbHVlcyxcbiAgICAgIFROYW1lLFxuICAgICAgVFZhbHVlLFxuICAgICAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZVxuICAgID4sXG4gICAgcmVmOiBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+XG4gICkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICByZXF1aXJlZCA9IGZhbHNlLFxuICAgICAgY29udHJvbCxcbiAgICAgIHBhcnNlRXJyb3IsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB2YWxpZGF0aW9uLFxuICAgICAgbGFiZWwsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHRleHRSZWFkT25seSA9IGZhbHNlLFxuICAgICAgaGVscGVyVGV4dCxcbiAgICAgIGlucHV0UHJvcHMgPSB7fSxcbiAgICAgIHNsb3RQcm9wcyA9IHt9LFxuICAgICAgZGF0ZVBpY2tlclByb3BzID0ge30sXG4gICAgICB2YXJpYW50ID0gJ291dGxpbmVkJyxcbiAgICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgICAuLi5yZXN0UHJvcHNcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvLyBFeHRyYWN0IERhdGVQaWNrZXItc3BlY2lmaWMgcHJvcHNcbiAgICBjb25zdCB7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGlucHV0UmVmOiBleHRlcm5hbElucHV0UmVmLFxuICAgICAgb25DbG9zZSxcbiAgICAgIC4uLnJlc3REYXRlUGlja2VyUHJvcHNcbiAgICB9ID0gZGF0ZVBpY2tlclByb3BzO1xuXG4gICAgLy8gU2V0IHVwIGZvcm0gY29udHJvbGxlclxuICAgIGNvbnN0IHsgZmllbGQsIGZpZWxkU3RhdGUgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgICAgbmFtZSxcbiAgICAgIGNvbnRyb2wsXG4gICAgICBkZWZhdWx0VmFsdWU6IG51bGwgYXMgYW55LCAvLyBMZXQgcmVhY3QtaG9vay1mb3JtIGhhbmRsZSB0aGUgZGVmYXVsdCB2YWx1ZSB0eXBpbmdcbiAgICB9KTtcblxuICAgIC8vIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGhvb2tcbiAgICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZTogb25WYWx1ZUNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAgICAgIGZpZWxkLFxuICAgICAgdHJhbnNmb3JtLFxuICAgIH0pO1xuXG4gICAgLy8gVmFsaWRhdGlvbiBob29rXG4gICAgY29uc3QgeyBoYXNFcnJvciwgZXJyb3JNZXNzYWdlLCBpbnZhbGlkIH0gPSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbih7XG4gICAgICBmaWVsZFN0YXRlLFxuICAgICAgdmFsaWRhdGlvbixcbiAgICAgIHBhcnNlRXJyb3IsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcblxuICAgIC8vIFN0eWxpbmcgaG9va1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lIH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAgICAgIGRpc2FibGVkLFxuICAgICAgaGFzRXJyb3IsXG4gICAgICBsb2FkaW5nLFxuICAgICAgdGV4dFJlYWRPbmx5LFxuICAgIH0pO1xuXG4gICAgLy8gTWVyZ2UgaW5wdXQgcmVmc1xuICAgIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGV4dGVybmFsSW5wdXRSZWYpO1xuXG4gICAgLy8gTWVtb2l6ZWQgY2hhbmdlIGhhbmRsZXIgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgICAoXG4gICAgICAgIG5ld1ZhbHVlOiBUVmFsdWUgfCBudWxsLFxuICAgICAgICBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxEYXRlVmFsaWRhdGlvbkVycm9yPlxuICAgICAgKSA9PiB7XG4gICAgICAgIG9uVmFsdWVDaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIFtvblZhbHVlQ2hhbmdlXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBjbG9zZSBoYW5kbGVyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSB1c2VDYWxsYmFjayhcbiAgICAgICguLi5hcmdzOiBQYXJhbWV0ZXJzPE5vbk51bGxhYmxlPHR5cGVvZiBvbkNsb3NlPj4pID0+IHtcbiAgICAgICAgLy8gVHJpZ2dlciBmb3JtIGZpZWxkIGJsdXIgZm9yIHZhbGlkYXRpb25cbiAgICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBleHRlcm5hbCBvbkNsb3NlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgICAgb25DbG9zZSguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICAgIFtmaWVsZC5vbkJsdXIsIG9uQ2xvc2VdXG4gICAgKTtcblxuICAgIC8vIE1lbW9pemVkIGJsdXIgaGFuZGxlciBmb3IgdGV4dCBmaWVsZFxuICAgIGNvbnN0IGhhbmRsZVRleHRGaWVsZEJsdXIgPSB1c2VDYWxsYmFjayhcbiAgICAgIChldmVudDogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcblxuICAgICAgICAvLyBDYWxsIGV4dGVybmFsIG9uQmx1ciBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodHlwZW9mIGlucHV0UHJvcHMub25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgICAgW2ZpZWxkLm9uQmx1ciwgaW5wdXRQcm9wcy5vbkJsdXJdXG4gICAgKTtcblxuICAgIC8vIE1lbW9pemVkIHNsb3QgcHJvcHMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gICAgY29uc3QgbWVtb2l6ZWRTbG90UHJvcHMgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgLi4uc2xvdFByb3BzLFxuICAgICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ3RvZGF5JywgJ2NhbmNlbCcsICdhY2NlcHQnXSBhcyBBcnJheTxcbiAgICAgICAgICAgICdhY2NlcHQnIHwgJ2NhbmNlbCcgfCAnY2xlYXInIHwgJ25leHQnIHwgJ25leHRPckFjY2VwdCcgfCAndG9kYXknXG4gICAgICAgICAgPixcbiAgICAgICAgICAuLi5zbG90UHJvcHMuYWN0aW9uQmFyLFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgICB2YXJpYW50LFxuICAgICAgICAgIG9uQmx1cjogaGFuZGxlVGV4dEZpZWxkQmx1cixcbiAgICAgICAgICBlcnJvcjogaGFzRXJyb3IsXG4gICAgICAgICAgaGVscGVyVGV4dDogaGFzRXJyb3IgPyBlcnJvck1lc3NhZ2UgOiBoZWxwZXJUZXh0LFxuICAgICAgICAgIGlucHV0UHJvcHM6IHtcbiAgICAgICAgICAgIHJlYWRPbmx5OiB0ZXh0UmVhZE9ubHksXG4gICAgICAgICAgICAnYXJpYS1pbnZhbGlkJzogaW52YWxpZCxcbiAgICAgICAgICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogaGFzRXJyb3IgPyBgJHtuYW1lfS1lcnJvcmAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAuLi5pbnB1dFByb3BzLmlucHV0UHJvcHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBBZGQgbG9hZGluZyBpbmRpY2F0b3IgaWYgcHJvdmlkZWRcbiAgICAgICAgICAuLi4obG9hZGluZyAmJlxuICAgICAgICAgICAgTG9hZGluZ0NvbXBvbmVudCAmJiB7XG4gICAgICAgICAgICAgIElucHV0UHJvcHM6IHtcbiAgICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IDxMb2FkaW5nQ29tcG9uZW50IC8+LFxuICAgICAgICAgICAgICAgIC4uLmlucHV0UHJvcHMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIC4uLnNsb3RQcm9wcy50ZXh0RmllbGQsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIFtcbiAgICAgICAgc2xvdFByb3BzLFxuICAgICAgICBpbnB1dFByb3BzLFxuICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgIHZhcmlhbnQsXG4gICAgICAgIGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgICAgIGhhc0Vycm9yLFxuICAgICAgICBlcnJvck1lc3NhZ2UsXG4gICAgICAgIGhlbHBlclRleHQsXG4gICAgICAgIHRleHRSZWFkT25seSxcbiAgICAgICAgaW52YWxpZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgICAgTG9hZGluZ0NvbXBvbmVudCxcbiAgICAgIF1cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxEYXRlUGlja2VyXG4gICAgICAgIC8vIFNwcmVhZCByZXN0IHByb3BzIGZpcnN0IHNvIHRoZXkgY2FuIGJlIG92ZXJyaWRkZW5cbiAgICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgICAgey4uLnJlc3REYXRlUGlja2VyUHJvcHN9XG4gICAgICAgIC8vIENvcmUgcHJvcHNcbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIG5hbWU9e25hbWV9XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2V9XG4gICAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgICAgLy8gVUkgcHJvcHNcbiAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAvLyBTbG90IHByb3BzXG4gICAgICAgIHNsb3RQcm9wcz17bWVtb2l6ZWRTbG90UHJvcHN9XG4gICAgICAgIC8vIEFjY2Vzc2liaWxpdHkgcHJvcHNcbiAgICAgICAgYXJpYS1pbnZhbGlkPXtpbnZhbGlkfVxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PXtoYXNFcnJvciA/IGAke25hbWV9LWVycm9yYCA6IHVuZGVmaW5lZH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuKTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgZGVidWdnaW5nXG5EYXRlUGlja2VyRWxlbWVudENvcmUuZGlzcGxheU5hbWUgPSAnRGF0ZVBpY2tlckVsZW1lbnRDb3JlJztcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlIH07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVQaWNrZXJFbGVtZW50Q29yZTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIFVzZUNvbnRyb2xsZXJSZXR1cm4sXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBEYXRlVHJhbnNmb3JtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogVHlwZS1zYWZlIGRhdGUgdmFsdWUgcmVhZGVyIHRoYXQgaGFuZGxlcyBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIGZyb20gdGhlIGRhdGUgYWRhcHRlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgbG9jYWxpemF0aW9uIGNvbnRleHQgZnJvbSBNVUkgZGF0ZSBwaWNrZXJzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydCAoc3RyaW5nLCBkYXRlLCBvciBudWxsKVxuICogQHJldHVybnMgUHJvcGVybHkgdHlwZWQgZGF0ZSB2YWx1ZSBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgVERhdGUgfCB1bmRlZmluZWRcbik6IFREYXRlIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIGEgZGF0ZVxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgcmV0dXJuIHBhcnNlZERhdGUgYXMgVERhdGU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgY29udHJvbGxlciBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBmaWVsZDogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdO1xuICAvKiogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zICovXG4gIHRyYW5zZm9ybT86IERhdGVUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPiB7XG4gIC8qKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIHBpY2tlciAqL1xuICB2YWx1ZTogVFZhbHVlIHwgbnVsbDtcbiAgLyoqIENoYW5nZSBoYW5kbGVyIGZvciBwaWNrZXIgdmFsdWUgdXBkYXRlcyAqL1xuICBvbkNoYW5nZTogKFxuICAgIHZhbHVlOiBUVmFsdWUgfCBudWxsLFxuICAgIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+XG4gICkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWx1ZSB0cmFuc2Zvcm1hdGlvbnMgd2l0aCB0eXBlIHNhZmV0eVxuICogXG4gKiBUaGlzIGhvb2sgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIGZvcm0gZmllbGQgdmFsdWVzIGFuZCBkYXRlIHBpY2tlciB2YWx1ZXMsXG4gKiBhcHBseWluZyBjdXN0b20gdHJhbnNmb3JtYXRpb25zIHdoaWxlIG1haW50YWluaW5nIHN0cmljdCBUeXBlU2NyaXB0IHR5cGluZy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFVzYWdlIHdpdGggRGF5LmpzIGRhdGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAqICAgZmllbGQsXG4gKiAgIHRyYW5zZm9ybToge1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IGRheWpzKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB2YWx1ZSB0cmFuc2Zvcm1hdGlvblxuICogQHJldHVybnMgT2JqZWN0IHdpdGggdHJhbnNmb3JtZWQgdmFsdWUgYW5kIGNoYW5nZSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclZhbHVlT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlPiB7XG4gIGNvbnN0IHsgZmllbGQsIHRyYW5zZm9ybSB9ID0gb3B0aW9ucztcbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICAvLyBUcmFuc2Zvcm0gdGhlIGZpZWxkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXJcbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKCgpOiBUVmFsdWUgfCBudWxsID0+IHtcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybS5pbnB1dChmaWVsZC52YWx1ZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IGhhbmRsZSBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gICAgcmV0dXJuIHJlYWREYXRlUGlja2VyVmFsdWVBc0RhdGUoYWRhcHRlciwgZmllbGQudmFsdWUpIGFzIFRWYWx1ZSB8IG51bGw7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZmllbGQudmFsdWUsIHRyYW5zZm9ybT8uaW5wdXQsIGFkYXB0ZXJdKTtcblxuICAvLyBDcmVhdGUgYSBzdGFibGUgY2hhbmdlIGhhbmRsZXJcbiAgY29uc3Qgb25DaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3VmFsdWU6IFRWYWx1ZSB8IG51bGwsIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRyYW5zZm9ybS5vdXRwdXQobmV3VmFsdWUsIGNvbnRleHQpO1xuXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKHRyYW5zZm9ybWVkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0cmFuc2Zvcm1hdGlvbjogc3RvcmUgdGhlIGRhdGUgYXMtaXNcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbZmllbGQub25DaGFuZ2UsIHRyYW5zZm9ybT8ub3V0cHV0XVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWx1ZTsiLCAiaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZEVycm9yLFxuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBVc2VDb250cm9sbGVyUmV0dXJuLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24gaG9va1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgc3RhdGUgZnJvbSByZWFjdC1ob29rLWZvcm0gY29udHJvbGxlciAqL1xuICBmaWVsZFN0YXRlOiBVc2VDb250cm9sbGVyUmV0dXJuPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wiZmllbGRTdGF0ZVwiXTtcbiAgLyoqIFZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGRhdGUgcGlja2VyICovXG4gIHZhbGlkYXRpb24/OiBEYXRlUGlja2VyVmFsaWRhdGlvbkNvbmZpZzxUVmFsdWU+O1xuICAvKiogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKiBUaGUgY3VycmVudCBkYXRlIHZhbHVlIGZvciB2YWxpZGF0aW9uICovXG4gIHZhbHVlPzogVFZhbHVlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBoYXMgYW55IHZhbGlkYXRpb24gZXJyb3JzICovXG4gIGhhc0Vycm9yOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBlcnJvciAoZm9ybSBvciBkYXRlLXNwZWNpZmljKSAqL1xuICBlcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U6IFJlYWN0Tm9kZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGluIGFuIGludmFsaWQgc3RhdGUgKi9cbiAgaW52YWxpZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGVycm9yIG1lc3NhZ2VzIGZvciBjb21tb24gZGF0ZSB2YWxpZGF0aW9uIHNjZW5hcmlvc1xuICovXG5jb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTID0ge1xuICBpbnZhbGlkRGF0ZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIsXG4gIG1pbkRhdGU6IFwiRGF0ZSBtdXN0IGJlIGFmdGVyIHRoZSBtaW5pbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBtYXhEYXRlOiBcIkRhdGUgbXVzdCBiZSBiZWZvcmUgdGhlIG1heGltdW0gYWxsb3dlZCBkYXRlXCIsXG4gIGRpc2FibGVkRGF0ZTogXCJUaGlzIGRhdGUgaXMgbm90IGFsbG93ZWRcIixcbiAgcmVxdWlyZWQ6IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWxpZGF0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBlcnJvciBoYW5kbGluZ1xuICogXG4gKiBUaGlzIGhvb2sgY2VudHJhbGl6ZXMgdmFsaWRhdGlvbiBsb2dpYyBmb3IgZGF0ZSBwaWNrZXJzLCBoYW5kbGluZyBib3RoXG4gKiByZWFjdC1ob29rLWZvcm0gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbiBlcnJvcnNcbiAqIGZyb20gTVVJIGRhdGUgcGlja2Vycy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggZm9ybSB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGludmFsaWQgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgdmFsaWRhdGlvbjoge1xuICogICAgIG1pbkRhdGU6IGRheWpzKCkuc3VidHJhY3QoMSwgJ3llYXInKSxcbiAqICAgICBtYXhEYXRlOiBkYXlqcygpLmFkZCgxLCAneWVhcicpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdEYXRlIG11c3QgYmUgd2l0aGluIHRoZSBsYXN0IHllYXInLFxuICogICAgICAgbWF4RGF0ZTogJ0RhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAxIHllYXIgaW4gdGhlIGZ1dHVyZSdcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBVc2FnZSB3aXRoIGN1c3RvbSBlcnJvciBwYXJzZXI6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICogICBmaWVsZFN0YXRlLFxuICogICBwYXJzZUVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICogICAgICAgcmV0dXJuIGBEYXRlIEVycm9yOiAke2Vycm9yfWA7XG4gKiAgICAgfVxuICogICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdJbnZhbGlkIGRhdGUnO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHBhcmFtIG9wdGlvbnMgLSBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVmFsaWRhdGlvbiBzdGF0ZSBhbmQgZXJyb3IgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJWYWxpZGF0aW9uT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIGNvbnN0IHsgZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgcGFyc2VFcnJvciwgdmFsdWUgfSA9IG9wdGlvbnM7XG5cbiAgLy8gTWVtb2l6ZSB2YWxpZGF0aW9uIHJlc3VsdHMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7IGVycm9yOiBmaWVsZEVycm9yLCBpbnZhbGlkIH0gPSBmaWVsZFN0YXRlO1xuICAgIFxuICAgIC8vIFN0YXJ0IHdpdGggZm9ybSB2YWxpZGF0aW9uIGVycm9yXG4gICAgbGV0IGN1cnJlbnRFcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQgPSBmaWVsZEVycm9yO1xuICAgIFxuICAgIC8vIENoZWNrIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbnMgaWYgbm8gZm9ybSBlcnJvciBhbmQgd2UgaGF2ZSBhIHZhbHVlXG4gICAgaWYgKCFmaWVsZEVycm9yICYmIHZhbHVlICYmIHZhbGlkYXRpb24pIHtcbiAgICAgIGNvbnN0IHsgbWluRGF0ZSwgbWF4RGF0ZSwgc2hvdWxkRGlzYWJsZURhdGUsIGVycm9yTWVzc2FnZXMgfSA9IHZhbGlkYXRpb247XG4gICAgICBcbiAgICAgIC8vIENoZWNrIG1pbmltdW0gZGF0ZVxuICAgICAgaWYgKG1pbkRhdGUgJiYgdmFsdWUgPCBtaW5EYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWluRGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWluRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1pbkRhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBtYXhpbXVtIGRhdGVcbiAgICAgIGVsc2UgaWYgKG1heERhdGUgJiYgdmFsdWUgPiBtYXhEYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWF4RGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWF4RGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1heERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBkaXNhYmxlZCBkYXRlXG4gICAgICBlbHNlIGlmIChzaG91bGREaXNhYmxlRGF0ZSAmJiBzaG91bGREaXNhYmxlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgY3VycmVudEVycm9yID0ge1xuICAgICAgICAgIHR5cGU6ICdkaXNhYmxlZERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/LmRpc2FibGVkRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIERhdGVWYWxpZGF0aW9uRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGhhc0Vycm9yID0gQm9vbGVhbihjdXJyZW50RXJyb3IpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcixcbiAgICAgIGVycm9yOiBjdXJyZW50RXJyb3IsXG4gICAgICBpbnZhbGlkOiBpbnZhbGlkIHx8IGhhc0Vycm9yLFxuICAgIH07XG4gIH0sIFtmaWVsZFN0YXRlLCB2YWxpZGF0aW9uLCB2YWx1ZV0pO1xuXG4gIC8vIE1lbW9pemUgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHVzZU1lbW8oKCk6IFJlYWN0Tm9kZSA9PiB7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgY3VzdG9tIGVycm9yIHBhcnNlciBpZiBwcm92aWRlZFxuICAgIGlmIChwYXJzZUVycm9yKSB7XG4gICAgICByZXR1cm4gcGFyc2VFcnJvcih2YWxpZGF0aW9uUmVzdWx0LmVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoJ21lc3NhZ2UnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgJiYgdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGVycm9yIG1lc3NhZ2VzIGJhc2VkIG9uIGVycm9yIHR5cGVcbiAgICBpZiAoJ3R5cGUnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IHZhbGlkYXRpb25SZXN1bHQuZXJyb3IudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLnJlcXVpcmVkO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZTtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICB9LCBbdmFsaWRhdGlvblJlc3VsdC5lcnJvciwgcGFyc2VFcnJvcl0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4udmFsaWRhdGlvblJlc3VsdCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uOyIsICJpbXBvcnQgdHlwZSB7IFN4UHJvcHMsIFRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IHVzZVRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclN0eWxlcyBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclN0eWxlc09wdGlvbnMge1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgYSB2YWxpZGF0aW9uIGVycm9yICovXG4gIGhhc0Vycm9yPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBsb2FkaW5nIHN0YXRlICovXG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdGV4dCBpbnB1dCBpcyByZWFkLW9ubHkgKi9cbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqIEN1c3RvbSBzdHlsZXMgdG8gbWVyZ2Ugd2l0aCBkZWZhdWx0cyAqL1xuICBzeD86IFN4UHJvcHM8VGhlbWU+O1xufVxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgdXNlRGF0ZVBpY2tlclN0eWxlcyBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclN0eWxlc1JldHVybiB7XG4gIC8qKiBDb21wdXRlZCBzdHlsZXMgZm9yIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnQgKi9cbiAgc3g6IFN4UHJvcHM8VGhlbWU+O1xuICAvKiogQWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3Igc3R5bGluZyAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgdGhlbWUtYXdhcmUgZGF0ZSBwaWNrZXIgc3R5bGVzIHdpdGggY29uc2lzdGVudCBkZXNpZ24gc3lzdGVtIGludGVncmF0aW9uXG4gKiBcbiAqIFRoaXMgaG9vayBwcm92aWRlcyBvcHRpbWl6ZWQsIG1lbW9pemVkIHN0eWxlcyBmb3IgZGF0ZSBwaWNrZXIgY29tcG9uZW50cyB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIGFkYXB0IHRvIHRoZSBjdXJyZW50IE1VSSB0aGVtZSBhbmQgY29tcG9uZW50IHN0YXRlIChkaXNhYmxlZCwgZXJyb3IsIGxvYWRpbmcsIGV0Yy4pLlxuICogSXQgZW5zdXJlcyBjb25zaXN0ZW50IHN0eWxpbmcgYWNyb3NzIGFsbCBkYXRlIHBpY2tlciBpbnN0YW5jZXMgd2hpbGUgYWxsb3dpbmcgY3VzdG9taXphdGlvbi5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHN4IH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAqICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gKiAgIGhhc0Vycm9yOiAhIWVycm9yLFxuICogICBsb2FkaW5nOiBpc0xvYWRpbmdcbiAqIH0pO1xuICogXG4gKiByZXR1cm4gPERhdGVQaWNrZXIgc3g9e3N4fSAuLi4gLz47XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHN0eWxlczpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzeCB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gKiAgIGhhc0Vycm9yOiAhIWVycm9yLFxuICogICBzeDoge1xuICogICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICBjb2xvcjogJ3ByaW1hcnkubWFpbidcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3R5bGUgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBDb21wdXRlZCBzdHlsZXMgYW5kIGNsYXNzIG5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyU3R5bGVzKFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyU3R5bGVzT3B0aW9ucyA9IHt9XG4pOiBVc2VEYXRlUGlja2VyU3R5bGVzUmV0dXJuIHtcbiAgY29uc3QgeyBkaXNhYmxlZCwgaGFzRXJyb3IsIGxvYWRpbmcsIHRleHRSZWFkT25seSwgc3g6IGN1c3RvbVN4IH0gPSBvcHRpb25zO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgLy8gTWVtb2l6ZSBjb21wdXRlZCBzdHlsZXMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IGNvbXB1dGVkU3ggPSB1c2VNZW1vKCgpOiBTeFByb3BzPFRoZW1lPiA9PiB7XG4gICAgY29uc3QgYmFzZVN0eWxlczogU3hQcm9wczxUaGVtZT4gPSB7XG4gICAgICAvLyBJbnB1dCBmaWVsZCBzdHlsaW5nXG4gICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQgXG4gICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIFxuICAgICAgICAvLyBUcmFuc2l0aW9uIGZvciBzbW9vdGggc3RhdGUgY2hhbmdlc1xuICAgICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoW1xuICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICAgICAgICAnYm9yZGVyLWNvbG9yJyxcbiAgICAgICAgICAnY29sb3InXG4gICAgICAgIF0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuZHVyYXRpb24uc2hvcnQsXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIEVycm9yIHN0YXRlIHN0eWxpbmdcbiAgICAgICAgLi4uKGhhc0Vycm9yICYmIHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmLk11aS1mb2N1c2VkJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICAgIGJveFNoYWRvdzogYDAgMCAwIDJweCAke3RoZW1lLnBhbGV0dGUuZXJyb3IubWFpbn0yNWAsIC8vIDI1IGlzIDE1JSBvcGFjaXR5IGluIGhleFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIExvYWRpbmcgc3RhdGUgc3R5bGluZ1xuICAgICAgICAuLi4obG9hZGluZyAmJiB7XG4gICAgICAgICAgb3BhY2l0eTogMC43LFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnB1dCBlbGVtZW50IHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IFwibm90LWFsbG93ZWRcIiBcbiAgICAgICAgICA6IHRleHRSZWFkT25seSBcbiAgICAgICAgICAgID8gXCJwb2ludGVyXCIgXG4gICAgICAgICAgICA6IFwidGV4dFwiLFxuICAgICAgICBcbiAgICAgICAgLy8gUmVhZC1vbmx5IHNwZWNpZmljIHN0eWxpbmdcbiAgICAgICAgLi4uKHRleHRSZWFkT25seSAmJiAhZGlzYWJsZWQgJiYge1xuICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgICAgdXNlclNlbGVjdDogXCJub25lXCIsXG4gICAgICAgICAgY2FyZXRDb2xvcjogXCJ0cmFuc3BhcmVudFwiLCAvLyBIaWRlIHRleHQgY3Vyc29yIGluIHJlYWQtb25seSBtb2RlXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIExvYWRpbmcgc3RhdGVcbiAgICAgICAgLi4uKGxvYWRpbmcgJiYge1xuICAgICAgICAgIGN1cnNvcjogXCJ3YWl0XCIsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gUmVxdWlyZWQgZmllbGQgYXN0ZXJpc2sgc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrXCI6IHsgXG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgIGZvbnRTaXplOiBcIjEuMmVtXCIsXG4gICAgICB9LFxuXG4gICAgICAvLyBMYWJlbCBzdHlsaW5nIHdpdGggYmV0dGVyIGNvbnRyYXN0XG4gICAgICBcIiYgLk11aUlucHV0TGFiZWwtcm9vdFwiOiB7XG4gICAgICAgIGNvbG9yOiBoYXNFcnJvciBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiBcbiAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUudGV4dC5zZWNvbmRhcnksXG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgcHJvcGVyIGNvbnRyYXN0IGZvciBkaXNhYmxlZCBzdGF0ZVxuICAgICAgICAuLi4oZGlzYWJsZWQgJiYge1xuICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQuZGlzYWJsZWQsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gSGVscGVyIHRleHQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlGb3JtSGVscGVyVGV4dC1yb290XCI6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogdGhlbWUuc3BhY2luZygxKSxcbiAgICAgICAgbWFyZ2luUmlnaHQ6IHRoZW1lLnNwYWNpbmcoMSksXG4gICAgICAgIFxuICAgICAgICAvLyBFcnJvciBzdGF0ZVxuICAgICAgICAuLi4oaGFzRXJyb3IgJiYge1xuICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gQ2FsZW5kYXIgaWNvbiBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0QWRvcm5tZW50LXJvb3RcIjoge1xuICAgICAgICBjb2xvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZCBcbiAgICAgICAgICA6IGhhc0Vycm9yIFxuICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gXG4gICAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmFjdGl2ZSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEZvY3VzIHJpbmcgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1mb2N1c2VkXCI6IHtcbiAgICAgICAgb3V0bGluZTogYDJweCBzb2xpZCAke3RoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWlufTUwYCwgLy8gNTAgaXMgMzElIG9wYWNpdHlcbiAgICAgICAgb3V0bGluZU9mZnNldDogXCIycHhcIixcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuaGFuY2VkIGNvbnRyYXN0IGZvciBkYXJrIHRoZW1lc1xuICAgICAgLi4uKHRoZW1lLnBhbGV0dGUubW9kZSA9PT0gJ2RhcmsnICYmIHtcbiAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIC8vIE1lcmdlIHdpdGggY3VzdG9tIHN0eWxlc1xuICAgIHJldHVybiBjdXN0b21TeCA/IFtiYXNlU3R5bGVzLCBjdXN0b21TeF0gYXMgU3hQcm9wczxUaGVtZT4gOiBiYXNlU3R5bGVzO1xuICB9LCBbXG4gICAgdGhlbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgaGFzRXJyb3IsXG4gICAgbG9hZGluZyxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgY3VzdG9tU3gsXG4gIF0pO1xuXG4gIC8vIEdlbmVyYXRlIGFkZGl0aW9uYWwgY2xhc3MgbmFtZXMgZm9yIGV4dGVybmFsIHN0eWxpbmcgaG9va3NcbiAgY29uc3QgY2xhc3NOYW1lID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICBpZiAoZGlzYWJsZWQpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWRpc2FibGVkJyk7XG4gICAgaWYgKGhhc0Vycm9yKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1lcnJvcicpO1xuICAgIGlmIChsb2FkaW5nKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1sb2FkaW5nJyk7XG4gICAgaWYgKHRleHRSZWFkT25seSkgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tcmVhZE9ubHknKTtcbiAgICBcbiAgICByZXR1cm4gY2xhc3Nlcy5sZW5ndGggPiAwID8gY2xhc3Nlcy5qb2luKCcgJykgOiB1bmRlZmluZWQ7XG4gIH0sIFtkaXNhYmxlZCwgaGFzRXJyb3IsIGxvYWRpbmcsIHRleHRSZWFkT25seV0pO1xuXG4gIHJldHVybiB7XG4gICAgc3g6IGNvbXB1dGVkU3gsXG4gICAgY2xhc3NOYW1lLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyU3R5bGVzOyIsICJpbXBvcnQgdHlwZSB7IFBpY2tlclZhbGlkRGF0ZSB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIEZpZWxkUGF0aCwgUGF0aFZhbHVlIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSBmb3IgY3JlYXRpbmcgYnJhbmRlZCBkYXRlIHR5cGVzIHRvIHByZXZlbnQgbWl4aW5nIGRpZmZlcmVudCBkYXRlIGZvcm1hdHNcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBiYXNlIGRhdGUgdHlwZVxuICogQHRlbXBsYXRlIFRCcmFuZCAtIFRoZSBicmFuZCBzdHJpbmcgZm9yIHR5cGUgc2FmZXR5XG4gKi9cbmV4cG9ydCB0eXBlIEJyYW5kZWREYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlLCBUQnJhbmQgZXh0ZW5kcyBzdHJpbmc+ID0gXG4gIFREYXRlICYgeyByZWFkb25seSBfX2JyYW5kOiBUQnJhbmQgfTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZS1saWtlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQaWNrZXJWYWxpZERhdGUge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBEYXRlIG9iamVjdFxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGRhdGUtbGlrZSBvYmplY3RzIHdpdGggY29tbW9uIGRhdGUgbGlicmFyeSBtZXRob2RzXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgLy8gRGF5LmpzLCBNb21lbnQuanMsIG9yIHNpbWlsYXJcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuaXNWYWxpZCgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBMdXhvbiBEYXRlVGltZVxuICAgIGlmICgnaXNWYWxpZCcgaW4gdmFsdWUgJiYgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgYXMgYSBkYXRlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGFyc2VhYmxlIGRhdGUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnNhYmxlRGF0ZVN0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEJhc2ljIElTTyBkYXRlIGZvcm1hdCBjaGVja1xuICBjb25zdCBpc29EYXRlUmVnZXggPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9KD86VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezN9KT8oPzpafFsrLV1cXGR7Mn06XFxkezJ9KT8pPyQvO1xuXG4gIGlmIChpc29EYXRlUmVnZXgudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIERhdGUgY29uc3RydWN0b3IgY2FuIHBhcnNlIGl0XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHZhbHVlKTtcblxuICByZXR1cm4gIWlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlLXNhZmUgZGF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGZvcm0gdmFsdWVzIHRvIGRhdGUgcGlja2VyIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgZGF0ZSBhZGFwdGVyIGZyb20gTVVJIGxvY2FsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGZvcm0gdmFsdWVzIHRvIGRhdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlSW5wdXRUcmFuc2Zvcm08XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4pIHtcbiAgcmV0dXJuICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogVERhdGUgfCBudWxsID0+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGFkYXB0ZXIudXRpbHMuZGF0ZSh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGlzVmFsaWREYXRlKHBhcnNlZCkgPyAocGFyc2VkIGFzIFREYXRlKSA6IG51bGw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFREYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlLXNhZmUgZGF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGRhdGUgcGlja2VyIHZhbHVlcyBiYWNrIHRvIGZvcm0gdmFsdWVzXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGUgdXNlZCBieSB0aGUgcGlja2VyXG4gKiBAcGFyYW0gZm9ybWF0IC0gVGhlIGZvcm1hdCB0byB1c2UgZm9yIHN0cmluZyBjb252ZXJzaW9uIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEEgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBzYWZlbHkgY29udmVydHMgZGF0ZXMgdG8gZm9ybSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGVPdXRwdXRUcmFuc2Zvcm08XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oZm9ybWF0Pzogc3RyaW5nKSB7XG4gIHJldHVybiAodmFsdWU6IFREYXRlIHwgbnVsbCk6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPiA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICBpZiAoIWlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIC8vIElmIG5vIGZvcm1hdCBzcGVjaWZpZWQsIHJldHVybiB0aGUgZGF0ZSBhcy1pc1xuICAgIGlmICghZm9ybWF0KSB7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGRhdGUgbGlicmFyeSBmb3JtYXRzXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdpc28nKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RhdGUtb25seScpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEYXkuanMgZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuZm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBNb21lbnQuanMgZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuZm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBMdXhvbiBmb3JtYXRcbiAgICAgIGlmICh0eXBlb2YgKHZhbHVlIGFzIGFueSkudG9Gb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjazogcmV0dXJuIGFzLWlzXG4gICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBkZWZhdWx0IGRhdGUgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGVcbiAqIEByZXR1cm5zIERlZmF1bHQgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRlUGlja2VyQ29uZmlnPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPigpIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBEZWZhdWx0IHNsb3QgcHJvcHMgZm9yIGNvbnNpc3RlbnQgYmVoYXZpb3JcbiAgICBzbG90UHJvcHM6IHtcbiAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ3RvZGF5JywgJ2NhbmNlbCcsICdhY2NlcHQnXSBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgICB2YXJpYW50OiAnb3V0bGluZWQnIGFzIGNvbnN0LFxuICAgICAgfSxcbiAgICB9LFxuICAgIFxuICAgIC8vIERlZmF1bHQgZ3JpZCBwcm9wcyBmb3IgbGF5b3V0IGNvbnNpc3RlbmN5XG4gICAgZ3JpZFByb3BzOiB7XG4gICAgICBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gYXMgY29uc3QsXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IHZhbGlkYXRpb24gY29uZmlndXJhdGlvblxuICAgIHZhbGlkYXRpb246IHtcbiAgICAgIGVycm9yTWVzc2FnZXM6IHtcbiAgICAgICAgaW52YWxpZERhdGU6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiLFxuICAgICAgICBtaW5EYXRlOiBcIkRhdGUgbXVzdCBiZSBhZnRlciB0aGUgbWluaW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgbWF4RGF0ZTogXCJEYXRlIG11c3QgYmUgYmVmb3JlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICAgICAgICBkaXNhYmxlZERhdGU6IFwiVGhpcyBkYXRlIGlzIG5vdCBhbGxvd2VkXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0gYXMgY29uc3Q7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBzYWZlbHkgZXh0cmFjdCBlcnJvciBtZXNzYWdlIGZyb20gdmFyaW91cyBlcnJvciB0eXBlc1xuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCAoY291bGQgYmUgZnJvbSByZWFjdC1ob29rLWZvcm0gb3IgTVVJIGRhdGUgcGlja2VyKVxuICogQHJldHVybnMgQSB1c2VyLWZyaWVuZGx5IGVycm9yIG1lc3NhZ2Ugc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsKSB7XG4gICAgLy8gUmVhY3QgSG9vayBGb3JtIEZpZWxkRXJyb3JcbiAgICBpZiAoJ21lc3NhZ2UnIGluIGVycm9yICYmIHR5cGVvZiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIChlcnJvciBhcyBhbnkpLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gTVVJIERhdGVWYWxpZGF0aW9uRXJyb3JcbiAgICBpZiAoJ3R5cGUnIGluIGVycm9yICYmIHR5cGVvZiAoZXJyb3IgYXMgYW55KS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gKGVycm9yIGFzIGFueSkudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICAgIHJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSc7XG4gICAgICAgIGNhc2UgJ21pbkRhdGUnOlxuICAgICAgICAgIHJldHVybiAnRGF0ZSBpcyB0b28gZWFybHknO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGxhdGUnO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiAnVGhpcyBkYXRlIGlzIG5vdCBhdmFpbGFibGUnO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnSW52YWxpZCBkYXRlIHNlbGVjdGlvbic7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICdJbnZhbGlkIGlucHV0Jztcbn1cblxuLyoqXG4gKiBQZXJmb3JtYW5jZSB1dGlsaXR5IHRvIGNyZWF0ZSBzdGFibGUgcmVmZXJlbmNlcyBmb3IgY29tcGxleCBwcm9wc1xuICogVGhpcyBoZWxwcyBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMgd2hlbiB1c2luZyBjb21wbGV4IGNvbmZpZ3VyYXRpb24gb2JqZWN0c1xuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgSlNPTiBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGRlcGVuZGVuY3kgaW4gdXNlTWVtby91c2VDYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhYmxlS2V5PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oY29uZmlnOiBUKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29uZmlnLCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgLy8gU29ydCBvYmplY3Qga2V5cyBmb3IgY29uc2lzdGVudCBzZXJpYWxpemF0aW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc29ydGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICBzb3J0ZWRba10gPSAodmFsdWUgYXMgYW55KVtrXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNvcnRlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNlcmlhbGl6YWJsZSBvYmplY3RzXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykuc29ydCgpLmpvaW4oJy0nKTtcbiAgfVxufSIsICJpbXBvcnQgVmlzaWJpbGl0eSBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL1Zpc2liaWxpdHknO1xuaW1wb3J0IFZpc2liaWxpdHlPZmYgZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5T2ZmJztcbmltcG9ydCB0eXBlIHsgSWNvbkJ1dHRvblByb3BzLCBUZXh0RmllbGRQcm9wcywgR3JpZFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBJY29uQnV0dG9uLFxuICBJbnB1dEFkb3JubWVudCxcbiAgVGV4dEZpZWxkLFxuICB1c2VGb3JrUmVmLFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgTW91c2VFdmVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBQYXNzd29yZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgUGFzc3dvcmRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4gPSBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZScgfCAnc2l6ZSc+ICYge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJwYXNzd29yZFwiIHwgXCJ1c2VyLmN1cnJlbnRQYXNzd29yZFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgdmlzaWJpbGl0eSB0b2dnbGUgaWNvbiBidXR0b25cbiAgICogQGRlZmF1bHRWYWx1ZSBcImRlZmF1bHRcIlxuICAgKi9cbiAgaWNvbkNvbG9yPzogSWNvbkJ1dHRvblByb3BzWydjb2xvciddO1xuICAvKipcbiAgICogQ3VzdG9tIHJlbmRlciBmdW5jdGlvbiBmb3IgdGhlIHZpc2liaWxpdHkgdG9nZ2xlIGljb25cbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gV2hldGhlciBwYXNzd29yZCBpcyBjdXJyZW50bHkgaGlkZGVuXG4gICAqIEByZXR1cm5zIFJlYWN0Tm9kZSB0byByZW5kZXIgYXMgdGhlIGljb25cbiAgICogQGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZpc2liaWxpdHkvdmlzaWJpbGl0eS1vZmYgaWNvbnNcbiAgICovXG4gIHJlbmRlckljb24/OiAocGFzc3dvcmQ6IGJvb2xlYW4pID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcblxufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gUGFzc3dvcmRFbDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIGljb25Db2xvcixcbiAgICByZW5kZXJJY29uID0gcGFzc3dvcmQgPT4gKHBhc3N3b3JkID8gPFZpc2liaWxpdHkgLz4gOiA8VmlzaWJpbGl0eU9mZiAvPiksXG4gICAgc2xvdFByb3BzLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBpbnB1dFJlZixcbiAgICBvbkJsdXIsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgW3Bhc3N3b3JkLCBzZXRQYXNzd29yZF0gPSB1c2VTdGF0ZTxib29sZWFuPih0cnVlKTtcblxuICBjb25zdCBlbmRBZG9ybm1lbnQgPSAoXG4gICAgPElucHV0QWRvcm5tZW50IHBvc2l0aW9uPXsnZW5kJ30+XG4gICAgICA8SWNvbkJ1dHRvblxuICAgICAgICBvbk1vdXNlRG93bj17KGU6IE1vdXNlRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiBlLnByZXZlbnREZWZhdWx0KCl9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFBhc3N3b3JkKCFwYXNzd29yZCl9XG4gICAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgICAgY29sb3I9e2ljb25Db2xvciA/PyAnZGVmYXVsdCd9XG4gICAgICA+XG4gICAgICAgIHtyZW5kZXJJY29uKHBhc3N3b3JkKX1cbiAgICAgIDwvSWNvbkJ1dHRvbj5cbiAgICA8L0lucHV0QWRvcm5tZW50PlxuICApO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgdHlwZT17cGFzc3dvcmQgPyAncGFzc3dvcmQnIDogJ3RleHQnfVxuICAgICAgdmFsdWU9e2ZpZWxkLnZhbHVlID8/ICcnfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICB2YXJpYW50PXtyZXN0LnZhcmlhbnQgPz8gJ291dGxpbmVkJ31cbiAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN0Lm9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmVzdC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIHsuLi4odHlwZW9mIHNsb3RQcm9wcyA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHNsb3RQcm9wczoge1xuICAgICAgICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgICAgZW5kQWRvcm5tZW50LFxuICAgICAgICAgICAgICAgIC4uLnNsb3RQcm9wcz8uaW5wdXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9IGFzIFRleHRGaWVsZFByb3BzWydzbG90UHJvcHMnXSxcbiAgICAgICAgICB9KX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBwYXNzd29yZCBUZXh0RmllbGQgd2l0aCBzaG93L2hpZGUgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgcGFzc3dvcmQgaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgYW5kIGEgYnVpbHQtaW4gdmlzaWJpbGl0eSB0b2dnbGUgYnV0dG9uLiBUaGUgcGFzc3dvcmRcbiAqIGNhbiBiZSBzaG93biBvciBoaWRkZW4gYnkgY2xpY2tpbmcgdGhlIGV5ZSBpY29uIGluIHRoZSBpbnB1dCdzIGVuZCBhZG9ybm1lbnQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIFBhc3N3b3JkIHZpc2liaWxpdHkgdG9nZ2xlXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEN1c3RvbWl6YWJsZSB2aXNpYmlsaXR5IGljb25zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0XG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiUGFzc3dvcmRcIlxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnLFxuICogICAgIG1pbkxlbmd0aDogeyB2YWx1ZTogOCwgbWVzc2FnZTogJ01pbmltdW0gOCBjaGFyYWN0ZXJzJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGljb24gY29sb3I6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiQ29uZmlybSBQYXNzd29yZFwiXG4gKiAgIGljb25Db2xvcj1cInByaW1hcnlcIlxuICogICBwbGFjZWhvbGRlcj1cIlJlLWVudGVyIHlvdXIgcGFzc3dvcmRcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cIm5ld1Bhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJOZXcgUGFzc3dvcmRcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcmVuZGVySWNvbj17KGhpZGRlbikgPT4gaGlkZGVuID8gPEN1c3RvbUhpZGVJY29uIC8+IDogPEN1c3RvbVNob3dJY29uIC8+fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgUGFzc3dvcmRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBQYXNzd29yZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuXG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuZXhwb3J0IHsgUGFzc3dvcmRFbGVtZW50IH07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBGb3JtQ29udHJvbExhYmVsUHJvcHMsXG4gIEZvcm1MYWJlbFByb3BzLFxuICBSYWRpb0dyb3VwUHJvcHMsXG4gIFJhZGlvUHJvcHMsXG4gIEdyaWRQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEZvcm1MYWJlbCxcbiAgUmFkaW8sXG4gIFJhZGlvR3JvdXAsXG4gIEdyaWQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuXG4vLyBUeXBlIGZvciBwcmltaXRpdmUgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgcmFkaW8gYnV0dG9uIHZhbHVlc1xudHlwZSBQcmltaXRpdmVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIENvbnN0cmFpbnQgdG8gZW5zdXJlIG9wdGlvbiBvYmplY3RzIGhhdmUgdGhlIHJlcXVpcmVkIGtleXNcbnR5cGUgT3B0aW9uT2JqZWN0PFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IFJlY29yZDxUVmFsdWVLZXksIFByaW1pdGl2ZVZhbHVlPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PiA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFkaW9CdXR0b25Hcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdpZCcsXG4gIFRMYWJlbEtleSBleHRlbmRzICBzdHJpbmcgPSAnbGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4ge1xuICBvcHRpb25zOiBUT3B0aW9uW107XG4gIGhlbHBlclRleHQ/OiBSZWFjdE5vZGU7XG4gIG5hbWU6IFROYW1lO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGxhYmVsS2V5PzogVExhYmVsS2V5O1xuICB2YWx1ZUtleT86IFRWYWx1ZUtleTtcbiAgZGlzYWJsZWRLZXk/OiBURGlzYWJsZWRLZXk7XG4gIHR5cGU/OiAnbnVtYmVyJyB8ICdzdHJpbmcnIHwgJ2Jvb2xlYW4nO1xuICBlbXB0eU9wdGlvbkxhYmVsPzogc3RyaW5nO1xuICBvbkNoYW5nZT86ICh2YWx1ZTogVE9wdGlvbltUVmFsdWVLZXldIHwgVE9wdGlvbiB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgcmV0dXJuT2JqZWN0PzogYm9vbGVhbjtcbiAgcm93PzogYm9vbGVhbjtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgbGFiZWxQcm9wcz86IE9taXQ8Rm9ybUNvbnRyb2xMYWJlbFByb3BzLCAnbGFiZWwnIHwgJ2NvbnRyb2wnIHwgJ3ZhbHVlJz47XG4gIGZvcm1MYWJlbFByb3BzPzogT21pdDxGb3JtTGFiZWxQcm9wcywgJ3JlcXVpcmVkJyB8ICdlcnJvcic+O1xuICByYWRpb1Byb3BzPzogUmFkaW9Qcm9wcztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVE9wdGlvbltUVmFsdWVLZXldO1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFJhZGlvQnV0dG9uR3JvdXA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnaWQnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnbGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPihcbiAgcHJvcHM6IFJhZGlvQnV0dG9uR3JvdXBQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVE9wdGlvbixcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG9wdGlvbnMsXG4gICAgbGFiZWwsXG4gICAgbmFtZSxcbiAgICBsYWJlbEtleSA9ICdsYWJlbCcgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlS2V5ID0gJ2lkJyBhcyBUVmFsdWVLZXksXG4gICAgZGlzYWJsZWRLZXkgPSAnZGlzYWJsZWQnIGFzIFREaXNhYmxlZEtleSxcbiAgICByZXF1aXJlZCxcbiAgICBlbXB0eU9wdGlvbkxhYmVsLFxuICAgIHJldHVybk9iamVjdCxcbiAgICByb3cgPSB0cnVlLFxuICAgIGNvbnRyb2wsXG4gICAgdHlwZSxcbiAgICBsYWJlbFByb3BzLFxuICAgIGRpc2FibGVkLFxuICAgIGZvcm1MYWJlbFByb3BzLFxuICAgIHJhZGlvUHJvcHMsXG4gICAgdHJhbnNmb3JtLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb25cbiAgPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiB2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZSB8fCAoJycgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcbiAgICAgICAgICAgIH0sXG4gICAgICBvdXRwdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtPy5vdXRwdXRcbiAgICAgICAgICA6IChfZXZlbnQsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3Qgb25SYWRpb0NoYW5nZTogUmFkaW9Hcm91cFByb3BzWydvbkNoYW5nZSddID0gKGV2ZW50LCByYWRpb1ZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSByZXR1cm5PYmplY3RcbiAgICAgID8gKG9wdGlvbnMgYXMgVE9wdGlvbltdKS5maW5kKG9wdGlvbiA9PiBvcHRpb25bdmFsdWVLZXldID09PSByYWRpb1ZhbHVlKVxuICAgICAgOiAocmFkaW9WYWx1ZSBhcyBUT3B0aW9uW1RWYWx1ZUtleV0pO1xuXG4gICAgb25DaGFuZ2UoZXZlbnQsIHJldHVyblZhbHVlKTtcbiAgICBpZiAodHlwZW9mIHJlc3Qub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlc3Qub25DaGFuZ2UocmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICB7bGFiZWwgJiYgKFxuICAgICAgICA8Rm9ybUxhYmVsIHsuLi5mb3JtTGFiZWxQcm9wc30gcmVxdWlyZWQ9e3JlcXVpcmVkfSBlcnJvcj17ISFlcnJvcn0+XG4gICAgICAgICAge2xhYmVsfVxuICAgICAgICA8L0Zvcm1MYWJlbD5cbiAgICAgICl9XG4gICAgICA8UmFkaW9Hcm91cCBvbkNoYW5nZT17b25SYWRpb0NoYW5nZX0gbmFtZT17bmFtZX0gcm93PXtyb3d9IHZhbHVlPXt2YWx1ZX0+XG4gICAgICAgIHtlbXB0eU9wdGlvbkxhYmVsICYmIChcbiAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgey4uLnJhZGlvUHJvcHN9XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17IXZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFiZWw9e2VtcHR5T3B0aW9uTGFiZWx9XG4gICAgICAgICAgICB2YWx1ZT1cIlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge29wdGlvbnMubWFwKG9wdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uW3ZhbHVlS2V5XTtcbiAgICAgICAgICBjb25zdCBvcHRpb25EaXNhYmxlZCA9IG9wdGlvbltkaXNhYmxlZEtleV0gfHwgZmFsc2U7XG4gICAgICAgICAgbGV0IHZhbDogVE9wdGlvbltUVmFsdWVLZXldIHwgdW5kZWZpbmVkID0gcmV0dXJuT2JqZWN0XG4gICAgICAgICAgICA/ICh2YWx1ZSBhcyBUT3B0aW9uKT8uW3ZhbHVlS2V5XVxuICAgICAgICAgICAgOiAodmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcblxuICAgICAgICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gTnVtYmVyKHZhbCkgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWwgPSBCb29sZWFuKHZhbCkgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IHZhbCA9PT0gb3B0aW9uS2V5O1xuXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICAgIGtleT17U3RyaW5nKG9wdGlvbktleSl9XG4gICAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICAgIHsuLi5yYWRpb1Byb3BzfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8IG9wdGlvbkRpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNDaGVja2VkfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWU9e29wdGlvbktleX1cbiAgICAgICAgICAgICAgbGFiZWw9e29wdGlvbltsYWJlbEtleV19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICk7XG4gICAgICAgIH0pfVxuICAgICAgPC9SYWRpb0dyb3VwPlxuICAgICAge2Vycm9yICYmIDxGb3JtSGVscGVyVGV4dD57ZXJyb3IubWVzc2FnZX08L0Zvcm1IZWxwZXJUZXh0Pn1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuY29uc3QgUmFkaW9CdXR0b25Hcm91cCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzICBzdHJpbmcgPSAnaWQnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRPcHRpb24sXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBURGlzYWJsZWRLZXlcbj4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50PFxuICAgICAgICBURmllbGRWYWx1ZXMsXG4gICAgICAgIFROYW1lLFxuICAgICAgICBUT3B0aW9uLFxuICAgICAgICBUVmFsdWVLZXksXG4gICAgICAgIFRMYWJlbEtleSxcbiAgICAgICAgVERpc2FibGVkS2V5XG4gICAgICA+XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuUmFkaW9CdXR0b25Hcm91cC5kaXNwbGF5TmFtZSA9ICdSYWRpb0J1dHRvbkdyb3VwJztcblxuZXhwb3J0IHsgUmFkaW9CdXR0b25Hcm91cCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIEF1dG9jb21wbGV0ZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuZXhwb3J0IHR5cGUgU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+ID0gT21pdDxcbiAgQXV0b2NvbXBsZXRlUHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPixcbiAgfCAnbmFtZSdcbiAgfCAncmVuZGVySW5wdXQnXG4gIHwgJ2lzT3B0aW9uRXF1YWxUb1ZhbHVlJ1xuICB8ICdnZXRPcHRpb25MYWJlbCdcbiAgfCAnZGlzYWJsZWQnXG4+ICYge1xuICBuYW1lOiBUTmFtZTtcbiAgZGVwZW5kc09uOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBpc0VkaXQ/OiBib29sZWFuO1xuICBsYWJlbEZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgb3B0aW9ucz86IHJlYWRvbmx5IFRPcHRpb25bXSB8IG51bGw7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RDYXNjYWRlRWxlbWVudDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbGFiZWxGaWVsZCA9ICdMYWJlbCcsXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScsXG4gICAgbmFtZSxcbiAgICBvbkJsdXIsXG4gICAgb25DaGFuZ2UsXG4gICAgZGlzYWJsZWQsXG4gICAgb3B0aW9uczogb3B0aW9uc0lucHV0LFxuICAgIGNvbnRyb2wsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIGRlcGVuZHNPbixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgaXNFZGl0ID0gZmFsc2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCwgLi4ucmVzdFRleHRQcm9wcyB9ID0gdGV4dEZpZWxkUHJvcHM7XG4gIGNvbnN0IG9wdGlvbnMgPSB1c2VNZW1vKCgpID0+IG9wdGlvbnNJbnB1dCB8fCBbXSwgW29wdGlvbnNJbnB1dF0pO1xuXG4gIGNvbnN0IGdldE9wdGlvbktleSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgfCBudW1iZXIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb24gPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgICAgY29uc3Qga2V5ID0gb3B0aW9uID8gb3B0aW9uW3ZhbHVlRmllbGQgYXMga2V5b2YgVE9wdGlvbl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXkgIT09IG51bGwgPyBTdHJpbmcoa2V5KSA6ICcnO1xuICAgIH0sXG4gICAgW3ZhbHVlRmllbGRdXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGQgYXMga2V5b2YgVE9wdGlvbl0pIDogJyc7XG4gICAgfSxcbiAgICBbbGFiZWxGaWVsZF1cbiAgKTtcblxuICBjb25zdCBpc09wdGlvbkVxdWFsVG9WYWx1ZSA9IChvcHRpb246IFRPcHRpb24sIHZhbHVlOiBUT3B0aW9uKSA9PlxuICAgIGdldE9wdGlvbktleShvcHRpb24pID09PSBnZXRPcHRpb25LZXkodmFsdWUpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgZmllbGQ6IGRlcGVuZGVudEZpZWxkIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lOiBkZXBlbmRzT24sXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgcGFyZW50VmFsdWVSZWYgPSB1c2VSZWY8VE9wdGlvbj4oZGVwZW5kZW50RmllbGQudmFsdWUgPz8gbnVsbCk7XG4gIGNvbnN0IGhhc0F1dG9TZWxlY3RlZCA9IHVzZVJlZjxib29sZWFuPihmYWxzZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocGFyZW50VmFsdWVSZWY/LmN1cnJlbnQgIT09IGRlcGVuZGVudEZpZWxkLnZhbHVlKSB7XG4gICAgICBoYXNBdXRvU2VsZWN0ZWQuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghIWZpZWxkLnZhbHVlICYmIHBhcmVudFZhbHVlUmVmPy5jdXJyZW50ICE9PSBkZXBlbmRlbnRGaWVsZC52YWx1ZSkge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgfVxuICB9LCBbZGVwZW5kZW50RmllbGQudmFsdWVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFpc0VkaXQgJiZcbiAgICAgICFkaXNhYmxlZCAmJlxuICAgICAgb3B0aW9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgICEhZGVwZW5kZW50RmllbGQudmFsdWUgJiZcbiAgICAgICFoYXNBdXRvU2VsZWN0ZWQuY3VycmVudCAmJlxuICAgICAgZmllbGQudmFsdWUgPT0gbnVsbFxuICAgICkge1xuICAgICAgZmllbGQub25DaGFuZ2UoZ2V0T3B0aW9uS2V5KG9wdGlvbnNbMF0pKTtcbiAgICAgIGhhc0F1dG9TZWxlY3RlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICFpc0VkaXQsXG4gICAgICAhZGlzYWJsZWQsXG4gICAgICBvcHRpb25zLmxlbmd0aCA9PT0gMSxcbiAgICAgICEhZGVwZW5kZW50RmllbGQudmFsdWUsXG4gICAgICAhaGFzQXV0b1NlbGVjdGVkLFxuICAgICAgZmllbGQudmFsdWVcbiAgICApO1xuICB9LCBbXG4gICAgb3B0aW9ucyxcbiAgICBmaWVsZC52YWx1ZSxcbiAgICBmaWVsZC5vbkNoYW5nZSxcbiAgICBoYXNBdXRvU2VsZWN0ZWQsXG4gICAgaXNFZGl0LFxuICAgIGRpc2FibGVkLFxuICAgIGZpZWxkLFxuICAgIGdldE9wdGlvbktleSxcbiAgICBkZXBlbmRlbnRGaWVsZC5vbkNoYW5nZSxcbiAgXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHZhbHVlPXtcbiAgICAgICAgb3B0aW9uc1xuICAgICAgICAgIC5tYXAob3B0aW9uID0+IChnZXRPcHRpb25LZXkob3B0aW9uKSA9PT0gZmllbGQudmFsdWUgPyBvcHRpb24gOiBudWxsKSlcbiAgICAgICAgICAuZmluZChCb29sZWFuKSB8fCBudWxsXG4gICAgICB9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uS2V5fVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9e2lzT3B0aW9uRXF1YWxUb1ZhbHVlfVxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17ZGVwZW5kZW50RmllbGQudmFsdWUgPT0gbnVsbCB8fCBkaXNhYmxlZH1cbiAgICAgIG9uQ2hhbmdlPXsoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pID0+IHtcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUgPyBnZXRPcHRpb25LZXkobmV3VmFsdWUpIDogbnVsbCk7XG4gICAgICAgIGlmIChvbkNoYW5nZSAmJiB0eXBlb2Ygb25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkNoYW5nZShldmVudCwgbmV3VmFsdWUsIHJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZCB8fCBvcHRpb25zLmxlbmd0aCA9PSAwfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFNlbGVjdENhc2NhZGVFbGVtZW50ID0gPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5TZWxlY3RDYXNjYWRlRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RDYXNjYWRlRWxlbWVudCc7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVWYWx1ZSxcbiAgQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uLFxuICBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIEF1dG9jb21wbGV0ZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgdXNlTWVtbyxcbiAgdXNlRWZmZWN0LFxuICB1c2VDYWxsYmFjayxcbiAgdHlwZSBTeW50aGV0aWNFdmVudCxcbiAgdXNlUmVmLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgRmxleGlibGVPcHRpb24gfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBTZWxlY3RFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVE9wdGlvbiAtIFRoZSBvcHRpb24gb2JqZWN0IHR5cGVcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIE11bHRpcGxlIC0gV2hldGhlciBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIERpc2FibGVDbGVhcmFibGUgLSBXaGV0aGVyIHRoZSBjbGVhciBidXR0b24gaXMgZGlzYWJsZWRcbiAqIEB0ZW1wbGF0ZSBGcmVlU29sbyAtIFdoZXRoZXIgZnJlZSB0ZXh0IGlucHV0IGlzIGFsbG93ZWRcbiAqIEB0ZW1wbGF0ZSBDaGlwQ29tcG9uZW50IC0gVGhlIGNoaXAgY29tcG9uZW50IHR5cGUgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgU2VsZWN0RWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+LFxuICB8ICduYW1lJ1xuICB8ICdyZW5kZXJJbnB1dCdcbiAgfCAnaXNPcHRpb25FcXVhbFRvVmFsdWUnXG4gIHwgJ2dldE9wdGlvbkxhYmVsJ1xuICB8ICdkaXNhYmxlZCdcbiAgfCAnb3B0aW9ucydcbj4gJiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImNhdGVnb3J5XCIgfCBcInVzZXIuZGVwYXJ0bWVudFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgc2VsZWN0IGlucHV0XG4gICAqIEBleGFtcGxlIFwiQ2hvb3NlIGFuIG9wdGlvbi4uLlwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiQ2F0ZWdvcnlcIlxuICAgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBlZGl0IG1vZGUgKGFmZmVjdHMgYXV0by1zZWxlY3Rpb24gYmVoYXZpb3IpXG4gICAqIFdoZW4gZmFsc2UgYW5kIG9ubHkgb25lIG9wdGlvbiBleGlzdHMsIHRoYXQgb3B0aW9uIGlzIGF1dG8tc2VsZWN0ZWRcbiAgICogQGRlZmF1bHRWYWx1ZSBmYWxzZVxuICAgKi9cbiAgaXNFZGl0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlbGVjdCBpcyBkaXNhYmxlZFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHByb3BlcnR5IG5hbWUgaW4gb3B0aW9uIG9iamVjdHMgdG8gdXNlIGFzIGRpc3BsYXkgbGFiZWxcbiAgICogQGRlZmF1bHRWYWx1ZSBcIkxhYmVsXCJcbiAgICogQGV4YW1wbGUgXCJuYW1lXCIgfCBcInRpdGxlXCJcbiAgICovXG4gIGxhYmVsS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHByb3BlcnR5IG5hbWUgaW4gb3B0aW9uIG9iamVjdHMgdG8gdXNlIGFzIHRoZSB2YWx1ZVxuICAgKiBAZGVmYXVsdFZhbHVlIFwiVmFsdWVcIlxuICAgKiBAZXhhbXBsZSBcImlkXCIgfCBcImNvZGVcIlxuICAgKi9cbiAgdmFsdWVLZXk/OiBrZXlvZiBUT3B0aW9uO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuXG4gIG9wdGlvbnM/OiByZWFkb25seSBUT3B0aW9uW10gfCBudWxsO1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0RWxlbWVudDxcbiAgVE9wdGlvbiBleHRlbmRzIEZsZXhpYmxlT3B0aW9uID0gRmxleGlibGVPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPihcbiAgcHJvcHM6IFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgb25DaGFuZ2UsXG4gICAgaXNFZGl0LFxuICAgIG9wdGlvbnM6IG9wdGlvbnNJbnB1dCxcbiAgICBsYWJlbCxcbiAgICB2YXJpYW50LFxuICAgIGRpc2FibGVkLFxuICAgIGxhYmVsS2V5ID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUtleSA9ICdWYWx1ZScsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7IHJlcXVpcmVkLCAuLi5yZXN0VGV4dFByb3BzIH0gPSB0ZXh0RmllbGRQcm9wcztcbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gb3B0aW9uc0lucHV0IHx8IFtdLCBbb3B0aW9uc0lucHV0XSk7XG4gIGNvbnN0IGlnbm9yZUF1dG9TZWxlY3RSZWYgPSB1c2VSZWY8dW5rbm93bj4obnVsbCk7XG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3ZhbHVlS2V5XSA6IG51bGw7IC8vIFJldHVybiBudWxsIGZvciBjb25zaXN0ZW5jeVxuICAgIH0sXG4gICAgW3ZhbHVlS2V5XVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEtleV0pIDogJyc7XG4gICAgfSxcbiAgICBbbGFiZWxLZXldXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIGV2ZW50OiBTeW50aGV0aWNFdmVudCxcbiAgICBuZXdWYWx1ZTogQXV0b2NvbXBsZXRlVmFsdWU8VE9wdGlvbiwgTXVsdGlwbGUsIERpc2FibGVDbGVhcmFibGUsIEZyZWVTb2xvPixcbiAgICByZWFzb246IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvblxuICApID0+IHtcbiAgICBjb25zdCBvcHRpb24gPSBuZXdWYWx1ZSBhcyBUT3B0aW9uIHwgbnVsbDtcblxuICAgIGlmIChyZWFzb24gPT09ICdjbGVhcicgJiYgb3B0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlnbm9yZUF1dG9TZWxlY3RSZWYuY3VycmVudCA9IGdldE9wdGlvblZhbHVlKG9wdGlvbnNbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBpZiB0aGV5IHNlbGVjdCBzb21ldGhpbmcgZWxzZSBvciB0aGUgc3RhdGUgY2hhbmdlc1xuICAgICAgaWdub3JlQXV0b1NlbGVjdFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG5cbiAgICBmaWVsZC5vbkNoYW5nZShvcHRpb24gPyBnZXRPcHRpb25WYWx1ZShvcHRpb24pIDogbnVsbCk7XG4gICAgb25DaGFuZ2U/LihldmVudCwgbmV3VmFsdWUsIHJlYXNvbik7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXG4gICAgICAhaXNFZGl0ICYmXG4gICAgICBvcHRpb25zLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgKGZpZWxkLnZhbHVlID09IG51bGwgfHwgZmllbGQudmFsdWUgPT0gdW5kZWZpbmVkIHx8IGZpZWxkLnZhbHVlID09PSAnJylcbiAgICApIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb24gPSBvcHRpb25zWzBdO1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE9wdGlvbik7XG5cbiAgICAgIGlmIChpZ25vcmVBdXRvU2VsZWN0UmVmLmN1cnJlbnQgIT09IGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShkZWZhdWx0VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW29wdGlvbnNdKTtcblxuICBjb25zdCBhdXRvY29tcGxldGVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIG9wdGlvbnMuZmluZChvcHRpb24gPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZmllbGQudmFsdWUpID8/IG51bGwsXG4gICAgW2ZpZWxkLnZhbHVlLCBvcHRpb25zLCBnZXRPcHRpb25WYWx1ZV1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zPXtmYWxzZX1cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICB2YWx1ZT17XG4gICAgICAgIGF1dG9jb21wbGV0ZVZhbHVlIGFzIEF1dG9jb21wbGV0ZVZhbHVlPFxuICAgICAgICAgIFRPcHRpb24sXG4gICAgICAgICAgTXVsdGlwbGUsXG4gICAgICAgICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICAgICAgICBGcmVlU29sb1xuICAgICAgICA+XG4gICAgICB9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8IG9wdGlvbnMubGVuZ3RoID09IDB9XG4gICAgICBnZXRPcHRpb25MYWJlbD17KFxuICAgICAgICBvcHRpb246IFRPcHRpb24gfCBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZzxGcmVlU29sbz5cbiAgICAgICkgPT4gZ2V0T3B0aW9uTGFiZWwob3B0aW9uKX1cbiAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQXV0b2NvbXBsZXRlIGNvbXBvbmVudCBmb3Igc2VsZWN0aW5nIGZyb20gcHJlZGVmaW5lZCBvcHRpb25zLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBzZWxlY3QvYXV0b2NvbXBsZXRlIGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseVxuICogd2l0aCByZWFjdC1ob29rLWZvcm0sIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqIGZvciByZXNwb25zaXZlIGxheW91dHMuIEl0IHN1cHBvcnRzIGJvdGggc2luZ2xlIGFuZCBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZXMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9jb21wbGV0ZSB3aXRoIGZpbHRlcmluZ1xuICogLSBTaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdGlvbiBzdXBwb3J0XG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEN1c3RvbWl6YWJsZSBvcHRpb24gZGlzcGxheSAobGFiZWxLZXkvdmFsdWVLZXkpXG4gKiAtIEF1dG8tc2VsZWN0aW9uIHdoZW4gb25seSBvbmUgb3B0aW9uIGV4aXN0c1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImNhdGVnb3J5XCJcbiAqICAgbGFiZWw9XCJDYXRlZ29yeVwiXG4gKiAgIG9wdGlvbnM9e1tcbiAqICAgICB7IExhYmVsOiAnVGVjaG5vbG9neScsIFZhbHVlOiAndGVjaCcgfSxcbiAqICAgICB7IExhYmVsOiAnRmluYW5jZScsIFZhbHVlOiAnZmluYW5jZScgfVxuICogICBdfVxuICogICBydWxlcz17eyByZXF1aXJlZDogJ1BsZWFzZSBzZWxlY3QgYSBjYXRlZ29yeScgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20ga2V5czpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJJZFwiXG4gKiAgIGxhYmVsPVwiQXNzaWduIHRvIFVzZXJcIlxuICogICBvcHRpb25zPXt1c2Vyc31cbiAqICAgbGFiZWxLZXk9XCJmdWxsTmFtZVwiXG4gKiAgIHZhbHVlS2V5PVwiaWRcIlxuICogICBwbGFjZWhvbGRlcj1cIkNob29zZSBhIHVzZXIuLi5cIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBNdWx0aXBsZSBzZWxlY3Rpb246XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ0YWdzXCJcbiAqICAgbGFiZWw9XCJUYWdzXCJcbiAqICAgb3B0aW9ucz17YXZhaWxhYmxlVGFnc31cbiAqICAgbXVsdGlwbGVcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogOCB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRPcHRpb24gLSBUaGUgb3B0aW9uIG9iamVjdCB0eXBlXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBNdWx0aXBsZSAtIFdoZXRoZXIgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBEaXNhYmxlQ2xlYXJhYmxlIC0gV2hldGhlciB0aGUgY2xlYXIgYnV0dG9uIGlzIGRpc2FibGVkXG4gKiBAdGVtcGxhdGUgRnJlZVNvbG8gLSBXaGV0aGVyIGZyZWUgdGV4dCBpbnB1dCBpcyBhbGxvd2VkXG4gKiBAdGVtcGxhdGUgQ2hpcENvbXBvbmVudCAtIFRoZSBjaGlwIGNvbXBvbmVudCB0eXBlIGZvciBtdWx0aXBsZSBzZWxlY3Rpb25cbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBTZWxlY3RFbGVtZW50ID0gPFxuICBUT3B0aW9uIGV4dGVuZHMgRmxleGlibGVPcHRpb24gPSBGbGV4aWJsZU9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIE11bHRpcGxlLFxuICBEaXNhYmxlQ2xlYXJhYmxlLFxuICBGcmVlU29sbyxcbiAgQ2hpcENvbXBvbmVudFxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuU2VsZWN0RWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RFbGVtZW50JztcbiIsICJpbXBvcnQgQ2hlY2tCb3hJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2tCb3gnO1xuaW1wb3J0IENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0NoZWNrQm94T3V0bGluZUJsYW5rJztcbmltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb24sXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgR3JpZCxcbiAgQ2hlY2tib3gsXG4gIFRleHRGaWVsZCxcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgU3ludGhldGljRXZlbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGcmFnbWVudCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBGbGV4aWJsZU9wdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcblxudHlwZSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gICduYW1lJyB8ICdyZW5kZXJJbnB1dCcgfCAnbXVsdGlwbGUnIHwgJ29uQ2hhbmdlJyB8ICd2YWx1ZSdcbj47XG5cbmV4cG9ydCB0eXBlIFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBGbGV4aWJsZU9wdGlvbiA9IEZsZXhpYmxlT3B0aW9uLFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSB0cnVlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlLFxuICBEaXNhYmxlQ2xlYXJhYmxlLFxuICBGcmVlU29sbyxcbiAgQ2hpcENvbXBvbmVudFxuPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIGxhYmVsRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICB2YWx1ZUZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgb3B0aW9ucz86IHJlYWRvbmx5IFRPcHRpb25bXSB8IG51bGw7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RNdWx0aUVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIEZsZXhpYmxlT3B0aW9uID0gRmxleGlibGVPcHRpb24sXG4+KHByb3BzOiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIHZhcmlhbnQsXG4gICAgbGFiZWxGaWVsZCA9ICdMYWJlbCcsXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gb3B0aW9uc0lucHV0IHx8IFtdLCBbb3B0aW9uc0lucHV0XSk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvblt2YWx1ZUZpZWxkXSA6IG51bGw7XG4gIH07XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSkgOiAnJztcbiAgfTtcblxuICBjb25zdCBzZWxlY3RlZFZhbHVlID1cbiAgICBmaWVsZC52YWx1ZSAmJiBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKVxuICAgICAgPyBvcHRpb25zLmZpbHRlcihvcHRpb24gPT4gZmllbGQudmFsdWUuaW5jbHVkZXMoZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSkpXG4gICAgICA6IFtdO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChcbiAgICBfOiBTeW50aGV0aWNFdmVudCxcbiAgICBzZWxlY3RlZE9wdGlvbnM6IFRPcHRpb25bXSxcbiAgICByZWFzb246IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvblxuICApID0+IHtcbiAgICBpZiAocmVhc29uID09PSAnY2xlYXInKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShbXSk7XG4gICAgfSBlbHNlIGlmIChyZWFzb24gPT09ICdzZWxlY3RPcHRpb24nIHx8IHJlYXNvbiA9PT0gJ3JlbW92ZU9wdGlvbicpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHNlbGVjdGVkT3B0aW9ucy5tYXAob3B0aW9uID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikpO1xuXG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXMpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBpY29uID0gPENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG4gIGNvbnN0IGNoZWNrZWRJY29uID0gPENoZWNrQm94SWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgdmFsdWU9e3NlbGVjdGVkVmFsdWV9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIGRpc2FibGVDbG9zZU9uU2VsZWN0XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCA/PyBmaWVsZC5kaXNhYmxlZCA/PyBvcHRpb25zLmxlbmd0aCA9PSAwfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZW5kZXJPcHRpb249eyhwcm9wczEsIG9wdGlvbiwgeyBzZWxlY3RlZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCAuLi5vcHRpb25Qcm9wcyB9ID0gcHJvcHMxO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGxpIGtleT17a2V5fSB7Li4ub3B0aW9uUHJvcHN9PlxuICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgIGljb249e2ljb259XG4gICAgICAgICAgICAgIGNoZWNrZWRJY29uPXtjaGVja2VkSWNvbn1cbiAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge2dldE9wdGlvbkxhYmVsKG9wdGlvbiBhcyBUT3B0aW9uKX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxuICAgICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgICA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICB7Li4ucmVzdH1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFNlbGVjdE11bHRpRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgRmxleGlibGVPcHRpb24gPSBGbGV4aWJsZU9wdGlvbixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUT3B0aW9uXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5TZWxlY3RNdWx0aUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0TXVsdGlFbGVtZW50JztcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIFRleHRGaWVsZCwgdXNlRm9ya1JlZiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCwgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IEZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybS9lbmhhbmNlZCc7XG5pbXBvcnQgeyB1c2VFbmhhbmNlZFRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybS9lbmhhbmNlZCc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50T3JWYWx1ZSB9IGZyb20gJy4uLy4uL3R5cGVzL2V2ZW50cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBUZXh0RmllbGRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXh0RmllbGRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImZpcnN0TmFtZVwiIHwgXCJ1c2VyLmVtYWlsXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBmaWVsZCBlcnJvciBvYmplY3RcbiAgICogQHJldHVybnMgQ3VzdG9tIGVycm9yIG1lc3NhZ2Ugb3IgY29tcG9uZW50XG4gICAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ3VzdG9tIFRleHRGaWVsZCBjb21wb25lbnQgdG8gdXNlIGluc3RlYWQgb2YgZGVmYXVsdCBNVUkgVGV4dEZpZWxkXG4gICAqL1xuICBjb21wb25lbnQ/OiB0eXBlb2YgVGV4dEZpZWxkO1xuICAvKipcbiAgICogVmFsdWUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGZvciBpbnB1dC9vdXRwdXRcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGZpZWxkVHlwZSBmb3IgY29tbW9uIHBhdHRlcm5zIG9yIGN1c3RvbSB0cmFuc2Zvcm1zIGZvciBjb21wbGV4IGNhc2VzXG4gICAqL1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgLyoqIFRyYW5zZm9ybSB2YWx1ZSBiZWZvcmUgZGlzcGxheWluZyBpbiBpbnB1dCAqL1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZTtcbiAgICAvKiogVHJhbnNmb3JtIGlucHV0IGV2ZW50IHRvIGZvcm0gdmFsdWUgKi9cbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IEV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgLyoqXG4gICAqIEJ1aWx0LWluIGZpZWxkIHR5cGUgZm9yIGF1dG9tYXRpYyB0cmFuc2Zvcm1hdGlvblxuICAgKiBAZXhhbXBsZSAndGV4dCcgfCAnbnVtYmVyJyB8ICdkYXRlJyB8ICd0aW1lJyB8ICdzZWxlY3QnXG4gICAqL1xuICBmaWVsZFR5cGU/OiBGaWVsZFR5cGU7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlIHRvIGRpc3BsYXkgd2hlbiBmaWVsZCB2YWx1ZSBpcyBudWxsL3VuZGVmaW5lZFxuICAgKiBAZXhhbXBsZSBcIlwiXG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBUVmFsdWU7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgbGFiZWwgdGV4dFxuICAgKiBAZXhhbXBsZSBcIkVtYWlsIEFkZHJlc3NcIlxuICAgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgaW5wdXRcbiAgICogQGV4YW1wbGUgXCJFbnRlciB5b3VyIGVtYWlsXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICAvKipcbiAgICogVGhlIFRleHRGaWVsZCB2YXJpYW50XG4gICAqIEBkZWZhdWx0VmFsdWUgXCJvdXRsaW5lZFwiXG4gICAqL1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGZvciB0aGUgVGV4dEZpZWxkXG4gICAqL1xuICAvKipcbiAgICogQ3VzdG9tIG9uQ2hhbmdlIGhhbmRsZXIgY2FsbGVkIGFmdGVyIHRyYW5zZm9ybWF0aW9uXG4gICAqL1xuICBvbkNoYW5nZT86IChcbiAgICBldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZSBkZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nIHRyYW5zZm9ybWF0aW9uIGlzc3Vlc1xuICAgKiBAZGVmYXVsdFZhbHVlIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAqL1xuICBlbmFibGVXYXJuaW5ncz86IGJvb2xlYW47XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFRleHRGaWVsZEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPihwcm9wczogVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIHRyYW5zZm9ybSxcbiAgICBmaWVsZFR5cGUgPSAndGV4dCcsIC8vIERlZmF1bHQgdG8gdGV4dCB0eXBlXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgZW5hYmxlV2FybmluZ3MgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UmVmLFxuICAgIG9uSW5wdXQsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIC4uLnJlc3RUZXh0UHJvcHNcbiAgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIC8vIFVzZSB0aGUgZW5oYW5jZWQgdHJhbnNmb3JtIGhvb2sgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KFxuICAgIHtcbiAgICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW5wdXQ6IHRyYW5zZm9ybS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdHJhbnNmb3JtLm91dHB1dCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZmllbGRUeXBlOiAhdHJhbnNmb3JtXG4gICAgICAgID8gdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/ICdudW1iZXInXG4gICAgICAgICAgOiBmaWVsZFR5cGVcbiAgICAgICAgOiB1bmRlZmluZWQsIC8vIEF1dG8tZGV0ZWN0IG51bWJlciB0eXBlXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBlbmFibGVXYXJuaW5ncyxcbiAgICB9XG4gICk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZENvbXBvbmVudFxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgIG5hbWU9e2ZpZWxkLm5hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17ZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcblxuICAgICAgICBpZiAoaW5wdXQgPT09ICcnKSB7XG4gICAgICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH19XG4gICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uSW5wdXQ9eyhldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvbklucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25JbnB1dChldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e1xuICAgICAgICBlcnJvciA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKSA6IGhlbHBlclRleHRcbiAgICAgIH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFRleHRGaWVsZCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbixcbiAqIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIGFuZCBidWlsdC1pbiBmaWVsZCB0eXBlIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nXG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnRcbiAqIC0gQnVpbHQtaW4gZmllbGQgdHlwZXMgZm9yIGNvbW1vbiBwYXR0ZXJuc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gT3B0aW1pemVkIG51bWJlciBpbnB1dCBoYW5kbGluZ1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgd2l0aCBtZW1vaXplZCB0cmFuc2Zvcm1hdGlvbnNcbiAqIC0gRGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZ1xuICogLSBTdGFibGUgcmVmZXJlbmNlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBidWlsdC1pbiBudW1iZXIgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIGZpZWxkVHlwZT1cIm51bWJlclwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnQWdlIGlzIHJlcXVpcmVkJywgbWluOiB7IHZhbHVlOiAwLCBtZXNzYWdlOiAnQWdlIG11c3QgYmUgcG9zaXRpdmUnIH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJlbWFpbFwiXG4gKiAgIGxhYmVsPVwiRW1haWxcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGVtYWlsIGFkZHJlc3NcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ0VtYWlsIGlzIHJlcXVpcmVkJyxcbiAqICAgICBwYXR0ZXJuOiB7IHZhbHVlOiAvXFxTK0BcXFMrXFwuXFxTKy8sIG1lc3NhZ2U6ICdJbnZhbGlkIGVtYWlsJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInByaWNlXCJcbiAqICAgbGFiZWw9XCJQcmljZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID8gYCQke3ZhbHVlfWAgOiAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gcGFyc2VGbG9hdChldmVudC50YXJnZXQudmFsdWUucmVwbGFjZSgnJCcsICcnKSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBlcnJvciBwYXJzaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcm5hbWVcIlxuICogICBsYWJlbD1cIlVzZXJuYW1lXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gKFxuICogICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAncmVkJyB9fT5cbiAqICAgICAgIFx1MjZBMFx1RkUwRiB7ZXJyb3IubWVzc2FnZX1cbiAqICAgICA8L3NwYW4+XG4gKiAgICl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBUZXh0RmllbGRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgdXNlRm9ya1JlZiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIFRpbWVQaWNrZXJQcm9wcyxcbiAgVGltZVBpY2tlclNsb3RQcm9wcyxcbiAgVGltZVZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgeyBUaW1lUGlja2VyIH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHMnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkUGF0aCxcbiAgUGF0aFZhbHVlLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFZhbHVlcyxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuaW1wb3J0IHsgcmVhZFZhbHVlQXNEYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVhZFZhbHVlQXNEYXRlJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lUGlja2VyRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBpc0RhdGU/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgVGltZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBpbnB1dFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgaGVscGVyVGV4dD86IFRleHRGaWVsZFByb3BzWydoZWxwZXJUZXh0J107XG4gIGxhYmVsPzogUmVhY3ROb2RlO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgc2xvdFByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyU2xvdFByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgICd0ZXh0RmllbGQnXG4gID47XG4gIHRyYW5zZm9ybT86IHtcbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWUgfCBudWxsO1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHRpbWVQaWNrZXJQcm9wcz86IE9taXQ8XG4gICAgVGltZVBpY2tlclByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgICd2YWx1ZScgfCAnc2xvdFByb3BzJ1xuICA+O1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFRpbWVQaWNrZXJFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ocHJvcHM6IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICByZXF1aXJlZCxcbiAgICBpbnB1dFByb3BzLFxuICAgIGNvbnRyb2wsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHNsb3RQcm9wcyxcbiAgICB0aW1lUGlja2VyUHJvcHMgPSB7fSxcbiAgICB0cmFuc2Zvcm0sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICBjb25zdCB7IGRpc2FibGVkLCBpbnB1dFJlZiwgb25DbG9zZSwgLi4ucmVzdFRpbWVQaWNrZXJQcm9wcyB9ID1cbiAgICB0aW1lUGlja2VyUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSB8IG51bGw+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6IG5ld1ZhbHVlID0+IHJlYWRWYWx1ZUFzRGF0ZShhZGFwdGVyLCBuZXdWYWx1ZSksXG4gICAgICBvdXRwdXQ6IChldmVudE9yVmFsdWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIC8vIE1VSSBEYXRlUGlja2VyIHBhc3NlcyAodmFsdWUsIGNvbnRleHQpLCBzbyB3ZSBjaGVjayB0aGUgc2Vjb25kIHBhcmFtXG4gICAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogZXZlbnRPclZhbHVlO1xuXG4gICAgICAgIGlmIChhY3R1YWxWYWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuXG4gICAgICAgIHJldHVybiBhY3R1YWxWYWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUaW1lUGlja2VyXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHsuLi5yZXN0VGltZVBpY2tlclByb3BzfVxuICAgICAgey4uLmZpZWxkfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgey4uLnRpbWVQaWNrZXJQcm9wc31cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIG9uQ2xvc2U9eyguLi5hcmdzKSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICAgIG9uQ2xvc2UoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkNoYW5nZT17KG5ld1ZhbHVlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIG9uQ2hhbmdlKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aW1lUGlja2VyUHJvcHMub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aW1lUGlja2VyUHJvcHMub25DaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgICAgYWN0aW9uczogWydjbGVhcicsICdjYW5jZWwnLCAnYWNjZXB0J10sXG4gICAgICAgIH0sXG4gICAgICAgIHRleHRGaWVsZDoge1xuICAgICAgICAgIC4uLmlucHV0UHJvcHMsXG4gICAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgICAgIG9uQmx1cjogKFxuICAgICAgICAgICAgZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXRQcm9wcz8ub25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGlucHV0UHJvcHMub25CbHVyKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAhIWVycm9yLFxuICAgICAgICAgIGhlbHBlclRleHQ6IGVycm9yXG4gICAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgIDogaW5wdXRQcm9wcz8uaGVscGVyVGV4dCB8fCByZXN0LmhlbHBlclRleHQsXG4gICAgICAgICAgaW5wdXRQcm9wczoge1xuICAgICAgICAgICAgcmVhZE9ubHk6ICEhdGV4dFJlYWRPbmx5LFxuICAgICAgICAgICAgLi4uaW5wdXRQcm9wcz8uaW5wdXRQcm9wcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFRpbWVQaWNrZXJFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuVGltZVBpY2tlckVsZW1lbnQuZGlzcGxheU5hbWUgPSAnVGltZVBpY2tlckVsZW1lbnQnO1xuIiwgImltcG9ydCB7XG4gIEF1dG9jb21wbGV0ZSxcbiAgQ2lyY3VsYXJQcm9ncmVzcyxcbiAgR3JpZCxcbiAgVGV4dEZpZWxkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9BdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdAbXVpL21hdGVyaWFsL3V0aWxzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIEZyYWdtZW50LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyLFxuICB0eXBlIEZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFZhbHVlcyxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY1NlbGVjdFBheWxvYWQgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNTZWxlY3RFbGVtZW50UHJvcHMsIE9wdGlvbk9iamVjdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBBc3luY1NlbGVjdEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleVxuICA+LFxuPihcbiAgcHJvcHM6IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFRPcHRpb25cbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgaW5pdGlhbFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHF1ZXJ5Rm4sXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScgYXMgVFZhbHVlS2V5LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9uLCBzZXRTZWxlY3RlZE9wdGlvbl0gPSB1c2VTdGF0ZTxUT3B0aW9uIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgaW5wdXRWYWx1ZTI6IHN0cmluZyA9IHVzZU1lbW8oKCkgPT4gaW5wdXRWYWx1ZSwgW2lucHV0VmFsdWVdKTtcbiAgY29uc3Qgc2V0SW5wdXRWYWx1ZTIgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3VmFsdWU6IHN0cmluZykgPT4gc2V0SW5wdXRWYWx1ZShuZXdWYWx1ZSksXG4gICAgW11cbiAgKTtcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8cmVhZG9ubHkgVE9wdGlvbltdPihbXSk7XG5cbiAgY29uc3QgaW5pdGlhbFZhbHVlTG9hZGVkID0gdXNlUmVmPGJvb2xlYW4+KFxuICAgICFpbml0aWFsVmFsdWUgPyB0cnVlIDogIShpbml0aWFsVmFsdWUgIT0gbnVsbClcbiAgKTtcblxuICBjb25zdCBmaWVsZFZhbHVlID0gdXNlUmVmPFRPcHRpb25bVFZhbHVlS2V5XSB8IG51bGw+KGZpZWxkLnZhbHVlKTtcblxuICBjb25zdCBmZXRjaERhdGEgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBkZWJvdW5jZShcbiAgICAgICAgKFxuICAgICAgICAgIHBheWxvYWQ6IEFzeW5jU2VsZWN0UGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHZvaWRcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgcXVlcnlGbihwYXlsb2FkKS50aGVuKGMgPT4gY2FsbGJhY2soYykpO1xuICAgICAgICB9LFxuICAgICAgICA0MDBcbiAgICAgICksXG4gICAgW3F1ZXJ5Rm5dXG4gICk7XG5cbiAgY29uc3QgZmlsbE9wdGlvbnMgPSB1c2VDYWxsYmFjayhcbiAgICAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4ge1xuICAgICAgbGV0IG5ld09wdGlvbnM6IHJlYWRvbmx5IFRPcHRpb25bXSA9IFtdO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgbmV3T3B0aW9ucyA9IFtzZWxlY3RlZE9wdGlvbl07XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHRzKSB7XG4gICAgICAgIG5ld09wdGlvbnMgPSBbLi4ubmV3T3B0aW9ucywgLi4ucmVzdWx0c107XG4gICAgICB9XG5cbiAgICAgIHNldE9wdGlvbnMobmV3T3B0aW9ucyk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9LFxuICAgIFtzZWxlY3RlZE9wdGlvbl1cbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbml0aWFsVmFsdWVMb2FkZWQuY3VycmVudCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGxldCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgY29uc3QgcGF5bG9hZDogQXN5bmNTZWxlY3RQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IG51bGwsXG4gICAgICBpbml0aWFsVmFsdWUsXG4gICAgfTtcblxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICBmZXRjaERhdGEocGF5bG9hZCwgKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgaWYgKCEhcmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmaWxsT3B0aW9ucyhyZXN1bHRzPy5maWx0ZXIoYyA9PiBjW3ZhbHVlRmllbGRdID09IGluaXRpYWxWYWx1ZSkpO1xuICAgICAgICAgIHNldFNlbGVjdGVkT3B0aW9uKHJlc3VsdHNbMF0pO1xuICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKHJlc3VsdHNbMF1bdmFsdWVGaWVsZF0pO1xuICAgICAgICAgIGZpZWxkVmFsdWUuY3VycmVudCA9IHJlc3VsdHNbMF1bdmFsdWVGaWVsZF07XG4gICAgICAgIH1cblxuICAgICAgICBpbml0aWFsVmFsdWVMb2FkZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtpbml0aWFsVmFsdWUsIGZldGNoRGF0YSwgZmllbGQsIGZpbGxPcHRpb25zLCB2YWx1ZUZpZWxkXSk7XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIGlmIChpbnB1dFZhbHVlMiA9PT0gJycgfHwgaW5pdGlhbFZhbHVlTG9hZGVkLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICBzZXRPcHRpb25zKHNlbGVjdGVkT3B0aW9uID8gW3NlbGVjdGVkT3B0aW9uXSA6IFtdKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChmaWVsZFZhbHVlLmN1cnJlbnQpIHtcbiAgICAgIGlmIChmaWVsZC52YWx1ZSA9PT0gZmllbGRWYWx1ZS5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0UGF5bG9hZCA9IHtcbiAgICAgIHF1ZXJ5OiBpbnB1dFZhbHVlMixcbiAgICAgIGluaXRpYWxWYWx1ZTogbnVsbCxcbiAgICB9O1xuXG4gICAgZmV0Y2hEYXRhKHBheWxvYWQsIChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGZpbGxPcHRpb25zKHJlc3VsdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtcbiAgICBpbml0aWFsVmFsdWUsXG4gICAgaW5wdXRWYWx1ZTIsXG4gICAgZmV0Y2hEYXRhLFxuICAgIGZpZWxkLnZhbHVlLFxuICAgIGZpbGxPcHRpb25zLFxuICAgIHNlbGVjdGVkT3B0aW9uLFxuICBdKTtcblxuICBjb25zdCBzZWxlY3RSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIF86IFJlYWN0LlN5bnRoZXRpY0V2ZW50LFxuICAgIG5ld1NlbGVjdGVkT3B0aW9uOiBUT3B0aW9uIHwgbnVsbCxcbiAgICByZWFzb246IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvblxuICApID0+IHtcbiAgICBpZiAocmVhc29uID09PSAnY2xlYXInKSB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihudWxsKTtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChyZWFzb24gPT09ICdzZWxlY3RPcHRpb24nIHx8IHJlYXNvbiA9PT0gJ3JlbW92ZU9wdGlvbicpIHtcbiAgICAgIGlmIChuZXdTZWxlY3RlZE9wdGlvbikge1xuICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbihuZXdTZWxlY3RlZE9wdGlvbik7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1NlbGVjdGVkT3B0aW9uW3ZhbHVlRmllbGRdKTtcbiAgICAgICAgZmllbGRWYWx1ZS5jdXJyZW50ID0gbmV3U2VsZWN0ZWRPcHRpb25bdmFsdWVGaWVsZF07XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldE9wdGlvbnMoW10pO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFmaWVsZC52YWx1ZSkge1xuICAgICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihudWxsKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSwgW2ZpZWxkLnZhbHVlXSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvblt2YWx1ZUZpZWxkXSkgOiAnJztcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGRdKSA6ICcnO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICByZWY9e3NlbGVjdFJlZn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uVmFsdWV9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgYXV0b0NvbXBsZXRlXG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBpbmNsdWRlSW5wdXRJbkxpc3RcbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICBmaWx0ZXJPcHRpb25zPXt4ID0+IHh9XG4gICAgICB2YWx1ZT17c2VsZWN0ZWRPcHRpb259XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbklucHV0Q2hhbmdlPXsoXywgbmV3SW5wdXRWYWx1ZSkgPT4ge1xuICAgICAgICBzZXRJbnB1dFZhbHVlMihuZXdJbnB1dFZhbHVlKTtcbiAgICAgIH19XG4gICAgICBub09wdGlvbnNUZXh0PVwiVHlwZSBTb21ldGhpbmcuLi5cIlxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHJlbmRlck9wdGlvbj17KHJlbmRlclByb3BzLCBvcHRpb24pID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIC4uLm9wdGlvblByb3BzIH0gPSByZW5kZXJQcm9wcztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIHtvcHRpb25bbGFiZWxGaWVsZF19XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jU2VsZWN0RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBBc3luY1NlbGVjdEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVFZhbHVlS2V5LFxuICBUTGFiZWxLZXksXG4gIFRPcHRpb25cbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFRPcHRpb24+XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuQXN5bmNTZWxlY3RFbGVtZW50LmRpc3BsYXlOYW1lID0gJ0FzeW5jU2VsZWN0RWxlbWVudCc7XG5cbmV4cG9ydCB7IEFzeW5jU2VsZWN0RWxlbWVudCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtL2VuaGFuY2VkJztcbmltcG9ydCB7IHVzZUVuaGFuY2VkVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtL2VuaGFuY2VkJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZXZlbnRzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlckZpZWxkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBUZXh0RmllbGQgY29tcG9uZW50IHRvIHVzZSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVVJIFRleHRGaWVsZFxuICAgKi9cbiAgY29tcG9uZW50PzogdHlwZW9mIFRleHRGaWVsZDtcbiAgLyoqXG4gICAqIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5wdXQvb3V0cHV0XG4gICAqIEBkZXByZWNhdGVkIFVzZSBmaWVsZFR5cGUgZm9yIGNvbW1vbiBwYXR0ZXJucyBvciBjdXN0b20gdHJhbnNmb3JtcyBmb3IgY29tcGxleCBjYXNlc1xuICAgKi9cbiAgdHJhbnNmb3JtPzoge1xuICAgIC8qKiBUcmFuc2Zvcm0gdmFsdWUgYmVmb3JlIGRpc3BsYXlpbmcgaW4gaW5wdXQgKi9cbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWU7XG4gICAgLyoqIFRyYW5zZm9ybSBpbnB1dCBldmVudCB0byBmb3JtIHZhbHVlICovXG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBCdWlsdC1pbiBmaWVsZCB0eXBlIGZvciBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb25cbiAgICogQGV4YW1wbGUgJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAndGltZScgfCAnc2VsZWN0J1xuICAgKi9cbiAgZmllbGRUeXBlPzogRmllbGRUeXBlO1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZSB0byBkaXNwbGF5IHdoZW4gZmllbGQgdmFsdWUgaXMgbnVsbC91bmRlZmluZWRcbiAgICogQGV4YW1wbGUgXCJcIlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVFZhbHVlO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJFbWFpbCBBZGRyZXNzXCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGlucHV0XG4gICAqIEBleGFtcGxlIFwiRW50ZXIgeW91ciBlbWFpbFwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnID47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBvbkNoYW5nZSBoYW5kbGVyIGNhbGxlZCBhZnRlciB0cmFuc2Zvcm1hdGlvblxuICAgKi9cbiAgb25DaGFuZ2U/OiAoXG4gICAgZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PlxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGUgZGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyB0cmFuc2Zvcm1hdGlvbiBpc3N1ZXNcbiAgICogQGRlZmF1bHRWYWx1ZSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xuICAgKi9cbiAgZW5hYmxlV2FybmluZ3M/OiBib29sZWFuO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBOdW1iZXJGaWVsZEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPihwcm9wczogTnVtYmVyRmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgcGFyc2VFcnJvcixcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgY29tcG9uZW50OiBUZXh0RmllbGRDb21wb25lbnQgPSBUZXh0RmllbGQsXG4gICAgdHJhbnNmb3JtLFxuICAgIGZpZWxkVHlwZSA9ICd0ZXh0JywgLy8gRGVmYXVsdCB0byB0ZXh0IHR5cGVcbiAgICBkZWZhdWx0VmFsdWUsXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIG9uQ2hhbmdlOiBjdXN0b21PbkNoYW5nZSxcbiAgICBlbmFibGVXYXJuaW5ncyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICB0eXBlID0gJ251bWJlcicsXG4gICAgcmVxdWlyZWQsXG4gICAgaGVscGVyVGV4dCxcbiAgICBpbnB1dFJlZixcbiAgICBvbklucHV0LFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICAvLyBVc2UgdGhlIGVuaGFuY2VkIHRyYW5zZm9ybSBob29rIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uc1xuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRW5oYW5jZWRUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPihcbiAgICB7XG4gICAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGlucHV0OiB0cmFuc2Zvcm0uaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHRyYW5zZm9ybS5vdXRwdXQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGZpZWxkVHlwZTogIXRyYW5zZm9ybVxuICAgICAgICA/IHR5cGUgPT09ICdudW1iZXInXG4gICAgICAgICAgPyAnbnVtYmVyJ1xuICAgICAgICAgIDogZmllbGRUeXBlXG4gICAgICAgIDogdW5kZWZpbmVkLCAvLyBBdXRvLWRldGVjdCBudW1iZXIgdHlwZVxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZW5hYmxlV2FybmluZ3MsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9e2V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSAnJykge1xuICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgb25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbklucHV0PXsoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb25JbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uSW5wdXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25XaGVlbD17ZSA9PiB7XG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuYmx1cigpO1xuICAgICAgfX1cbiAgICAgIG9uS2V5RG93bj17ZSA9PiB7XG4gICAgICAgIGlmIChbJ2UnLCAnRScsICdBcnJvd0Rvd24nLCAnQXJyb3dVcCddLmluY2x1ZGVzKGUua2V5KSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17XG4gICAgICAgIGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogaGVscGVyVGV4dFxuICAgICAgfVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgVGV4dEZpZWxkIGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uLFxuICogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucywgYW5kIGJ1aWx0LWluIGZpZWxkIHR5cGUgaGFuZGxpbmcuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5IHdpdGggY3VzdG9tIHBhcnNpbmdcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gc3VwcG9ydFxuICogLSBCdWlsdC1pbiBmaWVsZCB0eXBlcyBmb3IgY29tbW9uIHBhdHRlcm5zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBPcHRpbWl6ZWQgbnVtYmVyIGlucHV0IGhhbmRsaW5nXG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyB3aXRoIG1lbW9pemVkIHRyYW5zZm9ybWF0aW9uc1xuICogLSBEZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nXG4gKiAtIFN0YWJsZSByZWZlcmVuY2VzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGJ1aWx0LWluIG51bWJlciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFnZVwiXG4gKiAgIGxhYmVsPVwiQWdlXCJcbiAqICAgZmllbGRUeXBlPVwibnVtYmVyXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdBZ2UgaXMgcmVxdWlyZWQnLCBtaW46IHsgdmFsdWU6IDAsIG1lc3NhZ2U6ICdBZ2UgbXVzdCBiZSBwb3NpdGl2ZScgfSB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImVtYWlsXCJcbiAqICAgbGFiZWw9XCJFbWFpbFwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgZW1haWwgYWRkcmVzc1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnRW1haWwgaXMgcmVxdWlyZWQnLFxuICogICAgIHBhdHRlcm46IHsgdmFsdWU6IC9cXFMrQFxcUytcXC5cXFMrLywgbWVzc2FnZTogJ0ludmFsaWQgZW1haWwnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIHRyYW5zZm9ybWF0aW9uOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicHJpY2VcIlxuICogICBsYWJlbD1cIlByaWNlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPyBgJCR7dmFsdWV9YCA6ICcnLFxuICogICAgIG91dHB1dDogKGV2ZW50KSA9PiBwYXJzZUZsb2F0KGV2ZW50LnRhcmdldC52YWx1ZS5yZXBsYWNlKCckJywgJycpKSB8fCBudWxsXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGVycm9yIHBhcnNpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VybmFtZVwiXG4gKiAgIGxhYmVsPVwiVXNlcm5hbWVcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiAoXG4gKiAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICdyZWQnIH19PlxuICogICAgICAgXHUyNkEwXHVGRTBGIHtlcnJvci5tZXNzYWdlfVxuICogICAgIDwvc3Bhbj5cbiAqICAgKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IE51bWJlckZpZWxkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBOdW1iZXJGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgQm94UHJvcHMsIEZvcm1IZWxwZXJUZXh0UHJvcHMsIEdyaWRQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgQm94LCBHcmlkLCBpbnB1dEJhc2VDbGFzc2VzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBNdWlPdHBJbnB1dCxcbiAgdHlwZSBNdWlPdHBJbnB1dFByb3BzLFxufSBmcm9tICdtdWktb25lLXRpbWUtcGFzc3dvcmQtaW5wdXQnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IENvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyBIZWxwZXJUZXh0IH0gZnJvbSAnLi9IZWxwZXJUZXh0JztcblxuZXhwb3J0IGludGVyZmFjZSBPVFBJbnB1dEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImZpcnN0TmFtZVwiIHwgXCJ1c2VyLmVtYWlsXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBmaWVsZCBlcnJvciBvYmplY3RcbiAgICogQHJldHVybnMgQ3VzdG9tIGVycm9yIG1lc3NhZ2Ugb3IgY29tcG9uZW50XG4gICAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuXG4gIG1heFNpemU/OiBudW1iZXI7XG5cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgaGVscGVyVGV4dD86IFJlYWN0LlJlYWN0Tm9kZTtcblxuICBzbG90UHJvcHM/OiB7XG4gICAgd3JhcHBlcj86IEJveFByb3BzO1xuICAgIGhlbHBlclRleHQ/OiBGb3JtSGVscGVyVGV4dFByb3BzO1xuICAgIHRleHRmaWVsZD86IE11aU90cElucHV0UHJvcHNbJ1RleHRGaWVsZHNQcm9wcyddO1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIE9UUElucHV0RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogT1RQSW5wdXRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIC8vIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIHNsb3RQcm9wcyxcbiAgICBoZWxwZXJUZXh0LFxuICAgIG1heFNpemUgPSA1NixcbiAgICBwbGFjZWhvbGRlciA9ICctJyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICAvLyBjb25zdCB7XG4gIC8vICAgZmllbGQsXG4gIC8vICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICAvLyB9ID0gdXNlQ29udHJvbGxlcih7XG4gIC8vICAgbmFtZSxcbiAgLy8gICBjb250cm9sLFxuICAvLyB9KTtcblxuICByZXR1cm4gKFxuICAgIDxDb250cm9sbGVyXG4gICAgICBuYW1lPXtuYW1lfVxuICAgICAgY29udHJvbD17Y29udHJvbH1cbiAgICAgIHJlbmRlcj17KHsgZmllbGQsIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSB9KSA9PiAoXG4gICAgICAgIDxCb3hcbiAgICAgICAgICB7Li4uc2xvdFByb3BzPy53cmFwcGVyfVxuICAgICAgICAgIHN4PXtbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBbYCYgLiR7aW5wdXRCYXNlQ2xhc3Nlcy5pbnB1dH1gXToge1xuICAgICAgICAgICAgICAgIHA6IDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgICAgICAgYXNwZWN0UmF0aW86ICcxLzEnLFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiBtYXhTaXplLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KHNsb3RQcm9wcz8ud3JhcHBlcj8uc3gpXG4gICAgICAgICAgICAgID8gKHNsb3RQcm9wcz8ud3JhcHBlcj8uc3ggPz8gW10pXG4gICAgICAgICAgICAgIDogW3Nsb3RQcm9wcz8ud3JhcHBlcj8uc3hdKSxcbiAgICAgICAgICBdfVxuICAgICAgICA+XG4gICAgICAgICAgPE11aU90cElucHV0XG4gICAgICAgICAgICB7Li4uZmllbGR9XG4gICAgICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgICAgIGdhcD17MS41fVxuICAgICAgICAgICAgbGVuZ3RoPXs0fVxuICAgICAgICAgICAgVGV4dEZpZWxkc1Byb3BzPXt7XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICBlcnJvcjogISFlcnJvcixcbiAgICAgICAgICAgICAgLi4uc2xvdFByb3BzPy50ZXh0ZmllbGQsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgLz5cblxuICAgICAgICAgIDxIZWxwZXJUZXh0XG4gICAgICAgICAgICB7Li4uc2xvdFByb3BzPy5oZWxwZXJUZXh0fVxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlPXtlcnJvcj8ubWVzc2FnZX1cbiAgICAgICAgICAgIGhlbHBlclRleHQ9e2hlbHBlclRleHR9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgT1RQSW5wdXRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBPVFBJbnB1dEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPik6IFJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEZvcm1IZWxwZXJUZXh0UHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsL0Zvcm1IZWxwZXJUZXh0JztcbmltcG9ydCBGb3JtSGVscGVyVGV4dCBmcm9tICdAbXVpL21hdGVyaWFsL0Zvcm1IZWxwZXJUZXh0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBIZWxwZXJUZXh0UHJvcHMgPSBGb3JtSGVscGVyVGV4dFByb3BzICYge1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIGRpc2FibGVHdXR0ZXJzPzogYm9vbGVhbjtcbiAgaGVscGVyVGV4dD86IFJlYWN0LlJlYWN0Tm9kZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBIZWxwZXJUZXh0KHtcbiAgc3gsXG4gIGhlbHBlclRleHQsXG4gIGVycm9yTWVzc2FnZSxcbiAgZGlzYWJsZUd1dHRlcnMsXG4gIC4uLm90aGVyXG59OiBIZWxwZXJUZXh0UHJvcHMpIHtcbiAgaWYgKGVycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxGb3JtSGVscGVyVGV4dFxuICAgICAgICBlcnJvcj17ISFlcnJvck1lc3NhZ2V9XG4gICAgICAgIHN4PXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbXg6IGRpc2FibGVHdXR0ZXJzID8gMCA6IDEuNzUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShzeCkgPyBzeCA6IFtzeF0pLFxuICAgICAgICBdfVxuICAgICAgICB7Li4ub3RoZXJ9XG4gICAgICA+XG4gICAgICAgIHtlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dH1cbiAgICAgIDwvRm9ybUhlbHBlclRleHQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwgImltcG9ydCB7IEFzeW5jTXVsdGlTZWxlY3QyIH0gZnJvbSBcIi4uL0FzeW5jTXVsdGlTZWxlY3QyXCI7XG5pbXBvcnQgeyBBc3luY1NlbGVjdEVsZW1lbnQgfSBmcm9tIFwiLi4vQXN5bmNTZWxlY3RcIjtcbmltcG9ydCB7IENoZWNrYm94RWxlbWVudCB9IGZyb20gXCIuLi9DaGVja2JveEVsZW1lbnRcIjtcbmltcG9ydCB7IENoZWNrYm94R3JvdXAgfSBmcm9tIFwiLi4vQ2hlY2tib3hHcm91cFwiO1xuaW1wb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnQgfSBmcm9tIFwiLi4vRGF0ZVBpY2tlckVsZW1lbnRcIjtcbmltcG9ydCB7IE51bWJlckZpZWxkRWxlbWVudCB9IGZyb20gXCIuLi9OdW1iZXJGaWVsZEVsZW1lbnRcIjtcbmltcG9ydCB7IE9UUElucHV0RWxlbWVudCB9IGZyb20gXCIuLi9PVFBJbnB1dEVsZW1lbnQvT1RQSW5wdXRFbGVtZW50XCI7XG5pbXBvcnQgeyBQYXNzd29yZEVsZW1lbnQgfSBmcm9tIFwiLi4vUGFzc3dvcmRFbGVtZW50XCI7XG5pbXBvcnQgeyBSYWRpb0J1dHRvbkdyb3VwIH0gZnJvbSBcIi4uL1JhZGlvQnV0dG9uR3JvdXBcIjtcbmltcG9ydCB7IFNlbGVjdENhc2NhZGVFbGVtZW50IH0gZnJvbSBcIi4uL1NlbGVjdENhc2NhZGVFbGVtZW50XCI7XG5pbXBvcnQgeyBTZWxlY3RFbGVtZW50IH0gZnJvbSBcIi4uL1NlbGVjdEVsZW1lbnRcIjtcbmltcG9ydCB7IFNlbGVjdE11bHRpRWxlbWVudCB9IGZyb20gXCIuLi9TZWxlY3RNdWx0aUVsZW1lbnRcIjtcbmltcG9ydCB7IFRleHRGaWVsZEVsZW1lbnQgfSBmcm9tIFwiLi4vVGV4dEZpZWxkRWxlbWVudFwiO1xuaW1wb3J0IHsgVGltZVBpY2tlckVsZW1lbnQgfSBmcm9tIFwiLi4vVGltZVBpY2tlckVsZW1lbnRcIjtcblxuY29uc3QgRmllbGQgPSB7XG4gIFRleHQ6IFRleHRGaWVsZEVsZW1lbnQsXG4gIE51bWJlcjogTnVtYmVyRmllbGRFbGVtZW50LFxuICBDaGVja2JveDogQ2hlY2tib3hFbGVtZW50LFxuICBEYXRlOiBEYXRlUGlja2VyRWxlbWVudCxcbiAgUmFkaW9Hcm91cDogUmFkaW9CdXR0b25Hcm91cCxcbiAgUGFzc3dvcmQ6IFBhc3N3b3JkRWxlbWVudCxcbiAgVGltZTogVGltZVBpY2tlckVsZW1lbnQsXG4gIFNlbGVjdDogU2VsZWN0RWxlbWVudCxcbiAgU2VsZWN0TXVsdGk6IFNlbGVjdE11bHRpRWxlbWVudCxcbiAgU2VsZWN0Q2FzY2FkZTogU2VsZWN0Q2FzY2FkZUVsZW1lbnQsXG4gIEFzeW5jU2VsZWN0OiBBc3luY1NlbGVjdEVsZW1lbnQsXG4gIEFzeW5jTXVsdGlTZWxlY3Q6IEFzeW5jTXVsdGlTZWxlY3QyLFxuICBDaGVja2JveEdyb3VwLFxuICBPVFBJbnB1dDogT1RQSW5wdXRFbGVtZW50XG59O1xuXG5leHBvcnQgeyBGaWVsZCB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7O0FBNEZPLFNBQVMsY0FBYyxPQUFxQztBQUNqRSxTQUNFLE9BQU8sVUFBVSxZQUNqQixVQUFV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QSxJQUFNLFFBQVE7QUFBQSxFQUNaLE1BQU1HO0FBQUEsRUFDTixRQUFRQztBQUFBLEVBQ1IsVUFBVUM7QUFBQSxFQUNWLE1BQU07QUFBQSxFQUNOLFlBQVlDO0FBQUEsRUFDWixVQUFVO0FBQUEsRUFDVixNQUFNQztBQUFBLEVBQ04sUUFBUUM7QUFBQSxFQUNSLGFBQWFDO0FBQUEsRUFDYixlQUFlQztBQUFBLEVBQ2YsYUFBYUM7QUFBQSxFQUNiLGtCQUFrQjtBQUFBLEVBQ2xCLGVBQUFDO0FBQUEsRUFDQSxVQUFVQztBQUNaOyIsCiAgIm5hbWVzIjogWyJpbnB1dFZhbHVlIiwgIl8iLCAicHJvcHMiLCAiQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAiZGVib3VuY2UiLCAidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJGcmFnbWVudCIsICJqc3giLCAianN4cyIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiQ2hlY2tib3hFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtR3JvdXAiLCAiRm9ybUhlbHBlclRleHQiLCAiR3JpZCIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQ2hlY2tib3hHcm91cCIsICJHcmlkIiwgImZvcndhcmRSZWYiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlTWVtbyIsICJ1c2VNZW1vIiwgImpzeCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAianN4IiwgImZvcndhcmRSZWYiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJHcmlkIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJwYXNzd29yZCIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkdyaWQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAidXNlQ29udHJvbGxlciIsICJ2YWx1ZSIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIlJhZGlvQnV0dG9uR3JvdXAiLCAiR3JpZCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlUmVmIiwgInVzZUVmZmVjdCIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RDYXNjYWRlRWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlTWVtbyIsICJ1c2VFZmZlY3QiLCAidXNlQ2FsbGJhY2siLCAidXNlUmVmIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiVGV4dEZpZWxkIiwgIkF1dG9jb21wbGV0ZSIsICJDaXJjdWxhclByb2dyZXNzIiwgIkZyYWdtZW50IiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiXyIsICJTZWxlY3RNdWx0aUVsZW1lbnQiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiVGV4dEZpZWxkIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlRm9ya1JlZiIsICJUZXh0RmllbGRFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJ1c2VGb3JrUmVmIiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlQ29udHJvbGxlciIsICJ2YWx1ZSIsICJ1c2VGb3JrUmVmIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIkdyaWQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAiZGVib3VuY2UiLCAiUmVhY3QiLCAiRnJhZ21lbnQiLCAidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlUmVmIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIl8iLCAiQXN5bmNTZWxlY3RFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlRleHRGaWVsZCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUZvcmtSZWYiLCAiTnVtYmVyRmllbGRFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJGb3JtSGVscGVyVGV4dCIsICJqc3giLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIk9UUElucHV0RWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZEVsZW1lbnQiLCAiTnVtYmVyRmllbGRFbGVtZW50IiwgIkNoZWNrYm94RWxlbWVudCIsICJSYWRpb0J1dHRvbkdyb3VwIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIlNlbGVjdEVsZW1lbnQiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIlNlbGVjdENhc2NhZGVFbGVtZW50IiwgIkFzeW5jU2VsZWN0RWxlbWVudCIsICJDaGVja2JveEdyb3VwIiwgIk9UUElucHV0RWxlbWVudCJdCn0K