false
false
0

Contract Address Details

0x3011cBf107d8dfB2F90390db05668610adbDffC6

Contract Name
DaoApprovedResousces
Creator
0xebe894–7a24f6 at 0x3bb006–c19af1
Balance
0 CLO
Tokens
Fetching tokens...
Transactions
36 Transactions
Transfers
0 Transfers
Gas Used
7,360,491
Last Balance Update
16285237
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
DaoApprovedResousces




Optimization enabled
false
Compiler version
v0.8.16+commit.07a7930e




EVM Version
default




Verified at
2024-11-18T11:15:30.528205Z

Contract source code

// SPDX-License-Identifier: GPL-3.0-only
// Author: Upaut (CallistoDAO)

pragma solidity ^0.8.16;

interface IContractGraphLib {
    function getIcon(bytes32 _hash) external view returns (string memory);
}

contract DaoApprovedResousces {

    struct Group{ // структура описывающая группу
        uint64 id; // идентификатор группы
        uint64 elem; // количество медиаресурсов в группе
        uint64 next; // указатель на следующую группу
        uint64 prev; // указатель на предыдущую группу
        string name; // название группы (имена групп и медиаресурсов должны быть уникальны)
        string icon; // хэш иконки в контракте графической библиотеки
    }

    struct Resource{ // структура описывающая медиаресурс
        uint64 id; // идентификатор медиаресурса
        uint64 parent; // ID родительской группы
        uint64 next; // указатель на следующий медиаресурс
        uint64 prev; // указатель на предыдущий медиаресурс
        string name; // название медиаресурса (имена групп и медиаресурсов должны быть уникальны)
        string link; // ссылка на медиаресурс
        string metadata; // описание ресурса
        string icon; // хэш иконки в контракте графической библиотеки
    }    

    uint64 id; // хранит последний порядковый номер ID выделяемый для новых групп и медиаресурсов (увеличивается на 1 каждый раз когда добавляются новые группы и медиаресурсы)

    address public GovernanceDAO = 0xeBE894814554c8382EA6a24CcDdf1527407A24f6; // DAO vote address
    //address public GovernanceDAO = 0x810059e1406dEDAFd1BdCa4E0137CbA306c0Ce36; // DAO vote address
    address public constant contractGraphLib = 0xFe2bbc3D86C3e4666D3E352f68B2a224cAC28238; // Контракт графической библитотеки

    mapping(bytes32 => uint64) private ids; // сопоставление хешей уникальных имен с id
    mapping(uint64 => Group) private groups; // двухсвязный список всех групп
    mapping(uint64 => mapping(uint64 => Resource)) private resources; // двухсвязные списки ресурсов закрепленные за группами

    modifier onlyDAO() {
        require(msg.sender == GovernanceDAO, "Only DAO can call this");
        _;
    }



    // Создание новой группы
    function createGroup(string memory _name, bytes32 _icon) external onlyDAO {
        require(bytes(_name).length != 0); // Имя новой группы не должно быть пустой строкой
        require(_getID(_name) == 0); // Имя новой группы должно быть свободно
        id++; // уникальный идентификатор новой группы
        ids[_getHash(_name)] = id; // сопоставление хеша имени группы с id
        groups[id] = Group(id, 0, 0, groups[0].prev, _name, string(abi.encodePacked(_icon))); // инициализация новой группы с добавлением ее в список групп
        groups[groups[0].prev].next = id; // последний элемент списка ссылается на созданную группу
        groups[0].prev = id; // замыкаем двухсвязный список групп в круг
        groups[0].elem++; // увеличиваем общее количество групп
    }



    // Изменение имени группы + замена иконки группы
    function renameGroup(string memory _name, string memory _new_name, bytes32 _new_icon) external onlyDAO {
        uint64 _id = _getID(_name);
        require(groups[_id].id > 0); // группа которая подлежит переименованию должна существовать
        require(bytes(_new_name).length != 0); // Имя новой группы не должно быть пустой строкой
        require(_getID(_new_name) == 0); // Имя новой группы должно быть свободно
        ids[_getHash(_new_name)] = _id; // сопоставление хеша имени группы с id
        groups[_id].name = _new_name;
        groups[_id].icon = string(abi.encodePacked(_new_icon));
        delete ids[_getHash(_name)]; // убираем сопоставление хеша старого имени группы с id
    }



    // Перемещения группы в позицию после группы указаной в _after_name
    function moveGroup(string memory _name, string memory _after_name) external onlyDAO {
        uint64 _id = _getID(_name); // id перемещаемой группы
        uint64 _after_id = _getID(_after_name); // id группы, после которой будет расположена перемещаемая группа
        require(_id != _after_id); // группы должны быть разными
        require((groups[_id].id > 0) && (groups[_after_id].id > 0)); // группы должны существовать
        groups[groups[_id].prev].next = groups[_id].next;
        groups[groups[_id].next].prev = groups[_id].prev;
        groups[_id].next = groups[_after_id].next;
        groups[_id].prev = _after_id;
        groups[_after_id].next = _id;
        groups[groups[_id].next].prev = _id;
    }



    // Удаление группы (группа удаляется со всеми ее медиа ресурсами)
    function deleteGroup(string memory _name) external onlyDAO {
        uint64 _id = _getID(_name);
        require(groups[_id].id > 0); // группа которая подлежит удалению должна существовать
        ids[_getHash(_name)] = 0; // удаляем сопоставление хеша имени группы с id
        // убираем группу из списка групп
        groups[groups[_id].prev].next = groups[_id].next;
        groups[groups[_id].next].prev = groups[_id].prev;
        // удаляем все связанные с группой ресурсы
        uint64 _id_res = resources[_id][0].next; // получаем id первого ресурса группы
        delete resources[_id][0];
        for(uint i; i < groups[_id].elem; i++){
            uint64 _id_next = resources[_id][_id_res].next;
            ids[_getHash(resources[_id][_id_res].name)] = 0; // удаляем сопоставление хеша имени медиаресурса с id
            delete resources[_id][_id_res];
            _id_res = _id_next;
        }
        groups[0].elem--; // уменьшаем общее количество групп
        delete groups[_id]; // удаляем группу
    }



    // Создание нового медиаресурса
    function createResource(string memory _group, string memory _name, string memory _link, string memory _metadata, bytes32 _icon) external onlyDAO {
        uint64 _id_group = _getID(_group);
        require(groups[_id_group].id > 0); // группа в которой создается ресурс должна существовать
        require(bytes(_name).length != 0); // Имя нового медиаресурса не должно быть пустой строкой
        require(_getID(_name) == 0); // Имя создаваемого ресурса должно быть свободно
        require(bytes(_link).length != 0); // ссылка на медиаресурс не должна быть пустой строкой
        id++; // уникальный идентификатор нового медиаресурса
        ids[_getHash(_name)] = id; // сопоставление хеша имени медиаресурса с id
        resources[_id_group][id] = Resource(id, _id_group, 0, resources[_id_group][0].prev, _name, _link, _metadata, string(abi.encodePacked(_icon)));
        resources[_id_group][resources[_id_group][0].prev].next = id;
        resources[_id_group][0].prev = id;
        groups[_id_group].elem++; // увеличиваем общее количество медиаресурсов входящих в группу
    }



    // Перемещение медиаресурса в указанную группу с указанием позиции вставки.
    // Новая позиция вставки будет после медиаресурса указанного в _after_name
    function moveResource(string memory _from_group, string memory _name, string memory _in_group, string memory _after_name) external onlyDAO {
        uint64 _fromGroupID = _getID(_from_group); // получаем ID группы с перемещаемым медиаресурсом
        uint64 _id = _getID(_name); // id перемещаемого медиаресурса
        uint64 _inGroupID = _getID(_in_group); // получаем ID группы куда будет перемещен медиаресурс
        uint64 _after_id = _getID(_after_name); // id медиаресурса, после которого будет расположен перемещаемаемый медиаресурс
        require(_id != _after_id); // медиаресурсы должны быть разными
        require((resources[_fromGroupID][_id].id > 0) && (resources[_inGroupID][_after_id].id > 0)); // медиаресурсы в указанных группах должны существовать
        // отвязываем медиаресурс в исходной группе
        resources[_fromGroupID][resources[_fromGroupID][_id].prev].next = resources[_fromGroupID][_id].next;
        resources[_fromGroupID][resources[_fromGroupID][_id].next].prev = resources[_fromGroupID][_id].prev;
        resources[_inGroupID][_id] = resources[_fromGroupID][_id]; // копируем медиаресурс в принимающую группу
        resources[_inGroupID][_id].parent = _inGroupID; // меняем ID родительской группы        
        // привязываем медиаресурс в принимающей группе
        resources[_inGroupID][_id].next = resources[_inGroupID][_after_id].next;
        resources[_inGroupID][_id].prev = _after_id;
        resources[_inGroupID][_after_id].next = _id;
        resources[_inGroupID][resources[_inGroupID][_id].next].prev = _id;
        groups[_fromGroupID].elem--; // уменьшаем количество медиаресурсов в исходящей группе
        groups[_inGroupID].elem++; // увеличиваем количество медиаресурсов в принимающей группе
        delete resources[_fromGroupID][_id]; // удаляем медиаресурс из исходящей группы
    }



    // Удаление медиаресурса в группе
    function deleteResource(string memory _from_group, string memory _name) external onlyDAO {
        uint64 _fromGroupID = _getID(_from_group); // получаем ID группы
        uint64 _id = _getID(_name); // id медиаресурса
        require(resources[_fromGroupID][_id].id > 0); // медиаресурс в группе должен существовать
        ids[_getHash(_name)] = 0; // удаляем сопоставление хеша имени медиаресурса с id
        // отвязываем медиаресурс в группе
        resources[_fromGroupID][resources[_fromGroupID][_id].prev].next = resources[_fromGroupID][_id].next;
        resources[_fromGroupID][resources[_fromGroupID][_id].next].prev = resources[_fromGroupID][_id].prev;
        groups[_fromGroupID].elem--; // уменьшаем количество медиаресурсов в группе
        delete resources[_fromGroupID][_id]; // удаляем медиаресурс из группы
    }




    // Возвращаем количество созданных групп
    function totalGroups() public view returns (uint64){
        return (groups[0].elem);
    }

    // Возвращаем группу по ее имени
    function getGroup(string memory _name) public view returns (Group memory){
        Group memory result = groups[_getID(_name)];
        result.icon = IContractGraphLib(contractGraphLib).getIcon(bytes32(bytes(result.icon)));
        return (result);
    }

    // Возвращаем медиаресурс по его имени и имени группы где он расположен
    function getResource(string memory _group_name, string memory _resource_name) public view returns (Resource memory){
        Resource memory result = resources[_getID(_group_name)][_getID(_resource_name)];
        result.icon = IContractGraphLib(contractGraphLib).getIcon(bytes32(bytes(result.icon)));
        return (result);
    }

    // Возвращаем массив с запрашиваемым количеством групп, начиная со следующего ID после запрошенного в _id_start
    // Для возврата списка групп с самого начала укажите _id_start = 0
    // Функция создана для удобных порционных запросов из Frontend
    function getGroups(uint64 _id_start, uint64 _amount) public view returns (Group[] memory){
        _id_start = groups[_id_start].next; // получаем ID следующей группы
        if(_id_start == 0) return (new Group[](1)); // если стартовый ID не существует или он последний элемент списка
        Group[] memory result = new Group[](_amount);
        for(uint64 i; i < _amount; i++){
            if(_id_start == 0) break;
            result[i] = groups[_id_start];
            result[i].icon = IContractGraphLib(contractGraphLib).getIcon(bytes32(bytes(result[i].icon)));
            _id_start = groups[_id_start].next;
        }
        return (result); // возвращаем массив с группами
    }


    // Возвращаем массив с запрашиваемым количеством медиаресурсов, начиная с группы указаной в _id_group_start и медиаресорсом указанным после _id_resource_start
    // Для возврата списка медиаресурсов с самого начала укажите _id_group_start = 0 и _id_resource_start = 0
    // Функция создана для удобных порционных запросов из Frontend
    function getResources(uint64 _id_group_start, uint64 _id_resource_start, uint64 _amount) public view returns (Resource[] memory){
        _id_group_start = _id_group_start > 0 ? _id_group_start : groups[_id_group_start].next; // определяем стартовую группу
        _id_resource_start = resources[_id_group_start][_id_resource_start].next;
        if(_id_resource_start == 0){ // если ID медиаресурса не существует или список был закончен
            _id_group_start = groups[_id_group_start].next; // переходим к следующей группе
            _id_resource_start = resources[_id_group_start][0].next; // переходим к первому ресурсу в группе
            if((_id_group_start == 0) && (_id_resource_start == 0)) return (new Resource[](1));
        }
        Resource[] memory result = new Resource[](_amount);
        uint64 _index;
        while((_id_group_start > 0) && (_index < _amount)){ // перебираем все медиаресурсы пока имеются родительские группы и не набрано запрошенное количество медиаресурсов
            if(_id_resource_start == 0){ // если в текущей группе больше нет медиаресурсов
                _id_group_start = groups[_id_group_start].next; // переходим к следующей группе
                _id_resource_start = resources[_id_group_start][0].next; // переходим к первому ресурсу в группе
                continue;
            }
            result[_index] = resources[_id_group_start][_id_resource_start];
            result[_index].icon = IContractGraphLib(contractGraphLib).getIcon(bytes32(bytes(result[_index].icon)));
            _index++;
            _id_resource_start = resources[_id_group_start][_id_resource_start].next; // переходим к первому ресурсу в группе
        }
        return (result); // возвращаем массив с медиаресурсами
    }



    // Назначить нового владельца (замена адреса ДАО)
    function setNewOwner(address _newOwner) external onlyDAO {
        GovernanceDAO = _newOwner;
    }

    function _getHash(string memory _name) private pure returns (bytes32){ // возвращает хеш уникального имени
        return (keccak256(abi.encodePacked(_name)));
    }

    function _getID(string memory _name) private view returns (uint64){ // возвращает ID присвоенное уникальному имени
        return (ids[_getHash(_name)]);
    }    
}
        

Contract ABI

[{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"GovernanceDAO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"contractGraphLib","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createGroup","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"bytes32","name":"_icon","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createResource","inputs":[{"type":"string","name":"_group","internalType":"string"},{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_link","internalType":"string"},{"type":"string","name":"_metadata","internalType":"string"},{"type":"bytes32","name":"_icon","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteGroup","inputs":[{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteResource","inputs":[{"type":"string","name":"_from_group","internalType":"string"},{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DaoApprovedResousces.Group","components":[{"type":"uint64","name":"id","internalType":"uint64"},{"type":"uint64","name":"elem","internalType":"uint64"},{"type":"uint64","name":"next","internalType":"uint64"},{"type":"uint64","name":"prev","internalType":"uint64"},{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"icon","internalType":"string"}]}],"name":"getGroup","inputs":[{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct DaoApprovedResousces.Group[]","components":[{"type":"uint64","name":"id","internalType":"uint64"},{"type":"uint64","name":"elem","internalType":"uint64"},{"type":"uint64","name":"next","internalType":"uint64"},{"type":"uint64","name":"prev","internalType":"uint64"},{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"icon","internalType":"string"}]}],"name":"getGroups","inputs":[{"type":"uint64","name":"_id_start","internalType":"uint64"},{"type":"uint64","name":"_amount","internalType":"uint64"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DaoApprovedResousces.Resource","components":[{"type":"uint64","name":"id","internalType":"uint64"},{"type":"uint64","name":"parent","internalType":"uint64"},{"type":"uint64","name":"next","internalType":"uint64"},{"type":"uint64","name":"prev","internalType":"uint64"},{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"link","internalType":"string"},{"type":"string","name":"metadata","internalType":"string"},{"type":"string","name":"icon","internalType":"string"}]}],"name":"getResource","inputs":[{"type":"string","name":"_group_name","internalType":"string"},{"type":"string","name":"_resource_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct DaoApprovedResousces.Resource[]","components":[{"type":"uint64","name":"id","internalType":"uint64"},{"type":"uint64","name":"parent","internalType":"uint64"},{"type":"uint64","name":"next","internalType":"uint64"},{"type":"uint64","name":"prev","internalType":"uint64"},{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"link","internalType":"string"},{"type":"string","name":"metadata","internalType":"string"},{"type":"string","name":"icon","internalType":"string"}]}],"name":"getResources","inputs":[{"type":"uint64","name":"_id_group_start","internalType":"uint64"},{"type":"uint64","name":"_id_resource_start","internalType":"uint64"},{"type":"uint64","name":"_amount","internalType":"uint64"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"moveGroup","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_after_name","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"moveResource","inputs":[{"type":"string","name":"_from_group","internalType":"string"},{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_in_group","internalType":"string"},{"type":"string","name":"_after_name","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renameGroup","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_new_name","internalType":"string"},{"type":"bytes32","name":"_new_icon","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNewOwner","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"totalGroups","inputs":[]}]
              

Contract Creation Code

Verify & Publish
0x608060405273ebe894814554c8382ea6a24ccddf1527407a24f6600060086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561006557600080fd5b5061582680620000766000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063894a823d11610097578063c5b42c2211610066578063c5b42c2214610280578063c75f28931461029e578063e08a3afd146102bc578063f5a1f5b4146102d8576100f5565b8063894a823d146101e65780639ca85bf014610216578063a046ae1314610234578063abef281e14610250576100f5565b80632e8b92a9116100d35780632e8b92a9146101625780635140dcf31461017e5780636158623e146101ae5780638651dd7a146101ca576100f5565b8063034cbb22146100fa578063188850811461011657806319d0cc8414610146575b600080fd5b610114600480360381019061010f9190614625565b6102f4565b005b610130600480360381019061012b91906146f0565b61051c565b60405161013d9190614958565b60405180910390f35b610160600480360381019061015b919061497a565b610d64565b005b61017c600480360381019061017791906149f2565b6112b9565b005b61019860048036038101906101939190614a3b565b611ae5565b6040516101a59190614bcd565b60405180910390f35b6101c860048036038101906101c3919061497a565b611fc0565b005b6101e460048036038101906101df9190614bef565b612493565b005b61020060048036038101906101fb919061497a565b61293a565b60405161020d9190614d10565b60405180910390f35b61021e612d70565b60405161022b9190614d73565b60405180910390f35b61024e60048036038101906102499190614d8e565b612d96565b005b61026a600480360381019061026591906149f2565b6138e3565b6040516102779190614ef5565b60405180910390f35b610288613bc6565b6040516102959190614d73565b60405180910390f35b6102a6613bde565b6040516102b39190614f26565b60405180910390f35b6102d660048036038101906102d19190614f41565b613c1a565b005b6102f260048036038101906102ed9190615058565b614230565b005b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037b906150e2565b60405180910390fd5b600061038f84614304565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16116103e657600080fd5b60008351036103f457600080fd5b60006103ff84614304565b67ffffffffffffffff161461041357600080fd5b80600160006104218661433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101908161048c9190615318565b508160405160200161049e919061540b565b604051602081830303815290604052600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020190816104e39190615318565b50600160006104f18661433d565b815260200190815260200160002060006101000a81549067ffffffffffffffff021916905550505050565b606060008467ffffffffffffffff161161057457600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16610576565b835b9350600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff160361071357600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169350600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008467ffffffffffffffff161480156106b1575060008367ffffffffffffffff16145b1561071257600167ffffffffffffffff8111156106d1576106d06144c4565b5b60405190808252806020026020018201604052801561070a57816020015b6106f761436d565b8152602001906001900390816106ef5790505b509050610d5d565b5b60008267ffffffffffffffff1667ffffffffffffffff811115610739576107386144c4565b5b60405190808252806020026020018201604052801561077257816020015b61075f61436d565b8152602001906001900390816107575790505b50905060005b60008667ffffffffffffffff161180156107a557508367ffffffffffffffff168167ffffffffffffffff16105b15610d575760008567ffffffffffffffff160361085e57600260008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169550600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169450610778565b600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008667ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201805461098e90615131565b80601f01602080910402602001604051908101604052809291908181526020018280546109ba90615131565b8015610a075780601f106109dc57610100808354040283529160200191610a07565b820191906000526020600020905b8154815290600101906020018083116109ea57829003601f168201915b50505050508152602001600282018054610a2090615131565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c90615131565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b50505050508152602001600382018054610ab290615131565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade90615131565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b50505050508152602001600482018054610b4490615131565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7090615131565b8015610bbd5780601f10610b9257610100808354040283529160200191610bbd565b820191906000526020600020905b815481529060010190602001808311610ba057829003601f168201915b505050505081525050828267ffffffffffffffff1681518110610be357610be2615426565b5b602002602001018190525073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d838367ffffffffffffffff1681518110610c3b57610c3a615426565b5b602002602001015160e00151610c5090615485565b6040518263ffffffff1660e01b8152600401610c6c91906154fb565b600060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610cb29190615586565b828267ffffffffffffffff1681518110610ccf57610cce615426565b5b602002602001015160e001819052508080610ce9906155fe565b915050600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169450610778565b81925050505b9392505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb906150e2565b60405180910390fd5b6000610dff83614304565b90506000610e0c83614304565b90506000600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611610e8857600080fd5b600060016000610e978661433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906111919061562e565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff021916905560018201600061128191906143da565b60028201600061129191906143da565b6003820160006112a191906143da565b6004820160006112b191906143da565b505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611340906150e2565b60405180910390fd5b600061135482614304565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16116113ab57600080fd5b6000600160006113ba8561433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1660026000600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1660026000600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169050600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff02191690556001820160006116a591906143da565b6002820160006116b591906143da565b6003820160006116c591906143da565b6004820160006116d591906143da565b505060005b600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff168110156119be576000600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169050600060016000611878600360008967ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060010180546117f590615131565b80601f016020809104026020016040519081016040528092919081815260200182805461182190615131565b801561186e5780601f106118435761010080835404028352916020019161186e565b820191906000526020600020905b81548152906001019060200180831161185157829003601f168201915b505050505061433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff021916905560018201600061197591906143da565b60028201600061198591906143da565b60038201600061199591906143da565b6004820160006119a591906143da565b50508092505080806119b690615657565b9150506116da565b50600260008067ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff1680929190611a039061562e565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff0219169055600182016000611ace91906143da565b600282016000611ade91906143da565b5050505050565b6060600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff1603611b9657600167ffffffffffffffff811115611b5557611b546144c4565b5b604051908082528060200260200182016040528015611b8e57816020015b611b7b61441a565b815260200190600190039081611b735790505b509050611fba565b60008267ffffffffffffffff1667ffffffffffffffff811115611bbc57611bbb6144c4565b5b604051908082528060200260200182016040528015611bf557816020015b611be261441a565b815260200190600190039081611bda5790505b50905060005b8367ffffffffffffffff168167ffffffffffffffff161015611fb45760008567ffffffffffffffff160315611fb457600260008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182018054611d3490615131565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6090615131565b8015611dad5780601f10611d8257610100808354040283529160200191611dad565b820191906000526020600020905b815481529060010190602001808311611d9057829003601f168201915b50505050508152602001600282018054611dc690615131565b80601f0160208091040260200160405190810160405280929190818152602001828054611df290615131565b8015611e3f5780601f10611e1457610100808354040283529160200191611e3f565b820191906000526020600020905b815481529060010190602001808311611e2257829003601f168201915b505050505081525050828267ffffffffffffffff1681518110611e6557611e64615426565b5b602002602001018190525073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d838367ffffffffffffffff1681518110611ebd57611ebc615426565b5b602002602001015160a00151611ed290615485565b6040518263ffffffff1660e01b8152600401611eee91906154fb565b600060405180830381865afa158015611f0b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f349190615586565b828267ffffffffffffffff1681518110611f5157611f50615426565b5b602002602001015160a00181905250600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1694508080611fac906155fe565b915050611bfb565b50809150505b92915050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612047906150e2565b60405180910390fd5b600061205b83614304565b9050600061206883614304565b90508067ffffffffffffffff168267ffffffffffffffff160361208a57600080fd5b6000600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611801561212a57506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b61213357600080fd5b600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1660026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1660026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508160026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a906150e2565b60405180910390fd5b600082510361253157600080fd5b600061253c83614304565b67ffffffffffffffff161461255057600080fd5b60008081819054906101000a900467ffffffffffffffff1680929190612575906155fe565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505060008054906101000a900467ffffffffffffffff16600160006125be8561433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506040518060c0016040528060008054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600260008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020018381526020018260405160200161269e919061540b565b604051602081830303815290604052815250600260008060009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010190816127bd9190615318565b5060a08201518160020190816127d39190615318565b5090505060008054906101000a900467ffffffffffffffff1660026000600260008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008054906101000a900467ffffffffffffffff16600260008067ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008067ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff168092919061290f906155fe565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b61294261436d565b60006003600061295186614304565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600061297e85614304565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182018054612a8490615131565b80601f0160208091040260200160405190810160405280929190818152602001828054612ab090615131565b8015612afd5780601f10612ad257610100808354040283529160200191612afd565b820191906000526020600020905b815481529060010190602001808311612ae057829003601f168201915b50505050508152602001600282018054612b1690615131565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4290615131565b8015612b8f5780601f10612b6457610100808354040283529160200191612b8f565b820191906000526020600020905b815481529060010190602001808311612b7257829003601f168201915b50505050508152602001600382018054612ba890615131565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd490615131565b8015612c215780601f10612bf657610100808354040283529160200191612c21565b820191906000526020600020905b815481529060010190602001808311612c0457829003601f168201915b50505050508152602001600482018054612c3a90615131565b80601f0160208091040260200160405190810160405280929190818152602001828054612c6690615131565b8015612cb35780601f10612c8857610100808354040283529160200191612cb3565b820191906000526020600020905b815481529060010190602001808311612c9657829003601f168201915b505050505081525050905073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d8260e00151612cfc90615485565b6040518263ffffffff1660e01b8152600401612d1891906154fb565b600060405180830381865afa158015612d35573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612d5e9190615586565b8160e001819052508091505092915050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1d906150e2565b60405180910390fd5b6000612e3185614304565b90506000612e3e85614304565b90506000612e4b85614304565b90506000612e5885614304565b90508067ffffffffffffffff168367ffffffffffffffff1603612e7a57600080fd5b6000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16118015612f6457506000600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b612f6d57600080fd5b600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff16600360008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000820160009054906101000a900467ffffffffffffffff168160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160089054906101000a900467ffffffffffffffff168160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160109054906101000a900467ffffffffffffffff168160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160189054906101000a900467ffffffffffffffff168160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001820181600101908161339d91906156b5565b50600282018160020190816133b291906156b5565b50600382018160030190816133c791906156b5565b50600482018160040190816133dc91906156b5565b5090505081600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906137429061562e565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906137b7906155fe565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff02191690556001820160006138a791906143da565b6002820160006138b791906143da565b6003820160006138c791906143da565b6004820160006138d791906143da565b50505050505050505050565b6138eb61441a565b6000600260006138fa85614304565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820180546139ff90615131565b80601f0160208091040260200160405190810160405280929190818152602001828054613a2b90615131565b8015613a785780601f10613a4d57610100808354040283529160200191613a78565b820191906000526020600020905b815481529060010190602001808311613a5b57829003601f168201915b50505050508152602001600282018054613a9190615131565b80601f0160208091040260200160405190810160405280929190818152602001828054613abd90615131565b8015613b0a5780601f10613adf57610100808354040283529160200191613b0a565b820191906000526020600020905b815481529060010190602001808311613aed57829003601f168201915b505050505081525050905073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d8260a00151613b5390615485565b6040518263ffffffff1660e01b8152600401613b6f91906154fb565b600060405180830381865afa158015613b8c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190613bb59190615586565b8160a0018190525080915050919050565b73fe2bbc3d86c3e4666d3e352f68b2a224cac2823881565b6000600260008067ffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff16905090565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ca1906150e2565b60405180910390fd5b6000613cb586614304565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611613d0c57600080fd5b6000855103613d1a57600080fd5b6000613d2586614304565b67ffffffffffffffff1614613d3957600080fd5b6000845103613d4757600080fd5b60008081819054906101000a900467ffffffffffffffff1680929190613d6c906155fe565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505060008054906101000a900467ffffffffffffffff1660016000613db58861433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180610100016040528060008054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020018267ffffffffffffffff168152602001600067ffffffffffffffff168152602001600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200186815260200185815260200184815260200183604051602001613ec6919061540b565b604051602081830303815290604052815250600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008060009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550608082015181600101908161400a9190615318565b5060a08201518160020190816140209190615318565b5060c08201518160030190816140369190615318565b5060e082015181600401908161404c9190615318565b5090505060008054906101000a900467ffffffffffffffff16600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008054906101000a900467ffffffffffffffff16600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff1680929190614201906155fe565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146142c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142b7906150e2565b60405180910390fd5b80600060086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160006143138461433d565b815260200190815260200160002060009054906101000a900467ffffffffffffffff169050919050565b60008160405160200161435091906157d9565b604051602081830303815290604052805190602001209050919050565b604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b5080546143e690615131565b6000825580601f106143f85750614417565b601f0160209004906000526020600020908101906144169190614478565b5b50565b6040518060c00160405280600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815260200160608152602001606081525090565b5b80821115614491576000816000905550600101614479565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144fc826144b3565b810181811067ffffffffffffffff8211171561451b5761451a6144c4565b5b80604052505050565b600061452e614495565b905061453a82826144f3565b919050565b600067ffffffffffffffff82111561455a576145596144c4565b5b614563826144b3565b9050602081019050919050565b82818337600083830152505050565b600061459261458d8461453f565b614524565b9050828152602081018484840111156145ae576145ad6144ae565b5b6145b9848285614570565b509392505050565b600082601f8301126145d6576145d56144a9565b5b81356145e684826020860161457f565b91505092915050565b6000819050919050565b614602816145ef565b811461460d57600080fd5b50565b60008135905061461f816145f9565b92915050565b60008060006060848603121561463e5761463d61449f565b5b600084013567ffffffffffffffff81111561465c5761465b6144a4565b5b614668868287016145c1565b935050602084013567ffffffffffffffff811115614689576146886144a4565b5b614695868287016145c1565b92505060406146a686828701614610565b9150509250925092565b600067ffffffffffffffff82169050919050565b6146cd816146b0565b81146146d857600080fd5b50565b6000813590506146ea816146c4565b92915050565b6000806000606084860312156147095761470861449f565b5b6000614717868287016146db565b9350506020614728868287016146db565b9250506040614739868287016146db565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614778816146b0565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147b857808201518184015260208101905061479d565b60008484015250505050565b60006147cf8261477e565b6147d98185614789565b93506147e981856020860161479a565b6147f2816144b3565b840191505092915050565b600061010083016000830151614816600086018261476f565b506020830151614829602086018261476f565b50604083015161483c604086018261476f565b50606083015161484f606086018261476f565b506080830151848203608086015261486782826147c4565b91505060a083015184820360a086015261488182826147c4565b91505060c083015184820360c086015261489b82826147c4565b91505060e083015184820360e08601526148b582826147c4565b9150508091505092915050565b60006148ce83836147fd565b905092915050565b6000602082019050919050565b60006148ee82614743565b6148f8818561474e565b93508360208202850161490a8561475f565b8060005b85811015614946578484038952815161492785826148c2565b9450614932836148d6565b925060208a0199505060018101905061490e565b50829750879550505050505092915050565b6000602082019050818103600083015261497281846148e3565b905092915050565b600080604083850312156149915761499061449f565b5b600083013567ffffffffffffffff8111156149af576149ae6144a4565b5b6149bb858286016145c1565b925050602083013567ffffffffffffffff8111156149dc576149db6144a4565b5b6149e8858286016145c1565b9150509250929050565b600060208284031215614a0857614a0761449f565b5b600082013567ffffffffffffffff811115614a2657614a256144a4565b5b614a32848285016145c1565b91505092915050565b60008060408385031215614a5257614a5161449f565b5b6000614a60858286016146db565b9250506020614a71858286016146db565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060c083016000830151614abf600086018261476f565b506020830151614ad2602086018261476f565b506040830151614ae5604086018261476f565b506060830151614af8606086018261476f565b5060808301518482036080860152614b1082826147c4565b91505060a083015184820360a0860152614b2a82826147c4565b9150508091505092915050565b6000614b438383614aa7565b905092915050565b6000602082019050919050565b6000614b6382614a7b565b614b6d8185614a86565b935083602082028501614b7f85614a97565b8060005b85811015614bbb5784840389528151614b9c8582614b37565b9450614ba783614b4b565b925060208a01995050600181019050614b83565b50829750879550505050505092915050565b60006020820190508181036000830152614be78184614b58565b905092915050565b60008060408385031215614c0657614c0561449f565b5b600083013567ffffffffffffffff811115614c2457614c236144a4565b5b614c30858286016145c1565b9250506020614c4185828601614610565b9150509250929050565b600061010083016000830151614c64600086018261476f565b506020830151614c77602086018261476f565b506040830151614c8a604086018261476f565b506060830151614c9d606086018261476f565b5060808301518482036080860152614cb582826147c4565b91505060a083015184820360a0860152614ccf82826147c4565b91505060c083015184820360c0860152614ce982826147c4565b91505060e083015184820360e0860152614d0382826147c4565b9150508091505092915050565b60006020820190508181036000830152614d2a8184614c4b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614d5d82614d32565b9050919050565b614d6d81614d52565b82525050565b6000602082019050614d886000830184614d64565b92915050565b60008060008060808587031215614da857614da761449f565b5b600085013567ffffffffffffffff811115614dc657614dc56144a4565b5b614dd2878288016145c1565b945050602085013567ffffffffffffffff811115614df357614df26144a4565b5b614dff878288016145c1565b935050604085013567ffffffffffffffff811115614e2057614e1f6144a4565b5b614e2c878288016145c1565b925050606085013567ffffffffffffffff811115614e4d57614e4c6144a4565b5b614e59878288016145c1565b91505092959194509250565b600060c083016000830151614e7d600086018261476f565b506020830151614e90602086018261476f565b506040830151614ea3604086018261476f565b506060830151614eb6606086018261476f565b5060808301518482036080860152614ece82826147c4565b91505060a083015184820360a0860152614ee882826147c4565b9150508091505092915050565b60006020820190508181036000830152614f0f8184614e65565b905092915050565b614f20816146b0565b82525050565b6000602082019050614f3b6000830184614f17565b92915050565b600080600080600060a08688031215614f5d57614f5c61449f565b5b600086013567ffffffffffffffff811115614f7b57614f7a6144a4565b5b614f87888289016145c1565b955050602086013567ffffffffffffffff811115614fa857614fa76144a4565b5b614fb4888289016145c1565b945050604086013567ffffffffffffffff811115614fd557614fd46144a4565b5b614fe1888289016145c1565b935050606086013567ffffffffffffffff811115615002576150016144a4565b5b61500e888289016145c1565b925050608061501f88828901614610565b9150509295509295909350565b61503581614d52565b811461504057600080fd5b50565b6000813590506150528161502c565b92915050565b60006020828403121561506e5761506d61449f565b5b600061507c84828501615043565b91505092915050565b600082825260208201905092915050565b7f4f6e6c792044414f2063616e2063616c6c207468697300000000000000000000600082015250565b60006150cc601683615085565b91506150d782615096565b602082019050919050565b600060208201905081810360008301526150fb816150bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061514957607f821691505b60208210810361515c5761515b615102565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151c47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615187565b6151ce8683615187565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061521561521061520b846151e6565b6151f0565b6151e6565b9050919050565b6000819050919050565b61522f836151fa565b61524361523b8261521c565b848454615194565b825550505050565b600090565b61525861524b565b615263818484615226565b505050565b5b818110156152875761527c600082615250565b600181019050615269565b5050565b601f8211156152cc5761529d81615162565b6152a684615177565b810160208510156152b5578190505b6152c96152c185615177565b830182615268565b50505b505050565b600082821c905092915050565b60006152ef600019846008026152d1565b1980831691505092915050565b600061530883836152de565b9150826002028217905092915050565b6153218261477e565b67ffffffffffffffff81111561533a576153396144c4565b5b6153448254615131565b61534f82828561528b565b600060209050601f8311600181146153825760008415615370578287015190505b61537a85826152fc565b8655506153e2565b601f19841661539086615162565b60005b828110156153b857848901518255600182019150602085019450602081019050615393565b868310156153d557848901516153d1601f8916826152de565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b615405615400826145ef565b6153ea565b82525050565b600061541782846153f4565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b600061547c82516145ef565b80915050919050565b600061549082615455565b8261549a84615460565b90506154a581615470565b925060208210156154e5576154e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615187565b831692505b5050919050565b6154f5816145ef565b82525050565b600060208201905061551060008301846154ec565b92915050565b60006155296155248461453f565b614524565b905082815260208101848484011115615545576155446144ae565b5b61555084828561479a565b509392505050565b600082601f83011261556d5761556c6144a9565b5b815161557d848260208601615516565b91505092915050565b60006020828403121561559c5761559b61449f565b5b600082015167ffffffffffffffff8111156155ba576155b96144a4565b5b6155c684828501615558565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615609826146b0565b915067ffffffffffffffff8203615623576156226155cf565b5b600182019050919050565b6000615639826146b0565b91506000820361564c5761564b6155cf565b5b600182039050919050565b6000615662826151e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615694576156936155cf565b5b600182019050919050565b6000815490506156ae81615131565b9050919050565b8181036156c357505061579b565b6156cc8261569f565b67ffffffffffffffff8111156156e5576156e46144c4565b5b6156ef8254615131565b6156fa82828561528b565b6000601f8311600181146157295760008415615717578287015490505b61572185826152fc565b865550615794565b601f19841661573787615162565b965061574286615162565b60005b8281101561576a57848901548255600182019150600185019450602081019050615745565b868310156157875784890154615783601f8916826152de565b8355505b6001600288020188555050505b5050505050505b565b600081905092915050565b60006157b38261477e565b6157bd818561579d565b93506157cd81856020860161479a565b80840191505092915050565b60006157e582846157a8565b91508190509291505056fea2646970667358221220b1df56d497c7f0a3f8b991f056fa2b00662e9a0689b15f4002026b9c1ceeecc064736f6c63430008100033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063894a823d11610097578063c5b42c2211610066578063c5b42c2214610280578063c75f28931461029e578063e08a3afd146102bc578063f5a1f5b4146102d8576100f5565b8063894a823d146101e65780639ca85bf014610216578063a046ae1314610234578063abef281e14610250576100f5565b80632e8b92a9116100d35780632e8b92a9146101625780635140dcf31461017e5780636158623e146101ae5780638651dd7a146101ca576100f5565b8063034cbb22146100fa578063188850811461011657806319d0cc8414610146575b600080fd5b610114600480360381019061010f9190614625565b6102f4565b005b610130600480360381019061012b91906146f0565b61051c565b60405161013d9190614958565b60405180910390f35b610160600480360381019061015b919061497a565b610d64565b005b61017c600480360381019061017791906149f2565b6112b9565b005b61019860048036038101906101939190614a3b565b611ae5565b6040516101a59190614bcd565b60405180910390f35b6101c860048036038101906101c3919061497a565b611fc0565b005b6101e460048036038101906101df9190614bef565b612493565b005b61020060048036038101906101fb919061497a565b61293a565b60405161020d9190614d10565b60405180910390f35b61021e612d70565b60405161022b9190614d73565b60405180910390f35b61024e60048036038101906102499190614d8e565b612d96565b005b61026a600480360381019061026591906149f2565b6138e3565b6040516102779190614ef5565b60405180910390f35b610288613bc6565b6040516102959190614d73565b60405180910390f35b6102a6613bde565b6040516102b39190614f26565b60405180910390f35b6102d660048036038101906102d19190614f41565b613c1a565b005b6102f260048036038101906102ed9190615058565b614230565b005b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037b906150e2565b60405180910390fd5b600061038f84614304565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16116103e657600080fd5b60008351036103f457600080fd5b60006103ff84614304565b67ffffffffffffffff161461041357600080fd5b80600160006104218661433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600101908161048c9190615318565b508160405160200161049e919061540b565b604051602081830303815290604052600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060020190816104e39190615318565b50600160006104f18661433d565b815260200190815260200160002060006101000a81549067ffffffffffffffff021916905550505050565b606060008467ffffffffffffffff161161057457600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16610576565b835b9350600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff160361071357600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169350600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008467ffffffffffffffff161480156106b1575060008367ffffffffffffffff16145b1561071257600167ffffffffffffffff8111156106d1576106d06144c4565b5b60405190808252806020026020018201604052801561070a57816020015b6106f761436d565b8152602001906001900390816106ef5790505b509050610d5d565b5b60008267ffffffffffffffff1667ffffffffffffffff811115610739576107386144c4565b5b60405190808252806020026020018201604052801561077257816020015b61075f61436d565b8152602001906001900390816107575790505b50905060005b60008667ffffffffffffffff161180156107a557508367ffffffffffffffff168167ffffffffffffffff16105b15610d575760008567ffffffffffffffff160361085e57600260008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169550600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169450610778565b600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008667ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201805461098e90615131565b80601f01602080910402602001604051908101604052809291908181526020018280546109ba90615131565b8015610a075780601f106109dc57610100808354040283529160200191610a07565b820191906000526020600020905b8154815290600101906020018083116109ea57829003601f168201915b50505050508152602001600282018054610a2090615131565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c90615131565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b50505050508152602001600382018054610ab290615131565b80601f0160208091040260200160405190810160405280929190818152602001828054610ade90615131565b8015610b2b5780601f10610b0057610100808354040283529160200191610b2b565b820191906000526020600020905b815481529060010190602001808311610b0e57829003601f168201915b50505050508152602001600482018054610b4490615131565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7090615131565b8015610bbd5780601f10610b9257610100808354040283529160200191610bbd565b820191906000526020600020905b815481529060010190602001808311610ba057829003601f168201915b505050505081525050828267ffffffffffffffff1681518110610be357610be2615426565b5b602002602001018190525073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d838367ffffffffffffffff1681518110610c3b57610c3a615426565b5b602002602001015160e00151610c5090615485565b6040518263ffffffff1660e01b8152600401610c6c91906154fb565b600060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610cb29190615586565b828267ffffffffffffffff1681518110610ccf57610cce615426565b5b602002602001015160e001819052508080610ce9906155fe565b915050600360008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169450610778565b81925050505b9392505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb906150e2565b60405180910390fd5b6000610dff83614304565b90506000610e0c83614304565b90506000600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611610e8857600080fd5b600060016000610e978661433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906111919061562e565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff021916905560018201600061128191906143da565b60028201600061129191906143da565b6003820160006112a191906143da565b6004820160006112b191906143da565b505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611349576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611340906150e2565b60405180910390fd5b600061135482614304565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16116113ab57600080fd5b6000600160006113ba8561433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1660026000600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1660026000600260008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169050600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff02191690556001820160006116a591906143da565b6002820160006116b591906143da565b6003820160006116c591906143da565b6004820160006116d591906143da565b505060005b600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff168110156119be576000600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff169050600060016000611878600360008967ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060010180546117f590615131565b80601f016020809104026020016040519081016040528092919081815260200182805461182190615131565b801561186e5780601f106118435761010080835404028352916020019161186e565b820191906000526020600020905b81548152906001019060200180831161185157829003601f168201915b505050505061433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff021916905560018201600061197591906143da565b60028201600061198591906143da565b60038201600061199591906143da565b6004820160006119a591906143da565b50508092505080806119b690615657565b9150506116da565b50600260008067ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff1680929190611a039061562e565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff0219169055600182016000611ace91906143da565b600282016000611ade91906143da565b5050505050565b6060600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16925060008367ffffffffffffffff1603611b9657600167ffffffffffffffff811115611b5557611b546144c4565b5b604051908082528060200260200182016040528015611b8e57816020015b611b7b61441a565b815260200190600190039081611b735790505b509050611fba565b60008267ffffffffffffffff1667ffffffffffffffff811115611bbc57611bbb6144c4565b5b604051908082528060200260200182016040528015611bf557816020015b611be261441a565b815260200190600190039081611bda5790505b50905060005b8367ffffffffffffffff168167ffffffffffffffff161015611fb45760008567ffffffffffffffff160315611fb457600260008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182018054611d3490615131565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6090615131565b8015611dad5780601f10611d8257610100808354040283529160200191611dad565b820191906000526020600020905b815481529060010190602001808311611d9057829003601f168201915b50505050508152602001600282018054611dc690615131565b80601f0160208091040260200160405190810160405280929190818152602001828054611df290615131565b8015611e3f5780601f10611e1457610100808354040283529160200191611e3f565b820191906000526020600020905b815481529060010190602001808311611e2257829003601f168201915b505050505081525050828267ffffffffffffffff1681518110611e6557611e64615426565b5b602002602001018190525073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d838367ffffffffffffffff1681518110611ebd57611ebc615426565b5b602002602001015160a00151611ed290615485565b6040518263ffffffff1660e01b8152600401611eee91906154fb565b600060405180830381865afa158015611f0b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611f349190615586565b828267ffffffffffffffff1681518110611f5157611f50615426565b5b602002602001015160a00181905250600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1694508080611fac906155fe565b915050611bfb565b50809150505b92915050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612050576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612047906150e2565b60405180910390fd5b600061205b83614304565b9050600061206883614304565b90508067ffffffffffffffff168267ffffffffffffffff160361208a57600080fd5b6000600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611801561212a57506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b61213357600080fd5b600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1660026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1660026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600260008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508160026000600260008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a906150e2565b60405180910390fd5b600082510361253157600080fd5b600061253c83614304565b67ffffffffffffffff161461255057600080fd5b60008081819054906101000a900467ffffffffffffffff1680929190612575906155fe565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505060008054906101000a900467ffffffffffffffff16600160006125be8561433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506040518060c0016040528060008054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600260008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020018381526020018260405160200161269e919061540b565b604051602081830303815290604052815250600260008060009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160010190816127bd9190615318565b5060a08201518160020190816127d39190615318565b5090505060008054906101000a900467ffffffffffffffff1660026000600260008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008054906101000a900467ffffffffffffffff16600260008067ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008067ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff168092919061290f906155fe565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050565b61294261436d565b60006003600061295186614304565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600061297e85614304565b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020604051806101000160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152602001600182018054612a8490615131565b80601f0160208091040260200160405190810160405280929190818152602001828054612ab090615131565b8015612afd5780601f10612ad257610100808354040283529160200191612afd565b820191906000526020600020905b815481529060010190602001808311612ae057829003601f168201915b50505050508152602001600282018054612b1690615131565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4290615131565b8015612b8f5780601f10612b6457610100808354040283529160200191612b8f565b820191906000526020600020905b815481529060010190602001808311612b7257829003601f168201915b50505050508152602001600382018054612ba890615131565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd490615131565b8015612c215780601f10612bf657610100808354040283529160200191612c21565b820191906000526020600020905b815481529060010190602001808311612c0457829003601f168201915b50505050508152602001600482018054612c3a90615131565b80601f0160208091040260200160405190810160405280929190818152602001828054612c6690615131565b8015612cb35780601f10612c8857610100808354040283529160200191612cb3565b820191906000526020600020905b815481529060010190602001808311612c9657829003601f168201915b505050505081525050905073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d8260e00151612cfc90615485565b6040518263ffffffff1660e01b8152600401612d1891906154fb565b600060405180830381865afa158015612d35573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612d5e9190615586565b8160e001819052508091505092915050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1d906150e2565b60405180910390fd5b6000612e3185614304565b90506000612e3e85614304565b90506000612e4b85614304565b90506000612e5885614304565b90508067ffffffffffffffff168367ffffffffffffffff1603612e7a57600080fd5b6000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16118015612f6457506000600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16115b612f6d57600080fd5b600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff16600360008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008867ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000820160009054906101000a900467ffffffffffffffff168160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160089054906101000a900467ffffffffffffffff168160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160109054906101000a900467ffffffffffffffff168160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000820160189054906101000a900467ffffffffffffffff168160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001820181600101908161339d91906156b5565b50600282018160020190816133b291906156b5565b50600382018160030190816133c791906156b5565b50600482018160040190816133dc91906156b5565b5090505081600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008267ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff16600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600360008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008767ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906137429061562e565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600260008367ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff16809291906137b7906155fe565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008467ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff02191690556001820160006138a791906143da565b6002820160006138b791906143da565b6003820160006138c791906143da565b6004820160006138d791906143da565b50505050505050505050565b6138eb61441a565b6000600260006138fa85614304565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040518060c00160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820180546139ff90615131565b80601f0160208091040260200160405190810160405280929190818152602001828054613a2b90615131565b8015613a785780601f10613a4d57610100808354040283529160200191613a78565b820191906000526020600020905b815481529060010190602001808311613a5b57829003601f168201915b50505050508152602001600282018054613a9190615131565b80601f0160208091040260200160405190810160405280929190818152602001828054613abd90615131565b8015613b0a5780601f10613adf57610100808354040283529160200191613b0a565b820191906000526020600020905b815481529060010190602001808311613aed57829003601f168201915b505050505081525050905073fe2bbc3d86c3e4666d3e352f68b2a224cac2823873ffffffffffffffffffffffffffffffffffffffff1663bac6dd6d8260a00151613b5390615485565b6040518263ffffffff1660e01b8152600401613b6f91906154fb565b600060405180830381865afa158015613b8c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190613bb59190615586565b8160a0018190525080915050919050565b73fe2bbc3d86c3e4666d3e352f68b2a224cac2823881565b6000600260008067ffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff16905090565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ca1906150e2565b60405180910390fd5b6000613cb586614304565b90506000600260008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1611613d0c57600080fd5b6000855103613d1a57600080fd5b6000613d2586614304565b67ffffffffffffffff1614613d3957600080fd5b6000845103613d4757600080fd5b60008081819054906101000a900467ffffffffffffffff1680929190613d6c906155fe565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505060008054906101000a900467ffffffffffffffff1660016000613db58861433d565b815260200190815260200160002060006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060405180610100016040528060008054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020018267ffffffffffffffff168152602001600067ffffffffffffffff168152602001600360008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200186815260200185815260200184815260200183604051602001613ec6919061540b565b604051602081830303815290604052815250600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008060009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550608082015181600101908161400a9190615318565b5060a08201518160020190816140209190615318565b5060c08201518160030190816140369190615318565b5060e082015181600401908161404c9190615318565b5090505060008054906101000a900467ffffffffffffffff16600360008367ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206000600360008567ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008054906101000a900467ffffffffffffffff16600360008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008067ffffffffffffffff16815260200190815260200160002060000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600260008267ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001600881819054906101000a900467ffffffffffffffff1680929190614201906155fe565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050505050505050565b600060089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146142c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142b7906150e2565b60405180910390fd5b80600060086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160006143138461433d565b815260200190815260200160002060009054906101000a900467ffffffffffffffff169050919050565b60008160405160200161435091906157d9565b604051602081830303815290604052805190602001209050919050565b604051806101000160405280600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001606081526020016060815260200160608152602001606081525090565b5080546143e690615131565b6000825580601f106143f85750614417565b601f0160209004906000526020600020908101906144169190614478565b5b50565b6040518060c00160405280600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815260200160608152602001606081525090565b5b80821115614491576000816000905550600101614479565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144fc826144b3565b810181811067ffffffffffffffff8211171561451b5761451a6144c4565b5b80604052505050565b600061452e614495565b905061453a82826144f3565b919050565b600067ffffffffffffffff82111561455a576145596144c4565b5b614563826144b3565b9050602081019050919050565b82818337600083830152505050565b600061459261458d8461453f565b614524565b9050828152602081018484840111156145ae576145ad6144ae565b5b6145b9848285614570565b509392505050565b600082601f8301126145d6576145d56144a9565b5b81356145e684826020860161457f565b91505092915050565b6000819050919050565b614602816145ef565b811461460d57600080fd5b50565b60008135905061461f816145f9565b92915050565b60008060006060848603121561463e5761463d61449f565b5b600084013567ffffffffffffffff81111561465c5761465b6144a4565b5b614668868287016145c1565b935050602084013567ffffffffffffffff811115614689576146886144a4565b5b614695868287016145c1565b92505060406146a686828701614610565b9150509250925092565b600067ffffffffffffffff82169050919050565b6146cd816146b0565b81146146d857600080fd5b50565b6000813590506146ea816146c4565b92915050565b6000806000606084860312156147095761470861449f565b5b6000614717868287016146db565b9350506020614728868287016146db565b9250506040614739868287016146db565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614778816146b0565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147b857808201518184015260208101905061479d565b60008484015250505050565b60006147cf8261477e565b6147d98185614789565b93506147e981856020860161479a565b6147f2816144b3565b840191505092915050565b600061010083016000830151614816600086018261476f565b506020830151614829602086018261476f565b50604083015161483c604086018261476f565b50606083015161484f606086018261476f565b506080830151848203608086015261486782826147c4565b91505060a083015184820360a086015261488182826147c4565b91505060c083015184820360c086015261489b82826147c4565b91505060e083015184820360e08601526148b582826147c4565b9150508091505092915050565b60006148ce83836147fd565b905092915050565b6000602082019050919050565b60006148ee82614743565b6148f8818561474e565b93508360208202850161490a8561475f565b8060005b85811015614946578484038952815161492785826148c2565b9450614932836148d6565b925060208a0199505060018101905061490e565b50829750879550505050505092915050565b6000602082019050818103600083015261497281846148e3565b905092915050565b600080604083850312156149915761499061449f565b5b600083013567ffffffffffffffff8111156149af576149ae6144a4565b5b6149bb858286016145c1565b925050602083013567ffffffffffffffff8111156149dc576149db6144a4565b5b6149e8858286016145c1565b9150509250929050565b600060208284031215614a0857614a0761449f565b5b600082013567ffffffffffffffff811115614a2657614a256144a4565b5b614a32848285016145c1565b91505092915050565b60008060408385031215614a5257614a5161449f565b5b6000614a60858286016146db565b9250506020614a71858286016146db565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060c083016000830151614abf600086018261476f565b506020830151614ad2602086018261476f565b506040830151614ae5604086018261476f565b506060830151614af8606086018261476f565b5060808301518482036080860152614b1082826147c4565b91505060a083015184820360a0860152614b2a82826147c4565b9150508091505092915050565b6000614b438383614aa7565b905092915050565b6000602082019050919050565b6000614b6382614a7b565b614b6d8185614a86565b935083602082028501614b7f85614a97565b8060005b85811015614bbb5784840389528151614b9c8582614b37565b9450614ba783614b4b565b925060208a01995050600181019050614b83565b50829750879550505050505092915050565b60006020820190508181036000830152614be78184614b58565b905092915050565b60008060408385031215614c0657614c0561449f565b5b600083013567ffffffffffffffff811115614c2457614c236144a4565b5b614c30858286016145c1565b9250506020614c4185828601614610565b9150509250929050565b600061010083016000830151614c64600086018261476f565b506020830151614c77602086018261476f565b506040830151614c8a604086018261476f565b506060830151614c9d606086018261476f565b5060808301518482036080860152614cb582826147c4565b91505060a083015184820360a0860152614ccf82826147c4565b91505060c083015184820360c0860152614ce982826147c4565b91505060e083015184820360e0860152614d0382826147c4565b9150508091505092915050565b60006020820190508181036000830152614d2a8184614c4b565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614d5d82614d32565b9050919050565b614d6d81614d52565b82525050565b6000602082019050614d886000830184614d64565b92915050565b60008060008060808587031215614da857614da761449f565b5b600085013567ffffffffffffffff811115614dc657614dc56144a4565b5b614dd2878288016145c1565b945050602085013567ffffffffffffffff811115614df357614df26144a4565b5b614dff878288016145c1565b935050604085013567ffffffffffffffff811115614e2057614e1f6144a4565b5b614e2c878288016145c1565b925050606085013567ffffffffffffffff811115614e4d57614e4c6144a4565b5b614e59878288016145c1565b91505092959194509250565b600060c083016000830151614e7d600086018261476f565b506020830151614e90602086018261476f565b506040830151614ea3604086018261476f565b506060830151614eb6606086018261476f565b5060808301518482036080860152614ece82826147c4565b91505060a083015184820360a0860152614ee882826147c4565b9150508091505092915050565b60006020820190508181036000830152614f0f8184614e65565b905092915050565b614f20816146b0565b82525050565b6000602082019050614f3b6000830184614f17565b92915050565b600080600080600060a08688031215614f5d57614f5c61449f565b5b600086013567ffffffffffffffff811115614f7b57614f7a6144a4565b5b614f87888289016145c1565b955050602086013567ffffffffffffffff811115614fa857614fa76144a4565b5b614fb4888289016145c1565b945050604086013567ffffffffffffffff811115614fd557614fd46144a4565b5b614fe1888289016145c1565b935050606086013567ffffffffffffffff811115615002576150016144a4565b5b61500e888289016145c1565b925050608061501f88828901614610565b9150509295509295909350565b61503581614d52565b811461504057600080fd5b50565b6000813590506150528161502c565b92915050565b60006020828403121561506e5761506d61449f565b5b600061507c84828501615043565b91505092915050565b600082825260208201905092915050565b7f4f6e6c792044414f2063616e2063616c6c207468697300000000000000000000600082015250565b60006150cc601683615085565b91506150d782615096565b602082019050919050565b600060208201905081810360008301526150fb816150bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061514957607f821691505b60208210810361515c5761515b615102565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026151c47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615187565b6151ce8683615187565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061521561521061520b846151e6565b6151f0565b6151e6565b9050919050565b6000819050919050565b61522f836151fa565b61524361523b8261521c565b848454615194565b825550505050565b600090565b61525861524b565b615263818484615226565b505050565b5b818110156152875761527c600082615250565b600181019050615269565b5050565b601f8211156152cc5761529d81615162565b6152a684615177565b810160208510156152b5578190505b6152c96152c185615177565b830182615268565b50505b505050565b600082821c905092915050565b60006152ef600019846008026152d1565b1980831691505092915050565b600061530883836152de565b9150826002028217905092915050565b6153218261477e565b67ffffffffffffffff81111561533a576153396144c4565b5b6153448254615131565b61534f82828561528b565b600060209050601f8311600181146153825760008415615370578287015190505b61537a85826152fc565b8655506153e2565b601f19841661539086615162565b60005b828110156153b857848901518255600182019150602085019450602081019050615393565b868310156153d557848901516153d1601f8916826152de565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b615405615400826145ef565b6153ea565b82525050565b600061541782846153f4565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b6000819050602082019050919050565b600061547c82516145ef565b80915050919050565b600061549082615455565b8261549a84615460565b90506154a581615470565b925060208210156154e5576154e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615187565b831692505b5050919050565b6154f5816145ef565b82525050565b600060208201905061551060008301846154ec565b92915050565b60006155296155248461453f565b614524565b905082815260208101848484011115615545576155446144ae565b5b61555084828561479a565b509392505050565b600082601f83011261556d5761556c6144a9565b5b815161557d848260208601615516565b91505092915050565b60006020828403121561559c5761559b61449f565b5b600082015167ffffffffffffffff8111156155ba576155b96144a4565b5b6155c684828501615558565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615609826146b0565b915067ffffffffffffffff8203615623576156226155cf565b5b600182019050919050565b6000615639826146b0565b91506000820361564c5761564b6155cf565b5b600182039050919050565b6000615662826151e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615694576156936155cf565b5b600182019050919050565b6000815490506156ae81615131565b9050919050565b8181036156c357505061579b565b6156cc8261569f565b67ffffffffffffffff8111156156e5576156e46144c4565b5b6156ef8254615131565b6156fa82828561528b565b6000601f8311600181146157295760008415615717578287015490505b61572185826152fc565b865550615794565b601f19841661573787615162565b965061574286615162565b60005b8281101561576a57848901548255600182019150600185019450602081019050615745565b868310156157875784890154615783601f8916826152de565b8355505b6001600288020188555050505b5050505050505b565b600081905092915050565b60006157b38261477e565b6157bd818561579d565b93506157cd81856020860161479a565b80840191505092915050565b60006157e582846157a8565b91508190509291505056fea2646970667358221220b1df56d497c7f0a3f8b991f056fa2b00662e9a0689b15f4002026b9c1ceeecc064736f6c63430008100033