diff --git a/packages/asset-swapper/src/utils/market_operation_utils/index.ts b/packages/asset-swapper/src/utils/market_operation_utils/index.ts index 14730078d0..98c762f46a 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/index.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/index.ts @@ -77,10 +77,6 @@ export class MarketOperationUtils { } const _opts = { ...DEFAULT_GET_MARKET_ORDERS_OPTS, ...opts }; const [makerToken, takerToken] = getNativeOrderTokens(nativeOrders[0]); - const optionalSources = (this._liquidityProviderRegistry !== NULL_ADDRESS - ? [ERC20BridgeSource.LiquidityProvider] - : [] - ).concat(this._multiBridge !== NULL_ADDRESS ? [ERC20BridgeSource.MultiBridge] : []); // Call the sampler contract. const samplerPromise = this._sampler.executeAsync( @@ -94,7 +90,7 @@ export class MarketOperationUtils { ), // Get ETH -> maker token price. DexOrderSampler.ops.getMedianSellRate( - difference(FEE_QUOTE_SOURCES.concat(optionalSources), _opts.excludedSources), + difference(FEE_QUOTE_SOURCES.concat(this._optionalSources()), _opts.excludedSources), makerToken, this._wethAddress, ONE_ETHER, @@ -104,7 +100,7 @@ export class MarketOperationUtils { ), // Get sell quotes for taker -> maker. DexOrderSampler.ops.getSellQuotes( - difference(SELL_SOURCES.concat(optionalSources), _opts.excludedSources), + difference(SELL_SOURCES.concat(this._optionalSources()), _opts.excludedSources), makerToken, takerToken, getSampleAmounts(takerAmount, _opts.numSamples, _opts.sampleDistributionBase), @@ -163,10 +159,6 @@ export class MarketOperationUtils { } const _opts = { ...DEFAULT_GET_MARKET_ORDERS_OPTS, ...opts }; const [makerToken, takerToken] = getNativeOrderTokens(nativeOrders[0]); - const optionalSources = (this._liquidityProviderRegistry !== NULL_ADDRESS - ? [ERC20BridgeSource.LiquidityProvider] - : [] - ).concat(this._multiBridge !== NULL_ADDRESS ? [ERC20BridgeSource.MultiBridge] : []); // Call the sampler contract. const samplerPromise = this._sampler.executeAsync( // Get native order fillable amounts. @@ -179,7 +171,7 @@ export class MarketOperationUtils { ), // Get ETH -> taker token price. DexOrderSampler.ops.getMedianSellRate( - difference(FEE_QUOTE_SOURCES.concat(optionalSources), _opts.excludedSources), + difference(FEE_QUOTE_SOURCES.concat(this._optionalSources()), _opts.excludedSources), takerToken, this._wethAddress, ONE_ETHER, @@ -403,6 +395,12 @@ export class MarketOperationUtils { shouldBatchBridgeOrders: !!opts.shouldBatchBridgeOrders, }); } + + private _optionalSources(): ERC20BridgeSource[] { + return (this._liquidityProviderRegistry !== NULL_ADDRESS ? [ERC20BridgeSource.LiquidityProvider] : []).concat( + this._multiBridge !== NULL_ADDRESS ? [ERC20BridgeSource.MultiBridge] : [], + ); + } } // tslint:disable: max-file-line-count diff --git a/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts b/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts index a2f3ce1173..6863c2b5b0 100644 --- a/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts +++ b/packages/asset-swapper/src/utils/market_operation_utils/sampler_operations.ts @@ -524,3 +524,4 @@ export const samplerOperations = { }; }, }; +// tslint:disable max-file-line-count diff --git a/packages/contract-artifacts/CHANGELOG.json b/packages/contract-artifacts/CHANGELOG.json index 4fcb5ab269..fa3d6e3aa9 100644 --- a/packages/contract-artifacts/CHANGELOG.json +++ b/packages/contract-artifacts/CHANGELOG.json @@ -25,6 +25,10 @@ { "note": "Added `ERC20BridgeSampler.sampleSellsFromUniswapV2", "pr": 2595 + }, + { + "note": "Added `ERC20BridgeSampler.sampleSellsFromMultiBridge", + "pr": 2593 } ] }, diff --git a/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json b/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json index b414fffcc1..22e22e8e3a 100644 --- a/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json +++ b/packages/contract-artifacts/artifacts/ERC20BridgeSampler.json @@ -264,6 +264,21 @@ "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": [ @@ -374,7 +389,7 @@ "details": "Sample buy quotes from UniswapV2.", "params": { "makerTokenAmounts": "Maker token buy amount for each sample.", - "path": "Token route." + "path": "Token route. Should be takerToken -> makerToken." }, "return": "takerTokenAmounts Taker amounts sold at each maker token amount." }, @@ -426,6 +441,17 @@ }, "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": { @@ -438,7 +464,7 @@ "sampleSellsFromUniswapV2(address[],uint256[])": { "details": "Sample sell quotes from UniswapV2.", "params": { - "path": "Token route.", + "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." @@ -447,10 +473,10 @@ }, "evm": { "bytecode": { - "object": "0x60806040523480156200001157600080fd5b5060405162003ac838038062003ac883398101604081905262000034916200005a565b600080546001600160a01b0319166001600160a01b03929092169190911790556200008a565b6000602082840312156200006c578081fd5b81516001600160a01b038116811462000083578182fd5b9392505050565b613a2e806200009a6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806368be3cf2116100b25780639f76ad3511610081578063c7f7142e11610066578063c7f7142e1461024d578063d0eea06d1461026d578063e68248f7146102805761011b565b80639f76ad3514610227578063abffc7611461023a5761011b565b806368be3cf2146101ce5780636dd6b78d146101ee5780638b123a021461020157806398cdafba146102145761011b565b806358306ba0116100ee57806358306ba01461018257806359f515d01461019557806360ee052a146101a857806364ee6ade146101bb5761011b565b80631796fb8714610120578063354152a3146101495780634703a7e61461015c5780634cb8e2531461016f575b600080fd5b61013361012e366004612fd7565b610293565b60405161014091906136d0565b60405180910390f35b610133610157366004612fd7565b610464565b61013361016a366004612f05565b61061e565b61013361017d366004612f05565b6107fa565b610133610190366004612e0d565b610a14565b6101336101a3366004613144565b610aab565b6101336101b6366004612f05565b610b54565b6101336101c9366004612f05565b610e14565b6101e16101dc3660046130d8565b610fda565b6040516101409190613652565b6101336101fc366004612f05565b611119565b61013361020f366004613144565b6113c1565b610133610222366004612e80565b61169a565b610133610235366004612e0d565b6116d6565b610133610248366004613015565b6118da565b61026061025b366004612dc3565b611abd565b6040516101409190613529565b61013361027b366004612f65565b611bf8565b61013361028e366004613015565b611c29565b6060600082519050806040519080825280602002602001820160405280156102c5578160200160208202803883390190505b50915060005b8181101561045a57600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a888151811061032257fe5b602002602001015160405160240161033c93929190613713565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516103c5919061350d565b6000604051808303818686fa925050503d8060008114610401576040519150601f19603f3d011682016040523d82523d6000602084013e610406565b606091505b5090925090506000821561042f57818060200190516104289190810190613446565b9050610437565b50505061045a565b8086858151811061044457fe5b60209081029190910101525050506001016102cb565b5050949350505050565b606060008251905080604051908082528060200260200182016040528015610496578160200160208202803883390190505b50915060005b8181101561045a57600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a88815181106104f357fe5b602002602001015160405160240161050d93929190613713565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610596919061350d565b6000604051808303818686fa925050503d80600081146105d2576040519150601f19603f3d011682016040523d82523d6000602084013e6105d7565b606091505b5090925090506000821561042f57818060200190516105f99190810190613446565b90508086858151811061060857fe5b602090810291909101015250505060010161049c565b606061062a8385611dff565b8151604080518281526020808402820101909152818015610655578160200160208202803883390190505b50915060005b818110156107f1576000606061066f611e72565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a88815181106106b957fe5b60200260200101516040516024016106d3939291906135eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161075c919061350d565b6000604051808303818686fa925050503d8060008114610798576040519150601f19603f3d011682016040523d82523d6000602084013e61079d565b606091505b509092509050600082156107c657818060200190516107bf9190810190613446565b90506107ce565b5050506107f1565b808685815181106107db57fe5b602090810291909101015250505060010161065b565b50509392505050565b60606108068385611dff565b8151604080518281526020808402820101909152818015610831578160200160208202803883390190505b509150600061083e611e8a565b9050600080805b84811015610a08578373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614806108b257508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561094a576108d589898984815181106108c857fe5b6020026020010151611ea2565b909350915073ffffffffffffffffffffffffffffffffffffffff82167331e085afd48a1d6e51cc193153d625e8f0514c7f148061093b575073ffffffffffffffffffffffffffffffffffffffff8216731e158c0e93c30d24e918ef83d1e0be23595c3c0f145b1561094557600092505b6109e8565b61095b89858984815181106108c857fe5b909350915082156109e8576000610973858a86611ea2565b909450905073ffffffffffffffffffffffffffffffffffffffff83167331e085afd48a1d6e51cc193153d625e8f0514c7f1480156109dc57508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156109e657600093505b505b828682815181106109f557fe5b6020908102919091010152600101610845565b50505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610a7b57508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610a8557610aa3565b6060610a92868585610e14565b9050610a9f848683610e14565b9150505b949350505050565b6060610ab783836113c1565b905060005b8351811015610b4d57818181518110610ad157fe5b6020026020010151600014610b4557610b2c828281518110610aef57fe5b6020026020010151858381518110610b0357fe5b602002602001015160a00151868481518110610b1b57fe5b602002602001015160800151612216565b828281518110610b3857fe5b6020026020010181815250505b600101610abc565b5092915050565b6060610b608385611dff565b8151604080518281526020808402820101909152818015610b8b578160200160208202803883390190505b5091506000610b98611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610bd857610bd386612258565b610bdb565b60005b90506000610be7611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610c2757610c2286612258565b610c2a565b60005b905060005b83811015610e09576001610c41611e8a565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610cd8578651610cb79085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610caa57fe5b60200260200101516122f0565b878481518110610cc357fe5b60200260200101819350828152505050610df5565b610ce0611e8a565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610d49578651610cb79084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610caa57fe5b8651600090610d829085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610caa57fe5b925090508015610dd857610db7857f2640f62c00000000000000000000000000000000000000000000000000000000836122f0565b888581518110610dc357fe5b60200260200101819450828152505050610df3565b6000878481518110610de657fe5b6020026020010181815250505b505b80610e005750610e09565b50600101610c2f565b505050509392505050565b6060610e208385611dff565b8151604080518281526020808402820101909152818015610e4b578160200160208202803883390190505b50915060005b818110156107f15760006060610e65611e72565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a8881518110610eaf57fe5b6020026020010151604051602401610ec9939291906135eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610f52919061350d565b6000604051808303818686fa925050503d8060008114610f8e576040519150601f19603f3d011682016040523d82523d6000602084013e610f93565b606091505b509092509050600082156107c65781806020019051610fb59190810190613446565b905080868581518110610fc457fe5b6020908102919091010152505050600101610e51565b60408051828152602080840282010190915260609082801561101057816020015b6060815260200190600190039081610ffb5790505b50905060005b808314610b4d57600060603086868581811061102e57fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261106857600080fd5b9091016020810191503567ffffffffffffffff81111561108757600080fd5b3681900382131561109757600080fd5b6040516110a59291906134fd565b600060405180830381855afa9150503d80600081146110e0576040519150601f19603f3d011682016040523d82523d6000602084013e6110e5565b606091505b5091509150816110f757805160208201fd5b8084848151811061110457fe5b60209081029190910101525050600101611016565b60606111258385611dff565b8151604080518281526020808402820101909152818015611150578160200160208202803883390190505b509150600061115d611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461119d5761119886612258565b6111a0565b60005b905060006111ac611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146111ec576111e786612258565b6111ef565b60005b905060005b83811015610e09576001611206611e8a565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561129057865161126f9085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610caa57fe5b87848151811061127b57fe5b602002602001018193508281525050506113ad565b611298611e8a565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141561130157865161126f9084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610caa57fe5b865160009061133a9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610caa57fe5b9250905080156113905761136f847fcd7724c300000000000000000000000000000000000000000000000000000000836122f0565b88858151811061137b57fe5b602002602001018194508281525050506113ab565b600087848151811061139e57fe5b6020026020010181815250505b505b806113b85750610e09565b506001016111f4565b606082516040519080825280602002602001820160405280156113ee578160200160208202803883390190505b506000805491925073ffffffffffffffffffffffffffffffffffffffff909116905b845181146116925783818151811061142457fe5b60200260200101515160001480611452575084818151811061144257fe5b6020026020010151608001516000145b80611474575084818151811061146457fe5b602002602001015160a001516000145b1561149857600083828151811061148757fe5b60200260200101818152505061168a565b600060608373ffffffffffffffffffffffffffffffffffffffff166207a1208573ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b8986815181106114e457fe5b60200260200101518987815181106114f857fe5b602002602001015160405160240161151192919061378e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161159a919061350d565b6000604051808303818686fa925050503d80600081146115d6576040519150601f19603f3d011682016040523d82523d6000602084013e6115db565b606091505b5091509150816116065760008584815181106115f357fe5b602002602001018181525050505061168a565b61160e612bb0565b6000808380602001905161162591908101906133d9565b9194509250905060038351600681111561163b57fe5b141580611646575080155b1561166a57600088878151811061165957fe5b602002602001018181525050611684565b8188878151811061167757fe5b6020026020010181815250505b50505050505b600101611410565b505092915050565b60606116ca858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b612438565b90505b95945050505050565b606060008251905080604051908082528060200260200182016040528015611708578160200160208202803883390190505b5091506000611718878787611abd565b905073ffffffffffffffffffffffffffffffffffffffff811661173d5750610aa39050565b60005b828110156118cf57600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061179757fe5b60200260200101516040516024016117b1939291906135eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161183a919061350d565b6000604051808303818686fa925050503d8060008114611876576040519150601f19603f3d011682016040523d82523d6000602084013e61187b565b606091505b509092509050600082156118a4578180602001905161189d9190810190613446565b90506118ac565b5050506118cf565b808785815181106118b957fe5b6020908102919091010152505050600101611740565b505050949350505050565b60606000825190508060405190808252806020026020018201604052801561190c578160200160208202803883390190505b50915060005b8181101561169257600060606119266125ff565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b88868151811061196e57fe5b60200260200101518a6040516024016119889291906138eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a11919061350d565b6000604051808303818686fa925050503d8060008114611a4d576040519150601f19603f3d011682016040523d82523d6000602084013e611a52565b606091505b50909250905060008215611a925781806020019051611a749190810190613346565b600189510381518110611a8357fe5b60200260200101519050611a9a565b505050611692565b80868581518110611aa757fe5b6020908102919091010152505050600101611912565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611af8908690869060240161354a565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611b80919061350d565b600060405180830381855afa9150503d8060008114611bbb576040519150601f19603f3d011682016040523d82523d6000602084013e611bc0565b606091505b5091509150818015611bd3575080516020145b15611bed57611be381600c612617565b9350505050611bf1565b5050505b9392505050565b60606116cd858585857f4cb8e253000000000000000000000000000000000000000000000000000000006000612438565b606060008251905080604051908082528060200260200182016040528015611c5b578160200160208202803883390190505b50915060005b818110156116925760006060611c756125ff565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611cbd57fe5b60200260200101518a604051602401611cd79291906138eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611d60919061350d565b6000604051808303818686fa925050503d8060008114611d9c576040519150601f19603f3d011682016040523d82523d6000602084013e611da1565b606091505b50909250905060008215611a925781806020019051611dc39190810190613346565b600189510381518110611dd257fe5b6020026020010151905080868581518110611de957fe5b6020908102919091010152505050600101611c61565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590613731565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000806000611eaf611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614611ee75785611efd565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b90506000611f09611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614611f415785611f57565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b90506000611f648861265c565b60ff1690506000611f748861265c565b60ff16905060006060611f85612667565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4f61ff8b00000000000000000000000000000000000000000000000000000000179052905173ffffffffffffffffffffffffffffffffffffffff929092169162030d40916120059161350d565b6000604051808303818686fa925050503d8060008114612041576040519150601f19603f3d011682016040523d82523d6000602084013e612046565b606091505b50915091508161206357506000965086955061220e945050505050565b6000818060200190516120799190810190612d7a565b90508073ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff16630c235d96905060e01b89898e60006040516024016120d0949392919061361c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051612159919061350d565b6000604051808303818686fa925050503d8060008114612195576040519150601f19603f3d011682016040523d82523d6000602084013e61219a565b606091505b50909350915060008084156121c657838060200190516121bd9190810190612d96565b925090506121dc565b506000995089985061220e975050505050505050565b670de0b6b3a764000087600a0a87600a0a8e850202816121f857fe5b048161220057fe5b049a50985050505050505050505b935093915050565b6000610aa38361224c61223082600163ffffffff61267f16565b612240888763ffffffff61269e16565b9063ffffffff6126cf16565b9063ffffffff6126eb16565b6000612262612715565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b815260040161229a9190613529565b60206040518083038186803b1580156122b257600080fd5b505afa1580156122c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122ea9190810190612d7a565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff85166123135761220e565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f0868660405160240161234291906138e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516123cb919061350d565b6000604051808303818686fa925050503d8060008114612407576040519150601f19603f3d011682016040523d82523d6000602084013e61240c565b606091505b509092509050811561242f578080602001905161242c9190810190613446565b92505b50935093915050565b60606124448688611dff565b845161244f576125f5565b6000806000875160405190808252806020026020018201604052801561247f578160200160208202803883390190505b5093506124a3898b8a60008151811061249457fe5b6020026020010151898961272d565b9250826124b357506125f5915050565b6124c08a8a85898961272d565b9150816124d057506125f5915050565b60005b88518110156125f05760005b88602001518110156125b2576125098a83815181106124fa57fe5b60200260200101518587612216565b945061252089600001516127100161271087612216565b945060006125318d8d888c8c61272d565b90508061253e57506125b2565b8094508a838151811061254d57fe5b602002602001015185106125a95760008b848151811061256957fe5b60200260200101518c858151811061257d57fe5b60200260200101518703612710028161259257fe5b0490508a6000015181116125a75750506125b2565b505b506001016124df565b506125d18982815181106125c257fe5b60200260200101518486612216565b8582815181106125dd57fe5b60209081029190910101526001016124d3565b505050505b9695505050505050565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b6000816014018351101561263d5761263d61263860048551856014016129e2565b612a87565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b60006122ea82612a8f565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b6000828211156126985761269861263860028585612b60565b50900390565b6000826126ad575060006122ea565b828202828482816126ba57fe5b0414611bf157611bf161263860018686612b60565b600082820183811015611bf157611bf161263860008686612b60565b6000816127015761270161263860038585612b60565b600082848161270c57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b604080516001808252818301909252600091606091829160208083019080388339019050509050858160008151811061276257fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e253000000000000000000000000000000000000000000000000000000001415612872576040517f4cb8e25300000000000000000000000000000000000000000000000000000000906127ee908a908a9085906024016135b2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152915061292b565b6040517f9f76ad3500000000000000000000000000000000000000000000000000000000906128ab9086908b908b908690602401613571565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff1684604051612954919061350d565b600060405180830381855afa9150503d806000811461298f576040519150601f19603f3d011682016040523d82523d6000602084013e612994565b606091505b5091509150816129ab5760009450505050506116cd565b808060200190516129bf9190810190613346565b6000815181106129cb57fe5b602002602001015194505050505095945050505050565b6060632800659560e01b848484604051602401612a0193929190613705565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051612af3919061350d565b600060405180830381855afa9150503d8060008114612b2e576040519150601f19603f3d011682016040523d82523d6000602084013e612b33565b606091505b5091509150818015612b46575080516020145b15612b5957612b56816000612b7f565b92505b5050919050565b606063e946c1bb60e01b848484604051602401612a01939291906136e3565b6000611bf1838360008160200183511015612ba757612ba761263860058551856020016129e2565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b80356122ea816139c6565b600082601f830112612bed578081fd5b8135612c00612bfb82613976565b61394f565b8181529150602080830190840160005b83811015612c3d57612c288760208435890101612cb0565b83526020928301929190910190600101612c10565b5050505092915050565b600082601f830112612c57578081fd5b8135612c65612bfb82613976565b818152915060208083019084810181840286018201871015612c8657600080fd5b60005b84811015612ca557813584529282019290820190600101612c89565b505050505092915050565b600082601f830112612cc0578081fd5b813567ffffffffffffffff811115612cd6578182fd5b612d0760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161394f565b9150808252836020828501011115612d1e57600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b81146122ea57600080fd5b600060408284031215612d5a578081fd5b612d64604061394f565b9050813581526020820135602082015292915050565b600060208284031215612d8b578081fd5b8151611bf1816139c6565b60008060408385031215612da8578081fd5b8251612db3816139c6565b6020939093015192949293505050565b600080600060608486031215612dd7578081fd5b8335612de2816139c6565b92506020840135612df2816139c6565b91506040840135612e02816139c6565b809150509250925092565b60008060008060808587031215612e22578182fd5b8435612e2d816139c6565b93506020850135612e3d816139c6565b92506040850135612e4d816139c6565b9150606085013567ffffffffffffffff811115612e68578182fd5b612e7487828801612c47565b91505092959194509250565b600080600080600060c08688031215612e97578283fd5b8535612ea2816139c6565b94506020860135612eb2816139c6565b93506040860135612ec2816139c6565b9250606086013567ffffffffffffffff811115612edd578182fd5b612ee988828901612c47565b925050612ef98760808801612d49565b90509295509295909350565b600080600060608486031215612f19578081fd5b8335612f24816139c6565b92506020840135612f34816139c6565b9150604084013567ffffffffffffffff811115612f4f578182fd5b612f5b86828701612c47565b9150509250925092565b60008060008060a08587031215612f7a578182fd5b8435612f85816139c6565b93506020850135612f95816139c6565b9250604085013567ffffffffffffffff811115612fb0578283fd5b612fbc87828801612c47565b925050612fcc8660608701612d49565b905092959194509250565b60008060008060808587031215612fec578182fd5b8435612ff7816139c6565b93506130068660208701612d37565b9250612e4d8660408701612d37565b60008060408385031215613027578182fd5b823567ffffffffffffffff8082111561303e578384fd5b81850186601f82011261304f578485fd5b8035925061305f612bfb84613976565b80848252602080830192508084018a82838902870101111561307f578889fd5b8894505b868510156130aa578035613096816139c6565b845260019490940193928101928101613083565b5090965087013593505050808211156130c1578283fd5b506130ce85828601612c47565b9150509250929050565b600080602083850312156130ea578182fd5b823567ffffffffffffffff80821115613101578384fd5b81850186601f820112613112578485fd5b8035925081831115613122578485fd5b8660208085028301011115613135578485fd5b60200196919550909350505050565b60008060408385031215613156578182fd5b67ffffffffffffffff808435111561316c578283fd5b8335840185601f82011261317e578384fd5b803561318c612bfb82613976565b81815260208082019190848101885b8581101561331757813587016101c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828f030112156131d9578a8bfd5b6131e46101c061394f565b6131f08e868401612bd2565b81526131ff8e60408401612bd2565b858201526132108e60608401612bd2565b60408201526132228e60808401612bd2565b606082015260a0820135608082015260c082013560a082015260e082013560c082015261010082013560e08201526101208201356101008201526101408201356101208201526101608201358a81111561327a578c8dfd5b6132888f8783860101612cb0565b610140830152506101808201358a8111156132a1578c8dfd5b6132af8f8783860101612cb0565b610160830152506101a08201358a8111156132c8578c8dfd5b6132d68f8783860101612cb0565b610180830152506101c08201358a8111156132ef578c8dfd5b6132fd8f8783860101612cb0565b6101a083015250865250938201939082019060010161319b565b5091975088013593505050508181111561332f578283fd5b61333b86828701612bdd565b925050509250929050565b60006020808385031215613358578182fd5b825167ffffffffffffffff81111561336e578283fd5b80840185601f82011261337f578384fd5b8051915061338f612bfb83613976565b82815283810190828501858502840186018910156133ab578687fd5b8693505b848410156133cd5780518352600193909301929185019185016133af565b50979650505050505050565b600080600083850360a08112156133ee578182fd5b60608112156133fb578182fd5b50613406606061394f565b845160078110613414578283fd5b815260208581015190820152604080860151908201526060850151608086015191945092508015158114612e02578182fd5b600060208284031215613457578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156134a957815186526020958601959091019060010161348b565b5093949350505050565b600081518084526134cb816020860160208601613996565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b6000825161351f818460208701613996565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152808516604084015250608060608301526116ca6080830184613478565b600073ffffffffffffffffffffffffffffffffffffffff8086168352808516602084015250606060408301526116cd6060830184613478565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152901515606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156136c3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526136b18583516134b3565b94509285019290850190600101613677565b5092979650505050505050565b600060208252611bf16020830184613478565b60608101600485106136f157fe5b938152602081019290925260409091015290565b60608101600885106136f157fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b6000604082526137a260408301855161345e565b60208401516137b4606084018261345e565b5060408401516137c7608084018261345e565b5060608401516137da60a084018261345e565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c09150610180828187015261384b6102008701856134b3565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a083888303018189015261388a82876134b3565b838b015196508489820301868a01526138a381886134b3565b955050808a0151955050505080858303016101e0860152506138c581836134b3565b84810360208601526138d781876134b3565b979650505050505050565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b8181101561394357835173ffffffffffffffffffffffffffffffffffffffff1683526020938401939092019160010161390f565b50909695505050505050565b60405181810167ffffffffffffffff8111828210171561396e57600080fd5b604052919050565b600067ffffffffffffffff82111561398c578081fd5b5060209081020190565b60005b838110156139b1578181015183820152602001613999565b838111156139c0576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146139e857600080fd5b5056fea365627a7a72315820d5a9bdc2a02db71e54295d8ab576d62ab872477c4a720123d70f8c4c178587fc6c6578706572696d656e74616cf564736f6c63430005110040" + "object": "0x60806040523480156200001157600080fd5b5060405162003d9a38038062003d9a83398101604081905262000034916200005a565b600080546001600160a01b0319166001600160a01b03929092169190911790556200008a565b6000602082840312156200006c578081fd5b81516001600160a01b038116811462000083578182fd5b9392505050565b613d00806200009a6000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806368be3cf2116100b25780639f76ad3511610081578063c7f7142e11610066578063c7f7142e1461027b578063d0eea06d1461029b578063e68248f7146102ae57610136565b80639f76ad3514610255578063abffc7611461026857610136565b806368be3cf2146101fc5780636dd6b78d1461021c5780638b123a021461022f57806398cdafba1461024257610136565b80634cb8e2531161010957806359f515d0116100ee57806359f515d0146101c357806360ee052a146101d657806364ee6ade146101e957610136565b80634cb8e2531461019d57806358306ba0146101b057610136565b80631796fb871461013b5780632d753aa414610164578063354152a3146101775780634703a7e61461018a575b600080fd5b61014e6101493660046133cd565b6102c1565b60405161015b91906139a2565b60405180910390f35b61014e61017236600461317d565b610492565b61014e6101853660046133cd565b610688565b61014e6101983660046132fb565b610842565b61014e6101ab3660046132fb565b610a1e565b61014e6101be366004613203565b610c38565b61014e6101d136600461353a565b610ccf565b61014e6101e43660046132fb565b610d78565b61014e6101f73660046132fb565b611038565b61020f61020a3660046134ce565b6111fe565b60405161015b9190613924565b61014e61022a3660046132fb565b61133d565b61014e61023d36600461353a565b6115e5565b61014e610250366004613276565b6118be565b61014e610263366004613203565b6118f8565b61014e61027636600461340b565b611afc565b61028e610289366004613133565b611cdf565b60405161015b91906137c4565b61014e6102a936600461335b565b611e1a565b61014e6102bc36600461340b565b611e4b565b6060600082519050806040519080825280602002602001820160405280156102f3578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a888151811061035057fe5b602002602001015160405160240161036a939291906139e5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516103f391906137a8565b6000604051808303818686fa925050503d806000811461042f576040519150601f19603f3d011682016040523d82523d6000602084013e610434565b606091505b5090925090506000821561045d578180602001905161045691908101906136e1565b9050610465565b505050610488565b8086858151811061047257fe5b60209081029190910101525050506001016102f9565b5050949350505050565b6060600082519050806040519080825280602002602001820160405280156104c4578160200160208202803883390190505b50915073ffffffffffffffffffffffffffffffffffffffff87166104e8575061067f565b60005b8181101561067c57600060608973ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff16636e79e133905060e01b8b8b8b8b898151811061054357fe5b602002602001015160405160240161055e949392919061384d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516105e791906137a8565b6000604051808303818686fa925050503d8060008114610623576040519150601f19603f3d011682016040523d82523d6000602084013e610628565b606091505b50909250905060008215610651578180602001905161064a91908101906136e1565b9050610659565b50505061067c565b8086858151811061066657fe5b60209081029190910101525050506001016104eb565b50505b95945050505050565b6060600082519050806040519080825280602002602001820160405280156106ba578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061071757fe5b6020026020010151604051602401610731939291906139e5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107ba91906137a8565b6000604051808303818686fa925050503d80600081146107f6576040519150601f19603f3d011682016040523d82523d6000602084013e6107fb565b606091505b5090925090506000821561045d578180602001905161081d91908101906136e1565b90508086858151811061082c57fe5b60209081029190910101525050506001016106c0565b606061084e8385612021565b8151604080518281526020808402820101909152818015610879578160200160208202803883390190505b50915060005b81811015610a155760006060610893612094565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a88815181106108dd57fe5b60200260200101516040516024016108f7939291906138bd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161098091906137a8565b6000604051808303818686fa925050503d80600081146109bc576040519150601f19603f3d011682016040523d82523d6000602084013e6109c1565b606091505b509092509050600082156109ea57818060200190516109e391908101906136e1565b90506109f2565b505050610a15565b808685815181106109ff57fe5b602090810291909101015250505060010161087f565b50509392505050565b6060610a2a8385612021565b8151604080518281526020808402820101909152818015610a55578160200160208202803883390190505b5091506000610a626120ac565b9050600080805b84811015610c2c578373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161480610ad657508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610b6e57610af98989898481518110610aec57fe5b60200260200101516120c4565b909350915073ffffffffffffffffffffffffffffffffffffffff82167331e085afd48a1d6e51cc193153d625e8f0514c7f1480610b5f575073ffffffffffffffffffffffffffffffffffffffff8216731e158c0e93c30d24e918ef83d1e0be23595c3c0f145b15610b6957600092505b610c0c565b610b7f8985898481518110610aec57fe5b90935091508215610c0c576000610b97858a866120c4565b909450905073ffffffffffffffffffffffffffffffffffffffff83167331e085afd48a1d6e51cc193153d625e8f0514c7f148015610c0057508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610c0a57600093505b505b82868281518110610c1957fe5b6020908102919091010152600101610a69565b50505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c9f57508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610ca957610cc7565b6060610cb6868585611038565b9050610cc3848683611038565b9150505b949350505050565b6060610cdb83836115e5565b905060005b8351811015610d7157818181518110610cf557fe5b6020026020010151600014610d6957610d50828281518110610d1357fe5b6020026020010151858381518110610d2757fe5b602002602001015160a00151868481518110610d3f57fe5b602002602001015160800151612438565b828281518110610d5c57fe5b6020026020010181815250505b600101610ce0565b5092915050565b6060610d848385612021565b8151604080518281526020808402820101909152818015610daf578160200160208202803883390190505b5091506000610dbc6120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610dfc57610df78661247a565b610dff565b60005b90506000610e0b6120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e4b57610e468661247a565b610e4e565b60005b905060005b8381101561102d576001610e656120ac565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610efc578651610edb9085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b6020026020010151612512565b878481518110610ee757fe5b60200260200101819350828152505050611019565b610f046120ac565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610f6d578651610edb9084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b8651600090610fa69085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b925090508015610ffc57610fdb857f2640f62c0000000000000000000000000000000000000000000000000000000083612512565b888581518110610fe757fe5b60200260200101819450828152505050611017565b600087848151811061100a57fe5b6020026020010181815250505b505b80611024575061102d565b50600101610e53565b505050509392505050565b60606110448385612021565b815160408051828152602080840282010190915281801561106f578160200160208202803883390190505b50915060005b81811015610a155760006060611089612094565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a88815181106110d357fe5b60200260200101516040516024016110ed939291906138bd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161117691906137a8565b6000604051808303818686fa925050503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b509092509050600082156109ea57818060200190516111d991908101906136e1565b9050808685815181106111e857fe5b6020908102919091010152505050600101611075565b60408051828152602080840282010190915260609082801561123457816020015b606081526020019060019003908161121f5790505b50905060005b808314610d7157600060603086868581811061125257fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261128c57600080fd5b9091016020810191503567ffffffffffffffff8111156112ab57600080fd5b368190038213156112bb57600080fd5b6040516112c9929190613798565b600060405180830381855afa9150503d8060008114611304576040519150601f19603f3d011682016040523d82523d6000602084013e611309565b606091505b50915091508161131b57805160208201fd5b8084848151811061132857fe5b6020908102919091010152505060010161123a565b60606113498385612021565b8151604080518281526020808402820101909152818015611374578160200160208202803883390190505b50915060006113816120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146113c1576113bc8661247a565b6113c4565b60005b905060006113d06120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146114105761140b8661247a565b611413565b60005b905060005b8381101561102d57600161142a6120ac565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156114b45786516114939085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b87848151811061149f57fe5b602002602001018193508281525050506115d1565b6114bc6120ac565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156115255786516114939084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b865160009061155e9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b9250905080156115b457611593847fcd7724c30000000000000000000000000000000000000000000000000000000083612512565b88858151811061159f57fe5b602002602001018194508281525050506115cf565b60008784815181106115c257fe5b6020026020010181815250505b505b806115dc575061102d565b50600101611418565b60608251604051908082528060200260200182016040528015611612578160200160208202803883390190505b506000805491925073ffffffffffffffffffffffffffffffffffffffff909116905b845181146118b65783818151811061164857fe5b60200260200101515160001480611676575084818151811061166657fe5b6020026020010151608001516000145b80611698575084818151811061168857fe5b602002602001015160a001516000145b156116bc5760008382815181106116ab57fe5b6020026020010181815250506118ae565b600060608373ffffffffffffffffffffffffffffffffffffffff166207a1208573ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b89868151811061170857fe5b602002602001015189878151811061171c57fe5b6020026020010151604051602401611735929190613a60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117be91906137a8565b6000604051808303818686fa925050503d80600081146117fa576040519150601f19603f3d011682016040523d82523d6000602084013e6117ff565b606091505b50915091508161182a57600085848151811061181757fe5b60200260200101818152505050506118ae565b611832612dd1565b600080838060200190516118499190810190613674565b9194509250905060038351600681111561185f57fe5b14158061186a575080155b1561188e57600088878151811061187d57fe5b6020026020010181815250506118a8565b8188878151811061189b57fe5b6020026020010181815250505b50505050505b600101611634565b505092915050565b60606118ee858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b61265a565b9695505050505050565b60606000825190508060405190808252806020026020018201604052801561192a578160200160208202803883390190505b509150600061193a878787611cdf565b905073ffffffffffffffffffffffffffffffffffffffff811661195f5750610cc79050565b60005b82811015611af157600060608373ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b88815181106119b957fe5b60200260200101516040516024016119d3939291906138bd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a5c91906137a8565b6000604051808303818686fa925050503d8060008114611a98576040519150601f19603f3d011682016040523d82523d6000602084013e611a9d565b606091505b50909250905060008215611ac65781806020019051611abf91908101906136e1565b9050611ace565b505050611af1565b80878581518110611adb57fe5b6020908102919091010152505050600101611962565b505050949350505050565b606060008251905080604051908082528060200260200182016040528015611b2e578160200160208202803883390190505b50915060005b818110156118b65760006060611b48612820565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b888681518110611b9057fe5b60200260200101518a604051602401611baa929190613bbd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c3391906137a8565b6000604051808303818686fa925050503d8060008114611c6f576040519150601f19603f3d011682016040523d82523d6000602084013e611c74565b606091505b50909250905060008215611cb45781806020019051611c9691908101906135e1565b600189510381518110611ca557fe5b60200260200101519050611cbc565b5050506118b6565b80868581518110611cc957fe5b6020908102919091010152505050600101611b34565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611d1a90869086906024016137e5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611da291906137a8565b600060405180830381855afa9150503d8060008114611ddd576040519150601f19603f3d011682016040523d82523d6000602084013e611de2565b606091505b5091509150818015611df5575080516020145b15611e0f57611e0581600c612838565b9350505050611e13565b5050505b9392505050565b606061067f858585857f4cb8e25300000000000000000000000000000000000000000000000000000000600061265a565b606060008251905080604051908082528060200260200182016040528015611e7d578160200160208202803883390190505b50915060005b818110156118b65760006060611e97612820565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611edf57fe5b60200260200101518a604051602401611ef9929190613bbd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611f8291906137a8565b6000604051808303818686fa925050503d8060008114611fbe576040519150601f19603f3d011682016040523d82523d6000602084013e611fc3565b606091505b50909250905060008215611cb45781806020019051611fe591908101906135e1565b600189510381518110611ff457fe5b602002602001015190508086858151811061200b57fe5b6020908102919091010152505050600101611e83565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208790613a03565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b60008060006120d16120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612109578561211f565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061212b6120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146121635785612179565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060006121868861287d565b60ff16905060006121968861287d565b60ff169050600060606121a7612888565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4f61ff8b00000000000000000000000000000000000000000000000000000000179052905173ffffffffffffffffffffffffffffffffffffffff929092169162061a8091612227916137a8565b6000604051808303818686fa925050503d8060008114612263576040519150601f19603f3d011682016040523d82523d6000602084013e612268565b606091505b509150915081612285575060009650869550612430945050505050565b60008180602001905161229b91908101906130ea565b90508073ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff16630c235d96905060e01b89898e60006040516024016122f294939291906138ee565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161237b91906137a8565b6000604051808303818686fa925050503d80600081146123b7576040519150601f19603f3d011682016040523d82523d6000602084013e6123bc565b606091505b50909350915060008084156123e857838060200190516123df9190810190613106565b925090506123fe565b5060009950899850612430975050505050505050565b670de0b6b3a764000087600a0a87600a0a8e8502028161241a57fe5b048161242257fe5b049a50985050505050505050505b935093915050565b6000610cc78361246e61245282600163ffffffff6128a016565b612462888763ffffffff6128bf16565b9063ffffffff6128f016565b9063ffffffff61290c16565b6000612484612936565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b81526004016124bc91906137c4565b60206040518083038186803b1580156124d457600080fd5b505afa1580156124e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061250c91908101906130ea565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff851661253557612430565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f086866040516024016125649190613bb4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516125ed91906137a8565b6000604051808303818686fa925050503d8060008114612629576040519150601f19603f3d011682016040523d82523d6000602084013e61262e565b606091505b5090925090508115612651578080602001905161264e91908101906136e1565b92505b50935093915050565b60606126668688612021565b8451612671576118ee565b600080600087516040519080825280602002602001820160405280156126a1578160200160208202803883390190505b5093506126c5898b8a6000815181106126b657fe5b6020026020010151898961294e565b9250826126d557506118ee915050565b6126e28a8a85898961294e565b9150816126f257506118ee915050565b60005b88518110156128125760005b88602001518110156127d45761272b8a838151811061271c57fe5b60200260200101518587612438565b945061274289600001516127100161271087612438565b945060006127538d8d888c8c61294e565b90508061276057506127d4565b8094508a838151811061276f57fe5b602002602001015185106127cb5760008b848151811061278b57fe5b60200260200101518c858151811061279f57fe5b6020026020010151870361271002816127b457fe5b0490508a6000015181116127c95750506127d4565b505b50600101612701565b506127f38982815181106127e457fe5b60200260200101518486612438565b8582815181106127ff57fe5b60209081029190910101526001016126f5565b505050509695505050505050565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b6000816014018351101561285e5761285e6128596004855185601401612c03565b612ca8565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600061250c82612cb0565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b6000828211156128b9576128b961285960028585612d81565b50900390565b6000826128ce5750600061250c565b828202828482816128db57fe5b0414611e1357611e1361285960018686612d81565b600082820183811015611e1357611e1361285960008686612d81565b6000816129225761292261285960038585612d81565b600082848161292d57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b604080516001808252818301909252600091606091829160208083019080388339019050509050858160008151811061298357fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e253000000000000000000000000000000000000000000000000000000001415612a93576040517f4cb8e2530000000000000000000000000000000000000000000000000000000090612a0f908a908a908590602401613884565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150612b4c565b6040517f9f76ad350000000000000000000000000000000000000000000000000000000090612acc9086908b908b90869060240161380c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff1684604051612b7591906137a8565b600060405180830381855afa9150503d8060008114612bb0576040519150601f19603f3d011682016040523d82523d6000602084013e612bb5565b606091505b509150915081612bcc57600094505050505061067f565b80806020019051612be091908101906135e1565b600081518110612bec57fe5b602002602001015194505050505095945050505050565b6060632800659560e01b848484604051602401612c22939291906139d7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051612d1491906137a8565b600060405180830381855afa9150503d8060008114612d4f576040519150601f19603f3d011682016040523d82523d6000602084013e612d54565b606091505b5091509150818015612d67575080516020145b15612d7a57612d77816000612da0565b92505b5050919050565b606063e946c1bb60e01b848484604051602401612c22939291906139b5565b6000611e13838360008160200183511015612dc857612dc86128596005855185602001612c03565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b803561250c81613c98565b600082601f830112612e0e578081fd5b8135612e21612e1c82613c48565b613c21565b8181529150602080830190840160005b83811015612e5e57612e498760208435890101612ed1565b83526020928301929190910190600101612e31565b5050505092915050565b600082601f830112612e78578081fd5b8135612e86612e1c82613c48565b818152915060208083019084810181840286018201871015612ea757600080fd5b60005b84811015612ec657813584529282019290820190600101612eaa565b505050505092915050565b600082601f830112612ee1578081fd5b813567ffffffffffffffff811115612ef7578182fd5b612f2860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613c21565b9150808252836020828501011115612f3f57600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b811461250c57600080fd5b600060408284031215612f7b578081fd5b612f856040613c21565b9050813581526020820135602082015292915050565b60006101c0808385031215612fae578182fd5b612fb781613c21565b915050612fc48383612df3565b8152612fd38360208401612df3565b6020820152612fe58360408401612df3565b6040820152612ff78360608401612df3565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561305957600080fd5b61306586838701612ed1565b8385015261016092508285013591508082111561308157600080fd5b61308d86838701612ed1565b838501526101809250828501359150808211156130a957600080fd5b6130b586838701612ed1565b838501526101a09250828501359150808211156130d157600080fd5b506130de85828601612ed1565b82840152505092915050565b6000602082840312156130fb578081fd5b8151611e1381613c98565b60008060408385031215613118578081fd5b825161312381613c98565b6020939093015192949293505050565b600080600060608486031215613147578081fd5b833561315281613c98565b9250602084013561316281613c98565b9150604084013561317281613c98565b809150509250925092565b600080600080600060a08688031215613194578283fd5b853561319f81613c98565b945060208601356131af81613c98565b935060408601356131bf81613c98565b925060608601356131cf81613c98565b9150608086013567ffffffffffffffff8111156131ea578182fd5b6131f688828901612e68565b9150509295509295909350565b60008060008060808587031215613218578182fd5b843561322381613c98565b9350602085013561323381613c98565b9250604085013561324381613c98565b9150606085013567ffffffffffffffff81111561325e578182fd5b61326a87828801612e68565b91505092959194509250565b600080600080600060c0868803121561328d578283fd5b853561329881613c98565b945060208601356132a881613c98565b935060408601356132b881613c98565b9250606086013567ffffffffffffffff8111156132d3578182fd5b6132df88828901612e68565b9250506132ef8760808801612f6a565b90509295509295909350565b60008060006060848603121561330f578081fd5b833561331a81613c98565b9250602084013561332a81613c98565b9150604084013567ffffffffffffffff811115613345578182fd5b61335186828701612e68565b9150509250925092565b60008060008060a08587031215613370578182fd5b843561337b81613c98565b9350602085013561338b81613c98565b9250604085013567ffffffffffffffff8111156133a6578283fd5b6133b287828801612e68565b9250506133c28660608701612f6a565b905092959194509250565b600080600080608085870312156133e2578182fd5b84356133ed81613c98565b93506133fc8660208701612f58565b92506132438660408701612f58565b6000806040838503121561341d578182fd5b823567ffffffffffffffff80821115613434578384fd5b81850186601f820112613445578485fd5b80359250613455612e1c84613c48565b80848252602080830192508084018a828389028701011115613475578889fd5b8894505b868510156134a057803561348c81613c98565b845260019490940193928101928101613479565b5090965087013593505050808211156134b7578283fd5b506134c485828601612e68565b9150509250929050565b600080602083850312156134e0578182fd5b823567ffffffffffffffff808211156134f7578384fd5b81850186601f820112613508578485fd5b8035925081831115613518578485fd5b866020808502830101111561352b578485fd5b60200196919550909350505050565b6000806040838503121561354c578182fd5b823567ffffffffffffffff80821115613563578384fd5b81850186601f820112613574578485fd5b80359250613584612e1c84613c48565b83815260208082019190838101885b878110156135bc576135aa8c848435890101612f9b565b85529382019390820190600101613593565b509197508801359450505050808211156135d4578283fd5b506134c485828601612dfe565b600060208083850312156135f3578182fd5b825167ffffffffffffffff811115613609578283fd5b80840185601f82011261361a578384fd5b8051915061362a612e1c83613c48565b8281528381019082850185850284018601891015613646578687fd5b8693505b8484101561366857805183526001939093019291850191850161364a565b50979650505050505050565b600080600083850360a0811215613689578182fd5b6060811215613696578182fd5b506136a16060613c21565b8451600781106136af578283fd5b815260208581015190820152604080860151908201526060850151608086015191945092508015158114613172578182fd5b6000602082840312156136f2578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015613744578151865260209586019590910190600101613726565b5093949350505050565b60008151808452613766816020860160208601613c68565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516137ba818460208701613c68565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152808516604084015250608060608301526118ee6080830184613713565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b600073ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261067f6060830184613713565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152901515606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613995577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261398385835161374e565b94509285019290850190600101613949565b5092979650505050505050565b600060208252611e136020830184613713565b60608101600485106139c357fe5b938152602081019290925260409091015290565b60608101600885106139c357fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b600060408252613a746040830185516136f9565b6020840151613a8660608401826136f9565b506040840151613a9960808401826136f9565b506060840151613aac60a08401826136f9565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152613b1d61020087018561374e565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a0838883030181890152613b5c828761374e565b838b015196508489820301868a0152613b75818861374e565b955050808a0151955050505080858303016101e086015250613b97818361374e565b8481036020860152613ba9818761374e565b979650505050505050565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b81811015613c1557835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101613be1565b50909695505050505050565b60405181810167ffffffffffffffff81118282101715613c4057600080fd5b604052919050565b600067ffffffffffffffff821115613c5e578081fd5b5060209081020190565b60005b83811015613c83578181015183820152602001613c6b565b83811115613c92576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613cba57600080fd5b5056fea365627a7a72315820add5b6ee6d228c1990759231f8d18b1a0dcbf1520bf55bf22f326cdae1d74ec66c6578706572696d656e74616cf564736f6c63430005110040" }, "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b506004361061011b5760003560e01c806368be3cf2116100b25780639f76ad3511610081578063c7f7142e11610066578063c7f7142e1461024d578063d0eea06d1461026d578063e68248f7146102805761011b565b80639f76ad3514610227578063abffc7611461023a5761011b565b806368be3cf2146101ce5780636dd6b78d146101ee5780638b123a021461020157806398cdafba146102145761011b565b806358306ba0116100ee57806358306ba01461018257806359f515d01461019557806360ee052a146101a857806364ee6ade146101bb5761011b565b80631796fb8714610120578063354152a3146101495780634703a7e61461015c5780634cb8e2531461016f575b600080fd5b61013361012e366004612fd7565b610293565b60405161014091906136d0565b60405180910390f35b610133610157366004612fd7565b610464565b61013361016a366004612f05565b61061e565b61013361017d366004612f05565b6107fa565b610133610190366004612e0d565b610a14565b6101336101a3366004613144565b610aab565b6101336101b6366004612f05565b610b54565b6101336101c9366004612f05565b610e14565b6101e16101dc3660046130d8565b610fda565b6040516101409190613652565b6101336101fc366004612f05565b611119565b61013361020f366004613144565b6113c1565b610133610222366004612e80565b61169a565b610133610235366004612e0d565b6116d6565b610133610248366004613015565b6118da565b61026061025b366004612dc3565b611abd565b6040516101409190613529565b61013361027b366004612f65565b611bf8565b61013361028e366004613015565b611c29565b6060600082519050806040519080825280602002602001820160405280156102c5578160200160208202803883390190505b50915060005b8181101561045a57600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a888151811061032257fe5b602002602001015160405160240161033c93929190613713565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516103c5919061350d565b6000604051808303818686fa925050503d8060008114610401576040519150601f19603f3d011682016040523d82523d6000602084013e610406565b606091505b5090925090506000821561042f57818060200190516104289190810190613446565b9050610437565b50505061045a565b8086858151811061044457fe5b60209081029190910101525050506001016102cb565b5050949350505050565b606060008251905080604051908082528060200260200182016040528015610496578160200160208202803883390190505b50915060005b8181101561045a57600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a88815181106104f357fe5b602002602001015160405160240161050d93929190613713565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610596919061350d565b6000604051808303818686fa925050503d80600081146105d2576040519150601f19603f3d011682016040523d82523d6000602084013e6105d7565b606091505b5090925090506000821561042f57818060200190516105f99190810190613446565b90508086858151811061060857fe5b602090810291909101015250505060010161049c565b606061062a8385611dff565b8151604080518281526020808402820101909152818015610655578160200160208202803883390190505b50915060005b818110156107f1576000606061066f611e72565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a88815181106106b957fe5b60200260200101516040516024016106d3939291906135eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161075c919061350d565b6000604051808303818686fa925050503d8060008114610798576040519150601f19603f3d011682016040523d82523d6000602084013e61079d565b606091505b509092509050600082156107c657818060200190516107bf9190810190613446565b90506107ce565b5050506107f1565b808685815181106107db57fe5b602090810291909101015250505060010161065b565b50509392505050565b60606108068385611dff565b8151604080518281526020808402820101909152818015610831578160200160208202803883390190505b509150600061083e611e8a565b9050600080805b84811015610a08578373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614806108b257508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561094a576108d589898984815181106108c857fe5b6020026020010151611ea2565b909350915073ffffffffffffffffffffffffffffffffffffffff82167331e085afd48a1d6e51cc193153d625e8f0514c7f148061093b575073ffffffffffffffffffffffffffffffffffffffff8216731e158c0e93c30d24e918ef83d1e0be23595c3c0f145b1561094557600092505b6109e8565b61095b89858984815181106108c857fe5b909350915082156109e8576000610973858a86611ea2565b909450905073ffffffffffffffffffffffffffffffffffffffff83167331e085afd48a1d6e51cc193153d625e8f0514c7f1480156109dc57508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156109e657600093505b505b828682815181106109f557fe5b6020908102919091010152600101610845565b50505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610a7b57508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610a8557610aa3565b6060610a92868585610e14565b9050610a9f848683610e14565b9150505b949350505050565b6060610ab783836113c1565b905060005b8351811015610b4d57818181518110610ad157fe5b6020026020010151600014610b4557610b2c828281518110610aef57fe5b6020026020010151858381518110610b0357fe5b602002602001015160a00151868481518110610b1b57fe5b602002602001015160800151612216565b828281518110610b3857fe5b6020026020010181815250505b600101610abc565b5092915050565b6060610b608385611dff565b8151604080518281526020808402820101909152818015610b8b578160200160208202803883390190505b5091506000610b98611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610bd857610bd386612258565b610bdb565b60005b90506000610be7611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610c2757610c2286612258565b610c2a565b60005b905060005b83811015610e09576001610c41611e8a565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610cd8578651610cb79085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610caa57fe5b60200260200101516122f0565b878481518110610cc357fe5b60200260200101819350828152505050610df5565b610ce0611e8a565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610d49578651610cb79084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610caa57fe5b8651600090610d829085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610caa57fe5b925090508015610dd857610db7857f2640f62c00000000000000000000000000000000000000000000000000000000836122f0565b888581518110610dc357fe5b60200260200101819450828152505050610df3565b6000878481518110610de657fe5b6020026020010181815250505b505b80610e005750610e09565b50600101610c2f565b505050509392505050565b6060610e208385611dff565b8151604080518281526020808402820101909152818015610e4b578160200160208202803883390190505b50915060005b818110156107f15760006060610e65611e72565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a8881518110610eaf57fe5b6020026020010151604051602401610ec9939291906135eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051610f52919061350d565b6000604051808303818686fa925050503d8060008114610f8e576040519150601f19603f3d011682016040523d82523d6000602084013e610f93565b606091505b509092509050600082156107c65781806020019051610fb59190810190613446565b905080868581518110610fc457fe5b6020908102919091010152505050600101610e51565b60408051828152602080840282010190915260609082801561101057816020015b6060815260200190600190039081610ffb5790505b50905060005b808314610b4d57600060603086868581811061102e57fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261106857600080fd5b9091016020810191503567ffffffffffffffff81111561108757600080fd5b3681900382131561109757600080fd5b6040516110a59291906134fd565b600060405180830381855afa9150503d80600081146110e0576040519150601f19603f3d011682016040523d82523d6000602084013e6110e5565b606091505b5091509150816110f757805160208201fd5b8084848151811061110457fe5b60209081029190910101525050600101611016565b60606111258385611dff565b8151604080518281526020808402820101909152818015611150578160200160208202803883390190505b509150600061115d611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461119d5761119886612258565b6111a0565b60005b905060006111ac611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146111ec576111e786612258565b6111ef565b60005b905060005b83811015610e09576001611206611e8a565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141561129057865161126f9085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610caa57fe5b87848151811061127b57fe5b602002602001018193508281525050506113ad565b611298611e8a565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141561130157865161126f9084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610caa57fe5b865160009061133a9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610caa57fe5b9250905080156113905761136f847fcd7724c300000000000000000000000000000000000000000000000000000000836122f0565b88858151811061137b57fe5b602002602001018194508281525050506113ab565b600087848151811061139e57fe5b6020026020010181815250505b505b806113b85750610e09565b506001016111f4565b606082516040519080825280602002602001820160405280156113ee578160200160208202803883390190505b506000805491925073ffffffffffffffffffffffffffffffffffffffff909116905b845181146116925783818151811061142457fe5b60200260200101515160001480611452575084818151811061144257fe5b6020026020010151608001516000145b80611474575084818151811061146457fe5b602002602001015160a001516000145b1561149857600083828151811061148757fe5b60200260200101818152505061168a565b600060608373ffffffffffffffffffffffffffffffffffffffff166207a1208573ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b8986815181106114e457fe5b60200260200101518987815181106114f857fe5b602002602001015160405160240161151192919061378e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161159a919061350d565b6000604051808303818686fa925050503d80600081146115d6576040519150601f19603f3d011682016040523d82523d6000602084013e6115db565b606091505b5091509150816116065760008584815181106115f357fe5b602002602001018181525050505061168a565b61160e612bb0565b6000808380602001905161162591908101906133d9565b9194509250905060038351600681111561163b57fe5b141580611646575080155b1561166a57600088878151811061165957fe5b602002602001018181525050611684565b8188878151811061167757fe5b6020026020010181815250505b50505050505b600101611410565b505092915050565b60606116ca858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b612438565b90505b95945050505050565b606060008251905080604051908082528060200260200182016040528015611708578160200160208202803883390190505b5091506000611718878787611abd565b905073ffffffffffffffffffffffffffffffffffffffff811661173d5750610aa39050565b60005b828110156118cf57600060608373ffffffffffffffffffffffffffffffffffffffff1662030d40600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b888151811061179757fe5b60200260200101516040516024016117b1939291906135eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161183a919061350d565b6000604051808303818686fa925050503d8060008114611876576040519150601f19603f3d011682016040523d82523d6000602084013e61187b565b606091505b509092509050600082156118a4578180602001905161189d9190810190613446565b90506118ac565b5050506118cf565b808785815181106118b957fe5b6020908102919091010152505050600101611740565b505050949350505050565b60606000825190508060405190808252806020026020018201604052801561190c578160200160208202803883390190505b50915060005b8181101561169257600060606119266125ff565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b88868151811061196e57fe5b60200260200101518a6040516024016119889291906138eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a11919061350d565b6000604051808303818686fa925050503d8060008114611a4d576040519150601f19603f3d011682016040523d82523d6000602084013e611a52565b606091505b50909250905060008215611a925781806020019051611a749190810190613346565b600189510381518110611a8357fe5b60200260200101519050611a9a565b505050611692565b80868581518110611aa757fe5b6020908102919091010152505050600101611912565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611af8908690869060240161354a565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611b80919061350d565b600060405180830381855afa9150503d8060008114611bbb576040519150601f19603f3d011682016040523d82523d6000602084013e611bc0565b606091505b5091509150818015611bd3575080516020145b15611bed57611be381600c612617565b9350505050611bf1565b5050505b9392505050565b60606116cd858585857f4cb8e253000000000000000000000000000000000000000000000000000000006000612438565b606060008251905080604051908082528060200260200182016040528015611c5b578160200160208202803883390190505b50915060005b818110156116925760006060611c756125ff565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611cbd57fe5b60200260200101518a604051602401611cd79291906138eb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611d60919061350d565b6000604051808303818686fa925050503d8060008114611d9c576040519150601f19603f3d011682016040523d82523d6000602084013e611da1565b606091505b50909250905060008215611a925781806020019051611dc39190810190613346565b600189510381518110611dd257fe5b6020026020010151905080868581518110611de957fe5b6020908102919091010152505050600101611c61565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590613731565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b6000806000611eaf611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614611ee75785611efd565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b90506000611f09611e8a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614611f415785611f57565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b90506000611f648861265c565b60ff1690506000611f748861265c565b60ff16905060006060611f85612667565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4f61ff8b00000000000000000000000000000000000000000000000000000000179052905173ffffffffffffffffffffffffffffffffffffffff929092169162030d40916120059161350d565b6000604051808303818686fa925050503d8060008114612041576040519150601f19603f3d011682016040523d82523d6000602084013e612046565b606091505b50915091508161206357506000965086955061220e945050505050565b6000818060200190516120799190810190612d7a565b90508073ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff16630c235d96905060e01b89898e60006040516024016120d0949392919061361c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051612159919061350d565b6000604051808303818686fa925050503d8060008114612195576040519150601f19603f3d011682016040523d82523d6000602084013e61219a565b606091505b50909350915060008084156121c657838060200190516121bd9190810190612d96565b925090506121dc565b506000995089985061220e975050505050505050565b670de0b6b3a764000087600a0a87600a0a8e850202816121f857fe5b048161220057fe5b049a50985050505050505050505b935093915050565b6000610aa38361224c61223082600163ffffffff61267f16565b612240888763ffffffff61269e16565b9063ffffffff6126cf16565b9063ffffffff6126eb16565b6000612262612715565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b815260040161229a9190613529565b60206040518083038186803b1580156122b257600080fd5b505afa1580156122c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122ea9190810190612d7a565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff85166123135761220e565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f0868660405160240161234291906138e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516123cb919061350d565b6000604051808303818686fa925050503d8060008114612407576040519150601f19603f3d011682016040523d82523d6000602084013e61240c565b606091505b509092509050811561242f578080602001905161242c9190810190613446565b92505b50935093915050565b60606124448688611dff565b845161244f576125f5565b6000806000875160405190808252806020026020018201604052801561247f578160200160208202803883390190505b5093506124a3898b8a60008151811061249457fe5b6020026020010151898961272d565b9250826124b357506125f5915050565b6124c08a8a85898961272d565b9150816124d057506125f5915050565b60005b88518110156125f05760005b88602001518110156125b2576125098a83815181106124fa57fe5b60200260200101518587612216565b945061252089600001516127100161271087612216565b945060006125318d8d888c8c61272d565b90508061253e57506125b2565b8094508a838151811061254d57fe5b602002602001015185106125a95760008b848151811061256957fe5b60200260200101518c858151811061257d57fe5b60200260200101518703612710028161259257fe5b0490508a6000015181116125a75750506125b2565b505b506001016124df565b506125d18982815181106125c257fe5b60200260200101518486612216565b8582815181106125dd57fe5b60209081029190910101526001016124d3565b505050505b9695505050505050565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b6000816014018351101561263d5761263d61263860048551856014016129e2565b612a87565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b60006122ea82612a8f565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b6000828211156126985761269861263860028585612b60565b50900390565b6000826126ad575060006122ea565b828202828482816126ba57fe5b0414611bf157611bf161263860018686612b60565b600082820183811015611bf157611bf161263860008686612b60565b6000816127015761270161263860038585612b60565b600082848161270c57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b604080516001808252818301909252600091606091829160208083019080388339019050509050858160008151811061276257fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e253000000000000000000000000000000000000000000000000000000001415612872576040517f4cb8e25300000000000000000000000000000000000000000000000000000000906127ee908a908a9085906024016135b2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152915061292b565b6040517f9f76ad3500000000000000000000000000000000000000000000000000000000906128ab9086908b908b908690602401613571565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff1684604051612954919061350d565b600060405180830381855afa9150503d806000811461298f576040519150601f19603f3d011682016040523d82523d6000602084013e612994565b606091505b5091509150816129ab5760009450505050506116cd565b808060200190516129bf9190810190613346565b6000815181106129cb57fe5b602002602001015194505050505095945050505050565b6060632800659560e01b848484604051602401612a0193929190613705565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051612af3919061350d565b600060405180830381855afa9150503d8060008114612b2e576040519150601f19603f3d011682016040523d82523d6000602084013e612b33565b606091505b5091509150818015612b46575080516020145b15612b5957612b56816000612b7f565b92505b5050919050565b606063e946c1bb60e01b848484604051602401612a01939291906136e3565b6000611bf1838360008160200183511015612ba757612ba761263860058551856020016129e2565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b80356122ea816139c6565b600082601f830112612bed578081fd5b8135612c00612bfb82613976565b61394f565b8181529150602080830190840160005b83811015612c3d57612c288760208435890101612cb0565b83526020928301929190910190600101612c10565b5050505092915050565b600082601f830112612c57578081fd5b8135612c65612bfb82613976565b818152915060208083019084810181840286018201871015612c8657600080fd5b60005b84811015612ca557813584529282019290820190600101612c89565b505050505092915050565b600082601f830112612cc0578081fd5b813567ffffffffffffffff811115612cd6578182fd5b612d0760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161394f565b9150808252836020828501011115612d1e57600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b81146122ea57600080fd5b600060408284031215612d5a578081fd5b612d64604061394f565b9050813581526020820135602082015292915050565b600060208284031215612d8b578081fd5b8151611bf1816139c6565b60008060408385031215612da8578081fd5b8251612db3816139c6565b6020939093015192949293505050565b600080600060608486031215612dd7578081fd5b8335612de2816139c6565b92506020840135612df2816139c6565b91506040840135612e02816139c6565b809150509250925092565b60008060008060808587031215612e22578182fd5b8435612e2d816139c6565b93506020850135612e3d816139c6565b92506040850135612e4d816139c6565b9150606085013567ffffffffffffffff811115612e68578182fd5b612e7487828801612c47565b91505092959194509250565b600080600080600060c08688031215612e97578283fd5b8535612ea2816139c6565b94506020860135612eb2816139c6565b93506040860135612ec2816139c6565b9250606086013567ffffffffffffffff811115612edd578182fd5b612ee988828901612c47565b925050612ef98760808801612d49565b90509295509295909350565b600080600060608486031215612f19578081fd5b8335612f24816139c6565b92506020840135612f34816139c6565b9150604084013567ffffffffffffffff811115612f4f578182fd5b612f5b86828701612c47565b9150509250925092565b60008060008060a08587031215612f7a578182fd5b8435612f85816139c6565b93506020850135612f95816139c6565b9250604085013567ffffffffffffffff811115612fb0578283fd5b612fbc87828801612c47565b925050612fcc8660608701612d49565b905092959194509250565b60008060008060808587031215612fec578182fd5b8435612ff7816139c6565b93506130068660208701612d37565b9250612e4d8660408701612d37565b60008060408385031215613027578182fd5b823567ffffffffffffffff8082111561303e578384fd5b81850186601f82011261304f578485fd5b8035925061305f612bfb84613976565b80848252602080830192508084018a82838902870101111561307f578889fd5b8894505b868510156130aa578035613096816139c6565b845260019490940193928101928101613083565b5090965087013593505050808211156130c1578283fd5b506130ce85828601612c47565b9150509250929050565b600080602083850312156130ea578182fd5b823567ffffffffffffffff80821115613101578384fd5b81850186601f820112613112578485fd5b8035925081831115613122578485fd5b8660208085028301011115613135578485fd5b60200196919550909350505050565b60008060408385031215613156578182fd5b67ffffffffffffffff808435111561316c578283fd5b8335840185601f82011261317e578384fd5b803561318c612bfb82613976565b81815260208082019190848101885b8581101561331757813587016101c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828f030112156131d9578a8bfd5b6131e46101c061394f565b6131f08e868401612bd2565b81526131ff8e60408401612bd2565b858201526132108e60608401612bd2565b60408201526132228e60808401612bd2565b606082015260a0820135608082015260c082013560a082015260e082013560c082015261010082013560e08201526101208201356101008201526101408201356101208201526101608201358a81111561327a578c8dfd5b6132888f8783860101612cb0565b610140830152506101808201358a8111156132a1578c8dfd5b6132af8f8783860101612cb0565b610160830152506101a08201358a8111156132c8578c8dfd5b6132d68f8783860101612cb0565b610180830152506101c08201358a8111156132ef578c8dfd5b6132fd8f8783860101612cb0565b6101a083015250865250938201939082019060010161319b565b5091975088013593505050508181111561332f578283fd5b61333b86828701612bdd565b925050509250929050565b60006020808385031215613358578182fd5b825167ffffffffffffffff81111561336e578283fd5b80840185601f82011261337f578384fd5b8051915061338f612bfb83613976565b82815283810190828501858502840186018910156133ab578687fd5b8693505b848410156133cd5780518352600193909301929185019185016133af565b50979650505050505050565b600080600083850360a08112156133ee578182fd5b60608112156133fb578182fd5b50613406606061394f565b845160078110613414578283fd5b815260208581015190820152604080860151908201526060850151608086015191945092508015158114612e02578182fd5b600060208284031215613457578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156134a957815186526020958601959091019060010161348b565b5093949350505050565b600081518084526134cb816020860160208601613996565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b6000825161351f818460208701613996565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152808516604084015250608060608301526116ca6080830184613478565b600073ffffffffffffffffffffffffffffffffffffffff8086168352808516602084015250606060408301526116cd6060830184613478565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152901515606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156136c3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526136b18583516134b3565b94509285019290850190600101613677565b5092979650505050505050565b600060208252611bf16020830184613478565b60608101600485106136f157fe5b938152602081019290925260409091015290565b60608101600885106136f157fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b6000604082526137a260408301855161345e565b60208401516137b4606084018261345e565b5060408401516137c7608084018261345e565b5060608401516137da60a084018261345e565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c09150610180828187015261384b6102008701856134b3565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a083888303018189015261388a82876134b3565b838b015196508489820301868a01526138a381886134b3565b955050808a0151955050505080858303016101e0860152506138c581836134b3565b84810360208601526138d781876134b3565b979650505050505050565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b8181101561394357835173ffffffffffffffffffffffffffffffffffffffff1683526020938401939092019160010161390f565b50909695505050505050565b60405181810167ffffffffffffffff8111828210171561396e57600080fd5b604052919050565b600067ffffffffffffffff82111561398c578081fd5b5060209081020190565b60005b838110156139b1578181015183820152602001613999565b838111156139c0576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146139e857600080fd5b5056fea365627a7a72315820d5a9bdc2a02db71e54295d8ab576d62ab872477c4a720123d70f8c4c178587fc6c6578706572696d656e74616cf564736f6c63430005110040" + "object": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806368be3cf2116100b25780639f76ad3511610081578063c7f7142e11610066578063c7f7142e1461027b578063d0eea06d1461029b578063e68248f7146102ae57610136565b80639f76ad3514610255578063abffc7611461026857610136565b806368be3cf2146101fc5780636dd6b78d1461021c5780638b123a021461022f57806398cdafba1461024257610136565b80634cb8e2531161010957806359f515d0116100ee57806359f515d0146101c357806360ee052a146101d657806364ee6ade146101e957610136565b80634cb8e2531461019d57806358306ba0146101b057610136565b80631796fb871461013b5780632d753aa414610164578063354152a3146101775780634703a7e61461018a575b600080fd5b61014e6101493660046133cd565b6102c1565b60405161015b91906139a2565b60405180910390f35b61014e61017236600461317d565b610492565b61014e6101853660046133cd565b610688565b61014e6101983660046132fb565b610842565b61014e6101ab3660046132fb565b610a1e565b61014e6101be366004613203565b610c38565b61014e6101d136600461353a565b610ccf565b61014e6101e43660046132fb565b610d78565b61014e6101f73660046132fb565b611038565b61020f61020a3660046134ce565b6111fe565b60405161015b9190613924565b61014e61022a3660046132fb565b61133d565b61014e61023d36600461353a565b6115e5565b61014e610250366004613276565b6118be565b61014e610263366004613203565b6118f8565b61014e61027636600461340b565b611afc565b61028e610289366004613133565b611cdf565b60405161015b91906137c4565b61014e6102a936600461335b565b611e1a565b61014e6102bc36600461340b565b611e4b565b6060600082519050806040519080825280602002602001820160405280156102f3578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff16630e71d1b9905060e01b8a8a8a888151811061035057fe5b602002602001015160405160240161036a939291906139e5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516103f391906137a8565b6000604051808303818686fa925050503d806000811461042f576040519150601f19603f3d011682016040523d82523d6000602084013e610434565b606091505b5090925090506000821561045d578180602001905161045691908101906136e1565b9050610465565b505050610488565b8086858151811061047257fe5b60209081029190910101525050506001016102f9565b5050949350505050565b6060600082519050806040519080825280602002602001820160405280156104c4578160200160208202803883390190505b50915073ffffffffffffffffffffffffffffffffffffffff87166104e8575061067f565b60005b8181101561067c57600060608973ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff16636e79e133905060e01b8b8b8b8b898151811061054357fe5b602002602001015160405160240161055e949392919061384d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516105e791906137a8565b6000604051808303818686fa925050503d8060008114610623576040519150601f19603f3d011682016040523d82523d6000602084013e610628565b606091505b50909250905060008215610651578180602001905161064a91908101906136e1565b9050610659565b50505061067c565b8086858151811061066657fe5b60209081029190910101525050506001016104eb565b50505b95945050505050565b6060600082519050806040519080825280602002602001820160405280156106ba578160200160208202803883390190505b50915060005b8181101561048857600060608873ffffffffffffffffffffffffffffffffffffffff16620927c0600073ffffffffffffffffffffffffffffffffffffffff166307211ef7905060e01b8a8a8a888151811061071757fe5b6020026020010151604051602401610731939291906139e5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516107ba91906137a8565b6000604051808303818686fa925050503d80600081146107f6576040519150601f19603f3d011682016040523d82523d6000602084013e6107fb565b606091505b5090925090506000821561045d578180602001905161081d91908101906136e1565b90508086858151811061082c57fe5b60209081029190910101525050506001016106c0565b606061084e8385612021565b8151604080518281526020808402820101909152818015610879578160200160208202803883390190505b50915060005b81811015610a155760006060610893612094565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663ff1fd974905060e01b8a8a8a88815181106108dd57fe5b60200260200101516040516024016108f7939291906138bd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161098091906137a8565b6000604051808303818686fa925050503d80600081146109bc576040519150601f19603f3d011682016040523d82523d6000602084013e6109c1565b606091505b509092509050600082156109ea57818060200190516109e391908101906136e1565b90506109f2565b505050610a15565b808685815181106109ff57fe5b602090810291909101015250505060010161087f565b50509392505050565b6060610a2a8385612021565b8151604080518281526020808402820101909152818015610a55578160200160208202803883390190505b5091506000610a626120ac565b9050600080805b84811015610c2c578373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161480610ad657508373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610b6e57610af98989898481518110610aec57fe5b60200260200101516120c4565b909350915073ffffffffffffffffffffffffffffffffffffffff82167331e085afd48a1d6e51cc193153d625e8f0514c7f1480610b5f575073ffffffffffffffffffffffffffffffffffffffff8216731e158c0e93c30d24e918ef83d1e0be23595c3c0f145b15610b6957600092505b610c0c565b610b7f8985898481518110610aec57fe5b90935091508215610c0c576000610b97858a866120c4565b909450905073ffffffffffffffffffffffffffffffffffffffff83167331e085afd48a1d6e51cc193153d625e8f0514c7f148015610c0057508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610c0a57600093505b505b82868281518110610c1957fe5b6020908102919091010152600101610a69565b50505050509392505050565b60608273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c9f57508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610ca957610cc7565b6060610cb6868585611038565b9050610cc3848683611038565b9150505b949350505050565b6060610cdb83836115e5565b905060005b8351811015610d7157818181518110610cf557fe5b6020026020010151600014610d6957610d50828281518110610d1357fe5b6020026020010151858381518110610d2757fe5b602002602001015160a00151868481518110610d3f57fe5b602002602001015160800151612438565b828281518110610d5c57fe5b6020026020010181815250505b600101610ce0565b5092915050565b6060610d848385612021565b8151604080518281526020808402820101909152818015610daf578160200160208202803883390190505b5091506000610dbc6120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610dfc57610df78661247a565b610dff565b60005b90506000610e0b6120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610e4b57610e468661247a565b610e4e565b60005b905060005b8381101561102d576001610e656120ac565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415610efc578651610edb9085907f2640f62c00000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b6020026020010151612512565b878481518110610ee757fe5b60200260200101819350828152505050611019565b610f046120ac565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415610f6d578651610edb9084907f59e9486200000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b8651600090610fa69085907f59e9486200000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b925090508015610ffc57610fdb857f2640f62c0000000000000000000000000000000000000000000000000000000083612512565b888581518110610fe757fe5b60200260200101819450828152505050611017565b600087848151811061100a57fe5b6020026020010181815250505b505b80611024575061102d565b50600101610e53565b505050509392505050565b60606110448385612021565b815160408051828152602080840282010190915281801561106f578160200160208202803883390190505b50915060005b81811015610a155760006060611089612094565b73ffffffffffffffffffffffffffffffffffffffff16620f4240600073ffffffffffffffffffffffffffffffffffffffff1663144a2752905060e01b898b8a88815181106110d357fe5b60200260200101516040516024016110ed939291906138bd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161117691906137a8565b6000604051808303818686fa925050503d80600081146111b2576040519150601f19603f3d011682016040523d82523d6000602084013e6111b7565b606091505b509092509050600082156109ea57818060200190516111d991908101906136e1565b9050808685815181106111e857fe5b6020908102919091010152505050600101611075565b60408051828152602080840282010190915260609082801561123457816020015b606081526020019060019003908161121f5790505b50905060005b808314610d7157600060603086868581811061125257fe5b6020028201905080357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe13684900301811261128c57600080fd5b9091016020810191503567ffffffffffffffff8111156112ab57600080fd5b368190038213156112bb57600080fd5b6040516112c9929190613798565b600060405180830381855afa9150503d8060008114611304576040519150601f19603f3d011682016040523d82523d6000602084013e611309565b606091505b50915091508161131b57805160208201fd5b8084848151811061132857fe5b6020908102919091010152505060010161123a565b60606113498385612021565b8151604080518281526020808402820101909152818015611374578160200160208202803883390190505b50915060006113816120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146113c1576113bc8661247a565b6113c4565b60005b905060006113d06120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146114105761140b8661247a565b611413565b60005b905060005b8381101561102d57600161142a6120ac565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156114b45786516114939085907f95b68fe700000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b87848151811061149f57fe5b602002602001018193508281525050506115d1565b6114bc6120ac565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156115255786516114939084907fcd7724c300000000000000000000000000000000000000000000000000000000908a9086908110610ece57fe5b865160009061155e9086907f95b68fe700000000000000000000000000000000000000000000000000000000908b9087908110610ece57fe5b9250905080156115b457611593847fcd7724c30000000000000000000000000000000000000000000000000000000083612512565b88858151811061159f57fe5b602002602001018194508281525050506115cf565b60008784815181106115c257fe5b6020026020010181815250505b505b806115dc575061102d565b50600101611418565b60608251604051908082528060200260200182016040528015611612578160200160208202803883390190505b506000805491925073ffffffffffffffffffffffffffffffffffffffff909116905b845181146118b65783818151811061164857fe5b60200260200101515160001480611676575084818151811061166657fe5b6020026020010151608001516000145b80611698575084818151811061168857fe5b602002602001015160a001516000145b156116bc5760008382815181106116ab57fe5b6020026020010181815250506118ae565b600060608373ffffffffffffffffffffffffffffffffffffffff166207a1208573ffffffffffffffffffffffffffffffffffffffff1663e77286eb905060e01b89868151811061170857fe5b602002602001015189878151811061171c57fe5b6020026020010151604051602401611735929190613a60565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117be91906137a8565b6000604051808303818686fa925050503d80600081146117fa576040519150601f19603f3d011682016040523d82523d6000602084013e6117ff565b606091505b50915091508161182a57600085848151811061181757fe5b60200260200101818152505050506118ae565b611832612dd1565b600080838060200190516118499190810190613674565b9194509250905060038351600681111561185f57fe5b14158061186a575080155b1561188e57600088878151811061187d57fe5b6020026020010181815250506118a8565b8188878151811061189b57fe5b6020026020010181815250505b50505050505b600101611634565b505092915050565b60606118ee858585857f9f76ad35000000000000000000000000000000000000000000000000000000008b61265a565b9695505050505050565b60606000825190508060405190808252806020026020018201604052801561192a578160200160208202803883390190505b509150600061193a878787611cdf565b905073ffffffffffffffffffffffffffffffffffffffff811661195f5750610cc79050565b60005b82811015611af157600060608373ffffffffffffffffffffffffffffffffffffffff1662061a80600073ffffffffffffffffffffffffffffffffffffffff1663343fbcdd905060e01b8b8b8b88815181106119b957fe5b60200260200101516040516024016119d3939291906138bd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a5c91906137a8565b6000604051808303818686fa925050503d8060008114611a98576040519150601f19603f3d011682016040523d82523d6000602084013e611a9d565b606091505b50909250905060008215611ac65781806020019051611abf91908101906136e1565b9050611ace565b505050611af1565b80878581518110611adb57fe5b6020908102919091010152505050600101611962565b505050949350505050565b606060008251905080604051908082528060200260200182016040528015611b2e578160200160208202803883390190505b50915060005b818110156118b65760006060611b48612820565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f905060e01b888681518110611b9057fe5b60200260200101518a604051602401611baa929190613bbd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c3391906137a8565b6000604051808303818686fa925050503d8060008114611c6f576040519150601f19603f3d011682016040523d82523d6000602084013e611c74565b606091505b50909250905060008215611cb45781806020019051611c9691908101906135e1565b600189510381518110611ca557fe5b60200260200101519050611cbc565b5050506118b6565b80868581518110611cc957fe5b6020908102919091010152505050600101611b34565b6040516000906060907f153f59970000000000000000000000000000000000000000000000000000000090611d1a90869086906024016137e5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff1683604051611da291906137a8565b600060405180830381855afa9150503d8060008114611ddd576040519150601f19603f3d011682016040523d82523d6000602084013e611de2565b606091505b5091509150818015611df5575080516020145b15611e0f57611e0581600c612838565b9350505050611e13565b5050505b9392505050565b606061067f858585857f4cb8e25300000000000000000000000000000000000000000000000000000000600061265a565b606060008251905080604051908082528060200260200182016040528015611e7d578160200160208202803883390190505b50915060005b818110156118b65760006060611e97612820565b73ffffffffffffffffffffffffffffffffffffffff16620249f0600073ffffffffffffffffffffffffffffffffffffffff16631f00ca74905060e01b888681518110611edf57fe5b60200260200101518a604051602401611ef9929190613bbd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611f8291906137a8565b6000604051808303818686fa925050503d8060008114611fbe576040519150601f19603f3d011682016040523d82523d6000602084013e611fc3565b606091505b50909250905060008215611cb45781806020019051611fe591908101906135e1565b600189510381518110611ff457fe5b602002602001015190508086858151811061200b57fe5b6020908102919091010152505050600101611e83565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208790613a03565b60405180910390fd5b5050565b73794e6e91555438afc3ccf1c5076a74f42133d08d90565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290565b60008060006120d16120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612109578561211f565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b9050600061212b6120ac565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146121635785612179565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee5b905060006121868861287d565b60ff16905060006121968861287d565b60ff169050600060606121a7612888565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4f61ff8b00000000000000000000000000000000000000000000000000000000179052905173ffffffffffffffffffffffffffffffffffffffff929092169162061a8091612227916137a8565b6000604051808303818686fa925050503d8060008114612263576040519150601f19603f3d011682016040523d82523d6000602084013e612268565b606091505b509150915081612285575060009650869550612430945050505050565b60008180602001905161229b91908101906130ea565b90508073ffffffffffffffffffffffffffffffffffffffff166216e360600073ffffffffffffffffffffffffffffffffffffffff16630c235d96905060e01b89898e60006040516024016122f294939291906138ee565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161237b91906137a8565b6000604051808303818686fa925050503d80600081146123b7576040519150601f19603f3d011682016040523d82523d6000602084013e6123bc565b606091505b50909350915060008084156123e857838060200190516123df9190810190613106565b925090506123fe565b5060009950899850612430975050505050505050565b670de0b6b3a764000087600a0a87600a0a8e8502028161241a57fe5b048161242257fe5b049a50985050505050505050505b935093915050565b6000610cc78361246e61245282600163ffffffff6128a016565b612462888763ffffffff6128bf16565b9063ffffffff6128f016565b9063ffffffff61290c16565b6000612484612936565b73ffffffffffffffffffffffffffffffffffffffff166306f2bf62836040518263ffffffff1660e01b81526004016124bc91906137c4565b60206040518083038186803b1580156124d457600080fd5b505afa1580156124e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061250c91908101906130ea565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff851661253557612430565b60608573ffffffffffffffffffffffffffffffffffffffff16620249f086866040516024016125649190613bb4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516125ed91906137a8565b6000604051808303818686fa925050503d8060008114612629576040519150601f19603f3d011682016040523d82523d6000602084013e61262e565b606091505b5090925090508115612651578080602001905161264e91908101906136e1565b92505b50935093915050565b60606126668688612021565b8451612671576118ee565b600080600087516040519080825280602002602001820160405280156126a1578160200160208202803883390190505b5093506126c5898b8a6000815181106126b657fe5b6020026020010151898961294e565b9250826126d557506118ee915050565b6126e28a8a85898961294e565b9150816126f257506118ee915050565b60005b88518110156128125760005b88602001518110156127d45761272b8a838151811061271c57fe5b60200260200101518587612438565b945061274289600001516127100161271087612438565b945060006127538d8d888c8c61294e565b90508061276057506127d4565b8094508a838151811061276f57fe5b602002602001015185106127cb5760008b848151811061278b57fe5b60200260200101518c858151811061279f57fe5b6020026020010151870361271002816127b457fe5b0490508a6000015181116127c95750506127d4565b505b50600101612701565b506127f38982815181106127e457fe5b60200260200101518486612438565b8582815181106127ff57fe5b60209081029190910101526001016126f5565b505050509695505050505050565b73f164fc0ec4e93095b804a4795bbe1e041497b92a90565b6000816014018351101561285e5761285e6128596004855185601401612c03565b612ca8565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600061250c82612cb0565b73818e6fecd516ecc3849daf6845e3ec868087b75590565b6000828211156128b9576128b961285960028585612d81565b50900390565b6000826128ce5750600061250c565b828202828482816128db57fe5b0414611e1357611e1361285960018686612d81565b600082820183811015611e1357611e1361285960008686612d81565b6000816129225761292261285960038585612d81565b600082848161292d57fe5b04949350505050565b73c0a47dfe034b400b47bdad5fecda2621de6c4d9590565b604080516001808252818301909252600091606091829160208083019080388339019050509050858160008151811061298357fe5b60209081029190910101527fffffffff0000000000000000000000000000000000000000000000000000000085167f4cb8e253000000000000000000000000000000000000000000000000000000001415612a93576040517f4cb8e2530000000000000000000000000000000000000000000000000000000090612a0f908a908a908590602401613884565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150612b4c565b6040517f9f76ad350000000000000000000000000000000000000000000000000000000090612acc9086908b908b90869060240161380c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291505b600060603073ffffffffffffffffffffffffffffffffffffffff1684604051612b7591906137a8565b600060405180830381855afa9150503d8060008114612bb0576040519150601f19603f3d011682016040523d82523d6000602084013e612bb5565b606091505b509150915081612bcc57600094505050505061067f565b80806020019051612be091908101906135e1565b600081518110612bec57fe5b602002602001015194505050505095945050505050565b6060632800659560e01b848484604051602401612c22939291906139d7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b600060129050600060608373ffffffffffffffffffffffffffffffffffffffff166040518060400160405280600481526020017f313ce56700000000000000000000000000000000000000000000000000000000815250604051612d1491906137a8565b600060405180830381855afa9150503d8060008114612d4f576040519150601f19603f3d011682016040523d82523d6000602084013e612d54565b606091505b5091509150818015612d67575080516020145b15612d7a57612d77816000612da0565b92505b5050919050565b606063e946c1bb60e01b848484604051602401612c22939291906139b5565b6000611e13838360008160200183511015612dc857612dc86128596005855185602001612c03565b50016020015190565b6040805160608101909152806000815260006020820181905260409091015290565b803561250c81613c98565b600082601f830112612e0e578081fd5b8135612e21612e1c82613c48565b613c21565b8181529150602080830190840160005b83811015612e5e57612e498760208435890101612ed1565b83526020928301929190910190600101612e31565b5050505092915050565b600082601f830112612e78578081fd5b8135612e86612e1c82613c48565b818152915060208083019084810181840286018201871015612ea757600080fd5b60005b84811015612ec657813584529282019290820190600101612eaa565b505050505092915050565b600082601f830112612ee1578081fd5b813567ffffffffffffffff811115612ef7578182fd5b612f2860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613c21565b9150808252836020828501011115612f3f57600080fd5b8060208401602084013760009082016020015292915050565b8035600f81900b811461250c57600080fd5b600060408284031215612f7b578081fd5b612f856040613c21565b9050813581526020820135602082015292915050565b60006101c0808385031215612fae578182fd5b612fb781613c21565b915050612fc48383612df3565b8152612fd38360208401612df3565b6020820152612fe58360408401612df3565b6040820152612ff78360608401612df3565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561305957600080fd5b61306586838701612ed1565b8385015261016092508285013591508082111561308157600080fd5b61308d86838701612ed1565b838501526101809250828501359150808211156130a957600080fd5b6130b586838701612ed1565b838501526101a09250828501359150808211156130d157600080fd5b506130de85828601612ed1565b82840152505092915050565b6000602082840312156130fb578081fd5b8151611e1381613c98565b60008060408385031215613118578081fd5b825161312381613c98565b6020939093015192949293505050565b600080600060608486031215613147578081fd5b833561315281613c98565b9250602084013561316281613c98565b9150604084013561317281613c98565b809150509250925092565b600080600080600060a08688031215613194578283fd5b853561319f81613c98565b945060208601356131af81613c98565b935060408601356131bf81613c98565b925060608601356131cf81613c98565b9150608086013567ffffffffffffffff8111156131ea578182fd5b6131f688828901612e68565b9150509295509295909350565b60008060008060808587031215613218578182fd5b843561322381613c98565b9350602085013561323381613c98565b9250604085013561324381613c98565b9150606085013567ffffffffffffffff81111561325e578182fd5b61326a87828801612e68565b91505092959194509250565b600080600080600060c0868803121561328d578283fd5b853561329881613c98565b945060208601356132a881613c98565b935060408601356132b881613c98565b9250606086013567ffffffffffffffff8111156132d3578182fd5b6132df88828901612e68565b9250506132ef8760808801612f6a565b90509295509295909350565b60008060006060848603121561330f578081fd5b833561331a81613c98565b9250602084013561332a81613c98565b9150604084013567ffffffffffffffff811115613345578182fd5b61335186828701612e68565b9150509250925092565b60008060008060a08587031215613370578182fd5b843561337b81613c98565b9350602085013561338b81613c98565b9250604085013567ffffffffffffffff8111156133a6578283fd5b6133b287828801612e68565b9250506133c28660608701612f6a565b905092959194509250565b600080600080608085870312156133e2578182fd5b84356133ed81613c98565b93506133fc8660208701612f58565b92506132438660408701612f58565b6000806040838503121561341d578182fd5b823567ffffffffffffffff80821115613434578384fd5b81850186601f820112613445578485fd5b80359250613455612e1c84613c48565b80848252602080830192508084018a828389028701011115613475578889fd5b8894505b868510156134a057803561348c81613c98565b845260019490940193928101928101613479565b5090965087013593505050808211156134b7578283fd5b506134c485828601612e68565b9150509250929050565b600080602083850312156134e0578182fd5b823567ffffffffffffffff808211156134f7578384fd5b81850186601f820112613508578485fd5b8035925081831115613518578485fd5b866020808502830101111561352b578485fd5b60200196919550909350505050565b6000806040838503121561354c578182fd5b823567ffffffffffffffff80821115613563578384fd5b81850186601f820112613574578485fd5b80359250613584612e1c84613c48565b83815260208082019190838101885b878110156135bc576135aa8c848435890101612f9b565b85529382019390820190600101613593565b509197508801359450505050808211156135d4578283fd5b506134c485828601612dfe565b600060208083850312156135f3578182fd5b825167ffffffffffffffff811115613609578283fd5b80840185601f82011261361a578384fd5b8051915061362a612e1c83613c48565b8281528381019082850185850284018601891015613646578687fd5b8693505b8484101561366857805183526001939093019291850191850161364a565b50979650505050505050565b600080600083850360a0811215613689578182fd5b6060811215613696578182fd5b506136a16060613c21565b8451600781106136af578283fd5b815260208581015190820152604080860151908201526060850151608086015191945092508015158114613172578182fd5b6000602082840312156136f2578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b82811015613744578151865260209586019590910190600101613726565b5093949350505050565b60008151808452613766816020860160208601613c68565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600082516137ba818460208701613c68565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152808516604084015250608060608301526118ee6080830184613713565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b600073ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015261067f6060830184613713565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152901515606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613995577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261398385835161374e565b94509285019290850190600101613949565b5092979650505050505050565b600060208252611e136020830184613713565b60608101600485106139c357fe5b938152602081019290925260409091015290565b60608101600885106139c357fe5b600f93840b81529190920b6020820152604081019190915260600190565b60208082526025908201527f455243323042726964676553616d706c65722f494e56414c49445f544f4b454e60408201527f5f50414952000000000000000000000000000000000000000000000000000000606082015260800190565b600060408252613a746040830185516136f9565b6020840151613a8660608401826136f9565b506040840151613a9960808401826136f9565b506060840151613aac60a08401826136f9565b50608084015160c083015260a084015160e083015260c0840151610100818185015260e086015191506101208281860152818701519250610140915082828601528087015192505061016082818601528187015192506101c091506101808281870152613b1d61020087018561374e565b8289015194507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc092506101a0838883030181890152613b5c828761374e565b838b015196508489820301868a0152613b75818861374e565b955050808a0151955050505080858303016101e086015250613b97818361374e565b8481036020860152613ba9818761374e565b979650505050505050565b90815260200190565b60006040820184835260406020840152808451808352606085019150602086019250835b81811015613c1557835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101613be1565b50909695505050505050565b60405181810167ffffffffffffffff81118282101715613c4057600080fd5b604052919050565b600067ffffffffffffffff821115613c5e578081fd5b5060209081020190565b60005b83811015613c83578181015183820152602001613c6b565b83811115613c92576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613cba57600080fd5b5056fea365627a7a72315820add5b6ee6d228c1990759231f8d18b1a0dcbf1520bf55bf22f326cdae1d74ec66c6578706572696d656e74616cf564736f6c63430005110040" } } }, diff --git a/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json b/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json index 26a2bf3718..468754b795 100644 --- a/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json +++ b/packages/contract-artifacts/artifacts/IERC20BridgeSampler.json @@ -244,6 +244,21 @@ "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": [ @@ -396,6 +411,17 @@ }, "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": { diff --git a/packages/contract-wrappers/CHANGELOG.json b/packages/contract-wrappers/CHANGELOG.json index 2b1db67dd6..5b703ba9fa 100644 --- a/packages/contract-wrappers/CHANGELOG.json +++ b/packages/contract-wrappers/CHANGELOG.json @@ -29,6 +29,10 @@ { "note": "Added `ERC20BridgeSampler.sampleSellsFromUniswapV2", "pr": 2595 + }, + { + "note": "Added `ERC20BridgeSampler.sampleSellsFromMultiBridge", + "pr": 2593 } ] }, diff --git a/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts b/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts index 3f8ee624ef..2bb3f65184 100644 --- a/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts +++ b/packages/contract-wrappers/src/generated-wrappers/erc20_bridge_sampler.ts @@ -731,6 +731,41 @@ export class ERC20BridgeSamplerContract extends BaseContract { stateMutability: 'view', type: 'function', }, + { + constant: true, + inputs: [ + { + name: 'multibridge', + type: 'address', + }, + { + name: 'takerToken', + type: 'address', + }, + { + name: 'intermediateToken', + type: 'address', + }, + { + name: 'makerToken', + type: 'address', + }, + { + name: 'takerTokenAmounts', + type: 'uint256[]', + }, + ], + name: 'sampleSellsFromMultiBridge', + outputs: [ + { + name: 'makerTokenAmounts', + type: 'uint256[]', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, { constant: true, inputs: [ @@ -1230,7 +1265,7 @@ export class ERC20BridgeSamplerContract extends BaseContract { } /** * Sample buy quotes from UniswapV2. - * @param path Token route. + * @param path Token route. Should be takerToken -> makerToken. * @param makerTokenAmounts Maker token buy amount for each sample. * @returns takerTokenAmounts Taker amounts sold at each maker token amount. */ @@ -1459,6 +1494,53 @@ export class ERC20BridgeSamplerContract extends BaseContract { }, }; } + /** + * Sample sell quotes from MultiBridge. + * @param multibridge Address of the MultiBridge contract. + * @param takerToken Address of the taker token (what to sell). + * @param intermediateToken The address of the intermediate token to use + * in an indirect route. + * @param makerToken Address of the maker token (what to buy). + * @param takerTokenAmounts Taker token sell amount for each sample. + * @returns makerTokenAmounts Maker amounts bought at each taker token amount. + */ + public sampleSellsFromMultiBridge( + multibridge: string, + takerToken: string, + intermediateToken: string, + makerToken: string, + takerTokenAmounts: BigNumber[], + ): ContractFunctionObj { + const self = (this as any) as ERC20BridgeSamplerContract; + assert.isString('multibridge', multibridge); + assert.isString('takerToken', takerToken); + assert.isString('intermediateToken', intermediateToken); + assert.isString('makerToken', makerToken); + assert.isArray('takerTokenAmounts', takerTokenAmounts); + const functionSignature = 'sampleSellsFromMultiBridge(address,address,address,address,uint256[])'; + + return { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, [ + multibridge.toLowerCase(), + takerToken.toLowerCase(), + intermediateToken.toLowerCase(), + makerToken.toLowerCase(), + takerTokenAmounts, + ]); + }, + }; + } /** * Sample sell quotes from Uniswap. * @param takerToken Address of the taker token (what to sell). @@ -1499,7 +1581,7 @@ export class ERC20BridgeSamplerContract extends BaseContract { } /** * Sample sell quotes from UniswapV2. - * @param path Token route. + * @param path Token route. Should be takerToken -> makerToken * @param takerTokenAmounts Taker token sell amount for each sample. * @returns makerTokenAmounts Maker amounts bought at each taker token amount. */ diff --git a/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts b/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts index 43c258549e..b696c1381f 100644 --- a/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts +++ b/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts @@ -679,6 +679,41 @@ export class IERC20BridgeSamplerContract extends BaseContract { stateMutability: 'view', type: 'function', }, + { + constant: true, + inputs: [ + { + name: 'multibridge', + type: 'address', + }, + { + name: 'takerToken', + type: 'address', + }, + { + name: 'intermediateToken', + type: 'address', + }, + { + name: 'makerToken', + type: 'address', + }, + { + name: 'takerTokenAmounts', + type: 'uint256[]', + }, + ], + name: 'sampleSellsFromMultiBridge', + outputs: [ + { + name: 'makerTokenAmounts', + type: 'uint256[]', + }, + ], + payable: false, + stateMutability: 'view', + type: 'function', + }, { constant: true, inputs: [ @@ -1362,6 +1397,53 @@ export class IERC20BridgeSamplerContract extends BaseContract { }, }; } + /** + * Sample sell quotes from MultiBridge. + * @param multibridge Address of the MultiBridge contract. + * @param takerToken Address of the taker token (what to sell). + * @param intermediateToken The address of the intermediate token to use + * in an indirect route. + * @param makerToken Address of the maker token (what to buy). + * @param takerTokenAmounts Taker token sell amount for each sample. + * @returns makerTokenAmounts Maker amounts bought at each taker token amount. + */ + public sampleSellsFromMultiBridge( + multibridge: string, + takerToken: string, + intermediateToken: string, + makerToken: string, + takerTokenAmounts: BigNumber[], + ): ContractFunctionObj { + const self = (this as any) as IERC20BridgeSamplerContract; + assert.isString('multibridge', multibridge); + assert.isString('takerToken', takerToken); + assert.isString('intermediateToken', intermediateToken); + assert.isString('makerToken', makerToken); + assert.isArray('takerTokenAmounts', takerTokenAmounts); + const functionSignature = 'sampleSellsFromMultiBridge(address,address,address,address,uint256[])'; + + return { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._performCallAsync( + { ...callData, data: this.getABIEncodedTransactionData() }, + defaultBlock, + ); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, [ + multibridge.toLowerCase(), + takerToken.toLowerCase(), + intermediateToken.toLowerCase(), + makerToken.toLowerCase(), + takerTokenAmounts, + ]); + }, + }; + } /** * Sample sell quotes from Uniswap. * @param takerToken Address of the taker token (what to sell).