@decaf-ts/for-angular 0.0.19 → 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/components/crud-form/crud-form.component.d.ts +1 -1
- package/components/fieldset/fieldset.component.d.ts +1 -1
- package/components/filter/filter.component.d.ts +1 -1
- package/components/for-angular-components.module.d.ts +1 -2
- package/components/list/constants.d.ts +5 -9
- package/components/list-item/list-item.component.d.ts +1 -1
- package/engine/NgxBaseComponent.d.ts +1 -1
- package/esm2022/components/component-renderer/component-renderer.component.mjs +7 -7
- package/esm2022/components/crud-field/crud-field.component.mjs +13 -12
- package/esm2022/components/crud-form/crud-form.component.mjs +9 -9
- package/esm2022/components/empty-state/empty-state.component.mjs +8 -12
- package/esm2022/components/fieldset/fieldset.component.mjs +27 -19
- package/esm2022/components/filter/filter.component.mjs +14 -13
- package/esm2022/components/for-angular-components.module.mjs +17 -9
- package/esm2022/components/layout/layout.component.mjs +6 -7
- package/esm2022/components/list/constants.mjs +1 -1
- package/esm2022/components/list/list.component.mjs +6 -11
- package/esm2022/components/list-item/list-item.component.mjs +7 -12
- package/esm2022/components/model-renderer/model-renderer.component.mjs +5 -7
- package/esm2022/components/pagination/pagination.component.mjs +8 -9
- package/esm2022/components/searchbar/searchbar.component.mjs +5 -7
- package/esm2022/directives/collapsable.directive.mjs +3 -3
- package/esm2022/engine/NgxBaseComponent.mjs +11 -10
- package/esm2022/engine/NgxFormService.mjs +12 -3
- package/esm2022/engine/NgxRenderingEngine.mjs +3 -2
- package/esm2022/for-angular-common.module.mjs +82 -0
- package/esm2022/helpers/utils.mjs +2 -2
- package/esm2022/i18n/Loader.mjs +10 -6
- package/esm2022/i18n/data/en.json +80 -0
- package/esm2022/public-apis.mjs +3 -2
- package/fesm2022/decaf-ts-for-angular.mjs +254 -170
- package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
- package/for-angular-common.module.d.ts +44 -0
- package/package.json +6 -3
- package/public-apis.d.ts +2 -1
- package/esm2022/for-angular.module.mjs +0 -118
- package/for-angular.module.d.ts +0 -45
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { ChangeDetectorRef, Component,
|
|
2
|
+
import { ChangeDetectorRef, Component, inject, Input, ViewChild, Renderer2 } from '@angular/core';
|
|
3
3
|
import { Dynamic, EventConstants } from '../../engine';
|
|
4
4
|
import { OperationKeys } from '@decaf-ts/db-decorators';
|
|
5
|
-
import {
|
|
6
|
-
import { CollapsableDirective } from '../../directives/collapsable.directive';
|
|
7
|
-
import { IonAccordion, IonAccordionGroup, IonButton, IonItem, IonLabel, IonList, IonReorderGroup, IonReorder } from '@ionic/angular/standalone';
|
|
5
|
+
import { IonAccordion, IonAccordionGroup, IonButton, IonItem, IonLabel, IonList, IonReorderGroup, IonReorder, IonIcon, IonText } from '@ionic/angular/standalone';
|
|
8
6
|
import { cleanSpaces, generateRandomValue, itemMapper, windowEventEmitter } from '../../helpers';
|
|
9
|
-
import { FormArray } from '@angular/forms';
|
|
7
|
+
import { FormArray, ReactiveFormsModule } from '@angular/forms';
|
|
10
8
|
import { NgxBaseComponent } from '../../engine';
|
|
11
9
|
import { alertCircleOutline, createOutline } from 'ionicons/icons';
|
|
12
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
10
|
+
import { TranslatePipe, TranslateService } from '@ngx-translate/core';
|
|
13
11
|
import { addIcons } from 'ionicons';
|
|
14
12
|
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "@
|
|
16
|
-
import * as i2 from "@angular/common";
|
|
17
|
-
import * as i3 from "@angular/forms";
|
|
18
|
-
import * as i4 from "@ngx-translate/core";
|
|
13
|
+
import * as i1 from "@angular/forms";
|
|
19
14
|
/**
|
|
20
15
|
* @description Dynamic fieldset component with collapsible accordion functionality.
|
|
21
16
|
* @summary This component provides a sophisticated fieldset container that automatically
|
|
@@ -64,7 +59,7 @@ import * as i4 from "@ngx-translate/core";
|
|
|
64
59
|
* F->>F: Update isOpen state
|
|
65
60
|
* F->>I: Reflect new state
|
|
66
61
|
*
|
|
67
|
-
* @memberOf
|
|
62
|
+
* @memberOf FieldsetComponent
|
|
68
63
|
*/
|
|
69
64
|
let FieldsetComponent = class FieldsetComponent extends NgxBaseComponent {
|
|
70
65
|
/**
|
|
@@ -392,7 +387,7 @@ let FieldsetComponent = class FieldsetComponent extends NgxBaseComponent {
|
|
|
392
387
|
else {
|
|
393
388
|
windowEventEmitter(EventConstants.FIELDSET_ADD_GROUP, {
|
|
394
389
|
component: this.component.nativeElement,
|
|
395
|
-
index: this.value?.length,
|
|
390
|
+
index: this.updatingItem ? this.updatingItem.index : this.value?.length,
|
|
396
391
|
parent: this.childOf,
|
|
397
392
|
operation: !this.updatingItem ? OperationKeys.CREATE : OperationKeys.UPDATE
|
|
398
393
|
});
|
|
@@ -413,7 +408,7 @@ let FieldsetComponent = class FieldsetComponent extends NgxBaseComponent {
|
|
|
413
408
|
const item = this.formGroup.controls.find(control => `${control.get(this.pk)?.value}`.toLowerCase() === cleanSpaces(`${value}`, true));
|
|
414
409
|
if (item) {
|
|
415
410
|
this.buttonLabel = this.translateService.instant(this.locale + '.update');
|
|
416
|
-
this.updatingItem = Object.assign({}, item.value || {});
|
|
411
|
+
this.updatingItem = Object.assign({}, item.value || {}, { index });
|
|
417
412
|
windowEventEmitter(EventConstants.FIELDSET_UPDATE_GROUP, {
|
|
418
413
|
parent: this.childOf,
|
|
419
414
|
component: this.component.nativeElement,
|
|
@@ -584,7 +579,7 @@ let FieldsetComponent = class FieldsetComponent extends NgxBaseComponent {
|
|
|
584
579
|
.filter(v => v[this.pk] !== undefined)
|
|
585
580
|
.map((v, index) => {
|
|
586
581
|
return {
|
|
587
|
-
...itemMapper(v, this.mapper),
|
|
582
|
+
...itemMapper(Object.assign({}, v), this.mapper),
|
|
588
583
|
index: index + 1
|
|
589
584
|
};
|
|
590
585
|
});
|
|
@@ -625,17 +620,30 @@ let FieldsetComponent = class FieldsetComponent extends NgxBaseComponent {
|
|
|
625
620
|
}
|
|
626
621
|
return this.mapper;
|
|
627
622
|
}
|
|
628
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.
|
|
629
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FieldsetComponent, isStandalone: true, selector: "ngx-decaf-fieldset", inputs: { name: "name", childOf: "childOf", uid: "uid", customTypes: "customTypes", operation: "operation", formGroup: "formGroup", title: "title", description: "description", target: "target", multiple: "multiple", value: "value", handlers: "handlers" }, host: { properties: { "attr.id": "overriode " } }, viewQueries: [{ propertyName: "accordionComponent", first: true, predicate: ["accordionComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [ngClass]=\"{'open': isOpen, 'hasValidationErrors': hasValidationErrors}\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [ngClass]=\"{'not-unique': item.title === isUniqueError}\" lines=\"full\" [button]=\"false\" [ngClass]=\"{'updating': updatingItem?.[pk] === item.title}\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"(item.title === isUniqueError && !updatingItem.title === item.title) ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content></ng-content>\n\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{ buttonCancelLabel }}\n </ion-button>\n }\n <ion-button size=\"small\" fill=\"clear\" class=\"dcf-button-add\" (click)=\"handleCreateItem()\">\n <ion-icon name=\"add-outline\" slot=\"start\"></ion-icon>\n {{buttonLabel}}\n </ion-button>\n\n </div>\n }\n\n </div>\n </ion-accordion>\n </ion-accordion-group>\n</fieldset>\n\n", styles: ["ion-accordion-group ion-item[slot=header] .dcf-delete{width:30px}ion-accordion-group ion-item[slot=header] .dcf-delete ion-button{transform:translateY(-2px)}ion-accordion-group ion-item[slot=header] .dcf-delete ion-icon{font-size:1.15rem}::ng-deep ion-accordion ngx-decaf-crud-field:last-child ion-item{--inner-border-width: 0px !important;--border-width: 0px !important}.dcf-fieldset{margin-bottom:1.8rem;margin-top:1rem;padding-bottom:0;padding-top:1rem;background:var(--dcf-card-background);border-radius:6px;height:100%}@media (prefers-color-scheme: light){.dcf-fieldset{border:1px solid var(--dcf-color-gray-3)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-dark)!important}}@media (prefers-color-scheme: dark){.dcf-fieldset{border:1px solid var(--dcf-color-step-400)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-gray-2)}}.dcf-fieldset.read,.dcf-fieldset.delete{margin-top:1.25rem;padding-bottom:1rem}.dcf-fieldset.read [slot=content],.dcf-fieldset.delete [slot=content]{padding-top:0!important}.dcf-fieldset.read ion-accordion,.dcf-fieldset.delete ion-accordion{margin-bottom:0rem!important}@media (prefers-color-scheme: dark){.dcf-fieldset.read,.dcf-fieldset.delete{border:1px solid var(--dcf-color-gray-6)}}.dcf-fieldset ion-accordion{background:var(--dcf-card-background);margin-bottom:1rem}.dcf-fieldset ion-accordion.accordion-collapsing,.dcf-fieldset ion-accordion.accordion-collapsed{margin-bottom:1rem}.dcf-fieldset ion-accordion ion-item[slot=header]{--border-color: transparent;--border-radius: 6px;--inner-border-width: 0;--padding-start: 12px}.dcf-fieldset ion-accordion ion-item[slot=header] legend{font-weight:600;font-size:1rem;margin:0}@media (prefers-color-scheme: light){.dcf-fieldset ion-accordion ion-item[slot=header] legend{color:var(--dcf-color-gray-7)}}.dcf-fieldset ion-accordion [slot=content]{padding-top:2rem!important;padding-inline:.75rem}.dcf-not-unique-container{display:flex;justify-content:center;align-items:center;margin-bottom:1rem;flex:1 1 auto}.dcf-not-unique-container>div{display:flex;justify-content:center;align-items:center}.dcf-not-unique-container ion-icon{transform:translatey(2px);margin-right:5px}.dcf-fields-list{margin-top:-1rem;margin-bottom:1rem;padding:0!important}.dcf-fields-list ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--dcf-color-gray-2) !important;border:1px solid transparent;box-sizing:border-box}.dcf-fields-list ion-item ion-icon.dcf-reorder-disabled{width:1rem;transform:translatey(2px);color:var(--dcf-color-gray-4)}.dcf-fields-list ion-item.updating{--background: rgba(var(--dcf-color-primary-rgb), .1) !important}.dcf-fields-list ion-item.not-unique{--background: rgba(var(--dcf-color-danger-rgb), .05) !important}.dcf-fields-list ion-item .dcf-subtitle{font-size:.8rem;color:var(--dcf-color-gray-7)}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "component", type: IonAccordionGroup, selector: "ion-accordion-group", inputs: ["animated", "disabled", "expand", "mode", "multiple", "readonly", "value"] }, { kind: "component", type: IonAccordion, selector: "ion-accordion", inputs: ["disabled", "mode", "readonly", "toggleIcon", "toggleIconSlot", "value"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonReorder, selector: "ion-reorder" }, { kind: "component", type: IonReorderGroup, selector: "ion-reorder-group", inputs: ["disabled"] }] }); }
|
|
623
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FieldsetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
624
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FieldsetComponent, isStandalone: true, selector: "ngx-decaf-fieldset", inputs: { name: "name", childOf: "childOf", uid: "uid", customTypes: "customTypes", operation: "operation", formGroup: "formGroup", title: "title", description: "description", target: "target", multiple: "multiple", value: "value", handlers: "handlers" }, host: { properties: { "attr.id": "overriode " } }, viewQueries: [{ propertyName: "accordionComponent", first: true, predicate: ["accordionComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [class.open]=\"isOpen\" [class.hasValidationErrors]=\"hasValidationErrors\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [class.not-unique]=\"item.title === isUniqueError\" [class.updating]=\"updatingItem?.[pk] === item.title\" lines=\"full\" [button]=\"false\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"(item.title === isUniqueError && !updatingItem?.[pk] === item.title) ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content></ng-content>\n\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{ buttonCancelLabel }}\n </ion-button>\n }\n <ion-button size=\"small\" fill=\"clear\" class=\"dcf-button-add\" (click)=\"handleCreateItem()\">\n <ion-icon name=\"add-outline\" slot=\"start\"></ion-icon>\n {{buttonLabel}}\n </ion-button>\n\n </div>\n }\n\n </div>\n </ion-accordion>\n </ion-accordion-group>\n</fieldset>\n\n", styles: ["ion-accordion-group ion-item[slot=header] .dcf-delete{width:30px}ion-accordion-group ion-item[slot=header] .dcf-delete ion-button{transform:translateY(-2px)}ion-accordion-group ion-item[slot=header] .dcf-delete ion-icon{font-size:1.15rem}::ng-deep ion-accordion ngx-decaf-crud-field:last-child ion-item{--inner-border-width: 0px !important;--border-width: 0px !important}.dcf-fieldset{margin-bottom:1.8rem;margin-top:1rem;padding-bottom:0;padding-top:1rem;background:var(--dcf-card-background);border-radius:6px;height:100%}@media (prefers-color-scheme: light){.dcf-fieldset{border:1px solid var(--dcf-color-gray-3)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-dark)!important}}@media (prefers-color-scheme: dark){.dcf-fieldset{border:1px solid var(--dcf-color-step-400)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-gray-2)}}.dcf-fieldset.read,.dcf-fieldset.delete{margin-top:1.25rem;padding-bottom:1rem}.dcf-fieldset.read [slot=content],.dcf-fieldset.delete [slot=content]{padding-top:0!important}.dcf-fieldset.read ion-accordion,.dcf-fieldset.delete ion-accordion{margin-bottom:0rem!important}@media (prefers-color-scheme: dark){.dcf-fieldset.read,.dcf-fieldset.delete{border:1px solid var(--dcf-color-gray-6)}}.dcf-fieldset ion-accordion{background:var(--dcf-card-background);margin-bottom:1rem}.dcf-fieldset ion-accordion.accordion-collapsing,.dcf-fieldset ion-accordion.accordion-collapsed{margin-bottom:1rem}.dcf-fieldset ion-accordion ion-item[slot=header]{--border-color: transparent;--border-radius: 6px;--inner-border-width: 0;--padding-start: 12px}.dcf-fieldset ion-accordion ion-item[slot=header] legend{font-weight:600;font-size:1rem;margin:0}@media (prefers-color-scheme: light){.dcf-fieldset ion-accordion ion-item[slot=header] legend{color:var(--dcf-color-gray-7)}}.dcf-fieldset ion-accordion [slot=content]{padding-top:2rem!important;padding-inline:.75rem}.dcf-not-unique-container{display:flex;justify-content:center;align-items:center;margin-bottom:1rem;flex:1 1 auto}.dcf-not-unique-container>div{display:flex;justify-content:center;align-items:center}.dcf-not-unique-container ion-icon{transform:translatey(2px);margin-right:5px}.dcf-fields-list{margin-top:-1rem;margin-bottom:1rem;padding:0!important}.dcf-fields-list ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--dcf-color-gray-2) !important;border:1px solid transparent;box-sizing:border-box}.dcf-fields-list ion-item ion-icon.dcf-reorder-disabled{width:1rem;transform:translatey(2px);color:var(--dcf-color-gray-4)}.dcf-fields-list ion-item.updating{--background: rgba(var(--dcf-color-primary-rgb), .1) !important}.dcf-fields-list ion-item.not-unique{--background: rgba(var(--dcf-color-danger-rgb), .05) !important}.dcf-fields-list ion-item .dcf-subtitle{font-size:.8rem;color:var(--dcf-color-gray-7)}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: IonAccordionGroup, selector: "ion-accordion-group", inputs: ["animated", "disabled", "expand", "mode", "multiple", "readonly", "value"] }, { kind: "component", type: IonAccordion, selector: "ion-accordion", inputs: ["disabled", "mode", "readonly", "toggleIcon", "toggleIconSlot", "value"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonReorder, selector: "ion-reorder" }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonReorderGroup, selector: "ion-reorder-group", inputs: ["disabled"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
|
|
630
625
|
};
|
|
631
626
|
FieldsetComponent = __decorate([
|
|
632
627
|
Dynamic(),
|
|
633
628
|
__metadata("design:paramtypes", [])
|
|
634
629
|
], FieldsetComponent);
|
|
635
630
|
export { FieldsetComponent };
|
|
636
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.
|
|
631
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FieldsetComponent, decorators: [{
|
|
637
632
|
type: Component,
|
|
638
|
-
args: [{ standalone: true, selector: 'ngx-decaf-fieldset', schemas: [
|
|
633
|
+
args: [{ standalone: true, selector: 'ngx-decaf-fieldset', schemas: [], imports: [
|
|
634
|
+
TranslatePipe,
|
|
635
|
+
ReactiveFormsModule,
|
|
636
|
+
IonAccordionGroup,
|
|
637
|
+
IonAccordion,
|
|
638
|
+
IonList,
|
|
639
|
+
IonItem,
|
|
640
|
+
IonLabel,
|
|
641
|
+
IonReorder,
|
|
642
|
+
IonText,
|
|
643
|
+
IonReorderGroup,
|
|
644
|
+
IonButton,
|
|
645
|
+
IonIcon,
|
|
646
|
+
], host: { '[attr.id]': 'overriode ' }, template: "\n\n<fieldset\n (fieldsetAddGroupEvent)=\"handleCreateItem($event)\"\n (fieldsetRemoveGroupEvent)=\"handleRemoveItem(undefined, $event)\"\n [class]=\"'dcf-fieldset ' + operation\"\n #component>\n <ion-accordion-group [class.open]=\"isOpen\" [class.hasValidationErrors]=\"hasValidationErrors\" (validationErrorEvent)=\"handleValidationError($event)\" #accordionComponent>\n <ion-accordion value=\"open\">\n <ion-item slot=\"header\" (click)=\"handleAccordionToggle($event)\">\n <div class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-middle dcf-width-1-1\">\n <div class=\"dcf-width-expand\">\n <legend>{{ name | translate }}</legend>\n </div>\n @if(!isRequired && ['create', 'update'].includes(operation)) {\n <div class=\"dcf-width-auto dcf-delete\">\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveComponent($event)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div>\n }\n </div>\n </ion-item>\n <div slot=\"content\" [attr.aria-hidden]=\"!isOpen\">\n @if(multiple && items.length) {\n <ion-list class=\"dcf-fields-list\">\n <ion-reorder-group [formGroup]=\"formGroup.parent\" [disabled]=\"updatingItem\" (ionItemReorder)=\"handleReorderItems($any($event))\" #accordionComponent>\n @for(item of items; track item.index) {\n <ion-item [class.not-unique]=\"item.title === isUniqueError\" [class.updating]=\"updatingItem?.[pk] === item.title\" lines=\"full\" [button]=\"false\">\n @if(items?.length > 1 && !updatingItem) {\n <ion-reorder slot=\"start\">\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\n </ion-reorder>\n } @else {\n <div slot=\"start\">\n <ion-icon class=\"dcf-reorder-disabled\" size=\"small\" name=\"swap-vertical-outline\" disabled></ion-icon>\n </div>\n }\n <ion-label [color]=\"(item.title === isUniqueError && !updatingItem?.[pk] === item.title) ? 'danger' : ''\">{{ item.index }}. {{ item.title }}\n @if(item.description?.length > 0) {\n <br />\n <ion-text class=\"dcf-subtitle\">{{item.description}}</ion-text>\n }\n </ion-label>\n @if(!updatingItem || updatingItem?.[pk] !== item.title) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleUpdateItem(item.title, $index)\">\n <ion-icon name=\"create-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n\n @if(!updatingItem) {\n <ion-button fill=\"clear\" size=\"small\" (click)=\"handleRemoveItem(item.title)\">\n <ion-icon name=\"trash-outline\" color=\"dark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n }\n </ion-item>\n }\n </ion-reorder-group>\n </ion-list>\n }\n\n <ng-content></ng-content>\n\n @if(multiple && ['create', 'update'].includes(operation)) {\n @if(isUniqueError) {\n <div class=\"dcf-not-unique-container dcf-animation dcf-animation-bottom-small dcf-animation-fast\">\n <div class=\" dcf-grid dcf-grid-collapse dcf-width-1-1 \">\n <div class=\"dcf-auto\" [attr.style]=\"'max-width: 50px'\">\n <ion-icon name=\"alert-circle-outline\"></ion-icon>\n </div>\n <div class=\"dcf-width-expand\">\n <ion-text color=\"danger\" class=\"dcf-text-small\">{{ locale + '.not_unique' | translate : { value: isUniqueError } }}</ion-text>\n </div>\n </div>\n </div>\n }\n <div class=\"dcf-margin-bottom dcf-grid dcf-grid-collapse dcf-flex\">\n @if(updatingItem) {\n <ion-button size=\"small\" fill=\"clear\" color=\"danger\" (click)=\"handleCancelUpdateItem()\">\n {{ buttonCancelLabel }}\n </ion-button>\n }\n <ion-button size=\"small\" fill=\"clear\" class=\"dcf-button-add\" (click)=\"handleCreateItem()\">\n <ion-icon name=\"add-outline\" slot=\"start\"></ion-icon>\n {{buttonLabel}}\n </ion-button>\n\n </div>\n }\n\n </div>\n </ion-accordion>\n </ion-accordion-group>\n</fieldset>\n\n", styles: ["ion-accordion-group ion-item[slot=header] .dcf-delete{width:30px}ion-accordion-group ion-item[slot=header] .dcf-delete ion-button{transform:translateY(-2px)}ion-accordion-group ion-item[slot=header] .dcf-delete ion-icon{font-size:1.15rem}::ng-deep ion-accordion ngx-decaf-crud-field:last-child ion-item{--inner-border-width: 0px !important;--border-width: 0px !important}.dcf-fieldset{margin-bottom:1.8rem;margin-top:1rem;padding-bottom:0;padding-top:1rem;background:var(--dcf-card-background);border-radius:6px;height:100%}@media (prefers-color-scheme: light){.dcf-fieldset{border:1px solid var(--dcf-color-gray-3)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-dark)!important}}@media (prefers-color-scheme: dark){.dcf-fieldset{border:1px solid var(--dcf-color-step-400)}.dcf-fieldset .dcf-button-add{color:var(--ion-color-gray-2)}}.dcf-fieldset.read,.dcf-fieldset.delete{margin-top:1.25rem;padding-bottom:1rem}.dcf-fieldset.read [slot=content],.dcf-fieldset.delete [slot=content]{padding-top:0!important}.dcf-fieldset.read ion-accordion,.dcf-fieldset.delete ion-accordion{margin-bottom:0rem!important}@media (prefers-color-scheme: dark){.dcf-fieldset.read,.dcf-fieldset.delete{border:1px solid var(--dcf-color-gray-6)}}.dcf-fieldset ion-accordion{background:var(--dcf-card-background);margin-bottom:1rem}.dcf-fieldset ion-accordion.accordion-collapsing,.dcf-fieldset ion-accordion.accordion-collapsed{margin-bottom:1rem}.dcf-fieldset ion-accordion ion-item[slot=header]{--border-color: transparent;--border-radius: 6px;--inner-border-width: 0;--padding-start: 12px}.dcf-fieldset ion-accordion ion-item[slot=header] legend{font-weight:600;font-size:1rem;margin:0}@media (prefers-color-scheme: light){.dcf-fieldset ion-accordion ion-item[slot=header] legend{color:var(--dcf-color-gray-7)}}.dcf-fieldset ion-accordion [slot=content]{padding-top:2rem!important;padding-inline:.75rem}.dcf-not-unique-container{display:flex;justify-content:center;align-items:center;margin-bottom:1rem;flex:1 1 auto}.dcf-not-unique-container>div{display:flex;justify-content:center;align-items:center}.dcf-not-unique-container ion-icon{transform:translatey(2px);margin-right:5px}.dcf-fields-list{margin-top:-1rem;margin-bottom:1rem;padding:0!important}.dcf-fields-list ion-item{--min-height: 50px;--padding-top: .25rem;--padding-bottom: .25rem;--padding-start: .75rem;--padding-end: .75rem;--inner-padding-start: 0px !important;--inner-padding-end: 0px !important;--border-color: var(--dcf-color-gray-2) !important;border:1px solid transparent;box-sizing:border-box}.dcf-fields-list ion-item ion-icon.dcf-reorder-disabled{width:1rem;transform:translatey(2px);color:var(--dcf-color-gray-4)}.dcf-fields-list ion-item.updating{--background: rgba(var(--dcf-color-primary-rgb), .1) !important}.dcf-fields-list ion-item.not-unique{--background: rgba(var(--dcf-color-danger-rgb), .05) !important}.dcf-fields-list ion-item .dcf-subtitle{font-size:.8rem;color:var(--dcf-color-gray-7)}\n"] }]
|
|
639
647
|
}], ctorParameters: () => [], propDecorators: { accordionComponent: [{
|
|
640
648
|
type: ViewChild,
|
|
641
649
|
args: ['accordionComponent', { static: false }]
|
|
@@ -664,4 +672,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
664
672
|
}], handlers: [{
|
|
665
673
|
type: Input
|
|
666
674
|
}] } });
|
|
667
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkc2V0L2ZpZWxkc2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHNldC9maWVsZHNldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pKLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUF5QyxNQUFNLGNBQWMsQ0FBQztBQUM5RixPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUEwQixlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEssT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFFLFNBQVMsRUFBMEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFD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QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOytHQXJzQlUsaUJBQWlCO21HQUFqQixpQkFBaUIsa2hCQzlFOUIsZ3BKQStGQSwyOEZEcEJZLGdCQUFnQixpMEJBQUUsaUJBQWlCLHFKQUFFLFlBQVksNklBQUUsT0FBTyx5RkFBRSxPQUFPLDBOQUFFLFFBQVEsNkZBQUUsVUFBVSx3REFBYSxlQUFlOztBQUdwSCxpQkFBaUI7SUFWN0IsT0FBTyxFQUFFOztHQVVHLGlCQUFpQixDQXNzQjdCOzs0RkF0c0JZLGlCQUFpQjtrQkFUN0IsU0FBUztpQ0FDSSxJQUFJLFlBQ04sb0JBQW9CLFdBR3JCLENBQUMsc0JBQXNCLENBQUMsV0FDeEIsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsb0JBQW9CLENBQUMsUUFDaEosRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFDO3dEQWlCakMsa0JBQWtCO3NCQURqQixTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFnQmxELElBQUk7c0JBREgsS0FBSztnQkFlTixPQUFPO3NCQUROLEtBQUs7Z0JBZUcsR0FBRztzQkFEWCxLQUFLO2dCQWNOLFdBQVc7c0JBRFYsS0FBSztnQkEwQk4sU0FBUztzQkFEUixLQUFLO2dCQVlOLFNBQVM7c0JBRFIsS0FBSztnQkFZTixLQUFLO3NCQURKLEtBQUs7Z0JBWU4sV0FBVztzQkFEVixLQUFLO2dCQWVOLE1BQU07c0JBREwsS0FBSztnQkFjTixRQUFRO3NCQURQLEtBQUs7Z0JBYU4sS0FBSztzQkFESixLQUFLO2dCQWFOLFFBQVE7c0JBRFAsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkLCBSZW5kZXJlcjIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pYywgRXZlbnRDb25zdGFudHMsIEhhbmRsZXJMaWtlLCBIVE1MRm9ybVRhcmdldCwgS2V5VmFsdWUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBGb3JBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi4vLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IENvbGxhcHNhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jb2xsYXBzYWJsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSW9uQWNjb3JkaW9uLCBJb25BY2NvcmRpb25Hcm91cCwgSW9uQnV0dG9uLCBJb25JdGVtLCBJb25MYWJlbCwgSW9uTGlzdCwgSXRlbVJlb3JkZXJFdmVudERldGFpbCwgSW9uUmVvcmRlckdyb3VwLCBJb25SZW9yZGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBjbGVhblNwYWNlcywgZ2VuZXJhdGVSYW5kb21WYWx1ZSwgaXRlbU1hcHBlciwgd2luZG93RXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ3hCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IGFsZXJ0Q2lyY2xlT3V0bGluZSwgY3JlYXRlT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IElGaWVsZFNldEl0ZW0sIElGaWVsZFNldFZhbGlkYXRpb25FdmVudCB9IGZyb20gJy4uLy4uL2VuZ2luZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuXG5cblxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEeW5hbWljIGZpZWxkc2V0IGNvbXBvbmVudCB3aXRoIGNvbGxhcHNpYmxlIGFjY29yZGlvbiBmdW5jdGlvbmFsaXR5LlxuICogQHN1bW1hcnkgVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBzb3BoaXN0aWNhdGVkIGZpZWxkc2V0IGNvbnRhaW5lciB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIGFkYXB0cyBpdHMgYmVoYXZpb3IgYmFzZWQgb24gQ1JVRCBvcGVyYXRpb25zLiBJdCBpbnRlZ3JhdGVzIHNlYW1sZXNzbHkgd2l0aCBJb25pYydzXG4gKiBhY2NvcmRpb24gY29tcG9uZW50cyB0byBjcmVhdGUgZXhwYW5kYWJsZS9jb2xsYXBzaWJsZSBzZWN0aW9ucyBmb3Igb3JnYW5pemluZyBmb3JtXG4gKiBjb250ZW50IGFuZCByZWxhdGVkIGluZm9ybWF0aW9uLiBUaGUgY29tcG9uZW50IGludGVsbGlnZW50bHkgZGV0ZXJtaW5lcyBpdHMgaW5pdGlhbFxuICogc3RhdGUgYmFzZWQgb24gdGhlIG9wZXJhdGlvbiB0eXBlLCBvcGVuaW5nIGF1dG9tYXRpY2FsbHkgZm9yIFJFQUQgYW5kIERFTEVURSBvcGVyYXRpb25zXG4gKiB3aGlsZSByZW1haW5pbmcgY2xvc2VkIGZvciBDUkVBVEUgYW5kIFVQREFURSBvcGVyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8IS0tIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIHN0YXRlIG1hbmFnZW1lbnQgLS0+XG4gKiA8bmd4LWRlY2FmLWZpZWxkc2V0XG4gKiAgIG5hbWU9XCJQZXJzb25hbCBJbmZvcm1hdGlvblwiXG4gKiAgIFtvcGVyYXRpb25dPVwiT3BlcmF0aW9uS2V5cy5SRUFEXCJcbiAqICAgdGFyZ2V0PVwiX3NlbGZcIj5cbiAqICAgPGlvbi1pbnB1dCBsYWJlbD1cIk5hbWVcIiBwbGFjZWhvbGRlcj1cIkVudGVyIG5hbWVcIj48L2lvbi1pbnB1dD5cbiAqICAgPGlvbi1pbnB1dCBsYWJlbD1cIkVtYWlsXCIgdHlwZT1cImVtYWlsXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBlbWFpbFwiPjwvaW9uLWlucHV0PlxuICogPC9uZ3gtZGVjYWYtZmllbGRzZXQ+XG4gKlxuICogPCEtLSBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSBvcGVyYXRpb24gLS0+XG4gKiA8bmd4LWRlY2FmLWZpZWxkc2V0XG4gKiAgIG5hbWU9XCJDb250YWN0IERldGFpbHNcIlxuICogICBbb3BlcmF0aW9uXT1cImN1cnJlbnRPcGVyYXRpb25cIlxuICogICB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAqICAgPCEtLSBDb21wbGV4IGZvcm0gZmllbGRzIC0tPlxuICogPC9uZ3gtZGVjYWYtZmllbGRzZXQ+XG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIEZpZWxkc2V0Q29tcG9uZW50XG4gKiAgIHBhcnRpY2lwYW50IEkgYXMgSW9uaWMgQWNjb3JkaW9uXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRE9NXG4gKlxuICogICBGLT4+RjogbmdBZnRlclZpZXdJbml0KClcbiAqICAgYWx0IG9wZXJhdGlvbiBpcyBSRUFEIG9yIERFTEVURVxuICogICAgIEYtPj5GOiBTZXQgaXNPcGVuID0gdHJ1ZVxuICogICAgIEYtPj5EOiBRdWVyeSBhY2NvcmRpb24gZWxlbWVudFxuICogICAgIEYtPj5JOiBTZXQgdmFsdWUgYXR0cmlidXRlIHRvICdvcGVuJ1xuICogICAgIEYtPj5GOiBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAqICAgZW5kXG4gKiAgIFUtPj5JOiBDbGljayBhY2NvcmRpb24gaGVhZGVyXG4gKiAgIEktPj5GOiBoYW5kbGVDaGFuZ2UoZXZlbnQpXG4gKiAgIEYtPj5GOiBVcGRhdGUgaXNPcGVuIHN0YXRlXG4gKiAgIEYtPj5JOiBSZWZsZWN0IG5ldyBzdGF0ZVxuICpcbiAqIEBtZW1iZXJPZiBGb3JBbmd1bGFyTW9kdWxlXG4gKi9cbkBEeW5hbWljKClcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ25neC1kZWNhZi1maWVsZHNldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWVsZHNldC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpZWxkc2V0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbiAgaW1wb3J0czogW0ZvckFuZ3VsYXJNb2R1bGUsIElvbkFjY29yZGlvbkdyb3VwLCBJb25BY2NvcmRpb24sIElvbkxpc3QsIElvbkl0ZW0sIElvbkxhYmVsLCBJb25SZW9yZGVyLCBJb25CdXR0b24sIElvblJlb3JkZXJHcm91cCwgQ29sbGFwc2FibGVEaXJlY3RpdmVdLFxuICBob3N0OiB7J1thdHRyLmlkXSc6ICdvdmVycmlvZGUgJ30sXG59KVxuZXhwb3J0IGNsYXNzIEZpZWxkc2V0Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSBpb24tYWNjb3JkaW9uLWdyb3VwIGNvbXBvbmVudCBmb3IgcHJvZ3JhbW1hdGljIGNvbnRyb2wuXG4gICAqIEBzdW1tYXJ5IFZpZXdDaGlsZCByZWZlcmVuY2UgdGhhdCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBJb25pYyBhY2NvcmRpb24gZ3JvdXAgY29tcG9uZW50LlxuICAgKiBUaGlzIGVuYWJsZXMgcHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciB0aGUgYWNjb3JkaW9uJ3MgZXhwYW5kL2NvbGxhcHNlIHN0YXRlLCBhbGxvd2luZ1xuICAgKiB0aGUgY29tcG9uZW50IHRvIG9wZW4vY2xvc2UgdGhlIGFjY29yZGlvbiBiYXNlZCBvbiB2YWxpZGF0aW9uIGVycm9ycywgQ1JVRCBvcGVyYXRpb25zLFxuICAgKiBvciBvdGhlciBidXNpbmVzcyBsb2dpYyByZXF1aXJlbWVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtJb25BY2NvcmRpb25Hcm91cH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdhY2NvcmRpb25Db21wb25lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgYWNjb3JkaW9uQ29tcG9uZW50ITogSW9uQWNjb3JkaW9uR3JvdXA7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkaXNwbGF5IG5hbWUgb3IgdGl0bGUgb2YgdGhlIGZpZWxkc2V0IHNlY3Rpb24uXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIGxlZ2VuZCBvciBoZWFkZXIgdGV4dCB0aGF0IGFwcGVhcnMgaW4gdGhlIGFjY29yZGlvbiBoZWFkZXIuIFRoaXMgdGV4dFxuICAgKiBwcm92aWRlcyBhIGNsZWFyIGxhYmVsIGZvciB0aGUgY29sbGFwc2libGUgc2VjdGlvbiwgaGVscGluZyB1c2VycyB1bmRlcnN0YW5kIHdoYXQgY29udGVudFxuICAgKiBpcyBjb250YWluZWQgd2l0aGluLiBUaGUgbmFtZSBpcyBkaXNwbGF5ZWQgcHJvbWluZW50bHkgYW5kIHNlcnZlcyBhcyB0aGUgY2xpY2thYmxlIGFyZWFcbiAgICogZm9yIGV4cGFuZGluZy9jb2xsYXBzaW5nIHRoZSBmaWVsZHNldC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ0NoaWxkJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG5hbWU6IHN0cmluZyA9ICdDaGlsZCc7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwYXJlbnQgY29tcG9uZW50IGlkZW50aWZpZXIgZm9yIGhpZXJhcmNoaWNhbCBmaWVsZHNldCByZWxhdGlvbnNoaXBzLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHBhcmVudCBjb21wb25lbnQgbmFtZSB0aGF0IHRoaXMgZmllbGRzZXQgYmVsb25ncyB0byBpbiBhIGhpZXJhcmNoaWNhbFxuICAgKiBmb3JtIHN0cnVjdHVyZS4gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGZvciBldmVudCBidWJibGluZyBhbmQgZXN0YWJsaXNoaW5nIHBhcmVudC1jaGlsZFxuICAgKiByZWxhdGlvbnNoaXBzIGJldHdlZW4gZmllbGRzZXRzIGluIGNvbXBsZXggZm9ybXMgd2l0aCBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ0NoaWxkJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGNoaWxkT2Y6IHN0cmluZyA9ICdDaGlsZCc7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwYXJlbnQgY29tcG9uZW50IGlkZW50aWZpZXIgZm9yIGhpZXJhcmNoaWNhbCBmaWVsZHNldCByZWxhdGlvbnNoaXBzLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHBhcmVudCBjb21wb25lbnQgbmFtZSB0aGF0IHRoaXMgZmllbGRzZXQgYmVsb25ncyB0byBpbiBhIGhpZXJhcmNoaWNhbFxuICAgKiBmb3JtIHN0cnVjdHVyZS4gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGZvciBldmVudCBidWJibGluZyBhbmQgZXN0YWJsaXNoaW5nIHBhcmVudC1jaGlsZFxuICAgKiByZWxhdGlvbnNoaXBzIGJldHdlZW4gZmllbGRzZXRzIGluIGNvbXBsZXggZm9ybXMgd2l0aCBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ0NoaWxkJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHVpZDogc3RyaW5nID0gZ2VuZXJhdGVSYW5kb21WYWx1ZSgxMik7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1c3RvbSB0eXBlIGRlZmluaXRpb25zIGZvciBzcGVjaWFsaXplZCBmaWVsZHNldCBiZWhhdmlvci5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBjdXN0b20gZGF0YSB0eXBlcyBvciB2YWxpZGF0aW9uIHJ1bGVzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhpcyBmaWVsZHNldC5cbiAgICogQ2FuIGJlIGEgc2luZ2xlIHR5cGUgc3RyaW5nIG9yIGFycmF5IG9mIHR5cGVzIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgZmllbGRzZXQgaGFuZGxlc1xuICAgKiBkYXRhIHZhbGlkYXRpb24sIGZvcm1hdHRpbmcsIGFuZCBkaXNwbGF5IGJlaGF2aW9yIGZvciBzcGVjaWFsaXplZCB1c2UgY2FzZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjdXN0b21UeXBlcyE6IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGN1cnJlbnQgQ1JVRCBvcGVyYXRpb24gY29udGV4dC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgY29tcG9uZW50J3MgaW5pdGlhbCBiZWhhdmlvciBhbmQgc3RhdGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIGlucHV0IGlzIGNydWNpYWwgZm9yIGF1dG8tc3RhdGUgbWFuYWdlbWVudDogUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMgYXV0b21hdGljYWxseVxuICAgKiBvcGVuIHRoZSBmaWVsZHNldCB0byBzaG93IGNvbnRlbnQsIHdoaWxlIENSRUFURSBhbmQgVVBEQVRFIG9wZXJhdGlvbnMga2VlcCBpdCBjbG9zZWRcbiAgICogaW5pdGlhbGx5LiBUaGlzIHByb3ZpZGVzIGFuIGludHVpdGl2ZSB1c2VyIGV4cGVyaWVuY2UgYWxpZ25lZCB3aXRoIG9wZXJhdGlvbiBzZW1hbnRpY3MuXG4gICAqXG4gICAqIEB0eXBlIHtPcGVyYXRpb25LZXlzfVxuICAgKiBAZGVmYXVsdCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBDUlVEIG9wZXJhdGlvbiB0eXBlIGZvciB0aGUgY3VycmVudCBmaWVsZHNldCBjb250ZXh0LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBjb21wb25lbnQncyBpbml0aWFsIGJlaGF2aW9yIGFuZCBzdGF0ZSBiYXNlZCBvbiB0aGUgY3VycmVudCBvcGVyYXRpb24uXG4gICAqIFRoaXMgaW5wdXQgaXMgY3J1Y2lhbCBmb3IgYXV0by1zdGF0ZSBtYW5hZ2VtZW50OiBSRUFEIGFuZCBERUxFVEUgb3BlcmF0aW9ucyBhdXRvbWF0aWNhbGx5XG4gICAqIG9wZW4gdGhlIGZpZWxkc2V0IHRvIHNob3cgY29udGVudCwgd2hpbGUgQ1JFQVRFIGFuZCBVUERBVEUgb3BlcmF0aW9ucyBrZWVwIGl0IGNsb3NlZFxuICAgKiBpbml0aWFsbHkuIFRoaXMgcHJvdmlkZXMgYW4gaW50dWl0aXZlIHVzZXIgZXhwZXJpZW5jZSBhbGlnbmVkIHdpdGggb3BlcmF0aW9uIHNlbWFudGljcy5cbiAgICpcbiAgICogQHR5cGUge09wZXJhdGlvbktleXN9XG4gICAqIEBkZWZhdWx0IE9wZXJhdGlvbktleXMuUkVBRFxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyA9IE9wZXJhdGlvbktleXMuUkVBRDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWN0aXZlIGZvcm0gZ3JvdXAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IFRoZSBGb3JtR3JvdXAgaW5zdGFuY2UgdGhhdCBjb250YWlucyBhbGwgZm9ybSBjb250cm9scyB3aXRoaW4gdGhpcyBmaWVsZHNldC5cbiAgICogVXNlZCBmb3IgZm9ybSB2YWxpZGF0aW9uLCB2YWx1ZSBtYW5hZ2VtZW50LCBhbmQgaW50ZWdyYXRpb24gd2l0aCBBbmd1bGFyJ3MgcmVhY3RpdmUgZm9ybXMuXG4gICAqXG4gICAqIEB0eXBlIHtGb3JtR3JvdXB9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZm9ybUdyb3VwITogIEZvcm1BcnJheTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkgdGl0bGUgdGV4dCBmb3IgdGhlIGZpZWxkc2V0IGNvbnRlbnQuXG4gICAqIEBzdW1tYXJ5IERpc3BsYXkgdGl0bGUgdXNlZCBmb3IgZmllbGRzZXQgaWRlbnRpZmljYXRpb24gYW5kIGNvbnRlbnQgb3JnYW5pemF0aW9uLlxuICAgKiBQcm92aWRlcyBzZW1hbnRpYyBtZWFuaW5nIHRvIHRoZSBncm91cGVkIGZvcm0gZmllbGRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRpdGxlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2Vjb25kYXJ5IGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBmaWVsZHNldC5cbiAgICogQHN1bW1hcnkgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IHByb3ZpZGVzIGNvbnRleHQgb3IgaW5zdHJ1Y3Rpb25zXG4gICAqIHJlbGF0ZWQgdG8gdGhlIGZpZWxkc2V0IGNvbnRlbnQgYW5kIHB1cnBvc2UuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZGVzY3JpcHRpb24hOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGb3JtIHRhcmdldCBhdHRyaWJ1dGUgZm9yIG5lc3RlZCBmb3JtIHN1Ym1pc3Npb25zLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hlcmUgdG8gZGlzcGxheSB0aGUgcmVzcG9uc2UgYWZ0ZXIgc3VibWl0dGluZyBmb3JtcyBjb250YWluZWQgd2l0aGluXG4gICAqIHRoZSBmaWVsZHNldC4gVGhpcyBhdHRyaWJ1dGUgbWlycm9ycyB0aGUgSFRNTCBmb3JtIHRhcmdldCBiZWhhdmlvciwgYWxsb3dpbmcgY29udHJvbCBvdmVyXG4gICAqIHdoZXRoZXIgZm9ybSBzdWJtaXNzaW9ucyBvcGVuIGluIHRoZSBzYW1lIHdpbmRvdywgbmV3IHdpbmRvdywgb3Igc3BlY2lmaWMgZnJhbWUuIFVzZWZ1bFxuICAgKiBmb3IgY29tcGxleCBmb3JtIHdvcmtmbG93cyBhbmQgbXVsdGktc3RlcCBwcm9jZXNzZXMuXG4gICAqXG4gICAqIEB0eXBlIHtIVE1MRm9ybVRhcmdldH1cbiAgICogQGRlZmF1bHQgJ19zZWxmJ1xuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRhcmdldDogSFRNTEZvcm1UYXJnZXQgPSAnX3NlbGYnO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFbmFibGVzIG11bHRpcGxlIGl0ZW0gbWFuYWdlbWVudCB3aXRoaW4gdGhlIGZpZWxkc2V0LlxuICAgKiBAc3VtbWFyeSBCb29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIGlmIHRoZSBmaWVsZHNldCBzdXBwb3J0cyBhZGRpbmcgbXVsdGlwbGUgdmFsdWVzLlxuICAgKiBXaGVuIHRydWUsIGRpc3BsYXlzIGEgcmVvcmRlcmFibGUgbGlzdCBvZiBpdGVtcyB3aXRoIGFkZC9yZW1vdmUgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIHJhdyB2YWx1ZXMgc3RvcmVkIGluIHRoZSBmaWVsZHNldC5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMgdGhlIGFjdHVhbCBkYXRhIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZmllbGRzZXQuXG4gICAqIFRoaXMgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGZpZWxkc2V0J3MgZGF0YSBzdGF0ZS5cbiAgICpcbiAgICogQHR5cGUge0tleVZhbHVlW119XG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdmFsdWU6IEtleVZhbHVlW10gPSBbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGZvciBjdXN0b20gZmllbGRzZXQgYWN0aW9ucy5cbiAgICogQHN1bW1hcnkgQSByZWNvcmQgb2YgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMga2V5ZWQgYnkgZXZlbnQgbmFtZXMgdGhhdCBjYW4gYmUgdHJpZ2dlcmVkXG4gICAqIHdpdGhpbiB0aGUgZmllbGRzZXQuIFRoZXNlIGhhbmRsZXJzIHByb3ZpZGUgZXh0ZW5zaWJpbGl0eSBmb3IgY3VzdG9tIGJ1c2luZXNzIGxvZ2ljXG4gICAqIGFuZCBjYW4gYmUgaW52b2tlZCBmb3IgdmFyaW91cyBmaWVsZHNldCBvcGVyYXRpb25zIGFuZCB1c2VyIGludGVyYWN0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge0hhbmRsZXJMaWtlfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGhhbmRsZXJzITogSGFuZGxlckxpa2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBmb3JtYXR0ZWQgaXRlbXMgZm9yIFVJIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHRoZSBwcm9jZXNzZWQgaXRlbXMgcmVhZHkgZm9yIGRpc3BsYXkgaW4gdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZS5cbiAgICogVGhlc2UgaXRlbXMgYXJlIG1hcHBlZCBmcm9tIHRoZSByYXcgdmFsdWVzIHVzaW5nIHRoZSBtYXBwZXIgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge0lGaWVsZFNldEl0ZW1bXX1cbiAgICogQGRlZmF1bHQgW11cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBpdGVtczogSUZpZWxkU2V0SXRlbVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBmb3IgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEhvbGRzIHRoZSBpdGVtIGJlaW5nIGVkaXRlZCB3aGVuIGluIHVwZGF0ZSBtb2RlLiBVc2VkIHRvIHRyYWNrXG4gICAqIHdoaWNoIGl0ZW0gaXMgYmVpbmcgbW9kaWZpZWQgYW5kIGFwcGx5IGNoYW5nZXMgdG8gdGhlIGNvcnJlY3QgaXRlbS5cbiAgICpcbiAgICogQHR5cGUge0lGaWVsZFNldEl0ZW0gfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgdXBkYXRpbmdJdGVtITogSUZpZWxkU2V0SXRlbSB8IHVuZGVmaW5lZDtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBzdGF0ZSBvZiB0aGUgYWNjb3JkaW9uIChleHBhbmRlZCBvciBjb2xsYXBzZWQpLlxuICAgKiBAc3VtbWFyeSBCb29sZWFuIGZsYWcgdGhhdCB0cmFja3Mgd2hldGhlciB0aGUgZmllbGRzZXQgYWNjb3JkaW9uIGlzIGN1cnJlbnRseSBvcGVuIG9yIGNsb3NlZC5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYmFzZWQgb24gdXNlciBpbnRlcmFjdGlvbnMgYW5kIGluaXRpYWwgb3BlcmF0aW9uIHN0YXRlLlxuICAgKiBJdCBzZXJ2ZXMgYXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBjb21wb25lbnQncyB2aXNpYmlsaXR5IHN0YXRlIGFuZCBpcyB1c2VkXG4gICAqIHRvIGNvb3JkaW5hdGUgYmV0d2VlbiB1c2VyIGFjdGlvbnMgYW5kIHByb2dyYW1tYXRpYyBzdGF0ZSBjaGFuZ2VzLiBUaGUgdmFsdWUgaXMgYXV0b21hdGljYWxseVxuICAgKiBzZXQgYmFzZWQgb24gQ1JVRCBvcGVyYXRpb25zIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgdXBkYXRlZCB0aHJvdWdoIHVzZXIgaW50ZXJhY3Rpb25zLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZHNldCBjb250YWlucyByZXF1aXJlZCBmb3JtIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgc2lnbmFscyB0aGUgcHJlc2VuY2Ugb2YgbWFuZGF0b3J5IGlucHV0IGZpZWxkcyB3aXRoaW4gdGhlIGZpZWxkc2V0LlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHRoZSBDb2xsYXBzYWJsZURpcmVjdGl2ZSB3aGVuIHJlcXVpcmVkIGZpZWxkcyBhcmUgZGV0ZWN0ZWQsXG4gICAqIGFuZCBjYW4gYmUgdXNlZCB0byBhcHBseSBzcGVjaWFsIHN0eWxpbmcsIHZhbGlkYXRpb24gbG9naWMsIG9yIFVJIGluZGljYXRvcnMgdG8gaGlnaGxpZ2h0XG4gICAqIGZpZWxkc2V0cyB0aGF0IGNvbnRhaW4gbWFuZGF0b3J5IGluZm9ybWF0aW9uLiBJdCBoZWxwcyB3aXRoIGZvcm0gdmFsaWRhdGlvbiBmZWVkYmFjayBhbmRcbiAgICogdXNlciBleHBlcmllbmNlIGJ5IG1ha2luZyByZXF1aXJlZCBzZWN0aW9ucyBtb3JlIHByb21pbmVudC5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXNSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkc2V0IGNvbnRhaW5zIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgKiBAc3VtbWFyeSBCb29sZWFuIGZsYWcgdGhhdCB0cmFja3MgaWYgYW55IGZvcm0gZmllbGRzIHdpdGhpbiB0aGUgZmllbGRzZXQgaGF2ZSB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGNvbnRyb2wgYWNjb3JkaW9uIGJlaGF2aW9yIHdoZW4gZXJyb3JzIGFyZSBwcmVzZW50LCBwcmV2ZW50aW5nXG4gICAqIHVzZXJzIGZyb20gY29sbGFwc2luZyB0aGUgYWNjb3JkaW9uIHdoZW4gdGhleSBuZWVkIHRvIHNlZSBhbmQgYWRkcmVzcyB2YWxpZGF0aW9uIGlzc3Vlcy5cbiAgICogSXQncyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2hlbiB2YWxpZGF0aW9uIGVycm9yIGV2ZW50cyBhcmUgcmVjZWl2ZWQgZnJvbSBjaGlsZCBmb3JtIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFzVmFsaWRhdGlvbkVycm9yczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlIGZvciBkdXBsaWNhdGUgdmFsdWVzLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gYWRkIGEgZHVwbGljYXRlIHZhbHVlXG4gICAqIHRvIHRoZSBmaWVsZHNldC4gVXNlZCB0byBkaXNwbGF5IHVuaXF1ZW5lc3MgdmFsaWRhdGlvbiBmZWVkYmFjay5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBpc1VuaXF1ZUVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gQ1JVRCBvcGVyYXRpb24gY29uc3RhbnRzIGZvciB0ZW1wbGF0ZSB1c2FnZS5cbiAgICogQHN1bW1hcnkgRXhwb3NlcyB0aGUgT3BlcmF0aW9uS2V5cyBlbnVtIHRvIHRoZSBjb21wb25lbnQgdGVtcGxhdGUsIGVuYWJsaW5nIGNvbmRpdGlvbmFsXG4gICAqIHJlbmRlcmluZyBhbmQgYmVoYXZpb3IgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVzLiBUaGlzIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0eSBlbnN1cmVzXG4gICAqIHRoYXQgdGVtcGxhdGUgbG9naWMgY2FuIGFjY2VzcyBvcGVyYXRpb24gY29uc3RhbnRzIHdoaWxlIG1haW50YWluaW5nIGVuY2Fwc3VsYXRpb24gYW5kXG4gICAqIHByZXZlbnRpbmcgYWNjaWRlbnRhbCBtb2RpZmljYXRpb24gb2YgdGhlIGVudW0gdmFsdWVzLlxuICAgKlxuICAgKiBAdHlwZSB7Q3J1ZE9wZXJhdGlvbnN9XG4gICAqIEBkZWZhdWx0IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IE9wZXJhdGlvbktleXM6IENydWRPcGVyYXRpb25zID0gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gc2VydmljZS5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIG1hbnVhbCBjb250cm9sIG92ZXIgY2hhbmdlIGRldGVjdGlvbiBjeWNsZXMuXG4gICAqIFRoaXMgaXMgZXNzZW50aWFsIGZvciBlbnN1cmluZyB0aGF0IHByb2dyYW1tYXRpYyBET00gY2hhbmdlcyAobGlrZSBzZXR0aW5nIGFjY29yZGlvblxuICAgKiBhdHRyaWJ1dGVzKSBhcmUgcHJvcGVybHkgcmVmbGVjdGVkIGluIHRoZSBjb21wb25lbnQncyBzdGF0ZSBhbmQgdHJpZ2dlciBhcHByb3ByaWF0ZVxuICAgKiB2aWV3IHVwZGF0ZXMgd2hlbiBtb2RpZmljYXRpb25zIG9jY3VyIG91dHNpZGUgdGhlIG5vcm1hbCBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gZmxvdy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0NoYW5nZURldGVjdG9yUmVmfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgUmVuZGVyZXIyIHNlcnZpY2UgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbi5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIGEgc2FmZSwgcGxhdGZvcm0tYWdub3N0aWMgd2F5IHRvIG1hbmlwdWxhdGUgRE9NIGVsZW1lbnRzLlxuICAgKiBUaGlzIHNlcnZpY2UgZW5zdXJlcyBwcm9wZXIgaGFuZGxpbmcgb2YgRE9NIG9wZXJhdGlvbnMgYWNyb3NzIGRpZmZlcmVudCBwbGF0Zm9ybXMgYW5kIGVudmlyb25tZW50cyxcbiAgICogaW5jbHVkaW5nIHNlcnZlci1zaWRlIHJlbmRlcmluZyBhbmQgd2ViIHdvcmtlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZW5kZXJlcjJ9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFuc2xhdGlvbiBzZXJ2aWNlIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIHRyYW5zbGF0aW9uIGNhcGFiaWxpdGllcyBmb3IgVUkgdGV4dC5cbiAgICogVXNlZCB0byB0cmFuc2xhdGUgYnV0dG9uIGxhYmVscyBhbmQgdmFsaWRhdGlvbiBtZXNzYWdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2NhbGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtUcmFuc2xhdGVTZXJ2aWNlfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvY2FsaXplZCBsYWJlbCB0ZXh0IGZvciBhY3Rpb24gYnV0dG9ucy5cbiAgICogQHN1bW1hcnkgRHluYW1pYyBidXR0b24gbGFiZWwgdGhhdCBjaGFuZ2VzIGJhc2VkIG9uIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBtb2RlLlxuICAgKiBTaG93cyBcIkFkZFwiIGZvciBjcmVhdGUgb3BlcmF0aW9ucyBhbmQgXCJVcGRhdGVcIiBmb3IgZWRpdCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGJ1dHRvbkxhYmVsITogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2NhbGl6ZWQgbGFiZWwgdGV4dCBmb3IgYWN0aW9uIGJ1dHRvbnMuXG4gICAqIEBzdW1tYXJ5IER5bmFtaWMgYnV0dG9uIGxhYmVsIHRoYXQgY2hhbmdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBvcGVyYXRpb24gbW9kZS5cbiAgICogU2hvd3MgXCJDYW5jZWxcIiBmb3IgdXBkYXRlIG9wZXJhdGlvbnNcbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBidXR0b25DYW5jZWxMYWJlbCE6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGNvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGZpZWxkc2V0IHdpdGggaWNvbnMgYW5kIGNvbXBvbmVudCBuYW1lLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IE5neEJhc2VDb21wb25lbnQgY29uc3RydWN0b3Igd2l0aCB0aGUgY29tcG9uZW50IG5hbWUgYW5kXG4gICAqIHJlcXVpcmVkIElvbmljIGljb25zIChhbGVydENpcmNsZU91dGxpbmUgZm9yIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBjcmVhdGVPdXRsaW5lIGZvciBhZGQgYWN0aW9ucykuXG4gICAqIFNldHMgdXAgdGhlIGZvdW5kYXRpb25hbCBjb21wb25lbnQgc3RydWN0dXJlIGFuZCBpY29uIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdGaWVsZHNldENvbXBvbmVudCcpO1xuICAgIGFkZEljb25zKHsgYWxlcnRDaXJjbGVPdXRsaW5lLCBjcmVhdGVPdXRsaW5lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnQgaW5pdGlhbGl6YXRpb24gbGlmZWN5Y2xlIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCBieSBzZXR0aW5nIHVwIHJlcG9zaXRvcnkgcmVsYXRpb25zaGlwcyBpZiBhIG1vZGVsIGV4aXN0cyxcbiAgICogYW5kIGNvbmZpZ3VyZXMgdGhlIGluaXRpYWwgYnV0dG9uIGxhYmVsIGZvciB0aGUgYWRkIGFjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2NhbGUuXG4gICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgcHJvcGVyIHNldHVwIG9mIHRyYW5zbGF0aW9uIHNlcnZpY2VzIGFuZCBjb21wb25lbnQgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmKHRoaXMubW9kZWwpXG4gICAgICB0aGlzLl9yZXBvc2l0b3J5ID0gdGhpcy5yZXBvc2l0b3J5O1xuICAgIHRoaXMuYnV0dG9uTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcuYWRkJyk7XG4gICAgdGhpcy5idXR0b25DYW5jZWxMYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMubG9jYWxlICsgJy5jYW5jZWwnKTtcbiAgfVxuXG4gICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgc3RhdGUgYWZ0ZXIgdmlldyBhbmQgY2hpbGQgY29tcG9uZW50cyBhcmUgcmVuZGVyZWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbGlmZWN5Y2xlIGhvb2sgaW1wbGVtZW50cyBpbnRlbGxpZ2VudCBhdXRvLXN0YXRlIG1hbmFnZW1lbnQgYmFzZWQgb24gdGhlIGN1cnJlbnRcbiAgICogQ1JVRCBvcGVyYXRpb24uIEZvciBSRUFEIGFuZCBERUxFVEUgb3BlcmF0aW9ucywgdGhlIGZpZWxkc2V0IGF1dG9tYXRpY2FsbHkgb3BlbnMgdG8gcHJvdmlkZVxuICAgKiBpbW1lZGlhdGUgYWNjZXNzIHRvIGluZm9ybWF0aW9uLCB3aGlsZSBDUkVBVEUgYW5kIFVQREFURSBvcGVyYXRpb25zIGtlZXAgaXQgY2xvc2VkIHRvIG1haW50YWluXG4gICAqIGEgY2xlYW4gaW5pdGlhbCBpbnRlcmZhY2UuIFRoZSBtZXRob2QgZGlyZWN0bHkgbWFuaXB1bGF0ZXMgdGhlIERPTSB0byBlbnN1cmUgcHJvcGVyIGFjY29yZGlvblxuICAgKiBzeW5jaHJvbml6YXRpb24gYW5kIHRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gdG8gcmVmbGVjdCB0aGUgcHJvZ3JhbW1hdGljIHN0YXRlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhciBMaWZlY3ljbGVcbiAgICogICBwYXJ0aWNpcGFudCBGIGFzIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBET01cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENoYW5nZURldGVjdG9yXG4gICAqXG4gICAqICAgQS0+PkY6IG5nQWZ0ZXJWaWV3SW5pdCgpXG4gICAqICAgYWx0IG9wZXJhdGlvbiBpcyBSRUFEIG9yIERFTEVURVxuICAgKiAgICAgRi0+PkY6IFNldCBpc09wZW4gPSB0cnVlXG4gICAqICAgICBGLT4+RDogUXVlcnkgaW9uLWFjY29yZGlvbi1ncm91cCBlbGVtZW50XG4gICAqICAgICBhbHQgYWNjb3JkaW9uIGVsZW1lbnQgZXhpc3RzXG4gICAqICAgICAgIEYtPj5EOiBTZXQgdmFsdWUgYXR0cmlidXRlIHRvICdvcGVuJ1xuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgRi0+PkM6IGRldGVjdENoYW5nZXMoKVxuICAgKiAgIEMtPj5GOiBVcGRhdGUgdmlldyB3aXRoIG5ldyBzdGF0ZVxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlJFQUQgfHwgdGhpcy5vcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuREVMRVRFKSB7XG4gICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAvLyBoaWRkZW4gcmVtb3ZlIGJ1dHRvblxuICAgICAgY29uc3QgYWNjb3JkaW9uRWxlbWVudCA9IHRoaXMuY29tcG9uZW50Py5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lvbi1hY2NvcmRpb24tZ3JvdXAnKTtcbiAgICAgIGlmKHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50KVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShhY2NvcmRpb25FbGVtZW50LCAndmFsdWUnLCAnb3BlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmNvbXBvbmVudD8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbcmVxdWlyZWRdJyk7XG4gICAgICB0aGlzLmlzUmVxdWlyZWQgPSBpbnB1dHMubGVuZ3RoID4gMDtcbiAgICAgIGlmKHRoaXMuaXNSZXF1aXJlZCkge1xuICAgICAgICB0aGlzLmFjY29yZGlvbkNvbXBvbmVudC52YWx1ZSA9ICdvcGVuJztcbiAgICAgICAgdGhpcy5oYW5kbGVBY2NvcmRpb25Ub2dnbGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcmVtb3ZhbCBvZiB0aGUgZmllbGRzZXQgd2l0aCBzbGlkZSBhbmltYXRpb24uXG4gICAqIEBzdW1tYXJ5IEluaXRpYXRlcyB0aGUgcmVtb3ZhbCBwcm9jZXNzIGZvciB0aGUgZmllbGRzZXQgd2l0aCBhIHNtb290aCBzbGlkZS11cCBhbmltYXRpb24uXG4gICAqIFRoZSBtZXRob2QgYXBwbGllcyBDU1MgY2xhc3NlcyBmb3IgdGhlIHNsaWRlIGFuaW1hdGlvbiBhbmQgdGhlbiBzYWZlbHkgcmVtb3ZlcyB0aGVcbiAgICogZWxlbWVudCBmcm9tIHRoZSBET00gdXNpbmcgUmVuZGVyZXIyLiBUaGlzIHByb3ZpZGVzIGEgcG9saXNoZWQgdXNlciBleHBlcmllbmNlXG4gICAqIHdoZW4gcmVtb3ZpbmcgZmllbGRzZXQgaW5zdGFuY2VzIGZyb20gZHluYW1pYyBmb3Jtcy5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBET00gZXZlbnQgZnJvbSB0aGUgcmVtb3ZlIGJ1dHRvbiBjbGlja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVSZW1vdmVDb21wb25lbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkY2YtYW5pbWF0aW9uJywgJ2RjZi1hbmltYXRpb24tc2xpZGUtdG9wLW1lZGl1bScsICdkY2YtYW5pbWF0aW9uLXJldmVyc2UnLCAnZGNmLWFuaW1hdGlvbi1mYXN0Jyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBVc2UgUmVuZGVyZXIyIHRvIHNhZmVseSByZW1vdmUgdGhlIGVsZW1lbnRcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucmVuZGVyZXIucGFyZW50Tm9kZSh0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgIGlmIChwYXJlbnQpXG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQocGFyZW50LCB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50KTtcbiAgICB9LCAxNTApO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgY3JlYXRpbmcgbmV3IGl0ZW1zIG9yIHRyaWdnZXJpbmcgZ3JvdXAgYWRkaXRpb24gZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgZm9ybSB2YWxpZGF0aW9uIGV2ZW50cyBmb3IgaXRlbSBjcmVhdGlvbiBvciBlbWl0cyBldmVudHMgdG8gdHJpZ2dlclxuICAgKiB0aGUgYWRkaXRpb24gb2YgbmV3IGZpZWxkc2V0IGdyb3Vwcy4gV2hlbiBjYWxsZWQgd2l0aCB2YWxpZGF0aW9uIGV2ZW50IGRhdGEsIGl0IHZhbGlkYXRlc1xuICAgKiB1bmlxdWVuZXNzIGFuZCBhZGRzIHRoZSBpdGVtIHRvIHRoZSBmaWVsZHNldC4gV2hlbiBjYWxsZWQgd2l0aG91dCBwYXJhbWV0ZXJzLCBpdCB0cmlnZ2Vyc1xuICAgKiBhIGdyb3VwIGFkZGl0aW9uIGV2ZW50IGZvciBwYXJlbnQgY29tcG9uZW50cyB0byBoYW5kbGUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnQ8SUZpZWxkU2V0VmFsaWRhdGlvbkV2ZW50Pn0gW2V2ZW50XSAtIE9wdGlvbmFsIHZhbGlkYXRpb24gZXZlbnQgY29udGFpbmluZyBmb3JtIGRhdGFcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIENhbGxlZCBmcm9tIGZvcm0gdmFsaWRhdGlvblxuICAgKiBoYW5kbGVDcmVhdGVJdGVtKHZhbGlkYXRpb25FdmVudCk7XG4gICAqXG4gICAqIC8vIENhbGxlZCB0byB0cmlnZ2VyIGdyb3VwIGFkZGl0aW9uXG4gICAqIGhhbmRsZUNyZWF0ZUl0ZW0oKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBoYW5kbGVDcmVhdGVJdGVtKGV2ZW50PzogQ3VzdG9tRXZlbnQ8SUZpZWxkU2V0VmFsaWRhdGlvbkV2ZW50Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKGV2ZW50ICYmIGV2ZW50IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3Qge2Zvcm1Hcm91cCwgdmFsdWUsIGlzVmFsaWR9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgdGhpcy5mb3JtR3JvdXAgPSBmb3JtR3JvdXAgYXMgRm9ybUFycmF5O1xuICAgICAgaWYoIXRoaXMubWFwcGVyKVxuICAgICAgICB0aGlzLm1hcHBlciA9IHRoaXMuZ2V0TWFwcGVyKHZhbHVlIGFzIEtleVZhbHVlKTtcbiAgICAgIGlmKGlzVmFsaWQgKXtcbiAgICAgICAgICB0aGlzLmlzVW5pcXVlRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy5idXR0b25MYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMubG9jYWxlICsgJy5hZGQnKTtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgIHRoaXMuaXNVbmlxdWVFcnJvciA9ICh2YWx1ZSBhcyBLZXlWYWx1ZSk/Llt0aGlzLnBrXSB8fCB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9BRERfR1JPVVAsIHtcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICBpbmRleDogdGhpcy52YWx1ZT8ubGVuZ3RoLFxuICAgICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgICAgb3BlcmF0aW9uOiAhdGhpcy51cGRhdGluZ0l0ZW0gPyBPcGVyYXRpb25LZXlzLkNSRUFURSA6IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBpdGVtIHVwZGF0ZSBvcGVyYXRpb25zIHdpdGggZm9ybSBzdGF0ZSBtYW5hZ2VtZW50LlxuICAgKiBAc3VtbWFyeSBMb2NhdGVzIGFuIGl0ZW0gaW4gdGhlIGZvcm0gYXJyYXkgZm9yIGVkaXRpbmcgYW5kIHByZXBhcmVzIHRoZSBjb21wb25lbnRcbiAgICogZm9yIHVwZGF0ZSBtb2RlLiBVcGRhdGVzIHRoZSBidXR0b24gbGFiZWwgdG8gcmVmbGVjdCB0aGUgZWRpdCBzdGF0ZSBhbmQgc3RvcmVzXG4gICAqIHRoZSBpdGVtIGJlaW5nIHVwZGF0ZWQuIFRyaWdnZXJzIGEgd2luZG93IGV2ZW50IHRvIG5vdGlmeSBwYXJlbnQgY29tcG9uZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHZhbHVlIC0gVGhlIGlkZW50aWZpZXIgdmFsdWUgb2YgdGhlIGl0ZW0gdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBhcnJheSBpbmRleCBwb3NpdGlvbiBvZiB0aGUgaXRlbVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVVcGRhdGVJdGVtKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZmluZChjb250cm9sID0+IGAke2NvbnRyb2wuZ2V0KHRoaXMucGspPy52YWx1ZX1gLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuU3BhY2VzKGAke3ZhbHVlfWAsIHRydWUpKSBhcyBGb3JtQ29udHJvbDtcbiAgICBpZihpdGVtKSB7XG4gICAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLnVwZGF0ZScpO1xuICAgICAgdGhpcy51cGRhdGluZ0l0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtLnZhbHVlIHx8IHt9KTtcbiAgICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9VUERBVEVfR1JPVVAsIHtcbiAgICAgICAgcGFyZW50OiB0aGlzLmNoaWxkT2YsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhbmNlbHMgdGhlIHVwZGF0ZSBtb2RlIGFuZCByZXNldHMgdGhlIFVJIHN0YXRlLlxuICAgKiBAc3VtbWFyeSBFeGl0cyB0aGUgdXBkYXRlIG1vZGUgYnkgcmVzZXR0aW5nIHRoZSBidXR0b24gbGFiZWwgYW5kIGNsZWFyaW5nIHRoZSB1cGRhdGluZyBpdGVtLFxuICAgKiByZXN0b3JpbmcgdGhlIGNvbXBvbmVudCB0byBpdHMgZGVmYXVsdCBzdGF0ZSBmb3IgYWRkaW5nIG5ldyBpdGVtcy4gTm90aWZpZXMgcGFyZW50IGNvbXBvbmVudHNcbiAgICogdGhhdCB0aGUgdXBkYXRlIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZUNhbmNlbFVwZGF0ZUl0ZW0oKTogdm9pZCB7XG4gICAgdGhpcy5idXR0b25MYWJlbCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMubG9jYWxlICsgJy5hZGQnKTtcbiAgICB0aGlzLnVwZGF0aW5nSXRlbSA9IHVuZGVmaW5lZDtcbiAgICB3aW5kb3dFdmVudEVtaXR0ZXIoRXZlbnRDb25zdGFudHMuRklFTERTRVRfVVBEQVRFX0dST1VQLCB7XG4gICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgIGluZGV4OiB0aGlzLnZhbHVlPy5sZW5ndGhcbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGl0ZW0gcmVtb3ZhbCBvcGVyYXRpb25zIHdpdGggZm9ybSBhcnJheSBtYW5hZ2VtZW50LlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgaXRlbSByZW1vdmFsIGJ5IGVpdGhlciBoYW5kbGluZyB2YWxpZGF0aW9uIGV2ZW50cyBvciByZW1vdmluZyBzcGVjaWZpY1xuICAgKiBpdGVtcyBmcm9tIHRoZSBmb3JtIGFycmF5LiBXaGVuIGNhbGxlZCB3aXRoIGEgdmFsaWRhdGlvbiBldmVudCwgaXQgdHJpZ2dlcnMgdmFsdWUgdXBkYXRlcy5cbiAgICogV2hlbiBjYWxsZWQgd2l0aCBhbiBpZGVudGlmaWVyLCBpdCBsb2NhdGVzIGFuZCByZW1vdmVzIHRoZSBtYXRjaGluZyBpdGVtIGZyb20gdGhlIGZvcm0gYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpdGVtIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBbZXZlbnRdIC0gT3B0aW9uYWwgdmFsaWRhdGlvbiBldmVudCBmb3IgZm9ybSB1cGRhdGVzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZVJlbW92ZUl0ZW0odmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZXZlbnQ/OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIGlmKGV2ZW50ICYmIGV2ZW50IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoKTtcbiAgICB9XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5mb3JtR3JvdXAgYXMgRm9ybUFycmF5O1xuICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gZm9ybUFycmF5Lmxlbmd0aDtcbiAgICBmb3IgKGxldCBpbmRleCA9IGFycmF5TGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSBmb3JtQXJyYXkuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cDtcbiAgICAgIGlmIChjbGVhblNwYWNlcyhncm91cC5nZXQodGhpcy5wayk/LnZhbHVlKSA9PT0gY2xlYW5TcGFjZXModmFsdWUgYXMgc3RyaW5nKSkge1xuICAgICAgICB3aW5kb3dFdmVudEVtaXR0ZXIoRXZlbnRDb25zdGFudHMuRklFTERTRVRfUkVNT1ZFX0dST1VQLCB7XG4gICAgICAgICAgcGFyZW50OiB0aGlzLmNoaWxkT2YsXG4gICAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGZvcm1Hcm91cDogZ3JvdXBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcmVvcmRlcmluZyBvZiBpdGVtcyB3aXRoaW4gdGhlIGZpZWxkc2V0IGxpc3QuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBkcmFnLWFuZC1kcm9wIHJlb3JkZXIgZXZlbnRzIGZyb20gdGhlIGlvbi1yZW9yZGVyLWdyb3VwIGNvbXBvbmVudC5cbiAgICogVXBkYXRlcyBib3RoIHRoZSBkaXNwbGF5IGl0ZW1zIGFycmF5IGFuZCB0aGUgdW5kZXJseWluZyB2YWx1ZSBhcnJheSB0byBtYWludGFpblxuICAgKiBjb25zaXN0ZW5jeSBiZXR3ZWVuIFVJIHN0YXRlIGFuZCBkYXRhIHN0YXRlLiBQcmVzZXJ2ZXMgaXRlbSBpbmRpY2VzIGFmdGVyIHJlb3JkZXJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnQ8SXRlbVJlb3JkZXJFdmVudERldGFpbD59IGV2ZW50IC0gSW9uaWMgcmVvcmRlciBldmVudCBjb250YWluaW5nIHNvdXJjZSBhbmQgdGFyZ2V0IGluZGljZXNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDxpb24tcmVvcmRlci1ncm91cCAoaW9uSXRlbVJlb3JkZXIpPVwiaGFuZGxlUmVvcmRlcigkZXZlbnQpXCI+XG4gICAqICAgPCEtLSBSZW9yZGVyYWJsZSBpdGVtcyAtLT5cbiAgICogPC9pb24tcmVvcmRlci1ncm91cD5cbiAgICogYGBgXG4gICAqL1xuICBoYW5kbGVSZW9yZGVySXRlbXMoZXZlbnQ6IEN1c3RvbUV2ZW50PEl0ZW1SZW9yZGVyRXZlbnREZXRhaWw+KTogdm9pZCB7XG4gICBjb25zdCBmcm9tSW5kZXggPSBldmVudC5kZXRhaWwuZnJvbTtcbiAgICBjb25zdCB0b0luZGV4ID0gZXZlbnQuZGV0YWlsLnRvO1xuXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5pdGVtc107IC8vIHN1YSBlc3RydXR1cmEgdmlzdWFsXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5mb3JtR3JvdXAgYXMgRm9ybUFycmF5OyAvLyBGb3JtQXJyYXkgcmVhdGl2b1xuXG4gICAgaWYgKGZyb21JbmRleCAhPT0gdG9JbmRleCkge1xuICAgICAgLy8gUmVvcmRlbmFyIG9zIGRhZG9zIHZpc3VhaXNcbiAgICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSBpdGVtcy5zcGxpY2UoZnJvbUluZGV4LCAxKVswXTtcbiAgICAgIGl0ZW1zLnNwbGljZSh0b0luZGV4LCAwLCBpdGVtVG9Nb3ZlKTtcbiAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiBpdGVtWydpbmRleCddID0gaW5kZXggKyAxKTtcblxuICAgICAgLy8gUmVvcmRlbmFyIG9zIGNvbnRyb2xlcyBkbyBGb3JtQXJyYXlcbiAgICAgIGNvbnN0IGNvbnRyb2xUb01vdmUgPSBmb3JtQXJyYXkuYXQoZnJvbUluZGV4KTtcbiAgICAgIGZvcm1BcnJheS5yZW1vdmVBdChmcm9tSW5kZXgpO1xuICAgICAgZm9ybUFycmF5Lmluc2VydCh0b0luZGV4LCBjb250cm9sVG9Nb3ZlKTtcbiAgICB9XG4gICAgLy8gRmluYWxpemEgYSBvcGVyYcOnw6NvIGRlIHJlb3JkZXIgZG8gSW9uaWNcbiAgICBldmVudC5kZXRhaWwuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhY2NvcmRpb24gc3RhdGUgY2hhbmdlIGV2ZW50cyBmcm9tIHVzZXIgaW50ZXJhY3Rpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgQ3VzdG9tRXZlbnQgb2JqZWN0cyB0cmlnZ2VyZWQgd2hlbiB1c2VycyBleHBhbmQgb3IgY29sbGFwc2UgdGhlIGFjY29yZGlvbi5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIG5ldyBzdGF0ZSBmcm9tIHRoZSBldmVudCBkZXRhaWxzIGFuZCB1cGRhdGVzIHRoZSBjb21wb25lbnQnc1xuICAgKiBpbnRlcm5hbCBzdGF0ZSBhY2NvcmRpbmdseS4gSXQgc3BlY2lmaWNhbGx5IGxpc3RlbnMgZm9yIElPTi1BQ0NPUkRJT04tR1JPVVAgZXZlbnRzIHRvXG4gICAqIGVuc3VyZSBwcm9wZXIgZXZlbnQgc291cmNlIHZhbGlkYXRpb24gYW5kIHByZXZlbnQgaGFuZGxpbmcgb2YgdW5yZWxhdGVkIGV2ZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgb2JqZWN0IGNvbnRhaW5pbmcgYWNjb3JkaW9uIHN0YXRlIGNoYW5nZSBkZXRhaWxzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBJIGFzIElvbi1BY2NvcmRpb25cbiAgICogICBwYXJ0aWNpcGFudCBGIGFzIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqXG4gICAqICAgVS0+Pkk6IENsaWNrIGFjY29yZGlvbiBoZWFkZXJcbiAgICogICBJLT4+RjogaGFuZGxlQ2hhbmdlKEN1c3RvbUV2ZW50KVxuICAgKiAgIEYtPj5GOiBFeHRyYWN0IHRhcmdldCBhbmQgZGV0YWlsIGZyb20gZXZlbnRcbiAgICogICBGLT4+RjogVmFsaWRhdGUgdGFyZ2V0IGlzIElPTi1BQ0NPUkRJT04tR1JPVVBcbiAgICogICBhbHQgdmFsaWQgdGFyZ2V0XG4gICAqICAgICBGLT4+RjogVXBkYXRlIGlzT3BlbiA9ICEhdmFsdWVcbiAgICogICBlbmRcbiAgICogICBGLT4+STogUmVmbGVjdCB1cGRhdGVkIHN0YXRlXG4gICAqXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgYWNjb3JkaW9uIHRvZ2dsZSBmdW5jdGlvbmFsaXR5IHdpdGggdmFsaWRhdGlvbiBlcnJvciBjb25zaWRlcmF0aW9uLlxuICAgKiBAc3VtbWFyeSBNYW5hZ2VzIHRoZSBleHBhbmQvY29sbGFwc2Ugc3RhdGUgb2YgdGhlIGFjY29yZGlvbiB3aGlsZSByZXNwZWN0aW5nIHZhbGlkYXRpb24gZXJyb3Igc3RhdGVzLlxuICAgKiBXaGVuIHZhbGlkYXRpb24gZXJyb3JzIGFyZSBwcmVzZW50LCB0aGUgYWNjb3JkaW9uIGNhbm5vdCBiZSBjb2xsYXBzZWQgdG8gZW5zdXJlIHVzZXJzIGNhbiBzZWVcbiAgICogYW5kIGFkZHJlc3MgdGhlIGVycm9ycy4gV2hlbiBubyBlcnJvcnMgZXhpc3QsIHVzZXJzIGNhbiBmcmVlbHkgdG9nZ2xlIHRoZSBhY2NvcmRpb24gc3RhdGUuXG4gICAqIFRoaXMgbWV0aG9kIGFsc28gc3RvcHMgZXZlbnQgcHJvcGFnYXRpb24gdG8gcHJldmVudCB1bndhbnRlZCBzaWRlIGVmZmVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IFtldmVudF0gLSBPcHRpb25hbCBldmVudCBvYmplY3QgZnJvbSB1c2VyIGludGVyYWN0aW9uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZUFjY29yZGlvblRvZ2dsZShldmVudD86IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgaWYoZXZlbnQpXG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBpZighdGhpcy5oYXNWYWxpZGF0aW9uRXJyb3JzKSB7XG4gICAgICB0aGlzLmFjY29yZGlvbkNvbXBvbmVudC52YWx1ZSA9IHRoaXMuaXNPcGVuID8gdW5kZWZpbmVkIDogJ29wZW4nO1xuICAgICAgdGhpcy5pc09wZW4gPSAhIXRoaXMuYWNjb3JkaW9uQ29tcG9uZW50LnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9yIGV2ZW50cyBmcm9tIGNoaWxkIGZvcm0gZmllbGRzLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgdmFsaWRhdGlvbiBlcnJvciBldmVudHMgZGlzcGF0Y2hlZCBieSBmb3JtIGZpZWxkcyB3aXRoaW4gdGhlIGZpZWxkc2V0LlxuICAgKiBXaGVuIGVycm9ycyBhcmUgZGV0ZWN0ZWQsIHRoZSBhY2NvcmRpb24gaXMgZm9yY2VkIG9wZW4gYW5kIHByZXZlbnRlZCBmcm9tIGNvbGxhcHNpbmdcbiAgICogdG8gZW5zdXJlIHVzZXJzIGNhbiBzZWUgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzXG4gICAqIGVycm9yIHN0YXRlIGFuZCBhY2NvcmRpb24gdmlzaWJpbGl0eSBhY2NvcmRpbmdseS5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgLSBDdXN0b20gZXZlbnQgY29udGFpbmluZyB2YWxpZGF0aW9uIGVycm9yIGRldGFpbHNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlVmFsaWRhdGlvbkVycm9yKGV2ZW50OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHtoYXNFcnJvcnN9ID0gZXZlbnQuZGV0YWlsO1xuICAgIHRoaXMuaXNPcGVuID0gdGhpcy5oYXNWYWxpZGF0aW9uRXJyb3JzID0gaGFzRXJyb3JzO1xuICAgIGlmKGhhc0Vycm9ycylcbiAgICAgIHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50LnZhbHVlID0gJ29wZW4nO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhbmQgc3RvcmVzIGEgbmV3IG9yIHVwZGF0ZWQgdmFsdWUgaW4gdGhlIGZpZWxkc2V0LlxuICAgKiBAc3VtbWFyeSBIYW5kbGVzIGJvdGggY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9ucyBmb3IgZmllbGRzZXQgaXRlbXMuIFBhcnNlcyBhbmQgY2xlYW5zXG4gICAqIHRoZSBpbnB1dCB2YWx1ZSwgZGV0ZXJtaW5lcyB0aGUgb3BlcmF0aW9uIHR5cGUgYmFzZWQgb24gdGhlIHVwZGF0aW5nIHN0YXRlLCBhbmQgZWl0aGVyXG4gICAqIGFkZHMgYSBuZXcgaXRlbSBvciB1cGRhdGVzIGFuIGV4aXN0aW5nIG9uZS4gTWFpbnRhaW5zIGRhdGEgaW50ZWdyaXR5IGFuZCBVSSBjb25zaXN0ZW5jeS5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBzZXRWYWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gKHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1BcnJheSkuY29udHJvbHMubWFwKCh7dmFsdWV9KSA9PiB2YWx1ZSk7XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMudmFsdWVcbiAgICAuZmlsdGVyKHYgPT4gdlt0aGlzLnBrXSAhPT0gdW5kZWZpbmVkKVxuICAgIC5tYXAoKHYsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pdGVtTWFwcGVyKHYsIHRoaXMubWFwcGVyKSxcbiAgICAgICAgaW5kZXg6IGluZGV4ICsgMVxuICAgICAgfSBhcyBJRmllbGRTZXRJdGVtO1xuICAgIH0pO1xuICAgIGNvbnN0IGlucHV0Q29udGFpbmVycyA9IHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRjZi1pbnB1dC1pdGVtJyk7XG4gICAgaW5wdXRDb250YWluZXJzLmZvckVhY2goKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCBpb24taW5wdXQsIGlvbi10ZXh0YXJlYSwgdGV4dGFyZWEnKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmKGlucHV0KVxuICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgIH0pXG4gICAgdGhpcy51cGRhdGluZ0l0ZW0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEF1dG9tYXRpY2FsbHkgY29uZmlndXJlcyB0aGUgZmllbGQgbWFwcGluZyBiYXNlZCBvbiB0aGUgdmFsdWUgc3RydWN0dXJlLlxuICAgKiBAc3VtbWFyeSBBbmFseXplcyB0aGUgcHJvdmlkZWQgdmFsdWUgb2JqZWN0IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRoZSBwcmltYXJ5IGtleVxuICAgKiBhbmQgY3JlYXRlIGFwcHJvcHJpYXRlIGZpZWxkIG1hcHBpbmdzIGZvciBkaXNwbGF5IHB1cnBvc2VzLiBTZXRzIHVwIHRoZSBtYXBwZXIgb2JqZWN0XG4gICAqIHdpdGggdGl0bGUsIGRlc2NyaXB0aW9uLCBhbmQgaW5kZXggZmllbGRzIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5VmFsdWV9IHZhbHVlIC0gU2FtcGxlIHZhbHVlIG9iamVjdCB1c2VkIHRvIGRldGVybWluZSBmaWVsZCBtYXBwaW5nc1xuICAgKiBAcmV0dXJucyB7S2V5VmFsdWV9IFRoZSBjb25maWd1cmVkIG1hcHBlciBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGdldE1hcHBlcih2YWx1ZTogS2V5VmFsdWUpOiBLZXlWYWx1ZSB7XG4gICAgaWYoIXRoaXMucGspXG4gICAgICB0aGlzLnBrID0gT2JqZWN0LmtleXModmFsdWUpWzBdO1xuICAgIGlmKCFPYmplY3Qua2V5cyh0aGlzLm1hcHBlcikubGVuZ3RoKVxuICAgICAgdGhpcy5tYXBwZXJbJ3RpdGxlJ10gPSB0aGlzLnBrO1xuICAgIHRoaXMubWFwcGVyWydpbmRleCddID0gXCJpbmRleFwiO1xuICAgIGZvcihjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIGlmKE9iamVjdC5rZXlzKHRoaXMubWFwcGVyKS5sZW5ndGggPj0gMiB8fCBPYmplY3Qua2V5cyh0aGlzLm1hcHBlcikubGVuZ3RoID09PSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKVxuICAgICAgICBicmVhaztcbiAgICAgIGlmKCF0aGlzLm1hcHBlclsndGl0bGUnXSkge1xuICAgICAgICB0aGlzLm1hcHBlclsndGl0bGUnXSA9IGtleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwcGVyWydkZXNjcmlwdGlvbiddID0ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXBwZXI7XG4gIH1cbn1cbiIsIlxuXG48ZmllbGRzZXRcbiAgKGZpZWxkc2V0QWRkR3JvdXBFdmVudCk9XCJoYW5kbGVDcmVhdGVJdGVtKCRldmVudClcIlxuICAoZmllbGRzZXRSZW1vdmVHcm91cEV2ZW50KT1cImhhbmRsZVJlbW92ZUl0ZW0odW5kZWZpbmVkLCAkZXZlbnQpXCJcbiAgW2NsYXNzXT1cIidkY2YtZmllbGRzZXQgJyArIG9wZXJhdGlvblwiXG4gICNjb21wb25lbnQ+XG4gIDxpb24tYWNjb3JkaW9uLWdyb3VwIFtuZ0NsYXNzXT1cInsnb3Blbic6IGlzT3BlbiwgJ2hhc1ZhbGlkYXRpb25FcnJvcnMnOiBoYXNWYWxpZGF0aW9uRXJyb3JzfVwiICAodmFsaWRhdGlvbkVycm9yRXZlbnQpPVwiaGFuZGxlVmFsaWRhdGlvbkVycm9yKCRldmVudClcIiAjYWNjb3JkaW9uQ29tcG9uZW50PlxuICAgIDxpb24tYWNjb3JkaW9uIHZhbHVlPVwib3BlblwiPlxuICAgICAgPGlvbi1pdGVtIHNsb3Q9XCJoZWFkZXJcIiAoY2xpY2spPVwiaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKCRldmVudClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi1mbGV4IGRjZi1mbGV4LW1pZGRsZSBkY2Ytd2lkdGgtMS0xXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi13aWR0aC1leHBhbmRcIj5cbiAgICAgICAgICAgIDxsZWdlbmQ+e3sgbmFtZSB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZighaXNSZXF1aXJlZCAmJiBbJ2NyZWF0ZScsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLXdpZHRoLWF1dG8gZGNmLWRlbGV0ZVwiPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlUmVtb3ZlQ29tcG9uZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyYXNoLW91dGxpbmVcIiBjb2xvcj1cImRhcmtcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICA8ZGl2IHNsb3Q9XCJjb250ZW50XCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzT3BlblwiPlxuICAgICAgICBAaWYobXVsdGlwbGUgJiYgaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwiZGNmLWZpZWxkcy1saXN0XCI+XG4gICAgICAgICAgICA8aW9uLXJlb3JkZXItZ3JvdXAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXAucGFyZW50XCIgW2Rpc2FibGVkXT1cInVwZGF0aW5nSXRlbVwiIChpb25JdGVtUmVvcmRlcik9XCJoYW5kbGVSZW9yZGVySXRlbXMoJGFueSgkZXZlbnQpKVwiICNhY2NvcmRpb25Db21wb25lbnQ+XG4gICAgICAgICAgICAgIEBmb3IoaXRlbSBvZiBpdGVtczsgdHJhY2sgaXRlbS5pbmRleCkge1xuICAgICAgICAgICAgICAgIDxpb24taXRlbSBbbmdDbGFzc109XCJ7J25vdC11bmlxdWUnOiBpdGVtLnRpdGxlID09PSBpc1VuaXF1ZUVycm9yfVwiIGxpbmVzPVwiZnVsbFwiIFtidXR0b25dPVwiZmFsc2VcIiBbbmdDbGFzc109XCJ7J3VwZGF0aW5nJzogdXBkYXRpbmdJdGVtPy5bcGtdID09PSBpdGVtLnRpdGxlfVwiPlxuICAgICAgICAgICAgICAgICAgQGlmKGl0ZW1zPy5sZW5ndGggPiAxICYmICF1cGRhdGluZ0l0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgPGlvbi1yZW9yZGVyIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwic3dhcC12ZXJ0aWNhbC1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tcmVvcmRlcj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBjbGFzcz1cImRjZi1yZW9yZGVyLWRpc2FibGVkXCIgc2l6ZT1cInNtYWxsXCIgbmFtZT1cInN3YXAtdmVydGljYWwtb3V0bGluZVwiIGRpc2FibGVkPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBbY29sb3JdPVwiKGl0ZW0udGl0bGUgPT09IGlzVW5pcXVlRXJyb3IgJiYgIXVwZGF0aW5nSXRlbS50aXRsZSA9PT0gaXRlbS50aXRsZSkgPyAnZGFuZ2VyJyA6ICcnXCI+e3sgaXRlbS5pbmRleCB9fS4ge3sgaXRlbS50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICBAaWYoaXRlbS5kZXNjcmlwdGlvbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImRjZi1zdWJ0aXRsZVwiPnt7aXRlbS5kZXNjcmlwdGlvbn19PC9pb24tdGV4dD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICBAaWYoIXVwZGF0aW5nSXRlbSB8fCB1cGRhdGluZ0l0ZW0/Lltwa10gIT09IGl0ZW0udGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cImhhbmRsZVVwZGF0ZUl0ZW0oaXRlbS50aXRsZSwgJGluZGV4KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY3JlYXRlLW91dGxpbmVcIiBjb2xvcj1cImRhcmtcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBAaWYoIXVwZGF0aW5nSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlUmVtb3ZlSXRlbShpdGVtLnRpdGxlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwidHJhc2gtb3V0bGluZVwiIGNvbG9yPVwiZGFya1wiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9pb24tcmVvcmRlci1ncm91cD5cbiAgICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgICB9XG5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgICAgIEBpZihtdWx0aXBsZSAmJiBbJ2NyZWF0ZScsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgQGlmKGlzVW5pcXVlRXJyb3IpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2Ytbm90LXVuaXF1ZS1jb250YWluZXIgZGNmLWFuaW1hdGlvbiBkY2YtYW5pbWF0aW9uLWJvdHRvbS1zbWFsbCBkY2YtYW5pbWF0aW9uLWZhc3RcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiBkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2Ytd2lkdGgtMS0xIFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2YtYXV0b1wiIFthdHRyLnN0eWxlXT1cIidtYXgtd2lkdGg6IDUwcHgnXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFsZXJ0LWNpcmNsZS1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLXdpZHRoLWV4cGFuZFwiPlxuICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJkY2YtdGV4dC1zbWFsbFwiPnt7IGxvY2FsZSArICcubm90X3VuaXF1ZScgfCB0cmFuc2xhdGUgOiB7IHZhbHVlOiBpc1VuaXF1ZUVycm9yIH0gfX08L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLW1hcmdpbi1ib3R0b20gZGNmLWdyaWQgZGNmLWdyaWQtY29sbGFwc2UgZGNmLWZsZXhcIj5cbiAgICAgICAgICAgIEBpZih1cGRhdGluZ0l0ZW0pIHtcbiAgICAgICAgICAgICAgPGlvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYW5nZXJcIiAoY2xpY2spPVwiaGFuZGxlQ2FuY2VsVXBkYXRlSXRlbSgpXCI+XG4gICAgICAgICAgICAgICAge3sgYnV0dG9uQ2FuY2VsTGFiZWwgfX1cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGlvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgZmlsbD1cImNsZWFyXCIgY2xhc3M9XCJkY2YtYnV0dG9uLWFkZFwiIChjbGljayk9XCJoYW5kbGVDcmVhdGVJdGVtKClcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhZGQtb3V0bGluZVwiIHNsb3Q9XCJzdGFydFwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgIHt7YnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgPC9kaXY+XG4gICAgPC9pb24tYWNjb3JkaW9uPlxuICA8L2lvbi1hY2NvcmRpb24tZ3JvdXA+XG48L2ZpZWxkc2V0PlxuXG4iXX0=
|
|
675
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2ZpZWxkc2V0L2ZpZWxkc2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9maWVsZHNldC9maWVsZHNldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUF5QyxNQUFNLGNBQWMsQ0FBQztBQUM5RixPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUEwQixlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxTCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQUtwQzs7Ozs7Ozs7Ozs7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S0FBSztzQkFESixLQUFLO2dCQWFOLFFBQVE7c0JBRFAsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkLCBSZW5kZXJlcjIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pYywgRXZlbnRDb25zdGFudHMsIEhhbmRsZXJMaWtlLCBIVE1MRm9ybVRhcmdldCwgS2V5VmFsdWUgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJb25BY2NvcmRpb24sIElvbkFjY29yZGlvbkdyb3VwLCBJb25CdXR0b24sIElvbkl0ZW0sIElvbkxhYmVsLCBJb25MaXN0LCBJdGVtUmVvcmRlckV2ZW50RGV0YWlsLCBJb25SZW9yZGVyR3JvdXAsIElvblJlb3JkZXIsIElvbkljb24sIElvblRleHQgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGNsZWFuU3BhY2VzLCBnZW5lcmF0ZVJhbmRvbVZhbHVlLCBpdGVtTWFwcGVyLCB3aW5kb3dFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5neEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgYWxlcnRDaXJjbGVPdXRsaW5lLCBjcmVhdGVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSUZpZWxkU2V0SXRlbSwgSUZpZWxkU2V0VmFsaWRhdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5cblxuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIER5bmFtaWMgZmllbGRzZXQgY29tcG9uZW50IHdpdGggY29sbGFwc2libGUgYWNjb3JkaW9uIGZ1bmN0aW9uYWxpdHkuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHNvcGhpc3RpY2F0ZWQgZmllbGRzZXQgY29udGFpbmVyIHRoYXQgYXV0b21hdGljYWxseVxuICogYWRhcHRzIGl0cyBiZWhhdmlvciBiYXNlZCBvbiBDUlVEIG9wZXJhdGlvbnMuIEl0IGludGVncmF0ZXMgc2VhbWxlc3NseSB3aXRoIElvbmljJ3NcbiAqIGFjY29yZGlvbiBjb21wb25lbnRzIHRvIGNyZWF0ZSBleHBhbmRhYmxlL2NvbGxhcHNpYmxlIHNlY3Rpb25zIGZvciBvcmdhbml6aW5nIGZvcm1cbiAqIGNvbnRlbnQgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24uIFRoZSBjb21wb25lbnQgaW50ZWxsaWdlbnRseSBkZXRlcm1pbmVzIGl0cyBpbml0aWFsXG4gKiBzdGF0ZSBiYXNlZCBvbiB0aGUgb3BlcmF0aW9uIHR5cGUsIG9wZW5pbmcgYXV0b21hdGljYWxseSBmb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnNcbiAqIHdoaWxlIHJlbWFpbmluZyBjbG9zZWQgZm9yIENSRUFURSBhbmQgVVBEQVRFIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDwhLS0gQmFzaWMgdXNhZ2Ugd2l0aCBhdXRvbWF0aWMgc3RhdGUgbWFuYWdlbWVudCAtLT5cbiAqIDxuZ3gtZGVjYWYtZmllbGRzZXRcbiAqICAgbmFtZT1cIlBlcnNvbmFsIEluZm9ybWF0aW9uXCJcbiAqICAgW29wZXJhdGlvbl09XCJPcGVyYXRpb25LZXlzLlJFQURcIlxuICogICB0YXJnZXQ9XCJfc2VsZlwiPlxuICogICA8aW9uLWlucHV0IGxhYmVsPVwiTmFtZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgbmFtZVwiPjwvaW9uLWlucHV0PlxuICogICA8aW9uLWlucHV0IGxhYmVsPVwiRW1haWxcIiB0eXBlPVwiZW1haWxcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGVtYWlsXCI+PC9pb24taW5wdXQ+XG4gKiA8L25neC1kZWNhZi1maWVsZHNldD5cbiAqXG4gKiA8IS0tIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIG9wZXJhdGlvbiAtLT5cbiAqIDxuZ3gtZGVjYWYtZmllbGRzZXRcbiAqICAgbmFtZT1cIkNvbnRhY3QgRGV0YWlsc1wiXG4gKiAgIFtvcGVyYXRpb25dPVwiY3VycmVudE9wZXJhdGlvblwiXG4gKiAgIHRhcmdldD1cIl9ibGFua1wiPlxuICogICA8IS0tIENvbXBsZXggZm9ybSBmaWVsZHMgLS0+XG4gKiA8L25neC1kZWNhZi1maWVsZHNldD5cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRmllbGRzZXRDb21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgSSBhcyBJb25pYyBBY2NvcmRpb25cbiAqICAgcGFydGljaXBhbnQgRCBhcyBET01cbiAqXG4gKiAgIEYtPj5GOiBuZ0FmdGVyVmlld0luaXQoKVxuICogICBhbHQgb3BlcmF0aW9uIGlzIFJFQUQgb3IgREVMRVRFXG4gKiAgICAgRi0+PkY6IFNldCBpc09wZW4gPSB0cnVlXG4gKiAgICAgRi0+PkQ6IFF1ZXJ5IGFjY29yZGlvbiBlbGVtZW50XG4gKiAgICAgRi0+Pkk6IFNldCB2YWx1ZSBhdHRyaWJ1dGUgdG8gJ29wZW4nXG4gKiAgICAgRi0+PkY6IFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICogICBlbmRcbiAqICAgVS0+Pkk6IENsaWNrIGFjY29yZGlvbiBoZWFkZXJcbiAqICAgSS0+PkY6IGhhbmRsZUNoYW5nZShldmVudClcbiAqICAgRi0+PkY6IFVwZGF0ZSBpc09wZW4gc3RhdGVcbiAqICAgRi0+Pkk6IFJlZmxlY3QgbmV3IHN0YXRlXG4gKlxuICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gKi9cbkBEeW5hbWljKClcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ25neC1kZWNhZi1maWVsZHNldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWVsZHNldC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpZWxkc2V0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHNjaGVtYXM6IFtdLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIElvbkFjY29yZGlvbkdyb3VwLFxuICAgIElvbkFjY29yZGlvbixcbiAgICBJb25MaXN0LFxuICAgIElvbkl0ZW0sXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uUmVvcmRlcixcbiAgICBJb25UZXh0LFxuICAgIElvblJlb3JkZXJHcm91cCxcbiAgICBJb25CdXR0b24sXG4gICAgSW9uSWNvbixcbiAgXSxcbiAgaG9zdDogeydbYXR0ci5pZF0nOiAnb3ZlcnJpb2RlICd9LFxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZHNldENvbXBvbmVudCBleHRlbmRzIE5neEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZmVyZW5jZSB0byB0aGUgaW9uLWFjY29yZGlvbi1ncm91cCBjb21wb25lbnQgZm9yIHByb2dyYW1tYXRpYyBjb250cm9sLlxuICAgKiBAc3VtbWFyeSBWaWV3Q2hpbGQgcmVmZXJlbmNlIHRoYXQgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgSW9uaWMgYWNjb3JkaW9uIGdyb3VwIGNvbXBvbmVudC5cbiAgICogVGhpcyBlbmFibGVzIHByb2dyYW1tYXRpYyBjb250cm9sIG92ZXIgdGhlIGFjY29yZGlvbidzIGV4cGFuZC9jb2xsYXBzZSBzdGF0ZSwgYWxsb3dpbmdcbiAgICogdGhlIGNvbXBvbmVudCB0byBvcGVuL2Nsb3NlIHRoZSBhY2NvcmRpb24gYmFzZWQgb24gdmFsaWRhdGlvbiBlcnJvcnMsIENSVUQgb3BlcmF0aW9ucyxcbiAgICogb3Igb3RoZXIgYnVzaW5lc3MgbG9naWMgcmVxdWlyZW1lbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7SW9uQWNjb3JkaW9uR3JvdXB9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnYWNjb3JkaW9uQ29tcG9uZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGFjY29yZGlvbkNvbXBvbmVudCE6IElvbkFjY29yZGlvbkdyb3VwO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGlzcGxheSBuYW1lIG9yIHRpdGxlIG9mIHRoZSBmaWVsZHNldCBzZWN0aW9uLlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBsZWdlbmQgb3IgaGVhZGVyIHRleHQgdGhhdCBhcHBlYXJzIGluIHRoZSBhY2NvcmRpb24gaGVhZGVyLiBUaGlzIHRleHRcbiAgICogcHJvdmlkZXMgYSBjbGVhciBsYWJlbCBmb3IgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24sIGhlbHBpbmcgdXNlcnMgdW5kZXJzdGFuZCB3aGF0IGNvbnRlbnRcbiAgICogaXMgY29udGFpbmVkIHdpdGhpbi4gVGhlIG5hbWUgaXMgZGlzcGxheWVkIHByb21pbmVudGx5IGFuZCBzZXJ2ZXMgYXMgdGhlIGNsaWNrYWJsZSBhcmVhXG4gICAqIGZvciBleHBhbmRpbmcvY29sbGFwc2luZyB0aGUgZmllbGRzZXQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdDaGlsZCdcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBuYW1lOiBzdHJpbmcgPSAnQ2hpbGQnO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcGFyZW50IGNvbXBvbmVudCBpZGVudGlmaWVyIGZvciBoaWVyYXJjaGljYWwgZmllbGRzZXQgcmVsYXRpb25zaGlwcy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBwYXJlbnQgY29tcG9uZW50IG5hbWUgdGhhdCB0aGlzIGZpZWxkc2V0IGJlbG9uZ3MgdG8gaW4gYSBoaWVyYXJjaGljYWxcbiAgICogZm9ybSBzdHJ1Y3R1cmUuIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBmb3IgZXZlbnQgYnViYmxpbmcgYW5kIGVzdGFibGlzaGluZyBwYXJlbnQtY2hpbGRcbiAgICogcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGZpZWxkc2V0cyBpbiBjb21wbGV4IGZvcm1zIHdpdGggbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdDaGlsZCdcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjaGlsZE9mOiBzdHJpbmcgPSAnQ2hpbGQnO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcGFyZW50IGNvbXBvbmVudCBpZGVudGlmaWVyIGZvciBoaWVyYXJjaGljYWwgZmllbGRzZXQgcmVsYXRpb25zaGlwcy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBwYXJlbnQgY29tcG9uZW50IG5hbWUgdGhhdCB0aGlzIGZpZWxkc2V0IGJlbG9uZ3MgdG8gaW4gYSBoaWVyYXJjaGljYWxcbiAgICogZm9ybSBzdHJ1Y3R1cmUuIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBmb3IgZXZlbnQgYnViYmxpbmcgYW5kIGVzdGFibGlzaGluZyBwYXJlbnQtY2hpbGRcbiAgICogcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGZpZWxkc2V0cyBpbiBjb21wbGV4IGZvcm1zIHdpdGggbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdDaGlsZCdcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSB1aWQ6IHN0cmluZyA9IGdlbmVyYXRlUmFuZG9tVmFsdWUoMTIpO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXN0b20gdHlwZSBkZWZpbml0aW9ucyBmb3Igc3BlY2lhbGl6ZWQgZmllbGRzZXQgYmVoYXZpb3IuXG4gICAqIEBzdW1tYXJ5IERlZmluZXMgY3VzdG9tIGRhdGEgdHlwZXMgb3IgdmFsaWRhdGlvbiBydWxlcyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoaXMgZmllbGRzZXQuXG4gICAqIENhbiBiZSBhIHNpbmdsZSB0eXBlIHN0cmluZyBvciBhcnJheSBvZiB0eXBlcyB0aGF0IGRldGVybWluZSBob3cgdGhlIGZpZWxkc2V0IGhhbmRsZXNcbiAgICogZGF0YSB2YWxpZGF0aW9uLCBmb3JtYXR0aW5nLCBhbmQgZGlzcGxheSBiZWhhdmlvciBmb3Igc3BlY2lhbGl6ZWQgdXNlIGNhc2VzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY3VzdG9tVHlwZXMhOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IENSVUQgb3BlcmF0aW9uIGNvbnRleHQuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIGNvbXBvbmVudCdzIGluaXRpYWwgYmVoYXZpb3IgYW5kIHN0YXRlIGJhc2VkIG9uIHRoZSBjdXJyZW50IG9wZXJhdGlvbi5cbiAgICogVGhpcyBpbnB1dCBpcyBjcnVjaWFsIGZvciBhdXRvLXN0YXRlIG1hbmFnZW1lbnQ6IFJFQUQgYW5kIERFTEVURSBvcGVyYXRpb25zIGF1dG9tYXRpY2FsbHlcbiAgICogb3BlbiB0aGUgZmllbGRzZXQgdG8gc2hvdyBjb250ZW50LCB3aGlsZSBDUkVBVEUgYW5kIFVQREFURSBvcGVyYXRpb25zIGtlZXAgaXQgY2xvc2VkXG4gICAqIGluaXRpYWxseS4gVGhpcyBwcm92aWRlcyBhbiBpbnR1aXRpdmUgdXNlciBleHBlcmllbmNlIGFsaWduZWQgd2l0aCBvcGVyYXRpb24gc2VtYW50aWNzLlxuICAgKlxuICAgKiBAdHlwZSB7T3BlcmF0aW9uS2V5c31cbiAgICogQGRlZmF1bHQgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgQ1JVRCBvcGVyYXRpb24gdHlwZSBmb3IgdGhlIGN1cnJlbnQgZmllbGRzZXQgY29udGV4dC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgY29tcG9uZW50J3MgaW5pdGlhbCBiZWhhdmlvciBhbmQgc3RhdGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW9uLlxuICAgKiBUaGlzIGlucHV0IGlzIGNydWNpYWwgZm9yIGF1dG8tc3RhdGUgbWFuYWdlbWVudDogUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMgYXV0b21hdGljYWxseVxuICAgKiBvcGVuIHRoZSBmaWVsZHNldCB0byBzaG93IGNvbnRlbnQsIHdoaWxlIENSRUFURSBhbmQgVVBEQVRFIG9wZXJhdGlvbnMga2VlcCBpdCBjbG9zZWRcbiAgICogaW5pdGlhbGx5LiBUaGlzIHByb3ZpZGVzIGFuIGludHVpdGl2ZSB1c2VyIGV4cGVyaWVuY2UgYWxpZ25lZCB3aXRoIG9wZXJhdGlvbiBzZW1hbnRpY3MuXG4gICAqXG4gICAqIEB0eXBlIHtPcGVyYXRpb25LZXlzfVxuICAgKiBAZGVmYXVsdCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMgPSBPcGVyYXRpb25LZXlzLlJFQUQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFjdGl2ZSBmb3JtIGdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpZWxkc2V0LlxuICAgKiBAc3VtbWFyeSBUaGUgRm9ybUdyb3VwIGluc3RhbmNlIHRoYXQgY29udGFpbnMgYWxsIGZvcm0gY29udHJvbHMgd2l0aGluIHRoaXMgZmllbGRzZXQuXG4gICAqIFVzZWQgZm9yIGZvcm0gdmFsaWRhdGlvbiwgdmFsdWUgbWFuYWdlbWVudCwgYW5kIGludGVncmF0aW9uIHdpdGggQW5ndWxhcidzIHJlYWN0aXZlIGZvcm1zLlxuICAgKlxuICAgKiBAdHlwZSB7Rm9ybUdyb3VwfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGZvcm1Hcm91cCE6ICBGb3JtQXJyYXk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IHRpdGxlIHRleHQgZm9yIHRoZSBmaWVsZHNldCBjb250ZW50LlxuICAgKiBAc3VtbWFyeSBEaXNwbGF5IHRpdGxlIHVzZWQgZm9yIGZpZWxkc2V0IGlkZW50aWZpY2F0aW9uIGFuZCBjb250ZW50IG9yZ2FuaXphdGlvbi5cbiAgICogUHJvdmlkZXMgc2VtYW50aWMgbWVhbmluZyB0byB0aGUgZ3JvdXBlZCBmb3JtIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0aXRsZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlY29uZGFyeSBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBwcm92aWRlcyBjb250ZXh0IG9yIGluc3RydWN0aW9uc1xuICAgKiByZWxhdGVkIHRvIHRoZSBmaWVsZHNldCBjb250ZW50IGFuZCBwdXJwb3NlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGRlc2NyaXB0aW9uITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRm9ybSB0YXJnZXQgYXR0cmlidXRlIGZvciBuZXN0ZWQgZm9ybSBzdWJtaXNzaW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXJlIHRvIGRpc3BsYXkgdGhlIHJlc3BvbnNlIGFmdGVyIHN1Ym1pdHRpbmcgZm9ybXMgY29udGFpbmVkIHdpdGhpblxuICAgKiB0aGUgZmllbGRzZXQuIFRoaXMgYXR0cmlidXRlIG1pcnJvcnMgdGhlIEhUTUwgZm9ybSB0YXJnZXQgYmVoYXZpb3IsIGFsbG93aW5nIGNvbnRyb2wgb3ZlclxuICAgKiB3aGV0aGVyIGZvcm0gc3VibWlzc2lvbnMgb3BlbiBpbiB0aGUgc2FtZSB3aW5kb3csIG5ldyB3aW5kb3csIG9yIHNwZWNpZmljIGZyYW1lLiBVc2VmdWxcbiAgICogZm9yIGNvbXBsZXggZm9ybSB3b3JrZmxvd3MgYW5kIG11bHRpLXN0ZXAgcHJvY2Vzc2VzLlxuICAgKlxuICAgKiBAdHlwZSB7SFRNTEZvcm1UYXJnZXR9XG4gICAqIEBkZWZhdWx0ICdfc2VsZidcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0YXJnZXQ6IEhUTUxGb3JtVGFyZ2V0ID0gJ19zZWxmJztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5hYmxlcyBtdWx0aXBsZSBpdGVtIG1hbmFnZW1lbnQgd2l0aGluIHRoZSBmaWVsZHNldC5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGUgZmllbGRzZXQgc3VwcG9ydHMgYWRkaW5nIG11bHRpcGxlIHZhbHVlcy5cbiAgICogV2hlbiB0cnVlLCBkaXNwbGF5cyBhIHJlb3JkZXJhYmxlIGxpc3Qgb2YgaXRlbXMgd2l0aCBhZGQvcmVtb3ZlIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiByYXcgdmFsdWVzIHN0b3JlZCBpbiB0aGUgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHRoZSBhY3R1YWwgZGF0YSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGZpZWxkc2V0LlxuICAgKiBUaGlzIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBmaWVsZHNldCdzIGRhdGEgc3RhdGUuXG4gICAqXG4gICAqIEB0eXBlIHtLZXlWYWx1ZVtdfVxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbHVlOiBLZXlWYWx1ZVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBoYW5kbGVyIGZ1bmN0aW9ucyBmb3IgY3VzdG9tIGZpZWxkc2V0IGFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEEgcmVjb3JkIG9mIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGtleWVkIGJ5IGV2ZW50IG5hbWVzIHRoYXQgY2FuIGJlIHRyaWdnZXJlZFxuICAgKiB3aXRoaW4gdGhlIGZpZWxkc2V0LiBUaGVzZSBoYW5kbGVycyBwcm92aWRlIGV4dGVuc2liaWxpdHkgZm9yIGN1c3RvbSBidXNpbmVzcyBsb2dpY1xuICAgKiBhbmQgY2FuIGJlIGludm9rZWQgZm9yIHZhcmlvdXMgZmllbGRzZXQgb3BlcmF0aW9ucyBhbmQgdXNlciBpbnRlcmFjdGlvbnMuXG4gICAqXG4gICAqIEB0eXBlIHtIYW5kbGVyTGlrZX1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBoYW5kbGVycyE6IEhhbmRsZXJMaWtlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXJyYXkgb2YgZm9ybWF0dGVkIGl0ZW1zIGZvciBVSSBkaXNwbGF5LlxuICAgKiBAc3VtbWFyeSBDb250YWlucyB0aGUgcHJvY2Vzc2VkIGl0ZW1zIHJlYWR5IGZvciBkaXNwbGF5IGluIHRoZSBjb21wb25lbnQgdGVtcGxhdGUuXG4gICAqIFRoZXNlIGl0ZW1zIGFyZSBtYXBwZWQgZnJvbSB0aGUgcmF3IHZhbHVlcyB1c2luZyB0aGUgbWFwcGVyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtJRmllbGRTZXRJdGVtW119XG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXRlbXM6IElGaWVsZFNldEl0ZW1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gZm9yIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBIb2xkcyB0aGUgaXRlbSBiZWluZyBlZGl0ZWQgd2hlbiBpbiB1cGRhdGUgbW9kZS4gVXNlZCB0byB0cmFja1xuICAgKiB3aGljaCBpdGVtIGlzIGJlaW5nIG1vZGlmaWVkIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHRoZSBjb3JyZWN0IGl0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtJRmllbGRTZXRJdGVtIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHVwZGF0aW5nSXRlbSE6IElGaWVsZFNldEl0ZW0gfCB1bmRlZmluZWQ7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGFjY29yZGlvbiAoZXhwYW5kZWQgb3IgY29sbGFwc2VkKS5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgdHJhY2tzIHdoZXRoZXIgdGhlIGZpZWxkc2V0IGFjY29yZGlvbiBpcyBjdXJyZW50bHkgb3BlbiBvciBjbG9zZWQuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBtYW5hZ2VkIGJhc2VkIG9uIHVzZXIgaW50ZXJhY3Rpb25zIGFuZCBpbml0aWFsIG9wZXJhdGlvbiBzdGF0ZS5cbiAgICogSXQgc2VydmVzIGFzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgY29tcG9uZW50J3MgdmlzaWJpbGl0eSBzdGF0ZSBhbmQgaXMgdXNlZFxuICAgKiB0byBjb29yZGluYXRlIGJldHdlZW4gdXNlciBhY3Rpb25zIGFuZCBwcm9ncmFtbWF0aWMgc3RhdGUgY2hhbmdlcy4gVGhlIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHlcbiAgICogc2V0IGJhc2VkIG9uIENSVUQgb3BlcmF0aW9ucyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIHVwZGF0ZWQgdGhyb3VnaCB1c2VyIGludGVyYWN0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGRzZXQgY29udGFpbnMgcmVxdWlyZWQgZm9ybSBmaWVsZHMuXG4gICAqIEBzdW1tYXJ5IEJvb2xlYW4gZmxhZyB0aGF0IHNpZ25hbHMgdGhlIHByZXNlbmNlIG9mIG1hbmRhdG9yeSBpbnB1dCBmaWVsZHMgd2l0aGluIHRoZSBmaWVsZHNldC5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IHNldCBieSB0aGUgQ29sbGFwc2FibGVEaXJlY3RpdmUgd2hlbiByZXF1aXJlZCBmaWVsZHMgYXJlIGRldGVjdGVkLFxuICAgKiBhbmQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgc3BlY2lhbCBzdHlsaW5nLCB2YWxpZGF0aW9uIGxvZ2ljLCBvciBVSSBpbmRpY2F0b3JzIHRvIGhpZ2hsaWdodFxuICAgKiBmaWVsZHNldHMgdGhhdCBjb250YWluIG1hbmRhdG9yeSBpbmZvcm1hdGlvbi4gSXQgaGVscHMgd2l0aCBmb3JtIHZhbGlkYXRpb24gZmVlZGJhY2sgYW5kXG4gICAqIHVzZXIgZXhwZXJpZW5jZSBieSBtYWtpbmcgcmVxdWlyZWQgc2VjdGlvbnMgbW9yZSBwcm9taW5lbnQuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZHNldCBjb250YWlucyB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgdHJhY2tzIGlmIGFueSBmb3JtIGZpZWxkcyB3aXRoaW4gdGhlIGZpZWxkc2V0IGhhdmUgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBjb250cm9sIGFjY29yZGlvbiBiZWhhdmlvciB3aGVuIGVycm9ycyBhcmUgcHJlc2VudCwgcHJldmVudGluZ1xuICAgKiB1c2VycyBmcm9tIGNvbGxhcHNpbmcgdGhlIGFjY29yZGlvbiB3aGVuIHRoZXkgbmVlZCB0byBzZWUgYW5kIGFkZHJlc3MgdmFsaWRhdGlvbiBpc3N1ZXMuXG4gICAqIEl0J3MgYXV0b21hdGljYWxseSB1cGRhdGVkIHdoZW4gdmFsaWRhdGlvbiBlcnJvciBldmVudHMgYXJlIHJlY2VpdmVkIGZyb20gY2hpbGQgZm9ybSBmaWVsZHMuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhc1ZhbGlkYXRpb25FcnJvcnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZSBmb3IgZHVwbGljYXRlIHZhbHVlcy5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gYSB1c2VyIGF0dGVtcHRzIHRvIGFkZCBhIGR1cGxpY2F0ZSB2YWx1ZVxuICAgKiB0byB0aGUgZmllbGRzZXQuIFVzZWQgdG8gZGlzcGxheSB1bmlxdWVuZXNzIHZhbGlkYXRpb24gZmVlZGJhY2suXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaXNVbmlxdWVFcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIENSVUQgb3BlcmF0aW9uIGNvbnN0YW50cyBmb3IgdGVtcGxhdGUgdXNhZ2UuXG4gICAqIEBzdW1tYXJ5IEV4cG9zZXMgdGhlIE9wZXJhdGlvbktleXMgZW51bSB0byB0aGUgY29tcG9uZW50IHRlbXBsYXRlLCBlbmFibGluZyBjb25kaXRpb25hbFxuICAgKiByZW5kZXJpbmcgYW5kIGJlaGF2aW9yIGJhc2VkIG9uIG9wZXJhdGlvbiB0eXBlcy4gVGhpcyBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydHkgZW5zdXJlc1xuICAgKiB0aGF0IHRlbXBsYXRlIGxvZ2ljIGNhbiBhY2Nlc3Mgb3BlcmF0aW9uIGNvbnN0YW50cyB3aGlsZSBtYWludGFpbmluZyBlbmNhcHN1bGF0aW9uIGFuZFxuICAgKiBwcmV2ZW50aW5nIGFjY2lkZW50YWwgbW9kaWZpY2F0aW9uIG9mIHRoZSBlbnVtIHZhbHVlcy5cbiAgICpcbiAgICogQHR5cGUge0NydWRPcGVyYXRpb25zfVxuICAgKiBAZGVmYXVsdCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBPcGVyYXRpb25LZXlzOiBDcnVkT3BlcmF0aW9ucyA9IE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIHNlcnZpY2UuXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBtYW51YWwgY29udHJvbCBvdmVyIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzLlxuICAgKiBUaGlzIGlzIGVzc2VudGlhbCBmb3IgZW5zdXJpbmcgdGhhdCBwcm9ncmFtbWF0aWMgRE9NIGNoYW5nZXMgKGxpa2Ugc2V0dGluZyBhY2NvcmRpb25cbiAgICogYXR0cmlidXRlcykgYXJlIHByb3Blcmx5IHJlZmxlY3RlZCBpbiB0aGUgY29tcG9uZW50J3Mgc3RhdGUgYW5kIHRyaWdnZXIgYXBwcm9wcmlhdGVcbiAgICogdmlldyB1cGRhdGVzIHdoZW4gbW9kaWZpY2F0aW9ucyBvY2N1ciBvdXRzaWRlIHRoZSBub3JtYWwgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIGZsb3cuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtDaGFuZ2VEZXRlY3RvclJlZn1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIFJlbmRlcmVyMiBzZXJ2aWNlIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb24uXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBhIHNhZmUsIHBsYXRmb3JtLWFnbm9zdGljIHdheSB0byBtYW5pcHVsYXRlIERPTSBlbGVtZW50cy5cbiAgICogVGhpcyBzZXJ2aWNlIGVuc3VyZXMgcHJvcGVyIGhhbmRsaW5nIG9mIERPTSBvcGVyYXRpb25zIGFjcm9zcyBkaWZmZXJlbnQgcGxhdGZvcm1zIGFuZCBlbnZpcm9ubWVudHMsXG4gICAqIGluY2x1ZGluZyBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgYW5kIHdlYiB3b3JrZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVuZGVyZXIyfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRpb24gc2VydmljZSBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyB0cmFuc2xhdGlvbiBjYXBhYmlsaXRpZXMgZm9yIFVJIHRleHQuXG4gICAqIFVzZWQgdG8gdHJhbnNsYXRlIGJ1dHRvbiBsYWJlbHMgYW5kIHZhbGlkYXRpb24gbWVzc2FnZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7VHJhbnNsYXRlU2VydmljZX1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2NhbGl6ZWQgbGFiZWwgdGV4dCBmb3IgYWN0aW9uIGJ1dHRvbnMuXG4gICAqIEBzdW1tYXJ5IER5bmFtaWMgYnV0dG9uIGxhYmVsIHRoYXQgY2hhbmdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBvcGVyYXRpb24gbW9kZS5cbiAgICogU2hvd3MgXCJBZGRcIiBmb3IgY3JlYXRlIG9wZXJhdGlvbnMgYW5kIFwiVXBkYXRlXCIgZm9yIGVkaXQgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBidXR0b25MYWJlbCE6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9jYWxpemVkIGxhYmVsIHRleHQgZm9yIGFjdGlvbiBidXR0b25zLlxuICAgKiBAc3VtbWFyeSBEeW5hbWljIGJ1dHRvbiBsYWJlbCB0aGF0IGNoYW5nZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW9uIG1vZGUuXG4gICAqIFNob3dzIFwiQ2FuY2VsXCIgZm9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgYnV0dG9uQ2FuY2VsTGFiZWwhOiBzdHJpbmc7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBmaWVsZHNldCB3aXRoIGljb25zIGFuZCBjb21wb25lbnQgbmFtZS5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIHBhcmVudCBOZ3hCYXNlQ29tcG9uZW50IGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lIGFuZFxuICAgKiByZXF1aXJlZCBJb25pYyBpY29ucyAoYWxlcnRDaXJjbGVPdXRsaW5lIGZvciB2YWxpZGF0aW9uIGVycm9ycyBhbmQgY3JlYXRlT3V0bGluZSBmb3IgYWRkIGFjdGlvbnMpLlxuICAgKiBTZXRzIHVwIHRoZSBmb3VuZGF0aW9uYWwgY29tcG9uZW50IHN0cnVjdHVyZSBhbmQgaWNvbiByZWdpc3RyeS5cbiAgICpcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignRmllbGRzZXRDb21wb25lbnQnKTtcbiAgICBhZGRJY29ucyh7IGFsZXJ0Q2lyY2xlT3V0bGluZSwgY3JlYXRlT3V0bGluZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGluaXRpYWxpemF0aW9uIGxpZmVjeWNsZSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYnkgc2V0dGluZyB1cCByZXBvc2l0b3J5IHJlbGF0aW9uc2hpcHMgaWYgYSBtb2RlbCBleGlzdHMsXG4gICAqIGFuZCBjb25maWd1cmVzIHRoZSBpbml0aWFsIGJ1dHRvbiBsYWJlbCBmb3IgdGhlIGFkZCBhY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLlxuICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHByb3BlciBzZXR1cCBvZiB0cmFuc2xhdGlvbiBzZXJ2aWNlcyBhbmQgY29tcG9uZW50IHN0YXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLm1vZGVsKVxuICAgICAgdGhpcy5fcmVwb3NpdG9yeSA9IHRoaXMucmVwb3NpdG9yeTtcbiAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLmFkZCcpO1xuICAgIHRoaXMuYnV0dG9uQ2FuY2VsTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcuY2FuY2VsJyk7XG4gIH1cblxuICAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IHN0YXRlIGFmdGVyIHZpZXcgYW5kIGNoaWxkIGNvbXBvbmVudHMgYXJlIHJlbmRlcmVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIGxpZmVjeWNsZSBob29rIGltcGxlbWVudHMgaW50ZWxsaWdlbnQgYXV0by1zdGF0ZSBtYW5hZ2VtZW50IGJhc2VkIG9uIHRoZSBjdXJyZW50XG4gICAqIENSVUQgb3BlcmF0aW9uLiBGb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMsIHRoZSBmaWVsZHNldCBhdXRvbWF0aWNhbGx5IG9wZW5zIHRvIHByb3ZpZGVcbiAgICogaW1tZWRpYXRlIGFjY2VzcyB0byBpbmZvcm1hdGlvbiwgd2hpbGUgQ1JFQVRFIGFuZCBVUERBVEUgb3BlcmF0aW9ucyBrZWVwIGl0IGNsb3NlZCB0byBtYWludGFpblxuICAgKiBhIGNsZWFuIGluaXRpYWwgaW50ZXJmYWNlLiBUaGUgbWV0aG9kIGRpcmVjdGx5IG1hbmlwdWxhdGVzIHRoZSBET00gdG8gZW5zdXJlIHByb3BlciBhY2NvcmRpb25cbiAgICogc3luY2hyb25pemF0aW9uIGFuZCB0cmlnZ2VycyBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHJlZmxlY3QgdGhlIHByb2dyYW1tYXRpYyBzdGF0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFuZ3VsYXIgTGlmZWN5Y2xlXG4gICAqICAgcGFydGljaXBhbnQgRiBhcyBGaWVsZHNldENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRE9NXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDaGFuZ2VEZXRlY3RvclxuICAgKlxuICAgKiAgIEEtPj5GOiBuZ0FmdGVyVmlld0luaXQoKVxuICAgKiAgIGFsdCBvcGVyYXRpb24gaXMgUkVBRCBvciBERUxFVEVcbiAgICogICAgIEYtPj5GOiBTZXQgaXNPcGVuID0gdHJ1ZVxuICAgKiAgICAgRi0+PkQ6IFF1ZXJ5IGlvbi1hY2NvcmRpb24tZ3JvdXAgZWxlbWVudFxuICAgKiAgICAgYWx0IGFjY29yZGlvbiBlbGVtZW50IGV4aXN0c1xuICAgKiAgICAgICBGLT4+RDogU2V0IHZhbHVlIGF0dHJpYnV0ZSB0byAnb3BlbidcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIEYtPj5DOiBkZXRlY3RDaGFuZ2VzKClcbiAgICogICBDLT4+RjogVXBkYXRlIHZpZXcgd2l0aCBuZXcgc3RhdGVcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5SRUFEIHx8IHRoaXMub3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkRFTEVURSkge1xuICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgLy8gaGlkZGVuIHJlbW92ZSBidXR0b25cbiAgICAgIGNvbnN0IGFjY29yZGlvbkVsZW1lbnQgPSB0aGlzLmNvbXBvbmVudD8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpb24tYWNjb3JkaW9uLWdyb3VwJyk7XG4gICAgICBpZih0aGlzLmFjY29yZGlvbkNvbXBvbmVudClcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYWNjb3JkaW9uRWxlbWVudCwgJ3ZhbHVlJywgJ29wZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5wdXRzID0gdGhpcy5jb21wb25lbnQ/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3JlcXVpcmVkXScpO1xuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gaW5wdXRzLmxlbmd0aCA+IDA7XG4gICAgICBpZih0aGlzLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWUgPSAnb3Blbic7XG4gICAgICAgIHRoaXMuaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHJlbW92YWwgb2YgdGhlIGZpZWxkc2V0IHdpdGggc2xpZGUgYW5pbWF0aW9uLlxuICAgKiBAc3VtbWFyeSBJbml0aWF0ZXMgdGhlIHJlbW92YWwgcHJvY2VzcyBmb3IgdGhlIGZpZWxkc2V0IHdpdGggYSBzbW9vdGggc2xpZGUtdXAgYW5pbWF0aW9uLlxuICAgKiBUaGUgbWV0aG9kIGFwcGxpZXMgQ1NTIGNsYXNzZXMgZm9yIHRoZSBzbGlkZSBhbmltYXRpb24gYW5kIHRoZW4gc2FmZWx5IHJlbW92ZXMgdGhlXG4gICAqIGVsZW1lbnQgZnJvbSB0aGUgRE9NIHVzaW5nIFJlbmRlcmVyMi4gVGhpcyBwcm92aWRlcyBhIHBvbGlzaGVkIHVzZXIgZXhwZXJpZW5jZVxuICAgKiB3aGVuIHJlbW92aW5nIGZpZWxkc2V0IGluc3RhbmNlcyBmcm9tIGR5bmFtaWMgZm9ybXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gRE9NIGV2ZW50IGZyb20gdGhlIHJlbW92ZSBidXR0b24gY2xpY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlUmVtb3ZlQ29tcG9uZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGNmLWFuaW1hdGlvbicsICdkY2YtYW5pbWF0aW9uLXNsaWRlLXRvcC1tZWRpdW0nLCAnZGNmLWFuaW1hdGlvbi1yZXZlcnNlJywgJ2RjZi1hbmltYXRpb24tZmFzdCcpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gVXNlIFJlbmRlcmVyMiB0byBzYWZlbHkgcmVtb3ZlIHRoZSBlbGVtZW50XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnJlbmRlcmVyLnBhcmVudE5vZGUodGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICBpZiAocGFyZW50KVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHBhcmVudCwgdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgfSwgMTUwKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGNyZWF0aW5nIG5ldyBpdGVtcyBvciB0cmlnZ2VyaW5nIGdyb3VwIGFkZGl0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGZvcm0gdmFsaWRhdGlvbiBldmVudHMgZm9yIGl0ZW0gY3JlYXRpb24gb3IgZW1pdHMgZXZlbnRzIHRvIHRyaWdnZXJcbiAgICogdGhlIGFkZGl0aW9uIG9mIG5ldyBmaWVsZHNldCBncm91cHMuIFdoZW4gY2FsbGVkIHdpdGggdmFsaWRhdGlvbiBldmVudCBkYXRhLCBpdCB2YWxpZGF0ZXNcbiAgICogdW5pcXVlbmVzcyBhbmQgYWRkcyB0aGUgaXRlbSB0byB0aGUgZmllbGRzZXQuIFdoZW4gY2FsbGVkIHdpdGhvdXQgcGFyYW1ldGVycywgaXQgdHJpZ2dlcnNcbiAgICogYSBncm91cCBhZGRpdGlvbiBldmVudCBmb3IgcGFyZW50IGNvbXBvbmVudHMgdG8gaGFuZGxlLlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50PElGaWVsZFNldFZhbGlkYXRpb25FdmVudD59IFtldmVudF0gLSBPcHRpb25hbCB2YWxpZGF0aW9uIGV2ZW50IGNvbnRhaW5pbmcgZm9ybSBkYXRhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBDYWxsZWQgZnJvbSBmb3JtIHZhbGlkYXRpb25cbiAgICogaGFuZGxlQ3JlYXRlSXRlbSh2YWxpZGF0aW9uRXZlbnQpO1xuICAgKlxuICAgKiAvLyBDYWxsZWQgdG8gdHJpZ2dlciBncm91cCBhZGRpdGlvblxuICAgKiBoYW5kbGVDcmVhdGVJdGVtKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ3JlYXRlSXRlbShldmVudD86IEN1c3RvbUV2ZW50PElGaWVsZFNldFZhbGlkYXRpb25FdmVudD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZihldmVudCAmJiBldmVudCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHtmb3JtR3JvdXAsIHZhbHVlLCBpc1ZhbGlkfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgIHRoaXMuZm9ybUdyb3VwID0gZm9ybUdyb3VwIGFzIEZvcm1BcnJheTtcbiAgICAgIGlmKCF0aGlzLm1hcHBlcilcbiAgICAgICAgdGhpcy5tYXBwZXIgPSB0aGlzLmdldE1hcHBlcih2YWx1ZSBhcyBLZXlWYWx1ZSk7XG4gICAgICBpZihpc1ZhbGlkICl7XG4gICAgICAgICAgdGhpcy5pc1VuaXF1ZUVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMuYnV0dG9uTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcuYWRkJyk7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICB0aGlzLmlzVW5pcXVlRXJyb3IgPSAodmFsdWUgYXMgS2V5VmFsdWUpPy5bdGhpcy5wa10gfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3dFdmVudEVtaXR0ZXIoRXZlbnRDb25zdGFudHMuRklFTERTRVRfQUREX0dST1VQLCB7XG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgaW5kZXg6IHRoaXMudXBkYXRpbmdJdGVtID8gdGhpcy51cGRhdGluZ0l0ZW0uaW5kZXggOiB0aGlzLnZhbHVlPy5sZW5ndGgsXG4gICAgICAgIHBhcmVudDogdGhpcy5jaGlsZE9mLFxuICAgICAgICBvcGVyYXRpb246ICF0aGlzLnVwZGF0aW5nSXRlbSA/IE9wZXJhdGlvbktleXMuQ1JFQVRFIDogT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGl0ZW0gdXBkYXRlIG9wZXJhdGlvbnMgd2l0aCBmb3JtIHN0YXRlIG1hbmFnZW1lbnQuXG4gICAqIEBzdW1tYXJ5IExvY2F0ZXMgYW4gaXRlbSBpbiB0aGUgZm9ybSBhcnJheSBmb3IgZWRpdGluZyBhbmQgcHJlcGFyZXMgdGhlIGNvbXBvbmVudFxuICAgKiBmb3IgdXBkYXRlIG1vZGUuIFVwZGF0ZXMgdGhlIGJ1dHRvbiBsYWJlbCB0byByZWZsZWN0IHRoZSBlZGl0IHN0YXRlIGFuZCBzdG9yZXNcbiAgICogdGhlIGl0ZW0gYmVpbmcgdXBkYXRlZC4gVHJpZ2dlcnMgYSB3aW5kb3cgZXZlbnQgdG8gbm90aWZ5IHBhcmVudCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdmFsdWUgLSBUaGUgaWRlbnRpZmllciB2YWx1ZSBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGFycmF5IGluZGV4IHBvc2l0aW9uIG9mIHRoZSBpdGVtXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgRmllbGRzZXRDb21wb25lbnRcbiAgICovXG4gIGhhbmRsZVVwZGF0ZUl0ZW0odmFsdWU6IHN0cmluZyB8IG51bWJlciwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5maW5kKGNvbnRyb2wgPT4gYCR7Y29udHJvbC5nZXQodGhpcy5wayk/LnZhbHVlfWAudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5TcGFjZXMoYCR7dmFsdWV9YCwgdHJ1ZSkpIGFzIEZvcm1Db250cm9sO1xuICAgIGlmKGl0ZW0pIHtcbiAgICAgIHRoaXMuYnV0dG9uTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmxvY2FsZSArICcudXBkYXRlJyk7XG4gICAgICB0aGlzLnVwZGF0aW5nSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0udmFsdWUgfHwge30sIHtpbmRleH0pO1xuICAgICAgd2luZG93RXZlbnRFbWl0dGVyKEV2ZW50Q29uc3RhbnRzLkZJRUxEU0VUX1VQREFURV9HUk9VUCwge1xuICAgICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2FuY2VscyB0aGUgdXBkYXRlIG1vZGUgYW5kIHJlc2V0cyB0aGUgVUkgc3RhdGUuXG4gICAqIEBzdW1tYXJ5IEV4aXRzIHRoZSB1cGRhdGUgbW9kZSBieSByZXNldHRpbmcgdGhlIGJ1dHRvbiBsYWJlbCBhbmQgY2xlYXJpbmcgdGhlIHVwZGF0aW5nIGl0ZW0sXG4gICAqIHJlc3RvcmluZyB0aGUgY29tcG9uZW50IHRvIGl0cyBkZWZhdWx0IHN0YXRlIGZvciBhZGRpbmcgbmV3IGl0ZW1zLiBOb3RpZmllcyBwYXJlbnQgY29tcG9uZW50c1xuICAgKiB0aGF0IHRoZSB1cGRhdGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQ2FuY2VsVXBkYXRlSXRlbSgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1dHRvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5sb2NhbGUgKyAnLmFkZCcpO1xuICAgIHRoaXMudXBkYXRpbmdJdGVtID0gdW5kZWZpbmVkO1xuICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9VUERBVEVfR1JPVVAsIHtcbiAgICAgIHBhcmVudDogdGhpcy5jaGlsZE9mLFxuICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgaW5kZXg6IHRoaXMudmFsdWU/Lmxlbmd0aFxuICAgIH0pO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgaXRlbSByZW1vdmFsIG9wZXJhdGlvbnMgd2l0aCBmb3JtIGFycmF5IG1hbmFnZW1lbnQuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBpdGVtIHJlbW92YWwgYnkgZWl0aGVyIGhhbmRsaW5nIHZhbGlkYXRpb24gZXZlbnRzIG9yIHJlbW92aW5nIHNwZWNpZmljXG4gICAqIGl0ZW1zIGZyb20gdGhlIGZvcm0gYXJyYXkuIFdoZW4gY2FsbGVkIHdpdGggYSB2YWxpZGF0aW9uIGV2ZW50LCBpdCB0cmlnZ2VycyB2YWx1ZSB1cGRhdGVzLlxuICAgKiBXaGVuIGNhbGxlZCB3aXRoIGFuIGlkZW50aWZpZXIsIGl0IGxvY2F0ZXMgYW5kIHJlbW92ZXMgdGhlIG1hdGNoaW5nIGl0ZW0gZnJvbSB0aGUgZm9ybSBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IFtldmVudF0gLSBPcHRpb25hbCB2YWxpZGF0aW9uIGV2ZW50IGZvciBmb3JtIHVwZGF0ZXNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlUmVtb3ZlSXRlbSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBldmVudD86IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgaWYoZXZlbnQgJiYgZXZlbnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcy5zZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm1Hcm91cCBhcyBGb3JtQXJyYXk7XG4gICAgY29uc3QgYXJyYXlMZW5ndGggPSBmb3JtQXJyYXkubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gYXJyYXlMZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICBjb25zdCBncm91cCA9IGZvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKGNsZWFuU3BhY2VzKGdyb3VwLmdldCh0aGlzLnBrKT8udmFsdWUpID09PSBjbGVhblNwYWNlcyh2YWx1ZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgIHdpbmRvd0V2ZW50RW1pdHRlcihFdmVudENvbnN0YW50cy5GSUVMRFNFVF9SRU1PVkVfR1JPVVAsIHtcbiAgICAgICAgICBwYXJlbnQ6IHRoaXMuY2hpbGRPZixcbiAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgZm9ybUdyb3VwOiBncm91cFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyByZW9yZGVyaW5nIG9mIGl0ZW1zIHdpdGhpbiB0aGUgZmllbGRzZXQgbGlzdC5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGRyYWctYW5kLWRyb3AgcmVvcmRlciBldmVudHMgZnJvbSB0aGUgaW9uLXJlb3JkZXItZ3JvdXAgY29tcG9uZW50LlxuICAgKiBVcGRhdGVzIGJvdGggdGhlIGRpc3BsYXkgaXRlbXMgYXJyYXkgYW5kIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGFycmF5IHRvIG1haW50YWluXG4gICAqIGNvbnNpc3RlbmN5IGJldHdlZW4gVUkgc3RhdGUgYW5kIGRhdGEgc3RhdGUuIFByZXNlcnZlcyBpdGVtIGluZGljZXMgYWZ0ZXIgcmVvcmRlcmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudDxJdGVtUmVvcmRlckV2ZW50RGV0YWlsPn0gZXZlbnQgLSBJb25pYyByZW9yZGVyIGV2ZW50IGNvbnRhaW5pbmcgc291cmNlIGFuZCB0YXJnZXQgaW5kaWNlc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGh0bWxcbiAgICogPGlvbi1yZW9yZGVyLWdyb3VwIChpb25JdGVtUmVvcmRlcik9XCJoYW5kbGVSZW9yZGVyKCRldmVudClcIj5cbiAgICogICA8IS0tIFJlb3JkZXJhYmxlIGl0ZW1zIC0tPlxuICAgKiA8L2lvbi1yZW9yZGVyLWdyb3VwPlxuICAgKiBgYGBcbiAgICovXG4gIGhhbmRsZVJlb3JkZXJJdGVtcyhldmVudDogQ3VzdG9tRXZlbnQ8SXRlbVJlb3JkZXJFdmVudERldGFpbD4pOiB2b2lkIHtcbiAgIGNvbnN0IGZyb21JbmRleCA9IGV2ZW50LmRldGFpbC5mcm9tO1xuICAgIGNvbnN0IHRvSW5kZXggPSBldmVudC5kZXRhaWwudG87XG5cbiAgICBjb25zdCBpdGVtcyA9IFsuLi50aGlzLml0ZW1zXTsgLy8gc3VhIGVzdHJ1dHVyYSB2aXN1YWxcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm1Hcm91cCBhcyBGb3JtQXJyYXk7IC8vIEZvcm1BcnJheSByZWF0aXZvXG5cbiAgICBpZiAoZnJvbUluZGV4ICE9PSB0b0luZGV4KSB7XG4gICAgICAvLyBSZW9yZGVuYXIgb3MgZGFkb3MgdmlzdWFpc1xuICAgICAgY29uc3QgaXRlbVRvTW92ZSA9IGl0ZW1zLnNwbGljZShmcm9tSW5kZXgsIDEpWzBdO1xuICAgICAgaXRlbXMuc3BsaWNlKHRvSW5kZXgsIDAsIGl0ZW1Ub01vdmUpO1xuICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IGl0ZW1bJ2luZGV4J10gPSBpbmRleCArIDEpO1xuXG4gICAgICAvLyBSZW9yZGVuYXIgb3MgY29udHJvbGVzIGRvIEZvcm1BcnJheVxuICAgICAgY29uc3QgY29udHJvbFRvTW92ZSA9IGZvcm1BcnJheS5hdChmcm9tSW5kZXgpO1xuICAgICAgZm9ybUFycmF5LnJlbW92ZUF0KGZyb21JbmRleCk7XG4gICAgICBmb3JtQXJyYXkuaW5zZXJ0KHRvSW5kZXgsIGNvbnRyb2xUb01vdmUpO1xuICAgIH1cbiAgICAvLyBGaW5hbGl6YSBhIG9wZXJhw6fDo28gZGUgcmVvcmRlciBkbyBJb25pY1xuICAgIGV2ZW50LmRldGFpbC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGFjY29yZGlvbiBzdGF0ZSBjaGFuZ2UgZXZlbnRzIGZyb20gdXNlciBpbnRlcmFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBDdXN0b21FdmVudCBvYmplY3RzIHRyaWdnZXJlZCB3aGVuIHVzZXJzIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgYWNjb3JkaW9uLlxuICAgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyB0aGUgbmV3IHN0YXRlIGZyb20gdGhlIGV2ZW50IGRldGFpbHMgYW5kIHVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzXG4gICAqIGludGVybmFsIHN0YXRlIGFjY29yZGluZ2x5LiBJdCBzcGVjaWZpY2FsbHkgbGlzdGVucyBmb3IgSU9OLUFDQ09SRElPTi1HUk9VUCBldmVudHMgdG9cbiAgICogZW5zdXJlIHByb3BlciBldmVudCBzb3VyY2UgdmFsaWRhdGlvbiBhbmQgcHJldmVudCBoYW5kbGluZyBvZiB1bnJlbGF0ZWQgZXZlbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBldmVudCBvYmplY3QgY29udGFpbmluZyBhY2NvcmRpb24gc3RhdGUgY2hhbmdlIGRldGFpbHNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IEkgYXMgSW9uLUFjY29yZGlvblxuICAgKiAgIHBhcnRpY2lwYW50IEYgYXMgRmllbGRzZXRDb21wb25lbnRcbiAgICpcbiAgICogICBVLT4+STogQ2xpY2sgYWNjb3JkaW9uIGhlYWRlclxuICAgKiAgIEktPj5GOiBoYW5kbGVDaGFuZ2UoQ3VzdG9tRXZlbnQpXG4gICAqICAgRi0+PkY6IEV4dHJhY3QgdGFyZ2V0IGFuZCBkZXRhaWwgZnJvbSBldmVudFxuICAgKiAgIEYtPj5GOiBWYWxpZGF0ZSB0YXJnZXQgaXMgSU9OLUFDQ09SRElPTi1HUk9VUFxuICAgKiAgIGFsdCB2YWxpZCB0YXJnZXRcbiAgICogICAgIEYtPj5GOiBVcGRhdGUgaXNPcGVuID0gISF2YWx1ZVxuICAgKiAgIGVuZFxuICAgKiAgIEYtPj5JOiBSZWZsZWN0IHVwZGF0ZWQgc3RhdGVcbiAgICpcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBhY2NvcmRpb24gdG9nZ2xlIGZ1bmN0aW9uYWxpdHkgd2l0aCB2YWxpZGF0aW9uIGVycm9yIGNvbnNpZGVyYXRpb24uXG4gICAqIEBzdW1tYXJ5IE1hbmFnZXMgdGhlIGV4cGFuZC9jb2xsYXBzZSBzdGF0ZSBvZiB0aGUgYWNjb3JkaW9uIHdoaWxlIHJlc3BlY3RpbmcgdmFsaWRhdGlvbiBlcnJvciBzdGF0ZXMuXG4gICAqIFdoZW4gdmFsaWRhdGlvbiBlcnJvcnMgYXJlIHByZXNlbnQsIHRoZSBhY2NvcmRpb24gY2Fubm90IGJlIGNvbGxhcHNlZCB0byBlbnN1cmUgdXNlcnMgY2FuIHNlZVxuICAgKiBhbmQgYWRkcmVzcyB0aGUgZXJyb3JzLiBXaGVuIG5vIGVycm9ycyBleGlzdCwgdXNlcnMgY2FuIGZyZWVseSB0b2dnbGUgdGhlIGFjY29yZGlvbiBzdGF0ZS5cbiAgICogVGhpcyBtZXRob2QgYWxzbyBzdG9wcyBldmVudCBwcm9wYWdhdGlvbiB0byBwcmV2ZW50IHVud2FudGVkIHNpZGUgZWZmZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gW2V2ZW50XSAtIE9wdGlvbmFsIGV2ZW50IG9iamVjdCBmcm9tIHVzZXIgaW50ZXJhY3Rpb25cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBGaWVsZHNldENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKGV2ZW50PzogQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICBpZihldmVudClcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGlmKCF0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICAgIHRoaXMuYWNjb3JkaW9uQ29tcG9uZW50LnZhbHVlID0gdGhpcy5pc09wZW4gPyB1bmRlZmluZWQgOiAnb3Blbic7XG4gICAgICB0aGlzLmlzT3BlbiA9ICEhdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHZhbGlkYXRpb24gZXJyb3IgZXZlbnRzIGZyb20gY2hpbGQgZm9ybSBmaWVsZHMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyB2YWxpZGF0aW9uIGVycm9yIGV2ZW50cyBkaXNwYXRjaGVkIGJ5IGZvcm0gZmllbGRzIHdpdGhpbiB0aGUgZmllbGRzZXQuXG4gICAqIFdoZW4gZXJyb3JzIGFyZSBkZXRlY3RlZCwgdGhlIGFjY29yZGlvbiBpcyBmb3JjZWQgb3BlbiBhbmQgcHJldmVudGVkIGZyb20gY29sbGFwc2luZ1xuICAgKiB0byBlbnN1cmUgdXNlcnMgY2FuIHNlZSB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4gVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgY29tcG9uZW50J3NcbiAgICogZXJyb3Igc3RhdGUgYW5kIGFjY29yZGlvbiB2aXNpYmlsaXR5IGFjY29yZGluZ2x5LlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCAtIEN1c3RvbSBldmVudCBjb250YWluaW5nIHZhbGlkYXRpb24gZXJyb3IgZGV0YWlsc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVWYWxpZGF0aW9uRXJyb3IoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3Qge2hhc0Vycm9yc30gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy5pc09wZW4gPSB0aGlzLmhhc1ZhbGlkYXRpb25FcnJvcnMgPSBoYXNFcnJvcnM7XG4gICAgaWYoaGFzRXJyb3JzKVxuICAgICAgdGhpcy5hY2NvcmRpb25Db21wb25lbnQudmFsdWUgPSAnb3Blbic7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGFuZCBzdG9yZXMgYSBuZXcgb3IgdXBkYXRlZCB2YWx1ZSBpbiB0aGUgZmllbGRzZXQuXG4gICAqIEBzdW1tYXJ5IEhhbmRsZXMgYm90aCBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zIGZvciBmaWVsZHNldCBpdGVtcy4gUGFyc2VzIGFuZCBjbGVhbnNcbiAgICogdGhlIGlucHV0IHZhbHVlLCBkZXRlcm1pbmVzIHRoZSBvcGVyYXRpb24gdHlwZSBiYXNlZCBvbiB0aGUgdXBkYXRpbmcgc3RhdGUsIGFuZCBlaXRoZXJcbiAgICogYWRkcyBhIG5ldyBpdGVtIG9yIHVwZGF0ZXMgYW4gZXhpc3Rpbmcgb25lLiBNYWludGFpbnMgZGF0YSBpbnRlZ3JpdHkgYW5kIFVJIGNvbnNpc3RlbmN5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIHNldFZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAodGhpcy5mb3JtR3JvdXAgYXMgRm9ybUFycmF5KS5jb250cm9scy5tYXAoKHt2YWx1ZX0pID0+IHZhbHVlKTtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy52YWx1ZVxuICAgIC5maWx0ZXIodiA9PiB2W3RoaXMucGtdICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcCgodiwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLml0ZW1NYXBwZXIoT2JqZWN0LmFzc2lnbih7fSwgdiksIHRoaXMubWFwcGVyKSxcbiAgICAgICAgaW5kZXg6IGluZGV4ICsgMVxuICAgICAgfSBhcyBJRmllbGRTZXRJdGVtO1xuICAgIH0pO1xuICAgIGNvbnN0IGlucHV0Q29udGFpbmVycyA9IHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRjZi1pbnB1dC1pdGVtJyk7XG4gICAgaW5wdXRDb250YWluZXJzLmZvckVhY2goKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCBpb24taW5wdXQsIGlvbi10ZXh0YXJlYSwgdGV4dGFyZWEnKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmKGlucHV0KVxuICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgIH0pXG4gICAgdGhpcy51cGRhdGluZ0l0ZW0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEF1dG9tYXRpY2FsbHkgY29uZmlndXJlcyB0aGUgZmllbGQgbWFwcGluZyBiYXNlZCBvbiB0aGUgdmFsdWUgc3RydWN0dXJlLlxuICAgKiBAc3VtbWFyeSBBbmFseXplcyB0aGUgcHJvdmlkZWQgdmFsdWUgb2JqZWN0IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRoZSBwcmltYXJ5IGtleVxuICAgKiBhbmQgY3JlYXRlIGFwcHJvcHJpYXRlIGZpZWxkIG1hcHBpbmdzIGZvciBkaXNwbGF5IHB1cnBvc2VzLiBTZXRzIHVwIHRoZSBtYXBwZXIgb2JqZWN0XG4gICAqIHdpdGggdGl0bGUsIGRlc2NyaXB0aW9uLCBhbmQgaW5kZXggZmllbGRzIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5VmFsdWV9IHZhbHVlIC0gU2FtcGxlIHZhbHVlIG9iamVjdCB1c2VkIHRvIGRldGVybWluZSBmaWVsZCBtYXBwaW5nc1xuICAgKiBAcmV0dXJucyB7S2V5VmFsdWV9IFRoZSBjb25maWd1cmVkIG1hcHBlciBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIEZpZWxkc2V0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGdldE1hcHBlcih2YWx1ZTogS2V5VmFsdWUpOiBLZXlWYWx1ZSB7XG4gICAgaWYoIXRoaXMucGspXG4gICAgICB0aGlzLnBrID0gT2JqZWN0LmtleXModmFsdWUpWzBdO1xuICAgIGlmKCFPYmplY3Qua2V5cyh0aGlzLm1hcHBlcikubGVuZ3RoKVxuICAgICAgdGhpcy5tYXBwZXJbJ3RpdGxlJ10gPSB0aGlzLnBrO1xuICAgIHRoaXMubWFwcGVyWydpbmRleCddID0gXCJpbmRleFwiO1xuICAgIGZvcihjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIGlmKE9iamVjdC5rZXlzKHRoaXMubWFwcGVyKS5sZW5ndGggPj0gMiB8fCBPYmplY3Qua2V5cyh0aGlzLm1hcHBlcikubGVuZ3RoID09PSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKVxuICAgICAgICBicmVhaztcbiAgICAgIGlmKCF0aGlzLm1hcHBlclsndGl0bGUnXSkge1xuICAgICAgICB0aGlzLm1hcHBlclsndGl0bGUnXSA9IGtleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwcGVyWydkZXNjcmlwdGlvbiddID0ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXBwZXI7XG4gIH1cbn1cbiIsIlxuXG48ZmllbGRzZXRcbiAgKGZpZWxkc2V0QWRkR3JvdXBFdmVudCk9XCJoYW5kbGVDcmVhdGVJdGVtKCRldmVudClcIlxuICAoZmllbGRzZXRSZW1vdmVHcm91cEV2ZW50KT1cImhhbmRsZVJlbW92ZUl0ZW0odW5kZWZpbmVkLCAkZXZlbnQpXCJcbiAgW2NsYXNzXT1cIidkY2YtZmllbGRzZXQgJyArIG9wZXJhdGlvblwiXG4gICNjb21wb25lbnQ+XG4gIDxpb24tYWNjb3JkaW9uLWdyb3VwIFtjbGFzcy5vcGVuXT1cImlzT3BlblwiIFtjbGFzcy5oYXNWYWxpZGF0aW9uRXJyb3JzXT1cImhhc1ZhbGlkYXRpb25FcnJvcnNcIiAodmFsaWRhdGlvbkVycm9yRXZlbnQpPVwiaGFuZGxlVmFsaWRhdGlvbkVycm9yKCRldmVudClcIiAjYWNjb3JkaW9uQ29tcG9uZW50PlxuICAgIDxpb24tYWNjb3JkaW9uIHZhbHVlPVwib3BlblwiPlxuICAgICAgPGlvbi1pdGVtIHNsb3Q9XCJoZWFkZXJcIiAoY2xpY2spPVwiaGFuZGxlQWNjb3JkaW9uVG9nZ2xlKCRldmVudClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi1mbGV4IGRjZi1mbGV4LW1pZGRsZSBkY2Ytd2lkdGgtMS0xXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi13aWR0aC1leHBhbmRcIj5cbiAgICAgICAgICAgIDxsZWdlbmQ+e3sgbmFtZSB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZighaXNSZXF1aXJlZCAmJiBbJ2NyZWF0ZScsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGNmLXdpZHRoLWF1dG8gZGNmLWRlbGV0ZVwiPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlUmVtb3ZlQ29tcG9uZW50KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyYXNoLW91dGxpbmVcIiBjb2xvcj1cImRhcmtcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICA8ZGl2IHNsb3Q9XCJjb250ZW50XCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzT3BlblwiPlxuICAgICAgICBAaWYobXVsdGlwbGUgJiYgaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwiZGNmLWZpZWxkcy1saXN0XCI+XG4gICAgICAgICAgICA8aW9uLXJlb3JkZXItZ3JvdXAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXAucGFyZW50XCIgW2Rpc2FibGVkXT1cInVwZGF0aW5nSXRlbVwiIChpb25JdGVtUmVvcmRlcik9XCJoYW5kbGVSZW9yZGVySXRlbXMoJGFueSgkZXZlbnQpKVwiICNhY2NvcmRpb25Db21wb25lbnQ+XG4gICAgICAgICAgICAgIEBmb3IoaXRlbSBvZiBpdGVtczsgdHJhY2sgaXRlbS5pbmRleCkge1xuICAgICAgICAgICAgICAgIDxpb24taXRlbSBbY2xhc3Mubm90LXVuaXF1ZV09XCJpdGVtLnRpdGxlID09PSBpc1VuaXF1ZUVycm9yXCIgIFtjbGFzcy51cGRhdGluZ109XCJ1cGRhdGluZ0l0ZW0/Lltwa10gPT09IGl0ZW0udGl0bGVcIiBsaW5lcz1cImZ1bGxcIiBbYnV0dG9uXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICBAaWYoaXRlbXM/Lmxlbmd0aCA+IDEgJiYgIXVwZGF0aW5nSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLXJlb3JkZXIgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzd2FwLXZlcnRpY2FsLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1yZW9yZGVyPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIGNsYXNzPVwiZGNmLXJlb3JkZXItZGlzYWJsZWRcIiBzaXplPVwic21hbGxcIiBuYW1lPVwic3dhcC12ZXJ0aWNhbC1vdXRsaW5lXCIgZGlzYWJsZWQ+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIFtjb2xvcl09XCIoaXRlbS50aXRsZSA9PT0gaXNVbmlxdWVFcnJvciAmJiAhdXBkYXRpbmdJdGVtPy5bcGtdID09PSBpdGVtLnRpdGxlKSA/ICdkYW5nZXInIDogJydcIj57eyBpdGVtLmluZGV4IH19LiB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgIEBpZihpdGVtLmRlc2NyaXB0aW9uPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiZGNmLXN1YnRpdGxlXCI+e3tpdGVtLmRlc2NyaXB0aW9ufX08L2lvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEBpZighdXBkYXRpbmdJdGVtIHx8IHVwZGF0aW5nSXRlbT8uW3BrXSAhPT0gaXRlbS50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGFuZGxlVXBkYXRlSXRlbShpdGVtLnRpdGxlLCAkaW5kZXgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjcmVhdGUtb3V0bGluZVwiIGNvbG9yPVwiZGFya1wiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIEBpZighdXBkYXRpbmdJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIHNpemU9XCJzbWFsbFwiIChjbGljayk9XCJoYW5kbGVSZW1vdmVJdGVtKGl0ZW0udGl0bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0cmFzaC1vdXRsaW5lXCIgY29sb3I9XCJkYXJrXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2lvbi1yZW9yZGVyLWdyb3VwPlxuICAgICAgICAgIDwvaW9uLWxpc3Q+XG4gICAgICAgIH1cblxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbiAgICAgICAgQGlmKG11bHRpcGxlICYmIFsnY3JlYXRlJywgJ3VwZGF0ZSddLmluY2x1ZGVzKG9wZXJhdGlvbikpIHtcbiAgICAgICAgICBAaWYoaXNVbmlxdWVFcnJvcikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1ub3QtdW5pcXVlLWNvbnRhaW5lciBkY2YtYW5pbWF0aW9uIGRjZi1hbmltYXRpb24tYm90dG9tLXNtYWxsIGRjZi1hbmltYXRpb24tZmFzdFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIGRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi13aWR0aC0xLTEgXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRjZi1hdXRvXCIgW2F0dHIuc3R5bGVdPVwiJ21heC13aWR0aDogNTBweCdcIj5cbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYWxlcnQtY2lyY2xlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2Ytd2lkdGgtZXhwYW5kXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLXRleHQgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cImRjZi10ZXh0LXNtYWxsXCI+e3sgbG9jYWxlICsgJy5ub3RfdW5pcXVlJyB8IHRyYW5zbGF0ZSA6IHsgdmFsdWU6IGlzVW5pcXVlRXJyb3IgfSB9fTwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkY2YtbWFyZ2luLWJvdHRvbSBkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2YtZmxleFwiPlxuICAgICAgICAgICAgQGlmKHVwZGF0aW5nSXRlbSkge1xuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhbmdlclwiIChjbGljayk9XCJoYW5kbGVDYW5jZWxVcGRhdGVJdGVtKClcIj5cbiAgICAgICAgICAgICAgICB7eyBidXR0b25DYW5jZWxMYWJlbCB9fVxuICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBmaWxsPVwiY2xlYXJcIiBjbGFzcz1cImRjZi1idXR0b24tYWRkXCIgKGNsaWNrKT1cImhhbmRsZUNyZWF0ZUl0ZW0oKVwiPlxuICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFkZC1vdXRsaW5lXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAge3tidXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICA8L2Rpdj5cbiAgICA8L2lvbi1hY2NvcmRpb24+XG4gIDwvaW9uLWFjY29yZGlvbi1ncm91cD5cbjwvZmllbGRzZXQ+XG5cbiJdfQ==
|