UNPKG

qos-qweb

Version:
200 lines 17.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const bech32_1 = __importDefault(require("bech32")); const int64_buffer_1 = require("int64-buffer"); const js_amino_1 = require("js-amino"); const tweetnacl_1 = __importDefault(require("tweetnacl")); const _1 = require("."); const common_1 = require("../types/common"); const tx_1 = require("../types/tx"); function getOriginAddress(address) { const addrDecode = bech32_1.default.decode(address); const fromwords = bech32_1.default.fromWords(addrDecode.words); return fromwords; } exports.getOriginAddress = getOriginAddress; function signTxMsg(oMsg) { const msg = makeTxSignMsg(oMsg); const signatureData = tweetnacl_1.default.sign.detached(Buffer.from(msg.signedMsg), oMsg.account.keypair.secretKey); const codec = registerCodec(); const pubKey = new tx_1.PubKeyEd25519([...oMsg.account.keypair.publicKey]); const sig = new tx_1.Signature(pubKey, [...signatureData], oMsg.nonce.toString()); const sendMultiMsg = new tx_1.MsgMultiSend(msg.senders, msg.receivers); const stdtx = new tx_1.StdTx(sendMultiMsg, [sig], oMsg.chainid, oMsg.maxGas.toString()); // const jsonTx = codec.marshalJson(stdtx) // logger.debug('stdtx: ') // logger.info(jsonTx) // logger.debug('marshalBinary: ') const binary = codec.marshalBinary(stdtx); // logger.debug(binary.toString()) // const decodedDataTx = new StdTx(); // codec.unMarshalBinary(binary, decodedDataTx) // logger.debug('unMb StdTx: ') // logger.info(decodedDataTx.JsObject()) return binary; } exports.signTxMsg = signTxMsg; function makeTxSignMsg({ account, tx, chainid, maxGas, nonce }) { let arrMsg = []; // push buffer of orginaddress const fromAddress = getOriginAddress(account.address); arrMsg = arrMsg.concat(fromAddress); const allData = composeData(tx); // concat buffer of qosAmount arrMsg = arrMsg.concat([..._1.stringToBuffer(allData.qosAmount.toString())]); // concat buffer of qscAmount const qscArray = []; const qscArr = []; for (const qsc of allData.qscAmountArr) { qscArray.push(`${qsc.amount}${qsc.coinName}`); qscArr.push(new tx_1.QSC(qsc.coinName, qsc.amount.toString())); } // compose qsc string , e.g. 2qsca,3qscb const qscString = qscArray.join(','); arrMsg = arrMsg.concat([..._1.stringToBuffer(qscString)]); arrMsg = arrMsg.concat([...allData.arrReceiver]); const chaidBufferArray = [..._1.stringToBuffer(chainid)]; arrMsg = arrMsg.concat(chaidBufferArray); arrMsg = arrMsg.concat([..._1.Int64ToBuffer(maxGas)]); arrMsg = arrMsg.concat([..._1.Int64ToBuffer(nonce)]); arrMsg = arrMsg.concat(chaidBufferArray); const senders = [ new tx_1.Sender(fromAddress, allData.qosAmount.toString(), qscArr) ]; const receivers = allData.receivers; return { signedMsg: arrMsg, senders, receivers }; } function registerCodec() { const codec = new js_amino_1.Codec(); codec.registerConcrete(new tx_1.StdTx(), 'qbase/txs/stdtx', {}); codec.registerConcrete(new tx_1.MsgMultiSend(), 'transfer/txs/TxTransfer', {}); codec.registerConcrete(new tx_1.PubKeyEd25519(), 'tendermint/PubKeyEd25519', {}); return codec; } function composeData(tx) { const coinNameArr = getQscCoinNames(tx); if (Array.isArray(tx)) { return txIsArrayForComposeData(tx, coinNameArr); } return txForComposeData(tx, coinNameArr); } function txIsArrayForComposeData(tx, coinNameArr) { let qosAmount = 0; const qscAmountArr = []; // 添加 receiver 代签名 byte[] let arrReceiver = []; const receivers = []; for (const item of tx) { item.qos = _1.accMul(item.qos, common_1.qosDecimal); qosAmount += item.qos; const toAddress = getOriginAddress(item.to); arrReceiver = arrReceiver.concat(toAddress); arrReceiver = arrReceiver.concat([..._1.stringToBuffer(item.qos.toString())]); const qscArr = []; const cqscAmountArr = []; if (item.qscs && item.qscs.length > 0) { for (const coinName of coinNameArr) { const cqsc = item.qscs .filter(x => x.coin_name.toLowerCase() === coinName) .reduce((pre, current) => { return { coin_name: pre.coin_name, amount: pre.amount + current.amount }; }); cqsc.amount = _1.accMul(cqsc.amount, common_1.qosDecimal); cqscAmountArr.push(`${cqsc.amount}${coinName}`); qscArr.push(new tx_1.QSC(coinName, cqsc.amount.toString())); const index = qscAmountArr.findIndex(x => x.coinName === coinName); if (index > -1) { qscAmountArr[index].amount += cqsc.amount; } else { qscAmountArr.push({ coinName, amount: cqsc.amount }); } } arrReceiver = arrReceiver.concat([ ..._1.stringToBuffer(cqscAmountArr.join(',')) ]); } receivers.push(new tx_1.Receiver(toAddress, item.qos.toString(), qscArr)); } return { qosAmount: new int64_buffer_1.Int64BE(qosAmount), qscAmountArr, arrReceiver, receivers }; } function txForComposeData(tx, coinNameArr) { let qosAmount = 0; const qscAmountArr = []; // 添加 receiver 代签名 byte[] let arrReceiver = []; const qscArr = []; qosAmount = _1.accMul(tx.qos, common_1.qosDecimal); const toAddress = getOriginAddress(tx.to); arrReceiver = arrReceiver.concat(toAddress); arrReceiver = arrReceiver.concat([..._1.stringToBuffer(tx.qos.toString())]); const cqscAmountArr = []; if (tx.qscs && tx.qscs.length > 0) { for (const coinName of coinNameArr) { const cqsc = tx.qscs .filter(x => x.coin_name.toLowerCase() === coinName) .reduce((pre, current) => { return { coin_name: pre.coin_name, amount: pre.amount + current.amount }; }); cqsc.amount = _1.accMul(cqsc.amount, common_1.qosDecimal); cqscAmountArr.push(`${cqsc.amount}${coinName}`); qscAmountArr.push({ coinName, amount: cqsc.amount }); qscArr.push(new tx_1.QSC(coinName, cqsc.amount.toString())); } arrReceiver = arrReceiver.concat([ ..._1.stringToBuffer(cqscAmountArr.join(',')) ]); } const receivers = [new tx_1.Receiver(toAddress, tx.qos.toString(), qscAmountArr)]; return { qosAmount: new int64_buffer_1.Int64BE(qosAmount), qscAmountArr, arrReceiver, receivers }; } /** * 去重并获取所有QSC的CoinName数组,如['QSC'] * @param tx 交易体 */ function getQscCoinNames(tx) { const qscSet = new Set(); if (Array.isArray(tx)) { for (const item of tx) { if (item.qscs && item.qscs.length > 0) { for (const qsc of item.qscs) { qscSet.add(qsc.coin_name.toLowerCase()); } } } } else { if (tx.qscs && tx.qscs.length > 0) { for (const qsc of tx.qscs) { qscSet.add(qsc.coin_name.toLowerCase()); } } } return [...qscSet]; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHhTaWduRGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL1R4U2lnbkRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsK0NBQXVDO0FBQ3ZDLHVDQUFpQztBQUNqQywwREFBNkI7QUFDN0Isd0JBQTBEO0FBRTFELDRDQUFzRDtBQUN0RCxvQ0FRcUI7QUFFckIsU0FBZ0IsZ0JBQWdCLENBQUMsT0FBZTtJQUM5QyxNQUFNLFVBQVUsR0FBRyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxNQUFNLFNBQVMsR0FBRyxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUpELDRDQUlDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLElBTXpCO0lBQ0MsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sYUFBYSxHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDL0IsQ0FBQztJQUVGLE1BQU0sS0FBSyxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksa0JBQWEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN0RSxNQUFNLEdBQUcsR0FBRyxJQUFJLGNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUU3RSxNQUFNLFlBQVksR0FBRyxJQUFJLGlCQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFbEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFLLENBQ3JCLFlBQVksRUFDWixDQUFDLEdBQUcsQ0FBQyxFQUNMLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FDdkIsQ0FBQztJQUNGLDBDQUEwQztJQUMxQywwQkFBMEI7SUFDMUIsc0JBQXNCO0lBQ3RCLGtDQUFrQztJQUNsQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLGtDQUFrQztJQUVsQyxxQ0FBcUM7SUFDckMsK0NBQStDO0lBQy9DLCtCQUErQjtJQUMvQix3Q0FBd0M7SUFFeEMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQXRDRCw4QkFzQ0M7QUFFRCxTQUFTLGFBQWEsQ0FBQyxFQUNyQixPQUFPLEVBQ1AsRUFBRSxFQUNGLE9BQU8sRUFDUCxNQUFNLEVBQ04sS0FBSyxFQU9OO0lBQ0MsSUFBSSxNQUFNLEdBQVUsRUFBRSxDQUFDO0lBQ3ZCLDhCQUE4QjtJQUM5QixNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFcEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLDZCQUE2QjtJQUM3QixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsaUJBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLDZCQUE2QjtJQUM3QixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFFOUIsTUFBTSxNQUFNLEdBQVUsRUFBRSxDQUFDO0lBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtRQUN0QyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksUUFBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDM0Q7SUFFRCx3Q0FBd0M7SUFDeEMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsaUJBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBRWpELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLGlCQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxnQkFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsZ0JBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUV6QyxNQUFNLE9BQU8sR0FBRztRQUNkLElBQUksV0FBTSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQztLQUM5RCxDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUVwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDbkQsQ0FBQztBQUVELFNBQVMsYUFBYTtJQUNwQixNQUFNLEtBQUssR0FBRyxJQUFJLGdCQUFLLEVBQUUsQ0FBQztJQUMxQixLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxVQUFLLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxpQkFBWSxFQUFFLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksa0JBQWEsRUFBRSxFQUFFLDBCQUEwQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEVBQXVCO0lBQzFDLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDckIsT0FBTyx1QkFBdUIsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDakQ7SUFDRCxPQUFPLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxFQUFhLEVBQUUsV0FBcUI7SUFDbkUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLE1BQU0sWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUMvQix5QkFBeUI7SUFDekIsSUFBSSxXQUFXLEdBQVUsRUFBRSxDQUFDO0lBRTVCLE1BQU0sU0FBUyxHQUFVLEVBQUUsQ0FBQztJQUU1QixLQUFLLE1BQU0sSUFBSSxJQUFJLEVBQUUsRUFBRTtRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLG1CQUFVLENBQUMsQ0FBQztRQUN4QyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN0QixNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLGlCQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRSxNQUFNLE1BQU0sR0FBVSxFQUFFLENBQUM7UUFDekIsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckMsS0FBSyxNQUFNLFFBQVEsSUFBSSxXQUFXLEVBQUU7Z0JBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJO3FCQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsQ0FBQztxQkFDbkQsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO29CQUN2QixPQUFPO3dCQUNMLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUzt3QkFDeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU07cUJBQ3BDLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxtQkFBVSxDQUFDLENBQUM7Z0JBQzlDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ2QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO2lCQUMzQztxQkFBTTtvQkFDTCxZQUFZLENBQUMsSUFBSSxDQUFDO3dCQUNoQixRQUFRO3dCQUNSLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtxQkFDcEIsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7WUFDRCxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztnQkFDL0IsR0FBRyxpQkFBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDM0MsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksYUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDdEU7SUFDRCxPQUFPO1FBQ0wsU0FBUyxFQUFFLElBQUksc0JBQU8sQ0FBQyxTQUFTLENBQUM7UUFDakMsWUFBWTtRQUNaLFdBQVc7UUFDWCxTQUFTO0tBQ1YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEVBQVcsRUFBRSxXQUFxQjtJQUMxRCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbEIsTUFBTSxZQUFZLEdBQVUsRUFBRSxDQUFDO0lBQy9CLHlCQUF5QjtJQUN6QixJQUFJLFdBQVcsR0FBVSxFQUFFLENBQUM7SUFFNUIsTUFBTSxNQUFNLEdBQVUsRUFBRSxDQUFDO0lBRXpCLFNBQVMsR0FBRyxTQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxtQkFBVSxDQUFDLENBQUM7SUFDdkMsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTVDLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxpQkFBYyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO0lBQ25DLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDakMsS0FBSyxNQUFNLFFBQVEsSUFBSSxXQUFXLEVBQUU7WUFDbEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUk7aUJBQ2pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDO2lCQUNuRCxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ3ZCLE9BQU87b0JBQ0wsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO29CQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTTtpQkFDcEMsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxtQkFBVSxDQUFDLENBQUM7WUFDOUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNoRCxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUNoQixRQUFRO2dCQUNSLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTthQUNwQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksUUFBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN4RDtRQUNELFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQy9CLEdBQUcsaUJBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNDLENBQUMsQ0FBQztLQUNKO0lBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLGFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBRTdFLE9BQU87UUFDTCxTQUFTLEVBQUUsSUFBSSxzQkFBTyxDQUFDLFNBQVMsQ0FBQztRQUNqQyxZQUFZO1FBQ1osV0FBVztRQUNYLFNBQVM7S0FDVixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLEVBQXVCO0lBQzlDLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDekIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksRUFBRSxFQUFFO1lBQ3JCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3JDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7aUJBQ3pDO2FBQ0Y7U0FDRjtLQUNGO1NBQU07UUFDTCxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLEtBQUssTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLElBQUksRUFBRTtnQkFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7YUFDekM7U0FDRjtLQUNGO0lBQ0QsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFhLENBQUM7QUFDakMsQ0FBQyJ9