UNPKG

patchwork-mapconverter

Version:

Executable wrapper for https://github.com/ChiefOfGxBxL/WC3MapTranslator

167 lines 16.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DoodadsTranslator = void 0; const HexBuffer_1 = require("../HexBuffer"); const W3Buffer_1 = require("../W3Buffer"); const AngleConverter_1 = require("../AngleConverter"); class DoodadsTranslator { constructor() { } static getInstance() { if (this.instance == null) { this.instance = new this(); } return this.instance; } static jsonToWar(doodads) { return this.getInstance().jsonToWar(doodads); } static warToJson(buffer) { return this.getInstance().warToJson(buffer); } jsonToWar(compositeJson) { const doodadsJson = compositeJson[0]; const specialDoodadsJson = compositeJson[1]; const outBufferToWar = new HexBuffer_1.HexBuffer(); /* * Header */ outBufferToWar.addChars('W3do'); // file id outBufferToWar.addInt(8); // file version outBufferToWar.addInt(11); // subversion 0x0B outBufferToWar.addInt(doodadsJson?.length || 0); // num of trees /* * Body */ doodadsJson?.forEach((tree) => { outBufferToWar.addChars(tree.type); outBufferToWar.addInt(tree.variation != null ? tree.variation : 0); // optional - default value 0 outBufferToWar.addFloat(tree.position[0]); outBufferToWar.addFloat(tree.position[1]); outBufferToWar.addFloat(tree.position[2]); // Angle // Doodads format is unique because it uses radians for angles, as opposed // to angles in any other file which use degrees. Hence conversion is needed. // war3map: Expects angle in RADIANS // JSON: Spec defines angle in DEGREES const radAngle = (0, AngleConverter_1.deg2Rad)(tree.angle != null ? tree.angle : 0); outBufferToWar.addFloat(radAngle); // optional - default value 0 // Scale if (tree.scale == null) tree.scale = [1, 1, 1]; outBufferToWar.addFloat(tree.scale[0] != null ? tree.scale[0] : 1); outBufferToWar.addFloat(tree.scale[1] != null ? tree.scale[1] : 1); outBufferToWar.addFloat(tree.scale[2] != null ? tree.scale[2] : 1); outBufferToWar.addChars(tree.skinId); if (tree.flags == null) tree.flags = { inUnplayableArea: false, notUsedInScript: true, fixedZ: false }; // defaults if no flags are specified let treeFlag = 0; if (tree.flags.fixedZ) treeFlag |= 0x04; if (tree.flags.notUsedInScript) treeFlag |= 0x02; if (tree.flags.inUnplayableArea) treeFlag |= 0x01; outBufferToWar.addByte(treeFlag); outBufferToWar.addByte(tree.life != null ? tree.life : 100); outBufferToWar.addInt(tree.randomItemSetPtr); outBufferToWar.addInt(tree.droppedItemSets?.length || 0); tree?.droppedItemSets?.forEach(itemSet => { // Write the item set outBufferToWar.addInt(itemSet.items?.length || 0); itemSet.items?.forEach(item => { outBufferToWar.addChars(item.itemId); outBufferToWar.addInt(item.chance); }); }); outBufferToWar.addInt(tree.id); }); /* * Footer */ outBufferToWar.addInt(0); // special doodad format number, fixed at 0x00 outBufferToWar.addInt(specialDoodadsJson?.length || 0); // number of special doodads specialDoodadsJson?.forEach(specialDoodad => { outBufferToWar.addChars(specialDoodad.type); outBufferToWar.addInt(specialDoodad.position[0]); //x outBufferToWar.addInt(specialDoodad.position[1]); //y outBufferToWar.addInt(specialDoodad.position[2]); //z }); return { errors: [], buffer: outBufferToWar.getBuffer() }; } warToJson(buffer) { const result = []; const outBufferToJSON = new W3Buffer_1.W3Buffer(buffer); const fileId = outBufferToJSON.readChars(4); // W3do for doodad file const fileVersion = outBufferToJSON.readInt(); // File version = 8 const subVersion = outBufferToJSON.readInt(); // 0B 00 00 00 const numDoodads = outBufferToJSON.readInt(); // # of doodads for (let i = 0; i < numDoodads; i++) { const doodad = { type: '', variation: 0, position: [0, 0, 0], angle: -1, scale: [0, 0, 0], skinId: '', flags: { inUnplayableArea: false, notUsedInScript: true, fixedZ: false }, life: -1, randomItemSetPtr: 0, droppedItemSets: [], id: -1 }; doodad.type = outBufferToJSON.readChars(4); doodad.variation = outBufferToJSON.readInt(); doodad.position = [outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat()]; // X Y Z coords // Angle // Doodads format is unique because it uses radians for angles, as opposed // to angles in any other file which use degrees. Hence conversion is needed. // war3map: Expects angle in RADIANS // JSON: Spec defines angle in DEGREES doodad.angle = (0, AngleConverter_1.rad2Deg)(outBufferToJSON.readFloat()); doodad.scale = [outBufferToJSON.readFloat(), outBufferToJSON.readFloat(), outBufferToJSON.readFloat()]; // X Y Z scaling doodad.skinId = outBufferToJSON.readChars(4); const flags = outBufferToJSON.readByte(); doodad.flags = { fixedZ: !!(flags & 0x04), notUsedInScript: !!(flags & 0x02), inUnplayableArea: !!(flags & 0x01), }; doodad.life = outBufferToJSON.readByte(); // as a % doodad.randomItemSetPtr = outBufferToJSON.readInt(); // points to an item set defined in the map (rather than custom one defined below) const numberOfItemSets = outBufferToJSON.readInt(); // this should be 0 if randomItemSetPtr is >= 0 for (let j = 0; j < numberOfItemSets; j++) { // Read the item set const numberOfItems = outBufferToJSON.readInt(); doodad.droppedItemSets.push({ items: [] }); for (let k = 0; k < numberOfItems; k++) { doodad.droppedItemSets[j].items.push({ itemId: outBufferToJSON.readChars(4), chance: outBufferToJSON.readInt() // % chance to drop }); } } doodad.id = outBufferToJSON.readInt(); result.push(doodad); } const resultSpecial = []; outBufferToJSON.readInt(); // special doodad format version set to '0' const numSpecialDoodads = outBufferToJSON.readInt(); for (let i = 0; i < numSpecialDoodads; i++) { resultSpecial.push({ type: outBufferToJSON.readChars(4), position: [outBufferToJSON.readInt(), outBufferToJSON.readInt(), outBufferToJSON.readInt()] }); } return { errors: [], json: [result, resultSpecial] }; } } exports.DoodadsTranslator = DoodadsTranslator; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9vZGFkc1RyYW5zbGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2MzbWFwdHJhbnNsYXRvci90cmFuc2xhdG9ycy9Eb29kYWRzVHJhbnNsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0Q0FBd0M7QUFDeEMsMENBQXNDO0FBQ3RDLHNEQUFvRDtBQUtwRCxNQUFhLGlCQUFpQjtJQUc1QixnQkFBd0IsQ0FBQztJQUVsQixNQUFNLENBQUMsV0FBVztRQUN2QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtTQUMzQjtRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUN0QixDQUFDO0lBRU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFvQztRQUMxRCxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBYztRQUNwQyxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVNLFNBQVMsQ0FBQyxhQUEwQztRQUN6RCxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUE7UUFDdEM7O2VBRU87UUFDUCxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsVUFBVTtRQUMxQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsZUFBZTtRQUN4QyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUMsa0JBQWtCO1FBQzVDLGNBQWMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQSxDQUFDLGVBQWU7UUFFL0Q7O2VBRU87UUFDUCxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDNUIsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDbEMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyw2QkFBNkI7WUFDaEcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDekMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDekMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFFekMsUUFBUTtZQUNSLDBFQUEwRTtZQUMxRSw2RUFBNkU7WUFDN0UsdUNBQXVDO1lBQ3ZDLHlDQUF5QztZQUN6QyxNQUFNLFFBQVEsR0FBRyxJQUFBLHdCQUFPLEVBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzdELGNBQWMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUEsQ0FBQyw2QkFBNkI7WUFFL0QsUUFBUTtZQUNSLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQzlDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2xFLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2xFLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBRWxFLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBRXBDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO2dCQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUEsQ0FBQyxxQ0FBcUM7WUFDNUksSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFBO1lBQ2hCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUFFLFFBQVEsSUFBSSxJQUFJLENBQUE7WUFDdkMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWU7Z0JBQUUsUUFBUSxJQUFJLElBQUksQ0FBQTtZQUNoRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO2dCQUFFLFFBQVEsSUFBSSxJQUFJLENBQUE7WUFDakQsY0FBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUVoQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMzRCxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1lBQzVDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDeEQsSUFBSSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3ZDLHFCQUFxQjtnQkFDckIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbEQsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzVCLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO29CQUNwQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDcEMsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQTtZQUNGLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO1FBRUY7O1lBRUk7UUFDSixjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsOENBQThDO1FBQ3ZFLGNBQWMsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFBLENBQUMsNEJBQTRCO1FBQ25GLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUMxQyxjQUFjLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMzQyxjQUFjLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUc7WUFDcEQsY0FBYyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxHQUFHO1lBQ3BELGNBQWMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBRztRQUN0RCxDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU87WUFDTCxNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFO1NBQ25DLENBQUE7SUFDSCxDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQWM7UUFDN0IsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFBO1FBQzNCLE1BQU0sZUFBZSxHQUFHLElBQUksbUJBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUU1QyxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsdUJBQXVCO1FBQ25FLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLG1CQUFtQjtRQUNqRSxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUEsQ0FBQyxjQUFjO1FBQzNELE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLGVBQWU7UUFFNUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxNQUFNLE1BQU0sR0FBVztnQkFDckIsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsU0FBUyxFQUFFLENBQUM7Z0JBQ1osUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25CLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ1QsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hCLE1BQU0sRUFBRSxFQUFFO2dCQUNWLEtBQUssRUFBRSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ3hFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ1IsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDbkIsZUFBZSxFQUFFLEVBQUU7Z0JBQ25CLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDUCxDQUFBO1lBRUQsTUFBTSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQzVDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBLENBQUMsZUFBZTtZQUV6SCxRQUFRO1lBQ1IsMEVBQTBFO1lBQzFFLDZFQUE2RTtZQUM3RSx1Q0FBdUM7WUFDdkMseUNBQXlDO1lBQ3pDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBQSx3QkFBTyxFQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1lBRW5ELE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBLENBQUMsZ0JBQWdCO1lBQ3ZILE1BQU0sQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUU1QyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUE7WUFDeEMsTUFBTSxDQUFDLEtBQUssR0FBRztnQkFDYixNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFDeEIsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7YUFDbkMsQ0FBQTtZQUVELE1BQU0sQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFBLENBQUMsU0FBUztZQUVsRCxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFBLENBQUMsa0ZBQWtGO1lBQ3RJLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFBLENBQUMsK0NBQStDO1lBRWxHLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekMsb0JBQW9CO2dCQUNwQixNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUE7Z0JBQy9DLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7Z0JBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3RDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQzt3QkFDbkMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3dCQUNwQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLG1CQUFtQjtxQkFDdEQsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7WUFFRCxNQUFNLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUVyQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1NBQ3BCO1FBRUQsTUFBTSxhQUFhLEdBQW9CLEVBQUUsQ0FBQTtRQUN6QyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUEsQ0FBQywyQ0FBMkM7UUFDckUsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRTtvQkFDcEMsZUFBZSxDQUFDLE9BQU8sRUFBRTtvQkFDekIsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQzNCLENBQUMsQ0FBQTtTQUNIO1FBRUQsT0FBTztZQUNMLE1BQU0sRUFBRSxFQUFFO1lBQ1YsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQztTQUM5QixDQUFBO0lBQ0gsQ0FBQztDQUNGO0FBckxELDhDQXFMQyJ9