Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_000076
T

240 lines
29 KiB
Plaintext

import { isString, uniq, uniqBy } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
export const ViewerResourceType = {
Model: 'Model',
Object: 'Object',
ModelFolder: 'ModelFolder',
AllModels: 'all-models'
};
export class ViewerAllModelsResource {
type = ViewerResourceType.AllModels;
toString() {
return 'all';
}
}
export class ViewerModelResource {
type;
modelId;
versionId;
constructor(modelId, versionId) {
this.type = ViewerResourceType.Model;
this.modelId = modelId.toLowerCase();
this.versionId = versionId?.toLowerCase();
}
toString() {
return (this.versionId ? `${this.modelId}@${this.versionId}` : this.modelId).toLowerCase();
}
}
export class ViewerVersionResource extends ViewerModelResource {
versionId;
constructor(modelId, versionId) {
super(modelId, versionId);
this.versionId = versionId?.toLowerCase();
}
toJSON() {
return this.toString();
}
}
export class ViewerObjectResource {
type;
objectId;
constructor(objectId) {
this.type = ViewerResourceType.Object;
this.objectId = objectId.toLowerCase();
}
toString() {
return this.objectId.toLowerCase();
}
}
export class ViewerModelFolderResource {
type;
folderName;
constructor(folderName) {
this.type = ViewerResourceType.ModelFolder;
this.folderName = folderName;
}
toString() {
return '$' + this.folderName;
}
}
export const parseResourceFromString = (resourceId) => {
if (resourceId === 'all') {
return new ViewerAllModelsResource();
}
else if (resourceId.includes('@')) {
const [modelId, versionId] = resourceId.split('@');
return new ViewerVersionResource(modelId, versionId);
}
else if (resourceId.startsWith('$')) {
return new ViewerModelFolderResource(resourceId.substring(1));
}
else if (resourceId.length === 32) {
return new ViewerObjectResource(resourceId);
}
else {
return new ViewerModelResource(resourceId);
}
};
export function parseUrlParameters(resourceGetParam) {
if (!resourceGetParam?.length)
return [];
const parts = resourceGetParam
.split(',')
.filter((i) => i.trim().length)
.sort();
const resources = [];
for (const part of parts) {
const resource = parseResourceFromString(part);
if (resource) {
resources.push(resource);
}
}
// Remove duplicates
return uniqBy(resources, (r) => r.toString());
}
export function createGetParamFromResources(resources) {
const resourceParts = uniq(resources.map((r) => r.toString())).sort();
return resourceParts.join(',');
}
export const isAllModelsResource = (r) => r.type === ViewerResourceType.AllModels;
export const isModelResource = (r) => r.type === ViewerResourceType.Model;
export const isObjectResource = (r) => r.type === ViewerResourceType.Object;
export const isModelFolderResource = (r) => r.type === ViewerResourceType.ModelFolder;
const toViewerResourceArray = (res) => {
if (res instanceof ViewerResourceBuilder) {
return res.toResources();
}
const fixString = (r) => isString(r) ? parseUrlParameters(r) : [r];
if (Array.isArray(res)) {
return res.flatMap(fixString);
}
else {
return fixString(res);
}
};
class ViewerResourceBuilder {
#resources = [];
#order() {
this.#resources = uniq(this.#resources).sort();
}
addAllModels() {
this.#resources.push(new ViewerAllModelsResource());
this.#order();
return this;
}
addModel(modelId, versionId) {
this.#resources.push(new ViewerModelResource(modelId, versionId));
this.#order();
return this;
}
addModelFolder(folderName) {
this.#resources.push(new ViewerModelFolderResource(folderName));
this.#order();
return this;
}
addObject(objectId) {
this.#resources.push(new ViewerObjectResource(objectId));
this.#order();
return this;
}
/**
* @deprecated Use 'addResources' or 'addNew' instead
*/
addFromString(stringResources) {
const strings = Array.isArray(stringResources) ? stringResources : [stringResources];
for (const resourceIdString of strings) {
const resources = parseUrlParameters(resourceIdString.toLowerCase());
this.#resources.push(...resources);
}
this.#order();
return this;
}
addResources(res) {
this.#resources.push(...toViewerResourceArray(res));
this.#order();
return this;
}
/**
* Only add those resources that are not already in the builder.
*/
addNew(incoming, options) {
const { requireExactMatch = false } = options || {};
const resources = toViewerResourceArray(incoming);
const newResources = this.#resources.slice();
for (const resource of resources) {
// check if newResources has a resource w/ same modelId (check w/ isModelResource)
if (isModelResource(resource) && !requireExactMatch) {
const existing = newResources.find((r) => isModelResource(r) && r.modelId === resource.modelId);
if (!existing) {
newResources.push(resource);
}
}
else if (!newResources.some((r) => r.toString() === resource.toString())) {
newResources.push(resource);
}
}
this.#resources = newResources;
this.#order();
return this;
}
toString() {
return createGetParamFromResources(this.#resources);
}
toResources() {
return this.#resources.slice();
}
toResourceIds() {
return this.toResources().map((r) => r.toString());
}
clear() {
this.#resources = [];
return this;
}
clone() {
const clone = new ViewerResourceBuilder();
const resources = this.toString();
clone.addResources(resources);
return clone;
}
get length() {
return this.#resources.length;
}
/**
* Remove specified versionIds from any model resources
*/
clearVersions() {
this.#resources.forEach((r) => {
if (!isModelResource(r))
return;
r.versionId = undefined;
});
return this;
}
isEqualTo(resource) {
const incomingBuilder = resourceBuilder().addResources(resource);
return this.toString() === incomingBuilder.toString();
}
forEach(callback) {
this.#resources.forEach(callback);
return this;
}
filter(callback) {
return this.#resources.filter(callback);
}
find(callback) {
return this.#resources.find(callback);
}
map(callback) {
return this.#resources.map(callback);
}
[Symbol.iterator]() {
return this.#resources[Symbol.iterator]();
}
}
/**
* Fluent API for easier resource building
*/
export function resourceBuilder() {
return new ViewerResourceBuilder();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdmlld2VyL2hlbHBlcnMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBRWhELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFVO0lBQ3ZDLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsU0FBUyxFQUFFLFlBQVk7Q0FDeEIsQ0FBQTtBQVNELE1BQU0sT0FBTyx1QkFBdUI7SUFDM0IsSUFBSSxHQUF1QixrQkFBa0IsQ0FBQyxTQUFTLENBQUE7SUFFOUQsUUFBUTtRQUNOLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLG1CQUFtQjtJQUN2QixJQUFJLENBQW9CO0lBQ3hCLE9BQU8sQ0FBUTtJQUNmLFNBQVMsQ0FBUztJQUV6QixZQUFZLE9BQWUsRUFBRSxTQUFrQjtRQUM3QyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQTtRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQTtJQUMzQyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sQ0FDTCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUNwRSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ2pCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxtQkFBbUI7SUFDckQsU0FBUyxDQUFRO0lBRXhCLFlBQVksT0FBZSxFQUFFLFNBQWlCO1FBQzVDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUE7SUFDM0MsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sb0JBQW9CO0lBQ3hCLElBQUksQ0FBb0I7SUFDeEIsUUFBUSxDQUFRO0lBRXZCLFlBQVksUUFBZ0I7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUE7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDeEMsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEMsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHlCQUF5QjtJQUM3QixJQUFJLENBQW9CO0lBQ3hCLFVBQVUsQ0FBUTtJQUV6QixZQUFZLFVBQWtCO1FBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFBO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO0lBQzlCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQTtJQUM5QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLFVBQWtCLEVBQWtCLEVBQUU7SUFDNUUsSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFJLHVCQUF1QixFQUFFLENBQUE7SUFDdEMsQ0FBQztTQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNsRCxPQUFPLElBQUkscUJBQXFCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3RELENBQUM7U0FBTSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLElBQUkseUJBQXlCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7U0FBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDcEMsT0FBTyxJQUFJLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzdDLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxJQUFJLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzVDLENBQUM7QUFDSCxDQUFDLENBQUE7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsZ0JBQXdCO0lBQ3pELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFDeEMsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCO1NBQzNCLEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUM7U0FDOUIsSUFBSSxFQUFFLENBQUE7SUFDVCxNQUFNLFNBQVMsR0FBcUIsRUFBRSxDQUFBO0lBQ3RDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsT0FBTyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtBQUMvQyxDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUFDLFNBQTJCO0lBQ3JFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3JFLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNoQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFpQixFQUFnQyxFQUFFLENBQ3JGLENBQUMsQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsU0FBUyxDQUFBO0FBRXpDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQWlCLEVBQTRCLEVBQUUsQ0FDN0UsQ0FBQyxDQUFDLElBQUksS0FBSyxrQkFBa0IsQ0FBQyxLQUFLLENBQUE7QUFFckMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFpQixFQUE2QixFQUFFLENBQy9FLENBQUMsQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsTUFBTSxDQUFBO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQ25DLENBQWlCLEVBQ2UsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsV0FBVyxDQUFBO0FBUzlFLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxHQUEwQixFQUFvQixFQUFFO0lBQzdFLElBQUksR0FBRyxZQUFZLHFCQUFxQixFQUFFLENBQUM7UUFDekMsT0FBTyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDMUIsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBMEIsRUFBb0IsRUFBRSxDQUNqRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRTNDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUMvQixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3ZCLENBQUM7QUFDSCxDQUFDLENBQUE7QUFFRCxNQUFNLHFCQUFxQjtJQUN6QixVQUFVLEdBQXFCLEVBQUUsQ0FBQTtJQUVqQyxNQUFNO1FBQ0osSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ2hELENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSx1QkFBdUIsRUFBRSxDQUFDLENBQUE7UUFDbkQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ2IsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsUUFBUSxDQUFDLE9BQWUsRUFBRSxTQUFrQjtRQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBQ2pFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUNiLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUNELGNBQWMsQ0FBQyxVQUFrQjtRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7UUFDL0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ2IsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsU0FBUyxDQUFDLFFBQWdCO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUN4RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDYixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFDRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxlQUE0QztRQUN4RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDcEYsS0FBSyxNQUFNLGdCQUFnQixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7WUFDcEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQTtRQUNwQyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ2IsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsWUFBWSxDQUFDLEdBQTBCO1FBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDYixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FDSixRQUErQixFQUMvQixPQU1DO1FBRUQsTUFBTSxFQUFFLGlCQUFpQixHQUFHLEtBQUssRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFDbkQsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFakQsTUFBTSxZQUFZLEdBQXFCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDOUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxrRkFBa0Y7WUFDbEYsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNwRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUNoQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLE9BQU8sQ0FDNUQsQ0FBQTtnQkFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDN0IsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUMzRSxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUE7UUFDOUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBRWIsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFDRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFDRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUNwRCxDQUFDO0lBQ0QsS0FBSztRQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBQ3BCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUNELEtBQUs7UUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUE7UUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQ2pDLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDN0IsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQTtJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFNO1lBQy9CLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQ3pCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsU0FBUyxDQUFDLFFBQStCO1FBQ3ZDLE1BQU0sZUFBZSxHQUFHLGVBQWUsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoRSxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDdkQsQ0FBQztJQUVELE9BQU8sQ0FBQyxRQUE0QztRQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqQyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFNRCxNQUFNLENBQUMsUUFBK0M7UUFDcEQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBTUQsSUFBSSxDQUFDLFFBQStDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUNELEdBQUcsQ0FBSSxRQUF5QztRQUM5QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFDRCxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUE7SUFDM0MsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZTtJQUM3QixPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQTtBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNTdHJpbmcsIHVuaXEsIHVuaXFCeSB9IGZyb20gJyNsb2Rhc2gnXHJcblxyXG5leHBvcnQgY29uc3QgVmlld2VyUmVzb3VyY2VUeXBlID0gPGNvbnN0PntcclxuICBNb2RlbDogJ01vZGVsJyxcclxuICBPYmplY3Q6ICdPYmplY3QnLFxyXG4gIE1vZGVsRm9sZGVyOiAnTW9kZWxGb2xkZXInLFxyXG4gIEFsbE1vZGVsczogJ2FsbC1tb2RlbHMnXHJcbn1cclxuZXhwb3J0IHR5cGUgVmlld2VyUmVzb3VyY2VUeXBlID1cclxuICAodHlwZW9mIFZpZXdlclJlc291cmNlVHlwZSlba2V5b2YgdHlwZW9mIFZpZXdlclJlc291cmNlVHlwZV1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmlld2VyUmVzb3VyY2Uge1xyXG4gIHR5cGU6IFZpZXdlclJlc291cmNlVHlwZVxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVmlld2VyQWxsTW9kZWxzUmVzb3VyY2UgaW1wbGVtZW50cyBWaWV3ZXJSZXNvdXJjZSB7XHJcbiAgcHVibGljIHR5cGU6IFZpZXdlclJlc291cmNlVHlwZSA9IFZpZXdlclJlc291cmNlVHlwZS5BbGxNb2RlbHNcclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAnYWxsJ1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFZpZXdlck1vZGVsUmVzb3VyY2UgaW1wbGVtZW50cyBWaWV3ZXJSZXNvdXJjZSB7XHJcbiAgcHVibGljIHR5cGU6IFZpZXdlclJlc291cmNlVHlwZVxyXG4gIHB1YmxpYyBtb2RlbElkOiBzdHJpbmdcclxuICBwdWJsaWMgdmVyc2lvbklkPzogc3RyaW5nXHJcblxyXG4gIGNvbnN0cnVjdG9yKG1vZGVsSWQ6IHN0cmluZywgdmVyc2lvbklkPzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnR5cGUgPSBWaWV3ZXJSZXNvdXJjZVR5cGUuTW9kZWxcclxuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQudG9Mb3dlckNhc2UoKVxyXG4gICAgdGhpcy52ZXJzaW9uSWQgPSB2ZXJzaW9uSWQ/LnRvTG93ZXJDYXNlKClcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLnZlcnNpb25JZCA/IGAke3RoaXMubW9kZWxJZH1AJHt0aGlzLnZlcnNpb25JZH1gIDogdGhpcy5tb2RlbElkXHJcbiAgICApLnRvTG93ZXJDYXNlKClcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBWaWV3ZXJWZXJzaW9uUmVzb3VyY2UgZXh0ZW5kcyBWaWV3ZXJNb2RlbFJlc291cmNlIHtcclxuICBwdWJsaWMgdmVyc2lvbklkOiBzdHJpbmdcclxuXHJcbiAgY29uc3RydWN0b3IobW9kZWxJZDogc3RyaW5nLCB2ZXJzaW9uSWQ6IHN0cmluZykge1xyXG4gICAgc3VwZXIobW9kZWxJZCwgdmVyc2lvbklkKVxyXG4gICAgdGhpcy52ZXJzaW9uSWQgPSB2ZXJzaW9uSWQ/LnRvTG93ZXJDYXNlKClcclxuICB9XHJcblxyXG4gIHRvSlNPTigpIHtcclxuICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKClcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBWaWV3ZXJPYmplY3RSZXNvdXJjZSBpbXBsZW1lbnRzIFZpZXdlclJlc291cmNlIHtcclxuICBwdWJsaWMgdHlwZTogVmlld2VyUmVzb3VyY2VUeXBlXHJcbiAgcHVibGljIG9iamVjdElkOiBzdHJpbmdcclxuXHJcbiAgY29uc3RydWN0b3Iob2JqZWN0SWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy50eXBlID0gVmlld2VyUmVzb3VyY2VUeXBlLk9iamVjdFxyXG4gICAgdGhpcy5vYmplY3RJZCA9IG9iamVjdElkLnRvTG93ZXJDYXNlKClcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3RJZC50b0xvd2VyQ2FzZSgpXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVmlld2VyTW9kZWxGb2xkZXJSZXNvdXJjZSBpbXBsZW1lbnRzIFZpZXdlclJlc291cmNlIHtcclxuICBwdWJsaWMgdHlwZTogVmlld2VyUmVzb3VyY2VUeXBlXHJcbiAgcHVibGljIGZvbGRlck5hbWU6IHN0cmluZ1xyXG5cclxuICBjb25zdHJ1Y3Rvcihmb2xkZXJOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudHlwZSA9IFZpZXdlclJlc291cmNlVHlwZS5Nb2RlbEZvbGRlclxyXG4gICAgdGhpcy5mb2xkZXJOYW1lID0gZm9sZGVyTmFtZVxyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAnJCcgKyB0aGlzLmZvbGRlck5hbWVcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBwYXJzZVJlc291cmNlRnJvbVN0cmluZyA9IChyZXNvdXJjZUlkOiBzdHJpbmcpOiBWaWV3ZXJSZXNvdXJjZSA9PiB7XHJcbiAgaWYgKHJlc291cmNlSWQgPT09ICdhbGwnKSB7XHJcbiAgICByZXR1cm4gbmV3IFZpZXdlckFsbE1vZGVsc1Jlc291cmNlKClcclxuICB9IGVsc2UgaWYgKHJlc291cmNlSWQuaW5jbHVkZXMoJ0AnKSkge1xyXG4gICAgY29uc3QgW21vZGVsSWQsIHZlcnNpb25JZF0gPSByZXNvdXJjZUlkLnNwbGl0KCdAJylcclxuICAgIHJldHVybiBuZXcgVmlld2VyVmVyc2lvblJlc291cmNlKG1vZGVsSWQsIHZlcnNpb25JZClcclxuICB9IGVsc2UgaWYgKHJlc291cmNlSWQuc3RhcnRzV2l0aCgnJCcpKSB7XHJcbiAgICByZXR1cm4gbmV3IFZpZXdlck1vZGVsRm9sZGVyUmVzb3VyY2UocmVzb3VyY2VJZC5zdWJzdHJpbmcoMSkpXHJcbiAgfSBlbHNlIGlmIChyZXNvdXJjZUlkLmxlbmd0aCA9PT0gMzIpIHtcclxuICAgIHJldHVybiBuZXcgVmlld2VyT2JqZWN0UmVzb3VyY2UocmVzb3VyY2VJZClcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIG5ldyBWaWV3ZXJNb2RlbFJlc291cmNlKHJlc291cmNlSWQpXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxQYXJhbWV0ZXJzKHJlc291cmNlR2V0UGFyYW06IHN0cmluZykge1xyXG4gIGlmICghcmVzb3VyY2VHZXRQYXJhbT8ubGVuZ3RoKSByZXR1cm4gW11cclxuICBjb25zdCBwYXJ0cyA9IHJlc291cmNlR2V0UGFyYW1cclxuICAgIC5zcGxpdCgnLCcpXHJcbiAgICAuZmlsdGVyKChpKSA9PiBpLnRyaW0oKS5sZW5ndGgpXHJcbiAgICAuc29ydCgpXHJcbiAgY29uc3QgcmVzb3VyY2VzOiBWaWV3ZXJSZXNvdXJjZVtdID0gW11cclxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcclxuICAgIGNvbnN0IHJlc291cmNlID0gcGFyc2VSZXNvdXJjZUZyb21TdHJpbmcocGFydClcclxuICAgIGlmIChyZXNvdXJjZSkge1xyXG4gICAgICByZXNvdXJjZXMucHVzaChyZXNvdXJjZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFJlbW92ZSBkdXBsaWNhdGVzXHJcbiAgcmV0dXJuIHVuaXFCeShyZXNvdXJjZXMsIChyKSA9PiByLnRvU3RyaW5nKCkpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHZXRQYXJhbUZyb21SZXNvdXJjZXMocmVzb3VyY2VzOiBWaWV3ZXJSZXNvdXJjZVtdKSB7XHJcbiAgY29uc3QgcmVzb3VyY2VQYXJ0cyA9IHVuaXEocmVzb3VyY2VzLm1hcCgocikgPT4gci50b1N0cmluZygpKSkuc29ydCgpXHJcbiAgcmV0dXJuIHJlc291cmNlUGFydHMuam9pbignLCcpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc0FsbE1vZGVsc1Jlc291cmNlID0gKHI6IFZpZXdlclJlc291cmNlKTogciBpcyBWaWV3ZXJBbGxNb2RlbHNSZXNvdXJjZSA9PlxyXG4gIHIudHlwZSA9PT0gVmlld2VyUmVzb3VyY2VUeXBlLkFsbE1vZGVsc1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzTW9kZWxSZXNvdXJjZSA9IChyOiBWaWV3ZXJSZXNvdXJjZSk6IHIgaXMgVmlld2VyTW9kZWxSZXNvdXJjZSA9PlxyXG4gIHIudHlwZSA9PT0gVmlld2VyUmVzb3VyY2VUeXBlLk1vZGVsXHJcblxyXG5leHBvcnQgY29uc3QgaXNPYmplY3RSZXNvdXJjZSA9IChyOiBWaWV3ZXJSZXNvdXJjZSk6IHIgaXMgVmlld2VyT2JqZWN0UmVzb3VyY2UgPT5cclxuICByLnR5cGUgPT09IFZpZXdlclJlc291cmNlVHlwZS5PYmplY3RcclxuXHJcbmV4cG9ydCBjb25zdCBpc01vZGVsRm9sZGVyUmVzb3VyY2UgPSAoXHJcbiAgcjogVmlld2VyUmVzb3VyY2VcclxuKTogciBpcyBWaWV3ZXJNb2RlbEZvbGRlclJlc291cmNlID0+IHIudHlwZSA9PT0gVmlld2VyUmVzb3VyY2VUeXBlLk1vZGVsRm9sZGVyXHJcblxyXG50eXBlIFN0cmluZ1ZpZXdlclJlc291cmNlc1RhcmdldCA9IHN0cmluZyB8IHN0cmluZ1tdXHJcbmV4cG9ydCB0eXBlIFZpZXdlclJlc291cmNlc1RhcmdldCA9XHJcbiAgfCBWaWV3ZXJSZXNvdXJjZUJ1aWxkZXJcclxuICB8IFZpZXdlclJlc291cmNlW11cclxuICB8IFZpZXdlclJlc291cmNlXHJcbiAgfCBTdHJpbmdWaWV3ZXJSZXNvdXJjZXNUYXJnZXRcclxuXHJcbmNvbnN0IHRvVmlld2VyUmVzb3VyY2VBcnJheSA9IChyZXM6IFZpZXdlclJlc291cmNlc1RhcmdldCk6IFZpZXdlclJlc291cmNlW10gPT4ge1xyXG4gIGlmIChyZXMgaW5zdGFuY2VvZiBWaWV3ZXJSZXNvdXJjZUJ1aWxkZXIpIHtcclxuICAgIHJldHVybiByZXMudG9SZXNvdXJjZXMoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZml4U3RyaW5nID0gKHI6IHN0cmluZyB8IFZpZXdlclJlc291cmNlKTogVmlld2VyUmVzb3VyY2VbXSA9PlxyXG4gICAgaXNTdHJpbmcocikgPyBwYXJzZVVybFBhcmFtZXRlcnMocikgOiBbcl1cclxuXHJcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xyXG4gICAgcmV0dXJuIHJlcy5mbGF0TWFwKGZpeFN0cmluZylcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGZpeFN0cmluZyhyZXMpXHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBWaWV3ZXJSZXNvdXJjZUJ1aWxkZXIgaW1wbGVtZW50cyBJdGVyYWJsZTxWaWV3ZXJSZXNvdXJjZT4ge1xyXG4gICNyZXNvdXJjZXM6IFZpZXdlclJlc291cmNlW10gPSBbXVxyXG5cclxuICAjb3JkZXIoKSB7XHJcbiAgICB0aGlzLiNyZXNvdXJjZXMgPSB1bmlxKHRoaXMuI3Jlc291cmNlcykuc29ydCgpXHJcbiAgfVxyXG5cclxuICBhZGRBbGxNb2RlbHMoKSB7XHJcbiAgICB0aGlzLiNyZXNvdXJjZXMucHVzaChuZXcgVmlld2VyQWxsTW9kZWxzUmVzb3VyY2UoKSlcclxuICAgIHRoaXMuI29yZGVyKClcclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG4gIGFkZE1vZGVsKG1vZGVsSWQ6IHN0cmluZywgdmVyc2lvbklkPzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLiNyZXNvdXJjZXMucHVzaChuZXcgVmlld2VyTW9kZWxSZXNvdXJjZShtb2RlbElkLCB2ZXJzaW9uSWQpKVxyXG4gICAgdGhpcy4jb3JkZXIoKVxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcbiAgYWRkTW9kZWxGb2xkZXIoZm9sZGVyTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLiNyZXNvdXJjZXMucHVzaChuZXcgVmlld2VyTW9kZWxGb2xkZXJSZXNvdXJjZShmb2xkZXJOYW1lKSlcclxuICAgIHRoaXMuI29yZGVyKClcclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG4gIGFkZE9iamVjdChvYmplY3RJZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLiNyZXNvdXJjZXMucHVzaChuZXcgVmlld2VyT2JqZWN0UmVzb3VyY2Uob2JqZWN0SWQpKVxyXG4gICAgdGhpcy4jb3JkZXIoKVxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgVXNlICdhZGRSZXNvdXJjZXMnIG9yICdhZGROZXcnIGluc3RlYWRcclxuICAgKi9cclxuICBhZGRGcm9tU3RyaW5nKHN0cmluZ1Jlc291cmNlczogU3RyaW5nVmlld2VyUmVzb3VyY2VzVGFyZ2V0KSB7XHJcbiAgICBjb25zdCBzdHJpbmdzID0gQXJyYXkuaXNBcnJheShzdHJpbmdSZXNvdXJjZXMpID8gc3RyaW5nUmVzb3VyY2VzIDogW3N0cmluZ1Jlc291cmNlc11cclxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VJZFN0cmluZyBvZiBzdHJpbmdzKSB7XHJcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHBhcnNlVXJsUGFyYW1ldGVycyhyZXNvdXJjZUlkU3RyaW5nLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgIHRoaXMuI3Jlc291cmNlcy5wdXNoKC4uLnJlc291cmNlcylcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiNvcmRlcigpXHJcbiAgICByZXR1cm4gdGhpc1xyXG4gIH1cclxuICBhZGRSZXNvdXJjZXMocmVzOiBWaWV3ZXJSZXNvdXJjZXNUYXJnZXQpIHtcclxuICAgIHRoaXMuI3Jlc291cmNlcy5wdXNoKC4uLnRvVmlld2VyUmVzb3VyY2VBcnJheShyZXMpKVxyXG4gICAgdGhpcy4jb3JkZXIoKVxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ubHkgYWRkIHRob3NlIHJlc291cmNlcyB0aGF0IGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgYnVpbGRlci5cclxuICAgKi9cclxuICBhZGROZXcoXHJcbiAgICBpbmNvbWluZzogVmlld2VyUmVzb3VyY2VzVGFyZ2V0LFxyXG4gICAgb3B0aW9ucz86IHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIElmIHRydWUsIHdpbGwgcmVxdWlyZSBleGFjdCB2ZXJzaW9uIG1hdGNoZXMgZm9yIG1vZGVsIHJlc291cmNlc1xyXG4gICAgICAgKiBEZWZhdWx0OiBmYWxzZVxyXG4gICAgICAgKi9cclxuICAgICAgcmVxdWlyZUV4YWN0TWF0Y2g/OiBib29sZWFuXHJcbiAgICB9XHJcbiAgKSB7XHJcbiAgICBjb25zdCB7IHJlcXVpcmVFeGFjdE1hdGNoID0gZmFsc2UgfSA9IG9wdGlvbnMgfHwge31cclxuICAgIGNvbnN0IHJlc291cmNlcyA9IHRvVmlld2VyUmVzb3VyY2VBcnJheShpbmNvbWluZylcclxuXHJcbiAgICBjb25zdCBuZXdSZXNvdXJjZXM6IFZpZXdlclJlc291cmNlW10gPSB0aGlzLiNyZXNvdXJjZXMuc2xpY2UoKVxyXG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcclxuICAgICAgLy8gY2hlY2sgaWYgbmV3UmVzb3VyY2VzIGhhcyBhIHJlc291cmNlIHcvIHNhbWUgbW9kZWxJZCAoY2hlY2sgdy8gaXNNb2RlbFJlc291cmNlKVxyXG4gICAgICBpZiAoaXNNb2RlbFJlc291cmNlKHJlc291cmNlKSAmJiAhcmVxdWlyZUV4YWN0TWF0Y2gpIHtcclxuICAgICAgICBjb25zdCBleGlzdGluZyA9IG5ld1Jlc291cmNlcy5maW5kKFxyXG4gICAgICAgICAgKHIpID0+IGlzTW9kZWxSZXNvdXJjZShyKSAmJiByLm1vZGVsSWQgPT09IHJlc291cmNlLm1vZGVsSWRcclxuICAgICAgICApXHJcbiAgICAgICAgaWYgKCFleGlzdGluZykge1xyXG4gICAgICAgICAgbmV3UmVzb3VyY2VzLnB1c2gocmVzb3VyY2UpXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKCFuZXdSZXNvdXJjZXMuc29tZSgocikgPT4gci50b1N0cmluZygpID09PSByZXNvdXJjZS50b1N0cmluZygpKSkge1xyXG4gICAgICAgIG5ld1Jlc291cmNlcy5wdXNoKHJlc291cmNlKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4jcmVzb3VyY2VzID0gbmV3UmVzb3VyY2VzXHJcbiAgICB0aGlzLiNvcmRlcigpXHJcblxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCkge1xyXG4gICAgcmV0dXJuIGNyZWF0ZUdldFBhcmFtRnJvbVJlc291cmNlcyh0aGlzLiNyZXNvdXJjZXMpXHJcbiAgfVxyXG4gIHRvUmVzb3VyY2VzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlcy5zbGljZSgpXHJcbiAgfVxyXG4gIHRvUmVzb3VyY2VJZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50b1Jlc291cmNlcygpLm1hcCgocikgPT4gci50b1N0cmluZygpKVxyXG4gIH1cclxuICBjbGVhcigpIHtcclxuICAgIHRoaXMuI3Jlc291cmNlcyA9IFtdXHJcbiAgICByZXR1cm4gdGhpc1xyXG4gIH1cclxuICBjbG9uZSgpIHtcclxuICAgIGNvbnN0IGNsb25lID0gbmV3IFZpZXdlclJlc291cmNlQnVpbGRlcigpXHJcbiAgICBjb25zdCByZXNvdXJjZXMgPSB0aGlzLnRvU3RyaW5nKClcclxuICAgIGNsb25lLmFkZFJlc291cmNlcyhyZXNvdXJjZXMpXHJcbiAgICByZXR1cm4gY2xvbmVcclxuICB9XHJcbiAgZ2V0IGxlbmd0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLiNyZXNvdXJjZXMubGVuZ3RoXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgc3BlY2lmaWVkIHZlcnNpb25JZHMgZnJvbSBhbnkgbW9kZWwgcmVzb3VyY2VzXHJcbiAgICovXHJcbiAgY2xlYXJWZXJzaW9ucygpIHtcclxuICAgIHRoaXMuI3Jlc291cmNlcy5mb3JFYWNoKChyKSA9PiB7XHJcbiAgICAgIGlmICghaXNNb2RlbFJlc291cmNlKHIpKSByZXR1cm5cclxuICAgICAgci52ZXJzaW9uSWQgPSB1bmRlZmluZWRcclxuICAgIH0pXHJcbiAgICByZXR1cm4gdGhpc1xyXG4gIH1cclxuXHJcbiAgaXNFcXVhbFRvKHJlc291cmNlOiBWaWV3ZXJSZXNvdXJjZXNUYXJnZXQpIHtcclxuICAgIGNvbnN0IGluY29taW5nQnVpbGRlciA9IHJlc291cmNlQnVpbGRlcigpLmFkZFJlc291cmNlcyhyZXNvdXJjZSlcclxuICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCkgPT09IGluY29taW5nQnVpbGRlci50b1N0cmluZygpXHJcbiAgfVxyXG5cclxuICBmb3JFYWNoKGNhbGxiYWNrOiAocmVzb3VyY2U6IFZpZXdlclJlc291cmNlKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLiNyZXNvdXJjZXMuZm9yRWFjaChjYWxsYmFjaylcclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG5cclxuICBmaWx0ZXI8UmVzIGV4dGVuZHMgVmlld2VyUmVzb3VyY2U+KFxyXG4gICAgY2FsbGJhY2s6IChyZXNvdXJjZTogVmlld2VyUmVzb3VyY2UpID0+IHJlc291cmNlIGlzIFJlc1xyXG4gICk6IFJlc1tdXHJcbiAgZmlsdGVyKGNhbGxiYWNrOiAocmVzb3VyY2U6IFZpZXdlclJlc291cmNlKSA9PiBib29sZWFuKTogVmlld2VyUmVzb3VyY2VbXVxyXG4gIGZpbHRlcihjYWxsYmFjazogKHJlc291cmNlOiBWaWV3ZXJSZXNvdXJjZSkgPT4gYm9vbGVhbikge1xyXG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlcy5maWx0ZXIoY2FsbGJhY2spXHJcbiAgfVxyXG5cclxuICBmaW5kPFJlcyBleHRlbmRzIFZpZXdlclJlc291cmNlPihcclxuICAgIGNhbGxiYWNrOiAocmVzb3VyY2U6IFZpZXdlclJlc291cmNlKSA9PiByZXNvdXJjZSBpcyBSZXNcclxuICApOiBSZXMgfCB1bmRlZmluZWRcclxuICBmaW5kKGNhbGxiYWNrOiAocmVzb3VyY2U6IFZpZXdlclJlc291cmNlKSA9PiBib29sZWFuKTogVmlld2VyUmVzb3VyY2UgfCB1bmRlZmluZWRcclxuICBmaW5kKGNhbGxiYWNrOiAocmVzb3VyY2U6IFZpZXdlclJlc291cmNlKSA9PiBib29sZWFuKSB7XHJcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2VzLmZpbmQoY2FsbGJhY2spXHJcbiAgfVxyXG4gIG1hcDxUPihjYWxsYmFjazogKHJlc291cmNlOiBWaWV3ZXJSZXNvdXJjZSkgPT4gVCk6IFRbXSB7XHJcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2VzLm1hcChjYWxsYmFjaylcclxuICB9XHJcbiAgW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8Vmlld2VyUmVzb3VyY2U+IHtcclxuICAgIHJldHVybiB0aGlzLiNyZXNvdXJjZXNbU3ltYm9sLml0ZXJhdG9yXSgpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRmx1ZW50IEFQSSBmb3IgZWFzaWVyIHJlc291cmNlIGJ1aWxkaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVzb3VyY2VCdWlsZGVyKCkge1xyXG4gIHJldHVybiBuZXcgVmlld2VyUmVzb3VyY2VCdWlsZGVyKClcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUmVzb3VyY2VCdWlsZGVyID0gUmV0dXJuVHlwZTx0eXBlb2YgcmVzb3VyY2VCdWlsZGVyPlxyXG4iXX0=