Files
protocol/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json

505 lines
100 KiB
JSON
Generated

{
"schemaVersion": "2.0.0",
"contractName": "ERC20BridgeSampler",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [{ "internalType": "bytes[]", "name": "callDatas", "type": "bytes[]" }],
"name": "batchCall",
"outputs": [{ "internalType": "bytes[]", "name": "callResults", "type": "bytes[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "registryAddress", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" }
],
"name": "getLiquidityProviderFromRegistry",
"outputs": [{ "internalType": "address", "name": "providerAddress", "type": "address" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{ "internalType": "address", "name": "makerAddress", "type": "address" },
{ "internalType": "address", "name": "takerAddress", "type": "address" },
{ "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
{ "internalType": "address", "name": "senderAddress", "type": "address" },
{ "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "makerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "takerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
{ "internalType": "uint256", "name": "salt", "type": "uint256" },
{ "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{ "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" },
{ "internalType": "address", "name": "devUtilsAddress", "type": "address" }
],
"name": "getOrderFillableMakerAssetAmounts",
"outputs": [
{ "internalType": "uint256[]", "name": "orderFillableMakerAssetAmounts", "type": "uint256[]" }
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{ "internalType": "address", "name": "makerAddress", "type": "address" },
{ "internalType": "address", "name": "takerAddress", "type": "address" },
{ "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
{ "internalType": "address", "name": "senderAddress", "type": "address" },
{ "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
{ "internalType": "uint256", "name": "makerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "takerFee", "type": "uint256" },
{ "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
{ "internalType": "uint256", "name": "salt", "type": "uint256" },
{ "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
{ "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
],
"internalType": "struct LibOrder.Order[]",
"name": "orders",
"type": "tuple[]"
},
{ "internalType": "bytes[]", "name": "orderSignatures", "type": "bytes[]" },
{ "internalType": "address", "name": "devUtilsAddress", "type": "address" }
],
"name": "getOrderFillableTakerAssetAmounts",
"outputs": [
{ "internalType": "uint256[]", "name": "orderFillableTakerAssetAmounts", "type": "uint256[]" }
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{ "internalType": "address", "name": "poolAddress", "type": "address" },
{ "internalType": "bytes4", "name": "sellQuoteFunctionSelector", "type": "bytes4" },
{ "internalType": "bytes4", "name": "buyQuoteFunctionSelector", "type": "bytes4" }
],
"internalType": "struct CurveSampler.CurveInfo",
"name": "curveInfo",
"type": "tuple"
},
{ "internalType": "int128", "name": "fromTokenIdx", "type": "int128" },
{ "internalType": "int128", "name": "toTokenIdx", "type": "int128" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromCurve",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromEth2Dai",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromKyberNetwork",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "registryAddress", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromLiquidityProviderRegistry",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromUniswap",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address[]", "name": "path", "type": "address[]" },
{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleBuysFromUniswapV2",
"outputs": [{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{ "internalType": "address", "name": "poolAddress", "type": "address" },
{ "internalType": "bytes4", "name": "sellQuoteFunctionSelector", "type": "bytes4" },
{ "internalType": "bytes4", "name": "buyQuoteFunctionSelector", "type": "bytes4" }
],
"internalType": "struct CurveSampler.CurveInfo",
"name": "curveInfo",
"type": "tuple"
},
{ "internalType": "int128", "name": "fromTokenIdx", "type": "int128" },
{ "internalType": "int128", "name": "toTokenIdx", "type": "int128" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromCurve",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromEth2Dai",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "address", "name": "intermediateToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromEth2DaiHop",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromKyberNetwork",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "registryAddress", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromLiquidityProviderRegistry",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "multibridge", "type": "address" },
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "intermediateToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromMultiBridge",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address", "name": "takerToken", "type": "address" },
{ "internalType": "address", "name": "makerToken", "type": "address" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromUniswap",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "internalType": "address[]", "name": "path", "type": "address[]" },
{ "internalType": "uint256[]", "name": "takerTokenAmounts", "type": "uint256[]" }
],
"name": "sampleSellsFromUniswapV2",
"outputs": [{ "internalType": "uint256[]", "name": "makerTokenAmounts", "type": "uint256[]" }],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {
"batchCall(bytes[])": {
"details": "Call multiple public functions on this contract in a single transaction.",
"params": { "callDatas": "ABI-encoded call data for each function call." },
"return": "callResults ABI-encoded results data for each call."
},
"getLiquidityProviderFromRegistry(address,address,address)": {
"details": "Returns the address of a liquidity provider for the given market (takerToken, makerToken), from a registry of liquidity providers. Returns address(0) if no such provider exists in the registry.",
"params": {
"makerToken": "Maker asset managed by liquidity provider.",
"takerToken": "Taker asset managed by liquidity provider."
},
"return": "providerAddress Address of the liquidity provider."
},
"getOrderFillableMakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],address)": {
"details": "Queries the fillable taker asset amounts of native orders. Effectively ignores orders that have empty signatures or",
"params": {
"devUtilsAddress": "Address to the DevUtils contract.",
"orderSignatures": "Signatures for each respective order in `orders`.",
"orders": "Native orders to query."
},
"return": "orderFillableMakerAssetAmounts How much maker asset can be filled by each order in `orders`."
},
"getOrderFillableTakerAssetAmounts((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],address)": {
"details": "Queries the fillable taker asset amounts of native orders. Effectively ignores orders that have empty signatures or maker/taker asset amounts (returning 0).",
"params": {
"devUtilsAddress": "Address to the DevUtils contract.",
"orderSignatures": "Signatures for each respective order in `orders`.",
"orders": "Native orders to query."
},
"return": "orderFillableTakerAssetAmounts How much taker asset can be filled by each order in `orders`."
},
"sampleBuysFromCurve((address,bytes4,bytes4),int128,int128,uint256[])": {
"details": "Sample buy quotes from Curve.",
"params": {
"curveInfo": "Curve information specific to this token pair.",
"fromTokenIdx": "Index of the taker token (what to sell).",
"makerTokenAmounts": "Maker token buy amount for each sample.",
"toTokenIdx": "Index of the maker token (what to buy)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromEth2Dai(address,address,uint256[])": {
"details": "Sample buy quotes from Eth2Dai/Oasis.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Maker token sell amount for each sample."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromKyberNetwork(address,address,uint256[])": {
"details": "Sample buy quotes from Kyber.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"makerTokenAmounts": "Maker token buy amount for each sample.",
"takerToken": "Address of the taker token (what to sell)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromLiquidityProviderRegistry(address,address,address,uint256[])": {
"details": "Sample buy quotes from an arbitrary on-chain liquidity provider.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"makerTokenAmounts": "Maker token buy amount for each sample.",
"registryAddress": "Address of the liquidity provider registry contract.",
"takerToken": "Address of the taker token (what to sell)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromUniswap(address,address,uint256[])": {
"details": "Sample buy quotes from Uniswap.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"makerTokenAmounts": "Maker token sell amount for each sample.",
"takerToken": "Address of the taker token (what to sell)."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleBuysFromUniswapV2(address[],uint256[])": {
"details": "Sample buy quotes from UniswapV2.",
"params": {
"makerTokenAmounts": "Maker token buy amount for each sample.",
"path": "Token route. Should be takerToken -> makerToken."
},
"return": "takerTokenAmounts Taker amounts sold at each maker token amount."
},
"sampleSellsFromCurve((address,bytes4,bytes4),int128,int128,uint256[])": {
"details": "Sample sell quotes from Curve.",
"params": {
"curveInfo": "Curve information specific to this token pair.",
"fromTokenIdx": "Index of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample.",
"toTokenIdx": "Index of the maker token (what to buy)."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromEth2Dai(address,address,uint256[])": {
"details": "Sample sell quotes from Eth2Dai/Oasis.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromEth2DaiHop(address,address,address,uint256[])": {
"details": "Sample sell quotes from Eth2Dai/Oasis using a hop to an intermediate token. I.e WBTC/DAI via ETH or WBTC/ETH via DAI",
"params": {
"intermediateToken": "Address of the token to hop to.",
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromKyberNetwork(address,address,uint256[])": {
"details": "Sample sell quotes from Kyber.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromLiquidityProviderRegistry(address,address,address,uint256[])": {
"details": "Sample sell quotes from an arbitrary on-chain liquidity provider.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"registryAddress": "Address of the liquidity provider registry contract.",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromMultiBridge(address,address,address,address,uint256[])": {
"details": "Sample sell quotes from MultiBridge.",
"params": {
"intermediateToken": "The address of the intermediate token to use in an indirect route.",
"makerToken": "Address of the maker token (what to buy).",
"multibridge": "Address of the MultiBridge contract.",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromUniswap(address,address,uint256[])": {
"details": "Sample sell quotes from Uniswap.",
"params": {
"makerToken": "Address of the maker token (what to buy).",
"takerToken": "Address of the taker token (what to sell).",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
},
"sampleSellsFromUniswapV2(address[],uint256[])": {
"details": "Sample sell quotes from UniswapV2.",
"params": {
"path": "Token route. Should be takerToken -> makerToken",
"takerTokenAmounts": "Taker token sell amount for each sample."
},
"return": "makerTokenAmounts Maker amounts bought at each taker token amount."
}
}
},
"evm": {
"bytecode": {
"object": "0x608060405234801561001057600080fd5b50614784806100206000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806368be3cf2116100b2578063a2c28d4b11610081578063c7f7142e11610066578063c7f7142e1461027b578063e68248f71461029b578063e9a8e442146102ae57610136565b8063a2c28d4b14610255578063abffc7611461026857610136565b806368be3cf2146101fc5780636dd6b78d1461021c5780639209483b1461022f5780639f76ad351461024257610136565b80634703a7e61161010957806358306ba0116100ee57806358306ba0146101c357806360ee052a146101d657806364ee6ade146101e957610136565b80634703a7e61461019d5780634cb8e253146101b057610136565b80630cc6600b1461013b5780632d753aa41461016457806339b085ad1461017757806340bc03ae1461018a575b600080fd5b61014e610149366004613839565b6102c1565b60405161015b919061435f565b60405180910390f35b61014e610172366004613740565b61033b565b61014e610185366004613b5b565b610531565b61014e610198366004613eaa565b6107ee565b61014e6101ab366004613839565b6109a6565b61014e6101be366004613839565b610b82565b61014e6101d13660046137c6565b610cb5565b61014e6101e4366004613839565b610d4c565b61014e6101f7366004613839565b611001565b61020f61020a366004613aef565b6111c7565b60405161015b91906142e1565b61014e61022a366004613839565b61130d565b61014e61023d366004613eaa565b6115b5565b61014e6102503660046137c6565b6117e9565b61014e6102633660046137c6565b6119ed565b61014e610276366004613999565b611a53565b61028e6102893660046136f6565b611c3e565b60405161015b91906140d5565b61014e6102a9366004613999565b611d78565b61014e6102bc366004613b5b565b611f4b565b60606102cd8385611fee565b6103316040518060600160405280856040516020016102ec91906140d5565b60405160208183030381529060405281526020018660405160200161031191906140d5565b6040516020818303038152906040528152602001612061815250836121d9565b90505b9392505050565b60606000825190508060405190808252806020026020018201604052801561036d578160200160208202803883390190505b50915073ffffffffffffffffffffffffffffffffffffffff87166103915750610528565b60005b8181101561052557600060608973ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff16636e79e133905060e01b8b8b8b8b89815181106103ec57fe5b602002602001015160405160240161040794939291906141a1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161049091906140b9565b6000604051808303818686fa925050503d80600081146104cc576040519150601f19603f3d011682016040523d82523d6000602084013e6104d1565b606091505b509092509050600082156104fa57818060200190516104f39190810190613d6e565b9050610502565b505050610525565b8086858151811061050f57fe5b6020908102919091010152505050600101610394565b50505b95945050505050565b6060835160405190808252806020026020018201604052801561055e578160200160208202803883390190505b50905060005b845181146107e65783818151811061057857fe5b602002602001015151600014806105a6575084818151811061059657fe5b6020026020010151608001516000145b806105c857508481815181106105b857fe5b602002602001015160a001516000145b156105ec5760008282815181106105db57fe5b6020026020010181815250506107de565b600060608473ffffffffffffffffffffffffffffffffffffffff166207a1208673ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b89868151811061063857fe5b602002602001015189878151811061064c57fe5b6020026020010151604051602401610665929190614466565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516106ee91906140b9565b6000604051808303818686fa925050503d806000811461072a576040519150601f19603f3d011682016040523d82523d6000602084013e61072f565b606091505b50915091508161075a57600084848151811061074757fe5b60200260200101818152505050506107de565b610762613533565b600080838060200190516107799190810190613f46565b9194509250905060038351600681111561078f57fe5b14158061079a575080155b156107be5760008787815181106107ad57fe5b6020026020010181815250506107d8565b818787815181106107cb57fe5b6020026020010181815250505b50505050505b600101610564565b509392505050565b606060008251905080604051908082528060200260200182016040528015610820578160200160208202803883390190505b50915060005b8181101561099c5760006060886000015173ffffffffffffffffffffffffffffffffffffffff16620927c08a602001518a8a8a888151811061086457fe5b602002602001015160405160240161087e939291906143a1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161090791906140b9565b6000604051808303818686fa925050503d8060008114610943576040519150601f19603f3d011682016040523d82523d6000602084013e610948565b606091505b50909250905060008215610971578180602001905161096a9190810190613d6e565b9050610979565b50505061099c565b8086858151811061098657fe5b6020908102919091010152505050600101610826565b5050949350505050565b60606109b28385611fee565b81516040805182815260208084028201019091528180156109dd578160200160208202803883390190505b50915060005b81811015610b7957600060606109f76123ae565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a8881518110610a4157fe5b6020026020010151604051602401610a5b939291906141d8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610ae491906140b9565b6000604051808303818686fa925050503d8060008114610b20576040519150601f19603f3d011682016040523d82523d6000602084013e610b25565b606091505b50909250905060008215610b4e5781806020019051610b479190810190613d6e565b9050610b56565b505050610b79565b80868581518110610b6357fe5b60209081029190910101525050506001016109e3565b50509392505050565b6060610b8e8385611fee565b8151604080518281526020808402820101909152818015610bb9578160200160208202803883390190505b5091506000610bc66123c6565b90506000805b83811015610caa578273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480610c3957508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b15610c6357610c5c8888888481518110610c4f57fe5b60200260200101516123de565b9150610c8a565b610c748884888481518110610c4f57fe5b91508115610c8a57610c878388846123de565b91505b81858281518110610c9757fe5b6020908102919091010152600101610bcc565b505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610d1c57508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610d2657610d44565b6060610d33868585611001565b9050610d40848683611001565b9150505b949350505050565b6060610d588385611fee565b8151604080518281526020808402820101909152818015610d83578160200160208202803883390190505b5091506000610d906123c6565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610dd057610dcb86612bfe565b610dd3565b60005b90506000610ddf6123c6565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e1f57610e1a86612bfe565b610e22565b60005b905060005b83811015610caa576001610e396123c6565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610ed0578651610eaf9085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610ea257fe5b6020026020010151612c90565b878481518110610ebb57fe5b60200260200101819350828152505050610fed565b610ed86123c6565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610f41578651610eaf9084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610ea257fe5b8651600090610f7a9085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610ea257fe5b925090508015610fd057610faf857f2640f62c0000000000000000000000000000000000000000000000000000000083612c90565b888581518110610fbb57fe5b60200260200101819450828152505050610feb565b6000878481518110610fde57fe5b6020026020010181815250505b505b80610ff85750610caa565b50600101610e27565b606061100d8385611fee565b8151604080518281526020808402820101909152818015611038578160200160208202803883390190505b50915060005b81811015610b7957600060606110526123ae565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a888151811061109c57fe5b60200260200101516040516024016110b6939291906141d8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161113f91906140b9565b6000604051808303818686fa925050503d806000811461117b576040519150601f19603f3d011682016040523d82523d6000602084013e611180565b606091505b50909250905060008215610b4e57818060200190516111a29190810190613d6e565b9050808685815181106111b157fe5b602090810291909101015250505060010161103e565b6040805182815260208084028201019091526060908280156111fd57816020015b60608152602001906001900390816111e85790505b50905060005b80831461130657600060603086868581811061121b57fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261125557600080fd5b9091016020810191503567ffffffffffffffff81111561127457600080fd5b3681900382131561128457600080fd5b6040516112929291906140a9565b600060405180830381855afa9150503d80600081146112cd576040519150601f19603f3d011682016040523d82523d6000602084013e6112d2565b606091505b5091509150816112e457805160208201fd5b808484815181106112f157fe5b60209081029190910101525050600101611203565b5092915050565b60606113198385611fee565b8151604080518281526020808402820101909152818015611344578160200160208202803883390190505b50915060006113516123c6565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146113915761138c86612bfe565b611394565b60005b905060006113a06123c6565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146113e0576113db86612bfe565b6113e3565b60005b905060005b83811015610caa5760016113fa6123c6565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156114845786516114639085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610ea257fe5b87848151811061146f57fe5b602002602001018193508281525050506115a1565b61148c6123c6565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156114f55786516114639084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610ea257fe5b865160009061152e9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610ea257fe5b92509050801561158457611563847fcd7724c30000000000000000000000000000000000000000000000000000000083612c90565b88858151811061156f57fe5b6020026020010181945082815250505061159f565b600087848151811061159257fe5b6020026020010181815250505b505b806115ac5750610caa565b506001016113e8565b60408401516060907fffffffff000000000000000000000000000000000000000000000000000000001661164f57604080516060810190915261164890806116018689608084016143bf565b604051602081830303815290604052815260200186886040516020016116289291906143bf565b6040516020818303038152906040528152602001612dd9815250836121d9565b9050610d44565b815160408051828152602080840282010190915281801561167a578160200160208202803883390190505b50915060005b8181101561099c5760006060886000015173ffffffffffffffffffffffffffffffffffffffff16620927c08a604001518a8a8a88815181106116be57fe5b60200260200101516040516024016116d8939291906143a1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161176191906140b9565b6000604051808303818686fa925050503d806000811461179d576040519150601f19603f3d011682016040523d82523d6000602084013e6117a2565b606091505b5090925090506000821561097157818060200190516117c49190810190613d6e565b9050808685815181106117d357fe5b6020908102919091010152505050600101611680565b60606000825190508060405190808252806020026020018201604052801561181b578160200160208202803883390190505b509150600061182b878787611c3e565b905073ffffffffffffffffffffffffffffffffffffffff81166118505750610d449050565b60005b828110156119e257600060608373ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b88815181106118aa57fe5b60200260200101516040516024016118c4939291906141d8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161194d91906140b9565b6000604051808303818686fa925050503d8060008114611989576040519150601f19603f3d011682016040523d82523d6000602084013e61198e565b606091505b509092509050600082156119b757818060200190516119b09190810190613d6e565b90506119bf565b5050506119e2565b808785815181106119cc57fe5b6020908102919091010152505050600101611853565b505050949350505050565b6040805160608181019092526105289080611a0c86896080840161412f565b60405160208183030381529060405281526020018688604051602001611a3392919061412f565b6040516020818303038152906040528152602001612f70815250836121d9565b606060008251905080604051908082528060200260200182016040528015611a85578160200160208202803883390190505b50915060005b81811015611c365760006060611a9f612fea565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b888681518110611ae757fe5b60200260200101518a604051602401611b019291906145b8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611b8a91906140b9565b6000604051808303818686fa925050503d8060008114611bc6576040519150601f19603f3d011682016040523d82523d6000602084013e611bcb565b606091505b50909250905060008215611c0b5781806020019051611bed9190810190613a5c565b600189510381518110611bfc57fe5b60200260200101519050611c13565b505050611c36565b80868581518110611c2057fe5b6020908102919091010152505050600101611a8b565b505092915050565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611c79908690869060240161412f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611d0191906140b9565b600060405180830381855afa9150503d8060008114611d3c576040519150601f19603f3d011682016040523d82523d6000602084013e611d41565b606091505b5091509150818015611d54575080516020145b15611d6e57611d6481600c613002565b9350505050610334565b5050509392505050565b606060008251905080604051908082528060200260200182016040528015611daa578160200160208202803883390190505b50915060005b81811015611c365760006060611dc4612fea565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611e0c57fe5b60200260200101518a604051602401611e269291906145b8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611eaf91906140b9565b6000604051808303818686fa925050503d8060008114611eeb576040519150601f19603f3d011682016040523d82523d6000602084013e611ef0565b606091505b50909250905060008215611c0b5781806020019051611f129190810190613a5c565b600081518110611f1e57fe5b6020026020010151905080868581518110611f3557fe5b6020908102919091010152505050600101611db0565b6060611f58848484610531565b905060005b84518110156107e657818181518110611f7257fe5b6020026020010151600014611fe657611fcd828281518110611f9057fe5b6020026020010151868381518110611fa457fe5b602002602001015160a00151878481518110611fbc57fe5b602002602001015160800151613047565b828281518110611fd957fe5b6020026020010181815250505b600101611f5d565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561205d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612054906143d7565b60405180910390fd5b5050565b60008060603073ffffffffffffffffffffffffffffffffffffffff16634cb8e25360e01b8780602001905161209991908101906136a1565b878060200190516120ad91908101906136a1565b6120b688613089565b6040516024016120c8939291906140f6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161215191906140b9565b600060405180830381855afa9150503d806000811461218c576040519150601f19603f3d011682016040523d82523d6000602084013e612191565b606091505b5091509150816121a657600092505050610334565b808060200190516121ba9190810190613a5c565b6000815181106121c657fe5b6020026020010151925050509392505050565b60608151604051908082528060200260200182016040528015612206578160200160208202803883390190505b509050815160001415612218576123a8565b6000612249846000015185602001518560008151811061223457fe5b6020026020010151876040015163ffffffff16565b90508061225657506123a8565b60006122738560200151866000015184886040015163ffffffff16565b90508061228257506123a89050565b60005b84518110156123a45760005b6005811015612366576122b88683815181106122a957fe5b60200260200101518486613047565b93506122c961271561271086613047565b935060006122e888602001518960000151878b6040015163ffffffff16565b9050806122f55750612366565b80935086838151811061230457fe5b6020026020010151841061235d57600087848151811061232057fe5b602002602001015161271089868151811061233757fe5b60200260200101518703028161234957fe5b0490506005811161235b575050612366565b505b50600101612291565b5061238585828151811061237657fe5b60200260200101518385613047565b84828151811061239157fe5b6020908102919091010152600101612285565b5050505b92915050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b60008060006123eb6130ca565b9150915060608173ffffffffffffffffffffffffffffffffffffffff16633d3dc52c6124156123c6565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161461244d578861244f565b875b6040518263ffffffff1660e01b815260040161246b91906140d5565b60006040518083038186803b15801561248357600080fd5b505afa158015612497573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526124dd9190810190613a5c565b604080516000808252602082019092529192505b8251811015612796576040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b90612560907331e085afd48a1d6e51cc193153d625e8f0514c7f906004016140d5565b60206040518083038186803b15801561257857600080fd5b505afa15801561258c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125b09190810190613d6e565b8382815181106125bc57fe5b6020026020010151148061269757506040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b90612631907310908c875d865c66f271f5d3949848971c9595c9906004016140d5565b60206040518083038186803b15801561264957600080fd5b505afa15801561265d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126819190810190613d6e565b83828151811061268d57fe5b6020026020010151145b8061276957506040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b9061270390731e158c0e93c30d24e918ef83d1e0be23595c3c0f906004016140d5565b60206040518083038186803b15801561271b57600080fd5b505afa15801561272f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127539190810190613d6e565b83828151811061275f57fe5b6020026020010151145b1561278e5761278b8284838151811061277e57fe5b60200260200101516131fe565b91505b6001016124f1565b5060606127a16123c6565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156128b8578473ffffffffffffffffffffffffffffffffffffffff166381efcbdd89600285600060405190808252806020026020018201604052801561281f578160200160208202803883390190505b506040518563ffffffff1660e01b815260040161283f949392919061425c565b60006040518083038186803b15801561285757600080fd5b505afa15801561286b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526128b19190810190613d86565b9050612998565b8473ffffffffffffffffffffffffffffffffffffffff166381efcbdd8a6002856000604051908082528060200260200182016040528015612903578160200160208202803883390190505b506040518563ffffffff1660e01b8152600401612923949392919061425c565b60006040518083038186803b15801561293b57600080fd5b505afa15801561294f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526129959190810190613d86565b90505b600060606129a4613294565b73ffffffffffffffffffffffffffffffffffffffff166216e3607f418436bc000000000000000000000000000000000000000000000000000000006129e76123c6565b73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612a1f578d612a35565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b612a3d6123c6565b73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612a75578d612a8b565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b8d600089604051602401612aa3959493929190614209565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051612b2c91906140b9565b6000604051808303818686fa925050503d8060008114612b68576040519150601f19603f3d011682016040523d82523d6000602084013e612b6d565b606091505b50909250905060008215612b965781806020019051612b8f9190810190613d6e565b9050612ba7565b600098505050505050505050610334565b6000612bb28c6132ac565b60ff1690506000612bc28e6132ac565b60ff169050670de0b6b3a764000081600a0a83600a0a8e86020281612be357fe5b0481612beb57fe5b049e9d5050505050505050505050505050565b6000612c086132b7565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b8152600401612c4091906140d5565b60206040518083038186803b158015612c5857600080fd5b505afa158015612c6c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123a891908101906136a1565b60008073ffffffffffffffffffffffffffffffffffffffff8516612cb357612dd1565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f08686604051602401612ce291906145af565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051612d6b91906140b9565b6000604051808303818686fa925050503d8060008114612da7576040519150601f19603f3d011682016040523d82523d6000602084013e612dac565b606091505b5090925090508115612dcf5780806020019051612dcc9190810190613d6e565b92505b505b935093915050565b600080612de4613555565b85806020019051612df89190810190613e0f565b91509150600085806020019051612e129190810190613df3565b905060006060307f40bc03ae00000000000000000000000000000000000000000000000000000000858786612e468c613089565b604051602401612e599493929190614434565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051612ee291906140b9565b600060405180830381855afa9150503d8060008114612f1d576040519150601f19603f3d011682016040523d82523d6000602084013e612f22565b606091505b509150915081612f3a57600095505050505050610334565b80806020019051612f4e9190810190613a5c565b600081518110612f5a57fe5b6020026020010151955050505050509392505050565b600080600085806020019051612f8991908101906136bd565b91509150600085806020019051612fa391908101906136a1565b905060006060307f9f76ad3500000000000000000000000000000000000000000000000000000000858786612fd78c613089565b604051602401612e599493929190614156565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b600081601401835110156130285761302861302360048551856014016132cf565b613374565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b60006103318361307d61306182600163ffffffff61337c16565b613071888763ffffffff61339b16565b9063ffffffff6133cc16565b9063ffffffff6133e816565b6040805160018082528183019092526060916020808301908038833901905050905081816000815181106130b957fe5b602002602001018181525050919050565b6000806130d5613294565b73ffffffffffffffffffffffffffffffffffffffff1663b78b842d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561311a57600080fd5b505afa15801561312e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061315291908101906136a1565b73ffffffffffffffffffffffffffffffffffffffff1663c3a2a93a6040518163ffffffff1660e01b815260040160006040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526131f19190810190613899565b5091955093505050509091565b6060825160010160405190808252806020026020018201604052801561322e578160200160208202803883390190505b50905060005b83518110156132705783818151811061324957fe5b602002602001015182828151811061325d57fe5b6020908102919091010152600101613234565b50818160018351038151811061328257fe5b60200260200101818152505092915050565b739aab3f75489902f3a48495025729a0af77d4b11e90565b60006123a882613412565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b6060632800659560e01b8484846040516024016132ee93929190614393565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b60008282111561339557613395613023600285856134e3565b50900390565b6000826133aa575060006123a8565b828202828482816133b757fe5b041461033457610334613023600186866134e3565b60008282018381101561033457610334613023600086866134e3565b6000816133fe576133fe613023600385856134e3565b600082848161340957fe5b04949350505050565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce5670000000000000000000000000000000000000000000000000000000081525060405161347691906140b9565b600060405180830381855afa9150503d80600081146134b1576040519150601f19603f3d011682016040523d82523d6000602084013e6134b6565b606091505b50915091508180156134c9575080516020145b156134dc576134d9816000613502565b92505b5050919050565b606063e946c1bb60e01b8484846040516024016132ee93929190614372565b600061033483836000816020018351101561352a5761352a61302360058551856020016132cf565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b604080516060810182526000808252602082018190529181019190915290565b80356123a8816146e2565b600082601f830112613590578081fd5b81356135a361359e82614643565b61461c565b8181529150602080830190840160005b838110156135e0576135cb8760208435890101613653565b835260209283019291909101906001016135b3565b5050505092915050565b600082601f8301126135fa578081fd5b813561360861359e82614643565b81815291506020808301908481018184028601820187101561362957600080fd5b60005b848110156136485781358452928201929082019060010161362c565b505050505092915050565b600082601f830112613663578081fd5b813561367161359e82614663565b915080825283602082850101111561368857600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156136b2578081fd5b8151610334816146e2565b600080604083850312156136cf578081fd5b82516136da816146e2565b60208401519092506136eb816146e2565b809150509250929050565b60008060006060848603121561370a578081fd5b8335613715816146e2565b92506020840135613725816146e2565b91506040840135613735816146e2565b809150509250925092565b600080600080600060a08688031215613757578283fd5b8535613762816146e2565b94506020860135613772816146e2565b93506040860135613782816146e2565b92506060860135613792816146e2565b9150608086013567ffffffffffffffff8111156137ad578182fd5b6137b9888289016135ea565b9150509295509295909350565b600080600080608085870312156137db578182fd5b84356137e6816146e2565b935060208501356137f6816146e2565b92506040850135613806816146e2565b9150606085013567ffffffffffffffff811115613821578182fd5b61382d878288016135ea565b91505092959194509250565b60008060006060848603121561384d578081fd5b8335613858816146e2565b92506020840135613868816146e2565b9150604084013567ffffffffffffffff811115613883578182fd5b61388f868287016135ea565b9150509250925092565b60008060008060008060c087890312156138b1578384fd5b86516138bc816146e2565b809650506020808801516138cf816146e2565b60408901519096506138e0816146e2565b60608901519095506138f1816146e2565b6080890151909450613902816146e2565b60a089015190935067ffffffffffffffff81111561391e578283fd5b8089018a601f82011261392f578384fd5b8051915061393f61359e83614643565b82815283810190828501858502840186018e101561395b578687fd5b8693505b84841015613986578051613972816146e2565b83526001939093019291850191850161395f565b5080955050505050509295509295509295565b600080604083850312156139ab578182fd5b823567ffffffffffffffff808211156139c2578384fd5b81850186601f8201126139d3578485fd5b803592506139e361359e84614643565b80848252602080830192508084018a828389028701011115613a03578889fd5b8894505b86851015613a2e578035613a1a816146e2565b845260019490940193928101928101613a07565b509096508701359350505080821115613a45578283fd5b50613a52858286016135ea565b9150509250929050565b60006020808385031215613a6e578182fd5b825167ffffffffffffffff811115613a84578283fd5b80840185601f820112613a95578384fd5b80519150613aa561359e83614643565b8281528381019082850185850284018601891015613ac1578687fd5b8693505b84841015613ae3578051835260019390930192918501918501613ac5565b50979650505050505050565b60008060208385031215613b01578182fd5b823567ffffffffffffffff80821115613b18578384fd5b81850186601f820112613b29578485fd5b8035925081831115613b39578485fd5b8660208085028301011115613b4c578485fd5b60200196919550909350505050565b600080600060608486031215613b6f578081fd5b67ffffffffffffffff8085351115613b85578182fd5b8435850186601f820112613b97578283fd5b613ba461359e8235614643565b8135815260208082019190808401865b8535811015613d3157813586016101c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828f03011215613bf3578889fd5b613bfe6101c061461c565b613c0a8e868401613575565b8152613c198e60408401613575565b85820152613c2a8e60608401613575565b6040820152613c3c8e60808401613575565b606082015260a0820135608082015260c082013560a082015260e082013560c082015261010082013560e082015261012082013561010082015261014082013561012082015261016082013589811115613c94578a8bfd5b613ca28f8783860101613653565b6101408301525061018082013589811115613cbb578a8bfd5b613cc98f8783860101613653565b610160830152506101a082013589811115613ce2578a8bfd5b613cf08f8783860101613653565b610180830152506101c082013589811115613d09578a8bfd5b613d178f8783860101613653565b6101a0830152508652509382019390820190600101613bb4565b509197508801359250505081811115613d48578283fd5b613d5487828801613580565b93505050613d658560408601613575565b90509250925092565b600060208284031215613d7f578081fd5b5051919050565b600060208284031215613d97578081fd5b815167ffffffffffffffff811115613dad578182fd5b80830184601f820112613dbe578283fd5b80519150613dce61359e83614663565b828152856020848401011115613de2578384fd5b6105288360208301602085016146a5565b600060208284031215613e04578081fd5b815161033481614732565b60008060808385031215613e21578182fd5b8251613e2c81614732565b915060608385037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215613e5f578081fd5b613e69606061461c565b6020840151613e77816146e2565b81526040840151613e8781614704565b60208201526060840151613e9a81614704565b6040820152919491935090915050565b60008060008084860360c0811215613ec0578283fd5b6060811215613ecd578283fd5b50613ed8606061461c565b8535613ee3816146e2565b81526020860135613ef381614704565b60208201526040860135613f0681614704565b604082015293506060850135613f1b81614732565b92506080850135613f2b81614732565b915060a085013567ffffffffffffffff811115613821578182fd5b600080600083850360a0811215613f5b578182fd5b6060811215613f68578182fd5b50613f73606061461c565b845160078110613f81578283fd5b815260208581015190820152604080860151908201526060850151608086015191945092508015158114613735578182fd5b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015613ffe578151865260209586019590910190600101613fe0565b5093949350505050565b600081518084526140208160208601602086016146a5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805173ffffffffffffffffffffffffffffffffffffffff1682526020808201517fffffffff000000000000000000000000000000000000000000000000000000009081169184019190915260409182015116910152565b6000828483379101908152919050565b600082516140cb8184602087016146a5565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8086168352808516602084015250606060408301526105286060830184613fcd565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152808516604084015250608060608301526141976080830184613fcd565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260ff8416606083015260a0608083015261425160a0830184614008565b979650505050505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff87168352614284866146d5565b60208381018790526080604085015285519182905285019060a0840190835b818110156142c15783518352602093840193909201916001016142a3565b505083810360608501526142d58186613fcd565b98975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015614352577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452614340858351614008565b94509285019290850190600101614306565b5092979650505050505050565b6000602082526103346020830184613fcd565b6060810161437f856146d5565b938152602081019290925260409091015290565b606081016008851061437f57fe5b600f93840b81529190920b6020820152604081019190915260600190565b600f83900b8152608081016103346020830184614052565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b60006144408287614052565b84600f0b606083015283600f0b608083015260c060a083015261419760c0830184613fcd565b60006040825261447a604083018551613fb3565b602084015161448c6060840182613fb3565b50604084015161449f6080840182613fb3565b5060608401516144b260a0840182613fb3565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152614523610200870185614008565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526145628287614008565b838b015196508489820301868a015261457b8188614008565b955050808a0151955050505080858303016101e08601525061459d8183614008565b84810360208601526142518187614008565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b8181101561461057835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016145dc565b50909695505050505050565b60405181810167ffffffffffffffff8111828210171561463b57600080fd5b604052919050565b600067ffffffffffffffff821115614659578081fd5b5060209081020190565b600067ffffffffffffffff821115614679578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156146c05781810151838201526020016146a8565b838111156146cf576000848401525b50505050565b600481106146df57fe5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146146df57600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146146df57600080fd5b80600f0b81146146df57600080fdfea365627a7a72315820b6fbcf4008958c944ebfec299da165bd697cf68b9711b57b06ab81852a3933ff6c6578706572696d656e74616cf564736f6c63430005110040"
},
"deployedBytecode": {
"object": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806368be3cf2116100b2578063a2c28d4b11610081578063c7f7142e11610066578063c7f7142e1461027b578063e68248f71461029b578063e9a8e442146102ae57610136565b8063a2c28d4b14610255578063abffc7611461026857610136565b806368be3cf2146101fc5780636dd6b78d1461021c5780639209483b1461022f5780639f76ad351461024257610136565b80634703a7e61161010957806358306ba0116100ee57806358306ba0146101c357806360ee052a146101d657806364ee6ade146101e957610136565b80634703a7e61461019d5780634cb8e253146101b057610136565b80630cc6600b1461013b5780632d753aa41461016457806339b085ad1461017757806340bc03ae1461018a575b600080fd5b61014e610149366004613839565b6102c1565b60405161015b919061435f565b60405180910390f35b61014e610172366004613740565b61033b565b61014e610185366004613b5b565b610531565b61014e610198366004613eaa565b6107ee565b61014e6101ab366004613839565b6109a6565b61014e6101be366004613839565b610b82565b61014e6101d13660046137c6565b610cb5565b61014e6101e4366004613839565b610d4c565b61014e6101f7366004613839565b611001565b61020f61020a366004613aef565b6111c7565b60405161015b91906142e1565b61014e61022a366004613839565b61130d565b61014e61023d366004613eaa565b6115b5565b61014e6102503660046137c6565b6117e9565b61014e6102633660046137c6565b6119ed565b61014e610276366004613999565b611a53565b61028e6102893660046136f6565b611c3e565b60405161015b91906140d5565b61014e6102a9366004613999565b611d78565b61014e6102bc366004613b5b565b611f4b565b60606102cd8385611fee565b6103316040518060600160405280856040516020016102ec91906140d5565b60405160208183030381529060405281526020018660405160200161031191906140d5565b6040516020818303038152906040528152602001612061815250836121d9565b90505b9392505050565b60606000825190508060405190808252806020026020018201604052801561036d578160200160208202803883390190505b50915073ffffffffffffffffffffffffffffffffffffffff87166103915750610528565b60005b8181101561052557600060608973ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff16636e79e133905060e01b8b8b8b8b89815181106103ec57fe5b602002602001015160405160240161040794939291906141a1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161049091906140b9565b6000604051808303818686fa925050503d80600081146104cc576040519150601f19603f3d011682016040523d82523d6000602084013e6104d1565b606091505b509092509050600082156104fa57818060200190516104f39190810190613d6e565b9050610502565b505050610525565b8086858151811061050f57fe5b6020908102919091010152505050600101610394565b50505b95945050505050565b6060835160405190808252806020026020018201604052801561055e578160200160208202803883390190505b50905060005b845181146107e65783818151811061057857fe5b602002602001015151600014806105a6575084818151811061059657fe5b6020026020010151608001516000145b806105c857508481815181106105b857fe5b602002602001015160a001516000145b156105ec5760008282815181106105db57fe5b6020026020010181815250506107de565b600060608473ffffffffffffffffffffffffffffffffffffffff166207a1208673ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b89868151811061063857fe5b602002602001015189878151811061064c57fe5b6020026020010151604051602401610665929190614466565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516106ee91906140b9565b6000604051808303818686fa925050503d806000811461072a576040519150601f19603f3d011682016040523d82523d6000602084013e61072f565b606091505b50915091508161075a57600084848151811061074757fe5b60200260200101818152505050506107de565b610762613533565b600080838060200190516107799190810190613f46565b9194509250905060038351600681111561078f57fe5b14158061079a575080155b156107be5760008787815181106107ad57fe5b6020026020010181815250506107d8565b818787815181106107cb57fe5b6020026020010181815250505b50505050505b600101610564565b509392505050565b606060008251905080604051908082528060200260200182016040528015610820578160200160208202803883390190505b50915060005b8181101561099c5760006060886000015173ffffffffffffffffffffffffffffffffffffffff16620927c08a602001518a8a8a888151811061086457fe5b602002602001015160405160240161087e939291906143a1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161090791906140b9565b6000604051808303818686fa925050503d8060008114610943576040519150601f19603f3d011682016040523d82523d6000602084013e610948565b606091505b50909250905060008215610971578180602001905161096a9190810190613d6e565b9050610979565b50505061099c565b8086858151811061098657fe5b6020908102919091010152505050600101610826565b5050949350505050565b60606109b28385611fee565b81516040805182815260208084028201019091528180156109dd578160200160208202803883390190505b50915060005b81811015610b7957600060606109f76123ae565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a8881518110610a4157fe5b6020026020010151604051602401610a5b939291906141d8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610ae491906140b9565b6000604051808303818686fa925050503d8060008114610b20576040519150601f19603f3d011682016040523d82523d6000602084013e610b25565b606091505b50909250905060008215610b4e5781806020019051610b479190810190613d6e565b9050610b56565b505050610b79565b80868581518110610b6357fe5b60209081029190910101525050506001016109e3565b50509392505050565b6060610b8e8385611fee565b8151604080518281526020808402820101909152818015610bb9578160200160208202803883390190505b5091506000610bc66123c6565b90506000805b83811015610caa578273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161480610c3957508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b15610c6357610c5c8888888481518110610c4f57fe5b60200260200101516123de565b9150610c8a565b610c748884888481518110610c4f57fe5b91508115610c8a57610c878388846123de565b91505b81858281518110610c9757fe5b6020908102919091010152600101610bcc565b505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610d1c57508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610d2657610d44565b6060610d33868585611001565b9050610d40848683611001565b9150505b949350505050565b6060610d588385611fee565b8151604080518281526020808402820101909152818015610d83578160200160208202803883390190505b5091506000610d906123c6565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610dd057610dcb86612bfe565b610dd3565b60005b90506000610ddf6123c6565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e1f57610e1a86612bfe565b610e22565b60005b905060005b83811015610caa576001610e396123c6565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610ed0578651610eaf9085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610ea257fe5b6020026020010151612c90565b878481518110610ebb57fe5b60200260200101819350828152505050610fed565b610ed86123c6565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610f41578651610eaf9084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610ea257fe5b8651600090610f7a9085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610ea257fe5b925090508015610fd057610faf857f2640f62c0000000000000000000000000000000000000000000000000000000083612c90565b888581518110610fbb57fe5b60200260200101819450828152505050610feb565b6000878481518110610fde57fe5b6020026020010181815250505b505b80610ff85750610caa565b50600101610e27565b606061100d8385611fee565b8151604080518281526020808402820101909152818015611038578160200160208202803883390190505b50915060005b81811015610b7957600060606110526123ae565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a888151811061109c57fe5b60200260200101516040516024016110b6939291906141d8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161113f91906140b9565b6000604051808303818686fa925050503d806000811461117b576040519150601f19603f3d011682016040523d82523d6000602084013e611180565b606091505b50909250905060008215610b4e57818060200190516111a29190810190613d6e565b9050808685815181106111b157fe5b602090810291909101015250505060010161103e565b6040805182815260208084028201019091526060908280156111fd57816020015b60608152602001906001900390816111e85790505b50905060005b80831461130657600060603086868581811061121b57fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261125557600080fd5b9091016020810191503567ffffffffffffffff81111561127457600080fd5b3681900382131561128457600080fd5b6040516112929291906140a9565b600060405180830381855afa9150503d80600081146112cd576040519150601f19603f3d011682016040523d82523d6000602084013e6112d2565b606091505b5091509150816112e457805160208201fd5b808484815181106112f157fe5b60209081029190910101525050600101611203565b5092915050565b60606113198385611fee565b8151604080518281526020808402820101909152818015611344578160200160208202803883390190505b50915060006113516123c6565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146113915761138c86612bfe565b611394565b60005b905060006113a06123c6565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146113e0576113db86612bfe565b6113e3565b60005b905060005b83811015610caa5760016113fa6123c6565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156114845786516114639085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610ea257fe5b87848151811061146f57fe5b602002602001018193508281525050506115a1565b61148c6123c6565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156114f55786516114639084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610ea257fe5b865160009061152e9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610ea257fe5b92509050801561158457611563847fcd7724c30000000000000000000000000000000000000000000000000000000083612c90565b88858151811061156f57fe5b6020026020010181945082815250505061159f565b600087848151811061159257fe5b6020026020010181815250505b505b806115ac5750610caa565b506001016113e8565b60408401516060907fffffffff000000000000000000000000000000000000000000000000000000001661164f57604080516060810190915261164890806116018689608084016143bf565b604051602081830303815290604052815260200186886040516020016116289291906143bf565b6040516020818303038152906040528152602001612dd9815250836121d9565b9050610d44565b815160408051828152602080840282010190915281801561167a578160200160208202803883390190505b50915060005b8181101561099c5760006060886000015173ffffffffffffffffffffffffffffffffffffffff16620927c08a604001518a8a8a88815181106116be57fe5b60200260200101516040516024016116d8939291906143a1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161176191906140b9565b6000604051808303818686fa925050503d806000811461179d576040519150601f19603f3d011682016040523d82523d6000602084013e6117a2565b606091505b5090925090506000821561097157818060200190516117c49190810190613d6e565b9050808685815181106117d357fe5b6020908102919091010152505050600101611680565b60606000825190508060405190808252806020026020018201604052801561181b578160200160208202803883390190505b509150600061182b878787611c3e565b905073ffffffffffffffffffffffffffffffffffffffff81166118505750610d449050565b60005b828110156119e257600060608373ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b88815181106118aa57fe5b60200260200101516040516024016118c4939291906141d8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161194d91906140b9565b6000604051808303818686fa925050503d8060008114611989576040519150601f19603f3d011682016040523d82523d6000602084013e61198e565b606091505b509092509050600082156119b757818060200190516119b09190810190613d6e565b90506119bf565b5050506119e2565b808785815181106119cc57fe5b6020908102919091010152505050600101611853565b505050949350505050565b6040805160608181019092526105289080611a0c86896080840161412f565b60405160208183030381529060405281526020018688604051602001611a3392919061412f565b6040516020818303038152906040528152602001612f70815250836121d9565b606060008251905080604051908082528060200260200182016040528015611a85578160200160208202803883390190505b50915060005b81811015611c365760006060611a9f612fea565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b888681518110611ae757fe5b60200260200101518a604051602401611b019291906145b8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611b8a91906140b9565b6000604051808303818686fa925050503d8060008114611bc6576040519150601f19603f3d011682016040523d82523d6000602084013e611bcb565b606091505b50909250905060008215611c0b5781806020019051611bed9190810190613a5c565b600189510381518110611bfc57fe5b60200260200101519050611c13565b505050611c36565b80868581518110611c2057fe5b6020908102919091010152505050600101611a8b565b505092915050565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611c79908690869060240161412f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611d0191906140b9565b600060405180830381855afa9150503d8060008114611d3c576040519150601f19603f3d011682016040523d82523d6000602084013e611d41565b606091505b5091509150818015611d54575080516020145b15611d6e57611d6481600c613002565b9350505050610334565b5050509392505050565b606060008251905080604051908082528060200260200182016040528015611daa578160200160208202803883390190505b50915060005b81811015611c365760006060611dc4612fea565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611e0c57fe5b60200260200101518a604051602401611e269291906145b8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611eaf91906140b9565b6000604051808303818686fa925050503d8060008114611eeb576040519150601f19603f3d011682016040523d82523d6000602084013e611ef0565b606091505b50909250905060008215611c0b5781806020019051611f129190810190613a5c565b600081518110611f1e57fe5b6020026020010151905080868581518110611f3557fe5b6020908102919091010152505050600101611db0565b6060611f58848484610531565b905060005b84518110156107e657818181518110611f7257fe5b6020026020010151600014611fe657611fcd828281518110611f9057fe5b6020026020010151868381518110611fa457fe5b602002602001015160a00151878481518110611fbc57fe5b602002602001015160800151613047565b828281518110611fd957fe5b6020026020010181815250505b600101611f5d565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561205d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612054906143d7565b60405180910390fd5b5050565b60008060603073ffffffffffffffffffffffffffffffffffffffff16634cb8e25360e01b8780602001905161209991908101906136a1565b878060200190516120ad91908101906136a1565b6120b688613089565b6040516024016120c8939291906140f6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161215191906140b9565b600060405180830381855afa9150503d806000811461218c576040519150601f19603f3d011682016040523d82523d6000602084013e612191565b606091505b5091509150816121a657600092505050610334565b808060200190516121ba9190810190613a5c565b6000815181106121c657fe5b6020026020010151925050509392505050565b60608151604051908082528060200260200182016040528015612206578160200160208202803883390190505b509050815160001415612218576123a8565b6000612249846000015185602001518560008151811061223457fe5b6020026020010151876040015163ffffffff16565b90508061225657506123a8565b60006122738560200151866000015184886040015163ffffffff16565b90508061228257506123a89050565b60005b84518110156123a45760005b6005811015612366576122b88683815181106122a957fe5b60200260200101518486613047565b93506122c961271561271086613047565b935060006122e888602001518960000151878b6040015163ffffffff16565b9050806122f55750612366565b80935086838151811061230457fe5b6020026020010151841061235d57600087848151811061232057fe5b602002602001015161271089868151811061233757fe5b60200260200101518703028161234957fe5b0490506005811161235b575050612366565b505b50600101612291565b5061238585828151811061237657fe5b60200260200101518385613047565b84828151811061239157fe5b6020908102919091010152600101612285565b5050505b92915050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b60008060006123eb6130ca565b9150915060608173ffffffffffffffffffffffffffffffffffffffff16633d3dc52c6124156123c6565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161461244d578861244f565b875b6040518263ffffffff1660e01b815260040161246b91906140d5565b60006040518083038186803b15801561248357600080fd5b505afa158015612497573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526124dd9190810190613a5c565b604080516000808252602082019092529192505b8251811015612796576040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b90612560907331e085afd48a1d6e51cc193153d625e8f0514c7f906004016140d5565b60206040518083038186803b15801561257857600080fd5b505afa15801561258c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125b09190810190613d6e565b8382815181106125bc57fe5b6020026020010151148061269757506040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b90612631907310908c875d865c66f271f5d3949848971c9595c9906004016140d5565b60206040518083038186803b15801561264957600080fd5b505afa15801561265d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126819190810190613d6e565b83828151811061268d57fe5b6020026020010151145b8061276957506040517f106e9a4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063106e9a4b9061270390731e158c0e93c30d24e918ef83d1e0be23595c3c0f906004016140d5565b60206040518083038186803b15801561271b57600080fd5b505afa15801561272f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127539190810190613d6e565b83828151811061275f57fe5b6020026020010151145b1561278e5761278b8284838151811061277e57fe5b60200260200101516131fe565b91505b6001016124f1565b5060606127a16123c6565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156128b8578473ffffffffffffffffffffffffffffffffffffffff166381efcbdd89600285600060405190808252806020026020018201604052801561281f578160200160208202803883390190505b506040518563ffffffff1660e01b815260040161283f949392919061425c565b60006040518083038186803b15801561285757600080fd5b505afa15801561286b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526128b19190810190613d86565b9050612998565b8473ffffffffffffffffffffffffffffffffffffffff166381efcbdd8a6002856000604051908082528060200260200182016040528015612903578160200160208202803883390190505b506040518563ffffffff1660e01b8152600401612923949392919061425c565b60006040518083038186803b15801561293b57600080fd5b505afa15801561294f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526129959190810190613d86565b90505b600060606129a4613294565b73ffffffffffffffffffffffffffffffffffffffff166216e3607f418436bc000000000000000000000000000000000000000000000000000000006129e76123c6565b73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612a1f578d612a35565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b612a3d6123c6565b73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612a75578d612a8b565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b8d600089604051602401612aa3959493929190614209565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051612b2c91906140b9565b6000604051808303818686fa925050503d8060008114612b68576040519150601f19603f3d011682016040523d82523d6000602084013e612b6d565b606091505b50909250905060008215612b965781806020019051612b8f9190810190613d6e565b9050612ba7565b600098505050505050505050610334565b6000612bb28c6132ac565b60ff1690506000612bc28e6132ac565b60ff169050670de0b6b3a764000081600a0a83600a0a8e86020281612be357fe5b0481612beb57fe5b049e9d5050505050505050505050505050565b6000612c086132b7565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b8152600401612c4091906140d5565b60206040518083038186803b158015612c5857600080fd5b505afa158015612c6c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123a891908101906136a1565b60008073ffffffffffffffffffffffffffffffffffffffff8516612cb357612dd1565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f08686604051602401612ce291906145af565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051612d6b91906140b9565b6000604051808303818686fa925050503d8060008114612da7576040519150601f19603f3d011682016040523d82523d6000602084013e612dac565b606091505b5090925090508115612dcf5780806020019051612dcc9190810190613d6e565b92505b505b935093915050565b600080612de4613555565b85806020019051612df89190810190613e0f565b91509150600085806020019051612e129190810190613df3565b905060006060307f40bc03ae00000000000000000000000000000000000000000000000000000000858786612e468c613089565b604051602401612e599493929190614434565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051612ee291906140b9565b600060405180830381855afa9150503d8060008114612f1d576040519150601f19603f3d011682016040523d82523d6000602084013e612f22565b606091505b509150915081612f3a57600095505050505050610334565b80806020019051612f4e9190810190613a5c565b600081518110612f5a57fe5b6020026020010151955050505050509392505050565b600080600085806020019051612f8991908101906136bd565b91509150600085806020019051612fa391908101906136a1565b905060006060307f9f76ad3500000000000000000000000000000000000000000000000000000000858786612fd78c613089565b604051602401612e599493929190614156565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b600081601401835110156130285761302861302360048551856014016132cf565b613374565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b60006103318361307d61306182600163ffffffff61337c16565b613071888763ffffffff61339b16565b9063ffffffff6133cc16565b9063ffffffff6133e816565b6040805160018082528183019092526060916020808301908038833901905050905081816000815181106130b957fe5b602002602001018181525050919050565b6000806130d5613294565b73ffffffffffffffffffffffffffffffffffffffff1663b78b842d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561311a57600080fd5b505afa15801561312e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061315291908101906136a1565b73ffffffffffffffffffffffffffffffffffffffff1663c3a2a93a6040518163ffffffff1660e01b815260040160006040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526131f19190810190613899565b5091955093505050509091565b6060825160010160405190808252806020026020018201604052801561322e578160200160208202803883390190505b50905060005b83518110156132705783818151811061324957fe5b602002602001015182828151811061325d57fe5b6020908102919091010152600101613234565b50818160018351038151811061328257fe5b60200260200101818152505092915050565b739aab3f75489902f3a48495025729a0af77d4b11e90565b60006123a882613412565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b6060632800659560e01b8484846040516024016132ee93929190614393565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b60008282111561339557613395613023600285856134e3565b50900390565b6000826133aa575060006123a8565b828202828482816133b757fe5b041461033457610334613023600186866134e3565b60008282018381101561033457610334613023600086866134e3565b6000816133fe576133fe613023600385856134e3565b600082848161340957fe5b04949350505050565b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce5670000000000000000000000000000000000000000000000000000000081525060405161347691906140b9565b600060405180830381855afa9150503d80600081146134b1576040519150601f19603f3d011682016040523d82523d6000602084013e6134b6565b606091505b50915091508180156134c9575080516020145b156134dc576134d9816000613502565b92505b5050919050565b606063e946c1bb60e01b8484846040516024016132ee93929190614372565b600061033483836000816020018351101561352a5761352a61302360058551856020016132cf565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b604080516060810182526000808252602082018190529181019190915290565b80356123a8816146e2565b600082601f830112613590578081fd5b81356135a361359e82614643565b61461c565b8181529150602080830190840160005b838110156135e0576135cb8760208435890101613653565b835260209283019291909101906001016135b3565b5050505092915050565b600082601f8301126135fa578081fd5b813561360861359e82614643565b81815291506020808301908481018184028601820187101561362957600080fd5b60005b848110156136485781358452928201929082019060010161362c565b505050505092915050565b600082601f830112613663578081fd5b813561367161359e82614663565b915080825283602082850101111561368857600080fd5b8060208401602084013760009082016020015292915050565b6000602082840312156136b2578081fd5b8151610334816146e2565b600080604083850312156136cf578081fd5b82516136da816146e2565b60208401519092506136eb816146e2565b809150509250929050565b60008060006060848603121561370a578081fd5b8335613715816146e2565b92506020840135613725816146e2565b91506040840135613735816146e2565b809150509250925092565b600080600080600060a08688031215613757578283fd5b8535613762816146e2565b94506020860135613772816146e2565b93506040860135613782816146e2565b92506060860135613792816146e2565b9150608086013567ffffffffffffffff8111156137ad578182fd5b6137b9888289016135ea565b9150509295509295909350565b600080600080608085870312156137db578182fd5b84356137e6816146e2565b935060208501356137f6816146e2565b92506040850135613806816146e2565b9150606085013567ffffffffffffffff811115613821578182fd5b61382d878288016135ea565b91505092959194509250565b60008060006060848603121561384d578081fd5b8335613858816146e2565b92506020840135613868816146e2565b9150604084013567ffffffffffffffff811115613883578182fd5b61388f868287016135ea565b9150509250925092565b60008060008060008060c087890312156138b1578384fd5b86516138bc816146e2565b809650506020808801516138cf816146e2565b60408901519096506138e0816146e2565b60608901519095506138f1816146e2565b6080890151909450613902816146e2565b60a089015190935067ffffffffffffffff81111561391e578283fd5b8089018a601f82011261392f578384fd5b8051915061393f61359e83614643565b82815283810190828501858502840186018e101561395b578687fd5b8693505b84841015613986578051613972816146e2565b83526001939093019291850191850161395f565b5080955050505050509295509295509295565b600080604083850312156139ab578182fd5b823567ffffffffffffffff808211156139c2578384fd5b81850186601f8201126139d3578485fd5b803592506139e361359e84614643565b80848252602080830192508084018a828389028701011115613a03578889fd5b8894505b86851015613a2e578035613a1a816146e2565b845260019490940193928101928101613a07565b509096508701359350505080821115613a45578283fd5b50613a52858286016135ea565b9150509250929050565b60006020808385031215613a6e578182fd5b825167ffffffffffffffff811115613a84578283fd5b80840185601f820112613a95578384fd5b80519150613aa561359e83614643565b8281528381019082850185850284018601891015613ac1578687fd5b8693505b84841015613ae3578051835260019390930192918501918501613ac5565b50979650505050505050565b60008060208385031215613b01578182fd5b823567ffffffffffffffff80821115613b18578384fd5b81850186601f820112613b29578485fd5b8035925081831115613b39578485fd5b8660208085028301011115613b4c578485fd5b60200196919550909350505050565b600080600060608486031215613b6f578081fd5b67ffffffffffffffff8085351115613b85578182fd5b8435850186601f820112613b97578283fd5b613ba461359e8235614643565b8135815260208082019190808401865b8535811015613d3157813586016101c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828f03011215613bf3578889fd5b613bfe6101c061461c565b613c0a8e868401613575565b8152613c198e60408401613575565b85820152613c2a8e60608401613575565b6040820152613c3c8e60808401613575565b606082015260a0820135608082015260c082013560a082015260e082013560c082015261010082013560e082015261012082013561010082015261014082013561012082015261016082013589811115613c94578a8bfd5b613ca28f8783860101613653565b6101408301525061018082013589811115613cbb578a8bfd5b613cc98f8783860101613653565b610160830152506101a082013589811115613ce2578a8bfd5b613cf08f8783860101613653565b610180830152506101c082013589811115613d09578a8bfd5b613d178f8783860101613653565b6101a0830152508652509382019390820190600101613bb4565b509197508801359250505081811115613d48578283fd5b613d5487828801613580565b93505050613d658560408601613575565b90509250925092565b600060208284031215613d7f578081fd5b5051919050565b600060208284031215613d97578081fd5b815167ffffffffffffffff811115613dad578182fd5b80830184601f820112613dbe578283fd5b80519150613dce61359e83614663565b828152856020848401011115613de2578384fd5b6105288360208301602085016146a5565b600060208284031215613e04578081fd5b815161033481614732565b60008060808385031215613e21578182fd5b8251613e2c81614732565b915060608385037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215613e5f578081fd5b613e69606061461c565b6020840151613e77816146e2565b81526040840151613e8781614704565b60208201526060840151613e9a81614704565b6040820152919491935090915050565b60008060008084860360c0811215613ec0578283fd5b6060811215613ecd578283fd5b50613ed8606061461c565b8535613ee3816146e2565b81526020860135613ef381614704565b60208201526040860135613f0681614704565b604082015293506060850135613f1b81614732565b92506080850135613f2b81614732565b915060a085013567ffffffffffffffff811115613821578182fd5b600080600083850360a0811215613f5b578182fd5b6060811215613f68578182fd5b50613f73606061461c565b845160078110613f81578283fd5b815260208581015190820152604080860151908201526060850151608086015191945092508015158114613735578182fd5b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015613ffe578151865260209586019590910190600101613fe0565b5093949350505050565b600081518084526140208160208601602086016146a5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805173ffffffffffffffffffffffffffffffffffffffff1682526020808201517fffffffff000000000000000000000000000000000000000000000000000000009081169184019190915260409182015116910152565b6000828483379101908152919050565b600082516140cb8184602087016146a5565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8086168352808516602084015250606060408301526105286060830184613fcd565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152808516604084015250608060608301526141976080830184613fcd565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260ff8416606083015260a0608083015261425160a0830184614008565b979650505050505050565b60006080820173ffffffffffffffffffffffffffffffffffffffff87168352614284866146d5565b60208381018790526080604085015285519182905285019060a0840190835b818110156142c15783518352602093840193909201916001016142a3565b505083810360608501526142d58186613fcd565b98975050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015614352577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452614340858351614008565b94509285019290850190600101614306565b5092979650505050505050565b6000602082526103346020830184613fcd565b6060810161437f856146d5565b938152602081019290925260409091015290565b606081016008851061437f57fe5b600f93840b81529190920b6020820152604081019190915260600190565b600f83900b8152608081016103346020830184614052565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b60006144408287614052565b84600f0b606083015283600f0b608083015260c060a083015261419760c0830184613fcd565b60006040825261447a604083018551613fb3565b602084015161448c6060840182613fb3565b50604084015161449f6080840182613fb3565b5060608401516144b260a0840182613fb3565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152614523610200870185614008565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a08388830301818901526145628287614008565b838b015196508489820301868a015261457b8188614008565b955050808a0151955050505080858303016101e08601525061459d8183614008565b84810360208601526142518187614008565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b8181101561461057835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016145dc565b50909695505050505050565b60405181810167ffffffffffffffff8111828210171561463b57600080fd5b604052919050565b600067ffffffffffffffff821115614659578081fd5b5060209081020190565b600067ffffffffffffffff821115614679578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156146c05781810151838201526020016146a8565b838111156146cf576000848401525b50505050565b600481106146df57fe5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146146df57600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146146df57600080fd5b80600f0b81146146df57600080fdfea365627a7a72315820b6fbcf4008958c944ebfec299da165bd697cf68b9711b57b06ab81852a3933ff6c6578706572696d656e74616cf564736f6c63430005110040"
}
}
},
"compiler": {
"name": "solc",
"version": "0.5.17+commit.d19bba13",
"settings": {
"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": {}
}