Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 19 from a total of 19 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Web2Wallet Take ... | 7708919 | 8 days ago | IN | 0 S | 0.00325685 | ||||
Web3Wallet Give ... | 7708911 | 8 days ago | IN | 0 S | 0.00456847 | ||||
Delete Personal ... | 7707939 | 8 days ago | IN | 0 S | 0.00196685 | ||||
Web2Wallet Take ... | 7706998 | 8 days ago | IN | 0 S | 0.00325685 | ||||
Web3Wallet Give ... | 7706989 | 8 days ago | IN | 0 S | 0.00456847 | ||||
Delete Personal ... | 7706042 | 8 days ago | IN | 0 S | 0.00282185 | ||||
Web2Wallet Take ... | 7703875 | 8 days ago | IN | 0 S | 0.00226185 | ||||
Web3Wallet Give ... | 7703863 | 8 days ago | IN | 0 S | 0.00243133 | ||||
Web2Wallet Take ... | 7703323 | 8 days ago | IN | 0 S | 0.00326436 | ||||
Web3Wallet Give ... | 7703314 | 8 days ago | IN | 0 S | 0.0045693 | ||||
Infuse Lings To ... | 7699454 | 8 days ago | IN | 0 S | 0.00766725 | ||||
Infuse Lings To ... | 7698246 | 8 days ago | IN | 0 S | 0.00789125 | ||||
Swap UID_Relayer... | 7375359 | 10 days ago | IN | 0 S | 0.0034417 | ||||
Web2Wallet Take ... | 7375344 | 10 days ago | IN | 0 S | 0.00325685 | ||||
Web3Wallet Give ... | 7375339 | 10 days ago | IN | 0 S | 0.00473373 | ||||
Update ITEM Cont... | 7123734 | 12 days ago | IN | 0 S | 0.00254001 | ||||
Update Lings NFT... | 7123717 | 12 days ago | IN | 0 S | 0.00253874 | ||||
Update RAM Contr... | 7123702 | 12 days ago | IN | 0 S | 0.00254012 | ||||
Update Storage C... | 7123683 | 12 days ago | IN | 0 S | 0.00254122 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
InfuseSummonTransferV1
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-09 */ // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: FINALdeployFA/LIB - Common Structs.sol pragma solidity ^0.8.9; library S { //Pet struct struct Unit { uint hp; //unit fainted when hp <= 0 uint attack; //attack - defense = damage on hp uint defense; //attack - defense = damage on hp uint speed; //how frequent to take a move uint intelligence; //how frequent to use skill uint genestrength; //depends on how many duplicates uint range; //range skill, id uint special; //special skill, id } struct Status { uint id; //unit id uint family; //determine which class of gear it can be wore. record while evolve, since its only has max 2 family, example Dragon+phantom, and 30gene max, so can use *100 uint stage; //1 is rookie, 2 is mature, 3 is perfect } struct Time { uint bond; //how many time you took on this unit , use to evolve uint stamina; //how much you can train it per day. it should follow saturation graph uint hunger; //how much you feed it per day. it should follow saturation graph } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: FINALdeployFA/INTERFACE - StorageV2.sol pragma solidity ^0.8.20; // Import your custom structs /** * @title IFARPG_Storage * @dev Interface for FARPG_Storage so other contracts can call it */ interface IFARPG_Storage { //------------------------------------------------------------------------- // Administrative / Master Contract Access //------------------------------------------------------------------------- function owner() external view returns (address); function masterContracts(uint index) external view returns (address); function masterIndex(address) external view returns (uint); function addMasterContract(address _address, uint _index) external; function addMasterContractBatch(address[] memory _addresses, uint[] memory _indices) external; function removeMasterContract(uint _index) external; function getAllMasterContracts() external view returns (address[] memory, uint[] memory); //------------------------------------------------------------------------- // UID Management //------------------------------------------------------------------------- function UIDmain(address) external view returns (uint); function UID_ownedby(uint) external view returns (address); function UIDcounter() external view returns (uint); function getUID(address player) external view returns (uint _UID); function transferUID(address player, address newplayerwallet) external; function registerUID(address player) external; function setUIDmain (address playerAddress, uint UID) external; function setUID_ownedby (uint UID, address playerAddress) external; //------------------------------------------------------------------------- // Quest (setters) //------------------------------------------------------------------------- function setMainQuest(address player, uint index, uint8 progress) external; function setSideQuest(address player, uint index, uint8 progress) external; function setPremiumScore(address player, uint score) external; function setPlayerGeneStrength(address player, uint index, uint strength) external; function setPlayerVitamin(address player, uint index, uint amount) external; //------------------------------------------------------------------------- // Quest (getters) //------------------------------------------------------------------------- function getMainQuestProgress(address player, uint index) external view returns (uint8); function getSideQuestProgress(address player, uint index) external view returns (uint8); function getPremiumScore(address player) external view returns (uint); function getPlayerQuestAndScore(address player, uint index) external view returns (uint, uint, uint); function getMainQuestProgressArray(address player) external view returns (uint8[64] memory); function getSideQuestProgressArray(address player) external view returns (uint8[64] memory); //------------------------------------------------------------------------- // Player Stats (setters) //------------------------------------------------------------------------- function setPersonalWallet(address player, address personal) external; function setGiveControlTo(address player, address web2wallet) external; function setExp(address player, uint experience) external; function setRankScore(address player, uint score) external; function setEnergy1(address player, uint energy) external; function setEnergy2(address player, uint energy) external; function setEnergy22(address player, uint energy) external; function setEnergy3(address player, uint energy) external; function setTeamFormat(address player, uint[60] calldata format) external; function setUsernameToUID(string memory username, uint _UID) external; function setUIDToUsername(uint _UID, string memory username) external; function deleteUsernameToAddress (string memory username) external; // Points function setPoint1(address player, uint point) external; function setPoint2(address player, uint point) external; function setPoint3(address player, uint point) external; function setPoint4(address player, uint point) external; function setPoint5(address player, uint point) external; function addPoint1(address player, uint point) external; function addPoint2(address player, uint point) external; function addPoint3(address player, uint point) external; function addPoint4(address player, uint point) external; function addPoint5(address player, uint point) external; //------------------------------------------------------------------------- // Player Stats (getters) //------------------------------------------------------------------------- function personalwallet(address) external view returns (address); function givecontrolto(address) external view returns (address); function getExperience(address player) external view returns (uint); function getRankingScore(address player) external view returns (uint); function getEnergy1(address player) external view returns (uint); function getEnergy2(address player) external view returns (uint); function getEnergy22(address player) external view returns (uint); function getEnergy3(address player) external view returns (uint); function getPlayerStats(address player) external view returns (uint, uint, uint, uint, uint, uint); function UIDToUsername(uint) external view returns (string memory); function usernameToUID(string memory) external view returns (uint); function getPoint1(address player) external view returns (uint); function getPoint2(address player) external view returns (uint); function getPoint3(address player) external view returns (uint); function getPoint4(address player) external view returns (uint); function getPoint5(address player) external view returns (uint); function getPlayerPoints(address player) external view returns (uint, uint, uint, uint, uint); function getPlayergenestrengthArray(address player) external view returns (uint[50] memory); function getPlayerGeneStrength(address player, uint index) external view returns (uint); function getPlayervitaminArray(address player) external view returns (uint[50] memory); function getPlayerVitamin(address player, uint index) external view returns (uint); //------------------------------------------------------------------------- // Limits (setters) //------------------------------------------------------------------------- function setLimit1(address player, uint limit) external; function setLimit2(address player, uint limit) external; function setLimit3(address player, uint limit) external; function setTimebound1(address player, uint timestamp) external; function setTimebound2(address player, uint timestamp) external; function setTimebound3(address player, uint timestamp) external; //------------------------------------------------------------------------- // Limits (getters) //------------------------------------------------------------------------- function getLimit1(address player) external view returns (uint); function getLimit2(address player) external view returns (uint); function getLimit3(address player) external view returns (uint); function getTimebound1(address player) external view returns (uint); function getTimebound2(address player) external view returns (uint); function getTimebound3(address player) external view returns (uint); function getPlayerLimits(address player) external view returns (uint, uint, uint, uint, uint, uint); //------------------------------------------------------------------------- // Numberset (setters) //------------------------------------------------------------------------- function setNumberSet1(address player, uint[6] memory number) external; function setNumberSet2(address player, uint[5] memory number) external; function setNumberSet3(address player, uint[5] memory number) external; function setNumberSet4(address player, uint[5] memory number) external; function setNumberSet5(address player, uint[5] memory number) external; function setNumberSet6(address player, uint[5] memory number) external; function setNumberSet7(address player, uint[5] memory number) external; function setNumberSet8(address player, uint[5] memory number) external; function setNumberSet9(address player, uint[5] memory number) external; function setNumberSetA(address player, uint[5] memory number) external; function setNumberSetB(address player, uint[5] memory number) external; function setNumberSetC(address player, uint[5] memory number) external; function setNumberSetD(address player, uint[5] memory number) external; function setNumberSetE(address player, uint[10] memory number) external; function setNumberSetF(address player, uint[10] memory number) external; function setNumberSetG(address player, uint[10] memory number) external; function setNumberSetH(address player, uint[10] memory number) external; //------------------------------------------------------------------------- // Numberset (getters) //------------------------------------------------------------------------- function getNumberSet1(address player) external view returns (uint[6] memory); function getNumberSet2(address player) external view returns (uint[5] memory); function getNumberSet3(address player) external view returns (uint[5] memory); function getNumberSet4(address player) external view returns (uint[5] memory); function getNumberSet5(address player) external view returns (uint[5] memory); function getNumberSet6(address player) external view returns (uint[5] memory); function getNumberSet7(address player) external view returns (uint[5] memory); function getNumberSet8(address player) external view returns (uint[5] memory); function getNumberSet9(address player) external view returns (uint[5] memory); function getNumberSetA(address player) external view returns (uint[5] memory); function getNumberSetB(address player) external view returns (uint[5] memory); function getNumberSetC(address player) external view returns (uint[5] memory); function getNumberSetD(address player) external view returns (uint[5] memory); function getNumberSetE(address player) external view returns (uint[10] memory); function getNumberSetF(address player) external view returns (uint[10] memory); function getNumberSetG(address player) external view returns (uint[10] memory); function getNumberSetH(address player) external view returns (uint[10] memory); //------------------------------------------------------------------------- // PVP Ranks //------------------------------------------------------------------------- struct Player { uint256 rankPoints; uint256 league; uint256 indexInLeague; // Index of the player within their league array } function setPlayers(address player, Player memory rankpointleagueindexinleague) external; function setReset_Time_Attempts(address player, uint[2] memory resettimeattemps) external; function setEligible_Opponents(address player, address[5] memory eligibleOppo) external; function setFaught_Opponents(address player, uint[5] memory faughtOppo) external; function setDefending_Formation(address player, uint[3] memory defendingslot) external; function getPlayers(address player) external view returns (Player memory ) ; function getReset_Time_Attempts(address player ) external view returns (uint[2] memory ); function getEligible_Opponents(address player ) external view returns (address[5] memory); function getFaught_Opponents(address player ) external view returns(uint[5] memory) ; function getDefending_Formation(address player) external view returns (uint[3] memory ); //------------------------------------------------------------------------- // Pet data (setters) //------------------------------------------------------------------------- function setPetUnits(address player, uint index, S.Unit memory newUnit) external; function setPetUnitsMaxVitamined(address player, uint index, S.Unit memory newUnit) external; function setPetStatuses(address player, uint index, S.Status memory newStatus) external; function setPetTimes(address player, uint index, S.Time memory newTime) external; //------------------------------------------------------------------------- // Pet data (getters) //------------------------------------------------------------------------- function getPetUnitsAll(address player) external view returns (S.Unit[500] memory); function getPetUnits(address player, uint _index) external view returns (S.Unit memory); function getPetUnitsMaxVitaminedAll(address player) external view returns (S.Unit[500] memory); function getPetUnitsMaxVitamined(address player, uint _index) external view returns (S.Unit memory); function getPetStatusesAll(address player) external view returns (S.Status[500] memory); function getPetStatuses(address player, uint _index) external view returns (S.Status memory); function getPetTimesAll(address player) external view returns (S.Time[500] memory); function getPetTimes(address player, uint _index) external view returns (S.Time memory); //------------------------------------------------------------------------- // Party / Outfit //------------------------------------------------------------------------- function setPartyFormation(address player, uint[30] memory slots) external; function setTrainerOutfitPosition(address player, uint[150] memory outfitIds) external; function getPartyFormation(address player) external view returns (uint[30] memory); function getAllOutfits(address player) external view returns (uint[150] memory); //------------------------------------------------------------------------- // Trainer Gene Infusing //------------------------------------------------------------------------- function setTrainerGeneInfusingGene(address player, uint index, uint value) external; function setTrainerGeneInfusingGeneAll(address player, uint[50] memory newData) external; function setTrainerGeneInfusingTimer(address player, uint index, uint value) external; function setTrainerGeneInfusingTimerAll(address player, uint[50] memory newData) external; function getTrainerGeneInfusingGeneAll(address player) external view returns (uint[50] memory) ; function getTrainerGeneInfusingTimerAll(address player) external view returns (uint[50] memory); function getTrainerGeneInfusingGene(address player, uint Index)external view returns (uint ) ; function getTrainerGeneInfusingTimer(address player, uint Index)external view returns (uint ); //------------------------------------------------------------------------- // Additional Utility //------------------------------------------------------------------------- function getBattleUnit3(address player, uint[3] calldata slots) external view returns (S.Unit[3] memory Units3, uint[3] memory UnitIds); function getSlotUnitMore(address player, uint startindex, uint stopindex) external view returns (S.Unit[] memory Units, uint[] memory UnitIds); function getTeamFormat(address _addr) external view returns (uint[60] memory); //------------------------------------------------------------------------- // Weather System //------------------------------------------------------------------------- function getWeatherUnity() external view returns (uint _weather, uint _daylight, uint _blocktime); function getWeatherBattle(uint _timenow) external view returns (uint _weather); function setWeatherConstants(uint[12] memory _weatherIndices) external; function getWeatherIndexConstants() external view returns (uint[] memory); } // File: FINALdeployFA/PUBLIC - InfuseSummonTransferV1.sol pragma solidity ^0.8.19; //_______________________________________________________________ // ___ __ __ _ ___ _ ___ _ __ // | _ )\ \ / / _ | | / _ \ _ | | / _ \ (_)\ \ // | _ \ \ V / | || || (_) || || || (_) | _ | | // |___/ |_| \__/ \___/ \__/ \___/ ( ) | | // |/ /_/ //_______________________________________________________________ // Interface for accessing Storage //------------------------------------------------------------------- // _____ _ _ _______ ______ _____ ______ _____ ______ // |_ _| \ | |__ __| ____| __ \| ____/\ / ____| ____| // | | | \| | | | | |__ | |__) | |__ / \ | | | |__ // | | | . ` | | | | __| | _ /| __/ /\ \| | | __| // _| |_| |\ | | | | |____| | \ \| | / ____ \ |____| |____ // |_____|_| \_| |_| |______|_| \_\_|/_/ \_\_____|______| // //------------------------------------------------------------------- interface FARPG_RAMInterface { // Read functions function genetoid_mapping(uint trainergene) external pure returns (uint); function petunitsmax(uint id) external pure returns (S.Unit calldata); function petunitsevolveid(S.Status calldata _status, uint _trainergene, uint _exp, uint _hash) external pure returns (S.Status calldata); function transformIDtoStageFamily(uint _id) external pure returns (S.Status memory unitstatus); function summonStage3RangeSkill(uint _id_transformed) external pure returns (uint ranged); } interface IFARPGItemsToken { function mint( uint _amount, address _to, uint _id) external; function burn(address owner, uint _id, uint _amount) external; function balanceOf(address account, uint256 id) external view returns (uint256); } interface IFARPGLingsNFTToken { function mint( uint _amount, address _to, uint _id) external; function burn(address owner, uint _id, uint _amount) external; function balanceOf(address account, uint256 id) external view returns (uint256); } //-------*************************************************----------- contract InfuseSummonTransferV1 is Ownable, ReentrancyGuard { IFARPG_Storage public contractStorage; FARPG_RAMInterface public contractRAM; IFARPGItemsToken public contractITEMS; IFARPGLingsNFTToken public contractLingsNFT; constructor() { } event StatChangedResult(S.Unit AfterUnit, S.Status AfterStatus, S.Time AfterTime); //------------------------------------------------------------------- // _____ _ ____ ____ _ __ __ // / ____| | / __ \| _ \ /\ | | \ \ / / // | | __| | | | | | |_) | / \ | | \ \ / / // | | |_ | | | | | | _ < / /\ \ | | \ \/ / // | |__| | |___| |__| | |_) / ____ \| |____ \ / _ // \_____|______\____/|____/_/ \_\______| \/ (_) // //------------------------------------------------------------------- mapping (address => uint) private reentrant_time; uint constant TIME_INITIALSTAMINA = 24 hours; //initial stamina uint constant TIME_INITIALENDURANCE = 3 hours; //initial endurance/hunger //--------------------------------------------------------- // _____ __ __ _____ _ _ // /\ | __ \| \/ |_ _| \ | | // / \ | | | | \ / | | | | \| | // / /\ \ | | | | |\/| | | | | . ` | // / ____ \| |__| | | | |_| |_| |\ | // /_/ \_\_____/|_| |_|_____|_| \_| // //--------------------------------------------------------- function updateStorageContractAAddress(address _newContractAAddress) external onlyOwner { require(_newContractAAddress != address(0), "Invalid address"); contractStorage = IFARPG_Storage(_newContractAAddress); } function updateRAMContractAAddress(address _newContractAAddress) external onlyOwner { require(_newContractAAddress != address(0), "Invalid address"); contractRAM = FARPG_RAMInterface(_newContractAAddress); } function updateITEMContractAAddress(address _newContractAAddress) external onlyOwner { require(_newContractAAddress != address(0), "Invalid address"); contractITEMS = IFARPGItemsToken(_newContractAAddress); } function updateLingsNFTContractAAddress(address _newContractAAddress) external onlyOwner { require(_newContractAAddress != address(0), "Invalid address"); contractLingsNFT = IFARPGLingsNFTToken(_newContractAAddress); } function withdraw() external onlyOwner { // Function to withdraw all balance from the contract for revenue require(address(this).balance > 0, "Contract balance is zero"); payable(msg.sender).transfer(address(this).balance); } uint UNLOCKPERIOD = 1 minutes; //1 min for testing will be 25 hours function changeTrainerUnlockPeriod (uint _seconds) external onlyOwner { UNLOCKPERIOD = _seconds; } //--------------------------------------------------------- // // _____ _______ _____ _______ // / ____|__ __|/\ | __ \__ __| // | (___ | | / \ | |__) | | | // \___ \ | | / /\ \ | _ / | | // ____) | | |/ ____ \| | \ \ | | // |_____/ |_/_/ \_\_| \_\ |_| // //--------------------------------------------------------- function noneReentrant_time(address player, uint timeSeconds) internal { //this is to prevent player spam an action or botting effectively. //this function must be Internal otherwise, it will congest a player reentrant time to make him/her unplayable require(block.timestamp - reentrant_time[player] >= timeSeconds,"Non-Reentrant, slow down TX attempts."); reentrant_time[player] = block.timestamp; } function accountAddressToProceed() public view returns (address) { // Ready for account abstraction // If the player doesn't provide a personal wallet, all data will be recorded in the trainer wallet address playerAddress = contractStorage.personalwallet(msg.sender); if (playerAddress == address(0)) { return msg.sender; } else { return playerAddress; } } //--------------------------------------------------------- function SummonLingsFromNFT (uint NFT_ID, uint _slot) public nonReentrant { address playerAddress = accountAddressToProceed(); noneReentrant_time(playerAddress , 2); //confirm the choosing slot is empty and available uint limit2 = contractStorage.getLimit2(playerAddress); //limit2 is slot limit require(_slot < limit2, "Chosen slot exceeds limit."); S.Status memory _petstatus = contractStorage.getPetStatuses(playerAddress, _slot); require(_petstatus.id == 0, "Chosen slot is occupied."); //Confirm player has the NFT require(contractLingsNFT.balanceOf(playerAddress,NFT_ID) >= 1, "Lings NFT not find. You dont have this NFT."); contractLingsNFT.burn(playerAddress, NFT_ID, 1); //after Consume the NFT Summon a new Lings for it S.Unit memory _petunit = S.Unit({ hp: 1000, attack: 100, defense: 50, speed: 100, intelligence: 100, genestrength: 1, range: contractRAM.summonStage3RangeSkill(NFT_ID), special:0}); _petstatus = contractRAM.transformIDtoStageFamily(NFT_ID); if (_petstatus.stage == 3) { _petunit.special = NFT_ID; } S.Time memory _pettime = S.Time({bond: 0, stamina: block.timestamp - TIME_INITIALSTAMINA, hunger: block.timestamp + TIME_INITIALENDURANCE}); contractStorage.setPetUnits(playerAddress, _slot ,_petunit); contractStorage.setPetStatuses(playerAddress,_slot , _petstatus); contractStorage.setPetTimes(playerAddress, _slot ,_pettime); contractStorage.setPetUnitsMaxVitamined(playerAddress, _slot ,contractRAM.petunitsmax(_petstatus.id)); //***//** evolve set bit based on ID/////////////// // Function to set the bit corresponding to the ID uint GENEbit = contractStorage.getPoint2(playerAddress); // Set the bit at the position corresponding to ID GENEbit |= (1 << (_petstatus.id%10000)); contractStorage.setPoint2(playerAddress,GENEbit); emit StatChangedResult(_petunit,_petstatus,_pettime); } //WARN the user that Stats will be reset. function InfuseLingsToNFT (uint _slot, uint _genestrength) public nonReentrant { address playerAddress = accountAddressToProceed(); noneReentrant_time(playerAddress , 2); S.Status memory _petstatus = contractStorage.getPetStatuses(playerAddress, _slot); require(_petstatus.id > 0, "empty slot, nothing to infuse"); S.Unit memory _petunits = contractStorage.getPetUnits(playerAddress, _slot); require(_petunits.genestrength >= _genestrength, "not enough genestrength to infuse"); S.Unit memory emptypetunits; S.Status memory emptypetstatus; S.Time memory emptypettime; if (_petunits.genestrength == _genestrength ) { //infused all! Empty the slot //empty all storage of that slot contractStorage.setPetUnits(playerAddress, _slot ,emptypetunits); contractStorage.setPetStatuses(playerAddress,_slot , emptypetstatus); contractStorage.setPetTimes(playerAddress, _slot ,emptypettime); contractStorage.setPetUnitsMaxVitamined(playerAddress, _slot ,emptypetunits); //mint according to genestrength contractLingsNFT.mint(_genestrength, playerAddress, _petstatus.id); } else { // at least 1 genestrength left, no need empty slot //update new genestrength at storage _petunits.genestrength -= _genestrength; contractStorage.setPetUnits(playerAddress, _slot ,_petunits); //mint according to genestrength contractLingsNFT.mint(_genestrength, playerAddress, _petstatus.id); } } function InfuseTrainersToNFT (uint _TrainerID, uint _genestrength) public nonReentrant { address playerAddress = accountAddressToProceed(); noneReentrant_time(playerAddress , 2); require (_TrainerID < 40, "invalid trainerID"); require (_genestrength >= 1, "0 input, nothing to infuse."); //check if the player really have the genestrength to infused uint TrainerGeneStr = contractStorage.getPlayerGeneStrength(playerAddress,_TrainerID); if (_TrainerID == 0) { //Jojo given 1 free per UID, so cannot infused require(TrainerGeneStr >= _genestrength+1, "not enough genestrength to infuse"); } else { require(TrainerGeneStr >= _genestrength, "not enough genestrength to infuse"); } //take away the genestrength contractStorage.setPlayerGeneStrength(playerAddress, _TrainerID, TrainerGeneStr -= _genestrength); //and locked them for 25 hours uint lockingGene = contractStorage.getTrainerGeneInfusingGene(playerAddress, _TrainerID); contractStorage.setTrainerGeneInfusingGene(playerAddress,_TrainerID,lockingGene+_genestrength); contractStorage.setTrainerGeneInfusingTimer(playerAddress,_TrainerID,block.timestamp); } function ClaimTrainerNFT (uint claimTrainersID) public nonReentrant { address playerAddress = accountAddressToProceed(); noneReentrant_time(playerAddress , 2); uint TimeLocked = contractStorage.getTrainerGeneInfusingTimer(playerAddress,claimTrainersID); require(block.timestamp >= TimeLocked + UNLOCKPERIOD, "Still unlocking"); //passed require means the trainer ID has unlock! //make sure there is locking gene uint lockingGene = contractStorage.getTrainerGeneInfusingGene(playerAddress, claimTrainersID); require(lockingGene > 0,"No gene is locking.."); //pass both, meet criteria //reset the timer and locking gene! contractStorage.setTrainerGeneInfusingGene(playerAddress,claimTrainersID,0); contractStorage.setTrainerGeneInfusingTimer(playerAddress,claimTrainersID,0); //mint trainer nft to the player as successful claim uint ItemID; //need to remapping trainer ID to item ID. (based on mapping, always + 201) ItemID = claimTrainersID + 201; contractITEMS.mint(lockingGene, playerAddress, ItemID); } function GainLingsStrength (uint _slot, uint _Gainquantity) public nonReentrant { address playerAddress = accountAddressToProceed(); noneReentrant_time(playerAddress , 2); //LingNFT ID = Ling ID //confirm the choosing slot is empty and available uint limit2 = contractStorage.getLimit2(playerAddress); //limit2 is slot limit require(_slot < limit2, "Chosen slot exceeds limit."); S.Status memory _petstatus = contractStorage.getPetStatuses(playerAddress, _slot); require(_petstatus.id > 0, "empty slot, nothing to gain"); S.Unit memory _petunits = contractStorage.getPetUnits(playerAddress, _slot); require(_petunits.genestrength >= 1, "not genestrength to top up, empty slot?"); //Confirm player has the NFT require(contractLingsNFT.balanceOf(playerAddress,_petstatus.id ) >= _Gainquantity, "Lings NFT not enough. Check Lings ID"); contractLingsNFT.burn(playerAddress, _petstatus.id, _Gainquantity); //after Consume the NFT, add the genestr on the Ling _petunits.genestrength += _Gainquantity; contractStorage.setPetUnits(playerAddress, _slot ,_petunits); } function GainTrainersStrength (uint TrainerID, uint _Gainquantity) public nonReentrant { //storage Index for trainer //trainer gene ID //Jojo 0 //Michael 1 //Klue 2 //Emo 3 //so on... address playerAddress = accountAddressToProceed(); noneReentrant_time(playerAddress , 2); uint TrainerNFTID = TrainerID + 201; //remapping storage trainerID to trainerNFTID at item //Confirm player has the trainer item NFT require(contractITEMS.balanceOf(playerAddress,TrainerNFTID) >= _Gainquantity, "Trainer Item NFT not enough. Check trainer ID"); //consume it contractITEMS.burn(playerAddress, TrainerNFTID, _Gainquantity); //take away the genestrength uint trainergenestrengthnow = contractStorage.getPlayerGeneStrength(playerAddress, TrainerID); contractStorage.setPlayerGeneStrength(playerAddress, TrainerID, trainergenestrengthnow+_Gainquantity); } function viewForUnityTrainerInfuse () public view returns(uint[50] memory infusingGENE, uint[50] memory infusingStartTime , uint cooldownLimit){ address playerAddress = accountAddressToProceed(); infusingGENE = contractStorage.getTrainerGeneInfusingGeneAll(playerAddress); infusingStartTime = contractStorage.getTrainerGeneInfusingTimerAll(playerAddress); cooldownLimit = UNLOCKPERIOD; } function TransferUID_ACCOUNT (address to_new_address) public nonReentrant { require(contractStorage.UIDmain(to_new_address) == 0, "New Address has already linked to an UID."); address OldAddress = msg.sender; uint transferingUID = contractStorage.UIDmain(OldAddress); require(transferingUID != 0, "Existing address has no UID..."); contractStorage.transferUID(OldAddress,to_new_address); } //----- setup PersonalWallet ---> link Web2 wallet --------- function web3WalletGivePermissionToWeb2Wallet(address web2wallet) public nonReentrant { address web3wallet = msg.sender; noneReentrant_time(web3wallet , 1); contractStorage.setGiveControlTo(web3wallet,web2wallet); } function web2WalletTakeControlOfWeb3Wallet(address web3wallet) public nonReentrant { //get permitted address from the web3 address noneReentrant_time(web3wallet , 1); address permittedAddress = contractStorage.givecontrolto(web3wallet); address web2wallet = msg.sender; require(permittedAddress == web2wallet, "you are not permitted to control this web3wallet."); //if you are permitted then set to your control contractStorage.setPersonalWallet(web2wallet,web3wallet); } //--------- SWAP UID if already talking control (optional) ------------- event UIDSwapped(address indexed relayerWallet, address indexed personalWallet, uint relayerUID, uint personalUID); function swapUID_RelayeredtoPersonal() external nonReentrant { //get what is the controlling wallet (Personal Wallet) address personalWallet = myControllingWallet(msg.sender); require(personalWallet != address(0), "You do not have personal wallet authenticated."); //Verify that personalWallet has given control to the relayered wallet. address relayeredwallet = contractStorage.givecontrolto(personalWallet); require(relayeredwallet == msg.sender, "You do not have control over this personal wallet."); //Retrieve UIDs of both wallets uint relayerUID = contractStorage.UIDmain(msg.sender); uint personalUID = contractStorage.UIDmain(personalWallet); //its ok to have UID 0, since 0 swap with 0 still 0, 0 -> 3, become 3 - 0. which is ok. Need to start game after authenticate. require(relayerUID != 0, "Relayered wallet does not have a UID."); require(personalUID != 0, "Personal wallet does not have a UID."); // Perform the swap // Assign the UIDs to the opposite wallets contractStorage.setUIDmain(relayeredwallet, personalUID); contractStorage.setUID_ownedby(personalUID, relayeredwallet ); contractStorage.setUIDmain(personalWallet, relayerUID); contractStorage.setUID_ownedby(relayerUID, personalWallet ); // Emit an event for transparency emit UIDSwapped(relayeredwallet, personalWallet, relayerUID, personalUID); } function deletePersonalWalletControl() public nonReentrant { noneReentrant_time(msg.sender,1); contractStorage.setPersonalWallet(msg.sender,address(0)); } function deletePermissionForControlling() public nonReentrant { noneReentrant_time(msg.sender,1); contractStorage.setGiveControlTo(msg.sender,address(0)); } function readPermissionGivenTo (address web3wallet) public view returns(address thiswallet) { thiswallet = contractStorage.givecontrolto(web3wallet); } function myControllingWallet (address web2wallet) public view returns(address walletgotcontrolled) { walletgotcontrolled = contractStorage.personalwallet(web2wallet); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"indexed":false,"internalType":"struct S.Unit","name":"AfterUnit","type":"tuple"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"indexed":false,"internalType":"struct S.Status","name":"AfterStatus","type":"tuple"},{"components":[{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"stamina","type":"uint256"},{"internalType":"uint256","name":"hunger","type":"uint256"}],"indexed":false,"internalType":"struct S.Time","name":"AfterTime","type":"tuple"}],"name":"StatChangedResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"relayerWallet","type":"address"},{"indexed":true,"internalType":"address","name":"personalWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"relayerUID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"personalUID","type":"uint256"}],"name":"UIDSwapped","type":"event"},{"inputs":[{"internalType":"uint256","name":"claimTrainersID","type":"uint256"}],"name":"ClaimTrainerNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slot","type":"uint256"},{"internalType":"uint256","name":"_Gainquantity","type":"uint256"}],"name":"GainLingsStrength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"TrainerID","type":"uint256"},{"internalType":"uint256","name":"_Gainquantity","type":"uint256"}],"name":"GainTrainersStrength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slot","type":"uint256"},{"internalType":"uint256","name":"_genestrength","type":"uint256"}],"name":"InfuseLingsToNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_TrainerID","type":"uint256"},{"internalType":"uint256","name":"_genestrength","type":"uint256"}],"name":"InfuseTrainersToNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"NFT_ID","type":"uint256"},{"internalType":"uint256","name":"_slot","type":"uint256"}],"name":"SummonLingsFromNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_new_address","type":"address"}],"name":"TransferUID_ACCOUNT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accountAddressToProceed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"changeTrainerUnlockPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractITEMS","outputs":[{"internalType":"contract IFARPGItemsToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractLingsNFT","outputs":[{"internalType":"contract IFARPGLingsNFTToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractRAM","outputs":[{"internalType":"contract FARPG_RAMInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractStorage","outputs":[{"internalType":"contract IFARPG_Storage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deletePermissionForControlling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deletePersonalWalletControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"web2wallet","type":"address"}],"name":"myControllingWallet","outputs":[{"internalType":"address","name":"walletgotcontrolled","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"web3wallet","type":"address"}],"name":"readPermissionGivenTo","outputs":[{"internalType":"address","name":"thiswallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapUID_RelayeredtoPersonal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAAddress","type":"address"}],"name":"updateITEMContractAAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAAddress","type":"address"}],"name":"updateLingsNFTContractAAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAAddress","type":"address"}],"name":"updateRAMContractAAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAAddress","type":"address"}],"name":"updateStorageContractAAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewForUnityTrainerInfuse","outputs":[{"internalType":"uint256[50]","name":"infusingGENE","type":"uint256[50]"},{"internalType":"uint256[50]","name":"infusingStartTime","type":"uint256[50]"},{"internalType":"uint256","name":"cooldownLimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"web3wallet","type":"address"}],"name":"web2WalletTakeControlOfWeb3Wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"web2wallet","type":"address"}],"name":"web3WalletGivePermissionToWeb2Wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052603c6007553480156013575f5ffd5b50601b336023565b600180556072565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61308f8061007f5f395ff3fe608060405234801561000f575f5ffd5b50600436106101c6575f3560e01c806356b54192116100fe578063c02816b11161009e578063e56066591161006e578063e560665914610383578063f17756e114610396578063f1b1a6ab146103a9578063f2fde38b146103bc575f5ffd5b8063c02816b114610342578063c113d0d914610355578063c2b7ac4914610368578063dcc6aaaa1461037b575f5ffd5b80638da5cb5b116100d95780638da5cb5b1461030457806396a33dc5146103145780639ad56dd51461031c578063b9f54f2c1461032f575f5ffd5b806356b54192146102d6578063715018a6146102e95780637d35f912146102f1575f5ffd5b80632c45fa49116101695780634410015c116101445780634410015c1461028a5780634af2fe6f1461029d5780634c4808fa146102b0578063521f4f0c146102c3575f5ffd5b80632c45fa4914610267578063324381561461026f5780633ccfd60b14610282575f5ffd5b806309fb0795116101a457806309fb0795146102225780631b8c058c146102355780631dec52911461023d5780632acd699214610250575f5ffd5b806303eaa141146101ca5780630549b27e146101df57806306f949131461020f575b5f5ffd5b6101dd6101d8366004612bf8565b6103cf565b005b6002546101f2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101dd61021d366004612bf8565b6105d8565b6101dd610230366004612c1a565b610628565b6101dd61095e565b6101dd61024b366004612c1a565b6109db565b610258610bed565b60405161020693929190612c62565b6101dd610cf2565b6101dd61027d366004612bf8565b610d3b565b6101dd610dbb565b6101dd610298366004612c1a565b610e3b565b6003546101f2906001600160a01b031681565b6101f26102be366004612bf8565b61125f565b6101dd6102d1366004612bf8565b6112d2565b6101dd6102e4366004612c1a565b611400565b6101dd6118e8565b6101dd6102ff366004612c8e565b6118f9565b5f546001600160a01b03166101f2565b6101f2611bdb565b6101dd61032a366004612bf8565b611c65565b6101dd61033d366004612bf8565b611cb5565b6101dd610350366004612c1a565b611d05565b6101f2610363366004612bf8565b612457565b6101dd610376366004612c8e565b612489565b6101dd612496565b6004546101f2906001600160a01b031681565b6101dd6103a4366004612bf8565b612962565b6005546101f2906001600160a01b031681565b6101dd6103ca366004612bf8565b6129b2565b6103d7612a28565b600254604051630bc7d91360e31b81526001600160a01b03838116600483015290911690635e3ec89890602401602060405180830381865afa15801561041f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104439190612ca5565b156104a75760405162461bcd60e51b815260206004820152602960248201527f4e657720416464726573732068617320616c7265616479206c696e6b65642074604482015268379030b7102aa4a21760b91b60648201526084015b60405180910390fd5b600254604051630bc7d91360e31b81523360048201819052915f916001600160a01b0390911690635e3ec89890602401602060405180830381865afa1580156104f2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105169190612ca5565b9050805f036105675760405162461bcd60e51b815260206004820152601e60248201527f4578697374696e67206164647265737320686173206e6f205549442e2e2e0000604482015260640161049e565b6002546040516306c34e9360e51b81526001600160a01b03848116600483015285811660248301529091169063d869d260906044015b5f604051808303815f87803b1580156105b4575f5ffd5b505af11580156105c6573d5f5f3e3d5ffd5b5050505050506105d560018055565b50565b6105e0612a81565b6001600160a01b0381166106065760405162461bcd60e51b815260040161049e90612cbc565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610630612a28565b5f610639611bdb565b9050610646816002612ada565b6028831061068a5760405162461bcd60e51b81526020600482015260116024820152701a5b9d985b1a59081d1c985a5b995c9251607a1b604482015260640161049e565b60018210156106db5760405162461bcd60e51b815260206004820152601b60248201527f3020696e7075742c206e6f7468696e6720746f20696e667573652e0000000000604482015260640161049e565b6002546040516315f67cf360e31b81525f916001600160a01b03169063afb3e7989061070d9085908890600401612ce5565b602060405180830381865afa158015610728573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074c9190612ca5565b9050835f0361078457610760836001612d12565b81101561077f5760405162461bcd60e51b815260040161049e90612d25565b6107a4565b828110156107a45760405162461bcd60e51b815260040161049e90612d25565b6002546001600160a01b0316635af875f783866107c18786612d66565b9450846040518463ffffffff1660e01b81526004016107e293929190612d79565b5f604051808303815f87803b1580156107f9575f5ffd5b505af115801561080b573d5f5f3e3d5ffd5b505060025460405163067f299160e31b81525f93506001600160a01b0390911691506333f94c88906108439086908990600401612ce5565b602060405180830381865afa15801561085e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108829190612ca5565b6002549091506001600160a01b03166371a2058884876108a28886612d12565b6040518463ffffffff1660e01b81526004016108c093929190612d79565b5f604051808303815f87803b1580156108d7575f5ffd5b505af11580156108e9573d5f5f3e3d5ffd5b5050600254604051637d30ac7160e01b81526001600160a01b039091169250637d30ac71915061092190869089904290600401612d79565b5f604051808303815f87803b158015610938575f5ffd5b505af115801561094a573d5f5f3e3d5ffd5b5050505050505061095a60018055565b5050565b610966612a28565b610971336001612ada565b600254604051639cef0bd560e01b81523360048201525f60248201526001600160a01b0390911690639cef0bd5906044015b5f604051808303815f87803b1580156109ba575f5ffd5b505af11580156109cc573d5f5f3e3d5ffd5b505050506109d960018055565b565b6109e3612a28565b5f6109ec611bdb565b90506109f9816002612ada565b5f610a058460c9612d12565b60048054604051627eeac760e11b815292935085926001600160a01b039091169162fdd58e91610a39918791879101612ce5565b602060405180830381865afa158015610a54573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a789190612ca5565b1015610adc5760405162461bcd60e51b815260206004820152602d60248201527f547261696e6572204974656d204e4654206e6f7420656e6f7567682e2043686560448201526c18dac81d1c985a5b995c881251609a1b606482015260840161049e565b60048054604051637a94c56560e11b81526001600160a01b039091169163f5298aca91610b0f9186918691899101612d79565b5f604051808303815f87803b158015610b26575f5ffd5b505af1158015610b38573d5f5f3e3d5ffd5b50506002546040516315f67cf360e31b81525f93506001600160a01b03909116915063afb3e79890610b709086908990600401612ce5565b602060405180830381865afa158015610b8b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610baf9190612ca5565b6002549091506001600160a01b0316635af875f78487610bcf8886612d12565b6040518463ffffffff1660e01b815260040161092193929190612d79565b610bf5612bc5565b610bfd612bc5565b5f5f610c07611bdb565b600254604051633003c07760e21b81526001600160a01b03808416600483015292935091169063c00f01dc9060240161064060405180830381865afa158015610c52573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c769190612dd8565b6002546040516308a924af60e01b81526001600160a01b0384811660048301529296509116906308a924af9060240161064060405180830381865afa158015610cc1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce59190612dd8565b9250600754915050909192565b610cfa612a28565b610d05336001612ada565b600254604051637fd7374f60e01b81523360048201525f60248201526001600160a01b0390911690637fd7374f906044016109a3565b610d43612a28565b33610d4f816001612ada565b600254604051639cef0bd560e01b81526001600160a01b038381166004830152848116602483015290911690639cef0bd5906044015f604051808303815f87803b158015610d9b575f5ffd5b505af1158015610dad573d5f5f3e3d5ffd5b50505050506105d560018055565b610dc3612a81565b5f4711610e125760405162461bcd60e51b815260206004820152601860248201527f436f6e74726163742062616c616e6365206973207a65726f0000000000000000604482015260640161049e565b60405133904780156108fc02915f818181858888f193505050501580156105d5573d5f5f3e3d5ffd5b610e43612a28565b5f610e4c611bdb565b9050610e59816002612ada565b6002546040516329323b0d60e21b81526001600160a01b0383811660048301525f92169063a4c8ec3490602401602060405180830381865afa158015610ea1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec59190612ca5565b9050808410610f165760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e000000000000604482015260640161049e565b6002546040516388e6c74d60e01b81525f916001600160a01b0316906388e6c74d90610f489086908990600401612ce5565b606060405180830381865afa158015610f63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f879190612e55565b8051909150610fd85760405162461bcd60e51b815260206004820152601b60248201527f656d70747920736c6f742c206e6f7468696e6720746f206761696e0000000000604482015260640161049e565b600254604051636802761f60e01b81525f916001600160a01b031690636802761f9061100a9087908a90600401612ce5565b61010060405180830381865afa158015611026573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104a9190612eae565b905060018160a0015110156110b15760405162461bcd60e51b815260206004820152602760248201527f6e6f742067656e65737472656e67746820746f20746f702075702c20656d70746044820152667920736c6f743f60c81b606482015260840161049e565b6005548251604051627eeac760e11b815287926001600160a01b03169162fdd58e916110e1918991600401612ce5565b602060405180830381865afa1580156110fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111209190612ca5565b101561117a5760405162461bcd60e51b8152602060048201526024808201527f4c696e6773204e4654206e6f7420656e6f7567682e20436865636b204c696e676044820152631cc8125160e21b606482015260840161049e565b6005548251604051637a94c56560e11b81526001600160a01b039092169163f5298aca916111af918891908a90600401612d79565b5f604051808303815f87803b1580156111c6575f5ffd5b505af11580156111d8573d5f5f3e3d5ffd5b50505050848160a0018181516111ee9190612d12565b90525060025460405163daa3f88b60e01b81526001600160a01b039091169063daa3f88b906112259087908a908690600401612f6a565b5f604051808303815f87803b15801561123c575f5ffd5b505af115801561124e573d5f5f3e3d5ffd5b505050505050505061095a60018055565b60025460405163378ed8ed60e01b81526001600160a01b0383811660048301525f92169063378ed8ed906024015b602060405180830381865afa1580156112a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112cc9190612f97565b92915050565b6112da612a28565b6112e5816001612ada565b60025460405163378ed8ed60e01b81526001600160a01b0383811660048301525f92169063378ed8ed90602401602060405180830381865afa15801561132d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113519190612f97565b9050336001600160a01b03821681146113c65760405162461bcd60e51b815260206004820152603160248201527f796f7520617265206e6f74207065726d697474656420746f20636f6e74726f6c604482015270103a3434b9903bb2b119bbb0b63632ba1760791b606482015260840161049e565b600254604051637fd7374f60e01b81526001600160a01b038381166004830152858116602483015290911690637fd7374f9060440161059d565b611408612a28565b5f611411611bdb565b905061141e816002612ada565b6002546040516388e6c74d60e01b81525f916001600160a01b0316906388e6c74d906114509085908890600401612ce5565b606060405180830381865afa15801561146b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148f9190612e55565b80519091506114e05760405162461bcd60e51b815260206004820152601d60248201527f656d70747920736c6f742c206e6f7468696e6720746f20696e66757365000000604482015260640161049e565b600254604051636802761f60e01b81525f916001600160a01b031690636802761f906115129086908990600401612ce5565b61010060405180830381865afa15801561152e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115529190612eae565b9050838160a0015110156115785760405162461bcd60e51b815260040161049e90612d25565b6115b86040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6115d960405180606001604052805f81526020015f81526020015f81525090565b6115fa60405180606001604052805f81526020015f81526020015f81525090565b868460a00151036117f85760025460405163daa3f88b60e01b81526001600160a01b039091169063daa3f88b906116399089908c908890600401612f6a565b5f604051808303815f87803b158015611650575f5ffd5b505af1158015611662573d5f5f3e3d5ffd5b50506002546040516318f626f560e11b81526001600160a01b0390911692506331ec4dea915061169a9089908c908790600401612fb2565b5f604051808303815f87803b1580156116b1575f5ffd5b505af11580156116c3573d5f5f3e3d5ffd5b505060025460405163108b074f60e31b81526001600160a01b0390911692506384583a7891506116fb9089908c908690600401612fb2565b5f604051808303815f87803b158015611712575f5ffd5b505af1158015611724573d5f5f3e3d5ffd5b505060025460405163c10e83e160e01b81526001600160a01b03909116925063c10e83e1915061175c9089908c908890600401612f6a565b5f604051808303815f87803b158015611773575f5ffd5b505af1158015611785573d5f5f3e3d5ffd5b5050600554875160405163020da84160e61b8152600481018c90526001600160a01b038b8116602483015260448201929092529116925063836a104091506064015f604051808303815f87803b1580156117dd575f5ffd5b505af11580156117ef573d5f5f3e3d5ffd5b505050506118d9565b868460a00181815161180a9190612d66565b90525060025460405163daa3f88b60e01b81526001600160a01b039091169063daa3f88b906118419089908c908990600401612f6a565b5f604051808303815f87803b158015611858575f5ffd5b505af115801561186a573d5f5f3e3d5ffd5b5050600554875160405163020da84160e61b8152600481018c90526001600160a01b038b8116602483015260448201929092529116925063836a104091506064015f604051808303815f87803b1580156118c2575f5ffd5b505af11580156118d4573d5f5f3e3d5ffd5b505050505b50505050505061095a60018055565b6118f0612a81565b6109d95f612b76565b611901612a28565b5f61190a611bdb565b9050611917816002612ada565b60025460405163246ccd7b60e01b81525f916001600160a01b03169063246ccd7b906119499085908790600401612ce5565b602060405180830381865afa158015611964573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119889190612ca5565b9050600754816119989190612d12565b4210156119d95760405162461bcd60e51b815260206004820152600f60248201526e5374696c6c20756e6c6f636b696e6760881b604482015260640161049e565b60025460405163067f299160e31b81525f916001600160a01b0316906333f94c8890611a0b9086908890600401612ce5565b602060405180830381865afa158015611a26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612ca5565b90505f8111611a925760405162461bcd60e51b815260206004820152601460248201527327379033b2b7329034b9903637b1b5b4b733971760611b604482015260640161049e565b600254604051630e3440b160e31b81526001600160a01b03909116906371a2058890611ac690869088905f90600401612d79565b5f604051808303815f87803b158015611add575f5ffd5b505af1158015611aef573d5f5f3e3d5ffd5b5050600254604051637d30ac7160e01b81526001600160a01b039091169250637d30ac719150611b2790869088905f90600401612d79565b5f604051808303815f87803b158015611b3e575f5ffd5b505af1158015611b50573d5f5f3e3d5ffd5b505050505f8460c9611b629190612d12565b6004805460405163020da84160e61b81529182018590526001600160a01b03878116602484015260448301849052929350919091169063836a1040906064015f604051808303815f87803b158015611bb8575f5ffd5b505af1158015611bca573d5f5f3e3d5ffd5b50505050505050506105d560018055565b6002546040516302e6c26360e11b81523360048201525f9182916001600160a01b03909116906305cd84c690602401602060405180830381865afa158015611c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c499190612f97565b90506001600160a01b038116611c60573391505090565b919050565b611c6d612a81565b6001600160a01b038116611c935760405162461bcd60e51b815260040161049e90612cbc565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b611cbd612a81565b6001600160a01b038116611ce35760405162461bcd60e51b815260040161049e90612cbc565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b611d0d612a28565b5f611d16611bdb565b9050611d23816002612ada565b6002546040516329323b0d60e21b81526001600160a01b0383811660048301525f92169063a4c8ec3490602401602060405180830381865afa158015611d6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612ca5565b9050808310611de05760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e000000000000604482015260640161049e565b6002546040516388e6c74d60e01b81525f916001600160a01b0316906388e6c74d90611e129086908890600401612ce5565b606060405180830381865afa158015611e2d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e519190612e55565b805190915015611ea35760405162461bcd60e51b815260206004820152601860248201527f43686f73656e20736c6f74206973206f636375706965642e0000000000000000604482015260640161049e565b600554604051627eeac760e11b81526001916001600160a01b03169062fdd58e90611ed49087908a90600401612ce5565b602060405180830381865afa158015611eef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f139190612ca5565b1015611f755760405162461bcd60e51b815260206004820152602b60248201527f4c696e6773204e4654206e6f742066696e642e20596f7520646f6e742068617660448201526a32903a3434b99027232a1760a91b606482015260840161049e565b600554604051637a94c56560e11b81526001600160a01b039091169063f5298aca90611faa9086908990600190600401612d79565b5f604051808303815f87803b158015611fc1575f5ffd5b505af1158015611fd3573d5f5f3e3d5ffd5b505060408051610100810182526103e88152606460208201819052603282840152606082018190526080820152600160a082015260035491516304fe10d360e41b8152600481018a90525f945090925060c08301916001600160a01b031690634fe10d3090602401602060405180830381865afa158015612056573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061207a9190612ca5565b81525f6020909101526003546040516353b4eff960e11b8152600481018990529192506001600160a01b03169063a769dff290602401606060405180830381865afa1580156120cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ef9190612e55565b915081604001516003036121055760e081018690525b5f60405180606001604052805f815260200162015180426121269190612d66565b8152602001612137612a3042612d12565b905260025460405163daa3f88b60e01b81529192506001600160a01b03169063daa3f88b9061216e9088908a908790600401612f6a565b5f604051808303815f87803b158015612185575f5ffd5b505af1158015612197573d5f5f3e3d5ffd5b50506002546040516318f626f560e11b81526001600160a01b0390911692506331ec4dea91506121cf9088908a908890600401612fb2565b5f604051808303815f87803b1580156121e6575f5ffd5b505af11580156121f8573d5f5f3e3d5ffd5b505060025460405163108b074f60e31b81526001600160a01b0390911692506384583a7891506122309088908a908690600401612fb2565b5f604051808303815f87803b158015612247575f5ffd5b505af1158015612259573d5f5f3e3d5ffd5b505060025460035486516040516315e3d00d60e11b815260048101919091526001600160a01b03928316945063c10e83e1935089928b921690632bc7a01a9060240161010060405180830381865afa1580156122b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122db9190612eae565b6040518463ffffffff1660e01b81526004016122f993929190612f6a565b5f604051808303815f87803b158015612310575f5ffd5b505af1158015612322573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b0389811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa158015612370573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123949190612ca5565b84519091506123a69061271090612fea565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae906123e09089908590600401612ce5565b5f604051808303815f87803b1580156123f7575f5ffd5b505af1158015612409573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd83858460405161244093929190613009565b60405180910390a150505050505061095a60018055565b6002546040516302e6c26360e11b81526001600160a01b0383811660048301525f9216906305cd84c69060240161128d565b612491612a81565b600755565b61249e612a28565b5f6124a833612457565b90506001600160a01b0381166125175760405162461bcd60e51b815260206004820152602e60248201527f596f7520646f206e6f74206861766520706572736f6e616c2077616c6c65742060448201526d30baba3432b73a34b1b0ba32b21760911b606482015260840161049e565b60025460405163378ed8ed60e01b81526001600160a01b0383811660048301525f92169063378ed8ed90602401602060405180830381865afa15801561255f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125839190612f97565b90506001600160a01b03811633146125f85760405162461bcd60e51b815260206004820152603260248201527f596f7520646f206e6f74206861766520636f6e74726f6c206f7665722074686960448201527139903832b939b7b730b6103bb0b63632ba1760711b606482015260840161049e565b600254604051630bc7d91360e31b81523360048201525f916001600160a01b031690635e3ec89890602401602060405180830381865afa15801561263e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126629190612ca5565b600254604051630bc7d91360e31b81526001600160a01b0386811660048301529293505f9290911690635e3ec89890602401602060405180830381865afa1580156126af573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d39190612ca5565b9050815f036127325760405162461bcd60e51b815260206004820152602560248201527f52656c6179657265642077616c6c657420646f6573206e6f7420686176652061604482015264102aa4a21760d91b606482015260840161049e565b805f0361278d5760405162461bcd60e51b8152602060048201526024808201527f506572736f6e616c2077616c6c657420646f6573206e6f7420686176652061206044820152632aa4a21760e11b606482015260840161049e565b600254604051632875cd2b60e01b81526001600160a01b0390911690632875cd2b906127bf9086908590600401612ce5565b5f604051808303815f87803b1580156127d6575f5ffd5b505af11580156127e8573d5f5f3e3d5ffd5b50506002546040516311fa2c4960e01b8152600481018590526001600160a01b03878116602483015290911692506311fa2c4991506044015f604051808303815f87803b158015612837575f5ffd5b505af1158015612849573d5f5f3e3d5ffd5b5050600254604051632875cd2b60e01b81526001600160a01b039091169250632875cd2b915061287f9087908690600401612ce5565b5f604051808303815f87803b158015612896575f5ffd5b505af11580156128a8573d5f5f3e3d5ffd5b50506002546040516311fa2c4960e01b8152600481018690526001600160a01b03888116602483015290911692506311fa2c4991506044015f604051808303815f87803b1580156128f7575f5ffd5b505af1158015612909573d5f5f3e3d5ffd5b505060408051858152602081018590526001600160a01b038089169450871692507f1d5be8888e86a0f9d77e7d6375cd8a6824db2f90cd41d56455e437c8b4eb9fc3910160405180910390a3505050506109d960018055565b61296a612a81565b6001600160a01b0381166129905760405162461bcd60e51b815260040161049e90612cbc565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6129ba612a81565b6001600160a01b038116612a1f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161049e565b6105d581612b76565b600260015403612a7a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161049e565b6002600155565b5f546001600160a01b031633146109d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161049e565b6001600160a01b0382165f908152600660205260409020548190612afe9042612d66565b1015612b5a5760405162461bcd60e51b815260206004820152602560248201527f4e6f6e2d5265656e7472616e742c20736c6f7720646f776e205458206174746560448201526436b83a399760d91b606482015260840161049e565b506001600160a01b03165f908152600660205260409020429055565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040518061064001604052806032906020820280368337509192915050565b6001600160a01b03811681146105d5575f5ffd5b5f60208284031215612c08575f5ffd5b8135612c1381612be4565b9392505050565b5f5f60408385031215612c2b575f5ffd5b50508035926020909101359150565b805f5b6032811015612c5c578151845260209384019390910190600101612c3d565b50505050565b610ca08101612c718286612c3a565b612c7f610640830185612c3a565b82610c80830152949350505050565b5f60208284031215612c9e575f5ffd5b5035919050565b5f60208284031215612cb5575f5ffd5b5051919050565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156112cc576112cc612cfe565b60208082526021908201527f6e6f7420656e6f7567682067656e65737472656e67746820746f20696e6675736040820152606560f81b606082015260800190565b818103818111156112cc576112cc612cfe565b6001600160a01b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff81118282101715612dd257612dd2612d9a565b60405290565b5f6106408284031215612de9575f5ffd5b82601f830112612df7575f5ffd5b604051610640810167ffffffffffffffff81118282101715612e1b57612e1b612d9a565b60405280610640840185811115612e30575f5ffd5b845b81811015612e4a578051835260209283019201612e32565b509195945050505050565b5f6060828403128015612e66575f5ffd5b506040516060810167ffffffffffffffff81118282101715612e8a57612e8a612d9a565b60409081528351825260208085015190830152928301519281019290925250919050565b5f610100828403128015612ec0575f5ffd5b50612ec9612dae565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0928301519281019290925250919050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b6001600160a01b0384168152602081018390526101408101612f8f6040830184612f1c565b949350505050565b5f60208284031215612fa7575f5ffd5b8151612c1381612be4565b6001600160a01b03841681526020810183905260a08101612f8f60408301848051825260208082015190830152604090810151910152565b5f8261300457634e487b7160e01b5f52601260045260245ffd5b500690565b6101c081016130188286612f1c565b8351610100830152602084015161012083015260408401516101408301528251610160830152602083015161018083015260408301516101a0830152612f8f56fea26469706673582212202ce08b48e7f99c93a6a6d18d47aaa7b75abcf2a73a0c8c5515afba99f7dc0c4764736f6c634300081c0033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106101c6575f3560e01c806356b54192116100fe578063c02816b11161009e578063e56066591161006e578063e560665914610383578063f17756e114610396578063f1b1a6ab146103a9578063f2fde38b146103bc575f5ffd5b8063c02816b114610342578063c113d0d914610355578063c2b7ac4914610368578063dcc6aaaa1461037b575f5ffd5b80638da5cb5b116100d95780638da5cb5b1461030457806396a33dc5146103145780639ad56dd51461031c578063b9f54f2c1461032f575f5ffd5b806356b54192146102d6578063715018a6146102e95780637d35f912146102f1575f5ffd5b80632c45fa49116101695780634410015c116101445780634410015c1461028a5780634af2fe6f1461029d5780634c4808fa146102b0578063521f4f0c146102c3575f5ffd5b80632c45fa4914610267578063324381561461026f5780633ccfd60b14610282575f5ffd5b806309fb0795116101a457806309fb0795146102225780631b8c058c146102355780631dec52911461023d5780632acd699214610250575f5ffd5b806303eaa141146101ca5780630549b27e146101df57806306f949131461020f575b5f5ffd5b6101dd6101d8366004612bf8565b6103cf565b005b6002546101f2906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101dd61021d366004612bf8565b6105d8565b6101dd610230366004612c1a565b610628565b6101dd61095e565b6101dd61024b366004612c1a565b6109db565b610258610bed565b60405161020693929190612c62565b6101dd610cf2565b6101dd61027d366004612bf8565b610d3b565b6101dd610dbb565b6101dd610298366004612c1a565b610e3b565b6003546101f2906001600160a01b031681565b6101f26102be366004612bf8565b61125f565b6101dd6102d1366004612bf8565b6112d2565b6101dd6102e4366004612c1a565b611400565b6101dd6118e8565b6101dd6102ff366004612c8e565b6118f9565b5f546001600160a01b03166101f2565b6101f2611bdb565b6101dd61032a366004612bf8565b611c65565b6101dd61033d366004612bf8565b611cb5565b6101dd610350366004612c1a565b611d05565b6101f2610363366004612bf8565b612457565b6101dd610376366004612c8e565b612489565b6101dd612496565b6004546101f2906001600160a01b031681565b6101dd6103a4366004612bf8565b612962565b6005546101f2906001600160a01b031681565b6101dd6103ca366004612bf8565b6129b2565b6103d7612a28565b600254604051630bc7d91360e31b81526001600160a01b03838116600483015290911690635e3ec89890602401602060405180830381865afa15801561041f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104439190612ca5565b156104a75760405162461bcd60e51b815260206004820152602960248201527f4e657720416464726573732068617320616c7265616479206c696e6b65642074604482015268379030b7102aa4a21760b91b60648201526084015b60405180910390fd5b600254604051630bc7d91360e31b81523360048201819052915f916001600160a01b0390911690635e3ec89890602401602060405180830381865afa1580156104f2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105169190612ca5565b9050805f036105675760405162461bcd60e51b815260206004820152601e60248201527f4578697374696e67206164647265737320686173206e6f205549442e2e2e0000604482015260640161049e565b6002546040516306c34e9360e51b81526001600160a01b03848116600483015285811660248301529091169063d869d260906044015b5f604051808303815f87803b1580156105b4575f5ffd5b505af11580156105c6573d5f5f3e3d5ffd5b5050505050506105d560018055565b50565b6105e0612a81565b6001600160a01b0381166106065760405162461bcd60e51b815260040161049e90612cbc565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610630612a28565b5f610639611bdb565b9050610646816002612ada565b6028831061068a5760405162461bcd60e51b81526020600482015260116024820152701a5b9d985b1a59081d1c985a5b995c9251607a1b604482015260640161049e565b60018210156106db5760405162461bcd60e51b815260206004820152601b60248201527f3020696e7075742c206e6f7468696e6720746f20696e667573652e0000000000604482015260640161049e565b6002546040516315f67cf360e31b81525f916001600160a01b03169063afb3e7989061070d9085908890600401612ce5565b602060405180830381865afa158015610728573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074c9190612ca5565b9050835f0361078457610760836001612d12565b81101561077f5760405162461bcd60e51b815260040161049e90612d25565b6107a4565b828110156107a45760405162461bcd60e51b815260040161049e90612d25565b6002546001600160a01b0316635af875f783866107c18786612d66565b9450846040518463ffffffff1660e01b81526004016107e293929190612d79565b5f604051808303815f87803b1580156107f9575f5ffd5b505af115801561080b573d5f5f3e3d5ffd5b505060025460405163067f299160e31b81525f93506001600160a01b0390911691506333f94c88906108439086908990600401612ce5565b602060405180830381865afa15801561085e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108829190612ca5565b6002549091506001600160a01b03166371a2058884876108a28886612d12565b6040518463ffffffff1660e01b81526004016108c093929190612d79565b5f604051808303815f87803b1580156108d7575f5ffd5b505af11580156108e9573d5f5f3e3d5ffd5b5050600254604051637d30ac7160e01b81526001600160a01b039091169250637d30ac71915061092190869089904290600401612d79565b5f604051808303815f87803b158015610938575f5ffd5b505af115801561094a573d5f5f3e3d5ffd5b5050505050505061095a60018055565b5050565b610966612a28565b610971336001612ada565b600254604051639cef0bd560e01b81523360048201525f60248201526001600160a01b0390911690639cef0bd5906044015b5f604051808303815f87803b1580156109ba575f5ffd5b505af11580156109cc573d5f5f3e3d5ffd5b505050506109d960018055565b565b6109e3612a28565b5f6109ec611bdb565b90506109f9816002612ada565b5f610a058460c9612d12565b60048054604051627eeac760e11b815292935085926001600160a01b039091169162fdd58e91610a39918791879101612ce5565b602060405180830381865afa158015610a54573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a789190612ca5565b1015610adc5760405162461bcd60e51b815260206004820152602d60248201527f547261696e6572204974656d204e4654206e6f7420656e6f7567682e2043686560448201526c18dac81d1c985a5b995c881251609a1b606482015260840161049e565b60048054604051637a94c56560e11b81526001600160a01b039091169163f5298aca91610b0f9186918691899101612d79565b5f604051808303815f87803b158015610b26575f5ffd5b505af1158015610b38573d5f5f3e3d5ffd5b50506002546040516315f67cf360e31b81525f93506001600160a01b03909116915063afb3e79890610b709086908990600401612ce5565b602060405180830381865afa158015610b8b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610baf9190612ca5565b6002549091506001600160a01b0316635af875f78487610bcf8886612d12565b6040518463ffffffff1660e01b815260040161092193929190612d79565b610bf5612bc5565b610bfd612bc5565b5f5f610c07611bdb565b600254604051633003c07760e21b81526001600160a01b03808416600483015292935091169063c00f01dc9060240161064060405180830381865afa158015610c52573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c769190612dd8565b6002546040516308a924af60e01b81526001600160a01b0384811660048301529296509116906308a924af9060240161064060405180830381865afa158015610cc1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce59190612dd8565b9250600754915050909192565b610cfa612a28565b610d05336001612ada565b600254604051637fd7374f60e01b81523360048201525f60248201526001600160a01b0390911690637fd7374f906044016109a3565b610d43612a28565b33610d4f816001612ada565b600254604051639cef0bd560e01b81526001600160a01b038381166004830152848116602483015290911690639cef0bd5906044015f604051808303815f87803b158015610d9b575f5ffd5b505af1158015610dad573d5f5f3e3d5ffd5b50505050506105d560018055565b610dc3612a81565b5f4711610e125760405162461bcd60e51b815260206004820152601860248201527f436f6e74726163742062616c616e6365206973207a65726f0000000000000000604482015260640161049e565b60405133904780156108fc02915f818181858888f193505050501580156105d5573d5f5f3e3d5ffd5b610e43612a28565b5f610e4c611bdb565b9050610e59816002612ada565b6002546040516329323b0d60e21b81526001600160a01b0383811660048301525f92169063a4c8ec3490602401602060405180830381865afa158015610ea1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec59190612ca5565b9050808410610f165760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e000000000000604482015260640161049e565b6002546040516388e6c74d60e01b81525f916001600160a01b0316906388e6c74d90610f489086908990600401612ce5565b606060405180830381865afa158015610f63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f879190612e55565b8051909150610fd85760405162461bcd60e51b815260206004820152601b60248201527f656d70747920736c6f742c206e6f7468696e6720746f206761696e0000000000604482015260640161049e565b600254604051636802761f60e01b81525f916001600160a01b031690636802761f9061100a9087908a90600401612ce5565b61010060405180830381865afa158015611026573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104a9190612eae565b905060018160a0015110156110b15760405162461bcd60e51b815260206004820152602760248201527f6e6f742067656e65737472656e67746820746f20746f702075702c20656d70746044820152667920736c6f743f60c81b606482015260840161049e565b6005548251604051627eeac760e11b815287926001600160a01b03169162fdd58e916110e1918991600401612ce5565b602060405180830381865afa1580156110fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111209190612ca5565b101561117a5760405162461bcd60e51b8152602060048201526024808201527f4c696e6773204e4654206e6f7420656e6f7567682e20436865636b204c696e676044820152631cc8125160e21b606482015260840161049e565b6005548251604051637a94c56560e11b81526001600160a01b039092169163f5298aca916111af918891908a90600401612d79565b5f604051808303815f87803b1580156111c6575f5ffd5b505af11580156111d8573d5f5f3e3d5ffd5b50505050848160a0018181516111ee9190612d12565b90525060025460405163daa3f88b60e01b81526001600160a01b039091169063daa3f88b906112259087908a908690600401612f6a565b5f604051808303815f87803b15801561123c575f5ffd5b505af115801561124e573d5f5f3e3d5ffd5b505050505050505061095a60018055565b60025460405163378ed8ed60e01b81526001600160a01b0383811660048301525f92169063378ed8ed906024015b602060405180830381865afa1580156112a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112cc9190612f97565b92915050565b6112da612a28565b6112e5816001612ada565b60025460405163378ed8ed60e01b81526001600160a01b0383811660048301525f92169063378ed8ed90602401602060405180830381865afa15801561132d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113519190612f97565b9050336001600160a01b03821681146113c65760405162461bcd60e51b815260206004820152603160248201527f796f7520617265206e6f74207065726d697474656420746f20636f6e74726f6c604482015270103a3434b9903bb2b119bbb0b63632ba1760791b606482015260840161049e565b600254604051637fd7374f60e01b81526001600160a01b038381166004830152858116602483015290911690637fd7374f9060440161059d565b611408612a28565b5f611411611bdb565b905061141e816002612ada565b6002546040516388e6c74d60e01b81525f916001600160a01b0316906388e6c74d906114509085908890600401612ce5565b606060405180830381865afa15801561146b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148f9190612e55565b80519091506114e05760405162461bcd60e51b815260206004820152601d60248201527f656d70747920736c6f742c206e6f7468696e6720746f20696e66757365000000604482015260640161049e565b600254604051636802761f60e01b81525f916001600160a01b031690636802761f906115129086908990600401612ce5565b61010060405180830381865afa15801561152e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115529190612eae565b9050838160a0015110156115785760405162461bcd60e51b815260040161049e90612d25565b6115b86040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6115d960405180606001604052805f81526020015f81526020015f81525090565b6115fa60405180606001604052805f81526020015f81526020015f81525090565b868460a00151036117f85760025460405163daa3f88b60e01b81526001600160a01b039091169063daa3f88b906116399089908c908890600401612f6a565b5f604051808303815f87803b158015611650575f5ffd5b505af1158015611662573d5f5f3e3d5ffd5b50506002546040516318f626f560e11b81526001600160a01b0390911692506331ec4dea915061169a9089908c908790600401612fb2565b5f604051808303815f87803b1580156116b1575f5ffd5b505af11580156116c3573d5f5f3e3d5ffd5b505060025460405163108b074f60e31b81526001600160a01b0390911692506384583a7891506116fb9089908c908690600401612fb2565b5f604051808303815f87803b158015611712575f5ffd5b505af1158015611724573d5f5f3e3d5ffd5b505060025460405163c10e83e160e01b81526001600160a01b03909116925063c10e83e1915061175c9089908c908890600401612f6a565b5f604051808303815f87803b158015611773575f5ffd5b505af1158015611785573d5f5f3e3d5ffd5b5050600554875160405163020da84160e61b8152600481018c90526001600160a01b038b8116602483015260448201929092529116925063836a104091506064015f604051808303815f87803b1580156117dd575f5ffd5b505af11580156117ef573d5f5f3e3d5ffd5b505050506118d9565b868460a00181815161180a9190612d66565b90525060025460405163daa3f88b60e01b81526001600160a01b039091169063daa3f88b906118419089908c908990600401612f6a565b5f604051808303815f87803b158015611858575f5ffd5b505af115801561186a573d5f5f3e3d5ffd5b5050600554875160405163020da84160e61b8152600481018c90526001600160a01b038b8116602483015260448201929092529116925063836a104091506064015f604051808303815f87803b1580156118c2575f5ffd5b505af11580156118d4573d5f5f3e3d5ffd5b505050505b50505050505061095a60018055565b6118f0612a81565b6109d95f612b76565b611901612a28565b5f61190a611bdb565b9050611917816002612ada565b60025460405163246ccd7b60e01b81525f916001600160a01b03169063246ccd7b906119499085908790600401612ce5565b602060405180830381865afa158015611964573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119889190612ca5565b9050600754816119989190612d12565b4210156119d95760405162461bcd60e51b815260206004820152600f60248201526e5374696c6c20756e6c6f636b696e6760881b604482015260640161049e565b60025460405163067f299160e31b81525f916001600160a01b0316906333f94c8890611a0b9086908890600401612ce5565b602060405180830381865afa158015611a26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4a9190612ca5565b90505f8111611a925760405162461bcd60e51b815260206004820152601460248201527327379033b2b7329034b9903637b1b5b4b733971760611b604482015260640161049e565b600254604051630e3440b160e31b81526001600160a01b03909116906371a2058890611ac690869088905f90600401612d79565b5f604051808303815f87803b158015611add575f5ffd5b505af1158015611aef573d5f5f3e3d5ffd5b5050600254604051637d30ac7160e01b81526001600160a01b039091169250637d30ac719150611b2790869088905f90600401612d79565b5f604051808303815f87803b158015611b3e575f5ffd5b505af1158015611b50573d5f5f3e3d5ffd5b505050505f8460c9611b629190612d12565b6004805460405163020da84160e61b81529182018590526001600160a01b03878116602484015260448301849052929350919091169063836a1040906064015f604051808303815f87803b158015611bb8575f5ffd5b505af1158015611bca573d5f5f3e3d5ffd5b50505050505050506105d560018055565b6002546040516302e6c26360e11b81523360048201525f9182916001600160a01b03909116906305cd84c690602401602060405180830381865afa158015611c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c499190612f97565b90506001600160a01b038116611c60573391505090565b919050565b611c6d612a81565b6001600160a01b038116611c935760405162461bcd60e51b815260040161049e90612cbc565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b611cbd612a81565b6001600160a01b038116611ce35760405162461bcd60e51b815260040161049e90612cbc565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b611d0d612a28565b5f611d16611bdb565b9050611d23816002612ada565b6002546040516329323b0d60e21b81526001600160a01b0383811660048301525f92169063a4c8ec3490602401602060405180830381865afa158015611d6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612ca5565b9050808310611de05760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e000000000000604482015260640161049e565b6002546040516388e6c74d60e01b81525f916001600160a01b0316906388e6c74d90611e129086908890600401612ce5565b606060405180830381865afa158015611e2d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e519190612e55565b805190915015611ea35760405162461bcd60e51b815260206004820152601860248201527f43686f73656e20736c6f74206973206f636375706965642e0000000000000000604482015260640161049e565b600554604051627eeac760e11b81526001916001600160a01b03169062fdd58e90611ed49087908a90600401612ce5565b602060405180830381865afa158015611eef573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f139190612ca5565b1015611f755760405162461bcd60e51b815260206004820152602b60248201527f4c696e6773204e4654206e6f742066696e642e20596f7520646f6e742068617660448201526a32903a3434b99027232a1760a91b606482015260840161049e565b600554604051637a94c56560e11b81526001600160a01b039091169063f5298aca90611faa9086908990600190600401612d79565b5f604051808303815f87803b158015611fc1575f5ffd5b505af1158015611fd3573d5f5f3e3d5ffd5b505060408051610100810182526103e88152606460208201819052603282840152606082018190526080820152600160a082015260035491516304fe10d360e41b8152600481018a90525f945090925060c08301916001600160a01b031690634fe10d3090602401602060405180830381865afa158015612056573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061207a9190612ca5565b81525f6020909101526003546040516353b4eff960e11b8152600481018990529192506001600160a01b03169063a769dff290602401606060405180830381865afa1580156120cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ef9190612e55565b915081604001516003036121055760e081018690525b5f60405180606001604052805f815260200162015180426121269190612d66565b8152602001612137612a3042612d12565b905260025460405163daa3f88b60e01b81529192506001600160a01b03169063daa3f88b9061216e9088908a908790600401612f6a565b5f604051808303815f87803b158015612185575f5ffd5b505af1158015612197573d5f5f3e3d5ffd5b50506002546040516318f626f560e11b81526001600160a01b0390911692506331ec4dea91506121cf9088908a908890600401612fb2565b5f604051808303815f87803b1580156121e6575f5ffd5b505af11580156121f8573d5f5f3e3d5ffd5b505060025460405163108b074f60e31b81526001600160a01b0390911692506384583a7891506122309088908a908690600401612fb2565b5f604051808303815f87803b158015612247575f5ffd5b505af1158015612259573d5f5f3e3d5ffd5b505060025460035486516040516315e3d00d60e11b815260048101919091526001600160a01b03928316945063c10e83e1935089928b921690632bc7a01a9060240161010060405180830381865afa1580156122b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122db9190612eae565b6040518463ffffffff1660e01b81526004016122f993929190612f6a565b5f604051808303815f87803b158015612310575f5ffd5b505af1158015612322573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b0389811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa158015612370573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123949190612ca5565b84519091506123a69061271090612fea565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae906123e09089908590600401612ce5565b5f604051808303815f87803b1580156123f7575f5ffd5b505af1158015612409573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd83858460405161244093929190613009565b60405180910390a150505050505061095a60018055565b6002546040516302e6c26360e11b81526001600160a01b0383811660048301525f9216906305cd84c69060240161128d565b612491612a81565b600755565b61249e612a28565b5f6124a833612457565b90506001600160a01b0381166125175760405162461bcd60e51b815260206004820152602e60248201527f596f7520646f206e6f74206861766520706572736f6e616c2077616c6c65742060448201526d30baba3432b73a34b1b0ba32b21760911b606482015260840161049e565b60025460405163378ed8ed60e01b81526001600160a01b0383811660048301525f92169063378ed8ed90602401602060405180830381865afa15801561255f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125839190612f97565b90506001600160a01b03811633146125f85760405162461bcd60e51b815260206004820152603260248201527f596f7520646f206e6f74206861766520636f6e74726f6c206f7665722074686960448201527139903832b939b7b730b6103bb0b63632ba1760711b606482015260840161049e565b600254604051630bc7d91360e31b81523360048201525f916001600160a01b031690635e3ec89890602401602060405180830381865afa15801561263e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126629190612ca5565b600254604051630bc7d91360e31b81526001600160a01b0386811660048301529293505f9290911690635e3ec89890602401602060405180830381865afa1580156126af573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d39190612ca5565b9050815f036127325760405162461bcd60e51b815260206004820152602560248201527f52656c6179657265642077616c6c657420646f6573206e6f7420686176652061604482015264102aa4a21760d91b606482015260840161049e565b805f0361278d5760405162461bcd60e51b8152602060048201526024808201527f506572736f6e616c2077616c6c657420646f6573206e6f7420686176652061206044820152632aa4a21760e11b606482015260840161049e565b600254604051632875cd2b60e01b81526001600160a01b0390911690632875cd2b906127bf9086908590600401612ce5565b5f604051808303815f87803b1580156127d6575f5ffd5b505af11580156127e8573d5f5f3e3d5ffd5b50506002546040516311fa2c4960e01b8152600481018590526001600160a01b03878116602483015290911692506311fa2c4991506044015f604051808303815f87803b158015612837575f5ffd5b505af1158015612849573d5f5f3e3d5ffd5b5050600254604051632875cd2b60e01b81526001600160a01b039091169250632875cd2b915061287f9087908690600401612ce5565b5f604051808303815f87803b158015612896575f5ffd5b505af11580156128a8573d5f5f3e3d5ffd5b50506002546040516311fa2c4960e01b8152600481018690526001600160a01b03888116602483015290911692506311fa2c4991506044015f604051808303815f87803b1580156128f7575f5ffd5b505af1158015612909573d5f5f3e3d5ffd5b505060408051858152602081018590526001600160a01b038089169450871692507f1d5be8888e86a0f9d77e7d6375cd8a6824db2f90cd41d56455e437c8b4eb9fc3910160405180910390a3505050506109d960018055565b61296a612a81565b6001600160a01b0381166129905760405162461bcd60e51b815260040161049e90612cbc565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6129ba612a81565b6001600160a01b038116612a1f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161049e565b6105d581612b76565b600260015403612a7a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161049e565b6002600155565b5f546001600160a01b031633146109d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161049e565b6001600160a01b0382165f908152600660205260409020548190612afe9042612d66565b1015612b5a5760405162461bcd60e51b815260206004820152602560248201527f4e6f6e2d5265656e7472616e742c20736c6f7720646f776e205458206174746560448201526436b83a399760d91b606482015260840161049e565b506001600160a01b03165f908152600660205260409020429055565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040518061064001604052806032906020820280368337509192915050565b6001600160a01b03811681146105d5575f5ffd5b5f60208284031215612c08575f5ffd5b8135612c1381612be4565b9392505050565b5f5f60408385031215612c2b575f5ffd5b50508035926020909101359150565b805f5b6032811015612c5c578151845260209384019390910190600101612c3d565b50505050565b610ca08101612c718286612c3a565b612c7f610640830185612c3a565b82610c80830152949350505050565b5f60208284031215612c9e575f5ffd5b5035919050565b5f60208284031215612cb5575f5ffd5b5051919050565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156112cc576112cc612cfe565b60208082526021908201527f6e6f7420656e6f7567682067656e65737472656e67746820746f20696e6675736040820152606560f81b606082015260800190565b818103818111156112cc576112cc612cfe565b6001600160a01b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff81118282101715612dd257612dd2612d9a565b60405290565b5f6106408284031215612de9575f5ffd5b82601f830112612df7575f5ffd5b604051610640810167ffffffffffffffff81118282101715612e1b57612e1b612d9a565b60405280610640840185811115612e30575f5ffd5b845b81811015612e4a578051835260209283019201612e32565b509195945050505050565b5f6060828403128015612e66575f5ffd5b506040516060810167ffffffffffffffff81118282101715612e8a57612e8a612d9a565b60409081528351825260208085015190830152928301519281019290925250919050565b5f610100828403128015612ec0575f5ffd5b50612ec9612dae565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0928301519281019290925250919050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b6001600160a01b0384168152602081018390526101408101612f8f6040830184612f1c565b949350505050565b5f60208284031215612fa7575f5ffd5b8151612c1381612be4565b6001600160a01b03841681526020810183905260a08101612f8f60408301848051825260208082015190830152604090810151910152565b5f8261300457634e487b7160e01b5f52601260045260245ffd5b500690565b6101c081016130188286612f1c565b8351610100830152602084015161012083015260408401516101408301528251610160830152602083015161018083015260408301516101a0830152612f8f56fea26469706673582212202ce08b48e7f99c93a6a6d18d47aaa7b75abcf2a73a0c8c5515afba99f7dc0c4764736f6c634300081c0033
Deployed Bytecode Sourcemap
26822:17540:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40545:458;;;;;;:::i;:::-;;:::i;:::-;;26889:37;;;;;-1:-1:-1;;;;;26889:37:0;;;;;;-1:-1:-1;;;;;589:32:1;;;571:51;;559:2;544:18;26889:37:0;;;;;;;;28806:230;;;;;;:::i;:::-;;:::i;35347:1287::-;;;;;;:::i;:::-;;:::i;43815:179::-;;;:::i;39075:1021::-;;;;;;:::i;:::-;;:::i;40104:430::-;;;:::i;:::-;;;;;;;;;:::i;43632:177::-;;;:::i;41077:247::-;;;;;;:::i;:::-;;:::i;29528:257::-;;;:::i;37829:1238::-;;;;;;:::i;:::-;;:::i;26933:37::-;;;;;-1:-1:-1;;;;;26933:37:0;;;44000:165;;;;;;:::i;:::-;;:::i;41332:549::-;;;;;;:::i;:::-;;:::i;33679:1660::-;;;;;;:::i;:::-;;:::i;2788:103::-;;;:::i;36648:1171::-;;;;;;:::i;:::-;;:::i;2140:87::-;2186:7;2213:6;-1:-1:-1;;;;;2213:6:0;2140:87;;30946:441;;;:::i;29042:231::-;;;;;;:::i;:::-;;:::i;28566:234::-;;;;;;:::i;:::-;;:::i;31484:2139::-;;;;;;:::i;:::-;;:::i;44171:182::-;;;;;;:::i;:::-;;:::i;29868:112::-;;;;;;:::i;:::-;;:::i;42088:1530::-;;;:::i;26977:37::-;;;;;-1:-1:-1;;;;;26977:37:0;;;29279:241;;;;;;:::i;:::-;;:::i;27021:43::-;;;;;-1:-1:-1;;;;;27021:43:0;;;3046:201;;;;;;:::i;:::-;;:::i;40545:458::-;7139:21;:19;:21::i;:::-;40643:15:::1;::::0;:39:::1;::::0;-1:-1:-1;;;40643:39:0;;-1:-1:-1;;;;;589:32:1;;;40643:39:0::1;::::0;::::1;571:51:1::0;40643:15:0;;::::1;::::0;:23:::1;::::0;544:18:1;;40643:39:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44:::0;40635:98:::1;;;::::0;-1:-1:-1;;;40635:98:0;;3334:2:1;40635:98:0::1;::::0;::::1;3316:21:1::0;3373:2;3353:18;;;3346:30;3412:34;3392:18;;;3385:62;-1:-1:-1;;;3463:18:1;;;3456:39;3512:19;;40635:98:0::1;;;;;;;;;40810:15;::::0;:35:::1;::::0;-1:-1:-1;;;40810:35:0;;40767:10:::1;40810:35;::::0;::::1;571:51:1::0;;;40767:10:0;40746:18:::1;::::0;-1:-1:-1;;;;;40810:15:0;;::::1;::::0;:23:::1;::::0;544:18:1;;40810:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40788:57;;40864:14;40882:1;40864:19:::0;40856:62:::1;;;::::0;-1:-1:-1;;;40856:62:0;;3744:2:1;40856:62:0::1;::::0;::::1;3726:21:1::0;3783:2;3763:18;;;3756:30;3822:32;3802:18;;;3795:60;3872:18;;40856:62:0::1;3542:354:1::0;40856:62:0::1;40939:15;::::0;:54:::1;::::0;-1:-1:-1;;;40939:54:0;;-1:-1:-1;;;;;4093:32:1;;;40939:54:0::1;::::0;::::1;4075:51:1::0;4162:32;;;4142:18;;;4135:60;40939:15:0;;::::1;::::0;:27:::1;::::0;4048:18:1;;40939:54:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40619:384;;7183:20:::0;6577:1;7703:22;;7520:213;7183:20;40545:458;:::o;28806:230::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;28909:34:0;::::1;28901:62;;;;-1:-1:-1::0;;;28901:62:0::1;;;;;;;:::i;:::-;28974:11;:54:::0;;-1:-1:-1;;;;;;28974:54:0::1;-1:-1:-1::0;;;;;28974:54:0;;;::::1;::::0;;;::::1;::::0;;28806:230::o;35347:1287::-;7139:21;:19;:21::i;:::-;35445::::1;35469:25;:23;:25::i;:::-;35445:49;;35508:37;35527:13;35543:1;35508:18;:37::i;:::-;35578:2;35565:10;:15;35556:46;;;::::0;-1:-1:-1;;;35556:46:0;;4752:2:1;35556:46:0::1;::::0;::::1;4734:21:1::0;4791:2;4771:18;;;4764:30;-1:-1:-1;;;4810:18:1;;;4803:47;4867:18;;35556:46:0::1;4550:341:1::0;35556:46:0::1;35639:1;35622:13;:18;;35613:59;;;::::0;-1:-1:-1;;;35613:59:0;;5098:2:1;35613:59:0::1;::::0;::::1;5080:21:1::0;5137:2;5117:18;;;5110:30;5176:29;5156:18;;;5149:57;5223:18;;35613:59:0::1;4896:351:1::0;35613:59:0::1;35776:15;::::0;:63:::1;::::0;-1:-1:-1;;;35776:63:0;;35754:19:::1;::::0;-1:-1:-1;;;;;35776:15:0::1;::::0;:37:::1;::::0;:63:::1;::::0;35814:13;;35828:10;;35776:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35754:85;;35854:10;35868:1;35854:15:::0;35850:284:::1;;35959:15;:13:::0;35973:1:::1;35959:15;:::i;:::-;35941:14;:33;;35933:79;;;;-1:-1:-1::0;;;35933:79:0::1;;;;;;;:::i;:::-;35850:284;;;36071:13;36053:14;:31;;36045:77;;;;-1:-1:-1::0;;;36045:77:0::1;;;;;;;:::i;:::-;36185:15;::::0;-1:-1:-1;;;;;36185:15:0::1;:37;36223:13:::0;36238:10;36250:31:::1;36268:13:::0;36250:31;::::1;:::i;:::-;;;;36185:97;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;36354:15:0::1;::::0;:69:::1;::::0;-1:-1:-1;;;36354:69:0;;36335:16:::1;::::0;-1:-1:-1;;;;;;36354:15:0;;::::1;::::0;-1:-1:-1;36354:42:0::1;::::0;:69:::1;::::0;36397:13;;36412:10;;36354:69:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36434:15;::::0;36335:88;;-1:-1:-1;;;;;;36434:15:0::1;:42;36477:13:::0;36491:10;36502:25:::1;36514:13:::0;36335:88;36502:25:::1;:::i;:::-;36434:94;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;36539:15:0::1;::::0;:85:::1;::::0;-1:-1:-1;;;36539:85:0;;-1:-1:-1;;;;;36539:15:0;;::::1;::::0;-1:-1:-1;36539:43:0::1;::::0;-1:-1:-1;36539:85:0::1;::::0;36583:13;;36597:10;;36608:15:::1;::::0;36539:85:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35434:1200;;;7183:20:::0;6577:1;7703:22;;7520:213;7183:20;35347:1287;;:::o;43815:179::-;7139:21;:19;:21::i;:::-;43888:32:::1;43907:10;43918:1;43888:18;:32::i;:::-;43931:15;::::0;:55:::1;::::0;-1:-1:-1;;;43931:55:0;;43964:10:::1;43931:55;::::0;::::1;4075:51:1::0;43931:15:0::1;4142:18:1::0;;;4135:60;-1:-1:-1;;;;;43931:15:0;;::::1;::::0;:32:::1;::::0;4048:18:1;;43931:55:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7183:20:::0;6577:1;7703:22;;7520:213;7183:20;43815:179::o;39075:1021::-;7139:21;:19;:21::i;:::-;39343::::1;39367:25;:23;:25::i;:::-;39343:49;;39406:37;39425:13;39441:1;39406:18;:37::i;:::-;39456:17;39476:15;:9:::0;39488:3:::1;39476:15;:::i;:::-;39615:13;::::0;;:51:::1;::::0;-1:-1:-1;;;39615:51:0;;39456:35;;-1:-1:-1;39670:13:0;;-1:-1:-1;;;;;39615:13:0;;::::1;::::0;:23:::1;::::0;:51:::1;::::0;39639:13;;39456:35;;39615:51:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;39607:126;;;::::0;-1:-1:-1;;;39607:126:0;;6880:2:1;39607:126:0::1;::::0;::::1;6862:21:1::0;6919:2;6899:18;;;6892:30;6958:34;6938:18;;;6931:62;-1:-1:-1;;;7009:18:1;;;7002:43;7062:19;;39607:126:0::1;6678:409:1::0;39607:126:0::1;39766:13;::::0;;:62:::1;::::0;-1:-1:-1;;;39766:62:0;;-1:-1:-1;;;;;39766:13:0;;::::1;::::0;:18:::1;::::0;:62:::1;::::0;39785:13;;39800:12;;39814:13;;39766:62:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;39911:15:0::1;::::0;:63:::1;::::0;-1:-1:-1;;;39911:63:0;;39881:27:::1;::::0;-1:-1:-1;;;;;;39911:15:0;;::::1;::::0;-1:-1:-1;39911:37:0::1;::::0;:63:::1;::::0;39949:13;;39964:9;;39911:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39985:15;::::0;39881:93;;-1:-1:-1;;;;;;39985:15:0::1;:37;40023:13:::0;40038:9;40049:36:::1;40072:13:::0;39881:93;40049:36:::1;:::i;:::-;39985:101;;;;;;;;;;;;;;;;;:::i;40104:430::-:0;40162:28;;:::i;:::-;40192:33;;:::i;:::-;40228:18;40258:21;40282:25;:23;:25::i;:::-;40333:15;;:60;;-1:-1:-1;;;40333:60:0;;-1:-1:-1;;;;;589:32:1;;;40333:60:0;;;571:51:1;40258:49:0;;-1:-1:-1;40333:15:0;;;:45;;544:18:1;;40333:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40424:15;;:61;;-1:-1:-1;;;40424:61:0;;-1:-1:-1;;;;;589:32:1;;;40424:61:0;;;571:51:1;40318:75:0;;-1:-1:-1;40424:15:0;;;:46;;544:18:1;;40424:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40404:81;;40512:12;;40496:28;;40247:287;40104:430;;;:::o;43632:177::-;7139:21;:19;:21::i;:::-;43702:32:::1;43721:10;43732:1;43702:18;:32::i;:::-;43745:15;::::0;:56:::1;::::0;-1:-1:-1;;;43745:56:0;;43779:10:::1;43745:56;::::0;::::1;4075:51:1::0;43745:15:0::1;4142:18:1::0;;;4135:60;-1:-1:-1;;;;;43745:15:0;;::::1;::::0;:33:::1;::::0;4048:18:1;;43745:56:0::1;3901:300:1::0;41077:247:0;7139:21;:19;:21::i;:::-;41195:10:::1;41216:34;41195:10:::0;41248:1:::1;41216:18;:34::i;:::-;41261:15;::::0;:55:::1;::::0;-1:-1:-1;;;41261:55:0;;-1:-1:-1;;;;;4093:32:1;;;41261:55:0::1;::::0;::::1;4075:51:1::0;4162:32;;;4142:18;;;4135:60;41261:15:0;;::::1;::::0;:32:::1;::::0;4048:18:1;;41261:55:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41163:161;7183:20:::0;6577:1;7703:22;;7520:213;29528:257;2026:13;:11;:13::i;:::-;29685:1:::1;29661:21;:25;29653:62;;;::::0;-1:-1:-1;;;29653:62:0;;8526:2:1;29653:62:0::1;::::0;::::1;8508:21:1::0;8565:2;8545:18;;;8538:30;8604:26;8584:18;;;8577:54;8648:18;;29653:62:0::1;8324:348:1::0;29653:62:0::1;29726:51;::::0;29734:10:::1;::::0;29755:21:::1;29726:51:::0;::::1;;;::::0;::::1;::::0;;;29755:21;29734:10;29726:51;::::1;;;;;;;;;;;;;;;;;;37829:1238:::0;7139:21;:19;:21::i;:::-;37920::::1;37944:25;:23;:25::i;:::-;37920:49;;37983:37;38002:13;38018:1;37983:18;:37::i;:::-;38149:15;::::0;:40:::1;::::0;-1:-1:-1;;;38149:40:0;;-1:-1:-1;;;;;589:32:1;;;38149:40:0::1;::::0;::::1;571:51:1::0;38135:11:0::1;::::0;38149:15:::1;::::0;:25:::1;::::0;544:18:1;;38149:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38135:54;;38239:6;38231:5;:14;38223:53;;;::::0;-1:-1:-1;;;38223:53:0;;8879:2:1;38223:53:0::1;::::0;::::1;8861:21:1::0;8918:2;8898:18;;;8891:30;8957:28;8937:18;;;8930:56;9003:18;;38223:53:0::1;8677:350:1::0;38223:53:0::1;38318:15;::::0;:52:::1;::::0;-1:-1:-1;;;38318:52:0;;38289:26:::1;::::0;-1:-1:-1;;;;;38318:15:0::1;::::0;:30:::1;::::0;:52:::1;::::0;38349:13;;38364:5;;38318:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38389:13:::0;;38289:81;;-1:-1:-1;38381:57:0::1;;;::::0;-1:-1:-1;;;38381:57:0;;10004:2:1;38381:57:0::1;::::0;::::1;9986:21:1::0;10043:2;10023:18;;;10016:30;10082:29;10062:18;;;10055:57;10129:18;;38381:57:0::1;9802:351:1::0;38381:57:0::1;38477:15;::::0;:49:::1;::::0;-1:-1:-1;;;38477:49:0;;38451:23:::1;::::0;-1:-1:-1;;;;;38477:15:0::1;::::0;:27:::1;::::0;:49:::1;::::0;38505:13;;38520:5;;38477:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38451:75;;38571:1;38545:9;:22;;;:27;;38537:79;;;::::0;-1:-1:-1;;;38537:79:0;;11506:2:1;38537:79:0::1;::::0;::::1;11488:21:1::0;11545:2;11525:18;;;11518:30;11584:34;11564:18;;;11557:62;-1:-1:-1;;;11635:18:1;;;11628:37;11682:19;;38537:79:0::1;11304:403:1::0;38537:79:0::1;38683:16;::::0;38724:13;;38683:56:::1;::::0;-1:-1:-1;;;38683:56:0;;38743:13;;-1:-1:-1;;;;;38683:16:0::1;::::0;:26:::1;::::0;:56:::1;::::0;38710:13;;38683:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;38675:122;;;::::0;-1:-1:-1;;;38675:122:0;;11914:2:1;38675:122:0::1;::::0;::::1;11896:21:1::0;11953:2;11933:18;;;11926:30;11992:34;11972:18;;;11965:62;-1:-1:-1;;;12043:18:1;;;12036:34;12087:19;;38675:122:0::1;11712:400:1::0;38675:122:0::1;38808:16;::::0;38845:13;;38808:66:::1;::::0;-1:-1:-1;;;38808:66:0;;-1:-1:-1;;;;;38808:16:0;;::::1;::::0;:21:::1;::::0;:66:::1;::::0;38830:13;;38845;38860;;38808:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38975:13;38949:9;:22;;:39;;;;;;;:::i;:::-;::::0;;-1:-1:-1;38999:15:0::1;::::0;:60:::1;::::0;-1:-1:-1;;;38999:60:0;;-1:-1:-1;;;;;38999:15:0;;::::1;::::0;:27:::1;::::0;:60:::1;::::0;39027:13;;39042:5;;39049:9;;38999:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37909:1158;;;;7183:20:::0;6577:1;7703:22;;7520:213;44000:165;44116:15;;:41;;-1:-1:-1;;;44116:41:0;;-1:-1:-1;;;;;589:32:1;;;44116:41:0;;;571:51:1;44072:18:0;;44116:15;;:29;;544:18:1;;44116:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44103:54;44000:165;-1:-1:-1;;44000:165:0:o;41332:549::-;7139:21;:19;:21::i;:::-;41481:34:::1;41500:10;41513:1;41481:18;:34::i;:::-;41553:15;::::0;:41:::1;::::0;-1:-1:-1;;;41553:41:0;;-1:-1:-1;;;;;589:32:1;;;41553:41:0::1;::::0;::::1;571:51:1::0;41526:24:0::1;::::0;41553:15:::1;::::0;:29:::1;::::0;544:18:1;;41553:41:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41526:68:::0;-1:-1:-1;41626:10:0::1;-1:-1:-1::0;;;;;41655:30:0;::::1;::::0;::::1;41647:92;;;::::0;-1:-1:-1;;;41647:92:0;;13470:2:1;41647:92:0::1;::::0;::::1;13452:21:1::0;13509:2;13489:18;;;13482:30;13548:34;13528:18;;;13521:62;-1:-1:-1;;;13599:18:1;;;13592:47;13656:19;;41647:92:0::1;13268:413:1::0;41647:92:0::1;41817:15;::::0;:56:::1;::::0;-1:-1:-1;;;41817:56:0;;-1:-1:-1;;;;;4093:32:1;;;41817:56:0::1;::::0;::::1;4075:51:1::0;4162:32;;;4142:18;;;4135:60;41817:15:0;;::::1;::::0;:33:::1;::::0;4048:18:1;;41817:56:0::1;3901:300:1::0;33679:1660:0;7139:21;:19;:21::i;:::-;33769::::1;33793:25;:23;:25::i;:::-;33769:49;;33832:37;33851:13;33867:1;33832:18;:37::i;:::-;33911:15;::::0;:52:::1;::::0;-1:-1:-1;;;33911:52:0;;33882:26:::1;::::0;-1:-1:-1;;;;;33911:15:0::1;::::0;:30:::1;::::0;:52:::1;::::0;33942:13;;33957:5;;33911:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33982:13:::0;;33882:81;;-1:-1:-1;33974:59:0::1;;;::::0;-1:-1:-1;;;33974:59:0;;13888:2:1;33974:59:0::1;::::0;::::1;13870:21:1::0;13927:2;13907:18;;;13900:30;13966:31;13946:18;;;13939:59;14015:18;;33974:59:0::1;13686:353:1::0;33974:59:0::1;34072:15;::::0;:49:::1;::::0;-1:-1:-1;;;34072:49:0;;34046:23:::1;::::0;-1:-1:-1;;;;;34072:15:0::1;::::0;:27:::1;::::0;:49:::1;::::0;34100:13;;34115:5;;34072:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34046:75;;34166:13;34140:9;:22;;;:39;;34132:85;;;;-1:-1:-1::0;;;34132:85:0::1;;;;;;;:::i;:::-;34238:27;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34238:27:0::1;34276:30;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;34276:30:0::1;34317:26;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;34317:26:0::1;34386:13;34360:9;:22;;;:39:::0;34356:974:::1;;34493:15;::::0;:64:::1;::::0;-1:-1:-1;;;34493:64:0;;-1:-1:-1;;;;;34493:15:0;;::::1;::::0;:27:::1;::::0;:64:::1;::::0;34521:13;;34536:5;;34543:13;;34493:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;34572:15:0::1;::::0;:68:::1;::::0;-1:-1:-1;;;34572:68:0;;-1:-1:-1;;;;;34572:15:0;;::::1;::::0;-1:-1:-1;34572:30:0::1;::::0;-1:-1:-1;34572:68:0::1;::::0;34603:13;;34617:5;;34625:14;;34572:68:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;34655:15:0::1;::::0;:63:::1;::::0;-1:-1:-1;;;34655:63:0;;-1:-1:-1;;;;;34655:15:0;;::::1;::::0;-1:-1:-1;34655:27:0::1;::::0;-1:-1:-1;34655:63:0::1;::::0;34683:13;;34698:5;;34705:12;;34655:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;34733:15:0::1;::::0;:76:::1;::::0;-1:-1:-1;;;34733:76:0;;-1:-1:-1;;;;;34733:15:0;;::::1;::::0;-1:-1:-1;34733:39:0::1;::::0;-1:-1:-1;34733:76:0::1;::::0;34773:13;;34788:5;;34795:13;;34733:76:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;34872:16:0::1;::::0;34924:13;;34872:66:::1;::::0;-1:-1:-1;;;34872:66:0;;::::1;::::0;::::1;15280:25:1::0;;;-1:-1:-1;;;;;15341:32:1;;;15321:18;;;15314:60;15390:18;;;15383:34;;;;34872:16:0;::::1;::::0;-1:-1:-1;34872:21:0::1;::::0;-1:-1:-1;15253:18:1;;34872:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34356:974;;;35101:13;35075:9;:22;;:39;;;;;;;:::i;:::-;::::0;;-1:-1:-1;35129:15:0::1;::::0;:60:::1;::::0;-1:-1:-1;;;35129:60:0;;-1:-1:-1;;;;;35129:15:0;;::::1;::::0;:27:::1;::::0;:60:::1;::::0;35157:13;;35172:5;;35179:9;;35129:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;35252:16:0::1;::::0;35304:13;;35252:66:::1;::::0;-1:-1:-1;;;35252:66:0;;::::1;::::0;::::1;15280:25:1::0;;;-1:-1:-1;;;;;15341:32:1;;;15321:18;;;15314:60;15390:18;;;15383:34;;;;35252:16:0;::::1;::::0;-1:-1:-1;35252:21:0::1;::::0;-1:-1:-1;15253:18:1;;35252:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34356:974;33758:1581;;;;;;7183:20:::0;6577:1;7703:22;;7520:213;2788:103;2026:13;:11;:13::i;:::-;2853:30:::1;2880:1;2853:18;:30::i;36648:1171::-:0;7139:21;:19;:21::i;:::-;36727::::1;36751:25;:23;:25::i;:::-;36727:49;;36790:37;36809:13;36825:1;36790:18;:37::i;:::-;36858:15;::::0;:74:::1;::::0;-1:-1:-1;;;36858:74:0;;36840:15:::1;::::0;-1:-1:-1;;;;;36858:15:0::1;::::0;:43:::1;::::0;:74:::1;::::0;36902:13;;36916:15;;36858:74:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36840:92;;36983:12;;36970:10;:25;;;;:::i;:::-;36951:15;:44;;36943:72;;;::::0;-1:-1:-1;;;36943:72:0;;15630:2:1;36943:72:0::1;::::0;::::1;15612:21:1::0;15669:2;15649:18;;;15642:30;-1:-1:-1;;;15688:18:1;;;15681:45;15743:18;;36943:72:0::1;15428:339:1::0;36943:72:0::1;37149:15;::::0;:74:::1;::::0;-1:-1:-1;;;37149:74:0;;37130:16:::1;::::0;-1:-1:-1;;;;;37149:15:0::1;::::0;:42:::1;::::0;:74:::1;::::0;37192:13;;37207:15;;37149:74:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37130:93;;37256:1;37242:11;:15;37234:47;;;::::0;-1:-1:-1;;;37234:47:0;;15974:2:1;37234:47:0::1;::::0;::::1;15956:21:1::0;16013:2;15993:18;;;15986:30;-1:-1:-1;;;16032:18:1;;;16025:50;16092:18;;37234:47:0::1;15772:344:1::0;37234:47:0::1;37375:15;::::0;:75:::1;::::0;-1:-1:-1;;;37375:75:0;;-1:-1:-1;;;;;37375:15:0;;::::1;::::0;:42:::1;::::0;:75:::1;::::0;37418:13;;37432:15;;37375::::1;::::0;:75:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;37461:15:0::1;::::0;:76:::1;::::0;-1:-1:-1;;;37461:76:0;;-1:-1:-1;;;;;37461:15:0;;::::1;::::0;-1:-1:-1;37461:43:0::1;::::0;-1:-1:-1;37461:76:0::1;::::0;37505:13;;37519:15;;37461::::1;::::0;:76:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37612:11;37719:15;37737:3;37719:21;;;;:::i;:::-;37751:13;::::0;;:54:::1;::::0;-1:-1:-1;;;37751:54:0;;;;::::1;15280:25:1::0;;;-1:-1:-1;;;;;15341:32:1;;;15321:18;;;15314:60;15390:18;;;15383:34;;;37710:30:0;;-1:-1:-1;37751:13:0;;;::::1;::::0;:18:::1;::::0;15253::1;;37751:54:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36716:1103;;;;7183:20:::0;6577:1;7703:22;;7520:213;30946:441;31197:15;;:42;;-1:-1:-1;;;31197:42:0;;31228:10;31197:42;;;571:51:1;31002:7:0;;;;-1:-1:-1;;;;;31197:15:0;;;;:30;;544:18:1;;31197:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31173:66;-1:-1:-1;;;;;;31254:27:0;;31250:130;;31305:10;31298:17;;;30946:441;:::o;31250:130::-;31355:13;30946:441;-1:-1:-1;30946:441:0:o;29042:231::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;29146:34:0;::::1;29138:62;;;;-1:-1:-1::0;;;29138:62:0::1;;;;;;;:::i;:::-;29211:13;:54:::0;;-1:-1:-1;;;;;;29211:54:0::1;-1:-1:-1::0;;;;;29211:54:0;;;::::1;::::0;;;::::1;::::0;;29042:231::o;28566:234::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;28673:34:0;::::1;28665:62;;;;-1:-1:-1::0;;;28665:62:0::1;;;;;;;:::i;:::-;28738:15;:54:::0;;-1:-1:-1;;;;;;28738:54:0::1;-1:-1:-1::0;;;;;28738:54:0;;;::::1;::::0;;;::::1;::::0;;28566:234::o;31484:2139::-;7139:21;:19;:21::i;:::-;31569::::1;31593:25;:23;:25::i;:::-;31569:49;;31632:37;31651:13;31667:1;31632:18;:37::i;:::-;31764:15;::::0;:40:::1;::::0;-1:-1:-1;;;31764:40:0;;-1:-1:-1;;;;;589:32:1;;;31764:40:0::1;::::0;::::1;571:51:1::0;31750:11:0::1;::::0;31764:15:::1;::::0;:25:::1;::::0;544:18:1;;31764:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31750:54;;31854:6;31846:5;:14;31838:53;;;::::0;-1:-1:-1;;;31838:53:0;;8879:2:1;31838:53:0::1;::::0;::::1;8861:21:1::0;8918:2;8898:18;;;8891:30;8957:28;8937:18;;;8930:56;9003:18;;31838:53:0::1;8677:350:1::0;31838:53:0::1;31941:15;::::0;:52:::1;::::0;-1:-1:-1;;;31941:52:0;;31912:26:::1;::::0;-1:-1:-1;;;;;31941:15:0::1;::::0;:30:::1;::::0;:52:::1;::::0;31972:13;;31987:5;;31941:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32012:13:::0;;31912:81;;-1:-1:-1;32012:18:0;32004:55:::1;;;::::0;-1:-1:-1;;;32004:55:0;;16681:2:1;32004:55:0::1;::::0;::::1;16663:21:1::0;16720:2;16700:18;;;16693:30;16759:26;16739:18;;;16732:54;16803:18;;32004:55:0::1;16479:348:1::0;32004:55:0::1;32118:16;::::0;:48:::1;::::0;-1:-1:-1;;;32118:48:0;;32170:1:::1;::::0;-1:-1:-1;;;;;32118:16:0::1;::::0;:26:::1;::::0;:48:::1;::::0;32145:13;;32159:6;;32118:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;32110:109;;;::::0;-1:-1:-1;;;32110:109:0;;17034:2:1;32110:109:0::1;::::0;::::1;17016:21:1::0;17073:2;17053:18;;;17046:30;17112:34;17092:18;;;17085:62;-1:-1:-1;;;17163:18:1;;;17156:41;17214:19;;32110:109:0::1;16832:407:1::0;32110:109:0::1;32230:16;::::0;:47:::1;::::0;-1:-1:-1;;;32230:47:0;;-1:-1:-1;;;;;32230:16:0;;::::1;::::0;:21:::1;::::0;:47:::1;::::0;32252:13;;32267:6;;32230:16;;:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;32384:155:0::1;::::0;;::::1;::::0;::::1;::::0;;32397:4:::1;32384:155:::0;;32411:3:::1;32384:155;::::0;::::1;::::0;;;32425:2:::1;32384:155:::0;;;;;;;;;;;;;;32474:1:::1;32384:155:::0;;;;32484:11:::1;::::0;:42;;-1:-1:-1;;;32484:42:0;;::::1;::::0;::::1;17748:25:1::0;;;-1:-1:-1;;;32384:155:0;;-1:-1:-1;32384:155:0;;;;-1:-1:-1;;;;;32484:11:0::1;::::0;:34:::1;::::0;17721:18:1;;32484:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32384:155:::0;;32536:1:::1;32384:155;::::0;;::::1;::::0;32563:11:::1;::::0;:44:::1;::::0;-1:-1:-1;;;32563:44:0;;::::1;::::0;::::1;17748:25:1::0;;;32359:180:0;;-1:-1:-1;;;;;;32563:11:0::1;::::0;:36:::1;::::0;17721:18:1;;32563:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32550:57;;32622:10;:16;;;32642:1;32622:21:::0;32618:79:::1;;32660:16;::::0;::::1;:25:::0;;;32618:79:::1;32707:22;32733:114;;;;;;;;32747:1;32733:114;;;;27925:8;32759:15;:37;;;;:::i;:::-;32733:114:::0;;::::1;;32806:39;27996:7;32806:15;:39;:::i;:::-;32733:114:::0;;32860:15:::1;::::0;:59:::1;::::0;-1:-1:-1;;;32860:59:0;;32707:140;;-1:-1:-1;;;;;;32860:15:0::1;::::0;:27:::1;::::0;:59:::1;::::0;32888:13;;32903:5;;32910:8;;32860:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;32930:15:0::1;::::0;:64:::1;::::0;-1:-1:-1;;;32930:64:0;;-1:-1:-1;;;;;32930:15:0;;::::1;::::0;-1:-1:-1;32930:30:0::1;::::0;-1:-1:-1;32930:64:0::1;::::0;32961:13;;32975:5;;32983:10;;32930:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;33005:15:0::1;::::0;:59:::1;::::0;-1:-1:-1;;;33005:59:0;;-1:-1:-1;;;;;33005:15:0;;::::1;::::0;-1:-1:-1;33005:27:0::1;::::0;-1:-1:-1;33005:59:0::1;::::0;33033:13;;33048:5;;33055:8;;33005:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;33075:15:0::1;::::0;33137:11:::1;::::0;33161:13;;33137:38:::1;::::0;-1:-1:-1;;;33137:38:0;;::::1;::::0;::::1;17748:25:1::0;;;;-1:-1:-1;;;;;33075:15:0;;::::1;::::0;-1:-1:-1;33075:39:0::1;::::0;-1:-1:-1;33115:13:0;;33130:5;;33137:11:::1;::::0;:23:::1;::::0;17721:18:1;;33137:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33075:101;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;33333:15:0::1;::::0;:40:::1;::::0;-1:-1:-1;;;33333:40:0;;-1:-1:-1;;;;;589:32:1;;;33333:40:0::1;::::0;::::1;571:51:1::0;33318:12:0::1;::::0;-1:-1:-1;33333:15:0;;::::1;::::0;-1:-1:-1;33333:25:0::1;::::0;544:18:1;;33333:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33462:13:::0;;33318:55;;-1:-1:-1;33462:19:0::1;::::0;33476:5:::1;::::0;33462:19:::1;:::i;:::-;33494:15;::::0;:48:::1;::::0;-1:-1:-1;;;33494:48:0;;33456:1:::1;:26:::0;;::::1;33444:39:::0;;;::::1;::::0;-1:-1:-1;;;;;33494:15:0::1;::::0;:25:::1;::::0;:48:::1;::::0;33520:13;;33444:39;;33494:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33568:47;33586:8;33595:10;33606:8;33568:47;;;;;;;;:::i;:::-;;;;;;;;31558:2065;;;;;;7183:20:::0;6577:1;7703:22;;7520:213;44171:182;44303:15;;:42;;-1:-1:-1;;;44303:42:0;;-1:-1:-1;;;;;589:32:1;;;44303:42:0;;;571:51:1;44241:27:0;;44303:15;;:30;;544:18:1;;44303:42:0;402:226:1;29868:112:0;2026:13;:11;:13::i;:::-;29949:12:::1;:23:::0;29868:112::o;42088:1530::-;7139:21;:19;:21::i;:::-;42224:22:::1;42249:31;42269:10;42249:19;:31::i;:::-;42224:56:::0;-1:-1:-1;;;;;;42299:28:0;::::1;42291:87;;;::::0;-1:-1:-1;;;42291:87:0;;18709:2:1;42291:87:0::1;::::0;::::1;18691:21:1::0;18748:2;18728:18;;;18721:30;18787:34;18767:18;;;18760:62;-1:-1:-1;;;18838:18:1;;;18831:44;18892:19;;42291:87:0::1;18507:410:1::0;42291:87:0::1;42506:15;::::0;:45:::1;::::0;-1:-1:-1;;;42506:45:0;;-1:-1:-1;;;;;589:32:1;;;42506:45:0::1;::::0;::::1;571:51:1::0;42480:23:0::1;::::0;42506:15:::1;::::0;:29:::1;::::0;544:18:1;;42506:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42480:71:::0;-1:-1:-1;;;;;;42570:29:0;::::1;42589:10;42570:29;42562:92;;;::::0;-1:-1:-1;;;42562:92:0;;19124:2:1;42562:92:0::1;::::0;::::1;19106:21:1::0;19163:2;19143:18;;;19136:30;19202:34;19182:18;;;19175:62;-1:-1:-1;;;19253:18:1;;;19246:48;19311:19;;42562:92:0::1;18922:414:1::0;42562:92:0::1;42726:15;::::0;:35:::1;::::0;-1:-1:-1;;;42726:35:0;;42750:10:::1;42726:35;::::0;::::1;571:51:1::0;42708:15:0::1;::::0;-1:-1:-1;;;;;42726:15:0::1;::::0;:23:::1;::::0;544:18:1;;42726:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42791:15;::::0;:39:::1;::::0;-1:-1:-1;;;42791:39:0;;-1:-1:-1;;;;;589:32:1;;;42791:39:0::1;::::0;::::1;571:51:1::0;42708:53:0;;-1:-1:-1;42772:16:0::1;::::0;42791:15;;::::1;::::0;:23:::1;::::0;544:18:1;;42791:39:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42772:58;;42987:10;43001:1;42987:15:::0;42979:65:::1;;;::::0;-1:-1:-1;;;42979:65:0;;19543:2:1;42979:65:0::1;::::0;::::1;19525:21:1::0;19582:2;19562:18;;;19555:30;19621:34;19601:18;;;19594:62;-1:-1:-1;;;19672:18:1;;;19665:35;19717:19;;42979:65:0::1;19341:401:1::0;42979:65:0::1;43063:11;43078:1;43063:16:::0;43055:65:::1;;;::::0;-1:-1:-1;;;43055:65:0;;19949:2:1;43055:65:0::1;::::0;::::1;19931:21:1::0;19988:2;19968:18;;;19961:30;20027:34;20007:18;;;20000:62;-1:-1:-1;;;20078:18:1;;;20071:34;20122:19;;43055:65:0::1;19747:400:1::0;43055:65:0::1;43216:15;::::0;:56:::1;::::0;-1:-1:-1;;;43216:56:0;;-1:-1:-1;;;;;43216:15:0;;::::1;::::0;:26:::1;::::0;:56:::1;::::0;43243:15;;43260:11;;43216:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;43283:15:0::1;::::0;:61:::1;::::0;-1:-1:-1;;;43283:61:0;;::::1;::::0;::::1;20326:25:1::0;;;-1:-1:-1;;;;;20387:32:1;;;20367:18;;;20360:60;43283:15:0;;::::1;::::0;-1:-1:-1;43283:30:0::1;::::0;-1:-1:-1;20299:18:1;;43283:61:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;43357:15:0::1;::::0;:54:::1;::::0;-1:-1:-1;;;43357:54:0;;-1:-1:-1;;;;;43357:15:0;;::::1;::::0;-1:-1:-1;43357:26:0::1;::::0;-1:-1:-1;43357:54:0::1;::::0;43384:14;;43400:10;;43357:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;43422:15:0::1;::::0;:59:::1;::::0;-1:-1:-1;;;43422:59:0;;::::1;::::0;::::1;20326:25:1::0;;;-1:-1:-1;;;;;20387:32:1;;;20367:18;;;20360:60;43422:15:0;;::::1;::::0;-1:-1:-1;43422:30:0::1;::::0;-1:-1:-1;20299:18:1;;43422:59:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;43542:68:0::1;::::0;;20605:25:1;;;20661:2;20646:18;;20639:34;;;-1:-1:-1;;;;;43542:68:0;;::::1;::::0;-1:-1:-1;43542:68:0;::::1;::::0;-1:-1:-1;43542:68:0::1;::::0;20578:18:1;43542:68:0::1;;;;;;;42149:1469;;;;7183:20:::0;6577:1;7703:22;;7520:213;29279:241;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;29387:34:0;::::1;29379:62;;;;-1:-1:-1::0;;;29379:62:0::1;;;;;;;:::i;:::-;29452:16;:60:::0;;-1:-1:-1;;;;;;29452:60:0::1;-1:-1:-1::0;;;;;29452:60:0;;;::::1;::::0;;;::::1;::::0;;29279:241::o;3046:201::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;3135:22:0;::::1;3127:73;;;::::0;-1:-1:-1;;;3127:73:0;;20886:2:1;3127:73:0::1;::::0;::::1;20868:21:1::0;20925:2;20905:18;;;20898:30;20964:34;20944:18;;;20937:62;-1:-1:-1;;;21015:18:1;;;21008:36;21061:19;;3127:73:0::1;20684:402:1::0;3127:73:0::1;3211:28;3230:8;3211:18;:28::i;7219:293::-:0;6621:1;7353:7;;:19;7345:63;;;;-1:-1:-1;;;7345:63:0;;21293:2:1;7345:63:0;;;21275:21:1;21332:2;21312:18;;;21305:30;21371:33;21351:18;;;21344:61;21422:18;;7345:63:0;21091:355:1;7345:63:0;6621:1;7486:7;:18;7219:293::o;2305:132::-;2186:7;2213:6;-1:-1:-1;;;;;2213:6:0;765:10;2369:23;2361:68;;;;-1:-1:-1;;;2361:68:0;;21653:2:1;2361:68:0;;;21635:21:1;;;21672:18;;;21665:30;21731:34;21711:18;;;21704:62;21783:18;;2361:68:0;21451:356:1;30483:441:0;-1:-1:-1;;;;;30787:22:0;;;;;;:14;:22;;;;;;30813:11;;30769:40;;:15;:40;:::i;:::-;:55;;30761:104;;;;-1:-1:-1;;;30761:104:0;;22014:2:1;30761:104:0;;;21996:21:1;22053:2;22033:18;;;22026:30;22092:34;22072:18;;;22065:62;-1:-1:-1;;;22143:18:1;;;22136:35;22188:19;;30761:104:0;21812:401:1;30761:104:0;-1:-1:-1;;;;;;30876:22:0;;;;;:14;:22;;;;;30901:15;30876:40;;30483:441::o;3407:191::-;3481:16;3500:6;;-1:-1:-1;;;;;3517:17:0;;;-1:-1:-1;;;;;;3517:17:0;;;;;;3550:40;;3500:6;;;;;;;3550:40;;3481:16;3550:40;3470:128;3407:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;:::-;386:5;150:247;-1:-1:-1;;;150:247:1:o;633:346::-;701:6;709;762:2;750:9;741:7;737:23;733:32;730:52;;;778:1;775;768:12;730:52;-1:-1:-1;;823:23:1;;;943:2;928:18;;;915:32;;-1:-1:-1;633:346:1:o;984:303::-;1077:5;1100:1;1110:171;1124:4;1121:1;1118:11;1110:171;;;1183:13;;1171:26;;1226:4;1217:14;;;;1254:17;;;;1144:1;1137:9;1110:171;;;1114:3;;984:303;;:::o;1292:457::-;1578:4;1563:20;;1592:43;1567:9;1617:6;1592:43;:::i;:::-;1644:54;1692:4;1681:9;1677:20;1669:6;1644:54;:::i;:::-;1736:6;1729:4;1718:9;1714:20;1707:36;1292:457;;;;;;:::o;2197:226::-;2256:6;2309:2;2297:9;2288:7;2284:23;2280:32;2277:52;;;2325:1;2322;2315:12;2277:52;-1:-1:-1;2370:23:1;;2197:226;-1:-1:-1;2197:226:1:o;2897:230::-;2967:6;3020:2;3008:9;2999:7;2995:23;2991:32;2988:52;;;3036:1;3033;3026:12;2988:52;-1:-1:-1;3081:16:1;;2897:230;-1:-1:-1;2897:230:1:o;4206:339::-;4408:2;4390:21;;;4447:2;4427:18;;;4420:30;-1:-1:-1;;;4481:2:1;4466:18;;4459:45;4536:2;4521:18;;4206:339::o;5252:274::-;-1:-1:-1;;;;;5444:32:1;;;;5426:51;;5508:2;5493:18;;5486:34;5414:2;5399:18;;5252:274::o;5531:127::-;5592:10;5587:3;5583:20;5580:1;5573:31;5623:4;5620:1;5613:15;5647:4;5644:1;5637:15;5663:125;5728:9;;;5749:10;;;5746:36;;;5762:18;;:::i;5793:397::-;5995:2;5977:21;;;6034:2;6014:18;;;6007:30;6073:34;6068:2;6053:18;;6046:62;-1:-1:-1;;;6139:2:1;6124:18;;6117:31;6180:3;6165:19;;5793:397::o;6195:128::-;6262:9;;;6283:11;;;6280:37;;;6297:18;;:::i;6328:345::-;-1:-1:-1;;;;;6548:32:1;;;;6530:51;;6612:2;6597:18;;6590:34;;;;6655:2;6640:18;;6633:34;6518:2;6503:18;;6328:345::o;7092:127::-;7153:10;7148:3;7144:20;7141:1;7134:31;7184:4;7181:1;7174:15;7208:4;7205:1;7198:15;7224:247;7291:2;7285:9;7333:3;7321:16;;7367:18;7352:34;;7388:22;;;7349:62;7346:88;;;7414:18;;:::i;:::-;7450:2;7443:22;7224:247;:::o;7476:843::-;7570:6;7623:4;7611:9;7602:7;7598:23;7594:34;7591:54;;;7641:1;7638;7631:12;7591:54;7690:7;7683:4;7672:9;7668:20;7664:34;7654:62;;7712:1;7709;7702:12;7654:62;7765:2;7759:9;7807:4;7795:17;;7842:18;7827:34;;7863:22;;;7824:62;7821:88;;;7889:18;;:::i;:::-;7925:2;7918:22;7960:6;8004:4;7989:20;;8021:19;;;8018:39;;;8053:1;8050;8043:12;8018:39;8077:9;8095:193;8111:6;8106:3;8103:15;8095:193;;;8203:10;;8226:18;;8273:4;8264:14;;;;8128;8095:193;;;-1:-1:-1;8307:6:1;;7476:843;-1:-1:-1;;;;;7476:843:1:o;9032:765::-;9125:6;9185:2;9173:9;9164:7;9160:23;9156:32;9200:2;9197:22;;;9215:1;9212;9205:12;9197:22;-1:-1:-1;9284:2:1;9278:9;9326:2;9314:15;;9359:18;9344:34;;9380:22;;;9341:62;9338:88;;;9406:18;;:::i;:::-;9442:2;9435:22;;;9498:16;;9523:21;;9610:2;9595:18;;;9589:25;9630:15;;;9623:32;9706:18;;;9700:25;9741:15;;;9734:32;;;;-1:-1:-1;9530:6:1;9032:765;-1:-1:-1;9032:765:1:o;10158:1141::-;10249:6;10309:3;10297:9;10288:7;10284:23;10280:33;10325:2;10322:22;;;10340:1;10337;10330:12;10322:22;-1:-1:-1;10382:17:1;;:::i;:::-;10444:16;;10469:22;;10557:2;10542:18;;;10536:25;10577:14;;;10570:31;10667:2;10652:18;;;10646:25;10687:14;;;10680:31;10777:2;10762:18;;;10756:25;10797:14;;;10790:31;10887:3;10872:19;;;10866:26;10908:15;;;10901:32;10999:3;10984:19;;;10978:26;11020:15;;;11013:32;11111:3;11096:19;;;11090:26;11132:15;;;11125:32;11223:3;11208:19;;;11202:26;11244:15;;;11237:32;;;;-1:-1:-1;10476:5:1;10158:1141;-1:-1:-1;10158:1141:1:o;12117:481::-;12193:5;12187:12;12182:3;12175:25;12249:4;12242:5;12238:16;12232:23;12225:4;12220:3;12216:14;12209:47;12305:4;12298:5;12294:16;12288:23;12281:4;12276:3;12272:14;12265:47;12361:4;12354:5;12350:16;12344:23;12337:4;12332:3;12328:14;12321:47;12417:4;12410:5;12406:16;12400:23;12393:4;12388:3;12384:14;12377:47;12473:4;12466:5;12462:16;12456:23;12449:4;12444:3;12440:14;12433:47;12529:4;12522:5;12518:16;12512:23;12505:4;12500:3;12496:14;12489:47;12585:4;12578:5;12574:16;12568:23;12561:4;12556:3;12552:14;12545:47;;;12117:481::o;12603:404::-;-1:-1:-1;;;;;12866:32:1;;12848:51;;12930:2;12915:18;;12908:34;;;12835:3;12820:19;;12951:50;12997:2;12982:18;;12974:6;12951:50;:::i;:::-;12603:404;;;;;;:::o;13012:251::-;13082:6;13135:2;13123:9;13114:7;13110:23;13106:32;13103:52;;;13151:1;13148;13141:12;13103:52;13183:9;13177:16;13202:31;13227:5;13202:31;:::i;14252:410::-;-1:-1:-1;;;;;14519:32:1;;14501:51;;14583:2;14568:18;;14561:34;;;14488:3;14473:19;;14604:52;14652:2;14637:18;;14629:6;14116:12;;14104:25;;14178:4;14167:16;;;14161:23;14145:14;;;14138:47;14234:4;14223:16;;;14217:23;14201:14;;14194:47;14044:203;17784:209;17816:1;17842;17832:132;;17886:10;17881:3;17877:20;17874:1;17867:31;17921:4;17918:1;17911:15;17949:4;17946:1;17939:15;17832:132;-1:-1:-1;17978:9:1;;17784:209::o;17998:504::-;18318:3;18303:19;;18331:41;18307:9;18354:6;18331:41;:::i;:::-;14116:12;;18429:3;18414:19;;14104:25;14178:4;14167:16;;14161:23;14145:14;;;14138:47;14234:4;14223:16;;14217:23;14201:14;;;14194:47;14116:12;;18491:3;18476:19;;14104:25;14178:4;14167:16;;14161:23;14145:14;;;14138:47;14234:4;14223:16;;14217:23;14201:14;;;14194:47;18443:53;14044:203
Swarm Source
ipfs://2ce08b48e7f99c93a6a6d18d47aaa7b75abcf2a73a0c8c5515afba99f7dc0c47
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.