Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- SwapzMultichainBridge
- Optimization enabled
- false
- Compiler version
- v0.8.8+commit.dddeac2f
- EVM Version
- default
- Verified at
- 2022-09-27T05:27:38.603535Z
Contract source code
/** *Submitted for verification at BscScan.com on 2022-05-28 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/Swapz.sol pragma solidity 0.8.8; // This contract is owned by Decentralized Swapz Network // Decentralized Swapz Network is Mesh network based on Threshold Signature Scheme with 2/3 PoS Consensus. abstract contract TokenFactory { function create(uint contractType , string memory name, string memory symbol) virtual public returns(address); } abstract contract Token is IERC20 { function mint(address _address, uint256 _amount) virtual public; function burn(address _address, uint256 _amount) virtual public; function setBaseURI(string memory _baseUri) virtual public; function transferOwnership(address newAddress) virtual public; function tokenType() public virtual returns (uint); } abstract contract FlashReceiver { function executeOperation(address token, uint amount, uint fee, bytes calldata params) virtual public; } // Crosschain Liquidity Pool contract SwapzMultichainBridge { TokenFactory public tokenFactory; function changeTokenFactory(address newTokenFactory) public onlyAdmin { tokenFactory = TokenFactory(newTokenFactory); } modifier onlyOwner() { require(owner == msg.sender, "OWNER"); _; } modifier onlyAdmin() { require(admin == msg.sender || owner == msg.sender, "ADMIN"); _; } address public owner; address public admin; function transferOwnership(address _address) virtual public onlyOwner() { owner = _address; } function transferAdmin(address _address) virtual public onlyAdmin() { owner = _address; } // Define the token constructor() { tokenToAllowed[address(0x0)] = true; tokenFactory = TokenFactory(0x46f62e61160f89Fb9423C62EC4A43A12AC3aAa2B); owner = 0xdF2DAc8147b38bB4BBAf4a626E271a153bBC359F; admin = 0xdF2DAc8147b38bB4BBAf4a626E271a153bBC359F; } uint public airdrop = 1 ether; mapping(bytes => address) public assetToAddress; mapping(address => bytes) public addressToAsset; mapping(address => bool) public tokenToAllowed; mapping(bytes => uint256) public chainFee; mapping(bytes => bool) public knownForainTxs; function setBaseURI(address token, string memory uri) public onlyAdmin { Token(token).setBaseURI(uri); } function allowSwapToken(address _token, bool _allow) onlyAdmin public { tokenToAllowed[_token] = _allow; } function changeChainFee(bytes calldata _chainId, uint _chainFee) public onlyAdmin { chainFee[_chainId] = _chainFee; } function changeTokenOwner(address _token, address _newOwner) public onlyAdmin { Token t = Token(_token); t.transferOwnership(_newOwner); } function assignTokenToAsset(bytes memory _assetId, address _token) public onlyAdmin { assetToAddress[_assetId] = _token; addressToAsset[_token] = _assetId; } function chainAirdrop(uint _airdrop) public onlyAdmin { airdrop = _airdrop; } function bytesToAddress(bytes memory bys) private pure returns (address addr) { assembly { addr := mload(add(bys,20)) } } function sendAll(address[] calldata keepers, bytes[] calldata tokens, uint[] calldata amounts, bytes[] calldata foreignTx) external onlyOwner { for (uint i = 0; i < keepers.length; i++) { require(knownForainTxs[foreignTx[i]] == false, "KNOWN"); knownForainTxs[foreignTx[i]] = true; send(keepers[i], tokens[i], amounts[i]); } } function send(address keeper, bytes calldata token, uint amount) private { if (token.length == 20) { sendNative(keeper, bytesToAddress(token), amount); } else { sendWrapped(keeper, token, amount); } } function sendWrapped(address keeper, bytes calldata asset, uint256 amount) private { if (assetToAddress[asset] == address(0x0)) { address token_address = tokenFactory.create(getType(asset), getName(asset), getSymbol(asset)); assetToAddress[asset] = token_address; addressToAsset[token_address] = asset; allowSwapToken(token_address, true); changeChainFee(getChainId(asset), 1 ether); } Token t2 = Token(assetToAddress[asset]); t2.mint(keeper, amount); } uint public gasLimit = 21000; function chainGasLimit(uint _gasLimit) public onlyAdmin { gasLimit = _gasLimit; } function transfer(address _to , uint256 value) private { _to.call{ value: value, gas: gasLimit }(''); //payable(_to).transfer(value); } function sendNative(address keeper, address token, uint amount) private { if (token == address(0x0)) { transfer(keeper, amount); //payable(keeper).transfer(amount); } else { // the transaction should reverted if not enough balance (each ERC20 should be audited) Token(token).transfer(keeper, amount); if (address(this).balance > airdrop) { transfer(keeper, airdrop); //payable(keeper).transfer(airdrop); } } } function flashLoan(uint _amount, address _token, FlashReceiver _receiver, bytes calldata _params) public { uint _fee = _amount / 10000; bool isNative = _token == address(0x0); Token token = Token(_token); address receiver = address(_receiver); address sender = address(this); uint256 balanceBefore = isNative ? sender.balance : token.balanceOf(sender); require(token.tokenType() == 0, "ERC20"); require(_amount <= balanceBefore, "BALANCE"); if (isNative) { //payable(receiver).transfer(_amount); transfer(receiver, _amount); } else { token.transfer(receiver, _amount); } _receiver.executeOperation(_token, _amount, _fee, _params); uint256 balanceAfter = isNative ? sender.balance : token.balanceOf(sender); require(balanceBefore + _fee == balanceAfter, "RESULT"); } mapping(address => bool) referrals; function setAcceptedReferral(address referral, bool accepted) public onlyAdmin { referrals[referral] = accepted; } function swapRequestNative(uint _amount, address _token, bytes calldata chainId, address referral) external payable { uint256 fee = chainFee[chainId]; require(tokenToAllowed[_token], "DISABLED"); require(fee > 0, "FEE"); if (_token == address(0x0)) { require(msg.value == fee + _amount, "AMOUNT"); } else { require(msg.value == fee, "FEE"); // the transaction should reverted if not enough balance (each ERC20 should be audited) Token(_token).transferFrom(msg.sender, address(this), _amount); } if (referrals[referral]) { uint fee2 = fee / 2; //payable(owner).transfer(fee - fee2); transfer(owner, fee - fee2); //payable(referral).transfer(fee2); transfer(referral, fee2); } else { //payable(owner).transfer(fee); transfer(owner, fee); } emit CrossSwap(_amount, msg.sender, chainId, _token); } // Mash nodes connected to this event event CrossSwap ( uint256 value, address recipient, bytes chainIdOrAssetId, address token ); function getName(bytes calldata assetId) public pure returns (string memory) { //return ""; bytes memory s = assetId[15:35]; return string(s); } function getSymbol(bytes calldata assetId) public pure returns (string memory) { //return ""; bytes memory s = assetId[5:15]; return string(s); } function getType(bytes calldata asset) public pure returns (uint8) { return uint8(bytes1(asset[4:6])); } function getChainId(bytes calldata assetId) public pure returns (bytes calldata) { return assetId[0:4]; } function swapRequestWrapped(address _token, uint _amount, address referral) external payable { bytes memory chainId = this.getChainId(addressToAsset[_token]); uint256 fee = chainFee[chainId]; require(fee > 0, "CHAIN"); require(msg.value == chainFee[chainId], "FEE"); Token(_token).burn(msg.sender, _amount); if (referrals[referral]) { uint fee2 = fee / 2; transfer(owner, fee - fee2); transfer(referral, fee2); } else { //payable(owner).transfer(fee); transfer(owner, fee); } emit CrossSwap(_amount, msg.sender, addressToAsset[_token], _token); } // Added to make deposits receive() external payable {} }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"CrossSwap","inputs":[{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"address","name":"recipient","internalType":"address","indexed":false},{"type":"bytes","name":"chainIdOrAssetId","internalType":"bytes","indexed":false},{"type":"address","name":"token","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"addressToAsset","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"airdrop","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"allowSwapToken","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"bool","name":"_allow","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"assetToAddress","inputs":[{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"assignTokenToAsset","inputs":[{"type":"bytes","name":"_assetId","internalType":"bytes"},{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"chainAirdrop","inputs":[{"type":"uint256","name":"_airdrop","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"chainFee","inputs":[{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"chainGasLimit","inputs":[{"type":"uint256","name":"_gasLimit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeChainFee","inputs":[{"type":"bytes","name":"_chainId","internalType":"bytes"},{"type":"uint256","name":"_chainFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeTokenFactory","inputs":[{"type":"address","name":"newTokenFactory","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeTokenOwner","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"flashLoan","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_receiver","internalType":"contract FlashReceiver"},{"type":"bytes","name":"_params","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gasLimit","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"getChainId","inputs":[{"type":"bytes","name":"assetId","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getName","inputs":[{"type":"bytes","name":"assetId","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getSymbol","inputs":[{"type":"bytes","name":"assetId","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"getType","inputs":[{"type":"bytes","name":"asset","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"knownForainTxs","inputs":[{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"sendAll","inputs":[{"type":"address[]","name":"keepers","internalType":"address[]"},{"type":"bytes[]","name":"tokens","internalType":"bytes[]"},{"type":"uint256[]","name":"amounts","internalType":"uint256[]"},{"type":"bytes[]","name":"foreignTx","internalType":"bytes[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAcceptedReferral","inputs":[{"type":"address","name":"referral","internalType":"address"},{"type":"bool","name":"accepted","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBaseURI","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"string","name":"uri","internalType":"string"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"swapRequestNative","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_token","internalType":"address"},{"type":"bytes","name":"chainId","internalType":"bytes"},{"type":"address","name":"referral","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"swapRequestWrapped","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"referral","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract TokenFactory"}],"name":"tokenFactory","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"tokenToAllowed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferAdmin","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Deployed ByteCode
0x6080604052600436106101c65760003560e01c806388433651116100f7578063c92319f911610095578063f2fde38b11610064578063f2fde38b14610674578063f4609ad71461069d578063f68016b7146106c6578063f851a440146106f1576101cd565b8063c92319f9146105a6578063e4003678146105e3578063e77772fe1461060c578063ee1673f814610637576101cd565b8063924c5a41116100d1578063924c5a41146104c55780639498759f14610503578063a2b0545614610540578063ab19e0c01461057d576101cd565b806388433651146104555780638a121a4b1461047e5780638da5cb5b1461049a576101cd565b806341246e531161016457806370ad5f241161013e57806370ad5f241461039d5780637441b977146103da57806375829def146104035780637de63a711461042c576101cd565b806341246e531461030e5780634ec9dcbe146103375780635a22f0cd14610374576101cd565b80631c5d5ecc116101a05780631c5d5ecc146102685780631d5c96c9146102915780632f62f9ab146102ba5780633884d635146102e3576101cd565b806308879d73146101d25780630ae7cc4e1461020f5780630ec46d741461022b576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612a82565b61071c565b6040516102069190612aca565b60405180910390f35b61022960048036038101906102249190612b1b565b61073c565b005b34801561023757600080fd5b50610252600480360381019061024d9190612cb4565b610a98565b60405161025f9190612d0c565b60405180910390f35b34801561027457600080fd5b5061028f600480360381019061028a9190612a82565b610ae1565b005b34801561029d57600080fd5b506102b860048036038101906102b39190612d87565b610c0c565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190612de7565b610d1e565b005b3480156102ef57600080fd5b506102f8610ebb565b6040516103059190612e52565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190612e6d565b610ec1565b005b34801561034357600080fd5b5061035e60048036038101906103599190612ead565b61101e565b60405161036b9190612f82565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190612fa4565b611085565b005b3480156103a957600080fd5b506103c460048036038101906103bf9190612a82565b611177565b6040516103d19190613026565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc919061314a565b611217565b005b34801561040f57600080fd5b5061042a60048036038101906104259190612a82565b611435565b005b34801561043857600080fd5b50610453600480360381019061044e919061325f565b611561565b005b34801561046157600080fd5b5061047c60048036038101906104779190613340565b6116a4565b005b6104986004803603810190610493919061339c565b6117fb565b005b3480156104a657600080fd5b506104af611b67565b6040516104bc9190612d0c565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612ead565b611b8d565b6040516104fa929190613451565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190612cb4565b611baf565b6040516105379190612aca565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190612ead565b611be5565b6040516105749190613491565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f91906134ea565b611c11565b005b3480156105b257600080fd5b506105cd60048036038101906105c89190612cb4565b61203c565b6040516105da9190612e52565b60405180910390f35b3480156105ef57600080fd5b5061060a6004803603810190610605919061325f565b61206a565b005b34801561061857600080fd5b506106216121ad565b60405161062e91906135d1565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190612ead565b6121d1565b60405161066b9190612f82565b60405180910390f35b34801561068057600080fd5b5061069b60048036038101906106969190612a82565b612238565b005b3480156106a957600080fd5b506106c460048036038101906106bf9190612fa4565b61230c565b005b3480156106d257600080fd5b506106db6123fe565b6040516106e89190612e52565b60405180910390f35b3480156106fd57600080fd5b50610706612404565b6040516107139190612d0c565b60405180910390f35b60066020528060005260406000206000915054906101000a900460ff1681565b60003073ffffffffffffffffffffffffffffffffffffffff1663924c5a41600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518263ffffffff1660e01b81526004016107b591906136e2565b60006040518083038186803b1580156107cd57600080fd5b505afa1580156107e1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061080a9190613774565b9050600060078260405161081e91906137f9565b908152602001604051809103902054905060008111610872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108699061385c565b60405180910390fd5b60078260405161088291906137f9565b90815260200160405180910390205434146108d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c9906138c8565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16639dc29fac33866040518363ffffffff1660e01b815260040161090d9291906138e8565b600060405180830381600087803b15801561092757600080fd5b505af115801561093b573d6000803e3d6000fd5b50505050600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156109e95760006002826109a0919061396f565b90506109d9600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682846109d491906139a0565b61242a565b6109e3848261242a565b50610a16565b610a15600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261242a565b5b7fbbcc946a2bfde33e52c95e88f5a077db0e68bd3de58650fccb5018f37cb5329e8433600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002088604051610a8994939291906139d4565b60405180910390a15050505050565b6004818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610b8a57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090613a6c565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610cb557503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90613a6c565b60405180910390fd5b8060078484604051610d07929190613ab1565b908152602001604051809103902081905550505050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610dc757503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613a6c565b60405180910390fd5b80600483604051610e1791906137f9565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610eb69291906128e7565b505050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610f6a57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090613a6c565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663f2fde38b836040518263ffffffff1660e01b8152600401610fe79190612d0c565b600060405180830381600087803b15801561100157600080fd5b505af1158015611015573d6000803e3d6000fd5b50505050505050565b606060008383600590600f9261103693929190613ad4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090508091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061112e57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61116d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116490613a6c565b60405180910390fd5b8060038190555050565b600560205280600052604060002060009150905080546111969061361b565b80601f01602080910402602001604051908101604052809291908181526020018280546111c29061361b565b801561120f5780601f106111e45761010080835404028352916020019161120f565b820191906000526020600020905b8154815290600101906020018083116111f257829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90613b5b565b60405180910390fd5b60005b8888905081101561142a576000151560088484848181106112ce576112cd613b7b565b5b90506020028101906112e09190613bb9565b6040516112ee929190613ab1565b908152602001604051809103902060009054906101000a900460ff1615151461134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390613c68565b60405180910390fd5b6001600884848481811061136357611362613b7b565b5b90506020028101906113759190613bb9565b604051611383929190613ab1565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506114178989838181106113be576113bd613b7b565b5b90506020020160208101906113d39190612a82565b8888848181106113e6576113e5613b7b565b5b90506020028101906113f89190613bb9565b88888681811061140b5761140a613b7b565b5b9050602002013561249c565b808061142290613c88565b9150506112aa565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806114de57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490613a6c565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061160a57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090613a6c565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061174d57503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390613a6c565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166355f804b3826040518263ffffffff1660e01b81526004016117c59190612f82565b600060405180830381600087803b1580156117df57600080fd5b505af11580156117f3573d6000803e3d6000fd5b505050505050565b60006007848460405161180f929190613ab1565b9081526020016040518091039020549050600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a390613d1d565b60405180910390fd5b600081116118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e6906138c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156119765785816119309190613d3d565b3414611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890613ddf565b60405180910390fd5b611a49565b8034146119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af906138c8565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd3330896040518463ffffffff1660e01b81526004016119f593929190613dff565b602060405180830381600087803b158015611a0f57600080fd5b505af1158015611a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a479190613e4b565b505b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611af3576000600282611aaa919061396f565b9050611ae3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168284611ade91906139a0565b61242a565b611aed838261242a565b50611b20565b611b1f600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261242a565b5b7fbbcc946a2bfde33e52c95e88f5a077db0e68bd3de58650fccb5018f37cb5329e8633868689604051611b57959493929190613e78565b60405180910390a1505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3660008383600090600492611ba493929190613ad4565b915091509250929050565b6008818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b60008282600490600692611bfb93929190613ad4565b90611c069190613f0a565b60f81c905092915050565b600061271086611c21919061396f565b905060008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16149050600086905060008690506000309050600084611cfa578373ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611ca59190612d0c565b60206040518083038186803b158015611cbd57600080fd5b505afa158015611cd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf59190613f7e565b611d13565b8173ffffffffffffffffffffffffffffffffffffffff16315b905060008473ffffffffffffffffffffffffffffffffffffffff166330fa738c6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d5f57600080fd5b505af1158015611d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d979190613f7e565b14611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90613ff7565b60405180910390fd5b808b1115611e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1190614063565b60405180910390fd5b8415611e2f57611e2a838c61242a565b611ebe565b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb848d6040518363ffffffff1660e01b8152600401611e6a9291906138e8565b602060405180830381600087803b158015611e8457600080fd5b505af1158015611e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebc9190613e4b565b505b8873ffffffffffffffffffffffffffffffffffffffff1663ee8725588b8d898c8c6040518663ffffffff1660e01b8152600401611eff959493929190614083565b600060405180830381600087803b158015611f1957600080fd5b505af1158015611f2d573d6000803e3d6000fd5b50505050600085611fc6578473ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611f719190612d0c565b60206040518083038186803b158015611f8957600080fd5b505afa158015611f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc19190613f7e565b611fdf565b8273ffffffffffffffffffffffffffffffffffffffff16315b9050808783611fee9190613d3d565b1461202e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120259061411d565b60405180910390fd5b505050505050505050505050565b6007818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061211357503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214990613a6c565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060008383600f906023926121e993929190613ad4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090508091505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bf90613b5b565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806123b557503373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb90613a6c565b60405180910390fd5b8060098190555050565b60095481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8173ffffffffffffffffffffffffffffffffffffffff16816009549060405161245290614163565b600060405180830381858888f193505050503d8060008114612490576040519150601f19603f3d011682016040523d82523d6000602084013e612495565b606091505b5050505050565b6014838390501415612504576124ff846124f985858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612517565b83612525565b612511565b61251084848484612614565b5b50505050565b600060148201519050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256957612564838261242a565b61260f565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016125a49291906138e8565b602060405180830381600087803b1580156125be57600080fd5b505af11580156125d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f69190613e4b565b5060035447111561260e5761260d8360035461242a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff166004848460405161263e929190613ab1565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561282e5760008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a4463a86126d28686611be5565b6126dc87876121d1565b6126e6888861101e565b6040518463ffffffff1660e01b8152600401612704939291906141a9565b602060405180830381600087803b15801561271e57600080fd5b505af1158015612732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127569190614203565b9050806004858560405161276b929190613ab1565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508383600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020919061280592919061296d565b50612811816001611561565b61282c61281e8585611b8d565b670de0b6b3a7640000610c0c565b505b600060048484604051612842929190613ab1565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166340c10f1986846040518363ffffffff1660e01b81526004016128ae9291906138e8565b600060405180830381600087803b1580156128c857600080fd5b505af11580156128dc573d6000803e3d6000fd5b505050505050505050565b8280546128f39061361b565b90600052602060002090601f016020900481019282612915576000855561295c565b82601f1061292e57805160ff191683800117855561295c565b8280016001018555821561295c579182015b8281111561295b578251825591602001919060010190612940565b5b50905061296991906129f3565b5090565b8280546129799061361b565b90600052602060002090601f01602090048101928261299b57600085556129e2565b82601f106129b457803560ff19168380011785556129e2565b828001600101855582156129e2579182015b828111156129e15782358255916020019190600101906129c6565b5b5090506129ef91906129f3565b5090565b5b80821115612a0c5760008160009055506001016129f4565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a4f82612a24565b9050919050565b612a5f81612a44565b8114612a6a57600080fd5b50565b600081359050612a7c81612a56565b92915050565b600060208284031215612a9857612a97612a1a565b5b6000612aa684828501612a6d565b91505092915050565b60008115159050919050565b612ac481612aaf565b82525050565b6000602082019050612adf6000830184612abb565b92915050565b6000819050919050565b612af881612ae5565b8114612b0357600080fd5b50565b600081359050612b1581612aef565b92915050565b600080600060608486031215612b3457612b33612a1a565b5b6000612b4286828701612a6d565b9350506020612b5386828701612b06565b9250506040612b6486828701612a6d565b9150509250925092565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612bc182612b78565b810181811067ffffffffffffffff82111715612be057612bdf612b89565b5b80604052505050565b6000612bf3612a10565b9050612bff8282612bb8565b919050565b600067ffffffffffffffff821115612c1f57612c1e612b89565b5b612c2882612b78565b9050602081019050919050565b82818337600083830152505050565b6000612c57612c5284612c04565b612be9565b905082815260208101848484011115612c7357612c72612b73565b5b612c7e848285612c35565b509392505050565b600082601f830112612c9b57612c9a612b6e565b5b8135612cab848260208601612c44565b91505092915050565b600060208284031215612cca57612cc9612a1a565b5b600082013567ffffffffffffffff811115612ce857612ce7612a1f565b5b612cf484828501612c86565b91505092915050565b612d0681612a44565b82525050565b6000602082019050612d216000830184612cfd565b92915050565b600080fd5b600080fd5b60008083601f840112612d4757612d46612b6e565b5b8235905067ffffffffffffffff811115612d6457612d63612d27565b5b602083019150836001820283011115612d8057612d7f612d2c565b5b9250929050565b600080600060408486031215612da057612d9f612a1a565b5b600084013567ffffffffffffffff811115612dbe57612dbd612a1f565b5b612dca86828701612d31565b93509350506020612ddd86828701612b06565b9150509250925092565b60008060408385031215612dfe57612dfd612a1a565b5b600083013567ffffffffffffffff811115612e1c57612e1b612a1f565b5b612e2885828601612c86565b9250506020612e3985828601612a6d565b9150509250929050565b612e4c81612ae5565b82525050565b6000602082019050612e676000830184612e43565b92915050565b60008060408385031215612e8457612e83612a1a565b5b6000612e9285828601612a6d565b9250506020612ea385828601612a6d565b9150509250929050565b60008060208385031215612ec457612ec3612a1a565b5b600083013567ffffffffffffffff811115612ee257612ee1612a1f565b5b612eee85828601612d31565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f34578082015181840152602081019050612f19565b83811115612f43576000848401525b50505050565b6000612f5482612efa565b612f5e8185612f05565b9350612f6e818560208601612f16565b612f7781612b78565b840191505092915050565b60006020820190508181036000830152612f9c8184612f49565b905092915050565b600060208284031215612fba57612fb9612a1a565b5b6000612fc884828501612b06565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612ff882612fd1565b6130028185612fdc565b9350613012818560208601612f16565b61301b81612b78565b840191505092915050565b600060208201905081810360008301526130408184612fed565b905092915050565b60008083601f84011261305e5761305d612b6e565b5b8235905067ffffffffffffffff81111561307b5761307a612d27565b5b60208301915083602082028301111561309757613096612d2c565b5b9250929050565b60008083601f8401126130b4576130b3612b6e565b5b8235905067ffffffffffffffff8111156130d1576130d0612d27565b5b6020830191508360208202830111156130ed576130ec612d2c565b5b9250929050565b60008083601f84011261310a57613109612b6e565b5b8235905067ffffffffffffffff81111561312757613126612d27565b5b60208301915083602082028301111561314357613142612d2c565b5b9250929050565b6000806000806000806000806080898b03121561316a57613169612a1a565b5b600089013567ffffffffffffffff81111561318857613187612a1f565b5b6131948b828c01613048565b9850985050602089013567ffffffffffffffff8111156131b7576131b6612a1f565b5b6131c38b828c0161309e565b9650965050604089013567ffffffffffffffff8111156131e6576131e5612a1f565b5b6131f28b828c016130f4565b9450945050606089013567ffffffffffffffff81111561321557613214612a1f565b5b6132218b828c0161309e565b92509250509295985092959890939650565b61323c81612aaf565b811461324757600080fd5b50565b60008135905061325981613233565b92915050565b6000806040838503121561327657613275612a1a565b5b600061328485828601612a6d565b92505060206132958582860161324a565b9150509250929050565b600067ffffffffffffffff8211156132ba576132b9612b89565b5b6132c382612b78565b9050602081019050919050565b60006132e36132de8461329f565b612be9565b9050828152602081018484840111156132ff576132fe612b73565b5b61330a848285612c35565b509392505050565b600082601f83011261332757613326612b6e565b5b81356133378482602086016132d0565b91505092915050565b6000806040838503121561335757613356612a1a565b5b600061336585828601612a6d565b925050602083013567ffffffffffffffff81111561338657613385612a1f565b5b61339285828601613312565b9150509250929050565b6000806000806000608086880312156133b8576133b7612a1a565b5b60006133c688828901612b06565b95505060206133d788828901612a6d565b945050604086013567ffffffffffffffff8111156133f8576133f7612a1f565b5b61340488828901612d31565b9350935050606061341788828901612a6d565b9150509295509295909350565b60006134308385612fdc565b935061343d838584612c35565b61344683612b78565b840190509392505050565b6000602082019050818103600083015261346c818486613424565b90509392505050565b600060ff82169050919050565b61348b81613475565b82525050565b60006020820190506134a66000830184613482565b92915050565b60006134b782612a44565b9050919050565b6134c7816134ac565b81146134d257600080fd5b50565b6000813590506134e4816134be565b92915050565b60008060008060006080868803121561350657613505612a1a565b5b600061351488828901612b06565b955050602061352588828901612a6d565b9450506040613536888289016134d5565b935050606086013567ffffffffffffffff81111561355757613556612a1f565b5b61356388828901612d31565b92509250509295509295909350565b6000819050919050565b600061359761359261358d84612a24565b613572565b612a24565b9050919050565b60006135a98261357c565b9050919050565b60006135bb8261359e565b9050919050565b6135cb816135b0565b82525050565b60006020820190506135e660008301846135c2565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061363357607f821691505b60208210811415613647576136466135ec565b5b50919050565b60008190508160005260206000209050919050565b6000815461366f8161361b565b6136798186612fdc565b9450600182166000811461369457600181146136a6576136d9565b60ff19831686526020860193506136d9565b6136af8561364d565b60005b838110156136d1578154818901526001820191506020810190506136b2565b808801955050505b50505092915050565b600060208201905081810360008301526136fc8184613662565b905092915050565b600061371761371284612c04565b612be9565b90508281526020810184848401111561373357613732612b73565b5b61373e848285612f16565b509392505050565b600082601f83011261375b5761375a612b6e565b5b815161376b848260208601613704565b91505092915050565b60006020828403121561378a57613789612a1a565b5b600082015167ffffffffffffffff8111156137a8576137a7612a1f565b5b6137b484828501613746565b91505092915050565b600081905092915050565b60006137d382612fd1565b6137dd81856137bd565b93506137ed818560208601612f16565b80840191505092915050565b600061380582846137c8565b915081905092915050565b7f434841494e000000000000000000000000000000000000000000000000000000600082015250565b6000613846600583612f05565b915061385182613810565b602082019050919050565b6000602082019050818103600083015261387581613839565b9050919050565b7f4645450000000000000000000000000000000000000000000000000000000000600082015250565b60006138b2600383612f05565b91506138bd8261387c565b602082019050919050565b600060208201905081810360008301526138e1816138a5565b9050919050565b60006040820190506138fd6000830185612cfd565b61390a6020830184612e43565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061397a82612ae5565b915061398583612ae5565b92508261399557613994613911565b5b828204905092915050565b60006139ab82612ae5565b91506139b683612ae5565b9250828210156139c9576139c8613940565b5b828203905092915050565b60006080820190506139e96000830187612e43565b6139f66020830186612cfd565b8181036040830152613a088185613662565b9050613a176060830184612cfd565b95945050505050565b7f41444d494e000000000000000000000000000000000000000000000000000000600082015250565b6000613a56600583612f05565b9150613a6182613a20565b602082019050919050565b60006020820190508181036000830152613a8581613a49565b9050919050565b6000613a9883856137bd565b9350613aa5838584612c35565b82840190509392505050565b6000613abe828486613a8c565b91508190509392505050565b600080fd5b600080fd5b60008085851115613ae857613ae7613aca565b5b83861115613af957613af8613acf565b5b6001850283019150848603905094509492505050565b7f4f574e4552000000000000000000000000000000000000000000000000000000600082015250565b6000613b45600583612f05565b9150613b5082613b0f565b602082019050919050565b60006020820190508181036000830152613b7481613b38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112613bd657613bd5613baa565b5b80840192508235915067ffffffffffffffff821115613bf857613bf7613baf565b5b602083019250600182023603831315613c1457613c13613bb4565b5b509250929050565b7f4b4e4f574e000000000000000000000000000000000000000000000000000000600082015250565b6000613c52600583612f05565b9150613c5d82613c1c565b602082019050919050565b60006020820190508181036000830152613c8181613c45565b9050919050565b6000613c9382612ae5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cc657613cc5613940565b5b600182019050919050565b7f44495341424c4544000000000000000000000000000000000000000000000000600082015250565b6000613d07600883612f05565b9150613d1282613cd1565b602082019050919050565b60006020820190508181036000830152613d3681613cfa565b9050919050565b6000613d4882612ae5565b9150613d5383612ae5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8857613d87613940565b5b828201905092915050565b7f414d4f554e540000000000000000000000000000000000000000000000000000600082015250565b6000613dc9600683612f05565b9150613dd482613d93565b602082019050919050565b60006020820190508181036000830152613df881613dbc565b9050919050565b6000606082019050613e146000830186612cfd565b613e216020830185612cfd565b613e2e6040830184612e43565b949350505050565b600081519050613e4581613233565b92915050565b600060208284031215613e6157613e60612a1a565b5b6000613e6f84828501613e36565b91505092915050565b6000608082019050613e8d6000830188612e43565b613e9a6020830187612cfd565b8181036040830152613ead818587613424565b9050613ebc6060830184612cfd565b9695505050505050565b600082905092915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b600082821b905092915050565b6000613f168383613ec6565b82613f218135613ed1565b92506001821015613f6157613f5c7fff0000000000000000000000000000000000000000000000000000000000000083600103600802613efd565b831692505b505092915050565b600081519050613f7881612aef565b92915050565b600060208284031215613f9457613f93612a1a565b5b6000613fa284828501613f69565b91505092915050565b7f4552433230000000000000000000000000000000000000000000000000000000600082015250565b6000613fe1600583612f05565b9150613fec82613fab565b602082019050919050565b6000602082019050818103600083015261401081613fd4565b9050919050565b7f42414c414e434500000000000000000000000000000000000000000000000000600082015250565b600061404d600783612f05565b915061405882614017565b602082019050919050565b6000602082019050818103600083015261407c81614040565b9050919050565b60006080820190506140986000830188612cfd565b6140a56020830187612e43565b6140b26040830186612e43565b81810360608301526140c5818486613424565b90509695505050505050565b7f524553554c540000000000000000000000000000000000000000000000000000600082015250565b6000614107600683612f05565b9150614112826140d1565b602082019050919050565b60006020820190508181036000830152614136816140fa565b9050919050565b50565b600061414d6000836137bd565b91506141588261413d565b600082019050919050565b600061416e82614140565b9150819050919050565b600061419361418e61418984613475565b613572565b612ae5565b9050919050565b6141a381614178565b82525050565b60006060820190506141be600083018661419a565b81810360208301526141d08185612f49565b905081810360408301526141e48184612f49565b9050949350505050565b6000815190506141fd81612a56565b92915050565b60006020828403121561421957614218612a1a565b5b6000614227848285016141ee565b9150509291505056fea264697066735822122077e5e031e632ffe7b56c6b9e200c748b7a98fe8c83ef6fde3f4e14a646632f7264736f6c63430008080033