secretstore-contracts
Version:
Secret Store permissioning and service contracts collection and toolkit.
374 lines • 602 kB
JSON
{
"contractName": "SecretStoreServerKeyRetrievalService",
"abi": [
{
"constant": true,
"inputs": [
{
"name": "keyServer",
"type": "address"
}
],
"name": "requireKeyServer",
"outputs": [
{
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "keyServersCount",
"outputs": [
{
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "maxServerKeyRetrievalRequests",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "isOwner",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "drain",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "serverKeyRetrievalFee",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "keyServerSetAddressInit",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "serverKeyId",
"type": "bytes32"
}
],
"name": "ServerKeyRetrievalRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "serverKeyId",
"type": "bytes32"
},
{
"indexed": false,
"name": "serverKeyPublic",
"type": "bytes"
}
],
"name": "ServerKeyRetrieved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "serverKeyId",
"type": "bytes32"
}
],
"name": "ServerKeyRetrievalError",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "serverKeyId",
"type": "bytes32"
},
{
"indexed": false,
"name": "serverKeyPublic",
"type": "bytes"
},
{
"indexed": false,
"name": "threshold",
"type": "uint256"
}
],
"name": "ServerKeyRetrieved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"constant": false,
"inputs": [
{
"name": "serverKeyId",
"type": "bytes32"
}
],
"name": "retrieveServerKey",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "serverKeyId",
"type": "bytes32"
},
{
"name": "serverKeyPublic",
"type": "bytes"
},
{
"name": "threshold",
"type": "uint8"
}
],
"name": "serverKeyRetrieved",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "serverKeyId",
"type": "bytes32"
}
],
"name": "serverKeyRetrievalError",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "serverKeyRetrievalRequestsCount",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "index",
"type": "uint256"
}
],
"name": "getServerKeyRetrievalRequest",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "serverKeyId",
"type": "bytes32"
},
{
"name": "keyServer",
"type": "address"
}
],
"name": "isServerKeyRetrievalResponseRequired",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newFee",
"type": "uint256"
}
],
"name": "setServerKeyRetrievalFee",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newLimit",
"type": "uint256"
}
],
"name": "setMaxServerKeyRetrievalRequests",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "serverKeyId",
"type": "bytes32"
}
],
"name": "deleteServerKeyRetrievalRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x608060405234801561001057600080fd5b5060405160208061167f833981016040819052905160008054600160a060020a031916331780825591928392600160a060020a031691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360018054600160a060020a031916600160a060020a03929092169190911790555067016345785d8a000060045560086005556115d2806100ad6000396000f3006080604052600436106100e25763ffffffff60e060020a60003504166315eb530981146101585780631b544bb0146101725780632b4f030a146101995780633b68c427146101d057806350f6a134146102085780635aa8404c146102205780636479c4d114610235578063715018a61461024a5780638da5cb5b1461025f5780638f32d59b146102905780639890220b146102a55780639f0d6ffd146102ba578063a45362f6146102d2578063af538b71146102fc578063d2548ea814610311578063e70f142714610329578063f2fde38b14610341578063ffaff0f714610362575b6040805160e560020a62461bcd02815260206004820152602260248201527f446972656374207061796d656e747320617265206e6f7420737570706f72746560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b34801561016457600080fd5b5061017060043561036d565b005b34801561017e57600080fd5b50610187610428565b60408051918252519081900360200190f35b3480156101a557600080fd5b506101ba600160a060020a036004351661042f565b6040805160ff9092168252519081900360200190f35b3480156101dc57600080fd5b506101f4600435600160a060020a03602435166104cc565b604080519115158252519081900360200190f35b34801561021457600080fd5b50610187600435610505565b34801561022c57600080fd5b506101ba61052a565b34801561024157600080fd5b506101876105ba565b34801561025657600080fd5b506101706105c0565b34801561026b57600080fd5b5061027461062a565b60408051600160a060020a039092168252519081900360200190f35b34801561029c57600080fd5b506101f4610639565b3480156102b157600080fd5b5061017061064a565b3480156102c657600080fd5b506101706004356106f0565b3480156102de57600080fd5b5061017060048035906024803590810191013560ff60443516610708565b34801561030857600080fd5b50610187610914565b34801561031d57600080fd5b5061017060043561091a565b34801561033557600080fd5b50610170600435610932565b34801561034d57600080fd5b50610170600160a060020a036004351661098f565b6101706004356109ae565b600081815260066020526040812080549091906060908290829060ff16151561039557610420565b61039e3361042f565b6040805181815260608101825291955060208201610800803883390190505092506103cc85858560ff610b76565b909250905060018260028111156103df57fe5b14156103ea57610420565b6103f48686610e11565b60405186907fd771fa1d962d6d67f55ba82bcac8601cf0bd33cc5680a029b58faa3d2d3d260d90600090a25b505050505050565b6007545b90565b600154604080517f287fb40c000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151600093929092169163287fb40c9160248082019260209290919082900301818787803b15801561049a57600080fd5b505af11580156104ae573d6000803e3d6000fd5b505050506040513d60208110156104c457600080fd5b505192915050565b60008060006104da8461042f565b600086815260066020526040902090925090506104fa6001820183610ec4565b92505b505092915050565b60008060078381548110151561051757fe5b6000918252602090912001549392505050565b600154604080517f5560c9650000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691635560c96591600480830192602092919082900301818787803b15801561058957600080fd5b505af115801561059d573d6000803e3d6000fd5b505050506040513d60208110156105b357600080fd5b5051905090565b60055481565b6105c8610639565b15156105d357600080fd5b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a031690565b600054600160a060020a0316331490565b336000908152600260205260409020548015156106b1576040805160e560020a62461bcd02815260206004820152600d60248201527f42616c616e636520697320302e00000000000000000000000000000000000000604482015290519081900360640190fd5b336000818152600260205260408082208290555183156108fc0291849190818181858888f193505050501580156106ec573d6000803e3d6000fd5b5050565b6106f8610639565b151561070357600080fd5b600555565b6000806000606086868080601f01602080910402602001604051908101604052809392919081815260200183838082843750508451604014935061079a92505050576040805160e560020a62461bcd02815260206004820152601860248201527f5075626c6963206b6579206973206e6f742076616c69642e0000000000000000604482015290519081900360640190fd5b6000898152600660205260409020805490955060ff1615156107bb57610909565b6107c43361042f565b935061080385858a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437508e9450610b769350505050565b9093509150600183600281111561081657fe5b141561082157610909565b61082b8986610e11565b600083600281111561083957fe5b14156108dd5760408051602080825284518183015284518c937fbc454e03c5f94d0bd23c53b4fed1f5af23e7cd378eac46203f25d406c4a921189387939092839283019185019080838360005b8381101561089e578181015183820152602001610886565b50505050905090810190601f1680156108cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2610909565b60405189907fd771fa1d962d6d67f55ba82bcac8601cf0bd33cc5680a029b58faa3d2d3d260d90600090a25b505050505050505050565b60045481565b610922610639565b151561092d57600080fd5b600455565b600061093c610639565b151561094757600080fd5b5060008181526006602052604090206109608282610e11565b60405182907fd771fa1d962d6d67f55ba82bcac8601cf0bd33cc5680a029b58faa3d2d3d260d90600090a25050565b610997610639565b15156109a257600080fd5b6109ab81610f73565b50565b6000600454803410151515610a0d576040805160e560020a62461bcd02815260206004820181905260248201527f5472616e73616374696f6e2076616c7565206973206e6f7420656e6f7567682e604482015290519081900360640190fd5b60055460075410610a8d576040805160e560020a62461bcd028152602060048201526024808201527f4d617869756d756d206e756d626572206f66207265717565737473207265616360448201527f6865642e00000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000838152600660205260409020805490925060ff1615610af8576040805160e560020a62461bcd02815260206004820152601260248201527f52657175657374206973206163746976652e0000000000000000000000000000604482015290519081900360640190fd5b610b00610ff0565b815460ff1916600190811783556007805491820181556000527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018390556040805184815290517fabca19cd1a35cd8001bfc77e38ae9f56a162e022292a67e1152f1512776d68089181900360200190a1505050565b6000606060ff8316828080610ba660018b018a6002610b9361052a565b60ff16811515610b9f57fe5b04876111b2565b92506002836002811115610bb657fe5b1415610bc757828895509550610e04565b87876040516020018083805190602001908083835b60208310610bfb5780518252601f199092019160209182019101610bdc565b6001836020036101000a0380198251168184511680821785525050505050509050018260ff1660ff167f0100000000000000000000000000000000000000000000000000000000000000028152600101925050506040516020818303038152906040526040518082805190602001908083835b60208310610c8d5780518252601f199092019160209182019101610c6e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150610ccb8a6007018a89856111b2565b90506001836002811115610cdb57fe5b1415610d37578660ff1660ff14158015610d0f57506000828152600a8b016020526040902054600b8b015460ff9081169116145b15610d2b578751610d2990600d8c019060208b019061148c565b505b60018895509550610e04565b6001816002811115610d4557fe5b1415610dfd57600b8a015460ff600189018116911610610dfd57600d8a01805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181526000939290918391830182828015610ded5780601f10610dc257610100808354040283529160200191610ded565b820191906000526020600020905b815481529060010190602001808311610dd057829003601f168201915b5050505050905095509550610e04565b8088955095505b5050505094509492505050565b610e1d81600701611377565b60008281526006602081905260408220805460ff1990811682556001820184815560028301859055600383018054831690556005830180549092169091559092918290610e6c9085018261150a565b50506000600783018181556008840182905560098401805460ff19908116909155600b85018054909116905590610ea6600c85018261150a565b50610eb79050600d83016000611528565b50506106ec6007836113c8565b6000806000600160009054906101000a9004600160a060020a0316600160a060020a0316636452e8216040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b505050506040513d6020811015610f4657600080fd5b505185549092508214610f5c57600192506104fd565b5050506001919091015460ff90911660020a161590565b600160a060020a0381161515610f8857600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008060008060008061100161052a565b95503494508560ff168581151561101457fe5b049350600092505b6001860360ff168360ff1610156110f357600154604080517fc66198dc00000000000000000000000000000000000000000000000000000000815260ff861660048201529051600160a060020a039092169163c66198dc916024808201926020929091908290030181600087803b15801561109657600080fd5b505af11580156110aa573d6000803e3d6000fd5b505050506040513d60208110156110c057600080fd5b5051600160a060020a0381166000908152600260205260409020805486019055948490039460019390930192915061101c565b600154604080517fc66198dc00000000000000000000000000000000000000000000000000000000815260ff6000198a011660048201529051600160a060020a039092169163c66198dc916024808201926020929091908290030181600087803b15801561116057600080fd5b505af1158015611174573d6000803e3d6000fd5b505050506040513d602081101561118a57600080fd5b5051600160a060020a0316600090815260026020526040902080549095019094555050505050565b6000806000806000600160009054906101000a9004600160a060020a0316600160a060020a0316636452e8216040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561120d57600080fd5b505af1158015611221573d6000803e3d6000fd5b505050506040513d602081101561123757600080fd5b505160028a015490945060ff16151561125257838955611264565b88548414611264576112648985611450565b600189015460ff891660020a9350831615611282576001945061136b565b600086815260038a016020526040902080546001808c0180548717905560028c01805460ff8181168401811660ff1992831617909255845493821683019182169316831790935591935014156112ed5760058901805460018101825560009182526020909120018690555b600489015460ff9081169083161061132d5760048901805460ff191660ff84811691909117909155600019830181169088161161132d576000945061136b565b600289015460ff1661133d61052a565b60048b0154919003915060001960ff91821683010181169088161115611366576002945061136b565b600194505b50505050949350505050565b60005b60058201548110156106ec57816003016000836005018381548110151561139d57fe5b600091825260208083209091015483528201929092526040019020805460ff1916905560010161137a565b60005b825481101561144b57825482908490839081106113e457fe5b60009182526020909120015414156114435782548390600019810190811061140857fe5b9060005260206000200154838281548110151561142157fe5b60009182526020909120015582546000190161143d848261156c565b5061144b565b6001016113cb565b505050565b61145982611377565b80825560006001830181905560028301805460ff19908116909155600484018054909116905561144b600584018261156c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114cd57805160ff19168380011785556114fa565b828001600101855582156114fa579182015b828111156114fa5782518255916020019190600101906114df565b5061150692915061158c565b5090565b50805460008255906000526020600020908101906109ab919061158c565b50805460018160011615610100020316600290046000825580601f1061154e57506109ab565b601f0160209004906000526020600020908101906109ab919061158c565b81548183558181111561144b5760008381526020902061144b9181019083015b61042c91905b8082111561150657600081556001016115925600a165627a7a7230582044e69346a7eb5de78969e579d9ecebb5beae70163fbc8d869d421d8e810f7df00029",
"deployedBytecode": "0x6080604052600436106100e25763ffffffff60e060020a60003504166315eb530981146101585780631b544bb0146101725780632b4f030a146101995780633b68c427146101d057806350f6a134146102085780635aa8404c146102205780636479c4d114610235578063715018a61461024a5780638da5cb5b1461025f5780638f32d59b146102905780639890220b146102a55780639f0d6ffd146102ba578063a45362f6146102d2578063af538b71146102fc578063d2548ea814610311578063e70f142714610329578063f2fde38b14610341578063ffaff0f714610362575b6040805160e560020a62461bcd02815260206004820152602260248201527f446972656374207061796d656e747320617265206e6f7420737570706f72746560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b34801561016457600080fd5b5061017060043561036d565b005b34801561017e57600080fd5b50610187610428565b60408051918252519081900360200190f35b3480156101a557600080fd5b506101ba600160a060020a036004351661042f565b6040805160ff9092168252519081900360200190f35b3480156101dc57600080fd5b506101f4600435600160a060020a03602435166104cc565b604080519115158252519081900360200190f35b34801561021457600080fd5b50610187600435610505565b34801561022c57600080fd5b506101ba61052a565b34801561024157600080fd5b506101876105ba565b34801561025657600080fd5b506101706105c0565b34801561026b57600080fd5b5061027461062a565b60408051600160a060020a039092168252519081900360200190f35b34801561029c57600080fd5b506101f4610639565b3480156102b157600080fd5b5061017061064a565b3480156102c657600080fd5b506101706004356106f0565b3480156102de57600080fd5b5061017060048035906024803590810191013560ff60443516610708565b34801561030857600080fd5b50610187610914565b34801561031d57600080fd5b5061017060043561091a565b34801561033557600080fd5b50610170600435610932565b34801561034d57600080fd5b50610170600160a060020a036004351661098f565b6101706004356109ae565b600081815260066020526040812080549091906060908290829060ff16151561039557610420565b61039e3361042f565b6040805181815260608101825291955060208201610800803883390190505092506103cc85858560ff610b76565b909250905060018260028111156103df57fe5b14156103ea57610420565b6103f48686610e11565b60405186907fd771fa1d962d6d67f55ba82bcac8601cf0bd33cc5680a029b58faa3d2d3d260d90600090a25b505050505050565b6007545b90565b600154604080517f287fb40c000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151600093929092169163287fb40c9160248082019260209290919082900301818787803b15801561049a57600080fd5b505af11580156104ae573d6000803e3d6000fd5b505050506040513d60208110156104c457600080fd5b505192915050565b60008060006104da8461042f565b600086815260066020526040902090925090506104fa6001820183610ec4565b92505b505092915050565b60008060078381548110151561051757fe5b6000918252602090912001549392505050565b600154604080517f5560c9650000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691635560c96591600480830192602092919082900301818787803b15801561058957600080fd5b505af115801561059d573d6000803e3d6000fd5b505050506040513d60208110156105b357600080fd5b5051905090565b60055481565b6105c8610639565b15156105d357600080fd5b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a031690565b600054600160a060020a0316331490565b336000908152600260205260409020548015156106b1576040805160e560020a62461bcd02815260206004820152600d60248201527f42616c616e636520697320302e00000000000000000000000000000000000000604482015290519081900360640190fd5b336000818152600260205260408082208290555183156108fc0291849190818181858888f193505050501580156106ec573d6000803e3d6000fd5b5050565b6106f8610639565b151561070357600080fd5b600555565b6000806000606086868080601f01602080910402602001604051908101604052809392919081815260200183838082843750508451604014935061079a92505050576040805160e560020a62461bcd02815260206004820152601860248201527f5075626c6963206b6579206973206e6f742076616c69642e0000000000000000604482015290519081900360640190fd5b6000898152600660205260409020805490955060ff1615156107bb57610909565b6107c43361042f565b935061080385858a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437508e9450610b769350505050565b9093509150600183600281111561081657fe5b141561082157610909565b61082b8986610e11565b600083600281111561083957fe5b14156108dd5760408051602080825284518183015284518c937fbc454e03c5f94d0bd23c53b4fed1f5af23e7cd378eac46203f25d406c4a921189387939092839283019185019080838360005b8381101561089e578181015183820152602001610886565b50505050905090810190601f1680156108cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2610909565b60405189907fd771fa1d962d6d67f55ba82bcac8601cf0bd33cc5680a029b58faa3d2d3d260d90600090a25b505050505050505050565b60045481565b610922610639565b151561092d57600080fd5b600455565b600061093c610639565b151561094757600080fd5b5060008181526006602052604090206109608282610e11565b60405182907fd771fa1d962d6d67f55ba82bcac8601cf0bd33cc5680a029b58faa3d2d3d260d90600090a25050565b610997610639565b15156109a257600080fd5b6109ab81610f73565b50565b6000600454803410151515610a0d576040805160e560020a62461bcd02815260206004820181905260248201527f5472616e73616374696f6e2076616c7565206973206e6f7420656e6f7567682e604482015290519081900360640190fd5b60055460075410610a8d576040805160e560020a62461bcd028152602060048201526024808201527f4d617869756d756d206e756d626572206f66207265717565737473207265616360448201527f6865642e00000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000838152600660205260409020805490925060ff1615610af8576040805160e560020a62461bcd02815260206004820152601260248201527f52657175657374206973206163746976652e0000000000000000000000000000604482015290519081900360640190fd5b610b00610ff0565b815460ff1916600190811783556007805491820181556000527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018390556040805184815290517fabca19cd1a35cd8001bfc77e38ae9f56a162e022292a67e1152f1512776d68089181900360200190a1505050565b6000606060ff8316828080610ba660018b018a6002610b9361052a565b60ff16811515610b9f57fe5b04876111b2565b92506002836002811115610bb657fe5b1415610bc757828895509550610e04565b87876040516020018083805190602001908083835b60208310610bfb5780518252601f199092019160209182019101610bdc565b6001836020036101000a0380198251168184511680821785525050505050509050018260ff1660ff167f0100000000000000000000000000000000000000000000000000000000000000028152600101925050506040516020818303038152906040526040518082805190602001908083835b60208310610c8d5780518252601f199092019160209182019101610c6e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150610ccb8a6007018a89856111b2565b90506001836002811115610cdb57fe5b1415610d37578660ff1660ff14158015610d0f57506000828152600a8b016020526040902054600b8b015460ff9081169116145b15610d2b578751610d2990600d8c019060208b019061148c565b505b60018895509550610e04565b6001816002811115610d4557fe5b1415610dfd57600b8a015460ff600189018116911610610dfd57600d8a01805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181526000939290918391830182828015610ded5780601f10610dc257610100808354040283529160200191610ded565b820191906000526020600020905b815481529060010190602001808311610dd057829003601f168201915b5050505050905095509550610e04565b8088955095505b5050505094509492505050565b610e1d81600701611377565b60008281526006602081905260408220805460ff1990811682556001820184815560028301859055600383018054831690556005830180549092169091559092918290610e6c9085018261150a565b50506000600783018181556008840182905560098401805460ff19908116909155600b85018054909116905590610ea6600c85018261150a565b50610eb79050600d83016000611528565b50506106ec6007836113c8565b6000806000600160009054906101000a9004600160a060020a0316600160a060020a0316636452e8216040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b505050506040513d6020811015610f4657600080fd5b505185549092508214610f5c57600192506104fd565b5050506001919091015460ff90911660020a161590565b600160a060020a0381161515610f8857600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008060008060008061100161052a565b95503494508560ff168581151561101457fe5b049350600092505b6001860360ff168360ff1610156110f357600154604080517fc66198dc00000000000000000000000000000000000000000000000000000000815260ff861660048201529051600160a060020a039092169163c66198dc916024808201926020929091908290030181600087803b15801561109657600080fd5b505af11580156110aa573d6000803e3d6000fd5b505050506040513d60208110156110c057600080fd5b5051600160a060020a0381166000908152600260205260409020805486019055948490039460019390930192915061101c565b600154604080517fc66198dc00000000000000000000000000000000000000000000000000000000815260ff6000198a011660048201529051600160a060020a039092169163c66198dc916024808201926020929091908290030181600087803b15801561116057600080fd5b505af1158015611174573d6000803e3d6000fd5b505050506040513d602081101561118a57600080fd5b5051600160a060020a0316600090815260026020526040902080549095019094555050505050565b6000806000806000600160009054906101000a9004600160a060020a0316600160a060020a0316636452e8216040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561120d57600080fd5b505af1158015611221573d6000803e3d6000fd5b505050506040513d602081101561123757600080fd5b505160028a015490945060ff16151561125257838955611264565b88548414611264576112648985611450565b600189015460ff891660020a9350831615611282576001945061136b565b600086815260038a016020526040902080546001808c0180548717905560028c01805460ff8181168401811660ff1992831617909255845493821683019182169316831790935591935014156112ed5760058901805460018101825560009182526020909120018690555b600489015460ff9081169083161061132d5760048901805460ff191660ff84811691909117909155600019830181169088161161132d576000945061136b565b600289015460ff1661133d61052a565b60048b0154919003915060001960ff91821683010181169088161115611366576002945061136b565b600194505b50505050949350505050565b60005b60058201548110156106ec57816003016000836005018381548110151561139d57fe5b600091825260208083209091015483528201929092526040019020805460ff1916905560010161137a565b60005b825481101561144b57825482908490839081106113e457fe5b60009182526020909120015414156114435782548390600019810190811061140857fe5b9060005260206000200154838281548110151561142157fe5b60009182526020909120015582546000190161143d848261156c565b5061144b565b6001016113cb565b505050565b61145982611377565b80825560006001830181905560028301805460ff19908116909155600484018054909116905561144b600584018261156c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114cd57805160ff19168380011785556114fa565b828001600101855582156114fa579182015b828111156114fa5782518255916020019190600101906114df565b5061150692915061158c565b5090565b50805460008255906000526020600020908101906109ab919061158c565b50805460018160011615610100020316600290046000825580601f1061154e57506109ab565b601f0160209004906000526020600020908101906109ab919061158c565b81548183558181111561144b5760008381526020902061144b9181019083015b61042c91905b8082111561150657600081556001016115925600a165627a7a7230582044e69346a7eb5de78969e579d9ecebb5beae70163fbc8d869d421d8e810f7df00029",
"sourceMap": "888:9631:7:-;;;1642:194;8:9:-1;5:2;;;30:1;27;20:12;5:2;1642:194:7;;;;;;;;;;;;;;;;509:6:12;:19;;-1:-1:-1;;;;;;509:19:12;518:10;509:19;;;;1642:194:7;;;;-1:-1:-1;;;;;572:6:12;;509;539:40;;509:6;;539:40;2548:19:8;:45;;-1:-1:-1;;;;;;2548:45:8;-1:-1:-1;;;;;2548:45:8;;;;;;;;;;-1:-1:-1;1776:10:7;1752:21;:34;1828:1;1796:29;:33;888:9631;;;-1:-1:-1;888:9631:7;;",
"deployedSourceMap": "888:9631:7:-;;;;;;;;;-1:-1:-1;;;888:9631:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1955:44;;;-1:-1:-1;;;;;1955:44:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4673:1196;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4673:1196:7;;;;;;;5935:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5935:136:7;;;;;;;;;;;;;;;;;;;;2843:166:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2843:166:8;-1:-1:-1;;;;;2843:166:8;;;;;;;;;;;;;;;;;;;;;;;;6453:354:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6453:354:7;;;-1:-1:-1;;;;;6453:354:7;;;;;;;;;;;;;;;;;;;;;;;6167:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6167:214:7;;;;;2644:140:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2644:140:8;;;;10253:44:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10253:44:7;;;;1273:127:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1273:127:12;;;;639:70;;8:9:-1;5:2;;;30:1;27;20:12;5:2;639:70:12;;;;;;;;-1:-1:-1;;;;;639:70:12;;;;;;;;;;;;;;926:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;926:83:12;;;;3059:199:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3059:199:8;;;;7079:154:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7079:154:7;;;;;3264:1341;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3264:1341:7;;;;;;;;;;;;;;;;;;;;10065:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10065:36:7;;;;6890:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6890:134:7;;;;;7284:313;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7284:313:7;;;;;1561:101:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1561:101:12;-1:-1:-1;;;;;1561:101:12;;;;;2133:1068:7;;;;;;4673:1196;4787:41;4831:39;;;:26;:39;;;;;4885:16;;4831:39;;4787:41;5307:26;;4787:41;;5307:26;;4885:16;;4884:17;4880:54;;;4917:7;;4880:54;5016:28;5033:10;5016:16;:28::i;:::-;5346:2;5336:13;;;;;;;;;;4993:51;;-1:-1:-1;5336:13:7;;;17:15:-1;;105:10;5336:13:7;88:34:-1;136:17;;-1:-1;5336:13:7;5307:42;;5488:127;5534:7;5555:14;5583:13;5610:4;5488:32;:127::i;:::-;5445:170;;-1:-1:-1;5445:170:7;-1:-1:-1;5648:27:7;5629:15;:46;;;;;;;;;5625:83;;;5691:7;;5625:83;5759:52;5790:11;5803:7;5759:30;:52::i;:::-;5826:36;;5850:11;;5826:36;;;;;4673:1196;;;;;;;:::o;5935:136::-;6027:30;:37;5935:136;;:::o;2843:166:8:-;2946:19;;2933:69;;;;;;-1:-1:-1;;;;;2933:69:8;;;;;;;;;2909:5;;2946:19;;;;;2933:58;;:69;;;;;;;;;;;;;;;2909:5;2946:19;2933:69;;;5:2:-1;;;;30:1;27;20:12;5:2;2933:69:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2933:69:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2933:69:8;;2843:166;-1:-1:-1;;2843:166:8:o;6453:354:7:-;6562:4;6578:20;6638:41;6601:27;6618:9;6601:16;:27::i;:::-;6682:39;;;;:26;:39;;;;;6578:50;;-1:-1:-1;6682:39:7;-1:-1:-1;6738:62:7;6757:26;;;6578:50;6738:18;:62::i;:::-;6731:69;;6453:354;;;;;;;:::o;6167:214::-;6243:7;6262:19;6284:30;6315:5;6284:37;;;;;;;;;;;;;;;;;;;;;6167:214;-1:-1:-1;;;6167:214:7:o;2644:140:8:-;2729:19;;2716:61;;;;;;;;2692:5;;-1:-1:-1;;;;;2729:19:8;;2716:59;;:61;;;;;;;;;;;;;;2692:5;2729:19;2716:61;;;5:2:-1;;;;30:1;27;20:12;5:2;2716:61:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2716:61:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2716:61:8;;-1:-1:-1;2644:140:8;:::o;10253:44:7:-;;;;:::o;1273:127:12:-;824:9;:7;:9::i;:::-;816:18;;;;;;;;1367:1;1351:6;;1330:40;;-1:-1:-1;;;;;1351:6:12;;;;1330:40;;1367:1;;1330:40;1393:1;1376:19;;-1:-1:-1;;1376:19:12;;;1273:127::o;639:70::-;676:7;698:6;-1:-1:-1;;;;;698:6:12;639:70;:::o;926:83::-;965:4;998:6;-1:-1:-1;;;;;998:6:12;984:10;:20;;926:83::o;3059:199:8:-;3120:10;3093:15;3111:20;;;:8;:20;;;;;;3149:12;;;3141:38;;;;;-1:-1:-1;;;;;3141:38:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;3198:10;3212:1;3189:20;;;:8;:20;;;;;;:24;;;3223:28;;;;;;3243:7;;3223:28;;3212:1;3223:28;3243:7;3198:10;3223:28;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3223:28:8;3059:199;:::o;7079:154:7:-;824:9:12;:7;:9::i;:::-;816:18;;;;;;;;7186:29:7;:40;7079:154::o;3264:1341::-;3442:41;3745:20;3807:31;3848:33;3374:15;;2332:125:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2388:16:8;;2408:2;2388:22;;-1:-1:-1;2380:59:8;;-1:-1:-1;;;2380:59:8;;;;-1:-1:-1;;;;;2380:59:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;3486:39:7;;;;:26;:39;;;;;3540:16;;3486:39;;-1:-1:-1;3540:16:7;;3539:17;3535:54;;;3572:7;;3535:54;3768:28;3785:10;3768:16;:28::i;:::-;3745:51;;3933:134;3979:7;4000:14;4028:15;;3933:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4057:9:7;;-1:-1:-1;3933:32:7;;-1:-1:-1;;;;3933:134:7:i;:::-;3891:176;;-1:-1:-1;3891:176:7;-1:-1:-1;4153:27:7;4134:15;:46;;;;;;;;;4130:106;;;4219:7;;4130:106;4287:52;4318:11;4331:7;4287:30;:52::i;:::-;4372:25;4353:15;:44;;;;;;;;;4349:250;;;4431:53;;;;;;;;;;;;;;;4450:11;;4431:53;;4463:20;;4431:53;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4431:53:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4349:250;;;4552:36;;4576:11;;4552:36;;;;;4349:250;3264:1341;;;;;;;;;:::o;10065:36::-;;;;:::o;6890:134::-;824:9:12;:7;:9::i;:::-;816:18;;;;;;;;6987:21:7;:30;6890:134::o;7284:313::-;7393:41;824:9:12;:7;:9::i;:::-;816:18;;;;;;;;-1:-1:-1;7437:39:7;;;;:26;:39;;;;;7486:52;7464:11;7437:39;7486:30;:52::i;:::-;7554:36;;7578:11;;7554:36;;;;;7284:313;;:::o;1561:101:12:-;824:9;:7;:9::i;:::-;816:18;;;;;;;;1629:28;1648:8;1629:18;:28::i;:::-;1561:101;:::o;2133:1068:7:-;2429:41;2219:21;;2216:6:8;2203:9;:19;;2195:64;;;;;;;-1:-1:-1;;;;;2195:64:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2348:29:7;;2308:30;:37;:69;2300:118;;;;;-1:-1:-1;;;;;2300:118:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:39;;;;:26;:39;;;;;2531:16;;2473:39;;-1:-1:-1;2531:16:7;;2530:17;2522:48;;;;;-1:-1:-1;;;;;2522:48:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;2580:9;:7;:9::i;:::-;3057:23;;-1:-1:-1;;3057:23:7;3076:4;3057:23;;;;;3090:30;27:10:-1;;23:18;;;45:23;;3057:16:7;3090:48;;;;;;3154:40;;;;;;;;;;;;;3090:48;3154:40;;;2133:1068;;;:::o;7687:1991::-;7884:15;7901:5;7987:18;;;7884:15;;;8058:149;7987:18;8086:26;;8126:14;8174:1;8154:17;:15;:17::i;:::-;:21;;;;;;;;;;8189:17;8058:14;:149::i;:::-;8015:192;-1:-1:-1;8249:26:7;8221:24;:54;;;;;;;;;8217:135;;;8299:24;8325:15;8291:50;;;;;;8217:135;8442:15;8459:9;8425:44;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8425:44:7;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8425:44:7;;;8415:55;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8415:55:7;;;;;;;;;;;;;;;;8396:74;;8514:119;8542:7;:17;;8573:14;8601:9;8624:8;8514:14;:119::i;:::-;8480:153;-1:-1:-1;8675:27:7;8647:24;:55;;;;;;;;;8643:573;;;8852:9;:17;;8865:4;8852:17;;:105;;;;-1:-1:-1;8913:44:7;;;;:34;;;:44;;;;;;8873:36;;;;8913:44;8873:36;;;8913:44;;8873:84;8852:105;8848:192;;;8977:48;;;;:30;;;;:48;;;;;:::i;:::-;;8848:192;9160:27;9189:15;9152:53;;;;;;8643:573;9248:27;9229:15;:46;;;;;;;;;9225:395;;;9456:36;;;;:53;9508:1;9496:13;;9456:53;;:36;;:53;9452:158;;9564:30;;;9529:66;;;;;;;;;;;;;-1:-1:-1;;9529:66:7;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9564:30:7;9529:66;;9564:30;;9529:66;;9564:30;9529:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9452:158;9638:15;9655;9630:41;;;;7687:1991;;;;;;;;;;;;:::o;9735:290::-;9857:33;9872:7;:17;;9857:14;:33::i;:::-;9907:39;;;;:26;:39;;;;;;;9900:46;;-1:-1:-1;;9900:46:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9907:39;;;;;9900:46;;;;9907:39;9900:46;:::i;:::-;-1:-1:-1;;9900:46:7;;;;;;;;;;;;;;;;;;-1:-1:-1;;9900:46:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;9900:46:7;;-1:-1:-1;9900:46:7;;;;;:::i;:::-;;;9957:61;9974:30;10006:11;9957:16;:61::i;3920:618:8:-;4029:4;4120:31;4402:21;4167:19;;;;;;;;;-1:-1:-1;;;;;4167:19:8;-1:-1:-1;;;;;4154:54:8;;:56;;;;;-1:-1:-1;;;4154:56:8;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4154:56:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4154:56:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4154:56:8;4251:33;;4154:56;;-1:-1:-1;4224:60:8;;4220:102;;4307:4;4300:11;;;;4220:102;-1:-1:-1;;;4435:1:8;4475:33;;;;;4427:28;;;;;;4475:49;4474:56;;3920:618::o;1796:169:12:-;-1:-1:-1;;;;;1865:22:12;;;;1857:31;;;;;;1920:6;;;1899:38;;-1:-1:-1;;;;;1899:38:12;;;;1920:6;;;1899:38;;;1943:6;:17;;-1:-1:-1;;1943:17:12;-1:-1:-1;;;;;1943:17:12;;;;;;;;;;1796:169::o;3326:521:8:-;3364:11;3405:14;3441:13;3486:7;3533:17;3709:21;3378:17;:15;:17::i;:::-;3364:31;;3422:9;3405:26;;3466:5;3457:14;;:6;:14;;;;;;;;3441:30;;3496:1;3486:11;;3481:218;3511:1;3503:5;:9;3499:13;;:1;:13;;;3481:218;;;3566:19;;3553:56;;;;;;;;;;;;;;;-1:-1:-1;;;;;3566:19:8;;;;3553:53;;:56;;;;;;;;;;;;;;;3566:19;;3553:56;;;5:2:-1;;;;30:1;27;20:12;5:2;3553:56:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3553:56:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3553:56:8;-1:-1:-1;;;;;3623:19:8;;;;;;:8;3553:56;3623:19;;;;:28;;;;;;3674:14;;;;;-1:-1:-1;3514:3:8;;;;;3553:56;-1:-1:-1;3481:218:8;;;3746:19;;3733:64;;;;;;;-1:-1:-1;;3787:9:8;;3733:64;;;;;;;-1:-1:-1;;;;;3746:19:8;;;;3733:53;;:64;;;;;;;;;;;;;;;3746:19;;3733:64;;;5:2:-1;;;;30:1;27;20:12;5:2;3733:64:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3733:64:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3733:64:8;-1:-1:-1;;;;;3807:23:8;;;;;:8;3733:64;3807:23;;;;:33;;;;;;;;-1:-1:-1;;;;;3326:521:8:o;4584:1938::-;4752:15;4874:31;5313:21;5535;6259:20;4921:19;;;;;;;;;-1:-1:-1;;;;;4921:19:8;-1:-1:-1;;;;;4908:54:8;;:56;;;;;-1:-1:-1;;;4908:56:8;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4908:56:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4908:56:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4908:56:8;4978:34;;;;4908:56;;-1:-1:-1;4978:34:8;;:39;4974:276;;;5033:59;;;4974:276;;;5113:33;;:60;;5109:141;;5189:50;5204:9;5215:23;5189:14;:50::i;:::-;5346:1;5382:33;;;5338:28;;;;;;-1:-1:-1;5382:49:8;;5381:56;5377:121;;5460:27;5453:34;;;;5377:121;5559:36;;;;:26;;;:36;;;;;;;;5609:33;;;:50;;;;;;5669:34;;;:39;;5559:36;5669:39;;;;;;;-1:-1:-1;;5669:39:8;;;;;;;5718:54;;5559:36;;;:40;;5718:54;;;;;;;;;;5559:40;;-1:-1:-1;5786:20:8;5782:85;;;5822:19;;;27:10:-1;;39:1;23:18;;45:23;;-1:-1;5822:34:8;;;;;;;;;;;5782:85;5899:28;;;;;;;;5880:47;;;;5876:309;;5943:28;;;:46;;-1:-1:-1;;5943:46:8;;;;;;;;;;;;-1:-1:-1;;6089:19:8;;6076:32;;;;;;6072:103;;6135:25;6128:32;;;;6072:103;6302:34;;;;;;6282:17;:15;:17::i;:::-;6362:28;;;;6282:54;;;;-1:-1:-1;;;6362:28:8;;;;:45;;:49;6350:61;;;;;;6346:125;;;6434:26;6427:33;;;;6346:125;6488:27;6481:34;;4584:1938;;;;;;;;;;;:::o;6568:224::-;6652:9;6647:139;6671:19;;;:26;6667:30;;6647:139;;;6725:9;:26;;:50;6752:9;:19;;6772:1;6752:22;;;;;;;;;;;;;;;;;;;;;;6725:50;;;;;;;;;;;;6718:57;;-1:-1:-1;;6718:57:8;;;;6699:3;6647:139;;6836:345;6931:6;6926:249;6947:15;;6943:19;;6926:249;;;6987:11;;7002:7;;6987:8;;6996:1;;6987:11;;;;;;;;;;;;;;;;:22;6983:182;;;7052:15;;7043:8;;-1:-1:-1;;7052:19:8;;;7043:29;;;;;;;;;;;;;;7029:8;7038:1;7029:11;;;;;;;;;;;;;;;;;;;:43;7108:15;;-1:-1:-1;;7108:19:8;7090:37;7108:8;:19;7090:37;:::i;:::-;;7145:5;;6983:182;6964:3;;6926:249;;;6836:345;;;:::o;7212:389::-;7323:25;7338:9;7323:14;:25::i;:::-;7358:59;;;:33;7427;;;:37;;;7474:34;;;:38;;-1:-1:-1;;7474:38:8;;;;;;7522:28;;;:32;;;;;;;7564:30;:19;;;7358:33;7564:30;:::i;888:9631:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;888:9631:7;;;-1:-1:-1;888:9631:7;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
"source": "//! The Secret Store server key retrieval service contract.\n//!\n//! Copyright 2017 Svyatoslav Nikolsky, Parity Technologies Ltd.\n//!\n//! Licensed under the Apache License, Version 2.0 (the \"License\");\n//! you may not use this file except in compliance with the License.\n//! You may obtain a copy of the License at\n//!\n//! http://www.apache.org/licenses/LICENSE-2.0\n//!\n//! Unless required by applicable law or agreed to in writing, software\n//! distributed under the License is distributed on an \"AS IS\" BASIS,\n//! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//! See the License for the specific language governing permissions and\n//! limitations under the License.\n\npragma solidity ^0.4.18;\n\nimport \"../interfaces/SecretStoreService.sol\";\nimport \"./SecretStoreServiceBase.sol\";\n\n\n/// Server Key retrieval service contract.\n/* solium-disable-next-line */\ncontract SecretStoreServerKeyRetrievalService is SecretStoreServiceBase, ServerKeyRetrievalServiceClientApi, ServerKeyRetrievalServiceKeyServerApi {\n /// Server key retrieval request.\n struct ServerKeyRetrievalRequest {\n bool isActive;\n RequestResponses thresholdResponses;\n RequestResponses responses;\n bytes publicWithMaxThreshold;\n }\n\n /// When sever key retrieval request is received.\n event ServerKeyRetrievalRequested(bytes32 serverKeyId);\n /// When server key is retrieved.\n event ServerKeyRetrieved(bytes32 indexed serverKeyId, bytes serverKeyPublic);\n /// When error occurs during server key retrieval.\n event ServerKeyRetrievalError(bytes32 indexed serverKeyId);\n\n /// Constructor.\n constructor(address keyServerSetAddressInit) SecretStoreServiceBase(keyServerSetAddressInit) public {\n serverKeyRetrievalFee = 100 finney;\n maxServerKeyRetrievalRequests = 8;\n }\n\n // === Interface methods ===\n\n /// We do not support direct payments.\n function() public payable {\n revert(\"Direct payments are not supported.\");\n }\n\n /// Retrieve existing server key. Retrieved key will be published via ServerKeyRetrieved or ServerKeyRetrievalError.\n function retrieveServerKey(bytes32 serverKeyId) external payable\n whenFeePaid(serverKeyRetrievalFee)\n {\n // check maximum number of requests\n require(serverKeyRetrievalRequestsKeys.length < maxServerKeyRetrievalRequests, \"Maxiumum number of requests reached.\");\n\n ServerKeyRetrievalRequest storage request = serverKeyRetrievalRequests[serverKeyId];\n require(!request.isActive, \"Request is active.\");\n deposit();\n\n // we do not know exact threshold value here && we can not blindly trust the first response\n // => we should agree upon two values: threshold && server key itself\n // => assuming that all authorities will eventually respond with value/error, we will wait for:\n // 1) at least 50% + 1 authorities agreement on the same threshold value\n // 2) after threshold is agreed, we will wait for threshold + 1 values of server key\n\n request.isActive = true;\n serverKeyRetrievalRequestsKeys.push(serverKeyId);\n\n emit ServerKeyRetrievalRequested(serverKeyId);\n }\n\n /// Called when retrieval is reported by key server.\n function serverKeyRetrieved(bytes32 serverKeyId, bytes serverKeyPublic, uint8 threshold) external validPublic(serverKeyPublic) {\n // check if request still active\n ServerKeyRetrievalRequest storage request = serverKeyRetrievalRequests[serverKeyId];\n if (!request.isActive) {\n return;\n }\n\n // insert response (we're waiting for responses from all authorities here)\n // it checks that tx.origin is actually the key server\n uint8 keyServerIndex = requireKeyServer(msg.sender);\n\n ResponseSupport responseSupport;\n bytes memory finalServerKeyPublic;\n (responseSupport, finalServerKeyPublic) = insertServerKeyRetrievalResponse(\n request,\n keyServerIndex,\n serverKeyPublic,\n threshold);\n\n // ...and check if there are enough support\n if (responseSupport == ResponseSupport.Unconfirmed) { // not confirmed (yet)\n return;\n }\n\n // delete request and fire event\n clearServerKeyRetrievalRequest(serverKeyId, request);\n if (responseSupport == ResponseSupport.Confirmed) { // confirmed\n emit ServerKeyRetrieved(serverKeyId, finalServerKeyPublic);\n } else { // no consensus possible at all\n emit ServerKeyRetrievalError(serverKeyId);\n }\n }\n\n /// Called when error occurs during server key retrieval.\n function serverKeyRetrievalError(bytes32 serverKeyId) external {\n // check if request still active\n ServerKeyRetrievalRequest storage request = serverKeyRetrievalRequests[serverKeyId];\n if (!request.isActive) {\n return;\n }\n\n // check that it is called by key server\n uint8 keyServerIndex = requireKeyServer(msg.sender);\n\n // all key servers in SS with auto-migration enabled should have a share for every key\n // => we could make an error fatal, but let's tolerate such issues\n // => insert invalid response and check if there are enough confirmations\n bytes memory invalidPublic = new bytes(64);\n\n ResponseSupport responseSupport;\n bytes memory _finalServerKeyPublic;\n (responseSupport, _finalServerKeyPublic) = insertServerKeyRetrievalResponse(\n request,\n keyServerIndex,\n invalidPublic,\n 0xFF);\n if (responseSupport == ResponseSupport.Unconfirmed) {\n return;\n }\n\n // delete request and fire event\n clearServerKeyRetrievalRequest(serverKeyId, request);\n emit ServerKeyRetrievalError(serverKeyId);\n }\n\n /// Get count of pending server key retrieval requests.\n function serverKeyRetrievalRequestsCount() external view returns (uint256) {\n return serverKeyRetrievalRequestsKeys.length;\n }\n\n /// Get server key retrieval request with given index.\n /// Returns: (serverKeyId)\n function getServerKeyRetrievalRequest(uint256 index) external view returns (bytes32) {\n bytes32 serverKeyId = serverKeyRetrievalRequestsKeys[index];\n return (\n serverKeyId,\n );\n }\n\n /// Returs true if response from given keyServer is required.\n function isServerKeyRetrievalResponseRequired(bytes32 serverKeyId, address keyServer) external view returns (bool) {\n uint8 keyServerIndex = requireKeyServer(keyServer);\n ServerKeyRetrievalRequest storage request = serverKeyRetrievalRequests[serverKeyId];\n return isResponseRequired(request.thresholdResponses, keyServerIndex);\n }\n\n // === Administrative methods ===\n\n /// Set server key retrieval fee.\n function setServerKeyRetrievalFee(uint256 newFee)\n public\n onlyOwner\n {\n serverKeyRetrievalFee = newFee;\n }\n\n /// Set server key retrieval requests limit.\n function setMaxServerKeyRetrievalRequests(uint256 newLimit)\n public\n onlyOwner\n {\n maxServerKeyRetrievalRequests = newLimit;\n }\n\n /// Delete server key retrieval request.\n function deleteServerKeyRetrievalRequest(bytes32 serverKeyId)\n public\n onlyOwner\n {\n ServerKeyRetrievalRequest storage request = serverKeyRetrievalRequests[serverKeyId];\n clearServerKeyRetrievalRequest(serverKeyId, request);\n\n emit ServerKeyRetrievalError(serverKeyId);\n }\n\n // === Internal methods ===\n\n /// Insert both threshold and public response.\n function insertServerKeyRetrievalResponse(\n ServerKeyRetrievalRequest storage request,\n uint8 keyServerIndex,\n bytes serverKeyPublic,\n