ETH Price: $3,417.55 (+3.18%)

Contract

0x5b7dD1E86623548AF054A4985F7fc8Ccbb554E2c
 

Overview

ETH Balance

4.7304506 ETH

Eth Value

$16,166.57 (@ $3,417.55/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Multiple A...212221792024-11-19 13:48:474 days ago1732024127IN
0x5b7dD1E8...cbb554E2c
0 ETH0.0015781422.54016476
Claim Multiple A...211702632024-11-12 7:59:2311 days ago1731398363IN
0x5b7dD1E8...cbb554E2c
0 ETH0.0017911325.58581047
Submit Answer211647602024-11-11 13:32:2312 days ago1731331943IN
0x5b7dD1E8...cbb554E2c
0.1 ETH0.0020596719.96675421
Claim Multiple A...211636782024-11-11 9:54:5912 days ago1731318899IN
0x5b7dD1E8...cbb554E2c
0 ETH0.0010200314.57093377
Submit Answer211284422024-11-06 11:54:3517 days ago1730894075IN
0x5b7dD1E8...cbb554E2c
0.02 ETH0.0015883115.43385368
Submit Answer211282582024-11-06 11:17:3517 days ago1730891855IN
0x5b7dD1E8...cbb554E2c
0.1 ETH0.0015319814.85301208
Claim Multiple A...209416972024-10-11 10:10:5943 days ago1728641459IN
0x5b7dD1E8...cbb554E2c
0 ETH0.0011973317.10109519
Claim Multiple A...209416932024-10-11 10:10:1143 days ago1728641411IN
0x5b7dD1E8...cbb554E2c
0 ETH0.0012232517.47125815
Submit Answer209196632024-10-08 8:28:1146 days ago1728376091IN
0x5b7dD1E8...cbb554E2c
0.1 ETH0.0013740913.32069148
Submit Answer209196192024-10-08 8:19:2346 days ago1728375563IN
0x5b7dD1E8...cbb554E2c
0.1 ETH0.0013942313.51589097
Submit Answer209161222024-10-07 20:37:4746 days ago1728333467IN
0x5b7dD1E8...cbb554E2c
0.02 ETH0.0039339338.08885785
Claim Multiple A...208916182024-10-04 10:39:5950 days ago1728038399IN
0x5b7dD1E8...cbb554E2c
0 ETH0.000357815.11047836
Submit Answer208916022024-10-04 10:36:4750 days ago1728038207IN
0x5b7dD1E8...cbb554E2c
0.001 ETH0.000573815.56260448
Submit Answer206920142024-09-06 14:00:5978 days ago1725631259IN
0x5b7dD1E8...cbb554E2c
0.01 ETH0.0031685830.79708246
Submit Answer206729182024-09-03 22:03:3580 days ago1725401015IN
0x5b7dD1E8...cbb554E2c
0.01 ETH0.000211982.06060956
Claim Multiple A...205133262024-08-12 15:08:23103 days ago1723475303IN
0x5b7dD1E8...cbb554E2c
0 ETH0.000417819.11700942
Claim Multiple A...205133262024-08-12 15:08:23103 days ago1723475303IN
0x5b7dD1E8...cbb554E2c
0 ETH0.000632989.04192644
Claim Multiple A...204773682024-08-07 14:43:23108 days ago1723041803IN
0x5b7dD1E8...cbb554E2c
0 ETH0.0014363620.51807377
Submit Answer204534602024-08-04 6:41:23111 days ago1722753683IN
0x5b7dD1E8...cbb554E2c
0.1 ETH0.000119661.43754451
Claim Multiple A...203195452024-07-16 14:03:23130 days ago1721138603IN
0x5b7dD1E8...cbb554E2c
0 ETH0.000666599.52214439
Submit Answer202698512024-07-09 15:32:35137 days ago1720539155IN
0x5b7dD1E8...cbb554E2c
0.1 ETH0.0016901616.3847338
Claim Multiple A...201636412024-06-24 19:30:35151 days ago1719257435IN
0x5b7dD1E8...cbb554E2c
0 ETH0.000381015.44184031
Submit Answer201199642024-06-18 16:55:11157 days ago1718729711IN
0x5b7dD1E8...cbb554E2c
0.1 ETH0.0010613310.2887293
Submit Answer198541242024-05-12 13:05:23195 days ago1715519123IN
0x5b7dD1E8...cbb554E2c
0.1 ETH0.000356254.27965556
Create Template197280922024-04-24 22:04:59212 days ago1713996299IN
0x5b7dD1E8...cbb554E2c
0 ETH0.0010463711.54952601
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
212221792024-11-19 13:48:474 days ago1732024127
0x5b7dD1E8...cbb554E2c
0.1 ETH
211702632024-11-12 7:59:2311 days ago1731398363
0x5b7dD1E8...cbb554E2c
0.1 ETH
211636782024-11-11 9:54:5912 days ago1731318899
0x5b7dD1E8...cbb554E2c
0.02 ETH
209416972024-10-11 10:10:5943 days ago1728641459
0x5b7dD1E8...cbb554E2c
0.1 ETH
209416932024-10-11 10:10:1143 days ago1728641411
0x5b7dD1E8...cbb554E2c
0.1 ETH
208916182024-10-04 10:39:5950 days ago1728038399
0x5b7dD1E8...cbb554E2c
0.001 ETH
205133262024-08-12 15:08:23103 days ago1723475303
0x5b7dD1E8...cbb554E2c
0.1 ETH
204773682024-08-07 14:43:23108 days ago1723041803
0x5b7dD1E8...cbb554E2c
0.1 ETH
203195452024-07-16 14:03:23130 days ago1721138603
0x5b7dD1E8...cbb554E2c
0.1 ETH
201636412024-06-24 19:30:35151 days ago1719257435
0x5b7dD1E8...cbb554E2c
0.1 ETH
196403462024-04-12 15:12:59225 days ago1712934779
0x5b7dD1E8...cbb554E2c
0 ETH
196102212024-04-08 10:00:59229 days ago1712570459
0x5b7dD1E8...cbb554E2c
0.1 ETH
195190492024-03-26 13:55:59242 days ago1711461359
0x5b7dD1E8...cbb554E2c
0.1 ETH
192557792024-02-18 16:09:35279 days ago1708272575
0x5b7dD1E8...cbb554E2c
0.1 ETH
192068242024-02-11 19:14:11285 days ago1707678851
0x5b7dD1E8...cbb554E2c
0.1 ETH
191920902024-02-09 17:35:23287 days ago1707500123
0x5b7dD1E8...cbb554E2c
0.1 ETH
191683122024-02-06 9:28:35291 days ago1707211715
0x5b7dD1E8...cbb554E2c
0.5 ETH
190201082024-01-16 14:40:23312 days ago1705416023
0x5b7dD1E8...cbb554E2c
0.1 ETH
188996022023-12-30 16:45:11329 days ago1703954711
0x5b7dD1E8...cbb554E2c
0.1 ETH
188577992023-12-24 19:47:59334 days ago1703447279
0x5b7dD1E8...cbb554E2c
0.1 ETH
187133132023-12-04 13:31:11355 days ago1701696671
0x5b7dD1E8...cbb554E2c
0.1 ETH
186060422023-11-19 13:05:59370 days ago1700399159
0x5b7dD1E8...cbb554E2c
0.1 ETH
185954942023-11-18 1:33:59371 days ago1700271239
0x5b7dD1E8...cbb554E2c
0.1 ETH
185746942023-11-15 3:43:59374 days ago1700019839
0x5b7dD1E8...cbb554E2c
0.5 ETH
185384092023-11-10 1:57:23379 days ago1699581443
0x5b7dD1E8...cbb554E2c
0.1 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RealityETH_v3_0

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-10
*/

// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.8.6;

contract BalanceHolder {

    mapping(address => uint256) public balanceOf;

    event LogWithdraw(
        address indexed user,
        uint256 amount
    );

    function withdraw() 
    public {
        uint256 bal = balanceOf[msg.sender];
        balanceOf[msg.sender] = 0;
        payable(msg.sender).transfer(bal);
        emit LogWithdraw(msg.sender, bal);
    }

}

contract RealityETH_v3_0 is BalanceHolder {

    address constant NULL_ADDRESS = address(0);

    // History hash when no history is created, or history has been cleared
    bytes32 constant NULL_HASH = bytes32(0);

    // An unitinalized finalize_ts for a question will indicate an unanswered question.
    uint32 constant UNANSWERED = 0;

    // An unanswered reveal_ts for a commitment will indicate that it does not exist.
    uint256 constant COMMITMENT_NON_EXISTENT = 0;

    // Commit->reveal timeout is 1/8 of the question timeout (rounded down).
    uint32 constant COMMITMENT_TIMEOUT_RATIO = 8;

    // Proportion withheld when you claim an earlier bond.
    uint256 constant BOND_CLAIM_FEE_PROPORTION = 40; // One 40th ie 2.5%

    // Special value representing a question that was answered too soon.
    // bytes32(-2). By convention we use bytes32(-1) for "invalid", although the contract does not handle this.
    bytes32 constant UNRESOLVED_ANSWER = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe;

    event LogSetQuestionFee(
        address arbitrator,
        uint256 amount
    );

    event LogNewTemplate(
        uint256 indexed template_id,
        address indexed user, 
        string question_text
    );

    event LogNewQuestion(
        bytes32 indexed question_id,
        address indexed user, 
        uint256 template_id,
        string question,
        bytes32 indexed content_hash,
        address arbitrator, 
        uint32 timeout,
        uint32 opening_ts,
        uint256 nonce,
        uint256 created
    );

    event LogMinimumBond(
        bytes32 indexed question_id,
        uint256 min_bond
    );

    event LogFundAnswerBounty(
        bytes32 indexed question_id,
        uint256 bounty_added,
        uint256 bounty,
        address indexed user 
    );

    event LogNewAnswer(
        bytes32 answer,
        bytes32 indexed question_id,
        bytes32 history_hash,
        address indexed user,
        uint256 bond,
        uint256 ts,
        bool is_commitment
    );

    event LogAnswerReveal(
        bytes32 indexed question_id, 
        address indexed user, 
        bytes32 indexed answer_hash, 
        bytes32 answer, 
        uint256 nonce, 
        uint256 bond
    );

    event LogNotifyOfArbitrationRequest(
        bytes32 indexed question_id,
        address indexed user 
    );

    event LogCancelArbitration(
        bytes32 indexed question_id
    );

    event LogFinalize(
        bytes32 indexed question_id,
        bytes32 indexed answer
    );

    event LogClaim(
        bytes32 indexed question_id,
        address indexed user,
        uint256 amount
    );

    event LogReopenQuestion(
        bytes32 indexed question_id,
        bytes32 indexed reopened_question_id
    );

    struct Question {
        bytes32 content_hash;
        address arbitrator;
        uint32 opening_ts;
        uint32 timeout;
        uint32 finalize_ts;
        bool is_pending_arbitration;
        uint256 bounty;
        bytes32 best_answer;
        bytes32 history_hash;
        uint256 bond;
        uint256 min_bond;
    }

    // Stored in a mapping indexed by commitment_id, a hash of commitment hash, question, bond. 
    struct Commitment {
        uint32 reveal_ts;
        bool is_revealed;
        bytes32 revealed_answer;
    }

    // Only used when claiming more bonds than fits into a transaction
    // Stored in a mapping indexed by question_id.
    struct Claim {
        address payee;
        uint256 last_bond;
        uint256 queued_funds;
    }

    uint256 nextTemplateID = 0;
    mapping(uint256 => uint256) public templates;
    mapping(uint256 => bytes32) public template_hashes;
    mapping(bytes32 => Question) public questions;
    mapping(bytes32 => Claim) public question_claims;
    mapping(bytes32 => Commitment) public commitments;
    mapping(address => uint256) public arbitrator_question_fees; 
    mapping(bytes32 => bytes32) public reopened_questions;
    mapping(bytes32 => bool) public reopener_questions;


    modifier onlyArbitrator(bytes32 question_id) {
        require(msg.sender == questions[question_id].arbitrator, "msg.sender must be arbitrator");
        _;
    }

    modifier stateAny() {
        _;
    }

    modifier stateNotCreated(bytes32 question_id) {
        require(questions[question_id].timeout == 0, "question must not exist");
        _;
    }

    modifier stateOpen(bytes32 question_id) {
        require(questions[question_id].timeout > 0, "question must exist");
        require(!questions[question_id].is_pending_arbitration, "question must not be pending arbitration");
        uint32 finalize_ts = questions[question_id].finalize_ts;
        require(finalize_ts == UNANSWERED || finalize_ts > uint32(block.timestamp), "finalization deadline must not have passed");
        uint32 opening_ts = questions[question_id].opening_ts;
        require(opening_ts == 0 || opening_ts <= uint32(block.timestamp), "opening date must have passed"); 
        _;
    }

    modifier statePendingArbitration(bytes32 question_id) {
        require(questions[question_id].is_pending_arbitration, "question must be pending arbitration");
        _;
    }

    modifier stateOpenOrPendingArbitration(bytes32 question_id) {
        require(questions[question_id].timeout > 0, "question must exist");
        uint32 finalize_ts = questions[question_id].finalize_ts;
        require(finalize_ts == UNANSWERED || finalize_ts > uint32(block.timestamp), "finalization dealine must not have passed");
        uint32 opening_ts = questions[question_id].opening_ts;
        require(opening_ts == 0 || opening_ts <= uint32(block.timestamp), "opening date must have passed"); 
        _;
    }

    modifier stateFinalized(bytes32 question_id) {
        require(isFinalized(question_id), "question must be finalized");
        _;
    }

    modifier bondMustDoubleAndMatchMinimum(bytes32 question_id) {
        require(msg.value > 0, "bond must be positive"); 
        uint256 current_bond = questions[question_id].bond;
        if (current_bond == 0) {
            require(msg.value >= (questions[question_id].min_bond), "bond must exceed the minimum");
        } else {
            require(msg.value >= (current_bond * 2), "bond must be double at least previous bond");
        }
        _;
    }

    modifier previousBondMustNotBeatMaxPrevious(bytes32 question_id, uint256 max_previous) {
        if (max_previous > 0) {
            require(questions[question_id].bond <= max_previous, "bond must exceed max_previous");
        }
        _;
    }

    /// @notice Constructor, sets up some initial templates
    /// @dev Creates some generalized templates for different question types used in the DApp.
    constructor() {
        createTemplate('{"title": "%s", "type": "bool", "category": "%s", "lang": "%s"}');
        createTemplate('{"title": "%s", "type": "uint", "decimals": 18, "category": "%s", "lang": "%s"}');
        createTemplate('{"title": "%s", "type": "single-select", "outcomes": [%s], "category": "%s", "lang": "%s"}');
        createTemplate('{"title": "%s", "type": "multiple-select", "outcomes": [%s], "category": "%s", "lang": "%s"}');
        createTemplate('{"title": "%s", "type": "datetime", "category": "%s", "lang": "%s"}');
    }

    /// @notice Function for arbitrator to set an optional per-question fee. 
    /// @dev The per-question fee, charged when a question is asked, is intended as an anti-spam measure.
    /// @param fee The fee to be charged by the arbitrator when a question is asked
    function setQuestionFee(uint256 fee) 
        stateAny() 
    external {
        arbitrator_question_fees[msg.sender] = fee;
        emit LogSetQuestionFee(msg.sender, fee);
    }

    /// @notice Create a reusable template, which should be a JSON document.
    /// Placeholders should use gettext() syntax, eg %s.
    /// @dev Template data is only stored in the event logs, but its block number is kept in contract storage.
    /// @param content The template content
    /// @return The ID of the newly-created template, which is created sequentially.
    function createTemplate(string memory content) 
        stateAny()
    public returns (uint256) {
        uint256 id = nextTemplateID;
        templates[id] = block.number;
        template_hashes[id] = keccak256(abi.encodePacked(content));
        emit LogNewTemplate(id, msg.sender, content);
        nextTemplateID = id + 1;
        return id;
    }

    /// @notice Create a new reusable template and use it to ask a question
    /// @dev Template data is only stored in the event logs, but its block number is kept in contract storage.
    /// @param content The template content
    /// @param question A string containing the parameters that will be passed into the template to make the question
    /// @param arbitrator The arbitration contract that will have the final word on the answer if there is a dispute
    /// @param timeout How long the contract should wait after the answer is changed before finalizing on that answer
    /// @param opening_ts If set, the earliest time it should be possible to answer the question.
    /// @param nonce A user-specified nonce used in the question ID. Change it to repeat a question.
    /// @return The ID of the newly-created template, which is created sequentially.
    function createTemplateAndAskQuestion(
        string memory content, 
        string memory question, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 nonce 
    ) 
        // stateNotCreated is enforced by the internal _askQuestion
    public payable returns (bytes32) {
        uint256 template_id = createTemplate(content);
        return askQuestion(template_id, question, arbitrator, timeout, opening_ts, nonce);
    }

    /// @notice Ask a new question and return the ID
    /// @dev Template data is only stored in the event logs, but its block number is kept in contract storage.
    /// @param template_id The ID number of the template the question will use
    /// @param question A string containing the parameters that will be passed into the template to make the question
    /// @param arbitrator The arbitration contract that will have the final word on the answer if there is a dispute
    /// @param timeout How long the contract should wait after the answer is changed before finalizing on that answer
    /// @param opening_ts If set, the earliest time it should be possible to answer the question.
    /// @param nonce A user-specified nonce used in the question ID. Change it to repeat a question.
    /// @return The ID of the newly-created question, created deterministically.
    function askQuestion(uint256 template_id, string memory question, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 nonce) 
        // stateNotCreated is enforced by the internal _askQuestion
    public payable returns (bytes32) {

        require(templates[template_id] > 0, "template must exist");

        bytes32 content_hash = keccak256(abi.encodePacked(template_id, opening_ts, question));
        bytes32 question_id = keccak256(abi.encodePacked(content_hash, arbitrator, timeout, uint256(0), address(this), msg.sender, nonce));

        // We emit this event here because _askQuestion doesn't need to know the unhashed question. Other events are emitted by _askQuestion.
        emit LogNewQuestion(question_id, msg.sender, template_id, question, content_hash, arbitrator, timeout, opening_ts, nonce, block.timestamp);
        _askQuestion(question_id, content_hash, arbitrator, timeout, opening_ts, 0);

        return question_id;
    }

    /// @notice Ask a new question and return the ID
    /// @dev Template data is only stored in the event logs, but its block number is kept in contract storage.
    /// @param template_id The ID number of the template the question will use
    /// @param question A string containing the parameters that will be passed into the template to make the question
    /// @param arbitrator The arbitration contract that will have the final word on the answer if there is a dispute
    /// @param timeout How long the contract should wait after the answer is changed before finalizing on that answer
    /// @param opening_ts If set, the earliest time it should be possible to answer the question.
    /// @param nonce A user-specified nonce used in the question ID. Change it to repeat a question.
    /// @param min_bond The minimum bond that may be used for an answer.
    /// @return The ID of the newly-created question, created deterministically.
    function askQuestionWithMinBond(uint256 template_id, string memory question, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 nonce, uint256 min_bond) 
        // stateNotCreated is enforced by the internal _askQuestion
    public payable returns (bytes32) {

        require(templates[template_id] > 0, "template must exist");

        bytes32 content_hash = keccak256(abi.encodePacked(template_id, opening_ts, question));
        bytes32 question_id = keccak256(abi.encodePacked(content_hash, arbitrator, timeout, min_bond, address(this), msg.sender, nonce));

        // We emit this event here because _askQuestion doesn't need to know the unhashed question.
        // Other events are emitted by _askQuestion.
        emit LogNewQuestion(question_id, msg.sender, template_id, question, content_hash, arbitrator, timeout, opening_ts, nonce, block.timestamp);
        _askQuestion(question_id, content_hash, arbitrator, timeout, opening_ts, min_bond);

        return question_id;
    }

    function _askQuestion(bytes32 question_id, bytes32 content_hash, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 min_bond) 
        stateNotCreated(question_id)
    internal {

        // A timeout of 0 makes no sense, and we will use this to check existence
        require(timeout > 0, "timeout must be positive"); 
        require(timeout < 365 days, "timeout must be less than 365 days"); 

        uint256 bounty = msg.value;

        // The arbitrator can set a fee for asking a question. 
        // This is intended as an anti-spam defence.
        // The fee is waived if the arbitrator is asking the question.
        // This allows them to set an impossibly high fee and make users proxy the question through them.
        // This would allow more sophisticated pricing, question whitelisting etc.
        if (arbitrator != NULL_ADDRESS && msg.sender != arbitrator) {
            uint256 question_fee = arbitrator_question_fees[arbitrator];
            require(bounty >= question_fee, "ETH provided must cover question fee"); 
            bounty = bounty - question_fee;
            balanceOf[arbitrator] = balanceOf[arbitrator] + question_fee;
        }

        questions[question_id].content_hash = content_hash;
        questions[question_id].arbitrator = arbitrator;
        questions[question_id].opening_ts = opening_ts;
        questions[question_id].timeout = timeout;

        if (bounty > 0) {
            questions[question_id].bounty = bounty;
            emit LogFundAnswerBounty(question_id, bounty, bounty, msg.sender);
        }

        if (min_bond > 0) {
            questions[question_id].min_bond = min_bond;
            emit LogMinimumBond(question_id, min_bond);
        }

    }

    /// @notice Add funds to the bounty for a question
    /// @dev Add bounty funds after the initial question creation. Can be done any time until the question is finalized.
    /// @param question_id The ID of the question you wish to fund
    function fundAnswerBounty(bytes32 question_id) 
        stateOpen(question_id)
    external payable {
        questions[question_id].bounty = questions[question_id].bounty + msg.value;
        emit LogFundAnswerBounty(question_id, msg.value, questions[question_id].bounty, msg.sender);
    }

    /// @notice Submit an answer for a question.
    /// @dev Adds the answer to the history and updates the current "best" answer.
    /// May be subject to front-running attacks; Substitute submitAnswerCommitment()->submitAnswerReveal() to prevent them.
    /// @param question_id The ID of the question
    /// @param answer The answer, encoded into bytes32
    /// @param max_previous If specified, reverts if a bond higher than this was submitted after you sent your transaction.
    function submitAnswer(bytes32 question_id, bytes32 answer, uint256 max_previous) 
        stateOpen(question_id)
        bondMustDoubleAndMatchMinimum(question_id)
        previousBondMustNotBeatMaxPrevious(question_id, max_previous)
    external payable {
        _addAnswerToHistory(question_id, answer, msg.sender, msg.value, false);
        _updateCurrentAnswer(question_id, answer);
    }

    /// @notice Submit an answer for a question, crediting it to the specified account.
    /// @dev Adds the answer to the history and updates the current "best" answer.
    /// May be subject to front-running attacks; Substitute submitAnswerCommitment()->submitAnswerReveal() to prevent them.
    /// @param question_id The ID of the question
    /// @param answer The answer, encoded into bytes32
    /// @param max_previous If specified, reverts if a bond higher than this was submitted after you sent your transaction.
    /// @param answerer The account to which the answer should be credited
    function submitAnswerFor(bytes32 question_id, bytes32 answer, uint256 max_previous, address answerer)
        stateOpen(question_id)
        bondMustDoubleAndMatchMinimum(question_id)
        previousBondMustNotBeatMaxPrevious(question_id, max_previous)
    external payable {
        require(answerer != NULL_ADDRESS, "answerer must be non-zero");
        _addAnswerToHistory(question_id, answer, answerer, msg.value, false);
        _updateCurrentAnswer(question_id, answer);
    }

    // @notice Verify and store a commitment, including an appropriate timeout
    // @param question_id The ID of the question to store
    // @param commitment The ID of the commitment
    function _storeCommitment(bytes32 question_id, bytes32 commitment_id) 
    internal
    {
        require(commitments[commitment_id].reveal_ts == COMMITMENT_NON_EXISTENT, "commitment must not already exist");

        uint32 commitment_timeout = questions[question_id].timeout / COMMITMENT_TIMEOUT_RATIO;
        commitments[commitment_id].reveal_ts = uint32(block.timestamp) + commitment_timeout;
    }

    /// @notice Submit the hash of an answer, laying your claim to that answer if you reveal it in a subsequent transaction.
    /// @dev Creates a hash, commitment_id, uniquely identifying this answer, to this question, with this bond.
    /// The commitment_id is stored in the answer history where the answer would normally go.
    /// Does not update the current best answer - this is left to the later submitAnswerReveal() transaction.
    /// @param question_id The ID of the question
    /// @param answer_hash The hash of your answer, plus a nonce that you will later reveal
    /// @param max_previous If specified, reverts if a bond higher than this was submitted after you sent your transaction.
    /// @param _answerer If specified, the address to be given as the question answerer. Defaults to the sender.
    /// @dev Specifying the answerer is useful if you want to delegate the commit-and-reveal to a third-party.
    function submitAnswerCommitment(bytes32 question_id, bytes32 answer_hash, uint256 max_previous, address _answerer) 
        stateOpen(question_id)
        bondMustDoubleAndMatchMinimum(question_id)
        previousBondMustNotBeatMaxPrevious(question_id, max_previous)
    external payable {

        bytes32 commitment_id = keccak256(abi.encodePacked(question_id, answer_hash, msg.value));
        address answerer = (_answerer == NULL_ADDRESS) ? msg.sender : _answerer;
        _storeCommitment(question_id, commitment_id);
        _addAnswerToHistory(question_id, commitment_id, answerer, msg.value, true);

    }

    /// @notice Submit the answer whose hash you sent in a previous submitAnswerCommitment() transaction
    /// @dev Checks the parameters supplied recreate an existing commitment, and stores the revealed answer
    /// Updates the current answer unless someone has since supplied a new answer with a higher bond
    /// msg.sender is intentionally not restricted to the user who originally sent the commitment; 
    /// For example, the user may want to provide the answer+nonce to a third-party service and let them send the tx
    /// NB If we are pending arbitration, it will be up to the arbitrator to wait and see any outstanding reveal is sent
    /// @param question_id The ID of the question
    /// @param answer The answer, encoded as bytes32
    /// @param nonce The nonce that, combined with the answer, recreates the answer_hash you gave in submitAnswerCommitment()
    /// @param bond The bond that you paid in your submitAnswerCommitment() transaction
    function submitAnswerReveal(bytes32 question_id, bytes32 answer, uint256 nonce, uint256 bond) 
        stateOpenOrPendingArbitration(question_id)
    external {

        bytes32 answer_hash = keccak256(abi.encodePacked(answer, nonce));
        bytes32 commitment_id = keccak256(abi.encodePacked(question_id, answer_hash, bond));

        require(!commitments[commitment_id].is_revealed, "commitment must not have been revealed yet");
        require(commitments[commitment_id].reveal_ts > uint32(block.timestamp), "reveal deadline must not have passed");

        commitments[commitment_id].revealed_answer = answer;
        commitments[commitment_id].is_revealed = true;

        if (bond == questions[question_id].bond) {
            _updateCurrentAnswer(question_id, answer);
        }

        emit LogAnswerReveal(question_id, msg.sender, answer_hash, answer, nonce, bond);

    }

    function _addAnswerToHistory(bytes32 question_id, bytes32 answer_or_commitment_id, address answerer, uint256 bond, bool is_commitment) 
    internal 
    {
        bytes32 new_history_hash = keccak256(abi.encodePacked(questions[question_id].history_hash, answer_or_commitment_id, bond, answerer, is_commitment));

        // Update the current bond level, if there's a bond (ie anything except arbitration)
        if (bond > 0) {
            questions[question_id].bond = bond;
        }
        questions[question_id].history_hash = new_history_hash;

        emit LogNewAnswer(answer_or_commitment_id, question_id, new_history_hash, answerer, bond, block.timestamp, is_commitment);
    }

    function _updateCurrentAnswer(bytes32 question_id, bytes32 answer)
    internal {
        questions[question_id].best_answer = answer;
        questions[question_id].finalize_ts = uint32(block.timestamp) + questions[question_id].timeout;
    }

    // Like _updateCurrentAnswer but without advancing the timeout
    function _updateCurrentAnswerByArbitrator(bytes32 question_id, bytes32 answer)
    internal {
        questions[question_id].best_answer = answer;
        questions[question_id].finalize_ts = uint32(block.timestamp);
    }

    /// @notice Notify the contract that the arbitrator has been paid for a question, freezing it pending their decision.
    /// @dev The arbitrator contract is trusted to only call this if they've been paid, and tell us who paid them.
    /// @param question_id The ID of the question
    /// @param requester The account that requested arbitration
    /// @param max_previous If specified, reverts if a bond higher than this was submitted after you sent your transaction.
    function notifyOfArbitrationRequest(bytes32 question_id, address requester, uint256 max_previous) 
        onlyArbitrator(question_id)
        stateOpen(question_id)
        previousBondMustNotBeatMaxPrevious(question_id, max_previous)
    external {
        require(questions[question_id].finalize_ts > UNANSWERED, "Question must already have an answer when arbitration is requested");
        questions[question_id].is_pending_arbitration = true;
        emit LogNotifyOfArbitrationRequest(question_id, requester);
    }

    /// @notice Cancel a previously-requested arbitration and extend the timeout
    /// @dev Useful when doing arbitration across chains that can't be requested atomically
    /// @param question_id The ID of the question
    function cancelArbitration(bytes32 question_id) 
        onlyArbitrator(question_id)
        statePendingArbitration(question_id)
    external {
        questions[question_id].is_pending_arbitration = false;
        questions[question_id].finalize_ts = uint32(block.timestamp) + questions[question_id].timeout;
        emit LogCancelArbitration(question_id);
    }

    /// @notice Submit the answer for a question, for use by the arbitrator.
    /// @dev Doesn't require (or allow) a bond.
    /// If the current final answer is correct, the account should be whoever submitted it.
    /// If the current final answer is wrong, the account should be whoever paid for arbitration.
    /// However, the answerer stipulations are not enforced by the contract.
    /// @param question_id The ID of the question
    /// @param answer The answer, encoded into bytes32
    /// @param answerer The account credited with this answer for the purpose of bond claims
    function submitAnswerByArbitrator(bytes32 question_id, bytes32 answer, address answerer) 
        onlyArbitrator(question_id)
        statePendingArbitration(question_id)
    public {

        require(answerer != NULL_ADDRESS, "answerer must be provided");
        emit LogFinalize(question_id, answer);

        questions[question_id].is_pending_arbitration = false;
        _addAnswerToHistory(question_id, answer, answerer, 0, false);
        _updateCurrentAnswerByArbitrator(question_id, answer);

    }

    /// @notice Submit the answer for a question, for use by the arbitrator, working out the appropriate winner based on the last answer details.
    /// @dev Doesn't require (or allow) a bond.
    /// @param question_id The ID of the question
    /// @param answer The answer, encoded into bytes32
    /// @param payee_if_wrong The account to by credited as winner if the last answer given is wrong, usually the account that paid the arbitrator
    /// @param last_history_hash The history hash before the final one
    /// @param last_answer_or_commitment_id The last answer given, or the commitment ID if it was a commitment.
    /// @param last_answerer The address that supplied the last answer
    function assignWinnerAndSubmitAnswerByArbitrator(bytes32 question_id, bytes32 answer, address payee_if_wrong, bytes32 last_history_hash, bytes32 last_answer_or_commitment_id, address last_answerer) 
    external {
        bool is_commitment = _verifyHistoryInputOrRevert(questions[question_id].history_hash, last_history_hash, last_answer_or_commitment_id, questions[question_id].bond, last_answerer);

        address payee;
        // If the last answer is an unrevealed commit, it's always wrong.
        // For anything else, the last answer was set as the "best answer" in submitAnswer or submitAnswerReveal.
        if (is_commitment && !commitments[last_answer_or_commitment_id].is_revealed) {
            require(commitments[last_answer_or_commitment_id].reveal_ts < uint32(block.timestamp), "You must wait for the reveal deadline before finalizing");
            payee = payee_if_wrong;
        } else {
            payee = (questions[question_id].best_answer == answer) ? last_answerer : payee_if_wrong;
        }
        submitAnswerByArbitrator(question_id, answer, payee);
    }


    /// @notice Report whether the answer to the specified question is finalized
    /// @param question_id The ID of the question
    /// @return Return true if finalized
    function isFinalized(bytes32 question_id) 
    view public returns (bool) {
        uint32 finalize_ts = questions[question_id].finalize_ts;
        return ( !questions[question_id].is_pending_arbitration && (finalize_ts > UNANSWERED) && (finalize_ts <= uint32(block.timestamp)) );
    }

    /// @notice (Deprecated) Return the final answer to the specified question, or revert if there isn't one
    /// @param question_id The ID of the question
    /// @return The answer formatted as a bytes32
    function getFinalAnswer(bytes32 question_id) 
        stateFinalized(question_id)
    external view returns (bytes32) {
        return questions[question_id].best_answer;
    }

    /// @notice Return the final answer to the specified question, or revert if there isn't one
    /// @param question_id The ID of the question
    /// @return The answer formatted as a bytes32
    function resultFor(bytes32 question_id) 
        stateFinalized(question_id)
    public view returns (bytes32) {
        return questions[question_id].best_answer;
    }

    /// @notice Returns whether the question was answered before it had an answer, ie resolved to UNRESOLVED_ANSWER
    /// @param question_id The ID of the question 
    function isSettledTooSoon(bytes32 question_id)
    public view returns(bool) {
        return (resultFor(question_id) == UNRESOLVED_ANSWER);
    }

    /// @notice Like resultFor(), but errors out if settled too soon, or returns the result of a replacement if it was reopened at the right time and settled
    /// @param question_id The ID of the question 
    function resultForOnceSettled(bytes32 question_id)
    external view returns(bytes32) {
        bytes32 result = resultFor(question_id);
        if (result == UNRESOLVED_ANSWER) {
            // Try the replacement
            bytes32 replacement_id = reopened_questions[question_id];
            require(replacement_id != bytes32(0x0), "Question was settled too soon and has not been reopened");
            // We only try one layer down rather than recursing to keep the gas costs predictable
            result = resultFor(replacement_id);
            require(result != UNRESOLVED_ANSWER, "Question replacement was settled too soon and has not been reopened");
        }
        return result;
    }

    /// @notice Asks a new question reopening a previously-asked question that was settled too soon
    /// @dev A special version of askQuestion() that replaces a previous question that was settled too soon
    /// @param template_id The ID number of the template the question will use
    /// @param question A string containing the parameters that will be passed into the template to make the question
    /// @param arbitrator The arbitration contract that will have the final word on the answer if there is a dispute
    /// @param timeout How long the contract should wait after the answer is changed before finalizing on that answer
    /// @param opening_ts If set, the earliest time it should be possible to answer the question.
    /// @param nonce A user-specified nonce used in the question ID. Change it to repeat a question.
    /// @param min_bond The minimum bond that can be used to provide the first answer.
    /// @param reopens_question_id The ID of the question this reopens
    /// @return The ID of the newly-created question, created deterministically.
    function reopenQuestion(uint256 template_id, string memory question, address arbitrator, uint32 timeout, uint32 opening_ts, uint256 nonce, uint256 min_bond, bytes32 reopens_question_id)
        // stateNotCreated is enforced by the internal _askQuestion
    public payable returns (bytes32) {

        require(isSettledTooSoon(reopens_question_id), "You can only reopen questions that resolved as settled too soon");

        bytes32 content_hash = keccak256(abi.encodePacked(template_id, opening_ts, question));

        // A reopening must exactly match the original question, except for the nonce and the creator
        require(content_hash == questions[reopens_question_id].content_hash, "content hash mismatch");
        require(arbitrator == questions[reopens_question_id].arbitrator, "arbitrator mismatch");
        require(timeout == questions[reopens_question_id].timeout, "timeout mismatch");
        require(opening_ts == questions[reopens_question_id].opening_ts , "opening_ts mismatch");
        require(min_bond == questions[reopens_question_id].min_bond, "min_bond mismatch");

        // If the the question was itself reopening some previous question, you'll have to re-reopen the previous question first.
        // This ensures the bounty can be passed on to the next attempt of the original question.
        require(!reopener_questions[reopens_question_id], "Question is already reopening a previous question");

        // A question can only be reopened once, unless the reopening was also settled too soon in which case it can be replaced
        bytes32 existing_reopen_question_id = reopened_questions[reopens_question_id];

        // Normally when we reopen a question we will take its bounty and pass it on to the reopened version.
        bytes32 take_bounty_from_question_id = reopens_question_id;
        // If the question has already been reopened but was again settled too soon, we can transfer its bounty to the next attempt.
        if (existing_reopen_question_id != bytes32(0)) {
            require(isSettledTooSoon(existing_reopen_question_id), "Question has already been reopened");
            // We'll overwrite the reopening with our new question and move the bounty.
            // Once that's done we'll detach the failed reopener and you'll be able to reopen that too if you really want, but without the bounty.
            reopener_questions[existing_reopen_question_id] = false;
            take_bounty_from_question_id = existing_reopen_question_id;
        }

        bytes32 question_id = askQuestionWithMinBond(template_id, question, arbitrator, timeout, opening_ts, nonce, min_bond);

        reopened_questions[reopens_question_id] = question_id;
        reopener_questions[question_id] = true;

        questions[question_id].bounty = questions[take_bounty_from_question_id].bounty + questions[question_id].bounty;
        questions[take_bounty_from_question_id].bounty = 0;

        emit LogReopenQuestion(question_id, reopens_question_id);

        return question_id;
    }

    /// @notice Return the final answer to the specified question, provided it matches the specified criteria.
    /// @dev Reverts if the question is not finalized, or if it does not match the specified criteria.
    /// @param question_id The ID of the question
    /// @param content_hash The hash of the question content (template ID + opening time + question parameter string)
    /// @param arbitrator The arbitrator chosen for the question (regardless of whether they are asked to arbitrate)
    /// @param min_timeout The timeout set in the initial question settings must be this high or higher
    /// @param min_bond The bond sent with the final answer must be this high or higher
    /// @return The answer formatted as a bytes32
    function getFinalAnswerIfMatches(
        bytes32 question_id, 
        bytes32 content_hash, address arbitrator, uint32 min_timeout, uint256 min_bond
    ) 
        stateFinalized(question_id)
    external view returns (bytes32) {
        require(content_hash == questions[question_id].content_hash, "content hash must match");
        require(arbitrator == questions[question_id].arbitrator, "arbitrator must match");
        require(min_timeout <= questions[question_id].timeout, "timeout must be long enough");
        require(min_bond <= questions[question_id].bond, "bond must be high enough");
        return questions[question_id].best_answer;
    }

    /// @notice Assigns the winnings (bounty and bonds) to everyone who gave the accepted answer
    /// Caller must provide the answer history, in reverse order
    /// @dev Works up the chain and assign bonds to the person who gave the right answer
    /// If someone gave the winning answer earlier, they must get paid from the higher bond
    /// That means we can't pay out the bond added at n until we have looked at n-1
    /// The first answer is authenticated by checking against the stored history_hash.
    /// One of the inputs to history_hash is the history_hash before it, so we use that to authenticate the next entry, etc
    /// Once we get to a null hash we'll know we're done and there are no more answers.
    /// Usually you would call the whole thing in a single transaction, but if not then the data is persisted to pick up later.
    /// @param question_id The ID of the question
    /// @param history_hashes Second-last-to-first, the hash of each history entry. (Final one should be empty).
    /// @param addrs Last-to-first, the address of each answerer or commitment sender
    /// @param bonds Last-to-first, the bond supplied with each answer or commitment
    /// @param answers Last-to-first, each answer supplied, or commitment ID if the answer was supplied with commit->reveal
    function claimWinnings(
        bytes32 question_id, 
        bytes32[] memory history_hashes, address[] memory addrs, uint256[] memory bonds, bytes32[] memory answers
    ) 
        stateFinalized(question_id)
    public {

        require(history_hashes.length > 0, "at least one history hash entry must be provided");

        // These are only set if we split our claim over multiple transactions.
        address payee = question_claims[question_id].payee; 
        uint256 last_bond = question_claims[question_id].last_bond; 
        uint256 queued_funds = question_claims[question_id].queued_funds; 

        // Starts as the hash of the final answer submitted. It'll be cleared when we're done.
        // If we're splitting the claim over multiple transactions, it'll be the hash where we left off last time
        bytes32 last_history_hash = questions[question_id].history_hash;

        bytes32 best_answer = questions[question_id].best_answer;

        uint256 i;
        for (i = 0; i < history_hashes.length; i++) {
        
            // Check input against the history hash, and see which of 2 possible values of is_commitment fits.
            bool is_commitment = _verifyHistoryInputOrRevert(last_history_hash, history_hashes[i], answers[i], bonds[i], addrs[i]);
            
            queued_funds = queued_funds + last_bond; 
            (queued_funds, payee) = _processHistoryItem(
                question_id, best_answer, queued_funds, payee, 
                addrs[i], bonds[i], answers[i], is_commitment);
 
            // Line the bond up for next time, when it will be added to somebody's queued_funds
            last_bond = bonds[i];

            // Burn (just leave in contract balance) a fraction of all bonds except the final one.
            // This creates a cost to increasing your own bond, which could be used to delay resolution maliciously
            if (last_bond != questions[question_id].bond) {
                last_bond = last_bond - last_bond / BOND_CLAIM_FEE_PROPORTION;
            }

            last_history_hash = history_hashes[i];

        }
 
        if (last_history_hash != NULL_HASH) {
            // We haven't yet got to the null hash (1st answer), ie the caller didn't supply the full answer chain.
            // Persist the details so we can pick up later where we left off later.

            // If we know who to pay we can go ahead and pay them out, only keeping back last_bond
            // (We always know who to pay unless all we saw were unrevealed commits)
            if (payee != NULL_ADDRESS) {
                _payPayee(question_id, payee, queued_funds);
                queued_funds = 0;
            }

            question_claims[question_id].payee = payee;
            question_claims[question_id].last_bond = last_bond;
            question_claims[question_id].queued_funds = queued_funds;
        } else {
            // There is nothing left below us so the payee can keep what remains
            _payPayee(question_id, payee, queued_funds + last_bond);
            delete question_claims[question_id];
        }

        questions[question_id].history_hash = last_history_hash;

    }

    function _payPayee(bytes32 question_id, address payee, uint256 value) 
    internal {
        balanceOf[payee] = balanceOf[payee] + value;
        emit LogClaim(question_id, payee, value);
    }

    function _verifyHistoryInputOrRevert(
        bytes32 last_history_hash,
        bytes32 history_hash, bytes32 answer, uint256 bond, address addr
    )
    internal pure returns (bool) {
        if (last_history_hash == keccak256(abi.encodePacked(history_hash, answer, bond, addr, true)) ) {
            return true;
        }
        if (last_history_hash == keccak256(abi.encodePacked(history_hash, answer, bond, addr, false)) ) {
            return false;
        } 
        revert("History input provided did not match the expected hash");
    }

    function _processHistoryItem(
        bytes32 question_id, bytes32 best_answer, 
        uint256 queued_funds, address payee, 
        address addr, uint256 bond, bytes32 answer, bool is_commitment
    )
    internal returns (uint256, address) {

        // For commit-and-reveal, the answer history holds the commitment ID instead of the answer.
        // We look at the referenced commitment ID and switch in the actual answer.
        if (is_commitment) {
            bytes32 commitment_id = answer;
            // If it's a commit but it hasn't been revealed, it will always be considered wrong.
            if (!commitments[commitment_id].is_revealed) {
                delete commitments[commitment_id];
                return (queued_funds, payee);
            } else {
                answer = commitments[commitment_id].revealed_answer;
                delete commitments[commitment_id];
            }
        }

        if (answer == best_answer) {

            if (payee == NULL_ADDRESS) {

                // The entry is for the first payee we come to, ie the winner.
                // They get the question bounty.
                payee = addr;

                if (best_answer != UNRESOLVED_ANSWER && questions[question_id].bounty > 0) {
                    _payPayee(question_id, payee, questions[question_id].bounty);
                    questions[question_id].bounty = 0;
                }

            } else if (addr != payee) {

                // Answerer has changed, ie we found someone lower down who needs to be paid

                // The lower answerer will take over receiving bonds from higher answerer.
                // They should also be paid the takeover fee, which is set at a rate equivalent to their bond. 
                // (This is our arbitrary rule, to give consistent right-answerers a defence against high-rollers.)

                // There should be enough for the fee, but if not, take what we have.
                // There's an edge case involving weird arbitrator behaviour where we may be short.
                uint256 answer_takeover_fee = (queued_funds >= bond) ? bond : queued_funds;
                // Settle up with the old (higher-bonded) payee
                _payPayee(question_id, payee, queued_funds - answer_takeover_fee);

                // Now start queued_funds again for the new (lower-bonded) payee
                payee = addr;
                queued_funds = answer_takeover_fee;

            }

        }

        return (queued_funds, payee);

    }

    /// @notice Convenience function to assign bounties/bonds for multiple questions in one go, then withdraw all your funds.
    /// Caller must provide the answer history for each question, in reverse order
    /// @dev Can be called by anyone to assign bonds/bounties, but funds are only withdrawn for the user making the call.
    /// @param question_ids The IDs of the questions you want to claim for
    /// @param lengths The number of history entries you will supply for each question ID
    /// @param hist_hashes In a single list for all supplied questions, the hash of each history entry.
    /// @param addrs In a single list for all supplied questions, the address of each answerer or commitment sender
    /// @param bonds In a single list for all supplied questions, the bond supplied with each answer or commitment
    /// @param answers In a single list for all supplied questions, each answer supplied, or commitment ID 
    function claimMultipleAndWithdrawBalance(
        bytes32[] memory question_ids, uint256[] memory lengths, 
        bytes32[] memory hist_hashes, address[] memory addrs, uint256[] memory bonds, bytes32[] memory answers
    ) 
        stateAny() // The finalization checks are done in the claimWinnings function
    public {
        
        uint256 qi;
        uint256 i;
        for (qi = 0; qi < question_ids.length; qi++) {
            bytes32 qid = question_ids[qi];
            uint256 ln = lengths[qi];
            bytes32[] memory hh = new bytes32[](ln);
            address[] memory ad = new address[](ln);
            uint256[] memory bo = new uint256[](ln);
            bytes32[] memory an = new bytes32[](ln);
            uint256 j;
            for (j = 0; j < ln; j++) {
                hh[j] = hist_hashes[i];
                ad[j] = addrs[i];
                bo[j] = bonds[i];
                an[j] = answers[i];
                i++;
            }
            claimWinnings(qid, hh, ad, bo, an);
        }
        withdraw();
    }

    /// @notice Returns the questions's content hash, identifying the question content
    /// @param question_id The ID of the question 
    function getContentHash(bytes32 question_id) 
    public view returns(bytes32) {
        return questions[question_id].content_hash;
    }

    /// @notice Returns the arbitrator address for the question
    /// @param question_id The ID of the question 
    function getArbitrator(bytes32 question_id) 
    public view returns(address) {
        return questions[question_id].arbitrator;
    }

    /// @notice Returns the timestamp when the question can first be answered
    /// @param question_id The ID of the question 
    function getOpeningTS(bytes32 question_id) 
    public view returns(uint32) {
        return questions[question_id].opening_ts;
    }

    /// @notice Returns the timeout in seconds used after each answer
    /// @param question_id The ID of the question 
    function getTimeout(bytes32 question_id) 
    public view returns(uint32) {
        return questions[question_id].timeout;
    }

    /// @notice Returns the timestamp at which the question will be/was finalized
    /// @param question_id The ID of the question 
    function getFinalizeTS(bytes32 question_id) 
    public view returns(uint32) {
        return questions[question_id].finalize_ts;
    }

    /// @notice Returns whether the question is pending arbitration
    /// @param question_id The ID of the question 
    function isPendingArbitration(bytes32 question_id) 
    public view returns(bool) {
        return questions[question_id].is_pending_arbitration;
    }

    /// @notice Returns the current total unclaimed bounty
    /// @dev Set back to zero once the bounty has been claimed
    /// @param question_id The ID of the question 
    function getBounty(bytes32 question_id) 
    public view returns(uint256) {
        return questions[question_id].bounty;
    }

    /// @notice Returns the current best answer
    /// @param question_id The ID of the question 
    function getBestAnswer(bytes32 question_id) 
    public view returns(bytes32) {
        return questions[question_id].best_answer;
    }

    /// @notice Returns the history hash of the question 
    /// @param question_id The ID of the question 
    /// @dev Updated on each answer, then rewound as each is claimed
    function getHistoryHash(bytes32 question_id) 
    public view returns(bytes32) {
        return questions[question_id].history_hash;
    }

    /// @notice Returns the highest bond posted so far for a question
    /// @param question_id The ID of the question 
    function getBond(bytes32 question_id) 
    public view returns(uint256) {
        return questions[question_id].bond;
    }

    /// @notice Returns the minimum bond that can answer the question
    /// @param question_id The ID of the question
    function getMinBond(bytes32 question_id)
    public view returns(uint256) {
        return questions[question_id].min_bond;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"bytes32","name":"answer_hash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"answer","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"}],"name":"LogAnswerReveal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"LogCancelArbitration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"answer","type":"bytes32"}],"name":"LogFinalize","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"bounty_added","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bounty","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"LogFundAnswerBounty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"min_bond","type":"uint256"}],"name":"LogMinimumBond","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"answer","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"history_hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"bond","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"},{"indexed":false,"internalType":"bool","name":"is_commitment","type":"bool"}],"name":"LogNewAnswer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"template_id","type":"uint256"},{"indexed":false,"internalType":"string","name":"question","type":"string"},{"indexed":true,"internalType":"bytes32","name":"content_hash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"arbitrator","type":"address"},{"indexed":false,"internalType":"uint32","name":"timeout","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"opening_ts","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"created","type":"uint256"}],"name":"LogNewQuestion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"template_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"string","name":"question_text","type":"string"}],"name":"LogNewTemplate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"LogNotifyOfArbitrationRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"question_id","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"reopened_question_id","type":"bytes32"}],"name":"LogReopenQuestion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"arbitrator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSetQuestionFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogWithdraw","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"arbitrator_question_fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"template_id","type":"uint256"},{"internalType":"string","name":"question","type":"string"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"timeout","type":"uint32"},{"internalType":"uint32","name":"opening_ts","type":"uint32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"askQuestion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"template_id","type":"uint256"},{"internalType":"string","name":"question","type":"string"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"timeout","type":"uint32"},{"internalType":"uint32","name":"opening_ts","type":"uint32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"min_bond","type":"uint256"}],"name":"askQuestionWithMinBond","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"address","name":"payee_if_wrong","type":"address"},{"internalType":"bytes32","name":"last_history_hash","type":"bytes32"},{"internalType":"bytes32","name":"last_answer_or_commitment_id","type":"bytes32"},{"internalType":"address","name":"last_answerer","type":"address"}],"name":"assignWinnerAndSubmitAnswerByArbitrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"cancelArbitration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"question_ids","type":"bytes32[]"},{"internalType":"uint256[]","name":"lengths","type":"uint256[]"},{"internalType":"bytes32[]","name":"hist_hashes","type":"bytes32[]"},{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"bonds","type":"uint256[]"},{"internalType":"bytes32[]","name":"answers","type":"bytes32[]"}],"name":"claimMultipleAndWithdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32[]","name":"history_hashes","type":"bytes32[]"},{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"bonds","type":"uint256[]"},{"internalType":"bytes32[]","name":"answers","type":"bytes32[]"}],"name":"claimWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"commitments","outputs":[{"internalType":"uint32","name":"reveal_ts","type":"uint32"},{"internalType":"bool","name":"is_revealed","type":"bool"},{"internalType":"bytes32","name":"revealed_answer","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"content","type":"string"}],"name":"createTemplate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"content","type":"string"},{"internalType":"string","name":"question","type":"string"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"timeout","type":"uint32"},{"internalType":"uint32","name":"opening_ts","type":"uint32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"createTemplateAndAskQuestion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"fundAnswerBounty","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getArbitrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getBestAnswer","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getBounty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getContentHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getFinalAnswer","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"content_hash","type":"bytes32"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"min_timeout","type":"uint32"},{"internalType":"uint256","name":"min_bond","type":"uint256"}],"name":"getFinalAnswerIfMatches","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getFinalizeTS","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getHistoryHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getMinBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getOpeningTS","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"getTimeout","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"isPendingArbitration","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"isSettledTooSoon","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"address","name":"requester","type":"address"},{"internalType":"uint256","name":"max_previous","type":"uint256"}],"name":"notifyOfArbitrationRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"question_claims","outputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"uint256","name":"last_bond","type":"uint256"},{"internalType":"uint256","name":"queued_funds","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"questions","outputs":[{"internalType":"bytes32","name":"content_hash","type":"bytes32"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"opening_ts","type":"uint32"},{"internalType":"uint32","name":"timeout","type":"uint32"},{"internalType":"uint32","name":"finalize_ts","type":"uint32"},{"internalType":"bool","name":"is_pending_arbitration","type":"bool"},{"internalType":"uint256","name":"bounty","type":"uint256"},{"internalType":"bytes32","name":"best_answer","type":"bytes32"},{"internalType":"bytes32","name":"history_hash","type":"bytes32"},{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"min_bond","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"template_id","type":"uint256"},{"internalType":"string","name":"question","type":"string"},{"internalType":"address","name":"arbitrator","type":"address"},{"internalType":"uint32","name":"timeout","type":"uint32"},{"internalType":"uint32","name":"opening_ts","type":"uint32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"min_bond","type":"uint256"},{"internalType":"bytes32","name":"reopens_question_id","type":"bytes32"}],"name":"reopenQuestion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"reopened_questions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"reopener_questions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"resultFor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"}],"name":"resultForOnceSettled","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setQuestionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"uint256","name":"max_previous","type":"uint256"}],"name":"submitAnswer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"address","name":"answerer","type":"address"}],"name":"submitAnswerByArbitrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer_hash","type":"bytes32"},{"internalType":"uint256","name":"max_previous","type":"uint256"},{"internalType":"address","name":"_answerer","type":"address"}],"name":"submitAnswerCommitment","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"uint256","name":"max_previous","type":"uint256"},{"internalType":"address","name":"answerer","type":"address"}],"name":"submitAnswerFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"question_id","type":"bytes32"},{"internalType":"bytes32","name":"answer","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"bond","type":"uint256"}],"name":"submitAnswerReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"template_hashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"templates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260006001553480156200001657600080fd5b506200003b6040518060600160405280603f8152602001620044a4603f9139620000d6565b50620000606040518060800160405280604f815260200162004580604f9139620000d6565b50620000856040518060800160405280605a815260200162004526605a9139620000d6565b50620000aa6040518060800160405280605c815260200162004448605c9139620000d6565b50620000cf604051806080016040528060438152602001620044e360439139620000d6565b5062000223565b600154600081815260026020908152604080832043905551919291620000ff9185910162000176565b60408051601f1981840301815282825280516020918201206000858152600390925291902055339082907fb87fb721c0a557bb8dff89a86796466931d82ba530a66a239263eb8735ade2e4906200015890879062000194565b60405180910390a36200016d816001620001c9565b60015592915050565b600082516200018a818460208701620001f0565b9190910192915050565b6020815260008251806020840152620001b5816040850160208701620001f0565b601f01601f19169190910160400192915050565b60008219821115620001eb57634e487b7160e01b600052601160045260246000fd5b500190565b60005b838110156200020d578181015183820152602001620001f3565b838111156200021d576000848401525b50505050565b61421580620002336000396000f3fe6080604052600436106102675760003560e01c80637f8d429e11610144578063ab5a4e35116100b6578063d44e293c1161007a578063d44e293c14610983578063d7cff986146109a3578063e83bfb58146109b6578063ebbdd2b0146109e6578063f6a94ecb14610a06578063fe92049d14610a2657600080fd5b8063ab5a4e35146108cc578063acae8f4e146108ec578063bc52565214610929578063c081d8a314610956578063d09cc57e146108ac57600080fd5b8063924532fb11610108578063924532fb146106e357806395addb90146107165780639e63fa6a1461080a5780639f1025c61461085c578063a1130d0414610899578063a462fb7b146108ac57600080fd5b80637f8d429e146105d857806382ffa9f7146105f8578063839df9451461062857806383bf4609146106925780638d552d46146106b257600080fd5b8063484c0714116101dd578063590158a7116101a1578063590158a7146104da57806359245ff3146105455780636fa427421461055857806370a0823114610585578063762c38fd146105b257806377f325df146105c557600080fd5b8063484c0714146104105780634dc266b4146104405780634df6ca2a146104605780634e60f8831461048057806351577ea9146104ad57600080fd5b80632417395c1161022f5780632417395c146103175780632518904c1461034757806326d6c97b1461039857806328828b1e146103c85780633ccfd60b146103e8578063484b93c4146103fd57600080fd5b806306c3b67a1461026c5780631101a0fd146102a1578063111ec138146102c35780631126a9dc146102d657806312a203c3146102f7575b600080fd5b34801561027857600080fd5b5061028c610287366004613780565b610a46565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc3660046137ce565b610a5b565b005b6102c16102d136600461398b565b610d60565b6102e96102e4366004613ba2565b610fc2565b604051908152602001610298565b34801561030357600080fd5b506102e9610312366004613911565b611408565b34801561032357600080fd5b506102e9610332366004613780565b60009081526004602052604090206003015490565b34801561035357600080fd5b50610380610362366004613780565b6000908152600460205260409020600101546001600160a01b031690565b6040516001600160a01b039091168152602001610298565b3480156103a457600080fd5b506102e96103b3366004613780565b60009081526004602052604090206006015490565b3480156103d457600080fd5b506102c16103e336600461368c565b6115e3565b3480156103f457600080fd5b506102c161189b565b6102e961040b366004613b17565b611915565b34801561041c57600080fd5b506102e961042b366004613780565b60009081526004602052604090206007015490565b34801561044c57600080fd5b506102c161045b3660046139ca565b611a36565b34801561046c57600080fd5b506102c161047b366004613780565b611d3c565b34801561048c57600080fd5b506102e961049b366004613780565b60036020526000908152604090205481565b3480156104b957600080fd5b506102e96104c8366004613780565b60009081526004602052604090205490565b3480156104e657600080fd5b506105206104f5366004613780565b6005602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b604080516001600160a01b039094168452602084019290925290820152606001610298565b6102c1610553366004613780565b611d8a565b34801561056457600080fd5b506102e9610573366004613671565b60076020526000908152604090205481565b34801561059157600080fd5b506102e96105a0366004613671565b60006020819052908152604090205481565b6102e96105c0366004613ad5565b611f1d565b6102c16105d336600461395f565b61203f565b3480156105e457600080fd5b5061028c6105f3366004613780565b61224a565b34801561060457600080fd5b506102e9610613366004613780565b60009081526004602052604090206005015490565b34801561063457600080fd5b50610670610643366004613780565b6006602052600090815260409020805460019091015463ffffffff821691640100000000900460ff169083565b6040805163ffffffff9094168452911515602084015290820152606001610298565b34801561069e57600080fd5b506102e96106ad3660046139fc565b6122a6565b3480156106be57600080fd5b506102e96106cd366004613780565b6000908152600460208190526040909120015490565b3480156106ef57600080fd5b5061028c6106fe366004613780565b60009081526004602052604090206002015460ff1690565b34801561072257600080fd5b506107a3610731366004613780565b60046020819052600091825260409091208054600182015460028301546003840154948401546005850154600686015460079096015494966001600160a01b0385169663ffffffff600160a01b8704811697600160c01b8804821697600160e01b90049091169560ff1694929391908b565b604080519b8c526001600160a01b03909a1660208c015263ffffffff988916998b019990995295871660608a015295909316608088015290151560a087015260c086015260e085015261010084019190915261012083015261014082015261016001610298565b34801561081657600080fd5b50610847610825366004613780565b600090815260046020526040902060010154600160a01b900463ffffffff1690565b60405163ffffffff9091168152602001610298565b34801561086857600080fd5b50610847610877366004613780565b600090815260046020526040902060010154600160c01b900463ffffffff1690565b6102e96108a7366004613a38565b612342565b3480156108b857600080fd5b506102e96108c7366004613780565b61235e565b3480156108d857600080fd5b506102e96108e7366004613780565b61239e565b3480156108f857600080fd5b50610847610907366004613780565b600090815260046020526040902060010154600160e01b900463ffffffff1690565b34801561093557600080fd5b506102e9610944366004613780565b60026020526000908152604090205481565b34801561096257600080fd5b506102e9610971366004613780565b60086020526000908152604090205481565b34801561098f57600080fd5b506102c161099e3660046138b9565b6124cf565b6102c16109b136600461398b565b6125e6565b3480156109c257600080fd5b5061028c6109d1366004613780565b60096020526000908152604090205460ff1681565b3480156109f257600080fd5b506102c1610a01366004613780565b612846565b348015610a1257600080fd5b506102c1610a21366004613799565b61294a565b348015610a3257600080fd5b506102c1610a41366004613884565b612bca565b6000600119610a548361235e565b1492915050565b84610a658161224a565b610a8a5760405162461bcd60e51b8152600401610a8190613f07565b60405180910390fd5b6000855111610af45760405162461bcd60e51b815260206004820152603060248201527f6174206c65617374206f6e6520686973746f7279206861736820656e7472792060448201526f1b5d5cdd081899481c1c9bdd9a59195960821b6064820152608401610a81565b6000868152600560208181526040808420805460018201546002909201546004948590529286209485015494909301546001600160a01b039093169490939192905b8a51811015610ca4576000610bb2848d8481518110610b5757610b576141b3565b60200260200101518b8581518110610b7157610b716141b3565b60200260200101518d8681518110610b8b57610b8b6141b3565b60200260200101518f8781518110610ba557610ba56141b3565b6020026020010151612d1c565b9050610bbe868661408f565b9450610c1b8d84878a8f8781518110610bd957610bd96141b3565b60200260200101518f8881518110610bf357610bf36141b3565b60200260200101518f8981518110610c0d57610c0d6141b3565b602002602001015188612e0c565b8098508196505050898281518110610c3557610c356141b3565b60200260200101519550600460008e8152602001908152602001600020600601548614610c7457610c676028876140cf565b610c719087614125565b95505b8b8281518110610c8657610c866141b3565b60200260200101519350508080610c9c9061416c565b915050610b36565b8215610d02576001600160a01b03861615610cc957610cc48c8786612f56565b600093505b60008c815260056020526040902080546001600160a01b0319166001600160a01b03881617815560018101869055600201849055610d3e565b610d168c87610d11888861408f565b612f56565b60008c815260056020526040812080546001600160a01b031916815560018101829055600201555b50506000998a5260046020526040909920600501989098555050505050505050565b6000848152600460205260409020600101548490600160c01b900463ffffffff16610d9d5760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff1615610dcf5760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580610e0657504263ffffffff168163ffffffff16115b610e225760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580610e5a57504263ffffffff168163ffffffff1611155b610e765760405162461bcd60e51b8152600401610a8190613e4f565b8660003411610e975760405162461bcd60e51b8152600401610a8190613f75565b60008181526004602052604090206006015480610ee457600082815260046020526040902060070154341015610edf5760405162461bcd60e51b8152600401610a8190613d5d565b610f0e565b610eef816002614106565b341015610f0e5760405162461bcd60e51b8152600401610a8190613ebd565b88878015610f4757600082815260046020526040902060060154811015610f475760405162461bcd60e51b8152600401610a8190613f3e565b6001600160a01b038816610f9d5760405162461bcd60e51b815260206004820152601960248201527f616e737765726572206d757374206265206e6f6e2d7a65726f000000000000006044820152606401610a81565b610fab8b8b8a346000612fd0565b610fb58b8b6130a8565b5050505050505050505050565b6000610fcd82610a46565b61103f5760405162461bcd60e51b815260206004820152603f60248201527f596f752063616e206f6e6c792072656f70656e207175657374696f6e7320746860448201527f6174207265736f6c76656420617320736574746c656420746f6f20736f6f6e006064820152608401610a81565b600089868a60405160200161105693929190613d11565b60408051601f1981840301815291815281516020928301206000868152600490935291205490915081146110c45760405162461bcd60e51b81526020600482015260156024820152740c6dedce8cadce840d0c2e6d040dad2e6dac2e8c6d605b1b6044820152606401610a81565b6000838152600460205260409020600101546001600160a01b038981169116146111265760405162461bcd60e51b81526020600482015260136024820152720c2e4c4d2e8e4c2e8dee440dad2e6dac2e8c6d606b1b6044820152606401610a81565b60008381526004602052604090206001015463ffffffff888116600160c01b90920416146111895760405162461bcd60e51b815260206004820152601060248201526f0e8d2dacadeeae840dad2e6dac2e8c6d60831b6044820152606401610a81565b60008381526004602052604090206001015463ffffffff878116600160a01b90920416146111ef5760405162461bcd60e51b81526020600482015260136024820152720dee0cadcd2dccebee8e640dad2e6dac2e8c6d606b1b6044820152606401610a81565b60008381526004602052604090206007015484146112435760405162461bcd60e51b81526020600482015260116024820152700dad2dcbec4dedcc840dad2e6dac2e8c6d607b1b6044820152606401610a81565b60008381526009602052604090205460ff16156112bc5760405162461bcd60e51b815260206004820152603160248201527f5175657374696f6e20697320616c72656164792072656f70656e696e67206120604482015270383932bb34b7bab99038bab2b9ba34b7b760791b6064820152608401610a81565b60008381526008602052604090205483811561134b576112db82610a46565b6113325760405162461bcd60e51b815260206004820152602260248201527f5175657374696f6e2068617320616c7265616479206265656e2072656f70656e604482015261195960f21b6064820152608401610a81565b506000818152600960205260409020805460ff19169055805b600061135c8d8d8d8d8d8d8d611915565b600087815260086020908152604080832084905583835260098252808320805460ff19166001179055600490915280822060039081015486845291909220909101549192506113aa9161408f565b6000828152600460205260408082206003908101939093558482528082209092018190559051879183917f32e7d5617fb1be6bd0e7c3974d438d4514c4cf349e9330691d8abf6f6fd431219190a39c9b505050505050505050505050565b6000856114148161224a565b6114305760405162461bcd60e51b8152600401610a8190613f07565b600087815260046020526040902054861461148d5760405162461bcd60e51b815260206004820152601760248201527f636f6e74656e742068617368206d757374206d617463680000000000000000006044820152606401610a81565b6000878152600460205260409020600101546001600160a01b038681169116146114f15760405162461bcd60e51b81526020600482015260156024820152740c2e4c4d2e8e4c2e8dee440daeae6e840dac2e8c6d605b1b6044820152606401610a81565b60008781526004602052604090206001015463ffffffff600160c01b909104811690851611156115635760405162461bcd60e51b815260206004820152601b60248201527f74696d656f7574206d757374206265206c6f6e6720656e6f75676800000000006044820152606401610a81565b6000878152600460205260409020600601548311156115c45760405162461bcd60e51b815260206004820152601860248201527f626f6e64206d757374206265206869676820656e6f75676800000000000000006044820152606401610a81565b6000878152600460208190526040909120015491505095945050505050565b6000805b8751821015611889576000888381518110611604576116046141b3565b602002602001015190506000888481518110611622576116226141b3565b602002602001015190506000816001600160401b03811115611646576116466141c9565b60405190808252806020026020018201604052801561166f578160200160208202803683370190505b5090506000826001600160401b0381111561168c5761168c6141c9565b6040519080825280602002602001820160405280156116b5578160200160208202803683370190505b5090506000836001600160401b038111156116d2576116d26141c9565b6040519080825280602002602001820160405280156116fb578160200160208202803683370190505b5090506000846001600160401b03811115611718576117186141c9565b604051908082528060200260200182016040528015611741578160200160208202803683370190505b50905060005b85811015611862578c8881518110611761576117616141b3565b602002602001015185828151811061177b5761177b6141b3565b6020026020010181815250508b8881518110611799576117996141b3565b60200260200101518482815181106117b3576117b36141b3565b60200260200101906001600160a01b031690816001600160a01b0316815250508a88815181106117e5576117e56141b3565b60200260200101518382815181106117ff576117ff6141b3565b60200260200101818152505089888151811061181d5761181d6141b3565b6020026020010151828281518110611837576118376141b3565b60209081029190910101528761184c8161416c565b985050808061185a9061416c565b915050611747565b61186f8786868686610a5b565b5050505050505081806118819061416c565b9250506115e7565b61189161189b565b5050505050505050565b33600081815260208190526040808220805490839055905190929183156108fc02918491818181858888f193505050501580156118dc573d6000803e3d6000fd5b5060405181815233907f4ce7033d118120e254016dccf195288400b28fc8936425acd5f17ce2df3ab7089060200160405180910390a250565b6000878152600260205260408120546119665760405162461bcd60e51b81526020600482015260136024820152721d195b5c1b185d19481b5d5cdd08195e1a5cdd606a1b6044820152606401610a81565b600088858960405160200161197d93929190613d11565b60405160208183030381529060405280519060200120905060008188888630338a6040516020016119b49796959493929190613c61565b60405160208183030381529060405280519060200120905081336001600160a01b0316827ffe2dac156a3890636ce13f65f4fdf41dcaee11526e4a5374531572d92194796c8d8d8d8d8d8d42604051611a139796959493929190613fec565b60405180910390a4611a2981838a8a8a89613112565b9998505050505050505050565b6000848152600460205260409020600101548490600160c01b900463ffffffff16611a735760405162461bcd60e51b8152600401610a8190613dde565b600081815260046020526040902060010154600160e01b900463ffffffff16801580611aaa57504263ffffffff168163ffffffff16115b611b085760405162461bcd60e51b815260206004820152602960248201527f66696e616c697a6174696f6e206465616c696e65206d757374206e6f742068616044820152681d99481c185cdcd95960ba1b6064820152608401610a81565b600082815260046020526040902060010154600160a01b900463ffffffff16801580611b4057504263ffffffff168163ffffffff1611155b611b5c5760405162461bcd60e51b8152600401610a8190613e4f565b604080516020808201899052818301889052825180830384018152606083018452805190820120608083018b905260a0830181905260c08084018990528451808503909101815260e090930184528251928201929092206000818152600690925292902054909190640100000000900460ff1615611c2f5760405162461bcd60e51b815260206004820152602a60248201527f636f6d6d69746d656e74206d757374206e6f742068617665206265656e2072656044820152691d99585b1959081e595d60b21b6064820152608401610a81565b60008181526006602052604090205463ffffffff428116911611611ca15760405162461bcd60e51b8152602060048201526024808201527f72657665616c20646561646c696e65206d757374206e6f7420686176652070616044820152631cdcd95960e21b6064820152608401610a81565b6000818152600660208181526040808420600181018d9055805464ff0000000019166401000000001790558c845260049091529091200154861415611cea57611cea89896130a8565b6040805189815260208101899052908101879052829033908b907fa7b2d313bc7a062e30b2c3b811aa4c9faf09755a6b4ea3bf42deff920944332f9060600160405180910390a4505050505050505050565b33600081815260076020908152604091829020849055815192835282018390527fdca703d022171824d3d639b33c1525fd2338120b4cfb89507c0b59596893acda910160405180910390a150565b6000818152600460205260409020600101548190600160c01b900463ffffffff16611dc75760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff1615611df95760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580611e3057504263ffffffff168163ffffffff16115b611e4c5760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580611e8457504263ffffffff168163ffffffff1611155b611ea05760405162461bcd60e51b8152600401610a8190613e4f565b600084815260046020526040902060030154611ebd90349061408f565b6000858152600460205260409081902060030182905551339186917f54d68405b79f2aa4fd4e8db7b67844ad254cf8f208aac476c2894134a9deab6691611f0f91349190918252602082015260400190565b60405180910390a350505050565b600086815260026020526040812054611f6e5760405162461bcd60e51b81526020600482015260136024820152721d195b5c1b185d19481b5d5cdd08195e1a5cdd606a1b6044820152606401610a81565b6000878488604051602001611f8593929190613d11565b60405160208183030381529060405280519060200120905060008187876000303389604051602001611fbd9796959493929190613c61565b60405160208183030381529060405280519060200120905081336001600160a01b0316827ffe2dac156a3890636ce13f65f4fdf41dcaee11526e4a5374531572d92194796c8c8c8c8c8c8c4260405161201c9796959493929190613fec565b60405180910390a461203381838989896000613112565b98975050505050505050565b6000838152600460205260409020600101548390600160c01b900463ffffffff1661207c5760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156120ae5760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff168015806120e557504263ffffffff168163ffffffff16115b6121015760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff1680158061213957504263ffffffff168163ffffffff1611155b6121555760405162461bcd60e51b8152600401610a8190613e4f565b85600034116121765760405162461bcd60e51b8152600401610a8190613f75565b600081815260046020526040902060060154806121c3576000828152600460205260409020600701543410156121be5760405162461bcd60e51b8152600401610a8190613d5d565b6121ed565b6121ce816002614106565b3410156121ed5760405162461bcd60e51b8152600401610a8190613ebd565b87868015612226576000828152600460205260409020600601548110156122265760405162461bcd60e51b8152600401610a8190613f3e565b6122348a8a33346000612fd0565b61223e8a8a6130a8565b50505050505050505050565b60008181526004602052604081206001810154600290910154600160e01b90910463ffffffff169060ff16158015612287575063ffffffff811615155b801561229f57504263ffffffff168163ffffffff1611155b9392505050565b6001546000818152600260209081526040808320439055519192916122cd91859101613cf5565b60408051601f1981840301815282825280516020918201206000858152600390925291902055339082907fb87fb721c0a557bb8dff89a86796466931d82ba530a66a239263eb8735ade2e490612324908790613d4a565b60405180910390a361233781600161408f565b60015590505b919050565b60008061234e886122a6565b9050612033818888888888611f1d565b60008161236a8161224a565b6123865760405162461bcd60e51b8152600401610a8190613f07565b50506000908152600460208190526040909120015490565b6000806123aa8361235e565b90506001198114156124c957600083815260086020526040902054806124385760405162461bcd60e51b815260206004820152603760248201527f5175657374696f6e2077617320736574746c656420746f6f20736f6f6e20616e60448201527f6420686173206e6f74206265656e2072656f70656e65640000000000000000006064820152608401610a81565b6124418161235e565b91506001198214156124c75760405162461bcd60e51b815260206004820152604360248201527f5175657374696f6e207265706c6163656d656e742077617320736574746c656460448201527f20746f6f20736f6f6e20616e6420686173206e6f74206265656e2072656f70656064820152621b995960ea1b608482015260a401610a81565b505b92915050565b600086815260046020526040812060058101546006909101546124f791908690869086612d1c565b9050600081801561251f5750600084815260066020526040902054640100000000900460ff16155b156125b75760008481526006602052604090205463ffffffff4281169116106125b05760405162461bcd60e51b815260206004820152603760248201527f596f75206d757374207761697420666f72207468652072657665616c2064656160448201527f646c696e65206265666f72652066696e616c697a696e670000000000000000006064820152608401610a81565b50846125db565b6000888152600460208190526040909120015487146125d657856125d8565b825b90505b611891888883612bca565b6000848152600460205260409020600101548490600160c01b900463ffffffff166126235760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156126555760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff1680158061268c57504263ffffffff168163ffffffff16115b6126a85760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff168015806126e057504263ffffffff168163ffffffff1611155b6126fc5760405162461bcd60e51b8152600401610a8190613e4f565b866000341161271d5760405162461bcd60e51b8152600401610a8190613f75565b6000818152600460205260409020600601548061276a576000828152600460205260409020600701543410156127655760405162461bcd60e51b8152600401610a8190613d5d565b612794565b612775816002614106565b3410156127945760405162461bcd60e51b8152600401610a8190613ebd565b888780156127cd576000828152600460205260409020600601548110156127cd5760405162461bcd60e51b8152600401610a8190613f3e565b60408051602081018d90529081018b905234606082015260009060800160408051601f198184030181529190528051602090910120905060006001600160a01b038a161561281b578961281d565b335b90506128298d83613430565b6128378d8383346001612fd0565b50505050505050505050505050565b60008181526004602052604090206001015481906001600160a01b031633146128815760405162461bcd60e51b8152600401610a8190613e86565b600082815260046020526040902060020154829060ff166128b45760405162461bcd60e51b8152600401610a8190613e0b565b600083815260046020526040902060028101805460ff19169055600101546128e990600160c01b900463ffffffff16426140a7565b600084815260046020526040808220600101805463ffffffff94909416600160e01b026001600160e01b0390941693909317909255905184917f71bf7c2b9df0b8818e7eb6746a5bf69699ebbab041f3795f9ed58e469afa9a3a91a2505050565b60008381526004602052604090206001015483906001600160a01b031633146129855760405162461bcd60e51b8152600401610a8190613e86565b6000848152600460205260409020600101548490600160c01b900463ffffffff166129c25760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156129f45760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580612a2b57504263ffffffff168163ffffffff16115b612a475760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580612a7f57504263ffffffff168163ffffffff1611155b612a9b5760405162461bcd60e51b8152600401610a8190613e4f565b86858015612ad457600082815260046020526040902060060154811015612ad45760405162461bcd60e51b8152600401610a8190613f3e565b600089815260046020526040902060010154600160e01b900463ffffffff16612b705760405162461bcd60e51b815260206004820152604260248201527f5175657374696f6e206d75737420616c7265616479206861766520616e20616e60448201527f73776572207768656e206172626974726174696f6e2069732072657175657374606482015261195960f21b608482015260a401610a81565b600089815260046020526040808220600201805460ff19166001179055516001600160a01b038a16918b917f75d7939999bc902187c4aed400872883e445145f1983539166f783fa040b47629190a3505050505050505050565b60008381526004602052604090206001015483906001600160a01b03163314612c055760405162461bcd60e51b8152600401610a8190613e86565b600084815260046020526040902060020154849060ff16612c385760405162461bcd60e51b8152600401610a8190613e0b565b6001600160a01b038316612c8e5760405162461bcd60e51b815260206004820152601960248201527f616e737765726572206d7573742062652070726f7669646564000000000000006044820152606401610a81565b604051849086907f18d760beffe3717270cd90d9d920ec1a48c194e9ad7bba23eb1c92d3eb974f9790600090a36000858152600460205260408120600201805460ff19169055612ce49086908690869080612fd0565b50505060009182526004602081905260409092209182015560010180546001600160e01b0316600160e01b4263ffffffff1602179055565b6000848484846001604051602001612d38959493929190613cba565b60405160208183030381529060405280519060200120861415612d5d57506001612e03565b848484846000604051602001612d77959493929190613cba565b60405160208183030381529060405280519060200120861415612d9c57506000612e03565b60405162461bcd60e51b815260206004820152603660248201527f486973746f727920696e7075742070726f766964656420646964206e6f74206d6044820152750c2e8c6d040e8d0ca40caf0e0cac6e8cac840d0c2e6d60531b6064820152608401610a81565b95945050505050565b6000808215612e85576000848152600660205260409020548490640100000000900460ff16612e5d576000908152600660205260408120805464ffffffffff19168155600101555086905085612f49565b6000908152600660205260408120600181018054825464ffffffffff19169092559190915593505b88841415612f43576001600160a01b038716612eff5785965060011960001b8914158015612ec3575060008a81526004602052604090206003015415155b15612efa5760008a815260046020526040902060030154612ee7908b908990612f56565b60008a8152600460205260408120600301555b612f43565b866001600160a01b0316866001600160a01b031614612f4357600085891015612f285788612f2a565b855b9050612f3b8b89610d11848d614125565b869750809850505b50869050855b9850989650505050505050565b6001600160a01b038216600090815260208190526040902054612f7a90829061408f565b6001600160a01b038316600081815260208181526040918290209390935551838152909185917f9c121aff33b50c1a53fef034ebec5f83da2d5a5187048f9c76c397ba27c1a1a6910160405180910390a3505050565b6000858152600460209081526040808320600501549051612ff992889187918991889101613cba565b604051602081830303815290604052805190602001209050600083111561302f5760008681526004602052604090206006018390555b600086815260046020908152604091829020600501839055815187815290810183905290810184905242606082015282151560808201526001600160a01b0385169087907fe47ca4ebbbc2990134d1168821f38c5e177f3d5ee564bffeadeaa351905e62219060a00160405180910390a3505050505050565b6000828152600460208190526040909120908101829055600101546130da90600160c01b900463ffffffff16426140a7565b600092835260046020526040909220600101805463ffffffff93909316600160e01b026001600160e01b039093169290921790915550565b6000868152600460205260409020600101548690600160c01b900463ffffffff16156131805760405162461bcd60e51b815260206004820152601760248201527f7175657374696f6e206d757374206e6f742065786973740000000000000000006044820152606401610a81565b60008463ffffffff16116131d65760405162461bcd60e51b815260206004820152601860248201527f74696d656f7574206d75737420626520706f73697469766500000000000000006044820152606401610a81565b6301e133808463ffffffff161061323a5760405162461bcd60e51b815260206004820152602260248201527f74696d656f7574206d757374206265206c657373207468616e20333635206461604482015261797360f01b6064820152608401610a81565b346001600160a01b0386161580159061325c5750336001600160a01b03871614155b15613322576001600160a01b038616600090815260076020526040902054808210156132d65760405162461bcd60e51b8152602060048201526024808201527f4554482070726f7669646564206d75737420636f766572207175657374696f6e6044820152632066656560e01b6064820152608401610a81565b6132e08183614125565b6001600160a01b03881660009081526020819052604090205490925061330790829061408f565b6001600160a01b038816600090815260208190526040902055505b6000888152600460205260409020878155600101805463ffffffff878116600160c01b0263ffffffff60c01b19918816600160a01b026001600160c01b03199093166001600160a01b038b1617929092171617905580156133d057600088815260046020908152604091829020600301839055815183815290810183905233918a917f54d68405b79f2aa4fd4e8db7b67844ad254cf8f208aac476c2894134a9deab66910160405180910390a35b821561189157600088815260046020526040908190206007018490555188907f9641ca9d53af3bead658ffcc6c7d8c35e7dae9938367bd8eb45bee35d5c625049061341e9086815260200190565b60405180910390a25050505050505050565b60008181526006602052604090205463ffffffff161561349c5760405162461bcd60e51b815260206004820152602160248201527f636f6d6d69746d656e74206d757374206e6f7420616c726561647920657869736044820152601d60fa1b6064820152608401610a81565b6000828152600460205260408120600101546134c790600890600160c01b900463ffffffff166140e3565b90506134d381426140a7565b600092835260066020526040909220805463ffffffff191663ffffffff909316929092179091555050565b80356001600160a01b038116811461233d57600080fd5b600082601f83011261352657600080fd5b8135602061353b6135368361406c565b61403c565b80838252828201915082860187848660051b890101111561355b57600080fd5b60005b858110156135815761356f826134fe565b8452928401929084019060010161355e565b5090979650505050505050565b600082601f83011261359f57600080fd5b813560206135af6135368361406c565b80838252828201915082860187848660051b89010111156135cf57600080fd5b60005b85811015613581578135845292840192908401906001016135d2565b600082601f8301126135ff57600080fd5b81356001600160401b03811115613618576136186141c9565b61362b601f8201601f191660200161403c565b81815284602083860101111561364057600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff8116811461233d57600080fd5b60006020828403121561368357600080fd5b61229f826134fe565b60008060008060008060c087890312156136a557600080fd5b86356001600160401b03808211156136bc57600080fd5b6136c88a838b0161358e565b975060208901359150808211156136de57600080fd5b6136ea8a838b0161358e565b9650604089013591508082111561370057600080fd5b61370c8a838b0161358e565b9550606089013591508082111561372257600080fd5b61372e8a838b01613515565b9450608089013591508082111561374457600080fd5b6137508a838b0161358e565b935060a089013591508082111561376657600080fd5b5061377389828a0161358e565b9150509295509295509295565b60006020828403121561379257600080fd5b5035919050565b6000806000606084860312156137ae57600080fd5b833592506137be602085016134fe565b9150604084013590509250925092565b600080600080600060a086880312156137e657600080fd5b8535945060208601356001600160401b038082111561380457600080fd5b61381089838a0161358e565b9550604088013591508082111561382657600080fd5b61383289838a01613515565b9450606088013591508082111561384857600080fd5b61385489838a0161358e565b9350608088013591508082111561386a57600080fd5b506138778882890161358e565b9150509295509295909350565b60008060006060848603121561389957600080fd5b83359250602084013591506138b0604085016134fe565b90509250925092565b60008060008060008060c087890312156138d257600080fd5b86359550602087013594506138e9604088016134fe565b9350606087013592506080870135915061390560a088016134fe565b90509295509295509295565b600080600080600060a0868803121561392957600080fd5b8535945060208601359350613940604087016134fe565b925061394e6060870161365d565b949793965091946080013592915050565b60008060006060848603121561397457600080fd5b505081359360208301359350604090920135919050565b600080600080608085870312156139a157600080fd5b8435935060208501359250604085013591506139bf606086016134fe565b905092959194509250565b600080600080608085870312156139e057600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215613a0e57600080fd5b81356001600160401b03811115613a2457600080fd5b613a30848285016135ee565b949350505050565b60008060008060008060c08789031215613a5157600080fd5b86356001600160401b0380821115613a6857600080fd5b613a748a838b016135ee565b97506020890135915080821115613a8a57600080fd5b50613a9789828a016135ee565b955050613aa6604088016134fe565b9350613ab46060880161365d565b9250613ac26080880161365d565b915060a087013590509295509295509295565b60008060008060008060c08789031215613aee57600080fd5b8635955060208701356001600160401b03811115613b0b57600080fd5b613a9789828a016135ee565b600080600080600080600060e0888a031215613b3257600080fd5b8735965060208801356001600160401b03811115613b4f57600080fd5b613b5b8a828b016135ee565b965050613b6a604089016134fe565b9450613b786060890161365d565b9350613b866080890161365d565b925060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613bbf57600080fd5b8835975060208901356001600160401b03811115613bdc57600080fd5b613be88b828c016135ee565b975050613bf760408a016134fe565b9550613c0560608a0161365d565b9450613c1360808a0161365d565b979a969950949793969560a0850135955060c08501359460e001359350915050565b60008151808452613c4d81602086016020860161413c565b601f01601f19169290920160200192915050565b968752606095861b6bffffffffffffffffffffffff19908116602089015260e09590951b6001600160e01b0319166034880152603887019390935290841b8316605886015290921b16606c830152608082015260a00190565b94855260208501939093526040840191909152606090811b6bffffffffffffffffffffffff191690830152151560f81b607482015260750190565b60008251613d0781846020870161413c565b9190910192915050565b83815263ffffffff60e01b8360e01b16602082015260008251613d3b81602485016020870161413c565b91909101602401949350505050565b60208152600061229f6020830184613c35565b6020808252601c908201527f626f6e64206d7573742065786365656420746865206d696e696d756d00000000604082015260600190565b6020808252602a908201527f66696e616c697a6174696f6e20646561646c696e65206d757374206e6f742068604082015269185d99481c185cdcd95960b21b606082015260800190565b6020808252601390820152721c5d595cdd1a5bdb881b5d5cdd08195e1a5cdd606a1b604082015260600190565b60208082526024908201527f7175657374696f6e206d7573742062652070656e64696e6720617262697472616040820152633a34b7b760e11b606082015260800190565b6020808252601d908201527f6f70656e696e672064617465206d757374206861766520706173736564000000604082015260600190565b6020808252601d908201527f6d73672e73656e646572206d7573742062652061726269747261746f72000000604082015260600190565b6020808252602a908201527f626f6e64206d75737420626520646f75626c65206174206c65617374207072656040820152691d9a5bdd5cc8189bdb9960b21b606082015260800190565b6020808252601a908201527f7175657374696f6e206d7573742062652066696e616c697a6564000000000000604082015260600190565b6020808252601d908201527f626f6e64206d75737420657863656564206d61785f70726576696f7573000000604082015260600190565b602080825260159082015274626f6e64206d75737420626520706f73697469766560581b604082015260600190565b60208082526028908201527f7175657374696f6e206d757374206e6f742062652070656e64696e672061726260408201526734ba3930ba34b7b760c11b606082015260800190565b87815260e06020820152600061400560e0830189613c35565b6001600160a01b039790971660408301525063ffffffff948516606082015292909316608083015260a082015260c0015292915050565b604051601f8201601f191681016001600160401b0381118282101715614064576140646141c9565b604052919050565b60006001600160401b03821115614085576140856141c9565b5060051b60200190565b600082198211156140a2576140a2614187565b500190565b600063ffffffff8083168185168083038211156140c6576140c6614187565b01949350505050565b6000826140de576140de61419d565b500490565b600063ffffffff808416806140fa576140fa61419d565b92169190910492915050565b600081600019048311821515161561412057614120614187565b500290565b60008282101561413757614137614187565b500390565b60005b8381101561415757818101518382015260200161413f565b83811115614166576000848401525b50505050565b600060001982141561418057614180614187565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122005531d2892fcdeb48472a864e59887b41c9670a9e5c69b4cabf85caa744b255764736f6c634300080600337b227469746c65223a20222573222c202274797065223a20226d756c7469706c652d73656c656374222c20226f7574636f6d6573223a205b25735d2c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a2022626f6f6c222c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a20226461746574696d65222c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a202273696e676c652d73656c656374222c20226f7574636f6d6573223a205b25735d2c202263617465676f7279223a20222573222c20226c616e67223a20222573227d7b227469746c65223a20222573222c202274797065223a202275696e74222c2022646563696d616c73223a2031382c202263617465676f7279223a20222573222c20226c616e67223a20222573227d

Deployed Bytecode

0x6080604052600436106102675760003560e01c80637f8d429e11610144578063ab5a4e35116100b6578063d44e293c1161007a578063d44e293c14610983578063d7cff986146109a3578063e83bfb58146109b6578063ebbdd2b0146109e6578063f6a94ecb14610a06578063fe92049d14610a2657600080fd5b8063ab5a4e35146108cc578063acae8f4e146108ec578063bc52565214610929578063c081d8a314610956578063d09cc57e146108ac57600080fd5b8063924532fb11610108578063924532fb146106e357806395addb90146107165780639e63fa6a1461080a5780639f1025c61461085c578063a1130d0414610899578063a462fb7b146108ac57600080fd5b80637f8d429e146105d857806382ffa9f7146105f8578063839df9451461062857806383bf4609146106925780638d552d46146106b257600080fd5b8063484c0714116101dd578063590158a7116101a1578063590158a7146104da57806359245ff3146105455780636fa427421461055857806370a0823114610585578063762c38fd146105b257806377f325df146105c557600080fd5b8063484c0714146104105780634dc266b4146104405780634df6ca2a146104605780634e60f8831461048057806351577ea9146104ad57600080fd5b80632417395c1161022f5780632417395c146103175780632518904c1461034757806326d6c97b1461039857806328828b1e146103c85780633ccfd60b146103e8578063484b93c4146103fd57600080fd5b806306c3b67a1461026c5780631101a0fd146102a1578063111ec138146102c35780631126a9dc146102d657806312a203c3146102f7575b600080fd5b34801561027857600080fd5b5061028c610287366004613780565b610a46565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc3660046137ce565b610a5b565b005b6102c16102d136600461398b565b610d60565b6102e96102e4366004613ba2565b610fc2565b604051908152602001610298565b34801561030357600080fd5b506102e9610312366004613911565b611408565b34801561032357600080fd5b506102e9610332366004613780565b60009081526004602052604090206003015490565b34801561035357600080fd5b50610380610362366004613780565b6000908152600460205260409020600101546001600160a01b031690565b6040516001600160a01b039091168152602001610298565b3480156103a457600080fd5b506102e96103b3366004613780565b60009081526004602052604090206006015490565b3480156103d457600080fd5b506102c16103e336600461368c565b6115e3565b3480156103f457600080fd5b506102c161189b565b6102e961040b366004613b17565b611915565b34801561041c57600080fd5b506102e961042b366004613780565b60009081526004602052604090206007015490565b34801561044c57600080fd5b506102c161045b3660046139ca565b611a36565b34801561046c57600080fd5b506102c161047b366004613780565b611d3c565b34801561048c57600080fd5b506102e961049b366004613780565b60036020526000908152604090205481565b3480156104b957600080fd5b506102e96104c8366004613780565b60009081526004602052604090205490565b3480156104e657600080fd5b506105206104f5366004613780565b6005602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b604080516001600160a01b039094168452602084019290925290820152606001610298565b6102c1610553366004613780565b611d8a565b34801561056457600080fd5b506102e9610573366004613671565b60076020526000908152604090205481565b34801561059157600080fd5b506102e96105a0366004613671565b60006020819052908152604090205481565b6102e96105c0366004613ad5565b611f1d565b6102c16105d336600461395f565b61203f565b3480156105e457600080fd5b5061028c6105f3366004613780565b61224a565b34801561060457600080fd5b506102e9610613366004613780565b60009081526004602052604090206005015490565b34801561063457600080fd5b50610670610643366004613780565b6006602052600090815260409020805460019091015463ffffffff821691640100000000900460ff169083565b6040805163ffffffff9094168452911515602084015290820152606001610298565b34801561069e57600080fd5b506102e96106ad3660046139fc565b6122a6565b3480156106be57600080fd5b506102e96106cd366004613780565b6000908152600460208190526040909120015490565b3480156106ef57600080fd5b5061028c6106fe366004613780565b60009081526004602052604090206002015460ff1690565b34801561072257600080fd5b506107a3610731366004613780565b60046020819052600091825260409091208054600182015460028301546003840154948401546005850154600686015460079096015494966001600160a01b0385169663ffffffff600160a01b8704811697600160c01b8804821697600160e01b90049091169560ff1694929391908b565b604080519b8c526001600160a01b03909a1660208c015263ffffffff988916998b019990995295871660608a015295909316608088015290151560a087015260c086015260e085015261010084019190915261012083015261014082015261016001610298565b34801561081657600080fd5b50610847610825366004613780565b600090815260046020526040902060010154600160a01b900463ffffffff1690565b60405163ffffffff9091168152602001610298565b34801561086857600080fd5b50610847610877366004613780565b600090815260046020526040902060010154600160c01b900463ffffffff1690565b6102e96108a7366004613a38565b612342565b3480156108b857600080fd5b506102e96108c7366004613780565b61235e565b3480156108d857600080fd5b506102e96108e7366004613780565b61239e565b3480156108f857600080fd5b50610847610907366004613780565b600090815260046020526040902060010154600160e01b900463ffffffff1690565b34801561093557600080fd5b506102e9610944366004613780565b60026020526000908152604090205481565b34801561096257600080fd5b506102e9610971366004613780565b60086020526000908152604090205481565b34801561098f57600080fd5b506102c161099e3660046138b9565b6124cf565b6102c16109b136600461398b565b6125e6565b3480156109c257600080fd5b5061028c6109d1366004613780565b60096020526000908152604090205460ff1681565b3480156109f257600080fd5b506102c1610a01366004613780565b612846565b348015610a1257600080fd5b506102c1610a21366004613799565b61294a565b348015610a3257600080fd5b506102c1610a41366004613884565b612bca565b6000600119610a548361235e565b1492915050565b84610a658161224a565b610a8a5760405162461bcd60e51b8152600401610a8190613f07565b60405180910390fd5b6000855111610af45760405162461bcd60e51b815260206004820152603060248201527f6174206c65617374206f6e6520686973746f7279206861736820656e7472792060448201526f1b5d5cdd081899481c1c9bdd9a59195960821b6064820152608401610a81565b6000868152600560208181526040808420805460018201546002909201546004948590529286209485015494909301546001600160a01b039093169490939192905b8a51811015610ca4576000610bb2848d8481518110610b5757610b576141b3565b60200260200101518b8581518110610b7157610b716141b3565b60200260200101518d8681518110610b8b57610b8b6141b3565b60200260200101518f8781518110610ba557610ba56141b3565b6020026020010151612d1c565b9050610bbe868661408f565b9450610c1b8d84878a8f8781518110610bd957610bd96141b3565b60200260200101518f8881518110610bf357610bf36141b3565b60200260200101518f8981518110610c0d57610c0d6141b3565b602002602001015188612e0c565b8098508196505050898281518110610c3557610c356141b3565b60200260200101519550600460008e8152602001908152602001600020600601548614610c7457610c676028876140cf565b610c719087614125565b95505b8b8281518110610c8657610c866141b3565b60200260200101519350508080610c9c9061416c565b915050610b36565b8215610d02576001600160a01b03861615610cc957610cc48c8786612f56565b600093505b60008c815260056020526040902080546001600160a01b0319166001600160a01b03881617815560018101869055600201849055610d3e565b610d168c87610d11888861408f565b612f56565b60008c815260056020526040812080546001600160a01b031916815560018101829055600201555b50506000998a5260046020526040909920600501989098555050505050505050565b6000848152600460205260409020600101548490600160c01b900463ffffffff16610d9d5760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff1615610dcf5760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580610e0657504263ffffffff168163ffffffff16115b610e225760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580610e5a57504263ffffffff168163ffffffff1611155b610e765760405162461bcd60e51b8152600401610a8190613e4f565b8660003411610e975760405162461bcd60e51b8152600401610a8190613f75565b60008181526004602052604090206006015480610ee457600082815260046020526040902060070154341015610edf5760405162461bcd60e51b8152600401610a8190613d5d565b610f0e565b610eef816002614106565b341015610f0e5760405162461bcd60e51b8152600401610a8190613ebd565b88878015610f4757600082815260046020526040902060060154811015610f475760405162461bcd60e51b8152600401610a8190613f3e565b6001600160a01b038816610f9d5760405162461bcd60e51b815260206004820152601960248201527f616e737765726572206d757374206265206e6f6e2d7a65726f000000000000006044820152606401610a81565b610fab8b8b8a346000612fd0565b610fb58b8b6130a8565b5050505050505050505050565b6000610fcd82610a46565b61103f5760405162461bcd60e51b815260206004820152603f60248201527f596f752063616e206f6e6c792072656f70656e207175657374696f6e7320746860448201527f6174207265736f6c76656420617320736574746c656420746f6f20736f6f6e006064820152608401610a81565b600089868a60405160200161105693929190613d11565b60408051601f1981840301815291815281516020928301206000868152600490935291205490915081146110c45760405162461bcd60e51b81526020600482015260156024820152740c6dedce8cadce840d0c2e6d040dad2e6dac2e8c6d605b1b6044820152606401610a81565b6000838152600460205260409020600101546001600160a01b038981169116146111265760405162461bcd60e51b81526020600482015260136024820152720c2e4c4d2e8e4c2e8dee440dad2e6dac2e8c6d606b1b6044820152606401610a81565b60008381526004602052604090206001015463ffffffff888116600160c01b90920416146111895760405162461bcd60e51b815260206004820152601060248201526f0e8d2dacadeeae840dad2e6dac2e8c6d60831b6044820152606401610a81565b60008381526004602052604090206001015463ffffffff878116600160a01b90920416146111ef5760405162461bcd60e51b81526020600482015260136024820152720dee0cadcd2dccebee8e640dad2e6dac2e8c6d606b1b6044820152606401610a81565b60008381526004602052604090206007015484146112435760405162461bcd60e51b81526020600482015260116024820152700dad2dcbec4dedcc840dad2e6dac2e8c6d607b1b6044820152606401610a81565b60008381526009602052604090205460ff16156112bc5760405162461bcd60e51b815260206004820152603160248201527f5175657374696f6e20697320616c72656164792072656f70656e696e67206120604482015270383932bb34b7bab99038bab2b9ba34b7b760791b6064820152608401610a81565b60008381526008602052604090205483811561134b576112db82610a46565b6113325760405162461bcd60e51b815260206004820152602260248201527f5175657374696f6e2068617320616c7265616479206265656e2072656f70656e604482015261195960f21b6064820152608401610a81565b506000818152600960205260409020805460ff19169055805b600061135c8d8d8d8d8d8d8d611915565b600087815260086020908152604080832084905583835260098252808320805460ff19166001179055600490915280822060039081015486845291909220909101549192506113aa9161408f565b6000828152600460205260408082206003908101939093558482528082209092018190559051879183917f32e7d5617fb1be6bd0e7c3974d438d4514c4cf349e9330691d8abf6f6fd431219190a39c9b505050505050505050505050565b6000856114148161224a565b6114305760405162461bcd60e51b8152600401610a8190613f07565b600087815260046020526040902054861461148d5760405162461bcd60e51b815260206004820152601760248201527f636f6e74656e742068617368206d757374206d617463680000000000000000006044820152606401610a81565b6000878152600460205260409020600101546001600160a01b038681169116146114f15760405162461bcd60e51b81526020600482015260156024820152740c2e4c4d2e8e4c2e8dee440daeae6e840dac2e8c6d605b1b6044820152606401610a81565b60008781526004602052604090206001015463ffffffff600160c01b909104811690851611156115635760405162461bcd60e51b815260206004820152601b60248201527f74696d656f7574206d757374206265206c6f6e6720656e6f75676800000000006044820152606401610a81565b6000878152600460205260409020600601548311156115c45760405162461bcd60e51b815260206004820152601860248201527f626f6e64206d757374206265206869676820656e6f75676800000000000000006044820152606401610a81565b6000878152600460208190526040909120015491505095945050505050565b6000805b8751821015611889576000888381518110611604576116046141b3565b602002602001015190506000888481518110611622576116226141b3565b602002602001015190506000816001600160401b03811115611646576116466141c9565b60405190808252806020026020018201604052801561166f578160200160208202803683370190505b5090506000826001600160401b0381111561168c5761168c6141c9565b6040519080825280602002602001820160405280156116b5578160200160208202803683370190505b5090506000836001600160401b038111156116d2576116d26141c9565b6040519080825280602002602001820160405280156116fb578160200160208202803683370190505b5090506000846001600160401b03811115611718576117186141c9565b604051908082528060200260200182016040528015611741578160200160208202803683370190505b50905060005b85811015611862578c8881518110611761576117616141b3565b602002602001015185828151811061177b5761177b6141b3565b6020026020010181815250508b8881518110611799576117996141b3565b60200260200101518482815181106117b3576117b36141b3565b60200260200101906001600160a01b031690816001600160a01b0316815250508a88815181106117e5576117e56141b3565b60200260200101518382815181106117ff576117ff6141b3565b60200260200101818152505089888151811061181d5761181d6141b3565b6020026020010151828281518110611837576118376141b3565b60209081029190910101528761184c8161416c565b985050808061185a9061416c565b915050611747565b61186f8786868686610a5b565b5050505050505081806118819061416c565b9250506115e7565b61189161189b565b5050505050505050565b33600081815260208190526040808220805490839055905190929183156108fc02918491818181858888f193505050501580156118dc573d6000803e3d6000fd5b5060405181815233907f4ce7033d118120e254016dccf195288400b28fc8936425acd5f17ce2df3ab7089060200160405180910390a250565b6000878152600260205260408120546119665760405162461bcd60e51b81526020600482015260136024820152721d195b5c1b185d19481b5d5cdd08195e1a5cdd606a1b6044820152606401610a81565b600088858960405160200161197d93929190613d11565b60405160208183030381529060405280519060200120905060008188888630338a6040516020016119b49796959493929190613c61565b60405160208183030381529060405280519060200120905081336001600160a01b0316827ffe2dac156a3890636ce13f65f4fdf41dcaee11526e4a5374531572d92194796c8d8d8d8d8d8d42604051611a139796959493929190613fec565b60405180910390a4611a2981838a8a8a89613112565b9998505050505050505050565b6000848152600460205260409020600101548490600160c01b900463ffffffff16611a735760405162461bcd60e51b8152600401610a8190613dde565b600081815260046020526040902060010154600160e01b900463ffffffff16801580611aaa57504263ffffffff168163ffffffff16115b611b085760405162461bcd60e51b815260206004820152602960248201527f66696e616c697a6174696f6e206465616c696e65206d757374206e6f742068616044820152681d99481c185cdcd95960ba1b6064820152608401610a81565b600082815260046020526040902060010154600160a01b900463ffffffff16801580611b4057504263ffffffff168163ffffffff1611155b611b5c5760405162461bcd60e51b8152600401610a8190613e4f565b604080516020808201899052818301889052825180830384018152606083018452805190820120608083018b905260a0830181905260c08084018990528451808503909101815260e090930184528251928201929092206000818152600690925292902054909190640100000000900460ff1615611c2f5760405162461bcd60e51b815260206004820152602a60248201527f636f6d6d69746d656e74206d757374206e6f742068617665206265656e2072656044820152691d99585b1959081e595d60b21b6064820152608401610a81565b60008181526006602052604090205463ffffffff428116911611611ca15760405162461bcd60e51b8152602060048201526024808201527f72657665616c20646561646c696e65206d757374206e6f7420686176652070616044820152631cdcd95960e21b6064820152608401610a81565b6000818152600660208181526040808420600181018d9055805464ff0000000019166401000000001790558c845260049091529091200154861415611cea57611cea89896130a8565b6040805189815260208101899052908101879052829033908b907fa7b2d313bc7a062e30b2c3b811aa4c9faf09755a6b4ea3bf42deff920944332f9060600160405180910390a4505050505050505050565b33600081815260076020908152604091829020849055815192835282018390527fdca703d022171824d3d639b33c1525fd2338120b4cfb89507c0b59596893acda910160405180910390a150565b6000818152600460205260409020600101548190600160c01b900463ffffffff16611dc75760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff1615611df95760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580611e3057504263ffffffff168163ffffffff16115b611e4c5760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580611e8457504263ffffffff168163ffffffff1611155b611ea05760405162461bcd60e51b8152600401610a8190613e4f565b600084815260046020526040902060030154611ebd90349061408f565b6000858152600460205260409081902060030182905551339186917f54d68405b79f2aa4fd4e8db7b67844ad254cf8f208aac476c2894134a9deab6691611f0f91349190918252602082015260400190565b60405180910390a350505050565b600086815260026020526040812054611f6e5760405162461bcd60e51b81526020600482015260136024820152721d195b5c1b185d19481b5d5cdd08195e1a5cdd606a1b6044820152606401610a81565b6000878488604051602001611f8593929190613d11565b60405160208183030381529060405280519060200120905060008187876000303389604051602001611fbd9796959493929190613c61565b60405160208183030381529060405280519060200120905081336001600160a01b0316827ffe2dac156a3890636ce13f65f4fdf41dcaee11526e4a5374531572d92194796c8c8c8c8c8c8c4260405161201c9796959493929190613fec565b60405180910390a461203381838989896000613112565b98975050505050505050565b6000838152600460205260409020600101548390600160c01b900463ffffffff1661207c5760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156120ae5760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff168015806120e557504263ffffffff168163ffffffff16115b6121015760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff1680158061213957504263ffffffff168163ffffffff1611155b6121555760405162461bcd60e51b8152600401610a8190613e4f565b85600034116121765760405162461bcd60e51b8152600401610a8190613f75565b600081815260046020526040902060060154806121c3576000828152600460205260409020600701543410156121be5760405162461bcd60e51b8152600401610a8190613d5d565b6121ed565b6121ce816002614106565b3410156121ed5760405162461bcd60e51b8152600401610a8190613ebd565b87868015612226576000828152600460205260409020600601548110156122265760405162461bcd60e51b8152600401610a8190613f3e565b6122348a8a33346000612fd0565b61223e8a8a6130a8565b50505050505050505050565b60008181526004602052604081206001810154600290910154600160e01b90910463ffffffff169060ff16158015612287575063ffffffff811615155b801561229f57504263ffffffff168163ffffffff1611155b9392505050565b6001546000818152600260209081526040808320439055519192916122cd91859101613cf5565b60408051601f1981840301815282825280516020918201206000858152600390925291902055339082907fb87fb721c0a557bb8dff89a86796466931d82ba530a66a239263eb8735ade2e490612324908790613d4a565b60405180910390a361233781600161408f565b60015590505b919050565b60008061234e886122a6565b9050612033818888888888611f1d565b60008161236a8161224a565b6123865760405162461bcd60e51b8152600401610a8190613f07565b50506000908152600460208190526040909120015490565b6000806123aa8361235e565b90506001198114156124c957600083815260086020526040902054806124385760405162461bcd60e51b815260206004820152603760248201527f5175657374696f6e2077617320736574746c656420746f6f20736f6f6e20616e60448201527f6420686173206e6f74206265656e2072656f70656e65640000000000000000006064820152608401610a81565b6124418161235e565b91506001198214156124c75760405162461bcd60e51b815260206004820152604360248201527f5175657374696f6e207265706c6163656d656e742077617320736574746c656460448201527f20746f6f20736f6f6e20616e6420686173206e6f74206265656e2072656f70656064820152621b995960ea1b608482015260a401610a81565b505b92915050565b600086815260046020526040812060058101546006909101546124f791908690869086612d1c565b9050600081801561251f5750600084815260066020526040902054640100000000900460ff16155b156125b75760008481526006602052604090205463ffffffff4281169116106125b05760405162461bcd60e51b815260206004820152603760248201527f596f75206d757374207761697420666f72207468652072657665616c2064656160448201527f646c696e65206265666f72652066696e616c697a696e670000000000000000006064820152608401610a81565b50846125db565b6000888152600460208190526040909120015487146125d657856125d8565b825b90505b611891888883612bca565b6000848152600460205260409020600101548490600160c01b900463ffffffff166126235760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156126555760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff1680158061268c57504263ffffffff168163ffffffff16115b6126a85760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff168015806126e057504263ffffffff168163ffffffff1611155b6126fc5760405162461bcd60e51b8152600401610a8190613e4f565b866000341161271d5760405162461bcd60e51b8152600401610a8190613f75565b6000818152600460205260409020600601548061276a576000828152600460205260409020600701543410156127655760405162461bcd60e51b8152600401610a8190613d5d565b612794565b612775816002614106565b3410156127945760405162461bcd60e51b8152600401610a8190613ebd565b888780156127cd576000828152600460205260409020600601548110156127cd5760405162461bcd60e51b8152600401610a8190613f3e565b60408051602081018d90529081018b905234606082015260009060800160408051601f198184030181529190528051602090910120905060006001600160a01b038a161561281b578961281d565b335b90506128298d83613430565b6128378d8383346001612fd0565b50505050505050505050505050565b60008181526004602052604090206001015481906001600160a01b031633146128815760405162461bcd60e51b8152600401610a8190613e86565b600082815260046020526040902060020154829060ff166128b45760405162461bcd60e51b8152600401610a8190613e0b565b600083815260046020526040902060028101805460ff19169055600101546128e990600160c01b900463ffffffff16426140a7565b600084815260046020526040808220600101805463ffffffff94909416600160e01b026001600160e01b0390941693909317909255905184917f71bf7c2b9df0b8818e7eb6746a5bf69699ebbab041f3795f9ed58e469afa9a3a91a2505050565b60008381526004602052604090206001015483906001600160a01b031633146129855760405162461bcd60e51b8152600401610a8190613e86565b6000848152600460205260409020600101548490600160c01b900463ffffffff166129c25760405162461bcd60e51b8152600401610a8190613dde565b60008181526004602052604090206002015460ff16156129f45760405162461bcd60e51b8152600401610a8190613fa4565b600081815260046020526040902060010154600160e01b900463ffffffff16801580612a2b57504263ffffffff168163ffffffff16115b612a475760405162461bcd60e51b8152600401610a8190613d94565b600082815260046020526040902060010154600160a01b900463ffffffff16801580612a7f57504263ffffffff168163ffffffff1611155b612a9b5760405162461bcd60e51b8152600401610a8190613e4f565b86858015612ad457600082815260046020526040902060060154811015612ad45760405162461bcd60e51b8152600401610a8190613f3e565b600089815260046020526040902060010154600160e01b900463ffffffff16612b705760405162461bcd60e51b815260206004820152604260248201527f5175657374696f6e206d75737420616c7265616479206861766520616e20616e60448201527f73776572207768656e206172626974726174696f6e2069732072657175657374606482015261195960f21b608482015260a401610a81565b600089815260046020526040808220600201805460ff19166001179055516001600160a01b038a16918b917f75d7939999bc902187c4aed400872883e445145f1983539166f783fa040b47629190a3505050505050505050565b60008381526004602052604090206001015483906001600160a01b03163314612c055760405162461bcd60e51b8152600401610a8190613e86565b600084815260046020526040902060020154849060ff16612c385760405162461bcd60e51b8152600401610a8190613e0b565b6001600160a01b038316612c8e5760405162461bcd60e51b815260206004820152601960248201527f616e737765726572206d7573742062652070726f7669646564000000000000006044820152606401610a81565b604051849086907f18d760beffe3717270cd90d9d920ec1a48c194e9ad7bba23eb1c92d3eb974f9790600090a36000858152600460205260408120600201805460ff19169055612ce49086908690869080612fd0565b50505060009182526004602081905260409092209182015560010180546001600160e01b0316600160e01b4263ffffffff1602179055565b6000848484846001604051602001612d38959493929190613cba565b60405160208183030381529060405280519060200120861415612d5d57506001612e03565b848484846000604051602001612d77959493929190613cba565b60405160208183030381529060405280519060200120861415612d9c57506000612e03565b60405162461bcd60e51b815260206004820152603660248201527f486973746f727920696e7075742070726f766964656420646964206e6f74206d6044820152750c2e8c6d040e8d0ca40caf0e0cac6e8cac840d0c2e6d60531b6064820152608401610a81565b95945050505050565b6000808215612e85576000848152600660205260409020548490640100000000900460ff16612e5d576000908152600660205260408120805464ffffffffff19168155600101555086905085612f49565b6000908152600660205260408120600181018054825464ffffffffff19169092559190915593505b88841415612f43576001600160a01b038716612eff5785965060011960001b8914158015612ec3575060008a81526004602052604090206003015415155b15612efa5760008a815260046020526040902060030154612ee7908b908990612f56565b60008a8152600460205260408120600301555b612f43565b866001600160a01b0316866001600160a01b031614612f4357600085891015612f285788612f2a565b855b9050612f3b8b89610d11848d614125565b869750809850505b50869050855b9850989650505050505050565b6001600160a01b038216600090815260208190526040902054612f7a90829061408f565b6001600160a01b038316600081815260208181526040918290209390935551838152909185917f9c121aff33b50c1a53fef034ebec5f83da2d5a5187048f9c76c397ba27c1a1a6910160405180910390a3505050565b6000858152600460209081526040808320600501549051612ff992889187918991889101613cba565b604051602081830303815290604052805190602001209050600083111561302f5760008681526004602052604090206006018390555b600086815260046020908152604091829020600501839055815187815290810183905290810184905242606082015282151560808201526001600160a01b0385169087907fe47ca4ebbbc2990134d1168821f38c5e177f3d5ee564bffeadeaa351905e62219060a00160405180910390a3505050505050565b6000828152600460208190526040909120908101829055600101546130da90600160c01b900463ffffffff16426140a7565b600092835260046020526040909220600101805463ffffffff93909316600160e01b026001600160e01b039093169290921790915550565b6000868152600460205260409020600101548690600160c01b900463ffffffff16156131805760405162461bcd60e51b815260206004820152601760248201527f7175657374696f6e206d757374206e6f742065786973740000000000000000006044820152606401610a81565b60008463ffffffff16116131d65760405162461bcd60e51b815260206004820152601860248201527f74696d656f7574206d75737420626520706f73697469766500000000000000006044820152606401610a81565b6301e133808463ffffffff161061323a5760405162461bcd60e51b815260206004820152602260248201527f74696d656f7574206d757374206265206c657373207468616e20333635206461604482015261797360f01b6064820152608401610a81565b346001600160a01b0386161580159061325c5750336001600160a01b03871614155b15613322576001600160a01b038616600090815260076020526040902054808210156132d65760405162461bcd60e51b8152602060048201526024808201527f4554482070726f7669646564206d75737420636f766572207175657374696f6e6044820152632066656560e01b6064820152608401610a81565b6132e08183614125565b6001600160a01b03881660009081526020819052604090205490925061330790829061408f565b6001600160a01b038816600090815260208190526040902055505b6000888152600460205260409020878155600101805463ffffffff878116600160c01b0263ffffffff60c01b19918816600160a01b026001600160c01b03199093166001600160a01b038b1617929092171617905580156133d057600088815260046020908152604091829020600301839055815183815290810183905233918a917f54d68405b79f2aa4fd4e8db7b67844ad254cf8f208aac476c2894134a9deab66910160405180910390a35b821561189157600088815260046020526040908190206007018490555188907f9641ca9d53af3bead658ffcc6c7d8c35e7dae9938367bd8eb45bee35d5c625049061341e9086815260200190565b60405180910390a25050505050505050565b60008181526006602052604090205463ffffffff161561349c5760405162461bcd60e51b815260206004820152602160248201527f636f6d6d69746d656e74206d757374206e6f7420616c726561647920657869736044820152601d60fa1b6064820152608401610a81565b6000828152600460205260408120600101546134c790600890600160c01b900463ffffffff166140e3565b90506134d381426140a7565b600092835260066020526040909220805463ffffffff191663ffffffff909316929092179091555050565b80356001600160a01b038116811461233d57600080fd5b600082601f83011261352657600080fd5b8135602061353b6135368361406c565b61403c565b80838252828201915082860187848660051b890101111561355b57600080fd5b60005b858110156135815761356f826134fe565b8452928401929084019060010161355e565b5090979650505050505050565b600082601f83011261359f57600080fd5b813560206135af6135368361406c565b80838252828201915082860187848660051b89010111156135cf57600080fd5b60005b85811015613581578135845292840192908401906001016135d2565b600082601f8301126135ff57600080fd5b81356001600160401b03811115613618576136186141c9565b61362b601f8201601f191660200161403c565b81815284602083860101111561364057600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff8116811461233d57600080fd5b60006020828403121561368357600080fd5b61229f826134fe565b60008060008060008060c087890312156136a557600080fd5b86356001600160401b03808211156136bc57600080fd5b6136c88a838b0161358e565b975060208901359150808211156136de57600080fd5b6136ea8a838b0161358e565b9650604089013591508082111561370057600080fd5b61370c8a838b0161358e565b9550606089013591508082111561372257600080fd5b61372e8a838b01613515565b9450608089013591508082111561374457600080fd5b6137508a838b0161358e565b935060a089013591508082111561376657600080fd5b5061377389828a0161358e565b9150509295509295509295565b60006020828403121561379257600080fd5b5035919050565b6000806000606084860312156137ae57600080fd5b833592506137be602085016134fe565b9150604084013590509250925092565b600080600080600060a086880312156137e657600080fd5b8535945060208601356001600160401b038082111561380457600080fd5b61381089838a0161358e565b9550604088013591508082111561382657600080fd5b61383289838a01613515565b9450606088013591508082111561384857600080fd5b61385489838a0161358e565b9350608088013591508082111561386a57600080fd5b506138778882890161358e565b9150509295509295909350565b60008060006060848603121561389957600080fd5b83359250602084013591506138b0604085016134fe565b90509250925092565b60008060008060008060c087890312156138d257600080fd5b86359550602087013594506138e9604088016134fe565b9350606087013592506080870135915061390560a088016134fe565b90509295509295509295565b600080600080600060a0868803121561392957600080fd5b8535945060208601359350613940604087016134fe565b925061394e6060870161365d565b949793965091946080013592915050565b60008060006060848603121561397457600080fd5b505081359360208301359350604090920135919050565b600080600080608085870312156139a157600080fd5b8435935060208501359250604085013591506139bf606086016134fe565b905092959194509250565b600080600080608085870312156139e057600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215613a0e57600080fd5b81356001600160401b03811115613a2457600080fd5b613a30848285016135ee565b949350505050565b60008060008060008060c08789031215613a5157600080fd5b86356001600160401b0380821115613a6857600080fd5b613a748a838b016135ee565b97506020890135915080821115613a8a57600080fd5b50613a9789828a016135ee565b955050613aa6604088016134fe565b9350613ab46060880161365d565b9250613ac26080880161365d565b915060a087013590509295509295509295565b60008060008060008060c08789031215613aee57600080fd5b8635955060208701356001600160401b03811115613b0b57600080fd5b613a9789828a016135ee565b600080600080600080600060e0888a031215613b3257600080fd5b8735965060208801356001600160401b03811115613b4f57600080fd5b613b5b8a828b016135ee565b965050613b6a604089016134fe565b9450613b786060890161365d565b9350613b866080890161365d565b925060a0880135915060c0880135905092959891949750929550565b600080600080600080600080610100898b031215613bbf57600080fd5b8835975060208901356001600160401b03811115613bdc57600080fd5b613be88b828c016135ee565b975050613bf760408a016134fe565b9550613c0560608a0161365d565b9450613c1360808a0161365d565b979a969950949793969560a0850135955060c08501359460e001359350915050565b60008151808452613c4d81602086016020860161413c565b601f01601f19169290920160200192915050565b968752606095861b6bffffffffffffffffffffffff19908116602089015260e09590951b6001600160e01b0319166034880152603887019390935290841b8316605886015290921b16606c830152608082015260a00190565b94855260208501939093526040840191909152606090811b6bffffffffffffffffffffffff191690830152151560f81b607482015260750190565b60008251613d0781846020870161413c565b9190910192915050565b83815263ffffffff60e01b8360e01b16602082015260008251613d3b81602485016020870161413c565b91909101602401949350505050565b60208152600061229f6020830184613c35565b6020808252601c908201527f626f6e64206d7573742065786365656420746865206d696e696d756d00000000604082015260600190565b6020808252602a908201527f66696e616c697a6174696f6e20646561646c696e65206d757374206e6f742068604082015269185d99481c185cdcd95960b21b606082015260800190565b6020808252601390820152721c5d595cdd1a5bdb881b5d5cdd08195e1a5cdd606a1b604082015260600190565b60208082526024908201527f7175657374696f6e206d7573742062652070656e64696e6720617262697472616040820152633a34b7b760e11b606082015260800190565b6020808252601d908201527f6f70656e696e672064617465206d757374206861766520706173736564000000604082015260600190565b6020808252601d908201527f6d73672e73656e646572206d7573742062652061726269747261746f72000000604082015260600190565b6020808252602a908201527f626f6e64206d75737420626520646f75626c65206174206c65617374207072656040820152691d9a5bdd5cc8189bdb9960b21b606082015260800190565b6020808252601a908201527f7175657374696f6e206d7573742062652066696e616c697a6564000000000000604082015260600190565b6020808252601d908201527f626f6e64206d75737420657863656564206d61785f70726576696f7573000000604082015260600190565b602080825260159082015274626f6e64206d75737420626520706f73697469766560581b604082015260600190565b60208082526028908201527f7175657374696f6e206d757374206e6f742062652070656e64696e672061726260408201526734ba3930ba34b7b760c11b606082015260800190565b87815260e06020820152600061400560e0830189613c35565b6001600160a01b039790971660408301525063ffffffff948516606082015292909316608083015260a082015260c0015292915050565b604051601f8201601f191681016001600160401b0381118282101715614064576140646141c9565b604052919050565b60006001600160401b03821115614085576140856141c9565b5060051b60200190565b600082198211156140a2576140a2614187565b500190565b600063ffffffff8083168185168083038211156140c6576140c6614187565b01949350505050565b6000826140de576140de61419d565b500490565b600063ffffffff808416806140fa576140fa61419d565b92169190910492915050565b600081600019048311821515161561412057614120614187565b500290565b60008282101561413757614137614187565b500390565b60005b8381101561415757818101518382015260200161413f565b83811115614166576000848401525b50505050565b600060001982141561418057614180614187565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122005531d2892fcdeb48472a864e59887b41c9670a9e5c69b4cabf85caa744b255764736f6c63430008060033

Deployed Bytecode Sourcemap

465:49298:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30046:149;;;;;;;;;;-1:-1:-1;30046:149:0;;;;;:::i;:::-;;:::i;:::-;;;16122:14:1;;16115:22;16097:41;;16085:2;16070:18;30046:149:0;;;;;;;;38062:3237;;;;;;;;;;-1:-1:-1;38062:3237:0;;;;;:::i;:::-;;:::i;:::-;;18213:491;;;;;;:::i;:::-;;:::i;32225:3078::-;;;;;;:::i;:::-;;:::i;:::-;;;16295:25:1;;;16283:2;16268:18;32225:3078:0;16250:76:1;36060:668:0;;;;;;;;;;-1:-1:-1;36060:668:0;;;;;:::i;:::-;;:::i;48531:130::-;;;;;;;;;;-1:-1:-1;48531:130:0;;;;;:::i;:::-;48597:7;48624:22;;;:9;:22;;;;;:29;;;;48531:130;47108:138;;;;;;;;;;-1:-1:-1;47108:138:0;;;;;:::i;:::-;47178:7;47205:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;;;47205:33:0;;47108:138;;;;-1:-1:-1;;;;;15284:32:1;;;15266:51;;15254:2;15239:18;47108:138:0;15221:102:1;49370:126:0;;;;;;;;;;-1:-1:-1;49370:126:0;;;;;:::i;:::-;49434:7;49461:22;;;:9;:22;;;;;:27;;;;49370:126;45622:1072;;;;;;;;;;-1:-1:-1;45622:1072:0;;;;;:::i;:::-;;:::i;245:211::-;;;;;;;;;;;;;:::i;13357:1019::-;;;;;;:::i;:::-;;:::i;49626:132::-;;;;;;;;;;-1:-1:-1;49626:132:0;;;;;:::i;:::-;49692:7;49719:22;;;:9;:22;;;;;:31;;;;49626:132;21873:904;;;;;;;;;;-1:-1:-1;21873:904:0;;;;;:::i;:::-;;:::i;8261:184::-;;;;;;;;;;-1:-1:-1;8261:184:0;;;;;:::i;:::-;;:::i;4252:50::-;;;;;;;;;;-1:-1:-1;4252:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;46842:141;;;;;;;;;;-1:-1:-1;46842:141:0;;;;;:::i;:::-;46913:7;46940:22;;;:9;:22;;;;;:35;;46842:141;4361:48;;;;;;;;;;-1:-1:-1;4361:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4361:48:0;;;;;;;;;;;-1:-1:-1;;;;;15827:32:1;;;15809:51;;15891:2;15876:18;;15869:34;;;;15919:18;;;15912:34;15797:2;15782:18;4361:48:0;15764:188:1;16404:296:0;;;;;;:::i;:::-;;:::i;4472:59::-;;;;;;;;;;-1:-1:-1;4472:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;103:44;;;;;;;;;;-1:-1:-1;103:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;11417:973;;;;;;:::i;:::-;;:::i;17199:400::-;;;;;;:::i;:::-;;:::i;28798:291::-;;;;;;;;;;-1:-1:-1;28798:291:0;;;;;:::i;:::-;;:::i;49098:141::-;;;;;;;;;;-1:-1:-1;49098:141:0;;;;;:::i;:::-;49169:7;49196:22;;;:9;:22;;;;;:35;;;;49098:141;4416:49;;;;;;;;;;-1:-1:-1;4416:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35284:10:1;35272:23;;;35254:42;;35339:14;;35332:22;35327:2;35312:18;;35305:50;35371:18;;;35364:34;35242:2;35227:18;4416:49:0;35209:195:1;8832:361:0;;;;;;;;;;-1:-1:-1;8832:361:0;;;;;:::i;:::-;;:::i;48770:139::-;;;;;;;;;;-1:-1:-1;48770:139:0;;;;;:::i;:::-;48840:7;48867:22;;;:9;:22;;;;;;;;:34;;;48770:139;48193:154;;;;;;;;;;-1:-1:-1;48193:154:0;;;;;:::i;:::-;48270:4;48294:22;;;:9;:22;;;;;:45;;;;;;48193:154;4309:45;;;;;;;;;;-1:-1:-1;4309:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4309:45:0;;;;-1:-1:-1;;;4309:45:0;;;;;-1:-1:-1;;;4309:45:0;;;;;-1:-1:-1;;;4309:45:0;;;;;;;;;;;;;;;;;;;16747:25:1;;;-1:-1:-1;;;;;16808:32:1;;;16803:2;16788:18;;16781:60;16860:10;16906:15;;;16886:18;;;16879:43;;;;16958:15;;;16953:2;16938:18;;16931:43;17011:15;;;;17005:3;16990:19;;16983:44;17071:14;;17064:22;16828:3;17043:19;;17036:51;17118:3;17103:19;;17096:35;17162:3;17147:19;;17140:35;17206:3;17191:19;;17184:35;;;;17250:3;17235:19;;17228:35;17294:3;17279:19;;17272:36;16734:3;16719:19;4309:45:0;16701:613:1;47385:136:0;;;;;;;;;;-1:-1:-1;47385:136:0;;;;;:::i;:::-;47454:6;47480:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;47480:33:0;;;;;47385:136;;;;35037:10:1;35025:23;;;35007:42;;34995:2;34980:18;47385:136:0;34962:93:1;47652:131:0;;;;;;;;;;-1:-1:-1;47652:131:0;;;;;:::i;:::-;47719:6;47745:22;;;:9;:22;;;;;:30;;;-1:-1:-1;;;47745:30:0;;;;;47652:131;10078:446;;;;;;:::i;:::-;;:::i;29309:180::-;;;;;;;;;;-1:-1:-1;29309:180:0;;;;;:::i;:::-;;:::i;30414:714::-;;;;;;;;;;-1:-1:-1;30414:714:0;;;;;:::i;:::-;;:::i;47926:138::-;;;;;;;;;;-1:-1:-1;47926:138:0;;;;;:::i;:::-;47996:6;48022:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;48022:34:0;;;;;47926:138;4201:44;;;;;;;;;;-1:-1:-1;4201:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;4539:53;;;;;;;;;;-1:-1:-1;4539:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;27508:1105;;;;;;;;;;-1:-1:-1;27508:1105:0;;;;;:::i;:::-;;:::i;20260:626::-;;;;;;:::i;:::-;;:::i;4599:50::-;;;;;;;;;;-1:-1:-1;4599:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25296:371;;;;;;;;;;-1:-1:-1;25296:371:0;;;;;:::i;:::-;;:::i;24532:530::-;;;;;;;;;;-1:-1:-1;24532:530:0;;;;;:::i;:::-;;:::i;26273:519::-;;;;;;;;;;-1:-1:-1;26273:519:0;;;;;:::i;:::-;;:::i;30046:149::-;30118:4;-1:-1:-1;;30143:22:0;30153:11;30143:9;:22::i;:::-;:43;;30046:149;-1:-1:-1;;30046:149:0:o;38062:3237::-;38264:11;6451:24;6463:11;6451;:24::i;:::-;6443:63;;;;-1:-1:-1;;;6443:63:0;;;;;;;:::i;:::-;;;;;;;;;38334:1:::1;38310:14;:21;:25;38302:86;;;::::0;-1:-1:-1;;;38302:86:0;;32659:2:1;38302:86:0::1;::::0;::::1;32641:21:1::0;32698:2;32678:18;;;32671:30;32737:34;32717:18;;;32710:62;-1:-1:-1;;;32788:18:1;;;32781:46;32844:19;;38302:86:0::1;32631:238:1::0;38302:86:0::1;38482:13;38498:28:::0;;;:15:::1;:28;::::0;;;;;;;:34;;;38564:38;::::1;::::0;38637:41:::1;::::0;;::::1;::::0;38931:9:::1;:22:::0;;;;;;;:35;;::::1;::::0;39001:34;;;::::1;::::0;-1:-1:-1;;;;;38498:34:0;;::::1;::::0;38564:38;;38637:41;;39001:34;39068:1134:::1;39084:14;:21;39080:1;:25;39068:1134;;;39249:18;39270:97;39298:17;39317:14;39332:1;39317:17;;;;;;;;:::i;:::-;;;;;;;39336:7;39344:1;39336:10;;;;;;;;:::i;:::-;;;;;;;39348:5;39354:1;39348:8;;;;;;;;:::i;:::-;;;;;;;39358:5;39364:1;39358:8;;;;;;;;:::i;:::-;;;;;;;39270:27;:97::i;:::-;39249:118:::0;-1:-1:-1;39411:24:0::1;39426:9:::0;39411:12;:24:::1;:::i;:::-;39396:39;;39475:149;39513:11;39526;39539:12;39553:5;39578;39584:1;39578:8;;;;;;;;:::i;:::-;;;;;;;39588:5;39594:1;39588:8;;;;;;;;:::i;:::-;;;;;;;39598:7;39606:1;39598:10;;;;;;;;:::i;:::-;;;;;;;39610:13;39475:19;:149::i;:::-;39451:173;;;;;;;;39751:5;39757:1;39751:8;;;;;;;;:::i;:::-;;;;;;;39739:20;;40010:9;:22;40020:11;40010:22;;;;;;;;;;;:27;;;39997:9;:40;39993:142;;40082:37;1196:2;40082:9:::0;:37:::1;:::i;:::-;40070:49;::::0;:9;:49:::1;:::i;:::-;40058:61;;39993:142;40171:14;40186:1;40171:17;;;;;;;;:::i;:::-;;;;;;;40151:37;;39112:1090;39107:3;;;;;:::i;:::-;;;;39068:1134;;;40219:30:::0;;40215:1007:::1;;-1:-1:-1::0;;;;;40660:21:0;::::1;::::0;40656:140:::1;;40702:43;40712:11;40725:5;40732:12;40702:9;:43::i;:::-;40779:1;40764:16;;40656:140;40812:28;::::0;;;:15:::1;:28;::::0;;;;:42;;-1:-1:-1;;;;;;40812:42:0::1;-1:-1:-1::0;;;;;40812:42:0;::::1;;::::0;;-1:-1:-1;40869:38:0;::::1;:50:::0;;;40934:41:::1;;:56:::0;;;40215:1007:::1;;;41105:55;41115:11:::0;41128:5;41135:24:::1;41150:9:::0;41135:12;:24:::1;:::i;:::-;41105:9;:55::i;:::-;41182:28;::::0;;;:15:::1;:28;::::0;;;;41175:35;;-1:-1:-1;;;;;;41175:35:0::1;::::0;;;;::::1;::::0;;;::::1;;::::0;40215:1007:::1;-1:-1:-1::0;;41234:22:0::1;::::0;;;:9:::1;:22;::::0;;;;;:35:::1;;:55:::0;;;;-1:-1:-1;;;;;;;;38062:3237:0:o;18213:491::-;5129:1;5096:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;5096:30:0;;;;5088:66;;;;-1:-1:-1;;;5088:66:0;;;;;;;:::i;:::-;5174:22;;;;:9;:22;;;;;:45;;;;;5173:46;5165:99;;;;-1:-1:-1;;;5165:99:0;;;;;;;:::i;:::-;5275:18;5296:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;5296:34:0;;;;5349:25;;;:66;;;5399:15;5378:37;;:11;:37;;;5349:66;5341:121;;;;-1:-1:-1;;;5341:121:0;;;;;;;:::i;:::-;5473:17;5493:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;5493:33:0;;;;5545:15;;;:56;;;5585:15;5564:37;;:10;:37;;;;5545:56;5537:98;;;;-1:-1:-1;;;5537:98:0;;;;;;;:::i;:::-;18386:11:::1;6625:1;6613:9;:13;6605:47;;;;-1:-1:-1::0;;;6605:47:0::1;;;;;;;:::i;:::-;6664:20;6687:22:::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;6729:17;6725:256:::1;;6785:22;::::0;;;:9:::1;:22;::::0;;;;:31:::1;;::::0;6771:9:::1;:46;;6763:87;;;;-1:-1:-1::0;;;6763:87:0::1;;;;;;;:::i;:::-;6725:256;;;6905:16;:12:::0;6920:1:::1;6905:16;:::i;:::-;6891:9;:31;;6883:86;;;;-1:-1:-1::0;;;6883:86:0::1;;;;;;;:::i;:::-;18443:11:::0;18456:12;7110:16;;7106:134:::2;;7151:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;7151:43:0::2;7143:85;;;;-1:-1:-1::0;;;7143:85:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18511:24:0;::::3;18503:62;;;::::0;-1:-1:-1;;;18503:62:0;;19821:2:1;18503:62:0::3;::::0;::::3;19803:21:1::0;19860:2;19840:18;;;19833:30;19899:27;19879:18;;;19872:55;19944:18;;18503:62:0::3;19793:175:1::0;18503:62:0::3;18576:68;18596:11;18609:6;18617:8;18627:9;18638:5;18576:19;:68::i;:::-;18655:41;18676:11;18689:6;18655:20;:41::i;:::-;6991:1:::2;;6594:406:::1;5647:1;5077:579:::0;;18213:491;;;;;:::o;32225:3078::-;32509:7;32539:37;32556:19;32539:16;:37::i;:::-;32531:113;;;;-1:-1:-1;;;32531:113:0;;18548:2:1;32531:113:0;;;18530:21:1;18587:2;18567:18;;;18560:30;18626:34;18606:18;;;18599:62;18697:33;18677:18;;;18670:61;18748:19;;32531:113:0;18520:253:1;32531:113:0;32657:20;32707:11;32720:10;32732:8;32690:51;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;32690:51:0;;;;;;;;;32680:62;;32690:51;32680:62;;;;32882:30;;;;:9;:30;;;;;:43;32680:62;;-1:-1:-1;32866:59:0;;32858:93;;;;-1:-1:-1;;;32858:93:0;;30802:2:1;32858:93:0;;;30784:21:1;30841:2;30821:18;;;30814:30;-1:-1:-1;;;30860:18:1;;;30853:51;30921:18;;32858:93:0;30774:171:1;32858:93:0;32984:30;;;;:9;:30;;;;;:41;;;-1:-1:-1;;;;;32970:55:0;;;32984:41;;32970:55;32962:87;;;;-1:-1:-1;;;32962:87:0;;20880:2:1;32962:87:0;;;20862:21:1;20919:2;20899:18;;;20892:30;-1:-1:-1;;;20938:18:1;;;20931:49;20997:18;;32962:87:0;20852:169:1;32962:87:0;33079:30;;;;:9;:30;;;;;:38;;;;33068:49;;;-1:-1:-1;;;33079:38:0;;;;33068:49;33060:78;;;;-1:-1:-1;;;33060:78:0;;31152:2:1;33060:78:0;;;31134:21:1;31191:2;31171:18;;;31164:30;-1:-1:-1;;;31210:18:1;;;31203:46;31266:18;;33060:78:0;31124:166:1;33060:78:0;33171:30;;;;:9;:30;;;;;:41;;;;33157:55;;;-1:-1:-1;;;33171:41:0;;;;33157:55;33149:88;;;;-1:-1:-1;;;33149:88:0;;21228:2:1;33149:88:0;;;21210:21:1;21267:2;21247:18;;;21240:30;-1:-1:-1;;;21286:18:1;;;21279:49;21345:18;;33149:88:0;21200:169:1;33149:88:0;33268:30;;;;:9;:30;;;;;:39;;;33256:51;;33248:81;;;;-1:-1:-1;;;33248:81:0;;26518:2:1;33248:81:0;;;26500:21:1;26557:2;26537:18;;;26530:30;-1:-1:-1;;;26576:18:1;;;26569:47;26633:18;;33248:81:0;26490:167:1;33248:81:0;33581:39;;;;:18;:39;;;;;;;;33580:40;33572:102;;;;-1:-1:-1;;;33572:102:0;;19403:2:1;33572:102:0;;;19385:21:1;19442:2;19422:18;;;19415:30;19481:34;19461:18;;;19454:62;-1:-1:-1;;;19532:18:1;;;19525:47;19589:19;;33572:102:0;19375:239:1;33572:102:0;33817:35;33855:39;;;:18;:39;;;;;;33874:19;34225:41;;34221:546;;34291:45;34308:27;34291:16;:45::i;:::-;34283:92;;;;-1:-1:-1;;;34283:92:0;;24232:2:1;34283:92:0;;;24214:21:1;24271:2;24251:18;;;24244:30;24310:34;24290:18;;;24283:62;-1:-1:-1;;;24361:18:1;;;24354:32;24403:19;;34283:92:0;24204:224:1;34283:92:0;-1:-1:-1;34677:5:0;34627:47;;;:18;:47;;;;;:55;;-1:-1:-1;;34627:55:0;;;34646:27;34221:546;34779:19;34801:95;34824:11;34837:8;34847:10;34859:7;34868:10;34880:5;34887:8;34801:22;:95::i;:::-;34909:39;;;;:18;:39;;;;;;;;:53;;;34973:31;;;:18;:31;;;;;:38;;-1:-1:-1;;34973:38:0;35007:4;34973:38;;;35105:9;:22;;;;;;:29;;;;;35056:39;;;;;;;:46;;;;34779:117;;-1:-1:-1;35056:78:0;;;:::i;:::-;35024:22;;;;:9;:22;;;;;;:29;;;;:110;;;;35145:39;;;;;;:46;;;:50;;;35213:51;;35244:19;;35034:11;;35213:51;;35024:22;35213:51;35284:11;32225:3078;-1:-1:-1;;;;;;;;;;;;32225:3078:0:o;36060:668::-;36286:7;36245:11;6451:24;6463:11;6451;:24::i;:::-;6443:63;;;;-1:-1:-1;;;6443:63:0;;;;;;;:::i;:::-;36330:22:::1;::::0;;;:9:::1;:22;::::0;;;;:35;36314:51;::::1;36306:87;;;::::0;-1:-1:-1;;;36306:87:0;;20175:2:1;36306:87:0::1;::::0;::::1;20157:21:1::0;20214:2;20194:18;;;20187:30;20253:25;20233:18;;;20226:53;20296:18;;36306:87:0::1;20147:173:1::0;36306:87:0::1;36426:22;::::0;;;:9:::1;:22;::::0;;;;:33:::1;;::::0;-1:-1:-1;;;;;36412:47:0;;::::1;36426:33:::0;::::1;36412:47;36404:81;;;::::0;-1:-1:-1;;;36404:81:0;;32309:2:1;36404:81:0::1;::::0;::::1;32291:21:1::0;32348:2;32328:18;;;32321:30;-1:-1:-1;;;32367:18:1;;;32360:51;32428:18;;36404:81:0::1;32281:171:1::0;36404:81:0::1;36519:22;::::0;;;:9:::1;:22;::::0;;;;:30:::1;;::::0;::::1;-1:-1:-1::0;;;36519:30:0;;::::1;::::0;::::1;36504:45:::0;;::::1;;;36496:85;;;::::0;-1:-1:-1;;;36496:85:0;;30446:2:1;36496:85:0::1;::::0;::::1;30428:21:1::0;30485:2;30465:18;;;30458:30;30524:29;30504:18;;;30497:57;30571:18;;36496:85:0::1;30418:177:1::0;36496:85:0::1;36612:22;::::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;36600:39;::::1;;36592:76;;;::::0;-1:-1:-1;;;36592:76:0;;23097:2:1;36592:76:0::1;::::0;::::1;23079:21:1::0;23136:2;23116:18;;;23109:30;23175:26;23155:18;;;23148:54;23219:18;;36592:76:0::1;23069:174:1::0;36592:76:0::1;36686:22;::::0;;;:9:::1;:22;::::0;;;;;;;:34:::1;::::0;;-1:-1:-1;36060:668:0;;;;;;;;:::o;45622:1072::-;45970:10:::1;::::0;46011:655:::1;46029:12;:19;46024:2;:24;46011:655;;;46071:11;46085:12;46098:2;46085:16;;;;;;;;:::i;:::-;;;;;;;46071:30;;46116:10;46129:7;46137:2;46129:11;;;;;;;;:::i;:::-;;;;;;;46116:24;;46155:19;46191:2;-1:-1:-1::0;;;;;46177:17:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;46177:17:0::1;;46155:39;;46209:19;46245:2;-1:-1:-1::0;;;;;46231:17:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;46231:17:0::1;;46209:39;;46263:19;46299:2;-1:-1:-1::0;;;;;46285:17:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;46285:17:0::1;;46263:39;;46317:19;46353:2;-1:-1:-1::0;;;;;46339:17:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;46339:17:0::1;;46317:39;;46371:9;46395:211;46411:2;46407:1;:6;46395:211;;;46447:11;46459:1;46447:14;;;;;;;;:::i;:::-;;;;;;;46439:2;46442:1;46439:5;;;;;;;;:::i;:::-;;;;;;:22;;;::::0;::::1;46488:5;46494:1;46488:8;;;;;;;;:::i;:::-;;;;;;;46480:2;46483:1;46480:5;;;;;;;;:::i;:::-;;;;;;:16;-1:-1:-1::0;;;;;46480:16:0::1;;;-1:-1:-1::0;;;;;46480:16:0::1;;;::::0;::::1;46523:5;46529:1;46523:8;;;;;;;;:::i;:::-;;;;;;;46515:2;46518:1;46515:5;;;;;;;;:::i;:::-;;;;;;:16;;;::::0;::::1;46558:7;46566:1;46558:10;;;;;;;;:::i;:::-;;;;;;;46550:2;46553:1;46550:5;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:18;46587:3;::::1;::::0;::::1;:::i;:::-;;;;46415;;;;;:::i;:::-;;;;46395:211;;;46620:34;46634:3;46639:2;46643;46647;46651;46620:13;:34::i;:::-;46056:610;;;;;;;46050:4;;;;;:::i;:::-;;;;46011:655;;;46676:10;:8;:10::i;:::-;45949:745;;45622:1072:::0;;;;;;:::o;245:211::-;313:10;289:11;303:21;;;;;;;;;;;;;335:25;;;;371:33;;303:21;;313:10;371:33;;;;;303:21;;371:33;289:11;371:33;303:21;313:10;371:33;;;;;;;;;;;;;;;;;;;;-1:-1:-1;420:28:0;;16295:25:1;;;432:10:0;;420:28;;16283:2:1;16268:18;420:28:0;;;;;;;278:178;245:211::o;13357:1019::-;13621:7;13651:22;;;:9;:22;;;;;;13643:58;;;;-1:-1:-1;;;13643:58:0;;25404:2:1;13643:58:0;;;25386:21:1;25443:2;25423:18;;;25416:30;-1:-1:-1;;;25462:18:1;;;25455:49;25521:18;;13643:58:0;25376:169:1;13643:58:0;13714:20;13764:11;13777:10;13789:8;13747:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13737:62;;;;;;13714:85;;13810:19;13859:12;13873:10;13885:7;13894:8;13912:4;13919:10;13931:5;13842:95;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13832:106;;;;;;13810:128;;14174:12;14139:10;-1:-1:-1;;;;;14111:133:0;14126:11;14111:133;14151:11;14164:8;14188:10;14200:7;14209:10;14221:5;14228:15;14111:133;;;;;;;;;;;;:::i;:::-;;;;;;;;14255:82;14268:11;14281:12;14295:10;14307:7;14316:10;14328:8;14255:12;:82::i;:::-;14357:11;13357:1019;-1:-1:-1;;;;;;;;;13357:1019:0:o;21873:904::-;5963:1;5930:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;5930:30:0;;;;5922:66;;;;-1:-1:-1;;;5922:66:0;;;;;;;:::i;:::-;5999:18;6020:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;6020:34:0;;;;6073:25;;;:66;;;6123:15;6102:37;;:11;:37;;;6073:66;6065:120;;;;-1:-1:-1;;;6065:120:0;;28173:2:1;6065:120:0;;;28155:21:1;28212:2;28192:18;;;28185:30;28251:34;28231:18;;;28224:62;-1:-1:-1;;;28302:18:1;;;28295:39;28351:19;;6065:120:0;28145:231:1;6065:120:0;6196:17;6216:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;6216:33:0;;;;6268:15;;;:56;;;6308:15;6287:37;;:10;:37;;;;6268:56;6260:98;;;;-1:-1:-1;;;6260:98:0;;;;;;;:::i;:::-;22079:31:::1;::::0;;::::1;::::0;;::::1;14291:19:1::0;;;14326:12;;;14319:28;;;22079:31:0;;;;;;;;;14363:12:1;;;22079:31:0;;22069:42;;;;::::1;::::0;22156:48;;;13486:19:1;;;13521:12;;;13514:28;;;13558:12;;;;13551:28;;;22156:48:0;;;;;;;;;;13595:12:1;;;;22156:48:0;;22146:59;;;;::::1;::::0;;;;-1:-1:-1;22227:26:0;;;:11:::1;:26:::0;;;;;;:38;22069:42;;22146:59;22227:38;;::::1;;;22226:39;22218:94;;;::::0;-1:-1:-1;;;22218:94:0;;25752:2:1;22218:94:0::1;::::0;::::1;25734:21:1::0;25791:2;25771:18;;;25764:30;25830:34;25810:18;;;25803:62;-1:-1:-1;;;25881:18:1;;;25874:40;25931:19;;22218:94:0::1;25724:232:1::0;22218:94:0::1;22331:26;::::0;;;:11:::1;:26;::::0;;;;:36;:62:::1;22377:15;22331:62:::0;::::1;:36:::0;::::1;:62;22323:111;;;::::0;-1:-1:-1;;;22323:111:0;;29639:2:1;22323:111:0::1;::::0;::::1;29621:21:1::0;29678:2;29658:18;;;29651:30;29717:34;29697:18;;;29690:62;-1:-1:-1;;;29768:18:1;;;29761:34;29812:19;;22323:111:0::1;29611:226:1::0;22323:111:0::1;22447:26;::::0;;;:11:::1;:26;::::0;;;;;;;:42:::1;::::0;::::1;:51:::0;;;22509:45;;-1:-1:-1;;22509:45:0::1;::::0;::::1;::::0;;22579:22;;;22509:38:::1;22579:22:::0;;;;;;:27:::1;::::0;22571:35;::::1;22567:109;;;22623:41;22644:11;22657:6;22623:20;:41::i;:::-;22693:74;::::0;;17999:25:1;;;18055:2;18040:18;;18033:34;;;18083:18;;;18076:34;;;22734:11:0;;22722:10:::1;::::0;22709:11;;22693:74:::1;::::0;17987:2:1;17972:18;22693:74:0::1;;;;;;;22034:743;;5911:468:::0;;21873:904;;;;;:::o;8261:184::-;8370:10:::1;8345:36;::::0;;;:24:::1;:36;::::0;;;;;;;;:42;;;8403:34;;15502:51:1;;;15569:18;;15562:34;;;8403::0::1;::::0;15475:18:1;8403:34:0::1;;;;;;;8261:184:::0;:::o;16404:296::-;5129:1;5096:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;5096:30:0;;;;5088:66;;;;-1:-1:-1;;;5088:66:0;;;;;;;:::i;:::-;5174:22;;;;:9;:22;;;;;:45;;;;;5173:46;5165:99;;;;-1:-1:-1;;;5165:99:0;;;;;;;:::i;:::-;5275:18;5296:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;5296:34:0;;;;5349:25;;;:66;;;5399:15;5378:37;;:11;:37;;;5349:66;5341:121;;;;-1:-1:-1;;;5341:121:0;;;;;;;:::i;:::-;5473:17;5493:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;5493:33:0;;;;5545:15;;;:56;;;5585:15;5564:37;;:10;:37;;;;5545:56;5537:98;;;;-1:-1:-1;;;5537:98:0;;;;;;;:::i;:::-;16549:22:::1;::::0;;;:9:::1;:22;::::0;;;;:29:::1;;::::0;:41:::1;::::0;16581:9:::1;::::0;16549:41:::1;:::i;:::-;16517:22;::::0;;;:9:::1;:22;::::0;;;;;;:29:::1;;:73:::0;;;16606:86;16681:10:::1;::::0;16527:11;;16606:86:::1;::::0;::::1;::::0;16639:9:::1;::::0;16517:73;34784:25:1;;;34840:2;34825:18;;34818:34;34772:2;34757:18;;34739:119;16606:86:0::1;;;;;;;;5077:579:::0;;16404:296;;:::o;11417:973::-;11652:7;11682:22;;;:9;:22;;;;;;11674:58;;;;-1:-1:-1;;;11674:58:0;;25404:2:1;11674:58:0;;;25386:21:1;25443:2;25423:18;;;25416:30;-1:-1:-1;;;25462:18:1;;;25455:49;25521:18;;11674:58:0;25376:169:1;11674:58:0;11745:20;11795:11;11808:10;11820:8;11778:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11768:62;;;;;;11745:85;;11841:19;11890:12;11904:10;11916:7;11933:1;11945:4;11952:10;11964:5;11873:97;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11863:108;;;;;;11841:130;;12195:12;12160:10;-1:-1:-1;;;;;12132:133:0;12147:11;12132:133;12172:11;12185:8;12209:10;12221:7;12230:10;12242:5;12249:15;12132:133;;;;;;;;;;;;:::i;:::-;;;;;;;;12276:75;12289:11;12302:12;12316:10;12328:7;12337:10;12349:1;12276:12;:75::i;:::-;12371:11;11417:973;-1:-1:-1;;;;;;;;11417:973:0:o;17199:400::-;5129:1;5096:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;5096:30:0;;;;5088:66;;;;-1:-1:-1;;;5088:66:0;;;;;;;:::i;:::-;5174:22;;;;:9;:22;;;;;:45;;;;;5173:46;5165:99;;;;-1:-1:-1;;;5165:99:0;;;;;;;:::i;:::-;5275:18;5296:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;5296:34:0;;;;5349:25;;;:66;;;5399:15;5378:37;;:11;:37;;;5349:66;5341:121;;;;-1:-1:-1;;;5341:121:0;;;;;;;:::i;:::-;5473:17;5493:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;5493:33:0;;;;5545:15;;;:56;;;5585:15;5564:37;;:10;:37;;;;5545:56;5537:98;;;;-1:-1:-1;;;5537:98:0;;;;;;;:::i;:::-;17352:11:::1;6625:1;6613:9;:13;6605:47;;;;-1:-1:-1::0;;;6605:47:0::1;;;;;;;:::i;:::-;6664:20;6687:22:::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;6729:17;6725:256:::1;;6785:22;::::0;;;:9:::1;:22;::::0;;;;:31:::1;;::::0;6771:9:::1;:46;;6763:87;;;;-1:-1:-1::0;;;6763:87:0::1;;;;;;;:::i;:::-;6725:256;;;6905:16;:12:::0;6920:1:::1;6905:16;:::i;:::-;6891:9;:31;;6883:86;;;;-1:-1:-1::0;;;6883:86:0::1;;;;;;;:::i;:::-;17409:11:::0;17422:12;7110:16;;7106:134:::2;;7151:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;7151:43:0::2;7143:85;;;;-1:-1:-1::0;;;7143:85:0::2;;;;;;;:::i;:::-;17469:70:::3;17489:11;17502:6;17510:10;17522:9;17533:5;17469:19;:70::i;:::-;17550:41;17571:11;17584:6;17550:20;:41::i;:::-;6991:1:::2;;6594:406:::1;5647:1;5077:579:::0;;17199:400;;;;:::o;28798:291::-;28867:4;28905:22;;;:9;:22;;;;;:34;;;;28960:45;;;;;-1:-1:-1;;;28905:34:0;;;;;;28960:45;;28959:46;:76;;;;-1:-1:-1;29010:24:0;;;;;28959:76;:120;;;;;29062:15;29040:38;;:11;:38;;;;28959:120;28950:131;28798:291;-1:-1:-1;;;28798:291:0:o;8832:361::-;8954:14:::1;::::0;8921:7;8979:13;;;:9:::1;:13;::::0;;;;;;;8995:12:::1;8979:28:::0;;9050:25;8921:7;;8954:14;9050:25:::1;::::0;9067:7;;9050:25:::1;;:::i;:::-;;::::0;;-1:-1:-1;;9050:25:0;;::::1;::::0;;;;;;9040:36;;9050:25:::1;9040:36:::0;;::::1;::::0;9018:19:::1;::::0;;;:15:::1;:19:::0;;;;;;:58;9111:10:::1;::::0;9034:2;;9092:39:::1;::::0;::::1;::::0;9123:7;;9092:39:::1;:::i;:::-;;;;;;;;9159:6;:2:::0;9164:1:::1;9159:6;:::i;:::-;9142:14;:23:::0;9183:2;-1:-1:-1;4864:1:0::1;8832:361:::0;;;:::o;10078:446::-;10359:7;10379:19;10401:23;10416:7;10401:14;:23::i;:::-;10379:45;;10442:74;10454:11;10467:8;10477:10;10489:7;10498:10;10510:5;10442:11;:74::i;29309:180::-;29420:7;29379:11;6451:24;6463:11;6451;:24::i;:::-;6443:63;;;;-1:-1:-1;;;6443:63:0;;;;;;;:::i;:::-;-1:-1:-1;;29447:22:0::1;::::0;;;:9:::1;:22;::::0;;;;;;;:34:::1;::::0;;29309:180::o;30414:714::-;30492:7;30512:14;30529:22;30539:11;30529:9;:22::i;:::-;30512:39;-1:-1:-1;;;30566:27:0;;30562:535;;;30646:22;30671:31;;;:18;:31;;;;;;30725:30;30717:98;;;;-1:-1:-1;;;30717:98:0;;33481:2:1;30717:98:0;;;33463:21:1;33520:2;33500:18;;;33493:30;33559:34;33539:18;;;33532:62;33630:25;33610:18;;;33603:53;33673:19;;30717:98:0;33453:245:1;30717:98:0;30938:25;30948:14;30938:9;:25::i;:::-;30929:34;-1:-1:-1;;;30986:27:0;;;30978:107;;;;-1:-1:-1;;;30978:107:0;;27697:2:1;30978:107:0;;;27679:21:1;27736:2;27716:18;;;27709:30;27775:34;27755:18;;;27748:62;27846:34;27826:18;;;27819:62;-1:-1:-1;;;27897:19:1;;;27890:34;27941:19;;30978:107:0;27669:297:1;30978:107:0;30595:502;30562:535;31114:6;30414:714;-1:-1:-1;;30414:714:0:o;27508:1105::-;27732:18;27781:22;;;:9;:22;;;;;:35;;;;27867:27;;;;;27753:157;;27781:35;27818:17;;27837:28;;27896:13;27753:27;:157::i;:::-;27732:178;;27923:13;28141;:71;;;;-1:-1:-1;28159:41:0;;;;:11;:41;;;;;:53;;;;;;28158:54;28141:71;28137:406;;;28237:41;;;;:11;:41;;;;;:51;:77;28298:15;28237:77;;:51;;:77;28229:145;;;;-1:-1:-1;;;28229:145:0;;23808:2:1;28229:145:0;;;23790:21:1;23847:2;23827:18;;;23820:30;23886:34;23866:18;;;23859:62;23957:25;23937:18;;;23930:53;24000:19;;28229:145:0;23780:245:1;28229:145:0;-1:-1:-1;28397:14:0;28137:406;;;28453:22;;;;:9;:22;;;;;;;;:34;;:44;;28452:79;;28517:14;28452:79;;;28501:13;28452:79;28444:87;;28137:406;28553:52;28578:11;28591:6;28599:5;28553:24;:52::i;20260:626::-;5129:1;5096:22;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;5096:30:0;;;;5088:66;;;;-1:-1:-1;;;5088:66:0;;;;;;;:::i;:::-;5174:22;;;;:9;:22;;;;;:45;;;;;5173:46;5165:99;;;;-1:-1:-1;;;5165:99:0;;;;;;;:::i;:::-;5275:18;5296:22;;;:9;:22;;;;;:34;;;-1:-1:-1;;;5296:34:0;;;;5349:25;;;:66;;;5399:15;5378:37;;:11;:37;;;5349:66;5341:121;;;;-1:-1:-1;;;5341:121:0;;;;;;;:::i;:::-;5473:17;5493:22;;;:9;:22;;;;;:33;;;-1:-1:-1;;;5493:33:0;;;;5545:15;;;:56;;;5585:15;5564:37;;:10;:37;;;;5545:56;5537:98;;;;-1:-1:-1;;;5537:98:0;;;;;;;:::i;:::-;20447:11:::1;6625:1;6613:9;:13;6605:47;;;;-1:-1:-1::0;;;6605:47:0::1;;;;;;;:::i;:::-;6664:20;6687:22:::0;;;:9:::1;:22;::::0;;;;:27:::1;;::::0;6729:17;6725:256:::1;;6785:22;::::0;;;:9:::1;:22;::::0;;;;:31:::1;;::::0;6771:9:::1;:46;;6763:87;;;;-1:-1:-1::0;;;6763:87:0::1;;;;;;;:::i;:::-;6725:256;;;6905:16;:12:::0;6920:1:::1;6905:16;:::i;:::-;6891:9;:31;;6883:86;;;;-1:-1:-1::0;;;6883:86:0::1;;;;;;;:::i;:::-;20504:11:::0;20517:12;7110:16;;7106:134:::2;;7151:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;7151:43:0::2;7143:85;;;;-1:-1:-1::0;;;7143:85:0::2;;;;;;;:::i;:::-;20600:53:::3;::::0;;::::3;::::0;::::3;13486:19:1::0;;;13521:12;;;13514:28;;;20643:9:0::3;13558:12:1::0;;;13551:28;20566:21:0::3;::::0;13595:12:1;;20600:53:0::3;::::0;;-1:-1:-1;;20600:53:0;;::::3;::::0;;;;;;20590:64;;20600:53:::3;20590:64:::0;;::::3;::::0;;-1:-1:-1;20665:16:0::3;-1:-1:-1::0;;;;;20685:25:0;::::3;::::0;20684:52:::3;;20727:9;20684:52;;;20714:10;20684:52;20665:71;;20747:44;20764:11;20777:13;20747:16;:44::i;:::-;20802:74;20822:11;20835:13;20850:8;20860:9;20871:4;20802:19;:74::i;:::-;20553:333;;6991:1:::2;;6594:406:::1;5647:1;5077:579:::0;;20260:626;;;;;:::o;25296:371::-;4738:22;;;;:9;:22;;;;;:33;;;:22;;-1:-1:-1;;;;;4738:33:0;4724:10;:47;4716:89;;;;-1:-1:-1;;;4716:89:0;;;;;;;:::i;:::-;5737:22:::1;::::0;;;:9:::1;:22;::::0;;;;:45:::1;;::::0;25415:11;;5737:45:::1;;5729:94;;;;-1:-1:-1::0;;;5729:94:0::1;;;;;;;:::i;:::-;25501:5:::2;25453:22:::0;;;:9:::2;:22;::::0;;;;:45:::2;::::0;::::2;:53:::0;;-1:-1:-1;;25453:53:0::2;::::0;;-1:-1:-1;25580:30:0::2;::::0;25554:56:::2;::::0;-1:-1:-1;;;25580:30:0;::::2;;;25561:15;25554:56;:::i;:::-;25517:22;::::0;;;:9:::2;:22;::::0;;;;;:34:::2;;:93:::0;;::::2;::::0;;;::::2;-1:-1:-1::0;;;25517:93:0::2;-1:-1:-1::0;;;;;25517:93:0;;::::2;::::0;;;::::2;::::0;;;25626:33;;25527:11;;25626:33:::2;::::0;::::2;4816:1:::1;25296:371:::0;;:::o;24532:530::-;4738:22;;;;:9;:22;;;;;:33;;;:22;;-1:-1:-1;;;;;4738:33:0;4724:10;:47;4716:89;;;;-1:-1:-1;;;4716:89:0;;;;;;;:::i;:::-;5129:1:::1;5096:22:::0;;;:9:::1;:22;::::0;;;;:30:::1;;::::0;:22;;-1:-1:-1;;;5096:30:0;::::1;;;5088:66;;;;-1:-1:-1::0;;;5088:66:0::1;;;;;;;:::i;:::-;5174:22;::::0;;;:9:::1;:22;::::0;;;;:45:::1;;::::0;::::1;;5173:46;5165:99;;;;-1:-1:-1::0;;;5165:99:0::1;;;;;;;:::i;:::-;5275:18;5296:22:::0;;;:9:::1;:22;::::0;;;;:34:::1;;::::0;-1:-1:-1;;;5296:34:0;::::1;;;5349:25:::0;;;:66:::1;;;5399:15;5378:37;;:11;:37;;;5349:66;5341:121;;;;-1:-1:-1::0;;;5341:121:0::1;;;;;;;:::i;:::-;5473:17;5493:22:::0;;;:9:::1;:22;::::0;;;;:33:::1;;::::0;-1:-1:-1;;;5493:33:0;::::1;;;5545:15:::0;;;:56:::1;;;5585:15;5564:37;;:10;:37;;;;5545:56;5537:98;;;;-1:-1:-1::0;;;5537:98:0::1;;;;;;;:::i;:::-;24744:11:::0;24757:12;7110:16;;7106:134:::2;;7151:22;::::0;;;:9:::2;:22;::::0;;;;:27:::2;;::::0;:43;-1:-1:-1;7151:43:0::2;7143:85;;;;-1:-1:-1::0;;;7143:85:0::2;;;;;;;:::i;:::-;810:1:::3;24804:22:::0;;;:9:::3;:22;::::0;;;;:34:::3;;::::0;-1:-1:-1;;;24804:34:0;::::3;:47;:34;24796:126;;;::::0;-1:-1:-1;;;24796:126:0;;26864:2:1;24796:126:0::3;::::0;::::3;26846:21:1::0;26903:2;26883:18;;;26876:30;26942:34;26922:18;;;26915:62;27013:34;26993:18;;;26986:62;-1:-1:-1;;;27064:19:1;;;27057:33;27107:19;;24796:126:0::3;26836:296:1::0;24796:126:0::3;24933:22;::::0;;;:9:::3;:22;::::0;;;;;:45:::3;;:52:::0;;-1:-1:-1;;24933:52:0::3;24981:4;24933:52;::::0;;25001:53;-1:-1:-1;;;;;25001:53:0;::::3;::::0;24943:11;;25001:53:::3;::::0;24933:22;25001:53:::3;5647:1:::2;;5077:579:::1;;4816:1;24532:530:::0;;;;:::o;26273:519::-;4738:22;;;;:9;:22;;;;;:33;;;:22;;-1:-1:-1;;;;;4738:33:0;4724:10;:47;4716:89;;;;-1:-1:-1;;;4716:89:0;;;;;;;:::i;:::-;5737:22:::1;::::0;;;:9:::1;:22;::::0;;;;:45:::1;;::::0;26433:11;;5737:45:::1;;5729:94;;;;-1:-1:-1::0;;;5729:94:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26479:24:0;::::2;26471:62;;;::::0;-1:-1:-1;;;26471:62:0;;28935:2:1;26471:62:0::2;::::0;::::2;28917:21:1::0;28974:2;28954:18;;;28947:30;29013:27;28993:18;;;28986:55;29058:18;;26471:62:0::2;28907:175:1::0;26471:62:0::2;26549:32;::::0;26574:6;;26561:11;;26549:32:::2;::::0;;;::::2;26642:5;26594:22:::0;;;:9:::2;:22;::::0;;;;:45:::2;;:53:::0;;-1:-1:-1;;26594:53:0::2;::::0;;26658:60:::2;::::0;26604:11;;26691:6;;26699:8;;26642:5;26658:19:::2;:60::i;:::-;-1:-1:-1::0;;;23922:22:0;;;;:9;:22;;;;;;;;:34;;;:43;23976:34;;:60;;-1:-1:-1;;;;;23976:60:0;-1:-1:-1;;;24020:15:0;23976:60;;;;;;26273:519::o;41513:561::-;41696:4;41765:12;41779:6;41787:4;41793;41799;41748:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41738:67;;;;;;41717:17;:88;41713:133;;;-1:-1:-1;41830:4:0;41823:11;;41713:133;41908:12;41922:6;41930:4;41936;41942:5;41891:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41881:68;;;;;;41860:17;:89;41856:135;;;-1:-1:-1;41974:5:0;41967:12;;41856:135;42002:64;;-1:-1:-1;;;42002:64:0;;18980:2:1;42002:64:0;;;18962:21:1;19019:2;18999:18;;;18992:30;19058:34;19038:18;;;19031:62;-1:-1:-1;;;19109:18:1;;;19102:52;19171:19;;42002:64:0;18952:244:1;41513:561:0;;;;;;;;:::o;42082:2584::-;42313:7;42322;42534:13;42530:492;;;42564:21;42712:26;;;:11;:26;;;;;:38;:26;;:38;;;;;42707:304;;42778:26;;;;:11;:26;;;;;42771:33;;-1:-1:-1;;42771:33:0;;;;;;-1:-1:-1;42831:12:0;;-1:-1:-1;42845:5:0;42823:28;;42707:304;42901:26;;;;:11;:26;;;;;:42;;;;;42962:33;;-1:-1:-1;;42962:33:0;;;;;;;;42901:42;-1:-1:-1;42530:492:0;43048:11;43038:6;:21;43034:1582;;;-1:-1:-1;;;;;43082:21:0;;43078:1525;;43264:4;43256:12;;-1:-1:-1;;43308:17:0;;43293:11;:32;;:69;;;;-1:-1:-1;43361:1:0;43329:22;;;:9;:22;;;;;:29;;;:33;;43293:69;43289:234;;;43417:22;;;;:9;:22;;;;;:29;;;43387:60;;43397:11;;43410:5;;43387:9;:60::i;:::-;43502:1;43470:22;;;:9;:22;;;;;:29;;:33;43289:234;43078:1525;;;43558:5;-1:-1:-1;;;;;43550:13:0;:4;-1:-1:-1;;;;;43550:13:0;;43546:1057;;44194:27;44241:4;44225:12;:20;;44224:44;;44256:12;44224:44;;;44249:4;44224:44;44194:74;-1:-1:-1;44352:65:0;44362:11;44375:5;44382:34;44194:74;44382:12;:34;:::i;44352:65::-;44528:4;44520:12;;44566:19;44551:34;;43565:1038;43546:1057;-1:-1:-1;44636:12:0;;-1:-1:-1;44650:5:0;42082:2584;;;;;;;;;;;;:::o;41307:198::-;-1:-1:-1;;;;;41422:16:0;;:9;:16;;;;;;;;;;;:24;;41441:5;;41422:24;:::i;:::-;-1:-1:-1;;;;;41403:16:0;;:9;:16;;;;;;;;;;;;:43;;;;41462:35;16295:25:1;;;41403:16:0;;41471:11;;41462:35;;16268:18:1;41462:35:0;;;;;;;41307:198;;;:::o;22785:702::-;22952:24;23006:22;;;:9;:22;;;;;;;;:35;;;22989:109;;;;23043:23;;23068:4;;23074:8;;23084:13;;22989:109;;:::i;:::-;;;;;;;;;;;;;22979:120;;;;;;22952:147;;23217:1;23210:4;:8;23206:75;;;23235:22;;;;:9;:22;;;;;:27;;:34;;;23206:75;23291:22;;;;:9;:22;;;;;;;;;:35;;:54;;;23363:116;;17572:25:1;;;17613:18;;;17606:34;;;17656:18;;;17649:34;;;23448:15:0;17714:2:1;17699:18;;17692:34;17770:14;;17763:22;17757:3;17742:19;;17735:51;-1:-1:-1;;;;;23363:116:0;;;23291:22;;23363:116;;17559:3:1;17544:19;23363:116:0;;;;;;;22941:546;22785:702;;;;;:::o;23495:247::-;23587:22;;;;:9;:22;;;;;;;;:34;;;:43;;;23704:30;;;23678:56;;-1:-1:-1;;;23704:30:0;;;;23685:15;23678:56;:::i;:::-;23641:22;;;;:9;:22;;;;;;:34;;:93;;;;;;;-1:-1:-1;;;23641:93:0;-1:-1:-1;;;;;23641:93:0;;;;;;;;;;-1:-1:-1;23495:247:0:o;14384:1766::-;4946:22;;;;:9;:22;;;;;:30;;;:22;;-1:-1:-1;;;4946:30:0;;;;:35;4938:71;;;;-1:-1:-1;;;4938:71:0;;28583:2:1;4938:71:0;;;28565:21:1;28622:2;28602:18;;;28595:30;28661:25;28641:18;;;28634:53;28704:18;;4938:71:0;28555:173:1;4938:71:0;14689:1:::1;14679:7;:11;;;14671:48;;;::::0;-1:-1:-1;;;14671:48:0;;20527:2:1;14671:48:0::1;::::0;::::1;20509:21:1::0;20566:2;20546:18;;;20539:30;20605:26;20585:18;;;20578:54;20649:18;;14671:48:0::1;20499:174:1::0;14671:48:0::1;14749:8;14739:7;:18;;;14731:65;;;::::0;-1:-1:-1;;;14731:65:0;;31497:2:1;14731:65:0::1;::::0;::::1;31479:21:1::0;31536:2;31516:18;;;31509:30;31575:34;31555:18;;;31548:62;-1:-1:-1;;;31626:18:1;;;31619:32;31668:19;;14731:65:0::1;31469:224:1::0;14731:65:0::1;14827:9;-1:-1:-1::0;;;;;15235:26:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;15265:10:0::1;-1:-1:-1::0;;;;;15265:24:0;::::1;;;15235:54;15231:353;;;-1:-1:-1::0;;;;;15329:36:0;::::1;15306:20;15329:36:::0;;;:24:::1;:36;::::0;;;;;15388:22;;::::1;;15380:71;;;::::0;-1:-1:-1;;;15380:71:0;;33076:2:1;15380:71:0::1;::::0;::::1;33058:21:1::0;33115:2;33095:18;;;33088:30;33154:34;33134:18;;;33127:62;-1:-1:-1;;;33205:18:1;;;33198:34;33249:19;;15380:71:0::1;33048:226:1::0;15380:71:0::1;15476:21;15485:12:::0;15476:6;:21:::1;:::i;:::-;-1:-1:-1::0;;;;;15536:21:0;::::1;:9;:21:::0;;;::::1;::::0;;;;;;;15467:30;;-1:-1:-1;15536:36:0::1;::::0;15560:12;;15536:36:::1;:::i;:::-;-1:-1:-1::0;;;;;15512:21:0;::::1;:9;:21:::0;;;::::1;::::0;;;;;;:60;-1:-1:-1;15231:353:0::1;15596:22;::::0;;;:9:::1;:22;::::0;;;;:50;;;15657:33:::1;;:46:::0;;15714::::1;15771:40:::0;;::::1;-1:-1:-1::0;;;15771:40:0::1;-1:-1:-1::0;;;;15714:46:0;;::::1;-1:-1:-1::0;;;15714:46:0::1;-1:-1:-1::0;;;;;;15714:46:0;;;-1:-1:-1;;;;;15657:46:0;::::1;15714::::0;;;;::::1;15771:40;;::::0;;15828:10;;15824:161:::1;;15855:22;::::0;;;:9:::1;:22;::::0;;;;;;;;:29:::1;;:38:::0;;;15913:60;;34784:25:1;;;34825:18;;;34818:34;;;15962:10:0::1;::::0;15855:22;;15913:60:::1;::::0;34757:18:1;15913:60:0::1;;;;;;;15824:161;16001:12:::0;;15997:144:::1;;16030:22;::::0;;;:9:::1;:22;::::0;;;;;;:31:::1;;:42:::0;;;16092:37;16040:11;;16092:37:::1;::::0;::::1;::::0;16064:8;16295:25:1;;16283:2;16268:18;;16250:76;16092:37:0::1;;;;;;;;14575:1575;14384:1766:::0;;;;;;;:::o;18902:410::-;950:1;19011:26;;;:11;:26;;;;;:36;;;:63;19003:109;;;;-1:-1:-1;;;19003:109:0;;30044:2:1;19003:109:0;;;30026:21:1;30083:2;30063:18;;;30056:30;30122:34;30102:18;;;30095:62;-1:-1:-1;;;30173:18:1;;;30166:31;30214:19;;19003:109:0;30016:223:1;19003:109:0;19125:25;19153:22;;;:9;:22;;;;;:30;;;:57;;1081:1;;-1:-1:-1;;;19153:30:0;;;;:57;:::i;:::-;19125:85;-1:-1:-1;19260:44:0;19125:85;19267:15;19260:44;:::i;:::-;19221:26;;;;:11;:26;;;;;;:83;;-1:-1:-1;;19221:83:0;;;;;;;;;;;;-1:-1:-1;;18902:410:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:679;246:5;299:3;292:4;284:6;280:17;276:27;266:2;;317:1;314;307:12;266:2;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:2;;;641:1;638;631:12;584:2;663:1;673:169;687:2;684:1;681:9;673:169;;;744:23;763:3;744:23;:::i;:::-;732:36;;788:12;;;;820;;;;705:1;698:9;673:169;;;-1:-1:-1;860:5:1;;256:615;-1:-1:-1;;;;;;;256:615:1:o;876:673::-;930:5;983:3;976:4;968:6;964:17;960:27;950:2;;1001:1;998;991:12;950:2;1037:6;1024:20;1063:4;1087:60;1103:43;1143:2;1103:43;:::i;1087:60::-;1169:3;1193:2;1188:3;1181:15;1221:2;1216:3;1212:12;1205:19;;1256:2;1248:6;1244:15;1308:3;1303:2;1297;1294:1;1290:10;1282:6;1278:23;1274:32;1271:41;1268:2;;;1325:1;1322;1315:12;1268:2;1347:1;1357:163;1371:2;1368:1;1365:9;1357:163;;;1428:17;;1416:30;;1466:12;;;;1498;;;;1389:1;1382:9;1357:163;;2232:531;2275:5;2328:3;2321:4;2313:6;2309:17;2305:27;2295:2;;2346:1;2343;2336:12;2295:2;2382:6;2369:20;-1:-1:-1;;;;;2404:2:1;2401:26;2398:2;;;2430:18;;:::i;:::-;2474:55;2517:2;2498:13;;-1:-1:-1;;2494:27:1;2523:4;2490:38;2474:55;:::i;:::-;2554:2;2545:7;2538:19;2600:3;2593:4;2588:2;2580:6;2576:15;2572:26;2569:35;2566:2;;;2617:1;2614;2607:12;2566:2;2682;2675:4;2667:6;2663:17;2656:4;2647:7;2643:18;2630:55;2730:1;2705:16;;;2723:4;2701:27;2694:38;;;;2709:7;2285:478;-1:-1:-1;;;2285:478:1:o;2768:163::-;2835:20;;2895:10;2884:22;;2874:33;;2864:2;;2921:1;2918;2911:12;2936:186;2995:6;3048:2;3036:9;3027:7;3023:23;3019:32;3016:2;;;3064:1;3061;3054:12;3016:2;3087:29;3106:9;3087:29;:::i;3127:1502::-;3381:6;3389;3397;3405;3413;3421;3474:3;3462:9;3453:7;3449:23;3445:33;3442:2;;;3491:1;3488;3481:12;3442:2;3531:9;3518:23;-1:-1:-1;;;;;3601:2:1;3593:6;3590:14;3587:2;;;3617:1;3614;3607:12;3587:2;3640:61;3693:7;3684:6;3673:9;3669:22;3640:61;:::i;:::-;3630:71;;3754:2;3743:9;3739:18;3726:32;3710:48;;3783:2;3773:8;3770:16;3767:2;;;3799:1;3796;3789:12;3767:2;3822:63;3877:7;3866:8;3855:9;3851:24;3822:63;:::i;:::-;3812:73;;3938:2;3927:9;3923:18;3910:32;3894:48;;3967:2;3957:8;3954:16;3951:2;;;3983:1;3980;3973:12;3951:2;4006:63;4061:7;4050:8;4039:9;4035:24;4006:63;:::i;:::-;3996:73;;4122:2;4111:9;4107:18;4094:32;4078:48;;4151:2;4141:8;4138:16;4135:2;;;4167:1;4164;4157:12;4135:2;4190:63;4245:7;4234:8;4223:9;4219:24;4190:63;:::i;:::-;4180:73;;4306:3;4295:9;4291:19;4278:33;4262:49;;4336:2;4326:8;4323:16;4320:2;;;4352:1;4349;4342:12;4320:2;4375:63;4430:7;4419:8;4408:9;4404:24;4375:63;:::i;:::-;4365:73;;4491:3;4480:9;4476:19;4463:33;4447:49;;4521:2;4511:8;4508:16;4505:2;;;4537:1;4534;4527:12;4505:2;;4560:63;4615:7;4604:8;4593:9;4589:24;4560:63;:::i;:::-;4550:73;;;3432:1197;;;;;;;;:::o;4634:180::-;4693:6;4746:2;4734:9;4725:7;4721:23;4717:32;4714:2;;;4762:1;4759;4752:12;4714:2;-1:-1:-1;4785:23:1;;4704:110;-1:-1:-1;4704:110:1:o;4819:322::-;4896:6;4904;4912;4965:2;4953:9;4944:7;4940:23;4936:32;4933:2;;;4981:1;4978;4971:12;4933:2;5017:9;5004:23;4994:33;;5046:38;5080:2;5069:9;5065:18;5046:38;:::i;:::-;5036:48;;5131:2;5120:9;5116:18;5103:32;5093:42;;4923:218;;;;;:::o;5146:1117::-;5341:6;5349;5357;5365;5373;5426:3;5414:9;5405:7;5401:23;5397:33;5394:2;;;5443:1;5440;5433:12;5394:2;5479:9;5466:23;5456:33;;5540:2;5529:9;5525:18;5512:32;-1:-1:-1;;;;;5604:2:1;5596:6;5593:14;5590:2;;;5620:1;5617;5610:12;5590:2;5643:61;5696:7;5687:6;5676:9;5672:22;5643:61;:::i;:::-;5633:71;;5757:2;5746:9;5742:18;5729:32;5713:48;;5786:2;5776:8;5773:16;5770:2;;;5802:1;5799;5792:12;5770:2;5825:63;5880:7;5869:8;5858:9;5854:24;5825:63;:::i;:::-;5815:73;;5941:2;5930:9;5926:18;5913:32;5897:48;;5970:2;5960:8;5957:16;5954:2;;;5986:1;5983;5976:12;5954:2;6009:63;6064:7;6053:8;6042:9;6038:24;6009:63;:::i;:::-;5999:73;;6125:3;6114:9;6110:19;6097:33;6081:49;;6155:2;6145:8;6142:16;6139:2;;;6171:1;6168;6161:12;6139:2;;6194:63;6249:7;6238:8;6227:9;6223:24;6194:63;:::i;:::-;6184:73;;;5384:879;;;;;;;;:::o;6268:322::-;6345:6;6353;6361;6414:2;6402:9;6393:7;6389:23;6385:32;6382:2;;;6430:1;6427;6420:12;6382:2;6466:9;6453:23;6443:33;;6523:2;6512:9;6508:18;6495:32;6485:42;;6546:38;6580:2;6569:9;6565:18;6546:38;:::i;:::-;6536:48;;6372:218;;;;;:::o;6595:535::-;6699:6;6707;6715;6723;6731;6739;6792:3;6780:9;6771:7;6767:23;6763:33;6760:2;;;6809:1;6806;6799:12;6760:2;6845:9;6832:23;6822:33;;6902:2;6891:9;6887:18;6874:32;6864:42;;6925:38;6959:2;6948:9;6944:18;6925:38;:::i;:::-;6915:48;;7010:2;6999:9;6995:18;6982:32;6972:42;;7061:3;7050:9;7046:19;7033:33;7023:43;;7085:39;7119:3;7108:9;7104:19;7085:39;:::i;:::-;7075:49;;6750:380;;;;;;;;:::o;7135:464::-;7229:6;7237;7245;7253;7261;7314:3;7302:9;7293:7;7289:23;7285:33;7282:2;;;7331:1;7328;7321:12;7282:2;7367:9;7354:23;7344:33;;7424:2;7413:9;7409:18;7396:32;7386:42;;7447:38;7481:2;7470:9;7466:18;7447:38;:::i;:::-;7437:48;;7504:37;7537:2;7526:9;7522:18;7504:37;:::i;:::-;7272:327;;;;-1:-1:-1;7272:327:1;;7588:3;7573:19;7560:33;;7272:327;-1:-1:-1;;7272:327:1:o;7604:316::-;7681:6;7689;7697;7750:2;7738:9;7729:7;7725:23;7721:32;7718:2;;;7766:1;7763;7756:12;7718:2;-1:-1:-1;;7789:23:1;;;7859:2;7844:18;;7831:32;;-1:-1:-1;7910:2:1;7895:18;;;7882:32;;7708:212;-1:-1:-1;7708:212:1:o;7925:391::-;8011:6;8019;8027;8035;8088:3;8076:9;8067:7;8063:23;8059:33;8056:2;;;8105:1;8102;8095:12;8056:2;8141:9;8128:23;8118:33;;8198:2;8187:9;8183:18;8170:32;8160:42;;8249:2;8238:9;8234:18;8221:32;8211:42;;8272:38;8306:2;8295:9;8291:18;8272:38;:::i;:::-;8262:48;;8046:270;;;;;;;:::o;8321:385::-;8407:6;8415;8423;8431;8484:3;8472:9;8463:7;8459:23;8455:33;8452:2;;;8501:1;8498;8491:12;8452:2;-1:-1:-1;;8524:23:1;;;8594:2;8579:18;;8566:32;;-1:-1:-1;8645:2:1;8630:18;;8617:32;;8696:2;8681:18;8668:32;;-1:-1:-1;8442:264:1;-1:-1:-1;8442:264:1:o;8711:322::-;8780:6;8833:2;8821:9;8812:7;8808:23;8804:32;8801:2;;;8849:1;8846;8839:12;8801:2;8889:9;8876:23;-1:-1:-1;;;;;8914:6:1;8911:30;8908:2;;;8954:1;8951;8944:12;8908:2;8977:50;9019:7;9010:6;8999:9;8995:22;8977:50;:::i;:::-;8967:60;8791:242;-1:-1:-1;;;;8791:242:1:o;9038:832::-;9160:6;9168;9176;9184;9192;9200;9253:3;9241:9;9232:7;9228:23;9224:33;9221:2;;;9270:1;9267;9260:12;9221:2;9310:9;9297:23;-1:-1:-1;;;;;9380:2:1;9372:6;9369:14;9366:2;;;9396:1;9393;9386:12;9366:2;9419:50;9461:7;9452:6;9441:9;9437:22;9419:50;:::i;:::-;9409:60;;9522:2;9511:9;9507:18;9494:32;9478:48;;9551:2;9541:8;9538:16;9535:2;;;9567:1;9564;9557:12;9535:2;;9590:52;9634:7;9623:8;9612:9;9608:24;9590:52;:::i;:::-;9580:62;;;9661:38;9695:2;9684:9;9680:18;9661:38;:::i;:::-;9651:48;;9718:37;9751:2;9740:9;9736:18;9718:37;:::i;:::-;9708:47;;9774:38;9807:3;9796:9;9792:19;9774:38;:::i;:::-;9764:48;;9859:3;9848:9;9844:19;9831:33;9821:43;;9211:659;;;;;;;;:::o;10060:679::-;10172:6;10180;10188;10196;10204;10212;10265:3;10253:9;10244:7;10240:23;10236:33;10233:2;;;10282:1;10279;10272:12;10233:2;10318:9;10305:23;10295:33;;10379:2;10368:9;10364:18;10351:32;-1:-1:-1;;;;;10398:6:1;10395:30;10392:2;;;10438:1;10435;10428:12;10392:2;10461:50;10503:7;10494:6;10483:9;10479:22;10461:50;:::i;10744:748::-;10865:6;10873;10881;10889;10897;10905;10913;10966:3;10954:9;10945:7;10941:23;10937:33;10934:2;;;10983:1;10980;10973:12;10934:2;11019:9;11006:23;10996:33;;11080:2;11069:9;11065:18;11052:32;-1:-1:-1;;;;;11099:6:1;11096:30;11093:2;;;11139:1;11136;11129:12;11093:2;11162:50;11204:7;11195:6;11184:9;11180:22;11162:50;:::i;:::-;11152:60;;;11231:38;11265:2;11254:9;11250:18;11231:38;:::i;:::-;11221:48;;11288:37;11321:2;11310:9;11306:18;11288:37;:::i;:::-;11278:47;;11344:38;11377:3;11366:9;11362:19;11344:38;:::i;:::-;11334:48;;11429:3;11418:9;11414:19;11401:33;11391:43;;11481:3;11470:9;11466:19;11453:33;11443:43;;10924:568;;;;;;;;;;:::o;11497:817::-;11627:6;11635;11643;11651;11659;11667;11675;11683;11736:3;11724:9;11715:7;11711:23;11707:33;11704:2;;;11753:1;11750;11743:12;11704:2;11789:9;11776:23;11766:33;;11850:2;11839:9;11835:18;11822:32;-1:-1:-1;;;;;11869:6:1;11866:30;11863:2;;;11909:1;11906;11899:12;11863:2;11932:50;11974:7;11965:6;11954:9;11950:22;11932:50;:::i;:::-;11922:60;;;12001:38;12035:2;12024:9;12020:18;12001:38;:::i;:::-;11991:48;;12058:37;12091:2;12080:9;12076:18;12058:37;:::i;:::-;12048:47;;12114:38;12147:3;12136:9;12132:19;12114:38;:::i;:::-;11694:620;;;;-1:-1:-1;11694:620:1;;;;12104:48;12199:3;12184:19;;12171:33;;-1:-1:-1;12251:3:1;12236:19;;12223:33;;12303:3;12288:19;12275:33;;-1:-1:-1;11694:620:1;-1:-1:-1;;11694:620:1:o;12319:258::-;12361:3;12399:5;12393:12;12426:6;12421:3;12414:19;12442:63;12498:6;12491:4;12486:3;12482:14;12475:4;12468:5;12464:16;12442:63;:::i;:::-;12559:2;12538:15;-1:-1:-1;;12534:29:1;12525:39;;;;12566:4;12521:50;;12369:208;-1:-1:-1;;12369:208:1:o;12582:714::-;12877:19;;;12984:2;12980:15;;;-1:-1:-1;;12976:24:1;;;12971:2;12962:12;;12955:46;13057:3;13035:16;;;;-1:-1:-1;;;;;;13031:43:1;13026:2;13017:12;;13010:65;13100:2;13091:12;;13084:28;;;;13146:15;;;13142:24;;13137:2;13128:12;;13121:46;13202:15;;;13198:24;13192:3;13183:13;;13176:47;13248:3;13239:13;;13232:29;13286:3;13277:13;;12867:429::o;13618:511::-;13853:19;;;13897:2;13888:12;;13881:28;;;;13934:2;13925:12;;13918:28;;;;13984:2;13980:15;;;-1:-1:-1;;13976:53:1;13962:12;;;13955:75;14077:14;14070:22;14065:3;14061:32;14055:3;14046:13;;14039:55;14119:3;14110:13;;13843:286::o;14386:276::-;14517:3;14555:6;14549:13;14571:53;14617:6;14612:3;14605:4;14597:6;14593:17;14571:53;:::i;:::-;14640:16;;;;;14525:137;-1:-1:-1;;14525:137:1:o;14667:448::-;14882:6;14877:3;14870:19;14950:10;14945:3;14941:20;14932:6;14927:3;14923:16;14919:43;14914:2;14909:3;14905:12;14898:65;14852:3;14992:6;14986:13;15008:60;15061:6;15056:2;15051:3;15047:12;15042:2;15034:6;15030:15;15008:60;:::i;:::-;15088:16;;;;15106:2;15084:25;;14860:255;-1:-1:-1;;;;14860:255:1:o;18121:220::-;18270:2;18259:9;18252:21;18233:4;18290:45;18331:2;18320:9;18316:18;18308:6;18290:45;:::i;21374:352::-;21576:2;21558:21;;;21615:2;21595:18;;;21588:30;21654;21649:2;21634:18;;21627:58;21717:2;21702:18;;21548:178::o;21731:406::-;21933:2;21915:21;;;21972:2;21952:18;;;21945:30;22011:34;22006:2;21991:18;;21984:62;-1:-1:-1;;;22077:2:1;22062:18;;22055:40;22127:3;22112:19;;21905:232::o;22142:343::-;22344:2;22326:21;;;22383:2;22363:18;;;22356:30;-1:-1:-1;;;22417:2:1;22402:18;;22395:49;22476:2;22461:18;;22316:169::o;22490:400::-;22692:2;22674:21;;;22731:2;22711:18;;;22704:30;22770:34;22765:2;22750:18;;22743:62;-1:-1:-1;;;22836:2:1;22821:18;;22814:34;22880:3;22865:19;;22664:226::o;23248:353::-;23450:2;23432:21;;;23489:2;23469:18;;;23462:30;23528:31;23523:2;23508:18;;23501:59;23592:2;23577:18;;23422:179::o;24433:353::-;24635:2;24617:21;;;24674:2;24654:18;;;24647:30;24713:31;24708:2;24693:18;;24686:59;24777:2;24762:18;;24607:179::o;24791:406::-;24993:2;24975:21;;;25032:2;25012:18;;;25005:30;25071:34;25066:2;25051:18;;25044:62;-1:-1:-1;;;25137:2:1;25122:18;;25115:40;25187:3;25172:19;;24965:232::o;25961:350::-;26163:2;26145:21;;;26202:2;26182:18;;;26175:30;26241:28;26236:2;26221:18;;26214:56;26302:2;26287:18;;26135:176::o;27137:353::-;27339:2;27321:21;;;27378:2;27358:18;;;27351:30;27417:31;27412:2;27397:18;;27390:59;27481:2;27466:18;;27311:179::o;29087:345::-;29289:2;29271:21;;;29328:2;29308:18;;;29301:30;-1:-1:-1;;;29362:2:1;29347:18;;29340:51;29423:2;29408:18;;29261:171::o;31698:404::-;31900:2;31882:21;;;31939:2;31919:18;;;31912:30;31978:34;31973:2;31958:18;;31951:62;-1:-1:-1;;;32044:2:1;32029:18;;32022:38;32092:3;32077:19;;31872:230::o;33885:720::-;34198:6;34187:9;34180:25;34241:3;34236:2;34225:9;34221:18;34214:31;34161:4;34262:46;34303:3;34292:9;34288:19;34280:6;34262:46;:::i;:::-;-1:-1:-1;;;;;34344:32:1;;;;34339:2;34324:18;;34317:60;-1:-1:-1;34396:10:1;34442:15;;;34437:2;34422:18;;34415:43;34495:15;;;;34489:3;34474:19;;34467:44;34364:3;34527:19;;34520:35;34586:3;34571:19;34564:35;34254:54;34170:435;-1:-1:-1;;34170:435:1:o;35409:275::-;35480:2;35474:9;35545:2;35526:13;;-1:-1:-1;;35522:27:1;35510:40;;-1:-1:-1;;;;;35565:34:1;;35601:22;;;35562:62;35559:2;;;35627:18;;:::i;:::-;35663:2;35656:22;35454:230;;-1:-1:-1;35454:230:1:o;35689:183::-;35749:4;-1:-1:-1;;;;;35774:6:1;35771:30;35768:2;;;35804:18;;:::i;:::-;-1:-1:-1;35849:1:1;35845:14;35861:4;35841:25;;35758:114::o;35877:128::-;35917:3;35948:1;35944:6;35941:1;35938:13;35935:2;;;35954:18;;:::i;:::-;-1:-1:-1;35990:9:1;;35925:80::o;36010:228::-;36049:3;36077:10;36114:2;36111:1;36107:10;36144:2;36141:1;36137:10;36175:3;36171:2;36167:12;36162:3;36159:21;36156:2;;;36183:18;;:::i;:::-;36219:13;;36057:181;-1:-1:-1;;;;36057:181:1:o;36243:120::-;36283:1;36309;36299:2;;36314:18;;:::i;:::-;-1:-1:-1;36348:9:1;;36289:74::o;36368:191::-;36407:1;36433:10;36470:2;36467:1;36463:10;36492:3;36482:2;;36499:18;;:::i;:::-;36537:10;;36533:20;;;;;36413:146;-1:-1:-1;;36413:146:1:o;36564:168::-;36604:7;36670:1;36666;36662:6;36658:14;36655:1;36652:21;36647:1;36640:9;36633:17;36629:45;36626:2;;;36677:18;;:::i;:::-;-1:-1:-1;36717:9:1;;36616:116::o;36737:125::-;36777:4;36805:1;36802;36799:8;36796:2;;;36810:18;;:::i;:::-;-1:-1:-1;36847:9:1;;36786:76::o;36867:258::-;36939:1;36949:113;36963:6;36960:1;36957:13;36949:113;;;37039:11;;;37033:18;37020:11;;;37013:39;36985:2;36978:10;36949:113;;;37080:6;37077:1;37074:13;37071:2;;;37115:1;37106:6;37101:3;37097:16;37090:27;37071:2;;36920:205;;;:::o;37130:135::-;37169:3;-1:-1:-1;;37190:17:1;;37187:2;;;37210:18;;:::i;:::-;-1:-1:-1;37257:1:1;37246:13;;37177:88::o;37270:127::-;37331:10;37326:3;37322:20;37319:1;37312:31;37362:4;37359:1;37352:15;37386:4;37383:1;37376:15;37402:127;37463:10;37458:3;37454:20;37451:1;37444:31;37494:4;37491:1;37484:15;37518:4;37515:1;37508:15;37534:127;37595:10;37590:3;37586:20;37583:1;37576:31;37626:4;37623:1;37616:15;37650:4;37647:1;37640:15;37666:127;37727:10;37722:3;37718:20;37715:1;37708:31;37758:4;37755:1;37748:15;37782:4;37779:1;37772:15

Swarm Source

ipfs://05531d2892fcdeb48472a864e59887b41c9670a9e5c69b4cabf85caa744b2557

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.