ng-configcat-publicapi-ui 4.2.2 → 5.0.0
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.
- package/README.md +2 -2
- package/fesm2022/ng-configcat-publicapi-ui.mjs +4240 -3534
- package/fesm2022/ng-configcat-publicapi-ui.mjs.map +1 -1
- package/index.d.ts +476 -3
- package/package.json +11 -10
- package/src/css/button.scss +83 -0
- package/src/css/controls.scss +390 -0
- package/src/css/dialog.scss +63 -0
- package/src/css/icon.scss +7 -0
- package/src/css/slider.scss +82 -0
- package/src/css/snackbar.scss +16 -0
- package/src/css/table.scss +142 -0
- package/src/css/theme.scss +47 -0
- package/src/css/tooltip.scss +12 -0
- package/src/css/variables.scss +324 -0
- package/src/css/vars/auth.scss +24 -0
- package/src/css/vars/banner.scss +116 -0
- package/src/css/vars/box.scss +48 -0
- package/src/css/vars/config-overview.scss +27 -0
- package/src/css/vars/flag.scss +146 -0
- package/src/css/vars/header.scss +24 -0
- package/src/css/vars/icon.scss +33 -0
- package/src/css/vars/logo.scss +19 -0
- package/src/css/vars/notification.scss +38 -0
- package/src/css/vars/overview.scss +51 -0
- package/src/css/vars/prism.scss +44 -0
- package/src/css/vars/sidenav.scss +42 -0
- package/src/css/vars/theme.scss +78 -0
- package/src/public-api.scss +208 -0
- package/esm2022/lib/_directives/index.mjs +0 -2
- package/esm2022/lib/_directives/input-display-normalizer.directive.mjs +0 -38
- package/esm2022/lib/_models/deleteSettingModel.mjs +0 -2
- package/esm2022/lib/_models/flag-state.mjs +0 -2
- package/esm2022/lib/_models/index.mjs +0 -4
- package/esm2022/lib/_models/setting-value-formgroup.mjs +0 -2
- package/esm2022/lib/_models/settingValuesModel.mjs +0 -2
- package/esm2022/lib/_models/updateSettingValuesModel.mjs +0 -2
- package/esm2022/lib/_models/user-comparator.mjs +0 -100
- package/esm2022/lib/_services/app-data-adapter.mjs +0 -18
- package/esm2022/lib/_services/comparison-value-list-helper.mjs +0 -72
- package/esm2022/lib/_services/date-helper.mjs +0 -56
- package/esm2022/lib/_services/form-generator.mjs +0 -359
- package/esm2022/lib/_services/form-helper.mjs +0 -163
- package/esm2022/lib/_services/index.mjs +0 -3
- package/esm2022/lib/_services/messaging.service.mjs +0 -26
- package/esm2022/lib/_services/platform-helper.mjs +0 -7
- package/esm2022/lib/_services/public-api.service.mjs +0 -77
- package/esm2022/lib/_services/setting-list-form-helper.mjs +0 -171
- package/esm2022/lib/_services/tracking.directive.mjs +0 -16
- package/esm2022/lib/ace-editor/ace-editor.component.mjs +0 -137
- package/esm2022/lib/authorization/authorization.component.mjs +0 -62
- package/esm2022/lib/base/base-select.component.mjs +0 -27
- package/esm2022/lib/base/base.component.mjs +0 -48
- package/esm2022/lib/bootstrap.mjs +0 -11
- package/esm2022/lib/configuration.mjs +0 -14
- package/esm2022/lib/dialogs/confirmation-dialog/confirmation-dialog.mjs +0 -28
- package/esm2022/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.mjs +0 -27
- package/esm2022/lib/dialogs/expand-dialog/expand-dialog.component.mjs +0 -80
- package/esm2022/lib/dialogs/info-dialog/info-dialog.mjs +0 -29
- package/esm2022/lib/dialogs/reason-dialog/reason-dialog.component.mjs +0 -36
- package/esm2022/lib/dialogs/reroute-dialog/reroute-dialog.mjs +0 -28
- package/esm2022/lib/dialogs/save-snackbar/save-snackbar.component.mjs +0 -14
- package/esm2022/lib/ng-configcat-publicapi-ui.module.mjs +0 -288
- package/esm2022/lib/selects/config-select/config-select.component.mjs +0 -60
- package/esm2022/lib/selects/environment-select/environment-select.component.mjs +0 -47
- package/esm2022/lib/selects/product-select/product-select.component.mjs +0 -40
- package/esm2022/lib/selects/setting-select/setting-select.component.mjs +0 -47
- package/esm2022/lib/setting-item/setting-item.component.mjs +0 -118
- package/esm2022/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +0 -81
- package/esm2022/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +0 -293
- package/esm2022/lib/setting-list/setting/setting.component.mjs +0 -136
- package/esm2022/lib/setting-list/setting/value/value.component.mjs +0 -37
- package/esm2022/lib/setting-list/setting-list.component.mjs +0 -194
- package/esm2022/lib/v2/feature-flag/date-time-picker/date-time-picker.component.mjs +0 -123
- package/esm2022/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.mjs +0 -30
- package/esm2022/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.mjs +0 -220
- package/esm2022/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.mjs +0 -61
- package/esm2022/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.mjs +0 -72
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.mjs +0 -25
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.mjs +0 -105
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.mjs +0 -75
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.mjs +0 -48
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.mjs +0 -113
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/popout-list-editor-dialog/popout-list-editor-dialog.component.mjs +0 -251
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.mjs +0 -444
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.mjs +0 -84
- package/esm2022/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.mjs +0 -129
- package/esm2022/lib/v2/feature-flag/feature-flag.component.mjs +0 -190
- package/esm2022/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.mjs +0 -65
- package/esm2022/lib/v2/feature-flag-item.component.mjs +0 -330
- package/esm2022/ng-configcat-publicapi-ui.mjs +0 -5
- package/esm2022/public-api.mjs +0 -15
- package/lib/_directives/index.d.ts +0 -1
- package/lib/_directives/input-display-normalizer.directive.d.ts +0 -13
- package/lib/_models/deleteSettingModel.d.ts +0 -6
- package/lib/_models/flag-state.d.ts +0 -20
- package/lib/_models/index.d.ts +0 -3
- package/lib/_models/setting-value-formgroup.d.ts +0 -69
- package/lib/_models/settingValuesModel.d.ts +0 -11
- package/lib/_models/updateSettingValuesModel.d.ts +0 -7
- package/lib/_models/user-comparator.d.ts +0 -84
- package/lib/_services/app-data-adapter.d.ts +0 -7
- package/lib/_services/comparison-value-list-helper.d.ts +0 -17
- package/lib/_services/date-helper.d.ts +0 -6
- package/lib/_services/form-generator.d.ts +0 -59
- package/lib/_services/form-helper.d.ts +0 -21
- package/lib/_services/index.d.ts +0 -2
- package/lib/_services/messaging.service.d.ts +0 -12
- package/lib/_services/platform-helper.d.ts +0 -3
- package/lib/_services/public-api.service.d.ts +0 -21
- package/lib/_services/setting-list-form-helper.d.ts +0 -19
- package/lib/_services/tracking.directive.d.ts +0 -6
- package/lib/ace-editor/ace-editor.component.d.ts +0 -32
- package/lib/authorization/authorization.component.d.ts +0 -21
- package/lib/base/base-select.component.d.ts +0 -10
- package/lib/base/base.component.d.ts +0 -18
- package/lib/bootstrap.d.ts +0 -13
- package/lib/configuration.d.ts +0 -9
- package/lib/dialogs/confirmation-dialog/confirmation-dialog.d.ts +0 -19
- package/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.d.ts +0 -17
- package/lib/dialogs/expand-dialog/expand-dialog.component.d.ts +0 -25
- package/lib/dialogs/info-dialog/info-dialog.d.ts +0 -17
- package/lib/dialogs/reason-dialog/reason-dialog.component.d.ts +0 -15
- package/lib/dialogs/reroute-dialog/reroute-dialog.d.ts +0 -20
- package/lib/dialogs/save-snackbar/save-snackbar.component.d.ts +0 -8
- package/lib/ng-configcat-publicapi-ui.module.d.ts +0 -75
- package/lib/selects/config-select/config-select.component.d.ts +0 -17
- package/lib/selects/environment-select/environment-select.component.d.ts +0 -17
- package/lib/selects/product-select/product-select.component.d.ts +0 -14
- package/lib/selects/setting-select/setting-select.component.d.ts +0 -17
- package/lib/setting-item/setting-item.component.d.ts +0 -37
- package/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.d.ts +0 -27
- package/lib/setting-list/setting/rollout-rules/rollout-rules.component.d.ts +0 -61
- package/lib/setting-list/setting/setting.component.d.ts +0 -43
- package/lib/setting-list/setting/value/value.component.d.ts +0 -20
- package/lib/setting-list/setting-list.component.d.ts +0 -53
- package/lib/v2/feature-flag/date-time-picker/date-time-picker.component.d.ts +0 -25
- package/lib/v2/feature-flag/dependees-dialog/dependees-dialog.component.d.ts +0 -27
- package/lib/v2/feature-flag/evaluation-formula/evaluation-formula.component.d.ts +0 -41
- package/lib/v2/feature-flag/evaluation-formula/feature-flag-value/feature-flag-value.component.d.ts +0 -18
- package/lib/v2/feature-flag/evaluation-formula/popout-text-editor-dialog/popout-text-editor-dialog.component.d.ts +0 -30
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/condition-chip/condition-chip.component.d.ts +0 -10
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/conditions.component.d.ts +0 -27
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/prerequisite-flag-condition/prerequisite-flag-condition.component.d.ts +0 -36
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/segment-condition/segment-condition.component.d.ts +0 -21
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/comparator-dialog/comparator-dialog.component.d.ts +0 -79
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/popout-list-editor-dialog/popout-list-editor-dialog.component.d.ts +0 -63
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/conditions/user-condition/user-condition.component.d.ts +0 -94
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/percentage-options/percentage-options.component.d.ts +0 -31
- package/lib/v2/feature-flag/evaluation-formula/targeting-rule/targeting-rule.component.d.ts +0 -33
- package/lib/v2/feature-flag/feature-flag.component.d.ts +0 -49
- package/lib/v2/feature-flag/percentage-evaluation-attribute-dialog/percentage-evaluation-attribute-dialog.component.d.ts +0 -28
- package/lib/v2/feature-flag-item.component.d.ts +0 -66
- package/public-api.d.ts +0 -11
- package/public-api.scss +0 -350
|
@@ -1,444 +0,0 @@
|
|
|
1
|
-
import { ENTER, COMMA } from '@angular/cdk/keycodes';
|
|
2
|
-
import { Component, Input, ViewChild } from '@angular/core';
|
|
3
|
-
import { FormControl } from '@angular/forms';
|
|
4
|
-
import { DateAdapter } from '@angular/material/core';
|
|
5
|
-
import { FormHelper, UserComparator, UserComparatorText, UserComparatorType, AppDateAdapter, ConfirmationDialogComponent, InfoDialogComponent } from '../../../../../../bootstrap';
|
|
6
|
-
import { ComparatorDialogComponent } from './comparator-dialog/comparator-dialog.component';
|
|
7
|
-
import { PopoutListEditorDialogComponent } from './popout-list-editor-dialog/popout-list-editor-dialog.component';
|
|
8
|
-
import { PopoutTextEditorDialogComponent } from '../../../popout-text-editor-dialog/popout-text-editor-dialog.component';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "../../../../../../bootstrap";
|
|
11
|
-
import * as i2 from "@angular/material/dialog";
|
|
12
|
-
import * as i3 from "@angular/cdk/clipboard";
|
|
13
|
-
import * as i4 from "@angular/common";
|
|
14
|
-
import * as i5 from "@angular/forms";
|
|
15
|
-
import * as i6 from "@angular/material/form-field";
|
|
16
|
-
import * as i7 from "@angular/material/button";
|
|
17
|
-
import * as i8 from "@angular/material/input";
|
|
18
|
-
import * as i9 from "@angular/material/icon";
|
|
19
|
-
import * as i10 from "@angular/material/tooltip";
|
|
20
|
-
import * as i11 from "@angular/material/chips";
|
|
21
|
-
import * as i12 from "@angular/material/menu";
|
|
22
|
-
import * as i13 from "../../../../../../_directives/input-display-normalizer.directive";
|
|
23
|
-
import * as i14 from "../condition-chip/condition-chip.component";
|
|
24
|
-
import * as i15 from "../../../../date-time-picker/date-time-picker.component";
|
|
25
|
-
export class ListValueErrorStateMatcher {
|
|
26
|
-
constructor(formGroup) {
|
|
27
|
-
this.formGroup = formGroup;
|
|
28
|
-
}
|
|
29
|
-
isErrorState() {
|
|
30
|
-
return this.formGroup.controls.comparisonValue.controls.listValue?.touched && this.formGroup.controls.comparisonValue.controls.listValue?.invalid;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
var ComparatorGroup;
|
|
34
|
-
(function (ComparatorGroup) {
|
|
35
|
-
ComparatorGroup["ConfidentialText"] = "CONFIDENTIAL TEXT";
|
|
36
|
-
ComparatorGroup["Text"] = "TEXT";
|
|
37
|
-
ComparatorGroup["SemanticVersion"] = "SEMANTIC VERSION";
|
|
38
|
-
ComparatorGroup["Number"] = "NUMBER";
|
|
39
|
-
ComparatorGroup["DateTime"] = "DATETIME";
|
|
40
|
-
ComparatorGroup["ConfidentialArray"] = "CONFIDENTIAL ARRAY";
|
|
41
|
-
ComparatorGroup["Array"] = "ARRAY";
|
|
42
|
-
})(ComparatorGroup || (ComparatorGroup = {}));
|
|
43
|
-
const allComparators = [
|
|
44
|
-
{ value: UserComparator.IsOneOf, label: UserComparatorText.IsOneOf, group: ComparatorGroup.Text, index: 0 },
|
|
45
|
-
{ value: UserComparator.IsNotOneOf, label: UserComparatorText.IsNotOneOf, group: ComparatorGroup.Text, index: 1 },
|
|
46
|
-
{ value: UserComparator.ContainsAnyOf, label: UserComparatorText.ContainsAnyOf, group: ComparatorGroup.Text, index: 2 },
|
|
47
|
-
{ value: UserComparator.DoesNotContainAnyOf, label: UserComparatorText.DoesNotContainAnyOf, group: ComparatorGroup.Text, index: 3 },
|
|
48
|
-
{ value: UserComparator.SemVerIsOneOf, label: UserComparatorText.SemVerIsOneOf, group: ComparatorGroup.SemanticVersion, index: 4 },
|
|
49
|
-
{ value: UserComparator.SemVerIsNotOneOf, label: UserComparatorText.SemVerIsNotOneOf, group: ComparatorGroup.SemanticVersion, index: 5 },
|
|
50
|
-
{ value: UserComparator.SemVerLess, label: UserComparatorText.SemVerLess, group: ComparatorGroup.SemanticVersion, index: 6 },
|
|
51
|
-
{ value: UserComparator.SemVerLessOrEquals, label: UserComparatorText.SemVerLessOrEquals, group: ComparatorGroup.SemanticVersion, index: 7 },
|
|
52
|
-
{ value: UserComparator.SemVerGreater, label: UserComparatorText.SemVerGreater, group: ComparatorGroup.SemanticVersion, index: 8 },
|
|
53
|
-
{ value: UserComparator.SemVerGreaterOrEquals, label: UserComparatorText.SemVerGreaterOrEquals, group: ComparatorGroup.SemanticVersion, index: 9 },
|
|
54
|
-
{ value: UserComparator.NumberEquals, label: UserComparatorText.NumberEquals, group: ComparatorGroup.Number, index: 10 },
|
|
55
|
-
{ value: UserComparator.NumberDoesNotEqual, label: UserComparatorText.NumberDoesNotEqual, group: ComparatorGroup.Number, index: 11 },
|
|
56
|
-
{ value: UserComparator.NumberLess, label: UserComparatorText.NumberLess, group: ComparatorGroup.Number, index: 12 },
|
|
57
|
-
{ value: UserComparator.NumberLessOrEquals, label: UserComparatorText.NumberLessOrEquals, group: ComparatorGroup.Number, index: 13 },
|
|
58
|
-
{ value: UserComparator.NumberGreater, label: UserComparatorText.NumberGreater, group: ComparatorGroup.Number, index: 14 },
|
|
59
|
-
{ value: UserComparator.NumberGreaterOrEquals, label: UserComparatorText.NumberGreaterOrEquals, group: ComparatorGroup.Number, index: 15 },
|
|
60
|
-
{ value: UserComparator.SensitiveIsOneOf, label: UserComparatorText.SensitiveIsOneOf, group: ComparatorGroup.ConfidentialText, index: 16 },
|
|
61
|
-
{ value: UserComparator.SensitiveIsNotOneOf, label: UserComparatorText.SensitiveIsNotOneOf, group: ComparatorGroup.ConfidentialText, index: 17 },
|
|
62
|
-
{ value: UserComparator.DateTimeBefore, label: UserComparatorText.DateTimeBefore, group: ComparatorGroup.DateTime, index: 18 },
|
|
63
|
-
{ value: UserComparator.DateTimeAfter, label: UserComparatorText.DateTimeAfter, group: ComparatorGroup.DateTime, index: 19 },
|
|
64
|
-
{ value: UserComparator.SensitiveTextEquals, label: UserComparatorText.SensitiveTextEquals, group: ComparatorGroup.ConfidentialText, index: 20 },
|
|
65
|
-
{ value: UserComparator.SensitiveTextDoesNotEqual, label: UserComparatorText.SensitiveTextDoesNotEqual, group: ComparatorGroup.ConfidentialText, index: 21 },
|
|
66
|
-
{ value: UserComparator.SensitiveTextStartsWithAnyOf, label: UserComparatorText.SensitiveTextStartsWithAnyOf, group: ComparatorGroup.ConfidentialText, index: 22 },
|
|
67
|
-
{ value: UserComparator.SensitiveTextNotStartsWithAnyOf, label: UserComparatorText.SensitiveTextNotStartsWithAnyOf, group: ComparatorGroup.ConfidentialText, index: 23 },
|
|
68
|
-
{ value: UserComparator.SensitiveTextEndsWithAnyOf, label: UserComparatorText.SensitiveTextEndsWithAnyOf, group: ComparatorGroup.ConfidentialText, index: 24 },
|
|
69
|
-
{ value: UserComparator.SensitiveTextNotEndsWithAnyOf, label: UserComparatorText.SensitiveTextNotEndsWithAnyOf, group: ComparatorGroup.ConfidentialText, index: 25 },
|
|
70
|
-
{ value: UserComparator.SensitiveArrayContainsAnyOf, label: UserComparatorText.SensitiveArrayContainsAnyOf, group: ComparatorGroup.ConfidentialArray, index: 26 },
|
|
71
|
-
{ value: UserComparator.SensitiveArrayDoesNotContainAnyOf, label: UserComparatorText.SensitiveArrayDoesNotContainAnyOf, group: ComparatorGroup.ConfidentialArray, index: 27 },
|
|
72
|
-
{ value: UserComparator.TextEquals, label: UserComparatorText.TextEquals, group: ComparatorGroup.Text, index: 28 },
|
|
73
|
-
{ value: UserComparator.TextDoesNotEqual, label: UserComparatorText.TextDoesNotEqual, group: ComparatorGroup.Text, index: 29 },
|
|
74
|
-
{ value: UserComparator.TextStartsWithAnyOf, label: UserComparatorText.TextStartsWithAnyOf, group: ComparatorGroup.Text, index: 30 },
|
|
75
|
-
{ value: UserComparator.TextNotStartsWithAnyOf, label: UserComparatorText.TextNotStartsWithAnyOf, group: ComparatorGroup.Text, index: 31 },
|
|
76
|
-
{ value: UserComparator.TextEndsWithAnyOf, label: UserComparatorText.TextEndsWithAnyOf, group: ComparatorGroup.Text, index: 32 },
|
|
77
|
-
{ value: UserComparator.TextNotEndsWithAnyOf, label: UserComparatorText.TextNotEndsWithAnyOf, group: ComparatorGroup.Text, index: 33 },
|
|
78
|
-
{ value: UserComparator.ArrayContainsAnyOf, label: UserComparatorText.ArrayContainsAnyOf, group: ComparatorGroup.Array, index: 34 },
|
|
79
|
-
{ value: UserComparator.ArrayDoesNotContainAnyOf, label: UserComparatorText.ArrayDoesNotContainAnyOf, group: ComparatorGroup.Array, index: 35 },
|
|
80
|
-
];
|
|
81
|
-
const defaultComparatorIds = [16, 17, 20, 21, 22, 23, 24, 25, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19];
|
|
82
|
-
export class UserConditionComponent {
|
|
83
|
-
set setMatChipGrid(matChipGrid) {
|
|
84
|
-
this.matChipGrid = matChipGrid;
|
|
85
|
-
}
|
|
86
|
-
constructor(formGenerator, dialog, comparisonValueListHelper, clipboard, messagingService, changeDetectorRef) {
|
|
87
|
-
this.formGenerator = formGenerator;
|
|
88
|
-
this.dialog = dialog;
|
|
89
|
-
this.comparisonValueListHelper = comparisonValueListHelper;
|
|
90
|
-
this.clipboard = clipboard;
|
|
91
|
-
this.messagingService = messagingService;
|
|
92
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
93
|
-
this.separatorKeysCodes = [ENTER, COMMA];
|
|
94
|
-
this.FormHelper = FormHelper;
|
|
95
|
-
this.defaultComparisonAttributes = ['Identifier', 'Email', 'Country'];
|
|
96
|
-
this.comparatorSuggestions = new Map();
|
|
97
|
-
this.comparatorSeparator = "────────────────────";
|
|
98
|
-
this.keepOrder = (a, _) => a;
|
|
99
|
-
this.RolloutRuleComparatorV2Type = UserComparatorType;
|
|
100
|
-
// The chip grid's [formControl] only accepts a FormControl. We have a FormArray (because of the name+hint).
|
|
101
|
-
// We have to fake a FormControl and match that formControl's errorstate with the original component's errorState.
|
|
102
|
-
this.fakeFormControl = new FormControl('');
|
|
103
|
-
}
|
|
104
|
-
ngOnInit() {
|
|
105
|
-
this.rolloutRuleComparatorType = this.formGenerator.getComparisonValueType(this.formGroup.controls.comparator.value);
|
|
106
|
-
this.isClearTextComparatorSelected = this.isClearTextComparator(this.formGroup.controls.comparator.value);
|
|
107
|
-
this.errorStateMatcher = new ListValueErrorStateMatcher(this.formGroup);
|
|
108
|
-
this.selectedComparator = this.formGroup.controls.comparator.value;
|
|
109
|
-
this.calcComparators();
|
|
110
|
-
}
|
|
111
|
-
attributeChanged(event) {
|
|
112
|
-
const value = event.target.value;
|
|
113
|
-
if (this.defaultComparisonAttributes.indexOf(value) !== -1) {
|
|
114
|
-
if (this.formGroup.controls.comparisonAttribute.value !== value) {
|
|
115
|
-
this.formGroup.controls.comparisonAttribute.setValue(value);
|
|
116
|
-
this.formGroup.markAsDirty();
|
|
117
|
-
this.calcComparators(true);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
else if (this.formGroup.controls.comparisonAttribute.value !== '') {
|
|
121
|
-
this.formGroup.controls.comparisonAttribute.setValue('');
|
|
122
|
-
this.formGroup.markAsDirty();
|
|
123
|
-
this.calcComparators(true);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
comparatorChanged(value) {
|
|
127
|
-
if (value === "showall") {
|
|
128
|
-
this.changeDetectorRef.detectChanges();
|
|
129
|
-
this.selectedComparator = this.formGroup.controls.comparator.value;
|
|
130
|
-
this.changeDetectorRef.detectChanges();
|
|
131
|
-
this.compDialog();
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
this.formGroup.controls.comparator.setValue(value);
|
|
135
|
-
this.formGroup.markAsDirty();
|
|
136
|
-
this.selectedComparator = value;
|
|
137
|
-
this.isClearTextComparatorSelected = this.isClearTextComparator(this.formGroup.controls.comparator.value);
|
|
138
|
-
const oldRolloutRuleComparatorType = this.rolloutRuleComparatorType;
|
|
139
|
-
this.rolloutRuleComparatorType = this.formGenerator.getComparisonValueType(this.formGroup.controls.comparator.value);
|
|
140
|
-
if (oldRolloutRuleComparatorType !== this.rolloutRuleComparatorType) {
|
|
141
|
-
const defaultValue = this.rolloutRuleComparatorType === UserComparatorType.DateTime ? {
|
|
142
|
-
doubleValue: new Date().getTime() / 1000.0
|
|
143
|
-
} : {};
|
|
144
|
-
this.formGroup.setControl('comparisonValue', this.formGenerator.generateComparisonValueFormGroup(defaultValue, this.formGroup.controls.comparator.value, false, this.featureFlagLimitations));
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
compDialog() {
|
|
148
|
-
const dialogRef = this.dialog.open(ComparatorDialogComponent, {
|
|
149
|
-
width: '1130px',
|
|
150
|
-
position: {
|
|
151
|
-
top: window.innerHeight < 750 ? '0px' : window.innerHeight < 950 ? '50px' : '100px',
|
|
152
|
-
},
|
|
153
|
-
data: {
|
|
154
|
-
readOnly: this.readOnly,
|
|
155
|
-
selectedComparator: this.formGroup.controls.comparator.value
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
dialogRef.afterClosed().subscribe(result => {
|
|
159
|
-
if (result && result !== this.formGroup.controls.comparator.value) {
|
|
160
|
-
this.comparatorChanged(result);
|
|
161
|
-
this.calcComparators();
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
add(event) {
|
|
166
|
-
const value = (event.value || '').trim();
|
|
167
|
-
event.chipInput?.clear();
|
|
168
|
-
if (!value) {
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
if (value.indexOf(',') === -1) {
|
|
172
|
-
this.formGenerator.addComparisonValueListValueItems(this.formGroup.controls.comparator.value, this.formGroup.controls.comparisonValue.controls.listValue, [{ value }], this.featureFlagLimitations);
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
176
|
-
data: {
|
|
177
|
-
title: 'How would you like to add the items?',
|
|
178
|
-
body: `We've noticed a comma in the value you want to add. <br/> Do you want to add it as a single item, or would you prefer to insert multiple items separated by commas?`,
|
|
179
|
-
yesButtonLabel: 'Add multiple items',
|
|
180
|
-
noButtonLabel: 'Add as a single item'
|
|
181
|
-
},
|
|
182
|
-
disableClose: true
|
|
183
|
-
});
|
|
184
|
-
dialogRef.afterClosed()
|
|
185
|
-
.subscribe(result => {
|
|
186
|
-
if (result === 'yes') {
|
|
187
|
-
const comparisonValueListParseResult = this.comparisonValueListHelper.parseValuesFromCsv(value);
|
|
188
|
-
if (comparisonValueListParseResult.error) {
|
|
189
|
-
this.messagingService.showWarningSnack('Parse error');
|
|
190
|
-
}
|
|
191
|
-
else if (comparisonValueListParseResult.comparisonValueList.length > 0) {
|
|
192
|
-
this.formGenerator.addComparisonValueListValueItems(this.formGroup.controls.comparator.value, this.formGroup.controls.comparisonValue.controls.listValue, comparisonValueListParseResult.comparisonValueList, this.featureFlagLimitations);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
this.formGenerator.addComparisonValueListValueItems(this.formGroup.controls.comparator.value, this.formGroup.controls.comparisonValue.controls.listValue, [{ value }], this.featureFlagLimitations);
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
remove(index) {
|
|
201
|
-
if (index >= 0) {
|
|
202
|
-
this.formGroup.controls.comparisonValue.controls.listValue.controls.splice(index, 1);
|
|
203
|
-
this.formGroup.controls.comparisonValue.controls.listValue.updateValueAndValidity();
|
|
204
|
-
this.formGroup.controls.comparisonValue.controls.listValue.markAllAsTouched();
|
|
205
|
-
this.formGroup.controls.comparisonValue.controls.listValue.markAsDirty();
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
edit(index, event) {
|
|
209
|
-
const value = event.value.trim();
|
|
210
|
-
// https://github.com/angular/components/issues/26584#issuecomment-1699469605
|
|
211
|
-
// The mat chip control does not work well with long values. The basic setup is overflow: visible.
|
|
212
|
-
// The overflow:hidden, text-overflow: ellipsis is solved in the styles.scss:
|
|
213
|
-
//.mdc-evolution-chip-set .mdc-evolution-chip {
|
|
214
|
-
// .mdc-evolution-chip__cell--primary,
|
|
215
|
-
// .mdc-evolution-chip__action--primary,
|
|
216
|
-
// .mat-mdc-chip-action-label {
|
|
217
|
-
// white-space: nowrap;
|
|
218
|
-
// overflow: hidden;
|
|
219
|
-
// text-overflow: ellipsis;
|
|
220
|
-
// }
|
|
221
|
-
// }
|
|
222
|
-
//
|
|
223
|
-
// This works totally fine until you edit a chip's value that is long (double click on it)
|
|
224
|
-
// and e.g. insert a character to the end of the value.
|
|
225
|
-
// After focusing out from the input, the original chip's value is shifted or even missing if the text is long enough.
|
|
226
|
-
// If we set the input's value to '' here, the shifting is solved and everything works as expected
|
|
227
|
-
event.chip.defaultEditInput?.setValue('');
|
|
228
|
-
if (!value) {
|
|
229
|
-
this.remove(index);
|
|
230
|
-
}
|
|
231
|
-
else if (index >= 0) {
|
|
232
|
-
this.formGroup.controls.comparisonValue.controls.listValue.controls[index].patchValue({ value });
|
|
233
|
-
this.formGroup.controls.comparisonValue.controls.listValue.controls[index].updateValueAndValidity();
|
|
234
|
-
this.formGroup.controls.comparisonValue.controls.listValue.updateValueAndValidity();
|
|
235
|
-
this.formGroup.controls.comparisonValue.controls.listValue.markAllAsTouched();
|
|
236
|
-
this.formGroup.controls.comparisonValue.controls.listValue.markAsDirty();
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
expandText() {
|
|
240
|
-
const dialogRef = this.dialog.open(PopoutTextEditorDialogComponent, {
|
|
241
|
-
width: '800px',
|
|
242
|
-
data: {
|
|
243
|
-
value: this.formGroup.controls.comparisonValue.controls.stringValue.value,
|
|
244
|
-
readOnly: this.formGroup.controls.comparisonValue.controls.stringValue.disabled,
|
|
245
|
-
validators: this.rolloutRuleComparatorType === UserComparatorType.Semver
|
|
246
|
-
? this.formGenerator.getComparisonValueSemverValidators(this.featureFlagLimitations)
|
|
247
|
-
: this.formGenerator.getComparisonValueStringValidators(this.featureFlagLimitations),
|
|
248
|
-
maxValueLength: this.featureFlagLimitations.maxComparisonValueLength,
|
|
249
|
-
description: 'Modify the text within the editor to change the comparison value. The editor supports JSON syntax highlighting.'
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
dialogRef.afterClosed().subscribe(data => {
|
|
253
|
-
if (data && data.value !== this.formGroup.controls.comparisonValue.controls.stringValue.value) {
|
|
254
|
-
this.formGroup.controls.comparisonValue.controls.stringValue.setValue(data.value);
|
|
255
|
-
this.formGroup.controls.comparisonValue.controls.stringValue.updateValueAndValidity();
|
|
256
|
-
this.formGroup.controls.comparisonValue.controls.stringValue.markAsTouched();
|
|
257
|
-
this.formGroup.controls.comparisonValue.controls.stringValue.markAsDirty();
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
expandList() {
|
|
262
|
-
const dialogRef = this.dialog.open(PopoutListEditorDialogComponent, {
|
|
263
|
-
width: '670px',
|
|
264
|
-
data: {
|
|
265
|
-
comparisonValueList: this.getRawValue(),
|
|
266
|
-
comparator: this.formGroup.controls.comparator.value,
|
|
267
|
-
featureFlagLimitations: this.featureFlagLimitations,
|
|
268
|
-
readOnly: this.readOnly
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
dialogRef.afterClosed().subscribe((data) => {
|
|
272
|
-
if (data?.comparisonValueList) {
|
|
273
|
-
const oldValue = this.formGroup.controls.comparisonValue.controls.listValue.value
|
|
274
|
-
.map(l => { return { value: l.value, hint: l.hint }; });
|
|
275
|
-
const newValue = data.comparisonValueList
|
|
276
|
-
.map(l => { return { value: l.value, hint: l.hint }; });
|
|
277
|
-
if (JSON.stringify(oldValue) === JSON.stringify(newValue)) {
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
const validators = this.formGenerator.getComparisonValueType(this.formGroup.controls.comparator.value) === UserComparatorType.SemverList
|
|
281
|
-
? this.formGenerator.getComparisonValueSemverListItemValidators(this.featureFlagLimitations)
|
|
282
|
-
: this.formGenerator.getComparisonValueStringListItemValidators(this.featureFlagLimitations);
|
|
283
|
-
const formArray = this.formGenerator.generateComparisonValueListValueArray(data.comparisonValueList, this.readOnly, this.featureFlagLimitations, validators);
|
|
284
|
-
this.formGroup.controls.comparisonValue.setControl('listValue', formArray);
|
|
285
|
-
this.formGroup.controls.comparisonValue.updateValueAndValidity();
|
|
286
|
-
this.formGroup.controls.comparisonValue.markAllAsTouched();
|
|
287
|
-
this.formGroup.controls.comparisonValue.markAsDirty();
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
removeAll() {
|
|
292
|
-
this.formGroup.controls.comparisonValue.controls.listValue.controls.splice(0, this.formGroup.controls.comparisonValue.controls.listValue.controls.length);
|
|
293
|
-
this.formGroup.controls.comparisonValue.controls.listValue.updateValueAndValidity();
|
|
294
|
-
this.formGroup.controls.comparisonValue.controls.listValue.markAllAsTouched();
|
|
295
|
-
this.formGroup.controls.comparisonValue.controls.listValue.markAsDirty();
|
|
296
|
-
}
|
|
297
|
-
copyValuesAsCsv() {
|
|
298
|
-
this.copyToClipboard(this.comparisonValueListHelper.formatValuesAsCsv(this.getRawValue()));
|
|
299
|
-
}
|
|
300
|
-
copyToClipboard(value) {
|
|
301
|
-
if (value) {
|
|
302
|
-
try {
|
|
303
|
-
this.clipboard.copy(value);
|
|
304
|
-
this.messagingService.showSuccessSnack("Copied to clipboard.");
|
|
305
|
-
}
|
|
306
|
-
catch {
|
|
307
|
-
this.messagingService.showSuccessSnack("Clipboard unavailable.");
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
else {
|
|
311
|
-
this.messagingService.showWarningSnack("Nothing to be copied.");
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
getRawValue() {
|
|
315
|
-
return this.formGroup.controls.comparisonValue.controls.listValue.value.map(v => { return { value: v.value, hint: v.hint }; });
|
|
316
|
-
}
|
|
317
|
-
isValueInvalid(listValueItemControl) {
|
|
318
|
-
return listValueItemControl.controls.value.touched && listValueItemControl.controls.value.invalid;
|
|
319
|
-
}
|
|
320
|
-
isHintInvalid(listValueItemControl) {
|
|
321
|
-
return listValueItemControl.controls.hint.touched && listValueItemControl.controls.hint.invalid;
|
|
322
|
-
}
|
|
323
|
-
isListValueItemInvalid(listValueItemControl) {
|
|
324
|
-
return this.isValueInvalid(listValueItemControl) || this.isHintInvalid(listValueItemControl);
|
|
325
|
-
}
|
|
326
|
-
getListValueItemTooltipMessage(listValueItemControl) {
|
|
327
|
-
if (this.isValueInvalid(listValueItemControl)) {
|
|
328
|
-
return FormHelper.getErrorMessage(listValueItemControl.controls.value);
|
|
329
|
-
}
|
|
330
|
-
else if (this.isHintInvalid(listValueItemControl)) {
|
|
331
|
-
return "Hint:" + FormHelper.getErrorMessage(listValueItemControl.controls.hint);
|
|
332
|
-
}
|
|
333
|
-
if (listValueItemControl.controls.hint.value) {
|
|
334
|
-
return listValueItemControl.controls.hint.value;
|
|
335
|
-
}
|
|
336
|
-
return "No hint";
|
|
337
|
-
}
|
|
338
|
-
calcComparators(resetVal = false) {
|
|
339
|
-
if (!this.formGroup.controls.comparisonAttribute.value) {
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
this.buildComparatorSuggestions(defaultComparatorIds, resetVal);
|
|
343
|
-
}
|
|
344
|
-
buildComparatorSuggestions(ids, resetVal) {
|
|
345
|
-
let comps = ids.map(id => allComparators[id]);
|
|
346
|
-
const selected = allComparators.find(val => val.value === this.formGroup.controls.comparator.value);
|
|
347
|
-
if (resetVal && !ids.includes(selected.index) && this.isNullCompVal(this.formGroup.controls.comparisonValue.value)) {
|
|
348
|
-
this.comparatorChanged(comps[0].value);
|
|
349
|
-
}
|
|
350
|
-
else if (!ids.includes(selected.index)) {
|
|
351
|
-
if (selected.value === UserComparator.ContainsAnyOf || selected.value === UserComparator.DoesNotContainAnyOf) {
|
|
352
|
-
comps = [allComparators[2], allComparators[3], ...comps];
|
|
353
|
-
}
|
|
354
|
-
else {
|
|
355
|
-
const selectedGroup = allComparators.filter(val => val.group === selected.group);
|
|
356
|
-
comps = [...selectedGroup, ...comps];
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
comps = this.dedupComps(comps);
|
|
360
|
-
this.comparatorSuggestions = comps.reduce((entryMap, e) => entryMap.set(e.group, [...entryMap.get(e.group) || [], e]), new Map());
|
|
361
|
-
this.comparatorSeparator = this.genSeparator(comps);
|
|
362
|
-
}
|
|
363
|
-
dedupComps(comps) {
|
|
364
|
-
const result = [];
|
|
365
|
-
comps.forEach(val => {
|
|
366
|
-
if (!result.find(e => e.index === val.index)) {
|
|
367
|
-
result.push(val);
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
return result;
|
|
371
|
-
}
|
|
372
|
-
genSeparator(comps) {
|
|
373
|
-
let max = 0;
|
|
374
|
-
comps.forEach(val => {
|
|
375
|
-
if (val.label.length > max) {
|
|
376
|
-
max = val.label.length;
|
|
377
|
-
}
|
|
378
|
-
});
|
|
379
|
-
return Array(max).join("─");
|
|
380
|
-
}
|
|
381
|
-
isNumberArr(val) {
|
|
382
|
-
if (!Array.isArray(val)) {
|
|
383
|
-
return false;
|
|
384
|
-
}
|
|
385
|
-
return val.length > 0 && val.every(item => typeof item === 'number');
|
|
386
|
-
}
|
|
387
|
-
isNullCompVal(compVal) {
|
|
388
|
-
return !compVal.doubleValue && !compVal.listValue && !compVal.stringValue;
|
|
389
|
-
}
|
|
390
|
-
isClearTextComparator(comparator) {
|
|
391
|
-
switch (comparator) {
|
|
392
|
-
case UserComparator.IsOneOf:
|
|
393
|
-
case UserComparator.IsNotOneOf:
|
|
394
|
-
case UserComparator.TextStartsWithAnyOf:
|
|
395
|
-
case UserComparator.TextEndsWithAnyOf:
|
|
396
|
-
case UserComparator.TextNotStartsWithAnyOf:
|
|
397
|
-
case UserComparator.TextNotEndsWithAnyOf:
|
|
398
|
-
case UserComparator.ArrayContainsAnyOf:
|
|
399
|
-
case UserComparator.ArrayDoesNotContainAnyOf:
|
|
400
|
-
case UserComparator.ContainsAnyOf:
|
|
401
|
-
case UserComparator.DoesNotContainAnyOf:
|
|
402
|
-
case UserComparator.TextEquals:
|
|
403
|
-
case UserComparator.TextDoesNotEqual: return true;
|
|
404
|
-
default: return false;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
openCleartextInfoDialog() {
|
|
408
|
-
this.dialog.open(InfoDialogComponent, {
|
|
409
|
-
width: '600px',
|
|
410
|
-
data: {
|
|
411
|
-
title: `Consider using confidential comparators`,
|
|
412
|
-
body: `Comparison value will be presented as plain text
|
|
413
|
-
in the <i>config JSON</i>. If you have sensitive data, consider using one of the confidential (hashed) comparators.<br/><br/>
|
|
414
|
-
See the <a href="https://configcat.com/docs/targeting/targeting-rule/user-condition/#confidential-text-comparators" target="_blank">documentation</a> for more information.`,
|
|
415
|
-
secondaryButtonLabel: 'Open comparator selector',
|
|
416
|
-
secondaryButtonAction: () => this.compDialog()
|
|
417
|
-
}
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserConditionComponent, deps: [{ token: i1.FormGenerator }, { token: i2.MatDialog }, { token: i1.ComparisonValueListHelper }, { token: i3.Clipboard }, { token: i1.MessagingService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
421
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserConditionComponent, selector: "app-user-condition", inputs: { targetingRuleIndex: "targetingRuleIndex", conditionIndex: "conditionIndex", readOnly: "readOnly", featureFlagLimitations: "featureFlagLimitations", formGroup: "formGroup" }, providers: [
|
|
422
|
-
{ provide: DateAdapter, useClass: AppDateAdapter }
|
|
423
|
-
], viewQueries: [{ propertyName: "setMatChipGrid", first: true, predicate: ["chipGrid"], descendants: true }], ngImport: i0, template: "<div class=\"targeting-rule-line smallest-form-field\">\n <div class=\"explanation-wrapper\">\n <app-condition-chip [targetingRuleIndex]=\"targetingRuleIndex\"\n [conditionIndex]=\"conditionIndex\"></app-condition-chip>\n\n <div class=\"explanation\"><a href=\"https://configcat.com/docs/targeting/targeting-rule/user-condition/\"\n target=\"_blank\" rel=\"noopener noreferrer\" class=\"user-link\">user's</a></div>\n </div>\n\n <div class=\"wrapper-group\">\n <div class=\"wrapper-group\">\n <div class=\"targeting-rule-component pad-right\"\n [ngClass]=\"{'small': defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1}\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"attributeChanged($event)\"\n [disabled]=\"formGroup.controls.comparisonAttribute.disabled\" matTooltip=\"Comparison attribute\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === formGroup.controls.comparisonAttribute.value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1\">\n Custom\n </option>\n </select>\n </mat-form-field>\n </div>\n <div class=\"targeting-rule-component pad-right small\"\n [hidden]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) !== -1\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" (blur)=\"calcComparators(true)\"\n [formControl]=\"formGroup.controls.comparisonAttribute\" matTooltip=\"Custom comparison attribute\">\n <mat-error *ngIf=\"formGroup.controls.comparisonAttribute.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonAttribute)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"targeting-rule-component pad-right comparator\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"comparatorChanged(selectedComparator)\"\n [(ngModel)]=\"selectedComparator\" [disabled]=\"readOnly\" matTooltip=\"Comparator\">\n <optgroup *ngFor=\"let group of comparatorSuggestions | keyvalue: keepOrder\"\n [label]=\"' ' + group.key\">\n <option *ngFor=\"let comparator of group.value\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup [label]=\"comparatorSeparator\"></optgroup>\n <option value=\"showall\"> SHOW ALL COMPARATORS </option>\n </select>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"All comparators\"\n (click)=\"compDialog()\"><mat-icon>list_alt</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparator.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparator)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <ng-container [ngSwitch]=\"rolloutRuleComparatorType\">\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.String\"\n [ngTemplateOutlet]=\"textTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Semver\"\n [ngTemplateOutlet]=\"semverTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.StringList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.SemverList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Number\"\n [ngTemplateOutlet]=\"numberTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.DateTime\"\n [ngTemplateOutlet]=\"dateTimeTemplate\"></ng-container>\n </ng-container>\n\n</div>\n\n<ng-template #textTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (text)\" placeholder=\"Add text ...\" />\n <button matPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandText()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n\n<ng-template #semverTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (semantic version)\" placeholder=\"Add semantic version ... (1.2.3)\" />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #listTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.listValue\"\n class=\"targeting-rule-component grow small-chip-input top-icon-suffix\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-chip-grid #chipGrid [formControl]=\"fakeFormControl\" [errorStateMatcher]=\"errorStateMatcher\">\n <span class=\"chip-container\"\n *ngFor=\"let listValueItem of formGroup.controls.comparisonValue.controls.listValue.controls | slice:0:20; let i = index\"\n [matTooltip]=\"getListValueItemTooltipMessage(listValueItem)\">\n <mat-chip-row (removed)=\"remove(i)\" [disabled]=\"readOnly\" [removable]=\"!readOnly\" class=\"chip\"\n [editable]=\"!readOnly\" (edited)=\"edit(i, $event)\"\n [ngClass]=\"{'invalid': isListValueItemInvalid(listValueItem)}\">\n\n {{listValueItem.controls.value.value}}\n\n <button type=\"button\" matChipRemove *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n </span>\n <button mat-stroked-button class=\"show-all\" type=\"button\"\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.controls.length > 20\"\n (click)=\"expandList()\">\n show all {{formGroup.controls.comparisonValue.controls.listValue.controls.length}}\n items</button>\n <input [disabled]=\"readOnly\" [placeholder]=\"!readOnly ? 'Add item to list ...' : ''\"\n [matChipInputFor]=\"chipGrid\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n matChipInputAddOnBlur (matChipInputTokenEnd)=\"add($event)\" matTooltip=\"Comparison values (list)\" />\n </mat-chip-grid>\n <button matIconPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"More...\"\n [matMenuTriggerFor]=\"moreMenu\"><mat-icon>more_vert</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandList()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && formGroup.controls.comparisonValue.controls.listValue.errors\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.listValue)}}\n </mat-error>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && !formGroup.controls.comparisonValue.controls.listValue.errors\">\n Invalid items\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #numberTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"number\" [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n matTooltip=\"Comparison value (number)\" placeholder=\"Add number ...\" inputDisplayNormalizer />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.doubleValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #dateTimeTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component datetime\">\n <app-date-time-picker [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n dateTooltip=\"Comparison value (date)\" timeTooltip=\"Comparison value (time)\" />\n </div>\n</ng-template>\n\n\n<mat-menu #moreMenu>\n <a mat-menu-item (click)=\"expandList()\"><mat-icon>edit_note</mat-icon>Advanced editor</a>\n <a mat-menu-item (click)=\"copyValuesAsCsv()\"><mat-icon>content_copy</mat-icon>Copy as CSV (values only)</a>\n <a mat-menu-item (click)=\"removeAll()\" [disabled]=\"readOnly\"><mat-icon>delete_outline</mat-icon>Remove\n all</a>\n</mat-menu>", styles: [".targeting-rule-line{display:flex;flex-wrap:wrap;margin:2px 0}.targeting-rule-line .wrapper-group{display:flex;flex-wrap:wrap}.targeting-rule-line .wrapper-group.grow{flex-grow:1}.targeting-rule-component{margin:2px 0;width:212px}.targeting-rule-component[hidden]{display:none}.targeting-rule-component.small{width:102px}.targeting-rule-component.grow{flex-grow:1}.targeting-rule-component.pad-right{margin-right:8px}.targeting-rule-component mat-form-field{width:100%;font-size:12px}.delete-button{margin-top:4px;color:#b1b1b1}.delete-button mat-icon{font-size:18px;height:18px;width:18px}.explanation-wrapper{display:flex;margin-top:2px}.explanation-wrapper .explanation{min-width:44px;margin-top:6px;margin-right:8px}@media (max-width: 500px){.targeting-rule-component{max-width:calc(100% - 4px);width:160px}.targeting-rule-component.small{width:78px}.targeting-rule-component.pad-right{margin-right:4px}}\n", ".mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 24px}.targeting-rule-line{--mdc-text-button-container-height: 24px;--mdc-filled-button-container-height: 24px;--mdc-protected-button-container-height: 24px;--mdc-outlined-button-container-height: 24px;--mat-text-button-touch-target-display: none;--mat-filled-button-touch-target-display: none;--mat-protected-button-touch-target-display: none;--mat-outlined-button-touch-target-display: none}.targeting-rule-component.datetime{width:auto;margin:0}mat-chip-row.invalid{background-color:red}.show-all{font-size:.8em;margin-left:4px}.input-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-right:4px;padding:0;height:24px;width:24px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.input-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.input-button mat-icon{font-size:20px;height:20px;width:20px}.prefix-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-left:4px;margin-right:2px;height:20px;width:20px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center}.prefix-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.prefix-button mat-icon{font-size:18px;height:18px;width:18px}.chip{background-color:#f1f1f1}.chip mat-icon{color:#8d8d8d}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i11.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i11.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i11.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i13.InputDisplayNormalizerDirective, selector: "input[inputDisplayNormalizer]" }, { kind: "component", type: i14.ConditionChipComponent, selector: "app-condition-chip", inputs: ["targetingRuleIndex", "conditionIndex"] }, { kind: "component", type: i15.DateTimePickerComponent, selector: "app-date-time-picker", inputs: ["dateTooltip", "timeTooltip"] }, { kind: "pipe", type: i4.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.KeyValuePipe, name: "keyvalue" }] }); }
|
|
424
|
-
}
|
|
425
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserConditionComponent, decorators: [{
|
|
426
|
-
type: Component,
|
|
427
|
-
args: [{ selector: 'app-user-condition', providers: [
|
|
428
|
-
{ provide: DateAdapter, useClass: AppDateAdapter }
|
|
429
|
-
], template: "<div class=\"targeting-rule-line smallest-form-field\">\n <div class=\"explanation-wrapper\">\n <app-condition-chip [targetingRuleIndex]=\"targetingRuleIndex\"\n [conditionIndex]=\"conditionIndex\"></app-condition-chip>\n\n <div class=\"explanation\"><a href=\"https://configcat.com/docs/targeting/targeting-rule/user-condition/\"\n target=\"_blank\" rel=\"noopener noreferrer\" class=\"user-link\">user's</a></div>\n </div>\n\n <div class=\"wrapper-group\">\n <div class=\"wrapper-group\">\n <div class=\"targeting-rule-component pad-right\"\n [ngClass]=\"{'small': defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1}\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"attributeChanged($event)\"\n [disabled]=\"formGroup.controls.comparisonAttribute.disabled\" matTooltip=\"Comparison attribute\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === formGroup.controls.comparisonAttribute.value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) === -1\">\n Custom\n </option>\n </select>\n </mat-form-field>\n </div>\n <div class=\"targeting-rule-component pad-right small\"\n [hidden]=\"defaultComparisonAttributes.indexOf(formGroup.controls.comparisonAttribute.value) !== -1\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" (blur)=\"calcComparators(true)\"\n [formControl]=\"formGroup.controls.comparisonAttribute\" matTooltip=\"Custom comparison attribute\">\n <mat-error *ngIf=\"formGroup.controls.comparisonAttribute.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonAttribute)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"targeting-rule-component pad-right comparator\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <select matNativeControl (change)=\"comparatorChanged(selectedComparator)\"\n [(ngModel)]=\"selectedComparator\" [disabled]=\"readOnly\" matTooltip=\"Comparator\">\n <optgroup *ngFor=\"let group of comparatorSuggestions | keyvalue: keepOrder\"\n [label]=\"' ' + group.key\">\n <option *ngFor=\"let comparator of group.value\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup [label]=\"comparatorSeparator\"></optgroup>\n <option value=\"showall\"> SHOW ALL COMPARATORS </option>\n </select>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"All comparators\"\n (click)=\"compDialog()\"><mat-icon>list_alt</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparator.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparator)}}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <ng-container [ngSwitch]=\"rolloutRuleComparatorType\">\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.String\"\n [ngTemplateOutlet]=\"textTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Semver\"\n [ngTemplateOutlet]=\"semverTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.StringList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.SemverList\"\n [ngTemplateOutlet]=\"listTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.Number\"\n [ngTemplateOutlet]=\"numberTemplate\"></ng-container>\n <ng-container *ngSwitchCase=\"RolloutRuleComparatorV2Type.DateTime\"\n [ngTemplateOutlet]=\"dateTimeTemplate\"></ng-container>\n </ng-container>\n\n</div>\n\n<ng-template #textTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (text)\" placeholder=\"Add text ...\" />\n <button matPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandText()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n\n<ng-template #semverTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"text\" [formControl]=\"formGroup.controls.comparisonValue.controls.stringValue\"\n matTooltip=\"Comparison value (semantic version)\" placeholder=\"Add semantic version ... (1.2.3)\" />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.stringValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.stringValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #listTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.listValue\"\n class=\"targeting-rule-component grow small-chip-input top-icon-suffix\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-chip-grid #chipGrid [formControl]=\"fakeFormControl\" [errorStateMatcher]=\"errorStateMatcher\">\n <span class=\"chip-container\"\n *ngFor=\"let listValueItem of formGroup.controls.comparisonValue.controls.listValue.controls | slice:0:20; let i = index\"\n [matTooltip]=\"getListValueItemTooltipMessage(listValueItem)\">\n <mat-chip-row (removed)=\"remove(i)\" [disabled]=\"readOnly\" [removable]=\"!readOnly\" class=\"chip\"\n [editable]=\"!readOnly\" (edited)=\"edit(i, $event)\"\n [ngClass]=\"{'invalid': isListValueItemInvalid(listValueItem)}\">\n\n {{listValueItem.controls.value.value}}\n\n <button type=\"button\" matChipRemove *ngIf=\"!readOnly\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n </span>\n <button mat-stroked-button class=\"show-all\" type=\"button\"\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.controls.length > 20\"\n (click)=\"expandList()\">\n show all {{formGroup.controls.comparisonValue.controls.listValue.controls.length}}\n items</button>\n <input [disabled]=\"readOnly\" [placeholder]=\"!readOnly ? 'Add item to list ...' : ''\"\n [matChipInputFor]=\"chipGrid\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n matChipInputAddOnBlur (matChipInputTokenEnd)=\"add($event)\" matTooltip=\"Comparison values (list)\" />\n </mat-chip-grid>\n <button matIconPrefix class=\"prefix-button\" type=\"button\" mat-icon-button *ngIf=\"isClearTextComparatorSelected\"\n (click)=\"openCleartextInfoDialog()\"\n matTooltip=\"This comparison value won't be hashed. Click for more info.\"><mat-icon>lock_open_right</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"More...\"\n [matMenuTriggerFor]=\"moreMenu\"><mat-icon>more_vert</mat-icon></button>\n <button matIconSuffix class=\"input-button\" type=\"button\" mat-icon-button matTooltip=\"Advanced editor\"\n (click)=\"expandList()\"><mat-icon>edit_note</mat-icon></button>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && formGroup.controls.comparisonValue.controls.listValue.errors\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.listValue)}}\n </mat-error>\n <mat-error\n *ngIf=\"formGroup.controls.comparisonValue.controls.listValue.invalid && !formGroup.controls.comparisonValue.controls.listValue.errors\">\n Invalid items\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #numberTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component grow\">\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\n <input matInput type=\"number\" [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n matTooltip=\"Comparison value (number)\" placeholder=\"Add number ...\" inputDisplayNormalizer />\n <mat-error *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue.invalid\">\n {{FormHelper.getErrorMessage(formGroup.controls.comparisonValue.controls.doubleValue)}}\n </mat-error>\n </mat-form-field>\n </div>\n</ng-template>\n\n<ng-template #dateTimeTemplate>\n <div *ngIf=\"formGroup.controls.comparisonValue.controls.doubleValue\" class=\"targeting-rule-component datetime\">\n <app-date-time-picker [formControl]=\"formGroup.controls.comparisonValue.controls.doubleValue\"\n dateTooltip=\"Comparison value (date)\" timeTooltip=\"Comparison value (time)\" />\n </div>\n</ng-template>\n\n\n<mat-menu #moreMenu>\n <a mat-menu-item (click)=\"expandList()\"><mat-icon>edit_note</mat-icon>Advanced editor</a>\n <a mat-menu-item (click)=\"copyValuesAsCsv()\"><mat-icon>content_copy</mat-icon>Copy as CSV (values only)</a>\n <a mat-menu-item (click)=\"removeAll()\" [disabled]=\"readOnly\"><mat-icon>delete_outline</mat-icon>Remove\n all</a>\n</mat-menu>", styles: [".targeting-rule-line{display:flex;flex-wrap:wrap;margin:2px 0}.targeting-rule-line .wrapper-group{display:flex;flex-wrap:wrap}.targeting-rule-line .wrapper-group.grow{flex-grow:1}.targeting-rule-component{margin:2px 0;width:212px}.targeting-rule-component[hidden]{display:none}.targeting-rule-component.small{width:102px}.targeting-rule-component.grow{flex-grow:1}.targeting-rule-component.pad-right{margin-right:8px}.targeting-rule-component mat-form-field{width:100%;font-size:12px}.delete-button{margin-top:4px;color:#b1b1b1}.delete-button mat-icon{font-size:18px;height:18px;width:18px}.explanation-wrapper{display:flex;margin-top:2px}.explanation-wrapper .explanation{min-width:44px;margin-top:6px;margin-right:8px}@media (max-width: 500px){.targeting-rule-component{max-width:calc(100% - 4px);width:160px}.targeting-rule-component.small{width:78px}.targeting-rule-component.pad-right{margin-right:4px}}\n", ".mat-mdc-chip.mat-mdc-standard-chip{--mdc-chip-container-height: 24px}.targeting-rule-line{--mdc-text-button-container-height: 24px;--mdc-filled-button-container-height: 24px;--mdc-protected-button-container-height: 24px;--mdc-outlined-button-container-height: 24px;--mat-text-button-touch-target-display: none;--mat-filled-button-touch-target-display: none;--mat-protected-button-touch-target-display: none;--mat-outlined-button-touch-target-display: none}.targeting-rule-component.datetime{width:auto;margin:0}mat-chip-row.invalid{background-color:red}.show-all{font-size:.8em;margin-left:4px}.input-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-right:4px;padding:0;height:24px;width:24px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.input-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.input-button mat-icon{font-size:20px;height:20px;width:20px}.prefix-button{--mat-icon-button-touch-target-display: none;color:#00000070;margin-left:4px;margin-right:2px;height:20px;width:20px;padding:0;line-height:1;display:inline-flex;align-items:center;justify-content:center}.prefix-button .mat-mdc-icon-button.mat-mdc-button-base{--mdc-icon-button-state-layer-size: 28px;width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size);padding:2px}.prefix-button mat-icon{font-size:18px;height:18px;width:18px}.chip{background-color:#f1f1f1}.chip mat-icon{color:#8d8d8d}\n"] }]
|
|
430
|
-
}], ctorParameters: () => [{ type: i1.FormGenerator }, { type: i2.MatDialog }, { type: i1.ComparisonValueListHelper }, { type: i3.Clipboard }, { type: i1.MessagingService }, { type: i0.ChangeDetectorRef }], propDecorators: { targetingRuleIndex: [{
|
|
431
|
-
type: Input
|
|
432
|
-
}], conditionIndex: [{
|
|
433
|
-
type: Input
|
|
434
|
-
}], readOnly: [{
|
|
435
|
-
type: Input
|
|
436
|
-
}], featureFlagLimitations: [{
|
|
437
|
-
type: Input
|
|
438
|
-
}], formGroup: [{
|
|
439
|
-
type: Input
|
|
440
|
-
}], setMatChipGrid: [{
|
|
441
|
-
type: ViewChild,
|
|
442
|
-
args: ["chipGrid", { static: false }]
|
|
443
|
-
}] } });
|
|
444
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jb25kaXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29uZmlnY2F0LXB1YmxpY2FwaS11aS9zcmMvbGliL3YyL2ZlYXR1cmUtZmxhZy9ldmFsdWF0aW9uLWZvcm11bGEvdGFyZ2V0aW5nLXJ1bGUvY29uZGl0aW9ucy91c2VyLWNvbmRpdGlvbi91c2VyLWNvbmRpdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvdjIvZmVhdHVyZS1mbGFnL2V2YWx1YXRpb24tZm9ybXVsYS90YXJnZXRpbmctcnVsZS9jb25kaXRpb25zL3VzZXItY29uZGl0aW9uL3VzZXItY29uZGl0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFdBQVcsRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RSxPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFDSixjQUFjLEVBQ3ZDLDJCQUEyQixFQUErQyxtQkFBbUIsRUFDdkgsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsK0JBQStCLEVBQThCLE1BQU0saUVBQWlFLENBQUM7QUFDOUksT0FBTyxFQUFFLCtCQUErQixFQUE4QixNQUFN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VyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7U0FDbkQsc0lDM0ZILDh6V0FrTFc7OzRGRHJGRSxzQkFBc0I7a0JBWGxDLFNBQVM7K0JBQ0Usb0JBQW9CLGFBTW5CO3dCQUNULEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO3FCQUNuRDt5T0FPUSxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUd3QyxjQUFjO3NCQUEzRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlRFUiwgQ09NTUEgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQsIE1hdENoaXBFZGl0ZWRFdmVudCwgTWF0Q2hpcEdyaWQsIE1hdENoaXBSb3cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBDbGlwYm9hcmQgfSBmcm9tICdAYW5ndWxhci9jZGsvY2xpcGJvYXJkJztcbmltcG9ydCB7XG4gIEZvcm1IZWxwZXIsIENvbXBhcmlzb25WYWx1ZUxpc3RGb3JtLCBVc2VyQ29uZGl0aW9uRm9ybSwgRm9ybUdlbmVyYXRvcixcbiAgVXNlckNvbXBhcmF0b3IsIFVzZXJDb21wYXJhdG9yVGV4dCwgVXNlckNvbXBhcmF0b3JUeXBlLFxuICBJQ29tcGFyaXNvblZhbHVlTGlzdE1vZGVsLCBJQ29tcGFyaXNvblZhbHVlTW9kZWwsIEFwcERhdGVBZGFwdGVyLFxuICBJRmVhdHVyZUZsYWdMaW1pdGF0aW9ucywgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCBDb21wYXJpc29uVmFsdWVMaXN0SGVscGVyLCBNZXNzYWdpbmdTZXJ2aWNlLCBJbmZvRGlhbG9nQ29tcG9uZW50XG59IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2Jvb3RzdHJhcCc7XG5pbXBvcnQgeyBDb21wYXJhdG9yRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wYXJhdG9yLWRpYWxvZy9jb21wYXJhdG9yLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3V0TGlzdEVkaXRvckRpYWxvZ0NvbXBvbmVudCwgUG9wb3V0TGlzdEVkaXRvckRpYWxvZ0RhdGEgfSBmcm9tICcuL3BvcG91dC1saXN0LWVkaXRvci1kaWFsb2cvcG9wb3V0LWxpc3QtZWRpdG9yLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3V0VGV4dEVkaXRvckRpYWxvZ0NvbXBvbmVudCwgUG9wb3V0VGV4dEVkaXRvckRpYWxvZ0RhdGEgfSBmcm9tICcuLi8uLi8uLi9wb3BvdXQtdGV4dC1lZGl0b3ItZGlhbG9nL3BvcG91dC10ZXh0LWVkaXRvci1kaWFsb2cuY29tcG9uZW50JztcblxuZXhwb3J0IGNsYXNzIExpc3RWYWx1ZUVycm9yU3RhdGVNYXRjaGVyIGltcGxlbWVudHMgRXJyb3JTdGF0ZU1hdGNoZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1Hcm91cDogRm9ybUdyb3VwPFVzZXJDb25kaXRpb25Gb3JtPikgeyB9XG4gIGlzRXJyb3JTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZT8udG91Y2hlZCAmJiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlPy5pbnZhbGlkO1xuICB9XG59XG5cbmVudW0gQ29tcGFyYXRvckdyb3VwIHtcbiAgQ29uZmlkZW50aWFsVGV4dCA9ICdDT05GSURFTlRJQUwgVEVYVCcsXG4gIFRleHQgPSAnVEVYVCcsXG4gIFNlbWFudGljVmVyc2lvbiA9ICdTRU1BTlRJQyBWRVJTSU9OJyxcbiAgTnVtYmVyID0gJ05VTUJFUicsXG4gIERhdGVUaW1lID0gJ0RBVEVUSU1FJyxcbiAgQ29uZmlkZW50aWFsQXJyYXkgPSAnQ09ORklERU5USUFMIEFSUkFZJyxcbiAgQXJyYXkgPSAnQVJSQVknXG59XG5cbmludGVyZmFjZSBJQ29tcGFyYXRvclZhbHVlIHtcbiAgdmFsdWU6IFVzZXJDb21wYXJhdG9yLFxuICBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LFxuICBncm91cDogQ29tcGFyYXRvckdyb3VwLFxuICBpbmRleDogbnVtYmVyLFxufVxuXG5jb25zdCBhbGxDb21wYXJhdG9yczogSUNvbXBhcmF0b3JWYWx1ZVtdID0gW1xuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5Jc09uZU9mLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LklzT25lT2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDAgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuSXNOb3RPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5Jc05vdE9uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlRleHQsIGluZGV4OiAxIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkNvbnRhaW5zQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuQ29udGFpbnNBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBpbmRleDogMiB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbkFueU9mLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LkRvZXNOb3RDb250YWluQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDMgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJJc09uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbWFudGljVmVyc2lvbiwgaW5kZXg6IDQgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJJc05vdE9uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbWFudGljVmVyc2lvbiwgaW5kZXg6IDUgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVyTGVzcywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJMZXNzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlNlbWFudGljVmVyc2lvbiwgaW5kZXg6IDYgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2VtVmVyTGVzc09yRXF1YWxzLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlNlbVZlckxlc3NPckVxdWFscywgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5TZW1hbnRpY1ZlcnNpb24sIGluZGV4OiA3IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXIsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2VtVmVyR3JlYXRlciwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5TZW1hbnRpY1ZlcnNpb24sIGluZGV4OiA4IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXJPckVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW1WZXJHcmVhdGVyT3JFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuU2VtYW50aWNWZXJzaW9uLCBpbmRleDogOSB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5OdW1iZXJFcXVhbHMsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuTnVtYmVyRXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgaW5kZXg6IDEwIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbCwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJEb2VzTm90RXF1YWwsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBpbmRleDogMTEgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuTnVtYmVyTGVzcywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJMZXNzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgaW5kZXg6IDEyIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckxlc3NPckVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJMZXNzT3JFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBpbmRleDogMTMgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlciwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJHcmVhdGVyLCBncm91cDogQ29tcGFyYXRvckdyb3VwLk51bWJlciwgaW5kZXg6IDE0IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5OdW1iZXJHcmVhdGVyT3JFcXVhbHMsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuTnVtYmVyLCBpbmRleDogMTUgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNPbmVPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVJc09uZU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbFRleHQsIGluZGV4OiAxNiB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlNlbnNpdGl2ZUlzTm90T25lT2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsVGV4dCwgaW5kZXg6IDE3IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkRhdGVUaW1lQmVmb3JlLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LkRhdGVUaW1lQmVmb3JlLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkRhdGVUaW1lLCBpbmRleDogMTggfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuRGF0ZVRpbWVBZnRlciwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5EYXRlVGltZUFmdGVyLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkRhdGVUaW1lLCBpbmRleDogMTkgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dEVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVUZXh0RXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbFRleHQsIGluZGV4OiAyMCB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVUZXh0RG9lc05vdEVxdWFsLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlNlbnNpdGl2ZVRleHREb2VzTm90RXF1YWwsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsVGV4dCwgaW5kZXg6IDIxIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZVRleHRTdGFydHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2Vuc2l0aXZlVGV4dFN0YXJ0c1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5Db25maWRlbnRpYWxUZXh0LCBpbmRleDogMjIgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dE5vdFN0YXJ0c1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVUZXh0Tm90U3RhcnRzV2l0aEFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbFRleHQsIGluZGV4OiAyMyB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVUZXh0RW5kc1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVUZXh0RW5kc1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5Db25maWRlbnRpYWxUZXh0LCBpbmRleDogMjQgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuU2Vuc2l0aXZlVGV4dE5vdEVuZHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2Vuc2l0aXZlVGV4dE5vdEVuZHNXaXRoQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsVGV4dCwgaW5kZXg6IDI1IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlNlbnNpdGl2ZUFycmF5Q29udGFpbnNBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5TZW5zaXRpdmVBcnJheUNvbnRhaW5zQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQ29uZmlkZW50aWFsQXJyYXksIGluZGV4OiAyNiB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5TZW5zaXRpdmVBcnJheURvZXNOb3RDb250YWluQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuU2Vuc2l0aXZlQXJyYXlEb2VzTm90Q29udGFpbkFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkNvbmZpZGVudGlhbEFycmF5LCBpbmRleDogMjcgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dEVxdWFscywgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5UZXh0RXF1YWxzLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlRleHQsIGluZGV4OiAyOCB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5UZXh0RG9lc05vdEVxdWFsLCBsYWJlbDogVXNlckNvbXBhcmF0b3JUZXh0LlRleHREb2VzTm90RXF1YWwsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDI5IH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLlRleHRTdGFydHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuVGV4dFN0YXJ0c1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBpbmRleDogMzAgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dE5vdFN0YXJ0c1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5UZXh0Tm90U3RhcnRzV2l0aEFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLlRleHQsIGluZGV4OiAzMSB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5UZXh0RW5kc1dpdGhBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5UZXh0RW5kc1dpdGhBbnlPZiwgZ3JvdXA6IENvbXBhcmF0b3JHcm91cC5UZXh0LCBpbmRleDogMzIgfSxcbiAgeyB2YWx1ZTogVXNlckNvbXBhcmF0b3IuVGV4dE5vdEVuZHNXaXRoQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuVGV4dE5vdEVuZHNXaXRoQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuVGV4dCwgaW5kZXg6IDMzIH0sXG4gIHsgdmFsdWU6IFVzZXJDb21wYXJhdG9yLkFycmF5Q29udGFpbnNBbnlPZiwgbGFiZWw6IFVzZXJDb21wYXJhdG9yVGV4dC5BcnJheUNvbnRhaW5zQW55T2YsIGdyb3VwOiBDb21wYXJhdG9yR3JvdXAuQXJyYXksIGluZGV4OiAzNCB9LFxuICB7IHZhbHVlOiBVc2VyQ29tcGFyYXRvci5BcnJheURvZXNOb3RDb250YWluQW55T2YsIGxhYmVsOiBVc2VyQ29tcGFyYXRvclRleHQuQXJyYXlEb2VzTm90Q29udGFpbkFueU9mLCBncm91cDogQ29tcGFyYXRvckdyb3VwLkFycmF5LCBpbmRleDogMzUgfSxcbl1cblxuY29uc3QgZGVmYXVsdENvbXBhcmF0b3JJZHMgPSBbMTYsIDE3LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxOCwgMTldO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNlci1jb25kaXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1jb25kaXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi4vLi4vLi4vY29tcG9uZW50cy5zY3NzJyxcbiAgICAnLi91c2VyLWNvbmRpdGlvbi5jb21wb25lbnQuc2NzcydcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBEYXRlQWRhcHRlciwgdXNlQ2xhc3M6IEFwcERhdGVBZGFwdGVyIH1cbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVXNlckNvbmRpdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHJlYWRvbmx5IHNlcGFyYXRvcktleXNDb2RlcyA9IFtFTlRFUiwgQ09NTUFdIGFzIGNvbnN0O1xuXG4gIEZvcm1IZWxwZXIgPSBGb3JtSGVscGVyO1xuXG4gIEBJbnB1dCgpIHRhcmdldGluZ1J1bGVJbmRleDogbnVtYmVyO1xuICBASW5wdXQoKSBjb25kaXRpb25JbmRleDogbnVtYmVyO1xuICBASW5wdXQoKSByZWFkT25seTogYm9vbGVhbjtcbiAgQElucHV0KCkgZmVhdHVyZUZsYWdMaW1pdGF0aW9uczogSUZlYXR1cmVGbGFnTGltaXRhdGlvbnM7XG4gIEBJbnB1dCgpIGZvcm1Hcm91cDogRm9ybUdyb3VwPFVzZXJDb25kaXRpb25Gb3JtPjtcbiAgbWF0Q2hpcEdyaWQ6IE1hdENoaXBHcmlkO1xuXG4gIEBWaWV3Q2hpbGQoXCJjaGlwR3JpZFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IHNldE1hdENoaXBHcmlkKG1hdENoaXBHcmlkOiBNYXRDaGlwR3JpZCkge1xuICAgIHRoaXMubWF0Q2hpcEdyaWQgPSBtYXRDaGlwR3JpZDtcbiAgfVxuXG4gIGRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcyA9IFsnSWRlbnRpZmllcicsICdFbWFpbCcsICdDb3VudHJ5J107XG5cbiAgZGF0ZVZhbHVlOiBEYXRlO1xuICB0aW1lVmFsdWU6IHN0cmluZztcblxuICBjb21wYXJhdG9yU3VnZ2VzdGlvbnMgPSBuZXcgTWFwPGFueSwgYW55PigpO1xuICBzZWxlY3RlZENvbXBhcmF0b3I6IFVzZXJDb21wYXJhdG9yO1xuICBjb21wYXJhdG9yU2VwYXJhdG9yID0gXCLilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcIjtcblxuICBrZWVwT3JkZXIgPSAoYTogYW55LCBfOiBhbnkpID0+IGE7XG5cbiAgUm9sbG91dFJ1bGVDb21wYXJhdG9yVjJUeXBlID0gVXNlckNvbXBhcmF0b3JUeXBlO1xuICByb2xsb3V0UnVsZUNvbXBhcmF0b3JUeXBlOiBVc2VyQ29tcGFyYXRvclR5cGU7XG4gIGlzQ2xlYXJUZXh0Q29tcGFyYXRvclNlbGVjdGVkOiBib29sZWFuO1xuXG4gIC8vIFRoZSBjaGlwIGdyaWQncyBbZm9ybUNvbnRyb2xdIG9ubHkgYWNjZXB0cyBhIEZvcm1Db250cm9sLiBXZSBoYXZlIGEgRm9ybUFycmF5IChiZWNhdXNlIG9mIHRoZSBuYW1lK2hpbnQpLlxuICAvLyBXZSBoYXZlIHRvIGZha2UgYSBGb3JtQ29udHJvbCBhbmQgbWF0Y2ggdGhhdCBmb3JtQ29udHJvbCdzIGVycm9yc3RhdGUgd2l0aCB0aGUgb3JpZ2luYWwgY29tcG9uZW50J3MgZXJyb3JTdGF0ZS5cbiAgZmFrZUZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycpO1xuICBlcnJvclN0YXRlTWF0Y2hlcjogTGlzdFZhbHVlRXJyb3JTdGF0ZU1hdGNoZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtR2VuZXJhdG9yOiBGb3JtR2VuZXJhdG9yLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBjb21wYXJpc29uVmFsdWVMaXN0SGVscGVyOiBDb21wYXJpc29uVmFsdWVMaXN0SGVscGVyLFxuICAgIHByaXZhdGUgY2xpcGJvYXJkOiBDbGlwYm9hcmQsXG4gICAgcHJpdmF0ZSBtZXNzYWdpbmdTZXJ2aWNlOiBNZXNzYWdpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGxvdXRSdWxlQ29tcGFyYXRvclR5cGUgPSB0aGlzLmZvcm1HZW5lcmF0b3IuZ2V0Q29tcGFyaXNvblZhbHVlVHlwZSh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgICB0aGlzLmlzQ2xlYXJUZXh0Q29tcGFyYXRvclNlbGVjdGVkID0gdGhpcy5pc0NsZWFyVGV4dENvbXBhcmF0b3IodGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSk7XG4gICAgdGhpcy5lcnJvclN0YXRlTWF0Y2hlciA9IG5ldyBMaXN0VmFsdWVFcnJvclN0YXRlTWF0Y2hlcih0aGlzLmZvcm1Hcm91cCk7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBhcmF0b3IgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlO1xuICAgIHRoaXMuY2FsY0NvbXBhcmF0b3JzKCk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKDxIVE1MU2VsZWN0RWxlbWVudD5ldmVudC50YXJnZXQpLnZhbHVlO1xuICAgIGlmICh0aGlzLmRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcy5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgIGlmICh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5jYWxjQ29tcGFyYXRvcnModHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSAnJykge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgdGhpcy5jYWxjQ29tcGFyYXRvcnModHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgY29tcGFyYXRvckNoYW5nZWQodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJzaG93YWxsXCIpIHtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBhcmF0b3IgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmNvbXBEaWFsb2coKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnNldFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wYXJhdG9yID0gdmFsdWU7XG4gICAgdGhpcy5pc0NsZWFyVGV4dENvbXBhcmF0b3JTZWxlY3RlZCA9IHRoaXMuaXNDbGVhclRleHRDb21wYXJhdG9yKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpO1xuXG4gICAgY29uc3Qgb2xkUm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZSA9IHRoaXMucm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZTtcbiAgICB0aGlzLnJvbGxvdXRSdWxlQ29tcGFyYXRvclR5cGUgPSB0aGlzLmZvcm1HZW5lcmF0b3IuZ2V0Q29tcGFyaXNvblZhbHVlVHlwZSh0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgICBpZiAob2xkUm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZSAhPT0gdGhpcy5yb2xsb3V0UnVsZUNvbXBhcmF0b3JUeXBlKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWU6IElDb21wYXJpc29uVmFsdWVNb2RlbCA9IHRoaXMucm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZSA9PT0gVXNlckNvbXBhcmF0b3JUeXBlLkRhdGVUaW1lID8ge1xuICAgICAgICBkb3VibGVWYWx1ZTogbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwLjBcbiAgICAgIH0gOiB7fTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2woJ2NvbXBhcmlzb25WYWx1ZScsIHRoaXMuZm9ybUdlbmVyYXRvci5nZW5lcmF0ZUNvbXBhcmlzb25WYWx1ZUZvcm1Hcm91cChkZWZhdWx0VmFsdWUsIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUsIGZhbHNlLCB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMpKVxuICAgIH1cbiAgfVxuXG4gIGNvbXBEaWFsb2coKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb21wYXJhdG9yRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzExMzBweCcsXG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICB0b3A6IHdpbmRvdy5pbm5lckhlaWdodCA8IDc1MCA/ICcwcHgnIDogd2luZG93LmlubmVySGVpZ2h0IDwgOTUwID8gJzUwcHgnIDogJzEwMHB4JyxcbiAgICAgIH0sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5LFxuICAgICAgICBzZWxlY3RlZENvbXBhcmF0b3I6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWVcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgIT09IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgICAgdGhpcy5jb21wYXJhdG9yQ2hhbmdlZChyZXN1bHQpO1xuICAgICAgICB0aGlzLmNhbGNDb21wYXJhdG9ycygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgICBldmVudC5jaGlwSW5wdXQ/LmNsZWFyKCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJywnKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5hZGRDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVJdGVtcyhcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSxcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZSxcbiAgICAgICAgW3sgdmFsdWUgfV0sXG4gICAgICAgIHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6ICdIb3cgd291bGQgeW91IGxpa2UgdG8gYWRkIHRoZSBpdGVtcz8nLFxuICAgICAgICBib2R5OiBgV2UndmUgbm90aWNlZCBhIGNvbW1hIGluIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBhZGQuIDxici8+IERvIHlvdSB3YW50IHRvIGFkZCBpdCBhcyBhIHNpbmdsZSBpdGVtLCBvciB3b3VsZCB5b3UgcHJlZmVyIHRvIGluc2VydCBtdWx0aXBsZSBpdGVtcyBzZXBhcmF0ZWQgYnkgY29tbWFzP2AsXG4gICAgICAgIHllc0J1dHRvbkxhYmVsOiAnQWRkIG11bHRpcGxlIGl0ZW1zJyxcbiAgICAgICAgbm9CdXR0b25MYWJlbDogJ0FkZCBhcyBhIHNpbmdsZSBpdGVtJ1xuICAgICAgfSxcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ3llcycpIHtcbiAgICAgICAgICBjb25zdCBjb21wYXJpc29uVmFsdWVMaXN0UGFyc2VSZXN1bHQgPSB0aGlzLmNvbXBhcmlzb25WYWx1ZUxpc3RIZWxwZXIucGFyc2VWYWx1ZXNGcm9tQ3N2KHZhbHVlKTtcbiAgICAgICAgICBpZiAoY29tcGFyaXNvblZhbHVlTGlzdFBhcnNlUmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2hvd1dhcm5pbmdTbmFjaygnUGFyc2UgZXJyb3InKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb25WYWx1ZUxpc3RQYXJzZVJlc3VsdC5jb21wYXJpc29uVmFsdWVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5hZGRDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVJdGVtcyhcbiAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSxcbiAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZSxcbiAgICAgICAgICAgICAgY29tcGFyaXNvblZhbHVlTGlzdFBhcnNlUmVzdWx0LmNvbXBhcmlzb25WYWx1ZUxpc3QsXG4gICAgICAgICAgICAgIHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9ybUdlbmVyYXRvci5hZGRDb21wYXJpc29uVmFsdWVMaXN0VmFsdWVJdGVtcyhcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUsXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLFxuICAgICAgICAgICAgW3sgdmFsdWUgfV0sXG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuY29udHJvbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICB9XG5cbiAgZWRpdChpbmRleDogbnVtYmVyLCBldmVudDogTWF0Q2hpcEVkaXRlZEV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZS50cmltKCk7XG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8yNjU4NCNpc3N1ZWNvbW1lbnQtMTY5OTQ2OTYwNVxuICAgIC8vIFRoZSBtYXQgY2hpcCBjb250cm9sIGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIGxvbmcgdmFsdWVzLiBUaGUgYmFzaWMgc2V0dXAgaXMgb3ZlcmZsb3c6IHZpc2libGUuXG4gICAgLy8gVGhlIG92ZXJmbG93OmhpZGRlbiwgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXMgaXMgc29sdmVkIGluIHRoZSBzdHlsZXMuc2NzczpcbiAgICAvLy5tZGMtZXZvbHV0aW9uLWNoaXAtc2V0IC5tZGMtZXZvbHV0aW9uLWNoaXAge1xuICAgIC8vICAubWRjLWV2b2x1dGlvbi1jaGlwX19jZWxsLS1wcmltYXJ5LFxuICAgIC8vICAubWRjLWV2b2x1dGlvbi1jaGlwX19hY3Rpb24tLXByaW1hcnksXG4gICAgLy8gIC5tYXQtbWRjLWNoaXAtYWN0aW9uLWxhYmVsIHtcbiAgICAvLyAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIC8vICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgLy8gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgLy8gIH1cbiAgICAvLyB9XG4gICAgLy8gXG4gICAgLy8gVGhpcyB3b3JrcyB0b3RhbGx5IGZpbmUgdW50aWwgeW91IGVkaXQgYSBjaGlwJ3MgdmFsdWUgdGhhdCBpcyBsb25nIChkb3VibGUgY2xpY2sgb24gaXQpIFxuICAgIC8vIGFuZCBlLmcuIGluc2VydCBhIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoZSB2YWx1ZS5cbiAgICAvLyBBZnRlciBmb2N1c2luZyBvdXQgZnJvbSB0aGUgaW5wdXQsIHRoZSBvcmlnaW5hbCBjaGlwJ3MgdmFsdWUgaXMgc2hpZnRlZCBvciBldmVuIG1pc3NpbmcgaWYgdGhlIHRleHQgaXMgbG9uZyBlbm91Z2guIFxuICAgIC8vIElmIHdlIHNldCB0aGUgaW5wdXQncyB2YWx1ZSB0byAnJyBoZXJlLCB0aGUgc2hpZnRpbmcgaXMgc29sdmVkIGFuZCBldmVyeXRoaW5nIHdvcmtzIGFzIGV4cGVjdGVkXG4gICAgKGV2ZW50LmNoaXAgYXMgTWF0Q2hpcFJvdykuZGVmYXVsdEVkaXRJbnB1dD8uc2V0VmFsdWUoJycpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhpcy5yZW1vdmUoaW5kZXgpO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9sc1tpbmRleF0ucGF0Y2hWYWx1ZSh7IHZhbHVlIH0pO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9sc1tpbmRleF0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUubWFya0FzRGlydHkoKTtcbiAgICB9XG4gIH1cblxuICBleHBhbmRUZXh0KCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUG9wb3V0VGV4dEVkaXRvckRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICBkYXRhOiA8UG9wb3V0VGV4dEVkaXRvckRpYWxvZ0RhdGE+e1xuICAgICAgICB2YWx1ZTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlLnZhbHVlLFxuICAgICAgICByZWFkT25seTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlLmRpc2FibGVkLFxuICAgICAgICB2YWxpZGF0b3JzOiB0aGlzLnJvbGxvdXRSdWxlQ29tcGFyYXRvclR5cGUgPT09IFVzZXJDb21wYXJhdG9yVHlwZS5TZW12ZXJcbiAgICAgICAgICA/IHRoaXMuZm9ybUdlbmVyYXRvci5nZXRDb21wYXJpc29uVmFsdWVTZW12ZXJWYWxpZGF0b3JzKHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucylcbiAgICAgICAgICA6IHRoaXMuZm9ybUdlbmVyYXRvci5nZXRDb21wYXJpc29uVmFsdWVTdHJpbmdWYWxpZGF0b3JzKHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyksXG4gICAgICAgIG1heFZhbHVlTGVuZ3RoOiB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMubWF4Q29tcGFyaXNvblZhbHVlTGVuZ3RoLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ01vZGlmeSB0aGUgdGV4dCB3aXRoaW4gdGhlIGVkaXRvciB0byBjaGFuZ2UgdGhlIGNvbXBhcmlzb24gdmFsdWUuIFRoZSBlZGl0b3Igc3VwcG9ydHMgSlNPTiBzeW50YXggaGlnaGxpZ2h0aW5nLidcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEudmFsdWUgIT09IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS52YWx1ZSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWUuc2V0VmFsdWUoZGF0YS52YWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZXhwYW5kTGlzdCgpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFBvcG91dExpc3RFZGl0b3JEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjcwcHgnLFxuICAgICAgZGF0YTogPFBvcG91dExpc3RFZGl0b3JEaWFsb2dEYXRhPntcbiAgICAgICAgY29tcGFyaXNvblZhbHVlTGlzdDogdGhpcy5nZXRSYXdWYWx1ZSgpLFxuICAgICAgICBjb21wYXJhdG9yOiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlLFxuICAgICAgICBmZWF0dXJlRmxhZ0xpbWl0YXRpb25zOiB0aGlzLmZlYXR1cmVGbGFnTGltaXRhdGlvbnMsXG4gICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChkYXRhOiB7IGNvbXBhcmlzb25WYWx1ZUxpc3Q6IElDb21wYXJpc29uVmFsdWVMaXN0TW9kZWxbXSB9KSA9PiB7XG4gICAgICBpZiAoZGF0YT8uY29tcGFyaXNvblZhbHVlTGlzdCkge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS52YWx1ZVxuICAgICAgICAgICAgLm1hcChsID0+IHsgcmV0dXJuIHsgdmFsdWU6IGwudmFsdWUsIGhpbnQ6IGwuaGludCB9OyB9KTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBkYXRhLmNvbXBhcmlzb25WYWx1ZUxpc3RcbiAgICAgICAgICAubWFwKGwgPT4geyByZXR1cm4geyB2YWx1ZTogbC52YWx1ZSwgaGludDogbC5oaW50IH07IH0pO1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkob2xkVmFsdWUpID09PSBKU09OLnN0cmluZ2lmeShuZXdWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9XG4gICAgICAgICAgdGhpcy5mb3JtR2VuZXJhdG9yLmdldENvbXBhcmlzb25WYWx1ZVR5cGUodGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkgPT09IFVzZXJDb21wYXJhdG9yVHlwZS5TZW12ZXJMaXN0XG4gICAgICAgICAgICA/IHRoaXMuZm9ybUdlbmVyYXRvci5nZXRDb21wYXJpc29uVmFsdWVTZW12ZXJMaXN0SXRlbVZhbGlkYXRvcnModGhpcy5mZWF0dXJlRmxhZ0xpbWl0YXRpb25zKVxuICAgICAgICAgICAgOiB0aGlzLmZvcm1HZW5lcmF0b3IuZ2V0Q29tcGFyaXNvblZhbHVlU3RyaW5nTGlzdEl0ZW1WYWxpZGF0b3JzKHRoaXMuZmVhdHVyZUZsYWdMaW1pdGF0aW9ucyk7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZm9ybUdlbmVyYXRvci5nZW5lcmF0ZUNvbXBhcmlzb25WYWx1ZUxpc3RWYWx1ZUFycmF5KGRhdGEuY29tcGFyaXNvblZhbHVlTGlzdCwgdGhpcy5yZWFkT25seSwgdGhpcy5mZWF0dXJlRmxhZ0xpbWl0YXRpb25zLCB2YWxpZGF0b3JzKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLnNldENvbnRyb2woJ2xpc3RWYWx1ZScsIGZvcm1BcnJheSk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlQWxsKCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuY29udHJvbHMuc3BsaWNlKDAsIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuY29udHJvbHMubGVuZ3RoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBjb3B5VmFsdWVzQXNDc3YoKSB7XG4gICAgdGhpcy5jb3B5VG9DbGlwYm9hcmQodGhpcy5jb21wYXJpc29uVmFsdWVMaXN0SGVscGVyLmZvcm1hdFZhbHVlc0FzQ3N2KHRoaXMuZ2V0UmF3VmFsdWUoKSkpO1xuICB9XG5cbiAgY29weVRvQ2xpcGJvYXJkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY2xpcGJvYXJkLmNvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2hvd1N1Y2Nlc3NTbmFjayhcIkNvcGllZCB0byBjbGlwYm9hcmQuXCIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMubWVzc2FnaW5nU2VydmljZS5zaG93U3VjY2Vzc1NuYWNrKFwiQ2xpcGJvYXJkIHVuYXZhaWxhYmxlLlwiKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lc3NhZ2luZ1NlcnZpY2Uuc2hvd1dhcm5pbmdTbmFjayhcIk5vdGhpbmcgdG8gYmUgY29waWVkLlwiKTtcbiAgICB9XG4gIH1cblxuICBnZXRSYXdWYWx1ZSgpOiBJQ29tcGFyaXNvblZhbHVlTGlzdE1vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLnZhbHVlLm1hcCh2ID0+IHsgcmV0dXJuIHsgdmFsdWU6IHYudmFsdWUsIGhpbnQ6IHYuaGludCB9IH0pO1xuICB9XG5cbiAgaXNWYWx1ZUludmFsaWQobGlzdFZhbHVlSXRlbUNvbnRyb2w6IEZvcm1Hcm91cDxDb21wYXJpc29uVmFsdWVMaXN0Rm9ybT4pIHtcbiAgICByZXR1cm4gbGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMudmFsdWUudG91Y2hlZCAmJiBsaXN0VmFsdWVJdGVtQ29udHJvbC5jb250cm9scy52YWx1ZS5pbnZhbGlkO1xuICB9XG5cbiAgaXNIaW50SW52YWxpZChsaXN0VmFsdWVJdGVtQ29udHJvbDogRm9ybUdyb3VwPENvbXBhcmlzb25WYWx1ZUxpc3RGb3JtPikge1xuICAgIHJldHVybiBsaXN0VmFsdWVJdGVtQ29udHJvbC5jb250cm9scy5oaW50LnRvdWNoZWQgJiYgbGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMuaGludC5pbnZhbGlkO1xuICB9XG5cbiAgaXNMaXN0VmFsdWVJdGVtSW52YWxpZChsaXN0VmFsdWVJdGVtQ29udHJvbDogRm9ybUdyb3VwPENvbXBhcmlzb25WYWx1ZUxpc3RGb3JtPikge1xuICAgIHJldHVybiB0aGlzLmlzVmFsdWVJbnZhbGlkKGxpc3RWYWx1ZUl0ZW1Db250cm9sKSB8fCB0aGlzLmlzSGludEludmFsaWQobGlzdFZhbHVlSXRlbUNvbnRyb2wpO1xuICB9XG5cbiAgZ2V0TGlzdFZhbHVlSXRlbVRvb2x0aXBNZXNzYWdlKGxpc3RWYWx1ZUl0ZW1Db250cm9sOiBGb3JtR3JvdXA8Q29tcGFyaXNvblZhbHVlTGlzdEZvcm0+KSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUludmFsaWQobGlzdFZhbHVlSXRlbUNvbnRyb2wpKSB7XG4gICAgICByZXR1cm4gRm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UobGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0hpbnRJbnZhbGlkKGxpc3RWYWx1ZUl0ZW1Db250cm9sKSkge1xuICAgICAgcmV0dXJuIFwiSGludDpcIiArIEZvcm1IZWxwZXIuZ2V0RXJyb3JNZXNzYWdlKGxpc3RWYWx1ZUl0ZW1Db250cm9sLmNvbnRyb2xzLmhpbnQpO1xuICAgIH1cbiAgICBpZiAobGlzdFZhbHVlSXRlbUNvbnRyb2wuY29udHJvbHMuaGludC52YWx1ZSkge1xuICAgICAgcmV0dXJuIGxpc3RWYWx1ZUl0ZW1Db250cm9sLmNvbnRyb2xzLmhpbnQudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBcIk5vIGhpbnRcIjtcbiAgfVxuXG4gIGNhbGNDb21wYXJhdG9ycyhyZXNldFZhbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYnVpbGRDb21wYXJhdG9yU3VnZ2VzdGlvbnMoZGVmYXVsdENvbXBhcmF0b3JJZHMsIHJlc2V0VmFsKTtcbiAgfVxuXG4gIGJ1aWxkQ29tcGFyYXRvclN1Z2dlc3Rpb25zKGlkczogbnVtYmVyW10sIHJlc2V0VmFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IGNvbXBzID0gaWRzLm1hcChpZCA9PiBhbGxDb21wYXJhdG9yc1tpZF0pO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gYWxsQ29tcGFyYXRvcnMuZmluZCh2YWwgPT4gdmFsLnZhbHVlID09PSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKTtcbiAgICBpZiAocmVzZXRWYWwgJiYgIWlkcy5pbmNsdWRlcyhzZWxlY3RlZC5pbmRleCkgJiYgdGhpcy5pc051bGxDb21wVmFsKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS52YWx1ZSkpIHtcbiAgICAgIHRoaXMuY29tcGFyYXRvckNoYW5nZWQoY29tcHNbMF0udmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoIWlkcy5pbmNsdWRlcyhzZWxlY3RlZC5pbmRleCkpIHtcbiAgICAgIGlmIChzZWxlY3RlZC52YWx1ZSA9PT0gVXNlckNvbXBhcmF0b3IuQ29udGFpbnNBbnlPZiB8fCBzZWxlY3RlZC52YWx1ZSA9PT0gVXNlckNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW5BbnlPZikge1xuICAgICAgICBjb21wcyA9IFthbGxDb21wYXJhdG9yc1syXSwgYWxsQ29tcGFyYXRvcnNbM10sIC4uLmNvbXBzXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IGFsbENvbXBhcmF0b3JzLmZpbHRlcih2YWwgPT4gdmFsLmdyb3VwID09PSBzZWxlY3RlZC5ncm91cCk7XG4gICAgICAgIGNvbXBzID0gWy4uLnNlbGVjdGVkR3JvdXAsIC4uLmNvbXBzXVxuICAgICAgfVxuICAgIH1cbiAgICBjb21wcyA9IHRoaXMuZGVkdXBDb21wcyhjb21wcyk7XG4gICAgdGhpcy5jb21wYXJhdG9yU3VnZ2VzdGlvbnMgPSBjb21wcy5yZWR1Y2UoKGVudHJ5TWFwLCBlKSA9PiBlbnRyeU1hcC5zZXQoZS5ncm91cCwgWy4uLmVudHJ5TWFwLmdldChlLmdyb3VwKSB8fCBbXSwgZV0pLCBuZXcgTWFwKCkpO1xuICAgIHRoaXMuY29tcGFyYXRvclNlcGFyYXRvciA9IHRoaXMuZ2VuU2VwYXJhdG9yKGNvbXBzKTtcbiAgfVxuXG4gIGRlZHVwQ29tcHMoY29tcHM6IElDb21wYXJhdG9yVmFsdWVbXSk6IElDb21wYXJhdG9yVmFsdWVbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBJQ29tcGFyYXRvclZhbHVlW10gPSBbXTtcbiAgICBjb21wcy5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICBpZiAoIXJlc3VsdC5maW5kKGUgPT4gZS5pbmRleCA9PT0gdmFsLmluZGV4KSkge1xuICAgICAgICByZXN1bHQucHVzaCh2YWwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZW5TZXBhcmF0b3IoY29tcHM6IElDb21wYXJhdG9yVmFsdWVbXSk6IHN0cmluZyB7XG4gICAgbGV0IG1heCA9IDA7XG4gICAgY29tcHMuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgaWYgKHZhbC5sYWJlbC5sZW5ndGggPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gdmFsLmxhYmVsLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQXJyYXkobWF4KS5qb2luKFwi4pSAXCIpO1xuICB9XG5cbiAgaXNOdW1iZXJBcnIodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWwubGVuZ3RoID4gMCAmJiB2YWwuZXZlcnkoaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpO1xuICB9XG5cbiAgaXNOdWxsQ29tcFZhbChjb21wVmFsOiBQYXJ0aWFsPHsgc3RyaW5nVmFsdWU/OiBzdHJpbmc7IGRvdWJsZVZhbHVlPzogbnVtYmVyOyBsaXN0VmFsdWU/OiBQYXJ0aWFsPHsgdmFsdWU6IHN0cmluZzsgaGludD86IHN0cmluZzsgaW5kZXg6IG51bWJlcjsgfT5bXTsgfT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWNvbXBWYWwuZG91YmxlVmFsdWUgJiYgIWNvbXBWYWwubGlzdFZhbHVlICYmICFjb21wVmFsLnN0cmluZ1ZhbHVlO1xuICB9XG5cblxuICBpc0NsZWFyVGV4dENvbXBhcmF0b3IoY29tcGFyYXRvcjogVXNlckNvbXBhcmF0b3IpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGNvbXBhcmF0b3IpIHtcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dFN0YXJ0c1dpdGhBbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dEVuZHNXaXRoQW55T2Y6XG4gICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLlRleHROb3RTdGFydHNXaXRoQW55T2Y6XG4gICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLlRleHROb3RFbmRzV2l0aEFueU9mOlxuICAgICAgY2FzZSBVc2VyQ29tcGFyYXRvci5BcnJheUNvbnRhaW5zQW55T2Y6XG4gICAgICBjYXNlIFVzZXJDb21wYXJhdG9yLkFycmF5RG9lc05vdENvbnRhaW5BbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuQ29udGFpbnNBbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW5BbnlPZjpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dEVxdWFsczpcbiAgICAgIGNhc2UgVXNlckNvbXBhcmF0b3IuVGV4dERvZXNOb3RFcXVhbDogcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb3BlbkNsZWFydGV4dEluZm9EaWFsb2coKSB7XG4gICAgdGhpcy5kaWFsb2cub3BlbihJbmZvRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6IGBDb25zaWRlciB1c2luZyBjb25maWRlbnRpYWwgY29tcGFyYXRvcnNgLFxuICAgICAgICBib2R5OiBgQ29tcGFyaXNvbiB2YWx1ZSB3aWxsIGJlIHByZXNlbnRlZCBhcyBwbGFpbiB0ZXh0IFxuICAgICAgICBpbiB0aGUgPGk+Y29uZmlnIEpTT048L2k+LiBJZiB5b3UgaGF2ZSBzZW5zaXRpdmUgZGF0YSwgY29uc2lkZXIgdXNpbmcgb25lIG9mIHRoZSBjb25maWRlbnRpYWwgKGhhc2hlZCkgY29tcGFyYXRvcnMuPGJyLz48YnIvPlxuICAgICAgICBTZWUgdGhlIDxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy90YXJnZXRpbmcvdGFyZ2V0aW5nLXJ1bGUvdXNlci1jb25kaXRpb24vI2NvbmZpZGVudGlhbC10ZXh0LWNvbXBhcmF0b3JzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+ZG9jdW1lbnRhdGlvbjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uYCxcbiAgICAgICAgc2Vjb25kYXJ5QnV0dG9uTGFiZWw6ICdPcGVuIGNvbXBhcmF0b3Igc2VsZWN0b3InLFxuICAgICAgICBzZWNvbmRhcnlCdXR0b25BY3Rpb246ICgpID0+IHRoaXMuY29tcERpYWxvZygpXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcnVsZS1saW5lIHNtYWxsZXN0LWZvcm0tZmllbGRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZXhwbGFuYXRpb24td3JhcHBlclwiPlxuICAgICAgICA8YXBwLWNvbmRpdGlvbi1jaGlwIFt0YXJnZXRpbmdSdWxlSW5kZXhdPVwidGFyZ2V0aW5nUnVsZUluZGV4XCJcbiAgICAgICAgICAgIFtjb25kaXRpb25JbmRleF09XCJjb25kaXRpb25JbmRleFwiPjwvYXBwLWNvbmRpdGlvbi1jaGlwPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJleHBsYW5hdGlvblwiPjxhIGhyZWY9XCJodHRwczovL2NvbmZpZ2NhdC5jb20vZG9jcy90YXJnZXRpbmcvdGFyZ2V0aW5nLXJ1bGUvdXNlci1jb25kaXRpb24vXCJcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgY2xhc3M9XCJ1c2VyLWxpbmtcIj51c2VyJ3M8L2E+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwid3JhcHBlci1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlci1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBwYWQtcmlnaHRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21hbGwnOiBkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSkgPT09IC0xfVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtYXROYXRpdmVDb250cm9sIChjaGFuZ2UpPVwiYXR0cmlidXRlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS5kaXNhYmxlZFwiIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIGF0dHJpYnV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyaXNvbkF0dHJpYnV0ZSBvZiBkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJjb21wYXJpc29uQXR0cmlidXRlID09PSBmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyaXNvbkF0dHJpYnV0ZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcy5pbmRleE9mKGZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlLnZhbHVlKSA9PT0gLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtY29tcG9uZW50IHBhZC1yaWdodCBzbWFsbFwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZSkgIT09IC0xXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiAoYmx1cik9XCJjYWxjQ29tcGFyYXRvcnModHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uQXR0cmlidXRlXCIgbWF0VG9vbHRpcD1cIkN1c3RvbSBjb21wYXJpc29uIGF0dHJpYnV0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tGb3JtSGVscGVyLmdldEVycm9yTWVzc2FnZShmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZSl9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcnVsZS1jb21wb25lbnQgcGFkLXJpZ2h0IGNvbXBhcmF0b3JcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IG1hdE5hdGl2ZUNvbnRyb2wgKGNoYW5nZSk9XCJjb21wYXJhdG9yQ2hhbmdlZChzZWxlY3RlZENvbXBhcmF0b3IpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENvbXBhcmF0b3JcIiBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIiBtYXRUb29sdGlwPVwiQ29tcGFyYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGNvbXBhcmF0b3JTdWdnZXN0aW9ucyB8IGtleXZhbHVlOiBrZWVwT3JkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicmbmJzcDsnICsgZ3JvdXAua2V5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIGdyb3VwLnZhbHVlXCIgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGFyYXRvci5sYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwIFtsYWJlbF09XCJjb21wYXJhdG9yU2VwYXJhdG9yXCI+PC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNob3dhbGxcIj4mbmJzcDsmbmJzcDtTSE9XIEFMTCBDT01QQVJBVE9SUyZuYnNwOyZuYnNwOzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0U3VmZml4IGNsYXNzPVwiaW5wdXQtYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQWxsIGNvbXBhcmF0b3JzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbXBEaWFsb2coKVwiPjxtYXQtaWNvbj5saXN0X2FsdDwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJhdG9yLmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICAgICAge3tGb3JtSGVscGVyLmdldEVycm9yTWVzc2FnZShmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyYXRvcil9fVxuICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicm9sbG91dFJ1bGVDb21wYXJhdG9yVHlwZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuU3RyaW5nXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRleHRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuU2VtdmVyXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbXZlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlJvbGxvdXRSdWxlQ29tcGFyYXRvclYyVHlwZS5TdHJpbmdMaXN0XCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuU2VtdmVyTGlzdFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJsaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUm9sbG91dFJ1bGVDb21wYXJhdG9yVjJUeXBlLk51bWJlclwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJudW1iZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJSb2xsb3V0UnVsZUNvbXBhcmF0b3JWMlR5cGUuRGF0ZVRpbWVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF0ZVRpbWVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0ZXh0VGVtcGxhdGU+XG4gICAgPGRpdiAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWVcIiBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBncm93XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29tcGFyaXNvbiB2YWx1ZSAodGV4dClcIiBwbGFjZWhvbGRlcj1cIkFkZCB0ZXh0IC4uLlwiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdFByZWZpeCBjbGFzcz1cInByZWZpeC1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiaXNDbGVhclRleHRDb21wYXJhdG9yU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ2xlYXJ0ZXh0SW5mb0RpYWxvZygpXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiVGhpcyBjb21wYXJpc29uIHZhbHVlIHdvbid0IGJlIGhhc2hlZC4gQ2xpY2sgZm9yIG1vcmUgaW5mby5cIj48bWF0LWljb24+bG9ja19vcGVuX3JpZ2h0PC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0U3VmZml4IGNsYXNzPVwiaW5wdXQtYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQWR2YW5jZWQgZWRpdG9yXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwYW5kVGV4dCgpXCI+PG1hdC1pY29uPmVkaXRfbm90ZTwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZS5pbnZhbGlkXCI+XG4gICAgICAgICAgICAgICAge3tGb3JtSGVscGVyLmdldEVycm9yTWVzc2FnZShmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLnN0cmluZ1ZhbHVlKX19XG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuPG5nLXRlbXBsYXRlICNzZW12ZXJUZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZVwiIGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtY29tcG9uZW50IGdyb3dcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWVcIlxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb21wYXJpc29uIHZhbHVlIChzZW1hbnRpYyB2ZXJzaW9uKVwiIHBsYWNlaG9sZGVyPVwiQWRkIHNlbWFudGljIHZlcnNpb24gLi4uICgxLjIuMylcIiAvPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuc3RyaW5nVmFsdWUuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgIHt7Rm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UoZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5zdHJpbmdWYWx1ZSl9fVxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3RUZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWVcIlxuICAgICAgICBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBncm93IHNtYWxsLWNoaXAtaW5wdXQgdG9wLWljb24tc3VmZml4XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwR3JpZCBbZm9ybUNvbnRyb2xdPVwiZmFrZUZvcm1Db250cm9sXCIgW2Vycm9yU3RhdGVNYXRjaGVyXT1cImVycm9yU3RhdGVNYXRjaGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsaXN0VmFsdWVJdGVtIG9mIGZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLmNvbnRyb2xzIHwgc2xpY2U6MDoyMDsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImdldExpc3RWYWx1ZUl0ZW1Ub29sdGlwTWVzc2FnZShsaXN0VmFsdWVJdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93IChyZW1vdmVkKT1cInJlbW92ZShpKVwiIFtkaXNhYmxlZF09XCJyZWFkT25seVwiIFtyZW1vdmFibGVdPVwiIXJlYWRPbmx5XCIgY2xhc3M9XCJjaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0YWJsZV09XCIhcmVhZE9ubHlcIiAoZWRpdGVkKT1cImVkaXQoaSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQnOiBpc0xpc3RWYWx1ZUl0ZW1JbnZhbGlkKGxpc3RWYWx1ZUl0ZW0pfVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2xpc3RWYWx1ZUl0ZW0uY29udHJvbHMudmFsdWUudmFsdWV9fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXRDaGlwUmVtb3ZlICpuZ0lmPVwiIXJlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNsYXNzPVwic2hvdy1hbGxcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9scy5sZW5ndGggPiAyMFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRMaXN0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgc2hvdyBhbGwge3tmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5jb250cm9scy5sZW5ndGh9fVxuICAgICAgICAgICAgICAgICAgICBpdGVtczwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIiBbcGxhY2Vob2xkZXJdPVwiIXJlYWRPbmx5ID8gJ0FkZCBpdGVtIHRvIGxpc3QgLi4uJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwR3JpZFwiIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJzZXBhcmF0b3JLZXlzQ29kZXNcIlxuICAgICAgICAgICAgICAgICAgICBtYXRDaGlwSW5wdXRBZGRPbkJsdXIgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZCgkZXZlbnQpXCIgbWF0VG9vbHRpcD1cIkNvbXBhcmlzb24gdmFsdWVzIChsaXN0KVwiIC8+XG4gICAgICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdEljb25QcmVmaXggY2xhc3M9XCJwcmVmaXgtYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cImlzQ2xlYXJUZXh0Q29tcGFyYXRvclNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNsZWFydGV4dEluZm9EaWFsb2coKVwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlRoaXMgY29tcGFyaXNvbiB2YWx1ZSB3b24ndCBiZSBoYXNoZWQuIENsaWNrIGZvciBtb3JlIGluZm8uXCI+PG1hdC1pY29uPmxvY2tfb3Blbl9yaWdodDwvbWF0LWljb24+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdEljb25TdWZmaXggY2xhc3M9XCJpbnB1dC1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJNb3JlLi4uXCJcbiAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibW9yZU1lbnVcIj48bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0SWNvblN1ZmZpeCBjbGFzcz1cImlucHV0LWJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIkFkdmFuY2VkIGVkaXRvclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZExpc3QoKVwiPjxtYXQtaWNvbj5lZGl0X25vdGU8L21hdC1pY29uPjwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5saXN0VmFsdWUuaW52YWxpZCAmJiBmb3JtR3JvdXAuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLmNvbnRyb2xzLmxpc3RWYWx1ZS5lcnJvcnNcIj5cbiAgICAgICAgICAgICAgICB7e0Zvcm1IZWxwZXIuZ2V0RXJyb3JNZXNzYWdlKGZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlKX19XG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLmludmFsaWQgJiYgIWZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMubGlzdFZhbHVlLmVycm9yc1wiPlxuICAgICAgICAgICAgICAgIEludmFsaWQgaXRlbXNcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNudW1iZXJUZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5kb3VibGVWYWx1ZVwiIGNsYXNzPVwidGFyZ2V0aW5nLXJ1bGUtY29tcG9uZW50IGdyb3dcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5kb3VibGVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkNvbXBhcmlzb24gdmFsdWUgKG51bWJlcilcIiBwbGFjZWhvbGRlcj1cIkFkZCBudW1iZXIgLi4uXCIgaW5wdXREaXNwbGF5Tm9ybWFsaXplciAvPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuZG91YmxlVmFsdWUuaW52YWxpZFwiPlxuICAgICAgICAgICAgICAgIHt7Rm9ybUhlbHBlci5nZXRFcnJvck1lc3NhZ2UoZm9ybUdyb3VwLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5jb250cm9scy5kb3VibGVWYWx1ZSl9fVxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RhdGVUaW1lVGVtcGxhdGU+XG4gICAgPGRpdiAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuZG91YmxlVmFsdWVcIiBjbGFzcz1cInRhcmdldGluZy1ydWxlLWNvbXBvbmVudCBkYXRldGltZVwiPlxuICAgICAgICA8YXBwLWRhdGUtdGltZS1waWNrZXIgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9scy5jb21wYXJpc29uVmFsdWUuY29udHJvbHMuZG91YmxlVmFsdWVcIlxuICAgICAgICAgICAgZGF0ZVRvb2x0aXA9XCJDb21wYXJpc29uIHZhbHVlIChkYXRlKVwiIHRpbWVUb29sdGlwPVwiQ29tcGFyaXNvbiB2YWx1ZSAodGltZSlcIiAvPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG48bWF0LW1lbnUgI21vcmVNZW51PlxuICAgIDxhIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImV4cGFuZExpc3QoKVwiPjxtYXQtaWNvbj5lZGl0X25vdGU8L21hdC1pY29uPkFkdmFuY2VkIGVkaXRvcjwvYT5cbiAgICA8YSBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjb3B5VmFsdWVzQXNDc3YoKVwiPjxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPkNvcHkgYXMgQ1NWICh2YWx1ZXMgb25seSk8L2E+XG4gICAgPGEgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVtb3ZlQWxsKClcIiBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIj48bWF0LWljb24+ZGVsZXRlX291dGxpbmU8L21hdC1pY29uPlJlbW92ZVxuICAgICAgICBhbGw8L2E+XG48L21hdC1tZW51PiJdfQ==
|