@alauda-fe/common
Version:
Alauda frontend team common codes.
101 lines • 19.1 kB
JavaScript
import { HttpEventType, } from '@angular/common/http';
import { inject } from '@angular/core';
import { map, switchMap } from 'rxjs';
import { TOKEN_RESOURCE_DEFINITIONS, compareVersion, parseJSONStream, } from '../core/public-api';
import { ClusterVersionService } from './cluster-version.service';
export class ApiCompatibleInterceptor {
constructor() {
this.clusterVersion = inject(ClusterVersionService);
}
intercept(req, next) {
const matchResult = this.matchUrl(req.url);
if (!matchResult.matched) {
return next.handle(req);
}
return this.clusterVersion.getClusterVersion(matchResult.cluster).pipe(switchMap(clusterVersion => {
const nextReq = this.executeRequestDowngrade(clusterVersion, req);
const nextReqBody = this.executeRequestBodyDowngrade(clusterVersion, nextReq.method, nextReq.body);
return next.handle(nextReq.clone({ body: nextReqBody })).pipe(map(event => {
if (event.type === HttpEventType.Response) {
return event.clone({
body: this.executeResponseBodyUpgrade(clusterVersion, nextReq.method, event.body),
});
}
// k8s watch api
if (isHttpDownloadProgressEvent(event) && event.partialText) {
return {
...event,
partialText: parseJSONStream(event.partialText)
.map(v => JSON.stringify({
...v,
object: this.executeResponseBodyUpgrade(clusterVersion, nextReq.method, v.object),
}))
.join('\n'),
};
}
return event;
}));
}));
}
executeRequestDowngrade(clusterVersion, req) {
return this.requestAdapters
.filter(adapter => !!adapter.requestDowngrade &&
compareVersion.lt(clusterVersion, adapter.clusterVersion) &&
(!adapter.httpMethods || adapter.httpMethods.includes(req.method)))
.sort((a, b) => compareVersion.lt(a.clusterVersion, b.clusterVersion) ? -1 : 1)
.reduceRight((nextReq, adapter) => adapter.requestDowngrade(nextReq), req);
}
executeRequestBodyDowngrade(clusterVersion, httpMethod, body) {
return this.requestAdapters
.filter(adapter => !!adapter.bodyDowngrade &&
compareVersion.lt(clusterVersion, adapter.clusterVersion) &&
(adapter.httpMethods || ['POST', 'PUT', 'PATCH']).includes(httpMethod))
.sort((a, b) => compareVersion.lt(a.clusterVersion, b.clusterVersion) ? -1 : 1)
.reduceRight((nextBody, adapter) => adapter.bodyDowngrade(nextBody), body);
}
executeResponseBodyUpgrade(clusterVersion, httpMethod, body) {
return this.responseAdapters
.filter(adapter => compareVersion.lt(clusterVersion, adapter.clusterVersion) &&
(adapter.httpMethods || ['GET', 'POST', 'PUT', 'PATCH']).includes(httpMethod))
.sort((a, b) => compareVersion.lt(a.clusterVersion, b.clusterVersion) ? -1 : 1)
.reduce((nextBody, adapter) => adapter.bodyUpgrade(nextBody), body);
}
}
export function k8sApiMatcher(resourceType) {
const resourceDefinitions = inject(TOKEN_RESOURCE_DEFINITIONS);
const define = typeof resourceType === 'string'
? resourceDefinitions[resourceType]
: resourceType;
const { apiGroup, apiVersion, type } = define;
if (!define) {
throw new TypeError(`Resource type '${resourceType}' is not defined`);
}
return (url) => {
const reg = new RegExp(`/kubernetes/([^/]+)/apis/${apiGroup}/${apiVersion}/(?:namespaces/[^/]+/)?${type}`);
const matched = url.match(reg);
return matched
? {
matched: true,
cluster: matched[1],
}
: { matched: false };
};
}
export function k8sResourceOrList(mapper) {
return (res) => {
if (isK8SResourceList(res)) {
return {
...res,
items: res.items.map(mapper),
};
}
return mapper(res);
};
}
function isK8SResourceList(res) {
return 'items' in res && Array.isArray(res.items);
}
function isHttpDownloadProgressEvent(event) {
return event.type === HttpEventType.DownloadProgress;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNvbXBhdGlibGUuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvYXBpL2FwaS1jb21wYXRpYmxlLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxhQUFhLEdBSWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBYyxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxELE9BQU8sRUFHTCwwQkFBMEIsRUFDMUIsY0FBYyxFQUNkLGVBQWUsR0FDaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdsRSxNQUFNLE9BQWdCLHdCQUF3QjtJQUE5QztRQUtZLG1CQUFjLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUF5SDNELENBQUM7SUF2SEMsU0FBUyxDQUNQLEdBQXlCLEVBQ3pCLElBQWlCO1FBRWpCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDcEUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFD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QUFTLDJCQUEyQixDQUNsQyxLQUFtQjtJQUVuQixPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLGdCQUFnQixDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBIdHRwRG93bmxvYWRQcm9ncmVzc0V2ZW50LFxuICBIdHRwRXZlbnQsXG4gIEh0dHBFdmVudFR5cGUsXG4gIEh0dHBIYW5kbGVyLFxuICBIdHRwSW50ZXJjZXB0b3IsXG4gIEh0dHBSZXF1ZXN0LFxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIEt1YmVybmV0ZXNSZXNvdXJjZSxcbiAgS3ViZXJuZXRlc1Jlc291cmNlTGlzdCxcbiAgVE9LRU5fUkVTT1VSQ0VfREVGSU5JVElPTlMsXG4gIGNvbXBhcmVWZXJzaW9uLFxuICBwYXJzZUpTT05TdHJlYW0sXG59IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5cbmltcG9ydCB7IENsdXN0ZXJWZXJzaW9uU2VydmljZSB9IGZyb20gJy4vY2x1c3Rlci12ZXJzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSzhzUmVzb3VyY2VEZWZpbml0aW9uLCBXYXRjaEFQSVJlc3BvbnNlIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBcGlDb21wYXRpYmxlSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICBhYnN0cmFjdCBtYXRjaFVybChyZXE6IHN0cmluZyk6IE1hdGNoUmVzdWx0O1xuICBhYnN0cmFjdCByZXNwb25zZUFkYXB0ZXJzOiBSZXNwb25zZUFkYXB0ZXJbXTtcbiAgYWJzdHJhY3QgcmVxdWVzdEFkYXB0ZXJzOiBSZXF1ZXN0QWRhcHRlcltdO1xuXG4gIHByb3RlY3RlZCBjbHVzdGVyVmVyc2lvbiA9IGluamVjdChDbHVzdGVyVmVyc2lvblNlcnZpY2UpO1xuXG4gIGludGVyY2VwdChcbiAgICByZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+LFxuICAgIG5leHQ6IEh0dHBIYW5kbGVyLFxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gdGhpcy5tYXRjaFVybChyZXEudXJsKTtcblxuICAgIGlmICghbWF0Y2hSZXN1bHQubWF0Y2hlZCkge1xuICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2x1c3RlclZlcnNpb24uZ2V0Q2x1c3RlclZlcnNpb24obWF0Y2hSZXN1bHQuY2x1c3RlcikucGlwZShcbiAgICAgIHN3aXRjaE1hcChjbHVzdGVyVmVyc2lvbiA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRSZXEgPSB0aGlzLmV4ZWN1dGVSZXF1ZXN0RG93bmdyYWRlKGNsdXN0ZXJWZXJzaW9uLCByZXEpO1xuICAgICAgICBjb25zdCBuZXh0UmVxQm9keSA9IHRoaXMuZXhlY3V0ZVJlcXVlc3RCb2R5RG93bmdyYWRlKFxuICAgICAgICAgIGNsdXN0ZXJWZXJzaW9uLFxuICAgICAgICAgIG5leHRSZXEubWV0aG9kLFxuICAgICAgICAgIG5leHRSZXEuYm9keSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKG5leHRSZXEuY2xvbmUoeyBib2R5OiBuZXh0UmVxQm9keSB9KSkucGlwZShcbiAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmNsb25lKHtcbiAgICAgICAgICAgICAgICBib2R5OiB0aGlzLmV4ZWN1dGVSZXNwb25zZUJvZHlVcGdyYWRlKFxuICAgICAgICAgICAgICAgICAgY2x1c3RlclZlcnNpb24sXG4gICAgICAgICAgICAgICAgICBuZXh0UmVxLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmJvZHksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGs4cyB3YXRjaCBhcGlcbiAgICAgICAgICAgIGlmIChpc0h0dHBEb3dubG9hZFByb2dyZXNzRXZlbnQoZXZlbnQpICYmIGV2ZW50LnBhcnRpYWxUZXh0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgICAgICAgcGFydGlhbFRleHQ6IHBhcnNlSlNPTlN0cmVhbTxXYXRjaEFQSVJlc3BvbnNlPHVua25vd24+PihcbiAgICAgICAgICAgICAgICAgIGV2ZW50LnBhcnRpYWxUZXh0LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5tYXAodiA9PlxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgLi4udixcbiAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHRoaXMuZXhlY3V0ZVJlc3BvbnNlQm9keVVwZ3JhZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZXEubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgdi5vYmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAuam9pbignXFxuJyksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVSZXF1ZXN0RG93bmdyYWRlKFxuICAgIGNsdXN0ZXJWZXJzaW9uOiBzdHJpbmcsXG4gICAgcmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPixcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEFkYXB0ZXJzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICBhZGFwdGVyID0+XG4gICAgICAgICAgISFhZGFwdGVyLnJlcXVlc3REb3duZ3JhZGUgJiZcbiAgICAgICAgICBjb21wYXJlVmVyc2lvbi5sdChjbHVzdGVyVmVyc2lvbiwgYWRhcHRlci5jbHVzdGVyVmVyc2lvbikgJiZcbiAgICAgICAgICAoIWFkYXB0ZXIuaHR0cE1ldGhvZHMgfHwgYWRhcHRlci5odHRwTWV0aG9kcy5pbmNsdWRlcyhyZXEubWV0aG9kKSksXG4gICAgICApXG4gICAgICAuc29ydCgoYSwgYikgPT5cbiAgICAgICAgY29tcGFyZVZlcnNpb24ubHQoYS5jbHVzdGVyVmVyc2lvbiwgYi5jbHVzdGVyVmVyc2lvbikgPyAtMSA6IDEsXG4gICAgICApXG4gICAgICAucmVkdWNlUmlnaHQoXG4gICAgICAgIChuZXh0UmVxLCBhZGFwdGVyKSA9PiBhZGFwdGVyLnJlcXVlc3REb3duZ3JhZGUobmV4dFJlcSksXG4gICAgICAgIHJlcSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVSZXF1ZXN0Qm9keURvd25ncmFkZShcbiAgICBjbHVzdGVyVmVyc2lvbjogc3RyaW5nLFxuICAgIGh0dHBNZXRob2Q6IHN0cmluZyxcbiAgICBib2R5OiB1bmtub3duLFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0QWRhcHRlcnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIGFkYXB0ZXIgPT5cbiAgICAgICAgICAhIWFkYXB0ZXIuYm9keURvd25ncmFkZSAmJlxuICAgICAgICAgIGNvbXBhcmVWZXJzaW9uLmx0KGNsdXN0ZXJWZXJzaW9uLCBhZGFwdGVyLmNsdXN0ZXJWZXJzaW9uKSAmJlxuICAgICAgICAgIChhZGFwdGVyLmh0dHBNZXRob2RzIHx8IFsnUE9TVCcsICdQVVQnLCAnUEFUQ0gnXSkuaW5jbHVkZXMoXG4gICAgICAgICAgICBodHRwTWV0aG9kLFxuICAgICAgICAgICksXG4gICAgICApXG4gICAgICAuc29ydCgoYSwgYikgPT5cbiAgICAgICAgY29tcGFyZVZlcnNpb24ubHQoYS5jbHVzdGVyVmVyc2lvbiwgYi5jbHVzdGVyVmVyc2lvbikgPyAtMSA6IDEsXG4gICAgICApXG4gICAgICAucmVkdWNlUmlnaHQoXG4gICAgICAgIChuZXh0Qm9keSwgYWRhcHRlcikgPT4gYWRhcHRlci5ib2R5RG93bmdyYWRlKG5leHRCb2R5KSxcbiAgICAgICAgYm9keSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVSZXNwb25zZUJvZHlVcGdyYWRlKFxuICAgIGNsdXN0ZXJWZXJzaW9uOiBzdHJpbmcsXG4gICAgaHR0cE1ldGhvZDogc3RyaW5nLFxuICAgIGJvZHk6IHVua25vd24sXG4gICk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlQWRhcHRlcnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIGFkYXB0ZXIgPT5cbiAgICAgICAgICBjb21wYXJlVmVyc2lvbi5sdChjbHVzdGVyVmVyc2lvbiwgYWRhcHRlci5jbHVzdGVyVmVyc2lvbikgJiZcbiAgICAgICAgICAoYWRhcHRlci5odHRwTWV0aG9kcyB8fCBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdQQVRDSCddKS5pbmNsdWRlcyhcbiAgICAgICAgICAgIGh0dHBNZXRob2QsXG4gICAgICAgICAgKSxcbiAgICAgIClcbiAgICAgIC5zb3J0KChhLCBiKSA9PlxuICAgICAgICBjb21wYXJlVmVyc2lvbi5sdChhLmNsdXN0ZXJWZXJzaW9uLCBiLmNsdXN0ZXJWZXJzaW9uKSA/IC0xIDogMSxcbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKG5leHRCb2R5LCBhZGFwdGVyKSA9PiBhZGFwdGVyLmJvZHlVcGdyYWRlKG5leHRCb2R5KSwgYm9keSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEFkYXB0ZXIge1xuICBjbHVzdGVyVmVyc2lvbjogc3RyaW5nO1xuICBodHRwTWV0aG9kcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXIge1xuICBib2R5VXBncmFkZTogKGJvZHk6IHVua25vd24pID0+IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyIHtcbiAgYm9keURvd25ncmFkZT86IChib2R5OiB1bmtub3duKSA9PiB1bmtub3duO1xuICByZXF1ZXN0RG93bmdyYWRlPzogKHJlcTogSHR0cFJlcXVlc3Q8dW5rbm93bj4pID0+IEh0dHBSZXF1ZXN0PHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGNoUmVzdWx0IHtcbiAgbWF0Y2hlZDogYm9vbGVhbjtcbiAgY2x1c3Rlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGs4c0FwaU1hdGNoZXIocmVzb3VyY2VUeXBlOiBzdHJpbmcgfCBLOHNSZXNvdXJjZURlZmluaXRpb24pIHtcbiAgY29uc3QgcmVzb3VyY2VEZWZpbml0aW9ucyA9IGluamVjdChUT0tFTl9SRVNPVVJDRV9ERUZJTklUSU9OUyk7XG4gIGNvbnN0IGRlZmluZSA9XG4gICAgdHlwZW9mIHJlc291cmNlVHlwZSA9PT0gJ3N0cmluZydcbiAgICAgID8gcmVzb3VyY2VEZWZpbml0aW9uc1tyZXNvdXJjZVR5cGVdXG4gICAgICA6IHJlc291cmNlVHlwZTtcblxuICBjb25zdCB7IGFwaUdyb3VwLCBhcGlWZXJzaW9uLCB0eXBlIH0gPSBkZWZpbmU7XG5cbiAgaWYgKCFkZWZpbmUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSZXNvdXJjZSB0eXBlICcke3Jlc291cmNlVHlwZX0nIGlzIG5vdCBkZWZpbmVkYCk7XG4gIH1cblxuICByZXR1cm4gKHVybDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVnID0gbmV3IFJlZ0V4cChcbiAgICAgIGAva3ViZXJuZXRlcy8oW14vXSspL2FwaXMvJHthcGlHcm91cH0vJHthcGlWZXJzaW9ufS8oPzpuYW1lc3BhY2VzL1teL10rLyk/JHt0eXBlfWAsXG4gICAgKTtcbiAgICBjb25zdCBtYXRjaGVkID0gdXJsLm1hdGNoKHJlZyk7XG5cbiAgICByZXR1cm4gbWF0Y2hlZFxuICAgICAgPyB7XG4gICAgICAgICAgbWF0Y2hlZDogdHJ1ZSxcbiAgICAgICAgICBjbHVzdGVyOiBtYXRjaGVkWzFdLFxuICAgICAgICB9XG4gICAgICA6IHsgbWF0Y2hlZDogZmFsc2UgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGs4c1Jlc291cmNlT3JMaXN0KFxuICBtYXBwZXI6IChyZXM6IEt1YmVybmV0ZXNSZXNvdXJjZSkgPT4gS3ViZXJuZXRlc1Jlc291cmNlLFxuKSB7XG4gIHJldHVybiAocmVzOiBLdWJlcm5ldGVzUmVzb3VyY2UgfCBLdWJlcm5ldGVzUmVzb3VyY2VMaXN0KSA9PiB7XG4gICAgaWYgKGlzSzhTUmVzb3VyY2VMaXN0KHJlcykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnJlcyxcbiAgICAgICAgaXRlbXM6IHJlcy5pdGVtcy5tYXAobWFwcGVyKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBtYXBwZXIocmVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNLOFNSZXNvdXJjZUxpc3QoXG4gIHJlczogS3ViZXJuZXRlc1Jlc291cmNlIHwgS3ViZXJuZXRlc1Jlc291cmNlTGlzdCxcbik6IHJlcyBpcyBLdWJlcm5ldGVzUmVzb3VyY2VMaXN0IHtcbiAgcmV0dXJuICdpdGVtcycgaW4gcmVzICYmIEFycmF5LmlzQXJyYXkocmVzLml0ZW1zKTtcbn1cblxuZnVuY3Rpb24gaXNIdHRwRG93bmxvYWRQcm9ncmVzc0V2ZW50PFQgPSB1bmtub3duPihcbiAgZXZlbnQ6IEh0dHBFdmVudDxUPixcbik6IGV2ZW50IGlzIEh0dHBEb3dubG9hZFByb2dyZXNzRXZlbnQge1xuICByZXR1cm4gZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzO1xufVxuIl19