- Contract name:
- UserStorage
- Optimization enabled
- true
- Compiler version
- v0.8.11+commit.d7f03943
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2022-06-19 09:54:34.268375Z
Contract source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
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/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.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 Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
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);
}
}
contract UserStorage is Ownable {
struct User {
address userAddr;
string avatar;
string email;
uint isOnline;
uint userFlag;
uint256 credit;
uint regTime;
TradeStats tradeStats;
MorgageStats morgageStats;
}
struct TradeStats {
uint256 tradeTotal;
uint256 restTotal;
}
struct MorgageStats {
uint256 mortgage;
uint256 freezeMortgage;
uint256 relieveMortgage;
uint256 inviteUserCount;
uint256 inviteUserReward;
uint applyRelieveTime;
uint handleRelieveTime;
}
mapping (address => User) public users;
mapping (address => uint256) public userIndex;
User[] public userList;
event addUser(address _userAddr);
event updateUser(string _avatar, string _email, uint _isOnline);
address _restCAddr;
address _orderCAddr;
address _recordCAddr;
address _appealCAddr;
modifier onlyAuthFromAddr() {
require(_restCAddr != address(0), 'Invalid address call rest');
require(_orderCAddr != address(0), 'Invalid address call order');
require(_recordCAddr != address(0), 'Invalid address call record');
require(_appealCAddr != address(0), 'Invalid address call appeal');
_;
}
function authFromContract(address _fromRest, address _fromOrder, address _fromRecord, address _fromAppeal) external onlyOwner {
_restCAddr = _fromRest;
_orderCAddr = _fromOrder;
_recordCAddr = _fromRecord;
_appealCAddr = _fromAppeal;
}
modifier onlyMemberOf() {
require(users[msg.sender].userAddr != address(0), 'has no permission');
_;
}
function _insert(address _addr) internal {
require(_addr != address(0), "UserStorage: addr null is not allowed");
require(users[_addr].userAddr == address(0), "UserStorage: current User exist");
TradeStats memory tradeStats = TradeStats({tradeTotal:0, restTotal:0});
MorgageStats memory morgageStats = MorgageStats({mortgage:0, freezeMortgage:0, relieveMortgage: 0, inviteUserCount:0, inviteUserReward:0, applyRelieveTime:0, handleRelieveTime:0});
User memory u = User({userAddr:_addr, avatar: '', email:'',
isOnline:1, userFlag:0, credit:0, regTime:block.timestamp,tradeStats:tradeStats, morgageStats:morgageStats});
users[_addr] = u;
userList.push(u);
userIndex[_addr] = userList.length -1;
emit addUser(_addr);
}
function _updateInfo(address _addr, string memory _avatar, string memory _email, uint _isOnline) internal {
require(_addr != address(0), "UserStorage: _addr null is not allowed");
require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
User memory u = users[_addr];
if(bytes(_avatar).length != 0){
u.avatar = _avatar;
}
if(bytes(_email).length != 0){
u.email = _email;
}
if(_isOnline != uint(0)){
u.isOnline = _isOnline;
}
users[_addr] = u;
userList[userIndex[_addr]] = u;
}
function _updateTradeStats(address _addr, TradeStats memory _tradeStats, uint _credit) internal {
require(_addr != address(0), "UserStorage: _addr null is not allowed");
require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
User memory u = users[_addr];
u.credit = _credit;
u.tradeStats.tradeTotal = _tradeStats.tradeTotal;
u.tradeStats.restTotal = _tradeStats.restTotal;
users[_addr] = u;
userList[userIndex[_addr]] = u;
}
function _updateMorgageStats(address _addr, MorgageStats memory _morgageStats) internal {
require(_addr != address(0), "UserStorage: _addr null is not allowed");
require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
User memory u = users[_addr];
u.morgageStats.mortgage = _morgageStats.mortgage;
u.morgageStats.freezeMortgage = _morgageStats.freezeMortgage;
u.morgageStats.relieveMortgage = _morgageStats.relieveMortgage;
u.morgageStats.inviteUserCount = _morgageStats.inviteUserCount;
u.morgageStats.inviteUserReward = _morgageStats.inviteUserReward;
u.morgageStats.applyRelieveTime = _morgageStats.applyRelieveTime;
u.morgageStats.handleRelieveTime = _morgageStats.handleRelieveTime;
users[_addr] = u;
userList[userIndex[_addr]] = u;
}
function _search(address _addr) internal view returns(User memory user) {
require(_addr != address(0), "UserStorage: _addr null is not allowed");
require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
User memory a = users[_addr];
return a;
}
function register() external {
require(!isMemberOf(), 'has registed');
_insert(msg.sender);
}
function isMemberOf() public view returns (bool) {
return (users[msg.sender].userAddr != address(0));
}
function updateInfo(string memory _avatar, string memory _email, uint _isOnline) onlyMemberOf external {
_updateInfo(msg.sender, _avatar, _email, _isOnline);
emit updateUser(_avatar, _email, _isOnline);
}
function updateTradeStats(address _addr, TradeStats memory _tradeStats, uint _credit) onlyAuthFromAddr public {
require(msg.sender == _restCAddr || msg.sender == _orderCAddr || msg.sender == _appealCAddr || msg.sender == _recordCAddr, 'UserStorage:Invalid from contract address');
_updateTradeStats(_addr, _tradeStats, _credit);
}
function updateMorgageStats(address _addr, MorgageStats memory _morgageStats) onlyAuthFromAddr public {
require(msg.sender == _recordCAddr, 'UserStorage:Invalid from contract address');
_updateMorgageStats(_addr, _morgageStats);
}
function updateUserRole(address _addr, uint _userFlag) onlyAuthFromAddr public {
require(msg.sender == _recordCAddr, 'UserStorage:Invalid from contract address');
require(_addr != address(0), "UserStorage: _addr null is not allowed");
require(users[_addr].userAddr != address(0), "UserStorage: current User not exist");
require(_userFlag<=3, 'UserStorage: Invalid userFlag 3');
User memory u = users[_addr];
u.userFlag = _userFlag;
users[_addr] = u;
userList[userIndex[_addr]] = u;
}
function searchUser(address _addr) external view returns(User memory user) {
return _search(_addr);
}
function searchUserList() external view returns(User[] memory) {
return userList;
}
}
Contract ABI
[{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"addUser","inputs":[{"type":"address","name":"_userAddr","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"updateUser","inputs":[{"type":"string","name":"_avatar","internalType":"string","indexed":false},{"type":"string","name":"_email","internalType":"string","indexed":false},{"type":"uint256","name":"_isOnline","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"authFromContract","inputs":[{"type":"address","name":"_fromRest","internalType":"address"},{"type":"address","name":"_fromOrder","internalType":"address"},{"type":"address","name":"_fromRecord","internalType":"address"},{"type":"address","name":"_fromAppeal","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isMemberOf","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"register","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"user","internalType":"struct UserStorage.User","components":[{"type":"address","name":"userAddr","internalType":"address"},{"type":"string","name":"avatar","internalType":"string"},{"type":"string","name":"email","internalType":"string"},{"type":"uint256","name":"isOnline","internalType":"uint256"},{"type":"uint256","name":"userFlag","internalType":"uint256"},{"type":"uint256","name":"credit","internalType":"uint256"},{"type":"uint256","name":"regTime","internalType":"uint256"},{"type":"tuple","name":"tradeStats","internalType":"struct UserStorage.TradeStats","components":[{"type":"uint256","name":"tradeTotal","internalType":"uint256"},{"type":"uint256","name":"restTotal","internalType":"uint256"}]},{"type":"tuple","name":"morgageStats","internalType":"struct UserStorage.MorgageStats","components":[{"type":"uint256","name":"mortgage","internalType":"uint256"},{"type":"uint256","name":"freezeMortgage","internalType":"uint256"},{"type":"uint256","name":"relieveMortgage","internalType":"uint256"},{"type":"uint256","name":"inviteUserCount","internalType":"uint256"},{"type":"uint256","name":"inviteUserReward","internalType":"uint256"},{"type":"uint256","name":"applyRelieveTime","internalType":"uint256"},{"type":"uint256","name":"handleRelieveTime","internalType":"uint256"}]}]}],"name":"searchUser","inputs":[{"type":"address","name":"_addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct UserStorage.User[]","components":[{"type":"address","name":"userAddr","internalType":"address"},{"type":"string","name":"avatar","internalType":"string"},{"type":"string","name":"email","internalType":"string"},{"type":"uint256","name":"isOnline","internalType":"uint256"},{"type":"uint256","name":"userFlag","internalType":"uint256"},{"type":"uint256","name":"credit","internalType":"uint256"},{"type":"uint256","name":"regTime","internalType":"uint256"},{"type":"tuple","name":"tradeStats","internalType":"struct UserStorage.TradeStats","components":[{"type":"uint256","name":"tradeTotal","internalType":"uint256"},{"type":"uint256","name":"restTotal","internalType":"uint256"}]},{"type":"tuple","name":"morgageStats","internalType":"struct UserStorage.MorgageStats","components":[{"type":"uint256","name":"mortgage","internalType":"uint256"},{"type":"uint256","name":"freezeMortgage","internalType":"uint256"},{"type":"uint256","name":"relieveMortgage","internalType":"uint256"},{"type":"uint256","name":"inviteUserCount","internalType":"uint256"},{"type":"uint256","name":"inviteUserReward","internalType":"uint256"},{"type":"uint256","name":"applyRelieveTime","internalType":"uint256"},{"type":"uint256","name":"handleRelieveTime","internalType":"uint256"}]}]}],"name":"searchUserList","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateInfo","inputs":[{"type":"string","name":"_avatar","internalType":"string"},{"type":"string","name":"_email","internalType":"string"},{"type":"uint256","name":"_isOnline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMorgageStats","inputs":[{"type":"address","name":"_addr","internalType":"address"},{"type":"tuple","name":"_morgageStats","internalType":"struct UserStorage.MorgageStats","components":[{"type":"uint256","name":"mortgage","internalType":"uint256"},{"type":"uint256","name":"freezeMortgage","internalType":"uint256"},{"type":"uint256","name":"relieveMortgage","internalType":"uint256"},{"type":"uint256","name":"inviteUserCount","internalType":"uint256"},{"type":"uint256","name":"inviteUserReward","internalType":"uint256"},{"type":"uint256","name":"applyRelieveTime","internalType":"uint256"},{"type":"uint256","name":"handleRelieveTime","internalType":"uint256"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateTradeStats","inputs":[{"type":"address","name":"_addr","internalType":"address"},{"type":"tuple","name":"_tradeStats","internalType":"struct UserStorage.TradeStats","components":[{"type":"uint256","name":"tradeTotal","internalType":"uint256"},{"type":"uint256","name":"restTotal","internalType":"uint256"}]},{"type":"uint256","name":"_credit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateUserRole","inputs":[{"type":"address","name":"_addr","internalType":"address"},{"type":"uint256","name":"_userFlag","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userIndex","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"userAddr","internalType":"address"},{"type":"string","name":"avatar","internalType":"string"},{"type":"string","name":"email","internalType":"string"},{"type":"uint256","name":"isOnline","internalType":"uint256"},{"type":"uint256","name":"userFlag","internalType":"uint256"},{"type":"uint256","name":"credit","internalType":"uint256"},{"type":"uint256","name":"regTime","internalType":"uint256"},{"type":"tuple","name":"tradeStats","internalType":"struct UserStorage.TradeStats","components":[{"type":"uint256","name":"tradeTotal","internalType":"uint256"},{"type":"uint256","name":"restTotal","internalType":"uint256"}]},{"type":"tuple","name":"morgageStats","internalType":"struct UserStorage.MorgageStats","components":[{"type":"uint256","name":"mortgage","internalType":"uint256"},{"type":"uint256","name":"freezeMortgage","internalType":"uint256"},{"type":"uint256","name":"relieveMortgage","internalType":"uint256"},{"type":"uint256","name":"inviteUserCount","internalType":"uint256"},{"type":"uint256","name":"inviteUserReward","internalType":"uint256"},{"type":"uint256","name":"applyRelieveTime","internalType":"uint256"},{"type":"uint256","name":"handleRelieveTime","internalType":"uint256"}]}],"name":"userList","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"userAddr","internalType":"address"},{"type":"string","name":"avatar","internalType":"string"},{"type":"string","name":"email","internalType":"string"},{"type":"uint256","name":"isOnline","internalType":"uint256"},{"type":"uint256","name":"userFlag","internalType":"uint256"},{"type":"uint256","name":"credit","internalType":"uint256"},{"type":"uint256","name":"regTime","internalType":"uint256"},{"type":"tuple","name":"tradeStats","internalType":"struct UserStorage.TradeStats","components":[{"type":"uint256","name":"tradeTotal","internalType":"uint256"},{"type":"uint256","name":"restTotal","internalType":"uint256"}]},{"type":"tuple","name":"morgageStats","internalType":"struct UserStorage.MorgageStats","components":[{"type":"uint256","name":"mortgage","internalType":"uint256"},{"type":"uint256","name":"freezeMortgage","internalType":"uint256"},{"type":"uint256","name":"relieveMortgage","internalType":"uint256"},{"type":"uint256","name":"inviteUserCount","internalType":"uint256"},{"type":"uint256","name":"inviteUserReward","internalType":"uint256"},{"type":"uint256","name":"applyRelieveTime","internalType":"uint256"},{"type":"uint256","name":"handleRelieveTime","internalType":"uint256"}]}],"name":"users","inputs":[{"type":"address","name":"","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d1f806200007f6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80639f4216e811610097578063c96679fe11610066578063c96679fe14610204578063d691fba514610232578063ee685c7014610245578063f2fde38b1461025857600080fd5b80639f4216e8146101a3578063a87430ba146101cb578063b50f4b48146101de578063c613bf1a146101f157600080fd5b80637318be66116100d35780637318be661461012a5780638da5cb5b1461013d5780638db762f5146101585780639bd7417f1461018357600080fd5b80630e9b547a146100fa5780631aa3a00814610118578063715018a614610122575b600080fd5b61010261026b565b60405161010f919061264b565b60405180910390f35b6101206104af565b005b610120610514565b6101206101383660046126c9565b610548565b6000546040516001600160a01b03909116815260200161010f565b336000908152600160205260409020546001600160a01b03161515604051901515815260200161010f565b61019661019136600461271d565b6105c2565b60405161010f919061273f565b6101b66101b1366004612752565b6105d9565b60405161010f9998979695949392919061276b565b6101b66101d936600461271d565b6107bb565b6101206101ec366004612831565b6107e8565b6101206101ff36600461293a565b610901565b61022461021236600461271d565b60026020526000908152604090205481565b60405190815260200161010f565b6101206102403660046129a7565b6109a6565b6101206102533660046129d1565b610f68565b61012061026636600461271d565b611040565b60606003805480602002602001604051908101604052809291908181526020016000905b828210156104a65760008481526020908190206040805161012081019091526010850290910180546001600160a01b0316825260018101805492939192918401916102d990612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461030590612a5a565b80156103525780601f1061032757610100808354040283529160200191610352565b820191906000526020600020905b81548152906001019060200180831161033557829003601f168201915b5050505050815260200160028201805461036b90612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461039790612a5a565b80156103e45780601f106103b9576101008083540402835291602001916103e4565b820191906000526020600020905b8154815290600101906020018083116103c757829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201604051806040016040529081600082015481526020016001820154815250508152602001600982016040518060e0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481525050815250508152602001906001019061028f565b50505050905090565b336000908152600160205260409020546001600160a01b0316156105095760405162461bcd60e51b815260206004820152600c60248201526b1a185cc81c9959da5cdd195960a21b60448201526064015b60405180910390fd5b610512336110db565b565b6000546001600160a01b0316331461053e5760405162461bcd60e51b815260040161050090612a95565b61051260006114d3565b6000546001600160a01b031633146105725760405162461bcd60e51b815260040161050090612a95565b600480546001600160a01b039586166001600160a01b0319918216179091556005805494861694821694909417909355600680549285169284169290921790915560078054919093169116179055565b6105ca6123cd565b6105d382611523565b92915050565b600381815481106105e957600080fd5b6000918252602090912060109091020180546001820180546001600160a01b0390921693509061061890612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461064490612a5a565b80156106915780601f1061066657610100808354040283529160200191610691565b820191906000526020600020905b81548152906001019060200180831161067457829003601f168201915b5050505050908060020180546106a690612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546106d290612a5a565b801561071f5780601f106106f45761010080835404028352916020019161071f565b820191906000526020600020905b81548152906001019060200180831161070257829003601f168201915b505050505090806003015490806004015490806005015490806006015490806007016040518060400160405290816000820154815260200160018201548152505090806009016040518060e0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481525050905089565b6001602081905260009182526040909120805491810180546001600160a01b039093169261061890612a5a565b6004546001600160a01b03166108105760405162461bcd60e51b815260040161050090612aca565b6005546001600160a01b03166108385760405162461bcd60e51b815260040161050090612b01565b6006546001600160a01b03166108605760405162461bcd60e51b815260040161050090612b38565b6007546001600160a01b03166108885760405162461bcd60e51b815260040161050090612b6f565b6004546001600160a01b03163314806108ab57506005546001600160a01b031633145b806108c057506007546001600160a01b031633145b806108d557506006546001600160a01b031633145b6108f15760405162461bcd60e51b815260040161050090612ba6565b6108fc838383611794565b505050565b336000908152600160205260409020546001600160a01b031661095a5760405162461bcd60e51b81526020600482015260116024820152703430b9903737903832b936b4b9b9b4b7b760791b6044820152606401610500565b61096633848484611c2f565b7f153500aa631c0f4af95856f167433819a0b8df5e4b0c6320757b310d44adc88083838360405161099993929190612bef565b60405180910390a1505050565b6004546001600160a01b03166109ce5760405162461bcd60e51b815260040161050090612aca565b6005546001600160a01b03166109f65760405162461bcd60e51b815260040161050090612b01565b6006546001600160a01b0316610a1e5760405162461bcd60e51b815260040161050090612b38565b6007546001600160a01b0316610a465760405162461bcd60e51b815260040161050090612b6f565b6006546001600160a01b03163314610a705760405162461bcd60e51b815260040161050090612ba6565b6001600160a01b038216610a965760405162461bcd60e51b815260040161050090612c25565b6001600160a01b0382811660009081526001602052604090205416610acd5760405162461bcd60e51b815260040161050090612c6b565b6003811115610b1e5760405162461bcd60e51b815260206004820152601f60248201527f5573657253746f726167653a20496e76616c69642075736572466c61672033006044820152606401610500565b6001600160a01b038083166000908152600160208181526040808420815161012081019092528054909516815291840180549394929391840191610b6190612a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d90612a5a565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b50505050508152602001600282018054610bf390612a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1f90612a5a565b8015610c6c5780601f10610c4157610100808354040283529160200191610c6c565b820191906000526020600020905b815481529060010190602001808311610c4f57829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201604051806040016040529081600082015481526020016001820154815250508152602001600982016040518060e0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481525050815250509050818160800181815250508060016000856001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001019080519060200190610d9a92919061247a565b5060408201518051610db691600284019160209091019061247a565b50606082810151600380840191909155608080850151600485015560a080860151600586015560c080870151600687015560e0870151805160078801556020908101516008880155610100909701518051600988015580880151600a880155604080820151600b89015595810151600c88015592830151600d87015590820151600e8601550151600f909301929092556001600160a01b03861660009081526002909352909120548154839291908110610e7257610e72612cae565b600091825260209182902083516010929092020180546001600160a01b0319166001600160a01b039092169190911781558282015180519192610ebd9260018501929091019061247a565b5060408201518051610ed991600284019160209091019061247a565b506060828101516003830155608080840151600484015560a080850151600585015560c080860151600686015560e0860151805160078701556020908101516008870155610100909601518051600987015595860151600a8601556040860151600b86015592850151600c85015590840151600d840155830151600e8301559190910151600f90910155505050565b6004546001600160a01b0316610f905760405162461bcd60e51b815260040161050090612aca565b6005546001600160a01b0316610fb85760405162461bcd60e51b815260040161050090612b01565b6006546001600160a01b0316610fe05760405162461bcd60e51b815260040161050090612b38565b6007546001600160a01b03166110085760405162461bcd60e51b815260040161050090612b6f565b6006546001600160a01b031633146110325760405162461bcd60e51b815260040161050090612ba6565b61103c82826120d6565b5050565b6000546001600160a01b0316331461106a5760405162461bcd60e51b815260040161050090612a95565b6001600160a01b0381166110cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610500565b6110d8816114d3565b50565b6001600160a01b03811661113f5760405162461bcd60e51b815260206004820152602560248201527f5573657253746f726167653a2061646472206e756c6c206973206e6f7420616c6044820152641b1bddd95960da1b6064820152608401610500565b6001600160a01b0381811660009081526001602052604090205416156111a75760405162461bcd60e51b815260206004820152601f60248201527f5573657253746f726167653a2063757272656e742055736572206578697374006044820152606401610500565b60408051808201825260008082526020808301829052835160e080820186528382528183018490528186018490526060808301859052608080840186905260a080850187905260c0808601889052895161012081018b526001600160a01b038c81168083528c51808b018e528b8152838b019081528d51808c018f528c8152848f015260019784018890529583018b90529382018a90524292820192909252948501899052610100850186905290875282865297909520825181546001600160a01b031916981697909717875593518051959692959194859461128f9391850192019061247a565b50604082015180516112ab91600284019160209091019061247a565b50606082810151600380840191909155608080850151600485015560a080860151600586015560c080870151600687015560e0870151805160078801556020908101516008880155610100909701518051600988015580880151600a8801556040810151600b88015594850151600c87015591840151600d860155830151600e8501559190910151600f909201919091558054600181018255600091909152825160109091027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810180546001600160a01b039093166001600160a01b031990931692909217825583830151805185946113c9937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c0192019061247a565b50604082015180516113e591600284019160209091019061247a565b50606082810151600380840191909155608080850151600485015560a080860151600586015560c080870151600687015560e0870151805160078801556020908101516008880155610100909701518051600988015596870151600a8701556040870151600b87015593860151600c86015590850151600d850155840151600e840155920151600f909101555461147e90600190612cc4565b6001600160a01b03851660008181526002602090815260409182902093909355519081527f421b2d8b048536f041533861f0d8aafb0366ddb5e151af45820c7e16e68d40ee910160405180910390a150505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61152b6123cd565b6001600160a01b0382166115515760405162461bcd60e51b815260040161050090612c25565b6001600160a01b03828116600090815260016020526040902054166115885760405162461bcd60e51b815260040161050090612c6b565b6001600160a01b0380831660009081526001602081815260408084208151610120810190925280549095168152918401805493949293918401916115cb90612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546115f790612a5a565b80156116445780601f1061161957610100808354040283529160200191611644565b820191906000526020600020905b81548152906001019060200180831161162757829003601f168201915b5050505050815260200160028201805461165d90612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461168990612a5a565b80156116d65780601f106116ab576101008083540402835291602001916116d6565b820191906000526020600020905b8154815290600101906020018083116116b957829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201604051806040016040529081600082015481526020016001820154815250508152602001600982016040518060e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505081525050905080915050919050565b6001600160a01b0383166117ba5760405162461bcd60e51b815260040161050090612c25565b6001600160a01b03838116600090815260016020526040902054166117f15760405162461bcd60e51b815260040161050090612c6b565b6001600160a01b03808416600090815260016020818152604080842081516101208101909252805490951681529184018054939492939184019161183490612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461186090612a5a565b80156118ad5780601f10611882576101008083540402835291602001916118ad565b820191906000526020600020905b81548152906001019060200180831161189057829003601f168201915b505050505081526020016002820180546118c690612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546118f290612a5a565b801561193f5780601f106119145761010080835404028352916020019161193f565b820191906000526020600020905b81548152906001019060200180831161192257829003601f168201915b50505091835250506003820154602080830191909152600483015460408084019190915260058401546060808501919091526006850154608080860191909152825180840184526007870154815260088701548186015260a080870191909152835160e0808201865260098901548252600a89015482880152600b89015482870152600c89015494820194909452600d88015492810192909252600e87015482820152600f9096015460c0808301919091529094019390935292840186905286519184018051929092528681015191518101919091526001600160a01b0387811660009081526001808452939020845181546001600160a01b031916921691909117815583820151805194955085949193611a60939085019291019061247a565b5060408201518051611a7c91600284019160209091019061247a565b50606082810151600380840191909155608080850151600485015560a080860151600586015560c080870151600687015560e0870151805160078801556020908101516008880155610100909701518051600988015580880151600a880155604080820151600b89015595810151600c88015592830151600d87015590820151600e8601550151600f909301929092556001600160a01b03871660009081526002909352909120548154839291908110611b3857611b38612cae565b600091825260209182902083516010929092020180546001600160a01b0319166001600160a01b039092169190911781558282015180519192611b839260018501929091019061247a565b5060408201518051611b9f91600284019160209091019061247a565b506060828101516003830155608080840151600484015560a080850151600585015560c080860151600686015560e0860151805160078701556020908101516008870155610100909601518051600987015595860151600a8601556040860151600b86015592850151600c85015590840151600d840155830151600e8301559190910151600f9091015550505050565b6001600160a01b038416611c555760405162461bcd60e51b815260040161050090612c25565b6001600160a01b0384811660009081526001602052604090205416611c8c5760405162461bcd60e51b815260040161050090612c6b565b6001600160a01b038085166000908152600160208181526040808420815161012081019092528054909516815291840180549394929391840191611ccf90612a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfb90612a5a565b8015611d485780601f10611d1d57610100808354040283529160200191611d48565b820191906000526020600020905b815481529060010190602001808311611d2b57829003601f168201915b50505050508152602001600282018054611d6190612a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8d90612a5a565b8015611dda5780601f10611daf57610100808354040283529160200191611dda565b820191906000526020600020905b815481529060010190602001808311611dbd57829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201604051806040016040529081600082015481526020016001820154815250508152602001600982016040518060e00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250508152505090508351600014611ea057602081018490525b825115611eaf57604081018390525b8115611ebd57606081018290525b6001600160a01b038581166000908152600160208181526040909220845181546001600160a01b0319169416939093178355838201518051859493611f0693850192019061247a565b5060408201518051611f2291600284019160209091019061247a565b50606082810151600380840191909155608080850151600485015560a080860151600586015560c080870151600687015560e0870151805160078801556020908101516008880155610100909701518051600988015580880151600a880155604080820151600b89015595810151600c88015592830151600d87015590820151600e8601550151600f909301929092556001600160a01b03881660009081526002909352909120548154839291908110611fde57611fde612cae565b600091825260209182902083516010929092020180546001600160a01b0319166001600160a01b0390921691909117815582820151805191926120299260018501929091019061247a565b506040820151805161204591600284019160209091019061247a565b506060828101516003830155608080840151600484015560a080850151600585015560c080860151600686015560e0860151805160078701556020908101516008870155610100909601518051600987015595860151600a8601556040860151600b86015592850151600c85015590840151600d840155830151600e8301559190910151600f909101555050505050565b6001600160a01b0382166120fc5760405162461bcd60e51b815260040161050090612c25565b6001600160a01b03828116600090815260016020526040902054166121335760405162461bcd60e51b815260040161050090612c6b565b6001600160a01b03808316600090815260016020818152604080842081516101208101909252805490951681529184018054939492939184019161217690612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546121a290612a5a565b80156121ef5780601f106121c4576101008083540402835291602001916121ef565b820191906000526020600020905b8154815290600101906020018083116121d257829003601f168201915b5050505050815260200160028201805461220890612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461223490612a5a565b80156122815780601f1061225657610100808354040283529160200191612281565b820191906000526020600020905b81548152906001019060200180831161226457829003601f168201915b50505091835250506003820154602080830191909152600483015460408084019190915260058401546060808501919091526006850154608080860191909152825180840184526007870154815260088701548186015260a080870191909152835160e08101855260098801548152600a88015481870152600b88015481860152600c88015481850152600d88015481840152600e88015481830152600f9097015460c0808901919091529586019690965288516101008801805191909152898501518151860152898401518151850152898301518151909301929092528881015182519091015287850151815190950194909452868301519351909201929092526001600160a01b0386811660009081526001808552929020845181546001600160a01b031916921691909117815583830151805194955085949193610d9a9385019291019061247a565b60405180610120016040528060006001600160a01b03168152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001612430604051806040016040528060008152602001600081525090565b81526020016124756040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b905290565b82805461248690612a5a565b90600052602060002090601f0160209004810192826124a857600085556124ee565b82601f106124c157805160ff19168380011785556124ee565b828001600101855582156124ee579182015b828111156124ee5782518255916020019190600101906124d3565b506124fa9291506124fe565b5090565b5b808211156124fa57600081556001016124ff565b6000815180845260005b818110156125395760208185018101518683018201520161251d565b8181111561254b576000602083870101525b50601f01601f19169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c08301525050565b80516001600160a01b03168252600061020060208301518160208601526125cd82860182612513565b915050604083015184820360408601526125e78282612513565b915050606083015160608501526080830151608085015260a083015160a085015260c083015160c085015260e083015161262e60e086018280518252602090810151910152565b50610100830151612643610120860182612560565b509392505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156126a057603f1988860301845261268e8583516125a4565b94509285019290850190600101612672565b5092979650505050505050565b80356001600160a01b03811681146126c457600080fd5b919050565b600080600080608085870312156126df57600080fd5b6126e8856126ad565b93506126f6602086016126ad565b9250612704604086016126ad565b9150612712606086016126ad565b905092959194509250565b60006020828403121561272f57600080fd5b612738826126ad565b9392505050565b60208152600061273860208301846125a4565b60006020828403121561276457600080fd5b5035919050565b6001600160a01b038a168152610200602082018190526000906127908382018c612513565b905082810360408401526127a4818b612513565b9150508760608301528660808301528560a08301528460c08301526127d660e083018580518252602090810151910152565b6127e4610120830184612560565b9a9950505050505050505050565b634e487b7160e01b600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561282b5761282b6127f2565b60405290565b6000806000838503608081121561284757600080fd5b612850856126ad565b93506040601f198201121561286457600080fd5b506040516040810181811067ffffffffffffffff82111715612888576128886127f2565b6040908152602086810135835290860135908201529295929450505060609091013590565b600082601f8301126128be57600080fd5b813567ffffffffffffffff808211156128d9576128d96127f2565b604051601f8301601f19908116603f01168101908282118183101715612901576129016127f2565b8160405283815286602085880101111561291a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561294f57600080fd5b833567ffffffffffffffff8082111561296757600080fd5b612973878388016128ad565b9450602086013591508082111561298957600080fd5b50612996868287016128ad565b925050604084013590509250925092565b600080604083850312156129ba57600080fd5b6129c3836126ad565b946020939093013593505050565b6000808284036101008112156129e657600080fd5b6129ef846126ad565b925060e0601f1982011215612a0357600080fd5b50612a0c612808565b6020840135815260408401356020820152606084013560408201526080840135606082015260a0840135608082015260c084013560a082015260e084013560c0820152809150509250929050565b600181811c90821680612a6e57607f821691505b60208210811415612a8f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526019908201527f496e76616c696420616464726573732063616c6c207265737400000000000000604082015260600190565b6020808252601a908201527f496e76616c696420616464726573732063616c6c206f72646572000000000000604082015260600190565b6020808252601b908201527f496e76616c696420616464726573732063616c6c207265636f72640000000000604082015260600190565b6020808252601b908201527f496e76616c696420616464726573732063616c6c2061707065616c0000000000604082015260600190565b60208082526029908201527f5573657253746f726167653a496e76616c69642066726f6d20636f6e7472616360408201526874206164647265737360b81b606082015260800190565b606081526000612c026060830186612513565b8281036020840152612c148186612513565b915050826040830152949350505050565b60208082526026908201527f5573657253746f726167653a205f61646472206e756c6c206973206e6f7420616040820152651b1b1bddd95960d21b606082015260800190565b60208082526023908201527f5573657253746f726167653a2063757272656e742055736572206e6f742065786040820152621a5cdd60ea1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600082821015612ce457634e487b7160e01b600052601160045260246000fd5b50039056fea26469706673582212204fbe1dd7c12769484356b133bc203fee5ef0d8bef550f491dc704235e297d35264736f6c634300080b0033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80639f4216e811610097578063c96679fe11610066578063c96679fe14610204578063d691fba514610232578063ee685c7014610245578063f2fde38b1461025857600080fd5b80639f4216e8146101a3578063a87430ba146101cb578063b50f4b48146101de578063c613bf1a146101f157600080fd5b80637318be66116100d35780637318be661461012a5780638da5cb5b1461013d5780638db762f5146101585780639bd7417f1461018357600080fd5b80630e9b547a146100fa5780631aa3a00814610118578063715018a614610122575b600080fd5b61010261026b565b60405161010f919061264b565b60405180910390f35b6101206104af565b005b610120610514565b6101206101383660046126c9565b610548565b6000546040516001600160a01b03909116815260200161010f565b336000908152600160205260409020546001600160a01b03161515604051901515815260200161010f565b61019661019136600461271d565b6105c2565b60405161010f919061273f565b6101b66101b1366004612752565b6105d9565b60405161010f9998979695949392919061276b565b6101b66101d936600461271d565b6107bb565b6101206101ec366004612831565b6107e8565b6101206101ff36600461293a565b610901565b61022461021236600461271d565b60026020526000908152604090205481565b60405190815260200161010f565b6101206102403660046129a7565b6109a6565b6101206102533660046129d1565b610f68565b61012061026636600461271d565b611040565b60606003805480602002602001604051908101604052809291908181526020016000905b828210156104a65760008481526020908190206040805161012081019091526010850290910180546001600160a01b0316825260018101805492939192918401916102d990612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461030590612a5a565b80156103525780601f1061032757610100808354040283529160200191610352565b820191906000526020600020905b81548152906001019060200180831161033557829003601f168201915b5050505050815260200160028201805461036b90612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461039790612a5a565b80156103e45780601f106103b9576101008083540402835291602001916103e4565b820191906000526020600020905b8154815290600101906020018083116103c757829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201604051806040016040529081600082015481526020016001820154815250508152602001600982016040518060e0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481525050815250508152602001906001019061028f565b50505050905090565b336000908152600160205260409020546001600160a01b0316156105095760405162461bcd60e51b815260206004820152600c60248201526b1a185cc81c9959da5cdd195960a21b60448201526064015b60405180910390fd5b610512336110db565b565b6000546001600160a01b0316331461053e5760405162461bcd60e51b815260040161050090612a95565b61051260006114d3565b6000546001600160a01b031633146105725760405162461bcd60e51b815260040161050090612a95565b600480546001600160a01b039586166001600160a01b0319918216179091556005805494861694821694909417909355600680549285169284169290921790915560078054919093169116179055565b6105ca6123cd565b6105d382611523565b92915050565b600381815481106105e957600080fd5b6000918252602090912060109091020180546001820180546001600160a01b0390921693509061061890612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461064490612a5a565b80156106915780601f1061066657610100808354040283529160200191610691565b820191906000526020600020905b81548152906001019060200180831161067457829003601f168201915b5050505050908060020180546106a690612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546106d290612a5a565b801561071f5780601f106106f45761010080835404028352916020019161071f565b820191906000526020600020905b81548152906001019060200180831161070257829003601f168201915b505050505090806003015490806004015490806005015490806006015490806007016040518060400160405290816000820154815260200160018201548152505090806009016040518060e0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481525050905089565b6001602081905260009182526040909120805491810180546001600160a01b039093169261061890612a5a565b6004546001600160a01b03166108105760405162461bcd60e51b815260040161050090612aca565b6005546001600160a01b03166108385760405162461bcd60e51b815260040161050090612b01565b6006546001600160a01b03166108605760405162461bcd60e51b815260040161050090612b38565b6007546001600160a01b03166108885760405162461bcd60e51b815260040161050090612b6f565b6004546001600160a01b03163314806108ab57506005546001600160a01b031633145b806108c057506007546001600160a01b031633145b806108d557506006546001600160a01b031633145b6108f15760405162461bcd60e51b815260040161050090612ba6565b6108fc838383611794565b505050565b336000908152600160205260409020546001600160a01b031661095a5760405162461bcd60e51b81526020600482015260116024820152703430b9903737903832b936b4b9b9b4b7b760791b6044820152606401610500565b61096633848484611c2f565b7f153500aa631c0f4af95856f167433819a0b8df5e4b0c6320757b310d44adc88083838360405161099993929190612bef565b60405180910390a1505050565b6004546001600160a01b03166109ce5760405162461bcd60e51b815260040161050090612aca565b6005546001600160a01b03166109f65760405162461bcd60e51b815260040161050090612b01565b6006546001600160a01b0316610a1e5760405162461bcd60e51b815260040161050090612b38565b6007546001600160a01b0316610a465760405162461bcd60e51b815260040161050090612b6f565b6006546001600160a01b03163314610a705760405162461bcd60e51b815260040161050090612ba6565b6001600160a01b038216610a965760405162461bcd60e51b815260040161050090612c25565b6001600160a01b0382811660009081526001602052604090205416610acd5760405162461bcd60e51b815260040161050090612c6b565b6003811115610b1e5760405162461bcd60e51b815260206004820152601f60248201527f5573657253746f726167653a20496e76616c69642075736572466c61672033006044820152606401610500565b6001600160a01b038083166000908152600160208181526040808420815161012081019092528054909516815291840180549394929391840191610b6190612a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d90612a5a565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b50505050508152602001600282018054610bf390612a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1f90612a5a565b8015610c6c5780601f10610c4157610100808354040283529160200191610c6c565b820191906000526020600020905b815481529060010190602001808311610c4f57829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201604051806040016040529081600082015481526020016001820154815250508152602001600982016040518060e0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481525050815250509050818160800181815250508060016000856001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001019080519060200190610d9a92919061247a565b5060408201518051610db691600284019160209091019061247a565b50606082810151600380840191909155608080850151600485015560a080860151600586015560c080870151600687015560e0870151805160078801556020908101516008880155610100909701518051600988015580880151600a880155604080820151600b89015595810151600c88015592830151600d87015590820151600e8601550151600f909301929092556001600160a01b03861660009081526002909352909120548154839291908110610e7257610e72612cae565b600091825260209182902083516010929092020180546001600160a01b0319166001600160a01b039092169190911781558282015180519192610ebd9260018501929091019061247a565b5060408201518051610ed991600284019160209091019061247a565b506060828101516003830155608080840151600484015560a080850151600585015560c080860151600686015560e0860151805160078701556020908101516008870155610100909601518051600987015595860151600a8601556040860151600b86015592850151600c85015590840151600d840155830151600e8301559190910151600f90910155505050565b6004546001600160a01b0316610f905760405162461bcd60e51b815260040161050090612aca565b6005546001600160a01b0316610fb85760405162461bcd60e51b815260040161050090612b01565b6006546001600160a01b0316610fe05760405162461bcd60e51b815260040161050090612b38565b6007546001600160a01b03166110085760405162461bcd60e51b815260040161050090612b6f565b6006546001600160a01b031633146110325760405162461bcd60e51b815260040161050090612ba6565b61103c82826120d6565b5050565b6000546001600160a01b0316331461106a5760405162461bcd60e51b815260040161050090612a95565b6001600160a01b0381166110cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610500565b6110d8816114d3565b50565b6001600160a01b03811661113f5760405162461bcd60e51b815260206004820152602560248201527f5573657253746f726167653a2061646472206e756c6c206973206e6f7420616c6044820152641b1bddd95960da1b6064820152608401610500565b6001600160a01b0381811660009081526001602052604090205416156111a75760405162461bcd60e51b815260206004820152601f60248201527f5573657253746f726167653a2063757272656e742055736572206578697374006044820152606401610500565b60408051808201825260008082526020808301829052835160e080820186528382528183018490528186018490526060808301859052608080840186905260a080850187905260c0808601889052895161012081018b526001600160a01b038c81168083528c51808b018e528b8152838b019081528d51808c018f528c8152848f015260019784018890529583018b90529382018a90524292820192909252948501899052610100850186905290875282865297909520825181546001600160a01b031916981697909717875593518051959692959194859461128f9391850192019061247a565b50604082015180516112ab91600284019160209091019061247a565b50606082810151600380840191909155608080850151600485015560a080860151600586015560c080870151600687015560e0870151805160078801556020908101516008880155610100909701518051600988015580880151600a8801556040810151600b88015594850151600c87015591840151600d860155830151600e8501559190910151600f909201919091558054600181018255600091909152825160109091027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810180546001600160a01b039093166001600160a01b031990931692909217825583830151805185946113c9937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c0192019061247a565b50604082015180516113e591600284019160209091019061247a565b50606082810151600380840191909155608080850151600485015560a080860151600586015560c080870151600687015560e0870151805160078801556020908101516008880155610100909701518051600988015596870151600a8701556040870151600b87015593860151600c86015590850151600d850155840151600e840155920151600f909101555461147e90600190612cc4565b6001600160a01b03851660008181526002602090815260409182902093909355519081527f421b2d8b048536f041533861f0d8aafb0366ddb5e151af45820c7e16e68d40ee910160405180910390a150505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61152b6123cd565b6001600160a01b0382166115515760405162461bcd60e51b815260040161050090612c25565b6001600160a01b03828116600090815260016020526040902054166115885760405162461bcd60e51b815260040161050090612c6b565b6001600160a01b0380831660009081526001602081815260408084208151610120810190925280549095168152918401805493949293918401916115cb90612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546115f790612a5a565b80156116445780601f1061161957610100808354040283529160200191611644565b820191906000526020600020905b81548152906001019060200180831161162757829003601f168201915b5050505050815260200160028201805461165d90612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461168990612a5a565b80156116d65780601f106116ab576101008083540402835291602001916116d6565b820191906000526020600020905b8154815290600101906020018083116116b957829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201604051806040016040529081600082015481526020016001820154815250508152602001600982016040518060e001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505081525050905080915050919050565b6001600160a01b0383166117ba5760405162461bcd60e51b815260040161050090612c25565b6001600160a01b03838116600090815260016020526040902054166117f15760405162461bcd60e51b815260040161050090612c6b565b6001600160a01b03808416600090815260016020818152604080842081516101208101909252805490951681529184018054939492939184019161183490612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461186090612a5a565b80156118ad5780601f10611882576101008083540402835291602001916118ad565b820191906000526020600020905b81548152906001019060200180831161189057829003601f168201915b505050505081526020016002820180546118c690612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546118f290612a5a565b801561193f5780601f106119145761010080835404028352916020019161193f565b820191906000526020600020905b81548152906001019060200180831161192257829003601f168201915b50505091835250506003820154602080830191909152600483015460408084019190915260058401546060808501919091526006850154608080860191909152825180840184526007870154815260088701548186015260a080870191909152835160e0808201865260098901548252600a89015482880152600b89015482870152600c89015494820194909452600d88015492810192909252600e87015482820152600f9096015460c0808301919091529094019390935292840186905286519184018051929092528681015191518101919091526001600160a01b0387811660009081526001808452939020845181546001600160a01b031916921691909117815583820151805194955085949193611a60939085019291019061247a565b5060408201518051611a7c91600284019160209091019061247a565b50606082810151600380840191909155608080850151600485015560a080860151600586015560c080870151600687015560e0870151805160078801556020908101516008880155610100909701518051600988015580880151600a880155604080820151600b89015595810151600c88015592830151600d87015590820151600e8601550151600f909301929092556001600160a01b03871660009081526002909352909120548154839291908110611b3857611b38612cae565b600091825260209182902083516010929092020180546001600160a01b0319166001600160a01b039092169190911781558282015180519192611b839260018501929091019061247a565b5060408201518051611b9f91600284019160209091019061247a565b506060828101516003830155608080840151600484015560a080850151600585015560c080860151600686015560e0860151805160078701556020908101516008870155610100909601518051600987015595860151600a8601556040860151600b86015592850151600c85015590840151600d840155830151600e8301559190910151600f9091015550505050565b6001600160a01b038416611c555760405162461bcd60e51b815260040161050090612c25565b6001600160a01b0384811660009081526001602052604090205416611c8c5760405162461bcd60e51b815260040161050090612c6b565b6001600160a01b038085166000908152600160208181526040808420815161012081019092528054909516815291840180549394929391840191611ccf90612a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfb90612a5a565b8015611d485780601f10611d1d57610100808354040283529160200191611d48565b820191906000526020600020905b815481529060010190602001808311611d2b57829003601f168201915b50505050508152602001600282018054611d6190612a5a565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8d90612a5a565b8015611dda5780601f10611daf57610100808354040283529160200191611dda565b820191906000526020600020905b815481529060010190602001808311611dbd57829003601f168201915b505050505081526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201604051806040016040529081600082015481526020016001820154815250508152602001600982016040518060e00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250508152505090508351600014611ea057602081018490525b825115611eaf57604081018390525b8115611ebd57606081018290525b6001600160a01b038581166000908152600160208181526040909220845181546001600160a01b0319169416939093178355838201518051859493611f0693850192019061247a565b5060408201518051611f2291600284019160209091019061247a565b50606082810151600380840191909155608080850151600485015560a080860151600586015560c080870151600687015560e0870151805160078801556020908101516008880155610100909701518051600988015580880151600a880155604080820151600b89015595810151600c88015592830151600d87015590820151600e8601550151600f909301929092556001600160a01b03881660009081526002909352909120548154839291908110611fde57611fde612cae565b600091825260209182902083516010929092020180546001600160a01b0319166001600160a01b0390921691909117815582820151805191926120299260018501929091019061247a565b506040820151805161204591600284019160209091019061247a565b506060828101516003830155608080840151600484015560a080850151600585015560c080860151600686015560e0860151805160078701556020908101516008870155610100909601518051600987015595860151600a8601556040860151600b86015592850151600c85015590840151600d840155830151600e8301559190910151600f909101555050505050565b6001600160a01b0382166120fc5760405162461bcd60e51b815260040161050090612c25565b6001600160a01b03828116600090815260016020526040902054166121335760405162461bcd60e51b815260040161050090612c6b565b6001600160a01b03808316600090815260016020818152604080842081516101208101909252805490951681529184018054939492939184019161217690612a5a565b80601f01602080910402602001604051908101604052809291908181526020018280546121a290612a5a565b80156121ef5780601f106121c4576101008083540402835291602001916121ef565b820191906000526020600020905b8154815290600101906020018083116121d257829003601f168201915b5050505050815260200160028201805461220890612a5a565b80601f016020809104026020016040519081016040528092919081815260200182805461223490612a5a565b80156122815780601f1061225657610100808354040283529160200191612281565b820191906000526020600020905b81548152906001019060200180831161226457829003601f168201915b50505091835250506003820154602080830191909152600483015460408084019190915260058401546060808501919091526006850154608080860191909152825180840184526007870154815260088701548186015260a080870191909152835160e08101855260098801548152600a88015481870152600b88015481860152600c88015481850152600d88015481840152600e88015481830152600f9097015460c0808901919091529586019690965288516101008801805191909152898501518151860152898401518151850152898301518151909301929092528881015182519091015287850151815190950194909452868301519351909201929092526001600160a01b0386811660009081526001808552929020845181546001600160a01b031916921691909117815583830151805194955085949193610d9a9385019291019061247a565b60405180610120016040528060006001600160a01b03168152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001612430604051806040016040528060008152602001600081525090565b81526020016124756040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b905290565b82805461248690612a5a565b90600052602060002090601f0160209004810192826124a857600085556124ee565b82601f106124c157805160ff19168380011785556124ee565b828001600101855582156124ee579182015b828111156124ee5782518255916020019190600101906124d3565b506124fa9291506124fe565b5090565b5b808211156124fa57600081556001016124ff565b6000815180845260005b818110156125395760208185018101518683018201520161251d565b8181111561254b576000602083870101525b50601f01601f19169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c08301525050565b80516001600160a01b03168252600061020060208301518160208601526125cd82860182612513565b915050604083015184820360408601526125e78282612513565b915050606083015160608501526080830151608085015260a083015160a085015260c083015160c085015260e083015161262e60e086018280518252602090810151910152565b50610100830151612643610120860182612560565b509392505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156126a057603f1988860301845261268e8583516125a4565b94509285019290850190600101612672565b5092979650505050505050565b80356001600160a01b03811681146126c457600080fd5b919050565b600080600080608085870312156126df57600080fd5b6126e8856126ad565b93506126f6602086016126ad565b9250612704604086016126ad565b9150612712606086016126ad565b905092959194509250565b60006020828403121561272f57600080fd5b612738826126ad565b9392505050565b60208152600061273860208301846125a4565b60006020828403121561276457600080fd5b5035919050565b6001600160a01b038a168152610200602082018190526000906127908382018c612513565b905082810360408401526127a4818b612513565b9150508760608301528660808301528560a08301528460c08301526127d660e083018580518252602090810151910152565b6127e4610120830184612560565b9a9950505050505050505050565b634e487b7160e01b600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561282b5761282b6127f2565b60405290565b6000806000838503608081121561284757600080fd5b612850856126ad565b93506040601f198201121561286457600080fd5b506040516040810181811067ffffffffffffffff82111715612888576128886127f2565b6040908152602086810135835290860135908201529295929450505060609091013590565b600082601f8301126128be57600080fd5b813567ffffffffffffffff808211156128d9576128d96127f2565b604051601f8301601f19908116603f01168101908282118183101715612901576129016127f2565b8160405283815286602085880101111561291a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561294f57600080fd5b833567ffffffffffffffff8082111561296757600080fd5b612973878388016128ad565b9450602086013591508082111561298957600080fd5b50612996868287016128ad565b925050604084013590509250925092565b600080604083850312156129ba57600080fd5b6129c3836126ad565b946020939093013593505050565b6000808284036101008112156129e657600080fd5b6129ef846126ad565b925060e0601f1982011215612a0357600080fd5b50612a0c612808565b6020840135815260408401356020820152606084013560408201526080840135606082015260a0840135608082015260c084013560a082015260e084013560c0820152809150509250929050565b600181811c90821680612a6e57607f821691505b60208210811415612a8f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526019908201527f496e76616c696420616464726573732063616c6c207265737400000000000000604082015260600190565b6020808252601a908201527f496e76616c696420616464726573732063616c6c206f72646572000000000000604082015260600190565b6020808252601b908201527f496e76616c696420616464726573732063616c6c207265636f72640000000000604082015260600190565b6020808252601b908201527f496e76616c696420616464726573732063616c6c2061707065616c0000000000604082015260600190565b60208082526029908201527f5573657253746f726167653a496e76616c69642066726f6d20636f6e7472616360408201526874206164647265737360b81b606082015260800190565b606081526000612c026060830186612513565b8281036020840152612c148186612513565b915050826040830152949350505050565b60208082526026908201527f5573657253746f726167653a205f61646472206e756c6c206973206e6f7420616040820152651b1b1bddd95960d21b606082015260800190565b60208082526023908201527f5573657253746f726167653a2063757272656e742055736572206e6f742065786040820152621a5cdd60ea1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600082821015612ce457634e487b7160e01b600052601160045260246000fd5b50039056fea26469706673582212204fbe1dd7c12769484356b133bc203fee5ef0d8bef550f491dc704235e297d35264736f6c634300080b0033