Address Details
contract
0xC85d80669400Ea6a6AED0fed4b5E69810398a7eA
- Contract Name
- Legacies
- Creator
- 0xc167ec–120669 at 0xc93f64–6a6a7c
- Balance
- 0 CELO ( )
- Tokens
-
Fetching tokens...
- Transactions
- 18 Transactions
- Transfers
- 0 Transfers
- Gas Used
- 1,178,566
- Last Balance Update
- 14459250
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- Legacies
- Optimization enabled
- false
- Compiler version
- v0.8.9+commit.e5eed63a
- EVM Version
- london
- Verified at
- 2023-01-24T01:00:03.235149Z
contracts/Legacies.sol
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@chainlink/contracts/src/v0.8/KeeperCompatible.sol"; import "./TransferHelper.sol"; interface IERC20 { function balanceOf(address owner) external returns(uint256 balance); function allowance(address owner, address spender) external returns(uint256 remaining); } contract Legacies is KeeperCompatible { Legacy[] public legacies; mapping(address=>uint256) public legacyIndexes; struct Legacy { address owner; address legatee; address[] tokens; uint256 lastSeen; uint256 checkInterval; bool fulfilled; } constructor() { //Create dummy legacy to occupy index 0 create(address(0), 0); } function create(address _legatee, uint256 _checkInterval) public { uint256 _index = legacies.length; // Revert if msg.sender already has an active legacy! require(legacyIndexes[msg.sender] == 0, "Legacy exist!"); legacies.push(Legacy(msg.sender, _legatee, new address[](0), block.timestamp, _checkInterval, false)); legacyIndexes[msg.sender] = _index; } function cancel() public { uint256 _index = legacyIndexes[msg.sender]; require(legacies[_index].owner == msg.sender, "not owner!"); delete legacies[_index]; legacyIndexes[msg.sender] = 0; } function updateLegacy(address _legatee, uint256 _checkInterval) public { uint256 _index = legacyIndexes[msg.sender]; require(legacies[_index].owner == msg.sender, "not owner!"); legacies[_index].checkInterval = _checkInterval; legacies[_index].legatee = _legatee; } function updateCheckInterval(uint256 _checkInterval) public { uint256 _index = legacyIndexes[msg.sender]; require(legacies[_index].owner == msg.sender, "not owner!"); legacies[_index].checkInterval = _checkInterval; } function updateLegatee(address _legatee) public { uint256 _index = legacyIndexes[msg.sender]; require(legacies[_index].owner == msg.sender, "not owner!"); legacies[_index].legatee = _legatee; } function checkIn() public { uint256 _index = legacyIndexes[msg.sender]; require(legacies[_index].owner == msg.sender, "not owner!"); legacies[_index].lastSeen = block.timestamp; } function getLegacyTokens(uint256 _index) public view returns(address[] memory) { return legacies[_index].tokens; } function addTokens(address[] memory _tokens) public { uint256 _index = legacyIndexes[msg.sender]; for (uint256 i = 0; i < _tokens.length; i++) { IERC20 _token = IERC20(_tokens[i]); //Confirm token approval require(_token.allowance(msg.sender, address(this)) == type(uint256).max, "not approved!"); legacies[_index].tokens.push(_tokens[i]); } } function checkUpkeep(bytes calldata /* checkData */) external view override returns (bool upkeepNeeded, bytes memory performData ) { upkeepNeeded = false; //Get 10 legacies due for fulfillment for (uint256 i = 0; i < legacies.length; i++) { Legacy memory _legacy = legacies[i]; if (!_legacy.fulfilled && block.timestamp - _legacy.lastSeen > _legacy.checkInterval) { upkeepNeeded = true; performData = abi.encode(i); break; } } } function performUpkeep(bytes calldata performData ) external override { //Decode perfromData uint256 index = abi.decode(performData, (uint256)); Legacy memory _legacy = legacies[index]; //Confirm performData require(block.timestamp - _legacy.lastSeen > _legacy.checkInterval, "not due!" ); legacies[index].fulfilled = true; //Transfer tokens to legatee for (uint256 i = 0; i < _legacy.tokens.length; i++) { address _token = _legacy.tokens[i]; uint256 _allowed = IERC20(_token).allowance(_legacy.owner, address(this)); uint256 _balance = IERC20(_token).balanceOf(_legacy.owner); // Skip tokens not approved if (_allowed < _balance) { continue; } TransferHelper.safeTransferFrom( _token, _legacy.owner, _legacy.legatee, _balance ); } } }
/_chainlink/contracts/src/v0.8/AutomationBase.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract AutomationBase { error OnlySimulatedBackend(); /** * @notice method that allows it to be simulated via eth_call by checking that * the sender is the zero address. */ function preventExecution() internal view { if (tx.origin != address(0)) { revert OnlySimulatedBackend(); } } /** * @notice modifier that allows it to be simulated via eth_call by checking * that the sender is the zero address. */ modifier cannotExecute() { preventExecution(); _; } }
/_chainlink/contracts/src/v0.8/AutomationCompatible.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./AutomationBase.sol"; import "./interfaces/AutomationCompatibleInterface.sol"; abstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}
/_chainlink/contracts/src/v0.8/KeeperCompatible.sol
// SPDX-License-Identifier: MIT /** * @notice This is a deprecated interface. Please use AutomationCompatible directly. */ pragma solidity ^0.8.0; import {AutomationCompatible as KeeperCompatible} from "./AutomationCompatible.sol"; import {AutomationBase as KeeperBase} from "./AutomationBase.sol"; import {AutomationCompatibleInterface as KeeperCompatibleInterface} from "./interfaces/AutomationCompatibleInterface.sol";
/_chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface AutomationCompatibleInterface { /** * @notice method that is simulated by the keepers to see if any work actually * needs to be performed. This method does does not actually need to be * executable, and since it is only ever simulated it can consume lots of gas. * @dev To ensure that it is never called, you may want to add the * cannotExecute modifier from KeeperBase to your implementation of this * method. * @param checkData specified in the upkeep registration so it is always the * same for a registered upkeep. This can easily be broken down into specific * arguments using `abi.decode`, so multiple upkeeps can be registered on the * same contract and easily differentiated by the contract. * @return upkeepNeeded boolean to indicate whether the keeper should call * performUpkeep or not. * @return performData bytes that the keeper should call performUpkeep with, if * upkeep is needed. If you would like to encode data to decode later, try * `abi.encode`. */ function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData); /** * @notice method that is actually executed by the keepers, via the registry. * The data returned by the checkUpkeep simulation will be passed into * this method to actually be executed. * @dev The input to this method should not be trusted, and the caller of the * method should not even be restricted to any single registry. Anyone should * be able call it, and the input should be validated, there is no guarantee * that the data passed in is the performData returned from checkUpkeep. This * could happen due to malicious keepers, racing keepers, or simply a state * change while the performUpkeep transaction is waiting for confirmation. * Always validate the data passed in. * @param performData is the data which was passed back from the checkData * simulation. If it is encoded, it can easily be decoded into other types by * calling `abi.decode`. This data should not be trusted, and should be * validated against the contract's current state. */ function performUpkeep(bytes calldata performData) external; }
/contracts/TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"OnlySimulatedBackend","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addTokens","inputs":[{"type":"address[]","name":"_tokens","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancel","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"checkIn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"upkeepNeeded","internalType":"bool"},{"type":"bytes","name":"performData","internalType":"bytes"}],"name":"checkUpkeep","inputs":[{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"create","inputs":[{"type":"address","name":"_legatee","internalType":"address"},{"type":"uint256","name":"_checkInterval","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getLegacyTokens","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"legatee","internalType":"address"},{"type":"uint256","name":"lastSeen","internalType":"uint256"},{"type":"uint256","name":"checkInterval","internalType":"uint256"},{"type":"bool","name":"fulfilled","internalType":"bool"}],"name":"legacies","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"legacyIndexes","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"performUpkeep","inputs":[{"type":"bytes","name":"performData","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateCheckInterval","inputs":[{"type":"uint256","name":"_checkInterval","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateLegacy","inputs":[{"type":"address","name":"_legatee","internalType":"address"},{"type":"uint256","name":"_checkInterval","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateLegatee","inputs":[{"type":"address","name":"_legatee","internalType":"address"}]}]
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80635b63c009116100715780635b63c0091461014f5780636031b9d21461016b5780636e04ff0d1461019f578063884c53ad146101d0578063c91e78e814610200578063ea8a1af014610230576100b4565b80630ecaea73146100b9578063183ff085146100d55780631ffd0844146100df578063443e0184146100fb5780634585e33b146101175780634ae05c7d14610133575b600080fd5b6100d360048036038101906100ce91906117f2565b61023a565b005b6100dd6104bf565b005b6100f960048036038101906100f49190611832565b6105e3565b005b6101156004803603810190610110919061185f565b610708565b005b610131600480360381019061012c91906118f1565b610867565b005b61014d60048036038101906101489190611a8d565b610c43565b005b610169600480360381019061016491906117f2565b610e59565b005b61018560048036038101906101809190611832565b610fe3565b604051610196959493929190611b0f565b60405180910390f35b6101b960048036038101906101b491906118f1565b611076565b6040516101c7929190611bea565b60405180910390f35b6101ea60048036038101906101e5919061185f565b611298565b6040516101f79190611c1a565b60405180910390f35b61021a60048036038101906102159190611832565b6112b0565b6040516102279190611cf3565b60405180910390f35b610238611363565b005b6000808054905090506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146102c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102bc90611d72565b60405180910390fd5b60006040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff8111156103255761032461194f565b5b6040519080825280602002602001820160405280156103535781602001602082028036833780820191505090505b50815260200142815260200184815260200160001515815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201908051906020019061043f929190611682565b50606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff021916908315150217905550505080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff166000828154811061052e5761052d611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ad90611e0d565b60405180910390fd5b42600082815481106105cb576105ca611d92565b5b90600052602060002090600602016003018190555050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff166000828154811061065257610651611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d190611e0d565b60405180910390fd5b81600082815481106106ef576106ee611d92565b5b9060005260206000209060060201600401819055505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff166000828154811061077757610776611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690611e0d565b60405180910390fd5b816000828154811061081457610813611d92565b5b906000526020600020906006020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082828101906108789190611832565b9050600080828154811061088f5761088e611d92565b5b90600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282018054806020026020016040519081016040528092919081815260200182805480156109d957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161098f575b5050505050815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff16151515158152505090508060800151816060015142610a289190611e5c565b11610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f90611edc565b60405180910390fd5b600160008381548110610a7e57610a7d611d92565b5b906000526020600020906006020160050160006101000a81548160ff02191690831515021790555060005b816040015151811015610c3c57600082604001518281518110610acf57610ace611d92565b5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8560000151306040518363ffffffff1660e01b8152600401610b1a929190611efc565b602060405180830381600087803b158015610b3457600080fd5b505af1158015610b48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6c9190611f3a565b905060008273ffffffffffffffffffffffffffffffffffffffff166370a0823186600001516040518263ffffffff1660e01b8152600401610bad9190611f67565b602060405180830381600087803b158015610bc757600080fd5b505af1158015610bdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bff9190611f3a565b905080821015610c1157505050610c29565b610c25838660000151876020015184611549565b5050505b8080610c3490611f82565b915050610aa9565b5050505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8251811015610e54576000838281518110610ca857610ca7611d92565b5b602002602001015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401610d0e929190611efc565b602060405180830381600087803b158015610d2857600080fd5b505af1158015610d3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d609190611f3a565b14610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790612017565b60405180910390fd5b60008381548110610db457610db3611d92565b5b9060005260206000209060060201600201848381518110610dd857610dd7611d92565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080610e4c90611f82565b915050610c8a565b505050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660008281548110610ec857610ec7611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790611e0d565b60405180910390fd5b8160008281548110610f6557610f64611d92565b5b9060005260206000209060060201600401819055508260008281548110610f8f57610f8e611d92565b5b906000526020600020906006020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60008181548110610ff357600080fd5b90600052602060002090600602016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050160009054906101000a900460ff16905085565b600060606000915060005b6000805490508110156112905760008082815481106110a3576110a2611d92565b5b90600052602060002090600602016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282018054806020026020016040519081016040528092919081815260200182805480156111ed57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111a3575b5050505050815260200160038201548152602001600482015481526020016005820160009054906101000a900460ff16151515158152505090508060a0015115801561124b575080608001518160600151426112499190611e5c565b115b1561127c5760019350816040516020016112659190611c1a565b604051602081830303815290604052925050611290565b50808061128890611f82565b915050611081565b509250929050565b60016020528060005260406000206000915090505481565b6060600082815481106112c6576112c5611d92565b5b906000526020600020906006020160020180548060200260200160405190810160405280929190818152602001828054801561135757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161130d575b50505050509050919050565b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff16600082815481106113d2576113d1611d92565b5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145190611e0d565b60405180910390fd5b6000818154811061146e5761146d611d92565b5b9060005260206000209060060201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160006114db919061170c565b600382016000905560048201600090556005820160006101000a81549060ff021916905550506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161157d93929190612037565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516115cb91906120aa565b6000604051808303816000865af19150503d8060008114611608576040519150601f19603f3d011682016040523d82523d6000602084013e61160d565b606091505b509150915081801561163b575060008151148061163a57508080602001905181019061163991906120ed565b5b5b61167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061218c565b60405180910390fd5b505050505050565b8280548282559060005260206000209081019282156116fb579160200282015b828111156116fa5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906116a2565b5b509050611708919061172d565b5090565b508054600082559060005260206000209081019061172a919061172d565b50565b5b8082111561174657600081600090555060010161172e565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117898261175e565b9050919050565b6117998161177e565b81146117a457600080fd5b50565b6000813590506117b681611790565b92915050565b6000819050919050565b6117cf816117bc565b81146117da57600080fd5b50565b6000813590506117ec816117c6565b92915050565b6000806040838503121561180957611808611754565b5b6000611817858286016117a7565b9250506020611828858286016117dd565b9150509250929050565b60006020828403121561184857611847611754565b5b6000611856848285016117dd565b91505092915050565b60006020828403121561187557611874611754565b5b6000611883848285016117a7565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126118b1576118b061188c565b5b8235905067ffffffffffffffff8111156118ce576118cd611891565b5b6020830191508360018202830111156118ea576118e9611896565b5b9250929050565b6000806020838503121561190857611907611754565b5b600083013567ffffffffffffffff81111561192657611925611759565b5b6119328582860161189b565b92509250509250929050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6119878261193e565b810181811067ffffffffffffffff821117156119a6576119a561194f565b5b80604052505050565b60006119b961174a565b90506119c5828261197e565b919050565b600067ffffffffffffffff8211156119e5576119e461194f565b5b602082029050602081019050919050565b6000611a09611a04846119ca565b6119af565b90508083825260208201905060208402830185811115611a2c57611a2b611896565b5b835b81811015611a555780611a4188826117a7565b845260208401935050602081019050611a2e565b5050509392505050565b600082601f830112611a7457611a7361188c565b5b8135611a848482602086016119f6565b91505092915050565b600060208284031215611aa357611aa2611754565b5b600082013567ffffffffffffffff811115611ac157611ac0611759565b5b611acd84828501611a5f565b91505092915050565b611adf8161177e565b82525050565b611aee816117bc565b82525050565b60008115159050919050565b611b0981611af4565b82525050565b600060a082019050611b246000830188611ad6565b611b316020830187611ad6565b611b3e6040830186611ae5565b611b4b6060830185611ae5565b611b586080830184611b00565b9695505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611b9c578082015181840152602081019050611b81565b83811115611bab576000848401525b50505050565b6000611bbc82611b62565b611bc68185611b6d565b9350611bd6818560208601611b7e565b611bdf8161193e565b840191505092915050565b6000604082019050611bff6000830185611b00565b8181036020830152611c118184611bb1565b90509392505050565b6000602082019050611c2f6000830184611ae5565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611c6a8161177e565b82525050565b6000611c7c8383611c61565b60208301905092915050565b6000602082019050919050565b6000611ca082611c35565b611caa8185611c40565b9350611cb583611c51565b8060005b83811015611ce6578151611ccd8882611c70565b9750611cd883611c88565b925050600181019050611cb9565b5085935050505092915050565b60006020820190508181036000830152611d0d8184611c95565b905092915050565b600082825260208201905092915050565b7f4c65676163792065786973742100000000000000000000000000000000000000600082015250565b6000611d5c600d83611d15565b9150611d6782611d26565b602082019050919050565b60006020820190508181036000830152611d8b81611d4f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f6e6f74206f776e65722100000000000000000000000000000000000000000000600082015250565b6000611df7600a83611d15565b9150611e0282611dc1565b602082019050919050565b60006020820190508181036000830152611e2681611dea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611e67826117bc565b9150611e72836117bc565b925082821015611e8557611e84611e2d565b5b828203905092915050565b7f6e6f742064756521000000000000000000000000000000000000000000000000600082015250565b6000611ec6600883611d15565b9150611ed182611e90565b602082019050919050565b60006020820190508181036000830152611ef581611eb9565b9050919050565b6000604082019050611f116000830185611ad6565b611f1e6020830184611ad6565b9392505050565b600081519050611f34816117c6565b92915050565b600060208284031215611f5057611f4f611754565b5b6000611f5e84828501611f25565b91505092915050565b6000602082019050611f7c6000830184611ad6565b92915050565b6000611f8d826117bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611fc057611fbf611e2d565b5b600182019050919050565b7f6e6f7420617070726f7665642100000000000000000000000000000000000000600082015250565b6000612001600d83611d15565b915061200c82611fcb565b602082019050919050565b6000602082019050818103600083015261203081611ff4565b9050919050565b600060608201905061204c6000830186611ad6565b6120596020830185611ad6565b6120666040830184611ae5565b949350505050565b600081905092915050565b600061208482611b62565b61208e818561206e565b935061209e818560208601611b7e565b80840191505092915050565b60006120b68284612079565b915081905092915050565b6120ca81611af4565b81146120d557600080fd5b50565b6000815190506120e7816120c1565b92915050565b60006020828403121561210357612102611754565b5b6000612111848285016120d8565b91505092915050565b7f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260008201527f616e7366657246726f6d206661696c6564000000000000000000000000000000602082015250565b6000612176603183611d15565b91506121818261211a565b604082019050919050565b600060208201905081810360008301526121a581612169565b905091905056fea26469706673582212201a7dab81aab52f5b0def81e816f92923c5eca667c56eb90b0ad92f906369c75764736f6c63430008090033