@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
122 lines (121 loc) • 16.5 kB
JavaScript
import { NetworkUtil } from "../NetworkUtil.es.js";
import Identifiers from "../Identifiers.es.js";
import DataPacket from "./DataPacket.es.js";
import UUID from "../../utils/UUID.es.js";
import BinaryStream from "@jsprismarine/jsbinaryutils";
import { NBTTagCompound, NBTWriter } from "@jsprismarine/nbt";
import { Vector3 } from "@jsprismarine/math";
//#region src/network/packet/StartGamePacket.ts
var StartGamePacket = class extends DataPacket {
static NetID = Identifiers.StartGamePacket;
entityId;
runtimeEntityId;
gamemode;
defaultGamemode = 0;
playerPos = new Vector3(0, 5, 0);
pitch = 0;
yaw = 0;
serverIdentifier;
worldIdentifier;
scenarioIdentifier;
levelId;
worldName;
seed;
time = 0;
ticks = 0;
worldSpawnPos;
gamerules;
static cachedItemIds = null;
encodePayload() {
this.writeVarLong(this.entityId);
this.writeUnsignedVarLong(this.runtimeEntityId);
this.writeVarInt(this.gamemode);
NetworkUtil.writeVector3(this, this.playerPos);
this.writeFloatLE(this.pitch);
this.writeFloatLE(this.yaw);
this.writeLongLE(BigInt(this.seed));
this.writeUnsignedShortLE(0);
NetworkUtil.writeString(this, "plains");
this.writeVarInt(0);
this.writeVarInt(1);
this.writeVarInt(this.defaultGamemode);
this.writeBoolean(false);
this.writeVarInt(0);
this.writeVarInt(this.worldSpawnPos.getX());
this.writeUnsignedVarInt(this.worldSpawnPos.getY());
this.writeVarInt(this.worldSpawnPos.getZ());
this.writeBoolean(true);
this.writeVarInt(0);
this.writeBoolean(false);
this.writeBoolean(false);
this.writeVarInt(this.time);
this.writeVarInt(0);
this.writeBoolean(false);
NetworkUtil.writeString(this, "");
this.writeFloatLE(0);
this.writeFloatLE(0);
this.writeByte(0);
this.writeByte(1);
this.writeByte(1);
this.writeVarInt(4);
this.writeVarInt(4);
this.writeByte(1);
this.writeByte(0);
this.gamerules.networkSerialize(this);
this.writeUnsignedIntLE(0);
this.writeBoolean(false);
this.writeByte(0);
this.writeByte(0);
this.writeVarInt(1);
this.writeUnsignedIntLE(4);
this.writeByte(0);
this.writeByte(0);
this.writeByte(0);
this.writeByte(0);
this.writeByte(0);
this.writeByte(0);
this.writeByte(0);
this.writeByte(0);
this.writeByte(0);
this.writeByte(0);
NetworkUtil.writeString(this, "*");
this.writeUnsignedIntLE(0);
this.writeUnsignedIntLE(0);
this.writeBoolean(true);
NetworkUtil.writeString(this, "");
NetworkUtil.writeString(this, "");
this.writeBoolean(false);
this.writeByte(0);
this.writeByte(0);
NetworkUtil.writeString(this, this.serverIdentifier);
NetworkUtil.writeString(this, this.worldIdentifier);
NetworkUtil.writeString(this, this.scenarioIdentifier);
NetworkUtil.writeString(this, this.levelId);
NetworkUtil.writeString(this, this.worldName);
NetworkUtil.writeString(this, "00000000-0000-0000-0000-000000000000");
this.writeByte(0);
this.writeUnsignedVarInt(0);
this.writeVarInt(0);
this.writeBoolean(false);
this.writeLongLE(BigInt(this.ticks));
this.writeVarInt(0);
this.writeUnsignedVarInt(0);
this.writeUnsignedVarInt(0);
NetworkUtil.writeString(this, "");
this.writeBoolean(true);
NetworkUtil.writeString(this, Identifiers.MinecraftVersions.at(0));
const str = new BinaryStream();
const nbt = new NBTWriter(str, 1);
nbt.setUseVarint(true);
nbt.writeCompound(new NBTTagCompound());
this.write(str.getBuffer());
this.writeLongLE(0n);
UUID.fromRandom().networkSerialize(this);
this.writeBoolean(true);
this.writeByte(0);
this.writeByte(0);
}
};
//#endregion
export { StartGamePacket as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhcnRHYW1lUGFja2V0LmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9TdGFydEdhbWVQYWNrZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWF0aCc7XG5pbXBvcnQgeyBOQlRUYWdDb21wb3VuZCwgTkJUV3JpdGVyIH0gZnJvbSAnQGpzcHJpc21hcmluZS9uYnQnO1xuaW1wb3J0IHsgTmV0d29ya1V0aWwgfSBmcm9tICcuLi8uLi9uZXR3b3JrL05ldHdvcmtVdGlsJztcbmltcG9ydCBVVUlEIGZyb20gJy4uLy4uL3V0aWxzL1VVSUQnO1xuaW1wb3J0IHR5cGUgR2FtZXJ1bGVNYW5hZ2VyIGZyb20gJy4uLy4uL3dvcmxkL0dhbWVydWxlTWFuYWdlcic7XG5pbXBvcnQgSWRlbnRpZmllcnMgZnJvbSAnLi4vSWRlbnRpZmllcnMnO1xuaW1wb3J0IERhdGFQYWNrZXQgZnJvbSAnLi9EYXRhUGFja2V0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhcnRHYW1lUGFja2V0IGV4dGVuZHMgRGF0YVBhY2tldCB7XG4gICAgcHVibGljIHN0YXRpYyBOZXRJRCA9IElkZW50aWZpZXJzLlN0YXJ0R2FtZVBhY2tldDtcblxuICAgIHB1YmxpYyBlbnRpdHlJZCE6IGJpZ2ludDtcbiAgICBwdWJsaWMgcnVudGltZUVudGl0eUlkITogYmlnaW50O1xuICAgIHB1YmxpYyBnYW1lbW9kZSE6IG51bWJlcjtcbiAgICBwdWJsaWMgZGVmYXVsdEdhbWVtb2RlOiBudW1iZXIgPSAwO1xuXG4gICAgcHVibGljIHBsYXllclBvczogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDUsIDApO1xuICAgIHB1YmxpYyBwaXRjaDogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgeWF3OiBudW1iZXIgPSAwO1xuXG4gICAgcHVibGljIHNlcnZlcklkZW50aWZpZXIhOiBzdHJpbmc7XG4gICAgcHVibGljIHdvcmxkSWRlbnRpZmllciE6IHN0cmluZztcbiAgICBwdWJsaWMgc2NlbmFyaW9JZGVudGlmaWVyITogc3RyaW5nO1xuICAgIHB1YmxpYyBsZXZlbElkITogc3RyaW5nO1xuICAgIHB1YmxpYyB3b3JsZE5hbWUhOiBzdHJpbmc7XG4gICAgcHVibGljIHNlZWQhOiBudW1iZXI7XG4gICAgcHVibGljIHRpbWU6IG51bWJlciA9IDA7XG4gICAgcHVibGljIHRpY2tzOiBudW1iZXIgPSAwO1xuXG4gICAgcHVibGljIHdvcmxkU3Bhd25Qb3MhOiBWZWN0b3IzO1xuXG4gICAgcHVibGljIGdhbWVydWxlcyE6IEdhbWVydWxlTWFuYWdlcjtcblxuICAgIC8vIENhY2hlIGl0ZW0gSURzIG1hcHBpbmdzXG4gICAgcHVibGljIHN0YXRpYyBjYWNoZWRJdGVtSWRzOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyBlbmNvZGVQYXlsb2FkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLndyaXRlVmFyTG9uZyh0aGlzLmVudGl0eUlkKTtcbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFyTG9uZyh0aGlzLnJ1bnRpbWVFbnRpdHlJZCk7XG5cbiAgICAgICAgdGhpcy53cml0ZVZhckludCh0aGlzLmdhbWVtb2RlKTtcblxuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVZlY3RvcjModGhpcywgdGhpcy5wbGF5ZXJQb3MpO1xuICAgICAgICB0aGlzLndyaXRlRmxvYXRMRSh0aGlzLnBpdGNoKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0TEUodGhpcy55YXcpO1xuXG4gICAgICAgIHRoaXMud3JpdGVMb25nTEUoQmlnSW50KHRoaXMuc2VlZCkpOyAvLyBTZWVkXG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkU2hvcnRMRSgweDAwKTsgLy8gRGVmYXVsdCBzcGF3biBiaW9tZSB0eXBlXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICdwbGFpbnMnKTsgLy8gVXNlciBkZWZpbmVkIGJpb21lIG5hbWVcblxuICAgICAgICB0aGlzLndyaXRlVmFySW50KDApOyAvLyBEaW1lbnNpb25cblxuICAgICAgICB0aGlzLndyaXRlVmFySW50KDEpOyAvLyBHZW5lcmF0b3JcbiAgICAgICAgdGhpcy53cml0ZVZhckludCh0aGlzLmRlZmF1bHRHYW1lbW9kZSk7IC8vIERlZmF1bHQgR2FtZW1vZGVcblxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIElzIGhhcmRjb3JlIGVuYWJsZWRcblxuICAgICAgICB0aGlzLndyaXRlVmFySW50KDApOyAvLyBEaWZmaWN1bHR5XG5cbiAgICAgICAgLy8gd29ybGQgc3Bhd24gdmVjdG9yIDNcbiAgICAgICAgdGhpcy53cml0ZVZhckludCh0aGlzLndvcmxkU3Bhd25Qb3MuZ2V0WCgpKTtcbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMud29ybGRTcGF3blBvcy5nZXRZKCkpO1xuICAgICAgICB0aGlzLndyaXRlVmFySW50KHRoaXMud29ybGRTcGF3blBvcy5nZXRaKCkpO1xuXG4gICAgICAgIC8vIFJlY2VudGx5IGZvdW5kIHRoYXQgbWF5IGNyYXNoIHRoZSBjbGllbnRcbiAgICAgICAgLy8gd2FpdGluZyBmb3IgbW9yZSBpbmZvIGFib3V0IGl0XG4gICAgICAgIHRoaXMud3JpdGVCb29sZWFuKHRydWUpOyAvLyBBY2hpZXZlbWVudCBkaXNhYmxlZFxuXG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQoMCk7IC8vIEVkaXRvciB3b3JsZCB0eXBlP1xuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIENyZWF0ZWQgaW4gZWRpdG9yIG1vZGU/XG4gICAgICAgIHRoaXMud3JpdGVCb29sZWFuKGZhbHNlKTsgLy8gRXhwb3J0ZWQgZnJvbSBlZGl0b3IgbW9kZT9cblxuICAgICAgICB0aGlzLndyaXRlVmFySW50KHRoaXMudGltZSk7IC8vIERheSBjeWNsZSAvIHRpbWVcbiAgICAgICAgdGhpcy53cml0ZVZhckludCgwKTsgLy8gRWR1IGVkaXRpb24gb2ZmZXJcbiAgICAgICAgdGhpcy53cml0ZUJvb2xlYW4oZmFsc2UpOyAvLyBFZHUgZmVhdHVyZXNcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgJycpOyAvLyBFZHUgcHJvZHVjdCBpZFxuXG4gICAgICAgIHRoaXMud3JpdGVGbG9hdExFKDApOyAvLyBSYWluIGx2bFxuICAgICAgICB0aGlzLndyaXRlRmxvYXRMRSgwKTsgLy8gTGlnaHRuaW5nIGx2bFxuXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBDb25maXJtZWQgcGxhdGZvcm0gbG9ja2VkXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDEpOyAvLyBNdWx0aSBwbGF5ZXIgZ2FtZVxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgxKTsgLy8gQnJvYWRjYXN0IHRvIGxhblxuXG4gICAgICAgIHRoaXMud3JpdGVWYXJJbnQoNCk7IC8vIFhibCBicm9hZGNhc3QgbW9kZVxuICAgICAgICB0aGlzLndyaXRlVmFySW50KDQpOyAvLyBQbGF0Zm9ybSBicm9hZGNhc3QgbW9kZVxuXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDEpOyAvLyBDb21tYW5kcyBlbmFibGVkXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBUZXh0dXJlIHJlcXVpcmVkXG5cbiAgICAgICAgdGhpcy5nYW1lcnVsZXMubmV0d29ya1NlcmlhbGl6ZSh0aGlzKTtcblxuICAgICAgICB0aGlzLndyaXRlVW5zaWduZWRJbnRMRSgwKTsgLy8gRXhwZXJpbWVudCBjb3VudFxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIEV4cGVyaW1lbnRzIHByZXZpb3VzbHkgdG9nZ2xlZD9cblxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gQm9udXMgY2hlc3RcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIFN0YXJ0IHdpdGggbWFwXG5cbiAgICAgICAgdGhpcy53cml0ZVZhckludCgxKTsgLy8gUGxheWVyIHBlcm1zXG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkSW50TEUoNCk7IC8vIENodW5rIHRpY2sgcmFuZ2VcblxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gTG9ja2VkIGJlaGF2aW9yXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBMb2NrZWQgdGV4dHVyZVxuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gRnJvbSBsb2NrZWQgdGVtcGxhdGVcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIE1zYSBnYW1lciB0YWdzIG9ubHlcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIEZyb20gd29ybGQgdGVtcGxhdGVcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIFdvcmxkIHRlbXBsYXRlIG9wdGlvbiBsb2NrZWRcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIE9ubHkgc3Bhd24gdjEgdmlsbGFnZXJzXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBEaXNhYmxlIHBlcnNvbmEgc2tpbnNcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIERpc2FibGUgY3VzdG9tIHNraW5zXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBEaXNhYmxlIGVtb3RlXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICcqJyk7XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkSW50TEUoMCk7IC8vIExpbWl0ZWQgd29ybGQgaGVpZ2h0XG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZEludExFKDApOyAvLyBMaW1pdGVkIHdvcmxkIGxlbmd0aFxuXG4gICAgICAgIHRoaXMud3JpdGVCb29sZWFuKHRydWUpOyAvLyBIYXMgbmV3IG5ldGhlclxuXG4gICAgICAgIC8vIFRPRE9zXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICcnKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgJycpO1xuXG4gICAgICAgIHRoaXMud3JpdGVCb29sZWFuKGZhbHNlKTsgLy8gRXhwZXJpbWVudGFsIGdhbWVwbGF5XG5cbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIENoYXQgcmVzdHJpY3Rpb24gbGV2ZWxcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIERpc2FibGUgcGxheWVyIGludGVyYWN0aW9uc1xuXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIHRoaXMuc2VydmVySWRlbnRpZmllcik7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsIHRoaXMud29ybGRJZGVudGlmaWVyKTtcbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgdGhpcy5zY2VuYXJpb0lkZW50aWZpZXIpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCB0aGlzLmxldmVsSWQpO1xuICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyh0aGlzLCB0aGlzLndvcmxkTmFtZSk7XG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnKTsgLy8gVGVtcGxhdGUgY29udGVudCBpZGVudGl0eVxuXG4gICAgICAgIHRoaXMud3JpdGVCeXRlKDApOyAvLyBJcyB0cmlhbFxuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCgwKTsgLy8gU2VydmVyIGF1dGggbW92ZW1lbnRcbiAgICAgICAgdGhpcy53cml0ZVZhckludCgwKTsgLy8gUmV3aW5kIEhpc3RvcnkgU2l6ZVxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIElzIFNlcnZlciBBdXRob3JpdGF0aXZlIEJsb2NrIEJyZWFraW5nXG5cbiAgICAgICAgdGhpcy53cml0ZUxvbmdMRShCaWdJbnQodGhpcy50aWNrcykpOyAvLyBXb3JsZCB0aWNrcyAoZm9yIHRpbWUpXG5cbiAgICAgICAgdGhpcy53cml0ZVZhckludCgwKTsgLy8gRW5jaGFudG1lbnQgc2VlZFxuXG4gICAgICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhckludCgwKTsgLy8gQmxvY2tzIHBhbGV0dGVcblxuICAgICAgICAvKiBJdGVtIHBhbGV0dGVcbiAgICAgICAgaWYgKFN0YXJ0R2FtZVBhY2tldC5jYWNoZWRJdGVtSWRzKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlKFN0YXJ0R2FtZVBhY2tldC5jYWNoZWRJdGVtSWRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhbGV0dGUgPSB0aGlzLmdlbmVyYXRlSXRlbVBhbGV0dGUoKTtcbiAgICAgICAgICAgIFN0YXJ0R2FtZVBhY2tldC5jYWNoZWRJdGVtSWRzID0gcGFsZXR0ZTtcbiAgICAgICAgICAgIHRoaXMud3JpdGUocGFsZXR0ZSk7XG4gICAgICAgIH0gKi9cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkVmFySW50KDApO1xuXG4gICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHRoaXMsICcnKTtcbiAgICAgICAgdGhpcy53cml0ZUJvb2xlYW4odHJ1ZSk7IC8vIE5ldyBpbnZlbnRvcnkgc3lzdGVtXG5cbiAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcodGhpcywgSWRlbnRpZmllcnMuTWluZWNyYWZ0VmVyc2lvbnMuYXQoMCkhKTtcblxuICAgICAgICAvLyBUT0RPXG4gICAgICAgIGNvbnN0IHN0ciA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICAgICAgY29uc3QgbmJ0ID0gbmV3IE5CVFdyaXRlcihzdHIsIDEpO1xuICAgICAgICBuYnQuc2V0VXNlVmFyaW50KHRydWUpO1xuICAgICAgICBuYnQud3JpdGVDb21wb3VuZChuZXcgTkJUVGFnQ29tcG91bmQoKSk7XG4gICAgICAgIHRoaXMud3JpdGUoc3RyLmdldEJ1ZmZlcigpKTtcblxuICAgICAgICB0aGlzLndyaXRlTG9uZ0xFKDBuKTsgLy8gQmxvY2sgcGFsZXR0ZSBjaGVja3N1bVxuXG4gICAgICAgIC8vIFRPRE86IE5vdCBzdXJlIGlmIGEgcmFuZG9tIG9uZSB3aWxsIHdvcmssIGJ1dCBsZXQncyB0cnlcbiAgICAgICAgVVVJRC5mcm9tUmFuZG9tKCkubmV0d29ya1NlcmlhbGl6ZSh0aGlzKTtcblxuICAgICAgICB0aGlzLndyaXRlQm9vbGVhbih0cnVlKTsgLy8gVXNlIGNsaWVudCBzaWRlIGNodW5rIGdlbmVyYXRpb25cbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoMCk7IC8vIEJsb2NrIE5FVCBJRHMgYXJlIGhhc2hlc1xuICAgICAgICB0aGlzLndyaXRlQnl0ZSgwKTsgLy8gRGlzYWJsZSBjbGllbnQgYXVkaW9cbiAgICB9XG5cbiAgICAvKiBwcml2YXRlIGdlbmVyYXRlSXRlbVBhbGV0dGUoKTogQnVmZmVyIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuICAgICAgICBjb25zdCBpdGVtTWFwcGluZ3MgPSBPYmplY3QuZW50cmllcyhpdGVtX2lkX21hcCk7XG4gICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KGl0ZW1NYXBwaW5ncy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBpdGVtTWFwcGluZ3MpIHtcbiAgICAgICAgICAgIE5ldHdvcmtVdGlsLndyaXRlU3RyaW5nKHN0cmVhbSwgbmFtZSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVTaG9ydExFKChkYXRhIGFzIGFueSkucnVudGltZV9pZCBhcyBudW1iZXIpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlQnl0ZSgwKTsgLy8gdW5rbm93blxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJlYW0uZ2V0QnVm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