@hestia-earth/ui-components 0.0.31 → 0.0.32

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.
@@ -10,7 +10,7 @@ import { isEmpty } from '@hestia-earth/utils';
10
10
  import { formatPropertyError, propertyError, hasError, hasWarning, defaultSuggestionType, recursiveProperties, typeToNewProperty, propertyId, isAddPropertyEnabled, nodeAvailableProperties, sortProperties, groupChanged, parentProperty, siblingProperty, updateProperties, refreshPropertyKeys, keyToDataPath, findProperty, calculateCycleDurationEnabled, calculateCycleDuration, calculateCycleStartDateEnabled, calculateCycleStartDate, parseNewValue } from '../files-form.model';
11
11
  import { errorHasError, errorHasWarning, filterError, formatError } from '../files-error.model';
12
12
  import { matchType, matchPhraseQuery, matchPhrasePrefixQuery, matchBoolPrefixQuery } from '../../search/search.model';
13
- import { safeJSONParse } from '../../common/utils';
13
+ import { safeJSONParse, copyObject } from '../../common/utils';
14
14
  import * as i0 from "@angular/core";
15
15
  import * as i1 from "../../search/search.service";
16
16
  import * as i2 from "../../users/users.service";
@@ -20,15 +20,17 @@ import * as i5 from "../../common/maps-drawing-confirm/maps-drawing-confirm.comp
20
20
  import * as i6 from "../../bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component";
21
21
  import * as i7 from "../../common/schema-version-link/schema-version-link.component";
22
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";
23
+ import * as i9 from "../../node/node-recommendations/node-recommendations.component";
24
+ import * as i10 from "../../sites/sites-maps/sites-maps.component";
25
+ import * as i11 from "@ng-bootstrap/ng-bootstrap";
26
+ import * as i12 from "../../common/unit-converter/unit-converter.component";
27
+ import * as i13 from "@angular/common";
28
+ import * as i14 from "../../common/bind-once.directive";
29
+ import * as i15 from "@angular/forms";
30
+ import * as i16 from "../../common/tags-input.directive";
31
+ import * as i17 from "../../common/pluralize.pipe";
31
32
  const get = require('lodash.get');
33
+ const set = require('lodash.set');
32
34
  const MIN_TYPEAHEAD_LENGTH = 2;
33
35
  const populateTermFields = [
34
36
  'termType', 'units'
@@ -43,6 +45,12 @@ const formatSuggestion = (_a) => {
43
45
  };
44
46
  const formatLinkNodesPrefix = 'Link with';
45
47
  const formatLinkNodesSuggestions = (nodeMap, type) => (nodeMap[type] || []).map(id => ({ type, id, name: `${formatLinkNodesPrefix} ${type}: ${id}` }));
48
+ const insertProperty = (properties, key, property) => {
49
+ const existingPropertyIndex = properties.findIndex(v => v.fullKey === key);
50
+ existingPropertyIndex >= 0 ? (properties[existingPropertyIndex] = property) : properties.push(property);
51
+ properties.sort(sortProperties);
52
+ return properties;
53
+ };
46
54
  export class FilesFormComponent {
47
55
  constructor(ref, searchService, usersService) {
48
56
  this.ref = ref;
@@ -322,6 +330,11 @@ export class FilesFormComponent {
322
330
  if ((_a = newValue === null || newValue === void 0 ? void 0 : newValue.id) === null || _a === void 0 ? void 0 : _a.startsWith(formatLinkNodesPrefix)) {
323
331
  newValue.id = newValue.id.split(':')[1].trim();
324
332
  }
333
+ // trigger refresh of node
334
+ const node = copyObject(this.node);
335
+ set(node, property.fullKey, newValue);
336
+ this.node = node;
337
+ // trigger for listeners
325
338
  this.nodeChange.emit({ key: property.fullKey, value: newValue });
326
339
  }
327
340
  addDefaultProperty(property, key, def) {
@@ -329,9 +342,7 @@ export class FilesFormComponent {
329
342
  const fullKey = property.key ? `${property.fullKey}.${key}` : key;
330
343
  const properties = property.key ? property.properties : this.properties;
331
344
  const newProperty = typeToNewProperty(this.schemas, def, this.schemas[property.schemaType], node, fullKey);
332
- const existingPropertyIndex = properties.findIndex(v => v.fullKey === fullKey);
333
- existingPropertyIndex >= 0 ? (properties[existingPropertyIndex] = newProperty) : properties.push(newProperty);
334
- properties.sort(sortProperties);
345
+ insertProperty(properties, fullKey, newProperty);
335
346
  return this.propertyChanged(newProperty.value, newProperty);
336
347
  }
337
348
  addMissingProperty(property) {
@@ -435,9 +446,31 @@ export class FilesFormComponent {
435
446
  const units = term === null || term === void 0 ? void 0 : term.units;
436
447
  return popover.isOpen() ? popover.close() : popover.open({ value, term, units });
437
448
  }
449
+ // Recommendations
450
+ onSelectRecommendation(array, id) {
451
+ const prop = this.schemas[array.schemaType];
452
+ const value = get(this.node, array.fullKey);
453
+ const newProperty = typeToNewProperty(this.schemas, prop, prop, value, `${array.fullKey}[${array.properties.length}]`);
454
+ newProperty.value.term = { type: NodeType.Term, '@id': id };
455
+ value[array.properties.length].term = { type: NodeType.Term, '@id': id };
456
+ // insert Term with @id
457
+ const termKey = `${newProperty.fullKey}.term`;
458
+ const termProperty = newProperty.properties.find(p => p.key === 'term') || typeToNewProperty(this.schemas, prop.properties.term, prop, newProperty.value, termKey);
459
+ termProperty.value = { type: NodeType.Term, '@id': id };
460
+ termProperty.properties = recursiveProperties(this.schemas, [], this.schemas[this.node.type], this.deepEditable, termKey)({ type: NodeType.Term, '@id': id });
461
+ insertProperty(newProperty.properties, termKey, termProperty);
462
+ // term cannot be edited, need to remove first
463
+ updateProperties(termProperty, p => {
464
+ p.editable = false;
465
+ return p;
466
+ });
467
+ termProperty.editable = false;
468
+ array.properties.push(newProperty);
469
+ return this.propertyChanged(value, array);
470
+ }
438
471
  }
439
472
  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 });
440
- 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", showSuggestedDefaultProperties: "showSuggestedDefaultProperties" }, 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\">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\">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>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\">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>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>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\">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", "selected", "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 } });
473
+ 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", showSuggestedDefaultProperties: "showSuggestedDefaultProperties" }, 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\n <ng-content></ng-content>\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\">Add</span>\n <span class=\"pl-1\">{{property.key | pluralize:1}}</span>\n </button>\n\n <app-node-recommendations buttonClass=\"is-dark is-outlined is-small\"\n [node]=\"node\" [nodeField]=\"property.key\"\n (selectRecommendation)=\"onSelectRecommendation(property, $event)\"\n ></app-node-recommendations>\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\">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>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\">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>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>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\">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.NodeRecommendationsComponent, selector: "app-node-recommendations", inputs: ["node", "nodeField", "buttonClass"], outputs: ["selectRecommendation"] }, { type: i10.SitesMapsComponent, selector: "he-sites-maps", inputs: ["loadPolygons", "sites", "selected", "nodes", "center", "zoom", "showNotice"] }, { type: i11.NgbHighlight, selector: "ngb-highlight", inputs: ["highlightClass", "result", "term"] }, { type: i12.UnitConverterComponent, selector: "he-unit-converter", inputs: ["term", "value", "fromUnits", "toUnits"] }], directives: [{ type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { type: i13.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i13.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i14.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { type: i11.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i13.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i15.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: i11.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "placement", "container", "editable", "focusFirst", "showHint", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i16.TagsInputDirective, selector: "[appTagsInput]", inputs: ["appTagsInput"] }, { type: i15.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i15.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i15.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i15.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i15.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i15.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i15.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i15.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], pipes: { "pluralize": i17.PluralizePipe } });
441
474
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FilesFormComponent, decorators: [{
442
475
  type: Component,
443
476
  args: [{
@@ -470,4 +503,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
470
503
  }], nodeErrorAdded: [{
471
504
  type: Output
472
505
  }] } });
473
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZm9ybS9maWxlcy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy1mb3JtL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRyxPQUFPLEtBQUssU0FBUyxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsT0FBTyxFQUFzQixVQUFVLEVBQUUsUUFBUSxFQUFrQyxNQUFNLHNCQUFzQixDQUFDO0FBRWhILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxPQUFPLEVBRUwsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQ3hDLHFCQUFxQixFQUNyQyxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQ2xELG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLGNBQWMsRUFDN0QsWUFBWSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFDakgsNkJBQTZCLEVBQUUsc0JBQXNCLEVBQ3JELDhCQUE4QixFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFDdkUsTUFBTSxxQkFB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RSxNQUFNO3NCQURiLEtBQUs7Z0JBR0MsSUFBSTtzQkFEVixLQUFLO2dCQUdDLE9BQU87c0JBRGIsS0FBSztnQkFNQyxRQUFRO3NCQURkLEtBQUs7Z0JBR0MsU0FBUztzQkFEZixLQUFLO2dCQUdDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBTUMsY0FBYztzQkFEcEIsS0FBSztnQkFPQyw4QkFBOEI7c0JBRHBDLEtBQUs7Z0JBSUUsVUFBVTtzQkFEakIsTUFBTTtnQkFHQyxpQkFBaUI7c0JBRHhCLE1BQU07Z0JBR0MsY0FBYztzQkFEckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIG1lcmdlTWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCAqIGFzIHBsdXJhbGl6ZSBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0IHsgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5jb25zdCBnZXQgPSByZXF1aXJlKCdsb2Rhc2guZ2V0Jyk7XG5pbXBvcnQgeyBKU09OIGFzIEhlc3RpYUpzb24sIFNjaGVtYVR5cGUsIE5vZGVUeXBlLCBCaWJsaW9ncmFwaHksIFNvdXJjZSwgUHJvcGVydHkgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBkZWZpbml0aW9ucywgZGVmaW5pdGlvbiB9IGZyb20gJ0BoZXN0aWEtZWFydGgvanNvbi1zY2hlbWEnO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvdXRpbHMnO1xuXG5pbXBvcnQge1xuICBJRXJyb3JQcm9wZXJ0eSwgSU5vZGVQcm9wZXJ0eSxcbiAgZm9ybWF0UHJvcGVydHlFcnJvciwgcHJvcGVydHlFcnJvciwgaGFzRXJyb3IsIGhhc1dhcm5pbmcsXG4gIHN1Z2dlc3Rpb25UeXBlLCBkZWZhdWx0U3VnZ2VzdGlvblR5cGUsXG4gIHJlY3Vyc2l2ZVByb3BlcnRpZXMsIHR5cGVUb05ld1Byb3BlcnR5LCBwcm9wZXJ0eUlkLFxuICBpc0FkZFByb3BlcnR5RW5hYmxlZCwgbm9kZUF2YWlsYWJsZVByb3BlcnRpZXMsIHNvcnRQcm9wZXJ0aWVzLFxuICBncm91cENoYW5nZWQsIHBhcmVudFByb3BlcnR5LCBzaWJsaW5nUHJvcGVydHksIHVwZGF0ZVByb3BlcnRpZXMsIHJlZnJlc2hQcm9wZXJ0eUtleXMsIGtleVRvRGF0YVBhdGgsIGZpbmRQcm9wZXJ0eSxcbiAgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQsIGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb24sXG4gIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlRW5hYmxlZCwgY2FsY3VsYXRlQ3ljbGVTdGFydERhdGUsIHBhcnNlTmV3VmFsdWVcbn0gZnJvbSAnLi4vZmlsZXMtZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBJVmFsaWRhdGlvbkVycm9yLCBlcnJvckhhc0Vycm9yLCBlcnJvckhhc1dhcm5pbmcsIGZpbHRlckVycm9yLCBmb3JtYXRFcnJvciB9IGZyb20gJy4uL2ZpbGVzLWVycm9yLm1vZGVsJztcbmltcG9ydCB7IEhlVXNlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXNlcnMvdXNlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBIZVNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWF0Y2hUeXBlLCBtYXRjaFBocmFzZVF1ZXJ5LCBtYXRjaFBocmFzZVByZWZpeFF1ZXJ5LCBtYXRjaEJvb2xQcmVmaXhRdWVyeSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2gubW9kZWwnO1xuaW1wb3J0IHsgc2FmZUpTT05QYXJzZSB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5cbmNvbnN0IE1JTl9UWVBFQUhFQURfTEVOR1RIID0gMjtcbmNvbnN0IHBvcHVsYXRlVGVybUZpZWxkcyA9IFtcbiAgJ3Rlcm1UeXBlJywgJ3VuaXRzJ1xuXTtcbmNvbnN0IHBvcHVsYXRlVGVybURlZmF1bHRQcm9wZXJ0aWVzID0gW1xuICAnZGVmYXVsdFByb3BlcnRpZXMudGVybS5uYW1lJywgJ2RlZmF1bHRQcm9wZXJ0aWVzLnRlcm0udW5pdHMnLCAnZGVmYXVsdFByb3BlcnRpZXMudmFsdWUnXG5dO1xuXG5jb25zdCBmb3JtYXRQcm9wZXJ0eSA9IChwcm9wOiBQcm9wZXJ0eSkgPT4gKHtcbiAgJ0B0eXBlJzogU2NoZW1hVHlwZS5Qcm9wZXJ0eSxcbiAgLi4ucHJvcCxcbiAgdGVybToge1xuICAgICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sXG4gICAgLi4ucHJvcC50ZXJtXG4gIH1cbn0pO1xuXG5jb25zdCBmb3JtYXRTdWdnZXN0aW9uID0gKHsgZGVmYXVsdFByb3BlcnRpZXMsIC4uLm5vZGUgfTogYW55KSA9PiAoe1xuICAuLi5ub2RlLFxuICAuLi4oZGVmYXVsdFByb3BlcnRpZXM/Lmxlbmd0aCA/IHsgZGVmYXVsdFByb3BlcnRpZXM6IGRlZmF1bHRQcm9wZXJ0aWVzLm1hcChmb3JtYXRQcm9wZXJ0eSkgfSA6IHt9KVxufSk7XG5cbmNvbnN0IGZvcm1hdExpbmtOb2Rlc1ByZWZpeCA9ICdMaW5rIHdpdGgnO1xuXG5jb25zdCBmb3JtYXRMaW5rTm9kZXNTdWdnZXN0aW9ucyA9IChub2RlTWFwOiB7IFt0eXBlIGluIE5vZGVUeXBlXT86IHN0cmluZ1tdIH0sIHR5cGU6IE5vZGVUeXBlKSA9PlxuICAobm9kZU1hcFt0eXBlXSB8fCBbXSkubWFwKGlkID0+ICh7IHR5cGUsIGlkLCBuYW1lOiBgJHtmb3JtYXRMaW5rTm9kZXNQcmVmaXh9ICR7dHlwZX06ICR7aWR9YCB9KSk7XG5cbnR5cGUgc3VnZ2VzdEZ1bmMgPSAodGVybTogc3RyaW5nLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4gT2JzZXJ2YWJsZTxhbnlbXT47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLWZpbGVzLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGVzLWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlc0Zvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBwcml2YXRlIHNjaGVtYXM/OiBkZWZpbml0aW9ucztcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBlcnJvcnM6IElWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xuICBASW5wdXQoKVxuICBwdWJsaWMgbm9kZT86IEhlc3RpYUpzb248U2NoZW1hVHlwZT47XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBub2RlTWFwOiB7IFt0eXBlIGluIE5vZGVUeXBlXT86IHN0cmluZ1tdIH0gPSB7fTtcbiAgLyoqXG4gICAqIEFsbG93IGVkaXRpbmcgbm9kZXMgKGBmYWxzZWAgZm9yIHJlYWRvbmx5KS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlZGl0YWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZXJyb3JNb2RlID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkZWVwRWRpdGFibGUgPSB0cnVlO1xuICAvKipcbiAgICogQ2FuIGVkaXQgZXJyb3JzLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yc0VkaXRhYmxlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBXaGVuIHNlbGVjdGluZyB0ZXJtcywgd2lsbCBzaG93IGRlZmF1bHQgcHJvcGVydGllcyBvciBub3QuXG4gICAqIFNob3VsZCBiZSBgZmFsc2VgIHdoZW4gdXNpbmcgc2NoZW1hIHZhbGlkYXRpb24sIGFzIG9ubHkgdGhlIGBuYW1lYCB3b3VsZCBiZSBhZGRlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93U3VnZ2VzdGVkRGVmYXVsdFByb3BlcnRpZXMgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKVxuICBwcml2YXRlIG5vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpXG4gIHByaXZhdGUgbm9kZUVyb3JyUmVzb2x2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpXG4gIHByaXZhdGUgbm9kZUVycm9yQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElWYWxpZGF0aW9uRXJyb3I+KCk7XG5cbiAgcHVibGljIE5vZGVUeXBlID0gTm9kZVR5cGU7XG4gIHB1YmxpYyBTY2hlbWFUeXBlID0gU2NoZW1hVHlwZTtcbiAgcHVibGljIGlzT3BlbiA9IHRydWU7XG4gIHB1YmxpYyBtYXBWaXNpYmxlID0gZmFsc2U7XG4gIHB1YmxpYyBwbHVyYWxpemUgPSBwbHVyYWxpemU7XG4gIHB1YmxpYyBmb3JtYXRQcm9wZXJ0eUVycm9yID0gZm9ybWF0UHJvcGVydHlFcnJvcjtcbiAgcHVibGljIG1hcERyYXdpbmdQcm9wZXJ0eT86IElOb2RlUHJvcGVydHk7XG4gIHB1YmxpYyBiaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5PzogSU5vZGVQcm9wZXJ0eTtcbiAgcHVibGljIG5vZGVQcm9wZXJ0eT86IElOb2RlUHJvcGVydHk7XG4gIHB1YmxpYyBwcm9wZXJ0aWVzOiBJTm9kZVByb3BlcnR5W10gPSBbXTtcblxuICBwdWJsaWMgZm9ybWF0dGVyID0gKHZhbHVlOiBhbnkpID0+XG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/ICgnYmlibGlvZ3JhcGh5JyBpbiB2YWx1ZSA/IHZhbHVlLmJpYmxpb2dyYXBoeT8udGl0bGUgOiB2YWx1ZS5uYW1lKSA6IHZhbHVlO1xuXG4gIHB1YmxpYyBzdWdnZXN0TmV3UHJvcGVydHkgPSAoZnVsbEtleTogc3RyaW5nKSA9PiAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cbiAgICB0ZXh0JC5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgdGVybSA9PiBvZih0aGlzLm5ld1Byb3BlcnRpZXMoZmluZFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgZnVsbEtleSkgfHwgdGhpcy5ub2RlUHJvcGVydHksIHRlcm0pKVxuICAgICAgKVxuICAgICk7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0RXhpc3RpbmdOb2RlID0gKHR5cGU6IE5vZGVUeXBlLCB0ZXJtOiBzdHJpbmcsIHVuaXF1ZUtleSA9ICdAaWQnKSA9PlxuICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgb2YoW10pIDpcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdWdnZXN0KHRlcm0sIHR5cGUsIFtdLCB7XG4gICAgICAgIGJvb2w6IHtcbiAgICAgICAgICBtdXN0OiBbbWF0Y2hUeXBlKHR5cGUpXSxcbiAgICAgICAgICBzaG91bGQ6IFtcbiAgICAgICAgICAgIG1hdGNoUGhyYXNlUXVlcnkodGVybSwgMTAwLCB1bmlxdWVLZXkpLFxuICAgICAgICAgICAgbWF0Y2hQaHJhc2VQcmVmaXhRdWVyeSh0ZXJtLCAyMCwgdW5pcXVlS2V5KSxcbiAgICAgICAgICAgIG1hdGNoQm9vbFByZWZpeFF1ZXJ5KHRlcm0sIDEwLCB1bmlxdWVLZXkpXG4gICAgICAgICAgXSxcbiAgICAgICAgICBtaW5pbXVtX3Nob3VsZF9tYXRjaDogMVxuICAgICAgICB9XG4gICAgICB9LCA1LCB0aGlzLnN1Z2dlc3RUZXJtRmllbGRzKTtcblxuICBwcml2YXRlIHN1Z2dlc3ROb2RlID0gKHR5cGU6IE5vZGVUeXBlLCBzdWdnZXN0RGVmYXVsdD86IHN1Z2dlc3RGdW5jKSA9PiAodGVybTogc3RyaW5nLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT5cbiAgICAocHJvcGVydHkuc3VnZ2VzdGlvbnM/LmlzVW5pcXVlS2V5ID8gKFxuICAgICAgdGhpcy5zdWdnZXN0RXhpc3RpbmdOb2RlKHR5cGUsIHRlcm0sIHByb3BlcnR5LnN1Z2dlc3Rpb25zLmlzVW5pcXVlS2V5KVxuICAgICkgOiAoXG4gICAgICBwcm9wZXJ0eS5zdWdnZXN0aW9ucz8uaXNMaW5rTm9kZSA/XG4gICAgICAgIG9mKGZvcm1hdExpbmtOb2Rlc1N1Z2dlc3Rpb25zKHRoaXMubm9kZU1hcCwgdHlwZSkpIDogKFxuICAgICAgICAgIHN1Z2dlc3REZWZhdWx0ID8gc3VnZ2VzdERlZmF1bHQodGVybSwgcHJvcGVydHkpIDogb2YoW10pXG4gICAgICAgIClcbiAgICApKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLm1hcChmb3JtYXRTdWdnZXN0aW9uKSlcbiAgICApO1xuXG4gIHByaXZhdGUgc3VnZ2VzdGVyOiB7XG4gICAgW3R5cGUgaW4gc3VnZ2VzdGlvblR5cGVdPzogc3VnZ2VzdEZ1bmM7XG4gIH0gPSB7XG4gICAgZGVmYXVsdDogKHRlcm0sIHByb3BlcnR5KSA9PiBvZihcbiAgICAgIChwcm9wZXJ0eT8uc3VnZ2VzdGlvbnM/LnZhbHVlcyB8fCBbXSlcbiAgICAgICAgLm1hcCh2ID0+IGAke3Z9YClcbiAgICAgICAgLmZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAubWFwKG5hbWUgPT4gKHsgbmFtZSB9KSlcbiAgICApLFxuICAgIFtOb2RlVHlwZS5BY3Rvcl06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuQWN0b3IpLFxuICAgIFtOb2RlVHlwZS5DeWNsZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuQ3ljbGUpLFxuICAgIFtOb2RlVHlwZS5JbXBhY3RBc3Nlc3NtZW50XTogdGhpcy5zdWdnZXN0Tm9kZShOb2RlVHlwZS5JbXBhY3RBc3Nlc3NtZW50KSxcbiAgICBbTm9kZVR5cGUuT3JnYW5pc2F0aW9uXTogdGhpcy5zdWdnZXN0Tm9kZShOb2RlVHlwZS5PcmdhbmlzYXRpb24pLFxuICAgIFtOb2RlVHlwZS5TaXRlXTogdGhpcy5zdWdnZXN0Tm9kZShOb2RlVHlwZS5TaXRlKSxcbiAgICBbTm9kZVR5cGUuU291cmNlXTogdGhpcy5zdWdnZXN0Tm9kZShOb2RlVHlwZS5Tb3VyY2UsICh0ZXJtLCB7IGtleSB9KSA9PlxuICAgICAgdGVybS5sZW5ndGggPCBNSU5fVFlQRUFIRUFEX0xFTkdUSCA/XG4gICAgICAgIG9mKFtdKSA6XG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdWdnZXN0U291cmNlKHRlcm0sIDUsIFtgYmlibGlvZ3JhcGh5LiR7a2V5fWBdLCBbYGJpYmxpb2dyYXBoeS4ke2tleX1gXSlcbiAgICApLFxuICAgIFtOb2RlVHlwZS5UZXJtXTogdGhpcy5zdWdnZXN0Tm9kZShOb2RlVHlwZS5UZXJtLCAodGVybSwgeyBzdWdnZXN0aW9ucyB9KSA9PlxuICAgICAgdGVybS5sZW5ndGggPCBNSU5fVFlQRUFIRUFEX0xFTkdUSCA/XG4gICAgICAgIG9mKFtdKSA6XG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdWdnZXN0KHRlcm0sIE5vZGVUeXBlLlRlcm0sIHN1Z2dlc3Rpb25zPy5xdWVyaWVzIHx8IFtdLCBudWxsLCA1LCB0aGlzLnN1Z2dlc3RUZXJtRmllbGRzKVxuICAgIClcbiAgfTtcbiAgcHVibGljIHByb3BlcnR5U3VnZ2VzdCA9IChmdWxsS2V5OiBzdHJpbmcsIHN1Z2dlc3RUeXBlOiBzdWdnZXN0aW9uVHlwZSkgPT4gKHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4pID0+XG4gICAgdGV4dCQucGlwZShcbiAgICAgIGRlYm91bmNlVGltZShzdWdnZXN0VHlwZSA9PT0gZGVmYXVsdFN1Z2dlc3Rpb25UeXBlID8gMCA6IDMwMCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgbWVyZ2VNYXAodGVybSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gZmluZFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgZnVsbEtleSk7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eT8uZWRpdGFibGUgJiYgc3VnZ2VzdFR5cGUgaW4gdGhpcy5zdWdnZXN0ZXIgP1xuICAgICAgICAgIG9mKHRlcm0pLnBpcGUoXG4gICAgICAgICAgICB0YXAoKCkgPT4gcHJvcGVydHkubG9hZGluZyA9IHRydWUpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc3VnZ2VzdGVyW3N1Z2dlc3RUeXBlXSEodGVybSwgcHJvcGVydHkpKSxcbiAgICAgICAgICAgIHRhcCgoKSA9PiBwcm9wZXJ0eS5sb2FkaW5nID0gZmFsc2UpXG4gICAgICAgICAgKSA6XG4gICAgICAgICAgb2YoW10pO1xuICAgICAgfSksXG4gICAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogSGVTZWFyY2hTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlcnNTZXJ2aWNlOiBIZVVzZXJzU2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHNjaGVtYVR5cGUgPSB0aGlzLm5vZGUhLnR5cGUgfHwgdGhpcy5ub2RlIVsnQHR5cGUnXTtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLnNjaGVtYXMgPyB0aGlzLnNjaGVtYXNbc2NoZW1hVHlwZV0gOiB7fSBhcyBkZWZpbml0aW9uO1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZXJyb3JzLmZpbHRlcihmaWx0ZXJFcnJvcik7XG4gICAgY29uc3QgZXJyb3IgPSBwcm9wZXJ0eUVycm9yKGVycm9ycykoJycpO1xuICAgIHRoaXMubm9kZVByb3BlcnR5ID0gdGhpcy5zY2hlbWFzID8ge1xuICAgICAgaWQ6IHByb3BlcnR5SWQoKSxcbiAgICAgIHNjaGVtYSxcbiAgICAgIHNjaGVtYVR5cGUsXG4gICAgICBlZGl0YWJsZTogISF0aGlzLm5vZGUhLnR5cGUsXG4gICAgICBmdWxsS2V5OiAnJyxcbiAgICAgIGtleTogJycsXG4gICAgICB2YWx1ZToge30sXG4gICAgICBlcnJvcjogZm9ybWF0RXJyb3IoZXJyb3IpLFxuICAgICAgaGFzRXJyb3I6IGVycm9ySGFzRXJyb3IoZXJyb3IpLFxuICAgICAgaGFzV2FybmluZzogZXJyb3JIYXNXYXJuaW5nKGVycm9yKSxcbiAgICAgIHN1Z2dlc3Rpb25zOiB7fSxcbiAgICAgIG5ld1Byb3BlcnR5OiB7fSxcbiAgICAgIG5ld0Vycm9yOiB7IGxldmVsOiAnd2FybmluZycgfSxcbiAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgYWRkUHJvcGVydHlFbmFibGVkOiBpc0FkZFByb3BlcnR5RW5hYmxlZCh0aGlzLm5vZGUhLCBzY2hlbWFUeXBlLCBzY2hlbWEpXG4gICAgfSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWN1cnNlciA9IHJlY3Vyc2l2ZVByb3BlcnRpZXModGhpcy5zY2hlbWFzISwgZXJyb3JzLCBzY2hlbWEsIHRoaXMuZGVlcEVkaXRhYmxlKTtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSByZWN1cnNlcih0aGlzLm5vZGUpO1xuICB9XG5cbiAgcHVibGljIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyLCBfdmFsdWU6IGFueSkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyB0cmFja0J5UHJvcGVydHkoX2luZGV4OiBudW1iZXIsIHsgaWQsIGZ1bGxLZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBbZnVsbEtleSwgaWRdLmpvaW4oJ18nKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNBZGRvbnMocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gcHJvcGVydHkgJiYgKFxuICAgICAgdGhpcy5lbmFibGVBZGRFcnJvcihwcm9wZXJ0eSkgfHxcbiAgICAgICh0aGlzLmVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlKSB8fFxuICAgICAgdGhpcy5hZGRQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHkpIHx8XG4gICAgICB0aGlzLmlzUmVxdWlyZWQocHJvcGVydHkpIHx8XG4gICAgICBwcm9wZXJ0eS5leHRlcm5hbFVybD8udXJsIHx8XG4gICAgICB0aGlzLm1hcERyYXdpbmdNb2Rlcyhwcm9wZXJ0eSkubGVuZ3RoIHx8XG4gICAgICB0aGlzLnVuaXRDb252ZXJ0ZXJFbmFibGVkKHByb3BlcnR5KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaXNSZXF1aXJlZCh7IHZhbHVlLCBpc1JlcXVpcmVkIH06IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gaXNSZXF1aXJlZCAmJiBpc0VtcHR5KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHN1Z2dlc3RUZXJtRmllbGRzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAuLi5wb3B1bGF0ZVRlcm1GaWVsZHMsXG4gICAgICAuLi4odGhpcy5zaG93U3VnZ2VzdGVkRGVmYXVsdFByb3BlcnRpZXMgPyBwb3B1bGF0ZVRlcm1EZWZhdWx0UHJvcGVydGllcyA6IFtdKVxuICAgIF07XG4gIH1cblxuICAvLyAtLS0gRXJyb3JzXG5cbiAgcHVibGljIGVuYWJsZUFkZEVycm9yKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzRWRpdGFibGUgJiYgIXByb3BlcnR5Lmhhc0Vycm9yICYmICFwcm9wZXJ0eS5oYXNXYXJuaW5nO1xuICB9XG5cbiAgcHVibGljIGFkZEVycm9yKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5LCB7IG1lc3NhZ2UsIGxldmVsIH06IElFcnJvclByb3BlcnR5KSB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBwcm9wZXJ0eS5mdWxsS2V5LnNwbGl0KCcuJyk7XG4gICAga2V5cy5wb3AoKTtcbiAgICBjb25zdCBlcnJvcjogSVZhbGlkYXRpb25FcnJvciA9IHByb3BlcnR5LmlzQWRkZWQgPyB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgbGV2ZWw6IGxldmVsIHx8ICdlcnJvcicsXG4gICAgICBkYXRhUGF0aDoga2V5VG9EYXRhUGF0aChrZXlzLmpvaW4oJy4nKSksXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgbWlzc2luZ1Byb3BlcnR5OiBwcm9wZXJ0eS5rZXlcbiAgICAgIH1cbiAgICB9IDoge1xuICAgICAgbWVzc2FnZSxcbiAgICAgIGxldmVsOiBsZXZlbCB8fCAnZXJyb3InLFxuICAgICAgZGF0YVBhdGg6IGtleVRvRGF0YVBhdGgocHJvcGVydHkuZnVsbEtleSlcbiAgICB9O1xuICAgIHByb3BlcnR5Lm5ld0Vycm9yID0geyBsZXZlbDogJ3dhcm5pbmcnIH07XG4gICAgcHJvcGVydHkuZXJyb3IgPSBlcnJvcjtcbiAgICBwcm9wZXJ0eS5oYXNFcnJvciA9IGVycm9ySGFzRXJyb3IoZXJyb3IpO1xuICAgIHByb3BlcnR5Lmhhc1dhcm5pbmcgPSBlcnJvckhhc1dhcm5pbmcoZXJyb3IpO1xuICAgIHRoaXMubm9kZUVycm9yQWRkZWQuZW1pdChlcnJvcik7XG4gIH1cblxuICBwdWJsaWMgZWRpdEVycm9yKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcHJvcGVydHkubmV3RXJyb3IgPSBwcm9wZXJ0eS5lcnJvcjtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlRXJyb3IocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9IHByb3BlcnR5LmVycm9yPy5pbmRleDtcbiAgICBwcm9wZXJ0eS5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICBwcm9wZXJ0eS5oYXNFcnJvciA9IGhhc0Vycm9yKHByb3BlcnR5LnByb3BlcnRpZXMpO1xuICAgIHByb3BlcnR5Lmhhc1dhcm5pbmcgPSBoYXNXYXJuaW5nKHByb3BlcnR5LnByb3BlcnRpZXMpO1xuICAgIHRoaXMubm9kZUVyb3JyUmVzb2x2ZWQuZW1pdChpbmRleCk7XG4gICAgcmV0dXJuIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LmZ1bGxLZXkpO1xuICB9XG5cbiAgLy8gLS0tXG5cbiAgcHVibGljIHR5cGVhaGVhZEZvY3VzKGU6IEV2ZW50KSB7XG4gICAgaWYgKGUuYnViYmxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXRFdmVudCA9IG5ldyBFdmVudCgnaW5wdXQnKTtcbiAgICAgIGUudGFyZ2V0Py5kaXNwYXRjaEV2ZW50KGlucHV0RXZlbnQpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHVibGljIGFkZFByb3BlcnR5RW5hYmxlZChwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiB0aGlzLmVkaXRhYmxlICYmICF0aGlzLmVycm9yc0VkaXRhYmxlICYmIHByb3BlcnR5LmFkZFByb3BlcnR5RW5hYmxlZDtcbiAgfVxuXG4gIHByaXZhdGUgbmV3UHJvcGVydGllcyhwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgZmllbGQ6IHN0cmluZykge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBub2RlQXZhaWxhYmxlUHJvcGVydGllcyh0aGlzLm5vZGUhLCBwcm9wZXJ0eSk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKHByb3AgPT4gcHJvcC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpZWxkLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgLm1hcChuYW1lID0+ICh7IG5hbWUsIHByb3A6IHByb3BlcnRpZXNbbmFtZV0gfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlUHJvcGVydHlEYXRhKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5LCBkYXRhOiBhbnksIGVkaXRhYmxlPzogYm9vbGVhbiwgcmVwbGFjZVBhcmVudCA9IHRydWUpIHtcbiAgICBjb25zdCBwYXJlbnQgPSByZXBsYWNlUGFyZW50ID8gcGFyZW50UHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSkgOiBwcm9wZXJ0eTtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gcmVjdXJzaXZlUHJvcGVydGllcyhcbiAgICAgIHRoaXMuc2NoZW1hcyEsIFtdLCB0aGlzLnNjaGVtYXMhW3RoaXMubm9kZSEudHlwZV0sIHRoaXMuZGVlcEVkaXRhYmxlLCBwYXJlbnQuZnVsbEtleVxuICAgICkoZGF0YSk7XG4gICAgdXBkYXRlUHJvcGVydGllcyh7IHByb3BlcnRpZXMgfSwgcHJvcCA9PiB7XG4gICAgICBwcm9wLmVkaXRhYmxlID0gdHlwZW9mIGVkaXRhYmxlID09PSAndW5kZWZpbmVkJyA/IHByb3AuZWRpdGFibGUgOiBlZGl0YWJsZTtcbiAgICAgIHJldHVybiBwcm9wO1xuICAgIH0pO1xuICAgIHBhcmVudC5lZGl0YWJsZSA9IHR5cGVvZiBlZGl0YWJsZSA9PT0gJ3VuZGVmaW5lZCcgPyBwYXJlbnQuZWRpdGFibGUgOiBlZGl0YWJsZTtcbiAgICBwYXJlbnQucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgcGFyZW50LnZhbHVlID0gZGF0YTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQoZGF0YSwgcGFyZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzdWdnZXN0aW9uU2VsZWN0ZWQoeyAnQGlkJzogX2lkLCBuYW1lLCB0eXBlLCBpZCwgLi4uZGF0YSB9LCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBfaWQgP1xuICAgICAgLy8gc3VnZ2VzdGlvbnMgZnJvbSBleGlzdGluZyBub2Rlc1xuICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHByb3BlcnR5LCB7ICdAaWQnOiBfaWQsICdAdHlwZSc6IHByb3BlcnR5LnN1Z2dlc3Rpb25zPy50eXBlLCBuYW1lLCAuLi5kYXRhIH0sIGZhbHNlKSA6XG4gICAgICAoXG4gICAgICAgIC8vIHN1Z2dlc3Rpb24gZnJvbSBsaW5rZWQgbm9kZXNcbiAgICAgICAgdHlwZSAmJiBpZCA/XG4gICAgICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHByb3BlcnR5LCB7IHR5cGUsIGlkLCAuLi5kYXRhIH0sIHRydWUpIDpcbiAgICAgICAgICAvLyBzdWdnZXN0aW9uIGJ5IG5hbWUgPT4gZW51bSB2YWx1ZXNcbiAgICAgICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlZChuYW1lLCBwcm9wZXJ0eSlcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWRkQXJyYXlHcm91cChhcnJheTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLnNjaGVtYXMhW2FycmF5LnNjaGVtYVR5cGVdO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0KHRoaXMubm9kZSwgYXJyYXkuZnVsbEtleSk7XG4gICAgY29uc3QgbmV3UHJvcGVydHkgPSB0eXBlVG9OZXdQcm9wZXJ0eShcbiAgICAgIHRoaXMuc2NoZW1hcyEsIHByb3AsIHByb3AsIHZhbHVlLCBgJHthcnJheS5mdWxsS2V5fVske2FycmF5LnByb3BlcnRpZXMubGVuZ3RofV1gXG4gICAgKTtcbiAgICBhcnJheS5wcm9wZXJ0aWVzLnB1c2gobmV3UHJvcGVydHkpO1xuICAgIHRoaXMubm9kZUNoYW5nZS5lbWl0KHsga2V5OiBhcnJheS5mdWxsS2V5LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgYXJyYXkuZnVsbEtleSk7XG4gIH1cblxuICBwdWJsaWMgZHVwbGljYXRlQXJyYXlHcm91cChhcnJheTogSU5vZGVQcm9wZXJ0eSwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICtwcm9wZXJ0eS5rZXk7XG4gICAgY29uc3QgbmV3UHJvcGVydHk6IElOb2RlUHJvcGVydHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHByb3BlcnR5KSk7XG4gICAgbmV3UHJvcGVydHkuaWQgPSBwcm9wZXJ0eUlkKCk7XG4gICAgY29uc3QgdmFsdWUgPSBbLi4uZ2V0KHRoaXMubm9kZSwgYXJyYXkuZnVsbEtleSldO1xuICAgIHZhbHVlLnNwbGljZShpbmRleCwgMCwgc2FmZUpTT05QYXJzZShuZXdQcm9wZXJ0eS52YWx1ZSkpO1xuICAgIGFycmF5LnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAwLCBuZXdQcm9wZXJ0eSk7XG4gICAgLy8gbmVlZCB0byBjaGFuZ2Uga2V5IG9uIGV2ZXJ5IHByb3BlcnRpZXMgcmVjdXJzaXZlbHlcbiAgICByZWZyZXNoUHJvcGVydHlLZXlzKGFycmF5KTtcbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogYXJyYXkuZnVsbEtleSwgdmFsdWUgfSk7XG4gICAgcmV0dXJuIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIGFycmF5LmZ1bGxLZXkpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFycmF5R3JvdXAoYXJyYXk6IElOb2RlUHJvcGVydHksIHsga2V5IH06IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICtrZXk7XG4gICAgY29uc3QgdmFsdWUgPSBbLi4uZ2V0KHRoaXMubm9kZSwgYXJyYXkuZnVsbEtleSldO1xuICAgIHZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgYXJyYXkucHJvcGVydGllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIC8vIG5lZWQgdG8gY2hhbmdlIGtleSBvbiBldmVyeSBwcm9wZXJ0aWVzIHJlY3Vyc2l2ZWx5XG4gICAgcmVmcmVzaFByb3BlcnR5S2V5cyhhcnJheSk7XG4gICAgdGhpcy5ub2RlQ2hhbmdlLmVtaXQoeyBrZXk6IGFycmF5LmZ1bGxLZXksIHZhbHVlIH0pO1xuICAgIC8vIGlmIG5vIG1vcmUgdmFsdWVzLCByZW1vdmUgcGFyZW50IGdyb3VwIGVudGlyZWx5XG4gICAgcmV0dXJuIGFycmF5LnByb3BlcnRpZXMubGVuZ3RoID8gbnVsbCA6IHRoaXMucHJvcGVydHlDaGFuZ2VkKG51bGwsIGFycmF5KTtcbiAgfVxuXG4gIHByaXZhdGUgbW92ZUFycmF5R3JvdXBUb1Bvc2l0aW9uKGFycmF5OiBJTm9kZVByb3BlcnR5LCBjdXJyZW50SW5kZXg6IG51bWJlciwgbmV3SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHZhbHVlID0gWy4uLmdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpXTtcbiAgICBtb3ZlSXRlbUluQXJyYXkodmFsdWUsIGN1cnJlbnRJbmRleCwgbmV3SW5kZXgpO1xuICAgIG1vdmVJdGVtSW5BcnJheShhcnJheS5wcm9wZXJ0aWVzLCBjdXJyZW50SW5kZXgsIG5ld0luZGV4KTtcbiAgICAvLyBuZWVkIHRvIGNoYW5nZSBrZXkgb24gZXZlcnkgcHJvcGVydGllcyByZWN1cnNpdmVseVxuICAgIHJlZnJlc2hQcm9wZXJ0eUtleXMoYXJyYXkpO1xuICAgIHRoaXMubm9kZUNoYW5nZS5lbWl0KHsga2V5OiBhcnJheS5mdWxsS2V5LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgYXJyYXkuZnVsbEtleSk7XG4gIH1cblxuICBwdWJsaWMgbW92ZUFycmF5R3JvdXBVcChhcnJheTogSU5vZGVQcm9wZXJ0eSwgeyBrZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gK2tleTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlQXJyYXlHcm91cFRvUG9zaXRpb24oYXJyYXksIGluZGV4LCBpbmRleCAtIDEpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBcnJheUdyb3VwRG93bihhcnJheTogSU5vZGVQcm9wZXJ0eSwgeyBrZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gK2tleTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlQXJyYXlHcm91cFRvUG9zaXRpb24oYXJyYXksIGluZGV4LCBpbmRleCArIDEpO1xuICB9XG5cbiAgcHVibGljIHByb3BlcnR5Q2hhbmdlZCh2YWx1ZTogYW55LCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LmZ1bGxLZXksIHZhbHVlKTtcbiAgICBwcm9wZXJ0eS5hZGRQcm9wZXJ0eUVuYWJsZWQgPSBpc0FkZFByb3BlcnR5RW5hYmxlZChcbiAgICAgIHRoaXMubm9kZSEsIHByb3BlcnR5LnNjaGVtYVR5cGUsIHByb3BlcnR5LnNjaGVtYSEsIHByb3BlcnR5LmZ1bGxLZXlcbiAgICApO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBwcm9wZXJ0eS52YWx1ZSA9IHZhbHVlO1xuICAgICAgcHJvcGVydHkuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3VmFsdWUgPSBwYXJzZU5ld1ZhbHVlKHByb3BlcnR5LnNjaGVtYSEsIHZhbHVlKTtcbiAgICAvLyBwYXRjaCBlcnJvciB3aGVuIGxpbmsgaXMgbm90IHdvcmtpbmcgY29ycmVjdGx5XG4gICAgaWYgKG5ld1ZhbHVlPy5pZD8uc3RhcnRzV2l0aChmb3JtYXRMaW5rTm9kZXNQcmVmaXgpKSB7XG4gICAgICBuZXdWYWx1ZS5pZCA9IG5ld1ZhbHVlLmlkLnNwbGl0KCc6JylbMV0udHJpbSgpO1xuICAgIH1cbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogcHJvcGVydHkuZnVsbEtleSwgdmFsdWU6IG5ld1ZhbHVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWZhdWx0UHJvcGVydHkocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGtleTogc3RyaW5nLCBkZWY6IGRlZmluaXRpb24pIHtcbiAgICBjb25zdCBub2RlID0gcHJvcGVydHkua2V5ID8gZ2V0KHRoaXMubm9kZSwgcHJvcGVydHkuZnVsbEtleSkgOiB0aGlzLm5vZGU7XG4gICAgY29uc3QgZnVsbEtleSA9IHByb3BlcnR5LmtleSA/IGAke3Byb3BlcnR5LmZ1bGxLZXl9LiR7a2V5fWAgOiBrZXk7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHByb3BlcnR5LmtleSA/IHByb3BlcnR5LnByb3BlcnRpZXMgOiB0aGlzLnByb3BlcnRpZXM7XG4gICAgY29uc3QgbmV3UHJvcGVydHkgPSB0eXBlVG9OZXdQcm9wZXJ0eSh0aGlzLnNjaGVtYXMhLCBkZWYsIHRoaXMuc2NoZW1hcyFbcHJvcGVydHkuc2NoZW1hVHlwZV0sIG5vZGUsIGZ1bGxLZXkpO1xuICAgIGNvbnN0IGV4aXN0aW5nUHJvcGVydHlJbmRleCA9IHByb3BlcnRpZXMuZmluZEluZGV4KHYgPT4gdi5mdWxsS2V5ID09PSBmdWxsS2V5KTtcbiAgICBleGlzdGluZ1Byb3BlcnR5SW5kZXggPj0gMCA/IChwcm9wZXJ0aWVzW2V4aXN0aW5nUHJvcGVydHlJbmRleF0gPSBuZXdQcm9wZXJ0eSkgOiBwcm9wZXJ0aWVzLnB1c2gobmV3UHJvcGVydHkpO1xuICAgIHByb3BlcnRpZXMuc29ydChzb3J0UHJvcGVydGllcyk7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKG5ld1Byb3BlcnR5LnZhbHVlLCBuZXdQcm9wZXJ0eSk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWlzc2luZ1Byb3BlcnR5KHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGFyZW50UHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gICAgY29uc3QgbmV3UHJvcGVydHkgPSBwYXJlbnQgPT09IHByb3BlcnR5ID8gdGhpcy5ub2RlUHJvcGVydHkhIDogcGFyZW50O1xuICAgIGNvbnN0IG5ld1Byb3BlcnRpZXMgPSB0aGlzLm5ld1Byb3BlcnRpZXMobmV3UHJvcGVydHksIHByb3BlcnR5LmtleSk7XG4gICAgbmV3UHJvcGVydHkubmV3UHJvcGVydHkgPSBuZXdQcm9wZXJ0aWVzWzBdO1xuICAgIHJldHVybiBuZXdQcm9wZXJ0eS5uZXdQcm9wZXJ0eSA/IHRoaXMuYWRkUHJvcGVydHkobmV3UHJvcGVydHkpIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRQcm9wZXJ0eShwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHsgbmFtZSwgcHJvcCB9ID0gcHJvcGVydHkubmV3UHJvcGVydHkhO1xuICAgIHByb3BlcnR5Lm5ld1Byb3BlcnR5ID0ge307XG4gICAgcmV0dXJuIG5hbWUgPT09ICdAaWQnID9cbiAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eSwgeyAnQGlkJzogJycsIHR5cGU6IHByb3BlcnR5LnNjaGVtYVR5cGUgfSwgdW5kZWZpbmVkLCBmYWxzZSkgOlxuICAgICAgdGhpcy5hZGREZWZhdWx0UHJvcGVydHkocHJvcGVydHksIG5hbWUhLCBwcm9wISk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVByb3BlcnR5Q29vcmRpbmF0ZXMocHJvcGVydHk6IElOb2RlUHJvcGVydHksIHZhbHVlOiBnb29nbGUubWFwcy5MYXRMbmdMaXRlcmFsKSB7XG4gICAgY29uc3QgbGF0aXR1ZGUgPSBzaWJsaW5nUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSwgJ2xhdGl0dWRlJyk7XG4gICAgY29uc3QgbG9uZ2l0dWRlID0gc2libGluZ1Byb3BlcnR5KHRoaXMucHJvcGVydGllcywgcHJvcGVydHksICdsb25naXR1ZGUnKTtcbiAgICByZXR1cm4gW1xuICAgICAgbGF0aXR1ZGUgPyB0aGlzLnByb3BlcnR5Q2hhbmdlZCh2YWx1ZS5sYXQsIGxhdGl0dWRlKSA6IG51bGwsXG4gICAgICBsb25naXR1ZGUgPyB0aGlzLnByb3BlcnR5Q2hhbmdlZCh2YWx1ZS5sbmcsIGxvbmdpdHVkZSkgOiBudWxsXG4gICAgXTtcbiAgfVxuXG4gIC8vIE1hcFxuXG4gIHB1YmxpYyBnZXQgc2hvd01hcCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmVkaXRhYmxlIHx8IHRoaXMuZXJyb3JNb2RlKSAmJiBbU2NoZW1hVHlwZS5TaXRlLCBTY2hlbWFUeXBlLk9yZ2FuaXNhdGlvbl0uaW5jbHVkZXModGhpcy5ub2RlIS50eXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBtYXBEcmF3aW5nTW9kZXMoeyBrZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBbJ2JvdW5kYXJ5J10uaW5jbHVkZXMoa2V5KSA/IFtcbiAgICAgIGdvb2dsZS5tYXBzLmRyYXdpbmcuT3ZlcmxheVR5cGUuUE9MWUdPTlxuICAgIF0gOiAoW1xuICAgICAgJ2xhdGl0dWRlJywgJ2xvbmdpdHVkZSdcbiAgICBdLmluY2x1ZGVzKGtleSkgPyBbXG4gICAgICBnb29nbGUubWFwcy5kcmF3aW5nLk92ZXJsYXlUeXBlLk1BUktFUlxuICAgIF0gOiBbXSk7XG4gIH1cblxuICBwdWJsaWMgb25NYXBEcmF3aW5nQ2xvc2VkKG5ld1ZhbHVlKSB7XG4gICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLm1hcERyYXdpbmdQcm9wZXJ0eTtcbiAgICB0aGlzLm1hcERyYXdpbmdQcm9wZXJ0eSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gWydsYXRpdHVkZScsICdsb25naXR1ZGUnXS5pbmNsdWRlcyhwcm9wZXJ0eSEua2V5KSA/XG4gICAgICB0aGlzLnVwZGF0ZVByb3BlcnR5Q29vcmRpbmF0ZXMocHJvcGVydHkhLCBuZXdWYWx1ZSkgOlxuICAgICAgdGhpcy5wcm9wZXJ0eUNoYW5nZWQobmV3VmFsdWUsIHByb3BlcnR5ISk7XG4gIH1cblxuICAvLyBCaWJsaW9ncmFwaHkgU2VhcmNoXG5cbiAgcHVibGljIGJpYmxpb2dyYXBoaWVzU2VhcmNoS2V5KHsga2V5LCBzY2hlbWFUeXBlIH06IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWxpZFNjaGVtYSA9IFtTY2hlbWFUeXBlLkJpYmxpb2dyYXBoeV0uaW5jbHVkZXMoc2NoZW1hVHlwZSk7XG4gICAgY29uc3QgdmFsaWVLZXkgPSBbJ3RpdGxlJywgJ2RvY3VtZW50RE9JJywgJ3Njb3B1cyddLmluY2x1ZGVzKGtleSk7XG4gICAgcmV0dXJuIHZhbGlkU2NoZW1hICYmIHZhbGllS2V5ID8ga2V5IDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQmlibGlvZ3JhcGh5KHZhbHVlOiBQYXJ0aWFsPEJpYmxpb2dyYXBoeT4pIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEpO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5iaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXMgPyB7XG4gICAgICAuLi5wYXJlbnQudmFsdWUsXG4gICAgICBiaWJsaW9ncmFwaHk6IHZhbHVlXG4gICAgfSA6IHZhbHVlO1xuICAgIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YSh0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkhLCBuZXdWYWx1ZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU291cmNlKHZhbHVlOiBQYXJ0aWFsPFNvdXJjZT4pIHtcbiAgICAvLyBjYW5ub3QgcmVwbGFjZSBhIHRvcC1sZXZlbCBzb3VyY2VcbiAgICB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoU291cmNlcyAmJiB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEodGhpcy5iaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5ISwge1xuICAgICAgJ0B0eXBlJzogTm9kZVR5cGUuU291cmNlLFxuICAgICAgLi4udmFsdWVcbiAgICB9LCAhKCdAaWQnIGluIHZhbHVlKSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmlibGlvZ3JhcGhpZXNTZWFyY2hTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkhLmZ1bGxLZXkuc3BsaXQoJy4nKS5sZW5ndGggPiAyO1xuICB9XG5cbiAgcHVibGljIG9uQmlibGlvZ3JhcGhpZXNTZWFyY2hDbG9zZWQodmFsdWU/OiBQYXJ0aWFsPFNvdXJjZT4gfCBQYXJ0aWFsPEJpYmxpb2dyYXBoeT4pIHtcbiAgICB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkgPSB2YWx1ZSA/IChcbiAgICAgIHZhbHVlLnR5cGUgPT09IFNjaGVtYVR5cGUuQmlibGlvZ3JhcGh5ID9cbiAgICAgICAgdGhpcy51cGRhdGVCaWJsaW9ncmFwaHkodmFsdWUpIDpcbiAgICAgICAgdGhpcy51cGRhdGVTb3VyY2UodmFsdWUgYXMgUGFydGlhbDxTb3VyY2U+KVxuICAgICkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBBY3Rvci5AaWRcblxuICBwdWJsaWMgYXN5bmMgc2V0VXNlckFjdG9ySWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCB7IGFjdG9ySWQsIG5hbWUgfSA9IGF3YWl0IHRoaXMudXNlcnNTZXJ2aWNlLmxvZ2dlZEluVXNlcjtcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHByb3BlcnR5LCB7ICdAaWQnOiBhY3RvcklkLCAnQHR5cGUnOiBOb2RlVHlwZS5BY3RvciwgbmFtZSB9LCBmYWxzZSk7XG4gIH1cblxuICAvLyBDeWNsZS5jeWNsZUR1cmF0aW9uXG5cbiAgcHVibGljIGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb25FbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb25FbmFibGVkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb24ocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb24odGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKGR1cmF0aW9uLCBwcm9wZXJ0eSk7XG4gIH1cblxuICAvLyBDeWNsZS5zdGFydERhdGVcblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVTdGFydERhdGVFbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlRW5hYmxlZCh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZShwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpO1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5Q2hhbmdlZChzdGFydERhdGUsIHByb3BlcnR5KTtcbiAgfVxuXG4gIC8vIFVuaXRzIGNvbnZlcnRlclxuXG4gIHB1YmxpYyB1bml0Q29udmVydGVyRW5hYmxlZChwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiB0aGlzLmVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlICYmIFsndmFsdWUnLCAnbWluJywgJ21heCcsICdzZCddLmluY2x1ZGVzKHByb3BlcnR5LmtleSk7XG4gIH1cblxuICBwdWJsaWMgb3BlblVuaXRDb252ZXJ0ZXIocG9wb3ZlciwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHByb3BlcnR5LnZhbHVlO1xuICAgIGNvbnN0IHRlcm1Qcm9wZXJ0eSA9IHNpYmxpbmdQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LCAndGVybScpO1xuICAgIGNvbnN0IHRlcm0gPSBzYWZlSlNPTlBhcnNlKHRlcm1Qcm9wZXJ0eT8udmFsdWUpO1xuICAgIGNvbnN0IHVuaXRzID0gdGVybT8udW5pdHM7XG4gICAgcmV0dXJuIHBvcG92ZXIuaXNPcGVuKCkgPyBwb3BvdmVyLmNsb3NlKCkgOiBwb3BvdmVyLm9wZW4oeyB2YWx1ZSwgdGVybSwgdW5pdHMgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLXRvZ2dsZSBwLTRcIiAoY2xpY2spPVwiaXNPcGVuID0gIWlzT3BlblwiIHBvaW50ZXI+XG4gICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWRvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFpc09wZW5cIj48L2ZhLWljb24+XG4gICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJpc09wZW5cIj48L2ZhLWljb24+XG4gICAgPHNwYW4gKm5nSWY9XCJub2RlUHJvcGVydHlcIiBjbGFzcz1cImlzLXB4LTJcIlxuICAgICAgW2NsYXNzLmhhcy10ZXh0LWRhbmdlcl09XCJub2RlUHJvcGVydHkuaGFzRXJyb3JcIlxuICAgICAgW2NsYXNzLmhhcy10ZXh0LXdhcm5pbmddPVwibm9kZVByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuICAgID5cbiAgICAgIDxoZS1ub2RlLWljb24gW3R5cGVdPVwibm9kZVByb3BlcnR5LnNjaGVtYVR5cGVcIj48L2hlLW5vZGUtaWNvbj5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiBpc09wZW4gJiYgbm9kZVByb3BlcnR5XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dOZXdQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogbm9kZVByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzT3BlblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBiLTMgbWItMlwiICpuZ0lmPVwiZXJyb3JzRWRpdGFibGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGVFcnJvckZvcm07IGNvbnRleHQ6IHskaW1wbGljaXQ6IG5vZGVQcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItNFwiICpuZ0lmPVwibm9kZVByb3BlcnR5Py5lcnJvclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlFcnJvcjsgY29udGV4dDoge3Byb3BlcnR5OiBub2RlUHJvcGVydHksIGVkaXQ6IHRydWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW11bHRpbGluZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcGVydHkgb2YgcHJvcGVydGllczsgdHJhY2tCeTogdHJhY2tCeVByb3BlcnR5XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNPcGVuXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlNYXA7IGNvbnRleHQ6IHskaW1wbGljaXQ6IG5vZGVQcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGhlLW1hcHMtZHJhd2luZy1jb25maXJtICpuZ0lmPVwiISFtYXBEcmF3aW5nUHJvcGVydHlcIlxuICBbdmFsdWVdPVwibWFwRHJhd2luZ1Byb3BlcnR5LnZhbHVlXCIgW21vZGVzXT1cIm1hcERyYXdpbmdNb2RlcyhtYXBEcmF3aW5nUHJvcGVydHkpXCJcbiAgKGNsb3NlZCk9XCJvbk1hcERyYXdpbmdDbG9zZWQoJGV2ZW50KVwiXG4+PC9oZS1tYXBzLWRyYXdpbmctY29uZmlybT5cblxuPGhlLWJpYmxpb2dyYXBoaWVzLXNlYXJjaC1jb25maXJtICpuZ0lmPVwiISFiaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5XCJcbiAgW3NlYXJjaF09XCJiaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5LnZhbHVlXCJcbiAgW3NlYXJjaEJ5XT1cImJpYmxpb2dyYXBoaWVzU2VhcmNoS2V5KGJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkpXCJcbiAgW3NlYXJjaFNvdXJjZXNdPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hTb3VyY2VzXCJcbiAgKGNsb3NlZCk9XCJvbkJpYmxpb2dyYXBoaWVzU2VhcmNoQ2xvc2VkKCRldmVudClcIlxuPjwvaGUtYmlibGlvZ3JhcGhpZXMtc2VhcmNoLWNvbmZpcm0+XG5cbjxuZy10ZW1wbGF0ZSAjbGFiZWxEZXNjcmlwdGlvbiBsZXQtcHJvcGVydHk+XG4gIDxzcGFuXG4gICAgY2xhc3M9XCJ0cmlnZ2VyLXBvcG92ZXJcIlxuICAgIFtuZ2JQb3BvdmVyXT1cInByb3BlcnR5LnNjaGVtYT8uZGVzY3JpcHRpb25cIiBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiXG4gICAgdHJpZ2dlcnM9XCJob3ZlclwiIHBsYWNlbWVudD1cInJpZ2h0XCIgY29udGFpbmVyPVwiYm9keVwiXG4gID5cbiAgICA8c3Bhbj57e3Byb3BlcnR5LmtleX19PC9zcGFuPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xhYmVsRGVmYXVsdCBsZXQtcHJvcGVydHk+XG4gIDxzcGFuPnt7cHJvcGVydHkua2V5fX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Nob3dQcm9wZXJ0eSBsZXQtcHJvcGVydHk+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXNPcGVuIHx8IHByb3BlcnR5LmNsb3NlZFZpc2libGUpICYmICFwcm9wZXJ0eS5pc0hpZGRlblwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtNlwiXG4gICAgICBbaWRdPVwicHJvcGVydHkuZnVsbEtleSArICdfJyArIHByb3BlcnR5LmlkXCJcbiAgICAgIFtjbGFzcy5pcy0xMl09XCJwcm9wZXJ0eS5wcm9wZXJ0aWVzLmxlbmd0aCB8fCAhcHJvcGVydHkua2V5XCJcbiAgICAgIFtuZ1N3aXRjaF09XCIhIXByb3BlcnR5LnByb3BlcnRpZXMubGVuZ3RoXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tdWx0aWxpbmUgaXMtdmFyaWFibGUgaXMtMVwiICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLTMgcHktMVwiICpuZ0lmPVwicHJvcGVydHkua2V5XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgaGFzLXRleHQtcmlnaHQtdGFibGV0IGhhcy10ZXh0LWVsbGlwc2lzXCJcbiAgICAgICAgICAgICpiaW5kT25jZT1cInByb3BlcnR5XCJcbiAgICAgICAgICAgIFtmb3JdPVwicHJvcGVydHkuaWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eS5zY2hlbWE/LmRlc2NyaXB0aW9uICYmIGVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlID8gbGFiZWxEZXNjcmlwdGlvbiA6IGxhYmVsRGVmYXVsdDsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLTkgcHktMVwiIFtjbGFzcy5pcy0xMl09XCIhcHJvcGVydHkua2V5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRGb3JtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihlZGl0YWJsZSB8fCBlcnJvcnNFZGl0YWJsZSkgJiYgKHByb3BlcnR5Lmhhc0Vycm9yIHx8IHByb3BlcnR5Lmhhc1dhcm5pbmcpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eUVycm9yOyBjb250ZXh0OiB7cHJvcGVydHk6IHByb3BlcnR5LCBlZGl0OiBmYWxzZX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWxcIiAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiXG4gICAgICAgIFtjbGFzcy5pcy1saW5rXT1cImVycm9yTW9kZSAmJiBwcm9wZXJ0eS5jaGFuZ2VkXCJcbiAgICAgICAgW2NsYXNzLmlzLWRhbmdlcl09XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNFcnJvclwiXG4gICAgICAgIFtjbGFzcy5pcy13YXJuaW5nXT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuICAgICAgICBbY2xhc3MuaXMtZGVmYXVsdF09XCIhcHJvcGVydHkuY2hhbmdlZCAmJiAhcHJvcGVydHkuaGFzRXJyb3IgJiYgIXByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3Blbi1ncm91cCBwYW5lbC1oZWFkaW5nIHB5LTBcIlxuICAgICAgICAgIChjbGljayk9XCJwcm9wZXJ0eS5pc09wZW4gPSAhcHJvcGVydHkuaXNPcGVuXCIgcG9pbnRlclxuICAgICAgICAgIFtjbGFzcy5pcy1vcGVuXT1cInByb3BlcnR5LmlzT3BlblwiXG4gICAgICAgICAgW2NsYXNzLmhhcy10ZXh0LXdoaXRlXT1cIihlcnJvck1vZGUgJiYgcHJvcGVydHkuY2hhbmdlZCkgfHwgcHJvcGVydHkuaGFzRXJyb3IgfHwgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tb2JpbGUgaXMtdmNlbnRlcmVkXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3cgcHktMSBteS0wXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhcHJvcGVydHkuaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cInByb3BlcnR5LmlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uIHB5LTEgbXktMFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXNpemUtNlwiPnt7cHJvcGVydHkua2V5fX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb3BlcnR5LnNjaGVtYVR5cGVcIiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3cgcHktMSBteS0wXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFncyBtYi0wIGhhcy1hZGRvbnNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBtYi0wIGlzLWxpZ2h0XCI+VHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBtYi0wIGlzLXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgICA8aGUtc2NoZW1hLXZlcnNpb24tbGluayBsaW5rQ2xhc3M9XCJpcy1zbWFsbFwiIFtub2RlXT1cInsnQHR5cGUnOiBwcm9wZXJ0eS5zY2hlbWFUeXBlfVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3Byb3BlcnR5LnNjaGVtYVR5cGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvaGUtc2NoZW1hLXZlcnNpb24tbGluaz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxoZS1wb3BvdmVyLWNvbmZpcm0gY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93IHB5LTEgbXktMCBweC0wXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJlZGl0YWJsZSAmJiAhZXJyb3JzRWRpdGFibGVcIlxuICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiUmVtb3ZlIGdyb3VwXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgW21lc3NhZ2VdPVwiJzxwPlRoaXMgd2lsbCByZW1vdmUgdGhlIGdyb3VwIGNvbXBsZXRlbHkuPC9wPicgKyAocHJvcGVydHkuaXNSZXF1aXJlZCA/ICc8cD48dT5XYXJuaW5nOiB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkLjwvdT48L3A+JyA6ICcnKSArICc8cD5EbyB5b3UgY29uZmlybT88L3A+J1wiXG4gICAgICAgICAgICAgIHBvcG92ZXJDbGFzcz1cInB4LTNcIlxuICAgICAgICAgICAgICAoY29uZmlybWVkKT1cInByb3BlcnR5Q2hhbmdlZChudWxsLCBwcm9wZXJ0eSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwidGltZXNcIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2hlLXBvcG92ZXItY29uZmlybT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ibG9jayBpcy1ibG9jayBwLTBcIiAqbmdJZj1cInByb3BlcnR5LmlzT3BlblwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInByb3BlcnR5LmlzQXJyYXlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0zIHB0LTRcIiAqbmdJZj1cInByb3BlcnR5LmVycm9yXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eUVycm9yOyBjb250ZXh0OiB7cHJvcGVydHk6IHByb3BlcnR5LCBlZGl0OiB0cnVlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgKm5nU3dpdGNoQ2FzZT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGVscCBweS0xIHB4LTJcIiAqbmdJZj1cImVkaXRhYmxlICYmICFwcm9wZXJ0eS5lZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgIFRvIGNoYW5nZSB0aGUge3twcm9wZXJ0eS5rZXl9fSwgcGxlYXNlIGRlbGV0ZSBpdCBmaXJzdCwgdGhlbiBhZGQgdGhlIGZpZWxkIGFnYWluXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicHJvcGVydHkuc2NoZW1hPy50aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoZWxwIHB5LTEgcHgtMlwiICpuZ1N3aXRjaENhc2U9XCInQmlibGlvZ3JhcGh5J1wiPlxuICAgICAgICAgICAgICAgICAgICBTZWFyY2ggYnkgVGl0bGUgb3IgRG9jdW1lbnQgRE9JIHRvIGF1dG8tcG9wdWxhdGUgdGhlIGZpZWxkcyB1c2luZyB0aGUgTWVuZGVsZXkgY2F0YWxvZ3VlXG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TmV3UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0zIG10LTFcIiAqbmdJZj1cImVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGVFcnJvckZvcm07IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcGVydHktZ3JvdXAgcHktMiBweC0zIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tdWx0aWxpbmUgbWItMFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcDIgb2YgcHJvcGVydHkucHJvcGVydGllczsgdHJhY2tCeTogdHJhY2tCeVByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AyfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0yIHB4LTMgbXQtMlwiICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xXCIgKm5nSWY9XCJlcnJvcnNFZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlRXJyb3JGb3JtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcDIgb2YgcHJvcGVydHkucHJvcGVydGllczsgdHJhY2tCeTogdHJhY2tCeVByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC0wIG15LTRcIiAqbmdJZj1cInByb3AyLmtleVwiXG4gICAgICAgICAgICAgICAgICBbaWRdPVwicHJvcDIuZnVsbEtleSArICdfJyArIHByb3AyLmlkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcGVydHktYXJyYXktbnVtYmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWdzIGhhcy1hZGRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBpcy1kYXJrXCI+e3twcm9wMi5rZXl9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgIWVycm9yc0VkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBpcy1pbmZvXCIgcG9pbnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHVwbGljYXRlQXJyYXlHcm91cChwcm9wZXJ0eSwgcHJvcDIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiJ0R1cGxpY2F0ZSAnICsgcGx1cmFsaXplKHByb3BlcnR5LmtleSwgMSlcIiBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiY2xvbmVcIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBpcy1saWdodFwiIHBvaW50ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9wMi5rZXkgIT09ICcwJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlQXJyYXlHcm91cFVwKHByb3BlcnR5LCBwcm9wMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiTW92ZSBVcFwiIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJsb25nLWFycm93LWFsdC11cFwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWxpZ2h0XCIgcG9pbnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb3AyLmtleSAhPT0gcHJvcGVydHkucHJvcGVydGllcy5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBcnJheUdyb3VwRG93bihwcm9wZXJ0eSwgcHJvcDIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIk1vdmUgRG93blwiIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJsb25nLWFycm93LWFsdC1kb3duXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGhlLXBvcG92ZXItY29uZmlybSBjbGFzcz1cInRhZyBpcy1kZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCInUmVtb3ZlICcgKyBwbHVyYWxpemUocHJvcGVydHkua2V5LCAxKVwiIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9XCJUaGlzIHdpbGwgcmVtb3ZlIHRoZSBncm91cCBjb21wbGV0ZWx5LiBEbyB5b3UgY29uZmlybT9cIiBwb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpcm1lZCk9XCJyZW1vdmVBcnJheUdyb3VwKHByb3BlcnR5LCBwcm9wMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaGUtcG9wb3Zlci1jb25maXJtPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd05ld1Byb3BlcnR5OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wMn1cIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgbXQtMlwiICpuZ0lmPVwiZXJyb3JzRWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGVFcnJvckZvcm07IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AyfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC00IG10LTJcIiAqbmdJZj1cInByb3AyLmVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eUVycm9yOyBjb250ZXh0OiB7cHJvcGVydHk6IHByb3AyLCBlZGl0OiB0cnVlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cCBjYXJkLWNvbnRlbnQgcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW11bHRpbGluZSBteS0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcDMgb2YgcHJvcDIucHJvcGVydGllczsgdHJhY2tCeTogdHJhY2tCeVByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd1Byb3BlcnR5OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wM31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1kYXJrIGlzLW91dGxpbmVkIGlzLXNtYWxsXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJlZGl0YWJsZSAmJiAhZXJyb3JzRWRpdGFibGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRBcnJheUdyb3VwKHByb3BlcnR5KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwicGx1cy1jaXJjbGVcIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMVwiPnt7cHJvcGVydHkua2V5IHwgcGx1cmFsaXplOjF9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2lucHV0Rm9ybSBsZXQtcHJvcGVydHk+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wZXJ0eS5rZXlcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwcm9wZXJ0eS5zdWdnZXN0aW9ucz8udHlwZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3NlbGVjdCdcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0U2VsZWN0OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRJbnB1dDsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2lucHV0SW5wdXQgbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiZmllbGQgbWItMFwiIFtjbGFzcy5oYXMtYWRkb25zXT1cImhhc0FkZG9ucyhwcm9wZXJ0eSlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiXG4gICAgICBbY2xhc3MuaGFzLWljb25zLXJpZ2h0XT1cInByb3BlcnR5LmxvYWRpbmdcIlxuICAgID5cbiAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0IGlzLXNtYWxsIHNlYXJjaC1pbnB1dFwiXG4gICAgICAgIFtjbGFzcy5pcy1kYXJrXT1cInByb3BlcnR5LmtleSA9PT0gJ3R5cGUnXCJcbiAgICAgICAgW2NsYXNzLmlzLWxpbmtdPVwiZXJyb3JNb2RlICYmIHByb3BlcnR5LmNoYW5nZWRcIlxuICAgICAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cIighcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNFcnJvcikgfHwgaXNSZXF1aXJlZChwcm9wZXJ0eSlcIlxuICAgICAgICBbY2xhc3MuaXMtd2FybmluZ109XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcblxuICAgICAgICBbKG5nTW9kZWwpXT1cInByb3BlcnR5LnZhbHVlXCIgI3Byb3BlcnR5TW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgW3R5cGVdPVwicHJvcGVydHkuc2NoZW1hPy50eXBlID09PSAnbnVtYmVyJyA/ICdudW1iZXInIDogJ3N0cmluZydcIlxuICAgICAgICBbaWRdPVwicHJvcGVydHkuaWRcIlxuICAgICAgICBuYW1lPVwicmFuZG9tbmFtZVwiXG4gICAgICAgIFtyZWFkb25seV09XCIhZWRpdGFibGUgfHwgIXByb3BlcnR5LmVkaXRhYmxlIHx8IHByb3BlcnR5LnNjaGVtYT8uaW50ZXJuYWxcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicHJvcGVydHkucGxhY2Vob2xkZXJcIlxuICAgICAgICBbYXBwVGFnc0lucHV0XT1cIntlbmFibGVkOiBlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZSAmJiBwcm9wZXJ0eS5zY2hlbWE/LnR5cGUgPT09ICdhcnJheScsIGl0ZW1zOiBwcm9wZXJ0eS5zY2hlbWE/Lml0ZW1zLCBkZWxpbWl0ZXI6ICc7JywgYWxsb3dEdXBsaWNhdGVzOiB0cnVlLCBwbGFjZWhvbGRlcjogcHJvcGVydHkucGxhY2Vob2xkZXJ9XCJcbiAgICAgICAgKGNoYW5nZSk9XCJwcm9wZXJ0eUNoYW5nZWQoJGV2ZW50LnRhcmdldC52YWx1ZSwgcHJvcGVydHkpXCJcblxuICAgICAgICBbcGF0dGVybl09XCJwcm9wZXJ0eS5zY2hlbWE/LnBhdHRlcm5cIlxuICAgICAgICBbcmVxdWlyZWRdPVwicHJvcGVydHkuZnVsbEtleS5lbmRzV2l0aCgnaWQnKSAmJiBwcm9wZXJ0eS5mdWxsS2V5ICE9PSAnaWQnXCJcbiAgICAgICAgW21pbl09XCJwcm9wZXJ0eS5zY2hlbWE/Lm1pbmltdW1cIlxuICAgICAgICBbbWF4XT1cInByb3BlcnR5LnNjaGVtYT8ubWF4aW11bVwiXG5cbiAgICAgICAgW25nYlR5cGVhaGVhZF09XCJwcm9wZXJ0eVN1Z2dlc3QocHJvcGVydHkuZnVsbEtleSwgcHJvcGVydHkuc3VnZ2VzdGlvbnM/LnR5cGUpXCJcbiAgICAgICAgW3Jlc3VsdFRlbXBsYXRlXT1cInN1Z2dlc3Rpb25cIlxuICAgICAgICBbaW5wdXRGb3JtYXR0ZXJdPVwiZm9ybWF0dGVyXCJcbiAgICAgICAgW2ZvY3VzRmlyc3RdPVwidHJ1ZVwiXG4gICAgICAgIChmb2N1cyk9XCJlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZSAmJiB0eXBlYWhlYWRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKHNlbGVjdEl0ZW0pPVwic3VnZ2VzdGlvblNlbGVjdGVkKCRldmVudC5pdGVtLCBwcm9wZXJ0eSlcIlxuICAgICAgPlxuXG4gICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGwgaXMtcmlnaHQgaGFzLXRleHQtZ3JleS1kYXJrXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhcHJvcGVydHkubG9hZGluZ1wiPlxuICAgICAgICA8ZmEtaWNvbiBpY29uPVwic3Bpbm5lclwiIFtwdWxzZV09XCJ0cnVlXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEFkZG9uczsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8cCBjbGFzcz1cImhlbHAgaXMtZGFuZ2VyLWxpZ2h0XCJcbiAgICAqbmdJZj1cIiFwcm9wZXJ0eS5oYXNFcnJvciAmJiBwcm9wZXJ0eU1vZGVsLmludmFsaWRcIlxuICA+XG4gICAgPHNwYW4gKmJpbmRPbmNlPVwicHJvcGVydHlNb2RlbC5lcnJvcnNcIiBbaW5uZXJIVE1MXT1cImZvcm1hdFByb3BlcnR5RXJyb3IocHJvcGVydHlNb2RlbC5lcnJvcnMsIHByb3BlcnR5KVwiPjwvc3Bhbj5cbiAgPC9wPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbnB1dFNlbGVjdCBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZCBtYi0wXCIgW2NsYXNzLmhhcy1hZGRvbnNdPVwiaGFzQWRkb25zKHByb3BlcnR5KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0IGlzLXNtYWxsIGlzLWZ1bGx3aWR0aFwiXG4gICAgICAgIFtjbGFzcy5pcy1saW5rXT1cImVycm9yTW9kZSAmJiBwcm9wZXJ0eS5jaGFuZ2VkXCJcbiAgICAgICAgW2NsYXNzLmlzLWRhbmdlcl09XCIoIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzRXJyb3IpIHx8IGlzUmVxdWlyZWQocHJvcGVydHkpXCJcbiAgICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICA+XG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInByb3BlcnR5LnZhbHVlXCIgI3Byb3BlcnR5TW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICBbaWRdPVwicHJvcGVydHkuaWRcIlxuICAgICAgICAgIG5hbWU9XCJyYW5kb21uYW1lXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRhYmxlIHx8ICFwcm9wZXJ0eS5lZGl0YWJsZSB8fCBwcm9wZXJ0eS5zY2hlbWE/LmludGVybmFsXCJcbiAgICAgICAgICAoY2hhbmdlKT1cInByb3BlcnR5Q2hhbmdlZCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBwcm9wZXJ0eSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdDwvb3B0aW9uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKmJpbmRPbmNlPVwicHJvcGVydHkuc3VnZ2VzdGlvbnNcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHZhbHVlIG9mIHByb3BlcnR5LnN1Z2dlc3Rpb25zLnZhbHVlczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCIgW3ZhbHVlXT1cInZhbHVlXCI+e3t2YWx1ZX19PC9vcHRpb24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0QWRkb25zOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3JlbW92ZUZpZWxkQWRkb24gbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwiIWVycm9yc0VkaXRhYmxlICYmICFwcm9wZXJ0eS5pc1JlcXVpcmVkXCI+XG4gICAgPGEgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIlJlbW92ZSBmaWVsZFwiXG4gICAgICBbY2xhc3MuaXMtb3V0bGluZWRdPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgKHByb3BlcnR5Lmhhc0Vycm9yIHx8IHByb3BlcnR5Lmhhc1dhcm5pbmcpXCJcbiAgICAgIFtjbGFzcy5pcy1kYW5nZXJdPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzRXJyb3JcIlxuICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBwcm9wZXJ0eUNoYW5nZWQobnVsbCwgcHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwidGltZXNcIj48L2ZhLWljb24+XG4gICAgPC9hPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRBZGRvbnMgbGV0LXByb3BlcnR5PlxuICA8aGUtcG9wb3Zlci1jb25maXJtIGNsYXNzPVwiY29udHJvbFwiXG4gICAgKm5nSWY9XCJlbmFibGVBZGRFcnJvcihwcm9wZXJ0eSlcIlxuICAgIHBvc2l0aW9uPVwibGVmdFwiXG4gICAgW2NvbnRlbnRdPVwicG9wdXBFcnJvckZvcm1cIlxuICAgIChjb25maXJtZWQpPVwiYWRkRXJyb3IocHJvcGVydHksICRldmVudClcIlxuICA+XG4gICAgPHNwYW4gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIj5cbiAgICAgIDxmYS1pY29uIGljb249XCJjb21tZW50c1wiPjwvZmEtaWNvbj5cbiAgICA8L3NwYW4+XG4gIDwvaGUtcG9wb3Zlci1jb25maXJtPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZVwiPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInByb3BlcnR5LnNjaGVtYVR5cGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlNjaGVtYVR5cGUuQWN0b3JcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdG9yQWRkb25zOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiU2NoZW1hVHlwZS5DeWNsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3ljbGVBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqYmluZE9uY2U9XCJwcm9wZXJ0eVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cIm1hcERyYXdpbmdNb2Rlcyhwcm9wZXJ0eSkubGVuZ3RoXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIlBpY2sgb24gTWFwXCJcbiAgICAgICAgICAoY2xpY2spPVwibWFwRHJhd2luZ1Byb3BlcnR5ID0gcHJvcGVydHlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cIm1hcC1tYXJrZWQtYWx0XCI+PC9mYS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImJpYmxpb2dyYXBoaWVzU2VhcmNoS2V5KHByb3BlcnR5KVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdGl0bGU9XCJBZHZhbmNlZCBTZWFyY2hcIlxuICAgICAgICAgIChjbGljayk9XCJiaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5ID0gcHJvcGVydHlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cInNlYXJjaFwiPjwvZmEtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW1vdmVGaWVsZEFkZG9uOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCJhZGRQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHkpXCI+XG4gICAgPGEgY2xhc3M9XCJidXR0b24gaXMtc21hbGwgaXMtZGFuZ2VyXCIgdGl0bGU9XCJBZGQgZmllbGRcIlxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgYWRkTWlzc2luZ1Byb3BlcnR5KHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9mYS1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+QWRkPC9zcGFuPlxuICAgIDwvYT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCJpc1JlcXVpcmVkKHByb3BlcnR5KVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1kYW5nZXJcIiBbZm9yXT1cInByb3BlcnR5LmlkXCJcbiAgICAgIG5nYlRvb2x0aXA9XCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwiZXhjbGFtYXRpb24tdHJpYW5nbGVcIj48L2ZhLWljb24+XG4gICAgPC9sYWJlbD5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wZXJ0eS5leHRlcm5hbFVybD8udXJsXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxhIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCJcbiAgICAgICAgW2hyZWZdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsICsgKHByb3BlcnR5LmV4dGVybmFsVXJsLnVybFBhcmFtVmFsdWUgPyBwcm9wZXJ0eS52YWx1ZSA6ICcnKVwiXG4gICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgIFt0aXRsZV09XCJwcm9wZXJ0eS5leHRlcm5hbFVybC50aXRsZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtZGFyayBpcy1vdXRsaW5lZCc6IHByb3BlcnR5LmtleSA9PT0gJ3R5cGUnfVwiXG4gICAgICAgIFthdHRyLmRpc2FibGVkXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLnVybFBhcmFtVmFsdWUgJiYgIXByb3BlcnR5LnZhbHVlID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgPlxuICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJwcm9wZXJ0eS5leHRlcm5hbFVybC5pY29uIHx8ICdleHRlcm5hbC1saW5rLWFsdCdcIj48L2ZhLWljb24+XG4gICAgICA8L2E+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidW5pdENvbnZlcnRlckVuYWJsZWQocHJvcGVydHkpXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIk9wZW4gY2FsY3VsYXRvclwiXG4gICAgICAgIFtuZ2JQb3BvdmVyXT1cImNvbnZlcnRVbml0c1wiIGF1dG9DbG9zZT1cIm91dHNpZGVcIlxuICAgICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiICNwPVwibmdiUG9wb3ZlclwiIHBsYWNlbWVudD1cImJvdHRvbVwiIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAoY2xpY2spPVwib3BlblVuaXRDb252ZXJ0ZXIocCwgcHJvcGVydHkpXCJcbiAgICAgID5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cImNhbGN1bGF0b3JcIj48L2ZhLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2FjdG9yQWRkb25zIGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cInByb3BlcnR5LmtleSA9PT0gJ0BpZCdcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdGl0bGU9XCJBZGQgbXlzZWxmIGFzIEFjdG9yXCJcbiAgICAgIChjbGljayk9XCJzZXRVc2VyQWN0b3JJZChwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIFtpY29uXT1cIlsnZmFyJywgJ2lkLWJhZGdlJ11cIj48L2ZhLWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjeWNsZUFkZG9ucyBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCJwcm9wZXJ0eS5rZXkgPT09ICdjeWNsZUR1cmF0aW9uJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkNhbGN1bGF0ZSB2YWx1ZSBmcm9tIHN0YXJ0RGF0ZSBhbmQgZW5kRGF0ZVwiXG4gICAgICAoY2xpY2spPVwiY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbihwcm9wZXJ0eSlcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFjYWxjdWxhdGVDeWNsZUR1cmF0aW9uRW5hYmxlZChwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJjYWxjdWxhdG9yXCI+PC9mYS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cInByb3BlcnR5LmtleSA9PT0gJ3N0YXJ0RGF0ZSdcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdGl0bGU9XCJDYWxjdWxhdGUgdmFsdWUgZnJvbSBlbmREYXRlIGFuZCBjeWNsZUR1cmF0aW9uXCJcbiAgICAgIChjbGljayk9XCJjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZShwcm9wZXJ0eSlcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZUVuYWJsZWQocHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwiY2FsY3VsYXRvclwiPjwvZmEtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Nob3dOZXdQcm9wZXJ0eSBsZXQtcHJvcGVydHk+XG4gIDxoZWFkZXIgY2xhc3M9XCJjYXJkLWhlYWRlclwiICpuZ0lmPVwiZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgKHByb3BlcnR5LmFkZFByb3BlcnR5RW5hYmxlZCB8fCBkZWVwRWRpdGFibGUpOyBlbHNlIHBhZGRlclwiPlxuICAgIDxmb3JtIGNsYXNzPVwicHktMyBweC00IGlzLWZsZXgtZ3Jvdy0xXCIgKHN1Ym1pdCk9XCJhZGRQcm9wZXJ0eShwcm9wZXJ0eSlcIiBub3ZhbGlkYXRlPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGlzLWhvcml6b250YWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsIGlzLXNtYWxsXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIiBbZm9yXT1cInByb3BlcnR5LmlkICsgJ19uZXcnXCI+XG4gICAgICAgICAgICA8c3Bhbj5BZGQgbmV3IGZpZWxkPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dCBpcy1zbWFsbFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS5uZXdQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgW2lkXT1cInByb3BlcnR5LmlkICsgJ19uZXcnXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwicmFuZG9tbmFtZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYW5kIHNlbGVjdCBmaWVsZCBmcm9tIHJlc3VsdHNcIlxuXG4gICAgICAgICAgICAgICAgW25nYlR5cGVhaGVhZF09XCJzdWdnZXN0TmV3UHJvcGVydHkocHJvcGVydHkuZnVsbEtleSlcIlxuICAgICAgICAgICAgICAgIFtyZXN1bHRUZW1wbGF0ZV09XCJzdWdnZXN0aW9uXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRGb3JtYXR0ZXJdPVwiZm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICBbZm9jdXNGaXJzdF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2VkaXRhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAoZm9jdXMpPVwidHlwZWFoZWFkRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhcHJvcGVydHkubmV3UHJvcGVydHkgfHwgIXByb3BlcnR5Lm5ld1Byb3BlcnR5Lm5hbWVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXNcIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9oZWFkZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5RXJyb3IgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtZWRpdD1cImVkaXRcIj5cbiAgPHAgY2xhc3M9XCJoZWxwXCJcbiAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cInByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICBbY2xhc3MuaXMtd2FybmluZ109XCJwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAqbmdJZj1cInByb3BlcnR5LmVycm9yXCJcbiAgPlxuICAgIDxzcGFuIGNsYXNzPVwiaXMtcHJlLXdyYXBcIiAqYmluZE9uY2U9XCJwcm9wZXJ0eS5lcnJvclwiIFtpbm5lckhUTUxdPVwicHJvcGVydHkuZXJyb3IubWVzc2FnZVwiPjwvc3Bhbj5cbiAgICA8YSBjbGFzcz1cInBsLTJcIlxuICAgICAgKm5nSWY9XCJlZGl0ICYmIGVycm9yc0VkaXRhYmxlICYmIHByb3BlcnR5LmVycm9yLmluZGV4ID49IDBcIlxuICAgICAgKGNsaWNrKT1cImVkaXRFcnJvcihwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGNsYXNzPVwicHItMlwiIGljb249XCJlZGl0XCI+PC9mYS1pY29uPlxuICAgICAgPHNwYW4+RWRpdDwvc3Bhbj5cbiAgICA8L2E+XG4gICAgPGEgY2xhc3M9XCJwbC0yXCJcbiAgICAgICpuZ0lmPVwiKHByb3BlcnR5Lmhhc1dhcm5pbmcgfHwgZXJyb3JzRWRpdGFibGUpICYmIHByb3BlcnR5LmVycm9yLmluZGV4ID49IDBcIlxuICAgICAgKGNsaWNrKT1cInJlc29sdmVFcnJvcihwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGNsYXNzPVwicHItMlwiIGljb249XCJjaGVja1wiPjwvZmEtaWNvbj5cbiAgICAgIDxzcGFuPlJlc29sdmVkPC9zcGFuPlxuICAgIDwvYT5cbiAgPC9wPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwcm9wZXJ0eU1hcCBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJwYW5lbCBpcy1kZWZhdWx0XCIgKm5nSWY9XCJzaG93TWFwXCI+XG4gICAgPGRpdiBjbGFzcz1cIm9wZW4tZ3JvdXAgcGFuZWwtaGVhZGluZyBweS0wXCJcbiAgICAgIChjbGljayk9XCJtYXBWaXNpYmxlID0gIW1hcFZpc2libGVcIiBwb2ludGVyXG4gICAgICBbY2xhc3MuaXMtb3Blbl09XCJtYXBWaXNpYmxlXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tb2JpbGUgaXMtdmNlbnRlcmVkIG1iLTBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93IHB5LTEgbXktMFwiPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhbWFwVmlzaWJsZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIm1hcFZpc2libGVcIj48L2ZhLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4gcHktMSBteS0wXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1zaXplLTZcIj5WaWV3IG9uIE1hcDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWJsb2NrIGlzLWJsb2NrIHAtMFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIW1hcFZpc2libGVcIj5cbiAgICAgIDxoZS1zaXRlcy1tYXBzIFtzaXRlc109XCJbbm9kZV1cIiBbc2hvd05vdGljZV09XCJmYWxzZVwiPjwvaGUtc2l0ZXMtbWFwcz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vZGVFcnJvckZvcm0gbGV0LXByb3BlcnR5PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvcGVydHkubmV3RXJyb3IgJiYgcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9uc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zbWFsbFwiPlxuICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS5uZXdFcnJvci5sZXZlbFwiPlxuICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidW5kZWZpbmVkXCI+U2VsZWN0IExldmVsPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXJyb3JcIj5FcnJvcjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIndhcm5pbmdcIj5XYXJuaW5nPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ0ZXh0YXJlYSBpcy1zbWFsbFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS5uZXdFcnJvci5tZXNzYWdlXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgbWVzc2FnZSBoZXJlXCJcbiAgICAgICAgICByb3dzPVwiMVwiXG4gICAgICAgID48L3RleHRhcmVhPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXByb3BlcnR5Lm5ld0Vycm9yLmxldmVsIHx8ICFwcm9wZXJ0eS5uZXdFcnJvci5tZXNzYWdlXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkRXJyb3IocHJvcGVydHksIHByb3BlcnR5Lm5ld0Vycm9yKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwicGx1cy1jaXJjbGVcIj48L2ZhLWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+QWRkPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcG9wdXBFcnJvckZvcm0gbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cbiAgICAgICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cImRhdGEubGV2ZWxcIj5cbiAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ1bmRlZmluZWRcIj5TZWxlY3QgTGV2ZWw8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXJyb3JcIj5FcnJvcjwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3YXJuaW5nXCI+V2FybmluZzwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiXG4gICAgICAgIFsobmdNb2RlbCldPVwiZGF0YS5tZXNzYWdlXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIG1lc3NhZ2UgaGVyZVwiXG4gICAgICA+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzdWdnZXN0aW9uIGxldC1yPVwicmVzdWx0XCIgbGV0LXQ9XCJ0ZXJtXCI+XG4gIDxuZ2ItaGlnaGxpZ2h0XG4gICAgW3RpdGxlXT1cInIuYmlibGlvZ3JhcGh5Py50aXRsZSB8fCByLmJpYmxpb2dyYXBoeT8uZG9jdW1lbnRET0kgfHwgci5iaWJsaW9ncmFwaHk/LnNjb3B1cyB8fCByLm5hbWVcIlxuICAgIFtyZXN1bHRdPVwici5iaWJsaW9ncmFwaHk/LnRpdGxlIHx8IHIuYmlibGlvZ3JhcGh5Py5kb2N1bWVudERPSSB8fCByLmJpYmxpb2dyYXBoeT8uc2NvcHVzIHx8IHIubmFtZVwiXG4gICAgW3Rlcm1dPVwidFwiXG4gID48L25nYi1oaWdobGlnaHQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3BhZGRlcj5cbiAgPGRpdiBjbGFzcz1cInB0LTFcIj48L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29udmVydFVuaXRzIGxldC12YWx1ZT1cInZhbHVlXCIgbGV0LXRlcm09XCJ0ZXJtXCIgbGV0LXVuaXRzPVwidW5pdHNcIj5cbiAgPGhlLXVuaXQtY29udmVydGVyIFt2YWx1ZV09XCJ2YWx1ZVwiIFt0ZXJtXT1cInRlcm1cIiBbdG9Vbml0c109XCJ1bml0c1wiPjwvaGUtdW5pdC1jb252ZXJ0ZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
506
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZm9ybS9maWxlcy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy1mb3JtL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRyxPQUFPLEtBQUssU0FBUyxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHekQsT0FBTyxFQUFzQixVQUFVLEVBQUUsUUFBUSxFQUFrQyxNQUFNLHNCQUFzQixDQUFDO0FBRWhILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxPQUFPLEVBRUwsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQ3hDLHFCQUFxQixFQUNyQyxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQ2xELG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLGNBQWMsRUFDN0QsWUFBWSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFDakgsNkJBQTZCLEVBQUUsc0JBQXNCLEVBQ3JELDhCQUE4QixFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFDdkUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQW9CLGFBQWEsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR2xILE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0SCxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcEIvRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBcUJsQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLFVBQVUsRUFBRSxPQUFPO0NBQ3BCLENBQUM7QUFDRixNQUFNLDZCQUE2QixHQUFHO0lBQ3BDLDZCQUE2QixFQUFFLDhCQUE4QixFQUFFLHlCQUF5QjtDQUN6RixDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFjLEVBQUUsRUFBRSxDQUFDLCtCQUN6QyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsSUFDekIsSUFBSSxLQUNQLElBQUksa0JBQ0YsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQ25CLElBQUksQ0FBQyxJQUFJLEtBRWQsQ0FBQztBQUVILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxFQUFtQyxFQUFFLEVBQUU7UUFBdkMsRUFBRSxpQkFBaUIsT0FBZ0IsRUFBWCxJQUFJLGNBQTVCLHFCQUE4QixDQUFGO0lBQVksT0FBQSxpQ0FDN0QsSUFBSSxHQUNKLENBQUMsQ0FBQSxpQkFBaUIsYUFBakIsaUJBQWlCLHVCQUFqQixpQkFBaUIsQ0FBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNsRyxDQUFBO0NBQUEsQ0FBQztBQUVILE1BQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDO0FBRTFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxPQUEwQyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQ2hHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLHFCQUFxQixJQUFJLElBQUksS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUluRyxNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQTJCLEVBQUUsR0FBVyxFQUFFLFFBQXVCLEVBQUUsRUFBRTtJQUMzRixNQUFNLHFCQUFxQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLHFCQUFxQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQU9GLE1BQU0sT0FBTyxrQkFBa0I7SUErSDdCLFlBQ1MsR0FBZSxFQUNkLGFBQThCLEVBQzlCLFlBQTRCO1FBRjdCLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDZCxrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBOUg5QixXQUFNLEdBQXVCLEVBQUUsQ0FBQztRQUlqQyxZQUFPLEdBQXNDLEVBQUUsQ0FBQztRQUN2RDs7V0FFRztRQUVJLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUMzQjs7V0FFRztRQUVJLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzlCOzs7V0FHRztRQUVJLG1DQUE4QixHQUFHLElBQUksQ0FBQztRQUdyQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7UUFFN0Qsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUUvQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO1FBRXZELGFBQVEsR0FBRyxRQUFRLENBQUM7UUFDcEIsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN4QixXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2QsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLHdCQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBSTFDLGVBQVUsR0FBb0IsRUFBRSxDQUFDO1FBRWpDLGNBQVMsR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFLFdBQ2hDLE9BQUEsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQSxFQUFBLENBQUM7UUFFbEcsdUJBQWtCLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBeUIsRUFBRSxFQUFFLENBQzdFLEtBQUssQ0FBQyxJQUFJLENBQ1Isb0JBQW9CLEVBQUUsRUFDdEIsU0FBUyxDQUNQLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUNsRyxDQUNGLENBQUM7UUFFSSx3QkFBbUIsR0FBRyxDQUFDLElBQWMsRUFBRSxJQUFZLEVBQUUsU0FBUyxHQUFHLEtBQUssRUFBRSxFQUFFLENBQ2hGLElBQUksQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLENBQUMsQ0FBQztZQUNsQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNSLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO2dCQUN6QyxJQUFJLEVBQUU7b0JBQ0osSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN2QixNQUFNLEVBQUU7d0JBQ04sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUM7d0JBQ3RDLHNCQUFzQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDO3dCQUMzQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQztxQkFDMUM7b0JBQ0Qsb0JBQW9CLEVBQUUsQ0FBQztpQkFDeEI7YUFDRixFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUxQixnQkFBVyxHQUFHLENBQUMsSUFBYyxFQUFFLGNBQTRCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBWSxFQUFFLFFBQXVCLEVBQUUsRUFBRTs7WUFDaEgsT0FBQSxDQUFDLENBQUEsTUFBQSxRQUFRLENBQUMsV0FBVywwQ0FBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDLENBQ25DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQ3ZFLENBQUMsQ0FBQyxDQUFDLENBQ0YsQ0FBQSxNQUFBLFFBQVEsQ0FBQyxXQUFXLDBDQUFFLFVBQVUsRUFBQyxDQUFDO2dCQUNoQyxFQUFFLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNuRCxjQUFjLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FDekQsQ0FDSixDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQzdDLENBQUE7U0FBQSxDQUFDO1FBRUksY0FBUyxHQUViO1lBQ0YsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFOztnQkFBQyxPQUFBLEVBQUUsQ0FDN0IsQ0FBQyxDQUFBLE1BQUEsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLFdBQVcsMENBQUUsTUFBTSxLQUFJLEVBQUUsQ0FBQztxQkFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztxQkFDaEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztxQkFDekQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDM0IsQ0FBQTthQUFBO1lBQ0QsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2xELENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNsRCxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1lBQ3hFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUNoRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDaEQsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUNyRSxJQUFJLENBQUMsTUFBTSxHQUFHLG9CQUFvQixDQUFDLENBQUM7Z0JBQ2xDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNSLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQzlGO1lBQ0QsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUN6RSxJQUFJLENBQUMsTUFBTSxHQUFHLG9CQUFvQixDQUFDLENBQUM7Z0JBQ2xDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNSLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLE9BQU8sS0FBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FDL0c7U0FDRixDQUFDO1FBQ0ssb0JBQWUsR0FBRyxDQUFDLE9BQWUsRUFBRSxXQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQXlCLEVBQUUsRUFBRSxDQUN2RyxLQUFLLENBQUMsSUFBSSxDQUNSLFlBQVksQ0FBQyxXQUFXLEtBQUsscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQzdELG9CQUFvQixFQUFFLEVBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNkLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELE9BQU8sQ0FBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsUUFBUSxLQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFELEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ1gsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQ2xDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBRSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUM3RCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FDcEMsQ0FBQyxDQUFDO2dCQUNILEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUNILENBQUM7SUFNQSxDQUFDO0lBRUwsUUFBUTtRQUNOLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBZ0IsQ0FBQztRQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNqQyxFQUFFLEVBQUUsVUFBVSxFQUFFO1lBQ2hCLE1BQU07WUFDTixVQUFVO1lBQ1YsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSyxDQUFDLElBQUk7WUFDM0IsT0FBTyxFQUFFLEVBQUU7WUFDWCxHQUFHLEVBQUUsRUFBRTtZQUNQLEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDekIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDOUIsVUFBVSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDbEMsV0FBVyxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUsRUFBRTtZQUNmLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDOUIsVUFBVSxFQUFFLEVBQUU7WUFDZCxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUM7U0FDekUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVNLFlBQVksQ0FBQyxLQUFhLEVBQUUsTUFBVztRQUM1QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxlQUFlLENBQUMsTUFBYyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBaUI7UUFDbkUsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxRQUF1Qjs7UUFDdEMsT0FBTyxRQUFRLElBQUksQ0FDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDN0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztZQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzthQUN6QixNQUFBLFFBQVEsQ0FBQyxXQUFXLDBDQUFFLEdBQUcsQ0FBQTtZQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU07WUFDckMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUVNLFVBQVUsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQWlCO1FBQ3BELE9BQU8sVUFBVSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBWSxpQkFBaUI7UUFDM0IsT0FBTztZQUNMLEdBQUcsa0JBQWtCO1lBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDOUUsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhO0lBRU4sY0FBYyxDQUFDLFFBQXVCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQzNFLENBQUM7SUFFTSxRQUFRLENBQUMsUUFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQWtCO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPO1NBQ1I7UUFDRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWCxNQUFNLEtBQUssR0FBcUIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakQsT0FBTztZQUNQLEtBQUssRUFBRSxLQUFLLElBQUksT0FBTztZQUN2QixRQUFRLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsTUFBTSxFQUFFO2dCQUNOLGVBQWUsRUFBRSxRQUFRLENBQUMsR0FBRzthQUM5QjtTQUNGLENBQUMsQ0FBQyxDQUFDO1lBQ0YsT0FBTztZQUNQLEtBQUssRUFBRSxLQUFLLElBQUksT0FBTztZQUN2QixRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7U0FDMUMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxRQUFRLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDekMsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDdkIsUUFBUSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsUUFBUSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxRQUF1QjtRQUN0QyxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUVNLFlBQVksQ0FBQyxRQUF1Qjs7UUFDekMsTUFBTSxLQUFLLEdBQUcsTUFBQSxRQUFRLENBQUMsS0FBSywwQ0FBRSxLQUFLLENBQUM7UUFDcEMsUUFBUSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDM0IsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNO0lBRUMsY0FBYyxDQUFDLENBQVE7UUFDNUIsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFO1lBQ2IsT0FBTztTQUNSO1FBQ0QsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7O1lBQ2QsTUFBTSxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEMsTUFBQSxDQUFDLENBQUMsTUFBTSwwQ0FBRSxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVNLGtCQUFrQixDQUFDLFFBQXVCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksUUFBUSxDQUFDLGtCQUFrQixDQUFDO0lBQzlFLENBQUM7SUFFTyxhQUFhLENBQUMsUUFBdUIsRUFBRSxLQUFhO1FBQzFELE1BQU0sVUFBVSxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2FBQ2hFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsUUFBdUIsRUFBRSxJQUFTLEVBQUUsUUFBa0IsRUFBRSxhQUFhLEdBQUcsSUFBSTtRQUN0RyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDcEYsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQ3BDLElBQUksQ0FBQyxPQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFRLENBQUMsSUFBSSxDQUFDLElBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQ3JGLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDUixnQkFBZ0IsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxRQUFRLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDM0UsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxRQUFRLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDL0UsTUFBTSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDL0IsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sa0JBQWtCLENBQUMsRUFBdUMsRUFBRSxRQUF1Qjs7WUFBaEUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFXLEVBQU4sSUFBSSxjQUFyQyw2QkFBdUMsQ0FBRjtRQUM3RCxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ1Ysa0NBQWtDO1lBQ2xDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLGtCQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQUEsUUFBUSxDQUFDLFdBQVcsMENBQUUsSUFBSSxFQUFFLElBQUksSUFBSyxJQUFJLEdBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMvRztZQUNFLCtCQUErQjtZQUMvQixJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsa0JBQUksSUFBSSxFQUFFLEVBQUUsSUFBSyxJQUFJLEdBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDakUsb0NBQW9DO2dCQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FDdkMsQ0FBQztJQUNOLENBQUM7SUFFTSxhQUFhLENBQUMsS0FBb0I7UUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUNuQyxJQUFJLENBQUMsT0FBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUNqRixDQUFDO1FBQ0YsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxLQUFvQixFQUFFLFFBQXVCO1FBQ3RFLE1BQU0sS0FBSyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUM1QixNQUFNLFdBQVcsR0FBa0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDeEUsV0FBVyxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM5QixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDakQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6RCxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQy9DLHFEQUFxRDtRQUNyRCxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEQsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLGdCQUFnQixDQUFDLEtBQW9CLEVBQUUsRUFBRSxHQUFHLEVBQWlCO1FBQ2xFLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ25CLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqRCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QixLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEMscURBQXFEO1FBQ3JELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRCxrREFBa0Q7UUFDbEQsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU8sd0JBQXdCLENBQUMsS0FBb0IsRUFBRSxZQUFvQixFQUFFLFFBQWdCO1FBQzNGLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqRCxlQUFlLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxlQUFlLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUQscURBQXFEO1FBQ3JELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsS0FBb0IsRUFBRSxFQUFFLEdBQUcsRUFBaUI7UUFDbEUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLGtCQUFrQixDQUFDLEtBQW9CLEVBQUUsRUFBRSxHQUFHLEVBQWlCO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTSxlQUFlLENBQUMsS0FBVSxFQUFFLFFBQXVCOztRQUN4RCxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FDaEQsSUFBSSxDQUFDLElBQUssRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxNQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FDcEUsQ0FBQztRQUVGLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQixLQUFLLEdBQUcsU0FBUyxDQUFDO1NBQ25CO2FBQ0k7WUFDSCxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUN2QixRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztTQUN6QjtRQUVELE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELGlEQUFpRDtRQUNqRCxJQUFJLE1BQUEsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLEVBQUUsMENBQUUsVUFBVSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDbkQsUUFBUSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNoRDtRQUNELDBCQUEwQjtRQUMxQixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQix3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU8sa0JBQWtCLENBQUMsUUFBdUIsRUFBRSxHQUFXLEVBQUUsR0FBZTtRQUM5RSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDekUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDbEUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN4RSxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0csY0FBYyxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLGtCQUFrQixDQUFDLFFBQXVCO1FBQy9DLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sV0FBVyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN0RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsV0FBVyxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsT0FBTyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEUsQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUF1QjtRQUN4QyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxXQUFZLENBQUM7UUFDN0MsUUFBUSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNoRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLElBQUssRUFBRSxJQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU8seUJBQXlCLENBQUMsUUFBdUIsRUFBRSxLQUFnQztRQUN6RixNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEUsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFFLE9BQU87WUFDTCxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUMzRCxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUM5RCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU07SUFFTixJQUFXLE9BQU87UUFDaEIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwSCxDQUFDO0lBRU0sZUFBZSxDQUFDLEVBQUUsR0FBRyxFQUFpQjtRQUMzQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTztTQUN4QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsVUFBVSxFQUFFLFdBQVc7U0FDeEIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNO1NBQ3ZDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVNLGtCQUFrQixDQUFDLFFBQVE7UUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7UUFDcEMsT0FBTyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFFBQVMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxzQkFBc0I7SUFFZix1QkFBdUIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQWlCO1FBQy9ELE1BQU0sV0FBVyxHQUFHLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FBRyxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sV0FBVyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDOUMsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQTRCO1FBQ3JELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyw0QkFBNkIsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLGlDQUM5QyxNQUFNLENBQUMsS0FBSyxLQUNmLFlBQVksRUFBRSxLQUFLLElBQ25CLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLDRCQUE2QixFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3RSxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQXNCO1FBQ3pDLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsMkJBQTJCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyw0QkFBNkIsa0JBQzdGLE9BQU8sRUFBRSxRQUFRLENBQUMsTUFBTSxJQUNyQixLQUFLLEdBQ1AsQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLDJCQUEyQjtRQUNwQyxPQUFPLElBQUksQ0FBQyw0QkFBNkIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVNLDRCQUE0QixDQUFDLEtBQStDO1FBQ2pGLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQzFDLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBd0IsQ0FBQyxDQUM5QyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztJQUVELFlBQVk7SUFFQyxjQUFjLENBQUMsUUFBdUI7O1lBQ2pELE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztZQUMvRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RHLENBQUM7S0FBQTtJQUVELHNCQUFzQjtJQUVmLDZCQUE2QixDQUFDLFFBQXVCO1FBQzFELE9BQU8sNkJBQTZCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU0sc0JBQXNCLENBQUMsUUFBdUI7UUFDbkQsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNuRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxrQkFBa0I7SUFFWCw4QkFBOEIsQ0FBQyxRQUF1QjtRQUMzRCxPQUFPLDhCQUE4QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVNLHVCQUF1QixDQUFDLFFBQXVCO1FBQ3BELE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDckUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsa0JBQWtCO0lBRVgsb0JBQW9CLENBQUMsUUFBdUI7UUFDakQsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsUUFBdUI7UUFDdkQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUM3QixNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEUsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLFlBQVksYUFBWixZQUFZLHVCQUFaLFlBQVksQ0FBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsS0FBSyxDQUFDO1FBQzFCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELGtCQUFrQjtJQUVYLHNCQUFzQixDQUFDLEtBQW9CLEVBQUUsRUFBVTtRQUM1RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFNUMsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQ25DLElBQUksQ0FBQyxPQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQ2pGLENBQUM7UUFDRixXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUM1RCxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFFekUsdUJBQXVCO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLEdBQUcsV0FBVyxDQUFDLE9BQU8sT0FBTyxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsSUFBSSxpQkFBaUIsQ0FDMUYsSUFBSSxDQUFDLE9BQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQ3RFLENBQUM7UUFDRixZQUFZLENBQUMsS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3hELFlBQVksQ0FBQyxVQUFVLEdBQUcsbUJBQW1CLENBQzNDLElBQUksQ0FBQyxPQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFRLENBQUMsSUFBSSxDQUFDLElBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FDOUUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLGNBQWMsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUU5RCw4Q0FBOEM7UUFDOUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ2pDLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ25CLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUU5QixLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7O2dIQTdoQlUsa0JBQWtCO29HQUFsQixrQkFBa0IsMGFDckUvQiw4cjFCQXVtQkE7NEZEbGlCYSxrQkFBa0I7a0JBTDlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFdBQVcsRUFBRSw2QkFBNkI7b0JBQzFDLFNBQVMsRUFBRSxDQUFDLDZCQUE2QixDQUFDO2lCQUMzQzs0SkFHUyxPQUFPO3NCQURkLEtBQUs7Z0JBR0UsTUFBTTtzQkFEYixLQUFLO2dCQUdDLElBQUk7c0JBRFYsS0FBSztnQkFHQyxPQUFPO3NCQURiLEtBQUs7Z0JBTUMsUUFBUTtzQkFEZCxLQUFLO2dCQUdDLFNBQVM7c0JBRGYsS0FBSztnQkFHQyxZQUFZO3NCQURsQixLQUFLO2dCQU1DLGNBQWM7c0JBRHBCLEtBQUs7Z0JBT0MsOEJBQThCO3NCQURwQyxLQUFLO2dCQUlFLFVBQVU7c0JBRGpCLE1BQU07Z0JBR0MsaUJBQWlCO3NCQUR4QixNQUFNO2dCQUdDLGNBQWM7c0JBRHJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBtZXJnZU1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgKiBhcyBwbHVyYWxpemUgZnJvbSAncGx1cmFsaXplJztcbmltcG9ydCB7IG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuY29uc3QgZ2V0ID0gcmVxdWlyZSgnbG9kYXNoLmdldCcpO1xuY29uc3Qgc2V0ID0gcmVxdWlyZSgnbG9kYXNoLnNldCcpO1xuaW1wb3J0IHsgSlNPTiBhcyBIZXN0aWFKc29uLCBTY2hlbWFUeXBlLCBOb2RlVHlwZSwgQmlibGlvZ3JhcGh5LCBTb3VyY2UsIFByb3BlcnR5IH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IHsgZGVmaW5pdGlvbnMsIGRlZmluaXRpb24gfSBmcm9tICdAaGVzdGlhLWVhcnRoL2pzb24tc2NoZW1hJztcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgSUVycm9yUHJvcGVydHksIElOb2RlUHJvcGVydHksXG4gIGZvcm1hdFByb3BlcnR5RXJyb3IsIHByb3BlcnR5RXJyb3IsIGhhc0Vycm9yLCBoYXNXYXJuaW5nLFxuICBzdWdnZXN0aW9uVHlwZSwgZGVmYXVsdFN1Z2dlc3Rpb25UeXBlLFxuICByZWN1cnNpdmVQcm9wZXJ0aWVzLCB0eXBlVG9OZXdQcm9wZXJ0eSwgcHJvcGVydHlJZCxcbiAgaXNBZGRQcm9wZXJ0eUVuYWJsZWQsIG5vZGVBdmFpbGFibGVQcm9wZXJ0aWVzLCBzb3J0UHJvcGVydGllcyxcbiAgZ3JvdXBDaGFuZ2VkLCBwYXJlbnRQcm9wZXJ0eSwgc2libGluZ1Byb3BlcnR5LCB1cGRhdGVQcm9wZXJ0aWVzLCByZWZyZXNoUHJvcGVydHlLZXlzLCBrZXlUb0RhdGFQYXRoLCBmaW5kUHJvcGVydHksXG4gIGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb25FbmFibGVkLCBjYWxjdWxhdGVDeWNsZUR1cmF0aW9uLFxuICBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZUVuYWJsZWQsIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlLCBwYXJzZU5ld1ZhbHVlXG59IGZyb20gJy4uL2ZpbGVzLWZvcm0ubW9kZWwnO1xuaW1wb3J0IHsgSVZhbGlkYXRpb25FcnJvciwgZXJyb3JIYXNFcnJvciwgZXJyb3JIYXNXYXJuaW5nLCBmaWx0ZXJFcnJvciwgZm9ybWF0RXJyb3IgfSBmcm9tICcuLi9maWxlcy1lcnJvci5tb2RlbCc7XG5pbXBvcnQgeyBIZVVzZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL3VzZXJzL3VzZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGVTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VhcmNoL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7IG1hdGNoVHlwZSwgbWF0Y2hQaHJhc2VRdWVyeSwgbWF0Y2hQaHJhc2VQcmVmaXhRdWVyeSwgbWF0Y2hCb29sUHJlZml4UXVlcnkgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IHNhZmVKU09OUGFyc2UsIGNvcHlPYmplY3QgfSBmcm9tICcuLi8uLi9jb21tb24vdXRpbHMnO1xuXG5jb25zdCBNSU5fVFlQRUFIRUFEX0xFTkdUSCA9IDI7XG5jb25zdCBwb3B1bGF0ZVRlcm1GaWVsZHMgPSBbXG4gICd0ZXJtVHlwZScsICd1bml0cydcbl07XG5jb25zdCBwb3B1bGF0ZVRlcm1EZWZhdWx0UHJvcGVydGllcyA9IFtcbiAgJ2RlZmF1bHRQcm9wZXJ0aWVzLnRlcm0ubmFtZScsICdkZWZhdWx0UHJvcGVydGllcy50ZXJtLnVuaXRzJywgJ2RlZmF1bHRQcm9wZXJ0aWVzLnZhbHVlJ1xuXTtcblxuY29uc3QgZm9ybWF0UHJvcGVydHkgPSAocHJvcDogUHJvcGVydHkpID0+ICh7XG4gICdAdHlwZSc6IFNjaGVtYVR5cGUuUHJvcGVydHksXG4gIC4uLnByb3AsXG4gIHRlcm06IHtcbiAgICAnQHR5cGUnOiBOb2RlVHlwZS5UZXJtLFxuICAgIC4uLnByb3AudGVybVxuICB9XG59KTtcblxuY29uc3QgZm9ybWF0U3VnZ2VzdGlvbiA9ICh7IGRlZmF1bHRQcm9wZXJ0aWVzLCAuLi5ub2RlIH06IGFueSkgPT4gKHtcbiAgLi4ubm9kZSxcbiAgLi4uKGRlZmF1bHRQcm9wZXJ0aWVzPy5sZW5ndGggPyB7IGRlZmF1bHRQcm9wZXJ0aWVzOiBkZWZhdWx0UHJvcGVydGllcy5tYXAoZm9ybWF0UHJvcGVydHkpIH0gOiB7fSlcbn0pO1xuXG5jb25zdCBmb3JtYXRMaW5rTm9kZXNQcmVmaXggPSAnTGluayB3aXRoJztcblxuY29uc3QgZm9ybWF0TGlua05vZGVzU3VnZ2VzdGlvbnMgPSAobm9kZU1hcDogeyBbdHlwZSBpbiBOb2RlVHlwZV0/OiBzdHJpbmdbXSB9LCB0eXBlOiBOb2RlVHlwZSkgPT5cbiAgKG5vZGVNYXBbdHlwZV0gfHwgW10pLm1hcChpZCA9PiAoeyB0eXBlLCBpZCwgbmFtZTogYCR7Zm9ybWF0TGlua05vZGVzUHJlZml4fSAke3R5cGV9OiAke2lkfWAgfSkpO1xuXG50eXBlIHN1Z2dlc3RGdW5jID0gKHRlcm06IHN0cmluZywgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+IE9ic2VydmFibGU8YW55W10+O1xuXG5jb25zdCBpbnNlcnRQcm9wZXJ0eSA9IChwcm9wZXJ0aWVzOiBJTm9kZVByb3BlcnR5W10sIGtleTogc3RyaW5nLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4ge1xuICBjb25zdCBleGlzdGluZ1Byb3BlcnR5SW5kZXggPSBwcm9wZXJ0aWVzLmZpbmRJbmRleCh2ID0+IHYuZnVsbEtleSA9PT0ga2V5KTtcbiAgZXhpc3RpbmdQcm9wZXJ0eUluZGV4ID49IDAgPyAocHJvcGVydGllc1tleGlzdGluZ1Byb3BlcnR5SW5kZXhdID0gcHJvcGVydHkpIDogcHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgcHJvcGVydGllcy5zb3J0KHNvcnRQcm9wZXJ0aWVzKTtcbiAgcmV0dXJuIHByb3BlcnRpZXM7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1maWxlcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlcy1mb3JtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRmlsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBzY2hlbWFzPzogZGVmaW5pdGlvbnM7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgZXJyb3JzOiBJVmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgQElucHV0KClcbiAgcHVibGljIG5vZGU/OiBIZXN0aWFKc29uPFNjaGVtYVR5cGU+O1xuICBASW5wdXQoKVxuICBwdWJsaWMgbm9kZU1hcDogeyBbdHlwZSBpbiBOb2RlVHlwZV0/OiBzdHJpbmdbXSB9ID0ge307XG4gIC8qKlxuICAgKiBBbGxvdyBlZGl0aW5nIG5vZGVzIChgZmFsc2VgIGZvciByZWFkb25seSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZWRpdGFibGUgPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yTW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGVlcEVkaXRhYmxlID0gdHJ1ZTtcbiAgLyoqXG4gICAqIENhbiBlZGl0IGVycm9ycy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlcnJvcnNFZGl0YWJsZSA9IGZhbHNlO1xuICAvKipcbiAgICogV2hlbiBzZWxlY3RpbmcgdGVybXMsIHdpbGwgc2hvdyBkZWZhdWx0IHByb3BlcnRpZXMgb3Igbm90LlxuICAgKiBTaG91bGQgYmUgYGZhbHNlYCB3aGVuIHVzaW5nIHNjaGVtYSB2YWxpZGF0aW9uLCBhcyBvbmx5IHRoZSBgbmFtZWAgd291bGQgYmUgYWRkZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1N1Z2dlc3RlZERlZmF1bHRQcm9wZXJ0aWVzID0gdHJ1ZTtcblxuICBAT3V0cHV0KClcbiAgcHJpdmF0ZSBub2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogYW55IH0+KCk7XG4gIEBPdXRwdXQoKVxuICBwcml2YXRlIG5vZGVFcm9yclJlc29sdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKVxuICBwcml2YXRlIG5vZGVFcnJvckFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJVmFsaWRhdGlvbkVycm9yPigpO1xuXG4gIHB1YmxpYyBOb2RlVHlwZSA9IE5vZGVUeXBlO1xuICBwdWJsaWMgU2NoZW1hVHlwZSA9IFNjaGVtYVR5cGU7XG4gIHB1YmxpYyBpc09wZW4gPSB0cnVlO1xuICBwdWJsaWMgbWFwVmlzaWJsZSA9IGZhbHNlO1xuICBwdWJsaWMgcGx1cmFsaXplID0gcGx1cmFsaXplO1xuICBwdWJsaWMgZm9ybWF0UHJvcGVydHlFcnJvciA9IGZvcm1hdFByb3BlcnR5RXJyb3I7XG4gIHB1YmxpYyBtYXBEcmF3aW5nUHJvcGVydHk/OiBJTm9kZVByb3BlcnR5O1xuICBwdWJsaWMgYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eT86IElOb2RlUHJvcGVydHk7XG4gIHB1YmxpYyBub2RlUHJvcGVydHk/OiBJTm9kZVByb3BlcnR5O1xuICBwdWJsaWMgcHJvcGVydGllczogSU5vZGVQcm9wZXJ0eVtdID0gW107XG5cbiAgcHVibGljIGZvcm1hdHRlciA9ICh2YWx1ZTogYW55KSA9PlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyAoJ2JpYmxpb2dyYXBoeScgaW4gdmFsdWUgPyB2YWx1ZS5iaWJsaW9ncmFwaHk/LnRpdGxlIDogdmFsdWUubmFtZSkgOiB2YWx1ZTtcblxuICBwdWJsaWMgc3VnZ2VzdE5ld1Byb3BlcnR5ID0gKGZ1bGxLZXk6IHN0cmluZykgPT4gKHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4pID0+XG4gICAgdGV4dCQucGlwZShcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBzd2l0Y2hNYXAoXG4gICAgICAgIHRlcm0gPT4gb2YodGhpcy5uZXdQcm9wZXJ0aWVzKGZpbmRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIGZ1bGxLZXkpIHx8IHRoaXMubm9kZVByb3BlcnR5LCB0ZXJtKSlcbiAgICAgIClcbiAgICApO1xuXG4gIHByaXZhdGUgc3VnZ2VzdEV4aXN0aW5nTm9kZSA9ICh0eXBlOiBOb2RlVHlwZSwgdGVybTogc3RyaW5nLCB1bmlxdWVLZXkgPSAnQGlkJykgPT5cbiAgICB0ZXJtLmxlbmd0aCA8IE1JTl9UWVBFQUhFQURfTEVOR1RIID9cbiAgICAgIG9mKFtdKSA6XG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdCh0ZXJtLCB0eXBlLCBbXSwge1xuICAgICAgICBib29sOiB7XG4gICAgICAgICAgbXVzdDogW21hdGNoVHlwZSh0eXBlKV0sXG4gICAgICAgICAgc2hvdWxkOiBbXG4gICAgICAgICAgICBtYXRjaFBocmFzZVF1ZXJ5KHRlcm0sIDEwMCwgdW5pcXVlS2V5KSxcbiAgICAgICAgICAgIG1hdGNoUGhyYXNlUHJlZml4UXVlcnkodGVybSwgMjAsIHVuaXF1ZUtleSksXG4gICAgICAgICAgICBtYXRjaEJvb2xQcmVmaXhRdWVyeSh0ZXJtLCAxMCwgdW5pcXVlS2V5KVxuICAgICAgICAgIF0sXG4gICAgICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICAgICAgfVxuICAgICAgfSwgNSwgdGhpcy5zdWdnZXN0VGVybUZpZWxkcyk7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0Tm9kZSA9ICh0eXBlOiBOb2RlVHlwZSwgc3VnZ2VzdERlZmF1bHQ/OiBzdWdnZXN0RnVuYykgPT4gKHRlcm06IHN0cmluZywgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+XG4gICAgKHByb3BlcnR5LnN1Z2dlc3Rpb25zPy5pc1VuaXF1ZUtleSA/IChcbiAgICAgIHRoaXMuc3VnZ2VzdEV4aXN0aW5nTm9kZSh0eXBlLCB0ZXJtLCBwcm9wZXJ0eS5zdWdnZXN0aW9ucy5pc1VuaXF1ZUtleSlcbiAgICApIDogKFxuICAgICAgcHJvcGVydHkuc3VnZ2VzdGlvbnM/LmlzTGlua05vZGUgP1xuICAgICAgICBvZihmb3JtYXRMaW5rTm9kZXNTdWdnZXN0aW9ucyh0aGlzLm5vZGVNYXAsIHR5cGUpKSA6IChcbiAgICAgICAgICBzdWdnZXN0RGVmYXVsdCA/IHN1Z2dlc3REZWZhdWx0KHRlcm0sIHByb3BlcnR5KSA6IG9mKFtdKVxuICAgICAgICApXG4gICAgKSkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5tYXAoZm9ybWF0U3VnZ2VzdGlvbikpXG4gICAgKTtcblxuICBwcml2YXRlIHN1Z2dlc3Rlcjoge1xuICAgIFt0eXBlIGluIHN1Z2dlc3Rpb25UeXBlXT86IHN1Z2dlc3RGdW5jO1xuICB9ID0ge1xuICAgIGRlZmF1bHQ6ICh0ZXJtLCBwcm9wZXJ0eSkgPT4gb2YoXG4gICAgICAocHJvcGVydHk/LnN1Z2dlc3Rpb25zPy52YWx1ZXMgfHwgW10pXG4gICAgICAgIC5tYXAodiA9PiBgJHt2fWApXG4gICAgICAgIC5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgLm1hcChuYW1lID0+ICh7IG5hbWUgfSkpXG4gICAgKSxcbiAgICBbTm9kZVR5cGUuQWN0b3JdOiB0aGlzLnN1Z2dlc3ROb2RlKE5vZGVUeXBlLkFjdG9yKSxcbiAgICBbTm9kZVR5cGUuQ3ljbGVdOiB0aGlzLnN1Z2dlc3ROb2RlKE5vZGVUeXBlLkN5Y2xlKSxcbiAgICBbTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudF06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCksXG4gICAgW05vZGVUeXBlLk9yZ2FuaXNhdGlvbl06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuT3JnYW5pc2F0aW9uKSxcbiAgICBbTm9kZVR5cGUuU2l0ZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuU2l0ZSksXG4gICAgW05vZGVUeXBlLlNvdXJjZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuU291cmNlLCAodGVybSwgeyBrZXkgfSkgPT5cbiAgICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgICBvZihbXSkgOlxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdFNvdXJjZSh0ZXJtLCA1LCBbYGJpYmxpb2dyYXBoeS4ke2tleX1gXSwgW2BiaWJsaW9ncmFwaHkuJHtrZXl9YF0pXG4gICAgKSxcbiAgICBbTm9kZVR5cGUuVGVybV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuVGVybSwgKHRlcm0sIHsgc3VnZ2VzdGlvbnMgfSkgPT5cbiAgICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgICBvZihbXSkgOlxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdCh0ZXJtLCBOb2RlVHlwZS5UZXJtLCBzdWdnZXN0aW9ucz8ucXVlcmllcyB8fCBbXSwgbnVsbCwgNSwgdGhpcy5zdWdnZXN0VGVybUZpZWxkcylcbiAgICApXG4gIH07XG4gIHB1YmxpYyBwcm9wZXJ0eVN1Z2dlc3QgPSAoZnVsbEtleTogc3RyaW5nLCBzdWdnZXN0VHlwZTogc3VnZ2VzdGlvblR5cGUpID0+ICh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KSA9PlxuICAgIHRleHQkLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoc3VnZ2VzdFR5cGUgPT09IGRlZmF1bHRTdWdnZXN0aW9uVHlwZSA/IDAgOiAzMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIG1lcmdlTWFwKHRlcm0gPT4ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IGZpbmRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIGZ1bGxLZXkpO1xuICAgICAgICByZXR1cm4gcHJvcGVydHk/LmVkaXRhYmxlICYmIHN1Z2dlc3RUeXBlIGluIHRoaXMuc3VnZ2VzdGVyID9cbiAgICAgICAgICBvZih0ZXJtKS5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHByb3BlcnR5LmxvYWRpbmcgPSB0cnVlKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnN1Z2dlc3RlcltzdWdnZXN0VHlwZV0hKHRlcm0sIHByb3BlcnR5KSksXG4gICAgICAgICAgICB0YXAoKCkgPT4gcHJvcGVydHkubG9hZGluZyA9IGZhbHNlKVxuICAgICAgICAgICkgOlxuICAgICAgICAgIG9mKFtdKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IEhlU2VhcmNoU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJzU2VydmljZTogSGVVc2Vyc1NlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBzY2hlbWFUeXBlID0gdGhpcy5ub2RlIS50eXBlIHx8IHRoaXMubm9kZSFbJ0B0eXBlJ107XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5zY2hlbWFzID8gdGhpcy5zY2hlbWFzW3NjaGVtYVR5cGVdIDoge30gYXMgZGVmaW5pdGlvbjtcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmVycm9ycy5maWx0ZXIoZmlsdGVyRXJyb3IpO1xuICAgIGNvbnN0IGVycm9yID0gcHJvcGVydHlFcnJvcihlcnJvcnMpKCcnKTtcbiAgICB0aGlzLm5vZGVQcm9wZXJ0eSA9IHRoaXMuc2NoZW1hcyA/IHtcbiAgICAgIGlkOiBwcm9wZXJ0eUlkKCksXG4gICAgICBzY2hlbWEsXG4gICAgICBzY2hlbWFUeXBlLFxuICAgICAgZWRpdGFibGU6ICEhdGhpcy5ub2RlIS50eXBlLFxuICAgICAgZnVsbEtleTogJycsXG4gICAgICBrZXk6ICcnLFxuICAgICAgdmFsdWU6IHt9LFxuICAgICAgZXJyb3I6IGZvcm1hdEVycm9yKGVycm9yKSxcbiAgICAgIGhhc0Vycm9yOiBlcnJvckhhc0Vycm9yKGVycm9yKSxcbiAgICAgIGhhc1dhcm5pbmc6IGVycm9ySGFzV2FybmluZyhlcnJvciksXG4gICAgICBzdWdnZXN0aW9uczoge30sXG4gICAgICBuZXdQcm9wZXJ0eToge30sXG4gICAgICBuZXdFcnJvcjogeyBsZXZlbDogJ3dhcm5pbmcnIH0sXG4gICAgICBwcm9wZXJ0aWVzOiBbXSxcbiAgICAgIGFkZFByb3BlcnR5RW5hYmxlZDogaXNBZGRQcm9wZXJ0eUVuYWJsZWQodGhpcy5ub2RlISwgc2NoZW1hVHlwZSwgc2NoZW1hKVxuICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjdXJzZXIgPSByZWN1cnNpdmVQcm9wZXJ0aWVzKHRoaXMuc2NoZW1hcyEsIGVycm9ycywgc2NoZW1hLCB0aGlzLmRlZXBFZGl0YWJsZSk7XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gcmVjdXJzZXIodGhpcy5ub2RlKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlciwgX3ZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeVByb3BlcnR5KF9pbmRleDogbnVtYmVyLCB7IGlkLCBmdWxsS2V5IH06IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gW2Z1bGxLZXksIGlkXS5qb2luKCdfJyk7XG4gIH1cblxuICBwdWJsaWMgaGFzQWRkb25zKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHByb3BlcnR5ICYmIChcbiAgICAgIHRoaXMuZW5hYmxlQWRkRXJyb3IocHJvcGVydHkpIHx8XG4gICAgICAodGhpcy5lZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZSkgfHxcbiAgICAgIHRoaXMuYWRkUHJvcGVydHlFbmFibGVkKHByb3BlcnR5KSB8fFxuICAgICAgdGhpcy5pc1JlcXVpcmVkKHByb3BlcnR5KSB8fFxuICAgICAgcHJvcGVydHkuZXh0ZXJuYWxVcmw/LnVybCB8fFxuICAgICAgdGhpcy5tYXBEcmF3aW5nTW9kZXMocHJvcGVydHkpLmxlbmd0aCB8fFxuICAgICAgdGhpcy51bml0Q29udmVydGVyRW5hYmxlZChwcm9wZXJ0eSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGlzUmVxdWlyZWQoeyB2YWx1ZSwgaXNSZXF1aXJlZCB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIGlzUmVxdWlyZWQgJiYgaXNFbXB0eSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBzdWdnZXN0VGVybUZpZWxkcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4ucG9wdWxhdGVUZXJtRmllbGRzLFxuICAgICAgLi4uKHRoaXMuc2hvd1N1Z2dlc3RlZERlZmF1bHRQcm9wZXJ0aWVzID8gcG9wdWxhdGVUZXJtRGVmYXVsdFByb3BlcnRpZXMgOiBbXSlcbiAgICBdO1xuICB9XG5cbiAgLy8gLS0tIEVycm9yc1xuXG4gIHB1YmxpYyBlbmFibGVBZGRFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiB0aGlzLmVycm9yc0VkaXRhYmxlICYmICFwcm9wZXJ0eS5oYXNFcnJvciAmJiAhcHJvcGVydHkuaGFzV2FybmluZztcbiAgfVxuXG4gIHB1YmxpYyBhZGRFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgeyBtZXNzYWdlLCBsZXZlbCB9OiBJRXJyb3JQcm9wZXJ0eSkge1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gcHJvcGVydHkuZnVsbEtleS5zcGxpdCgnLicpO1xuICAgIGtleXMucG9wKCk7XG4gICAgY29uc3QgZXJyb3I6IElWYWxpZGF0aW9uRXJyb3IgPSBwcm9wZXJ0eS5pc0FkZGVkID8ge1xuICAgICAgbWVzc2FnZSxcbiAgICAgIGxldmVsOiBsZXZlbCB8fCAnZXJyb3InLFxuICAgICAgZGF0YVBhdGg6IGtleVRvRGF0YVBhdGgoa2V5cy5qb2luKCcuJykpLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIG1pc3NpbmdQcm9wZXJ0eTogcHJvcGVydHkua2V5XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBsZXZlbDogbGV2ZWwgfHwgJ2Vycm9yJyxcbiAgICAgIGRhdGFQYXRoOiBrZXlUb0RhdGFQYXRoKHByb3BlcnR5LmZ1bGxLZXkpXG4gICAgfTtcbiAgICBwcm9wZXJ0eS5uZXdFcnJvciA9IHsgbGV2ZWw6ICd3YXJuaW5nJyB9O1xuICAgIHByb3BlcnR5LmVycm9yID0gZXJyb3I7XG4gICAgcHJvcGVydHkuaGFzRXJyb3IgPSBlcnJvckhhc0Vycm9yKGVycm9yKTtcbiAgICBwcm9wZXJ0eS5oYXNXYXJuaW5nID0gZXJyb3JIYXNXYXJuaW5nKGVycm9yKTtcbiAgICB0aGlzLm5vZGVFcnJvckFkZGVkLmVtaXQoZXJyb3IpO1xuICB9XG5cbiAgcHVibGljIGVkaXRFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHByb3BlcnR5Lm5ld0Vycm9yID0gcHJvcGVydHkuZXJyb3I7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUVycm9yKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSBwcm9wZXJ0eS5lcnJvcj8uaW5kZXg7XG4gICAgcHJvcGVydHkuZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgcHJvcGVydHkuaGFzRXJyb3IgPSBoYXNFcnJvcihwcm9wZXJ0eS5wcm9wZXJ0aWVzKTtcbiAgICBwcm9wZXJ0eS5oYXNXYXJuaW5nID0gaGFzV2FybmluZyhwcm9wZXJ0eS5wcm9wZXJ0aWVzKTtcbiAgICB0aGlzLm5vZGVFcm9yclJlc29sdmVkLmVtaXQoaW5kZXgpO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eS5mdWxsS2V5KTtcbiAgfVxuXG4gIC8vIC0tLVxuXG4gIHB1YmxpYyB0eXBlYWhlYWRGb2N1cyhlOiBFdmVudCkge1xuICAgIGlmIChlLmJ1YmJsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBuZXcgRXZlbnQoJ2lucHV0Jyk7XG4gICAgICBlLnRhcmdldD8uZGlzcGF0Y2hFdmVudChpbnB1dEV2ZW50KTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0YWJsZSAmJiAhdGhpcy5lcnJvcnNFZGl0YWJsZSAmJiBwcm9wZXJ0eS5hZGRQcm9wZXJ0eUVuYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIG5ld1Byb3BlcnRpZXMocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGZpZWxkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gbm9kZUF2YWlsYWJsZVByb3BlcnRpZXModGhpcy5ub2RlISwgcHJvcGVydHkpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcihwcm9wID0+IHByb3AudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWVsZC50b0xvd2VyQ2FzZSgpKSlcbiAgICAgIC5tYXAobmFtZSA9PiAoeyBuYW1lLCBwcm9wOiBwcm9wZXJ0aWVzW25hbWVdIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgZGF0YTogYW55LCBlZGl0YWJsZT86IGJvb2xlYW4sIHJlcGxhY2VQYXJlbnQgPSB0cnVlKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcmVwbGFjZVBhcmVudCA/IHBhcmVudFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpIDogcHJvcGVydHk7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHJlY3Vyc2l2ZVByb3BlcnRpZXMoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBbXSwgdGhpcy5zY2hlbWFzIVt0aGlzLm5vZGUhLnR5cGVdLCB0aGlzLmRlZXBFZGl0YWJsZSwgcGFyZW50LmZ1bGxLZXlcbiAgICApKGRhdGEpO1xuICAgIHVwZGF0ZVByb3BlcnRpZXMoeyBwcm9wZXJ0aWVzIH0sIHByb3AgPT4ge1xuICAgICAgcHJvcC5lZGl0YWJsZSA9IHR5cGVvZiBlZGl0YWJsZSA9PT0gJ3VuZGVmaW5lZCcgPyBwcm9wLmVkaXRhYmxlIDogZWRpdGFibGU7XG4gICAgICByZXR1cm4gcHJvcDtcbiAgICB9KTtcbiAgICBwYXJlbnQuZWRpdGFibGUgPSB0eXBlb2YgZWRpdGFibGUgPT09ICd1bmRlZmluZWQnID8gcGFyZW50LmVkaXRhYmxlIDogZWRpdGFibGU7XG4gICAgcGFyZW50LnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIHBhcmVudC52YWx1ZSA9IGRhdGE7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKGRhdGEsIHBhcmVudCk7XG4gIH1cblxuICBwdWJsaWMgc3VnZ2VzdGlvblNlbGVjdGVkKHsgJ0BpZCc6IF9pZCwgbmFtZSwgdHlwZSwgaWQsIC4uLmRhdGEgfSwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gX2lkID9cbiAgICAgIC8vIHN1Z2dlc3Rpb25zIGZyb20gZXhpc3Rpbmcgbm9kZXNcbiAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eSwgeyAnQGlkJzogX2lkLCAnQHR5cGUnOiBwcm9wZXJ0eS5zdWdnZXN0aW9ucz8udHlwZSwgbmFtZSwgLi4uZGF0YSB9LCBmYWxzZSkgOlxuICAgICAgKFxuICAgICAgICAvLyBzdWdnZXN0aW9uIGZyb20gbGlua2VkIG5vZGVzXG4gICAgICAgIHR5cGUgJiYgaWQgP1xuICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YShwcm9wZXJ0eSwgeyB0eXBlLCBpZCwgLi4uZGF0YSB9LCB0cnVlKSA6XG4gICAgICAgICAgLy8gc3VnZ2VzdGlvbiBieSBuYW1lID0+IGVudW0gdmFsdWVzXG4gICAgICAgICAgdGhpcy5wcm9wZXJ0eUNoYW5nZWQobmFtZSwgcHJvcGVydHkpXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZEFycmF5R3JvdXAoYXJyYXk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5zY2hlbWFzIVthcnJheS5zY2hlbWFUeXBlXTtcbiAgICBjb25zdCB2YWx1ZSA9IGdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpO1xuICAgIGNvbnN0IG5ld1Byb3BlcnR5ID0gdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLCBwcm9wLCB2YWx1ZSwgYCR7YXJyYXkuZnVsbEtleX1bJHthcnJheS5wcm9wZXJ0aWVzLmxlbmd0aH1dYFxuICAgICk7XG4gICAgYXJyYXkucHJvcGVydGllcy5wdXNoKG5ld1Byb3BlcnR5KTtcbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogYXJyYXkuZnVsbEtleSwgdmFsdWUgfSk7XG4gICAgcmV0dXJuIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIGFycmF5LmZ1bGxLZXkpO1xuICB9XG5cbiAgcHVibGljIGR1cGxpY2F0ZUFycmF5R3JvdXAoYXJyYXk6IElOb2RlUHJvcGVydHksIHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSArcHJvcGVydHkua2V5O1xuICAgIGNvbnN0IG5ld1Byb3BlcnR5OiBJTm9kZVByb3BlcnR5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSkpO1xuICAgIG5ld1Byb3BlcnR5LmlkID0gcHJvcGVydHlJZCgpO1xuICAgIGNvbnN0IHZhbHVlID0gWy4uLmdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpXTtcbiAgICB2YWx1ZS5zcGxpY2UoaW5kZXgsIDAsIHNhZmVKU09OUGFyc2UobmV3UHJvcGVydHkudmFsdWUpKTtcbiAgICBhcnJheS5wcm9wZXJ0aWVzLnNwbGljZShpbmRleCwgMCwgbmV3UHJvcGVydHkpO1xuICAgIC8vIG5lZWQgdG8gY2hhbmdlIGtleSBvbiBldmVyeSBwcm9wZXJ0aWVzIHJlY3Vyc2l2ZWx5XG4gICAgcmVmcmVzaFByb3BlcnR5S2V5cyhhcnJheSk7XG4gICAgdGhpcy5ub2RlQ2hhbmdlLmVtaXQoeyBrZXk6IGFycmF5LmZ1bGxLZXksIHZhbHVlIH0pO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBhcnJheS5mdWxsS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBcnJheUdyb3VwKGFycmF5OiBJTm9kZVByb3BlcnR5LCB7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSAra2V5O1xuICAgIGNvbnN0IHZhbHVlID0gWy4uLmdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpXTtcbiAgICB2YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGFycmF5LnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAvLyBuZWVkIHRvIGNoYW5nZSBrZXkgb24gZXZlcnkgcHJvcGVydGllcyByZWN1cnNpdmVseVxuICAgIHJlZnJlc2hQcm9wZXJ0eUtleXMoYXJyYXkpO1xuICAgIHRoaXMubm9kZUNoYW5nZS5lbWl0KHsga2V5OiBhcnJheS5mdWxsS2V5LCB2YWx1ZSB9KTtcbiAgICAvLyBpZiBubyBtb3JlIHZhbHVlcywgcmVtb3ZlIHBhcmVudCBncm91cCBlbnRpcmVseVxuICAgIHJldHVybiBhcnJheS5wcm9wZXJ0aWVzLmxlbmd0aCA/IG51bGwgOiB0aGlzLnByb3BlcnR5Q2hhbmdlZChudWxsLCBhcnJheSk7XG4gIH1cblxuICBwcml2YXRlIG1vdmVBcnJheUdyb3VwVG9Qb3NpdGlvbihhcnJheTogSU5vZGVQcm9wZXJ0eSwgY3VycmVudEluZGV4OiBudW1iZXIsIG5ld0luZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IFsuLi5nZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KV07XG4gICAgbW92ZUl0ZW1JbkFycmF5KHZhbHVlLCBjdXJyZW50SW5kZXgsIG5ld0luZGV4KTtcbiAgICBtb3ZlSXRlbUluQXJyYXkoYXJyYXkucHJvcGVydGllcywgY3VycmVudEluZGV4LCBuZXdJbmRleCk7XG4gICAgLy8gbmVlZCB0byBjaGFuZ2Uga2V5IG9uIGV2ZXJ5IHByb3BlcnRpZXMgcmVjdXJzaXZlbHlcbiAgICByZWZyZXNoUHJvcGVydHlLZXlzKGFycmF5KTtcbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogYXJyYXkuZnVsbEtleSwgdmFsdWUgfSk7XG4gICAgcmV0dXJuIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIGFycmF5LmZ1bGxLZXkpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBcnJheUdyb3VwVXAoYXJyYXk6IElOb2RlUHJvcGVydHksIHsga2V5IH06IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICtrZXk7XG4gICAgcmV0dXJuIHRoaXMubW92ZUFycmF5R3JvdXBUb1Bvc2l0aW9uKGFycmF5LCBpbmRleCwgaW5kZXggLSAxKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQXJyYXlHcm91cERvd24oYXJyYXk6IElOb2RlUHJvcGVydHksIHsga2V5IH06IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICtrZXk7XG4gICAgcmV0dXJuIHRoaXMubW92ZUFycmF5R3JvdXBUb1Bvc2l0aW9uKGFycmF5LCBpbmRleCwgaW5kZXggKyAxKTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9wZXJ0eUNoYW5nZWQodmFsdWU6IGFueSwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eS5mdWxsS2V5LCB2YWx1ZSk7XG4gICAgcHJvcGVydHkuYWRkUHJvcGVydHlFbmFibGVkID0gaXNBZGRQcm9wZXJ0eUVuYWJsZWQoXG4gICAgICB0aGlzLm5vZGUhLCBwcm9wZXJ0eS5zY2hlbWFUeXBlLCBwcm9wZXJ0eS5zY2hlbWEhLCBwcm9wZXJ0eS5mdWxsS2V5XG4gICAgKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcHJvcGVydHkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHByb3BlcnR5LmNoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1ZhbHVlID0gcGFyc2VOZXdWYWx1ZShwcm9wZXJ0eS5zY2hlbWEhLCB2YWx1ZSk7XG4gICAgLy8gcGF0Y2ggZXJyb3Igd2hlbiBsaW5rIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseVxuICAgIGlmIChuZXdWYWx1ZT8uaWQ/LnN0YXJ0c1dpdGgoZm9ybWF0TGlua05vZGVzUHJlZml4KSkge1xuICAgICAgbmV3VmFsdWUuaWQgPSBuZXdWYWx1ZS5pZC5zcGxpdCgnOicpWzFdLnRyaW0oKTtcbiAgICB9XG4gICAgLy8gdHJpZ2dlciByZWZyZXNoIG9mIG5vZGVcbiAgICBjb25zdCBub2RlID0gY29weU9iamVjdCh0aGlzLm5vZGUpO1xuICAgIHNldChub2RlLCBwcm9wZXJ0eS5mdWxsS2V5LCBuZXdWYWx1ZSk7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAvLyB0cmlnZ2VyIGZvciBsaXN0ZW5lcnNcbiAgICB0aGlzLm5vZGVDaGFuZ2UuZW1pdCh7IGtleTogcHJvcGVydHkuZnVsbEtleSwgdmFsdWU6IG5ld1ZhbHVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWZhdWx0UHJvcGVydHkocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGtleTogc3RyaW5nLCBkZWY6IGRlZmluaXRpb24pIHtcbiAgICBjb25zdCBub2RlID0gcHJvcGVydHkua2V5ID8gZ2V0KHRoaXMubm9kZSwgcHJvcGVydHkuZnVsbEtleSkgOiB0aGlzLm5vZGU7XG4gICAgY29uc3QgZnVsbEtleSA9IHByb3BlcnR5LmtleSA/IGAke3Byb3BlcnR5LmZ1bGxLZXl9LiR7a2V5fWAgOiBrZXk7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHByb3BlcnR5LmtleSA/IHByb3BlcnR5LnByb3BlcnRpZXMgOiB0aGlzLnByb3BlcnRpZXM7XG4gICAgY29uc3QgbmV3UHJvcGVydHkgPSB0eXBlVG9OZXdQcm9wZXJ0eSh0aGlzLnNjaGVtYXMhLCBkZWYsIHRoaXMuc2NoZW1hcyFbcHJvcGVydHkuc2NoZW1hVHlwZV0sIG5vZGUsIGZ1bGxLZXkpO1xuICAgIGluc2VydFByb3BlcnR5KHByb3BlcnRpZXMsIGZ1bGxLZXksIG5ld1Byb3BlcnR5KTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQobmV3UHJvcGVydHkudmFsdWUsIG5ld1Byb3BlcnR5KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNaXNzaW5nUHJvcGVydHkocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHBhcmVudCA9PT0gcHJvcGVydHkgPyB0aGlzLm5vZGVQcm9wZXJ0eSEgOiBwYXJlbnQ7XG4gICAgY29uc3QgbmV3UHJvcGVydGllcyA9IHRoaXMubmV3UHJvcGVydGllcyhuZXdQcm9wZXJ0eSwgcHJvcGVydHkua2V5KTtcbiAgICBuZXdQcm9wZXJ0eS5uZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnRpZXNbMF07XG4gICAgcmV0dXJuIG5ld1Byb3BlcnR5Lm5ld1Byb3BlcnR5ID8gdGhpcy5hZGRQcm9wZXJ0eShuZXdQcm9wZXJ0eSkgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFkZFByb3BlcnR5KHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgeyBuYW1lLCBwcm9wIH0gPSBwcm9wZXJ0eS5uZXdQcm9wZXJ0eSE7XG4gICAgcHJvcGVydHkubmV3UHJvcGVydHkgPSB7fTtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ0BpZCcgP1xuICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHByb3BlcnR5LCB7ICdAaWQnOiAnJywgdHlwZTogcHJvcGVydHkuc2NoZW1hVHlwZSB9LCB1bmRlZmluZWQsIGZhbHNlKSA6XG4gICAgICB0aGlzLmFkZERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eSwgbmFtZSEsIHByb3AhKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUHJvcGVydHlDb29yZGluYXRlcyhwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgdmFsdWU6IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWwpIHtcbiAgICBjb25zdCBsYXRpdHVkZSA9IHNpYmxpbmdQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LCAnbGF0aXR1ZGUnKTtcbiAgICBjb25zdCBsb25naXR1ZGUgPSBzaWJsaW5nUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSwgJ2xvbmdpdHVkZScpO1xuICAgIHJldHVybiBbXG4gICAgICBsYXRpdHVkZSA/IHRoaXMucHJvcGVydHlDaGFuZ2VkKHZhbHVlLmxhdCwgbGF0aXR1ZGUpIDogbnVsbCxcbiAgICAgIGxvbmdpdHVkZSA/IHRoaXMucHJvcGVydHlDaGFuZ2VkKHZhbHVlLmxuZywgbG9uZ2l0dWRlKSA6IG51bGxcbiAgICBdO1xuICB9XG5cbiAgLy8gTWFwXG5cbiAgcHVibGljIGdldCBzaG93TWFwKCkge1xuICAgIHJldHVybiAoIXRoaXMuZWRpdGFibGUgfHwgdGhpcy5lcnJvck1vZGUpICYmIFtTY2hlbWFUeXBlLlNpdGUsIFNjaGVtYVR5cGUuT3JnYW5pc2F0aW9uXS5pbmNsdWRlcyh0aGlzLm5vZGUhLnR5cGUpO1xuICB9XG5cbiAgcHVibGljIG1hcERyYXdpbmdNb2Rlcyh7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFsnYm91bmRhcnknXS5pbmNsdWRlcyhrZXkpID8gW1xuICAgICAgZ29vZ2xlLm1hcHMuZHJhd2luZy5PdmVybGF5VHlwZS5QT0xZR09OXG4gICAgXSA6IChbXG4gICAgICAnbGF0aXR1ZGUnLCAnbG9uZ2l0dWRlJ1xuICAgIF0uaW5jbHVkZXMoa2V5KSA/IFtcbiAgICAgIGdvb2dsZS5tYXBzLmRyYXdpbmcuT3ZlcmxheVR5cGUuTUFSS0VSXG4gICAgXSA6IFtdKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1hcERyYXdpbmdDbG9zZWQobmV3VmFsdWUpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMubWFwRHJhd2luZ1Byb3BlcnR5O1xuICAgIHRoaXMubWFwRHJhd2luZ1Byb3BlcnR5ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBbJ2xhdGl0dWRlJywgJ2xvbmdpdHVkZSddLmluY2x1ZGVzKHByb3BlcnR5IS5rZXkpID9cbiAgICAgIHRoaXMudXBkYXRlUHJvcGVydHlDb29yZGluYXRlcyhwcm9wZXJ0eSEsIG5ld1ZhbHVlKSA6XG4gICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlZChuZXdWYWx1ZSwgcHJvcGVydHkhKTtcbiAgfVxuXG4gIC8vIEJpYmxpb2dyYXBoeSBTZWFyY2hcblxuICBwdWJsaWMgYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkoeyBrZXksIHNjaGVtYVR5cGUgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbGlkU2NoZW1hID0gW1NjaGVtYVR5cGUuQmlibGlvZ3JhcGh5XS5pbmNsdWRlcyhzY2hlbWFUeXBlKTtcbiAgICBjb25zdCB2YWxpZUtleSA9IFsndGl0bGUnLCAnZG9jdW1lbnRET0knLCAnc2NvcHVzJ10uaW5jbHVkZXMoa2V5KTtcbiAgICByZXR1cm4gdmFsaWRTY2hlbWEgJiYgdmFsaWVLZXkgPyBrZXkgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVCaWJsaW9ncmFwaHkodmFsdWU6IFBhcnRpYWw8QmlibGlvZ3JhcGh5Pikge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgdGhpcy5iaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5ISk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoU291cmNlcyA/IHtcbiAgICAgIC4uLnBhcmVudC52YWx1ZSxcbiAgICAgIGJpYmxpb2dyYXBoeTogdmFsdWVcbiAgICB9IDogdmFsdWU7XG4gICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEsIG5ld1ZhbHVlLCB0cnVlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTb3VyY2UodmFsdWU6IFBhcnRpYWw8U291cmNlPikge1xuICAgIC8vIGNhbm5vdCByZXBsYWNlIGEgdG9wLWxldmVsIHNvdXJjZVxuICAgIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hTb3VyY2VzICYmIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YSh0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkhLCB7XG4gICAgICAnQHR5cGUnOiBOb2RlVHlwZS5Tb3VyY2UsXG4gICAgICAuLi52YWx1ZVxuICAgIH0sICEoJ0BpZCcgaW4gdmFsdWUpKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBiaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEuZnVsbEtleS5zcGxpdCgnLicpLmxlbmd0aCA+IDI7XG4gIH1cblxuICBwdWJsaWMgb25CaWJsaW9ncmFwaGllc1NlYXJjaENsb3NlZCh2YWx1ZT86IFBhcnRpYWw8U291cmNlPiB8IFBhcnRpYWw8QmlibGlvZ3JhcGh5Pikge1xuICAgIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSA9IHZhbHVlID8gKFxuICAgICAgdmFsdWUudHlwZSA9PT0gU2NoZW1hVHlwZS5CaWJsaW9ncmFwaHkgP1xuICAgICAgICB0aGlzLnVwZGF0ZUJpYmxpb2dyYXBoeSh2YWx1ZSkgOlxuICAgICAgICB0aGlzLnVwZGF0ZVNvdXJjZSh2YWx1ZSBhcyBQYXJ0aWFsPFNvdXJjZT4pXG4gICAgKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIEFjdG9yLkBpZFxuXG4gIHB1YmxpYyBhc3luYyBzZXRVc2VyQWN0b3JJZChwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHsgYWN0b3JJZCwgbmFtZSB9ID0gYXdhaXQgdGhpcy51c2Vyc1NlcnZpY2UubG9nZ2VkSW5Vc2VyO1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgJ0BpZCc6IGFjdG9ySWQsICdAdHlwZSc6IE5vZGVUeXBlLkFjdG9yLCBuYW1lIH0sIGZhbHNlKTtcbiAgfVxuXG4gIC8vIEN5Y2xlLmN5Y2xlRHVyYXRpb25cblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbih0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQoZHVyYXRpb24sIHByb3BlcnR5KTtcbiAgfVxuXG4gIC8vIEN5Y2xlLnN0YXJ0RGF0ZVxuXG4gIHB1YmxpYyBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZUVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlQ3ljbGVTdGFydERhdGVFbmFibGVkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gY2FsY3VsYXRlQ3ljbGVTdGFydERhdGUodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKHN0YXJ0RGF0ZSwgcHJvcGVydHkpO1xuICB9XG5cbiAgLy8gVW5pdHMgY29udmVydGVyXG5cbiAgcHVibGljIHVuaXRDb252ZXJ0ZXJFbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgWyd2YWx1ZScsICdtaW4nLCAnbWF4JywgJ3NkJ10uaW5jbHVkZXMocHJvcGVydHkua2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuVW5pdENvbnZlcnRlcihwb3BvdmVyLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydHkudmFsdWU7XG4gICAgY29uc3QgdGVybVByb3BlcnR5ID0gc2libGluZ1Byb3BlcnR5KHRoaXMucHJvcGVydGllcywgcHJvcGVydHksICd0ZXJtJyk7XG4gICAgY29uc3QgdGVybSA9IHNhZmVKU09OUGFyc2UodGVybVByb3BlcnR5Py52YWx1ZSk7XG4gICAgY29uc3QgdW5pdHMgPSB0ZXJtPy51bml0cztcbiAgICByZXR1cm4gcG9wb3Zlci5pc09wZW4oKSA/IHBvcG92ZXIuY2xvc2UoKSA6IHBvcG92ZXIub3Blbih7IHZhbHVlLCB0ZXJtLCB1bml0cyB9KTtcbiAgfVxuXG4gIC8vIFJlY29tbWVuZGF0aW9uc1xuXG4gIHB1YmxpYyBvblNlbGVjdFJlY29tbWVuZGF0aW9uKGFycmF5OiBJTm9kZVByb3BlcnR5LCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuc2NoZW1hcyFbYXJyYXkuc2NoZW1hVHlwZV07XG4gICAgY29uc3QgdmFsdWUgPSBnZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KTtcblxuICAgIGNvbnN0IG5ld1Byb3BlcnR5ID0gdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLCBwcm9wLCB2YWx1ZSwgYCR7YXJyYXkuZnVsbEtleX1bJHthcnJheS5wcm9wZXJ0aWVzLmxlbmd0aH1dYFxuICAgICk7XG4gICAgbmV3UHJvcGVydHkudmFsdWUudGVybSA9IHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH07XG4gICAgdmFsdWVbYXJyYXkucHJvcGVydGllcy5sZW5ndGhdLnRlcm0gPSB7IHR5cGU6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiBpZCB9O1xuXG4gICAgLy8gaW5zZXJ0IFRlcm0gd2l0aCBAaWRcbiAgICBjb25zdCB0ZXJtS2V5ID0gYCR7bmV3UHJvcGVydHkuZnVsbEtleX0udGVybWA7XG4gICAgY29uc3QgdGVybVByb3BlcnR5ID0gbmV3UHJvcGVydHkucHJvcGVydGllcy5maW5kKHAgPT4gcC5rZXkgPT09ICd0ZXJtJykgfHwgdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLnByb3BlcnRpZXMudGVybSwgcHJvcCwgbmV3UHJvcGVydHkudmFsdWUsIHRlcm1LZXlcbiAgICApO1xuICAgIHRlcm1Qcm9wZXJ0eS52YWx1ZSA9IHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH07XG4gICAgdGVybVByb3BlcnR5LnByb3BlcnRpZXMgPSByZWN1cnNpdmVQcm9wZXJ0aWVzKFxuICAgICAgdGhpcy5zY2hlbWFzISwgW10sIHRoaXMuc2NoZW1hcyFbdGhpcy5ub2RlIS50eXBlXSwgdGhpcy5kZWVwRWRpdGFibGUsIHRlcm1LZXlcbiAgICApKHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH0pO1xuICAgIGluc2VydFByb3BlcnR5KG5ld1Byb3BlcnR5LnByb3BlcnRpZXMsIHRlcm1LZXksIHRlcm1Qcm9wZXJ0eSk7XG5cbiAgICAvLyB0ZXJtIGNhbm5vdCBiZSBlZGl0ZWQsIG5lZWQgdG8gcmVtb3ZlIGZpcnN0XG4gICAgdXBkYXRlUHJvcGVydGllcyh0ZXJtUHJvcGVydHksIHAgPT4ge1xuICAgICAgcC5lZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfSk7XG4gICAgdGVybVByb3BlcnR5LmVkaXRhYmxlID0gZmFsc2U7XG5cbiAgICBhcnJheS5wcm9wZXJ0aWVzLnB1c2gobmV3UHJvcGVydHkpO1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5Q2hhbmdlZCh2YWx1ZSwgYXJyYXkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC10b2dnbGUgcC00XCIgKGNsaWNrKT1cImlzT3BlbiA9ICFpc09wZW5cIiBwb2ludGVyPlxuICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgIDxzcGFuICpuZ0lmPVwibm9kZVByb3BlcnR5XCIgY2xhc3M9XCJpcy1weC0yXCJcbiAgICAgIFtjbGFzcy5oYXMtdGV4dC1kYW5nZXJdPVwibm9kZVByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICAgIFtjbGFzcy5oYXMtdGV4dC13YXJuaW5nXT1cIm5vZGVQcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICA+XG4gICAgICA8aGUtbm9kZS1pY29uIFt0eXBlXT1cIm5vZGVQcm9wZXJ0eS5zY2hlbWFUeXBlXCI+PC9oZS1ub2RlLWljb24+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgaXNPcGVuICYmIG5vZGVQcm9wZXJ0eVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TmV3UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IG5vZGVQcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc09wZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIG1iLTJcIiAqbmdJZj1cImVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlRXJyb3JGb3JtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBub2RlUHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIiAqbmdJZj1cIm5vZGVQcm9wZXJ0eT8uZXJyb3JcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogbm9kZVByb3BlcnR5LCBlZGl0OiB0cnVlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tdWx0aWxpbmVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3BlcnR5IG9mIHByb3BlcnRpZXM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wZXJ0eVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd1Byb3BlcnR5OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzT3BlblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5TWFwOyBjb250ZXh0OiB7JGltcGxpY2l0OiBub2RlUHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuXG48aGUtbWFwcy1kcmF3aW5nLWNvbmZpcm0gKm5nSWY9XCIhIW1hcERyYXdpbmdQcm9wZXJ0eVwiXG4gIFt2YWx1ZV09XCJtYXBEcmF3aW5nUHJvcGVydHkudmFsdWVcIiBbbW9kZXNdPVwibWFwRHJhd2luZ01vZGVzKG1hcERyYXdpbmdQcm9wZXJ0eSlcIlxuICAoY2xvc2VkKT1cIm9uTWFwRHJhd2luZ0Nsb3NlZCgkZXZlbnQpXCJcbj48L2hlLW1hcHMtZHJhd2luZy1jb25maXJtPlxuXG48aGUtYmlibGlvZ3JhcGhpZXMtc2VhcmNoLWNvbmZpcm0gKm5nSWY9XCIhIWJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHlcIlxuICBbc2VhcmNoXT1cImJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkudmFsdWVcIlxuICBbc2VhcmNoQnldPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkoYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSlcIlxuICBbc2VhcmNoU291cmNlc109XCJiaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXNcIlxuICAoY2xvc2VkKT1cIm9uQmlibGlvZ3JhcGhpZXNTZWFyY2hDbG9zZWQoJGV2ZW50KVwiXG4+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+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwIGNhcmQtY29udGVudCBwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbXVsdGlsaW5lIG15LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMyBvZiBwcm9wMi5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLWRhcmsgaXMtb3V0bGluZWQgaXMtc21hbGxcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImVkaXRhYmxlICYmICFlcnJvcnNFZGl0YWJsZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFycmF5R3JvdXAocHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJwbHVzLWNpcmNsZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5BZGQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+e3twcm9wZXJ0eS5rZXkgfCBwbHVyYWxpemU6MX19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8YXBwLW5vZGUtcmVjb21tZW5kYXRpb25zIGJ1dHRvbkNsYXNzPVwiaXMtZGFyayBpcy1vdXRsaW5lZCBpcy1zbWFsbFwiXG4gICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiIFtub2RlRmllbGRdPVwicHJvcGVydHkua2V5XCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0UmVjb21tZW5kYXRpb24pPVwib25TZWxlY3RSZWNvbW1lbmRhdGlvbihwcm9wZXJ0eSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2FwcC1ub2RlLXJlY29tbWVuZGF0aW9ucz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+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+XG4gICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5BZGQ8L3NwYW4+XG4gICAgPC9hPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImlzUmVxdWlyZWQocHJvcGVydHkpXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsIGlzLWRhbmdlclwiIFtmb3JdPVwicHJvcGVydHkuaWRcIlxuICAgICAgbmdiVG9vbHRpcD1cIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIiBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiPjwvZmEtaWNvbj5cbiAgICA8L2xhYmVsPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5LmV4dGVybmFsVXJsPy51cmxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGEgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICBbaHJlZl09XCJwcm9wZXJ0eS5leHRlcm5hbFVybC51cmwgKyAocHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsUGFyYW1WYWx1ZSA/IHByb3BlcnR5LnZhbHVlIDogJycpXCJcbiAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgW3RpdGxlXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLnRpdGxlXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieydpcy1kYXJrIGlzLW91dGxpbmVkJzogcHJvcGVydHkua2V5ID09PSAndHlwZSd9XCJcbiAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsUGFyYW1WYWx1ZSAmJiAhcHJvcGVydHkudmFsdWUgPyB0cnVlIDogbnVsbFwiXG4gICAgICA+XG4gICAgICAgIDxmYS1pY29uIFtpY29uXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLmljb24gfHwgJ2V4dGVybmFsLWxpbmstYWx0J1wiPjwvZmEtaWNvbj5cbiAgICAgIDwvYT5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1bml0Q29udmVydGVyRW5hYmxlZChwcm9wZXJ0eSlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiT3BlbiBjYWxjdWxhdG9yXCJcbiAgICAgICAgW25nYlBvcG92ZXJdPVwiY29udmVydFVuaXRzXCIgYXV0b0Nsb3NlPVwib3V0c2lkZVwiXG4gICAgICAgIHRyaWdnZXJzPVwibWFudWFsXCIgI3A9XCJuZ2JQb3BvdmVyXCIgcGxhY2VtZW50PVwiYm90dG9tXCIgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgIChjbGljayk9XCJvcGVuVW5pdENvbnZlcnRlcihwLCBwcm9wZXJ0eSlcIlxuICAgICAgPlxuICAgICAgICA8ZmEtaWNvbiBpY29uPVwiY2FsY3VsYXRvclwiPjwvZmEtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYWN0b3JBZGRvbnMgbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwicHJvcGVydHkua2V5ID09PSAnQGlkJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkFkZCBteXNlbGYgYXMgQWN0b3JcIlxuICAgICAgKGNsaWNrKT1cInNldFVzZXJBY3RvcklkKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gW2ljb25dPVwiWydmYXInLCAnaWQtYmFkZ2UnXVwiPjwvZmEtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2N5Y2xlQWRkb25zIGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cInByb3BlcnR5LmtleSA9PT0gJ2N5Y2xlRHVyYXRpb24nXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiQ2FsY3VsYXRlIHZhbHVlIGZyb20gc3RhcnREYXRlIGFuZCBlbmREYXRlXCJcbiAgICAgIChjbGljayk9XCJjYWxjdWxhdGVDeWNsZUR1cmF0aW9uKHByb3BlcnR5KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNhbGN1bGF0ZUN5Y2xlRHVyYXRpb25FbmFibGVkKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gaWNvbj1cImNhbGN1bGF0b3JcIj48L2ZhLWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwicHJvcGVydHkua2V5ID09PSAnc3RhcnREYXRlJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkNhbGN1bGF0ZSB2YWx1ZSBmcm9tIGVuZERhdGUgYW5kIGN5Y2xlRHVyYXRpb25cIlxuICAgICAgKGNsaWNrKT1cImNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHByb3BlcnR5KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlRW5hYmxlZChwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJjYWxjdWxhdG9yXCI+PC9mYS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2hvd05ld1Byb3BlcnR5IGxldC1wcm9wZXJ0eT5cbiAgPGhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCIgKm5nSWY9XCJlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZSAmJiAocHJvcGVydHkuYWRkUHJvcGVydHlFbmFibGVkIHx8IGRlZXBFZGl0YWJsZSk7IGVsc2UgcGFkZGVyXCI+XG4gICAgPGZvcm0gY2xhc3M9XCJweS0zIHB4LTQgaXMtZmxleC1ncm93LTFcIiAoc3VibWl0KT1cImFkZFByb3BlcnR5KHByb3BlcnR5KVwiIG5vdmFsaWRhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaXMtaG9yaXpvbnRhbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwgaXMtc21hbGxcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiIFtmb3JdPVwicHJvcGVydHkuaWQgKyAnX25ldydcIj5cbiAgICAgICAgICAgIDxzcGFuPkFkZCBuZXcgZmllbGQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1ib2R5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0IGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInByb3BlcnR5Lm5ld1Byb3BlcnR5XCJcbiAgICAgICAgICAgICAgICBbaWRdPVwicHJvcGVydHkuaWQgKyAnX25ldydcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJyYW5kb21uYW1lXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhbmQgc2VsZWN0IGZpZWxkIGZyb20gcmVzdWx0c1wiXG5cbiAgICAgICAgICAgICAgICBbbmdiVHlwZWFoZWFkXT1cInN1Z2dlc3ROZXdQcm9wZXJ0eShwcm9wZXJ0eS5mdWxsS2V5KVwiXG4gICAgICAgICAgICAgICAgW3Jlc3VsdFRlbXBsYXRlXT1cInN1Z2dlc3Rpb25cIlxuICAgICAgICAgICAgICAgIFtpbnB1dEZvcm1hdHRlcl09XCJmb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICAgIFtmb2N1c0ZpcnN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbZWRpdGFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJ0eXBlYWhlYWRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFwcm9wZXJ0eS5uZXdQcm9wZXJ0eSB8fCAhcHJvcGVydHkubmV3UHJvcGVydHkubmFtZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwicGx1c1wiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5BZGQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICA8L2hlYWRlcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcHJvcGVydHlFcnJvciBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC1lZGl0PVwiZWRpdFwiPlxuICA8cCBjbGFzcz1cImhlbHBcIlxuICAgIFtjbGFzcy5pcy1kYW5nZXJdPVwicHJvcGVydHkuaGFzRXJyb3JcIlxuICAgIFtjbGFzcy5pcy13YXJuaW5nXT1cInByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuICAgICpuZ0lmPVwicHJvcGVydHkuZXJyb3JcIlxuICA+XG4gICAgPHNwYW4gY2xhc3M9XCJpcy1wcmUtd3JhcFwiICpiaW5kT25jZT1cInByb3BlcnR5LmVycm9yXCIgW2lubmVySFRNTF09XCJwcm9wZXJ0eS5lcnJvci5tZXNzYWdlXCI+PC9zcGFuPlxuICAgIDxhIGNsYXNzPVwicGwtMlwiXG4gICAgICAqbmdJZj1cImVkaXQgJiYgZXJyb3JzRWRpdGFibGUgJiYgcHJvcGVydHkuZXJyb3IuaW5kZXggPj0gMFwiXG4gICAgICAoY2xpY2spPVwiZWRpdEVycm9yKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gY2xhc3M9XCJwci0yXCIgaWNvbj1cImVkaXRcIj48L2ZhLWljb24+XG4gICAgICA8c3Bhbj5FZGl0PC9zcGFuPlxuICAgIDwvYT5cbiAgICA8YSBjbGFzcz1cInBsLTJcIlxuICAgICAgKm5nSWY9XCIocHJvcGVydHkuaGFzV2FybmluZyB8fCBlcnJvcnNFZGl0YWJsZSkgJiYgcHJvcGVydHkuZXJyb3IuaW5kZXggPj0gMFwiXG4gICAgICAoY2xpY2spPVwicmVzb2x2ZUVycm9yKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gY2xhc3M9XCJwci0yXCIgaWNvbj1cImNoZWNrXCI+PC9mYS1pY29uPlxuICAgICAgPHNwYW4+UmVzb2x2ZWQ8L3NwYW4+XG4gICAgPC9hPlxuICA8L3A+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5TWFwIGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cInBhbmVsIGlzLWRlZmF1bHRcIiAqbmdJZj1cInNob3dNYXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwib3Blbi1ncm91cCBwYW5lbC1oZWFkaW5nIHB5LTBcIlxuICAgICAgKGNsaWNrKT1cIm1hcFZpc2libGUgPSAhbWFwVmlzaWJsZVwiIHBvaW50ZXJcbiAgICAgIFtjbGFzcy5pcy1vcGVuXT1cIm1hcFZpc2libGVcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW1vYmlsZSBpcy12Y2VudGVyZWQgbWItMFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3cgcHktMSBteS0wXCI+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWRvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFtYXBWaXNpYmxlXCI+PC9mYS1pY29uPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwibWFwVmlzaWJsZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNvbHVtbiBweS0xIG15LTBcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXNpemUtNlwiPlZpZXcgb24gTWFwPC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYmxvY2sgaXMtYmxvY2sgcC0wXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhbWFwVmlzaWJsZVwiPlxuICAgICAgPGhlLXNpdGVzLW1hcHMgW3NpdGVzXT1cIltub2RlXVwiIFtzaG93Tm90aWNlXT1cImZhbHNlXCI+PC9oZS1zaXRlcy1tYXBzPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbm9kZUVycm9yRm9ybSBsZXQtcHJvcGVydHk+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wZXJ0eS5uZXdFcnJvciAmJiBwcm9wZXJ0eS5lZGl0YWJsZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0IGlzLXNtYWxsXCI+XG4gICAgICAgICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInByb3BlcnR5Lm5ld0Vycm9yLmxldmVsXCI+XG4gICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ1bmRlZmluZWRcIj5TZWxlY3QgTGV2ZWw8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJlcnJvclwiPkVycm9yPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwid2FybmluZ1wiPldhcm5pbmc8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInRleHRhcmVhIGlzLXNtYWxsXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInByb3BlcnR5Lm5ld0Vycm9yLm1lc3NhZ2VcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBtZXNzYWdlIGhlcmVcIlxuICAgICAgICAgIHJvd3M9XCIxXCJcbiAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhcHJvcGVydHkubmV3RXJyb3IubGV2ZWwgfHwgIXByb3BlcnR5Lm5ld0Vycm9yLm1lc3NhZ2VcIlxuICAgICAgICAgIChjbGljayk9XCJhZGRFcnJvcihwcm9wZXJ0eSwgcHJvcGVydHkubmV3RXJyb3IpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJwbHVzLWNpcmNsZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5BZGQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwb3B1cEVycm9yRm9ybSBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdFwiPlxuICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwiZGF0YS5sZXZlbFwiPlxuICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInVuZGVmaW5lZFwiPlNlbGVjdCBMZXZlbDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJlcnJvclwiPkVycm9yPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIndhcm5pbmdcIj5XYXJuaW5nPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRhLm1lc3NhZ2VcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgbWVzc2FnZSBoZXJlXCJcbiAgICAgID5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3N1Z2dlc3Rpb24gbGV0LXI9XCJyZXN1bHRcIiBsZXQtdD1cInRlcm1cIj5cbiAgPG5nYi1oaWdobGlnaHRcbiAgICBbdGl0bGVdPVwici5iaWJsaW9ncmFwaHk/LnRpdGxlIHx8IHIuYmlibGlvZ3JhcGh5Py5kb2N1bWVudERPSSB8fCByLmJpYmxpb2dyYXBoeT8uc2NvcHVzIHx8IHIubmFtZVwiXG4gICAgW3Jlc3VsdF09XCJyLmJpYmxpb2dyYXBoeT8udGl0bGUgfHwgci5iaWJsaW9ncmFwaHk/LmRvY3VtZW50RE9JIHx8IHIuYmlibGlvZ3JhcGh5Py5zY29wdXMgfHwgci5uYW1lXCJcbiAgICBbdGVybV09XCJ0XCJcbiAgPjwvbmdiLWhpZ2hsaWdodD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcGFkZGVyPlxuICA8ZGl2IGNsYXNzPVwicHQtMVwiPjwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjb252ZXJ0VW5pdHMgbGV0LXZhbHVlPVwidmFsdWVcIiBsZXQtdGVybT1cInRlcm1cIiBsZXQtdW5pdHM9XCJ1bml0c1wiPlxuICA8aGUtdW5pdC1jb252ZXJ0ZXIgW3ZhbHVlXT1cInZhbHVlXCIgW3Rlcm1dPVwidGVybVwiIFt0b1VuaXRzXT1cInVuaXRzXCI+PC9oZS11bml0LWNvbnZlcnRlcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=