UNPKG

@linid-dm/directory-manager-client-core

Version:

Core package by providing a set of angular components for the Directory Manager app.

129 lines 35.8 kB
/** * Copyright (C) 2020-2024 Linagora * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version, provided you comply with the Additional Terms applicable for * LinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU * Affero General Public License, subsections (b), (c), and (e), pursuant to * which these Appropriate Legal Notices must notably (i) retain the display of * the "LinID™" trademark/logo at the top of the interface window, the display * of the “You are using the Open Source and free version of LinID™, powered by * Linagora © 2009–2013. Contribute to LinID R&D by subscribing to an Enterprise * offer!” infobox and in the e-mails sent with the Program, notice appended to * any type of outbound messages (e.g. e-mail and meeting requests) as well as * in the LinID Directory Manager user interface, (ii) retain all hypertext * links between LinID Directory Manager and https://linid.org/, as well as * between LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA * intellectual property rights over its trademarks and commercial brands. Other * Additional Terms apply, see <http://www.linagora.com/licenses/> for more * details. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License and * its applicable Additional Terms for LinID Directory Manager along with this * program. If not, see <http://www.gnu.org/licenses/> for the GNU Affero * General Public License version 3 and <http://www.linagora.com/licenses/> for * the Additional Terms applicable to the LinID Directory Manager software. */ import { trigger } from '@angular/animations'; import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core'; import { Data, fadeTree, filterList } from '../../shared'; import * as i0 from "@angular/core"; import * as i1 from "@ngxs/store"; import * as i2 from "@angular/common"; import * as i3 from "@angular/router"; import * as i4 from "@angular/flex-layout/flex"; import * as i5 from "@angular/flex-layout/extended"; import * as i6 from "@angular/material/list"; import * as i7 from "../../shared/directives/color-search-letters.directive"; export class GenericListComponent { set initialDataList(initialDataList) { if (initialDataList) { this._initialDataList = initialDataList; this.updateDataListOnSetAndOnSearch(); } } get initialDataList() { return this._initialDataList; } set search(search) { this._search = search; this.updateDataListOnSetAndOnSearch(); } get search() { return this._search; } constructor(_store$, _el) { this._store$ = _store$; this._el = _el; this.isSelectOnlyModeEnabled = false; this.selectedItem = new EventEmitter(); this._initialDataList = []; this.elementRef = this._el; } getLink(item) { return item.link.toLowerCase(); } getActiveItem(item) { this.activeItem = item; this.selectedItem.emit(this.activeItem); } setEntryIdsInStore(ids) { this._store$.dispatch(new Data.SetSelectedEntryIds({ ids })); } updateDataListOnSetAndOnSearch() { if (!this.isSelectOnlyModeEnabled && this.search !== '') { this.filteredDataList = filterList(this.initialDataList, this._search); this.dataList = [...this.filteredDataList]; } else { this.dataList = [...this.initialDataList]; } } getItemCssClass(itemId) { if (!this.isSelectOnlyModeEnabled && itemId === this.selectedItemId) { return 'active-item-link'; } else if (this.isSelectOnlyModeEnabled) { if (itemId === this.selectedItemId) { return 'disabled-div'; } else if (this.activeItem && this.activeItem.ids.id === itemId) { return 'active-item-link'; } } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GenericListComponent, deps: [{ token: i1.Store }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: GenericListComponent, selector: "dm-generic-list", inputs: { selectedItemId: "selectedItemId", initialDataList: "initialDataList", search: "search", isSelectOnlyModeEnabled: "isSelectOnlyModeEnabled", isLargeScreen: "isLargeScreen", actionsMenuTemplate: "actionsMenuTemplate" }, outputs: { selectedItem: "selectedItem" }, viewQueries: [{ propertyName: "divMatList", first: true, predicate: ["divMatList"], descendants: true }, { propertyName: "ulGenericList", first: true, predicate: ["ulGenericList"], descendants: true }], ngImport: i0, template: "<!-- Copyright (C) 2020-2024 Linagora\n\nThis program is free software: you can redistribute it and/or modify it under\nthe terms of the GNU Affero General Public License as published by the Free\nSoftware Foundation, either version 3 of the License, or (at your option) any\nlater version, provided you comply with the Additional Terms applicable for\nLinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU\nAffero General Public License, subsections (b), (c), and (e), pursuant to\nwhich these Appropriate Legal Notices must notably (i) retain the display of\nthe \"LinID\u2122\" trademark/logo at the top of the interface window, the display\nof the \u201CYou are using the Open Source and free version of LinID\u2122, powered by\nLinagora \u00A9 2009\u20132013. Contribute to LinID R&D by subscribing to an Enterprise\noffer!\u201D infobox and in the e-mails sent with the Program, notice appended to\nany type of outbound messages (e.g. e-mail and meeting requests) as well as\nin the LinID Directory Manager user interface, (ii) retain all hypertext\nlinks between LinID Directory Manager and https://linid.org/, as well as\nbetween LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA\nintellectual property rights over its trademarks and commercial brands. Other\nAdditional Terms apply, see <http://www.linagora.com/licenses/> for more\ndetails.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT\nANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\nFOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more\ndetails.\n\nYou should have received a copy of the GNU Affero General Public License and\nits applicable Additional Terms for LinID Directory Manager along with this\nprogram. If not, see <http://www.gnu.org/licenses/> for the GNU Affero\nGeneral Public License version 3 and <http://www.linagora.com/licenses/> for\nthe Additional Terms applicable to the LinID Directory Manager software. -->\n\n<div\n [ngClass]=\"\n isSelectOnlyModeEnabled\n ? 'div-mat-list-dialog'\n : isLargeScreen\n ? 'div-mat-list-lg-screen'\n : 'div-mat-list-sm-screen'\n \"\n class=\"div-generic-list\"\n #divMatList\n>\n <mat-nav-list>\n <nav role=\"navigation\">\n <ul class=\"gnc-list\" #ulGenericList>\n <li\n mat-list-item\n fxLayout=\"row\"\n *ngFor=\"let data of dataList\"\n class=\"gnc-list-item\"\n >\n <a\n fxFlex\n draggable=\"false\"\n disableRipple=\"true\"\n [routerLink]=\"!isSelectOnlyModeEnabled ? [getLink(data)] : []\"\n (click)=\"\n isSelectOnlyModeEnabled && data.ids.id !== selectedItemId\n ? getActiveItem(data)\n : !isSelectOnlyModeEnabled\n ? setEntryIdsInStore(data.ids)\n : null\n \"\n [title]=\"data.name\"\n [id]=\"data.ids.externalId\"\n [ngClass]=\"getItemCssClass(data.ids.id)\"\n class=\"ldap-item\"\n >\n <button [title]=\"data.name\" class=\"btn-item\">\n <span\n appColorSearchedLetters\n [name]=\"data.name\"\n [title]=\"data.name\"\n [search]=\"search\"\n classToApply=\"highlight\"\n id=\"{{ data.ids.id }}\"\n class=\"ldap-item-name ellipsis\"\n ></span>\n </button>\n </a>\n <div\n *ngIf=\"!isSelectOnlyModeEnabled\"\n (click)=\"$event.preventDefault(); $event.stopPropagation()\"\n class=\"ellipsis-menu\"\n >\n <ng-container\n [ngTemplateOutlet]=\"actionsMenuTemplate\"\n [ngTemplateOutletContext]=\"{\n data\n }\"\n ></ng-container>\n </div>\n </li>\n </ul>\n </nav>\n </mat-nav-list>\n</div>\n", styles: ["@charset \"UTF-8\";:host{min-height:0px}.gnc-list-item{min-height:40px;height:40px;outline:none;border:none;display:block}.btn-item{text-align:left;height:100%;width:100%;background:transparent;outline:none;border:none;display:flex;align-items:center}.ldap-item{overflow:hidden;text-decoration:none}.ldap-item-name:after{display:block;content:attr(title);font-weight:700;height:0;overflow:hidden;visibility:hidden}div.div-generic-list{position:relative;overflow:auto;height:100%}div.div-generic-list mat-nav-list{padding:10px 10px 16px}div.div-generic-list a.ldap-item:before{content:\"\";min-height:40px;height:40px;position:absolute;left:0;right:0;transition:all .2s ease}div.div-generic-list a.ldap-item:hover:before{background-color:#0000000a}div.div-generic-list a.active-item-link:before{content:\"\";box-shadow:inset 4px 0;background-color:#0000000a;min-height:40px;height:40px;position:absolute;left:0;right:0}div.div-mat-list-lg-screen a.active-item-link:before,div.div-mat-list-sm-screen a.active-item-link:before{z-index:-1}.gnc-list{width:100%}.active-item-link,.gnc-list-item:hover{cursor:pointer}.active-item-link button,.active-item-link span,.active-item-link mat-icon,.gnc-list-item:hover button,.gnc-list-item:hover span,.gnc-list-item:hover mat-icon{cursor:pointer}.disabled-div{pointer-events:none;opacity:.4}.div-add-button{margin-top:25px;padding-right:5px}.div-mat-list-lg-screen{width:fit-content;min-width:290px;max-width:474px}.div-mat-list-sm-screen{width:290px;min-width:290px;max-width:290px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i4.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i4.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i5.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i6.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "directive", type: i7.ColorSearchedLettersDirective, selector: "[appColorSearchedLetters]", inputs: ["search", "name", "isFilteringOnExternalId", "nodeIds", "classToApply", "nodesMatchingSearchClass", "isAdvancedSearchActivated", "nodesIdsMatchingAdvancedSearch"] }], animations: [trigger('fadeTree', fadeTree(':enter'))] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GenericListComponent, decorators: [{ type: Component, args: [{ selector: 'dm-generic-list', animations: [trigger('fadeTree', fadeTree(':enter'))], template: "<!-- Copyright (C) 2020-2024 Linagora\n\nThis program is free software: you can redistribute it and/or modify it under\nthe terms of the GNU Affero General Public License as published by the Free\nSoftware Foundation, either version 3 of the License, or (at your option) any\nlater version, provided you comply with the Additional Terms applicable for\nLinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU\nAffero General Public License, subsections (b), (c), and (e), pursuant to\nwhich these Appropriate Legal Notices must notably (i) retain the display of\nthe \"LinID\u2122\" trademark/logo at the top of the interface window, the display\nof the \u201CYou are using the Open Source and free version of LinID\u2122, powered by\nLinagora \u00A9 2009\u20132013. Contribute to LinID R&D by subscribing to an Enterprise\noffer!\u201D infobox and in the e-mails sent with the Program, notice appended to\nany type of outbound messages (e.g. e-mail and meeting requests) as well as\nin the LinID Directory Manager user interface, (ii) retain all hypertext\nlinks between LinID Directory Manager and https://linid.org/, as well as\nbetween LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA\nintellectual property rights over its trademarks and commercial brands. Other\nAdditional Terms apply, see <http://www.linagora.com/licenses/> for more\ndetails.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT\nANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\nFOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more\ndetails.\n\nYou should have received a copy of the GNU Affero General Public License and\nits applicable Additional Terms for LinID Directory Manager along with this\nprogram. If not, see <http://www.gnu.org/licenses/> for the GNU Affero\nGeneral Public License version 3 and <http://www.linagora.com/licenses/> for\nthe Additional Terms applicable to the LinID Directory Manager software. -->\n\n<div\n [ngClass]=\"\n isSelectOnlyModeEnabled\n ? 'div-mat-list-dialog'\n : isLargeScreen\n ? 'div-mat-list-lg-screen'\n : 'div-mat-list-sm-screen'\n \"\n class=\"div-generic-list\"\n #divMatList\n>\n <mat-nav-list>\n <nav role=\"navigation\">\n <ul class=\"gnc-list\" #ulGenericList>\n <li\n mat-list-item\n fxLayout=\"row\"\n *ngFor=\"let data of dataList\"\n class=\"gnc-list-item\"\n >\n <a\n fxFlex\n draggable=\"false\"\n disableRipple=\"true\"\n [routerLink]=\"!isSelectOnlyModeEnabled ? [getLink(data)] : []\"\n (click)=\"\n isSelectOnlyModeEnabled && data.ids.id !== selectedItemId\n ? getActiveItem(data)\n : !isSelectOnlyModeEnabled\n ? setEntryIdsInStore(data.ids)\n : null\n \"\n [title]=\"data.name\"\n [id]=\"data.ids.externalId\"\n [ngClass]=\"getItemCssClass(data.ids.id)\"\n class=\"ldap-item\"\n >\n <button [title]=\"data.name\" class=\"btn-item\">\n <span\n appColorSearchedLetters\n [name]=\"data.name\"\n [title]=\"data.name\"\n [search]=\"search\"\n classToApply=\"highlight\"\n id=\"{{ data.ids.id }}\"\n class=\"ldap-item-name ellipsis\"\n ></span>\n </button>\n </a>\n <div\n *ngIf=\"!isSelectOnlyModeEnabled\"\n (click)=\"$event.preventDefault(); $event.stopPropagation()\"\n class=\"ellipsis-menu\"\n >\n <ng-container\n [ngTemplateOutlet]=\"actionsMenuTemplate\"\n [ngTemplateOutletContext]=\"{\n data\n }\"\n ></ng-container>\n </div>\n </li>\n </ul>\n </nav>\n </mat-nav-list>\n</div>\n", styles: ["@charset \"UTF-8\";:host{min-height:0px}.gnc-list-item{min-height:40px;height:40px;outline:none;border:none;display:block}.btn-item{text-align:left;height:100%;width:100%;background:transparent;outline:none;border:none;display:flex;align-items:center}.ldap-item{overflow:hidden;text-decoration:none}.ldap-item-name:after{display:block;content:attr(title);font-weight:700;height:0;overflow:hidden;visibility:hidden}div.div-generic-list{position:relative;overflow:auto;height:100%}div.div-generic-list mat-nav-list{padding:10px 10px 16px}div.div-generic-list a.ldap-item:before{content:\"\";min-height:40px;height:40px;position:absolute;left:0;right:0;transition:all .2s ease}div.div-generic-list a.ldap-item:hover:before{background-color:#0000000a}div.div-generic-list a.active-item-link:before{content:\"\";box-shadow:inset 4px 0;background-color:#0000000a;min-height:40px;height:40px;position:absolute;left:0;right:0}div.div-mat-list-lg-screen a.active-item-link:before,div.div-mat-list-sm-screen a.active-item-link:before{z-index:-1}.gnc-list{width:100%}.active-item-link,.gnc-list-item:hover{cursor:pointer}.active-item-link button,.active-item-link span,.active-item-link mat-icon,.gnc-list-item:hover button,.gnc-list-item:hover span,.gnc-list-item:hover mat-icon{cursor:pointer}.disabled-div{pointer-events:none;opacity:.4}.div-add-button{margin-top:25px;padding-right:5px}.div-mat-list-lg-screen{width:fit-content;min-width:290px;max-width:474px}.div-mat-list-sm-screen{width:290px;min-width:290px;max-width:290px}\n"] }] }], ctorParameters: () => [{ type: i1.Store }, { type: i0.ElementRef }], propDecorators: { divMatList: [{ type: ViewChild, args: ['divMatList'] }], ulGenericList: [{ type: ViewChild, args: ['ulGenericList'] }], selectedItemId: [{ type: Input }], initialDataList: [{ type: Input }], search: [{ type: Input }], isSelectOnlyModeEnabled: [{ type: Input }], isLargeScreen: [{ type: Input }], actionsMenuTemplate: [{ type: Input }], selectedItem: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2xpYnMvY2xpZW50LWNvcmUvc3JjL2xpYi9mZWF0dXJlL2dlbmVyaWMtbGlzdC9nZW5lcmljLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbGlicy9jbGllbnQtY29yZS9zcmMvbGliL2ZlYXR1cmUvZ2VuZXJpYy1saXN0L2dlbmVyaWMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLElBQUksRUFBd0IsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7O0FBT2hGLE1BQU0sT0FBTyxvQkFBb0I7SUFNL0IsSUFDSSxlQUFlLENBQUMsZUFBNEI7UUFDOUMsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO1lBQ3hDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUNJLE1BQU0sQ0FBQyxNQUFjO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFD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MDIwLTIwMjQgTGluYWdvcmFcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlclxuICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlXG4gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueVxuICogbGF0ZXIgdmVyc2lvbiwgcHJvdmlkZWQgeW91IGNvbXBseSB3aXRoIHRoZSBBZGRpdGlvbmFsIFRlcm1zIGFwcGxpY2FibGUgZm9yXG4gKiBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBzb2Z0d2FyZSBieSBMSU5BR09SQSBwdXJzdWFudCB0byBTZWN0aW9uIDcgb2YgdGhlIEdOVVxuICogQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHN1YnNlY3Rpb25zIChiKSwgKGMpLCBhbmQgKGUpLCBwdXJzdWFudCB0b1xuICogd2hpY2ggdGhlc2UgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyBtdXN0IG5vdGFibHkgKGkpIHJldGFpbiB0aGUgZGlzcGxheSBvZlxuICogdGhlIFwiTGluSUTihKJcIiB0cmFkZW1hcmsvbG9nbyBhdCB0aGUgdG9wIG9mIHRoZSBpbnRlcmZhY2Ugd2luZG93LCB0aGUgZGlzcGxheVxuICogb2YgdGhlIOKAnFlvdSBhcmUgdXNpbmcgdGhlIE9wZW4gU291cmNlIGFuZCBmcmVlIHZlcnNpb24gb2YgTGluSUTihKIsIHBvd2VyZWQgYnlcbiAqIExpbmFnb3JhIMKpIDIwMDnigJMyMDEzLiBDb250cmlidXRlIHRvIExpbklEIFImRCBieSBzdWJzY3JpYmluZyB0byBhbiBFbnRlcnByaXNlXG4gKiBvZmZlciHigJ0gaW5mb2JveCBhbmQgaW4gdGhlIGUtbWFpbHMgc2VudCB3aXRoIHRoZSBQcm9ncmFtLCBub3RpY2UgYXBwZW5kZWQgdG9cbiAqIGFueSB0eXBlIG9mIG91dGJvdW5kIG1lc3NhZ2VzIChlLmcuIGUtbWFpbCBhbmQgbWVldGluZyByZXF1ZXN0cykgYXMgd2VsbCBhc1xuICogaW4gdGhlIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIHVzZXIgaW50ZXJmYWNlLCAoaWkpIHJldGFpbiBhbGwgaHlwZXJ0ZXh0XG4gKiBsaW5rcyBiZXR3ZWVuIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIGFuZCBodHRwczovL2xpbmlkLm9yZy8sIGFzIHdlbGwgYXNcbiAqIGJldHdlZW4gTElOQUdPUkEgYW5kIExJTkFHT1JBLmNvbSwgYW5kIChpaWkpIHJlZnJhaW4gZnJvbSBpbmZyaW5naW5nIExJTkFHT1JBXG4gKiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG92ZXIgaXRzIHRyYWRlbWFya3MgYW5kIGNvbW1lcmNpYWwgYnJhbmRzLiBPdGhlclxuICogQWRkaXRpb25hbCBUZXJtcyBhcHBseSwgc2VlIDxodHRwOi8vd3d3LmxpbmFnb3JhLmNvbS9saWNlbnNlcy8+IGZvciBtb3JlXG4gKiBkZXRhaWxzLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVFxuICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1NcbiAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmVcbiAqIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZFxuICogaXRzIGFwcGxpY2FibGUgQWRkaXRpb25hbCBUZXJtcyBmb3IgTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgYWxvbmcgd2l0aCB0aGlzXG4gKiBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4gZm9yIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBhbmQgPGh0dHA6Ly93d3cubGluYWdvcmEuY29tL2xpY2Vuc2VzLz4gZm9yXG4gKiB0aGUgQWRkaXRpb25hbCBUZXJtcyBhcHBsaWNhYmxlIHRvIHRoZSBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBzb2Z0d2FyZS5cbiAqL1xuXG5pbXBvcnQgeyB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IERhdGEsIElEYXRhSXRlbSwgSUVudHJ5SWRzLCBmYWRlVHJlZSwgZmlsdGVyTGlzdCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkbS1nZW5lcmljLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2VuZXJpYy1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJpYy1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFt0cmlnZ2VyKCdmYWRlVHJlZScsIGZhZGVUcmVlKCc6ZW50ZXInKSldLFxufSlcbmV4cG9ydCBjbGFzcyBHZW5lcmljTGlzdENvbXBvbmVudCB7XG4gIEBWaWV3Q2hpbGQoJ2Rpdk1hdExpc3QnKSBkaXZNYXRMaXN0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd1bEdlbmVyaWNMaXN0JykgdWxHZW5lcmljTGlzdDogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1JZDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBpbml0aWFsRGF0YUxpc3QoaW5pdGlhbERhdGFMaXN0OiBJRGF0YUl0ZW1bXSkge1xuICAgIGlmIChpbml0aWFsRGF0YUxpc3QpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxEYXRhTGlzdCA9IGluaXRpYWxEYXRhTGlzdDtcbiAgICAgIHRoaXMudXBkYXRlRGF0YUxpc3RPblNldEFuZE9uU2VhcmNoKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGluaXRpYWxEYXRhTGlzdCgpOiBJRGF0YUl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxEYXRhTGlzdDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBzZWFyY2goc2VhcmNoOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZWFyY2ggPSBzZWFyY2g7XG4gICAgdGhpcy51cGRhdGVEYXRhTGlzdE9uU2V0QW5kT25TZWFyY2goKTtcbiAgfVxuXG4gIGdldCBzZWFyY2goKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoO1xuICB9XG5cbiAgQElucHV0KCkgaXNTZWxlY3RPbmx5TW9kZUVuYWJsZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBpc0xhcmdlU2NyZWVuOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIGFjdGlvbnNNZW51VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8SURhdGFJdGVtPigpO1xuXG4gIHByaXZhdGUgX2luaXRpYWxEYXRhTGlzdDogSURhdGFJdGVtW10gPSBbXTtcblxuICBwcml2YXRlIF9zZWFyY2g6IHN0cmluZztcblxuICBwdWJsaWMgYWN0aXZlSXRlbTogSURhdGFJdGVtO1xuXG4gIHB1YmxpYyBmaWx0ZXJlZERhdGFMaXN0OiBJRGF0YUl0ZW1bXTtcblxuICBwdWJsaWMgZGF0YUxpc3Q6IElEYXRhSXRlbVtdO1xuXG4gIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3N0b3JlJDogU3RvcmUsXG4gICAgcHJpdmF0ZSBfZWw6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50UmVmID0gdGhpcy5fZWw7XG4gIH1cblxuICBnZXRMaW5rKGl0ZW06IElEYXRhSXRlbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0ubGluay50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgZ2V0QWN0aXZlSXRlbShpdGVtOiBJRGF0YUl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZUl0ZW0gPSBpdGVtO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtLmVtaXQodGhpcy5hY3RpdmVJdGVtKTtcbiAgfVxuXG4gIHNldEVudHJ5SWRzSW5TdG9yZShpZHM6IElFbnRyeUlkcyk6IHZvaWQge1xuICAgIHRoaXMuX3N0b3JlJC5kaXNwYXRjaChuZXcgRGF0YS5TZXRTZWxlY3RlZEVudHJ5SWRzKHsgaWRzIH0pKTtcbiAgfVxuXG4gIHVwZGF0ZURhdGFMaXN0T25TZXRBbmRPblNlYXJjaCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTZWxlY3RPbmx5TW9kZUVuYWJsZWQgJiYgdGhpcy5zZWFyY2ggIT09ICcnKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkRGF0YUxpc3QgPSBmaWx0ZXJMaXN0KHRoaXMuaW5pdGlhbERhdGFMaXN0LCB0aGlzLl9zZWFyY2gpO1xuICAgICAgdGhpcy5kYXRhTGlzdCA9IFsuLi50aGlzLmZpbHRlcmVkRGF0YUxpc3RdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGFMaXN0ID0gWy4uLnRoaXMuaW5pdGlhbERhdGFMaXN0XTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbUNzc0NsYXNzKGl0ZW1JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaXNTZWxlY3RPbmx5TW9kZUVuYWJsZWQgJiYgaXRlbUlkID09PSB0aGlzLnNlbGVjdGVkSXRlbUlkKSB7XG4gICAgICByZXR1cm4gJ2FjdGl2ZS1pdGVtLWxpbmsnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1NlbGVjdE9ubHlNb2RlRW5hYmxlZCkge1xuICAgICAgaWYgKGl0ZW1JZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZW1JZCkge1xuICAgICAgICByZXR1cm4gJ2Rpc2FibGVkLWRpdic7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlSXRlbSAmJiB0aGlzLmFjdGl2ZUl0ZW0uaWRzLmlkID09PSBpdGVtSWQpIHtcbiAgICAgICAgcmV0dXJuICdhY3RpdmUtaXRlbS1saW5rJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjwhLS0gQ29weXJpZ2h0IChDKSAyMDIwLTIwMjQgTGluYWdvcmFcblxuVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXJcbnRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxuU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnlcbmxhdGVyIHZlcnNpb24sIHByb3ZpZGVkIHlvdSBjb21wbHkgd2l0aCB0aGUgQWRkaXRpb25hbCBUZXJtcyBhcHBsaWNhYmxlIGZvclxuTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgc29mdHdhcmUgYnkgTElOQUdPUkEgcHVyc3VhbnQgdG8gU2VjdGlvbiA3IG9mIHRoZSBHTlVcbkFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzdWJzZWN0aW9ucyAoYiksIChjKSwgYW5kIChlKSwgcHVyc3VhbnQgdG9cbndoaWNoIHRoZXNlIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMgbXVzdCBub3RhYmx5IChpKSByZXRhaW4gdGhlIGRpc3BsYXkgb2ZcbnRoZSBcIkxpbklE4oSiXCIgdHJhZGVtYXJrL2xvZ28gYXQgdGhlIHRvcCBvZiB0aGUgaW50ZXJmYWNlIHdpbmRvdywgdGhlIGRpc3BsYXlcbm9mIHRoZSDigJxZb3UgYXJlIHVzaW5nIHRoZSBPcGVuIFNvdXJjZSBhbmQgZnJlZSB2ZXJzaW9uIG9mIExpbklE4oSiLCBwb3dlcmVkIGJ5XG5MaW5hZ29yYSDCqSAyMDA54oCTMjAxMy4gQ29udHJpYnV0ZSB0byBMaW5JRCBSJkQgYnkgc3Vic2NyaWJpbmcgdG8gYW4gRW50ZXJwcmlzZVxub2ZmZXIh4oCdIGluZm9ib3ggYW5kIGluIHRoZSBlLW1haWxzIHNlbnQgd2l0aCB0aGUgUHJvZ3JhbSwgbm90aWNlIGFwcGVuZGVkIHRvXG5hbnkgdHlwZSBvZiBvdXRib3VuZCBtZXNzYWdlcyAoZS5nLiBlLW1haWwgYW5kIG1lZXRpbmcgcmVxdWVzdHMpIGFzIHdlbGwgYXNcbmluIHRoZSBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciB1c2VyIGludGVyZmFjZSwgKGlpKSByZXRhaW4gYWxsIGh5cGVydGV4dFxubGlua3MgYmV0d2VlbiBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBhbmQgaHR0cHM6Ly9saW5pZC5vcmcvLCBhcyB3ZWxsIGFzXG5iZXR3ZWVuIExJTkFHT1JBIGFuZCBMSU5BR09SQS5jb20sIGFuZCAoaWlpKSByZWZyYWluIGZyb20gaW5mcmluZ2luZyBMSU5BR09SQVxuaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvdmVyIGl0cyB0cmFkZW1hcmtzIGFuZCBjb21tZXJjaWFsIGJyYW5kcy4gT3RoZXJcbkFkZGl0aW9uYWwgVGVybXMgYXBwbHksIHNlZSA8aHR0cDovL3d3dy5saW5hZ29yYS5jb20vbGljZW5zZXMvPiBmb3IgbW9yZVxuZGV0YWlscy5cblxuVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUXG5BTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTU1xuRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZVxuZGV0YWlscy5cblxuWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZFxuaXRzIGFwcGxpY2FibGUgQWRkaXRpb25hbCBUZXJtcyBmb3IgTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgYWxvbmcgd2l0aCB0aGlzXG5wcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4gZm9yIHRoZSBHTlUgQWZmZXJvXG5HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBhbmQgPGh0dHA6Ly93d3cubGluYWdvcmEuY29tL2xpY2Vuc2VzLz4gZm9yXG50aGUgQWRkaXRpb25hbCBUZXJtcyBhcHBsaWNhYmxlIHRvIHRoZSBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBzb2Z0d2FyZS4gLS0+XG5cbjxkaXZcbiAgW25nQ2xhc3NdPVwiXG4gICAgaXNTZWxlY3RPbmx5TW9kZUVuYWJsZWRcbiAgICAgID8gJ2Rpdi1tYXQtbGlzdC1kaWFsb2cnXG4gICAgICA6IGlzTGFyZ2VTY3JlZW5cbiAgICAgICAgPyAnZGl2LW1hdC1saXN0LWxnLXNjcmVlbidcbiAgICAgICAgOiAnZGl2LW1hdC1saXN0LXNtLXNjcmVlbidcbiAgXCJcbiAgY2xhc3M9XCJkaXYtZ2VuZXJpYy1saXN0XCJcbiAgI2Rpdk1hdExpc3Rcbj5cbiAgPG1hdC1uYXYtbGlzdD5cbiAgICA8bmF2IHJvbGU9XCJuYXZpZ2F0aW9uXCI+XG4gICAgICA8dWwgY2xhc3M9XCJnbmMtbGlzdFwiICN1bEdlbmVyaWNMaXN0PlxuICAgICAgICA8bGlcbiAgICAgICAgICBtYXQtbGlzdC1pdGVtXG4gICAgICAgICAgZnhMYXlvdXQ9XCJyb3dcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXRhIG9mIGRhdGFMaXN0XCJcbiAgICAgICAgICBjbGFzcz1cImduYy1saXN0LWl0ZW1cIlxuICAgICAgICA+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGZ4RmxleFxuICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgZGlzYWJsZVJpcHBsZT1cInRydWVcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiIWlzU2VsZWN0T25seU1vZGVFbmFibGVkID8gW2dldExpbmsoZGF0YSldIDogW11cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICBpc1NlbGVjdE9ubHlNb2RlRW5hYmxlZCAmJiBkYXRhLmlkcy5pZCAhPT0gc2VsZWN0ZWRJdGVtSWRcbiAgICAgICAgICAgICAgICA/IGdldEFjdGl2ZUl0ZW0oZGF0YSlcbiAgICAgICAgICAgICAgICA6ICFpc1NlbGVjdE9ubHlNb2RlRW5hYmxlZFxuICAgICAgICAgICAgICAgICAgPyBzZXRFbnRyeUlkc0luU3RvcmUoZGF0YS5pZHMpXG4gICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiZGF0YS5uYW1lXCJcbiAgICAgICAgICAgIFtpZF09XCJkYXRhLmlkcy5leHRlcm5hbElkXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldEl0ZW1Dc3NDbGFzcyhkYXRhLmlkcy5pZClcIlxuICAgICAgICAgICAgY2xhc3M9XCJsZGFwLWl0ZW1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b24gW3RpdGxlXT1cImRhdGEubmFtZVwiIGNsYXNzPVwiYnRuLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBhcHBDb2xvclNlYXJjaGVkTGV0dGVyc1xuICAgICAgICAgICAgICAgIFtuYW1lXT1cImRhdGEubmFtZVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImRhdGEubmFtZVwiXG4gICAgICAgICAgICAgICAgW3NlYXJjaF09XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgIGNsYXNzVG9BcHBseT1cImhpZ2hsaWdodFwiXG4gICAgICAgICAgICAgICAgaWQ9XCJ7eyBkYXRhLmlkcy5pZCB9fVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJsZGFwLWl0ZW0tbmFtZSBlbGxpcHNpc1wiXG4gICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCIhaXNTZWxlY3RPbmx5TW9kZUVuYWJsZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgY2xhc3M9XCJlbGxpcHNpcy1tZW51XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFjdGlvbnNNZW51VGVtcGxhdGVcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvbmF2PlxuICA8L21hdC1uYXYtbGlzdD5cbjwvZGl2PlxuIl19