@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
309 lines (308 loc) • 30.4 kB
JavaScript
import CommandParameter, { CommandParameterFlags, CommandParameterType } from "../network/type/CommandParameter.es.js";
import { CommandEnum } from "../network/type/CommandEnum.es.js";
import ParseTargetSelector from "../utils/ParseTargetSelector.es.js";
import ParseTildeCaretNotation from "../utils/ParseTildeCaretNotation.es.js";
import { Vector3 } from "@jsprismarine/math";
import { getGametypeId, getGametypeName } from "@jsprismarine/minecraft";
import { Suggestions } from "@jsprismarine/brigadier";
//#region src/command/CommandArguments.ts
var CommandArgument = class {
getReadableType() {
return "";
}
getParameters(server) {
return /* @__PURE__ */ new Set();
}
};
var CommandArgumentGamemode = class {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "gameMode";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, _context) {
return getGametypeName(getGametypeId(reader.readString()));
}
async listSuggestions(_context, _builder) {
return Suggestions.empty();
}
getExamples() {
return [
"survival",
"creative",
"adventure",
"spectator"
];
}
getReadableType() {
return this.name;
}
getParameters() {
const gameModeEnum = new CommandEnum();
gameModeEnum.name = "GameMode";
gameModeEnum.values = [
"survival",
"creative",
"adventure",
"spectator"
];
return new Set([new CommandParameter({
paramName: this.name,
isOptional: this.optional,
flags: this.flags,
enum: gameModeEnum,
postfix: this.postfix
})]);
}
};
var CommandArgumentMob = class {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "entityType";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, _context) {
let str = "";
while (reader.canRead()) {
const pos = reader.getCursor();
const char = reader.read();
if (char === " ") {
reader.setCursor(pos);
break;
}
str += char;
}
return str;
}
async listSuggestions(_context, _builder) {
return Suggestions.empty();
}
getExamples() {
return [];
}
getReadableType() {
return this.name;
}
getParameters() {
const entityTypeEnum = new CommandEnum();
entityTypeEnum.name = "EntityType";
entityTypeEnum.values = [];
return new Set([new CommandParameter({
paramName: this.name,
isOptional: this.optional,
flags: this.flags,
enum: entityTypeEnum,
postfix: this.postfix
})]);
}
};
var CommandArgumentEntity = class {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "target";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, context) {
let player = "";
while (reader.canRead()) {
const pos = reader.getCursor();
const char = reader.read();
if (char === " ") {
reader.setCursor(pos);
break;
}
player += char;
}
if (player.startsWith("@")) try {
return ParseTargetSelector({
input: player,
source: context.getSource(),
entities: context.getSource().getWorld().getEntities()
});
} catch (error) {
if (!error.message.includes("no results")) throw error;
return [];
}
return [context.getSource().getServer().getSessionManager().getPlayerByExactName(player)];
}
getReadableType() {
return this.name;
}
getParameters() {
return new Set([new CommandParameter({
paramName: this.name,
paramType: CommandParameterType.Target,
isOptional: this.optional,
flags: this.flags,
postfix: this.postfix
})]);
}
};
var CommandArgumentPosition = class extends Vector3 {
name;
optional;
flags;
postfix;
constructor(data) {
super(0, 0, 0);
this.name = data?.name ?? "position";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, context) {
const getPos = () => {
let pos = "";
while (reader.canRead()) {
const cursor = reader.getCursor();
const char = reader.read();
if (char === " ") {
reader.setCursor(cursor);
break;
}
pos += char;
}
return pos;
};
this.setX(ParseTildeCaretNotation({
input: getPos(),
source: context.getSource(),
type: "x"
}));
reader.skip();
this.setY(ParseTildeCaretNotation({
input: getPos(),
source: context.getSource(),
type: "y"
}));
reader.skip();
this.setZ(ParseTildeCaretNotation({
input: getPos(),
source: context.getSource(),
type: "z"
}));
return this;
}
getReadableType() {
return this.name;
}
getParameters() {
return new Set([new CommandParameter({
paramName: this.name,
paramType: CommandParameterType.Position,
isOptional: this.optional,
flags: this.flags,
postfix: this.postfix
})]);
}
};
var CommandArgumentCommand = class {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "command";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, _context) {
return reader.readString();
}
getReadableType() {
return this.name;
}
getParameters() {
return new Set([new CommandParameter({
paramName: this.name,
paramType: CommandParameterType.Position,
isOptional: this.optional,
flags: this.flags,
postfix: this.postfix
})]);
}
};
var BooleanArgumentCommand = class {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "boolean";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, _context) {
if (reader.readString() === "true") return true;
return false;
}
getReadableType() {
return this.name;
}
getParameters() {
const booleanEnum = new CommandEnum();
booleanEnum.name = "Boolean";
booleanEnum.values = ["true", "false"];
return new Set([new CommandParameter({
paramName: this.name,
isOptional: this.optional,
enum: booleanEnum,
flags: this.flags,
postfix: this.postfix
})]);
}
};
var PlayerArgumentCommand = class {
name;
optional;
flags;
postfix;
constructor(data) {
this.name = data?.name ?? "player";
this.optional = data?.optional ?? false;
this.flags = data?.flags ?? CommandParameterFlags.NONE;
this.postfix = data?.postfix ?? null;
}
parse(reader, _context) {
return reader.readString();
}
getReadableType() {
return this.name;
}
getParameters(server) {
const playerEnum = new CommandEnum();
playerEnum.name = "Player";
try {
playerEnum.values = server.getSessionManager().getAllPlayers().map((player) => player.getName());
} catch {
playerEnum.values = [];
}
return new Set([new CommandParameter({
paramName: this.name,
isOptional: this.optional,
enum: playerEnum,
flags: this.flags,
postfix: this.postfix
})]);
}
};
//#endregion
export { BooleanArgumentCommand, CommandArgument, CommandArgumentCommand, CommandArgumentEntity, CommandArgumentGamemode, CommandArgumentMob, CommandArgumentPosition, PlayerArgumentCommand };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWFuZEFyZ3VtZW50cy5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZC9Db21tYW5kQXJndW1lbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29tbWFuZENvbnRleHQsIFN0cmluZ1JlYWRlciB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvYnJpZ2FkaWVyJztcbmltcG9ydCB7IFN1Z2dlc3Rpb25zIH0gZnJvbSAnQGpzcHJpc21hcmluZS9icmlnYWRpZXInO1xuaW1wb3J0IENvbW1hbmRQYXJhbWV0ZXIsIHsgQ29tbWFuZFBhcmFtZXRlckZsYWdzLCBDb21tYW5kUGFyYW1ldGVyVHlwZSB9IGZyb20gJy4uL25ldHdvcmsvdHlwZS9Db21tYW5kUGFyYW1ldGVyJztcblxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWF0aCc7XG5pbXBvcnQgeyBnZXRHYW1ldHlwZUlkLCBnZXRHYW1ldHlwZU5hbWUgfSBmcm9tICdAanNwcmlzbWFyaW5lL21pbmVjcmFmdCc7XG5pbXBvcnQgdHlwZSBQbGF5ZXIgZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi9TZXJ2ZXInO1xuaW1wb3J0IHsgQ29tbWFuZEVudW0gfSBmcm9tICcuLi9uZXR3b3JrL3R5cGUvQ29tbWFuZEVudW0nO1xuaW1wb3J0IFBhcnNlVGFyZ2V0U2VsZWN0b3IgZnJvbSAnLi4vdXRpbHMvUGFyc2VUYXJnZXRTZWxlY3Rvcic7XG5pbXBvcnQgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24gZnJvbSAnLi4vdXRpbHMvUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVudXNlZC1pbXBvcnRzL25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoc2VydmVyOiBTZXJ2ZXIpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gbmV3IFNldCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudEdhbWVtb2RlIGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ2dhbWVNb2RlJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIHJldHVybiBnZXRHYW1ldHlwZU5hbWUoZ2V0R2FtZXR5cGVJZChyZWFkZXIucmVhZFN0cmluZygpKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBsaXN0U3VnZ2VzdGlvbnMoX2NvbnRleHQ6IGFueSwgX2J1aWxkZXI6IGFueSkge1xuICAgICAgICAvLyBUT0RPXG4gICAgICAgIHJldHVybiBTdWdnZXN0aW9ucy5lbXB0eSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0RXhhbXBsZXMoKSB7XG4gICAgICAgIHJldHVybiBbJ3N1cnZpdmFsJywgJ2NyZWF0aXZlJywgJ2FkdmVudHVyZScsICdzcGVjdGF0b3InXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgY29uc3QgZ2FtZU1vZGVFbnVtID0gbmV3IENvbW1hbmRFbnVtKCk7XG4gICAgICAgIGdhbWVNb2RlRW51bS5uYW1lID0gJ0dhbWVNb2RlJztcblxuICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSBkeW5hbWljXG4gICAgICAgIGdhbWVNb2RlRW51bS52YWx1ZXMgPSBbJ3N1cnZpdmFsJywgJ2NyZWF0aXZlJywgJ2FkdmVudHVyZScsICdzcGVjdGF0b3InXTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgbmV3IENvbW1hbmRQYXJhbWV0ZXIoe1xuICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMub3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgZW51bTogZ2FtZU1vZGVFbnVtLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50TW9iIGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ2VudGl0eVR5cGUnO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgX2NvbnRleHQ6IENvbW1hbmRDb250ZXh0PFBsYXllcj4pIHtcbiAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICB3aGlsZSAocmVhZGVyLmNhblJlYWQoKSkge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gcmVhZGVyLmdldEN1cnNvcigpO1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IHJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgICBpZiAoY2hhciA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnNldEN1cnNvcihwb3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHIgKz0gY2hhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBsaXN0U3VnZ2VzdGlvbnMoX2NvbnRleHQ6IGFueSwgX2J1aWxkZXI6IGFueSkge1xuICAgICAgICAvLyBUT0RPXG4gICAgICAgIHJldHVybiBTdWdnZXN0aW9ucy5lbXB0eSgpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0RXhhbXBsZXMoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgY29uc3QgZW50aXR5VHlwZUVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgZW50aXR5VHlwZUVudW0ubmFtZSA9ICdFbnRpdHlUeXBlJztcbiAgICAgICAgZW50aXR5VHlwZUVudW0udmFsdWVzID0gW107IC8vT2JqZWN0LmVudHJpZXMoRW50aXRpZXMpLm1hcCgoWywgZW50aXR5XSkgPT4gZW50aXR5Lk1PQl9JRCk7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIGVudW06IGVudGl0eVR5cGVFbnVtLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50RW50aXR5IGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ3RhcmdldCc7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBjb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGxldCBwbGF5ZXIgPSAnJztcbiAgICAgICAgd2hpbGUgKHJlYWRlci5jYW5SZWFkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IocG9zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGxheWVyICs9IGNoYXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxheWVyLnN0YXJ0c1dpdGgoJ0AnKSlcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlVGFyZ2V0U2VsZWN0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgICAgIGVudGl0aWVzOiBjb250ZXh0LmdldFNvdXJjZSgpLmdldFdvcmxkKCkuZ2V0RW50aXRpZXMoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIShlcnJvciBhcyBhbnkpLm1lc3NhZ2UuaW5jbHVkZXMoJ25vIHJlc3VsdHMnKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dC5nZXRTb3VyY2UoKS5nZXRTZXJ2ZXIoKS5nZXRTZXNzaW9uTWFuYWdlcigpLmdldFBsYXllckJ5RXhhY3ROYW1lKHBsYXllcildOyAvLyBUT0RPOiBieSBuYW1lIG5vdCBleGFjdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5UYXJnZXQsXG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbDogdGhpcy5vcHRpb25hbCxcbiAgICAgICAgICAgICAgICBmbGFnczogdGhpcy5mbGFncyxcbiAgICAgICAgICAgICAgICBwb3N0Zml4OiB0aGlzLnBvc3RmaXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1hbmRBcmd1bWVudFBvc2l0aW9uIGV4dGVuZHMgVmVjdG9yMyBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICBzdXBlcigwLCAwLCAwKTtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YT8ubmFtZSA/PyAncG9zaXRpb24nO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZGF0YT8ub3B0aW9uYWwgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBkYXRhPy5mbGFncyA/PyBDb21tYW5kUGFyYW1ldGVyRmxhZ3MuTk9ORTtcbiAgICAgICAgdGhpcy5wb3N0Zml4ID0gZGF0YT8ucG9zdGZpeCA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZShyZWFkZXI6IFN0cmluZ1JlYWRlciwgY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBnZXRQb3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcG9zID0gJyc7XG4gICAgICAgICAgICB3aGlsZSAocmVhZGVyLmNhblJlYWQoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnNvciA9IHJlYWRlci5nZXRDdXJzb3IoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyID0gcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZXRDdXJzb3IoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcG9zICs9IGNoYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2V0WChcbiAgICAgICAgICAgIFBhcnNlVGlsZGVDYXJldE5vdGF0aW9uKHtcbiAgICAgICAgICAgICAgICBpbnB1dDogZ2V0UG9zKCksXG4gICAgICAgICAgICAgICAgc291cmNlOiBjb250ZXh0LmdldFNvdXJjZSgpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd4J1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmVhZGVyLnNraXAoKTtcbiAgICAgICAgdGhpcy5zZXRZKFxuICAgICAgICAgICAgUGFyc2VUaWxkZUNhcmV0Tm90YXRpb24oe1xuICAgICAgICAgICAgICAgIGlucHV0OiBnZXRQb3MoKSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IGNvbnRleHQuZ2V0U291cmNlKCksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3knXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZWFkZXIuc2tpcCgpO1xuICAgICAgICB0aGlzLnNldFooXG4gICAgICAgICAgICBQYXJzZVRpbGRlQ2FyZXROb3RhdGlvbih7XG4gICAgICAgICAgICAgICAgaW5wdXQ6IGdldFBvcygpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogY29udGV4dC5nZXRTb3VyY2UoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAneidcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdjb21tYW5kJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSByZWFkZXIucmVhZFN0cmluZygpO1xuXG4gICAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycygpOiBTZXQ8Q29tbWFuZFBhcmFtZXRlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFNldChbXG4gICAgICAgICAgICBuZXcgQ29tbWFuZFBhcmFtZXRlcih7XG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1UeXBlOiBDb21tYW5kUGFyYW1ldGVyVHlwZS5Qb3NpdGlvbixcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQm9vbGVhbkFyZ3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRBcmd1bWVudCB7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvcHRpb25hbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGZsYWdzOiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7XG4gICAgcHJpdmF0ZSBwb3N0Zml4OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGE/OiB7IG5hbWU/OiBzdHJpbmc7IG9wdGlvbmFsPzogYm9vbGVhbjsgZmxhZ3M/OiBDb21tYW5kUGFyYW1ldGVyRmxhZ3M7IHBvc3RmaXg/OiBzdHJpbmcgfSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhPy5uYW1lID8/ICdib29sZWFuJztcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IGRhdGE/Lm9wdGlvbmFsID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZGF0YT8uZmxhZ3MgPz8gQ29tbWFuZFBhcmFtZXRlckZsYWdzLk5PTkU7XG4gICAgICAgIHRoaXMucG9zdGZpeCA9IGRhdGE/LnBvc3RmaXggPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UocmVhZGVyOiBTdHJpbmdSZWFkZXIsIF9jb250ZXh0OiBDb21tYW5kQ29udGV4dDxQbGF5ZXI+KSB7XG4gICAgICAgIGNvbnN0IGJvb2xlYW4gPSByZWFkZXIucmVhZFN0cmluZygpO1xuXG4gICAgICAgIGlmIChib29sZWFuID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVhZGFibGVUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmFtZXRlcnMoKTogU2V0PENvbW1hbmRQYXJhbWV0ZXI+IHtcbiAgICAgICAgY29uc3QgYm9vbGVhbkVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgYm9vbGVhbkVudW0ubmFtZSA9ICdCb29sZWFuJztcbiAgICAgICAgYm9vbGVhbkVudW0udmFsdWVzID0gWyd0cnVlJywgJ2ZhbHNlJ107XG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGVudW06IGJvb2xlYW5FbnVtLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB0aGlzLmZsYWdzLFxuICAgICAgICAgICAgICAgIHBvc3RmaXg6IHRoaXMucG9zdGZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyQXJndW1lbnRDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZEFyZ3VtZW50IHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZ3M6IENvbW1hbmRQYXJhbWV0ZXJGbGFncztcbiAgICBwcml2YXRlIHBvc3RmaXg6IHN0cmluZyB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YT86IHsgbmFtZT86IHN0cmluZzsgb3B0aW9uYWw/OiBib29sZWFuOyBmbGFncz86IENvbW1hbmRQYXJhbWV0ZXJGbGFnczsgcG9zdGZpeD86IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGE/Lm5hbWUgPz8gJ3BsYXllcic7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBkYXRhPy5vcHRpb25hbCA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGRhdGE/LmZsYWdzID8/IENvbW1hbmRQYXJhbWV0ZXJGbGFncy5OT05FO1xuICAgICAgICB0aGlzLnBvc3RmaXggPSBkYXRhPy5wb3N0Zml4ID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlKHJlYWRlcjogU3RyaW5nUmVhZGVyLCBfY29udGV4dDogQ29tbWFuZENvbnRleHQ8UGxheWVyPikge1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWFkYWJsZVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVycyhzZXJ2ZXI6IFNlcnZlcik6IFNldDxDb21tYW5kUGFyYW1ldGVyPiB7XG4gICAgICAgIGNvbnN0IHBsYXllckVudW0gPSBuZXcgQ29tbWFuZEVudW0oKTtcbiAgICAgICAgcGxheWVyRW51bS5uYW1lID0gJ1BsYXllcic7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwbGF5ZXJFbnVtLnZhbHVlcyA9IHNlcnZlclxuICAgICAgICAgICAgICAgIC5nZXRTZXNzaW9uTWFuYWdlcigpXG4gICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgIC5tYXAoKHBsYXllcikgPT4gcGxheWVyLmdldE5hbWUoKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcGxheWVyRW51bS52YWx1ZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgICAgICAgIG5ldyBDb21tYW5kUGFyYW1ldGVyKHtcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBpc09wdGlvbmFsOiB0aGlzLm9wdGlvbmFsLFxuICAgICAgICAgICAgICAgIGVudW06IHBsYXllckVudW0sXG4gICAgICAgICAgICAgICAgZmxhZ3M6IHRoaXMuZmxhZ3MsXG4gICAgICAgICAgICAgICAgcG9zdGZpeDogdGhpcy5wb3N0Zml4XG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBWUEsSUFBc0Isa0JBQXRCLE1BQXNDO0NBQ2xDLGtCQUFpQztFQUM3QixPQUFPO0NBQ1g7Q0FFQSxjQUFxQixRQUFtRDtFQUNwRSx1QkFBTyxJQUFJLElBQUk7Q0FDbkI7QUFDSjtBQUVBLElB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