{
    "schemaVersion": "2.0.0",
    "contractName": "ERC20BridgeProxy",
    "compilerOutput": {
        "abi": [
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": true,
                        "internalType": "address",
                        "name": "target",
                        "type": "address"
                    },
                    {
                        "indexed": true,
                        "internalType": "address",
                        "name": "caller",
                        "type": "address"
                    }
                ],
                "name": "AuthorizedAddressAdded",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": true,
                        "internalType": "address",
                        "name": "target",
                        "type": "address"
                    },
                    {
                        "indexed": true,
                        "internalType": "address",
                        "name": "caller",
                        "type": "address"
                    }
                ],
                "name": "AuthorizedAddressRemoved",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": true,
                        "internalType": "address",
                        "name": "previousOwner",
                        "type": "address"
                    },
                    {
                        "indexed": true,
                        "internalType": "address",
                        "name": "newOwner",
                        "type": "address"
                    }
                ],
                "name": "OwnershipTransferred",
                "type": "event"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "target",
                        "type": "address"
                    }
                ],
                "name": "addAuthorizedAddress",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "uint256",
                        "name": "",
                        "type": "uint256"
                    }
                ],
                "name": "authorities",
                "outputs": [
                    {
                        "internalType": "address",
                        "name": "",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "",
                        "type": "address"
                    }
                ],
                "name": "authorized",
                "outputs": [
                    {
                        "internalType": "bool",
                        "name": "",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "bytes",
                        "name": "assetData",
                        "type": "bytes"
                    },
                    {
                        "internalType": "address",
                        "name": "owner",
                        "type": "address"
                    }
                ],
                "name": "balanceOf",
                "outputs": [
                    {
                        "internalType": "uint256",
                        "name": "balance",
                        "type": "uint256"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "getAuthorizedAddresses",
                "outputs": [
                    {
                        "internalType": "address[]",
                        "name": "",
                        "type": "address[]"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "getProxyId",
                "outputs": [
                    {
                        "internalType": "bytes4",
                        "name": "proxyId",
                        "type": "bytes4"
                    }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "owner",
                "outputs": [
                    {
                        "internalType": "address",
                        "name": "",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "target",
                        "type": "address"
                    }
                ],
                "name": "removeAuthorizedAddress",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "target",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "index",
                        "type": "uint256"
                    }
                ],
                "name": "removeAuthorizedAddressAtIndex",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "bytes",
                        "name": "assetData",
                        "type": "bytes"
                    },
                    {
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "transferFrom",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "newOwner",
                        "type": "address"
                    }
                ],
                "name": "transferOwnership",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            }
        ],
        "devdoc": {
            "methods": {
                "addAuthorizedAddress(address)": {
                    "details": "Authorizes an address.",
                    "params": {
                        "target": "Address to authorize."
                    }
                },
                "balanceOf(bytes,address)": {
                    "details": "Retrieves the balance of `owner` for this asset.",
                    "return": "balance The balance of the ERC20 token being transferred by this         asset proxy."
                },
                "getAuthorizedAddresses()": {
                    "details": "Gets all authorized addresses.",
                    "return": "Array of authorized addresses."
                },
                "getProxyId()": {
                    "details": "Gets the proxy id associated with this asset proxy.",
                    "return": "proxyId The proxy id."
                },
                "removeAuthorizedAddress(address)": {
                    "details": "Removes authorizion of an address.",
                    "params": {
                        "target": "Address to remove authorization from."
                    }
                },
                "removeAuthorizedAddressAtIndex(address,uint256)": {
                    "details": "Removes authorizion of an address.",
                    "params": {
                        "index": "Index of target in authorities array.",
                        "target": "Address to remove authorization from."
                    }
                },
                "transferFrom(bytes,address,address,uint256)": {
                    "details": "Calls a bridge contract to transfer `amount` of ERC20 from `from`      to `to`. Asserts that the balance of `to` has increased by `amount`.",
                    "params": {
                        "amount": "Amount of asset to transfer.",
                        "assetData": "Abi-encoded data for this asset proxy encoded as:          abi.encodeWithSelector(             bytes4 PROXY_ID,             address tokenAddress,             address bridgeAddress,             bytes bridgeData          )",
                        "from": "Address to transfer asset from.",
                        "to": "Address to transfer asset to."
                    }
                },
                "transferOwnership(address)": {
                    "details": "Change the owner of this contract.",
                    "params": {
                        "newOwner": "New owner address."
                    }
                }
            }
        },
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x6080604052600080546001600160a01b03191633179055611463806100256000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063a85e59e411610081578063d39de6e91161005b578063d39de6e914610182578063f2fde38b14610197578063fc124ebd146101aa576100c9565b8063a85e59e41461013a578063ae25532e1461014d578063b918161114610162576100c9565b806370712939116100b2578063707129391461010c5780638da5cb5b1461011f5780639ad2674414610127576100c9565b806342f1181e146100ce578063494503d4146100e3575b600080fd5b6100e16100dc366004610f27565b6101ca565b005b6100f66100f1366004611160565b6101de565b6040516101039190611190565b60405180910390f35b6100e161011a366004610f27565b610212565b6100f66102cc565b6100e1610135366004611032565b6102e8565b6100e16101483660046110f2565b6102fa565b6101556104f6565b60405161010391906112c5565b610175610170366004610f27565b61051b565b60405161010391906112ba565b61018a610530565b6040516101039190611261565b6100e16101a5366004610f27565b61059f565b6101bd6101b836600461109d565b610642565b6040516101039190611390565b6101d26106bc565b6101db81610705565b50565b600281815481106101eb57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b61021a6106bc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166102585761025861025382610836565b6108d5565b60005b6002548110156102c8578173ffffffffffffffffffffffffffffffffffffffff166002828154811061028957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156102c0576102bb82826108dd565b6102c8565b60010161025b565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6102f06106bc565b6102c882826108dd565b610302610b2c565b60008060606103566004898990508a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092949392505063ffffffff610b4f169050565b8060200190516103699190810190610f5f565b925092509250600061037b8487610b8d565b905060008373ffffffffffffffffffffffffffffffffffffffff1663c2df82e6868a8a8a886040518663ffffffff1660e01b81526004016103c09594939291906111d8565b602060405180830381600087803b1580156103da57600080fd5b505af11580156103ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610412919081019061105d565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f30000000000000000000000000000000000000000000000000000000014610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048f90611322565b60405180910390fd5b6104a28588610b8d565b6104b2838863ffffffff610c3916565b11156104ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048f90611359565b50505050505050505050565b7fdc1600f3000000000000000000000000000000000000000000000000000000005b90565b60016020526000908152604090205460ff1681565b6060600280548060200260200160405190810160405280929190818152602001828054801561059557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161056a575b5050505050905090565b6105a76106bc565b73ffffffffffffffffffffffffffffffffffffffff81166105d2576105cd610253610c55565b6101db565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60008061069460048686905087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092949392505063ffffffff610b4f169050565b8060200190516106a79190810190610f43565b90506106b38184610b8d565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610703576000546107039061025390339073ffffffffffffffffffffffffffffffffffffffff16610c8c565b565b73ffffffffffffffffffffffffffffffffffffffff811661072b5761072b610253610d2e565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156107655761076561025382610d65565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b606063eb5108a260e01b826040516024016108519190611190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff166109165761091661025383610836565b60025481106109315761093161025382600280549050610d80565b8173ffffffffffffffffffffffffffffffffffffffff166002828154811061095557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16146109b7576109b76102536002838154811061098f57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1684610d9d565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610a3257fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610a6557fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610ae49082610e99565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b3360009081526001602052604090205460ff166107035761070361025333610dba565b606081831115610b6857610b6861025360008585610dd5565b8351821115610b8157610b816102536001848751610dd5565b50819003910190815290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190610be2908590600401611190565b60206040518083038186803b158015610bfa57600080fd5b505afa158015610c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c329190810190611178565b9392505050565b600082820183811015610c3257610c3261025360008686610e7a565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060631de45ad160e01b8383604051602401610ca99291906111b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60408051808201909152600481527f57654fe400000000000000000000000000000000000000000000000000000000602082015290565b606063de16f1a060e01b826040516024016108519190611190565b606063e9f8377160e01b8383604051602401610ca9929190611399565b606063140a84db60e01b8383604051602401610ca99291906111b1565b606063b65a25b960e01b826040516024016108519190611190565b6060632800659560e01b848484604051602401610df493929190611314565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b606063e946c1bb60e01b848484604051602401610df4939291906112f2565b815481835581811115610ebd57600083815260209020610ebd918101908301610ec2565b505050565b61051891905b80821115610edc5760008155600101610ec8565b5090565b60008083601f840112610ef1578182fd5b50813567ffffffffffffffff811115610f08578182fd5b602083019150836020828501011115610f2057600080fd5b9250929050565b600060208284031215610f38578081fd5b8135610c32816113fe565b600060208284031215610f54578081fd5b8151610c32816113fe565b600080600060608486031215610f73578182fd5b8351610f7e816113fe565b6020850151909350610f8f816113fe565b604085015190925067ffffffffffffffff80821115610fac578283fd5b81860187601f820112610fbd578384fd5b8051925081831115610fcd578384fd5b610ffe60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016113a7565b9150828252876020848301011115611014578384fd5b6110258360208401602084016113ce565b5080925050509250925092565b60008060408385031215611044578182fd5b823561104f816113fe565b946020939093013593505050565b60006020828403121561106e578081fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610c32578182fd5b6000806000604084860312156110b1578283fd5b833567ffffffffffffffff8111156110c7578384fd5b6110d386828701610ee0565b90945092505060208401356110e7816113fe565b809150509250925092565b600080600080600060808688031215611109578081fd5b853567ffffffffffffffff81111561111f578182fd5b61112b88828901610ee0565b909650945050602086013561113f816113fe565b9250604086013561114f816113fe565b949793965091946060013592915050565b600060208284031215611171578081fd5b5035919050565b600060208284031215611189578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525083606083015260a0608083015282518060a084015261122b8160c08501602087016113ce565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c0019695505050505050565b602080825282518282018190526000918401906040840190835b818110156112af57835173ffffffffffffffffffffffffffffffffffffffff1683526020938401939092019160010161127b565b509095945050505050565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b606081016004851061130057fe5b938152602081019290925260409091015290565b606081016008851061130057fe5b6020808252600d908201527f4252494447455f4641494c454400000000000000000000000000000000000000604082015260600190565b6020808252600f908201527f4252494447455f554e4445525041590000000000000000000000000000000000604082015260600190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156113c657600080fd5b604052919050565b60005b838110156113e95781810151838201526020016113d1565b838111156113f8576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146101db57600080fdfea365627a7a72315820a035f7409d9d67ee1b5f955c61900d3e69de32b431931ec60fb33bf6ef7558056c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x1463 DUP1 PUSH2 0x25 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 0xA85E59E4 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xD39DE6E9 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xFC124EBD EQ PUSH2 0x1AA JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x13A JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x14D JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x162 JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0x70712939 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x10C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x127 JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0x42F1181E EQ PUSH2 0xCE JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xE3 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE1 PUSH2 0xDC CALLDATASIZE PUSH1 0x4 PUSH2 0xF27 JUMP JUMPDEST PUSH2 0x1CA JUMP JUMPDEST STOP JUMPDEST PUSH2 0xF6 PUSH2 0xF1 CALLDATASIZE PUSH1 0x4 PUSH2 0x1160 JUMP JUMPDEST PUSH2 0x1DE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x103 SWAP2 SWAP1 PUSH2 0x1190 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE1 PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0xF27 JUMP JUMPDEST PUSH2 0x212 JUMP JUMPDEST PUSH2 0xF6 PUSH2 0x2CC JUMP JUMPDEST PUSH2 0xE1 PUSH2 0x135 CALLDATASIZE PUSH1 0x4 PUSH2 0x1032 JUMP JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0xE1 PUSH2 0x148 CALLDATASIZE PUSH1 0x4 PUSH2 0x10F2 JUMP JUMPDEST PUSH2 0x2FA JUMP JUMPDEST PUSH2 0x155 PUSH2 0x4F6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x103 SWAP2 SWAP1 PUSH2 0x12C5 JUMP JUMPDEST PUSH2 0x175 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0xF27 JUMP JUMPDEST PUSH2 0x51B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x103 SWAP2 SWAP1 PUSH2 0x12BA JUMP JUMPDEST PUSH2 0x18A PUSH2 0x530 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x103 SWAP2 SWAP1 PUSH2 0x1261 JUMP JUMPDEST PUSH2 0xE1 PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0xF27 JUMP JUMPDEST PUSH2 0x59F JUMP JUMPDEST PUSH2 0x1BD PUSH2 0x1B8 CALLDATASIZE PUSH1 0x4 PUSH2 0x109D JUMP JUMPDEST PUSH2 0x642 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x103 SWAP2 SWAP1 PUSH2 0x1390 JUMP JUMPDEST PUSH2 0x1D2 PUSH2 0x6BC JUMP JUMPDEST PUSH2 0x1DB DUP2 PUSH2 0x705 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1EB JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH2 0x21A PUSH2 0x6BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x258 JUMPI PUSH2 0x258 PUSH2 0x253 DUP3 PUSH2 0x836 JUMP JUMPDEST PUSH2 0x8D5 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x2C8 JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x289 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2C0 JUMPI PUSH2 0x2BB DUP3 DUP3 PUSH2 0x8DD JUMP JUMPDEST PUSH2 0x2C8 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x25B JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x2F0 PUSH2 0x6BC JUMP JUMPDEST PUSH2 0x2C8 DUP3 DUP3 PUSH2 0x8DD JUMP JUMPDEST PUSH2 0x302 PUSH2 0xB2C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x356 PUSH1 0x4 DUP10 DUP10 SWAP1 POP DUP11 DUP11 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP PUSH4 0xFFFFFFFF PUSH2 0xB4F AND SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x369 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xF5F JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 PUSH2 0x37B DUP5 DUP8 PUSH2 0xB8D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xC2DF82E6 DUP7 DUP11 DUP11 DUP11 DUP9 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x11D8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3EE 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 0x412 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x105D JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x498 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x48F SWAP1 PUSH2 0x1322 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x4A2 DUP6 DUP9 PUSH2 0xB8D JUMP JUMPDEST PUSH2 0x4B2 DUP4 DUP9 PUSH4 0xFFFFFFFF PUSH2 0xC39 AND JUMP JUMPDEST GT ISZERO PUSH2 0x4EA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x48F SWAP1 PUSH2 0x1359 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x595 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x56A JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x5A7 PUSH2 0x6BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x5D2 JUMPI PUSH2 0x5CD PUSH2 0x253 PUSH2 0xC55 JUMP JUMPDEST PUSH2 0x1DB JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 CALLER SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x694 PUSH1 0x4 DUP7 DUP7 SWAP1 POP DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP PUSH4 0xFFFFFFFF PUSH2 0xB4F AND SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x6A7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xF43 JUMP JUMPDEST SWAP1 POP PUSH2 0x6B3 DUP2 DUP5 PUSH2 0xB8D JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x703 JUMPI PUSH1 0x0 SLOAD PUSH2 0x703 SWAP1 PUSH2 0x253 SWAP1 CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xC8C JUMP JUMPDEST JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x72B JUMPI PUSH2 0x72B PUSH2 0x253 PUSH2 0xD2E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x765 JUMPI PUSH2 0x765 PUSH2 0x253 DUP3 PUSH2 0xD65 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xEB5108A2 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x851 SWAP2 SWAP1 PUSH2 0x1190 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 SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x916 JUMPI PUSH2 0x916 PUSH2 0x253 DUP4 PUSH2 0x836 JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0x931 JUMPI PUSH2 0x931 PUSH2 0x253 DUP3 PUSH1 0x2 DUP1 SLOAD SWAP1 POP PUSH2 0xD80 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x955 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9B7 JUMPI PUSH2 0x9B7 PUSH2 0x253 PUSH1 0x2 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x98F JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0xD9D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xA32 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xA65 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xAE4 SWAP1 DUP3 PUSH2 0xE99 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x703 JUMPI PUSH2 0x703 PUSH2 0x253 CALLER PUSH2 0xDBA JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0xB68 JUMPI PUSH2 0xB68 PUSH2 0x253 PUSH1 0x0 DUP6 DUP6 PUSH2 0xDD5 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0xB81 JUMPI PUSH2 0xB81 PUSH2 0x253 PUSH1 0x1 DUP5 DUP8 MLOAD PUSH2 0xDD5 JUMP JUMPDEST POP DUP2 SWAP1 SUB SWAP2 ADD SWAP1 DUP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xBE2 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x1190 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xC0E 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 0xC32 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1178 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xC32 JUMPI PUSH2 0xC32 PUSH2 0x253 PUSH1 0x0 DUP7 DUP7 PUSH2 0xE7A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xE69EDC3E00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x1DE45AD1 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xCA9 SWAP3 SWAP2 SWAP1 PUSH2 0x11B1 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 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x57654FE400000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xDE16F1A0 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x851 SWAP2 SWAP1 PUSH2 0x1190 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE9F83771 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xCA9 SWAP3 SWAP2 SWAP1 PUSH2 0x1399 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x140A84DB PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xCA9 SWAP3 SWAP2 SWAP1 PUSH2 0x11B1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xB65A25B9 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x851 SWAP2 SWAP1 PUSH2 0x1190 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xDF4 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1314 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 PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xDF4 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x12F2 JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xEBD JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xEBD SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xEC2 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x518 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xEDC JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xEC8 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xEF1 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF08 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xF20 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF38 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xC32 DUP2 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF54 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xC32 DUP2 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xF73 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 MLOAD PUSH2 0xF7E DUP2 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0xF8F DUP2 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD SWAP1 SWAP3 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xFAC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP7 ADD DUP8 PUSH1 0x1F DUP3 ADD SLT PUSH2 0xFBD JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 MLOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0xFCD JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xFFE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 ADD AND ADD PUSH2 0x13A7 JUMP JUMPDEST SWAP2 POP DUP3 DUP3 MSTORE DUP8 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0x1014 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x1025 DUP4 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD PUSH2 0x13CE JUMP JUMPDEST POP DUP1 SWAP3 POP POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1044 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x104F DUP2 PUSH2 0x13FE JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x106E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0xC32 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x10B1 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x10C7 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x10D3 DUP7 DUP3 DUP8 ADD PUSH2 0xEE0 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x10E7 DUP2 PUSH2 0x13FE JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1109 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x111F JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x112B DUP9 DUP3 DUP10 ADD PUSH2 0xEE0 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x113F DUP2 PUSH2 0x13FE JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH2 0x114F DUP2 PUSH2 0x13FE JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x60 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1171 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1189 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP9 AND DUP4 MSTORE DUP1 DUP8 AND PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP7 AND PUSH1 0x40 DUP5 ADD MSTORE POP DUP4 PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE DUP3 MLOAD DUP1 PUSH1 0xA0 DUP5 ADD MSTORE PUSH2 0x122B DUP2 PUSH1 0xC0 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x13CE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0xC0 ADD SWAP7 SWAP6 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 PUSH2 0x12AF JUMPI DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x127B JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 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 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x1300 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x1300 JUMPI INVALID JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x4252494447455F4641494C454400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xF SWAP1 DUP3 ADD MSTORE PUSH32 0x4252494447455F554E4445525041590000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x13C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x13E9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x13D1 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x13F8 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1DB JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 LOG0 CALLDATALOAD 0xF7 BLOCKHASH SWAP14 SWAP14 PUSH8 0xEE1B5F955C61900D RETURNDATACOPY PUSH10 0xDE32B431931EC60FB33B 0xF6 0xEF PUSH22 0x58056C6578706572696D656E74616CF564736F6C6343 STOP SDIV GT STOP BLOCKHASH ",
                "sourceMap": "969:3207:4:-;;;898:5:78;:18;;-1:-1:-1;;;;;;898:18:78;906:10;898:18;;;969:3207:4;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063a85e59e411610081578063d39de6e91161005b578063d39de6e914610182578063f2fde38b14610197578063fc124ebd146101aa576100c9565b8063a85e59e41461013a578063ae25532e1461014d578063b918161114610162576100c9565b806370712939116100b2578063707129391461010c5780638da5cb5b1461011f5780639ad2674414610127576100c9565b806342f1181e146100ce578063494503d4146100e3575b600080fd5b6100e16100dc366004610f27565b6101ca565b005b6100f66100f1366004611160565b6101de565b6040516101039190611190565b60405180910390f35b6100e161011a366004610f27565b610212565b6100f66102cc565b6100e1610135366004611032565b6102e8565b6100e16101483660046110f2565b6102fa565b6101556104f6565b60405161010391906112c5565b610175610170366004610f27565b61051b565b60405161010391906112ba565b61018a610530565b6040516101039190611261565b6100e16101a5366004610f27565b61059f565b6101bd6101b836600461109d565b610642565b6040516101039190611390565b6101d26106bc565b6101db81610705565b50565b600281815481106101eb57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b61021a6106bc565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff166102585761025861025382610836565b6108d5565b60005b6002548110156102c8578173ffffffffffffffffffffffffffffffffffffffff166002828154811061028957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156102c0576102bb82826108dd565b6102c8565b60010161025b565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6102f06106bc565b6102c882826108dd565b610302610b2c565b60008060606103566004898990508a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092949392505063ffffffff610b4f169050565b8060200190516103699190810190610f5f565b925092509250600061037b8487610b8d565b905060008373ffffffffffffffffffffffffffffffffffffffff1663c2df82e6868a8a8a886040518663ffffffff1660e01b81526004016103c09594939291906111d8565b602060405180830381600087803b1580156103da57600080fd5b505af11580156103ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610412919081019061105d565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f30000000000000000000000000000000000000000000000000000000014610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048f90611322565b60405180910390fd5b6104a28588610b8d565b6104b2838863ffffffff610c3916565b11156104ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048f90611359565b50505050505050505050565b7fdc1600f3000000000000000000000000000000000000000000000000000000005b90565b60016020526000908152604090205460ff1681565b6060600280548060200260200160405190810160405280929190818152602001828054801561059557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161056a575b5050505050905090565b6105a76106bc565b73ffffffffffffffffffffffffffffffffffffffff81166105d2576105cd610253610c55565b6101db565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60008061069460048686905087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092949392505063ffffffff610b4f169050565b8060200190516106a79190810190610f43565b90506106b38184610b8d565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610703576000546107039061025390339073ffffffffffffffffffffffffffffffffffffffff16610c8c565b565b73ffffffffffffffffffffffffffffffffffffffff811661072b5761072b610253610d2e565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156107655761076561025382610d65565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b606063eb5108a260e01b826040516024016108519190611190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff166109165761091661025383610836565b60025481106109315761093161025382600280549050610d80565b8173ffffffffffffffffffffffffffffffffffffffff166002828154811061095557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16146109b7576109b76102536002838154811061098f57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1684610d9d565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610a3257fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610a6557fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610ae49082610e99565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b3360009081526001602052604090205460ff166107035761070361025333610dba565b606081831115610b6857610b6861025360008585610dd5565b8351821115610b8157610b816102536001848751610dd5565b50819003910190815290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190610be2908590600401611190565b60206040518083038186803b158015610bfa57600080fd5b505afa158015610c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c329190810190611178565b9392505050565b600082820183811015610c3257610c3261025360008686610e7a565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060631de45ad160e01b8383604051602401610ca99291906111b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60408051808201909152600481527f57654fe400000000000000000000000000000000000000000000000000000000602082015290565b606063de16f1a060e01b826040516024016108519190611190565b606063e9f8377160e01b8383604051602401610ca9929190611399565b606063140a84db60e01b8383604051602401610ca99291906111b1565b606063b65a25b960e01b826040516024016108519190611190565b6060632800659560e01b848484604051602401610df493929190611314565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b606063e946c1bb60e01b848484604051602401610df4939291906112f2565b815481835581811115610ebd57600083815260209020610ebd918101908301610ec2565b505050565b61051891905b80821115610edc5760008155600101610ec8565b5090565b60008083601f840112610ef1578182fd5b50813567ffffffffffffffff811115610f08578182fd5b602083019150836020828501011115610f2057600080fd5b9250929050565b600060208284031215610f38578081fd5b8135610c32816113fe565b600060208284031215610f54578081fd5b8151610c32816113fe565b600080600060608486031215610f73578182fd5b8351610f7e816113fe565b6020850151909350610f8f816113fe565b604085015190925067ffffffffffffffff80821115610fac578283fd5b81860187601f820112610fbd578384fd5b8051925081831115610fcd578384fd5b610ffe60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016113a7565b9150828252876020848301011115611014578384fd5b6110258360208401602084016113ce565b5080925050509250925092565b60008060408385031215611044578182fd5b823561104f816113fe565b946020939093013593505050565b60006020828403121561106e578081fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610c32578182fd5b6000806000604084860312156110b1578283fd5b833567ffffffffffffffff8111156110c7578384fd5b6110d386828701610ee0565b90945092505060208401356110e7816113fe565b809150509250925092565b600080600080600060808688031215611109578081fd5b853567ffffffffffffffff81111561111f578182fd5b61112b88828901610ee0565b909650945050602086013561113f816113fe565b9250604086013561114f816113fe565b949793965091946060013592915050565b600060208284031215611171578081fd5b5035919050565b600060208284031215611189578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525083606083015260a0608083015282518060a084015261122b8160c08501602087016113ce565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160c0019695505050505050565b602080825282518282018190526000918401906040840190835b818110156112af57835173ffffffffffffffffffffffffffffffffffffffff1683526020938401939092019160010161127b565b509095945050505050565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b606081016004851061130057fe5b938152602081019290925260409091015290565b606081016008851061130057fe5b6020808252600d908201527f4252494447455f4641494c454400000000000000000000000000000000000000604082015260600190565b6020808252600f908201527f4252494447455f554e4445525041590000000000000000000000000000000000604082015260600190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156113c657600080fd5b604052919050565b60005b838110156113e95781810151838201526020016113d1565b838111156113f8576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146101db57600080fdfea365627a7a72315820a035f7409d9d67ee1b5f955c61900d3e69de32b431931ec60fb33bf6ef7558056c6578706572696d656e74616cf564736f6c63430005110040",
                "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 0xA85E59E4 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xD39DE6E9 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xFC124EBD EQ PUSH2 0x1AA JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x13A JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x14D JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x162 JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0x70712939 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x10C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x127 JUMPI PUSH2 0xC9 JUMP JUMPDEST DUP1 PUSH4 0x42F1181E EQ PUSH2 0xCE JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xE3 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE1 PUSH2 0xDC CALLDATASIZE PUSH1 0x4 PUSH2 0xF27 JUMP JUMPDEST PUSH2 0x1CA JUMP JUMPDEST STOP JUMPDEST PUSH2 0xF6 PUSH2 0xF1 CALLDATASIZE PUSH1 0x4 PUSH2 0x1160 JUMP JUMPDEST PUSH2 0x1DE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x103 SWAP2 SWAP1 PUSH2 0x1190 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE1 PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0xF27 JUMP JUMPDEST PUSH2 0x212 JUMP JUMPDEST PUSH2 0xF6 PUSH2 0x2CC JUMP JUMPDEST PUSH2 0xE1 PUSH2 0x135 CALLDATASIZE PUSH1 0x4 PUSH2 0x1032 JUMP JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0xE1 PUSH2 0x148 CALLDATASIZE PUSH1 0x4 PUSH2 0x10F2 JUMP JUMPDEST PUSH2 0x2FA JUMP JUMPDEST PUSH2 0x155 PUSH2 0x4F6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x103 SWAP2 SWAP1 PUSH2 0x12C5 JUMP JUMPDEST PUSH2 0x175 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0xF27 JUMP JUMPDEST PUSH2 0x51B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x103 SWAP2 SWAP1 PUSH2 0x12BA JUMP JUMPDEST PUSH2 0x18A PUSH2 0x530 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x103 SWAP2 SWAP1 PUSH2 0x1261 JUMP JUMPDEST PUSH2 0xE1 PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0xF27 JUMP JUMPDEST PUSH2 0x59F JUMP JUMPDEST PUSH2 0x1BD PUSH2 0x1B8 CALLDATASIZE PUSH1 0x4 PUSH2 0x109D JUMP JUMPDEST PUSH2 0x642 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x103 SWAP2 SWAP1 PUSH2 0x1390 JUMP JUMPDEST PUSH2 0x1D2 PUSH2 0x6BC JUMP JUMPDEST PUSH2 0x1DB DUP2 PUSH2 0x705 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1EB JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH2 0x21A PUSH2 0x6BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x258 JUMPI PUSH2 0x258 PUSH2 0x253 DUP3 PUSH2 0x836 JUMP JUMPDEST PUSH2 0x8D5 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x2C8 JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x289 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2C0 JUMPI PUSH2 0x2BB DUP3 DUP3 PUSH2 0x8DD JUMP JUMPDEST PUSH2 0x2C8 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x25B JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x2F0 PUSH2 0x6BC JUMP JUMPDEST PUSH2 0x2C8 DUP3 DUP3 PUSH2 0x8DD JUMP JUMPDEST PUSH2 0x302 PUSH2 0xB2C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x356 PUSH1 0x4 DUP10 DUP10 SWAP1 POP DUP11 DUP11 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP PUSH4 0xFFFFFFFF PUSH2 0xB4F AND SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x369 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xF5F JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 PUSH2 0x37B DUP5 DUP8 PUSH2 0xB8D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xC2DF82E6 DUP7 DUP11 DUP11 DUP11 DUP9 PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x11D8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3EE 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 0x412 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x105D JUMP JUMPDEST SWAP1 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x498 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x48F SWAP1 PUSH2 0x1322 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x4A2 DUP6 DUP9 PUSH2 0xB8D JUMP JUMPDEST PUSH2 0x4B2 DUP4 DUP9 PUSH4 0xFFFFFFFF PUSH2 0xC39 AND JUMP JUMPDEST GT ISZERO PUSH2 0x4EA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x48F SWAP1 PUSH2 0x1359 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x595 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x56A JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x5A7 PUSH2 0x6BC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x5D2 JUMPI PUSH2 0x5CD PUSH2 0x253 PUSH2 0xC55 JUMP JUMPDEST PUSH2 0x1DB JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 CALLER SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x694 PUSH1 0x4 DUP7 DUP7 SWAP1 POP DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP PUSH4 0xFFFFFFFF PUSH2 0xB4F AND SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x6A7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xF43 JUMP JUMPDEST SWAP1 POP PUSH2 0x6B3 DUP2 DUP5 PUSH2 0xB8D JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x703 JUMPI PUSH1 0x0 SLOAD PUSH2 0x703 SWAP1 PUSH2 0x253 SWAP1 CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xC8C JUMP JUMPDEST JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x72B JUMPI PUSH2 0x72B PUSH2 0x253 PUSH2 0xD2E JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x765 JUMPI PUSH2 0x765 PUSH2 0x253 DUP3 PUSH2 0xD65 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0xEB5108A2 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x851 SWAP2 SWAP1 PUSH2 0x1190 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 SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x916 JUMPI PUSH2 0x916 PUSH2 0x253 DUP4 PUSH2 0x836 JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0x931 JUMPI PUSH2 0x931 PUSH2 0x253 DUP3 PUSH1 0x2 DUP1 SLOAD SWAP1 POP PUSH2 0xD80 JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x955 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9B7 JUMPI PUSH2 0x9B7 PUSH2 0x253 PUSH1 0x2 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x98F JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH2 0xD9D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xA32 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xA65 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xAE4 SWAP1 DUP3 PUSH2 0xE99 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x703 JUMPI PUSH2 0x703 PUSH2 0x253 CALLER PUSH2 0xDBA JUMP JUMPDEST PUSH1 0x60 DUP2 DUP4 GT ISZERO PUSH2 0xB68 JUMPI PUSH2 0xB68 PUSH2 0x253 PUSH1 0x0 DUP6 DUP6 PUSH2 0xDD5 JUMP JUMPDEST DUP4 MLOAD DUP3 GT ISZERO PUSH2 0xB81 JUMPI PUSH2 0xB81 PUSH2 0x253 PUSH1 0x1 DUP5 DUP8 MLOAD PUSH2 0xDD5 JUMP JUMPDEST POP DUP2 SWAP1 SUB SWAP2 ADD SWAP1 DUP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xBE2 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x1190 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xC0E 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 0xC32 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1178 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xC32 JUMPI PUSH2 0xC32 PUSH2 0x253 PUSH1 0x0 DUP7 DUP7 PUSH2 0xE7A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0xE69EDC3E00000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x1DE45AD1 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xCA9 SWAP3 SWAP2 SWAP1 PUSH2 0x11B1 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 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x57654FE400000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xDE16F1A0 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x851 SWAP2 SWAP1 PUSH2 0x1190 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE9F83771 PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xCA9 SWAP3 SWAP2 SWAP1 PUSH2 0x1399 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x140A84DB PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xCA9 SWAP3 SWAP2 SWAP1 PUSH2 0x11B1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xB65A25B9 PUSH1 0xE0 SHL DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x851 SWAP2 SWAP1 PUSH2 0x1190 JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xDF4 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x1314 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 PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0xDF4 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x12F2 JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xEBD JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xEBD SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xEC2 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x518 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xEDC JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xEC8 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0xEF1 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xF08 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xF20 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF38 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xC32 DUP2 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF54 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xC32 DUP2 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xF73 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 MLOAD PUSH2 0xF7E DUP2 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0xF8F DUP2 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD SWAP1 SWAP3 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xFAC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP7 ADD DUP8 PUSH1 0x1F DUP3 ADD SLT PUSH2 0xFBD JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 MLOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0xFCD JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xFFE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP7 ADD AND ADD PUSH2 0x13A7 JUMP JUMPDEST SWAP2 POP DUP3 DUP3 MSTORE DUP8 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0x1014 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x1025 DUP4 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD PUSH2 0x13CE JUMP JUMPDEST POP DUP1 SWAP3 POP POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1044 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x104F DUP2 PUSH2 0x13FE JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x106E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0xC32 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x10B1 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x10C7 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x10D3 DUP7 DUP3 DUP8 ADD PUSH2 0xEE0 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x10E7 DUP2 PUSH2 0x13FE JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1109 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x111F JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x112B DUP9 DUP3 DUP10 ADD PUSH2 0xEE0 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x113F DUP2 PUSH2 0x13FE JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH2 0x114F DUP2 PUSH2 0x13FE JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x60 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1171 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1189 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP9 AND DUP4 MSTORE DUP1 DUP8 AND PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP7 AND PUSH1 0x40 DUP5 ADD MSTORE POP DUP4 PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE DUP3 MLOAD DUP1 PUSH1 0xA0 DUP5 ADD MSTORE PUSH2 0x122B DUP2 PUSH1 0xC0 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x13CE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0xC0 ADD SWAP7 SWAP6 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 PUSH2 0x12AF JUMPI DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x127B JUMP JUMPDEST POP SWAP1 SWAP6 SWAP5 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 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x1300 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH2 0x1300 JUMPI INVALID JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x4252494447455F4641494C454400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xF SWAP1 DUP3 ADD MSTORE PUSH32 0x4252494447455F554E4445525041590000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x13C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x13E9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x13D1 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x13F8 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1DB JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 LOG0 CALLDATALOAD 0xF7 BLOCKHASH SWAP14 SWAP14 PUSH8 0xEE1B5F955C61900D RETURNDATACOPY PUSH10 0xDE32B431931EC60FB33B 0xF6 0xEF PUSH22 0x58056C6578706572696D656E74616CF564736F6C6343 STOP SDIV GT STOP BLOCKHASH ",
                "sourceMap": "969:3207:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;969:3207:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1599:131:67;;;;;;;;;:::i;:::-;;1379:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1844:445;;;;;;;;;:::i;827:20:78:-;;;:::i;2462:195:67:-;;;;;;;;;:::i;1905:1207:4:-;;;;;;;;;:::i;3221:121::-;;;:::i;:::-;;;;;;;;1170:43:67;;;;;;;;;:::i;:::-;;;;;;;;2754:138;;;:::i;:::-;;;;;;;;1097:329:78;;;;;;;;;:::i;3520:321:4:-;;;;;;;;;:::i;:::-;;;;;;;;1599:131:67;960:22:78;:20;:22::i;:::-;1694:29:67;1716:6;1694:21;:29::i;:::-;1599:131;:::o;1379:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1379:28:67;:::o;1844:445::-;960:22:78;:20;:22::i;:::-;1947:18:67;;;;;;;:10;:18;;;;;;;;1942:131;;1981:81;2003:58;2054:6;2003:50;:58::i;:::-;1981:21;:81::i;:::-;2087:9;2082:201;2106:11;:18;2102:22;;2082:201;;;2167:6;2149:24;;:11;2161:1;2149:14;;;;;;;;;;;;;;;;;;;;:24;2145:128;;;2193:42;2225:6;2233:1;2193:31;:42::i;:::-;2253:5;;2145:128;2126:3;;2082:201;;;;1844:445;:::o;827:20:78:-;;;;;;:::o;2462:195:67:-;960:22:78;:20;:22::i;:::-;2604:46:67;2636:6;2644:5;2604:31;:46::i;1905:1207:4:-;955:27:67;:25;:27::i;:::-;2139:20:4;2173:21;2208:23;2268:47;2295:1;2298:9;;:16;;2268:9;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2268:26:4;;:47;;-1:-1:-1;;2268:47:4;:26;:47;;-1:-1:-1;2268:47:4:i;:::-;2244:120;;;;;;;;;;;;;;2125:239;;;;;;2442:21;2466:27;2476:12;2490:2;2466:9;:27::i;:::-;2442:51;;2598:14;2628:13;2615:46;;;2675:12;2701:4;2719:2;2735:6;2755:10;2615:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2615:160:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2615:160:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2615:160:4;;;;;;;;;2598:177;-1:-1:-1;2857:19:4;;;2868:8;2857:19;2849:45;;;;;;;;;;;;;;;;;;;;;;3037:27;3047:12;3061:2;3037:9;:27::i;:::-;3004:29;:13;3026:6;3004:29;:21;:29;:::i;:::-;:60;;2983:122;;;;;;;;;;;;;;992:1:67;;;;;1905:1207:4;;;;;:::o;3221:121::-;3327:8;3221:121;;:::o;1170:43:67:-;;;;;;;;;;;;;;;:::o;2754:138::-;2835:16;2874:11;2867:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2754:138;:::o;1097:329:78:-;960:22;:20;:22::i;:::-;1193;;;1189:231;;1231:70;1253:47;:45;:47::i;1231:70::-;1189:231;;;1332:5;:16;;;;;;;;;;;;1367:42;;1332:16;;1388:10;;1367:42;;1332:5;1367:42;1097:329;:::o;3520:321:4:-;3627:15;3659:20;3707:47;3734:1;3737:9;;:16;;3707:9;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3707:26:4;;:47;;-1:-1:-1;;3707:47:4;:26;:47;;-1:-1:-1;3707:47:4:i;:::-;3683:104;;;;;;;;;;;;;;3658:129;;3804:30;3814:12;3828:5;3804:9;:30::i;:::-;3797:37;3520:321;-1:-1:-1;;;;;3520:321:4:o;1432:255:78:-;1526:5;;;;1512:10;:19;1508:173;;1650:5;;1547:123;;1569:100;;1622:10;;1650:5;;1569:35;:100::i;1547:123::-;1432:255::o;3264:602:67:-;3405:20;;;3401:127;;3441:76;3463:53;:51;:53::i;3441:76::-;3603:18;;;;;;;:10;:18;;;;;;;;3599:134;;;3637:85;3659:62;3714:6;3659:54;:62::i;3637:85::-;3743:18;;;;;;;3764:4;3743:18;;;;;;;;:25;;;;;;;;3778:11;27:10:-1;;23:18;;;45:23;;3778:24:67;;;;;;;;;;;;;;3817:42;3848:10;;3743:18;3817:42;;;3264:602;:::o;2747:241:71:-;2844:12;1416:10;2915:36;;2965:6;2879:102;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;2879:102:71;;;49:4:-1;25:18;;61:17;;2879:102:71;182:15:-1;2879:102:71;;;;179:29:-1;;;;160:49;;;2879:102:71;-1:-1:-1;2747:241:71;;;:::o;1511:170:75:-;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;4039:887:67;4169:18;;;;;;;:10;:18;;;;;;;;4164:131;;4203:81;4225:58;4276:6;4225:50;:58::i;4203:81::-;4317:11;:18;4308:27;;4304:201;;4351:143;4373:120;4438:5;4461:11;:18;;;;4373:47;:120::i;4351:143::-;4540:6;4518:28;;:11;4530:5;4518:18;;;;;;;;;;;;;;;;;;;;:28;4514:212;;4562:153;4584:130;4658:11;4670:5;4658:18;;;;;;;;;;;;;;;;;;;;4694:6;4584:56;:130::i;4562:153::-;4743:18;;;;;;;:10;:18;;;;;4736:25;;;;;;4792:11;4804:18;;:22;;;;4792:35;;;;;;;;;;;;;;;;4771:11;:18;;4792:35;;;;;4783:5;;4771:18;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;4837:11;:23;;;;;;;;;:::i;:::-;-1:-1:-1;4875:44:67;;4908:10;;4875:44;;;;;;;;;4039:887;;:::o;2952:226::-;3049:10;3038:22;;;;:10;:22;;;;;;;;3033:139;;3076:85;3098:62;3149:10;3098:50;:62::i;8062:1059:72:-;8207:19;8387:2;8380:4;:9;8376:261;;;8405:221;8427:198;8489:80;8587:4;8609:2;8427:44;:198::i;8405:221::-;8655:1;:8;8650:2;:13;8646:271;;;8679:227;8701:204;8763:82;8863:2;8883:1;:8;8701:44;:204::i;8679:227::-;-1:-1:-1;9068:13:72;;;9028:12;;9053:29;;;9028:12;8062:1059::o;3985:189:4:-;4125:42;;;;;4087:15;;4125:35;;;;;;:42;;4161:5;;4125:42;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4125:42:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4125:42:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4125:42:4;;;;;;;;;4118:49;3985:189;-1:-1:-1;;;3985:189:4:o;1335:383:76:-;1421:7;1456:5;;;1475;;;1471:223;;;1496:187;1518:164;1575:55;1648:1;1667;1518:39;:164::i;669:159:74:-;787:34;;;;;;;;;;;;;;;;;669:159;:::o;387:276::-;511:12;183:10;582:25;;621:6;641:5;546:110;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;546:110:74;;;49:4:-1;25:18;;61:17;;546:110:74;182:15:-1;546:110:74;;;;179:29:-1;;;;160:49;;;546:110:74;-1:-1:-1;387:276:74;;;;:::o;2994:161:71:-;3113:35;;;;;;;;;;;;;;;;;2994:161;:::o;2492:249::-;2593:12;1265:10;2664:40;;2718:6;2628:106;;;;;;;;;1947:292;2078:12;955:10;2149:34;;2197:5;2216:6;2113:119;;;;;;;;;;1622:319;1767:12;801:10;1838:42;;1894:10;1918:6;1802:132;;;;;;;;;;2245:241;2342:12;1106:10;2413:36;;2463:6;2377:102;;;;;;;;;1292:378:73;1480:12;1232:10;1551:37;;1602:9;1625:6;1645:8;1515:148;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1515:148:73;;;49:4:-1;25:18;;61:17;;1515:148:73;182:15:-1;1515:148:73;;;;179:29:-1;;;;160:49;;;1515:148:73;-1:-1:-1;1292:378:73;;;;;:::o;731:322:77:-;884:12;196:10;955:28;;997:9;1020:1;1035;919:127;;;;;;;;;;;969:3207:4;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;452:336:-1;;;566:3;559:4;551:6;547:17;543:27;533:2;;-1:-1;;574:12;533:2;-1:-1;604:20;;644:18;633:30;;630:2;;;-1:-1;;666:12;630:2;710:4;702:6;698:17;686:29;;761:3;710:4;741:17;702:6;727:32;;724:41;721:2;;;778:1;;768:12;721:2;526:262;;;;;;1517:241;;1621:2;1609:9;1600:7;1596:23;1592:32;1589:2;;;-1:-1;;1627:12;1589:2;85:6;72:20;97:33;124:5;97:33;;1765:279;;1888:2;1876:9;1867:7;1863:23;1859:32;1856:2;;;-1:-1;;1894:12;1856:2;234:6;228:13;246:41;281:5;246:41;;2051:656;;;;2221:2;2209:9;2200:7;2196:23;2192:32;2189:2;;;-1:-1;;2227:12;2189:2;234:6;228:13;246:41;281:5;246:41;;;2398:2;2456:22;;228:13;2279:82;;-1:-1;246:41;228:13;246:41;;;2546:2;2531:18;;2525:25;2406:82;;-1:-1;2570:18;2559:30;;;2556:2;;;-1:-1;;2592:12;2556:2;2674:6;2663:9;2659:22;905:3;898:4;890:6;886:17;882:27;872:2;;-1:-1;;913:12;872:2;953:6;947:13;933:27;;2570:18;12831:6;12828:30;12825:2;;;-1:-1;;12861:12;12825:2;975:60;2398:2;12934:9;898:4;12919:6;12915:17;12911:33;12992:15;975:60;;;966:69;;1055:6;1048:5;1041:21;1159:3;2398:2;1150:6;1083;1141:16;;1138:25;1135:2;;;-1:-1;;1166:12;1135:2;1186:39;1218:6;2398:2;1117:5;1113:16;2398:2;1083:6;1079:17;1186:39;;;;2612:79;;;;;2183:524;;;;;;2714:366;;;2835:2;2823:9;2814:7;2810:23;2806:32;2803:2;;;-1:-1;;2841:12;2803:2;85:6;72:20;97:33;124:5;97:33;;;2893:63;2993:2;3032:22;;;;1306:20;;-1:-1;;;2797:283;3087:261;;3201:2;3189:9;3180:7;3176:23;3172:32;3169:2;;;-1:-1;;3207:12;3169:2;382:6;376:13;14467:66;16417:5;14456:78;16393:5;16390:34;16380:2;;-1:-1;;16428:12;3355:490;;;;3495:2;3483:9;3474:7;3470:23;3466:32;3463:2;;;-1:-1;;3501:12;3463:2;3559:17;3546:31;3597:18;3589:6;3586:30;3583:2;;;-1:-1;;3619:12;3583:2;3657:64;3713:7;3704:6;3693:9;3689:22;3657:64;;;3647:74;;-1:-1;3647:74;-1:-1;;3758:2;3797:22;;72:20;97:33;72:20;97:33;;;3766:63;;;;3457:388;;;;;;3852:741;;;;;;4026:3;4014:9;4005:7;4001:23;3997:33;3994:2;;;-1:-1;;4033:12;3994:2;4091:17;4078:31;4129:18;4121:6;4118:30;4115:2;;;-1:-1;;4151:12;4115:2;4189:64;4245:7;4236:6;4225:9;4221:22;4189:64;;;4179:74;;-1:-1;4179:74;-1:-1;;4290:2;4329:22;;72:20;97:33;72:20;97:33;;;4298:63;-1:-1;4398:2;4437:22;;72:20;97:33;72:20;97:33;;;3988:605;;;;-1:-1;3988:605;;4506:2;4545:22;1306:20;;3988:605;-1:-1;;3988:605;4600:241;;4704:2;4692:9;4683:7;4679:23;4675:32;4672:2;;;-1:-1;;4710:12;4672:2;-1:-1;1306:20;;4666:175;-1:-1;4666:175;4848:263;;4963:2;4951:9;4942:7;4938:23;4934:32;4931:2;;;-1:-1;;4969:12;4931:2;-1:-1;1454:13;;4925:186;-1:-1;4925:186;7975:213;14959:42;14948:54;;;;5361:37;;8093:2;8078:18;;8064:124;8195:324;14959:42;14948:54;;;5361:37;;14948:54;;8505:2;8490:18;;5361:37;8341:2;8326:18;;8312:207;8526:743;;14959:42;;14952:5;14948:54;5368:3;5361:37;14959:42;14952:5;14948:54;8939:2;8928:9;8924:18;5361:37;14959:42;14952:5;14948:54;9022:2;9011:9;9007:18;5361:37;;7956:5;9105:2;9094:9;9090:18;7926:37;8774:3;9142;9131:9;9127:19;9120:49;6629:5;13285:12;13700:6;8774:3;8763:9;8759:19;13688;6722:52;6767:6;13728:14;8763:9;13728:14;8939:2;6748:5;6744:16;6722:52;;;15798:2;15778:14;15794:7;15774:28;6786:39;;;;13728:14;6786:39;;8745:524;-1:-1;;;;;;8745:524;9276:361;9444:2;9458:47;;;13285:12;;9429:18;;;13688:19;;;9276:361;;13139:14;;;13728;;;;9276:361;5969:260;5994:6;5991:1;5988:13;5969:260;;;6055:13;;14959:42;14948:54;5361:37;;9444:2;13543:14;;;;5272;;;;6016:1;6009:9;5969:260;;;-1:-1;9511:116;;9415:222;-1:-1;;;;;9415:222;9644:201;14369:13;;14362:21;6324:34;;9756:2;9741:18;;9727:118;9852:209;14467:66;14456:78;;;;6439:36;;9968:2;9953:18;;9939:122;10068:473;10261:2;10246:18;;15905:1;15895:12;;15885:2;;15911:9;15885:2;6927:69;;;10444:2;10429:18;;7926:37;;;;10527:2;10512:18;;;7926:37;10232:309;;10548:503;10756:2;10741:18;;16039:1;16029:12;;16019:2;;16045:9;11058:407;11249:2;11263:47;;;7434:2;11234:18;;;13688:19;7470:15;13728:14;;;7450:36;7505:12;;;11220:245;11472:407;11663:2;11677:47;;;7756:2;11648:18;;;13688:19;7792:17;13728:14;;;7772:38;7829:12;;;11634:245;11886:213;7926:37;;;12004:2;11989:18;;11975:124;12106:324;7926:37;;;12416:2;12401:18;;7926:37;12252:2;12237:18;;12223:207;12437:256;12499:2;12493:9;12525:17;;;12600:18;12585:34;;12621:22;;;12582:62;12579:2;;;12657:1;;12647:12;12579:2;12499;12666:22;12477:216;;-1:-1;12477:216;15434:268;15499:1;15506:101;15520:6;15517:1;15514:13;15506:101;;;15587:11;;;15581:18;15568:11;;;15561:39;15542:2;15535:10;15506:101;;;15622:6;15619:1;15616:13;15613:2;;;15499:1;15678:6;15673:3;15669:16;15662:27;15613:2;;15483:219;;;;16068:117;14959:42;16155:5;14948:54;16130:5;16127:35;16117:2;;16176:1;;16166:12"
            }
        }
    },
    "sourceTreeHashHex": "0xfd29c53833e388c8a3bc16395d3801ea74f2e04e48896da548da3f616c0f09af",
    "sources": {
        "./ERC20BridgeProxy.sol": {
            "id": 4,
            "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/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/Authorizable.sol\";\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"./interfaces/IAssetProxy.sol\";\nimport \"./interfaces/IERC20Bridge.sol\";\n\n\ncontract ERC20BridgeProxy is\n    IAssetProxy,\n    Authorizable\n{\n    using LibBytes for bytes;\n    using LibSafeMath for uint256;\n\n    // @dev Id of this proxy. Also the result of a successful bridge call.\n    //      bytes4(keccak256(\"ERC20Bridge(address,address,bytes)\"))\n    bytes4 constant private PROXY_ID = 0xdc1600f3;\n\n    /// @dev Calls a bridge contract to transfer `amount` of ERC20 from `from`\n    ///      to `to`. Asserts that the balance of `to` has increased by `amount`.\n    /// @param assetData Abi-encoded data for this asset proxy encoded as:\n    ///          abi.encodeWithSelector(\n    ///             bytes4 PROXY_ID,\n    ///             address tokenAddress,\n    ///             address bridgeAddress,\n    ///             bytes bridgeData\n    ///          )\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    function transferFrom(\n        bytes calldata assetData,\n        address from,\n        address to,\n        uint256 amount\n    )\n        external\n        onlyAuthorized\n    {\n        // Extract asset data fields.\n        (\n            address tokenAddress,\n            address bridgeAddress,\n            bytes memory bridgeData\n        ) = abi.decode(\n            assetData.sliceDestructive(4, assetData.length),\n            (address, address, bytes)\n        );\n\n        // Remember the balance of `to` before calling the bridge.\n        uint256 balanceBefore = balanceOf(tokenAddress, to);\n        // Call the bridge, who should transfer `amount` of `tokenAddress` to\n        // `to`.\n        bytes4 success = IERC20Bridge(bridgeAddress).bridgeTransferFrom(\n            tokenAddress,\n            from,\n            to,\n            amount,\n            bridgeData\n        );\n        // Bridge must return the proxy ID to indicate success.\n        require(success == PROXY_ID, \"BRIDGE_FAILED\");\n        // Ensure that the balance of `to` has increased by at least `amount`.\n        require(\n            balanceBefore.safeAdd(amount) <= balanceOf(tokenAddress, to),\n            \"BRIDGE_UNDERPAY\"\n        );\n    }\n\n    /// @dev Gets the proxy id associated with this asset proxy.\n    /// @return proxyId The proxy id.\n    function getProxyId()\n        external\n        pure\n        returns (bytes4 proxyId)\n    {\n        return PROXY_ID;\n    }\n\n    /// @dev Retrieves the balance of `owner` for this asset.\n    /// @return balance The balance of the ERC20 token being transferred by this\n    ///         asset proxy.\n    function balanceOf(bytes calldata assetData, address owner)\n        external\n        view\n        returns (uint256 balance)\n    {\n        (address tokenAddress) = abi.decode(\n            assetData.sliceDestructive(4, assetData.length),\n            (address)\n        );\n        return balanceOf(tokenAddress, owner);\n    }\n\n    /// @dev Retrieves the balance of `owner` given an ERC20 address.\n    /// @return balance The balance of the ERC20 token for `owner`.\n    function balanceOf(address tokenAddress, address owner)\n        private\n        view\n        returns (uint256 balance)\n    {\n        return IERC20Token(tokenAddress).balanceOf(owner);\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibBytes.sol": {
            "id": 72,
            "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 \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n    using LibBytes for bytes;\n\n    /// @dev Gets the memory address for a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of byte array. This\n    ///         points to the header of the byte array which contains\n    ///         the length.\n    function rawAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := input\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Gets the memory address for the contents of a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of the contents of the byte array.\n    function contentAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := add(input, 32)\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Copies `length` bytes from memory location `source` to `dest`.\n    /// @param dest memory address to copy bytes to.\n    /// @param source memory address to copy bytes from.\n    /// @param length number of bytes to copy.\n    function memCopy(\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        internal\n        pure\n    {\n        if (length < 32) {\n            // Handle a partial word by reading destination and masking\n            // off the bits we are interested in.\n            // This correctly handles overlap, zero lengths and source == dest\n            assembly {\n                let mask := sub(exp(256, sub(32, length)), 1)\n                let s := and(mload(source), not(mask))\n                let d := and(mload(dest), mask)\n                mstore(dest, or(s, d))\n            }\n        } else {\n            // Skip the O(length) loop when source == dest.\n            if (source == dest) {\n                return;\n            }\n\n            // For large copies we copy whole words at a time. The final\n            // word is aligned to the end of the range (instead of after the\n            // previous) to handle partial words. So a copy will look like this:\n            //\n            //  ####\n            //      ####\n            //          ####\n            //            ####\n            //\n            // We handle overlap in the source and destination range by\n            // changing the copying direction. This prevents us from\n            // overwriting parts of source that we still need to copy.\n            //\n            // This correctly handles source == dest\n            //\n            if (source > dest) {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because it\n                    // is easier to compare with in the loop, and these\n                    // are also the addresses we need for copying the\n                    // last bytes.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the last 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the last bytes in\n                    // source already due to overlap.\n                    let last := mload(sEnd)\n\n                    // Copy whole words front to back\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} lt(source, sEnd) {} {\n                        mstore(dest, mload(source))\n                        source := add(source, 32)\n                        dest := add(dest, 32)\n                    }\n\n                    // Write the last 32 bytes\n                    mstore(dEnd, last)\n                }\n            } else {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because those\n                    // are the starting points when copying a word at the end.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the first 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the first bytes in\n                    // source already due to overlap.\n                    let first := mload(source)\n\n                    // Copy whole words back to front\n                    // We use a signed comparisson here to allow dEnd to become\n                    // negative (happens when source and dest < 32). Valid\n                    // addresses in local memory will never be larger than\n                    // 2**255, so they can be safely re-interpreted as signed.\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} slt(dest, dEnd) {} {\n                        mstore(dEnd, mload(sEnd))\n                        sEnd := sub(sEnd, 32)\n                        dEnd := sub(dEnd, 32)\n                    }\n\n                    // Write the first 32 bytes\n                    mstore(dest, first)\n                }\n            }\n        }\n    }\n\n    /// @dev Returns a slices from a byte array.\n    /// @param b The byte array to take a slice from.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    function slice(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure and copy contents\n        result = new bytes(to - from);\n        memCopy(\n            result.contentAddress(),\n            b.contentAddress() + from,\n            result.length\n        );\n        return result;\n    }\n\n    /// @dev Returns a slice from a byte array without preserving the input.\n    /// @param b The byte array to take a slice from. Will be destroyed in the process.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n    function sliceDestructive(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure around [from, to) in-place.\n        assembly {\n            result := add(b, from)\n            mstore(result, sub(to, from))\n        }\n        return result;\n    }\n\n    /// @dev Pops the last byte off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The byte that was popped off.\n    function popLastByte(bytes memory b)\n        internal\n        pure\n        returns (bytes1 result)\n    {\n        if (b.length == 0) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n                b.length,\n                0\n            ));\n        }\n\n        // Store last byte.\n        result = b[b.length - 1];\n\n        assembly {\n            // Decrement length of byte array.\n            let newLen := sub(mload(b), 1)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Tests equality of two byte arrays.\n    /// @param lhs First byte array to compare.\n    /// @param rhs Second byte array to compare.\n    /// @return True if arrays are the same. False otherwise.\n    function equals(\n        bytes memory lhs,\n        bytes memory rhs\n    )\n        internal\n        pure\n        returns (bool equal)\n    {\n        // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n        // We early exit on unequal lengths, but keccak would also correctly\n        // handle this.\n        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n    }\n\n    /// @dev Reads an address from a position in a byte array.\n    /// @param b Byte array containing an address.\n    /// @param index Index in byte array of address.\n    /// @return address from byte array.\n    function readAddress(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (address result)\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Read address from array memory\n        assembly {\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 20-byte mask to obtain address\n            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    /// @dev Writes an address into a specific position in a byte array.\n    /// @param b Byte array to insert address into.\n    /// @param index Index in byte array of address.\n    /// @param input Address to put into byte array.\n    function writeAddress(\n        bytes memory b,\n        uint256 index,\n        address input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Store address into array memory\n        assembly {\n            // The address occupies 20 bytes and mstore stores 32 bytes.\n            // First fetch the 32-byte word where we'll be storing the address, then\n            // apply a mask so we have only the bytes in the word that the address will not occupy.\n            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n            let neighbors := and(\n                mload(add(b, index)),\n                0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n            )\n\n            // Make sure input address is clean.\n            // (Solidity does not guarantee this)\n            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n            // Store the neighbors and address into memory\n            mstore(add(b, index), xor(input, neighbors))\n        }\n    }\n\n    /// @dev Reads a bytes32 value from a position in a byte array.\n    /// @param b Byte array containing a bytes32 value.\n    /// @param index Index in byte array of bytes32 value.\n    /// @return bytes32 value from byte array.\n    function readBytes32(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            result := mload(add(b, index))\n        }\n        return result;\n    }\n\n    /// @dev Writes a bytes32 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            mstore(add(b, index), input)\n        }\n    }\n\n    /// @dev Reads a uint256 value from a position in a byte array.\n    /// @param b Byte array containing a uint256 value.\n    /// @param index Index in byte array of uint256 value.\n    /// @return uint256 value from byte array.\n    function readUint256(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (uint256 result)\n    {\n        result = uint256(readBytes32(b, index));\n        return result;\n    }\n\n    /// @dev Writes a uint256 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input\n    )\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n\n    /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n    /// @param b Byte array containing a bytes4 value.\n    /// @param index Index in byte array of bytes4 value.\n    /// @return bytes4 value from byte array.\n    function readBytes4(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes4 result)\n    {\n        if (b.length < index + 4) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n                b.length,\n                index + 4\n            ));\n        }\n\n        // Arrays are prefixed by a 32 byte length field\n        index += 32;\n\n        // Read the bytes4 from array memory\n        assembly {\n            result := mload(add(b, index))\n            // Solidity does not require us to clean the trailing bytes.\n            // We do it anyway\n            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n        }\n        return result;\n    }\n\n    /// @dev Writes a new length to a byte array.\n    ///      Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n    ///      Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n    /// @param b Bytes array to write new length to.\n    /// @param length New length of byte array.\n    function writeLength(bytes memory b, uint256 length)\n        internal\n        pure\n    {\n        assembly {\n            mstore(b, length)\n        }\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": {
            "id": 73,
            "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 LibBytesRichErrors {\n\n    enum InvalidByteOperationErrorCodes {\n        FromLessThanOrEqualsToRequired,\n        ToLessThanOrEqualsLengthRequired,\n        LengthGreaterThanZeroRequired,\n        LengthGreaterThanOrEqualsFourRequired,\n        LengthGreaterThanOrEqualsTwentyRequired,\n        LengthGreaterThanOrEqualsThirtyTwoRequired,\n        LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n        DestinationLengthGreaterThanOrEqualSourceLengthRequired\n    }\n\n    // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n        0x28006595;\n\n    // solhint-disable func-name-mixedcase\n    function InvalidByteOperationError(\n        InvalidByteOperationErrorCodes errorCode,\n        uint256 offset,\n        uint256 required\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n            errorCode,\n            offset,\n            required\n        );\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/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/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-utils/contracts/src/Authorizable.sol": {
            "id": 67,
            "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 \"./interfaces/IAuthorizable.sol\";\nimport \"./LibAuthorizableRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\nimport \"./Ownable.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Authorizable is\n    Ownable,\n    IAuthorizable\n{\n    /// @dev Only authorized addresses can invoke functions with this modifier.\n    modifier onlyAuthorized {\n        _assertSenderIsAuthorized();\n        _;\n    }\n\n    /// @dev Whether an adderss is authorized to call privileged functions.\n    /// @param 0 Address to query.\n    /// @return 0 Whether the address is authorized.\n    mapping (address => bool) public authorized;\n    /// @dev Whether an adderss is authorized to call privileged functions.\n    /// @param 0 Index of authorized address.\n    /// @return 0 Authorized address.\n    address[] public authorities;\n\n    /// @dev Initializes the `owner` address.\n    constructor()\n        public\n        Ownable()\n    {}\n\n    /// @dev Authorizes an address.\n    /// @param target Address to authorize.\n    function addAuthorizedAddress(address target)\n        external\n        onlyOwner\n    {\n        _addAuthorizedAddress(target);\n    }\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    function removeAuthorizedAddress(address target)\n        external\n        onlyOwner\n    {\n        if (!authorized[target]) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetNotAuthorizedError(target));\n        }\n        for (uint256 i = 0; i < authorities.length; i++) {\n            if (authorities[i] == target) {\n                _removeAuthorizedAddressAtIndex(target, i);\n                break;\n            }\n        }\n    }\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    /// @param index Index of target in authorities array.\n    function removeAuthorizedAddressAtIndex(\n        address target,\n        uint256 index\n    )\n        external\n        onlyOwner\n    {\n        _removeAuthorizedAddressAtIndex(target, index);\n    }\n\n    /// @dev Gets all authorized addresses.\n    /// @return Array of authorized addresses.\n    function getAuthorizedAddresses()\n        external\n        view\n        returns (address[] memory)\n    {\n        return authorities;\n    }\n\n    /// @dev Reverts if msg.sender is not authorized.\n    function _assertSenderIsAuthorized()\n        internal\n        view\n    {\n        if (!authorized[msg.sender]) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.SenderNotAuthorizedError(msg.sender));\n        }\n    }\n\n    /// @dev Authorizes an address.\n    /// @param target Address to authorize.\n    function _addAuthorizedAddress(address target)\n        internal\n    {\n        // Ensure that the target is not the zero address.\n        if (target == address(0)) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.ZeroCantBeAuthorizedError());\n        }\n\n        // Ensure that the target is not already authorized.\n        if (authorized[target]) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetAlreadyAuthorizedError(target));\n        }\n\n        authorized[target] = true;\n        authorities.push(target);\n        emit AuthorizedAddressAdded(target, msg.sender);\n    }\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    /// @param index Index of target in authorities array.\n    function _removeAuthorizedAddressAtIndex(\n        address target,\n        uint256 index\n    )\n        internal\n    {\n        if (!authorized[target]) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetNotAuthorizedError(target));\n        }\n        if (index >= authorities.length) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.IndexOutOfBoundsError(\n                index,\n                authorities.length\n            ));\n        }\n        if (authorities[index] != target) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.AuthorizedAddressMismatchError(\n                authorities[index],\n                target\n            ));\n        }\n\n        delete authorized[target];\n        authorities[index] = authorities[authorities.length - 1];\n        authorities.length -= 1;\n        emit AuthorizedAddressRemoved(target, msg.sender);\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/interfaces/IAuthorizable.sol": {
            "id": 79,
            "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 \"./IOwnable.sol\";\n\n\ncontract IAuthorizable is\n    IOwnable\n{\n    // Event logged when a new address is authorized.\n    event AuthorizedAddressAdded(\n        address indexed target,\n        address indexed caller\n    );\n\n    // Event logged when a currently authorized address is unauthorized.\n    event AuthorizedAddressRemoved(\n        address indexed target,\n        address indexed caller\n    );\n\n    /// @dev Authorizes an address.\n    /// @param target Address to authorize.\n    function addAuthorizedAddress(address target)\n        external;\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    function removeAuthorizedAddress(address target)\n        external;\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    /// @param index Index of target in authorities array.\n    function removeAuthorizedAddressAtIndex(\n        address target,\n        uint256 index\n    )\n        external;\n\n    /// @dev Gets all authorized addresses.\n    /// @return Array of authorized addresses.\n    function getAuthorizedAddresses()\n        external\n        view\n        returns (address[] memory);\n}\n"
        },
        "@0x/contracts-utils/contracts/src/IOwnable.sol": {
            "id": 80,
            "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 IOwnable {\n\n    /// @dev Emitted by Ownable when ownership is transferred.\n    /// @param previousOwner The previous owner of the contract.\n    /// @param newOwner The new owner of the contract.\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /// @dev Transfers ownership of the contract to a new address.\n    /// @param newOwner The address that will become the owner.\n    function transferOwnership(address newOwner)\n        public;\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibAuthorizableRichErrors.sol": {
            "id": 71,
            "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 LibAuthorizableRichErrors {\n\n    // bytes4(keccak256(\"AuthorizedAddressMismatchError(address,address)\"))\n    bytes4 internal constant AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR =\n        0x140a84db;\n\n    // bytes4(keccak256(\"IndexOutOfBoundsError(uint256,uint256)\"))\n    bytes4 internal constant INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR =\n        0xe9f83771;\n\n    // bytes4(keccak256(\"SenderNotAuthorizedError(address)\"))\n    bytes4 internal constant SENDER_NOT_AUTHORIZED_ERROR_SELECTOR =\n        0xb65a25b9;\n\n    // bytes4(keccak256(\"TargetAlreadyAuthorizedError(address)\"))\n    bytes4 internal constant TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR =\n        0xde16f1a0;\n\n    // bytes4(keccak256(\"TargetNotAuthorizedError(address)\"))\n    bytes4 internal constant TARGET_NOT_AUTHORIZED_ERROR_SELECTOR =\n        0xeb5108a2;\n\n    // bytes4(keccak256(\"ZeroCantBeAuthorizedError()\"))\n    bytes internal constant ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES =\n        hex\"57654fe4\";\n\n    // solhint-disable func-name-mixedcase\n    function AuthorizedAddressMismatchError(\n        address authorized,\n        address target\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR,\n            authorized,\n            target\n        );\n    }\n\n    function IndexOutOfBoundsError(\n        uint256 index,\n        uint256 length\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR,\n            index,\n            length\n        );\n    }\n\n    function SenderNotAuthorizedError(address sender)\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            SENDER_NOT_AUTHORIZED_ERROR_SELECTOR,\n            sender\n        );\n    }\n\n    function TargetAlreadyAuthorizedError(address target)\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR,\n            target\n        );\n    }\n\n    function TargetNotAuthorizedError(address target)\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            TARGET_NOT_AUTHORIZED_ERROR_SELECTOR,\n            target\n        );\n    }\n\n    function ZeroCantBeAuthorizedError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/Ownable.sol": {
            "id": 78,
            "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 \"./interfaces/IOwnable.sol\";\nimport \"./LibOwnableRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\ncontract Ownable is\n    IOwnable\n{\n    /// @dev The owner of this contract.\n    /// @return 0 The owner address.\n    address public owner;\n\n    constructor ()\n        public\n    {\n        owner = msg.sender;\n    }\n\n    modifier onlyOwner() {\n        _assertSenderIsOwner();\n        _;\n    }\n\n    /// @dev Change the owner of this contract.\n    /// @param newOwner New owner address.\n    function transferOwnership(address newOwner)\n        public\n        onlyOwner\n    {\n        if (newOwner == address(0)) {\n            LibRichErrors.rrevert(LibOwnableRichErrors.TransferOwnerToZeroError());\n        } else {\n            owner = newOwner;\n            emit OwnershipTransferred(msg.sender, newOwner);\n        }\n    }\n\n    function _assertSenderIsOwner()\n        internal\n        view\n    {\n        if (msg.sender != owner) {\n            LibRichErrors.rrevert(LibOwnableRichErrors.OnlyOwnerError(\n                msg.sender,\n                owner\n            ));\n        }\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/interfaces/IOwnable.sol": {
            "id": 80,
            "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 IOwnable {\n\n    /// @dev Emitted by Ownable when ownership is transferred.\n    /// @param previousOwner The previous owner of the contract.\n    /// @param newOwner The new owner of the contract.\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /// @dev Transfers ownership of the contract to a new address.\n    /// @param newOwner The address that will become the owner.\n    function transferOwnership(address newOwner)\n        public;\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibOwnableRichErrors.sol": {
            "id": 74,
            "content": "pragma solidity ^0.5.9;\n\n\nlibrary LibOwnableRichErrors {\n\n    // bytes4(keccak256(\"OnlyOwnerError(address,address)\"))\n    bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR =\n        0x1de45ad1;\n\n    // bytes4(keccak256(\"TransferOwnerToZeroError()\"))\n    bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES =\n        hex\"e69edc3e\";\n\n    // solhint-disable func-name-mixedcase\n    function OnlyOwnerError(\n        address sender,\n        address owner\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            ONLY_OWNER_ERROR_SELECTOR,\n            sender,\n            owner\n        );\n    }\n\n    function TransferOwnerToZeroError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES;\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"
        },
        "./interfaces/IAssetProxy.sol": {
            "id": 30,
            "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 IAssetProxy {\n\n    /// @dev Transfers assets. Either succeeds or throws.\n    /// @param assetData Byte array encoded for the respective asset proxy.\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    function transferFrom(\n        bytes calldata assetData,\n        address from,\n        address to,\n        uint256 amount\n    )\n        external;\n    \n    /// @dev Gets the proxy id associated with the proxy address.\n    /// @return Proxy id.\n    function getProxyId()\n        external\n        pure\n        returns (bytes4);\n}\n"
        },
        "./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"
        }
    },
    "sourceCodes": {
        "./ERC20BridgeProxy.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/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/Authorizable.sol\";\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"./interfaces/IAssetProxy.sol\";\nimport \"./interfaces/IERC20Bridge.sol\";\n\n\ncontract ERC20BridgeProxy is\n    IAssetProxy,\n    Authorizable\n{\n    using LibBytes for bytes;\n    using LibSafeMath for uint256;\n\n    // @dev Id of this proxy. Also the result of a successful bridge call.\n    //      bytes4(keccak256(\"ERC20Bridge(address,address,bytes)\"))\n    bytes4 constant private PROXY_ID = 0xdc1600f3;\n\n    /// @dev Calls a bridge contract to transfer `amount` of ERC20 from `from`\n    ///      to `to`. Asserts that the balance of `to` has increased by `amount`.\n    /// @param assetData Abi-encoded data for this asset proxy encoded as:\n    ///          abi.encodeWithSelector(\n    ///             bytes4 PROXY_ID,\n    ///             address tokenAddress,\n    ///             address bridgeAddress,\n    ///             bytes bridgeData\n    ///          )\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    function transferFrom(\n        bytes calldata assetData,\n        address from,\n        address to,\n        uint256 amount\n    )\n        external\n        onlyAuthorized\n    {\n        // Extract asset data fields.\n        (\n            address tokenAddress,\n            address bridgeAddress,\n            bytes memory bridgeData\n        ) = abi.decode(\n            assetData.sliceDestructive(4, assetData.length),\n            (address, address, bytes)\n        );\n\n        // Remember the balance of `to` before calling the bridge.\n        uint256 balanceBefore = balanceOf(tokenAddress, to);\n        // Call the bridge, who should transfer `amount` of `tokenAddress` to\n        // `to`.\n        bytes4 success = IERC20Bridge(bridgeAddress).bridgeTransferFrom(\n            tokenAddress,\n            from,\n            to,\n            amount,\n            bridgeData\n        );\n        // Bridge must return the proxy ID to indicate success.\n        require(success == PROXY_ID, \"BRIDGE_FAILED\");\n        // Ensure that the balance of `to` has increased by at least `amount`.\n        require(\n            balanceBefore.safeAdd(amount) <= balanceOf(tokenAddress, to),\n            \"BRIDGE_UNDERPAY\"\n        );\n    }\n\n    /// @dev Gets the proxy id associated with this asset proxy.\n    /// @return proxyId The proxy id.\n    function getProxyId()\n        external\n        pure\n        returns (bytes4 proxyId)\n    {\n        return PROXY_ID;\n    }\n\n    /// @dev Retrieves the balance of `owner` for this asset.\n    /// @return balance The balance of the ERC20 token being transferred by this\n    ///         asset proxy.\n    function balanceOf(bytes calldata assetData, address owner)\n        external\n        view\n        returns (uint256 balance)\n    {\n        (address tokenAddress) = abi.decode(\n            assetData.sliceDestructive(4, assetData.length),\n            (address)\n        );\n        return balanceOf(tokenAddress, owner);\n    }\n\n    /// @dev Retrieves the balance of `owner` given an ERC20 address.\n    /// @return balance The balance of the ERC20 token for `owner`.\n    function balanceOf(address tokenAddress, address owner)\n        private\n        view\n        returns (uint256 balance)\n    {\n        return IERC20Token(tokenAddress).balanceOf(owner);\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibBytes.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 \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n    using LibBytes for bytes;\n\n    /// @dev Gets the memory address for a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of byte array. This\n    ///         points to the header of the byte array which contains\n    ///         the length.\n    function rawAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := input\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Gets the memory address for the contents of a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of the contents of the byte array.\n    function contentAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := add(input, 32)\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Copies `length` bytes from memory location `source` to `dest`.\n    /// @param dest memory address to copy bytes to.\n    /// @param source memory address to copy bytes from.\n    /// @param length number of bytes to copy.\n    function memCopy(\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        internal\n        pure\n    {\n        if (length < 32) {\n            // Handle a partial word by reading destination and masking\n            // off the bits we are interested in.\n            // This correctly handles overlap, zero lengths and source == dest\n            assembly {\n                let mask := sub(exp(256, sub(32, length)), 1)\n                let s := and(mload(source), not(mask))\n                let d := and(mload(dest), mask)\n                mstore(dest, or(s, d))\n            }\n        } else {\n            // Skip the O(length) loop when source == dest.\n            if (source == dest) {\n                return;\n            }\n\n            // For large copies we copy whole words at a time. The final\n            // word is aligned to the end of the range (instead of after the\n            // previous) to handle partial words. So a copy will look like this:\n            //\n            //  ####\n            //      ####\n            //          ####\n            //            ####\n            //\n            // We handle overlap in the source and destination range by\n            // changing the copying direction. This prevents us from\n            // overwriting parts of source that we still need to copy.\n            //\n            // This correctly handles source == dest\n            //\n            if (source > dest) {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because it\n                    // is easier to compare with in the loop, and these\n                    // are also the addresses we need for copying the\n                    // last bytes.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the last 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the last bytes in\n                    // source already due to overlap.\n                    let last := mload(sEnd)\n\n                    // Copy whole words front to back\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} lt(source, sEnd) {} {\n                        mstore(dest, mload(source))\n                        source := add(source, 32)\n                        dest := add(dest, 32)\n                    }\n\n                    // Write the last 32 bytes\n                    mstore(dEnd, last)\n                }\n            } else {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because those\n                    // are the starting points when copying a word at the end.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the first 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the first bytes in\n                    // source already due to overlap.\n                    let first := mload(source)\n\n                    // Copy whole words back to front\n                    // We use a signed comparisson here to allow dEnd to become\n                    // negative (happens when source and dest < 32). Valid\n                    // addresses in local memory will never be larger than\n                    // 2**255, so they can be safely re-interpreted as signed.\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} slt(dest, dEnd) {} {\n                        mstore(dEnd, mload(sEnd))\n                        sEnd := sub(sEnd, 32)\n                        dEnd := sub(dEnd, 32)\n                    }\n\n                    // Write the first 32 bytes\n                    mstore(dest, first)\n                }\n            }\n        }\n    }\n\n    /// @dev Returns a slices from a byte array.\n    /// @param b The byte array to take a slice from.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    function slice(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure and copy contents\n        result = new bytes(to - from);\n        memCopy(\n            result.contentAddress(),\n            b.contentAddress() + from,\n            result.length\n        );\n        return result;\n    }\n\n    /// @dev Returns a slice from a byte array without preserving the input.\n    /// @param b The byte array to take a slice from. Will be destroyed in the process.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n    function sliceDestructive(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure around [from, to) in-place.\n        assembly {\n            result := add(b, from)\n            mstore(result, sub(to, from))\n        }\n        return result;\n    }\n\n    /// @dev Pops the last byte off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The byte that was popped off.\n    function popLastByte(bytes memory b)\n        internal\n        pure\n        returns (bytes1 result)\n    {\n        if (b.length == 0) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n                b.length,\n                0\n            ));\n        }\n\n        // Store last byte.\n        result = b[b.length - 1];\n\n        assembly {\n            // Decrement length of byte array.\n            let newLen := sub(mload(b), 1)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Tests equality of two byte arrays.\n    /// @param lhs First byte array to compare.\n    /// @param rhs Second byte array to compare.\n    /// @return True if arrays are the same. False otherwise.\n    function equals(\n        bytes memory lhs,\n        bytes memory rhs\n    )\n        internal\n        pure\n        returns (bool equal)\n    {\n        // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n        // We early exit on unequal lengths, but keccak would also correctly\n        // handle this.\n        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n    }\n\n    /// @dev Reads an address from a position in a byte array.\n    /// @param b Byte array containing an address.\n    /// @param index Index in byte array of address.\n    /// @return address from byte array.\n    function readAddress(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (address result)\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Read address from array memory\n        assembly {\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 20-byte mask to obtain address\n            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    /// @dev Writes an address into a specific position in a byte array.\n    /// @param b Byte array to insert address into.\n    /// @param index Index in byte array of address.\n    /// @param input Address to put into byte array.\n    function writeAddress(\n        bytes memory b,\n        uint256 index,\n        address input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Store address into array memory\n        assembly {\n            // The address occupies 20 bytes and mstore stores 32 bytes.\n            // First fetch the 32-byte word where we'll be storing the address, then\n            // apply a mask so we have only the bytes in the word that the address will not occupy.\n            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n            let neighbors := and(\n                mload(add(b, index)),\n                0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n            )\n\n            // Make sure input address is clean.\n            // (Solidity does not guarantee this)\n            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n            // Store the neighbors and address into memory\n            mstore(add(b, index), xor(input, neighbors))\n        }\n    }\n\n    /// @dev Reads a bytes32 value from a position in a byte array.\n    /// @param b Byte array containing a bytes32 value.\n    /// @param index Index in byte array of bytes32 value.\n    /// @return bytes32 value from byte array.\n    function readBytes32(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            result := mload(add(b, index))\n        }\n        return result;\n    }\n\n    /// @dev Writes a bytes32 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            mstore(add(b, index), input)\n        }\n    }\n\n    /// @dev Reads a uint256 value from a position in a byte array.\n    /// @param b Byte array containing a uint256 value.\n    /// @param index Index in byte array of uint256 value.\n    /// @return uint256 value from byte array.\n    function readUint256(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (uint256 result)\n    {\n        result = uint256(readBytes32(b, index));\n        return result;\n    }\n\n    /// @dev Writes a uint256 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input\n    )\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n\n    /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n    /// @param b Byte array containing a bytes4 value.\n    /// @param index Index in byte array of bytes4 value.\n    /// @return bytes4 value from byte array.\n    function readBytes4(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes4 result)\n    {\n        if (b.length < index + 4) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n                b.length,\n                index + 4\n            ));\n        }\n\n        // Arrays are prefixed by a 32 byte length field\n        index += 32;\n\n        // Read the bytes4 from array memory\n        assembly {\n            result := mload(add(b, index))\n            // Solidity does not require us to clean the trailing bytes.\n            // We do it anyway\n            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n        }\n        return result;\n    }\n\n    /// @dev Writes a new length to a byte array.\n    ///      Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n    ///      Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n    /// @param b Bytes array to write new length to.\n    /// @param length New length of byte array.\n    function writeLength(bytes memory b, uint256 length)\n        internal\n        pure\n    {\n        assembly {\n            mstore(b, length)\n        }\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibBytesRichErrors.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 LibBytesRichErrors {\n\n    enum InvalidByteOperationErrorCodes {\n        FromLessThanOrEqualsToRequired,\n        ToLessThanOrEqualsLengthRequired,\n        LengthGreaterThanZeroRequired,\n        LengthGreaterThanOrEqualsFourRequired,\n        LengthGreaterThanOrEqualsTwentyRequired,\n        LengthGreaterThanOrEqualsThirtyTwoRequired,\n        LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n        DestinationLengthGreaterThanOrEqualSourceLengthRequired\n    }\n\n    // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n        0x28006595;\n\n    // solhint-disable func-name-mixedcase\n    function InvalidByteOperationError(\n        InvalidByteOperationErrorCodes errorCode,\n        uint256 offset,\n        uint256 required\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n            errorCode,\n            offset,\n            required\n        );\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/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/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-utils/contracts/src/Authorizable.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 \"./interfaces/IAuthorizable.sol\";\nimport \"./LibAuthorizableRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\nimport \"./Ownable.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Authorizable is\n    Ownable,\n    IAuthorizable\n{\n    /// @dev Only authorized addresses can invoke functions with this modifier.\n    modifier onlyAuthorized {\n        _assertSenderIsAuthorized();\n        _;\n    }\n\n    /// @dev Whether an adderss is authorized to call privileged functions.\n    /// @param 0 Address to query.\n    /// @return 0 Whether the address is authorized.\n    mapping (address => bool) public authorized;\n    /// @dev Whether an adderss is authorized to call privileged functions.\n    /// @param 0 Index of authorized address.\n    /// @return 0 Authorized address.\n    address[] public authorities;\n\n    /// @dev Initializes the `owner` address.\n    constructor()\n        public\n        Ownable()\n    {}\n\n    /// @dev Authorizes an address.\n    /// @param target Address to authorize.\n    function addAuthorizedAddress(address target)\n        external\n        onlyOwner\n    {\n        _addAuthorizedAddress(target);\n    }\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    function removeAuthorizedAddress(address target)\n        external\n        onlyOwner\n    {\n        if (!authorized[target]) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetNotAuthorizedError(target));\n        }\n        for (uint256 i = 0; i < authorities.length; i++) {\n            if (authorities[i] == target) {\n                _removeAuthorizedAddressAtIndex(target, i);\n                break;\n            }\n        }\n    }\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    /// @param index Index of target in authorities array.\n    function removeAuthorizedAddressAtIndex(\n        address target,\n        uint256 index\n    )\n        external\n        onlyOwner\n    {\n        _removeAuthorizedAddressAtIndex(target, index);\n    }\n\n    /// @dev Gets all authorized addresses.\n    /// @return Array of authorized addresses.\n    function getAuthorizedAddresses()\n        external\n        view\n        returns (address[] memory)\n    {\n        return authorities;\n    }\n\n    /// @dev Reverts if msg.sender is not authorized.\n    function _assertSenderIsAuthorized()\n        internal\n        view\n    {\n        if (!authorized[msg.sender]) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.SenderNotAuthorizedError(msg.sender));\n        }\n    }\n\n    /// @dev Authorizes an address.\n    /// @param target Address to authorize.\n    function _addAuthorizedAddress(address target)\n        internal\n    {\n        // Ensure that the target is not the zero address.\n        if (target == address(0)) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.ZeroCantBeAuthorizedError());\n        }\n\n        // Ensure that the target is not already authorized.\n        if (authorized[target]) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetAlreadyAuthorizedError(target));\n        }\n\n        authorized[target] = true;\n        authorities.push(target);\n        emit AuthorizedAddressAdded(target, msg.sender);\n    }\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    /// @param index Index of target in authorities array.\n    function _removeAuthorizedAddressAtIndex(\n        address target,\n        uint256 index\n    )\n        internal\n    {\n        if (!authorized[target]) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.TargetNotAuthorizedError(target));\n        }\n        if (index >= authorities.length) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.IndexOutOfBoundsError(\n                index,\n                authorities.length\n            ));\n        }\n        if (authorities[index] != target) {\n            LibRichErrors.rrevert(LibAuthorizableRichErrors.AuthorizedAddressMismatchError(\n                authorities[index],\n                target\n            ));\n        }\n\n        delete authorized[target];\n        authorities[index] = authorities[authorities.length - 1];\n        authorities.length -= 1;\n        emit AuthorizedAddressRemoved(target, msg.sender);\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/interfaces/IAuthorizable.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 \"./IOwnable.sol\";\n\n\ncontract IAuthorizable is\n    IOwnable\n{\n    // Event logged when a new address is authorized.\n    event AuthorizedAddressAdded(\n        address indexed target,\n        address indexed caller\n    );\n\n    // Event logged when a currently authorized address is unauthorized.\n    event AuthorizedAddressRemoved(\n        address indexed target,\n        address indexed caller\n    );\n\n    /// @dev Authorizes an address.\n    /// @param target Address to authorize.\n    function addAuthorizedAddress(address target)\n        external;\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    function removeAuthorizedAddress(address target)\n        external;\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    /// @param index Index of target in authorities array.\n    function removeAuthorizedAddressAtIndex(\n        address target,\n        uint256 index\n    )\n        external;\n\n    /// @dev Gets all authorized addresses.\n    /// @return Array of authorized addresses.\n    function getAuthorizedAddresses()\n        external\n        view\n        returns (address[] memory);\n}\n",
        "@0x/contracts-utils/contracts/src/IOwnable.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 IOwnable {\n\n    /// @dev Emitted by Ownable when ownership is transferred.\n    /// @param previousOwner The previous owner of the contract.\n    /// @param newOwner The new owner of the contract.\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /// @dev Transfers ownership of the contract to a new address.\n    /// @param newOwner The address that will become the owner.\n    function transferOwnership(address newOwner)\n        public;\n}\n",
        "@0x/contracts-utils/contracts/src/LibAuthorizableRichErrors.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 LibAuthorizableRichErrors {\n\n    // bytes4(keccak256(\"AuthorizedAddressMismatchError(address,address)\"))\n    bytes4 internal constant AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR =\n        0x140a84db;\n\n    // bytes4(keccak256(\"IndexOutOfBoundsError(uint256,uint256)\"))\n    bytes4 internal constant INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR =\n        0xe9f83771;\n\n    // bytes4(keccak256(\"SenderNotAuthorizedError(address)\"))\n    bytes4 internal constant SENDER_NOT_AUTHORIZED_ERROR_SELECTOR =\n        0xb65a25b9;\n\n    // bytes4(keccak256(\"TargetAlreadyAuthorizedError(address)\"))\n    bytes4 internal constant TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR =\n        0xde16f1a0;\n\n    // bytes4(keccak256(\"TargetNotAuthorizedError(address)\"))\n    bytes4 internal constant TARGET_NOT_AUTHORIZED_ERROR_SELECTOR =\n        0xeb5108a2;\n\n    // bytes4(keccak256(\"ZeroCantBeAuthorizedError()\"))\n    bytes internal constant ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES =\n        hex\"57654fe4\";\n\n    // solhint-disable func-name-mixedcase\n    function AuthorizedAddressMismatchError(\n        address authorized,\n        address target\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR,\n            authorized,\n            target\n        );\n    }\n\n    function IndexOutOfBoundsError(\n        uint256 index,\n        uint256 length\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR,\n            index,\n            length\n        );\n    }\n\n    function SenderNotAuthorizedError(address sender)\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            SENDER_NOT_AUTHORIZED_ERROR_SELECTOR,\n            sender\n        );\n    }\n\n    function TargetAlreadyAuthorizedError(address target)\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR,\n            target\n        );\n    }\n\n    function TargetNotAuthorizedError(address target)\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            TARGET_NOT_AUTHORIZED_ERROR_SELECTOR,\n            target\n        );\n    }\n\n    function ZeroCantBeAuthorizedError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/Ownable.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 \"./interfaces/IOwnable.sol\";\nimport \"./LibOwnableRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\ncontract Ownable is\n    IOwnable\n{\n    /// @dev The owner of this contract.\n    /// @return 0 The owner address.\n    address public owner;\n\n    constructor ()\n        public\n    {\n        owner = msg.sender;\n    }\n\n    modifier onlyOwner() {\n        _assertSenderIsOwner();\n        _;\n    }\n\n    /// @dev Change the owner of this contract.\n    /// @param newOwner New owner address.\n    function transferOwnership(address newOwner)\n        public\n        onlyOwner\n    {\n        if (newOwner == address(0)) {\n            LibRichErrors.rrevert(LibOwnableRichErrors.TransferOwnerToZeroError());\n        } else {\n            owner = newOwner;\n            emit OwnershipTransferred(msg.sender, newOwner);\n        }\n    }\n\n    function _assertSenderIsOwner()\n        internal\n        view\n    {\n        if (msg.sender != owner) {\n            LibRichErrors.rrevert(LibOwnableRichErrors.OnlyOwnerError(\n                msg.sender,\n                owner\n            ));\n        }\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/interfaces/IOwnable.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 IOwnable {\n\n    /// @dev Emitted by Ownable when ownership is transferred.\n    /// @param previousOwner The previous owner of the contract.\n    /// @param newOwner The new owner of the contract.\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /// @dev Transfers ownership of the contract to a new address.\n    /// @param newOwner The address that will become the owner.\n    function transferOwnership(address newOwner)\n        public;\n}\n",
        "@0x/contracts-utils/contracts/src/LibOwnableRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibOwnableRichErrors {\n\n    // bytes4(keccak256(\"OnlyOwnerError(address,address)\"))\n    bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR =\n        0x1de45ad1;\n\n    // bytes4(keccak256(\"TransferOwnerToZeroError()\"))\n    bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES =\n        hex\"e69edc3e\";\n\n    // solhint-disable func-name-mixedcase\n    function OnlyOwnerError(\n        address sender,\n        address owner\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            ONLY_OWNER_ERROR_SELECTOR,\n            sender,\n            owner\n        );\n    }\n\n    function TransferOwnerToZeroError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES;\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",
        "./interfaces/IAssetProxy.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 IAssetProxy {\n\n    /// @dev Transfers assets. Either succeeds or throws.\n    /// @param assetData Byte array encoded for the respective asset proxy.\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    function transferFrom(\n        bytes calldata assetData,\n        address from,\n        address to,\n        uint256 amount\n    )\n        external;\n    \n    /// @dev Gets the proxy id associated with the proxy address.\n    /// @return Proxy id.\n    function getProxyId()\n        external\n        pure\n        returns (bytes4);\n}\n",
        "./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"
    },
    "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": {}
}
