More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 150 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Admin_run Paymen... | 21632634 | 21 days ago | IN | 0 ETH | 0.0036927 | ||||
Admin_run Paymen... | 21435850 | 49 days ago | IN | 0 ETH | 0.00569395 | ||||
Admin_remove Ben... | 21280167 | 70 days ago | IN | 0 ETH | 0.00264386 | ||||
Admin_remove Ben... | 21280095 | 70 days ago | IN | 0 ETH | 0.00189954 | ||||
Admin_remove Ben... | 21280090 | 70 days ago | IN | 0 ETH | 0.00185746 | ||||
Admin_remove Ben... | 21137363 | 90 days ago | IN | 0 ETH | 0.0018179 | ||||
Admin_run Paymen... | 21137299 | 90 days ago | IN | 0 ETH | 0.01159112 | ||||
Admin_add Benefi... | 20993554 | 110 days ago | IN | 0 ETH | 0.00420484 | ||||
Admin_remove Ben... | 20993458 | 110 days ago | IN | 0 ETH | 0.00226147 | ||||
Admin_run Paymen... | 20901770 | 123 days ago | IN | 0 ETH | 0.00231823 | ||||
Admin_run Paymen... | 20737474 | 146 days ago | IN | 0 ETH | 0.00174373 | ||||
Admin_remove Ben... | 20533052 | 175 days ago | IN | 0 ETH | 0.00024184 | ||||
Admin_run Paymen... | 20529410 | 175 days ago | IN | 0 ETH | 0.00148502 | ||||
Admin_run Paymen... | 20263122 | 212 days ago | IN | 0 ETH | 0.00502506 | ||||
Admin_remove Ben... | 20161523 | 226 days ago | IN | 0 ETH | 0.00060152 | ||||
Admin_remove Ben... | 20160590 | 227 days ago | IN | 0 ETH | 0.00048584 | ||||
Admin_run Paymen... | 20160580 | 227 days ago | IN | 0 ETH | 0.00445347 | ||||
Admin_run Paymen... | 19833518 | 272 days ago | IN | 0 ETH | 0.00496751 | ||||
Admin_remove Ben... | 19826658 | 273 days ago | IN | 0 ETH | 0.00044146 | ||||
Admin_remove Ben... | 19824075 | 274 days ago | IN | 0 ETH | 0.00042368 | ||||
Admin_run Paymen... | 19595271 | 306 days ago | IN | 0 ETH | 0.00926381 | ||||
Admin_add Benefi... | 19475948 | 322 days ago | IN | 0 ETH | 0.00561326 | ||||
Admin_add Benefi... | 19475942 | 322 days ago | IN | 0 ETH | 0.00596076 | ||||
Admin_add Benefi... | 19475917 | 322 days ago | IN | 0 ETH | 0.00573722 | ||||
Admin_add Benefi... | 19475916 | 322 days ago | IN | 0 ETH | 0.00512368 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
StaffTokens
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; // ERC20 methods required by this contract interface ERC20 { function transfer(address, uint256) external returns (bool); function balanceOf(address) external view returns (uint256); } struct Date { uint256 day; uint256 month; uint256 year; } contract StaffTokens { uint256 constant private TIME_BETWEEN_PAYMENTS = 30 days; mapping(bytes32 => address) private TokenAddress; mapping(address => uint256) private Obligation; mapping(address => address[]) private TokenSubscribers; mapping(bytes32 => uint256) private NextPaymentDue; mapping(bytes32 => uint256) private NumPaymentsRemaining; mapping(bytes32 => uint256) private FirstPaymentAmount; mapping(bytes32 => uint256) private RegularPaymentAmount; mapping(address => bool) public isAdmin; string[] private TokenSymbols; address public owner; error AccountAlreadyExists(); error AddressIsZero(); error AmountIsZero(); error InvalidDate(); error NumPaymentsIsZero(); error OwnerOnly(); error OwnerOrAdminOnly(); error TokenAlreadyAdded(); error UnrecognisedToken(); event AdminStatusUpdated(address indexed account, bool isAdmin); event BeneficiaryAdded(address indexed token, address indexed account, uint256 award, uint256 numPayments, uint256 startTimestamp); event BeneficiaryRemoved(address indexed token, address indexed account, uint256 awardRemainder, uint256 numPaymentsOutstanding); modifier ownerOnly { if (msg.sender != owner) revert OwnerOnly(); _; } modifier ownerOrAdminOnly { if (msg.sender != owner && !isAdmin[msg.sender]) revert OwnerOrAdminOnly(); _; } constructor() { owner = msg.sender; } /// @notice Add a new token /// @param token Ethereum address of the token contract /// @param symbol 3 or 4 letter token 'ticker' /// @dev Required before any payments of this token can be made. function owner_registerToken(address token, string calldata symbol) external ownerOnly { bytes32 symbolHash = keccak256(abi.encode(symbol)); if (TokenAddress[symbolHash] != address(0)) revert TokenAlreadyAdded(); TokenAddress[symbolHash] = token; TokenSymbols.push(symbol); } /// @notice Remove an existing token /// @param symbol 3 or 4 letter token 'ticker' /// @dev Prevents further payments for this token. Does not remove existing beneficiaries. Does not withdraw any token funds. function owner_revokeToken(string calldata symbol) external ownerOnly { bytes32 symbolHash = keccak256(abi.encode(symbol)); if (TokenAddress[symbolHash] == address(0)) return; else { TokenAddress[symbolHash] = address(0); uint256 lastTokenIndex = TokenSymbols.length - 1; for (uint256 i; i < lastTokenIndex;) { if (keccak256(abi.encode(TokenSymbols[i])) == symbolHash) { TokenSymbols[i] = TokenSymbols[lastTokenIndex]; break; } unchecked { i++; } } TokenSymbols.pop(); } } /// @notice Set the admin status of an address /// @param account Ethereum address of the admin /// @param status true = grant admin rights, false = revoke admin rights /// @dev Accounts with admin status are permitted to call admin_ functions. function owner_setAdminStatus(address account, bool status) external ownerOnly { if (account == address(0)) revert AddressIsZero(); emit AdminStatusUpdated(account, status); if (isAdmin[account] != status) isAdmin[account] = status; } /// @notice Change contract owner /// @param account Ethereum address of the new owner /// @dev The owner may call any owner_ or admin_ function. function owner_setOwner(address account) external ownerOnly { if (account == address(0)) revert AddressIsZero(); owner = account; } /// @notice Withdraw an amount of the specified token from the contract /// @param token Ethereum address of the token contract /// @param destination Ethereum address of the withdrawal recipient /// @param amount Amount of funds to withdraw (in full decimals for the token) /// @dev Withdrawal does not depend on the token being registered with the contract at the time. function owner_withdrawFunds(address token, address destination, uint256 amount) external ownerOnly { if (destination == address(0)) revert AddressIsZero(); assert(ERC20(token).transfer(destination, amount)); } /// @notice Set up a new beneficiary for a token /// @param symbol 3 or 4 letter token 'ticker' (must be a registered token) /// @param account Ethereum address of the beneficiary /// @param totalAward Total amount being awarded (in full decimals for the token) /// @param numPayments Number of equal monthly payments to split the total award into (any excess from division is included in the first payment) /// @param startDate Date for the initial payment as a comma separated array, e.g.: 23rd July 2023 would be [23,7,2023] /// @dev Emits a BeneficiaryAdded log containing the input details for accounting. function admin_addBeneficiary(string calldata symbol, address account, uint256 totalAward, uint256 numPayments, Date calldata startDate) external ownerOrAdminOnly { if (account == address(0)) revert AddressIsZero(); if (totalAward == 0) revert AmountIsZero(); if (numPayments == 0) revert NumPaymentsIsZero(); address token = getTokenAddress(symbol); bytes32 key = keccak256(abi.encode(token, account)); if (NumPaymentsRemaining[key] != 0) revert AccountAlreadyExists(); TokenSubscribers[token].push(account); uint256 startTimestamp = dateToTimestamp(startDate); NextPaymentDue[key] = startTimestamp; NumPaymentsRemaining[key] = numPayments; (FirstPaymentAmount[key], RegularPaymentAmount[key]) = calcPaymentAmounts(numPayments, totalAward); Obligation[token] += totalAward; emit BeneficiaryAdded(token, account, totalAward, numPayments, startTimestamp); } /// @notice Remove an existing beneficiary of a token /// @param symbol 3 or 4 letter token 'ticker' /// @param account Ethereum address of the beneficiary being removed /// @dev Ends payments of this token to the beneficiary. Emits a BeneficiaryRemoved log containing the closing state for accounting. function admin_removeBeneficiary(string calldata symbol, address account) external ownerOrAdminOnly { address token = getTokenAddress(symbol); tokenUnsubscribe(token, account); bytes32 key = keccak256(abi.encode(token, account)); uint256 numPaymentsOutstanding = NumPaymentsRemaining[key]; uint256 awardRemainder = calcAmountDue(key, numPaymentsOutstanding); NextPaymentDue[key] = 0; NumPaymentsRemaining[key] = 0; FirstPaymentAmount[key] = 0; RegularPaymentAmount[key] = 0; Obligation[token] -= awardRemainder; emit BeneficiaryRemoved(token, account, awardRemainder, numPaymentsOutstanding); } /// @notice Pays all outstanding amounts due, across all tokens and beneficiaries /// @dev The contract must hold enough funds to make ALL the payments or the method will fail and no payments will be made. function admin_runPayments() external ownerOrAdminOnly { uint256 numTokens = TokenSymbols.length; for (uint256 i; i < numTokens;) { uint256 paid; address token = getTokenAddress(TokenSymbols[i]); address[] memory accounts = TokenSubscribers[token]; uint256 accountsLength = accounts.length; for (uint256 j; j < accountsLength;) { paid += makePaymentIfRequired(token, accounts[j]); unchecked { j++; } } Obligation[token] -= paid; unchecked { i++; } } } /// @notice Pays anything due to a single beneficiary for a specific token /// @param symbol 3 or 4 letter token 'ticker' /// @param account Ethereum address of the beneficiary function admin_runSinglePayment(string calldata symbol, address account) external ownerOrAdminOnly { address token = getTokenAddress(symbol); Obligation[token] -= makePaymentIfRequired(token, account); } /// @notice Allows a beneficiary to claim any unpaid funds due to date /// @dev Pays out for all tokens the beneficiary is entitled to. function claim() external { uint256 numTokens = TokenSymbols.length; for (uint256 i; i < numTokens;) { address token = getTokenAddress(TokenSymbols[i]); Obligation[token] -= makePaymentIfRequired(token, msg.sender); unchecked { i++; } } } /// @notice Query the next payment date of a token for a beneficiary /// @param symbol 3 or 4 letter token 'ticker' /// @param account Ethereum address of the beneficiary /// @dev Returns the date as a comma separated array, e.g.: 23rd July 2023 would be [23,7,2023]. function nextPaymentDate(string calldata symbol, address account) external view returns (Date memory) { bytes32 key = keccak256(abi.encode(getTokenAddress(symbol), account)); return timestampToDate(NextPaymentDue[key]); } /// @notice Query the number of outstanding payments of a token for a beneficiary /// @param symbol 3 or 4 letter token 'ticker' /// @param account Ethereum address of the beneficiary /// @dev Returns the number of monthly payments yet to be made. function paymentsRemaining(string calldata symbol, address account) external view returns (uint256) { bytes32 key = keccak256(abi.encode(getTokenAddress(symbol), account)); return NumPaymentsRemaining[key]; } /// @notice Query the monthly payment amount of a token for a beneficiary /// @param symbol 3 or 4 letter token 'ticker' /// @param account Ethereum address of the beneficiary /// @dev Returns the monthly payment amount (in full decimals for the token). function amountPerPayment(string calldata symbol, address account) external view returns (uint256) { bytes32 key = keccak256(abi.encode(getTokenAddress(symbol), account)); if (RegularPaymentAmount[key] > 0) return RegularPaymentAmount[key]; else return FirstPaymentAmount[key]; } /// @notice Get the current surplus/deficit for a token /// @param symbol 3 or 4 letter token 'ticker' /// @dev Returns the surplus (+) or deficit (-) in full decimals, accounting for all future payments. function tokenFundingStatus(string calldata symbol) external view returns (int256){ address token = getTokenAddress(symbol); uint256 balance = ERC20(token).balanceOf(address(this)); uint256 obligation = Obligation[token]; if (balance > obligation) return int256(balance - obligation); else if (obligation > balance) return int256(obligation - balance) * - 1; else return 0; } /// @notice Returns the list of current beneficiary addresses for a token /// @param symbol 3 or 4 letter token 'ticker' function activeBeneficiaries(string calldata symbol) external view returns (address[] memory) { address token = getTokenAddress(symbol); return TokenSubscribers[token]; } /// @notice Displays a list of all currently registered tokens function registeredTokens() external view returns (string[] memory) { return TokenSymbols; } /// ******* PRIVATE METHODS ******* /// function tokenUnsubscribe(address token, address account) private { address[] memory accounts = TokenSubscribers[token]; uint256 accountsLength = accounts.length; bool found; uint256 i; for (i; i < accountsLength;) { if (accounts[i] == account) { found = true; break; } unchecked { i++; } } if (found) { if (i < accountsLength - 1) TokenSubscribers[token][i] = TokenSubscribers[token][accountsLength - 1]; TokenSubscribers[token].pop(); } } function makePaymentIfRequired(address token, address account) private returns (uint256 payment) { bytes32 key = keccak256(abi.encode(token, account)); uint256 numPaymentsRemaining = NumPaymentsRemaining[key]; if (numPaymentsRemaining > 0) { uint256 nextPaymentDue = NextPaymentDue[key]; if (nextPaymentDue > block.timestamp) return payment = 0; uint256 numPaymentsToMake = 1 + (block.timestamp - nextPaymentDue) / TIME_BETWEEN_PAYMENTS; numPaymentsToMake = (numPaymentsToMake > numPaymentsRemaining) ? numPaymentsRemaining : numPaymentsToMake; numPaymentsRemaining -= numPaymentsToMake; NumPaymentsRemaining[key] = numPaymentsRemaining; NextPaymentDue[key] = nextPaymentDue + (numPaymentsToMake * TIME_BETWEEN_PAYMENTS); payment = calcAmountDue(key, numPaymentsToMake); assert(ERC20(token).transfer(account, payment)); } if (numPaymentsRemaining == 0) { tokenUnsubscribe(token, account); NextPaymentDue[key] = 0; RegularPaymentAmount[key] = 0; } } function getTokenAddress(string memory symbol) private view returns (address token) { token = TokenAddress[keccak256(abi.encode(symbol))]; if (token == address(0)) revert UnrecognisedToken(); } function calcPaymentAmounts(uint256 numPayments, uint256 award) private pure returns (uint256 first, uint256 regular) { if (numPayments == 1) first = award; else { unchecked { regular = award / numPayments; first = award - (regular * (numPayments - 1)); } } return (first, regular); } function calcAmountDue(bytes32 key, uint256 numPayments) private returns (uint256) { uint256 firstPaymentAmount = (FirstPaymentAmount[key]); unchecked { if (firstPaymentAmount == 0) { return RegularPaymentAmount[key] * numPayments; } else { FirstPaymentAmount[key] = 0; if (numPayments == 1 ) return firstPaymentAmount; else return firstPaymentAmount + (RegularPaymentAmount[key] * (numPayments - 1)); } } } function dateToTimestamp(Date calldata date) private pure returns (uint256 timestamp) { if (date.day == 0 || date.day > 31 || date.month == 0 || date.month > 12 || date.year < 1970) revert InvalidDate(); int256 d = int256(date.day); int256 y = int256(date.year); int256 m = int256(date.month); int256 _days = d-32075+(1461*(y+4800+(m-14)/12))/4+(367*(m-2-((m-14)/12)*12))/12-(3*((y+4900+(m-14)/12)/100))/4-2440588; timestamp = uint256(_days) * 1 days; } function timestampToDate(uint256 timestamp) private pure returns (Date memory date) { if (timestamp != 0) { unchecked { int256 L = int256(timestamp / 1 days) + 2509157; int256 N = (4 * L) / 146097; L = L - (146097 * N + 3) / 4; int256 y = (4000 * (L + 1)) / 1461001; L = L - (1461 * y) / 4 + 31; int256 m = (80 * L) / 2447; int256 d = L - (2447 * m) / 80; L = m / 11; m = m + 2 - 12 * L; y = 100 * (N - 49) + y + L; date.year = uint256(y); date.month = uint256(m); date.day = uint256(d); } } } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccountAlreadyExists","type":"error"},{"inputs":[],"name":"AddressIsZero","type":"error"},{"inputs":[],"name":"AmountIsZero","type":"error"},{"inputs":[],"name":"InvalidDate","type":"error"},{"inputs":[],"name":"NumPaymentsIsZero","type":"error"},{"inputs":[],"name":"OwnerOnly","type":"error"},{"inputs":[],"name":"OwnerOrAdminOnly","type":"error"},{"inputs":[],"name":"TokenAlreadyAdded","type":"error"},{"inputs":[],"name":"UnrecognisedToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isAdmin","type":"bool"}],"name":"AdminStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"award","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numPayments","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTimestamp","type":"uint256"}],"name":"BeneficiaryAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"awardRemainder","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numPaymentsOutstanding","type":"uint256"}],"name":"BeneficiaryRemoved","type":"event"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"activeBeneficiaries","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"totalAward","type":"uint256"},{"internalType":"uint256","name":"numPayments","type":"uint256"},{"components":[{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"uint256","name":"month","type":"uint256"},{"internalType":"uint256","name":"year","type":"uint256"}],"internalType":"struct Date","name":"startDate","type":"tuple"}],"name":"admin_addBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"admin_removeBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin_runPayments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"admin_runSinglePayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"amountPerPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"nextPaymentDate","outputs":[{"components":[{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"uint256","name":"month","type":"uint256"},{"internalType":"uint256","name":"year","type":"uint256"}],"internalType":"struct Date","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"string","name":"symbol","type":"string"}],"name":"owner_registerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"owner_revokeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"owner_setAdminStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"owner_setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"owner_withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"account","type":"address"}],"name":"paymentsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registeredTokens","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"tokenFundingStatus","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613ad0806100616000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806384b413c9116100a2578063afcf5f4611610071578063afcf5f46146102a3578063b7fa88fb146102d3578063b9ad126714610303578063e512ef471461031f578063fa21dffc1461034f57610116565b806384b413c91461021d5780638da5cb5b146102395780638e126565146102575780638ecfcfb51461028757610116565b806346a48947116100e957806346a48947146101a15780634e71d92d146101bd5780635a4fa641146101c7578063765cfad8146101e357806376dbff651461021357610116565b806324d7806c1461011b5780633639ee041461014b5780633d0ff43d146101675780634546661614610183575b600080fd5b610135600480360381019061013091906129ca565b61036b565b6040516101429190612a12565b60405180910390f35b61016560048036038101906101609190612a92565b61038b565b005b610181600480360381019061017c9190612b28565b61056c565b005b61018b6106e9565b6040516101989190612ccd565b60405180910390f35b6101bb60048036038101906101b69190612d13565b6107c2565b005b6101c5610c2d565b005b6101e160048036038101906101dc9190612dd9565b610d66565b005b6101fd60048036038101906101f89190612e19565b610f54565b60405161020a9190612f24565b60405180910390f35b61021b611074565b005b610237600480360381019061023291906129ca565b61139f565b005b6102416114d0565b60405161024e9190612f55565b60405180910390f35b610271600480360381019061026c9190612e19565b6114f6565b60405161027e9190612f89565b60405180910390f35b6102a1600480360381019061029c9190612fa4565b61167f565b005b6102bd60048036038101906102b89190612fa4565b611814565b6040516102ca9190613013565b60405180910390f35b6102ed60048036038101906102e89190612fa4565b6118ac565b6040516102fa919061307f565b60405180910390f35b61031d60048036038101906103189190612e19565b611953565b005b61033960048036038101906103349190612fa4565b611bc3565b6040516103469190613013565b60405180910390f35b61036960048036038101906103649190612fa4565b611c94565b005b60076020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610412576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082826040516020016104279291906130e7565b604051602081830303815290604052805190602001209050600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146104d7576040517f630b374b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008838390918060018154018082558091505060019003906000526020600020016000909192909192909192909192509182610565929190613351565b5050505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105f3576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610659576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610694929190613421565b6020604051808303816000875af11580156106b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d7919061345f565b6106e4576106e361348c565b5b505050565b60606008805480602002602001604051908101604052809291908181526020016000905b828210156107b957838290600052602060002001805461072c90613174565b80601f016020809104026020016040519081016040528092919081815260200182805461075890613174565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b50505050508152602001906001019061070d565b50505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561086a5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156108a1576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610907576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303610941576040517f43ad20fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361097b576040517fd0828fc900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109ca87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050600081866040516020016109e19291906134bb565b6040516020818303038152906040528051906020012090506000600460008381526020019081526020016000205414610a46576040517f69783db700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000610af184612013565b9050806003600084815260200190815260200160002081905550846004600084815260200190815260200160002081905550610b2d85876121f6565b60056000858152602001908152602001600020600060066000878152602001908152602001600020600084919050558391905055505085600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bb29190613513565b925050819055508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f57e5b17220bd5fcc437d0282ff1db6e09bea088aa3a1305a20d06d3d59fbb7e6888885604051610c1a93929190613547565b60405180910390a3505050505050505050565b6000600880549050905060005b81811015610d62576000610cf360088381548110610c5b57610c5a61357e565b5b906000526020600020018054610c7090613174565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9c90613174565b8015610ce95780601f10610cbe57610100808354040283529160200191610ce9565b820191906000526020600020905b815481529060010190602001808311610ccc57829003601f168201915b5050505050611f4b565b9050610cff813361222e565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d4d91906135ad565b92505081905550818060010192505050610c3a565b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e53576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f73a6b146fc546254c55a26966ad3c389d945ab2aa613dcfee0457e243c93e25982604051610e999190612a12565b60405180910390a2801515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610f505780600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5050565b60606000610fa584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561106657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161101c575b505050505091505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561111c5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611153576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600880549050905060005b8181101561139b5760008061121a600884815481106111825761118161357e565b5b90600052602060002001805461119790613174565b80601f01602080910402602001604051908101604052809291908181526020018280546111c390613174565b80156112105780601f106111e557610100808354040283529160200191611210565b820191906000526020600020905b8154815290600101906020018083116111f357829003601f168201915b5050505050611f4b565b90506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156112dd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611293575b5050505050905060008151905060005b81811015611333576113198484838151811061130c5761130b61357e565b5b602002602001015161222e565b856113249190613513565b945080806001019150506112ed565b5083600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461138391906135ad565b92505081905550848060010195505050505050611160565b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611426576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361148c576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061154684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115839190612f55565b602060405180830381865afa1580156115a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c491906135f6565b90506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508082111561162857808261161e91906135ad565b9350505050611679565b81811115611671577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828261165d91906135ad565b6116679190613623565b9350505050611679565b600093505050505b92915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156117275750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561175e576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117ad84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b90506117b9818361222e565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461180791906135ad565b9250508190555050505050565b60008061186485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b836040516020016118769291906134bb565b60405160208183030381529060405280519060200120905060046000828152602001908152602001600020549150509392505050565b6118b46128e4565b600061190385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b836040516020016119159291906134bb565b6040516020818303038152906040528051906020012090506119496003600083815260200190815260200160002054612423565b9150509392505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119da576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082826040516020016119ef9291906130e7565b604051602081830303815290604052805190602001209050600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a735750611bbf565b600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006001600880549050611ad991906135ad565b905060005b81811015611b8b578260088281548110611afb57611afa61357e565b5b90600052602060002001604051602001611b15919061371f565b6040516020818303038152906040528051906020012003611b7e5760088281548110611b4457611b4361357e565b5b9060005260206000200160088281548110611b6257611b6161357e565b5b906000526020600020019081611b78919061376c565b50611b8b565b8080600101915050611ade565b506008805480611b9e57611b9d613854565b5b600190038181906000526020600020016000611bba9190612905565b905550505b5050565b600080611c1385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b83604051602001611c259291906134bb565b604051602081830303815290604052805190602001209050600060066000838152602001908152602001600020541115611c75576006600082815260200190815260200160002054915050611c8d565b60056000828152602001908152602001600020549150505b9392505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611d3c5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611d73576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611dc284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050611dce8183612550565b60008183604051602001611de39291906134bb565b6040516020818303038152906040528051906020012090506000600460008381526020019081526020016000205490506000611e1f8383612856565b90506000600360008581526020019081526020016000208190555060006004600085815260200190815260200160002081905550600060056000858152602001908152602001600020819055506000600660008581526020019081526020016000208190555080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ed491906135ad565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4585bda87e16923f5ee484b56df9f15c89c764ddbd22491e477453163cc8cdce8385604051611f3a929190613883565b60405180910390a350505050505050565b600080600083604051602001611f6191906138e5565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361200e576040517f2d3140ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808260000135148061202b5750601f8260000135115b8061203a575060008260200135145b806120495750600c8260200135115b8061205957506107b28260400135105b15612090576040517f81bf7f6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082600001359050600083604001359050600084602001359050600062253d8c60046064600c600e866120c49190613907565b6120ce9190613979565b611324876120dc91906139e3565b6120e691906139e3565b6120f09190613979565b60036120fc9190613623565b6121069190613979565b600c80600c600e876121189190613907565b6121229190613979565b61212c9190613623565b6002866121399190613907565b6121439190613907565b61016f6121509190613623565b61215a9190613979565b6004600c600e8761216b9190613907565b6121759190613979565b6112c08861218391906139e3565b61218d91906139e3565b6105b561219a9190613623565b6121a49190613979565b617d4b886121b29190613907565b6121bc91906139e3565b6121c691906139e3565b6121d09190613907565b6121da9190613907565b905062015180816121eb9190613a27565b945050505050919050565b6000806001840361220957829150612227565b8383816122195761221861394a565b5b049050600184038102830391505b9250929050565b60008083836040516020016122449291906134bb565b60405160208183030381529060405280519060200120905060006004600083815260200190815260200160002054905060008111156123d557600060036000848152602001908152602001600020549050428111156122a9576000935050505061241d565b600062278d0082426122bb91906135ad565b6122c59190613a69565b60016122d19190613513565b90508281116122e057806122e2565b825b905080836122f091906135ad565b925082600460008681526020019081526020016000208190555062278d00816123199190613a27565b826123249190613513565b60036000868152602001908152602001600020819055506123458482612856565b94508673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87876040518363ffffffff1660e01b8152600401612382929190613421565b6020604051808303816000875af11580156123a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c5919061345f565b6123d2576123d161348c565b5b50505b6000810361241a576123e78585612550565b60006003600084815260200190815260200160002081905550600060066000848152602001908152602001600020819055505b50505b92915050565b61242b6128e4565b6000821461254b5760006226496562015180848161244c5761244b61394a565b5b04019050600062023ab182600402816124685761246761394a565b5b059050600460038262023ab10201816124845761248361394a565b5b0582039150600062164b0960018401610fa002816124a5576124a461394a565b5b059050601f6004826105b502816124bf576124be61394a565b5b058403019250600061098f84605002816124dc576124db61394a565b5b059050600060508261098f02816124f6576124f561394a565b5b0585039050600b828161250c5761250b61394a565b5b05945084600c02600283010391508483603186036064020101925082866040018181525050818660200181815250508086600001818152505050505050505b919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561261157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116125c7575b505050505090506000815190506000805b8281101561268d578473ffffffffffffffffffffffffffffffffffffffff168482815181106126545761265361357e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612680576001915061268d565b8080600101915050612622565b811561284e576001836126a091906135ad565b8110156127c957600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001846126f391906135ad565b815481106127045761270361357e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106127805761277f61357e565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061281857612817613854565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b505050505050565b600080600560008581526020019081526020016000205490506000810361289557826006600086815260200190815260200160002054029150506128de565b60006005600086815260200190815260200160002081905550600183036128bf57809150506128de565b6001830360066000868152602001908152602001600020540281019150505b92915050565b60405180606001604052806000815260200160008152602001600081525090565b50805461291190613174565b6000825580601f106129235750612942565b601f0160209004906000526020600020908101906129419190612945565b5b50565b5b8082111561295e576000816000905550600101612946565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129978261296c565b9050919050565b6129a78161298c565b81146129b257600080fd5b50565b6000813590506129c48161299e565b92915050565b6000602082840312156129e0576129df612962565b5b60006129ee848285016129b5565b91505092915050565b60008115159050919050565b612a0c816129f7565b82525050565b6000602082019050612a276000830184612a03565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a5257612a51612a2d565b5b8235905067ffffffffffffffff811115612a6f57612a6e612a32565b5b602083019150836001820283011115612a8b57612a8a612a37565b5b9250929050565b600080600060408486031215612aab57612aaa612962565b5b6000612ab9868287016129b5565b935050602084013567ffffffffffffffff811115612ada57612ad9612967565b5b612ae686828701612a3c565b92509250509250925092565b6000819050919050565b612b0581612af2565b8114612b1057600080fd5b50565b600081359050612b2281612afc565b92915050565b600080600060608486031215612b4157612b40612962565b5b6000612b4f868287016129b5565b9350506020612b60868287016129b5565b9250506040612b7186828701612b13565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612be1578082015181840152602081019050612bc6565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c0982612ba7565b612c138185612bb2565b9350612c23818560208601612bc3565b612c2c81612bed565b840191505092915050565b6000612c438383612bfe565b905092915050565b6000602082019050919050565b6000612c6382612b7b565b612c6d8185612b86565b935083602082028501612c7f85612b97565b8060005b85811015612cbb5784840389528151612c9c8582612c37565b9450612ca783612c4b565b925060208a01995050600181019050612c83565b50829750879550505050505092915050565b60006020820190508181036000830152612ce78184612c58565b905092915050565b600080fd5b600060608284031215612d0a57612d09612cef565b5b81905092915050565b60008060008060008060e08789031215612d3057612d2f612962565b5b600087013567ffffffffffffffff811115612d4e57612d4d612967565b5b612d5a89828a01612a3c565b96509650506020612d6d89828a016129b5565b9450506040612d7e89828a01612b13565b9350506060612d8f89828a01612b13565b9250506080612da089828a01612cf4565b9150509295509295509295565b612db6816129f7565b8114612dc157600080fd5b50565b600081359050612dd381612dad565b92915050565b60008060408385031215612df057612def612962565b5b6000612dfe858286016129b5565b9250506020612e0f85828601612dc4565b9150509250929050565b60008060208385031215612e3057612e2f612962565b5b600083013567ffffffffffffffff811115612e4e57612e4d612967565b5b612e5a85828601612a3c565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e9b8161298c565b82525050565b6000612ead8383612e92565b60208301905092915050565b6000602082019050919050565b6000612ed182612e66565b612edb8185612e71565b9350612ee683612e82565b8060005b83811015612f17578151612efe8882612ea1565b9750612f0983612eb9565b925050600181019050612eea565b5085935050505092915050565b60006020820190508181036000830152612f3e8184612ec6565b905092915050565b612f4f8161298c565b82525050565b6000602082019050612f6a6000830184612f46565b92915050565b6000819050919050565b612f8381612f70565b82525050565b6000602082019050612f9e6000830184612f7a565b92915050565b600080600060408486031215612fbd57612fbc612962565b5b600084013567ffffffffffffffff811115612fdb57612fda612967565b5b612fe786828701612a3c565b93509350506020612ffa868287016129b5565b9150509250925092565b61300d81612af2565b82525050565b60006020820190506130286000830184613004565b92915050565b61303781612af2565b82525050565b606082016000820151613053600085018261302e565b506020820151613066602085018261302e565b506040820151613079604085018261302e565b50505050565b6000606082019050613094600083018461303d565b92915050565b600082825260208201905092915050565b82818337600083830152505050565b60006130c6838561309a565b93506130d38385846130ab565b6130dc83612bed565b840190509392505050565b600060208201905081810360008301526131028184866130ba565b90509392505050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061318c57607f821691505b60208210810361319f5761319e613145565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826131ca565b61321186836131ca565b95508019841693508086168417925050509392505050565b6000819050919050565b600061324e61324961324484612af2565b613229565b612af2565b9050919050565b6000819050919050565b61326883613233565b61327c61327482613255565b8484546131d7565b825550505050565b600090565b613291613284565b61329c81848461325f565b505050565b5b818110156132c0576132b5600082613289565b6001810190506132a2565b5050565b601f821115613305576132d6816131a5565b6132df846131ba565b810160208510156132ee578190505b6133026132fa856131ba565b8301826132a1565b50505b505050565b600082821c905092915050565b60006133286000198460080261330a565b1980831691505092915050565b60006133418383613317565b9150826002028217905092915050565b61335b838361310b565b67ffffffffffffffff81111561337457613373613116565b5b61337e8254613174565b6133898282856132c4565b6000601f8311600181146133b857600084156133a6578287013590505b6133b08582613335565b865550613418565b601f1984166133c6866131a5565b60005b828110156133ee578489013582556001820191506020850194506020810190506133c9565b8683101561340b5784890135613407601f891682613317565b8355505b6001600288020188555050505b50505050505050565b60006040820190506134366000830185612f46565b6134436020830184613004565b9392505050565b60008151905061345981612dad565b92915050565b60006020828403121561347557613474612962565b5b60006134838482850161344a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60006040820190506134d06000830185612f46565b6134dd6020830184612f46565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351e82612af2565b915061352983612af2565b9250828201905080821115613541576135406134e4565b5b92915050565b600060608201905061355c6000830186613004565b6135696020830185613004565b6135766040830184613004565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006135b882612af2565b91506135c383612af2565b92508282039050818111156135db576135da6134e4565b5b92915050565b6000815190506135f081612afc565b92915050565b60006020828403121561360c5761360b612962565b5b600061361a848285016135e1565b91505092915050565b600061362e82612f70565b915061363983612f70565b925082820261364781612f70565b91507f8000000000000000000000000000000000000000000000000000000000000000841460008412161561367f5761367e6134e4565b5b8282058414831517613694576136936134e4565b5b5092915050565b600081546136a881613174565b6136b2818661309a565b945060018216600081146136cd57600181146136e357613716565b60ff198316865281151560200286019350613716565b6136ec856131a5565b60005b8381101561370e578154818901526001820191506020810190506136ef565b808801955050505b50505092915050565b60006020820190508181036000830152613739818461369b565b905092915050565b60008154905061375081613174565b9050919050565b60008190508160005260206000209050919050565b81810361377a575050613852565b61378382613741565b67ffffffffffffffff81111561379c5761379b613116565b5b6137a68254613174565b6137b18282856132c4565b6000601f8311600181146137e057600084156137ce578287015490505b6137d88582613335565b86555061384b565b601f1984166137ee87613757565b96506137f9866131a5565b60005b82811015613821578489015482556001820191506001850194506020810190506137fc565b8683101561383e578489015461383a601f891682613317565b8355505b6001600288020188555050505b5050505050505b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006040820190506138986000830185613004565b6138a56020830184613004565b9392505050565b60006138b782612ba7565b6138c1818561309a565b93506138d1818560208601612bc3565b6138da81612bed565b840191505092915050565b600060208201905081810360008301526138ff81846138ac565b905092915050565b600061391282612f70565b915061391d83612f70565b9250828203905081811260008412168282136000851215161715613944576139436134e4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061398482612f70565b915061398f83612f70565b92508261399f5761399e61394a565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156139d8576139d76134e4565b5b828205905092915050565b60006139ee82612f70565b91506139f983612f70565b925082820190508281121560008312168382126000841215161715613a2157613a206134e4565b5b92915050565b6000613a3282612af2565b9150613a3d83612af2565b9250828202613a4b81612af2565b91508282048414831517613a6257613a616134e4565b5b5092915050565b6000613a7482612af2565b9150613a7f83612af2565b925082613a8f57613a8e61394a565b5b82820490509291505056fea264697066735822122064287e733c98da2bca689f8dededcf7a2b4d3f75eff8e8c55c0aee153924ffc264736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101165760003560e01c806384b413c9116100a2578063afcf5f4611610071578063afcf5f46146102a3578063b7fa88fb146102d3578063b9ad126714610303578063e512ef471461031f578063fa21dffc1461034f57610116565b806384b413c91461021d5780638da5cb5b146102395780638e126565146102575780638ecfcfb51461028757610116565b806346a48947116100e957806346a48947146101a15780634e71d92d146101bd5780635a4fa641146101c7578063765cfad8146101e357806376dbff651461021357610116565b806324d7806c1461011b5780633639ee041461014b5780633d0ff43d146101675780634546661614610183575b600080fd5b610135600480360381019061013091906129ca565b61036b565b6040516101429190612a12565b60405180910390f35b61016560048036038101906101609190612a92565b61038b565b005b610181600480360381019061017c9190612b28565b61056c565b005b61018b6106e9565b6040516101989190612ccd565b60405180910390f35b6101bb60048036038101906101b69190612d13565b6107c2565b005b6101c5610c2d565b005b6101e160048036038101906101dc9190612dd9565b610d66565b005b6101fd60048036038101906101f89190612e19565b610f54565b60405161020a9190612f24565b60405180910390f35b61021b611074565b005b610237600480360381019061023291906129ca565b61139f565b005b6102416114d0565b60405161024e9190612f55565b60405180910390f35b610271600480360381019061026c9190612e19565b6114f6565b60405161027e9190612f89565b60405180910390f35b6102a1600480360381019061029c9190612fa4565b61167f565b005b6102bd60048036038101906102b89190612fa4565b611814565b6040516102ca9190613013565b60405180910390f35b6102ed60048036038101906102e89190612fa4565b6118ac565b6040516102fa919061307f565b60405180910390f35b61031d60048036038101906103189190612e19565b611953565b005b61033960048036038101906103349190612fa4565b611bc3565b6040516103469190613013565b60405180910390f35b61036960048036038101906103649190612fa4565b611c94565b005b60076020528060005260406000206000915054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610412576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082826040516020016104279291906130e7565b604051602081830303815290604052805190602001209050600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146104d7576040517f630b374b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506008838390918060018154018082558091505060019003906000526020600020016000909192909192909192909192509182610565929190613351565b5050505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105f3576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610659576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610694929190613421565b6020604051808303816000875af11580156106b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d7919061345f565b6106e4576106e361348c565b5b505050565b60606008805480602002602001604051908101604052809291908181526020016000905b828210156107b957838290600052602060002001805461072c90613174565b80601f016020809104026020016040519081016040528092919081815260200182805461075890613174565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b50505050508152602001906001019061070d565b50505050905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561086a5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156108a1576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610907576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303610941576040517f43ad20fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361097b576040517fd0828fc900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109ca87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050600081866040516020016109e19291906134bb565b6040516020818303038152906040528051906020012090506000600460008381526020019081526020016000205414610a46576040517f69783db700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000610af184612013565b9050806003600084815260200190815260200160002081905550846004600084815260200190815260200160002081905550610b2d85876121f6565b60056000858152602001908152602001600020600060066000878152602001908152602001600020600084919050558391905055505085600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bb29190613513565b925050819055508673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f57e5b17220bd5fcc437d0282ff1db6e09bea088aa3a1305a20d06d3d59fbb7e6888885604051610c1a93929190613547565b60405180910390a3505050505050505050565b6000600880549050905060005b81811015610d62576000610cf360088381548110610c5b57610c5a61357e565b5b906000526020600020018054610c7090613174565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9c90613174565b8015610ce95780601f10610cbe57610100808354040283529160200191610ce9565b820191906000526020600020905b815481529060010190602001808311610ccc57829003601f168201915b5050505050611f4b565b9050610cff813361222e565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d4d91906135ad565b92505081905550818060010192505050610c3a565b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ded576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e53576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f73a6b146fc546254c55a26966ad3c389d945ab2aa613dcfee0457e243c93e25982604051610e999190612a12565b60405180910390a2801515600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610f505780600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5050565b60606000610fa584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561106657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161101c575b505050505091505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561111c5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611153576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600880549050905060005b8181101561139b5760008061121a600884815481106111825761118161357e565b5b90600052602060002001805461119790613174565b80601f01602080910402602001604051908101604052809291908181526020018280546111c390613174565b80156112105780601f106111e557610100808354040283529160200191611210565b820191906000526020600020905b8154815290600101906020018083116111f357829003601f168201915b5050505050611f4b565b90506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156112dd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611293575b5050505050905060008151905060005b81811015611333576113198484838151811061130c5761130b61357e565b5b602002602001015161222e565b856113249190613513565b945080806001019150506112ed565b5083600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461138391906135ad565b92505081905550848060010195505050505050611160565b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611426576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361148c576040517f867915ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061154684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115839190612f55565b602060405180830381865afa1580156115a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c491906135f6565b90506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508082111561162857808261161e91906135ad565b9350505050611679565b81811115611671577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828261165d91906135ad565b6116679190613623565b9350505050611679565b600093505050505b92915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156117275750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561175e576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117ad84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b90506117b9818361222e565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461180791906135ad565b9250508190555050505050565b60008061186485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b836040516020016118769291906134bb565b60405160208183030381529060405280519060200120905060046000828152602001908152602001600020549150509392505050565b6118b46128e4565b600061190385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b836040516020016119159291906134bb565b6040516020818303038152906040528051906020012090506119496003600083815260200190815260200160002054612423565b9150509392505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119da576040517f596dcdb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082826040516020016119ef9291906130e7565b604051602081830303815290604052805190602001209050600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a735750611bbf565b600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006001600880549050611ad991906135ad565b905060005b81811015611b8b578260088281548110611afb57611afa61357e565b5b90600052602060002001604051602001611b15919061371f565b6040516020818303038152906040528051906020012003611b7e5760088281548110611b4457611b4361357e565b5b9060005260206000200160088281548110611b6257611b6161357e565b5b906000526020600020019081611b78919061376c565b50611b8b565b8080600101915050611ade565b506008805480611b9e57611b9d613854565b5b600190038181906000526020600020016000611bba9190612905565b905550505b5050565b600080611c1385858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b83604051602001611c259291906134bb565b604051602081830303815290604052805190602001209050600060066000838152602001908152602001600020541115611c75576006600082815260200190815260200160002054915050611c8d565b60056000828152602001908152602001600020549150505b9392505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611d3c5750600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611d73576040517f2ef6fc1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611dc284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611f4b565b9050611dce8183612550565b60008183604051602001611de39291906134bb565b6040516020818303038152906040528051906020012090506000600460008381526020019081526020016000205490506000611e1f8383612856565b90506000600360008581526020019081526020016000208190555060006004600085815260200190815260200160002081905550600060056000858152602001908152602001600020819055506000600660008581526020019081526020016000208190555080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ed491906135ad565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4585bda87e16923f5ee484b56df9f15c89c764ddbd22491e477453163cc8cdce8385604051611f3a929190613883565b60405180910390a350505050505050565b600080600083604051602001611f6191906138e5565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361200e576040517f2d3140ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808260000135148061202b5750601f8260000135115b8061203a575060008260200135145b806120495750600c8260200135115b8061205957506107b28260400135105b15612090576040517f81bf7f6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082600001359050600083604001359050600084602001359050600062253d8c60046064600c600e866120c49190613907565b6120ce9190613979565b611324876120dc91906139e3565b6120e691906139e3565b6120f09190613979565b60036120fc9190613623565b6121069190613979565b600c80600c600e876121189190613907565b6121229190613979565b61212c9190613623565b6002866121399190613907565b6121439190613907565b61016f6121509190613623565b61215a9190613979565b6004600c600e8761216b9190613907565b6121759190613979565b6112c08861218391906139e3565b61218d91906139e3565b6105b561219a9190613623565b6121a49190613979565b617d4b886121b29190613907565b6121bc91906139e3565b6121c691906139e3565b6121d09190613907565b6121da9190613907565b905062015180816121eb9190613a27565b945050505050919050565b6000806001840361220957829150612227565b8383816122195761221861394a565b5b049050600184038102830391505b9250929050565b60008083836040516020016122449291906134bb565b60405160208183030381529060405280519060200120905060006004600083815260200190815260200160002054905060008111156123d557600060036000848152602001908152602001600020549050428111156122a9576000935050505061241d565b600062278d0082426122bb91906135ad565b6122c59190613a69565b60016122d19190613513565b90508281116122e057806122e2565b825b905080836122f091906135ad565b925082600460008681526020019081526020016000208190555062278d00816123199190613a27565b826123249190613513565b60036000868152602001908152602001600020819055506123458482612856565b94508673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87876040518363ffffffff1660e01b8152600401612382929190613421565b6020604051808303816000875af11580156123a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c5919061345f565b6123d2576123d161348c565b5b50505b6000810361241a576123e78585612550565b60006003600084815260200190815260200160002081905550600060066000848152602001908152602001600020819055505b50505b92915050565b61242b6128e4565b6000821461254b5760006226496562015180848161244c5761244b61394a565b5b04019050600062023ab182600402816124685761246761394a565b5b059050600460038262023ab10201816124845761248361394a565b5b0582039150600062164b0960018401610fa002816124a5576124a461394a565b5b059050601f6004826105b502816124bf576124be61394a565b5b058403019250600061098f84605002816124dc576124db61394a565b5b059050600060508261098f02816124f6576124f561394a565b5b0585039050600b828161250c5761250b61394a565b5b05945084600c02600283010391508483603186036064020101925082866040018181525050818660200181815250508086600001818152505050505050505b919050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561261157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116125c7575b505050505090506000815190506000805b8281101561268d578473ffffffffffffffffffffffffffffffffffffffff168482815181106126545761265361357e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603612680576001915061268d565b8080600101915050612622565b811561284e576001836126a091906135ad565b8110156127c957600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001846126f391906135ad565b815481106127045761270361357e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106127805761277f61357e565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061281857612817613854565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b505050505050565b600080600560008581526020019081526020016000205490506000810361289557826006600086815260200190815260200160002054029150506128de565b60006005600086815260200190815260200160002081905550600183036128bf57809150506128de565b6001830360066000868152602001908152602001600020540281019150505b92915050565b60405180606001604052806000815260200160008152602001600081525090565b50805461291190613174565b6000825580601f106129235750612942565b601f0160209004906000526020600020908101906129419190612945565b5b50565b5b8082111561295e576000816000905550600101612946565b5090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129978261296c565b9050919050565b6129a78161298c565b81146129b257600080fd5b50565b6000813590506129c48161299e565b92915050565b6000602082840312156129e0576129df612962565b5b60006129ee848285016129b5565b91505092915050565b60008115159050919050565b612a0c816129f7565b82525050565b6000602082019050612a276000830184612a03565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a5257612a51612a2d565b5b8235905067ffffffffffffffff811115612a6f57612a6e612a32565b5b602083019150836001820283011115612a8b57612a8a612a37565b5b9250929050565b600080600060408486031215612aab57612aaa612962565b5b6000612ab9868287016129b5565b935050602084013567ffffffffffffffff811115612ada57612ad9612967565b5b612ae686828701612a3c565b92509250509250925092565b6000819050919050565b612b0581612af2565b8114612b1057600080fd5b50565b600081359050612b2281612afc565b92915050565b600080600060608486031215612b4157612b40612962565b5b6000612b4f868287016129b5565b9350506020612b60868287016129b5565b9250506040612b7186828701612b13565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612be1578082015181840152602081019050612bc6565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c0982612ba7565b612c138185612bb2565b9350612c23818560208601612bc3565b612c2c81612bed565b840191505092915050565b6000612c438383612bfe565b905092915050565b6000602082019050919050565b6000612c6382612b7b565b612c6d8185612b86565b935083602082028501612c7f85612b97565b8060005b85811015612cbb5784840389528151612c9c8582612c37565b9450612ca783612c4b565b925060208a01995050600181019050612c83565b50829750879550505050505092915050565b60006020820190508181036000830152612ce78184612c58565b905092915050565b600080fd5b600060608284031215612d0a57612d09612cef565b5b81905092915050565b60008060008060008060e08789031215612d3057612d2f612962565b5b600087013567ffffffffffffffff811115612d4e57612d4d612967565b5b612d5a89828a01612a3c565b96509650506020612d6d89828a016129b5565b9450506040612d7e89828a01612b13565b9350506060612d8f89828a01612b13565b9250506080612da089828a01612cf4565b9150509295509295509295565b612db6816129f7565b8114612dc157600080fd5b50565b600081359050612dd381612dad565b92915050565b60008060408385031215612df057612def612962565b5b6000612dfe858286016129b5565b9250506020612e0f85828601612dc4565b9150509250929050565b60008060208385031215612e3057612e2f612962565b5b600083013567ffffffffffffffff811115612e4e57612e4d612967565b5b612e5a85828601612a3c565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e9b8161298c565b82525050565b6000612ead8383612e92565b60208301905092915050565b6000602082019050919050565b6000612ed182612e66565b612edb8185612e71565b9350612ee683612e82565b8060005b83811015612f17578151612efe8882612ea1565b9750612f0983612eb9565b925050600181019050612eea565b5085935050505092915050565b60006020820190508181036000830152612f3e8184612ec6565b905092915050565b612f4f8161298c565b82525050565b6000602082019050612f6a6000830184612f46565b92915050565b6000819050919050565b612f8381612f70565b82525050565b6000602082019050612f9e6000830184612f7a565b92915050565b600080600060408486031215612fbd57612fbc612962565b5b600084013567ffffffffffffffff811115612fdb57612fda612967565b5b612fe786828701612a3c565b93509350506020612ffa868287016129b5565b9150509250925092565b61300d81612af2565b82525050565b60006020820190506130286000830184613004565b92915050565b61303781612af2565b82525050565b606082016000820151613053600085018261302e565b506020820151613066602085018261302e565b506040820151613079604085018261302e565b50505050565b6000606082019050613094600083018461303d565b92915050565b600082825260208201905092915050565b82818337600083830152505050565b60006130c6838561309a565b93506130d38385846130ab565b6130dc83612bed565b840190509392505050565b600060208201905081810360008301526131028184866130ba565b90509392505050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061318c57607f821691505b60208210810361319f5761319e613145565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826131ca565b61321186836131ca565b95508019841693508086168417925050509392505050565b6000819050919050565b600061324e61324961324484612af2565b613229565b612af2565b9050919050565b6000819050919050565b61326883613233565b61327c61327482613255565b8484546131d7565b825550505050565b600090565b613291613284565b61329c81848461325f565b505050565b5b818110156132c0576132b5600082613289565b6001810190506132a2565b5050565b601f821115613305576132d6816131a5565b6132df846131ba565b810160208510156132ee578190505b6133026132fa856131ba565b8301826132a1565b50505b505050565b600082821c905092915050565b60006133286000198460080261330a565b1980831691505092915050565b60006133418383613317565b9150826002028217905092915050565b61335b838361310b565b67ffffffffffffffff81111561337457613373613116565b5b61337e8254613174565b6133898282856132c4565b6000601f8311600181146133b857600084156133a6578287013590505b6133b08582613335565b865550613418565b601f1984166133c6866131a5565b60005b828110156133ee578489013582556001820191506020850194506020810190506133c9565b8683101561340b5784890135613407601f891682613317565b8355505b6001600288020188555050505b50505050505050565b60006040820190506134366000830185612f46565b6134436020830184613004565b9392505050565b60008151905061345981612dad565b92915050565b60006020828403121561347557613474612962565b5b60006134838482850161344a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60006040820190506134d06000830185612f46565b6134dd6020830184612f46565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351e82612af2565b915061352983612af2565b9250828201905080821115613541576135406134e4565b5b92915050565b600060608201905061355c6000830186613004565b6135696020830185613004565b6135766040830184613004565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006135b882612af2565b91506135c383612af2565b92508282039050818111156135db576135da6134e4565b5b92915050565b6000815190506135f081612afc565b92915050565b60006020828403121561360c5761360b612962565b5b600061361a848285016135e1565b91505092915050565b600061362e82612f70565b915061363983612f70565b925082820261364781612f70565b91507f8000000000000000000000000000000000000000000000000000000000000000841460008412161561367f5761367e6134e4565b5b8282058414831517613694576136936134e4565b5b5092915050565b600081546136a881613174565b6136b2818661309a565b945060018216600081146136cd57600181146136e357613716565b60ff198316865281151560200286019350613716565b6136ec856131a5565b60005b8381101561370e578154818901526001820191506020810190506136ef565b808801955050505b50505092915050565b60006020820190508181036000830152613739818461369b565b905092915050565b60008154905061375081613174565b9050919050565b60008190508160005260206000209050919050565b81810361377a575050613852565b61378382613741565b67ffffffffffffffff81111561379c5761379b613116565b5b6137a68254613174565b6137b18282856132c4565b6000601f8311600181146137e057600084156137ce578287015490505b6137d88582613335565b86555061384b565b601f1984166137ee87613757565b96506137f9866131a5565b60005b82811015613821578489015482556001820191506001850194506020810190506137fc565b8683101561383e578489015461383a601f891682613317565b8355505b6001600288020188555050505b5050505050505b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006040820190506138986000830185613004565b6138a56020830184613004565b9392505050565b60006138b782612ba7565b6138c1818561309a565b93506138d1818560208601612bc3565b6138da81612bed565b840191505092915050565b600060208201905081810360008301526138ff81846138ac565b905092915050565b600061391282612f70565b915061391d83612f70565b9250828203905081811260008412168282136000851215161715613944576139436134e4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061398482612f70565b915061398f83612f70565b92508261399f5761399e61394a565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156139d8576139d76134e4565b5b828205905092915050565b60006139ee82612f70565b91506139f983612f70565b925082820190508281121560008312168382126000841215161715613a2157613a206134e4565b5b92915050565b6000613a3282612af2565b9150613a3d83612af2565b9250828202613a4b81612af2565b91508282048414831517613a6257613a616134e4565b5b5092915050565b6000613a7482612af2565b9150613a7f83612af2565b925082613a8f57613a8e61394a565b5b82820490509291505056fea264697066735822122064287e733c98da2bca689f8dededcf7a2b4d3f75eff8e8c55c0aee153924ffc264736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.