@alfresco/adf-content-services
Version:
Alfresco ADF content services
202 lines • 28.5 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { SiteEntry, SitesApi } from '@alfresco/js-api';
import { BehaviorSubject, from } from 'rxjs';
import { AlfrescoApiService } from '../services/alfresco-api.service';
import { VersionCompatibilityService } from '../version-compatibility/version-compatibility.service';
import { SitesService } from '../common/services/sites.service';
import * as i0 from "@angular/core";
import * as i1 from "../services/alfresco-api.service";
import * as i2 from "../common/services/sites.service";
import * as i3 from "../version-compatibility/version-compatibility.service";
export class LibraryMembershipDirective {
get sitesApi() {
this._sitesApi = this._sitesApi ?? new SitesApi(this.alfrescoApiService.getInstance());
return this._sitesApi;
}
onClick() {
this.toggleMembershipRequest();
}
constructor(alfrescoApiService, sitesService, versionCompatibilityService) {
this.alfrescoApiService = alfrescoApiService;
this.sitesService = sitesService;
this.versionCompatibilityService = versionCompatibilityService;
this.targetSite = null;
this.isJoinRequested = new BehaviorSubject(false);
/** Site for which to toggle the membership request. */
this.selection = null;
/** Site for which to toggle the membership request. */
this.isAdmin = false;
this.toggle = new EventEmitter();
// eslint-disable-next-line @angular-eslint/no-output-native
this.error = new EventEmitter();
}
ngOnChanges(changes) {
if (!changes.selection.currentValue?.entry) {
this.targetSite = null;
return;
}
this.targetSite = changes.selection.currentValue.entry;
this.markMembershipRequest();
}
toggleMembershipRequest() {
if (!this.targetSite) {
return;
}
if (this.targetSite.joinRequested) {
this.cancelJoinRequest().subscribe(() => {
this.targetSite.joinRequested = false;
this.isJoinRequested.next(false);
const info = {
updatedEntry: this.targetSite,
shouldReload: false,
i18nKey: 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.INFO.JOIN_CANCELED'
};
this.toggle.emit(info);
}, (error) => {
const errWithMessage = {
error,
i18nKey: 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.ERRORS.JOIN_CANCEL_FAILED'
};
this.error.emit(errWithMessage);
});
}
if (!this.targetSite.joinRequested && !this.isAdmin) {
this.joinLibraryRequest().subscribe((createdMembership) => {
this.targetSite.joinRequested = true;
this.isJoinRequested.next(true);
if (createdMembership.entry?.site?.role) {
const info = {
shouldReload: true,
i18nKey: 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.INFO.JOINED'
};
this.toggle.emit(info);
}
else {
const info = {
updatedEntry: this.targetSite,
shouldReload: false,
i18nKey: 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.INFO.JOIN_REQUESTED'
};
this.toggle.emit(info);
}
}, (error) => {
const errWithMessage = {
error,
i18nKey: 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.ERRORS.JOIN_REQUEST_FAILED'
};
const senderEmailCheck = 'Failed to resolve sender mail address';
const receiverEmailCheck = 'All recipients for the mail action were invalid';
if (error.message) {
if (error.message.includes(senderEmailCheck)) {
errWithMessage.i18nKey = 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.ERRORS.INVALID_SENDER_EMAIL';
}
else if (error.message.includes(receiverEmailCheck)) {
errWithMessage.i18nKey = 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.ERRORS.INVALID_RECEIVER_EMAIL';
}
}
this.error.emit(errWithMessage);
});
}
if (this.isAdmin) {
this.joinLibrary().subscribe((createdMembership) => {
if (createdMembership.entry?.role) {
const info = {
shouldReload: true,
i18nKey: 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.INFO.JOINED'
};
this.toggle.emit(info);
}
}, (error) => {
const errWithMessage = {
error,
i18nKey: 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.ERRORS.JOIN_REQUEST_FAILED'
};
const senderEmailCheck = 'Failed to resolve sender mail address';
const receiverEmailCheck = 'All recipients for the mail action were invalid';
if (error.message) {
if (error.message.includes(senderEmailCheck)) {
errWithMessage.i18nKey = 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.ERRORS.INVALID_SENDER_EMAIL';
}
else if (error.message.includes(receiverEmailCheck)) {
errWithMessage.i18nKey = 'ADF_LIBRARY_MEMBERSHIP_MESSAGES.ERRORS.INVALID_RECEIVER_EMAIL';
}
}
this.error.emit(errWithMessage);
});
}
}
markMembershipRequest() {
if (!this.targetSite) {
return;
}
this.getMembershipRequest().subscribe((data) => {
if (data.entry.id === this.targetSite.id) {
this.targetSite.joinRequested = true;
this.isJoinRequested.next(true);
}
}, () => {
this.targetSite.joinRequested = false;
this.isJoinRequested.next(false);
});
}
joinLibraryRequest() {
const memberBody = {
id: this.targetSite.id
};
if (this.versionCompatibilityService.isVersionSupported('7.0.0')) {
memberBody.client = 'workspace';
}
return from(this.sitesApi.createSiteMembershipRequestForPerson('-me-', memberBody));
}
joinLibrary() {
return this.sitesService.createSiteMembership(this.targetSite.id, {
role: 'SiteConsumer',
id: '-me-'
});
}
cancelJoinRequest() {
return from(this.sitesApi.deleteSiteMembershipRequestForPerson('-me-', this.targetSite.id));
}
getMembershipRequest() {
return from(this.sitesApi.getSiteMembershipRequestForPerson('-me-', this.targetSite.id));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: LibraryMembershipDirective, deps: [{ token: i1.AlfrescoApiService }, { token: i2.SitesService }, { token: i3.VersionCompatibilityService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: LibraryMembershipDirective, isStandalone: true, selector: "[adf-library-membership]", inputs: { selection: ["adf-library-membership", "selection"], isAdmin: "isAdmin" }, outputs: { toggle: "toggle", error: "error" }, host: { listeners: { "click": "onClick()" } }, exportAs: ["libraryMembership"], usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: LibraryMembershipDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: '[adf-library-membership]',
exportAs: 'libraryMembership'
}]
}], ctorParameters: () => [{ type: i1.AlfrescoApiService }, { type: i2.SitesService }, { type: i3.VersionCompatibilityService }], propDecorators: { selection: [{
type: Input,
args: ['adf-library-membership']
}], isAdmin: [{
type: Input
}], toggle: [{
type: Output
}], error: [{
type: Output
}], onClick: [{
type: HostListener,
args: ['click']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicmFyeS1tZW1iZXJzaGlwLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvZGlyZWN0aXZlcy9saWJyYXJ5LW1lbWJlcnNoaXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQUUsU0FBUyxFQUErRCxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUd0RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNyRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7O0FBT2hFLE1BQU0sT0FBTywwQkFBMEI7SUFNbkMsSUFBSSxRQUFRO1FBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBa0JELE9BQU87UUFDSCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsWUFDWSxrQkFBc0MsRUFDdEMsWUFBMEIsRUFDMUIsMkJBQXdEO1FBRnhELHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0NBQTJCLEdBQTNCLDJCQUEyQixDQUE2QjtRQWpDcEUsZUFBVSxHQUFRLElBQUksQ0FBQztRQUV2QixvQkFBZSxHQUE2QixJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQVFoRix1REFBdUQ7UUFFdkQsY0FBUyxHQUFjLElBQUksQ0FBQztRQUU1Qix1REFBdUQ7UUFFdkQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUdoQixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWdDLENBQUM7UUFFMUQsNERBQTREO1FBRTVELFVBQUssR0FBRyxJQUFJLFlBQVksRUFBK0IsQ0FBQztJQVdyRCxDQUFDO0lBRUosV0FBVyxDQUFDLE9BQXNCO1FBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUV2QixPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCx1QkFBdUI7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLENBQzlCLEdBQUcsRUFBRTtnQkFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQyxNQUFNLElBQUksR0FBRztvQkFDVCxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQzdCLFlBQVksRUFBRSxLQUFLO29CQUNuQixPQUFPLEVBQUUsb0RBQW9EO2lCQUNoRSxDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNOLE1BQU0sY0FBYyxHQUFHO29CQUNuQixLQUFLO29CQUNMLE9BQU8sRUFBRSwyREFBMkQ7aUJBQ3ZFLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEMsQ0FBQyxDQUNKLENBQUM7UUFDTixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FDL0IsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVoQyxJQUFJLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7b0JBQ3RDLE1BQU0sSUFBSSxHQUFHO3dCQUNULFlBQVksRUFBRSxJQUFJO3dCQUNsQixPQUFPLEVBQUUsNkNBQTZDO3FCQUN6RCxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQixDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxJQUFJLEdBQUc7d0JBQ1QsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVO3dCQUM3QixZQUFZLEVBQUUsS0FBSzt3QkFDbkIsT0FBTyxFQUFFLHFEQUFxRDtxQkFDakUsQ0FBQztvQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNMLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNOLE1BQU0sY0FBYyxHQUFHO29CQUNuQixLQUFLO29CQUNMLE9BQU8sRUFBRSw0REFBNEQ7aUJBQ3hFLENBQUM7Z0JBRUYsTUFBTSxnQkFBZ0IsR0FBRyx1Q0FBdUMsQ0FBQztnQkFDakUsTUFBTSxrQkFBa0IsR0FBRyxpREFBaUQsQ0FBQztnQkFFN0UsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2hCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO3dCQUMzQyxjQUFjLENBQUMsT0FBTyxHQUFHLDZEQUE2RCxDQUFDO29CQUMzRixDQUFDO3lCQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO3dCQUNwRCxjQUFjLENBQUMsT0FBTyxHQUFHLCtEQUErRCxDQUFDO29CQUM3RixDQUFDO2dCQUNMLENBQUM7Z0JBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEMsQ0FBQyxDQUNKLENBQUM7UUFDTixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUN4QixDQUFDLGlCQUFpQixFQUFFLEVBQUU7Z0JBQ2xCLElBQUksaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO29CQUNoQyxNQUFNLElBQUksR0FBRzt3QkFDVCxZQUFZLEVBQUUsSUFBSTt3QkFDbEIsT0FBTyxFQUFFLDZDQUE2QztxQkFDekQsQ0FBQztvQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNMLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNOLE1BQU0sY0FBYyxHQUFHO29CQUNuQixLQUFLO29CQUNMLE9BQU8sRUFBRSw0REFBNEQ7aUJBQ3hFLENBQUM7Z0JBRUYsTUFBTSxnQkFBZ0IsR0FBRyx1Q0FBdUMsQ0FBQztnQkFDakUsTUFBTSxrQkFBa0IsR0FBRyxpREFBaUQsQ0FBQztnQkFFN0UsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2hCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO3dCQUMzQyxjQUFjLENBQUMsT0FBTyxHQUFHLDZEQUE2RCxDQUFDO29CQUMzRixDQUFDO3lCQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO3dCQUNwRCxjQUFjLENBQUMsT0FBTyxHQUFHLCtEQUErRCxDQUFDO29CQUM3RixDQUFDO2dCQUNMLENBQUM7Z0JBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEMsQ0FBQyxDQUNKLENBQUM7UUFDTixDQUFDO0lBQ0wsQ0FBQztJQUVELHFCQUFxQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUNqQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ0wsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDTCxDQUFDLEVBQ0QsR0FBRyxFQUFFO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixNQUFNLFVBQVUsR0FBRztZQUNmLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7U0FDVSxDQUFDO1FBRXJDLElBQUksSUFBSSxDQUFDLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDL0QsVUFBVSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7UUFDcEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVPLFdBQVc7UUFDZixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUU7WUFDOUQsSUFBSSxFQUFFLGNBQWM7WUFDcEIsRUFBRSxFQUFFLE1BQU07U0FDYixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8saUJBQWlCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDOzhHQWxNUSwwQkFBMEI7a0dBQTFCLDBCQUEwQjs7MkZBQTFCLDBCQUEwQjtrQkFMdEMsU0FBUzttQkFBQztvQkFDUCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLDBCQUEwQjtvQkFDcEMsUUFBUSxFQUFFLG1CQUFtQjtpQkFDaEM7NEpBY0csU0FBUztzQkFEUixLQUFLO3VCQUFDLHdCQUF3QjtnQkFLL0IsT0FBTztzQkFETixLQUFLO2dCQUlOLE1BQU07c0JBREwsTUFBTTtnQkFLUCxLQUFLO3NCQURKLE1BQU07Z0JBSVAsT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2l0ZUVudHJ5LCBTaXRlTWVtYmVyc2hpcFJlcXVlc3RCb2R5Q3JlYXRlLCBTaXRlTWVtYmVyc2hpcFJlcXVlc3RFbnRyeSwgU2l0ZXNBcGkgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQWxmcmVzY29BcGlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWxmcmVzY28tYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGlicmFyeU1lbWJlcnNoaXBUb2dnbGVFdmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvbGlicmFyeS1tZW1iZXJzaGlwLXRvZ2dsZS1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlicmFyeU1lbWJlcnNoaXBFcnJvckV2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9saWJyYXJ5LW1lbWJlcnNoaXAtZXJyb3ItZXZlbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFZlcnNpb25Db21wYXRpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL3ZlcnNpb24tY29tcGF0aWJpbGl0eS92ZXJzaW9uLWNvbXBhdGliaWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBTaXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vc2VydmljZXMvc2l0ZXMuc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdbYWRmLWxpYnJhcnktbWVtYmVyc2hpcF0nLFxuICAgIGV4cG9ydEFzOiAnbGlicmFyeU1lbWJlcnNoaXAnXG59KVxuZXhwb3J0IGNsYXNzIExpYnJhcnlNZW1iZXJzaGlwRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICB0YXJnZXRTaXRlOiBhbnkgPSBudWxsO1xuXG4gICAgaXNKb2luUmVxdWVzdGVkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIHByaXZhdGUgX3NpdGVzQXBpOiBTaXRlc0FwaTtcbiAgICBnZXQgc2l0ZXNBcGkoKTogU2l0ZXNBcGkge1xuICAgICAgICB0aGlzLl9zaXRlc0FwaSA9IHRoaXMuX3NpdGVzQXBpID8/IG5ldyBTaXRlc0FwaSh0aGlzLmFsZnJlc2NvQXBpU2VydmljZS5nZXRJbnN0YW5jZSgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpdGVzQXBpO1xuICAgIH1cblxuICAgIC8qKiBTaXRlIGZvciB3aGljaCB0byB0b2dnbGUgdGhlIG1lbWJlcnNoaXAgcmVxdWVzdC4gKi9cbiAgICBASW5wdXQoJ2FkZi1saWJyYXJ5LW1lbWJlcnNoaXAnKVxuICAgIHNlbGVjdGlvbjogU2l0ZUVudHJ5ID0gbnVsbDtcblxuICAgIC8qKiBTaXRlIGZvciB3aGljaCB0byB0b2dnbGUgdGhlIG1lbWJlcnNoaXAgcmVxdWVzdC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGlzQWRtaW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHRvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXI8TGlicmFyeU1lbWJlcnNoaXBUb2dnbGVFdmVudD4oKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICAgIEBPdXRwdXQoKVxuICAgIGVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxMaWJyYXJ5TWVtYmVyc2hpcEVycm9yRXZlbnQ+KCk7XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gICAgb25DbGljaygpIHtcbiAgICAgICAgdGhpcy50b2dnbGVNZW1iZXJzaGlwUmVxdWVzdCgpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGFsZnJlc2NvQXBpU2VydmljZTogQWxmcmVzY29BcGlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNpdGVzU2VydmljZTogU2l0ZXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHZlcnNpb25Db21wYXRpYmlsaXR5U2VydmljZTogVmVyc2lvbkNvbXBhdGliaWxpdHlTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoIWNoYW5nZXMuc2VsZWN0aW9uLmN1cnJlbnRWYWx1ZT8uZW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0U2l0ZSA9IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhcmdldFNpdGUgPSBjaGFuZ2VzLnNlbGVjdGlvbi5jdXJyZW50VmFsdWUuZW50cnk7XG4gICAgICAgIHRoaXMubWFya01lbWJlcnNoaXBSZXF1ZXN0KCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlTWVtYmVyc2hpcFJlcXVlc3QoKSB7XG4gICAgICAgIGlmICghdGhpcy50YXJnZXRTaXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50YXJnZXRTaXRlLmpvaW5SZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsSm9pblJlcXVlc3QoKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldFNpdGUuam9pblJlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSm9pblJlcXVlc3RlZC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRFbnRyeTogdGhpcy50YXJnZXRTaXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVsb2FkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5LZXk6ICdBREZfTElCUkFSWV9NRU1CRVJTSElQX01FU1NBR0VTLklORk8uSk9JTl9DQU5DRUxFRCdcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUuZW1pdChpbmZvKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJXaXRoTWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bktleTogJ0FERl9MSUJSQVJZX01FTUJFUlNISVBfTUVTU0FHRVMuRVJST1JTLkpPSU5fQ0FOQ0VMX0ZBSUxFRCdcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KGVycldpdGhNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnRhcmdldFNpdGUuam9pblJlcXVlc3RlZCAmJiAhdGhpcy5pc0FkbWluKSB7XG4gICAgICAgICAgICB0aGlzLmpvaW5MaWJyYXJ5UmVxdWVzdCgpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAoY3JlYXRlZE1lbWJlcnNoaXApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRTaXRlLmpvaW5SZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSm9pblJlcXVlc3RlZC5uZXh0KHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkTWVtYmVyc2hpcC5lbnRyeT8uc2l0ZT8ucm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZWxvYWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bktleTogJ0FERl9MSUJSQVJZX01FTUJFUlNISVBfTUVTU0FHRVMuSU5GTy5KT0lORUQnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUuZW1pdChpbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEVudHJ5OiB0aGlzLnRhcmdldFNpdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVsb2FkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuS2V5OiAnQURGX0xJQlJBUllfTUVNQkVSU0hJUF9NRVNTQUdFUy5JTkZPLkpPSU5fUkVRVUVTVEVEJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlLmVtaXQoaW5mbyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJXaXRoTWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bktleTogJ0FERl9MSUJSQVJZX01FTUJFUlNISVBfTUVTU0FHRVMuRVJST1JTLkpPSU5fUkVRVUVTVF9GQUlMRUQnXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VuZGVyRW1haWxDaGVjayA9ICdGYWlsZWQgdG8gcmVzb2x2ZSBzZW5kZXIgbWFpbCBhZGRyZXNzJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjZWl2ZXJFbWFpbENoZWNrID0gJ0FsbCByZWNpcGllbnRzIGZvciB0aGUgbWFpbCBhY3Rpb24gd2VyZSBpbnZhbGlkJztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoc2VuZGVyRW1haWxDaGVjaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJXaXRoTWVzc2FnZS5pMThuS2V5ID0gJ0FERl9MSUJSQVJZX01FTUJFUlNISVBfTUVTU0FHRVMuRVJST1JTLklOVkFMSURfU0VOREVSX0VNQUlMJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhyZWNlaXZlckVtYWlsQ2hlY2spKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyV2l0aE1lc3NhZ2UuaTE4bktleSA9ICdBREZfTElCUkFSWV9NRU1CRVJTSElQX01FU1NBR0VTLkVSUk9SUy5JTlZBTElEX1JFQ0VJVkVSX0VNQUlMJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdChlcnJXaXRoTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzQWRtaW4pIHtcbiAgICAgICAgICAgIHRoaXMuam9pbkxpYnJhcnkoKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKGNyZWF0ZWRNZW1iZXJzaGlwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkTWVtYmVyc2hpcC5lbnRyeT8ucm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZWxvYWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bktleTogJ0FERl9MSUJSQVJZX01FTUJFUlNISVBfTUVTU0FHRVMuSU5GTy5KT0lORUQnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUuZW1pdChpbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycldpdGhNZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuS2V5OiAnQURGX0xJQlJBUllfTUVNQkVSU0hJUF9NRVNTQUdFUy5FUlJPUlMuSk9JTl9SRVFVRVNUX0ZBSUxFRCdcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZW5kZXJFbWFpbENoZWNrID0gJ0ZhaWxlZCB0byByZXNvbHZlIHNlbmRlciBtYWlsIGFkZHJlc3MnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNlaXZlckVtYWlsQ2hlY2sgPSAnQWxsIHJlY2lwaWVudHMgZm9yIHRoZSBtYWlsIGFjdGlvbiB3ZXJlIGludmFsaWQnO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhzZW5kZXJFbWFpbENoZWNrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycldpdGhNZXNzYWdlLmkxOG5LZXkgPSAnQURGX0xJQlJBUllfTUVNQkVSU0hJUF9NRVNTQUdFUy5FUlJPUlMuSU5WQUxJRF9TRU5ERVJfRU1BSUwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKHJlY2VpdmVyRW1haWxDaGVjaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJXaXRoTWVzc2FnZS5pMThuS2V5ID0gJ0FERl9MSUJSQVJZX01FTUJFUlNISVBfTUVTU0FHRVMuRVJST1JTLklOVkFMSURfUkVDRUlWRVJfRU1BSUwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KGVycldpdGhNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFya01lbWJlcnNoaXBSZXF1ZXN0KCkge1xuICAgICAgICBpZiAoIXRoaXMudGFyZ2V0U2l0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nZXRNZW1iZXJzaGlwUmVxdWVzdCgpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZW50cnkuaWQgPT09IHRoaXMudGFyZ2V0U2l0ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldFNpdGUuam9pblJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNKb2luUmVxdWVzdGVkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldFNpdGUuam9pblJlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNKb2luUmVxdWVzdGVkLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgam9pbkxpYnJhcnlSZXF1ZXN0KCk6IE9ic2VydmFibGU8U2l0ZU1lbWJlcnNoaXBSZXF1ZXN0RW50cnk+IHtcbiAgICAgICAgY29uc3QgbWVtYmVyQm9keSA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLnRhcmdldFNpdGUuaWRcbiAgICAgICAgfSBhcyBTaXRlTWVtYmVyc2hpcFJlcXVlc3RCb2R5Q3JlYXRlO1xuXG4gICAgICAgIGlmICh0aGlzLnZlcnNpb25Db21wYXRpYmlsaXR5U2VydmljZS5pc1ZlcnNpb25TdXBwb3J0ZWQoJzcuMC4wJykpIHtcbiAgICAgICAgICAgIG1lbWJlckJvZHkuY2xpZW50ID0gJ3dvcmtzcGFjZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyb20odGhpcy5zaXRlc0FwaS5jcmVhdGVTaXRlTWVtYmVyc2hpcFJlcXVlc3RGb3JQZXJzb24oJy1tZS0nLCBtZW1iZXJCb2R5KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBqb2luTGlicmFyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l0ZXNTZXJ2aWNlLmNyZWF0ZVNpdGVNZW1iZXJzaGlwKHRoaXMudGFyZ2V0U2l0ZS5pZCwge1xuICAgICAgICAgICAgcm9sZTogJ1NpdGVDb25zdW1lcicsXG4gICAgICAgICAgICBpZDogJy1tZS0nXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FuY2VsSm9pblJlcXVlc3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBmcm9tKHRoaXMuc2l0ZXNBcGkuZGVsZXRlU2l0ZU1lbWJlcnNoaXBSZXF1ZXN0Rm9yUGVyc29uKCctbWUtJywgdGhpcy50YXJnZXRTaXRlLmlkKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNZW1iZXJzaGlwUmVxdWVzdCgpIHtcbiAgICAgICAgcmV0dXJuIGZyb20odGhpcy5zaXRlc0FwaS5nZXRTaXRlTWVtYmVyc2hpcFJlcXVlc3RGb3JQZXJzb24oJy1tZS0nLCB0aGlzLnRhcmdldFNpdGUuaWQpKTtcbiAgICB9XG59XG4iXX0=