@eo-sdk/client 9.0.0-rc.8 → 9.0.0-rc.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { takeUntil, tap } from 'rxjs/operators';
2
- import { Component, Input, ViewChild, EventEmitter, Output } from '@angular/core';
2
+ import { Component, Input, ViewChild, EventEmitter, Output, ElementRef } from '@angular/core';
3
3
  import { Router } from '@angular/router';
4
4
  import { FormControl, Validators } from '@angular/forms';
5
5
  import { PendingChangesService } from '../../../eo-framework-core/pending-changes/pending-changes.service';
@@ -12,7 +12,7 @@ import { StoredQuery, StoredQueriesService, SearchFilter, SearchQuery, Translate
12
12
  import { UtilitiesService } from '../../util/services/utilities.service';
13
13
  import { forkJoin, of } from 'rxjs';
14
14
  export class StoredQueryDetailsComponent extends UnsubscribeOnDestroy {
15
- constructor(router, searchService, userService, systemService, selection, pendingChanges, storedQueriesService, formHelperService, translate) {
15
+ constructor(router, searchService, userService, systemService, selection, pendingChanges, storedQueriesService, formHelperService, elemRef, translate) {
16
16
  super();
17
17
  this.router = router;
18
18
  this.searchService = searchService;
@@ -22,6 +22,7 @@ export class StoredQueryDetailsComponent extends UnsubscribeOnDestroy {
22
22
  this.pendingChanges = pendingChanges;
23
23
  this.storedQueriesService = storedQueriesService;
24
24
  this.formHelperService = formHelperService;
25
+ this.elemRef = elemRef;
25
26
  this.translate = translate;
26
27
  this.FORM_INPUT_TITLE = 'storedQueryTitle';
27
28
  this.FORM_INPUT_FULLTEXT = 'storedQueryFulltext';
@@ -60,6 +61,9 @@ export class StoredQueryDetailsComponent extends UnsubscribeOnDestroy {
60
61
  this.edit();
61
62
  this.startPending();
62
63
  this.notifyList.emit({ unselect: true, update: false });
64
+ setTimeout(() => {
65
+ this.elemRef.nativeElement.querySelector('[name="storedQueryTitle"]').focus();
66
+ }, 500);
63
67
  }
64
68
  }
65
69
  }
@@ -468,7 +472,7 @@ export class StoredQueryDetailsComponent extends UnsubscribeOnDestroy {
468
472
  StoredQueryDetailsComponent.decorators = [
469
473
  { type: Component, args: [{
470
474
  selector: 'eo-stored-query-details',
471
- template: "<ng-container *ngIf=\"storedQuery\">\n <div class=\"eo-head\">\n <header class=\"eo-header\">\n <eo-icon class=\"eo-header-icon\"\n [iconSrc]=\"'assets/_default/svg/ic_search.svg'\"\n [iconTitle]=\"('eo.sidebar.navigation.storedqueries' | translate)\">\n </eo-icon>\n <div class=\"eo-header-info\">\n <h2 class=\"eo-header-title\">{{storedQuery.name}}</h2>\n <h3 class=\"eo-header-subtitle\" translate>eo.search.title.storedqueries</h3>\n </div>\n </header>\n </div>\n\n <div class=\"eo-body\">\n\n <div class=\"form\">\n\n <ng-template #queryForm>\n <eo-stored-query [query]=\"storedQuery\" [formOnly]=\"true\" #storedQueryForm\n (onQueryLoaded)=\"onStoredQueryLoaded()\"\n (onQueryExecute)=\"onStoredQueryExecute($event)\"></eo-stored-query>\n </ng-template>\n\n <form class=\"edit-form\" [formGroup]=\"editForm.form\" *ngIf=\"editForm.form; else queryForm\">\n\n <div class=\"context dark\">\n\n <!-- title and fulltext term fields -->\n <eo-form-input class=\"title\">\n <input type=\"text\" name=\"storedQueryTitle\" maxlength=\"64\" autofocus=\"autofocus\" [formControlName]=\"'storedQueryTitle'\"/>\n </eo-form-input>\n \n <eo-query-scope-select [selection]=\"queryScope\" (select)=\"setQueryScope($event)\"></eo-query-scope-select>\n <div class=\"form-field\">\n <eo-form-element [skipToggle]=\"true\" [element]=\"editForm.fulltextFormControl\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"editForm.fulltextFormControl\"\n (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n\n <!-- context type form controls -->\n <h3>{{storedQuery.contextFolderTypes[0]?.label}}</h3>\n <div class=\"form-field\" *ngFor=\"let ctxElement of editForm.contextControls; trackBy: trackByQName\">\n <eo-form-element [element]=\"ctxElement\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"ctxElement\" (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n </div>\n\n <!-- object type form controls -->\n <div class=\"form-fields\" [ngClass]=\"{empty: !editForm.controls?.length}\">\n <div class=\"form-field\" *ngFor=\"let element of editForm.controls; trackBy: trackByQName\">\n <eo-form-element [element]=\"element\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"element\" (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n </div>\n </form>\n </div>\n\n <aside class=\"aside\" *ngIf=\"!isNewQuery\">\n\n <!-- favorite and share -->\n <div class=\"meta-actions\">\n\n <ng-container *ngIf=\"isOwnQuery; else sharedWithMe\">\n <eo-icon class=\"button btn-share\" [iconSrc]=\"'assets/_default/svg/ic_share.svg'\" *ngIf=\"enableSharing\"\n [ngClass]=\"{active: storedQuery.shared || storedQuery.roles.length, editing: editingShare}\"\n (click)=\"toggleShareEdit()\"\n [iconTitle]=\"iconTitles.share\"></eo-icon>\n\n <eo-icon class=\"button btn-fav\" [iconSrc]=\"'assets/_default/svg/ic_favorite.svg'\"\n [ngClass]=\"{active: storedQuery.favorite}\"\n (click)=\"toggleFavoriteState()\"\n [iconTitle]=\"iconTitles.favor\"></eo-icon>\n </ng-container>\n\n <ng-template #sharedWithMe>\n <eo-icon class=\"sharedWithMe\" [iconSrc]=\"'assets/_default/svg/ic_share.svg'\" [iconTitle]=\"iconTitles.shared\"></eo-icon>\n <eo-icon class=\"sharedWithMe\" [iconSrc]=\"'assets/_default/svg/ic_favorite.svg'\" [iconTitle]=\"iconTitles.favored\"></eo-icon>\n </ng-template>\n\n </div>\n\n <!-- roles that share this query -->\n <div class=\"meta-roles\" [ngClass]=\"{dark: editingShare, empty: !storedQuery.roles?.length}\">\n\n <div class=\"label\" translate>eo.storedquery.share.sharedwith</div>\n <div class=\"form-field\" *ngIf=\"rolesPicker?.codesystem?.entries\">\n <eo-codesystem [pickerTitle]=\"rolesPicker.title\"\n [codesystem]=\"rolesPicker.codesystem\"\n [multiselect]=\"true\"\n [readonly]=\"!editingShare\"\n [inputStyleClass]=\"'stored-query__share'\"\n [(ngModel)]=\"rolesPicker.value\"></eo-codesystem>\n </div>\n\n <div class=\"share-actions\" *ngIf=\"editingShare\">\n <button class=\"secondary\" (click)=\"cancelShare()\" translate>eo.storedquery.share.cancel</button>\n <button class=\"primary\" (click)=\"share()\" translate>eo.storedquery.share.ok</button>\n </div>\n </div>\n\n <!-- queries meta info like baseparam settings -->\n <div class=\"meta-data\" *ngIf=\"restrictions?.length\">\n <div class=\"restriction\" *ngFor=\"let restriction of restrictions; trackBy: trackByIndex\">\n <div class=\"label\">{{restriction.label}}</div>\n <div class=\"items\">\n <div *ngFor=\"let item of restriction.items; trackBy: trackByIndex\">{{item}}</div>\n </div>\n </div>\n </div>\n\n </aside>\n\n </div>\n\n <div class=\"actions\">\n <ng-container *ngIf=\"!editForm.form; else actionEdit\">\n <button class=\"secondary btn-delete\" (click)=\"delete()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.action.delete</button>\n <button class=\"secondary btn-open\" (click)=\"setQueryToAppSearch()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.load</button>\n <button class=\"primary grey btn-edit\" (click)=\"edit()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.action.edit</button>\n <button class=\"primary btn-search\" [disabled]=\"storedQuery.state?.isEmpty\" (click)=\"executeQuery()\" translate>eo.storedquery.run</button>\n </ng-container>\n\n <ng-template #actionEdit>\n <!-- action while editing the query form -->\n <button class=\"secondary btn-cancel\" (click)=\"cancelEdit()\" translate>eo.storedquery.action.cancel</button>\n <button class=\"primary btn-save\" (click)=\"updateStoredQuery()\" [disabled]=\"editForm.form.invalid\" translate>eo.storedquery.action.save</button>\n </ng-template>\n </div>\n\n</ng-container>\n",
475
+ template: "<ng-container *ngIf=\"storedQuery\">\n <div class=\"eo-head\">\n <header class=\"eo-header\">\n <eo-icon class=\"eo-header-icon\"\n [iconSrc]=\"'assets/_default/svg/ic_search.svg'\"\n [iconTitle]=\"('eo.sidebar.navigation.storedqueries' | translate)\">\n </eo-icon>\n <div class=\"eo-header-info\">\n <h2 class=\"eo-header-title\">{{storedQuery.name}}</h2>\n <h3 class=\"eo-header-subtitle\" translate>eo.search.title.storedqueries</h3>\n </div>\n </header>\n </div>\n\n <div class=\"eo-body\">\n\n <div class=\"form\">\n\n <ng-template #queryForm>\n <eo-stored-query [query]=\"storedQuery\" [formOnly]=\"true\" #storedQueryForm\n (onQueryLoaded)=\"onStoredQueryLoaded()\"\n (onQueryExecute)=\"onStoredQueryExecute($event)\"></eo-stored-query>\n </ng-template>\n\n <form class=\"edit-form\" [formGroup]=\"editForm.form\" *ngIf=\"editForm.form; else queryForm\">\n\n <div class=\"context dark\">\n\n <!-- title and fulltext term fields -->\n <eo-form-input class=\"title\">\n <input type=\"text\" name=\"storedQueryTitle\" maxlength=\"64\" onfocus=\"this.select()\" [formControlName]=\"'storedQueryTitle'\"/>\n </eo-form-input>\n \n <eo-query-scope-select [selection]=\"queryScope\" (select)=\"setQueryScope($event)\"></eo-query-scope-select>\n <div class=\"form-field\">\n <eo-form-element [skipToggle]=\"true\" [element]=\"editForm.fulltextFormControl\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"editForm.fulltextFormControl\"\n (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n\n <!-- context type form controls -->\n <h3>{{storedQuery.contextFolderTypes[0]?.label}}</h3>\n <div class=\"form-field\" *ngFor=\"let ctxElement of editForm.contextControls; trackBy: trackByQName\">\n <eo-form-element [element]=\"ctxElement\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"ctxElement\" (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n </div>\n\n <!-- object type form controls -->\n <div class=\"form-fields\" [ngClass]=\"{empty: !editForm.controls?.length}\">\n <div class=\"form-field\" *ngFor=\"let element of editForm.controls; trackBy: trackByQName\">\n <eo-form-element [element]=\"element\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"element\" (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n </div>\n </form>\n </div>\n\n <aside class=\"aside\" *ngIf=\"!isNewQuery\">\n\n <!-- favorite and share -->\n <div class=\"meta-actions\">\n\n <ng-container *ngIf=\"isOwnQuery; else sharedWithMe\">\n <eo-icon class=\"button btn-share\" [iconSrc]=\"'assets/_default/svg/ic_share.svg'\" *ngIf=\"enableSharing\"\n [ngClass]=\"{active: storedQuery.shared || storedQuery.roles.length, editing: editingShare}\"\n (click)=\"toggleShareEdit()\"\n [iconTitle]=\"iconTitles.share\"></eo-icon>\n\n <eo-icon class=\"button btn-fav\" [iconSrc]=\"'assets/_default/svg/ic_favorite.svg'\"\n [ngClass]=\"{active: storedQuery.favorite}\"\n (click)=\"toggleFavoriteState()\"\n [iconTitle]=\"iconTitles.favor\"></eo-icon>\n </ng-container>\n\n <ng-template #sharedWithMe>\n <eo-icon class=\"sharedWithMe\" [iconSrc]=\"'assets/_default/svg/ic_share.svg'\" [iconTitle]=\"iconTitles.shared\"></eo-icon>\n <eo-icon class=\"sharedWithMe\" [iconSrc]=\"'assets/_default/svg/ic_favorite.svg'\" [iconTitle]=\"iconTitles.favored\"></eo-icon>\n </ng-template>\n\n </div>\n\n <!-- roles that share this query -->\n <div class=\"meta-roles\" [ngClass]=\"{dark: editingShare, empty: !storedQuery.roles?.length}\">\n\n <div class=\"label\" translate>eo.storedquery.share.sharedwith</div>\n <div class=\"form-field\" *ngIf=\"rolesPicker?.codesystem?.entries\">\n <eo-codesystem [pickerTitle]=\"rolesPicker.title\"\n [codesystem]=\"rolesPicker.codesystem\"\n [multiselect]=\"true\"\n [readonly]=\"!editingShare\"\n [inputStyleClass]=\"'stored-query__share'\"\n [(ngModel)]=\"rolesPicker.value\"></eo-codesystem>\n </div>\n\n <div class=\"share-actions\" *ngIf=\"editingShare\">\n <button class=\"secondary\" (click)=\"cancelShare()\" translate>eo.storedquery.share.cancel</button>\n <button class=\"primary\" (click)=\"share()\" translate>eo.storedquery.share.ok</button>\n </div>\n </div>\n\n <!-- queries meta info like baseparam settings -->\n <div class=\"meta-data\" *ngIf=\"restrictions?.length\">\n <div class=\"restriction\" *ngFor=\"let restriction of restrictions; trackBy: trackByIndex\">\n <div class=\"label\">{{restriction.label}}</div>\n <div class=\"items\">\n <div *ngFor=\"let item of restriction.items; trackBy: trackByIndex\">{{item}}</div>\n </div>\n </div>\n </div>\n\n </aside>\n\n </div>\n\n <div class=\"actions\">\n <ng-container *ngIf=\"!editForm.form; else actionEdit\">\n <button class=\"secondary btn-delete\" (click)=\"delete()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.action.delete</button>\n <button class=\"secondary btn-open\" (click)=\"setQueryToAppSearch()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.load</button>\n <button class=\"primary grey btn-edit\" (click)=\"edit()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.action.edit</button>\n <button class=\"primary btn-search\" [disabled]=\"storedQuery.state?.isEmpty\" (click)=\"executeQuery()\" translate>eo.storedquery.run</button>\n </ng-container>\n\n <ng-template #actionEdit>\n <!-- action while editing the query form -->\n <button class=\"secondary btn-cancel\" (click)=\"cancelEdit()\" translate>eo.storedquery.action.cancel</button>\n <button class=\"primary btn-save\" (click)=\"updateStoredQuery()\" [disabled]=\"editForm.form.invalid\" translate>eo.storedquery.action.save</button>\n </ng-template>\n </div>\n\n</ng-container>\n",
472
476
  styles: [":host{--stored-query-aside-width:300px;background:var(--panel-background-grey);display:flex;flex:1;flex-direction:column;height:100%;min-height:0;min-width:0;overflow-y:auto}:host .eo-head{background-color:var(--color-white);border-bottom:1px solid var(--panel-header-border-bottom-color)}:host .eo-body{overflow-y:hidden}:host .eo-body .form{overflow-y:auto;padding:var(--app-pane-padding);padding-right:calc(var(--stored-query-aside-width) + var(--app-pane-padding)*2)}:host .eo-body .form eo-stored-query{background-color:var(--color-white);padding:var(--app-pane-padding)}:host .eo-body .aside{background-color:rgba(var(--color-black-rgb),.02);border:1px solid rgba(var(--color-black-rgb),.1);box-sizing:border-box;padding:var(--app-pane-padding);position:absolute;right:var(--app-pane-padding);top:var(--app-pane-padding);width:var(--stored-query-aside-width)}:host .eo-body .aside .meta-actions{display:flex;justify-content:flex-end;margin:0 -2px}:host .eo-body .aside .meta-actions eo-icon{color:var(--text-color-hint);margin:0 2px;padding:4px}:host .eo-body .aside .meta-actions eo-icon.active{color:var(--color-favorite)}:host .eo-body .aside .meta-actions eo-icon.editing{background-color:var(--color-primary-2);border-radius:2px 2px 0 0;color:var(--color-white)}:host .eo-body .aside .meta-actions eo-icon.sharedWithMe{background-color:var(--text-color-hint);border-radius:2px;color:var(--color-white)}:host .eo-body .aside .meta-roles.dark{background-color:var(--color-primary-2);border-radius:2px;color:var(--color-white);margin-bottom:var(--app-pane-padding);padding:calc(var(--app-pane-padding)/2)}:host .eo-body .aside .meta-roles.dark .actions{display:flex}:host .eo-body .aside .meta-roles.dark .label{display:none}:host .eo-body .aside .meta-roles.dark .form-field,:host .eo-body .aside .meta-roles .form-field{background-color:rgba(var(--color-white-rgb),.2)}:host .eo-body .aside .meta-roles .form-field{border:1px solid rgba(var(--color-black-rgb),.1);margin-bottom:calc(var(--app-pane-padding)/2);padding:2px 2px 4px 4px}:host .eo-body .aside .meta-roles .label{color:var(--text-color-caption);font-style:italic;margin-bottom:calc(var(--app-pane-padding)/4)}:host .eo-body .aside .meta-roles .share-actions{display:flex;justify-content:flex-end;margin:0 calc(var(--app-pane-padding)/8*-1)}:host .eo-body .aside .meta-roles .share-actions button{margin:0 calc(var(--app-pane-padding)/8);padding:calc(var(--app-pane-padding)/4) calc(var(--app-pane-padding)/2)}:host .eo-body .aside .meta-roles.empty:not(.dark) .form-field,:host .eo-body .aside .meta-roles.empty:not(.dark) .label{display:none}:host .eo-body .aside .meta-data{border-collapse:collapse;display:table;flex:1 1 40%;margin:0 0 var(--app-pane-padding) 0;order:1}:host .eo-body .aside .meta-data .restriction{display:table-row}:host .eo-body .aside .meta-data .restriction .label{color:var(--text-color-caption);display:table-cell;font-style:italic;padding-right:calc(var(--app-pane-padding)/2)}:host .eo-body .aside .meta-data .restriction .items{border-left:1px solid rgba(var(--color-black-rgb),.1);display:table-cell;padding:0 0 calc(var(--app-pane-padding)/2) calc(var(--app-pane-padding)/2)}:host .actions{background-color:var(--color-white);border-top:1px solid var(--panel-header-border-bottom-color);display:flex;flex-flow:row;justify-content:flex-end;padding:var(--app-pane-padding) calc(var(--app-pane-padding) - 2px)}:host .actions button{margin:0 2px}:host .edit-form{background-color:var(--color-white);max-width:500px}:host .edit-form .context{background-color:var(--color-primary-2);padding:calc(var(--app-pane-padding)/2)}:host .edit-form .context h3{color:var(--color-white);display:flex;font-size:var(--font-subhead);font-weight:var(--font-weight-light);justify-content:flex-end;margin:0;padding:var(--app-pane-padding) 0 calc(var(--app-pane-padding)/2) 0}:host .edit-form .form-fields{padding:calc(var(--app-pane-padding)/2)}:host .edit-form .form-fields.empty{display:none}:host .edit-form .form-field{align-items:center;display:flex;flex-flow:row nowrap}:host .edit-form .form-field eo-form-element{flex:1 1 auto}:host .edit-form .form-field eo-dynamic-property-switch{flex:0 0 auto}:host eo-stored-query{display:block;max-width:500px}:host ::ng-deep eo-form-input.title{display:block;margin-bottom:var(--app-pane-padding)}:host ::ng-deep eo-form-input.title input{font-size:var(--font-title);font-weight:var(--font-weight-light)}"]
473
477
  },] }
474
478
  ];
@@ -481,6 +485,7 @@ StoredQueryDetailsComponent.ctorParameters = () => [
481
485
  { type: PendingChangesService },
482
486
  { type: StoredQueriesService },
483
487
  { type: ObjectFormHelperService },
488
+ { type: ElementRef },
484
489
  { type: TranslateService }
485
490
  ];
486
491
  StoredQueryDetailsComponent.propDecorators = {
@@ -488,4 +493,4 @@ StoredQueryDetailsComponent.propDecorators = {
488
493
  query: [{ type: Input }],
489
494
  notifyList: [{ type: Output }]
490
495
  };
491
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkLXF1ZXJ5LWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9lby1mcmFtZXdvcmsvc3RvcmVkLXF1ZXJ5L3N0b3JlZC1xdWVyeS1kZXRhaWxzL3N0b3JlZC1xdWVyeS1kZXRhaWxzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFhLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFPLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBbUIsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxvRUFBb0UsQ0FBQztBQUN6RyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDaEYsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDckYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1EQUFtRCxDQUFDO0FBSWpGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hGLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ2xGLE9BQU8sRUFFTCxXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFFYixXQUFXLEVBRVgsS0FBSyxFQUNMLGFBQWEsRUFFZCxNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQU9oRCxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsb0JBQW9CO0lBaUNuRSxZQUFvQixNQUFjLEVBQ2QsYUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsYUFBNEIsRUFDNUIsU0FBMkIsRUFDM0IsY0FBcUMsRUFDckMsb0JBQTBDLEVBQzFDLGlCQUEwQyxFQUMxQyxTQUEyQjtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVRVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFDckMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXlCO1FBQzFDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBdkN2QyxxQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQztRQUN0Qyx3QkFBbUIsR0FBRyxxQkFBcUIsQ0FBQztRQUM1Qyx1QkFBa0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFnQnZHLGdCQUFXLEdBQUc7WUFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDckQsVUFBVSxFQUFFLElBQUk7WUFDaEIsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDO1FBT1EsZUFBVSxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO1FBYTlFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFwQkQsSUFDSSxLQUFLLENBQUMsQ0FBYztRQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFtQk0sYUFBYSxDQUFDLEtBQWlCO1FBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsUUFBUSxDQUFDLENBQWM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLHdDQUF3QztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxXQUFXLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0RixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBRXRHLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7Z0JBQ3BGLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQzthQUN2RDtTQUNGO0lBQ0gsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksR0FBRyxDQUFDLEVBQUU7WUFDbEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3REO0lBQ0gsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ1A7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsU0FBUztRQUMzQixTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUNuRSxDQUFDLENBQUMsRUFBRTtRQUNKLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQ2pGLENBQUM7UUFDRixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ2hELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLG9CQUFvQjthQUN0QixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzthQUN0QyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDdkQsSUFBSSxDQUFDLG9CQUFvQjthQUN0QixlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUNqQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDZixDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztTQUNuQjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsaUJBQWlCO1FBRWYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM5RyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUNsQixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDWCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyQztpQkFBTSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxJQUFJLE9BQU8sR0FBbUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLG9CQUFvQjthQUN0QixlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUNqQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLGtCQUFrQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQztRQUN0RixDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLEtBQTBDO1FBRXpELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRTtZQUNyQiw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDaEc7YUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFDNUIsd0JBQXdCO1lBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckQsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hDO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sV0FBVztRQUVqQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUdkLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFFNUIsTUFBTSxFQUFFLEdBQTZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQTZCLENBQUM7WUFDdkcsSUFBSSxXQUFXLENBQUM7WUFDaEIsSUFBSSxFQUFFLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sRUFBRSxHQUFzQixFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBc0IsQ0FBQztnQkFDekUsV0FBVyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7YUFDakM7WUFDRCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsYUFBYSxFQUFFO2dCQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUVMLFFBQVEsUUFBUSxFQUFFO29CQUNoQixLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDMUQsTUFBTTtxQkFDUDtvQkFDRCxLQUFLLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3dCQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDekYsTUFBTTtxQkFDUDtvQkFDRCxPQUFPLENBQUMsQ0FBQzt3QkFDUCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7NEJBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQ3BCO3FCQUNGO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxvQkFBb0IsQ0FBQyxLQUFhO1FBRXhDLElBQUk7WUFDRixJQUFJLEtBQXdCLENBQUM7WUFDN0IsdUNBQXVDO1lBQ3ZDLElBQUksS0FBSyxLQUFLLG9CQUFvQixDQUFDLFFBQVEsRUFBRTtnQkFDM0MsS0FBSyxHQUFHO29CQUNOLEtBQUssRUFBRSxLQUFLO29CQUNaLElBQUksRUFBRSxLQUFLO2lCQUNaLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxNQUFNLEVBQUUsR0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUE4QixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQXVCLENBQUM7Z0JBQ25ILE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7Z0JBQzdCLEtBQUssR0FBRztvQkFDTixLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7b0JBQ2YsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJO2lCQUNkLENBQUM7YUFDSDtZQUNELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsSUFBSSxFQUFFLElBQUk7WUFDVixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLFFBQVEsRUFBRSxFQUFFO1lBQ1osZUFBZSxFQUFFLEVBQUU7U0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFFBQVE7YUFDVixJQUFJO2FBQ0osWUFBWTthQUNaLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTyxjQUFjO1FBRXBCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFFckMsSUFBSSxJQUFJLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkMsSUFBSSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFeEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQ2xGLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLEVBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUN0QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQztZQUUvQywrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVE7cUJBQ25CLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTtxQkFDMUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM1RTtZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixvRUFBb0U7UUFDckUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUN4RyxHQUFHLENBQUMsQ0FBQyxRQUFlLEVBQUUsRUFBRTtnQkFDdEIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDbkIsK0VBQStFO29CQUMvRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO3dCQUN2QixJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUU7NEJBQ2QsQ0FBQyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7eUJBQ3BCO3dCQUNELElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTs0QkFDZCxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzt5QkFDcEI7d0JBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDakMsSUFBSSxFQUFFLEVBQUU7NEJBQ04sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3lCQUNqQztxQkFDRjtnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUNILENBQUMsQ0FBQTtTQUNIO1FBQ0Esb0NBQW9DO1FBQ3JDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7WUFDOUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQzNILEdBQUcsQ0FBQyxDQUFDLFFBQWUsRUFBRSxFQUFFO2dCQUN0QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNuQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqQyxJQUFJLEVBQUUsRUFBRTt3QkFDTixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQ3hDO2dCQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQyxDQUFBO1NBQ0g7UUFFRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0RCxJQUFJLENBQUMsYUFBYTtpQkFDZixRQUFRLEVBQUU7aUJBQ1YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO2dCQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRztvQkFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDckMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO3dCQUNYLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSTt3QkFDaEIscUJBQXFCLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2hDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtxQkFDaEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3BDLENBQUE7WUFDSCxDQUFDLENBQ0YsQ0FBQTtTQUNKO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLFlBQVksR0FBa0IsRUFBRSxDQUFDO1FBRXJDLG1CQUFtQjtRQUNuQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUMzRCxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUNoQixLQUFLLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJO2dCQUNuQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQWlDLENBQUM7Z0JBQ2hFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ2hELENBQUMsQ0FBQztTQUNKO1FBRUQsK0JBQStCO1FBQy9CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2hELElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBRS9ELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7Z0JBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDZCQUE2QixHQUFHLEtBQUssQ0FBQyxDQUFDO2dCQUU1RSxRQUFRLEtBQUssRUFBRTtvQkFDYixLQUFLLFdBQVcsQ0FBQyxXQUFXLENBQUMsYUFBYTt3QkFDeEMsWUFBWSxDQUFDLElBQUksQ0FBQzs0QkFDaEIsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzt5QkFDaEcsQ0FBQyxDQUFDO3dCQUNILE1BQU07b0JBQ1IsS0FBSyxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVE7d0JBQ25DLFlBQVksQ0FBQyxJQUFJLENBQUM7NEJBQ2hCLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzt5QkFDekMsQ0FBQyxDQUFDO3dCQUNILE1BQU07b0JBQ1IsS0FBSyxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVE7d0JBQ25DLFlBQVksQ0FBQyxJQUFJLENBQUM7NEJBQ2hCLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3lCQUM3RixDQUFDLENBQUM7d0JBQ0gsTUFBTTtvQkFDUixLQUFLLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO29CQUNyQyxLQUFLLFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUTt3QkFDbkMsWUFBWSxDQUFDLElBQUksQ0FBQzs0QkFDaEIsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7eUJBQzFELENBQUMsQ0FBQzt3QkFDSCxNQUFNO29CQUNSLEtBQUssV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7b0JBQ3JDLEtBQUssV0FBVyxDQUFDLFdBQVcsQ0FBQyxRQUFRO3dCQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7NkJBQ3pELFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7NEJBQ3ZDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO3lCQUNoRCxDQUFDLENBQUMsQ0FBQzt3QkFDTixNQUFNO2lCQUNUO2FBQ0Y7UUFFSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxNQUFvQjtRQUN4QyxRQUFRLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDdkIsS0FBSyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUs7Z0JBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLEtBQUssWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLO2dCQUM5QixPQUFPLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzFFLEtBQUssWUFBWSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7Z0JBQzlDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUN4SSxLQUFLLFlBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO2dCQUN6QyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDbkksS0FBSyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWE7Z0JBQ3RDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNuSTtnQkFDRSxPQUFPLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7U0FDOUY7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGFBQWEsQ0FBQyxXQUFXO1FBRS9CLHNGQUFzRjtRQUN0RixrRkFBa0Y7UUFDbEYsMEJBQTBCO1FBQzFCLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUVyQyxJQUFHLFdBQVcsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFDO1lBQzlCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRSxJQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFDO2dCQUMzQixXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNsRztpQkFBTTtnQkFDTCxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3pCLE9BQU8sV0FBVyxDQUFDLGFBQWEsQ0FBQzthQUNsQztTQUNGO2FBQUk7WUFDSCw4REFBOEQ7WUFDOUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNELCtFQUErRTtZQUMvRSw4RUFBOEU7WUFDOUUsSUFBSSxNQUFNLEVBQUU7Z0JBRVYsMEJBQTBCO2dCQUMxQixJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUU7b0JBQ2pGLFdBQVcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2lCQUNsQztxQkFBTTtvQkFDTCxPQUFPLFdBQVcsQ0FBQyxhQUFhLENBQUM7aUJBQ2xDO2dCQUVELFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUM3QyxXQUFXLENBQUMsSUFBSSxDQUNqQixDQUFDO2FBQ0g7aUJBQU0sSUFBSSxXQUFXLENBQUMsS0FBSyxLQUFLLG9CQUFvQixDQUFDLFFBQVEsRUFBRTtnQkFDOUQsV0FBVyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7Z0JBQzlCLE9BQU8sV0FBVyxDQUFDLGFBQWEsQ0FBQzthQUNsQztTQUNGO1FBQ0QsbUJBQW1CO1FBQ25CLE1BQU0sS0FBSyxHQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6RCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLG9CQUFvQixDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsS0FBSyxLQUFLLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3JKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsbUVBQW1FO1FBQ25FLFdBQVcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUUvQixxREFBcUQ7UUFDckQsbURBQW1EO1FBQ25ELDBDQUEwQztRQUMxQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUMsT0FBTyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxHQUFHO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsTUFBTSxhQUFhLEdBQXFCLEVBQUMsV0FBVyxFQUFFLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDO1lBQzNELE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQztZQUNoRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUM7WUFDM0QsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxDQUFDO1NBQ25FLENBQUE7SUFDSCxDQUFDO0lBR0QsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTthQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2FBQ3pDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNiLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUk7UUFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUk7UUFDdEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzs7WUE3aEJGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUseUJBQXlCO2dCQUNuQyxrbE5BQW9EOzthQUVyRDs7O1lBbEN5QixNQUFNO1lBd0I5QixhQUFhO1lBSGIsV0FBVztZQUZYLGFBQWE7WUFUUCxnQkFBZ0I7WUFQaEIscUJBQXFCO1lBWTNCLG9CQUFvQjtZQVZkLHVCQUF1QjtZQWE3QixnQkFBZ0I7Ozs4QkF5QmYsU0FBUyxTQUFDLGlCQUFpQjtvQkFrQjNCLEtBQUs7eUJBS0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7dGFrZVVudGlsLCBzd2l0Y2hNYXAsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIFR5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOYXZpZ2F0aW9uRXh0cmFzLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge09iamVjdEZvcm1Db250cm9sV3JhcHBlcn0gZnJvbSAnLi4vLi4vb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0tY29udHJvbC13cmFwcGVyJztcbmltcG9ydCB7UGVuZGluZ0NoYW5nZXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9lby1mcmFtZXdvcmstY29yZS9wZW5kaW5nLWNoYW5nZXMvcGVuZGluZy1jaGFuZ2VzLnNlcnZpY2UnO1xuaW1wb3J0IHtPYmplY3RGb3JtR3JvdXB9IGZyb20gJy4uLy4uL29iamVjdC1mb3JtL29iamVjdC1mb3JtL29iamVjdC1mb3JtLWdyb3VwJztcbmltcG9ydCB7T2JqZWN0Rm9ybUhlbHBlclNlcnZpY2V9IGZyb20gJy4uLy4uL29iamVjdC1mb3JtL29iamVjdC1mb3JtLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7TG9jYWxlRGF0ZVBpcGV9IGZyb20gJy4uLy4uLy4uL2VvLWZyYW1ld29yay1jb3JlL3BpcGVzL2xvY2FsZS1kYXRlLnBpcGUnO1xuaW1wb3J0IHtPYmplY3RGb3JtQ29udHJvbH0gZnJvbSAnLi4vLi4vb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0vb2JqZWN0LWZvcm0tY29udHJvbCc7XG5pbXBvcnQge0VkaXRGb3JtLCBOb3RpZnlMaXN0LCBSZXN0cmljdGlvbn0gZnJvbSAnLi4vc3RvcmVkLXF1ZXJ5LmludGVyZmFjZSc7XG5pbXBvcnQge1N0b3JlZFF1ZXJ5Q29tcG9uZW50fSBmcm9tICcuLi9zdG9yZWQtcXVlcnkvc3RvcmVkLXF1ZXJ5LmNvbXBvbmVudCc7XG5pbXBvcnQge1NlbGVjdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2VvLWZyYW1ld29yay1jb3JlL3NlbGVjdGlvbi9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQge1Vuc3Vic2NyaWJlT25EZXN0cm95fSBmcm9tICcuLi8uLi91dGlsL3Vuc3Vic2NyaWJlL3Vuc3Vic2NyaWJlLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBJU3RvcmVkUXVlcnlQYXJhbSxcbiAgU3RvcmVkUXVlcnksXG4gIFN0b3JlZFF1ZXJpZXNTZXJ2aWNlLFxuICBTZWFyY2hGaWx0ZXIsXG4gIFNlYXJjaFF1ZXJ5LFxuICBUcmFuc2xhdGVTZXJ2aWNlLFxuICBTeXN0ZW1TZXJ2aWNlLFxuICBSYW5nZVZhbHVlLFxuICBVc2VyU2VydmljZSxcbiAgT3JnUm9sZSxcbiAgVXRpbHMsXG4gIFNlYXJjaFNlcnZpY2UsXG4gIFF1ZXJ5U2NvcGVcbn0gZnJvbSAnQGVvLXNkay9jb3JlJztcbmltcG9ydCB7VXRpbGl0aWVzU2VydmljZX0gZnJvbSAnLi4vLi4vdXRpbC9zZXJ2aWNlcy91dGlsaXRpZXMuc2VydmljZSc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgb2YsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZW8tc3RvcmVkLXF1ZXJ5LWRldGFpbHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RvcmVkLXF1ZXJ5LWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdG9yZWQtcXVlcnktZGV0YWlscy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFN0b3JlZFF1ZXJ5RGV0YWlsc0NvbXBvbmVudCBleHRlbmRzIFVuc3Vic2NyaWJlT25EZXN0cm95IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBwcml2YXRlIEZPUk1fSU5QVVRfVElUTEUgPSAnc3RvcmVkUXVlcnlUaXRsZSc7XG4gIHByaXZhdGUgRk9STV9JTlBVVF9GVUxMVEVYVCA9ICdzdG9yZWRRdWVyeUZ1bGx0ZXh0JztcbiAgcHJpdmF0ZSBCQVNFX1BBUkFNU19GSUVMRFMgPSBPYmplY3Qua2V5cyhTZWFyY2hRdWVyeS5CQVNFX1BBUkFNUykubWFwKGsgPT4gU2VhcmNoUXVlcnkuQkFTRV9QQVJBTVNba10pO1xuICBwcml2YXRlIGRhdGVQaXBlOiBMb2NhbGVEYXRlUGlwZTtcbiAgcHJpdmF0ZSBwZW5kaW5nVGFza0lkOiBzdHJpbmc7XG5cbiAgQFZpZXdDaGlsZCgnc3RvcmVkUXVlcnlGb3JtJykgc3RvcmVkUXVlcnlGb3JtOiBTdG9yZWRRdWVyeUNvbXBvbmVudDtcblxuICBpY29uVGl0bGVzOiBhbnk7XG4gIHN0b3JlZFF1ZXJ5OiBTdG9yZWRRdWVyeTtcbiAgcXVlcnlTY29wZTogUXVlcnlTY29wZTtcbiAgZWRpdEZvcm06IEVkaXRGb3JtO1xuICByZXN0cmljdGlvbnM6IFJlc3RyaWN0aW9uW107XG4gIGVkaXRpbmdTaGFyZTogYm9vbGVhbjtcbiAgaXNOZXdRdWVyeTogYm9vbGVhbjtcbiAgaXNPd25RdWVyeTogYm9vbGVhbjtcbiAgZW5hYmxlU2hhcmluZzogYm9vbGVhbjtcbiAgc3lzdGVtUm9sZXM6IE9yZ1JvbGVbXTtcbiAgcm9sZXNQaWNrZXIgPSB7XG4gICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnN0b3JlZHF1ZXJ5LnJvbGVzJyksXG4gICAgY29kZXN5c3RlbTogbnVsbCxcbiAgICB2YWx1ZTogbnVsbFxuICB9O1xuXG4gIEBJbnB1dCgpXG4gIHNldCBxdWVyeShxOiBTdG9yZWRRdWVyeSkge1xuICAgIHRoaXMuc2V0UXVlcnkocSk7XG4gIH1cblxuICBAT3V0cHV0KCkgbm90aWZ5TGlzdDogRXZlbnRFbWl0dGVyPE5vdGlmeUxpc3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxOb3RpZnlMaXN0PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgc3lzdGVtU2VydmljZTogU3lzdGVtU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzZWxlY3Rpb246IFNlbGVjdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgcGVuZGluZ0NoYW5nZXM6IFBlbmRpbmdDaGFuZ2VzU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzdG9yZWRRdWVyaWVzU2VydmljZTogU3RvcmVkUXVlcmllc1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgZm9ybUhlbHBlclNlcnZpY2U6IE9iamVjdEZvcm1IZWxwZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmRhdGVQaXBlID0gbmV3IExvY2FsZURhdGVQaXBlKHRyYW5zbGF0ZSk7XG4gICAgdGhpcy5mZXRjaFJvbGVzKCk7XG4gIH1cbiAgXG4gIHB1YmxpYyBzZXRRdWVyeVNjb3BlKHNjb3BlOiBRdWVyeVNjb3BlKSB7XG4gICAgdGhpcy5zdG9yZWRRdWVyeS5zY29wZSA9IHNjb3BlO1xuICAgIHRoaXMucXVlcnlTY29wZSA9IHNjb3BlO1xuICB9XG5cbiAgc2V0UXVlcnkocTogU3RvcmVkUXVlcnkpIHtcbiAgICB0aGlzLmVkaXRpbmdTaGFyZSA9IGZhbHNlO1xuICAgIHRoaXMucmVzZXRFZGl0Rm9ybSgpO1xuICAgIC8vIGdyYWIgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcXVlcnlcbiAgICB0aGlzLnN0b3JlZFF1ZXJ5ID0gcTtcbiAgICBpZiAocSBpbnN0YW5jZW9mIFN0b3JlZFF1ZXJ5KSB7XG4gICAgICB0aGlzLnF1ZXJ5U2NvcGUgPSBxLnNjb3BlO1xuICAgICAgY29uc3QgdXNlciA9IHRoaXMudXNlclNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICAgIHRoaXMuaXNOZXdRdWVyeSA9IHEuaXNOZXcoKTtcbiAgICAgIHRoaXMuaXNPd25RdWVyeSA9IHRoaXMuaXNOZXdRdWVyeSB8fCBxLnVzZXIudG9Mb3dlckNhc2UoKSA9PT0gdXNlci5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLnJlc3RyaWN0aW9ucyA9IHRoaXMuZ2V0UmVzdHJpY3Rpb25zKCk7XG4gICAgICB0aGlzLnJvbGVzUGlja2VyLnZhbHVlID0gcS5yb2xlcztcbiAgICAgIHRoaXMuZW5hYmxlU2hhcmluZyA9IHVzZXIuaGFzUHJpdmlsZWdlKCdTSEFSRV9TVE9SRURfUVVFUklFUycpICYmIHRoaXMuaXNPd25RdWVyeSAmJiAhdGhpcy5pc05ld1F1ZXJ5O1xuXG4gICAgICBpZiAocS5pc05ldygpKSB7XG4gICAgICAgIHRoaXMuc3RvcmVkUXVlcnkubmFtZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnNlYXJjaC5zdG9yZWRxdWVyaWVzLm5ldy50aXRsZScpO1xuICAgICAgICB0aGlzLmVkaXQoKTtcbiAgICAgICAgdGhpcy5zdGFydFBlbmRpbmcoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlMaXN0LmVtaXQoe3Vuc2VsZWN0OiB0cnVlLCB1cGRhdGU6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFBlbmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnBlbmRpbmdDaGFuZ2VzLmhhc1BlbmRpbmdUYXNrKHRoaXMucGVuZGluZ1Rhc2tJZCB8fCAnICcpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdUYXNrSWQgPSB0aGlzLnBlbmRpbmdDaGFuZ2VzLnN0YXJ0VGFzaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoUGVuZGluZygpIHtcbiAgICB0aGlzLnBlbmRpbmdDaGFuZ2VzLmZpbmlzaFRhc2sodGhpcy5wZW5kaW5nVGFza0lkKTtcbiAgfVxuXG4gIGVkaXQoKSB7XG4gICAgaWYgKCF0aGlzLmVkaXRGb3JtLmZvcm0pIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRGb3JtKCk7XG4gICAgICAgIHRoaXMubm90aWZ5TGlzdC5lbWl0KHt1bnNlbGVjdDogZmFsc2UsIHVwZGF0ZTogdHJ1ZX0pO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgb25Gb3JtU3RhdHVzQ2hhbmdlZChmb3JtU3RhdGUpIHtcbiAgICBmb3JtU3RhdGUuZGlydHkgPyB0aGlzLnN0YXJ0UGVuZGluZygpIDogdGhpcy5maW5pc2hQZW5kaW5nKCk7XG4gIH1cblxuICB0b2dnbGVTaGFyZUVkaXQoKSB7XG4gICAgdGhpcy5lZGl0aW5nU2hhcmUgPSAhdGhpcy5lZGl0aW5nU2hhcmU7XG4gIH1cblxuICBzaGFyZSgpIHtcbiAgICB0aGlzLnN0b3JlZFF1ZXJ5LnJvbGVzID0gdGhpcy5yb2xlc1BpY2tlci52YWx1ZTtcbiAgICB0aGlzLnN0b3JlZFF1ZXJpZXNTZXJ2aWNlLnNhdmVTdG9yZWRRdWVyeSh0aGlzLnN0b3JlZFF1ZXJ5KS5zdWJzY3JpYmUoXG4gICAgICBfID0+IHtcbiAgICAgIH0sIFV0aWxzLnRocm93KG51bGwsIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnNlYXJjaC5zdG9yZWRxdWVyeS5zYXZlLmVycm9yJykpXG4gICAgKTtcbiAgICB0aGlzLmVkaXRpbmdTaGFyZSA9IGZhbHNlO1xuICB9XG5cbiAgY2FuY2VsU2hhcmUoKSB7XG4gICAgdGhpcy5yb2xlc1BpY2tlci52YWx1ZSA9IHRoaXMuc3RvcmVkUXVlcnkucm9sZXM7XG4gICAgdGhpcy5lZGl0aW5nU2hhcmUgPSBmYWxzZTtcbiAgfVxuXG4gIGRlbGV0ZSgpIHtcbiAgICB0aGlzLnN0b3JlZFF1ZXJpZXNTZXJ2aWNlXG4gICAgICAucmVtb3ZlU3RvcmVkUXVlcnkodGhpcy5zdG9yZWRRdWVyeS5pZClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ub3RpZnlMaXN0LmVtaXQoe3Vuc2VsZWN0OiBmYWxzZSwgdXBkYXRlOiBmYWxzZX0pO1xuICAgICAgfSwgVXRpbHMudGhyb3cobnVsbCwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc2VhcmNoLnN0b3JlZHF1ZXJ5LmRlbGV0ZS5lcnJvcicpKSk7XG4gIH1cblxuICB0b2dnbGVGYXZvcml0ZVN0YXRlKCkge1xuICAgIHRoaXMuc3RvcmVkUXVlcnkuZmF2b3JpdGUgPSAhdGhpcy5zdG9yZWRRdWVyeS5mYXZvcml0ZTtcbiAgICB0aGlzLnN0b3JlZFF1ZXJpZXNTZXJ2aWNlXG4gICAgICAuc2F2ZVN0b3JlZFF1ZXJ5KHRoaXMuc3RvcmVkUXVlcnkpXG4gICAgICAuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgfSwgVXRpbHMudGhyb3cobnVsbCwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc2VhcmNoLnN0b3JlZHF1ZXJ5LnNhdmUuZXJyb3InKSkpO1xuICB9XG5cbiAgY2FuY2VsRWRpdCgpIHtcbiAgICB0aGlzLnJlc2V0RWRpdEZvcm0oKTtcbiAgICB0aGlzLmZpbmlzaFBlbmRpbmcoKTtcbiAgICBpZiAodGhpcy5zdG9yZWRRdWVyeS5pc05ldygpKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5ub3RpZnlMaXN0LmVtaXQoe3Vuc2VsZWN0OiBmYWxzZSwgdXBkYXRlOiBmYWxzZSwgcGF5bG9hZDogdGhpcy5zdG9yZWRRdWVyeX0pO1xuICB9XG5cbiAgc2V0UXVlcnlUb0FwcFNlYXJjaCgpIHtcbiAgICB0aGlzLnN0b3JlZFF1ZXJ5Rm9ybS5sb2FkKCk7XG4gIH1cblxuICBleGVjdXRlUXVlcnkoKSB7XG4gICAgdGhpcy5zdG9yZWRRdWVyeUZvcm0uZXhlY3V0ZSgpO1xuICB9XG5cbiAgLy8gU2F2ZSB0aGUgY3VycmVudCBzdG9yZWQgcXVlcnlcbiAgdXBkYXRlU3RvcmVkUXVlcnkoKSB7XG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuZ2V0Rm9ybURhdGEoKTtcbiAgICB0aGlzLnN0b3JlZFF1ZXJ5LmZpbHRlcnMgPSB0aGlzLnN0b3JlZFF1ZXJ5LmZpbHRlcnMuZmlsdGVyKGYgPT4gfnRoaXMuQkFTRV9QQVJBTVNfRklFTERTLmluZGV4T2YoZi5wcm9wZXJ0eSkpO1xuICAgIE9iamVjdC5rZXlzKGZvcm1EYXRhKVxuICAgICAgLmZvckVhY2goayA9PiB7XG4gICAgICAgIGlmIChrID09PSB0aGlzLkZPUk1fSU5QVVRfVElUTEUpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlZFF1ZXJ5Lm5hbWUgPSBmb3JtRGF0YVtrXTtcbiAgICAgICAgfSBlbHNlIGlmIChrID09PSB0aGlzLkZPUk1fSU5QVVRfRlVMTFRFWFQpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlZFF1ZXJ5LnRlcm0gPSBmb3JtRGF0YVtrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZmlsdGVyczogU2VhcmNoRmlsdGVyW10gPSB0aGlzLnNlYXJjaFNlcnZpY2UuZ2V0U2VhcmNoRmlsdGVyKHRoaXMuc3RvcmVkUXVlcnkudHlwZXMsIGssIGZvcm1EYXRhW2tdKTtcbiAgICAgICAgICBmaWx0ZXJzLmZvckVhY2goZiA9PiB0aGlzLnN0b3JlZFF1ZXJ5LmFkZEZpbHRlcihmKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zdG9yZWRRdWVyaWVzU2VydmljZVxuICAgICAgLnNhdmVTdG9yZWRRdWVyeSh0aGlzLnN0b3JlZFF1ZXJ5KVxuICAgICAgLnN1YnNjcmliZSh1cGRhdGVkU3RvcmVkUXVlcnkgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gdXBkYXRlZFN0b3JlZFF1ZXJ5O1xuICAgICAgICB0aGlzLnJlc2V0RWRpdEZvcm0oKTtcbiAgICAgICAgdGhpcy5maW5pc2hQZW5kaW5nKCk7XG4gICAgICAgIHRoaXMubm90aWZ5TGlzdC5lbWl0KHt1bnNlbGVjdDogZmFsc2UsIHVwZGF0ZTogZmFsc2UsIHBheWxvYWQ6IHVwZGF0ZWRTdG9yZWRRdWVyeX0pO1xuICAgICAgfSwgVXRpbHMudGhyb3cobnVsbCwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc2VhcmNoLnN0b3JlZHF1ZXJ5LnNhdmUuZXJyb3InKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBmb3JtIGVsZW1lbnRzIHRvIGJlIGEgZHluYW1pYyBwYXJhbWV0ZXIgb3Igbm90XG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgcGFyYW1ldGVyQ2hhbmdlZChldmVudDogeyBjb250cm9sOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuIH0pIHtcblxuICAgIGxldCBtID0gdGhpcy5zdG9yZWRRdWVyeS5wYXJhbWV0ZXIuZmluZChwID0+IHAucW5hbWUgPT09IGV2ZW50LmNvbnRyb2wpO1xuICAgIGlmIChtICYmICFldmVudC52YWx1ZSkge1xuICAgICAgLy8gcmVtb3ZlIGV4aXN0aW5nIHBhcmFtZXRlclxuICAgICAgdGhpcy5zdG9yZWRRdWVyeS5wYXJhbWV0ZXIgPSB0aGlzLnN0b3JlZFF1ZXJ5LnBhcmFtZXRlci5maWx0ZXIocCA9PiBwLnFuYW1lICE9PSBldmVudC5jb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKCFtICYmIGV2ZW50LnZhbHVlKSB7XG4gICAgICAvLyBhZGQgcGFyYW1ldGVyIGVsZW1lbnRcbiAgICAgIGxldCBwYXJhbSA9IHRoaXMuZm9ybUZpZWxkVG9QYXJhbWV0ZXIoZXZlbnQuY29udHJvbCk7XG4gICAgICBpZiAocGFyYW0pIHtcbiAgICAgICAgdGhpcy5zdG9yZWRRdWVyeS5wYXJhbWV0ZXIucHVzaChwYXJhbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb3JtRGF0YSgpIHtcblxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyh0aGlzLmVkaXRGb3JtLmZvcm0udmFsdWUpO1xuICAgIGxldCBkYXRhID0ge307XG5cblxuICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG5cbiAgICAgIGNvbnN0IGZjOiBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIgPSB0aGlzLmVkaXRGb3JtLmZvcm0uY29udHJvbHNbcHJvcGVydHldIGFzIE9iamVjdEZvcm1Db250cm9sV3JhcHBlcjtcbiAgICAgIGxldCBmb3JtRWxlbWVudDtcbiAgICAgIGlmIChmYy5jb250cm9scyAmJiBmYy5jb250cm9sc1twcm9wZXJ0eV0pIHtcbiAgICAgICAgY29uc3QgZmU6IE9iamVjdEZvcm1Db250cm9sID0gZmMuY29udHJvbHNbcHJvcGVydHldIGFzIE9iamVjdEZvcm1Db250cm9sO1xuICAgICAgICBmb3JtRWxlbWVudCA9IGZlLl9lb0Zvcm1FbGVtZW50O1xuICAgICAgfVxuICAgICAgaWYgKGZvcm1FbGVtZW50ICYmIGZvcm1FbGVtZW50LmlzTm90U2V0VmFsdWUpIHtcbiAgICAgICAgZGF0YVtwcm9wZXJ0eV0gPSBudWxsO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgICAgICAgY2FzZSB0aGlzLkZPUk1fSU5QVVRfVElUTEU6IHtcbiAgICAgICAgICAgIGRhdGFbcHJvcGVydHldID0gdGhpcy5lZGl0Rm9ybS5mb3JtLnZhbHVlW3Byb3BlcnR5XSB8fCAnJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIHRoaXMuRk9STV9JTlBVVF9GVUxMVEVYVDoge1xuICAgICAgICAgICAgZGF0YVtwcm9wZXJ0eV0gPSB0aGlzLmVkaXRGb3JtLmZvcm0udmFsdWVbcHJvcGVydHldW1N0b3JlZFF1ZXJpZXNTZXJ2aWNlLkZVTExURVhUXSB8fCAnJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy5lZGl0Rm9ybS5mb3JtLnZhbHVlW3Byb3BlcnR5XVtwcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoIVV0aWxpdGllc1NlcnZpY2UuaXNFbXB0eSh2KSkge1xuICAgICAgICAgICAgICBkYXRhW3Byb3BlcnR5XSA9IHY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZHluYW1pYyBzdG9yZWQgcXVlcnkgcGFyYW1ldGVyIGZvciBhIGZvcm0gZWxlbWVudFxuICAgKiBAcGFyYW0gcW5hbWUgVGhlIGZvcm0gZWxlbWVudHMgcW5hbWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgZm9ybUZpZWxkVG9QYXJhbWV0ZXIocW5hbWU6IHN0cmluZyk6IElTdG9yZWRRdWVyeVBhcmFtIHtcblxuICAgIHRyeSB7XG4gICAgICBsZXQgcGFyYW06IElTdG9yZWRRdWVyeVBhcmFtO1xuICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgZnVsbHRleHQgZmllbGRzXG4gICAgICBpZiAocW5hbWUgPT09IFN0b3JlZFF1ZXJpZXNTZXJ2aWNlLkZVTExURVhUKSB7XG4gICAgICAgIHBhcmFtID0ge1xuICAgICAgICAgIHFuYW1lOiBxbmFtZSxcbiAgICAgICAgICB0eXBlOiBxbmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZjID0gKCh0aGlzLmVkaXRGb3JtLmZvcm0uY29udHJvbHNbcW5hbWVdIGFzIE9iamVjdEZvcm1Db250cm9sV3JhcHBlcikuY29udHJvbHNbcW5hbWVdIGFzIE9iamVjdEZvcm1Db250cm9sKTtcbiAgICAgICAgY29uc3QgZmUgPSBmYy5fZW9Gb3JtRWxlbWVudDtcbiAgICAgICAgcGFyYW0gPSB7XG4gICAgICAgICAgcW5hbWU6IGZlLnFuYW1lLFxuICAgICAgICAgIHR5cGU6IGZlLnR5cGVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJhbTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RWRpdEZvcm0oKSB7XG4gICAgdGhpcy5lZGl0Rm9ybSA9IHtcbiAgICAgIGZvcm06IG51bGwsXG4gICAgICBmdWxsdGV4dEZvcm1Db250cm9sOiBudWxsLFxuICAgICAgY29udHJvbHM6IFtdLFxuICAgICAgY29udGV4dENvbnRyb2xzOiBbXVxuICAgIH07XG4gIH1cblxuICBvbkZvcm1DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdEZvcm1cbiAgICAgIC5mb3JtXG4gICAgICAudmFsdWVDaGFuZ2VzXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtU3RhdHVzQ2hhbmdlZCh0aGlzLmVkaXRGb3JtLmZvcm0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRWRpdEZvcm0oKSB7XG5cbiAgICB0aGlzLnJlc2V0RWRpdEZvcm0oKTtcbiAgICB0aGlzLnNldHVwRm9ybUNvbnRyb2xzKCkuc3Vic2NyaWJlKF8gPT4ge1xuXG4gICAgICBsZXQgZm9ybSA9IG5ldyBPYmplY3RGb3JtR3JvdXAoe30pO1xuICAgICAgbGV0IGZjVGl0bGUgPSBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgZmNUaXRsZS5zZXRWYWx1ZSh0aGlzLnN0b3JlZFF1ZXJ5Lm5hbWUpO1xuXG4gICAgICBsZXQgZmNGdWxsdGV4dCA9IHRoaXMudG9Gb3JtQ29udHJvbCh0aGlzLnN0b3JlZFF1ZXJpZXNTZXJ2aWNlLmdldEZ1bGx0ZXh0Rm9ybUVsZW1lbnQoXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnN0b3JlZHF1ZXJ5LnNlYXJjaC50ZXJtJyksXG4gICAgICAgIHRoaXMuc3RvcmVkUXVlcnkudGVybVxuICAgICAgKSk7XG4gICAgICB0aGlzLmVkaXRGb3JtLmZ1bGx0ZXh0Rm9ybUNvbnRyb2wgPSBmY0Z1bGx0ZXh0O1xuXG4gICAgICAvLyBhZGQgdGl0bGUgYW5kIGZ1bGx0ZXh0IGZpZWxkXG4gICAgICBmb3JtLmFkZENvbnRyb2wodGhpcy5GT1JNX0lOUFVUX1RJVExFLCBmY1RpdGxlKTtcbiAgICAgIGZvcm0uYWRkQ29udHJvbCh0aGlzLkZPUk1fSU5QVVRfRlVMTFRFWFQsIGZjRnVsbHRleHQpO1xuXG4gICAgICBpZiAodGhpcy5lZGl0Rm9ybS5jb250cm9scy5sZW5ndGggfHwgdGhpcy5lZGl0Rm9ybS5jb250ZXh0Q29udHJvbHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZWRpdEZvcm0uY29udHJvbHNcbiAgICAgICAgICAuZm9yRWFjaCgoYykgPT4gZm9ybS5hZGRDb250cm9sKGMuX2VvRm9ybUNvbnRyb2xXcmFwcGVyLmNvbnRyb2xOYW1lLCBjKSk7XG4gICAgICAgIHRoaXMuZWRpdEZvcm0uY29udGV4dENvbnRyb2xzXG4gICAgICAgICAgLmZvckVhY2goKGMpID0+IGZvcm0uYWRkQ29udHJvbChjLl9lb0Zvcm1Db250cm9sV3JhcHBlci5jb250cm9sTmFtZSwgYykpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVkaXRGb3JtLmZvcm0gPSBmb3JtO1xuICAgICAgdGhpcy5vbkZvcm1DaGFuZ2VzKCk7XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBGb3JtQ29udHJvbHMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCB0YXNrcyA9IFtdO1xuICAgICAvLyBzZXR0aW5nIHVwIG9iamVjdCB0eXBlIGZvcm0gb25seSBtYWtlcyBzZW5zZSB3aXRoIG9uZSB0YXJnZXQgdHlwZVxuICAgIGlmICh0aGlzLnN0b3JlZFF1ZXJ5LnR5cGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGFza3MucHVzaCh0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0Rm9ybUVsZW1lbnRzRnJvbUZvcm1Nb2RlbCh0aGlzLnN0b3JlZFF1ZXJ5LnR5cGVzWzBdLnFuYW1lLCAnU0VBUkNIJykucGlwZShcbiAgICAgICAgdGFwKChlbGVtZW50czogYW55W10pID0+IHtcbiAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgLy8gcHJldmVudCB0YWJsZXMgYW5kIGJpbmFyeSB0eXBlcyBmcm9tIGJlaW5nIHJlbmRlcmVkIGluIHRoZSBzdG9yZWQgcXVlcnkgZm9ybVxuICAgICAgICAgICAgaWYgKGUudHlwZSAhPT0gJ0JJTkFSWScpIHtcbiAgICAgICAgICAgICAgaWYgKGUucmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBlLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICBlLnJlYWRvbmx5ID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLnRvRm9ybUNvbnRyb2woZSk7XG4gICAgICAgICAgICAgIGlmIChmYykge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdEZvcm0uY29udHJvbHMucHVzaChmYyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgKSlcbiAgICB9XG4gICAgIC8vIGFkZCBjb250ZXh0IGZvcm0gY29udHJvbHMgYXMgd2VsbFxuICAgIGlmICh0aGlzLnN0b3JlZFF1ZXJ5LmNvbnRleHRGb2xkZXJUeXBlcy5sZW5ndGgpIHtcbiAgICAgIHRhc2tzLnB1c2godGhpcy5zeXN0ZW1TZXJ2aWNlLmdldEZvcm1FbGVtZW50c0Zyb21Gb3JtTW9kZWwodGhpcy5zdG9yZWRRdWVyeS5jb250ZXh0Rm9sZGVyVHlwZXNbMF0ucW5hbWUsICdTRUFSQ0gnLCB0cnVlKS5waXBlKFxuICAgICAgICB0YXAoKGVsZW1lbnRzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmYyA9IHRoaXMudG9Gb3JtQ29udHJvbChlKTtcbiAgICAgICAgICAgIGlmIChmYykge1xuICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLmNvbnRleHRDb250cm9scy5wdXNoKGZjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGFza3MubGVuZ3RoID8gZm9ya0pvaW4odGFza3MpIDogb2YodGFza3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFJvbGVzKCkge1xuICAgIGlmICghdGhpcy5zeXN0ZW1Sb2xlcyB8fCB0aGlzLnN5c3RlbVJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zeXN0ZW1TZXJ2aWNlXG4gICAgICAgIC5nZXRSb2xlcygpXG4gICAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3lzdGVtUm9sZXMgPSByZXM7XG4gICAgICAgICAgICB0aGlzLnJvbGVzUGlja2VyLmNvZGVzeXN0ZW0gPSB7XG4gICAgICAgICAgICAgIGVudHJpZXM6IHRoaXMuc3lzdGVtUm9sZXMubWFwKHJvbGUgPT4gKHtcbiAgICAgICAgICAgICAgICBpZDogcm9sZS5pZCxcbiAgICAgICAgICAgICAgICBsYWJlbDogcm9sZS5uYW1lLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRyZXByZXNlbnRhdGlvbjogcm9sZS5uYW1lLFxuICAgICAgICAgICAgICAgIGRhdGE6IHJvbGUubmFtZVxuICAgICAgICAgICAgICB9KSkuc29ydChVdGlscy5zb3J0VmFsdWVzKCdsYWJlbCcpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGdldFJlc3RyaWN0aW9ucygpOiBSZXN0cmljdGlvbltdIHtcbiAgICBsZXQgcmVzdHJpY3Rpb25zOiBSZXN0cmljdGlvbltdID0gW107XG5cbiAgICAvLyB0eXBlIHJlc3RyaWN0aW9uXG4gICAgaWYgKHRoaXMuc3RvcmVkUXVlcnkudHlwZXMgJiYgdGhpcy5zdG9yZWRRdWVyeS50eXBlcy5sZW5ndGgpIHtcbiAgICAgIHJlc3RyaWN0aW9ucy5wdXNoKHtcbiAgICAgICAgZmllbGQ6IFNlYXJjaFF1ZXJ5LkJBU0VfUEFSQU1TLlRZUEUsXG4gICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlby5zdG9yZWRxdWVyeS5yZXN0cmljdGlvbi50eXBlJyksXG4gICAgICAgIGl0ZW1zOiB0aGlzLnN0b3JlZFF1ZXJ5LnR5cGVzLm1hcCh0ID0+IHQubGFiZWwpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYmFzZSBwYXJhbXMgcmVzdHJpY3Rpb25zXG4gICAgKHRoaXMuc3RvcmVkUXVlcnkuZmlsdGVycyB8fCBbXSkuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgaWYgKGZpbHRlciAmJiB+dGhpcy5CQVNFX1BBUkFNU19GSUVMRFMuaW5kZXhPZihmaWx0ZXIucHJvcGVydHkpKSB7XG5cbiAgICAgICAgY29uc3QgZmllbGQgPSBmaWx0ZXIucHJvcGVydHk7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc3RvcmVkcXVlcnkucmVzdHJpY3Rpb24uJyArIGZpZWxkKTtcblxuICAgICAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICAgICAgY2FzZSBTZWFyY2hRdWVyeS5CQVNFX1BBUkFNUy5NSU1FVFlQRUdST1VQOlxuICAgICAgICAgICAgcmVzdHJpY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICBmaWVsZCwgbGFiZWwsIGl0ZW1zOiBBcnJheS5pc0FycmF5KGZpbHRlci5maXJzdFZhbHVlKSA/IGZpbHRlci5maXJzdFZhbHVlIDogW2ZpbHRlci5maXJzdFZhbHVlXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFNlYXJjaFF1ZXJ5LkJBU0VfUEFSQU1TLkZJTEVOQU1FOlxuICAgICAgICAgICAgcmVzdHJpY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICBmaWVsZCwgbGFiZWwsIGl0ZW1zOiBbZmlsdGVyLmZpcnN0VmFsdWVdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgU2VhcmNoUXVlcnkuQkFTRV9QQVJBTVMuRklMRVNJWkU6XG4gICAgICAgICAgICByZXN0cmljdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIGZpZWxkLCBsYWJlbCwgaXRlbXM6IFt0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlby5zZWFyY2guYWdnLmZpbGVzaXplLicgKyBmaWx0ZXIuZmlyc3RWYWx1ZSldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgU2VhcmNoUXVlcnkuQkFTRV9QQVJBTVMuQ1JFQVRFRDpcbiAgICAgICAgICBjYXNlIFNlYXJjaFF1ZXJ5LkJBU0VfUEFSQU1TLk1PRElGSUVEOlxuICAgICAgICAgICAgcmVzdHJpY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICBmaWVsZCwgbGFiZWwsIGl0ZW1zOiBbdGhpcy5jcmVhdGVEYXRlUmVzdHJpY3Rpb24oZmlsdGVyKV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBTZWFyY2hRdWVyeS5CQVNFX1BBUkFNUy5DUkVBVE9SOlxuICAgICAgICAgIGNhc2UgU2VhcmNoUXVlcnkuQkFTRV9QQVJBTVMuTU9ESUZJRVI6XG4gICAgICAgICAgICB0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0T3JnYW5pemF0aW9uT2JqZWN0cyhmaWx0ZXIuZmlyc3RWYWx1ZSlcbiAgICAgICAgICAgICAgLnN1YnNjcmliZShvcmdVc2VycyA9PiByZXN0cmljdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGQsIGxhYmVsLCBpdGVtczogb3JnVXNlcnMubWFwKHUgPT4gdS50aXRsZSlcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3RyaWN0aW9ucztcbiAgfVxuXG4gIGNyZWF0ZURhdGVSZXN0cmljdGlvbihmaWx0ZXI6IFNlYXJjaEZpbHRlcikge1xuICAgIHN3aXRjaCAoZmlsdGVyLm9wZXJhdG9yKSB7XG4gICAgICBjYXNlIFNlYXJjaEZpbHRlci5PUEVSQVRPUi5SQU5HRTpcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYGVvLnNlYXJjaC5hZ2cudGltZS4ke2ZpbHRlci5maXJzdFZhbHVlfWApO1xuICAgICAgY2FzZSBTZWFyY2hGaWx0ZXIuT1BFUkFUT1IuRVFVQUw6XG4gICAgICAgIHJldHVybiBgPSAke3RoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpbHRlci5maXJzdFZhbHVlLCAnZW9TaG9ydERhdGUnKX1gO1xuICAgICAgY2FzZSBTZWFyY2hGaWx0ZXIuT1BFUkFUT1IuSU5URVJWQUxfSU5DTFVERV9CT1RIOlxuICAgICAgICByZXR1cm4gYCR7dGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmlsdGVyLmZpcnN0VmFsdWUsICdlb1Nob3J0RGF0ZScpfSAtICR7dGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmlsdGVyLnNlY29uZFZhbHVlLCAnZW9TaG9ydERhdGUnKX1gO1xuICAgICAgY2FzZSBTZWFyY2hGaWx0ZXIuT1BFUkFUT1IuR1JFQVRFUl9PUl9FUVVBTDpcbiAgICAgICAgcmV0dXJuIGAke3RoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnNlYXJjaC5hZ2cudGltZS5zcGFuLnNpbmNlJyl9ICR7dGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmlsdGVyLmZpcnN0VmFsdWUsICdlb1Nob3J0RGF0ZScpfWA7XG4gICAgICBjYXNlIFNlYXJjaEZpbHRlci5PUEVSQVRPUi5MRVNTX09SX0VRVUFMOlxuICAgICAgICByZXR1cm4gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc2VhcmNoLmFnZy50aW1lLnNwYW4udW50aWwnKX0gJHt0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWx0ZXIuZmlyc3RWYWx1ZSwgJ2VvU2hvcnREYXRlJyl9YDtcbiAgICAgIGRlZmF1bHQgOlxuICAgICAgICByZXR1cm4gYCgke2ZpbHRlci5vcGVyYXRvcn0pICR7dGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmlsdGVyLmZpcnN0VmFsdWUsICdlb1Nob3J0RGF0ZScpfWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmb3JtIGNvbnRyb2wgZnJvbSBhIGdpdmVuIGZvcm0gZWxlbWVudFxuICAgKiBAcGFyYW0gZm9ybUVsZW1lbnRcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgdG9Gb3JtQ29udHJvbChmb3JtRWxlbWVudCk6IE9iamVjdEZvcm1Db250cm9sV3JhcHBlciB7XG5cbiAgICAvLyB0aGUgYG5hbWVgIHByb3BlcnR5IG9mIHN0b3JlZCBxdWVyeSBmb3JtIGVsZW1lbnQgaGFzIHRvIGJlIGBxbmFtZWAgb2YgZm9ybSBlbGVtZW50LFxuICAgIC8vIGJlY2F1c2Ugd2UgbWF5IGNvbWJpbmUgbXVsdGlwbGUgZm9ybXMgKGNvbnRleHQgZm9ybSkgYW5kIGluIHRoaXMgY2FzZSB0aGVyZSBtYXlcbiAgICAvLyBiZSBjb25mbGljdHMgaW4gbmFtaW5nc1xuICAgIGZvcm1FbGVtZW50Lm5hbWUgPSBmb3JtRWxlbWVudC5xbmFtZTtcblxuICAgIGlmKGZvcm1FbGVtZW50LnR5cGUgPT09ICdUQUJMRScpe1xuICAgICAgbGV0IGZpbHRlcnMgPSB0aGlzLnN0b3JlZFF1ZXJ5LmdldFRhYmxlRmlsdGVycyhmb3JtRWxlbWVudC5xbmFtZSk7XG4gICAgICBpZihmaWx0ZXJzICYmIGZpbHRlcnMubGVuZ3RoKXtcbiAgICAgICAgZm9ybUVsZW1lbnQudmFsdWUgPSB0aGlzLnNlYXJjaFNlcnZpY2UudGFibGVGaWx0ZXJzVG9FbGVtZW50VmFsdWUoZmlsdGVycywgZm9ybUVsZW1lbnQuZWxlbWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybUVsZW1lbnQudmFsdWUgPSBbe31dO1xuICAgICAgICBkZWxldGUgZm9ybUVsZW1lbnQuaXNOb3RTZXRWYWx1ZTtcbiAgICAgIH1cbiAgICB9ZWxzZXtcbiAgICAgIC8vIGdyYWIgdmFsdWUgZm9yIHRoZSBjb250cm9sIGZyb20gY29ycmVzcG9uZGluZyBxdWVyeSBmaWx0ZXJzXG4gICAgICBsZXQgZmlsdGVyID0gdGhpcy5zdG9yZWRRdWVyeS5nZXRGaWx0ZXIoZm9ybUVsZW1lbnQucW5hbWUpO1xuICAgICAgLy8gd2UgbWF5IGhhdmUgcGFyYW1zIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBxdWVyaWVzIGZpbHRlcnMuIFRoaXMgbWF5IGJlIHRoZVxuICAgICAgLy8gY2FzZSB3aGVuIHdlIG1hcmsgZm9ybSBlbGVtZW50cyBhcyBkeW5hbWljIGZpZWxkcyB3aXRob3V0IHByb3ZpZGluZyBhIHZhbHVlXG4gICAgICBpZiAoZmlsdGVyKSB7XG4gIFxuICAgICAgICAvLyBmaWx0ZXIgdG8gaGF2ZSBubyB2YWx1ZVxuICAgICAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBTZWFyY2hGaWx0ZXIuT1BFUkFUT1IuRVFVQUwgJiYgZmlsdGVyLmZpcnN0VmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBmb3JtRWxlbWVudC5pc05vdFNldFZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZm9ybUVsZW1lbnQuaXNOb3RTZXRWYWx1ZTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgZm9ybUVsZW1lbnQudmFsdWUgPSB0aGlzLnNlYXJjaFNlcnZpY2UuZmlsdGVyVG9FbGVtZW50VmFsdWUoXG4gICAgICAgICAgdGhpcy5zdG9yZWRRdWVyeS5nZXRGaWx0ZXIoZm9ybUVsZW1lbnQucW5hbWUpLFxuICAgICAgICAgIGZvcm1FbGVtZW50LnR5cGVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZm9ybUVsZW1lbnQucW5hbWUgIT09IFN0b3JlZFF1ZXJpZXNTZXJ2aWNlLkZVTExURVhUKSB7XG4gICAgICAgIGZvcm1FbGVtZW50LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBkZWxldGUgZm9ybUVsZW1lbnQuaXNOb3RTZXRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gc3luYyB3aXRoIHBhcmFtc1xuICAgIGNvbnN0IG1hdGNoOiBhbnkgPSB0aGlzLnN0b3JlZFF1ZXJ5LnBhcmFtZXRlci5maW5kKHBhcmFtID0+IHtcbiAgICAgIHJldHVybiAocGFyYW0ucW5hbWUgPT09IGZvcm1FbGVtZW50LnFuYW1lKSB8fCAocGFyYW0udHlwZSA9PT0gU3RvcmVkUXVlcmllc1NlcnZpY2UuRlVMTFRFWFQgJiYgZm9ybUVsZW1lbnQucW5hbWUgPT09IFN0b3JlZFF1ZXJpZXNTZXJ2aWNlLkZVTExURVhUKVxuICAgIH0pO1xuICAgIC8vIGV2ZXJ5IGZpZWxkIHRoYXQgaXMgcGFydCBvZiB0aGUgcGFyYW1zIGlzIHN1cHBvc2VkIHRvIGJlIGR5bmFtaWNcbiAgICBmb3JtRWxlbWVudC5fZHluYW1pYyA9ICEhbWF0Y2g7XG5cbiAgICAvLyBjcmVhdGUgYWN0dWFsIGZvcm0gY29udHJvbCB0aGF0IGNvdWxkIGJlIHVzZWQgd2l0aFxuICAgIC8vIEZvcm1FbGVtZW50Q29tcG9uZW50IHRvIHRoZW4gcmVuZGVyIGZvciBlbGVtZW50c1xuICAgIC8vIHdyYXBwZXIgbWF5IGJlIG51bGwgaW4gY2FzZSBvZiBhbiBlcnJvclxuICAgIHJldHVybiB0aGlzLmZvcm1IZWxwZXJTZXJ2aWNlLmVsZW1lbnRUb0Zvcm1Db250cm9sKGZvcm1FbGVtZW50LCAnU0VBUkNIJyk7XG4gIH1cblxuICBvblN0b3JlZFF1ZXJ5TG9hZGVkKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt7b3V0bGV0czoge21vZGFsOiAnc2VhcmNoJ319XSk7XG4gIH1cblxuICBvblN0b3JlZFF1ZXJ5RXhlY3V0ZShldnQpIHtcbiAgICBjb25zdCB1cmlQYXJhbSA9IGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShldnQucXVlcnlKc29uKSk7XG4gICAgY29uc3QgdXJpUGFyYW1RdWVyeTogTmF2aWdhdGlvbkV4dHJhcyA9IHtxdWVyeVBhcmFtczogeydxdWVyeSc6IHVyaVBhcmFtfX07XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvcmVzdWx0J10sIHVyaVBhcmFtUXVlcnkpO1xuICB9XG5cbiAgc2V0SWNvblRpdGxlcygpIHtcbiAgICB0aGlzLmljb25UaXRsZXMgPSB7XG4gICAgICBzaGFyZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc3RvcmVkcXVlcnkuc2hhcmUudGl0bGUnKSxcbiAgICAgIHNoYXJlZDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc3RvcmVkcXVlcnkuc2hhcmVkZm9yLnRpdGxlJyksXG4gICAgICBmYXZvcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc3RvcmVkcXVlcnkuZmF2b3IudGl0bGUnKSxcbiAgICAgIGZhdm9yZWQ6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnN0b3JlZHF1ZXJ5LmZhdm9yZWRmb3IudGl0bGUnKVxuICAgIH1cbiAgfVxuXG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZWxlY3Rpb24uZm9jdXMkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQkKSlcbiAgICAgIC5zdWJzY3JpYmUocSA9PiB7XG4gICAgICAgIHRoaXMucXVlcnkgPSBxO1xuICAgICAgfSk7XG4gICAgdGhpcy5zZXRJY29uVGl0bGVzKCk7XG4gIH1cblxuICB0cmFja0J5UU5hbWUoaW5kZXgsIGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS5xbmFtZTtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleCwgaXRlbSkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxufVxuIl19
496
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkLXF1ZXJ5LWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9lby1mcmFtZXdvcmsvc3RvcmVkLXF1ZXJ5L3N0b3JlZC1xdWVyeS1kZXRhaWxzL3N0b3JlZC1xdWVyeS1kZXRhaWxzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFhLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFRLFVBQVUsRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDekgsT0FBTyxFQUFtQixNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsV0FBVyxFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXZELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG9FQUFvRSxDQUFDO0FBQ3pHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUNoRixPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztBQUNyRixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFJakYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sd0RBQXdELENBQUM7QUFDeEYsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDbEYsT0FBTyxFQUVMLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsWUFBWSxFQUNaLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUViLFdBQVcsRUFFWCxLQUFLLEVBQ0wsYUFBYSxFQUVkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVDQUF1QyxDQUFD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LE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQztTQUNuRSxDQUFBO0lBQ0gsQ0FBQztJQUdELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07YUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUN6QyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJO1FBQ3RCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7O1lBamlCRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtnQkFDbkMsb2xOQUFvRDs7YUFFckQ7OztZQWxDeUIsTUFBTTtZQXdCOUIsYUFBYTtZQUhiLFdBQVc7WUFGWCxhQUFhO1lBVFAsZ0JBQWdCO1lBUGhCLHFCQUFxQjtZQVkzQixvQkFBb0I7WUFWZCx1QkFBdUI7WUFOMEMsVUFBVTtZQW1CakYsZ0JBQWdCOzs7OEJBeUJmLFNBQVMsU0FBQyxpQkFBaUI7b0JBa0IzQixLQUFLO3lCQUtMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3Rha2VVbnRpbCwgc3dpdGNoTWFwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBUeXBlLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TmF2aWdhdGlvbkV4dHJhcywgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtGb3JtQ29udHJvbCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtPYmplY3RGb3JtQ29udHJvbFdyYXBwZXJ9IGZyb20gJy4uLy4uL29iamVjdC1mb3JtL29iamVjdC1mb3JtL29iamVjdC1mb3JtLWNvbnRyb2wtd3JhcHBlcic7XG5pbXBvcnQge1BlbmRpbmdDaGFuZ2VzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vZW8tZnJhbWV3b3JrLWNvcmUvcGVuZGluZy1jaGFuZ2VzL3BlbmRpbmctY2hhbmdlcy5zZXJ2aWNlJztcbmltcG9ydCB7T2JqZWN0Rm9ybUdyb3VwfSBmcm9tICcuLi8uLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1ncm91cCc7XG5pbXBvcnQge09iamVjdEZvcm1IZWxwZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9vYmplY3QtZm9ybS9vYmplY3QtZm9ybS1oZWxwZXIuc2VydmljZSc7XG5pbXBvcnQge0xvY2FsZURhdGVQaXBlfSBmcm9tICcuLi8uLi8uLi9lby1mcmFtZXdvcmstY29yZS9waXBlcy9sb2NhbGUtZGF0ZS5waXBlJztcbmltcG9ydCB7T2JqZWN0Rm9ybUNvbnRyb2x9IGZyb20gJy4uLy4uL29iamVjdC1mb3JtL29iamVjdC1mb3JtL29iamVjdC1mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHtFZGl0Rm9ybSwgTm90aWZ5TGlzdCwgUmVzdHJpY3Rpb259IGZyb20gJy4uL3N0b3JlZC1xdWVyeS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtTdG9yZWRRdWVyeUNvbXBvbmVudH0gZnJvbSAnLi4vc3RvcmVkLXF1ZXJ5L3N0b3JlZC1xdWVyeS5jb21wb25lbnQnO1xuaW1wb3J0IHtTZWxlY3Rpb25TZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9lby1mcmFtZXdvcmstY29yZS9zZWxlY3Rpb24vc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtVbnN1YnNjcmliZU9uRGVzdHJveX0gZnJvbSAnLi4vLi4vdXRpbC91bnN1YnNjcmliZS91bnN1YnNjcmliZS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgSVN0b3JlZFF1ZXJ5UGFyYW0sXG4gIFN0b3JlZFF1ZXJ5LFxuICBTdG9yZWRRdWVyaWVzU2VydmljZSxcbiAgU2VhcmNoRmlsdGVyLFxuICBTZWFyY2hRdWVyeSxcbiAgVHJhbnNsYXRlU2VydmljZSxcbiAgU3lzdGVtU2VydmljZSxcbiAgUmFuZ2VWYWx1ZSxcbiAgVXNlclNlcnZpY2UsXG4gIE9yZ1JvbGUsXG4gIFV0aWxzLFxuICBTZWFyY2hTZXJ2aWNlLFxuICBRdWVyeVNjb3BlXG59IGZyb20gJ0Blby1zZGsvY29yZSc7XG5pbXBvcnQge1V0aWxpdGllc1NlcnZpY2V9IGZyb20gJy4uLy4uL3V0aWwvc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHtmb3JrSm9pbiwgb2YsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdlby1zdG9yZWQtcXVlcnktZGV0YWlscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdG9yZWQtcXVlcnktZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0b3JlZC1xdWVyeS1kZXRhaWxzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3RvcmVkUXVlcnlEZXRhaWxzQ29tcG9uZW50IGV4dGVuZHMgVW5zdWJzY3JpYmVPbkRlc3Ryb3kgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHByaXZhdGUgRk9STV9JTlBVVF9USVRMRSA9ICdzdG9yZWRRdWVyeVRpdGxlJztcbiAgcHJpdmF0ZSBGT1JNX0lOUFVUX0ZVTExURVhUID0gJ3N0b3JlZFF1ZXJ5RnVsbHRleHQnO1xuICBwcml2YXRlIEJBU0VfUEFSQU1TX0ZJRUxEUyA9IE9iamVjdC5rZXlzKFNlYXJjaFF1ZXJ5LkJBU0VfUEFSQU1TKS5tYXAoayA9PiBTZWFyY2hRdWVyeS5CQVNFX1BBUkFNU1trXSk7XG4gIHByaXZhdGUgZGF0ZVBpcGU6IExvY2FsZURhdGVQaXBlO1xuICBwcml2YXRlIHBlbmRpbmdUYXNrSWQ6IHN0cmluZztcblxuICBAVmlld0NoaWxkKCdzdG9yZWRRdWVyeUZvcm0nKSBzdG9yZWRRdWVyeUZvcm06IFN0b3JlZFF1ZXJ5Q29tcG9uZW50O1xuXG4gIGljb25UaXRsZXM6IGFueTtcbiAgc3RvcmVkUXVlcnk6IFN0b3JlZFF1ZXJ5O1xuICBxdWVyeVNjb3BlOiBRdWVyeVNjb3BlO1xuICBlZGl0Rm9ybTogRWRpdEZvcm07XG4gIHJlc3RyaWN0aW9uczogUmVzdHJpY3Rpb25bXTtcbiAgZWRpdGluZ1NoYXJlOiBib29sZWFuO1xuICBpc05ld1F1ZXJ5OiBib29sZWFuO1xuICBpc093blF1ZXJ5OiBib29sZWFuO1xuICBlbmFibGVTaGFyaW5nOiBib29sZWFuO1xuICBzeXN0ZW1Sb2xlczogT3JnUm9sZVtdO1xuICByb2xlc1BpY2tlciA9IHtcbiAgICB0aXRsZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc3RvcmVkcXVlcnkucm9sZXMnKSxcbiAgICBjb2Rlc3lzdGVtOiBudWxsLFxuICAgIHZhbHVlOiBudWxsXG4gIH07XG5cbiAgQElucHV0KClcbiAgc2V0IHF1ZXJ5KHE6IFN0b3JlZFF1ZXJ5KSB7XG4gICAgdGhpcy5zZXRRdWVyeShxKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBub3RpZnlMaXN0OiBFdmVudEVtaXR0ZXI8Tm90aWZ5TGlzdD4gPSBuZXcgRXZlbnRFbWl0dGVyPE5vdGlmeUxpc3Q+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzeXN0ZW1TZXJ2aWNlOiBTeXN0ZW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uOiBTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcGVuZGluZ0NoYW5nZXM6IFBlbmRpbmdDaGFuZ2VzU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JlZFF1ZXJpZXNTZXJ2aWNlOiBTdG9yZWRRdWVyaWVzU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1IZWxwZXJTZXJ2aWNlOiBPYmplY3RGb3JtSGVscGVyU2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1SZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5kYXRlUGlwZSA9IG5ldyBMb2NhbGVEYXRlUGlwZSh0cmFuc2xhdGUpO1xuICAgIHRoaXMuZmV0Y2hSb2xlcygpO1xuICB9XG5cbiAgcHVibGljIHNldFF1ZXJ5U2NvcGUoc2NvcGU6IFF1ZXJ5U2NvcGUpIHtcbiAgICB0aGlzLnN0b3JlZFF1ZXJ5LnNjb3BlID0gc2NvcGU7XG4gICAgdGhpcy5xdWVyeVNjb3BlID0gc2NvcGU7XG4gIH1cblxuICBzZXRRdWVyeShxOiBTdG9yZWRRdWVyeSkge1xuICAgIHRoaXMuZWRpdGluZ1NoYXJlID0gZmFsc2U7XG4gICAgdGhpcy5yZXNldEVkaXRGb3JtKCk7XG4gICAgLy8gZ3JhYiBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBxdWVyeVxuICAgIHRoaXMuc3RvcmVkUXVlcnkgPSBxO1xuICAgIGlmIChxIGluc3RhbmNlb2YgU3RvcmVkUXVlcnkpIHtcbiAgICAgIHRoaXMucXVlcnlTY29wZSA9IHEuc2NvcGU7XG4gICAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyU2VydmljZS5nZXRDdXJyZW50VXNlcigpO1xuICAgICAgdGhpcy5pc05ld1F1ZXJ5ID0gcS5pc05ldygpO1xuICAgICAgdGhpcy5pc093blF1ZXJ5ID0gdGhpcy5pc05ld1F1ZXJ5IHx8IHEudXNlci50b0xvd2VyQ2FzZSgpID09PSB1c2VyLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHRoaXMucmVzdHJpY3Rpb25zID0gdGhpcy5nZXRSZXN0cmljdGlvbnMoKTtcbiAgICAgIHRoaXMucm9sZXNQaWNrZXIudmFsdWUgPSBxLnJvbGVzO1xuICAgICAgdGhpcy5lbmFibGVTaGFyaW5nID0gdXNlci5oYXNQcml2aWxlZ2UoJ1NIQVJFX1NUT1JFRF9RVUVSSUVTJykgJiYgdGhpcy5pc093blF1ZXJ5ICYmICF0aGlzLmlzTmV3UXVlcnk7XG5cbiAgICAgIGlmIChxLmlzTmV3KCkpIHtcbiAgICAgICAgdGhpcy5zdG9yZWRRdWVyeS5uYW1lID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc2VhcmNoLnN0b3JlZHF1ZXJpZXMubmV3LnRpdGxlJyk7XG4gICAgICAgIHRoaXMuZWRpdCgpO1xuICAgICAgICB0aGlzLnN0YXJ0UGVuZGluZygpO1xuICAgICAgICB0aGlzLm5vdGlmeUxpc3QuZW1pdCh7dW5zZWxlY3Q6IHRydWUsIHVwZGF0ZTogZmFsc2V9KTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbGVtUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW25hbWU9XCJzdG9yZWRRdWVyeVRpdGxlXCJdJykuZm9jdXMoKVxuICAgICAgICB9LDUwMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFBlbmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnBlbmRpbmdDaGFuZ2VzLmhhc1BlbmRpbmdUYXNrKHRoaXMucGVuZGluZ1Rhc2tJZCB8fCAnICcpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdUYXNrSWQgPSB0aGlzLnBlbmRpbmdDaGFuZ2VzLnN0YXJ0VGFzaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoUGVuZGluZygpIHtcbiAgICB0aGlzLnBlbmRpbmdDaGFuZ2VzLmZpbmlzaFRhc2sodGhpcy5wZW5kaW5nVGFza0lkKTtcbiAgfVxuXG4gIGVkaXQoKSB7XG4gICAgaWYgKCF0aGlzLmVkaXRGb3JtLmZvcm0pIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRGb3JtKCk7XG4gICAgICAgIHRoaXMubm90aWZ5TGlzdC5lbWl0KHt1bnNlbGVjdDogZmFsc2UsIHVwZGF0ZTogdHJ1ZX0pO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgb25Gb3JtU3RhdHVzQ2hhbmdlZChmb3JtU3RhdGUpIHtcbiAgICBmb3JtU3RhdGUuZGlydHkgPyB0aGlzLnN0YXJ0UGVuZGluZygpIDogdGhpcy5maW5pc2hQZW5kaW5nKCk7XG4gIH1cblxuICB0b2dnbGVTaGFyZUVkaXQoKSB7XG4gICAgdGhpcy5lZGl0aW5nU2hhcmUgPSAhdGhpcy5lZGl0aW5nU2hhcmU7XG4gIH1cblxuICBzaGFyZSgpIHtcbiAgICB0aGlzLnN0b3JlZFF1ZXJ5LnJvbGVzID0gdGhpcy5yb2xlc1BpY2tlci52YWx1ZTtcbiAgICB0aGlzLnN0b3JlZFF1ZXJpZXNTZXJ2aWNlLnNhdmVTdG9yZWRRdWVyeSh0aGlzLnN0b3JlZFF1ZXJ5KS5zdWJzY3JpYmUoXG4gICAgICBfID0+IHtcbiAgICAgIH0sIFV0aWxzLnRocm93KG51bGwsIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnNlYXJjaC5zdG9yZWRxdWVyeS5zYXZlLmVycm9yJykpXG4gICAgKTtcbiAgICB0aGlzLmVkaXRpbmdTaGFyZSA9IGZhbHNlO1xuICB9XG5cbiAgY2FuY2VsU2hhcmUoKSB7XG4gICAgdGhpcy5yb2xlc1BpY2tlci52YWx1ZSA9IHRoaXMuc3RvcmVkUXVlcnkucm9sZXM7XG4gICAgdGhpcy5lZGl0aW5nU2hhcmUgPSBmYWxzZTtcbiAgfVxuXG4gIGRlbGV0ZSgpIHtcbiAgICB0aGlzLnN0b3JlZFF1ZXJpZXNTZXJ2aWNlXG4gICAgICAucmVtb3ZlU3RvcmVkUXVlcnkodGhpcy5zdG9yZWRRdWVyeS5pZClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ub3RpZnlMaXN0LmVtaXQoe3Vuc2VsZWN0OiBmYWxzZSwgdXBkYXRlOiBmYWxzZX0pO1xuICAgICAgfSwgVXRpbHMudGhyb3cobnVsbCwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc2VhcmNoLnN0b3JlZHF1ZXJ5LmRlbGV0ZS5lcnJvcicpKSk7XG4gIH1cblxuICB0b2dnbGVGYXZvcml0ZVN0YXRlKCkge1xuICAgIHRoaXMuc3RvcmVkUXVlcnkuZmF2b3JpdGUgPSAhdGhpcy5zdG9yZWRRdWVyeS5mYXZvcml0ZTtcbiAgICB0aGlzLnN0b3JlZFF1ZXJpZXNTZXJ2aWNlXG4gICAgICAuc2F2ZVN0b3JlZFF1ZXJ5KHRoaXMuc3RvcmVkUXVlcnkpXG4gICAgICAuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgfSwgVXRpbHMudGhyb3cobnVsbCwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc2VhcmNoLnN0b3JlZHF1ZXJ5LnNhdmUuZXJyb3InKSkpO1xuICB9XG5cbiAgY2FuY2VsRWRpdCgpIHtcbiAgICB0aGlzLnJlc2V0RWRpdEZvcm0oKTtcbiAgICB0aGlzLmZpbmlzaFBlbmRpbmcoKTtcbiAgICBpZiAodGhpcy5zdG9yZWRRdWVyeS5pc05ldygpKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5ub3RpZnlMaXN0LmVtaXQoe3Vuc2VsZWN0OiBmYWxzZSwgdXBkYXRlOiBmYWxzZSwgcGF5bG9hZDogdGhpcy5zdG9yZWRRdWVyeX0pO1xuICB9XG5cbiAgc2V0UXVlcnlUb0FwcFNlYXJjaCgpIHtcbiAgICB0aGlzLnN0b3JlZFF1ZXJ5Rm9ybS5sb2FkKCk7XG4gIH1cblxuICBleGVjdXRlUXVlcnkoKSB7XG4gICAgdGhpcy5zdG9yZWRRdWVyeUZvcm0uZXhlY3V0ZSgpO1xuICB9XG5cbiAgLy8gU2F2ZSB0aGUgY3VycmVudCBzdG9yZWQgcXVlcnlcbiAgdXBkYXRlU3RvcmVkUXVlcnkoKSB7XG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuZ2V0Rm9ybURhdGEoKTtcbiAgICB0aGlzLnN0b3JlZFF1ZXJ5LmZpbHRlcnMgPSB0aGlzLnN0b3JlZFF1ZXJ5LmZpbHRlcnMuZmlsdGVyKGYgPT4gfnRoaXMuQkFTRV9QQVJBTVNfRklFTERTLmluZGV4T2YoZi5wcm9wZXJ0eSkpO1xuICAgIE9iamVjdC5rZXlzKGZvcm1EYXRhKVxuICAgICAgLmZvckVhY2goayA9PiB7XG4gICAgICAgIGlmIChrID09PSB0aGlzLkZPUk1fSU5QVVRfVElUTEUpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlZFF1ZXJ5Lm5hbWUgPSBmb3JtRGF0YVtrXTtcbiAgICAgICAgfSBlbHNlIGlmIChrID09PSB0aGlzLkZPUk1fSU5QVVRfRlVMTFRFWFQpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlZFF1ZXJ5LnRlcm0gPSBmb3JtRGF0YVtrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZmlsdGVyczogU2VhcmNoRmlsdGVyW10gPSB0aGlzLnNlYXJjaFNlcnZpY2UuZ2V0U2VhcmNoRmlsdGVyKHRoaXMuc3RvcmVkUXVlcnkudHlwZXMsIGssIGZvcm1EYXRhW2tdKTtcbiAgICAgICAgICBmaWx0ZXJzLmZvckVhY2goZiA9PiB0aGlzLnN0b3JlZFF1ZXJ5LmFkZEZpbHRlcihmKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zdG9yZWRRdWVyaWVzU2VydmljZVxuICAgICAgLnNhdmVTdG9yZWRRdWVyeSh0aGlzLnN0b3JlZFF1ZXJ5KVxuICAgICAgLnN1YnNjcmliZSh1cGRhdGVkU3RvcmVkUXVlcnkgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gdXBkYXRlZFN0b3JlZFF1ZXJ5O1xuICAgICAgICB0aGlzLnJlc2V0RWRpdEZvcm0oKTtcbiAgICAgICAgdGhpcy5maW5pc2hQZW5kaW5nKCk7XG4gICAgICAgIHRoaXMubm90aWZ5TGlzdC5lbWl0KHt1bnNlbGVjdDogZmFsc2UsIHVwZGF0ZTogZmFsc2UsIHBheWxvYWQ6IHVwZGF0ZWRTdG9yZWRRdWVyeX0pO1xuICAgICAgfSwgVXRpbHMudGhyb3cobnVsbCwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc2VhcmNoLnN0b3JlZHF1ZXJ5LnNhdmUuZXJyb3InKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBmb3JtIGVsZW1lbnRzIHRvIGJlIGEgZHluYW1pYyBwYXJhbWV0ZXIgb3Igbm90XG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgcGFyYW1ldGVyQ2hhbmdlZChldmVudDoge2NvbnRyb2w6IHN0cmluZywgdmFsdWU6IGJvb2xlYW59KSB7XG5cbiAgICBsZXQgbSA9IHRoaXMuc3RvcmVkUXVlcnkucGFyYW1ldGVyLmZpbmQocCA9PiBwLnFuYW1lID09PSBldmVudC5jb250cm9sKTtcbiAgICBpZiAobSAmJiAhZXZlbnQudmFsdWUpIHtcbiAgICAgIC8vIHJlbW92ZSBleGlzdGluZyBwYXJhbWV0ZXJcbiAgICAgIHRoaXMuc3RvcmVkUXVlcnkucGFyYW1ldGVyID0gdGhpcy5zdG9yZWRRdWVyeS5wYXJhbWV0ZXIuZmlsdGVyKHAgPT4gcC5xbmFtZSAhPT0gZXZlbnQuY29udHJvbCk7XG4gICAgfSBlbHNlIGlmICghbSAmJiBldmVudC52YWx1ZSkge1xuICAgICAgLy8gYWRkIHBhcmFtZXRlciBlbGVtZW50XG4gICAgICBsZXQgcGFyYW0gPSB0aGlzLmZvcm1GaWVsZFRvUGFyYW1ldGVyKGV2ZW50LmNvbnRyb2wpO1xuICAgICAgaWYgKHBhcmFtKSB7XG4gICAgICAgIHRoaXMuc3RvcmVkUXVlcnkucGFyYW1ldGVyLnB1c2gocGFyYW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybURhdGEoKSB7XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXModGhpcy5lZGl0Rm9ybS5mb3JtLnZhbHVlKTtcbiAgICBsZXQgZGF0YSA9IHt9O1xuXG5cbiAgICBwcm9wZXJ0aWVzLmZvckVhY2gocHJvcGVydHkgPT4ge1xuXG4gICAgICBjb25zdCBmYzogT2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyID0gdGhpcy5lZGl0Rm9ybS5mb3JtLmNvbnRyb2xzW3Byb3BlcnR5XSBhcyBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXI7XG4gICAgICBsZXQgZm9ybUVsZW1lbnQ7XG4gICAgICBpZiAoZmMuY29udHJvbHMgJiYgZmMuY29udHJvbHNbcHJvcGVydHldKSB7XG4gICAgICAgIGNvbnN0IGZlOiBPYmplY3RGb3JtQ29udHJvbCA9IGZjLmNvbnRyb2xzW3Byb3BlcnR5XSBhcyBPYmplY3RGb3JtQ29udHJvbDtcbiAgICAgICAgZm9ybUVsZW1lbnQgPSBmZS5fZW9Gb3JtRWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtRWxlbWVudCAmJiBmb3JtRWxlbWVudC5pc05vdFNldFZhbHVlKSB7XG4gICAgICAgIGRhdGFbcHJvcGVydHldID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgICAgICAgIGNhc2UgdGhpcy5GT1JNX0lOUFVUX1RJVExFOiB7XG4gICAgICAgICAgICBkYXRhW3Byb3BlcnR5XSA9IHRoaXMuZWRpdEZvcm0uZm9ybS52YWx1ZVtwcm9wZXJ0eV0gfHwgJyc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSB0aGlzLkZPUk1fSU5QVVRfRlVMTFRFWFQ6IHtcbiAgICAgICAgICAgIGRhdGFbcHJvcGVydHldID0gdGhpcy5lZGl0Rm9ybS5mb3JtLnZhbHVlW3Byb3BlcnR5XVtTdG9yZWRRdWVyaWVzU2VydmljZS5GVUxMVEVYVF0gfHwgJyc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuZWRpdEZvcm0uZm9ybS52YWx1ZVtwcm9wZXJ0eV1bcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKCFVdGlsaXRpZXNTZXJ2aWNlLmlzRW1wdHkodikpIHtcbiAgICAgICAgICAgICAgZGF0YVtwcm9wZXJ0eV0gPSB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGR5bmFtaWMgc3RvcmVkIHF1ZXJ5IHBhcmFtZXRlciBmb3IgYSBmb3JtIGVsZW1lbnRcbiAgICogQHBhcmFtIHFuYW1lIFRoZSBmb3JtIGVsZW1lbnRzIHFuYW1lXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGZvcm1GaWVsZFRvUGFyYW1ldGVyKHFuYW1lOiBzdHJpbmcpOiBJU3RvcmVkUXVlcnlQYXJhbSB7XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHBhcmFtOiBJU3RvcmVkUXVlcnlQYXJhbTtcbiAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGZ1bGx0ZXh0IGZpZWxkc1xuICAgICAgaWYgKHFuYW1lID09PSBTdG9yZWRRdWVyaWVzU2VydmljZS5GVUxMVEVYVCkge1xuICAgICAgICBwYXJhbSA9IHtcbiAgICAgICAgICBxbmFtZTogcW5hbWUsXG4gICAgICAgICAgdHlwZTogcW5hbWUsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmYyA9ICgodGhpcy5lZGl0Rm9ybS5mb3JtLmNvbnRyb2xzW3FuYW1lXSBhcyBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIpLmNvbnRyb2xzW3FuYW1lXSBhcyBPYmplY3RGb3JtQ29udHJvbCk7XG4gICAgICAgIGNvbnN0IGZlID0gZmMuX2VvRm9ybUVsZW1lbnQ7XG4gICAgICAgIHBhcmFtID0ge1xuICAgICAgICAgIHFuYW1lOiBmZS5xbmFtZSxcbiAgICAgICAgICB0eXBlOiBmZS50eXBlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEVkaXRGb3JtKCkge1xuICAgIHRoaXMuZWRpdEZvcm0gPSB7XG4gICAgICBmb3JtOiBudWxsLFxuICAgICAgZnVsbHRleHRGb3JtQ29udHJvbDogbnVsbCxcbiAgICAgIGNvbnRyb2xzOiBbXSxcbiAgICAgIGNvbnRleHRDb250cm9sczogW11cbiAgICB9O1xuICB9XG5cbiAgb25Gb3JtQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtXG4gICAgICAuZm9ybVxuICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVN0YXR1c0NoYW5nZWQodGhpcy5lZGl0Rm9ybS5mb3JtKSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVkaXRGb3JtKCkge1xuXG4gICAgdGhpcy5yZXNldEVkaXRGb3JtKCk7XG4gICAgdGhpcy5zZXR1cEZvcm1Db250cm9scygpLnN1YnNjcmliZShfID0+IHtcblxuICAgICAgbGV0IGZvcm0gPSBuZXcgT2JqZWN0Rm9ybUdyb3VwKHt9KTtcbiAgICAgIGxldCBmY1RpdGxlID0gbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgIGZjVGl0bGUuc2V0VmFsdWUodGhpcy5zdG9yZWRRdWVyeS5uYW1lKTtcblxuICAgICAgbGV0IGZjRnVsbHRleHQgPSB0aGlzLnRvRm9ybUNvbnRyb2wodGhpcy5zdG9yZWRRdWVyaWVzU2VydmljZS5nZXRGdWxsdGV4dEZvcm1FbGVtZW50KFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlby5zdG9yZWRxdWVyeS5zZWFyY2gudGVybScpLFxuICAgICAgICB0aGlzLnN0b3JlZFF1ZXJ5LnRlcm1cbiAgICAgICkpO1xuICAgICAgdGhpcy5lZGl0Rm9ybS5mdWxsdGV4dEZvcm1Db250cm9sID0gZmNGdWxsdGV4dDtcblxuICAgICAgLy8gYWRkIHRpdGxlIGFuZCBmdWxsdGV4dCBmaWVsZFxuICAgICAgZm9ybS5hZGRDb250cm9sKHRoaXMuRk9STV9JTlBVVF9USVRMRSwgZmNUaXRsZSk7XG4gICAgICBmb3JtLmFkZENvbnRyb2wodGhpcy5GT1JNX0lOUFVUX0ZVTExURVhULCBmY0Z1bGx0ZXh0KTtcblxuICAgICAgaWYgKHRoaXMuZWRpdEZvcm0uY29udHJvbHMubGVuZ3RoIHx8IHRoaXMuZWRpdEZvcm0uY29udGV4dENvbnRyb2xzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmVkaXRGb3JtLmNvbnRyb2xzXG4gICAgICAgICAgLmZvckVhY2goKGMpID0+IGZvcm0uYWRkQ29udHJvbChjLl9lb0Zvcm1Db250cm9sV3JhcHBlci5jb250cm9sTmFtZSwgYykpO1xuICAgICAgICB0aGlzLmVkaXRGb3JtLmNvbnRleHRDb250cm9sc1xuICAgICAgICAgIC5mb3JFYWNoKChjKSA9PiBmb3JtLmFkZENvbnRyb2woYy5fZW9Gb3JtQ29udHJvbFdyYXBwZXIuY29udHJvbE5hbWUsIGMpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lZGl0Rm9ybS5mb3JtID0gZm9ybTtcbiAgICAgIHRoaXMub25Gb3JtQ2hhbmdlcygpO1xuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHNldHVwRm9ybUNvbnRyb2xzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgdGFza3MgPSBbXTtcbiAgICAvLyBzZXR0aW5nIHVwIG9iamVjdCB0eXBlIGZvcm0gb25seSBtYWtlcyBzZW5zZSB3aXRoIG9uZSB0YXJnZXQgdHlwZVxuICAgIGlmICh0aGlzLnN0b3JlZFF1ZXJ5LnR5cGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGFza3MucHVzaCh0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0Rm9ybUVsZW1lbnRzRnJvbUZvcm1Nb2RlbCh0aGlzLnN0b3JlZFF1ZXJ5LnR5cGVzWzBdLnFuYW1lLCAnU0VBUkNIJykucGlwZShcbiAgICAgICAgdGFwKChlbGVtZW50czogYW55W10pID0+IHtcbiAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgLy8gcHJldmVudCB0YWJsZXMgYW5kIGJpbmFyeSB0eXBlcyBmcm9tIGJlaW5nIHJlbmRlcmVkIGluIHRoZSBzdG9yZWQgcXVlcnkgZm9ybVxuICAgICAgICAgICAgaWYgKGUudHlwZSAhPT0gJ0JJTkFSWScpIHtcbiAgICAgICAgICAgICAgaWYgKGUucmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBlLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICBlLnJlYWRvbmx5ID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZmMgPSB0aGlzLnRvRm9ybUNvbnRyb2woZSk7XG4gICAgICAgICAgICAgIGlmIChmYykge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdEZvcm0uY29udHJvbHMucHVzaChmYyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgKSlcbiAgICB9XG4gICAgLy8gYWRkIGNvbnRleHQgZm9ybSBjb250cm9scyBhcyB3ZWxsXG4gICAgaWYgKHRoaXMuc3RvcmVkUXVlcnkuY29udGV4dEZvbGRlclR5cGVzLmxlbmd0aCkge1xuICAgICAgdGFza3MucHVzaCh0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0Rm9ybUVsZW1lbnRzRnJvbUZvcm1Nb2RlbCh0aGlzLnN0b3JlZFF1ZXJ5LmNvbnRleHRGb2xkZXJUeXBlc1swXS5xbmFtZSwgJ1NFQVJDSCcsIHRydWUpLnBpcGUoXG4gICAgICAgIHRhcCgoZWxlbWVudHM6IGFueVtdKSA9PiB7XG4gICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZjID0gdGhpcy50b0Zvcm1Db250cm9sKGUpO1xuICAgICAgICAgICAgaWYgKGZjKSB7XG4gICAgICAgICAgICAgIHRoaXMuZWRpdEZvcm0uY29udGV4dENvbnRyb2xzLnB1c2goZmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICApKVxuICAgIH1cblxuICAgIHJldHVybiB0YXNrcy5sZW5ndGggPyBmb3JrSm9pbih0YXNrcykgOiBvZih0YXNrcyk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoUm9sZXMoKSB7XG4gICAgaWYgKCF0aGlzLnN5c3RlbVJvbGVzIHx8IHRoaXMuc3lzdGVtUm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN5c3RlbVNlcnZpY2VcbiAgICAgICAgLmdldFJvbGVzKClcbiAgICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgIHRoaXMuc3lzdGVtUm9sZXMgPSByZXM7XG4gICAgICAgICAgdGhpcy5yb2xlc1BpY2tlci5jb2Rlc3lzdGVtID0ge1xuICAgICAgICAgICAgZW50cmllczogdGhpcy5zeXN0ZW1Sb2xlcy5tYXAocm9sZSA9PiAoe1xuICAgICAgICAgICAgICBpZDogcm9sZS5pZCxcbiAgICAgICAgICAgICAgbGFiZWw6IHJvbGUubmFtZSxcbiAgICAgICAgICAgICAgZGVmYXVsdHJlcHJlc2VudGF0aW9uOiByb2xlLm5hbWUsXG4gICAgICAgICAgICAgIGRhdGE6IHJvbGUubmFtZVxuICAgICAgICAgICAgfSkpLnNvcnQoVXRpbHMuc29ydFZhbHVlcygnbGFiZWwnKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGdldFJlc3RyaWN0aW9ucygpOiBSZXN0cmljdGlvbltdIHtcbiAgICBsZXQgcmVzdHJpY3Rpb25zOiBSZXN0cmljdGlvbltdID0gW107XG5cbiAgICAvLyB0eXBlIHJlc3RyaWN0aW9uXG4gICAgaWYgKHRoaXMuc3RvcmVkUXVlcnkudHlwZXMgJiYgdGhpcy5zdG9yZWRRdWVyeS50eXBlcy5sZW5ndGgpIHtcbiAgICAgIHJlc3RyaWN0aW9ucy5wdXNoKHtcbiAgICAgICAgZmllbGQ6IFNlYXJjaFF1ZXJ5LkJBU0VfUEFSQU1TLlRZUEUsXG4gICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlby5zdG9yZWRxdWVyeS5yZXN0cmljdGlvbi50eXBlJyksXG4gICAgICAgIGl0ZW1zOiB0aGlzLnN0b3JlZFF1ZXJ5LnR5cGVzLm1hcCh0ID0+IHQubGFiZWwpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYmFzZSBwYXJhbXMgcmVzdHJpY3Rpb25zXG4gICAgKHRoaXMuc3RvcmVkUXVlcnkuZmlsdGVycyB8fCBbXSkuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgaWYgKGZpbHRlciAmJiB+dGhpcy5CQVNFX1BBUkFNU19GSUVMRFMuaW5kZXhPZihmaWx0ZXIucHJvcGVydHkpKSB7XG5cbiAgICAgICAgY29uc3QgZmllbGQgPSBmaWx0ZXIucHJvcGVydHk7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc3RvcmVkcXVlcnkucmVzdHJpY3Rpb24uJyArIGZpZWxkKTtcblxuICAgICAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICAgICAgY2FzZSBTZWFyY2hRdWVyeS5CQVNFX1BBUkFNUy5NSU1FVFlQRUdST1VQOlxuICAgICAgICAgICAgcmVzdHJpY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICBmaWVsZCwgbGFiZWwsIGl0ZW1zOiBBcnJheS5pc0FycmF5KGZpbHRlci5maXJzdFZhbHVlKSA/IGZpbHRlci5maXJzdFZhbHVlIDogW2ZpbHRlci5maXJzdFZhbHVlXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFNlYXJjaFF1ZXJ5LkJBU0VfUEFSQU1TLkZJTEVOQU1FOlxuICAgICAgICAgICAgcmVzdHJpY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICBmaWVsZCwgbGFiZWwsIGl0ZW1zOiBbZmlsdGVyLmZpcnN0VmFsdWVdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgU2VhcmNoUXVlcnkuQkFTRV9QQVJBTVMuRklMRVNJWkU6XG4gICAgICAgICAgICByZXN0cmljdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIGZpZWxkLCBsYWJlbCwgaXRlbXM6IFt0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlby5zZWFyY2guYWdnLmZpbGVzaXplLicgKyBmaWx0ZXIuZmlyc3RWYWx1ZSldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgU2VhcmNoUXVlcnkuQkFTRV9QQVJBTVMuQ1JFQVRFRDpcbiAgICAgICAgICBjYXNlIFNlYXJjaFF1ZXJ5LkJBU0VfUEFSQU1TLk1PRElGSUVEOlxuICAgICAgICAgICAgcmVzdHJpY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICBmaWVsZCwgbGFiZWwsIGl0ZW1zOiBbdGhpcy5jcmVhdGVEYXRlUmVzdHJpY3Rpb24oZmlsdGVyKV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBTZWFyY2hRdWVyeS5CQVNFX1BBUkFNUy5DUkVBVE9SOlxuICAgICAgICAgIGNhc2UgU2VhcmNoUXVlcnkuQkFTRV9QQVJBTVMuTU9ESUZJRVI6XG4gICAgICAgICAgICB0aGlzLnN5c3RlbVNlcnZpY2UuZ2V0T3JnYW5pemF0aW9uT2JqZWN0cyhmaWx0ZXIuZmlyc3RWYWx1ZSlcbiAgICAgICAgICAgICAgLnN1YnNjcmliZShvcmdVc2VycyA9PiByZXN0cmljdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmllbGQsIGxhYmVsLCBpdGVtczogb3JnVXNlcnMubWFwKHUgPT4gdS50aXRsZSlcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3RyaWN0aW9ucztcbiAgfVxuXG4gIGNyZWF0ZURhdGVSZXN0cmljdGlvbihmaWx0ZXI6IFNlYXJjaEZpbHRlcikge1xuICAgIHN3aXRjaCAoZmlsdGVyLm9wZXJhdG9yKSB7XG4gICAgICBjYXNlIFNlYXJjaEZpbHRlci5PUEVSQVRPUi5SQU5HRTpcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYGVvLnNlYXJjaC5hZ2cudGltZS4ke2ZpbHRlci5maXJzdFZhbHVlfWApO1xuICAgICAgY2FzZSBTZWFyY2hGaWx0ZXIuT1BFUkFUT1IuRVFVQUw6XG4gICAgICAgIHJldHVybiBgPSAke3RoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpbHRlci5maXJzdFZhbHVlLCAnZW9TaG9ydERhdGUnKX1gO1xuICAgICAgY2FzZSBTZWFyY2hGaWx0ZXIuT1BFUkFUT1IuSU5URVJWQUxfSU5DTFVERV9CT1RIOlxuICAgICAgICByZXR1cm4gYCR7dGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmlsdGVyLmZpcnN0VmFsdWUsICdlb1Nob3J0RGF0ZScpfSAtICR7dGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmlsdGVyLnNlY29uZFZhbHVlLCAnZW9TaG9ydERhdGUnKX1gO1xuICAgICAgY2FzZSBTZWFyY2hGaWx0ZXIuT1BFUkFUT1IuR1JFQVRFUl9PUl9FUVVBTDpcbiAgICAgICAgcmV0dXJuIGAke3RoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnNlYXJjaC5hZ2cudGltZS5zcGFuLnNpbmNlJyl9ICR7dGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmlsdGVyLmZpcnN0VmFsdWUsICdlb1Nob3J0RGF0ZScpfWA7XG4gICAgICBjYXNlIFNlYXJjaEZpbHRlci5PUEVSQVRPUi5MRVNTX09SX0VRVUFMOlxuICAgICAgICByZXR1cm4gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZW8uc2VhcmNoLmFnZy50aW1lLnNwYW4udW50aWwnKX0gJHt0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWx0ZXIuZmlyc3RWYWx1ZSwgJ2VvU2hvcnREYXRlJyl9YDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgKCR7ZmlsdGVyLm9wZXJhdG9yfSkgJHt0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWx0ZXIuZmlyc3RWYWx1ZSwgJ2VvU2hvcnREYXRlJyl9YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGZvcm0gY29udHJvbCBmcm9tIGEgZ2l2ZW4gZm9ybSBlbGVtZW50XG4gICAqIEBwYXJhbSBmb3JtRWxlbWVudFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJpdmF0ZSB0b0Zvcm1Db250cm9sKGZvcm1FbGVtZW50KTogT2JqZWN0Rm9ybUNvbnRyb2xXcmFwcGVyIHtcblxuICAgIC8vIHRoZSBgbmFtZWAgcHJvcGVydHkgb2Ygc3RvcmVkIHF1ZXJ5IGZvcm0gZWxlbWVudCBoYXMgdG8gYmUgYHFuYW1lYCBvZiBmb3JtIGVsZW1lbnQsXG4gICAgLy8gYmVjYXVzZSB3ZSBtYXkgY29tYmluZSBtdWx0aXBsZSBmb3JtcyAoY29udGV4dCBmb3JtKSBhbmQgaW4gdGhpcyBjYXNlIHRoZXJlIG1heVxuICAgIC8vIGJlIGNvbmZsaWN0cyBpbiBuYW1pbmdzXG4gICAgZm9ybUVsZW1lbnQubmFtZSA9IGZvcm1FbGVtZW50LnFuYW1lO1xuXG4gICAgaWYgKGZvcm1FbGVtZW50LnR5cGUgPT09ICdUQUJMRScpIHtcbiAgICAgIGxldCBmaWx0ZXJzID0gdGhpcy5zdG9yZWRRdWVyeS5nZXRUYWJsZUZpbHRlcnMoZm9ybUVsZW1lbnQucW5hbWUpO1xuICAgICAgaWYgKGZpbHRlcnMgJiYgZmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgZm9ybUVsZW1lbnQudmFsdWUgPSB0aGlzLnNlYXJjaFNlcnZpY2UudGFibGVGaWx0ZXJzVG9FbGVtZW50VmFsdWUoZmlsdGVycywgZm9ybUVsZW1lbnQuZWxlbWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybUVsZW1lbnQudmFsdWUgPSBbe31dO1xuICAgICAgICBkZWxldGUgZm9ybUVsZW1lbnQuaXNOb3RTZXRWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZ3JhYiB2YWx1ZSBmb3IgdGhlIGNvbnRyb2wgZnJvbSBjb3JyZXNwb25kaW5nIHF1ZXJ5IGZpbHRlcnNcbiAgICAgIGxldCBmaWx0ZXIgPSB0aGlzLnN0b3JlZFF1ZXJ5LmdldEZpbHRlcihmb3JtRWxlbWVudC5xbmFtZSk7XG4gICAgICAvLyB3ZSBtYXkgaGF2ZSBwYXJhbXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHF1ZXJpZXMgZmlsdGVycy4gVGhpcyBtYXkgYmUgdGhlXG4gICAgICAvLyBjYXNlIHdoZW4gd2UgbWFyayBmb3JtIGVsZW1lbnRzIGFzIGR5bmFtaWMgZmllbGRzIHdpdGhvdXQgcHJvdmlkaW5nIGEgdmFsdWVcbiAgICAgIGlmIChmaWx0ZXIpIHtcblxuICAgICAgICAvLyBmaWx0ZXIgdG8gaGF2ZSBubyB2YWx1ZVxuICAgICAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBTZWFyY2hGaWx0ZXIuT1BFUkFUT1IuRVFVQUwgJiYgZmlsdGVyLmZpcnN0VmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBmb3JtRWxlbWVudC5pc05vdFNldFZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZm9ybUVsZW1lbnQuaXNOb3RTZXRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1FbGVtZW50LnZhbHVlID0gdGhpcy5zZWFyY2hTZXJ2aWNlLmZpbHRlclRvRWxlbWVudFZhbHVlKFxuICAgICAgICAgIHRoaXMuc3RvcmVkUXVlcnkuZ2V0RmlsdGVyKGZvcm1FbGVtZW50LnFuYW1lKSxcbiAgICAgICAgICBmb3JtRWxlbWVudC50eXBlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGZvcm1FbGVtZW50LnFuYW1lICE9PSBTdG9yZWRRdWVyaWVzU2VydmljZS5GVUxMVEVYVCkge1xuICAgICAgICBmb3JtRWxlbWVudC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZGVsZXRlIGZvcm1FbGVtZW50LmlzTm90U2V0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHN5bmMgd2l0aCBwYXJhbXNcbiAgICBjb25zdCBtYXRjaDogYW55ID0gdGhpcy5zdG9yZWRRdWVyeS5wYXJhbWV0ZXIuZmluZChwYXJhbSA9PiB7XG4gICAgICByZXR1cm4gKHBhcmFtLnFuYW1lID09PSBmb3JtRWxlbWVudC5xbmFtZSkgfHwgKHBhcmFtLnR5cGUgPT09IFN0b3JlZFF1ZXJpZXNTZXJ2aWNlLkZVTExURVhUICYmIGZvcm1FbGVtZW50LnFuYW1lID09PSBTdG9yZWRRdWVyaWVzU2VydmljZS5GVUxMVEVYVClcbiAgICB9KTtcbiAgICAvLyBldmVyeSBmaWVsZCB0aGF0IGlzIHBhcnQgb2YgdGhlIHBhcmFtcyBpcyBzdXBwb3NlZCB0byBiZSBkeW5hbWljXG4gICAgZm9ybUVsZW1lbnQuX2R5bmFtaWMgPSAhIW1hdGNoO1xuXG4gICAgLy8gY3JlYXRlIGFjdHVhbCBmb3JtIGNvbnRyb2wgdGhhdCBjb3VsZCBiZSB1c2VkIHdpdGhcbiAgICAvLyBGb3JtRWxlbWVudENvbXBvbmVudCB0byB0aGVuIHJlbmRlciBmb3IgZWxlbWVudHNcbiAgICAvLyB3cmFwcGVyIG1heSBiZSBudWxsIGluIGNhc2Ugb2YgYW4gZXJyb3JcbiAgICByZXR1cm4gdGhpcy5mb3JtSGVscGVyU2VydmljZS5lbGVtZW50VG9Gb3JtQ29udHJvbChmb3JtRWxlbWVudCwgJ1NFQVJDSCcpO1xuICB9XG5cbiAgb25TdG9yZWRRdWVyeUxvYWRlZCgpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbe291dGxldHM6IHttb2RhbDogJ3NlYXJjaCd9fV0pO1xuICB9XG5cbiAgb25TdG9yZWRRdWVyeUV4ZWN1dGUoZXZ0KSB7XG4gICAgY29uc3QgdXJpUGFyYW0gPSBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoZXZ0LnF1ZXJ5SnNvbikpO1xuICAgIGNvbnN0IHVyaVBhcmFtUXVlcnk6IE5hdmlnYXRpb25FeHRyYXMgPSB7cXVlcnlQYXJhbXM6IHsncXVlcnknOiB1cmlQYXJhbX19O1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3Jlc3VsdCddLCB1cmlQYXJhbVF1ZXJ5KTtcbiAgfVxuXG4gIHNldEljb25UaXRsZXMoKSB7XG4gICAgdGhpcy5pY29uVGl0bGVzID0ge1xuICAgICAgc2hhcmU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnN0b3JlZHF1ZXJ5LnNoYXJlLnRpdGxlJyksXG4gICAgICBzaGFyZWQ6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnN0b3JlZHF1ZXJ5LnNoYXJlZGZvci50aXRsZScpLFxuICAgICAgZmF2b3I6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VvLnN0b3JlZHF1ZXJ5LmZhdm9yLnRpdGxlJyksXG4gICAgICBmYXZvcmVkOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlby5zdG9yZWRxdWVyeS5mYXZvcmVkZm9yLnRpdGxlJylcbiAgICB9XG4gIH1cblxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc2VsZWN0aW9uLmZvY3VzJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKHEgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gcTtcbiAgICAgIH0pO1xuICAgIHRoaXMuc2V0SWNvblRpdGxlcygpO1xuICB9XG5cbiAgdHJhY2tCeVFOYW1lKGluZGV4LCBpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ucW5hbWU7XG4gIH1cblxuICB0cmFja0J5SW5kZXgoaW5kZXgsIGl0ZW0pIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn1cbiJdfQ==
@@ -2895,7 +2895,7 @@ class SimpleAccordionComponent {
2895
2895
  SimpleAccordionComponent.decorators = [
2896
2896
  { type: Component, args: [{
2897
2897
  selector: 'eo-simple-accordion',
2898
- template: "<header tabindex=\"0\" role=\"tab\" (click)=\"open = !open\">{{header}}</header>\n<section *ngIf=\"open\" role=\"tabpanel\"><ng-content></ng-content></section>",
2898
+ template: "<header tabindex=\"0\" role=\"tab\" (click)=\"open = !open\" (keydown.enter)=\"open = !open\">{{header}}</header>\n<section *ngIf=\"open\" role=\"tabpanel\"><ng-content></ng-content></section>",
2899
2899
  styles: [":host{--accordion-arrow-color:rgba(0,0,0,0.26);--accordion-outline-color:rgba(0,0,0,0.15)}:host.open>header:before{transform:translateY(.15em) rotate(225deg)}:host>header{-moz-user-select:none;-webkit-user-select:none;align-items:center;background-color:var(--panel-background-grey);border:1px solid var(--accordion-outline-color);border-radius:2px;cursor:pointer;display:flex;padding:calc(var(--app-pane-padding)/4) calc(var(--app-pane-padding)/2);user-select:none}:host>header:focus,:host>header:focus-visible{outline:2px solid var(--color-accent)}:host>header:before{-webkit-margin-end:.5em;border-color:var(--accordion-arrow-color);border-style:solid;border-width:0 2px 2px 0;content:\"\";display:inline-block;height:.5em;margin-inline-end:.5em;transform:translateY(-.15em) rotate(45deg);transition:transform .2s ease-in-out;width:.5em}"]
2900
2900
  },] }
2901
2901
  ];
@@ -2904,7 +2904,7 @@ SimpleAccordionComponent.propDecorators = {
2904
2904
  header: [{ type: Input }],
2905
2905
  onOpen: [{ type: Output }],
2906
2906
  open: [{ type: HostBinding, args: ['class.open',] }, { type: Input }],
2907
- onKeyDown: [{ type: HostListener, args: ['keydown.enter', ['$event'],] }, { type: HostListener, args: ['keydown.space', ['$event'],] }]
2907
+ onKeyDown: [{ type: HostListener, args: ['keydown.space', ['$event'],] }]
2908
2908
  };
2909
2909
 
2910
2910
  class AccordionModule {
@@ -7317,7 +7317,7 @@ class ReferenceFinderComponent {
7317
7317
  this.resultList = this.referenceFinderService.generateResults(this.clipboardItems, hits, this.currentSelection, this.types);
7318
7318
  }
7319
7319
  else {
7320
- this.resultList = [];
7320
+ this.searchTerm$.next('*');
7321
7321
  this.clipboardOpen = true;
7322
7322
  }
7323
7323
  this.markedItem = null;
@@ -16083,7 +16083,7 @@ class ShareObjectComponent {
16083
16083
  }
16084
16084
  ngOnInit() {
16085
16085
  let orgaValue = [];
16086
- const shareChildren = this.selection[0].shares ? this.selection[0].shares[0].sharechildren : true;
16086
+ const shareChildren = this.selection[0].shares[0] ? this.selection[0].shares[0].sharechildren : true;
16087
16087
  this.includeChildrenField.setValue(shareChildren);
16088
16088
  if (this.selection[0].isFolder) {
16089
16089
  this.header = this.translate.instant('eo.manage.rights.folder.title');
@@ -16814,8 +16814,8 @@ class ChangePasswordFormComponent {
16814
16814
  ChangePasswordFormComponent.decorators = [
16815
16815
  { type: Component, args: [{
16816
16816
  selector: 'eo-change-password-form',
16817
- template: "<section class=\"change-password\">\n <form #changePasswordFormElement [formGroup]=\"changePasswordForm\" (ngSubmit)=\"onSubmit()\" autocomplete=\"off\">\n <div class=\"form-item\">\n\n <eo-form-input [label]=\"('eo.password.reset.current-password' | translate)\" [required]=\"true\" [invalid]=\"passwordIsNew\">\n <eo-password [parent]=\"changePasswordForm\"\n [element]=\"'currentPassword'\"\n [canChangepasswordVisiblety]=\"false\"\n [passwordVisible]=\"passwordIsVisible\"\n [placeholder]=\"('eo.password.reset.current-password' | translate)\"></eo-password>\n </eo-form-input>\n\n <eo-form-input [label]=\"('eo.password.reset.new-password' | translate)\" [required]=\"true\" [invalid]=\"matchingPasswords || passwordIsNew\">\n <eo-password [parent]=\"changePasswordForm\"\n [element]=\"'password'\"\n [canChangepasswordVisiblety]=\"false\"\n [passwordVisible]=\"passwordIsVisible\"\n [placeholder]=\"('eo.password.reset.new-password' | translate)\"></eo-password>\n </eo-form-input>\n\n <eo-form-input [label]=\"('eo.password.reset.confirm-password' | translate)\" [required]=\"true\" [invalid]=\"matchingPasswords\">\n <eo-password [parent]=\"changePasswordForm\"\n [element]=\"'confirmPassword'\"\n [canChangepasswordVisiblety]=\"false\"\n [passwordVisible]=\"passwordIsVisible\"\n [placeholder]=\"('eo.password.reset.confirm-password' | translate)\"></eo-password>\n </eo-form-input>\n\n <div class=\"invalid error\" *ngIf=\"passwordIsNew\">\n {{'eo.password.reset.error.same.password' | translate}}\n </div>\n\n <div class=\"invalid error\" *ngIf=\"matchingPasswords\">\n {{'eo.password.reset.error.matiching.password' | translate}}\n </div>\n\n <div class=\"invalid error\" translate [translateParams]=\"{amount: passwordValidation.amount}\" *ngIf=\"passwordValidation.type === 'short'\">\n eo.password.reset.error.new.password.short\n </div>\n\n <div class=\"invalid error\" translate [translateParams]=\"{amount: passwordValidation.amount}\" *ngIf=\"passwordValidation.type === 'number'\">\n eo.password.reset.error.new.password.number\n </div>\n\n <div class=\"invalid error\" translate [translateParams]=\"{amount: passwordValidation.amount}\" *ngIf=\"passwordValidation.type === 'specialchars'\">\n eo.password.reset.error.new.password.specialchars\n </div>\n\n <section class=\"change-password__cta\">\n <button class=\"change-password__submit-button\" type=\"submit\"\n [disabled]=\"changePasswordForm.invalid || passwordValidation.type !== 'valid'\" translate>eo.password.reset.confirm-button</button>\n\n <a (click)=\"showPasswords()\">\n <eo-icon class=\"change-password__icon-show\"\n [iconSrc]=\"'assets/_default/svg/ic_eye.svg'\"\n [iconTitle]=\"('eo.password.reset.toogle.icon' | translate)\"\n [ngClass]=\"{'visible': passwordIsVisible}\"></eo-icon>\n </a>\n </section>\n </div>\n </form>\n\n</section>\n",
16818
- styles: [".change-password .invalid.error{color:var(--color-error);padding:5px 0}.change-password__cta{align-items:center;display:flex;margin-top:10px}.change-password__submit-button{margin-right:10px}.change-password__icon-show{color:var(--text-color-caption);cursor:pointer}.change-password__icon-show.visible{color:var(--color-primary-3)}"]
16817
+ template: "<section class=\"change-password\">\n <form #changePasswordFormElement [formGroup]=\"changePasswordForm\" (ngSubmit)=\"onSubmit()\" autocomplete=\"off\">\n <div class=\"form-item\">\n\n <eo-form-input [label]=\"('eo.password.reset.current-password' | translate)\" [required]=\"true\" [invalid]=\"passwordIsNew\">\n <eo-password [parent]=\"changePasswordForm\"\n [element]=\"'currentPassword'\"\n [canChangepasswordVisiblety]=\"false\"\n [passwordVisible]=\"passwordIsVisible\"\n [placeholder]=\"('eo.password.reset.current-password' | translate)\"></eo-password>\n </eo-form-input>\n\n <eo-form-input [label]=\"('eo.password.reset.new-password' | translate)\" [required]=\"true\" [invalid]=\"matchingPasswords || passwordIsNew\">\n <eo-password [parent]=\"changePasswordForm\"\n [element]=\"'password'\"\n [canChangepasswordVisiblety]=\"false\"\n [passwordVisible]=\"passwordIsVisible\"\n [placeholder]=\"('eo.password.reset.new-password' | translate)\"></eo-password>\n </eo-form-input>\n\n <eo-form-input [label]=\"('eo.password.reset.confirm-password' | translate)\" [required]=\"true\" [invalid]=\"matchingPasswords\">\n <eo-password [parent]=\"changePasswordForm\"\n [element]=\"'confirmPassword'\"\n [canChangepasswordVisiblety]=\"false\"\n [passwordVisible]=\"passwordIsVisible\"\n [placeholder]=\"('eo.password.reset.confirm-password' | translate)\"></eo-password>\n </eo-form-input>\n\n <div class=\"invalid error\" *ngIf=\"passwordIsNew\">\n {{'eo.password.reset.error.same.password' | translate}}\n </div>\n\n <div class=\"invalid error\" *ngIf=\"matchingPasswords\">\n {{'eo.password.reset.error.matiching.password' | translate}}\n </div>\n\n <div class=\"invalid error\" translate [translateParams]=\"{amount: passwordValidation.amount}\" *ngIf=\"passwordValidation.type === 'short'\">\n eo.password.reset.error.new.password.short\n </div>\n\n <div class=\"invalid error\" translate [translateParams]=\"{amount: passwordValidation.amount}\" *ngIf=\"passwordValidation.type === 'number'\">\n eo.password.reset.error.new.password.number\n </div>\n\n <div class=\"invalid error\" translate [translateParams]=\"{amount: passwordValidation.amount}\" *ngIf=\"passwordValidation.type === 'specialchars'\">\n eo.password.reset.error.new.password.specialchars\n </div>\n\n <section class=\"change-password__cta\">\n <button class=\"change-password__submit-button\" type=\"submit\"\n [disabled]=\"changePasswordForm.invalid || passwordValidation.type !== 'valid'\" translate>eo.password.reset.confirm-button</button>\n\n <a (click)=\"showPasswords()\" tabindex=\"0\" (keydown.enter)=\"showPasswords()\" >\n <eo-icon class=\"change-password__icon-show\"\n [iconSrc]=\"'assets/_default/svg/ic_eye.svg'\"\n [iconTitle]=\"('eo.password.reset.toogle.icon' | translate)\"\n [ngClass]=\"{'visible': passwordIsVisible}\"></eo-icon>\n </a>\n </section>\n </div>\n </form>\n\n</section>\n",
16818
+ styles: [".change-password .invalid.error{color:var(--color-error);padding:5px 0}.change-password :focus{outline:2px solid var(--text-color-caption)}.change-password__cta{align-items:center;display:flex;margin-top:10px}.change-password__submit-button{margin-right:10px}.change-password__icon-show{color:var(--text-color-caption);cursor:pointer}.change-password__icon-show:hover{color:var(--color-accent)}.change-password__icon-show.visible{color:var(--color-primary-3)}"]
16819
16819
  },] }
16820
16820
  ];
16821
16821
  ChangePasswordFormComponent.ctorParameters = () => [
@@ -17399,7 +17399,7 @@ StoredQueryComponent.propDecorators = {
17399
17399
  };
17400
17400
 
17401
17401
  class StoredQueryDetailsComponent extends UnsubscribeOnDestroy {
17402
- constructor(router, searchService, userService, systemService, selection, pendingChanges, storedQueriesService, formHelperService, translate) {
17402
+ constructor(router, searchService, userService, systemService, selection, pendingChanges, storedQueriesService, formHelperService, elemRef, translate) {
17403
17403
  super();
17404
17404
  this.router = router;
17405
17405
  this.searchService = searchService;
@@ -17409,6 +17409,7 @@ class StoredQueryDetailsComponent extends UnsubscribeOnDestroy {
17409
17409
  this.pendingChanges = pendingChanges;
17410
17410
  this.storedQueriesService = storedQueriesService;
17411
17411
  this.formHelperService = formHelperService;
17412
+ this.elemRef = elemRef;
17412
17413
  this.translate = translate;
17413
17414
  this.FORM_INPUT_TITLE = 'storedQueryTitle';
17414
17415
  this.FORM_INPUT_FULLTEXT = 'storedQueryFulltext';
@@ -17447,6 +17448,9 @@ class StoredQueryDetailsComponent extends UnsubscribeOnDestroy {
17447
17448
  this.edit();
17448
17449
  this.startPending();
17449
17450
  this.notifyList.emit({ unselect: true, update: false });
17451
+ setTimeout(() => {
17452
+ this.elemRef.nativeElement.querySelector('[name="storedQueryTitle"]').focus();
17453
+ }, 500);
17450
17454
  }
17451
17455
  }
17452
17456
  }
@@ -17855,7 +17859,7 @@ class StoredQueryDetailsComponent extends UnsubscribeOnDestroy {
17855
17859
  StoredQueryDetailsComponent.decorators = [
17856
17860
  { type: Component, args: [{
17857
17861
  selector: 'eo-stored-query-details',
17858
- template: "<ng-container *ngIf=\"storedQuery\">\n <div class=\"eo-head\">\n <header class=\"eo-header\">\n <eo-icon class=\"eo-header-icon\"\n [iconSrc]=\"'assets/_default/svg/ic_search.svg'\"\n [iconTitle]=\"('eo.sidebar.navigation.storedqueries' | translate)\">\n </eo-icon>\n <div class=\"eo-header-info\">\n <h2 class=\"eo-header-title\">{{storedQuery.name}}</h2>\n <h3 class=\"eo-header-subtitle\" translate>eo.search.title.storedqueries</h3>\n </div>\n </header>\n </div>\n\n <div class=\"eo-body\">\n\n <div class=\"form\">\n\n <ng-template #queryForm>\n <eo-stored-query [query]=\"storedQuery\" [formOnly]=\"true\" #storedQueryForm\n (onQueryLoaded)=\"onStoredQueryLoaded()\"\n (onQueryExecute)=\"onStoredQueryExecute($event)\"></eo-stored-query>\n </ng-template>\n\n <form class=\"edit-form\" [formGroup]=\"editForm.form\" *ngIf=\"editForm.form; else queryForm\">\n\n <div class=\"context dark\">\n\n <!-- title and fulltext term fields -->\n <eo-form-input class=\"title\">\n <input type=\"text\" name=\"storedQueryTitle\" maxlength=\"64\" autofocus=\"autofocus\" [formControlName]=\"'storedQueryTitle'\"/>\n </eo-form-input>\n \n <eo-query-scope-select [selection]=\"queryScope\" (select)=\"setQueryScope($event)\"></eo-query-scope-select>\n <div class=\"form-field\">\n <eo-form-element [skipToggle]=\"true\" [element]=\"editForm.fulltextFormControl\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"editForm.fulltextFormControl\"\n (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n\n <!-- context type form controls -->\n <h3>{{storedQuery.contextFolderTypes[0]?.label}}</h3>\n <div class=\"form-field\" *ngFor=\"let ctxElement of editForm.contextControls; trackBy: trackByQName\">\n <eo-form-element [element]=\"ctxElement\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"ctxElement\" (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n </div>\n\n <!-- object type form controls -->\n <div class=\"form-fields\" [ngClass]=\"{empty: !editForm.controls?.length}\">\n <div class=\"form-field\" *ngFor=\"let element of editForm.controls; trackBy: trackByQName\">\n <eo-form-element [element]=\"element\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"element\" (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n </div>\n </form>\n </div>\n\n <aside class=\"aside\" *ngIf=\"!isNewQuery\">\n\n <!-- favorite and share -->\n <div class=\"meta-actions\">\n\n <ng-container *ngIf=\"isOwnQuery; else sharedWithMe\">\n <eo-icon class=\"button btn-share\" [iconSrc]=\"'assets/_default/svg/ic_share.svg'\" *ngIf=\"enableSharing\"\n [ngClass]=\"{active: storedQuery.shared || storedQuery.roles.length, editing: editingShare}\"\n (click)=\"toggleShareEdit()\"\n [iconTitle]=\"iconTitles.share\"></eo-icon>\n\n <eo-icon class=\"button btn-fav\" [iconSrc]=\"'assets/_default/svg/ic_favorite.svg'\"\n [ngClass]=\"{active: storedQuery.favorite}\"\n (click)=\"toggleFavoriteState()\"\n [iconTitle]=\"iconTitles.favor\"></eo-icon>\n </ng-container>\n\n <ng-template #sharedWithMe>\n <eo-icon class=\"sharedWithMe\" [iconSrc]=\"'assets/_default/svg/ic_share.svg'\" [iconTitle]=\"iconTitles.shared\"></eo-icon>\n <eo-icon class=\"sharedWithMe\" [iconSrc]=\"'assets/_default/svg/ic_favorite.svg'\" [iconTitle]=\"iconTitles.favored\"></eo-icon>\n </ng-template>\n\n </div>\n\n <!-- roles that share this query -->\n <div class=\"meta-roles\" [ngClass]=\"{dark: editingShare, empty: !storedQuery.roles?.length}\">\n\n <div class=\"label\" translate>eo.storedquery.share.sharedwith</div>\n <div class=\"form-field\" *ngIf=\"rolesPicker?.codesystem?.entries\">\n <eo-codesystem [pickerTitle]=\"rolesPicker.title\"\n [codesystem]=\"rolesPicker.codesystem\"\n [multiselect]=\"true\"\n [readonly]=\"!editingShare\"\n [inputStyleClass]=\"'stored-query__share'\"\n [(ngModel)]=\"rolesPicker.value\"></eo-codesystem>\n </div>\n\n <div class=\"share-actions\" *ngIf=\"editingShare\">\n <button class=\"secondary\" (click)=\"cancelShare()\" translate>eo.storedquery.share.cancel</button>\n <button class=\"primary\" (click)=\"share()\" translate>eo.storedquery.share.ok</button>\n </div>\n </div>\n\n <!-- queries meta info like baseparam settings -->\n <div class=\"meta-data\" *ngIf=\"restrictions?.length\">\n <div class=\"restriction\" *ngFor=\"let restriction of restrictions; trackBy: trackByIndex\">\n <div class=\"label\">{{restriction.label}}</div>\n <div class=\"items\">\n <div *ngFor=\"let item of restriction.items; trackBy: trackByIndex\">{{item}}</div>\n </div>\n </div>\n </div>\n\n </aside>\n\n </div>\n\n <div class=\"actions\">\n <ng-container *ngIf=\"!editForm.form; else actionEdit\">\n <button class=\"secondary btn-delete\" (click)=\"delete()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.action.delete</button>\n <button class=\"secondary btn-open\" (click)=\"setQueryToAppSearch()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.load</button>\n <button class=\"primary grey btn-edit\" (click)=\"edit()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.action.edit</button>\n <button class=\"primary btn-search\" [disabled]=\"storedQuery.state?.isEmpty\" (click)=\"executeQuery()\" translate>eo.storedquery.run</button>\n </ng-container>\n\n <ng-template #actionEdit>\n <!-- action while editing the query form -->\n <button class=\"secondary btn-cancel\" (click)=\"cancelEdit()\" translate>eo.storedquery.action.cancel</button>\n <button class=\"primary btn-save\" (click)=\"updateStoredQuery()\" [disabled]=\"editForm.form.invalid\" translate>eo.storedquery.action.save</button>\n </ng-template>\n </div>\n\n</ng-container>\n",
17862
+ template: "<ng-container *ngIf=\"storedQuery\">\n <div class=\"eo-head\">\n <header class=\"eo-header\">\n <eo-icon class=\"eo-header-icon\"\n [iconSrc]=\"'assets/_default/svg/ic_search.svg'\"\n [iconTitle]=\"('eo.sidebar.navigation.storedqueries' | translate)\">\n </eo-icon>\n <div class=\"eo-header-info\">\n <h2 class=\"eo-header-title\">{{storedQuery.name}}</h2>\n <h3 class=\"eo-header-subtitle\" translate>eo.search.title.storedqueries</h3>\n </div>\n </header>\n </div>\n\n <div class=\"eo-body\">\n\n <div class=\"form\">\n\n <ng-template #queryForm>\n <eo-stored-query [query]=\"storedQuery\" [formOnly]=\"true\" #storedQueryForm\n (onQueryLoaded)=\"onStoredQueryLoaded()\"\n (onQueryExecute)=\"onStoredQueryExecute($event)\"></eo-stored-query>\n </ng-template>\n\n <form class=\"edit-form\" [formGroup]=\"editForm.form\" *ngIf=\"editForm.form; else queryForm\">\n\n <div class=\"context dark\">\n\n <!-- title and fulltext term fields -->\n <eo-form-input class=\"title\">\n <input type=\"text\" name=\"storedQueryTitle\" maxlength=\"64\" onfocus=\"this.select()\" [formControlName]=\"'storedQueryTitle'\"/>\n </eo-form-input>\n \n <eo-query-scope-select [selection]=\"queryScope\" (select)=\"setQueryScope($event)\"></eo-query-scope-select>\n <div class=\"form-field\">\n <eo-form-element [skipToggle]=\"true\" [element]=\"editForm.fulltextFormControl\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"editForm.fulltextFormControl\"\n (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n\n <!-- context type form controls -->\n <h3>{{storedQuery.contextFolderTypes[0]?.label}}</h3>\n <div class=\"form-field\" *ngFor=\"let ctxElement of editForm.contextControls; trackBy: trackByQName\">\n <eo-form-element [element]=\"ctxElement\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"ctxElement\" (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n </div>\n\n <!-- object type form controls -->\n <div class=\"form-fields\" [ngClass]=\"{empty: !editForm.controls?.length}\">\n <div class=\"form-field\" *ngFor=\"let element of editForm.controls; trackBy: trackByQName\">\n <eo-form-element [element]=\"element\" [situation]=\"'SEARCH'\"></eo-form-element>\n <eo-dynamic-property-switch [parentFormControl]=\"element\" (onPropertyChanged)=\"parameterChanged($event)\"></eo-dynamic-property-switch>\n </div>\n </div>\n </form>\n </div>\n\n <aside class=\"aside\" *ngIf=\"!isNewQuery\">\n\n <!-- favorite and share -->\n <div class=\"meta-actions\">\n\n <ng-container *ngIf=\"isOwnQuery; else sharedWithMe\">\n <eo-icon class=\"button btn-share\" [iconSrc]=\"'assets/_default/svg/ic_share.svg'\" *ngIf=\"enableSharing\"\n [ngClass]=\"{active: storedQuery.shared || storedQuery.roles.length, editing: editingShare}\"\n (click)=\"toggleShareEdit()\"\n [iconTitle]=\"iconTitles.share\"></eo-icon>\n\n <eo-icon class=\"button btn-fav\" [iconSrc]=\"'assets/_default/svg/ic_favorite.svg'\"\n [ngClass]=\"{active: storedQuery.favorite}\"\n (click)=\"toggleFavoriteState()\"\n [iconTitle]=\"iconTitles.favor\"></eo-icon>\n </ng-container>\n\n <ng-template #sharedWithMe>\n <eo-icon class=\"sharedWithMe\" [iconSrc]=\"'assets/_default/svg/ic_share.svg'\" [iconTitle]=\"iconTitles.shared\"></eo-icon>\n <eo-icon class=\"sharedWithMe\" [iconSrc]=\"'assets/_default/svg/ic_favorite.svg'\" [iconTitle]=\"iconTitles.favored\"></eo-icon>\n </ng-template>\n\n </div>\n\n <!-- roles that share this query -->\n <div class=\"meta-roles\" [ngClass]=\"{dark: editingShare, empty: !storedQuery.roles?.length}\">\n\n <div class=\"label\" translate>eo.storedquery.share.sharedwith</div>\n <div class=\"form-field\" *ngIf=\"rolesPicker?.codesystem?.entries\">\n <eo-codesystem [pickerTitle]=\"rolesPicker.title\"\n [codesystem]=\"rolesPicker.codesystem\"\n [multiselect]=\"true\"\n [readonly]=\"!editingShare\"\n [inputStyleClass]=\"'stored-query__share'\"\n [(ngModel)]=\"rolesPicker.value\"></eo-codesystem>\n </div>\n\n <div class=\"share-actions\" *ngIf=\"editingShare\">\n <button class=\"secondary\" (click)=\"cancelShare()\" translate>eo.storedquery.share.cancel</button>\n <button class=\"primary\" (click)=\"share()\" translate>eo.storedquery.share.ok</button>\n </div>\n </div>\n\n <!-- queries meta info like baseparam settings -->\n <div class=\"meta-data\" *ngIf=\"restrictions?.length\">\n <div class=\"restriction\" *ngFor=\"let restriction of restrictions; trackBy: trackByIndex\">\n <div class=\"label\">{{restriction.label}}</div>\n <div class=\"items\">\n <div *ngFor=\"let item of restriction.items; trackBy: trackByIndex\">{{item}}</div>\n </div>\n </div>\n </div>\n\n </aside>\n\n </div>\n\n <div class=\"actions\">\n <ng-container *ngIf=\"!editForm.form; else actionEdit\">\n <button class=\"secondary btn-delete\" (click)=\"delete()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.action.delete</button>\n <button class=\"secondary btn-open\" (click)=\"setQueryToAppSearch()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.load</button>\n <button class=\"primary grey btn-edit\" (click)=\"edit()\" [disabled]=\"!isOwnQuery\" translate>eo.storedquery.action.edit</button>\n <button class=\"primary btn-search\" [disabled]=\"storedQuery.state?.isEmpty\" (click)=\"executeQuery()\" translate>eo.storedquery.run</button>\n </ng-container>\n\n <ng-template #actionEdit>\n <!-- action while editing the query form -->\n <button class=\"secondary btn-cancel\" (click)=\"cancelEdit()\" translate>eo.storedquery.action.cancel</button>\n <button class=\"primary btn-save\" (click)=\"updateStoredQuery()\" [disabled]=\"editForm.form.invalid\" translate>eo.storedquery.action.save</button>\n </ng-template>\n </div>\n\n</ng-container>\n",
17859
17863
  styles: [":host{--stored-query-aside-width:300px;background:var(--panel-background-grey);display:flex;flex:1;flex-direction:column;height:100%;min-height:0;min-width:0;overflow-y:auto}:host .eo-head{background-color:var(--color-white);border-bottom:1px solid var(--panel-header-border-bottom-color)}:host .eo-body{overflow-y:hidden}:host .eo-body .form{overflow-y:auto;padding:var(--app-pane-padding);padding-right:calc(var(--stored-query-aside-width) + var(--app-pane-padding)*2)}:host .eo-body .form eo-stored-query{background-color:var(--color-white);padding:var(--app-pane-padding)}:host .eo-body .aside{background-color:rgba(var(--color-black-rgb),.02);border:1px solid rgba(var(--color-black-rgb),.1);box-sizing:border-box;padding:var(--app-pane-padding);position:absolute;right:var(--app-pane-padding);top:var(--app-pane-padding);width:var(--stored-query-aside-width)}:host .eo-body .aside .meta-actions{display:flex;justify-content:flex-end;margin:0 -2px}:host .eo-body .aside .meta-actions eo-icon{color:var(--text-color-hint);margin:0 2px;padding:4px}:host .eo-body .aside .meta-actions eo-icon.active{color:var(--color-favorite)}:host .eo-body .aside .meta-actions eo-icon.editing{background-color:var(--color-primary-2);border-radius:2px 2px 0 0;color:var(--color-white)}:host .eo-body .aside .meta-actions eo-icon.sharedWithMe{background-color:var(--text-color-hint);border-radius:2px;color:var(--color-white)}:host .eo-body .aside .meta-roles.dark{background-color:var(--color-primary-2);border-radius:2px;color:var(--color-white);margin-bottom:var(--app-pane-padding);padding:calc(var(--app-pane-padding)/2)}:host .eo-body .aside .meta-roles.dark .actions{display:flex}:host .eo-body .aside .meta-roles.dark .label{display:none}:host .eo-body .aside .meta-roles.dark .form-field,:host .eo-body .aside .meta-roles .form-field{background-color:rgba(var(--color-white-rgb),.2)}:host .eo-body .aside .meta-roles .form-field{border:1px solid rgba(var(--color-black-rgb),.1);margin-bottom:calc(var(--app-pane-padding)/2);padding:2px 2px 4px 4px}:host .eo-body .aside .meta-roles .label{color:var(--text-color-caption);font-style:italic;margin-bottom:calc(var(--app-pane-padding)/4)}:host .eo-body .aside .meta-roles .share-actions{display:flex;justify-content:flex-end;margin:0 calc(var(--app-pane-padding)/8*-1)}:host .eo-body .aside .meta-roles .share-actions button{margin:0 calc(var(--app-pane-padding)/8);padding:calc(var(--app-pane-padding)/4) calc(var(--app-pane-padding)/2)}:host .eo-body .aside .meta-roles.empty:not(.dark) .form-field,:host .eo-body .aside .meta-roles.empty:not(.dark) .label{display:none}:host .eo-body .aside .meta-data{border-collapse:collapse;display:table;flex:1 1 40%;margin:0 0 var(--app-pane-padding) 0;order:1}:host .eo-body .aside .meta-data .restriction{display:table-row}:host .eo-body .aside .meta-data .restriction .label{color:var(--text-color-caption);display:table-cell;font-style:italic;padding-right:calc(var(--app-pane-padding)/2)}:host .eo-body .aside .meta-data .restriction .items{border-left:1px solid rgba(var(--color-black-rgb),.1);display:table-cell;padding:0 0 calc(var(--app-pane-padding)/2) calc(var(--app-pane-padding)/2)}:host .actions{background-color:var(--color-white);border-top:1px solid var(--panel-header-border-bottom-color);display:flex;flex-flow:row;justify-content:flex-end;padding:var(--app-pane-padding) calc(var(--app-pane-padding) - 2px)}:host .actions button{margin:0 2px}:host .edit-form{background-color:var(--color-white);max-width:500px}:host .edit-form .context{background-color:var(--color-primary-2);padding:calc(var(--app-pane-padding)/2)}:host .edit-form .context h3{color:var(--color-white);display:flex;font-size:var(--font-subhead);font-weight:var(--font-weight-light);justify-content:flex-end;margin:0;padding:var(--app-pane-padding) 0 calc(var(--app-pane-padding)/2) 0}:host .edit-form .form-fields{padding:calc(var(--app-pane-padding)/2)}:host .edit-form .form-fields.empty{display:none}:host .edit-form .form-field{align-items:center;display:flex;flex-flow:row nowrap}:host .edit-form .form-field eo-form-element{flex:1 1 auto}:host .edit-form .form-field eo-dynamic-property-switch{flex:0 0 auto}:host eo-stored-query{display:block;max-width:500px}:host ::ng-deep eo-form-input.title{display:block;margin-bottom:var(--app-pane-padding)}:host ::ng-deep eo-form-input.title input{font-size:var(--font-title);font-weight:var(--font-weight-light)}"]
17860
17864
  },] }
17861
17865
  ];
@@ -17868,6 +17872,7 @@ StoredQueryDetailsComponent.ctorParameters = () => [
17868
17872
  { type: PendingChangesService },
17869
17873
  { type: StoredQueriesService },
17870
17874
  { type: ObjectFormHelperService },
17875
+ { type: ElementRef },
17871
17876
  { type: TranslateService }
17872
17877
  ];
17873
17878
  StoredQueryDetailsComponent.propDecorators = {
@@ -22622,10 +22627,10 @@ class AboutStateComponent {
22622
22627
  this.http = http;
22623
22628
  this.userService = userService;
22624
22629
  this.config = config;
22625
- this.__libraries__ = [{ "name": "@ag-grid-community/angular", "version": "22.1.2", "license": "MIT" }, { "name": "@ag-grid-community/client-side-row-model", "version": "22.1.1", "license": "MIT" }, { "name": "@ag-grid-community/core", "version": "22.1.1", "license": "MIT" }, { "name": "@ag-grid-community/csv-export", "version": "22.1.1", "license": "MIT" }, { "name": "@angular/animations", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/cdk", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/common", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/compiler", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/core", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/forms", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/platform-browser", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/platform-browser-dynamic", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/router", "version": "11.2.0", "license": "MIT" }, { "name": "@eo-sdk/core", "version": "9.0.0-rc.8", "license": "MIT" }, { "name": "@ngx-pwa/local-storage", "version": "11.1.0", "license": "MIT" }, { "name": "@ngx-translate/core", "version": "13.0.0", "license": "MIT" }, { "name": "@types/lodash", "version": "4.14.88", "license": "MIT" }, { "name": "core-js", "version": "2.5.7", "license": "MIT" }, { "name": "file-saver", "version": "2.0.5", "license": "MIT" }, { "name": "font-awesome", "version": "4.7.0", "license": "(OFL-1.1 AND MIT)" }, { "name": "keyboardevent-key-polyfill", "version": "1.1.0", "license": "CC0-1.0" }, { "name": "keycode-js", "version": "0.0.4", "license": "MIT" }, { "name": "mobile-drag-drop", "version": "2.2.0", "license": "MIT" }, { "name": "moment", "version": "2.22.2", "license": "MIT" }, { "name": "ngx-toastr", "version": "13.2.0", "license": "MIT" }, { "name": "primeicons", "version": "1.0.0-beta.6", "license": "MIT" }, { "name": "primeng", "version": "7.0.1", "license": "MIT" }, { "name": "reflect-metadata", "version": "0.1.10", "license": "Apache-2.0" }, { "name": "rxjs", "version": "6.6.3", "license": "Apache-2.0" }, { "name": "tslib", "version": "2.1.0", "license": "0BSD" }, { "name": "zone.js", "version": "0.10.3", "license": "MIT" }];
22630
+ this.__libraries__ = [{ "name": "@ag-grid-community/angular", "version": "22.1.2", "license": "MIT" }, { "name": "@ag-grid-community/client-side-row-model", "version": "22.1.1", "license": "MIT" }, { "name": "@ag-grid-community/core", "version": "22.1.1", "license": "MIT" }, { "name": "@ag-grid-community/csv-export", "version": "22.1.1", "license": "MIT" }, { "name": "@angular/animations", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/cdk", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/common", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/compiler", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/core", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/forms", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/platform-browser", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/platform-browser-dynamic", "version": "11.2.0", "license": "MIT" }, { "name": "@angular/router", "version": "11.2.0", "license": "MIT" }, { "name": "@eo-sdk/core", "version": "9.0.0-rc.9", "license": "MIT" }, { "name": "@ngx-pwa/local-storage", "version": "11.1.0", "license": "MIT" }, { "name": "@ngx-translate/core", "version": "13.0.0", "license": "MIT" }, { "name": "@types/lodash", "version": "4.14.88", "license": "MIT" }, { "name": "core-js", "version": "2.5.7", "license": "MIT" }, { "name": "file-saver", "version": "2.0.5", "license": "MIT" }, { "name": "font-awesome", "version": "4.7.0", "license": "(OFL-1.1 AND MIT)" }, { "name": "keyboardevent-key-polyfill", "version": "1.1.0", "license": "CC0-1.0" }, { "name": "keycode-js", "version": "0.0.4", "license": "MIT" }, { "name": "mobile-drag-drop", "version": "2.2.0", "license": "MIT" }, { "name": "moment", "version": "2.22.2", "license": "MIT" }, { "name": "ngx-toastr", "version": "13.2.0", "license": "MIT" }, { "name": "primeicons", "version": "1.0.0-beta.6", "license": "MIT" }, { "name": "primeng", "version": "7.0.1", "license": "MIT" }, { "name": "reflect-metadata", "version": "0.1.10", "license": "Apache-2.0" }, { "name": "rxjs", "version": "6.6.3", "license": "Apache-2.0" }, { "name": "tslib", "version": "2.1.0", "license": "0BSD" }, { "name": "zone.js", "version": "0.10.3", "license": "MIT" }];
22626
22631
  this.ctrl = {
22627
22632
  productName: 'yuuvis® RAD client',
22628
- clientVersion: '9.0.0-rc.8'
22633
+ clientVersion: '9.0.0-rc.9'
22629
22634
  };
22630
22635
  this.licenses = {
22631
22636
  'MIT': {