@coolwallet/sol
Version:
Coolwallet Solana sdk
139 lines (137 loc) • 20.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.computeBudgetEncode = computeBudgetEncode;
exports.numberToStringHex = exports.isBase58Format = exports.formHex = exports.encodeLength = void 0;
exports.pubKeyToAddress = pubKeyToAddress;
exports.splDataEncode = splDataEncode;
exports.toBase58 = toBase58;
exports.toBase58Buffer = toBase58Buffer;
exports.toPublicKey = toPublicKey;
exports.toReverseUintBuffer = toReverseUintBuffer;
exports.toUintBuffer = toUintBuffer;
var _bs = _interopRequireDefault(require("bs58"));
var _bn = _interopRequireDefault(require("bn.js"));
var types = _interopRequireWildcard(require("../config/types"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
var HEX_REGEX = /[0-9A-Fa-f]{6}/g;
var isBase58Format = function isBase58Format(value) {
if (!value) return false;
return /^[A-HJ-NP-Za-km-z1-9]*$/.test(value);
};
exports.isBase58Format = isBase58Format;
function isHexFormat(value) {
var match = value.match(HEX_REGEX);
return !!match;
}
function toBase58(publicKey) {
if (typeof publicKey === 'string') {
if (isBase58Format(publicKey)) return publicKey;
if (isHexFormat(publicKey)) return _bs["default"].encode(Buffer.from(publicKey, 'hex'));
return publicKey;
}
return _bs["default"].encode(publicKey);
}
function toBase58Buffer(publicKey) {
if (typeof publicKey === 'string') {
if (isBase58Format(publicKey)) return _bs["default"].decode(publicKey);
if (isHexFormat(publicKey)) return Buffer.from(publicKey, 'hex');
return Buffer.from(publicKey);
}
return publicKey;
}
function toPublicKey(publicKey) {
if (typeof publicKey === 'string') return publicKey;
return _bs["default"].encode(publicKey);
}
function pubKeyToAddress(publicKey) {
var pubKeyBuf = Buffer.from(publicKey, 'hex');
return _bs["default"].encode(pubKeyBuf);
}
/**
* CW-21334 Fixed user's publicKey just matches the base58 encoding, resulting in repeated decoding.
*
* The user's Solana address (base58 encoded) is:
* 5XZiuCyozesbRJsSdoJQCTHQRnTGDfSms5bV1ybLn9yg
*
* After converting it to Hex:
* fc238b62abd32cd576f1d5568d3b6b5cb2fbc57b419cc2b4cd8a2814973919a7
* This hex conform to the Base58 format (without 0, O, i, I, +, /), causing base58.decode to be executed again, resulting in an incorrect publicKey.
*
* How to fix it:
* Adjust base58 verification method. A 32-byte public key can only be base58 encoded using 43 or 44 characters.
*/
var formHex = function formHex(address) {
if (!address) return '';
if (typeof address === 'string') {
if (isBase58Format(address)) return _bs["default"].decode(address).toString('hex');
return address;
}
return address.toString('hex');
};
exports.formHex = formHex;
var numberToStringHex = function numberToStringHex(value, pad) {
return Buffer.from(typeof value === 'number' ? [value] : value).toString('hex').padStart(pad, '0');
};
exports.numberToStringHex = numberToStringHex;
var encodeLength = function encodeLength(bytes, len) {
var rem_len = len;
for (;;) {
var elem = rem_len & 0x7f;
rem_len >>= 7;
if (rem_len == 0) {
bytes.push(elem);
break;
} else {
elem |= 0x80;
bytes.push(elem);
}
}
};
exports.encodeLength = encodeLength;
function toReverseUintBuffer(numberOrString, byteSize) {
var bn = new _bn["default"](numberOrString);
var buf = Buffer.from(bn.toArray()).reverse();
return Buffer.alloc(byteSize).fill(buf, 0, buf.length);
}
function toUintBuffer(numberOrString, byteSize) {
var bn = new _bn["default"](numberOrString);
var buf = Buffer.from(bn.toArray());
return Buffer.alloc(byteSize).fill(buf, byteSize - buf.length, byteSize);
}
function computeBudgetEncode(type, amount) {
var data;
var length;
switch (type) {
case types.ComputeBudgetInstruction.SetComputeUnitLimit:
data = Buffer.alloc(5);
length = 4;
break;
case types.ComputeBudgetInstruction.SetComputeUnitPrice:
data = Buffer.alloc(9);
length = 8;
break;
default:
throw new Error('Not supported ComputeBudgetInstruction type: ' + type);
}
var typeSpan = 1;
data.writeUIntLE(type, 0, typeSpan);
var valueBuf = toReverseUintBuffer(amount, length);
data.write(valueBuf.toString('hex'), typeSpan, length, 'hex');
return data;
}
function splDataEncode(amount, tokenDecimals) {
var data = Buffer.alloc(10);
var programIdIndexSpan = 1;
data.writeUIntLE(types.TokenInstruction.TransferChecked, 0, programIdIndexSpan);
var valueHex = new _bn["default"](amount).toString(16, 8 * 2);
var valueBuf = Buffer.from(valueHex, 'hex').reverse();
data.write(valueBuf.toString('hex'), programIdIndexSpan, 8, 'hex');
data.writeUInt8(+tokenDecimals, 9);
return data;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9ibiIsInR5cGVzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiSEVYX1JFR0VYIiwiaXNCYXNlNThGb3JtYXQiLCJ2YWx1ZSIsInRlc3QiLCJleHBvcnRzIiwiaXNIZXhGb3JtYXQiLCJtYXRjaCIsInRvQmFzZTU4IiwicHVibGljS2V5IiwiYmFzZTU4IiwiZW5jb2RlIiwiQnVmZmVyIiwiZnJvbSIsInRvQmFzZTU4QnVmZmVyIiwiZGVjb2RlIiwidG9QdWJsaWNLZXkiLCJwdWJLZXlUb0FkZHJlc3MiLCJwdWJLZXlCdWYiLCJmb3JtSGV4IiwiYWRkcmVzcyIsInRvU3RyaW5nIiwibnVtYmVyVG9TdHJpbmdIZXgiLCJwYWQiLCJwYWRTdGFydCIsImVuY29kZUxlbmd0aCIsImJ5dGVzIiwibGVuIiwicmVtX2xlbiIsImVsZW0iLCJwdXNoIiwidG9SZXZlcnNlVWludEJ1ZmZlciIsIm51bWJlck9yU3RyaW5nIiwiYnl0ZVNpemUiLCJibiIsIkJOIiwiYnVmIiwidG9BcnJheSIsInJldmVyc2UiLCJhbGxvYyIsImZpbGwiLCJsZW5ndGgiLCJ0b1VpbnRCdWZmZXIiLCJjb21wdXRlQnVkZ2V0RW5jb2RlIiwidHlwZSIsImFtb3VudCIsImRhdGEiLCJDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24iLCJTZXRDb21wdXRlVW5pdExpbWl0IiwiU2V0Q29tcHV0ZVVuaXRQcmljZSIsIkVycm9yIiwidHlwZVNwYW4iLCJ3cml0ZVVJbnRMRSIsInZhbHVlQnVmIiwid3JpdGUiLCJzcGxEYXRhRW5jb2RlIiwidG9rZW5EZWNpbWFscyIsInByb2dyYW1JZEluZGV4U3BhbiIsIlRva2VuSW5zdHJ1Y3Rpb24iLCJUcmFuc2ZlckNoZWNrZWQiLCJ2YWx1ZUhleCIsIndyaXRlVUludDgiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc3RyaW5nVXRpbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IEJOIGZyb20gJ2JuLmpzJztcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQgeyBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24gfSBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuXG5jb25zdCBIRVhfUkVHRVggPSAvWzAtOUEtRmEtZl17Nn0vZztcblxuZXhwb3J0IGNvbnN0IGlzQmFzZTU4Rm9ybWF0ID0gKHZhbHVlPzogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGlmICghdmFsdWUpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9eW0EtSEotTlAtWmEta20tejEtOV0qJC8udGVzdCh2YWx1ZSk7XG59O1xuXG5mdW5jdGlvbiBpc0hleEZvcm1hdCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1hdGNoID0gdmFsdWUubWF0Y2goSEVYX1JFR0VYKTtcbiAgcmV0dXJuICEhbWF0Y2g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Jhc2U1OChwdWJsaWNLZXk6IHR5cGVzLkFkZHJlc3MpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoaXNCYXNlNThGb3JtYXQocHVibGljS2V5KSkgcmV0dXJuIHB1YmxpY0tleTtcbiAgICBpZiAoaXNIZXhGb3JtYXQocHVibGljS2V5KSkgcmV0dXJuIGJhc2U1OC5lbmNvZGUoQnVmZmVyLmZyb20ocHVibGljS2V5LCAnaGV4JykpO1xuICAgIHJldHVybiBwdWJsaWNLZXk7XG4gIH1cbiAgcmV0dXJuIGJhc2U1OC5lbmNvZGUocHVibGljS2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQmFzZTU4QnVmZmVyKHB1YmxpY0tleTogdHlwZXMuQWRkcmVzcyk6IEJ1ZmZlciB7XG4gIGlmICh0eXBlb2YgcHVibGljS2V5ID09PSAnc3RyaW5nJykge1xuICAgIGlmIChpc0Jhc2U1OEZvcm1hdChwdWJsaWNLZXkpKSByZXR1cm4gYmFzZTU4LmRlY29kZShwdWJsaWNLZXkpO1xuICAgIGlmIChpc0hleEZvcm1hdChwdWJsaWNLZXkpKSByZXR1cm4gQnVmZmVyLmZyb20ocHVibGljS2V5LCAnaGV4Jyk7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHB1YmxpY0tleSk7XG4gIH1cbiAgcmV0dXJuIHB1YmxpY0tleTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nIHwgQnVmZmVyKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBwdWJsaWNLZXkgPT09ICdzdHJpbmcnKSByZXR1cm4gcHVibGljS2V5O1xuICByZXR1cm4gYmFzZTU4LmVuY29kZShwdWJsaWNLZXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHViS2V5VG9BZGRyZXNzKHB1YmxpY0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcHViS2V5QnVmID0gQnVmZmVyLmZyb20ocHVibGljS2V5LCAnaGV4Jyk7XG4gIHJldHVybiBiYXNlNTguZW5jb2RlKHB1YktleUJ1Zik7XG59XG5cbi8qKlxuICogQ1ctMjEzMzQgRml4ZWQgdXNlcidzIHB1YmxpY0tleSBqdXN0IG1hdGNoZXMgdGhlIGJhc2U1OCBlbmNvZGluZywgcmVzdWx0aW5nIGluIHJlcGVhdGVkIGRlY29kaW5nLlxuICpcbiAqIFRoZSB1c2VyJ3MgU29sYW5hIGFkZHJlc3MgKGJhc2U1OCBlbmNvZGVkKSBpczpcbiAqIDVYWml1Q3lvemVzYlJKc1Nkb0pRQ1RIUVJuVEdEZlNtczViVjF5YkxuOXlnXG4gKlxuICogQWZ0ZXIgY29udmVydGluZyBpdCB0byBIZXg6XG4gKiBmYzIzOGI2MmFiZDMyY2Q1NzZmMWQ1NTY4ZDNiNmI1Y2IyZmJjNTdiNDE5Y2MyYjRjZDhhMjgxNDk3MzkxOWE3XG4gKiBUaGlzIGhleCBjb25mb3JtIHRvIHRoZSBCYXNlNTggZm9ybWF0ICh3aXRob3V0IDAsIE8sIGksIEksICssIC8pLCBjYXVzaW5nIGJhc2U1OC5kZWNvZGUgdG8gYmUgZXhlY3V0ZWQgYWdhaW4sIHJlc3VsdGluZyBpbiBhbiBpbmNvcnJlY3QgcHVibGljS2V5LiBcbiAqXG4gKiBIb3cgdG8gZml4IGl0OlxuICogQWRqdXN0IGJhc2U1OCB2ZXJpZmljYXRpb24gbWV0aG9kLiBBIDMyLWJ5dGUgcHVibGljIGtleSBjYW4gb25seSBiZSBiYXNlNTggZW5jb2RlZCB1c2luZyA0MyBvciA0NCBjaGFyYWN0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgZm9ybUhleCA9IChhZGRyZXNzOiBzdHJpbmcgfCBCdWZmZXIgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWFkZHJlc3MpIHJldHVybiAnJztcbiAgaWYgKHR5cGVvZiBhZGRyZXNzID09PSAnc3RyaW5nJykge1xuICAgIGlmIChpc0Jhc2U1OEZvcm1hdChhZGRyZXNzKSkgcmV0dXJuIGJhc2U1OC5kZWNvZGUoYWRkcmVzcykudG9TdHJpbmcoJ2hleCcpO1xuICAgIHJldHVybiBhZGRyZXNzO1xuICB9XG4gIHJldHVybiBhZGRyZXNzLnRvU3RyaW5nKCdoZXgnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBudW1iZXJUb1N0cmluZ0hleCA9ICh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10sIHBhZDogbnVtYmVyKTogc3RyaW5nID0+XG4gIEJ1ZmZlci5mcm9tKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyBbdmFsdWVdIDogdmFsdWUpXG4gICAgLnRvU3RyaW5nKCdoZXgnKVxuICAgIC5wYWRTdGFydChwYWQsICcwJyk7XG5cbmV4cG9ydCBjb25zdCBlbmNvZGVMZW5ndGggPSAoYnl0ZXM6IG51bWJlcltdLCBsZW46IG51bWJlcik6IHZvaWQgPT4ge1xuICBsZXQgcmVtX2xlbiA9IGxlbjtcbiAgZm9yICg7Oykge1xuICAgIGxldCBlbGVtID0gcmVtX2xlbiAmIDB4N2Y7XG4gICAgcmVtX2xlbiA+Pj0gNztcbiAgICBpZiAocmVtX2xlbiA9PSAwKSB7XG4gICAgICBieXRlcy5wdXNoKGVsZW0pO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW0gfD0gMHg4MDtcbiAgICAgIGJ5dGVzLnB1c2goZWxlbSk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdG9SZXZlcnNlVWludEJ1ZmZlcihudW1iZXJPclN0cmluZzogbnVtYmVyIHwgc3RyaW5nLCBieXRlU2l6ZTogbnVtYmVyKTogQnVmZmVyIHtcbiAgY29uc3QgYm4gPSBuZXcgQk4obnVtYmVyT3JTdHJpbmcpO1xuICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShibi50b0FycmF5KCkpLnJldmVyc2UoKTtcbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhieXRlU2l6ZSkuZmlsbChidWYsIDAsIGJ1Zi5sZW5ndGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9VaW50QnVmZmVyKG51bWJlck9yU3RyaW5nOiBudW1iZXIgfCBzdHJpbmcsIGJ5dGVTaXplOiBudW1iZXIpOiBCdWZmZXIge1xuICBjb25zdCBibiA9IG5ldyBCTihudW1iZXJPclN0cmluZyk7XG4gIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKGJuLnRvQXJyYXkoKSk7XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoYnl0ZVNpemUpLmZpbGwoYnVmLCBieXRlU2l6ZSAtIGJ1Zi5sZW5ndGgsIGJ5dGVTaXplKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVCdWRnZXRFbmNvZGUodHlwZTogQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLCBhbW91bnQ6IG51bWJlciB8IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGxldCBkYXRhO1xuICBsZXQgbGVuZ3RoO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbi5TZXRDb21wdXRlVW5pdExpbWl0OlxuICAgICAgZGF0YSA9IEJ1ZmZlci5hbGxvYyg1KTtcbiAgICAgIGxlbmd0aCA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbi5TZXRDb21wdXRlVW5pdFByaWNlOlxuICAgICAgZGF0YSA9IEJ1ZmZlci5hbGxvYyg5KTtcbiAgICAgIGxlbmd0aCA9IDg7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbiB0eXBlOiAnICsgdHlwZSk7XG4gIH1cblxuICBjb25zdCB0eXBlU3BhbiA9IDE7XG4gIGRhdGEud3JpdGVVSW50TEUodHlwZSwgMCwgdHlwZVNwYW4pO1xuICBjb25zdCB2YWx1ZUJ1ZiA9IHRvUmV2ZXJzZVVpbnRCdWZmZXIoYW1vdW50LCBsZW5ndGgpO1xuICBkYXRhLndyaXRlKHZhbHVlQnVmLnRvU3RyaW5nKCdoZXgnKSwgdHlwZVNwYW4sIGxlbmd0aCwgJ2hleCcpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsRGF0YUVuY29kZShhbW91bnQ6IG51bWJlciB8IHN0cmluZywgdG9rZW5EZWNpbWFsczogbnVtYmVyIHwgc3RyaW5nKTogQnVmZmVyIHtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxMCk7XG4gIGNvbnN0IHByb2dyYW1JZEluZGV4U3BhbiA9IDE7XG4gIGRhdGEud3JpdGVVSW50TEUodHlwZXMuVG9rZW5JbnN0cnVjdGlvbi5UcmFuc2ZlckNoZWNrZWQsIDAsIHByb2dyYW1JZEluZGV4U3Bhbik7XG5cbiAgY29uc3QgdmFsdWVIZXggPSBuZXcgQk4oYW1vdW50KS50b1N0cmluZygxNiwgOCAqIDIpO1xuICBjb25zdCB2YWx1ZUJ1ZiA9IEJ1ZmZlci5mcm9tKHZhbHVlSGV4LCAnaGV4JykucmV2ZXJzZSgpO1xuXG4gIGRhdGEud3JpdGUodmFsdWVCdWYudG9TdHJpbmcoJ2hleCcpLCBwcm9ncmFtSWRJbmRleFNwYW4sIDgsICdoZXgnKTtcbiAgZGF0YS53cml0ZVVJbnQ4KCt0b2tlbkRlY2ltYWxzLCA5KTtcbiAgcmV0dXJuIGRhdGE7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxHQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxHQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFDLHVCQUFBLENBQUFILE9BQUE7QUFBeUMsU0FBQUkseUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxXQUFBLFdBQUFBLFdBQUEsR0FBQUcsZ0JBQUEsR0FBQUQsaUJBQUEsS0FBQUYsV0FBQTtBQUFBLFNBQUFGLHdCQUFBTSxHQUFBLEVBQUFKLFdBQUEsU0FBQUEsV0FBQSxJQUFBSSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxXQUFBRCxHQUFBLFFBQUFBLEdBQUEsYUFBQUUsT0FBQSxDQUFBRixHQUFBLHlCQUFBQSxHQUFBLHVDQUFBQSxHQUFBLFVBQUFHLEtBQUEsR0FBQVIsd0JBQUEsQ0FBQUMsV0FBQSxPQUFBTyxLQUFBLElBQUFBLEtBQUEsQ0FBQUMsR0FBQSxDQUFBSixHQUFBLFlBQUFHLEtBQUEsQ0FBQUUsR0FBQSxDQUFBTCxHQUFBLFNBQUFNLE1BQUEsV0FBQUMscUJBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEs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