UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

152 lines 21.1 kB
import { Injectable, Injector } from '@angular/core'; import { cloneDeep, get } from 'lodash-es'; import { Observable, Subject, tap } from 'rxjs'; import { NAME, TRUE, } from '../core/public-api'; import { K8sUtilService, LABELS, METADATA, PROJECT, } from '../core/services/k8s-util.service'; import { getK8sResourceAnnotationErrorMapper, getK8sResourceLabelErrorMapper, k8sResourceAnnotationValidator, k8sResourceLabelValidator, } from '../form/validators/utils'; import { UpdateDescriptionDialogComponent } from './update-description-dialog/component'; import { UpdateDisplayNameDialogComponent } from './update-display-name-dialog/component'; import { UpdateKeyValueDialogComponent, } from './update-key-value-dialog/component'; import * as i0 from "@angular/core"; export class K8sSharedUtilService extends K8sUtilService { constructor(injector) { super(injector); this.getProjectNames = this.getProjectNames.bind(this); } /** * 更新 Annotation 或 Label */ updatePart(params) { const { part, resource, readonlyKeys, getResourceSpec, dialogClass } = params; const keyValues = get(resource, `${METADATA}.${part}`, {}); const updated$$ = new Subject(); this.dialog.open(UpdateKeyValueDialogComponent, { data: { title: `update_${part}`, keyValues, readonlyKeys, validator: part === 'labels' ? k8sResourceLabelValidator : k8sResourceAnnotationValidator, errorMapper: part === 'labels' ? getK8sResourceLabelErrorMapper(this.translate) : getK8sResourceAnnotationErrorMapper(this.translate), updateSuccessMsg: `update_${part}_succeeded`, updateFailMsg: `update_${part}_failed`, onUpdate: results => { const checkedResults = cloneDeep(results); for (const key of Object.keys(keyValues)) { if (!(key in checkedResults)) { checkedResults[key] = null; } } return this.k8sApi['cluster' in params && params.cluster ? 'patchResource' : 'patchGlobalResource']({ ...params, part: { // @ts-expect-error metadata: { [part]: checkedResults, }, ...(getResourceSpec ? { spec: getResourceSpec(checkedResults) } : {}), }, }).pipe(tap((_resource) => updated$$.next(_resource))); }, }, fitViewport: true, customClass: dialogClass, }); return updated$$.asObservable(); } updateDisplayName({ type, cluster, resource, definition, }, validateMaxLength = false) { return new Observable(observer => { const dialogRef = this.dialog.open(UpdateDisplayNameDialogComponent, { data: { definition, resource, cluster, type, validateMaxLength, }, }); dialogRef.afterClosed().subscribe(updated => { if (updated) { observer.next(updated); } observer.complete(); }); }); } updateDescription({ type, cluster, resource, definition, }) { return new Observable(observer => { const dialogRef = this.dialog.open(UpdateDescriptionDialogComponent, { data: { resource, cluster, type, definition, }, }); dialogRef.afterClosed().subscribe(updated => { if (updated) { observer.next(updated); } observer.complete(); }); }); } /** * 单项目绑定切换至多项目绑定时,兼容之前的 project name 形式 * 老格式 cpaas.io/project: "ALL_ALL" 或者 project.cpaas.io/name: "ALL_ALL" * 新格式 project.cpaas.io/ALL_ALL: "true" * @param {(KubernetesResource | string[])} resource * @returns * @memberof K8sUtilService */ getProjectNames(resource) { if (Array.isArray(resource)) { return resource; } const projectLabelPrefix = `${PROJECT}.${this.baseDomain}/`; const labels = get(resource, [METADATA, LABELS], {}); return Object.entries(labels) .reduce((acc, [key, value]) => { if (key.startsWith(projectLabelPrefix)) { const projectName = key.slice(projectLabelPrefix.length); if (value === TRUE) { acc.push(projectName); } else if (projectName === NAME) { acc.push(value); } } else if (key === this.normalizeType(PROJECT)) { acc.push(value); } return acc; }, []) .filter(Boolean); } getProjectLabels(projects, value = TRUE) { return projects?.reduce((acc, project) => { if (project) { Object.assign(acc, { [this.normalizeType(project, PROJECT)]: value, }); } return acc; }, {}); } static { this.ɵfac = function K8sSharedUtilService_Factory(t) { return new (t || K8sSharedUtilService)(i0.ɵɵinject(i0.Injector)); }; } static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: K8sSharedUtilService, factory: K8sSharedUtilService.ɵfac, providedIn: 'root' }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(K8sSharedUtilService, [{ type: Injectable, args: [{ providedIn: 'root', }] }], () => [{ type: i0.Injector }], null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiazhzLXNoYXJlZC11dGlsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvazhzLXNoYXJlZC9rOHMtc2hhcmVkLXV0aWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHaEQsT0FBTyxFQUVMLElBQUksRUFDSixJQUFJLEdBR0wsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsY0FBYyxFQUNkLE1BQU0sRUFDTixRQUFRLEVBQ1IsT0FBTyxHQUNSLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyw4QkFBOEIsRUFDOUIsOEJBQThCLEVBQzlCLHlCQUF5QixHQUMxQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFGLE9BQU8sRUFDTCw2QkFBNkIsR0FFOUIsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFLN0MsTUFBTSxPQUFPLG9CQUVYLFNBQVEsY0FBaUI7SUFDekIsWUFBWSxRQUFrQjtRQUM1QixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQ1IsTUFLQztRQUVELE1BQU0sRUFBRSxJQUFJLEVBQUUs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QixXQUFwQixvQkFBb0IsbUJBRm5CLE1BQU07O2lGQUVQLG9CQUFvQjtjQUhoQyxVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEs4c1Jlc291cmNlRGVmaW5pdGlvbiwgUmVzb3VyY2VXcml0ZVBhcmFtcyB9IGZyb20gJy4uL2FwaS90eXBlcyc7XG5pbXBvcnQge1xuICBBTk5PVEFUSU9OUyxcbiAgTkFNRSxcbiAgVFJVRSxcbiAgS3ViZXJuZXRlc1Jlc291cmNlLFxuICBTdHJpbmdNYXAsXG59IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQge1xuICBLOHNVdGlsU2VydmljZSxcbiAgTEFCRUxTLFxuICBNRVRBREFUQSxcbiAgUFJPSkVDVCxcbn0gZnJvbSAnLi4vY29yZS9zZXJ2aWNlcy9rOHMtdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIGdldEs4c1Jlc291cmNlQW5ub3RhdGlvbkVycm9yTWFwcGVyLFxuICBnZXRLOHNSZXNvdXJjZUxhYmVsRXJyb3JNYXBwZXIsXG4gIGs4c1Jlc291cmNlQW5ub3RhdGlvblZhbGlkYXRvcixcbiAgazhzUmVzb3VyY2VMYWJlbFZhbGlkYXRvcixcbn0gZnJvbSAnLi4vZm9ybS92YWxpZGF0b3JzL3V0aWxzJztcblxuaW1wb3J0IHsgVXBkYXRlRGVzY3JpcHRpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3VwZGF0ZS1kZXNjcmlwdGlvbi1kaWFsb2cvY29tcG9uZW50JztcbmltcG9ydCB7IFVwZGF0ZURpc3BsYXlOYW1lRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi91cGRhdGUtZGlzcGxheS1uYW1lLWRpYWxvZy9jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgVXBkYXRlS2V5VmFsdWVEaWFsb2dDb21wb25lbnQsXG4gIFVwZGF0ZUtleVZhbHVlRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi91cGRhdGUta2V5LXZhbHVlLWRpYWxvZy9jb21wb25lbnQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgSzhzU2hhcmVkVXRpbFNlcnZpY2U8XG4gIFIgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+IGV4dGVuZHMgSzhzVXRpbFNlcnZpY2U8Uj4ge1xuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgdGhpcy5nZXRQcm9qZWN0TmFtZXMgPSB0aGlzLmdldFByb2plY3ROYW1lcy5iaW5kKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsCBBbm5vdGF0aW9uIOaIliBMYWJlbFxuICAgKi9cbiAgdXBkYXRlUGFydDxUIGV4dGVuZHMgS3ViZXJuZXRlc1Jlc291cmNlPihcbiAgICBwYXJhbXM6IFJlc291cmNlV3JpdGVQYXJhbXM8UiwgVD4gJiB7XG4gICAgICByZWFkb25seUtleXM/OiBBcnJheTxzdHJpbmcgfCBSZWdFeHA+O1xuICAgICAgcGFydDogdHlwZW9mIEFOTk9UQVRJT05TIHwgdHlwZW9mIExBQkVMUztcbiAgICAgIGdldFJlc291cmNlU3BlYz86IChzdHJpbmdNYXA6IFN0cmluZ01hcCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBkaWFsb2dDbGFzcz86IHN0cmluZztcbiAgICB9LFxuICApIHtcbiAgICBjb25zdCB7IHBhcnQsIHJlc291cmNlLCByZWFkb25seUtleXMsIGdldFJlc291cmNlU3BlYywgZGlhbG9nQ2xhc3MgfSA9XG4gICAgICBwYXJhbXM7XG4gICAgY29uc3Qga2V5VmFsdWVzOiBTdHJpbmdNYXAgPSBnZXQocmVzb3VyY2UsIGAke01FVEFEQVRBfS4ke3BhcnR9YCwge30pO1xuICAgIGNvbnN0IHVwZGF0ZWQkJCA9IG5ldyBTdWJqZWN0PFQ+KCk7XG4gICAgdGhpcy5kaWFsb2cub3BlbjxcbiAgICAgIFVwZGF0ZUtleVZhbHVlRGlhbG9nQ29tcG9uZW50PFQ+LFxuICAgICAgVXBkYXRlS2V5VmFsdWVEaWFsb2dEYXRhPFQ+XG4gICAgPihVcGRhdGVLZXlWYWx1ZURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YToge1xuICAgICAgICB0aXRsZTogYHVwZGF0ZV8ke3BhcnR9YCxcbiAgICAgICAga2V5VmFsdWVzLFxuICAgICAgICByZWFkb25seUtleXMsXG4gICAgICAgIHZhbGlkYXRvcjpcbiAgICAgICAgICBwYXJ0ID09PSAnbGFiZWxzJ1xuICAgICAgICAgICAgPyBrOHNSZXNvdXJjZUxhYmVsVmFsaWRhdG9yXG4gICAgICAgICAgICA6IGs4c1Jlc291cmNlQW5ub3RhdGlvblZhbGlkYXRvcixcbiAgICAgICAgZXJyb3JNYXBwZXI6XG4gICAgICAgICAgcGFydCA9PT0gJ2xhYmVscydcbiAgICAgICAgICAgID8gZ2V0SzhzUmVzb3VyY2VMYWJlbEVycm9yTWFwcGVyKHRoaXMudHJhbnNsYXRlKVxuICAgICAgICAgICAgOiBnZXRLOHNSZXNvdXJjZUFubm90YXRpb25FcnJvck1hcHBlcih0aGlzLnRyYW5zbGF0ZSksXG4gICAgICAgIHVwZGF0ZVN1Y2Nlc3NNc2c6IGB1cGRhdGVfJHtwYXJ0fV9zdWNjZWVkZWRgLFxuICAgICAgICB1cGRhdGVGYWlsTXNnOiBgdXBkYXRlXyR7cGFydH1fZmFpbGVkYCxcbiAgICAgICAgb25VcGRhdGU6IHJlc3VsdHMgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoZWNrZWRSZXN1bHRzID0gY2xvbmVEZWVwKHJlc3VsdHMpO1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGtleVZhbHVlcykpIHtcbiAgICAgICAgICAgIGlmICghKGtleSBpbiBjaGVja2VkUmVzdWx0cykpIHtcbiAgICAgICAgICAgICAgY2hlY2tlZFJlc3VsdHNba2V5XSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLms4c0FwaVtcbiAgICAgICAgICAgICdjbHVzdGVyJyBpbiBwYXJhbXMgJiYgcGFyYW1zLmNsdXN0ZXJcbiAgICAgICAgICAgICAgPyAncGF0Y2hSZXNvdXJjZSdcbiAgICAgICAgICAgICAgOiAncGF0Y2hHbG9iYWxSZXNvdXJjZSdcbiAgICAgICAgICBdKHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIFtwYXJ0XTogY2hlY2tlZFJlc3VsdHMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC4uLihnZXRSZXNvdXJjZVNwZWNcbiAgICAgICAgICAgICAgICA/IHsgc3BlYzogZ2V0UmVzb3VyY2VTcGVjKGNoZWNrZWRSZXN1bHRzKSB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLnBpcGUodGFwKChfcmVzb3VyY2U6IFQpID0+IHVwZGF0ZWQkJC5uZXh0KF9yZXNvdXJjZSkpKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmaXRWaWV3cG9ydDogdHJ1ZSxcbiAgICAgIGN1c3RvbUNsYXNzOiBkaWFsb2dDbGFzcyxcbiAgICB9KTtcbiAgICByZXR1cm4gdXBkYXRlZCQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgdXBkYXRlRGlzcGxheU5hbWU8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4oXG4gICAge1xuICAgICAgdHlwZSxcbiAgICAgIGNsdXN0ZXIsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIGRlZmluaXRpb24sXG4gICAgfToge1xuICAgICAgZGVmaW5pdGlvbj86IEs4c1Jlc291cmNlRGVmaW5pdGlvbjtcbiAgICAgIC8qKlxuICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIGBkZWZpbml0aW9uYCBpbnN0ZWFkXG4gICAgICAgKi9cbiAgICAgIHR5cGU/OiBSO1xuICAgICAgY2x1c3Rlcj86IHN0cmluZztcbiAgICAgIHJlc291cmNlOiBUO1xuICAgIH0sXG4gICAgdmFsaWRhdGVNYXhMZW5ndGggPSBmYWxzZSxcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFQ+KG9ic2VydmVyID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW48VXBkYXRlRGlzcGxheU5hbWVEaWFsb2dDb21wb25lbnQ8VD4+KFxuICAgICAgICBVcGRhdGVEaXNwbGF5TmFtZURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGRlZmluaXRpb24sXG4gICAgICAgICAgICByZXNvdXJjZSxcbiAgICAgICAgICAgIGNsdXN0ZXIsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgdmFsaWRhdGVNYXhMZW5ndGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSh1cGRhdGVkID0+IHtcbiAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHVwZGF0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlRGVzY3JpcHRpb248VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4oe1xuICAgIHR5cGUsXG4gICAgY2x1c3RlcixcbiAgICByZXNvdXJjZSxcbiAgICBkZWZpbml0aW9uLFxuICB9OiB7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGBkZWZpbml0aW9uYCBpbnN0ZWFkXG4gICAgICovXG4gICAgdHlwZT86IFI7XG4gICAgZGVmaW5pdGlvbj86IEs4c1Jlc291cmNlRGVmaW5pdGlvbjtcbiAgICBjbHVzdGVyPzogc3RyaW5nO1xuICAgIHJlc291cmNlOiBUO1xuICB9KSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFQ+KG9ic2VydmVyID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW48VXBkYXRlRGVzY3JpcHRpb25EaWFsb2dDb21wb25lbnQ8VD4+KFxuICAgICAgICBVcGRhdGVEZXNjcmlwdGlvbkRpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHJlc291cmNlLFxuICAgICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBkZWZpbml0aW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHVwZGF0ZWQgPT4ge1xuICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgIG9ic2VydmVyLm5leHQodXBkYXRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V6aG555uu57uR5a6a5YiH5o2i6Iez5aSa6aG555uu57uR5a6a5pe277yM5YW85a655LmL5YmN55qEIHByb2plY3QgbmFtZSDlvaLlvI9cbiAgICog6ICB5qC85byPIGNwYWFzLmlvL3Byb2plY3Q6IFwiQUxMX0FMTFwiIOaIluiAhSAgcHJvamVjdC5jcGFhcy5pby9uYW1lOiBcIkFMTF9BTExcIlxuICAgKiDmlrDmoLzlvI8gcHJvamVjdC5jcGFhcy5pby9BTExfQUxMOiBcInRydWVcIlxuICAgKiBAcGFyYW0geyhLdWJlcm5ldGVzUmVzb3VyY2UgfCBzdHJpbmdbXSl9IHJlc291cmNlXG4gICAqIEByZXR1cm5zXG4gICAqIEBtZW1iZXJvZiBLOHNVdGlsU2VydmljZVxuICAgKi9cbiAgZ2V0UHJvamVjdE5hbWVzKHJlc291cmNlOiBLdWJlcm5ldGVzUmVzb3VyY2UgfCBzdHJpbmdbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc291cmNlKSkge1xuICAgICAgcmV0dXJuIHJlc291cmNlO1xuICAgIH1cbiAgICBjb25zdCBwcm9qZWN0TGFiZWxQcmVmaXggPSBgJHtQUk9KRUNUfS4ke3RoaXMuYmFzZURvbWFpbn0vYDtcbiAgICBjb25zdCBsYWJlbHMgPSBnZXQocmVzb3VyY2UsIFtNRVRBREFUQSwgTEFCRUxTXSwge30pO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhsYWJlbHMpXG4gICAgICAucmVkdWNlPHN0cmluZ1tdPigoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHByb2plY3RMYWJlbFByZWZpeCkpIHtcbiAgICAgICAgICBjb25zdCBwcm9qZWN0TmFtZSA9IGtleS5zbGljZShwcm9qZWN0TGFiZWxQcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IFRSVUUpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKHByb2plY3ROYW1lKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb2plY3ROYW1lID09PSBOQU1FKSB7XG4gICAgICAgICAgICBhY2MucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gdGhpcy5ub3JtYWxpemVUeXBlKFBST0pFQ1QpKSB7XG4gICAgICAgICAgYWNjLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICBnZXRQcm9qZWN0TGFiZWxzKHByb2plY3RzOiBzdHJpbmdbXSwgdmFsdWUgPSBUUlVFKSB7XG4gICAgcmV0dXJuIHByb2plY3RzPy5yZWR1Y2U8U3RyaW5nTWFwPigoYWNjLCBwcm9qZWN0KSA9PiB7XG4gICAgICBpZiAocHJvamVjdCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICAgIFt0aGlzLm5vcm1hbGl6ZVR5cGUocHJvamVjdCwgUFJPSkVDVCldOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgfVxufVxuIl19