[ { "inputs": [], "stateMutability": "payable", "type": "constructor" }, { "inputs": [], "name": "AlreadyLinked", "type": "error" }, { "inputs": [], "name": "CannotLink", "type": "error" }, { "inputs": [], "name": "EmptyNFTIds", "type": "error" }, { "inputs": [], "name": "InvalidIdInRange", "type": "error" }, { "inputs": [], "name": "NotLinked", "type": "error" }, { "inputs": [], "name": "Reentrancy", "type": "error" }, { "inputs": [], "name": "SenderNotBase", "type": "error" }, { "inputs": [], "name": "SenderNotDeployer", "type": "error" }, { "inputs": [], "name": "TransferToNonERC721ReceiverImplementer", "type": "error" }, { "inputs": [], "name": "Unauthorized", "type": "error" }, { "inputs": [], "name": "UnauthorizedCallContext", "type": "error" }, { "inputs": [], "name": "UpgradeFailed", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "isApproved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "price", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "bidToken", "type": "address" } ], "name": "Bid", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "price", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "token", "type": "address" }, { "indexed": false, "internalType": "address", "name": "maker", "type": "address" } ], "name": "Bought", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" } ], "name": "CancelBid", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" } ], "name": "CancelOffer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "idX", "type": "uint256" }, { "indexed": true, "internalType": "uint256", "name": "idY", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "exchangeFee", "type": "uint256" } ], "name": "Exchange", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "minPrice", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "offerToken", "type": "address" } ], "name": "Offer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "oldOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "lockStatus", "type": "bool" } ], "name": "UpdateLockState", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "implementation", "type": "address" } ], "name": "Upgraded", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [ { "components": [ { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "price", "type": "uint256" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "address", "name": "trader", "type": "address" } ], "internalType": "struct BT404Mirror.NFTOrder[]", "name": "orders", "type": "tuple[]" } ], "name": "acceptBid", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "price", "type": "uint256" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "address", "name": "trader", "type": "address" } ], "internalType": "struct BT404Mirror.NFTOrder[]", "name": "orders", "type": "tuple[]" } ], "name": "acceptOffer", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "nftOwner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "result", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "baseERC20", "outputs": [ { "internalType": "address", "name": "base", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "baseERC721", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "price", "type": "uint256" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "address", "name": "trader", "type": "address" } ], "internalType": "struct BT404Mirror.NFTOrder[]", "name": "orders", "type": "tuple[]" } ], "name": "bidForBuy", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" } ], "name": "cancelBid", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" } ], "name": "cancelOffer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "idX", "type": "uint256" }, { "internalType": "uint256", "name": "idY", "type": "uint256" } ], "name": "exchange", "outputs": [ { "internalType": "uint256", "name": "exchangeFee", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "getApproved", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_baseERC721", "type": "address" }, { "internalType": "uint256", "name": "_startBaseId", "type": "uint256" }, { "internalType": "uint256", "name": "_endBaseId", "type": "uint256" } ], "name": "initialize", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "nftOwner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "result", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "begin", "type": "uint256" }, { "internalType": "uint256", "name": "end", "type": "uint256" } ], "name": "lockedIds", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "result", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "price", "type": "uint256" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "address", "name": "trader", "type": "address" } ], "internalType": "struct BT404Mirror.NFTOrder[]", "name": "orders", "type": "tuple[]" } ], "name": "offerForSale", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "onERC721Received", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "begin", "type": "uint256" }, { "internalType": "uint256", "name": "end", "type": "uint256" } ], "name": "ownedIds", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "ownerAt", "outputs": [ { "internalType": "address", "name": "result", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "ownerOf", "outputs": [ { "internalType": "address", "name": "result", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "proxiableUUID", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pullOwner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "result", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "result", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenURI", "outputs": [ { "internalType": "string", "name": "result", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "result", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "transferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" } ], "name": "unwrapBatch", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "internalType": "bool", "name": "lock", "type": "bool" } ], "name": "updateLockState", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newImplementation", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "upgradeToAndCall", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" } ], "name": "wrapBatch", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "internalType": "bool", "name": "lock", "type": "bool" } ], "name": "wrapBatch", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ]
60a060405230608052683602298b8c10b01231805460016001600160a01b0319918216338316178117909255682ab3f28a60db472ee6805490911690911790555f682ab3f28a60db472ee7819055682ab3f28a60db472ee85560805161286e6100775f395f8181610ecd0152610fae015261286e5ff3fe608060405260043610610252575f3560e01c8063680a9f1f11610137578063a444be1f116100af578063c87b56dd1161007e578063d4b7eac311610063578063d4b7eac3146108ec578063e5583c0f1461090b578063e985e9c51461092a57610259565b8063c87b56dd146108ae578063ccf0e515146108cd57610259565b8063a444be1f1461083e578063b313f05a14610851578063b88d4fde14610870578063bf598e1e1461088f57610259565b80637ec824181161010657806395d89b41116100eb57806395d89b41146107f757806397e5311c1461080b578063a22cb4651461081f57610259565b80637ec82418146107b35780638da5cb5b146107d257610259565b8063680a9f1f146107415780636cef16e61461076d57806370a08231146107815780637a1ac61e146107a057610259565b806324359879116101ca5780634ae9617c1161019957806352d1902d1161017e57806352d1902d146106ef578063616b95e8146107035780636352211e1461072257610259565b80634ae9617c146106bd5780634f1ef286146106dc57610259565b8063243598791461064d57806325d4fe1a1461066c57806342842e0e1461068b578063442f085d146106aa57610259565b8063095ea7b311610221578063150b7a0211610206578063150b7a021461059857806318160ddd1461060c57806323b872dd1461062e57610259565b8063095ea7b31461055a57806312553e201461057957610259565b806301ffc9a71461048c57806306fdde03146104dd578063081812fc146104fe57806308b327421461053557610259565b3661025957005b683602298b8c10b012305f3560e01c63263c69d681900361031e5781546001600160a01b0316331461029e57604051631b1e598960e11b815260040160405180910390fd5b602036103d5f3e6004356024018036103d5f3e602081033560051b81018036103d5f3e5b8082146103135781358060601c816001168260a01b60a81c811583028284027fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a45050508160200191506102c2565b505060015f5260205ff35b8063144027d3036103b15781546001600160a01b0316331461035357604051631b1e598960e11b815260040160405180910390fd5b600435602435604435602401602081033560051b81015b8082146103a457813583857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a481602001915061036a565b5050505060015f5260205ff35b80630f4599e50361048a5760018201546001600160a01b0316156104205760018201546001600160a01b03166004356001600160a01b031614610420576040517fc59ec47a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546001600160a01b031615610462576040517fbf656a4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815473ffffffffffffffffffffffffffffffffffffffff19163317825560015f908152602090f35b005b348015610497575f80fd5b506104c86104a6366004612079565b6301ffc9a760e09190911c9081146380ac58cd821417635b5e139f9091141790565b60405190151581526020015b60405180910390f35b3480156104e8575f80fd5b506104f1610949565b6040516104d491906120b8565b348015610509575f80fd5b5061051d6105183660046120ed565b61095e565b6040516001600160a01b0390911681526020016104d4565b348015610540575f80fd5b50682ab3f28a60db472ee6546001600160a01b031661051d565b348015610565575f80fd5b5061048a61057436600461211f565b610974565b348015610584575f80fd5b5061048a610593366004612242565b6109f4565b3480156105a3575f80fd5b506105db6105b236600461229b565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016104d4565b348015610617575f80fd5b50610620610a01565b6040519081526020016104d4565b348015610639575f80fd5b5061048a61064836600461233a565b610a11565b348015610658575f80fd5b5061051d6106673660046120ed565b610af2565b348015610677575f80fd5b5061048a610686366004612242565b610b02565b348015610696575f80fd5b5061048a6106a536600461233a565b610bfc565b61048a6106b8366004612374565b610c2d565b3480156106c8575f80fd5b5061048a6106d7366004612374565b610d7c565b61048a6106ea366004612492565b610ecb565b3480156106fa575f80fd5b50610620610fab565b34801561070e575f80fd5b5061048a61071d366004612242565b611008565b34801561072d575f80fd5b5061051d61073c3660046120ed565b6110f2565b34801561074c575f80fd5b5061076061075b3660046124e1565b611102565b6040516104d4919061254b565b348015610778575f80fd5b5061048a611119565b34801561078c575f80fd5b5061062061079b36600461255d565b6111d4565b61048a6107ae3660046124e1565b6111ed565b3480156107be575f80fd5b5061048a6107cd366004612583565b611282565b3480156107dd575f80fd5b50683602298b8c10b01232546001600160a01b031661051d565b348015610802575f80fd5b506104f16113c6565b348015610816575f80fd5b5061051d6113d6565b34801561082a575f80fd5b5061048a6108393660046125d2565b611424565b61048a61084c366004612374565b6114a1565b34801561085c575f80fd5b5061048a61086b366004612583565b611595565b34801561087b575f80fd5b5061048a61088a3660046125fc565b611815565b34801561089a575f80fd5b506107606108a93660046124e1565b611868565b3480156108b9575f80fd5b506104f16108c83660046120ed565b611876565b3480156108d8575f80fd5b5061048a6108e7366004612374565b611956565b3480156108f7575f80fd5b50610620610906366004612666565b611a4e565b348015610916575f80fd5b5061048a610925366004612242565b611b49565b348015610935575f80fd5b506104c8610944366004612686565b611d68565b60606109596306fdde035f611d93565b905090565b5f61096e63081812fc835f611de9565b92915050565b5f61097d6113d6565b90508260601b60601c925060405163d10b6e0c5f5283602052826040523360605260205f6064601c34865af1601f3d11166109ba573d5f823e3d81fd5b80604052505f6060528183600c5160601c7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f38a4505050565b6109fe815f611595565b50565b5f61095963e2c792815f80611de9565b5f610a1a6113d6565b90508360601b60601c93508260601b60601c925060405163e5eb36c881528460208201528360408201528260608201523360808201526020816084601c840134865af1600182511416610a6f573d5f823e3d81fd5b5f815282857fcc3a1bd7e528af8582cd3578d82ae22e309de7c3663c9d0fa5b5ce79c1a346ac602084a38284867fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a46001815282847fcc3a1bd7e528af8582cd3578d82ae22e309de7c3663c9d0fa5b5ce79c1a346ac602084a35050505050565b5f61096e6324359879835f611de9565b683602298b8c10b012308054600160a01b900460ff1615610b365760405163558a1e0360e11b815260040160405180910390fd5b805460ff60a01b1916600160a01b178155604051610ba690610b5e90339085906024016126b7565b60408051601f198184030181529190526020810180516001600160e01b03167f2da2a85900000000000000000000000000000000000000000000000000000000179052611e2c565b5060208201825160051b81015b808214610bec573382517fc4caef7e3533865382e608c341581a5e2a1b0d1ac37b0aaf58023ccd4eedfd8e5f38a3602082019150610bb3565b5050805460ff60a01b1916905550565b610c07838383610a11565b813b15610c2857610c2883838360405180602001604052805f815250611e6a565b505050565b683602298b8c10b012308054600160a01b900460ff1615610c615760405163558a1e0360e11b815260040160405180910390fd5b805460ff60a01b1916600160a01b178155604051610cd190610c8990339085906024016126d8565b60408051601f198184030181529190526020810180516001600160e01b03167f53ffa07100000000000000000000000000000000000000000000000000000000179052611e2c565b50815160051b6020018201825160800281015b808214610bec57606082015160015f52825133827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a48251337fcc3a1bd7e528af8582cd3578d82ae22e309de7c3663c9d0fa5b5ce79c1a346ac60205fa3338184517fd9882bc1ac8e78c918b907fa0ff79cc9d866091c5eb450ebed79e9d147541d5b606060208801a450608082019150610ce4565b683602298b8c10b012308054600160a01b900460ff1615610db05760405163558a1e0360e11b815260040160405180910390fd5b805460ff60a01b1916600160a01b178155604051610e2090610dd890339085906024016126d8565b60408051601f198184030181529190526020810180516001600160e01b03167fb6ebe10300000000000000000000000000000000000000000000000000000000179052611e2c565b50815160051b6020018201825160800281015b808214610bec57606082015160015f52825181337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a48251817fcc3a1bd7e528af8582cd3578d82ae22e309de7c3663c9d0fa5b5ce79c1a346ac60205fa3803384517fd9882bc1ac8e78c918b907fa0ff79cc9d866091c5eb450ebed79e9d147541d5b606060208801a450608082019150610e33565b7f0000000000000000000000000000000000000000000000000000000000000000308103610f0057639f03a0265f526004601cfd5b610f0984611eeb565b8360601b60601c93506352d1902d6001527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80602060016004601d895afa5114610f5b576355299b496001526004601dfd5b847fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f38a28490558115610fa557604051828482375f388483885af4610fa3573d5f823e3d81fd5b505b50505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000308114610fe157639f03a0265f526004601cfd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc91505090565b683602298b8c10b012308054600160a01b900460ff161561103c5760405163558a1e0360e11b815260040160405180910390fd5b805460ff60a01b1916600160a01b1781556040516110ac9061106490339085906024016126b7565b60408051601f198184030181529190526020810180516001600160e01b03167fa38beee100000000000000000000000000000000000000000000000000000000179052611e2c565b5060208201825160051b81015b808214610bec573382517f874afcdd5e90b2329b3c1601e613dcdc6abb6deb62ce61339a8337b48c053e515f38a36020820191506110b9565b5f61096e636352211e835f611de9565b60606111118484846001611ef3565b949350505050565b5f806111236113d6565b9050638da5cb5b5f5260205f6004601c845afa601f3d11161561114957600c5160601c91505b683602298b8c10b0123254683602298b8c10b01230906001600160a01b039081169084168114610fa55760028201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925560405190918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350505050565b5f61096e63f5b100ea836001600160a01b03165f611de9565b683602298b8c10b01231546001600160a01b03161561121e576040516282b42960e81b815260040160405180910390fd5b683602298b8c10b0123180543373ffffffffffffffffffffffffffffffffffffffff1991821617909155682ab3f28a60db472ee680549091166001600160a01b039490941693909317909255682ab3f28a60db472ee755682ab3f28a60db472ee855565b5f61128b6113d6565b90505f80826001600160a01b0316846112a4575f6112a7565b60015b60ff166060336001600160a01b0316901b17866040516024016112cb929190612766565b60408051601f198184030181529181526020820180516001600160e01b03167fb79cc1bd0000000000000000000000000000000000000000000000000000000017905251611319919061277e565b5f604051808303815f865af19150503d805f8114611352576040519150601f19603f3d011682016040523d82523d5f602084013e611357565b606091505b50915091508160016020830151141661137257805160208201fd5b8451845f52602086018160051b81015b8082146113bc578151337fcc3a1bd7e528af8582cd3578d82ae22e309de7c3663c9d0fa5b5ce79c1a346ac60205fa3602082019150611382565b5050505050505050565b60606109596395d89b415f611d93565b683602298b8c10b01230546001600160a01b031680611421576040517f5b2a47ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b90565b5f61142d6113d6565b90508260601b60601c925060405163813500fc5f52836020528215156040523360605260205f6064601c34865af160015f51141661146d573d5f823e3d81fd5b83337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206040a360405250505f60605250565b683602298b8c10b012308054600160a01b900460ff16156114d55760405163558a1e0360e11b815260040160405180910390fd5b805460ff60a01b1916600160a01b178155604051611545906114fd90339085906024016126d8565b60408051601f198184030181529190526020810180516001600160e01b03167fb5a1305b00000000000000000000000000000000000000000000000000000000179052611e2c565b50815160051b6020018201825160800281015b808214610bec573382517fec85e6e86fabc4c703529b570fb5eb567dad69ddbf7901bc0fd28b38b93de7f3604060208601a3608082019150611558565b81515f036115b657604051632cc45dcf60e01b815260040160405180910390fd5b682ab3f28a60db472ee68054682ab3f28a60db472ee754682ab3f28a60db472ee8546001600160a01b03909216915f5b865181101561169d575f87828151811061160257611602612794565b60200260200101519050611617848483611f68565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526001600160a01b038616906323b872dd906064015f604051808303815f87803b15801561167b575f80fd5b505af115801561168d573d5f803e3d5ffd5b50505050816001019150506115e6565b505f6116a76113d6565b90505f80826001600160a01b0316886116c0575f6116c3565b60015b60ff166060336001600160a01b0316901b178a6040516024016116e7929190612766565b60408051601f198184030181529181526020820180516001600160e01b03167f3e0446a10000000000000000000000000000000000000000000000000000000017905251611735919061277e565b5f604051808303815f865af19150503d805f811461176e576040519150601f19603f3d011682016040523d82523d5f602084013e611773565b606091505b50915091508160016020830151141661178e57805160208201fd5b8851885f5260208a018160051b81015b808214611807578151335f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a48a156117fc578151337fcc3a1bd7e528af8582cd3578d82ae22e309de7c3663c9d0fa5b5ce79c1a346ac60205fa35b60208201915061179e565b505050505050505050505050565b611820858585610a11565b833b15610fa357610fa385858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611e6a92505050565b60606111118484845f611ef3565b60605f611893682ab3f28a60db472ee6546001600160a01b031690565b6040517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018590529091506001600160a01b0382169063c87b56dd906024015f60405180830381865afa92505050801561191357506040513d5f823e601f3d908101601f1916820160405261191091908101906127a8565b60015b61194f573d808015611940576040519150601f19603f3d011682016040523d82523d5f602084013e611945565b606091505b5061111184611fb4565b9392505050565b683602298b8c10b012308054600160a01b900460ff161561198a5760405163558a1e0360e11b815260040160405180910390fd5b805460ff60a01b1916600160a01b1781556040516119fa906119b290339085906024016126d8565b60408051601f198184030181529190526020810180516001600160e01b03167f73e63d8900000000000000000000000000000000000000000000000000000000179052611e2c565b50815160051b6020018201825160800281015b808214610bec57606082015182517fc56f8610599b5a39311e36563ef3386394748f787ef5efc116d960d77def8050604060208601a3608082019150611a0d565b5f80611a586113d6565b9050604051632c5966af5f5284602052836040523360605260605f6064601c34865af1605f3d1116611a8c573d5f823e3d81fd5b5f5160205160405194508681837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a48533827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a4505083857fbc43d7c0945f5a13a7bfa8ca7309e55f903f01d66c38c6d1353fe7ff9335d77660206040a3600160405283337fcc3a1bd7e528af8582cd3578d82ae22e309de7c3663c9d0fa5b5ce79c1a346ac60206040a3604052505f60605292915050565b80515f03611b6a57604051632cc45dcf60e01b815260040160405180910390fd5b5f611b736113d6565b90505f80826001600160a01b03163385604051602401611b949291906126b7565b60408051601f198184030181529181526020820180516001600160e01b03167f86529a610000000000000000000000000000000000000000000000000000000017905251611be2919061277e565b5f604051808303815f865af19150503d805f8114611c1b576040519150601f19603f3d011682016040523d82523d5f602084013e611c20565b606091505b509150915081600160208301511416611c3b57805160208201fd5b8351602085018160051b81015b808214611c825781515f337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a4602082019150611c48565b5050505f611ca0682ab3f28a60db472ee6546001600160a01b031690565b90505f5b8551811015611d6057816001600160a01b03166342842e0e3033898581518110611cd057611cd0612794565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b158015611d3f575f80fd5b505af1158015611d51573d5f803e3d5ffd5b50505050806001019050611ca4565b505050505050565b5f611d8a63e985e9c5846001600160a01b0316846001600160a01b0316611de9565b15159392505050565b60605f611d9e6113d6565b90506040519150835f52826020525f806024601c845afa611dc1573d5f833e3d82fd5b60205f803e60205f51833e815160205f5101602084013e815160208301016040525092915050565b5f80611df36113d6565b9050604051855f52846020528360405260205f6044601c855afa601f3d1116611e1e573d5f823e3d81fd5b60405250505f519392505050565b5f80611e366113d6565b905060405160205f85516020870134865af1601f3d1116611e59573d5f823e3d81fd5b60405250505f606081905251919050565b60405163150b7a028082523360208301528560601b60601c604083015283606083015260808083015282518060a08401528015611eb1578060c08401826020870160045afa505b60208360a48301601c86015f8a5af1611ed2573d15611ed2573d5f843e3d83fd5b508060e01b825114611d605763d1a57ed65f526004601cfd5b6109fe611fc4565b60605f611efe6113d6565b9050604051915063f9b4b3285f528215158660601b1760205284604052836060525f806064601c845afa611f34573d5f833e3d82fd5b60205f803e60205f51833e815160051b60205f5101602084013e815160051b60208301016040525f60605250949350505050565b82821715610c285782811080611f7d57508082105b15610c28576040517fafaa46a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606061096e63c87b56dd83611d93565b611fcc6113d6565b6040517f514e62fc00000000000000000000000000000000000000000000000000000000815233600482015267200000000000000060248201526001600160a01b03919091169063514e62fc90604401602060405180830381865afa158015612037573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061205b919061281d565b612077576040516282b42960e81b815260040160405180910390fd5b565b5f60208284031215612089575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461194f575f80fd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156120fd575f80fd5b5035919050565b80356001600160a01b038116811461211a575f80fd5b919050565b5f8060408385031215612130575f80fd5b61213983612104565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b6040516080810167ffffffffffffffff8111828210171561217e5761217e612147565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156121ad576121ad612147565b604052919050565b5f67ffffffffffffffff8211156121ce576121ce612147565b5060051b60200190565b5f82601f8301126121e7575f80fd5b81356121fa6121f5826121b5565b612184565b8082825260208201915060208360051b86010192508583111561221b575f80fd5b602085015b83811015612238578035835260209283019201612220565b5095945050505050565b5f60208284031215612252575f80fd5b813567ffffffffffffffff811115612268575f80fd5b611111848285016121d8565b5f67ffffffffffffffff82111561228d5761228d612147565b50601f01601f191660200190565b5f805f80608085870312156122ae575f80fd5b6122b785612104565b93506122c560208601612104565b925060408501359150606085013567ffffffffffffffff8111156122e7575f80fd5b8501601f810187136122f7575f80fd5b80356123056121f582612274565b818152886020838501011115612319575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f805f6060848603121561234c575f80fd5b61235584612104565b925061236360208501612104565b929592945050506040919091013590565b5f60208284031215612384575f80fd5b813567ffffffffffffffff81111561239a575f80fd5b8201601f810184136123aa575f80fd5b80356123b86121f5826121b5565b8082825260208201915060208360071b8501019250868311156123d9575f80fd5b6020840193505b8284101561244357608084880312156123f7575f80fd5b6123ff61215b565b843581526020808601359082015261241960408601612104565b604082015261242a60608601612104565b60608201528252608093909301926020909101906123e0565b9695505050505050565b5f8083601f84011261245d575f80fd5b50813567ffffffffffffffff811115612474575f80fd5b60208301915083602082850101111561248b575f80fd5b9250929050565b5f805f604084860312156124a4575f80fd5b6124ad84612104565b9250602084013567ffffffffffffffff8111156124c8575f80fd5b6124d48682870161244d565b9497909650939450505050565b5f805f606084860312156124f3575f80fd5b6124fc84612104565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b82811015612541578151865260209586019590910190600101612523565b5093949350505050565b602081525f61194f6020830184612511565b5f6020828403121561256d575f80fd5b61194f82612104565b80151581146109fe575f80fd5b5f8060408385031215612594575f80fd5b823567ffffffffffffffff8111156125aa575f80fd5b6125b6858286016121d8565b92505060208301356125c781612576565b809150509250929050565b5f80604083850312156125e3575f80fd5b6125ec83612104565b915060208301356125c781612576565b5f805f805f60808688031215612610575f80fd5b61261986612104565b945061262760208701612104565b935060408601359250606086013567ffffffffffffffff811115612649575f80fd5b6126558882890161244d565b969995985093965092949392505050565b5f8060408385031215612677575f80fd5b50508035926020909101359150565b5f8060408385031215612697575f80fd5b6126a083612104565b91506126ae60208401612104565b90509250929050565b6001600160a01b0383168152604060208201525f6111116040830184612511565b5f604082016001600160a01b0385168352604060208401528084518083526060850191506020860192505f5b8181101561275a57835180518452602081015160208501526001600160a01b0360408201511660408501526001600160a01b03606082015116606085015250608083019250602084019350600181019050612704565b50909695505050505050565b828152604060208201525f6111116040830184612511565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156127b8575f80fd5b815167ffffffffffffffff8111156127ce575f80fd5b8201601f810184136127de575f80fd5b80516127ec6121f582612274565b818152856020838501011115612800575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b5f6020828403121561282d575f80fd5b815161194f8161257656fea264697066735822122054a57c64c26e053d19f5872d49112243a685b25cb8dcfc3a9bed5307fd152a0964736f6c634300081a0033