@hestia-earth/ui-components 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/auth/auth.service.d.ts +10 -0
- package/auth/public-api.d.ts +1 -0
- package/bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component.d.ts +40 -0
- package/bibliographies/bibliographies.module.d.ts +10 -0
- package/bibliographies/public-api.d.ts +2 -0
- package/bundles/hestia-earth-ui-components.umd.js +7570 -0
- package/bundles/hestia-earth-ui-components.umd.js.map +1 -0
- package/common/bind-once.directive.d.ts +10 -0
- package/common/blank-node-diffs/blank-node-diffs.component.d.ts +18 -0
- package/common/blank-node-state/blank-node-state.component.d.ts +36 -0
- package/common/blank-node-state-notice/blank-node-state-notice.component.d.ts +9 -0
- package/common/blank-node-value-delta/blank-node-value-delta.component.d.ts +13 -0
- package/common/click-outside.directive.d.ts +10 -0
- package/common/clipboard/clipboard.component.d.ts +16 -0
- package/common/common.module.d.ts +37 -0
- package/common/common.service.d.ts +11 -0
- package/common/default.pipe.d.ts +7 -0
- package/common/ellipsis.pipe.d.ts +7 -0
- package/common/get.pipe.d.ts +7 -0
- package/common/key-to-label.pipe.d.ts +7 -0
- package/common/keys.pipe.d.ts +7 -0
- package/common/link-key-value/link-key-value.component.d.ts +16 -0
- package/common/logs-utils.d.ts +17 -0
- package/common/maps-drawing-confirm/maps-drawing-confirm.component.d.ts +28 -0
- package/common/maps-utils.d.ts +70 -0
- package/common/pluralize.pipe.d.ts +7 -0
- package/common/popover/popover.component.d.ts +16 -0
- package/common/popover-confirm/popover-confirm.component.d.ts +15 -0
- package/common/precision.pipe.d.ts +7 -0
- package/common/public-api.d.ts +30 -0
- package/common/schema-version-link/schema-version-link.component.d.ts +10 -0
- package/common/skeleton-text/skeleton-text.component.d.ts +11 -0
- package/common/social-tags/social-tags.component.d.ts +12 -0
- package/common/tags-input.directive.d.ts +20 -0
- package/common/times.pipe.d.ts +7 -0
- package/common/toast/toast.component.d.ts +19 -0
- package/common/toast.service.d.ts +16 -0
- package/common/unit-converter/unit-converter.component.d.ts +25 -0
- package/common/utils.d.ts +88 -0
- package/cycles/cycles-activity/cycles-activity.component.d.ts +31 -0
- package/cycles/cycles-activity-logs/cycles-activity-logs.component.d.ts +25 -0
- package/cycles/cycles-completeness/cycles-completeness.component.d.ts +14 -0
- package/cycles/cycles-emissions/cycles-emissions.component.d.ts +40 -0
- package/cycles/cycles-emissions-chart/cycles-emissions-chart.component.d.ts +18 -0
- package/cycles/cycles-emissions-logs/cycles-emissions-logs.component.d.ts +23 -0
- package/cycles/cycles-functional-unit-measure/cycles-functional-unit-measure.component.d.ts +8 -0
- package/cycles/cycles-result/cycles-result.component.d.ts +13 -0
- package/cycles/cycles-suggest-form/cycles-suggest-form.component.d.ts +24 -0
- package/cycles/cycles.model.d.ts +7 -0
- package/cycles/cycles.module.d.ts +19 -0
- package/cycles/public-api.d.ts +10 -0
- package/engine/aggregation-engine.service.d.ts +71 -0
- package/engine/engine.service.d.ts +61 -0
- package/engine/public-api.d.ts +2 -0
- package/esm2015/auth/auth.service.js +19 -0
- package/esm2015/auth/public-api.js +2 -0
- package/esm2015/bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component.js +100 -0
- package/esm2015/bibliographies/bibliographies.module.js +30 -0
- package/esm2015/bibliographies/public-api.js +3 -0
- package/esm2015/common/bind-once.directive.js +23 -0
- package/esm2015/common/blank-node-diffs/blank-node-diffs.component.js +47 -0
- package/esm2015/common/blank-node-state/blank-node-state.component.js +90 -0
- package/esm2015/common/blank-node-state-notice/blank-node-state-notice.component.js +27 -0
- package/esm2015/common/blank-node-value-delta/blank-node-value-delta.component.js +41 -0
- package/esm2015/common/click-outside.directive.js +28 -0
- package/esm2015/common/clipboard/clipboard.component.js +69 -0
- package/esm2015/common/common.module.js +144 -0
- package/esm2015/common/common.service.js +29 -0
- package/esm2015/common/default.pipe.js +23 -0
- package/esm2015/common/ellipsis.pipe.js +17 -0
- package/esm2015/common/get.pipe.js +17 -0
- package/esm2015/common/key-to-label.pipe.js +18 -0
- package/esm2015/common/keys.pipe.js +20 -0
- package/esm2015/common/link-key-value/link-key-value.component.js +55 -0
- package/esm2015/common/logs-utils.js +49 -0
- package/esm2015/common/maps-drawing-confirm/maps-drawing-confirm.component.js +89 -0
- package/esm2015/common/maps-utils.js +101 -0
- package/esm2015/common/pluralize.pipe.js +17 -0
- package/esm2015/common/popover/popover.component.js +37 -0
- package/esm2015/common/popover-confirm/popover-confirm.component.js +38 -0
- package/esm2015/common/precision.pipe.js +20 -0
- package/esm2015/common/public-api.js +31 -0
- package/esm2015/common/schema-version-link/schema-version-link.component.js +39 -0
- package/esm2015/common/skeleton-text/skeleton-text.component.js +44 -0
- package/esm2015/common/social-tags/social-tags.component.js +37 -0
- package/esm2015/common/tags-input.directive.js +74 -0
- package/esm2015/common/times.pipe.js +16 -0
- package/esm2015/common/toast/toast.component.js +37 -0
- package/esm2015/common/toast.service.js +36 -0
- package/esm2015/common/unit-converter/unit-converter.component.js +73 -0
- package/esm2015/common/utils.js +245 -0
- package/esm2015/cycles/cycles-activity/cycles-activity.component.js +92 -0
- package/esm2015/cycles/cycles-activity-logs/cycles-activity-logs.component.js +48 -0
- package/esm2015/cycles/cycles-completeness/cycles-completeness.component.js +41 -0
- package/esm2015/cycles/cycles-emissions/cycles-emissions.component.js +121 -0
- package/esm2015/cycles/cycles-emissions-chart/cycles-emissions-chart.component.js +93 -0
- package/esm2015/cycles/cycles-emissions-logs/cycles-emissions-logs.component.js +63 -0
- package/esm2015/cycles/cycles-functional-unit-measure/cycles-functional-unit-measure.component.js +22 -0
- package/esm2015/cycles/cycles-result/cycles-result.component.js +92 -0
- package/esm2015/cycles/cycles-suggest-form/cycles-suggest-form.component.js +83 -0
- package/esm2015/cycles/cycles.model.js +2 -0
- package/esm2015/cycles/cycles.module.js +66 -0
- package/esm2015/cycles/public-api.js +11 -0
- package/esm2015/engine/aggregation-engine.service.js +126 -0
- package/esm2015/engine/engine.service.js +78 -0
- package/esm2015/engine/public-api.js +3 -0
- package/esm2015/files/files-error.model.js +180 -0
- package/esm2015/files/files-form/files-form.component.js +439 -0
- package/esm2015/files/files-form.model.js +548 -0
- package/esm2015/files/files.module.js +42 -0
- package/esm2015/files/public-api.js +3 -0
- package/esm2015/fontawesome/fontawesome.module.js +36 -0
- package/esm2015/fontawesome/public-api.js +2 -0
- package/esm2015/hestia-earth-ui-components.js +5 -0
- package/esm2015/impact-assessments/impact-assessments-indicator-breakdown-chart/impact-assessments-indicator-breakdown-chart.component.js +161 -0
- package/esm2015/impact-assessments/impact-assessments-indicators-chart/impact-assessments-indicators-chart.component.js +142 -0
- package/esm2015/impact-assessments/impact-assessments-products/impact-assessments-products.component.js +252 -0
- package/esm2015/impact-assessments/impact-assessments-products-logs/impact-assessments-products-logs.component.js +68 -0
- package/esm2015/impact-assessments/impact-assessments.model.js +2 -0
- package/esm2015/impact-assessments/impact-assessments.module.js +47 -0
- package/esm2015/impact-assessments/public-api.js +7 -0
- package/esm2015/mendeley/mendeley.service.js +35 -0
- package/esm2015/mendeley/public-api.js +2 -0
- package/esm2015/node/node-csv-export-confirm/node-csv-export-confirm.component.js +65 -0
- package/esm2015/node/node-csv-select-headers/node-csv-select-headers.component.js +119 -0
- package/esm2015/node/node-csv.service.js +24 -0
- package/esm2015/node/node-diffs/node-diffs.component.js +67 -0
- package/esm2015/node/node-diffs/node-diffs.model.js +6 -0
- package/esm2015/node/node-icon/node-icon.component.js +37 -0
- package/esm2015/node/node-link/node-link.component.js +33 -0
- package/esm2015/node/node-logs-file/node-logs-file.component.js +63 -0
- package/esm2015/node/node-logs-models/node-logs-models.component.js +188 -0
- package/esm2015/node/node-missing-lookup-factors/node-missing-lookup-factors.component.js +34 -0
- package/esm2015/node/node-value-details/node-value-details.component.js +46 -0
- package/esm2015/node/node.module.js +67 -0
- package/esm2015/node/node.service.js +113 -0
- package/esm2015/node/public-api.js +13 -0
- package/esm2015/public-api.js +16 -0
- package/esm2015/schema/public-api.js +2 -0
- package/esm2015/schema/schema.service.js +167 -0
- package/esm2015/search/public-api.js +4 -0
- package/esm2015/search/search.model.js +204 -0
- package/esm2015/search/search.module.js +13 -0
- package/esm2015/search/search.service.js +99 -0
- package/esm2015/sites/public-api.js +6 -0
- package/esm2015/sites/sites-maps/sites-maps.component.js +162 -0
- package/esm2015/sites/sites-measurements/sites-measurements.component.js +78 -0
- package/esm2015/sites/sites-measurements-logs/sites-measurements-logs.component.js +63 -0
- package/esm2015/sites/sites.model.js +10 -0
- package/esm2015/sites/sites.module.js +42 -0
- package/esm2015/terms/public-api.js +2 -0
- package/esm2015/terms/terms.model.js +184 -0
- package/esm2015/users/public-api.js +2 -0
- package/esm2015/users/users.service.js +17 -0
- package/fesm2015/hestia-earth-ui-components.js +5920 -0
- package/fesm2015/hestia-earth-ui-components.js.map +1 -0
- package/files/files-error.model.d.ts +40 -0
- package/files/files-form/files-form.component.d.ts +94 -0
- package/files/files-form.model.d.ts +113 -0
- package/files/files.module.d.ts +13 -0
- package/files/public-api.d.ts +2 -0
- package/fontawesome/fontawesome.module.d.ts +10 -0
- package/fontawesome/public-api.d.ts +1 -0
- package/hestia-earth-ui-components.d.ts +5 -0
- package/impact-assessments/impact-assessments-indicator-breakdown-chart/impact-assessments-indicator-breakdown-chart.component.d.ts +28 -0
- package/impact-assessments/impact-assessments-indicators-chart/impact-assessments-indicators-chart.component.d.ts +25 -0
- package/impact-assessments/impact-assessments-products/impact-assessments-products.component.d.ts +77 -0
- package/impact-assessments/impact-assessments-products-logs/impact-assessments-products-logs.component.d.ts +25 -0
- package/impact-assessments/impact-assessments.model.d.ts +6 -0
- package/impact-assessments/impact-assessments.module.d.ts +15 -0
- package/impact-assessments/public-api.d.ts +6 -0
- package/mendeley/mendeley.service.d.ts +25 -0
- package/mendeley/public-api.d.ts +1 -0
- package/node/node-csv-export-confirm/node-csv-export-confirm.component.d.ts +32 -0
- package/node/node-csv-select-headers/node-csv-select-headers.component.d.ts +42 -0
- package/node/node-csv.service.d.ts +9 -0
- package/node/node-diffs/node-diffs.component.d.ts +23 -0
- package/node/node-diffs/node-diffs.model.d.ts +4 -0
- package/node/node-icon/node-icon.component.d.ts +8 -0
- package/node/node-link/node-link.component.d.ts +11 -0
- package/node/node-logs-file/node-logs-file.component.d.ts +31 -0
- package/node/node-logs-models/node-logs-models.component.d.ts +72 -0
- package/node/node-missing-lookup-factors/node-missing-lookup-factors.component.d.ts +14 -0
- package/node/node-value-details/node-value-details.component.d.ts +17 -0
- package/node/node.module.d.ts +20 -0
- package/node/node.service.d.ts +70 -0
- package/node/public-api.d.ts +12 -0
- package/package.json +53 -0
- package/public-api.d.ts +15 -0
- package/schema/public-api.d.ts +1 -0
- package/schema/schema.service.d.ts +51 -0
- package/search/public-api.d.ts +3 -0
- package/search/search.model.d.ts +243 -0
- package/search/search.module.d.ts +7 -0
- package/search/search.service.d.ts +129 -0
- package/sites/public-api.d.ts +5 -0
- package/sites/sites-maps/sites-maps.component.d.ts +35 -0
- package/sites/sites-measurements/sites-measurements.component.d.ts +31 -0
- package/sites/sites-measurements-logs/sites-measurements-logs.component.d.ts +23 -0
- package/sites/sites.model.d.ts +10 -0
- package/sites/sites.module.d.ts +13 -0
- package/styles.scss +197 -0
- package/terms/public-api.d.ts +1 -0
- package/terms/terms.model.d.ts +21 -0
- package/users/public-api.d.ts +1 -0
- package/users/users.service.d.ts +7 -0
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import { __awaiter, __rest } from "tslib";
|
|
2
|
+
/* eslint-disable complexity */
|
|
3
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
4
|
+
import { of } from 'rxjs';
|
|
5
|
+
import { debounceTime, distinctUntilChanged, map, mergeMap, switchMap, tap } from 'rxjs/operators';
|
|
6
|
+
import * as pluralize from 'pluralize';
|
|
7
|
+
import { moveItemInArray } from '@angular/cdk/drag-drop';
|
|
8
|
+
import { SchemaType, NodeType } from '@hestia-earth/schema';
|
|
9
|
+
import { isEmpty } from '@hestia-earth/utils';
|
|
10
|
+
import { formatPropertyError, propertyError, hasError, hasWarning, formatSuggestion, formatLinkNodesSuggestions, defaultSuggestionType, recursiveProperties, typeToNewProperty, propertyId, isAddPropertyEnabled, nodeAvailableProperties, sortProperties, groupChanged, parentProperty, siblingProperty, updateProperties, refreshPropertyKeys, keyToDataPath, findProperty, calculateCycleDurationEnabled, calculateCycleDuration, calculateCycleStartDateEnabled, calculateCycleStartDate, parseNewValue } from '../files-form.model';
|
|
11
|
+
import { errorHasError, errorHasWarning, filterError, formatError } from '../files-error.model';
|
|
12
|
+
import { matchType, matchPhraseQuery, matchPhrasePrefixQuery, matchBoolPrefixQuery } from '../../search/search.model';
|
|
13
|
+
import { safeJSONParse } from '../../common/utils';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "../../search/search.service";
|
|
16
|
+
import * as i2 from "../../users/users.service";
|
|
17
|
+
import * as i3 from "@fortawesome/angular-fontawesome";
|
|
18
|
+
import * as i4 from "../../node/node-icon/node-icon.component";
|
|
19
|
+
import * as i5 from "../../common/maps-drawing-confirm/maps-drawing-confirm.component";
|
|
20
|
+
import * as i6 from "../../bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component";
|
|
21
|
+
import * as i7 from "../../common/schema-version-link/schema-version-link.component";
|
|
22
|
+
import * as i8 from "../../common/popover-confirm/popover-confirm.component";
|
|
23
|
+
import * as i9 from "../../sites/sites-maps/sites-maps.component";
|
|
24
|
+
import * as i10 from "@ng-bootstrap/ng-bootstrap";
|
|
25
|
+
import * as i11 from "../../common/unit-converter/unit-converter.component";
|
|
26
|
+
import * as i12 from "@angular/common";
|
|
27
|
+
import * as i13 from "../../common/bind-once.directive";
|
|
28
|
+
import * as i14 from "@angular/forms";
|
|
29
|
+
import * as i15 from "../../common/tags-input.directive";
|
|
30
|
+
import * as i16 from "../../common/pluralize.pipe";
|
|
31
|
+
const get = require('lodash.get');
|
|
32
|
+
const MIN_TYPEAHEAD_LENGTH = 2;
|
|
33
|
+
const populateTermFields = [
|
|
34
|
+
'termType', 'units',
|
|
35
|
+
'defaultProperties.term.name', 'defaultProperties.term.units', 'defaultProperties.value'
|
|
36
|
+
];
|
|
37
|
+
export class FilesFormComponent {
|
|
38
|
+
constructor(ref, searchService, usersService) {
|
|
39
|
+
this.ref = ref;
|
|
40
|
+
this.searchService = searchService;
|
|
41
|
+
this.usersService = usersService;
|
|
42
|
+
this.errors = [];
|
|
43
|
+
this.nodeMap = {};
|
|
44
|
+
this.editable = false;
|
|
45
|
+
this.errorMode = false;
|
|
46
|
+
this.deepEditable = true;
|
|
47
|
+
this.errorsEditable = false;
|
|
48
|
+
this.nodeChange = new EventEmitter();
|
|
49
|
+
this.nodeErorrResolved = new EventEmitter();
|
|
50
|
+
this.nodeErrorAdded = new EventEmitter();
|
|
51
|
+
this.NodeType = NodeType;
|
|
52
|
+
this.SchemaType = SchemaType;
|
|
53
|
+
this.isOpen = true;
|
|
54
|
+
this.mapVisible = false;
|
|
55
|
+
this.pluralize = pluralize;
|
|
56
|
+
this.formatPropertyError = formatPropertyError;
|
|
57
|
+
this.properties = [];
|
|
58
|
+
this.formatter = (value) => { var _a; return typeof value === 'object' ? ('bibliography' in value ? (_a = value.bibliography) === null || _a === void 0 ? void 0 : _a.title : value.name) : value; };
|
|
59
|
+
this.suggestNewProperty = (fullKey) => (text$) => text$.pipe(distinctUntilChanged(), switchMap(term => of(this.newProperties(findProperty(this.properties, fullKey) || this.nodeProperty, term))));
|
|
60
|
+
this.suggestExistingNode = (type, term, uniqueKey = '@id') => term.length < MIN_TYPEAHEAD_LENGTH ?
|
|
61
|
+
of([]) :
|
|
62
|
+
this.searchService.suggest(term, type, [], {
|
|
63
|
+
bool: {
|
|
64
|
+
must: [matchType(type)],
|
|
65
|
+
should: [
|
|
66
|
+
matchPhraseQuery(term, 100, uniqueKey),
|
|
67
|
+
matchPhrasePrefixQuery(term, 20, uniqueKey),
|
|
68
|
+
matchBoolPrefixQuery(term, 10, uniqueKey)
|
|
69
|
+
],
|
|
70
|
+
minimum_should_match: 1
|
|
71
|
+
}
|
|
72
|
+
}, 5, populateTermFields);
|
|
73
|
+
this.suggestNode = (type, suggestDefault) => (term, property) => {
|
|
74
|
+
var _a, _b;
|
|
75
|
+
return (((_a = property.suggestions) === null || _a === void 0 ? void 0 : _a.isUniqueKey) ? (this.suggestExistingNode(type, term, property.suggestions.isUniqueKey)) : (((_b = property.suggestions) === null || _b === void 0 ? void 0 : _b.isLinkNode) ?
|
|
76
|
+
of(formatLinkNodesSuggestions(this.nodeMap, type)) : (suggestDefault ? suggestDefault(term, property) : of([])))).pipe(map((res) => res.map(formatSuggestion)));
|
|
77
|
+
};
|
|
78
|
+
this.suggester = {
|
|
79
|
+
default: (term, property) => {
|
|
80
|
+
var _a;
|
|
81
|
+
return of((((_a = property === null || property === void 0 ? void 0 : property.suggestions) === null || _a === void 0 ? void 0 : _a.values) || [])
|
|
82
|
+
.map(v => `${v}`)
|
|
83
|
+
.filter(v => v.toLowerCase().includes(term.toLowerCase()))
|
|
84
|
+
.map(name => ({ name })));
|
|
85
|
+
},
|
|
86
|
+
[NodeType.Actor]: this.suggestNode(NodeType.Actor),
|
|
87
|
+
[NodeType.Cycle]: this.suggestNode(NodeType.Cycle),
|
|
88
|
+
[NodeType.ImpactAssessment]: this.suggestNode(NodeType.ImpactAssessment),
|
|
89
|
+
[NodeType.Organisation]: this.suggestNode(NodeType.Organisation),
|
|
90
|
+
[NodeType.Site]: this.suggestNode(NodeType.Site),
|
|
91
|
+
[NodeType.Source]: this.suggestNode(NodeType.Source, (term, { key }) => term.length < MIN_TYPEAHEAD_LENGTH ?
|
|
92
|
+
of([]) :
|
|
93
|
+
this.searchService.suggestSource(term, 5, [`bibliography.${key}`], [`bibliography.${key}`])),
|
|
94
|
+
[NodeType.Term]: this.suggestNode(NodeType.Term, (term, { suggestions }) => term.length < MIN_TYPEAHEAD_LENGTH ?
|
|
95
|
+
of([]) :
|
|
96
|
+
this.searchService.suggest(term, NodeType.Term, (suggestions === null || suggestions === void 0 ? void 0 : suggestions.queries) || [], null, 5, populateTermFields))
|
|
97
|
+
};
|
|
98
|
+
this.propertySuggest = (fullKey, suggestType) => (text$) => text$.pipe(debounceTime(suggestType === defaultSuggestionType ? 0 : 300), distinctUntilChanged(), mergeMap(term => {
|
|
99
|
+
const property = findProperty(this.properties, fullKey);
|
|
100
|
+
return (property === null || property === void 0 ? void 0 : property.editable) && suggestType in this.suggester ?
|
|
101
|
+
of(term).pipe(tap(() => property.loading = true), switchMap(() => this.suggester[suggestType](term, property)), tap(() => property.loading = false)) :
|
|
102
|
+
of([]);
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
ngOnInit() {
|
|
106
|
+
const schemaType = this.node.type || this.node['@type'];
|
|
107
|
+
const schema = this.schemas ? this.schemas[schemaType] : {};
|
|
108
|
+
const errors = this.errors.filter(filterError);
|
|
109
|
+
const error = propertyError(errors)('');
|
|
110
|
+
this.nodeProperty = this.schemas ? {
|
|
111
|
+
id: propertyId(),
|
|
112
|
+
schema,
|
|
113
|
+
schemaType,
|
|
114
|
+
editable: !!this.node.type,
|
|
115
|
+
fullKey: '',
|
|
116
|
+
key: '',
|
|
117
|
+
value: {},
|
|
118
|
+
error: formatError(error),
|
|
119
|
+
hasError: errorHasError(error),
|
|
120
|
+
hasWarning: errorHasWarning(error),
|
|
121
|
+
suggestions: {},
|
|
122
|
+
newProperty: {},
|
|
123
|
+
newError: { level: 'warning' },
|
|
124
|
+
properties: [],
|
|
125
|
+
addPropertyEnabled: isAddPropertyEnabled(this.node, schemaType, schema)
|
|
126
|
+
} : undefined;
|
|
127
|
+
const recurser = recursiveProperties(this.schemas, errors, schema, this.deepEditable);
|
|
128
|
+
this.properties = recurser(this.node);
|
|
129
|
+
}
|
|
130
|
+
trackByIndex(index, _value) {
|
|
131
|
+
return index;
|
|
132
|
+
}
|
|
133
|
+
trackByProperty(_index, { id, fullKey }) {
|
|
134
|
+
return [fullKey, id].join('_');
|
|
135
|
+
}
|
|
136
|
+
hasAddons(property) {
|
|
137
|
+
var _a;
|
|
138
|
+
return property && (this.enableAddError(property) ||
|
|
139
|
+
(this.editable && property.editable) ||
|
|
140
|
+
this.addPropertyEnabled(property) ||
|
|
141
|
+
this.isRequired(property) ||
|
|
142
|
+
((_a = property.externalUrl) === null || _a === void 0 ? void 0 : _a.url) ||
|
|
143
|
+
this.mapDrawingModes(property).length ||
|
|
144
|
+
this.unitConverterEnabled(property));
|
|
145
|
+
}
|
|
146
|
+
isRequired({ value, isRequired }) {
|
|
147
|
+
return isRequired && isEmpty(value);
|
|
148
|
+
}
|
|
149
|
+
// --- Errors
|
|
150
|
+
enableAddError(property) {
|
|
151
|
+
return this.errorsEditable && !property.hasError && !property.hasWarning;
|
|
152
|
+
}
|
|
153
|
+
addError(property, { message, level }) {
|
|
154
|
+
if (!message) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const keys = property.fullKey.split('.');
|
|
158
|
+
keys.pop();
|
|
159
|
+
const error = property.isAdded ? {
|
|
160
|
+
message,
|
|
161
|
+
level: level || 'error',
|
|
162
|
+
dataPath: keyToDataPath(keys.join('.')),
|
|
163
|
+
params: {
|
|
164
|
+
missingProperty: property.key
|
|
165
|
+
}
|
|
166
|
+
} : {
|
|
167
|
+
message,
|
|
168
|
+
level: level || 'error',
|
|
169
|
+
dataPath: keyToDataPath(property.fullKey)
|
|
170
|
+
};
|
|
171
|
+
property.newError = { level: 'warning' };
|
|
172
|
+
property.error = error;
|
|
173
|
+
property.hasError = errorHasError(error);
|
|
174
|
+
property.hasWarning = errorHasWarning(error);
|
|
175
|
+
this.nodeErrorAdded.emit(error);
|
|
176
|
+
}
|
|
177
|
+
editError(property) {
|
|
178
|
+
property.newError = property.error;
|
|
179
|
+
}
|
|
180
|
+
resolveError(property) {
|
|
181
|
+
var _a;
|
|
182
|
+
const index = (_a = property.error) === null || _a === void 0 ? void 0 : _a.index;
|
|
183
|
+
property.error = undefined;
|
|
184
|
+
property.hasError = hasError(property.properties);
|
|
185
|
+
property.hasWarning = hasWarning(property.properties);
|
|
186
|
+
this.nodeErorrResolved.emit(index);
|
|
187
|
+
return groupChanged(this.properties, property.fullKey);
|
|
188
|
+
}
|
|
189
|
+
// ---
|
|
190
|
+
typeaheadFocus(e) {
|
|
191
|
+
if (e.bubbles) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
e.stopPropagation();
|
|
195
|
+
setTimeout(() => {
|
|
196
|
+
var _a;
|
|
197
|
+
const inputEvent = new Event('input');
|
|
198
|
+
(_a = e.target) === null || _a === void 0 ? void 0 : _a.dispatchEvent(inputEvent);
|
|
199
|
+
}, 0);
|
|
200
|
+
}
|
|
201
|
+
addPropertyEnabled(property) {
|
|
202
|
+
return this.editable && !this.errorsEditable && property.addPropertyEnabled;
|
|
203
|
+
}
|
|
204
|
+
newProperties(property, field) {
|
|
205
|
+
const properties = nodeAvailableProperties(this.node, property);
|
|
206
|
+
return Object.keys(properties)
|
|
207
|
+
.filter(prop => prop.toLowerCase().includes(field.toLowerCase()))
|
|
208
|
+
.map(name => ({ name, prop: properties[name] }));
|
|
209
|
+
}
|
|
210
|
+
replacePropertyData(property, data, editable, replaceParent = true) {
|
|
211
|
+
const parent = replaceParent ? parentProperty(this.properties, property) : property;
|
|
212
|
+
const properties = recursiveProperties(this.schemas, [], this.schemas[this.node.type], this.deepEditable, parent.fullKey)(data);
|
|
213
|
+
updateProperties({ properties }, prop => {
|
|
214
|
+
prop.editable = typeof editable === 'undefined' ? prop.editable : editable;
|
|
215
|
+
return prop;
|
|
216
|
+
});
|
|
217
|
+
parent.editable = typeof editable === 'undefined' ? parent.editable : editable;
|
|
218
|
+
parent.properties = properties;
|
|
219
|
+
parent.value = data;
|
|
220
|
+
return this.propertyChanged(data, parent);
|
|
221
|
+
}
|
|
222
|
+
suggestionSelected(_a, property) {
|
|
223
|
+
var _b;
|
|
224
|
+
var { '@id': _id, name, type, id } = _a, data = __rest(_a, ['@id', "name", "type", "id"]);
|
|
225
|
+
return _id ?
|
|
226
|
+
// suggestions from existing nodes
|
|
227
|
+
this.replacePropertyData(property, Object.assign({ '@id': _id, '@type': (_b = property.suggestions) === null || _b === void 0 ? void 0 : _b.type, name }, data), false) :
|
|
228
|
+
(
|
|
229
|
+
// suggestion from linked nodes
|
|
230
|
+
type && id ?
|
|
231
|
+
this.replacePropertyData(property, Object.assign({ type, id }, data), true) :
|
|
232
|
+
// suggestion by name => enum values
|
|
233
|
+
this.propertyChanged(name, property));
|
|
234
|
+
}
|
|
235
|
+
addArrayGroup(array) {
|
|
236
|
+
const prop = this.schemas[array.schemaType];
|
|
237
|
+
const value = get(this.node, array.fullKey);
|
|
238
|
+
const newProperty = typeToNewProperty(this.schemas, prop, prop, value, `${array.fullKey}[${array.properties.length}]`);
|
|
239
|
+
array.properties.push(newProperty);
|
|
240
|
+
this.nodeChange.emit({ key: array.fullKey, value });
|
|
241
|
+
return groupChanged(this.properties, array.fullKey);
|
|
242
|
+
}
|
|
243
|
+
duplicateArrayGroup(array, property) {
|
|
244
|
+
const index = +property.key;
|
|
245
|
+
const newProperty = JSON.parse(JSON.stringify(property));
|
|
246
|
+
newProperty.id = propertyId();
|
|
247
|
+
const value = [...get(this.node, array.fullKey)];
|
|
248
|
+
value.splice(index, 0, safeJSONParse(newProperty.value));
|
|
249
|
+
array.properties.splice(index, 0, newProperty);
|
|
250
|
+
// need to change key on every properties recursively
|
|
251
|
+
refreshPropertyKeys(array);
|
|
252
|
+
this.nodeChange.emit({ key: array.fullKey, value });
|
|
253
|
+
return groupChanged(this.properties, array.fullKey);
|
|
254
|
+
}
|
|
255
|
+
removeArrayGroup(array, { key }) {
|
|
256
|
+
const index = +key;
|
|
257
|
+
const value = [...get(this.node, array.fullKey)];
|
|
258
|
+
value.splice(index, 1);
|
|
259
|
+
array.properties.splice(index, 1);
|
|
260
|
+
// need to change key on every properties recursively
|
|
261
|
+
refreshPropertyKeys(array);
|
|
262
|
+
this.nodeChange.emit({ key: array.fullKey, value });
|
|
263
|
+
// if no more values, remove parent group entirely
|
|
264
|
+
return array.properties.length ? null : this.propertyChanged(null, array);
|
|
265
|
+
}
|
|
266
|
+
moveArrayGroupToPosition(array, currentIndex, newIndex) {
|
|
267
|
+
const value = [...get(this.node, array.fullKey)];
|
|
268
|
+
moveItemInArray(value, currentIndex, newIndex);
|
|
269
|
+
moveItemInArray(array.properties, currentIndex, newIndex);
|
|
270
|
+
// need to change key on every properties recursively
|
|
271
|
+
refreshPropertyKeys(array);
|
|
272
|
+
this.nodeChange.emit({ key: array.fullKey, value });
|
|
273
|
+
return groupChanged(this.properties, array.fullKey);
|
|
274
|
+
}
|
|
275
|
+
moveArrayGroupUp(array, { key }) {
|
|
276
|
+
const index = +key;
|
|
277
|
+
return this.moveArrayGroupToPosition(array, index, index - 1);
|
|
278
|
+
}
|
|
279
|
+
moveArrayGroupDown(array, { key }) {
|
|
280
|
+
const index = +key;
|
|
281
|
+
return this.moveArrayGroupToPosition(array, index, index + 1);
|
|
282
|
+
}
|
|
283
|
+
propertyChanged(value, property) {
|
|
284
|
+
groupChanged(this.properties, property.fullKey, value);
|
|
285
|
+
property.addPropertyEnabled = isAddPropertyEnabled(this.node, property.schemaType, property.schema, property.fullKey);
|
|
286
|
+
if (value === null) {
|
|
287
|
+
value = undefined;
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
property.value = value;
|
|
291
|
+
property.changed = true;
|
|
292
|
+
}
|
|
293
|
+
this.nodeChange.emit({ key: property.fullKey, value: parseNewValue(property.schema, value) });
|
|
294
|
+
}
|
|
295
|
+
addDefaultProperty(property, key, def) {
|
|
296
|
+
const node = property.key ? get(this.node, property.fullKey) : this.node;
|
|
297
|
+
const fullKey = property.key ? `${property.fullKey}.${key}` : key;
|
|
298
|
+
const properties = property.key ? property.properties : this.properties;
|
|
299
|
+
const newProperty = typeToNewProperty(this.schemas, def, this.schemas[property.schemaType], node, fullKey);
|
|
300
|
+
const existingPropertyIndex = properties.findIndex(v => v.fullKey === fullKey);
|
|
301
|
+
existingPropertyIndex >= 0 ? (properties[existingPropertyIndex] = newProperty) : properties.push(newProperty);
|
|
302
|
+
properties.sort(sortProperties);
|
|
303
|
+
return this.propertyChanged(newProperty.value, newProperty);
|
|
304
|
+
}
|
|
305
|
+
addMissingProperty(property) {
|
|
306
|
+
const parent = parentProperty(this.properties, property);
|
|
307
|
+
const newProperty = parent === property ? this.nodeProperty : parent;
|
|
308
|
+
const newProperties = this.newProperties(newProperty, property.key);
|
|
309
|
+
newProperty.newProperty = newProperties[0];
|
|
310
|
+
return newProperty.newProperty ? this.addProperty(newProperty) : null;
|
|
311
|
+
}
|
|
312
|
+
addProperty(property) {
|
|
313
|
+
const { name, prop } = property.newProperty;
|
|
314
|
+
property.newProperty = {};
|
|
315
|
+
return name === '@id' ?
|
|
316
|
+
this.replacePropertyData(property, { '@id': '', type: property.schemaType }, undefined, false) :
|
|
317
|
+
this.addDefaultProperty(property, name, prop);
|
|
318
|
+
}
|
|
319
|
+
updatePropertyCoordinates(property, value) {
|
|
320
|
+
const latitude = siblingProperty(this.properties, property, 'latitude');
|
|
321
|
+
const longitude = siblingProperty(this.properties, property, 'longitude');
|
|
322
|
+
return [
|
|
323
|
+
latitude ? this.propertyChanged(value.lat, latitude) : null,
|
|
324
|
+
longitude ? this.propertyChanged(value.lng, longitude) : null
|
|
325
|
+
];
|
|
326
|
+
}
|
|
327
|
+
// Map
|
|
328
|
+
get showMap() {
|
|
329
|
+
return (!this.editable || this.errorMode) && [SchemaType.Site, SchemaType.Organisation].includes(this.node.type);
|
|
330
|
+
}
|
|
331
|
+
mapDrawingModes({ key }) {
|
|
332
|
+
return ['boundary'].includes(key) ? [
|
|
333
|
+
google.maps.drawing.OverlayType.POLYGON
|
|
334
|
+
] : ([
|
|
335
|
+
'latitude', 'longitude'
|
|
336
|
+
].includes(key) ? [
|
|
337
|
+
google.maps.drawing.OverlayType.MARKER
|
|
338
|
+
] : []);
|
|
339
|
+
}
|
|
340
|
+
onMapDrawingClosed(newValue) {
|
|
341
|
+
const property = this.mapDrawingProperty;
|
|
342
|
+
this.mapDrawingProperty = undefined;
|
|
343
|
+
return ['latitude', 'longitude'].includes(property.key) ?
|
|
344
|
+
this.updatePropertyCoordinates(property, newValue) :
|
|
345
|
+
this.propertyChanged(newValue, property);
|
|
346
|
+
}
|
|
347
|
+
// Bibliography Search
|
|
348
|
+
bibliographiesSearchKey({ key, schemaType }) {
|
|
349
|
+
const validSchema = [SchemaType.Bibliography].includes(schemaType);
|
|
350
|
+
const valieKey = ['title', 'documentDOI', 'scopus'].includes(key);
|
|
351
|
+
return validSchema && valieKey ? key : null;
|
|
352
|
+
}
|
|
353
|
+
updateBibliography(value) {
|
|
354
|
+
const parent = parentProperty(this.properties, this.bibliographiesSearchProperty);
|
|
355
|
+
const newValue = this.bibliographiesSearchSources ? Object.assign(Object.assign({}, parent.value), { bibliography: value }) : value;
|
|
356
|
+
this.replacePropertyData(this.bibliographiesSearchProperty, newValue, true);
|
|
357
|
+
return undefined;
|
|
358
|
+
}
|
|
359
|
+
updateSource(value) {
|
|
360
|
+
// cannot replace a top-level source
|
|
361
|
+
this.bibliographiesSearchSources && this.replacePropertyData(this.bibliographiesSearchProperty, Object.assign({ '@type': NodeType.Source }, value), !('@id' in value));
|
|
362
|
+
return undefined;
|
|
363
|
+
}
|
|
364
|
+
get bibliographiesSearchSources() {
|
|
365
|
+
return this.bibliographiesSearchProperty.fullKey.split('.').length > 2;
|
|
366
|
+
}
|
|
367
|
+
onBibliographiesSearchClosed(value) {
|
|
368
|
+
this.bibliographiesSearchProperty = value ? (value.type === SchemaType.Bibliography ?
|
|
369
|
+
this.updateBibliography(value) :
|
|
370
|
+
this.updateSource(value)) : undefined;
|
|
371
|
+
}
|
|
372
|
+
// Actor.@id
|
|
373
|
+
setUserActorId(property) {
|
|
374
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
375
|
+
const { actorId, name } = yield this.usersService.loggedInUser;
|
|
376
|
+
return this.replacePropertyData(property, { '@id': actorId, '@type': NodeType.Actor, name }, false);
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
// Cycle.cycleDuration
|
|
380
|
+
calculateCycleDurationEnabled(property) {
|
|
381
|
+
return calculateCycleDurationEnabled(this.properties, property);
|
|
382
|
+
}
|
|
383
|
+
calculateCycleDuration(property) {
|
|
384
|
+
const duration = calculateCycleDuration(this.properties, property);
|
|
385
|
+
return this.propertyChanged(duration, property);
|
|
386
|
+
}
|
|
387
|
+
// Cycle.startDate
|
|
388
|
+
calculateCycleStartDateEnabled(property) {
|
|
389
|
+
return calculateCycleStartDateEnabled(this.properties, property);
|
|
390
|
+
}
|
|
391
|
+
calculateCycleStartDate(property) {
|
|
392
|
+
const startDate = calculateCycleStartDate(this.properties, property);
|
|
393
|
+
return this.propertyChanged(startDate, property);
|
|
394
|
+
}
|
|
395
|
+
// Units converter
|
|
396
|
+
unitConverterEnabled(property) {
|
|
397
|
+
return this.editable && property.editable && ['value', 'min', 'max', 'sd'].includes(property.key);
|
|
398
|
+
}
|
|
399
|
+
openUnitConverter(popover, property) {
|
|
400
|
+
const value = property.value;
|
|
401
|
+
const termProperty = siblingProperty(this.properties, property, 'term');
|
|
402
|
+
const term = safeJSONParse(termProperty === null || termProperty === void 0 ? void 0 : termProperty.value);
|
|
403
|
+
const units = term === null || term === void 0 ? void 0 : term.units;
|
|
404
|
+
return popover.isOpen() ? popover.close() : popover.open({ value, term, units });
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
FilesFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FilesFormComponent, deps: [{ token: i0.ElementRef }, { token: i1.HeSearchService }, { token: i2.HeUsersService }], target: i0.ɵɵFactoryTarget.Component });
|
|
408
|
+
FilesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FilesFormComponent, selector: "he-files-form", inputs: { schemas: "schemas", errors: "errors", node: "node", nodeMap: "nodeMap", editable: "editable", errorMode: "errorMode", deepEditable: "deepEditable", errorsEditable: "errorsEditable" }, outputs: { nodeChange: "nodeChange", nodeErorrResolved: "nodeErorrResolved", nodeErrorAdded: "nodeErrorAdded" }, ngImport: i0, template: "<div class=\"card\">\n <div class=\"card-toggle p-4\" (click)=\"isOpen = !isOpen\" pointer>\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"isOpen\"></fa-icon>\n <span *ngIf=\"nodeProperty\" class=\"is-px-2\"\n [class.has-text-danger]=\"nodeProperty.hasError\"\n [class.has-text-warning]=\"nodeProperty.hasWarning\"\n >\n <he-node-icon [type]=\"nodeProperty.schemaType\"></he-node-icon>\n </span>\n </div>\n\n <ng-container *ngIf=\"editable && isOpen && nodeProperty\">\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n\n <div class=\"card-content\">\n <ng-container *ngIf=\"isOpen\">\n <div class=\"pb-3 mb-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: nodeProperty}\"></ng-container>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"nodeProperty?.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: nodeProperty, edit: true}\"></ng-container>\n </div>\n </ng-container>\n\n <div class=\"columns is-multiline\">\n <ng-container *ngFor=\"let property of properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"propertyMap; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n </div>\n</div>\n\n<he-maps-drawing-confirm *ngIf=\"!!mapDrawingProperty\"\n [value]=\"mapDrawingProperty.value\" [modes]=\"mapDrawingModes(mapDrawingProperty)\"\n (closed)=\"onMapDrawingClosed($event)\"\n></he-maps-drawing-confirm>\n\n<he-bibliographies-search-confirm *ngIf=\"!!bibliographiesSearchProperty\"\n [search]=\"bibliographiesSearchProperty.value\"\n [searchBy]=\"bibliographiesSearchKey(bibliographiesSearchProperty)\"\n [searchSources]=\"bibliographiesSearchSources\"\n (closed)=\"onBibliographiesSearchClosed($event)\"\n></he-bibliographies-search-confirm>\n\n<ng-template #labelDescription let-property>\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"property.schema?.description\" [autoClose]=\"'outside'\"\n triggers=\"hover\" placement=\"right\" container=\"body\"\n >\n <span>{{property.key}}</span>\n </span>\n</ng-template>\n\n<ng-template #labelDefault let-property>\n <span>{{property.key}}</span>\n</ng-template>\n\n<ng-template #showProperty let-property>\n <ng-container *ngIf=\"(isOpen || property.closedVisible) && !property.isHidden\">\n <div class=\"column is-6\"\n [id]=\"property.fullKey + '_' + property.id\"\n [class.is-12]=\"property.properties.length || !property.key\"\n [ngSwitch]=\"!!property.properties.length\"\n >\n <div class=\"columns is-multiline is-variable is-1\" *ngSwitchCase=\"false\">\n <div class=\"column is-3 py-1\" *ngIf=\"property.key\">\n <label class=\"label has-text-right-tablet has-text-ellipsis\"\n *bindOnce=\"property\"\n [for]=\"property.id\"\n >\n <ng-container\n *ngTemplateOutlet=\"property.schema?.description && editable && property.editable ? labelDescription : labelDefault; context: {$implicit: property}\">\n </ng-container>\n </label>\n </div>\n\n <div class=\"column is-9 py-1\" [class.is-12]=\"!property.key\">\n <div class=\"field\">\n <ng-container *ngTemplateOutlet=\"inputForm; context: {$implicit: property}\"></ng-container>\n\n <ng-container *ngIf=\"(editable || errorsEditable) && (property.hasError || property.hasWarning)\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: false}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"panel\" *ngSwitchCase=\"true\"\n [class.is-link]=\"errorMode && property.changed\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n [class.is-default]=\"!property.changed && !property.hasError && !property.hasWarning\"\n >\n <div class=\"open-group panel-heading py-0\"\n (click)=\"property.isOpen = !property.isOpen\" pointer\n [class.is-open]=\"property.isOpen\"\n [class.has-text-white]=\"(errorMode && property.changed) || property.hasError || property.hasWarning\"\n >\n <div class=\"columns is-mobile is-vcentered\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!property.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"property.isOpen\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">{{property.key}}</span>\n </span>\n <span *ngIf=\"property.schemaType\" class=\"column is-narrow py-1 my-0\">\n <span class=\"tags mb-0 has-addons\">\n <span class=\"tag mb-0 is-light\">Type</span>\n <span class=\"tag mb-0 is-white\">\n <he-schema-version-link linkClass=\"is-small\" [node]=\"{'@type': property.schemaType}\">\n <span>{{property.schemaType}}</span>\n </he-schema-version-link>\n </span>\n </span>\n </span>\n <he-popover-confirm class=\"column is-narrow py-1 my-0 px-0\"\n *ngIf=\"editable && !errorsEditable\"\n ngbTooltip=\"Remove group\" placement=\"top\"\n [message]=\"'<p>This will remove the group completely.</p>' + (property.isRequired ? '<p><u>Warning: this field is required.</u></p>' : '') + '<p>Do you confirm?</p>'\"\n popoverClass=\"px-3\"\n (confirmed)=\"propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\" size=\"sm\"></fa-icon>\n </he-popover-confirm>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" *ngIf=\"property.isOpen\">\n <ng-container [ngSwitch]=\"property.isArray\">\n <div class=\"px-3 pt-4\" *ngIf=\"property.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: true}\"></ng-container>\n </div>\n\n <div class=\"mt-3\" *ngSwitchCase=\"false\">\n <p class=\"help py-1 px-2\" *ngIf=\"editable && !property.editable\">\n To change the {{property.key}}, please delete it first, then add the field again\n </p>\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schema?.title\">\n <p class=\"help py-1 px-2\" *ngSwitchCase=\"'Bibliography'\">\n Search by Title or Document DOI to auto-populate the fields using the Mendeley catalogue\n </p>\n </ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: property}\"></ng-container>\n\n <div class=\"px-3 mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <div class=\"property-group py-2 px-3 mt-2\">\n <div class=\"columns is-multiline mb-0\">\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop2}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"py-2 px-3 mt-2\" *ngSwitchCase=\"true\">\n <div class=\"mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <div class=\"card p-0 my-4\" *ngIf=\"prop2.key\"\n [id]=\"prop2.fullKey + '_' + prop2.id\"\n >\n <div class=\"property-array-number\">\n <div class=\"tags has-addons\">\n <span class=\"tag is-dark\">{{prop2.key}}</span>\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <span class=\"tag is-info\" pointer\n (click)=\"duplicateArrayGroup(property, prop2)\"\n [ngbTooltip]=\"'Duplicate ' + pluralize(property.key, 1)\" placement=\"top\"\n >\n <fa-icon icon=\"clone\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== '0'\"\n (click)=\"moveArrayGroupUp(property, prop2)\"\n ngbTooltip=\"Move Up\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-up\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== property.properties.length - 1\"\n (click)=\"moveArrayGroupDown(property, prop2)\"\n ngbTooltip=\"Move Down\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-down\" size=\"sm\"></fa-icon>\n </span>\n <he-popover-confirm class=\"tag is-delete\"\n [ngbTooltip]=\"'Remove ' + pluralize(property.key, 1)\" placement=\"top\"\n message=\"This will remove the group completely. Do you confirm?\" position=\"right\"\n (confirmed)=\"removeArrayGroup(property, prop2)\"\n ></he-popover-confirm>\n </ng-container>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: prop2}\"></ng-container>\n\n <div class=\"px-4 mt-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: prop2}\"></ng-container>\n </div>\n\n <div class=\"px-4 mt-2\" *ngIf=\"prop2.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: prop2, edit: true}\"></ng-container>\n </div>\n\n <div class=\"property-group card-content p-3\">\n <div class=\"columns is-multiline my-0\">\n <ng-container *ngFor=\"let prop3 of prop2.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop3}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <button class=\"button is-dark is-outlined is-small\" type=\"button\"\n *ngIf=\"editable && !errorsEditable\"\n (click)=\"addArrayGroup(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\" i18n=\"@@add\">Add</span>\n <span class=\"pl-1\">{{property.key | pluralize:1}}</span>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #inputForm let-property>\n <ng-container *ngIf=\"property.key\">\n <ng-container [ngSwitch]=\"property.suggestions?.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <ng-container *ngTemplateOutlet=\"inputSelect; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"inputInput; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #inputInput let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\"\n [class.has-icons-right]=\"property.loading\"\n >\n <input class=\"input is-small search-input\"\n [class.is-dark]=\"property.key === 'type'\"\n [class.is-link]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [type]=\"property.schema?.type === 'number' ? 'number' : 'string'\"\n [id]=\"property.id\"\n name=\"randomname\"\n [readonly]=\"!editable || !property.editable || property.schema?.internal\"\n [placeholder]=\"property.placeholder\"\n [appTagsInput]=\"{enabled: editable && property.editable && property.schema?.type === 'array', items: property.schema?.items, delimiter: ';', allowDuplicates: true, placeholder: property.placeholder}\"\n (change)=\"propertyChanged($event.target.value, property)\"\n\n [pattern]=\"property.schema?.pattern\"\n [required]=\"property.fullKey.endsWith('id') && property.fullKey !== 'id'\"\n [min]=\"property.schema?.minimum\"\n [max]=\"property.schema?.maximum\"\n\n [ngbTypeahead]=\"propertySuggest(property.fullKey, property.suggestions?.type)\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatter\"\n [focusFirst]=\"true\"\n (focus)=\"editable && property.editable && typeaheadFocus($event)\"\n (selectItem)=\"suggestionSelected($event.item, property)\"\n >\n\n <span class=\"icon is-small is-right has-text-grey-dark\" [class.is-hidden]=\"!property.loading\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"sm\"></fa-icon>\n </span>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #inputSelect let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth\"\n [class.is-link]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n >\n <select\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [id]=\"property.id\"\n name=\"randomname\"\n [disabled]=\"!editable || !property.editable || property.schema?.internal\"\n (change)=\"propertyChanged($event.target.value, property)\"\n >\n <option value=\"\">Select</option>\n <ng-container *bindOnce=\"property.suggestions\">\n <option *ngFor=\"let value of property.suggestions.values; trackBy: trackByIndex\" [value]=\"value\">{{value}}</option>\n </ng-container>\n </select>\n </div>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #removeFieldAddon let-property>\n <div class=\"control\" *ngIf=\"!errorsEditable && !property.isRequired\">\n <a class=\"button is-small\" title=\"Remove field\"\n [class.is-outlined]=\"!property.changed && (property.hasError || property.hasWarning)\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n (click)=\"$event.stopPropagation(); propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n</ng-template>\n\n<ng-template #inputAddons let-property>\n <he-popover-confirm class=\"control\"\n *ngIf=\"enableAddError(property)\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\"\n >\n <span class=\"button is-small\">\n <fa-icon icon=\"comments\"></fa-icon>\n </span>\n </he-popover-confirm>\n\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schemaType\">\n <ng-container *ngSwitchCase=\"SchemaType.Actor\">\n <ng-container *ngTemplateOutlet=\"actorAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"SchemaType.Cycle\">\n <ng-container *ngTemplateOutlet=\"cycleAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *bindOnce=\"property\">\n <div class=\"control\" *ngIf=\"mapDrawingModes(property).length\">\n <button class=\"button is-small\" title=\"Pick on Map\"\n (click)=\"mapDrawingProperty = property\"\n >\n <fa-icon icon=\"map-marked-alt\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"bibliographiesSearchKey(property)\">\n <button class=\"button is-small\" title=\"Advanced Search\"\n (click)=\"bibliographiesSearchProperty = property\"\n >\n <fa-icon icon=\"search\"></fa-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"removeFieldAddon; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <div class=\"control\" *ngIf=\"addPropertyEnabled(property)\">\n <a class=\"button is-small is-danger\" title=\"Add field\"\n (click)=\"$event.stopPropagation(); addMissingProperty(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\" i18n=\"@@add\">Add</span>\n </a>\n </div>\n <div class=\"control\" *ngIf=\"isRequired(property)\">\n <label class=\"button is-small is-danger\" [for]=\"property.id\"\n ngbTooltip=\"This field is required\" placement=\"top\"\n >\n <fa-icon icon=\"exclamation-triangle\"></fa-icon>\n </label>\n </div>\n <ng-container *ngIf=\"property.externalUrl?.url\">\n <div class=\"control\">\n <a class=\"button is-small\"\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{'is-dark is-outlined': property.key === 'type'}\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\"\n >\n <fa-icon [icon]=\"property.externalUrl.icon || 'external-link-alt'\"></fa-icon>\n </a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"unitConverterEnabled(property)\">\n <div class=\"control\">\n <button class=\"button is-small\" title=\"Open calculator\"\n [ngbPopover]=\"convertUnits\" autoClose=\"outside\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"bottom\" container=\"body\"\n (click)=\"openUnitConverter(p, property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #actorAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === '@id'\">\n <button class=\"button is-small\" title=\"Add myself as Actor\"\n (click)=\"setUserActorId(property)\"\n >\n <fa-icon [icon]=\"['far', 'id-badge']\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #cycleAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === 'cycleDuration'\">\n <button class=\"button is-small\" title=\"Calculate value from startDate and endDate\"\n (click)=\"calculateCycleDuration(property)\"\n [disabled]=\"!calculateCycleDurationEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"property.key === 'startDate'\">\n <button class=\"button is-small\" title=\"Calculate value from endDate and cycleDuration\"\n (click)=\"calculateCycleStartDate(property)\"\n [disabled]=\"!calculateCycleStartDateEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #showNewProperty let-property>\n <header class=\"card-header\" *ngIf=\"editable && property.editable && (property.addPropertyEnabled || deepEditable); else padder\">\n <form class=\"py-3 px-4 is-flex-grow-1\" (submit)=\"addProperty(property)\" novalidate>\n <div class=\"field is-horizontal\">\n <div class=\"field-label is-small\">\n <label class=\"label\" [for]=\"property.id + '_new'\">\n <span i18n=\"@@files.form.newProperty\">Add new field</span>\n </label>\n </div>\n <div class=\"field-body\">\n <div class=\"field has-addons\">\n <div class=\"control is-expanded\">\n <input class=\"input is-small\"\n [(ngModel)]=\"property.newProperty\"\n [id]=\"property.id + '_new'\"\n name=\"randomname\"\n placeholder=\"Search and select field from results\"\n\n [ngbTypeahead]=\"suggestNewProperty(property.fullKey)\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatter\"\n [focusFirst]=\"false\"\n [editable]=\"false\"\n (focus)=\"typeaheadFocus($event)\"\n >\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" type=\"submit\"\n [disabled]=\"!property.newProperty || !property.newProperty.name\"\n >\n <fa-icon icon=\"plus\"></fa-icon>\n <span class=\"pl-2\" i18n=\"@@add\">Add</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n </header>\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\">\n <p class=\"help\"\n [class.is-danger]=\"property.hasError\"\n [class.is-warning]=\"property.hasWarning\"\n *ngIf=\"property.error\"\n >\n <span class=\"is-pre-wrap\" *bindOnce=\"property.error\" [innerHTML]=\"property.error.message\"></span>\n <a class=\"pl-2\"\n *ngIf=\"edit && errorsEditable && property.error.index >= 0\"\n (click)=\"editError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"edit\"></fa-icon>\n <span i18n=\"@@edit\">Edit</span>\n </a>\n <a class=\"pl-2\"\n *ngIf=\"(property.hasWarning || errorsEditable) && property.error.index >= 0\"\n (click)=\"resolveError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"check\"></fa-icon>\n <span i18n=\"@@resolved\">Resolved</span>\n </a>\n </p>\n</ng-template>\n\n<ng-template #propertyMap let-property>\n <div class=\"panel is-default\" *ngIf=\"showMap\">\n <div class=\"open-group panel-heading py-0\"\n (click)=\"mapVisible = !mapVisible\" pointer\n [class.is-open]=\"mapVisible\"\n >\n <div class=\"columns is-mobile is-vcentered mb-0\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!mapVisible\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"mapVisible\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">View on Map</span>\n </span>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" [class.is-hidden]=\"!mapVisible\">\n <he-sites-maps [sites]=\"[node]\" [showNotice]=\"false\"></he-sites-maps>\n </div>\n </div>\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n <ng-container *ngIf=\"property.newError && property.editable\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select is-small\">\n <select [(ngModel)]=\"property.newError.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control is-expanded\">\n <textarea class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"\n ></textarea>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\" i18n=\"@@add\">Add</span>\n </button>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #popupErrorForm let-data=\"data\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select\">\n <select [(ngModel)]=\"data.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control\">\n <input class=\"input\"\n [(ngModel)]=\"data.message\"\n placeholder=\"Enter your message here\"\n >\n </div>\n </div>\n</ng-template>\n\n<ng-template #suggestion let-r=\"result\" let-t=\"term\">\n <ngb-highlight\n [title]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [result]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [term]=\"t\"\n ></ngb-highlight>\n</ng-template>\n\n<ng-template #padder>\n <div class=\"pt-1\"></div>\n</ng-template>\n\n<ng-template #convertUnits let-value=\"value\" let-term=\"term\" let-units=\"units\">\n <he-unit-converter [value]=\"value\" [term]=\"term\" [toUnits]=\"units\"></he-unit-converter>\n</ng-template>\n", styles: [".panel.is-default .panel-heading{background-color:#ededed;color:#363636}.card-toggle{left:0;position:absolute;top:0}@media screen and (max-width: 768px){.card-toggle{position:relative}}.card-toggle>fa-icon{display:inline-block;width:10px}.card{overflow:visible}.card .card{box-shadow:2px 2px #36363652,0 0 0 1px #36363652}.card .card>.card-header{box-shadow:0 2px 1px #36363652}.property-array-number{left:-4px;position:absolute;top:-12px}.property-array-number .tag.is-delete{border:1px solid rgba(54,54,54,.32)}.control>.button{height:100%}.is-danger-light{color:#f5758f}he-sites-maps{height:200px}\n"], components: [{ type: i3.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { type: i4.NodeIconComponent, selector: "he-node-icon", inputs: ["type", "size"] }, { type: i5.MapsDrawingConfirmComponent, selector: "he-maps-drawing-confirm", inputs: ["value", "modes", "center", "zoom"], outputs: ["closed"] }, { type: i6.BibliographiesSearchConfirmComponent, selector: "he-bibliographies-search-confirm", inputs: ["search", "searchSources", "searchBibliographies", "searchBy"], outputs: ["closed"] }, { type: i7.SchemaVersionLinkComponent, selector: "he-schema-version-link", inputs: ["node", "showExternalLink", "linkClass", "text"] }, { type: i8.PopoverConfirmComponent, selector: "he-popover-confirm", inputs: ["message", "content", "position", "popoverClass"], outputs: ["confirmed"] }, { type: i9.SitesMapsComponent, selector: "he-sites-maps", inputs: ["loadPolygons", "sites", "nodes", "center", "zoom", "showNotice"] }, { type: i10.NgbHighlight, selector: "ngb-highlight", inputs: ["highlightClass", "result", "term"] }, { type: i11.UnitConverterComponent, selector: "he-unit-converter", inputs: ["term", "value", "fromUnits", "toUnits"] }], directives: [{ type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { type: i12.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i12.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i13.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { type: i10.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i12.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i10.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "placement", "container", "editable", "focusFirst", "showHint", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i15.TagsInputDirective, selector: "[appTagsInput]", inputs: ["appTagsInput"] }, { type: i14.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i14.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i14.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i14.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i14.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i14.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i14.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i14.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], pipes: { "pluralize": i16.PluralizePipe } });
|
|
409
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FilesFormComponent, decorators: [{
|
|
410
|
+
type: Component,
|
|
411
|
+
args: [{
|
|
412
|
+
selector: 'he-files-form',
|
|
413
|
+
templateUrl: './files-form.component.html',
|
|
414
|
+
styleUrls: ['./files-form.component.scss']
|
|
415
|
+
}]
|
|
416
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.HeSearchService }, { type: i2.HeUsersService }]; }, propDecorators: { schemas: [{
|
|
417
|
+
type: Input
|
|
418
|
+
}], errors: [{
|
|
419
|
+
type: Input
|
|
420
|
+
}], node: [{
|
|
421
|
+
type: Input
|
|
422
|
+
}], nodeMap: [{
|
|
423
|
+
type: Input
|
|
424
|
+
}], editable: [{
|
|
425
|
+
type: Input
|
|
426
|
+
}], errorMode: [{
|
|
427
|
+
type: Input
|
|
428
|
+
}], deepEditable: [{
|
|
429
|
+
type: Input
|
|
430
|
+
}], errorsEditable: [{
|
|
431
|
+
type: Input
|
|
432
|
+
}], nodeChange: [{
|
|
433
|
+
type: Output
|
|
434
|
+
}], nodeErorrResolved: [{
|
|
435
|
+
type: Output
|
|
436
|
+
}], nodeErrorAdded: [{
|
|
437
|
+
type: Output
|
|
438
|
+
}] } });
|
|
439
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZm9ybS9maWxlcy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy1mb3JtL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRyxPQUFPLEtBQUssU0FBUyxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsT0FBTyxFQUFzQixVQUFVLEVBQUUsUUFBUSxFQUF3QixNQUFNLHNCQUFzQixDQUFDO0FBRXRHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxPQUFPLEVBRUwsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQ3hELGdCQUFnQixFQUFFLDBCQUEwQixFQUFrQixxQkFBcUIsRUFDbkYsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUNsRCxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQzdELFlBQVksRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQ2pILDZCQUE2QixFQUFFLHNCQUFzQixFQUNyRCw4QkFBOEIsRUFBRSx1QkFBdUIs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cG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgbWVyZ2VNYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0ICogYXMgcGx1cmFsaXplIGZyb20gJ3BsdXJhbGl6ZSc7XG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmNvbnN0IGdldCA9IHJlcXVpcmUoJ2xvZGFzaC5nZXQnKTtcbmltcG9ydCB7IEpTT04gYXMgSGVzdGlhSnNvbiwgU2NoZW1hVHlwZSwgTm9kZVR5cGUsIEJpYmxpb2dyYXBoeSwgU291cmNlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IHsgZGVmaW5pdGlvbnMsIGRlZmluaXRpb24gfSBmcm9tICdAaGVzdGlhLWVhcnRoL2pzb24tc2NoZW1hJztcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgSUVycm9yUHJvcGVydHksIElOb2RlUHJvcGVydHksXG4gIGZvcm1hdFByb3BlcnR5RXJyb3IsIHByb3BlcnR5RXJyb3IsIGhhc0Vycm9yLCBoYXNXYXJuaW5nLFxuICBmb3JtYXRTdWdnZXN0aW9uLCBmb3JtYXRMaW5rTm9kZXNTdWdnZXN0aW9ucywgc3VnZ2VzdGlvblR5cGUsIGRlZmF1bHRTdWdnZXN0aW9uVHlwZSxcbiAgcmVjdXJzaXZlUHJvcGVydGllcywgdHlwZVRvTmV3UHJvcGVydHksIHByb3BlcnR5SWQsXG4gIGlzQWRkUHJvcGVydHlFbmFibGVkLCBub2RlQXZhaWxhYmxlUHJvcGVydGllcywgc29ydFByb3BlcnRpZXMsXG4gIGdyb3VwQ2hhbmdlZCwgcGFyZW50UHJvcGVydHksIHNpYmxpbmdQcm9wZXJ0eSwgdXBkYXRlUHJvcGVydGllcywgcmVmcmVzaFByb3BlcnR5S2V5cywga2V5VG9EYXRhUGF0aCwgZmluZFByb3BlcnR5LFxuICBjYWxjdWxhdGVDeWNsZUR1cmF0aW9uRW5hYmxlZCwgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbixcbiAgY2FsY3VsYXRlQ3ljbGVTdGFydERhdGVFbmFibGVkLCBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZSwgcGFyc2VOZXdWYWx1ZVxufSBmcm9tICcuLi9maWxlcy1mb3JtLm1vZGVsJztcbmltcG9ydCB7IElWYWxpZGF0aW9uRXJyb3IsIGVycm9ySGFzRXJyb3IsIGVycm9ySGFzV2FybmluZywgZmlsdGVyRXJyb3IsIGZvcm1hdEVycm9yIH0gZnJvbSAnLi4vZmlsZXMtZXJyb3IubW9kZWwnO1xuaW1wb3J0IHsgSGVVc2Vyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi91c2Vycy91c2Vycy5zZXJ2aWNlJztcbmltcG9ydCB7IEhlU2VhcmNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBtYXRjaFR5cGUsIG1hdGNoUGhyYXNlUXVlcnksIG1hdGNoUGhyYXNlUHJlZml4UXVlcnksIG1hdGNoQm9vbFByZWZpeFF1ZXJ5IH0gZnJvbSAnLi4vLi4vc2VhcmNoL3NlYXJjaC5tb2RlbCc7XG5pbXBvcnQgeyBzYWZlSlNPTlBhcnNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcblxuY29uc3QgTUlOX1RZUEVBSEVBRF9MRU5HVEggPSAyO1xuY29uc3QgcG9wdWxhdGVUZXJtRmllbGRzID0gW1xuICAndGVybVR5cGUnLCAndW5pdHMnLFxuICAnZGVmYXVsdFByb3BlcnRpZXMudGVybS5uYW1lJywgJ2RlZmF1bHRQcm9wZXJ0aWVzLnRlcm0udW5pdHMnLCAnZGVmYXVsdFByb3BlcnRpZXMudmFsdWUnXG5dO1xuXG50eXBlIHN1Z2dlc3RGdW5jID0gKHRlcm06IHN0cmluZywgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+IE9ic2VydmFibGU8YW55W10+O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1maWxlcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlcy1mb3JtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRmlsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBzY2hlbWFzPzogZGVmaW5pdGlvbnM7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgZXJyb3JzOiBJVmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgQElucHV0KClcbiAgcHVibGljIG5vZGU/OiBIZXN0aWFKc29uPFNjaGVtYVR5cGU+O1xuICBASW5wdXQoKVxuICBwdWJsaWMgbm9kZU1hcDogeyBbdHlwZSBpbiBOb2RlVHlwZV0/OiBzdHJpbmdbXSB9ID0ge307XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlZGl0YWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZXJyb3JNb2RlID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkZWVwRWRpdGFibGUgPSB0cnVlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZXJyb3JzRWRpdGFibGUgPSBmYWxzZTtcblxuICBAT3V0cHV0KClcbiAgcHJpdmF0ZSBub2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogYW55IH0+KCk7XG4gIEBPdXRwdXQoKVxuICBwcml2YXRlIG5vZGVFcm9yclJlc29sdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKVxuICBwcml2YXRlIG5vZGVFcnJvckFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJVmFsaWRhdGlvbkVycm9yPigpO1xuXG4gIHB1YmxpYyBOb2RlVHlwZSA9IE5vZGVUeXBlO1xuICBwdWJsaWMgU2NoZW1hVHlwZSA9IFNjaGVtYVR5cGU7XG4gIHB1YmxpYyBpc09wZW4gPSB0cnVlO1xuICBwdWJsaWMgbWFwVmlzaWJsZSA9IGZhbHNlO1xuICBwdWJsaWMgcGx1cmFsaXplID0gcGx1cmFsaXplO1xuICBwdWJsaWMgZm9ybWF0UHJvcGVydHlFcnJvciA9IGZvcm1hdFByb3BlcnR5RXJyb3I7XG4gIHB1YmxpYyBtYXBEcmF3aW5nUHJvcGVydHk/OiBJTm9kZVByb3BlcnR5O1xuICBwdWJsaWMgYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eT86IElOb2RlUHJvcGVydHk7XG4gIHB1YmxpYyBub2RlUHJvcGVydHk/OiBJTm9kZVByb3BlcnR5O1xuICBwdWJsaWMgcHJvcGVydGllczogSU5vZGVQcm9wZXJ0eVtdID0gW107XG5cbiAgcHVibGljIGZvcm1hdHRlciA9ICh2YWx1ZTogYW55KSA9PlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyAoJ2JpYmxpb2dyYXBoeScgaW4gdmFsdWUgPyB2YWx1ZS5iaWJsaW9ncmFwaHk/LnRpdGxlIDogdmFsdWUubmFtZSkgOiB2YWx1ZTtcblxuICBwdWJsaWMgc3VnZ2VzdE5ld1Byb3BlcnR5ID0gKGZ1bGxLZXk6IHN0cmluZykgPT4gKHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4pID0+XG4gICAgdGV4dCQucGlwZShcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBzd2l0Y2hNYXAoXG4gICAgICAgIHRlcm0gPT4gb2YodGhpcy5uZXdQcm9wZXJ0aWVzKGZpbmRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIGZ1bGxLZXkpIHx8IHRoaXMubm9kZVByb3BlcnR5LCB0ZXJtKSlcbiAgICAgIClcbiAgICApO1xuXG4gIHByaXZhdGUgc3VnZ2VzdEV4aXN0aW5nTm9kZSA9ICh0eXBlOiBOb2RlVHlwZSwgdGVybTogc3RyaW5nLCB1bmlxdWVLZXkgPSAnQGlkJykgPT5cbiAgICB0ZXJtLmxlbmd0aCA8IE1JTl9UWVBFQUhFQURfTEVOR1RIID9cbiAgICAgIG9mKFtdKSA6XG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdCh0ZXJtLCB0eXBlLCBbXSwge1xuICAgICAgICBib29sOiB7XG4gICAgICAgICAgbXVzdDogW21hdGNoVHlwZSh0eXBlKV0sXG4gICAgICAgICAgc2hvdWxkOiBbXG4gICAgICAgICAgICBtYXRjaFBocmFzZVF1ZXJ5KHRlcm0sIDEwMCwgdW5pcXVlS2V5KSxcbiAgICAgICAgICAgIG1hdGNoUGhyYXNlUHJlZml4UXVlcnkodGVybSwgMjAsIHVuaXF1ZUtleSksXG4gICAgICAgICAgICBtYXRjaEJvb2xQcmVmaXhRdWVyeSh0ZXJtLCAxMCwgdW5pcXVlS2V5KVxuICAgICAgICAgIF0sXG4gICAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgICAgfVxuICAgICAgfSwgNSwgcG9wdWxhdGVUZXJtRmllbGRzKTtcblxuICBwcml2YXRlIHN1Z2dlc3ROb2RlID0gKHR5cGU6IE5vZGVUeXBlLCBzdWdnZXN0RGVmYXVsdD86IHN1Z2dlc3RGdW5jKSA9PiAodGVybTogc3RyaW5nLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT5cbiAgICAocHJvcGVydHkuc3VnZ2VzdGlvbnM/LmlzVW5pcXVlS2V5ID8gKFxuICAgICAgdGhpcy5zdWdnZXN0RXhpc3RpbmdOb2RlKHR5cGUsIHRlcm0sIHByb3BlcnR5LnN1Z2dlc3Rpb25zLmlzVW5pcXVlS2V5KVxuICAgICkgOiAoXG4gICAgICBwcm9wZXJ0eS5zdWdnZXN0aW9ucz8uaXNMaW5rTm9kZSA/XG4gICAgICAgIG9mKGZvcm1hdExpbmtOb2Rlc1N1Z2dlc3Rpb25zKHRoaXMubm9kZU1hcCwgdHlwZSkpIDogKFxuICAgICAgICAgIHN1Z2dlc3REZWZhdWx0ID8gc3VnZ2VzdERlZmF1bHQodGVybSwgcHJvcGVydHkpIDogb2YoW10pXG4gICAgICAgIClcbiAgICApKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLm1hcChmb3JtYXRTdWdnZXN0aW9uKSlcbiAgICApO1xuXG4gIHByaXZhdGUgc3VnZ2VzdGVyOiB7XG4gICAgW3R5cGUgaW4gc3VnZ2VzdGlvblR5cGVdPzogc3VnZ2VzdEZ1bmM7XG4gIH0gPSB7XG4gICAgZGVmYXVsdDogKHRlcm0sIHByb3BlcnR5KSA9PiBvZihcbiAgICAgIChwcm9wZXJ0eT8uc3VnZ2VzdGlvbnM/LnZhbHVlcyB8fCBbXSlcbiAgICAgICAgLm1hcCh2ID0+IGAke3Z9YClcbiAgICAgICAgLmZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAubWFwKG5hbWUgPT4gKHsgbmFtZSB9KSlcbiAgICApLFxuICAgIFtOb2RlVHlwZS5BY3Rvcl06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuQWN0b3IpLFxuICAgIFtOb2RlVHlwZS5DeWNsZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuQ3ljbGUpLFxuICAgIFtOb2RlVHlwZS5JbXBhY3RBc3Nlc3NtZW50XTogdGhpcy5zdWdnZXN0Tm9kZShOb2RlVHlwZS5JbXBhY3RBc3Nlc3NtZW50KSxcbiAgICBbTm9kZVR5cGUuT3JnYW5pc2F0aW9uXTogdGhpcy5zdWdnZXN0Tm9kZShOb2RlVHlwZS5PcmdhbmlzYXRpb24pLFxuICAgIFtOb2RlVHlwZS5TaXRlXTogdGhpcy5zdWdnZXN0Tm9kZShOb2RlVHlwZS5TaXRlKSxcbiAgICBbTm9kZVR5cGUuU291cmNlXTogdGhpcy5zdWdnZXN0Tm9kZShOb2RlVHlwZS5Tb3VyY2UsICh0ZXJtLCB7IGtleSB9KSA9PlxuICAgICAgdGVybS5sZW5ndGggPCBNSU5fVFlQRUFIRUFEX0xFTkdUSCA/XG4gICAgICAgIG9mKFtdKSA6XG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdWdnZXN0U291cmNlKHRlcm0sIDUsIFtgYmlibGlvZ3JhcGh5LiR7a2V5fWBdLCBbYGJpYmxpb2dyYXBoeS4ke2tleX1gXSlcbiAgICApLFxuICAgIFtOb2RlVHlwZS5UZXJtXTogdGhpcy5zdWdnZXN0Tm9kZShOb2RlVHlwZS5UZXJtLCAodGVybSwgeyBzdWdnZXN0aW9ucyB9KSA9PlxuICAgICAgdGVybS5sZW5ndGggPCBNSU5fVFlQRUFIRUFEX0xFTkdUSCA/XG4gICAgICAgIG9mKFtdKSA6XG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdWdnZXN0KHRlcm0sIE5vZGVUeXBlLlRlcm0sIHN1Z2dlc3Rpb25zPy5xdWVyaWVzIHx8IFtdLCBudWxsLCA1LCBwb3B1bGF0ZVRlcm1GaWVsZHMpXG4gICAgKVxuICB9O1xuICBwdWJsaWMgcHJvcGVydHlTdWdnZXN0ID0gKGZ1bGxLZXk6IHN0cmluZywgc3VnZ2VzdFR5cGU6IHN1Z2dlc3Rpb25UeXBlKSA9PiAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cbiAgICB0ZXh0JC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHN1Z2dlc3RUeXBlID09PSBkZWZhdWx0U3VnZ2VzdGlvblR5cGUgPyAwIDogMzAwKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBtZXJnZU1hcCh0ZXJtID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSBmaW5kUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBmdWxsS2V5KTtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5Py5lZGl0YWJsZSAmJiBzdWdnZXN0VHlwZSBpbiB0aGlzLnN1Z2dlc3RlciA/XG4gICAgICAgICAgb2YodGVybSkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiBwcm9wZXJ0eS5sb2FkaW5nID0gdHJ1ZSksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zdWdnZXN0ZXJbc3VnZ2VzdFR5cGVdISh0ZXJtLCBwcm9wZXJ0eSkpLFxuICAgICAgICAgICAgdGFwKCgpID0+IHByb3BlcnR5LmxvYWRpbmcgPSBmYWxzZSlcbiAgICAgICAgICApIDpcbiAgICAgICAgICBvZihbXSk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBIZVNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2Vyc1NlcnZpY2U6IEhlVXNlcnNTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgc2NoZW1hVHlwZSA9IHRoaXMubm9kZSEudHlwZSB8fCB0aGlzLm5vZGUhWydAdHlwZSddO1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hcyA/IHRoaXMuc2NoZW1hc1tzY2hlbWFUeXBlXSA6IHt9IGFzIGRlZmluaXRpb247XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5lcnJvcnMuZmlsdGVyKGZpbHRlckVycm9yKTtcbiAgICBjb25zdCBlcnJvciA9IHByb3BlcnR5RXJyb3IoZXJyb3JzKSgnJyk7XG4gICAgdGhpcy5ub2RlUHJvcGVydHkgPSB0aGlzLnNjaGVtYXMgPyB7XG4gICAgICBpZDogcHJvcGVydHlJZCgpLFxuICAgICAgc2NoZW1hLFxuICAgICAgc2NoZW1hVHlwZSxcbiAgICAgIGVkaXRhYmxlOiAhIXRoaXMubm9kZSEudHlwZSxcbiAgICAgIGZ1bGxLZXk6ICcnLFxuICAgICAga2V5OiAnJyxcbiAgICAgIHZhbHVlOiB7fSxcbiAgICAgIGVycm9yOiBmb3JtYXRFcnJvcihlcnJvciksXG4gICAgICBoYXNFcnJvcjogZXJyb3JIYXNFcnJvcihlcnJvciksXG4gICAgICBoYXNXYXJuaW5nOiBlcnJvckhhc1dhcm5pbmcoZXJyb3IpLFxuICAgICAgc3VnZ2VzdGlvbnM6IHt9LFxuICAgICAgbmV3UHJvcGVydHk6IHt9LFxuICAgICAgbmV3RXJyb3I6IHsgbGV2ZWw6ICd3YXJuaW5nJyB9LFxuICAgICAgcHJvcGVydGllczogW10sXG4gICAgICBhZGRQcm9wZXJ0eUVuYWJsZWQ6IGlzQWRkUHJvcGVydHlFbmFibGVkKHRoaXMubm9kZSEsIHNjaGVtYVR5cGUsIHNjaGVtYSlcbiAgICB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY3Vyc2VyID0gcmVjdXJzaXZlUHJvcGVydGllcyh0aGlzLnNjaGVtYXMhLCBlcnJvcnMsIHNjaGVtYSwgdGhpcy5kZWVwRWRpdGFibGUpO1xuICAgIHRoaXMucHJvcGVydGllcyA9IHJlY3Vyc2VyKHRoaXMubm9kZSk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIsIF92YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgcHVibGljIHRyYWNrQnlQcm9wZXJ0eShfaW5kZXg6IG51bWJlciwgeyBpZCwgZnVsbEtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFtmdWxsS2V5LCBpZF0uam9pbignXycpO1xuICB9XG5cbiAgcHVibGljIGhhc0FkZG9ucyhwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBwcm9wZXJ0eSAmJiAoXG4gICAgICB0aGlzLmVuYWJsZUFkZEVycm9yKHByb3BlcnR5KSB8fFxuICAgICAgKHRoaXMuZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUpIHx8XG4gICAgICB0aGlzLmFkZFByb3BlcnR5RW5hYmxlZChwcm9wZXJ0eSkgfHxcbiAgICAgIHRoaXMuaXNSZXF1aXJlZChwcm9wZXJ0eSkgfHxcbiAgICAgIHByb3BlcnR5LmV4dGVybmFsVXJsPy51cmwgfHxcbiAgICAgIHRoaXMubWFwRHJhd2luZ01vZGVzKHByb3BlcnR5KS5sZW5ndGggfHxcbiAgICAgIHRoaXMudW5pdENvbnZlcnRlckVuYWJsZWQocHJvcGVydHkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1JlcXVpcmVkKHsgdmFsdWUsIGlzUmVxdWlyZWQgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBpc1JlcXVpcmVkICYmIGlzRW1wdHkodmFsdWUpO1xuICB9XG5cbiAgLy8gLS0tIEVycm9yc1xuXG4gIHB1YmxpYyBlbmFibGVBZGRFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiB0aGlzLmVycm9yc0VkaXRhYmxlICYmICFwcm9wZXJ0eS5oYXNFcnJvciAmJiAhcHJvcGVydHkuaGFzV2FybmluZztcbiAgfVxuXG4gIHB1YmxpYyBhZGRFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgeyBtZXNzYWdlLCBsZXZlbCB9OiBJRXJyb3JQcm9wZXJ0eSkge1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gcHJvcGVydHkuZnVsbEtleS5zcGxpdCgnLicpO1xuICAgIGtleXMucG9wKCk7XG4gICAgY29uc3QgZXJyb3I6IElWYWxpZGF0aW9uRXJyb3IgPSBwcm9wZXJ0eS5pc0FkZGVkID8ge1xuICAgICAgbWVzc2FnZSxcbiAgICAgIGxldmVsOiBsZXZlbCB8fCAnZXJyb3InLFxuICAgICAgZGF0YVBhdGg6IGtleVRvRGF0YVBhdGgoa2V5cy5qb2luKCcuJykpLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIG1pc3NpbmdQcm9wZXJ0eTogcHJvcGVydHkua2V5XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBsZXZlbDogbGV2ZWwgfHwgJ2Vycm9yJyxcbiAgICAgIGRhdGFQYXRoOiBrZXlUb0RhdGFQYXRoKHByb3BlcnR5LmZ1bGxLZXkpXG4gICAgfTtcbiAgICBwcm9wZXJ0eS5uZXdFcnJvciA9IHsgbGV2ZWw6ICd3YXJuaW5nJyB9O1xuICAgIHByb3BlcnR5LmVycm9yID0gZXJyb3I7XG4gICAgcHJvcGVydHkuaGFzRXJyb3IgPSBlcnJvckhhc0Vycm9yKGVycm9yKTtcbiAgICBwcm9wZXJ0eS5oYXNXYXJuaW5nID0gZXJyb3JIYXNXYXJuaW5nKGVycm9yKTtcbiAgICB0aGlzLm5vZGVFcnJvckFkZGVkLmVtaXQoZXJyb3IpO1xuICB9XG5cbiAgcHVibGljIGVkaXRFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHByb3BlcnR5Lm5ld0Vycm9yID0gcHJvcGVydHkuZXJyb3I7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUVycm9yKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSBwcm9wZXJ0eS5lcnJvcj8uaW5kZXg7XG4gICAgcHJvcGVydHkuZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgcHJvcGVydHkuaGFzRXJyb3IgPSBoYXNFcnJvcihwcm9wZXJ0eS5wcm9wZXJ0aWVzKTtcbiAgICBwcm9wZXJ0eS5oYXNXYXJuaW5nID0gaGFzV2FybmluZyhwcm9wZXJ0eS5wcm9wZXJ0aWVzKTtcbiAgICB0aGlzLm5vZGVFcm9yclJlc29sdmVkLmVtaXQoaW5kZXgpO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eS5mdWxsS2V5KTtcbiAgfVxuXG4gIC8vIC0tLVxuXG4gIHB1YmxpYyB0eXBlYWhlYWRGb2N1cyhlOiBFdmVudCkge1xuICAgIGlmIChlLmJ1YmJsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBuZXcgRXZlbnQoJ2lucHV0Jyk7XG4gICAgICBlLnRhcmdldD8uZGlzcGF0Y2hFdmVudChpbnB1dEV2ZW50KTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0YWJsZSAmJiAhdGhpcy5lcnJvcnNFZGl0YWJsZSAmJiBwcm9wZXJ0eS5hZGRQcm9wZXJ0eUVuYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIG5ld1Byb3BlcnRpZXMocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGZpZWxkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gbm9kZUF2YWlsYWJsZVByb3BlcnRpZXModGhpcy5ub2RlISwgcHJvcGVydHkpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcihwcm9wID0+IHByb3AudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWVsZC50b0xvd2VyQ2FzZSgpKSlcbiAgICAgIC5tYXAobmFtZSA9PiAoeyBuYW1lLCBwcm9wOiBwcm9wZXJ0aWVzW25hbWVdIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgZGF0YTogYW55LCBlZGl0YWJsZT86IGJvb2xlYW4sIHJlcGxhY2VQYXJlbnQgPSB0cnVlKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcmVwbGFjZVBhcmVudCA/IHBhcmVudFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpIDogcHJvcGVydHk7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHJlY3Vyc2l2ZVByb3BlcnRpZXMoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBbXSwgdGhpcy5zY2hlbWFzIVt0aGlzLm5vZGUhLnR5cGVdLCB0aGlzLmRlZXBFZGl0YWJsZSwgcGFyZW50LmZ1bGxLZXlcbiAgICApKGRhdGEpO1xuICAgIHVwZGF0ZVByb3BlcnRpZXMoeyBwcm9wZXJ0aWVzIH0sIHByb3AgPT4ge1xuICAgICAgcHJvcC5lZGl0YWJsZSA9IHR5cGVvZiBlZGl0YWJsZSA9PT0gJ3VuZGVmaW5lZCcgPyBwcm9wLmVkaXRhYmxlIDogZWRpdGFibGU7XG4gICAgICByZXR1cm4gcHJvcDtcbiAgICB9KTtcbiAgICBwYXJlbnQuZWRpdGFibGUgPSB0eXBlb2YgZWRpdGFibGUgPT09ICd1bmRlZmluZWQnID8gcGFyZW50LmVkaXRhYmxlIDogZWRpdGFibGU7XG4gICAgcGFyZW50LnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIHBhcmVudC52YWx1ZSA9IGRhdGE7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKGRhdGEsIHBhcmVudCk7XG4gIH1cblxuICBwdWJsaWMgc3VnZ2VzdGlvblNlbGVjdGVkKHsgJ0BpZCc6IF9pZCwgbmFtZSwgdHlwZSwgaWQsIC4uLmRhdGEgfSwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gX2lkID9cbiAgICAgIC8vIHN1Z2dlc3Rpb25zIGZyb20gZXhpc3Rpbmcgbm9kZXNcbiAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eSwgeyAnQGlkJzogX2lkLCAnQHR5cGUnOiBwcm9wZXJ0eS5zdWdnZXN0aW9ucz8udHlwZSwgbmFtZSwgLi4uZGF0YSB9LCBmYWxzZSkgOlxuICAgICAgKFxuICAgICAgICAvLyBzdWdnZXN0aW9uIGZyb20gbGlua2VkIG5vZGVzXG4gICAgICAgIHR5cGUgJiYgaWQgP1xuICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eSwgeyB0eXBlLCBpZCwgLi4uZGF0YSB9LCB0cnVlKSA6XG4gICAgICAgICAgLy8gc3VnZ2VzdGlvbiBieSBuYW1lID0+IGVudW0gdmFsdWVzXG4gICAgICAgICAgdGhpcy5wcm9wZXJ0eUNoYW5nZWQobmFtZSwgcHJvcGVydHkpXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZEFycmF5R3JvdXAoYXJyYXk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5zY2hlbWFzIVthcnJheS5zY2hlbWFUeXBlXTtcbiAgICBjb25zdCB2YWx1ZSA9IGdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpO1xuICAgIGNvbnN0IG5ld1Byb3BlcnR5ID0gdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLCBwcm9wLCB2YWx1ZSwgYCR7YXJyYXkuZnVsbEtleX1bJHthcnJheS5wcm9wZXJ0aWVzLmxlbmd0aH1dYFxuICAgICk7XG4gICAgYXJyYXkucHJvcGVydGllcy5wdXNoKG5ld1Byb3BlcnR5KTtcbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogYXJyYXkuZnVsbEtleSwgdmFsdWUgfSk7XG4gICAgcmV0dXJuIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIGFycmF5LmZ1bGxLZXkpO1xuICB9XG5cbiAgcHVibGljIGR1cGxpY2F0ZUFycmF5R3JvdXAoYXJyYXk6IElOb2RlUHJvcGVydHksIHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSArcHJvcGVydHkua2V5O1xuICAgIGNvbnN0IG5ld1Byb3BlcnR5OiBJTm9kZVByb3BlcnR5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSkpO1xuICAgIG5ld1Byb3BlcnR5LmlkID0gcHJvcGVydHlJZCgpO1xuICAgIGNvbnN0IHZhbHVlID0gWy4uLmdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpXTtcbiAgICB2YWx1ZS5zcGxpY2UoaW5kZXgsIDAsIHNhZmVKU09OUGFyc2UobmV3UHJvcGVydHkudmFsdWUpKTtcbiAgICBhcnJheS5wcm9wZXJ0aWVzLnNwbGljZShpbmRleCwgMCwgbmV3UHJvcGVydHkpO1xuICAgIC8vIG5lZWQgdG8gY2hhbmdlIGtleSBvbiBldmVyeSBwcm9wZXJ0aWVzIHJlY3Vyc2l2ZWx5XG4gICAgcmVmcmVzaFByb3BlcnR5S2V5cyhhcnJheSk7XG4gICAgdGhpcy5ub2RlQ2hhbmdlLmVtaXQoeyBrZXk6IGFycmF5LmZ1bGxLZXksIHZhbHVlIH0pO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBhcnJheS5mdWxsS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBcnJheUdyb3VwKGFycmF5OiBJTm9kZVByb3BlcnR5LCB7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSAra2V5O1xuICAgIGNvbnN0IHZhbHVlID0gWy4uLmdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpXTtcbiAgICB2YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGFycmF5LnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAvLyBuZWVkIHRvIGNoYW5nZSBrZXkgb24gZXZlcnkgcHJvcGVydGllcyByZWN1cnNpdmVseVxuICAgIHJlZnJlc2hQcm9wZXJ0eUtleXMoYXJyYXkpO1xuICAgIHRoaXMubm9kZUNoYW5nZS5lbWl0KHsga2V5OiBhcnJheS5mdWxsS2V5LCB2YWx1ZSB9KTtcbiAgICAvLyBpZiBubyBtb3JlIHZhbHVlcywgcmVtb3ZlIHBhcmVudCBncm91cCBlbnRpcmVseVxuICAgIHJldHVybiBhcnJheS5wcm9wZXJ0aWVzLmxlbmd0aCA/IG51bGwgOiB0aGlzLnByb3BlcnR5Q2hhbmdlZChudWxsLCBhcnJheSk7XG4gIH1cblxuICBwcml2YXRlIG1vdmVBcnJheUdyb3VwVG9Qb3NpdGlvbihhcnJheTogSU5vZGVQcm9wZXJ0eSwgY3VycmVudEluZGV4OiBudW1iZXIsIG5ld0luZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IFsuLi5nZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KV07XG4gICAgbW92ZUl0ZW1JbkFycmF5KHZhbHVlLCBjdXJyZW50SW5kZXgsIG5ld0luZGV4KTtcbiAgICBtb3ZlSXRlbUluQXJyYXkoYXJyYXkucHJvcGVydGllcywgY3VycmVudEluZGV4LCBuZXdJbmRleCk7XG4gICAgLy8gbmVlZCB0byBjaGFuZ2Uga2V5IG9uIGV2ZXJ5IHByb3BlcnRpZXMgcmVjdXJzaXZlbHlcbiAgICByZWZyZXNoUHJvcGVydHlLZXlzKGFycmF5KTtcbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogYXJyYXkuZnVsbEtleSwgdmFsdWUgfSk7XG4gICAgcmV0dXJuIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIGFycmF5LmZ1bGxLZXkpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBcnJheUdyb3VwVXAoYXJyYXk6IElOb2RlUHJvcGVydHksIHsga2V5IH06IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICtrZXk7XG4gICAgcmV0dXJuIHRoaXMubW92ZUFycmF5R3JvdXBUb1Bvc2l0aW9uKGFycmF5LCBpbmRleCwgaW5kZXggLSAxKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQXJyYXlHcm91cERvd24oYXJyYXk6IElOb2RlUHJvcGVydHksIHsga2V5IH06IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICtrZXk7XG4gICAgcmV0dXJuIHRoaXMubW92ZUFycmF5R3JvdXBUb1Bvc2l0aW9uKGFycmF5LCBpbmRleCwgaW5kZXggKyAxKTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9wZXJ0eUNoYW5nZWQodmFsdWU6IGFueSwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eS5mdWxsS2V5LCB2YWx1ZSk7XG4gICAgcHJvcGVydHkuYWRkUHJvcGVydHlFbmFibGVkID0gaXNBZGRQcm9wZXJ0eUVuYWJsZWQoXG4gICAgICB0aGlzLm5vZGUhLCBwcm9wZXJ0eS5zY2hlbWFUeXBlLCBwcm9wZXJ0eS5zY2hlbWEhLCBwcm9wZXJ0eS5mdWxsS2V5XG4gICAgKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcHJvcGVydHkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHByb3BlcnR5LmNoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMubm9kZUNoYW5nZS5lbWl0KHsga2V5OiBwcm9wZXJ0eS5mdWxsS2V5LCB2YWx1ZTogcGFyc2VOZXdWYWx1ZShwcm9wZXJ0eS5zY2hlbWEhLCB2YWx1ZSkgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwga2V5OiBzdHJpbmcsIGRlZjogZGVmaW5pdGlvbikge1xuICAgIGNvbnN0IG5vZGUgPSBwcm9wZXJ0eS5rZXkgPyBnZXQodGhpcy5ub2RlLCBwcm9wZXJ0eS5mdWxsS2V5KSA6IHRoaXMubm9kZTtcbiAgICBjb25zdCBmdWxsS2V5ID0gcHJvcGVydHkua2V5ID8gYCR7cHJvcGVydHkuZnVsbEtleX0uJHtrZXl9YCA6IGtleTtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gcHJvcGVydHkua2V5ID8gcHJvcGVydHkucHJvcGVydGllcyA6IHRoaXMucHJvcGVydGllcztcbiAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHR5cGVUb05ld1Byb3BlcnR5KHRoaXMuc2NoZW1hcyEsIGRlZiwgdGhpcy5zY2hlbWFzIVtwcm9wZXJ0eS5zY2hlbWFUeXBlXSwgbm9kZSwgZnVsbEtleSk7XG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0eUluZGV4ID0gcHJvcGVydGllcy5maW5kSW5kZXgodiA9PiB2LmZ1bGxLZXkgPT09IGZ1bGxLZXkpO1xuICAgIGV4aXN0aW5nUHJvcGVydHlJbmRleCA+PSAwID8gKHByb3BlcnRpZXNbZXhpc3RpbmdQcm9wZXJ0eUluZGV4XSA9IG5ld1Byb3BlcnR5KSA6IHByb3BlcnRpZXMucHVzaChuZXdQcm9wZXJ0eSk7XG4gICAgcHJvcGVydGllcy5zb3J0KHNvcnRQcm9wZXJ0aWVzKTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQobmV3UHJvcGVydHkudmFsdWUsIG5ld1Byb3BlcnR5KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNaXNzaW5nUHJvcGVydHkocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHBhcmVudCA9PT0gcHJvcGVydHkgPyB0aGlzLm5vZGVQcm9wZXJ0eSEgOiBwYXJlbnQ7XG4gICAgY29uc3QgbmV3UHJvcGVydGllcyA9IHRoaXMubmV3UHJvcGVydGllcyhuZXdQcm9wZXJ0eSwgcHJvcGVydHkua2V5KTtcbiAgICBuZXdQcm9wZXJ0eS5uZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnRpZXNbMF07XG4gICAgcmV0dXJuIG5ld1Byb3BlcnR5Lm5ld1Byb3BlcnR5ID8gdGhpcy5hZGRQcm9wZXJ0eShuZXdQcm9wZXJ0eSkgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFkZFByb3BlcnR5KHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgeyBuYW1lLCBwcm9wIH0gPSBwcm9wZXJ0eS5uZXdQcm9wZXJ0eSE7XG4gICAgcHJvcGVydHkubmV3UHJvcGVydHkgPSB7fTtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ0BpZCcgP1xuICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHByb3BlcnR5LCB7ICdAaWQnOiAnJywgdHlwZTogcHJvcGVydHkuc2NoZW1hVHlwZSB9LCB1bmRlZmluZWQsIGZhbHNlKSA6XG4gICAgICB0aGlzLmFkZERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eSwgbmFtZSEsIHByb3AhKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUHJvcGVydHlDb29yZGluYXRlcyhwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgdmFsdWU6IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWwpIHtcbiAgICBjb25zdCBsYXRpdHVkZSA9IHNpYmxpbmdQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LCAnbGF0aXR1ZGUnKTtcbiAgICBjb25zdCBsb25naXR1ZGUgPSBzaWJsaW5nUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSwgJ2xvbmdpdHVkZScpO1xuICAgIHJldHVybiBbXG4gICAgICBsYXRpdHVkZSA/IHRoaXMucHJvcGVydHlDaGFuZ2VkKHZhbHVlLmxhdCwgbGF0aXR1ZGUpIDogbnVsbCxcbiAgICAgIGxvbmdpdHVkZSA/IHRoaXMucHJvcGVydHlDaGFuZ2VkKHZhbHVlLmxuZywgbG9uZ2l0dWRlKSA6IG51bGxcbiAgICBdO1xuICB9XG5cbiAgLy8gTWFwXG5cbiAgcHVibGljIGdldCBzaG93TWFwKCkge1xuICAgIHJldHVybiAoIXRoaXMuZWRpdGFibGUgfHwgdGhpcy5lcnJvck1vZGUpICYmIFtTY2hlbWFUeXBlLlNpdGUsIFNjaGVtYVR5cGUuT3JnYW5pc2F0aW9uXS5pbmNsdWRlcyh0aGlzLm5vZGUhLnR5cGUpO1xuICB9XG5cbiAgcHVibGljIG1hcERyYXdpbmdNb2Rlcyh7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFsnYm91bmRhcnknXS5pbmNsdWRlcyhrZXkpID8gW1xuICAgICAgZ29vZ2xlLm1hcHMuZHJhd2luZy5PdmVybGF5VHlwZS5QT0xZR09OXG4gICAgXSA6IChbXG4gICAgICAnbGF0aXR1ZGUnLCAnbG9uZ2l0dWRlJ1xuICAgIF0uaW5jbHVkZXMoa2V5KSA/IFtcbiAgICAgIGdvb2dsZS5tYXBzLmRyYXdpbmcuT3ZlcmxheVR5cGUuTUFSS0VSXG4gICAgXSA6IFtdKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1hcERyYXdpbmdDbG9zZWQobmV3VmFsdWUpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMubWFwRHJhd2luZ1Byb3BlcnR5O1xuICAgIHRoaXMubWFwRHJhd2luZ1Byb3BlcnR5ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBbJ2xhdGl0dWRlJywgJ2xvbmdpdHVkZSddLmluY2x1ZGVzKHByb3BlcnR5IS5rZXkpID9cbiAgICAgIHRoaXMudXBkYXRlUHJvcGVydHlDb29yZGluYXRlcyhwcm9wZXJ0eSEsIG5ld1ZhbHVlKSA6XG4gICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlZChuZXdWYWx1ZSwgcHJvcGVydHkhKTtcbiAgfVxuXG4gIC8vIEJpYmxpb2dyYXBoeSBTZWFyY2hcblxuICBwdWJsaWMgYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkoeyBrZXksIHNjaGVtYVR5cGUgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbGlkU2NoZW1hID0gW1NjaGVtYVR5cGUuQmlibGlvZ3JhcGh5XS5pbmNsdWRlcyhzY2hlbWFUeXBlKTtcbiAgICBjb25zdCB2YWxpZUtleSA9IFsndGl0bGUnLCAnZG9jdW1lbnRET0knLCAnc2NvcHVzJ10uaW5jbHVkZXMoa2V5KTtcbiAgICByZXR1cm4gdmFsaWRTY2hlbWEgJiYgdmFsaWVLZXkgPyBrZXkgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVCaWJsaW9ncmFwaHkodmFsdWU6IFBhcnRpYWw8QmlibGlvZ3JhcGh5Pikge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgdGhpcy5iaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5ISk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoU291cmNlcyA/IHtcbiAgICAgIC4uLnBhcmVudC52YWx1ZSxcbiAgICAgIGJpYmxpb2dyYXBoeTogdmFsdWVcbiAgICB9IDogdmFsdWU7XG4gICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEsIG5ld1ZhbHVlLCB0cnVlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTb3VyY2UodmFsdWU6IFBhcnRpYWw8U291cmNlPikge1xuICAgIC8vIGNhbm5vdCByZXBsYWNlIGEgdG9wLWxldmVsIHNvdXJjZVxuICAgIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hTb3VyY2VzICYmIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YSh0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkhLCB7XG4gICAgICAnQHR5cGUnOiBOb2RlVHlwZS5Tb3VyY2UsXG4gICAgICAuLi52YWx1ZVxuICAgIH0sICEoJ0BpZCcgaW4gdmFsdWUpKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBiaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEuZnVsbEtleS5zcGxpdCgnLicpLmxlbmd0aCA+IDI7XG4gIH1cblxuICBwdWJsaWMgb25CaWJsaW9ncmFwaGllc1NlYXJjaENsb3NlZCh2YWx1ZT86IFBhcnRpYWw8U291cmNlPiB8IFBhcnRpYWw8QmlibGlvZ3JhcGh5Pikge1xuICAgIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSA9IHZhbHVlID8gKFxuICAgICAgdmFsdWUudHlwZSA9PT0gU2NoZW1hVHlwZS5CaWJsaW9ncmFwaHkgP1xuICAgICAgICB0aGlzLnVwZGF0ZUJpYmxpb2dyYXBoeSh2YWx1ZSkgOlxuICAgICAgICB0aGlzLnVwZGF0ZVNvdXJjZSh2YWx1ZSBhcyBQYXJ0aWFsPFNvdXJjZT4pXG4gICAgKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIEFjdG9yLkBpZFxuXG4gIHB1YmxpYyBhc3luYyBzZXRVc2VyQWN0b3JJZChwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHsgYWN0b3JJZCwgbmFtZSB9ID0gYXdhaXQgdGhpcy51c2Vyc1NlcnZpY2UubG9nZ2VkSW5Vc2VyO1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgJ0BpZCc6IGFjdG9ySWQsICdAdHlwZSc6IE5vZGVUeXBlLkFjdG9yLCBuYW1lIH0sIGZhbHNlKTtcbiAgfVxuXG4gIC8vIEN5Y2xlLmN5Y2xlRHVyYXRpb25cblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbih0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQoZHVyYXRpb24sIHByb3BlcnR5KTtcbiAgfVxuXG4gIC8vIEN5Y2xlLnN0YXJ0RGF0ZVxuXG4gIHB1YmxpYyBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZUVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlQ3ljbGVTdGFydERhdGVFbmFibGVkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gY2FsY3VsYXRlQ3ljbGVTdGFydERhdGUodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKHN0YXJ0RGF0ZSwgcHJvcGVydHkpO1xuICB9XG5cbiAgLy8gVW5pdHMgY29udmVydGVyXG5cbiAgcHVibGljIHVuaXRDb252ZXJ0ZXJFbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgWyd2YWx1ZScsICdtaW4nLCAnbWF4JywgJ3NkJ10uaW5jbHVkZXMocHJvcGVydHkua2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuVW5pdENvbnZlcnRlcihwb3BvdmVyLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydHkudmFsdWU7XG4gICAgY29uc3QgdGVybVByb3BlcnR5ID0gc2libGluZ1Byb3BlcnR5KHRoaXMucHJvcGVydGllcywgcHJvcGVydHksICd0ZXJtJyk7XG4gICAgY29uc3QgdGVybSA9IHNhZmVKU09OUGFyc2UodGVybVByb3BlcnR5Py52YWx1ZSk7XG4gICAgY29uc3QgdW5pdHMgPSB0ZXJtPy51bml0cztcbiAgICByZXR1cm4gcG9wb3Zlci5pc09wZW4oKSA/IHBvcG92ZXIuY2xvc2UoKSA6IHBvcG92ZXIub3Blbih7IHZhbHVlLCB0ZXJtLCB1bml0cyB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtdG9nZ2xlIHAtNFwiIChjbGljayk9XCJpc09wZW4gPSAhaXNPcGVuXCIgcG9pbnRlcj5cbiAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtZG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cImlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICA8c3BhbiAqbmdJZj1cIm5vZGVQcm9wZXJ0eVwiIGNsYXNzPVwiaXMtcHgtMlwiXG4gICAgICBbY2xhc3MuaGFzLXRleHQtZGFuZ2VyXT1cIm5vZGVQcm9wZXJ0eS5oYXNFcnJvclwiXG4gICAgICBbY2xhc3MuaGFzLXRleHQtd2FybmluZ109XCJub2RlUHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgPlxuICAgICAgPGhlLW5vZGUtaWNvbiBbdHlwZV09XCJub2RlUHJvcGVydHkuc2NoZW1hVHlwZVwiPjwvaGUtbm9kZS1pY29uPlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmIGlzT3BlbiAmJiBub2RlUHJvcGVydHlcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd05ld1Byb3BlcnR5OyBjb250ZXh0OiB7JGltcGxpY2l0OiBub2RlUHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNPcGVuXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGItMyBtYi0yXCIgKm5nSWY9XCJlcnJvcnNFZGl0YWJsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogbm9kZVByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCIgKm5nSWY9XCJub2RlUHJvcGVydHk/LmVycm9yXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eUVycm9yOyBjb250ZXh0OiB7cHJvcGVydHk6IG5vZGVQcm9wZXJ0eSwgZWRpdDogdHJ1ZX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbXVsdGlsaW5lXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc09wZW5cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eU1hcDsgY29udGV4dDogeyRpbXBsaWNpdDogbm9kZVByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48aGUtbWFwcy1kcmF3aW5nLWNvbmZpcm0gKm5nSWY9XCIhIW1hcERyYXdpbmdQcm9wZXJ0eVwiXG4gIFt2YWx1ZV09XCJtYXBEcmF3aW5nUHJvcGVydHkudmFsdWVcIiBbbW9kZXNdPVwibWFwRHJhd2luZ01vZGVzKG1hcERyYXdpbmdQcm9wZXJ0eSlcIlxuICAoY2xvc2VkKT1cIm9uTWFwRHJhd2luZ0Nsb3NlZCgkZXZlbnQpXCJcbj48L2hlLW1hcHMtZHJhd2luZy1jb25maXJtPlxuXG48aGUtYmlibGlvZ3JhcGhpZXMtc2VhcmNoLWNvbmZpcm0gKm5nSWY9XCIhIWJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHlcIlxuICBbc2VhcmNoXT1cImJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkudmFsdWVcIlxuICBbc2VhcmNoQnldPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkoYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSlcIlxuICBbc2VhcmNoU291cmNlc109XCJiaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXNcIlxuICAoY2xvc2VkKT1cIm9uQmlibGlvZ3JhcGhpZXNTZWFyY2hDbG9zZWQoJGV2ZW50KVwiXG4+PC9oZS1iaWJsaW9ncmFwaGllcy1zZWFyY2gtY29uZmlybT5cblxuPG5nLXRlbXBsYXRlICNsYWJlbERlc2NyaXB0aW9uIGxldC1wcm9wZXJ0eT5cbiAgPHNwYW5cbiAgICBjbGFzcz1cInRyaWdnZXItcG9wb3ZlclwiXG4gICAgW25nYlBvcG92ZXJdPVwicHJvcGVydHkuc2NoZW1hPy5kZXNjcmlwdGlvblwiIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICB0cmlnZ2Vycz1cImhvdmVyXCIgcGxhY2VtZW50PVwicmlnaHRcIiBjb250YWluZXI9XCJib2R5XCJcbiAgPlxuICAgIDxzcGFuPnt7cHJvcGVydHkua2V5fX08L3NwYW4+XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbGFiZWxEZWZhdWx0IGxldC1wcm9wZXJ0eT5cbiAgPHNwYW4+e3twcm9wZXJ0eS5rZXl9fTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2hvd1Byb3BlcnR5IGxldC1wcm9wZXJ0eT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihpc09wZW4gfHwgcHJvcGVydHkuY2xvc2VkVmlzaWJsZSkgJiYgIXByb3BlcnR5LmlzSGlkZGVuXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy02XCJcbiAgICAgIFtpZF09XCJwcm9wZXJ0eS5mdWxsS2V5ICsgJ18nICsgcHJvcGVydHkuaWRcIlxuICAgICAgW2NsYXNzLmlzLTEyXT1cInByb3BlcnR5LnByb3BlcnRpZXMubGVuZ3RoIHx8ICFwcm9wZXJ0eS5rZXlcIlxuICAgICAgW25nU3dpdGNoXT1cIiEhcHJvcGVydHkucHJvcGVydGllcy5sZW5ndGhcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW11bHRpbGluZSBpcy12YXJpYWJsZSBpcy0xXCIgKm5nU3dpdGNoQ2FzZT1cImZhbHNlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtMyBweS0xXCIgKm5nSWY9XCJwcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBoYXMtdGV4dC1yaWdodC10YWJsZXQgaGFzLXRleHQtZWxsaXBzaXNcIlxuICAgICAgICAgICAgKmJpbmRPbmNlPVwicHJvcGVydHlcIlxuICAgICAgICAgICAgW2Zvcl09XCJwcm9wZXJ0eS5pZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5LnNjaGVtYT8uZGVzY3JpcHRpb24gJiYgZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgPyBsYWJlbERlc2NyaXB0aW9uIDogbGFiZWxEZWZhdWx0OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtOSBweS0xXCIgW2NsYXNzLmlzLTEyXT1cIiFwcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEZvcm07IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGVkaXRhYmxlIHx8IGVycm9yc0VkaXRhYmxlKSAmJiAocHJvcGVydHkuaGFzRXJyb3IgfHwgcHJvcGVydHkuaGFzV2FybmluZylcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogcHJvcGVydHksIGVkaXQ6IGZhbHNlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbFwiICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCJcbiAgICAgICAgW2NsYXNzLmlzLWxpbmtdPVwiZXJyb3JNb2RlICYmIHByb3BlcnR5LmNoYW5nZWRcIlxuICAgICAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICAgIFtjbGFzcy5pcy1kZWZhdWx0XT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmICFwcm9wZXJ0eS5oYXNFcnJvciAmJiAhcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvcGVuLWdyb3VwIHBhbmVsLWhlYWRpbmcgcHktMFwiXG4gICAgICAgICAgKGNsaWNrKT1cInByb3BlcnR5LmlzT3BlbiA9ICFwcm9wZXJ0eS5pc09wZW5cIiBwb2ludGVyXG4gICAgICAgICAgW2NsYXNzLmlzLW9wZW5dPVwicHJvcGVydHkuaXNPcGVuXCJcbiAgICAgICAgICBbY2xhc3MuaGFzLXRleHQtd2hpdGVdPVwiKGVycm9yTW9kZSAmJiBwcm9wZXJ0eS5jaGFuZ2VkKSB8fCBwcm9wZXJ0eS5oYXNFcnJvciB8fCBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW1vYmlsZSBpcy12Y2VudGVyZWRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBweS0xIG15LTBcIj5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWRvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFwcm9wZXJ0eS5pc09wZW5cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwicHJvcGVydHkuaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4gcHktMSBteS0wXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtc2l6ZS02XCI+e3twcm9wZXJ0eS5rZXl9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvcGVydHkuc2NoZW1hVHlwZVwiIGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBweS0xIG15LTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWdzIG1iLTAgaGFzLWFkZG9uc1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIG1iLTAgaXMtbGlnaHRcIj5UeXBlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIG1iLTAgaXMtd2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxoZS1zY2hlbWEtdmVyc2lvbi1saW5rIGxpbmtDbGFzcz1cImlzLXNtYWxsXCIgW25vZGVdPVwieydAdHlwZSc6IHByb3BlcnR5LnNjaGVtYVR5cGV9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cHJvcGVydHkuc2NoZW1hVHlwZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9oZS1zY2hlbWEtdmVyc2lvbi1saW5rPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGhlLXBvcG92ZXItY29uZmlybSBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3cgcHktMSBteS0wIHB4LTBcIlxuICAgICAgICAgICAgICAqbmdJZj1cImVkaXRhYmxlICYmICFlcnJvcnNFZGl0YWJsZVwiXG4gICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJSZW1vdmUgZ3JvdXBcIiBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICBbbWVzc2FnZV09XCInPHA+VGhpcyB3aWxsIHJlbW92ZSB0aGUgZ3JvdXAgY29tcGxldGVseS48L3A+JyArIChwcm9wZXJ0eS5pc1JlcXVpcmVkID8gJzxwPjx1Pldhcm5pbmc6IHRoaXMgZmllbGQgaXMgcmVxdWlyZWQuPC91PjwvcD4nIDogJycpICsgJzxwPkRvIHlvdSBjb25maXJtPzwvcD4nXCJcbiAgICAgICAgICAgICAgcG9wb3ZlckNsYXNzPVwicHgtM1wiXG4gICAgICAgICAgICAgIChjb25maXJtZWQpPVwicHJvcGVydHlDaGFuZ2VkKG51bGwsIHByb3BlcnR5KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvaGUtcG9wb3Zlci1jb25maXJtPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJsb2NrIGlzLWJsb2NrIHAtMFwiICpuZ0lmPVwicHJvcGVydHkuaXNPcGVuXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicHJvcGVydHkuaXNBcnJheVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTMgcHQtNFwiICpuZ0lmPVwicHJvcGVydHkuZXJyb3JcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogcHJvcGVydHksIGVkaXQ6IHRydWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTNcIiAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoZWxwIHB5LTEgcHgtMlwiICpuZ0lmPVwiZWRpdGFibGUgJiYgIXByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgVG8gY2hhbmdlIHRoZSB7e3Byb3BlcnR5LmtleX19LCBwbGVhc2UgZGVsZXRlIGl0IGZpcnN0LCB0aGVuIGFkZCB0aGUgZmllbGQgYWdhaW5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwcm9wZXJ0eS5zY2hlbWE/LnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhlbHAgcHktMSBweC0yXCIgKm5nU3dpdGNoQ2FzZT1cIidCaWJsaW9ncmFwaHknXCI+XG4gICAgICAgICAgICAgICAgICAgIFNlYXJjaCBieSBUaXRsZSBvciBEb2N1bWVudCBET0kgdG8gYXV0by1wb3B1bGF0ZSB0aGUgZmllbGRzIHVzaW5nIHRoZSBNZW5kZWxleSBjYXRhbG9ndWVcbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dOZXdQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTMgbXQtMVwiICpuZ0lmPVwiZXJyb3JzRWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cCBweS0yIHB4LTMgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW11bHRpbGluZSBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMiBvZiBwcm9wZXJ0eS5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcDJ9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTIgcHgtMyBtdC0yXCIgKm5nU3dpdGNoQ2FzZT1cInRydWVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTFcIiAqbmdJZj1cImVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGVFcnJvckZvcm07IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMiBvZiBwcm9wZXJ0eS5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTAgbXktNFwiICpuZ0lmPVwicHJvcDIua2V5XCJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCJwcm9wMi5mdWxsS2V5ICsgJ18nICsgcHJvcDIuaWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1hcnJheS1udW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhZ3MgaGFzLWFkZG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWRhcmtcIj57e3Byb3AyLmtleX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiAhZXJyb3JzRWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWluZm9cIiBwb2ludGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkdXBsaWNhdGVBcnJheUdyb3VwKHByb3BlcnR5LCBwcm9wMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCInRHVwbGljYXRlICcgKyBwbHVyYWxpemUocHJvcGVydHkua2V5LCAxKVwiIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJjbG9uZVwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWxpZ2h0XCIgcG9pbnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb3AyLmtleSAhPT0gJzAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBcnJheUdyb3VwVXAocHJvcGVydHksIHByb3AyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJNb3ZlIFVwXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImxvbmctYXJyb3ctYWx0LXVwXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgaXMtbGlnaHRcIiBwb2ludGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvcDIua2V5ICE9PSBwcm9wZXJ0eS5wcm9wZXJ0aWVzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUFycmF5R3JvdXBEb3duKHByb3BlcnR5LCBwcm9wMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiTW92ZSBEb3duXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImxvbmctYXJyb3ctYWx0LWRvd25cIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aGUtcG9wb3Zlci1jb25maXJtIGNsYXNzPVwidGFnIGlzLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cIidSZW1vdmUgJyArIHBsdXJhbGl6ZShwcm9wZXJ0eS5rZXksIDEpXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1cIlRoaXMgd2lsbCByZW1vdmUgdGhlIGdyb3VwIGNvbXBsZXRlbHkuIERvIHlvdSBjb25maXJtP1wiIHBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlybWVkKT1cInJlbW92ZUFycmF5R3JvdXAocHJvcGVydHksIHByb3AyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9oZS1wb3BvdmVyLWNvbmZpcm0+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TmV3UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AyfVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNCBtdC0yXCIgKm5nSWY9XCJlcnJvcnNFZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcDJ9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgbXQtMlwiICpuZ0lmPVwicHJvcDIuZXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogcHJvcDIsIGVkaXQ6IHRydWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwIGNhcmQtY29udGVudCBwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbXVsdGlsaW5lIG15LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMyBvZiBwcm9wMi5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLWRhcmsgaXMtb3V0bGluZWQgaXMtc21hbGxcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImVkaXRhYmxlICYmICFlcnJvcnNFZGl0YWJsZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFycmF5R3JvdXAocHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJwbHVzLWNpcmNsZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIiBpMThuPVwiQEBhZGRcIj5BZGQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+e3twcm9wZXJ0eS5rZXkgfCBwbHVyYWxpemU6MX19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRGb3JtIGxldC1wcm9wZXJ0eT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5LmtleVwiPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInByb3BlcnR5LnN1Z2dlc3Rpb25zPy50eXBlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRTZWxlY3Q7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dElucHV0OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRJbnB1dCBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZCBtYi0wXCIgW2NsYXNzLmhhcy1hZGRvbnNdPVwiaGFzQWRkb25zKHByb3BlcnR5KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCJcbiAgICAgIFtjbGFzcy5oYXMtaWNvbnMtcmlnaHRdPVwicHJvcGVydHkubG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXQgaXMtc21hbGwgc2VhcmNoLWlucHV0XCJcbiAgICAgICAgW2NsYXNzLmlzLWRhcmtdPVwicHJvcGVydHkua2V5ID09PSAndHlwZSdcIlxuICAgICAgICBbY2xhc3MuaXMtbGlua109XCJlcnJvck1vZGUgJiYgcHJvcGVydHkuY2hhbmdlZFwiXG4gICAgICAgIFtjbGFzcy5pcy1kYW5nZXJdPVwiKCFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc0Vycm9yKSB8fCBpc1JlcXVpcmVkKHByb3BlcnR5KVwiXG4gICAgICAgIFtjbGFzcy5pcy13YXJuaW5nXT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuXG4gICAgICAgIFsobmdNb2RlbCldPVwicHJvcGVydHkudmFsdWVcIiAjcHJvcGVydHlNb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICBbdHlwZV09XCJwcm9wZXJ0eS5zY2hlbWE/LnR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiAnc3RyaW5nJ1wiXG4gICAgICAgIFtpZF09XCJwcm9wZXJ0eS5pZFwiXG4gICAgICAgIG5hbWU9XCJyYW5kb21uYW1lXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFlZGl0YWJsZSB8fCAhcHJvcGVydHkuZWRpdGFibGUgfHwgcHJvcGVydHkuc2NoZW1hPy5pbnRlcm5hbFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wZXJ0eS5wbGFjZWhvbGRlclwiXG4gICAgICAgIFthcHBUYWdzSW5wdXRdPVwie2VuYWJsZWQ6IGVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlICYmIHByb3BlcnR5LnNjaGVtYT8udHlwZSA9PT0gJ2FycmF5JywgaXRlbXM6IHByb3BlcnR5LnNjaGVtYT8uaXRlbXMsIGRlbGltaXRlcjogJzsnLCBhbGxvd0R1cGxpY2F0ZXM6IHRydWUsIHBsYWNlaG9sZGVyOiBwcm9wZXJ0eS5wbGFjZWhvbGRlcn1cIlxuICAgICAgICAoY2hhbmdlKT1cInByb3BlcnR5Q2hhbmdlZCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBwcm9wZXJ0eSlcIlxuXG4gICAgICAgIFtwYXR0ZXJuXT1cInByb3BlcnR5LnNjaGVtYT8ucGF0dGVyblwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJwcm9wZXJ0eS5mdWxsS2V5LmVuZHNXaXRoKCdpZCcpICYmIHByb3BlcnR5LmZ1bGxLZXkgIT09ICdpZCdcIlxuICAgICAgICBbbWluXT1cInByb3BlcnR5LnNjaGVtYT8ubWluaW11bVwiXG4gICAgICAgIFttYXhdPVwicHJvcGVydHkuc2NoZW1hPy5tYXhpbXVtXCJcblxuICAgICAgICBbbmdiVHlwZWFoZWFkXT1cInByb3BlcnR5U3VnZ2VzdChwcm9wZXJ0eS5mdWxsS2V5LCBwcm9wZXJ0eS5zdWdnZXN0aW9ucz8udHlwZSlcIlxuICAgICAgICBbcmVzdWx0VGVtcGxhdGVdPVwic3VnZ2VzdGlvblwiXG4gICAgICAgIFtpbnB1dEZvcm1hdHRlcl09XCJmb3JtYXR0ZXJcIlxuICAgICAgICBbZm9jdXNGaXJzdF09XCJ0cnVlXCJcbiAgICAgICAgKGZvY3VzKT1cImVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlICYmIHR5cGVhaGVhZEZvY3VzKCRldmVudClcIlxuICAgICAgICAoc2VsZWN0SXRlbSk9XCJzdWdnZXN0aW9uU2VsZWN0ZWQoJGV2ZW50Lml0ZW0sIHByb3BlcnR5KVwiXG4gICAgICA+XG5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbCBpcy1yaWdodCBoYXMtdGV4dC1ncmV5LWRhcmtcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFwcm9wZXJ0eS5sb2FkaW5nXCI+XG4gICAgICAgIDxmYS1pY29uIGljb249XCJzcGlubmVyXCIgW3B1bHNlXT1cInRydWVcIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0QWRkb25zOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxwIGNsYXNzPVwiaGVscCBpcy1kYW5nZXItbGlnaHRcIlxuICAgICpuZ0lmPVwiIXByb3BlcnR5Lmhhc0Vycm9yICYmIHByb3BlcnR5TW9kZWwuaW52YWxpZFwiXG4gID5cbiAgICA8c3BhbiAqYmluZE9uY2U9XCJwcm9wZXJ0eU1vZGVsLmVycm9yc1wiIFtpbm5lckhUTUxdPVwiZm9ybWF0UHJvcGVydHlFcnJvcihwcm9wZXJ0eU1vZGVsLmVycm9ycywgcHJvcGVydHkpXCI+PC9zcGFuPlxuICA8L3A+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2lucHV0U2VsZWN0IGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cImZpZWxkIG1iLTBcIiBbY2xhc3MuaGFzLWFkZG9uc109XCJoYXNBZGRvbnMocHJvcGVydHkpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2wgaXMtZXhwYW5kZWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QgaXMtc21hbGwgaXMtZnVsbHdpZHRoXCJcbiAgICAgICAgW2NsYXNzLmlzLWxpbmtdPVwiZXJyb3JNb2RlICYmIHByb3BlcnR5LmNoYW5nZWRcIlxuICAgICAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cIighcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNFcnJvcikgfHwgaXNSZXF1aXJlZChwcm9wZXJ0eSlcIlxuICAgICAgICBbY2xhc3MuaXMtd2FybmluZ109XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgID5cbiAgICAgICAgPHNlbGVjdFxuICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvcGVydHkudmFsdWVcIiAjcHJvcGVydHlNb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICAgIFtpZF09XCJwcm9wZXJ0eS5pZFwiXG4gICAgICAgICAgbmFtZT1cInJhbmRvbW5hbWVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGFibGUgfHwgIXByb3BlcnR5LmVkaXRhYmxlIHx8IHByb3BlcnR5LnNjaGVtYT8uaW50ZXJuYWxcIlxuICAgICAgICAgIChjaGFuZ2UpPVwicHJvcGVydHlDaGFuZ2VkKCRldmVudC50YXJnZXQudmFsdWUsIHByb3BlcnR5KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0PC9vcHRpb24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqYmluZE9uY2U9XCJwcm9wZXJ0eS5zdWdnZXN0aW9uc1wiPlxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgcHJvcGVydHkuc3VnZ2VzdGlvbnMudmFsdWVzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIiBbdmFsdWVdPVwidmFsdWVcIj57e3ZhbHVlfX08L29wdGlvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmVtb3ZlRmllbGRBZGRvbiBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCIhZXJyb3JzRWRpdGFibGUgJiYgIXByb3BlcnR5LmlzUmVxdWlyZWRcIj5cbiAgICA8YSBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiUmVtb3ZlIGZpZWxkXCJcbiAgICAgIFtjbGFzcy5pcy1vdXRsaW5lZF09XCIhcHJvcGVydHkuY2hhbmdlZCAmJiAocHJvcGVydHkuaGFzRXJyb3IgfHwgcHJvcGVydHkuaGFzV2FybmluZylcIlxuICAgICAgW2NsYXNzLmlzLWRhbmdlcl09XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNFcnJvclwiXG4gICAgICBbY2xhc3MuaXMtd2FybmluZ109XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHByb3BlcnR5Q2hhbmdlZChudWxsLCBwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiPjwvZmEtaWNvbj5cbiAgICA8L2E+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbnB1dEFkZG9ucyBsZXQtcHJvcGVydHk+XG4gIDxoZS1wb3BvdmVyLWNvbmZpcm0gY2xhc3M9XCJjb250cm9sXCJcbiAgICAqbmdJZj1cImVuYWJsZUFkZEVycm9yKHByb3BlcnR5KVwiXG4gICAgcG9zaXRpb249XCJsZWZ0XCJcbiAgICBbY29udGVudF09XCJwb3B1cEVycm9yRm9ybVwiXG4gICAgKGNvbmZpcm1lZCk9XCJhZGRFcnJvcihwcm9wZXJ0eSwgJGV2ZW50KVwiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiPlxuICAgICAgPGZhLWljb24gaWNvbj1cImNvbW1lbnRzXCI+PC9mYS1pY29uPlxuICAgIDwvc3Bhbj5cbiAgPC9oZS1wb3BvdmVyLWNvbmZpcm0+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicHJvcGVydHkuc2NoZW1hVHlwZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiU2NoZW1hVHlwZS5BY3RvclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0b3JBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJTY2hlbWFUeXBlLkN5Y2xlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjeWNsZUFkZG9uczsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpiaW5kT25jZT1cInByb3BlcnR5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwibWFwRHJhd2luZ01vZGVzKHByb3BlcnR5KS5sZW5ndGhcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiUGljayBvbiBNYXBcIlxuICAgICAgICAgIChjbGljayk9XCJtYXBEcmF3aW5nUHJvcGVydHkgPSBwcm9wZXJ0eVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwibWFwLW1hcmtlZC1hbHRcIj48L2ZhLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkocHJvcGVydHkpXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkFkdmFuY2VkIFNlYXJjaFwiXG4gICAgICAgICAgKGNsaWNrKT1cImJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkgPSBwcm9wZXJ0eVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwic2VhcmNoXCI+PC9mYS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlbW92ZUZpZWxkQWRkb247IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImFkZFByb3BlcnR5RW5hYmxlZChwcm9wZXJ0eSlcIj5cbiAgICA8YSBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1kYW5nZXJcIiB0aXRsZT1cIkFkZCBmaWVsZFwiXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBhZGRNaXNzaW5nUHJvcGVydHkocHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwicGx1cy1jaXJjbGVcIj48L2ZhLWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIiBpMThuPVwiQEBhZGRcIj5BZGQ8L3NwYW4+XG4gICAgPC9hPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImlzUmVxdWlyZWQocHJvcGVydHkpXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsIGlzLWRhbmdlclwiIFtmb3JdPVwicHJvcGVydHkuaWRcIlxuICAgICAgbmdiVG9vbHRpcD1cIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIiBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiPjwvZmEtaWNvbj5cbiAgICA8L2xhYmVsPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5LmV4dGVybmFsVXJsPy51cmxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGEgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICBbaHJlZl09XCJwcm9wZXJ0eS5leHRlcm5hbFVybC51cmwgKyAocHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsUGFyYW1WYWx1ZSA/IHByb3BlcnR5LnZhbHVlIDogJycpXCJcbiAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgW3RpdGxlXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLnRpdGxlXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieydpcy1kYXJrIGlzLW91dGxpbmVkJzogcHJvcGVydHkua2V5ID09PSAndHlwZSd9XCJcbiAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsUGFyYW1WYWx1ZSAmJiAhcHJvcGVydHkudmFsdWUgPyB0cnVlIDogbnVsbFwiXG4gICAgICA+XG4gICAgICAgIDxmYS1pY29uIFtpY29uXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLmljb24gfHwgJ2V4dGVybmFsLWxpbmstYWx0J1wiPjwvZmEtaWNvbj5cbiAgICAgIDwvYT5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1bml0Q29udmVydGVyRW5hYmxlZChwcm9wZXJ0eSlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiT3BlbiBjYWxjdWxhdG9yXCJcbiAgICAgICAgW25nYlBvcG92ZXJdPVwiY29udmVydFVuaXRzXCIgYXV0b0Nsb3NlPVwib3V0c2lkZVwiXG4gICAgICAgIHRyaWdnZXJzPVwibWFudWFsXCIgI3A9XCJuZ2JQb3BvdmVyXCIgcGxhY2VtZW50PVwiYm90dG9tXCIgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgIChjbGljayk9XCJvcGVuVW5pdENvbnZlcnRlcihwLCBwcm9wZXJ0eSlcIlxuICAgICAgPlxuICAgICAgICA8ZmEtaWNvbiBpY29uPVwiY2FsY3VsYXRvclwiPjwvZmEtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYWN0b3JBZGRvbnMgbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwicHJvcGVydHkua2V5ID09PSAnQGlkJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkFkZCBteXNlbGYgYXMgQWN0b3JcIlxuICAgICAgKGNsaWNrKT1cInNldFVzZXJBY3RvcklkKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gW2ljb25dPVwiWydmYXInLCAnaWQtYmFkZ2UnXVwiPjwvZmEtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2N5Y2xlQWRkb25zIGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cInByb3BlcnR5LmtleSA9PT0gJ2N5Y2xlRHVyYXRpb24nXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiQ2FsY3VsYXRlIHZhbHVlIGZyb20gc3RhcnREYXRlIGFuZCBlbmREYXRlXCJcbiAgICAgIChjbGljayk9XCJjYWxjdWxhdGVDeWNsZUR1cmF0aW9uKHByb3BlcnR5KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNhbGN1bGF0ZUN5Y2xlRHVyYXRpb25FbmFibGVkKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gaWNvbj1cImNhbGN1bGF0b3JcIj48L2ZhLWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwicHJvcGVydHkua2V5ID09PSAnc3RhcnREYXRlJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkNhbGN1bGF0ZSB2YWx1ZSBmcm9tIGVuZERhdGUgYW5kIGN5Y2xlRHVyYXRpb25cIlxuICAgICAgKGNsaWNrKT1cImNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHByb3BlcnR5KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlRW5hYmxlZChwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJjYWxjdWxhdG9yXCI+PC9mYS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2hvd05ld1Byb3BlcnR5IGxldC1wcm9wZXJ0eT5cbiAgPGhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCIgKm5nSWY9XCJlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZSAmJiAocHJvcGVydHkuYWRkUHJvcGVydHlFbmFibGVkIHx8IGRlZXBFZGl0YWJsZSk7IGVsc2UgcGFkZGVyXCI+XG4gICAgPGZvcm0gY2xhc3M9XCJweS0zIHB4LTQgaXMtZmxleC1ncm93LTFcIiAoc3VibWl0KT1cImFkZFByb3BlcnR5KHByb3BlcnR5KVwiIG5vdmFsaWRhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaXMtaG9yaXpvbnRhbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwgaXMtc21hbGxcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiIFtmb3JdPVwicHJvcGVydHkuaWQgKyAnX25ldydcIj5cbiAgICAgICAgICAgIDxzcGFuIGkxOG49XCJAQGZpbGVzLmZvcm0ubmV3UHJvcGVydHlcIj5BZGQgbmV3IGZpZWxkPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dCBpcy1zbWFsbFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS5uZXdQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgW2lkXT1cInByb3BlcnR5LmlkICsgJ19uZXcnXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwicmFuZG9tbmFtZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYW5kIHNlbGVjdCBmaWVsZCBmcm9tIHJlc3VsdHNcIlxuXG4gICAgICAgICAgICAgICAgW25nYlR5cGVhaGVhZF09XCJzdWdnZXN0TmV3UHJvcGVydHkocHJvcGVydHkuZnVsbEtleSlcIlxuICAgICAgICAgICAgICAgIFtyZXN1bHRUZW1wbGF0ZV09XCJzdWdnZXN0aW9uXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRGb3JtYXR0ZXJdPVwiZm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICBbZm9jdXNGaXJzdF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2VkaXRhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAoZm9jdXMpPVwidHlwZWFoZWFkRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhcHJvcGVydHkubmV3UHJvcGVydHkgfHwgIXByb3BlcnR5Lm5ld1Byb3BlcnR5Lm5hbWVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXNcIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCIgaTE4bj1cIkBAYWRkXCI+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9oZWFkZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5RXJyb3IgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtZWRpdD1cImVkaXRcIj5cbiAgPHAgY2xhc3M9XCJoZWxwXCJcbiAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cInByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICBbY2xhc3MuaXMtd2FybmluZ109XCJwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAqbmdJZj1cInByb3BlcnR5LmVycm9yXCJcbiAgPlxuICAgIDxzcGFuIGNsYXNzPVwiaXMtcHJlLXdyYXBcIiAqYmluZE9uY2U9XCJwcm9wZXJ0eS5lcnJvclwiIFtpbm5lckhUTUxdPVwicHJvcGVydHkuZXJyb3IubWVzc2FnZVwiPjwvc3Bhbj5cbiAgICA8YSBjbGFzcz1cInBsLTJcIlxuICAgICAgKm5nSWY9XCJlZGl0ICYmIGVycm9yc0VkaXRhYmxlICYmIHByb3BlcnR5LmVycm9yLmluZGV4ID49IDBcIlxuICAgICAgKGNsaWNrKT1cImVkaXRFcnJvcihwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGNsYXNzPVwicHItMlwiIGljb249XCJlZGl0XCI+PC9mYS1pY29uPlxuICAgICAgPHNwYW4gaTE4bj1cIkBAZWRpdFwiPkVkaXQ8L3NwYW4+XG4gICAgPC9hPlxuICAgIDxhIGNsYXNzPVwicGwtMlwiXG4gICAgICAqbmdJZj1cIihwcm9wZXJ0eS5oYXNXYXJuaW5nIHx8IGVycm9yc0VkaXRhYmxlKSAmJiBwcm9wZXJ0eS5lcnJvci5pbmRleCA+PSAwXCJcbiAgICAgIChjbGljayk9XCJyZXNvbHZlRXJyb3IocHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBjbGFzcz1cInByLTJcIiBpY29uPVwiY2hlY2tcIj48L2ZhLWljb24+XG4gICAgICA8c3BhbiBpMThuPVwiQEByZXNvbHZlZFwiPlJlc29sdmVkPC9zcGFuPlxuICAgIDwvYT5cbiAgPC9wPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwcm9wZXJ0eU1hcCBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJwYW5lbCBpcy1kZWZhdWx0XCIgKm5nSWY9XCJzaG93TWFwXCI+XG4gICAgPGRpdiBjbGFzcz1cIm9wZW4tZ3JvdXAgcGFuZWwtaGVhZGluZyBweS0wXCJcbiAgICAgIChjbGljayk9XCJtYXBWaXNpYmxlID0gIW1hcFZpc2libGVcIiBwb2ludGVyXG4gICAgICBbY2xhc3MuaXMtb3Blbl09XCJtYXBWaXNpYmxlXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tb2JpbGUgaXMtdmNlbnRlcmVkIG1iLTBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93IHB5LTEgbXktMFwiPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhbWFwVmlzaWJsZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIm1hcFZpc2libGVcIj48L2ZhLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4gcHktMSBteS0wXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1zaXplLTZcIj5WaWV3IG9uIE1hcDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWJsb2NrIGlzLWJsb2NrIHAtMFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIW1hcFZpc2libGVcIj5cbiAgICAgIDxoZS1zaXRlcy1tYXBzIFtzaXRlc109XCJbbm9kZV1cIiBbc2hvd05vdGljZV09XCJmYWxzZVwiPjwvaGUtc2l0ZXMtbWFwcz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vZGVFcnJvckZvcm0gbGV0LXByb3BlcnR5PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvcGVydHkubmV3RXJyb3IgJiYgcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9uc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zbWFsbFwiPlxuICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS5uZXdFcnJvci5sZXZlbFwiPlxuICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidW5kZWZpbmVkXCI+U2VsZWN0IExldmVsPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXJyb3JcIj5FcnJvcjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIndhcm5pbmdcIj5XYXJuaW5nPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ0ZXh0YXJlYSBpcy1zbWFsbFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS5uZXdFcnJvci5tZXNzYWdlXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgbWVzc2FnZSBoZXJlXCJcbiAgICAgICAgICByb3dzPVwiMVwiXG4gICAgICAgID48L3RleHRhcmVhPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXByb3BlcnR5Lm5ld0Vycm9yLmxldmVsIHx8ICFwcm9wZXJ0eS5uZXdFcnJvci5tZXNzYWdlXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkRXJyb3IocHJvcGVydHksIHByb3BlcnR5Lm5ld0Vycm9yKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwicGx1cy1jaXJjbGVcIj48L2ZhLWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCIgaTE4bj1cIkBAYWRkXCI+QWRkPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcG9wdXBFcnJvckZvcm0gbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cbiAgICAgICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cImRhdGEubGV2ZWxcIj5cbiAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ1bmRlZmluZWRcIj5TZWxlY3QgTGV2ZWw8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXJyb3JcIj5FcnJvcjwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3YXJuaW5nXCI+V2FybmluZzwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiXG4gICAgICAgIFsobmdNb2RlbCldPVwiZGF0YS5tZXNzYWdlXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIG1lc3NhZ2UgaGVyZVwiXG4gICAgICA+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzdWdnZXN0aW9uIGxldC1yPVwicmVzdWx0XCIgbGV0LXQ9XCJ0ZXJtXCI+XG4gIDxuZ2ItaGlnaGxpZ2h0XG4gICAgW3RpdGxlXT1cInIuYmlibGlvZ3JhcGh5Py50aXRsZSB8fCByLmJpYmxpb2dyYXBoeT8uZG9jdW1lbnRET0kgfHwgci5iaWJsaW9ncmFwaHk/LnNjb3B1cyB8fCByLm5hbWVcIlxuICAgIFtyZXN1bHRdPVwici5iaWJsaW9ncmFwaHk/LnRpdGxlIHx8IHIuYmlibGlvZ3JhcGh5Py5kb2N1bWVudERPSSB8fCByLmJpYmxpb2dyYXBoeT8uc2NvcHVzIHx8IHIubmFtZVwiXG4gICAgW3Rlcm1dPVwidFwiXG4gID48L25nYi1oaWdobGlnaHQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3BhZGRlcj5cbiAgPGRpdiBjbGFzcz1cInB0LTFcIj48L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29udmVydFVuaXRzIGxldC12YWx1ZT1cInZhbHVlXCIgbGV0LXRlcm09XCJ0ZXJtXCIgbGV0LXVuaXRzPVwidW5pdHNcIj5cbiAgPGhlLXVuaXQtY29udmVydGVyIFt2YWx1ZV09XCJ2YWx1ZVwiIFt0ZXJtXT1cInRlcm1cIiBbdG9Vbml0c109XCJ1bml0c1wiPjwvaGUtdW5pdC1jb252ZXJ0ZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
|