Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- AstralCards
- Optimization enabled
- false
- Compiler version
- v0.8.16+commit.07a7930e
- EVM Version
- default
- Verified at
- 2025-08-23T09:58:42.170253Z
Contract source code
// SPDX-License-Identifier: GPL-3.0-only
// Author: Upaut
pragma solidity ^0.8.16;
contract AstralCards {
struct User{ // структура описывающая настройки пользователя
uint8 avatar; // индекс аватара игрока
string lang; // язык интерфейса игрока
string name; // имя игрока
}
struct Room{ // структура описывающая игровую комнату
uint256 bankRoom; // сумма всех взносов в комнату
uint256 bet; // ставка внесенная каждым игроком (переплата одним из игроков вернется к нему обратно)
uint256 fees; // комиссия (%) взымаемая с банка игровой комнаты
uint256 status; // состояние комнаты. 0 - комната не активна, 1 - оплачено первым игроком, 2 - идет игра, 3 - можно принимать ставки на игроков
address[] player1_users; // пользовательские адреса что ставят на игрока 1
uint256[] player1_bets; // пользовательские ставки что ставят на игрока 1
address[] player2_users; // пользовательские адреса что ставят на игрока 2
uint256[] player2_bets; // пользовательские ставки что ставят на игрока 2
}
struct RoomList{ // элемент двухсвязного списка содержащего все активные комнаты
uint256 room; // комната
uint256 next; // следующая комната
uint256 prev; // предыдущая комната
}
struct ActiveRoom{
uint256 room; // комната
uint256 bankRoom; // сумма всех взносов в комнату
uint256 bet; // ставка внесенная каждым игроком
uint256 status; // состояние комнаты
address player1; // адрес игрока 1
address player2; // адрес игрока 2
}
uint256 public gameRoom = 1; // номер последней созданной игровой комнаты
uint256 public amountGames; // всегда показывает количество созданных игровых комнат
uint256 public gameRoomMax = 8; // максимально возможное количество одновременно созданных игровых комнат
uint256 public minGameBet = 10 * 1e18; // минимальная игровая ставка в нативной монете
uint256 public gamerBetPool = 25 * 1e18; // (%) Процент, сколько от ставки игрока будет поставлено на его победу в пул ставок
uint256 public maxUsersPerPlayer = 30; // максимальное количество пользователей, которые могут ставить на одного игрока
uint256 public fees = 5 * 1e18; // комиссия (%) взымаемая с банка игровой комнаты
address public owner = msg.sender; // владелец должен иметь возможность настраивать минимальный размер ставки
address public oracle = msg.sender; // игровой сервер будет выступать оракулом
address public commission = msg.sender; // адрес на который будет перечисляться комиссия для дальнейшего распределения
mapping(address => User) private settings; // маппирование настроек пользователя
mapping(uint256 => Room) private rooms; // маппирование игровой комнаты
mapping(uint256 => RoomList) private roomList; // маппирование списка комнат
/*
constructor(address _oracle) {
oracle = _oracle;
}
*/
event UsedRoom(uint indexed room);
modifier onlyOwner() {
require(msg.sender == owner, "Only owner");
_;
}
modifier onlyOracle() {
require(msg.sender == oracle, "Only oracle");
_;
}
modifier onlyOwnerOrOracle() {
require((msg.sender == owner) || (msg.sender == oracle), "Only owner or oracle");
_;
}
receive() external payable {
depositGame();
}
// Функция приема взноса игрока за участие
function depositGame() public payable {
require(msg.sender == tx.origin, "Only EOA"); // другие контракты не могут вызывать данную функцию
require(msg.value >= minGameBet, "low bet"); // минимальный взнос за участие
if(rooms[gameRoom].status == 0){ // комната создается игроком 1
require(amountGames < gameRoomMax, "max rooms created"); // количество созданных комнат не должно превышать установленный максимум
rooms[gameRoom].bet = msg.value;
rooms[gameRoom].status = 1;
rooms[gameRoom].player1_users.push(msg.sender);
_addRoom(gameRoom); // добавляем комнату в список созданых комнат
emit UsedRoom(gameRoom); // события использования комнаты
}
else{ // в созданную комнату вносится оплата игроком 2
require(msg.sender != rooms[gameRoom].player1_users[0], "already added"); // одинаковый адрес не может быть противником
if(msg.value > rooms[gameRoom].bet){ // если второй игрок заплатил больше первого, то вернем назад его переплату
payable(msg.sender).transfer(msg.value - rooms[gameRoom].bet);
} else if(msg.value < rooms[gameRoom].bet){ // если второй игрок заплатил меньше первого, то вернем назад переплату первому игроку
payable(rooms[gameRoom].player1_users[0]).transfer(rooms[gameRoom].bet - msg.value);
rooms[gameRoom].bet = msg.value;
}
rooms[gameRoom].bankRoom = rooms[gameRoom].bet * 2; // вносим точную сумму в банк комнаты
// разбиваем ставки игроков на игровую ставку и пул ставок на игроков
uint _pool_bet = rooms[gameRoom].bet * gamerBetPool / (100 * 1e18); // находим процент от ставки игрока, который должен уйти в пул ставок
rooms[gameRoom].bet -= _pool_bet;
rooms[gameRoom].player1_bets.push(_pool_bet);
rooms[gameRoom].player2_users.push(msg.sender);
rooms[gameRoom].player2_bets.push(_pool_bet);
rooms[gameRoom].fees = fees;
rooms[gameRoom].status = 3; // можно принимать ставки на игроков
emit UsedRoom(gameRoom); // события использования комнаты
gameRoom++; // создаем новую пустую комнату
}
}
// отмена игрового взноса, доступно только если игрок внес оплату один
function depositCancel() external {
require(msg.sender == rooms[gameRoom].player1_users[0], "not your bet"); // ставку может вернуть только тот адрес что создал комнату
require(rooms[gameRoom].status == 1); // статус комнаты должен быть 1, т.е. комната создана, но игрок 2 еще не внес оплату
payable(msg.sender).transfer(rooms[gameRoom].bet);
delete rooms[gameRoom];
_delRoom(gameRoom); // Удаляем игровую комнату из списка созданных комнат
emit UsedRoom(gameRoom); // события использования комнаты
}
// ставка на Игрока 1
function betOnPlayer1(uint256 _room) public payable {
require(msg.sender == tx.origin, "Only EOA"); // другие контракты не могут вызывать данную функцию
require(msg.value >= minGameBet / 4, "low bet"); // минимальная ставка должна быть не меньше 1/4 от минимальной игровой ставки
require(rooms[_room].status == 3, "bets are prohibited"); // статус комнаты должен быть 3, т.е. можно принимать ставки на игроков
require(rooms[_room].player1_users.length <= maxUsersPerPlayer, "Many users with bets"); // количество ставящих пользователей не должно превышать максимум
uint256 _index;
bool _check;
(_index, _check) = _getIndex(rooms[_room].player1_users);
if(_check){ // если пользователь ранее делал ставки
rooms[_room].player1_bets[_index] += msg.value;
} else {
rooms[_room].player1_users.push(msg.sender);
rooms[_room].player1_bets.push(msg.value);
}
rooms[_room].bankRoom += msg.value; // добавляем ставку в банк комнаты
emit UsedRoom(_room); // события использования комнаты
}
// ставка на Игрока 2
function betOnPlayer2(uint256 _room) public payable {
require(msg.sender == tx.origin, "Only EOA"); // другие контракты не могут вызывать данную функцию
require(msg.value >= minGameBet / 4, "low bet"); // минимальная ставка должна быть не меньше 1/4 от минимальной игровой ставки
require(rooms[_room].status == 3, "bets are prohibited"); // статус комнаты должен быть 3, т.е. можно принимать ставки на игроков
require(rooms[_room].player2_users.length <= maxUsersPerPlayer, "Many users with bets"); // количество ставящих пользователей не должно превышать максимум
uint256 _index;
bool _check;
(_index, _check) = _getIndex(rooms[_room].player2_users);
if(_check){ // если пользователь ранее делал ставки
rooms[_room].player2_bets[_index] += msg.value;
} else {
rooms[_room].player2_users.push(msg.sender);
rooms[_room].player2_bets.push(msg.value);
}
rooms[_room].bankRoom += msg.value; // добавляем ставку в банк комнаты
emit UsedRoom(_room); // события использования комнаты
}
// приватная фунция возвращает индекс в массиве ставящих пользователей по заданному адресу
function _getIndex(address[] storage _arr) private view returns (uint256, bool) {
for(uint256 i = 0; i < _arr.length; i++){
if(msg.sender == _arr[i]){
return (i, true);
}
}
return (0, false);
}
// Завершить игру в комнате с определением победителя может только оракул
function setWinner(uint256 _room, address _winner) external onlyOracle {
require((rooms[_room].player1_users[0] == _winner) || (rooms[_room].player2_users[0] == _winner)); // адрес победителя должен быть адресом одного из игроков комнаты
uint256 _fee = rooms[_room].bankRoom * rooms[_room].fees / (100 * 1e18); // находим комиссию
rooms[_room].bet *= 2; // находим выигрыш победителя за победу, пока без учета его ставки
rooms[_room].bankRoom -= (_fee + rooms[_room].bet); // уменьшаем банк комнаты на комиссию + выигрыш победителя
// весь оставшийся банк комнаты надо распределить по ставкам победителей
if(rooms[_room].player1_users[0] == _winner){ // если победил игрок 1
_winnerPay(rooms[_room].bankRoom, rooms[_room].bet, rooms[_room].player1_users, rooms[_room].player1_bets);
}
else{ // если победил игрок 2
_winnerPay(rooms[_room].bankRoom, rooms[_room].bet, rooms[_room].player2_users, rooms[_room].player2_bets);
}
// Производим последнюю выплату - это игровая комиссия
payable(commission).transfer(_fee); // выплачиваем комиссию
// Уничтожаем игровую комнату
_delRoom(_room); // Удаляем игровую комнату из списка созданных комнат
delete rooms[_room];
emit UsedRoom(_room); // события использования комнаты
}
// приватная фунция расчета и выплат всем победителям
function _winnerPay(uint256 _bank, uint256 _amountWin, address[] storage _arrAddress, uint256[] storage _arrBet) private {
uint _sum; // сумма всех ставок
uint[] memory _arrPay = new uint[](_arrAddress.length); // выплаты которые должны получить пользователи
for(uint256 i = 0; i < _arrAddress.length; i++){
_sum += _arrBet[i];
}
for(uint256 i = 0; i < _arrAddress.length; i++){
_arrPay[i] = _arrBet[i] * (100 * 1e18) / _sum; // находим процент от суммы ставок, который должен получить пользователь
_arrPay[i] = _bank * _arrPay[i] / (100 * 1e18);
}
_arrPay[0] += _amountWin; // к ставки игрока добавляется его награда за победу в игре
for(uint256 i = 0; i < _arrAddress.length; i++){ // производим выплаты
payable(_arrAddress[i]).transfer(_arrPay[i]);
}
}
// Принудительное закрытие комнаты с возвратом всех ставок игрокам, служит на тот случай если с игровым сервером что-то случится
function closeRoom(uint256 _room) external onlyOwnerOrOracle {
require((rooms[_room].status == 3) || (rooms[_room].status == 2), "bad status"); // статус комнаты должен быть 3 или 2
rooms[_room].player1_bets[0] += rooms[_room].bet; // к ставке игрока 1 добавляем его игровую ставку
rooms[_room].player2_bets[0] += rooms[_room].bet; // к ставке игрока 2 добавляем его игровую ставку
for(uint256 i = 0; i < rooms[_room].player1_users.length; i++){
payable(rooms[_room].player1_users[i]).transfer(rooms[_room].player1_bets[i]); // выплачиваем все ставки на игрока 1
}
for(uint256 i = 0; i < rooms[_room].player2_users.length; i++){
payable(rooms[_room].player2_users[i]).transfer(rooms[_room].player2_bets[i]); // выплачиваем все ставки на игрока 2
}
// Уничтожаем игровую комнату
_delRoom(_room); // Удаляем игровую комнату из списка созданных комнат
delete rooms[_room];
emit UsedRoom(_room); // события использования комнаты
}
// сохранение настроек пользователя
function saveSettings(uint8 _avatar, string memory _lang, string memory _name) external {
settings[msg.sender].avatar = _avatar;
settings[msg.sender].lang = _lang;
settings[msg.sender].name = _name;
}
// Изменение минимальной игровой ставки
function setMinGameBet(uint256 _minGameBet) external onlyOwner {
minGameBet = _minGameBet;
}
// Изменение процента, сколько от своей ставки игрок ставит на свою победу
function setGamerBetPool(uint256 _gamerBetPool) external onlyOwner {
gamerBetPool = _gamerBetPool;
}
// Изменение комиссионных сборов
function setFees(uint256 _fees) external onlyOwner {
fees = _fees;
}
// Изменение максимальное количество человек которые могут ставить на одного игрока
function setMaxUsersPerPlayer(uint256 _maxUsersPerPlayer) external onlyOwner {
maxUsersPerPlayer = _maxUsersPerPlayer;
}
// Изменение максимального количества игровых комнат
function setGameRoomsMax(uint256 _gameRoomMax) external onlyOwner {
gameRoomMax = _gameRoomMax;
}
// назначить нового оракула может только владелец
function setNewOracle(address _newOracle) external onlyOwner {
oracle = _newOracle;
}
// назначить новый адрес для получения комиссий может только владелец
function setNewCommission(address _commission) external onlyOwner {
commission = _commission;
}
// назначить новый статус комнаты может только оракул (статус 2 - идет игра, ставки запрещены; статус 3 - идет игра, ставки разрешены)
function setRoomStatus(uint256 _room, uint256 _status) external onlyOracle {
require(_status == 2 || _status == 3); // статус комнаты может быть установлен только на 2 или 3
require((rooms[_room].status == 2) || (rooms[_room].status == 3)); // комната где планируется изменение статуса должна быть на статусе 2 или 3
rooms[_room].status = _status;
emit UsedRoom(_room); // события использования комнаты
}
function _addRoom(uint _room) private { // добавление новой комнаты в список комнат
roomList[_room].room = _room;
roomList[_room].next = 0;
roomList[_room].prev = roomList[0].prev;
roomList[roomList[0].prev].next = _room;
roomList[0].prev = _room;
amountGames++; // увеличиваем количество созданных игровых комнат
}
function _delRoom(uint _room) private { // удаление комнаты из списка комнат
roomList[roomList[_room].prev].next = roomList[_room].next;
roomList[roomList[_room].next].prev = roomList[_room].prev;
amountGames--; // уменьшаем количество созданных игровых комнат
delete roomList[_room];
}
// Возвращаем настройки пользователя
function getSettings(address _user) public view returns (User memory){
return (settings[_user]);
}
// Возвращаем структуру игровой комнаты
function getRoom(uint256 _room) public view returns (Room memory){
return (rooms[_room]);
}
// Возвращаем информацию по всем созданным игровым комнатам
function getCreatedRooms() public view returns (ActiveRoom[] memory){
ActiveRoom[] memory _result = new ActiveRoom[](amountGames);
uint _index = roomList[0].next;
for(uint i; i < amountGames; i++){
_result[i].room = _index;
_result[i].bankRoom = rooms[_index].bankRoom;
_result[i].bet = rooms[_index].bet;
_result[i].status = rooms[_index].status;
_result[i].player1 = rooms[_index].player1_users[0];
if(rooms[_index].status > 1){
_result[i].player2 = rooms[_index].player2_users[0];
}
_index = roomList[_index].next;
}
return (_result);
}
// Возвращаем предварительный расчет выплат победителям
function getPreview(uint256 _room) public view returns (uint256, address [] memory, uint [] memory, address [] memory, uint [] memory){
if(rooms[_room].status < 2){
return (0, new address[](0), new uint[](0), new address[](0), new uint[](0));
}
address [] memory _arrPlayer1 = new address[](rooms[_room].player1_users.length); // адреса поставивщие на победу игрока 1
uint[] memory _arrPay1 = new uint[](rooms[_room].player1_users.length); // выплаты которые должны получить пользователи
address [] memory _arrPlayer2 = new address[](rooms[_room].player2_users.length); // адреса поставивщие на победу игрока 2
uint[] memory _arrPay2 = new uint[](rooms[_room].player2_users.length); // выплаты которые должны получить пользователи
uint _bank = rooms[_room].bankRoom;
_bank -= (rooms[_room].bet * 2 + (_bank * rooms[_room].fees / (100 * 1e18))); // уменьшаем банк комнаты на комиссию + выигрыш победителя
uint _sum; // сумма всех ставок
for(uint256 i = 0; i < rooms[_room].player1_users.length; i++){
_arrPlayer1[i] = rooms[_room].player1_users[i]; // копируем всех кто ставил на игрока 1
_arrPay1[i] = rooms[_room].player1_bets[i]; // копируем все ставки на игрока 1
_sum += _arrPay1[i]; // ссумируем все их ставки, для точного определения процента каждого
}
for(uint256 i = 0; i < rooms[_room].player1_users.length; i++){
_arrPay1[i] = _arrPay1[i] * (100 * 1e18) / _sum; // находим процент от суммы ставок, который должен получить пользователь
_arrPay1[i] = _bank * _arrPay1[i] / (100 * 1e18); // находим выплату по проценту
}
_arrPay1[0] += (rooms[_room].bet * 2); // к ставки игрока добавляется его награда за победу в игре
_sum = 0; // обнуляем сумму для расчета других победителей
for(uint256 i = 0; i < rooms[_room].player2_users.length; i++){
_arrPlayer2[i] = rooms[_room].player2_users[i]; // копируем всех кто ставил на игрока 2
_arrPay2[i] = rooms[_room].player2_bets[i]; // копируем все ставки на игрока 2
_sum += _arrPay2[i]; // ссумируем все их ставки, для точного определения процента каждого
}
for(uint256 i = 0; i < rooms[_room].player2_users.length; i++){
_arrPay2[i] = _arrPay2[i] * (100 * 1e18) / _sum; // находим процент от суммы ставок, который должен получить пользователь
_arrPay2[i] = _bank * _arrPay2[i] / (100 * 1e18); // находим выплату по проценту
}
_arrPay2[0] += (rooms[_room].bet * 2); // к ставки игрока добавляется его награда за победу в игре
// Возвращаем банк комнаты и 4 массива (игроки1, выплаты1, игроки2, выплаты2)
return (rooms[_room].bankRoom, _arrPlayer1, _arrPay1, _arrPlayer2, _arrPay2);
}
}
Contract ABI
[{"type":"event","name":"UsedRoom","inputs":[{"type":"uint256","name":"room","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"amountGames","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"betOnPlayer1","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"betOnPlayer2","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"closeRoom","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"commission","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"depositCancel","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"depositGame","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"fees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gameRoom","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gameRoomMax","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gamerBetPool","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct AstralCards.ActiveRoom[]","components":[{"type":"uint256","name":"room","internalType":"uint256"},{"type":"uint256","name":"bankRoom","internalType":"uint256"},{"type":"uint256","name":"bet","internalType":"uint256"},{"type":"uint256","name":"status","internalType":"uint256"},{"type":"address","name":"player1","internalType":"address"},{"type":"address","name":"player2","internalType":"address"}]}],"name":"getCreatedRooms","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address[]","name":"","internalType":"address[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"address[]","name":"","internalType":"address[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getPreview","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct AstralCards.Room","components":[{"type":"uint256","name":"bankRoom","internalType":"uint256"},{"type":"uint256","name":"bet","internalType":"uint256"},{"type":"uint256","name":"fees","internalType":"uint256"},{"type":"uint256","name":"status","internalType":"uint256"},{"type":"address[]","name":"player1_users","internalType":"address[]"},{"type":"uint256[]","name":"player1_bets","internalType":"uint256[]"},{"type":"address[]","name":"player2_users","internalType":"address[]"},{"type":"uint256[]","name":"player2_bets","internalType":"uint256[]"}]}],"name":"getRoom","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct AstralCards.User","components":[{"type":"uint8","name":"avatar","internalType":"uint8"},{"type":"string","name":"lang","internalType":"string"},{"type":"string","name":"name","internalType":"string"}]}],"name":"getSettings","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxUsersPerPlayer","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minGameBet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"oracle","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"saveSettings","inputs":[{"type":"uint8","name":"_avatar","internalType":"uint8"},{"type":"string","name":"_lang","internalType":"string"},{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"_fees","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGameRoomsMax","inputs":[{"type":"uint256","name":"_gameRoomMax","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGamerBetPool","inputs":[{"type":"uint256","name":"_gamerBetPool","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxUsersPerPlayer","inputs":[{"type":"uint256","name":"_maxUsersPerPlayer","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinGameBet","inputs":[{"type":"uint256","name":"_minGameBet","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNewCommission","inputs":[{"type":"address","name":"_commission","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNewOracle","inputs":[{"type":"address","name":"_newOracle","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRoomStatus","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"},{"type":"uint256","name":"_status","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWinner","inputs":[{"type":"uint256","name":"_room","internalType":"uint256"},{"type":"address","name":"_winner","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x608060405260016000556008600255678ac7230489e8000060035568015af1d78b58c40000600455601e600555674563918244f4000060065533600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561010757600080fd5b50614f4d806101176000396000f3fe6080604052600436106101c65760003560e01c80638699aa0b116100f7578063afa723a011610095578063d1c4cd8311610064578063d1c4cd83146105e0578063e034d87b14610609578063e148919114610634578063e1e6f1501461065f576101d5565b8063afa723a01461054a578063bdd42aee14610575578063ca01e3361461059e578063cc28f73d146105c9576101d5565b80639af1d35a116100d15780639af1d35a146104c15780639c623683146104ec578063aab30a3b14610515578063ae94058e1461051f576101d5565b80638699aa0b1461042c5780638d617c1c146104555780638da5cb5b14610496576101d5565b806341b1311a116101645780636d8a74cb1161013e5780636d8a74cb1461035c578063754b174d146103995780637706d1f6146103c45780637dc0d1d014610401576101d5565b806341b1311a146102ee5780634c42e4b4146103175780635ccf3e9314610340576101d5565b80631c3a8892116101a05780631c3a88921461024a57806327081703146102735780633d18678e1461029c5780633d6a3664146102c5576101d5565b80630ceb14fa146101da5780630ffa13ce14610205578063147778221461022e576101d5565b366101d5576101d361068a565b005b600080fd5b3480156101e657600080fd5b506101ef610cfe565b6040516101fc9190613bc9565b60405180910390f35b34801561021157600080fd5b5061022c60048036038101906102279190613c24565b610d04565b005b61024860048036038101906102439190613c24565b610d9e565b005b34801561025657600080fd5b50610271600480360381019061026c9190613c24565b6110a5565b005b34801561027f57600080fd5b5061029a60048036038101906102959190613c24565b61157c565b005b3480156102a857600080fd5b506102c360048036038101906102be9190613c24565b611616565b005b3480156102d157600080fd5b506102ec60048036038101906102e79190613caf565b6116b0565b005b3480156102fa57600080fd5b5061031560048036038101906103109190613c24565b611784565b005b34801561032357600080fd5b5061033e60048036038101906103399190613c24565b61181e565b005b61035a60048036038101906103559190613c24565b6118b8565b005b34801561036857600080fd5b50610383600480360381019061037e9190613c24565b611bbf565b6040516103909190613f1d565b60405180910390f35b3480156103a557600080fd5b506103ae611de1565b6040516103bb9190613bc9565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613caf565b611de7565b6040516103f89190614042565b60405180910390f35b34801561040d57600080fd5b50610416611f81565b6040516104239190614073565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613caf565b611fa7565b005b34801561046157600080fd5b5061047c60048036038101906104779190613c24565b61207b565b60405161048d95949392919061416c565b60405180910390f35b3480156104a257600080fd5b506104ab612957565b6040516104b89190614073565b60405180910390f35b3480156104cd57600080fd5b506104d661297d565b6040516104e39190613bc9565b60405180910390f35b3480156104f857600080fd5b50610513600480360381019061050e91906141db565b612983565b005b61051d61068a565b005b34801561052b57600080fd5b50610534612e5d565b6040516105419190614345565b60405180910390f35b34801561055657600080fd5b5061055f613152565b60405161056c9190613bc9565b60405180910390f35b34801561058157600080fd5b5061059c600480360381019061059791906144c8565b613158565b005b3480156105aa57600080fd5b506105b3613258565b6040516105c09190613bc9565b60405180910390f35b3480156105d557600080fd5b506105de61325e565b005b3480156105ec57600080fd5b5061060760048036038101906106029190614553565b613455565b005b34801561061557600080fd5b5061061e61358d565b60405161062b9190613bc9565b60405180910390f35b34801561064057600080fd5b50610649613593565b6040516106569190614073565b60405180910390f35b34801561066b57600080fd5b506106746135b9565b6040516106819190613bc9565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ef906145f0565b60405180910390fd5b60035434101561073d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107349061465c565b60405180910390fd5b6000600b600080548152602001908152602001600020600301540361089257600254600154106107a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610799906146c8565b60405180910390fd5b34600b600080548152602001908152602001600020600101819055506001600b60008054815260200190815260200160002060030181905550600b600080548152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061085e6000546135bf565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2610cfc565b600b6000805481526020019081526020016000206004016000815481106108bc576108bb6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b90614763565b60405180910390fd5b600b600080548152602001908152602001600020600101543411156109e1573373ffffffffffffffffffffffffffffffffffffffff166108fc600b60008054815260200190815260200160002060010154346109b091906147b2565b9081150290604051600060405180830381858888f193505050501580156109db573d6000803e3d6000fd5b50610adb565b600b60008054815260200190815260200160002060010154341015610ada57600b600080548152602001908152602001600020600401600081548110610a2a57610a296146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc34600b60008054815260200190815260200160002060010154610a9191906147b2565b9081150290604051600060405180830381858888f19350505050158015610abc573d6000803e3d6000fd5b5034600b600080548152602001908152602001600020600101819055505b5b6002600b60008054815260200190815260200160002060010154610aff91906147e6565b600b60008054815260200190815260200160002060000181905550600068056bc75e2d63100000600454600b60008054815260200190815260200160002060010154610b4b91906147e6565b610b55919061486f565b905080600b6000805481526020019081526020016000206001016000828254610b7e91906147b2565b92505081905550600b600080548152602001908152602001600020600501819080600181540180825580915050600190039060005260206000200160009091909190915055600b600080548152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b600080548152602001908152602001600020600701819080600181540180825580915050600190039060005260206000200160009091909190915055600654600b600080548152602001908152602001600020600201819055506003600b600080548152602001908152602001600020600301819055506000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2600080815480929190610cf5906148a0565b9190505550505b565b60015481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b90614934565b60405180910390fd5b8060028190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906145f0565b60405180910390fd5b6004600354610e1b919061486f565b341015610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e549061465c565b60405180910390fd5b6003600b60008381526020019081526020016000206003015414610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead906149a0565b60405180910390fd5b600554600b6000838152602001908152602001600020600601805490501115610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90614a0c565b60405180910390fd5b600080610f35600b600085815260200190815260200160002060060161368e565b80925081935050508015610f915734600b60008581526020019081526020016000206007018381548110610f6c57610f6b6146e8565b5b906000526020600020016000828254610f859190614a2c565b92505081905550611046565b600b6000848152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008481526020019081526020016000206007013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600b6000858152602001908152602001600020600001600082825461106c9190614a2c565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061114e5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490614aac565b60405180910390fd5b6003600b60008381526020019081526020016000206003015414806111c857506002600b600083815260200190815260200160002060030154145b611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe90614b18565b60405180910390fd5b600b600082815260200190815260200160002060010154600b6000838152602001908152602001600020600501600081548110611247576112466146e8565b5b9060005260206000200160008282546112609190614a2c565b92505081905550600b600082815260200190815260200160002060010154600b60008381526020019081526020016000206007016000815481106112a7576112a66146e8565b5b9060005260206000200160008282546112c09190614a2c565b9250508190555060005b600b6000838152602001908152602001600020600401805490508110156113c957600b60008381526020019081526020016000206004018181548110611313576113126146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600b6000858152602001908152602001600020600501838154811061137f5761137e6146e8565b5b90600052602060002001549081150290604051600060405180830381858888f193505050501580156113b5573d6000803e3d6000fd5b5080806113c1906148a0565b9150506112ca565b5060005b600b6000838152602001908152602001600020600601805490508110156114cc57600b60008381526020019081526020016000206006018181548110611416576114156146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600b60008581526020019081526020016000206007018381548110611482576114816146e8565b5b90600052602060002001549081150290604051600060405180830381858888f193505050501580156114b8573d6000803e3d6000fd5b5080806114c4906148a0565b9150506113cd565b506114d68161373e565b600b600082815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905560048201600061151a9190613a86565b60058201600061152a9190613aa7565b60068201600061153a9190613a86565b60078201600061154a9190613aa7565b5050807fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a250565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461160c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160390614934565b60405180910390fd5b8060038190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169d90614934565b60405180910390fd5b8060068190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790614934565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90614934565b60405180910390fd5b8060048190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590614934565b60405180910390fd5b8060058190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d906145f0565b60405180910390fd5b6004600354611935919061486f565b341015611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e9061465c565b60405180910390fd5b6003600b600083815260200190815260200160002060030154146119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c7906149a0565b60405180910390fd5b600554600b6000838152602001908152602001600020600401805490501115611a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2590614a0c565b60405180910390fd5b600080611a4f600b600085815260200190815260200160002060040161368e565b80925081935050508015611aab5734600b60008581526020019081526020016000206005018381548110611a8657611a856146e8565b5b906000526020600020016000828254611a9f9190614a2c565b92505081905550611b60565b600b6000848152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008481526020019081526020016000206005013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600b60008581526020019081526020016000206000016000828254611b869190614a2c565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b611bc7613ac8565b600b6000838152602001908152602001600020604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201805480602002602001604051908101604052809291908181526020018280548015611c9357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611c49575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015611ceb57602002820191906000526020600020905b815481526020019060010190808311611cd7575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611d7957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611d2f575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015611dd157602002820191906000526020600020905b815481526020019060010190808311611dbd575b5050505050815250509050919050565b60025481565b611def613b0d565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff1660ff1660ff168152602001600182018054611e6690614b67565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9290614b67565b8015611edf5780601f10611eb457610100808354040283529160200191611edf565b820191906000526020600020905b815481529060010190602001808311611ec257829003601f168201915b50505050508152602001600282018054611ef890614b67565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2490614b67565b8015611f715780601f10611f4657610100808354040283529160200191611f71565b820191906000526020600020905b815481529060010190602001808311611f5457829003601f168201915b5050505050815250509050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202e90614934565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006060806060806002600b60008881526020019081526020016000206003015410156121da5760008067ffffffffffffffff8111156120be576120bd61439d565b5b6040519080825280602002602001820160405280156120ec5781602001602082028036833780820191505090505b50600067ffffffffffffffff8111156121085761210761439d565b5b6040519080825280602002602001820160405280156121365781602001602082028036833780820191505090505b50600067ffffffffffffffff8111156121525761215161439d565b5b6040519080825280602002602001820160405280156121805781602001602082028036833780820191505090505b50600067ffffffffffffffff81111561219c5761219b61439d565b5b6040519080825280602002602001820160405280156121ca5781602001602082028036833780820191505090505b509450945094509450945061294e565b6000600b60008881526020019081526020016000206004018054905067ffffffffffffffff81111561220f5761220e61439d565b5b60405190808252806020026020018201604052801561223d5781602001602082028036833780820191505090505b5090506000600b60008981526020019081526020016000206004018054905067ffffffffffffffff8111156122755761227461439d565b5b6040519080825280602002602001820160405280156122a35781602001602082028036833780820191505090505b5090506000600b60008a81526020019081526020016000206006018054905067ffffffffffffffff8111156122db576122da61439d565b5b6040519080825280602002602001820160405280156123095781602001602082028036833780820191505090505b5090506000600b60008b81526020019081526020016000206006018054905067ffffffffffffffff8111156123415761234061439d565b5b60405190808252806020026020018201604052801561236f5781602001602082028036833780820191505090505b5090506000600b60008c815260200190815260200160002060000154905068056bc75e2d63100000600b60008d815260200190815260200160002060020154826123b991906147e6565b6123c3919061486f565b6002600b60008e8152602001908152602001600020600101546123e691906147e6565b6123f09190614a2c565b816123fb91906147b2565b9050600080600090505b600b60008e81526020019081526020016000206004018054905081101561255357600b60008e8152602001908152602001600020600401818154811061244e5761244d6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687828151811061248c5761248b6146e8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60008e815260200190815260200160002060050181815481106124ee576124ed6146e8565b5b906000526020600020015486828151811061250c5761250b6146e8565b5b60200260200101818152505085818151811061252b5761252a6146e8565b5b60200260200101518261253e9190614a2c565b9150808061254b906148a0565b915050612405565b5060005b600b60008e81526020019081526020016000206004018054905081101561263d578168056bc75e2d63100000878381518110612596576125956146e8565b5b60200260200101516125a891906147e6565b6125b2919061486f565b8682815181106125c5576125c46146e8565b5b60200260200101818152505068056bc75e2d631000008682815181106125ee576125ed6146e8565b5b60200260200101518461260191906147e6565b61260b919061486f565b86828151811061261e5761261d6146e8565b5b6020026020010181815250508080612635906148a0565b915050612557565b506002600b60008e81526020019081526020016000206001015461266191906147e6565b85600081518110612675576126746146e8565b5b602002602001018181516126899190614a2c565b915081815250506000905060005b600b60008e8152602001908152602001600020600601805490508110156127e557600b60008e815260200190815260200160002060060181815481106126e0576126df6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685828151811061271e5761271d6146e8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60008e815260200190815260200160002060070181815481106127805761277f6146e8565b5b906000526020600020015484828151811061279e5761279d6146e8565b5b6020026020010181815250508381815181106127bd576127bc6146e8565b5b6020026020010151826127d09190614a2c565b915080806127dd906148a0565b915050612697565b5060005b600b60008e8152602001908152602001600020600601805490508110156128cf578168056bc75e2d63100000858381518110612828576128276146e8565b5b602002602001015161283a91906147e6565b612844919061486f565b848281518110612857576128566146e8565b5b60200260200101818152505068056bc75e2d631000008482815181106128805761287f6146e8565b5b60200260200101518461289391906147e6565b61289d919061486f565b8482815181106128b0576128af6146e8565b5b60200260200101818152505080806128c7906148a0565b9150506127e9565b506002600b60008e8152602001908152602001600020600101546128f391906147e6565b83600081518110612907576129066146e8565b5b6020026020010181815161291b9190614a2c565b91508181525050600b60008d815260200190815260200160002060000154868686869a509a509a509a509a505050505050505b91939590929450565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0a90614be4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b6000848152602001908152602001600020600401600081548110612a5357612a526146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612b1e57508073ffffffffffffffffffffffffffffffffffffffff16600b6000848152602001908152602001600020600601600081548110612adb57612ada6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612b2757600080fd5b600068056bc75e2d63100000600b600085815260200190815260200160002060020154600b600086815260200190815260200160002060000154612b6b91906147e6565b612b75919061486f565b90506002600b60008581526020019081526020016000206001016000828254612b9e91906147e6565b92505081905550600b60008481526020019081526020016000206001015481612bc79190614a2c565b600b60008581526020019081526020016000206000016000828254612bec91906147b2565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600b6000858152602001908152602001600020600401600081548110612c3357612c326146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612ce057612cdb600b600085815260200190815260200160002060000154600b600086815260200190815260200160002060010154600b6000878152602001908152602001600020600401600b6000888152602001908152602001600020600501613815565b612d43565b612d42600b600085815260200190815260200160002060000154600b600086815260200190815260200160002060010154600b6000878152602001908152602001600020600601600b6000888152602001908152602001600020600701613815565b5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612dab573d6000803e3d6000fd5b50612db58361373e565b600b6000848152602001908152602001600020600080820160009055600182016000905560028201600090556003820160009055600482016000612df99190613a86565b600582016000612e099190613aa7565b600682016000612e199190613a86565b600782016000612e299190613aa7565b5050827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b6060600060015467ffffffffffffffff811115612e7d57612e7c61439d565b5b604051908082528060200260200182016040528015612eb657816020015b612ea3613b31565b815260200190600190039081612e9b5790505b5090506000600c600080815260200190815260200160002060010154905060005b6001548110156131495781838281518110612ef557612ef46146e8565b5b60200260200101516000018181525050600b600083815260200190815260200160002060000154838281518110612f2f57612f2e6146e8565b5b60200260200101516020018181525050600b600083815260200190815260200160002060010154838281518110612f6957612f686146e8565b5b60200260200101516040018181525050600b600083815260200190815260200160002060030154838281518110612fa357612fa26146e8565b5b60200260200101516060018181525050600b6000838152602001908152602001600020600401600081548110612fdc57612fdb6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061301a576130196146e8565b5b60200260200101516080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001600b600084815260200190815260200160002060030154111561311d57600b60008381526020019081526020016000206006016000815481106130a05761309f6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382815181106130de576130dd6146e8565b5b602002602001015160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b600c60008381526020019081526020016000206001015491508080613141906148a0565b915050612ed7565b50819250505090565b60035481565b82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010190816132029190614db0565b5080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020190816132529190614db0565b50505050565b60045481565b600b600080548152602001908152602001600020600401600081548110613288576132876146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331790614ece565b60405180910390fd5b6001600b600080548152602001908152602001600020600301541461334457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc600b600080548152602001908152602001600020600101549081150290604051600060405180830381858888f193505050501580156133a1573d6000803e3d6000fd5b50600b6000805481526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090556004820160006133e79190613a86565b6005820160006133f79190613aa7565b6006820160006134079190613a86565b6007820160006134179190613aa7565b505061342460005461373e565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146134e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dc90614be4565b60405180910390fd5b60028114806134f45750600381145b6134fd57600080fd5b6002600b600084815260200190815260200160002060030154148061353857506003600b600084815260200190815260200160002060030154145b61354157600080fd5b80600b600084815260200190815260200160002060030181905550817fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a25050565b60055481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b80600c6000838152602001908152602001600020600001819055506000600c600083815260200190815260200160002060010181905550600c600080815260200190815260200160002060020154600c60008381526020019081526020016000206002018190555080600c6000600c60008081526020019081526020016000206002015481526020019081526020016000206001018190555080600c60008081526020019081526020016000206002018190555060016000815480929190613686906148a0565b919050555050565b60008060005b8380549050811015613730578381815481106136b3576136b26146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361371d578060019250925050613739565b8080613728906148a0565b915050613694565b50600080915091505b915091565b600c600082815260200190815260200160002060010154600c6000600c600085815260200190815260200160002060020154815260200190815260200160002060010181905550600c600082815260200190815260200160002060020154600c6000600c600085815260200190815260200160002060010154815260200190815260200160002060020181905550600160008154809291906137df90614eee565b9190505550600c600082815260200190815260200160002060008082016000905560018201600090556002820160009055505050565b600080838054905067ffffffffffffffff8111156138365761383561439d565b5b6040519080825280602002602001820160405280156138645781602001602082028036833780820191505090505b50905060005b84805490508110156138b457838181548110613889576138886146e8565b5b90600052602060002001548361389f9190614a2c565b925080806138ac906148a0565b91505061386a565b5060005b848054905081101561398c578268056bc75e2d631000008583815481106138e2576138e16146e8565b5b90600052602060002001546138f791906147e6565b613901919061486f565b828281518110613914576139136146e8565b5b60200260200101818152505068056bc75e2d6310000082828151811061393d5761393c6146e8565b5b60200260200101518861395091906147e6565b61395a919061486f565b82828151811061396d5761396c6146e8565b5b6020026020010181815250508080613984906148a0565b9150506138b8565b5084816000815181106139a2576139a16146e8565b5b602002602001018181516139b69190614a2c565b9150818152505060005b8480549050811015613a7d578481815481106139df576139de6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc838381518110613a3657613a356146e8565b5b60200260200101519081150290604051600060405180830381858888f19350505050158015613a69573d6000803e3d6000fd5b508080613a75906148a0565b9150506139c0565b50505050505050565b5080546000825590600052602060002090810190613aa49190613b93565b50565b5080546000825590600052602060002090810190613ac59190613b93565b50565b60405180610100016040528060008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040518060c0016040528060008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b5b80821115613bac576000816000905550600101613b94565b5090565b6000819050919050565b613bc381613bb0565b82525050565b6000602082019050613bde6000830184613bba565b92915050565b6000604051905090565b600080fd5b600080fd5b613c0181613bb0565b8114613c0c57600080fd5b50565b600081359050613c1e81613bf8565b92915050565b600060208284031215613c3a57613c39613bee565b5b6000613c4884828501613c0f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c7c82613c51565b9050919050565b613c8c81613c71565b8114613c9757600080fd5b50565b600081359050613ca981613c83565b92915050565b600060208284031215613cc557613cc4613bee565b5b6000613cd384828501613c9a565b91505092915050565b613ce581613bb0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d2081613c71565b82525050565b6000613d328383613d17565b60208301905092915050565b6000602082019050919050565b6000613d5682613ceb565b613d608185613cf6565b9350613d6b83613d07565b8060005b83811015613d9c578151613d838882613d26565b9750613d8e83613d3e565b925050600181019050613d6f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000613de18383613cdc565b60208301905092915050565b6000602082019050919050565b6000613e0582613da9565b613e0f8185613db4565b9350613e1a83613dc5565b8060005b83811015613e4b578151613e328882613dd5565b9750613e3d83613ded565b925050600181019050613e1e565b5085935050505092915050565b600061010083016000830151613e716000860182613cdc565b506020830151613e846020860182613cdc565b506040830151613e976040860182613cdc565b506060830151613eaa6060860182613cdc565b5060808301518482036080860152613ec28282613d4b565b91505060a083015184820360a0860152613edc8282613dfa565b91505060c083015184820360c0860152613ef68282613d4b565b91505060e083015184820360e0860152613f108282613dfa565b9150508091505092915050565b60006020820190508181036000830152613f378184613e58565b905092915050565b600060ff82169050919050565b613f5581613f3f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f95578082015181840152602081019050613f7a565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fbd82613f5b565b613fc78185613f66565b9350613fd7818560208601613f77565b613fe081613fa1565b840191505092915050565b60006060830160008301516140036000860182613f4c565b506020830151848203602086015261401b8282613fb2565b915050604083015184820360408601526140358282613fb2565b9150508091505092915050565b6000602082019050818103600083015261405c8184613feb565b905092915050565b61406d81613c71565b82525050565b60006020820190506140886000830184614064565b92915050565b600082825260208201905092915050565b60006140aa82613ceb565b6140b4818561408e565b93506140bf83613d07565b8060005b838110156140f05781516140d78882613d26565b97506140e283613d3e565b9250506001810190506140c3565b5085935050505092915050565b600082825260208201905092915050565b600061411982613da9565b61412381856140fd565b935061412e83613dc5565b8060005b8381101561415f5781516141468882613dd5565b975061415183613ded565b925050600181019050614132565b5085935050505092915050565b600060a0820190506141816000830188613bba565b8181036020830152614193818761409f565b905081810360408301526141a7818661410e565b905081810360608301526141bb818561409f565b905081810360808301526141cf818461410e565b90509695505050505050565b600080604083850312156141f2576141f1613bee565b5b600061420085828601613c0f565b925050602061421185828601613c9a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60c08201600082015161425d6000850182613cdc565b5060208201516142706020850182613cdc565b5060408201516142836040850182613cdc565b5060608201516142966060850182613cdc565b5060808201516142a96080850182613d17565b5060a08201516142bc60a0850182613d17565b50505050565b60006142ce8383614247565b60c08301905092915050565b6000602082019050919050565b60006142f28261421b565b6142fc8185614226565b935061430783614237565b8060005b8381101561433857815161431f88826142c2565b975061432a836142da565b92505060018101905061430b565b5085935050505092915050565b6000602082019050818103600083015261435f81846142e7565b905092915050565b61437081613f3f565b811461437b57600080fd5b50565b60008135905061438d81614367565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143d582613fa1565b810181811067ffffffffffffffff821117156143f4576143f361439d565b5b80604052505050565b6000614407613be4565b905061441382826143cc565b919050565b600067ffffffffffffffff8211156144335761443261439d565b5b61443c82613fa1565b9050602081019050919050565b82818337600083830152505050565b600061446b61446684614418565b6143fd565b90508281526020810184848401111561448757614486614398565b5b614492848285614449565b509392505050565b600082601f8301126144af576144ae614393565b5b81356144bf848260208601614458565b91505092915050565b6000806000606084860312156144e1576144e0613bee565b5b60006144ef8682870161437e565b935050602084013567ffffffffffffffff8111156145105761450f613bf3565b5b61451c8682870161449a565b925050604084013567ffffffffffffffff81111561453d5761453c613bf3565b5b6145498682870161449a565b9150509250925092565b6000806040838503121561456a57614569613bee565b5b600061457885828601613c0f565b925050602061458985828601613c0f565b9150509250929050565b600082825260208201905092915050565b7f4f6e6c7920454f41000000000000000000000000000000000000000000000000600082015250565b60006145da600883614593565b91506145e5826145a4565b602082019050919050565b60006020820190508181036000830152614609816145cd565b9050919050565b7f6c6f772062657400000000000000000000000000000000000000000000000000600082015250565b6000614646600783614593565b915061465182614610565b602082019050919050565b6000602082019050818103600083015261467581614639565b9050919050565b7f6d617820726f6f6d732063726561746564000000000000000000000000000000600082015250565b60006146b2601183614593565b91506146bd8261467c565b602082019050919050565b600060208201905081810360008301526146e1816146a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f616c726561647920616464656400000000000000000000000000000000000000600082015250565b600061474d600d83614593565b915061475882614717565b602082019050919050565b6000602082019050818103600083015261477c81614740565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147bd82613bb0565b91506147c883613bb0565b92508282039050818111156147e0576147df614783565b5b92915050565b60006147f182613bb0565b91506147fc83613bb0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561483557614834614783565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061487a82613bb0565b915061488583613bb0565b92508261489557614894614840565b5b828204905092915050565b60006148ab82613bb0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148dd576148dc614783565b5b600182019050919050565b7f4f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b600061491e600a83614593565b9150614929826148e8565b602082019050919050565b6000602082019050818103600083015261494d81614911565b9050919050565b7f62657473206172652070726f6869626974656400000000000000000000000000600082015250565b600061498a601383614593565b915061499582614954565b602082019050919050565b600060208201905081810360008301526149b98161497d565b9050919050565b7f4d616e7920757365727320776974682062657473000000000000000000000000600082015250565b60006149f6601483614593565b9150614a01826149c0565b602082019050919050565b60006020820190508181036000830152614a25816149e9565b9050919050565b6000614a3782613bb0565b9150614a4283613bb0565b9250828201905080821115614a5a57614a59614783565b5b92915050565b7f4f6e6c79206f776e6572206f72206f7261636c65000000000000000000000000600082015250565b6000614a96601483614593565b9150614aa182614a60565b602082019050919050565b60006020820190508181036000830152614ac581614a89565b9050919050565b7f6261642073746174757300000000000000000000000000000000000000000000600082015250565b6000614b02600a83614593565b9150614b0d82614acc565b602082019050919050565b60006020820190508181036000830152614b3181614af5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b7f57607f821691505b602082108103614b9257614b91614b38565b5b50919050565b7f4f6e6c79206f7261636c65000000000000000000000000000000000000000000600082015250565b6000614bce600b83614593565b9150614bd982614b98565b602082019050919050565b60006020820190508181036000830152614bfd81614bc1565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614c667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614c29565b614c708683614c29565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614cad614ca8614ca384613bb0565b614c88565b613bb0565b9050919050565b6000819050919050565b614cc783614c92565b614cdb614cd382614cb4565b848454614c36565b825550505050565b600090565b614cf0614ce3565b614cfb818484614cbe565b505050565b5b81811015614d1f57614d14600082614ce8565b600181019050614d01565b5050565b601f821115614d6457614d3581614c04565b614d3e84614c19565b81016020851015614d4d578190505b614d61614d5985614c19565b830182614d00565b50505b505050565b600082821c905092915050565b6000614d8760001984600802614d69565b1980831691505092915050565b6000614da08383614d76565b9150826002028217905092915050565b614db982613f5b565b67ffffffffffffffff811115614dd257614dd161439d565b5b614ddc8254614b67565b614de7828285614d23565b600060209050601f831160018114614e1a5760008415614e08578287015190505b614e128582614d94565b865550614e7a565b601f198416614e2886614c04565b60005b82811015614e5057848901518255600182019150602085019450602081019050614e2b565b86831015614e6d5784890151614e69601f891682614d76565b8355505b6001600288020188555050505b505050505050565b7f6e6f7420796f7572206265740000000000000000000000000000000000000000600082015250565b6000614eb8600c83614593565b9150614ec382614e82565b602082019050919050565b60006020820190508181036000830152614ee781614eab565b9050919050565b6000614ef982613bb0565b915060008203614f0c57614f0b614783565b5b60018203905091905056fea26469706673582212201ecd11606a53cf9f1978959d6993a3ec2f8d8d146e2afd6ca2339a24c5b3febc64736f6c63430008100033
Deployed ByteCode
0x6080604052600436106101c65760003560e01c80638699aa0b116100f7578063afa723a011610095578063d1c4cd8311610064578063d1c4cd83146105e0578063e034d87b14610609578063e148919114610634578063e1e6f1501461065f576101d5565b8063afa723a01461054a578063bdd42aee14610575578063ca01e3361461059e578063cc28f73d146105c9576101d5565b80639af1d35a116100d15780639af1d35a146104c15780639c623683146104ec578063aab30a3b14610515578063ae94058e1461051f576101d5565b80638699aa0b1461042c5780638d617c1c146104555780638da5cb5b14610496576101d5565b806341b1311a116101645780636d8a74cb1161013e5780636d8a74cb1461035c578063754b174d146103995780637706d1f6146103c45780637dc0d1d014610401576101d5565b806341b1311a146102ee5780634c42e4b4146103175780635ccf3e9314610340576101d5565b80631c3a8892116101a05780631c3a88921461024a57806327081703146102735780633d18678e1461029c5780633d6a3664146102c5576101d5565b80630ceb14fa146101da5780630ffa13ce14610205578063147778221461022e576101d5565b366101d5576101d361068a565b005b600080fd5b3480156101e657600080fd5b506101ef610cfe565b6040516101fc9190613bc9565b60405180910390f35b34801561021157600080fd5b5061022c60048036038101906102279190613c24565b610d04565b005b61024860048036038101906102439190613c24565b610d9e565b005b34801561025657600080fd5b50610271600480360381019061026c9190613c24565b6110a5565b005b34801561027f57600080fd5b5061029a60048036038101906102959190613c24565b61157c565b005b3480156102a857600080fd5b506102c360048036038101906102be9190613c24565b611616565b005b3480156102d157600080fd5b506102ec60048036038101906102e79190613caf565b6116b0565b005b3480156102fa57600080fd5b5061031560048036038101906103109190613c24565b611784565b005b34801561032357600080fd5b5061033e60048036038101906103399190613c24565b61181e565b005b61035a60048036038101906103559190613c24565b6118b8565b005b34801561036857600080fd5b50610383600480360381019061037e9190613c24565b611bbf565b6040516103909190613f1d565b60405180910390f35b3480156103a557600080fd5b506103ae611de1565b6040516103bb9190613bc9565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613caf565b611de7565b6040516103f89190614042565b60405180910390f35b34801561040d57600080fd5b50610416611f81565b6040516104239190614073565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190613caf565b611fa7565b005b34801561046157600080fd5b5061047c60048036038101906104779190613c24565b61207b565b60405161048d95949392919061416c565b60405180910390f35b3480156104a257600080fd5b506104ab612957565b6040516104b89190614073565b60405180910390f35b3480156104cd57600080fd5b506104d661297d565b6040516104e39190613bc9565b60405180910390f35b3480156104f857600080fd5b50610513600480360381019061050e91906141db565b612983565b005b61051d61068a565b005b34801561052b57600080fd5b50610534612e5d565b6040516105419190614345565b60405180910390f35b34801561055657600080fd5b5061055f613152565b60405161056c9190613bc9565b60405180910390f35b34801561058157600080fd5b5061059c600480360381019061059791906144c8565b613158565b005b3480156105aa57600080fd5b506105b3613258565b6040516105c09190613bc9565b60405180910390f35b3480156105d557600080fd5b506105de61325e565b005b3480156105ec57600080fd5b5061060760048036038101906106029190614553565b613455565b005b34801561061557600080fd5b5061061e61358d565b60405161062b9190613bc9565b60405180910390f35b34801561064057600080fd5b50610649613593565b6040516106569190614073565b60405180910390f35b34801561066b57600080fd5b506106746135b9565b6040516106819190613bc9565b60405180910390f35b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ef906145f0565b60405180910390fd5b60035434101561073d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107349061465c565b60405180910390fd5b6000600b600080548152602001908152602001600020600301540361089257600254600154106107a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610799906146c8565b60405180910390fd5b34600b600080548152602001908152602001600020600101819055506001600b60008054815260200190815260200160002060030181905550600b600080548152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061085e6000546135bf565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2610cfc565b600b6000805481526020019081526020016000206004016000815481106108bc576108bb6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b90614763565b60405180910390fd5b600b600080548152602001908152602001600020600101543411156109e1573373ffffffffffffffffffffffffffffffffffffffff166108fc600b60008054815260200190815260200160002060010154346109b091906147b2565b9081150290604051600060405180830381858888f193505050501580156109db573d6000803e3d6000fd5b50610adb565b600b60008054815260200190815260200160002060010154341015610ada57600b600080548152602001908152602001600020600401600081548110610a2a57610a296146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc34600b60008054815260200190815260200160002060010154610a9191906147b2565b9081150290604051600060405180830381858888f19350505050158015610abc573d6000803e3d6000fd5b5034600b600080548152602001908152602001600020600101819055505b5b6002600b60008054815260200190815260200160002060010154610aff91906147e6565b600b60008054815260200190815260200160002060000181905550600068056bc75e2d63100000600454600b60008054815260200190815260200160002060010154610b4b91906147e6565b610b55919061486f565b905080600b6000805481526020019081526020016000206001016000828254610b7e91906147b2565b92505081905550600b600080548152602001908152602001600020600501819080600181540180825580915050600190039060005260206000200160009091909190915055600b600080548152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b600080548152602001908152602001600020600701819080600181540180825580915050600190039060005260206000200160009091909190915055600654600b600080548152602001908152602001600020600201819055506003600b600080548152602001908152602001600020600301819055506000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2600080815480929190610cf5906148a0565b9190505550505b565b60015481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b90614934565b60405180910390fd5b8060028190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906145f0565b60405180910390fd5b6004600354610e1b919061486f565b341015610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e549061465c565b60405180910390fd5b6003600b60008381526020019081526020016000206003015414610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead906149a0565b60405180910390fd5b600554600b6000838152602001908152602001600020600601805490501115610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90614a0c565b60405180910390fd5b600080610f35600b600085815260200190815260200160002060060161368e565b80925081935050508015610f915734600b60008581526020019081526020016000206007018381548110610f6c57610f6b6146e8565b5b906000526020600020016000828254610f859190614a2c565b92505081905550611046565b600b6000848152602001908152602001600020600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008481526020019081526020016000206007013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600b6000858152602001908152602001600020600001600082825461106c9190614a2c565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061114e5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490614aac565b60405180910390fd5b6003600b60008381526020019081526020016000206003015414806111c857506002600b600083815260200190815260200160002060030154145b611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe90614b18565b60405180910390fd5b600b600082815260200190815260200160002060010154600b6000838152602001908152602001600020600501600081548110611247576112466146e8565b5b9060005260206000200160008282546112609190614a2c565b92505081905550600b600082815260200190815260200160002060010154600b60008381526020019081526020016000206007016000815481106112a7576112a66146e8565b5b9060005260206000200160008282546112c09190614a2c565b9250508190555060005b600b6000838152602001908152602001600020600401805490508110156113c957600b60008381526020019081526020016000206004018181548110611313576113126146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600b6000858152602001908152602001600020600501838154811061137f5761137e6146e8565b5b90600052602060002001549081150290604051600060405180830381858888f193505050501580156113b5573d6000803e3d6000fd5b5080806113c1906148a0565b9150506112ca565b5060005b600b6000838152602001908152602001600020600601805490508110156114cc57600b60008381526020019081526020016000206006018181548110611416576114156146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600b60008581526020019081526020016000206007018381548110611482576114816146e8565b5b90600052602060002001549081150290604051600060405180830381858888f193505050501580156114b8573d6000803e3d6000fd5b5080806114c4906148a0565b9150506113cd565b506114d68161373e565b600b600082815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905560048201600061151a9190613a86565b60058201600061152a9190613aa7565b60068201600061153a9190613a86565b60078201600061154a9190613aa7565b5050807fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a250565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461160c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160390614934565b60405180910390fd5b8060038190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169d90614934565b60405180910390fd5b8060068190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790614934565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90614934565b60405180910390fd5b8060048190555050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590614934565b60405180910390fd5b8060058190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d906145f0565b60405180910390fd5b6004600354611935919061486f565b341015611977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196e9061465c565b60405180910390fd5b6003600b600083815260200190815260200160002060030154146119d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c7906149a0565b60405180910390fd5b600554600b6000838152602001908152602001600020600401805490501115611a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2590614a0c565b60405180910390fd5b600080611a4f600b600085815260200190815260200160002060040161368e565b80925081935050508015611aab5734600b60008581526020019081526020016000206005018381548110611a8657611a856146e8565b5b906000526020600020016000828254611a9f9190614a2c565b92505081905550611b60565b600b6000848152602001908152602001600020600401339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008481526020019081526020016000206005013490806001815401808255809150506001900390600052602060002001600090919091909150555b34600b60008581526020019081526020016000206000016000828254611b869190614a2c565b92505081905550827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b611bc7613ac8565b600b6000838152602001908152602001600020604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201805480602002602001604051908101604052809291908181526020018280548015611c9357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611c49575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015611ceb57602002820191906000526020600020905b815481526020019060010190808311611cd7575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611d7957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611d2f575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015611dd157602002820191906000526020600020905b815481526020019060010190808311611dbd575b5050505050815250509050919050565b60025481565b611def613b0d565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff1660ff1660ff168152602001600182018054611e6690614b67565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9290614b67565b8015611edf5780601f10611eb457610100808354040283529160200191611edf565b820191906000526020600020905b815481529060010190602001808311611ec257829003601f168201915b50505050508152602001600282018054611ef890614b67565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2490614b67565b8015611f715780601f10611f4657610100808354040283529160200191611f71565b820191906000526020600020905b815481529060010190602001808311611f5457829003601f168201915b5050505050815250509050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202e90614934565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006060806060806002600b60008881526020019081526020016000206003015410156121da5760008067ffffffffffffffff8111156120be576120bd61439d565b5b6040519080825280602002602001820160405280156120ec5781602001602082028036833780820191505090505b50600067ffffffffffffffff8111156121085761210761439d565b5b6040519080825280602002602001820160405280156121365781602001602082028036833780820191505090505b50600067ffffffffffffffff8111156121525761215161439d565b5b6040519080825280602002602001820160405280156121805781602001602082028036833780820191505090505b50600067ffffffffffffffff81111561219c5761219b61439d565b5b6040519080825280602002602001820160405280156121ca5781602001602082028036833780820191505090505b509450945094509450945061294e565b6000600b60008881526020019081526020016000206004018054905067ffffffffffffffff81111561220f5761220e61439d565b5b60405190808252806020026020018201604052801561223d5781602001602082028036833780820191505090505b5090506000600b60008981526020019081526020016000206004018054905067ffffffffffffffff8111156122755761227461439d565b5b6040519080825280602002602001820160405280156122a35781602001602082028036833780820191505090505b5090506000600b60008a81526020019081526020016000206006018054905067ffffffffffffffff8111156122db576122da61439d565b5b6040519080825280602002602001820160405280156123095781602001602082028036833780820191505090505b5090506000600b60008b81526020019081526020016000206006018054905067ffffffffffffffff8111156123415761234061439d565b5b60405190808252806020026020018201604052801561236f5781602001602082028036833780820191505090505b5090506000600b60008c815260200190815260200160002060000154905068056bc75e2d63100000600b60008d815260200190815260200160002060020154826123b991906147e6565b6123c3919061486f565b6002600b60008e8152602001908152602001600020600101546123e691906147e6565b6123f09190614a2c565b816123fb91906147b2565b9050600080600090505b600b60008e81526020019081526020016000206004018054905081101561255357600b60008e8152602001908152602001600020600401818154811061244e5761244d6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687828151811061248c5761248b6146e8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60008e815260200190815260200160002060050181815481106124ee576124ed6146e8565b5b906000526020600020015486828151811061250c5761250b6146e8565b5b60200260200101818152505085818151811061252b5761252a6146e8565b5b60200260200101518261253e9190614a2c565b9150808061254b906148a0565b915050612405565b5060005b600b60008e81526020019081526020016000206004018054905081101561263d578168056bc75e2d63100000878381518110612596576125956146e8565b5b60200260200101516125a891906147e6565b6125b2919061486f565b8682815181106125c5576125c46146e8565b5b60200260200101818152505068056bc75e2d631000008682815181106125ee576125ed6146e8565b5b60200260200101518461260191906147e6565b61260b919061486f565b86828151811061261e5761261d6146e8565b5b6020026020010181815250508080612635906148a0565b915050612557565b506002600b60008e81526020019081526020016000206001015461266191906147e6565b85600081518110612675576126746146e8565b5b602002602001018181516126899190614a2c565b915081815250506000905060005b600b60008e8152602001908152602001600020600601805490508110156127e557600b60008e815260200190815260200160002060060181815481106126e0576126df6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685828151811061271e5761271d6146e8565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600b60008e815260200190815260200160002060070181815481106127805761277f6146e8565b5b906000526020600020015484828151811061279e5761279d6146e8565b5b6020026020010181815250508381815181106127bd576127bc6146e8565b5b6020026020010151826127d09190614a2c565b915080806127dd906148a0565b915050612697565b5060005b600b60008e8152602001908152602001600020600601805490508110156128cf578168056bc75e2d63100000858381518110612828576128276146e8565b5b602002602001015161283a91906147e6565b612844919061486f565b848281518110612857576128566146e8565b5b60200260200101818152505068056bc75e2d631000008482815181106128805761287f6146e8565b5b60200260200101518461289391906147e6565b61289d919061486f565b8482815181106128b0576128af6146e8565b5b60200260200101818152505080806128c7906148a0565b9150506127e9565b506002600b60008e8152602001908152602001600020600101546128f391906147e6565b83600081518110612907576129066146e8565b5b6020026020010181815161291b9190614a2c565b91508181525050600b60008d815260200190815260200160002060000154868686869a509a509a509a509a505050505050505b91939590929450565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0a90614be4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b6000848152602001908152602001600020600401600081548110612a5357612a526146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612b1e57508073ffffffffffffffffffffffffffffffffffffffff16600b6000848152602001908152602001600020600601600081548110612adb57612ada6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612b2757600080fd5b600068056bc75e2d63100000600b600085815260200190815260200160002060020154600b600086815260200190815260200160002060000154612b6b91906147e6565b612b75919061486f565b90506002600b60008581526020019081526020016000206001016000828254612b9e91906147e6565b92505081905550600b60008481526020019081526020016000206001015481612bc79190614a2c565b600b60008581526020019081526020016000206000016000828254612bec91906147b2565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600b6000858152602001908152602001600020600401600081548110612c3357612c326146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612ce057612cdb600b600085815260200190815260200160002060000154600b600086815260200190815260200160002060010154600b6000878152602001908152602001600020600401600b6000888152602001908152602001600020600501613815565b612d43565b612d42600b600085815260200190815260200160002060000154600b600086815260200190815260200160002060010154600b6000878152602001908152602001600020600601600b6000888152602001908152602001600020600701613815565b5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612dab573d6000803e3d6000fd5b50612db58361373e565b600b6000848152602001908152602001600020600080820160009055600182016000905560028201600090556003820160009055600482016000612df99190613a86565b600582016000612e099190613aa7565b600682016000612e199190613a86565b600782016000612e299190613aa7565b5050827fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2505050565b6060600060015467ffffffffffffffff811115612e7d57612e7c61439d565b5b604051908082528060200260200182016040528015612eb657816020015b612ea3613b31565b815260200190600190039081612e9b5790505b5090506000600c600080815260200190815260200160002060010154905060005b6001548110156131495781838281518110612ef557612ef46146e8565b5b60200260200101516000018181525050600b600083815260200190815260200160002060000154838281518110612f2f57612f2e6146e8565b5b60200260200101516020018181525050600b600083815260200190815260200160002060010154838281518110612f6957612f686146e8565b5b60200260200101516040018181525050600b600083815260200190815260200160002060030154838281518110612fa357612fa26146e8565b5b60200260200101516060018181525050600b6000838152602001908152602001600020600401600081548110612fdc57612fdb6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061301a576130196146e8565b5b60200260200101516080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001600b600084815260200190815260200160002060030154111561311d57600b60008381526020019081526020016000206006016000815481106130a05761309f6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382815181106130de576130dd6146e8565b5b602002602001015160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b600c60008381526020019081526020016000206001015491508080613141906148a0565b915050612ed7565b50819250505090565b60035481565b82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010190816132029190614db0565b5080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020190816132529190614db0565b50505050565b60045481565b600b600080548152602001908152602001600020600401600081548110613288576132876146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331790614ece565b60405180910390fd5b6001600b600080548152602001908152602001600020600301541461334457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc600b600080548152602001908152602001600020600101549081150290604051600060405180830381858888f193505050501580156133a1573d6000803e3d6000fd5b50600b6000805481526020019081526020016000206000808201600090556001820160009055600282016000905560038201600090556004820160006133e79190613a86565b6005820160006133f79190613aa7565b6006820160006134079190613a86565b6007820160006134179190613aa7565b505061342460005461373e565b6000547fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a2565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146134e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dc90614be4565b60405180910390fd5b60028114806134f45750600381145b6134fd57600080fd5b6002600b600084815260200190815260200160002060030154148061353857506003600b600084815260200190815260200160002060030154145b61354157600080fd5b80600b600084815260200190815260200160002060030181905550817fcf6bdd0e70780d1e7e0dec074afc12e39456708a253e7a17db2ad92d4fca2d1d60405160405180910390a25050565b60055481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b80600c6000838152602001908152602001600020600001819055506000600c600083815260200190815260200160002060010181905550600c600080815260200190815260200160002060020154600c60008381526020019081526020016000206002018190555080600c6000600c60008081526020019081526020016000206002015481526020019081526020016000206001018190555080600c60008081526020019081526020016000206002018190555060016000815480929190613686906148a0565b919050555050565b60008060005b8380549050811015613730578381815481106136b3576136b26146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361371d578060019250925050613739565b8080613728906148a0565b915050613694565b50600080915091505b915091565b600c600082815260200190815260200160002060010154600c6000600c600085815260200190815260200160002060020154815260200190815260200160002060010181905550600c600082815260200190815260200160002060020154600c6000600c600085815260200190815260200160002060010154815260200190815260200160002060020181905550600160008154809291906137df90614eee565b9190505550600c600082815260200190815260200160002060008082016000905560018201600090556002820160009055505050565b600080838054905067ffffffffffffffff8111156138365761383561439d565b5b6040519080825280602002602001820160405280156138645781602001602082028036833780820191505090505b50905060005b84805490508110156138b457838181548110613889576138886146e8565b5b90600052602060002001548361389f9190614a2c565b925080806138ac906148a0565b91505061386a565b5060005b848054905081101561398c578268056bc75e2d631000008583815481106138e2576138e16146e8565b5b90600052602060002001546138f791906147e6565b613901919061486f565b828281518110613914576139136146e8565b5b60200260200101818152505068056bc75e2d6310000082828151811061393d5761393c6146e8565b5b60200260200101518861395091906147e6565b61395a919061486f565b82828151811061396d5761396c6146e8565b5b6020026020010181815250508080613984906148a0565b9150506138b8565b5084816000815181106139a2576139a16146e8565b5b602002602001018181516139b69190614a2c565b9150818152505060005b8480549050811015613a7d578481815481106139df576139de6146e8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc838381518110613a3657613a356146e8565b5b60200260200101519081150290604051600060405180830381858888f19350505050158015613a69573d6000803e3d6000fd5b508080613a75906148a0565b9150506139c0565b50505050505050565b5080546000825590600052602060002090810190613aa49190613b93565b50565b5080546000825590600052602060002090810190613ac59190613b93565b50565b60405180610100016040528060008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060600160405280600060ff16815260200160608152602001606081525090565b6040518060c0016040528060008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b5b80821115613bac576000816000905550600101613b94565b5090565b6000819050919050565b613bc381613bb0565b82525050565b6000602082019050613bde6000830184613bba565b92915050565b6000604051905090565b600080fd5b600080fd5b613c0181613bb0565b8114613c0c57600080fd5b50565b600081359050613c1e81613bf8565b92915050565b600060208284031215613c3a57613c39613bee565b5b6000613c4884828501613c0f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613c7c82613c51565b9050919050565b613c8c81613c71565b8114613c9757600080fd5b50565b600081359050613ca981613c83565b92915050565b600060208284031215613cc557613cc4613bee565b5b6000613cd384828501613c9a565b91505092915050565b613ce581613bb0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d2081613c71565b82525050565b6000613d328383613d17565b60208301905092915050565b6000602082019050919050565b6000613d5682613ceb565b613d608185613cf6565b9350613d6b83613d07565b8060005b83811015613d9c578151613d838882613d26565b9750613d8e83613d3e565b925050600181019050613d6f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000613de18383613cdc565b60208301905092915050565b6000602082019050919050565b6000613e0582613da9565b613e0f8185613db4565b9350613e1a83613dc5565b8060005b83811015613e4b578151613e328882613dd5565b9750613e3d83613ded565b925050600181019050613e1e565b5085935050505092915050565b600061010083016000830151613e716000860182613cdc565b506020830151613e846020860182613cdc565b506040830151613e976040860182613cdc565b506060830151613eaa6060860182613cdc565b5060808301518482036080860152613ec28282613d4b565b91505060a083015184820360a0860152613edc8282613dfa565b91505060c083015184820360c0860152613ef68282613d4b565b91505060e083015184820360e0860152613f108282613dfa565b9150508091505092915050565b60006020820190508181036000830152613f378184613e58565b905092915050565b600060ff82169050919050565b613f5581613f3f565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f95578082015181840152602081019050613f7a565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fbd82613f5b565b613fc78185613f66565b9350613fd7818560208601613f77565b613fe081613fa1565b840191505092915050565b60006060830160008301516140036000860182613f4c565b506020830151848203602086015261401b8282613fb2565b915050604083015184820360408601526140358282613fb2565b9150508091505092915050565b6000602082019050818103600083015261405c8184613feb565b905092915050565b61406d81613c71565b82525050565b60006020820190506140886000830184614064565b92915050565b600082825260208201905092915050565b60006140aa82613ceb565b6140b4818561408e565b93506140bf83613d07565b8060005b838110156140f05781516140d78882613d26565b97506140e283613d3e565b9250506001810190506140c3565b5085935050505092915050565b600082825260208201905092915050565b600061411982613da9565b61412381856140fd565b935061412e83613dc5565b8060005b8381101561415f5781516141468882613dd5565b975061415183613ded565b925050600181019050614132565b5085935050505092915050565b600060a0820190506141816000830188613bba565b8181036020830152614193818761409f565b905081810360408301526141a7818661410e565b905081810360608301526141bb818561409f565b905081810360808301526141cf818461410e565b90509695505050505050565b600080604083850312156141f2576141f1613bee565b5b600061420085828601613c0f565b925050602061421185828601613c9a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60c08201600082015161425d6000850182613cdc565b5060208201516142706020850182613cdc565b5060408201516142836040850182613cdc565b5060608201516142966060850182613cdc565b5060808201516142a96080850182613d17565b5060a08201516142bc60a0850182613d17565b50505050565b60006142ce8383614247565b60c08301905092915050565b6000602082019050919050565b60006142f28261421b565b6142fc8185614226565b935061430783614237565b8060005b8381101561433857815161431f88826142c2565b975061432a836142da565b92505060018101905061430b565b5085935050505092915050565b6000602082019050818103600083015261435f81846142e7565b905092915050565b61437081613f3f565b811461437b57600080fd5b50565b60008135905061438d81614367565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6143d582613fa1565b810181811067ffffffffffffffff821117156143f4576143f361439d565b5b80604052505050565b6000614407613be4565b905061441382826143cc565b919050565b600067ffffffffffffffff8211156144335761443261439d565b5b61443c82613fa1565b9050602081019050919050565b82818337600083830152505050565b600061446b61446684614418565b6143fd565b90508281526020810184848401111561448757614486614398565b5b614492848285614449565b509392505050565b600082601f8301126144af576144ae614393565b5b81356144bf848260208601614458565b91505092915050565b6000806000606084860312156144e1576144e0613bee565b5b60006144ef8682870161437e565b935050602084013567ffffffffffffffff8111156145105761450f613bf3565b5b61451c8682870161449a565b925050604084013567ffffffffffffffff81111561453d5761453c613bf3565b5b6145498682870161449a565b9150509250925092565b6000806040838503121561456a57614569613bee565b5b600061457885828601613c0f565b925050602061458985828601613c0f565b9150509250929050565b600082825260208201905092915050565b7f4f6e6c7920454f41000000000000000000000000000000000000000000000000600082015250565b60006145da600883614593565b91506145e5826145a4565b602082019050919050565b60006020820190508181036000830152614609816145cd565b9050919050565b7f6c6f772062657400000000000000000000000000000000000000000000000000600082015250565b6000614646600783614593565b915061465182614610565b602082019050919050565b6000602082019050818103600083015261467581614639565b9050919050565b7f6d617820726f6f6d732063726561746564000000000000000000000000000000600082015250565b60006146b2601183614593565b91506146bd8261467c565b602082019050919050565b600060208201905081810360008301526146e1816146a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f616c726561647920616464656400000000000000000000000000000000000000600082015250565b600061474d600d83614593565b915061475882614717565b602082019050919050565b6000602082019050818103600083015261477c81614740565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147bd82613bb0565b91506147c883613bb0565b92508282039050818111156147e0576147df614783565b5b92915050565b60006147f182613bb0565b91506147fc83613bb0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561483557614834614783565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061487a82613bb0565b915061488583613bb0565b92508261489557614894614840565b5b828204905092915050565b60006148ab82613bb0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148dd576148dc614783565b5b600182019050919050565b7f4f6e6c79206f776e657200000000000000000000000000000000000000000000600082015250565b600061491e600a83614593565b9150614929826148e8565b602082019050919050565b6000602082019050818103600083015261494d81614911565b9050919050565b7f62657473206172652070726f6869626974656400000000000000000000000000600082015250565b600061498a601383614593565b915061499582614954565b602082019050919050565b600060208201905081810360008301526149b98161497d565b9050919050565b7f4d616e7920757365727320776974682062657473000000000000000000000000600082015250565b60006149f6601483614593565b9150614a01826149c0565b602082019050919050565b60006020820190508181036000830152614a25816149e9565b9050919050565b6000614a3782613bb0565b9150614a4283613bb0565b9250828201905080821115614a5a57614a59614783565b5b92915050565b7f4f6e6c79206f776e6572206f72206f7261636c65000000000000000000000000600082015250565b6000614a96601483614593565b9150614aa182614a60565b602082019050919050565b60006020820190508181036000830152614ac581614a89565b9050919050565b7f6261642073746174757300000000000000000000000000000000000000000000600082015250565b6000614b02600a83614593565b9150614b0d82614acc565b602082019050919050565b60006020820190508181036000830152614b3181614af5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b7f57607f821691505b602082108103614b9257614b91614b38565b5b50919050565b7f4f6e6c79206f7261636c65000000000000000000000000000000000000000000600082015250565b6000614bce600b83614593565b9150614bd982614b98565b602082019050919050565b60006020820190508181036000830152614bfd81614bc1565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614c667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614c29565b614c708683614c29565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614cad614ca8614ca384613bb0565b614c88565b613bb0565b9050919050565b6000819050919050565b614cc783614c92565b614cdb614cd382614cb4565b848454614c36565b825550505050565b600090565b614cf0614ce3565b614cfb818484614cbe565b505050565b5b81811015614d1f57614d14600082614ce8565b600181019050614d01565b5050565b601f821115614d6457614d3581614c04565b614d3e84614c19565b81016020851015614d4d578190505b614d61614d5985614c19565b830182614d00565b50505b505050565b600082821c905092915050565b6000614d8760001984600802614d69565b1980831691505092915050565b6000614da08383614d76565b9150826002028217905092915050565b614db982613f5b565b67ffffffffffffffff811115614dd257614dd161439d565b5b614ddc8254614b67565b614de7828285614d23565b600060209050601f831160018114614e1a5760008415614e08578287015190505b614e128582614d94565b865550614e7a565b601f198416614e2886614c04565b60005b82811015614e5057848901518255600182019150602085019450602081019050614e2b565b86831015614e6d5784890151614e69601f891682614d76565b8355505b6001600288020188555050505b505050505050565b7f6e6f7420796f7572206265740000000000000000000000000000000000000000600082015250565b6000614eb8600c83614593565b9150614ec382614e82565b602082019050919050565b60006020820190508181036000830152614ee781614eab565b9050919050565b6000614ef982613bb0565b915060008203614f0c57614f0b614783565b5b60018203905091905056fea26469706673582212201ecd11606a53cf9f1978959d6993a3ec2f8d8d146e2afd6ca2339a24c5b3febc64736f6c63430008100033