@gnwebsoft/ui 4.0.45 → 4.0.47

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.
@@ -1,2683 +0,0 @@
1
- import {
2
- useEnhancedTransform,
3
- useTransform
4
- } from "./chunk-PW777IOX.js";
5
- import {
6
- readValueAsDate
7
- } from "./chunk-N37HXJT5.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
- debounce,
26
- Grid,
27
- TextField,
28
- useTheme
29
- } from "@mui/material";
30
- import match from "autosuggest-highlight/match";
31
- import parse from "autosuggest-highlight/parse";
32
- import {
33
- useState,
34
- useRef,
35
- useMemo,
36
- useEffect,
37
- useCallback,
38
- Fragment
39
- } from "react";
40
- import { useController } from "react-hook-form";
41
- import { jsx, jsxs } from "react/jsx-runtime";
42
- var Component = function AsyncSelectMultiElement(props) {
43
- const {
44
- name,
45
- disabled,
46
- control,
47
- placeholder,
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 theme = useTheme();
63
- const [selectedOptions, setSelectedOptions] = useState([]);
64
- const [inputValue, setInputValue] = useState("");
65
- const [options, setOptions] = useState([]);
66
- const [loading, setLoading] = useState(false);
67
- const loadedValuesRef = useRef([]);
68
- const isInitialPopulationActive = useRef(false);
69
- const lastFetchedSearchTermRef = useRef(null);
70
- const initialLoadCompleteRef = useRef(false);
71
- const selectedOptionsRef = useRef([]);
72
- const getOptionValue = useCallback(
73
- (option) => option ? String(option[valueField]) : "",
74
- [valueField]
75
- );
76
- const getOptionLabel = useCallback(
77
- (option) => option ? String(option[labelField]) : "",
78
- [labelField]
79
- );
80
- const fetchData = useMemo(
81
- () => debounce(
82
- (payload, callback) => {
83
- queryFn(payload).then((c) => {
84
- if (Array.isArray(c)) {
85
- callback(c);
86
- } else if (c && Array.isArray(c.data)) {
87
- callback(
88
- c.data
89
- );
90
- } else if (c && Array.isArray(c.Data)) {
91
- callback(
92
- c.Data
93
- );
94
- } else {
95
- callback([]);
96
- }
97
- });
98
- },
99
- 400
100
- ),
101
- [queryFn]
102
- );
103
- useEffect(() => {
104
- selectedOptionsRef.current = selectedOptions;
105
- }, [selectedOptions]);
106
- useEffect(() => {
107
- const formValues = Array.isArray(field.value) ? field.value : [];
108
- if (initialLoadCompleteRef.current && JSON.stringify(formValues) === JSON.stringify(loadedValuesRef.current)) {
109
- return;
110
- }
111
- if (formValues.length === 0) {
112
- setSelectedOptions([]);
113
- setOptions([]);
114
- loadedValuesRef.current = [];
115
- lastFetchedSearchTermRef.current = null;
116
- initialLoadCompleteRef.current = true;
117
- return;
118
- }
119
- let active = true;
120
- setLoading(true);
121
- isInitialPopulationActive.current = true;
122
- loadedValuesRef.current = formValues;
123
- initialLoadCompleteRef.current = true;
124
- fetchData({ Query: null, SelectedValue: formValues }, (results) => {
125
- if (active) {
126
- const fetchedOptions = results || [];
127
- setSelectedOptions([...fetchedOptions]);
128
- setOptions(fetchedOptions);
129
- }
130
- setLoading(false);
131
- isInitialPopulationActive.current = false;
132
- });
133
- return () => {
134
- active = false;
135
- };
136
- }, [field.value, fetchData]);
137
- useEffect(() => {
138
- if (isInitialPopulationActive.current || !initialLoadCompleteRef.current) {
139
- return;
140
- }
141
- if (!inputValue) {
142
- if (selectedOptionsRef.current.length === 0) {
143
- setOptions([]);
144
- } else {
145
- setOptions(selectedOptionsRef.current);
146
- }
147
- lastFetchedSearchTermRef.current = null;
148
- return;
149
- }
150
- if (inputValue === lastFetchedSearchTermRef.current) {
151
- return;
152
- }
153
- let active = true;
154
- setLoading(true);
155
- fetchData({ Query: inputValue, SelectedValue: null }, (searchResults) => {
156
- if (active) {
157
- const results = searchResults || [];
158
- const currentSelected = selectedOptionsRef.current;
159
- const selectedOptionIds = new Set(
160
- currentSelected.map((opt) => getOptionValue(opt))
161
- );
162
- const combined = [...currentSelected];
163
- results.forEach((result) => {
164
- if (!selectedOptionIds.has(getOptionValue(result))) {
165
- combined.push(result);
166
- }
167
- });
168
- setOptions(combined);
169
- lastFetchedSearchTermRef.current = inputValue;
170
- }
171
- setLoading(false);
172
- });
173
- return () => {
174
- active = false;
175
- };
176
- }, [inputValue, fetchData, getOptionValue]);
177
- const handleChange = (_, newSelectedOptions) => {
178
- setSelectedOptions(newSelectedOptions);
179
- const newValues = newSelectedOptions.map((c) => c[valueField]);
180
- field.onChange(newValues.length === 0 ? null : newValues);
181
- loadedValuesRef.current = newValues;
182
- setOptions(newSelectedOptions);
183
- setInputValue("");
184
- lastFetchedSearchTermRef.current = null;
185
- };
186
- const isDisabled = useMemo(() => {
187
- return disabled ?? false;
188
- }, [disabled]);
189
- return /* @__PURE__ */ jsx(
190
- Autocomplete,
191
- {
192
- multiple: true,
193
- loading,
194
- getOptionLabel,
195
- isOptionEqualToValue: (option, val) => getOptionValue(option) === getOptionValue(val),
196
- options,
197
- value: selectedOptions,
198
- disabled,
199
- filterSelectedOptions: true,
200
- filterOptions: (x) => x,
201
- noOptionsText: "Type Something...",
202
- onChange: handleChange,
203
- sx: {
204
- "&.Mui-disabled": {
205
- cursor: "not-allowed !important"
206
- },
207
- "& .MuiInputBase-root.Mui-disabled": {
208
- backgroundColor: theme.palette.action.disabledBackground,
209
- cursor: "not-allowed !important"
210
- },
211
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
212
- cursor: "not-allowed !important"
213
- },
214
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
215
- borderColor: error ? "red" : void 0
216
- },
217
- "& .MuiFilledInput-root.Mui-disabled": {
218
- borderColor: error ? "red" : void 0
219
- }
220
- },
221
- onInputChange: (_, newInputValue) => setInputValue(newInputValue),
222
- renderInput: (params) => /* @__PURE__ */ jsx(
223
- TextField,
224
- {
225
- ...params,
226
- label,
227
- error: !!error,
228
- helperText: error ? error.message : "",
229
- placeholder,
230
- InputProps: {
231
- ...params.InputProps,
232
- endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
233
- loading ? /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: 20 }) : null,
234
- params.InputProps.endAdornment
235
- ] })
236
- },
237
- variant: variant ? variant : "outlined"
238
- }
239
- ),
240
- renderOption: (props2, option, state) => {
241
- const { key, ...optionProps } = props2;
242
- const optionLabel = getOptionLabel(option);
243
- const matches = match(optionLabel, state.inputValue, {
244
- insideWords: true
245
- });
246
- const parts = parse(optionLabel, matches);
247
- return /* @__PURE__ */ jsx("li", { ...optionProps, children: /* @__PURE__ */ jsx("div", { children: parts.map((part, index) => /* @__PURE__ */ jsx(
248
- "span",
249
- {
250
- style: {
251
- fontWeight: part.highlight ? 700 : 400
252
- },
253
- children: part.text
254
- },
255
- index
256
- )) }) }, key);
257
- },
258
- ...rest
259
- }
260
- );
261
- };
262
- var AsyncSelectMultiElement2 = ({
263
- gridProps,
264
- ...props
265
- }) => {
266
- if (gridProps) {
267
- return /* @__PURE__ */ jsx(
268
- Grid,
269
- {
270
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
271
- children: /* @__PURE__ */ jsx(
272
- Component,
273
- {
274
- ...props
275
- }
276
- )
277
- }
278
- );
279
- }
280
- return /* @__PURE__ */ jsx(Component, { ...props });
281
- };
282
- AsyncSelectMultiElement2.displayName = "AsyncSelectMulti";
283
-
284
- // src/wrappers/CheckboxElement/CheckboxElement.tsx
285
- import {
286
- Checkbox,
287
- FormControl,
288
- FormControlLabel,
289
- FormGroup,
290
- FormHelperText,
291
- Grid as Grid2
292
- } from "@mui/material";
293
- import { useController as useController2 } from "react-hook-form";
294
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
295
- var Component2 = function CheckboxElement(props) {
296
- const {
297
- name,
298
- control,
299
- label,
300
- labelProps,
301
- helperText,
302
- parseError,
303
- transform,
304
- disabled,
305
- onChange: customOnChange,
306
- ...rest
307
- } = props;
308
- const {
309
- field,
310
- fieldState: { error }
311
- } = useController2({
312
- name,
313
- control,
314
- disabled
315
- });
316
- if (field.value == null || field.value == void 0) {
317
- field.onChange(false);
318
- }
319
- const customOutputTransform = transform?.output;
320
- const { value, onChange } = useTransform({
321
- value: field.value,
322
- onChange: field.onChange,
323
- transform: {
324
- input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
325
- output: typeof customOutputTransform === "function" ? (eventOrValue, _value) => {
326
- const event = eventOrValue;
327
- const checked = _value;
328
- return customOutputTransform(event, checked);
329
- } : (eventOrValue, _value) => {
330
- const checked = _value;
331
- return checked;
332
- }
333
- }
334
- });
335
- const handleChange = (event, checked) => {
336
- onChange(event, checked);
337
- if (typeof customOnChange === "function") {
338
- customOnChange(event, checked);
339
- }
340
- };
341
- const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
342
- return /* @__PURE__ */ jsxs2(FormControl, { error: !!error, disabled, children: [
343
- /* @__PURE__ */ jsx2(FormGroup, { row: true, children: /* @__PURE__ */ jsx2(
344
- FormControlLabel,
345
- {
346
- label: label || "",
347
- ...labelProps,
348
- disabled,
349
- control: /* @__PURE__ */ jsx2(
350
- Checkbox,
351
- {
352
- ...rest,
353
- color: rest.color || "primary",
354
- checked: value,
355
- disabled,
356
- onChange: handleChange,
357
- ref: field.ref
358
- }
359
- )
360
- }
361
- ) }),
362
- (displayError || helperText) && /* @__PURE__ */ jsx2(FormHelperText, { error: !!error, children: displayError || helperText })
363
- ] });
364
- };
365
- var CheckboxElement2 = ({
366
- gridProps = {},
367
- ...props
368
- }) => {
369
- return /* @__PURE__ */ jsx2(Grid2, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx2(Component2, { ...props }) });
370
- };
371
-
372
- // src/wrappers/CheckboxGroup/CheckboxGroup.tsx
373
- import {
374
- Checkbox as Checkbox2,
375
- FormControl as FormControl2,
376
- FormControlLabel as FormControlLabel2,
377
- FormGroup as FormGroup2,
378
- FormHelperText as FormHelperText2,
379
- FormLabel,
380
- Grid as Grid3
381
- } from "@mui/material";
382
- import { useCallback as useCallback2 } from "react";
383
- import { useController as useController3 } from "react-hook-form";
384
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
385
- var Component3 = function CheckboxGroup(props) {
386
- const {
387
- name,
388
- control,
389
- label,
390
- required,
391
- formLabelProps,
392
- labelProps,
393
- labelKey = "Label",
394
- valueKey = "Value",
395
- options,
396
- ...rest
397
- } = props;
398
- const {
399
- field,
400
- fieldState: { error }
401
- } = useController3({
402
- name,
403
- control,
404
- disabled: rest.disabled
405
- });
406
- const selectedValuesAsString = (Array.isArray(field.value) ? field.value : []).map(String);
407
- const handleChange = useCallback2(
408
- (event) => {
409
- const changedValueString = event.target.value;
410
- const isChecked = event.target.checked;
411
- const newSelectedValuesString = isChecked ? [...selectedValuesAsString, changedValueString] : selectedValuesAsString.filter((v) => v !== changedValueString);
412
- const optionsAreNumeric = options.length > 0 && typeof options[0][valueKey] === "number";
413
- if (optionsAreNumeric) {
414
- const newValuesAsNumbers = newSelectedValuesString.map((v) => parseInt(v, 10)).filter((v) => !isNaN(v));
415
- field.onChange(newValuesAsNumbers);
416
- } else {
417
- field.onChange(newSelectedValuesString);
418
- }
419
- },
420
- [field, options, valueKey, selectedValuesAsString]
421
- );
422
- return /* @__PURE__ */ jsxs3(FormControl2, { error: !!error, children: [
423
- label && /* @__PURE__ */ jsx3(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
424
- /* @__PURE__ */ jsx3(FormGroup2, { row: true, children: options && options.map((option) => /* @__PURE__ */ jsx3(
425
- FormControlLabel2,
426
- {
427
- label: option[labelKey],
428
- ...labelProps,
429
- control: /* @__PURE__ */ jsx3(
430
- Checkbox2,
431
- {
432
- ...rest,
433
- color: rest.color || "primary",
434
- value: option[valueKey],
435
- checked: selectedValuesAsString.includes(
436
- String(option[valueKey])
437
- ),
438
- onChange: handleChange
439
- }
440
- )
441
- },
442
- `${option[valueKey]}`
443
- )) }),
444
- error && /* @__PURE__ */ jsx3(FormHelperText2, { error: !!error, children: error.message })
445
- ] });
446
- };
447
- var CheckboxGroupElement = ({
448
- gridProps = {},
449
- ...props
450
- }) => {
451
- return /* @__PURE__ */ jsx3(Grid3, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx3(Component3, { ...props }) });
452
- };
453
- CheckboxGroupElement.displayName = "CheckboxGroup";
454
-
455
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
456
- import { Grid as Grid4 } from "@mui/material";
457
- import { forwardRef as forwardRef2 } from "react";
458
-
459
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
460
- import { useForkRef } from "@mui/material";
461
- import { DatePicker } from "@mui/x-date-pickers";
462
- import { forwardRef, useCallback as useCallback4, useMemo as useMemo5 } from "react";
463
- import { useController as useController4 } from "react-hook-form";
464
-
465
- // src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
466
- import { useLocalizationContext } from "@mui/x-date-pickers/internals";
467
- import { useCallback as useCallback3, useMemo as useMemo2 } from "react";
468
- function readDatePickerValueAsDate(adapter, value) {
469
- if (value === null || value === void 0) {
470
- return null;
471
- }
472
- if (typeof value === "string") {
473
- if (value === "") {
474
- return null;
475
- }
476
- const parsedDate = adapter.utils.date(value);
477
- return parsedDate;
478
- }
479
- return value;
480
- }
481
- function useDatePickerValue(options) {
482
- const { field, transform } = options;
483
- const adapter = useLocalizationContext();
484
- const value = useMemo2(() => {
485
- if (typeof transform?.input === "function") {
486
- return transform.input(field.value);
487
- }
488
- return readDatePickerValueAsDate(adapter, field.value);
489
- }, [field.value, transform?.input, adapter]);
490
- const onChange = useCallback3(
491
- (newValue, context) => {
492
- if (typeof transform?.output === "function") {
493
- const transformedValue = transform.output(newValue, context);
494
- field.onChange(transformedValue);
495
- } else {
496
- field.onChange(newValue);
497
- }
498
- },
499
- // eslint-disable-next-line react-hooks/exhaustive-deps
500
- [field.onChange, transform?.output]
501
- );
502
- return {
503
- value,
504
- onChange
505
- };
506
- }
507
-
508
- // src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
509
- import { useMemo as useMemo3 } from "react";
510
- var DEFAULT_ERROR_MESSAGES = {
511
- invalidDate: "Please enter a valid date",
512
- minDate: "Date must be after the minimum allowed date",
513
- maxDate: "Date must be before the maximum allowed date",
514
- disabledDate: "This date is not allowed",
515
- required: "This field is required"
516
- };
517
- function useDatePickerValidation(options) {
518
- const { fieldState, validation, parseError, value } = options;
519
- const validationResult = useMemo3(() => {
520
- const { error: fieldError, invalid } = fieldState;
521
- let currentError = fieldError;
522
- if (!fieldError && value && validation) {
523
- const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
524
- if (minDate && value < minDate) {
525
- currentError = {
526
- type: "minDate",
527
- message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
528
- };
529
- } else if (maxDate && value > maxDate) {
530
- currentError = {
531
- type: "maxDate",
532
- message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
533
- };
534
- } else if (shouldDisableDate && shouldDisableDate(value)) {
535
- currentError = {
536
- type: "disabledDate",
537
- message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
538
- };
539
- }
540
- }
541
- const hasError = Boolean(currentError);
542
- return {
543
- hasError,
544
- error: currentError,
545
- invalid: invalid || hasError
546
- };
547
- }, [fieldState, validation, value]);
548
- const errorMessage = useMemo3(() => {
549
- if (!validationResult.error) {
550
- return null;
551
- }
552
- if (parseError) {
553
- return parseError(validationResult.error);
554
- }
555
- if (typeof validationResult.error === "string") {
556
- return validationResult.error;
557
- }
558
- if ("message" in validationResult.error && validationResult.error.message) {
559
- return validationResult.error.message;
560
- }
561
- if ("type" in validationResult.error) {
562
- const errorType = validationResult.error.type;
563
- switch (errorType) {
564
- case "required":
565
- return DEFAULT_ERROR_MESSAGES.required;
566
- case "minDate":
567
- return DEFAULT_ERROR_MESSAGES.minDate;
568
- case "maxDate":
569
- return DEFAULT_ERROR_MESSAGES.maxDate;
570
- case "disabledDate":
571
- return DEFAULT_ERROR_MESSAGES.disabledDate;
572
- case "invalidDate":
573
- default:
574
- return DEFAULT_ERROR_MESSAGES.invalidDate;
575
- }
576
- }
577
- return DEFAULT_ERROR_MESSAGES.invalidDate;
578
- }, [validationResult.error, parseError]);
579
- return {
580
- ...validationResult,
581
- errorMessage
582
- };
583
- }
584
-
585
- // src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
586
- import { useTheme as useTheme2 } from "@mui/material";
587
- import { useMemo as useMemo4 } from "react";
588
- function useDatePickerStyles(options = {}) {
589
- const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
590
- const theme = useTheme2();
591
- const computedSx = useMemo4(() => {
592
- const baseStyles = {
593
- // Input field styling
594
- "& .MuiOutlinedInput-root": {
595
- backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
596
- // Transition for smooth state changes
597
- transition: theme.transitions.create([
598
- "background-color",
599
- "border-color",
600
- "color"
601
- ], {
602
- duration: theme.transitions.duration.short
603
- }),
604
- // Error state styling
605
- ...hasError && {
606
- borderColor: theme.palette.error.main,
607
- "&:hover": {
608
- borderColor: theme.palette.error.main
609
- },
610
- "&.Mui-focused": {
611
- borderColor: theme.palette.error.main,
612
- boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
613
- // 25 is 15% opacity in hex
614
- }
615
- },
616
- // Loading state styling
617
- ...loading && {
618
- opacity: 0.7,
619
- pointerEvents: "none"
620
- }
621
- },
622
- // Input element styling
623
- "& .MuiInputBase-input": {
624
- cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
625
- // Read-only specific styling
626
- ...textReadOnly && !disabled && {
627
- cursor: "pointer",
628
- userSelect: "none",
629
- caretColor: "transparent"
630
- // Hide text cursor in read-only mode
631
- },
632
- // Loading state
633
- ...loading && {
634
- cursor: "wait"
635
- }
636
- },
637
- // Required field asterisk styling
638
- "& .MuiInputLabel-asterisk": {
639
- color: theme.palette.error.main,
640
- fontSize: "1.2em"
641
- },
642
- // Label styling with better contrast
643
- "& .MuiInputLabel-root": {
644
- color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
645
- // Ensure proper contrast for disabled state
646
- ...disabled && {
647
- color: theme.palette.text.disabled
648
- }
649
- },
650
- // Helper text styling
651
- "& .MuiFormHelperText-root": {
652
- marginLeft: theme.spacing(1),
653
- marginRight: theme.spacing(1),
654
- // Error state
655
- ...hasError && {
656
- color: theme.palette.error.main
657
- }
658
- },
659
- // Calendar icon styling
660
- "& .MuiInputAdornment-root": {
661
- color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
662
- },
663
- // Focus ring for accessibility
664
- "& .MuiOutlinedInput-root.Mui-focused": {
665
- outline: `2px solid ${theme.palette.primary.main}50`,
666
- // 50 is 31% opacity
667
- outlineOffset: "2px"
668
- },
669
- // Enhanced contrast for dark themes
670
- ...theme.palette.mode === "dark" && {
671
- "& .MuiOutlinedInput-root": {
672
- borderWidth: 2
673
- }
674
- }
675
- };
676
- return customSx ? [baseStyles, customSx] : baseStyles;
677
- }, [
678
- theme,
679
- disabled,
680
- hasError,
681
- loading,
682
- textReadOnly,
683
- customSx
684
- ]);
685
- const className = useMemo4(() => {
686
- const classes = [];
687
- if (disabled) classes.push("DatePickerElement--disabled");
688
- if (hasError) classes.push("DatePickerElement--error");
689
- if (loading) classes.push("DatePickerElement--loading");
690
- if (textReadOnly) classes.push("DatePickerElement--readOnly");
691
- return classes.length > 0 ? classes.join(" ") : void 0;
692
- }, [disabled, hasError, loading, textReadOnly]);
693
- return {
694
- sx: computedSx,
695
- className
696
- };
697
- }
698
-
699
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
700
- import { jsx as jsx4 } from "react/jsx-runtime";
701
- var DatePickerElementCore = forwardRef(
702
- (props, ref) => {
703
- const {
704
- name,
705
- required = false,
706
- control,
707
- parseError,
708
- transform,
709
- validation,
710
- label,
711
- placeholder,
712
- textReadOnly = false,
713
- helperText,
714
- inputProps = {},
715
- slotProps = {},
716
- datePickerProps = {},
717
- variant = "outlined",
718
- loading = false,
719
- LoadingComponent,
720
- ...restProps
721
- } = props;
722
- const {
723
- disabled,
724
- inputRef: externalInputRef,
725
- onClose,
726
- ...restDatePickerProps
727
- } = datePickerProps;
728
- const { field, fieldState } = useController4({
729
- name,
730
- control,
731
- defaultValue: null
732
- // Let react-hook-form handle the default value typing
733
- });
734
- const { value, onChange: onValueChange } = useDatePickerValue({
735
- field,
736
- transform
737
- });
738
- const { hasError, errorMessage, invalid } = useDatePickerValidation({
739
- fieldState,
740
- validation,
741
- parseError,
742
- value
743
- });
744
- const { className } = useDatePickerStyles({
745
- disabled,
746
- hasError,
747
- loading,
748
- textReadOnly
749
- });
750
- const handleInputRef = useForkRef(field.ref, externalInputRef);
751
- const handleChange = useCallback4(
752
- (newValue, context) => {
753
- onValueChange(newValue, context);
754
- },
755
- [onValueChange]
756
- );
757
- const handleClose = useCallback4(
758
- (...args) => {
759
- field.onBlur();
760
- if (onClose) {
761
- onClose(...args);
762
- }
763
- },
764
- // eslint-disable-next-line react-hooks/exhaustive-deps
765
- [field.onBlur, onClose]
766
- );
767
- const handleTextFieldBlur = useCallback4(
768
- (event) => {
769
- field.onBlur();
770
- if (typeof inputProps.onBlur === "function") {
771
- inputProps.onBlur(event);
772
- }
773
- },
774
- // eslint-disable-next-line react-hooks/exhaustive-deps
775
- [field.onBlur, inputProps.onBlur]
776
- );
777
- const memoizedSlotProps = useMemo5(
778
- () => ({
779
- ...slotProps,
780
- actionBar: {
781
- actions: ["clear", "today", "cancel", "accept"],
782
- ...slotProps.actionBar
783
- },
784
- textField: {
785
- ...inputProps,
786
- required,
787
- placeholder,
788
- fullWidth: true,
789
- variant,
790
- onBlur: handleTextFieldBlur,
791
- error: hasError,
792
- helperText: hasError ? errorMessage : helperText,
793
- inputProps: {
794
- readOnly: textReadOnly,
795
- "aria-invalid": invalid,
796
- "aria-describedby": hasError ? `${name}-error` : void 0,
797
- ...inputProps.inputProps
798
- },
799
- // Add loading indicator if provided
800
- ...loading && LoadingComponent && {
801
- InputProps: {
802
- endAdornment: /* @__PURE__ */ jsx4(LoadingComponent, {}),
803
- ...inputProps.InputProps
804
- }
805
- },
806
- ...slotProps.textField
807
- }
808
- }),
809
- [
810
- slotProps,
811
- inputProps,
812
- required,
813
- placeholder,
814
- variant,
815
- handleTextFieldBlur,
816
- hasError,
817
- errorMessage,
818
- helperText,
819
- textReadOnly,
820
- invalid,
821
- name,
822
- loading,
823
- LoadingComponent
824
- ]
825
- );
826
- return /* @__PURE__ */ jsx4(
827
- DatePicker,
828
- {
829
- ...restProps,
830
- ...restDatePickerProps,
831
- ref,
832
- name,
833
- value,
834
- onChange: handleChange,
835
- onClose: handleClose,
836
- inputRef: handleInputRef,
837
- label,
838
- disabled,
839
- className,
840
- slotProps: memoizedSlotProps,
841
- "aria-invalid": invalid,
842
- "aria-describedby": hasError ? `${name}-error` : void 0
843
- }
844
- );
845
- }
846
- );
847
- DatePickerElementCore.displayName = "DatePickerElementCore";
848
-
849
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
850
- import { jsx as jsx5 } from "react/jsx-runtime";
851
- var DatePickerElement = forwardRef2((props, ref) => {
852
- const {
853
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
854
- ...coreProps
855
- } = props;
856
- if (gridProps === false) {
857
- return /* @__PURE__ */ jsx5(
858
- DatePickerElementCore,
859
- {
860
- ref,
861
- ...coreProps
862
- }
863
- );
864
- }
865
- return /* @__PURE__ */ jsx5(
866
- Grid4,
867
- {
868
- ref,
869
- ...gridProps,
870
- children: /* @__PURE__ */ jsx5(
871
- DatePickerElementCore,
872
- {
873
- ...coreProps
874
- }
875
- )
876
- }
877
- );
878
- });
879
- DatePickerElement.displayName = "DatePickerElement";
880
-
881
- // src/wrappers/DatePickerElement/utils.ts
882
- function isValidDate(value) {
883
- if (value === null || value === void 0) {
884
- return false;
885
- }
886
- if (value instanceof Date) {
887
- return !isNaN(value.getTime());
888
- }
889
- if (typeof value === "object" && value !== null) {
890
- if ("isValid" in value && typeof value.isValid === "function") {
891
- return value.isValid();
892
- }
893
- if ("isValid" in value && typeof value.isValid === "boolean") {
894
- return value.isValid;
895
- }
896
- }
897
- return false;
898
- }
899
- function isParsableDateString(value) {
900
- if (typeof value !== "string" || value === "") {
901
- return false;
902
- }
903
- const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
904
- if (isoDateRegex.test(value)) {
905
- return true;
906
- }
907
- const parsed = new Date(value);
908
- return !isNaN(parsed.getTime());
909
- }
910
- function createDateInputTransform(adapter) {
911
- return (value) => {
912
- if (value === null || value === void 0) {
913
- return null;
914
- }
915
- if (typeof value === "string") {
916
- if (value === "") {
917
- return null;
918
- }
919
- try {
920
- const parsed = adapter.utils.date(value);
921
- return isValidDate(parsed) ? parsed : null;
922
- } catch {
923
- return null;
924
- }
925
- }
926
- if (isValidDate(value)) {
927
- return value;
928
- }
929
- return null;
930
- };
931
- }
932
- function createDateOutputTransform(format) {
933
- return (value) => {
934
- if (value === null || value === void 0) {
935
- return null;
936
- }
937
- if (!isValidDate(value)) {
938
- return null;
939
- }
940
- if (!format) {
941
- return value;
942
- }
943
- try {
944
- if (value instanceof Date) {
945
- if (format === "iso") {
946
- return value.toISOString();
947
- }
948
- if (format === "date-only") {
949
- return value.toISOString().split("T")[0];
950
- }
951
- }
952
- if (typeof value.format === "function") {
953
- return value.format(format);
954
- }
955
- if (typeof value.format === "function") {
956
- return value.format(format);
957
- }
958
- if (typeof value.toFormat === "function") {
959
- return value.toFormat(format);
960
- }
961
- return value;
962
- } catch {
963
- return null;
964
- }
965
- };
966
- }
967
- function createDefaultDatePickerConfig() {
968
- return {
969
- // Default slot props for consistent behavior
970
- slotProps: {
971
- actionBar: {
972
- actions: ["clear", "today", "cancel", "accept"]
973
- },
974
- textField: {
975
- fullWidth: true,
976
- variant: "outlined"
977
- }
978
- },
979
- // Default grid props for layout consistency
980
- gridProps: {
981
- size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
982
- },
983
- // Default validation configuration
984
- validation: {
985
- errorMessages: {
986
- invalidDate: "Please enter a valid date",
987
- minDate: "Date must be after the minimum allowed date",
988
- maxDate: "Date must be before the maximum allowed date",
989
- disabledDate: "This date is not allowed"
990
- }
991
- }
992
- };
993
- }
994
- function extractErrorMessage(error) {
995
- if (error === null || error === void 0) {
996
- return "";
997
- }
998
- if (typeof error === "string") {
999
- return error;
1000
- }
1001
- if (typeof error === "object" && error !== null) {
1002
- if ("message" in error && typeof error.message === "string") {
1003
- return error.message;
1004
- }
1005
- if ("type" in error && typeof error.type === "string") {
1006
- const errorType = error.type;
1007
- switch (errorType) {
1008
- case "invalidDate":
1009
- return "Please enter a valid date";
1010
- case "minDate":
1011
- return "Date is too early";
1012
- case "maxDate":
1013
- return "Date is too late";
1014
- case "disabledDate":
1015
- return "This date is not available";
1016
- default:
1017
- return "Invalid date selection";
1018
- }
1019
- }
1020
- }
1021
- return "Invalid input";
1022
- }
1023
- function createStableKey(config) {
1024
- try {
1025
- return JSON.stringify(config, (key, value) => {
1026
- if (typeof value === "object" && value !== null && !Array.isArray(value)) {
1027
- const sorted = {};
1028
- Object.keys(value).sort().forEach((k) => {
1029
- sorted[k] = value[k];
1030
- });
1031
- return sorted;
1032
- }
1033
- return value;
1034
- });
1035
- } catch {
1036
- return Object.keys(config).sort().join("-");
1037
- }
1038
- }
1039
-
1040
- // src/wrappers/PasswordElement/PasswordElement.tsx
1041
- import Visibility from "@mui/icons-material/Visibility";
1042
- import VisibilityOff from "@mui/icons-material/VisibilityOff";
1043
- import {
1044
- IconButton,
1045
- InputAdornment,
1046
- TextField as TextField2,
1047
- useForkRef as useForkRef2,
1048
- Grid as Grid5
1049
- } from "@mui/material";
1050
- import { useState as useState2 } from "react";
1051
- import { useController as useController5 } from "react-hook-form";
1052
- import { jsx as jsx6 } from "react/jsx-runtime";
1053
- var Component4 = function PasswordEl(props) {
1054
- const {
1055
- iconColor,
1056
- renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx6(Visibility, {}) : /* @__PURE__ */ jsx6(VisibilityOff, {}),
1057
- slotProps,
1058
- name,
1059
- control,
1060
- inputRef,
1061
- onBlur,
1062
- ...rest
1063
- } = props;
1064
- const [password, setPassword] = useState2(true);
1065
- const endAdornment = /* @__PURE__ */ jsx6(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx6(
1066
- IconButton,
1067
- {
1068
- onMouseDown: (e) => e.preventDefault(),
1069
- onClick: () => setPassword(!password),
1070
- tabIndex: -1,
1071
- color: iconColor ?? "default",
1072
- children: renderIcon(password)
1073
- }
1074
- ) });
1075
- const {
1076
- field,
1077
- fieldState: { error }
1078
- } = useController5({
1079
- name,
1080
- control
1081
- });
1082
- const handleInputRef = useForkRef2(field.ref, inputRef);
1083
- return /* @__PURE__ */ jsx6(
1084
- TextField2,
1085
- {
1086
- ...rest,
1087
- inputRef: handleInputRef,
1088
- type: password ? "password" : "text",
1089
- value: field.value ?? "",
1090
- fullWidth: true,
1091
- variant: rest.variant ?? "outlined",
1092
- onChange: (event) => {
1093
- field.onChange(event);
1094
- if (typeof rest.onChange === "function") {
1095
- rest.onChange(event);
1096
- }
1097
- },
1098
- onBlur: (event) => {
1099
- field.onBlur();
1100
- if (typeof onBlur === "function") {
1101
- onBlur(event);
1102
- }
1103
- },
1104
- ...typeof slotProps === "undefined" ? {
1105
- InputProps: {
1106
- endAdornment
1107
- }
1108
- } : {
1109
- slotProps: {
1110
- ...slotProps,
1111
- input: {
1112
- endAdornment,
1113
- ...slotProps?.input
1114
- }
1115
- }
1116
- },
1117
- error: !!error,
1118
- helperText: error ? error.message : ""
1119
- }
1120
- );
1121
- };
1122
- var PasswordElement = ({
1123
- gridProps = {},
1124
- ...props
1125
- }) => {
1126
- return /* @__PURE__ */ jsx6(Grid5, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx6(Component4, { ...props }) });
1127
- };
1128
-
1129
- // src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
1130
- import {
1131
- FormControl as FormControl3,
1132
- FormControlLabel as FormControlLabel3,
1133
- FormHelperText as FormHelperText3,
1134
- FormLabel as FormLabel2,
1135
- Radio,
1136
- RadioGroup,
1137
- Grid as Grid6
1138
- } from "@mui/material";
1139
- import { useController as useController6 } from "react-hook-form";
1140
- import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
1141
- var Component5 = function RadioButtonGroup(props) {
1142
- const {
1143
- options,
1144
- label,
1145
- name,
1146
- labelKey = "label",
1147
- valueKey = "id",
1148
- disabledKey = "disabled",
1149
- required,
1150
- emptyOptionLabel,
1151
- returnObject,
1152
- row = true,
1153
- control,
1154
- type,
1155
- labelProps,
1156
- disabled,
1157
- formLabelProps,
1158
- radioProps,
1159
- transform,
1160
- ...rest
1161
- } = props;
1162
- const {
1163
- field,
1164
- fieldState: { error }
1165
- } = useController6({
1166
- name,
1167
- disabled,
1168
- control
1169
- });
1170
- const { value, onChange } = useTransform({
1171
- value: field.value,
1172
- onChange: field.onChange,
1173
- transform: {
1174
- input: typeof transform?.input === "function" ? transform.input : (value2) => {
1175
- return value2 || "";
1176
- },
1177
- output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
1178
- if (value2 && type === "number") {
1179
- return Number(value2);
1180
- }
1181
- if (value2 && type === "boolean") {
1182
- return Boolean(value2);
1183
- }
1184
- return value2;
1185
- }
1186
- }
1187
- });
1188
- const onRadioChange = (event, radioValue) => {
1189
- const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
1190
- onChange(event, returnValue);
1191
- if (typeof rest.onChange === "function") {
1192
- rest.onChange(returnValue);
1193
- }
1194
- };
1195
- return /* @__PURE__ */ jsxs4(FormControl3, { error: !!error, children: [
1196
- label && /* @__PURE__ */ jsx7(FormLabel2, { ...formLabelProps, required, error: !!error, children: label }),
1197
- /* @__PURE__ */ jsxs4(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
1198
- emptyOptionLabel && /* @__PURE__ */ jsx7(
1199
- FormControlLabel3,
1200
- {
1201
- ...labelProps,
1202
- control: /* @__PURE__ */ jsx7(
1203
- Radio,
1204
- {
1205
- ...radioProps,
1206
- checked: !value
1207
- }
1208
- ),
1209
- label: emptyOptionLabel,
1210
- value: ""
1211
- }
1212
- ),
1213
- options.map((option) => {
1214
- const optionKey = option[valueKey];
1215
- const optionDisabled = option[disabledKey] || false;
1216
- let val = returnObject ? value?.[valueKey] : value;
1217
- if (type === "number" && val !== void 0) {
1218
- val = Number(val);
1219
- } else if (type === "boolean" && val !== void 0) {
1220
- val = Boolean(val);
1221
- }
1222
- const isChecked = val === optionKey;
1223
- return /* @__PURE__ */ jsx7(
1224
- FormControlLabel3,
1225
- {
1226
- ...labelProps,
1227
- control: /* @__PURE__ */ jsx7(
1228
- Radio,
1229
- {
1230
- ...radioProps,
1231
- disabled: disabled || optionDisabled,
1232
- checked: isChecked
1233
- }
1234
- ),
1235
- value: optionKey,
1236
- label: option[labelKey]
1237
- },
1238
- String(optionKey)
1239
- );
1240
- })
1241
- ] }),
1242
- error && /* @__PURE__ */ jsx7(FormHelperText3, { children: error.message })
1243
- ] });
1244
- };
1245
- var RadioButtonGroup2 = ({
1246
- gridProps = {},
1247
- ...props
1248
- }) => {
1249
- return /* @__PURE__ */ jsx7(Grid6, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx7(
1250
- Component5,
1251
- {
1252
- ...props
1253
- }
1254
- ) });
1255
- };
1256
- RadioButtonGroup2.displayName = "RadioButtonGroup";
1257
-
1258
- // src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
1259
- import { Grid as Grid7, TextField as TextField3, Autocomplete as Autocomplete2 } from "@mui/material";
1260
- import { useTheme as useTheme3 } from "@mui/material/styles";
1261
- import { useRef as useRef2, useEffect as useEffect2, useCallback as useCallback5, useMemo as useMemo6 } from "react";
1262
- import { useController as useController7 } from "react-hook-form";
1263
- import { jsx as jsx8 } from "react/jsx-runtime";
1264
- var Component6 = function SelectCascadeElement(props) {
1265
- const theme = useTheme3();
1266
- const {
1267
- labelField = "Label",
1268
- valueField = "Value",
1269
- name,
1270
- onBlur,
1271
- onChange,
1272
- disabled,
1273
- options: optionsInput,
1274
- control,
1275
- loading = false,
1276
- placeholder,
1277
- label,
1278
- dependsOn,
1279
- textFieldProps = {},
1280
- variant,
1281
- isNullable = false,
1282
- disableDefaultSelected = false,
1283
- ...rest
1284
- } = props;
1285
- const { required, ...restTextProps } = textFieldProps;
1286
- const options = useMemo6(() => optionsInput || [], [optionsInput]);
1287
- const getOptionKey = useCallback5(
1288
- (option) => {
1289
- if (typeof option === "string" || typeof option === "number")
1290
- return option;
1291
- const key = option ? option[valueField] : void 0;
1292
- return key !== void 0 && key !== null ? String(key) : "";
1293
- },
1294
- [valueField]
1295
- );
1296
- const getOptionLabel = useCallback5(
1297
- (option) => {
1298
- if (typeof option === "string") return option;
1299
- return option ? String(option[labelField]) : "";
1300
- },
1301
- [labelField]
1302
- );
1303
- const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
1304
- const {
1305
- field,
1306
- fieldState: { error }
1307
- } = useController7({
1308
- name,
1309
- control
1310
- });
1311
- const { field: dependentField } = useController7({
1312
- name: dependsOn,
1313
- control
1314
- });
1315
- const parentValueRef = useRef2(dependentField.value);
1316
- useEffect2(() => {
1317
- if (parentValueRef.current !== dependentField.value) {
1318
- field.onChange(null);
1319
- parentValueRef.current = dependentField.value;
1320
- }
1321
- }, [dependentField.value, field]);
1322
- useEffect2(() => {
1323
- if (disableDefaultSelected && options.length === 1 && field.value == null) {
1324
- field.onChange(null);
1325
- }
1326
- }, [disableDefaultSelected, options.length]);
1327
- useEffect2(() => {
1328
- const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
1329
- if (options.length === 1 && !hasValue && !disableDefaultSelected) {
1330
- if (disabled) return;
1331
- field.onChange(getOptionKey(options[0]));
1332
- }
1333
- }, [
1334
- options,
1335
- disabled,
1336
- getOptionKey,
1337
- field.onChange,
1338
- dependentField.value,
1339
- disableDefaultSelected
1340
- ]);
1341
- const isDisabled = useMemo6(() => {
1342
- if (disabled) return true;
1343
- if (dependentField.value === null || dependentField.value === void 0 || dependentField.value === "")
1344
- return true;
1345
- if (options.length === 1 && !isNullable && !disableDefaultSelected) {
1346
- return true;
1347
- }
1348
- return false;
1349
- }, [
1350
- disabled,
1351
- dependentField.value,
1352
- options.length,
1353
- isNullable,
1354
- disableDefaultSelected
1355
- ]);
1356
- return /* @__PURE__ */ jsx8(
1357
- Autocomplete2,
1358
- {
1359
- ...rest,
1360
- value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
1361
- loading,
1362
- options,
1363
- getOptionKey,
1364
- getOptionLabel,
1365
- isOptionEqualToValue,
1366
- ref: field.ref,
1367
- disabled: isDisabled,
1368
- sx: {
1369
- "&.Mui-disabled": {
1370
- cursor: "not-allowed !important"
1371
- },
1372
- "& .MuiInputBase-root.Mui-disabled": {
1373
- backgroundColor: theme.palette.action.disabledBackground,
1374
- cursor: "not-allowed !important"
1375
- },
1376
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1377
- cursor: "not-allowed !important"
1378
- },
1379
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1380
- borderColor: error ? "red" : void 0
1381
- },
1382
- "& .MuiFilledInput-root.Mui-disabled": {
1383
- borderColor: error ? "red" : void 0
1384
- }
1385
- },
1386
- onChange: (event, newValue, reason) => {
1387
- field.onChange(newValue ? getOptionKey(newValue) : null);
1388
- if (onChange && typeof onChange === "function") {
1389
- onChange(event, newValue, reason);
1390
- }
1391
- },
1392
- onBlur: (event) => {
1393
- field.onBlur();
1394
- if (typeof onBlur === "function") {
1395
- onBlur(event);
1396
- }
1397
- },
1398
- fullWidth: true,
1399
- renderInput: (params) => /* @__PURE__ */ jsx8(
1400
- TextField3,
1401
- {
1402
- ...params,
1403
- ...restTextProps,
1404
- fullWidth: true,
1405
- error: !!error,
1406
- required,
1407
- helperText: error ? error.message : "",
1408
- placeholder,
1409
- label,
1410
- variant: variant ? variant : "outlined"
1411
- }
1412
- )
1413
- }
1414
- );
1415
- };
1416
- var SelectCascadeElement2 = ({
1417
- gridProps = {},
1418
- ...props
1419
- }) => {
1420
- return /* @__PURE__ */ jsx8(Grid7, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx8(Component6, { ...props }) });
1421
- };
1422
- SelectCascadeElement2.displayName = "SelectCascadeElement";
1423
-
1424
- // src/wrappers/SelectElement/SelectElement.tsx
1425
- import { Grid as Grid8, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
1426
- import { useTheme as useTheme4 } from "@mui/material/styles";
1427
- import { useMemo as useMemo7, useEffect as useEffect3, useCallback as useCallback6 } from "react";
1428
- import { useController as useController8 } from "react-hook-form";
1429
- import { jsx as jsx9 } from "react/jsx-runtime";
1430
- var Component7 = function SelectElement(props) {
1431
- const theme = useTheme4();
1432
- const {
1433
- name,
1434
- control,
1435
- onChange,
1436
- options: optionsInput,
1437
- label,
1438
- variant,
1439
- disabled,
1440
- labelField = "Label",
1441
- valueField = "Value",
1442
- placeholder,
1443
- textFieldProps = {},
1444
- isNullable = false,
1445
- disableDefaultSelected = false,
1446
- ...rest
1447
- } = props;
1448
- const { required, ...restTextProps } = textFieldProps;
1449
- const options = useMemo7(() => optionsInput || [], [optionsInput]);
1450
- const {
1451
- field,
1452
- fieldState: { error }
1453
- } = useController8({
1454
- name,
1455
- control
1456
- });
1457
- const getOptionValue = useCallback6(
1458
- (option) => {
1459
- if (typeof option === "string") return option;
1460
- return option ? option[valueField] : null;
1461
- },
1462
- [valueField]
1463
- );
1464
- const getOptionLabel = useCallback6(
1465
- (option) => {
1466
- if (typeof option === "string") return option;
1467
- return option ? String(option[labelField]) : "";
1468
- },
1469
- [labelField]
1470
- );
1471
- useEffect3(() => {
1472
- if (disableDefaultSelected && options.length === 1 && field.value == null) {
1473
- field.onChange(null);
1474
- }
1475
- }, [disableDefaultSelected, options.length]);
1476
- useEffect3(() => {
1477
- const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
1478
- if (options.length === 1 && !hasValue && !disableDefaultSelected) {
1479
- if (disabled) return;
1480
- field.onChange(getOptionValue(options[0]));
1481
- }
1482
- }, [
1483
- options,
1484
- disabled,
1485
- getOptionValue,
1486
- field.onChange,
1487
- disableDefaultSelected
1488
- ]);
1489
- const isDisabled = useMemo7(() => {
1490
- if (disabled) return true;
1491
- if (options.length === 0) return true;
1492
- if (options.length === 1 && !isNullable && !disableDefaultSelected)
1493
- return true;
1494
- return false;
1495
- }, [disabled, options.length, isNullable, disableDefaultSelected]);
1496
- const autocompleteValue = useMemo7(
1497
- () => options.find((option) => getOptionValue(option) === field.value) ?? null,
1498
- [field.value, options, getOptionValue]
1499
- );
1500
- return /* @__PURE__ */ jsx9(
1501
- Autocomplete3,
1502
- {
1503
- ...rest,
1504
- filterSelectedOptions: false,
1505
- options,
1506
- value: autocompleteValue,
1507
- onChange: (event, newValue, reason) => {
1508
- const option = newValue;
1509
- field.onChange(option ? getOptionValue(option) : null);
1510
- onChange?.(event, newValue, reason);
1511
- },
1512
- disabled: isDisabled,
1513
- sx: {
1514
- "&.Mui-disabled": {
1515
- cursor: "not-allowed !important"
1516
- },
1517
- "& .MuiInputBase-root.Mui-disabled": {
1518
- backgroundColor: theme.palette.action.disabledBackground,
1519
- cursor: "not-allowed !important"
1520
- },
1521
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1522
- cursor: "not-allowed !important"
1523
- },
1524
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1525
- borderColor: error ? "red" : void 0
1526
- },
1527
- "& .MuiFilledInput-root.Mui-disabled": {
1528
- borderColor: error ? "red" : void 0
1529
- }
1530
- },
1531
- getOptionLabel: (option) => getOptionLabel(option),
1532
- ref: field.ref,
1533
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1534
- renderInput: (params) => /* @__PURE__ */ jsx9(
1535
- TextField4,
1536
- {
1537
- ...params,
1538
- ...restTextProps,
1539
- fullWidth: true,
1540
- required,
1541
- error: !!error,
1542
- helperText: error ? error.message : "",
1543
- label,
1544
- placeholder,
1545
- variant: variant ? variant : "outlined"
1546
- }
1547
- )
1548
- }
1549
- );
1550
- };
1551
- var SelectElement2 = ({
1552
- gridProps = {},
1553
- ...props
1554
- }) => {
1555
- return /* @__PURE__ */ jsx9(Grid8, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx9(Component7, { ...props }) });
1556
- };
1557
- SelectElement2.displayName = "SelectElement";
1558
-
1559
- // src/wrappers/SelectMultiElement/SelectMultiElement.tsx
1560
- import CheckBoxIcon from "@mui/icons-material/CheckBox";
1561
- import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
1562
- import {
1563
- Grid as Grid9,
1564
- Checkbox as Checkbox3,
1565
- TextField as TextField5,
1566
- Autocomplete as Autocomplete4,
1567
- CircularProgress as CircularProgress2,
1568
- useTheme as useTheme5
1569
- } from "@mui/material";
1570
- import { Fragment as Fragment2, useEffect as useEffect4, useMemo as useMemo8 } from "react";
1571
- import { useController as useController9 } from "react-hook-form";
1572
- import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
1573
- var Component8 = function SelectMultiElement(props) {
1574
- const {
1575
- name,
1576
- control,
1577
- onBlur,
1578
- disabled,
1579
- options: optionsInput,
1580
- loading = false,
1581
- placeholder,
1582
- label,
1583
- isNullable,
1584
- disableDefaultSelected = true,
1585
- variant,
1586
- labelField = "Label",
1587
- valueField = "Value",
1588
- ...rest
1589
- } = props;
1590
- const theme = useTheme5();
1591
- const options = useMemo8(() => optionsInput || [], [optionsInput]);
1592
- const {
1593
- field,
1594
- fieldState: { error }
1595
- } = useController9({
1596
- name,
1597
- control
1598
- });
1599
- const getOptionValue = (option) => {
1600
- if (typeof option === "string") return option;
1601
- return option ? option[valueField] : null;
1602
- };
1603
- const getOptionLabel = (option) => {
1604
- if (typeof option === "string") return option;
1605
- return option ? String(option[labelField]) : "";
1606
- };
1607
- const isDisabled = useMemo8(() => {
1608
- if (disabled) return true;
1609
- if (options.length === 0) return true;
1610
- if (options.length === 1 && !isNullable && !disableDefaultSelected)
1611
- return true;
1612
- return false;
1613
- }, [disabled, options.length, isNullable, disableDefaultSelected]);
1614
- const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
1615
- useEffect4(() => {
1616
- if (disableDefaultSelected && options.length === 1 && field.value == null) {
1617
- field.onChange(null);
1618
- }
1619
- }, [disableDefaultSelected, options.length]);
1620
- useEffect4(() => {
1621
- const hasValue = Array.isArray(field.value) && field.value.length > 0;
1622
- if (options.length === 1 && !hasValue && !isNullable && !disableDefaultSelected) {
1623
- field.onChange([getOptionValue(options[0])]);
1624
- }
1625
- }, [
1626
- options,
1627
- getOptionValue,
1628
- field.onChange,
1629
- isNullable,
1630
- disableDefaultSelected
1631
- ]);
1632
- const handleChange = (_, selectedOptions, reason) => {
1633
- if (reason === "clear") {
1634
- field.onChange(null);
1635
- } else if (reason === "selectOption" || reason === "removeOption") {
1636
- const newValues = selectedOptions.map((option) => getOptionValue(option));
1637
- field.onChange(newValues.length === 0 ? null : newValues);
1638
- }
1639
- };
1640
- const icon = /* @__PURE__ */ jsx10(CheckBoxOutlineBlankIcon, { fontSize: "small" });
1641
- const checkedIcon = /* @__PURE__ */ jsx10(CheckBoxIcon, { fontSize: "small" });
1642
- return /* @__PURE__ */ jsx10(
1643
- Autocomplete4,
1644
- {
1645
- multiple: true,
1646
- value: selectedValue,
1647
- loading,
1648
- options,
1649
- getOptionLabel,
1650
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1651
- filterSelectedOptions: true,
1652
- disableCloseOnSelect: true,
1653
- ref: field.ref,
1654
- disabled: isDisabled,
1655
- onChange: handleChange,
1656
- onBlur: (event) => {
1657
- field.onBlur();
1658
- if (typeof onBlur === "function") {
1659
- onBlur(event);
1660
- }
1661
- },
1662
- sx: {
1663
- "&.Mui-disabled": {
1664
- cursor: "not-allowed !important"
1665
- },
1666
- "& .MuiInputBase-root.Mui-disabled": {
1667
- backgroundColor: theme.palette.action.disabledBackground,
1668
- cursor: "not-allowed !important"
1669
- },
1670
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1671
- cursor: "not-allowed !important"
1672
- },
1673
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1674
- borderColor: error ? "red" : void 0
1675
- },
1676
- "& .MuiFilledInput-root.Mui-disabled": {
1677
- borderColor: error ? "red" : void 0
1678
- }
1679
- },
1680
- fullWidth: true,
1681
- renderOption: (props1, option, { selected }) => {
1682
- return /* @__PURE__ */ jsxs5("li", { ...props1, children: [
1683
- /* @__PURE__ */ jsx10(
1684
- Checkbox3,
1685
- {
1686
- icon,
1687
- checkedIcon,
1688
- checked: selected
1689
- }
1690
- ),
1691
- getOptionLabel(option)
1692
- ] });
1693
- },
1694
- renderInput: (params) => /* @__PURE__ */ jsx10(
1695
- TextField5,
1696
- {
1697
- ...params,
1698
- label,
1699
- error: !!error,
1700
- helperText: error ? error.message : "",
1701
- placeholder,
1702
- InputProps: {
1703
- ...params.InputProps,
1704
- endAdornment: /* @__PURE__ */ jsxs5(Fragment2, { children: [
1705
- loading ? /* @__PURE__ */ jsx10(CircularProgress2, { color: "inherit", size: 20 }) : null,
1706
- params.InputProps.endAdornment
1707
- ] })
1708
- },
1709
- variant: variant ? variant : "outlined"
1710
- }
1711
- ),
1712
- ...rest
1713
- }
1714
- );
1715
- };
1716
- var SelectMultiElement2 = ({
1717
- gridProps = {},
1718
- ...props
1719
- }) => {
1720
- return /* @__PURE__ */ jsx10(Grid9, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx10(Component8, { ...props }) });
1721
- };
1722
- SelectMultiElement2.displayName = "SelectMultiElement";
1723
-
1724
- // src/wrappers/TextFieldElement/TextFieldElement.tsx
1725
- import { Grid as Grid10, TextField as TextField6, useForkRef as useForkRef3 } from "@mui/material";
1726
- import { useController as useController10 } from "react-hook-form";
1727
- import { jsx as jsx11 } from "react/jsx-runtime";
1728
- var Component9 = function TextFieldElement(props) {
1729
- const {
1730
- parseError,
1731
- name,
1732
- control,
1733
- component: TextFieldComponent = TextField6,
1734
- transform,
1735
- fieldType = "text",
1736
- // Default to text type
1737
- defaultValue,
1738
- label,
1739
- placeholder,
1740
- textFieldProps = {},
1741
- variant,
1742
- onChange: customOnChange,
1743
- enableWarnings = process.env.NODE_ENV === "development",
1744
- ...rest
1745
- } = props;
1746
- const {
1747
- type,
1748
- required,
1749
- helperText,
1750
- inputRef,
1751
- onInput,
1752
- onBlur,
1753
- disabled,
1754
- ...restTextProps
1755
- } = textFieldProps;
1756
- const {
1757
- field,
1758
- fieldState: { error }
1759
- } = useController10({
1760
- name,
1761
- control
1762
- });
1763
- const { value, onChange } = useEnhancedTransform(
1764
- {
1765
- value: field.value,
1766
- onChange: field.onChange,
1767
- transform: transform ? {
1768
- input: transform.input,
1769
- output: transform.output
1770
- } : void 0,
1771
- fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
1772
- // Auto-detect number type
1773
- defaultValue,
1774
- enableWarnings
1775
- }
1776
- );
1777
- const handleInputRef = useForkRef3(field.ref, inputRef);
1778
- return /* @__PURE__ */ jsx11(
1779
- TextFieldComponent,
1780
- {
1781
- ...rest,
1782
- ...restTextProps,
1783
- name: field.name,
1784
- value,
1785
- onChange: (event) => {
1786
- const input = event.target.value;
1787
- if (input === "") {
1788
- field.onChange(null);
1789
- } else {
1790
- onChange(event);
1791
- }
1792
- if (typeof customOnChange === "function") {
1793
- customOnChange(event);
1794
- }
1795
- return;
1796
- },
1797
- onBlur: (event) => {
1798
- field.onBlur();
1799
- if (typeof onBlur === "function") {
1800
- onBlur(event);
1801
- }
1802
- },
1803
- onInput: (event) => {
1804
- if (typeof onInput === "function") {
1805
- onInput(event);
1806
- }
1807
- },
1808
- disabled,
1809
- label,
1810
- placeholder,
1811
- fullWidth: true,
1812
- required,
1813
- type,
1814
- error: !!error,
1815
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
1816
- inputRef: handleInputRef,
1817
- variant: variant ? variant : "outlined"
1818
- }
1819
- );
1820
- };
1821
- var TextFieldElement2 = ({
1822
- gridProps = {},
1823
- ...props
1824
- }) => {
1825
- return /* @__PURE__ */ jsx11(Grid10, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx11(Component9, { ...props }) });
1826
- };
1827
-
1828
- // src/wrappers/TimePickerElement/TimePickerElement.tsx
1829
- import { Grid as Grid11, useForkRef as useForkRef4 } from "@mui/material";
1830
- import { TimePicker } from "@mui/x-date-pickers";
1831
- import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
1832
- import { renderTimeViewClock } from "@mui/x-date-pickers/timeViewRenderers";
1833
- import dayjs from "dayjs";
1834
- import { useState as useState3 } from "react";
1835
- import { useController as useController11 } from "react-hook-form";
1836
- import { jsx as jsx12 } from "react/jsx-runtime";
1837
- var Component10 = function TimePickerElement(props) {
1838
- const {
1839
- name,
1840
- required,
1841
- inputProps,
1842
- control,
1843
- label,
1844
- placeholder,
1845
- slotProps,
1846
- timePickerProps = {},
1847
- transform,
1848
- ...rest
1849
- } = props;
1850
- const adapter = useLocalizationContext2();
1851
- const [open, setOpen] = useState3(false);
1852
- const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
1853
- const {
1854
- field,
1855
- fieldState: { error }
1856
- } = useController11({
1857
- name,
1858
- control,
1859
- defaultValue: null
1860
- });
1861
- const { value, onChange } = useTransform({
1862
- value: field.value,
1863
- onChange: field.onChange,
1864
- transform: {
1865
- input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
1866
- output: (data) => {
1867
- if (!dayjs.isDayjs(data)) {
1868
- return null;
1869
- }
1870
- return data;
1871
- }
1872
- }
1873
- });
1874
- const handleInputRef = useForkRef4(field.ref, inputRef);
1875
- return /* @__PURE__ */ jsx12(
1876
- TimePicker,
1877
- {
1878
- ...rest,
1879
- ...restTimePickerProps,
1880
- value,
1881
- label,
1882
- disabled,
1883
- open,
1884
- inputRef: handleInputRef,
1885
- viewRenderers: {
1886
- hours: renderTimeViewClock,
1887
- minutes: renderTimeViewClock,
1888
- seconds: renderTimeViewClock
1889
- },
1890
- onOpen: () => setOpen(true),
1891
- onClose: (...args) => {
1892
- setOpen(false);
1893
- field.onBlur();
1894
- onClose?.(...args);
1895
- },
1896
- onChange: (newValue, context) => {
1897
- onChange(newValue);
1898
- timePickerProps.onChange?.(newValue, context);
1899
- },
1900
- slotProps: {
1901
- ...slotProps,
1902
- actionBar: {
1903
- actions: ["clear", "cancel", "accept"]
1904
- },
1905
- textField: {
1906
- ...inputProps,
1907
- required,
1908
- placeholder,
1909
- fullWidth: true,
1910
- readOnly: true,
1911
- sx: {
1912
- cursor: disabled ? "not-allowed" : "pointer"
1913
- },
1914
- onClick: () => {
1915
- if (!disabled) {
1916
- setOpen(true);
1917
- }
1918
- },
1919
- onBlur: (event) => {
1920
- field.onBlur();
1921
- inputProps?.onBlur?.(event);
1922
- },
1923
- error: !!error,
1924
- helperText: error ? error.message : inputProps?.helperText || rest.helperText,
1925
- inputProps: {
1926
- readOnly: true,
1927
- inputMode: "none",
1928
- ...inputProps?.inputProps
1929
- }
1930
- }
1931
- }
1932
- }
1933
- );
1934
- };
1935
- var TimePickerElement2 = ({
1936
- gridProps = {},
1937
- ...props
1938
- }) => {
1939
- return /* @__PURE__ */ jsx12(Grid11, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx12(Component10, { ...props }) });
1940
- };
1941
- TimePickerElement2.displayName = "TimePickerElement";
1942
-
1943
- // src/wrappers/SliderElement/SliderElement.tsx
1944
- import {
1945
- Box,
1946
- FormControl as FormControl4,
1947
- FormHelperText as FormHelperText4,
1948
- FormLabel as FormLabel3,
1949
- Grid as Grid12,
1950
- Slider
1951
- } from "@mui/material";
1952
- import { useController as useController12 } from "react-hook-form";
1953
- import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
1954
- var Component11 = function SliderElementCore(props) {
1955
- const {
1956
- name,
1957
- control,
1958
- label,
1959
- helperText,
1960
- parseError,
1961
- min = 0,
1962
- max = 100,
1963
- step = 1,
1964
- marks = false,
1965
- required = false,
1966
- disabled = false,
1967
- sliderProps = {}
1968
- } = props;
1969
- const {
1970
- field,
1971
- fieldState: { error }
1972
- } = useController12({
1973
- name,
1974
- control
1975
- });
1976
- const errorMessage = error ? parseError ? parseError(error) : error.message : null;
1977
- return /* @__PURE__ */ jsxs6(
1978
- FormControl4,
1979
- {
1980
- fullWidth: true,
1981
- margin: "normal",
1982
- error: !!error,
1983
- required,
1984
- disabled,
1985
- children: [
1986
- label && /* @__PURE__ */ jsx13(FormLabel3, { sx: { mb: 2 }, children: label }),
1987
- /* @__PURE__ */ jsx13(Box, { sx: { px: 2 }, children: /* @__PURE__ */ jsx13(
1988
- Slider,
1989
- {
1990
- ...sliderProps,
1991
- ref: field.ref,
1992
- name: field.name,
1993
- value: typeof field.value === "number" ? field.value : min,
1994
- onChange: (_, newValue) => field.onChange(newValue),
1995
- onBlur: field.onBlur,
1996
- min,
1997
- max,
1998
- step,
1999
- marks,
2000
- valueLabelDisplay: "auto",
2001
- disabled
2002
- }
2003
- ) }),
2004
- (errorMessage || helperText) && /* @__PURE__ */ jsx13(FormHelperText4, { children: errorMessage || helperText })
2005
- ]
2006
- }
2007
- );
2008
- };
2009
- var SliderElement = ({
2010
- gridProps = {},
2011
- ...props
2012
- }) => {
2013
- return /* @__PURE__ */ jsx13(Grid12, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx13(Component11, { ...props }) });
2014
- };
2015
- SliderElement.displayName = "SliderElement";
2016
-
2017
- // src/wrappers/FileUploadElement/FileUploadElement.tsx
2018
- import {
2019
- Box as Box2,
2020
- Button,
2021
- Chip,
2022
- FormControl as FormControl5,
2023
- FormHelperText as FormHelperText5,
2024
- FormLabel as FormLabel4,
2025
- Grid as Grid13,
2026
- Stack
2027
- } from "@mui/material";
2028
- import CloudUploadIcon from "@mui/icons-material/CloudUpload";
2029
- import { useCallback as useCallback7, useRef as useRef3 } from "react";
2030
- import { useController as useController13, useFormContext } from "react-hook-form";
2031
- import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
2032
- var Component12 = function FileUploadElementCore(props) {
2033
- const {
2034
- name,
2035
- control,
2036
- label,
2037
- helperText,
2038
- parseError,
2039
- maxFiles = 5,
2040
- maxSizeMB = 10,
2041
- allowedExtensions = [".jpg", ".jpeg", ".png", ".pdf", ".doc", ".docx", ".xls", ".xlsx"],
2042
- required = false,
2043
- disabled = false,
2044
- buttonText = "Choose Files"
2045
- } = props;
2046
- const { setError, clearErrors } = useFormContext();
2047
- const fileInputRef = useRef3(null);
2048
- const {
2049
- field,
2050
- fieldState: { error }
2051
- } = useController13({
2052
- name,
2053
- control
2054
- });
2055
- const files = Array.isArray(field.value) ? field.value : [];
2056
- const validateFiles = useCallback7(
2057
- (fileList) => {
2058
- if (!fileList || fileList.length === 0) {
2059
- return [];
2060
- }
2061
- if (fileList.length > maxFiles) {
2062
- return `Maximum ${maxFiles} files allowed`;
2063
- }
2064
- const maxSizeBytes = maxSizeMB * 1024 * 1024;
2065
- const validFiles = [];
2066
- for (let i = 0; i < fileList.length; i++) {
2067
- const file = fileList[i];
2068
- if (file.size > maxSizeBytes) {
2069
- return `File "${file.name}" exceeds ${maxSizeMB}MB size limit`;
2070
- }
2071
- const extension = "." + file.name.split(".").pop()?.toLowerCase();
2072
- if (!allowedExtensions.includes(extension)) {
2073
- return `File "${file.name}" has invalid extension. Allowed: ${allowedExtensions.join(", ")}`;
2074
- }
2075
- validFiles.push(file);
2076
- }
2077
- return validFiles;
2078
- },
2079
- [maxFiles, maxSizeMB, allowedExtensions]
2080
- );
2081
- const handleFileChange = useCallback7(
2082
- (event) => {
2083
- const result = validateFiles(event.target.files);
2084
- if (typeof result === "string") {
2085
- setError(name, { type: "validation", message: result });
2086
- if (fileInputRef.current) {
2087
- fileInputRef.current.value = "";
2088
- }
2089
- return;
2090
- }
2091
- clearErrors(name);
2092
- field.onChange(result);
2093
- },
2094
- [validateFiles, setError, clearErrors, name, field]
2095
- );
2096
- const handleRemoveFile = useCallback7(
2097
- (index) => {
2098
- const newFiles = files.filter((_, i) => i !== index);
2099
- field.onChange(newFiles);
2100
- if (fileInputRef.current) {
2101
- fileInputRef.current.value = "";
2102
- }
2103
- },
2104
- [files, field]
2105
- );
2106
- const errorMessage = error ? parseError ? parseError(error) : error.message : null;
2107
- return /* @__PURE__ */ jsxs7(
2108
- FormControl5,
2109
- {
2110
- fullWidth: true,
2111
- margin: "normal",
2112
- error: !!error,
2113
- required,
2114
- disabled,
2115
- children: [
2116
- label && /* @__PURE__ */ jsx14(FormLabel4, { sx: { mb: 1 }, children: label }),
2117
- /* @__PURE__ */ jsxs7(Box2, { children: [
2118
- /* @__PURE__ */ jsxs7(
2119
- Button,
2120
- {
2121
- variant: "outlined",
2122
- component: "label",
2123
- startIcon: /* @__PURE__ */ jsx14(CloudUploadIcon, {}),
2124
- disabled: disabled || files.length >= maxFiles,
2125
- children: [
2126
- buttonText,
2127
- /* @__PURE__ */ jsx14(
2128
- "input",
2129
- {
2130
- ref: fileInputRef,
2131
- type: "file",
2132
- multiple: true,
2133
- accept: allowedExtensions.join(","),
2134
- hidden: true,
2135
- onChange: handleFileChange
2136
- }
2137
- )
2138
- ]
2139
- }
2140
- ),
2141
- files.length > 0 && /* @__PURE__ */ jsx14(Stack, { direction: "row", spacing: 1, flexWrap: "wrap", sx: { mt: 2 }, children: files.map((file, index) => /* @__PURE__ */ jsx14(
2142
- Chip,
2143
- {
2144
- label: `${file.name} (${(file.size / 1024).toFixed(1)} KB)`,
2145
- onDelete: disabled ? void 0 : () => handleRemoveFile(index),
2146
- sx: { mb: 1 }
2147
- },
2148
- `${file.name}-${index}`
2149
- )) })
2150
- ] }),
2151
- (errorMessage || helperText) && /* @__PURE__ */ jsx14(FormHelperText5, { children: errorMessage || helperText })
2152
- ]
2153
- }
2154
- );
2155
- };
2156
- var FileUploadElement = ({
2157
- gridProps = {},
2158
- ...props
2159
- }) => {
2160
- return /* @__PURE__ */ jsx14(Grid13, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx14(Component12, { ...props }) });
2161
- };
2162
- FileUploadElement.displayName = "FileUploadElement";
2163
-
2164
- // src/wrappers/AsyncSelect/index.tsx
2165
- import {
2166
- Autocomplete as Autocomplete5,
2167
- CircularProgress as CircularProgress3,
2168
- Grid as Grid14,
2169
- TextField as TextField7,
2170
- useTheme as useTheme6
2171
- } from "@mui/material";
2172
- import { debounce as debounce2 } from "@mui/material/utils";
2173
- import {
2174
- Fragment as Fragment3,
2175
- useCallback as useCallback8,
2176
- useEffect as useEffect5,
2177
- useMemo as useMemo9,
2178
- useRef as useRef4,
2179
- useState as useState4
2180
- } from "react";
2181
- import {
2182
- useController as useController14
2183
- } from "react-hook-form";
2184
- import { jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
2185
- var Component13 = function AsyncSelectElement(props) {
2186
- const {
2187
- name,
2188
- disabled,
2189
- control,
2190
- placeholder,
2191
- // initialValue,
2192
- // isNullable,
2193
- label,
2194
- queryFn,
2195
- variant,
2196
- labelField = "Label",
2197
- valueField = "Value",
2198
- ...rest
2199
- } = props;
2200
- const {
2201
- field,
2202
- fieldState: { error }
2203
- } = useController14({
2204
- name,
2205
- control
2206
- });
2207
- const theme = useTheme6();
2208
- const [loading, setLoading] = useState4(false);
2209
- const [selectedOption, setSelectedOption] = useState4(null);
2210
- const [inputValue, setInputValue] = useState4("");
2211
- const [options, setOptions] = useState4([]);
2212
- const [open, setOpen] = useState4(false);
2213
- const loadedValueRef = useRef4(
2214
- void 0
2215
- );
2216
- const fetchData = useMemo9(
2217
- () => debounce2(
2218
- (payload, callback) => {
2219
- queryFn(payload).then((c) => callback(c));
2220
- },
2221
- 400
2222
- ),
2223
- [queryFn]
2224
- );
2225
- const getOptionValue = useCallback8(
2226
- (option) => {
2227
- return option ? String(option[valueField]) : "";
2228
- },
2229
- [valueField]
2230
- );
2231
- const getOptionLabel = useCallback8(
2232
- (option) => {
2233
- return option ? String(option[labelField]) : "";
2234
- },
2235
- [labelField]
2236
- );
2237
- useEffect5(() => {
2238
- const currentValue = field.value;
2239
- if (currentValue && loadedValueRef.current !== currentValue) {
2240
- if (selectedOption && getOptionValue(selectedOption) === currentValue) {
2241
- loadedValueRef.current = currentValue;
2242
- return;
2243
- }
2244
- const active = true;
2245
- setLoading(true);
2246
- loadedValueRef.current = currentValue;
2247
- fetchData({ Query: null, SelectedValue: currentValue }, (results) => {
2248
- if (!active) return;
2249
- setLoading(false);
2250
- const matchedOption = results?.find(
2251
- (option) => String(getOptionValue(option)) === String(currentValue)
2252
- );
2253
- if (matchedOption) {
2254
- setOptions([matchedOption]);
2255
- setSelectedOption(matchedOption);
2256
- setInputValue(getOptionLabel(matchedOption));
2257
- }
2258
- });
2259
- return;
2260
- }
2261
- if (inputValue !== (selectedOption ? getOptionLabel(selectedOption) : "")) {
2262
- if (inputValue === "") {
2263
- setOptions([]);
2264
- setLoading(false);
2265
- return;
2266
- }
2267
- const active = true;
2268
- setLoading(true);
2269
- fetchData({ Query: inputValue, SelectedValue: null }, (results) => {
2270
- if (!active) return;
2271
- setLoading(false);
2272
- setOptions(results || []);
2273
- });
2274
- return;
2275
- }
2276
- if (!currentValue && selectedOption) {
2277
- setSelectedOption(null);
2278
- setInputValue("");
2279
- setOptions([]);
2280
- loadedValueRef.current = void 0;
2281
- }
2282
- }, [
2283
- field.value,
2284
- inputValue,
2285
- fetchData,
2286
- getOptionLabel,
2287
- getOptionValue,
2288
- selectedOption,
2289
- labelField,
2290
- valueField
2291
- ]);
2292
- const isDisabled = useMemo9(() => {
2293
- return disabled ?? false;
2294
- }, [disabled]);
2295
- const handleChange = useCallback8(
2296
- (_, newSelectedOption) => {
2297
- setSelectedOption(newSelectedOption);
2298
- const newValue = newSelectedOption ? getOptionValue(newSelectedOption) : null;
2299
- field.onChange(newValue);
2300
- loadedValueRef.current = newValue;
2301
- if (newSelectedOption) {
2302
- setInputValue(getOptionLabel(newSelectedOption));
2303
- } else {
2304
- setInputValue("");
2305
- setOptions([]);
2306
- }
2307
- },
2308
- [field, getOptionValue, getOptionLabel]
2309
- );
2310
- const handleInputChange = useCallback8(
2311
- (_, newInputValue) => {
2312
- setInputValue(newInputValue);
2313
- },
2314
- []
2315
- );
2316
- const handleBlur = useCallback8(() => {
2317
- if (selectedOption) {
2318
- setInputValue(getOptionLabel(selectedOption));
2319
- } else {
2320
- setInputValue("");
2321
- }
2322
- }, [selectedOption, getOptionLabel]);
2323
- const handleOpen = useCallback8(() => {
2324
- setOpen(true);
2325
- }, []);
2326
- const handleClose = useCallback8(() => {
2327
- setOpen(false);
2328
- }, []);
2329
- return /* @__PURE__ */ jsx15(
2330
- Autocomplete5,
2331
- {
2332
- ...rest,
2333
- fullWidth: true,
2334
- open,
2335
- onOpen: handleOpen,
2336
- onClose: handleClose,
2337
- onBlur: handleBlur,
2338
- loading,
2339
- getOptionLabel,
2340
- getOptionKey: getOptionValue,
2341
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
2342
- autoComplete: true,
2343
- disabled: isDisabled,
2344
- includeInputInList: true,
2345
- options,
2346
- value: selectedOption,
2347
- filterSelectedOptions: true,
2348
- filterOptions: (x) => x,
2349
- onChange: handleChange,
2350
- onInputChange: handleInputChange,
2351
- sx: {
2352
- "&.Mui-disabled": {
2353
- cursor: "not-allowed !important"
2354
- },
2355
- "& .MuiInputBase-root.Mui-disabled": {
2356
- backgroundColor: theme.palette.action.disabledBackground,
2357
- cursor: "not-allowed !important"
2358
- },
2359
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
2360
- cursor: "not-allowed !important"
2361
- },
2362
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
2363
- borderColor: error ? "red" : void 0
2364
- },
2365
- "& .MuiFilledInput-root.Mui-disabled": {
2366
- borderColor: error ? "red" : void 0
2367
- }
2368
- },
2369
- noOptionsText: "Type Something...",
2370
- renderInput: (params) => /* @__PURE__ */ jsx15(
2371
- TextField7,
2372
- {
2373
- ...params,
2374
- label,
2375
- error: !!error,
2376
- helperText: error ? error.message : "",
2377
- placeholder,
2378
- slotProps: {
2379
- input: {
2380
- ...params.InputProps,
2381
- endAdornment: /* @__PURE__ */ jsxs8(Fragment3, { children: [
2382
- loading ? /* @__PURE__ */ jsx15(CircularProgress3, { color: "inherit", size: 20 }) : null,
2383
- params.InputProps.endAdornment
2384
- ] })
2385
- }
2386
- },
2387
- variant: variant ? variant : "outlined"
2388
- }
2389
- ),
2390
- renderOption: (renderProps, option) => {
2391
- const { key, ...optionProps } = renderProps;
2392
- return /* @__PURE__ */ jsx15("li", { ...optionProps, children: option[labelField] }, key);
2393
- }
2394
- }
2395
- );
2396
- };
2397
- var AsyncSelectElement2 = ({
2398
- gridProps = {},
2399
- ...props
2400
- }) => {
2401
- return /* @__PURE__ */ jsx15(Grid14, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx15(
2402
- Component13,
2403
- {
2404
- ...props
2405
- }
2406
- ) });
2407
- };
2408
- AsyncSelectElement2.displayName = "AsyncSelectElement";
2409
-
2410
- // src/wrappers/NumberFieldElement/NumberFieldElement.tsx
2411
- import { Grid as Grid15, TextField as TextField8, useForkRef as useForkRef5 } from "@mui/material";
2412
- import { useController as useController15 } from "react-hook-form";
2413
- import { jsx as jsx16 } from "react/jsx-runtime";
2414
- var Component14 = function NumberFieldElement(props) {
2415
- const {
2416
- parseError,
2417
- name,
2418
- control,
2419
- component: TextFieldComponent = TextField8,
2420
- transform,
2421
- fieldType = "text",
2422
- // Default to text type
2423
- defaultValue,
2424
- label,
2425
- placeholder,
2426
- textFieldProps = {},
2427
- variant,
2428
- onChange: customOnChange,
2429
- enableWarnings = process.env.NODE_ENV === "development",
2430
- maxLength,
2431
- ...rest
2432
- } = props;
2433
- const {
2434
- type = "number",
2435
- required,
2436
- helperText,
2437
- inputRef,
2438
- onInput,
2439
- onBlur,
2440
- disabled,
2441
- ...restTextProps
2442
- } = textFieldProps;
2443
- const {
2444
- field,
2445
- fieldState: { error }
2446
- } = useController15({
2447
- name,
2448
- control
2449
- });
2450
- const { value, onChange } = useEnhancedTransform(
2451
- {
2452
- value: field.value,
2453
- onChange: field.onChange,
2454
- transform: transform ? {
2455
- input: transform.input,
2456
- output: transform.output
2457
- } : void 0,
2458
- fieldType: !transform ? type === "number" ? maxLength && maxLength > 5 ? "text" : "number" : fieldType : void 0,
2459
- // Auto-detect number type
2460
- defaultValue,
2461
- enableWarnings
2462
- }
2463
- );
2464
- const handleInputRef = useForkRef5(field.ref, inputRef);
2465
- return /* @__PURE__ */ jsx16(
2466
- TextFieldComponent,
2467
- {
2468
- ...rest,
2469
- ...restTextProps,
2470
- name: field.name,
2471
- value,
2472
- onChange: (event) => {
2473
- const input = event.target.value;
2474
- if (input === "") {
2475
- field.onChange(null);
2476
- }
2477
- onChange(event);
2478
- if (typeof customOnChange === "function") {
2479
- customOnChange(event);
2480
- }
2481
- },
2482
- onBlur: (event) => {
2483
- field.onBlur();
2484
- if (typeof onBlur === "function") {
2485
- onBlur(event);
2486
- }
2487
- },
2488
- onInput: (event) => {
2489
- if (type === "number" && maxLength && event.target.value.length > maxLength) {
2490
- event.target.value = event.target.value.slice(0, maxLength);
2491
- }
2492
- if (typeof onInput === "function") {
2493
- onInput(event);
2494
- }
2495
- },
2496
- onWheel: (e) => {
2497
- e.target.blur();
2498
- },
2499
- onKeyDown: (e) => {
2500
- if (["e", "E", "ArrowDown", "ArrowUp"].includes(e.key)) {
2501
- e.preventDefault();
2502
- }
2503
- },
2504
- disabled,
2505
- label,
2506
- placeholder,
2507
- fullWidth: true,
2508
- required,
2509
- type,
2510
- error: !!error,
2511
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
2512
- inputRef: handleInputRef,
2513
- slotProps: { htmlInput: { maxLength } },
2514
- variant: variant ? variant : "outlined"
2515
- }
2516
- );
2517
- };
2518
- var NumberFieldElement2 = ({
2519
- gridProps = {},
2520
- ...props
2521
- }) => {
2522
- return /* @__PURE__ */ jsx16(Grid15, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx16(Component14, { ...props }) });
2523
- };
2524
-
2525
- // src/wrappers/OTPInputElement/OTPInputElement.tsx
2526
- import { Box as Box3, Grid as Grid16, inputBaseClasses } from "@mui/material";
2527
- import {
2528
- MuiOtpInput
2529
- } from "mui-one-time-password-input";
2530
- import { Controller } from "react-hook-form";
2531
-
2532
- // src/wrappers/OTPInputElement/HelperText.tsx
2533
- import FormHelperText6 from "@mui/material/FormHelperText";
2534
- import { jsx as jsx17 } from "react/jsx-runtime";
2535
- function HelperText({
2536
- sx,
2537
- helperText,
2538
- errorMessage,
2539
- disableGutters,
2540
- ...other
2541
- }) {
2542
- if (errorMessage || helperText) {
2543
- return /* @__PURE__ */ jsx17(
2544
- FormHelperText6,
2545
- {
2546
- error: !!errorMessage,
2547
- sx: [
2548
- {
2549
- mx: disableGutters ? 0 : 1.75
2550
- },
2551
- ...Array.isArray(sx) ? sx : [sx]
2552
- ],
2553
- ...other,
2554
- children: errorMessage || helperText
2555
- }
2556
- );
2557
- }
2558
- return null;
2559
- }
2560
-
2561
- // src/wrappers/OTPInputElement/OTPInputElement.tsx
2562
- import { jsx as jsx18, jsxs as jsxs9 } from "react/jsx-runtime";
2563
- var Component15 = function OTPInputElement(props) {
2564
- const {
2565
- // parseError,
2566
- name,
2567
- control,
2568
- slotProps,
2569
- helperText,
2570
- maxSize = 56,
2571
- placeholder = "-",
2572
- ...rest
2573
- } = props;
2574
- return /* @__PURE__ */ jsx18(
2575
- Controller,
2576
- {
2577
- name,
2578
- control,
2579
- render: ({ field, fieldState: { error } }) => /* @__PURE__ */ jsxs9(
2580
- Box3,
2581
- {
2582
- ...slotProps?.wrapper,
2583
- sx: [
2584
- {
2585
- display: "flex",
2586
- justifyContent: "center",
2587
- [`& .${inputBaseClasses.input}`]: {
2588
- p: 0,
2589
- height: "auto",
2590
- aspectRatio: "1/1",
2591
- maxWidth: maxSize
2592
- }
2593
- },
2594
- ...Array.isArray(slotProps?.wrapper?.sx) ? slotProps?.wrapper?.sx ?? [] : [slotProps?.wrapper?.sx]
2595
- ],
2596
- children: [
2597
- /* @__PURE__ */ jsx18(
2598
- MuiOtpInput,
2599
- {
2600
- ...field,
2601
- autoFocus: true,
2602
- gap: 1.5,
2603
- length: 4,
2604
- TextFieldsProps: {
2605
- placeholder,
2606
- error: !!error,
2607
- ...slotProps?.textfield
2608
- },
2609
- ...rest
2610
- }
2611
- ),
2612
- /* @__PURE__ */ jsx18(
2613
- HelperText,
2614
- {
2615
- ...slotProps?.helperText,
2616
- errorMessage: error?.message,
2617
- helperText
2618
- }
2619
- )
2620
- ]
2621
- }
2622
- )
2623
- }
2624
- );
2625
- };
2626
- var OTPInputElement2 = ({
2627
- gridProps = {},
2628
- ...props
2629
- }) => {
2630
- return /* @__PURE__ */ jsx18(Grid16, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx18(Component15, { ...props }) });
2631
- };
2632
-
2633
- // src/wrappers/Field/index.ts
2634
- var Field = {
2635
- Text: TextFieldElement2,
2636
- Number: NumberFieldElement2,
2637
- Checkbox: CheckboxElement2,
2638
- Date: DatePickerElement,
2639
- RadioGroup: RadioButtonGroup2,
2640
- Password: PasswordElement,
2641
- Time: TimePickerElement2,
2642
- Select: SelectElement2,
2643
- SelectMulti: SelectMultiElement2,
2644
- SelectCascade: SelectCascadeElement2,
2645
- AsyncSelect: AsyncSelectElement2,
2646
- AsyncMultiSelect: AsyncSelectMultiElement2,
2647
- CheckboxGroup: CheckboxGroupElement,
2648
- OTPInput: OTPInputElement2,
2649
- Slider: SliderElement,
2650
- FileUpload: FileUploadElement
2651
- };
2652
-
2653
- export {
2654
- isValidOption,
2655
- normalizeOptions,
2656
- AsyncSelectMultiElement2 as AsyncSelectMultiElement,
2657
- CheckboxElement2 as CheckboxElement,
2658
- CheckboxGroupElement,
2659
- readDatePickerValueAsDate,
2660
- useDatePickerValue,
2661
- useDatePickerValidation,
2662
- useDatePickerStyles,
2663
- DatePickerElementCore,
2664
- DatePickerElement,
2665
- isValidDate,
2666
- isParsableDateString,
2667
- createDateInputTransform,
2668
- createDateOutputTransform,
2669
- createDefaultDatePickerConfig,
2670
- extractErrorMessage,
2671
- createStableKey,
2672
- PasswordElement,
2673
- RadioButtonGroup2 as RadioButtonGroup,
2674
- SelectCascadeElement2 as SelectCascadeElement,
2675
- SelectElement2 as SelectElement,
2676
- SelectMultiElement2 as SelectMultiElement,
2677
- TextFieldElement2 as TextFieldElement,
2678
- TimePickerElement2 as TimePickerElement,
2679
- SliderElement,
2680
- FileUploadElement,
2681
- Field
2682
- };
2683
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL3R5cGVzL2NvbW1vbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdC9Bc3luY011bHRpU2VsZWN0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hFbGVtZW50L0NoZWNrYm94RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnRDb3JlLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclN0eWxlcy50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCAiLi4vc3JjL3dyYXBwZXJzL1Bhc3N3b3JkRWxlbWVudC9QYXNzd29yZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9SYWRpb0J1dHRvbkdyb3VwL1JhZGlvQnV0dG9uR3JvdXAudHN4IiwgIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdEVsZW1lbnQvU2VsZWN0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdE11bHRpRWxlbWVudC9TZWxlY3RNdWx0aUVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UaW1lUGlja2VyRWxlbWVudC9UaW1lUGlja2VyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NsaWRlckVsZW1lbnQvU2xpZGVyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0ZpbGVVcGxvYWRFbGVtZW50L0ZpbGVVcGxvYWRFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNTZWxlY3QvaW5kZXgudHN4IiwgIi4uL3NyYy93cmFwcGVycy9OdW1iZXJGaWVsZEVsZW1lbnQvTnVtYmVyRmllbGRFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvT1RQSW5wdXRFbGVtZW50L09UUElucHV0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL09UUElucHV0RWxlbWVudC9IZWxwZXJUZXh0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRmllbGQvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29tbW9uIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHdyYXBwZXIgY29tcG9uZW50c1xuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8qKlxuICogQmFzZSBvcHRpb24gdHlwZSBmb3Igc2VsZWN0LWJhc2VkIGNvbXBvbmVudHNcbiAqXG4gKiBAdGVtcGxhdGUgViAtIFRoZSB2YWx1ZSB0eXBlIChzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlT3B0aW9uPFYgPSBzdHJpbmcgfCBudW1iZXI+IHtcbiAgLyoqXG4gICAqIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBvcHRpb25cbiAgICovXG4gIExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uXG4gICAqL1xuICBWYWx1ZTogVjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3B0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmxleGlibGUgb3B0aW9uIHR5cGUgdGhhdCBleHRlbmRzIGJhc2Ugb3B0aW9uIHdpdGggYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gKlxuICogQHRlbXBsYXRlIFQgLSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgb2JqZWN0XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBGbGV4aWJsZU9wdGlvbjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4+ID0gVCAmIEJhc2VPcHRpb247XG5cbi8qKlxuICogT3B0aW9uIHR5cGUgd2l0aCBjdXN0b21pemFibGUga2V5IG5hbWVzXG4gKiBVc2VmdWwgZm9yIGNvbXBvbmVudHMgdGhhdCBhY2NlcHQgY3VzdG9tIGxhYmVsRmllbGQvdmFsdWVGaWVsZCBwcm9wc1xuICpcbiAqIEB0ZW1wbGF0ZSBUVmFsdWVLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgdmFsdWVcbiAqIEB0ZW1wbGF0ZSBUTGFiZWxLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgbGFiZWxcbiAqIEB0ZW1wbGF0ZSBURGlzYWJsZWRLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgZGlzYWJsZWQgZmxhZ1xuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgQ3VzdG9tS2V5T3B0aW9uPFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IFJlY29yZDxUVmFsdWVLZXksIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ICZcbiAgUmVjb3JkPFRMYWJlbEtleSwgc3RyaW5nPiAmXG4gIFBhcnRpYWw8UmVjb3JkPFREaXNhYmxlZEtleSwgYm9vbGVhbj4+ICZcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogTGVnYWN5IG9wdGlvbiB0eXBlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICogVXNlcyBWYWx1ZS9MYWJlbCBuYW1pbmcgY29udmVudGlvblxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBCYXNlT3B0aW9uIG9yIEZsZXhpYmxlT3B0aW9uIGluc3RlYWRcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lPcHRpb24ge1xuICAvKipcbiAgICogRGlzcGxheSBsYWJlbCBmb3IgdGhlIG9wdGlvbiAoY2FwaXRhbGl6ZWQga2V5IG5hbWUpXG4gICAqL1xuICBMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIG9wdGlvbiAoY2FwaXRhbGl6ZWQga2V5IG5hbWUpXG4gICAqL1xuICBWYWx1ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIERpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIG9wdGlvblxuICpcbiAqIEBwYXJhbSBWYWx1ZSAtIFZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkT3B0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQmFzZU9wdGlvbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgJ0xhYmVsJyBpbiB2YWx1ZSAmJlxuICAgICdWYWx1ZScgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLkxhYmVsID09PSAnc3RyaW5nJyAmJlxuICAgICh0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLlZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5WYWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgQmFzZU9wdGlvbikuVmFsdWUgPT09ICdib29sZWFuJylcbiAgKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gbm9ybWFsaXplIG9wdGlvbnMgdG8gQmFzZU9wdGlvbiBmb3JtYXRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgYXJyYXkgdG8gbm9ybWFsaXplXG4gKiBAcGFyYW0gbGFiZWxGaWVsZCAtIEN1c3RvbSBsYWJlbCBmaWVsZCBuYW1lIGluIG9wdGlvbiBvYmplY3RzXG4gKiBAcGFyYW0gdmFsdWVGaWVsZCAtIEN1c3RvbSB2YWx1ZSBmaWVsZCBuYW1lIGluIG9wdGlvbiBvYmplY3RzXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIG9wdGlvbnMgYXJyYXlcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcHRpb25zPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIG9wdGlvbnM6IFRbXSxcbiAgbGFiZWxGaWVsZCA9ICdMYWJlbCcsXG4gIHZhbHVlRmllbGQgPSAnVmFsdWUnXG4pOiBCYXNlT3B0aW9uW10ge1xuICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgTGFiZWw6IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZF0gPz8gJycpLFxuICAgIFZhbHVlOiBvcHRpb25bdmFsdWVGaWVsZF0gYXMgc3RyaW5nIHwgbnVtYmVyLFxuICAgIGRpc2FibGVkOiBCb29sZWFuKG9wdGlvbi5kaXNhYmxlZCksXG4gIH0pKTtcbn1cbiIsICJpbXBvcnQge1xuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG4gIGRlYm91bmNlLFxuICBHcmlkLFxuICBUZXh0RmllbGQsXG4gIHVzZVRoZW1lLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCBtYXRjaCBmcm9tICdhdXRvc3VnZ2VzdC1oaWdobGlnaHQvbWF0Y2gnO1xuaW1wb3J0IHBhcnNlIGZyb20gJ2F1dG9zdWdnZXN0LWhpZ2hsaWdodC9wYXJzZSc7XG5pbXBvcnQgUmVhY3QsIHtcbiAgdXNlU3RhdGUsXG4gIHVzZVJlZixcbiAgdXNlTWVtbyxcbiAgdXNlRWZmZWN0LFxuICB1c2VDYWxsYmFjayxcbiAgRnJhZ21lbnQsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgSFRNTEF0dHJpYnV0ZXMsIFN5bnRoZXRpY0V2ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jTXVsdGlTZWxlY3RFbGVtZW50UHJvcHMsIE9wdGlvbk9iamVjdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jTXVsdGlTZWxlY3RQYXlsb2FkIH0gZnJvbSAnQC90eXBlcyc7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oXG4gIHByb3BzOiBBc3luY011bHRpU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFRPcHRpb25cbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgcXVlcnlGbixcbiAgICB2YXJpYW50LFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCBbc2VsZWN0ZWRPcHRpb25zLCBzZXRTZWxlY3RlZE9wdGlvbnNdID0gdXNlU3RhdGU8VE9wdGlvbltdPihbXSk7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8cmVhZG9ubHkgVE9wdGlvbltdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdCBsb2FkZWRWYWx1ZXNSZWYgPSB1c2VSZWY8VE9wdGlvbltdPihbXSk7XG4gIGNvbnN0IGlzSW5pdGlhbFBvcHVsYXRpb25BY3RpdmUgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGluaXRpYWxMb2FkQ29tcGxldGVSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICAvLyBTdG9yZSBzZWxlY3RlZCBvcHRpb25zIGluIGEgcmVmIHNvIEVmZmVjdCAyIGNhbiBhY2Nlc3Mgd2l0aG91dCBkZXBlbmRlbmN5XG4gIGNvbnN0IHNlbGVjdGVkT3B0aW9uc1JlZiA9IHVzZVJlZjxUT3B0aW9uW10+KFtdKTtcblxuICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pID0+IChvcHRpb24gPyBTdHJpbmcob3B0aW9uW3ZhbHVlRmllbGRdKSA6ICcnKSxcbiAgICBbdmFsdWVGaWVsZF1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pID0+IChvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGRdKSA6ICcnKSxcbiAgICBbbGFiZWxGaWVsZF1cbiAgKTtcblxuICBjb25zdCBmZXRjaERhdGEgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBkZWJvdW5jZShcbiAgICAgICAgKFxuICAgICAgICAgIHBheWxvYWQ6IEFzeW5jTXVsdGlTZWxlY3RQYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4gdm9pZFxuICAgICAgICApID0+IHtcbiAgICAgICAgICBxdWVyeUZuKHBheWxvYWQpLnRoZW4oYyA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkge1xuICAgICAgICAgICAgICBjYWxsYmFjayhjKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGMgJiZcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSgoYyBhcyB7IGRhdGE6IHJlYWRvbmx5IFRPcHRpb25bXSB9KS5kYXRhKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKFxuICAgICAgICAgICAgICAgIChjIGFzIHsgZGF0YTogcmVhZG9ubHkgVE9wdGlvbltdIH0pLmRhdGEgYXMgcmVhZG9ubHkgVE9wdGlvbltdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBjICYmXG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoKGMgYXMgeyBEYXRhOiByZWFkb25seSBUT3B0aW9uW10gfSkuRGF0YSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICAgICAgICAoYyBhcyB7IERhdGE6IHJlYWRvbmx5IFRPcHRpb25bXSB9KS5EYXRhIGFzIHJlYWRvbmx5IFRPcHRpb25bXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICA0MDBcbiAgICAgICksXG4gICAgW3F1ZXJ5Rm5dXG4gICk7XG5cbiAgLy8gU3luYyByZWYgd2hlbmV2ZXIgc2VsZWN0ZWRPcHRpb25zIGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZWxlY3RlZE9wdGlvbnNSZWYuY3VycmVudCA9IHNlbGVjdGVkT3B0aW9ucztcbiAgfSwgW3NlbGVjdGVkT3B0aW9uc10pO1xuXG4gIC8vIEVmZmVjdCAxOiBTeW5jIHdpdGggZXh0ZXJuYWwgZmllbGQudmFsdWUgY2hhbmdlcyBmcm9tIHJlYWN0LWhvb2stZm9ybSAoSU5JVElBTCBMT0FEIE9OTFkpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZm9ybVZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpID8gZmllbGQudmFsdWUgOiBbXTtcblxuICAgIC8vIENoZWNrIGlmIGluaXRpYWwgbG9hZCBpcyBjb21wbGV0ZSBhbmQgY3VycmVudCBmb3JtIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgbG9hZGVkIG9uZXMuXG4gICAgLy8gSWYgc28sIG5vIG5lZWQgdG8gcmVmZXRjaCBmb3IgaW5pdGlhbCBwb3B1bGF0aW9uLlxuICAgIGlmIChcbiAgICAgIGluaXRpYWxMb2FkQ29tcGxldGVSZWYuY3VycmVudCAmJlxuICAgICAgSlNPTi5zdHJpbmdpZnkoZm9ybVZhbHVlcykgPT09IEpTT04uc3RyaW5naWZ5KGxvYWRlZFZhbHVlc1JlZi5jdXJyZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBmb3JtIHZhbHVlcywgcmVzZXQgYW5kIG1hcmsgaW5pdGlhbCBsb2FkIGFzIGNvbXBsZXRlLlxuICAgIGlmIChmb3JtVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb25zKFtdKTtcbiAgICAgIHNldE9wdGlvbnMoW10pO1xuICAgICAgbG9hZGVkVmFsdWVzUmVmLmN1cnJlbnQgPSBbXTtcbiAgICAgIGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIGluaXRpYWxMb2FkQ29tcGxldGVSZWYuY3VycmVudCA9IHRydWU7IC8vIE1hcmsgYXMgY29tcGxldGUgYXMgdGhlcmUncyBub3RoaW5nIHRvIGZldGNoXG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHByb2NlZWQgaWYgZm9ybVZhbHVlcyBhcmUgcHJlc2VudCBhbmQgd2UgaGF2ZW4ndCBjb21wbGV0ZWQgdGhlIGluaXRpYWwgbG9hZCBmb3IgdGhlc2Ugc3BlY2lmaWMgdmFsdWVzXG4gICAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgIGlzSW5pdGlhbFBvcHVsYXRpb25BY3RpdmUuY3VycmVudCA9IHRydWU7XG4gICAgLy8gU2V0IGxvYWRlZFZhbHVlc1JlZiBpbW1lZGlhdGVseSB0byBwcmV2ZW50IHJlLXRyaWdnZXJpbmcgd2l0aCB0aGUgc2FtZSB2YWx1ZXNcbiAgICBsb2FkZWRWYWx1ZXNSZWYuY3VycmVudCA9IGZvcm1WYWx1ZXM7XG4gICAgLy8gTWFyayBpbml0aWFsIGxvYWQgYXMgY29tcGxldGUgcHJvYWN0aXZlbHkgYmVmb3JlIGZldGNoaW5nIHRvIHByZXZlbnQgbXVsdGlwbGUgY2FsbHNcbiAgICBpbml0aWFsTG9hZENvbXBsZXRlUmVmLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgZmV0Y2hEYXRhKHsgUXVlcnk6IG51bGwsIFNlbGVjdGVkVmFsdWU6IGZvcm1WYWx1ZXMgfSwgcmVzdWx0cyA9PiB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IGZldGNoZWRPcHRpb25zID0gcmVzdWx0cyB8fCBbXTtcblxuICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbnMoWy4uLmZldGNoZWRPcHRpb25zXSk7XG4gICAgICAgIHNldE9wdGlvbnMoZmV0Y2hlZE9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIGlzSW5pdGlhbFBvcHVsYXRpb25BY3RpdmUuY3VycmVudCA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtmaWVsZC52YWx1ZSwgZmV0Y2hEYXRhXSk7XG5cbiAgLy8gRWZmZWN0IDI6IEhhbmRsZSB1c2VyIHNlYXJjaCBpbnB1dFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIERvbid0IHNlYXJjaCBkdXJpbmcgaW5pdGlhbCBwb3B1bGF0aW9uXG4gICAgaWYgKGlzSW5pdGlhbFBvcHVsYXRpb25BY3RpdmUuY3VycmVudCB8fCAhaW5pdGlhbExvYWRDb21wbGV0ZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgaW5wdXQgaXMgZW1wdHksIGp1c3Qgc2hvdyB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuICAgIGlmICghaW5wdXRWYWx1ZSkge1xuICAgICAgLy8gSWYgbm8gb3B0aW9ucyBhcmUgc2VsZWN0ZWQsIGNsZWFyIHRoZSBvcHRpb25zIHRvIGRpc3BsYXkgXCJub09wdGlvbnNUZXh0XCJcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbnNSZWYuY3VycmVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2V0T3B0aW9ucyhbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UsIHNob3cgdGhlIHNlbGVjdGVkIG9wdGlvbnNcbiAgICAgICAgc2V0T3B0aW9ucyhzZWxlY3RlZE9wdGlvbnNSZWYuY3VycmVudCk7XG4gICAgICB9XG5cbiAgICAgIGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZi5jdXJyZW50ID0gbnVsbDtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgZmV0Y2ggaWYgdGhlIGlucHV0IHZhbHVlIGhhcyBjaGFuZ2VkXG4gICAgaWYgKGlucHV0VmFsdWUgPT09IGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuXG4gICAgZmV0Y2hEYXRhKHsgUXVlcnk6IGlucHV0VmFsdWUsIFNlbGVjdGVkVmFsdWU6IG51bGwgfSwgc2VhcmNoUmVzdWx0cyA9PiB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBzZWFyY2hSZXN1bHRzIHx8IFtdO1xuICAgICAgICAvLyBVc2UgcmVmIHRvIGdldCBjdXJyZW50IHNlbGVjdGVkIG9wdGlvbnMgd2l0aG91dCBhZGRpbmcgdG8gZGVwZW5kZW5jaWVzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZCA9IHNlbGVjdGVkT3B0aW9uc1JlZi5jdXJyZW50O1xuICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgY3VycmVudFNlbGVjdGVkLm1hcChvcHQgPT4gZ2V0T3B0aW9uVmFsdWUob3B0KSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSBbLi4uY3VycmVudFNlbGVjdGVkXTtcblxuICAgICAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIXNlbGVjdGVkT3B0aW9uSWRzLmhhcyhnZXRPcHRpb25WYWx1ZShyZXN1bHQpKSkge1xuICAgICAgICAgICAgY29tYmluZWQucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNldE9wdGlvbnMoY29tYmluZWQpO1xuICAgICAgICBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYuY3VycmVudCA9IGlucHV0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gICAgLy8gQ1JJVElDQUw6IFJlbW92ZWQgc2VsZWN0ZWRPcHRpb25zIGZyb20gZGVwZW5kZW5jaWVzIC0gdXNlIHJlZiBpbnN0ZWFkXG4gIH0sIFtpbnB1dFZhbHVlLCBmZXRjaERhdGEsIGdldE9wdGlvblZhbHVlXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKF86IFN5bnRoZXRpY0V2ZW50LCBuZXdTZWxlY3RlZE9wdGlvbnM6IFRPcHRpb25bXSkgPT4ge1xuICAgIHNldFNlbGVjdGVkT3B0aW9ucyhuZXdTZWxlY3RlZE9wdGlvbnMpO1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ld1NlbGVjdGVkT3B0aW9ucy5tYXAoYyA9PiBjW3ZhbHVlRmllbGRdKTtcblxuICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlcy5sZW5ndGggPT09IDAgPyBudWxsIDogbmV3VmFsdWVzKTtcbiAgICBsb2FkZWRWYWx1ZXNSZWYuY3VycmVudCA9IG5ld1ZhbHVlcyBhcyB1bmtub3duIGFzIFRPcHRpb25bXTtcbiAgICBzZXRPcHRpb25zKG5ld1NlbGVjdGVkT3B0aW9ucyk7XG4gICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgLy8gQ2xlYXIgbGFzdCBzZWFyY2ggdGVybSB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmLmN1cnJlbnQgPSBudWxsO1xuICB9O1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gZGlzYWJsZWQgPz8gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZF0pO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgbXVsdGlwbGVcbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWwpXG4gICAgICB9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgdmFsdWU9e3NlbGVjdGVkT3B0aW9uc31cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgZmlsdGVyT3B0aW9ucz17eCA9PiB4fVxuICAgICAgbm9PcHRpb25zVGV4dD1cIlR5cGUgU29tZXRoaW5nLi4uXCJcbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBzeD17e1xuICAgICAgICAnJi5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlJbnB1dEJhc2Utcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQsXG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmLk11aS1kaXNhYmxlZCAuTXVpQXV0b2NvbXBsZXRlLXBvcHVwSW5kaWNhdG9yJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCAuTXVpT3V0bGluZWRJbnB1dC1ub3RjaGVkT3V0bGluZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUZpbGxlZElucHV0LXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9eyhfLCBuZXdJbnB1dFZhbHVlKSA9PiBzZXRJbnB1dFZhbHVlKG5ld0lucHV0VmFsdWUpfVxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgSW5wdXRQcm9wcz17e1xuICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfX1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgcmVuZGVyT3B0aW9uPXsocHJvcHMsIG9wdGlvbiwgc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIC4uLm9wdGlvblByb3BzIH0gPVxuICAgICAgICAgIHByb3BzIGFzIEhUTUxBdHRyaWJ1dGVzPEhUTUxMSUVsZW1lbnQ+ICYgeyBrZXk6IHN0cmluZyB9O1xuICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IGdldE9wdGlvbkxhYmVsKG9wdGlvbik7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBtYXRjaChvcHRpb25MYWJlbCwgc3RhdGUuaW5wdXRWYWx1ZSwge1xuICAgICAgICAgIGluc2lkZVdvcmRzOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZShvcHRpb25MYWJlbCwgbWF0Y2hlcyk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8bGkga2V5PXtrZXl9IHsuLi5vcHRpb25Qcm9wc30+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICB7cGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogcGFydC5oaWdobGlnaHQgPyA3MDAgOiA0MDAsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0LnRleHR9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oe1xuICBncmlkUHJvcHMsXG4gIC4uLnByb3BzXG59OiBBc3luY011bHRpU2VsZWN0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVE9wdGlvblxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj5cbiAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgIC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj4gey4uLnByb3BzfSAvPlxuICApO1xufTtcblxuQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnQXN5bmNTZWxlY3RNdWx0aSc7XG5cbmV4cG9ydCB7IEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50IH07XG4iLCAiaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzLCBQYXRoVmFsdWUgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgQ2hlY2tib3hFbGVtZW50UHJvcHMgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ2hlY2tib3hFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBDaGVja2JveEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGxhYmVsLFxuICAgIGxhYmVsUHJvcHMsXG4gICAgaGVscGVyVGV4dCxcbiAgICBwYXJzZUVycm9yLFxuICAgIHRyYW5zZm9ybSxcbiAgICBkaXNhYmxlZCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkaXNhYmxlZCxcbiAgfSk7XG5cbiAgaWYgKGZpZWxkLnZhbHVlID09IG51bGwgfHwgZmllbGQudmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgZmllbGQub25DaGFuZ2UoZmFsc2UpO1xuICB9XG5cbiAgY29uc3QgY3VzdG9tT3V0cHV0VHJhbnNmb3JtID0gdHJhbnNmb3JtPy5vdXRwdXQ7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBib29sZWFuPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiB2YWx1ZSA9PiAhIXZhbHVlLFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgY3VzdG9tT3V0cHV0VHJhbnNmb3JtID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyAoZXZlbnRPclZhbHVlLCBfdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgLy8gQWRhcHRlcjogRXh0cmFjdCBldmVudCBhbmQgY2hlY2tlZCBmcm9tIHRoZSBjaGVja2JveCBvbkNoYW5nZSBzaWduYXR1cmVcbiAgICAgICAgICAgICAgLy8gQ2hlY2tib3hFbGVtZW50IHBhc3NlcyAoZXZlbnQsIGNoZWNrZWQpLCBidXQgdXNlVHJhbnNmb3JtIGV4cGVjdHMgKGV2ZW50T3JWYWx1ZSwgdmFsdWUpXG4gICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRPclZhbHVlIGFzIFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gX3ZhbHVlIGFzIHVua25vd24gYXMgYm9vbGVhbjtcblxuICAgICAgICAgICAgICByZXR1cm4gY3VzdG9tT3V0cHV0VHJhbnNmb3JtKGV2ZW50LCBjaGVja2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IChldmVudE9yVmFsdWUsIF92YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAvLyBEZWZhdWx0OiBleHRyYWN0IGNoZWNrZWQgc3RhdGUgZnJvbSB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gX3ZhbHVlIGFzIHVua25vd24gYXMgYm9vbGVhbjtcblxuICAgICAgICAgICAgICByZXR1cm4gY2hlY2tlZCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChcbiAgICBldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4sXG4gICAgY2hlY2tlZDogYm9vbGVhblxuICApID0+IHtcbiAgICBvbkNoYW5nZShldmVudCwgY2hlY2tlZCk7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQsIGNoZWNrZWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBkaXNwbGF5RXJyb3I6IFJlYWN0Tm9kZSA9IGVycm9yXG4gICAgPyB0eXBlb2YgcGFyc2VFcnJvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBwYXJzZUVycm9yKGVycm9yKVxuICAgICAgOiBlcnJvci5tZXNzYWdlXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfSBkaXNhYmxlZD17ZGlzYWJsZWR9PlxuICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgbGFiZWw9e2xhYmVsIHx8ICcnfVxuICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgY29sb3I9e3Jlc3QuY29sb3IgfHwgJ3ByaW1hcnknfVxuICAgICAgICAgICAgICBjaGVja2VkPXt2YWx1ZX1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICB7KGRpc3BsYXlFcnJvciB8fCBoZWxwZXJUZXh0KSAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICAgICAge2Rpc3BsYXlFcnJvciB8fCBoZWxwZXJUZXh0fVxuICAgICAgICA8L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIENoZWNrYm94IGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGFuZCBncmlkIGxheW91dC5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgY2hlY2tib3ggaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgdmFsdWUgdHJhbnNmb3JtYXRpb24sIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24gd2l0aCB1c2VDb250cm9sbGVyXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5IHdpdGggY3VzdG9tIHBhcnNpbmcgc3VwcG9ydFxuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiB3aXRoIHVzZVRyYW5zZm9ybSBob29rIGZvciBib29sZWFuIHZhbHVlc1xuICogLSBDdXN0b21pemFibGUgbGFiZWwgYW5kIHBvc2l0aW9uaW5nXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXIgd2l0aCByZXNwb25zaXZlIGRlc2lnblxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5IHdpdGggZ2VuZXJpYyBjb25zdHJhaW50c1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0IHdpdGggcHJvcGVyIHRoZW1pbmdcbiAqIC0gSGVscGVyIHRleHQgc3VwcG9ydCBmb3IgYWRkaXRpb25hbCBjb250ZXh0XG4gKiAtIEN1c3RvbSBlcnJvciBwYXJzaW5nIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvblxuICogLSBTaW1wbGUgYm9vbGVhbiB2YWx1ZSBoYW5kbGluZyB3aXRoIG9wdGlvbmFsIGN1c3RvbSB0cmFuc2Zvcm1zXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhY2NlcHRUZXJtc1wiXG4gKiAgIGxhYmVsPVwiSSBhZ3JlZSB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnNcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHZhbGlkYXRpb24gYW5kIGhlbHBlciB0ZXh0OlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJuZXdzbGV0dGVyXCJcbiAqICAgbGFiZWw9XCJTdWJzY3JpYmUgdG8gbmV3c2xldHRlclwiXG4gKiAgIGhlbHBlclRleHQ9XCJZb3UgY2FuIHVuc3Vic2NyaWJlIGF0IGFueSB0aW1lXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdQbGVhc2UgYWNjZXB0IHRvIGNvbnRpbnVlJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZ3JpZCBsYXlvdXQgYW5kIHN0eWxpbmc6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImlzUHVibGljXCJcbiAqICAgbGFiZWw9XCJNYWtlIHRoaXMgcHVibGljXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIGxhYmVsUHJvcHM9e3sgc3g6IHsgZm9udFdlaWdodDogJ2JvbGQnIH0gfX1cbiAqICAgc3g9e3sgY29sb3I6ICdwcmltYXJ5Lm1haW4nIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggdmFsdWUgdHJhbnNmb3JtYXRpb24gKHN0cmluZyB0byBib29sZWFuKTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwic3RhdHVzXCJcbiAqICAgbGFiZWw9XCJBY3RpdmVcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZSA9PT0gJ2FjdGl2ZScsXG4gKiAgICAgb3V0cHV0OiAoY2hlY2tlZCkgPT4gY2hlY2tlZCA/ICdhY3RpdmUnIDogJ2luYWN0aXZlJ1xuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBTaW1wbGUgYm9vbGVhbiBmaWVsZDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiaXNFbmFibGVkXCJcbiAqICAgbGFiZWw9XCJFbmFibGUgZmVhdHVyZVwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBlcnJvciBwYXJzaW5nIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbjpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidGVybXNcIlxuICogICBsYWJlbD1cIkFjY2VwdCBUZXJtc1wiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gdChgdmFsaWRhdGlvbi4ke2Vycm9yLnR5cGV9YCwgeyBmaWVsZDogJ1Rlcm1zJyB9KX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IENoZWNrYm94RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWU+IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5leHBvcnQgeyBDaGVja2JveEVsZW1lbnQgfTtcblxuZXhwb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgQ2hlY2tib3hQcm9wcyxcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBGb3JtTGFiZWxQcm9wcyxcbiAgR3JpZFByb3BzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIENoZWNrYm94LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgRm9ybUxhYmVsLFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIENoZWNrYm94R3JvdXAgY29tcG9uZW50XG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHZhbHVlIGFycmF5IHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cblxuLy8gVHlwZSBmb3IgcHJpbWl0aXZlIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIHJhZGlvIGJ1dHRvbiB2YWx1ZXNcbnR5cGUgUHJpbWl0aXZlVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBDb25zdHJhaW50IHRvIGVuc3VyZSBvcHRpb24gb2JqZWN0cyBoYXZlIHRoZSByZXF1aXJlZCBrZXlzXG50eXBlIE9wdGlvbk9iamVjdDxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBQcmltaXRpdmVWYWx1ZT4gJlxuICBSZWNvcmQ8VExhYmVsS2V5LCBzdHJpbmc+ICZcbiAgUGFydGlhbDxSZWNvcmQ8VERpc2FibGVkS2V5LCBib29sZWFuPj47XG5cbmV4cG9ydCB0eXBlIENoZWNrYm94R3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+ID0gT21pdDxDaGVja2JveFByb3BzLCAnbmFtZSc+ICYge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICovXG4gIG5hbWU6IFROYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuXG4gIC8qKlxuICAgKiBMYWJlbCBmb3IgdGhlIGNoZWNrYm94IGdyb3VwXG4gICAqL1xuICBsYWJlbD86IEZvcm1Db250cm9sTGFiZWxQcm9wc1snbGFiZWwnXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgRm9ybUNvbnRyb2xMYWJlbFxuICAgKi9cbiAgbGFiZWxQcm9wcz86IE9taXQ8Rm9ybUNvbnRyb2xMYWJlbFByb3BzLCAnbGFiZWwnIHwgJ2NvbnRyb2wnPjtcblxuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyXG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuXG4gIG9wdGlvbnM6IFRPcHRpb25bXTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBmb3JtTGFiZWxQcm9wcz86IE9taXQ8Rm9ybUxhYmVsUHJvcHMsICdyZXF1aXJlZCcgfCAnZXJyb3InPjtcblxuICBsYWJlbEtleT86IFRMYWJlbEtleTtcbiAgdmFsdWVLZXk/OiBUVmFsdWVLZXk7XG4gIGRpc2FibGVkS2V5PzogVERpc2FibGVkS2V5O1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ2hlY2tib3hHcm91cDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+KFxuICBwcm9wczogQ2hlY2tib3hHcm91cFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUT3B0aW9uLFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID5cbikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGxhYmVsLFxuICAgIHJlcXVpcmVkLFxuICAgIGZvcm1MYWJlbFByb3BzLFxuICAgIGxhYmVsUHJvcHMsXG4gICAgbGFiZWxLZXkgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUtleSA9ICdWYWx1ZScgYXMgVFZhbHVlS2V5LFxuICAgIG9wdGlvbnMsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkaXNhYmxlZDogcmVzdC5kaXNhYmxlZCxcbiAgfSk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXNBc1N0cmluZyA9IChcbiAgICBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKSA/IGZpZWxkLnZhbHVlIDogW11cbiAgKS5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VkVmFsdWVTdHJpbmcgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcblxuICAgICAgY29uc3QgbmV3U2VsZWN0ZWRWYWx1ZXNTdHJpbmcgPSBpc0NoZWNrZWRcbiAgICAgICAgPyBbLi4uc2VsZWN0ZWRWYWx1ZXNBc1N0cmluZywgY2hhbmdlZFZhbHVlU3RyaW5nXVxuICAgICAgICA6IHNlbGVjdGVkVmFsdWVzQXNTdHJpbmcuZmlsdGVyKHYgPT4gdiAhPT0gY2hhbmdlZFZhbHVlU3RyaW5nKTtcblxuICAgICAgY29uc3Qgb3B0aW9uc0FyZU51bWVyaWMgPVxuICAgICAgICBvcHRpb25zLmxlbmd0aCA+IDAgJiYgdHlwZW9mIG9wdGlvbnNbMF1bdmFsdWVLZXldID09PSAnbnVtYmVyJztcblxuICAgICAgaWYgKG9wdGlvbnNBcmVOdW1lcmljKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlc0FzTnVtYmVycyA9IG5ld1NlbGVjdGVkVmFsdWVzU3RyaW5nXG4gICAgICAgICAgLm1hcCh2ID0+IHBhcnNlSW50KHYsIDEwKSlcbiAgICAgICAgICAuZmlsdGVyKHYgPT4gIWlzTmFOKHYpKTtcblxuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXNBc051bWJlcnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3U2VsZWN0ZWRWYWx1ZXNTdHJpbmcpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLCBvcHRpb25zLCB2YWx1ZUtleSwgc2VsZWN0ZWRWYWx1ZXNBc1N0cmluZ11cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICB7bGFiZWwgJiYgKFxuICAgICAgICA8Rm9ybUxhYmVsIHsuLi5mb3JtTGFiZWxQcm9wc30gcmVxdWlyZWQ9e3JlcXVpcmVkfSBlcnJvcj17ISFlcnJvcn0+XG4gICAgICAgICAge2xhYmVsfVxuICAgICAgICA8L0Zvcm1MYWJlbD5cbiAgICAgICl9XG4gICAgICA8Rm9ybUdyb3VwIHJvdz5cbiAgICAgICAge29wdGlvbnMgJiZcbiAgICAgICAgICBvcHRpb25zLm1hcChvcHRpb24gPT4gKFxuICAgICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICAgICAga2V5PXtgJHtvcHRpb25bdmFsdWVLZXldfWB9XG4gICAgICAgICAgICAgIGxhYmVsPXtvcHRpb25bbGFiZWxLZXldfVxuICAgICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgICAgIGNvbG9yPXtyZXN0LmNvbG9yIHx8ICdwcmltYXJ5J31cbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtvcHRpb25bdmFsdWVLZXldfVxuICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRWYWx1ZXNBc1N0cmluZy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgU3RyaW5nKG9wdGlvblt2YWx1ZUtleV0pXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3I9eyEhZXJyb3J9PntlcnJvci5tZXNzYWdlfTwvRm9ybUhlbHBlclRleHQ+XG4gICAgICApfVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQ2hlY2tib3hHcm91cCBjb21wb25lbnQgZm9yIG11bHRpcGxlIGNoZWNrYm94IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGdyb3VwIG9mIGNoZWNrYm94ZXMgdGhhdCB3b3JrIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBtYW5hZ2luZyBhbiBhcnJheSBvZiBzZWxlY3RlZCB2YWx1ZXMgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIE11bHRpcGxlIGNoZWNrYm94IHNlbGVjdGlvbiB3aXRoIGFycmF5IHZhbHVlIG1hbmFnZW1lbnRcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIERpc2FibGVkIHN0YXRlIHN1cHBvcnRcbiAqIC0gTmFOIHZhbGlkYXRpb24gZm9yIG51bWVyaWMgdmFsdWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hHcm91cFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwic2VsZWN0ZWRDYXRlZ29yaWVzXCJcbiAqICAgb3B0aW9ucz17W1xuICogICAgIHsgVmFsdWU6IDEsIExhYmVsOiAnQ2F0ZWdvcnkgMScgfSxcbiAqICAgICB7IFZhbHVlOiAyLCBMYWJlbDogJ0NhdGVnb3J5IDInIH0sXG4gKiAgICAgeyBWYWx1ZTogMywgTGFiZWw6ICdDYXRlZ29yeSAzJyB9LFxuICogICBdfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94R3JvdXBcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInBlcm1pc3Npb25zXCJcbiAqICAgb3B0aW9ucz17cGVybWlzc2lvbk9wdGlvbnN9XG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBkaXNhYmxlZD17IWhhc0VkaXRQZXJtaXNzaW9ufVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB2YWx1ZSBhcnJheSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBDaGVja2JveEdyb3VwRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBDaGVja2JveEdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRPcHRpb24sXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBURGlzYWJsZWRLZXlcbj4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5DaGVja2JveEdyb3VwRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdDaGVja2JveEdyb3VwJztcblxuZXhwb3J0IHsgQ2hlY2tib3hHcm91cEVsZW1lbnQgfTtcbiIsICJpbXBvcnQgeyBHcmlkIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudENvcmUgfSBmcm9tIFwiLi9EYXRlUGlja2VyRWxlbWVudENvcmVcIjtcbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlckVsZW1lbnRQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQSBmdWxseS1mZWF0dXJlZCwgdHlwZS1zYWZlIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCBmb3IgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IGNvbWJpbmVzIHRoZSBjb3JlIGRhdGUgcGlja2VyIGZ1bmN0aW9uYWxpdHkgd2l0aCBvcHRpb25hbCBHcmlkIGxheW91dCB3cmFwcGluZyxcbiAqIHByb3ZpZGluZyBhIGNvbXBsZXRlIHNvbHV0aW9uIGZvciBmb3JtLWJhc2VkIGRhdGUgc2VsZWN0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBUeXBlU2NyaXB0IHN1cHBvcnQuXG4gKlxuICogS2V5IEZlYXR1cmVzOlxuICogLSBcdUQ4M0NcdURGQUYgKipUeXBlIFNhZmV0eSoqOiBGdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBmb3JtIGZpZWxkIHR5cGVzIGFuZCBkYXRlIHZhbHVlc1xuICogLSBcdUQ4M0RcdUREMjcgKipSZWFjdCBIb29rIEZvcm0gSW50ZWdyYXRpb24qKjogU2VhbWxlc3MgaW50ZWdyYXRpb24gd2l0aCByZWFjdC1ob29rLWZvcm0gdmFsaWRhdGlvblxuICogLSBcdUQ4M0NcdURGQTggKipUaGVtaW5nKio6IEF1dG9tYXRpYyBhZGFwdGF0aW9uIHRvIE1VSSB0aGVtZSB3aXRoIGN1c3RvbWl6YWJsZSBzdHlsZXNcbiAqIC0gXHUyNjdGICoqQWNjZXNzaWJpbGl0eSoqOiBXQ0FHLWNvbXBsaWFudCB3aXRoIHByb3BlciBBUklBIGF0dHJpYnV0ZXMgYW5kIGtleWJvYXJkIG5hdmlnYXRpb25cbiAqIC0gXHVEODNEXHVERTgwICoqUGVyZm9ybWFuY2UqKjogT3B0aW1pemVkIHdpdGggbWVtb2l6YXRpb24gYW5kIGVmZmljaWVudCByZS1yZW5kZXJpbmdcbiAqIC0gXHVEODNEXHVEQ0YxICoqUmVzcG9uc2l2ZSoqOiBCdWlsdC1pbiBHcmlkIGxheW91dCB3aXRoIGNvbmZpZ3VyYWJsZSBicmVha3BvaW50c1xuICogLSBcdUQ4M0RcdURFRTFcdUZFMEYgKipWYWxpZGF0aW9uKio6IENvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlc1xuICogLSBcdUQ4M0RcdUREMDQgKipUcmFuc2Zvcm1hdGlvbioqOiBGbGV4aWJsZSB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGZvcm0gYW5kIHBpY2tlciBmb3JtYXRzXG4gKiAtIFx1RDgzRFx1RENEQSAqKkRldmVsb3BlciBFeHBlcmllbmNlKio6IFJpY2ggVHlwZVNjcmlwdCBJbnRlbGxpU2Vuc2UgYW5kIGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGF1dG9tYXRpYyBHcmlkIHdyYXBwZXI6XG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZUZvcm0gfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuICogaW1wb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnQgfSBmcm9tICdAZ253ZWJzb2Z0L3VpL3dyYXBwZXJzJztcbiAqXG4gKiBmdW5jdGlvbiBNeUZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IGJpcnRoRGF0ZTogc3RyaW5nIH0+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+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuUmFkaW9CdXR0b25Hcm91cC5kaXNwbGF5TmFtZSA9ICdSYWRpb0J1dHRvbkdyb3VwJztcblxuZXhwb3J0IHsgUmFkaW9CdXR0b25Hcm91cCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIEF1dG9jb21wbGV0ZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmV4cG9ydCB0eXBlIFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gIHwgJ25hbWUnXG4gIHwgJ3JlbmRlcklucHV0J1xuICB8ICdpc09wdGlvbkVxdWFsVG9WYWx1ZSdcbiAgfCAnZ2V0T3B0aW9uTGFiZWwnXG4gIHwgJ2Rpc2FibGVkJ1xuPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGRlcGVuZHNPbjogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgaXNOdWxsYWJsZT86IGJvb2xlYW47XG4gIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQ/OiBib29sZWFuO1xuICBsYWJlbEZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgb3B0aW9ucz86IHJlYWRvbmx5IFRPcHRpb25bXSB8IG51bGw7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RDYXNjYWRlRWxlbWVudDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG4gIGNvbnN0IHtcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyxcbiAgICBuYW1lLFxuICAgIG9uQmx1cixcbiAgICBvbkNoYW5nZSxcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgY29udHJvbCxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgZGVwZW5kc09uLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBpc051bGxhYmxlID0gZmFsc2UsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCA9IGZhbHNlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVxdWlyZWQsIC4uLnJlc3RUZXh0UHJvcHMgfSA9IHRleHRGaWVsZFByb3BzO1xuICBjb25zdCBvcHRpb25zID0gdXNlTWVtbygoKSA9PiBvcHRpb25zSW5wdXQgfHwgW10sIFtvcHRpb25zSW5wdXRdKTtcblxuICBjb25zdCBnZXRPcHRpb25LZXkgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3B0aW9uID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICAgIGNvbnN0IGtleSA9IG9wdGlvbiA/IG9wdGlvblt2YWx1ZUZpZWxkIGFzIGtleW9mIFRPcHRpb25dIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5ICE9PSBudWxsID8gU3RyaW5nKGtleSkgOiAnJztcbiAgICB9LFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkIGFzIGtleW9mIFRPcHRpb25dKSA6ICcnO1xuICAgIH0sXG4gICAgW2xhYmVsRmllbGRdXG4gICk7XG5cbiAgY29uc3QgaXNPcHRpb25FcXVhbFRvVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uLCB2YWx1ZTogVE9wdGlvbikgPT5cbiAgICBnZXRPcHRpb25LZXkob3B0aW9uKSA9PT0gZ2V0T3B0aW9uS2V5KHZhbHVlKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB7IGZpZWxkOiBkZXBlbmRlbnRGaWVsZCB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZTogZGVwZW5kc09uLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmVudFZhbHVlUmVmID0gdXNlUmVmKGRlcGVuZGVudEZpZWxkLnZhbHVlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwYXJlbnRWYWx1ZVJlZi5jdXJyZW50ICE9PSBkZXBlbmRlbnRGaWVsZC52YWx1ZSkge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICBwYXJlbnRWYWx1ZVJlZi5jdXJyZW50ID0gZGVwZW5kZW50RmllbGQudmFsdWU7XG4gICAgfVxuICB9LCBbZGVwZW5kZW50RmllbGQudmFsdWUsIGZpZWxkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZURlZmF1bHRTZWxlY3RlZCAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiBmaWVsZC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLCBvcHRpb25zLmxlbmd0aF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFzVmFsdWUgPVxuICAgICAgZmllbGQudmFsdWUgIT09IG51bGwgJiYgZmllbGQudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWVsZC52YWx1ZSAhPT0gJyc7XG5cbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgIWhhc1ZhbHVlICYmICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKGdldE9wdGlvbktleShvcHRpb25zWzBdKSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW1xuICAgIG9wdGlvbnMsXG4gICAgZGlzYWJsZWQsXG4gICAgZ2V0T3B0aW9uS2V5LFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQsXG4gIF0pO1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybiB0cnVlO1xuICAgIGlmIChcbiAgICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlID09PSBudWxsIHx8XG4gICAgICBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PT0gJydcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaXNOdWxsYWJsZSAmJiAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbXG4gICAgZGlzYWJsZWQsXG4gICAgZGVwZW5kZW50RmllbGQudmFsdWUsXG4gICAgb3B0aW9ucy5sZW5ndGgsXG4gICAgaXNOdWxsYWJsZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLFxuICBdKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgdmFsdWU9e1xuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgLm1hcChvcHRpb24gPT4gKGdldE9wdGlvbktleShvcHRpb24pID09PSBmaWVsZC52YWx1ZSA/IG9wdGlvbiA6IG51bGwpKVxuICAgICAgICAgIC5maW5kKEJvb2xlYW4pIHx8IG51bGxcbiAgICAgIH1cbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25LZXl9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17aXNPcHRpb25FcXVhbFRvVmFsdWV9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBvbkNoYW5nZT17KGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlID8gZ2V0T3B0aW9uS2V5KG5ld1ZhbHVlKSA6IG51bGwpO1xuICAgICAgICBpZiAob25DaGFuZ2UgJiYgdHlwZW9mIG9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25DaGFuZ2UoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgU2VsZWN0Q2FzY2FkZUVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWVcbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblNlbGVjdENhc2NhZGVFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdENhc2NhZGVFbGVtZW50JztcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIFRleHRGaWVsZFByb3BzLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZVZhbHVlLFxuICBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIEF1dG9jb21wbGV0ZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5pbXBvcnQgeyB1c2VNZW1vLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5leHBvcnQgdHlwZSBTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gIHwgJ25hbWUnXG4gIHwgJ3JlbmRlcklucHV0J1xuICB8ICdpc09wdGlvbkVxdWFsVG9WYWx1ZSdcbiAgfCAnZ2V0T3B0aW9uTGFiZWwnXG4gIHwgJ2Rpc2FibGVkJ1xuICB8ICdvcHRpb25zJ1xuPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIGlzTnVsbGFibGU/OiBib29sZWFuO1xuICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkPzogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBsYWJlbEZpZWxkPzogc3RyaW5nO1xuICB2YWx1ZUZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICBvcHRpb25zPzogcmVhZG9ubHkgVE9wdGlvbltdIHwgbnVsbDtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNlbGVjdEVsZW1lbnQ8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPihcbiAgcHJvcHM6IFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPlxuKSB7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkNoYW5nZSxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgbGFiZWwsXG4gICAgdmFyaWFudCxcbiAgICBkaXNhYmxlZCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyBhcyBrZXlvZiBUT3B0aW9uLFxuICAgIHZhbHVlRmllbGQgPSAnVmFsdWUnIGFzIGtleW9mIFRPcHRpb24sXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICBpc051bGxhYmxlID0gZmFsc2UsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCA9IGZhbHNlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVxdWlyZWQsIC4uLnJlc3RUZXh0UHJvcHMgfSA9IHRleHRGaWVsZFByb3BzO1xuICBjb25zdCBvcHRpb25zID0gdXNlTWVtbygoKSA9PiBvcHRpb25zSW5wdXQgfHwgW10sIFtvcHRpb25zSW5wdXRdKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24gfCBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZzxGcmVlU29sbz4pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvblt2YWx1ZUZpZWxkIGFzIGtleW9mIFRPcHRpb25dIDogbnVsbDtcbiAgICB9LFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkIGFzIGtleW9mIFRPcHRpb25dKSA6ICcnO1xuICAgIH0sXG4gICAgW2xhYmVsRmllbGRdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZURlZmF1bHRTZWxlY3RlZCAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiBmaWVsZC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLCBvcHRpb25zLmxlbmd0aF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFzVmFsdWUgPVxuICAgICAgZmllbGQudmFsdWUgIT09IG51bGwgJiYgZmllbGQudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWVsZC52YWx1ZSAhPT0gJyc7XG5cbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgIWhhc1ZhbHVlICYmICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKGdldE9wdGlvblZhbHVlKG9wdGlvbnNbMF0pKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXG4gICAgb3B0aW9ucyxcbiAgICBkaXNhYmxlZCxcbiAgICBnZXRPcHRpb25WYWx1ZSxcbiAgICBmaWVsZC5vbkNoYW5nZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLFxuICBdKTtcblxuICBjb25zdCBpc0Rpc2FibGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaXNOdWxsYWJsZSAmJiAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZClcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbZGlzYWJsZWQsIG9wdGlvbnMubGVuZ3RoLCBpc051bGxhYmxlLCBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkXSk7XG5cbiAgY29uc3QgYXV0b2NvbXBsZXRlVmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBvcHRpb25zLmZpbmQob3B0aW9uID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGZpZWxkLnZhbHVlKSA/PyBudWxsLFxuICAgIFtmaWVsZC52YWx1ZSwgb3B0aW9ucywgZ2V0T3B0aW9uVmFsdWVdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9ucz17ZmFsc2V9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgdmFsdWU9e1xuICAgICAgICBhdXRvY29tcGxldGVWYWx1ZSBhcyBBdXRvY29tcGxldGVWYWx1ZTxcbiAgICAgICAgICBUT3B0aW9uLFxuICAgICAgICAgIE11bHRpcGxlLFxuICAgICAgICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgICAgICAgRnJlZVNvbG9cbiAgICAgICAgPlxuICAgICAgfVxuICAgICAgb25DaGFuZ2U9eyhldmVudCwgbmV3VmFsdWUsIHJlYXNvbikgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBuZXdWYWx1ZSBhcyBUT3B0aW9uIHwgbnVsbDtcblxuICAgICAgICBmaWVsZC5vbkNoYW5nZShvcHRpb24gPyBnZXRPcHRpb25WYWx1ZShvcHRpb24pIDogbnVsbCk7XG4gICAgICAgIG9uQ2hhbmdlPy4oZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pO1xuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBnZXRPcHRpb25MYWJlbD17b3B0aW9uID0+IGdldE9wdGlvbkxhYmVsKG9wdGlvbil9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgICByZW5kZXJJbnB1dD17cGFyYW1zID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIEF1dG9jb21wbGV0ZSBjb21wb25lbnQgZm9yIHNlbGVjdGluZyBmcm9tIHByZWRlZmluZWQgb3B0aW9ucy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgc2VsZWN0L2F1dG9jb21wbGV0ZSBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHlcbiAqIHdpdGggcmVhY3QtaG9vay1mb3JtLCBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKiBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRzLiBJdCBzdXBwb3J0cyBib3RoIHNpbmdsZSBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGVzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvY29tcGxldGUgd2l0aCBmaWx0ZXJpbmdcbiAqIC0gU2luZ2xlIGFuZCBtdWx0aXBsZSBzZWxlY3Rpb24gc3VwcG9ydFxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBDdXN0b21pemFibGUgb3B0aW9uIGRpc3BsYXkgKGxhYmVsS2V5L3ZhbHVlS2V5KVxuICogLSBBdXRvLXNlbGVjdGlvbiB3aGVuIG9ubHkgb25lIG9wdGlvbiBleGlzdHNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJjYXRlZ29yeVwiXG4gKiAgIGxhYmVsPVwiQ2F0ZWdvcnlcIlxuICogICBvcHRpb25zPXtbXG4gKiAgICAgeyBMYWJlbDogJ1RlY2hub2xvZ3knLCBWYWx1ZTogJ3RlY2gnIH1cbiAqICAgXX1cbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdQbGVhc2Ugc2VsZWN0IGEgY2F0ZWdvcnknIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGtleXM6XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VySWRcIlxuICogICBsYWJlbD1cIkFzc2lnbiB0byBVc2VyXCJcbiAqICAgb3B0aW9ucz17dXNlcnN9XG4gKiAgIGxhYmVsS2V5PVwiZnVsbE5hbWVcIlxuICogICB2YWx1ZUtleT1cImlkXCJcbiAqICAgcGxhY2Vob2xkZXI9XCJDaG9vc2UgYSB1c2VyLi4uXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogTXVsdGlwbGUgc2VsZWN0aW9uOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidGFnc1wiXG4gKiAgIGxhYmVsPVwiVGFnc1wiXG4gKiAgIG9wdGlvbnM9e2F2YWlsYWJsZVRhZ3N9XG4gKiAgIG11bHRpcGxlXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDggfSB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBUT3B0aW9uIC0gVGhlIG9wdGlvbiBvYmplY3QgdHlwZVxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgTXVsdGlwbGUgLSBXaGV0aGVyIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgRGlzYWJsZUNsZWFyYWJsZSAtIFdoZXRoZXIgdGhlIGNsZWFyIGJ1dHRvbiBpcyBkaXNhYmxlZFxuICogQHRlbXBsYXRlIEZyZWVTb2xvIC0gV2hldGhlciBmcmVlIHRleHQgaW5wdXQgaXMgYWxsb3dlZFxuICogQHRlbXBsYXRlIENoaXBDb21wb25lbnQgLSBUaGUgY2hpcCBjb21wb25lbnQgdHlwZSBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgU2VsZWN0RWxlbWVudCA9IDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIE11bHRpcGxlLFxuICBEaXNhYmxlQ2xlYXJhYmxlLFxuICBGcmVlU29sbyxcbiAgQ2hpcENvbXBvbmVudFxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuU2VsZWN0RWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RFbGVtZW50JztcbiIsICJpbXBvcnQgQ2hlY2tCb3hJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2tCb3gnO1xuaW1wb3J0IENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0NoZWNrQm94T3V0bGluZUJsYW5rJztcbmltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb24sXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgR3JpZCxcbiAgQ2hlY2tib3gsXG4gIFRleHRGaWVsZCxcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICB1c2VUaGVtZSxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IFN5bnRoZXRpY0V2ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRnJhZ21lbnQsIHVzZUVmZmVjdCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxudHlwZSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gICduYW1lJyB8ICdyZW5kZXJJbnB1dCcgfCAnbXVsdGlwbGUnIHwgJ29uQ2hhbmdlJyB8ICd2YWx1ZSdcbj47XG5cbmV4cG9ydCB0eXBlIFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWUsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IEJhc2VBdXRvY29tcGxldGVQcm9wczxcbiAgVE9wdGlvbixcbiAgTXVsdGlwbGUsXG4gIERpc2FibGVDbGVhcmFibGUsXG4gIEZyZWVTb2xvLFxuICBDaGlwQ29tcG9uZW50XG4+ICYge1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGlzTnVsbGFibGU/OiBib29sZWFuO1xuICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkPzogYm9vbGVhbjtcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBsYWJlbEZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIG9wdGlvbnM/OiByZWFkb25seSBUT3B0aW9uW10gfCBudWxsO1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0TXVsdGlFbGVtZW50PFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIGlzTnVsbGFibGUsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCA9IHRydWUsXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IG9wdGlvbnMgPSB1c2VNZW1vKCgpID0+IG9wdGlvbnNJbnB1dCB8fCBbXSwgW29wdGlvbnNJbnB1dF0pO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSA6IG51bGw7XG4gIH07XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkIGFzIGtleW9mIFRPcHRpb25dKSA6ICcnO1xuICB9O1xuICBjb25zdCBpc0Rpc2FibGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaXNOdWxsYWJsZSAmJiAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZClcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbZGlzYWJsZWQsIG9wdGlvbnMubGVuZ3RoLCBpc051bGxhYmxlLCBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkXSk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9XG4gICAgZmllbGQudmFsdWUgJiYgQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSlcbiAgICAgID8gb3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IGZpZWxkLnZhbHVlLmluY2x1ZGVzKGdldE9wdGlvblZhbHVlKG9wdGlvbikpKVxuICAgICAgOiBbXTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlRGVmYXVsdFNlbGVjdGVkICYmIG9wdGlvbnMubGVuZ3RoID09PSAxICYmIGZpZWxkLnZhbHVlID09IG51bGwpIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgIH1cbiAgfSwgW2Rpc2FibGVEZWZhdWx0U2VsZWN0ZWQsIG9wdGlvbnMubGVuZ3RoXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYXNWYWx1ZSA9IEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpICYmIGZpZWxkLnZhbHVlLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgIWhhc1ZhbHVlICYmXG4gICAgICAhaXNOdWxsYWJsZSAmJlxuICAgICAgIWRpc2FibGVEZWZhdWx0U2VsZWN0ZWRcbiAgICApIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKFtnZXRPcHRpb25WYWx1ZShvcHRpb25zWzBdKV0pO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtcbiAgICBvcHRpb25zLFxuICAgIGdldE9wdGlvblZhbHVlLFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGlzTnVsbGFibGUsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCxcbiAgXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIF86IFN5bnRoZXRpY0V2ZW50LFxuICAgIHNlbGVjdGVkT3B0aW9uczogVE9wdGlvbltdLFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGlmIChyZWFzb24gPT09ICdjbGVhcicpIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSAnc2VsZWN0T3B0aW9uJyB8fCByZWFzb24gPT09ICdyZW1vdmVPcHRpb24nKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZXMgPSBzZWxlY3RlZE9wdGlvbnMubWFwKG9wdGlvbiA9PiBnZXRPcHRpb25WYWx1ZShvcHRpb24pKTtcblxuICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWVzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBuZXdWYWx1ZXMpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBpY29uID0gPENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG4gIGNvbnN0IGNoZWNrZWRJY29uID0gPENoZWNrQm94SWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgdmFsdWU9e3NlbGVjdGVkVmFsdWV9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIGRpc2FibGVDbG9zZU9uU2VsZWN0XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlbmRlck9wdGlvbj17KHByb3BzMSwgb3B0aW9uLCB7IHNlbGVjdGVkIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8bGkgey4uLnByb3BzMX0+XG4gICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgaWNvbj17aWNvbn1cbiAgICAgICAgICAgICAgY2hlY2tlZEljb249e2NoZWNrZWRJY29ufVxuICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7Z2V0T3B0aW9uTGFiZWwob3B0aW9uIGFzIFRPcHRpb24pfVxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgSW5wdXRQcm9wcz17e1xuICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfX1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lXG4+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+XG4gICk7XG59O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgdXNlRm9ya1JlZiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIFRpbWVQaWNrZXJQcm9wcyxcbiAgVGltZVBpY2tlclNsb3RQcm9wcyxcbiAgVGltZVZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgeyBUaW1lUGlja2VyIH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgcmVuZGVyVGltZVZpZXdDbG9jayB9IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMvdGltZVZpZXdSZW5kZXJlcnMnO1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkUGF0aCxcbiAgUGF0aFZhbHVlLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFZhbHVlcyxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICdAL2hvb2tzJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnQC90eXBlcyc7XG5pbXBvcnQgeyByZWFkVmFsdWVBc0RhdGUgfSBmcm9tICdAL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lUGlja2VyRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgVGltZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBpbnB1dFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgaGVscGVyVGV4dD86IFRleHRGaWVsZFByb3BzWydoZWxwZXJUZXh0J107XG4gIGxhYmVsPzogUmVhY3ROb2RlO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgc2xvdFByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyU2xvdFByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgICd0ZXh0RmllbGQnXG4gID47XG4gIHRyYW5zZm9ybT86IHtcbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWUgfCBudWxsO1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHRpbWVQaWNrZXJQcm9wcz86IE9taXQ8XG4gICAgVGltZVBpY2tlclByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgICd2YWx1ZScgfCAnc2xvdFByb3BzJ1xuICA+O1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFRpbWVQaWNrZXJFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ocHJvcHM6IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICByZXF1aXJlZCxcbiAgICBpbnB1dFByb3BzLFxuICAgIGNvbnRyb2wsXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgc2xvdFByb3BzLFxuICAgIHRpbWVQaWNrZXJQcm9wcyA9IHt9LFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBhZGFwdGVyID0gdXNlTG9jYWxpemF0aW9uQ29udGV4dCgpO1xuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgY29uc3QgeyBkaXNhYmxlZCwgaW5wdXRSZWYsIG9uQ2xvc2UsIC4uLnJlc3RUaW1lUGlja2VyUHJvcHMgfSA9XG4gICAgdGltZVBpY2tlclByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbiAgfSk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWUgfCBudWxsPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiBuZXdWYWx1ZSA9PiByZWFkVmFsdWVBc0RhdGUoYWRhcHRlciwgbmV3VmFsdWUpLFxuICAgICAgb3V0cHV0OiBkYXRhID0+IHtcbiAgICAgICAgaWYgKCFkYXlqcy5pc0RheWpzKGRhdGEpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGEgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGltZVBpY2tlclxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRpbWVQaWNrZXJQcm9wc31cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIG9wZW49e29wZW59XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB2aWV3UmVuZGVyZXJzPXt7XG4gICAgICAgIGhvdXJzOiByZW5kZXJUaW1lVmlld0Nsb2NrLFxuICAgICAgICBtaW51dGVzOiByZW5kZXJUaW1lVmlld0Nsb2NrLFxuICAgICAgICBzZWNvbmRzOiByZW5kZXJUaW1lVmlld0Nsb2NrLFxuICAgICAgfX1cbiAgICAgIG9uT3Blbj17KCkgPT4gc2V0T3Blbih0cnVlKX1cbiAgICAgIG9uQ2xvc2U9eyguLi5hcmdzKSA9PiB7XG4gICAgICAgIHNldE9wZW4oZmFsc2UpO1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgb25DbG9zZT8uKC4uLmFyZ3MpO1xuICAgICAgfX1cbiAgICAgIG9uQ2hhbmdlPXsobmV3VmFsdWUsIGNvbnRleHQpID0+IHtcbiAgICAgICAgb25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgICB0aW1lUGlja2VyUHJvcHMub25DaGFuZ2U/LihuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgICB9fVxuICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgICAgYWN0aW9uczogWydjbGVhcicsICdjYW5jZWwnLCAnYWNjZXB0J10sXG4gICAgICAgIH0sXG4gICAgICAgIHRleHRGaWVsZDoge1xuICAgICAgICAgIC4uLmlucHV0UHJvcHMsXG4gICAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgIHN4OiB7XG4gICAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgc2V0T3Blbih0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQmx1cjogKFxuICAgICAgICAgICAgZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgICAgIGlucHV0UHJvcHM/Lm9uQmx1cj8uKGV2ZW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAhIWVycm9yLFxuICAgICAgICAgIGhlbHBlclRleHQ6IGVycm9yXG4gICAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgIDogaW5wdXRQcm9wcz8uaGVscGVyVGV4dCB8fCByZXN0LmhlbHBlclRleHQsXG4gICAgICAgICAgaW5wdXRQcm9wczoge1xuICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICBpbnB1dE1vZGU6ICdub25lJyxcbiAgICAgICAgICAgIC4uLmlucHV0UHJvcHM/LmlucHV0UHJvcHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBUaW1lUGlja2VyRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBUaW1lUGlja2VyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5UaW1lUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdUaW1lUGlja2VyRWxlbWVudCc7XG4iLCAiaW1wb3J0IHtcbiAgQm94LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEZvcm1MYWJlbCxcbiAgR3JpZCxcbiAgU2xpZGVyLFxuICB0eXBlIEdyaWRQcm9wcyxcbiAgdHlwZSBTbGlkZXJQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZEVycm9yLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgU2xpZGVyRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xpZGVyRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+IHtcbiAgLyoqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtICovXG4gIG5hbWU6IFROYW1lO1xuICAvKiogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKiogVGhlIGlucHV0IGxhYmVsIHRleHQgKi9cbiAgbGFiZWw/OiBSZWFjdE5vZGU7XG4gIC8qKiBIZWxwZXIgdGV4dCB0byBkaXNwbGF5IGJlbG93IHRoZSBzbGlkZXIgKi9cbiAgaGVscGVyVGV4dD86IFJlYWN0Tm9kZTtcbiAgLyoqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlciAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKiBNaW5pbXVtIHZhbHVlICovXG4gIG1pbj86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gdmFsdWUgKi9cbiAgbWF4PzogbnVtYmVyO1xuICAvKiogU3RlcCBpbmNyZW1lbnQgKi9cbiAgc3RlcD86IG51bWJlcjtcbiAgLyoqIFNob3cgbWFya3Mgb24gdGhlIHNsaWRlciAqL1xuICBtYXJrcz86IGJvb2xlYW4gfCB7IHZhbHVlOiBudW1iZXI7IGxhYmVsPzogc3RyaW5nIH1bXTtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlcXVpcmVkICovXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGRpc2FibGVkICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgU2xpZGVyIGNvbXBvbmVudCAqL1xuICBzbGlkZXJQcm9wcz86IE9taXQ8U2xpZGVyUHJvcHMsICd2YWx1ZScgfCAnb25DaGFuZ2UnIHwgJ21pbicgfCAnbWF4JyB8ICdzdGVwJyB8ICdtYXJrcycgfCAnZGlzYWJsZWQnPjtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2xpZGVyRWxlbWVudENvcmU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IE9taXQ8U2xpZGVyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+LCAnZ3JpZFByb3BzJz4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIHBhcnNlRXJyb3IsXG4gICAgbWluID0gMCxcbiAgICBtYXggPSAxMDAsXG4gICAgc3RlcCA9IDEsXG4gICAgbWFya3MgPSBmYWxzZSxcbiAgICByZXF1aXJlZCA9IGZhbHNlLFxuICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgc2xpZGVyUHJvcHMgPSB7fSxcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbFxuICAgICAgZnVsbFdpZHRoXG4gICAgICBtYXJnaW49XCJub3JtYWxcIlxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgPlxuICAgICAge2xhYmVsICYmIDxGb3JtTGFiZWwgc3g9e3sgbWI6IDIgfX0+e2xhYmVsfTwvRm9ybUxhYmVsPn1cbiAgICAgIDxCb3ggc3g9e3sgcHg6IDIgfX0+XG4gICAgICAgIDxTbGlkZXJcbiAgICAgICAgICB7Li4uc2xpZGVyUHJvcHN9XG4gICAgICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICAgICAgbmFtZT17ZmllbGQubmFtZX1cbiAgICAgICAgICB2YWx1ZT17dHlwZW9mIGZpZWxkLnZhbHVlID09PSAnbnVtYmVyJyA/IGZpZWxkLnZhbHVlIDogbWlufVxuICAgICAgICAgIG9uQ2hhbmdlPXsoXywgbmV3VmFsdWUpID0+IGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlKX1cbiAgICAgICAgICBvbkJsdXI9e2ZpZWxkLm9uQmx1cn1cbiAgICAgICAgICBtaW49e21pbn1cbiAgICAgICAgICBtYXg9e21heH1cbiAgICAgICAgICBzdGVwPXtzdGVwfVxuICAgICAgICAgIG1hcmtzPXttYXJrc31cbiAgICAgICAgICB2YWx1ZUxhYmVsRGlzcGxheT1cImF1dG9cIlxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgLz5cbiAgICAgIDwvQm94PlxuICAgICAgeyhlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dCkgJiYgKFxuICAgICAgICA8Rm9ybUhlbHBlclRleHQ+e2Vycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0fTwvRm9ybUhlbHBlclRleHQ+XG4gICAgICApfVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgU2xpZGVyIGNvbXBvbmVudC5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gQ3VzdG9taXphYmxlIG1pbi9tYXgvc3RlcCB2YWx1ZXNcbiAqIC0gT3B0aW9uYWwgbWFya3MgZGlzcGxheVxuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiA8U2xpZGVyRWxlbWVudFxuICogICBuYW1lPVwicmF0aW5nXCJcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbGFiZWw9XCJSYXRpbmdcIlxuICogICBtaW49ezB9XG4gKiAgIG1heD17MTB9XG4gKiAgIHN0ZXA9ezF9XG4gKiAgIG1hcmtzXG4gKiAvPlxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBTbGlkZXJFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBTbGlkZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblNsaWRlckVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2xpZGVyRWxlbWVudCc7XG4iLCAiaW1wb3J0IHtcbiAgQm94LFxuICBCdXR0b24sXG4gIENoaXAsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgRm9ybUxhYmVsLFxuICBHcmlkLFxuICBTdGFjayxcbiAgdHlwZSBHcmlkUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IENsb3VkVXBsb2FkSWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0Nsb3VkVXBsb2FkJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQsIFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRFcnJvciwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyLCB1c2VGb3JtQ29udGV4dCB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBGaWxlVXBsb2FkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVVwbG9hZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybSAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm0gKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0ICovXG4gIGxhYmVsPzogUmVhY3ROb2RlO1xuICAvKiogSGVscGVyIHRleHQgdG8gZGlzcGxheSBiZWxvdyB0aGUgdXBsb2FkICovXG4gIGhlbHBlclRleHQ/OiBSZWFjdE5vZGU7XG4gIC8qKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXIgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKiogTWF4aW11bSBudW1iZXIgb2YgZmlsZXMgYWxsb3dlZCAqL1xuICBtYXhGaWxlcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gZmlsZSBzaXplIGluIE1CICovXG4gIG1heFNpemVNQj86IG51bWJlcjtcbiAgLyoqIEFsbG93ZWQgZmlsZSBleHRlbnNpb25zIChlLmcuLCBbJy5qcGcnLCAnLnBuZycsICcucGRmJ10pICovXG4gIGFsbG93ZWRFeHRlbnNpb25zPzogc3RyaW5nW107XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyByZXF1aXJlZCAqL1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICAvKiogQnV0dG9uIHRleHQgKi9cbiAgYnV0dG9uVGV4dD86IHN0cmluZztcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gRmlsZVVwbG9hZEVsZW1lbnRDb3JlPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBPbWl0PEZpbGVVcGxvYWRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4sICdncmlkUHJvcHMnPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGxhYmVsLFxuICAgIGhlbHBlclRleHQsXG4gICAgcGFyc2VFcnJvcixcbiAgICBtYXhGaWxlcyA9IDUsXG4gICAgbWF4U2l6ZU1CID0gMTAsXG4gICAgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJy5qcGcnLCAnLmpwZWcnLCAnLnBuZycsICcucGRmJywgJy5kb2MnLCAnLmRvY3gnLCAnLnhscycsICcueGxzeCddLFxuICAgIHJlcXVpcmVkID0gZmFsc2UsXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgICBidXR0b25UZXh0ID0gJ0Nob29zZSBGaWxlcycsXG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7IHNldEVycm9yLCBjbGVhckVycm9ycyB9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgY29uc3QgZmlsZUlucHV0UmVmID0gdXNlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KG51bGwpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGZpbGVzOiBGaWxlW10gPSBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKSA/IGZpZWxkLnZhbHVlIDogW107XG5cbiAgY29uc3QgdmFsaWRhdGVGaWxlcyA9IHVzZUNhbGxiYWNrKFxuICAgIChmaWxlTGlzdDogRmlsZUxpc3QgfCBudWxsKTogRmlsZVtdIHwgc3RyaW5nID0+IHtcbiAgICAgIGlmICghZmlsZUxpc3QgfHwgZmlsZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCA+IG1heEZpbGVzKSB7XG4gICAgICAgIHJldHVybiBgTWF4aW11bSAke21heEZpbGVzfSBmaWxlcyBhbGxvd2VkYDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF4U2l6ZUJ5dGVzID0gbWF4U2l6ZU1CICogMTAyNCAqIDEwMjQ7XG4gICAgICBjb25zdCB2YWxpZEZpbGVzOiBGaWxlW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmaWxlID0gZmlsZUxpc3RbaV07XG5cbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IG1heFNpemVCeXRlcykge1xuICAgICAgICAgIHJldHVybiBgRmlsZSBcIiR7ZmlsZS5uYW1lfVwiIGV4Y2VlZHMgJHttYXhTaXplTUJ9TUIgc2l6ZSBsaW1pdGA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSAnLicgKyBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgcmV0dXJuIGBGaWxlIFwiJHtmaWxlLm5hbWV9XCIgaGFzIGludmFsaWQgZXh0ZW5zaW9uLiBBbGxvd2VkOiAke2FsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywgJyl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbGlkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbGlkRmlsZXM7XG4gICAgfSxcbiAgICBbbWF4RmlsZXMsIG1heFNpemVNQiwgYWxsb3dlZEV4dGVuc2lvbnNdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlRmlsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlRmlsZXMoZXZlbnQudGFyZ2V0LmZpbGVzKTtcblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNldEVycm9yKG5hbWUsIHsgdHlwZTogJ3ZhbGlkYXRpb24nLCBtZXNzYWdlOiByZXN1bHQgfSk7XG4gICAgICAgIGlmIChmaWxlSW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50LnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjbGVhckVycm9ycyhuYW1lKTtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKHJlc3VsdCk7XG4gICAgfSxcbiAgICBbdmFsaWRhdGVGaWxlcywgc2V0RXJyb3IsIGNsZWFyRXJyb3JzLCBuYW1lLCBmaWVsZF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVSZW1vdmVGaWxlID0gdXNlQ2FsbGJhY2soXG4gICAgKGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IG5ld0ZpbGVzID0gZmlsZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdGaWxlcyk7XG5cbiAgICAgIGlmIChmaWxlSW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgICBmaWxlSW5wdXRSZWYuY3VycmVudC52YWx1ZSA9ICcnO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpbGVzLCBmaWVsZF1cbiAgKTtcblxuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKSA6IG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2xcbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgbWFyZ2luPVwibm9ybWFsXCJcbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgID5cbiAgICAgIHtsYWJlbCAmJiA8Rm9ybUxhYmVsIHN4PXt7IG1iOiAxIH19PntsYWJlbH08L0Zvcm1MYWJlbD59XG4gICAgICA8Qm94PlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICBjb21wb25lbnQ9XCJsYWJlbFwiXG4gICAgICAgICAgc3RhcnRJY29uPXs8Q2xvdWRVcGxvYWRJY29uIC8+fVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCB8fCBmaWxlcy5sZW5ndGggPj0gbWF4RmlsZXN9XG4gICAgICAgID5cbiAgICAgICAgICB7YnV0dG9uVGV4dH1cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHJlZj17ZmlsZUlucHV0UmVmfVxuICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgIGFjY2VwdD17YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCcpfVxuICAgICAgICAgICAgaGlkZGVuXG4gICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlRmlsZUNoYW5nZX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAge2ZpbGVzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxTdGFjayBkaXJlY3Rpb249XCJyb3dcIiBzcGFjaW5nPXsxfSBmbGV4V3JhcD1cIndyYXBcIiBzeD17eyBtdDogMiB9fT5cbiAgICAgICAgICAgIHtmaWxlcy5tYXAoKGZpbGU6IEZpbGUsIGluZGV4OiBudW1iZXIpID0+IChcbiAgICAgICAgICAgICAgPENoaXBcbiAgICAgICAgICAgICAgICBrZXk9e2Ake2ZpbGUubmFtZX0tJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgIGxhYmVsPXtgJHtmaWxlLm5hbWV9ICgkeyhmaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQilgfVxuICAgICAgICAgICAgICAgIG9uRGVsZXRlPXtkaXNhYmxlZCA/IHVuZGVmaW5lZCA6ICgpID0+IGhhbmRsZVJlbW92ZUZpbGUoaW5kZXgpfVxuICAgICAgICAgICAgICAgIHN4PXt7IG1iOiAxIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L1N0YWNrPlxuICAgICAgICApfVxuICAgICAgPC9Cb3g+XG4gICAgICB7KGVycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0KSAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dD57ZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHR9PC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBGaWxlIFVwbG9hZCBjb21wb25lbnQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIE11bHRpcGxlIGZpbGUgc3VwcG9ydFxuICogLSBGaWxlIHNpemUgdmFsaWRhdGlvblxuICogLSBGaWxlIHR5cGUgdmFsaWRhdGlvblxuICogLSBWaXN1YWwgZmlsZSBsaXN0IHdpdGggcmVtb3ZlIGNhcGFiaWxpdHlcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogPEZpbGVVcGxvYWRFbGVtZW50XG4gKiAgIG5hbWU9XCJkb2N1bWVudHNcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIlVwbG9hZCBEb2N1bWVudHNcIlxuICogICBtYXhGaWxlcz17M31cbiAqICAgbWF4U2l6ZU1CPXs1fVxuICogICBhbGxvd2VkRXh0ZW5zaW9ucz17WycucGRmJywgJy5kb2MnLCAnLmRvY3gnXX1cbiAqIC8+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IEZpbGVVcGxvYWRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBGaWxlVXBsb2FkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5GaWxlVXBsb2FkRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdGaWxlVXBsb2FkRWxlbWVudCc7XG4iLCAiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICBHcmlkLFxuICBUZXh0RmllbGQsXG4gIHVzZVRoZW1lLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnQG11aS9tYXRlcmlhbC91dGlscyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBGcmFnbWVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZFBhdGgsXG4gIHR5cGUgRmllbGRWYWx1ZXMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNTZWxlY3RFbGVtZW50UHJvcHMsIE9wdGlvbk9iamVjdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jU2VsZWN0UGF5bG9hZCB9IGZyb20gJ0AvdHlwZXMnO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBBc3luY1NlbGVjdEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleVxuICA+LFxuPihcbiAgcHJvcHM6IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFRPcHRpb25cbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgLy8gaW5pdGlhbFZhbHVlLFxuICAgIC8vIGlzTnVsbGFibGUsXG4gICAgbGFiZWwsXG4gICAgcXVlcnlGbixcbiAgICB2YXJpYW50LFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9uLCBzZXRTZWxlY3RlZE9wdGlvbl0gPSB1c2VTdGF0ZTxUT3B0aW9uIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8cmVhZG9ubHkgVE9wdGlvbltdPihbXSk7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAvLyBUcmFjayB3aGF0IHZhbHVlIHdlJ3ZlIGxvYWRlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBBUEkgY2FsbHNcbiAgY29uc3QgbG9hZGVkVmFsdWVSZWYgPSB1c2VSZWY8VE9wdGlvbltUVmFsdWVLZXldIHwgbnVsbCB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG5cbiAgY29uc3QgZmV0Y2hEYXRhID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoXG4gICAgICAgIChcbiAgICAgICAgICBwYXlsb2FkOiBBc3luY1NlbGVjdFBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB2b2lkXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Rm4ocGF5bG9hZCkudGhlbihjID0+IGNhbGxiYWNrKGMpKTtcbiAgICAgICAgfSxcbiAgICAgICAgNDAwXG4gICAgICApLFxuICAgIFtxdWVyeUZuXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvblt2YWx1ZUZpZWxkXSkgOiAnJztcbiAgICB9LFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEZpZWxkXVxuICApO1xuXG4gIC8vIEVmZmVjdDogSGFuZGxlIHNlYXJjaCBxdWVyeSBpbnB1dFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGZpZWxkLnZhbHVlO1xuXG4gICAgLy8gQ29uZGl0aW9uIDE6IEEgdmFsdWUgaXMgc2V0IGZyb20gdGhlIGZvcm0sIGFuZCB3ZSBoYXZlbid0IGxvYWRlZCBpdCB5ZXQuXG4gICAgaWYgKGN1cnJlbnRWYWx1ZSAmJiBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ICE9PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgIC8vIERvbid0IGZldGNoIGlmIHRoZSBzZWxlY3RlZCBvcHRpb24gaXMgYWxyZWFkeSBjb3JyZWN0XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgZ2V0T3B0aW9uVmFsdWUoc2VsZWN0ZWRPcHRpb24pID09PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ID0gY3VycmVudFZhbHVlO1xuXG4gICAgICBmZXRjaERhdGEoeyBRdWVyeTogbnVsbCwgU2VsZWN0ZWRWYWx1ZTogY3VycmVudFZhbHVlIH0sIHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZE9wdGlvbiA9IHJlc3VsdHM/LmZpbmQoXG4gICAgICAgICAgb3B0aW9uID0+IFN0cmluZyhnZXRPcHRpb25WYWx1ZShvcHRpb24pKSA9PT0gU3RyaW5nKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobWF0Y2hlZE9wdGlvbikge1xuICAgICAgICAgIHNldE9wdGlvbnMoW21hdGNoZWRPcHRpb25dKTtcbiAgICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbihtYXRjaGVkT3B0aW9uKTtcbiAgICAgICAgICBzZXRJbnB1dFZhbHVlKGdldE9wdGlvbkxhYmVsKG1hdGNoZWRPcHRpb24pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjsgLy8gRW5kIG9mIGVmZmVjdFxuICAgIH1cblxuICAgIC8vIENvbmRpdGlvbiAyOiBUaGUgdXNlciBpcyB0eXBpbmcgYSBzZWFyY2ggcXVlcnksIG9yIHRoZSBpbnB1dCBpcyBjbGVhcmVkLlxuICAgIC8vIFRoaXMgcnVucyBpZiB0aGUgaW5wdXQgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzZWxlY3RlZCBvcHRpb24ncyBsYWJlbC5cbiAgICBpZiAoaW5wdXRWYWx1ZSAhPT0gKHNlbGVjdGVkT3B0aW9uID8gZ2V0T3B0aW9uTGFiZWwoc2VsZWN0ZWRPcHRpb24pIDogJycpKSB7XG4gICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgZW1wdHksIGNsZWFyIG9wdGlvbnMgaW1tZWRpYXRlbHkgd2l0aG91dCBhbiBBUEkgY2FsbC5cbiAgICAgIGlmIChpbnB1dFZhbHVlID09PSAnJykge1xuICAgICAgICBzZXRPcHRpb25zKFtdKTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlcndpc2UsIGZldGNoIG5ldyBvcHRpb25zIGJhc2VkIG9uIHRoZSBpbnB1dC5cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICAgIGZldGNoRGF0YSh7IFF1ZXJ5OiBpbnB1dFZhbHVlLCBTZWxlY3RlZFZhbHVlOiBudWxsIH0sIHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgc2V0T3B0aW9ucyhyZXN1bHRzIHx8IFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47IC8vIEVuZCBvZiBlZmZlY3RcbiAgICB9XG5cbiAgICAvLyBDb25kaXRpb24gMzogVGhlIHZhbHVlIGhhcyBiZWVuIGNsZWFyZWQgZnJvbSB0aGUgZm9ybS5cbiAgICBpZiAoIWN1cnJlbnRWYWx1ZSAmJiBzZWxlY3RlZE9wdGlvbikge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obnVsbCk7XG4gICAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICAgIHNldE9wdGlvbnMoW10pO1xuICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIFtcbiAgICBmaWVsZC52YWx1ZSxcbiAgICBpbnB1dFZhbHVlLFxuICAgIGZldGNoRGF0YSxcbiAgICBnZXRPcHRpb25MYWJlbCxcbiAgICBnZXRPcHRpb25WYWx1ZSxcbiAgICBzZWxlY3RlZE9wdGlvbixcbiAgICBsYWJlbEZpZWxkLFxuICAgIHZhbHVlRmllbGQsXG4gIF0pO1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gZGlzYWJsZWQgPz8gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZF0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChfOiBSZWFjdC5TeW50aGV0aWNFdmVudCwgbmV3U2VsZWN0ZWRPcHRpb246IFRPcHRpb24gfCBudWxsKSA9PiB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihuZXdTZWxlY3RlZE9wdGlvbik7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld1NlbGVjdGVkT3B0aW9uXG4gICAgICAgID8gZ2V0T3B0aW9uVmFsdWUobmV3U2VsZWN0ZWRPcHRpb24pXG4gICAgICAgIDogbnVsbDtcblxuICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IG5ld1ZhbHVlIGFzXG4gICAgICAgIHwgVE9wdGlvbltUVmFsdWVLZXldXG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDsgLy8gVHJhY2sgY2hhbmdlXG5cbiAgICAgIC8vIFN5bmMgaW5wdXQgdmFsdWUgd2l0aCB0aGUgc2VsZWN0aW9uXG4gICAgICBpZiAobmV3U2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZShnZXRPcHRpb25MYWJlbChuZXdTZWxlY3RlZE9wdGlvbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgICAgIHNldE9wdGlvbnMoW10pOyAvLyBDbGVhciBvcHRpb25zIHdoZW4gc2VsZWN0aW9uIGlzIGNsZWFyZWRcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWVsZCwgZ2V0T3B0aW9uVmFsdWUsIGdldE9wdGlvbkxhYmVsXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKF86IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdJbnB1dFZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHNldElucHV0VmFsdWUobmV3SW5wdXRWYWx1ZSk7XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUJsdXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gV2hlbiBmb2N1cyBpcyBsb3N0LCBzeW5jIHRoZSBpbnB1dCB2YWx1ZSBiYWNrIHRvIHRoZSBzZWxlY3RlZCBvcHRpb24ncyBsYWJlbFxuICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgc2V0SW5wdXRWYWx1ZShnZXRPcHRpb25MYWJlbChzZWxlY3RlZE9wdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBub3RoaW5nIGlzIHNlbGVjdGVkLCBjbGVhciB0aGUgaW5wdXRcbiAgICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIH1cbiAgfSwgW3NlbGVjdGVkT3B0aW9uLCBnZXRPcHRpb25MYWJlbF0pO1xuXG4gIGNvbnN0IGhhbmRsZU9wZW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0T3Blbih0cnVlKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldE9wZW4oZmFsc2UpO1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgb3Blbj17b3Blbn1cbiAgICAgIG9uT3Blbj17aGFuZGxlT3Blbn1cbiAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlfVxuICAgICAgb25CbHVyPXtoYW5kbGVCbHVyfVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uVmFsdWV9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgYXV0b0NvbXBsZXRlXG4gICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgIGluY2x1ZGVJbnB1dEluTGlzdFxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIHZhbHVlPXtzZWxlY3RlZE9wdGlvbn1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgZmlsdGVyT3B0aW9ucz17eCA9PiB4fVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBub09wdGlvbnNUZXh0PVwiVHlwZSBTb21ldGhpbmcuLi5cIlxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHJlbmRlck9wdGlvbj17KHJlbmRlclByb3BzLCBvcHRpb24pID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIC4uLm9wdGlvblByb3BzIH0gPSByZW5kZXJQcm9wcztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIHtvcHRpb25bbGFiZWxGaWVsZF19XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jU2VsZWN0RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBBc3luY1NlbGVjdEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVFZhbHVlS2V5LFxuICBUTGFiZWxLZXksXG4gIFRPcHRpb25cbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFRPcHRpb24+XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuQXN5bmNTZWxlY3RFbGVtZW50LmRpc3BsYXlOYW1lID0gJ0FzeW5jU2VsZWN0RWxlbWVudCc7XG5cbmV4cG9ydCB7IEFzeW5jU2VsZWN0RWxlbWVudCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZUVuaGFuY2VkVHJhbnNmb3JtIH0gZnJvbSAnQC9ob29rcyc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVHlwZSB9IGZyb20gJ0AvaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICdAL3R5cGVzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlckZpZWxkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBUZXh0RmllbGQgY29tcG9uZW50IHRvIHVzZSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVVJIFRleHRGaWVsZFxuICAgKi9cbiAgY29tcG9uZW50PzogdHlwZW9mIFRleHRGaWVsZDtcbiAgLyoqXG4gICAqIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5wdXQvb3V0cHV0XG4gICAqIEBkZXByZWNhdGVkIFVzZSBmaWVsZFR5cGUgZm9yIGNvbW1vbiBwYXR0ZXJucyBvciBjdXN0b20gdHJhbnNmb3JtcyBmb3IgY29tcGxleCBjYXNlc1xuICAgKi9cbiAgdHJhbnNmb3JtPzoge1xuICAgIC8qKiBUcmFuc2Zvcm0gdmFsdWUgYmVmb3JlIGRpc3BsYXlpbmcgaW4gaW5wdXQgKi9cbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWU7XG4gICAgLyoqIFRyYW5zZm9ybSBpbnB1dCBldmVudCB0byBmb3JtIHZhbHVlICovXG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBCdWlsdC1pbiBmaWVsZCB0eXBlIGZvciBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb25cbiAgICogQGV4YW1wbGUgJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAndGltZScgfCAnc2VsZWN0J1xuICAgKi9cbiAgZmllbGRUeXBlPzogRmllbGRUeXBlO1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZSB0byBkaXNwbGF5IHdoZW4gZmllbGQgdmFsdWUgaXMgbnVsbC91bmRlZmluZWRcbiAgICogQGV4YW1wbGUgXCJcIlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVFZhbHVlO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJFbWFpbCBBZGRyZXNzXCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGlucHV0XG4gICAqIEBleGFtcGxlIFwiRW50ZXIgeW91ciBlbWFpbFwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIG9uQ2hhbmdlIGhhbmRsZXIgY2FsbGVkIGFmdGVyIHRyYW5zZm9ybWF0aW9uXG4gICAqL1xuICBvbkNoYW5nZT86IChcbiAgICBldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZSBkZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nIHRyYW5zZm9ybWF0aW9uIGlzc3Vlc1xuICAgKiBAZGVmYXVsdFZhbHVlIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAqL1xuICBlbmFibGVXYXJuaW5ncz86IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gTnVtYmVyRmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ocHJvcHM6IE51bWJlckZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIHRyYW5zZm9ybSxcbiAgICBmaWVsZFR5cGUgPSAndGV4dCcsIC8vIERlZmF1bHQgdG8gdGV4dCB0eXBlXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgZW5hYmxlV2FybmluZ3MgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICBtYXhMZW5ndGgsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIHR5cGUgPSAnbnVtYmVyJyxcbiAgICByZXF1aXJlZCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UmVmLFxuICAgIG9uSW5wdXQsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIC4uLnJlc3RUZXh0UHJvcHNcbiAgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIC8vIFVzZSB0aGUgZW5oYW5jZWQgdHJhbnNmb3JtIGhvb2sgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KFxuICAgIHtcbiAgICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW5wdXQ6IHRyYW5zZm9ybS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdHJhbnNmb3JtLm91dHB1dCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZmllbGRUeXBlOiAhdHJhbnNmb3JtXG4gICAgICAgID8gdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IG1heExlbmd0aCAmJiBtYXhMZW5ndGggPiA1XG4gICAgICAgICAgICA/ICd0ZXh0J1xuICAgICAgICAgICAgOiAnbnVtYmVyJ1xuICAgICAgICAgIDogZmllbGRUeXBlXG4gICAgICAgIDogdW5kZWZpbmVkLCAvLyBBdXRvLWRldGVjdCBudW1iZXIgdHlwZVxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZW5hYmxlV2FybmluZ3MsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9e2V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSAnJykge1xuICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgb25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbklucHV0PXsoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgIG1heExlbmd0aCAmJlxuICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlLnNsaWNlKDAsIG1heExlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9uSW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbklucHV0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uV2hlZWw9e2UgPT4ge1xuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmJsdXIoKTtcbiAgICAgIH19XG4gICAgICBvbktleURvd249e2UgPT4ge1xuICAgICAgICBpZiAoWydlJywgJ0UnLCAnQXJyb3dEb3duJywgJ0Fycm93VXAnXS5pbmNsdWRlcyhlLmtleSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e1xuICAgICAgICBlcnJvciA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKSA6IGhlbHBlclRleHRcbiAgICAgIH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHNsb3RQcm9wcz17eyBodG1sSW5wdXQ6IHsgbWF4TGVuZ3RoIH0gfX1cbiAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFRleHRGaWVsZCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbixcbiAqIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIGFuZCBidWlsdC1pbiBmaWVsZCB0eXBlIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nXG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnRcbiAqIC0gQnVpbHQtaW4gZmllbGQgdHlwZXMgZm9yIGNvbW1vbiBwYXR0ZXJuc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gT3B0aW1pemVkIG51bWJlciBpbnB1dCBoYW5kbGluZ1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgd2l0aCBtZW1vaXplZCB0cmFuc2Zvcm1hdGlvbnNcbiAqIC0gRGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZ1xuICogLSBTdGFibGUgcmVmZXJlbmNlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBidWlsdC1pbiBudW1iZXIgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIGZpZWxkVHlwZT1cIm51bWJlclwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnQWdlIGlzIHJlcXVpcmVkJywgbWluOiB7IHZhbHVlOiAwLCBtZXNzYWdlOiAnQWdlIG11c3QgYmUgcG9zaXRpdmUnIH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJlbWFpbFwiXG4gKiAgIGxhYmVsPVwiRW1haWxcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGVtYWlsIGFkZHJlc3NcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ0VtYWlsIGlzIHJlcXVpcmVkJyxcbiAqICAgICBwYXR0ZXJuOiB7IHZhbHVlOiAvXFxTK0BcXFMrXFwuXFxTKy8sIG1lc3NhZ2U6ICdJbnZhbGlkIGVtYWlsJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInByaWNlXCJcbiAqICAgbGFiZWw9XCJQcmljZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID8gYCQke3ZhbHVlfWAgOiAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gcGFyc2VGbG9hdChldmVudC50YXJnZXQudmFsdWUucmVwbGFjZSgnJCcsICcnKSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBlcnJvciBwYXJzaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcm5hbWVcIlxuICogICBsYWJlbD1cIlVzZXJuYW1lXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gKFxuICogICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAncmVkJyB9fT5cbiAqICAgICAgIFx1MjZBMFx1RkUwRiB7ZXJyb3IubWVzc2FnZX1cbiAqICAgICA8L3NwYW4+XG4gKiAgICl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1iZXJGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogTnVtYmVyRmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEJveFByb3BzLCBGb3JtSGVscGVyVGV4dFByb3BzLCBHcmlkUHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEJveCwgR3JpZCwgaW5wdXRCYXNlQ2xhc3NlcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgTXVpT3RwSW5wdXQsXG4gIHR5cGUgTXVpT3RwSW5wdXRQcm9wcyxcbn0gZnJvbSAnbXVpLW9uZS10aW1lLXBhc3N3b3JkLWlucHV0JztcbmltcG9ydCB0eXBlIHsgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyBDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgSGVscGVyVGV4dCB9IGZyb20gJy4vSGVscGVyVGV4dCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT1RQSW5wdXRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcblxuICBtYXhTaXplPzogbnVtYmVyO1xuXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuXG4gIGhlbHBlclRleHQ/OiBSZWFjdC5SZWFjdE5vZGU7XG5cbiAgc2xvdFByb3BzPzoge1xuICAgIHdyYXBwZXI/OiBCb3hQcm9wcztcbiAgICBoZWxwZXJUZXh0PzogRm9ybUhlbHBlclRleHRQcm9wcztcbiAgICB0ZXh0ZmllbGQ/OiBNdWlPdHBJbnB1dFByb3BzWydUZXh0RmllbGRzUHJvcHMnXTtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBPVFBJbnB1dEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IE9UUElucHV0RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICAvLyBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBzbG90UHJvcHMsXG4gICAgaGVscGVyVGV4dCxcbiAgICBtYXhTaXplID0gNTYsXG4gICAgcGxhY2Vob2xkZXIgPSAnLScsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgLy8gY29uc3Qge1xuICAvLyAgIGZpZWxkLFxuICAvLyAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgLy8gfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAvLyAgIG5hbWUsXG4gIC8vICAgY29udHJvbCxcbiAgLy8gfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Q29udHJvbGxlclxuICAgICAgbmFtZT17bmFtZX1cbiAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gICAgICByZW5kZXI9eyh7IGZpZWxkLCBmaWVsZFN0YXRlOiB7IGVycm9yIH0gfSkgPT4gKFxuICAgICAgICA8Qm94XG4gICAgICAgICAgey4uLnNsb3RQcm9wcz8ud3JhcHBlcn1cbiAgICAgICAgICBzeD17W1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgW2AmIC4ke2lucHV0QmFzZUNsYXNzZXMuaW5wdXR9YF06IHtcbiAgICAgICAgICAgICAgICBwOiAwLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIGFzcGVjdFJhdGlvOiAnMS8xJyxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogbWF4U2l6ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShzbG90UHJvcHM/LndyYXBwZXI/LnN4KVxuICAgICAgICAgICAgICA/IChzbG90UHJvcHM/LndyYXBwZXI/LnN4ID8/IFtdKVxuICAgICAgICAgICAgICA6IFtzbG90UHJvcHM/LndyYXBwZXI/LnN4XSksXG4gICAgICAgICAgXX1cbiAgICAgICAgPlxuICAgICAgICAgIDxNdWlPdHBJbnB1dFxuICAgICAgICAgICAgey4uLmZpZWxkfVxuICAgICAgICAgICAgYXV0b0ZvY3VzXG4gICAgICAgICAgICBnYXA9ezEuNX1cbiAgICAgICAgICAgIGxlbmd0aD17NH1cbiAgICAgICAgICAgIFRleHRGaWVsZHNQcm9wcz17e1xuICAgICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgZXJyb3I6ICEhZXJyb3IsXG4gICAgICAgICAgICAgIC4uLnNsb3RQcm9wcz8udGV4dGZpZWxkLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICA8SGVscGVyVGV4dFxuICAgICAgICAgICAgey4uLnNsb3RQcm9wcz8uaGVscGVyVGV4dH1cbiAgICAgICAgICAgIGVycm9yTWVzc2FnZT17ZXJyb3I/Lm1lc3NhZ2V9XG4gICAgICAgICAgICBoZWxwZXJUZXh0PXtoZWxwZXJUZXh0fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IE9UUElucHV0RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogT1RQSW5wdXRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBGb3JtSGVscGVyVGV4dFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9Gb3JtSGVscGVyVGV4dCc7XG5pbXBvcnQgRm9ybUhlbHBlclRleHQgZnJvbSAnQG11aS9tYXRlcmlhbC9Gb3JtSGVscGVyVGV4dCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgSGVscGVyVGV4dFByb3BzID0gRm9ybUhlbHBlclRleHRQcm9wcyAmIHtcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBkaXNhYmxlR3V0dGVycz86IGJvb2xlYW47XG4gIGhlbHBlclRleHQ/OiBSZWFjdC5SZWFjdE5vZGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gSGVscGVyVGV4dCh7XG4gIHN4LFxuICBoZWxwZXJUZXh0LFxuICBlcnJvck1lc3NhZ2UsXG4gIGRpc2FibGVHdXR0ZXJzLFxuICAuLi5vdGhlclxufTogSGVscGVyVGV4dFByb3BzKSB7XG4gIGlmIChlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Rm9ybUhlbHBlclRleHRcbiAgICAgICAgZXJyb3I9eyEhZXJyb3JNZXNzYWdlfVxuICAgICAgICBzeD17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG14OiBkaXNhYmxlR3V0dGVycyA/IDAgOiAxLjc1LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoc3gpID8gc3ggOiBbc3hdKSxcbiAgICAgICAgXX1cbiAgICAgICAgey4uLm90aGVyfVxuICAgICAgPlxuICAgICAgICB7ZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHR9XG4gICAgICA8L0Zvcm1IZWxwZXJUZXh0PlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyBBc3luY1NlbGVjdE11bHRpRWxlbWVudCB9IGZyb20gJy4uL0FzeW5jTXVsdGlTZWxlY3QvQXN5bmNNdWx0aVNlbGVjdCc7XG5pbXBvcnQgeyBBc3luY1NlbGVjdEVsZW1lbnQgfSBmcm9tICcuLi9Bc3luY1NlbGVjdCc7XG5pbXBvcnQgeyBDaGVja2JveEVsZW1lbnQgfSBmcm9tICcuLi9DaGVja2JveEVsZW1lbnQnO1xuaW1wb3J0IHsgQ2hlY2tib3hHcm91cEVsZW1lbnQgfSBmcm9tICcuLi9DaGVja2JveEdyb3VwJztcbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSAnLi4vRGF0ZVBpY2tlckVsZW1lbnQnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZEVsZW1lbnQgfSBmcm9tICcuLi9GaWxlVXBsb2FkRWxlbWVudCc7XG5pbXBvcnQgeyBOdW1iZXJGaWVsZEVsZW1lbnQgfSBmcm9tICcuLi9OdW1iZXJGaWVsZEVsZW1lbnQnO1xuaW1wb3J0IHsgT1RQSW5wdXRFbGVtZW50IH0gZnJvbSAnLi4vT1RQSW5wdXRFbGVtZW50L09UUElucHV0RWxlbWVudCc7XG5pbXBvcnQgeyBQYXNzd29yZEVsZW1lbnQgfSBmcm9tICcuLi9QYXNzd29yZEVsZW1lbnQnO1xuaW1wb3J0IHsgUmFkaW9CdXR0b25Hcm91cCB9IGZyb20gJy4uL1JhZGlvQnV0dG9uR3JvdXAnO1xuaW1wb3J0IHsgU2VsZWN0Q2FzY2FkZUVsZW1lbnQgfSBmcm9tICcuLi9TZWxlY3RDYXNjYWRlRWxlbWVudCc7XG5pbXBvcnQgeyBTZWxlY3RFbGVtZW50IH0gZnJvbSAnLi4vU2VsZWN0RWxlbWVudCc7XG5pbXBvcnQgeyBTZWxlY3RNdWx0aUVsZW1lbnQgfSBmcm9tICcuLi9TZWxlY3RNdWx0aUVsZW1lbnQnO1xuaW1wb3J0IHsgU2xpZGVyRWxlbWVudCB9IGZyb20gJy4uL1NsaWRlckVsZW1lbnQnO1xuaW1wb3J0IHsgVGV4dEZpZWxkRWxlbWVudCB9IGZyb20gJy4uL1RleHRGaWVsZEVsZW1lbnQnO1xuaW1wb3J0IHsgVGltZVBpY2tlckVsZW1lbnQgfSBmcm9tICcuLi9UaW1lUGlja2VyRWxlbWVudCc7XG5cbmNvbnN0IEZpZWxkID0ge1xuICBUZXh0OiBUZXh0RmllbGRFbGVtZW50LFxuICBOdW1iZXI6IE51bWJlckZpZWxkRWxlbWVudCxcbiAgQ2hlY2tib3g6IENoZWNrYm94RWxlbWVudCxcbiAgRGF0ZTogRGF0ZVBpY2tlckVsZW1lbnQsXG4gIFJhZGlvR3JvdXA6IFJhZGlvQnV0dG9uR3JvdXAsXG4gIFBhc3N3b3JkOiBQYXNzd29yZEVsZW1lbnQsXG4gIFRpbWU6IFRpbWVQaWNrZXJFbGVtZW50LFxuICBTZWxlY3Q6IFNlbGVjdEVsZW1lbnQsXG4gIFNlbGVjdE11bHRpOiBTZWxlY3RNdWx0aUVsZW1lbnQsXG4gIFNlbGVjdENhc2NhZGU6IFNlbGVjdENhc2NhZGVFbGVtZW50LFxuICBBc3luY1NlbGVjdDogQXN5bmNTZWxlY3RFbGVtZW50LFxuICBBc3luY011bHRpU2VsZWN0OiBBc3luY1NlbGVjdE11bHRpRWxlbWVudCxcbiAgQ2hlY2tib3hHcm91cDogQ2hlY2tib3hHcm91cEVsZW1lbnQsXG4gIE9UUElucHV0OiBPVFBJbnB1dEVsZW1lbnQsXG4gIFNsaWRlcjogU2xpZGVyRWxlbWVudCxcbiAgRmlsZVVwbG9hZDogRmlsZVVwbG9hZEVsZW1lbnQsXG59O1xuXG5leHBvcnQgeyBGaWVsZCB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7O0FBNEZPLFNBQVMsY0FBYyxPQUFxQztBQUNqRSxTQUNFLE9BQU8sVUFBVSxZQUNqQixVQUFVLFFBQ1YsV0FBVyxTQUNYLFdBQVcsU0FDWCxPQUFRLE1BQXFCLFVBQVUsYUFDdEMsT0FBUSxNQUFxQixVQUFVLFlBQ3RDLE9BQVEsTUFBcUIsVUFBVSxZQUN2QyxPQUFRLE1BQXFCLFVBQVU7QUFFN0M7QUFZTyxTQUFTLGlCQUNkLFNBQ0EsYUFBYSxTQUNiLGFBQWEsU0FDQztBQUNkLFNBQU8sUUFBUSxJQUFJLGFBQVc7QUFBQSxJQUM1QixPQUFPLE9BQU8sT0FBTyxVQUFVLEtBQUssRUFBRTtBQUFBLElBQ3RDLE9BQU8sT0FBTyxVQUFVO0FBQUEsSUFDeEIsVUFBVSxRQUFRLE9BQU8sUUFBUTtBQUFBLEVBQ25DLEVBQUU7QUFDSjs7O0FDN0hBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sV0FBVztBQUNsQixPQUFPLFdBQVc7QUFDbEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxxQkFBcUI7QUF1UmhCLFNBRUksS0FGSjtBQWhSZCxJQUFNLFlBQVksU0FBUyx3QkFVekIsT0FPQTtBQUNBLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxhQUFhO0FBQUEsSUFDYixhQUFhO0FBQUEsSUFDYixHQUFHO0FBQUEsRUFDTCxJQUFJO0FBRUosUUFBTTtBQUFBLElB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QUFBQSxFQUNaLE1BQU1JO0FBQUEsRUFDTixRQUFRQztBQUFBLEVBQ1IsVUFBVUM7QUFBQSxFQUNWLE1BQU07QUFBQSxFQUNOLFlBQVlDO0FBQUEsRUFDWixVQUFVO0FBQUEsRUFDVixNQUFNQztBQUFBLEVBQ04sUUFBUUM7QUFBQSxFQUNSLGFBQWFDO0FBQUEsRUFDYixlQUFlQztBQUFBLEVBQ2YsYUFBYUM7QUFBQSxFQUNiLGtCQUFrQkM7QUFBQSxFQUNsQixlQUFlO0FBQUEsRUFDZixVQUFVQztBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsWUFBWTtBQUNkOyIsCiAgIm5hbWVzIjogWyJwcm9wcyIsICJBc3luY1NlbGVjdE11bHRpRWxlbWVudCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiQ2hlY2tib3hFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtR3JvdXAiLCAiRm9ybUhlbHBlclRleHQiLCAiR3JpZCIsICJ1c2VDYWxsYmFjayIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJHcmlkIiwgImZvcndhcmRSZWYiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlTWVtbyIsICJ1c2VUaGVtZSIsICJ1c2VNZW1vIiwgImpzeCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAianN4IiwgImZvcndhcmRSZWYiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJHcmlkIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJwYXNzd29yZCIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkZvcm1MYWJlbCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUxhYmVsIiwgIkZvcm1Db250cm9sTGFiZWwiLCAiRm9ybUhlbHBlclRleHQiLCAiUmFkaW9CdXR0b25Hcm91cCIsICJHcmlkIiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgIkF1dG9jb21wbGV0ZSIsICJ1c2VUaGVtZSIsICJ1c2VSZWYiLCAidXNlRWZmZWN0IiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlNlbGVjdENhc2NhZGVFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgIkF1dG9jb21wbGV0ZSIsICJ1c2VUaGVtZSIsICJ1c2VNZW1vIiwgInVzZUVmZmVjdCIsICJ1c2VDYWxsYmFjayIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiU2VsZWN0RWxlbWVudCIsICJHcmlkIiwgIkNoZWNrYm94IiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAiQ2lyY3VsYXJQcm9ncmVzcyIsICJ1c2VUaGVtZSIsICJGcmFnbWVudCIsICJ1c2VFZmZlY3QiLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJTZWxlY3RNdWx0aUVsZW1lbnQiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiVGV4dEZpZWxkIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlRm9ya1JlZiIsICJUZXh0RmllbGRFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJ1c2VGb3JrUmVmIiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJ1c2VGb3JrUmVmIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIkdyaWQiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUhlbHBlclRleHQiLCAiRm9ybUxhYmVsIiwgIkdyaWQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQm94IiwgIkZvcm1Db250cm9sIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkZvcm1MYWJlbCIsICJHcmlkIiwgInVzZUNhbGxiYWNrIiwgInVzZVJlZiIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJBdXRvY29tcGxldGUiLCAiQ2lyY3VsYXJQcm9ncmVzcyIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VUaGVtZSIsICJkZWJvdW5jZSIsICJGcmFnbWVudCIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAidXNlTWVtbyIsICJ1c2VSZWYiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQXN5bmNTZWxlY3RFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlRleHRGaWVsZCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUZvcmtSZWYiLCAiTnVtYmVyRmllbGRFbGVtZW50IiwgIkdyaWQiLCAiQm94IiwgIkdyaWQiLCAiRm9ybUhlbHBlclRleHQiLCAianN4IiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJCb3giLCAiT1RQSW5wdXRFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkRWxlbWVudCIsICJOdW1iZXJGaWVsZEVsZW1lbnQiLCAiQ2hlY2tib3hFbGVtZW50IiwgIlJhZGlvQnV0dG9uR3JvdXAiLCAiVGltZVBpY2tlckVsZW1lbnQiLCAiU2VsZWN0RWxlbWVudCIsICJTZWxlY3RNdWx0aUVsZW1lbnQiLCAiU2VsZWN0Q2FzY2FkZUVsZW1lbnQiLCAiQXN5bmNTZWxlY3RFbGVtZW50IiwgIkFzeW5jU2VsZWN0TXVsdGlFbGVtZW50IiwgIk9UUElucHV0RWxlbWVudCJdCn0K