UNPKG

@knora/search

Version:
277 lines 49.4 kB
import * as tslib_1 from "tslib"; import { ConnectionPositionPair, Overlay, OverlayConfig, OverlayRef, PositionStrategy } from '@angular/cdk/overlay'; import { TemplatePortal } from '@angular/cdk/portal'; import { Component, ElementRef, EventEmitter, Inject, Input, OnInit, Output, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core'; import { MatMenuTrigger } from '@angular/material'; import { Router } from '@angular/router'; import { ApiResponseData, ApiResponseError, Constants, KnoraApiConnection, ProjectResponse, ProjectsResponse, ReadProject } from '@knora/api'; import { KnoraApiConnectionToken } from '@knora/core'; /** * */ var FulltextSearchComponent = /** @class */ (function () { function FulltextSearchComponent(knoraApiConnection, _overlay, _router, _viewContainerRef) { this.knoraApiConnection = knoraApiConnection; this._overlay = _overlay; this._router = _router; this._viewContainerRef = _viewContainerRef; /** * * @param {string} route Route to navigate after search. * This route path should contain a component for search results. */ this.route = '/search'; /** * * @param {boolean} [projectfilter] If true it shows the selection * of projects to filter by one of them */ this.projectfilter = false; this.showState = new EventEmitter(); // previous search = full-text search history this.prevSearch = JSON.parse(localStorage.getItem('prevSearch')); this.defaultProjectLabel = 'All projects'; this.projectLabel = this.defaultProjectLabel; // is search panel focused? this.searchPanelFocus = false; // do not show the following projects: default system projects from knora this.doNotDisplay = [ Constants.SystemProjectIRI, Constants.DefaultSharedOntologyIRI ]; } FulltextSearchComponent.prototype.ngOnInit = function () { // this.setFocus(); if (this.filterbyproject) { this.getProject(this.filterbyproject); } if (this.projectfilter) { this.getAllProjects(); if (localStorage.getItem('currentProject') !== null) { this.setProject(JSON.parse(localStorage.getItem('currentProject'))); } } }; FulltextSearchComponent.prototype.openPanelWithBackdrop = function () { var _this = this; var config = new OverlayConfig({ hasBackdrop: true, backdropClass: 'cdk-overlay-transparent-backdrop', // backdropClass: 'cdk-overlay-dark-backdrop', positionStrategy: this.getOverlayPosition(), scrollStrategy: this._overlay.scrollStrategies.block() }); this.overlayRef = this._overlay.create(config); this.overlayRef.attach(new TemplatePortal(this.searchMenu, this._viewContainerRef)); this.overlayRef.backdropClick().subscribe(function () { _this.searchPanelFocus = false; _this.overlayRef.detach(); }); }; FulltextSearchComponent.prototype.getOverlayPosition = function () { var positions = [ new ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }), new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' }) ]; var overlayPosition = this._overlay.position().flexibleConnectedTo(this.searchPanel).withPositions(positions).withLockedPosition(false); return overlayPosition; }; FulltextSearchComponent.prototype.getAllProjects = function () { var _this = this; this.knoraApiConnection.admin.projectsEndpoint.getProjects().subscribe(function (response) { _this.projects = response.body.projects; // this.loadSystem = false; if (localStorage.getItem('currentProject') !== null) { _this.project = JSON.parse(localStorage.getItem('currentProject')); } }, function (error) { console.error(error); _this.error = error; }); }; FulltextSearchComponent.prototype.getProject = function (id) { var _this = this; this.knoraApiConnection.admin.projectsEndpoint.getProjectByIri(id).subscribe(function (project) { _this.setProject(project.body.project); }, function (error) { console.error(error); }); }; // set current project and switch focus to input field FulltextSearchComponent.prototype.setProject = function (project) { if (!project) { // set default project: all this.projectLabel = this.defaultProjectLabel; this.projectIri = undefined; localStorage.removeItem('currentProject'); } else { // set current project shortname and id this.projectLabel = project.shortname; this.projectIri = project.id; localStorage.setItem('currentProject', JSON.stringify(project)); } }; FulltextSearchComponent.prototype.doSearch = function () { var e_1, _a; if (this.searchQuery !== undefined && this.searchQuery !== null) { if (this.projectIri !== undefined) { this._router.navigate([ this.route + '/fulltext/' + this.searchQuery + '/' + encodeURIComponent(this.projectIri) ]); } else { this._router.navigate([ this.route + '/fulltext/' + this.searchQuery ]); } // push the search query into the local storage prevSearch array (previous search) // to have a list of recent search requests var existingPrevSearch = JSON.parse(localStorage.getItem('prevSearch')); if (existingPrevSearch === null) { existingPrevSearch = []; } var i = 0; try { for (var existingPrevSearch_1 = tslib_1.__values(existingPrevSearch), existingPrevSearch_1_1 = existingPrevSearch_1.next(); !existingPrevSearch_1_1.done; existingPrevSearch_1_1 = existingPrevSearch_1.next()) { var entry = existingPrevSearch_1_1.value; // remove entry, if exists already if (this.searchQuery === entry.query && this.projectIri === entry.projectIri) { existingPrevSearch.splice(i, 1); } i++; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (existingPrevSearch_1_1 && !existingPrevSearch_1_1.done && (_a = existingPrevSearch_1.return)) _a.call(existingPrevSearch_1); } finally { if (e_1) throw e_1.error; } } // A search value is expected to have at least length of 3 if (this.searchQuery.length > 2) { var currentQuery = { query: this.searchQuery }; if (this.projectIri) { currentQuery = { projectIri: this.projectIri, projectLabel: this.projectLabel, query: this.searchQuery }; } existingPrevSearch.push(currentQuery); localStorage.setItem('prevSearch', JSON.stringify(existingPrevSearch)); } } this.resetSearch(); this.overlayRef.detach(); this.show = false; this.showState.emit(this.show); }; FulltextSearchComponent.prototype.resetSearch = function () { this.searchPanelFocus = false; this.searchInput.nativeElement.blur(); this.overlayRef.detach(); }; FulltextSearchComponent.prototype.setFocus = function () { this.prevSearch = JSON.parse(localStorage.getItem('prevSearch')); this.searchPanelFocus = true; this.openPanelWithBackdrop(); }; FulltextSearchComponent.prototype.doPrevSearch = function (prevSearch) { this.searchQuery = prevSearch.query; if (prevSearch.projectIri !== undefined) { this.projectIri = prevSearch.projectIri; this.projectLabel = prevSearch.projectLabel; this._router.navigate([this.route + '/fulltext/' + this.searchQuery + '/' + encodeURIComponent(prevSearch.projectIri)]); } else { this.projectIri = undefined; this.projectLabel = this.defaultProjectLabel; this._router.navigate([this.route + '/fulltext/' + this.searchQuery]); } this.resetSearch(); this.overlayRef.detach(); }; FulltextSearchComponent.prototype.resetPrevSearch = function (prevSearch) { if (prevSearch) { // delete only this item with the name ... var i = this.prevSearch.indexOf(prevSearch); this.prevSearch.splice(i, 1); localStorage.setItem('prevSearch', JSON.stringify(this.prevSearch)); } else { // delete the whole "previous search" array localStorage.removeItem('prevSearch'); } this.prevSearch = JSON.parse(localStorage.getItem('prevSearch')); }; FulltextSearchComponent.prototype.changeFocus = function () { this.selectProject.closeMenu(); this.searchInput.nativeElement.focus(); this.setFocus(); }; FulltextSearchComponent.ctorParameters = function () { return [ { type: KnoraApiConnection, decorators: [{ type: Inject, args: [KnoraApiConnectionToken,] }] }, { type: Overlay }, { type: Router }, { type: ViewContainerRef } ]; }; tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], FulltextSearchComponent.prototype, "route", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], FulltextSearchComponent.prototype, "projectfilter", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], FulltextSearchComponent.prototype, "filterbyproject", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], FulltextSearchComponent.prototype, "show", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", Object) ], FulltextSearchComponent.prototype, "showState", void 0); tslib_1.__decorate([ ViewChild('fulltextSearchPanel', { static: false }), tslib_1.__metadata("design:type", ElementRef) ], FulltextSearchComponent.prototype, "searchPanel", void 0); tslib_1.__decorate([ ViewChild('fulltextSearchInput', { static: false }), tslib_1.__metadata("design:type", ElementRef) ], FulltextSearchComponent.prototype, "searchInput", void 0); tslib_1.__decorate([ ViewChild('fulltextSearchMenu', { static: false }), tslib_1.__metadata("design:type", TemplateRef) ], FulltextSearchComponent.prototype, "searchMenu", void 0); tslib_1.__decorate([ ViewChild('btnToSelectProject', { static: false }), tslib_1.__metadata("design:type", MatMenuTrigger) ], FulltextSearchComponent.prototype, "selectProject", void 0); FulltextSearchComponent = tslib_1.__decorate([ Component({ selector: 'kui-fulltext-search', template: "<!-- full-text search panel -->\n<div class=\"kui-fulltext-search-panel\" [class.active]=\"searchPanelFocus\" [class.with-project-filter]=\"projectfilter\"\n #fulltextSearchPanel cdkOverlayOrigin>\n\n <!-- DESKTOP / TABLET VERSION -->\n <div class=\"kui-project-filter\" *ngIf=\"projectfilter\">\n <button mat-button class=\"kui-project-filter-button\" [matMenuTriggerFor]=\"selectProject\"\n #btnToSelectProject=\"matMenuTrigger\" isIconButton>\n <p class=\"mat-caption placeholder\">Filter by project</p>\n <p class=\"label\">{{projectLabel}}</p>\n <mat-icon class=\"icon\" matSuffix>keyboard_arrow_down</mat-icon>\n </button>\n <mat-menu #selectProject=\"matMenu\">\n <div class=\"kui-project-filter-menu\">\n <button mat-menu-item class=\"center\"\n (click)=\"setProject();changeFocus()\">{{defaultProjectLabel}}</button>\n <mat-divider></mat-divider>\n <span *ngFor=\"let project of projects | kuiSortBy: 'shortname'\">\n <button mat-menu-item *ngIf=\"!doNotDisplay.includes(project.id)\"\n (click)=\"setProject(project);changeFocus()\" [matTooltip]=\"project.longname\"\n [matTooltipPosition]=\"'after'\">{{project.shortname}}</button>\n </span>\n </div>\n </mat-menu>\n </div>\n\n <div class=\"kui-fulltext-search\" [class.with-project-filter]=\"projectfilter\">\n <div class=\"kui-fulltext-search-field\">\n <input #fulltextSearchInput class=\"kui-fulltext-search-input\" type=\"search\" [(ngModel)]=\"searchQuery\"\n name=\"search\" minlength=\"3\" autocomplete=\"off\" [placeholder]=\"'Search'\" (keyup.esc)=\"resetSearch()\"\n (keyup.enter)=\"doSearch()\" (click)=\"setFocus()\">\n </div>\n <button class=\"kui-fulltext-search-button suffix\" (click)=\"doSearch()\" type=\"submit\">\n <mat-icon>search</mat-icon>\n </button>\n </div>\n\n <!-- PHONE VERSION *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** -->\n <div class=\"kui-project-filter-mobile\" *ngIf=\"projectfilter\">\n <button mat-stroked-button class=\"kui-project-filter-button kui-project-filter-button-mobile\"\n [matMenuTriggerFor]=\"selectProject\" #btnToSelectProject=\"matMenuTrigger\" isIconButton>\n <p class=\"mat-caption placeholder\">Filter by project</p>\n <p class=\"label\">{{projectLabel}}</p>\n <mat-icon class=\"icon\" matSuffix>keyboard_arrow_down</mat-icon>\n </button>\n <mat-menu #selectProject=\"matMenu\">\n <div class=\"kui-project-filter-menu-mobile\">\n <button mat-menu-item class=\"center\"\n (click)=\"setProject();changeFocus()\">{{defaultProjectLabel}}</button>\n <mat-divider></mat-divider>\n <span *ngFor=\"let project of projects | kuiSortBy: 'shortname'\">\n <button mat-menu-item *ngIf=\"!doNotDisplay.includes(project.id)\"\n (click)=\"setProject(project);changeFocus()\" [matTooltip]=\"project.longname\"\n [matTooltipPosition]=\"'after'\">{{project.shortname}}</button>\n </span>\n </div>\n </mat-menu>\n <!-- <mat-form-field class=\"kui-project-filter-select-mobile\">\n <mat-select [(ngModel)]=\"All projects\">\n <mat-option *ngFor=\"let project of projects | kuiSortBy: 'shortname'\" [value]=\"project.shortname\">\n {{project.shortname}}\n </mat-option>\n </mat-select>\n </mat-form-field> -->\n </div>\n\n <div class=\"kui-fulltext-search-mobile\" [class.with-project-filter]=\"projectfilter\">\n <div class=\"kui-fulltext-search-field-mobile\">\n <input #fulltextSearchInput class=\"kui-fulltext-search-input-mobile\" type=\"search\" [(ngModel)]=\"searchQuery\"\n name=\"search\" minlength=\"3\" autocomplete=\"off\" [placeholder]=\"'Search'\" (keyup.esc)=\"resetSearch()\"\n (keyup.enter)=\"doSearch()\" (click)=\"setFocus()\">\n </div>\n <button mat-stroked-button class=\"kui-fulltext-search-button-mobile suffix-mobile\" (click)=\"doSearch()\"\n type=\"submit\">\n Search\n </button>\n </div>\n <!-- *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** -->\n\n</div>\n\n<!-- full-text search menu - only for desktop/tablet versions -->\n<ng-template #fulltextSearchMenu>\n\n <div class=\"kui-search-menu\" [class.with-project-filter]=\"projectfilter\">\n <div class=\"kui-menu-content\">\n <mat-list class=\"kui-previous-search-list\">\n <div *ngFor=\"let item of prevSearch | kuiReverse; let i=index\">\n <mat-list-item *ngIf=\"i<10\">\n <h4 mat-line (click)=\"doPrevSearch(item)\" class=\"kui-previous-search-item\">\n <div class=\"kui-project-filter-label\" [class.not-empty]=\"item.projectIri\"\n *ngIf=\"projectfilter && !error && projects?.length > 0\">\n <span *ngIf=\"item.projectIri\">{{item.projectLabel}}</span>\n </div>\n <div class=\"kui-previous-search-query\" [class.fix-width]=\"projectfilter\">\n {{item.query}}\n </div>\n </h4>\n <button mat-icon-button (click)=\"resetPrevSearch(item)\">\n <mat-icon class=\"mat-list-close-icon\" aria-label=\"close\">close</mat-icon>\n </button>\n </mat-list-item>\n </div>\n </mat-list>\n </div>\n\n <div class=\"kui-menu-action\" *ngIf=\"prevSearch\">\n <mat-divider></mat-divider>\n <button mat-button color=\"primary\" class=\"center\" (click)=\"resetPrevSearch()\">Clear list\n </button>\n </div>\n </div>\n\n</ng-template>\n", styles: ["input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-results-button,input[type=search]::-webkit-search-results-decoration{display:none}input[type=search]{-moz-appearance:none;-webkit-appearance:none}.center{text-align:center}.kui-fulltext-search-panel{border-radius:4px;display:-webkit-box;display:flex;height:40px;position:relative;width:480px;z-index:100;background-color:#f9f9f9}.kui-fulltext-search-panel.active{box-shadow:0 1px 3px rgba(0,0,0,.5)}.kui-fulltext-search-panel.with-project-filter{width:calc(480px + 160px)}.kui-fulltext-search-panel .kui-project-filter-button{font-size:inherit;overflow:hidden;text-overflow:ellipsis;width:160px;margin:1px;border-radius:4px 0 0 4px}.kui-fulltext-search-panel .kui-fulltext-search{background-color:#f9f9f9;border-radius:4px;display:-webkit-inline-box;display:inline-flex;position:relative;z-index:10}.kui-fulltext-search-panel .kui-fulltext-search.with-project-filter{width:calc(480px + 160px);border-top-left-radius:0;border-bottom-left-radius:0}.kui-fulltext-search-panel .kui-fulltext-search .kui-fulltext-search-field{-webkit-box-flex:1;flex:1;width:calc(480px - 40px);margin:1px}.kui-fulltext-search-panel .kui-fulltext-search .kui-fulltext-search-field .kui-fulltext-search-input{border-style:none;font-size:14pt;height:38px;position:absolute;padding-left:12px;width:calc(100% - 40px)}.kui-fulltext-search-panel .kui-fulltext-search .kui-fulltext-search-field .kui-fulltext-search-input.with-project-filter{width:calc(100% - 40px - 160px)}.kui-fulltext-search-panel .kui-fulltext-search .kui-fulltext-search-field .kui-fulltext-search-input:active,.kui-fulltext-search-panel .kui-fulltext-search .kui-fulltext-search-field .kui-fulltext-search-input:focus{outline:0}.kui-fulltext-search-panel .kui-fulltext-search .kui-fulltext-search-button{background-color:#fff}.kui-fulltext-search-panel .kui-fulltext-search .suffix{margin:1px 0 1px -3px;border-radius:0 4px 4px 0}.kui-fulltext-search-panel .kui-fulltext-search .prefix{margin:1px 0 1px 3px;border-radius:4px 0 0 4px}.kui-fulltext-search-panel .kui-fulltext-search .prefix,.kui-fulltext-search-panel .kui-fulltext-search .suffix{border-style:none;color:rgba(41,41,41,.4);cursor:pointer;height:38px;outline:0;position:relative;width:39px}.kui-fulltext-search-panel .kui-fulltext-search .prefix.disabled,.kui-fulltext-search-panel .kui-fulltext-search .suffix.disabled{cursor:auto}.kui-fulltext-search-panel .kui-fulltext-search .prefix:active,.kui-fulltext-search-panel .kui-fulltext-search .suffix:active{color:#515151}.kui-search-menu{height:100%}.kui-search-menu .kui-menu-content{display:block}.kui-search-menu .kui-menu-content .mat-list{padding-bottom:8px}.kui-search-menu .kui-menu-content .mat-list .kui-previous-search-query{overflow:hidden;text-overflow:ellipsis}.kui-search-menu .kui-menu-content .mat-list .kui-previous-search-query.fix-width{width:calc(100% - 160px)}.kui-project-filter-button{height:38px!important;display:block;text-align:left}.kui-project-filter-button .placeholder{margin:0;padding:0;font-size:x-small}.kui-project-filter-button .icon,.kui-project-filter-button .label{display:inline;position:relative}.kui-project-filter-button .label{top:-12px;font-size:smaller;text-transform:capitalize}.kui-project-filter-button .icon{top:-6px;float:right}.kui-project-filter-button.kui-project-filter-button-mobile{height:100%!important}.kui-project-filter-button.kui-project-filter-button-mobile .icon,.kui-project-filter-button.kui-project-filter-button-mobile .label{top:0;font-size:inherit}@media (min-width:576px){.kui-fulltext-search-mobile,.kui-fulltext-search-mobile.with-project-filter,.kui-project-filter-mobile{display:none}}@media (max-width:576px){.kui-fulltext-search,.kui-project-filter{display:none}.kui-fulltext-search.with-project-filter{display:none!important}.kui-search-menu{display:none}.kui-search-menu.with-project-filter{display:none!important}.kui-fulltext-search-panel{height:100vh!important;background-color:rgba(220,218,218,.9);position:relative;width:100%!important;z-index:100;display:block;border-radius:0}.kui-fulltext-search-panel.with-project-filter{width:100%!important}.kui-fulltext-search-panel .kui-project-filter-mobile{height:54px;margin:0 2% 5%;padding-top:3%}.kui-fulltext-search-panel .kui-project-filter-mobile.mat-stroked-button{padding:0}.kui-fulltext-search-panel .kui-project-filter-mobile .kui-project-filter-button-mobile{width:calc(100% - 16px);margin:8px;height:100%;background-color:#b8b8b8;cursor:pointer}.kui-fulltext-search-panel .kui-project-filter-mobile .kui-project-filter-menu-mobile{width:calc(100% - 32px)!important;max-width:100%;margin:0 8px;height:100%!important}.kui-fulltext-search-panel .kui-fulltext-search-mobile{display:-webkit-box;display:flex;height:64px;margin-top:5%;margin-right:4%;margin-left:4%}.kui-fulltext-search-panel .kui-fulltext-search-mobile .kui-fulltext-search-field-mobile{width:80%;margin-right:2px}.kui-fulltext-search-panel .kui-fulltext-search-mobile .kui-fulltext-search-field-mobile .kui-fulltext-search-input-mobile{width:72%;height:64px;font-size:14pt;position:absolute;padding-left:12px;border-radius:5px;border:.6px solid #b8b8b8}.kui-fulltext-search-panel .kui-fulltext-search-mobile .kui-fulltext-search-field-mobile .kui-fulltext-search-input-mobile:active,.kui-fulltext-search-panel .kui-fulltext-search-mobile .kui-fulltext-search-field-mobile .kui-fulltext-search-input-mobile:focus{outline:0}.kui-fulltext-search-panel .kui-fulltext-search-mobile .kui-fulltext-search-button-mobile{background-color:#fff;width:20%;height:64px;padding:0;margin-left:2px;border-radius:5px;border:.8px solid #b8b8b8}.kui-fulltext-search-panel .kui-fulltext-search-mobile .suffix{margin:1px 0 1px -3px;border-radius:0 4px 4px 0}.kui-fulltext-search-panel .kui-fulltext-search-mobile .prefix,.kui-fulltext-search-panel .kui-fulltext-search-mobile .suffix{border-style:none;color:rgba(41,41,41,.4);cursor:pointer;height:100%;outline:0;position:relative;width:20%}.kui-fulltext-search-panel .kui-fulltext-search-mobile .prefix.disabled,.kui-fulltext-search-panel .kui-fulltext-search-mobile .suffix.disabled{cursor:auto}.kui-fulltext-search-panel .kui-fulltext-search-mobile .prefix:active,.kui-fulltext-search-panel .kui-fulltext-search-mobile .suffix:active{color:#515151}::ng-deep .cdk-overlay-pane .mat-menu-panel{box-shadow:none}::ng-deep .cdk-overlay-pane .mat-select-panel-wrap{margin-top:20%}::ng-deep .cdk-overlay-pane .mat-select-panel-wrap .mat-select-panel{max-height:100%!important}}"] }), tslib_1.__param(0, Inject(KnoraApiConnectionToken)), tslib_1.__metadata("design:paramtypes", [KnoraApiConnection, Overlay, Router, ViewContainerRef]) ], FulltextSearchComponent); return FulltextSearchComponent; }()); export { FulltextSearchComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbHRleHQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Brbm9yYS9zZWFyY2gvIiwic291cmNlcyI6WyJsaWIvZnVsbHRleHQtc2VhcmNoL2Z1bGx0ZXh0LXNlYXJjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0ksT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlJLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVF0RDs7R0FFRztBQU1IO0lBNkRJLGlDQUM2QyxrQkFBc0MsRUFDdkUsUUFBaUIsRUFDakIsT0FBZSxFQUNmLGlCQUFtQztRQUhGLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdkUsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2Ysc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQS9EL0M7Ozs7V0FJRztRQUNNLFVBQUssR0FBVyxTQUFTLENBQUM7UUFF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QUN4QjtRQUFwRCxTQUFTLENBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7MENBQWMsVUFBVTtnRUFBQztJQUN6QjtRQUFuRCxTQUFTLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7MENBQWEsV0FBVzsrREFBTTtJQUU3QjtRQUFuRCxTQUFTLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7MENBQWdCLGNBQWM7a0VBQUM7SUE3QnpFLHVCQUF1QjtRQUxuQyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUscUJBQXFCO1lBQy9CLDZ4TUFBK0M7O1NBRWxELENBQUM7UUErRE8sbUJBQUEsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUE7aURBQTZCLGtCQUFrQjtZQUM3RCxPQUFPO1lBQ1IsTUFBTTtZQUNJLGdCQUFnQjtPQWpFdEMsdUJBQXVCLENBNlFuQztJQUFELDhCQUFDO0NBQUEsQUE3UUQsSUE2UUM7U0E3UVksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29ubmVjdGlvblBvc2l0aW9uUGFpciwgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiwgUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdE1lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlRGF0YSwgQXBpUmVzcG9uc2VFcnJvciwgQ29uc3RhbnRzLCBLbm9yYUFwaUNvbm5lY3Rpb24sIFByb2plY3RSZXNwb25zZSwgUHJvamVjdHNSZXNwb25zZSwgUmVhZFByb2plY3QgfSBmcm9tICdAa25vcmEvYXBpJztcbmltcG9ydCB7IEtub3JhQXBpQ29ubmVjdGlvblRva2VuIH0gZnJvbSAnQGtub3JhL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByZXZTZWFyY2hJdGVtIHtcbiAgICBwcm9qZWN0SXJpPzogc3RyaW5nO1xuICAgIHByb2plY3RMYWJlbD86IHN0cmluZztcbiAgICBxdWVyeTogc3RyaW5nO1xufVxuXG4vKipcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna3VpLWZ1bGx0ZXh0LXNlYXJjaCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Z1bGx0ZXh0LXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZnVsbHRleHQtc2VhcmNoLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRnVsbHRleHRTZWFyY2hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHJvdXRlIFJvdXRlIHRvIG5hdmlnYXRlIGFmdGVyIHNlYXJjaC5cbiAgICAgKiBUaGlzIHJvdXRlIHBhdGggc2hvdWxkIGNvbnRhaW4gYSBjb21wb25lbnQgZm9yIHNlYXJjaCByZXN1bHRzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHJvdXRlOiBzdHJpbmcgPSAnL3NlYXJjaCc7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge2Jvb2xlYW59IFtwcm9qZWN0ZmlsdGVyXSBJZiB0cnVlIGl0IHNob3dzIHRoZSBzZWxlY3Rpb25cbiAgICAgKiBvZiBwcm9qZWN0cyB0byBmaWx0ZXIgYnkgb25lIG9mIHRoZW1cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwcm9qZWN0ZmlsdGVyPzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IFtmaWx0ZXJieXByb2plY3RdIElmIHRoZSBmdWxsLXRleHQgc2VhcmNoIHNob3VsZCBiZVxuICAgICAqIGZpbHRlcmVkIGJ5IG9uZSBwcm9qZWN0LCB5b3UgY2FuIGRlZmluZSBpdCB3aXRoIHByb2plY3QgaXJpLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGZpbHRlcmJ5cHJvamVjdD86IHN0cmluZztcbiAgICBASW5wdXQoKSBzaG93OiBib29sZWFuO1xuICAgIEBPdXRwdXQoKSBzaG93U3RhdGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAVmlld0NoaWxkKCdmdWxsdGV4dFNlYXJjaFBhbmVsJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNlYXJjaFBhbmVsOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2Z1bGx0ZXh0U2VhcmNoSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VhcmNoSW5wdXQ6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnZnVsbHRleHRTZWFyY2hNZW51JywgeyBzdGF0aWM6IGZhbHNlIH0pIHNlYXJjaE1lbnU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCdidG5Ub1NlbGVjdFByb2plY3QnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VsZWN0UHJvamVjdDogTWF0TWVudVRyaWdnZXI7XG5cbiAgICAvLyBzZWFyY2ggcXVlcnlcbiAgICBzZWFyY2hRdWVyeTogc3RyaW5nO1xuXG4gICAgLy8gcHJldmlvdXMgc2VhcmNoID0gZnVsbC10ZXh0IHNlYXJjaCBoaXN0b3J5XG4gICAgcHJldlNlYXJjaDogUHJldlNlYXJjaEl0ZW1bXSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3ByZXZTZWFyY2gnKSk7XG5cbiAgICAvLyBsaXN0IG9mIHByb2plY3RzLCBpbiBjYXNlIG9mIGZpbHRlcnByb2plY3QgaXMgdHJ1ZVxuICAgIHByb2plY3RzOiBSZWFkUHJvamVjdFtdO1xuXG4gICAgLy8gc2VsZWN0ZWQgcHJvamVjdCwgaW4gY2FzZSBvZiBmaWx0ZXJieXByb2plY3QgYW5kL29yIHByb2plY3RmaWx0ZXIgaXMgdHJ1ZVxuICAgIHByb2plY3Q6IFJlYWRQcm9qZWN0O1xuICAgIGRlZmF1bHRQcm9qZWN0TGFiZWw6IHN0cmluZyA9ICdBbGwgcHJvamVjdHMnO1xuICAgIHByb2plY3RMYWJlbDogc3RyaW5nID0gdGhpcy5kZWZhdWx0UHJvamVjdExhYmVsO1xuICAgIHByb2plY3RJcmk6IHN0cmluZztcblxuICAgIC8vIGluIGNhc2Ugb2YgYW4gKGFwaSkgZXJyb3JcbiAgICBlcnJvcjogYW55O1xuXG4gICAgLy8gaXMgc2VhcmNoIHBhbmVsIGZvY3VzZWQ/XG4gICAgc2VhcmNoUGFuZWxGb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gb3ZlcmxheSByZWZlcmVuY2VcbiAgICBvdmVybGF5UmVmOiBPdmVybGF5UmVmO1xuXG4gICAgLy8gZG8gbm90IHNob3cgdGhlIGZvbGxvd2luZyBwcm9qZWN0czogZGVmYXVsdCBzeXN0ZW0gcHJvamVjdHMgZnJvbSBrbm9yYVxuICAgIGRvTm90RGlzcGxheTogc3RyaW5nW10gPSBbXG4gICAgICAgIENvbnN0YW50cy5TeXN0ZW1Qcm9qZWN0SVJJLFxuICAgICAgICBDb25zdGFudHMuRGVmYXVsdFNoYXJlZE9udG9sb2d5SVJJXG4gICAgXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KEtub3JhQXBpQ29ubmVjdGlvblRva2VuKSBwcml2YXRlIGtub3JhQXBpQ29ubmVjdGlvbjogS25vcmFBcGlDb25uZWN0aW9uLFxuICAgICAgICBwcml2YXRlIF9vdmVybGF5OiBPdmVybGF5LFxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZlxuICAgICkgeyB9XG5cbiAgICBuZ09uSW5pdCgpIHtcblxuICAgICAgICAvLyB0aGlzLnNldEZvY3VzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyYnlwcm9qZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmdldFByb2plY3QodGhpcy5maWx0ZXJieXByb2plY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJvamVjdGZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5nZXRBbGxQcm9qZWN0cygpO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2N1cnJlbnRQcm9qZWN0JykgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFByb2plY3QoXG4gICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2N1cnJlbnRQcm9qZWN0JykpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9wZW5QYW5lbFdpdGhCYWNrZHJvcCgpIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxuICAgICAgICAgICAgLy8gYmFja2Ryb3BDbGFzczogJ2Nkay1vdmVybGF5LWRhcmstYmFja2Ryb3AnLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5nZXRPdmVybGF5UG9zaXRpb24oKSxcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnNlYXJjaE1lbnUsIHRoaXMuX3ZpZXdDb250YWluZXJSZWYpKTtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hQYW5lbEZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldE92ZXJsYXlQb3NpdGlvbigpOiBQb3NpdGlvblN0cmF0ZWd5IHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gW1xuICAgICAgICAgICAgbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJyB9LCB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCcgfSksXG4gICAgICAgICAgICBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcih7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnIH0sIHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnYm90dG9tJyB9KVxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlQb3NpdGlvbiA9IHRoaXMuX292ZXJsYXkucG9zaXRpb24oKS5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuc2VhcmNoUGFuZWwpLndpdGhQb3NpdGlvbnMocG9zaXRpb25zKS53aXRoTG9ja2VkUG9zaXRpb24oZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiBvdmVybGF5UG9zaXRpb247XG4gICAgfVxuXG4gICAgZ2V0QWxsUHJvamVjdHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMua25vcmFBcGlDb25uZWN0aW9uLmFkbWluLnByb2plY3RzRW5kcG9pbnQuZ2V0UHJvamVjdHMoKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAocmVzcG9uc2U6IEFwaVJlc3BvbnNlRGF0YTxQcm9qZWN0c1Jlc3BvbnNlPikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdHMgPSByZXNwb25zZS5ib2R5LnByb2plY3RzO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMubG9hZFN5c3RlbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY3VycmVudFByb2plY3QnKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3QgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2N1cnJlbnRQcm9qZWN0JylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycm9yOiBBcGlSZXNwb25zZUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldFByb2plY3QoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi5hZG1pbi5wcm9qZWN0c0VuZHBvaW50LmdldFByb2plY3RCeUlyaShpZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKHByb2plY3Q6IEFwaVJlc3BvbnNlRGF0YTxQcm9qZWN0UmVzcG9uc2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQcm9qZWN0KHByb2plY3QuYm9keS5wcm9qZWN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyb3I6IEFwaVJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgY3VycmVudCBwcm9qZWN0IGFuZCBzd2l0Y2ggZm9jdXMgdG8gaW5wdXQgZmllbGRcbiAgICBzZXRQcm9qZWN0KHByb2plY3Q/OiBSZWFkUHJvamVjdCk6IHZvaWQge1xuICAgICAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0IHByb2plY3Q6IGFsbFxuICAgICAgICAgICAgdGhpcy5wcm9qZWN0TGFiZWwgPSB0aGlzLmRlZmF1bHRQcm9qZWN0TGFiZWw7XG4gICAgICAgICAgICB0aGlzLnByb2plY3RJcmkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY3VycmVudFByb2plY3QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNldCBjdXJyZW50IHByb2plY3Qgc2hvcnRuYW1lIGFuZCBpZFxuICAgICAgICAgICAgdGhpcy5wcm9qZWN0TGFiZWwgPSBwcm9qZWN0LnNob3J0bmFtZTtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdElyaSA9IHByb2plY3QuaWQ7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY3VycmVudFByb2plY3QnLCBKU09OLnN0cmluZ2lmeShwcm9qZWN0KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkb1NlYXJjaCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaFF1ZXJ5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0SXJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlICtcbiAgICAgICAgICAgICAgICAgICAgJy9mdWxsdGV4dC8nICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeSArXG4gICAgICAgICAgICAgICAgICAgICcvJyArXG4gICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLnByb2plY3RJcmkpXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGUgKyAnL2Z1bGx0ZXh0LycgKyB0aGlzLnNlYXJjaFF1ZXJ5XG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwdXNoIHRoZSBzZWFyY2ggcXVlcnkgaW50byB0aGUgbG9jYWwgc3RvcmFnZSBwcmV2U2VhcmNoIGFycmF5IChwcmV2aW91cyBzZWFyY2gpXG4gICAgICAgICAgICAvLyB0byBoYXZlIGEgbGlzdCBvZiByZWNlbnQgc2VhcmNoIHJlcXVlc3RzXG4gICAgICAgICAgICBsZXQgZXhpc3RpbmdQcmV2U2VhcmNoOiBQcmV2U2VhcmNoSXRlbVtdID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncHJldlNlYXJjaCcpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nUHJldlNlYXJjaCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nUHJldlNlYXJjaCA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGk6IG51bWJlciA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4aXN0aW5nUHJldlNlYXJjaCkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBlbnRyeSwgaWYgZXhpc3RzIGFscmVhZHlcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hRdWVyeSA9PT0gZW50cnkucXVlcnkgJiYgdGhpcy5wcm9qZWN0SXJpID09PSBlbnRyeS5wcm9qZWN0SXJpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUHJldlNlYXJjaC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQSBzZWFyY2ggdmFsdWUgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBhdCBsZWFzdCBsZW5ndGggb2YgM1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UXVlcnk6IFByZXZTZWFyY2hJdGVtID0ge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeTogdGhpcy5zZWFyY2hRdWVyeVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0SXJpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRRdWVyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RJcmk6IHRoaXMucHJvamVjdElyaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RMYWJlbDogdGhpcy5wcm9qZWN0TGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogdGhpcy5zZWFyY2hRdWVyeVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGV4aXN0aW5nUHJldlNlYXJjaC5wdXNoKGN1cnJlbnRRdWVyeSk7XG5cbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgJ3ByZXZTZWFyY2gnLFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShleGlzdGluZ1ByZXZTZWFyY2gpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0U2VhcmNoKCk7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcblxuICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93U3RhdGUuZW1pdCh0aGlzLnNob3cpO1xuICAgIH1cblxuICAgIHJlc2V0U2VhcmNoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFBhbmVsRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgIH1cblxuICAgIHNldEZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByZXZTZWFyY2ggPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwcmV2U2VhcmNoJykpO1xuICAgICAgICB0aGlzLnNlYXJjaFBhbmVsRm9jdXMgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5QYW5lbFdpdGhCYWNrZHJvcCgpO1xuICAgIH1cblxuICAgIGRvUHJldlNlYXJjaChwcmV2U2VhcmNoOiBQcmV2U2VhcmNoSXRlbSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gcHJldlNlYXJjaC5xdWVyeTtcblxuICAgICAgICBpZiAocHJldlNlYXJjaC5wcm9qZWN0SXJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdElyaSA9IHByZXZTZWFyY2gucHJvamVjdElyaTtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdExhYmVsID0gcHJldlNlYXJjaC5wcm9qZWN0TGFiZWw7XG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW3RoaXMucm91dGUgKyAnL2Z1bGx0ZXh0LycgKyB0aGlzLnNlYXJjaFF1ZXJ5ICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHByZXZTZWFyY2gucHJvamVjdElyaSldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdElyaSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdExhYmVsID0gdGhpcy5kZWZhdWx0UHJvamVjdExhYmVsO1xuICAgICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFt0aGlzLnJvdXRlICsgJy9mdWxsdGV4dC8nICsgdGhpcy5zZWFyY2hRdWVyeV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldFNlYXJjaCgpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgcmVzZXRQcmV2U2VhcmNoKHByZXZTZWFyY2g/OiBQcmV2U2VhcmNoSXRlbSk6IHZvaWQge1xuICAgICAgICBpZiAocHJldlNlYXJjaCkge1xuICAgICAgICAgICAgLy8gZGVsZXRlIG9ubHkgdGhpcyBpdGVtIHdpdGggdGhlIG5hbWUgLi4uXG4gICAgICAgICAgICBjb25zdCBpOiBudW1iZXIgPSB0aGlzLnByZXZTZWFyY2guaW5kZXhPZihwcmV2U2VhcmNoKTtcbiAgICAgICAgICAgIHRoaXMucHJldlNlYXJjaC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncHJldlNlYXJjaCcsIEpTT04uc3RyaW5naWZ5KHRoaXMucHJldlNlYXJjaCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSB3aG9sZSBcInByZXZpb3VzIHNlYXJjaFwiIGFycmF5XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncHJldlNlYXJjaCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldlNlYXJjaCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3ByZXZTZWFyY2gnKSk7XG4gICAgfVxuXG4gICAgY2hhbmdlRm9jdXMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0UHJvamVjdC5jbG9zZU1lbnUoKTtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuc2V0Rm9jdXMoKTtcbiAgICB9XG5cblxufVxuIl19