UNPKG

@jsprismarine/nbt

Version:
164 lines (159 loc) • 25.3 kB
'use strict'; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const Allocation = require('./Allocation.cjs.cjs'); const NBTDefinitions = require('./NBTDefinitions.cjs.cjs'); const NBTStreamReader = require('./NBTStreamReader.cjs.cjs'); const NBTTagCompound = require('./NBTTagCompound.cjs.cjs'); class NBTReader extends NBTStreamReader.default { constructor(input, byteOrder) { super(input, byteOrder); } parseList() { this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false); if (this.readByteValue().getValue() !== NBTDefinitions.NBTDefinitions.TAG_LIST) { throw new Error("Invalid NBT Data: Not list tag found"); } this.readStringValue(); return this.readTagListValue(); } parse() { this.expectInput(this.isUsingVarint() ? 2 : 3, "Invalid NBT Data: Not enough data to read new tag", false); if (this.readByteValue().getValue() !== NBTDefinitions.NBTDefinitions.TAG_COMPOUND) { throw new Error("Invalid NBT Data: No root tag found"); } const name = this.readStringValue().getValue(); const root = this.readTagCompoundValue(); root.setName(name); return root; } readTagCompoundValue() { this.alterAllocationLimit(Allocation.Allocation.COMPOUND); const compound = new NBTTagCompound.default(); this.expectInput(1, "Invalid NBT Data: Expected Tag ID in compound tag", false); let tagID = this.readByteValue().getValue(); while (tagID !== NBTDefinitions.NBTDefinitions.TAG_END) { switch (tagID) { case NBTDefinitions.NBTDefinitions.TAG_BYTE: compound.addValue(this.readStringValue().getValue(), this.readByteValue()); break; case NBTDefinitions.NBTDefinitions.TAG_SHORT: compound.addValue(this.readStringValue().getValue(), this.readShortValue()); break; case NBTDefinitions.NBTDefinitions.TAG_INT: compound.addValue(this.readStringValue().getValue(), this.readIntValue()); break; case NBTDefinitions.NBTDefinitions.TAG_LONG: compound.addValue(this.readStringValue().getValue(), this.readLongValue()); break; case NBTDefinitions.NBTDefinitions.TAG_FLOAT: compound.addValue(this.readStringValue().getValue(), this.readFloatValue()); break; case NBTDefinitions.NBTDefinitions.TAG_DOUBLE: compound.addValue(this.readStringValue().getValue(), this.readDoubleValue()); break; case NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY: compound.addValue(this.readStringValue().getValue(), this.readByteArrayValue()); break; case NBTDefinitions.NBTDefinitions.TAG_STRING: compound.addValue(this.readStringValue().getValue(), this.readStringValue()); break; case NBTDefinitions.NBTDefinitions.TAG_LIST: compound.addValue(this.readStringValue().getValue(), this.readTagListValue()); break; case NBTDefinitions.NBTDefinitions.TAG_COMPOUND: const name = this.readStringValue().getValue(); const child = this.readTagCompoundValue(); child.setName(name); compound.addChild(child); break; case NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY: compound.addValue(this.readStringValue().getValue(), this.readIntArrayValue()); break; default: throw new Error(`Invalid NBT Data: Unknown tag <${tagID}>`); } this.expectInput(1, "Invalid NBT Data: Expected tag ID in tag compound", false); tagID = this.readByteValue().getValue(); } return compound; } readTagListValue() { this.expectInput(this.isUsingVarint() ? 2 : 5, "Invalid NBT Data: Expected TAGList header", false); const listType = this.readByteValue().getValue(); let listLength = this.readIntValue().getValue(); this.alterAllocationLimit(Allocation.Allocation.ARRAY_LIST); this.alterAllocationLimit(Allocation.Allocation.REFERENCE); const backingList = /* @__PURE__ */ new Set(); switch (listType) { case NBTDefinitions.NBTDefinitions.TAG_END: listLength = 0; break; case NBTDefinitions.NBTDefinitions.TAG_BYTE: this.expectInput(listLength, "Invalid NBT Data: Expected bytes for list"); for (let i = 0; i < listLength; i++) { backingList.add(this.readShortValue()); } break; case NBTDefinitions.NBTDefinitions.TAG_SHORT: this.expectInput(2 * listLength, "Invalid NBT Data: Expected shorts for list"); for (let i = 0; i < listLength; i++) { backingList.add(this.readShortValue()); } break; case NBTDefinitions.NBTDefinitions.TAG_INT: this.expectInput(4 * listLength, "Invalid NBT Data: Expected ints for list"); for (let i = 0; i < listLength; i++) { backingList.add(this.readIntValue()); } break; case NBTDefinitions.NBTDefinitions.TAG_LONG: this.expectInput(8 * listLength, "Invalid NBT Data: Expected longs for list"); for (let i = 0; i < listLength; i++) { backingList.add(this.readLongValue()); } break; case NBTDefinitions.NBTDefinitions.TAG_FLOAT: this.expectInput(4 * listLength, "Invalid NBT Data: Expected floats for list"); for (let i = 0; i < listLength; i++) { backingList.add(this.readFloatValue()); } break; case NBTDefinitions.NBTDefinitions.TAG_DOUBLE: this.expectInput(8 * listLength, "Invalid NBT Data: Expected doubles for list"); for (let i = 0; i < listLength; i++) { backingList.add(this.readDoubleValue()); } break; case NBTDefinitions.NBTDefinitions.TAG_BYTE_ARRAY: for (let i = 0; i < listLength; i++) { backingList.add(this.readByteArrayValue()); } break; case NBTDefinitions.NBTDefinitions.TAG_STRING: for (let i = 0; i < listLength; i++) { backingList.add(this.readStringValue()); } break; case NBTDefinitions.NBTDefinitions.TAG_LIST: for (let i = 0; i < listLength; i++) { backingList.add(this.readTagListValue()); } break; case NBTDefinitions.NBTDefinitions.TAG_COMPOUND: for (let i = 0; i < listLength; i++) { backingList.add(this.readTagCompoundValue()); } break; case NBTDefinitions.NBTDefinitions.TAG_INT_ARRAY: for (let i = 0; i < listLength; i++) { backingList.add(this.readIntArrayValue()); } break; default: throw new Error(`Invalid NBT Data: Unknown tag <${listType}>`); } return backingList; } } exports.default = NBTReader; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUUmVhZGVyLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9OQlRSZWFkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuaW1wb3J0IHsgQWxsb2NhdGlvbiB9IGZyb20gJy4vQWxsb2NhdGlvbic7XG5pbXBvcnQgdHlwZSBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB0eXBlIHsgQnl0ZU9yZGVyIH0gZnJvbSAnLi9CeXRlT3JkZXInO1xuaW1wb3J0IHsgTkJURGVmaW5pdGlvbnMgfSBmcm9tICcuL05CVERlZmluaXRpb25zJztcbmltcG9ydCBOQlRTdHJlYW1SZWFkZXIgZnJvbSAnLi9OQlRTdHJlYW1SZWFkZXInO1xuaW1wb3J0IE5CVFRhZ0NvbXBvdW5kIGZyb20gJy4vTkJUVGFnQ29tcG91bmQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOQlRSZWFkZXIgZXh0ZW5kcyBOQlRTdHJlYW1SZWFkZXIge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihpbnB1dDogQmluYXJ5U3RyZWFtLCBieXRlT3JkZXI6IEJ5dGVPcmRlcikge1xuICAgICAgICBzdXBlcihpbnB1dCwgYnl0ZU9yZGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VMaXN0PFRhZ1R5cGU+KCk6IFNldDxUYWdUeXBlPiB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQodGhpcy5pc1VzaW5nVmFyaW50KCkgPyAyIDogMywgJ0ludmFsaWQgTkJUIERhdGE6IE5vdCBlbm91Z2ggZGF0YSB0byByZWFkIG5ldyB0YWcnLCBmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLnJlYWRCeXRlVmFsdWUoKS5nZXRWYWx1ZSgpICE9PSBOQlREZWZpbml0aW9ucy5UQUdfTElTVCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE5CVCBEYXRhOiBOb3QgbGlzdCB0YWcgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVhZFN0cmluZ1ZhbHVlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRUYWdMaXN0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2UoKTogTkJUVGFnQ29tcG91bmQge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gMiA6IDMsICdJbnZhbGlkIE5CVCBEYXRhOiBOb3QgZW5vdWdoIGRhdGEgdG8gcmVhZCBuZXcgdGFnJywgZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKSAhPT0gTkJURGVmaW5pdGlvbnMuVEFHX0NPTVBPVU5EKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgTkJUIERhdGE6IE5vIHJvb3QgdGFnIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSB0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHJvb3Q6IE5CVFRhZ0NvbXBvdW5kID0gdGhpcy5yZWFkVGFnQ29tcG91bmRWYWx1ZSgpO1xuICAgICAgICByb290LnNldE5hbWUobmFtZSk7XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZFRhZ0NvbXBvdW5kVmFsdWUoKTogTkJUVGFnQ29tcG91bmQge1xuICAgICAgICB0aGlzLmFsdGVyQWxsb2NhdGlvbkxpbWl0KEFsbG9jYXRpb24uQ09NUE9VTkQpO1xuICAgICAgICBjb25zdCBjb21wb3VuZDogTkJUVGFnQ29tcG91bmQgPSBuZXcgTkJUVGFnQ29tcG91bmQoKTtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgxLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgVGFnIElEIGluIGNvbXBvdW5kIHRhZycsIGZhbHNlKTtcblxuICAgICAgICBsZXQgdGFnSUQgPSB0aGlzLnJlYWRCeXRlVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICB3aGlsZSAodGFnSUQgIT09IE5CVERlZmluaXRpb25zLlRBR19FTkQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnSUQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEJ5dGVWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkU2hvcnRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEludFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MT05HOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZExvbmdWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRkxPQVQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkRmxvYXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfRE9VQkxFOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZERvdWJsZVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEJ5dGVBcnJheVZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TVFJJTkc6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkU3RyaW5nVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0xJU1Q6XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZFZhbHVlKHRoaXMucmVhZFN0cmluZ1ZhbHVlKCkuZ2V0VmFsdWUoKSwgdGhpcy5yZWFkVGFnTGlzdFZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORDpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gdGhpcy5yZWFkU3RyaW5nVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZDogTkJUVGFnQ29tcG91bmQgPSB0aGlzLnJlYWRUYWdDb21wb3VuZFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnNldE5hbWUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kLmFkZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOQlREZWZpbml0aW9ucy5UQUdfSU5UX0FSUkFZOlxuICAgICAgICAgICAgICAgICAgICBjb21wb3VuZC5hZGRWYWx1ZSh0aGlzLnJlYWRTdHJpbmdWYWx1ZSgpLmdldFZhbHVlKCksIHRoaXMucmVhZEludEFycmF5VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBOQlQgRGF0YTogVW5rbm93biB0YWcgPCR7dGFnSUR9PmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDEsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCB0YWcgSUQgaW4gdGFnIGNvbXBvdW5kJywgZmFsc2UpO1xuICAgICAgICAgICAgdGFnSUQgPSB0aGlzLnJlYWRCeXRlVmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvdW5kO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZFRhZ0xpc3RWYWx1ZSgpOiBTZXQ8YW55PiB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQodGhpcy5pc1VzaW5nVmFyaW50KCkgPyAyIDogNSwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIFRBR0xpc3QgaGVhZGVyJywgZmFsc2UpO1xuICAgICAgICBjb25zdCBsaXN0VHlwZTogbnVtYmVyID0gdGhpcy5yZWFkQnl0ZVZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgbGV0IGxpc3RMZW5ndGg6IG51bWJlciA9IHRoaXMucmVhZEludFZhbHVlKCkuZ2V0VmFsdWUoKTtcblxuICAgICAgICB0aGlzLmFsdGVyQWxsb2NhdGlvbkxpbWl0KEFsbG9jYXRpb24uQVJSQVlfTElTVCk7XG4gICAgICAgIHRoaXMuYWx0ZXJBbGxvY2F0aW9uTGltaXQoQWxsb2NhdGlvbi5SRUZFUkVOQ0UpO1xuXG4gICAgICAgIGNvbnN0IGJhY2tpbmdMaXN0OiBTZXQ8YW55PiA9IG5ldyBTZXQoKTtcblxuICAgICAgICBzd2l0Y2ggKGxpc3RUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19FTkQ6XG4gICAgICAgICAgICAgICAgbGlzdExlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQobGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGJ5dGVzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFNob3J0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19TSE9SVDpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDIgKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgc2hvcnRzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZFNob3J0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19JTlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg0ICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGludHMgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkSW50VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MT05HOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoOCAqIGxpc3RMZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBsb25ncyBmb3IgbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRMb25nVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19GTE9BVDpcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdElucHV0KDQgKiBsaXN0TGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgZmxvYXRzIGZvciBsaXN0Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2luZ0xpc3QuYWRkKHRoaXMucmVhZEZsb2F0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19ET1VCTEU6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg4ICogbGlzdExlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGRvdWJsZXMgZm9yIGxpc3QnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkRG91YmxlVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19CWVRFX0FSUkFZOlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRCeXRlQXJyYXlWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX1NUUklORzpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkU3RyaW5nVmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19MSVNUOlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tpbmdMaXN0LmFkZCh0aGlzLnJlYWRUYWdMaXN0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5CVERlZmluaXRpb25zLlRBR19DT01QT1VORDpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkVGFnQ29tcG91bmRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkJURGVmaW5pdGlvbnMuVEFHX0lOVF9BUlJBWTpcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBiYWNraW5nTGlzdC5hZGQodGhpcy5yZWFkSW50QXJyYXlWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIE5CVCBEYXRhOiBVbmtub3duIHRhZyA8JHtsaXN0VHlwZX0+YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmFja2luZ0xpc3Q7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIk5CVFN0cmVhbVJlYWRlciIsIk5CVERlZmluaXRpb25zIiwiQWxsb2NhdGlvbiIsIk5CVFRhZ0NvbXBvdW5kIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFRQSxNQUFxQixrQkFBa0JBLHVCQUFnQixDQUFBO0FBQUEsRUFDNUMsV0FBQSxDQUFZLE9BQXFCLFNBQXNCLEVBQUE7QUFDMUQs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