{
    "schemaVersion": "2.0.0",
    "contractName": "TestDydxBridge",
    "compilerOutput": {
        "abi": [
            {
                "inputs": [
                    {
                        "internalType": "address[]",
                        "name": "holders",
                        "type": "address[]"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "constructor"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "inputToken",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "outputToken",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "inputTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "outputTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    }
                ],
                "name": "ERC20BridgeTransfer",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "owner",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "number",
                        "type": "uint256"
                    }
                ],
                "name": "OperateAccount",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "enum IDydx.ActionType",
                        "name": "actionType",
                        "type": "uint8"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "accountIdx",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "bool",
                        "name": "amountSign",
                        "type": "bool"
                    },
                    {
                        "indexed": false,
                        "internalType": "enum IDydx.AssetDenomination",
                        "name": "amountDenomination",
                        "type": "uint8"
                    },
                    {
                        "indexed": false,
                        "internalType": "enum IDydx.AssetReference",
                        "name": "amountRef",
                        "type": "uint8"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "amountValue",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "primaryMarketId",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "secondaryMarketId",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "otherAddress",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "otherAccountId",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "bytes",
                        "name": "data",
                        "type": "bytes"
                    }
                ],
                "name": "OperateAction",
                "type": "event"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    },
                    {
                        "internalType": "bytes",
                        "name": "encodedBridgeData",
                        "type": "bytes"
                    }
                ],
                "name": "bridgeTransferFrom",
                "outputs": [
                    {
                        "internalType": "bytes4",
                        "name": "success",
                        "type": "bytes4"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "components": [
                            {
                                "internalType": "address",
                                "name": "owner",
                                "type": "address"
                            },
                            {
                                "internalType": "uint256",
                                "name": "number",
                                "type": "uint256"
                            }
                        ],
                        "internalType": "struct IDydx.AccountInfo",
                        "name": "account",
                        "type": "tuple"
                    }
                ],
                "name": "getAdjustedAccountValues",
                "outputs": [
                    {
                        "components": [
                            {
                                "internalType": "uint256",
                                "name": "value",
                                "type": "uint256"
                            }
                        ],
                        "internalType": "struct IDydx.Value",
                        "name": "supplyValue",
                        "type": "tuple"
                    },
                    {
                        "components": [
                            {
                                "internalType": "uint256",
                                "name": "value",
                                "type": "uint256"
                            }
                        ],
                        "internalType": "struct IDydx.Value",
                        "name": "borrowValue",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "owner",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "operator",
                        "type": "address"
                    }
                ],
                "name": "getIsLocalOperator",
                "outputs": [
                    {
                        "internalType": "bool",
                        "name": "isLocalOperator",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "uint256",
                        "name": "marketId",
                        "type": "uint256"
                    }
                ],
                "name": "getMarketMarginPremium",
                "outputs": [
                    {
                        "components": [
                            {
                                "internalType": "uint256",
                                "name": "value",
                                "type": "uint256"
                            }
                        ],
                        "internalType": "struct IDydx.D256",
                        "name": "premium",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "uint256",
                        "name": "marketId",
                        "type": "uint256"
                    }
                ],
                "name": "getMarketPrice",
                "outputs": [
                    {
                        "components": [
                            {
                                "internalType": "uint256",
                                "name": "value",
                                "type": "uint256"
                            }
                        ],
                        "internalType": "struct IDydx.Price",
                        "name": "price",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "uint256",
                        "name": "marketId",
                        "type": "uint256"
                    }
                ],
                "name": "getMarketTokenAddress",
                "outputs": [
                    {
                        "internalType": "address",
                        "name": "tokenAddress",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "getRiskParams",
                "outputs": [
                    {
                        "components": [
                            {
                                "components": [
                                    {
                                        "internalType": "uint256",
                                        "name": "value",
                                        "type": "uint256"
                                    }
                                ],
                                "internalType": "struct IDydx.D256",
                                "name": "marginRatio",
                                "type": "tuple"
                            },
                            {
                                "components": [
                                    {
                                        "internalType": "uint256",
                                        "name": "value",
                                        "type": "uint256"
                                    }
                                ],
                                "internalType": "struct IDydx.D256",
                                "name": "liquidationSpread",
                                "type": "tuple"
                            },
                            {
                                "components": [
                                    {
                                        "internalType": "uint256",
                                        "name": "value",
                                        "type": "uint256"
                                    }
                                ],
                                "internalType": "struct IDydx.D256",
                                "name": "earningsRate",
                                "type": "tuple"
                            },
                            {
                                "components": [
                                    {
                                        "internalType": "uint256",
                                        "name": "value",
                                        "type": "uint256"
                                    }
                                ],
                                "internalType": "struct IDydx.Value",
                                "name": "minBorrowedValue",
                                "type": "tuple"
                            }
                        ],
                        "internalType": "struct IDydx.RiskParams",
                        "name": "riskParams",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [],
                "name": "getTestToken",
                "outputs": [
                    {
                        "internalType": "address",
                        "name": "",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            {
                                "internalType": "address",
                                "name": "owner",
                                "type": "address"
                            },
                            {
                                "internalType": "uint256",
                                "name": "number",
                                "type": "uint256"
                            }
                        ],
                        "internalType": "struct IDydx.AccountInfo[]",
                        "name": "accounts",
                        "type": "tuple[]"
                    },
                    {
                        "components": [
                            {
                                "internalType": "enum IDydx.ActionType",
                                "name": "actionType",
                                "type": "uint8"
                            },
                            {
                                "internalType": "uint256",
                                "name": "accountIdx",
                                "type": "uint256"
                            },
                            {
                                "components": [
                                    {
                                        "internalType": "bool",
                                        "name": "sign",
                                        "type": "bool"
                                    },
                                    {
                                        "internalType": "enum IDydx.AssetDenomination",
                                        "name": "denomination",
                                        "type": "uint8"
                                    },
                                    {
                                        "internalType": "enum IDydx.AssetReference",
                                        "name": "ref",
                                        "type": "uint8"
                                    },
                                    {
                                        "internalType": "uint256",
                                        "name": "value",
                                        "type": "uint256"
                                    }
                                ],
                                "internalType": "struct IDydx.AssetAmount",
                                "name": "amount",
                                "type": "tuple"
                            },
                            {
                                "internalType": "uint256",
                                "name": "primaryMarketId",
                                "type": "uint256"
                            },
                            {
                                "internalType": "uint256",
                                "name": "secondaryMarketId",
                                "type": "uint256"
                            },
                            {
                                "internalType": "address",
                                "name": "otherAddress",
                                "type": "address"
                            },
                            {
                                "internalType": "uint256",
                                "name": "otherAccountIdx",
                                "type": "uint256"
                            },
                            {
                                "internalType": "bytes",
                                "name": "data",
                                "type": "bytes"
                            }
                        ],
                        "internalType": "struct IDydx.ActionArgs[]",
                        "name": "actions",
                        "type": "tuple[]"
                    }
                ],
                "name": "operate",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            {
                                "internalType": "address",
                                "name": "operator",
                                "type": "address"
                            },
                            {
                                "internalType": "bool",
                                "name": "trusted",
                                "type": "bool"
                            }
                        ],
                        "internalType": "struct IDydx.OperatorArg[]",
                        "name": "args",
                        "type": "tuple[]"
                    }
                ],
                "name": "setOperators",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "bool",
                        "name": "shouldRevert",
                        "type": "bool"
                    }
                ],
                "name": "setRevertOnOperate",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            }
        ],
        "devdoc": {
            "methods": {
                "bridgeTransferFrom(address,address,address,uint256,bytes)": {
                    "details": "Callback for `IERC20Bridge`. Deposits or withdraws tokens from a dydx account.      Notes:         1. This bridge must be set as an operator of the input dydx account.         2. This function may only be called in the context of the 0x Exchange.         3. The maker or taker of the 0x order must be the dydx account owner.         4. Deposits into dydx are made from the `from` address.         5. Withdrawals from dydx are made to the `to` address.         6. Calling this function must always withdraw at least `amount`,            otherwise the `ERC20Bridge` will revert.",
                    "params": {
                        "amount": "Minimum amount of `toTokenAddress` tokens to deposit or withdraw.",
                        "encodedBridgeData": "An abi-encoded `BridgeData` struct.",
                        "from": "The sender of the tokens and owner of the dydx account.",
                        "to": "The recipient of the tokens."
                    },
                    "return": "success The magic bytes if successful."
                },
                "getAdjustedAccountValues((address,uint256))": {
                    "details": "Unused."
                },
                "getIsLocalOperator(address,address)": {
                    "details": "Unused."
                },
                "getMarketMarginPremium(uint256)": {
                    "details": "Unsused"
                },
                "getMarketPrice(uint256)": {
                    "details": "Unsused."
                },
                "getMarketTokenAddress(uint256)": {
                    "details": "Unused."
                },
                "getRiskParams()": {
                    "details": "Unused."
                },
                "getTestToken()": {
                    "details": "Returns test token."
                },
                "operate((address,uint256)[],(uint8,uint256,(bool,uint8,uint8,uint256),uint256,uint256,address,uint256,bytes)[])": {
                    "details": "Simulates `operate` in dydx contract.      Emits events so that arguments can be validated client-side."
                },
                "setOperators((address,bool)[])": {
                    "details": "Unused."
                },
                "setRevertOnOperate(bool)": {
                    "details": "If `true` then subsequent calls to `operate` will revert."
                }
            }
        },
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x60806040523480156200001157600080fd5b5060405162002494380380620024948339810160408190526200003491620000c0565b80604051620000439062000094565b6200004f919062000175565b604051809103906000f0801580156200006c573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905550620001ea565b6103e280620020b283390190565b80516001600160a01b0381168114620000ba57600080fd5b92915050565b60006020808385031215620000d3578182fd5b82516001600160401b0380821115620000ea578384fd5b81850186601f820112620000fc578485fd5b80519250818311156200010d578485fd5b83830291506200011f848301620001c3565b8381528481019082860184840187018a10156200013a578788fd5b8794505b858510156200016857620001538a82620000a2565b8352600194909401939186019186016200013e565b5098975050505050505050565b602080825282518282018190526000918401906040840190835b81811015620001b85783516001600160a01b03168352602093840193909201916001016200018f565b509095945050505050565b6040518181016001600160401b0381118282101715620001e257600080fd5b604052919050565b611eb880620001fa6000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063a67a6a4511610081578063c576501b1161005b578063c576501b1461019c578063f9416052146101af578063fd04b60614610141576100c9565b8063a67a6a4514610161578063abb28b9214610174578063c2df82e61461017c576100c9565b806369794795116100b2578063697947951461011757806385b53fc81461012c5780638928378e14610141576100c9565b8063062bd3e9146100ce5780633a031bf0146100f7575b600080fd5b6100e16100dc3660046117dc565b6101d0565b6040516100ee919061199f565b60405180910390f35b61010a6101053660046114b7565b6101d6565b6040516100ee9190611ad4565b61011f6101de565b6040516100ee9190611da6565b61013f61013a36600461162a565b6101e9565b005b61015461014f3660046117dc565b6101ed565b6040516100ee9190611d9c565b61013f61016f366004611595565b6101fa565b6100e1610b5a565b61018f61018a3660046114eb565b610b76565b6040516100ee9190611adf565b61013f6101aa36600461166a565b610cbb565b6101c26101bd3660046116dd565b610d05565b6040516100ee929190611dd5565b50600090565b600092915050565b6101e6611237565b90565b5050565b6101f5611276565b919050565b60005474010000000000000000000000000000000000000000900460ff1615610258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611cab565b60405180910390fd5b60005b838110156102da577fbd1b601b3f796370ce99b97e1950ecfe75d4d83dae7d449a6c73437df651f43185858381811061029057fe5b6102a6926020604090920201908101915061149c565b8686848181106102b257fe5b905060400201602001356040516102ca9291906119f1565b60405180910390a160010161025b565b5060005b81811015610b53577ffcf8784aafcb4a0ee28cb2be23b7ffa40261226fc10a3442dfb27ac523dcde8683838381811061031357fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261034d57600080fd5b61035d92016020810191506116a2565b84848481811061036957fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126103a357600080fd5b80830192505050602001358585858181106103ba57fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126103f457600080fd5b610407920160608101915060400161166a565b86868681811061041357fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261044d57600080fd5b61046092016080810191506060016116c1565b87878781811061046c57fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126104a657600080fd5b6104b9920160a0810191506080016116c1565b8888888181106104c557fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126104ff57600080fd5b90910160a00135905089898981811061051457fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261054e57600080fd5b8083019250505060c001358a8a8a81811061056557fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261059f57600080fd5b8083019250505060e001358b8b8b8181106105b657fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126105f057600080fd5b6106059201610120810191506101000161149c565b8c8c8c81811061061157fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261064b57600080fd5b8083019250505061012001358d8d8d81811061066357fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261069d57600080fd5b919091019050610140810180357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1368490030181126106db57600080fd5b9091016020810191503567ffffffffffffffff8111156106fa57600080fd5b3681900382131561070a57600080fd5b6040516107229c9b9a99989796959493929190611b0c565b60405180910390a1600183838381811061073857fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261077257600080fd5b61078292016020810191506116a2565b600881111561078d57fe5b14156109245760005473ffffffffffffffffffffffffffffffffffffffff166323b872dd308585858181106107be57fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126107f857600080fd5b61080d9201610120810191506101000161149c565b86868681811061081957fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261085357600080fd5b60405160e087901b7fffffffff000000000000000000000000000000000000000000000000000000001681526108979594939190910160a0013591506004016119c0565b602060405180830381600087803b1580156108b157600080fd5b505af11580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108e99190810190611686565b61091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611d08565b610b4b565b600083838381811061093257fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261096c57600080fd5b61097c92016020810191506116a2565b600881111561098757fe5b1415610b195760005473ffffffffffffffffffffffffffffffffffffffff166323b872dd8484848181106109b757fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126109f157600080fd5b610a069201610120810191506101000161149c565b30868686818110610a1357fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea136849003018112610a4d57600080fd5b60405160e087901b7fffffffff00000000000000000000000000000000000000000000000000000000168152610a919594939190910160a0013591506004016119c0565b602060405180830381600087803b158015610aab57600080fd5b505af1158015610abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ae39190810190611686565b61091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611c17565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611c4e565b6001016102de565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000610b80610d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611bba565b610bec611289565b610bf8838501856116f4565b90506060610c068883610d32565b90506060610c1689898986610de8565b9050610c20610f25565b73ffffffffffffffffffffffffffffffffffffffff1663a67a6a4583836040518363ffffffff1660e01b8152600401610c5a929190611a17565b600060405180830381600087803b158015610c7457600080fd5b505af1158015610c88573d6000803e3d6000fd5b507fdc1600f3000000000000000000000000000000000000000000000000000000009d9c50505050505050505050505050565b6000805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610d0d611276565b610d15611276565b915091565b600033600114610d2a5733610d2d565b60005b905090565b805180516040805182815260208084028201019091526060929190818015610d7457816020015b610d616112a3565b815260200190600190039081610d595790505b50925060005b81811015610ddf5760405180604001604052808773ffffffffffffffffffffffffffffffffffffffff168152602001848381518110610db557fe5b6020026020010151815250848281518110610dcc57fe5b6020908102919091010152600101610d7a565b50505092915050565b60208082015180516040805182815282850281019094019052606092818015610e2b57816020015b610e186112ba565b815260200190600190039081610e105790505b50925060005b81811015610f1a57610e41611319565b838281518110610e4d57fe5b6020026020010151905060008082608001511115610e7f57610e78826060015183608001518a610f29565b9050610e82565b50865b600082516001811115610e9157fe5b1415610ebe57610ea28a8284610f78565b868481518110610eae57fe5b6020026020010181905250610f10565b600182516001811115610ecd57fe5b1415610ede57610ea2898284611025565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611d3f565b5050600101610e31565b505050949350505050565b3090565b6000610f3684848461106a565b15610f4e57610f4e610f498585856110d0565b611175565b610f6e83610f62868563ffffffff61117d16565b9063ffffffff6111b716565b90505b9392505050565b610f806112ba565b610f88611349565b6040805160808101909152600181526020810160008152602001600081526020018590526040805161010081019091529091508060005b81526020018460200151815260200182815260200184604001518152602001600081526020018673ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001604051806020016040528060008152508152509150509392505050565b61102d6112ba565b611035611349565b506040805160808101825260008082526020820181905281830152606081018590528151610100810190925290806001610fbf565b60008261107c5761107c610f496111e1565b811580611087575083155b1561109457506000610f71565b6000838061109e57fe5b85840990506110b3858463ffffffff61117d16565b6110c5826103e863ffffffff61117d16565b101595945050505050565b606063339f3de260e01b8484846040516024016110ef93929190611de5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b60008261118c575060006111b1565b8282028284828161119957fe5b04146111ae576111ae610f4960018686611218565b90505b92915050565b6000816111cd576111cd610f4960038585611218565b60008284816111d857fe5b04949350505050565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b606063e946c1bb60e01b8484846040516024016110ef93929190611b98565b604051806080016040528061124a611276565b8152602001611257611276565b8152602001611264611276565b8152602001611271611276565b905290565b6040518060200160405280600081525090565b604051806040016040528060608152602001606081525090565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201529081016112da611349565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040805160a081019091528060008152602001600081526020016000815260200160008152602001600081525090565b604080516080810190915260008082526020820190815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff811681146111b157600080fd5b60008083601f8401126113a7578182fd5b50813567ffffffffffffffff8111156113be578182fd5b6020830191508360206040830285010111156113d957600080fd5b9250929050565b600082601f8301126113f0578081fd5b81356114036113fe82611e22565b611dfb565b818152915060208083019084810160a084028601820187101561142557600080fd5b60005b848110156114915760a0828903121561144057600080fd5b61144a60a0611dfb565b823561145581611e68565b8152828401358482015260408084013590820152606080840135908201526080808401359082015284529282019260a090910190600101611428565b505050505092915050565b6000602082840312156114ad578081fd5b610f718383611372565b600080604083850312156114c9578081fd5b6114d38484611372565b91506114e28460208501611372565b90509250929050565b60008060008060008060a08789031215611503578182fd5b61150d8888611372565b955061151c8860208901611372565b945061152b8860408901611372565b935060608701359250608087013567ffffffffffffffff8082111561154e578384fd5b8189018a601f82011261155f578485fd5b803592508183111561156f578485fd5b8a6020848301011115611580578485fd5b979a9699509497509295602001949293505050565b600080600080604085870312156115aa578384fd5b843567ffffffffffffffff808211156115c1578586fd5b6115cd88838901611396565b909650945060208701359150808211156115e5578384fd5b81870188601f8201126115f6578485fd5b8035925081831115611606578485fd5b8860208085028301011115611619578485fd5b959894975050602090940194505050565b6000806020838503121561163c578182fd5b823567ffffffffffffffff811115611652578283fd5b61165e85828601611396565b90969095509350505050565b60006020828403121561167b578081fd5b81356111ae81611e5a565b600060208284031215611697578081fd5b81516111ae81611e5a565b6000602082840312156116b3578081fd5b8135600981106111ae578182fd5b6000602082840312156116d2578081fd5b81356111ae81611e68565b6000604082840312156116ee578081fd5b50919050565b60006020808385031215611706578182fd5b823567ffffffffffffffff8082111561171d578384fd5b8185016040818803121561172f578485fd5b6117396040611dfb565b9250803582811115611749578586fd5b80820188601f82011261175a578687fd5b8035915061176a6113fe83611e22565b82815286810190828801888502840189018c101561178657898afd5b8993505b848410156117a857803583526001939093019291880191880161178a565b50865250505080840135828111156117be578586fd5b6117ca888284016113e0565b85850152505050809250505092915050565b6000602082840312156117ed578081fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60008151808452815b8181101561187b5760208185018101518683018201520161185f565b8181111561188c5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805173ffffffffffffffffffffffffffffffffffffffff168252602090810151910152565b60006101608251600981106118f557fe5b80855250602083015160208501526040830151611915604086018261196a565b50606083015160c0850152608083015160e085015260a083015161193d6101008601826117f4565b5060c083015161012085015260e08301518161014086015261196182860182611856565b95945050505050565b80511515825261197d6020820151611e42565b602083015261198f6040820151611e42565b6040830152606090810151910152565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015611a5a57611a478483516118bf565b6040939093019290840190600101611a34565b5050508381038285015284518082528282019080840283018401878501865b83811015611ac5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552611ab38383516118e4565b94870194925090860190600101611a79565b50909998505050505050505050565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b600061016060098f10611b1b57fe5b8e83528d60208401528c15156040840152611b358c611e4d565b8b6060840152611b448b611e4d565b8a60808401528960a08401528860c08401528760e0840152611b6a6101008401886117f4565b8561012084015280610140840152611b85818401858761180e565b9f9e505050505050505050505050505050565b6060810160048510611ba657fe5b938152602081019290925260409091015290565b6020808252602e908201527f447964784272696467652f4f4e4c595f43414c4c41424c455f42595f4552433260408201527f305f4252494447455f50524f5859000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f54657374447964784272696467652f4445504f5349545f4641494c4544000000604082015260600190565b60208082526021908201527f54657374447964784272696467652f554e535550504f525445445f414354494f60408201527f4e00000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f54657374447964784272696467652f53484f554c445f5245564552545f4f4e5f60408201527f4f50455241544500000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f54657374447964784272696467652f57495448445241575f4641494c45440000604082015260600190565b60208082526025908201527f447964784272696467652f554e5245434f474e495a45445f4252494447455f4160408201527f4354494f4e000000000000000000000000000000000000000000000000000000606082015260800190565b9051815260200190565b815151815260208083015151908201526040808301515190820152606091820151519181019190915260800190565b9151825251602082015260400190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715611e1a57600080fd5b604052919050565b600067ffffffffffffffff821115611e38578081fd5b5060209081020190565b80600281106101f557fe5b60028110611e5757fe5b50565b8015158114611e5757600080fd5b60028110611e5757600080fdfea365627a7a7231582071cec95163956a4b51ce1a857d24a05579ec4c0df278bd936def8cc98e4abc866c6578706572696d656e74616cf564736f6c63430005110040608060405234801561001057600080fd5b506040516103e23803806103e283398101604081905261002f916100bc565b60005b8151811461007e57678ac7230489e8000060008084848151811061005257fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055600101610032565b5050336000908152602081905260409020678ac7230489e80000905561018c565b80516001600160a01b03811681146100b657600080fd5b92915050565b600060208083850312156100ce578182fd5b82516001600160401b03808211156100e4578384fd5b81850186601f8201126100f5578485fd5b8051925081831115610105578485fd5b8383029150610115848301610166565b8381528481019082860184840187018a101561012f578788fd5b8794505b85851015610159576101458a8261009f565b835260019490940193918601918601610133565b5098975050505050505050565b6040518181016001600160401b038111828210171561018457600080fd5b604052919050565b6102478061019b6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806323b872dd1461003b57806370a0823114610064575b600080fd5b61004e61004936600461018b565b610084565b60405161005b91906101cb565b60405180910390f35b610077610072366004610157565b61012f565b60405161005b91906101d6565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120548211806100dd575073ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054828101105b156100ea57506000610128565b5073ffffffffffffffffffffffffffffffffffffffff8084166000908152602081905260408082208054859003905591841681522080548201905560015b9392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b600060208284031215610168578081fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610128578182fd5b60008060006060848603121561019f578182fd5b83356101aa816101df565b925060208401356101ba816101df565b929592945050506040919091013590565b901515815260200190565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff8116811461020157600080fd5b5056fea365627a7a723158207a68324378440e0f8adb19b69c4a69251db4a4102a17d91599423758d7c313846c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2494 CODESIZE SUB DUP1 PUSH3 0x2494 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0xC0 JUMP JUMPDEST DUP1 PUSH1 0x40 MLOAD PUSH3 0x43 SWAP1 PUSH3 0x94 JUMP JUMPDEST PUSH3 0x4F SWAP2 SWAP1 PUSH3 0x175 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH3 0x6C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP PUSH3 0x1EA JUMP JUMPDEST PUSH2 0x3E2 DUP1 PUSH3 0x20B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0xBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH3 0xD3 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH3 0xEA JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH3 0xFC JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 MLOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH3 0x10D JUMPI DUP5 DUP6 REVERT JUMPDEST DUP4 DUP4 MUL SWAP2 POP PUSH3 0x11F DUP5 DUP4 ADD PUSH3 0x1C3 JUMP JUMPDEST DUP4 DUP2 MSTORE DUP5 DUP2 ADD SWAP1 DUP3 DUP7 ADD DUP5 DUP5 ADD DUP8 ADD DUP11 LT ISZERO PUSH3 0x13A JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP5 POP JUMPDEST DUP6 DUP6 LT ISZERO PUSH3 0x168 JUMPI PUSH3 0x153 DUP11 DUP3 PUSH3 0xA2 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP7 ADD SWAP2 DUP7 ADD PUSH3 0x13E JUMP JUMPDEST POP SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP5 ADD SWAP1 PUSH1 0x40 DUP5 ADD SWAP1 DUP4 JUMPDEST DUP2 DUP2 LT ISZERO PUSH3 0x1B8 JUMPI DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH3 0x18F JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x1E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1EB8 DUP1 PUSH3 0x1FA PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA67A6A45 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xC576501B GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xC576501B EQ PUSH2 0x19C JUMPI DUP1 PUSH4 0xF9416052 EQ PUSH2 0x1AF JUMPI DUP1 PUSH4 0xFD04B606 EQ PUSH2 0x141 JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0xA67A6A45 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0xABB28B92 EQ PUSH2 0x174 JUMPI DUP1 PUSH4 0xC2DF82E6 EQ PUSH2 0x17C JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0x69794795 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x69794795 EQ PUSH2 0x117 JUMPI DUP1 PUSH4 0x85B53FC8 EQ PUSH2 0x12C JUMPI DUP1 PUSH4 0x8928378E EQ PUSH2 0x141 JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0x62BD3E9 EQ PUSH2 0xCE JUMPI DUP1 PUSH4 0x3A031BF0 EQ PUSH2 0xF7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE1 PUSH2 0xDC CALLDATASIZE PUSH1 0x4 PUSH2 0x17DC JUMP JUMPDEST PUSH2 0x1D0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x199F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x10A PUSH2 0x105 CALLDATASIZE PUSH1 0x4 PUSH2 0x14B7 JUMP JUMPDEST PUSH2 0x1D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x1AD4 JUMP JUMPDEST PUSH2 0x11F PUSH2 0x1DE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x1DA6 JUMP JUMPDEST PUSH2 0x13F PUSH2 0x13A CALLDATASIZE PUSH1 0x4 PUSH2 0x162A JUMP JUMPDEST PUSH2 0x1E9 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x154 PUSH2 0x14F CALLDATASIZE PUSH1 0x4 PUSH2 0x17DC JUMP JUMPDEST PUSH2 0x1ED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x1D9C JUMP JUMPDEST PUSH2 0x13F PUSH2 0x16F CALLDATASIZE PUSH1 0x4 PUSH2 0x1595 JUMP JUMPDEST PUSH2 0x1FA JUMP JUMPDEST PUSH2 0xE1 PUSH2 0xB5A JUMP JUMPDEST PUSH2 0x18F PUSH2 0x18A CALLDATASIZE PUSH1 0x4 PUSH2 0x14EB JUMP JUMPDEST PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0x13F PUSH2 0x1AA CALLDATASIZE PUSH1 0x4 PUSH2 0x166A JUMP JUMPDEST PUSH2 0xCBB JUMP JUMPDEST PUSH2 0x1C2 PUSH2 0x1BD CALLDATASIZE PUSH1 0x4 PUSH2 0x16DD JUMP JUMPDEST PUSH2 0xD05 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP3 SWAP2 SWAP1 PUSH2 0x1DD5 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1E6 PUSH2 0x1237 JUMP JUMPDEST SWAP1 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x1F5 PUSH2 0x1276 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x258 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1CAB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2DA JUMPI PUSH32 0xBD1B601B3F796370CE99B97E1950ECFE75D4D83DAE7D449A6C73437DF651F431 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x290 JUMPI INVALID JUMPDEST PUSH2 0x2A6 SWAP3 PUSH1 0x20 PUSH1 0x40 SWAP1 SWAP3 MUL ADD SWAP1 DUP2 ADD SWAP2 POP PUSH2 0x149C JUMP JUMPDEST DUP7 DUP7 DUP5 DUP2 DUP2 LT PUSH2 0x2B2 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x40 MUL ADD PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x40 MLOAD PUSH2 0x2CA SWAP3 SWAP2 SWAP1 PUSH2 0x19F1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 ADD PUSH2 0x25B JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB53 JUMPI PUSH32 0xFCF8784AAFCB4A0EE28CB2BE23B7FFA40261226FC10A3442DFB27AC523DCDE86 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x313 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x34D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x35D SWAP3 ADD PUSH1 0x20 DUP2 ADD SWAP2 POP PUSH2 0x16A2 JUMP JUMPDEST DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x369 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x3A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 ADD SWAP3 POP POP POP PUSH1 0x20 ADD CALLDATALOAD DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x3BA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x407 SWAP3 ADD PUSH1 0x60 DUP2 ADD SWAP2 POP PUSH1 0x40 ADD PUSH2 0x166A JUMP JUMPDEST DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0x413 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x44D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x460 SWAP3 ADD PUSH1 0x80 DUP2 ADD SWAP2 POP PUSH1 0x60 ADD PUSH2 0x16C1 JUMP JUMPDEST DUP8 DUP8 DUP8 DUP2 DUP2 LT PUSH2 0x46C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x4A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4B9 SWAP3 ADD PUSH1 0xA0 DUP2 ADD SWAP2 POP PUSH1 0x80 ADD PUSH2 0x16C1 JUMP JUMPDEST DUP9 DUP9 DUP9 DUP2 DUP2 LT PUSH2 0x4C5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x4FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 ADD PUSH1 0xA0 ADD CALLDATALOAD SWAP1 POP DUP10 DUP10 DUP10 DUP2 DUP2 LT PUSH2 0x514 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x54E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 ADD SWAP3 POP POP POP PUSH1 0xC0 ADD CALLDATALOAD DUP11 DUP11 DUP11 DUP2 DUP2 LT PUSH2 0x565 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x59F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 ADD SWAP3 POP POP POP PUSH1 0xE0 ADD CALLDATALOAD DUP12 DUP12 DUP12 DUP2 DUP2 LT PUSH2 0x5B6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x5F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x605 SWAP3 ADD PUSH2 0x120 DUP2 ADD SWAP2 POP PUSH2 0x100 ADD PUSH2 0x149C JUMP JUMPDEST DUP13 DUP13 DUP13 DUP2 DUP2 LT PUSH2 0x611 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x64B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 ADD SWAP3 POP POP POP PUSH2 0x120 ADD CALLDATALOAD DUP14 DUP14 DUP14 DUP2 DUP2 LT PUSH2 0x663 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x69D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP1 POP PUSH2 0x140 DUP2 ADD DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x6DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 ADD PUSH1 0x20 DUP2 ADD SWAP2 POP CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x70A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x722 SWAP13 SWAP12 SWAP11 SWAP10 SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1B0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x738 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x772 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x782 SWAP3 ADD PUSH1 0x20 DUP2 ADD SWAP2 POP PUSH2 0x16A2 JUMP JUMPDEST PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x78D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x924 JUMPI PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x23B872DD ADDRESS DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x7BE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x7F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x80D SWAP3 ADD PUSH2 0x120 DUP2 ADD SWAP2 POP PUSH2 0x100 ADD PUSH2 0x149C JUMP JUMPDEST DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0x819 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x853 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xE0 DUP8 SWAP1 SHL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP2 MSTORE PUSH2 0x897 SWAP6 SWAP5 SWAP4 SWAP2 SWAP1 SWAP2 ADD PUSH1 0xA0 ADD CALLDATALOAD SWAP2 POP PUSH1 0x4 ADD PUSH2 0x19C0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8C5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x8E9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1686 JUMP JUMPDEST PUSH2 0x91F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1D08 JUMP JUMPDEST PUSH2 0xB4B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x932 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x96C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x97C SWAP3 ADD PUSH1 0x20 DUP2 ADD SWAP2 POP PUSH2 0x16A2 JUMP JUMPDEST PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x987 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xB19 JUMPI PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x23B872DD DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x9B7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x9F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA06 SWAP3 ADD PUSH2 0x120 DUP2 ADD SWAP2 POP PUSH2 0x100 ADD PUSH2 0x149C JUMP JUMPDEST ADDRESS DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xA13 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0xA4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xE0 DUP8 SWAP1 SHL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP2 MSTORE PUSH2 0xA91 SWAP6 SWAP5 SWAP4 SWAP2 SWAP1 SWAP2 ADD PUSH1 0xA0 ADD CALLDATALOAD SWAP2 POP PUSH1 0x4 ADD PUSH2 0x19C0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xABF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xAE3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1686 JUMP JUMPDEST PUSH2 0x91F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1C17 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1C4E JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2DE JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB80 PUSH2 0xD1A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xBE4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1BBA JUMP JUMPDEST PUSH2 0xBEC PUSH2 0x1289 JUMP JUMPDEST PUSH2 0xBF8 DUP4 DUP6 ADD DUP6 PUSH2 0x16F4 JUMP JUMPDEST SWAP1 POP PUSH1 0x60 PUSH2 0xC06 DUP9 DUP4 PUSH2 0xD32 JUMP JUMPDEST SWAP1 POP PUSH1 0x60 PUSH2 0xC16 DUP10 DUP10 DUP10 DUP7 PUSH2 0xDE8 JUMP JUMPDEST SWAP1 POP PUSH2 0xC20 PUSH2 0xF25 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA67A6A45 DUP4 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC5A SWAP3 SWAP2 SWAP1 PUSH2 0x1A17 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC88 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP14 SWAP13 POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP2 ISZERO ISZERO PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xD0D PUSH2 0x1276 JUMP JUMPDEST PUSH2 0xD15 PUSH2 0x1276 JUMP JUMPDEST SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 CALLER PUSH1 0x1 EQ PUSH2 0xD2A JUMPI CALLER PUSH2 0xD2D JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 SWAP3 SWAP2 SWAP1 DUP2 DUP1 ISZERO PUSH2 0xD74 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xD61 PUSH2 0x12A3 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xD59 JUMPI SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xDDF JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xDB5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP2 MSTORE POP DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xDCC JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xD7A JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE DUP3 DUP6 MUL DUP2 ADD SWAP1 SWAP5 ADD SWAP1 MSTORE PUSH1 0x60 SWAP3 DUP2 DUP1 ISZERO PUSH2 0xE2B JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xE18 PUSH2 0x12BA JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xE10 JUMPI SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xF1A JUMPI PUSH2 0xE41 PUSH2 0x1319 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xE4D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH1 0x0 DUP1 DUP3 PUSH1 0x80 ADD MLOAD GT ISZERO PUSH2 0xE7F JUMPI PUSH2 0xE78 DUP3 PUSH1 0x60 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD DUP11 PUSH2 0xF29 JUMP JUMPDEST SWAP1 POP PUSH2 0xE82 JUMP JUMPDEST POP DUP7 JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xE91 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xEBE JUMPI PUSH2 0xEA2 DUP11 DUP3 DUP5 PUSH2 0xF78 JUMP JUMPDEST DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xEAE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH2 0xF10 JUMP JUMPDEST PUSH1 0x1 DUP3 MLOAD PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xECD JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xEDE JUMPI PUSH2 0xEA2 DUP10 DUP3 DUP5 PUSH2 0x1025 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1D3F JUMP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0xE31 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST ADDRESS SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF36 DUP5 DUP5 DUP5 PUSH2 0x106A JUMP JUMPDEST ISZERO PUSH2 0xF4E JUMPI PUSH2 0xF4E PUSH2 0xF49 DUP6 DUP6 DUP6 PUSH2 0x10D0 JUMP JUMPDEST PUSH2 0x1175 JUMP JUMPDEST PUSH2 0xF6E DUP4 PUSH2 0xF62 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x117D AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x11B7 AND JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xF80 PUSH2 0x12BA JUMP JUMPDEST PUSH2 0xF88 PUSH2 0x1349 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 DUP2 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD DUP6 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD SWAP1 SWAP2 MSTORE SWAP1 SWAP2 POP DUP1 PUSH1 0x0 JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x40 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP DUP2 MSTORE POP SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x102D PUSH2 0x12BA JUMP JUMPDEST PUSH2 0x1035 PUSH2 0x1349 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE DUP2 DUP4 ADD MSTORE PUSH1 0x60 DUP2 ADD DUP6 SWAP1 MSTORE DUP2 MLOAD PUSH2 0x100 DUP2 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP1 PUSH1 0x1 PUSH2 0xFBF JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x107C JUMPI PUSH2 0x107C PUSH2 0xF49 PUSH2 0x11E1 JUMP JUMPDEST DUP2 ISZERO DUP1 PUSH2 0x1087 JUMPI POP DUP4 ISZERO JUMPDEST ISZERO PUSH2 0x1094 JUMPI POP PUSH1 0x0 PUSH2 0xF71 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP1 PUSH2 0x109E JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP PUSH2 0x10B3 DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x117D AND JUMP JUMPDEST PUSH2 0x10C5 DUP3 PUSH2 0x3E8 PUSH4 0xFFFFFFFF PUSH2 0x117D AND JUMP JUMPDEST LT ISZERO SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x339F3DE2 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x10EF SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1DE5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x118C JUMPI POP PUSH1 0x0 PUSH2 0x11B1 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1199 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x11AE JUMPI PUSH2 0x11AE PUSH2 0xF49 PUSH1 0x1 DUP7 DUP7 PUSH2 0x1218 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x11CD JUMPI PUSH2 0x11CD PUSH2 0xF49 PUSH1 0x3 DUP6 DUP6 PUSH2 0x1218 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x11D8 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xA791837C00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x10EF SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1B98 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x124A PUSH2 0x1276 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1257 PUSH2 0x1276 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1264 PUSH2 0x1276 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1271 PUSH2 0x1276 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 ADD PUSH2 0x12DA PUSH2 0x1349 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD SWAP1 SWAP2 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x11B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x13A7 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13BE JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 PUSH1 0x40 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x13D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x13F0 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1403 PUSH2 0x13FE DUP3 PUSH2 0x1E22 JUMP JUMPDEST PUSH2 0x1DFB JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD PUSH1 0xA0 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x1425 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1491 JUMPI PUSH1 0xA0 DUP3 DUP10 SUB SLT ISZERO PUSH2 0x1440 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x144A PUSH1 0xA0 PUSH2 0x1DFB JUMP JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1455 DUP2 PUSH2 0x1E68 JUMP JUMPDEST DUP2 MSTORE DUP3 DUP5 ADD CALLDATALOAD DUP5 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP5 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP5 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP1 DUP5 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 PUSH1 0xA0 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1428 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x14AD JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xF71 DUP4 DUP4 PUSH2 0x1372 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x14C9 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x14D3 DUP5 DUP5 PUSH2 0x1372 JUMP JUMPDEST SWAP2 POP PUSH2 0x14E2 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x1372 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1503 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x150D DUP9 DUP9 PUSH2 0x1372 JUMP JUMPDEST SWAP6 POP PUSH2 0x151C DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0x1372 JUMP JUMPDEST SWAP5 POP PUSH2 0x152B DUP9 PUSH1 0x40 DUP10 ADD PUSH2 0x1372 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x154E JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP10 ADD DUP11 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x155F JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x156F JUMPI DUP5 DUP6 REVERT JUMPDEST DUP11 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0x1580 JUMPI DUP5 DUP6 REVERT JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 PUSH1 0x20 ADD SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x15AA JUMPI DUP4 DUP5 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x15C1 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x15CD DUP9 DUP4 DUP10 ADD PUSH2 0x1396 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x15E5 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP8 ADD DUP9 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x15F6 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x1606 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP1 DUP6 MUL DUP4 ADD ADD GT ISZERO PUSH2 0x1619 JUMPI DUP5 DUP6 REVERT JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP POP PUSH1 0x20 SWAP1 SWAP5 ADD SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x163C JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1652 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x165E DUP6 DUP3 DUP7 ADD PUSH2 0x1396 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x167B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x11AE DUP2 PUSH2 0x1E5A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1697 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x11AE DUP2 PUSH2 0x1E5A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16B3 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x9 DUP2 LT PUSH2 0x11AE JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16D2 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x11AE DUP2 PUSH2 0x1E68 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16EE JUMPI DUP1 DUP2 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1706 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x171D JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD PUSH1 0x40 DUP2 DUP9 SUB SLT ISZERO PUSH2 0x172F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x1739 PUSH1 0x40 PUSH2 0x1DFB JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x1749 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP1 DUP3 ADD DUP9 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x175A JUMPI DUP7 DUP8 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH2 0x176A PUSH2 0x13FE DUP4 PUSH2 0x1E22 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP7 DUP2 ADD SWAP1 DUP3 DUP9 ADD DUP9 DUP6 MUL DUP5 ADD DUP10 ADD DUP13 LT ISZERO PUSH2 0x1786 JUMPI DUP10 DUP11 REVERT JUMPDEST DUP10 SWAP4 POP JUMPDEST DUP5 DUP5 LT ISZERO PUSH2 0x17A8 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x1 SWAP4 SWAP1 SWAP4 ADD SWAP3 SWAP2 DUP9 ADD SWAP2 DUP9 ADD PUSH2 0x178A JUMP JUMPDEST POP DUP7 MSTORE POP POP POP DUP1 DUP5 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x17BE JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x17CA DUP9 DUP3 DUP5 ADD PUSH2 0x13E0 JUMP JUMPDEST DUP6 DUP6 ADD MSTORE POP POP POP DUP1 SWAP3 POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x17ED JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE DUP3 DUP3 PUSH1 0x20 DUP7 ADD CALLDATACOPY DUP1 PUSH1 0x20 DUP5 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND DUP6 ADD ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x187B JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x185F JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x188C JUMPI DUP3 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 MLOAD PUSH1 0x9 DUP2 LT PUSH2 0x18F5 JUMPI INVALID JUMPDEST DUP1 DUP6 MSTORE POP PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x1915 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x196A JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x193D PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x17F4 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x120 DUP6 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD DUP2 PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x1961 DUP3 DUP7 ADD DUP3 PUSH2 0x1856 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD ISZERO ISZERO DUP3 MSTORE PUSH2 0x197D PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x1E42 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x198F PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x1E42 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1A5A JUMPI PUSH2 0x1A47 DUP5 DUP4 MLOAD PUSH2 0x18BF JUMP JUMPDEST PUSH1 0x40 SWAP4 SWAP1 SWAP4 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A34 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP5 MLOAD DUP1 DUP3 MSTORE DUP3 DUP3 ADD SWAP1 DUP1 DUP5 MUL DUP4 ADD DUP5 ADD DUP8 DUP6 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1AC5 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP5 SUB ADD DUP6 MSTORE PUSH2 0x1AB3 DUP4 DUP4 MLOAD PUSH2 0x18E4 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A79 JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 PUSH1 0x9 DUP16 LT PUSH2 0x1B1B JUMPI INVALID JUMPDEST DUP15 DUP4 MSTORE DUP14 PUSH1 0x20 DUP5 ADD MSTORE DUP13 ISZERO ISZERO PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x1B35 DUP13 PUSH2 0x1E4D JUMP JUMPDEST DUP12 PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x1B44 DUP12 PUSH2 0x1E4D JUMP JUMPDEST DUP11 PUSH1 0x80 DUP5 ADD MSTORE DUP10 PUSH1 0xA0 DUP5 ADD MSTORE DUP9 PUSH1 0xC0 DUP5 ADD MSTORE DUP8 PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x1B6A PUSH2 0x100 DUP5 ADD DUP9 PUSH2 0x17F4 JUMP JUMPDEST DUP6 PUSH2 0x120 DUP5 ADD MSTORE DUP1 PUSH2 0x140 DUP5 ADD MSTORE PUSH2 0x1B85 DUP2 DUP5 ADD DUP6 DUP8 PUSH2 0x180E JUMP JUMPDEST SWAP16 SWAP15 POP POP POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x1BA6 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x447964784272696467652F4F4E4C595F43414C4C41424C455F42595F45524332 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x305F4252494447455F50524F5859000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x54657374447964784272696467652F4445504F5349545F4641494C4544000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x54657374447964784272696467652F554E535550504F525445445F414354494F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4E00000000000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x54657374447964784272696467652F53484F554C445F5245564552545F4F4E5F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4F50455241544500000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x54657374447964784272696467652F57495448445241575F4641494C45440000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x447964784272696467652F554E5245434F474E495A45445F4252494447455F41 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4354494F4E000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP1 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 SWAP2 DUP3 ADD MLOAD MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP2 MLOAD DUP3 MSTORE MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1E1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1E38 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x2 DUP2 LT PUSH2 0x1F5 JUMPI INVALID JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0x1E57 JUMPI INVALID JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1E57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0x1E57 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 PUSH18 0xCEC95163956A4B51CE1A857D24A05579EC4C 0xD CALLCODE PUSH25 0xBD936DEF8CC98E4ABC866C6578706572696D656E74616CF564 PUSH20 0x6F6C634300051100406080604052348015610010 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x3E2 CODESIZE SUB DUP1 PUSH2 0x3E2 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0xBC JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 EQ PUSH2 0x7E JUMPI PUSH8 0x8AC7230489E80000 PUSH1 0x0 DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x52 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SSTORE PUSH1 0x1 ADD PUSH2 0x32 JUMP JUMPDEST POP POP CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH8 0x8AC7230489E80000 SWAP1 SSTORE PUSH2 0x18C JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xCE JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0xE4 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0xF5 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 MLOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x105 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP4 DUP4 MUL SWAP2 POP PUSH2 0x115 DUP5 DUP4 ADD PUSH2 0x166 JUMP JUMPDEST DUP4 DUP2 MSTORE DUP5 DUP2 ADD SWAP1 DUP3 DUP7 ADD DUP5 DUP5 ADD DUP8 ADD DUP11 LT ISZERO PUSH2 0x12F JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP5 POP JUMPDEST DUP6 DUP6 LT ISZERO PUSH2 0x159 JUMPI PUSH2 0x145 DUP11 DUP3 PUSH2 0x9F JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP7 ADD SWAP2 DUP7 ADD PUSH2 0x133 JUMP JUMPDEST POP SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x184 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x247 DUP1 PUSH2 0x19B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x23B872DD EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x64 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x18B JUMP JUMPDEST PUSH2 0x84 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x1CB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x77 PUSH2 0x72 CALLDATASIZE PUSH1 0x4 PUSH2 0x157 JUMP JUMPDEST PUSH2 0x12F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x1D6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT DUP1 PUSH2 0xDD JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT JUMPDEST ISZERO PUSH2 0xEA JUMPI POP PUSH1 0x0 PUSH2 0x128 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE SWAP2 DUP5 AND DUP2 MSTORE KECCAK256 DUP1 SLOAD DUP3 ADD SWAP1 SSTORE PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x168 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x128 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x19F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x1AA DUP2 PUSH2 0x1DF JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x1BA DUP2 PUSH2 0x1DF JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x201 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 PUSH27 0x68324378440E0F8ADB19B69C4A69251DB4A4102A17D91599423758 0xD7 0xC3 SGT DUP5 PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH ",
                "sourceMap": "1847:4852:52:-;;;2508:230;8:9:-1;5:2;;;30:1;27;20:12;5:2;2508:230:52;;;;;;;;;;;;;;;;;;;;;2722:7;2698:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;2670:17:52;:61;;-1:-1:-1;;;;;;2670:61:52;-1:-1:-1;;;;;2670:61:52;;;;;;;;;;-1:-1:-1;1847:4852:52;;;;;;;;;;:::o;5:134:-1:-;83:13;;-1:-1;;;;;4020:54;;4145:35;;4135:2;;4194:1;;4184:12;4135:2;68:71;;;;;894:392;;1034:2;;1022:9;1013:7;1009:23;1005:32;1002:2;;;-1:-1;;1040:12;1002:2;1085:24;;-1:-1;;;;;1118:30;;;1115:2;;;-1:-1;;1151:12;1115:2;1253:6;1242:9;1238:22;292:3;285:4;277:6;273:17;269:27;259:2;;-1:-1;;300:12;259:2;340:6;334:13;320:27;;1129:18;3096:6;3093:30;3090:2;;;-1:-1;;3126:12;3090:2;1034;3163:6;3159:17;;;362:80;1034:2;3159:17;3224:15;362:80;;;470:21;;;527:14;;;;502:17;;;607:27;;;;;604:36;-1:-1;601:2;;;-1:-1;;643:12;601:2;-1:-1;669:10;;663:217;688:6;685:1;682:13;663:217;;;768:48;812:3;800:10;768:48;;;756:61;;710:1;703:9;;;;;831:14;;;;859;;663:217;;;-1:-1;1171:99;996:290;-1:-1;;;;;;;;996:290;2314:361;2482:2;2496:47;;;3517:12;;2467:18;;;3792:19;;;2314:361;;3371:14;;;3832;;;;2314:361;2024:260;2049:6;2046:1;2043:13;2024:260;;;2110:13;;-1:-1;;;;;4020:54;1536:37;;2482:2;3647:14;;;;1447;;;;4031:42;2064:9;2024:260;;;-1:-1;2549:116;;2453:222;-1:-1;;;;;2453:222;2682:256;2744:2;2738:9;2770:17;;;-1:-1;;;;;2830:34;;2866:22;;;2827:62;2824:2;;;2902:1;;2892:12;2824:2;2744;2911:22;2722:216;;-1:-1;2722:216;;1847:4852:52;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063a67a6a4511610081578063c576501b1161005b578063c576501b1461019c578063f9416052146101af578063fd04b60614610141576100c9565b8063a67a6a4514610161578063abb28b9214610174578063c2df82e61461017c576100c9565b806369794795116100b2578063697947951461011757806385b53fc81461012c5780638928378e14610141576100c9565b8063062bd3e9146100ce5780633a031bf0146100f7575b600080fd5b6100e16100dc3660046117dc565b6101d0565b6040516100ee919061199f565b60405180910390f35b61010a6101053660046114b7565b6101d6565b6040516100ee9190611ad4565b61011f6101de565b6040516100ee9190611da6565b61013f61013a36600461162a565b6101e9565b005b61015461014f3660046117dc565b6101ed565b6040516100ee9190611d9c565b61013f61016f366004611595565b6101fa565b6100e1610b5a565b61018f61018a3660046114eb565b610b76565b6040516100ee9190611adf565b61013f6101aa36600461166a565b610cbb565b6101c26101bd3660046116dd565b610d05565b6040516100ee929190611dd5565b50600090565b600092915050565b6101e6611237565b90565b5050565b6101f5611276565b919050565b60005474010000000000000000000000000000000000000000900460ff1615610258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611cab565b60405180910390fd5b60005b838110156102da577fbd1b601b3f796370ce99b97e1950ecfe75d4d83dae7d449a6c73437df651f43185858381811061029057fe5b6102a6926020604090920201908101915061149c565b8686848181106102b257fe5b905060400201602001356040516102ca9291906119f1565b60405180910390a160010161025b565b5060005b81811015610b53577ffcf8784aafcb4a0ee28cb2be23b7ffa40261226fc10a3442dfb27ac523dcde8683838381811061031357fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261034d57600080fd5b61035d92016020810191506116a2565b84848481811061036957fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126103a357600080fd5b80830192505050602001358585858181106103ba57fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126103f457600080fd5b610407920160608101915060400161166a565b86868681811061041357fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261044d57600080fd5b61046092016080810191506060016116c1565b87878781811061046c57fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126104a657600080fd5b6104b9920160a0810191506080016116c1565b8888888181106104c557fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126104ff57600080fd5b90910160a00135905089898981811061051457fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261054e57600080fd5b8083019250505060c001358a8a8a81811061056557fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261059f57600080fd5b8083019250505060e001358b8b8b8181106105b657fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126105f057600080fd5b6106059201610120810191506101000161149c565b8c8c8c81811061061157fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261064b57600080fd5b8083019250505061012001358d8d8d81811061066357fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261069d57600080fd5b919091019050610140810180357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1368490030181126106db57600080fd5b9091016020810191503567ffffffffffffffff8111156106fa57600080fd5b3681900382131561070a57600080fd5b6040516107229c9b9a99989796959493929190611b0c565b60405180910390a1600183838381811061073857fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261077257600080fd5b61078292016020810191506116a2565b600881111561078d57fe5b14156109245760005473ffffffffffffffffffffffffffffffffffffffff166323b872dd308585858181106107be57fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126107f857600080fd5b61080d9201610120810191506101000161149c565b86868681811061081957fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261085357600080fd5b60405160e087901b7fffffffff000000000000000000000000000000000000000000000000000000001681526108979594939190910160a0013591506004016119c0565b602060405180830381600087803b1580156108b157600080fd5b505af11580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108e99190810190611686565b61091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611d08565b610b4b565b600083838381811061093257fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea13684900301811261096c57600080fd5b61097c92016020810191506116a2565b600881111561098757fe5b1415610b195760005473ffffffffffffffffffffffffffffffffffffffff166323b872dd8484848181106109b757fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1368490030181126109f157600080fd5b610a069201610120810191506101000161149c565b30868686818110610a1357fe5b6020028201905080357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea136849003018112610a4d57600080fd5b60405160e087901b7fffffffff00000000000000000000000000000000000000000000000000000000168152610a919594939190910160a0013591506004016119c0565b602060405180830381600087803b158015610aab57600080fd5b505af1158015610abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ae39190810190611686565b61091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611c17565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611c4e565b6001016102de565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000610b80610d1a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611bba565b610bec611289565b610bf8838501856116f4565b90506060610c068883610d32565b90506060610c1689898986610de8565b9050610c20610f25565b73ffffffffffffffffffffffffffffffffffffffff1663a67a6a4583836040518363ffffffff1660e01b8152600401610c5a929190611a17565b600060405180830381600087803b158015610c7457600080fd5b505af1158015610c88573d6000803e3d6000fd5b507fdc1600f3000000000000000000000000000000000000000000000000000000009d9c50505050505050505050505050565b6000805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b610d0d611276565b610d15611276565b915091565b600033600114610d2a5733610d2d565b60005b905090565b805180516040805182815260208084028201019091526060929190818015610d7457816020015b610d616112a3565b815260200190600190039081610d595790505b50925060005b81811015610ddf5760405180604001604052808773ffffffffffffffffffffffffffffffffffffffff168152602001848381518110610db557fe5b6020026020010151815250848281518110610dcc57fe5b6020908102919091010152600101610d7a565b50505092915050565b60208082015180516040805182815282850281019094019052606092818015610e2b57816020015b610e186112ba565b815260200190600190039081610e105790505b50925060005b81811015610f1a57610e41611319565b838281518110610e4d57fe5b6020026020010151905060008082608001511115610e7f57610e78826060015183608001518a610f29565b9050610e82565b50865b600082516001811115610e9157fe5b1415610ebe57610ea28a8284610f78565b868481518110610eae57fe5b6020026020010181905250610f10565b600182516001811115610ecd57fe5b1415610ede57610ea2898284611025565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161024f90611d3f565b5050600101610e31565b505050949350505050565b3090565b6000610f3684848461106a565b15610f4e57610f4e610f498585856110d0565b611175565b610f6e83610f62868563ffffffff61117d16565b9063ffffffff6111b716565b90505b9392505050565b610f806112ba565b610f88611349565b6040805160808101909152600181526020810160008152602001600081526020018590526040805161010081019091529091508060005b81526020018460200151815260200182815260200184604001518152602001600081526020018673ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001604051806020016040528060008152508152509150509392505050565b61102d6112ba565b611035611349565b506040805160808101825260008082526020820181905281830152606081018590528151610100810190925290806001610fbf565b60008261107c5761107c610f496111e1565b811580611087575083155b1561109457506000610f71565b6000838061109e57fe5b85840990506110b3858463ffffffff61117d16565b6110c5826103e863ffffffff61117d16565b101595945050505050565b606063339f3de260e01b8484846040516024016110ef93929190611de5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b60008261118c575060006111b1565b8282028284828161119957fe5b04146111ae576111ae610f4960018686611218565b90505b92915050565b6000816111cd576111cd610f4960038585611218565b60008284816111d857fe5b04949350505050565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b606063e946c1bb60e01b8484846040516024016110ef93929190611b98565b604051806080016040528061124a611276565b8152602001611257611276565b8152602001611264611276565b8152602001611271611276565b905290565b6040518060200160405280600081525090565b604051806040016040528060608152602001606081525090565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201529081016112da611349565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040805160a081019091528060008152602001600081526020016000815260200160008152602001600081525090565b604080516080810190915260008082526020820190815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff811681146111b157600080fd5b60008083601f8401126113a7578182fd5b50813567ffffffffffffffff8111156113be578182fd5b6020830191508360206040830285010111156113d957600080fd5b9250929050565b600082601f8301126113f0578081fd5b81356114036113fe82611e22565b611dfb565b818152915060208083019084810160a084028601820187101561142557600080fd5b60005b848110156114915760a0828903121561144057600080fd5b61144a60a0611dfb565b823561145581611e68565b8152828401358482015260408084013590820152606080840135908201526080808401359082015284529282019260a090910190600101611428565b505050505092915050565b6000602082840312156114ad578081fd5b610f718383611372565b600080604083850312156114c9578081fd5b6114d38484611372565b91506114e28460208501611372565b90509250929050565b60008060008060008060a08789031215611503578182fd5b61150d8888611372565b955061151c8860208901611372565b945061152b8860408901611372565b935060608701359250608087013567ffffffffffffffff8082111561154e578384fd5b8189018a601f82011261155f578485fd5b803592508183111561156f578485fd5b8a6020848301011115611580578485fd5b979a9699509497509295602001949293505050565b600080600080604085870312156115aa578384fd5b843567ffffffffffffffff808211156115c1578586fd5b6115cd88838901611396565b909650945060208701359150808211156115e5578384fd5b81870188601f8201126115f6578485fd5b8035925081831115611606578485fd5b8860208085028301011115611619578485fd5b959894975050602090940194505050565b6000806020838503121561163c578182fd5b823567ffffffffffffffff811115611652578283fd5b61165e85828601611396565b90969095509350505050565b60006020828403121561167b578081fd5b81356111ae81611e5a565b600060208284031215611697578081fd5b81516111ae81611e5a565b6000602082840312156116b3578081fd5b8135600981106111ae578182fd5b6000602082840312156116d2578081fd5b81356111ae81611e68565b6000604082840312156116ee578081fd5b50919050565b60006020808385031215611706578182fd5b823567ffffffffffffffff8082111561171d578384fd5b8185016040818803121561172f578485fd5b6117396040611dfb565b9250803582811115611749578586fd5b80820188601f82011261175a578687fd5b8035915061176a6113fe83611e22565b82815286810190828801888502840189018c101561178657898afd5b8993505b848410156117a857803583526001939093019291880191880161178a565b50865250505080840135828111156117be578586fd5b6117ca888284016113e0565b85850152505050809250505092915050565b6000602082840312156117ed578081fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60008151808452815b8181101561187b5760208185018101518683018201520161185f565b8181111561188c5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805173ffffffffffffffffffffffffffffffffffffffff168252602090810151910152565b60006101608251600981106118f557fe5b80855250602083015160208501526040830151611915604086018261196a565b50606083015160c0850152608083015160e085015260a083015161193d6101008601826117f4565b5060c083015161012085015260e08301518161014086015261196182860182611856565b95945050505050565b80511515825261197d6020820151611e42565b602083015261198f6040820151611e42565b6040830152606090810151910152565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015611a5a57611a478483516118bf565b6040939093019290840190600101611a34565b5050508381038285015284518082528282019080840283018401878501865b83811015611ac5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552611ab38383516118e4565b94870194925090860190600101611a79565b50909998505050505050505050565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b600061016060098f10611b1b57fe5b8e83528d60208401528c15156040840152611b358c611e4d565b8b6060840152611b448b611e4d565b8a60808401528960a08401528860c08401528760e0840152611b6a6101008401886117f4565b8561012084015280610140840152611b85818401858761180e565b9f9e505050505050505050505050505050565b6060810160048510611ba657fe5b938152602081019290925260409091015290565b6020808252602e908201527f447964784272696467652f4f4e4c595f43414c4c41424c455f42595f4552433260408201527f305f4252494447455f50524f5859000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f54657374447964784272696467652f4445504f5349545f4641494c4544000000604082015260600190565b60208082526021908201527f54657374447964784272696467652f554e535550504f525445445f414354494f60408201527f4e00000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f54657374447964784272696467652f53484f554c445f5245564552545f4f4e5f60408201527f4f50455241544500000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f54657374447964784272696467652f57495448445241575f4641494c45440000604082015260600190565b60208082526025908201527f447964784272696467652f554e5245434f474e495a45445f4252494447455f4160408201527f4354494f4e000000000000000000000000000000000000000000000000000000606082015260800190565b9051815260200190565b815151815260208083015151908201526040808301515190820152606091820151519181019190915260800190565b9151825251602082015260400190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715611e1a57600080fd5b604052919050565b600067ffffffffffffffff821115611e38578081fd5b5060209081020190565b80600281106101f557fe5b60028110611e5757fe5b50565b8015158114611e5757600080fd5b60028110611e5757600080fdfea365627a7a7231582071cec95163956a4b51ce1a857d24a05579ec4c0df278bd936def8cc98e4abc866c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA67A6A45 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xC576501B GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xC576501B EQ PUSH2 0x19C JUMPI DUP1 PUSH4 0xF9416052 EQ PUSH2 0x1AF JUMPI DUP1 PUSH4 0xFD04B606 EQ PUSH2 0x141 JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0xA67A6A45 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0xABB28B92 EQ PUSH2 0x174 JUMPI DUP1 PUSH4 0xC2DF82E6 EQ PUSH2 0x17C JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0x69794795 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x69794795 EQ PUSH2 0x117 JUMPI DUP1 PUSH4 0x85B53FC8 EQ PUSH2 0x12C JUMPI DUP1 PUSH4 0x8928378E EQ PUSH2 0x141 JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0x62BD3E9 EQ PUSH2 0xCE JUMPI DUP1 PUSH4 0x3A031BF0 EQ PUSH2 0xF7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE1 PUSH2 0xDC CALLDATASIZE PUSH1 0x4 PUSH2 0x17DC JUMP JUMPDEST PUSH2 0x1D0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x199F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x10A PUSH2 0x105 CALLDATASIZE PUSH1 0x4 PUSH2 0x14B7 JUMP JUMPDEST PUSH2 0x1D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x1AD4 JUMP JUMPDEST PUSH2 0x11F PUSH2 0x1DE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x1DA6 JUMP JUMPDEST PUSH2 0x13F PUSH2 0x13A CALLDATASIZE PUSH1 0x4 PUSH2 0x162A JUMP JUMPDEST PUSH2 0x1E9 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x154 PUSH2 0x14F CALLDATASIZE PUSH1 0x4 PUSH2 0x17DC JUMP JUMPDEST PUSH2 0x1ED JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x1D9C JUMP JUMPDEST PUSH2 0x13F PUSH2 0x16F CALLDATASIZE PUSH1 0x4 PUSH2 0x1595 JUMP JUMPDEST PUSH2 0x1FA JUMP JUMPDEST PUSH2 0xE1 PUSH2 0xB5A JUMP JUMPDEST PUSH2 0x18F PUSH2 0x18A CALLDATASIZE PUSH1 0x4 PUSH2 0x14EB JUMP JUMPDEST PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP2 SWAP1 PUSH2 0x1ADF JUMP JUMPDEST PUSH2 0x13F PUSH2 0x1AA CALLDATASIZE PUSH1 0x4 PUSH2 0x166A JUMP JUMPDEST PUSH2 0xCBB JUMP JUMPDEST PUSH2 0x1C2 PUSH2 0x1BD CALLDATASIZE PUSH1 0x4 PUSH2 0x16DD JUMP JUMPDEST PUSH2 0xD05 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEE SWAP3 SWAP2 SWAP1 PUSH2 0x1DD5 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1E6 PUSH2 0x1237 JUMP JUMPDEST SWAP1 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x1F5 PUSH2 0x1276 JUMP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x258 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1CAB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2DA JUMPI PUSH32 0xBD1B601B3F796370CE99B97E1950ECFE75D4D83DAE7D449A6C73437DF651F431 DUP6 DUP6 DUP4 DUP2 DUP2 LT PUSH2 0x290 JUMPI INVALID JUMPDEST PUSH2 0x2A6 SWAP3 PUSH1 0x20 PUSH1 0x40 SWAP1 SWAP3 MUL ADD SWAP1 DUP2 ADD SWAP2 POP PUSH2 0x149C JUMP JUMPDEST DUP7 DUP7 DUP5 DUP2 DUP2 LT PUSH2 0x2B2 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x40 MUL ADD PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x40 MLOAD PUSH2 0x2CA SWAP3 SWAP2 SWAP1 PUSH2 0x19F1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 ADD PUSH2 0x25B JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB53 JUMPI PUSH32 0xFCF8784AAFCB4A0EE28CB2BE23B7FFA40261226FC10A3442DFB27AC523DCDE86 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x313 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x34D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x35D SWAP3 ADD PUSH1 0x20 DUP2 ADD SWAP2 POP PUSH2 0x16A2 JUMP JUMPDEST DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x369 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x3A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 ADD SWAP3 POP POP POP PUSH1 0x20 ADD CALLDATALOAD DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x3BA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x407 SWAP3 ADD PUSH1 0x60 DUP2 ADD SWAP2 POP PUSH1 0x40 ADD PUSH2 0x166A JUMP JUMPDEST DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0x413 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x44D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x460 SWAP3 ADD PUSH1 0x80 DUP2 ADD SWAP2 POP PUSH1 0x60 ADD PUSH2 0x16C1 JUMP JUMPDEST DUP8 DUP8 DUP8 DUP2 DUP2 LT PUSH2 0x46C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x4A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4B9 SWAP3 ADD PUSH1 0xA0 DUP2 ADD SWAP2 POP PUSH1 0x80 ADD PUSH2 0x16C1 JUMP JUMPDEST DUP9 DUP9 DUP9 DUP2 DUP2 LT PUSH2 0x4C5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x4FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 ADD PUSH1 0xA0 ADD CALLDATALOAD SWAP1 POP DUP10 DUP10 DUP10 DUP2 DUP2 LT PUSH2 0x514 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x54E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 ADD SWAP3 POP POP POP PUSH1 0xC0 ADD CALLDATALOAD DUP11 DUP11 DUP11 DUP2 DUP2 LT PUSH2 0x565 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x59F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 ADD SWAP3 POP POP POP PUSH1 0xE0 ADD CALLDATALOAD DUP12 DUP12 DUP12 DUP2 DUP2 LT PUSH2 0x5B6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x5F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x605 SWAP3 ADD PUSH2 0x120 DUP2 ADD SWAP2 POP PUSH2 0x100 ADD PUSH2 0x149C JUMP JUMPDEST DUP13 DUP13 DUP13 DUP2 DUP2 LT PUSH2 0x611 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x64B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 ADD SWAP3 POP POP POP PUSH2 0x120 ADD CALLDATALOAD DUP14 DUP14 DUP14 DUP2 DUP2 LT PUSH2 0x663 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x69D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP1 POP PUSH2 0x140 DUP2 ADD DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x6DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 ADD PUSH1 0x20 DUP2 ADD SWAP2 POP CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x6FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x70A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x722 SWAP13 SWAP12 SWAP11 SWAP10 SWAP9 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1B0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x738 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x772 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x782 SWAP3 ADD PUSH1 0x20 DUP2 ADD SWAP2 POP PUSH2 0x16A2 JUMP JUMPDEST PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x78D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x924 JUMPI PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x23B872DD ADDRESS DUP6 DUP6 DUP6 DUP2 DUP2 LT PUSH2 0x7BE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x7F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x80D SWAP3 ADD PUSH2 0x120 DUP2 ADD SWAP2 POP PUSH2 0x100 ADD PUSH2 0x149C JUMP JUMPDEST DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0x819 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x853 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xE0 DUP8 SWAP1 SHL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP2 MSTORE PUSH2 0x897 SWAP6 SWAP5 SWAP4 SWAP2 SWAP1 SWAP2 ADD PUSH1 0xA0 ADD CALLDATALOAD SWAP2 POP PUSH1 0x4 ADD PUSH2 0x19C0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8C5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x8E9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1686 JUMP JUMPDEST PUSH2 0x91F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1D08 JUMP JUMPDEST PUSH2 0xB4B JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x932 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x96C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x97C SWAP3 ADD PUSH1 0x20 DUP2 ADD SWAP2 POP PUSH2 0x16A2 JUMP JUMPDEST PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x987 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xB19 JUMPI PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x23B872DD DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x9B7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0x9F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA06 SWAP3 ADD PUSH2 0x120 DUP2 ADD SWAP2 POP PUSH2 0x100 ADD PUSH2 0x149C JUMP JUMPDEST ADDRESS DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xA13 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL DUP3 ADD SWAP1 POP DUP1 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA1 CALLDATASIZE DUP5 SWAP1 SUB ADD DUP2 SLT PUSH2 0xA4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0xE0 DUP8 SWAP1 SHL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP2 MSTORE PUSH2 0xA91 SWAP6 SWAP5 SWAP4 SWAP2 SWAP1 SWAP2 ADD PUSH1 0xA0 ADD CALLDATALOAD SWAP2 POP PUSH1 0x4 ADD PUSH2 0x19C0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xABF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xAE3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1686 JUMP JUMPDEST PUSH2 0x91F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1C17 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1C4E JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2DE JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB80 PUSH2 0xD1A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xBE4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1BBA JUMP JUMPDEST PUSH2 0xBEC PUSH2 0x1289 JUMP JUMPDEST PUSH2 0xBF8 DUP4 DUP6 ADD DUP6 PUSH2 0x16F4 JUMP JUMPDEST SWAP1 POP PUSH1 0x60 PUSH2 0xC06 DUP9 DUP4 PUSH2 0xD32 JUMP JUMPDEST SWAP1 POP PUSH1 0x60 PUSH2 0xC16 DUP10 DUP10 DUP10 DUP7 PUSH2 0xDE8 JUMP JUMPDEST SWAP1 POP PUSH2 0xC20 PUSH2 0xF25 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA67A6A45 DUP4 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC5A SWAP3 SWAP2 SWAP1 PUSH2 0x1A17 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC88 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP14 SWAP13 POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP2 ISZERO ISZERO PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xD0D PUSH2 0x1276 JUMP JUMPDEST PUSH2 0xD15 PUSH2 0x1276 JUMP JUMPDEST SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 CALLER PUSH1 0x1 EQ PUSH2 0xD2A JUMPI CALLER PUSH2 0xD2D JUMP JUMPDEST PUSH1 0x0 JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 SWAP3 SWAP2 SWAP1 DUP2 DUP1 ISZERO PUSH2 0xD74 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xD61 PUSH2 0x12A3 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xD59 JUMPI SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xDDF JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xDB5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP2 MSTORE POP DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xDCC JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xD7A JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE DUP3 DUP6 MUL DUP2 ADD SWAP1 SWAP5 ADD SWAP1 MSTORE PUSH1 0x60 SWAP3 DUP2 DUP1 ISZERO PUSH2 0xE2B JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xE18 PUSH2 0x12BA JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xE10 JUMPI SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xF1A JUMPI PUSH2 0xE41 PUSH2 0x1319 JUMP JUMPDEST DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xE4D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH1 0x0 DUP1 DUP3 PUSH1 0x80 ADD MLOAD GT ISZERO PUSH2 0xE7F JUMPI PUSH2 0xE78 DUP3 PUSH1 0x60 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD DUP11 PUSH2 0xF29 JUMP JUMPDEST SWAP1 POP PUSH2 0xE82 JUMP JUMPDEST POP DUP7 JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xE91 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xEBE JUMPI PUSH2 0xEA2 DUP11 DUP3 DUP5 PUSH2 0xF78 JUMP JUMPDEST DUP7 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xEAE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP PUSH2 0xF10 JUMP JUMPDEST PUSH1 0x1 DUP3 MLOAD PUSH1 0x1 DUP2 GT ISZERO PUSH2 0xECD JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xEDE JUMPI PUSH2 0xEA2 DUP10 DUP3 DUP5 PUSH2 0x1025 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x24F SWAP1 PUSH2 0x1D3F JUMP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0xE31 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST ADDRESS SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF36 DUP5 DUP5 DUP5 PUSH2 0x106A JUMP JUMPDEST ISZERO PUSH2 0xF4E JUMPI PUSH2 0xF4E PUSH2 0xF49 DUP6 DUP6 DUP6 PUSH2 0x10D0 JUMP JUMPDEST PUSH2 0x1175 JUMP JUMPDEST PUSH2 0xF6E DUP4 PUSH2 0xF62 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x117D AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x11B7 AND JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xF80 PUSH2 0x12BA JUMP JUMPDEST PUSH2 0xF88 PUSH2 0x1349 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 DUP2 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD DUP6 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD SWAP1 SWAP2 MSTORE SWAP1 SWAP2 POP DUP1 PUSH1 0x0 JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x20 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x40 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP DUP2 MSTORE POP SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x102D PUSH2 0x12BA JUMP JUMPDEST PUSH2 0x1035 PUSH2 0x1349 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE DUP2 DUP4 ADD MSTORE PUSH1 0x60 DUP2 ADD DUP6 SWAP1 MSTORE DUP2 MLOAD PUSH2 0x100 DUP2 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP1 PUSH1 0x1 PUSH2 0xFBF JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x107C JUMPI PUSH2 0x107C PUSH2 0xF49 PUSH2 0x11E1 JUMP JUMPDEST DUP2 ISZERO DUP1 PUSH2 0x1087 JUMPI POP DUP4 ISZERO JUMPDEST ISZERO PUSH2 0x1094 JUMPI POP PUSH1 0x0 PUSH2 0xF71 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP1 PUSH2 0x109E JUMPI INVALID JUMPDEST DUP6 DUP5 MULMOD SWAP1 POP PUSH2 0x10B3 DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x117D AND JUMP JUMPDEST PUSH2 0x10C5 DUP3 PUSH2 0x3E8 PUSH4 0xFFFFFFFF PUSH2 0x117D AND JUMP JUMPDEST LT ISZERO SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x339F3DE2 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x10EF SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1DE5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x118C JUMPI POP PUSH1 0x0 PUSH2 0x11B1 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1199 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x11AE JUMPI PUSH2 0x11AE PUSH2 0xF49 PUSH1 0x1 DUP7 DUP7 PUSH2 0x1218 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x11CD JUMPI PUSH2 0x11CD PUSH2 0xF49 PUSH1 0x3 DUP6 DUP6 PUSH2 0x1218 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x11D8 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xA791837C00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x10EF SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1B98 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x124A PUSH2 0x1276 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1257 PUSH2 0x1276 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1264 PUSH2 0x1276 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1271 PUSH2 0x1276 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 ADD PUSH2 0x12DA PUSH2 0x1349 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD SWAP1 SWAP2 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x11B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x13A7 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13BE JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 PUSH1 0x40 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x13D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x13F0 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1403 PUSH2 0x13FE DUP3 PUSH2 0x1E22 JUMP JUMPDEST PUSH2 0x1DFB JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD PUSH1 0xA0 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x1425 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1491 JUMPI PUSH1 0xA0 DUP3 DUP10 SUB SLT ISZERO PUSH2 0x1440 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x144A PUSH1 0xA0 PUSH2 0x1DFB JUMP JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1455 DUP2 PUSH2 0x1E68 JUMP JUMPDEST DUP2 MSTORE DUP3 DUP5 ADD CALLDATALOAD DUP5 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP5 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP1 DUP5 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP1 DUP5 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 PUSH1 0xA0 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1428 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x14AD JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xF71 DUP4 DUP4 PUSH2 0x1372 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x14C9 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x14D3 DUP5 DUP5 PUSH2 0x1372 JUMP JUMPDEST SWAP2 POP PUSH2 0x14E2 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x1372 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1503 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x150D DUP9 DUP9 PUSH2 0x1372 JUMP JUMPDEST SWAP6 POP PUSH2 0x151C DUP9 PUSH1 0x20 DUP10 ADD PUSH2 0x1372 JUMP JUMPDEST SWAP5 POP PUSH2 0x152B DUP9 PUSH1 0x40 DUP10 ADD PUSH2 0x1372 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x154E JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP10 ADD DUP11 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x155F JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x156F JUMPI DUP5 DUP6 REVERT JUMPDEST DUP11 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0x1580 JUMPI DUP5 DUP6 REVERT JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 PUSH1 0x20 ADD SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x15AA JUMPI DUP4 DUP5 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x15C1 JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x15CD DUP9 DUP4 DUP10 ADD PUSH2 0x1396 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x15E5 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP8 ADD DUP9 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x15F6 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x1606 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP1 DUP6 MUL DUP4 ADD ADD GT ISZERO PUSH2 0x1619 JUMPI DUP5 DUP6 REVERT JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP POP PUSH1 0x20 SWAP1 SWAP5 ADD SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x163C JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1652 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x165E DUP6 DUP3 DUP7 ADD PUSH2 0x1396 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x167B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x11AE DUP2 PUSH2 0x1E5A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1697 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x11AE DUP2 PUSH2 0x1E5A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16B3 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x9 DUP2 LT PUSH2 0x11AE JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16D2 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x11AE DUP2 PUSH2 0x1E68 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x16EE JUMPI DUP1 DUP2 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1706 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x171D JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD PUSH1 0x40 DUP2 DUP9 SUB SLT ISZERO PUSH2 0x172F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x1739 PUSH1 0x40 PUSH2 0x1DFB JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x1749 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP1 DUP3 ADD DUP9 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x175A JUMPI DUP7 DUP8 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH2 0x176A PUSH2 0x13FE DUP4 PUSH2 0x1E22 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP7 DUP2 ADD SWAP1 DUP3 DUP9 ADD DUP9 DUP6 MUL DUP5 ADD DUP10 ADD DUP13 LT ISZERO PUSH2 0x1786 JUMPI DUP10 DUP11 REVERT JUMPDEST DUP10 SWAP4 POP JUMPDEST DUP5 DUP5 LT ISZERO PUSH2 0x17A8 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x1 SWAP4 SWAP1 SWAP4 ADD SWAP3 SWAP2 DUP9 ADD SWAP2 DUP9 ADD PUSH2 0x178A JUMP JUMPDEST POP DUP7 MSTORE POP POP POP DUP1 DUP5 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x17BE JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x17CA DUP9 DUP3 DUP5 ADD PUSH2 0x13E0 JUMP JUMPDEST DUP6 DUP6 ADD MSTORE POP POP POP DUP1 SWAP3 POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x17ED JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE DUP3 DUP3 PUSH1 0x20 DUP7 ADD CALLDATACOPY DUP1 PUSH1 0x20 DUP5 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP6 ADD AND DUP6 ADD ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x187B JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x185F JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x188C JUMPI DUP3 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 MSTORE PUSH1 0x20 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 DUP3 MLOAD PUSH1 0x9 DUP2 LT PUSH2 0x18F5 JUMPI INVALID JUMPDEST DUP1 DUP6 MSTORE POP PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x1915 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x196A JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x193D PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x17F4 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x120 DUP6 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD DUP2 PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x1961 DUP3 DUP7 ADD DUP3 PUSH2 0x1856 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD ISZERO ISZERO DUP3 MSTORE PUSH2 0x197D PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x1E42 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x198F PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x1E42 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 SWAP1 DUP2 ADD MLOAD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1A5A JUMPI PUSH2 0x1A47 DUP5 DUP4 MLOAD PUSH2 0x18BF JUMP JUMPDEST PUSH1 0x40 SWAP4 SWAP1 SWAP4 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A34 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP5 MLOAD DUP1 DUP3 MSTORE DUP3 DUP3 ADD SWAP1 DUP1 DUP5 MUL DUP4 ADD DUP5 ADD DUP8 DUP6 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1AC5 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP5 SUB ADD DUP6 MSTORE PUSH2 0x1AB3 DUP4 DUP4 MLOAD PUSH2 0x18E4 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A79 JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x160 PUSH1 0x9 DUP16 LT PUSH2 0x1B1B JUMPI INVALID JUMPDEST DUP15 DUP4 MSTORE DUP14 PUSH1 0x20 DUP5 ADD MSTORE DUP13 ISZERO ISZERO PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0x1B35 DUP13 PUSH2 0x1E4D JUMP JUMPDEST DUP12 PUSH1 0x60 DUP5 ADD MSTORE PUSH2 0x1B44 DUP12 PUSH2 0x1E4D JUMP JUMPDEST DUP11 PUSH1 0x80 DUP5 ADD MSTORE DUP10 PUSH1 0xA0 DUP5 ADD MSTORE DUP9 PUSH1 0xC0 DUP5 ADD MSTORE DUP8 PUSH1 0xE0 DUP5 ADD MSTORE PUSH2 0x1B6A PUSH2 0x100 DUP5 ADD DUP9 PUSH2 0x17F4 JUMP JUMPDEST DUP6 PUSH2 0x120 DUP5 ADD MSTORE DUP1 PUSH2 0x140 DUP5 ADD MSTORE PUSH2 0x1B85 DUP2 DUP5 ADD DUP6 DUP8 PUSH2 0x180E JUMP JUMPDEST SWAP16 SWAP15 POP POP POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x1BA6 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x447964784272696467652F4F4E4C595F43414C4C41424C455F42595F45524332 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x305F4252494447455F50524F5859000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x54657374447964784272696467652F4445504F5349545F4641494C4544000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x54657374447964784272696467652F554E535550504F525445445F414354494F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4E00000000000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x54657374447964784272696467652F53484F554C445F5245564552545F4F4E5F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4F50455241544500000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x54657374447964784272696467652F57495448445241575F4641494C45440000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x447964784272696467652F554E5245434F474E495A45445F4252494447455F41 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4354494F4E000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP1 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD MLOAD DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x60 SWAP2 DUP3 ADD MLOAD MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST SWAP2 MLOAD DUP3 MSTORE MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1E1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1E38 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x2 DUP2 LT PUSH2 0x1F5 JUMPI INVALID JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0x1E57 JUMPI INVALID JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1E57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x2 DUP2 LT PUSH2 0x1E57 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 PUSH18 0xCEC95163956A4B51CE1A857D24A05579EC4C 0xD CALLCODE PUSH25 0xBD936DEF8CC98E4ABC866C6578706572696D656E74616CF564 PUSH20 0x6F6C634300051100400000000000000000000000 ",
                "sourceMap": "1847:4852:52:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1847:4852:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5391:138;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5206:158;;;;;;;;;:::i;:::-;;;;;;;;5556:108;;;:::i;:::-;;;;;;;;5117:62;;;;;;;;;:::i;:::-;;5692:129;;;;;;;;;:::i;:::-;;;;;;;;2869:1871;;;;;;;;;:::i;4978:112::-;;;:::i;2062:1082:17:-;;;;;;;;;:::i;:::-;;;;;;;;4817:122:52;;;;;;;;;:::i;6005:183::-;;;;;;;;;:::i;:::-;;;;;;;;;5391:138;-1:-1:-1;5501:20:52;;5391:138::o;5206:158::-;5336:20;5206:158;;;;:::o;5556:108::-;5628:28;;:::i;:::-;5556:108;:::o;5117:62::-;;;:::o;5692:129::-;5795:18;;:::i;:::-;5692:129;;;:::o;2869:1871::-;3007:22;;;;;;;3003:102;;;3045:49;;;;;;;;;;;;;;;;;;;3003:102;3120:6;3115:172;3132:19;;;3115:172;;;3177:99;3209:8;;3218:1;3209:11;;;;;;;:17;;;:11;;;;;:17;;;;-1:-1:-1;3209:17:52;;;3244:8;;3253:1;3244:11;;;;;;;;;;;;:18;;;3177:99;;;;;;;;;;;;;;;;3153:3;;3115:172;;;-1:-1:-1;3302:6:52;3297:1437;3314:18;;;3297:1437;;;3358:481;3389:7;;3397:1;3389:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;3389:21:52;;176:33:-1;3389:21:52;;;;-1:-1:-1;3389:21:52;;;3428:7;;3436:1;3428:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;190:18;180:8;176:33;164:45;;0:212;3428:10:52;:21;;;3467:7;;3475:1;3467:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;3467:22:52;;176:33:-1;3467:22:52;;;;-1:-1:-1;3467:17:52;;:22;;;3507:7;;3515:1;3507:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;3507:30:52;;176:33:-1;3507:30:52;;;;-1:-1:-1;3507:30:52;;;;;3555:7;;3563:1;3555:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;3555:21:52;;176:33:-1;3555:21:52;;;;-1:-1:-1;3555:21:52;;;;;3594:7;;3602:1;3594:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;176:33;;;3594:23:52;;;;-1:-1:-1;3635:7:52;;3643:1;3635:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;190:18;180:8;176:33;164:45;;0:212;3635:10:52;:26;;;3679:7;;3687:1;3679:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;190:18;180:8;176:33;164:45;;0:212;3679:10:52;:28;;;3725:7;;3733:1;3725:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;3725:23:52;;176:33:-1;3725:23:52;;;;-1:-1:-1;3725:23:52;;;;;3766:7;;3774:1;3766:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;190:18;180:8;176:33;164:45;;0:212;3766:10:52;:26;;;3810:7;;3818:1;3810:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;176:33;;;;;-1:-1;3810:15:52;;;30:25:-1;;92:48;100:14;96:29;;;92:48;68:73;;58:2;;155:1;152;145:12;58:2;174:33;;;69:4;55:19;;;-1:-1;16:22;93:18;82:30;;79:2;;;125:1;122;115:12;79:2;155:14;151:38;;;137:53;;134:2;;;203:1;200;193:12;134:2;3358:481:52;;;;;;;;;;;;;;;;;;;;;;;;;;3883:25;3858:7;;3866:1;3858:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;3858:21:52;;176:33:-1;3858:21:52;;;;-1:-1:-1;3858:21:52;;;:50;;;;;;;;;3854:870;;;3969:17;;;;3957:43;4034:4;4065:7;;4073:1;4065:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;4065:23:52;;176:33:-1;4065:23:52;;;;-1:-1:-1;4065:23:52;;;;;4114:7;;4122:1;4114:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;4114:17:52;3957:202;;;;;;;;;;;;;176:33:-1;;;;4114:23:52;;;;-1:-1:-1;3957:202:52;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3957:202:52;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3957:202:52;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3957:202:52;;;;;;;;;3928:303;;;;;;;;;;;;;;3854:870;;;4281:24;4256:7;;4264:1;4256:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;4256:21:52;;176:33:-1;4256:21:52;;;;-1:-1:-1;4256:21:52;;;:49;;;;;;;;;4252:472;;;4366:17;;;;4354:43;4423:7;;4431:1;4423:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;4423:23:52;;176:33:-1;4423:23:52;;;;-1:-1:-1;4423:23:52;;;;;4480:4;4511:7;;4519:1;4511:10;;;;;;;;;;;;-1:-1:-1;30:25;;92:50;100:14;96:29;;;92:50;68:75;;58:2;;157:1;154;147:12;58:2;4511:17:52;4354:202;;;;;;;;;;;;;176:33:-1;;;;4511:23:52;;;;-1:-1:-1;4354:202:52;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4354:202:52;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4354:202:52;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4354:202:52;;;;;;;;;4325:302;;;;;;;;;;;;;4252:472;4666:43;;;;;;;;;;;4252:472;3334:3;;3297:1437;;;;2869:1871;;;;:::o;4978:112::-;5036:7;5066:17;;;4978:112;:::o;2062:1082:17:-;2276:14;2416:29;:27;:29::i;:::-;2402:43;;:10;:43;;;2381:136;;;;;;;;;;;;;;2560:28;;:::i;:::-;2592:43;;;;2603:17;2592:43;;;2559:76;;2708:35;2746:33;2762:4;2768:10;2746:15;:33::i;:::-;2708:71;;2850:33;2886:102;2914:4;2932:2;2948:6;2968:10;2886:14;:102::i;:::-;2850:138;;3060:17;:15;:17::i;:::-;3054:32;;;3087:8;3097:7;3054:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3054:51:17;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;3123:14:17;;2062:1082;-1:-1:-1;;;;;;;;;;;;;2062:1082:17:o;4817:122:52:-;4895:22;:37;;;;;;;;;;;;;;;;;4817:122::o;6005:183::-;6130:24;;:::i;:::-;6156;;:::i;:::-;6005:183;;;:::o;6513:184::-;6599:7;6629:10;1964:1;6629:35;:61;;6680:10;6629:61;;;6675:1;6629:61;6622:68;;6513:184;:::o;3377:557:17:-;3595:25;;3650:21;;3692:34;;;;;;;;;;;;;;;;3510:35;;3595:25;3650:21;;3692:34;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;3681:45:17;-1:-1:-1;3741:9:17;3736:192;3760:9;3756:1;:13;3736:192;;;3804:113;;;;;;;;3847:12;3804:113;;;;;;3885:14;3900:1;3885:17;;;;;;;;;;;;;;3804:113;;;3790:8;3799:1;3790:11;;;;;;;;;;;;;;;;;:127;3771:3;;3736:192;;;;3377:557;;;;;;:::o;4265:2015::-;4535:18;;;;;4588:20;;4628:38;;;;;;;;;;;;;;;;4448:33;;4588:20;4628:38;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;4618:48:17;-1:-1:-1;4681:9:17;4676:1598;4700:14;4696:1;:18;4676:1598;;;4779:32;;:::i;:::-;4814:13;4828:1;4814:16;;;;;;;;;;;;;;4779:51;;4901:20;4980:1;4939:12;:38;;;:42;4935:353;;;5016:197;5071:12;:36;;;5129:12;:38;;;5189:6;5016:33;:197::i;:::-;5001:212;;4935:353;;;-1:-1:-1;5267:6:17;4935:353;5371:24;5344:23;;:51;;;;;;;;;5340:924;;;5510:139;5552:11;5585:12;5619;5510:20;:139::i;:::-;5497:7;5505:1;5497:10;;;;;;;;;;;;;:152;;;;5340:924;;;5701:25;5674:23;;:52;;;;;;;;;5670:594;;;5827:139;5870:10;5902:12;5936;5827:21;:139::i;5670:594::-;6202:47;;;;;;;;;;;5670:594;-1:-1:-1;;4716:3:17;;4676:1598;;;;4265:2015;;;;;;;;:::o;6288:124:52:-;6400:4;6288:124;:::o;1141:603:65:-;1309:21;1350:110;1388:9;1415:11;1444:6;1350:20;:110::i;:::-;1346:289;;;1476:148;1498:125;1547:9;1574:11;1603:6;1498:31;:125::i;:::-;1476:21;:148::i;:::-;1661:46;1695:11;1661:25;:9;1679:6;1661:25;:17;:25;:::i;:::-;:33;:46;:33;:46;:::i;:::-;1645:62;-1:-1:-1;1141:603:65;;;;;;:::o;6574:1391:17:-;6765:37;;:::i;:::-;6858:35;;:::i;:::-;6896:379;;;;;;;;;6934:4;6896:379;;;;;-1:-1:-1;6896:379:17;;;;7113:26;6896:379;;;;;;;7341:617;;;;;;;;;6858:417;;-1:-1:-1;7341:617:17;-1:-1:-1;7341:617:17;;;;;7545:12;:23;;;7341:617;;;;7459:10;7341:617;;;;7662:12;:21;;;7341:617;;;;7889:1;7341:617;;;;7756:11;7341:617;;;;;;7921:1;7341:617;;;;;;;;;;;;;;;;;;;7325:633;;6574:1391;;;;;;:::o;8230:1412::-;8421:38;;:::i;:::-;8515:41;;:::i;:::-;-1:-1:-1;8559:393:17;;;;;;;;-1:-1:-1;8559:393:17;;;;;;;;;;;;;;;;;;;9015:620;;;;;;;;8559:393;9015:620;9058:25;9015:620;;4566:1880:65;4729:12;4761:16;4757:109;;4793:62;4815:39;:37;:39::i;4793:62::-;5676:11;;;:29;;-1:-1:-1;5691:14:65;;5676:29;5672:72;;;-1:-1:-1;5728:5:65;5721:12;;5672:72;6239:17;6322:11;6259:84;;;;;6299:9;6279:6;6259:84;6239:104;-1:-1:-1;6390:25:65;:9;6408:6;6390:25;:17;:25;:::i;:::-;6363:23;:9;6381:4;6363:23;:17;:23;:::i;:::-;:52;;;4566:1880;-1:-1:-1;;;;;4566:1880:65:o;520:335:66:-;676:12;312:10;747:23;;784:9;807:11;832:6;711:137;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;711:137:66;;;49:4:-1;25:18;;61:17;;711:137:66;182:15:-1;711:137:66;;;;179:29:-1;;;;160:49;;;711:137:66;-1:-1:-1;520:335:66;;;;;:::o;1511:170:75:-;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;122:448:76;208:7;235:6;231:45;;-1:-1:-1;264:1:76;257:8;;231:45;297:5;;;301:1;297;:5;:1;316:5;;;;;:10;312:234;;342:193;364:170;421:61;500:1;519;364:39;:170::i;342:193::-;562:1;-1:-1:-1;122:448:76;;;;;:::o;576:383::-;662:7;689:6;685:223;;711:186;733:163;790:54;862:1;881;733:39;:163::i;711:186::-;917:9;933:1;929;:5;;;;;;;576:383;-1:-1:-1;;;;576:383:76:o;372:142:66:-;485:22;;;;;;;;;;;;;;;;;372:142;:::o;731:322:77:-;884:12;196:10;955:28;;997:9;1020:1;1035;919:127;;;;;;;;;;;1847:4852:52;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;1847:4852:52;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;1847:4852:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;1847:4852:52;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;1847:4852:52;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;37445:42;37434:54;;39249:35;;39239:2;;39298:1;;39288:12;177:379;;;334:3;327:4;319:6;315:17;311:27;301:2;;-1:-1;;342:12;301:2;-1:-1;372:20;;412:18;401:30;;398:2;;;-1:-1;;434:12;398:2;478:4;470:6;466:17;454:29;;529:3;478:4;521;513:6;509:17;470:6;495:32;;492:41;489:2;;;546:1;;536:12;489:2;294:262;;;;;;1026:777;;1165:3;1158:4;1150:6;1146:17;1142:27;1132:2;;-1:-1;;1173:12;1132:2;1220:6;1207:20;1242:102;1257:86;1336:6;1257:86;;;1242:102;;;1372:21;;;1233:111;-1:-1;1416:4;1429:14;;;;1404:17;;;1530:4;1518:17;;1509:27;;;;1506:36;-1:-1;1503:2;;;1555:1;;1545:12;1503:2;1580:1;1565:232;1590:6;1587:1;1584:13;1565:232;;;1530:4;4627:9;4622:3;4618:19;4614:30;4611:2;;;1580:1;;4647:12;4611:2;4675:20;1530:4;4675:20;;;3851:6;3838:20;3863:55;3912:5;3863:55;;;4758:96;;4975:22;;;6338:20;4936:16;;;4929:75;5069:2;5123:22;;;6338:20;5084:16;;;5077:75;5232:2;5286:22;;;6338:20;5247:16;;;5240:75;5397:3;5452:22;;;6338:20;5413:16;;;5406:75;1658:76;;1748:14;;;;1530:4;1776:14;;;;1612:1;1605:9;1565:232;;;1569:14;;;;;1125:678;;;;;6408:241;;6512:2;6500:9;6491:7;6487:23;6483:32;6480:2;;;-1:-1;;6518:12;6480:2;6580:53;6625:7;6601:22;6580:53;;6656:366;;;6777:2;6765:9;6756:7;6752:23;6748:32;6745:2;;;-1:-1;;6783:12;6745:2;6845:53;6890:7;6866:22;6845:53;;;6835:63;;6953:53;6998:7;6935:2;6978:9;6974:22;6953:53;;;6943:63;;6739:283;;;;;;7029:867;;;;;;;7220:3;7208:9;7199:7;7195:23;7191:33;7188:2;;;-1:-1;;7227:12;7188:2;7289:53;7334:7;7310:22;7289:53;;;7279:63;;7397:53;7442:7;7379:2;7422:9;7418:22;7397:53;;;7387:63;;7505:53;7550:7;7487:2;7530:9;7526:22;7505:53;;;7495:63;;7595:2;7638:9;7634:22;6338:20;7603:63;;7731:3;7720:9;7716:19;7703:33;7756:18;;7748:6;7745:30;7742:2;;;-1:-1;;7778:12;7742:2;7863:6;7852:9;7848:22;3352:3;3345:4;3337:6;3333:17;3329:27;3319:2;;-1:-1;;3360:12;3319:2;3403:6;3390:20;3380:30;;7756:18;3422:6;3419:30;3416:2;;;-1:-1;;3452:12;3416:2;3547:3;7379:2;3527:17;3488:6;3513:32;;3510:41;3507:2;;;-1:-1;;3554:12;3507:2;7182:714;;;;-1:-1;7182:714;;-1:-1;7182:714;;7379:2;3484:17;;7806:74;;-1:-1;;;7182:714;7903:784;;;;;8147:2;8135:9;8126:7;8122:23;8118:32;8115:2;;;-1:-1;;8153:12;8115:2;8211:17;8198:31;8249:18;;8241:6;8238:30;8235:2;;;-1:-1;;8271:12;8235:2;8309:107;8408:7;8399:6;8388:9;8384:22;8309:107;;;8299:117;;-1:-1;8299:117;-1:-1;8481:2;8466:18;;8453:32;;-1:-1;8494:30;;;8491:2;;;-1:-1;;8527:12;8491:2;8654:6;8643:9;8639:22;754:3;747:4;739:6;735:17;731:27;721:2;;-1:-1;;762:12;721:2;805:6;792:20;782:30;;8249:18;824:6;821:30;818:2;;;-1:-1;;854:12;818:2;949:3;8481:2;;933:6;929:17;890:6;915:32;;912:41;909:2;;;-1:-1;;956:12;909:2;8109:578;;;;-1:-1;;8481:2;886:17;;;;-1:-1;;;8109:578;8694:451;;;8860:2;8848:9;8839:7;8835:23;8831:32;8828:2;;;-1:-1;;8866:12;8828:2;8924:17;8911:31;8962:18;8954:6;8951:30;8948:2;;;-1:-1;;8984:12;8948:2;9022:107;9121:7;9112:6;9101:9;9097:22;9022:107;;;9012:117;;;;-1:-1;8822:323;-1:-1;;;;8822:323;9152:235;;9253:2;9241:9;9232:7;9228:23;9224:32;9221:2;;;-1:-1;;9259:12;9221:2;3035:6;3022:20;3047:30;3071:5;3047:30;;9394:257;;9506:2;9494:9;9485:7;9481:23;9477:32;9474:2;;;-1:-1;;9512:12;9474:2;3170:6;3164:13;3182:30;3206:5;3182:30;;9658:271;;9777:2;9765:9;9756:7;9752:23;9748:32;9745:2;;;-1:-1;;9783:12;9745:2;3677:6;3664:20;39516:1;39509:5;39506:12;39496:2;;-1:-1;;39522:12;9936:285;;10062:2;10050:9;10041:7;10037:23;10033:32;10030:2;;;-1:-1;;10068:12;10030:2;3851:6;3838:20;3863:55;3912:5;3863:55;;10514:303;;10649:2;10637:9;10628:7;10624:23;10620:32;10617:2;;;-1:-1;;10655:12;10617:2;-1:-1;10707:94;10611:206;-1:-1;10611:206;10824:375;;10952:2;;10940:9;10931:7;10927:23;10923:32;10920:2;;;-1:-1;;10958:12;10920:2;11016:17;11003:31;11054:18;;11046:6;11043:30;11040:2;;;-1:-1;;11076:12;11040:2;11166:6;11155:9;11151:22;5658:4;5646:9;5641:3;5637:19;5633:30;5630:2;;;-1:-1;;5666:12;5630:2;5694:20;5658:4;5694:20;;;5685:29;;5787:17;5774:31;11054:18;5817:6;5814:30;5811:2;;;-1:-1;;5847:12;5811:2;5949:6;5938:9;5934:22;2364:3;2357:4;2349:6;2345:17;2341:27;2331:2;;-1:-1;;2372:12;2331:2;2419:6;2406:20;2392:34;;2441:76;2456:60;2509:6;2456:60;;2441:76;2545:21;;;2602:14;;;;2577:17;;;2691;;;2682:27;;;;2679:36;-1:-1;2676:2;;;-1:-1;;2718:12;2676:2;-1:-1;2744:10;;2738:206;2763:6;2760:1;2757:13;2738:206;;;6338:20;;2831:50;;2785:1;2778:9;;;;;2895:14;;;;2923;;2738:206;;;-1:-1;5867:96;;-1:-1;;;6040:18;;;6027:32;6068:30;;;6065:2;;;-1:-1;;6101:12;6065:2;6146:96;6238:3;6229:6;6218:9;6214:22;6146:96;;;10952:2;6132:5;6128:16;6121:122;;;;11096:87;;;;;10914:285;;;;;11206:241;;11310:2;11298:9;11289:7;11285:23;11281:32;11278:2;;;-1:-1;;11316:12;11278:2;-1:-1;6338:20;;11272:175;-1:-1;11272:175;12002:103;37445:42;37434:54;12063:37;;12057:48;14658:293;;35654:6;35649:3;35642:19;38267:6;38262:3;35691:4;35686:3;35682:14;38244:30;-1:-1;35691:4;38314:6;35686:3;38305:16;;38298:27;35691:4;38700:7;38704:2;14937:6;38684:14;38680:28;35686:3;14906:39;;14899:46;;14754:197;;;;;;14959:315;;15083:5;34886:12;35654:6;35649:3;35642:19;-1:-1;38412:101;38426:6;38423:1;38420:13;38412:101;;;35691:4;38493:11;;;;;38487:18;38474:11;;;;;38467:39;38441:10;38412:101;;;38528:6;38525:1;38522:13;38519:2;;;-1:-1;35691:4;38584:6;35686:3;38575:16;;38568:27;38519:2;-1:-1;38704:2;38684:14;38700:7;38680:28;15230:39;;;;35691:4;15230:39;;15035:239;-1:-1;;15035:239;18695:473;18899:23;;37445:42;37434:54;12063:37;;19072:4;19061:16;;;19055:23;19132:14;;24681:37;18805:363;19232:1613;;19375:6;19455:16;19449:23;38805:1;38798:5;38795:12;38785:2;;38811:9;38785:2;37671:39;15362:3;15355:63;;19639:4;19632:5;19628:16;19622:23;19639:4;19703:3;19699:14;24681:37;19795:4;19788:5;19784:16;19778:23;19807:117;19795:4;19913:3;19909:14;19895:12;19807:117;;;;20014:4;20007:5;20003:16;19997:23;20083:4;20078:3;20074:14;24681:37;20181:4;20174:5;20170:16;20164:23;20250:4;20245:3;20241:14;24681:37;20343:4;20336:5;20332:16;20326:23;20355:65;20412:6;20407:3;20403:16;20389:12;20355:65;;;;20083:4;20503:5;20499:16;20493:23;20579:6;20574:3;20570:16;24681:37;20250:4;20659:5;20655:16;20649:23;19375:6;20701;20696:3;20692:16;20685:40;20740:67;19375:6;19370:3;19366:16;20788:12;20740:67;;;20829:11;19348:1497;-1:-1;;;;;19348:1497;20911:817;21120:16;21114:23;36589:13;36582:21;14368:3;14361:34;37821:46;21287:4;21280:5;21276:16;21270:23;37821:46;;;21287:4;21371:3;21367:14;15670:70;37975:43;21460:4;21453:5;21449:16;21443:23;37975:43;;;21460:4;21537:14;;16003:67;21632:4;21621:16;;;21615:23;21692:14;;24681:37;21021:707;24850:213;37445:42;37434:54;;;;12063:37;;24968:2;24953:18;;24939:124;25070:435;37445:42;37434:54;;;12063:37;;37434:54;;;;25408:2;25393:18;;12063:37;25491:2;25476:18;;24681:37;;;;25244:2;25229:18;;25215:290;25512:324;37445:42;37434:54;;;;12063:37;;25822:2;25807:18;;24681:37;25658:2;25643:18;;25629:207;25843:816;26187:2;26201:47;;;34886:12;;26172:18;;;35642:19;;;25843:816;;35691:4;;35682:14;;;;34533;;;25843:816;12830:335;12855:6;12852:1;12849:13;12830:335;;;11592:100;11688:3;12922:6;12916:13;11592:100;;;26187:2;11712:14;;;;;35333;;;;12877:1;12870:9;12830:335;;;-1:-1;;;26458:20;;;26438:18;;;26431:48;34886:12;;35642:19;;;35682:14;;;;13705:17;;;13696:27;;;;34533:14;;;-1:-1;13857:402;13882:6;13879:1;13876:13;13857:402;;;13934:20;35686:3;13938:4;13934:20;;13929:3;13922:33;11890:98;11984:3;13989:6;13983:13;11890:98;;;14238:14;;;;14003:120;-1:-1;35333:14;;;;12877:1;13897:9;13857:402;;;-1:-1;26485:164;;26158:501;-1:-1;;;;;;;;;26158:501;26666:201;36589:13;;36582:21;14361:34;;26778:2;26763:18;;26749:118;26874:209;36687:66;36676:78;;;;14587:36;;26990:2;26975:18;;26961:122;27090:1519;;27558:3;38805:1;38798:5;38795:12;38785:2;;38811:9;38785:2;37671:39;15362:3;15355:63;24711:5;27736:2;27725:9;27721:18;24681:37;14388:5;36589:13;36582:21;27813:2;27802:9;27798:18;14361:34;36999:55;37048:5;36999:55;;;37821:46;27916:2;27905:9;27901:18;15670:70;36999:55;37048:5;36999:55;;;37975:43;28016:3;28005:9;28001:19;16003:67;24711:5;28100:3;28089:9;28085:19;24681:37;24711:5;28184:3;28173:9;28169:19;24681:37;24711:5;28268:3;28257:9;28253:19;24681:37;28284:73;28352:3;28341:9;28337:19;28328:6;28284:73;;;24711:5;28436:3;28425:9;28421:19;24681:37;27558:3;28474;28463:9;28459:19;28452:49;28515:84;27558:3;27547:9;27543:19;28584:7;28575;28515:84;;;28507:92;27529:1080;-1:-1;;;;;;;;;;;;;;;27529:1080;28616:473;28809:2;28794:18;;39161:1;39151:12;;39141:2;;39167:9;39141:2;16339:69;;;28992:2;28977:18;;24681:37;;;;29075:2;29060:18;;;24681:37;28780:309;;29096:407;29287:2;29301:47;;;16645:2;29272:18;;;35642:19;16681:34;35682:14;;;16661:55;16750:16;16736:12;;;16729:38;16786:12;;;29258:245;29510:407;29701:2;29715:47;;;17037:2;29686:18;;;35642:19;17073:31;35682:14;;;17053:52;17124:12;;;29672:245;29924:407;30115:2;30129:47;;;17375:2;30100:18;;;35642:19;17411:34;35682:14;;;17391:55;17480:3;17466:12;;;17459:25;17503:12;;;30086:245;30338:407;30529:2;30543:47;;;17754:2;30514:18;;;35642:19;17790:34;35682:14;;;17770:55;17859:9;17845:12;;;17838:31;17888:12;;;30500:245;30752:407;30943:2;30957:47;;;18139:2;30928:18;;;35642:19;18175:32;35682:14;;;18155:53;18227:12;;;30914:245;31166:407;31357:2;31371:47;;;18478:2;31342:18;;;35642:19;18514:34;35682:14;;;18494:55;18583:7;18569:12;;;18562:29;18610:12;;;31328:245;31580:301;21984:23;;24681:37;;31742:2;31727:18;;31713:168;32200:326;23111:23;;21984;24681:37;;23335:4;23324:16;;;23318:23;21984;23435:14;;;24681:37;23537:4;23526:16;;;23520:23;21984;23637:14;;;24681:37;23743:4;23732:16;;;23726:23;21984;23845:14;;;24681:37;;;;32374:3;32359:19;;32345:181;32533:508;21984:23;;24681:37;;21984:23;33027:2;33012:18;;24681:37;32771:2;32756:18;;32742:299;33048:435;24681:37;;;33386:2;33371:18;;24681:37;;;;33469:2;33454:18;;24681:37;33222:2;33207:18;;33193:290;33490:256;33552:2;33546:9;33578:17;;;33653:18;33638:34;;33674:22;;;33635:62;33632:2;;;33710:1;;33700:12;33632:2;33552;33719:22;33530:216;;-1:-1;33530:216;33753:326;;33934:18;33926:6;33923:30;33920:2;;;-1:-1;;33956:12;33920:2;-1:-1;34001:4;33989:17;;;34054:15;;33857:222;36909:150;36982:16;38925:1;38915:12;;38905:2;;38931:9;38834:113;38925:1;38918:5;38915:12;38905:2;;38931:9;38905:2;38899:48;;39314:111;39395:5;36589:13;36582:21;39373:5;39370:32;39360:2;;39416:1;;39406:12;39548:116;39639:1;39632:5;39629:12;39619:2;;39655:1;;39645:12"
            }
        }
    },
    "sourceTreeHashHex": "0x0257ed92efc670a59ba27caccec7cfe661cc987a96b6f17774c021696cb187e0",
    "sources": {
        "./TestDydxBridge.sol": {
            "id": 52,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"../src/bridges/DydxBridge.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract TestDydxBridgeToken {\n\n    uint256 private constant INIT_HOLDER_BALANCE = 10 * 10**18; // 10 tokens\n    mapping (address => uint256) private _balances;\n\n    /// @dev Sets initial balance of token holders.\n    constructor(address[] memory holders)\n        public\n    {\n        for (uint256 i = 0; i != holders.length; ++i) {\n            _balances[holders[i]] = INIT_HOLDER_BALANCE;\n        }\n        _balances[msg.sender] = INIT_HOLDER_BALANCE;\n    }\n\n    /// @dev Basic transferFrom implementation.\n    function transferFrom(address from, address to, uint256 amount)\n        external\n        returns (bool)\n    {\n        if (_balances[from] < amount || _balances[to] + amount < _balances[to]) {\n            return false;\n        }\n        _balances[from] -= amount;\n        _balances[to] += amount;\n        return true;\n    }\n\n    /// @dev Returns balance of `holder`.\n    function balanceOf(address holder)\n        external\n        view\n        returns (uint256)\n    {\n        return _balances[holder];\n    }\n}\n\n\n// solhint-disable space-after-comma\ncontract TestDydxBridge is\n    IDydx,\n    DydxBridge\n{\n\n    address private constant ALWAYS_REVERT_ADDRESS = address(1);\n    address private _testTokenAddress;\n    bool private _shouldRevertOnOperate;\n\n    event OperateAccount(\n        address owner,\n        uint256 number\n    );\n\n    event OperateAction(\n        ActionType actionType,\n        uint256 accountIdx,\n        bool amountSign,\n        AssetDenomination amountDenomination,\n        AssetReference amountRef,\n        uint256 amountValue,\n        uint256 primaryMarketId,\n        uint256 secondaryMarketId,\n        address otherAddress,\n        uint256 otherAccountId,\n        bytes data\n    );\n\n    constructor(address[] memory holders)\n        public\n    {\n        // Deploy a test token. This represents the asset being deposited/withdrawn from dydx.\n        _testTokenAddress = address(new TestDydxBridgeToken(holders));\n    }\n\n    /// @dev Simulates `operate` in dydx contract.\n    ///      Emits events so that arguments can be validated client-side.\n    function operate(\n        AccountInfo[] calldata accounts,\n        ActionArgs[] calldata actions\n    )\n        external\n    {\n        if (_shouldRevertOnOperate) {\n            revert(\"TestDydxBridge/SHOULD_REVERT_ON_OPERATE\");\n        }\n\n        for (uint i = 0; i < accounts.length; ++i) {\n            emit OperateAccount(\n                accounts[i].owner,\n                accounts[i].number\n            );\n        }\n\n        for (uint i = 0; i < actions.length; ++i) {\n            emit OperateAction(\n                actions[i].actionType,\n                actions[i].accountIdx,\n                actions[i].amount.sign,\n                actions[i].amount.denomination,\n                actions[i].amount.ref,\n                actions[i].amount.value,\n                actions[i].primaryMarketId,\n                actions[i].secondaryMarketId,\n                actions[i].otherAddress,\n                actions[i].otherAccountIdx,\n                actions[i].data\n            );\n\n            if (actions[i].actionType == IDydx.ActionType.Withdraw) {\n                require(\n                    IERC20Token(_testTokenAddress).transferFrom(\n                        address(this),\n                        actions[i].otherAddress,\n                        actions[i].amount.value\n                    ),\n                    \"TestDydxBridge/WITHDRAW_FAILED\"\n                );\n            } else if (actions[i].actionType == IDydx.ActionType.Deposit) {\n                require(\n                    IERC20Token(_testTokenAddress).transferFrom(\n                        actions[i].otherAddress,\n                        address(this),\n                        actions[i].amount.value\n                    ),\n                    \"TestDydxBridge/DEPOSIT_FAILED\"\n                );\n            } else {\n                revert(\"TestDydxBridge/UNSUPPORTED_ACTION\");\n            }\n        }\n    }\n\n    /// @dev If `true` then subsequent calls to `operate` will revert.\n    function setRevertOnOperate(bool shouldRevert)\n        external\n    {\n        _shouldRevertOnOperate = shouldRevert;\n    }\n\n    /// @dev Returns test token.\n    function getTestToken()\n        external\n        returns (address)\n    {\n        return _testTokenAddress;\n    }\n\n    /// @dev Unused.\n    function setOperators(OperatorArg[] calldata args) external {}\n\n    /// @dev Unused.\n    function getIsLocalOperator(\n        address owner,\n        address operator\n    )\n        external\n        view\n        returns (bool isLocalOperator)\n    {}\n\n    /// @dev Unused.\n    function getMarketTokenAddress(\n        uint256 marketId\n    )\n        external\n        view\n        returns (address tokenAddress)\n    {}\n\n    /// @dev Unused.\n    function getRiskParams()\n        external\n        view\n        returns (RiskParams memory riskParams)\n    {}\n\n    /// @dev Unsused.\n    function getMarketPrice(\n        uint256 marketId\n    )\n        external\n        view\n        returns (Price memory price)\n    {}\n\n    /// @dev Unsused\n    function getMarketMarginPremium(uint256 marketId)\n        external\n        view\n        returns (IDydx.D256 memory premium)\n    {}\n\n    /// @dev Unused.\n    function getAdjustedAccountValues(\n        AccountInfo calldata account\n    )\n        external\n        view\n        returns (Value memory supplyValue, Value memory borrowValue)\n    {}\n\n    /// @dev overrides `_getDydxAddress()` from `DeploymentConstants` to return this address.\n    function _getDydxAddress()\n        internal\n        view\n        returns (address)\n    {\n        return address(this);\n    }\n\n    /// @dev overrides `_getERC20BridgeProxyAddress()` from `DeploymentConstants` for testing.\n    function _getERC20BridgeProxyAddress()\n        internal\n        view\n        returns (address)\n    {\n        return msg.sender == ALWAYS_REVERT_ADDRESS ? address(0) : msg.sender;\n    }\n}\n"
        },
        "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": {
            "id": 62,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Token {\n\n    // solhint-disable no-simple-event-func-name\n    event Transfer(\n        address indexed _from,\n        address indexed _to,\n        uint256 _value\n    );\n\n    event Approval(\n        address indexed _owner,\n        address indexed _spender,\n        uint256 _value\n    );\n\n    /// @dev send `value` token to `to` from `msg.sender`\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transfer(address _to, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n    /// @param _from The address of the sender\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _value\n    )\n        external\n        returns (bool);\n\n    /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @param _value The amount of wei to be approved for transfer\n    /// @return Always true if the call has enough gas to complete execution\n    function approve(address _spender, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev Query total supply of token\n    /// @return Total supply of token\n    function totalSupply()\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address from which the balance will be retrieved\n    /// @return Balance of owner\n    function balanceOf(address _owner)\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address of the account owning tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @return Amount of remaining tokens allowed to spent\n    function allowance(address _owner, address _spender)\n        external\n        view\n        returns (uint256);\n}\n"
        },
        "../src/bridges/DydxBridge.sol": {
            "id": 17,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/DeploymentConstants.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibMath.sol\";\nimport \"../interfaces/IERC20Bridge.sol\";\nimport \"../interfaces/IDydxBridge.sol\";\nimport \"../interfaces/IDydx.sol\";\n\n\ncontract DydxBridge is\n    IERC20Bridge,\n    IDydxBridge,\n    DeploymentConstants\n{\n\n    using LibSafeMath for uint256;\n\n    /// @dev Callback for `IERC20Bridge`. Deposits or withdraws tokens from a dydx account.\n    ///      Notes:\n    ///         1. This bridge must be set as an operator of the input dydx account.\n    ///         2. This function may only be called in the context of the 0x Exchange.\n    ///         3. The maker or taker of the 0x order must be the dydx account owner.\n    ///         4. Deposits into dydx are made from the `from` address.\n    ///         5. Withdrawals from dydx are made to the `to` address.\n    ///         6. Calling this function must always withdraw at least `amount`,\n    ///            otherwise the `ERC20Bridge` will revert.\n    /// @param from The sender of the tokens and owner of the dydx account.\n    /// @param to The recipient of the tokens.\n    /// @param amount Minimum amount of `toTokenAddress` tokens to deposit or withdraw.\n    /// @param encodedBridgeData An abi-encoded `BridgeData` struct.\n    /// @return success The magic bytes if successful.\n    function bridgeTransferFrom(\n        address, /* toTokenAddress */\n        address from,\n        address to,\n        uint256 amount,\n        bytes calldata encodedBridgeData\n    )\n        external\n        returns (bytes4 success)\n    {\n        // Ensure that only the `ERC20BridgeProxy` can call this function.\n        require(\n            msg.sender == _getERC20BridgeProxyAddress(),\n            \"DydxBridge/ONLY_CALLABLE_BY_ERC20_BRIDGE_PROXY\"\n        );\n\n        // Decode bridge data.\n        (BridgeData memory bridgeData) = abi.decode(encodedBridgeData, (BridgeData));\n\n        // The dydx accounts are owned by the `from` address.\n        IDydx.AccountInfo[] memory accounts = _createAccounts(from, bridgeData);\n\n        // Create dydx actions to run on the dydx accounts.\n        IDydx.ActionArgs[] memory actions = _createActions(\n            from,\n            to,\n            amount,\n            bridgeData\n        );\n\n        // Run operation. This will revert on failure.\n        IDydx(_getDydxAddress()).operate(accounts, actions);\n\n        return BRIDGE_SUCCESS;\n    }\n\n    /// @dev Creates an array of accounts for dydx to operate on.\n    ///      All accounts must belong to the same owner.\n    /// @param accountOwner Owner of the dydx account.\n    /// @param bridgeData A `BridgeData` struct.\n    function _createAccounts(\n        address accountOwner,\n        BridgeData memory bridgeData\n    )\n        internal\n        returns (IDydx.AccountInfo[] memory accounts)\n    {\n        uint256[] memory accountNumbers = bridgeData.accountNumbers;\n        uint256 nAccounts = accountNumbers.length;\n        accounts = new IDydx.AccountInfo[](nAccounts);\n        for (uint256 i = 0; i < nAccounts; ++i) {\n            accounts[i] = IDydx.AccountInfo({\n                owner: accountOwner,\n                number: accountNumbers[i]\n            });\n        }\n    }\n\n    /// @dev Creates an array of actions to carry out on dydx.\n    /// @param depositFrom Deposit value from this address (owner of the dydx account).\n    /// @param withdrawTo Withdraw value to this address.\n    /// @param amount The amount of value available to operate on.\n    /// @param bridgeData A `BridgeData` struct.\n    function _createActions(\n        address depositFrom,\n        address withdrawTo,\n        uint256 amount,\n        BridgeData memory bridgeData\n    )\n        internal\n        returns (IDydx.ActionArgs[] memory actions)\n    {\n        BridgeAction[] memory bridgeActions = bridgeData.actions;\n        uint256 nBridgeActions = bridgeActions.length;\n        actions = new IDydx.ActionArgs[](nBridgeActions);\n        for (uint256 i = 0; i < nBridgeActions; ++i) {\n            // Cache current bridge action.\n            BridgeAction memory bridgeAction = bridgeActions[i];\n\n            // Scale amount, if conversion rate is set.\n            uint256 scaledAmount;\n            if (bridgeAction.conversionRateDenominator > 0) {\n                scaledAmount = LibMath.safeGetPartialAmountFloor(\n                    bridgeAction.conversionRateNumerator,\n                    bridgeAction.conversionRateDenominator,\n                    amount\n                );\n            } else {\n                scaledAmount = amount;\n            }\n\n            // Construct dydx action.\n            if (bridgeAction.actionType == BridgeActionType.Deposit) {\n                // Deposit tokens from the account owner into their dydx account.\n                actions[i] = _createDepositAction(\n                    depositFrom,\n                    scaledAmount,\n                    bridgeAction\n                );\n            } else if (bridgeAction.actionType == BridgeActionType.Withdraw) {\n                // Withdraw tokens from dydx to the `otherAccount`.\n                actions[i] = _createWithdrawAction(\n                    withdrawTo,\n                    scaledAmount,\n                    bridgeAction\n                );\n            } else {\n                // If all values in the `Action` enum are handled then this\n                // revert is unreachable: Solidity will revert when casting\n                // from `uint8` to `Action`.\n                revert(\"DydxBridge/UNRECOGNIZED_BRIDGE_ACTION\");\n            }\n        }\n    }\n\n    /// @dev Returns a dydx `DepositAction`.\n    /// @param depositFrom Deposit tokens from this address who is also the account owner.\n    /// @param amount of tokens to deposit.\n    /// @param bridgeAction A `BridgeAction` struct.\n    /// @return depositAction The encoded dydx action.\n    function _createDepositAction(\n        address depositFrom,\n        uint256 amount,\n        BridgeAction memory bridgeAction\n    )\n        internal\n        pure\n        returns (\n            IDydx.ActionArgs memory depositAction\n        )\n    {\n        // Create dydx amount.\n        IDydx.AssetAmount memory dydxAmount = IDydx.AssetAmount({\n            sign: true,                                 // true if positive.\n            denomination: IDydx.AssetDenomination.Wei,  // Wei => actual token amount held in account.\n            ref: IDydx.AssetReference.Delta,                // Delta => a relative amount.\n            value: amount                               // amount to deposit.\n        });\n\n        // Create dydx deposit action.\n        depositAction = IDydx.ActionArgs({\n            actionType: IDydx.ActionType.Deposit,           // deposit tokens.\n            amount: dydxAmount,                             // amount to deposit.\n            accountIdx: bridgeAction.accountIdx,             // index in the `accounts` when calling `operate`.\n            primaryMarketId: bridgeAction.marketId,         // indicates which token to deposit.\n            otherAddress: depositFrom,                      // deposit from the account owner.\n            // unused parameters\n            secondaryMarketId: 0,\n            otherAccountIdx: 0,\n            data: hex''\n        });\n    }\n\n    /// @dev Returns a dydx `WithdrawAction`.\n    /// @param withdrawTo Withdraw tokens to this address.\n    /// @param amount of tokens to withdraw.\n    /// @param bridgeAction A `BridgeAction` struct.\n    /// @return withdrawAction The encoded dydx action.\n    function _createWithdrawAction(\n        address withdrawTo,\n        uint256 amount,\n        BridgeAction memory bridgeAction\n    )\n        internal\n        pure\n        returns (\n            IDydx.ActionArgs memory withdrawAction\n        )\n    {\n        // Create dydx amount.\n        IDydx.AssetAmount memory amountToWithdraw = IDydx.AssetAmount({\n            sign: false,                                    // false if negative.\n            denomination: IDydx.AssetDenomination.Wei,      // Wei => actual token amount held in account.\n            ref: IDydx.AssetReference.Delta,                // Delta => a relative amount.\n            value: amount                                   // amount to withdraw.\n        });\n\n        // Create withdraw action.\n        withdrawAction = IDydx.ActionArgs({\n            actionType: IDydx.ActionType.Withdraw,          // withdraw tokens.\n            amount: amountToWithdraw,                       // amount to withdraw.\n            accountIdx: bridgeAction.accountIdx,            // index in the `accounts` when calling `operate`.\n            primaryMarketId: bridgeAction.marketId,         // indicates which token to withdraw.\n            otherAddress: withdrawTo,                       // withdraw tokens to this address.\n            // unused parameters\n            secondaryMarketId: 0,\n            otherAccountIdx: 0,\n            data: hex''\n        });\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/DeploymentConstants.sol": {
            "id": 68,
            "content": "/*\n\n  Copyright 2020 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract DeploymentConstants {\n\n    // solhint-disable separate-by-one-line-in-contract\n\n    // Mainnet addresses ///////////////////////////////////////////////////////\n    /// @dev Mainnet address of the WETH contract.\n    address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\n    /// @dev Mainnet address of the KyberNetworkProxy contract.\n    address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x9AAb3f75489902f3a48495025729a0AF77d4b11e;\n    /// @dev Mainnet address of the KyberHintHandler contract.\n    address constant private KYBER_HINT_HANDLER_ADDRESS = 0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C;\n    /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;\n    /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    address constant private ETH2DAI_ADDRESS = 0x794e6e91555438aFc3ccF1c5076A74F42133d08D;\n    /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x8ED95d1746bf1E4dAb58d8ED4724f1Ef95B20Db0;\n    ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    address constant private DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;\n    /// @dev Mainnet address of the `Chai` contract\n    address constant private CHAI_ADDRESS = 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215;\n    /// @dev Mainnet address of the 0x DevUtils contract.\n    address constant private DEV_UTILS_ADDRESS = 0x74134CF88b21383713E096a5ecF59e297dc7f547;\n    /// @dev Kyber ETH pseudo-address.\n    address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    /// @dev Mainnet address of the dYdX contract.\n    address constant private DYDX_ADDRESS = 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e;\n    /// @dev Mainnet address of the GST2 contract\n    address constant private GST_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04;\n    /// @dev Mainnet address of the GST Collector\n    address constant private GST_COLLECTOR_ADDRESS = 0x000000D3b08566BE75A6DB803C03C85C0c1c5B96;\n    /// @dev Mainnet address of the mStable mUSD contract.\n    address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5;\n    /// @dev Mainnet address of the Mooniswap Registry contract\n    address constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303;\n    /// @dev Mainnet address of the DODO Registry (ZOO) contract\n    address constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950;\n    /// @dev Mainnet address of the DODO Helper contract\n    address constant private DODO_HELPER = 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb;\n\n    // // Ropsten addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0xd719c34261e099Fdb33030ac8909d5788D3039C4;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xb344afeD348de15eb4a9e180205A2B0739628339;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0xC812AF3f3fBC62F76ea4262576EC0f49dB8B7f1c;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = 0x4E1000616990D83e56f4b5fC6CC8602DcfD20459;\n\n    // // Rinkeby addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x0d5371e5EE23dec7DF251A8957279629aa79E9C5;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xA2AA4bEFED748Fba27a3bE7Dfd2C4b2c6DB1F49B;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x46B5BC959e8A754c0256FFF73bF34A52Ad5CdfA9;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    // // Kovan addresses /////////////////////////////////////////////////////////\n    // /// @dev Kovan address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;\n    // /// @dev Kovan address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x692f391bCc85cefCe8C237C01e1f636BbD70EA4D;\n    // /// @dev Kovan address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30;\n    // /// @dev Kovan address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Kovan address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = 0xe325acB9765b02b8b418199bf9650972299235F4;\n    // /// @dev Kovan address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x3577552C1Fb7A44aD76BeEB7aB53251668A21F8D;\n    // /// @dev Kovan address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Kovan address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;\n    // /// @dev Kovan address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x9402639A828BdF4E9e4103ac3B69E1a6E522eB59;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Kovan address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    /// @dev Overridable way to get the `KyberNetworkProxy` address.\n    /// @return kyberAddress The `IKyberNetworkProxy` address.\n    function _getKyberNetworkProxyAddress()\n        internal\n        view\n        returns (address kyberAddress)\n    {\n        return KYBER_NETWORK_PROXY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `KyberHintHandler` address.\n    /// @return kyberAddress The `IKyberHintHandler` address.\n    function _getKyberHintHandlerAddress()\n        internal\n        view\n        returns (address hintHandlerAddress)\n    {\n        return KYBER_HINT_HANDLER_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the WETH address.\n    /// @return wethAddress The WETH address.\n    function _getWethAddress()\n        internal\n        view\n        returns (address wethAddress)\n    {\n        return WETH_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapExchangeFactory` address.\n    /// @return uniswapAddress The `UniswapExchangeFactory` address.\n    function _getUniswapExchangeFactoryAddress()\n        internal\n        view\n        returns (address uniswapAddress)\n    {\n        return UNISWAP_EXCHANGE_FACTORY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapV2Router01` address.\n    /// @return uniswapRouterAddress The `UniswapV2Router01` address.\n    function _getUniswapV2Router01Address()\n        internal\n        view\n        returns (address uniswapRouterAddress)\n    {\n        return UNISWAP_V2_ROUTER_01_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Eth2Dai `MatchingMarket` contract.\n    /// @return eth2daiAddress The Eth2Dai `MatchingMarket` contract.\n    function _getEth2DaiAddress()\n        internal\n        view\n        returns (address eth2daiAddress)\n    {\n        return ETH2DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `ERC20BridgeProxy` contract.\n    /// @return erc20BridgeProxyAddress The `ERC20BridgeProxy` contract.\n    function _getERC20BridgeProxyAddress()\n        internal\n        view\n        returns (address erc20BridgeProxyAddress)\n    {\n        return ERC20_BRIDGE_PROXY_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Dai` contract.\n    /// @return daiAddress The `Dai` contract.\n    function _getDaiAddress()\n        internal\n        view\n        returns (address daiAddress)\n    {\n        return DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Chai` contract.\n    /// @return chaiAddress The `Chai` contract.\n    function _getChaiAddress()\n        internal\n        view\n        returns (address chaiAddress)\n    {\n        return CHAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the 0x `DevUtils` contract address.\n    /// @return devUtils The 0x `DevUtils` contract address.\n    function _getDevUtilsAddress()\n        internal\n        view\n        returns (address devUtils)\n    {\n        return DEV_UTILS_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the DyDx contract.\n    /// @return exchange The DyDx exchange contract.\n    function _getDydxAddress()\n        internal\n        view\n        returns (address dydxAddress)\n    {\n        return DYDX_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST2 contract address.\n    /// @return gst The GST contract.\n    function _getGstAddress()\n        internal\n        view\n        returns (address gst)\n    {\n        return GST_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST Collector address.\n    /// @return collector The GST collector address.\n    function _getGstCollectorAddress()\n        internal\n        view\n        returns (address collector)\n    {\n        return GST_COLLECTOR_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the mStable mUSD address.\n    /// @return musd The mStable mUSD address.\n    function _getMUsdAddress()\n        internal\n        view\n        returns (address musd)\n    {\n        return MUSD_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Mooniswap registry address.\n    /// @return registry The Mooniswap registry address.\n    function _getMooniswapAddress()\n        internal\n        view\n        returns (address)\n    {\n        return MOONISWAP_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Registry contract address.\n    /// @return registry The DODO Registry contract address.\n    function _getDODORegistryAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Helper contract address.\n    /// @return registry The DODO Helper contract address.\n    function _getDODOHelperAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_HELPER;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibSafeMath.sol": {
            "id": 76,
            "content": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n    function safeMul(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (a == 0) {\n            return 0;\n        }\n        uint256 c = a * b;\n        if (c / a != b) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function safeDiv(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b == 0) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n                a,\n                b\n            ));\n        }\n        uint256 c = a / b;\n        return c;\n    }\n\n    function safeSub(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b > a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n                a,\n                b\n            ));\n        }\n        return a - b;\n    }\n\n    function safeAdd(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint256 c = a + b;\n        if (c < a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function max256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a >= b ? a : b;\n    }\n\n    function min256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a < b ? a : b;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibRichErrors.sol": {
            "id": 75,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n    // bytes4(keccak256(\"Error(string)\"))\n    bytes4 internal constant STANDARD_ERROR_SELECTOR =\n        0x08c379a0;\n\n    // solhint-disable func-name-mixedcase\n    /// @dev ABI encode a standard, string revert error payload.\n    ///      This is the same payload that would be included by a `revert(string)`\n    ///      solidity statement. It has the function signature `Error(string)`.\n    /// @param message The error string.\n    /// @return The ABI encoded error.\n    function StandardError(\n        string memory message\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            STANDARD_ERROR_SELECTOR,\n            bytes(message)\n        );\n    }\n    // solhint-enable func-name-mixedcase\n\n    /// @dev Reverts an encoded rich revert reason `errorData`.\n    /// @param errorData ABI encoded error data.\n    function rrevert(bytes memory errorData)\n        internal\n        pure\n    {\n        assembly {\n            revert(add(errorData, 0x20), mload(errorData))\n        }\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": {
            "id": 77,
            "content": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n    // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n    bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n        0xe946c1bb;\n\n    // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n    bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n        0xc996af7b;\n\n    enum BinOpErrorCodes {\n        ADDITION_OVERFLOW,\n        MULTIPLICATION_OVERFLOW,\n        SUBTRACTION_UNDERFLOW,\n        DIVISION_BY_ZERO\n    }\n\n    enum DowncastErrorCodes {\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n    }\n\n    // solhint-disable func-name-mixedcase\n    function Uint256BinOpError(\n        BinOpErrorCodes errorCode,\n        uint256 a,\n        uint256 b\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_BINOP_ERROR_SELECTOR,\n            errorCode,\n            a,\n            b\n        );\n    }\n\n    function Uint256DowncastError(\n        DowncastErrorCodes errorCode,\n        uint256 a\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_DOWNCAST_ERROR_SELECTOR,\n            errorCode,\n            a\n        );\n    }\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/LibMath.sol": {
            "id": 65,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n    using LibSafeMath for uint256;\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function safeGetPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorFloor(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function safeGetPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorCeil(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function getPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function getPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // The absolute rounding error is the difference between the rounded\n        // value and the ideal value. The relative rounding error is the\n        // absolute rounding error divided by the absolute value of the\n        // ideal value. This is undefined when the ideal value is zero.\n        //\n        // The ideal value is `numerator * target / denominator`.\n        // Let's call `numerator * target % denominator` the remainder.\n        // The absolute error is `remainder / denominator`.\n        //\n        // When the ideal value is zero, we require the absolute error to\n        // be zero. Fortunately, this is always the case. The ideal value is\n        // zero iff `numerator == 0` and/or `target == 0`. In this case the\n        // remainder and absolute error are also zero.\n        if (target == 0 || numerator == 0) {\n            return false;\n        }\n\n        // Otherwise, we want the relative rounding error to be strictly\n        // less than 0.1%.\n        // The relative error is `remainder / (numerator * target)`.\n        // We want the relative error less than 1 / 1000:\n        //        remainder / (numerator * denominator)  <  1 / 1000\n        // or equivalently:\n        //        1000 * remainder  <  numerator * target\n        // so we have a rounding error iff:\n        //        1000 * remainder  >=  numerator * target\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding up.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // See the comments in `isRoundingError`.\n        if (target == 0 || numerator == 0) {\n            // When either is zero, the ideal value and rounded value are zero\n            // and there is no rounding error. (Although the relative error\n            // is undefined.)\n            return false;\n        }\n        // Compute remainder as before\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        remainder = denominator.safeSub(remainder) % denominator;\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": {
            "id": 66,
            "content": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n    // bytes4(keccak256(\"DivisionByZeroError()\"))\n    bytes internal constant DIVISION_BY_ZERO_ERROR =\n        hex\"a791837c\";\n\n    // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n    bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n        0x339f3de2;\n\n    // solhint-disable func-name-mixedcase\n    function DivisionByZeroError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return DIVISION_BY_ZERO_ERROR;\n    }\n\n    function RoundingError(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            ROUNDING_ERROR_SELECTOR,\n            numerator,\n            denominator,\n            target\n        );\n    }\n}\n"
        },
        "../src/interfaces/IERC20Bridge.sol": {
            "id": 39,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Bridge {\n\n    /// @dev Result of a successful bridge call.\n    bytes4 constant internal BRIDGE_SUCCESS = 0xdc1600f3;\n\n    /// @dev Emitted when a trade occurs.\n    /// @param inputToken The token the bridge is converting from.\n    /// @param outputToken The token the bridge is converting to.\n    /// @param inputTokenAmount Amount of input token.\n    /// @param outputTokenAmount Amount of output token.\n    /// @param from The `from` address in `bridgeTransferFrom()`\n    /// @param to The `to` address in `bridgeTransferFrom()`\n    event ERC20BridgeTransfer(\n        address inputToken,\n        address outputToken,\n        uint256 inputTokenAmount,\n        uint256 outputTokenAmount,\n        address from,\n        address to\n    );\n\n    /// @dev Transfers `amount` of the ERC20 `tokenAddress` from `from` to `to`.\n    /// @param tokenAddress The address of the ERC20 token to transfer.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    /// @param bridgeData Arbitrary asset data needed by the bridge contract.\n    /// @return success The magic bytes `0xdc1600f3` if successful.\n    function bridgeTransferFrom(\n        address tokenAddress,\n        address from,\n        address to,\n        uint256 amount,\n        bytes calldata bridgeData\n    )\n        external\n        returns (bytes4 success);\n}\n"
        },
        "../src/interfaces/IDydxBridge.sol": {
            "id": 38,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IDydxBridge {\n\n    /// @dev This is the subset of `IDydx.ActionType` that are supported by the bridge.\n    enum BridgeActionType {\n        Deposit,                    // Deposit tokens into dydx account.\n        Withdraw                    // Withdraw tokens from dydx account.\n    }\n\n    struct BridgeAction {\n        BridgeActionType actionType;            // Action to run on dydx account.\n        uint256 accountIdx;                     // Index in `BridgeData.accountNumbers` for this action.\n        uint256 marketId;                       // Market to operate on.\n        uint256 conversionRateNumerator;        // Optional. If set, transfer amount is scaled by (conversionRateNumerator/conversionRateDenominator).\n        uint256 conversionRateDenominator;      // Optional. If set, transfer amount is scaled by (conversionRateNumerator/conversionRateDenominator).\n    }\n\n    struct BridgeData {\n        uint256[] accountNumbers;               // Account number used to identify the owner's specific account.\n        BridgeAction[] actions;                 // Actions to carry out on the owner's accounts.\n    }\n}\n"
        },
        "../src/interfaces/IDydx.sol": {
            "id": 37,
            "content": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\ninterface IDydx {\n\n    /// @dev Represents the unique key that specifies an account\n    struct AccountInfo {\n        address owner;  // The address that owns the account\n        uint256 number; // A nonce that allows a single address to control many accounts\n    }\n\n    enum ActionType {\n        Deposit,   // supply tokens\n        Withdraw,  // borrow tokens\n        Transfer,  // transfer balance between accounts\n        Buy,       // buy an amount of some token (externally)\n        Sell,      // sell an amount of some token (externally)\n        Trade,     // trade tokens against another account\n        Liquidate, // liquidate an undercollateralized or expiring account\n        Vaporize,  // use excess tokens to zero-out a completely negative account\n        Call       // send arbitrary data to an address\n    }\n\n    /// @dev Arguments that are passed to Solo in an ordered list as part of a single operation.\n    /// Each ActionArgs has an actionType which specifies which action struct that this data will be\n    /// parsed into before being processed.\n    struct ActionArgs {\n        ActionType actionType;\n        uint256 accountIdx;\n        AssetAmount amount;\n        uint256 primaryMarketId;\n        uint256 secondaryMarketId;\n        address otherAddress;\n        uint256 otherAccountIdx;\n        bytes data;\n    }\n\n    enum AssetDenomination {\n        Wei, // the amount is denominated in wei\n        Par  // the amount is denominated in par\n    }\n\n    enum AssetReference {\n        Delta, // the amount is given as a delta from the current value\n        Target // the amount is given as an exact number to end up at\n    }\n\n    struct AssetAmount {\n        bool sign; // true if positive\n        AssetDenomination denomination;\n        AssetReference ref;\n        uint256 value;\n    }\n\n    struct D256 {\n        uint256 value;\n    }\n\n    struct Value {\n        uint256 value;\n    }\n\n    struct Price {\n        uint256 value;\n    }\n\n    struct OperatorArg {\n        address operator;\n        bool trusted;\n    }\n\n    /// @dev The global risk parameters that govern the health and security of the system\n    struct RiskParams {\n        // Required ratio of over-collateralization\n        D256 marginRatio;\n        // Percentage penalty incurred by liquidated accounts\n        D256 liquidationSpread;\n        // Percentage of the borrower's interest fee that gets passed to the suppliers\n        D256 earningsRate;\n        // The minimum absolute borrow value of an account\n        // There must be sufficient incentivize to liquidate undercollateralized accounts\n        Value minBorrowedValue;\n    }\n\n    /// @dev The main entry-point to Solo that allows users and contracts to manage accounts.\n    ///      Take one or more actions on one or more accounts. The msg.sender must be the owner or\n    ///      operator of all accounts except for those being liquidated, vaporized, or traded with.\n    ///      One call to operate() is considered a singular \"operation\". Account collateralization is\n    ///      ensured only after the completion of the entire operation.\n    /// @param  accounts  A list of all accounts that will be used in this operation. Cannot contain\n    ///                   duplicates. In each action, the relevant account will be referred-to by its\n    ///                   index in the list.\n    /// @param  actions   An ordered list of all actions that will be taken in this operation. The\n    ///                   actions will be processed in order.\n    function operate(\n        AccountInfo[] calldata accounts,\n        ActionArgs[] calldata actions\n    )\n        external;\n\n    // @dev Approves/disapproves any number of operators. An operator is an external address that has the\n    //      same permissions to manipulate an account as the owner of the account. Operators are simply\n    //      addresses and therefore may either be externally-owned Ethereum accounts OR smart contracts.\n    //      Operators are also able to act as AutoTrader contracts on behalf of the account owner if the\n    //      operator is a smart contract and implements the IAutoTrader interface.\n    // @param args A list of OperatorArgs which have an address and a boolean. The boolean value\n    //        denotes whether to approve (true) or revoke approval (false) for that address.\n    function setOperators(OperatorArg[] calldata args) external;\n\n    /// @dev Return true if a particular address is approved as an operator for an owner's accounts.\n    ///      Approved operators can act on the accounts of the owner as if it were the operator's own.\n    /// @param owner The owner of the accounts\n    /// @param operator The possible operator\n    /// @return isLocalOperator True if operator is approved for owner's accounts\n    function getIsLocalOperator(\n        address owner,\n        address operator\n    )\n        external\n        view\n        returns (bool isLocalOperator);\n\n    /// @dev Get the ERC20 token address for a market.\n    /// @param marketId The market to query\n    /// @return tokenAddress The token address\n    function getMarketTokenAddress(\n        uint256 marketId\n    )\n        external\n        view\n        returns (address tokenAddress);\n\n    /// @dev Get all risk parameters in a single struct.\n    /// @return riskParams All global risk parameters\n    function getRiskParams()\n        external\n        view\n        returns (RiskParams memory riskParams);\n\n    /// @dev Get the price of the token for a market.\n    /// @param marketId The market to query\n    /// @return price The price of each atomic unit of the token\n    function getMarketPrice(\n        uint256 marketId\n    )\n        external\n        view\n        returns (Price memory price);\n\n    /// @dev Get the margin premium for a market. A margin premium makes it so that any positions that\n    ///      include the market require a higher collateralization to avoid being liquidated.\n    /// @param  marketId  The market to query\n    /// @return premium The market's margin premium\n    function getMarketMarginPremium(uint256 marketId)\n        external\n        view\n        returns (D256 memory premium);\n\n    /// @dev Get the total supplied and total borrowed values of an account adjusted by the marginPremium\n    ///      of each market. Supplied values are divided by (1 + marginPremium) for each market and\n    ///      borrowed values are multiplied by (1 + marginPremium) for each market. Comparing these\n    ///      adjusted values gives the margin-ratio of the account which will be compared to the global\n    ///      margin-ratio when determining if the account can be liquidated.\n    /// @param account The account to query\n    /// @return supplyValue The supplied value of the account (adjusted for marginPremium)\n    /// @return borrowValue The borrowed value of the account (adjusted for marginPremium)\n    function getAdjustedAccountValues(\n        AccountInfo calldata account\n    )\n        external\n        view\n        returns (Value memory supplyValue, Value memory borrowValue);\n}\n"
        }
    },
    "sourceCodes": {
        "./TestDydxBridge.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"../src/bridges/DydxBridge.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract TestDydxBridgeToken {\n\n    uint256 private constant INIT_HOLDER_BALANCE = 10 * 10**18; // 10 tokens\n    mapping (address => uint256) private _balances;\n\n    /// @dev Sets initial balance of token holders.\n    constructor(address[] memory holders)\n        public\n    {\n        for (uint256 i = 0; i != holders.length; ++i) {\n            _balances[holders[i]] = INIT_HOLDER_BALANCE;\n        }\n        _balances[msg.sender] = INIT_HOLDER_BALANCE;\n    }\n\n    /// @dev Basic transferFrom implementation.\n    function transferFrom(address from, address to, uint256 amount)\n        external\n        returns (bool)\n    {\n        if (_balances[from] < amount || _balances[to] + amount < _balances[to]) {\n            return false;\n        }\n        _balances[from] -= amount;\n        _balances[to] += amount;\n        return true;\n    }\n\n    /// @dev Returns balance of `holder`.\n    function balanceOf(address holder)\n        external\n        view\n        returns (uint256)\n    {\n        return _balances[holder];\n    }\n}\n\n\n// solhint-disable space-after-comma\ncontract TestDydxBridge is\n    IDydx,\n    DydxBridge\n{\n\n    address private constant ALWAYS_REVERT_ADDRESS = address(1);\n    address private _testTokenAddress;\n    bool private _shouldRevertOnOperate;\n\n    event OperateAccount(\n        address owner,\n        uint256 number\n    );\n\n    event OperateAction(\n        ActionType actionType,\n        uint256 accountIdx,\n        bool amountSign,\n        AssetDenomination amountDenomination,\n        AssetReference amountRef,\n        uint256 amountValue,\n        uint256 primaryMarketId,\n        uint256 secondaryMarketId,\n        address otherAddress,\n        uint256 otherAccountId,\n        bytes data\n    );\n\n    constructor(address[] memory holders)\n        public\n    {\n        // Deploy a test token. This represents the asset being deposited/withdrawn from dydx.\n        _testTokenAddress = address(new TestDydxBridgeToken(holders));\n    }\n\n    /// @dev Simulates `operate` in dydx contract.\n    ///      Emits events so that arguments can be validated client-side.\n    function operate(\n        AccountInfo[] calldata accounts,\n        ActionArgs[] calldata actions\n    )\n        external\n    {\n        if (_shouldRevertOnOperate) {\n            revert(\"TestDydxBridge/SHOULD_REVERT_ON_OPERATE\");\n        }\n\n        for (uint i = 0; i < accounts.length; ++i) {\n            emit OperateAccount(\n                accounts[i].owner,\n                accounts[i].number\n            );\n        }\n\n        for (uint i = 0; i < actions.length; ++i) {\n            emit OperateAction(\n                actions[i].actionType,\n                actions[i].accountIdx,\n                actions[i].amount.sign,\n                actions[i].amount.denomination,\n                actions[i].amount.ref,\n                actions[i].amount.value,\n                actions[i].primaryMarketId,\n                actions[i].secondaryMarketId,\n                actions[i].otherAddress,\n                actions[i].otherAccountIdx,\n                actions[i].data\n            );\n\n            if (actions[i].actionType == IDydx.ActionType.Withdraw) {\n                require(\n                    IERC20Token(_testTokenAddress).transferFrom(\n                        address(this),\n                        actions[i].otherAddress,\n                        actions[i].amount.value\n                    ),\n                    \"TestDydxBridge/WITHDRAW_FAILED\"\n                );\n            } else if (actions[i].actionType == IDydx.ActionType.Deposit) {\n                require(\n                    IERC20Token(_testTokenAddress).transferFrom(\n                        actions[i].otherAddress,\n                        address(this),\n                        actions[i].amount.value\n                    ),\n                    \"TestDydxBridge/DEPOSIT_FAILED\"\n                );\n            } else {\n                revert(\"TestDydxBridge/UNSUPPORTED_ACTION\");\n            }\n        }\n    }\n\n    /// @dev If `true` then subsequent calls to `operate` will revert.\n    function setRevertOnOperate(bool shouldRevert)\n        external\n    {\n        _shouldRevertOnOperate = shouldRevert;\n    }\n\n    /// @dev Returns test token.\n    function getTestToken()\n        external\n        returns (address)\n    {\n        return _testTokenAddress;\n    }\n\n    /// @dev Unused.\n    function setOperators(OperatorArg[] calldata args) external {}\n\n    /// @dev Unused.\n    function getIsLocalOperator(\n        address owner,\n        address operator\n    )\n        external\n        view\n        returns (bool isLocalOperator)\n    {}\n\n    /// @dev Unused.\n    function getMarketTokenAddress(\n        uint256 marketId\n    )\n        external\n        view\n        returns (address tokenAddress)\n    {}\n\n    /// @dev Unused.\n    function getRiskParams()\n        external\n        view\n        returns (RiskParams memory riskParams)\n    {}\n\n    /// @dev Unsused.\n    function getMarketPrice(\n        uint256 marketId\n    )\n        external\n        view\n        returns (Price memory price)\n    {}\n\n    /// @dev Unsused\n    function getMarketMarginPremium(uint256 marketId)\n        external\n        view\n        returns (IDydx.D256 memory premium)\n    {}\n\n    /// @dev Unused.\n    function getAdjustedAccountValues(\n        AccountInfo calldata account\n    )\n        external\n        view\n        returns (Value memory supplyValue, Value memory borrowValue)\n    {}\n\n    /// @dev overrides `_getDydxAddress()` from `DeploymentConstants` to return this address.\n    function _getDydxAddress()\n        internal\n        view\n        returns (address)\n    {\n        return address(this);\n    }\n\n    /// @dev overrides `_getERC20BridgeProxyAddress()` from `DeploymentConstants` for testing.\n    function _getERC20BridgeProxyAddress()\n        internal\n        view\n        returns (address)\n    {\n        return msg.sender == ALWAYS_REVERT_ADDRESS ? address(0) : msg.sender;\n    }\n}\n",
        "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Token {\n\n    // solhint-disable no-simple-event-func-name\n    event Transfer(\n        address indexed _from,\n        address indexed _to,\n        uint256 _value\n    );\n\n    event Approval(\n        address indexed _owner,\n        address indexed _spender,\n        uint256 _value\n    );\n\n    /// @dev send `value` token to `to` from `msg.sender`\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transfer(address _to, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n    /// @param _from The address of the sender\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _value\n    )\n        external\n        returns (bool);\n\n    /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @param _value The amount of wei to be approved for transfer\n    /// @return Always true if the call has enough gas to complete execution\n    function approve(address _spender, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev Query total supply of token\n    /// @return Total supply of token\n    function totalSupply()\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address from which the balance will be retrieved\n    /// @return Balance of owner\n    function balanceOf(address _owner)\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address of the account owning tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @return Amount of remaining tokens allowed to spent\n    function allowance(address _owner, address _spender)\n        external\n        view\n        returns (uint256);\n}\n",
        "../src/bridges/DydxBridge.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/DeploymentConstants.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibMath.sol\";\nimport \"../interfaces/IERC20Bridge.sol\";\nimport \"../interfaces/IDydxBridge.sol\";\nimport \"../interfaces/IDydx.sol\";\n\n\ncontract DydxBridge is\n    IERC20Bridge,\n    IDydxBridge,\n    DeploymentConstants\n{\n\n    using LibSafeMath for uint256;\n\n    /// @dev Callback for `IERC20Bridge`. Deposits or withdraws tokens from a dydx account.\n    ///      Notes:\n    ///         1. This bridge must be set as an operator of the input dydx account.\n    ///         2. This function may only be called in the context of the 0x Exchange.\n    ///         3. The maker or taker of the 0x order must be the dydx account owner.\n    ///         4. Deposits into dydx are made from the `from` address.\n    ///         5. Withdrawals from dydx are made to the `to` address.\n    ///         6. Calling this function must always withdraw at least `amount`,\n    ///            otherwise the `ERC20Bridge` will revert.\n    /// @param from The sender of the tokens and owner of the dydx account.\n    /// @param to The recipient of the tokens.\n    /// @param amount Minimum amount of `toTokenAddress` tokens to deposit or withdraw.\n    /// @param encodedBridgeData An abi-encoded `BridgeData` struct.\n    /// @return success The magic bytes if successful.\n    function bridgeTransferFrom(\n        address, /* toTokenAddress */\n        address from,\n        address to,\n        uint256 amount,\n        bytes calldata encodedBridgeData\n    )\n        external\n        returns (bytes4 success)\n    {\n        // Ensure that only the `ERC20BridgeProxy` can call this function.\n        require(\n            msg.sender == _getERC20BridgeProxyAddress(),\n            \"DydxBridge/ONLY_CALLABLE_BY_ERC20_BRIDGE_PROXY\"\n        );\n\n        // Decode bridge data.\n        (BridgeData memory bridgeData) = abi.decode(encodedBridgeData, (BridgeData));\n\n        // The dydx accounts are owned by the `from` address.\n        IDydx.AccountInfo[] memory accounts = _createAccounts(from, bridgeData);\n\n        // Create dydx actions to run on the dydx accounts.\n        IDydx.ActionArgs[] memory actions = _createActions(\n            from,\n            to,\n            amount,\n            bridgeData\n        );\n\n        // Run operation. This will revert on failure.\n        IDydx(_getDydxAddress()).operate(accounts, actions);\n\n        return BRIDGE_SUCCESS;\n    }\n\n    /// @dev Creates an array of accounts for dydx to operate on.\n    ///      All accounts must belong to the same owner.\n    /// @param accountOwner Owner of the dydx account.\n    /// @param bridgeData A `BridgeData` struct.\n    function _createAccounts(\n        address accountOwner,\n        BridgeData memory bridgeData\n    )\n        internal\n        returns (IDydx.AccountInfo[] memory accounts)\n    {\n        uint256[] memory accountNumbers = bridgeData.accountNumbers;\n        uint256 nAccounts = accountNumbers.length;\n        accounts = new IDydx.AccountInfo[](nAccounts);\n        for (uint256 i = 0; i < nAccounts; ++i) {\n            accounts[i] = IDydx.AccountInfo({\n                owner: accountOwner,\n                number: accountNumbers[i]\n            });\n        }\n    }\n\n    /// @dev Creates an array of actions to carry out on dydx.\n    /// @param depositFrom Deposit value from this address (owner of the dydx account).\n    /// @param withdrawTo Withdraw value to this address.\n    /// @param amount The amount of value available to operate on.\n    /// @param bridgeData A `BridgeData` struct.\n    function _createActions(\n        address depositFrom,\n        address withdrawTo,\n        uint256 amount,\n        BridgeData memory bridgeData\n    )\n        internal\n        returns (IDydx.ActionArgs[] memory actions)\n    {\n        BridgeAction[] memory bridgeActions = bridgeData.actions;\n        uint256 nBridgeActions = bridgeActions.length;\n        actions = new IDydx.ActionArgs[](nBridgeActions);\n        for (uint256 i = 0; i < nBridgeActions; ++i) {\n            // Cache current bridge action.\n            BridgeAction memory bridgeAction = bridgeActions[i];\n\n            // Scale amount, if conversion rate is set.\n            uint256 scaledAmount;\n            if (bridgeAction.conversionRateDenominator > 0) {\n                scaledAmount = LibMath.safeGetPartialAmountFloor(\n                    bridgeAction.conversionRateNumerator,\n                    bridgeAction.conversionRateDenominator,\n                    amount\n                );\n            } else {\n                scaledAmount = amount;\n            }\n\n            // Construct dydx action.\n            if (bridgeAction.actionType == BridgeActionType.Deposit) {\n                // Deposit tokens from the account owner into their dydx account.\n                actions[i] = _createDepositAction(\n                    depositFrom,\n                    scaledAmount,\n                    bridgeAction\n                );\n            } else if (bridgeAction.actionType == BridgeActionType.Withdraw) {\n                // Withdraw tokens from dydx to the `otherAccount`.\n                actions[i] = _createWithdrawAction(\n                    withdrawTo,\n                    scaledAmount,\n                    bridgeAction\n                );\n            } else {\n                // If all values in the `Action` enum are handled then this\n                // revert is unreachable: Solidity will revert when casting\n                // from `uint8` to `Action`.\n                revert(\"DydxBridge/UNRECOGNIZED_BRIDGE_ACTION\");\n            }\n        }\n    }\n\n    /// @dev Returns a dydx `DepositAction`.\n    /// @param depositFrom Deposit tokens from this address who is also the account owner.\n    /// @param amount of tokens to deposit.\n    /// @param bridgeAction A `BridgeAction` struct.\n    /// @return depositAction The encoded dydx action.\n    function _createDepositAction(\n        address depositFrom,\n        uint256 amount,\n        BridgeAction memory bridgeAction\n    )\n        internal\n        pure\n        returns (\n            IDydx.ActionArgs memory depositAction\n        )\n    {\n        // Create dydx amount.\n        IDydx.AssetAmount memory dydxAmount = IDydx.AssetAmount({\n            sign: true,                                 // true if positive.\n            denomination: IDydx.AssetDenomination.Wei,  // Wei => actual token amount held in account.\n            ref: IDydx.AssetReference.Delta,                // Delta => a relative amount.\n            value: amount                               // amount to deposit.\n        });\n\n        // Create dydx deposit action.\n        depositAction = IDydx.ActionArgs({\n            actionType: IDydx.ActionType.Deposit,           // deposit tokens.\n            amount: dydxAmount,                             // amount to deposit.\n            accountIdx: bridgeAction.accountIdx,             // index in the `accounts` when calling `operate`.\n            primaryMarketId: bridgeAction.marketId,         // indicates which token to deposit.\n            otherAddress: depositFrom,                      // deposit from the account owner.\n            // unused parameters\n            secondaryMarketId: 0,\n            otherAccountIdx: 0,\n            data: hex''\n        });\n    }\n\n    /// @dev Returns a dydx `WithdrawAction`.\n    /// @param withdrawTo Withdraw tokens to this address.\n    /// @param amount of tokens to withdraw.\n    /// @param bridgeAction A `BridgeAction` struct.\n    /// @return withdrawAction The encoded dydx action.\n    function _createWithdrawAction(\n        address withdrawTo,\n        uint256 amount,\n        BridgeAction memory bridgeAction\n    )\n        internal\n        pure\n        returns (\n            IDydx.ActionArgs memory withdrawAction\n        )\n    {\n        // Create dydx amount.\n        IDydx.AssetAmount memory amountToWithdraw = IDydx.AssetAmount({\n            sign: false,                                    // false if negative.\n            denomination: IDydx.AssetDenomination.Wei,      // Wei => actual token amount held in account.\n            ref: IDydx.AssetReference.Delta,                // Delta => a relative amount.\n            value: amount                                   // amount to withdraw.\n        });\n\n        // Create withdraw action.\n        withdrawAction = IDydx.ActionArgs({\n            actionType: IDydx.ActionType.Withdraw,          // withdraw tokens.\n            amount: amountToWithdraw,                       // amount to withdraw.\n            accountIdx: bridgeAction.accountIdx,            // index in the `accounts` when calling `operate`.\n            primaryMarketId: bridgeAction.marketId,         // indicates which token to withdraw.\n            otherAddress: withdrawTo,                       // withdraw tokens to this address.\n            // unused parameters\n            secondaryMarketId: 0,\n            otherAccountIdx: 0,\n            data: hex''\n        });\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/DeploymentConstants.sol": "/*\n\n  Copyright 2020 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract DeploymentConstants {\n\n    // solhint-disable separate-by-one-line-in-contract\n\n    // Mainnet addresses ///////////////////////////////////////////////////////\n    /// @dev Mainnet address of the WETH contract.\n    address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\n    /// @dev Mainnet address of the KyberNetworkProxy contract.\n    address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x9AAb3f75489902f3a48495025729a0AF77d4b11e;\n    /// @dev Mainnet address of the KyberHintHandler contract.\n    address constant private KYBER_HINT_HANDLER_ADDRESS = 0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C;\n    /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;\n    /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    address constant private ETH2DAI_ADDRESS = 0x794e6e91555438aFc3ccF1c5076A74F42133d08D;\n    /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x8ED95d1746bf1E4dAb58d8ED4724f1Ef95B20Db0;\n    ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    address constant private DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;\n    /// @dev Mainnet address of the `Chai` contract\n    address constant private CHAI_ADDRESS = 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215;\n    /// @dev Mainnet address of the 0x DevUtils contract.\n    address constant private DEV_UTILS_ADDRESS = 0x74134CF88b21383713E096a5ecF59e297dc7f547;\n    /// @dev Kyber ETH pseudo-address.\n    address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    /// @dev Mainnet address of the dYdX contract.\n    address constant private DYDX_ADDRESS = 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e;\n    /// @dev Mainnet address of the GST2 contract\n    address constant private GST_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04;\n    /// @dev Mainnet address of the GST Collector\n    address constant private GST_COLLECTOR_ADDRESS = 0x000000D3b08566BE75A6DB803C03C85C0c1c5B96;\n    /// @dev Mainnet address of the mStable mUSD contract.\n    address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5;\n    /// @dev Mainnet address of the Mooniswap Registry contract\n    address constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303;\n    /// @dev Mainnet address of the DODO Registry (ZOO) contract\n    address constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950;\n    /// @dev Mainnet address of the DODO Helper contract\n    address constant private DODO_HELPER = 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb;\n\n    // // Ropsten addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0xd719c34261e099Fdb33030ac8909d5788D3039C4;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xb344afeD348de15eb4a9e180205A2B0739628339;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0xC812AF3f3fBC62F76ea4262576EC0f49dB8B7f1c;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = 0x4E1000616990D83e56f4b5fC6CC8602DcfD20459;\n\n    // // Rinkeby addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x0d5371e5EE23dec7DF251A8957279629aa79E9C5;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xA2AA4bEFED748Fba27a3bE7Dfd2C4b2c6DB1F49B;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x46B5BC959e8A754c0256FFF73bF34A52Ad5CdfA9;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    // // Kovan addresses /////////////////////////////////////////////////////////\n    // /// @dev Kovan address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;\n    // /// @dev Kovan address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x692f391bCc85cefCe8C237C01e1f636BbD70EA4D;\n    // /// @dev Kovan address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30;\n    // /// @dev Kovan address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Kovan address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = 0xe325acB9765b02b8b418199bf9650972299235F4;\n    // /// @dev Kovan address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x3577552C1Fb7A44aD76BeEB7aB53251668A21F8D;\n    // /// @dev Kovan address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Kovan address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;\n    // /// @dev Kovan address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x9402639A828BdF4E9e4103ac3B69E1a6E522eB59;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Kovan address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    /// @dev Overridable way to get the `KyberNetworkProxy` address.\n    /// @return kyberAddress The `IKyberNetworkProxy` address.\n    function _getKyberNetworkProxyAddress()\n        internal\n        view\n        returns (address kyberAddress)\n    {\n        return KYBER_NETWORK_PROXY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `KyberHintHandler` address.\n    /// @return kyberAddress The `IKyberHintHandler` address.\n    function _getKyberHintHandlerAddress()\n        internal\n        view\n        returns (address hintHandlerAddress)\n    {\n        return KYBER_HINT_HANDLER_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the WETH address.\n    /// @return wethAddress The WETH address.\n    function _getWethAddress()\n        internal\n        view\n        returns (address wethAddress)\n    {\n        return WETH_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapExchangeFactory` address.\n    /// @return uniswapAddress The `UniswapExchangeFactory` address.\n    function _getUniswapExchangeFactoryAddress()\n        internal\n        view\n        returns (address uniswapAddress)\n    {\n        return UNISWAP_EXCHANGE_FACTORY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapV2Router01` address.\n    /// @return uniswapRouterAddress The `UniswapV2Router01` address.\n    function _getUniswapV2Router01Address()\n        internal\n        view\n        returns (address uniswapRouterAddress)\n    {\n        return UNISWAP_V2_ROUTER_01_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Eth2Dai `MatchingMarket` contract.\n    /// @return eth2daiAddress The Eth2Dai `MatchingMarket` contract.\n    function _getEth2DaiAddress()\n        internal\n        view\n        returns (address eth2daiAddress)\n    {\n        return ETH2DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `ERC20BridgeProxy` contract.\n    /// @return erc20BridgeProxyAddress The `ERC20BridgeProxy` contract.\n    function _getERC20BridgeProxyAddress()\n        internal\n        view\n        returns (address erc20BridgeProxyAddress)\n    {\n        return ERC20_BRIDGE_PROXY_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Dai` contract.\n    /// @return daiAddress The `Dai` contract.\n    function _getDaiAddress()\n        internal\n        view\n        returns (address daiAddress)\n    {\n        return DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Chai` contract.\n    /// @return chaiAddress The `Chai` contract.\n    function _getChaiAddress()\n        internal\n        view\n        returns (address chaiAddress)\n    {\n        return CHAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the 0x `DevUtils` contract address.\n    /// @return devUtils The 0x `DevUtils` contract address.\n    function _getDevUtilsAddress()\n        internal\n        view\n        returns (address devUtils)\n    {\n        return DEV_UTILS_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the DyDx contract.\n    /// @return exchange The DyDx exchange contract.\n    function _getDydxAddress()\n        internal\n        view\n        returns (address dydxAddress)\n    {\n        return DYDX_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST2 contract address.\n    /// @return gst The GST contract.\n    function _getGstAddress()\n        internal\n        view\n        returns (address gst)\n    {\n        return GST_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST Collector address.\n    /// @return collector The GST collector address.\n    function _getGstCollectorAddress()\n        internal\n        view\n        returns (address collector)\n    {\n        return GST_COLLECTOR_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the mStable mUSD address.\n    /// @return musd The mStable mUSD address.\n    function _getMUsdAddress()\n        internal\n        view\n        returns (address musd)\n    {\n        return MUSD_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Mooniswap registry address.\n    /// @return registry The Mooniswap registry address.\n    function _getMooniswapAddress()\n        internal\n        view\n        returns (address)\n    {\n        return MOONISWAP_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Registry contract address.\n    /// @return registry The DODO Registry contract address.\n    function _getDODORegistryAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Helper contract address.\n    /// @return registry The DODO Helper contract address.\n    function _getDODOHelperAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_HELPER;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibSafeMath.sol": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\n\n    function safeMul(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (a == 0) {\n            return 0;\n        }\n        uint256 c = a * b;\n        if (c / a != b) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function safeDiv(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b == 0) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n                a,\n                b\n            ));\n        }\n        uint256 c = a / b;\n        return c;\n    }\n\n    function safeSub(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b > a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n                a,\n                b\n            ));\n        }\n        return a - b;\n    }\n\n    function safeAdd(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint256 c = a + b;\n        if (c < a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function max256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a >= b ? a : b;\n    }\n\n    function min256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a < b ? a : b;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibRichErrors.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\nlibrary LibRichErrors {\n\n    // bytes4(keccak256(\"Error(string)\"))\n    bytes4 internal constant STANDARD_ERROR_SELECTOR =\n        0x08c379a0;\n\n    // solhint-disable func-name-mixedcase\n    /// @dev ABI encode a standard, string revert error payload.\n    ///      This is the same payload that would be included by a `revert(string)`\n    ///      solidity statement. It has the function signature `Error(string)`.\n    /// @param message The error string.\n    /// @return The ABI encoded error.\n    function StandardError(\n        string memory message\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            STANDARD_ERROR_SELECTOR,\n            bytes(message)\n        );\n    }\n    // solhint-enable func-name-mixedcase\n\n    /// @dev Reverts an encoded rich revert reason `errorData`.\n    /// @param errorData ABI encoded error data.\n    function rrevert(bytes memory errorData)\n        internal\n        pure\n    {\n        assembly {\n            revert(add(errorData, 0x20), mload(errorData))\n        }\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibSafeMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n    // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n    bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n        0xe946c1bb;\n\n    // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n    bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n        0xc996af7b;\n\n    enum BinOpErrorCodes {\n        ADDITION_OVERFLOW,\n        MULTIPLICATION_OVERFLOW,\n        SUBTRACTION_UNDERFLOW,\n        DIVISION_BY_ZERO\n    }\n\n    enum DowncastErrorCodes {\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n    }\n\n    // solhint-disable func-name-mixedcase\n    function Uint256BinOpError(\n        BinOpErrorCodes errorCode,\n        uint256 a,\n        uint256 b\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_BINOP_ERROR_SELECTOR,\n            errorCode,\n            a,\n            b\n        );\n    }\n\n    function Uint256DowncastError(\n        DowncastErrorCodes errorCode,\n        uint256 a\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_DOWNCAST_ERROR_SELECTOR,\n            errorCode,\n            a\n        );\n    }\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibMath.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n    using LibSafeMath for uint256;\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function safeGetPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorFloor(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function safeGetPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorCeil(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function getPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function getPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // The absolute rounding error is the difference between the rounded\n        // value and the ideal value. The relative rounding error is the\n        // absolute rounding error divided by the absolute value of the\n        // ideal value. This is undefined when the ideal value is zero.\n        //\n        // The ideal value is `numerator * target / denominator`.\n        // Let's call `numerator * target % denominator` the remainder.\n        // The absolute error is `remainder / denominator`.\n        //\n        // When the ideal value is zero, we require the absolute error to\n        // be zero. Fortunately, this is always the case. The ideal value is\n        // zero iff `numerator == 0` and/or `target == 0`. In this case the\n        // remainder and absolute error are also zero.\n        if (target == 0 || numerator == 0) {\n            return false;\n        }\n\n        // Otherwise, we want the relative rounding error to be strictly\n        // less than 0.1%.\n        // The relative error is `remainder / (numerator * target)`.\n        // We want the relative error less than 1 / 1000:\n        //        remainder / (numerator * denominator)  <  1 / 1000\n        // or equivalently:\n        //        1000 * remainder  <  numerator * target\n        // so we have a rounding error iff:\n        //        1000 * remainder  >=  numerator * target\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding up.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // See the comments in `isRoundingError`.\n        if (target == 0 || numerator == 0) {\n            // When either is zero, the ideal value and rounded value are zero\n            // and there is no rounding error. (Although the relative error\n            // is undefined.)\n            return false;\n        }\n        // Compute remainder as before\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        remainder = denominator.safeSub(remainder) % denominator;\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n    // bytes4(keccak256(\"DivisionByZeroError()\"))\n    bytes internal constant DIVISION_BY_ZERO_ERROR =\n        hex\"a791837c\";\n\n    // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n    bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n        0x339f3de2;\n\n    // solhint-disable func-name-mixedcase\n    function DivisionByZeroError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return DIVISION_BY_ZERO_ERROR;\n    }\n\n    function RoundingError(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            ROUNDING_ERROR_SELECTOR,\n            numerator,\n            denominator,\n            target\n        );\n    }\n}\n",
        "../src/interfaces/IERC20Bridge.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ncontract IERC20Bridge {\n\n    /// @dev Result of a successful bridge call.\n    bytes4 constant internal BRIDGE_SUCCESS = 0xdc1600f3;\n\n    /// @dev Emitted when a trade occurs.\n    /// @param inputToken The token the bridge is converting from.\n    /// @param outputToken The token the bridge is converting to.\n    /// @param inputTokenAmount Amount of input token.\n    /// @param outputTokenAmount Amount of output token.\n    /// @param from The `from` address in `bridgeTransferFrom()`\n    /// @param to The `to` address in `bridgeTransferFrom()`\n    event ERC20BridgeTransfer(\n        address inputToken,\n        address outputToken,\n        uint256 inputTokenAmount,\n        uint256 outputTokenAmount,\n        address from,\n        address to\n    );\n\n    /// @dev Transfers `amount` of the ERC20 `tokenAddress` from `from` to `to`.\n    /// @param tokenAddress The address of the ERC20 token to transfer.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    /// @param bridgeData Arbitrary asset data needed by the bridge contract.\n    /// @return success The magic bytes `0xdc1600f3` if successful.\n    function bridgeTransferFrom(\n        address tokenAddress,\n        address from,\n        address to,\n        uint256 amount,\n        bytes calldata bridgeData\n    )\n        external\n        returns (bytes4 success);\n}\n",
        "../src/interfaces/IDydxBridge.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\n\n\ninterface IDydxBridge {\n\n    /// @dev This is the subset of `IDydx.ActionType` that are supported by the bridge.\n    enum BridgeActionType {\n        Deposit,                    // Deposit tokens into dydx account.\n        Withdraw                    // Withdraw tokens from dydx account.\n    }\n\n    struct BridgeAction {\n        BridgeActionType actionType;            // Action to run on dydx account.\n        uint256 accountIdx;                     // Index in `BridgeData.accountNumbers` for this action.\n        uint256 marketId;                       // Market to operate on.\n        uint256 conversionRateNumerator;        // Optional. If set, transfer amount is scaled by (conversionRateNumerator/conversionRateDenominator).\n        uint256 conversionRateDenominator;      // Optional. If set, transfer amount is scaled by (conversionRateNumerator/conversionRateDenominator).\n    }\n\n    struct BridgeData {\n        uint256[] accountNumbers;               // Account number used to identify the owner's specific account.\n        BridgeAction[] actions;                 // Actions to carry out on the owner's accounts.\n    }\n}\n",
        "../src/interfaces/IDydx.sol": "/*\n\n  Copyright 2019 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.5.9;\npragma experimental ABIEncoderV2;\n\n\ninterface IDydx {\n\n    /// @dev Represents the unique key that specifies an account\n    struct AccountInfo {\n        address owner;  // The address that owns the account\n        uint256 number; // A nonce that allows a single address to control many accounts\n    }\n\n    enum ActionType {\n        Deposit,   // supply tokens\n        Withdraw,  // borrow tokens\n        Transfer,  // transfer balance between accounts\n        Buy,       // buy an amount of some token (externally)\n        Sell,      // sell an amount of some token (externally)\n        Trade,     // trade tokens against another account\n        Liquidate, // liquidate an undercollateralized or expiring account\n        Vaporize,  // use excess tokens to zero-out a completely negative account\n        Call       // send arbitrary data to an address\n    }\n\n    /// @dev Arguments that are passed to Solo in an ordered list as part of a single operation.\n    /// Each ActionArgs has an actionType which specifies which action struct that this data will be\n    /// parsed into before being processed.\n    struct ActionArgs {\n        ActionType actionType;\n        uint256 accountIdx;\n        AssetAmount amount;\n        uint256 primaryMarketId;\n        uint256 secondaryMarketId;\n        address otherAddress;\n        uint256 otherAccountIdx;\n        bytes data;\n    }\n\n    enum AssetDenomination {\n        Wei, // the amount is denominated in wei\n        Par  // the amount is denominated in par\n    }\n\n    enum AssetReference {\n        Delta, // the amount is given as a delta from the current value\n        Target // the amount is given as an exact number to end up at\n    }\n\n    struct AssetAmount {\n        bool sign; // true if positive\n        AssetDenomination denomination;\n        AssetReference ref;\n        uint256 value;\n    }\n\n    struct D256 {\n        uint256 value;\n    }\n\n    struct Value {\n        uint256 value;\n    }\n\n    struct Price {\n        uint256 value;\n    }\n\n    struct OperatorArg {\n        address operator;\n        bool trusted;\n    }\n\n    /// @dev The global risk parameters that govern the health and security of the system\n    struct RiskParams {\n        // Required ratio of over-collateralization\n        D256 marginRatio;\n        // Percentage penalty incurred by liquidated accounts\n        D256 liquidationSpread;\n        // Percentage of the borrower's interest fee that gets passed to the suppliers\n        D256 earningsRate;\n        // The minimum absolute borrow value of an account\n        // There must be sufficient incentivize to liquidate undercollateralized accounts\n        Value minBorrowedValue;\n    }\n\n    /// @dev The main entry-point to Solo that allows users and contracts to manage accounts.\n    ///      Take one or more actions on one or more accounts. The msg.sender must be the owner or\n    ///      operator of all accounts except for those being liquidated, vaporized, or traded with.\n    ///      One call to operate() is considered a singular \"operation\". Account collateralization is\n    ///      ensured only after the completion of the entire operation.\n    /// @param  accounts  A list of all accounts that will be used in this operation. Cannot contain\n    ///                   duplicates. In each action, the relevant account will be referred-to by its\n    ///                   index in the list.\n    /// @param  actions   An ordered list of all actions that will be taken in this operation. The\n    ///                   actions will be processed in order.\n    function operate(\n        AccountInfo[] calldata accounts,\n        ActionArgs[] calldata actions\n    )\n        external;\n\n    // @dev Approves/disapproves any number of operators. An operator is an external address that has the\n    //      same permissions to manipulate an account as the owner of the account. Operators are simply\n    //      addresses and therefore may either be externally-owned Ethereum accounts OR smart contracts.\n    //      Operators are also able to act as AutoTrader contracts on behalf of the account owner if the\n    //      operator is a smart contract and implements the IAutoTrader interface.\n    // @param args A list of OperatorArgs which have an address and a boolean. The boolean value\n    //        denotes whether to approve (true) or revoke approval (false) for that address.\n    function setOperators(OperatorArg[] calldata args) external;\n\n    /// @dev Return true if a particular address is approved as an operator for an owner's accounts.\n    ///      Approved operators can act on the accounts of the owner as if it were the operator's own.\n    /// @param owner The owner of the accounts\n    /// @param operator The possible operator\n    /// @return isLocalOperator True if operator is approved for owner's accounts\n    function getIsLocalOperator(\n        address owner,\n        address operator\n    )\n        external\n        view\n        returns (bool isLocalOperator);\n\n    /// @dev Get the ERC20 token address for a market.\n    /// @param marketId The market to query\n    /// @return tokenAddress The token address\n    function getMarketTokenAddress(\n        uint256 marketId\n    )\n        external\n        view\n        returns (address tokenAddress);\n\n    /// @dev Get all risk parameters in a single struct.\n    /// @return riskParams All global risk parameters\n    function getRiskParams()\n        external\n        view\n        returns (RiskParams memory riskParams);\n\n    /// @dev Get the price of the token for a market.\n    /// @param marketId The market to query\n    /// @return price The price of each atomic unit of the token\n    function getMarketPrice(\n        uint256 marketId\n    )\n        external\n        view\n        returns (Price memory price);\n\n    /// @dev Get the margin premium for a market. A margin premium makes it so that any positions that\n    ///      include the market require a higher collateralization to avoid being liquidated.\n    /// @param  marketId  The market to query\n    /// @return premium The market's margin premium\n    function getMarketMarginPremium(uint256 marketId)\n        external\n        view\n        returns (D256 memory premium);\n\n    /// @dev Get the total supplied and total borrowed values of an account adjusted by the marginPremium\n    ///      of each market. Supplied values are divided by (1 + marginPremium) for each market and\n    ///      borrowed values are multiplied by (1 + marginPremium) for each market. Comparing these\n    ///      adjusted values gives the margin-ratio of the account which will be compared to the global\n    ///      margin-ratio when determining if the account can be liquidated.\n    /// @param account The account to query\n    /// @return supplyValue The supplied value of the account (adjusted for marginPremium)\n    /// @return borrowValue The borrowed value of the account (adjusted for marginPremium)\n    function getAdjustedAccountValues(\n        AccountInfo calldata account\n    )\n        external\n        view\n        returns (Value memory supplyValue, Value memory borrowValue);\n}\n"
    },
    "compiler": {
        "name": "solc",
        "version": "0.5.17+commit.d19bba13",
        "settings": {
            "remappings": [
                "@0x/contracts-utils=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-utils",
                "@0x/contracts-erc1155=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-erc1155",
                "@0x/contracts-erc20=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-erc20",
                "@0x/contracts-exchange-libs=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-exchange-libs"
            ],
            "optimizer": {
                "enabled": true,
                "runs": 1000000,
                "details": {
                    "yul": true,
                    "deduplicate": true,
                    "cse": true,
                    "constantOptimizer": true
                }
            },
            "outputSelection": {
                "*": {
                    "*": [
                        "abi",
                        "devdoc",
                        "evm.bytecode.object",
                        "evm.bytecode.sourceMap",
                        "evm.deployedBytecode.object",
                        "evm.deployedBytecode.sourceMap"
                    ]
                }
            },
            "evmVersion": "istanbul"
        }
    },
    "chains": {}
}
