function isWhitespace(char) { // ' ', '\n', '\r', '\t' return char === 32 || char === 10 || char === 13 || char === 9; } function isNumber(char) { // 0123456789.- return (char >= 48 && char <= 57) || char === 46 || char === 45; } export function parseEngineData(data) { var index = 0; function skipWhitespace() { while (index < data.length && isWhitespace(data[index])) { index++; } } function getTextByte() { var byte = data[index]; index++; if (byte === 92) { // \ byte = data[index]; index++; } return byte; } function getText() { var result = ''; if (data[index] === 41) { // ) index++; return result; } // Strings start with utf-16 BOM if (data[index] !== 0xFE || data[index + 1] !== 0xFF) { throw new Error('Invalid utf-16 BOM'); } index += 2; // ), ( and \ characters are escaped in ascii manner, remove the escapes before interpreting // the bytes as utf-16 while (index < data.length && data[index] !== 41) { // ) var high = getTextByte(); var low = getTextByte(); var char = (high << 8) | low; result += String.fromCharCode(char); } index++; return result; } var root = null; var stack = []; function pushContainer(value) { if (!stack.length) { stack.push(value); root = value; } else { pushValue(value); stack.push(value); } } function pushValue(value) { if (!stack.length) throw new Error('Invalid data'); var top = stack[stack.length - 1]; if (typeof top === 'string') { stack[stack.length - 2][top] = value; pop(); } else if (Array.isArray(top)) { top.push(value); } else { throw new Error('Invalid data'); } } function pushProperty(name) { if (!stack.length) pushContainer({}); var top = stack[stack.length - 1]; if (top && typeof top === 'string') { if (name === 'nil') { pushValue(null); } else { pushValue("/".concat(name)); } } else if (top && typeof top === 'object') { stack.push(name); } else { throw new Error('Invalid data'); } } function pop() { if (!stack.length) throw new Error('Invalid data'); stack.pop(); } skipWhitespace(); while (index < data.length) { var i = index; var char = data[i]; if (char === 60 && data[i + 1] === 60) { // << index += 2; pushContainer({}); } else if (char === 62 && data[i + 1] === 62) { // >> index += 2; pop(); } else if (char === 47) { // / index += 1; var start = index; while (index < data.length && !isWhitespace(data[index])) { index++; } var name_1 = ''; for (var i_1 = start; i_1 < index; i_1++) { name_1 += String.fromCharCode(data[i_1]); } pushProperty(name_1); } else if (char === 40) { // ( index += 1; pushValue(getText()); } else if (char === 91) { // [ index += 1; pushContainer([]); } else if (char === 93) { // ] index += 1; pop(); } else if (char === 110 && data[i + 1] === 117 && data[i + 2] === 108 && data[i + 3] === 108) { // null index += 4; pushValue(null); } else if (char === 116 && data[i + 1] === 114 && data[i + 2] === 117 && data[i + 3] === 101) { // true index += 4; pushValue(true); } else if (char === 102 && data[i + 1] === 97 && data[i + 2] === 108 && data[i + 3] === 115 && data[i + 4] === 101) { // false index += 5; pushValue(false); } else if (isNumber(char)) { var value = ''; while (index < data.length && isNumber(data[index])) { value += String.fromCharCode(data[index]); index++; } pushValue(parseFloat(value)); } else { index += 1; console.log("Invalid token ".concat(String.fromCharCode(char), " at ").concat(index)); // ` near ${String.fromCharCode.apply(null, data.slice(index - 10, index + 20) as any)}` + // `data [${Array.from(data.slice(index - 10, index + 20)).join(', ')}]` } skipWhitespace(); } return root; } var floatKeys = [ 'Axis', 'XY', 'Zone', 'WordSpacing', 'FirstLineIndent', 'GlyphSpacing', 'StartIndent', 'EndIndent', 'SpaceBefore', 'SpaceAfter', 'LetterSpacing', 'Values', 'GridSize', 'GridLeading', 'PointBase', 'BoxBounds', 'TransformPoint0', 'TransformPoint1', 'TransformPoint2', 'FontSize', 'Leading', 'HorizontalScale', 'VerticalScale', 'BaselineShift', 'Tsume', 'OutlineWidth', 'AutoLeading', ]; var intArrays = ['RunLengthArray']; // TODO: handle /nil export function serializeEngineData(data, condensed) { if (condensed === void 0) { condensed = false; } var buffer = new Uint8Array(1024); var offset = 0; var indent = 0; function write(value) { if (offset >= buffer.length) { var newBuffer = new Uint8Array(buffer.length * 2); newBuffer.set(buffer); buffer = newBuffer; } buffer[offset] = value; offset++; } function writeString(value) { for (var i = 0; i < value.length; i++) { write(value.charCodeAt(i)); } } function writeIndent() { if (condensed) { writeString(' '); } else { for (var i = 0; i < indent; i++) { writeString('\t'); } } } function writeProperty(key, value) { writeIndent(); writeString("/".concat(key)); writeValue(value, key, true); if (!condensed) writeString('\n'); } function serializeInt(value) { return value.toString(); } function serializeFloat(value) { return value.toFixed(5) .replace(/(\d)0+$/g, '$1') .replace(/^0+\.([1-9])/g, '.$1') .replace(/^-0+\.0(\d)/g, '-.0$1'); } function serializeNumber(value, key) { var isFloat = (key && floatKeys.indexOf(key) !== -1) || (value | 0) !== value; return isFloat ? serializeFloat(value) : serializeInt(value); } function getKeys(value) { var keys = Object.keys(value); if (keys.indexOf('98') !== -1) keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1)); if (keys.indexOf('99') !== -1) keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1)); return keys; } function writeStringByte(value) { if (value === 40 || value === 41 || value === 92) { // ( ) \ write(92); // \ } write(value); } function writeValue(value, key, inProperty) { if (inProperty === void 0) { inProperty = false; } function writePrefix() { if (inProperty) { writeString(' '); } else { writeIndent(); } } if (value === null) { writePrefix(); writeString(condensed ? '/nil' : 'null'); } else if (typeof value === 'number') { writePrefix(); writeString(serializeNumber(value, key)); } else if (typeof value === 'boolean') { writePrefix(); writeString(value ? 'true' : 'false'); } else if (typeof value === 'string') { writePrefix(); if ((key === '99' || key === '98') && value.charAt(0) === '/') { writeString(value); } else { writeString('('); write(0xfe); write(0xff); for (var i = 0; i < value.length; i++) { var code = value.charCodeAt(i); writeStringByte((code >> 8) & 0xff); writeStringByte(code & 0xff); } writeString(')'); } } else if (Array.isArray(value)) { writePrefix(); if (value.every(function (x) { return typeof x === 'number'; })) { writeString('['); var intArray = intArrays.indexOf(key) !== -1; for (var _i = 0, value_1 = value; _i < value_1.length; _i++) { var x = value_1[_i]; writeString(' '); writeString(intArray ? serializeNumber(x) : serializeFloat(x)); } writeString(' ]'); } else { writeString('['); if (!condensed) writeString('\n'); for (var _a = 0, value_2 = value; _a < value_2.length; _a++) { var x = value_2[_a]; writeValue(x, key); if (!condensed) writeString('\n'); } writeIndent(); writeString(']'); } } else if (typeof value === 'object') { if (inProperty && !condensed) writeString('\n'); writeIndent(); writeString('<<'); if (!condensed) writeString('\n'); indent++; for (var _b = 0, _c = getKeys(value); _b < _c.length; _b++) { var key_1 = _c[_b]; writeProperty(key_1, value[key_1]); } indent--; writeIndent(); writeString('>>'); } return undefined; } if (condensed) { if (typeof data === 'object') { for (var _i = 0, _a = getKeys(data); _i < _a.length; _i++) { var key = _a[_i]; writeProperty(key, data[key]); } } } else { writeString('\n\n'); writeValue(data); } return buffer.slice(0, offset); } //# sourceMappingURL=data:application/json;charset=utf8;base64,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bEIsSUFBSSxDQUFDLFNBQVM7Z0JBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWxDLE1BQU0sRUFBRSxDQUFDO1lBRVQsS0FBa0IsVUFBYyxFQUFkLEtBQUEsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFkLGNBQWMsRUFBZCxJQUFjLEVBQUU7Z0JBQTdCLElBQU0sS0FBRyxTQUFBO2dCQUNiLGFBQWEsQ0FBQyxLQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUcsQ0FBQyxDQUFDLENBQUM7YUFDL0I7WUFFRCxNQUFNLEVBQUUsQ0FBQztZQUNULFdBQVcsRUFBRSxDQUFDO1lBQ2QsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xCO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksU0FBUyxFQUFFO1FBQ2QsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDN0IsS0FBa0IsVUFBYSxFQUFiLEtBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFiLGNBQWEsRUFBYixJQUFhLEVBQUU7Z0JBQTVCLElBQU0sR0FBRyxTQUFBO2dCQUNiLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDOUI7U0FDRDtLQUNEO1NBQU07UUFDTixXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2pCO0lBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwiZmlsZSI6ImVuZ2luZURhdGEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBpc1doaXRlc3BhY2UoY2hhcjogbnVtYmVyKSB7XHJcblx0Ly8gJyAnLCAnXFxuJywgJ1xccicsICdcXHQnXHJcblx0cmV0dXJuIGNoYXIgPT09IDMyIHx8IGNoYXIgPT09IDEwIHx8IGNoYXIgPT09IDEzIHx8IGNoYXIgPT09IDk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzTnVtYmVyKGNoYXI6IG51bWJlcikge1xyXG5cdC8vIDAxMjM0NTY3ODkuLVxyXG5cdHJldHVybiAoY2hhciA+PSA0OCAmJiBjaGFyIDw9IDU3KSB8fCBjaGFyID09PSA0NiB8fCBjaGFyID09PSA0NTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRW5naW5lRGF0YShkYXRhOiBudW1iZXJbXSB8IFVpbnQ4QXJyYXkpIHtcclxuXHRsZXQgaW5kZXggPSAwO1xyXG5cclxuXHRmdW5jdGlvbiBza2lwV2hpdGVzcGFjZSgpIHtcclxuXHRcdHdoaWxlIChpbmRleCA8IGRhdGEubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShkYXRhW2luZGV4XSkpIHtcclxuXHRcdFx0aW5kZXgrKztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFRleHRCeXRlKCkge1xyXG5cdFx0bGV0IGJ5dGUgPSBkYXRhW2luZGV4XTtcclxuXHRcdGluZGV4Kys7XHJcblxyXG5cdFx0aWYgKGJ5dGUgPT09IDkyKSB7IC8vIFxcXHJcblx0XHRcdGJ5dGUgPSBkYXRhW2luZGV4XTtcclxuXHRcdFx0aW5kZXgrKztcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYnl0ZTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFRleHQoKSB7XHJcblx0XHRsZXQgcmVzdWx0ID0gJyc7XHJcblxyXG5cdFx0aWYgKGRhdGFbaW5kZXhdID09PSA0MSkgeyAvLyApXHJcblx0XHRcdGluZGV4Kys7XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU3RyaW5ncyBzdGFydCB3aXRoIHV0Zi0xNiBCT01cclxuXHRcdGlmIChkYXRhW2luZGV4XSAhPT0gMHhGRSB8fCBkYXRhW2luZGV4ICsgMV0gIT09IDB4RkYpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHV0Zi0xNiBCT00nKTtcclxuXHRcdH1cclxuXHJcblx0XHRpbmRleCArPSAyO1xyXG5cclxuXHRcdC8vICksICggYW5kIFxcIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgaW4gYXNjaWkgbWFubmVyLCByZW1vdmUgdGhlIGVzY2FwZXMgYmVmb3JlIGludGVycHJldGluZ1xyXG5cdFx0Ly8gdGhlIGJ5dGVzIGFzIHV0Zi0xNlxyXG5cdFx0d2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGggJiYgZGF0YVtpbmRleF0gIT09IDQxKSB7IC8vIClcclxuXHRcdFx0Y29uc3QgaGlnaCA9IGdldFRleHRCeXRlKCk7XHJcblx0XHRcdGNvbnN0IGxvdyA9IGdldFRleHRCeXRlKCk7XHJcblx0XHRcdGNvbnN0IGNoYXIgPSAoaGlnaCA8PCA4KSB8IGxvdztcclxuXHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhcik7XHJcblx0XHR9XHJcblxyXG5cdFx0aW5kZXgrKztcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRsZXQgcm9vdDogYW55ID0gbnVsbDtcclxuXHRjb25zdCBzdGFjazogYW55W10gPSBbXTtcclxuXHJcblx0ZnVuY3Rpb24gcHVzaENvbnRhaW5lcih2YWx1ZTogYW55KSB7XHJcblx0XHRpZiAoIXN0YWNrLmxlbmd0aCkge1xyXG5cdFx0XHRzdGFjay5wdXNoKHZhbHVlKTtcclxuXHRcdFx0cm9vdCA9IHZhbHVlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHVzaFZhbHVlKHZhbHVlKTtcclxuXHRcdFx0c3RhY2sucHVzaCh2YWx1ZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwdXNoVmFsdWUodmFsdWU6IGFueSkge1xyXG5cdFx0aWYgKCFzdGFjay5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRhJyk7XHJcblxyXG5cdFx0Y29uc3QgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XHJcblxyXG5cdFx0aWYgKHR5cGVvZiB0b3AgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdHN0YWNrW3N0YWNrLmxlbmd0aCAtIDJdW3RvcF0gPSB2YWx1ZTtcclxuXHRcdFx0cG9wKCk7XHJcblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodG9wKSkge1xyXG5cdFx0XHR0b3AucHVzaCh2YWx1ZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YScpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcHVzaFByb3BlcnR5KG5hbWU6IHN0cmluZykge1xyXG5cdFx0aWYgKCFzdGFjay5sZW5ndGgpIHB1c2hDb250YWluZXIoe30pO1xyXG5cclxuXHRcdGNvbnN0IHRvcCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xyXG5cclxuXHRcdGlmICh0b3AgJiYgdHlwZW9mIHRvcCA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0aWYgKG5hbWUgPT09ICduaWwnKSB7XHJcblx0XHRcdFx0cHVzaFZhbHVlKG51bGwpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHB1c2hWYWx1ZShgLyR7bmFtZX1gKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0b3AgJiYgdHlwZW9mIHRvcCA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0c3RhY2sucHVzaChuYW1lKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRhJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwb3AoKSB7XHJcblx0XHRpZiAoIXN0YWNrLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEnKTtcclxuXHRcdHN0YWNrLnBvcCgpO1xyXG5cdH1cclxuXHJcblx0c2tpcFdoaXRlc3BhY2UoKTtcclxuXHJcblx0d2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGgpIHtcclxuXHRcdGNvbnN0IGkgPSBpbmRleDtcclxuXHRcdGNvbnN0IGNoYXIgPSBkYXRhW2ldO1xyXG5cclxuXHRcdGlmIChjaGFyID09PSA2MCAmJiBkYXRhW2kgKyAxXSA9PT0gNjApIHsgLy8gPDxcclxuXHRcdFx0aW5kZXggKz0gMjtcclxuXHRcdFx0cHVzaENvbnRhaW5lcih7fSk7XHJcblx0XHR9IGVsc2UgaWYgKGNoYXIgPT09IDYyICYmIGRhdGFbaSArIDFdID09PSA2MikgeyAvLyA+PlxyXG5cdFx0XHRpbmRleCArPSAyO1xyXG5cdFx0XHRwb3AoKTtcclxuXHRcdH0gZWxzZSBpZiAoY2hhciA9PT0gNDcpIHsgLy8gL1xyXG5cdFx0XHRpbmRleCArPSAxO1xyXG5cdFx0XHRjb25zdCBzdGFydCA9IGluZGV4O1xyXG5cclxuXHRcdFx0d2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGggJiYgIWlzV2hpdGVzcGFjZShkYXRhW2luZGV4XSkpIHtcclxuXHRcdFx0XHRpbmRleCsrO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgbmFtZSA9ICcnO1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgaW5kZXg7IGkrKykge1xyXG5cdFx0XHRcdG5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2ldKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cHVzaFByb3BlcnR5KG5hbWUpO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSA0MCkgeyAvLyAoXHJcblx0XHRcdGluZGV4ICs9IDE7XHJcblx0XHRcdHB1c2hWYWx1ZShnZXRUZXh0KCkpO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSA5MSkgeyAvLyBbXHJcblx0XHRcdGluZGV4ICs9IDE7XHJcblx0XHRcdHB1c2hDb250YWluZXIoW10pO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSA5MykgeyAvLyBdXHJcblx0XHRcdGluZGV4ICs9IDE7XHJcblx0XHRcdHBvcCgpO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSAxMTAgJiYgZGF0YVtpICsgMV0gPT09IDExNyAmJiBkYXRhW2kgKyAyXSA9PT0gMTA4ICYmIGRhdGFbaSArIDNdID09PSAxMDgpIHsgLy8gbnVsbFxyXG5cdFx0XHRpbmRleCArPSA0O1xyXG5cdFx0XHRwdXNoVmFsdWUobnVsbCk7XHJcblx0XHR9IGVsc2UgaWYgKGNoYXIgPT09IDExNiAmJiBkYXRhW2kgKyAxXSA9PT0gMTE0ICYmIGRhdGFbaSArIDJdID09PSAxMTcgJiYgZGF0YVtpICsgM10gPT09IDEwMSkgeyAvLyB0cnVlXHJcblx0XHRcdGluZGV4ICs9IDQ7XHJcblx0XHRcdHB1c2hWYWx1ZSh0cnVlKTtcclxuXHRcdH0gZWxzZSBpZiAoY2hhciA9PT0gMTAyICYmIGRhdGFbaSArIDFdID09PSA5NyAmJiBkYXRhW2kgKyAyXSA9PT0gMTA4ICYmIGRhdGFbaSArIDNdID09PSAxMTUgJiYgZGF0YVtpICsgNF0gPT09IDEwMSkgeyAvLyBmYWxzZVxyXG5cdFx0XHRpbmRleCArPSA1O1xyXG5cdFx0XHRwdXNoVmFsdWUoZmFsc2UpO1xyXG5cdFx0fSBlbHNlIGlmIChpc051bWJlcihjaGFyKSkge1xyXG5cdFx0XHRsZXQgdmFsdWUgPSAnJztcclxuXHJcblx0XHRcdHdoaWxlIChpbmRleCA8IGRhdGEubGVuZ3RoICYmIGlzTnVtYmVyKGRhdGFbaW5kZXhdKSkge1xyXG5cdFx0XHRcdHZhbHVlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZGF0YVtpbmRleF0pO1xyXG5cdFx0XHRcdGluZGV4Kys7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHB1c2hWYWx1ZShwYXJzZUZsb2F0KHZhbHVlKSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpbmRleCArPSAxO1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgSW52YWxpZCB0b2tlbiAke1N0cmluZy5mcm9tQ2hhckNvZGUoY2hhcil9IGF0ICR7aW5kZXh9YCk7XHJcblx0XHRcdC8vIGAgbmVhciAke1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgZGF0YS5zbGljZShpbmRleCAtIDEwLCBpbmRleCArIDIwKSBhcyBhbnkpfWAgK1xyXG5cdFx0XHQvLyBgZGF0YSBbJHtBcnJheS5mcm9tKGRhdGEuc2xpY2UoaW5kZXggLSAxMCwgaW5kZXggKyAyMCkpLmpvaW4oJywgJyl9XWBcclxuXHRcdH1cclxuXHJcblx0XHRza2lwV2hpdGVzcGFjZSgpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJvb3Q7XHJcbn1cclxuXHJcbmNvbnN0IGZsb2F0S2V5cyA9IFtcclxuXHQnQXhpcycsICdYWScsICdab25lJywgJ1dvcmRTcGFjaW5nJywgJ0ZpcnN0TGluZUluZGVudCcsICdHbHlwaFNwYWNpbmcnLCAnU3RhcnRJbmRlbnQnLCAnRW5kSW5kZW50JywgJ1NwYWNlQmVmb3JlJyxcclxuXHQnU3BhY2VBZnRlcicsICdMZXR0ZXJTcGFjaW5nJywgJ1ZhbHVlcycsICdHcmlkU2l6ZScsICdHcmlkTGVhZGluZycsICdQb2ludEJhc2UnLCAnQm94Qm91bmRzJywgJ1RyYW5zZm9ybVBvaW50MCcsICdUcmFuc2Zvcm1Qb2ludDEnLFxyXG5cdCdUcmFuc2Zvcm1Qb2ludDInLCAnRm9udFNpemUnLCAnTGVhZGluZycsICdIb3Jpem9udGFsU2NhbGUnLCAnVmVydGljYWxTY2FsZScsICdCYXNlbGluZVNoaWZ0JywgJ1RzdW1lJyxcclxuXHQnT3V0bGluZVdpZHRoJywgJ0F1dG9MZWFkaW5nJyxcclxuXTtcclxuXHJcbmNvbnN0IGludEFycmF5cyA9IFsnUnVuTGVuZ3RoQXJyYXknXTtcclxuXHJcbi8vIFRPRE86IGhhbmRsZSAvbmlsXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFbmdpbmVEYXRhKGRhdGE6IGFueSwgY29uZGVuc2VkID0gZmFsc2UpIHtcclxuXHRsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTAyNCk7XHJcblx0bGV0IG9mZnNldCA9IDA7XHJcblx0bGV0IGluZGVudCA9IDA7XHJcblxyXG5cdGZ1bmN0aW9uIHdyaXRlKHZhbHVlOiBudW1iZXIpIHtcclxuXHRcdGlmIChvZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xyXG5cdFx0XHRjb25zdCBuZXdCdWZmZXIgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICogMik7XHJcblx0XHRcdG5ld0J1ZmZlci5zZXQoYnVmZmVyKTtcclxuXHRcdFx0YnVmZmVyID0gbmV3QnVmZmVyO1xyXG5cdFx0fVxyXG5cclxuXHRcdGJ1ZmZlcltvZmZzZXRdID0gdmFsdWU7XHJcblx0XHRvZmZzZXQrKztcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcpIHtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0d3JpdGUodmFsdWUuY2hhckNvZGVBdChpKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB3cml0ZUluZGVudCgpIHtcclxuXHRcdGlmIChjb25kZW5zZWQpIHtcclxuXHRcdFx0d3JpdGVTdHJpbmcoJyAnKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnXFx0Jyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHdyaXRlUHJvcGVydHkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuXHRcdHdyaXRlSW5kZW50KCk7XHJcblx0XHR3cml0ZVN0cmluZyhgLyR7a2V5fWApO1xyXG5cdFx0d3JpdGVWYWx1ZSh2YWx1ZSwga2V5LCB0cnVlKTtcclxuXHRcdGlmICghY29uZGVuc2VkKSB3cml0ZVN0cmluZygnXFxuJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXJpYWxpemVJbnQodmFsdWU6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXJpYWxpemVGbG9hdCh2YWx1ZTogbnVtYmVyKSB7XHJcblx0XHRyZXR1cm4gdmFsdWUudG9GaXhlZCg1KVxyXG5cdFx0XHQucmVwbGFjZSgvKFxcZCkwKyQvZywgJyQxJylcclxuXHRcdFx0LnJlcGxhY2UoL14wK1xcLihbMS05XSkvZywgJy4kMScpXHJcblx0XHRcdC5yZXBsYWNlKC9eLTArXFwuMChcXGQpL2csICctLjAkMScpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2VyaWFsaXplTnVtYmVyKHZhbHVlOiBudW1iZXIsIGtleT86IHN0cmluZykge1xyXG5cdFx0Y29uc3QgaXNGbG9hdCA9IChrZXkgJiYgZmxvYXRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHx8ICh2YWx1ZSB8IDApICE9PSB2YWx1ZTtcclxuXHRcdHJldHVybiBpc0Zsb2F0ID8gc2VyaWFsaXplRmxvYXQodmFsdWUpIDogc2VyaWFsaXplSW50KHZhbHVlKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldEtleXModmFsdWU6IGFueSkge1xyXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcclxuXHJcblx0XHRpZiAoa2V5cy5pbmRleE9mKCc5OCcpICE9PSAtMSlcclxuXHRcdFx0a2V5cy51bnNoaWZ0KC4uLmtleXMuc3BsaWNlKGtleXMuaW5kZXhPZignOTknKSwgMSkpO1xyXG5cclxuXHRcdGlmIChrZXlzLmluZGV4T2YoJzk5JykgIT09IC0xKVxyXG5cdFx0XHRrZXlzLnVuc2hpZnQoLi4ua2V5cy5zcGxpY2Uoa2V5cy5pbmRleE9mKCc5OScpLCAxKSk7XHJcblxyXG5cdFx0cmV0dXJuIGtleXM7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB3cml0ZVN0cmluZ0J5dGUodmFsdWU6IG51bWJlcikge1xyXG5cdFx0aWYgKHZhbHVlID09PSA0MCB8fCB2YWx1ZSA9PT0gNDEgfHwgdmFsdWUgPT09IDkyKSB7IC8vICggKSBcXFxyXG5cdFx0XHR3cml0ZSg5Mik7IC8vIFxcXHJcblx0XHR9XHJcblxyXG5cdFx0d3JpdGUodmFsdWUpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gd3JpdGVWYWx1ZSh2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcsIGluUHJvcGVydHkgPSBmYWxzZSkge1xyXG5cdFx0ZnVuY3Rpb24gd3JpdGVQcmVmaXgoKSB7XHJcblx0XHRcdGlmIChpblByb3BlcnR5KSB7XHJcblx0XHRcdFx0d3JpdGVTdHJpbmcoJyAnKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR3cml0ZUluZGVudCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHZhbHVlID09PSBudWxsKSB7XHJcblx0XHRcdHdyaXRlUHJlZml4KCk7XHJcblx0XHRcdHdyaXRlU3RyaW5nKGNvbmRlbnNlZCA/ICcvbmlsJyA6ICdudWxsJyk7XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuXHRcdFx0d3JpdGVQcmVmaXgoKTtcclxuXHRcdFx0d3JpdGVTdHJpbmcoc2VyaWFsaXplTnVtYmVyKHZhbHVlLCBrZXkpKTtcclxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuXHRcdFx0d3JpdGVQcmVmaXgoKTtcclxuXHRcdFx0d3JpdGVTdHJpbmcodmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKTtcclxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHR3cml0ZVByZWZpeCgpO1xyXG5cclxuXHRcdFx0aWYgKChrZXkgPT09ICc5OScgfHwga2V5ID09PSAnOTgnKSAmJiB2YWx1ZS5jaGFyQXQoMCkgPT09ICcvJykge1xyXG5cdFx0XHRcdHdyaXRlU3RyaW5nKHZhbHVlKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnKCcpO1xyXG5cdFx0XHRcdHdyaXRlKDB4ZmUpO1xyXG5cdFx0XHRcdHdyaXRlKDB4ZmYpO1xyXG5cclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChpKTtcclxuXHRcdFx0XHRcdHdyaXRlU3RyaW5nQnl0ZSgoY29kZSA+PiA4KSAmIDB4ZmYpO1xyXG5cdFx0XHRcdFx0d3JpdGVTdHJpbmdCeXRlKGNvZGUgJiAweGZmKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHdyaXRlU3RyaW5nKCcpJyk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuXHRcdFx0d3JpdGVQcmVmaXgoKTtcclxuXHJcblx0XHRcdGlmICh2YWx1ZS5ldmVyeSh4ID0+IHR5cGVvZiB4ID09PSAnbnVtYmVyJykpIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnWycpO1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRBcnJheSA9IGludEFycmF5cy5pbmRleE9mKGtleSEpICE9PSAtMTtcclxuXHJcblx0XHRcdFx0Zm9yIChjb25zdCB4IG9mIHZhbHVlKSB7XHJcblx0XHRcdFx0XHR3cml0ZVN0cmluZygnICcpO1xyXG5cdFx0XHRcdFx0d3JpdGVTdHJpbmcoaW50QXJyYXkgPyBzZXJpYWxpemVOdW1iZXIoeCkgOiBzZXJpYWxpemVGbG9hdCh4KSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR3cml0ZVN0cmluZygnIF0nKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnWycpO1xyXG5cdFx0XHRcdGlmICghY29uZGVuc2VkKSB3cml0ZVN0cmluZygnXFxuJyk7XHJcblxyXG5cdFx0XHRcdGZvciAoY29uc3QgeCBvZiB2YWx1ZSkge1xyXG5cdFx0XHRcdFx0d3JpdGVWYWx1ZSh4LCBrZXkpO1xyXG5cdFx0XHRcdFx0aWYgKCFjb25kZW5zZWQpIHdyaXRlU3RyaW5nKCdcXG4nKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHdyaXRlSW5kZW50KCk7XHJcblx0XHRcdFx0d3JpdGVTdHJpbmcoJ10nKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcblx0XHRcdGlmIChpblByb3BlcnR5ICYmICFjb25kZW5zZWQpIHdyaXRlU3RyaW5nKCdcXG4nKTtcclxuXHJcblx0XHRcdHdyaXRlSW5kZW50KCk7XHJcblx0XHRcdHdyaXRlU3RyaW5nKCc8PCcpO1xyXG5cclxuXHRcdFx0aWYgKCFjb25kZW5zZWQpIHdyaXRlU3RyaW5nKCdcXG4nKTtcclxuXHJcblx0XHRcdGluZGVudCsrO1xyXG5cclxuXHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgZ2V0S2V5cyh2YWx1ZSkpIHtcclxuXHRcdFx0XHR3cml0ZVByb3BlcnR5KGtleSwgdmFsdWVba2V5XSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGluZGVudC0tO1xyXG5cdFx0XHR3cml0ZUluZGVudCgpO1xyXG5cdFx0XHR3cml0ZVN0cmluZygnPj4nKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0aWYgKGNvbmRlbnNlZCkge1xyXG5cdFx0aWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRmb3IgKGNvbnN0IGtleSBvZiBnZXRLZXlzKGRhdGEpKSB7XHJcblx0XHRcdFx0d3JpdGVQcm9wZXJ0eShrZXksIGRhdGFba2V5XSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9IGVsc2Uge1xyXG5cdFx0d3JpdGVTdHJpbmcoJ1xcblxcbicpO1xyXG5cdFx0d3JpdGVWYWx1ZShkYXRhKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBidWZmZXIuc2xpY2UoMCwgb2Zmc2V0KTtcclxufVxyXG4iXSwic291cmNlUm9vdCI6IkM6XFxQcm9qZWN0c1xcZ2l0aHViXFxhZy1wc2RcXHNyYyJ9