diff --git a/package.json b/package.json index 6d01f056..b18b8792 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lerna": "3.14.0" }, "dependencies": { - "bn.js": "^5.0.0", + "bn.js": "^5.1.1", "elliptic": "^6.5.1", "web3": "^1.2.4" } diff --git a/packages/anonymous.js/package.json b/packages/anonymous.js/package.json index d0c0786d..9b99ea6d 100644 --- a/packages/anonymous.js/package.json +++ b/packages/anonymous.js/package.json @@ -4,7 +4,7 @@ "description": "", "main": "./lib", "dependencies": { - "bn.js": "^5.0.0", + "bn.js": "^5.1.1", "elliptic": "^6.5.1", "web3": "^1.2.4" }, diff --git a/packages/anonymous.js/src/prover/burn.js b/packages/anonymous.js/src/prover/burn.js index 3a561b9b..df0a61d4 100644 --- a/packages/anonymous.js/src/prover/burn.js +++ b/packages/anonymous.js/src/prover/burn.js @@ -10,8 +10,8 @@ class BurnProof { constructor() { this.serialize = () => { // please initialize this before calling this method... var result = "0x"; - result += bn128.representation(this.A).slice(2); - result += bn128.representation(this.S).slice(2); + result += bn128.representation(this.BA).slice(2); + result += bn128.representation(this.BS).slice(2); result += bn128.representation(this.CLnPrime).slice(2); result += bn128.representation(this.CRnPrime).slice(2); @@ -67,11 +67,11 @@ class BurnProver { var aL = new FieldVector(witness['bDiff'].toString(2, 32).split("").reverse().map((i) => new BN(i, 2).toRed(bn128.q))); var aR = aL.plus(new BN(1).toRed(bn128.q).redNeg()); var alpha = bn128.randomScalar(); - proof.A = params.commit(alpha, aL, aR); + proof.BA = params.commit(alpha, aL, aR); var sL = new FieldVector(Array.from({ length: 32 }).map(bn128.randomScalar)); var sR = new FieldVector(Array.from({ length: 32 }).map(bn128.randomScalar)); var rho = bn128.randomScalar(); // already reduced - proof.S = params.commit(rho, sL, sR); + proof.BS = params.commit(rho, sL, sR); var gammaDiff = bn128.randomScalar(); var zetaDiff = bn128.randomScalar(); @@ -86,8 +86,8 @@ class BurnProver { 'bytes32[2]', ], [ bn128.bytes(statementHash), - bn128.serialize(proof.A), - bn128.serialize(proof.S), + bn128.serialize(proof.BA), + bn128.serialize(proof.BS), bn128.serialize(proof.CLnPrime), bn128.serialize(proof.CRnPrime), ])); @@ -157,7 +157,7 @@ class BurnProver { var gs = params.getGs(); var hsPrime = params.getHs().hadamard(ys.invert()); var hExp = ys.times(z).add(twoTimesZs); - var Z = proof.A.add(proof.S.mul(x)).add(gs.sum().mul(z.redNeg())).add(hsPrime.commit(hExp)); // rename of P + var Z = proof.BA.add(proof.BS.mul(x)).add(gs.sum().mul(z.redNeg())).add(hsPrime.commit(hExp)); // rename of P Z = Z.add(params.getH().mul(proof.mu.redNeg())); // Statement P of protocol 1. should this be included in the calculation of v...? var o = utils.hash(ABICoder.encodeParameters([ diff --git a/packages/anonymous.js/src/prover/zether.js b/packages/anonymous.js/src/prover/zether.js index b3913582..e3f77609 100644 --- a/packages/anonymous.js/src/prover/zether.js +++ b/packages/anonymous.js/src/prover/zether.js @@ -142,7 +142,7 @@ class ZetherProver { proof.E = params.commit(r_E, new FieldVector([a.getVector()[0].redMul(a.getVector()[m]), a.getVector()[0].redMul(a.getVector()[m])])); proof.F = params.commit(r_F, new FieldVector([a.getVector()[b.getVector()[0].toNumber() * m], a.getVector()[b.getVector()[m].toNumber() * m].redNeg()])); - var d = utils.hash(ABICoder.encodeParameters([ + var v = utils.hash(ABICoder.encodeParameters([ 'bytes32', 'bytes32[2]', 'bytes32[2]', @@ -184,13 +184,13 @@ class ZetherProver { proof.gG = Array.from({ length: m }).map((_, k) => params.getG().mul(sigma[k])); proof.C_XG = Array.from({ length: m }).map((_, k) => statement['D'].mul(omega[k])); proof.y_XG = Array.from({ length: m }).map((_, k) => params.getG().mul(omega[k])); - var dPow = new BN(1).toRed(bn128.q); + var vPow = new BN(1).toRed(bn128.q); for (var i = 0; i < N; i++) { // could turn this into a complicated reduce, but... - var temp = params.getG().mul(witness['bTransfer'].redMul(dPow)); + var temp = params.getG().mul(witness['bTransfer'].redMul(vPow)); var poly = i % 2 ? Q : P; // clunky, i know, etc. etc. proof.C_XG = proof.C_XG.map((C_XG_k, k) => C_XG_k.add(temp.mul(poly[k].getVector()[(witness['index'][0] + N - (i - i % 2)) % N].redSub(poly[k].getVector()[(witness['index'][1] + N - (i - i % 2)) % N])))); if (i != 0) - dPow = dPow.redMul(d); + vPow = vPow.redMul(v); } var w = utils.hash(ABICoder.encodeParameters([ @@ -204,7 +204,7 @@ class ZetherProver { 'bytes32[2][]', 'bytes32[2][]', ], [ - bn128.bytes(d), + bn128.bytes(v), proof.CLnG.map(bn128.serialize), proof.CRnG.map(bn128.serialize), proof.C_0G.map(bn128.serialize), @@ -249,12 +249,12 @@ class ZetherProver { var convolver = new Convolver(); var y_p = convolver.convolution(p, statement['y']); var y_q = convolver.convolution(q, statement['y']); - dPow = new BN(1).toRed(bn128.q); + vPow = new BN(1).toRed(bn128.q); for (var i = 0; i < N; i++) { var y_poly = i % 2 ? y_q : y_p; - y_XR = y_XR.add(y_poly.getVector()[Math.floor(i / 2)].mul(dPow)); - if (i != 0) - dPow = dPow.redMul(d); + y_XR = y_XR.add(y_poly.getVector()[Math.floor(i / 2)].mul(vPow)); + if (i > 0) + vPow = vPow.redMul(v); } var gammaTransfer = bn128.randomScalar(); diff --git a/packages/anonymous.js/src/utils/bn128.js b/packages/anonymous.js/src/utils/bn128.js index 368cfbe6..b7c1ea11 100644 --- a/packages/anonymous.js/src/utils/bn128.js +++ b/packages/anonymous.js/src/utils/bn128.js @@ -2,8 +2,8 @@ const BN = require('bn.js') const EC = require('elliptic') const crypto = require('crypto') -const FIELD_MODULUS = new BN("21888242871839275222246405745257275088696311157297823662689037894645226208583", 10); -const GROUP_MODULUS = new BN("21888242871839275222246405745257275088548364400416034343698204186575808495617", 10); +const FIELD_MODULUS = new BN("30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47", 16); +const GROUP_MODULUS = new BN("30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001", 16); const B_MAX = 4294967295; const bn128 = {}; @@ -12,16 +12,16 @@ const bn128 = {}; bn128.curve = new EC.curve.short({ a: '0', b: '3', - p: FIELD_MODULUS.toString(16), - n: GROUP_MODULUS.toString(16), + p: FIELD_MODULUS, + n: GROUP_MODULUS, gRed: false, g: ['77da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d4', '1485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f875'], }); bn128.zero = bn128.curve.g.mul(0); -bn128.p = BN.red(new BN(bn128.curve.p.toString(16), 16)); // temporary workaround due to -bn128.q = BN.red(new BN(bn128.curve.n.toString(16), 16)); // https://github.com/indutny/elliptic/issues/191 +bn128.p = BN.red(bn128.curve.p); // temporary workaround due to +bn128.q = BN.red(bn128.curve.n); // https://github.com/indutny/elliptic/issues/191 // Get a random BN in the bn128 curve group's reduction context bn128.randomScalar = () => { diff --git a/packages/contract-artifacts/artifacts/BurnVerifier.json b/packages/contract-artifacts/artifacts/BurnVerifier.json index 2813a0da..fd1bd29e 100644 --- a/packages/contract-artifacts/artifacts/BurnVerifier.json +++ b/packages/contract-artifacts/artifacts/BurnVerifier.json @@ -55,12 +55,12 @@ "type": "function" } ], - "metadata": "{\"compiler\":{\"version\":\"0.5.4+commit.9549d8ff\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"CLn\",\"type\":\"bytes32[2]\"},{\"name\":\"CRn\",\"type\":\"bytes32[2]\"},{\"name\":\"y\",\"type\":\"bytes32[2]\"},{\"name\":\"bTransfer\",\"type\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\"},{\"name\":\"u\",\"type\":\"bytes32[2]\"},{\"name\":\"sender\",\"type\":\"address\"},{\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"verifyBurn\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/BurnVerifier.sol\":\"BurnVerifier\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/BurnVerifier.sol\":{\"keccak256\":\"0x16d165a04d131d098f1bee2d0fc5f1c3e59cf2f1bc2ad2691a37a8cf1a3f8f08\",\"urls\":[\"bzzr://42aa78d1ebcb573dff9ea88ffd437e142661379df7ec7581336ddb5e86f294b8\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/Utils.sol\":{\"keccak256\":\"0x3b410db08d55d9540e8e795474410304be456ca3a36beb8c209019344593b267\",\"urls\":[\"bzzr://f5eaba23ec02eb7c30ce30f795aa0d7b1ae29d61d8111e2955a0f505bd1b328a\"]}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50620000616040805190810160405280600181526020017f4700000000000000000000000000000000000000000000000000000000000000815250620001fd640100000000026401000000009004565b60806000820151816000015560208201518160010155905050620000c96040805190810160405280600181526020017f5600000000000000000000000000000000000000000000000000000000000000815250620001fd640100000000026401000000009004565b6082600082015181600001556020820151816001015590505060008090505b6020811015620001f657620001426040805190810160405280600181526020017f47000000000000000000000000000000000000000000000000000000000000008152508262000280640100000000026401000000009004565b6000826020811015156200015257fe5b600202016000820151816000015560208201518160010155905050620001bd6040805190810160405280600181526020017f48000000000000000000000000000000000000000000000000000000000000008152508262000280640100000000026401000000009004565b604082602081101515620001cd57fe5b6002020160008201518160000155602082015181600101559050508080600101915050620000e8565b506200055f565b620002076200044e565b620002797f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47836040516020016200023f9190620004ba565b60405160208183030381529060405280519060200120600190048115156200026357fe5b0662000306640100000000026401000000009004565b9050919050565b6200028a6200044e565b620002fe7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478484604051602001620002c4929190620004d3565b6040516020818303038152906040528051906020012060019004811515620002e857fe5b0662000306640100000000026401000000009004565b905092915050565b620003106200044e565b60005b600115620003c357600060036200033b856003620003e0640100000000026401000000009004565b0190506200038981600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47018115156200037357fe5b04620003e0640100000000026401000000009004565b915080620003a8836002620003e0640100000000026401000000009004565b1415620003b65750620003c3565b6001840193505062000313565b604080519081016040528084815260200182815250915050919050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa15156200044257600080fd5b80519250505092915050565b604080519081016040528060008152602001600081525090565b60006200047582620004ff565b6200048181856200050a565b9350620004938185602086016200051f565b80840191505092915050565b620004b4620004ae8262000515565b62000555565b82525050565b6000620004c8828462000468565b915081905092915050565b6000620004e1828562000468565b9150620004ef82846200049f565b6020820191508190509392505050565b600081519050919050565b600081905092915050565b6000819050919050565b60005b838110156200053f57808201518184015260208101905062000522565b838111156200054f576000848401525b50505050565b6000819050919050565b6126a1806200056f6000396000f3fe608060405234801561001057600080fd5b5060043610610048576000357c0100000000000000000000000000000000000000000000000000000000900480636e1a999e1461004d575b600080fd5b61006760048036036100629190810190611fc0565b61007d565b60405161007491906122ce565b60405180910390f35b6000610087611a72565b60408051908101604052808b60006002811015156100a157fe5b60200201516001900481526020018b60016002811015156100be57fe5b602002015160019004815250816000018190525060408051908101604052808a60006002811015156100ec57fe5b60200201516001900481526020018a600160028110151561010957fe5b6020020151600190048152508160200181905250604080519081016040528089600060028110151561013757fe5b602002015160019004815260200189600160028110151561015457fe5b60200201516001900481525081604001819052508681606001818152505085816080018181525050604080519081016040528086600060028110151561019657fe5b60200201516001900481526020018660016002811015156101b357fe5b6020020151600190048152508160c00181905250838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610207611adf565b6102108461022c565b905061021c8282610512565b9250505098975050505050505050565b610234611adf565b604080519081016040528061024a84600061131d565b815260200161025a84602061131d565b8152508160000181905250604080519081016040528061027b84604061131d565b815260200161028b84606061131d565b815250816020018190525060408051908101604052806102ac84608061131d565b81526020016102bc8460a061131d565b815250816040018190525060408051908101604052806102dd8460c061131d565b81526020016102ed8460e061131d565b81525081606001819052506040805190810160405280604080519081016040528061031a8661010061131d565b815260200161032b8661012061131d565b8152508152602001604080519081016040528061034a8661014061131d565b815260200161035b8661016061131d565b81525081525081608001819052506103758261018061131d565b8160a001818152505061038a826101a061131d565b8160c001818152505061039f826101c061131d565b8160e00181815250506103b4826101e061131d565b816101000181815250506103ca8261020061131d565b816101200181815250506103e08261022061131d565b816101400181815250506103f68261024061131d565b81610160018181525050610408611b6c565b60008090505b60058110156104c857604080519081016040528061043386604085026102600161131d565b815260200161044986604085026102800161131d565b81525082600001518260058110151561045e57fe5b6020020181905250604080519081016040528061048586604085600501026102600161131d565b815260200161049e86604085600501026102800161131d565b8152508260200151826005811015156104b357fe5b6020020181905250808060010191505061040e565b506104db8360806005026102600161131d565b8160400181815250506104f68360806005026102800161131d565b8160600181815250508082610180018190525081915050919050565b60008061056a846000015185602001518660400151876060015188608001518960a0015160405160200161054b96959493929190612329565b6040516020818303038152906040528051906020012060019004611336565b9050610574611ba2565b6105bf8285600001518660200151876040015188606001516040516020016105a0959493929190612407565b6040516020818303038152906040528051906020012060019004611336565b8160000181815250506105d5816000015161136b565b816020018190525061061481600001516040516020016105f5919061238c565b6040516020818303038152906040528051906020012060019004611336565b8160400181815250506020604051908101604052806106416002846040015161140890919063ffffffff16565b815250816060018190525061067a81604001518260600151600060018110151561066757fe5b602002015161147590919063ffffffff16565b8160800181815250506107116106b782608001516106a9602060020a856080015161147590919063ffffffff16565b6114ac90919063ffffffff16565b6107036106e8846060015160006001811015156106d057fe5b602002015185604001516114ac90919063ffffffff16565b6106f585602001516114ec565b61147590919063ffffffff16565b6114ac90919063ffffffff16565b816101000181815250506107378161010001518560a001516114ac90919063ffffffff16565b8160e001818152505060008090505b60208110156107a45761077c8160020a8360600151600060018110151561076957fe5b602002015161147590919063ffffffff16565b8260a001518260208110151561078e57fe5b6020020181815250508080600101915050610746565b506107e2816040015185608001516040516020016107c39291906123a7565b6040516020818303038152906040528051906020012060019004611336565b8160c00181815250506108536108138560800151600060028110151561080457fe5b60200201518360c00151611537565b61084e8660800151600160028110151561082957fe5b60200201516108498560c001518660c0015161147590919063ffffffff16565b611537565b611572565b816101200181905250610864611c0e565b6108b6610896608060408051908101604052908160008201548152602001600182015481525050876101200151611537565b6108b188604001516108ac8961010001516115b8565b611537565b611572565b81602001819052506109016040805190810160405280600681526020017f5a6574686572000000000000000000000000000000000000000000000000000081525087608001516115e4565b816040018190525061093f61091f8260400151876101200151611537565b61093a8860c001516109358961010001516115b8565b611537565b611572565b81606001819052506109b761099a61096d61096289602001518960600151611572565b886101200151611537565b6109956109828a600001518a60400151611572565b6109908a61010001516115b8565b611537565b611572565b836060015160006001811015156109ad57fe5b6020020151611537565b8160800181905250610a54610a4a610a3f610a2c6109f96080604080519081016040529081600082015481526020016001820154815250508760e00151611537565b610a276082604080519081016040529081600082015481526020016001820154815250508b60c00151611537565b611572565b610a3a866101200151611654565b611572565b876101000151611537565b8260800151611572565b8160a00181905250610ac9610a8e608060408051908101604052908160008201548152602001600182015481525050876101400151611537565b610ac4610aa48960200151896101200151611537565b610abf8a60000151610aba8b61010001516115b8565b611537565b611572565b611572565b8160c00181905250610b3e610b03608260408051908101604052908160008201548152602001600182015481525050876101600151611537565b610b39610b198860600151896101200151611537565b610b348960400151610b2f8b61010001516115b8565b611537565b611572565b611572565b8160e00181905250610b9b8260c00151826020015183606001518460a001518560c001518660e00151604051602001610b7c9695949392919061245b565b6040516020818303038152906040528051906020012060019004611336565b8160000181815250508461010001518160000151141515610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be8906122e9565b60405180910390fd5b610bf9611c7e565b610c308260000151604051602001610c11919061238c565b6040516020818303038152906040528051906020012060019004611336565b816080018181525050610c676080604080519081016040529081600082015481526020016001820154815250508260800151611537565b8160000181905250610cd56040602080602002604051908101604052809291906000905b82821015610cc7578382600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190610c8b565b5050505084602001516116cd565b8160200181905250610cfc610cf284602001518560400151611744565b8460a001516117ab565b8160400181905250610dbb610da4610d298860000151610d248a602001518860c00151611537565b611572565b610d9f610d8d6000602080602002604051908101604052809291906000905b82821015610d84578382600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190610d48565b50505050611824565b610d9a88604001516115b8565b611537565b611572565b610db68360200151846040015161186c565b611572565b8160600181905250610e068160600151610e01608260408051908101604052908160008201548152602001600182015481525050610dfc8a60e001516115b8565b611537565b611572565b8160600181905250610e2d8160600151610e2883600001518960a00151611537565b611572565b8160600181905250610e3d611b6c565b866101800151905060008090505b6005811015610f8a57610ebb8360800151836000015183600581101515610e6e57fe5b6020020151846020015184600581101515610e8557fe5b6020020151604051602001610e9c939291906123d0565b6040516020818303038152906040528051906020012060019004611336565b83608001818152505082608001518360a0015182600581101515610edb57fe5b6020020181815250506000610ef384608001516118d0565b9050610f748460600151610f6f610f37866000015186600581101515610f1557fe5b6020020151610f3260028a6080015161140890919063ffffffff16565b611537565b610f6a876020015187600581101515610f4c57fe5b6020020151610f6560028861140890919063ffffffff16565b611537565b611572565b611572565b8460600181905250508080600101915050610e4b565b5060018260c001516000602081101515610fa057fe5b60200201818152505060008090505b600581101561102157610ff88360a0015182600581101515610fcd57fe5b60200201518460c001516000602081101515610fe557fe5b602002015161147590919063ffffffff16565b8360c00151600060208110151561100b57fe5b6020020181815250508080600101915050610faf565b5061102a611ce1565b61104a8360c00151600060208110151561104057fe5b60200201516118d0565b8360c00151600060208110151561105d57fe5b60200201818152505060008090505b6002602081151561107957fe5b0481101561118c5760008090505b6020828260019060020a020110156111805760008160019060020a028301905083816020811015156110b557fe5b6020020151151561117457600061110d8760a00151846001600503036005811015156110dd57fe5b60200201518860a00151856001600503036005811015156110fa57fe5b602002015161147590919063ffffffff16565b9050611138818860c001518660208110151561112557fe5b602002015161147590919063ffffffff16565b8760c001518360208110151561114a57fe5b6020020181815250506001858360208110151561116357fe5b602002019015159081151581525050505b50806001019050611087565b5080600101905061106c565b50611195611d05565b61119d611d05565b60008090505b602081101561125c57611206836112016000846020811015156111c257fe5b60020201604080519081016040529081600082015481526020016001820154815250508960c00151856020811015156111f757fe5b6020020151611537565b611572565b925061124d8261124888602001518460208110151561122157fe5b60200201518960c001518560016020030360208110151561123e57fe5b6020020151611537565b611572565b915080806001019150506111a3565b50611265611d05565b6112b961128c611279858860400151611537565b611287858960600151611537565b611572565b6112b488600001516112af89606001518a6040015161147590919063ffffffff16565b611537565b611572565b90506112c9866060015182611906565b151561130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190612309565b60405180910390fd5b6001995050505050505050505092915050565b6000604051826020850101518152805191505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018281151561136357fe5b069050919050565b611373611d1f565b600181600060208110151561138457fe5b6020020181815250508181600160208110151561139d57fe5b6020020181815250506000600290505b6020811015611402576113de8383600184036020811015156113cb57fe5b602002015161147590919063ffffffff16565b82826020811015156113ec57fe5b60200201818152505080806001019150506113ad565b50919050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa151561146957600080fd5b80519250505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156114a157fe5b828409905092915050565b6000818310156114e05782827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103016114e4565b8183035b905092915050565b600080600090505b602081101561153157611522838260208110151561150e57fe5b60200201518361192e90919063ffffffff16565b915080806001019150506114f4565b50919050565b61153f611d05565b604051835181526020840151602082015282604082015260408260608360075afa151561156b57600080fd5b5092915050565b61157a611d05565b6040518351815260208401516020820152825160408201526020830151606082015260408260808360065afa15156115b157600080fd5b5092915050565b6000817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001039050919050565b6115ec611d05565b61164c7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784846040516020016116239291906122a6565b604051602081830303815290604052805190602001206001900481151561164657fe5b06611965565b905092915050565b61165c611d05565b6040805190810160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001518115156116a057fe5b067f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47038152509050919050565b6116d5611d43565b60008090505b602081101561173d5761171a84826020811015156116f557fe5b6020020151611715858460208110151561170b57fe5b60200201516118d0565b611537565b828260208110151561172857fe5b602002018190525080806001019150506116db565b5092915050565b61174c611d1f565b60008090505b60208110156117a45761178083858360208110151561176d57fe5b602002015161147590919063ffffffff16565b828260208110151561178e57fe5b6020020181815250508080600101915050611752565b5092915050565b6117b3611d1f565b60008090505b602081101561181d576117f983826020811015156117d357fe5b602002015185836020811015156117e657fe5b602002015161192e90919063ffffffff16565b828260208110151561180757fe5b60200201818152505080806001019150506117b9565b5092915050565b61182c611d05565b60008090505b60208110156118665761185782848360208110151561184d57fe5b6020020151611572565b91508080600101915050611832565b50919050565b611874611d05565b60008090505b60208110156118c9576118ba826118b5868460208110151561189857fe5b602002015186856020811015156118ab57fe5b6020020151611537565b611572565b9150808060010191505061187a565b5092915050565b60006118ff8260027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103611408565b9050919050565b600081600001518360000151148015611926575081602001518360200151145b905092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180151561195a57fe5b828408905092915050565b61196d611d05565b60005b6001156119e85760006003611986856003611a05565b0190506119c281600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47018115156119bc57fe5b04611a05565b9150806119d0836002611a05565b14156119dc57506119e8565b60018401935050611970565b604080519081016040528084815260200182815250915050919050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa1515611a6657600080fd5b80519250505092915050565b61016060405190810160405280611a87611d72565b8152602001611a94611d72565b8152602001611aa1611d72565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001611ad9611d72565b81525090565b61052060405190810160405280611af4611d72565b8152602001611b01611d72565b8152602001611b0e611d72565b8152602001611b1b611d72565b8152602001611b28611d8c565b815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001611b66611dba565b81525090565b6102c060405190810160405280611b81611df0565b8152602001611b8e611df0565b815260200160008152602001600081525090565b6109206040519081016040528060008152602001611bbe611e1f565b815260200160008152602001611bd2611e43565b815260200160008152602001611be6611e1f565b8152602001600081526020016000815260200160008152602001611c08611d72565b81525090565b6101e06040519081016040528060008152602001611c2a611d72565b8152602001611c37611d72565b8152602001611c44611d72565b8152602001611c51611d72565b8152602001611c5e611d72565b8152602001611c6b611d72565b8152602001611c78611d72565b81525090565b61114060405190810160405280611c93611d72565b8152602001611ca0611e66565b8152602001611cad611e1f565b8152602001611cba611d72565b815260200160008152602001611cce611e95565b8152602001611cdb611e1f565b81525090565b61040060405190810160405280602090602082028038833980820191505090505090565b604080519081016040528060008152602001600081525090565b61040060405190810160405280602090602082028038833980820191505090505090565b610800604051908101604052806020905b611d5c611d72565b815260200190600190039081611d545790505090565b604080519081016040528060008152602001600081525090565b6080604051908101604052806002905b611da4611d72565b815260200190600190039081611d9c5790505090565b6102c060405190810160405280611dcf611df0565b8152602001611ddc611df0565b815260200160008152602001600081525090565b610140604051908101604052806005905b611e09611d72565b815260200190600190039081611e015790505090565b61040060405190810160405280602090602082028038833980820191505090505090565b602060405190810160405280600190602082028038833980820191505090505090565b610800604051908101604052806020905b611e7f611d72565b815260200190600190039081611e775790505090565b60a060405190810160405280600590602082028038833980820191505090505090565b6000611ec482356125d5565b905092915050565b600082601f8301121515611edf57600080fd5b6002611ef2611eed826124eb565b6124be565b91508183856020840282011115611f0857600080fd5b60005b83811015611f385781611f1e8882611f42565b845260208401935060208301925050600181019050611f0b565b5050505092915050565b6000611f4e82356125e7565b905092915050565b600082601f8301121515611f6957600080fd5b8135611f7c611f778261250d565b6124be565b91508082526020830160208301858383011115611f9857600080fd5b611fa383828461261b565b50505092915050565b6000611fb88235612611565b905092915050565b600080600080600080600080610180898b031215611fdd57600080fd5b6000611feb8b828c01611ecc565b9850506040611ffc8b828c01611ecc565b975050608061200d8b828c01611ecc565b96505060c061201e8b828c01611fac565b95505060e061202f8b828c01611fac565b9450506101006120418b828c01611ecc565b9350506101406120538b828c01611eb8565b92505061016089013567ffffffffffffffff81111561207157600080fd5b61207d8b828c01611f56565b9150509295985092959890939650565b60006120998383612213565b60408301905092915050565b6120ae8161258d565b82525050565b6120bd81612543565b6120c78184612566565b92506120d282612539565b60005b82811015612100576120e885835161208d565b94506120f382612559565b91506001810190506120d5565b5050505050565b6121108161259f565b82525050565b60006121218261254e565b61212b8185612582565b935061213b81856020860161262a565b80840191505092915050565b6000612154602a83612571565b91507f5369676d612070726f746f636f6c206368616c6c656e676520657175616c697460008301527f79206661696c7572652e000000000000000000000000000000000000000000006020830152604082019050919050565b60006121ba602583612571565b91507f496e6e65722070726f6475637420657175616c69747920636865636b2066616960008301527f6c7572652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6040820160008201516122296000850182612271565b50602082015161223c6020850182612271565b50505050565b6040820160008201516122586000850182612271565b50602082015161226b6020850182612271565b50505050565b61227a816125cb565b82525050565b612289816125cb565b82525050565b6122a061229b826125cb565b61265d565b82525050565b60006122b28285612116565b91506122be828461228f565b6020820191508190509392505050565b60006020820190506122e36000830184612107565b92915050565b6000602082019050818103600083015261230281612147565b9050919050565b60006020820190508181036000830152612322816121ad565b9050919050565b60006101208201905061233f6000830189612242565b61234c6040830188612242565b6123596080830187612242565b61236660c0830186612280565b61237360e0830185612280565b6123816101008301846120a5565b979650505050505050565b60006020820190506123a16000830184612280565b92915050565b600060a0820190506123bc6000830185612280565b6123c960208301846120b4565b9392505050565b600060a0820190506123e56000830186612280565b6123f26020830185612242565b6123ff6060830184612242565b949350505050565b60006101208201905061241d6000830188612280565b61242a6020830187612242565b6124376060830186612242565b61244460a0830185612242565b61245160e0830184612242565b9695505050505050565b6000610160820190506124716000830189612280565b61247e6020830188612242565b61248b6060830187612242565b61249860a0830186612242565b6124a560e0830185612242565b6124b3610120830184612242565b979650505050505050565b6000604051905081810181811067ffffffffffffffff821117156124e157600080fd5b8060405250919050565b600067ffffffffffffffff82111561250257600080fd5b602082029050919050565b600067ffffffffffffffff82111561252457600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b600060029050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612598826125ab565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006125e0826125f1565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561264857808201518184015260208101905061262d565b83811115612657576000848401525b50505050565b600081905091905056fea265627a7a723058208e2d4bcdcb6060ca0c6000ea1006cceb2c2ba54aa9a8fc4a134197d09fdb35346c6578706572696d656e74616cf50037", - "deployedBytecode": "0x608060405234801561001057600080fd5b5060043610610048576000357c0100000000000000000000000000000000000000000000000000000000900480636e1a999e1461004d575b600080fd5b61006760048036036100629190810190611fc0565b61007d565b60405161007491906122ce565b60405180910390f35b6000610087611a72565b60408051908101604052808b60006002811015156100a157fe5b60200201516001900481526020018b60016002811015156100be57fe5b602002015160019004815250816000018190525060408051908101604052808a60006002811015156100ec57fe5b60200201516001900481526020018a600160028110151561010957fe5b6020020151600190048152508160200181905250604080519081016040528089600060028110151561013757fe5b602002015160019004815260200189600160028110151561015457fe5b60200201516001900481525081604001819052508681606001818152505085816080018181525050604080519081016040528086600060028110151561019657fe5b60200201516001900481526020018660016002811015156101b357fe5b6020020151600190048152508160c00181905250838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610207611adf565b6102108461022c565b905061021c8282610512565b9250505098975050505050505050565b610234611adf565b604080519081016040528061024a84600061131d565b815260200161025a84602061131d565b8152508160000181905250604080519081016040528061027b84604061131d565b815260200161028b84606061131d565b815250816020018190525060408051908101604052806102ac84608061131d565b81526020016102bc8460a061131d565b815250816040018190525060408051908101604052806102dd8460c061131d565b81526020016102ed8460e061131d565b81525081606001819052506040805190810160405280604080519081016040528061031a8661010061131d565b815260200161032b8661012061131d565b8152508152602001604080519081016040528061034a8661014061131d565b815260200161035b8661016061131d565b81525081525081608001819052506103758261018061131d565b8160a001818152505061038a826101a061131d565b8160c001818152505061039f826101c061131d565b8160e00181815250506103b4826101e061131d565b816101000181815250506103ca8261020061131d565b816101200181815250506103e08261022061131d565b816101400181815250506103f68261024061131d565b81610160018181525050610408611b6c565b60008090505b60058110156104c857604080519081016040528061043386604085026102600161131d565b815260200161044986604085026102800161131d565b81525082600001518260058110151561045e57fe5b6020020181905250604080519081016040528061048586604085600501026102600161131d565b815260200161049e86604085600501026102800161131d565b8152508260200151826005811015156104b357fe5b6020020181905250808060010191505061040e565b506104db8360806005026102600161131d565b8160400181815250506104f68360806005026102800161131d565b8160600181815250508082610180018190525081915050919050565b60008061056a846000015185602001518660400151876060015188608001518960a0015160405160200161054b96959493929190612329565b6040516020818303038152906040528051906020012060019004611336565b9050610574611ba2565b6105bf8285600001518660200151876040015188606001516040516020016105a0959493929190612407565b6040516020818303038152906040528051906020012060019004611336565b8160000181815250506105d5816000015161136b565b816020018190525061061481600001516040516020016105f5919061238c565b6040516020818303038152906040528051906020012060019004611336565b8160400181815250506020604051908101604052806106416002846040015161140890919063ffffffff16565b815250816060018190525061067a81604001518260600151600060018110151561066757fe5b602002015161147590919063ffffffff16565b8160800181815250506107116106b782608001516106a9602060020a856080015161147590919063ffffffff16565b6114ac90919063ffffffff16565b6107036106e8846060015160006001811015156106d057fe5b602002015185604001516114ac90919063ffffffff16565b6106f585602001516114ec565b61147590919063ffffffff16565b6114ac90919063ffffffff16565b816101000181815250506107378161010001518560a001516114ac90919063ffffffff16565b8160e001818152505060008090505b60208110156107a45761077c8160020a8360600151600060018110151561076957fe5b602002015161147590919063ffffffff16565b8260a001518260208110151561078e57fe5b6020020181815250508080600101915050610746565b506107e2816040015185608001516040516020016107c39291906123a7565b6040516020818303038152906040528051906020012060019004611336565b8160c00181815250506108536108138560800151600060028110151561080457fe5b60200201518360c00151611537565b61084e8660800151600160028110151561082957fe5b60200201516108498560c001518660c0015161147590919063ffffffff16565b611537565b611572565b816101200181905250610864611c0e565b6108b6610896608060408051908101604052908160008201548152602001600182015481525050876101200151611537565b6108b188604001516108ac8961010001516115b8565b611537565b611572565b81602001819052506109016040805190810160405280600681526020017f5a6574686572000000000000000000000000000000000000000000000000000081525087608001516115e4565b816040018190525061093f61091f8260400151876101200151611537565b61093a8860c001516109358961010001516115b8565b611537565b611572565b81606001819052506109b761099a61096d61096289602001518960600151611572565b886101200151611537565b6109956109828a600001518a60400151611572565b6109908a61010001516115b8565b611537565b611572565b836060015160006001811015156109ad57fe5b6020020151611537565b8160800181905250610a54610a4a610a3f610a2c6109f96080604080519081016040529081600082015481526020016001820154815250508760e00151611537565b610a276082604080519081016040529081600082015481526020016001820154815250508b60c00151611537565b611572565b610a3a866101200151611654565b611572565b876101000151611537565b8260800151611572565b8160a00181905250610ac9610a8e608060408051908101604052908160008201548152602001600182015481525050876101400151611537565b610ac4610aa48960200151896101200151611537565b610abf8a60000151610aba8b61010001516115b8565b611537565b611572565b611572565b8160c00181905250610b3e610b03608260408051908101604052908160008201548152602001600182015481525050876101600151611537565b610b39610b198860600151896101200151611537565b610b348960400151610b2f8b61010001516115b8565b611537565b611572565b611572565b8160e00181905250610b9b8260c00151826020015183606001518460a001518560c001518660e00151604051602001610b7c9695949392919061245b565b6040516020818303038152906040528051906020012060019004611336565b8160000181815250508461010001518160000151141515610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be8906122e9565b60405180910390fd5b610bf9611c7e565b610c308260000151604051602001610c11919061238c565b6040516020818303038152906040528051906020012060019004611336565b816080018181525050610c676080604080519081016040529081600082015481526020016001820154815250508260800151611537565b8160000181905250610cd56040602080602002604051908101604052809291906000905b82821015610cc7578382600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190610c8b565b5050505084602001516116cd565b8160200181905250610cfc610cf284602001518560400151611744565b8460a001516117ab565b8160400181905250610dbb610da4610d298860000151610d248a602001518860c00151611537565b611572565b610d9f610d8d6000602080602002604051908101604052809291906000905b82821015610d84578382600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190610d48565b50505050611824565b610d9a88604001516115b8565b611537565b611572565b610db68360200151846040015161186c565b611572565b8160600181905250610e068160600151610e01608260408051908101604052908160008201548152602001600182015481525050610dfc8a60e001516115b8565b611537565b611572565b8160600181905250610e2d8160600151610e2883600001518960a00151611537565b611572565b8160600181905250610e3d611b6c565b866101800151905060008090505b6005811015610f8a57610ebb8360800151836000015183600581101515610e6e57fe5b6020020151846020015184600581101515610e8557fe5b6020020151604051602001610e9c939291906123d0565b6040516020818303038152906040528051906020012060019004611336565b83608001818152505082608001518360a0015182600581101515610edb57fe5b6020020181815250506000610ef384608001516118d0565b9050610f748460600151610f6f610f37866000015186600581101515610f1557fe5b6020020151610f3260028a6080015161140890919063ffffffff16565b611537565b610f6a876020015187600581101515610f4c57fe5b6020020151610f6560028861140890919063ffffffff16565b611537565b611572565b611572565b8460600181905250508080600101915050610e4b565b5060018260c001516000602081101515610fa057fe5b60200201818152505060008090505b600581101561102157610ff88360a0015182600581101515610fcd57fe5b60200201518460c001516000602081101515610fe557fe5b602002015161147590919063ffffffff16565b8360c00151600060208110151561100b57fe5b6020020181815250508080600101915050610faf565b5061102a611ce1565b61104a8360c00151600060208110151561104057fe5b60200201516118d0565b8360c00151600060208110151561105d57fe5b60200201818152505060008090505b6002602081151561107957fe5b0481101561118c5760008090505b6020828260019060020a020110156111805760008160019060020a028301905083816020811015156110b557fe5b6020020151151561117457600061110d8760a00151846001600503036005811015156110dd57fe5b60200201518860a00151856001600503036005811015156110fa57fe5b602002015161147590919063ffffffff16565b9050611138818860c001518660208110151561112557fe5b602002015161147590919063ffffffff16565b8760c001518360208110151561114a57fe5b6020020181815250506001858360208110151561116357fe5b602002019015159081151581525050505b50806001019050611087565b5080600101905061106c565b50611195611d05565b61119d611d05565b60008090505b602081101561125c57611206836112016000846020811015156111c257fe5b60020201604080519081016040529081600082015481526020016001820154815250508960c00151856020811015156111f757fe5b6020020151611537565b611572565b925061124d8261124888602001518460208110151561122157fe5b60200201518960c001518560016020030360208110151561123e57fe5b6020020151611537565b611572565b915080806001019150506111a3565b50611265611d05565b6112b961128c611279858860400151611537565b611287858960600151611537565b611572565b6112b488600001516112af89606001518a6040015161147590919063ffffffff16565b611537565b611572565b90506112c9866060015182611906565b151561130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190612309565b60405180910390fd5b6001995050505050505050505092915050565b6000604051826020850101518152805191505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018281151561136357fe5b069050919050565b611373611d1f565b600181600060208110151561138457fe5b6020020181815250508181600160208110151561139d57fe5b6020020181815250506000600290505b6020811015611402576113de8383600184036020811015156113cb57fe5b602002015161147590919063ffffffff16565b82826020811015156113ec57fe5b60200201818152505080806001019150506113ad565b50919050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa151561146957600080fd5b80519250505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156114a157fe5b828409905092915050565b6000818310156114e05782827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103016114e4565b8183035b905092915050565b600080600090505b602081101561153157611522838260208110151561150e57fe5b60200201518361192e90919063ffffffff16565b915080806001019150506114f4565b50919050565b61153f611d05565b604051835181526020840151602082015282604082015260408260608360075afa151561156b57600080fd5b5092915050565b61157a611d05565b6040518351815260208401516020820152825160408201526020830151606082015260408260808360065afa15156115b157600080fd5b5092915050565b6000817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001039050919050565b6115ec611d05565b61164c7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784846040516020016116239291906122a6565b604051602081830303815290604052805190602001206001900481151561164657fe5b06611965565b905092915050565b61165c611d05565b6040805190810160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001518115156116a057fe5b067f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47038152509050919050565b6116d5611d43565b60008090505b602081101561173d5761171a84826020811015156116f557fe5b6020020151611715858460208110151561170b57fe5b60200201516118d0565b611537565b828260208110151561172857fe5b602002018190525080806001019150506116db565b5092915050565b61174c611d1f565b60008090505b60208110156117a45761178083858360208110151561176d57fe5b602002015161147590919063ffffffff16565b828260208110151561178e57fe5b6020020181815250508080600101915050611752565b5092915050565b6117b3611d1f565b60008090505b602081101561181d576117f983826020811015156117d357fe5b602002015185836020811015156117e657fe5b602002015161192e90919063ffffffff16565b828260208110151561180757fe5b60200201818152505080806001019150506117b9565b5092915050565b61182c611d05565b60008090505b60208110156118665761185782848360208110151561184d57fe5b6020020151611572565b91508080600101915050611832565b50919050565b611874611d05565b60008090505b60208110156118c9576118ba826118b5868460208110151561189857fe5b602002015186856020811015156118ab57fe5b6020020151611537565b611572565b9150808060010191505061187a565b5092915050565b60006118ff8260027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103611408565b9050919050565b600081600001518360000151148015611926575081602001518360200151145b905092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180151561195a57fe5b828408905092915050565b61196d611d05565b60005b6001156119e85760006003611986856003611a05565b0190506119c281600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47018115156119bc57fe5b04611a05565b9150806119d0836002611a05565b14156119dc57506119e8565b60018401935050611970565b604080519081016040528084815260200182815250915050919050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa1515611a6657600080fd5b80519250505092915050565b61016060405190810160405280611a87611d72565b8152602001611a94611d72565b8152602001611aa1611d72565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001611ad9611d72565b81525090565b61052060405190810160405280611af4611d72565b8152602001611b01611d72565b8152602001611b0e611d72565b8152602001611b1b611d72565b8152602001611b28611d8c565b815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001611b66611dba565b81525090565b6102c060405190810160405280611b81611df0565b8152602001611b8e611df0565b815260200160008152602001600081525090565b6109206040519081016040528060008152602001611bbe611e1f565b815260200160008152602001611bd2611e43565b815260200160008152602001611be6611e1f565b8152602001600081526020016000815260200160008152602001611c08611d72565b81525090565b6101e06040519081016040528060008152602001611c2a611d72565b8152602001611c37611d72565b8152602001611c44611d72565b8152602001611c51611d72565b8152602001611c5e611d72565b8152602001611c6b611d72565b8152602001611c78611d72565b81525090565b61114060405190810160405280611c93611d72565b8152602001611ca0611e66565b8152602001611cad611e1f565b8152602001611cba611d72565b815260200160008152602001611cce611e95565b8152602001611cdb611e1f565b81525090565b61040060405190810160405280602090602082028038833980820191505090505090565b604080519081016040528060008152602001600081525090565b61040060405190810160405280602090602082028038833980820191505090505090565b610800604051908101604052806020905b611d5c611d72565b815260200190600190039081611d545790505090565b604080519081016040528060008152602001600081525090565b6080604051908101604052806002905b611da4611d72565b815260200190600190039081611d9c5790505090565b6102c060405190810160405280611dcf611df0565b8152602001611ddc611df0565b815260200160008152602001600081525090565b610140604051908101604052806005905b611e09611d72565b815260200190600190039081611e015790505090565b61040060405190810160405280602090602082028038833980820191505090505090565b602060405190810160405280600190602082028038833980820191505090505090565b610800604051908101604052806020905b611e7f611d72565b815260200190600190039081611e775790505090565b60a060405190810160405280600590602082028038833980820191505090505090565b6000611ec482356125d5565b905092915050565b600082601f8301121515611edf57600080fd5b6002611ef2611eed826124eb565b6124be565b91508183856020840282011115611f0857600080fd5b60005b83811015611f385781611f1e8882611f42565b845260208401935060208301925050600181019050611f0b565b5050505092915050565b6000611f4e82356125e7565b905092915050565b600082601f8301121515611f6957600080fd5b8135611f7c611f778261250d565b6124be565b91508082526020830160208301858383011115611f9857600080fd5b611fa383828461261b565b50505092915050565b6000611fb88235612611565b905092915050565b600080600080600080600080610180898b031215611fdd57600080fd5b6000611feb8b828c01611ecc565b9850506040611ffc8b828c01611ecc565b975050608061200d8b828c01611ecc565b96505060c061201e8b828c01611fac565b95505060e061202f8b828c01611fac565b9450506101006120418b828c01611ecc565b9350506101406120538b828c01611eb8565b92505061016089013567ffffffffffffffff81111561207157600080fd5b61207d8b828c01611f56565b9150509295985092959890939650565b60006120998383612213565b60408301905092915050565b6120ae8161258d565b82525050565b6120bd81612543565b6120c78184612566565b92506120d282612539565b60005b82811015612100576120e885835161208d565b94506120f382612559565b91506001810190506120d5565b5050505050565b6121108161259f565b82525050565b60006121218261254e565b61212b8185612582565b935061213b81856020860161262a565b80840191505092915050565b6000612154602a83612571565b91507f5369676d612070726f746f636f6c206368616c6c656e676520657175616c697460008301527f79206661696c7572652e000000000000000000000000000000000000000000006020830152604082019050919050565b60006121ba602583612571565b91507f496e6e65722070726f6475637420657175616c69747920636865636b2066616960008301527f6c7572652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6040820160008201516122296000850182612271565b50602082015161223c6020850182612271565b50505050565b6040820160008201516122586000850182612271565b50602082015161226b6020850182612271565b50505050565b61227a816125cb565b82525050565b612289816125cb565b82525050565b6122a061229b826125cb565b61265d565b82525050565b60006122b28285612116565b91506122be828461228f565b6020820191508190509392505050565b60006020820190506122e36000830184612107565b92915050565b6000602082019050818103600083015261230281612147565b9050919050565b60006020820190508181036000830152612322816121ad565b9050919050565b60006101208201905061233f6000830189612242565b61234c6040830188612242565b6123596080830187612242565b61236660c0830186612280565b61237360e0830185612280565b6123816101008301846120a5565b979650505050505050565b60006020820190506123a16000830184612280565b92915050565b600060a0820190506123bc6000830185612280565b6123c960208301846120b4565b9392505050565b600060a0820190506123e56000830186612280565b6123f26020830185612242565b6123ff6060830184612242565b949350505050565b60006101208201905061241d6000830188612280565b61242a6020830187612242565b6124376060830186612242565b61244460a0830185612242565b61245160e0830184612242565b9695505050505050565b6000610160820190506124716000830189612280565b61247e6020830188612242565b61248b6060830187612242565b61249860a0830186612242565b6124a560e0830185612242565b6124b3610120830184612242565b979650505050505050565b6000604051905081810181811067ffffffffffffffff821117156124e157600080fd5b8060405250919050565b600067ffffffffffffffff82111561250257600080fd5b602082029050919050565b600067ffffffffffffffff82111561252457600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b600060029050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612598826125ab565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006125e0826125f1565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561264857808201518184015260208101905061262d565b83811115612657576000848401525b50505050565b600081905091905056fea265627a7a723058208e2d4bcdcb6060ca0c6000ea1006cceb2c2ba54aa9a8fc4a134197d09fdb35346c6578706572696d656e74616cf50037", - "sourceMap": "81:14286:0:-;;;1047:206;8:9:-1;5:2;;;30:1;27;20:12;5:2;1047:206:0;1082:12;;;;;;;;;;;;;;;;;;;:7;;;:12;;;:::i;:::-;1078:1;:16;;;;;;;;;;;;;;;;;;;1108:12;;;;;;;;;;;;;;;;;;;:7;;;:12;;;:::i;:::-;1104:1;:16;;;;;;;;;;;;;;;;;;;1135:9;1147:1;1135:13;;1130:117;160:2;1150:1;:5;1130:117;;;1184:15;;;;;;;;;;;;;;;;;;;1197:1;1184:7;;;:15;;;:::i;:::-;1176:2;1179:1;1176:5;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;;1221:15;;;;;;;;;;;;;;;;;;;1234:1;1221:7;;;:15;;;:::i;:::-;1213:2;1216:1;1213:5;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;;1157:3;;;;;;;1130:117;;;;81:14286;;14011:167;14072:14;;:::i;:::-;14105:66;227:77;14148:5;14131:23;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14131:23:0;;;14121:34;;;;;;14113:43;;;:57;;;;;;;;14105:7;;;:66;;;:::i;:::-;14098:73;;14011:167;;;:::o;14184:181::-;14256:14;;:::i;:::-;14289:69;227:77;14332:5;14339:1;14315:26;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14315:26:0;;;14305:37;;;;;;14297:46;;;:60;;;;;;;;14289:7;;;:69;;;:::i;:::-;14282:76;;14184:181;;;;:::o;13556:449::-;13610:14;;:::i;:::-;13636:9;13655:311;13662:4;13655:311;;;13682:16;13721:1;13701:17;13710:4;13716:1;13701:8;;;:17;;;:::i;:::-;:21;13682:40;;13808:41;13817:8;13847:1;13842;227:77;13828:15;13827:21;;;;;;;;13808:8;;;:41;;;:::i;:::-;13804:45;;13885:8;13867:14;13876:1;13879;13867:8;;;:14;;;:::i;:::-;:26;13863:70;;;13913:5;;;13863:70;13954:1;13946:9;;;;13655:311;;;;13982:16;;;;;;;;;13990:4;13982:16;;;;13996:1;13982:16;;;13975:23;;;13556:449;;;:::o;12940:610::-;13013:14;13064:13;227:77;13064:27;;13139:4;13133:11;13167:4;13164:1;13157:15;13206:4;13199;13196:1;13192:12;13185:26;13245:4;13238;13235:1;13231:12;13224:26;13284:4;13277;13274:1;13270:12;13263:26;13323:8;13316:4;13313:1;13309:12;13302:30;13366:5;13359:4;13356:1;13352:12;13345:27;13429:4;13426:1;13420:4;13417:1;13411:4;13406:3;13395:39;13388:47;13385:2;;;13487:1;13484;13477:12;13385:2;13532:1;13526:8;13516:18;;13110:434;;;;;;:::o;81:14286::-;;;;;;;;;;;;;;;;;;;;:::o;5:360:-1:-;;135:39;168:5;135:39;;;186:89;268:6;263:3;186:89;;;179:96;;280:52;325:6;320:3;313:4;306:5;302:16;280:52;;;353:6;348:3;344:16;337:23;;115:250;;;;;;372:159;473:52;493:31;518:5;493:31;;;473:52;;;468:3;461:65;455:76;;;538:266;;684:95;775:3;766:6;684:95;;;677:102;;796:3;789:10;;665:139;;;;;811:405;;985:95;1076:3;1067:6;985:95;;;978:102;;1091:75;1162:3;1153:6;1091:75;;;1188:2;1183:3;1179:12;1172:19;;1208:3;1201:10;;966:250;;;;;;1223:92;;1304:5;1298:12;1288:22;;1282:33;;;;1323:145;;1459:3;1444:18;;1437:31;;;;;1476:79;;1545:5;1534:16;;1528:27;;;;1563:268;1628:1;1635:101;1649:6;1646:1;1643:13;1635:101;;;1725:1;1720:3;1716:11;1710:18;1706:1;1701:3;1697:11;1690:39;1671:2;1668:1;1664:10;1659:15;;1635:101;;;1751:6;1748:1;1745:13;1742:2;;;1816:1;1807:6;1802:3;1798:16;1791:27;1742:2;1612:219;;;;;1839:74;;1903:5;1892:16;;1886:27;;;;81:14286:0;;;;;;;", - "deployedSourceMap": "81:14286:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81:14286:0;;;;;;;;;;;;;;;;;;;;1336:1008;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1535:4;1551:30;;:::i;:::-;1896:41;;;;;;;;;1912:3;1916:1;1912:6;;;;;;;;;;;;;1904:15;;;1896:41;;;;1929:3;1933:1;1929:6;;;;;;;;;;;;;1921:15;;;1896:41;;;1880:9;:13;;:57;;;;1963:41;;;;;;;;;1979:3;1983:1;1979:6;;;;;;;;;;;;;1971:15;;;1963:41;;;;1996:3;2000:1;1996:6;;;;;;;;;;;;;1988:15;;;1963:41;;;1947:9;:13;;:57;;;;2028:37;;;;;;;;;2044:1;2046;2044:4;;;;;;;;;;;;;2036:13;;;2028:37;;;;2059:1;2061;2059:4;;;;;;;;;;;;;2051:13;;;2028:37;;;2014:9;:11;;:51;;;;2097:9;2075;:19;;:31;;;;;2134:5;2116:9;:15;;:23;;;;;2163:37;;;;;;;;;2179:1;2181;2179:4;;;;;;;;;;;;;2171:13;;;2163:37;;;;2194:1;2196;2194:4;;;;;;;;;;;;;2186:13;;;2163:37;;;2149:9;:11;;:51;;;;2229:6;2210:9;:16;;:25;;;;;;;;;;;2245:26;;:::i;:::-;2274:18;2286:5;2274:11;:18::i;:::-;2245:47;;2309:28;2316:9;2327;2309:6;:28::i;:::-;2302:35;;;;1336:1008;;;;;;;;;;:::o;8750:1165::-;8812:22;;:::i;:::-;8856:38;;;;;;;;;8864:13;8870:3;8875:1;8864:5;:13::i;:::-;8856:38;;;;8879:14;8885:3;8890:2;8879:5;:14::i;:::-;8856:38;;;8846:5;:7;;:48;;;;8914:39;;;;;;;;;8922:14;8928:3;8933:2;8922:5;:14::i;:::-;8914:39;;;;8938:14;8944:3;8949:2;8938:5;:14::i;:::-;8914:39;;;8904:5;:7;;:49;;;;8981:41;;;;;;;;;8989:15;8995:3;9000;8989:5;:15::i;:::-;8981:41;;;;9006:15;9012:3;9017;9006:5;:15::i;:::-;8981:41;;;8964:5;:14;;:58;;;;9049:41;;;;;;;;;9057:15;9063:3;9068;9057:5;:15::i;:::-;9049:41;;;;9074:15;9080:3;9085;9074:5;:15::i;:::-;9049:41;;;9032:5;:14;;:58;;;;9101:103;;;;;;;;;9119:41;;;;;;;;;9127:15;9133:3;9138;9127:5;:15::i;:::-;9119:41;;;;9144:15;9150:3;9155;9144:5;:15::i;:::-;9119:41;;;9101:103;;;;9162:41;;;;;;;;;9170:15;9176:3;9181;9170:5;:15::i;:::-;9162:41;;;;9187:15;9193:3;9198;9187:5;:15::i;:::-;9162:41;;;9101:103;;;:5;:14;;:103;;;;9227:15;9233:3;9238;9227:5;:15::i;:::-;9214:5;:10;;:28;;;;;9265:15;9271:3;9276;9265:5;:15::i;:::-;9252:5;:10;;:28;;;;;9301:15;9307:3;9312;9301:5;:15::i;:::-;9290:5;:8;;:26;;;;;9337:15;9343:3;9348;9337:5;:15::i;:::-;9327:5;:7;;:25;;;;;9375:15;9381:3;9386;9375:5;:15::i;:::-;9362:5;:10;;:28;;;;;9416:15;9422:3;9427;9416:5;:15::i;:::-;9400:5;:13;;:31;;;;;9458:15;9464:3;9469;9458:5;:15::i;:::-;9441:5;:14;;:32;;;;;9484;;:::i;:::-;9531:9;9543:1;9531:13;;9526:233;189:1;9546;:5;9526:233;;;9588:59;;;;;;;;;9596:24;9602:3;9617:2;9613:1;:6;9607:3;:12;9596:5;:24::i;:::-;9588:59;;;;9622:24;9628:3;9643:2;9639:1;:6;9633:3;:12;9622:5;:24::i;:::-;9588:59;;;9572:7;:10;;;9583:1;9572:13;;;;;;;;;;;;:75;;;;9677:71;;;;;;;;;9685:30;9691:3;9712:2;9707:1;189;9703:5;9702:12;9696:3;:18;9685:5;:30::i;:::-;9677:71;;;;9717:30;9723:3;9744:2;9739:1;189;9735:5;9734:12;9728:3;:18;9717:5;:30::i;:::-;9677:71;;;9661:7;:10;;;9672:1;9661:13;;;;;;;;;;;;:87;;;;9553:3;;;;;;;9526:233;;;;9780:25;9786:3;9801;189:1;9797:7;9791:3;:13;9780:5;:25::i;:::-;9768:7;:9;;:37;;;;;9827:25;9833:3;9848;189:1;9844:7;9838:3;:13;9827:5;:25::i;:::-;9815:7;:9;;:37;;;;;9878:7;9862:5;:13;;:23;;;;9903:5;9896:12;;;8750:1165;;;:::o;3073:5221::-;3168:4;3184:21;3208:135;3237:9;:13;;;3252:9;:13;;;3267:9;:11;;;3280:9;:19;;;3301:9;:15;;;3318:9;:16;;;3226:109;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3226:109:0;;;3216:120;;;;;;3208:129;;;:133;:135::i;:::-;3184:159;;3371:38;;:::i;:::-;3439:101;3468:13;3483:5;:7;;;3492:5;:7;;;3501:5;:14;;;3517:5;:14;;;3457:75;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3457:75:0;;;3447:86;;;;;;3439:95;;;:99;:101::i;:::-;3419:15;:17;;:121;;;;;3571:25;3578:15;:17;;;3571:6;:25::i;:::-;3550:15;:18;;:46;;;;3626:55;3655:15;:17;;;3644:29;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3644:29:0;;;3634:40;;;;;;3626:49;;;:53;:55::i;:::-;3606:15;:17;;:75;;;;;3691:47;;;;;;;;;3713:24;3735:1;3713:15;:17;;;:21;;:24;;;;:::i;:::-;3691:47;;;:15;:18;;:47;;;;3771:44;3797:15;:17;;;3771:15;:18;;;3790:1;3771:21;;;;;;;;;;;;;:25;;:44;;;;:::i;:::-;3748:15;:20;;:67;;;;;3860:144;3945:58;3982:15;:20;;;3945:32;160:2;3970:1;:6;3945:15;:20;;;:24;;:32;;;;:::i;:::-;:36;;:58;;;;:::i;:::-;3860:80;3895:44;3917:15;:18;;;3936:1;3917:21;;;;;;;;;;;;;3895:15;:17;;;:21;;:44;;;;:::i;:::-;3860:30;3871:15;:18;;;3860:10;:30::i;:::-;:34;;:80;;;;:::i;:::-;:84;;:144;;;;:::i;:::-;3840:15;:17;;:164;;;;;4034:33;4049:15;:17;;;4034:5;:10;;;:14;;:33;;;;:::i;:::-;4014:15;:17;;:53;;;;;4082:9;4094:1;4082:13;;4077:128;160:2;4097:1;:5;4077:128;;;4161:33;4192:1;4187;:6;4161:15;:18;;;4180:1;4161:21;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;4123:15;:32;;;4156:1;4123:35;;;;;;;;;;;;:71;;;;;4104:3;;;;;;;4077:128;;;;4235:71;4264:15;:17;;;4283:5;:14;;;4253:45;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4253:45:0;;;4243:56;;;;;;4235:65;;;:69;:71::i;:::-;4215:15;:17;;:91;;;;;4340:112;4344:41;4348:5;:14;;;4363:1;4348:17;;;;;;;;;;;;;4367:15;:17;;;4344:3;:41::i;:::-;4387:64;4391:5;:14;;;4406:1;4391:17;;;;;;;;;;;;;4410:40;4432:15;:17;;;4410:15;:17;;;:21;;:40;;;;:::i;:::-;4387:3;:64::i;:::-;4340:3;:112::i;:::-;4316:15;:21;;:136;;;;4489:40;;:::i;:::-;4562:56;4566:18;4570:1;4566:18;;;;;;;;;;;;;;;;;;;;;;;;;;4573:5;:10;;;4566:3;:18::i;:::-;4586:31;4590:9;:11;;;4603:13;:5;:7;;;:11;:13::i;:::-;4586:3;:31::i;:::-;4562:3;:56::i;:::-;4539:16;:20;;:79;;;;4654:34;;;;;;;;;;;;;;;;;;;4672:9;:15;;;4654:7;:34::i;:::-;4628:16;:23;;:60;;;;4721:78;4725:40;4729:16;:23;;;4754:5;:10;;;4725:3;:40::i;:::-;4767:31;4771:9;:11;;;4784:13;:5;:7;;;:11;:13::i;:::-;4767:3;:31::i;:::-;4721:3;:78::i;:::-;4698:16;:20;;:101;;;;4837:140;4841:112;4845:51;4849:34;4853:9;:13;;;4868:5;:14;;;4849:3;:34::i;:::-;4885:5;:10;;;4845:3;:51::i;:::-;4898:54;4902:34;4906:9;:13;;;4921:5;:14;;;4902:3;:34::i;:::-;4938:13;:5;:7;;;:11;:13::i;:::-;4898:3;:54::i;:::-;4841:3;:112::i;:::-;4955:15;:18;;;4974:1;4955:21;;;;;;;;;;;;;4837:3;:140::i;:::-;4809:16;:25;;:168;;;;5010:129;5014:97;5018:83;5022:50;5026:25;5030:1;5026:25;;;;;;;;;;;;;;;;;;;;;;;;;;5033:15;:17;;;5026:3;:25::i;:::-;5053:18;5057:1;5053:18;;;;;;;;;;;;;;;;;;;;;;;;;;5060:5;:10;;;5053:3;:18::i;:::-;5022:3;:50::i;:::-;5074:26;5078:15;:21;;;5074:3;:26::i;:::-;5018:3;:83::i;:::-;5103:5;:7;;;5014:3;:97::i;:::-;5113:16;:25;;;5010:3;:129::i;:::-;4987:16;:20;;:152;;;;5174:98;5178:21;5182:1;5178:21;;;;;;;;;;;;;;;;;;;;;;;;;;5185:5;:13;;;5178:3;:21::i;:::-;5201:70;5205:30;5209:9;:13;;;5224:5;:10;;;5205:3;:30::i;:::-;5237:33;5241:9;:13;;;5256;:5;:7;;;:11;:13::i;:::-;5237:3;:33::i;:::-;5201:3;:70::i;:::-;5174:3;:98::i;:::-;5149:16;:22;;:123;;;;5312:101;5316:22;5320:1;5316:22;;;;;;;;;;;;;;;;;;;;;;;;;;5323:5;:14;;;5316:3;:22::i;:::-;5340:72;5344:31;5348:5;:14;;;5364:5;:10;;;5344:3;:31::i;:::-;5377:34;5381:5;:14;;;5397:13;:5;:7;;;:11;:13::i;:::-;5377:3;:34::i;:::-;5340:3;:72::i;:::-;5312:3;:101::i;:::-;5282:16;:27;;:131;;;;5445:174;5474:15;:17;;;5493:16;:20;;;5515:16;:20;;;5537:16;:20;;;5559:16;:22;;;5583:16;:27;;;5463:148;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5463:148:0;;;5453:159;;;;;;5445:168;;;:172;:174::i;:::-;5424:16;:18;;:195;;;;;5659:5;:7;;;5637:16;:18;;;:29;5629:84;;;;;;;;;;;;;;;;;;;;;;;;5724:34;;:::i;:::-;5786:56;5815:16;:18;;;5804:30;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5804:30:0;;;5794:41;;;;;;5786:50;;;:54;:56::i;:::-;5768:13;:15;;:74;;;;;5872:23;5876:1;5872:23;;;;;;;;;;;;;;;;;;;;;;;;;;5879:13;:15;;;5872:3;:23::i;:::-;5852:13;:17;;:43;;;;5929:35;5941:2;5929:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5945:15;:18;;;5929:11;:35::i;:::-;5905:13;:21;;:59;;;;5995:90;6006:44;6012:15;:18;;;6032:15;:17;;;6006:5;:44::i;:::-;6052:15;:32;;;5995:10;:90::i;:::-;5974:13;:18;;:111;;;;6113:151;6117:95;6121:45;6125:5;:7;;;6134:31;6138:5;:7;;;6147:15;:17;;;6134:3;:31::i;:::-;6121:3;:45::i;:::-;6168:43;6172:13;6182:2;6172:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:13::i;:::-;6187:23;:15;:17;;;:21;:23::i;:::-;6168:3;:43::i;:::-;6117:3;:95::i;:::-;6214:49;6221:13;:21;;;6244:13;:18;;;6214:6;:49::i;:::-;6113:3;:151::i;:::-;6095:13;:15;;:169;;;;6292:44;6296:13;:15;;;6313:22;6317:1;6313:22;;;;;;;;;;;;;;;;;;;;;;;;;;6320:14;:5;:8;;;:12;:14::i;:::-;6313:3;:22::i;:::-;6292:3;:44::i;:::-;6274:13;:15;;:62;;;;6364:56;6368:13;:15;;;6385:34;6389:13;:17;;;6408:5;:10;;;6385:3;:34::i;:::-;6364:3;:56::i;:::-;6346:13;:15;;:74;;;;6475:32;;:::i;:::-;6510:5;:13;;;6475:48;;6538:9;6550:1;6538:13;;6533:421;189:1;6553;:5;6533:421;;;6597:83;6626:13;:15;;;6643:7;:10;;;6654:1;6643:13;;;;;;;;;;;;;6658:7;:10;;;6669:1;6658:13;;;;;;;;;;;;;6615:57;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;6615:57:0;;;6605:68;;;;;;6597:77;;;:81;:83::i;:::-;6579:13;:15;;:101;;;;;6724:13;:15;;;6694:13;:24;;;6719:1;6694:27;;;;;;;;;;;;:45;;;;;6773:12;6788:21;:13;:15;;;:19;:21::i;:::-;6773:36;;6841:102;6845:13;:15;;;6862:80;6866:42;6870:7;:10;;;6881:1;6870:13;;;;;;;;;;;;;6885:22;6905:1;6885:13;:15;;;:19;;:22;;;;:::i;:::-;6866:3;:42::i;:::-;6910:31;6914:7;:10;;;6925:1;6914:13;;;;;;;;;;;;;6929:11;6938:1;6929:4;:8;;:11;;;;:::i;:::-;6910:3;:31::i;:::-;6862:3;:80::i;:::-;6841:3;:102::i;:::-;6823:13;:15;;:120;;;;6533:421;6560:3;;;;;;;6533:421;;;;6998:1;6964:13;:28;;;6993:1;6964:31;;;;;;;;;;;;:35;;;;;7014:9;7026:1;7014:13;;7009:155;189:1;7029;:5;7009:155;;;7089:64;7125:13;:24;;;7150:1;7125:27;;;;;;;;;;;;;7089:13;:28;;;7118:1;7089:31;;;;;;;;;;;;;:35;;:64;;;;:::i;:::-;7055:13;:28;;;7084:1;7055:31;;;;;;;;;;;;:98;;;;;7036:3;;;;;;;7009:155;;;;7173:21;;:::i;:::-;7238:37;:13;:28;;;7267:1;7238:31;;;;;;;;;;;;;:35;:37::i;:::-;7204:13;:28;;;7233:1;7204:31;;;;;;;;;;;;:71;;;;;7290:9;7302:1;7290:13;;7285:462;7311:1;160:2;7309:3;;;;;;;;7305:1;:7;7285:462;;;7338:9;7350:1;7338:13;;7333:404;160:2;7364:1;7359;7354;:6;;;;7353:12;:16;7333:404;;;7394:10;7417:1;7412;:6;;;;7407:1;:12;7394:25;;7442:6;7449:2;7442:10;;;;;;;;;;;;;7441:11;7437:286;;;7476:12;7491:76;7531:13;:24;;;7564:1;7560;189;7556:5;:9;7531:35;;;;;;;;;;;;;7491:13;:24;;;7524:1;7520;189;7516:5;:9;7491:35;;;;;;;;;;;;;:39;;:76;;;;:::i;:::-;7476:91;;7624:41;7660:4;7624:13;:28;;;7653:1;7624:31;;;;;;;;;;;;;:35;;:41;;;;:::i;:::-;7589:13;:28;;;7618:2;7589:32;;;;;;;;;;;;:76;;;;;7700:4;7687:6;7694:2;7687:10;;;;;;;;;;;;:17;;;;;;;;;;;7437:286;;7333:404;7371:3;;;;;7333:404;;;;7314:3;;;;;7285:462;;;;7757:20;;:::i;:::-;7787;;:::i;:::-;7822:9;7834:1;7822:13;;7817:224;160:2;7837:1;:5;7817:224;;;7871:55;7875:5;7882:43;7886:2;7889:1;7886:5;;;;;;;;;;;;7882:43;;;;;;;;;;;;;;;;;;;;;;;;;;7893:13;:28;;;7922:1;7893:31;;;;;;;;;;;;;7882:3;:43::i;:::-;7871:3;:55::i;:::-;7863:63;;7948:82;7952:5;7959:70;7963:13;:21;;;7985:1;7963:24;;;;;;;;;;;;;7989:13;:28;;;8026:1;8022;160:2;8018:5;:9;7989:39;;;;;;;;;;;;;7959:3;:70::i;:::-;7948:3;:82::i;:::-;7940:90;;7844:3;;;;;;;7817:224;;;;8050:21;;:::i;:::-;8074:104;8078:49;8082:21;8086:5;8093:7;:9;;;8082:3;:21::i;:::-;8105;8109:5;8116:7;:9;;;8105:3;:21::i;:::-;8078:3;:49::i;:::-;8129:48;8133:13;:17;;;8152:24;8166:7;:9;;;8152:7;:9;;;:13;;:24;;;;:::i;:::-;8129:3;:48::i;:::-;8074:3;:104::i;:::-;8050:128;;8196:27;8199:13;:15;;;8216:6;8196:2;:27::i;:::-;8188:77;;;;;;;;;;;;;;;;;;;;;;;;8283:4;8276:11;;;;;;;;;;;3073:5221;;;;:::o;11399:295::-;11472:14;11565:4;11559:11;11621:5;11614:4;11607:5;11603:16;11599:28;11593:35;11590:1;11583:46;11676:1;11670:8;11660:18;;11536:152;;;;;:::o;720:95:3:-;767:7;110:77;793:1;:15;;;;;;;;786:22;;720:95;;;:::o;10959:236:0:-;11012:24;;:::i;:::-;11060:1;11048:6;11055:1;11048:9;;;;;;;;;;;;:13;;;;;11083:4;11071:6;11078:1;11071:9;;;;;;;;;;;;:16;;;;;11102:9;11114:1;11102:13;;11097:92;160:2;11117:1;:5;11097:92;;;11155:23;11173:4;11155:6;11166:1;11162;:5;11155:13;;;;;;;;;;;;;:17;;:23;;;;:::i;:::-;11143:6;11150:1;11143:9;;;;;;;;;;;;:35;;;;;11124:3;;;;;;;11097:92;;;;10959:236;;;:::o;1055:580:3:-;1123:14;1149:13;110:77;1149:27;;1224:4;1218:11;1252:4;1249:1;1242:15;1291:4;1284;1281:1;1277:12;1270:26;1330:4;1323;1320:1;1316:12;1309:26;1369:4;1362;1359:1;1355:12;1348:26;1408:8;1401:4;1398:1;1394:12;1387:30;1451:5;1444:4;1441:1;1437:12;1430:27;1514:4;1511:1;1505:4;1502:1;1496:4;1491:3;1480:39;1473:47;1470:2;;;1572:1;1569;1562:12;1470:2;1617:1;1611:8;1601:18;;1195:434;;;;;;:::o;489:116::-;547:7;110:77;573:25;;;;;;;583:1;580;573:25;566:32;;489:116;;;;:::o;821:127::-;879:7;910:1;905;:6;;:36;;940:1;936;110:77;922:15;:19;905:36;;;918:1;914;:5;905:36;898:43;;821:127;;;;:::o;10365:180:0:-;10430:14;10461:9;10473:1;10461:13;;10456:83;160:2;10476:1;:5;10456:83;;;10511:17;10522:2;10525:1;10522:5;;;;;;;;;;;;;10511:6;:10;;:17;;;;:::i;:::-;10502:26;;10483:3;;;;;;;10456:83;;;;10365:180;;;:::o;12228:382::-;12293:16;;:::i;:::-;12359:4;12353:11;12393:1;12387:8;12384:1;12377:19;12443:4;12440:1;12436:12;12430:19;12423:4;12420:1;12416:12;12409:41;12484:1;12477:4;12474:1;12470:12;12463:23;12543:4;12540:1;12534:4;12531:1;12525:4;12520:3;12509:39;12502:47;12499:2;;;12578:1;12575;12568:12;12499:2;12330:274;;;;;:::o;11766:456::-;11840:16;;:::i;:::-;11906:4;11900:11;11940:2;11934:9;11931:1;11924:20;11992:4;11988:2;11984:13;11978:20;11971:4;11968:1;11964:12;11957:42;12039:2;12033:9;12026:4;12023:1;12019:12;12012:31;12091:4;12087:2;12083:13;12077:20;12070:4;12067:1;12063:12;12056:42;12155:4;12152:1;12146:4;12143:1;12137:4;12132:3;12121:39;12114:47;12111:2;;;12190:1;12187;12180:12;12111:2;11877:339;;;;;:::o;954:95:3:-;1001:7;1041:1;110:77;1027:15;1020:22;;954:95;;;:::o;14184:181:0:-;14256:14;;:::i;:::-;14289:69;227:77;14332:5;14339:1;14315:26;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14315:26:0;;;14305:37;;;;;;14297:46;;;:60;;;;;;;;14289:7;:69::i;:::-;14282:76;;14184:181;;;;:::o;12616:::-;12670:14;;:::i;:::-;12703:47;;;;;;;;;12711:1;:3;;;12703:47;;;;227:77;12731:1;:3;;;:17;;;;;;;;227:77;12716:33;12703:47;;;12696:54;;12616:181;;;:::o;10137:222::-;10225:24;;:::i;:::-;10266:9;10278:1;10266:13;;10261:92;160:2;10281:1;:5;10261:92;;;10319:23;10323:2;10326:1;10323:5;;;;;;;;;;;;;10330:11;:2;10333:1;10330:5;;;;;;;;;;;;;:9;:11::i;:::-;10319:3;:23::i;:::-;10307:6;10314:1;10307:9;;;;;;;;;;;;:35;;;;10288:3;;;;;;;10261:92;;;;10137:222;;;;:::o;11201:192::-;11271:24;;:::i;:::-;11312:9;11324:1;11312:13;;11307:80;160:2;11327:1;:5;11307:80;;;11365:11;11374:1;11365;11367;11365:4;;;;;;;;;;;;;:8;;:11;;;;:::i;:::-;11353:6;11360:1;11353:9;;;;;;;;;;;;:23;;;;;11334:3;;;;;;;11307:80;;;;11201:192;;;;:::o;9921:210::-;10006:24;;:::i;:::-;10047:9;10059:1;10047:13;;10042:83;160:2;10062:1;:5;10042:83;;;10100:14;10109:1;10111;10109:4;;;;;;;;;;;;;10100:1;10102;10100:4;;;;;;;;;;;;;:8;;:14;;;;:::i;:::-;10088:6;10095:1;10088:9;;;;;;;;;;;;:26;;;;;10069:3;;;;;;;10042:83;;;;9921:210;;;;:::o;10551:178::-;10615:18;;:::i;:::-;10650:9;10662:1;10650:13;;10645:78;160:2;10665:1;:5;10645:78;;;10697:15;10701:3;10706:2;10709:1;10706:5;;;;;;;;;;;;;10697:3;:15::i;:::-;10691:21;;10672:3;;;;;;;10645:78;;;;10551:178;;;:::o;10735:218::-;10818:21;;:::i;:::-;10856:9;10868:1;10856:13;;10851:96;160:2;10871:1;:5;10851:96;;;10906:30;10910:6;10918:17;10922:2;10925:1;10922:5;;;;;;;;;;;;;10929:2;10932:1;10929:5;;;;;;;;;;;;;10918:3;:17::i;:::-;10906:3;:30::i;:::-;10897:39;;10878:3;;;;;;;10851:96;;;;10735:218;;;;:::o;611:103:3:-;658:7;684:23;688:1;705;110:77;691:15;684:3;:23::i;:::-;677:30;;611:103;;;:::o;12803:131:0:-;12876:4;12907:2;:4;;;12899:2;:4;;;:12;:28;;;;;12923:2;:4;;;12915:2;:4;;;:12;12899:28;12892:35;;12803:131;;;;:::o;367:116:3:-;425:7;110:77;451:25;;;;;;;461:1;458;451:25;444:32;;367:116;;;;:::o;13556:449:0:-;13610:14;;:::i;:::-;13636:9;13655:311;13662:4;13655:311;;;13682:16;13721:1;13701:17;13710:4;13716:1;13701:8;:17::i;:::-;:21;13682:40;;13808:41;13817:8;13847:1;13842;227:77;13828:15;13827:21;;;;;;;;13808:8;:41::i;:::-;13804:45;;13885:8;13867:14;13876:1;13879;13867:8;:14::i;:::-;:26;13863:70;;;13913:5;;;13863:70;13954:1;13946:9;;;;13655:311;;;;13982:16;;;;;;;;;13990:4;13982:16;;;;13996:1;13982:16;;;13975:23;;;13556:449;;;:::o;12940:610::-;13013:14;13064:13;227:77;13064:27;;13139:4;13133:11;13167:4;13164:1;13157:15;13206:4;13199;13196:1;13192:12;13185:26;13245:4;13238;13235:1;13231:12;13224:26;13284:4;13277;13274:1;13270:12;13263:26;13323:8;13316:4;13313:1;13309:12;13302:30;13366:5;13359:4;13356:1;13352:12;13345:27;13429:4;13426:1;13420:4;13417:1;13411:4;13406:3;13395:39;13388:47;13385:2;;;13487:1;13484;13477:12;13385:2;13532:1;13526:8;13516:18;;13110:434;;;;;;:::o;81:14286::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:14286:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:14286:0;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:14286:0;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:14286:0;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:14286:0;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;;57:66;;;;;149:615;;264:3;257:4;249:6;245:17;241:27;234:35;231:2;;;282:1;279;272:12;231:2;306:3;324:78;339:62;394:6;339:62;;;324:78;;;315:87;;419:5;478:6;525:3;517:4;509:6;505:17;500:3;496:27;493:36;490:2;;;542:1;539;532:12;490:2;567:1;552:206;577:6;574:1;571:13;552:206;;;635:3;657:37;690:3;678:10;657:37;;;652:3;645:50;718:4;713:3;709:14;702:21;;746:4;741:3;737:14;730:21;;609:149;599:1;596;592:9;587:14;;552:206;;;556:14;224:540;;;;;;;;772:118;;839:46;877:6;864:20;839:46;;;830:55;;824:66;;;;;898:440;;999:3;992:4;984:6;980:17;976:27;969:35;966:2;;;1017:1;1014;1007:12;966:2;1054:6;1041:20;1076:64;1091:48;1132:6;1091:48;;;1076:64;;;1067:73;;1160:6;1153:5;1146:21;1196:4;1188:6;1184:17;1229:4;1222:5;1218:16;1264:3;1255:6;1250:3;1246:16;1243:25;1240:2;;;1281:1;1278;1271:12;1240:2;1291:41;1325:6;1320:3;1315;1291:41;;;959:379;;;;;;;;1346:118;;1413:46;1451:6;1438:20;1413:46;;;1404:55;;1398:66;;;;;1471:1411;;;;;;;;;1795:3;1783:9;1774:7;1770:23;1766:33;1763:2;;;1812:1;1809;1802:12;1763:2;1847:1;1864:76;1932:7;1923:6;1912:9;1908:22;1864:76;;;1854:86;;1826:120;1977:2;1995:76;2063:7;2054:6;2043:9;2039:22;1995:76;;;1985:86;;1956:121;2108:3;2127:76;2195:7;2186:6;2175:9;2171:22;2127:76;;;2117:86;;2087:122;2240:3;2259:53;2304:7;2295:6;2284:9;2280:22;2259:53;;;2249:63;;2219:99;2349:3;2368:53;2413:7;2404:6;2393:9;2389:22;2368:53;;;2358:63;;2328:99;2458:3;2477:76;2545:7;2536:6;2525:9;2521:22;2477:76;;;2467:86;;2437:122;2590:3;2609:53;2654:7;2645:6;2634:9;2630:22;2609:53;;;2599:63;;2569:99;2727:3;2716:9;2712:19;2699:33;2752:18;2744:6;2741:30;2738:2;;;2784:1;2781;2774:12;2738:2;2804:62;2858:7;2849:6;2838:9;2834:22;2804:62;;;2794:72;;2678:194;1757:1125;;;;;;;;;;;;2890:259;;3018:91;3105:3;3098:5;3018:91;;;3138:4;3133:3;3129:14;3115:28;;3011:138;;;;;3157:120;3240:31;3265:5;3240:31;;;3235:3;3228:44;3222:55;;;3357:743;3528:69;3591:5;3528:69;;;3610:105;3708:6;3703:3;3610:105;;;3603:112;;3735:71;3800:5;3735:71;;;3827:1;3812:276;3837:6;3834:1;3831:13;3812:276;;;3884:105;3985:3;3976:6;3970:13;3884:105;;;3877:112;;4006:75;4074:6;4006:75;;;3996:85;;3859:1;3856;3852:9;3847:14;;3812:276;;;3816:14;3507:593;;;;;4108:111;4185:28;4207:5;4185:28;;;4180:3;4173:41;4167:52;;;4226:360;;4356:39;4389:5;4356:39;;;4407:89;4489:6;4484:3;4407:89;;;4400:96;;4501:52;4546:6;4541:3;4534:4;4527:5;4523:16;4501:52;;;4574:6;4569:3;4565:16;4558:23;;4336:250;;;;;;4594:465;;4754:67;4818:2;4813:3;4754:67;;;4747:74;;4854:66;4850:1;4845:3;4841:11;4834:87;4955:66;4950:2;4945:3;4941:12;4934:88;5050:2;5045:3;5041:12;5034:19;;4740:319;;;;5068:465;;5228:67;5292:2;5287:3;5228:67;;;5221:74;;5328:66;5324:1;5319:3;5315:11;5308:87;5429:66;5424:2;5419:3;5415:12;5408:88;5524:2;5519:3;5515:12;5508:19;;5214:319;;;;5606:450;5735:4;5730:3;5726:14;5814:3;5807:5;5803:15;5797:22;5825:61;5881:3;5876;5872:13;5859:11;5825:61;;;5755:137;5961:4;5954:5;5950:16;5944:23;5973:62;6029:4;6024:3;6020:14;6007:11;5973:62;;;5902:139;5708:348;;;;6128:460;6267:4;6262:3;6258:14;6346:3;6339:5;6335:15;6329:22;6357:61;6413:3;6408;6404:13;6391:11;6357:61;;;6287:137;6493:4;6486:5;6482:16;6476:23;6505:62;6561:4;6556:3;6552:14;6539:11;6505:62;;;6434:139;6240:348;;;;6595:110;6668:31;6693:5;6668:31;;;6663:3;6656:44;6650:55;;;6712:120;6795:31;6820:5;6795:31;;;6790:3;6783:44;6777:55;;;6839:159;6940:52;6960:31;6985:5;6960:31;;;6940:52;;;6935:3;6928:65;6922:76;;;7005:405;;7179:95;7270:3;7261:6;7179:95;;;7172:102;;7285:75;7356:3;7347:6;7285:75;;;7382:2;7377:3;7373:12;7366:19;;7402:3;7395:10;;7160:250;;;;;;7417:201;;7529:2;7518:9;7514:18;7506:26;;7543:65;7605:1;7594:9;7590:17;7581:6;7543:65;;;7500:118;;;;;7625:407;;7816:2;7805:9;7801:18;7793:26;;7866:9;7860:4;7856:20;7852:1;7841:9;7837:17;7830:47;7891:131;8017:4;7891:131;;;7883:139;;7787:245;;;;8039:407;;8230:2;8219:9;8215:18;8207:26;;8280:9;8274:4;8270:20;8266:1;8255:9;8251:17;8244:47;8305:131;8431:4;8305:131;;;8297:139;;8201:245;;;;8453:1049;;8849:3;8838:9;8834:19;8826:27;;8864:117;8978:1;8967:9;8963:17;8954:6;8864:117;;;8992:118;9106:2;9095:9;9091:18;9082:6;8992:118;;;9121:119;9235:3;9224:9;9220:19;9211:6;9121:119;;;9251:73;9319:3;9308:9;9304:19;9295:6;9251:73;;;9335;9403:3;9392:9;9388:19;9379:6;9335:73;;;9419;9487:3;9476:9;9472:19;9463:6;9419:73;;;8820:682;;;;;;;;;;9509:213;;9627:2;9616:9;9612:18;9604:26;;9641:71;9709:1;9698:9;9694:17;9685:6;9641:71;;;9598:124;;;;;9729:493;;9959:3;9948:9;9944:19;9936:27;;9974:71;10042:1;10031:9;10027:17;10018:6;9974:71;;;10056:156;10208:2;10197:9;10193:18;10184:6;10056:156;;;9930:292;;;;;;10229:620;;10495:3;10484:9;10480:19;10472:27;;10510:71;10578:1;10567:9;10563:17;10554:6;10510:71;;;10592:118;10706:2;10695:9;10691:18;10682:6;10592:118;;;10721;10835:2;10824:9;10820:18;10811:6;10721:118;;;10466:383;;;;;;;10856:1028;;11270:3;11259:9;11255:19;11247:27;;11285:71;11353:1;11342:9;11338:17;11329:6;11285:71;;;11367:118;11481:2;11470:9;11466:18;11457:6;11367:118;;;11496;11610:2;11599:9;11595:18;11586:6;11496:118;;;11625:119;11739:3;11728:9;11724:19;11715:6;11625:119;;;11755;11869:3;11858:9;11854:19;11845:6;11755:119;;;11241:643;;;;;;;;;11891:1232;;12379:3;12368:9;12364:19;12356:27;;12394:71;12462:1;12451:9;12447:17;12438:6;12394:71;;;12476:118;12590:2;12579:9;12575:18;12566:6;12476:118;;;12605;12719:2;12708:9;12704:18;12695:6;12605:118;;;12734:119;12848:3;12837:9;12833:19;12824:6;12734:119;;;12864;12978:3;12967:9;12963:19;12954:6;12864:119;;;12994;13108:3;13097:9;13093:19;13084:6;12994:119;;;12350:773;;;;;;;;;;13130:256;;13192:2;13186:9;13176:19;;13230:4;13222:6;13218:17;13329:6;13317:10;13314:22;13293:18;13281:10;13278:34;13275:62;13272:2;;;13350:1;13347;13340:12;13272:2;13370:10;13366:2;13359:22;13170:216;;;;;13393:233;;13550:18;13542:6;13539:30;13536:2;;;13582:1;13579;13572:12;13536:2;13611:4;13603:6;13599:17;13591:25;;13473:153;;;;13633:258;;13776:18;13768:6;13765:30;13762:2;;;13808:1;13805;13798:12;13762:2;13852:4;13848:9;13841:4;13833:6;13829:17;13825:33;13817:41;;13881:4;13875;13871:15;13863:23;;13699:192;;;;13900:125;;14012:6;14001:17;;13993:32;;;;14034:113;;14139:3;14129:13;;14123:24;;;;14154:92;;14235:5;14229:12;14219:22;;14213:33;;;;14254:137;;14380:4;14372:6;14368:17;14357:28;;14350:41;;;;14400:161;;14552:3;14537:18;;14530:31;;;;;14570:163;;14685:6;14680:3;14673:19;14722:4;14717:3;14713:14;14698:29;;14666:67;;;;;14742:145;;14878:3;14863:18;;14856:31;;;;;14895:105;;14964:31;14989:5;14964:31;;;14953:42;;14947:53;;;;15007:92;;15087:5;15080:13;15073:21;15062:32;;15056:43;;;;15106:128;;15186:42;15179:5;15175:54;15164:65;;15158:76;;;;15241:79;;15310:5;15299:16;;15293:27;;;;15327:105;;15396:31;15421:5;15396:31;;;15385:42;;15379:53;;;;15439:79;;15508:5;15497:16;;15491:27;;;;15525:128;;15605:42;15598:5;15594:54;15583:65;;15577:76;;;;15660:79;;15729:5;15718:16;;15712:27;;;;15747:145;15828:6;15823:3;15818;15805:30;15884:1;15875:6;15870:3;15866:16;15859:27;15798:94;;;;15901:268;15966:1;15973:101;15987:6;15984:1;15981:13;15973:101;;;16063:1;16058:3;16054:11;16048:18;16044:1;16039:3;16035:11;16028:39;16009:2;16006:1;16002:10;15997:15;;15973:101;;;16089:6;16086:1;16083:13;16080:2;;;16154:1;16145:6;16140:3;16136:16;16129:27;16080:2;15950:219;;;;;16177:74;;16241:5;16230:16;;16224:27;;;", - "source": "pragma solidity 0.5.4;\npragma experimental ABIEncoderV2;\n\nimport \"./Utils.sol\";\n\ncontract BurnVerifier {\n using Utils for uint256;\n\n uint256 constant m = 32;\n uint256 constant n = 5;\n uint256 constant FIELD_ORDER = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n G1Point[m] gs;\n G1Point[m] hs;\n G1Point g;\n G1Point h;\n\n struct BurnStatement {\n G1Point CLn;\n G1Point CRn;\n G1Point y;\n uint256 bTransfer;\n uint256 epoch; // or uint8?\n address sender;\n G1Point u;\n }\n\n struct BurnProof {\n G1Point A;\n G1Point S;\n\n G1Point CLnPrime;\n G1Point CRnPrime;\n\n G1Point[2] tCommits;\n uint256 tHat;\n uint256 tauX;\n uint256 mu;\n\n uint256 c;\n uint256 s_sk;\n uint256 s_vDiff;\n uint256 s_nuDiff;\n\n InnerProductProof ipProof;\n }\n\n struct InnerProductProof {\n G1Point[n] ls;\n G1Point[n] rs;\n uint256 a;\n uint256 b;\n }\n\n constructor() public {\n g = mapInto(\"G\");\n h = mapInto(\"V\");\n for (uint256 i = 0; i < m; i++) {\n gs[i] = mapInto(\"G\", i);\n hs[i] = mapInto(\"H\", i);\n }\n } // will it be more expensive later on to sload these than to recompute them?\n\n function verifyBurn(bytes32[2] memory CLn, bytes32[2] memory CRn, bytes32[2] memory y, uint256 bTransfer, uint256 epoch, bytes32[2] memory u, address sender, bytes memory proof) view public returns (bool) {\n BurnStatement memory statement; // WARNING: if this is called directly in the console,\n // and your strings are less than 64 characters, they will be padded on the right, not the left. should hopefully not be an issue,\n // as this will typically be called simply by the other contract. still though, beware\n statement.CLn = G1Point(uint256(CLn[0]), uint256(CLn[1]));\n statement.CRn = G1Point(uint256(CRn[0]), uint256(CRn[1]));\n statement.y = G1Point(uint256(y[0]), uint256(y[1]));\n statement.bTransfer = bTransfer;\n statement.epoch = epoch;\n statement.u = G1Point(uint256(u[0]), uint256(u[1]));\n statement.sender = sender;\n BurnProof memory burnProof = unserialize(proof);\n return verify(statement, burnProof);\n }\n\n struct BurnAuxiliaries {\n uint256 y;\n uint256[m] ys;\n uint256 z;\n uint256[1] zs; // silly. just to match zether.\n uint256 zSum;\n uint256[m] twoTimesZSquared;\n uint256 x;\n uint256 t;\n uint256 k;\n G1Point tEval;\n }\n\n struct SigmaAuxiliaries {\n uint256 c;\n G1Point A_y;\n G1Point gEpoch;\n G1Point A_u;\n G1Point c_commit;\n G1Point A_t;\n G1Point A_CLn;\n G1Point A_CLnPrime;\n }\n\n struct IPAuxiliaries {\n G1Point u_x;\n G1Point[m] hPrimes;\n uint256[m] hExp;\n G1Point P;\n uint256 o;\n uint256[n] challenges;\n uint256[m] otherExponents;\n }\n\n function verify(BurnStatement memory statement, BurnProof memory proof) view internal returns (bool) {\n uint256 statementHash = uint256(keccak256(abi.encode(statement.CLn, statement.CRn, statement.y, statement.bTransfer, statement.epoch, statement.sender))).mod(); // stacktoodeep?\n\n BurnAuxiliaries memory burnAuxiliaries;\n burnAuxiliaries.y = uint256(keccak256(abi.encode(statementHash, proof.A, proof.S, proof.CLnPrime, proof.CRnPrime))).mod();\n burnAuxiliaries.ys = powers(burnAuxiliaries.y);\n burnAuxiliaries.z = uint256(keccak256(abi.encode(burnAuxiliaries.y))).mod();\n burnAuxiliaries.zs = [burnAuxiliaries.z.exp(2)];\n burnAuxiliaries.zSum = burnAuxiliaries.zs[0].mul(burnAuxiliaries.z); // trivial sum\n burnAuxiliaries.k = sumScalars(burnAuxiliaries.ys).mul(burnAuxiliaries.z.sub(burnAuxiliaries.zs[0])).sub(burnAuxiliaries.zSum.mul(2 ** m).sub(burnAuxiliaries.zSum));\n burnAuxiliaries.t = proof.tHat.sub(burnAuxiliaries.k);\n for (uint256 i = 0; i < m; i++) {\n burnAuxiliaries.twoTimesZSquared[i] = burnAuxiliaries.zs[0].mul(2 ** i);\n }\n\n burnAuxiliaries.x = uint256(keccak256(abi.encode(burnAuxiliaries.z, proof.tCommits))).mod();\n burnAuxiliaries.tEval = add(mul(proof.tCommits[0], burnAuxiliaries.x), mul(proof.tCommits[1], burnAuxiliaries.x.mul(burnAuxiliaries.x))); // replace with \"commit\"?\n\n SigmaAuxiliaries memory sigmaAuxiliaries;\n sigmaAuxiliaries.A_y = add(mul(g, proof.s_sk), mul(statement.y, proof.c.neg()));\n sigmaAuxiliaries.gEpoch = mapInto(\"Zether\", statement.epoch);\n sigmaAuxiliaries.A_u = add(mul(sigmaAuxiliaries.gEpoch, proof.s_sk), mul(statement.u, proof.c.neg()));\n sigmaAuxiliaries.c_commit = mul(add(mul(add(statement.CRn, proof.CRnPrime), proof.s_sk), mul(add(statement.CLn, proof.CLnPrime), proof.c.neg())), burnAuxiliaries.zs[0]);\n sigmaAuxiliaries.A_t = add(mul(add(add(mul(g, burnAuxiliaries.t), mul(h, proof.tauX)), neg(burnAuxiliaries.tEval)), proof.c), sigmaAuxiliaries.c_commit);\n sigmaAuxiliaries.A_CLn = add(mul(g, proof.s_vDiff), add(mul(statement.CRn, proof.s_sk), mul(statement.CLn, proof.c.neg())));\n sigmaAuxiliaries.A_CLnPrime = add(mul(h, proof.s_nuDiff), add(mul(proof.CRnPrime, proof.s_sk), mul(proof.CLnPrime, proof.c.neg())));\n\n sigmaAuxiliaries.c = uint256(keccak256(abi.encode(burnAuxiliaries.x, sigmaAuxiliaries.A_y, sigmaAuxiliaries.A_u, sigmaAuxiliaries.A_t, sigmaAuxiliaries.A_CLn, sigmaAuxiliaries.A_CLnPrime))).mod();\n require(sigmaAuxiliaries.c == proof.c, \"Sigma protocol challenge equality failure.\");\n\n IPAuxiliaries memory ipAuxiliaries;\n ipAuxiliaries.o = uint256(keccak256(abi.encode(sigmaAuxiliaries.c))).mod();\n ipAuxiliaries.u_x = mul(g, ipAuxiliaries.o);\n ipAuxiliaries.hPrimes = hadamardInv(hs, burnAuxiliaries.ys);\n ipAuxiliaries.hExp = addVectors(times(burnAuxiliaries.ys, burnAuxiliaries.z), burnAuxiliaries.twoTimesZSquared);\n ipAuxiliaries.P = add(add(add(proof.A, mul(proof.S, burnAuxiliaries.x)), mul(sumPoints(gs), burnAuxiliaries.z.neg())), commit(ipAuxiliaries.hPrimes, ipAuxiliaries.hExp));\n ipAuxiliaries.P = add(ipAuxiliaries.P, mul(h, proof.mu.neg()));\n ipAuxiliaries.P = add(ipAuxiliaries.P, mul(ipAuxiliaries.u_x, proof.tHat));\n\n // begin inner product verification\n InnerProductProof memory ipProof = proof.ipProof;\n for (uint256 i = 0; i < n; i++) {\n ipAuxiliaries.o = uint256(keccak256(abi.encode(ipAuxiliaries.o, ipProof.ls[i], ipProof.rs[i]))).mod();\n ipAuxiliaries.challenges[i] = ipAuxiliaries.o; // overwrites value\n uint256 xInv = ipAuxiliaries.o.inv();\n ipAuxiliaries.P = add(ipAuxiliaries.P, add(mul(ipProof.ls[i], ipAuxiliaries.o.exp(2)), mul(ipProof.rs[i], xInv.exp(2))));\n }\n\n ipAuxiliaries.otherExponents[0] = 1;\n for (uint256 i = 0; i < n; i++) {\n ipAuxiliaries.otherExponents[0] = ipAuxiliaries.otherExponents[0].mul(ipAuxiliaries.challenges[i]);\n }\n bool[m] memory bitSet;\n ipAuxiliaries.otherExponents[0] = ipAuxiliaries.otherExponents[0].inv();\n for (uint256 i = 0; i < m/2; ++i) {\n for (uint256 j = 0; (1 << j) + i < m; ++j) {\n uint256 i1 = i + (1 << j);\n if (!bitSet[i1]) {\n uint256 temp = ipAuxiliaries.challenges[n - 1 - j].mul(ipAuxiliaries.challenges[n - 1 - j]);\n ipAuxiliaries.otherExponents[i1] = ipAuxiliaries.otherExponents[i].mul(temp);\n bitSet[i1] = true;\n }\n }\n }\n\n G1Point memory gTemp;\n G1Point memory hTemp;\n for (uint256 i = 0; i < m; i++) {\n gTemp = add(gTemp, mul(gs[i], ipAuxiliaries.otherExponents[i]));\n hTemp = add(hTemp, mul(ipAuxiliaries.hPrimes[i], ipAuxiliaries.otherExponents[m - 1 - i]));\n }\n G1Point memory cProof = add(add(mul(gTemp, ipProof.a), mul(hTemp, ipProof.b)), mul(ipAuxiliaries.u_x, ipProof.a.mul(ipProof.b)));\n require(eq(ipAuxiliaries.P, cProof), \"Inner product equality check failure.\");\n\n return true;\n }\n\n function multiExpGs(uint256[m] memory ss) internal view returns (G1Point memory result) {\n for (uint256 i = 0; i < m; i++) {\n result = add(result, mul(gs[i], ss[i]));\n }\n }\n\n function multiExpHsInversed(uint256[m] memory ss, G1Point[m] memory hs) internal view returns (G1Point memory result) {\n for (uint256 i = 0; i < m; i++) {\n result = add(result, mul(hs[i], ss[m - 1 - i]));\n }\n }\n\n function unserialize(bytes memory arr) internal pure returns (BurnProof memory proof) {\n proof.A = G1Point(slice(arr, 0), slice(arr, 32));\n proof.S = G1Point(slice(arr, 64), slice(arr, 96));\n\n proof.CLnPrime = G1Point(slice(arr, 128), slice(arr, 160));\n proof.CRnPrime = G1Point(slice(arr, 192), slice(arr, 224));\n\n proof.tCommits = [G1Point(slice(arr, 256), slice(arr, 288)), G1Point(slice(arr, 320), slice(arr, 352))];\n proof.tHat = slice(arr, 384);\n proof.tauX = slice(arr, 416);\n proof.mu = slice(arr, 448);\n\n proof.c = slice(arr, 480);\n proof.s_sk = slice(arr, 512);\n proof.s_vDiff = slice(arr, 544);\n proof.s_nuDiff = slice(arr, 576);\n\n InnerProductProof memory ipProof;\n for (uint256 i = 0; i < n; i++) {\n ipProof.ls[i] = G1Point(slice(arr, 608 + i * 64), slice(arr, 640 + i * 64));\n ipProof.rs[i] = G1Point(slice(arr, 608 + (n + i) * 64), slice(arr, 640 + (n + i) * 64));\n }\n ipProof.a = slice(arr, 608 + n * 128);\n ipProof.b = slice(arr, 640 + n * 128);\n proof.ipProof = ipProof;\n\n return proof;\n }\n\n function addVectors(uint256[m] memory a, uint256[m] memory b) internal pure returns (uint256[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = a[i].add(b[i]);\n }\n }\n\n function hadamardInv(G1Point[m] memory ps, uint256[m] memory ss) internal view returns (G1Point[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = mul(ps[i], ss[i].inv());\n }\n }\n\n function sumScalars(uint256[m] memory ys) internal pure returns (uint256 result) {\n for (uint256 i = 0; i < m; i++) {\n result = result.add(ys[i]);\n }\n }\n\n function sumPoints(G1Point[m] memory ps) internal view returns (G1Point memory sum) {\n for (uint256 i = 0; i < m; i++) {\n sum = add(sum, ps[i]);\n }\n }\n\n function commit(G1Point[m] memory ps, uint256[m] memory ss) internal view returns (G1Point memory result) {\n for (uint256 i = 0; i < m; i++) {\n result = add(result, mul(ps[i], ss[i]));\n }\n }\n\n function powers(uint256 base) internal pure returns (uint256[m] memory powers) {\n powers[0] = 1;\n powers[1] = base;\n for (uint256 i = 2; i < m; i++) {\n powers[i] = powers[i - 1].mul(base);\n }\n }\n\n function times(uint256[m] memory v, uint256 x) internal pure returns (uint256[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = v[i].mul(x);\n }\n }\n\n function slice(bytes memory input, uint256 start) internal pure returns (uint256 result) { // extracts exactly 32 bytes\n assembly {\n let m := mload(0x40)\n mstore(m, mload(add(add(input, 0x20), start))) // why only 0x20?\n result := mload(m)\n }\n }\n\n struct G1Point {\n uint256 x;\n uint256 y;\n }\n\n function add(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {\n assembly {\n let m := mload(0x40)\n mstore(m, mload(p1))\n mstore(add(m, 0x20), mload(add(p1, 0x20)))\n mstore(add(m, 0x40), mload(p2))\n mstore(add(m, 0x60), mload(add(p2, 0x20)))\n if iszero(staticcall(gas, 0x06, m, 0x80, r, 0x40)) {\n revert(0, 0)\n }\n }\n }\n\n function mul(G1Point memory p, uint256 s) internal view returns (G1Point memory r) {\n assembly {\n let m := mload(0x40)\n mstore(m, mload(p))\n mstore(add(m, 0x20), mload(add(p, 0x20)))\n mstore(add(m, 0x40), s)\n if iszero(staticcall(gas, 0x07, m, 0x60, r, 0x40)) {\n revert(0, 0)\n }\n }\n }\n\n function neg(G1Point memory p) internal pure returns (G1Point memory) {\n return G1Point(p.x, FIELD_ORDER - (p.y % FIELD_ORDER)); // p.y should already be reduced mod P?\n }\n\n function eq(G1Point memory p1, G1Point memory p2) internal pure returns (bool) {\n return p1.x == p2.x && p1.y == p2.y;\n }\n\n function fieldExp(uint256 base, uint256 exponent) internal view returns (uint256 output) { // warning: mod p, not q\n uint256 order = FIELD_ORDER;\n assembly {\n let m := mload(0x40)\n mstore(m, 0x20)\n mstore(add(m, 0x20), 0x20)\n mstore(add(m, 0x40), 0x20)\n mstore(add(m, 0x60), base)\n mstore(add(m, 0x80), exponent)\n mstore(add(m, 0xa0), order)\n if iszero(staticcall(gas, 0x05, m, 0xc0, m, 0x20)) { // staticcall or call?\n revert(0, 0)\n }\n output := mload(m)\n }\n }\n\n function mapInto(uint256 seed) internal view returns (G1Point memory) {\n uint256 y;\n while (true) {\n uint256 ySquared = fieldExp(seed, 3) + 3; // addmod instead of add: waste of gas, plus function overhead cost\n y = fieldExp(ySquared, (FIELD_ORDER + 1) / 4);\n if (fieldExp(y, 2) == ySquared) {\n break;\n }\n seed += 1;\n }\n return G1Point(seed, y);\n }\n\n function mapInto(string memory input) internal view returns (G1Point memory) {\n return mapInto(uint256(keccak256(abi.encodePacked(input))) % FIELD_ORDER);\n }\n\n function mapInto(string memory input, uint256 i) internal view returns (G1Point memory) {\n return mapInto(uint256(keccak256(abi.encodePacked(input, i))) % FIELD_ORDER);\n }\n}\n", + "metadata": "{\"compiler\":{\"version\":\"0.5.4+commit.9549d8ff\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"CLn\",\"type\":\"bytes32[2]\"},{\"name\":\"CRn\",\"type\":\"bytes32[2]\"},{\"name\":\"y\",\"type\":\"bytes32[2]\"},{\"name\":\"bTransfer\",\"type\":\"uint256\"},{\"name\":\"epoch\",\"type\":\"uint256\"},{\"name\":\"u\",\"type\":\"bytes32[2]\"},{\"name\":\"sender\",\"type\":\"address\"},{\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"verifyBurn\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/BurnVerifier.sol\":\"BurnVerifier\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/BurnVerifier.sol\":{\"keccak256\":\"0x0bb62f7966acd8b633e82323b0d33f0029921b3e3bfd2d94fbcef0cddee84d7e\",\"urls\":[\"bzzr://972d7741e2ab8fff1724dac77fd5a0c5cb9a3146e272bbfda35cc7997e3b707b\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/Utils.sol\":{\"keccak256\":\"0x3b410db08d55d9540e8e795474410304be456ca3a36beb8c209019344593b267\",\"urls\":[\"bzzr://f5eaba23ec02eb7c30ce30f795aa0d7b1ae29d61d8111e2955a0f505bd1b328a\"]}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b50620000616040805190810160405280600181526020017f4700000000000000000000000000000000000000000000000000000000000000815250620001fd640100000000026401000000009004565b60806000820151816000015560208201518160010155905050620000c96040805190810160405280600181526020017f5600000000000000000000000000000000000000000000000000000000000000815250620001fd640100000000026401000000009004565b6082600082015181600001556020820151816001015590505060008090505b6020811015620001f657620001426040805190810160405280600181526020017f47000000000000000000000000000000000000000000000000000000000000008152508262000280640100000000026401000000009004565b6000826020811015156200015257fe5b600202016000820151816000015560208201518160010155905050620001bd6040805190810160405280600181526020017f48000000000000000000000000000000000000000000000000000000000000008152508262000280640100000000026401000000009004565b604082602081101515620001cd57fe5b6002020160008201518160000155602082015181600101559050508080600101915050620000e8565b506200055f565b620002076200044e565b620002797f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47836040516020016200023f9190620004ba565b60405160208183030381529060405280519060200120600190048115156200026357fe5b0662000306640100000000026401000000009004565b9050919050565b6200028a6200044e565b620002fe7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478484604051602001620002c4929190620004d3565b6040516020818303038152906040528051906020012060019004811515620002e857fe5b0662000306640100000000026401000000009004565b905092915050565b620003106200044e565b60005b600115620003c357600060036200033b856003620003e0640100000000026401000000009004565b0190506200038981600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47018115156200037357fe5b04620003e0640100000000026401000000009004565b915080620003a8836002620003e0640100000000026401000000009004565b1415620003b65750620003c3565b6001840193505062000313565b604080519081016040528084815260200182815250915050919050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa15156200044257600080fd5b80519250505092915050565b604080519081016040528060008152602001600081525090565b60006200047582620004ff565b6200048181856200050a565b9350620004938185602086016200051f565b80840191505092915050565b620004b4620004ae8262000515565b62000555565b82525050565b6000620004c8828462000468565b915081905092915050565b6000620004e1828562000468565b9150620004ef82846200049f565b6020820191508190509392505050565b600081519050919050565b600081905092915050565b6000819050919050565b60005b838110156200053f57808201518184015260208101905062000522565b838111156200054f576000848401525b50505050565b6000819050919050565b6126a1806200056f6000396000f3fe608060405234801561001057600080fd5b5060043610610048576000357c0100000000000000000000000000000000000000000000000000000000900480636e1a999e1461004d575b600080fd5b61006760048036036100629190810190611fc0565b61007d565b60405161007491906122ce565b60405180910390f35b6000610087611a72565b60408051908101604052808b60006002811015156100a157fe5b60200201516001900481526020018b60016002811015156100be57fe5b602002015160019004815250816000018190525060408051908101604052808a60006002811015156100ec57fe5b60200201516001900481526020018a600160028110151561010957fe5b6020020151600190048152508160200181905250604080519081016040528089600060028110151561013757fe5b602002015160019004815260200189600160028110151561015457fe5b60200201516001900481525081604001819052508681606001818152505085816080018181525050604080519081016040528086600060028110151561019657fe5b60200201516001900481526020018660016002811015156101b357fe5b6020020151600190048152508160c00181905250838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610207611adf565b6102108461022c565b905061021c8282610512565b9250505098975050505050505050565b610234611adf565b604080519081016040528061024a84600061131d565b815260200161025a84602061131d565b8152508160000181905250604080519081016040528061027b84604061131d565b815260200161028b84606061131d565b815250816020018190525060408051908101604052806102ac84608061131d565b81526020016102bc8460a061131d565b815250816040018190525060408051908101604052806102dd8460c061131d565b81526020016102ed8460e061131d565b81525081606001819052506040805190810160405280604080519081016040528061031a8661010061131d565b815260200161032b8661012061131d565b8152508152602001604080519081016040528061034a8661014061131d565b815260200161035b8661016061131d565b81525081525081608001819052506103758261018061131d565b8160a001818152505061038a826101a061131d565b8160c001818152505061039f826101c061131d565b8160e00181815250506103b4826101e061131d565b816101000181815250506103ca8261020061131d565b816101200181815250506103e08261022061131d565b816101400181815250506103f68261024061131d565b81610160018181525050610408611b6c565b60008090505b60058110156104c857604080519081016040528061043386604085026102600161131d565b815260200161044986604085026102800161131d565b81525082600001518260058110151561045e57fe5b6020020181905250604080519081016040528061048586604085600501026102600161131d565b815260200161049e86604085600501026102800161131d565b8152508260200151826005811015156104b357fe5b6020020181905250808060010191505061040e565b506104db8360806005026102600161131d565b8160400181815250506104f68360806005026102800161131d565b8160600181815250508082610180018190525081915050919050565b60008061056a846000015185602001518660400151876060015188608001518960a0015160405160200161054b96959493929190612329565b6040516020818303038152906040528051906020012060019004611336565b9050610574611ba2565b6105bf8285600001518660200151876040015188606001516040516020016105a0959493929190612407565b6040516020818303038152906040528051906020012060019004611336565b8160000181815250506105d5816000015161136b565b816020018190525061061481600001516040516020016105f5919061238c565b6040516020818303038152906040528051906020012060019004611336565b8160400181815250506020604051908101604052806106416002846040015161140890919063ffffffff16565b815250816060018190525061067a81604001518260600151600060018110151561066757fe5b602002015161147590919063ffffffff16565b8160800181815250506107116106b782608001516106a9602060020a856080015161147590919063ffffffff16565b6114ac90919063ffffffff16565b6107036106e8846060015160006001811015156106d057fe5b602002015185604001516114ac90919063ffffffff16565b6106f585602001516114ec565b61147590919063ffffffff16565b6114ac90919063ffffffff16565b816101000181815250506107378161010001518560a001516114ac90919063ffffffff16565b8160e001818152505060008090505b60208110156107a45761077c8160020a8360600151600060018110151561076957fe5b602002015161147590919063ffffffff16565b8260a001518260208110151561078e57fe5b6020020181815250508080600101915050610746565b506107e2816040015185608001516040516020016107c39291906123a7565b6040516020818303038152906040528051906020012060019004611336565b8160c00181815250506108536108138560800151600060028110151561080457fe5b60200201518360c00151611537565b61084e8660800151600160028110151561082957fe5b60200201516108498560c001518660c0015161147590919063ffffffff16565b611537565b611572565b816101200181905250610864611c0e565b6108b6610896608060408051908101604052908160008201548152602001600182015481525050876101200151611537565b6108b188604001516108ac8961010001516115b8565b611537565b611572565b81602001819052506109016040805190810160405280600681526020017f5a6574686572000000000000000000000000000000000000000000000000000081525087608001516115e4565b816040018190525061093f61091f8260400151876101200151611537565b61093a8860c001516109358961010001516115b8565b611537565b611572565b81606001819052506109b761099a61096d61096289602001518960600151611572565b886101200151611537565b6109956109828a600001518a60400151611572565b6109908a61010001516115b8565b611537565b611572565b836060015160006001811015156109ad57fe5b6020020151611537565b8160800181905250610a54610a4a610a3f610a2c6109f96080604080519081016040529081600082015481526020016001820154815250508760e00151611537565b610a276082604080519081016040529081600082015481526020016001820154815250508b60c00151611537565b611572565b610a3a866101200151611654565b611572565b876101000151611537565b8260800151611572565b8160a00181905250610ac9610a8e608060408051908101604052908160008201548152602001600182015481525050876101400151611537565b610ac4610aa48960200151896101200151611537565b610abf8a60000151610aba8b61010001516115b8565b611537565b611572565b611572565b8160c00181905250610b3e610b03608260408051908101604052908160008201548152602001600182015481525050876101600151611537565b610b39610b198860600151896101200151611537565b610b348960400151610b2f8b61010001516115b8565b611537565b611572565b611572565b8160e00181905250610b9b8260c00151826020015183606001518460a001518560c001518660e00151604051602001610b7c9695949392919061245b565b6040516020818303038152906040528051906020012060019004611336565b8160000181815250508461010001518160000151141515610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be8906122e9565b60405180910390fd5b610bf9611c7e565b610c308260000151604051602001610c11919061238c565b6040516020818303038152906040528051906020012060019004611336565b816080018181525050610c676080604080519081016040529081600082015481526020016001820154815250508260800151611537565b8160000181905250610cd56040602080602002604051908101604052809291906000905b82821015610cc7578382600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190610c8b565b5050505084602001516116cd565b8160200181905250610cfc610cf284602001518560400151611744565b8460a001516117ab565b8160400181905250610dbb610da4610d298860000151610d248a602001518860c00151611537565b611572565b610d9f610d8d6000602080602002604051908101604052809291906000905b82821015610d84578382600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190610d48565b50505050611824565b610d9a88604001516115b8565b611537565b611572565b610db68360200151846040015161186c565b611572565b8160600181905250610e068160600151610e01608260408051908101604052908160008201548152602001600182015481525050610dfc8a60e001516115b8565b611537565b611572565b8160600181905250610e2d8160600151610e2883600001518960a00151611537565b611572565b8160600181905250610e3d611b6c565b866101800151905060008090505b6005811015610f8a57610ebb8360800151836000015183600581101515610e6e57fe5b6020020151846020015184600581101515610e8557fe5b6020020151604051602001610e9c939291906123d0565b6040516020818303038152906040528051906020012060019004611336565b83608001818152505082608001518360a0015182600581101515610edb57fe5b6020020181815250506000610ef384608001516118d0565b9050610f748460600151610f6f610f37866000015186600581101515610f1557fe5b6020020151610f3260028a6080015161140890919063ffffffff16565b611537565b610f6a876020015187600581101515610f4c57fe5b6020020151610f6560028861140890919063ffffffff16565b611537565b611572565b611572565b8460600181905250508080600101915050610e4b565b5060018260c001516000602081101515610fa057fe5b60200201818152505060008090505b600581101561102157610ff88360a0015182600581101515610fcd57fe5b60200201518460c001516000602081101515610fe557fe5b602002015161147590919063ffffffff16565b8360c00151600060208110151561100b57fe5b6020020181815250508080600101915050610faf565b5061102a611ce1565b61104a8360c00151600060208110151561104057fe5b60200201516118d0565b8360c00151600060208110151561105d57fe5b60200201818152505060008090505b6002602081151561107957fe5b0481101561118c5760008090505b6020828260019060020a020110156111805760008160019060020a028301905083816020811015156110b557fe5b6020020151151561117457600061110d8760a00151846001600503036005811015156110dd57fe5b60200201518860a00151856001600503036005811015156110fa57fe5b602002015161147590919063ffffffff16565b9050611138818860c001518660208110151561112557fe5b602002015161147590919063ffffffff16565b8760c001518360208110151561114a57fe5b6020020181815250506001858360208110151561116357fe5b602002019015159081151581525050505b50806001019050611087565b5080600101905061106c565b50611195611d05565b61119d611d05565b60008090505b602081101561125c57611206836112016000846020811015156111c257fe5b60020201604080519081016040529081600082015481526020016001820154815250508960c00151856020811015156111f757fe5b6020020151611537565b611572565b925061124d8261124888602001518460208110151561122157fe5b60200201518960c001518560016020030360208110151561123e57fe5b6020020151611537565b611572565b915080806001019150506111a3565b50611265611d05565b6112b961128c611279858860400151611537565b611287858960600151611537565b611572565b6112b488600001516112af89606001518a6040015161147590919063ffffffff16565b611537565b611572565b90506112c9866060015182611906565b151561130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190612309565b60405180910390fd5b6001995050505050505050505092915050565b6000604051826020850101518152805191505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018281151561136357fe5b069050919050565b611373611d1f565b600181600060208110151561138457fe5b6020020181815250508181600160208110151561139d57fe5b6020020181815250506000600290505b6020811015611402576113de8383600184036020811015156113cb57fe5b602002015161147590919063ffffffff16565b82826020811015156113ec57fe5b60200201818152505080806001019150506113ad565b50919050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa151561146957600080fd5b80519250505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156114a157fe5b828409905092915050565b6000818310156114e05782827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103016114e4565b8183035b905092915050565b600080600090505b602081101561153157611522838260208110151561150e57fe5b60200201518361192e90919063ffffffff16565b915080806001019150506114f4565b50919050565b61153f611d05565b604051835181526020840151602082015282604082015260408260608360075afa151561156b57600080fd5b5092915050565b61157a611d05565b6040518351815260208401516020820152825160408201526020830151606082015260408260808360065afa15156115b157600080fd5b5092915050565b6000817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001039050919050565b6115ec611d05565b61164c7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784846040516020016116239291906122a6565b604051602081830303815290604052805190602001206001900481151561164657fe5b06611965565b905092915050565b61165c611d05565b6040805190810160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001518115156116a057fe5b067f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47038152509050919050565b6116d5611d43565b60008090505b602081101561173d5761171a84826020811015156116f557fe5b6020020151611715858460208110151561170b57fe5b60200201516118d0565b611537565b828260208110151561172857fe5b602002018190525080806001019150506116db565b5092915050565b61174c611d1f565b60008090505b60208110156117a45761178083858360208110151561176d57fe5b602002015161147590919063ffffffff16565b828260208110151561178e57fe5b6020020181815250508080600101915050611752565b5092915050565b6117b3611d1f565b60008090505b602081101561181d576117f983826020811015156117d357fe5b602002015185836020811015156117e657fe5b602002015161192e90919063ffffffff16565b828260208110151561180757fe5b60200201818152505080806001019150506117b9565b5092915050565b61182c611d05565b60008090505b60208110156118665761185782848360208110151561184d57fe5b6020020151611572565b91508080600101915050611832565b50919050565b611874611d05565b60008090505b60208110156118c9576118ba826118b5868460208110151561189857fe5b602002015186856020811015156118ab57fe5b6020020151611537565b611572565b9150808060010191505061187a565b5092915050565b60006118ff8260027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103611408565b9050919050565b600081600001518360000151148015611926575081602001518360200151145b905092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180151561195a57fe5b828408905092915050565b61196d611d05565b60005b6001156119e85760006003611986856003611a05565b0190506119c281600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47018115156119bc57fe5b04611a05565b9150806119d0836002611a05565b14156119dc57506119e8565b60018401935050611970565b604080519081016040528084815260200182815250915050919050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa1515611a6657600080fd5b80519250505092915050565b61016060405190810160405280611a87611d72565b8152602001611a94611d72565b8152602001611aa1611d72565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001611ad9611d72565b81525090565b61052060405190810160405280611af4611d72565b8152602001611b01611d72565b8152602001611b0e611d72565b8152602001611b1b611d72565b8152602001611b28611d8c565b815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001611b66611dba565b81525090565b6102c060405190810160405280611b81611df0565b8152602001611b8e611df0565b815260200160008152602001600081525090565b6109206040519081016040528060008152602001611bbe611e1f565b815260200160008152602001611bd2611e43565b815260200160008152602001611be6611e1f565b8152602001600081526020016000815260200160008152602001611c08611d72565b81525090565b6101e06040519081016040528060008152602001611c2a611d72565b8152602001611c37611d72565b8152602001611c44611d72565b8152602001611c51611d72565b8152602001611c5e611d72565b8152602001611c6b611d72565b8152602001611c78611d72565b81525090565b61114060405190810160405280611c93611d72565b8152602001611ca0611e66565b8152602001611cad611e1f565b8152602001611cba611d72565b815260200160008152602001611cce611e95565b8152602001611cdb611e1f565b81525090565b61040060405190810160405280602090602082028038833980820191505090505090565b604080519081016040528060008152602001600081525090565b61040060405190810160405280602090602082028038833980820191505090505090565b610800604051908101604052806020905b611d5c611d72565b815260200190600190039081611d545790505090565b604080519081016040528060008152602001600081525090565b6080604051908101604052806002905b611da4611d72565b815260200190600190039081611d9c5790505090565b6102c060405190810160405280611dcf611df0565b8152602001611ddc611df0565b815260200160008152602001600081525090565b610140604051908101604052806005905b611e09611d72565b815260200190600190039081611e015790505090565b61040060405190810160405280602090602082028038833980820191505090505090565b602060405190810160405280600190602082028038833980820191505090505090565b610800604051908101604052806020905b611e7f611d72565b815260200190600190039081611e775790505090565b60a060405190810160405280600590602082028038833980820191505090505090565b6000611ec482356125d5565b905092915050565b600082601f8301121515611edf57600080fd5b6002611ef2611eed826124eb565b6124be565b91508183856020840282011115611f0857600080fd5b60005b83811015611f385781611f1e8882611f42565b845260208401935060208301925050600181019050611f0b565b5050505092915050565b6000611f4e82356125e7565b905092915050565b600082601f8301121515611f6957600080fd5b8135611f7c611f778261250d565b6124be565b91508082526020830160208301858383011115611f9857600080fd5b611fa383828461261b565b50505092915050565b6000611fb88235612611565b905092915050565b600080600080600080600080610180898b031215611fdd57600080fd5b6000611feb8b828c01611ecc565b9850506040611ffc8b828c01611ecc565b975050608061200d8b828c01611ecc565b96505060c061201e8b828c01611fac565b95505060e061202f8b828c01611fac565b9450506101006120418b828c01611ecc565b9350506101406120538b828c01611eb8565b92505061016089013567ffffffffffffffff81111561207157600080fd5b61207d8b828c01611f56565b9150509295985092959890939650565b60006120998383612213565b60408301905092915050565b6120ae8161258d565b82525050565b6120bd81612543565b6120c78184612566565b92506120d282612539565b60005b82811015612100576120e885835161208d565b94506120f382612559565b91506001810190506120d5565b5050505050565b6121108161259f565b82525050565b60006121218261254e565b61212b8185612582565b935061213b81856020860161262a565b80840191505092915050565b6000612154602a83612571565b91507f5369676d612070726f746f636f6c206368616c6c656e676520657175616c697460008301527f79206661696c7572652e000000000000000000000000000000000000000000006020830152604082019050919050565b60006121ba602583612571565b91507f496e6e65722070726f6475637420657175616c69747920636865636b2066616960008301527f6c7572652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6040820160008201516122296000850182612271565b50602082015161223c6020850182612271565b50505050565b6040820160008201516122586000850182612271565b50602082015161226b6020850182612271565b50505050565b61227a816125cb565b82525050565b612289816125cb565b82525050565b6122a061229b826125cb565b61265d565b82525050565b60006122b28285612116565b91506122be828461228f565b6020820191508190509392505050565b60006020820190506122e36000830184612107565b92915050565b6000602082019050818103600083015261230281612147565b9050919050565b60006020820190508181036000830152612322816121ad565b9050919050565b60006101208201905061233f6000830189612242565b61234c6040830188612242565b6123596080830187612242565b61236660c0830186612280565b61237360e0830185612280565b6123816101008301846120a5565b979650505050505050565b60006020820190506123a16000830184612280565b92915050565b600060a0820190506123bc6000830185612280565b6123c960208301846120b4565b9392505050565b600060a0820190506123e56000830186612280565b6123f26020830185612242565b6123ff6060830184612242565b949350505050565b60006101208201905061241d6000830188612280565b61242a6020830187612242565b6124376060830186612242565b61244460a0830185612242565b61245160e0830184612242565b9695505050505050565b6000610160820190506124716000830189612280565b61247e6020830188612242565b61248b6060830187612242565b61249860a0830186612242565b6124a560e0830185612242565b6124b3610120830184612242565b979650505050505050565b6000604051905081810181811067ffffffffffffffff821117156124e157600080fd5b8060405250919050565b600067ffffffffffffffff82111561250257600080fd5b602082029050919050565b600067ffffffffffffffff82111561252457600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b600060029050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612598826125ab565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006125e0826125f1565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561264857808201518184015260208101905061262d565b83811115612657576000848401525b50505050565b600081905091905056fea265627a7a723058207be08f1fb75092e2bf18ebdffa118e8d1d3264492c2103bfd7834e929d492c236c6578706572696d656e74616cf50037", + "deployedBytecode": "0x608060405234801561001057600080fd5b5060043610610048576000357c0100000000000000000000000000000000000000000000000000000000900480636e1a999e1461004d575b600080fd5b61006760048036036100629190810190611fc0565b61007d565b60405161007491906122ce565b60405180910390f35b6000610087611a72565b60408051908101604052808b60006002811015156100a157fe5b60200201516001900481526020018b60016002811015156100be57fe5b602002015160019004815250816000018190525060408051908101604052808a60006002811015156100ec57fe5b60200201516001900481526020018a600160028110151561010957fe5b6020020151600190048152508160200181905250604080519081016040528089600060028110151561013757fe5b602002015160019004815260200189600160028110151561015457fe5b60200201516001900481525081604001819052508681606001818152505085816080018181525050604080519081016040528086600060028110151561019657fe5b60200201516001900481526020018660016002811015156101b357fe5b6020020151600190048152508160c00181905250838160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610207611adf565b6102108461022c565b905061021c8282610512565b9250505098975050505050505050565b610234611adf565b604080519081016040528061024a84600061131d565b815260200161025a84602061131d565b8152508160000181905250604080519081016040528061027b84604061131d565b815260200161028b84606061131d565b815250816020018190525060408051908101604052806102ac84608061131d565b81526020016102bc8460a061131d565b815250816040018190525060408051908101604052806102dd8460c061131d565b81526020016102ed8460e061131d565b81525081606001819052506040805190810160405280604080519081016040528061031a8661010061131d565b815260200161032b8661012061131d565b8152508152602001604080519081016040528061034a8661014061131d565b815260200161035b8661016061131d565b81525081525081608001819052506103758261018061131d565b8160a001818152505061038a826101a061131d565b8160c001818152505061039f826101c061131d565b8160e00181815250506103b4826101e061131d565b816101000181815250506103ca8261020061131d565b816101200181815250506103e08261022061131d565b816101400181815250506103f68261024061131d565b81610160018181525050610408611b6c565b60008090505b60058110156104c857604080519081016040528061043386604085026102600161131d565b815260200161044986604085026102800161131d565b81525082600001518260058110151561045e57fe5b6020020181905250604080519081016040528061048586604085600501026102600161131d565b815260200161049e86604085600501026102800161131d565b8152508260200151826005811015156104b357fe5b6020020181905250808060010191505061040e565b506104db8360806005026102600161131d565b8160400181815250506104f68360806005026102800161131d565b8160600181815250508082610180018190525081915050919050565b60008061056a846000015185602001518660400151876060015188608001518960a0015160405160200161054b96959493929190612329565b6040516020818303038152906040528051906020012060019004611336565b9050610574611ba2565b6105bf8285600001518660200151876040015188606001516040516020016105a0959493929190612407565b6040516020818303038152906040528051906020012060019004611336565b8160000181815250506105d5816000015161136b565b816020018190525061061481600001516040516020016105f5919061238c565b6040516020818303038152906040528051906020012060019004611336565b8160400181815250506020604051908101604052806106416002846040015161140890919063ffffffff16565b815250816060018190525061067a81604001518260600151600060018110151561066757fe5b602002015161147590919063ffffffff16565b8160800181815250506107116106b782608001516106a9602060020a856080015161147590919063ffffffff16565b6114ac90919063ffffffff16565b6107036106e8846060015160006001811015156106d057fe5b602002015185604001516114ac90919063ffffffff16565b6106f585602001516114ec565b61147590919063ffffffff16565b6114ac90919063ffffffff16565b816101000181815250506107378161010001518560a001516114ac90919063ffffffff16565b8160e001818152505060008090505b60208110156107a45761077c8160020a8360600151600060018110151561076957fe5b602002015161147590919063ffffffff16565b8260a001518260208110151561078e57fe5b6020020181815250508080600101915050610746565b506107e2816040015185608001516040516020016107c39291906123a7565b6040516020818303038152906040528051906020012060019004611336565b8160c00181815250506108536108138560800151600060028110151561080457fe5b60200201518360c00151611537565b61084e8660800151600160028110151561082957fe5b60200201516108498560c001518660c0015161147590919063ffffffff16565b611537565b611572565b816101200181905250610864611c0e565b6108b6610896608060408051908101604052908160008201548152602001600182015481525050876101200151611537565b6108b188604001516108ac8961010001516115b8565b611537565b611572565b81602001819052506109016040805190810160405280600681526020017f5a6574686572000000000000000000000000000000000000000000000000000081525087608001516115e4565b816040018190525061093f61091f8260400151876101200151611537565b61093a8860c001516109358961010001516115b8565b611537565b611572565b81606001819052506109b761099a61096d61096289602001518960600151611572565b886101200151611537565b6109956109828a600001518a60400151611572565b6109908a61010001516115b8565b611537565b611572565b836060015160006001811015156109ad57fe5b6020020151611537565b8160800181905250610a54610a4a610a3f610a2c6109f96080604080519081016040529081600082015481526020016001820154815250508760e00151611537565b610a276082604080519081016040529081600082015481526020016001820154815250508b60c00151611537565b611572565b610a3a866101200151611654565b611572565b876101000151611537565b8260800151611572565b8160a00181905250610ac9610a8e608060408051908101604052908160008201548152602001600182015481525050876101400151611537565b610ac4610aa48960200151896101200151611537565b610abf8a60000151610aba8b61010001516115b8565b611537565b611572565b611572565b8160c00181905250610b3e610b03608260408051908101604052908160008201548152602001600182015481525050876101600151611537565b610b39610b198860600151896101200151611537565b610b348960400151610b2f8b61010001516115b8565b611537565b611572565b611572565b8160e00181905250610b9b8260c00151826020015183606001518460a001518560c001518660e00151604051602001610b7c9695949392919061245b565b6040516020818303038152906040528051906020012060019004611336565b8160000181815250508461010001518160000151141515610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be8906122e9565b60405180910390fd5b610bf9611c7e565b610c308260000151604051602001610c11919061238c565b6040516020818303038152906040528051906020012060019004611336565b816080018181525050610c676080604080519081016040529081600082015481526020016001820154815250508260800151611537565b8160000181905250610cd56040602080602002604051908101604052809291906000905b82821015610cc7578382600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190610c8b565b5050505084602001516116cd565b8160200181905250610cfc610cf284602001518560400151611744565b8460a001516117ab565b8160400181905250610dbb610da4610d298860000151610d248a602001518860c00151611537565b611572565b610d9f610d8d6000602080602002604051908101604052809291906000905b82821015610d84578382600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190610d48565b50505050611824565b610d9a88604001516115b8565b611537565b611572565b610db68360200151846040015161186c565b611572565b8160600181905250610e068160600151610e01608260408051908101604052908160008201548152602001600182015481525050610dfc8a60e001516115b8565b611537565b611572565b8160600181905250610e2d8160600151610e2883600001518960a00151611537565b611572565b8160600181905250610e3d611b6c565b866101800151905060008090505b6005811015610f8a57610ebb8360800151836000015183600581101515610e6e57fe5b6020020151846020015184600581101515610e8557fe5b6020020151604051602001610e9c939291906123d0565b6040516020818303038152906040528051906020012060019004611336565b83608001818152505082608001518360a0015182600581101515610edb57fe5b6020020181815250506000610ef384608001516118d0565b9050610f748460600151610f6f610f37866000015186600581101515610f1557fe5b6020020151610f3260028a6080015161140890919063ffffffff16565b611537565b610f6a876020015187600581101515610f4c57fe5b6020020151610f6560028861140890919063ffffffff16565b611537565b611572565b611572565b8460600181905250508080600101915050610e4b565b5060018260c001516000602081101515610fa057fe5b60200201818152505060008090505b600581101561102157610ff88360a0015182600581101515610fcd57fe5b60200201518460c001516000602081101515610fe557fe5b602002015161147590919063ffffffff16565b8360c00151600060208110151561100b57fe5b6020020181815250508080600101915050610faf565b5061102a611ce1565b61104a8360c00151600060208110151561104057fe5b60200201516118d0565b8360c00151600060208110151561105d57fe5b60200201818152505060008090505b6002602081151561107957fe5b0481101561118c5760008090505b6020828260019060020a020110156111805760008160019060020a028301905083816020811015156110b557fe5b6020020151151561117457600061110d8760a00151846001600503036005811015156110dd57fe5b60200201518860a00151856001600503036005811015156110fa57fe5b602002015161147590919063ffffffff16565b9050611138818860c001518660208110151561112557fe5b602002015161147590919063ffffffff16565b8760c001518360208110151561114a57fe5b6020020181815250506001858360208110151561116357fe5b602002019015159081151581525050505b50806001019050611087565b5080600101905061106c565b50611195611d05565b61119d611d05565b60008090505b602081101561125c57611206836112016000846020811015156111c257fe5b60020201604080519081016040529081600082015481526020016001820154815250508960c00151856020811015156111f757fe5b6020020151611537565b611572565b925061124d8261124888602001518460208110151561122157fe5b60200201518960c001518560016020030360208110151561123e57fe5b6020020151611537565b611572565b915080806001019150506111a3565b50611265611d05565b6112b961128c611279858860400151611537565b611287858960600151611537565b611572565b6112b488600001516112af89606001518a6040015161147590919063ffffffff16565b611537565b611572565b90506112c9866060015182611906565b151561130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130190612309565b60405180910390fd5b6001995050505050505050505092915050565b6000604051826020850101518152805191505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018281151561136357fe5b069050919050565b611373611d1f565b600181600060208110151561138457fe5b6020020181815250508181600160208110151561139d57fe5b6020020181815250506000600290505b6020811015611402576113de8383600184036020811015156113cb57fe5b602002015161147590919063ffffffff16565b82826020811015156113ec57fe5b60200201818152505080806001019150506113ad565b50919050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa151561146957600080fd5b80519250505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156114a157fe5b828409905092915050565b6000818310156114e05782827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103016114e4565b8183035b905092915050565b600080600090505b602081101561153157611522838260208110151561150e57fe5b60200201518361192e90919063ffffffff16565b915080806001019150506114f4565b50919050565b61153f611d05565b604051835181526020840151602082015282604082015260408260608360075afa151561156b57600080fd5b5092915050565b61157a611d05565b6040518351815260208401516020820152825160408201526020830151606082015260408260808360065afa15156115b157600080fd5b5092915050565b6000817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001039050919050565b6115ec611d05565b61164c7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784846040516020016116239291906122a6565b604051602081830303815290604052805190602001206001900481151561164657fe5b06611965565b905092915050565b61165c611d05565b6040805190810160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001518115156116a057fe5b067f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47038152509050919050565b6116d5611d43565b60008090505b602081101561173d5761171a84826020811015156116f557fe5b6020020151611715858460208110151561170b57fe5b60200201516118d0565b611537565b828260208110151561172857fe5b602002018190525080806001019150506116db565b5092915050565b61174c611d1f565b60008090505b60208110156117a45761178083858360208110151561176d57fe5b602002015161147590919063ffffffff16565b828260208110151561178e57fe5b6020020181815250508080600101915050611752565b5092915050565b6117b3611d1f565b60008090505b602081101561181d576117f983826020811015156117d357fe5b602002015185836020811015156117e657fe5b602002015161192e90919063ffffffff16565b828260208110151561180757fe5b60200201818152505080806001019150506117b9565b5092915050565b61182c611d05565b60008090505b60208110156118665761185782848360208110151561184d57fe5b6020020151611572565b91508080600101915050611832565b50919050565b611874611d05565b60008090505b60208110156118c9576118ba826118b5868460208110151561189857fe5b602002015186856020811015156118ab57fe5b6020020151611537565b611572565b9150808060010191505061187a565b5092915050565b60006118ff8260027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103611408565b9050919050565b600081600001518360000151148015611926575081602001518360200151145b905092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180151561195a57fe5b828408905092915050565b61196d611d05565b60005b6001156119e85760006003611986856003611a05565b0190506119c281600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47018115156119bc57fe5b04611a05565b9150806119d0836002611a05565b14156119dc57506119e8565b60018401935050611970565b604080519081016040528084815260200182815250915050919050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa1515611a6657600080fd5b80519250505092915050565b61016060405190810160405280611a87611d72565b8152602001611a94611d72565b8152602001611aa1611d72565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001611ad9611d72565b81525090565b61052060405190810160405280611af4611d72565b8152602001611b01611d72565b8152602001611b0e611d72565b8152602001611b1b611d72565b8152602001611b28611d8c565b815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001611b66611dba565b81525090565b6102c060405190810160405280611b81611df0565b8152602001611b8e611df0565b815260200160008152602001600081525090565b6109206040519081016040528060008152602001611bbe611e1f565b815260200160008152602001611bd2611e43565b815260200160008152602001611be6611e1f565b8152602001600081526020016000815260200160008152602001611c08611d72565b81525090565b6101e06040519081016040528060008152602001611c2a611d72565b8152602001611c37611d72565b8152602001611c44611d72565b8152602001611c51611d72565b8152602001611c5e611d72565b8152602001611c6b611d72565b8152602001611c78611d72565b81525090565b61114060405190810160405280611c93611d72565b8152602001611ca0611e66565b8152602001611cad611e1f565b8152602001611cba611d72565b815260200160008152602001611cce611e95565b8152602001611cdb611e1f565b81525090565b61040060405190810160405280602090602082028038833980820191505090505090565b604080519081016040528060008152602001600081525090565b61040060405190810160405280602090602082028038833980820191505090505090565b610800604051908101604052806020905b611d5c611d72565b815260200190600190039081611d545790505090565b604080519081016040528060008152602001600081525090565b6080604051908101604052806002905b611da4611d72565b815260200190600190039081611d9c5790505090565b6102c060405190810160405280611dcf611df0565b8152602001611ddc611df0565b815260200160008152602001600081525090565b610140604051908101604052806005905b611e09611d72565b815260200190600190039081611e015790505090565b61040060405190810160405280602090602082028038833980820191505090505090565b602060405190810160405280600190602082028038833980820191505090505090565b610800604051908101604052806020905b611e7f611d72565b815260200190600190039081611e775790505090565b60a060405190810160405280600590602082028038833980820191505090505090565b6000611ec482356125d5565b905092915050565b600082601f8301121515611edf57600080fd5b6002611ef2611eed826124eb565b6124be565b91508183856020840282011115611f0857600080fd5b60005b83811015611f385781611f1e8882611f42565b845260208401935060208301925050600181019050611f0b565b5050505092915050565b6000611f4e82356125e7565b905092915050565b600082601f8301121515611f6957600080fd5b8135611f7c611f778261250d565b6124be565b91508082526020830160208301858383011115611f9857600080fd5b611fa383828461261b565b50505092915050565b6000611fb88235612611565b905092915050565b600080600080600080600080610180898b031215611fdd57600080fd5b6000611feb8b828c01611ecc565b9850506040611ffc8b828c01611ecc565b975050608061200d8b828c01611ecc565b96505060c061201e8b828c01611fac565b95505060e061202f8b828c01611fac565b9450506101006120418b828c01611ecc565b9350506101406120538b828c01611eb8565b92505061016089013567ffffffffffffffff81111561207157600080fd5b61207d8b828c01611f56565b9150509295985092959890939650565b60006120998383612213565b60408301905092915050565b6120ae8161258d565b82525050565b6120bd81612543565b6120c78184612566565b92506120d282612539565b60005b82811015612100576120e885835161208d565b94506120f382612559565b91506001810190506120d5565b5050505050565b6121108161259f565b82525050565b60006121218261254e565b61212b8185612582565b935061213b81856020860161262a565b80840191505092915050565b6000612154602a83612571565b91507f5369676d612070726f746f636f6c206368616c6c656e676520657175616c697460008301527f79206661696c7572652e000000000000000000000000000000000000000000006020830152604082019050919050565b60006121ba602583612571565b91507f496e6e65722070726f6475637420657175616c69747920636865636b2066616960008301527f6c7572652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6040820160008201516122296000850182612271565b50602082015161223c6020850182612271565b50505050565b6040820160008201516122586000850182612271565b50602082015161226b6020850182612271565b50505050565b61227a816125cb565b82525050565b612289816125cb565b82525050565b6122a061229b826125cb565b61265d565b82525050565b60006122b28285612116565b91506122be828461228f565b6020820191508190509392505050565b60006020820190506122e36000830184612107565b92915050565b6000602082019050818103600083015261230281612147565b9050919050565b60006020820190508181036000830152612322816121ad565b9050919050565b60006101208201905061233f6000830189612242565b61234c6040830188612242565b6123596080830187612242565b61236660c0830186612280565b61237360e0830185612280565b6123816101008301846120a5565b979650505050505050565b60006020820190506123a16000830184612280565b92915050565b600060a0820190506123bc6000830185612280565b6123c960208301846120b4565b9392505050565b600060a0820190506123e56000830186612280565b6123f26020830185612242565b6123ff6060830184612242565b949350505050565b60006101208201905061241d6000830188612280565b61242a6020830187612242565b6124376060830186612242565b61244460a0830185612242565b61245160e0830184612242565b9695505050505050565b6000610160820190506124716000830189612280565b61247e6020830188612242565b61248b6060830187612242565b61249860a0830186612242565b6124a560e0830185612242565b6124b3610120830184612242565b979650505050505050565b6000604051905081810181811067ffffffffffffffff821117156124e157600080fd5b8060405250919050565b600067ffffffffffffffff82111561250257600080fd5b602082029050919050565b600067ffffffffffffffff82111561252457600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b600060029050919050565b600081519050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612598826125ab565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006125e0826125f1565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561264857808201518184015260208101905061262d565b83811115612657576000848401525b50505050565b600081905091905056fea265627a7a723058207be08f1fb75092e2bf18ebdffa118e8d1d3264492c2103bfd7834e929d492c236c6578706572696d656e74616cf50037", + "sourceMap": "81:14294:0:-;;;1049:206;8:9:-1;5:2;;;30:1;27;20:12;5:2;1049:206:0;1084:12;;;;;;;;;;;;;;;;;;;:7;;;:12;;;:::i;:::-;1080:1;:16;;;;;;;;;;;;;;;;;;;1110:12;;;;;;;;;;;;;;;;;;;:7;;;:12;;;:::i;:::-;1106:1;:16;;;;;;;;;;;;;;;;;;;1137:9;1149:1;1137:13;;1132:117;160:2;1152:1;:5;1132:117;;;1186:15;;;;;;;;;;;;;;;;;;;1199:1;1186:7;;;:15;;;:::i;:::-;1178:2;1181:1;1178:5;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;;1223:15;;;;;;;;;;;;;;;;;;;1236:1;1223:7;;;:15;;;:::i;:::-;1215:2;1218:1;1215:5;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;;1159:3;;;;;;;1132:117;;;;81:14294;;14019:167;14080:14;;:::i;:::-;14113:66;227:77;14156:5;14139:23;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14139:23:0;;;14129:34;;;;;;14121:43;;;:57;;;;;;;;14113:7;;;:66;;;:::i;:::-;14106:73;;14019:167;;;:::o;14192:181::-;14264:14;;:::i;:::-;14297:69;227:77;14340:5;14347:1;14323:26;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14323:26:0;;;14313:37;;;;;;14305:46;;;:60;;;;;;;;14297:7;;;:69;;;:::i;:::-;14290:76;;14192:181;;;;:::o;13564:449::-;13618:14;;:::i;:::-;13644:9;13663:311;13670:4;13663:311;;;13690:16;13729:1;13709:17;13718:4;13724:1;13709:8;;;:17;;;:::i;:::-;:21;13690:40;;13816:41;13825:8;13855:1;13850;227:77;13836:15;13835:21;;;;;;;;13816:8;;;:41;;;:::i;:::-;13812:45;;13893:8;13875:14;13884:1;13887;13875:8;;;:14;;;:::i;:::-;:26;13871:70;;;13921:5;;;13871:70;13962:1;13954:9;;;;13663:311;;;;13990:16;;;;;;;;;13998:4;13990:16;;;;14004:1;13990:16;;;13983:23;;;13564:449;;;:::o;12948:610::-;13021:14;13072:13;227:77;13072:27;;13147:4;13141:11;13175:4;13172:1;13165:15;13214:4;13207;13204:1;13200:12;13193:26;13253:4;13246;13243:1;13239:12;13232:26;13292:4;13285;13282:1;13278:12;13271:26;13331:8;13324:4;13321:1;13317:12;13310:30;13374:5;13367:4;13364:1;13360:12;13353:27;13437:4;13434:1;13428:4;13425:1;13419:4;13414:3;13403:39;13396:47;13393:2;;;13495:1;13492;13485:12;13393:2;13540:1;13534:8;13524:18;;13118:434;;;;;;:::o;81:14294::-;;;;;;;;;;;;;;;;;;;;:::o;5:360:-1:-;;135:39;168:5;135:39;;;186:89;268:6;263:3;186:89;;;179:96;;280:52;325:6;320:3;313:4;306:5;302:16;280:52;;;353:6;348:3;344:16;337:23;;115:250;;;;;;372:159;473:52;493:31;518:5;493:31;;;473:52;;;468:3;461:65;455:76;;;538:266;;684:95;775:3;766:6;684:95;;;677:102;;796:3;789:10;;665:139;;;;;811:405;;985:95;1076:3;1067:6;985:95;;;978:102;;1091:75;1162:3;1153:6;1091:75;;;1188:2;1183:3;1179:12;1172:19;;1208:3;1201:10;;966:250;;;;;;1223:92;;1304:5;1298:12;1288:22;;1282:33;;;;1323:145;;1459:3;1444:18;;1437:31;;;;;1476:79;;1545:5;1534:16;;1528:27;;;;1563:268;1628:1;1635:101;1649:6;1646:1;1643:13;1635:101;;;1725:1;1720:3;1716:11;1710:18;1706:1;1701:3;1697:11;1690:39;1671:2;1668:1;1664:10;1659:15;;1635:101;;;1751:6;1748:1;1745:13;1742:2;;;1816:1;1807:6;1802:3;1798:16;1791:27;1742:2;1612:219;;;;;1839:74;;1903:5;1892:16;;1886:27;;;;81:14294:0;;;;;;;", + "deployedSourceMap": "81:14294:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81:14294:0;;;;;;;;;;;;;;;;;;;;1338:1008;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1537:4;1553:30;;:::i;:::-;1898:41;;;;;;;;;1914:3;1918:1;1914:6;;;;;;;;;;;;;1906:15;;;1898:41;;;;1931:3;1935:1;1931:6;;;;;;;;;;;;;1923:15;;;1898:41;;;1882:9;:13;;:57;;;;1965:41;;;;;;;;;1981:3;1985:1;1981:6;;;;;;;;;;;;;1973:15;;;1965:41;;;;1998:3;2002:1;1998:6;;;;;;;;;;;;;1990:15;;;1965:41;;;1949:9;:13;;:57;;;;2030:37;;;;;;;;;2046:1;2048;2046:4;;;;;;;;;;;;;2038:13;;;2030:37;;;;2061:1;2063;2061:4;;;;;;;;;;;;;2053:13;;;2030:37;;;2016:9;:11;;:51;;;;2099:9;2077;:19;;:31;;;;;2136:5;2118:9;:15;;:23;;;;;2165:37;;;;;;;;;2181:1;2183;2181:4;;;;;;;;;;;;;2173:13;;;2165:37;;;;2196:1;2198;2196:4;;;;;;;;;;;;;2188:13;;;2165:37;;;2151:9;:11;;:51;;;;2231:6;2212:9;:16;;:25;;;;;;;;;;;2247:26;;:::i;:::-;2276:18;2288:5;2276:11;:18::i;:::-;2247:47;;2311:28;2318:9;2329;2311:6;:28::i;:::-;2304:35;;;;1338:1008;;;;;;;;;;:::o;8756:1167::-;8818:22;;:::i;:::-;8863:38;;;;;;;;;8871:13;8877:3;8882:1;8871:5;:13::i;:::-;8863:38;;;;8886:14;8892:3;8897:2;8886:5;:14::i;:::-;8863:38;;;8852:5;:8;;:49;;;;8922:39;;;;;;;;;8930:14;8936:3;8941:2;8930:5;:14::i;:::-;8922:39;;;;8946:14;8952:3;8957:2;8946:5;:14::i;:::-;8922:39;;;8911:5;:8;;:50;;;;8989:41;;;;;;;;;8997:15;9003:3;9008;8997:5;:15::i;:::-;8989:41;;;;9014:15;9020:3;9025;9014:5;:15::i;:::-;8989:41;;;8972:5;:14;;:58;;;;9057:41;;;;;;;;;9065:15;9071:3;9076;9065:5;:15::i;:::-;9057:41;;;;9082:15;9088:3;9093;9082:5;:15::i;:::-;9057:41;;;9040:5;:14;;:58;;;;9109:103;;;;;;;;;9127:41;;;;;;;;;9135:15;9141:3;9146;9135:5;:15::i;:::-;9127:41;;;;9152:15;9158:3;9163;9152:5;:15::i;:::-;9127:41;;;9109:103;;;;9170:41;;;;;;;;;9178:15;9184:3;9189;9178:5;:15::i;:::-;9170:41;;;;9195:15;9201:3;9206;9195:5;:15::i;:::-;9170:41;;;9109:103;;;:5;:14;;:103;;;;9235:15;9241:3;9246;9235:5;:15::i;:::-;9222:5;:10;;:28;;;;;9273:15;9279:3;9284;9273:5;:15::i;:::-;9260:5;:10;;:28;;;;;9309:15;9315:3;9320;9309:5;:15::i;:::-;9298:5;:8;;:26;;;;;9345:15;9351:3;9356;9345:5;:15::i;:::-;9335:5;:7;;:25;;;;;9383:15;9389:3;9394;9383:5;:15::i;:::-;9370:5;:10;;:28;;;;;9424:15;9430:3;9435;9424:5;:15::i;:::-;9408:5;:13;;:31;;;;;9466:15;9472:3;9477;9466:5;:15::i;:::-;9449:5;:14;;:32;;;;;9492;;:::i;:::-;9539:9;9551:1;9539:13;;9534:233;189:1;9554;:5;9534:233;;;9596:59;;;;;;;;;9604:24;9610:3;9625:2;9621:1;:6;9615:3;:12;9604:5;:24::i;:::-;9596:59;;;;9630:24;9636:3;9651:2;9647:1;:6;9641:3;:12;9630:5;:24::i;:::-;9596:59;;;9580:7;:10;;;9591:1;9580:13;;;;;;;;;;;;:75;;;;9685:71;;;;;;;;;9693:30;9699:3;9720:2;9715:1;189;9711:5;9710:12;9704:3;:18;9693:5;:30::i;:::-;9685:71;;;;9725:30;9731:3;9752:2;9747:1;189;9743:5;9742:12;9736:3;:18;9725:5;:30::i;:::-;9685:71;;;9669:7;:10;;;9680:1;9669:13;;;;;;;;;;;;:87;;;;9561:3;;;;;;;9534:233;;;;9788:25;9794:3;9809;189:1;9805:7;9799:3;:13;9788:5;:25::i;:::-;9776:7;:9;;:37;;;;;9835:25;9841:3;9856;189:1;9852:7;9846:3;:13;9835:5;:25::i;:::-;9823:7;:9;;:37;;;;;9886:7;9870:5;:13;;:23;;;;9911:5;9904:12;;;8756:1167;;;:::o;3075:5225::-;3170:4;3186:21;3210:135;3239:9;:13;;;3254:9;:13;;;3269:9;:11;;;3282:9;:19;;;3303:9;:15;;;3320:9;:16;;;3228:109;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3228:109:0;;;3218:120;;;;;;3210:129;;;:133;:135::i;:::-;3186:159;;3373:38;;:::i;:::-;3441:103;3470:13;3485:5;:8;;;3495:5;:8;;;3505:5;:14;;;3521:5;:14;;;3459:77;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3459:77:0;;;3449:88;;;;;;3441:97;;;:101;:103::i;:::-;3421:15;:17;;:123;;;;;3575:25;3582:15;:17;;;3575:6;:25::i;:::-;3554:15;:18;;:46;;;;3630:55;3659:15;:17;;;3648:29;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3648:29:0;;;3638:40;;;;;;3630:49;;;:53;:55::i;:::-;3610:15;:17;;:75;;;;;3695:47;;;;;;;;;3717:24;3739:1;3717:15;:17;;;:21;;:24;;;;:::i;:::-;3695:47;;;:15;:18;;:47;;;;3775:44;3801:15;:17;;;3775:15;:18;;;3794:1;3775:21;;;;;;;;;;;;;:25;;:44;;;;:::i;:::-;3752:15;:20;;:67;;;;;3864:144;3949:58;3986:15;:20;;;3949:32;160:2;3974:1;:6;3949:15;:20;;;:24;;:32;;;;:::i;:::-;:36;;:58;;;;:::i;:::-;3864:80;3899:44;3921:15;:18;;;3940:1;3921:21;;;;;;;;;;;;;3899:15;:17;;;:21;;:44;;;;:::i;:::-;3864:30;3875:15;:18;;;3864:10;:30::i;:::-;:34;;:80;;;;:::i;:::-;:84;;:144;;;;:::i;:::-;3844:15;:17;;:164;;;;;4038:33;4053:15;:17;;;4038:5;:10;;;:14;;:33;;;;:::i;:::-;4018:15;:17;;:53;;;;;4086:9;4098:1;4086:13;;4081:128;160:2;4101:1;:5;4081:128;;;4165:33;4196:1;4191;:6;4165:15;:18;;;4184:1;4165:21;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;4127:15;:32;;;4160:1;4127:35;;;;;;;;;;;;:71;;;;;4108:3;;;;;;;4081:128;;;;4239:71;4268:15;:17;;;4287:5;:14;;;4257:45;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4257:45:0;;;4247:56;;;;;;4239:65;;;:69;:71::i;:::-;4219:15;:17;;:91;;;;;4344:112;4348:41;4352:5;:14;;;4367:1;4352:17;;;;;;;;;;;;;4371:15;:17;;;4348:3;:41::i;:::-;4391:64;4395:5;:14;;;4410:1;4395:17;;;;;;;;;;;;;4414:40;4436:15;:17;;;4414:15;:17;;;:21;;:40;;;;:::i;:::-;4391:3;:64::i;:::-;4344:3;:112::i;:::-;4320:15;:21;;:136;;;;4493:40;;:::i;:::-;4566:56;4570:18;4574:1;4570:18;;;;;;;;;;;;;;;;;;;;;;;;;;4577:5;:10;;;4570:3;:18::i;:::-;4590:31;4594:9;:11;;;4607:13;:5;:7;;;:11;:13::i;:::-;4590:3;:31::i;:::-;4566:3;:56::i;:::-;4543:16;:20;;:79;;;;4658:34;;;;;;;;;;;;;;;;;;;4676:9;:15;;;4658:7;:34::i;:::-;4632:16;:23;;:60;;;;4725:78;4729:40;4733:16;:23;;;4758:5;:10;;;4729:3;:40::i;:::-;4771:31;4775:9;:11;;;4788:13;:5;:7;;;:11;:13::i;:::-;4771:3;:31::i;:::-;4725:3;:78::i;:::-;4702:16;:20;;:101;;;;4841:140;4845:112;4849:51;4853:34;4857:9;:13;;;4872:5;:14;;;4853:3;:34::i;:::-;4889:5;:10;;;4849:3;:51::i;:::-;4902:54;4906:34;4910:9;:13;;;4925:5;:14;;;4906:3;:34::i;:::-;4942:13;:5;:7;;;:11;:13::i;:::-;4902:3;:54::i;:::-;4845:3;:112::i;:::-;4959:15;:18;;;4978:1;4959:21;;;;;;;;;;;;;4841:3;:140::i;:::-;4813:16;:25;;:168;;;;5014:129;5018:97;5022:83;5026:50;5030:25;5034:1;5030:25;;;;;;;;;;;;;;;;;;;;;;;;;;5037:15;:17;;;5030:3;:25::i;:::-;5057:18;5061:1;5057:18;;;;;;;;;;;;;;;;;;;;;;;;;;5064:5;:10;;;5057:3;:18::i;:::-;5026:3;:50::i;:::-;5078:26;5082:15;:21;;;5078:3;:26::i;:::-;5022:3;:83::i;:::-;5107:5;:7;;;5018:3;:97::i;:::-;5117:16;:25;;;5014:3;:129::i;:::-;4991:16;:20;;:152;;;;5178:98;5182:21;5186:1;5182:21;;;;;;;;;;;;;;;;;;;;;;;;;;5189:5;:13;;;5182:3;:21::i;:::-;5205:70;5209:30;5213:9;:13;;;5228:5;:10;;;5209:3;:30::i;:::-;5241:33;5245:9;:13;;;5260;:5;:7;;;:11;:13::i;:::-;5241:3;:33::i;:::-;5205:3;:70::i;:::-;5178:3;:98::i;:::-;5153:16;:22;;:123;;;;5316:101;5320:22;5324:1;5320:22;;;;;;;;;;;;;;;;;;;;;;;;;;5327:5;:14;;;5320:3;:22::i;:::-;5344:72;5348:31;5352:5;:14;;;5368:5;:10;;;5348:3;:31::i;:::-;5381:34;5385:5;:14;;;5401:13;:5;:7;;;:11;:13::i;:::-;5381:3;:34::i;:::-;5344:3;:72::i;:::-;5316:3;:101::i;:::-;5286:16;:27;;:131;;;;5449:174;5478:15;:17;;;5497:16;:20;;;5519:16;:20;;;5541:16;:20;;;5563:16;:22;;;5587:16;:27;;;5467:148;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5467:148:0;;;5457:159;;;;;;5449:168;;;:172;:174::i;:::-;5428:16;:18;;:195;;;;;5663:5;:7;;;5641:16;:18;;;:29;5633:84;;;;;;;;;;;;;;;;;;;;;;;;5728:34;;:::i;:::-;5790:56;5819:16;:18;;;5808:30;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5808:30:0;;;5798:41;;;;;;5790:50;;;:54;:56::i;:::-;5772:13;:15;;:74;;;;;5876:23;5880:1;5876:23;;;;;;;;;;;;;;;;;;;;;;;;;;5883:13;:15;;;5876:3;:23::i;:::-;5856:13;:17;;:43;;;;5933:35;5945:2;5933:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5949:15;:18;;;5933:11;:35::i;:::-;5909:13;:21;;:59;;;;5999:90;6010:44;6016:15;:18;;;6036:15;:17;;;6010:5;:44::i;:::-;6056:15;:32;;;5999:10;:90::i;:::-;5978:13;:18;;:111;;;;6117:153;6121:97;6125:47;6129:5;:8;;;6139:32;6143:5;:8;;;6153:15;:17;;;6139:3;:32::i;:::-;6125:3;:47::i;:::-;6174:43;6178:13;6188:2;6178:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:13::i;:::-;6193:23;:15;:17;;;:21;:23::i;:::-;6174:3;:43::i;:::-;6121:3;:97::i;:::-;6220:49;6227:13;:21;;;6250:13;:18;;;6220:6;:49::i;:::-;6117:3;:153::i;:::-;6099:13;:15;;:171;;;;6298:44;6302:13;:15;;;6319:22;6323:1;6319:22;;;;;;;;;;;;;;;;;;;;;;;;;;6326:14;:5;:8;;;:12;:14::i;:::-;6319:3;:22::i;:::-;6298:3;:44::i;:::-;6280:13;:15;;:62;;;;6370:56;6374:13;:15;;;6391:34;6395:13;:17;;;6414:5;:10;;;6391:3;:34::i;:::-;6370:3;:56::i;:::-;6352:13;:15;;:74;;;;6481:32;;:::i;:::-;6516:5;:13;;;6481:48;;6544:9;6556:1;6544:13;;6539:421;189:1;6559;:5;6539:421;;;6603:83;6632:13;:15;;;6649:7;:10;;;6660:1;6649:13;;;;;;;;;;;;;6664:7;:10;;;6675:1;6664:13;;;;;;;;;;;;;6621:57;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;6621:57:0;;;6611:68;;;;;;6603:77;;;:81;:83::i;:::-;6585:13;:15;;:101;;;;;6730:13;:15;;;6700:13;:24;;;6725:1;6700:27;;;;;;;;;;;;:45;;;;;6779:12;6794:21;:13;:15;;;:19;:21::i;:::-;6779:36;;6847:102;6851:13;:15;;;6868:80;6872:42;6876:7;:10;;;6887:1;6876:13;;;;;;;;;;;;;6891:22;6911:1;6891:13;:15;;;:19;;:22;;;;:::i;:::-;6872:3;:42::i;:::-;6916:31;6920:7;:10;;;6931:1;6920:13;;;;;;;;;;;;;6935:11;6944:1;6935:4;:8;;:11;;;;:::i;:::-;6916:3;:31::i;:::-;6868:3;:80::i;:::-;6847:3;:102::i;:::-;6829:13;:15;;:120;;;;6539:421;6566:3;;;;;;;6539:421;;;;7004:1;6970:13;:28;;;6999:1;6970:31;;;;;;;;;;;;:35;;;;;7020:9;7032:1;7020:13;;7015:155;189:1;7035;:5;7015:155;;;7095:64;7131:13;:24;;;7156:1;7131:27;;;;;;;;;;;;;7095:13;:28;;;7124:1;7095:31;;;;;;;;;;;;;:35;;:64;;;;:::i;:::-;7061:13;:28;;;7090:1;7061:31;;;;;;;;;;;;:98;;;;;7042:3;;;;;;;7015:155;;;;7179:21;;:::i;:::-;7244:37;:13;:28;;;7273:1;7244:31;;;;;;;;;;;;;:35;:37::i;:::-;7210:13;:28;;;7239:1;7210:31;;;;;;;;;;;;:71;;;;;7296:9;7308:1;7296:13;;7291:462;7317:1;160:2;7315:3;;;;;;;;7311:1;:7;7291:462;;;7344:9;7356:1;7344:13;;7339:404;160:2;7370:1;7365;7360;:6;;;;7359:12;:16;7339:404;;;7400:10;7423:1;7418;:6;;;;7413:1;:12;7400:25;;7448:6;7455:2;7448:10;;;;;;;;;;;;;7447:11;7443:286;;;7482:12;7497:76;7537:13;:24;;;7570:1;7566;189;7562:5;:9;7537:35;;;;;;;;;;;;;7497:13;:24;;;7530:1;7526;189;7522:5;:9;7497:35;;;;;;;;;;;;;:39;;:76;;;;:::i;:::-;7482:91;;7630:41;7666:4;7630:13;:28;;;7659:1;7630:31;;;;;;;;;;;;;:35;;:41;;;;:::i;:::-;7595:13;:28;;;7624:2;7595:32;;;;;;;;;;;;:76;;;;;7706:4;7693:6;7700:2;7693:10;;;;;;;;;;;;:17;;;;;;;;;;;7443:286;;7339:404;7377:3;;;;;7339:404;;;;7320:3;;;;;7291:462;;;;7763:20;;:::i;:::-;7793;;:::i;:::-;7828:9;7840:1;7828:13;;7823:224;160:2;7843:1;:5;7823:224;;;7877:55;7881:5;7888:43;7892:2;7895:1;7892:5;;;;;;;;;;;;7888:43;;;;;;;;;;;;;;;;;;;;;;;;;;7899:13;:28;;;7928:1;7899:31;;;;;;;;;;;;;7888:3;:43::i;:::-;7877:3;:55::i;:::-;7869:63;;7954:82;7958:5;7965:70;7969:13;:21;;;7991:1;7969:24;;;;;;;;;;;;;7995:13;:28;;;8032:1;8028;160:2;8024:5;:9;7995:39;;;;;;;;;;;;;7965:3;:70::i;:::-;7954:3;:82::i;:::-;7946:90;;7850:3;;;;;;;7823:224;;;;8056:21;;:::i;:::-;8080:104;8084:49;8088:21;8092:5;8099:7;:9;;;8088:3;:21::i;:::-;8111;8115:5;8122:7;:9;;;8111:3;:21::i;:::-;8084:3;:49::i;:::-;8135:48;8139:13;:17;;;8158:24;8172:7;:9;;;8158:7;:9;;;:13;;:24;;;;:::i;:::-;8135:3;:48::i;:::-;8080:3;:104::i;:::-;8056:128;;8202:27;8205:13;:15;;;8222:6;8202:2;:27::i;:::-;8194:77;;;;;;;;;;;;;;;;;;;;;;;;8289:4;8282:11;;;;;;;;;;;3075:5225;;;;:::o;11407:295::-;11480:14;11573:4;11567:11;11629:5;11622:4;11615:5;11611:16;11607:28;11601:35;11598:1;11591:46;11684:1;11678:8;11668:18;;11544:152;;;;;:::o;720:95:3:-;767:7;110:77;793:1;:15;;;;;;;;786:22;;720:95;;;:::o;10967:236:0:-;11020:24;;:::i;:::-;11068:1;11056:6;11063:1;11056:9;;;;;;;;;;;;:13;;;;;11091:4;11079:6;11086:1;11079:9;;;;;;;;;;;;:16;;;;;11110:9;11122:1;11110:13;;11105:92;160:2;11125:1;:5;11105:92;;;11163:23;11181:4;11163:6;11174:1;11170;:5;11163:13;;;;;;;;;;;;;:17;;:23;;;;:::i;:::-;11151:6;11158:1;11151:9;;;;;;;;;;;;:35;;;;;11132:3;;;;;;;11105:92;;;;10967:236;;;:::o;1055:580:3:-;1123:14;1149:13;110:77;1149:27;;1224:4;1218:11;1252:4;1249:1;1242:15;1291:4;1284;1281:1;1277:12;1270:26;1330:4;1323;1320:1;1316:12;1309:26;1369:4;1362;1359:1;1355:12;1348:26;1408:8;1401:4;1398:1;1394:12;1387:30;1451:5;1444:4;1441:1;1437:12;1430:27;1514:4;1511:1;1505:4;1502:1;1496:4;1491:3;1480:39;1473:47;1470:2;;;1572:1;1569;1562:12;1470:2;1617:1;1611:8;1601:18;;1195:434;;;;;;:::o;489:116::-;547:7;110:77;573:25;;;;;;;583:1;580;573:25;566:32;;489:116;;;;:::o;821:127::-;879:7;910:1;905;:6;;:36;;940:1;936;110:77;922:15;:19;905:36;;;918:1;914;:5;905:36;898:43;;821:127;;;;:::o;10373:180:0:-;10438:14;10469:9;10481:1;10469:13;;10464:83;160:2;10484:1;:5;10464:83;;;10519:17;10530:2;10533:1;10530:5;;;;;;;;;;;;;10519:6;:10;;:17;;;;:::i;:::-;10510:26;;10491:3;;;;;;;10464:83;;;;10373:180;;;:::o;12236:382::-;12301:16;;:::i;:::-;12367:4;12361:11;12401:1;12395:8;12392:1;12385:19;12451:4;12448:1;12444:12;12438:19;12431:4;12428:1;12424:12;12417:41;12492:1;12485:4;12482:1;12478:12;12471:23;12551:4;12548:1;12542:4;12539:1;12533:4;12528:3;12517:39;12510:47;12507:2;;;12586:1;12583;12576:12;12507:2;12338:274;;;;;:::o;11774:456::-;11848:16;;:::i;:::-;11914:4;11908:11;11948:2;11942:9;11939:1;11932:20;12000:4;11996:2;11992:13;11986:20;11979:4;11976:1;11972:12;11965:42;12047:2;12041:9;12034:4;12031:1;12027:12;12020:31;12099:4;12095:2;12091:13;12085:20;12078:4;12075:1;12071:12;12064:42;12163:4;12160:1;12154:4;12151:1;12145:4;12140:3;12129:39;12122:47;12119:2;;;12198:1;12195;12188:12;12119:2;11885:339;;;;;:::o;954:95:3:-;1001:7;1041:1;110:77;1027:15;1020:22;;954:95;;;:::o;14192:181:0:-;14264:14;;:::i;:::-;14297:69;227:77;14340:5;14347:1;14323:26;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14323:26:0;;;14313:37;;;;;;14305:46;;;:60;;;;;;;;14297:7;:69::i;:::-;14290:76;;14192:181;;;;:::o;12624:::-;12678:14;;:::i;:::-;12711:47;;;;;;;;;12719:1;:3;;;12711:47;;;;227:77;12739:1;:3;;;:17;;;;;;;;227:77;12724:33;12711:47;;;12704:54;;12624:181;;;:::o;10145:222::-;10233:24;;:::i;:::-;10274:9;10286:1;10274:13;;10269:92;160:2;10289:1;:5;10269:92;;;10327:23;10331:2;10334:1;10331:5;;;;;;;;;;;;;10338:11;:2;10341:1;10338:5;;;;;;;;;;;;;:9;:11::i;:::-;10327:3;:23::i;:::-;10315:6;10322:1;10315:9;;;;;;;;;;;;:35;;;;10296:3;;;;;;;10269:92;;;;10145:222;;;;:::o;11209:192::-;11279:24;;:::i;:::-;11320:9;11332:1;11320:13;;11315:80;160:2;11335:1;:5;11315:80;;;11373:11;11382:1;11373;11375;11373:4;;;;;;;;;;;;;:8;;:11;;;;:::i;:::-;11361:6;11368:1;11361:9;;;;;;;;;;;;:23;;;;;11342:3;;;;;;;11315:80;;;;11209:192;;;;:::o;9929:210::-;10014:24;;:::i;:::-;10055:9;10067:1;10055:13;;10050:83;160:2;10070:1;:5;10050:83;;;10108:14;10117:1;10119;10117:4;;;;;;;;;;;;;10108:1;10110;10108:4;;;;;;;;;;;;;:8;;:14;;;;:::i;:::-;10096:6;10103:1;10096:9;;;;;;;;;;;;:26;;;;;10077:3;;;;;;;10050:83;;;;9929:210;;;;:::o;10559:178::-;10623:18;;:::i;:::-;10658:9;10670:1;10658:13;;10653:78;160:2;10673:1;:5;10653:78;;;10705:15;10709:3;10714:2;10717:1;10714:5;;;;;;;;;;;;;10705:3;:15::i;:::-;10699:21;;10680:3;;;;;;;10653:78;;;;10559:178;;;:::o;10743:218::-;10826:21;;:::i;:::-;10864:9;10876:1;10864:13;;10859:96;160:2;10879:1;:5;10859:96;;;10914:30;10918:6;10926:17;10930:2;10933:1;10930:5;;;;;;;;;;;;;10937:2;10940:1;10937:5;;;;;;;;;;;;;10926:3;:17::i;:::-;10914:3;:30::i;:::-;10905:39;;10886:3;;;;;;;10859:96;;;;10743:218;;;;:::o;611:103:3:-;658:7;684:23;688:1;705;110:77;691:15;684:3;:23::i;:::-;677:30;;611:103;;;:::o;12811:131:0:-;12884:4;12915:2;:4;;;12907:2;:4;;;:12;:28;;;;;12931:2;:4;;;12923:2;:4;;;:12;12907:28;12900:35;;12811:131;;;;:::o;367:116:3:-;425:7;110:77;451:25;;;;;;;461:1;458;451:25;444:32;;367:116;;;;:::o;13564:449:0:-;13618:14;;:::i;:::-;13644:9;13663:311;13670:4;13663:311;;;13690:16;13729:1;13709:17;13718:4;13724:1;13709:8;:17::i;:::-;:21;13690:40;;13816:41;13825:8;13855:1;13850;227:77;13836:15;13835:21;;;;;;;;13816:8;:41::i;:::-;13812:45;;13893:8;13875:14;13884:1;13887;13875:8;:14::i;:::-;:26;13871:70;;;13921:5;;;13871:70;13962:1;13954:9;;;;13663:311;;;;13990:16;;;;;;;;;13998:4;13990:16;;;;14004:1;13990:16;;;13983:23;;;13564:449;;;:::o;12948:610::-;13021:14;13072:13;227:77;13072:27;;13147:4;13141:11;13175:4;13172:1;13165:15;13214:4;13207;13204:1;13200:12;13193:26;13253:4;13246;13243:1;13239:12;13232:26;13292:4;13285;13282:1;13278:12;13271:26;13331:8;13324:4;13321:1;13317:12;13310:30;13374:5;13367:4;13364:1;13360:12;13353:27;13437:4;13434:1;13428:4;13425:1;13419:4;13414:3;13403:39;13396:47;13393:2;;;13495:1;13492;13485:12;13393:2;13540:1;13534:8;13524:18;;13118:434;;;;;;:::o;81:14294::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:14294:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:14294:0;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:14294:0;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:14294:0;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:14294:0;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;;57:66;;;;;149:615;;264:3;257:4;249:6;245:17;241:27;234:35;231:2;;;282:1;279;272:12;231:2;306:3;324:78;339:62;394:6;339:62;;;324:78;;;315:87;;419:5;478:6;525:3;517:4;509:6;505:17;500:3;496:27;493:36;490:2;;;542:1;539;532:12;490:2;567:1;552:206;577:6;574:1;571:13;552:206;;;635:3;657:37;690:3;678:10;657:37;;;652:3;645:50;718:4;713:3;709:14;702:21;;746:4;741:3;737:14;730:21;;609:149;599:1;596;592:9;587:14;;552:206;;;556:14;224:540;;;;;;;;772:118;;839:46;877:6;864:20;839:46;;;830:55;;824:66;;;;;898:440;;999:3;992:4;984:6;980:17;976:27;969:35;966:2;;;1017:1;1014;1007:12;966:2;1054:6;1041:20;1076:64;1091:48;1132:6;1091:48;;;1076:64;;;1067:73;;1160:6;1153:5;1146:21;1196:4;1188:6;1184:17;1229:4;1222:5;1218:16;1264:3;1255:6;1250:3;1246:16;1243:25;1240:2;;;1281:1;1278;1271:12;1240:2;1291:41;1325:6;1320:3;1315;1291:41;;;959:379;;;;;;;;1346:118;;1413:46;1451:6;1438:20;1413:46;;;1404:55;;1398:66;;;;;1471:1411;;;;;;;;;1795:3;1783:9;1774:7;1770:23;1766:33;1763:2;;;1812:1;1809;1802:12;1763:2;1847:1;1864:76;1932:7;1923:6;1912:9;1908:22;1864:76;;;1854:86;;1826:120;1977:2;1995:76;2063:7;2054:6;2043:9;2039:22;1995:76;;;1985:86;;1956:121;2108:3;2127:76;2195:7;2186:6;2175:9;2171:22;2127:76;;;2117:86;;2087:122;2240:3;2259:53;2304:7;2295:6;2284:9;2280:22;2259:53;;;2249:63;;2219:99;2349:3;2368:53;2413:7;2404:6;2393:9;2389:22;2368:53;;;2358:63;;2328:99;2458:3;2477:76;2545:7;2536:6;2525:9;2521:22;2477:76;;;2467:86;;2437:122;2590:3;2609:53;2654:7;2645:6;2634:9;2630:22;2609:53;;;2599:63;;2569:99;2727:3;2716:9;2712:19;2699:33;2752:18;2744:6;2741:30;2738:2;;;2784:1;2781;2774:12;2738:2;2804:62;2858:7;2849:6;2838:9;2834:22;2804:62;;;2794:72;;2678:194;1757:1125;;;;;;;;;;;;2890:259;;3018:91;3105:3;3098:5;3018:91;;;3138:4;3133:3;3129:14;3115:28;;3011:138;;;;;3157:120;3240:31;3265:5;3240:31;;;3235:3;3228:44;3222:55;;;3357:743;3528:69;3591:5;3528:69;;;3610:105;3708:6;3703:3;3610:105;;;3603:112;;3735:71;3800:5;3735:71;;;3827:1;3812:276;3837:6;3834:1;3831:13;3812:276;;;3884:105;3985:3;3976:6;3970:13;3884:105;;;3877:112;;4006:75;4074:6;4006:75;;;3996:85;;3859:1;3856;3852:9;3847:14;;3812:276;;;3816:14;3507:593;;;;;4108:111;4185:28;4207:5;4185:28;;;4180:3;4173:41;4167:52;;;4226:360;;4356:39;4389:5;4356:39;;;4407:89;4489:6;4484:3;4407:89;;;4400:96;;4501:52;4546:6;4541:3;4534:4;4527:5;4523:16;4501:52;;;4574:6;4569:3;4565:16;4558:23;;4336:250;;;;;;4594:465;;4754:67;4818:2;4813:3;4754:67;;;4747:74;;4854:66;4850:1;4845:3;4841:11;4834:87;4955:66;4950:2;4945:3;4941:12;4934:88;5050:2;5045:3;5041:12;5034:19;;4740:319;;;;5068:465;;5228:67;5292:2;5287:3;5228:67;;;5221:74;;5328:66;5324:1;5319:3;5315:11;5308:87;5429:66;5424:2;5419:3;5415:12;5408:88;5524:2;5519:3;5515:12;5508:19;;5214:319;;;;5606:450;5735:4;5730:3;5726:14;5814:3;5807:5;5803:15;5797:22;5825:61;5881:3;5876;5872:13;5859:11;5825:61;;;5755:137;5961:4;5954:5;5950:16;5944:23;5973:62;6029:4;6024:3;6020:14;6007:11;5973:62;;;5902:139;5708:348;;;;6128:460;6267:4;6262:3;6258:14;6346:3;6339:5;6335:15;6329:22;6357:61;6413:3;6408;6404:13;6391:11;6357:61;;;6287:137;6493:4;6486:5;6482:16;6476:23;6505:62;6561:4;6556:3;6552:14;6539:11;6505:62;;;6434:139;6240:348;;;;6595:110;6668:31;6693:5;6668:31;;;6663:3;6656:44;6650:55;;;6712:120;6795:31;6820:5;6795:31;;;6790:3;6783:44;6777:55;;;6839:159;6940:52;6960:31;6985:5;6960:31;;;6940:52;;;6935:3;6928:65;6922:76;;;7005:405;;7179:95;7270:3;7261:6;7179:95;;;7172:102;;7285:75;7356:3;7347:6;7285:75;;;7382:2;7377:3;7373:12;7366:19;;7402:3;7395:10;;7160:250;;;;;;7417:201;;7529:2;7518:9;7514:18;7506:26;;7543:65;7605:1;7594:9;7590:17;7581:6;7543:65;;;7500:118;;;;;7625:407;;7816:2;7805:9;7801:18;7793:26;;7866:9;7860:4;7856:20;7852:1;7841:9;7837:17;7830:47;7891:131;8017:4;7891:131;;;7883:139;;7787:245;;;;8039:407;;8230:2;8219:9;8215:18;8207:26;;8280:9;8274:4;8270:20;8266:1;8255:9;8251:17;8244:47;8305:131;8431:4;8305:131;;;8297:139;;8201:245;;;;8453:1049;;8849:3;8838:9;8834:19;8826:27;;8864:117;8978:1;8967:9;8963:17;8954:6;8864:117;;;8992:118;9106:2;9095:9;9091:18;9082:6;8992:118;;;9121:119;9235:3;9224:9;9220:19;9211:6;9121:119;;;9251:73;9319:3;9308:9;9304:19;9295:6;9251:73;;;9335;9403:3;9392:9;9388:19;9379:6;9335:73;;;9419;9487:3;9476:9;9472:19;9463:6;9419:73;;;8820:682;;;;;;;;;;9509:213;;9627:2;9616:9;9612:18;9604:26;;9641:71;9709:1;9698:9;9694:17;9685:6;9641:71;;;9598:124;;;;;9729:493;;9959:3;9948:9;9944:19;9936:27;;9974:71;10042:1;10031:9;10027:17;10018:6;9974:71;;;10056:156;10208:2;10197:9;10193:18;10184:6;10056:156;;;9930:292;;;;;;10229:620;;10495:3;10484:9;10480:19;10472:27;;10510:71;10578:1;10567:9;10563:17;10554:6;10510:71;;;10592:118;10706:2;10695:9;10691:18;10682:6;10592:118;;;10721;10835:2;10824:9;10820:18;10811:6;10721:118;;;10466:383;;;;;;;10856:1028;;11270:3;11259:9;11255:19;11247:27;;11285:71;11353:1;11342:9;11338:17;11329:6;11285:71;;;11367:118;11481:2;11470:9;11466:18;11457:6;11367:118;;;11496;11610:2;11599:9;11595:18;11586:6;11496:118;;;11625:119;11739:3;11728:9;11724:19;11715:6;11625:119;;;11755;11869:3;11858:9;11854:19;11845:6;11755:119;;;11241:643;;;;;;;;;11891:1232;;12379:3;12368:9;12364:19;12356:27;;12394:71;12462:1;12451:9;12447:17;12438:6;12394:71;;;12476:118;12590:2;12579:9;12575:18;12566:6;12476:118;;;12605;12719:2;12708:9;12704:18;12695:6;12605:118;;;12734:119;12848:3;12837:9;12833:19;12824:6;12734:119;;;12864;12978:3;12967:9;12963:19;12954:6;12864:119;;;12994;13108:3;13097:9;13093:19;13084:6;12994:119;;;12350:773;;;;;;;;;;13130:256;;13192:2;13186:9;13176:19;;13230:4;13222:6;13218:17;13329:6;13317:10;13314:22;13293:18;13281:10;13278:34;13275:62;13272:2;;;13350:1;13347;13340:12;13272:2;13370:10;13366:2;13359:22;13170:216;;;;;13393:233;;13550:18;13542:6;13539:30;13536:2;;;13582:1;13579;13572:12;13536:2;13611:4;13603:6;13599:17;13591:25;;13473:153;;;;13633:258;;13776:18;13768:6;13765:30;13762:2;;;13808:1;13805;13798:12;13762:2;13852:4;13848:9;13841:4;13833:6;13829:17;13825:33;13817:41;;13881:4;13875;13871:15;13863:23;;13699:192;;;;13900:125;;14012:6;14001:17;;13993:32;;;;14034:113;;14139:3;14129:13;;14123:24;;;;14154:92;;14235:5;14229:12;14219:22;;14213:33;;;;14254:137;;14380:4;14372:6;14368:17;14357:28;;14350:41;;;;14400:161;;14552:3;14537:18;;14530:31;;;;;14570:163;;14685:6;14680:3;14673:19;14722:4;14717:3;14713:14;14698:29;;14666:67;;;;;14742:145;;14878:3;14863:18;;14856:31;;;;;14895:105;;14964:31;14989:5;14964:31;;;14953:42;;14947:53;;;;15007:92;;15087:5;15080:13;15073:21;15062:32;;15056:43;;;;15106:128;;15186:42;15179:5;15175:54;15164:65;;15158:76;;;;15241:79;;15310:5;15299:16;;15293:27;;;;15327:105;;15396:31;15421:5;15396:31;;;15385:42;;15379:53;;;;15439:79;;15508:5;15497:16;;15491:27;;;;15525:128;;15605:42;15598:5;15594:54;15583:65;;15577:76;;;;15660:79;;15729:5;15718:16;;15712:27;;;;15747:145;15828:6;15823:3;15818;15805:30;15884:1;15875:6;15870:3;15866:16;15859:27;15798:94;;;;15901:268;15966:1;15973:101;15987:6;15984:1;15981:13;15973:101;;;16063:1;16058:3;16054:11;16048:18;16044:1;16039:3;16035:11;16028:39;16009:2;16006:1;16002:10;15997:15;;15973:101;;;16089:6;16086:1;16083:13;16080:2;;;16154:1;16145:6;16140:3;16136:16;16129:27;16080:2;15950:219;;;;;16177:74;;16241:5;16230:16;;16224:27;;;", + "source": "pragma solidity 0.5.4;\npragma experimental ABIEncoderV2;\n\nimport \"./Utils.sol\";\n\ncontract BurnVerifier {\n using Utils for uint256;\n\n uint256 constant m = 32;\n uint256 constant n = 5;\n uint256 constant FIELD_ORDER = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n G1Point[m] gs;\n G1Point[m] hs;\n G1Point g;\n G1Point h;\n\n struct BurnStatement {\n G1Point CLn;\n G1Point CRn;\n G1Point y;\n uint256 bTransfer;\n uint256 epoch; // or uint8?\n address sender;\n G1Point u;\n }\n\n struct BurnProof {\n G1Point BA;\n G1Point BS;\n\n G1Point CLnPrime;\n G1Point CRnPrime;\n\n G1Point[2] tCommits;\n uint256 tHat;\n uint256 tauX;\n uint256 mu;\n\n uint256 c;\n uint256 s_sk;\n uint256 s_vDiff;\n uint256 s_nuDiff;\n\n InnerProductProof ipProof;\n }\n\n struct InnerProductProof {\n G1Point[n] ls;\n G1Point[n] rs;\n uint256 a;\n uint256 b;\n }\n\n constructor() public {\n g = mapInto(\"G\");\n h = mapInto(\"V\");\n for (uint256 i = 0; i < m; i++) {\n gs[i] = mapInto(\"G\", i);\n hs[i] = mapInto(\"H\", i);\n }\n } // will it be more expensive later on to sload these than to recompute them?\n\n function verifyBurn(bytes32[2] memory CLn, bytes32[2] memory CRn, bytes32[2] memory y, uint256 bTransfer, uint256 epoch, bytes32[2] memory u, address sender, bytes memory proof) view public returns (bool) {\n BurnStatement memory statement; // WARNING: if this is called directly in the console,\n // and your strings are less than 64 characters, they will be padded on the right, not the left. should hopefully not be an issue,\n // as this will typically be called simply by the other contract. still though, beware\n statement.CLn = G1Point(uint256(CLn[0]), uint256(CLn[1]));\n statement.CRn = G1Point(uint256(CRn[0]), uint256(CRn[1]));\n statement.y = G1Point(uint256(y[0]), uint256(y[1]));\n statement.bTransfer = bTransfer;\n statement.epoch = epoch;\n statement.u = G1Point(uint256(u[0]), uint256(u[1]));\n statement.sender = sender;\n BurnProof memory burnProof = unserialize(proof);\n return verify(statement, burnProof);\n }\n\n struct BurnAuxiliaries {\n uint256 y;\n uint256[m] ys;\n uint256 z;\n uint256[1] zs; // silly. just to match zether.\n uint256 zSum;\n uint256[m] twoTimesZSquared;\n uint256 x;\n uint256 t;\n uint256 k;\n G1Point tEval;\n }\n\n struct SigmaAuxiliaries {\n uint256 c;\n G1Point A_y;\n G1Point gEpoch;\n G1Point A_u;\n G1Point c_commit;\n G1Point A_t;\n G1Point A_CLn;\n G1Point A_CLnPrime;\n }\n\n struct IPAuxiliaries {\n G1Point u_x;\n G1Point[m] hPrimes;\n uint256[m] hExp;\n G1Point P;\n uint256 o;\n uint256[n] challenges;\n uint256[m] otherExponents;\n }\n\n function verify(BurnStatement memory statement, BurnProof memory proof) view internal returns (bool) {\n uint256 statementHash = uint256(keccak256(abi.encode(statement.CLn, statement.CRn, statement.y, statement.bTransfer, statement.epoch, statement.sender))).mod(); // stacktoodeep?\n\n BurnAuxiliaries memory burnAuxiliaries;\n burnAuxiliaries.y = uint256(keccak256(abi.encode(statementHash, proof.BA, proof.BS, proof.CLnPrime, proof.CRnPrime))).mod();\n burnAuxiliaries.ys = powers(burnAuxiliaries.y);\n burnAuxiliaries.z = uint256(keccak256(abi.encode(burnAuxiliaries.y))).mod();\n burnAuxiliaries.zs = [burnAuxiliaries.z.exp(2)];\n burnAuxiliaries.zSum = burnAuxiliaries.zs[0].mul(burnAuxiliaries.z); // trivial sum\n burnAuxiliaries.k = sumScalars(burnAuxiliaries.ys).mul(burnAuxiliaries.z.sub(burnAuxiliaries.zs[0])).sub(burnAuxiliaries.zSum.mul(2 ** m).sub(burnAuxiliaries.zSum));\n burnAuxiliaries.t = proof.tHat.sub(burnAuxiliaries.k);\n for (uint256 i = 0; i < m; i++) {\n burnAuxiliaries.twoTimesZSquared[i] = burnAuxiliaries.zs[0].mul(2 ** i);\n }\n\n burnAuxiliaries.x = uint256(keccak256(abi.encode(burnAuxiliaries.z, proof.tCommits))).mod();\n burnAuxiliaries.tEval = add(mul(proof.tCommits[0], burnAuxiliaries.x), mul(proof.tCommits[1], burnAuxiliaries.x.mul(burnAuxiliaries.x))); // replace with \"commit\"?\n\n SigmaAuxiliaries memory sigmaAuxiliaries;\n sigmaAuxiliaries.A_y = add(mul(g, proof.s_sk), mul(statement.y, proof.c.neg()));\n sigmaAuxiliaries.gEpoch = mapInto(\"Zether\", statement.epoch);\n sigmaAuxiliaries.A_u = add(mul(sigmaAuxiliaries.gEpoch, proof.s_sk), mul(statement.u, proof.c.neg()));\n sigmaAuxiliaries.c_commit = mul(add(mul(add(statement.CRn, proof.CRnPrime), proof.s_sk), mul(add(statement.CLn, proof.CLnPrime), proof.c.neg())), burnAuxiliaries.zs[0]);\n sigmaAuxiliaries.A_t = add(mul(add(add(mul(g, burnAuxiliaries.t), mul(h, proof.tauX)), neg(burnAuxiliaries.tEval)), proof.c), sigmaAuxiliaries.c_commit);\n sigmaAuxiliaries.A_CLn = add(mul(g, proof.s_vDiff), add(mul(statement.CRn, proof.s_sk), mul(statement.CLn, proof.c.neg())));\n sigmaAuxiliaries.A_CLnPrime = add(mul(h, proof.s_nuDiff), add(mul(proof.CRnPrime, proof.s_sk), mul(proof.CLnPrime, proof.c.neg())));\n\n sigmaAuxiliaries.c = uint256(keccak256(abi.encode(burnAuxiliaries.x, sigmaAuxiliaries.A_y, sigmaAuxiliaries.A_u, sigmaAuxiliaries.A_t, sigmaAuxiliaries.A_CLn, sigmaAuxiliaries.A_CLnPrime))).mod();\n require(sigmaAuxiliaries.c == proof.c, \"Sigma protocol challenge equality failure.\");\n\n IPAuxiliaries memory ipAuxiliaries;\n ipAuxiliaries.o = uint256(keccak256(abi.encode(sigmaAuxiliaries.c))).mod();\n ipAuxiliaries.u_x = mul(g, ipAuxiliaries.o);\n ipAuxiliaries.hPrimes = hadamardInv(hs, burnAuxiliaries.ys);\n ipAuxiliaries.hExp = addVectors(times(burnAuxiliaries.ys, burnAuxiliaries.z), burnAuxiliaries.twoTimesZSquared);\n ipAuxiliaries.P = add(add(add(proof.BA, mul(proof.BS, burnAuxiliaries.x)), mul(sumPoints(gs), burnAuxiliaries.z.neg())), commit(ipAuxiliaries.hPrimes, ipAuxiliaries.hExp));\n ipAuxiliaries.P = add(ipAuxiliaries.P, mul(h, proof.mu.neg()));\n ipAuxiliaries.P = add(ipAuxiliaries.P, mul(ipAuxiliaries.u_x, proof.tHat));\n\n // begin inner product verification\n InnerProductProof memory ipProof = proof.ipProof;\n for (uint256 i = 0; i < n; i++) {\n ipAuxiliaries.o = uint256(keccak256(abi.encode(ipAuxiliaries.o, ipProof.ls[i], ipProof.rs[i]))).mod();\n ipAuxiliaries.challenges[i] = ipAuxiliaries.o; // overwrites value\n uint256 xInv = ipAuxiliaries.o.inv();\n ipAuxiliaries.P = add(ipAuxiliaries.P, add(mul(ipProof.ls[i], ipAuxiliaries.o.exp(2)), mul(ipProof.rs[i], xInv.exp(2))));\n }\n\n ipAuxiliaries.otherExponents[0] = 1;\n for (uint256 i = 0; i < n; i++) {\n ipAuxiliaries.otherExponents[0] = ipAuxiliaries.otherExponents[0].mul(ipAuxiliaries.challenges[i]);\n }\n bool[m] memory bitSet;\n ipAuxiliaries.otherExponents[0] = ipAuxiliaries.otherExponents[0].inv();\n for (uint256 i = 0; i < m/2; ++i) {\n for (uint256 j = 0; (1 << j) + i < m; ++j) {\n uint256 i1 = i + (1 << j);\n if (!bitSet[i1]) {\n uint256 temp = ipAuxiliaries.challenges[n - 1 - j].mul(ipAuxiliaries.challenges[n - 1 - j]);\n ipAuxiliaries.otherExponents[i1] = ipAuxiliaries.otherExponents[i].mul(temp);\n bitSet[i1] = true;\n }\n }\n }\n\n G1Point memory gTemp;\n G1Point memory hTemp;\n for (uint256 i = 0; i < m; i++) {\n gTemp = add(gTemp, mul(gs[i], ipAuxiliaries.otherExponents[i]));\n hTemp = add(hTemp, mul(ipAuxiliaries.hPrimes[i], ipAuxiliaries.otherExponents[m - 1 - i]));\n }\n G1Point memory cProof = add(add(mul(gTemp, ipProof.a), mul(hTemp, ipProof.b)), mul(ipAuxiliaries.u_x, ipProof.a.mul(ipProof.b)));\n require(eq(ipAuxiliaries.P, cProof), \"Inner product equality check failure.\");\n\n return true;\n }\n\n function multiExpGs(uint256[m] memory ss) internal view returns (G1Point memory result) {\n for (uint256 i = 0; i < m; i++) {\n result = add(result, mul(gs[i], ss[i]));\n }\n }\n\n function multiExpHsInversed(uint256[m] memory ss, G1Point[m] memory hs) internal view returns (G1Point memory result) {\n for (uint256 i = 0; i < m; i++) {\n result = add(result, mul(hs[i], ss[m - 1 - i]));\n }\n }\n\n function unserialize(bytes memory arr) internal pure returns (BurnProof memory proof) {\n proof.BA = G1Point(slice(arr, 0), slice(arr, 32));\n proof.BS = G1Point(slice(arr, 64), slice(arr, 96));\n\n proof.CLnPrime = G1Point(slice(arr, 128), slice(arr, 160));\n proof.CRnPrime = G1Point(slice(arr, 192), slice(arr, 224));\n\n proof.tCommits = [G1Point(slice(arr, 256), slice(arr, 288)), G1Point(slice(arr, 320), slice(arr, 352))];\n proof.tHat = slice(arr, 384);\n proof.tauX = slice(arr, 416);\n proof.mu = slice(arr, 448);\n\n proof.c = slice(arr, 480);\n proof.s_sk = slice(arr, 512);\n proof.s_vDiff = slice(arr, 544);\n proof.s_nuDiff = slice(arr, 576);\n\n InnerProductProof memory ipProof;\n for (uint256 i = 0; i < n; i++) {\n ipProof.ls[i] = G1Point(slice(arr, 608 + i * 64), slice(arr, 640 + i * 64));\n ipProof.rs[i] = G1Point(slice(arr, 608 + (n + i) * 64), slice(arr, 640 + (n + i) * 64));\n }\n ipProof.a = slice(arr, 608 + n * 128);\n ipProof.b = slice(arr, 640 + n * 128);\n proof.ipProof = ipProof;\n\n return proof;\n }\n\n function addVectors(uint256[m] memory a, uint256[m] memory b) internal pure returns (uint256[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = a[i].add(b[i]);\n }\n }\n\n function hadamardInv(G1Point[m] memory ps, uint256[m] memory ss) internal view returns (G1Point[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = mul(ps[i], ss[i].inv());\n }\n }\n\n function sumScalars(uint256[m] memory ys) internal pure returns (uint256 result) {\n for (uint256 i = 0; i < m; i++) {\n result = result.add(ys[i]);\n }\n }\n\n function sumPoints(G1Point[m] memory ps) internal view returns (G1Point memory sum) {\n for (uint256 i = 0; i < m; i++) {\n sum = add(sum, ps[i]);\n }\n }\n\n function commit(G1Point[m] memory ps, uint256[m] memory ss) internal view returns (G1Point memory result) {\n for (uint256 i = 0; i < m; i++) {\n result = add(result, mul(ps[i], ss[i]));\n }\n }\n\n function powers(uint256 base) internal pure returns (uint256[m] memory powers) {\n powers[0] = 1;\n powers[1] = base;\n for (uint256 i = 2; i < m; i++) {\n powers[i] = powers[i - 1].mul(base);\n }\n }\n\n function times(uint256[m] memory v, uint256 x) internal pure returns (uint256[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = v[i].mul(x);\n }\n }\n\n function slice(bytes memory input, uint256 start) internal pure returns (uint256 result) { // extracts exactly 32 bytes\n assembly {\n let m := mload(0x40)\n mstore(m, mload(add(add(input, 0x20), start))) // why only 0x20?\n result := mload(m)\n }\n }\n\n struct G1Point {\n uint256 x;\n uint256 y;\n }\n\n function add(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {\n assembly {\n let m := mload(0x40)\n mstore(m, mload(p1))\n mstore(add(m, 0x20), mload(add(p1, 0x20)))\n mstore(add(m, 0x40), mload(p2))\n mstore(add(m, 0x60), mload(add(p2, 0x20)))\n if iszero(staticcall(gas, 0x06, m, 0x80, r, 0x40)) {\n revert(0, 0)\n }\n }\n }\n\n function mul(G1Point memory p, uint256 s) internal view returns (G1Point memory r) {\n assembly {\n let m := mload(0x40)\n mstore(m, mload(p))\n mstore(add(m, 0x20), mload(add(p, 0x20)))\n mstore(add(m, 0x40), s)\n if iszero(staticcall(gas, 0x07, m, 0x60, r, 0x40)) {\n revert(0, 0)\n }\n }\n }\n\n function neg(G1Point memory p) internal pure returns (G1Point memory) {\n return G1Point(p.x, FIELD_ORDER - (p.y % FIELD_ORDER)); // p.y should already be reduced mod P?\n }\n\n function eq(G1Point memory p1, G1Point memory p2) internal pure returns (bool) {\n return p1.x == p2.x && p1.y == p2.y;\n }\n\n function fieldExp(uint256 base, uint256 exponent) internal view returns (uint256 output) { // warning: mod p, not q\n uint256 order = FIELD_ORDER;\n assembly {\n let m := mload(0x40)\n mstore(m, 0x20)\n mstore(add(m, 0x20), 0x20)\n mstore(add(m, 0x40), 0x20)\n mstore(add(m, 0x60), base)\n mstore(add(m, 0x80), exponent)\n mstore(add(m, 0xa0), order)\n if iszero(staticcall(gas, 0x05, m, 0xc0, m, 0x20)) { // staticcall or call?\n revert(0, 0)\n }\n output := mload(m)\n }\n }\n\n function mapInto(uint256 seed) internal view returns (G1Point memory) {\n uint256 y;\n while (true) {\n uint256 ySquared = fieldExp(seed, 3) + 3; // addmod instead of add: waste of gas, plus function overhead cost\n y = fieldExp(ySquared, (FIELD_ORDER + 1) / 4);\n if (fieldExp(y, 2) == ySquared) {\n break;\n }\n seed += 1;\n }\n return G1Point(seed, y);\n }\n\n function mapInto(string memory input) internal view returns (G1Point memory) {\n return mapInto(uint256(keccak256(abi.encodePacked(input))) % FIELD_ORDER);\n }\n\n function mapInto(string memory input, uint256 i) internal view returns (G1Point memory) {\n return mapInto(uint256(keccak256(abi.encodePacked(input, i))) % FIELD_ORDER);\n }\n}\n", "sourcePath": "/Users/benediamond/anonymous-zether/packages/protocol/contracts/BurnVerifier.sol", "compiler": { "name": "solc", @@ -68,7 +68,7 @@ }, "networks": {}, "schemaVersion": "3.0.19", - "updatedAt": "2019-11-26T01:17:49.330Z", + "updatedAt": "2019-12-26T18:28:14.437Z", "devdoc": { "methods": {} }, diff --git a/packages/contract-artifacts/artifacts/CashToken.json b/packages/contract-artifacts/artifacts/CashToken.json index 02dfec19..f09fff46 100644 --- a/packages/contract-artifacts/artifacts/CashToken.json +++ b/packages/contract-artifacts/artifacts/CashToken.json @@ -333,7 +333,7 @@ "id": 2013, "nodeType": "ImportDirective", "scope": 2017, - "sourceUnit": 8322, + "sourceUnit": 8243, "src": "0:71:1", "symbolAliases": [], "unitAlias": "" @@ -347,10 +347,10 @@ "id": 2014, "name": "ERC20Mintable", "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 8321, + "referencedDeclaration": 8242, "src": "95:13:1", "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Mintable_$8321", + "typeIdentifier": "t_contract$_ERC20Mintable_$8242", "typeString": "contract ERC20Mintable" } }, @@ -360,11 +360,11 @@ } ], "contractDependencies": [ - 7513, - 7701, - 8293, - 8321, - 8390 + 7434, + 7622, + 8214, + 8242, + 8311 ], "contractKind": "contract", "documentation": null, @@ -372,11 +372,11 @@ "id": 2016, "linearizedBaseContracts": [ 2016, - 8321, - 7701, - 8293, - 8390, - 7513 + 8242, + 7622, + 8214, + 8311, + 7434 ], "name": "CashToken", "nodeType": "ContractDefinition", @@ -403,7 +403,7 @@ "id": 2013, "nodeType": "ImportDirective", "scope": 2017, - "sourceUnit": 8322, + "sourceUnit": 8243, "src": "0:71:1", "symbolAliases": [], "unitAlias": "" @@ -417,10 +417,10 @@ "id": 2014, "name": "ERC20Mintable", "nodeType": "UserDefinedTypeName", - "referencedDeclaration": 8321, + "referencedDeclaration": 8242, "src": "95:13:1", "typeDescriptions": { - "typeIdentifier": "t_contract$_ERC20Mintable_$8321", + "typeIdentifier": "t_contract$_ERC20Mintable_$8242", "typeString": "contract ERC20Mintable" } }, @@ -430,11 +430,11 @@ } ], "contractDependencies": [ - 7513, - 7701, - 8293, - 8321, - 8390 + 7434, + 7622, + 8214, + 8242, + 8311 ], "contractKind": "contract", "documentation": null, @@ -442,11 +442,11 @@ "id": 2016, "linearizedBaseContracts": [ 2016, - 8321, - 7701, - 8293, - 8390, - 7513 + 8242, + 7622, + 8214, + 8311, + 7434 ], "name": "CashToken", "nodeType": "ContractDefinition", @@ -463,7 +463,7 @@ }, "networks": {}, "schemaVersion": "3.0.19", - "updatedAt": "2019-11-26T01:17:49.346Z", + "updatedAt": "2019-12-26T18:28:14.455Z", "devdoc": { "methods": { "allowance(address,address)": { diff --git a/packages/contract-artifacts/artifacts/Migrations.json b/packages/contract-artifacts/artifacts/Migrations.json index 409d3f9d..a056fb06 100644 --- a/packages/contract-artifacts/artifacts/Migrations.json +++ b/packages/contract-artifacts/artifacts/Migrations.json @@ -198,7 +198,7 @@ "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 8405, + "referencedDeclaration": 8326, "src": "158:3:2", "typeDescriptions": { "typeIdentifier": "t_magic_message", @@ -282,7 +282,7 @@ "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 8405, + "referencedDeclaration": 8326, "src": "209:3:2", "typeDescriptions": { "typeIdentifier": "t_magic_message", @@ -847,7 +847,7 @@ "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 8405, + "referencedDeclaration": 8326, "src": "158:3:2", "typeDescriptions": { "typeIdentifier": "t_magic_message", @@ -931,7 +931,7 @@ "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], - "referencedDeclaration": 8405, + "referencedDeclaration": 8326, "src": "209:3:2", "typeDescriptions": { "typeIdentifier": "t_magic_message", @@ -1375,7 +1375,7 @@ }, "networks": {}, "schemaVersion": "3.0.19", - "updatedAt": "2019-11-26T01:17:49.347Z", + "updatedAt": "2019-12-26T18:28:14.455Z", "devdoc": { "methods": {} }, diff --git a/packages/contract-artifacts/artifacts/Utils.json b/packages/contract-artifacts/artifacts/Utils.json index 2ebcc49b..9ca57d15 100644 --- a/packages/contract-artifacts/artifacts/Utils.json +++ b/packages/contract-artifacts/artifacts/Utils.json @@ -8,3047 +8,13 @@ "deployedSourceMap": "58:1579:3:-;;;;;;;;", "source": "pragma solidity 0.5.4;\npragma experimental ABIEncoderV2;\n\nlibrary Utils {\n\n uint256 constant GROUP_ORDER = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n uint256 constant UNITY = 9334303377689037989442018753807510978357674015322511348041267794643984346845; // primitive 2^28th root of unity modulo GROUP_ORDER (not field!)\n\n function add(uint256 x, uint256 y) internal pure returns (uint256) {\n return addmod(x, y, GROUP_ORDER);\n }\n\n function mul(uint256 x, uint256 y) internal pure returns (uint256) {\n return mulmod(x, y, GROUP_ORDER);\n }\n\n function inv(uint256 x) internal view returns (uint256) {\n return exp(x, GROUP_ORDER - 2);\n }\n\n function mod(uint256 x) internal pure returns (uint256) {\n return x % GROUP_ORDER;\n }\n\n function sub(uint256 x, uint256 y) internal pure returns (uint256) {\n return x >= y ? x - y : GROUP_ORDER - y + x;\n }\n\n function neg(uint256 x) internal pure returns (uint256) {\n return GROUP_ORDER - x;\n }\n\n function exp(uint256 base, uint256 exponent) internal view returns (uint256 output) {\n uint256 order = GROUP_ORDER;\n assembly {\n let m := mload(0x40)\n mstore(m, 0x20)\n mstore(add(m, 0x20), 0x20)\n mstore(add(m, 0x40), 0x20)\n mstore(add(m, 0x60), base)\n mstore(add(m, 0x80), exponent)\n mstore(add(m, 0xa0), order)\n if iszero(staticcall(gas, 0x05, m, 0xc0, m, 0x20)) { // staticcall or call?\n revert(0, 0)\n }\n output := mload(m)\n }\n }\n}\n", "sourcePath": "/Users/benediamond/anonymous-zether/packages/protocol/contracts/Utils.sol", - "ast": { - "absolutePath": "/Users/benediamond/anonymous-zether/packages/protocol/contracts/Utils.sol", - "exportedSymbols": { - "Utils": [ - 2192 - ] - }, - "id": 2193, - "nodeType": "SourceUnit", - "nodes": [ - { - "id": 2075, - "literals": [ - "solidity", - "0.5", - ".4" - ], - "nodeType": "PragmaDirective", - "src": "0:22:3" - }, - { - "id": 2076, - "literals": [ - "experimental", - "ABIEncoderV2" - ], - "nodeType": "PragmaDirective", - "src": "23:33:3" - }, - { - "baseContracts": [], - "contractDependencies": [], - "contractKind": "library", - "documentation": null, - "fullyImplemented": true, - "id": 2192, - "linearizedBaseContracts": [ - 2192 - ], - "name": "Utils", - "nodeType": "ContractDefinition", - "nodes": [ - { - "constant": true, - "id": 2079, - "name": "GROUP_ORDER", - "nodeType": "VariableDeclaration", - "scope": 2192, - "src": "79:108:3", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2077, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "79:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "3231383838323432383731383339323735323232323436343035373435323537323735303838353438333634343030343136303334333433363938323034313836353735383038343935363137", - "id": 2078, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "110:77:3", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_21888242871839275222246405745257275088548364400416034343698204186575808495617_by_1", - "typeString": "int_const 2188...(69 digits omitted)...5617" - }, - "value": "21888242871839275222246405745257275088548364400416034343698204186575808495617" - }, - "visibility": "internal" - }, - { - "constant": true, - "id": 2082, - "name": "UNITY", - "nodeType": "VariableDeclaration", - "scope": 2192, - "src": "193:101:3", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2080, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "193:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "39333334333033333737363839303337393839343432303138373533383037353130393738333537363734303135333232353131333438303431323637373934363433393834333436383435", - "id": 2081, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "218:76:3", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_9334303377689037989442018753807510978357674015322511348041267794643984346845_by_1", - "typeString": "int_const 9334...(68 digits omitted)...6845" - }, - "value": "9334303377689037989442018753807510978357674015322511348041267794643984346845" - }, - "visibility": "internal" - }, - { - "body": { - "id": 2097, - "nodeType": "Block", - "src": "434:49:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2092, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2084, - "src": "458:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 2093, - "name": "y", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2086, - "src": "461:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 2094, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "464:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 2091, - "name": "addmod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 8393, - "src": "451:6:3", - "typeDescriptions": { - "typeIdentifier": "t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", - "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" - } - }, - "id": 2095, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "451:25:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2090, - "id": 2096, - "nodeType": "Return", - "src": "444:32:3" - } - ] - }, - "documentation": null, - "id": 2098, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "add", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2087, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2084, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2098, - "src": "380:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2083, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "380:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2086, - "name": "y", - "nodeType": "VariableDeclaration", - "scope": 2098, - "src": "391:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2085, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "391:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "379:22:3" - }, - "returnParameters": { - "id": 2090, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2089, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2098, - "src": "425:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2088, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "425:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "424:9:3" - }, - "scope": 2192, - "src": "367:116:3", - "stateMutability": "pure", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2113, - "nodeType": "Block", - "src": "556:49:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2108, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2100, - "src": "580:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 2109, - "name": "y", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2102, - "src": "583:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 2110, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "586:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 2107, - "name": "mulmod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 8406, - "src": "573:6:3", - "typeDescriptions": { - "typeIdentifier": "t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", - "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" - } - }, - "id": 2111, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "573:25:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2106, - "id": 2112, - "nodeType": "Return", - "src": "566:32:3" - } - ] - }, - "documentation": null, - "id": 2114, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "mul", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2103, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2100, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2114, - "src": "502:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2099, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "502:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2102, - "name": "y", - "nodeType": "VariableDeclaration", - "scope": 2114, - "src": "513:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2101, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "513:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "501:22:3" - }, - "returnParameters": { - "id": 2106, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2105, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2114, - "src": "547:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2104, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "547:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "546:9:3" - }, - "scope": 2192, - "src": "489:116:3", - "stateMutability": "pure", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2128, - "nodeType": "Block", - "src": "667:47:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2122, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2116, - "src": "688:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2125, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2123, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "691:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "-", - "rightExpression": { - "argumentTypes": null, - "hexValue": "32", - "id": 2124, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "705:1:3", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_2_by_1", - "typeString": "int_const 2" - }, - "value": "2" - }, - "src": "691:15:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 2121, - "name": "exp", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2191, - "src": "684:3:3", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_uint256_$_t_uint256_$returns$_t_uint256_$", - "typeString": "function (uint256,uint256) view returns (uint256)" - } - }, - "id": 2126, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "684:23:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2120, - "id": 2127, - "nodeType": "Return", - "src": "677:30:3" - } - ] - }, - "documentation": null, - "id": 2129, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "inv", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2117, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2116, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2129, - "src": "624:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2115, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "624:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "623:11:3" - }, - "returnParameters": { - "id": 2120, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2119, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2129, - "src": "658:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2118, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "658:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "657:9:3" - }, - "scope": 2192, - "src": "611:103:3", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2140, - "nodeType": "Block", - "src": "776:39:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2138, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2136, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2131, - "src": "793:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "%", - "rightExpression": { - "argumentTypes": null, - "id": 2137, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "797:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "793:15:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2135, - "id": 2139, - "nodeType": "Return", - "src": "786:22:3" - } - ] - }, - "documentation": null, - "id": 2141, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "mod", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2132, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2131, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2141, - "src": "733:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2130, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "733:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "732:11:3" - }, - "returnParameters": { - "id": 2135, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2134, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2141, - "src": "767:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2133, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "767:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "766:9:3" - }, - "scope": 2192, - "src": "720:95:3", - "stateMutability": "pure", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2163, - "nodeType": "Block", - "src": "888:60:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2152, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2150, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2143, - "src": "905:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "id": 2151, - "name": "y", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2145, - "src": "910:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "905:6:3", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2160, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2158, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2156, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "922:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "-", - "rightExpression": { - "argumentTypes": null, - "id": 2157, - "name": "y", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2145, - "src": "936:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "922:15:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "id": 2159, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2143, - "src": "940:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "922:19:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 2161, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "Conditional", - "src": "905:36:3", - "trueExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2155, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2153, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2143, - "src": "914:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "-", - "rightExpression": { - "argumentTypes": null, - "id": 2154, - "name": "y", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2145, - "src": "918:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "914:5:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2149, - "id": 2162, - "nodeType": "Return", - "src": "898:43:3" - } - ] - }, - "documentation": null, - "id": 2164, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "sub", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2146, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2143, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2164, - "src": "834:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2142, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "834:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2145, - "name": "y", - "nodeType": "VariableDeclaration", - "scope": 2164, - "src": "845:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2144, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "845:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "833:22:3" - }, - "returnParameters": { - "id": 2149, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2148, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2164, - "src": "879:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2147, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "879:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "878:9:3" - }, - "scope": 2192, - "src": "821:127:3", - "stateMutability": "pure", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2175, - "nodeType": "Block", - "src": "1010:39:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2173, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2171, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "1027:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "-", - "rightExpression": { - "argumentTypes": null, - "id": 2172, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2166, - "src": "1041:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "1027:15:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2170, - "id": 2174, - "nodeType": "Return", - "src": "1020:22:3" - } - ] - }, - "documentation": null, - "id": 2176, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "neg", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2167, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2166, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2176, - "src": "967:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2165, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "967:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "966:11:3" - }, - "returnParameters": { - "id": 2170, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2169, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2176, - "src": "1001:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2168, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1001:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1000:9:3" - }, - "scope": 2192, - "src": "954:95:3", - "stateMutability": "pure", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2190, - "nodeType": "Block", - "src": "1139:496:3", - "statements": [ - { - "assignments": [ - 2186 - ], - "declarations": [ - { - "constant": false, - "id": 2186, - "name": "order", - "nodeType": "VariableDeclaration", - "scope": 2190, - "src": "1149:13:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2185, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1149:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 2188, - "initialValue": { - "argumentTypes": null, - "id": 2187, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "1165:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "1149:27:3" - }, - { - "externalReferences": [ - { - "base": { - "declaration": 2178, - "isOffset": false, - "isSlot": false, - "src": "1369:4:3", - "valueSize": 1 - } - }, - { - "output": { - "declaration": 2183, - "isOffset": false, - "isSlot": false, - "src": "1601:6:3", - "valueSize": 1 - } - }, - { - "exponent": { - "declaration": 2180, - "isOffset": false, - "isSlot": false, - "src": "1408:8:3", - "valueSize": 1 - } - }, - { - "order": { - "declaration": 2186, - "isOffset": false, - "isSlot": false, - "src": "1451:5:3", - "valueSize": 1 - } - } - ], - "id": 2189, - "nodeType": "InlineAssembly", - "operations": "{\n let m := mload(0x40)\n mstore(m, 0x20)\n mstore(add(m, 0x20), 0x20)\n mstore(add(m, 0x40), 0x20)\n mstore(add(m, 0x60), base)\n mstore(add(m, 0x80), exponent)\n mstore(add(m, 0xa0), order)\n if iszero(staticcall(gas(), 0x05, m, 0xc0, m, 0x20))\n {\n revert(0, 0)\n }\n output := mload(m)\n}", - "src": "1186:449:3" - } - ] - }, - "documentation": null, - "id": 2191, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "exp", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2181, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2178, - "name": "base", - "nodeType": "VariableDeclaration", - "scope": 2191, - "src": "1068:12:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2177, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1068:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2180, - "name": "exponent", - "nodeType": "VariableDeclaration", - "scope": 2191, - "src": "1082:16:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2179, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1082:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1067:32:3" - }, - "returnParameters": { - "id": 2184, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2183, - "name": "output", - "nodeType": "VariableDeclaration", - "scope": 2191, - "src": "1123:14:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2182, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1123:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1122:16:3" - }, - "scope": 2192, - "src": "1055:580:3", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - } - ], - "scope": 2193, - "src": "58:1579:3" - } - ], - "src": "0:1638:3" - }, - "legacyAST": { - "absolutePath": "/Users/benediamond/anonymous-zether/packages/protocol/contracts/Utils.sol", - "exportedSymbols": { - "Utils": [ - 2192 - ] - }, - "id": 2193, - "nodeType": "SourceUnit", - "nodes": [ - { - "id": 2075, - "literals": [ - "solidity", - "0.5", - ".4" - ], - "nodeType": "PragmaDirective", - "src": "0:22:3" - }, - { - "id": 2076, - "literals": [ - "experimental", - "ABIEncoderV2" - ], - "nodeType": "PragmaDirective", - "src": "23:33:3" - }, - { - "baseContracts": [], - "contractDependencies": [], - "contractKind": "library", - "documentation": null, - "fullyImplemented": true, - "id": 2192, - "linearizedBaseContracts": [ - 2192 - ], - "name": "Utils", - "nodeType": "ContractDefinition", - "nodes": [ - { - "constant": true, - "id": 2079, - "name": "GROUP_ORDER", - "nodeType": "VariableDeclaration", - "scope": 2192, - "src": "79:108:3", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2077, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "79:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "3231383838323432383731383339323735323232323436343035373435323537323735303838353438333634343030343136303334333433363938323034313836353735383038343935363137", - "id": 2078, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "110:77:3", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_21888242871839275222246405745257275088548364400416034343698204186575808495617_by_1", - "typeString": "int_const 2188...(69 digits omitted)...5617" - }, - "value": "21888242871839275222246405745257275088548364400416034343698204186575808495617" - }, - "visibility": "internal" - }, - { - "constant": true, - "id": 2082, - "name": "UNITY", - "nodeType": "VariableDeclaration", - "scope": 2192, - "src": "193:101:3", - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2080, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "193:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "argumentTypes": null, - "hexValue": "39333334333033333737363839303337393839343432303138373533383037353130393738333537363734303135333232353131333438303431323637373934363433393834333436383435", - "id": 2081, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "218:76:3", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_9334303377689037989442018753807510978357674015322511348041267794643984346845_by_1", - "typeString": "int_const 9334...(68 digits omitted)...6845" - }, - "value": "9334303377689037989442018753807510978357674015322511348041267794643984346845" - }, - "visibility": "internal" - }, - { - "body": { - "id": 2097, - "nodeType": "Block", - "src": "434:49:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2092, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2084, - "src": "458:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 2093, - "name": "y", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2086, - "src": "461:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 2094, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "464:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 2091, - "name": "addmod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 8393, - "src": "451:6:3", - "typeDescriptions": { - "typeIdentifier": "t_function_addmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", - "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" - } - }, - "id": 2095, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "451:25:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2090, - "id": 2096, - "nodeType": "Return", - "src": "444:32:3" - } - ] - }, - "documentation": null, - "id": 2098, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "add", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2087, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2084, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2098, - "src": "380:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2083, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "380:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2086, - "name": "y", - "nodeType": "VariableDeclaration", - "scope": 2098, - "src": "391:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2085, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "391:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "379:22:3" - }, - "returnParameters": { - "id": 2090, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2089, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2098, - "src": "425:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2088, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "425:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "424:9:3" - }, - "scope": 2192, - "src": "367:116:3", - "stateMutability": "pure", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2113, - "nodeType": "Block", - "src": "556:49:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2108, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2100, - "src": "580:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 2109, - "name": "y", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2102, - "src": "583:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "id": 2110, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "586:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 2107, - "name": "mulmod", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 8406, - "src": "573:6:3", - "typeDescriptions": { - "typeIdentifier": "t_function_mulmod_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$", - "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" - } - }, - "id": 2111, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "573:25:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2106, - "id": 2112, - "nodeType": "Return", - "src": "566:32:3" - } - ] - }, - "documentation": null, - "id": 2114, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "mul", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2103, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2100, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2114, - "src": "502:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2099, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "502:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2102, - "name": "y", - "nodeType": "VariableDeclaration", - "scope": 2114, - "src": "513:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2101, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "513:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "501:22:3" - }, - "returnParameters": { - "id": 2106, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2105, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2114, - "src": "547:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2104, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "547:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "546:9:3" - }, - "scope": 2192, - "src": "489:116:3", - "stateMutability": "pure", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2128, - "nodeType": "Block", - "src": "667:47:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "arguments": [ - { - "argumentTypes": null, - "id": 2122, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2116, - "src": "688:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2125, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2123, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "691:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "-", - "rightExpression": { - "argumentTypes": null, - "hexValue": "32", - "id": 2124, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "705:1:3", - "subdenomination": null, - "typeDescriptions": { - "typeIdentifier": "t_rational_2_by_1", - "typeString": "int_const 2" - }, - "value": "2" - }, - "src": "691:15:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 2121, - "name": "exp", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2191, - "src": "684:3:3", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_uint256_$_t_uint256_$returns$_t_uint256_$", - "typeString": "function (uint256,uint256) view returns (uint256)" - } - }, - "id": 2126, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "684:23:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2120, - "id": 2127, - "nodeType": "Return", - "src": "677:30:3" - } - ] - }, - "documentation": null, - "id": 2129, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "inv", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2117, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2116, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2129, - "src": "624:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2115, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "624:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "623:11:3" - }, - "returnParameters": { - "id": 2120, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2119, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2129, - "src": "658:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2118, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "658:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "657:9:3" - }, - "scope": 2192, - "src": "611:103:3", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2140, - "nodeType": "Block", - "src": "776:39:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2138, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2136, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2131, - "src": "793:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "%", - "rightExpression": { - "argumentTypes": null, - "id": 2137, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "797:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "793:15:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2135, - "id": 2139, - "nodeType": "Return", - "src": "786:22:3" - } - ] - }, - "documentation": null, - "id": 2141, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "mod", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2132, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2131, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2141, - "src": "733:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2130, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "733:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "732:11:3" - }, - "returnParameters": { - "id": 2135, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2134, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2141, - "src": "767:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2133, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "767:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "766:9:3" - }, - "scope": 2192, - "src": "720:95:3", - "stateMutability": "pure", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2163, - "nodeType": "Block", - "src": "888:60:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "condition": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2152, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2150, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2143, - "src": "905:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "argumentTypes": null, - "id": 2151, - "name": "y", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2145, - "src": "910:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "905:6:3", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "falseExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2160, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2158, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2156, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "922:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "-", - "rightExpression": { - "argumentTypes": null, - "id": 2157, - "name": "y", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2145, - "src": "936:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "922:15:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "argumentTypes": null, - "id": 2159, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2143, - "src": "940:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "922:19:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "id": 2161, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "nodeType": "Conditional", - "src": "905:36:3", - "trueExpression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2155, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2153, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2143, - "src": "914:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "-", - "rightExpression": { - "argumentTypes": null, - "id": 2154, - "name": "y", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2145, - "src": "918:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "914:5:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2149, - "id": 2162, - "nodeType": "Return", - "src": "898:43:3" - } - ] - }, - "documentation": null, - "id": 2164, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "sub", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2146, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2143, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2164, - "src": "834:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2142, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "834:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2145, - "name": "y", - "nodeType": "VariableDeclaration", - "scope": 2164, - "src": "845:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2144, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "845:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "833:22:3" - }, - "returnParameters": { - "id": 2149, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2148, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2164, - "src": "879:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2147, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "879:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "878:9:3" - }, - "scope": 2192, - "src": "821:127:3", - "stateMutability": "pure", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2175, - "nodeType": "Block", - "src": "1010:39:3", - "statements": [ - { - "expression": { - "argumentTypes": null, - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 2173, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "argumentTypes": null, - "id": 2171, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "1027:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "-", - "rightExpression": { - "argumentTypes": null, - "id": 2172, - "name": "x", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2166, - "src": "1041:1:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "1027:15:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "functionReturnParameters": 2170, - "id": 2174, - "nodeType": "Return", - "src": "1020:22:3" - } - ] - }, - "documentation": null, - "id": 2176, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "neg", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2167, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2166, - "name": "x", - "nodeType": "VariableDeclaration", - "scope": 2176, - "src": "967:9:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2165, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "967:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "966:11:3" - }, - "returnParameters": { - "id": 2170, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2169, - "name": "", - "nodeType": "VariableDeclaration", - "scope": 2176, - "src": "1001:7:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2168, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1001:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1000:9:3" - }, - "scope": 2192, - "src": "954:95:3", - "stateMutability": "pure", - "superFunction": null, - "visibility": "internal" - }, - { - "body": { - "id": 2190, - "nodeType": "Block", - "src": "1139:496:3", - "statements": [ - { - "assignments": [ - 2186 - ], - "declarations": [ - { - "constant": false, - "id": 2186, - "name": "order", - "nodeType": "VariableDeclaration", - "scope": 2190, - "src": "1149:13:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2185, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1149:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "id": 2188, - "initialValue": { - "argumentTypes": null, - "id": 2187, - "name": "GROUP_ORDER", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 2079, - "src": "1165:11:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "1149:27:3" - }, - { - "externalReferences": [ - { - "base": { - "declaration": 2178, - "isOffset": false, - "isSlot": false, - "src": "1369:4:3", - "valueSize": 1 - } - }, - { - "output": { - "declaration": 2183, - "isOffset": false, - "isSlot": false, - "src": "1601:6:3", - "valueSize": 1 - } - }, - { - "exponent": { - "declaration": 2180, - "isOffset": false, - "isSlot": false, - "src": "1408:8:3", - "valueSize": 1 - } - }, - { - "order": { - "declaration": 2186, - "isOffset": false, - "isSlot": false, - "src": "1451:5:3", - "valueSize": 1 - } - } - ], - "id": 2189, - "nodeType": "InlineAssembly", - "operations": "{\n let m := mload(0x40)\n mstore(m, 0x20)\n mstore(add(m, 0x20), 0x20)\n mstore(add(m, 0x40), 0x20)\n mstore(add(m, 0x60), base)\n mstore(add(m, 0x80), exponent)\n mstore(add(m, 0xa0), order)\n if iszero(staticcall(gas(), 0x05, m, 0xc0, m, 0x20))\n {\n revert(0, 0)\n }\n output := mload(m)\n}", - "src": "1186:449:3" - } - ] - }, - "documentation": null, - "id": 2191, - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "exp", - "nodeType": "FunctionDefinition", - "parameters": { - "id": 2181, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2178, - "name": "base", - "nodeType": "VariableDeclaration", - "scope": 2191, - "src": "1068:12:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2177, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1068:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - }, - { - "constant": false, - "id": 2180, - "name": "exponent", - "nodeType": "VariableDeclaration", - "scope": 2191, - "src": "1082:16:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2179, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1082:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1067:32:3" - }, - "returnParameters": { - "id": 2184, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 2183, - "name": "output", - "nodeType": "VariableDeclaration", - "scope": 2191, - "src": "1123:14:3", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 2182, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1123:7:3", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": null, - "visibility": "internal" - } - ], - "src": "1122:16:3" - }, - "scope": 2192, - "src": "1055:580:3", - "stateMutability": "view", - "superFunction": null, - "visibility": "internal" - } - ], - "scope": 2193, - "src": "58:1579:3" - } - ], - "src": "0:1638:3" - }, "compiler": { "name": "solc", "version": "0.5.4+commit.9549d8ff.Emscripten.clang" }, "networks": {}, "schemaVersion": "3.0.19", - "updatedAt": "2019-11-26T01:17:49.347Z", + "updatedAt": "2019-12-26T18:28:14.456Z", "devdoc": { "methods": {} }, diff --git a/packages/contract-artifacts/artifacts/ZSC.json b/packages/contract-artifacts/artifacts/ZSC.json index c9918c58..0f0c8f89 100644 --- a/packages/contract-artifacts/artifacts/ZSC.json +++ b/packages/contract-artifacts/artifacts/ZSC.json @@ -148,12 +148,12 @@ "type": "function" } ], - "metadata": "{\"compiler\":{\"version\":\"0.5.4+commit.9549d8ff\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"y\",\"type\":\"bytes32[2]\"},{\"name\":\"bTransfer\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"epochLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"C\",\"type\":\"bytes32[2][]\"},{\"name\":\"D\",\"type\":\"bytes32[2]\"},{\"name\":\"y\",\"type\":\"bytes32[2][]\"},{\"name\":\"u\",\"type\":\"bytes32[2]\"},{\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"y\",\"type\":\"bytes32[2]\"},{\"name\":\"bTransfer\",\"type\":\"uint256\"},{\"name\":\"u\",\"type\":\"bytes32[2]\"},{\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"burn\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"y\",\"type\":\"bytes32[2][]\"},{\"name\":\"epoch\",\"type\":\"uint256\"}],\"name\":\"simulateAccounts\",\"outputs\":[{\"name\":\"accounts\",\"type\":\"bytes32[2][2][]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_coin\",\"type\":\"address\"},{\"name\":\"_zether\",\"type\":\"address\"},{\"name\":\"_burn\",\"type\":\"address\"},{\"name\":\"_epochLength\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"parties\",\"type\":\"bytes32[2][]\"}],\"name\":\"TransferOccurred\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZSC.sol\":\"ZSC\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/BurnVerifier.sol\":{\"keccak256\":\"0x16d165a04d131d098f1bee2d0fc5f1c3e59cf2f1bc2ad2691a37a8cf1a3f8f08\",\"urls\":[\"bzzr://42aa78d1ebcb573dff9ea88ffd437e142661379df7ec7581336ddb5e86f294b8\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/CashToken.sol\":{\"keccak256\":\"0x82bb618b45f209947dab386268264b59af92d89e32057fcddb43d77444bf5ebd\",\"urls\":[\"bzzr://0e7157c5c1bb4b64fbf43071131558130666196f6e7643e4ca7a5461436f9a29\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/Utils.sol\":{\"keccak256\":\"0x3b410db08d55d9540e8e795474410304be456ca3a36beb8c209019344593b267\",\"urls\":[\"bzzr://f5eaba23ec02eb7c30ce30f795aa0d7b1ae29d61d8111e2955a0f505bd1b328a\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZSC.sol\":{\"keccak256\":\"0xd8b60ff5535b7a4bcdff09a9c7158aa88a13dc1479853cb2ba9d617c173c3fb3\",\"urls\":[\"bzzr://84688070de789ab53e4b1d90717b262c261e2745aabdd35f78d159f71359d10e\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZetherVerifier.sol\":{\"keccak256\":\"0xbbd88d4d194130d5f591d292b959760d24b14926e1c5dc0c5721a2aa6fb988d2\",\"urls\":[\"bzzr://174b608d3a71052490df702b7214e8b04ceeab3836623658b2d841b82f750311\"]},\"openzeppelin-solidity/contracts/GSN/Context.sol\":{\"keccak256\":\"0x90a3995645af7562d84b9d69363ffa5ae7217714ab61e951bf7bc450f40e4061\",\"urls\":[\"bzzr://51482c01bddf23793bddee43b60ab9578a62948a4f2082def24ea792a553b055\"]},\"openzeppelin-solidity/contracts/access/Roles.sol\":{\"keccak256\":\"0xb002c378d7b82a101bd659c341518953ca0919d342c0a400196982c0e7e7bcdb\",\"urls\":[\"bzzr://bd34c1ce05b5b2b3a62fc02e160f6805b1cadd476854664f433c685b2fda8dad\"]},\"openzeppelin-solidity/contracts/access/roles/MinterRole.sol\":{\"keccak256\":\"0xbe8eef6f2cb4e427f5c5d8a76865ccd06e55a4f1d6671ba312d45bfa705aedbf\",\"urls\":[\"bzzr://946a26eebf5d294534471d07c4dc449ce3123e9fc2994bdfcd99dff1d09cc1af\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x640b6dee7a4b830bdfd52b5031a07fc2b12209f5b2e29e5d364a7d37f69d8076\",\"urls\":[\"bzzr://292843005e754e752644f767477ec5ad7a1ffc91ddb18c38b8079c62f3993cad\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x65a4078c03875c25413a068ce9cfdd7e68a90f8786612d1189c89341e6e3b802\",\"urls\":[\"bzzr://fefcc5ec4e313a66c9fd38375983b5973c528e7e19b6d37c2f1ac6745295e6e2\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol\":{\"keccak256\":\"0xa2b957cf89692c504962afb7506999155f83385373f808243246cd5879de5940\",\"urls\":[\"bzzr://812521b94ef1bd30b0a93e14a97a0e79e2bf4cb607aa47c21c8177966a79fd1a\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe5bb0f57cff3e299f360052ba50f1ea0fff046df2be070b6943e0e3c3fdad8a9\",\"urls\":[\"bzzr://cf2d583b8dce38d0617fdcd65f2fd9f126fe17b7f683b5a515ea9d2762d8b062\"]}},\"version\":1}", - "bytecode": "0x60806040526000600455600060095534801561001a57600080fd5b506040516080806127538339810180604052608081101561003a57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190505050836000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806003819055505050505061260e806101456000396000f3fe608060405234801561001057600080fd5b5060043610610074576000357c0100000000000000000000000000000000000000000000000000000000900480635464befb1461007957806357d775f8146100b15780635ec7ccfd146100cf57806373663b5f146103ac5780637ea9712f146104f3575b600080fd5b6100af6004803603606081101561008f57600080fd5b810190808060400190919291929080359060200190929190505050610611565b005b6100b9610a20565b6040518082815260200191505060405180910390f35b6103aa600480360360e08110156100e557600080fd5b810190808035906020019064010000000081111561010257600080fd5b82018360208201111561011457600080fd5b8035906020019184604083028401116401000000008311171561013657600080fd5b9190808060200260200160405190810160405280939291908181526020016000905b828210156101af578484839050604002016002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505081526020019060010190610158565b5050505050919291929080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561021357600080fd5b82018360208201111561022557600080fd5b8035906020019184604083028401116401000000008311171561024757600080fd5b9190808060200260200160405190810160405280939291908181526020016000905b828210156102c0578484839050604002016002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505081526020019060010190610269565b5050505050919291929080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561032457600080fd5b82018360208201111561033657600080fd5b8035906020019184600183028401116401000000008311171561035857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610a26565b005b6104f1600480360360c08110156103c257600080fd5b8101908080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019092919080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561046b57600080fd5b82018360208201111561047d57600080fd5b8035906020019184600183028401116401000000008311171561049f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061146e565b005b6105746004803603604081101561050957600080fd5b810190808035906020019064010000000081111561052657600080fd5b82018360208201111561053857600080fd5b8035906020019184604083028401116401000000008311171561055a57600080fd5b909192939192939080359060200190929190505050611d86565b60405180806020018281038252838181518152602001915080516000925b818410156106005782849060200190602002015160026000925b818410156105f25782846020020151600260200280838360005b838110156105e15780820151818401526020810190506105c6565b5050505090500192600101926105ac565b925050509260010192610592565b925050509250505060405180910390f35b60008260405160200180826002602002808284378083019250505091505060405160208183030381529060405280519060200120905061065081612042565b63ffffffff82111515156106cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4465706f73697420616d6f756e74206f7574206f662072616e67652e0000000081525060200191505060405180910390fd5b63ffffffff60045483011115151561072f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806125636028913960400191505060405180910390fd5b610737612315565b60066000838152602001908152602001600020600060028110151561075857fe5b60020201600280602002604051908101604052809291908260028015610793576020028201915b81548152602001906001019080831161077f575b50505050509050604051600182518252602083015160208301527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408301527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060830152846080830152604080830160606040850160075afa8116905060408360808460065afa8116905080151561082c57600080fd5b50508060066000848152602001908152602001600020600060028110151561085057fe5b60020201906002610862929190612337565b506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561095b57600080fd5b505af115801561096f573d6000803e3d6000fd5b505050506040513d602081101561098557600080fd5b81019080805190602001909291905050501515610a0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f5472616e736665722066726f6d2073656e646572206661696c65642e0000000081525060200191505060405180910390fd5b8260046000828254019250508190555050505050565b60035481565b600083519050606081604051908082528060200260200182016040528015610a6857816020015b610a55612377565b815260200190600190039081610a4d5790505b509050606082604051908082528060200260200182016040528015610aa757816020015b610a94612377565b815260200190600190039081610a8c5790505b509050828851141515610b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e707574206172726179206c656e677468206d69736d61746368210000000081525060200191505060405180910390fd5b60006001905060008090505b8751811015610e855760008882815181101515610b4757fe5b906020019060200201516040516020018082600260200280838360005b83811015610b7f578082015181840152602081019050610b64565b50505050905001915050604051602081830303815290604052805190602001209050610baa81612042565b610bb2612399565b60066000838152602001908152602001600020600280602002604051908101604052809291906000905b82821015610c3557838260020201600280602002604051908101604052809291908260028015610c21576020028201915b815481526020019060010190808311610c0d575b505050505081526020019060010190610bdc565b505050509050604051815151815260208251015160208201526020840260208e010151516040820152602080850260208f01015101517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470360608201526040825160808360065afa851694506020820151518152602080830151015160208201528b51604082015260208c01517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470360608201526040602083015160808360065afa85169450508060066000848152602001908152602001600020906002610d1e9291906123c7565b5060056000838152602001908152602001600020600280602002604051908101604052809291906000905b82821015610da257838260020201600280602002604051908101604052809291908260028015610d8e576020028201915b815481526020019060010190808311610d7a575b505050505081526020019060010190610d49565b505050509050604051815151815260208251015160208201526020840260208e010151516040820152602080850260208f01015101517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703606082015260406020850260208901015160808360065afa851694506020820151518152602080830151015160208201528b51604082015260208c01517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703606082015260406020850260208801015160808360065afa851694505050508080600101915050610b2e565b50600181141515610ee1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612535602e913960400191505060405180910390fd5b60008090506000876040516020018082600260200280838360005b83811015610f17578082015181840152602081019050610efc565b5050505090500191505060405160208183030381529060405280519060200120905060008090505b600880549050811015610f835781600882815481101515610f5c57fe5b90600052602060002001541415610f765760019250610f83565b8080600101915050610f3f565b5081151515610ffa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f6e636520616c7265616479207365656e210000000000000000000000000081525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631659e67d86868e8e8e6009548f8f6040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001806020018060200189600260200280838360005b838110156110a4578082015181840152602081019050611089565b505050509050018060200188815260200187600260200280838360005b838110156110dc5780820151818401526020810190506110c1565b505050509050018060200186810386528e8181518152602001915080516000925b8184101561114857828490602001906020020151600260200280838360005b8381101561113757808201518184015260208101905061111c565b5050505090500192600101926110fd565b9250505086810385528d8181518152602001915080516000925b818410156111ad57828490602001906020020151600260200280838360005b8381101561119c578082015181840152602081019050611181565b505050509050019260010192611162565b9250505086810384528c8181518152602001915080516000925b8184101561121257828490602001906020020151600260200280838360005b838110156112015780820151818401526020810190506111e6565b5050505090500192600101926111c7565b9250505086810383528a8181518152602001915080516000925b8184101561127757828490602001906020020151600260200280838360005b8381101561126657808201518184015260208101905061124b565b50505050905001926001019261122c565b92505050868103825287818151815260200191508051906020019080838360005b838110156112b3578082015181840152602081019050611298565b50505050905090810190601f1680156112e05780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060206040518083038186803b15801561130857600080fd5b505afa15801561131c573d6000803e3d6000fd5b505050506040513d602081101561133257600080fd5b8101908080519060200190929190505050151561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061258b6023913960400191505060405180910390fd5b60088190806001815401808255809150509060018203906000526020600020016000909192909190915055507f4ef6ed22b1551aeadeb80e67bb3a38788491e81527cc70a85bff611e9e51e18a8960405180806020018281038252838181518152602001915080516000925b8184101561145157828490602001906020020151600260200280838360005b83811015611440578082015181840152602081019050611425565b505050509050019260010192611406565b925050509250505060405180910390a15050505050505050505050565b6000846040516020018082600260200280838360005b8381101561149f578082015181840152602081019050611484565b505050509050019150506040516020818303038152906040528051906020012090506114ca81612042565b836000111580156114df575063ffffffff8411155b1515611553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5472616e7366657220616d6f756e74206f7574206f662072616e67652e00000081525060200191505060405180910390fd5b61155b612399565b60066000838152602001908152602001600020600280602002604051908101604052809291906000905b828210156115de578382600202016002806020026040519081016040528092919082600280156115ca576020028201915b8154815260200190600101908083116115b6575b505050505081526020019060010190611585565b5050505090506001604051825151815260208351015160208201527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408201527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060820152867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001036080820152604080820160606040840160075afa821691506040835160808360065afa8216915081151561169b57600080fd5b505080600660008481526020019081526020016000209060026116bf9291906123c7565b5060056000838152602001908152602001600020600280602002604051908101604052809291906000905b828210156117435783826002020160028060200260405190810160405280929190826002801561172f576020028201915b81548152602001906001019080831161171b575b5050505050815260200190600101906116ea565b5050505090506001604051825151815260208351015160208201527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408201527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060820152867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001036080820152604080820160606040840160075afa821691506040835160808360065afa8216915081151561180057600080fd5b505060008090506000856040516020018082600260200280838360005b8381101561183857808201518184015260208101905061181d565b5050505090500191505060405160208183030381529060405280519060200120905060008090505b6008805490508110156118a4578160088281548110151561187d57fe5b9060005260206000200154141561189757600192506118a4565b8080600101915050611860565b508115151561191b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f6e636520616c7265616479207365656e210000000000000000000000000081525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e1a999e84600060028110151561196857fe5b602002015185600160028110151561197c57fe5b60200201518b8b6009548c338d6040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018089600260200280838360005b838110156119df5780820151818401526020810190506119c4565b5050505090500188600260200280838360005b83811015611a0d5780820151818401526020810190506119f2565b5050505090500187600260200280838360005b83811015611a3b578082015181840152602081019050611a20565b5050505090500186815260200185815260200184600260200280838360005b83811015611a75578082015181840152602081019050611a5a565b505050509050018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611aea578082015181840152602081019050611acf565b50505050905090810190601f168015611b175780820380516001836020036101000a031916815260200191505b50995050505050505050505060206040518083038186803b158015611b3b57600080fd5b505afa158015611b4f573d6000803e3d6000fd5b505050506040513d6020811015611b6557600080fd5b81019080805190602001909291905050501515611bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4275726e2070726f6f6620766572696669636174696f6e206661696c6564210081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611cae57600080fd5b505af1158015611cc2573d6000803e3d6000fd5b505050506040513d6020811015611cd857600080fd5b81019080805190602001909291905050501515611d40576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806125ae6035913960400191505060405180910390fd5b8660046000828254039250508190555060088190806001815401808255809150509060018203906000526020600020016000909192909190915055505050505050505050565b6060600084849050905080604051908082528060200260200182016040528015611dca57816020015b611db7612417565b815260200190600190039081611daf5790505b50915060008090505b818110156120395760008686838181101515611deb57fe5b90506040020160405160200180826002602002808284378083019250505091505060405160208183030381529060405280519060200120905060056000828152602001908152602001600020600280602002604051908101604052809291906000905b82821015611ea757838260020201600280602002604051908101604052809291908260028015611e93576020028201915b815481526020019060010190808311611e7f575b505050505081526020019060010190611e4e565b505050508483815181101515611eb957fe5b90602001906020020181905250846007600083815260200190815260200160002054101561202b57611ee9612399565b60066000838152602001908152602001600020600280602002604051908101604052809291906000905b82821015611f6c57838260020201600280602002604051908101604052809291908260028015611f58576020028201915b815481526020019060010190808311611f44575b505050505081526020019060010190611f13565b5050505090506001604051825151815260208351015160208201526020850260208801015151516040820152602080860260208901015151015160608201526040602086026020890101515160808360065afa82169150602083015151815260208084015101516020820152602080860260208901015101515160408201526020806020870260208a0101510151015160608201526040602080870260208a010151015160808360065afa8216915081151561202757600080fd5b5050505b508080600101915050611dd3565b50509392505050565b60006003544281151561205157fe5b04905080600760008481526020019081526020016000205410156122f157612077612445565b604080519081016040528060056000868152602001908152602001600020600280602002604051908101604052809291906000905b82821015612105578382600202016002806020026040519081016040528092919082600280156120f1576020028201915b8154815260200190600101908083116120dd575b5050505050815260200190600101906120ac565b50505050815260200160066000868152602001908152602001600020600280602002604051908101604052809291906000905b828210156121915783826002020160028060200260405190810160405280929190826002801561217d576020028201915b815481526020019060010190808311612169575b505050505081526020019060010190612138565b50505050815250905060016040518251515181526020835151015160208201526020830151515160408201526020808401515101516060820152604083515160808360065afa82169150602083510151518152602080845101510151602082015260208084015101515160408201526020806020850151015101516060820152604060208451015160808360065afa8216915081151561223057600080fd5b505080600060028110151561224157fe5b6020020151600560008581526020019081526020016000209060026122679291906123c7565b506040805190810160405280604080519081016040528060006001028152602001600060010281525081526020016040805190810160405280600060010281526020016000600102815250815250600660008581526020019081526020016000209060026122d69291906123c7565b50816007600085815260200190815260200160002081905550505b8060095410156123115780600981905550600860006123109190612474565b5b5050565b6040805190810160405280600290602082028038833980820191505090505090565b8260028101928215612366579160200282015b8281111561236557825182559160200191906001019061234a565b5b5090506123739190612495565b5090565b6040805190810160405280600290602082028038833980820191505090505090565b6080604051908101604052806002905b6123b1612377565b8152602001906001900390816123a95790505090565b82600280028101928215612406579160200282015b82811115612405578251829060026123f59291906124ba565b50916020019190600201906123dc565b5b50905061241391906124fa565b5090565b6080604051908101604052806002905b61242f612377565b8152602001906001900390816124275790505090565b610100604051908101604052806002905b61245e612417565b8152602001906001900390816124565790505090565b50805460008255906000526020600020908101906124929190612495565b50565b6124b791905b808211156124b357600081600090555060010161249b565b5090565b90565b82600281019282156124e9579160200282015b828111156124e85782518255916020019190600101906124cd565b5b5090506124f69190612495565b5090565b61252391905b8082111561251f57600081816125169190612526565b50600201612500565b5090565b90565b50600081556001016000905556fe456c6c6970746963206375727665206f7065726174696f6e73206661696c7572652e2042616420706f696e74733f46756e642070757368657320636f6e74726163742070617374206d6178696d756d2076616c75652e5472616e736665722070726f6f6620766572696669636174696f6e206661696c656421546869732073686f756c646e2774206661696c2e2e2e20536f6d657468696e672077656e74207365766572656c792077726f6e672ea165627a7a723058206f17436c39227d0cc5f08a132230a6b574a011ab1e709070b8cfea64d3b6a2320029", - "deployedBytecode": "0x608060405234801561001057600080fd5b5060043610610074576000357c0100000000000000000000000000000000000000000000000000000000900480635464befb1461007957806357d775f8146100b15780635ec7ccfd146100cf57806373663b5f146103ac5780637ea9712f146104f3575b600080fd5b6100af6004803603606081101561008f57600080fd5b810190808060400190919291929080359060200190929190505050610611565b005b6100b9610a20565b6040518082815260200191505060405180910390f35b6103aa600480360360e08110156100e557600080fd5b810190808035906020019064010000000081111561010257600080fd5b82018360208201111561011457600080fd5b8035906020019184604083028401116401000000008311171561013657600080fd5b9190808060200260200160405190810160405280939291908181526020016000905b828210156101af578484839050604002016002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505081526020019060010190610158565b5050505050919291929080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561021357600080fd5b82018360208201111561022557600080fd5b8035906020019184604083028401116401000000008311171561024757600080fd5b9190808060200260200160405190810160405280939291908181526020016000905b828210156102c0578484839050604002016002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505081526020019060010190610269565b5050505050919291929080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561032457600080fd5b82018360208201111561033657600080fd5b8035906020019184600183028401116401000000008311171561035857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610a26565b005b6104f1600480360360c08110156103c257600080fd5b8101908080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019092919080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561046b57600080fd5b82018360208201111561047d57600080fd5b8035906020019184600183028401116401000000008311171561049f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061146e565b005b6105746004803603604081101561050957600080fd5b810190808035906020019064010000000081111561052657600080fd5b82018360208201111561053857600080fd5b8035906020019184604083028401116401000000008311171561055a57600080fd5b909192939192939080359060200190929190505050611d86565b60405180806020018281038252838181518152602001915080516000925b818410156106005782849060200190602002015160026000925b818410156105f25782846020020151600260200280838360005b838110156105e15780820151818401526020810190506105c6565b5050505090500192600101926105ac565b925050509260010192610592565b925050509250505060405180910390f35b60008260405160200180826002602002808284378083019250505091505060405160208183030381529060405280519060200120905061065081612042565b63ffffffff82111515156106cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4465706f73697420616d6f756e74206f7574206f662072616e67652e0000000081525060200191505060405180910390fd5b63ffffffff60045483011115151561072f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806125636028913960400191505060405180910390fd5b610737612315565b60066000838152602001908152602001600020600060028110151561075857fe5b60020201600280602002604051908101604052809291908260028015610793576020028201915b81548152602001906001019080831161077f575b50505050509050604051600182518252602083015160208301527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408301527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060830152846080830152604080830160606040850160075afa8116905060408360808460065afa8116905080151561082c57600080fd5b50508060066000848152602001908152602001600020600060028110151561085057fe5b60020201906002610862929190612337565b506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561095b57600080fd5b505af115801561096f573d6000803e3d6000fd5b505050506040513d602081101561098557600080fd5b81019080805190602001909291905050501515610a0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f5472616e736665722066726f6d2073656e646572206661696c65642e0000000081525060200191505060405180910390fd5b8260046000828254019250508190555050505050565b60035481565b600083519050606081604051908082528060200260200182016040528015610a6857816020015b610a55612377565b815260200190600190039081610a4d5790505b509050606082604051908082528060200260200182016040528015610aa757816020015b610a94612377565b815260200190600190039081610a8c5790505b509050828851141515610b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e707574206172726179206c656e677468206d69736d61746368210000000081525060200191505060405180910390fd5b60006001905060008090505b8751811015610e855760008882815181101515610b4757fe5b906020019060200201516040516020018082600260200280838360005b83811015610b7f578082015181840152602081019050610b64565b50505050905001915050604051602081830303815290604052805190602001209050610baa81612042565b610bb2612399565b60066000838152602001908152602001600020600280602002604051908101604052809291906000905b82821015610c3557838260020201600280602002604051908101604052809291908260028015610c21576020028201915b815481526020019060010190808311610c0d575b505050505081526020019060010190610bdc565b505050509050604051815151815260208251015160208201526020840260208e010151516040820152602080850260208f01015101517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470360608201526040825160808360065afa851694506020820151518152602080830151015160208201528b51604082015260208c01517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470360608201526040602083015160808360065afa85169450508060066000848152602001908152602001600020906002610d1e9291906123c7565b5060056000838152602001908152602001600020600280602002604051908101604052809291906000905b82821015610da257838260020201600280602002604051908101604052809291908260028015610d8e576020028201915b815481526020019060010190808311610d7a575b505050505081526020019060010190610d49565b505050509050604051815151815260208251015160208201526020840260208e010151516040820152602080850260208f01015101517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703606082015260406020850260208901015160808360065afa851694506020820151518152602080830151015160208201528b51604082015260208c01517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703606082015260406020850260208801015160808360065afa851694505050508080600101915050610b2e565b50600181141515610ee1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612535602e913960400191505060405180910390fd5b60008090506000876040516020018082600260200280838360005b83811015610f17578082015181840152602081019050610efc565b5050505090500191505060405160208183030381529060405280519060200120905060008090505b600880549050811015610f835781600882815481101515610f5c57fe5b90600052602060002001541415610f765760019250610f83565b8080600101915050610f3f565b5081151515610ffa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f6e636520616c7265616479207365656e210000000000000000000000000081525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631659e67d86868e8e8e6009548f8f6040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001806020018060200189600260200280838360005b838110156110a4578082015181840152602081019050611089565b505050509050018060200188815260200187600260200280838360005b838110156110dc5780820151818401526020810190506110c1565b505050509050018060200186810386528e8181518152602001915080516000925b8184101561114857828490602001906020020151600260200280838360005b8381101561113757808201518184015260208101905061111c565b5050505090500192600101926110fd565b9250505086810385528d8181518152602001915080516000925b818410156111ad57828490602001906020020151600260200280838360005b8381101561119c578082015181840152602081019050611181565b505050509050019260010192611162565b9250505086810384528c8181518152602001915080516000925b8184101561121257828490602001906020020151600260200280838360005b838110156112015780820151818401526020810190506111e6565b5050505090500192600101926111c7565b9250505086810383528a8181518152602001915080516000925b8184101561127757828490602001906020020151600260200280838360005b8381101561126657808201518184015260208101905061124b565b50505050905001926001019261122c565b92505050868103825287818151815260200191508051906020019080838360005b838110156112b3578082015181840152602081019050611298565b50505050905090810190601f1680156112e05780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060206040518083038186803b15801561130857600080fd5b505afa15801561131c573d6000803e3d6000fd5b505050506040513d602081101561133257600080fd5b8101908080519060200190929190505050151561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061258b6023913960400191505060405180910390fd5b60088190806001815401808255809150509060018203906000526020600020016000909192909190915055507f4ef6ed22b1551aeadeb80e67bb3a38788491e81527cc70a85bff611e9e51e18a8960405180806020018281038252838181518152602001915080516000925b8184101561145157828490602001906020020151600260200280838360005b83811015611440578082015181840152602081019050611425565b505050509050019260010192611406565b925050509250505060405180910390a15050505050505050505050565b6000846040516020018082600260200280838360005b8381101561149f578082015181840152602081019050611484565b505050509050019150506040516020818303038152906040528051906020012090506114ca81612042565b836000111580156114df575063ffffffff8411155b1515611553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5472616e7366657220616d6f756e74206f7574206f662072616e67652e00000081525060200191505060405180910390fd5b61155b612399565b60066000838152602001908152602001600020600280602002604051908101604052809291906000905b828210156115de578382600202016002806020026040519081016040528092919082600280156115ca576020028201915b8154815260200190600101908083116115b6575b505050505081526020019060010190611585565b5050505090506001604051825151815260208351015160208201527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408201527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060820152867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001036080820152604080820160606040840160075afa821691506040835160808360065afa8216915081151561169b57600080fd5b505080600660008481526020019081526020016000209060026116bf9291906123c7565b5060056000838152602001908152602001600020600280602002604051908101604052809291906000905b828210156117435783826002020160028060200260405190810160405280929190826002801561172f576020028201915b81548152602001906001019080831161171b575b5050505050815260200190600101906116ea565b5050505090506001604051825151815260208351015160208201527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408201527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060820152867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001036080820152604080820160606040840160075afa821691506040835160808360065afa8216915081151561180057600080fd5b505060008090506000856040516020018082600260200280838360005b8381101561183857808201518184015260208101905061181d565b5050505090500191505060405160208183030381529060405280519060200120905060008090505b6008805490508110156118a4578160088281548110151561187d57fe5b9060005260206000200154141561189757600192506118a4565b8080600101915050611860565b508115151561191b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f6e636520616c7265616479207365656e210000000000000000000000000081525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e1a999e84600060028110151561196857fe5b602002015185600160028110151561197c57fe5b60200201518b8b6009548c338d6040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018089600260200280838360005b838110156119df5780820151818401526020810190506119c4565b5050505090500188600260200280838360005b83811015611a0d5780820151818401526020810190506119f2565b5050505090500187600260200280838360005b83811015611a3b578082015181840152602081019050611a20565b5050505090500186815260200185815260200184600260200280838360005b83811015611a75578082015181840152602081019050611a5a565b505050509050018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611aea578082015181840152602081019050611acf565b50505050905090810190601f168015611b175780820380516001836020036101000a031916815260200191505b50995050505050505050505060206040518083038186803b158015611b3b57600080fd5b505afa158015611b4f573d6000803e3d6000fd5b505050506040513d6020811015611b6557600080fd5b81019080805190602001909291905050501515611bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4275726e2070726f6f6620766572696669636174696f6e206661696c6564210081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611cae57600080fd5b505af1158015611cc2573d6000803e3d6000fd5b505050506040513d6020811015611cd857600080fd5b81019080805190602001909291905050501515611d40576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806125ae6035913960400191505060405180910390fd5b8660046000828254039250508190555060088190806001815401808255809150509060018203906000526020600020016000909192909190915055505050505050505050565b6060600084849050905080604051908082528060200260200182016040528015611dca57816020015b611db7612417565b815260200190600190039081611daf5790505b50915060008090505b818110156120395760008686838181101515611deb57fe5b90506040020160405160200180826002602002808284378083019250505091505060405160208183030381529060405280519060200120905060056000828152602001908152602001600020600280602002604051908101604052809291906000905b82821015611ea757838260020201600280602002604051908101604052809291908260028015611e93576020028201915b815481526020019060010190808311611e7f575b505050505081526020019060010190611e4e565b505050508483815181101515611eb957fe5b90602001906020020181905250846007600083815260200190815260200160002054101561202b57611ee9612399565b60066000838152602001908152602001600020600280602002604051908101604052809291906000905b82821015611f6c57838260020201600280602002604051908101604052809291908260028015611f58576020028201915b815481526020019060010190808311611f44575b505050505081526020019060010190611f13565b5050505090506001604051825151815260208351015160208201526020850260208801015151516040820152602080860260208901015151015160608201526040602086026020890101515160808360065afa82169150602083015151815260208084015101516020820152602080860260208901015101515160408201526020806020870260208a0101510151015160608201526040602080870260208a010151015160808360065afa8216915081151561202757600080fd5b5050505b508080600101915050611dd3565b50509392505050565b60006003544281151561205157fe5b04905080600760008481526020019081526020016000205410156122f157612077612445565b604080519081016040528060056000868152602001908152602001600020600280602002604051908101604052809291906000905b82821015612105578382600202016002806020026040519081016040528092919082600280156120f1576020028201915b8154815260200190600101908083116120dd575b5050505050815260200190600101906120ac565b50505050815260200160066000868152602001908152602001600020600280602002604051908101604052809291906000905b828210156121915783826002020160028060200260405190810160405280929190826002801561217d576020028201915b815481526020019060010190808311612169575b505050505081526020019060010190612138565b50505050815250905060016040518251515181526020835151015160208201526020830151515160408201526020808401515101516060820152604083515160808360065afa82169150602083510151518152602080845101510151602082015260208084015101515160408201526020806020850151015101516060820152604060208451015160808360065afa8216915081151561223057600080fd5b505080600060028110151561224157fe5b6020020151600560008581526020019081526020016000209060026122679291906123c7565b506040805190810160405280604080519081016040528060006001028152602001600060010281525081526020016040805190810160405280600060010281526020016000600102815250815250600660008581526020019081526020016000209060026122d69291906123c7565b50816007600085815260200190815260200160002081905550505b8060095410156123115780600981905550600860006123109190612474565b5b5050565b6040805190810160405280600290602082028038833980820191505090505090565b8260028101928215612366579160200282015b8281111561236557825182559160200191906001019061234a565b5b5090506123739190612495565b5090565b6040805190810160405280600290602082028038833980820191505090505090565b6080604051908101604052806002905b6123b1612377565b8152602001906001900390816123a95790505090565b82600280028101928215612406579160200282015b82811115612405578251829060026123f59291906124ba565b50916020019190600201906123dc565b5b50905061241391906124fa565b5090565b6080604051908101604052806002905b61242f612377565b8152602001906001900390816124275790505090565b610100604051908101604052806002905b61245e612417565b8152602001906001900390816124565790505090565b50805460008255906000526020600020908101906124929190612495565b50565b6124b791905b808211156124b357600081600090555060010161249b565b5090565b90565b82600281019282156124e9579160200282015b828111156124e85782518255916020019190600101906124cd565b5b5090506124f69190612495565b5090565b61252391905b8082111561251f57600081816125169190612526565b50600201612500565b5090565b90565b50600081556001016000905556fe456c6c6970746963206375727665206f7065726174696f6e73206661696c7572652e2042616420706f696e74733f46756e642070757368657320636f6e74726163742070617374206d6178696d756d2076616c75652e5472616e736665722070726f6f6620766572696669636174696f6e206661696c656421546869732073686f756c646e2774206661696c2e2e2e20536f6d657468696e672077656e74207365766572656c792077726f6e672ea165627a7a723058206f17436c39227d0cc5f08a132230a6b574a011ab1e709070b8cfea64d3b6a2320029", - "sourceMap": "111:13473:4:-;;;290:1;273:18;;798:1;771:28;;1228:376;8:9:-1;5:2;;;30:1;27;20:12;5:2;1228:376:4;;;;;;;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;1228:376:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1461:5;1444:4;;:23;;;;;;;;;;;;;;;;;;1509:7;1477:14;;:40;;;;;;;;;;;;;;;;;;1555:5;1527:12;;:34;;;;;;;;;;;;;;;;;;1585:12;1571:11;:26;;;;1228:376;;;;111:13473;;;;;;", - "deployedSourceMap": "111:13473:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;111:13473:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5280:1627;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5280:1627:4;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;216:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6913:3642;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;6913:3642:4;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;6913:3642:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6913:3642:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;6913:3642:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6913:3642:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6913:3642:4;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;6913:3642:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6913:3642:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;6913:3642:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6913:3642:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6913:3642:4;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;6913:3642:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6913:3642:4;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;6913:3642:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6913:3642:4;;;;;;;;;;;;;;;:::i;:::-;;10561:3021;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;10561:3021:4;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;10561:3021:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;10561:3021:4;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;10561:3021:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10561:3021:4;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;10561:3021:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;10561:3021:4;;;;;;;;;;;;;;;:::i;:::-;;1610:2113;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1610:2113:4;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;1610:2113:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1610:2113:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;1610:2113:4;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1610:2113:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5280:1627;5355:13;5398:1;5381:19;;;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;5381:19:4;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5381:19:4;;;5371:30;;;;;;5355:46;;5411:15;5420:5;5411:8;:15::i;:::-;415:10;5573:9;:16;;5565:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;415:10;5689:6;;5677:9;:18;:25;;5669:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5851:25;;:::i;:::-;5879:10;:17;5890:5;5879:17;;;;;;;;;;;5897:1;5879:20;;;;;;;;;;;;5851:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6012:4;6006:11;6044:1;6074:7;6068:14;6065:1;6058:25;6136:4;6127:7;6123:18;6117:25;6110:4;6107:1;6103:12;6096:47;6177:66;6170:4;6167:1;6163:12;6156:88;6278:66;6271:4;6268:1;6264:12;6257:88;6379:9;6372:4;6369:1;6365:12;6358:31;6554:4;6547;6544:1;6540:12;6534:4;6527;6524:1;6520:12;6514:4;6509:3;6498:61;6490:6;6486:74;6476:84;;6635:4;6626:7;6620:4;6617:1;6611:4;6606:3;6595:45;6587:6;6583:58;6573:68;;6664:6;6657:14;6654:2;;;6700:1;6697;6690:12;6654:2;5983:743;;6758:7;6735:10;:17;6746:5;6735:17;;;;;;;;;;;6753:1;6735:20;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;6783:4;;;;;;;;;;;:17;;;6801:10;6821:4;6828:9;6783:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6783:55:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6783:55:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6783:55:4;;;;;;;;;;;;;;;;6775:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6891:9;6881:6;;:19;;;;;;;;;;;5280:1627;;;;:::o;216:26::-;;;;:::o;6913:3642::-;7056:12;7071:1;:8;7056:23;;7089;7132:4;7115:22;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;7089:48;;7147:23;7190:4;7173:22;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;7147:48;;7225:4;7213:1;:8;:16;7205:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7272:14;7289:1;7272:18;;7305:9;7317:1;7305:13;;7300:2667;7324:1;:8;7320:1;:12;7300:2667;;;7353:13;7396:1;7398;7396:4;;;;;;;;;;;;;;;;;;7379:22;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7379:22:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;7379:22:4;;;7369:33;;;;;;7353:49;;7416:15;7425:5;7416:8;:15::i;:::-;7445:28;;:::i;:::-;7476:10;:17;7487:5;7476:17;;;;;;;;;;;7445:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7549:4;7543:11;7593:7;7587:14;7581:21;7578:1;7571:32;7667:4;7657:7;7651:14;7647:25;7641:32;7634:4;7631:1;7627:12;7620:54;8035:4;8032:1;8028:12;8021:4;8018:1;8014:12;8010:31;8004:38;7998:45;7991:4;7988:1;7984:12;7977:67;8204:4;8195;8192:1;8188:12;8181:4;8178:1;8174:12;8170:31;8164:38;8160:49;8154:56;8086:66;8082:129;8075:4;8072:1;8068:12;8061:151;8298:4;8288:7;8282:14;8276:4;8273:1;8267:4;8262:3;8251:52;8243:6;8239:65;8229:75;;8356:4;8347:7;8343:18;8337:25;8331:32;8328:1;8321:43;8439:4;8431;8422:7;8418:18;8412:25;8408:36;8402:43;8395:4;8392:1;8388:12;8381:65;8577:1;8571:8;8564:4;8561:1;8557:12;8550:30;8703:4;8700:1;8696:12;8690:19;8622:66;8618:92;8611:4;8608:1;8604:12;8597:114;8819:4;8811;8802:7;8798:18;8792:25;8786:4;8783:1;8777:4;8772:3;8761:63;8753:6;8749:76;8739:86;;7516:1323;8872:7;8852:10;:17;8863:5;8852:17;;;;;;;;;;;:27;;;;;;;:::i;:::-;;8944:3;:10;8948:5;8944:10;;;;;;;;;;;8934:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9010:4;9004:11;9054:7;9048:14;9042:21;9039:1;9032:32;9128:4;9118:7;9112:14;9108:25;9102:32;9095:4;9092:1;9088:12;9081:54;9210:4;9207:1;9203:12;9196:4;9193:1;9189:12;9185:31;9179:38;9173:45;9166:4;9163:1;9159:12;9152:67;9379:4;9370;9367:1;9363:12;9356:4;9353:1;9349:12;9345:31;9339:38;9335:49;9329:56;9261:66;9257:129;9250:4;9247:1;9243:12;9236:151;9499:4;9490;9487:1;9483:12;9476:4;9471:3;9467:14;9463:33;9457:40;9451:4;9448:1;9442:4;9437:3;9426:78;9418:6;9414:91;9404:101;;9557:4;9548:7;9544:18;9538:25;9532:32;9529:1;9522:43;9640:4;9632;9623:7;9619:18;9613:25;9609:36;9603:43;9596:4;9593:1;9589:12;9582:65;9691:1;9685:8;9678:4;9675:1;9671:12;9664:30;9817:4;9814:1;9810:12;9804:19;9736:66;9732:92;9725:4;9722:1;9718:12;9711:114;9937:4;9928;9925:1;9921:12;9914:4;9909:3;9905:14;9901:33;9895:40;9889:4;9886:1;9880:4;9875:3;9864:78;9856:6;9852:91;9842:101;;8977:980;;;7334:3;;;;;;;7300:2667;;;;9994:1;9984:6;:11;9976:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10057:9;10069:5;10057:17;;10084:13;10127:1;10110:19;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10110:19:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10110:19:4;;;10100:30;;;;;;10084:46;;10145:9;10157:1;10145:13;;10140:163;10164:8;:15;;;;10160:1;:19;10140:163;;;10219:5;10204:8;10213:1;10204:11;;;;;;;;;;;;;;;;;;:20;10200:93;;;10251:4;10244:11;;10273:5;;10200:93;10181:3;;;;;;;10140:163;;;;10321:4;10320:5;10312:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10367:14;;;;;;;;;;;:29;;;10397:3;10402;10407:1;10410;10413;10416:16;;10434:1;10437:5;10367:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10367:76:4;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10367:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10367:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10367:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10367:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10367:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10367:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10367:76:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10367:76:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10367:76:4;;;;;;;;;;;;;;;;10359:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10494:8;10508:5;10494:20;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;10494:20:4;;;;;;;;;;;;;;;;;;;;;;10529:19;10546:1;10529:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10529:19:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;6913:3642;;;;;;;;;;;:::o;10561:3021::-;10673:13;10716:1;10699:19;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10699:19:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10699:19:4;;;10689:30;;;;;;10673:46;;10729:15;10738:5;10729:8;:15::i;:::-;10768:9;10763:1;:14;;:34;;;;;415:10;10781:9;:16;;10763:34;10755:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10841:28;;:::i;:::-;10872:10;:17;10883:5;10872:17;;;;;;;;;;;10841:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10995:1;11024:4;11018:11;11064:7;11058:14;11052:21;11049:1;11042:32;11134:4;11124:7;11118:14;11114:25;11108:32;11101:4;11098:1;11094:12;11087:54;11222:66;11215:4;11212:1;11208:12;11201:88;11330:66;11323:4;11320:1;11316:12;11309:88;11510:9;11442:66;11438:82;11431:4;11428:1;11424:12;11417:104;11612:4;11605;11602:1;11598:12;11592:4;11585;11582:1;11578:12;11572:4;11567:3;11556:61;11548:6;11544:74;11534:84;;11700:4;11690:7;11684:14;11678:4;11675:1;11669:4;11664:3;11653:52;11645:6;11641:65;11631:75;;11795:6;11788:14;11785:2;;;11831:1;11828;11821:12;11785:2;10967:890;;11886:7;11866:10;:17;11877:5;11866:17;;;;;;;;;;;:27;;;;;;;:::i;:::-;;11934:3;:10;11938:5;11934:10;;;;;;;;;;;11924:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12065:1;12094:4;12088:11;12134:7;12128:14;12122:21;12119:1;12112:32;12204:4;12194:7;12188:14;12184:25;12178:32;12171:4;12168:1;12164:12;12157:54;12245:66;12238:4;12235:1;12231:12;12224:88;12353:66;12346:4;12343:1;12339:12;12332:88;12533:9;12465:66;12461:82;12454:4;12451:1;12447:12;12440:104;12635:4;12628;12625:1;12621:12;12615:4;12608;12605:1;12601:12;12595:4;12590:3;12579:61;12571:6;12567:74;12557:84;;12723:4;12713:7;12707:14;12701:4;12698:1;12692:4;12687:3;12676:52;12668:6;12664:65;12654:75;;12818:6;12811:14;12808:2;;;12854:1;12851;12844:12;12808:2;12037:843;;12889:9;12901:5;12889:17;;12916:13;12959:1;12942:19;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12942:19:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12942:19:4;;;12932:30;;;;;;12916:46;;12977:9;12989:1;12977:13;;12972:231;12996:8;:15;;;;12992:1;:19;12972:231;;;13051:5;13036:8;13045:1;13036:11;;;;;;;;;;;;;;;;;;:20;13032:161;;;13151:4;13144:11;;13173:5;;13032:161;13013:3;;;;;;;12972:231;;;;13221:4;13220:5;13212:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13267:12;;;;;;;;;;;:23;;;13291:7;13299:1;13291:10;;;;;;;;;;;;;13303:7;13311:1;13303:10;;;;;;;;;;;;;13315:1;13318:9;13329:16;;13347:1;13350:10;13362:5;13267:101;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;13267:101:4;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;13267:101:4;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;13267:101:4;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;13267:101:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;13267:101:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13267:101:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13267:101:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13267:101:4;;;;;;;;;;;;;;;;13259:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13422:4;;;;;;;;;;;:13;;;13436:10;13448:9;13422:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13422:36:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13422:36:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13422:36:4;;;;;;;;;;;;;;;;13414:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13536:9;13526:6;;:19;;;;;;;;;;;13555:8;13569:5;13555:20;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;13555:20:4;;;;;;;;;;;;;;;;;;;;;;10561:3021;;;;;;;;:::o;1610:2113::-;1699:31;2134:12;2149:1;;:8;;2134:23;;2198:4;2178:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2167:36;;2218:9;2230:1;2218:13;;2213:1504;2237:4;2233:1;:8;2213:1504;;;2262:13;2305:1;;2307;2305:4;;;;;;;;;;;;;;2288:22;;;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;2288:22:4;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2288:22:4;;;2278:33;;;;;;2262:49;;2339:3;:10;2343:5;2339:10;;;;;;;;;;;2325:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;2334:1;2325:11;;;;;;;;;;;;;;;;;:24;;;;2389:5;2367:12;:19;2380:5;2367:19;;;;;;;;;;;;:27;2363:1344;;;2414:28;;:::i;:::-;2445:10;:17;2456:5;2445:17;;;;;;;;;;;2414:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2525:1;2562:4;2556:11;2610:7;2604:14;2598:21;2595:1;2588:32;2688:4;2678:7;2672:14;2668:25;2662:32;2655:4;2652:1;2648:12;2641:54;2787:4;2784:1;2780:12;2773:4;2763:8;2759:19;2755:38;2749:45;2743:52;2737:59;2730:4;2727:1;2723:12;2716:81;2903:4;2893;2890:1;2886:12;2879:4;2869:8;2865:19;2861:38;2855:45;2849:52;2845:63;2839:70;2832:4;2829:1;2825:12;2818:92;3038:4;3028;3025:1;3021:12;3014:4;3004:8;3000:19;2996:38;2990:45;2984:52;2978:4;2975:1;2969:4;2964:3;2953:90;2945:6;2941:103;2931:113;;3100:4;3091:7;3087:18;3081:25;3075:32;3072:1;3065:43;3187:4;3179;3170:7;3166:18;3160:25;3156:36;3150:43;3143:4;3140:1;3136:12;3129:65;3299:4;3290;3287:1;3283:12;3276:4;3266:8;3262:19;3258:38;3252:45;3248:56;3242:63;3236:70;3229:4;3226:1;3222:12;3215:92;3424:4;3416;3407;3404:1;3400:12;3393:4;3383:8;3379:19;3375:38;3369:45;3365:56;3359:63;3355:74;3349:81;3342:4;3339:1;3335:12;3328:103;3570:4;3562;3553;3550:1;3546:12;3539:4;3529:8;3525:19;3521:38;3515:45;3511:56;3505:63;3499:4;3496:1;3490:4;3485:3;3474:101;3466:6;3462:114;3452:124;;3607:6;3600:14;3597:2;;;3651:1;3648;3641:12;3597:2;2489:1204;;;;2213:1504;2243:3;;;;;;;2213:1504;;;;1610:2113;;;;;;:::o;3729:1545::-;3781:9;3811:11;;3793:15;:29;;;;;;;;3781:41;;3858:1;3836:12;:19;3849:5;3836:19;;;;;;;;;;;;:23;3832:1327;;;3875:31;;:::i;:::-;:65;;;;;;;;;3910:3;:10;3914:5;3910:10;;;;;;;;;;;3875:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3922:10;:17;3933:5;3922:17;;;;;;;;;;;3875:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3995:1;4028:4;4022:11;4078:7;4072:14;4066:21;4060:28;4057:1;4050:39;4160:4;4149:7;4143:14;4137:21;4133:32;4127:39;4120:4;4117:1;4113:12;4106:61;4236:4;4227:7;4223:18;4217:25;4211:32;4205:39;4198:4;4195:1;4191:12;4184:61;4327:4;4318;4309:7;4305:18;4299:25;4293:32;4289:43;4283:50;4276:4;4273:1;4269:12;4262:72;4427:4;4416:7;4410:14;4404:21;4398:4;4395:1;4389:4;4384:3;4373:59;4365:6;4361:72;4351:82;;4492:4;4482:7;4476:14;4472:25;4466:32;4460:39;4457:1;4450:50;4582:4;4574;4564:7;4558:14;4554:25;4548:32;4544:43;4538:50;4531:4;4528:1;4524:12;4517:72;4670:4;4662;4653:7;4649:18;4643:25;4639:36;4633:43;4627:50;4620:4;4617:1;4613:12;4606:72;4771:4;4763;4755;4746:7;4742:18;4736:25;4732:36;4726:43;4722:54;4716:61;4709:4;4706:1;4702:12;4695:83;4882:4;4874;4864:7;4858:14;4854:25;4848:32;4842:4;4839:1;4833:4;4828:3;4817:70;4809:6;4805:83;4795:93;;4915:6;4908:14;4905:2;;;4955:1;4952;4945:12;4905:2;3963:1026;;5015:7;5023:1;5015:10;;;;;;;;;;;;;5002:3;:10;5006:5;5002:10;;;;;;;;;;;:23;;;;;;;:::i;:::-;;5039:72;;;;;;;;;;;;;;;;;;5069:1;5061:10;;5039:72;;;;5081:1;5073:10;;5039:72;;;;;;;;;;;;;;;;5095:1;5087:10;;5039:72;;;;5107:1;5099:10;;5039:72;;;;;;:10;:17;5050:5;5039:17;;;;;;;;;;;:72;;;;;;;:::i;:::-;;5147:1;5125:12;:19;5138:5;5125:19;;;;;;;;;;;:23;;;;3832:1327;;5191:1;5172:16;;:20;5168:100;;;5227:1;5208:16;:20;;;;5249:8;;5242:15;;;;:::i;:::-;5168:100;3729:1545;;:::o;111:13473::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;111:13473:4;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;111:13473:4;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o", - "source": "pragma solidity 0.5.4;\n\nimport './ZetherVerifier.sol';\nimport './BurnVerifier.sol';\nimport './CashToken.sol';\n\ncontract ZSC {\n CashToken coin;\n ZetherVerifier zetherverifier;\n BurnVerifier burnverifier;\n uint256 public epochLength; // now in milliseconds.\n\n uint256 bTotal = 0; // could use erc20.balanceOf(this), but (even pure / view) calls cost gas during EVM execution\n uint256 constant MAX = 4294967295; // 2^32 - 1 // no sload for constants...!\n mapping(bytes32 => bytes32[2][2]) acc; // main account mapping\n mapping(bytes32 => bytes32[2][2]) pTransfers; // storage for pending transfers\n mapping(bytes32 => uint256) lastRollOver;\n bytes32[] nonceSet; // would be more natural to use a mapping, but they can't be deleted / reset!\n uint256 lastGlobalUpdate = 0; // will be also used as a proxy for \"current epoch\", seeing as rollovers will be anticipated\n // not implementing account locking for now...revisit\n\n event TransferOccurred(bytes32[2][] parties); // all parties will be notified, client can determine whether it was real or not.\n // arg is still necessary for transfers---not even so much to know when you received a transfer, as to know when you got rolled over.\n\n constructor(address _coin, address _zether, address _burn, uint256 _epochLength) public {\n // epoch length, like block.time, is in _seconds_. 4 is the minimum!!! (To allow a withdrawal to go through.)\n coin = CashToken(_coin);\n zetherverifier = ZetherVerifier(_zether);\n burnverifier = BurnVerifier(_burn);\n epochLength = _epochLength;\n }\n\n function simulateAccounts(bytes32[2][] calldata y, uint256 epoch) view external returns (bytes32[2][2][] memory accounts) {\n // all of this could be assembled locally by querying `acc` and `pTransfers` (and `lastRollOver`) and assembling things by hand\n // turns out this is extremely _slow_ though, because of the ~ 4 * N queries which must be made. turns out it's much faster\n // to simply move the entire process into a contract method, and in fact this allows us to make the above 3 private\n uint256 size = y.length;\n accounts = new bytes32[2][2][](size);\n for (uint256 i = 0; i < size; i++) {\n bytes32 yHash = keccak256(abi.encodePacked(y[i]));\n accounts[i] = acc[yHash];\n if (lastRollOver[yHash] < epoch) {\n bytes32[2][2] memory scratch = pTransfers[yHash];\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(mload(scratch)))\n mstore(add(m, 0x20), mload(add(mload(scratch), 0x20)))\n mstore(add(m, 0x40), mload(mload(mload(add(add(accounts, 0x20), mul(i, 0x20))))))\n mstore(add(m, 0x60), mload(add(mload(mload(add(add(accounts, 0x20), mul(i, 0x20)))), 0x20)))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(mload(add(add(accounts, 0x20), mul(i, 0x20)))), 0x40))\n mstore(m, mload(mload(add(scratch, 0x20))))\n mstore(add(m, 0x20), mload(add(mload(add(scratch, 0x20)), 0x20)))\n mstore(add(m, 0x40), mload(mload(add(mload(add(add(accounts, 0x20), mul(i, 0x20))), 0x20))))\n mstore(add(m, 0x60), mload(add(mload(add(mload(add(add(accounts, 0x20), mul(i, 0x20))), 0x20)), 0x20)))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(mload(add(add(accounts, 0x20), mul(i, 0x20))), 0x20)), 0x40))\n if iszero(result) {\n revert(0, 0)\n }\n }\n }\n }\n }\n\n function rollOver(bytes32 yHash) internal {\n uint256 e = block.timestamp / epochLength;\n if (lastRollOver[yHash] < e) {\n bytes32[2][2][2] memory scratch = [acc[yHash], pTransfers[yHash]];\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(mload(mload(scratch))))\n mstore(add(m, 0x20), mload(add(mload(mload(scratch)), 0x20)))\n mstore(add(m, 0x40), mload(mload(mload(add(scratch, 0x20)))))\n mstore(add(m, 0x60), mload(add(mload(mload(add(scratch, 0x20))), 0x20)))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(mload(scratch)), 0x40))\n mstore(m, mload(mload(add(mload(scratch), 0x20))))\n mstore(add(m, 0x20), mload(add(mload(add(mload(scratch), 0x20)), 0x20)))\n mstore(add(m, 0x40), mload(mload(add(mload(add(scratch, 0x20)), 0x20))))\n mstore(add(m, 0x60), mload(add(mload(add(mload(add(scratch, 0x20)), 0x20)), 0x20)))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(mload(scratch), 0x20)), 0x40))\n if iszero(result) {\n revert(0, 0)\n }\n }\n acc[yHash] = scratch[0];\n pTransfers[yHash] = [[bytes32(0), bytes32(0)], [bytes32(0), bytes32(0)]];\n lastRollOver[yHash] = e;\n }\n if (lastGlobalUpdate < e) {\n lastGlobalUpdate = e;\n delete nonceSet;\n }\n }\n\n function fund(bytes32[2] calldata y, uint256 bTransfer) external {\n bytes32 yHash = keccak256(abi.encodePacked(y));\n rollOver(yHash);\n\n // registration check here would be redundant, as any `transferFrom` the 0 address will necessarily fail. save an sload\n require(bTransfer <= MAX, \"Deposit amount out of range.\"); // uint, so other way not necessary?\n require(bTransfer + bTotal <= MAX, \"Fund pushes contract past maximum value.\");\n // if pTransfers[yHash] == [0, 0, 0, 0] then an add and a write will be equivalent...\n bytes32[2] memory scratch = pTransfers[yHash][0];\n // won't let me assign this array using literals / casts\n assembly {\n let m := mload(0x40)\n let result := 1\n mstore(m, mload(scratch))\n mstore(add(m, 0x20), mload(add(scratch, 0x20)))\n mstore(add(m, 0x40), 0x077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d4)\n mstore(add(m, 0x60), 0x01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f875)\n mstore(add(m, 0x80), bTransfer) // b will hopefully be a primitive / literal and not a pointer / address?\n result := and(result, staticcall(gas, 0x07, add(m, 0x40), 0x60, add(m, 0x40), 0x40))\n result := and(result, staticcall(gas, 0x06, m, 0x80, scratch, 0x40))\n if iszero(result) {\n revert(0, 0)\n }\n }\n pTransfers[yHash][0] = scratch;\n require(coin.transferFrom(msg.sender, address(this), bTransfer), \"Transfer from sender failed.\");\n bTotal += bTransfer;\n }\n\n function transfer(bytes32[2][] memory C, bytes32[2] memory D, bytes32[2][] memory y, bytes32[2] memory u, bytes memory proof) public {\n uint256 size = y.length;\n bytes32[2][] memory CLn = new bytes32[2][](size);\n bytes32[2][] memory CRn = new bytes32[2][](size);\n require(C.length == size, \"Input array length mismatch!\");\n uint256 result = 1;\n for (uint256 i = 0; i < y.length; i++) {\n bytes32 yHash = keccak256(abi.encodePacked(y[i]));\n rollOver(yHash);\n bytes32[2][2] memory scratch = pTransfers[yHash];\n assembly {\n let m := mload(0x40)\n mstore(m, mload(mload(scratch)))\n mstore(add(m, 0x20), mload(add(mload(scratch), 0x20)))\n // calldatacopy(add(m, 0x40), add(0x104, mul(i, 0x40)), 0x40) // copy C[i] onto running block\n // having to change external --> public to avoid stacktoodeep\n // as a result, have to use the below two lines instead of the above single line.\n mstore(add(m, 0x40), mload(mload(add(add(C, 0x20), mul(i, 0x20)))))\n mstore(add(m, 0x60), sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(add(mload(add(add(C, 0x20), mul(i, 0x20))), 0x20))))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(scratch), 0x40))\n mstore(m, mload(mload(add(scratch, 0x20))))\n mstore(add(m, 0x20), mload(add(mload(add(scratch, 0x20)), 0x20)))\n // calldatacopy(add(m, 0x40), 0x24, 0x40) // copy R onto running block\n mstore(add(m, 0x40), mload(D))\n mstore(add(m, 0x60), sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(add(D, 0x20)))) // invert!\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(scratch, 0x20)), 0x40))\n }\n pTransfers[yHash] = scratch; // credit / debit / neither y's account.\n scratch = acc[yHash];\n assembly {\n let m := mload(0x40)\n mstore(m, mload(mload(scratch)))\n mstore(add(m, 0x20), mload(add(mload(scratch), 0x20)))\n mstore(add(m, 0x40), mload(mload(add(add(C, 0x20), mul(i, 0x20)))))\n mstore(add(m, 0x60), sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(add(mload(add(add(C, 0x20), mul(i, 0x20))), 0x20))))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(add(CLn, 0x20), mul(i, 0x20))), 0x40))\n mstore(m, mload(mload(add(scratch, 0x20))))\n mstore(add(m, 0x20), mload(add(mload(add(scratch, 0x20)), 0x20)))\n mstore(add(m, 0x40), mload(D))\n mstore(add(m, 0x60), sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(add(D, 0x20))))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(add(CRn, 0x20), mul(i, 0x20))), 0x40))\n }\n }\n require(result == 1, \"Elliptic curve operations failure. Bad points?\");\n\n bool seen = false;\n bytes32 uHash = keccak256(abi.encodePacked(u));\n for (uint256 i = 0; i < nonceSet.length; i++) {\n if (nonceSet[i] == uHash) {\n seen = true;\n break;\n }\n }\n require(!seen, \"Nonce already seen!\");\n require(zetherverifier.verifyTransfer(CLn, CRn, C, D, y, lastGlobalUpdate, u, proof), \"Transfer proof verification failed!\");\n\n nonceSet.push(uHash);\n emit TransferOccurred(y);\n }\n\n function burn(bytes32[2] memory y, uint256 bTransfer, bytes32[2] memory u, bytes memory proof) public {\n bytes32 yHash = keccak256(abi.encodePacked(y));\n rollOver(yHash);\n\n require(0 <= bTransfer && bTransfer <= MAX, \"Transfer amount out of range.\");\n bytes32[2][2] memory scratch = pTransfers[yHash]; // could technically use sload, but... let's not go there.\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(mload(scratch)))\n mstore(add(m, 0x20), mload(add(mload(scratch), 0x20)))\n // load bulletproof generator here\n mstore(add(m, 0x40), 0x077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d4) // g_x\n mstore(add(m, 0x60), 0x01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f875) // g_y\n mstore(add(m, 0x80), sub(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001, bTransfer))\n result := and(result, staticcall(gas, 0x07, add(m, 0x40), 0x60, add(m, 0x40), 0x40))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(scratch), 0x40)) // scratch[0] = acc[yHash][0] * g ^ -b, scratch[1] doesn't change\n if iszero(result) {\n revert(0, 0)\n }\n }\n pTransfers[yHash] = scratch; // debit y's balance\n scratch = acc[yHash]; // simulate debit of acc---just for use in verification, won't be applied\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(mload(scratch)))\n mstore(add(m, 0x20), mload(add(mload(scratch), 0x20)))\n mstore(add(m, 0x40), 0x077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d4) // g_x\n mstore(add(m, 0x60), 0x01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f875) // g_y\n mstore(add(m, 0x80), sub(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001, bTransfer))\n result := and(result, staticcall(gas, 0x07, add(m, 0x40), 0x60, add(m, 0x40), 0x40))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(scratch), 0x40)) // scratch[0] = acc[yHash][0] * g ^ -b, scratch[1] doesn't change\n if iszero(result) {\n revert(0, 0)\n }\n }\n bool seen = false;\n bytes32 uHash = keccak256(abi.encodePacked(u));\n for (uint256 i = 0; i < nonceSet.length; i++) {\n if (nonceSet[i] == uHash) { // does this have to repeat the sload for each iteration?!? revisit\n seen = true;\n break;\n }\n }\n require(!seen, \"Nonce already seen!\");\n require(burnverifier.verifyBurn(scratch[0], scratch[1], y, bTransfer, lastGlobalUpdate, u, msg.sender, proof), \"Burn proof verification failed!\");\n require(coin.transfer(msg.sender, bTransfer), \"This shouldn't fail... Something went severely wrong.\");\n bTotal -= bTransfer;\n nonceSet.push(uHash);\n }\n}\n", + "metadata": "{\"compiler\":{\"version\":\"0.5.4+commit.9549d8ff\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"y\",\"type\":\"bytes32[2]\"},{\"name\":\"bTransfer\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"epochLength\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"C\",\"type\":\"bytes32[2][]\"},{\"name\":\"D\",\"type\":\"bytes32[2]\"},{\"name\":\"y\",\"type\":\"bytes32[2][]\"},{\"name\":\"u\",\"type\":\"bytes32[2]\"},{\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"y\",\"type\":\"bytes32[2]\"},{\"name\":\"bTransfer\",\"type\":\"uint256\"},{\"name\":\"u\",\"type\":\"bytes32[2]\"},{\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"burn\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"y\",\"type\":\"bytes32[2][]\"},{\"name\":\"epoch\",\"type\":\"uint256\"}],\"name\":\"simulateAccounts\",\"outputs\":[{\"name\":\"accounts\",\"type\":\"bytes32[2][2][]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_coin\",\"type\":\"address\"},{\"name\":\"_zether\",\"type\":\"address\"},{\"name\":\"_burn\",\"type\":\"address\"},{\"name\":\"_epochLength\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"parties\",\"type\":\"bytes32[2][]\"}],\"name\":\"TransferOccurred\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZSC.sol\":\"ZSC\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/BurnVerifier.sol\":{\"keccak256\":\"0x0bb62f7966acd8b633e82323b0d33f0029921b3e3bfd2d94fbcef0cddee84d7e\",\"urls\":[\"bzzr://972d7741e2ab8fff1724dac77fd5a0c5cb9a3146e272bbfda35cc7997e3b707b\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/CashToken.sol\":{\"keccak256\":\"0x82bb618b45f209947dab386268264b59af92d89e32057fcddb43d77444bf5ebd\",\"urls\":[\"bzzr://0e7157c5c1bb4b64fbf43071131558130666196f6e7643e4ca7a5461436f9a29\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/Utils.sol\":{\"keccak256\":\"0x3b410db08d55d9540e8e795474410304be456ca3a36beb8c209019344593b267\",\"urls\":[\"bzzr://f5eaba23ec02eb7c30ce30f795aa0d7b1ae29d61d8111e2955a0f505bd1b328a\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZSC.sol\":{\"keccak256\":\"0x5a6e3a7d586881caaeabffddc3993b0f61344a13daf6492dc9b0fdfa266f2f6c\",\"urls\":[\"bzzr://ad66c95c7529b537a22e4138759c3d7a63b97cc0276ad2f2d19b11941e4ed419\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZetherVerifier.sol\":{\"keccak256\":\"0x0d0c52e9560f2a5477cd4f1748cecb69eb1c301c5d9b32e11cc851db9da88b04\",\"urls\":[\"bzzr://00b55719106afb23d143d5a8767c3deb71877ebc16a9430b440eec4e8766e038\"]},\"openzeppelin-solidity/contracts/GSN/Context.sol\":{\"keccak256\":\"0x90a3995645af7562d84b9d69363ffa5ae7217714ab61e951bf7bc450f40e4061\",\"urls\":[\"bzzr://51482c01bddf23793bddee43b60ab9578a62948a4f2082def24ea792a553b055\"]},\"openzeppelin-solidity/contracts/access/Roles.sol\":{\"keccak256\":\"0xb002c378d7b82a101bd659c341518953ca0919d342c0a400196982c0e7e7bcdb\",\"urls\":[\"bzzr://bd34c1ce05b5b2b3a62fc02e160f6805b1cadd476854664f433c685b2fda8dad\"]},\"openzeppelin-solidity/contracts/access/roles/MinterRole.sol\":{\"keccak256\":\"0xbe8eef6f2cb4e427f5c5d8a76865ccd06e55a4f1d6671ba312d45bfa705aedbf\",\"urls\":[\"bzzr://946a26eebf5d294534471d07c4dc449ce3123e9fc2994bdfcd99dff1d09cc1af\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x640b6dee7a4b830bdfd52b5031a07fc2b12209f5b2e29e5d364a7d37f69d8076\",\"urls\":[\"bzzr://292843005e754e752644f767477ec5ad7a1ffc91ddb18c38b8079c62f3993cad\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x65a4078c03875c25413a068ce9cfdd7e68a90f8786612d1189c89341e6e3b802\",\"urls\":[\"bzzr://fefcc5ec4e313a66c9fd38375983b5973c528e7e19b6d37c2f1ac6745295e6e2\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol\":{\"keccak256\":\"0xa2b957cf89692c504962afb7506999155f83385373f808243246cd5879de5940\",\"urls\":[\"bzzr://812521b94ef1bd30b0a93e14a97a0e79e2bf4cb607aa47c21c8177966a79fd1a\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe5bb0f57cff3e299f360052ba50f1ea0fff046df2be070b6943e0e3c3fdad8a9\",\"urls\":[\"bzzr://cf2d583b8dce38d0617fdcd65f2fd9f126fe17b7f683b5a515ea9d2762d8b062\"]}},\"version\":1}", + "bytecode": "0x6080604052600060085534801561001557600080fd5b506040516080806127cb8339810180604052608081101561003557600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190505050836000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806003819055505050505061268b806101406000396000f3fe608060405234801561001057600080fd5b5060043610610074576000357c0100000000000000000000000000000000000000000000000000000000900480635464befb1461007957806357d775f8146100b15780635ec7ccfd146100cf57806373663b5f146103ac5780637ea9712f146104f3575b600080fd5b6100af6004803603606081101561008f57600080fd5b810190808060400190919291929080359060200190929190505050610611565b005b6100b9610b10565b6040518082815260200191505060405180910390f35b6103aa600480360360e08110156100e557600080fd5b810190808035906020019064010000000081111561010257600080fd5b82018360208201111561011457600080fd5b8035906020019184604083028401116401000000008311171561013657600080fd5b9190808060200260200160405190810160405280939291908181526020016000905b828210156101af578484839050604002016002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505081526020019060010190610158565b5050505050919291929080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561021357600080fd5b82018360208201111561022557600080fd5b8035906020019184604083028401116401000000008311171561024757600080fd5b9190808060200260200160405190810160405280939291908181526020016000905b828210156102c0578484839050604002016002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505081526020019060010190610269565b5050505050919291929080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561032457600080fd5b82018360208201111561033657600080fd5b8035906020019184600183028401116401000000008311171561035857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610b16565b005b6104f1600480360360c08110156103c257600080fd5b8101908080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019092919080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561046b57600080fd5b82018360208201111561047d57600080fd5b8035906020019184600183028401116401000000008311171561049f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611519565b005b6105746004803603604081101561050957600080fd5b810190808035906020019064010000000081111561052657600080fd5b82018360208201111561053857600080fd5b8035906020019184604083028401116401000000008311171561055a57600080fd5b909192939192939080359060200190929190505050611e21565b60405180806020018281038252838181518152602001915080516000925b818410156106005782849060200190602002015160026000925b818410156105f25782846020020151600260200280838360005b838110156105e15780820151818401526020810190506105c6565b5050505090500192600101926105ac565b925050509260010192610592565b925050509250505060405180910390f35b6000826040516020018082600260200280828437600081840152601f19601f820116905080830192505050915050604051602081830303815290604052805190602001209050610660816120ed565b63ffffffff82111515156106dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4465706f73697420616d6f756e74206f7574206f662072616e67652e0000000081525060200191505060405180910390fd5b6106e46123c0565b60056000838152602001908152602001600020600060028110151561070557fe5b60020201600280602002604051908101604052809291908260028015610740576020028201915b81548152602001906001019080831161072c575b50505050509050600160405182518152602083015160208201527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408201527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060820152846080820152604080820160606040840160075afa8216915060408360808360065afa821691508115156107d957600080fd5b5050806005600084815260200190815260200160002060006002811015156107fd57fe5b6002020190600261080f9291906123e2565b506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561090857600080fd5b505af115801561091c573d6000803e3d6000fd5b505050506040513d602081101561093257600080fd5b810190808051906020019092919050505015156109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f5472616e736665722066726f6d2073656e646572206661696c65642e0000000081525060200191505060405180910390fd5b63ffffffff6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a7657600080fd5b505afa158015610a8a573d6000803e3d6000fd5b505050506040513d6020811015610aa057600080fd5b810190808051906020019092919050505011151515610b0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806125e06028913960400191505060405180910390fd5b50505050565b60035481565b600083519050606081604051908082528060200260200182016040528015610b5857816020015b610b45612422565b815260200190600190039081610b3d5790505b509050606082604051908082528060200260200182016040528015610b9757816020015b610b84612422565b815260200190600190039081610b7c5790505b509050828851141515610c12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e707574206172726179206c656e677468206d69736d61746368210000000081525060200191505060405180910390fd5b60008090505b83811015610f8c5760008782815181101515610c3057fe5b906020019060200201516040516020018082600260200280838360005b83811015610c68578082015181840152602081019050610c4d565b50505050905001915050604051602081830303815290604052805190602001209050610c93816120ed565b610c9b612444565b60056000838152602001908152602001600020600280602002604051908101604052809291906000905b82821015610d1e57838260020201600280602002604051908101604052809291908260028015610d0a576020028201915b815481526020019060010190808311610cf6575b505050505081526020019060010190610cc5565b5050505090506001604051825151815260208351015160208201526020850260208e010151516040820152602080860260208f01015101517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470360608201526040835160808360065afa821691506020830151518152602080840151015160208201528b51604082015260208c01517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470360608201526040602084015160808360065afa82169150811515610df257600080fd5b50508060056000848152602001908152602001600020906002610e16929190612472565b5060046000838152602001908152602001600020600280602002604051908101604052809291906000905b82821015610e9a57838260020201600280602002604051908101604052809291908260028015610e86576020028201915b815481526020019060010190808311610e72575b505050505081526020019060010190610e41565b5050505090506001604051825151815260208351015160208201526020850260208e010151516040820152602080860260208f01015101517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703606082015260406020860260208901015160808360065afa821691506020830151518152602080840151015160208201528b51604082015260208c01517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703606082015260406020860260208801015160808360065afa82169150811515610f7b57600080fd5b505050508080600101915050610c18565b5060008090506000866040516020018082600260200280838360005b83811015610fc3578082015181840152602081019050610fa8565b5050505090500191505060405160208183030381529060405280519060200120905060008090505b60078054905081101561102f578160078281548110151561100857fe5b90600052602060002001541415611022576001925061102f565b8080600101915050610feb565b50811515156110a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f6e636520616c7265616479207365656e210000000000000000000000000081525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631659e67d85858d8d8d6008548e8e6040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001806020018060200189600260200280838360005b83811015611150578082015181840152602081019050611135565b505050509050018060200188815260200187600260200280838360005b8381101561118857808201518184015260208101905061116d565b505050509050018060200186810386528e8181518152602001915080516000925b818410156111f457828490602001906020020151600260200280838360005b838110156111e35780820151818401526020810190506111c8565b5050505090500192600101926111a9565b9250505086810385528d8181518152602001915080516000925b8184101561125957828490602001906020020151600260200280838360005b8381101561124857808201518184015260208101905061122d565b50505050905001926001019261120e565b9250505086810384528c8181518152602001915080516000925b818410156112be57828490602001906020020151600260200280838360005b838110156112ad578082015181840152602081019050611292565b505050509050019260010192611273565b9250505086810383528a8181518152602001915080516000925b8184101561132357828490602001906020020151600260200280838360005b838110156113125780820151818401526020810190506112f7565b5050505090500192600101926112d8565b92505050868103825287818151815260200191508051906020019080838360005b8381101561135f578082015181840152602081019050611344565b50505050905090810190601f16801561138c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060206040518083038186803b1580156113b457600080fd5b505afa1580156113c8573d6000803e3d6000fd5b505050506040513d60208110156113de57600080fd5b81019080805190602001909291905050501515611446576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806126086023913960400191505060405180910390fd5b60078190806001815401808255809150509060018203906000526020600020016000909192909190915055507f4ef6ed22b1551aeadeb80e67bb3a38788491e81527cc70a85bff611e9e51e18a8860405180806020018281038252838181518152602001915080516000925b818410156114fd57828490602001906020020151600260200280838360005b838110156114ec5780820151818401526020810190506114d1565b5050505090500192600101926114b2565b925050509250505060405180910390a150505050505050505050565b6000846040516020018082600260200280838360005b8381101561154a57808201518184015260208101905061152f565b50505050905001915050604051602081830303815290604052805190602001209050611575816120ed565b8360001115801561158a575063ffffffff8411155b15156115fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5472616e7366657220616d6f756e74206f7574206f662072616e67652e00000081525060200191505060405180910390fd5b611606612444565b60056000838152602001908152602001600020600280602002604051908101604052809291906000905b8282101561168957838260020201600280602002604051908101604052809291908260028015611675576020028201915b815481526020019060010190808311611661575b505050505081526020019060010190611630565b5050505090506001604051825151815260208351015160208201527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408201527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060820152867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001036080820152604080820160606040840160075afa821691506040835160808360065afa8216915081151561174657600080fd5b5050806005600084815260200190815260200160002090600261176a929190612472565b5060046000838152602001908152602001600020600280602002604051908101604052809291906000905b828210156117ee578382600202016002806020026040519081016040528092919082600280156117da576020028201915b8154815260200190600101908083116117c6575b505050505081526020019060010190611795565b5050505090506001604051825151815260208351015160208201527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408201527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060820152867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001036080820152604080820160606040840160075afa821691506040835160808360065afa821691508115156118ab57600080fd5b505060008090506000856040516020018082600260200280838360005b838110156118e35780820151818401526020810190506118c8565b5050505090500191505060405160208183030381529060405280519060200120905060008090505b60078054905081101561194f578160078281548110151561192857fe5b90600052602060002001541415611942576001925061194f565b808060010191505061190b565b50811515156119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f6e636520616c7265616479207365656e210000000000000000000000000081525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e1a999e846000600281101515611a1357fe5b6020020151856001600281101515611a2757fe5b60200201518b8b6008548c338d6040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018089600260200280838360005b83811015611a8a578082015181840152602081019050611a6f565b5050505090500188600260200280838360005b83811015611ab8578082015181840152602081019050611a9d565b5050505090500187600260200280838360005b83811015611ae6578082015181840152602081019050611acb565b5050505090500186815260200185815260200184600260200280838360005b83811015611b20578082015181840152602081019050611b05565b505050509050018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611b95578082015181840152602081019050611b7a565b50505050905090810190601f168015611bc25780820380516001836020036101000a031916815260200191505b50995050505050505050505060206040518083038186803b158015611be657600080fd5b505afa158015611bfa573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b81019080805190602001909291905050501515611c95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4275726e2070726f6f6620766572696669636174696f6e206661696c6564210081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611d5957600080fd5b505af1158015611d6d573d6000803e3d6000fd5b505050506040513d6020811015611d8357600080fd5b81019080805190602001909291905050501515611deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603581526020018061262b6035913960400191505060405180910390fd5b60078190806001815401808255809150509060018203906000526020600020016000909192909190915055505050505050505050565b6060600084849050905080604051908082528060200260200182016040528015611e6557816020015b611e526124c2565b815260200190600190039081611e4a5790505b50915060008090505b818110156120e45760008686838181101515611e8657fe5b9050604002016040516020018082600260200280828437600081840152601f19601f82011690508083019250505091505060405160208183030381529060405280519060200120905060046000828152602001908152602001600020600280602002604051908101604052809291906000905b82821015611f5257838260020201600280602002604051908101604052809291908260028015611f3e576020028201915b815481526020019060010190808311611f2a575b505050505081526020019060010190611ef9565b505050508483815181101515611f6457fe5b9060200190602002018190525084600660008381526020019081526020016000205410156120d657611f94612444565b60056000838152602001908152602001600020600280602002604051908101604052809291906000905b8282101561201757838260020201600280602002604051908101604052809291908260028015612003576020028201915b815481526020019060010190808311611fef575b505050505081526020019060010190611fbe565b5050505090506001604051825151815260208351015160208201526020850260208801015151516040820152602080860260208901015151015160608201526040602086026020890101515160808360065afa82169150602083015151815260208084015101516020820152602080860260208901015101515160408201526020806020870260208a0101510151015160608201526040602080870260208a010151015160808360065afa821691508115156120d257600080fd5b5050505b508080600101915050611e6e565b50509392505050565b6000600354428115156120fc57fe5b049050806006600084815260200190815260200160002054101561239c576121226124f0565b604080519081016040528060046000868152602001908152602001600020600280602002604051908101604052809291906000905b828210156121b05783826002020160028060200260405190810160405280929190826002801561219c576020028201915b815481526020019060010190808311612188575b505050505081526020019060010190612157565b50505050815260200160056000868152602001908152602001600020600280602002604051908101604052809291906000905b8282101561223c57838260020201600280602002604051908101604052809291908260028015612228576020028201915b815481526020019060010190808311612214575b5050505050815260200190600101906121e3565b50505050815250905060016040518251515181526020835151015160208201526020830151515160408201526020808401515101516060820152604083515160808360065afa82169150602083510151518152602080845101510151602082015260208084015101515160408201526020806020850151015101516060820152604060208451015160808360065afa821691508115156122db57600080fd5b50508060006002811015156122ec57fe5b602002015160046000858152602001908152602001600020906002612312929190612472565b50604080519081016040528060408051908101604052806000600102815260200160006001028152508152602001604080519081016040528060006001028152602001600060010281525081525060056000858152602001908152602001600020906002612381929190612472565b50816006600085815260200190815260200160002081905550505b8060085410156123bc5780600881905550600760006123bb919061251f565b5b5050565b6040805190810160405280600290602082028038833980820191505090505090565b8260028101928215612411579160200282015b828111156124105782518255916020019190600101906123f5565b5b50905061241e9190612540565b5090565b6040805190810160405280600290602082028038833980820191505090505090565b6080604051908101604052806002905b61245c612422565b8152602001906001900390816124545790505090565b826002800281019282156124b1579160200282015b828111156124b0578251829060026124a0929190612565565b5091602001919060020190612487565b5b5090506124be91906125a5565b5090565b6080604051908101604052806002905b6124da612422565b8152602001906001900390816124d25790505090565b610100604051908101604052806002905b6125096124c2565b8152602001906001900390816125015790505090565b508054600082559060005260206000209081019061253d9190612540565b50565b61256291905b8082111561255e576000816000905550600101612546565b5090565b90565b8260028101928215612594579160200282015b82811115612593578251825591602001919060010190612578565b5b5090506125a19190612540565b5090565b6125ce91905b808211156125ca57600081816125c191906125d1565b506002016125ab565b5090565b90565b50600081556001016000905556fe46756e642070757368657320636f6e74726163742070617374206d6178696d756d2076616c75652e5472616e736665722070726f6f6620766572696669636174696f6e206661696c656421546869732073686f756c646e2774206661696c2e2e2e20536f6d657468696e672077656e74207365766572656c792077726f6e672ea165627a7a72305820e7a0c545f8bb4cc6c369a0f443668c4a20b4e0709b8ef7781ec2618124661a160029", + "deployedBytecode": "0x608060405234801561001057600080fd5b5060043610610074576000357c0100000000000000000000000000000000000000000000000000000000900480635464befb1461007957806357d775f8146100b15780635ec7ccfd146100cf57806373663b5f146103ac5780637ea9712f146104f3575b600080fd5b6100af6004803603606081101561008f57600080fd5b810190808060400190919291929080359060200190929190505050610611565b005b6100b9610b10565b6040518082815260200191505060405180910390f35b6103aa600480360360e08110156100e557600080fd5b810190808035906020019064010000000081111561010257600080fd5b82018360208201111561011457600080fd5b8035906020019184604083028401116401000000008311171561013657600080fd5b9190808060200260200160405190810160405280939291908181526020016000905b828210156101af578484839050604002016002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505081526020019060010190610158565b5050505050919291929080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561021357600080fd5b82018360208201111561022557600080fd5b8035906020019184604083028401116401000000008311171561024757600080fd5b9190808060200260200160405190810160405280939291908181526020016000905b828210156102c0578484839050604002016002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505081526020019060010190610269565b5050505050919291929080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561032457600080fd5b82018360208201111561033657600080fd5b8035906020019184600183028401116401000000008311171561035857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610b16565b005b6104f1600480360360c08110156103c257600080fd5b8101908080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019092919080604001906002806020026040519081016040528092919082600260200280828437600081840152601f19601f82011690508083019250505050505091929192908035906020019064010000000081111561046b57600080fd5b82018360208201111561047d57600080fd5b8035906020019184600183028401116401000000008311171561049f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611519565b005b6105746004803603604081101561050957600080fd5b810190808035906020019064010000000081111561052657600080fd5b82018360208201111561053857600080fd5b8035906020019184604083028401116401000000008311171561055a57600080fd5b909192939192939080359060200190929190505050611e21565b60405180806020018281038252838181518152602001915080516000925b818410156106005782849060200190602002015160026000925b818410156105f25782846020020151600260200280838360005b838110156105e15780820151818401526020810190506105c6565b5050505090500192600101926105ac565b925050509260010192610592565b925050509250505060405180910390f35b6000826040516020018082600260200280828437600081840152601f19601f820116905080830192505050915050604051602081830303815290604052805190602001209050610660816120ed565b63ffffffff82111515156106dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4465706f73697420616d6f756e74206f7574206f662072616e67652e0000000081525060200191505060405180910390fd5b6106e46123c0565b60056000838152602001908152602001600020600060028110151561070557fe5b60020201600280602002604051908101604052809291908260028015610740576020028201915b81548152602001906001019080831161072c575b50505050509050600160405182518152602083015160208201527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408201527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060820152846080820152604080820160606040840160075afa8216915060408360808360065afa821691508115156107d957600080fd5b5050806005600084815260200190815260200160002060006002811015156107fd57fe5b6002020190600261080f9291906123e2565b506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561090857600080fd5b505af115801561091c573d6000803e3d6000fd5b505050506040513d602081101561093257600080fd5b810190808051906020019092919050505015156109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f5472616e736665722066726f6d2073656e646572206661696c65642e0000000081525060200191505060405180910390fd5b63ffffffff6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a7657600080fd5b505afa158015610a8a573d6000803e3d6000fd5b505050506040513d6020811015610aa057600080fd5b810190808051906020019092919050505011151515610b0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806125e06028913960400191505060405180910390fd5b50505050565b60035481565b600083519050606081604051908082528060200260200182016040528015610b5857816020015b610b45612422565b815260200190600190039081610b3d5790505b509050606082604051908082528060200260200182016040528015610b9757816020015b610b84612422565b815260200190600190039081610b7c5790505b509050828851141515610c12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f496e707574206172726179206c656e677468206d69736d61746368210000000081525060200191505060405180910390fd5b60008090505b83811015610f8c5760008782815181101515610c3057fe5b906020019060200201516040516020018082600260200280838360005b83811015610c68578082015181840152602081019050610c4d565b50505050905001915050604051602081830303815290604052805190602001209050610c93816120ed565b610c9b612444565b60056000838152602001908152602001600020600280602002604051908101604052809291906000905b82821015610d1e57838260020201600280602002604051908101604052809291908260028015610d0a576020028201915b815481526020019060010190808311610cf6575b505050505081526020019060010190610cc5565b5050505090506001604051825151815260208351015160208201526020850260208e010151516040820152602080860260208f01015101517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470360608201526040835160808360065afa821691506020830151518152602080840151015160208201528b51604082015260208c01517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470360608201526040602084015160808360065afa82169150811515610df257600080fd5b50508060056000848152602001908152602001600020906002610e16929190612472565b5060046000838152602001908152602001600020600280602002604051908101604052809291906000905b82821015610e9a57838260020201600280602002604051908101604052809291908260028015610e86576020028201915b815481526020019060010190808311610e72575b505050505081526020019060010190610e41565b5050505090506001604051825151815260208351015160208201526020850260208e010151516040820152602080860260208f01015101517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703606082015260406020860260208901015160808360065afa821691506020830151518152602080840151015160208201528b51604082015260208c01517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703606082015260406020860260208801015160808360065afa82169150811515610f7b57600080fd5b505050508080600101915050610c18565b5060008090506000866040516020018082600260200280838360005b83811015610fc3578082015181840152602081019050610fa8565b5050505090500191505060405160208183030381529060405280519060200120905060008090505b60078054905081101561102f578160078281548110151561100857fe5b90600052602060002001541415611022576001925061102f565b8080600101915050610feb565b50811515156110a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f6e636520616c7265616479207365656e210000000000000000000000000081525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631659e67d85858d8d8d6008548e8e6040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001806020018060200189600260200280838360005b83811015611150578082015181840152602081019050611135565b505050509050018060200188815260200187600260200280838360005b8381101561118857808201518184015260208101905061116d565b505050509050018060200186810386528e8181518152602001915080516000925b818410156111f457828490602001906020020151600260200280838360005b838110156111e35780820151818401526020810190506111c8565b5050505090500192600101926111a9565b9250505086810385528d8181518152602001915080516000925b8184101561125957828490602001906020020151600260200280838360005b8381101561124857808201518184015260208101905061122d565b50505050905001926001019261120e565b9250505086810384528c8181518152602001915080516000925b818410156112be57828490602001906020020151600260200280838360005b838110156112ad578082015181840152602081019050611292565b505050509050019260010192611273565b9250505086810383528a8181518152602001915080516000925b8184101561132357828490602001906020020151600260200280838360005b838110156113125780820151818401526020810190506112f7565b5050505090500192600101926112d8565b92505050868103825287818151815260200191508051906020019080838360005b8381101561135f578082015181840152602081019050611344565b50505050905090810190601f16801561138c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060206040518083038186803b1580156113b457600080fd5b505afa1580156113c8573d6000803e3d6000fd5b505050506040513d60208110156113de57600080fd5b81019080805190602001909291905050501515611446576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806126086023913960400191505060405180910390fd5b60078190806001815401808255809150509060018203906000526020600020016000909192909190915055507f4ef6ed22b1551aeadeb80e67bb3a38788491e81527cc70a85bff611e9e51e18a8860405180806020018281038252838181518152602001915080516000925b818410156114fd57828490602001906020020151600260200280838360005b838110156114ec5780820151818401526020810190506114d1565b5050505090500192600101926114b2565b925050509250505060405180910390a150505050505050505050565b6000846040516020018082600260200280838360005b8381101561154a57808201518184015260208101905061152f565b50505050905001915050604051602081830303815290604052805190602001209050611575816120ed565b8360001115801561158a575063ffffffff8411155b15156115fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5472616e7366657220616d6f756e74206f7574206f662072616e67652e00000081525060200191505060405180910390fd5b611606612444565b60056000838152602001908152602001600020600280602002604051908101604052809291906000905b8282101561168957838260020201600280602002604051908101604052809291908260028015611675576020028201915b815481526020019060010190808311611661575b505050505081526020019060010190611630565b5050505090506001604051825151815260208351015160208201527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408201527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060820152867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001036080820152604080820160606040840160075afa821691506040835160808360065afa8216915081151561174657600080fd5b5050806005600084815260200190815260200160002090600261176a929190612472565b5060046000838152602001908152602001600020600280602002604051908101604052809291906000905b828210156117ee578382600202016002806020026040519081016040528092919082600280156117da576020028201915b8154815260200190600101908083116117c6575b505050505081526020019060010190611795565b5050505090506001604051825151815260208351015160208201527f077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d460408201527f01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f8756060820152867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001036080820152604080820160606040840160075afa821691506040835160808360065afa821691508115156118ab57600080fd5b505060008090506000856040516020018082600260200280838360005b838110156118e35780820151818401526020810190506118c8565b5050505090500191505060405160208183030381529060405280519060200120905060008090505b60078054905081101561194f578160078281548110151561192857fe5b90600052602060002001541415611942576001925061194f565b808060010191505061190b565b50811515156119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f6e636520616c7265616479207365656e210000000000000000000000000081525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e1a999e846000600281101515611a1357fe5b6020020151856001600281101515611a2757fe5b60200201518b8b6008548c338d6040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018089600260200280838360005b83811015611a8a578082015181840152602081019050611a6f565b5050505090500188600260200280838360005b83811015611ab8578082015181840152602081019050611a9d565b5050505090500187600260200280838360005b83811015611ae6578082015181840152602081019050611acb565b5050505090500186815260200185815260200184600260200280838360005b83811015611b20578082015181840152602081019050611b05565b505050509050018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611b95578082015181840152602081019050611b7a565b50505050905090810190601f168015611bc25780820380516001836020036101000a031916815260200191505b50995050505050505050505060206040518083038186803b158015611be657600080fd5b505afa158015611bfa573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b81019080805190602001909291905050501515611c95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4275726e2070726f6f6620766572696669636174696f6e206661696c6564210081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611d5957600080fd5b505af1158015611d6d573d6000803e3d6000fd5b505050506040513d6020811015611d8357600080fd5b81019080805190602001909291905050501515611deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603581526020018061262b6035913960400191505060405180910390fd5b60078190806001815401808255809150509060018203906000526020600020016000909192909190915055505050505050505050565b6060600084849050905080604051908082528060200260200182016040528015611e6557816020015b611e526124c2565b815260200190600190039081611e4a5790505b50915060008090505b818110156120e45760008686838181101515611e8657fe5b9050604002016040516020018082600260200280828437600081840152601f19601f82011690508083019250505091505060405160208183030381529060405280519060200120905060046000828152602001908152602001600020600280602002604051908101604052809291906000905b82821015611f5257838260020201600280602002604051908101604052809291908260028015611f3e576020028201915b815481526020019060010190808311611f2a575b505050505081526020019060010190611ef9565b505050508483815181101515611f6457fe5b9060200190602002018190525084600660008381526020019081526020016000205410156120d657611f94612444565b60056000838152602001908152602001600020600280602002604051908101604052809291906000905b8282101561201757838260020201600280602002604051908101604052809291908260028015612003576020028201915b815481526020019060010190808311611fef575b505050505081526020019060010190611fbe565b5050505090506001604051825151815260208351015160208201526020850260208801015151516040820152602080860260208901015151015160608201526040602086026020890101515160808360065afa82169150602083015151815260208084015101516020820152602080860260208901015101515160408201526020806020870260208a0101510151015160608201526040602080870260208a010151015160808360065afa821691508115156120d257600080fd5b5050505b508080600101915050611e6e565b50509392505050565b6000600354428115156120fc57fe5b049050806006600084815260200190815260200160002054101561239c576121226124f0565b604080519081016040528060046000868152602001908152602001600020600280602002604051908101604052809291906000905b828210156121b05783826002020160028060200260405190810160405280929190826002801561219c576020028201915b815481526020019060010190808311612188575b505050505081526020019060010190612157565b50505050815260200160056000868152602001908152602001600020600280602002604051908101604052809291906000905b8282101561223c57838260020201600280602002604051908101604052809291908260028015612228576020028201915b815481526020019060010190808311612214575b5050505050815260200190600101906121e3565b50505050815250905060016040518251515181526020835151015160208201526020830151515160408201526020808401515101516060820152604083515160808360065afa82169150602083510151518152602080845101510151602082015260208084015101515160408201526020806020850151015101516060820152604060208451015160808360065afa821691508115156122db57600080fd5b50508060006002811015156122ec57fe5b602002015160046000858152602001908152602001600020906002612312929190612472565b50604080519081016040528060408051908101604052806000600102815260200160006001028152508152602001604080519081016040528060006001028152602001600060010281525081525060056000858152602001908152602001600020906002612381929190612472565b50816006600085815260200190815260200160002081905550505b8060085410156123bc5780600881905550600760006123bb919061251f565b5b5050565b6040805190810160405280600290602082028038833980820191505090505090565b8260028101928215612411579160200282015b828111156124105782518255916020019190600101906123f5565b5b50905061241e9190612540565b5090565b6040805190810160405280600290602082028038833980820191505090505090565b6080604051908101604052806002905b61245c612422565b8152602001906001900390816124545790505090565b826002800281019282156124b1579160200282015b828111156124b0578251829060026124a0929190612565565b5091602001919060020190612487565b5b5090506124be91906125a5565b5090565b6080604051908101604052806002905b6124da612422565b8152602001906001900390816124d25790505090565b610100604051908101604052806002905b6125096124c2565b8152602001906001900390816125015790505090565b508054600082559060005260206000209081019061253d9190612540565b50565b61256291905b8082111561255e576000816000905550600101612546565b5090565b90565b8260028101928215612594579160200282015b82811115612593578251825591602001919060010190612578565b5b5090506125a19190612540565b5090565b6125ce91905b808211156125ca57600081816125c191906125d1565b506002016125ab565b5090565b90565b50600081556001016000905556fe46756e642070757368657320636f6e74726163742070617374206d6178696d756d2076616c75652e5472616e736665722070726f6f6620766572696669636174696f6e206661696c656421546869732073686f756c646e2774206661696c2e2e2e20536f6d657468696e672077656e74207365766572656c792077726f6e672ea165627a7a72305820e7a0c545f8bb4cc6c369a0f443668c4a20b4e0709b8ef7781ec2618124661a160029", + "sourceMap": "111:13112:4:-;;;679:1;652:28;;1109:376;8:9:-1;5:2;;;30:1;27;20:12;5:2;1109:376:4;;;;;;;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;1109:376:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1342:5;1325:4;;:23;;;;;;;;;;;;;;;;;;1390:7;1358:14;;:40;;;;;;;;;;;;;;;;;;1436:5;1408:12;;:34;;;;;;;;;;;;;;;;;;1466:12;1452:11;:26;;;;1109:376;;;;111:13112;;;;;;", + "deployedSourceMap": "111:13112:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;111:13112:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5155:1317;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5155:1317:4;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;216:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6478:3757;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;6478:3757:4;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;6478:3757:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6478:3757:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;6478:3757:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6478:3757:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6478:3757:4;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;6478:3757:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6478:3757:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;6478:3757:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6478:3757:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6478:3757:4;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;6478:3757:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6478:3757:4;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;6478:3757:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6478:3757:4;;;;;;;;;;;;;;;:::i;:::-;;10241:2980;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;10241:2980:4;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;10241:2980:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;10241:2980:4;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;10241:2980:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10241:2980:4;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;10241:2980:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;10241:2980:4;;;;;;;;;;;;;;;:::i;:::-;;1491:2107;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1491:2107:4;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;1491:2107:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1491:2107:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;1491:2107:4;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1491:2107:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5155:1317;5230:13;5267:1;5256:13;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;5256:13:4;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5256:13:4;;;5246:24;;;;;;5230:40;;5280:15;5289:5;5280:8;:15::i;:::-;296:10;5314:9;:16;;5306:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5411:25;;:::i;:::-;5439:10;:17;5450:5;5439:17;;;;;;;;;;;5457:1;5439:20;;;;;;;;;;;;5411:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5506:1;5535:4;5529:11;5569:7;5563:14;5560:1;5553:25;5631:4;5622:7;5618:18;5612:25;5605:4;5602:1;5598:12;5591:47;5672:66;5665:4;5662:1;5658:12;5651:88;5773:66;5766:4;5763:1;5759:12;5752:88;5874:9;5867:4;5864:1;5860:12;5853:31;6049:4;6042;6039:1;6035:12;6029:4;6022;6019:1;6015:12;6009:4;6004:3;5993:61;5985:6;5981:74;5971:84;;6130:4;6121:7;6115:4;6112:1;6106:4;6101:3;6090:45;6082:6;6078:58;6068:68;;6159:6;6152:14;6149:2;;;6195:1;6192;6185:12;6149:2;5478:743;;6253:7;6230:10;:17;6241:5;6230:17;;;;;;;;;;;6248:1;6230:20;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;6278:4;;;;;;;;;;;:17;;;6296:10;6316:4;6323:9;6278:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6278:55:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6278:55:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6278:55:4;;;;;;;;;;;;;;;;6270:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;296:10;6384:4;;;;;;;;;;;:14;;;6407:4;6384:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6384:29:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6384:29:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6384:29:4;;;;;;;;;;;;;;;;:36;;6376:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5155:1317;;;;:::o;216:26::-;;;;:::o;6478:3757::-;6621:12;6636:1;:8;6621:23;;6654;6697:4;6680:22;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;6654:48;;6712:23;6755:4;6738:22;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;6712:48;;6790:4;6778:1;:8;:16;6770:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6843:9;6855:1;6843:13;;6838:2895;6862:4;6858:1;:8;6838:2895;;;6887:13;6924:1;6926;6924:4;;;;;;;;;;;;;;;;;;6913:16;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6913:16:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;6913:16:4;;;6903:27;;;;;;6887:43;;6944:15;6953:5;6944:8;:15::i;:::-;6973:28;;:::i;:::-;7004:10;:17;7015:5;7004:17;;;;;;;;;;;6973:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7076:1;7109:4;7103:11;7153:7;7147:14;7141:21;7138:1;7131:32;7227:4;7217:7;7211:14;7207:25;7201:32;7194:4;7191:1;7187:12;7180:54;7595:4;7592:1;7588:12;7581:4;7578:1;7574:12;7570:31;7564:38;7558:45;7551:4;7548:1;7544:12;7537:67;7764:4;7755;7752:1;7748:12;7741:4;7738:1;7734:12;7730:31;7724:38;7720:49;7714:56;7646:66;7642:129;7635:4;7632:1;7628:12;7621:151;7858:4;7848:7;7842:14;7836:4;7833:1;7827:4;7822:3;7811:52;7803:6;7799:65;7789:75;;7916:4;7907:7;7903:18;7897:25;7891:32;7888:1;7881:43;7999:4;7991;7982:7;7978:18;7972:25;7968:36;7962:43;7955:4;7952:1;7948:12;7941:65;8137:1;8131:8;8124:4;8121:1;8117:12;8110:30;8263:4;8260:1;8256:12;8250:19;8182:66;8178:92;8171:4;8168:1;8164:12;8157:114;8379:4;8371;8362:7;8358:18;8352:25;8346:4;8343:1;8337:4;8332:3;8321:63;8313:6;8309:76;8299:86;;8412:6;8405:14;8402:2;;;8452:1;8449;8442:12;8402:2;7044:1442;;8519:7;8499:10;:17;8510:5;8499:17;;;;;;;;;;;:27;;;;;;;:::i;:::-;;8591:3;:10;8595:5;8591:10;;;;;;;;;;;8581:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8656:1;8689:4;8683:11;8733:7;8727:14;8721:21;8718:1;8711:32;8807:4;8797:7;8791:14;8787:25;8781:32;8774:4;8771:1;8767:12;8760:54;8889:4;8886:1;8882:12;8875:4;8872:1;8868:12;8864:31;8858:38;8852:45;8845:4;8842:1;8838:12;8831:67;9058:4;9049;9046:1;9042:12;9035:4;9032:1;9028:12;9024:31;9018:38;9014:49;9008:56;8940:66;8936:129;8929:4;8926:1;8922:12;8915:151;9178:4;9169;9166:1;9162:12;9155:4;9150:3;9146:14;9142:33;9136:40;9130:4;9127:1;9121:4;9116:3;9105:78;9097:6;9093:91;9083:101;;9236:4;9227:7;9223:18;9217:25;9211:32;9208:1;9201:43;9319:4;9311;9302:7;9298:18;9292:25;9288:36;9282:43;9275:4;9272:1;9268:12;9261:65;9370:1;9364:8;9357:4;9354:1;9350:12;9343:30;9496:4;9493:1;9489:12;9483:19;9415:66;9411:92;9404:4;9401:1;9397:12;9390:114;9616:4;9607;9604:1;9600:12;9593:4;9588:3;9584:14;9580:33;9574:40;9568:4;9565:1;9559:4;9554:3;9543:78;9535:6;9531:91;9521:101;;9649:6;9642:14;9639:2;;;9689:1;9686;9679:12;9639:2;8624:1099;;;;6868:3;;;;;;;6838:2895;;;;9743:9;9755:5;9743:17;;9770:13;9807:1;9796:13;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9796:13:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9796:13:4;;;9786:24;;;;;;9770:40;;9825:9;9837:1;9825:13;;9820:163;9844:8;:15;;;;9840:1;:19;9820:163;;;9899:5;9884:8;9893:1;9884:11;;;;;;;;;;;;;;;;;;:20;9880:93;;;9931:4;9924:11;;9953:5;;9880:93;9861:3;;;;;;;9820:163;;;;10001:4;10000:5;9992:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10047:14;;;;;;;;;;;:29;;;10077:3;10082;10087:1;10090;10093;10096:16;;10114:1;10117:5;10047:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10047:76:4;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10047:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10047:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10047:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10047:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10047:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10047:76:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10047:76:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10047:76:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10047:76:4;;;;;;;;;;;;;;;;10039:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10174:8;10188:5;10174:20;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;10174:20:4;;;;;;;;;;;;;;;;;;;;;;10209:19;10226:1;10209:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10209:19:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;6478:3757;;;;;;;;;;:::o;10241:2980::-;10353:13;10390:1;10379:13;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10379:13:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10379:13:4;;;10369:24;;;;;;10353:40;;10403:15;10412:5;10403:8;:15::i;:::-;10442:9;10437:1;:14;;:34;;;;;296:10;10455:9;:16;;10437:34;10429:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10515:28;;:::i;:::-;10546:10;:17;10557:5;10546:17;;;;;;;;;;;10515:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10669:1;10698:4;10692:11;10738:7;10732:14;10726:21;10723:1;10716:32;10808:4;10798:7;10792:14;10788:25;10782:32;10775:4;10772:1;10768:12;10761:54;10896:66;10889:4;10886:1;10882:12;10875:88;11004:66;10997:4;10994:1;10990:12;10983:88;11184:9;11116:66;11112:82;11105:4;11102:1;11098:12;11091:104;11286:4;11279;11276:1;11272:12;11266:4;11259;11256:1;11252:12;11246:4;11241:3;11230:61;11222:6;11218:74;11208:84;;11374:4;11364:7;11358:14;11352:4;11349:1;11343:4;11338:3;11327:52;11319:6;11315:65;11305:75;;11469:6;11462:14;11459:2;;;11505:1;11502;11495:12;11459:2;10641:890;;11560:7;11540:10;:17;11551:5;11540:17;;;;;;;;;;;:27;;;;;;;:::i;:::-;;11608:3;:10;11612:5;11608:10;;;;;;;;;;;11598:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11739:1;11768:4;11762:11;11808:7;11802:14;11796:21;11793:1;11786:32;11878:4;11868:7;11862:14;11858:25;11852:32;11845:4;11842:1;11838:12;11831:54;11919:66;11912:4;11909:1;11905:12;11898:88;12027:66;12020:4;12017:1;12013:12;12006:88;12207:9;12139:66;12135:82;12128:4;12125:1;12121:12;12114:104;12309:4;12302;12299:1;12295:12;12289:4;12282;12279:1;12275:12;12269:4;12264:3;12253:61;12245:6;12241:74;12231:84;;12397:4;12387:7;12381:14;12375:4;12372:1;12366:4;12361:3;12350:52;12342:6;12338:65;12328:75;;12492:6;12485:14;12482:2;;;12528:1;12525;12518:12;12482:2;11711:843;;12563:9;12575:5;12563:17;;12590:13;12627:1;12616:13;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12616:13:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12616:13:4;;;12606:24;;;;;;12590:40;;12645:9;12657:1;12645:13;;12640:231;12664:8;:15;;;;12660:1;:19;12640:231;;;12719:5;12704:8;12713:1;12704:11;;;;;;;;;;;;;;;;;;:20;12700:161;;;12819:4;12812:11;;12841:5;;12700:161;12681:3;;;;;;;12640:231;;;;12889:4;12888:5;12880:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12935:12;;;;;;;;;;;:23;;;12959:7;12967:1;12959:10;;;;;;;;;;;;;12971:7;12979:1;12971:10;;;;;;;;;;;;;12983:1;12986:9;12997:16;;13015:1;13018:10;13030:5;12935:101;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12935:101:4;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12935:101:4;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12935:101:4;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12935:101:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12935:101:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12935:101:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12935:101:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12935:101:4;;;;;;;;;;;;;;;;12927:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13090:4;;;;;;;;;;;:13;;;13104:10;13116:9;13090:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13090:36:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13090:36:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13090:36:4;;;;;;;;;;;;;;;;13082:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13194:8;13208:5;13194:20;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;13194:20:4;;;;;;;;;;;;;;;;;;;;;;10241:2980;;;;;;;;:::o;1491:2107::-;1580:31;2015:12;2030:1;;:8;;2015:23;;2079:4;2059:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2048:36;;2099:9;2111:1;2099:13;;2094:1498;2118:4;2114:1;:8;2094:1498;;;2143:13;2180:1;;2182;2180:4;;;;;;;;;;;;;;2169:16;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;2169:16:4;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2169:16:4;;;2159:27;;;;;;2143:43;;2214:3;:10;2218:5;2214:10;;;;;;;;;;;2200:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;2209:1;2200:11;;;;;;;;;;;;;;;;;:24;;;;2264:5;2242:12;:19;2255:5;2242:19;;;;;;;;;;;;:27;2238:1344;;;2289:28;;:::i;:::-;2320:10;:17;2331:5;2320:17;;;;;;;;;;;2289:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2400:1;2437:4;2431:11;2485:7;2479:14;2473:21;2470:1;2463:32;2563:4;2553:7;2547:14;2543:25;2537:32;2530:4;2527:1;2523:12;2516:54;2662:4;2659:1;2655:12;2648:4;2638:8;2634:19;2630:38;2624:45;2618:52;2612:59;2605:4;2602:1;2598:12;2591:81;2778:4;2768;2765:1;2761:12;2754:4;2744:8;2740:19;2736:38;2730:45;2724:52;2720:63;2714:70;2707:4;2704:1;2700:12;2693:92;2913:4;2903;2900:1;2896:12;2889:4;2879:8;2875:19;2871:38;2865:45;2859:52;2853:4;2850:1;2844:4;2839:3;2828:90;2820:6;2816:103;2806:113;;2975:4;2966:7;2962:18;2956:25;2950:32;2947:1;2940:43;3062:4;3054;3045:7;3041:18;3035:25;3031:36;3025:43;3018:4;3015:1;3011:12;3004:65;3174:4;3165;3162:1;3158:12;3151:4;3141:8;3137:19;3133:38;3127:45;3123:56;3117:63;3111:70;3104:4;3101:1;3097:12;3090:92;3299:4;3291;3282;3279:1;3275:12;3268:4;3258:8;3254:19;3250:38;3244:45;3240:56;3234:63;3230:74;3224:81;3217:4;3214:1;3210:12;3203:103;3445:4;3437;3428;3425:1;3421:12;3414:4;3404:8;3400:19;3396:38;3390:45;3386:56;3380:63;3374:4;3371:1;3365:4;3360:3;3349:101;3341:6;3337:114;3327:124;;3482:6;3475:14;3472:2;;;3526:1;3523;3516:12;3472:2;2364:1204;;;;2094:1498;2124:3;;;;;;;2094:1498;;;;1491:2107;;;;;;:::o;3604:1545::-;3656:9;3686:11;;3668:15;:29;;;;;;;;3656:41;;3733:1;3711:12;:19;3724:5;3711:19;;;;;;;;;;;;:23;3707:1327;;;3750:31;;:::i;:::-;:65;;;;;;;;;3785:3;:10;3789:5;3785:10;;;;;;;;;;;3750:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3797:10;:17;3808:5;3797:17;;;;;;;;;;;3750:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3870:1;3903:4;3897:11;3953:7;3947:14;3941:21;3935:28;3932:1;3925:39;4035:4;4024:7;4018:14;4012:21;4008:32;4002:39;3995:4;3992:1;3988:12;3981:61;4111:4;4102:7;4098:18;4092:25;4086:32;4080:39;4073:4;4070:1;4066:12;4059:61;4202:4;4193;4184:7;4180:18;4174:25;4168:32;4164:43;4158:50;4151:4;4148:1;4144:12;4137:72;4302:4;4291:7;4285:14;4279:21;4273:4;4270:1;4264:4;4259:3;4248:59;4240:6;4236:72;4226:82;;4367:4;4357:7;4351:14;4347:25;4341:32;4335:39;4332:1;4325:50;4457:4;4449;4439:7;4433:14;4429:25;4423:32;4419:43;4413:50;4406:4;4403:1;4399:12;4392:72;4545:4;4537;4528:7;4524:18;4518:25;4514:36;4508:43;4502:50;4495:4;4492:1;4488:12;4481:72;4646:4;4638;4630;4621:7;4617:18;4611:25;4607:36;4601:43;4597:54;4591:61;4584:4;4581:1;4577:12;4570:83;4757:4;4749;4739:7;4733:14;4729:25;4723:32;4717:4;4714:1;4708:4;4703:3;4692:70;4684:6;4680:83;4670:93;;4790:6;4783:14;4780:2;;;4830:1;4827;4820:12;4780:2;3838:1026;;4890:7;4898:1;4890:10;;;;;;;;;;;;;4877:3;:10;4881:5;4877:10;;;;;;;;;;;:23;;;;;;;:::i;:::-;;4914:72;;;;;;;;;;;;;;;;;;4944:1;4936:10;;4914:72;;;;4956:1;4948:10;;4914:72;;;;;;;;;;;;;;;;4970:1;4962:10;;4914:72;;;;4982:1;4974:10;;4914:72;;;;;;:10;:17;4925:5;4914:17;;;;;;;;;;;:72;;;;;;;:::i;:::-;;5022:1;5000:12;:19;5013:5;5000:19;;;;;;;;;;;:23;;;;3707:1327;;5066:1;5047:16;;:20;5043:100;;;5102:1;5083:16;:20;;;;5124:8;;5117:15;;;;:::i;:::-;5043:100;3604:1545;;:::o;111:13112::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;111:13112:4;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;111:13112:4;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o", + "source": "pragma solidity 0.5.4;\n\nimport './ZetherVerifier.sol';\nimport './BurnVerifier.sol';\nimport './CashToken.sol';\n\ncontract ZSC {\n CashToken coin;\n ZetherVerifier zetherverifier;\n BurnVerifier burnverifier;\n uint256 public epochLength; // now in milliseconds.\n\n uint256 constant MAX = 4294967295; // 2^32 - 1 // no sload for constants...!\n mapping(bytes32 => bytes32[2][2]) acc; // main account mapping\n mapping(bytes32 => bytes32[2][2]) pTransfers; // storage for pending transfers\n mapping(bytes32 => uint256) lastRollOver;\n bytes32[] nonceSet; // would be more natural to use a mapping, but they can't be deleted / reset!\n uint256 lastGlobalUpdate = 0; // will be also used as a proxy for \"current epoch\", seeing as rollovers will be anticipated\n // not implementing account locking for now...revisit\n\n event TransferOccurred(bytes32[2][] parties); // all parties will be notified, client can determine whether it was real or not.\n // arg is still necessary for transfers---not even so much to know when you received a transfer, as to know when you got rolled over.\n\n constructor(address _coin, address _zether, address _burn, uint256 _epochLength) public {\n // epoch length, like block.time, is in _seconds_. 4 is the minimum!!! (To allow a withdrawal to go through.)\n coin = CashToken(_coin);\n zetherverifier = ZetherVerifier(_zether);\n burnverifier = BurnVerifier(_burn);\n epochLength = _epochLength;\n }\n\n function simulateAccounts(bytes32[2][] calldata y, uint256 epoch) view external returns (bytes32[2][2][] memory accounts) {\n // all of this could be assembled locally by querying `acc` and `pTransfers` (and `lastRollOver`) and assembling things by hand\n // turns out this is extremely _slow_ though, because of the ~ 4 * N queries which must be made. turns out it's much faster\n // to simply move the entire process into a contract method, and in fact this allows us to make the above 3 private\n uint256 size = y.length;\n accounts = new bytes32[2][2][](size);\n for (uint256 i = 0; i < size; i++) {\n bytes32 yHash = keccak256(abi.encode(y[i]));\n accounts[i] = acc[yHash];\n if (lastRollOver[yHash] < epoch) {\n bytes32[2][2] memory scratch = pTransfers[yHash];\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(mload(scratch)))\n mstore(add(m, 0x20), mload(add(mload(scratch), 0x20)))\n mstore(add(m, 0x40), mload(mload(mload(add(add(accounts, 0x20), mul(i, 0x20))))))\n mstore(add(m, 0x60), mload(add(mload(mload(add(add(accounts, 0x20), mul(i, 0x20)))), 0x20)))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(mload(add(add(accounts, 0x20), mul(i, 0x20)))), 0x40))\n mstore(m, mload(mload(add(scratch, 0x20))))\n mstore(add(m, 0x20), mload(add(mload(add(scratch, 0x20)), 0x20)))\n mstore(add(m, 0x40), mload(mload(add(mload(add(add(accounts, 0x20), mul(i, 0x20))), 0x20))))\n mstore(add(m, 0x60), mload(add(mload(add(mload(add(add(accounts, 0x20), mul(i, 0x20))), 0x20)), 0x20)))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(mload(add(add(accounts, 0x20), mul(i, 0x20))), 0x20)), 0x40))\n if iszero(result) {\n revert(0, 0)\n }\n }\n }\n }\n }\n\n function rollOver(bytes32 yHash) internal {\n uint256 e = block.timestamp / epochLength;\n if (lastRollOver[yHash] < e) {\n bytes32[2][2][2] memory scratch = [acc[yHash], pTransfers[yHash]];\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(mload(mload(scratch))))\n mstore(add(m, 0x20), mload(add(mload(mload(scratch)), 0x20)))\n mstore(add(m, 0x40), mload(mload(mload(add(scratch, 0x20)))))\n mstore(add(m, 0x60), mload(add(mload(mload(add(scratch, 0x20))), 0x20)))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(mload(scratch)), 0x40))\n mstore(m, mload(mload(add(mload(scratch), 0x20))))\n mstore(add(m, 0x20), mload(add(mload(add(mload(scratch), 0x20)), 0x20)))\n mstore(add(m, 0x40), mload(mload(add(mload(add(scratch, 0x20)), 0x20))))\n mstore(add(m, 0x60), mload(add(mload(add(mload(add(scratch, 0x20)), 0x20)), 0x20)))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(mload(scratch), 0x20)), 0x40))\n if iszero(result) {\n revert(0, 0)\n }\n }\n acc[yHash] = scratch[0];\n pTransfers[yHash] = [[bytes32(0), bytes32(0)], [bytes32(0), bytes32(0)]];\n lastRollOver[yHash] = e;\n }\n if (lastGlobalUpdate < e) {\n lastGlobalUpdate = e;\n delete nonceSet;\n }\n }\n\n function fund(bytes32[2] calldata y, uint256 bTransfer) external {\n bytes32 yHash = keccak256(abi.encode(y));\n rollOver(yHash);\n\n require(bTransfer <= MAX, \"Deposit amount out of range.\"); // uint, so other way not necessary?\n\n bytes32[2] memory scratch = pTransfers[yHash][0];\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(scratch))\n mstore(add(m, 0x20), mload(add(scratch, 0x20)))\n mstore(add(m, 0x40), 0x077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d4)\n mstore(add(m, 0x60), 0x01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f875)\n mstore(add(m, 0x80), bTransfer) // b will hopefully be a primitive / literal and not a pointer / address?\n result := and(result, staticcall(gas, 0x07, add(m, 0x40), 0x60, add(m, 0x40), 0x40))\n result := and(result, staticcall(gas, 0x06, m, 0x80, scratch, 0x40))\n if iszero(result) {\n revert(0, 0)\n }\n }\n pTransfers[yHash][0] = scratch;\n require(coin.transferFrom(msg.sender, address(this), bTransfer), \"Transfer from sender failed.\");\n require(coin.balanceOf(address(this)) <= MAX, \"Fund pushes contract past maximum value.\");\n }\n\n function transfer(bytes32[2][] memory C, bytes32[2] memory D, bytes32[2][] memory y, bytes32[2] memory u, bytes memory proof) public {\n uint256 size = y.length;\n bytes32[2][] memory CLn = new bytes32[2][](size);\n bytes32[2][] memory CRn = new bytes32[2][](size);\n require(C.length == size, \"Input array length mismatch!\");\n\n for (uint256 i = 0; i < size; i++) {\n bytes32 yHash = keccak256(abi.encode(y[i]));\n rollOver(yHash);\n bytes32[2][2] memory scratch = pTransfers[yHash];\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(mload(scratch)))\n mstore(add(m, 0x20), mload(add(mload(scratch), 0x20)))\n // calldatacopy(add(m, 0x40), add(0x104, mul(i, 0x40)), 0x40) // copy C[i] onto running block\n // having to change external --> public to avoid stacktoodeep\n // as a result, have to use the below two lines instead of the above single line.\n mstore(add(m, 0x40), mload(mload(add(add(C, 0x20), mul(i, 0x20)))))\n mstore(add(m, 0x60), sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(add(mload(add(add(C, 0x20), mul(i, 0x20))), 0x20))))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(scratch), 0x40))\n mstore(m, mload(mload(add(scratch, 0x20))))\n mstore(add(m, 0x20), mload(add(mload(add(scratch, 0x20)), 0x20)))\n // calldatacopy(add(m, 0x40), 0x24, 0x40) // copy R onto running block\n mstore(add(m, 0x40), mload(D))\n mstore(add(m, 0x60), sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(add(D, 0x20)))) // invert!\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(scratch, 0x20)), 0x40))\n if iszero(result) {\n revert(0, 0)\n }\n }\n pTransfers[yHash] = scratch; // credit / debit / neither y's account.\n scratch = acc[yHash];\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(mload(scratch)))\n mstore(add(m, 0x20), mload(add(mload(scratch), 0x20)))\n mstore(add(m, 0x40), mload(mload(add(add(C, 0x20), mul(i, 0x20)))))\n mstore(add(m, 0x60), sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(add(mload(add(add(C, 0x20), mul(i, 0x20))), 0x20))))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(add(CLn, 0x20), mul(i, 0x20))), 0x40))\n mstore(m, mload(mload(add(scratch, 0x20))))\n mstore(add(m, 0x20), mload(add(mload(add(scratch, 0x20)), 0x20)))\n mstore(add(m, 0x40), mload(D))\n mstore(add(m, 0x60), sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(add(D, 0x20))))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(add(CRn, 0x20), mul(i, 0x20))), 0x40))\n if iszero(result) {\n revert(0, 0)\n }\n }\n }\n\n bool seen = false;\n bytes32 uHash = keccak256(abi.encode(u));\n for (uint256 i = 0; i < nonceSet.length; i++) {\n if (nonceSet[i] == uHash) {\n seen = true;\n break;\n }\n }\n require(!seen, \"Nonce already seen!\");\n require(zetherverifier.verifyTransfer(CLn, CRn, C, D, y, lastGlobalUpdate, u, proof), \"Transfer proof verification failed!\");\n\n nonceSet.push(uHash);\n emit TransferOccurred(y);\n }\n\n function burn(bytes32[2] memory y, uint256 bTransfer, bytes32[2] memory u, bytes memory proof) public {\n bytes32 yHash = keccak256(abi.encode(y));\n rollOver(yHash);\n\n require(0 <= bTransfer && bTransfer <= MAX, \"Transfer amount out of range.\");\n bytes32[2][2] memory scratch = pTransfers[yHash]; // could technically use sload, but... let's not go there.\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(mload(scratch)))\n mstore(add(m, 0x20), mload(add(mload(scratch), 0x20)))\n // load bulletproof generator here\n mstore(add(m, 0x40), 0x077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d4) // g_x\n mstore(add(m, 0x60), 0x01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f875) // g_y\n mstore(add(m, 0x80), sub(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001, bTransfer))\n result := and(result, staticcall(gas, 0x07, add(m, 0x40), 0x60, add(m, 0x40), 0x40))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(scratch), 0x40)) // scratch[0] = acc[yHash][0] * g ^ -b, scratch[1] doesn't change\n if iszero(result) {\n revert(0, 0)\n }\n }\n pTransfers[yHash] = scratch; // debit y's balance\n scratch = acc[yHash]; // simulate debit of acc---just for use in verification, won't be applied\n assembly {\n let result := 1\n let m := mload(0x40)\n mstore(m, mload(mload(scratch)))\n mstore(add(m, 0x20), mload(add(mload(scratch), 0x20)))\n mstore(add(m, 0x40), 0x077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d4) // g_x\n mstore(add(m, 0x60), 0x01485efa927f2ad41bff567eec88f32fb0a0f706588b4e41a8d587d008b7f875) // g_y\n mstore(add(m, 0x80), sub(0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001, bTransfer))\n result := and(result, staticcall(gas, 0x07, add(m, 0x40), 0x60, add(m, 0x40), 0x40))\n result := and(result, staticcall(gas, 0x06, m, 0x80, mload(scratch), 0x40)) // scratch[0] = acc[yHash][0] * g ^ -b, scratch[1] doesn't change\n if iszero(result) {\n revert(0, 0)\n }\n }\n bool seen = false;\n bytes32 uHash = keccak256(abi.encode(u));\n for (uint256 i = 0; i < nonceSet.length; i++) {\n if (nonceSet[i] == uHash) { // does this have to repeat the sload for each iteration?!? revisit\n seen = true;\n break;\n }\n }\n require(!seen, \"Nonce already seen!\");\n require(burnverifier.verifyBurn(scratch[0], scratch[1], y, bTransfer, lastGlobalUpdate, u, msg.sender, proof), \"Burn proof verification failed!\");\n require(coin.transfer(msg.sender, bTransfer), \"This shouldn't fail... Something went severely wrong.\");\n nonceSet.push(uHash);\n }\n}\n", "sourcePath": "/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZSC.sol", "compiler": { "name": "solc", @@ -161,7 +161,7 @@ }, "networks": {}, "schemaVersion": "3.0.19", - "updatedAt": "2019-12-12T19:10:52.517Z", + "updatedAt": "2019-12-26T18:28:14.456Z", "devdoc": { "methods": {} }, diff --git a/packages/contract-artifacts/artifacts/ZetherVerifier.json b/packages/contract-artifacts/artifacts/ZetherVerifier.json index 2632e3db..ec1e36d1 100644 --- a/packages/contract-artifacts/artifacts/ZetherVerifier.json +++ b/packages/contract-artifacts/artifacts/ZetherVerifier.json @@ -55,12 +55,12 @@ "type": "function" } ], - "metadata": "{\"compiler\":{\"version\":\"0.5.4+commit.9549d8ff\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"CLn\",\"type\":\"bytes32[2][]\"},{\"name\":\"CRn\",\"type\":\"bytes32[2][]\"},{\"name\":\"C\",\"type\":\"bytes32[2][]\"},{\"name\":\"D\",\"type\":\"bytes32[2]\"},{\"name\":\"y\",\"type\":\"bytes32[2][]\"},{\"name\":\"epoch\",\"type\":\"uint256\"},{\"name\":\"u\",\"type\":\"bytes32[2]\"},{\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"verifyTransfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZetherVerifier.sol\":\"ZetherVerifier\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/Utils.sol\":{\"keccak256\":\"0x3b410db08d55d9540e8e795474410304be456ca3a36beb8c209019344593b267\",\"urls\":[\"bzzr://f5eaba23ec02eb7c30ce30f795aa0d7b1ae29d61d8111e2955a0f505bd1b328a\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZetherVerifier.sol\":{\"keccak256\":\"0xbbd88d4d194130d5f591d292b959760d24b14926e1c5dc0c5721a2aa6fb988d2\",\"urls\":[\"bzzr://174b608d3a71052490df702b7214e8b04ceeab3836623658b2d841b82f750311\"]}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50620000616040805190810160405280600181526020017f47000000000000000000000000000000000000000000000000000000000000008152506200022f640100000000026401000000009004565b60026000820151816000015560208201518160010155905050620000c96040805190810160405280600181526020017f56000000000000000000000000000000000000000000000000000000000000008152506200022f640100000000026401000000009004565b6004600082015181600001556020820151816001015590505060008090505b604081101562000228576000620001446040805190810160405280600181526020017f470000000000000000000000000000000000000000000000000000000000000081525083620002b2640100000000026401000000009004565b9080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050506001620001d86040805190810160405280600181526020017f480000000000000000000000000000000000000000000000000000000000000081525083620002b2640100000000026401000000009004565b9080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050508080600101915050620000e8565b5062000591565b6200023962000480565b620002ab7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4783604051602001620002719190620004ec565b60405160208183030381529060405280519060200120600190048115156200029557fe5b0662000338640100000000026401000000009004565b9050919050565b620002bc62000480565b620003307f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478484604051602001620002f692919062000505565b60405160208183030381529060405280519060200120600190048115156200031a57fe5b0662000338640100000000026401000000009004565b905092915050565b6200034262000480565b60005b600115620003f557600060036200036d85600362000412640100000000026401000000009004565b019050620003bb81600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4701811515620003a557fe5b0462000412640100000000026401000000009004565b915080620003da83600262000412640100000000026401000000009004565b1415620003e85750620003f5565b6001840193505062000345565b604080519081016040528084815260200182815250915050919050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa15156200047457600080fd5b80519250505092915050565b604080519081016040528060008152602001600081525090565b6000620004a78262000531565b620004b381856200053c565b9350620004c581856020860162000551565b80840191505092915050565b620004e6620004e08262000547565b62000587565b82525050565b6000620004fa82846200049a565b915081905092915050565b60006200051382856200049a565b9150620005218284620004d1565b6020820191508190509392505050565b600081519050919050565b600081905092915050565b6000819050919050565b60005b838110156200057157808201518184015260208101905062000554565b8381111562000581576000848401525b50505050565b6000819050919050565b61549880620005a16000396000f3fe608060405234801561001057600080fd5b5060043610610048576000357c0100000000000000000000000000000000000000000000000000000000900480631659e67d1461004d575b600080fd5b610067600480360361006291908101906149c7565b61007d565b6040516100749190614efb565b60405180910390f35b60006100876141f4565b600086519050806040519080825280602002602001820160405280156100c757816020015b6100b461423f565b8152602001906001900390816100ac5790505b5082600001819052508060405190808252806020026020018201604052801561010a57816020015b6100f761423f565b8152602001906001900390816100ef5790505b5082602001819052508060405190808252806020026020018201604052801561014d57816020015b61013a61423f565b8152602001906001900390816101325790505b5082604001819052508060405190808252806020026020018201604052801561019057816020015b61017d61423f565b8152602001906001900390816101755790505b50826080018190525060008090505b818110156103f45760408051908101604052808d838151811015156101c057fe5b9060200190602002015160006002811015156101d857fe5b60200201516001900481526020018d838151811015156101f457fe5b90602001906020020151600160028110151561020c57fe5b60200201516001900481525083600001518281518110151561022a57fe5b9060200190602002018190525060408051908101604052808c8381518110151561025057fe5b90602001906020020151600060028110151561026857fe5b60200201516001900481526020018c8381518110151561028457fe5b90602001906020020151600160028110151561029c57fe5b6020020151600190048152508360200151828151811015156102ba57fe5b9060200190602002018190525060408051908101604052808b838151811015156102e057fe5b9060200190602002015160006002811015156102f857fe5b60200201516001900481526020018b8381518110151561031457fe5b90602001906020020151600160028110151561032c57fe5b60200201516001900481525083604001518281518110151561034a57fe5b906020019060200201819052506040805190810160405280898381518110151561037057fe5b90602001906020020151600060028110151561038857fe5b602002015160019004815260200189838151811015156103a457fe5b9060200190602002015160016002811015156103bc57fe5b6020020151600190048152508360800151828151811015156103da57fe5b90602001906020020181905250808060010191505061019f565b50604080519081016040528089600060028110151561040f57fe5b602002015160019004815260200189600160028110151561042c57fe5b6020020151600190048152508260600181905250858260a0018181525050604080519081016040528086600060028110151561046457fe5b602002015160019004815260200186600160028110151561048157fe5b6020020151600190048152508260c0018190525061049d614259565b6104a6856104c3565b90506104b28382611007565b935050505098975050505050505050565b6104cb614259565b60408051908101604052806104e1846000612f4d565b81526020016104f1846020612f4d565b81525081600001819052506040805190810160405280610512846040612f4d565b8152602001610522846060612f4d565b81525081602001819052506040805190810160405280610543846080612f4d565b81526020016105538460a0612f4d565b815250816040018190525060408051908101604052806105748460c0612f4d565b81526020016105848460e0612f4d565b815250816060018190525060408051908101604052806105a684610100612f4d565b81526020016105b784610120612f4d565b815250816080018190525060408051908101604052806105d984610140612f4d565b81526020016105ea84610160612f4d565b8152508160a00181905250604080519081016040528061060c84610180612f4d565b815260200161061d846101a0612f4d565b8152508160c00181905250604080519081016040528061063f846101c0612f4d565b8152602001610650846101e0612f4d565b8152508160e00181905250600061024061086084510381151561066f57fe5b049050806040519080825280602002602001820160405280156106ac57816020015b61069961423f565b8152602001906001900390816106915790505b50826101000181905250806040519080825280602002602001820160405280156106f057816020015b6106dd61423f565b8152602001906001900390816106d55790505b508261012001819052508060405190808252806020026020018201604052801561073457816020015b61072161423f565b8152602001906001900390816107195790505b508261014001819052508060405190808252806020026020018201604052801561077857816020015b61076561423f565b81526020019060019003908161075d5790505b50826101600181905250806040519080825280602002602001820160405280156107bc57816020015b6107a961423f565b8152602001906001900390816107a15790505b508261018001819052508060405190808252806020026020018201604052801561080057816020015b6107ed61423f565b8152602001906001900390816107e55790505b50826101a001819052508060405190808252806020026020018201604052801561084457816020015b61083161423f565b8152602001906001900390816108295790505b50826101c001819052508060405190808252806020026020018201604052801561088857816020015b61087561423f565b81526020019060019003908161086d5790505b50826101e00181905250806002026040519080825280602002602001820160405280156108c45781602001602082028038833980820191505090505b5082610200018190525060008090505b81811015610c4b5760408051908101604052806108f8866040850261020001612f4d565b815260200161090e866040850261022001612f4d565b8152508361010001518281518110151561092457fe5b90602001906020020181905250604080519081016040528061094f8660408587010261020001612f4d565b81526020016109678660408587010261022001612f4d565b8152508361012001518281518110151561097d57fe5b9060200190602002018190525060408051908101604052806109ab8660408502608087026102000101612f4d565b81526020016109c68660408502608087026102200101612f4d565b815250836101400151828151811015156109dc57fe5b906020019060200201819052506040805190810160405280610a0a866040850260c087026102000101612f4d565b8152602001610a25866040850260c087026102200101612f4d565b81525083610160015182815181101515610a3b57fe5b906020019060200201819052506040805190810160405280610a6a866040850261010087026102000101612f4d565b8152602001610a86866040850261010087026102200101612f4d565b81525083610180015182815181101515610a9c57fe5b906020019060200201819052506040805190810160405280610acb866040850261014087026102000101612f4d565b8152602001610ae7866040850261014087026102200101612f4d565b815250836101a0015182815181101515610afd57fe5b906020019060200201819052506040805190810160405280610b2c866040850261018087026102000101612f4d565b8152602001610b48866040850261018087026102200101612f4d565b815250836101c0015182815181101515610b5e57fe5b906020019060200201819052506040805190810160405280610b8d86604085026101c087026102000101612f4d565b8152602001610ba986604085026101c087026102200101612f4d565b815250836101e0015182815181101515610bbf57fe5b90602001906020020181905250610be3846020830261020085026102000101612f4d565b83610200015182815181101515610bf657fe5b9060200190602002018181525050610c1b846020830261022085026102000101612f4d565b836102000151838301815181101515610c3057fe5b906020019060200201818152505080806001019150506108d4565b50600061024082029050610c63848261020001612f4d565b83610220018181525050610c7b848261022001612f4d565b83610240018181525050610c93848261024001612f4d565b836102600181815250506040805190810160405280610cb6868461026001612f4d565b8152602001610cc9868461028001612f4d565b8152508361028001819052506040805190810160405280610cee86846102a001612f4d565b8152602001610d0186846102c001612f4d565b815250836102a001819052506040805190810160405280610d2686846102e001612f4d565b8152602001610d39868461030001612f4d565b815250836102c001819052506040805190810160405280610d5e868461032001612f4d565b8152602001610d71868461034001612f4d565b815250836102e0018190525060408051908101604052806040805190810160405280610da1888661036001612f4d565b8152602001610db4888661038001612f4d565b81525081526020016040805190810160405280610dd588866103a001612f4d565b8152602001610de888866103c001612f4d565b815250815250836103000181905250610e0584826103e001612f4d565b83610320018181525050610e1d848261040001612f4d565b83610340018181525050610e35848261042001612f4d565b83610360018181525050610e4d848261044001612f4d565b83610380018181525050610e65848261046001612f4d565b836103a0018181525050610e7d848261048001612f4d565b836103c0018181525050610e9584826104a001612f4d565b836103e0018181525050610ead84826104c001612f4d565b83610400018181525050610ec584826104e001612f4d565b83610420018181525050610edd848261050001612f4d565b83610440018181525050610eef6143b7565b60008090505b6006811015610fb7576040805190810160405280610f1c8860408502876105200101612f4d565b8152602001610f348860408502876105400101612f4d565b815250826000015182600681101515610f4957fe5b60200201819052506040805190810160405280610f728860408560060102876105200101612f4d565b8152602001610f8d8860408560060102876105400101612f4d565b815250826020015182600681101515610fa257fe5b60200201819052508080600101915050610ef5565b50610fcc856080600602846105200101612f4d565b816040018181525050610fe9856080600602846105400101612f4d565b81606001818152505080846104600181905250839350505050919050565b60008061105f846000015185602001518660400151876060015188608001518960a0015160405160200161104096959493929190614e7e565b6040516020818303038152906040528051906020012060019004612f66565b90506110696143ed565b6110cc82856000015186602001518760400151886060015189608001518a60a001518b60c001518c60e001516040516020016110ad9998979695949392919061516a565b6040516020818303038152906040528051906020012060019004612f66565b81604001818152505061114481604001518561010001518661012001518761014001518861016001518961018001518a6101a001518b6101c001518c6101e001516040516020016111259998979695949392919061501a565b6040516020818303038152906040528051906020012060019004612f66565b81606001818152505060028461020001515181151561115f57fe5b04816000018181525050806000015160020a81602001818152505080600001516002026040519080825280602002602001820160405280156111bb57816020015b6111a861449c565b8152602001906001900390816111a05790505b508160c0018190525060008090505b816000015160020281101561129c57846102000151818151811015156111ec57fe5b906020019060200201518260c001518281518110151561120857fe5b90602001906020020151600160028110151561122057fe5b60200201818152505061125c8561020001518281518110151561123f57fe5b906020019060200201518360600151612f9b90919063ffffffff16565b8260c001518281518110151561126e57fe5b90602001906020020151600060028110151561128657fe5b60200201818152505080806001019150506111ca565b5060008090505b81600001516002028110156113495761133382610100015161132e6000848154811015156112cd57fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250508560c001518581518110151561130c57fe5b90602001906020020151600160028110151561132457fe5b6020020151612fdb565b613016565b82610100018190525080806001019150506112a3565b506113ae61136c61136286606001518460600151612fdb565b8660400151613016565b6113a98361010001516113a4600460408051908101604052908160008201548152602001600182015481525050896102200151612fdb565b613016565b61305c565b15156113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e690614f96565b60405180910390fd5b604080519081016040528060008152602001600081525081610100018190525060008090505b8160000151600202811015611511576114fb8261010001516114f660008481548110151561143f57fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250506114f16114b48760c001518781518110151561148457fe5b90602001906020020151600160028110151561149c57fe5b60200201518860600151612f9b90919063ffffffff16565b8760c00151878151811015156114c657fe5b9060200190602002015160016002811015156114de57fe5b602002015161308490919063ffffffff16565b612fdb565b613016565b8261010001819052508080600101915050611415565b5061157661153461152a86608001518460600151612fdb565b8660a00151613016565b61157183610100015161156c600460408051908101604052908160008201548152602001600182015481525050896102400151612fdb565b613016565b61305c565b15156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90614f76565b60405180910390fd5b6117306116726000808154811015156115cc57fe5b90600052602060002090600202016040805190810160405290816000820154815260200160018201548152505061166d8460c00151856000015181518110151561161257fe5b90602001906020020151600160028110151561162a57fe5b60200201518560c00151600081518110151561164257fe5b90602001906020020151600160028110151561165a57fe5b602002015161308490919063ffffffff16565b612fdb565b61172b6000600181548110151561168557fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250506117268560c0015186600001518151811015156116cb57fe5b9060200190602002015160006002811015156116e357fe5b60200201518660c0015160008151811015156116fb57fe5b90602001906020020151600060028110151561171357fe5b602002015161308490919063ffffffff16565b612fdb565b613016565b81610100018190525061179d61175b6117518660e001518460600151612fdb565b8660c00151613016565b611798836101000151611793600460408051908101604052908160008201548152602001600182015481525050896102600151612fdb565b613016565b61305c565b15156117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d590614f56565b60405180910390fd5b6117eb8160c001516130bb565b8160e001819052506118058160e0015186604001516131b3565b8161016001819052506118208160e0015186608001516131b3565b81610180018190525060008090505b816020015181101561191c5761189c82610120015161189788600001518481518110151561185957fe5b906020019060200201518560e001518581518110151561187557fe5b90602001906020020151600060028110151561188d57fe5b6020020151612fdb565b613016565b8261012001819052506119068261014001516119018860200151848151811015156118c357fe5b906020019060200201518560e00151858151811015156118df57fe5b9060200190602002015160006002811015156118f757fe5b6020020151612fdb565b613016565b826101400181905250808060010191505061182f565b50600181608001818152505060008090505b8160200151811015611a4b5761199c826101a0015161199784610160015160028581151561195857fe5b0481518110151561196557fe5b9060200190602002015160028581151561197b57fe5b0660028110151561198857fe5b60200201518560800151612fdb565b613016565b826101a00181905250611a07826101c00151611a028461018001516002858115156119c357fe5b048151811015156119d057fe5b906020019060200201516002858115156119e657fe5b066002811015156119f357fe5b60200201518560800151612fdb565b613016565b826101c001819052506000811115611a3e57611a348260400151836080015161308490919063ffffffff16565b8260800181815250505b808060010191505061192e565b5060018160a001818152505060008090505b8160000151811015611d8e57611aa9826101200151611aa487610100015184815181101515611a8857fe5b90602001906020020151611a9f8660a00151613469565b612fdb565b613016565b826101200181905250611af2826101400151611aed87610120015184815181101515611ad157fe5b90602001906020020151611ae88660a00151613469565b612fdb565b613016565b826101400181905250611b668261016001516000815181101515611b1257fe5b906020019060200201516000600281101515611b2a57fe5b6020020151611b6187610140015184815181101515611b4557fe5b90602001906020020151611b5c8660a00151613469565b612fdb565b613016565b8261016001516000815181101515611b7a57fe5b906020019060200201516000600281101515611b9257fe5b6020020181905250611bda826102000151611bd587610160015184815181101515611bb957fe5b90602001906020020151611bd08660a00151613469565b612fdb565b613016565b826102000181905250611c4e8261018001516000815181101515611bfa57fe5b906020019060200201516000600281101515611c1257fe5b6020020151611c4987610180015184815181101515611c2d57fe5b90602001906020020151611c448660a00151613469565b612fdb565b613016565b8261018001516000815181101515611c6257fe5b906020019060200201516000600281101515611c7a57fe5b6020020181905250611cc2826101e00151611cbd876101a0015184815181101515611ca157fe5b90602001906020020151611cb88660a00151613469565b612fdb565b613016565b826101e00181905250611d0b826101a00151611d06876101c0015184815181101515611cea57fe5b90602001906020020151611d018660a00151613469565b612fdb565b613016565b826101a00181905250611d54826101c00151611d4f876101e0015184815181101515611d3357fe5b90602001906020020151611d4a8660a00151613469565b612fdb565b613016565b826101c00181905250611d7882606001518360a0015161308490919063ffffffff16565b8260a00181815250508080600101915050611a5d565b50611daf816102000151611daa87606001518460a00151612fdb565b613016565b816102000181905250611df4816101e00151611def6002604080519081016040529081600082015481526020016001820154815250508460a00151612fdb565b613016565b816101e00181905250611e056144be565b611e588260600151866102800151876102a00151886102c00151896102e00151604051602001611e39959493929190615116565b6040516020818303038152906040528051906020012060019004612f66565b816000018181525050611e6e8160000151613495565b8160200181905250611ead8160000151604051602001611e8e9190614fd6565b6040516020818303038152906040528051906020012060019004612f66565b8160400181815250506040805190810160405280611ed96002846040015161353290919063ffffffff16565b8152602001611ef66003846040015161353290919063ffffffff16565b8152508160600181905250611f588160400151611f4a83606001516001600281101515611f1f57fe5b602002015184606001516000600281101515611f3757fe5b602002015161359f90919063ffffffff16565b61308490919063ffffffff16565b8160a0018181525050611ffb611fa18260a00151611f9360026040811515611f7c57fe5b0460020a8560a0015161308490919063ffffffff16565b612f9b90919063ffffffff16565b611fed611fd284606001516000600281101515611fba57fe5b60200201518560400151612f9b90919063ffffffff16565b611fdf85602001516135d6565b61308490919063ffffffff16565b612f9b90919063ffffffff16565b81610100018181525050612022816101000151866103200151612f9b90919063ffffffff16565b8160e001818152505060008090505b6002604081151561203e57fe5b048110156120f2576120738160020a8360600151600060028110151561206057fe5b602002015161308490919063ffffffff16565b82608001518260408110151561208557fe5b6020020181815250506120bb8160020a836060015160016002811015156120a857fe5b602002015161308490919063ffffffff16565b8260800151600260408115156120cd57fe5b0483016040811015156120dc57fe5b6020020181815250508080600101915050612031565b506121318160400151866103000151604051602001612112929190614ff1565b6040516020818303038152906040528051906020012060019004612f66565b8160c00181815250506121a4612163866103000151600060028110151561215457fe5b60200201518360c00151612fdb565b61219f876103000151600160028110151561217a57fe5b602002015161219a8560c001518660c0015161308490919063ffffffff16565b612fdb565b613016565b8161012001819052506121b561452a565b6122186121cc846101e00151886103a00151612fdb565b61221385610180015160008151811015156121e357fe5b9060200190602002015160006002811015156121fb57fe5b602002015161220e8a6103800151613469565b612fdb565b613016565b8160200181905250612272612252600260408051908101604052908160008201548152602001600182015481525050886103c00151612fdb565b61226d89606001516122688a6103800151613469565b612fdb565b613016565b81604001819052506122bd6040805190810160405280600681526020017f5a657468657200000000000000000000000000000000000000000000000000008152508860a00151613621565b81606001819052506122fb6122db8260600151886103a00151612fdb565b6122f68960c001516122f18a6103800151613469565b612fdb565b613016565b816080018190525061233b61231a846101c00151886103c00151612fdb565b612336856101a001516123318a6103800151613469565b612fdb565b613016565b8160c0018190525061245e6123e56123c861236e6123638761020001518b6102a00151613016565b8a6103a00151612fdb565b6123c36123b0886101600151600081518110151561238857fe5b9060200190602002015160006002811015156123a057fe5b60200201518c6102800151613016565b6123be8c6103800151613469565b612fdb565b613016565b846060015160006002811015156123db57fe5b6020020151612fdb565b61245961243c61240d6124028861014001518c6102e00151613016565b8b6103a00151612fdb565b6124376124248961012001518d6102c00151613016565b6124328d6103800151613469565b612fdb565b613016565b8560600151600160028110151561244f57fe5b6020020151612fdb565b613016565b8160e001819052506125126125086124e76124d46124a06002604080519081016040529081600082015481526020016001820154815250508760e00151612fdb565b6124cf6004604080519081016040529081600082015481526020016001820154815250508c6103400151612fdb565b613016565b6124e2866101200151613691565b613016565b6125038660a001518a610380015161308490919063ffffffff16565b612fdb565b8260e00151613016565b8161010001819052506125b561254d600260408051908101604052908160008201548152602001600182015481525050886103e00151612fdb565b6125b06125648661020001518a6103a00151612fdb565b6125ab876101600151600081518110151561257b57fe5b90602001906020020151600060028110151561259357fe5b60200201516125a68c6103800151613469565b612fdb565b613016565b613016565b81610120018190525061262d6125f0600260408051908101604052908160008201548152602001600182015481525050886104000151612fdb565b6126286126078661014001518a6103a00151612fdb565b61262387610120015161261e8c6103800151613469565b612fdb565b613016565b613016565b8161014001819052506126a5612668600460408051908101604052908160008201548152602001600182015481525050886104200151612fdb565b6126a061267f896102a001518a6103a00151612fdb565b61269b8a61028001516126968c6103800151613469565b612fdb565b613016565b613016565b81610160018190525061271d6126e0600460408051908101604052908160008201548152602001600182015481525050886104400151612fdb565b6127186126f7896102e001518a6103a00151612fdb565b6127138a6102c0015161270e8c6103800151613469565b612fdb565b613016565b613016565b8161018001819052506127988260c001518260200151836040015184608001518560c001518661010001518761012001518861014001518961016001518a61018001516040516020016127799a999897969594939291906151fa565b6040516020818303038152906040528051906020012060019004612f66565b81600001818152505085610380015181600001511415156127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e590614f36565b60405180910390fd5b6127f66145db565b61282d826000015160405160200161280e9190614fd6565b6040516020818303038152906040528051906020012060019004612f66565b8160800181815250506128646002604080519081016040529081600082015481526020016001820154815250508260800151612fdb565b81600001819052506128e56001805480602002602001604051908101604052809291908181526020016000905b828210156128d757838290600052602060002090600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190612891565b50505050846020015161370a565b816020018190525061290c61290284602001518560400151613786565b84608001516137ed565b81604001819052506129de6129c761293989600001516129348b602001518860c00151612fdb565b613016565b6129c26129b06000805480602002602001604051908101604052809291908181526020016000905b828210156129a757838290600052602060002090600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190612961565b50505050613866565b6129bd8860400151613469565b612fdb565b613016565b6129d9836020015184604001516138b3565b613016565b8160600181905250612a2a8160600151612a25600460408051908101604052908160008201548152602001600182015481525050612a208b6103600151613469565b612fdb565b613016565b8160600181905250612a528160600151612a4d83600001518a6103200151612fdb565b613016565b8160600181905250612a626143b7565b876104600151905060008090505b6006811015612baf57612ae08360800151836000015183600681101515612a9357fe5b6020020151846020015184600681101515612aaa57fe5b6020020151604051602001612ac1939291906150df565b6040516020818303038152906040528051906020012060019004612f66565b83608001818152505082608001518360a0015182600681101515612b0057fe5b6020020181815250506000612b188460800151613917565b9050612b998460600151612b94612b5c866000015186600681101515612b3a57fe5b6020020151612b5760028a6080015161353290919063ffffffff16565b612fdb565b612b8f876020015187600681101515612b7157fe5b6020020151612b8a60028861353290919063ffffffff16565b612fdb565b613016565b613016565b8460600181905250508080600101915050612a70565b5060018260c001516000604081101515612bc557fe5b60200201818152505060008090505b6006811015612c4657612c1d8360a0015182600681101515612bf257fe5b60200201518460c001516000604081101515612c0a57fe5b602002015161308490919063ffffffff16565b8360c001516000604081101515612c3057fe5b6020020181815250508080600101915050612bd4565b50612c4f61463e565b612c6f8360c001516000604081101515612c6557fe5b6020020151613917565b8360c001516000604081101515612c8257fe5b60200201818152505060008090505b60026040811515612c9e57fe5b04811015612db15760008090505b6040828260019060020a02011015612da55760008160019060020a02830190508381604081101515612cda57fe5b60200201511515612d99576000612d328760a0015184600160060303600681101515612d0257fe5b60200201518860a0015185600160060303600681101515612d1f57fe5b602002015161308490919063ffffffff16565b9050612d5d818860c0015186604081101515612d4a57fe5b602002015161308490919063ffffffff16565b8760c0015183604081101515612d6f57fe5b60200201818152505060018583604081101515612d8857fe5b602002019015159081151581525050505b50806001019050612cac565b50806001019050612c91565b50612dba614662565b612dc2614662565b60008090505b6040811015612e8b57612e3583612e30600084815481101515612de757fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250508960c0015185604081101515612e2657fe5b6020020151612fdb565b613016565b9250612e7c82612e77886020015184604081101515612e5057fe5b60200201518960c0015185600160400303604081101515612e6d57fe5b6020020151612fdb565b613016565b91508080600101915050612dc8565b50612e94614662565b612ee8612ebb612ea8858860400151612fdb565b612eb6858960600151612fdb565b613016565b612ee38860000151612ede89606001518a6040015161308490919063ffffffff16565b612fdb565b613016565b9050612ef886606001518261305c565b1515612f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3090614fb6565b60405180910390fd5b60019a505050505050505050505092915050565b6000604051826020850101518152805191505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182811515612f9357fe5b069050919050565b600081831015612fcf5782827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010301612fd3565b8183035b905092915050565b612fe3614662565b604051835181526020840151602082015282604082015260408260608360075afa151561300f57600080fd5b5092915050565b61301e614662565b6040518351815260208401516020820152825160408201526020830151606082015260408260808360065afa151561305557600080fd5b5092915050565b60008160000151836000015114801561307c575081602001518360200151145b905092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156130b057fe5b828409905092915050565b60606000600283518115156130cc57fe5b04905060008160020a90508060405190808252806020026020018201604052801561311157816020015b6130fe61449c565b8152602001906001900390816130f65790505b50925060008090505b60028110156131ab57606061313984830285600185010260018961394d565b905060008090505b8381101561319c57818181518110151561315757fe5b90602001906020020151868281518110151561316f57fe5b906020019060200201518460028110151561318657fe5b6020020181815250508080600101915050613141565b5050808060010191505061311a565b505050919050565b606060008351905060006002828115156131c957fe5b0490508060405190808252806020026020018201604052801561320657816020015b6131f361467c565b8152602001906001900390816131eb5790505b5092506060613216856000613b02565b90506060836040519080825280602002602001820160405280156132495781602001602082028038833980820191505090505b50905060008090505b600281101561345e5760008090505b858110156132c957888682880381151561327757fe5b0681518110151561328457fe5b906020019060200201518260028110151561329b57fe5b602002015183828151811015156132ae57fe5b90602001906020020181815250508080600101915050613261565b506132d382613d63565b915060608460405190808252806020026020018201604052801561331157816020015b6132fe61423f565b8152602001906001900390816132f65790505b50905060006002905061332381613917565b905060008090505b868110156133e0576133b86133b2613371888481518110151561334a57fe5b90602001906020020151888581518110151561336257fe5b90602001906020020151612fdb565b6133ad898b860181518110151561338457fe5b90602001906020020151898c870181518110151561339e57fe5b90602001906020020151612fdb565b613016565b83612fdb565b83828151811015156133c657fe5b90602001906020020181905250808060010191505061332b565b506133ec826001613b02565b915060008090505b8681101561344e57828181518110151561340a57fe5b90602001906020020151898281518110151561342257fe5b906020019060200201518560028110151561343957fe5b602002018190525080806001019150506133f4565b5050508080600101915050613252565b505050505092915050565b6000817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001039050919050565b61349d6146aa565b60018160006040811015156134ae57fe5b602002018181525050818160016040811015156134c757fe5b6020020181815250506000600290505b604081101561352c576135088383600184036040811015156134f557fe5b602002015161308490919063ffffffff16565b828260408110151561351657fe5b60200201818152505080806001019150506134d7565b50919050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa151561359357600080fd5b80519250505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156135cb57fe5b828408905092915050565b600080600090505b604081101561361b5761360c83826040811015156135f857fe5b60200201518361359f90919063ffffffff16565b915080806001019150506135de565b50919050565b613629614662565b6136897f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478484604051602001613660929190614e56565b604051602081830303815290604052805190602001206001900481151561368357fe5b06613f8b565b905092915050565b613699614662565b6040805190810160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001518115156136dd57fe5b067f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47038152509050919050565b6137126146ce565b60008090505b604081101561377f5761375c848281518110151561373257fe5b90602001906020020151613757858460408110151561374d57fe5b6020020151613917565b612fdb565b828260408110151561376a57fe5b60200201819052508080600101915050613718565b5092915050565b61378e6146aa565b60008090505b60408110156137e6576137c28385836040811015156137af57fe5b602002015161308490919063ffffffff16565b82826040811015156137d057fe5b6020020181815250508080600101915050613794565b5092915050565b6137f56146aa565b60008090505b604081101561385f5761383b838260408110151561381557fe5b6020020151858360408110151561382857fe5b602002015161359f90919063ffffffff16565b828260408110151561384957fe5b60200201818152505080806001019150506137fb565b5092915050565b61386e614662565b60008090505b60408110156138ad5761389e82848381518110151561388f57fe5b90602001906020020151613016565b91508080600101915050613874565b50919050565b6138bb614662565b60008090505b604081101561391057613901826138fc86846040811015156138df57fe5b602002015186856040811015156138f257fe5b6020020151612fdb565b613016565b915080806001019150506138c1565b5092915050565b60006139468260027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103613532565b9050919050565b6060600085850360020a9050806040519080825280602002602001820160405280156139885781602001602082028038833980820191505090505b509150858514156139ba57838260008151811015156139a357fe5b906020019060200201818152505081915050613afa565b6001850394506060613a0a8787613a04878a8151811015156139d857fe5b9060200190602002015160006002811015156139f057fe5b60200201518961308490919063ffffffff16565b8761394d565b90506060613a568888613a50888b815181101515613a2457fe5b906020019060200201516001600281101515613a3c57fe5b60200201518a61308490919063ffffffff16565b8861394d565b905060008090505b600284811515613a6a57fe5b04811015613af5578281815181101515613a8057fe5b906020019060200201518582815181101515613a9857fe5b90602001906020020181815250508181815181101515613ab457fe5b9060200190602002015185600286811515613acb57fe5b048301815181101515613ada57fe5b90602001906020020181815250508080600101915050613a5e565b505050505b949350505050565b60606000835190506001811415613b1c5783915050613d5d565b6000600282811515613b2a57fe5b06141515613b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6490614f16565b60405180910390fd5b6000613bb1826310000000811515613b8157fe5b047f14a3074b02521e3b1ed9852e5028452693e87be4e910500c7ba9bbddb2f46edd61353290919063ffffffff16565b90506000600190508415613bcf57613bc882613917565b9150600290505b613bd881613917565b90506060613bf0613bea88600061402b565b87613b02565b90506060613c08613c0289600161402b565b88613b02565b905060006001905085604051908082528060200260200182016040528015613c4a57816020015b613c3761423f565b815260200190600190039081613c2f5790505b50965060008090505b600287811515613c5f57fe5b04811015613d5557613c6f614662565b613c908483815181101515613c8057fe5b9060200190602002015184612fdb565b9050613cbc613cb68684815181101515613ca657fe5b9060200190602002015183613016565b87612fdb565b8983815181101515613cca57fe5b90602001906020020181905250613d09613d038684815181101515613ceb57fe5b90602001906020020151613cfe84613691565b613016565b87612fdb565b8960028a811515613d1657fe5b048401815181101515613d2557fe5b90602001906020020181905250613d45878461308490919063ffffffff16565b9250508080600101915050613c53565b505050505050505b92915050565b60606000825190506001811415613d7d5782915050613f86565b6000600282811515613d8b57fe5b06141515613dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc590614f16565b60405180910390fd5b6000613e12826310000000811515613de257fe5b047f14a3074b02521e3b1ed9852e5028452693e87be4e910500c7ba9bbddb2f46edd61353290919063ffffffff16565b90506060613e29613e248660006140de565b613d63565b90506060613e40613e3b8760016140de565b613d63565b905060006001905084604051908082528060200260200182016040528015613e775781602001602082028038833980820191505090505b50955060008090505b600286811515613e8c57fe5b04811015613f7f576000613ec0838584815181101515613ea857fe5b9060200190602002015161308490919063ffffffff16565b9050613eec818684815181101515613ed457fe5b9060200190602002015161359f90919063ffffffff16565b8883815181101515613efa57fe5b9060200190602002018181525050613f32818684815181101515613f1a57fe5b90602001906020020151612f9b90919063ffffffff16565b88600289811515613f3f57fe5b048401815181101515613f4e57fe5b9060200190602002018181525050613f6f868461308490919063ffffffff16565b9250508080600101915050613e80565b5050505050505b919050565b613f93614662565b60005b60011561400e5760006003613fac856003614187565b019050613fe881600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4701811515613fe257fe5b04614187565b915080613ff6836002614187565b1415614002575061400e565b60018401935050613f96565b604080519081016040528084815260200182815250915050919050565b60606002835181151561403a57fe5b0460405190808252806020026020018201604052801561407457816020015b61406161423f565b8152602001906001900390816140595790505b50905060008090505b6002845181151561408a57fe5b048110156140d757838382600202018151811015156140a557fe5b9060200190602002015182828151811015156140bd57fe5b90602001906020020181905250808060010191505061407d565b5092915050565b6060600283518115156140ed57fe5b0460405190808252806020026020018201604052801561411c5781602001602082028038833980820191505090505b50905060008090505b6002845181151561413257fe5b04811015614180578383826002020181518110151561414d57fe5b90602001906020020151828281518110151561416557fe5b90602001906020020181815250508080600101915050614125565b5092915050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa15156141e857600080fd5b80519250505092915050565b6101206040519081016040528060608152602001606081526020016060815260200161421e61423f565b8152602001606081526020016000815260200161423961423f565b81525090565b604080519081016040528060008152602001600081525090565b6109806040519081016040528061426e61423f565b815260200161427b61423f565b815260200161428861423f565b815260200161429561423f565b81526020016142a261423f565b81526020016142af61423f565b81526020016142bc61423f565b81526020016142c961423f565b815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000815260200161432a61423f565b815260200161433761423f565b815260200161434461423f565b815260200161435161423f565b815260200161435e61467c565b8152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016143b16146fd565b81525090565b610340604051908101604052806143cc614733565b81526020016143d9614733565b815260200160008152602001600081525090565b61030060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200161443a61423f565b815260200161444761423f565b815260200161445461423f565b8152602001606081526020016060815260200161446f61423f565b815260200161447c61423f565b815260200161448961423f565b815260200161449661423f565b81525090565b6040805190810160405280600290602082028038833980820191505090505090565b61114060405190810160405280600081526020016144da614762565b8152602001600081526020016144ee61449c565b81526020016144fb614762565b81526020016000815260200160008152602001600081526020016000815260200161452461423f565b81525090565b610320604051908101604052806000815260200161454661423f565b815260200161455361423f565b815260200161456061423f565b815260200161456d61423f565b815260200161457a61423f565b815260200161458761423f565b815260200161459461423f565b81526020016145a161423f565b81526020016145ae61423f565b81526020016145bb61423f565b81526020016145c861423f565b81526020016145d561423f565b81525090565b612160604051908101604052806145f061423f565b81526020016145fd614786565b815260200161460a614762565b815260200161461761423f565b81526020016000815260200161462b6147b5565b8152602001614638614762565b81525090565b61080060405190810160405280604090602082028038833980820191505090505090565b604080519081016040528060008152602001600081525090565b6080604051908101604052806002905b61469461423f565b81526020019060019003908161468c5790505090565b61080060405190810160405280604090602082028038833980820191505090505090565b611000604051908101604052806040905b6146e761423f565b8152602001906001900390816146df5790505090565b61034060405190810160405280614712614733565b815260200161471f614733565b815260200160008152602001600081525090565b610180604051908101604052806006905b61474c61423f565b8152602001906001900390816147445790505090565b61080060405190810160405280604090602082028038833980820191505090505090565b611000604051908101604052806040905b61479f61423f565b8152602001906001900390816147975790505090565b60c060405190810160405280600690602082028038833980820191505090505090565b600082601f83011215156147eb57600080fd5b81356147fe6147f9826152c6565b615299565b9150818183526020840193506020810190508385604084028201111561482357600080fd5b60005b838110156148535781614839888261485d565b845260208401935060408301925050600181019050614826565b5050505092915050565b600082601f830112151561487057600080fd5b600261488361487e826152ee565b615299565b9150818385602084028201111561489957600080fd5b60005b838110156148c957816148af8882614949565b84526020840193506020830192505060018101905061489c565b5050505092915050565b600082601f83011215156148e657600080fd5b60026148f96148f482615310565b615299565b9150818385602084028201111561490f57600080fd5b60005b8381101561493f57816149258882614949565b845260208401935060208301925050600181019050614912565b5050505092915050565b600061495582356153fe565b905092915050565b600082601f830112151561497057600080fd5b813561498361497e82615332565b615299565b9150808252602083016020830185838301111561499f57600080fd5b6149aa838284615412565b50505092915050565b60006149bf8235615408565b905092915050565b600080600080600080600080610140898b0312156149e457600080fd5b600089013567ffffffffffffffff8111156149fe57600080fd5b614a0a8b828c016147d8565b985050602089013567ffffffffffffffff811115614a2757600080fd5b614a338b828c016147d8565b975050604089013567ffffffffffffffff811115614a5057600080fd5b614a5c8b828c016147d8565b9650506060614a6d8b828c016148d3565b95505060a089013567ffffffffffffffff811115614a8a57600080fd5b614a968b828c016147d8565b94505060c0614aa78b828c016149b3565b93505060e0614ab88b828c016148d3565b92505061012089013567ffffffffffffffff811115614ad657600080fd5b614ae28b828c0161495d565b9150509295985092959890939650565b6000614afe8383614dc3565b60408301905092915050565b614b1381615375565b614b1d81846153b0565b9250614b288261535e565b60005b82811015614b5657614b3e858351614af2565b9450614b4982615396565b9150600181019050614b2b565b5050505050565b6000614b6882615380565b614b7281856153bb565b9350614b7d83615368565b60005b82811015614bab57614b93868351614af2565b9550614b9e826153a3565b9150600181019050614b80565b50849250505092915050565b614bc0816153e8565b82525050565b6000614bd18261538b565b614bdb81856153dd565b9350614beb818560208601615421565b80840191505092915050565b6000614c04601f836153cc565b91507f496e7075742073697a65206973206e6f74206120706f776572206f66203221006000830152602082019050919050565b6000614c44602a836153cc565b91507f5369676d612070726f746f636f6c206368616c6c656e676520657175616c697460008301527f79206661696c7572652e000000000000000000000000000000000000000000006020830152604082019050919050565b6000614caa601d836153cc565b91507f5265636f76657279206661696c75726520666f7220465e77202a20452e0000006000830152602082019050919050565b6000614cea601d836153cc565b91507f5265636f76657279206661696c75726520666f7220435e77202a20442e0000006000830152602082019050919050565b6000614d2a601d836153cc565b91507f5265636f76657279206661696c75726520666f7220425e77202a20412e0000006000830152602082019050919050565b6000614d6a6025836153cc565b91507f496e6e65722070726f6475637420657175616c69747920636865636b2066616960008301527f6c7572652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b604082016000820151614dd96000850182614e21565b506020820151614dec6020850182614e21565b50505050565b604082016000820151614e086000850182614e21565b506020820151614e1b6020850182614e21565b50505050565b614e2a816153f4565b82525050565b614e39816153f4565b82525050565b614e50614e4b826153f4565b615454565b82525050565b6000614e628285614bc6565b9150614e6e8284614e3f565b6020820191508190509392505050565b600060e0820190508181036000830152614e988189614b5d565b90508181036020830152614eac8188614b5d565b90508181036040830152614ec08187614b5d565b9050614ecf6060830186614df2565b81810360a0830152614ee18185614b5d565b9050614ef060c0830184614e30565b979650505050505050565b6000602082019050614f106000830184614bb7565b92915050565b60006020820190508181036000830152614f2f81614bf7565b9050919050565b60006020820190508181036000830152614f4f81614c37565b9050919050565b60006020820190508181036000830152614f6f81614c9d565b9050919050565b60006020820190508181036000830152614f8f81614cdd565b9050919050565b60006020820190508181036000830152614faf81614d1d565b9050919050565b60006020820190508181036000830152614fcf81614d5d565b9050919050565b6000602082019050614feb6000830184614e30565b92915050565b600060a0820190506150066000830185614e30565b6150136020830184614b0a565b9392505050565b600061012082019050615030600083018c614e30565b8181036020830152615042818b614b5d565b90508181036040830152615056818a614b5d565b9050818103606083015261506a8189614b5d565b9050818103608083015261507e8188614b5d565b905081810360a08301526150928187614b5d565b905081810360c08301526150a68186614b5d565b905081810360e08301526150ba8185614b5d565b90508181036101008301526150cf8184614b5d565b90509a9950505050505050505050565b600060a0820190506150f46000830186614e30565b6151016020830185614df2565b61510e6060830184614df2565b949350505050565b60006101208201905061512c6000830188614e30565b6151396020830187614df2565b6151466060830186614df2565b61515360a0830185614df2565b61516060e0830184614df2565b9695505050505050565b600061022082019050615180600083018c614e30565b61518d602083018b614df2565b61519a606083018a614df2565b6151a760a0830189614df2565b6151b460e0830188614df2565b6151c2610120830187614df2565b6151d0610160830186614df2565b6151de6101a0830185614df2565b6151ec6101e0830184614df2565b9a9950505050505050505050565b600061026082019050615210600083018d614e30565b61521d602083018c614df2565b61522a606083018b614df2565b61523760a083018a614df2565b61524460e0830189614df2565b615252610120830188614df2565b615260610160830187614df2565b61526e6101a0830186614df2565b61527c6101e0830185614df2565b61528a610220830184614df2565b9b9a5050505050505050505050565b6000604051905081810181811067ffffffffffffffff821117156152bc57600080fd5b8060405250919050565b600067ffffffffffffffff8211156152dd57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561530557600080fd5b602082029050919050565b600067ffffffffffffffff82111561532757600080fd5b602082029050919050565b600067ffffffffffffffff82111561534957600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60008115159050919050565b6000819050919050565b6000819050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561543f578082015181840152602081019050615424565b8381111561544e576000848401525b50505050565b600081905091905056fea265627a7a72305820a241c0aa8af863b39fdad9b018dd2ef019258322911079d187503547662c02bf6c6578706572696d656e74616cf50037", - "deployedBytecode": "0x608060405234801561001057600080fd5b5060043610610048576000357c0100000000000000000000000000000000000000000000000000000000900480631659e67d1461004d575b600080fd5b610067600480360361006291908101906149c7565b61007d565b6040516100749190614efb565b60405180910390f35b60006100876141f4565b600086519050806040519080825280602002602001820160405280156100c757816020015b6100b461423f565b8152602001906001900390816100ac5790505b5082600001819052508060405190808252806020026020018201604052801561010a57816020015b6100f761423f565b8152602001906001900390816100ef5790505b5082602001819052508060405190808252806020026020018201604052801561014d57816020015b61013a61423f565b8152602001906001900390816101325790505b5082604001819052508060405190808252806020026020018201604052801561019057816020015b61017d61423f565b8152602001906001900390816101755790505b50826080018190525060008090505b818110156103f45760408051908101604052808d838151811015156101c057fe5b9060200190602002015160006002811015156101d857fe5b60200201516001900481526020018d838151811015156101f457fe5b90602001906020020151600160028110151561020c57fe5b60200201516001900481525083600001518281518110151561022a57fe5b9060200190602002018190525060408051908101604052808c8381518110151561025057fe5b90602001906020020151600060028110151561026857fe5b60200201516001900481526020018c8381518110151561028457fe5b90602001906020020151600160028110151561029c57fe5b6020020151600190048152508360200151828151811015156102ba57fe5b9060200190602002018190525060408051908101604052808b838151811015156102e057fe5b9060200190602002015160006002811015156102f857fe5b60200201516001900481526020018b8381518110151561031457fe5b90602001906020020151600160028110151561032c57fe5b60200201516001900481525083604001518281518110151561034a57fe5b906020019060200201819052506040805190810160405280898381518110151561037057fe5b90602001906020020151600060028110151561038857fe5b602002015160019004815260200189838151811015156103a457fe5b9060200190602002015160016002811015156103bc57fe5b6020020151600190048152508360800151828151811015156103da57fe5b90602001906020020181905250808060010191505061019f565b50604080519081016040528089600060028110151561040f57fe5b602002015160019004815260200189600160028110151561042c57fe5b6020020151600190048152508260600181905250858260a0018181525050604080519081016040528086600060028110151561046457fe5b602002015160019004815260200186600160028110151561048157fe5b6020020151600190048152508260c0018190525061049d614259565b6104a6856104c3565b90506104b28382611007565b935050505098975050505050505050565b6104cb614259565b60408051908101604052806104e1846000612f4d565b81526020016104f1846020612f4d565b81525081600001819052506040805190810160405280610512846040612f4d565b8152602001610522846060612f4d565b81525081602001819052506040805190810160405280610543846080612f4d565b81526020016105538460a0612f4d565b815250816040018190525060408051908101604052806105748460c0612f4d565b81526020016105848460e0612f4d565b815250816060018190525060408051908101604052806105a684610100612f4d565b81526020016105b784610120612f4d565b815250816080018190525060408051908101604052806105d984610140612f4d565b81526020016105ea84610160612f4d565b8152508160a00181905250604080519081016040528061060c84610180612f4d565b815260200161061d846101a0612f4d565b8152508160c00181905250604080519081016040528061063f846101c0612f4d565b8152602001610650846101e0612f4d565b8152508160e00181905250600061024061086084510381151561066f57fe5b049050806040519080825280602002602001820160405280156106ac57816020015b61069961423f565b8152602001906001900390816106915790505b50826101000181905250806040519080825280602002602001820160405280156106f057816020015b6106dd61423f565b8152602001906001900390816106d55790505b508261012001819052508060405190808252806020026020018201604052801561073457816020015b61072161423f565b8152602001906001900390816107195790505b508261014001819052508060405190808252806020026020018201604052801561077857816020015b61076561423f565b81526020019060019003908161075d5790505b50826101600181905250806040519080825280602002602001820160405280156107bc57816020015b6107a961423f565b8152602001906001900390816107a15790505b508261018001819052508060405190808252806020026020018201604052801561080057816020015b6107ed61423f565b8152602001906001900390816107e55790505b50826101a001819052508060405190808252806020026020018201604052801561084457816020015b61083161423f565b8152602001906001900390816108295790505b50826101c001819052508060405190808252806020026020018201604052801561088857816020015b61087561423f565b81526020019060019003908161086d5790505b50826101e00181905250806002026040519080825280602002602001820160405280156108c45781602001602082028038833980820191505090505b5082610200018190525060008090505b81811015610c4b5760408051908101604052806108f8866040850261020001612f4d565b815260200161090e866040850261022001612f4d565b8152508361010001518281518110151561092457fe5b90602001906020020181905250604080519081016040528061094f8660408587010261020001612f4d565b81526020016109678660408587010261022001612f4d565b8152508361012001518281518110151561097d57fe5b9060200190602002018190525060408051908101604052806109ab8660408502608087026102000101612f4d565b81526020016109c68660408502608087026102200101612f4d565b815250836101400151828151811015156109dc57fe5b906020019060200201819052506040805190810160405280610a0a866040850260c087026102000101612f4d565b8152602001610a25866040850260c087026102200101612f4d565b81525083610160015182815181101515610a3b57fe5b906020019060200201819052506040805190810160405280610a6a866040850261010087026102000101612f4d565b8152602001610a86866040850261010087026102200101612f4d565b81525083610180015182815181101515610a9c57fe5b906020019060200201819052506040805190810160405280610acb866040850261014087026102000101612f4d565b8152602001610ae7866040850261014087026102200101612f4d565b815250836101a0015182815181101515610afd57fe5b906020019060200201819052506040805190810160405280610b2c866040850261018087026102000101612f4d565b8152602001610b48866040850261018087026102200101612f4d565b815250836101c0015182815181101515610b5e57fe5b906020019060200201819052506040805190810160405280610b8d86604085026101c087026102000101612f4d565b8152602001610ba986604085026101c087026102200101612f4d565b815250836101e0015182815181101515610bbf57fe5b90602001906020020181905250610be3846020830261020085026102000101612f4d565b83610200015182815181101515610bf657fe5b9060200190602002018181525050610c1b846020830261022085026102000101612f4d565b836102000151838301815181101515610c3057fe5b906020019060200201818152505080806001019150506108d4565b50600061024082029050610c63848261020001612f4d565b83610220018181525050610c7b848261022001612f4d565b83610240018181525050610c93848261024001612f4d565b836102600181815250506040805190810160405280610cb6868461026001612f4d565b8152602001610cc9868461028001612f4d565b8152508361028001819052506040805190810160405280610cee86846102a001612f4d565b8152602001610d0186846102c001612f4d565b815250836102a001819052506040805190810160405280610d2686846102e001612f4d565b8152602001610d39868461030001612f4d565b815250836102c001819052506040805190810160405280610d5e868461032001612f4d565b8152602001610d71868461034001612f4d565b815250836102e0018190525060408051908101604052806040805190810160405280610da1888661036001612f4d565b8152602001610db4888661038001612f4d565b81525081526020016040805190810160405280610dd588866103a001612f4d565b8152602001610de888866103c001612f4d565b815250815250836103000181905250610e0584826103e001612f4d565b83610320018181525050610e1d848261040001612f4d565b83610340018181525050610e35848261042001612f4d565b83610360018181525050610e4d848261044001612f4d565b83610380018181525050610e65848261046001612f4d565b836103a0018181525050610e7d848261048001612f4d565b836103c0018181525050610e9584826104a001612f4d565b836103e0018181525050610ead84826104c001612f4d565b83610400018181525050610ec584826104e001612f4d565b83610420018181525050610edd848261050001612f4d565b83610440018181525050610eef6143b7565b60008090505b6006811015610fb7576040805190810160405280610f1c8860408502876105200101612f4d565b8152602001610f348860408502876105400101612f4d565b815250826000015182600681101515610f4957fe5b60200201819052506040805190810160405280610f728860408560060102876105200101612f4d565b8152602001610f8d8860408560060102876105400101612f4d565b815250826020015182600681101515610fa257fe5b60200201819052508080600101915050610ef5565b50610fcc856080600602846105200101612f4d565b816040018181525050610fe9856080600602846105400101612f4d565b81606001818152505080846104600181905250839350505050919050565b60008061105f846000015185602001518660400151876060015188608001518960a0015160405160200161104096959493929190614e7e565b6040516020818303038152906040528051906020012060019004612f66565b90506110696143ed565b6110cc82856000015186602001518760400151886060015189608001518a60a001518b60c001518c60e001516040516020016110ad9998979695949392919061516a565b6040516020818303038152906040528051906020012060019004612f66565b81604001818152505061114481604001518561010001518661012001518761014001518861016001518961018001518a6101a001518b6101c001518c6101e001516040516020016111259998979695949392919061501a565b6040516020818303038152906040528051906020012060019004612f66565b81606001818152505060028461020001515181151561115f57fe5b04816000018181525050806000015160020a81602001818152505080600001516002026040519080825280602002602001820160405280156111bb57816020015b6111a861449c565b8152602001906001900390816111a05790505b508160c0018190525060008090505b816000015160020281101561129c57846102000151818151811015156111ec57fe5b906020019060200201518260c001518281518110151561120857fe5b90602001906020020151600160028110151561122057fe5b60200201818152505061125c8561020001518281518110151561123f57fe5b906020019060200201518360600151612f9b90919063ffffffff16565b8260c001518281518110151561126e57fe5b90602001906020020151600060028110151561128657fe5b60200201818152505080806001019150506111ca565b5060008090505b81600001516002028110156113495761133382610100015161132e6000848154811015156112cd57fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250508560c001518581518110151561130c57fe5b90602001906020020151600160028110151561132457fe5b6020020151612fdb565b613016565b82610100018190525080806001019150506112a3565b506113ae61136c61136286606001518460600151612fdb565b8660400151613016565b6113a98361010001516113a4600460408051908101604052908160008201548152602001600182015481525050896102200151612fdb565b613016565b61305c565b15156113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e690614f96565b60405180910390fd5b604080519081016040528060008152602001600081525081610100018190525060008090505b8160000151600202811015611511576114fb8261010001516114f660008481548110151561143f57fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250506114f16114b48760c001518781518110151561148457fe5b90602001906020020151600160028110151561149c57fe5b60200201518860600151612f9b90919063ffffffff16565b8760c00151878151811015156114c657fe5b9060200190602002015160016002811015156114de57fe5b602002015161308490919063ffffffff16565b612fdb565b613016565b8261010001819052508080600101915050611415565b5061157661153461152a86608001518460600151612fdb565b8660a00151613016565b61157183610100015161156c600460408051908101604052908160008201548152602001600182015481525050896102400151612fdb565b613016565b61305c565b15156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90614f76565b60405180910390fd5b6117306116726000808154811015156115cc57fe5b90600052602060002090600202016040805190810160405290816000820154815260200160018201548152505061166d8460c00151856000015181518110151561161257fe5b90602001906020020151600160028110151561162a57fe5b60200201518560c00151600081518110151561164257fe5b90602001906020020151600160028110151561165a57fe5b602002015161308490919063ffffffff16565b612fdb565b61172b6000600181548110151561168557fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250506117268560c0015186600001518151811015156116cb57fe5b9060200190602002015160006002811015156116e357fe5b60200201518660c0015160008151811015156116fb57fe5b90602001906020020151600060028110151561171357fe5b602002015161308490919063ffffffff16565b612fdb565b613016565b81610100018190525061179d61175b6117518660e001518460600151612fdb565b8660c00151613016565b611798836101000151611793600460408051908101604052908160008201548152602001600182015481525050896102600151612fdb565b613016565b61305c565b15156117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d590614f56565b60405180910390fd5b6117eb8160c001516130bb565b8160e001819052506118058160e0015186604001516131b3565b8161016001819052506118208160e0015186608001516131b3565b81610180018190525060008090505b816020015181101561191c5761189c82610120015161189788600001518481518110151561185957fe5b906020019060200201518560e001518581518110151561187557fe5b90602001906020020151600060028110151561188d57fe5b6020020151612fdb565b613016565b8261012001819052506119068261014001516119018860200151848151811015156118c357fe5b906020019060200201518560e00151858151811015156118df57fe5b9060200190602002015160006002811015156118f757fe5b6020020151612fdb565b613016565b826101400181905250808060010191505061182f565b50600181608001818152505060008090505b8160200151811015611a4b5761199c826101a0015161199784610160015160028581151561195857fe5b0481518110151561196557fe5b9060200190602002015160028581151561197b57fe5b0660028110151561198857fe5b60200201518560800151612fdb565b613016565b826101a00181905250611a07826101c00151611a028461018001516002858115156119c357fe5b048151811015156119d057fe5b906020019060200201516002858115156119e657fe5b066002811015156119f357fe5b60200201518560800151612fdb565b613016565b826101c001819052506000811115611a3e57611a348260400151836080015161308490919063ffffffff16565b8260800181815250505b808060010191505061192e565b5060018160a001818152505060008090505b8160000151811015611d8e57611aa9826101200151611aa487610100015184815181101515611a8857fe5b90602001906020020151611a9f8660a00151613469565b612fdb565b613016565b826101200181905250611af2826101400151611aed87610120015184815181101515611ad157fe5b90602001906020020151611ae88660a00151613469565b612fdb565b613016565b826101400181905250611b668261016001516000815181101515611b1257fe5b906020019060200201516000600281101515611b2a57fe5b6020020151611b6187610140015184815181101515611b4557fe5b90602001906020020151611b5c8660a00151613469565b612fdb565b613016565b8261016001516000815181101515611b7a57fe5b906020019060200201516000600281101515611b9257fe5b6020020181905250611bda826102000151611bd587610160015184815181101515611bb957fe5b90602001906020020151611bd08660a00151613469565b612fdb565b613016565b826102000181905250611c4e8261018001516000815181101515611bfa57fe5b906020019060200201516000600281101515611c1257fe5b6020020151611c4987610180015184815181101515611c2d57fe5b90602001906020020151611c448660a00151613469565b612fdb565b613016565b8261018001516000815181101515611c6257fe5b906020019060200201516000600281101515611c7a57fe5b6020020181905250611cc2826101e00151611cbd876101a0015184815181101515611ca157fe5b90602001906020020151611cb88660a00151613469565b612fdb565b613016565b826101e00181905250611d0b826101a00151611d06876101c0015184815181101515611cea57fe5b90602001906020020151611d018660a00151613469565b612fdb565b613016565b826101a00181905250611d54826101c00151611d4f876101e0015184815181101515611d3357fe5b90602001906020020151611d4a8660a00151613469565b612fdb565b613016565b826101c00181905250611d7882606001518360a0015161308490919063ffffffff16565b8260a00181815250508080600101915050611a5d565b50611daf816102000151611daa87606001518460a00151612fdb565b613016565b816102000181905250611df4816101e00151611def6002604080519081016040529081600082015481526020016001820154815250508460a00151612fdb565b613016565b816101e00181905250611e056144be565b611e588260600151866102800151876102a00151886102c00151896102e00151604051602001611e39959493929190615116565b6040516020818303038152906040528051906020012060019004612f66565b816000018181525050611e6e8160000151613495565b8160200181905250611ead8160000151604051602001611e8e9190614fd6565b6040516020818303038152906040528051906020012060019004612f66565b8160400181815250506040805190810160405280611ed96002846040015161353290919063ffffffff16565b8152602001611ef66003846040015161353290919063ffffffff16565b8152508160600181905250611f588160400151611f4a83606001516001600281101515611f1f57fe5b602002015184606001516000600281101515611f3757fe5b602002015161359f90919063ffffffff16565b61308490919063ffffffff16565b8160a0018181525050611ffb611fa18260a00151611f9360026040811515611f7c57fe5b0460020a8560a0015161308490919063ffffffff16565b612f9b90919063ffffffff16565b611fed611fd284606001516000600281101515611fba57fe5b60200201518560400151612f9b90919063ffffffff16565b611fdf85602001516135d6565b61308490919063ffffffff16565b612f9b90919063ffffffff16565b81610100018181525050612022816101000151866103200151612f9b90919063ffffffff16565b8160e001818152505060008090505b6002604081151561203e57fe5b048110156120f2576120738160020a8360600151600060028110151561206057fe5b602002015161308490919063ffffffff16565b82608001518260408110151561208557fe5b6020020181815250506120bb8160020a836060015160016002811015156120a857fe5b602002015161308490919063ffffffff16565b8260800151600260408115156120cd57fe5b0483016040811015156120dc57fe5b6020020181815250508080600101915050612031565b506121318160400151866103000151604051602001612112929190614ff1565b6040516020818303038152906040528051906020012060019004612f66565b8160c00181815250506121a4612163866103000151600060028110151561215457fe5b60200201518360c00151612fdb565b61219f876103000151600160028110151561217a57fe5b602002015161219a8560c001518660c0015161308490919063ffffffff16565b612fdb565b613016565b8161012001819052506121b561452a565b6122186121cc846101e00151886103a00151612fdb565b61221385610180015160008151811015156121e357fe5b9060200190602002015160006002811015156121fb57fe5b602002015161220e8a6103800151613469565b612fdb565b613016565b8160200181905250612272612252600260408051908101604052908160008201548152602001600182015481525050886103c00151612fdb565b61226d89606001516122688a6103800151613469565b612fdb565b613016565b81604001819052506122bd6040805190810160405280600681526020017f5a657468657200000000000000000000000000000000000000000000000000008152508860a00151613621565b81606001819052506122fb6122db8260600151886103a00151612fdb565b6122f68960c001516122f18a6103800151613469565b612fdb565b613016565b816080018190525061233b61231a846101c00151886103c00151612fdb565b612336856101a001516123318a6103800151613469565b612fdb565b613016565b8160c0018190525061245e6123e56123c861236e6123638761020001518b6102a00151613016565b8a6103a00151612fdb565b6123c36123b0886101600151600081518110151561238857fe5b9060200190602002015160006002811015156123a057fe5b60200201518c6102800151613016565b6123be8c6103800151613469565b612fdb565b613016565b846060015160006002811015156123db57fe5b6020020151612fdb565b61245961243c61240d6124028861014001518c6102e00151613016565b8b6103a00151612fdb565b6124376124248961012001518d6102c00151613016565b6124328d6103800151613469565b612fdb565b613016565b8560600151600160028110151561244f57fe5b6020020151612fdb565b613016565b8160e001819052506125126125086124e76124d46124a06002604080519081016040529081600082015481526020016001820154815250508760e00151612fdb565b6124cf6004604080519081016040529081600082015481526020016001820154815250508c6103400151612fdb565b613016565b6124e2866101200151613691565b613016565b6125038660a001518a610380015161308490919063ffffffff16565b612fdb565b8260e00151613016565b8161010001819052506125b561254d600260408051908101604052908160008201548152602001600182015481525050886103e00151612fdb565b6125b06125648661020001518a6103a00151612fdb565b6125ab876101600151600081518110151561257b57fe5b90602001906020020151600060028110151561259357fe5b60200201516125a68c6103800151613469565b612fdb565b613016565b613016565b81610120018190525061262d6125f0600260408051908101604052908160008201548152602001600182015481525050886104000151612fdb565b6126286126078661014001518a6103a00151612fdb565b61262387610120015161261e8c6103800151613469565b612fdb565b613016565b613016565b8161014001819052506126a5612668600460408051908101604052908160008201548152602001600182015481525050886104200151612fdb565b6126a061267f896102a001518a6103a00151612fdb565b61269b8a61028001516126968c6103800151613469565b612fdb565b613016565b613016565b81610160018190525061271d6126e0600460408051908101604052908160008201548152602001600182015481525050886104400151612fdb565b6127186126f7896102e001518a6103a00151612fdb565b6127138a6102c0015161270e8c6103800151613469565b612fdb565b613016565b613016565b8161018001819052506127988260c001518260200151836040015184608001518560c001518661010001518761012001518861014001518961016001518a61018001516040516020016127799a999897969594939291906151fa565b6040516020818303038152906040528051906020012060019004612f66565b81600001818152505085610380015181600001511415156127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e590614f36565b60405180910390fd5b6127f66145db565b61282d826000015160405160200161280e9190614fd6565b6040516020818303038152906040528051906020012060019004612f66565b8160800181815250506128646002604080519081016040529081600082015481526020016001820154815250508260800151612fdb565b81600001819052506128e56001805480602002602001604051908101604052809291908181526020016000905b828210156128d757838290600052602060002090600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190612891565b50505050846020015161370a565b816020018190525061290c61290284602001518560400151613786565b84608001516137ed565b81604001819052506129de6129c761293989600001516129348b602001518860c00151612fdb565b613016565b6129c26129b06000805480602002602001604051908101604052809291908181526020016000905b828210156129a757838290600052602060002090600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190612961565b50505050613866565b6129bd8860400151613469565b612fdb565b613016565b6129d9836020015184604001516138b3565b613016565b8160600181905250612a2a8160600151612a25600460408051908101604052908160008201548152602001600182015481525050612a208b6103600151613469565b612fdb565b613016565b8160600181905250612a528160600151612a4d83600001518a6103200151612fdb565b613016565b8160600181905250612a626143b7565b876104600151905060008090505b6006811015612baf57612ae08360800151836000015183600681101515612a9357fe5b6020020151846020015184600681101515612aaa57fe5b6020020151604051602001612ac1939291906150df565b6040516020818303038152906040528051906020012060019004612f66565b83608001818152505082608001518360a0015182600681101515612b0057fe5b6020020181815250506000612b188460800151613917565b9050612b998460600151612b94612b5c866000015186600681101515612b3a57fe5b6020020151612b5760028a6080015161353290919063ffffffff16565b612fdb565b612b8f876020015187600681101515612b7157fe5b6020020151612b8a60028861353290919063ffffffff16565b612fdb565b613016565b613016565b8460600181905250508080600101915050612a70565b5060018260c001516000604081101515612bc557fe5b60200201818152505060008090505b6006811015612c4657612c1d8360a0015182600681101515612bf257fe5b60200201518460c001516000604081101515612c0a57fe5b602002015161308490919063ffffffff16565b8360c001516000604081101515612c3057fe5b6020020181815250508080600101915050612bd4565b50612c4f61463e565b612c6f8360c001516000604081101515612c6557fe5b6020020151613917565b8360c001516000604081101515612c8257fe5b60200201818152505060008090505b60026040811515612c9e57fe5b04811015612db15760008090505b6040828260019060020a02011015612da55760008160019060020a02830190508381604081101515612cda57fe5b60200201511515612d99576000612d328760a0015184600160060303600681101515612d0257fe5b60200201518860a0015185600160060303600681101515612d1f57fe5b602002015161308490919063ffffffff16565b9050612d5d818860c0015186604081101515612d4a57fe5b602002015161308490919063ffffffff16565b8760c0015183604081101515612d6f57fe5b60200201818152505060018583604081101515612d8857fe5b602002019015159081151581525050505b50806001019050612cac565b50806001019050612c91565b50612dba614662565b612dc2614662565b60008090505b6040811015612e8b57612e3583612e30600084815481101515612de757fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250508960c0015185604081101515612e2657fe5b6020020151612fdb565b613016565b9250612e7c82612e77886020015184604081101515612e5057fe5b60200201518960c0015185600160400303604081101515612e6d57fe5b6020020151612fdb565b613016565b91508080600101915050612dc8565b50612e94614662565b612ee8612ebb612ea8858860400151612fdb565b612eb6858960600151612fdb565b613016565b612ee38860000151612ede89606001518a6040015161308490919063ffffffff16565b612fdb565b613016565b9050612ef886606001518261305c565b1515612f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3090614fb6565b60405180910390fd5b60019a505050505050505050505092915050565b6000604051826020850101518152805191505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182811515612f9357fe5b069050919050565b600081831015612fcf5782827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010301612fd3565b8183035b905092915050565b612fe3614662565b604051835181526020840151602082015282604082015260408260608360075afa151561300f57600080fd5b5092915050565b61301e614662565b6040518351815260208401516020820152825160408201526020830151606082015260408260808360065afa151561305557600080fd5b5092915050565b60008160000151836000015114801561307c575081602001518360200151145b905092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156130b057fe5b828409905092915050565b60606000600283518115156130cc57fe5b04905060008160020a90508060405190808252806020026020018201604052801561311157816020015b6130fe61449c565b8152602001906001900390816130f65790505b50925060008090505b60028110156131ab57606061313984830285600185010260018961394d565b905060008090505b8381101561319c57818181518110151561315757fe5b90602001906020020151868281518110151561316f57fe5b906020019060200201518460028110151561318657fe5b6020020181815250508080600101915050613141565b5050808060010191505061311a565b505050919050565b606060008351905060006002828115156131c957fe5b0490508060405190808252806020026020018201604052801561320657816020015b6131f361467c565b8152602001906001900390816131eb5790505b5092506060613216856000613b02565b90506060836040519080825280602002602001820160405280156132495781602001602082028038833980820191505090505b50905060008090505b600281101561345e5760008090505b858110156132c957888682880381151561327757fe5b0681518110151561328457fe5b906020019060200201518260028110151561329b57fe5b602002015183828151811015156132ae57fe5b90602001906020020181815250508080600101915050613261565b506132d382613d63565b915060608460405190808252806020026020018201604052801561331157816020015b6132fe61423f565b8152602001906001900390816132f65790505b50905060006002905061332381613917565b905060008090505b868110156133e0576133b86133b2613371888481518110151561334a57fe5b90602001906020020151888581518110151561336257fe5b90602001906020020151612fdb565b6133ad898b860181518110151561338457fe5b90602001906020020151898c870181518110151561339e57fe5b90602001906020020151612fdb565b613016565b83612fdb565b83828151811015156133c657fe5b90602001906020020181905250808060010191505061332b565b506133ec826001613b02565b915060008090505b8681101561344e57828181518110151561340a57fe5b90602001906020020151898281518110151561342257fe5b906020019060200201518560028110151561343957fe5b602002018190525080806001019150506133f4565b5050508080600101915050613252565b505050505092915050565b6000817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001039050919050565b61349d6146aa565b60018160006040811015156134ae57fe5b602002018181525050818160016040811015156134c757fe5b6020020181815250506000600290505b604081101561352c576135088383600184036040811015156134f557fe5b602002015161308490919063ffffffff16565b828260408110151561351657fe5b60200201818152505080806001019150506134d7565b50919050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa151561359357600080fd5b80519250505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156135cb57fe5b828408905092915050565b600080600090505b604081101561361b5761360c83826040811015156135f857fe5b60200201518361359f90919063ffffffff16565b915080806001019150506135de565b50919050565b613629614662565b6136897f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478484604051602001613660929190614e56565b604051602081830303815290604052805190602001206001900481151561368357fe5b06613f8b565b905092915050565b613699614662565b6040805190810160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001518115156136dd57fe5b067f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47038152509050919050565b6137126146ce565b60008090505b604081101561377f5761375c848281518110151561373257fe5b90602001906020020151613757858460408110151561374d57fe5b6020020151613917565b612fdb565b828260408110151561376a57fe5b60200201819052508080600101915050613718565b5092915050565b61378e6146aa565b60008090505b60408110156137e6576137c28385836040811015156137af57fe5b602002015161308490919063ffffffff16565b82826040811015156137d057fe5b6020020181815250508080600101915050613794565b5092915050565b6137f56146aa565b60008090505b604081101561385f5761383b838260408110151561381557fe5b6020020151858360408110151561382857fe5b602002015161359f90919063ffffffff16565b828260408110151561384957fe5b60200201818152505080806001019150506137fb565b5092915050565b61386e614662565b60008090505b60408110156138ad5761389e82848381518110151561388f57fe5b90602001906020020151613016565b91508080600101915050613874565b50919050565b6138bb614662565b60008090505b604081101561391057613901826138fc86846040811015156138df57fe5b602002015186856040811015156138f257fe5b6020020151612fdb565b613016565b915080806001019150506138c1565b5092915050565b60006139468260027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103613532565b9050919050565b6060600085850360020a9050806040519080825280602002602001820160405280156139885781602001602082028038833980820191505090505b509150858514156139ba57838260008151811015156139a357fe5b906020019060200201818152505081915050613afa565b6001850394506060613a0a8787613a04878a8151811015156139d857fe5b9060200190602002015160006002811015156139f057fe5b60200201518961308490919063ffffffff16565b8761394d565b90506060613a568888613a50888b815181101515613a2457fe5b906020019060200201516001600281101515613a3c57fe5b60200201518a61308490919063ffffffff16565b8861394d565b905060008090505b600284811515613a6a57fe5b04811015613af5578281815181101515613a8057fe5b906020019060200201518582815181101515613a9857fe5b90602001906020020181815250508181815181101515613ab457fe5b9060200190602002015185600286811515613acb57fe5b048301815181101515613ada57fe5b90602001906020020181815250508080600101915050613a5e565b505050505b949350505050565b60606000835190506001811415613b1c5783915050613d5d565b6000600282811515613b2a57fe5b06141515613b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6490614f16565b60405180910390fd5b6000613bb1826310000000811515613b8157fe5b047f14a3074b02521e3b1ed9852e5028452693e87be4e910500c7ba9bbddb2f46edd61353290919063ffffffff16565b90506000600190508415613bcf57613bc882613917565b9150600290505b613bd881613917565b90506060613bf0613bea88600061402b565b87613b02565b90506060613c08613c0289600161402b565b88613b02565b905060006001905085604051908082528060200260200182016040528015613c4a57816020015b613c3761423f565b815260200190600190039081613c2f5790505b50965060008090505b600287811515613c5f57fe5b04811015613d5557613c6f614662565b613c908483815181101515613c8057fe5b9060200190602002015184612fdb565b9050613cbc613cb68684815181101515613ca657fe5b9060200190602002015183613016565b87612fdb565b8983815181101515613cca57fe5b90602001906020020181905250613d09613d038684815181101515613ceb57fe5b90602001906020020151613cfe84613691565b613016565b87612fdb565b8960028a811515613d1657fe5b048401815181101515613d2557fe5b90602001906020020181905250613d45878461308490919063ffffffff16565b9250508080600101915050613c53565b505050505050505b92915050565b60606000825190506001811415613d7d5782915050613f86565b6000600282811515613d8b57fe5b06141515613dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc590614f16565b60405180910390fd5b6000613e12826310000000811515613de257fe5b047f14a3074b02521e3b1ed9852e5028452693e87be4e910500c7ba9bbddb2f46edd61353290919063ffffffff16565b90506060613e29613e248660006140de565b613d63565b90506060613e40613e3b8760016140de565b613d63565b905060006001905084604051908082528060200260200182016040528015613e775781602001602082028038833980820191505090505b50955060008090505b600286811515613e8c57fe5b04811015613f7f576000613ec0838584815181101515613ea857fe5b9060200190602002015161308490919063ffffffff16565b9050613eec818684815181101515613ed457fe5b9060200190602002015161359f90919063ffffffff16565b8883815181101515613efa57fe5b9060200190602002018181525050613f32818684815181101515613f1a57fe5b90602001906020020151612f9b90919063ffffffff16565b88600289811515613f3f57fe5b048401815181101515613f4e57fe5b9060200190602002018181525050613f6f868461308490919063ffffffff16565b9250508080600101915050613e80565b5050505050505b919050565b613f93614662565b60005b60011561400e5760006003613fac856003614187565b019050613fe881600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4701811515613fe257fe5b04614187565b915080613ff6836002614187565b1415614002575061400e565b60018401935050613f96565b604080519081016040528084815260200182815250915050919050565b60606002835181151561403a57fe5b0460405190808252806020026020018201604052801561407457816020015b61406161423f565b8152602001906001900390816140595790505b50905060008090505b6002845181151561408a57fe5b048110156140d757838382600202018151811015156140a557fe5b9060200190602002015182828151811015156140bd57fe5b90602001906020020181905250808060010191505061407d565b5092915050565b6060600283518115156140ed57fe5b0460405190808252806020026020018201604052801561411c5781602001602082028038833980820191505090505b50905060008090505b6002845181151561413257fe5b04811015614180578383826002020181518110151561414d57fe5b90602001906020020151828281518110151561416557fe5b90602001906020020181815250508080600101915050614125565b5092915050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa15156141e857600080fd5b80519250505092915050565b6101206040519081016040528060608152602001606081526020016060815260200161421e61423f565b8152602001606081526020016000815260200161423961423f565b81525090565b604080519081016040528060008152602001600081525090565b6109806040519081016040528061426e61423f565b815260200161427b61423f565b815260200161428861423f565b815260200161429561423f565b81526020016142a261423f565b81526020016142af61423f565b81526020016142bc61423f565b81526020016142c961423f565b815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000815260200161432a61423f565b815260200161433761423f565b815260200161434461423f565b815260200161435161423f565b815260200161435e61467c565b8152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016143b16146fd565b81525090565b610340604051908101604052806143cc614733565b81526020016143d9614733565b815260200160008152602001600081525090565b61030060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200161443a61423f565b815260200161444761423f565b815260200161445461423f565b8152602001606081526020016060815260200161446f61423f565b815260200161447c61423f565b815260200161448961423f565b815260200161449661423f565b81525090565b6040805190810160405280600290602082028038833980820191505090505090565b61114060405190810160405280600081526020016144da614762565b8152602001600081526020016144ee61449c565b81526020016144fb614762565b81526020016000815260200160008152602001600081526020016000815260200161452461423f565b81525090565b610320604051908101604052806000815260200161454661423f565b815260200161455361423f565b815260200161456061423f565b815260200161456d61423f565b815260200161457a61423f565b815260200161458761423f565b815260200161459461423f565b81526020016145a161423f565b81526020016145ae61423f565b81526020016145bb61423f565b81526020016145c861423f565b81526020016145d561423f565b81525090565b612160604051908101604052806145f061423f565b81526020016145fd614786565b815260200161460a614762565b815260200161461761423f565b81526020016000815260200161462b6147b5565b8152602001614638614762565b81525090565b61080060405190810160405280604090602082028038833980820191505090505090565b604080519081016040528060008152602001600081525090565b6080604051908101604052806002905b61469461423f565b81526020019060019003908161468c5790505090565b61080060405190810160405280604090602082028038833980820191505090505090565b611000604051908101604052806040905b6146e761423f565b8152602001906001900390816146df5790505090565b61034060405190810160405280614712614733565b815260200161471f614733565b815260200160008152602001600081525090565b610180604051908101604052806006905b61474c61423f565b8152602001906001900390816147445790505090565b61080060405190810160405280604090602082028038833980820191505090505090565b611000604051908101604052806040905b61479f61423f565b8152602001906001900390816147975790505090565b60c060405190810160405280600690602082028038833980820191505090505090565b600082601f83011215156147eb57600080fd5b81356147fe6147f9826152c6565b615299565b9150818183526020840193506020810190508385604084028201111561482357600080fd5b60005b838110156148535781614839888261485d565b845260208401935060408301925050600181019050614826565b5050505092915050565b600082601f830112151561487057600080fd5b600261488361487e826152ee565b615299565b9150818385602084028201111561489957600080fd5b60005b838110156148c957816148af8882614949565b84526020840193506020830192505060018101905061489c565b5050505092915050565b600082601f83011215156148e657600080fd5b60026148f96148f482615310565b615299565b9150818385602084028201111561490f57600080fd5b60005b8381101561493f57816149258882614949565b845260208401935060208301925050600181019050614912565b5050505092915050565b600061495582356153fe565b905092915050565b600082601f830112151561497057600080fd5b813561498361497e82615332565b615299565b9150808252602083016020830185838301111561499f57600080fd5b6149aa838284615412565b50505092915050565b60006149bf8235615408565b905092915050565b600080600080600080600080610140898b0312156149e457600080fd5b600089013567ffffffffffffffff8111156149fe57600080fd5b614a0a8b828c016147d8565b985050602089013567ffffffffffffffff811115614a2757600080fd5b614a338b828c016147d8565b975050604089013567ffffffffffffffff811115614a5057600080fd5b614a5c8b828c016147d8565b9650506060614a6d8b828c016148d3565b95505060a089013567ffffffffffffffff811115614a8a57600080fd5b614a968b828c016147d8565b94505060c0614aa78b828c016149b3565b93505060e0614ab88b828c016148d3565b92505061012089013567ffffffffffffffff811115614ad657600080fd5b614ae28b828c0161495d565b9150509295985092959890939650565b6000614afe8383614dc3565b60408301905092915050565b614b1381615375565b614b1d81846153b0565b9250614b288261535e565b60005b82811015614b5657614b3e858351614af2565b9450614b4982615396565b9150600181019050614b2b565b5050505050565b6000614b6882615380565b614b7281856153bb565b9350614b7d83615368565b60005b82811015614bab57614b93868351614af2565b9550614b9e826153a3565b9150600181019050614b80565b50849250505092915050565b614bc0816153e8565b82525050565b6000614bd18261538b565b614bdb81856153dd565b9350614beb818560208601615421565b80840191505092915050565b6000614c04601f836153cc565b91507f496e7075742073697a65206973206e6f74206120706f776572206f66203221006000830152602082019050919050565b6000614c44602a836153cc565b91507f5369676d612070726f746f636f6c206368616c6c656e676520657175616c697460008301527f79206661696c7572652e000000000000000000000000000000000000000000006020830152604082019050919050565b6000614caa601d836153cc565b91507f5265636f76657279206661696c75726520666f7220465e77202a20452e0000006000830152602082019050919050565b6000614cea601d836153cc565b91507f5265636f76657279206661696c75726520666f7220435e77202a20442e0000006000830152602082019050919050565b6000614d2a601d836153cc565b91507f5265636f76657279206661696c75726520666f7220425e77202a20412e0000006000830152602082019050919050565b6000614d6a6025836153cc565b91507f496e6e65722070726f6475637420657175616c69747920636865636b2066616960008301527f6c7572652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b604082016000820151614dd96000850182614e21565b506020820151614dec6020850182614e21565b50505050565b604082016000820151614e086000850182614e21565b506020820151614e1b6020850182614e21565b50505050565b614e2a816153f4565b82525050565b614e39816153f4565b82525050565b614e50614e4b826153f4565b615454565b82525050565b6000614e628285614bc6565b9150614e6e8284614e3f565b6020820191508190509392505050565b600060e0820190508181036000830152614e988189614b5d565b90508181036020830152614eac8188614b5d565b90508181036040830152614ec08187614b5d565b9050614ecf6060830186614df2565b81810360a0830152614ee18185614b5d565b9050614ef060c0830184614e30565b979650505050505050565b6000602082019050614f106000830184614bb7565b92915050565b60006020820190508181036000830152614f2f81614bf7565b9050919050565b60006020820190508181036000830152614f4f81614c37565b9050919050565b60006020820190508181036000830152614f6f81614c9d565b9050919050565b60006020820190508181036000830152614f8f81614cdd565b9050919050565b60006020820190508181036000830152614faf81614d1d565b9050919050565b60006020820190508181036000830152614fcf81614d5d565b9050919050565b6000602082019050614feb6000830184614e30565b92915050565b600060a0820190506150066000830185614e30565b6150136020830184614b0a565b9392505050565b600061012082019050615030600083018c614e30565b8181036020830152615042818b614b5d565b90508181036040830152615056818a614b5d565b9050818103606083015261506a8189614b5d565b9050818103608083015261507e8188614b5d565b905081810360a08301526150928187614b5d565b905081810360c08301526150a68186614b5d565b905081810360e08301526150ba8185614b5d565b90508181036101008301526150cf8184614b5d565b90509a9950505050505050505050565b600060a0820190506150f46000830186614e30565b6151016020830185614df2565b61510e6060830184614df2565b949350505050565b60006101208201905061512c6000830188614e30565b6151396020830187614df2565b6151466060830186614df2565b61515360a0830185614df2565b61516060e0830184614df2565b9695505050505050565b600061022082019050615180600083018c614e30565b61518d602083018b614df2565b61519a606083018a614df2565b6151a760a0830189614df2565b6151b460e0830188614df2565b6151c2610120830187614df2565b6151d0610160830186614df2565b6151de6101a0830185614df2565b6151ec6101e0830184614df2565b9a9950505050505050505050565b600061026082019050615210600083018d614e30565b61521d602083018c614df2565b61522a606083018b614df2565b61523760a083018a614df2565b61524460e0830189614df2565b615252610120830188614df2565b615260610160830187614df2565b61526e6101a0830186614df2565b61527c6101e0830185614df2565b61528a610220830184614df2565b9b9a5050505050505050505050565b6000604051905081810181811067ffffffffffffffff821117156152bc57600080fd5b8060405250919050565b600067ffffffffffffffff8211156152dd57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561530557600080fd5b602082029050919050565b600067ffffffffffffffff82111561532757600080fd5b602082029050919050565b600067ffffffffffffffff82111561534957600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60008115159050919050565b6000819050919050565b6000819050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561543f578082015181840152602081019050615424565b8381111561544e576000848401525b50505050565b600081905091905056fea265627a7a72305820a241c0aa8af863b39fdad9b018dd2ef019258322911079d187503547662c02bf6c6578706572696d656e74616cf50037", - "sourceMap": "81:28218:5:-;;;1854:208;8:9:-1;5:2;;;30:1;27;20:12;5:2;1854:208:5;1889:12;;;;;;;;;;;;;;;;;;;:7;;;:12;;;:::i;:::-;1885:1;:16;;;;;;;;;;;;;;;;;;;1915:12;;;;;;;;;;;;;;;;;;;:7;;;:12;;;:::i;:::-;1911:1;:16;;;;;;;;;;;;;;;;;;;1942:9;1954:1;1942:13;;1937:119;162:2;1957:1;:5;1937:119;;;1983:2;1991:15;;;;;;;;;;;;;;;;;;;2004:1;1991:7;;;:15;;;:::i;:::-;1983:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1983:24:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2021:2;2029:15;;;;;;;;;;;;;;;;;;;2042:1;2029:7;;;:15;;;:::i;:::-;2021:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;2021:24:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1964:3;;;;;;;1937:119;;;;81:28218;;27943:167;28004:14;;:::i;:::-;28037:66;229:77;28080:5;28063:23;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28063:23:5;;;28053:34;;;;;;28045:43;;;:57;;;;;;;;28037:7;;;:66;;;:::i;:::-;28030:73;;27943:167;;;:::o;28116:181::-;28188:14;;:::i;:::-;28221:69;229:77;28264:5;28271:1;28247:26;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28247:26:5;;;28237:37;;;;;;28229:46;;;:60;;;;;;;;28221:7;;;:69;;;:::i;:::-;28214:76;;28116:181;;;;:::o;27488:449::-;27542:14;;:::i;:::-;27568:9;27587:311;27594:4;27587:311;;;27614:16;27653:1;27633:17;27642:4;27648:1;27633:8;;;:17;;;:::i;:::-;:21;27614:40;;27740:41;27749:8;27779:1;27774;229:77;27760:15;27759:21;;;;;;;;27740:8;;;:41;;;:::i;:::-;27736:45;;27817:8;27799:14;27808:1;27811;27799:8;;;:14;;;:::i;:::-;:26;27795:70;;;27845:5;;;27795:70;27886:1;27878:9;;;;27587:311;;;;27914:16;;;;;;;;;27922:4;27914:16;;;;27928:1;27914:16;;;27907:23;;;27488:449;;;:::o;26872:610::-;26945:14;26996:13;229:77;26996:27;;27071:4;27065:11;27099:4;27096:1;27089:15;27138:4;27131;27128:1;27124:12;27117:26;27177:4;27170;27167:1;27163:12;27156:26;27216:4;27209;27206:1;27202:12;27195:26;27255:8;27248:4;27245:1;27241:12;27234:30;27298:5;27291:4;27288:1;27284:12;27277:27;27361:4;27358:1;27352:4;27349:1;27343:4;27338:3;27327:39;27320:47;27317:2;;;27419:1;27416;27409:12;27317:2;27464:1;27458:8;27448:18;;27042:434;;;;;;:::o;81:28218::-;;;;;;;;;;;;;;;;;;;;:::o;5:360:-1:-;;135:39;168:5;135:39;;;186:89;268:6;263:3;186:89;;;179:96;;280:52;325:6;320:3;313:4;306:5;302:16;280:52;;;353:6;348:3;344:16;337:23;;115:250;;;;;;372:159;473:52;493:31;518:5;493:31;;;473:52;;;468:3;461:65;455:76;;;538:266;;684:95;775:3;766:6;684:95;;;677:102;;796:3;789:10;;665:139;;;;;811:405;;985:95;1076:3;1067:6;985:95;;;978:102;;1091:75;1162:3;1153:6;1091:75;;;1188:2;1183:3;1179:12;1172:19;;1208:3;1201:10;;966:250;;;;;;1223:92;;1304:5;1298:12;1288:22;;1282:33;;;;1323:145;;1459:3;1444:18;;1437:31;;;;;1476:79;;1545:5;1534:16;;1528:27;;;;1563:268;1628:1;1635:101;1649:6;1646:1;1643:13;1635:101;;;1725:1;1720:3;1716:11;1710:18;1706:1;1701:3;1697:11;1690:39;1671:2;1668:1;1664:10;1659:15;;1635:101;;;1751:6;1748:1;1745:13;1742:2;;;1816:1;1807:6;1802:3;1798:16;1791:27;1742:2;1612:219;;;;;1839:74;;1903:5;1892:16;;1886:27;;;;81:28218:5;;;;;;;", - "deployedSourceMap": "81:28218:5:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81:28218:5;;;;;;;;;;;;;;;;;;;;2068:1109;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2286:4;2302:32;;:::i;:::-;2344:12;2359:1;:8;2344:23;;2408:4;2394:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2378:9;:13;;:35;;;;2453:4;2439:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2423:9;:13;;:35;;;;2496:4;2482:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2468:9;:11;;:33;;;;2539:4;2525:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2511:9;:11;;:33;;;;2559:9;2571:1;2559:13;;2554:354;2578:4;2574:1;:8;2554:354;;;2622:47;;;;;;;;;2638:3;2642:1;2638:6;;;;;;;;;;;;;;;;;;2645:1;2638:9;;;;;;;;;;;;;2630:18;;;2622:47;;;;2658:3;2662:1;2658:6;;;;;;;;;;;;;;;;;;2665:1;2658:9;;;;;;;;;;;;;2650:18;;;2622:47;;;2603:9;:13;;;2617:1;2603:16;;;;;;;;;;;;;;;;;:66;;;;2702:47;;;;;;;;;2718:3;2722:1;2718:6;;;;;;;;;;;;;;;;;;2725:1;2718:9;;;;;;;;;;;;;2710:18;;;2702:47;;;;2738:3;2742:1;2738:6;;;;;;;;;;;;;;;;;;2745:1;2738:9;;;;;;;;;;;;;2730:18;;;2702:47;;;2683:9;:13;;;2697:1;2683:16;;;;;;;;;;;;;;;;;:66;;;;2780:43;;;;;;;;;2796:1;2798;2796:4;;;;;;;;;;;;;;;;;;2801:1;2796:7;;;;;;;;;;;;;2788:16;;;2780:43;;;;2814:1;2816;2814:4;;;;;;;;;;;;;;;;;;2819:1;2814:7;;;;;;;;;;;;;2806:16;;;2780:43;;;2763:9;:11;;;2775:1;2763:14;;;;;;;;;;;;;;;;;:60;;;;2854:43;;;;;;;;;2870:1;2872;2870:4;;;;;;;;;;;;;;;;;;2875:1;2870:7;;;;;;;;;;;;;2862:16;;;2854:43;;;;2888:1;2890;2888:4;;;;;;;;;;;;;;;;;;2893:1;2888:7;;;;;;;;;;;;;2880:16;;;2854:43;;;2837:9;:11;;;2849:1;2837:14;;;;;;;;;;;;;;;;;:60;;;;2584:3;;;;;;;2554:354;;;;2931:37;;;;;;;;;2947:1;2949;2947:4;;;;;;;;;;;;;2939:13;;;2931:37;;;;2962:1;2964;2962:4;;;;;;;;;;;;;2954:13;;;2931:37;;;2917:9;:11;;:51;;;;2996:5;2978:9;:15;;:23;;;;;3025:37;;;;;;;;;3041:1;3043;3041:4;;;;;;;;;;;;;3033:13;;;3025:37;;;;3056:1;3058;3056:4;;;;;;;;;;;;;3048:13;;;3025:37;;;3011:9;:11;;:51;;;;3072:30;;:::i;:::-;3105:18;3117:5;3105:11;:18::i;:::-;3072:51;;3140:30;3147:9;3158:11;3140:6;:30::i;:::-;3133:37;;;;;2068:1109;;;;;;;;;;:::o;20137:3712::-;20199:24;;:::i;:::-;20246:38;;;;;;;;;20254:13;20260:3;20265:1;20254:5;:13::i;:::-;20246:38;;;;20269:14;20275:3;20280:2;20269:5;:14::i;:::-;20246:38;;;20235:5;:8;;:49;;;;20305:39;;;;;;;;;20313:14;20319:3;20324:2;20313:5;:14::i;:::-;20305:39;;;;20329:14;20335:3;20340:2;20329:5;:14::i;:::-;20305:39;;;20294:5;:8;;:50;;;;20364:41;;;;;;;;;20372:15;20378:3;20383;20372:5;:15::i;:::-;20364:41;;;;20389:15;20395:3;20400;20389:5;:15::i;:::-;20364:41;;;20354:5;:7;;:51;;;;20425:41;;;;;;;;;20433:15;20439:3;20444;20433:5;:15::i;:::-;20425:41;;;;20450:15;20456:3;20461;20450:5;:15::i;:::-;20425:41;;;20415:5;:7;;:51;;;;20486:41;;;;;;;;;20494:15;20500:3;20505;20494:5;:15::i;:::-;20486:41;;;;20511:15;20517:3;20522;20511:5;:15::i;:::-;20486:41;;;20476:5;:7;;:51;;;;20547:41;;;;;;;;;20555:15;20561:3;20566;20555:5;:15::i;:::-;20547:41;;;;20572:15;20578:3;20583;20572:5;:15::i;:::-;20547:41;;;20537:5;:7;;:51;;;;20608:41;;;;;;;;;20616:15;20622:3;20627;20616:5;:15::i;:::-;20608:41;;;;20633:15;20639:3;20644;20633:5;:15::i;:::-;20608:41;;;20598:5;:7;;:51;;;;20669:41;;;;;;;;;20677:15;20683:3;20688;20677:5;:15::i;:::-;20669:41;;;;20694:15;20700:3;20705;20694:5;:15::i;:::-;20669:41;;;20659:5;:7;;:51;;;;20721:9;20755:3;20747:4;20734:3;:10;:17;20733:25;;;;;;;;20721:37;;20795:1;20781:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20768:5;:10;;:29;;;;20834:1;20820:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20807:5;:10;;:29;;;;20873:1;20859:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20846:5;:10;;:29;;;;20910:1;20896:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20885:5;:8;;:27;;;;20949:1;20935:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20922:5;:10;;:29;;;;20986:1;20972:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20961:5;:8;;:27;;;;21025:1;21011:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20998:5;:10;;:29;;;;21064:1;21050:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;21037:5;:10;;:29;;;;21104:1;21100;:5;21086:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;21086:20:5;;;;21076:5;:7;;:30;;;;21121:9;21133:1;21121:13;;21116:1009;21140:1;21136;:5;21116:1009;;;21178:59;;;;;;;;;21186:24;21192:3;21207:2;21203:1;:6;21197:3;:12;21186:5;:24::i;:::-;21178:59;;;;21212:24;21218:3;21233:2;21229:1;:6;21223:3;:12;21212:5;:24::i;:::-;21178:59;;;21162:5;:10;;;21173:1;21162:13;;;;;;;;;;;;;;;;;:75;;;;21267:71;;;;;;;;;21275:30;21281:3;21302:2;21297:1;21293;:5;21292:12;21286:3;:18;21275:5;:30::i;:::-;21267:71;;;;21307:30;21313:3;21334:2;21329:1;21325;:5;21324:12;21318:3;:18;21307:5;:30::i;:::-;21267:71;;;21251:5;:10;;;21262:1;21251:13;;;;;;;;;;;;;;;;;:87;;;;21368:79;;;;;;;;;21376:34;21382:3;21407:2;21403:1;:6;21397:3;21393:1;:7;21387:3;:13;:22;21376:5;:34::i;:::-;21368:79;;;;21412:34;21418:3;21443:2;21439:1;:6;21433:3;21429:1;:7;21423:3;:13;:22;21412:5;:34::i;:::-;21368:79;;;21352:5;:10;;;21363:1;21352:13;;;;;;;;;;;;;;;;;:95;;;;21475:79;;;;;;;;;21483:34;21489:3;21514:2;21510:1;:6;21504:3;21500:1;:7;21494:3;:13;:22;21483:5;:34::i;:::-;21475:79;;;;21519:34;21525:3;21550:2;21546:1;:6;21540:3;21536:1;:7;21530:3;:13;:22;21519:5;:34::i;:::-;21475:79;;;21461:5;:8;;;21470:1;21461:11;;;;;;;;;;;;;;;;;:93;;;;21584:79;;;;;;;;;21592:34;21598:3;21623:2;21619:1;:6;21613:3;21609:1;:7;21603:3;:13;:22;21592:5;:34::i;:::-;21584:79;;;;21628:34;21634:3;21659:2;21655:1;:6;21649:3;21645:1;:7;21639:3;:13;:22;21628:5;:34::i;:::-;21584:79;;;21568:5;:10;;;21579:1;21568:13;;;;;;;;;;;;;;;;;:95;;;;21691:79;;;;;;;;;21699:34;21705:3;21730:2;21726:1;:6;21720:3;21716:1;:7;21710:3;:13;:22;21699:5;:34::i;:::-;21691:79;;;;21735:34;21741:3;21766:2;21762:1;:6;21756:3;21752:1;:7;21746:3;:13;:22;21735:5;:34::i;:::-;21691:79;;;21677:5;:8;;;21686:1;21677:11;;;;;;;;;;;;;;;;;:93;;;;21800:79;;;;;;;;;21808:34;21814:3;21839:2;21835:1;:6;21829:3;21825:1;:7;21819:3;:13;:22;21808:5;:34::i;:::-;21800:79;;;;21844:34;21850:3;21875:2;21871:1;:6;21865:3;21861:1;:7;21855:3;:13;:22;21844:5;:34::i;:::-;21800:79;;;21784:5;:10;;;21795:1;21784:13;;;;;;;;;;;;;;;;;:95;;;;21909:79;;;;;;;;;21917:34;21923:3;21948:2;21944:1;:6;21938:3;21934:1;:7;21928:3;:13;:22;21917:5;:34::i;:::-;21909:79;;;;21953:34;21959:3;21984:2;21980:1;:6;21974:3;21970:1;:7;21964:3;:13;:22;21953:5;:34::i;:::-;21909:79;;;21893:5;:10;;;21904:1;21893:13;;;;;;;;;;;;;;;;;:95;;;;22015:34;22021:3;22046:2;22042:1;:6;22036:3;22032:1;:7;22026:3;:13;:22;22015:5;:34::i;:::-;22002:5;:7;;;22010:1;22002:10;;;;;;;;;;;;;;;;;:47;;;;;22080:34;22086:3;22111:2;22107:1;:6;22101:3;22097:1;:7;22091:3;:13;:22;22080:5;:34::i;:::-;22063:5;:7;;;22075:1;22071;:5;22063:14;;;;;;;;;;;;;;;;;:51;;;;;21143:3;;;;;;;21116:1009;;;;22134:16;22157:3;22153:1;:7;22134:26;;22182;22188:3;22199:8;22193:3;:14;22182:5;:26::i;:::-;22170:5;:9;;:38;;;;;22230:26;22236:3;22247:8;22241:3;:14;22230:5;:26::i;:::-;22218:5;:9;;:38;;;;;22278:26;22284:3;22295:8;22289:3;:14;22278:5;:26::i;:::-;22266:5;:9;;:38;;;;;22330:63;;;;;;;;;22338:26;22344:3;22355:8;22349:3;:14;22338:5;:26::i;:::-;22330:63;;;;22366:26;22372:3;22383:8;22377:3;:14;22366:5;:26::i;:::-;22330:63;;;22315:5;:12;;:78;;;;22418:63;;;;;;;;;22426:26;22432:3;22443:8;22437:3;:14;22426:5;:26::i;:::-;22418:63;;;;22454:26;22460:3;22471:8;22465:3;:14;22454:5;:26::i;:::-;22418:63;;;22403:5;:12;;:78;;;;22508:63;;;;;;;;;22516:26;22522:3;22533:8;22527:3;:14;22516:5;:26::i;:::-;22508:63;;;;22544:26;22550:3;22561:8;22555:3;:14;22544:5;:26::i;:::-;22508:63;;;22491:5;:14;;:80;;;;22598:63;;;;;;;;;22606:26;22612:3;22623:8;22617:3;:14;22606:5;:26::i;:::-;22598:63;;;;22634:26;22640:3;22651:8;22645:3;:14;22634:5;:26::i;:::-;22598:63;;;22581:5;:14;;:80;;;;22672:147;;;;;;;;;22690:63;;;;;;;;;22698:26;22704:3;22715:8;22709:3;:14;22698:5;:26::i;:::-;22690:63;;;;22726:26;22732:3;22743:8;22737:3;:14;22726:5;:26::i;:::-;22690:63;;;22672:147;;;;22755:63;;;;;;;;;22763:26;22769:3;22780:8;22774:3;:14;22763:5;:26::i;:::-;22755:63;;;;22791:26;22797:3;22808:8;22802:3;:14;22791:5;:26::i;:::-;22755:63;;;22672:147;;;:5;:14;;:147;;;;22842:26;22848:3;22859:8;22853:3;:14;22842:5;:26::i;:::-;22829:5;:10;;:39;;;;;22891:27;22897:3;22909:8;22902:4;:15;22891:5;:27::i;:::-;22878:5;:10;;:40;;;;;22939:27;22945:3;22957:8;22950:4;:15;22939:5;:27::i;:::-;22928:5;:8;;:38;;;;;22987:27;22993:3;23005:8;22998:4;:15;22987:5;:27::i;:::-;22977:5;:7;;:37;;;;;23037:27;23043:3;23055:8;23048:4;:15;23037:5;:27::i;:::-;23024:5;:10;;:40;;;;;23086:27;23092:3;23104:8;23097:4;:15;23086:5;:27::i;:::-;23074:5;:9;;:39;;;;;23143:27;23149:3;23161:8;23154:4;:15;23143:5;:27::i;:::-;23123:5;:17;;:47;;;;;23196:27;23202:3;23214:8;23207:4;:15;23196:5;:27::i;:::-;23180:5;:13;;:43;;;;;23254:27;23260:3;23272:8;23265:4;:15;23254:5;:27::i;:::-;23233:5;:18;;:48;;;;;23308:27;23314:3;23326:8;23319:4;:15;23308:5;:27::i;:::-;23291:5;:14;;:44;;;;;23346:32;;:::i;:::-;23393:9;23405:1;23393:13;;23388:281;191:1;23408;:5;23388:281;;;23450:83;;;;;;;;;23458:36;23464:3;23491:2;23487:1;:6;23476:8;23469:4;:15;:24;23458:5;:36::i;:::-;23450:83;;;;23496:36;23502:3;23529:2;23525:1;:6;23514:8;23507:4;:15;:24;23496:5;:36::i;:::-;23450:83;;;23434:7;:10;;;23445:1;23434:13;;;;;;;;;;;;:99;;;;23563:95;;;;;;;;;23571:42;23577:3;23610:2;23605:1;191;23601:5;23600:12;23589:8;23582:4;:15;:30;23571:5;:42::i;:::-;23563:95;;;;23615:42;23621:3;23654:2;23649:1;191;23645:5;23644:12;23633:8;23626:4;:15;:30;23615:5;:42::i;:::-;23563:95;;;23547:7;:10;;;23558:1;23547:13;;;;;;;;;;;;:111;;;;23415:3;;;;;;;23388:281;;;;23690:37;23696:3;23723;191:1;23719:7;23708:8;23701:4;:15;:25;23690:5;:37::i;:::-;23678:7;:9;;:49;;;;;23749:37;23755:3;23782;191:1;23778:7;23767:8;23760:4;:15;:25;23749:5;:37::i;:::-;23737:7;:9;;:49;;;;;23812:7;23796:5;:13;;:23;;;;23837:5;23830:12;;;;;20137:3712;;;:::o;4513:10477::-;4612:4;4628:21;4652:122;4681:9;:13;;;4696:9;:13;;;4711:9;:11;;;4724:9;:11;;;4737:9;:11;;;4750:9;:15;;;4670:96;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4670:96:5;;;4660:107;;;;;;4652:116;;;:120;:122::i;:::-;4628:146;;4785:38;;:::i;:::-;4853:125;4882:13;4897:5;:8;;;4907:5;:8;;;4917:5;:7;;;4926:5;:7;;;4935:5;:7;;;4944:5;:7;;;4953:5;:7;;;4962:5;:7;;;4871:99;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4871:99:5;;;4861:110;;;;;;4853:119;;;:123;:125::i;:::-;4833:15;:17;;:145;;;;;5008:147;5037:15;:17;;;5056:5;:10;;;5068:5;:10;;;5080:5;:10;;;5092:5;:8;;;5102:5;:10;;;5114:5;:8;;;5124:5;:10;;;5136:5;:10;;;5026:121;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5026:121:5;;;5016:132;;;;;;5008:141;;;:145;:147::i;:::-;4988:15;:17;;:167;;;;;5202:1;5185:5;:7;;;:14;:18;;;;;;;;5165:15;:17;;:38;;;;;5238:15;:17;;;5233:1;:22;5213:15;:17;;:42;;;;;5306:15;:17;;;5302:1;:21;5285:39;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5265:15;:17;;:59;;;;5339:9;5351:1;5339:13;;5334:186;5362:15;:17;;;5358:1;:21;5354:1;:25;5334:186;;;5426:5;:7;;;5434:1;5426:10;;;;;;;;;;;;;;;;;;5400:15;:17;;;5418:1;5400:20;;;;;;;;;;;;;;;;;;5421:1;5400:23;;;;;;;;;;;;:36;;;;;5476:33;5498:5;:7;;;5506:1;5498:10;;;;;;;;;;;;;;;;;;5476:15;:17;;;:21;;:33;;;;:::i;:::-;5450:15;:17;;;5468:1;5450:20;;;;;;;;;;;;;;;;;;5471:1;5450:23;;;;;;;;;;;;:59;;;;;5381:3;;;;;;;5334:186;;;;5535:9;5547:1;5535:13;;5530:162;5558:15;:17;;;5554:1;:21;5550:1;:25;5530:162;;;5619:62;5623:15;:20;;;5645:35;5649:2;5652:1;5649:5;;;;;;;;;;;;;;;;;;;;5645:35;;;;;;;;;;;;;;;;;;;;;;;;;;5656:15;:17;;;5674:1;5656:20;;;;;;;;;;;;;;;;;;5677:1;5656:23;;;;;;;;;;;;;5645:3;:35::i;:::-;5619:3;:62::i;:::-;5596:15;:20;;:85;;;;5577:3;;;;;;;5530:162;;;;5709:95;5712:45;5716:31;5720:5;:7;;;5729:15;:17;;;5716:3;:31::i;:::-;5749:5;:7;;;5712:3;:45::i;:::-;5759:44;5763:15;:20;;;5785:17;5789:1;5785:17;;;;;;;;;;;;;;;;;;;;;;;;;;5792:5;:9;;;5785:3;:17::i;:::-;5759:3;:44::i;:::-;5709:2;:95::i;:::-;5701:137;;;;;;;;;;;;;;;;;;;;;;;;5872:13;;;;;;;;;5880:1;5872:13;;;;5883:1;5872:13;;;5849:15;:20;;:36;;;;5900:9;5912:1;5900:13;;5895:260;5923:15;:17;;;5919:1;:21;5915:1;:25;5895:260;;;6030:114;6034:15;:20;;;6056:87;6060:2;6063:1;6060:5;;;;;;;;;;;;;;;;;;;;6056:87;;;;;;;;;;;;;;;;;;;;;;;;;;6067:75;6095:46;6117:15;:17;;;6135:1;6117:20;;;;;;;;;;;;;;;;;;6138:1;6117:23;;;;;;;;;;;;;6095:15;:17;;;:21;;:46;;;;:::i;:::-;6067:15;:17;;;6085:1;6067:20;;;;;;;;;;;;;;;;;;6088:1;6067:23;;;;;;;;;;;;;:27;;:75;;;;:::i;:::-;6056:3;:87::i;:::-;6030:3;:114::i;:::-;6007:15;:20;;:137;;;;5942:3;;;;;;;5895:260;;;;6172:95;6175:45;6179:31;6183:5;:7;;;6192:15;:17;;;6179:3;:31::i;:::-;6212:5;:7;;;6175:3;:45::i;:::-;6222:44;6226:15;:20;;;6248:17;6252:1;6248:17;;;;;;;;;;;;;;;;;;;;;;;;;;6255:5;:9;;;6248:3;:17::i;:::-;6222:3;:44::i;:::-;6172:2;:95::i;:::-;6164:137;;;;;;;;;;;;;;;;;;;;;;;;6335:167;6339:80;6343:2;6346:1;6343:5;;;;;;;;;;;;;;;;;;;;6339:80;;;;;;;;;;;;;;;;;;;;;;;;;;6350:68;6378:15;:17;;;6396:15;:17;;;6378:36;;;;;;;;;;;;;;;;;;6415:1;6378:39;;;;;;;;;;;;;6350:15;:17;;;6368:1;6350:20;;;;;;;;;;;;;;;;;;6371:1;6350:23;;;;;;;;;;;;;:27;;:68;;;;:::i;:::-;6339:3;:80::i;:::-;6421;6425:2;6428:1;6425:5;;;;;;;;;;;;;;;;;;;;6421:80;;;;;;;;;;;;;;;;;;;;;;;;;;6432:68;6460:15;:17;;;6478:15;:17;;;6460:36;;;;;;;;;;;;;;;;;;6497:1;6460:39;;;;;;;;;;;;;6432:15;:17;;;6450:1;6432:20;;;;;;;;;;;;;;;;;;6453:1;6432:23;;;;;;;;;;;;;:27;;:68;;;;:::i;:::-;6421:3;:80::i;:::-;6335:3;:167::i;:::-;6312:15;:20;;:190;;;;6520:95;6523:45;6527:31;6531:5;:7;;;6540:15;:17;;;6527:3;:31::i;:::-;6560:5;:7;;;6523:3;:45::i;:::-;6570:44;6574:15;:20;;;6596:17;6600:1;6596:17;;;;;;;;;;;;;;;;;;;;;;;;;;6603:5;:9;;;6596:3;:17::i;:::-;6570:3;:44::i;:::-;6520:2;:95::i;:::-;6512:137;;;;;;;;;;;;;;;;;;;;;;;;6680:38;6700:15;:17;;;6680:19;:38::i;:::-;6660:15;:17;;:58;;;;6750:52;6771:15;:17;;;6790:9;:11;;;6750:20;:52::i;:::-;6729:15;:18;;:73;;;;6833:52;6854:15;:17;;;6873:9;:11;;;6833:20;:52::i;:::-;6812:15;:18;;:73;;;;6900:9;6912:1;6900:13;;6895:279;6919:15;:17;;;6915:1;:21;6895:279;;;6980:73;6984:15;:20;;;7006:46;7010:9;:13;;;7024:1;7010:16;;;;;;;;;;;;;;;;;;7028:15;:17;;;7046:1;7028:20;;;;;;;;;;;;;;;;;;7049:1;7028:23;;;;;;;;;;;;;7006:3;:46::i;:::-;6980:3;:73::i;:::-;6957:15;:20;;:96;;;;7090:73;7094:15;:20;;;7116:46;7120:9;:13;;;7134:1;7120:16;;;;;;;;;;;;;;;;;;7138:15;:17;;;7156:1;7138:20;;;;;;;;;;;;;;;;;;7159:1;7138:23;;;;;;;;;;;;;7116:3;:46::i;:::-;7090:3;:73::i;:::-;7067:15;:20;;:96;;;;6938:3;;;;;;;6895:279;;;;7206:1;7183:15;:20;;:24;;;;;7222:9;7234:1;7222:13;;7217:428;7241:15;:17;;;7237:1;:21;7217:428;;;7302:86;7306:15;:20;;;7328:59;7332:15;:18;;;7355:1;7351;:5;;;;;;;;7332:25;;;;;;;;;;;;;;;;;;7362:1;7358;:5;;;;;;;;7332:32;;;;;;;;;;;;;7366:15;:20;;;7328:3;:59::i;:::-;7302:3;:86::i;:::-;7279:15;:20;;:109;;;;7425:86;7429:15;:20;;;7451:59;7455:15;:18;;;7478:1;7474;:5;;;;;;;;7455:25;;;;;;;;;;;;;;;;;;7485:1;7481;:5;;;;;;;;7455:32;;;;;;;;;;;;;7489:15;:20;;;7451:3;:59::i;:::-;7425:3;:86::i;:::-;7402:15;:20;;:109;;;;7533:1;7529;:5;7525:110;;;7577:43;7602:15;:17;;;7577:15;:20;;;:24;;:43;;;;:::i;:::-;7554:15;:20;;:66;;;;;7525:110;7260:3;;;;;;;7217:428;;;;7677:1;7654:15;:20;;:24;;;;;7693:9;7705:1;7693:13;;7688:1024;7712:15;:17;;;7708:1;:21;7688:1024;;;7773:73;7777:15;:20;;;7799:46;7803:5;:10;;;7814:1;7803:13;;;;;;;;;;;;;;;;;;7818:26;:15;:20;;;:24;:26::i;:::-;7799:3;:46::i;:::-;7773:3;:73::i;:::-;7750:15;:20;;:96;;;;7883:73;7887:15;:20;;;7909:46;7913:5;:10;;;7924:1;7913:13;;;;;;;;;;;;;;;;;;7928:26;:15;:20;;;:24;:26::i;:::-;7909:3;:46::i;:::-;7883:3;:73::i;:::-;7860:15;:20;;:96;;;;7997:77;8001:15;:18;;;8020:1;8001:21;;;;;;;;;;;;;;;;;;8023:1;8001:24;;;;;;;;;;;;;8027:46;8031:5;:10;;;8042:1;8031:13;;;;;;;;;;;;;;;;;;8046:26;:15;:20;;;:24;:26::i;:::-;8027:3;:46::i;:::-;7997:3;:77::i;:::-;7970:15;:18;;;7989:1;7970:21;;;;;;;;;;;;;;;;;;7992:1;7970:24;;;;;;;;;;;;:104;;;;8109:69;8113:15;:18;;;8133:44;8137:5;:8;;;8146:1;8137:11;;;;;;;;;;;;;;;;;;8150:26;:15;:20;;;:24;:26::i;:::-;8133:3;:44::i;:::-;8109:3;:69::i;:::-;8088:15;:18;;:90;;;;8219:77;8223:15;:18;;;8242:1;8223:21;;;;;;;;;;;;;;;;;;8245:1;8223:24;;;;;;;;;;;;;8249:46;8253:5;:10;;;8264:1;8253:13;;;;;;;;;;;;;;;;;;8268:26;:15;:20;;;:24;:26::i;:::-;8249:3;:46::i;:::-;8219:3;:77::i;:::-;8192:15;:18;;;8211:1;8192:21;;;;;;;;;;;;;;;;;;8214:1;8192:24;;;;;;;;;;;;:104;;;;8331:69;8335:15;:18;;;8355:44;8359:5;:8;;;8368:1;8359:11;;;;;;;;;;;;;;;;;;8372:26;:15;:20;;;:24;:26::i;:::-;8355:3;:44::i;:::-;8331:3;:69::i;:::-;8310:15;:18;;:90;;;;8437:73;8441:15;:20;;;8463:46;8467:5;:10;;;8478:1;8467:13;;;;;;;;;;;;;;;;;;8482:26;:15;:20;;;:24;:26::i;:::-;8463:3;:46::i;:::-;8437:3;:73::i;:::-;8414:15;:20;;:96;;;;8547:73;8551:15;:20;;;8573:46;8577:5;:10;;;8588:1;8577:13;;;;;;;;;;;;;;;;;;8592:26;:15;:20;;;:24;:26::i;:::-;8573:3;:46::i;:::-;8547:3;:73::i;:::-;8524:15;:20;;:96;;;;8658:43;8683:15;:17;;;8658:15;:20;;;:24;;:43;;;;:::i;:::-;8635:15;:20;;:66;;;;;7731:3;;;;;;;7688:1024;;;;8742:63;8746:15;:18;;;8766:38;8770:9;:11;;;8783:15;:20;;;8766:3;:38::i;:::-;8742:3;:63::i;:::-;8721:15;:18;;:84;;;;8836:53;8840:15;:18;;;8860:28;8864:1;8860:28;;;;;;;;;;;;;;;;;;;;;;;;;;8867:15;:20;;;8860:3;:28::i;:::-;8836:3;:53::i;:::-;8815:15;:18;;:74;;;;8900:42;;:::i;:::-;8974:115;9003:15;:17;;;9022:5;:12;;;9036:5;:12;;;9050:5;:14;;;9066:5;:14;;;8992:89;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8992:89:5;;;8982:100;;;;;;8974:109;;;:113;:115::i;:::-;8952:17;:19;;:137;;;;;9122:27;9129:17;:19;;;9122:6;:27::i;:::-;9099:17;:20;;:50;;;;9181:57;9210:17;:19;;;9199:31;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9199:31:5;;;9189:42;;;;;;9181:51;;;:55;:57::i;:::-;9159:17;:19;;:79;;;;;9248;;;;;;;;;9272:26;9296:1;9272:17;:19;;;:23;;:26;;;;:::i;:::-;9248:79;;;;9300:26;9324:1;9300:17;:19;;;:23;;:26;;;;:::i;:::-;9248:79;;;:17;:20;;:79;;;;9370:77;9427:17;:19;;;9370:52;9398:17;:20;;;9419:1;9398:23;;;;;;;;;;;;;9370:17;:20;;;9391:1;9370:23;;;;;;;;;;;;;:27;;:52;;;;:::i;:::-;:56;;:77;;;;:::i;:::-;9345:17;:22;;:102;;;;;9479:160;9570:68;9615:17;:22;;;9570:40;9607:1;162:2;9603:5;;;;;;;;9597:1;:12;9570:17;:22;;;:26;;:40;;;;:::i;:::-;:44;;:68;;;;:::i;:::-;9479:86;9516:48;9540:17;:20;;;9561:1;9540:23;;;;;;;;;;;;;9516:17;:19;;;:23;;:48;;;;:::i;:::-;9479:32;9490:17;:20;;;9479:10;:32::i;:::-;:36;;:86;;;;:::i;:::-;:90;;:160;;;;:::i;:::-;9457:17;:19;;:182;;;;;9671:35;9686:17;:19;;;9671:5;:10;;;:14;;:35;;;;:::i;:::-;9649:17;:19;;:57;;;;;9721:9;9733:1;9721:13;;9716:233;9744:1;162:2;9740:5;;;;;;;;9736:1;:9;9716:233;;;9806:35;9839:1;9834;:6;9806:17;:20;;;9827:1;9806:23;;;;;;;;;;;;;:27;;:35;;;;:::i;:::-;9766:17;:34;;;9801:1;9766:37;;;;;;;;;;;;:75;;;;;9903:35;9936:1;9931;:6;9903:17;:20;;;9924:1;9903:23;;;;;;;;;;;;;:27;;:35;;;;:::i;:::-;9855:17;:34;;;9898:1;162:2;9894:5;;;;;;;;9890:1;:9;9855:45;;;;;;;;;;;;:83;;;;;9747:3;;;;;;;9716:233;;;;9981:73;10010:17;:19;;;10031:5;:14;;;9999:47;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9999:47:5;;;9989:58;;;;;;9981:67;;;:71;:73::i;:::-;9959:17;:19;;:95;;;;;10090:118;10094:43;10098:5;:14;;;10113:1;10098:17;;;;;;;;;;;;;10117;:19;;;10094:3;:43::i;:::-;10139:68;10143:5;:14;;;10158:1;10143:17;;;;;;;;;;;;;10162:44;10186:17;:19;;;10162:17;:19;;;:23;;:44;;;;:::i;:::-;10139:3;:68::i;:::-;10090:3;:118::i;:::-;10064:17;:23;;:144;;;;10245:40;;:::i;:::-;10318:86;10322:35;10326:15;:18;;;10346:5;:10;;;10322:3;:35::i;:::-;10359:44;10363:15;:18;;;10382:1;10363:21;;;;;;;;;;;;;;;;;;10385:1;10363:24;;;;;;;;;;;;;10389:13;:5;:7;;;:11;:13::i;:::-;10359:3;:44::i;:::-;10318:3;:86::i;:::-;10295:16;:20;;:109;;;;10437:55;10441:17;10445:1;10441:17;;;;;;;;;;;;;;;;;;;;;;;;;;10448:5;:9;;;10441:3;:17::i;:::-;10460:31;10464:9;:11;;;10477:13;:5;:7;;;:11;:13::i;:::-;10460:3;:31::i;:::-;10437:3;:55::i;:::-;10414:16;:20;;:78;;;;10612:34;;;;;;;;;;;;;;;;;;;10630:9;:15;;;10612:7;:34::i;:::-;10586:16;:23;;:60;;;;10679:78;10683:40;10687:16;:23;;;10712:5;:10;;;10683:3;:40::i;:::-;10725:31;10729:9;:11;;;10742:13;:5;:7;;;:11;:13::i;:::-;10725:3;:31::i;:::-;10679:3;:78::i;:::-;10656:16;:20;;:101;;;;10790:83;10794:36;10798:15;:20;;;10820:5;:9;;;10794:3;:36::i;:::-;10832:40;10836:15;:20;;;10858:13;:5;:7;;;:11;:13::i;:::-;10832:3;:40::i;:::-;10790:3;:83::i;:::-;10767:16;:20;;:106;;;;10911:317;10915:154;10919:124;10923:54;10927:37;10931:15;:18;;;10951:5;:12;;;10927:3;:37::i;:::-;10966:5;:10;;;10923:3;:54::i;:::-;10979:63;10983:43;10987:15;:18;;;11006:1;10987:21;;;;;;;;;;;;;;;;;;11009:1;10987:24;;;;;;;;;;;;;11013:5;:12;;;10983:3;:43::i;:::-;11028:13;:5;:7;;;:11;:13::i;:::-;10979:3;:63::i;:::-;10919:3;:124::i;:::-;11045:17;:20;;;11066:1;11045:23;;;;;;;;;;;;;10915:3;:154::i;:::-;11071:156;11075:126;11079:58;11083:41;11087:15;:20;;;11109:5;:14;;;11083:3;:41::i;:::-;11126:5;:10;;;11079:3;:58::i;:::-;11139:61;11143:41;11147:15;:20;;;11169:5;:14;;;11143:3;:41::i;:::-;11186:13;:5;:7;;;:11;:13::i;:::-;11139:3;:61::i;:::-;11075:3;:126::i;:::-;11203:17;:20;;;11224:1;11203:23;;;;;;;;;;;;;11071:3;:156::i;:::-;10911:3;:317::i;:::-;10883:16;:25;;:345;;;;11261:159;11265:127;11269:87;11273:52;11277:27;11281:1;11277:27;;;;;;;;;;;;;;;;;;;;;;;;;;11284:17;:19;;;11277:3;:27::i;:::-;11306:18;11310:1;11306:18;;;;;;;;;;;;;;;;;;;;;;;;;;11313:5;:10;;;11306:3;:18::i;:::-;11273:3;:52::i;:::-;11327:28;11331:17;:23;;;11327:3;:28::i;:::-;11269:3;:87::i;:::-;11358:33;11370:15;:20;;;11358:5;:7;;;:11;;:33;;;;:::i;:::-;11265:3;:127::i;:::-;11394:16;:25;;;11261:3;:159::i;:::-;11238:16;:20;;:182;;;;11454:118;11458:25;11462:1;11458:25;;;;;;;;;;;;;;;;;;;;;;;;;;11465:5;:17;;;11458:3;:25::i;:::-;11485:86;11489:35;11493:15;:18;;;11513:5;:10;;;11489:3;:35::i;:::-;11526:44;11530:15;:18;;;11549:1;11530:21;;;;;;;;;;;;;;;;;;11552:1;11530:24;;;;;;;;;;;;;11556:13;:5;:7;;;:11;:13::i;:::-;11526:3;:44::i;:::-;11485:3;:86::i;:::-;11454:3;:118::i;:::-;11430:16;:21;;:142;;;;11607:112;11611:21;11615:1;11611:21;;;;;;;;;;;;;;;;;;;;;;;;;;11618:5;:13;;;11611:3;:21::i;:::-;11634:84;11638:37;11642:15;:20;;;11664:5;:10;;;11638:3;:37::i;:::-;11677:40;11681:15;:20;;;11703:13;:5;:7;;;:11;:13::i;:::-;11677:3;:40::i;:::-;11634:3;:84::i;:::-;11607:3;:112::i;:::-;11582:16;:22;;:137;;;;11757:101;11761:26;11765:1;11761:26;;;;;;;;;;;;;;;;;;;;;;;;;;11768:5;:18;;;11761:3;:26::i;:::-;11789:68;11793:29;11797:5;:12;;;11811:5;:10;;;11793:3;:29::i;:::-;11824:32;11828:5;:12;;;11842:13;:5;:7;;;:11;:13::i;:::-;11824:3;:32::i;:::-;11789:3;:68::i;:::-;11757:3;:101::i;:::-;11729:16;:25;;:129;;;;11898:101;11902:22;11906:1;11902:22;;;;;;;;;;;;;;;;;;;;;;;;;;11909:5;:14;;;11902:3;:22::i;:::-;11926:72;11930:31;11934:5;:14;;;11950:5;:10;;;11930:3;:31::i;:::-;11963:34;11967:5;:14;;;11983:13;:5;:7;;;:11;:13::i;:::-;11963:3;:34::i;:::-;11926:3;:72::i;:::-;11898:3;:101::i;:::-;11868:16;:27;;:131;;;;12031:270;12060:17;:19;;;12081:16;:20;;;12103:16;:20;;;12125:16;:20;;;12147:16;:20;;;12169:16;:20;;;12191:16;:21;;;12214:16;:22;;;12238:16;:25;;;12265:16;:27;;;12049:244;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12049:244:5;;;12039:255;;;;;;12031:264;;;:268;:270::i;:::-;12010:16;:18;;:291;;;;;12341:5;:7;;;12319:16;:18;;;:29;12311:84;;;;;;;;;;;;;;;;;;;;;;;;12406:34;;:::i;:::-;12468:56;12497:16;:18;;;12486:30;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12486:30:5;;;12476:41;;;;;;12468:50;;;:54;:56::i;:::-;12450:13;:15;;:74;;;;;12554:23;12558:1;12554:23;;;;;;;;;;;;;;;;;;;;;;;;;;12561:13;:15;;;12554:3;:23::i;:::-;12534:13;:17;;:43;;;;12611:37;12623:2;12611:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12627:17;:20;;;12611:11;:37::i;:::-;12587:13;:21;;:61;;;;12679:96;12690:48;12696:17;:20;;;12718:17;:19;;;12690:5;:48::i;:::-;12740:17;:34;;;12679:10;:96::i;:::-;12658:13;:18;;:117;;;;12803:157;12807:101;12811:49;12815:5;:8;;;12825:34;12829:5;:8;;;12839:17;:19;;;12825:3;:34::i;:::-;12811:3;:49::i;:::-;12862:45;12866:13;12876:2;12866:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:13::i;:::-;12881:25;:17;:19;;;:23;:25::i;:::-;12862:3;:45::i;:::-;12807:3;:101::i;:::-;12910:49;12917:13;:21;;;12940:13;:18;;;12910:6;:49::i;:::-;12803:3;:157::i;:::-;12785:13;:15;;:175;;;;12988:44;12992:13;:15;;;13009:22;13013:1;13009:22;;;;;;;;;;;;;;;;;;;;;;;;;;13016:14;:5;:8;;;:12;:14::i;:::-;13009:3;:22::i;:::-;12988:3;:44::i;:::-;12970:13;:15;;:62;;;;13060:56;13064:13;:15;;;13081:34;13085:13;:17;;;13104:5;:10;;;13081:3;:34::i;:::-;13060:3;:56::i;:::-;13042:13;:15;;:74;;;;13171:32;;:::i;:::-;13206:5;:13;;;13171:48;;13234:9;13246:1;13234:13;;13229:421;191:1;13249;:5;13229:421;;;13293:83;13322:13;:15;;;13339:7;:10;;;13350:1;13339:13;;;;;;;;;;;;;13354:7;:10;;;13365:1;13354:13;;;;;;;;;;;;;13311:57;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13311:57:5;;;13301:68;;;;;;13293:77;;;:81;:83::i;:::-;13275:13;:15;;:101;;;;;13420:13;:15;;;13390:13;:24;;;13415:1;13390:27;;;;;;;;;;;;:45;;;;;13469:12;13484:21;:13;:15;;;:19;:21::i;:::-;13469:36;;13537:102;13541:13;:15;;;13558:80;13562:42;13566:7;:10;;;13577:1;13566:13;;;;;;;;;;;;;13581:22;13601:1;13581:13;:15;;;:19;;:22;;;;:::i;:::-;13562:3;:42::i;:::-;13606:31;13610:7;:10;;;13621:1;13610:13;;;;;;;;;;;;;13625:11;13634:1;13625:4;:8;;:11;;;;:::i;:::-;13606:3;:31::i;:::-;13558:3;:80::i;:::-;13537:3;:102::i;:::-;13519:13;:15;;:120;;;;13229:421;13256:3;;;;;;;13229:421;;;;13694:1;13660:13;:28;;;13689:1;13660:31;;;;;;;;;;;;:35;;;;;13710:9;13722:1;13710:13;;13705:155;191:1;13725;:5;13705:155;;;13785:64;13821:13;:24;;;13846:1;13821:27;;;;;;;;;;;;;13785:13;:28;;;13814:1;13785:31;;;;;;;;;;;;;:35;;:64;;;;:::i;:::-;13751:13;:28;;;13780:1;13751:31;;;;;;;;;;;;:98;;;;;13732:3;;;;;;;13705:155;;;;13869:21;;:::i;:::-;13934:37;:13;:28;;;13963:1;13934:31;;;;;;;;;;;;;:35;:37::i;:::-;13900:13;:28;;;13929:1;13900:31;;;;;;;;;;;;:71;;;;;13986:9;13998:1;13986:13;;13981:462;14007:1;162:2;14005:3;;;;;;;;14001:1;:7;13981:462;;;14034:9;14046:1;14034:13;;14029:404;162:2;14060:1;14055;14050;:6;;;;14049:12;:16;14029:404;;;14090:10;14113:1;14108;:6;;;;14103:1;:12;14090:25;;14138:6;14145:2;14138:10;;;;;;;;;;;;;14137:11;14133:286;;;14172:12;14187:76;14227:13;:24;;;14260:1;14256;191;14252:5;:9;14227:35;;;;;;;;;;;;;14187:13;:24;;;14220:1;14216;191;14212:5;:9;14187:35;;;;;;;;;;;;;:39;;:76;;;;:::i;:::-;14172:91;;14320:41;14356:4;14320:13;:28;;;14349:1;14320:31;;;;;;;;;;;;;:35;;:41;;;;:::i;:::-;14285:13;:28;;;14314:2;14285:32;;;;;;;;;;;;:76;;;;;14396:4;14383:6;14390:2;14383:10;;;;;;;;;;;;:17;;;;;;;;;;;14133:286;;14029:404;14067:3;;;;;14029:404;;;;14010:3;;;;;13981:462;;;;14453:20;;:::i;:::-;14483;;:::i;:::-;14518:9;14530:1;14518:13;;14513:224;162:2;14533:1;:5;14513:224;;;14567:55;14571:5;14578:43;14582:2;14585:1;14582:5;;;;;;;;;;;;;;;;;;;;14578:43;;;;;;;;;;;;;;;;;;;;;;;;;;14589:13;:28;;;14618:1;14589:31;;;;;;;;;;;;;14578:3;:43::i;:::-;14567:3;:55::i;:::-;14559:63;;14644:82;14648:5;14655:70;14659:13;:21;;;14681:1;14659:24;;;;;;;;;;;;;14685:13;:28;;;14722:1;14718;162:2;14714:5;:9;14685:39;;;;;;;;;;;;;14655:3;:70::i;:::-;14644:3;:82::i;:::-;14636:90;;14540:3;;;;;;;14513:224;;;;14746:21;;:::i;:::-;14770:104;14774:49;14778:21;14782:5;14789:7;:9;;;14778:3;:21::i;:::-;14801;14805:5;14812:7;:9;;;14801:3;:21::i;:::-;14774:3;:49::i;:::-;14825:48;14829:13;:17;;;14848:24;14862:7;:9;;;14848:7;:9;;;:13;;:24;;;;:::i;:::-;14825:3;:48::i;:::-;14770:3;:104::i;:::-;14746:128;;14892:27;14895:13;:15;;;14912:6;14892:2;:27::i;:::-;14884:77;;;;;;;;;;;;;;;;;;;;;;;;14979:4;14972:11;;;;;;;;;;;;4513:10477;;;;:::o;25331:295::-;25404:14;25497:4;25491:11;25553:5;25546:4;25539:5;25535:16;25531:28;25525:35;25522:1;25515:46;25608:1;25602:8;25592:18;;25468:152;;;;;:::o;720:95:3:-;767:7;110:77;793:1;:15;;;;;;;;786:22;;720:95;;;:::o;821:127::-;879:7;910:1;905;:6;;:36;;940:1;936;110:77;922:15;:19;905:36;;;918:1;914;:5;905:36;898:43;;821:127;;;;:::o;26160:382:5:-;26225:16;;:::i;:::-;26291:4;26285:11;26325:1;26319:8;26316:1;26309:19;26375:4;26372:1;26368:12;26362:19;26355:4;26352:1;26348:12;26341:41;26416:1;26409:4;26406:1;26402:12;26395:23;26475:4;26472:1;26466:4;26463:1;26457:4;26452:3;26441:39;26434:47;26431:2;;;26510:1;26507;26500:12;26431:2;26262:274;;;;;:::o;25698:456::-;25772:16;;:::i;:::-;25838:4;25832:11;25872:2;25866:9;25863:1;25856:20;25924:4;25920:2;25916:13;25910:20;25903:4;25900:1;25896:12;25889:42;25971:2;25965:9;25958:4;25955:1;25951:12;25944:31;26023:4;26019:2;26015:13;26009:20;26002:4;25999:1;25995:12;25988:42;26087:4;26084:1;26078:4;26075:1;26069:4;26064:3;26053:39;26046:47;26043:2;;;26122:1;26119;26112:12;26043:2;25809:339;;;;;:::o;26735:131::-;26808:4;26839:2;:4;;;26831:2;:4;;;:12;:28;;;;;26855:2;:4;;;26847:2;:4;;;:12;26831:28;26824:35;;26735:131;;;;:::o;489:116:3:-;547:7;110:77;573:25;;;;;;;583:1;580;573:25;566:32;;489:116;;;;:::o;14996:446:5:-;15071:26;15109:9;15132:1;15121;:8;:12;;;;;;;;15109:24;;15143:9;15160:1;15155;:6;15143:18;;15197:1;15180:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;15171:28;;15214:9;15226:1;15214:13;;15209:227;15233:1;15229;:5;15209:227;;;15255:21;15279:46;15304:1;15300;:5;15317:1;15312;15308;:5;15307:11;15320:1;15323;15279:20;:46::i;:::-;15255:70;;15344:9;15356:1;15344:13;;15339:87;15363:1;15359;:5;15339:87;;;15404:4;15409:1;15404:7;;;;;;;;;;;;;;;;;;15389:6;15396:1;15389:9;;;;;;;;;;;;;;;;;;15399:1;15389:12;;;;;;;;;;;;:22;;;;;15366:3;;;;;;;15339:87;;;;15209:227;15236:3;;;;;;;15209:227;;;;14996:446;;;;;:::o;16353:1466::-;16459:26;16734:12;16749:8;:15;16734:30;;16774:12;16796:1;16789:4;:8;;;;;;;;16774:23;;16833:4;16816:22;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16807:31;;16920:25;16948:16;16952:4;16958:5;16948:3;:16::i;:::-;16920:44;;16975:29;17021:4;17007:19;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;17007:19:5;;;;16975:51;;17041:9;17053:1;17041:13;;17036:777;17060:1;17056;:5;17036:777;;;17087:9;17099:1;17087:13;;17082:148;17106:4;17102:1;:8;17082:148;;;17153:8;17175:4;17170:1;17163:4;:8;17162:17;;;;;;;;17153:27;;;;;;;;;;;;;;;;;;17181:1;17153:30;;;;;;;;;;;;;17135:12;17148:1;17135:15;;;;;;;;;;;;;;;;;:48;;;;;17112:3;;;;;;;17082:148;;;;17259:17;17263:12;17259:3;:17::i;:::-;17244:32;;17290:28;17335:4;17321:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;17290:50;;17354:20;17377:1;17354:24;;17407:18;:12;:16;:18::i;:::-;17392:33;;17444:9;17456:1;17444:13;;17439:203;17463:4;17459:1;:8;17439:203;;;17521:106;17525:87;17529:33;17533:8;17542:1;17533:11;;;;;;;;;;;;;;;;;;17546:12;17559:1;17546:15;;;;;;;;;;;;;;;;;;17529:3;:33::i;:::-;17564:47;17568:8;17581:4;17577:1;:8;17568:18;;;;;;;;;;;;;;;;;;17588:12;17605:4;17601:1;:8;17588:22;;;;;;;;;;;;;;;;;;17564:3;:47::i;:::-;17525:3;:87::i;:::-;17614:12;17521:3;:106::i;:::-;17504:11;17516:1;17504:14;;;;;;;;;;;;;;;;;:123;;;;17469:3;;;;;;;17439:203;;;;17670:22;17674:11;17687:4;17670:3;:22::i;:::-;17656:36;;17711:9;17723:1;17711:13;;17706:97;17730:4;17726:1;:8;17706:97;;;17774:11;17786:1;17774:14;;;;;;;;;;;;;;;;;;17759:6;17766:1;17759:9;;;;;;;;;;;;;;;;;;17769:1;17759:12;;;;;;;;;;;;:29;;;;17736:3;;;;;;;17706:97;;;;17036:777;;17063:3;;;;;;;17036:777;;;;16353:1466;;;;;;;;:::o;954:95:3:-;1001:7;1041:1;110:77;1027:15;1020:22;;954:95;;;:::o;24891:236:5:-;24944:24;;:::i;:::-;24992:1;24980:6;24987:1;24980:9;;;;;;;;;;;;:13;;;;;25015:4;25003:6;25010:1;25003:9;;;;;;;;;;;;:16;;;;;25034:9;25046:1;25034:13;;25029:92;162:2;25049:1;:5;25029:92;;;25087:23;25105:4;25087:6;25098:1;25094;:5;25087:13;;;;;;;;;;;;;:17;;:23;;;;:::i;:::-;25075:6;25082:1;25075:9;;;;;;;;;;;;:35;;;;;25056:3;;;;;;;25029:92;;;;24891:236;;;:::o;1055:580:3:-;1123:14;1149:13;110:77;1149:27;;1224:4;1218:11;1252:4;1249:1;1242:15;1291:4;1284;1281:1;1277:12;1270:26;1330:4;1323;1320:1;1316:12;1309:26;1369:4;1362;1359:1;1355:12;1348:26;1408:8;1401:4;1398:1;1394:12;1387:30;1451:5;1444:4;1441:1;1437:12;1430:27;1514:4;1511:1;1505:4;1502:1;1496:4;1491:3;1480:39;1473:47;1470:2;;;1572:1;1569;1562:12;1470:2;1617:1;1611:8;1601:18;;1195:434;;;;;;:::o;367:116::-;425:7;110:77;451:25;;;;;;;461:1;458;451:25;444:32;;367:116;;;;:::o;24298:180:5:-;24363:14;24394:9;24406:1;24394:13;;24389:83;162:2;24409:1;:5;24389:83;;;24444:17;24455:2;24458:1;24455:5;;;;;;;;;;;;;24444:6;:10;;:17;;;;:::i;:::-;24435:26;;24416:3;;;;;;;24389:83;;;;24298:180;;;:::o;28116:181::-;28188:14;;:::i;:::-;28221:69;229:77;28264:5;28271:1;28247:26;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28247:26:5;;;28237:37;;;;;;28229:46;;;:60;;;;;;;;28221:7;:69::i;:::-;28214:76;;28116:181;;;;:::o;26548:::-;26602:14;;:::i;:::-;26635:47;;;;;;;;;26643:1;:3;;;26635:47;;;;229:77;26663:1;:3;;;:17;;;;;;;;229:77;26648:33;26635:47;;;26628:54;;26548:181;;;:::o;24071:221::-;24158:24;;:::i;:::-;24199:9;24211:1;24199:13;;24194:92;162:2;24214:1;:5;24194:92;;;24252:23;24256:2;24259:1;24256:5;;;;;;;;;;;;;;;;;;24263:11;:2;24266:1;24263:5;;;;;;;;;;;;;:9;:11::i;:::-;24252:3;:23::i;:::-;24240:6;24247:1;24240:9;;;;;;;;;;;;:35;;;;24221:3;;;;;;;24194:92;;;;24071:221;;;;:::o;25133:192::-;25203:24;;:::i;:::-;25244:9;25256:1;25244:13;;25239:80;162:2;25259:1;:5;25239:80;;;25297:11;25306:1;25297;25299;25297:4;;;;;;;;;;;;;:8;;:11;;;;:::i;:::-;25285:6;25292:1;25285:9;;;;;;;;;;;;:23;;;;;25266:3;;;;;;;25239:80;;;;25133:192;;;;:::o;23855:210::-;23940:24;;:::i;:::-;23981:9;23993:1;23981:13;;23976:83;162:2;23996:1;:5;23976:83;;;24034:14;24043:1;24045;24043:4;;;;;;;;;;;;;24034:1;24036;24034:4;;;;;;;;;;;;;:8;;:14;;;;:::i;:::-;24022:6;24029:1;24022:9;;;;;;;;;;;;:26;;;;;24003:3;;;;;;;23976:83;;;;23855:210;;;;:::o;24484:177::-;24547:18;;:::i;:::-;24582:9;24594:1;24582:13;;24577:78;162:2;24597:1;:5;24577:78;;;24629:15;24633:3;24638:2;24641:1;24638:5;;;;;;;;;;;;;;;;;;24629:3;:15::i;:::-;24623:21;;24604:3;;;;;;;24577:78;;;;24484:177;;;:::o;24667:218::-;24750:21;;:::i;:::-;24788:9;24800:1;24788:13;;24783:96;162:2;24803:1;:5;24783:96;;;24838:30;24842:6;24850:17;24854:2;24857:1;24854:5;;;;;;;;;;;;;24861:2;24864:1;24861:5;;;;;;;;;;;;;24850:3;:17::i;:::-;24838:3;:30::i;:::-;24829:39;;24810:3;;;;;;;24783:96;;;;24667:218;;;;:::o;611:103:3:-;658:7;684:23;688:1;705;110:77;691:15;684:3;:23::i;:::-;677:30;;611:103;;;:::o;15448:899:5:-;15574:23;15759:12;15790:8;15780:7;:18;15774:1;:25;15759:40;;15857:4;15843:19;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;15843:19:5;;;;15834:28;;15888:8;15877:7;:19;15873:94;;;15924:5;15912:6;15919:1;15912:9;;;;;;;;;;;;;;;;;:17;;;;;15950:6;15943:13;;;;;15873:94;15996:1;15986:7;:11;15976:21;;16008;16032:68;16053:8;16063:7;16072:24;16082:1;16084:7;16082:10;;;;;;;;;;;;;;;;;;16093:1;16082:13;;;;;;;;;;;;;16072:5;:9;;:24;;;;:::i;:::-;16098:1;16032:20;:68::i;:::-;16008:92;;16110:22;16135:68;16156:8;16166:7;16175:24;16185:1;16187:7;16185:10;;;;;;;;;;;;;;;;;;16196:1;16185:13;;;;;;;;;;;;;16175:5;:9;;:24;;;;:::i;:::-;16201:1;16135:20;:68::i;:::-;16110:93;;16218:9;16230:1;16218:13;;16213:128;16244:1;16237:4;:8;;;;;;;;16233:1;:12;16213:128;;;16278:4;16283:1;16278:7;;;;;;;;;;;;;;;;;;16266:6;16273:1;16266:9;;;;;;;;;;;;;;;;;:19;;;;;16322:5;16328:1;16322:8;;;;;;;;;;;;;;;;;;16299:6;16317:1;16310:4;:8;;;;;;;;16306:1;:12;16299:20;;;;;;;;;;;;;;;;;:31;;;;;16247:3;;;;;;;16213:128;;;;15448:899;;;;;;;;;;:::o;17825:997::-;17899:23;17934:12;17949:5;:12;17934:27;;17983:1;17975:4;:9;17971:52;;;18007:5;18000:12;;;;;17971:52;18052:1;18047;18040:4;:8;;;;;;;;:13;18032:57;;;;;;;;;;;;;;;;;;;;;;;;18100:13;18116:23;18134:4;18126:5;:12;;;;;;;;337:76;18116:9;;:23;;;;:::i;:::-;18100:39;;18149:20;18172:1;18149:24;;18187:7;18183:87;;;18218:11;:5;:9;:11::i;:::-;18210:19;;18258:1;18243:16;;18183:87;18294:18;:12;:16;:18::i;:::-;18279:33;;18322:21;18346:31;18350:17;18358:5;18365:1;18350:7;:17::i;:::-;18369:7;18346:3;:31::i;:::-;18322:55;;18387:20;18410:31;18414:17;18422:5;18429:1;18414:7;:17::i;:::-;18433:7;18410:3;:31::i;:::-;18387:54;;18451:17;18471:1;18451:21;;18505:4;18491:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;18482:28;;18525:9;18537:1;18525:13;;18520:296;18551:1;18544:4;:8;;;;;;;;18540:1;:12;18520:296;;;18573:19;;:::i;:::-;18595:22;18599:3;18603:1;18599:6;;;;;;;;;;;;;;;;;;18607:9;18595:3;:22::i;:::-;18573:44;;18643:37;18647:18;18651:4;18656:1;18651:7;;;;;;;;;;;;;;;;;;18660:4;18647:3;:18::i;:::-;18667:12;18643:3;:37::i;:::-;18631:6;18638:1;18631:9;;;;;;;;;;;;;;;;;:49;;;;18717:42;18721:23;18725:4;18730:1;18725:7;;;;;;;;;;;;;;;;;;18734:9;18738:4;18734:3;:9::i;:::-;18721:3;:23::i;:::-;18746:12;18717:3;:42::i;:::-;18694:6;18712:1;18705:4;:8;;;;;;;;18701:1;:12;18694:20;;;;;;;;;;;;;;;;;:65;;;;18785:20;18799:5;18785:9;:13;;:20;;;;:::i;:::-;18773:32;;18520:296;18554:3;;;;;;;18520:296;;;;17825:997;;;;;;;;;;;:::o;19110:739::-;19170:23;19205:12;19220:5;:12;19205:27;;19254:1;19246:4;:9;19242:52;;;19278:5;19271:12;;;;;19242:52;19323:1;19318;19311:4;:8;;;;;;;;:13;19303:57;;;;;;;;;;;;;;;;;;;;;;;;19371:13;19387:23;19405:4;19397:5;:12;;;;;;;;337:76;19387:9;;:23;;;;:::i;:::-;19371:39;;19420:21;19444:22;19448:17;19456:5;19463:1;19448:7;:17::i;:::-;19444:3;:22::i;:::-;19420:46;;19476:20;19499:22;19503:17;19511:5;19518:1;19503:7;:17::i;:::-;19499:3;:22::i;:::-;19476:45;;19531:17;19551:1;19531:21;;19585:4;19571:19;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;19571:19:5;;;;19562:28;;19605:9;19617:1;19605:13;;19600:243;19631:1;19624:4;:8;;;;;;;;19620:1;:12;19600:243;;;19653:12;19668:21;19679:9;19668:3;19672:1;19668:6;;;;;;;;;;;;;;;;;;:10;;:21;;;;:::i;:::-;19653:36;;19715:17;19727:4;19715;19720:1;19715:7;;;;;;;;;;;;;;;;;;:11;;:17;;;;:::i;:::-;19703:6;19710:1;19703:9;;;;;;;;;;;;;;;;;:29;;;;;19769:17;19781:4;19769;19774:1;19769:7;;;;;;;;;;;;;;;;;;:11;;:17;;;;:::i;:::-;19746:6;19764:1;19757:4;:8;;;;;;;;19753:1;:12;19746:20;;;;;;;;;;;;;;;;;:40;;;;;19812:20;19826:5;19812:9;:13;;:20;;;;:::i;:::-;19800:32;;19600:243;19634:3;;;;;;;19600:243;;;;19110:739;;;;;;;;;:::o;27488:449::-;27542:14;;:::i;:::-;27568:9;27587:311;27594:4;27587:311;;;27614:16;27653:1;27633:17;27642:4;27648:1;27633:8;:17::i;:::-;:21;27614:40;;27740:41;27749:8;27779:1;27774;229:77;27760:15;27759:21;;;;;;;;27740:8;:41::i;:::-;27736:45;;27817:8;27799:14;27808:1;27811;27799:8;:14::i;:::-;:26;27795:70;;;27845:5;;;27795:70;27886:1;27878:9;;;;27587:311;;;;27914:16;;;;;;;;;27922:4;27914:16;;;;27928:1;27914:16;;;27907:23;;;27488:449;;;:::o;18828:276::-;18908:23;18981:1;18966:5;:12;:16;;;;;;;;18952:31;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;18943:40;;18998:9;19010:1;18998:13;;18993:105;19032:1;19017:5;:12;:16;;;;;;;;19013:1;:20;18993:105;;;19066:5;19080:6;19076:1;19072;:5;:14;19066:21;;;;;;;;;;;;;;;;;;19054:6;19061:1;19054:9;;;;;;;;;;;;;;;;;:33;;;;19035:3;;;;;;;18993:105;;;;18828:276;;;;:::o;19855:::-;19935:23;20008:1;19993:5;:12;:16;;;;;;;;19979:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;19979:31:5;;;;19970:40;;20025:9;20037:1;20025:13;;20020:105;20059:1;20044:5;:12;:16;;;;;;;;20040:1;:20;20020:105;;;20093:5;20107:6;20103:1;20099;:5;:14;20093:21;;;;;;;;;;;;;;;;;;20081:6;20088:1;20081:9;;;;;;;;;;;;;;;;;:33;;;;;20062:3;;;;;;;20020:105;;;;19855:276;;;;:::o;26872:610::-;26945:14;26996:13;229:77;26996:27;;27071:4;27065:11;27099:4;27096:1;27089:15;27138:4;27131;27128:1;27124:12;27117:26;27177:4;27170;27167:1;27163:12;27156:26;27216:4;27209;27206:1;27202:12;27195:26;27255:8;27248:4;27245:1;27241:12;27234:30;27298:5;27291:4;27288:1;27284:12;27277:27;27361:4;27358:1;27352:4;27349:1;27343:4;27338:3;27327:39;27320:47;27317:2;;;27419:1;27416;27409:12;27317:2;27464:1;27458:8;27448:18;;27042:434;;;;;;:::o;81:28218::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:28218:5;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:28218:5;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:28218:5;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:28218:5;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:28218:5;;;;:::o;26:764:-1:-;;162:3;155:4;147:6;143:17;139:27;132:35;129:2;;;180:1;177;170:12;129:2;217:6;204:20;239:99;254:83;330:6;254:83;;;239:99;;;230:108;;355:5;380:6;373:5;366:21;410:4;402:6;398:17;388:27;;432:4;427:3;423:14;416:21;;485:6;532:3;524:4;516:6;512:17;507:3;503:27;500:36;497:2;;;549:1;546;539:12;497:2;574:1;559:225;584:6;581:1;578:13;559:225;;;642:3;664:56;716:3;704:10;664:56;;;659:3;652:69;744:4;739:3;735:14;728:21;;772:4;767:3;763:14;756:21;;616:168;606:1;603;599:9;594:14;;559:225;;;563:14;122:668;;;;;;;;817:607;;928:3;921:4;913:6;909:17;905:27;898:35;895:2;;;946:1;943;936:12;895:2;970:3;988:74;1003:58;1054:6;1003:58;;;988:74;;;979:83;;1079:5;1138:6;1185:3;1177:4;1169:6;1165:17;1160:3;1156:27;1153:36;1150:2;;;1202:1;1199;1192:12;1150:2;1227:1;1212:206;1237:6;1234:1;1231:13;1212:206;;;1295:3;1317:37;1350:3;1338:10;1317:37;;;1312:3;1305:50;1378:4;1373:3;1369:14;1362:21;;1406:4;1401:3;1397:14;1390:21;;1269:149;1259:1;1256;1252:9;1247:14;;1212:206;;;1216:14;888:536;;;;;;;;1451:615;;1566:3;1559:4;1551:6;1547:17;1543:27;1536:35;1533:2;;;1584:1;1581;1574:12;1533:2;1608:3;1626:78;1641:62;1696:6;1641:62;;;1626:78;;;1617:87;;1721:5;1780:6;1827:3;1819:4;1811:6;1807:17;1802:3;1798:27;1795:36;1792:2;;;1844:1;1841;1834:12;1792:2;1869:1;1854:206;1879:6;1876:1;1873:13;1854:206;;;1937:3;1959:37;1992:3;1980:10;1959:37;;;1954:3;1947:50;2020:4;2015:3;2011:14;2004:21;;2048:4;2043:3;2039:14;2032:21;;1911:149;1901:1;1898;1894:9;1889:14;;1854:206;;;1858:14;1526:540;;;;;;;;2074:118;;2141:46;2179:6;2166:20;2141:46;;;2132:55;;2126:66;;;;;2200:440;;2301:3;2294:4;2286:6;2282:17;2278:27;2271:35;2268:2;;;2319:1;2316;2309:12;2268:2;2356:6;2343:20;2378:64;2393:48;2434:6;2393:48;;;2378:64;;;2369:73;;2462:6;2455:5;2448:21;2498:4;2490:6;2486:17;2531:4;2524:5;2520:16;2566:3;2557:6;2552:3;2548:16;2545:25;2542:2;;;2583:1;2580;2573:12;2542:2;2593:41;2627:6;2622:3;2617;2593:41;;;2261:379;;;;;;;;2648:118;;2715:46;2753:6;2740:20;2715:46;;;2706:55;;2700:66;;;;;2773:2013;;;;;;;;;3227:3;3215:9;3206:7;3202:23;3198:33;3195:2;;;3244:1;3241;3234:12;3195:2;3307:1;3296:9;3292:17;3279:31;3330:18;3322:6;3319:30;3316:2;;;3362:1;3359;3352:12;3316:2;3382:97;3471:7;3462:6;3451:9;3447:22;3382:97;;;3372:107;;3258:227;3544:2;3533:9;3529:18;3516:32;3568:18;3560:6;3557:30;3554:2;;;3600:1;3597;3590:12;3554:2;3620:97;3709:7;3700:6;3689:9;3685:22;3620:97;;;3610:107;;3495:228;3782:2;3771:9;3767:18;3754:32;3806:18;3798:6;3795:30;3792:2;;;3838:1;3835;3828:12;3792:2;3858:97;3947:7;3938:6;3927:9;3923:22;3858:97;;;3848:107;;3733:228;3992:2;4010:76;4078:7;4069:6;4058:9;4054:22;4010:76;;;4000:86;;3971:121;4151:3;4140:9;4136:19;4123:33;4176:18;4168:6;4165:30;4162:2;;;4208:1;4205;4198:12;4162:2;4228:97;4317:7;4308:6;4297:9;4293:22;4228:97;;;4218:107;;4102:229;4362:3;4381:53;4426:7;4417:6;4406:9;4402:22;4381:53;;;4371:63;;4341:99;4471:3;4490:76;4558:7;4549:6;4538:9;4534:22;4490:76;;;4480:86;;4450:122;4631:3;4620:9;4616:19;4603:33;4656:18;4648:6;4645:30;4642:2;;;4688:1;4685;4678:12;4642:2;4708:62;4762:7;4753:6;4742:9;4738:22;4708:62;;;4698:72;;4582:194;3189:1597;;;;;;;;;;;;4794:259;;4922:91;5009:3;5002:5;4922:91;;;5042:4;5037:3;5033:14;5019:28;;4915:138;;;;;5138:743;5309:69;5372:5;5309:69;;;5391:105;5489:6;5484:3;5391:105;;;5384:112;;5516:71;5581:5;5516:71;;;5608:1;5593:276;5618:6;5615:1;5612:13;5593:276;;;5665:105;5766:3;5757:6;5751:13;5665:105;;;5658:112;;5787:75;5855:6;5787:75;;;5777:85;;5640:1;5637;5633:9;5628:14;;5593:276;;;5597:14;5288:593;;;;;5964:773;;6147:71;6212:5;6147:71;;;6231:107;6331:6;6326:3;6231:107;;;6224:114;;6358:73;6425:5;6358:73;;;6452:1;6437:278;6462:6;6459:1;6456:13;6437:278;;;6509:105;6610:3;6601:6;6595:13;6509:105;;;6502:112;;6631:77;6701:6;6631:77;;;6621:87;;6484:1;6481;6477:9;6472:14;;6437:278;;;6441:14;6728:3;6721:10;;6126:611;;;;;;;6745:111;6822:28;6844:5;6822:28;;;6817:3;6810:41;6804:52;;;6863:360;;6993:39;7026:5;6993:39;;;7044:89;7126:6;7121:3;7044:89;;;7037:96;;7138:52;7183:6;7178:3;7171:4;7164:5;7160:16;7138:52;;;7211:6;7206:3;7202:16;7195:23;;6973:250;;;;;;7231:364;;7391:67;7455:2;7450:3;7391:67;;;7384:74;;7491:66;7487:1;7482:3;7478:11;7471:87;7586:2;7581:3;7577:12;7570:19;;7377:218;;;;7604:465;;7764:67;7828:2;7823:3;7764:67;;;7757:74;;7864:66;7860:1;7855:3;7851:11;7844:87;7965:66;7960:2;7955:3;7951:12;7944:88;8060:2;8055:3;8051:12;8044:19;;7750:319;;;;8078:364;;8238:67;8302:2;8297:3;8238:67;;;8231:74;;8338:66;8334:1;8329:3;8325:11;8318:87;8433:2;8428:3;8424:12;8417:19;;8224:218;;;;8451:364;;8611:67;8675:2;8670:3;8611:67;;;8604:74;;8711:66;8707:1;8702:3;8698:11;8691:87;8806:2;8801:3;8797:12;8790:19;;8597:218;;;;8824:364;;8984:67;9048:2;9043:3;8984:67;;;8977:74;;9084:66;9080:1;9075:3;9071:11;9064:87;9179:2;9174:3;9170:12;9163:19;;8970:218;;;;9197:465;;9357:67;9421:2;9416:3;9357:67;;;9350:74;;9457:66;9453:1;9448:3;9444:11;9437:87;9558:66;9553:2;9548:3;9544:12;9537:88;9653:2;9648:3;9644:12;9637:19;;9343:319;;;;9739:450;9868:4;9863:3;9859:14;9947:3;9940:5;9936:15;9930:22;9958:61;10014:3;10009;10005:13;9992:11;9958:61;;;9888:137;10094:4;10087:5;10083:16;10077:23;10106:62;10162:4;10157:3;10153:14;10140:11;10106:62;;;10035:139;9841:348;;;;10265:460;10404:4;10399:3;10395:14;10483:3;10476:5;10472:15;10466:22;10494:61;10550:3;10545;10541:13;10528:11;10494:61;;;10424:137;10630:4;10623:5;10619:16;10613:23;10642:62;10698:4;10693:3;10689:14;10676:11;10642:62;;;10571:139;10377:348;;;;10732:110;10805:31;10830:5;10805:31;;;10800:3;10793:44;10787:55;;;10849:120;10932:31;10957:5;10932:31;;;10927:3;10920:44;10914:55;;;10976:159;11077:52;11097:31;11122:5;11097:31;;;11077:52;;;11072:3;11065:65;11059:76;;;11142:405;;11316:95;11407:3;11398:6;11316:95;;;11309:102;;11422:75;11493:3;11484:6;11422:75;;;11519:2;11514:3;11510:12;11503:19;;11539:3;11532:10;;11297:250;;;;;;11554:1759;;12210:3;12199:9;12195:19;12187:27;;12261:9;12255:4;12251:20;12247:1;12236:9;12232:17;12225:47;12286:146;12427:4;12418:6;12286:146;;;12278:154;;12480:9;12474:4;12470:20;12465:2;12454:9;12450:18;12443:48;12505:146;12646:4;12637:6;12505:146;;;12497:154;;12699:9;12693:4;12689:20;12684:2;12673:9;12669:18;12662:48;12724:146;12865:4;12856:6;12724:146;;;12716:154;;12881:118;12995:2;12984:9;12980:18;12971:6;12881:118;;;13048:9;13042:4;13038:20;13032:3;13021:9;13017:19;13010:49;13073:146;13214:4;13205:6;13073:146;;;13065:154;;13230:73;13298:3;13287:9;13283:19;13274:6;13230:73;;;12181:1132;;;;;;;;;;13320:201;;13432:2;13421:9;13417:18;13409:26;;13446:65;13508:1;13497:9;13493:17;13484:6;13446:65;;;13403:118;;;;;13528:407;;13719:2;13708:9;13704:18;13696:26;;13769:9;13763:4;13759:20;13755:1;13744:9;13740:17;13733:47;13794:131;13920:4;13794:131;;;13786:139;;13690:245;;;;13942:407;;14133:2;14122:9;14118:18;14110:26;;14183:9;14177:4;14173:20;14169:1;14158:9;14154:17;14147:47;14208:131;14334:4;14208:131;;;14200:139;;14104:245;;;;14356:407;;14547:2;14536:9;14532:18;14524:26;;14597:9;14591:4;14587:20;14583:1;14572:9;14568:17;14561:47;14622:131;14748:4;14622:131;;;14614:139;;14518:245;;;;14770:407;;14961:2;14950:9;14946:18;14938:26;;15011:9;15005:4;15001:20;14997:1;14986:9;14982:17;14975:47;15036:131;15162:4;15036:131;;;15028:139;;14932:245;;;;15184:407;;15375:2;15364:9;15360:18;15352:26;;15425:9;15419:4;15415:20;15411:1;15400:9;15396:17;15389:47;15450:131;15576:4;15450:131;;;15442:139;;15346:245;;;;15598:407;;15789:2;15778:9;15774:18;15766:26;;15839:9;15833:4;15829:20;15825:1;15814:9;15810:17;15803:47;15864:131;15990:4;15864:131;;;15856:139;;15760:245;;;;16012:213;;16130:2;16119:9;16115:18;16107:26;;16144:71;16212:1;16201:9;16197:17;16188:6;16144:71;;;16101:124;;;;;16232:493;;16462:3;16451:9;16447:19;16439:27;;16477:71;16545:1;16534:9;16530:17;16521:6;16477:71;;;16559:156;16711:2;16700:9;16696:18;16687:6;16559:156;;;16433:292;;;;;;16732:2899;;17778:3;17767:9;17763:19;17755:27;;17793:71;17861:1;17850:9;17846:17;17837:6;17793:71;;;17912:9;17906:4;17902:20;17897:2;17886:9;17882:18;17875:48;17937:146;18078:4;18069:6;17937:146;;;17929:154;;18131:9;18125:4;18121:20;18116:2;18105:9;18101:18;18094:48;18156:146;18297:4;18288:6;18156:146;;;18148:154;;18350:9;18344:4;18340:20;18335:2;18324:9;18320:18;18313:48;18375:146;18516:4;18507:6;18375:146;;;18367:154;;18570:9;18564:4;18560:20;18554:3;18543:9;18539:19;18532:49;18595:146;18736:4;18727:6;18595:146;;;18587:154;;18790:9;18784:4;18780:20;18774:3;18763:9;18759:19;18752:49;18815:146;18956:4;18947:6;18815:146;;;18807:154;;19010:9;19004:4;19000:20;18994:3;18983:9;18979:19;18972:49;19035:146;19176:4;19167:6;19035:146;;;19027:154;;19230:9;19224:4;19220:20;19214:3;19203:9;19199:19;19192:49;19255:146;19396:4;19387:6;19255:146;;;19247:154;;19450:9;19444:4;19440:20;19434:3;19423:9;19419:19;19412:49;19475:146;19616:4;19607:6;19475:146;;;19467:154;;17749:1882;;;;;;;;;;;;;19638:620;;19904:3;19893:9;19889:19;19881:27;;19919:71;19987:1;19976:9;19972:17;19963:6;19919:71;;;20001:118;20115:2;20104:9;20100:18;20091:6;20001:118;;;20130;20244:2;20233:9;20229:18;20220:6;20130:118;;;19875:383;;;;;;;20265:1028;;20679:3;20668:9;20664:19;20656:27;;20694:71;20762:1;20751:9;20747:17;20738:6;20694:71;;;20776:118;20890:2;20879:9;20875:18;20866:6;20776:118;;;20905;21019:2;21008:9;21004:18;20995:6;20905:118;;;21034:119;21148:3;21137:9;21133:19;21124:6;21034:119;;;21164;21278:3;21267:9;21263:19;21254:6;21164:119;;;20650:643;;;;;;;;;21300:1844;;22010:3;21999:9;21995:19;21987:27;;22025:71;22093:1;22082:9;22078:17;22069:6;22025:71;;;22107:118;22221:2;22210:9;22206:18;22197:6;22107:118;;;22236;22350:2;22339:9;22335:18;22326:6;22236:118;;;22365:119;22479:3;22468:9;22464:19;22455:6;22365:119;;;22495;22609:3;22598:9;22594:19;22585:6;22495:119;;;22625;22739:3;22728:9;22724:19;22715:6;22625:119;;;22755;22869:3;22858:9;22854:19;22845:6;22755:119;;;22885;22999:3;22988:9;22984:19;22975:6;22885:119;;;23015;23129:3;23118:9;23114:19;23105:6;23015:119;;;21981:1163;;;;;;;;;;;;;23151:2048;;23935:3;23924:9;23920:19;23912:27;;23950:71;24018:1;24007:9;24003:17;23994:6;23950:71;;;24032:118;24146:2;24135:9;24131:18;24122:6;24032:118;;;24161;24275:2;24264:9;24260:18;24251:6;24161:118;;;24290:119;24404:3;24393:9;24389:19;24380:6;24290:119;;;24420;24534:3;24523:9;24519:19;24510:6;24420:119;;;24550;24664:3;24653:9;24649:19;24640:6;24550:119;;;24680;24794:3;24783:9;24779:19;24770:6;24680:119;;;24810;24924:3;24913:9;24909:19;24900:6;24810:119;;;24940;25054:3;25043:9;25039:19;25030:6;24940:119;;;25070;25184:3;25173:9;25169:19;25160:6;25070:119;;;23906:1293;;;;;;;;;;;;;;25206:256;;25268:2;25262:9;25252:19;;25306:4;25298:6;25294:17;25405:6;25393:10;25390:22;25369:18;25357:10;25354:34;25351:62;25348:2;;;25426:1;25423;25416:12;25348:2;25446:10;25442:2;25435:22;25246:216;;;;;25469:277;;25647:18;25639:6;25636:30;25633:2;;;25679:1;25676;25669:12;25633:2;25708:4;25700:6;25696:17;25688:25;;25736:4;25730;25726:15;25718:23;;25570:176;;;;25753:229;;25906:18;25898:6;25895:30;25892:2;;;25938:1;25935;25928:12;25892:2;25967:4;25959:6;25955:17;25947:25;;25829:153;;;;25989:233;;26146:18;26138:6;26135:30;26132:2;;;26178:1;26175;26168:12;26132:2;26207:4;26199:6;26195:17;26187:25;;26069:153;;;;26229:258;;26372:18;26364:6;26361:30;26358:2;;;26404:1;26401;26394:12;26358:2;26448:4;26444:9;26437:4;26429:6;26425:17;26421:33;26413:41;;26477:4;26471;26467:15;26459:23;;26295:192;;;;26496:125;;26608:6;26597:17;;26589:32;;;;26632:138;;26758:4;26750:6;26746:17;26735:28;;26727:43;;;;26779:113;;26884:3;26874:13;;26868:24;;;;26899:124;;27012:5;27006:12;26996:22;;26990:33;;;;27030:92;;27111:5;27105:12;27095:22;;27089:33;;;;27130:137;;27256:4;27248:6;27244:17;27233:28;;27226:41;;;;27276:139;;27404:4;27396:6;27392:17;27381:28;;27374:41;;;;27424:161;;27576:3;27561:18;;27554:31;;;;;27594:199;;27745:6;27740:3;27733:19;27782:4;27777:3;27773:14;27758:29;;27726:67;;;;;27802:163;;27917:6;27912:3;27905:19;27954:4;27949:3;27945:14;27930:29;;27898:67;;;;;27974:145;;28110:3;28095:18;;28088:31;;;;;28127:92;;28207:5;28200:13;28193:21;28182:32;;28176:43;;;;28226:79;;28295:5;28284:16;;28278:27;;;;28312:79;;28381:5;28370:16;;28364:27;;;;28398:79;;28467:5;28456:16;;28450:27;;;;28485:145;28566:6;28561:3;28556;28543:30;28622:1;28613:6;28608:3;28604:16;28597:27;28536:94;;;;28639:268;28704:1;28711:101;28725:6;28722:1;28719:13;28711:101;;;28801:1;28796:3;28792:11;28786:18;28782:1;28777:3;28773:11;28766:39;28747:2;28744:1;28740:10;28735:15;;28711:101;;;28827:6;28824:1;28821:13;28818:2;;;28892:1;28883:6;28878:3;28874:16;28867:27;28818:2;28688:219;;;;;28915:74;;28979:5;28968:16;;28962:27;;;", - "source": "pragma solidity 0.5.4;\npragma experimental ABIEncoderV2;\n\nimport \"./Utils.sol\";\n\ncontract ZetherVerifier {\n using Utils for uint256;\n\n uint256 constant m = 64;\n uint256 constant n = 6;\n uint256 constant FIELD_ORDER = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n uint256 constant UNITY = 9334303377689037989442018753807510978357674015322511348041267794643984346845; // primitive 2^28th root of unity modulo GROUP_ORDER (not field!)\n\n G1Point[] gs; // warning: this and the below are not statically sized anymore\n G1Point[] hs; // need to push to these if large anonsets are used.\n G1Point g;\n G1Point h;\n\n struct ZetherStatement {\n G1Point[] CLn;\n G1Point[] CRn;\n G1Point[] C;\n G1Point D;\n G1Point[] y;\n uint256 epoch; // or uint8?\n G1Point u;\n }\n\n struct ZetherProof {\n G1Point BA;\n G1Point BS;\n G1Point A;\n G1Point B;\n G1Point C;\n G1Point D;\n G1Point E;\n G1Point F;\n\n G1Point[] CLnG;\n G1Point[] CRnG;\n G1Point[] C_0G;\n G1Point[] DG;\n G1Point[] y_0G;\n G1Point[] gG;\n G1Point[] C_XG;\n G1Point[] y_XG;\n\n uint256[] f;\n uint256 z_A;\n uint256 z_C;\n uint256 z_E;\n\n G1Point CPrime;\n G1Point DPrime;\n G1Point CLnPrime;\n G1Point CRnPrime;\n\n G1Point[2] tCommits;\n uint256 tHat;\n uint256 tauX;\n uint256 mu;\n\n uint256 c;\n uint256 s_sk;\n uint256 s_r;\n uint256 s_vTransfer;\n uint256 s_vDiff;\n uint256 s_nuTransfer;\n uint256 s_nuDiff;\n\n InnerProductProof ipProof;\n }\n\n struct InnerProductProof {\n G1Point[n] ls;\n G1Point[n] rs;\n uint256 a;\n uint256 b;\n }\n\n constructor() public {\n g = mapInto(\"G\");\n h = mapInto(\"V\");\n for (uint256 i = 0; i < m; i++) {\n gs.push(mapInto(\"G\", i));\n hs.push(mapInto(\"H\", i));\n }\n }\n\n function verifyTransfer(bytes32[2][] memory CLn, bytes32[2][] memory CRn, bytes32[2][] memory C, bytes32[2] memory D, bytes32[2][] memory y, uint256 epoch, bytes32[2] memory u, bytes memory proof) view public returns (bool) {\n ZetherStatement memory statement;\n uint256 size = y.length;\n\n statement.CLn = new G1Point[](size);\n statement.CRn = new G1Point[](size);\n statement.C = new G1Point[](size);\n statement.y = new G1Point[](size);\n for (uint256 i = 0; i < size; i++) {\n statement.CLn[i] = G1Point(uint256(CLn[i][0]), uint256(CLn[i][1]));\n statement.CRn[i] = G1Point(uint256(CRn[i][0]), uint256(CRn[i][1]));\n statement.C[i] = G1Point(uint256(C[i][0]), uint256(C[i][1]));\n statement.y[i] = G1Point(uint256(y[i][0]), uint256(y[i][1]));\n }\n statement.D = G1Point(uint256(D[0]), uint256(D[1]));\n statement.epoch = epoch;\n statement.u = G1Point(uint256(u[0]), uint256(u[1]));\n ZetherProof memory zetherProof = unserialize(proof);\n return verify(statement, zetherProof);\n }\n\n struct ZetherAuxiliaries {\n uint256 y;\n uint256[m] ys;\n uint256 z;\n uint256[2] zs; // [z^2, z^3]\n uint256[m] twoTimesZSquared;\n uint256 zSum;\n uint256 x;\n uint256 t;\n uint256 k;\n G1Point tEval;\n }\n\n struct SigmaAuxiliaries {\n uint256 c;\n G1Point A_y;\n G1Point A_D;\n G1Point gEpoch;\n G1Point A_u;\n G1Point A_B;\n G1Point A_X;\n G1Point c_commit;\n G1Point A_t;\n G1Point A_C0;\n G1Point A_CLn;\n G1Point A_CPrime;\n G1Point A_CLnPrime;\n }\n\n struct AnonAuxiliaries {\n uint256 m;\n uint256 N;\n uint256 d;\n uint256 w;\n uint256 dPow;\n uint256 wPow;\n uint256[2][] f; // could just allocate extra space in the proof?\n uint256[2][] r; // each poly is an array of length N. evaluations of prods\n G1Point temp;\n G1Point CLnR;\n G1Point CRnR;\n G1Point[2][] CR;\n G1Point[2][] yR;\n G1Point C_XR;\n G1Point y_XR;\n G1Point gR;\n G1Point DR;\n }\n\n struct IPAuxiliaries {\n G1Point u_x;\n G1Point[m] hPrimes;\n uint256[m] hExp;\n G1Point P;\n uint256 o;\n uint256[n] challenges;\n uint256[m] otherExponents;\n }\n\n function verify(ZetherStatement memory statement, ZetherProof memory proof) view internal returns (bool) {\n uint256 statementHash = uint256(keccak256(abi.encode(statement.CLn, statement.CRn, statement.C, statement.D, statement.y, statement.epoch))).mod();\n\n AnonAuxiliaries memory anonAuxiliaries;\n anonAuxiliaries.d = uint256(keccak256(abi.encode(statementHash, proof.BA, proof.BS, proof.A, proof.B, proof.C, proof.D, proof.E, proof.F))).mod();\n anonAuxiliaries.w = uint256(keccak256(abi.encode(anonAuxiliaries.d, proof.CLnG, proof.CRnG, proof.C_0G, proof.DG, proof.y_0G, proof.gG, proof.C_XG, proof.y_XG))).mod();\n anonAuxiliaries.m = proof.f.length / 2;\n anonAuxiliaries.N = 2 ** anonAuxiliaries.m;\n anonAuxiliaries.f = new uint256[2][](2 * anonAuxiliaries.m);\n for (uint256 k = 0; k < 2 * anonAuxiliaries.m; k++) {\n anonAuxiliaries.f[k][1] = proof.f[k];\n anonAuxiliaries.f[k][0] = anonAuxiliaries.w.sub(proof.f[k]);\n }\n\n for (uint256 k = 0; k < 2 * anonAuxiliaries.m; k++) {\n anonAuxiliaries.temp = add(anonAuxiliaries.temp, mul(gs[k], anonAuxiliaries.f[k][1]));\n }\n require(eq(add(mul(proof.B, anonAuxiliaries.w), proof.A), add(anonAuxiliaries.temp, mul(h, proof.z_A))), \"Recovery failure for B^w * A.\");\n\n anonAuxiliaries.temp = G1Point(0, 0);\n for (uint256 k = 0; k < 2 * anonAuxiliaries.m; k++) { // danger... gs and hs need to be big enough.\n anonAuxiliaries.temp = add(anonAuxiliaries.temp, mul(gs[k], anonAuxiliaries.f[k][1].mul(anonAuxiliaries.w.sub(anonAuxiliaries.f[k][1]))));\n }\n require(eq(add(mul(proof.C, anonAuxiliaries.w), proof.D), add(anonAuxiliaries.temp, mul(h, proof.z_C))), \"Recovery failure for C^w * D.\");\n\n anonAuxiliaries.temp = add(mul(gs[0], anonAuxiliaries.f[0][1].mul(anonAuxiliaries.f[anonAuxiliaries.m][1])), mul(gs[1], anonAuxiliaries.f[0][0].mul(anonAuxiliaries.f[anonAuxiliaries.m][0])));\n require(eq(add(mul(proof.F, anonAuxiliaries.w), proof.E), add(anonAuxiliaries.temp, mul(h, proof.z_E))), \"Recovery failure for F^w * E.\");\n\n anonAuxiliaries.r = assemblePolynomials(anonAuxiliaries.f);\n\n anonAuxiliaries.CR = assembleConvolutions(anonAuxiliaries.r, statement.C);\n anonAuxiliaries.yR = assembleConvolutions(anonAuxiliaries.r, statement.y);\n for (uint256 i = 0; i < anonAuxiliaries.N; i++) {\n anonAuxiliaries.CLnR = add(anonAuxiliaries.CLnR, mul(statement.CLn[i], anonAuxiliaries.r[i][0]));\n anonAuxiliaries.CRnR = add(anonAuxiliaries.CRnR, mul(statement.CRn[i], anonAuxiliaries.r[i][0]));\n }\n anonAuxiliaries.dPow = 1;\n for (uint256 i = 0; i < anonAuxiliaries.N; i++) {\n anonAuxiliaries.C_XR = add(anonAuxiliaries.C_XR, mul(anonAuxiliaries.CR[i / 2][i % 2], anonAuxiliaries.dPow));\n anonAuxiliaries.y_XR = add(anonAuxiliaries.y_XR, mul(anonAuxiliaries.yR[i / 2][i % 2], anonAuxiliaries.dPow));\n if (i > 0) {\n anonAuxiliaries.dPow = anonAuxiliaries.dPow.mul(anonAuxiliaries.d);\n }\n }\n anonAuxiliaries.wPow = 1;\n for (uint256 k = 0; k < anonAuxiliaries.m; k++) {\n anonAuxiliaries.CLnR = add(anonAuxiliaries.CLnR, mul(proof.CLnG[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.CRnR = add(anonAuxiliaries.CRnR, mul(proof.CRnG[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.CR[0][0] = add(anonAuxiliaries.CR[0][0], mul(proof.C_0G[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.DR = add(anonAuxiliaries.DR, mul(proof.DG[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.yR[0][0] = add(anonAuxiliaries.yR[0][0], mul(proof.y_0G[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.gR = add(anonAuxiliaries.gR, mul(proof.gG[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.C_XR = add(anonAuxiliaries.C_XR, mul(proof.C_XG[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.y_XR = add(anonAuxiliaries.y_XR, mul(proof.y_XG[k], anonAuxiliaries.wPow.neg()));\n\n anonAuxiliaries.wPow = anonAuxiliaries.wPow.mul(anonAuxiliaries.w);\n }\n anonAuxiliaries.DR = add(anonAuxiliaries.DR, mul(statement.D, anonAuxiliaries.wPow));\n anonAuxiliaries.gR = add(anonAuxiliaries.gR, mul(g, anonAuxiliaries.wPow));\n\n ZetherAuxiliaries memory zetherAuxiliaries;\n zetherAuxiliaries.y = uint256(keccak256(abi.encode(anonAuxiliaries.w, proof.CPrime, proof.DPrime, proof.CLnPrime, proof.CRnPrime))).mod();\n zetherAuxiliaries.ys = powers(zetherAuxiliaries.y);\n zetherAuxiliaries.z = uint256(keccak256(abi.encode(zetherAuxiliaries.y))).mod();\n zetherAuxiliaries.zs = [zetherAuxiliaries.z.exp(2), zetherAuxiliaries.z.exp(3)]; \n zetherAuxiliaries.zSum = zetherAuxiliaries.zs[0].add(zetherAuxiliaries.zs[1]).mul(zetherAuxiliaries.z);\n zetherAuxiliaries.k = sumScalars(zetherAuxiliaries.ys).mul(zetherAuxiliaries.z.sub(zetherAuxiliaries.zs[0])).sub(zetherAuxiliaries.zSum.mul(2 ** (m / 2)).sub(zetherAuxiliaries.zSum));\n zetherAuxiliaries.t = proof.tHat.sub(zetherAuxiliaries.k);\n for (uint256 i = 0; i < m / 2; i++) {\n zetherAuxiliaries.twoTimesZSquared[i] = zetherAuxiliaries.zs[0].mul(2 ** i);\n zetherAuxiliaries.twoTimesZSquared[i + m / 2] = zetherAuxiliaries.zs[1].mul(2 ** i);\n }\n\n zetherAuxiliaries.x = uint256(keccak256(abi.encode(zetherAuxiliaries.z, proof.tCommits))).mod();\n zetherAuxiliaries.tEval = add(mul(proof.tCommits[0], zetherAuxiliaries.x), mul(proof.tCommits[1], zetherAuxiliaries.x.mul(zetherAuxiliaries.x))); // replace with \"commit\"?\n\n SigmaAuxiliaries memory sigmaAuxiliaries;\n sigmaAuxiliaries.A_y = add(mul(anonAuxiliaries.gR, proof.s_sk), mul(anonAuxiliaries.yR[0][0], proof.c.neg()));\n sigmaAuxiliaries.A_D = add(mul(g, proof.s_r), mul(statement.D, proof.c.neg())); // add(mul(anonAuxiliaries.gR, proof.s_r), mul(anonAuxiliaries.DR, proof.c.neg()));\n sigmaAuxiliaries.gEpoch = mapInto(\"Zether\", statement.epoch);\n sigmaAuxiliaries.A_u = add(mul(sigmaAuxiliaries.gEpoch, proof.s_sk), mul(statement.u, proof.c.neg()));\n sigmaAuxiliaries.A_X = add(mul(anonAuxiliaries.y_XR, proof.s_r), mul(anonAuxiliaries.C_XR, proof.c.neg()));\n sigmaAuxiliaries.c_commit = add(mul(add(mul(add(anonAuxiliaries.DR, proof.DPrime), proof.s_sk), mul(add(anonAuxiliaries.CR[0][0], proof.CPrime), proof.c.neg())), zetherAuxiliaries.zs[0]), mul(add(mul(add(anonAuxiliaries.CRnR, proof.CRnPrime), proof.s_sk), mul(add(anonAuxiliaries.CLnR, proof.CLnPrime), proof.c.neg())), zetherAuxiliaries.zs[1]));\n sigmaAuxiliaries.A_t = add(mul(add(add(mul(g, zetherAuxiliaries.t), mul(h, proof.tauX)), neg(zetherAuxiliaries.tEval)), proof.c.mul(anonAuxiliaries.wPow)), sigmaAuxiliaries.c_commit);\n sigmaAuxiliaries.A_C0 = add(mul(g, proof.s_vTransfer), add(mul(anonAuxiliaries.DR, proof.s_sk), mul(anonAuxiliaries.CR[0][0], proof.c.neg())));\n sigmaAuxiliaries.A_CLn = add(mul(g, proof.s_vDiff), add(mul(anonAuxiliaries.CRnR, proof.s_sk), mul(anonAuxiliaries.CLnR, proof.c.neg())));\n sigmaAuxiliaries.A_CPrime = add(mul(h, proof.s_nuTransfer), add(mul(proof.DPrime, proof.s_sk), mul(proof.CPrime, proof.c.neg())));\n sigmaAuxiliaries.A_CLnPrime = add(mul(h, proof.s_nuDiff), add(mul(proof.CRnPrime, proof.s_sk), mul(proof.CLnPrime, proof.c.neg())));\n\n sigmaAuxiliaries.c = uint256(keccak256(abi.encode(zetherAuxiliaries.x, sigmaAuxiliaries.A_y, sigmaAuxiliaries.A_D, sigmaAuxiliaries.A_u, sigmaAuxiliaries.A_X, sigmaAuxiliaries.A_t, sigmaAuxiliaries.A_C0, sigmaAuxiliaries.A_CLn, sigmaAuxiliaries.A_CPrime, sigmaAuxiliaries.A_CLnPrime))).mod();\n require(sigmaAuxiliaries.c == proof.c, \"Sigma protocol challenge equality failure.\");\n\n IPAuxiliaries memory ipAuxiliaries;\n ipAuxiliaries.o = uint256(keccak256(abi.encode(sigmaAuxiliaries.c))).mod();\n ipAuxiliaries.u_x = mul(g, ipAuxiliaries.o);\n ipAuxiliaries.hPrimes = hadamardInv(hs, zetherAuxiliaries.ys);\n ipAuxiliaries.hExp = addVectors(times(zetherAuxiliaries.ys, zetherAuxiliaries.z), zetherAuxiliaries.twoTimesZSquared);\n ipAuxiliaries.P = add(add(add(proof.BA, mul(proof.BS, zetherAuxiliaries.x)), mul(sumPoints(gs), zetherAuxiliaries.z.neg())), commit(ipAuxiliaries.hPrimes, ipAuxiliaries.hExp));\n ipAuxiliaries.P = add(ipAuxiliaries.P, mul(h, proof.mu.neg()));\n ipAuxiliaries.P = add(ipAuxiliaries.P, mul(ipAuxiliaries.u_x, proof.tHat));\n\n // begin inner product verification\n InnerProductProof memory ipProof = proof.ipProof;\n for (uint256 i = 0; i < n; i++) {\n ipAuxiliaries.o = uint256(keccak256(abi.encode(ipAuxiliaries.o, ipProof.ls[i], ipProof.rs[i]))).mod();\n ipAuxiliaries.challenges[i] = ipAuxiliaries.o; // overwrites value\n uint256 xInv = ipAuxiliaries.o.inv();\n ipAuxiliaries.P = add(ipAuxiliaries.P, add(mul(ipProof.ls[i], ipAuxiliaries.o.exp(2)), mul(ipProof.rs[i], xInv.exp(2))));\n }\n\n ipAuxiliaries.otherExponents[0] = 1;\n for (uint256 i = 0; i < n; i++) {\n ipAuxiliaries.otherExponents[0] = ipAuxiliaries.otherExponents[0].mul(ipAuxiliaries.challenges[i]);\n }\n bool[m] memory bitSet;\n ipAuxiliaries.otherExponents[0] = ipAuxiliaries.otherExponents[0].inv();\n for (uint256 i = 0; i < m/2; ++i) {\n for (uint256 j = 0; (1 << j) + i < m; ++j) {\n uint256 i1 = i + (1 << j);\n if (!bitSet[i1]) {\n uint256 temp = ipAuxiliaries.challenges[n - 1 - j].mul(ipAuxiliaries.challenges[n - 1 - j]);\n ipAuxiliaries.otherExponents[i1] = ipAuxiliaries.otherExponents[i].mul(temp);\n bitSet[i1] = true;\n }\n }\n }\n\n G1Point memory gTemp;\n G1Point memory hTemp;\n for (uint256 i = 0; i < m; i++) {\n gTemp = add(gTemp, mul(gs[i], ipAuxiliaries.otherExponents[i]));\n hTemp = add(hTemp, mul(ipAuxiliaries.hPrimes[i], ipAuxiliaries.otherExponents[m - 1 - i]));\n }\n G1Point memory cProof = add(add(mul(gTemp, ipProof.a), mul(hTemp, ipProof.b)), mul(ipAuxiliaries.u_x, ipProof.a.mul(ipProof.b)));\n require(eq(ipAuxiliaries.P, cProof), \"Inner product equality check failure.\");\n\n return true;\n }\n\n function assemblePolynomials(uint256[2][] memory f) internal view returns (uint256[2][] memory result) {\n uint256 m = f.length / 2;\n uint256 N = 2 ** m;\n result = new uint256[2][](N);\n for (uint256 i = 0; i < 2; i++) {\n uint256[] memory half = recursivePolynomials(i * m, (i + 1) * m, 1, f);\n for (uint256 j = 0; j < N; j++) {\n result[j][i] = half[j];\n }\n }\n }\n\n function recursivePolynomials(uint256 baseline, uint256 current, uint256 accum, uint256[2][] memory f) internal view returns (uint256[] memory result) {\n // have to do a bunch of re-allocating because solidity won't let me have something which is internal and also modifies (internal) state. (?)\n uint256 size = 2 ** (current - baseline); // size is at least 2...\n result = new uint256[](size);\n\n if (current == baseline) {\n result[0] = accum;\n return result;\n }\n current = current - 1;\n\n uint256[] memory left = recursivePolynomials(baseline, current, accum.mul(f[current][0]), f);\n uint256[] memory right = recursivePolynomials(baseline, current, accum.mul(f[current][1]), f);\n for (uint256 i = 0; i < size / 2; i++) {\n result[i] = left[i];\n result[i + size / 2] = right[i];\n }\n }\n\n function assembleConvolutions(uint256[2][] memory exponent, G1Point[] memory base) internal view returns (G1Point[2][] memory result) {\n // exponent is two \"rows\" (actually columns).\n // will return two rows, each of half the length of the exponents;\n // namely, we will return the Hadamards of \"base\" by the even circular shifts of \"exponent\"'s rows.\n uint256 size = exponent.length;\n uint256 half = size / 2;\n result = new G1Point[2][](half); // assuming that this is necessary even when return is declared up top\n\n G1Point[] memory base_fft = fft(base, false);\n\n uint256[] memory exponent_fft = new uint256[](size);\n for (uint256 i = 0; i < 2; i++) {\n for (uint256 j = 0; j < size; j++) {\n exponent_fft[j] = exponent[(size - j) % size][i]; // convolutional flip plus copy\n }\n\n exponent_fft = fft(exponent_fft);\n G1Point[] memory inverse_fft = new G1Point[](half);\n uint256 compensation = 2;\n compensation = compensation.inv();\n for (uint256 j = 0; j < half; j++) { // Hadamard\n inverse_fft[j] = mul(add(mul(base_fft[j], exponent_fft[j]), mul(base_fft[j + half], exponent_fft[j + half])), compensation);\n }\n\n inverse_fft = fft(inverse_fft, true);\n for (uint256 j = 0; j < half; j++) {\n result[j][i] = inverse_fft[j];\n }\n }\n }\n\n function fft(G1Point[] memory input, bool inverse) internal view returns (G1Point[] memory result) {\n uint256 size = input.length;\n if (size == 1) {\n return input;\n }\n require(size % 2 == 0, \"Input size is not a power of 2!\");\n\n uint256 omega = UNITY.exp(2**28 / size);\n uint256 compensation = 1;\n if (inverse) {\n omega = omega.inv();\n compensation = 2;\n }\n compensation = compensation.inv();\n G1Point[] memory even = fft(extract(input, 0), inverse);\n G1Point[] memory odd = fft(extract(input, 1), inverse);\n uint256 omega_run = 1;\n result = new G1Point[](size);\n for (uint256 i = 0; i < size / 2; i++) {\n G1Point memory temp = mul(odd[i], omega_run);\n result[i] = mul(add(even[i], temp), compensation);\n result[i + size / 2] = mul(add(even[i], neg(temp)), compensation);\n omega_run = omega_run.mul(omega);\n }\n }\n\n function extract(G1Point[] memory input, uint256 parity) internal pure returns (G1Point[] memory result) {\n result = new G1Point[](input.length / 2);\n for (uint256 i = 0; i < input.length / 2; i++) {\n result[i] = input[2 * i + parity];\n }\n }\n\n function fft(uint256[] memory input) internal view returns (uint256[] memory result) {\n uint256 size = input.length;\n if (size == 1) {\n return input;\n }\n require(size % 2 == 0, \"Input size is not a power of 2!\");\n\n uint256 omega = UNITY.exp(2**28 / size);\n uint256[] memory even = fft(extract(input, 0));\n uint256[] memory odd = fft(extract(input, 1));\n uint256 omega_run = 1;\n result = new uint256[](size);\n for (uint256 i = 0; i < size / 2; i++) {\n uint256 temp = odd[i].mul(omega_run);\n result[i] = even[i].add(temp);\n result[i + size / 2] = even[i].sub(temp);\n omega_run = omega_run.mul(omega);\n }\n }\n\n function extract(uint256[] memory input, uint256 parity) internal pure returns (uint256[] memory result) {\n result = new uint256[](input.length / 2);\n for (uint256 i = 0; i < input.length / 2; i++) {\n result[i] = input[2 * i + parity];\n }\n }\n\n function unserialize(bytes memory arr) internal pure returns (ZetherProof memory proof) {\n proof.BA = G1Point(slice(arr, 0), slice(arr, 32));\n proof.BS = G1Point(slice(arr, 64), slice(arr, 96));\n proof.A = G1Point(slice(arr, 128), slice(arr, 160));\n proof.B = G1Point(slice(arr, 192), slice(arr, 224));\n proof.C = G1Point(slice(arr, 256), slice(arr, 288));\n proof.D = G1Point(slice(arr, 320), slice(arr, 352));\n proof.E = G1Point(slice(arr, 384), slice(arr, 416));\n proof.F = G1Point(slice(arr, 448), slice(arr, 480));\n\n uint256 m = (arr.length - 2144) / 576;\n proof.CLnG = new G1Point[](m);\n proof.CRnG = new G1Point[](m);\n proof.C_0G = new G1Point[](m);\n proof.DG = new G1Point[](m);\n proof.y_0G = new G1Point[](m);\n proof.gG = new G1Point[](m);\n proof.C_XG = new G1Point[](m);\n proof.y_XG = new G1Point[](m);\n proof.f = new uint256[](2 * m);\n for (uint256 k = 0; k < m; k++) {\n proof.CLnG[k] = G1Point(slice(arr, 512 + k * 64), slice(arr, 544 + k * 64));\n proof.CRnG[k] = G1Point(slice(arr, 512 + (m + k) * 64), slice(arr, 544 + (m + k) * 64));\n proof.C_0G[k] = G1Point(slice(arr, 512 + m * 128 + k * 64), slice(arr, 544 + m * 128 + k * 64));\n proof.DG[k] = G1Point(slice(arr, 512 + m * 192 + k * 64), slice(arr, 544 + m * 192 + k * 64));\n proof.y_0G[k] = G1Point(slice(arr, 512 + m * 256 + k * 64), slice(arr, 544 + m * 256 + k * 64));\n proof.gG[k] = G1Point(slice(arr, 512 + m * 320 + k * 64), slice(arr, 544 + m * 320 + k * 64));\n proof.C_XG[k] = G1Point(slice(arr, 512 + m * 384 + k * 64), slice(arr, 544 + m * 384 + k * 64));\n proof.y_XG[k] = G1Point(slice(arr, 512 + m * 448 + k * 64), slice(arr, 544 + m * 448 + k * 64));\n proof.f[k] = slice(arr, 512 + m * 512 + k * 32);\n proof.f[k + m] = slice(arr, 512 + m * 544 + k * 32);\n }\n uint256 starting = m * 576;\n proof.z_A = slice(arr, 512 + starting);\n proof.z_C = slice(arr, 544 + starting);\n proof.z_E = slice(arr, 576 + starting);\n\n proof.CPrime = G1Point(slice(arr, 608 + starting), slice(arr, 640 + starting));\n proof.DPrime = G1Point(slice(arr, 672 + starting), slice(arr, 704 + starting));\n proof.CLnPrime = G1Point(slice(arr, 736 + starting), slice(arr, 768 + starting));\n proof.CRnPrime = G1Point(slice(arr, 800 + starting), slice(arr, 832 + starting));\n\n proof.tCommits = [G1Point(slice(arr, 864 + starting), slice(arr, 896 + starting)), G1Point(slice(arr, 928 + starting), slice(arr, 960 + starting))];\n proof.tHat = slice(arr, 992 + starting);\n proof.tauX = slice(arr, 1024 + starting);\n proof.mu = slice(arr, 1056 + starting);\n\n proof.c = slice(arr, 1088 + starting);\n proof.s_sk = slice(arr, 1120 + starting);\n proof.s_r = slice(arr, 1152 + starting);\n proof.s_vTransfer = slice(arr, 1184 + starting);\n proof.s_vDiff = slice(arr, 1216 + starting);\n proof.s_nuTransfer = slice(arr, 1248 + starting);\n proof.s_nuDiff = slice(arr, 1280 + starting);\n\n InnerProductProof memory ipProof;\n for (uint256 i = 0; i < n; i++) {\n ipProof.ls[i] = G1Point(slice(arr, 1312 + starting + i * 64), slice(arr, 1344 + starting + i * 64));\n ipProof.rs[i] = G1Point(slice(arr, 1312 + starting + (n + i) * 64), slice(arr, 1344 + starting + (n + i) * 64));\n }\n ipProof.a = slice(arr, 1312 + starting + n * 128);\n ipProof.b = slice(arr, 1344 + starting + n * 128);\n proof.ipProof = ipProof;\n\n return proof;\n }\n\n function addVectors(uint256[m] memory a, uint256[m] memory b) internal pure returns (uint256[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = a[i].add(b[i]);\n }\n }\n\n function hadamardInv(G1Point[] memory ps, uint256[m] memory ss) internal view returns (G1Point[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = mul(ps[i], ss[i].inv());\n }\n }\n\n function sumScalars(uint256[m] memory ys) internal pure returns (uint256 result) {\n for (uint256 i = 0; i < m; i++) {\n result = result.add(ys[i]);\n }\n }\n\n function sumPoints(G1Point[] memory ps) internal view returns (G1Point memory sum) {\n for (uint256 i = 0; i < m; i++) {\n sum = add(sum, ps[i]);\n }\n }\n\n function commit(G1Point[m] memory ps, uint256[m] memory ss) internal view returns (G1Point memory result) {\n for (uint256 i = 0; i < m; i++) {\n result = add(result, mul(ps[i], ss[i]));\n }\n }\n\n function powers(uint256 base) internal pure returns (uint256[m] memory powers) {\n powers[0] = 1;\n powers[1] = base;\n for (uint256 i = 2; i < m; i++) {\n powers[i] = powers[i - 1].mul(base);\n }\n }\n\n function times(uint256[m] memory v, uint256 x) internal pure returns (uint256[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = v[i].mul(x);\n }\n }\n\n function slice(bytes memory input, uint256 start) internal pure returns (uint256 result) { // extracts exactly 32 bytes\n assembly {\n let m := mload(0x40)\n mstore(m, mload(add(add(input, 0x20), start))) // why only 0x20?\n result := mload(m)\n }\n }\n\n struct G1Point {\n uint256 x;\n uint256 y;\n }\n\n function add(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {\n assembly {\n let m := mload(0x40)\n mstore(m, mload(p1))\n mstore(add(m, 0x20), mload(add(p1, 0x20)))\n mstore(add(m, 0x40), mload(p2))\n mstore(add(m, 0x60), mload(add(p2, 0x20)))\n if iszero(staticcall(gas, 0x06, m, 0x80, r, 0x40)) {\n revert(0, 0)\n }\n }\n }\n\n function mul(G1Point memory p, uint256 s) internal view returns (G1Point memory r) {\n assembly {\n let m := mload(0x40)\n mstore(m, mload(p))\n mstore(add(m, 0x20), mload(add(p, 0x20)))\n mstore(add(m, 0x40), s)\n if iszero(staticcall(gas, 0x07, m, 0x60, r, 0x40)) {\n revert(0, 0)\n }\n }\n }\n\n function neg(G1Point memory p) internal pure returns (G1Point memory) {\n return G1Point(p.x, FIELD_ORDER - (p.y % FIELD_ORDER)); // p.y should already be reduced mod P?\n }\n\n function eq(G1Point memory p1, G1Point memory p2) internal pure returns (bool) {\n return p1.x == p2.x && p1.y == p2.y;\n }\n\n function fieldExp(uint256 base, uint256 exponent) internal view returns (uint256 output) { // warning: mod p, not q\n uint256 order = FIELD_ORDER;\n assembly {\n let m := mload(0x40)\n mstore(m, 0x20)\n mstore(add(m, 0x20), 0x20)\n mstore(add(m, 0x40), 0x20)\n mstore(add(m, 0x60), base)\n mstore(add(m, 0x80), exponent)\n mstore(add(m, 0xa0), order)\n if iszero(staticcall(gas, 0x05, m, 0xc0, m, 0x20)) { // staticcall or call?\n revert(0, 0)\n }\n output := mload(m)\n }\n }\n\n function mapInto(uint256 seed) internal view returns (G1Point memory) {\n uint256 y;\n while (true) {\n uint256 ySquared = fieldExp(seed, 3) + 3; // addmod instead of add: waste of gas, plus function overhead cost\n y = fieldExp(ySquared, (FIELD_ORDER + 1) / 4);\n if (fieldExp(y, 2) == ySquared) {\n break;\n }\n seed += 1;\n }\n return G1Point(seed, y);\n }\n\n function mapInto(string memory input) internal view returns (G1Point memory) {\n return mapInto(uint256(keccak256(abi.encodePacked(input))) % FIELD_ORDER);\n }\n\n function mapInto(string memory input, uint256 i) internal view returns (G1Point memory) {\n return mapInto(uint256(keccak256(abi.encodePacked(input, i))) % FIELD_ORDER);\n }\n}\n", + "metadata": "{\"compiler\":{\"version\":\"0.5.4+commit.9549d8ff\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"CLn\",\"type\":\"bytes32[2][]\"},{\"name\":\"CRn\",\"type\":\"bytes32[2][]\"},{\"name\":\"C\",\"type\":\"bytes32[2][]\"},{\"name\":\"D\",\"type\":\"bytes32[2]\"},{\"name\":\"y\",\"type\":\"bytes32[2][]\"},{\"name\":\"epoch\",\"type\":\"uint256\"},{\"name\":\"u\",\"type\":\"bytes32[2]\"},{\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"verifyTransfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZetherVerifier.sol\":\"ZetherVerifier\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/Utils.sol\":{\"keccak256\":\"0x3b410db08d55d9540e8e795474410304be456ca3a36beb8c209019344593b267\",\"urls\":[\"bzzr://f5eaba23ec02eb7c30ce30f795aa0d7b1ae29d61d8111e2955a0f505bd1b328a\"]},\"/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZetherVerifier.sol\":{\"keccak256\":\"0x0d0c52e9560f2a5477cd4f1748cecb69eb1c301c5d9b32e11cc851db9da88b04\",\"urls\":[\"bzzr://00b55719106afb23d143d5a8767c3deb71877ebc16a9430b440eec4e8766e038\"]}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b50620000616040805190810160405280600181526020017f47000000000000000000000000000000000000000000000000000000000000008152506200022f640100000000026401000000009004565b60026000820151816000015560208201518160010155905050620000c96040805190810160405280600181526020017f56000000000000000000000000000000000000000000000000000000000000008152506200022f640100000000026401000000009004565b6004600082015181600001556020820151816001015590505060008090505b604081101562000228576000620001446040805190810160405280600181526020017f470000000000000000000000000000000000000000000000000000000000000081525083620002b2640100000000026401000000009004565b9080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050506001620001d86040805190810160405280600181526020017f480000000000000000000000000000000000000000000000000000000000000081525083620002b2640100000000026401000000009004565b9080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050508080600101915050620000e8565b5062000591565b6200023962000480565b620002ab7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4783604051602001620002719190620004ec565b60405160208183030381529060405280519060200120600190048115156200029557fe5b0662000338640100000000026401000000009004565b9050919050565b620002bc62000480565b620003307f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478484604051602001620002f692919062000505565b60405160208183030381529060405280519060200120600190048115156200031a57fe5b0662000338640100000000026401000000009004565b905092915050565b6200034262000480565b60005b600115620003f557600060036200036d85600362000412640100000000026401000000009004565b019050620003bb81600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4701811515620003a557fe5b0462000412640100000000026401000000009004565b915080620003da83600262000412640100000000026401000000009004565b1415620003e85750620003f5565b6001840193505062000345565b604080519081016040528084815260200182815250915050919050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa15156200047457600080fd5b80519250505092915050565b604080519081016040528060008152602001600081525090565b6000620004a78262000531565b620004b381856200053c565b9350620004c581856020860162000551565b80840191505092915050565b620004e6620004e08262000547565b62000587565b82525050565b6000620004fa82846200049a565b915081905092915050565b60006200051382856200049a565b9150620005218284620004d1565b6020820191508190509392505050565b600081519050919050565b600081905092915050565b6000819050919050565b60005b838110156200057157808201518184015260208101905062000554565b8381111562000581576000848401525b50505050565b6000819050919050565b61549880620005a16000396000f3fe608060405234801561001057600080fd5b5060043610610048576000357c0100000000000000000000000000000000000000000000000000000000900480631659e67d1461004d575b600080fd5b610067600480360361006291908101906149c7565b61007d565b6040516100749190614efb565b60405180910390f35b60006100876141f4565b600086519050806040519080825280602002602001820160405280156100c757816020015b6100b461423f565b8152602001906001900390816100ac5790505b5082600001819052508060405190808252806020026020018201604052801561010a57816020015b6100f761423f565b8152602001906001900390816100ef5790505b5082602001819052508060405190808252806020026020018201604052801561014d57816020015b61013a61423f565b8152602001906001900390816101325790505b5082604001819052508060405190808252806020026020018201604052801561019057816020015b61017d61423f565b8152602001906001900390816101755790505b50826080018190525060008090505b818110156103f45760408051908101604052808d838151811015156101c057fe5b9060200190602002015160006002811015156101d857fe5b60200201516001900481526020018d838151811015156101f457fe5b90602001906020020151600160028110151561020c57fe5b60200201516001900481525083600001518281518110151561022a57fe5b9060200190602002018190525060408051908101604052808c8381518110151561025057fe5b90602001906020020151600060028110151561026857fe5b60200201516001900481526020018c8381518110151561028457fe5b90602001906020020151600160028110151561029c57fe5b6020020151600190048152508360200151828151811015156102ba57fe5b9060200190602002018190525060408051908101604052808b838151811015156102e057fe5b9060200190602002015160006002811015156102f857fe5b60200201516001900481526020018b8381518110151561031457fe5b90602001906020020151600160028110151561032c57fe5b60200201516001900481525083604001518281518110151561034a57fe5b906020019060200201819052506040805190810160405280898381518110151561037057fe5b90602001906020020151600060028110151561038857fe5b602002015160019004815260200189838151811015156103a457fe5b9060200190602002015160016002811015156103bc57fe5b6020020151600190048152508360800151828151811015156103da57fe5b90602001906020020181905250808060010191505061019f565b50604080519081016040528089600060028110151561040f57fe5b602002015160019004815260200189600160028110151561042c57fe5b6020020151600190048152508260600181905250858260a0018181525050604080519081016040528086600060028110151561046457fe5b602002015160019004815260200186600160028110151561048157fe5b6020020151600190048152508260c0018190525061049d614259565b6104a6856104c3565b90506104b28382611007565b935050505098975050505050505050565b6104cb614259565b60408051908101604052806104e1846000612f4d565b81526020016104f1846020612f4d565b81525081600001819052506040805190810160405280610512846040612f4d565b8152602001610522846060612f4d565b81525081602001819052506040805190810160405280610543846080612f4d565b81526020016105538460a0612f4d565b815250816040018190525060408051908101604052806105748460c0612f4d565b81526020016105848460e0612f4d565b815250816060018190525060408051908101604052806105a684610100612f4d565b81526020016105b784610120612f4d565b815250816080018190525060408051908101604052806105d984610140612f4d565b81526020016105ea84610160612f4d565b8152508160a00181905250604080519081016040528061060c84610180612f4d565b815260200161061d846101a0612f4d565b8152508160c00181905250604080519081016040528061063f846101c0612f4d565b8152602001610650846101e0612f4d565b8152508160e00181905250600061024061086084510381151561066f57fe5b049050806040519080825280602002602001820160405280156106ac57816020015b61069961423f565b8152602001906001900390816106915790505b50826101000181905250806040519080825280602002602001820160405280156106f057816020015b6106dd61423f565b8152602001906001900390816106d55790505b508261012001819052508060405190808252806020026020018201604052801561073457816020015b61072161423f565b8152602001906001900390816107195790505b508261014001819052508060405190808252806020026020018201604052801561077857816020015b61076561423f565b81526020019060019003908161075d5790505b50826101600181905250806040519080825280602002602001820160405280156107bc57816020015b6107a961423f565b8152602001906001900390816107a15790505b508261018001819052508060405190808252806020026020018201604052801561080057816020015b6107ed61423f565b8152602001906001900390816107e55790505b50826101a001819052508060405190808252806020026020018201604052801561084457816020015b61083161423f565b8152602001906001900390816108295790505b50826101c001819052508060405190808252806020026020018201604052801561088857816020015b61087561423f565b81526020019060019003908161086d5790505b50826101e00181905250806002026040519080825280602002602001820160405280156108c45781602001602082028038833980820191505090505b5082610200018190525060008090505b81811015610c4b5760408051908101604052806108f8866040850261020001612f4d565b815260200161090e866040850261022001612f4d565b8152508361010001518281518110151561092457fe5b90602001906020020181905250604080519081016040528061094f8660408587010261020001612f4d565b81526020016109678660408587010261022001612f4d565b8152508361012001518281518110151561097d57fe5b9060200190602002018190525060408051908101604052806109ab8660408502608087026102000101612f4d565b81526020016109c68660408502608087026102200101612f4d565b815250836101400151828151811015156109dc57fe5b906020019060200201819052506040805190810160405280610a0a866040850260c087026102000101612f4d565b8152602001610a25866040850260c087026102200101612f4d565b81525083610160015182815181101515610a3b57fe5b906020019060200201819052506040805190810160405280610a6a866040850261010087026102000101612f4d565b8152602001610a86866040850261010087026102200101612f4d565b81525083610180015182815181101515610a9c57fe5b906020019060200201819052506040805190810160405280610acb866040850261014087026102000101612f4d565b8152602001610ae7866040850261014087026102200101612f4d565b815250836101a0015182815181101515610afd57fe5b906020019060200201819052506040805190810160405280610b2c866040850261018087026102000101612f4d565b8152602001610b48866040850261018087026102200101612f4d565b815250836101c0015182815181101515610b5e57fe5b906020019060200201819052506040805190810160405280610b8d86604085026101c087026102000101612f4d565b8152602001610ba986604085026101c087026102200101612f4d565b815250836101e0015182815181101515610bbf57fe5b90602001906020020181905250610be3846020830261020085026102000101612f4d565b83610200015182815181101515610bf657fe5b9060200190602002018181525050610c1b846020830261022085026102000101612f4d565b836102000151838301815181101515610c3057fe5b906020019060200201818152505080806001019150506108d4565b50600061024082029050610c63848261020001612f4d565b83610220018181525050610c7b848261022001612f4d565b83610240018181525050610c93848261024001612f4d565b836102600181815250506040805190810160405280610cb6868461026001612f4d565b8152602001610cc9868461028001612f4d565b8152508361028001819052506040805190810160405280610cee86846102a001612f4d565b8152602001610d0186846102c001612f4d565b815250836102a001819052506040805190810160405280610d2686846102e001612f4d565b8152602001610d39868461030001612f4d565b815250836102c001819052506040805190810160405280610d5e868461032001612f4d565b8152602001610d71868461034001612f4d565b815250836102e0018190525060408051908101604052806040805190810160405280610da1888661036001612f4d565b8152602001610db4888661038001612f4d565b81525081526020016040805190810160405280610dd588866103a001612f4d565b8152602001610de888866103c001612f4d565b815250815250836103000181905250610e0584826103e001612f4d565b83610320018181525050610e1d848261040001612f4d565b83610340018181525050610e35848261042001612f4d565b83610360018181525050610e4d848261044001612f4d565b83610380018181525050610e65848261046001612f4d565b836103a0018181525050610e7d848261048001612f4d565b836103c0018181525050610e9584826104a001612f4d565b836103e0018181525050610ead84826104c001612f4d565b83610400018181525050610ec584826104e001612f4d565b83610420018181525050610edd848261050001612f4d565b83610440018181525050610eef6143b7565b60008090505b6006811015610fb7576040805190810160405280610f1c8860408502876105200101612f4d565b8152602001610f348860408502876105400101612f4d565b815250826000015182600681101515610f4957fe5b60200201819052506040805190810160405280610f728860408560060102876105200101612f4d565b8152602001610f8d8860408560060102876105400101612f4d565b815250826020015182600681101515610fa257fe5b60200201819052508080600101915050610ef5565b50610fcc856080600602846105200101612f4d565b816040018181525050610fe9856080600602846105400101612f4d565b81606001818152505080846104600181905250839350505050919050565b60008061105f846000015185602001518660400151876060015188608001518960a0015160405160200161104096959493929190614e7e565b6040516020818303038152906040528051906020012060019004612f66565b90506110696143ed565b6110cc82856000015186602001518760400151886060015189608001518a60a001518b60c001518c60e001516040516020016110ad9998979695949392919061516a565b6040516020818303038152906040528051906020012060019004612f66565b81604001818152505061114481604001518561010001518661012001518761014001518861016001518961018001518a6101a001518b6101c001518c6101e001516040516020016111259998979695949392919061501a565b6040516020818303038152906040528051906020012060019004612f66565b81606001818152505060028461020001515181151561115f57fe5b04816000018181525050806000015160020a81602001818152505080600001516002026040519080825280602002602001820160405280156111bb57816020015b6111a861449c565b8152602001906001900390816111a05790505b508160c0018190525060008090505b816000015160020281101561129c57846102000151818151811015156111ec57fe5b906020019060200201518260c001518281518110151561120857fe5b90602001906020020151600160028110151561122057fe5b60200201818152505061125c8561020001518281518110151561123f57fe5b906020019060200201518360600151612f9b90919063ffffffff16565b8260c001518281518110151561126e57fe5b90602001906020020151600060028110151561128657fe5b60200201818152505080806001019150506111ca565b5060008090505b81600001516002028110156113495761133382610100015161132e6000848154811015156112cd57fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250508560c001518581518110151561130c57fe5b90602001906020020151600160028110151561132457fe5b6020020151612fdb565b613016565b82610100018190525080806001019150506112a3565b506113ae61136c61136286606001518460600151612fdb565b8660400151613016565b6113a98361010001516113a4600460408051908101604052908160008201548152602001600182015481525050896102200151612fdb565b613016565b61305c565b15156113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e690614f96565b60405180910390fd5b604080519081016040528060008152602001600081525081610100018190525060008090505b8160000151600202811015611511576114fb8261010001516114f660008481548110151561143f57fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250506114f16114b48760c001518781518110151561148457fe5b90602001906020020151600160028110151561149c57fe5b60200201518860600151612f9b90919063ffffffff16565b8760c00151878151811015156114c657fe5b9060200190602002015160016002811015156114de57fe5b602002015161308490919063ffffffff16565b612fdb565b613016565b8261010001819052508080600101915050611415565b5061157661153461152a86608001518460600151612fdb565b8660a00151613016565b61157183610100015161156c600460408051908101604052908160008201548152602001600182015481525050896102400151612fdb565b613016565b61305c565b15156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90614f76565b60405180910390fd5b6117306116726000808154811015156115cc57fe5b90600052602060002090600202016040805190810160405290816000820154815260200160018201548152505061166d8460c00151856000015181518110151561161257fe5b90602001906020020151600160028110151561162a57fe5b60200201518560c00151600081518110151561164257fe5b90602001906020020151600160028110151561165a57fe5b602002015161308490919063ffffffff16565b612fdb565b61172b6000600181548110151561168557fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250506117268560c0015186600001518151811015156116cb57fe5b9060200190602002015160006002811015156116e357fe5b60200201518660c0015160008151811015156116fb57fe5b90602001906020020151600060028110151561171357fe5b602002015161308490919063ffffffff16565b612fdb565b613016565b81610100018190525061179d61175b6117518660e001518460600151612fdb565b8660c00151613016565b611798836101000151611793600460408051908101604052908160008201548152602001600182015481525050896102600151612fdb565b613016565b61305c565b15156117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d590614f56565b60405180910390fd5b6117eb8160c001516130bb565b8160e001819052506118058160e0015186604001516131b3565b8161016001819052506118208160e0015186608001516131b3565b81610180018190525060008090505b816020015181101561191c5761189c82610120015161189788600001518481518110151561185957fe5b906020019060200201518560e001518581518110151561187557fe5b90602001906020020151600060028110151561188d57fe5b6020020151612fdb565b613016565b8261012001819052506119068261014001516119018860200151848151811015156118c357fe5b906020019060200201518560e00151858151811015156118df57fe5b9060200190602002015160006002811015156118f757fe5b6020020151612fdb565b613016565b826101400181905250808060010191505061182f565b50600181608001818152505060008090505b8160200151811015611a4b5761199c826101a0015161199784610160015160028581151561195857fe5b0481518110151561196557fe5b9060200190602002015160028581151561197b57fe5b0660028110151561198857fe5b60200201518560800151612fdb565b613016565b826101a00181905250611a07826101c00151611a028461018001516002858115156119c357fe5b048151811015156119d057fe5b906020019060200201516002858115156119e657fe5b066002811015156119f357fe5b60200201518560800151612fdb565b613016565b826101c001819052506000811115611a3e57611a348260400151836080015161308490919063ffffffff16565b8260800181815250505b808060010191505061192e565b5060018160a001818152505060008090505b8160000151811015611d8e57611aa9826101200151611aa487610100015184815181101515611a8857fe5b90602001906020020151611a9f8660a00151613469565b612fdb565b613016565b826101200181905250611af2826101400151611aed87610120015184815181101515611ad157fe5b90602001906020020151611ae88660a00151613469565b612fdb565b613016565b826101400181905250611b668261016001516000815181101515611b1257fe5b906020019060200201516000600281101515611b2a57fe5b6020020151611b6187610140015184815181101515611b4557fe5b90602001906020020151611b5c8660a00151613469565b612fdb565b613016565b8261016001516000815181101515611b7a57fe5b906020019060200201516000600281101515611b9257fe5b6020020181905250611bda826102000151611bd587610160015184815181101515611bb957fe5b90602001906020020151611bd08660a00151613469565b612fdb565b613016565b826102000181905250611c4e8261018001516000815181101515611bfa57fe5b906020019060200201516000600281101515611c1257fe5b6020020151611c4987610180015184815181101515611c2d57fe5b90602001906020020151611c448660a00151613469565b612fdb565b613016565b8261018001516000815181101515611c6257fe5b906020019060200201516000600281101515611c7a57fe5b6020020181905250611cc2826101e00151611cbd876101a0015184815181101515611ca157fe5b90602001906020020151611cb88660a00151613469565b612fdb565b613016565b826101e00181905250611d0b826101a00151611d06876101c0015184815181101515611cea57fe5b90602001906020020151611d018660a00151613469565b612fdb565b613016565b826101a00181905250611d54826101c00151611d4f876101e0015184815181101515611d3357fe5b90602001906020020151611d4a8660a00151613469565b612fdb565b613016565b826101c00181905250611d7882606001518360a0015161308490919063ffffffff16565b8260a00181815250508080600101915050611a5d565b50611daf816102000151611daa87606001518460a00151612fdb565b613016565b816102000181905250611df4816101e00151611def6002604080519081016040529081600082015481526020016001820154815250508460a00151612fdb565b613016565b816101e00181905250611e056144be565b611e588260600151866102800151876102a00151886102c00151896102e00151604051602001611e39959493929190615116565b6040516020818303038152906040528051906020012060019004612f66565b816000018181525050611e6e8160000151613495565b8160200181905250611ead8160000151604051602001611e8e9190614fd6565b6040516020818303038152906040528051906020012060019004612f66565b8160400181815250506040805190810160405280611ed96002846040015161353290919063ffffffff16565b8152602001611ef66003846040015161353290919063ffffffff16565b8152508160600181905250611f588160400151611f4a83606001516001600281101515611f1f57fe5b602002015184606001516000600281101515611f3757fe5b602002015161359f90919063ffffffff16565b61308490919063ffffffff16565b8160a0018181525050611ffb611fa18260a00151611f9360026040811515611f7c57fe5b0460020a8560a0015161308490919063ffffffff16565b612f9b90919063ffffffff16565b611fed611fd284606001516000600281101515611fba57fe5b60200201518560400151612f9b90919063ffffffff16565b611fdf85602001516135d6565b61308490919063ffffffff16565b612f9b90919063ffffffff16565b81610100018181525050612022816101000151866103200151612f9b90919063ffffffff16565b8160e001818152505060008090505b6002604081151561203e57fe5b048110156120f2576120738160020a8360600151600060028110151561206057fe5b602002015161308490919063ffffffff16565b82608001518260408110151561208557fe5b6020020181815250506120bb8160020a836060015160016002811015156120a857fe5b602002015161308490919063ffffffff16565b8260800151600260408115156120cd57fe5b0483016040811015156120dc57fe5b6020020181815250508080600101915050612031565b506121318160400151866103000151604051602001612112929190614ff1565b6040516020818303038152906040528051906020012060019004612f66565b8160c00181815250506121a4612163866103000151600060028110151561215457fe5b60200201518360c00151612fdb565b61219f876103000151600160028110151561217a57fe5b602002015161219a8560c001518660c0015161308490919063ffffffff16565b612fdb565b613016565b8161012001819052506121b561452a565b6122186121cc846101e00151886103a00151612fdb565b61221385610180015160008151811015156121e357fe5b9060200190602002015160006002811015156121fb57fe5b602002015161220e8a6103800151613469565b612fdb565b613016565b8160200181905250612272612252600260408051908101604052908160008201548152602001600182015481525050886103c00151612fdb565b61226d89606001516122688a6103800151613469565b612fdb565b613016565b81604001819052506122bd6040805190810160405280600681526020017f5a657468657200000000000000000000000000000000000000000000000000008152508860a00151613621565b81606001819052506122fb6122db8260600151886103a00151612fdb565b6122f68960c001516122f18a6103800151613469565b612fdb565b613016565b816080018190525061233b61231a846101c00151886103c00151612fdb565b612336856101a001516123318a6103800151613469565b612fdb565b613016565b8160c0018190525061245e6123e56123c861236e6123638761020001518b6102a00151613016565b8a6103a00151612fdb565b6123c36123b0886101600151600081518110151561238857fe5b9060200190602002015160006002811015156123a057fe5b60200201518c6102800151613016565b6123be8c6103800151613469565b612fdb565b613016565b846060015160006002811015156123db57fe5b6020020151612fdb565b61245961243c61240d6124028861014001518c6102e00151613016565b8b6103a00151612fdb565b6124376124248961012001518d6102c00151613016565b6124328d6103800151613469565b612fdb565b613016565b8560600151600160028110151561244f57fe5b6020020151612fdb565b613016565b8160e001819052506125126125086124e76124d46124a06002604080519081016040529081600082015481526020016001820154815250508760e00151612fdb565b6124cf6004604080519081016040529081600082015481526020016001820154815250508c6103400151612fdb565b613016565b6124e2866101200151613691565b613016565b6125038660a001518a610380015161308490919063ffffffff16565b612fdb565b8260e00151613016565b8161010001819052506125b561254d600260408051908101604052908160008201548152602001600182015481525050886103e00151612fdb565b6125b06125648661020001518a6103a00151612fdb565b6125ab876101600151600081518110151561257b57fe5b90602001906020020151600060028110151561259357fe5b60200201516125a68c6103800151613469565b612fdb565b613016565b613016565b81610120018190525061262d6125f0600260408051908101604052908160008201548152602001600182015481525050886104000151612fdb565b6126286126078661014001518a6103a00151612fdb565b61262387610120015161261e8c6103800151613469565b612fdb565b613016565b613016565b8161014001819052506126a5612668600460408051908101604052908160008201548152602001600182015481525050886104200151612fdb565b6126a061267f896102a001518a6103a00151612fdb565b61269b8a61028001516126968c6103800151613469565b612fdb565b613016565b613016565b81610160018190525061271d6126e0600460408051908101604052908160008201548152602001600182015481525050886104400151612fdb565b6127186126f7896102e001518a6103a00151612fdb565b6127138a6102c0015161270e8c6103800151613469565b612fdb565b613016565b613016565b8161018001819052506127988260c001518260200151836040015184608001518560c001518661010001518761012001518861014001518961016001518a61018001516040516020016127799a999897969594939291906151fa565b6040516020818303038152906040528051906020012060019004612f66565b81600001818152505085610380015181600001511415156127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e590614f36565b60405180910390fd5b6127f66145db565b61282d826000015160405160200161280e9190614fd6565b6040516020818303038152906040528051906020012060019004612f66565b8160800181815250506128646002604080519081016040529081600082015481526020016001820154815250508260800151612fdb565b81600001819052506128e56001805480602002602001604051908101604052809291908181526020016000905b828210156128d757838290600052602060002090600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190612891565b50505050846020015161370a565b816020018190525061290c61290284602001518560400151613786565b84608001516137ed565b81604001819052506129de6129c761293989600001516129348b602001518860c00151612fdb565b613016565b6129c26129b06000805480602002602001604051908101604052809291908181526020016000905b828210156129a757838290600052602060002090600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190612961565b50505050613866565b6129bd8860400151613469565b612fdb565b613016565b6129d9836020015184604001516138b3565b613016565b8160600181905250612a2a8160600151612a25600460408051908101604052908160008201548152602001600182015481525050612a208b6103600151613469565b612fdb565b613016565b8160600181905250612a528160600151612a4d83600001518a6103200151612fdb565b613016565b8160600181905250612a626143b7565b876104600151905060008090505b6006811015612baf57612ae08360800151836000015183600681101515612a9357fe5b6020020151846020015184600681101515612aaa57fe5b6020020151604051602001612ac1939291906150df565b6040516020818303038152906040528051906020012060019004612f66565b83608001818152505082608001518360a0015182600681101515612b0057fe5b6020020181815250506000612b188460800151613917565b9050612b998460600151612b94612b5c866000015186600681101515612b3a57fe5b6020020151612b5760028a6080015161353290919063ffffffff16565b612fdb565b612b8f876020015187600681101515612b7157fe5b6020020151612b8a60028861353290919063ffffffff16565b612fdb565b613016565b613016565b8460600181905250508080600101915050612a70565b5060018260c001516000604081101515612bc557fe5b60200201818152505060008090505b6006811015612c4657612c1d8360a0015182600681101515612bf257fe5b60200201518460c001516000604081101515612c0a57fe5b602002015161308490919063ffffffff16565b8360c001516000604081101515612c3057fe5b6020020181815250508080600101915050612bd4565b50612c4f61463e565b612c6f8360c001516000604081101515612c6557fe5b6020020151613917565b8360c001516000604081101515612c8257fe5b60200201818152505060008090505b60026040811515612c9e57fe5b04811015612db15760008090505b6040828260019060020a02011015612da55760008160019060020a02830190508381604081101515612cda57fe5b60200201511515612d99576000612d328760a0015184600160060303600681101515612d0257fe5b60200201518860a0015185600160060303600681101515612d1f57fe5b602002015161308490919063ffffffff16565b9050612d5d818860c0015186604081101515612d4a57fe5b602002015161308490919063ffffffff16565b8760c0015183604081101515612d6f57fe5b60200201818152505060018583604081101515612d8857fe5b602002019015159081151581525050505b50806001019050612cac565b50806001019050612c91565b50612dba614662565b612dc2614662565b60008090505b6040811015612e8b57612e3583612e30600084815481101515612de757fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250508960c0015185604081101515612e2657fe5b6020020151612fdb565b613016565b9250612e7c82612e77886020015184604081101515612e5057fe5b60200201518960c0015185600160400303604081101515612e6d57fe5b6020020151612fdb565b613016565b91508080600101915050612dc8565b50612e94614662565b612ee8612ebb612ea8858860400151612fdb565b612eb6858960600151612fdb565b613016565b612ee38860000151612ede89606001518a6040015161308490919063ffffffff16565b612fdb565b613016565b9050612ef886606001518261305c565b1515612f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3090614fb6565b60405180910390fd5b60019a505050505050505050505092915050565b6000604051826020850101518152805191505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182811515612f9357fe5b069050919050565b600081831015612fcf5782827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010301612fd3565b8183035b905092915050565b612fe3614662565b604051835181526020840151602082015282604082015260408260608360075afa151561300f57600080fd5b5092915050565b61301e614662565b6040518351815260208401516020820152825160408201526020830151606082015260408260808360065afa151561305557600080fd5b5092915050565b60008160000151836000015114801561307c575081602001518360200151145b905092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156130b057fe5b828409905092915050565b60606000600283518115156130cc57fe5b04905060008160020a90508060405190808252806020026020018201604052801561311157816020015b6130fe61449c565b8152602001906001900390816130f65790505b50925060008090505b60028110156131ab57606061313984830285600185010260018961394d565b905060008090505b8381101561319c57818181518110151561315757fe5b90602001906020020151868281518110151561316f57fe5b906020019060200201518460028110151561318657fe5b6020020181815250508080600101915050613141565b5050808060010191505061311a565b505050919050565b606060008351905060006002828115156131c957fe5b0490508060405190808252806020026020018201604052801561320657816020015b6131f361467c565b8152602001906001900390816131eb5790505b5092506060613216856000613b02565b90506060836040519080825280602002602001820160405280156132495781602001602082028038833980820191505090505b50905060008090505b600281101561345e5760008090505b858110156132c957888682880381151561327757fe5b0681518110151561328457fe5b906020019060200201518260028110151561329b57fe5b602002015183828151811015156132ae57fe5b90602001906020020181815250508080600101915050613261565b506132d382613d63565b915060608460405190808252806020026020018201604052801561331157816020015b6132fe61423f565b8152602001906001900390816132f65790505b50905060006002905061332381613917565b905060008090505b868110156133e0576133b86133b2613371888481518110151561334a57fe5b90602001906020020151888581518110151561336257fe5b90602001906020020151612fdb565b6133ad898b860181518110151561338457fe5b90602001906020020151898c870181518110151561339e57fe5b90602001906020020151612fdb565b613016565b83612fdb565b83828151811015156133c657fe5b90602001906020020181905250808060010191505061332b565b506133ec826001613b02565b915060008090505b8681101561344e57828181518110151561340a57fe5b90602001906020020151898281518110151561342257fe5b906020019060200201518560028110151561343957fe5b602002018190525080806001019150506133f4565b5050508080600101915050613252565b505050505092915050565b6000817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001039050919050565b61349d6146aa565b60018160006040811015156134ae57fe5b602002018181525050818160016040811015156134c757fe5b6020020181815250506000600290505b604081101561352c576135088383600184036040811015156134f557fe5b602002015161308490919063ffffffff16565b828260408110151561351657fe5b60200201818152505080806001019150506134d7565b50919050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa151561359357600080fd5b80519250505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156135cb57fe5b828408905092915050565b600080600090505b604081101561361b5761360c83826040811015156135f857fe5b60200201518361359f90919063ffffffff16565b915080806001019150506135de565b50919050565b613629614662565b6136897f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478484604051602001613660929190614e56565b604051602081830303815290604052805190602001206001900481151561368357fe5b06613f8b565b905092915050565b613699614662565b6040805190810160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001518115156136dd57fe5b067f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47038152509050919050565b6137126146ce565b60008090505b604081101561377f5761375c848281518110151561373257fe5b90602001906020020151613757858460408110151561374d57fe5b6020020151613917565b612fdb565b828260408110151561376a57fe5b60200201819052508080600101915050613718565b5092915050565b61378e6146aa565b60008090505b60408110156137e6576137c28385836040811015156137af57fe5b602002015161308490919063ffffffff16565b82826040811015156137d057fe5b6020020181815250508080600101915050613794565b5092915050565b6137f56146aa565b60008090505b604081101561385f5761383b838260408110151561381557fe5b6020020151858360408110151561382857fe5b602002015161359f90919063ffffffff16565b828260408110151561384957fe5b60200201818152505080806001019150506137fb565b5092915050565b61386e614662565b60008090505b60408110156138ad5761389e82848381518110151561388f57fe5b90602001906020020151613016565b91508080600101915050613874565b50919050565b6138bb614662565b60008090505b604081101561391057613901826138fc86846040811015156138df57fe5b602002015186856040811015156138f257fe5b6020020151612fdb565b613016565b915080806001019150506138c1565b5092915050565b60006139468260027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103613532565b9050919050565b6060600085850360020a9050806040519080825280602002602001820160405280156139885781602001602082028038833980820191505090505b509150858514156139ba57838260008151811015156139a357fe5b906020019060200201818152505081915050613afa565b6001850394506060613a0a8787613a04878a8151811015156139d857fe5b9060200190602002015160006002811015156139f057fe5b60200201518961308490919063ffffffff16565b8761394d565b90506060613a568888613a50888b815181101515613a2457fe5b906020019060200201516001600281101515613a3c57fe5b60200201518a61308490919063ffffffff16565b8861394d565b905060008090505b600284811515613a6a57fe5b04811015613af5578281815181101515613a8057fe5b906020019060200201518582815181101515613a9857fe5b90602001906020020181815250508181815181101515613ab457fe5b9060200190602002015185600286811515613acb57fe5b048301815181101515613ada57fe5b90602001906020020181815250508080600101915050613a5e565b505050505b949350505050565b60606000835190506001811415613b1c5783915050613d5d565b6000600282811515613b2a57fe5b06141515613b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6490614f16565b60405180910390fd5b6000613bb1826310000000811515613b8157fe5b047f14a3074b02521e3b1ed9852e5028452693e87be4e910500c7ba9bbddb2f46edd61353290919063ffffffff16565b90506000600190508415613bcf57613bc882613917565b9150600290505b613bd881613917565b90506060613bf0613bea88600061402b565b87613b02565b90506060613c08613c0289600161402b565b88613b02565b905060006001905085604051908082528060200260200182016040528015613c4a57816020015b613c3761423f565b815260200190600190039081613c2f5790505b50965060008090505b600287811515613c5f57fe5b04811015613d5557613c6f614662565b613c908483815181101515613c8057fe5b9060200190602002015184612fdb565b9050613cbc613cb68684815181101515613ca657fe5b9060200190602002015183613016565b87612fdb565b8983815181101515613cca57fe5b90602001906020020181905250613d09613d038684815181101515613ceb57fe5b90602001906020020151613cfe84613691565b613016565b87612fdb565b8960028a811515613d1657fe5b048401815181101515613d2557fe5b90602001906020020181905250613d45878461308490919063ffffffff16565b9250508080600101915050613c53565b505050505050505b92915050565b60606000825190506001811415613d7d5782915050613f86565b6000600282811515613d8b57fe5b06141515613dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc590614f16565b60405180910390fd5b6000613e12826310000000811515613de257fe5b047f14a3074b02521e3b1ed9852e5028452693e87be4e910500c7ba9bbddb2f46edd61353290919063ffffffff16565b90506060613e29613e248660006140de565b613d63565b90506060613e40613e3b8760016140de565b613d63565b905060006001905084604051908082528060200260200182016040528015613e775781602001602082028038833980820191505090505b50955060008090505b600286811515613e8c57fe5b04811015613f7f576000613ec0838584815181101515613ea857fe5b9060200190602002015161308490919063ffffffff16565b9050613eec818684815181101515613ed457fe5b9060200190602002015161359f90919063ffffffff16565b8883815181101515613efa57fe5b9060200190602002018181525050613f32818684815181101515613f1a57fe5b90602001906020020151612f9b90919063ffffffff16565b88600289811515613f3f57fe5b048401815181101515613f4e57fe5b9060200190602002018181525050613f6f868461308490919063ffffffff16565b9250508080600101915050613e80565b5050505050505b919050565b613f93614662565b60005b60011561400e5760006003613fac856003614187565b019050613fe881600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4701811515613fe257fe5b04614187565b915080613ff6836002614187565b1415614002575061400e565b60018401935050613f96565b604080519081016040528084815260200182815250915050919050565b60606002835181151561403a57fe5b0460405190808252806020026020018201604052801561407457816020015b61406161423f565b8152602001906001900390816140595790505b50905060008090505b6002845181151561408a57fe5b048110156140d757838382600202018151811015156140a557fe5b9060200190602002015182828151811015156140bd57fe5b90602001906020020181905250808060010191505061407d565b5092915050565b6060600283518115156140ed57fe5b0460405190808252806020026020018201604052801561411c5781602001602082028038833980820191505090505b50905060008090505b6002845181151561413257fe5b04811015614180578383826002020181518110151561414d57fe5b90602001906020020151828281518110151561416557fe5b90602001906020020181815250508080600101915050614125565b5092915050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa15156141e857600080fd5b80519250505092915050565b6101206040519081016040528060608152602001606081526020016060815260200161421e61423f565b8152602001606081526020016000815260200161423961423f565b81525090565b604080519081016040528060008152602001600081525090565b6109806040519081016040528061426e61423f565b815260200161427b61423f565b815260200161428861423f565b815260200161429561423f565b81526020016142a261423f565b81526020016142af61423f565b81526020016142bc61423f565b81526020016142c961423f565b815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000815260200161432a61423f565b815260200161433761423f565b815260200161434461423f565b815260200161435161423f565b815260200161435e61467c565b8152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016143b16146fd565b81525090565b610340604051908101604052806143cc614733565b81526020016143d9614733565b815260200160008152602001600081525090565b61030060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200161443a61423f565b815260200161444761423f565b815260200161445461423f565b8152602001606081526020016060815260200161446f61423f565b815260200161447c61423f565b815260200161448961423f565b815260200161449661423f565b81525090565b6040805190810160405280600290602082028038833980820191505090505090565b61114060405190810160405280600081526020016144da614762565b8152602001600081526020016144ee61449c565b81526020016144fb614762565b81526020016000815260200160008152602001600081526020016000815260200161452461423f565b81525090565b610320604051908101604052806000815260200161454661423f565b815260200161455361423f565b815260200161456061423f565b815260200161456d61423f565b815260200161457a61423f565b815260200161458761423f565b815260200161459461423f565b81526020016145a161423f565b81526020016145ae61423f565b81526020016145bb61423f565b81526020016145c861423f565b81526020016145d561423f565b81525090565b612160604051908101604052806145f061423f565b81526020016145fd614786565b815260200161460a614762565b815260200161461761423f565b81526020016000815260200161462b6147b5565b8152602001614638614762565b81525090565b61080060405190810160405280604090602082028038833980820191505090505090565b604080519081016040528060008152602001600081525090565b6080604051908101604052806002905b61469461423f565b81526020019060019003908161468c5790505090565b61080060405190810160405280604090602082028038833980820191505090505090565b611000604051908101604052806040905b6146e761423f565b8152602001906001900390816146df5790505090565b61034060405190810160405280614712614733565b815260200161471f614733565b815260200160008152602001600081525090565b610180604051908101604052806006905b61474c61423f565b8152602001906001900390816147445790505090565b61080060405190810160405280604090602082028038833980820191505090505090565b611000604051908101604052806040905b61479f61423f565b8152602001906001900390816147975790505090565b60c060405190810160405280600690602082028038833980820191505090505090565b600082601f83011215156147eb57600080fd5b81356147fe6147f9826152c6565b615299565b9150818183526020840193506020810190508385604084028201111561482357600080fd5b60005b838110156148535781614839888261485d565b845260208401935060408301925050600181019050614826565b5050505092915050565b600082601f830112151561487057600080fd5b600261488361487e826152ee565b615299565b9150818385602084028201111561489957600080fd5b60005b838110156148c957816148af8882614949565b84526020840193506020830192505060018101905061489c565b5050505092915050565b600082601f83011215156148e657600080fd5b60026148f96148f482615310565b615299565b9150818385602084028201111561490f57600080fd5b60005b8381101561493f57816149258882614949565b845260208401935060208301925050600181019050614912565b5050505092915050565b600061495582356153fe565b905092915050565b600082601f830112151561497057600080fd5b813561498361497e82615332565b615299565b9150808252602083016020830185838301111561499f57600080fd5b6149aa838284615412565b50505092915050565b60006149bf8235615408565b905092915050565b600080600080600080600080610140898b0312156149e457600080fd5b600089013567ffffffffffffffff8111156149fe57600080fd5b614a0a8b828c016147d8565b985050602089013567ffffffffffffffff811115614a2757600080fd5b614a338b828c016147d8565b975050604089013567ffffffffffffffff811115614a5057600080fd5b614a5c8b828c016147d8565b9650506060614a6d8b828c016148d3565b95505060a089013567ffffffffffffffff811115614a8a57600080fd5b614a968b828c016147d8565b94505060c0614aa78b828c016149b3565b93505060e0614ab88b828c016148d3565b92505061012089013567ffffffffffffffff811115614ad657600080fd5b614ae28b828c0161495d565b9150509295985092959890939650565b6000614afe8383614dc3565b60408301905092915050565b614b1381615375565b614b1d81846153b0565b9250614b288261535e565b60005b82811015614b5657614b3e858351614af2565b9450614b4982615396565b9150600181019050614b2b565b5050505050565b6000614b6882615380565b614b7281856153bb565b9350614b7d83615368565b60005b82811015614bab57614b93868351614af2565b9550614b9e826153a3565b9150600181019050614b80565b50849250505092915050565b614bc0816153e8565b82525050565b6000614bd18261538b565b614bdb81856153dd565b9350614beb818560208601615421565b80840191505092915050565b6000614c04601f836153cc565b91507f496e7075742073697a65206973206e6f74206120706f776572206f66203221006000830152602082019050919050565b6000614c44602a836153cc565b91507f5369676d612070726f746f636f6c206368616c6c656e676520657175616c697460008301527f79206661696c7572652e000000000000000000000000000000000000000000006020830152604082019050919050565b6000614caa601d836153cc565b91507f5265636f76657279206661696c75726520666f7220465e77202a20452e0000006000830152602082019050919050565b6000614cea601d836153cc565b91507f5265636f76657279206661696c75726520666f7220435e77202a20442e0000006000830152602082019050919050565b6000614d2a601d836153cc565b91507f5265636f76657279206661696c75726520666f7220425e77202a20412e0000006000830152602082019050919050565b6000614d6a6025836153cc565b91507f496e6e65722070726f6475637420657175616c69747920636865636b2066616960008301527f6c7572652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b604082016000820151614dd96000850182614e21565b506020820151614dec6020850182614e21565b50505050565b604082016000820151614e086000850182614e21565b506020820151614e1b6020850182614e21565b50505050565b614e2a816153f4565b82525050565b614e39816153f4565b82525050565b614e50614e4b826153f4565b615454565b82525050565b6000614e628285614bc6565b9150614e6e8284614e3f565b6020820191508190509392505050565b600060e0820190508181036000830152614e988189614b5d565b90508181036020830152614eac8188614b5d565b90508181036040830152614ec08187614b5d565b9050614ecf6060830186614df2565b81810360a0830152614ee18185614b5d565b9050614ef060c0830184614e30565b979650505050505050565b6000602082019050614f106000830184614bb7565b92915050565b60006020820190508181036000830152614f2f81614bf7565b9050919050565b60006020820190508181036000830152614f4f81614c37565b9050919050565b60006020820190508181036000830152614f6f81614c9d565b9050919050565b60006020820190508181036000830152614f8f81614cdd565b9050919050565b60006020820190508181036000830152614faf81614d1d565b9050919050565b60006020820190508181036000830152614fcf81614d5d565b9050919050565b6000602082019050614feb6000830184614e30565b92915050565b600060a0820190506150066000830185614e30565b6150136020830184614b0a565b9392505050565b600061012082019050615030600083018c614e30565b8181036020830152615042818b614b5d565b90508181036040830152615056818a614b5d565b9050818103606083015261506a8189614b5d565b9050818103608083015261507e8188614b5d565b905081810360a08301526150928187614b5d565b905081810360c08301526150a68186614b5d565b905081810360e08301526150ba8185614b5d565b90508181036101008301526150cf8184614b5d565b90509a9950505050505050505050565b600060a0820190506150f46000830186614e30565b6151016020830185614df2565b61510e6060830184614df2565b949350505050565b60006101208201905061512c6000830188614e30565b6151396020830187614df2565b6151466060830186614df2565b61515360a0830185614df2565b61516060e0830184614df2565b9695505050505050565b600061022082019050615180600083018c614e30565b61518d602083018b614df2565b61519a606083018a614df2565b6151a760a0830189614df2565b6151b460e0830188614df2565b6151c2610120830187614df2565b6151d0610160830186614df2565b6151de6101a0830185614df2565b6151ec6101e0830184614df2565b9a9950505050505050505050565b600061026082019050615210600083018d614e30565b61521d602083018c614df2565b61522a606083018b614df2565b61523760a083018a614df2565b61524460e0830189614df2565b615252610120830188614df2565b615260610160830187614df2565b61526e6101a0830186614df2565b61527c6101e0830185614df2565b61528a610220830184614df2565b9b9a5050505050505050505050565b6000604051905081810181811067ffffffffffffffff821117156152bc57600080fd5b8060405250919050565b600067ffffffffffffffff8211156152dd57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561530557600080fd5b602082029050919050565b600067ffffffffffffffff82111561532757600080fd5b602082029050919050565b600067ffffffffffffffff82111561534957600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60008115159050919050565b6000819050919050565b6000819050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561543f578082015181840152602081019050615424565b8381111561544e576000848401525b50505050565b600081905091905056fea265627a7a72305820c3f09a7f54eabf5ef0d4984f25fe6de9c1028704e8cbe6f284e9cef4274abf2d6c6578706572696d656e74616cf50037", + "deployedBytecode": "0x608060405234801561001057600080fd5b5060043610610048576000357c0100000000000000000000000000000000000000000000000000000000900480631659e67d1461004d575b600080fd5b610067600480360361006291908101906149c7565b61007d565b6040516100749190614efb565b60405180910390f35b60006100876141f4565b600086519050806040519080825280602002602001820160405280156100c757816020015b6100b461423f565b8152602001906001900390816100ac5790505b5082600001819052508060405190808252806020026020018201604052801561010a57816020015b6100f761423f565b8152602001906001900390816100ef5790505b5082602001819052508060405190808252806020026020018201604052801561014d57816020015b61013a61423f565b8152602001906001900390816101325790505b5082604001819052508060405190808252806020026020018201604052801561019057816020015b61017d61423f565b8152602001906001900390816101755790505b50826080018190525060008090505b818110156103f45760408051908101604052808d838151811015156101c057fe5b9060200190602002015160006002811015156101d857fe5b60200201516001900481526020018d838151811015156101f457fe5b90602001906020020151600160028110151561020c57fe5b60200201516001900481525083600001518281518110151561022a57fe5b9060200190602002018190525060408051908101604052808c8381518110151561025057fe5b90602001906020020151600060028110151561026857fe5b60200201516001900481526020018c8381518110151561028457fe5b90602001906020020151600160028110151561029c57fe5b6020020151600190048152508360200151828151811015156102ba57fe5b9060200190602002018190525060408051908101604052808b838151811015156102e057fe5b9060200190602002015160006002811015156102f857fe5b60200201516001900481526020018b8381518110151561031457fe5b90602001906020020151600160028110151561032c57fe5b60200201516001900481525083604001518281518110151561034a57fe5b906020019060200201819052506040805190810160405280898381518110151561037057fe5b90602001906020020151600060028110151561038857fe5b602002015160019004815260200189838151811015156103a457fe5b9060200190602002015160016002811015156103bc57fe5b6020020151600190048152508360800151828151811015156103da57fe5b90602001906020020181905250808060010191505061019f565b50604080519081016040528089600060028110151561040f57fe5b602002015160019004815260200189600160028110151561042c57fe5b6020020151600190048152508260600181905250858260a0018181525050604080519081016040528086600060028110151561046457fe5b602002015160019004815260200186600160028110151561048157fe5b6020020151600190048152508260c0018190525061049d614259565b6104a6856104c3565b90506104b28382611007565b935050505098975050505050505050565b6104cb614259565b60408051908101604052806104e1846000612f4d565b81526020016104f1846020612f4d565b81525081600001819052506040805190810160405280610512846040612f4d565b8152602001610522846060612f4d565b81525081602001819052506040805190810160405280610543846080612f4d565b81526020016105538460a0612f4d565b815250816040018190525060408051908101604052806105748460c0612f4d565b81526020016105848460e0612f4d565b815250816060018190525060408051908101604052806105a684610100612f4d565b81526020016105b784610120612f4d565b815250816080018190525060408051908101604052806105d984610140612f4d565b81526020016105ea84610160612f4d565b8152508160a00181905250604080519081016040528061060c84610180612f4d565b815260200161061d846101a0612f4d565b8152508160c00181905250604080519081016040528061063f846101c0612f4d565b8152602001610650846101e0612f4d565b8152508160e00181905250600061024061086084510381151561066f57fe5b049050806040519080825280602002602001820160405280156106ac57816020015b61069961423f565b8152602001906001900390816106915790505b50826101000181905250806040519080825280602002602001820160405280156106f057816020015b6106dd61423f565b8152602001906001900390816106d55790505b508261012001819052508060405190808252806020026020018201604052801561073457816020015b61072161423f565b8152602001906001900390816107195790505b508261014001819052508060405190808252806020026020018201604052801561077857816020015b61076561423f565b81526020019060019003908161075d5790505b50826101600181905250806040519080825280602002602001820160405280156107bc57816020015b6107a961423f565b8152602001906001900390816107a15790505b508261018001819052508060405190808252806020026020018201604052801561080057816020015b6107ed61423f565b8152602001906001900390816107e55790505b50826101a001819052508060405190808252806020026020018201604052801561084457816020015b61083161423f565b8152602001906001900390816108295790505b50826101c001819052508060405190808252806020026020018201604052801561088857816020015b61087561423f565b81526020019060019003908161086d5790505b50826101e00181905250806002026040519080825280602002602001820160405280156108c45781602001602082028038833980820191505090505b5082610200018190525060008090505b81811015610c4b5760408051908101604052806108f8866040850261020001612f4d565b815260200161090e866040850261022001612f4d565b8152508361010001518281518110151561092457fe5b90602001906020020181905250604080519081016040528061094f8660408587010261020001612f4d565b81526020016109678660408587010261022001612f4d565b8152508361012001518281518110151561097d57fe5b9060200190602002018190525060408051908101604052806109ab8660408502608087026102000101612f4d565b81526020016109c68660408502608087026102200101612f4d565b815250836101400151828151811015156109dc57fe5b906020019060200201819052506040805190810160405280610a0a866040850260c087026102000101612f4d565b8152602001610a25866040850260c087026102200101612f4d565b81525083610160015182815181101515610a3b57fe5b906020019060200201819052506040805190810160405280610a6a866040850261010087026102000101612f4d565b8152602001610a86866040850261010087026102200101612f4d565b81525083610180015182815181101515610a9c57fe5b906020019060200201819052506040805190810160405280610acb866040850261014087026102000101612f4d565b8152602001610ae7866040850261014087026102200101612f4d565b815250836101a0015182815181101515610afd57fe5b906020019060200201819052506040805190810160405280610b2c866040850261018087026102000101612f4d565b8152602001610b48866040850261018087026102200101612f4d565b815250836101c0015182815181101515610b5e57fe5b906020019060200201819052506040805190810160405280610b8d86604085026101c087026102000101612f4d565b8152602001610ba986604085026101c087026102200101612f4d565b815250836101e0015182815181101515610bbf57fe5b90602001906020020181905250610be3846020830261020085026102000101612f4d565b83610200015182815181101515610bf657fe5b9060200190602002018181525050610c1b846020830261022085026102000101612f4d565b836102000151838301815181101515610c3057fe5b906020019060200201818152505080806001019150506108d4565b50600061024082029050610c63848261020001612f4d565b83610220018181525050610c7b848261022001612f4d565b83610240018181525050610c93848261024001612f4d565b836102600181815250506040805190810160405280610cb6868461026001612f4d565b8152602001610cc9868461028001612f4d565b8152508361028001819052506040805190810160405280610cee86846102a001612f4d565b8152602001610d0186846102c001612f4d565b815250836102a001819052506040805190810160405280610d2686846102e001612f4d565b8152602001610d39868461030001612f4d565b815250836102c001819052506040805190810160405280610d5e868461032001612f4d565b8152602001610d71868461034001612f4d565b815250836102e0018190525060408051908101604052806040805190810160405280610da1888661036001612f4d565b8152602001610db4888661038001612f4d565b81525081526020016040805190810160405280610dd588866103a001612f4d565b8152602001610de888866103c001612f4d565b815250815250836103000181905250610e0584826103e001612f4d565b83610320018181525050610e1d848261040001612f4d565b83610340018181525050610e35848261042001612f4d565b83610360018181525050610e4d848261044001612f4d565b83610380018181525050610e65848261046001612f4d565b836103a0018181525050610e7d848261048001612f4d565b836103c0018181525050610e9584826104a001612f4d565b836103e0018181525050610ead84826104c001612f4d565b83610400018181525050610ec584826104e001612f4d565b83610420018181525050610edd848261050001612f4d565b83610440018181525050610eef6143b7565b60008090505b6006811015610fb7576040805190810160405280610f1c8860408502876105200101612f4d565b8152602001610f348860408502876105400101612f4d565b815250826000015182600681101515610f4957fe5b60200201819052506040805190810160405280610f728860408560060102876105200101612f4d565b8152602001610f8d8860408560060102876105400101612f4d565b815250826020015182600681101515610fa257fe5b60200201819052508080600101915050610ef5565b50610fcc856080600602846105200101612f4d565b816040018181525050610fe9856080600602846105400101612f4d565b81606001818152505080846104600181905250839350505050919050565b60008061105f846000015185602001518660400151876060015188608001518960a0015160405160200161104096959493929190614e7e565b6040516020818303038152906040528051906020012060019004612f66565b90506110696143ed565b6110cc82856000015186602001518760400151886060015189608001518a60a001518b60c001518c60e001516040516020016110ad9998979695949392919061516a565b6040516020818303038152906040528051906020012060019004612f66565b81604001818152505061114481604001518561010001518661012001518761014001518861016001518961018001518a6101a001518b6101c001518c6101e001516040516020016111259998979695949392919061501a565b6040516020818303038152906040528051906020012060019004612f66565b81606001818152505060028461020001515181151561115f57fe5b04816000018181525050806000015160020a81602001818152505080600001516002026040519080825280602002602001820160405280156111bb57816020015b6111a861449c565b8152602001906001900390816111a05790505b508160c0018190525060008090505b816000015160020281101561129c57846102000151818151811015156111ec57fe5b906020019060200201518260c001518281518110151561120857fe5b90602001906020020151600160028110151561122057fe5b60200201818152505061125c8561020001518281518110151561123f57fe5b906020019060200201518360600151612f9b90919063ffffffff16565b8260c001518281518110151561126e57fe5b90602001906020020151600060028110151561128657fe5b60200201818152505080806001019150506111ca565b5060008090505b81600001516002028110156113495761133382610100015161132e6000848154811015156112cd57fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250508560c001518581518110151561130c57fe5b90602001906020020151600160028110151561132457fe5b6020020151612fdb565b613016565b82610100018190525080806001019150506112a3565b506113ae61136c61136286606001518460600151612fdb565b8660400151613016565b6113a98361010001516113a4600460408051908101604052908160008201548152602001600182015481525050896102200151612fdb565b613016565b61305c565b15156113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e690614f96565b60405180910390fd5b604080519081016040528060008152602001600081525081610100018190525060008090505b8160000151600202811015611511576114fb8261010001516114f660008481548110151561143f57fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250506114f16114b48760c001518781518110151561148457fe5b90602001906020020151600160028110151561149c57fe5b60200201518860600151612f9b90919063ffffffff16565b8760c00151878151811015156114c657fe5b9060200190602002015160016002811015156114de57fe5b602002015161308490919063ffffffff16565b612fdb565b613016565b8261010001819052508080600101915050611415565b5061157661153461152a86608001518460600151612fdb565b8660a00151613016565b61157183610100015161156c600460408051908101604052908160008201548152602001600182015481525050896102400151612fdb565b613016565b61305c565b15156115b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ae90614f76565b60405180910390fd5b6117306116726000808154811015156115cc57fe5b90600052602060002090600202016040805190810160405290816000820154815260200160018201548152505061166d8460c00151856000015181518110151561161257fe5b90602001906020020151600160028110151561162a57fe5b60200201518560c00151600081518110151561164257fe5b90602001906020020151600160028110151561165a57fe5b602002015161308490919063ffffffff16565b612fdb565b61172b6000600181548110151561168557fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250506117268560c0015186600001518151811015156116cb57fe5b9060200190602002015160006002811015156116e357fe5b60200201518660c0015160008151811015156116fb57fe5b90602001906020020151600060028110151561171357fe5b602002015161308490919063ffffffff16565b612fdb565b613016565b81610100018190525061179d61175b6117518660e001518460600151612fdb565b8660c00151613016565b611798836101000151611793600460408051908101604052908160008201548152602001600182015481525050896102600151612fdb565b613016565b61305c565b15156117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d590614f56565b60405180910390fd5b6117eb8160c001516130bb565b8160e001819052506118058160e0015186604001516131b3565b8161016001819052506118208160e0015186608001516131b3565b81610180018190525060008090505b816020015181101561191c5761189c82610120015161189788600001518481518110151561185957fe5b906020019060200201518560e001518581518110151561187557fe5b90602001906020020151600060028110151561188d57fe5b6020020151612fdb565b613016565b8261012001819052506119068261014001516119018860200151848151811015156118c357fe5b906020019060200201518560e00151858151811015156118df57fe5b9060200190602002015160006002811015156118f757fe5b6020020151612fdb565b613016565b826101400181905250808060010191505061182f565b50600181608001818152505060008090505b8160200151811015611a4b5761199c826101a0015161199784610160015160028581151561195857fe5b0481518110151561196557fe5b9060200190602002015160028581151561197b57fe5b0660028110151561198857fe5b60200201518560800151612fdb565b613016565b826101a00181905250611a07826101c00151611a028461018001516002858115156119c357fe5b048151811015156119d057fe5b906020019060200201516002858115156119e657fe5b066002811015156119f357fe5b60200201518560800151612fdb565b613016565b826101c001819052506000811115611a3e57611a348260400151836080015161308490919063ffffffff16565b8260800181815250505b808060010191505061192e565b5060018160a001818152505060008090505b8160000151811015611d8e57611aa9826101200151611aa487610100015184815181101515611a8857fe5b90602001906020020151611a9f8660a00151613469565b612fdb565b613016565b826101200181905250611af2826101400151611aed87610120015184815181101515611ad157fe5b90602001906020020151611ae88660a00151613469565b612fdb565b613016565b826101400181905250611b668261016001516000815181101515611b1257fe5b906020019060200201516000600281101515611b2a57fe5b6020020151611b6187610140015184815181101515611b4557fe5b90602001906020020151611b5c8660a00151613469565b612fdb565b613016565b8261016001516000815181101515611b7a57fe5b906020019060200201516000600281101515611b9257fe5b6020020181905250611bda826102000151611bd587610160015184815181101515611bb957fe5b90602001906020020151611bd08660a00151613469565b612fdb565b613016565b826102000181905250611c4e8261018001516000815181101515611bfa57fe5b906020019060200201516000600281101515611c1257fe5b6020020151611c4987610180015184815181101515611c2d57fe5b90602001906020020151611c448660a00151613469565b612fdb565b613016565b8261018001516000815181101515611c6257fe5b906020019060200201516000600281101515611c7a57fe5b6020020181905250611cc2826101e00151611cbd876101a0015184815181101515611ca157fe5b90602001906020020151611cb88660a00151613469565b612fdb565b613016565b826101e00181905250611d0b826101a00151611d06876101c0015184815181101515611cea57fe5b90602001906020020151611d018660a00151613469565b612fdb565b613016565b826101a00181905250611d54826101c00151611d4f876101e0015184815181101515611d3357fe5b90602001906020020151611d4a8660a00151613469565b612fdb565b613016565b826101c00181905250611d7882606001518360a0015161308490919063ffffffff16565b8260a00181815250508080600101915050611a5d565b50611daf816102000151611daa87606001518460a00151612fdb565b613016565b816102000181905250611df4816101e00151611def6002604080519081016040529081600082015481526020016001820154815250508460a00151612fdb565b613016565b816101e00181905250611e056144be565b611e588260600151866102800151876102a00151886102c00151896102e00151604051602001611e39959493929190615116565b6040516020818303038152906040528051906020012060019004612f66565b816000018181525050611e6e8160000151613495565b8160200181905250611ead8160000151604051602001611e8e9190614fd6565b6040516020818303038152906040528051906020012060019004612f66565b8160400181815250506040805190810160405280611ed96002846040015161353290919063ffffffff16565b8152602001611ef66003846040015161353290919063ffffffff16565b8152508160600181905250611f588160400151611f4a83606001516001600281101515611f1f57fe5b602002015184606001516000600281101515611f3757fe5b602002015161359f90919063ffffffff16565b61308490919063ffffffff16565b8160a0018181525050611ffb611fa18260a00151611f9360026040811515611f7c57fe5b0460020a8560a0015161308490919063ffffffff16565b612f9b90919063ffffffff16565b611fed611fd284606001516000600281101515611fba57fe5b60200201518560400151612f9b90919063ffffffff16565b611fdf85602001516135d6565b61308490919063ffffffff16565b612f9b90919063ffffffff16565b81610100018181525050612022816101000151866103200151612f9b90919063ffffffff16565b8160e001818152505060008090505b6002604081151561203e57fe5b048110156120f2576120738160020a8360600151600060028110151561206057fe5b602002015161308490919063ffffffff16565b82608001518260408110151561208557fe5b6020020181815250506120bb8160020a836060015160016002811015156120a857fe5b602002015161308490919063ffffffff16565b8260800151600260408115156120cd57fe5b0483016040811015156120dc57fe5b6020020181815250508080600101915050612031565b506121318160400151866103000151604051602001612112929190614ff1565b6040516020818303038152906040528051906020012060019004612f66565b8160c00181815250506121a4612163866103000151600060028110151561215457fe5b60200201518360c00151612fdb565b61219f876103000151600160028110151561217a57fe5b602002015161219a8560c001518660c0015161308490919063ffffffff16565b612fdb565b613016565b8161012001819052506121b561452a565b6122186121cc846101e00151886103a00151612fdb565b61221385610180015160008151811015156121e357fe5b9060200190602002015160006002811015156121fb57fe5b602002015161220e8a6103800151613469565b612fdb565b613016565b8160200181905250612272612252600260408051908101604052908160008201548152602001600182015481525050886103c00151612fdb565b61226d89606001516122688a6103800151613469565b612fdb565b613016565b81604001819052506122bd6040805190810160405280600681526020017f5a657468657200000000000000000000000000000000000000000000000000008152508860a00151613621565b81606001819052506122fb6122db8260600151886103a00151612fdb565b6122f68960c001516122f18a6103800151613469565b612fdb565b613016565b816080018190525061233b61231a846101c00151886103c00151612fdb565b612336856101a001516123318a6103800151613469565b612fdb565b613016565b8160c0018190525061245e6123e56123c861236e6123638761020001518b6102a00151613016565b8a6103a00151612fdb565b6123c36123b0886101600151600081518110151561238857fe5b9060200190602002015160006002811015156123a057fe5b60200201518c6102800151613016565b6123be8c6103800151613469565b612fdb565b613016565b846060015160006002811015156123db57fe5b6020020151612fdb565b61245961243c61240d6124028861014001518c6102e00151613016565b8b6103a00151612fdb565b6124376124248961012001518d6102c00151613016565b6124328d6103800151613469565b612fdb565b613016565b8560600151600160028110151561244f57fe5b6020020151612fdb565b613016565b8160e001819052506125126125086124e76124d46124a06002604080519081016040529081600082015481526020016001820154815250508760e00151612fdb565b6124cf6004604080519081016040529081600082015481526020016001820154815250508c6103400151612fdb565b613016565b6124e2866101200151613691565b613016565b6125038660a001518a610380015161308490919063ffffffff16565b612fdb565b8260e00151613016565b8161010001819052506125b561254d600260408051908101604052908160008201548152602001600182015481525050886103e00151612fdb565b6125b06125648661020001518a6103a00151612fdb565b6125ab876101600151600081518110151561257b57fe5b90602001906020020151600060028110151561259357fe5b60200201516125a68c6103800151613469565b612fdb565b613016565b613016565b81610120018190525061262d6125f0600260408051908101604052908160008201548152602001600182015481525050886104000151612fdb565b6126286126078661014001518a6103a00151612fdb565b61262387610120015161261e8c6103800151613469565b612fdb565b613016565b613016565b8161014001819052506126a5612668600460408051908101604052908160008201548152602001600182015481525050886104200151612fdb565b6126a061267f896102a001518a6103a00151612fdb565b61269b8a61028001516126968c6103800151613469565b612fdb565b613016565b613016565b81610160018190525061271d6126e0600460408051908101604052908160008201548152602001600182015481525050886104400151612fdb565b6127186126f7896102e001518a6103a00151612fdb565b6127138a6102c0015161270e8c6103800151613469565b612fdb565b613016565b613016565b8161018001819052506127988260c001518260200151836040015184608001518560c001518661010001518761012001518861014001518961016001518a61018001516040516020016127799a999897969594939291906151fa565b6040516020818303038152906040528051906020012060019004612f66565b81600001818152505085610380015181600001511415156127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e590614f36565b60405180910390fd5b6127f66145db565b61282d826000015160405160200161280e9190614fd6565b6040516020818303038152906040528051906020012060019004612f66565b8160800181815250506128646002604080519081016040529081600082015481526020016001820154815250508260800151612fdb565b81600001819052506128e56001805480602002602001604051908101604052809291908181526020016000905b828210156128d757838290600052602060002090600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190612891565b50505050846020015161370a565b816020018190525061290c61290284602001518560400151613786565b84608001516137ed565b81604001819052506129de6129c761293989600001516129348b602001518860c00151612fdb565b613016565b6129c26129b06000805480602002602001604051908101604052809291908181526020016000905b828210156129a757838290600052602060002090600202016040805190810160405290816000820154815260200160018201548152505081526020019060010190612961565b50505050613866565b6129bd8860400151613469565b612fdb565b613016565b6129d9836020015184604001516138b3565b613016565b8160600181905250612a2a8160600151612a25600460408051908101604052908160008201548152602001600182015481525050612a208b6103600151613469565b612fdb565b613016565b8160600181905250612a528160600151612a4d83600001518a6103200151612fdb565b613016565b8160600181905250612a626143b7565b876104600151905060008090505b6006811015612baf57612ae08360800151836000015183600681101515612a9357fe5b6020020151846020015184600681101515612aaa57fe5b6020020151604051602001612ac1939291906150df565b6040516020818303038152906040528051906020012060019004612f66565b83608001818152505082608001518360a0015182600681101515612b0057fe5b6020020181815250506000612b188460800151613917565b9050612b998460600151612b94612b5c866000015186600681101515612b3a57fe5b6020020151612b5760028a6080015161353290919063ffffffff16565b612fdb565b612b8f876020015187600681101515612b7157fe5b6020020151612b8a60028861353290919063ffffffff16565b612fdb565b613016565b613016565b8460600181905250508080600101915050612a70565b5060018260c001516000604081101515612bc557fe5b60200201818152505060008090505b6006811015612c4657612c1d8360a0015182600681101515612bf257fe5b60200201518460c001516000604081101515612c0a57fe5b602002015161308490919063ffffffff16565b8360c001516000604081101515612c3057fe5b6020020181815250508080600101915050612bd4565b50612c4f61463e565b612c6f8360c001516000604081101515612c6557fe5b6020020151613917565b8360c001516000604081101515612c8257fe5b60200201818152505060008090505b60026040811515612c9e57fe5b04811015612db15760008090505b6040828260019060020a02011015612da55760008160019060020a02830190508381604081101515612cda57fe5b60200201511515612d99576000612d328760a0015184600160060303600681101515612d0257fe5b60200201518860a0015185600160060303600681101515612d1f57fe5b602002015161308490919063ffffffff16565b9050612d5d818860c0015186604081101515612d4a57fe5b602002015161308490919063ffffffff16565b8760c0015183604081101515612d6f57fe5b60200201818152505060018583604081101515612d8857fe5b602002019015159081151581525050505b50806001019050612cac565b50806001019050612c91565b50612dba614662565b612dc2614662565b60008090505b6040811015612e8b57612e3583612e30600084815481101515612de757fe5b9060005260206000209060020201604080519081016040529081600082015481526020016001820154815250508960c0015185604081101515612e2657fe5b6020020151612fdb565b613016565b9250612e7c82612e77886020015184604081101515612e5057fe5b60200201518960c0015185600160400303604081101515612e6d57fe5b6020020151612fdb565b613016565b91508080600101915050612dc8565b50612e94614662565b612ee8612ebb612ea8858860400151612fdb565b612eb6858960600151612fdb565b613016565b612ee38860000151612ede89606001518a6040015161308490919063ffffffff16565b612fdb565b613016565b9050612ef886606001518261305c565b1515612f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3090614fb6565b60405180910390fd5b60019a505050505050505050505092915050565b6000604051826020850101518152805191505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182811515612f9357fe5b069050919050565b600081831015612fcf5782827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010301612fd3565b8183035b905092915050565b612fe3614662565b604051835181526020840151602082015282604082015260408260608360075afa151561300f57600080fd5b5092915050565b61301e614662565b6040518351815260208401516020820152825160408201526020830151606082015260408260808360065afa151561305557600080fd5b5092915050565b60008160000151836000015114801561307c575081602001518360200151145b905092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156130b057fe5b828409905092915050565b60606000600283518115156130cc57fe5b04905060008160020a90508060405190808252806020026020018201604052801561311157816020015b6130fe61449c565b8152602001906001900390816130f65790505b50925060008090505b60028110156131ab57606061313984830285600185010260018961394d565b905060008090505b8381101561319c57818181518110151561315757fe5b90602001906020020151868281518110151561316f57fe5b906020019060200201518460028110151561318657fe5b6020020181815250508080600101915050613141565b5050808060010191505061311a565b505050919050565b606060008351905060006002828115156131c957fe5b0490508060405190808252806020026020018201604052801561320657816020015b6131f361467c565b8152602001906001900390816131eb5790505b5092506060613216856000613b02565b90506060836040519080825280602002602001820160405280156132495781602001602082028038833980820191505090505b50905060008090505b600281101561345e5760008090505b858110156132c957888682880381151561327757fe5b0681518110151561328457fe5b906020019060200201518260028110151561329b57fe5b602002015183828151811015156132ae57fe5b90602001906020020181815250508080600101915050613261565b506132d382613d63565b915060608460405190808252806020026020018201604052801561331157816020015b6132fe61423f565b8152602001906001900390816132f65790505b50905060006002905061332381613917565b905060008090505b868110156133e0576133b86133b2613371888481518110151561334a57fe5b90602001906020020151888581518110151561336257fe5b90602001906020020151612fdb565b6133ad898b860181518110151561338457fe5b90602001906020020151898c870181518110151561339e57fe5b90602001906020020151612fdb565b613016565b83612fdb565b83828151811015156133c657fe5b90602001906020020181905250808060010191505061332b565b506133ec826001613b02565b915060008090505b8681101561344e57828181518110151561340a57fe5b90602001906020020151898281518110151561342257fe5b906020019060200201518560028110151561343957fe5b602002018190525080806001019150506133f4565b5050508080600101915050613252565b505050505092915050565b6000817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001039050919050565b61349d6146aa565b60018160006040811015156134ae57fe5b602002018181525050818160016040811015156134c757fe5b6020020181815250506000600290505b604081101561352c576135088383600184036040811015156134f557fe5b602002015161308490919063ffffffff16565b828260408110151561351657fe5b60200201818152505080806001019150506134d7565b50919050565b6000807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa151561359357600080fd5b80519250505092915050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018015156135cb57fe5b828408905092915050565b600080600090505b604081101561361b5761360c83826040811015156135f857fe5b60200201518361359f90919063ffffffff16565b915080806001019150506135de565b50919050565b613629614662565b6136897f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478484604051602001613660929190614e56565b604051602081830303815290604052805190602001206001900481151561368357fe5b06613f8b565b905092915050565b613699614662565b6040805190810160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001518115156136dd57fe5b067f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47038152509050919050565b6137126146ce565b60008090505b604081101561377f5761375c848281518110151561373257fe5b90602001906020020151613757858460408110151561374d57fe5b6020020151613917565b612fdb565b828260408110151561376a57fe5b60200201819052508080600101915050613718565b5092915050565b61378e6146aa565b60008090505b60408110156137e6576137c28385836040811015156137af57fe5b602002015161308490919063ffffffff16565b82826040811015156137d057fe5b6020020181815250508080600101915050613794565b5092915050565b6137f56146aa565b60008090505b604081101561385f5761383b838260408110151561381557fe5b6020020151858360408110151561382857fe5b602002015161359f90919063ffffffff16565b828260408110151561384957fe5b60200201818152505080806001019150506137fb565b5092915050565b61386e614662565b60008090505b60408110156138ad5761389e82848381518110151561388f57fe5b90602001906020020151613016565b91508080600101915050613874565b50919050565b6138bb614662565b60008090505b604081101561391057613901826138fc86846040811015156138df57fe5b602002015186856040811015156138f257fe5b6020020151612fdb565b613016565b915080806001019150506138c1565b5092915050565b60006139468260027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103613532565b9050919050565b6060600085850360020a9050806040519080825280602002602001820160405280156139885781602001602082028038833980820191505090505b509150858514156139ba57838260008151811015156139a357fe5b906020019060200201818152505081915050613afa565b6001850394506060613a0a8787613a04878a8151811015156139d857fe5b9060200190602002015160006002811015156139f057fe5b60200201518961308490919063ffffffff16565b8761394d565b90506060613a568888613a50888b815181101515613a2457fe5b906020019060200201516001600281101515613a3c57fe5b60200201518a61308490919063ffffffff16565b8861394d565b905060008090505b600284811515613a6a57fe5b04811015613af5578281815181101515613a8057fe5b906020019060200201518582815181101515613a9857fe5b90602001906020020181815250508181815181101515613ab457fe5b9060200190602002015185600286811515613acb57fe5b048301815181101515613ada57fe5b90602001906020020181815250508080600101915050613a5e565b505050505b949350505050565b60606000835190506001811415613b1c5783915050613d5d565b6000600282811515613b2a57fe5b06141515613b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6490614f16565b60405180910390fd5b6000613bb1826310000000811515613b8157fe5b047f14a3074b02521e3b1ed9852e5028452693e87be4e910500c7ba9bbddb2f46edd61353290919063ffffffff16565b90506000600190508415613bcf57613bc882613917565b9150600290505b613bd881613917565b90506060613bf0613bea88600061402b565b87613b02565b90506060613c08613c0289600161402b565b88613b02565b905060006001905085604051908082528060200260200182016040528015613c4a57816020015b613c3761423f565b815260200190600190039081613c2f5790505b50965060008090505b600287811515613c5f57fe5b04811015613d5557613c6f614662565b613c908483815181101515613c8057fe5b9060200190602002015184612fdb565b9050613cbc613cb68684815181101515613ca657fe5b9060200190602002015183613016565b87612fdb565b8983815181101515613cca57fe5b90602001906020020181905250613d09613d038684815181101515613ceb57fe5b90602001906020020151613cfe84613691565b613016565b87612fdb565b8960028a811515613d1657fe5b048401815181101515613d2557fe5b90602001906020020181905250613d45878461308490919063ffffffff16565b9250508080600101915050613c53565b505050505050505b92915050565b60606000825190506001811415613d7d5782915050613f86565b6000600282811515613d8b57fe5b06141515613dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc590614f16565b60405180910390fd5b6000613e12826310000000811515613de257fe5b047f14a3074b02521e3b1ed9852e5028452693e87be4e910500c7ba9bbddb2f46edd61353290919063ffffffff16565b90506060613e29613e248660006140de565b613d63565b90506060613e40613e3b8760016140de565b613d63565b905060006001905084604051908082528060200260200182016040528015613e775781602001602082028038833980820191505090505b50955060008090505b600286811515613e8c57fe5b04811015613f7f576000613ec0838584815181101515613ea857fe5b9060200190602002015161308490919063ffffffff16565b9050613eec818684815181101515613ed457fe5b9060200190602002015161359f90919063ffffffff16565b8883815181101515613efa57fe5b9060200190602002018181525050613f32818684815181101515613f1a57fe5b90602001906020020151612f9b90919063ffffffff16565b88600289811515613f3f57fe5b048401815181101515613f4e57fe5b9060200190602002018181525050613f6f868461308490919063ffffffff16565b9250508080600101915050613e80565b5050505050505b919050565b613f93614662565b60005b60011561400e5760006003613fac856003614187565b019050613fe881600460017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4701811515613fe257fe5b04614187565b915080613ff6836002614187565b1415614002575061400e565b60018401935050613f96565b604080519081016040528084815260200182815250915050919050565b60606002835181151561403a57fe5b0460405190808252806020026020018201604052801561407457816020015b61406161423f565b8152602001906001900390816140595790505b50905060008090505b6002845181151561408a57fe5b048110156140d757838382600202018151811015156140a557fe5b9060200190602002015182828151811015156140bd57fe5b90602001906020020181905250808060010191505061407d565b5092915050565b6060600283518115156140ed57fe5b0460405190808252806020026020018201604052801561411c5781602001602082028038833980820191505090505b50905060008090505b6002845181151561413257fe5b04811015614180578383826002020181518110151561414d57fe5b90602001906020020151828281518110151561416557fe5b90602001906020020181815250508080600101915050614125565b5092915050565b6000807f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47905060405160208152602080820152602060408201528460608201528360808201528160a082015260208160c08360055afa15156141e857600080fd5b80519250505092915050565b6101206040519081016040528060608152602001606081526020016060815260200161421e61423f565b8152602001606081526020016000815260200161423961423f565b81525090565b604080519081016040528060008152602001600081525090565b6109806040519081016040528061426e61423f565b815260200161427b61423f565b815260200161428861423f565b815260200161429561423f565b81526020016142a261423f565b81526020016142af61423f565b81526020016142bc61423f565b81526020016142c961423f565b815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000815260200161432a61423f565b815260200161433761423f565b815260200161434461423f565b815260200161435161423f565b815260200161435e61467c565b8152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016143b16146fd565b81525090565b610340604051908101604052806143cc614733565b81526020016143d9614733565b815260200160008152602001600081525090565b61030060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200161443a61423f565b815260200161444761423f565b815260200161445461423f565b8152602001606081526020016060815260200161446f61423f565b815260200161447c61423f565b815260200161448961423f565b815260200161449661423f565b81525090565b6040805190810160405280600290602082028038833980820191505090505090565b61114060405190810160405280600081526020016144da614762565b8152602001600081526020016144ee61449c565b81526020016144fb614762565b81526020016000815260200160008152602001600081526020016000815260200161452461423f565b81525090565b610320604051908101604052806000815260200161454661423f565b815260200161455361423f565b815260200161456061423f565b815260200161456d61423f565b815260200161457a61423f565b815260200161458761423f565b815260200161459461423f565b81526020016145a161423f565b81526020016145ae61423f565b81526020016145bb61423f565b81526020016145c861423f565b81526020016145d561423f565b81525090565b612160604051908101604052806145f061423f565b81526020016145fd614786565b815260200161460a614762565b815260200161461761423f565b81526020016000815260200161462b6147b5565b8152602001614638614762565b81525090565b61080060405190810160405280604090602082028038833980820191505090505090565b604080519081016040528060008152602001600081525090565b6080604051908101604052806002905b61469461423f565b81526020019060019003908161468c5790505090565b61080060405190810160405280604090602082028038833980820191505090505090565b611000604051908101604052806040905b6146e761423f565b8152602001906001900390816146df5790505090565b61034060405190810160405280614712614733565b815260200161471f614733565b815260200160008152602001600081525090565b610180604051908101604052806006905b61474c61423f565b8152602001906001900390816147445790505090565b61080060405190810160405280604090602082028038833980820191505090505090565b611000604051908101604052806040905b61479f61423f565b8152602001906001900390816147975790505090565b60c060405190810160405280600690602082028038833980820191505090505090565b600082601f83011215156147eb57600080fd5b81356147fe6147f9826152c6565b615299565b9150818183526020840193506020810190508385604084028201111561482357600080fd5b60005b838110156148535781614839888261485d565b845260208401935060408301925050600181019050614826565b5050505092915050565b600082601f830112151561487057600080fd5b600261488361487e826152ee565b615299565b9150818385602084028201111561489957600080fd5b60005b838110156148c957816148af8882614949565b84526020840193506020830192505060018101905061489c565b5050505092915050565b600082601f83011215156148e657600080fd5b60026148f96148f482615310565b615299565b9150818385602084028201111561490f57600080fd5b60005b8381101561493f57816149258882614949565b845260208401935060208301925050600181019050614912565b5050505092915050565b600061495582356153fe565b905092915050565b600082601f830112151561497057600080fd5b813561498361497e82615332565b615299565b9150808252602083016020830185838301111561499f57600080fd5b6149aa838284615412565b50505092915050565b60006149bf8235615408565b905092915050565b600080600080600080600080610140898b0312156149e457600080fd5b600089013567ffffffffffffffff8111156149fe57600080fd5b614a0a8b828c016147d8565b985050602089013567ffffffffffffffff811115614a2757600080fd5b614a338b828c016147d8565b975050604089013567ffffffffffffffff811115614a5057600080fd5b614a5c8b828c016147d8565b9650506060614a6d8b828c016148d3565b95505060a089013567ffffffffffffffff811115614a8a57600080fd5b614a968b828c016147d8565b94505060c0614aa78b828c016149b3565b93505060e0614ab88b828c016148d3565b92505061012089013567ffffffffffffffff811115614ad657600080fd5b614ae28b828c0161495d565b9150509295985092959890939650565b6000614afe8383614dc3565b60408301905092915050565b614b1381615375565b614b1d81846153b0565b9250614b288261535e565b60005b82811015614b5657614b3e858351614af2565b9450614b4982615396565b9150600181019050614b2b565b5050505050565b6000614b6882615380565b614b7281856153bb565b9350614b7d83615368565b60005b82811015614bab57614b93868351614af2565b9550614b9e826153a3565b9150600181019050614b80565b50849250505092915050565b614bc0816153e8565b82525050565b6000614bd18261538b565b614bdb81856153dd565b9350614beb818560208601615421565b80840191505092915050565b6000614c04601f836153cc565b91507f496e7075742073697a65206973206e6f74206120706f776572206f66203221006000830152602082019050919050565b6000614c44602a836153cc565b91507f5369676d612070726f746f636f6c206368616c6c656e676520657175616c697460008301527f79206661696c7572652e000000000000000000000000000000000000000000006020830152604082019050919050565b6000614caa601d836153cc565b91507f5265636f76657279206661696c75726520666f7220465e77202a20452e0000006000830152602082019050919050565b6000614cea601d836153cc565b91507f5265636f76657279206661696c75726520666f7220435e77202a20442e0000006000830152602082019050919050565b6000614d2a601d836153cc565b91507f5265636f76657279206661696c75726520666f7220425e77202a20412e0000006000830152602082019050919050565b6000614d6a6025836153cc565b91507f496e6e65722070726f6475637420657175616c69747920636865636b2066616960008301527f6c7572652e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b604082016000820151614dd96000850182614e21565b506020820151614dec6020850182614e21565b50505050565b604082016000820151614e086000850182614e21565b506020820151614e1b6020850182614e21565b50505050565b614e2a816153f4565b82525050565b614e39816153f4565b82525050565b614e50614e4b826153f4565b615454565b82525050565b6000614e628285614bc6565b9150614e6e8284614e3f565b6020820191508190509392505050565b600060e0820190508181036000830152614e988189614b5d565b90508181036020830152614eac8188614b5d565b90508181036040830152614ec08187614b5d565b9050614ecf6060830186614df2565b81810360a0830152614ee18185614b5d565b9050614ef060c0830184614e30565b979650505050505050565b6000602082019050614f106000830184614bb7565b92915050565b60006020820190508181036000830152614f2f81614bf7565b9050919050565b60006020820190508181036000830152614f4f81614c37565b9050919050565b60006020820190508181036000830152614f6f81614c9d565b9050919050565b60006020820190508181036000830152614f8f81614cdd565b9050919050565b60006020820190508181036000830152614faf81614d1d565b9050919050565b60006020820190508181036000830152614fcf81614d5d565b9050919050565b6000602082019050614feb6000830184614e30565b92915050565b600060a0820190506150066000830185614e30565b6150136020830184614b0a565b9392505050565b600061012082019050615030600083018c614e30565b8181036020830152615042818b614b5d565b90508181036040830152615056818a614b5d565b9050818103606083015261506a8189614b5d565b9050818103608083015261507e8188614b5d565b905081810360a08301526150928187614b5d565b905081810360c08301526150a68186614b5d565b905081810360e08301526150ba8185614b5d565b90508181036101008301526150cf8184614b5d565b90509a9950505050505050505050565b600060a0820190506150f46000830186614e30565b6151016020830185614df2565b61510e6060830184614df2565b949350505050565b60006101208201905061512c6000830188614e30565b6151396020830187614df2565b6151466060830186614df2565b61515360a0830185614df2565b61516060e0830184614df2565b9695505050505050565b600061022082019050615180600083018c614e30565b61518d602083018b614df2565b61519a606083018a614df2565b6151a760a0830189614df2565b6151b460e0830188614df2565b6151c2610120830187614df2565b6151d0610160830186614df2565b6151de6101a0830185614df2565b6151ec6101e0830184614df2565b9a9950505050505050505050565b600061026082019050615210600083018d614e30565b61521d602083018c614df2565b61522a606083018b614df2565b61523760a083018a614df2565b61524460e0830189614df2565b615252610120830188614df2565b615260610160830187614df2565b61526e6101a0830186614df2565b61527c6101e0830185614df2565b61528a610220830184614df2565b9b9a5050505050505050505050565b6000604051905081810181811067ffffffffffffffff821117156152bc57600080fd5b8060405250919050565b600067ffffffffffffffff8211156152dd57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561530557600080fd5b602082029050919050565b600067ffffffffffffffff82111561532757600080fd5b602082029050919050565b600067ffffffffffffffff82111561534957600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60008115159050919050565b6000819050919050565b6000819050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561543f578082015181840152602081019050615424565b8381111561544e576000848401525b50505050565b600081905091905056fea265627a7a72305820c3f09a7f54eabf5ef0d4984f25fe6de9c1028704e8cbe6f284e9cef4274abf2d6c6578706572696d656e74616cf50037", + "sourceMap": "81:28088:5:-;;;1724:208;8:9:-1;5:2;;;30:1;27;20:12;5:2;1724:208:5;1759:12;;;;;;;;;;;;;;;;;;;:7;;;:12;;;:::i;:::-;1755:1;:16;;;;;;;;;;;;;;;;;;;1785:12;;;;;;;;;;;;;;;;;;;:7;;;:12;;;:::i;:::-;1781:1;:16;;;;;;;;;;;;;;;;;;;1812:9;1824:1;1812:13;;1807:119;162:2;1827:1;:5;1807:119;;;1853:2;1861:15;;;;;;;;;;;;;;;;;;;1874:1;1861:7;;;:15;;;:::i;:::-;1853:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1853:24:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1891:2;1899:15;;;;;;;;;;;;;;;;;;;1912:1;1899:7;;;:15;;;:::i;:::-;1891:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1891:24:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1834:3;;;;;;;1807:119;;;;81:28088;;27813:167;27874:14;;:::i;:::-;27907:66;229:77;27950:5;27933:23;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;27933:23:5;;;27923:34;;;;;;27915:43;;;:57;;;;;;;;27907:7;;;:66;;;:::i;:::-;27900:73;;27813:167;;;:::o;27986:181::-;28058:14;;:::i;:::-;28091:69;229:77;28134:5;28141:1;28117:26;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28117:26:5;;;28107:37;;;;;;28099:46;;;:60;;;;;;;;28091:7;;;:69;;;:::i;:::-;28084:76;;27986:181;;;;:::o;27358:449::-;27412:14;;:::i;:::-;27438:9;27457:311;27464:4;27457:311;;;27484:16;27523:1;27503:17;27512:4;27518:1;27503:8;;;:17;;;:::i;:::-;:21;27484:40;;27610:41;27619:8;27649:1;27644;229:77;27630:15;27629:21;;;;;;;;27610:8;;;:41;;;:::i;:::-;27606:45;;27687:8;27669:14;27678:1;27681;27669:8;;;:14;;;:::i;:::-;:26;27665:70;;;27715:5;;;27665:70;27756:1;27748:9;;;;27457:311;;;;27784:16;;;;;;;;;27792:4;27784:16;;;;27798:1;27784:16;;;27777:23;;;27358:449;;;:::o;26742:610::-;26815:14;26866:13;229:77;26866:27;;26941:4;26935:11;26969:4;26966:1;26959:15;27008:4;27001;26998:1;26994:12;26987:26;27047:4;27040;27037:1;27033:12;27026:26;27086:4;27079;27076:1;27072:12;27065:26;27125:8;27118:4;27115:1;27111:12;27104:30;27168:5;27161:4;27158:1;27154:12;27147:27;27231:4;27228:1;27222:4;27219:1;27213:4;27208:3;27197:39;27190:47;27187:2;;;27289:1;27286;27279:12;27187:2;27334:1;27328:8;27318:18;;26912:434;;;;;;:::o;81:28088::-;;;;;;;;;;;;;;;;;;;;:::o;5:360:-1:-;;135:39;168:5;135:39;;;186:89;268:6;263:3;186:89;;;179:96;;280:52;325:6;320:3;313:4;306:5;302:16;280:52;;;353:6;348:3;344:16;337:23;;115:250;;;;;;372:159;473:52;493:31;518:5;493:31;;;473:52;;;468:3;461:65;455:76;;;538:266;;684:95;775:3;766:6;684:95;;;677:102;;796:3;789:10;;665:139;;;;;811:405;;985:95;1076:3;1067:6;985:95;;;978:102;;1091:75;1162:3;1153:6;1091:75;;;1188:2;1183:3;1179:12;1172:19;;1208:3;1201:10;;966:250;;;;;;1223:92;;1304:5;1298:12;1288:22;;1282:33;;;;1323:145;;1459:3;1444:18;;1437:31;;;;;1476:79;;1545:5;1534:16;;1528:27;;;;1563:268;1628:1;1635:101;1649:6;1646:1;1643:13;1635:101;;;1725:1;1720:3;1716:11;1710:18;1706:1;1701:3;1697:11;1690:39;1671:2;1668:1;1664:10;1659:15;;1635:101;;;1751:6;1748:1;1745:13;1742:2;;;1816:1;1807:6;1802:3;1798:16;1791:27;1742:2;1612:219;;;;;1839:74;;1903:5;1892:16;;1886:27;;;;81:28088:5;;;;;;;", + "deployedSourceMap": "81:28088:5:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81:28088:5;;;;;;;;;;;;;;;;;;;;1938:1109;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2156:4;2172:32;;:::i;:::-;2214:12;2229:1;:8;2214:23;;2278:4;2264:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2248:9;:13;;:35;;;;2323:4;2309:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2293:9;:13;;:35;;;;2366:4;2352:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2338:9;:11;;:33;;;;2409:4;2395:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2381:9;:11;;:33;;;;2429:9;2441:1;2429:13;;2424:354;2448:4;2444:1;:8;2424:354;;;2492:47;;;;;;;;;2508:3;2512:1;2508:6;;;;;;;;;;;;;;;;;;2515:1;2508:9;;;;;;;;;;;;;2500:18;;;2492:47;;;;2528:3;2532:1;2528:6;;;;;;;;;;;;;;;;;;2535:1;2528:9;;;;;;;;;;;;;2520:18;;;2492:47;;;2473:9;:13;;;2487:1;2473:16;;;;;;;;;;;;;;;;;:66;;;;2572:47;;;;;;;;;2588:3;2592:1;2588:6;;;;;;;;;;;;;;;;;;2595:1;2588:9;;;;;;;;;;;;;2580:18;;;2572:47;;;;2608:3;2612:1;2608:6;;;;;;;;;;;;;;;;;;2615:1;2608:9;;;;;;;;;;;;;2600:18;;;2572:47;;;2553:9;:13;;;2567:1;2553:16;;;;;;;;;;;;;;;;;:66;;;;2650:43;;;;;;;;;2666:1;2668;2666:4;;;;;;;;;;;;;;;;;;2671:1;2666:7;;;;;;;;;;;;;2658:16;;;2650:43;;;;2684:1;2686;2684:4;;;;;;;;;;;;;;;;;;2689:1;2684:7;;;;;;;;;;;;;2676:16;;;2650:43;;;2633:9;:11;;;2645:1;2633:14;;;;;;;;;;;;;;;;;:60;;;;2724:43;;;;;;;;;2740:1;2742;2740:4;;;;;;;;;;;;;;;;;;2745:1;2740:7;;;;;;;;;;;;;2732:16;;;2724:43;;;;2758:1;2760;2758:4;;;;;;;;;;;;;;;;;;2763:1;2758:7;;;;;;;;;;;;;2750:16;;;2724:43;;;2707:9;:11;;;2719:1;2707:14;;;;;;;;;;;;;;;;;:60;;;;2454:3;;;;;;;2424:354;;;;2801:37;;;;;;;;;2817:1;2819;2817:4;;;;;;;;;;;;;2809:13;;;2801:37;;;;2832:1;2834;2832:4;;;;;;;;;;;;;2824:13;;;2801:37;;;2787:9;:11;;:51;;;;2866:5;2848:9;:15;;:23;;;;;2895:37;;;;;;;;;2911:1;2913;2911:4;;;;;;;;;;;;;2903:13;;;2895:37;;;;2926:1;2928;2926:4;;;;;;;;;;;;;2918:13;;;2895:37;;;2881:9;:11;;:51;;;;2942:30;;:::i;:::-;2975:18;2987:5;2975:11;:18::i;:::-;2942:51;;3010:30;3017:9;3028:11;3010:6;:30::i;:::-;3003:37;;;;;1938:1109;;;;;;;;;;:::o;20007:3712::-;20069:24;;:::i;:::-;20116:38;;;;;;;;;20124:13;20130:3;20135:1;20124:5;:13::i;:::-;20116:38;;;;20139:14;20145:3;20150:2;20139:5;:14::i;:::-;20116:38;;;20105:5;:8;;:49;;;;20175:39;;;;;;;;;20183:14;20189:3;20194:2;20183:5;:14::i;:::-;20175:39;;;;20199:14;20205:3;20210:2;20199:5;:14::i;:::-;20175:39;;;20164:5;:8;;:50;;;;20234:41;;;;;;;;;20242:15;20248:3;20253;20242:5;:15::i;:::-;20234:41;;;;20259:15;20265:3;20270;20259:5;:15::i;:::-;20234:41;;;20224:5;:7;;:51;;;;20295:41;;;;;;;;;20303:15;20309:3;20314;20303:5;:15::i;:::-;20295:41;;;;20320:15;20326:3;20331;20320:5;:15::i;:::-;20295:41;;;20285:5;:7;;:51;;;;20356:41;;;;;;;;;20364:15;20370:3;20375;20364:5;:15::i;:::-;20356:41;;;;20381:15;20387:3;20392;20381:5;:15::i;:::-;20356:41;;;20346:5;:7;;:51;;;;20417:41;;;;;;;;;20425:15;20431:3;20436;20425:5;:15::i;:::-;20417:41;;;;20442:15;20448:3;20453;20442:5;:15::i;:::-;20417:41;;;20407:5;:7;;:51;;;;20478:41;;;;;;;;;20486:15;20492:3;20497;20486:5;:15::i;:::-;20478:41;;;;20503:15;20509:3;20514;20503:5;:15::i;:::-;20478:41;;;20468:5;:7;;:51;;;;20539:41;;;;;;;;;20547:15;20553:3;20558;20547:5;:15::i;:::-;20539:41;;;;20564:15;20570:3;20575;20564:5;:15::i;:::-;20539:41;;;20529:5;:7;;:51;;;;20591:9;20625:3;20617:4;20604:3;:10;:17;20603:25;;;;;;;;20591:37;;20665:1;20651:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20638:5;:10;;:29;;;;20704:1;20690:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20677:5;:10;;:29;;;;20743:1;20729:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20716:5;:10;;:29;;;;20780:1;20766:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20755:5;:8;;:27;;;;20819:1;20805:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20792:5;:10;;:29;;;;20856:1;20842:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20831:5;:8;;:27;;;;20895:1;20881:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20868:5;:10;;:29;;;;20934:1;20920:16;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;20907:5;:10;;:29;;;;20974:1;20970;:5;20956:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;20956:20:5;;;;20946:5;:7;;:30;;;;20991:9;21003:1;20991:13;;20986:1009;21010:1;21006;:5;20986:1009;;;21048:59;;;;;;;;;21056:24;21062:3;21077:2;21073:1;:6;21067:3;:12;21056:5;:24::i;:::-;21048:59;;;;21082:24;21088:3;21103:2;21099:1;:6;21093:3;:12;21082:5;:24::i;:::-;21048:59;;;21032:5;:10;;;21043:1;21032:13;;;;;;;;;;;;;;;;;:75;;;;21137:71;;;;;;;;;21145:30;21151:3;21172:2;21167:1;21163;:5;21162:12;21156:3;:18;21145:5;:30::i;:::-;21137:71;;;;21177:30;21183:3;21204:2;21199:1;21195;:5;21194:12;21188:3;:18;21177:5;:30::i;:::-;21137:71;;;21121:5;:10;;;21132:1;21121:13;;;;;;;;;;;;;;;;;:87;;;;21238:79;;;;;;;;;21246:34;21252:3;21277:2;21273:1;:6;21267:3;21263:1;:7;21257:3;:13;:22;21246:5;:34::i;:::-;21238:79;;;;21282:34;21288:3;21313:2;21309:1;:6;21303:3;21299:1;:7;21293:3;:13;:22;21282:5;:34::i;:::-;21238:79;;;21222:5;:10;;;21233:1;21222:13;;;;;;;;;;;;;;;;;:95;;;;21345:79;;;;;;;;;21353:34;21359:3;21384:2;21380:1;:6;21374:3;21370:1;:7;21364:3;:13;:22;21353:5;:34::i;:::-;21345:79;;;;21389:34;21395:3;21420:2;21416:1;:6;21410:3;21406:1;:7;21400:3;:13;:22;21389:5;:34::i;:::-;21345:79;;;21331:5;:8;;;21340:1;21331:11;;;;;;;;;;;;;;;;;:93;;;;21454:79;;;;;;;;;21462:34;21468:3;21493:2;21489:1;:6;21483:3;21479:1;:7;21473:3;:13;:22;21462:5;:34::i;:::-;21454:79;;;;21498:34;21504:3;21529:2;21525:1;:6;21519:3;21515:1;:7;21509:3;:13;:22;21498:5;:34::i;:::-;21454:79;;;21438:5;:10;;;21449:1;21438:13;;;;;;;;;;;;;;;;;:95;;;;21561:79;;;;;;;;;21569:34;21575:3;21600:2;21596:1;:6;21590:3;21586:1;:7;21580:3;:13;:22;21569:5;:34::i;:::-;21561:79;;;;21605:34;21611:3;21636:2;21632:1;:6;21626:3;21622:1;:7;21616:3;:13;:22;21605:5;:34::i;:::-;21561:79;;;21547:5;:8;;;21556:1;21547:11;;;;;;;;;;;;;;;;;:93;;;;21670:79;;;;;;;;;21678:34;21684:3;21709:2;21705:1;:6;21699:3;21695:1;:7;21689:3;:13;:22;21678:5;:34::i;:::-;21670:79;;;;21714:34;21720:3;21745:2;21741:1;:6;21735:3;21731:1;:7;21725:3;:13;:22;21714:5;:34::i;:::-;21670:79;;;21654:5;:10;;;21665:1;21654:13;;;;;;;;;;;;;;;;;:95;;;;21779:79;;;;;;;;;21787:34;21793:3;21818:2;21814:1;:6;21808:3;21804:1;:7;21798:3;:13;:22;21787:5;:34::i;:::-;21779:79;;;;21823:34;21829:3;21854:2;21850:1;:6;21844:3;21840:1;:7;21834:3;:13;:22;21823:5;:34::i;:::-;21779:79;;;21763:5;:10;;;21774:1;21763:13;;;;;;;;;;;;;;;;;:95;;;;21885:34;21891:3;21916:2;21912:1;:6;21906:3;21902:1;:7;21896:3;:13;:22;21885:5;:34::i;:::-;21872:5;:7;;;21880:1;21872:10;;;;;;;;;;;;;;;;;:47;;;;;21950:34;21956:3;21981:2;21977:1;:6;21971:3;21967:1;:7;21961:3;:13;:22;21950:5;:34::i;:::-;21933:5;:7;;;21945:1;21941;:5;21933:14;;;;;;;;;;;;;;;;;:51;;;;;21013:3;;;;;;;20986:1009;;;;22004:16;22027:3;22023:1;:7;22004:26;;22052;22058:3;22069:8;22063:3;:14;22052:5;:26::i;:::-;22040:5;:9;;:38;;;;;22100:26;22106:3;22117:8;22111:3;:14;22100:5;:26::i;:::-;22088:5;:9;;:38;;;;;22148:26;22154:3;22165:8;22159:3;:14;22148:5;:26::i;:::-;22136:5;:9;;:38;;;;;22200:63;;;;;;;;;22208:26;22214:3;22225:8;22219:3;:14;22208:5;:26::i;:::-;22200:63;;;;22236:26;22242:3;22253:8;22247:3;:14;22236:5;:26::i;:::-;22200:63;;;22185:5;:12;;:78;;;;22288:63;;;;;;;;;22296:26;22302:3;22313:8;22307:3;:14;22296:5;:26::i;:::-;22288:63;;;;22324:26;22330:3;22341:8;22335:3;:14;22324:5;:26::i;:::-;22288:63;;;22273:5;:12;;:78;;;;22378:63;;;;;;;;;22386:26;22392:3;22403:8;22397:3;:14;22386:5;:26::i;:::-;22378:63;;;;22414:26;22420:3;22431:8;22425:3;:14;22414:5;:26::i;:::-;22378:63;;;22361:5;:14;;:80;;;;22468:63;;;;;;;;;22476:26;22482:3;22493:8;22487:3;:14;22476:5;:26::i;:::-;22468:63;;;;22504:26;22510:3;22521:8;22515:3;:14;22504:5;:26::i;:::-;22468:63;;;22451:5;:14;;:80;;;;22542:147;;;;;;;;;22560:63;;;;;;;;;22568:26;22574:3;22585:8;22579:3;:14;22568:5;:26::i;:::-;22560:63;;;;22596:26;22602:3;22613:8;22607:3;:14;22596:5;:26::i;:::-;22560:63;;;22542:147;;;;22625:63;;;;;;;;;22633:26;22639:3;22650:8;22644:3;:14;22633:5;:26::i;:::-;22625:63;;;;22661:26;22667:3;22678:8;22672:3;:14;22661:5;:26::i;:::-;22625:63;;;22542:147;;;:5;:14;;:147;;;;22712:26;22718:3;22729:8;22723:3;:14;22712:5;:26::i;:::-;22699:5;:10;;:39;;;;;22761:27;22767:3;22779:8;22772:4;:15;22761:5;:27::i;:::-;22748:5;:10;;:40;;;;;22809:27;22815:3;22827:8;22820:4;:15;22809:5;:27::i;:::-;22798:5;:8;;:38;;;;;22857:27;22863:3;22875:8;22868:4;:15;22857:5;:27::i;:::-;22847:5;:7;;:37;;;;;22907:27;22913:3;22925:8;22918:4;:15;22907:5;:27::i;:::-;22894:5;:10;;:40;;;;;22956:27;22962:3;22974:8;22967:4;:15;22956:5;:27::i;:::-;22944:5;:9;;:39;;;;;23013:27;23019:3;23031:8;23024:4;:15;23013:5;:27::i;:::-;22993:5;:17;;:47;;;;;23066:27;23072:3;23084:8;23077:4;:15;23066:5;:27::i;:::-;23050:5;:13;;:43;;;;;23124:27;23130:3;23142:8;23135:4;:15;23124:5;:27::i;:::-;23103:5;:18;;:48;;;;;23178:27;23184:3;23196:8;23189:4;:15;23178:5;:27::i;:::-;23161:5;:14;;:44;;;;;23216:32;;:::i;:::-;23263:9;23275:1;23263:13;;23258:281;191:1;23278;:5;23258:281;;;23320:83;;;;;;;;;23328:36;23334:3;23361:2;23357:1;:6;23346:8;23339:4;:15;:24;23328:5;:36::i;:::-;23320:83;;;;23366:36;23372:3;23399:2;23395:1;:6;23384:8;23377:4;:15;:24;23366:5;:36::i;:::-;23320:83;;;23304:7;:10;;;23315:1;23304:13;;;;;;;;;;;;:99;;;;23433:95;;;;;;;;;23441:42;23447:3;23480:2;23475:1;191;23471:5;23470:12;23459:8;23452:4;:15;:30;23441:5;:42::i;:::-;23433:95;;;;23485:42;23491:3;23524:2;23519:1;191;23515:5;23514:12;23503:8;23496:4;:15;:30;23485:5;:42::i;:::-;23433:95;;;23417:7;:10;;;23428:1;23417:13;;;;;;;;;;;;:111;;;;23285:3;;;;;;;23258:281;;;;23560:37;23566:3;23593;191:1;23589:7;23578:8;23571:4;:15;:25;23560:5;:37::i;:::-;23548:7;:9;;:49;;;;;23619:37;23625:3;23652;191:1;23648:7;23637:8;23630:4;:15;:25;23619:5;:37::i;:::-;23607:7;:9;;:49;;;;;23682:7;23666:5;:13;;:23;;;;23707:5;23700:12;;;;;20007:3712;;;:::o;4383:10477::-;4482:4;4498:21;4522:122;4551:9;:13;;;4566:9;:13;;;4581:9;:11;;;4594:9;:11;;;4607:9;:11;;;4620:9;:15;;;4540:96;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4540:96:5;;;4530:107;;;;;;4522:116;;;:120;:122::i;:::-;4498:146;;4655:38;;:::i;:::-;4723:125;4752:13;4767:5;:8;;;4777:5;:8;;;4787:5;:7;;;4796:5;:7;;;4805:5;:7;;;4814:5;:7;;;4823:5;:7;;;4832:5;:7;;;4741:99;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4741:99:5;;;4731:110;;;;;;4723:119;;;:123;:125::i;:::-;4703:15;:17;;:145;;;;;4878:147;4907:15;:17;;;4926:5;:10;;;4938:5;:10;;;4950:5;:10;;;4962:5;:8;;;4972:5;:10;;;4984:5;:8;;;4994:5;:10;;;5006:5;:10;;;4896:121;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4896:121:5;;;4886:132;;;;;;4878:141;;;:145;:147::i;:::-;4858:15;:17;;:167;;;;;5072:1;5055:5;:7;;;:14;:18;;;;;;;;5035:15;:17;;:38;;;;;5108:15;:17;;;5103:1;:22;5083:15;:17;;:42;;;;;5176:15;:17;;;5172:1;:21;5155:39;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5135:15;:17;;:59;;;;5209:9;5221:1;5209:13;;5204:186;5232:15;:17;;;5228:1;:21;5224:1;:25;5204:186;;;5296:5;:7;;;5304:1;5296:10;;;;;;;;;;;;;;;;;;5270:15;:17;;;5288:1;5270:20;;;;;;;;;;;;;;;;;;5291:1;5270:23;;;;;;;;;;;;:36;;;;;5346:33;5368:5;:7;;;5376:1;5368:10;;;;;;;;;;;;;;;;;;5346:15;:17;;;:21;;:33;;;;:::i;:::-;5320:15;:17;;;5338:1;5320:20;;;;;;;;;;;;;;;;;;5341:1;5320:23;;;;;;;;;;;;:59;;;;;5251:3;;;;;;;5204:186;;;;5405:9;5417:1;5405:13;;5400:162;5428:15;:17;;;5424:1;:21;5420:1;:25;5400:162;;;5489:62;5493:15;:20;;;5515:35;5519:2;5522:1;5519:5;;;;;;;;;;;;;;;;;;;;5515:35;;;;;;;;;;;;;;;;;;;;;;;;;;5526:15;:17;;;5544:1;5526:20;;;;;;;;;;;;;;;;;;5547:1;5526:23;;;;;;;;;;;;;5515:3;:35::i;:::-;5489:3;:62::i;:::-;5466:15;:20;;:85;;;;5447:3;;;;;;;5400:162;;;;5579:95;5582:45;5586:31;5590:5;:7;;;5599:15;:17;;;5586:3;:31::i;:::-;5619:5;:7;;;5582:3;:45::i;:::-;5629:44;5633:15;:20;;;5655:17;5659:1;5655:17;;;;;;;;;;;;;;;;;;;;;;;;;;5662:5;:9;;;5655:3;:17::i;:::-;5629:3;:44::i;:::-;5579:2;:95::i;:::-;5571:137;;;;;;;;;;;;;;;;;;;;;;;;5742:13;;;;;;;;;5750:1;5742:13;;;;5753:1;5742:13;;;5719:15;:20;;:36;;;;5770:9;5782:1;5770:13;;5765:260;5793:15;:17;;;5789:1;:21;5785:1;:25;5765:260;;;5900:114;5904:15;:20;;;5926:87;5930:2;5933:1;5930:5;;;;;;;;;;;;;;;;;;;;5926:87;;;;;;;;;;;;;;;;;;;;;;;;;;5937:75;5965:46;5987:15;:17;;;6005:1;5987:20;;;;;;;;;;;;;;;;;;6008:1;5987:23;;;;;;;;;;;;;5965:15;:17;;;:21;;:46;;;;:::i;:::-;5937:15;:17;;;5955:1;5937:20;;;;;;;;;;;;;;;;;;5958:1;5937:23;;;;;;;;;;;;;:27;;:75;;;;:::i;:::-;5926:3;:87::i;:::-;5900:3;:114::i;:::-;5877:15;:20;;:137;;;;5812:3;;;;;;;5765:260;;;;6042:95;6045:45;6049:31;6053:5;:7;;;6062:15;:17;;;6049:3;:31::i;:::-;6082:5;:7;;;6045:3;:45::i;:::-;6092:44;6096:15;:20;;;6118:17;6122:1;6118:17;;;;;;;;;;;;;;;;;;;;;;;;;;6125:5;:9;;;6118:3;:17::i;:::-;6092:3;:44::i;:::-;6042:2;:95::i;:::-;6034:137;;;;;;;;;;;;;;;;;;;;;;;;6205:167;6209:80;6213:2;6216:1;6213:5;;;;;;;;;;;;;;;;;;;;6209:80;;;;;;;;;;;;;;;;;;;;;;;;;;6220:68;6248:15;:17;;;6266:15;:17;;;6248:36;;;;;;;;;;;;;;;;;;6285:1;6248:39;;;;;;;;;;;;;6220:15;:17;;;6238:1;6220:20;;;;;;;;;;;;;;;;;;6241:1;6220:23;;;;;;;;;;;;;:27;;:68;;;;:::i;:::-;6209:3;:80::i;:::-;6291;6295:2;6298:1;6295:5;;;;;;;;;;;;;;;;;;;;6291:80;;;;;;;;;;;;;;;;;;;;;;;;;;6302:68;6330:15;:17;;;6348:15;:17;;;6330:36;;;;;;;;;;;;;;;;;;6367:1;6330:39;;;;;;;;;;;;;6302:15;:17;;;6320:1;6302:20;;;;;;;;;;;;;;;;;;6323:1;6302:23;;;;;;;;;;;;;:27;;:68;;;;:::i;:::-;6291:3;:80::i;:::-;6205:3;:167::i;:::-;6182:15;:20;;:190;;;;6390:95;6393:45;6397:31;6401:5;:7;;;6410:15;:17;;;6397:3;:31::i;:::-;6430:5;:7;;;6393:3;:45::i;:::-;6440:44;6444:15;:20;;;6466:17;6470:1;6466:17;;;;;;;;;;;;;;;;;;;;;;;;;;6473:5;:9;;;6466:3;:17::i;:::-;6440:3;:44::i;:::-;6390:2;:95::i;:::-;6382:137;;;;;;;;;;;;;;;;;;;;;;;;6550:38;6570:15;:17;;;6550:19;:38::i;:::-;6530:15;:17;;:58;;;;6620:52;6641:15;:17;;;6660:9;:11;;;6620:20;:52::i;:::-;6599:15;:18;;:73;;;;6703:52;6724:15;:17;;;6743:9;:11;;;6703:20;:52::i;:::-;6682:15;:18;;:73;;;;6770:9;6782:1;6770:13;;6765:279;6789:15;:17;;;6785:1;:21;6765:279;;;6850:73;6854:15;:20;;;6876:46;6880:9;:13;;;6894:1;6880:16;;;;;;;;;;;;;;;;;;6898:15;:17;;;6916:1;6898:20;;;;;;;;;;;;;;;;;;6919:1;6898:23;;;;;;;;;;;;;6876:3;:46::i;:::-;6850:3;:73::i;:::-;6827:15;:20;;:96;;;;6960:73;6964:15;:20;;;6986:46;6990:9;:13;;;7004:1;6990:16;;;;;;;;;;;;;;;;;;7008:15;:17;;;7026:1;7008:20;;;;;;;;;;;;;;;;;;7029:1;7008:23;;;;;;;;;;;;;6986:3;:46::i;:::-;6960:3;:73::i;:::-;6937:15;:20;;:96;;;;6808:3;;;;;;;6765:279;;;;7076:1;7053:15;:20;;:24;;;;;7092:9;7104:1;7092:13;;7087:428;7111:15;:17;;;7107:1;:21;7087:428;;;7172:86;7176:15;:20;;;7198:59;7202:15;:18;;;7225:1;7221;:5;;;;;;;;7202:25;;;;;;;;;;;;;;;;;;7232:1;7228;:5;;;;;;;;7202:32;;;;;;;;;;;;;7236:15;:20;;;7198:3;:59::i;:::-;7172:3;:86::i;:::-;7149:15;:20;;:109;;;;7295:86;7299:15;:20;;;7321:59;7325:15;:18;;;7348:1;7344;:5;;;;;;;;7325:25;;;;;;;;;;;;;;;;;;7355:1;7351;:5;;;;;;;;7325:32;;;;;;;;;;;;;7359:15;:20;;;7321:3;:59::i;:::-;7295:3;:86::i;:::-;7272:15;:20;;:109;;;;7403:1;7399;:5;7395:110;;;7447:43;7472:15;:17;;;7447:15;:20;;;:24;;:43;;;;:::i;:::-;7424:15;:20;;:66;;;;;7395:110;7130:3;;;;;;;7087:428;;;;7547:1;7524:15;:20;;:24;;;;;7563:9;7575:1;7563:13;;7558:1024;7582:15;:17;;;7578:1;:21;7558:1024;;;7643:73;7647:15;:20;;;7669:46;7673:5;:10;;;7684:1;7673:13;;;;;;;;;;;;;;;;;;7688:26;:15;:20;;;:24;:26::i;:::-;7669:3;:46::i;:::-;7643:3;:73::i;:::-;7620:15;:20;;:96;;;;7753:73;7757:15;:20;;;7779:46;7783:5;:10;;;7794:1;7783:13;;;;;;;;;;;;;;;;;;7798:26;:15;:20;;;:24;:26::i;:::-;7779:3;:46::i;:::-;7753:3;:73::i;:::-;7730:15;:20;;:96;;;;7867:77;7871:15;:18;;;7890:1;7871:21;;;;;;;;;;;;;;;;;;7893:1;7871:24;;;;;;;;;;;;;7897:46;7901:5;:10;;;7912:1;7901:13;;;;;;;;;;;;;;;;;;7916:26;:15;:20;;;:24;:26::i;:::-;7897:3;:46::i;:::-;7867:3;:77::i;:::-;7840:15;:18;;;7859:1;7840:21;;;;;;;;;;;;;;;;;;7862:1;7840:24;;;;;;;;;;;;:104;;;;7979:69;7983:15;:18;;;8003:44;8007:5;:8;;;8016:1;8007:11;;;;;;;;;;;;;;;;;;8020:26;:15;:20;;;:24;:26::i;:::-;8003:3;:44::i;:::-;7979:3;:69::i;:::-;7958:15;:18;;:90;;;;8089:77;8093:15;:18;;;8112:1;8093:21;;;;;;;;;;;;;;;;;;8115:1;8093:24;;;;;;;;;;;;;8119:46;8123:5;:10;;;8134:1;8123:13;;;;;;;;;;;;;;;;;;8138:26;:15;:20;;;:24;:26::i;:::-;8119:3;:46::i;:::-;8089:3;:77::i;:::-;8062:15;:18;;;8081:1;8062:21;;;;;;;;;;;;;;;;;;8084:1;8062:24;;;;;;;;;;;;:104;;;;8201:69;8205:15;:18;;;8225:44;8229:5;:8;;;8238:1;8229:11;;;;;;;;;;;;;;;;;;8242:26;:15;:20;;;:24;:26::i;:::-;8225:3;:44::i;:::-;8201:3;:69::i;:::-;8180:15;:18;;:90;;;;8307:73;8311:15;:20;;;8333:46;8337:5;:10;;;8348:1;8337:13;;;;;;;;;;;;;;;;;;8352:26;:15;:20;;;:24;:26::i;:::-;8333:3;:46::i;:::-;8307:3;:73::i;:::-;8284:15;:20;;:96;;;;8417:73;8421:15;:20;;;8443:46;8447:5;:10;;;8458:1;8447:13;;;;;;;;;;;;;;;;;;8462:26;:15;:20;;;:24;:26::i;:::-;8443:3;:46::i;:::-;8417:3;:73::i;:::-;8394:15;:20;;:96;;;;8528:43;8553:15;:17;;;8528:15;:20;;;:24;;:43;;;;:::i;:::-;8505:15;:20;;:66;;;;;7601:3;;;;;;;7558:1024;;;;8612:63;8616:15;:18;;;8636:38;8640:9;:11;;;8653:15;:20;;;8636:3;:38::i;:::-;8612:3;:63::i;:::-;8591:15;:18;;:84;;;;8706:53;8710:15;:18;;;8730:28;8734:1;8730:28;;;;;;;;;;;;;;;;;;;;;;;;;;8737:15;:20;;;8730:3;:28::i;:::-;8706:3;:53::i;:::-;8685:15;:18;;:74;;;;8770:42;;:::i;:::-;8844:115;8873:15;:17;;;8892:5;:12;;;8906:5;:12;;;8920:5;:14;;;8936:5;:14;;;8862:89;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8862:89:5;;;8852:100;;;;;;8844:109;;;:113;:115::i;:::-;8822:17;:19;;:137;;;;;8992:27;8999:17;:19;;;8992:6;:27::i;:::-;8969:17;:20;;:50;;;;9051:57;9080:17;:19;;;9069:31;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9069:31:5;;;9059:42;;;;;;9051:51;;;:55;:57::i;:::-;9029:17;:19;;:79;;;;;9118;;;;;;;;;9142:26;9166:1;9142:17;:19;;;:23;;:26;;;;:::i;:::-;9118:79;;;;9170:26;9194:1;9170:17;:19;;;:23;;:26;;;;:::i;:::-;9118:79;;;:17;:20;;:79;;;;9240:77;9297:17;:19;;;9240:52;9268:17;:20;;;9289:1;9268:23;;;;;;;;;;;;;9240:17;:20;;;9261:1;9240:23;;;;;;;;;;;;;:27;;:52;;;;:::i;:::-;:56;;:77;;;;:::i;:::-;9215:17;:22;;:102;;;;;9349:160;9440:68;9485:17;:22;;;9440:40;9477:1;162:2;9473:5;;;;;;;;9467:1;:12;9440:17;:22;;;:26;;:40;;;;:::i;:::-;:44;;:68;;;;:::i;:::-;9349:86;9386:48;9410:17;:20;;;9431:1;9410:23;;;;;;;;;;;;;9386:17;:19;;;:23;;:48;;;;:::i;:::-;9349:32;9360:17;:20;;;9349:10;:32::i;:::-;:36;;:86;;;;:::i;:::-;:90;;:160;;;;:::i;:::-;9327:17;:19;;:182;;;;;9541:35;9556:17;:19;;;9541:5;:10;;;:14;;:35;;;;:::i;:::-;9519:17;:19;;:57;;;;;9591:9;9603:1;9591:13;;9586:233;9614:1;162:2;9610:5;;;;;;;;9606:1;:9;9586:233;;;9676:35;9709:1;9704;:6;9676:17;:20;;;9697:1;9676:23;;;;;;;;;;;;;:27;;:35;;;;:::i;:::-;9636:17;:34;;;9671:1;9636:37;;;;;;;;;;;;:75;;;;;9773:35;9806:1;9801;:6;9773:17;:20;;;9794:1;9773:23;;;;;;;;;;;;;:27;;:35;;;;:::i;:::-;9725:17;:34;;;9768:1;162:2;9764:5;;;;;;;;9760:1;:9;9725:45;;;;;;;;;;;;:83;;;;;9617:3;;;;;;;9586:233;;;;9851:73;9880:17;:19;;;9901:5;:14;;;9869:47;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9869:47:5;;;9859:58;;;;;;9851:67;;;:71;:73::i;:::-;9829:17;:19;;:95;;;;;9960:118;9964:43;9968:5;:14;;;9983:1;9968:17;;;;;;;;;;;;;9987;:19;;;9964:3;:43::i;:::-;10009:68;10013:5;:14;;;10028:1;10013:17;;;;;;;;;;;;;10032:44;10056:17;:19;;;10032:17;:19;;;:23;;:44;;;;:::i;:::-;10009:3;:68::i;:::-;9960:3;:118::i;:::-;9934:17;:23;;:144;;;;10115:40;;:::i;:::-;10188:86;10192:35;10196:15;:18;;;10216:5;:10;;;10192:3;:35::i;:::-;10229:44;10233:15;:18;;;10252:1;10233:21;;;;;;;;;;;;;;;;;;10255:1;10233:24;;;;;;;;;;;;;10259:13;:5;:7;;;:11;:13::i;:::-;10229:3;:44::i;:::-;10188:3;:86::i;:::-;10165:16;:20;;:109;;;;10307:55;10311:17;10315:1;10311:17;;;;;;;;;;;;;;;;;;;;;;;;;;10318:5;:9;;;10311:3;:17::i;:::-;10330:31;10334:9;:11;;;10347:13;:5;:7;;;:11;:13::i;:::-;10330:3;:31::i;:::-;10307:3;:55::i;:::-;10284:16;:20;;:78;;;;10482:34;;;;;;;;;;;;;;;;;;;10500:9;:15;;;10482:7;:34::i;:::-;10456:16;:23;;:60;;;;10549:78;10553:40;10557:16;:23;;;10582:5;:10;;;10553:3;:40::i;:::-;10595:31;10599:9;:11;;;10612:13;:5;:7;;;:11;:13::i;:::-;10595:3;:31::i;:::-;10549:3;:78::i;:::-;10526:16;:20;;:101;;;;10660:83;10664:36;10668:15;:20;;;10690:5;:9;;;10664:3;:36::i;:::-;10702:40;10706:15;:20;;;10728:13;:5;:7;;;:11;:13::i;:::-;10702:3;:40::i;:::-;10660:3;:83::i;:::-;10637:16;:20;;:106;;;;10781:317;10785:154;10789:124;10793:54;10797:37;10801:15;:18;;;10821:5;:12;;;10797:3;:37::i;:::-;10836:5;:10;;;10793:3;:54::i;:::-;10849:63;10853:43;10857:15;:18;;;10876:1;10857:21;;;;;;;;;;;;;;;;;;10879:1;10857:24;;;;;;;;;;;;;10883:5;:12;;;10853:3;:43::i;:::-;10898:13;:5;:7;;;:11;:13::i;:::-;10849:3;:63::i;:::-;10789:3;:124::i;:::-;10915:17;:20;;;10936:1;10915:23;;;;;;;;;;;;;10785:3;:154::i;:::-;10941:156;10945:126;10949:58;10953:41;10957:15;:20;;;10979:5;:14;;;10953:3;:41::i;:::-;10996:5;:10;;;10949:3;:58::i;:::-;11009:61;11013:41;11017:15;:20;;;11039:5;:14;;;11013:3;:41::i;:::-;11056:13;:5;:7;;;:11;:13::i;:::-;11009:3;:61::i;:::-;10945:3;:126::i;:::-;11073:17;:20;;;11094:1;11073:23;;;;;;;;;;;;;10941:3;:156::i;:::-;10781:3;:317::i;:::-;10753:16;:25;;:345;;;;11131:159;11135:127;11139:87;11143:52;11147:27;11151:1;11147:27;;;;;;;;;;;;;;;;;;;;;;;;;;11154:17;:19;;;11147:3;:27::i;:::-;11176:18;11180:1;11176:18;;;;;;;;;;;;;;;;;;;;;;;;;;11183:5;:10;;;11176:3;:18::i;:::-;11143:3;:52::i;:::-;11197:28;11201:17;:23;;;11197:3;:28::i;:::-;11139:3;:87::i;:::-;11228:33;11240:15;:20;;;11228:5;:7;;;:11;;:33;;;;:::i;:::-;11135:3;:127::i;:::-;11264:16;:25;;;11131:3;:159::i;:::-;11108:16;:20;;:182;;;;11324:118;11328:25;11332:1;11328:25;;;;;;;;;;;;;;;;;;;;;;;;;;11335:5;:17;;;11328:3;:25::i;:::-;11355:86;11359:35;11363:15;:18;;;11383:5;:10;;;11359:3;:35::i;:::-;11396:44;11400:15;:18;;;11419:1;11400:21;;;;;;;;;;;;;;;;;;11422:1;11400:24;;;;;;;;;;;;;11426:13;:5;:7;;;:11;:13::i;:::-;11396:3;:44::i;:::-;11355:3;:86::i;:::-;11324:3;:118::i;:::-;11300:16;:21;;:142;;;;11477:112;11481:21;11485:1;11481:21;;;;;;;;;;;;;;;;;;;;;;;;;;11488:5;:13;;;11481:3;:21::i;:::-;11504:84;11508:37;11512:15;:20;;;11534:5;:10;;;11508:3;:37::i;:::-;11547:40;11551:15;:20;;;11573:13;:5;:7;;;:11;:13::i;:::-;11547:3;:40::i;:::-;11504:3;:84::i;:::-;11477:3;:112::i;:::-;11452:16;:22;;:137;;;;11627:101;11631:26;11635:1;11631:26;;;;;;;;;;;;;;;;;;;;;;;;;;11638:5;:18;;;11631:3;:26::i;:::-;11659:68;11663:29;11667:5;:12;;;11681:5;:10;;;11663:3;:29::i;:::-;11694:32;11698:5;:12;;;11712:13;:5;:7;;;:11;:13::i;:::-;11694:3;:32::i;:::-;11659:3;:68::i;:::-;11627:3;:101::i;:::-;11599:16;:25;;:129;;;;11768:101;11772:22;11776:1;11772:22;;;;;;;;;;;;;;;;;;;;;;;;;;11779:5;:14;;;11772:3;:22::i;:::-;11796:72;11800:31;11804:5;:14;;;11820:5;:10;;;11800:3;:31::i;:::-;11833:34;11837:5;:14;;;11853:13;:5;:7;;;:11;:13::i;:::-;11833:3;:34::i;:::-;11796:3;:72::i;:::-;11768:3;:101::i;:::-;11738:16;:27;;:131;;;;11901:270;11930:17;:19;;;11951:16;:20;;;11973:16;:20;;;11995:16;:20;;;12017:16;:20;;;12039:16;:20;;;12061:16;:21;;;12084:16;:22;;;12108:16;:25;;;12135:16;:27;;;11919:244;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11919:244:5;;;11909:255;;;;;;11901:264;;;:268;:270::i;:::-;11880:16;:18;;:291;;;;;12211:5;:7;;;12189:16;:18;;;:29;12181:84;;;;;;;;;;;;;;;;;;;;;;;;12276:34;;:::i;:::-;12338:56;12367:16;:18;;;12356:30;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12356:30:5;;;12346:41;;;;;;12338:50;;;:54;:56::i;:::-;12320:13;:15;;:74;;;;;12424:23;12428:1;12424:23;;;;;;;;;;;;;;;;;;;;;;;;;;12431:13;:15;;;12424:3;:23::i;:::-;12404:13;:17;;:43;;;;12481:37;12493:2;12481:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12497:17;:20;;;12481:11;:37::i;:::-;12457:13;:21;;:61;;;;12549:96;12560:48;12566:17;:20;;;12588:17;:19;;;12560:5;:48::i;:::-;12610:17;:34;;;12549:10;:96::i;:::-;12528:13;:18;;:117;;;;12673:157;12677:101;12681:49;12685:5;:8;;;12695:34;12699:5;:8;;;12709:17;:19;;;12695:3;:34::i;:::-;12681:3;:49::i;:::-;12732:45;12736:13;12746:2;12736:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:13::i;:::-;12751:25;:17;:19;;;:23;:25::i;:::-;12732:3;:45::i;:::-;12677:3;:101::i;:::-;12780:49;12787:13;:21;;;12810:13;:18;;;12780:6;:49::i;:::-;12673:3;:157::i;:::-;12655:13;:15;;:175;;;;12858:44;12862:13;:15;;;12879:22;12883:1;12879:22;;;;;;;;;;;;;;;;;;;;;;;;;;12886:14;:5;:8;;;:12;:14::i;:::-;12879:3;:22::i;:::-;12858:3;:44::i;:::-;12840:13;:15;;:62;;;;12930:56;12934:13;:15;;;12951:34;12955:13;:17;;;12974:5;:10;;;12951:3;:34::i;:::-;12930:3;:56::i;:::-;12912:13;:15;;:74;;;;13041:32;;:::i;:::-;13076:5;:13;;;13041:48;;13104:9;13116:1;13104:13;;13099:421;191:1;13119;:5;13099:421;;;13163:83;13192:13;:15;;;13209:7;:10;;;13220:1;13209:13;;;;;;;;;;;;;13224:7;:10;;;13235:1;13224:13;;;;;;;;;;;;;13181:57;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13181:57:5;;;13171:68;;;;;;13163:77;;;:81;:83::i;:::-;13145:13;:15;;:101;;;;;13290:13;:15;;;13260:13;:24;;;13285:1;13260:27;;;;;;;;;;;;:45;;;;;13339:12;13354:21;:13;:15;;;:19;:21::i;:::-;13339:36;;13407:102;13411:13;:15;;;13428:80;13432:42;13436:7;:10;;;13447:1;13436:13;;;;;;;;;;;;;13451:22;13471:1;13451:13;:15;;;:19;;:22;;;;:::i;:::-;13432:3;:42::i;:::-;13476:31;13480:7;:10;;;13491:1;13480:13;;;;;;;;;;;;;13495:11;13504:1;13495:4;:8;;:11;;;;:::i;:::-;13476:3;:31::i;:::-;13428:3;:80::i;:::-;13407:3;:102::i;:::-;13389:13;:15;;:120;;;;13099:421;13126:3;;;;;;;13099:421;;;;13564:1;13530:13;:28;;;13559:1;13530:31;;;;;;;;;;;;:35;;;;;13580:9;13592:1;13580:13;;13575:155;191:1;13595;:5;13575:155;;;13655:64;13691:13;:24;;;13716:1;13691:27;;;;;;;;;;;;;13655:13;:28;;;13684:1;13655:31;;;;;;;;;;;;;:35;;:64;;;;:::i;:::-;13621:13;:28;;;13650:1;13621:31;;;;;;;;;;;;:98;;;;;13602:3;;;;;;;13575:155;;;;13739:21;;:::i;:::-;13804:37;:13;:28;;;13833:1;13804:31;;;;;;;;;;;;;:35;:37::i;:::-;13770:13;:28;;;13799:1;13770:31;;;;;;;;;;;;:71;;;;;13856:9;13868:1;13856:13;;13851:462;13877:1;162:2;13875:3;;;;;;;;13871:1;:7;13851:462;;;13904:9;13916:1;13904:13;;13899:404;162:2;13930:1;13925;13920;:6;;;;13919:12;:16;13899:404;;;13960:10;13983:1;13978;:6;;;;13973:1;:12;13960:25;;14008:6;14015:2;14008:10;;;;;;;;;;;;;14007:11;14003:286;;;14042:12;14057:76;14097:13;:24;;;14130:1;14126;191;14122:5;:9;14097:35;;;;;;;;;;;;;14057:13;:24;;;14090:1;14086;191;14082:5;:9;14057:35;;;;;;;;;;;;;:39;;:76;;;;:::i;:::-;14042:91;;14190:41;14226:4;14190:13;:28;;;14219:1;14190:31;;;;;;;;;;;;;:35;;:41;;;;:::i;:::-;14155:13;:28;;;14184:2;14155:32;;;;;;;;;;;;:76;;;;;14266:4;14253:6;14260:2;14253:10;;;;;;;;;;;;:17;;;;;;;;;;;14003:286;;13899:404;13937:3;;;;;13899:404;;;;13880:3;;;;;13851:462;;;;14323:20;;:::i;:::-;14353;;:::i;:::-;14388:9;14400:1;14388:13;;14383:224;162:2;14403:1;:5;14383:224;;;14437:55;14441:5;14448:43;14452:2;14455:1;14452:5;;;;;;;;;;;;;;;;;;;;14448:43;;;;;;;;;;;;;;;;;;;;;;;;;;14459:13;:28;;;14488:1;14459:31;;;;;;;;;;;;;14448:3;:43::i;:::-;14437:3;:55::i;:::-;14429:63;;14514:82;14518:5;14525:70;14529:13;:21;;;14551:1;14529:24;;;;;;;;;;;;;14555:13;:28;;;14592:1;14588;162:2;14584:5;:9;14555:39;;;;;;;;;;;;;14525:3;:70::i;:::-;14514:3;:82::i;:::-;14506:90;;14410:3;;;;;;;14383:224;;;;14616:21;;:::i;:::-;14640:104;14644:49;14648:21;14652:5;14659:7;:9;;;14648:3;:21::i;:::-;14671;14675:5;14682:7;:9;;;14671:3;:21::i;:::-;14644:3;:49::i;:::-;14695:48;14699:13;:17;;;14718:24;14732:7;:9;;;14718:7;:9;;;:13;;:24;;;;:::i;:::-;14695:3;:48::i;:::-;14640:3;:104::i;:::-;14616:128;;14762:27;14765:13;:15;;;14782:6;14762:2;:27::i;:::-;14754:77;;;;;;;;;;;;;;;;;;;;;;;;14849:4;14842:11;;;;;;;;;;;;4383:10477;;;;:::o;25201:295::-;25274:14;25367:4;25361:11;25423:5;25416:4;25409:5;25405:16;25401:28;25395:35;25392:1;25385:46;25478:1;25472:8;25462:18;;25338:152;;;;;:::o;720:95:3:-;767:7;110:77;793:1;:15;;;;;;;;786:22;;720:95;;;:::o;821:127::-;879:7;910:1;905;:6;;:36;;940:1;936;110:77;922:15;:19;905:36;;;918:1;914;:5;905:36;898:43;;821:127;;;;:::o;26030:382:5:-;26095:16;;:::i;:::-;26161:4;26155:11;26195:1;26189:8;26186:1;26179:19;26245:4;26242:1;26238:12;26232:19;26225:4;26222:1;26218:12;26211:41;26286:1;26279:4;26276:1;26272:12;26265:23;26345:4;26342:1;26336:4;26333:1;26327:4;26322:3;26311:39;26304:47;26301:2;;;26380:1;26377;26370:12;26301:2;26132:274;;;;;:::o;25568:456::-;25642:16;;:::i;:::-;25708:4;25702:11;25742:2;25736:9;25733:1;25726:20;25794:4;25790:2;25786:13;25780:20;25773:4;25770:1;25766:12;25759:42;25841:2;25835:9;25828:4;25825:1;25821:12;25814:31;25893:4;25889:2;25885:13;25879:20;25872:4;25869:1;25865:12;25858:42;25957:4;25954:1;25948:4;25945:1;25939:4;25934:3;25923:39;25916:47;25913:2;;;25992:1;25989;25982:12;25913:2;25679:339;;;;;:::o;26605:131::-;26678:4;26709:2;:4;;;26701:2;:4;;;:12;:28;;;;;26725:2;:4;;;26717:2;:4;;;:12;26701:28;26694:35;;26605:131;;;;:::o;489:116:3:-;547:7;110:77;573:25;;;;;;;583:1;580;573:25;566:32;;489:116;;;;:::o;14866:446:5:-;14941:26;14979:9;15002:1;14991;:8;:12;;;;;;;;14979:24;;15013:9;15030:1;15025;:6;15013:18;;15067:1;15050:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;15041:28;;15084:9;15096:1;15084:13;;15079:227;15103:1;15099;:5;15079:227;;;15125:21;15149:46;15174:1;15170;:5;15187:1;15182;15178;:5;15177:11;15190:1;15193;15149:20;:46::i;:::-;15125:70;;15214:9;15226:1;15214:13;;15209:87;15233:1;15229;:5;15209:87;;;15274:4;15279:1;15274:7;;;;;;;;;;;;;;;;;;15259:6;15266:1;15259:9;;;;;;;;;;;;;;;;;;15269:1;15259:12;;;;;;;;;;;;:22;;;;;15236:3;;;;;;;15209:87;;;;15079:227;15106:3;;;;;;;15079:227;;;;14866:446;;;;;:::o;16223:1466::-;16329:26;16604:12;16619:8;:15;16604:30;;16644:12;16666:1;16659:4;:8;;;;;;;;16644:23;;16703:4;16686:22;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16677:31;;16790:25;16818:16;16822:4;16828:5;16818:3;:16::i;:::-;16790:44;;16845:29;16891:4;16877:19;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;16877:19:5;;;;16845:51;;16911:9;16923:1;16911:13;;16906:777;16930:1;16926;:5;16906:777;;;16957:9;16969:1;16957:13;;16952:148;16976:4;16972:1;:8;16952:148;;;17023:8;17045:4;17040:1;17033:4;:8;17032:17;;;;;;;;17023:27;;;;;;;;;;;;;;;;;;17051:1;17023:30;;;;;;;;;;;;;17005:12;17018:1;17005:15;;;;;;;;;;;;;;;;;:48;;;;;16982:3;;;;;;;16952:148;;;;17129:17;17133:12;17129:3;:17::i;:::-;17114:32;;17160:28;17205:4;17191:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;17160:50;;17224:20;17247:1;17224:24;;17277:18;:12;:16;:18::i;:::-;17262:33;;17314:9;17326:1;17314:13;;17309:203;17333:4;17329:1;:8;17309:203;;;17391:106;17395:87;17399:33;17403:8;17412:1;17403:11;;;;;;;;;;;;;;;;;;17416:12;17429:1;17416:15;;;;;;;;;;;;;;;;;;17399:3;:33::i;:::-;17434:47;17438:8;17451:4;17447:1;:8;17438:18;;;;;;;;;;;;;;;;;;17458:12;17475:4;17471:1;:8;17458:22;;;;;;;;;;;;;;;;;;17434:3;:47::i;:::-;17395:3;:87::i;:::-;17484:12;17391:3;:106::i;:::-;17374:11;17386:1;17374:14;;;;;;;;;;;;;;;;;:123;;;;17339:3;;;;;;;17309:203;;;;17540:22;17544:11;17557:4;17540:3;:22::i;:::-;17526:36;;17581:9;17593:1;17581:13;;17576:97;17600:4;17596:1;:8;17576:97;;;17644:11;17656:1;17644:14;;;;;;;;;;;;;;;;;;17629:6;17636:1;17629:9;;;;;;;;;;;;;;;;;;17639:1;17629:12;;;;;;;;;;;;:29;;;;17606:3;;;;;;;17576:97;;;;16906:777;;16933:3;;;;;;;16906:777;;;;16223:1466;;;;;;;;:::o;954:95:3:-;1001:7;1041:1;110:77;1027:15;1020:22;;954:95;;;:::o;24761:236:5:-;24814:24;;:::i;:::-;24862:1;24850:6;24857:1;24850:9;;;;;;;;;;;;:13;;;;;24885:4;24873:6;24880:1;24873:9;;;;;;;;;;;;:16;;;;;24904:9;24916:1;24904:13;;24899:92;162:2;24919:1;:5;24899:92;;;24957:23;24975:4;24957:6;24968:1;24964;:5;24957:13;;;;;;;;;;;;;:17;;:23;;;;:::i;:::-;24945:6;24952:1;24945:9;;;;;;;;;;;;:35;;;;;24926:3;;;;;;;24899:92;;;;24761:236;;;:::o;1055:580:3:-;1123:14;1149:13;110:77;1149:27;;1224:4;1218:11;1252:4;1249:1;1242:15;1291:4;1284;1281:1;1277:12;1270:26;1330:4;1323;1320:1;1316:12;1309:26;1369:4;1362;1359:1;1355:12;1348:26;1408:8;1401:4;1398:1;1394:12;1387:30;1451:5;1444:4;1441:1;1437:12;1430:27;1514:4;1511:1;1505:4;1502:1;1496:4;1491:3;1480:39;1473:47;1470:2;;;1572:1;1569;1562:12;1470:2;1617:1;1611:8;1601:18;;1195:434;;;;;;:::o;367:116::-;425:7;110:77;451:25;;;;;;;461:1;458;451:25;444:32;;367:116;;;;:::o;24168:180:5:-;24233:14;24264:9;24276:1;24264:13;;24259:83;162:2;24279:1;:5;24259:83;;;24314:17;24325:2;24328:1;24325:5;;;;;;;;;;;;;24314:6;:10;;:17;;;;:::i;:::-;24305:26;;24286:3;;;;;;;24259:83;;;;24168:180;;;:::o;27986:181::-;28058:14;;:::i;:::-;28091:69;229:77;28134:5;28141:1;28117:26;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28117:26:5;;;28107:37;;;;;;28099:46;;;:60;;;;;;;;28091:7;:69::i;:::-;28084:76;;27986:181;;;;:::o;26418:::-;26472:14;;:::i;:::-;26505:47;;;;;;;;;26513:1;:3;;;26505:47;;;;229:77;26533:1;:3;;;:17;;;;;;;;229:77;26518:33;26505:47;;;26498:54;;26418:181;;;:::o;23941:221::-;24028:24;;:::i;:::-;24069:9;24081:1;24069:13;;24064:92;162:2;24084:1;:5;24064:92;;;24122:23;24126:2;24129:1;24126:5;;;;;;;;;;;;;;;;;;24133:11;:2;24136:1;24133:5;;;;;;;;;;;;;:9;:11::i;:::-;24122:3;:23::i;:::-;24110:6;24117:1;24110:9;;;;;;;;;;;;:35;;;;24091:3;;;;;;;24064:92;;;;23941:221;;;;:::o;25003:192::-;25073:24;;:::i;:::-;25114:9;25126:1;25114:13;;25109:80;162:2;25129:1;:5;25109:80;;;25167:11;25176:1;25167;25169;25167:4;;;;;;;;;;;;;:8;;:11;;;;:::i;:::-;25155:6;25162:1;25155:9;;;;;;;;;;;;:23;;;;;25136:3;;;;;;;25109:80;;;;25003:192;;;;:::o;23725:210::-;23810:24;;:::i;:::-;23851:9;23863:1;23851:13;;23846:83;162:2;23866:1;:5;23846:83;;;23904:14;23913:1;23915;23913:4;;;;;;;;;;;;;23904:1;23906;23904:4;;;;;;;;;;;;;:8;;:14;;;;:::i;:::-;23892:6;23899:1;23892:9;;;;;;;;;;;;:26;;;;;23873:3;;;;;;;23846:83;;;;23725:210;;;;:::o;24354:177::-;24417:18;;:::i;:::-;24452:9;24464:1;24452:13;;24447:78;162:2;24467:1;:5;24447:78;;;24499:15;24503:3;24508:2;24511:1;24508:5;;;;;;;;;;;;;;;;;;24499:3;:15::i;:::-;24493:21;;24474:3;;;;;;;24447:78;;;;24354:177;;;:::o;24537:218::-;24620:21;;:::i;:::-;24658:9;24670:1;24658:13;;24653:96;162:2;24673:1;:5;24653:96;;;24708:30;24712:6;24720:17;24724:2;24727:1;24724:5;;;;;;;;;;;;;24731:2;24734:1;24731:5;;;;;;;;;;;;;24720:3;:17::i;:::-;24708:3;:30::i;:::-;24699:39;;24680:3;;;;;;;24653:96;;;;24537:218;;;;:::o;611:103:3:-;658:7;684:23;688:1;705;110:77;691:15;684:3;:23::i;:::-;677:30;;611:103;;;:::o;15318:899:5:-;15444:23;15629:12;15660:8;15650:7;:18;15644:1;:25;15629:40;;15727:4;15713:19;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;15713:19:5;;;;15704:28;;15758:8;15747:7;:19;15743:94;;;15794:5;15782:6;15789:1;15782:9;;;;;;;;;;;;;;;;;:17;;;;;15820:6;15813:13;;;;;15743:94;15866:1;15856:7;:11;15846:21;;15878;15902:68;15923:8;15933:7;15942:24;15952:1;15954:7;15952:10;;;;;;;;;;;;;;;;;;15963:1;15952:13;;;;;;;;;;;;;15942:5;:9;;:24;;;;:::i;:::-;15968:1;15902:20;:68::i;:::-;15878:92;;15980:22;16005:68;16026:8;16036:7;16045:24;16055:1;16057:7;16055:10;;;;;;;;;;;;;;;;;;16066:1;16055:13;;;;;;;;;;;;;16045:5;:9;;:24;;;;:::i;:::-;16071:1;16005:20;:68::i;:::-;15980:93;;16088:9;16100:1;16088:13;;16083:128;16114:1;16107:4;:8;;;;;;;;16103:1;:12;16083:128;;;16148:4;16153:1;16148:7;;;;;;;;;;;;;;;;;;16136:6;16143:1;16136:9;;;;;;;;;;;;;;;;;:19;;;;;16192:5;16198:1;16192:8;;;;;;;;;;;;;;;;;;16169:6;16187:1;16180:4;:8;;;;;;;;16176:1;:12;16169:20;;;;;;;;;;;;;;;;;:31;;;;;16117:3;;;;;;;16083:128;;;;15318:899;;;;;;;;;;:::o;17695:997::-;17769:23;17804:12;17819:5;:12;17804:27;;17853:1;17845:4;:9;17841:52;;;17877:5;17870:12;;;;;17841:52;17922:1;17917;17910:4;:8;;;;;;;;:13;17902:57;;;;;;;;;;;;;;;;;;;;;;;;17970:13;17986:23;18004:4;17996:5;:12;;;;;;;;337:76;17986:9;;:23;;;;:::i;:::-;17970:39;;18019:20;18042:1;18019:24;;18057:7;18053:87;;;18088:11;:5;:9;:11::i;:::-;18080:19;;18128:1;18113:16;;18053:87;18164:18;:12;:16;:18::i;:::-;18149:33;;18192:21;18216:31;18220:17;18228:5;18235:1;18220:7;:17::i;:::-;18239:7;18216:3;:31::i;:::-;18192:55;;18257:20;18280:31;18284:17;18292:5;18299:1;18284:7;:17::i;:::-;18303:7;18280:3;:31::i;:::-;18257:54;;18321:17;18341:1;18321:21;;18375:4;18361:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;18352:28;;18395:9;18407:1;18395:13;;18390:296;18421:1;18414:4;:8;;;;;;;;18410:1;:12;18390:296;;;18443:19;;:::i;:::-;18465:22;18469:3;18473:1;18469:6;;;;;;;;;;;;;;;;;;18477:9;18465:3;:22::i;:::-;18443:44;;18513:37;18517:18;18521:4;18526:1;18521:7;;;;;;;;;;;;;;;;;;18530:4;18517:3;:18::i;:::-;18537:12;18513:3;:37::i;:::-;18501:6;18508:1;18501:9;;;;;;;;;;;;;;;;;:49;;;;18587:42;18591:23;18595:4;18600:1;18595:7;;;;;;;;;;;;;;;;;;18604:9;18608:4;18604:3;:9::i;:::-;18591:3;:23::i;:::-;18616:12;18587:3;:42::i;:::-;18564:6;18582:1;18575:4;:8;;;;;;;;18571:1;:12;18564:20;;;;;;;;;;;;;;;;;:65;;;;18655:20;18669:5;18655:9;:13;;:20;;;;:::i;:::-;18643:32;;18390:296;18424:3;;;;;;;18390:296;;;;17695:997;;;;;;;;;;;:::o;18980:739::-;19040:23;19075:12;19090:5;:12;19075:27;;19124:1;19116:4;:9;19112:52;;;19148:5;19141:12;;;;;19112:52;19193:1;19188;19181:4;:8;;;;;;;;:13;19173:57;;;;;;;;;;;;;;;;;;;;;;;;19241:13;19257:23;19275:4;19267:5;:12;;;;;;;;337:76;19257:9;;:23;;;;:::i;:::-;19241:39;;19290:21;19314:22;19318:17;19326:5;19333:1;19318:7;:17::i;:::-;19314:3;:22::i;:::-;19290:46;;19346:20;19369:22;19373:17;19381:5;19388:1;19373:7;:17::i;:::-;19369:3;:22::i;:::-;19346:45;;19401:17;19421:1;19401:21;;19455:4;19441:19;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;19441:19:5;;;;19432:28;;19475:9;19487:1;19475:13;;19470:243;19501:1;19494:4;:8;;;;;;;;19490:1;:12;19470:243;;;19523:12;19538:21;19549:9;19538:3;19542:1;19538:6;;;;;;;;;;;;;;;;;;:10;;:21;;;;:::i;:::-;19523:36;;19585:17;19597:4;19585;19590:1;19585:7;;;;;;;;;;;;;;;;;;:11;;:17;;;;:::i;:::-;19573:6;19580:1;19573:9;;;;;;;;;;;;;;;;;:29;;;;;19639:17;19651:4;19639;19644:1;19639:7;;;;;;;;;;;;;;;;;;:11;;:17;;;;:::i;:::-;19616:6;19634:1;19627:4;:8;;;;;;;;19623:1;:12;19616:20;;;;;;;;;;;;;;;;;:40;;;;;19682:20;19696:5;19682:9;:13;;:20;;;;:::i;:::-;19670:32;;19470:243;19504:3;;;;;;;19470:243;;;;18980:739;;;;;;;;;:::o;27358:449::-;27412:14;;:::i;:::-;27438:9;27457:311;27464:4;27457:311;;;27484:16;27523:1;27503:17;27512:4;27518:1;27503:8;:17::i;:::-;:21;27484:40;;27610:41;27619:8;27649:1;27644;229:77;27630:15;27629:21;;;;;;;;27610:8;:41::i;:::-;27606:45;;27687:8;27669:14;27678:1;27681;27669:8;:14::i;:::-;:26;27665:70;;;27715:5;;;27665:70;27756:1;27748:9;;;;27457:311;;;;27784:16;;;;;;;;;27792:4;27784:16;;;;27798:1;27784:16;;;27777:23;;;27358:449;;;:::o;18698:276::-;18778:23;18851:1;18836:5;:12;:16;;;;;;;;18822:31;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;18813:40;;18868:9;18880:1;18868:13;;18863:105;18902:1;18887:5;:12;:16;;;;;;;;18883:1;:20;18863:105;;;18936:5;18950:6;18946:1;18942;:5;:14;18936:21;;;;;;;;;;;;;;;;;;18924:6;18931:1;18924:9;;;;;;;;;;;;;;;;;:33;;;;18905:3;;;;;;;18863:105;;;;18698:276;;;;:::o;19725:::-;19805:23;19878:1;19863:5;:12;:16;;;;;;;;19849:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;19849:31:5;;;;19840:40;;19895:9;19907:1;19895:13;;19890:105;19929:1;19914:5;:12;:16;;;;;;;;19910:1;:20;19890:105;;;19963:5;19977:6;19973:1;19969;:5;:14;19963:21;;;;;;;;;;;;;;;;;;19951:6;19958:1;19951:9;;;;;;;;;;;;;;;;;:33;;;;;19932:3;;;;;;;19890:105;;;;19725:276;;;;:::o;26742:610::-;26815:14;26866:13;229:77;26866:27;;26941:4;26935:11;26969:4;26966:1;26959:15;27008:4;27001;26998:1;26994:12;26987:26;27047:4;27040;27037:1;27033:12;27026:26;27086:4;27079;27076:1;27072:12;27065:26;27125:8;27118:4;27115:1;27111:12;27104:30;27168:5;27161:4;27158:1;27154:12;27147:27;27231:4;27228:1;27222:4;27219:1;27213:4;27208:3;27197:39;27190:47;27187:2;;;27289:1;27286;27279:12;27187:2;27334:1;27328:8;27318:18;;26912:434;;;;;;:::o;81:28088::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:28088:5;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:28088:5;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:28088:5;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:28088:5;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;81:28088:5;;;;:::o;26:764:-1:-;;162:3;155:4;147:6;143:17;139:27;132:35;129:2;;;180:1;177;170:12;129:2;217:6;204:20;239:99;254:83;330:6;254:83;;;239:99;;;230:108;;355:5;380:6;373:5;366:21;410:4;402:6;398:17;388:27;;432:4;427:3;423:14;416:21;;485:6;532:3;524:4;516:6;512:17;507:3;503:27;500:36;497:2;;;549:1;546;539:12;497:2;574:1;559:225;584:6;581:1;578:13;559:225;;;642:3;664:56;716:3;704:10;664:56;;;659:3;652:69;744:4;739:3;735:14;728:21;;772:4;767:3;763:14;756:21;;616:168;606:1;603;599:9;594:14;;559:225;;;563:14;122:668;;;;;;;;817:607;;928:3;921:4;913:6;909:17;905:27;898:35;895:2;;;946:1;943;936:12;895:2;970:3;988:74;1003:58;1054:6;1003:58;;;988:74;;;979:83;;1079:5;1138:6;1185:3;1177:4;1169:6;1165:17;1160:3;1156:27;1153:36;1150:2;;;1202:1;1199;1192:12;1150:2;1227:1;1212:206;1237:6;1234:1;1231:13;1212:206;;;1295:3;1317:37;1350:3;1338:10;1317:37;;;1312:3;1305:50;1378:4;1373:3;1369:14;1362:21;;1406:4;1401:3;1397:14;1390:21;;1269:149;1259:1;1256;1252:9;1247:14;;1212:206;;;1216:14;888:536;;;;;;;;1451:615;;1566:3;1559:4;1551:6;1547:17;1543:27;1536:35;1533:2;;;1584:1;1581;1574:12;1533:2;1608:3;1626:78;1641:62;1696:6;1641:62;;;1626:78;;;1617:87;;1721:5;1780:6;1827:3;1819:4;1811:6;1807:17;1802:3;1798:27;1795:36;1792:2;;;1844:1;1841;1834:12;1792:2;1869:1;1854:206;1879:6;1876:1;1873:13;1854:206;;;1937:3;1959:37;1992:3;1980:10;1959:37;;;1954:3;1947:50;2020:4;2015:3;2011:14;2004:21;;2048:4;2043:3;2039:14;2032:21;;1911:149;1901:1;1898;1894:9;1889:14;;1854:206;;;1858:14;1526:540;;;;;;;;2074:118;;2141:46;2179:6;2166:20;2141:46;;;2132:55;;2126:66;;;;;2200:440;;2301:3;2294:4;2286:6;2282:17;2278:27;2271:35;2268:2;;;2319:1;2316;2309:12;2268:2;2356:6;2343:20;2378:64;2393:48;2434:6;2393:48;;;2378:64;;;2369:73;;2462:6;2455:5;2448:21;2498:4;2490:6;2486:17;2531:4;2524:5;2520:16;2566:3;2557:6;2552:3;2548:16;2545:25;2542:2;;;2583:1;2580;2573:12;2542:2;2593:41;2627:6;2622:3;2617;2593:41;;;2261:379;;;;;;;;2648:118;;2715:46;2753:6;2740:20;2715:46;;;2706:55;;2700:66;;;;;2773:2013;;;;;;;;;3227:3;3215:9;3206:7;3202:23;3198:33;3195:2;;;3244:1;3241;3234:12;3195:2;3307:1;3296:9;3292:17;3279:31;3330:18;3322:6;3319:30;3316:2;;;3362:1;3359;3352:12;3316:2;3382:97;3471:7;3462:6;3451:9;3447:22;3382:97;;;3372:107;;3258:227;3544:2;3533:9;3529:18;3516:32;3568:18;3560:6;3557:30;3554:2;;;3600:1;3597;3590:12;3554:2;3620:97;3709:7;3700:6;3689:9;3685:22;3620:97;;;3610:107;;3495:228;3782:2;3771:9;3767:18;3754:32;3806:18;3798:6;3795:30;3792:2;;;3838:1;3835;3828:12;3792:2;3858:97;3947:7;3938:6;3927:9;3923:22;3858:97;;;3848:107;;3733:228;3992:2;4010:76;4078:7;4069:6;4058:9;4054:22;4010:76;;;4000:86;;3971:121;4151:3;4140:9;4136:19;4123:33;4176:18;4168:6;4165:30;4162:2;;;4208:1;4205;4198:12;4162:2;4228:97;4317:7;4308:6;4297:9;4293:22;4228:97;;;4218:107;;4102:229;4362:3;4381:53;4426:7;4417:6;4406:9;4402:22;4381:53;;;4371:63;;4341:99;4471:3;4490:76;4558:7;4549:6;4538:9;4534:22;4490:76;;;4480:86;;4450:122;4631:3;4620:9;4616:19;4603:33;4656:18;4648:6;4645:30;4642:2;;;4688:1;4685;4678:12;4642:2;4708:62;4762:7;4753:6;4742:9;4738:22;4708:62;;;4698:72;;4582:194;3189:1597;;;;;;;;;;;;4794:259;;4922:91;5009:3;5002:5;4922:91;;;5042:4;5037:3;5033:14;5019:28;;4915:138;;;;;5138:743;5309:69;5372:5;5309:69;;;5391:105;5489:6;5484:3;5391:105;;;5384:112;;5516:71;5581:5;5516:71;;;5608:1;5593:276;5618:6;5615:1;5612:13;5593:276;;;5665:105;5766:3;5757:6;5751:13;5665:105;;;5658:112;;5787:75;5855:6;5787:75;;;5777:85;;5640:1;5637;5633:9;5628:14;;5593:276;;;5597:14;5288:593;;;;;5964:773;;6147:71;6212:5;6147:71;;;6231:107;6331:6;6326:3;6231:107;;;6224:114;;6358:73;6425:5;6358:73;;;6452:1;6437:278;6462:6;6459:1;6456:13;6437:278;;;6509:105;6610:3;6601:6;6595:13;6509:105;;;6502:112;;6631:77;6701:6;6631:77;;;6621:87;;6484:1;6481;6477:9;6472:14;;6437:278;;;6441:14;6728:3;6721:10;;6126:611;;;;;;;6745:111;6822:28;6844:5;6822:28;;;6817:3;6810:41;6804:52;;;6863:360;;6993:39;7026:5;6993:39;;;7044:89;7126:6;7121:3;7044:89;;;7037:96;;7138:52;7183:6;7178:3;7171:4;7164:5;7160:16;7138:52;;;7211:6;7206:3;7202:16;7195:23;;6973:250;;;;;;7231:364;;7391:67;7455:2;7450:3;7391:67;;;7384:74;;7491:66;7487:1;7482:3;7478:11;7471:87;7586:2;7581:3;7577:12;7570:19;;7377:218;;;;7604:465;;7764:67;7828:2;7823:3;7764:67;;;7757:74;;7864:66;7860:1;7855:3;7851:11;7844:87;7965:66;7960:2;7955:3;7951:12;7944:88;8060:2;8055:3;8051:12;8044:19;;7750:319;;;;8078:364;;8238:67;8302:2;8297:3;8238:67;;;8231:74;;8338:66;8334:1;8329:3;8325:11;8318:87;8433:2;8428:3;8424:12;8417:19;;8224:218;;;;8451:364;;8611:67;8675:2;8670:3;8611:67;;;8604:74;;8711:66;8707:1;8702:3;8698:11;8691:87;8806:2;8801:3;8797:12;8790:19;;8597:218;;;;8824:364;;8984:67;9048:2;9043:3;8984:67;;;8977:74;;9084:66;9080:1;9075:3;9071:11;9064:87;9179:2;9174:3;9170:12;9163:19;;8970:218;;;;9197:465;;9357:67;9421:2;9416:3;9357:67;;;9350:74;;9457:66;9453:1;9448:3;9444:11;9437:87;9558:66;9553:2;9548:3;9544:12;9537:88;9653:2;9648:3;9644:12;9637:19;;9343:319;;;;9739:450;9868:4;9863:3;9859:14;9947:3;9940:5;9936:15;9930:22;9958:61;10014:3;10009;10005:13;9992:11;9958:61;;;9888:137;10094:4;10087:5;10083:16;10077:23;10106:62;10162:4;10157:3;10153:14;10140:11;10106:62;;;10035:139;9841:348;;;;10265:460;10404:4;10399:3;10395:14;10483:3;10476:5;10472:15;10466:22;10494:61;10550:3;10545;10541:13;10528:11;10494:61;;;10424:137;10630:4;10623:5;10619:16;10613:23;10642:62;10698:4;10693:3;10689:14;10676:11;10642:62;;;10571:139;10377:348;;;;10732:110;10805:31;10830:5;10805:31;;;10800:3;10793:44;10787:55;;;10849:120;10932:31;10957:5;10932:31;;;10927:3;10920:44;10914:55;;;10976:159;11077:52;11097:31;11122:5;11097:31;;;11077:52;;;11072:3;11065:65;11059:76;;;11142:405;;11316:95;11407:3;11398:6;11316:95;;;11309:102;;11422:75;11493:3;11484:6;11422:75;;;11519:2;11514:3;11510:12;11503:19;;11539:3;11532:10;;11297:250;;;;;;11554:1759;;12210:3;12199:9;12195:19;12187:27;;12261:9;12255:4;12251:20;12247:1;12236:9;12232:17;12225:47;12286:146;12427:4;12418:6;12286:146;;;12278:154;;12480:9;12474:4;12470:20;12465:2;12454:9;12450:18;12443:48;12505:146;12646:4;12637:6;12505:146;;;12497:154;;12699:9;12693:4;12689:20;12684:2;12673:9;12669:18;12662:48;12724:146;12865:4;12856:6;12724:146;;;12716:154;;12881:118;12995:2;12984:9;12980:18;12971:6;12881:118;;;13048:9;13042:4;13038:20;13032:3;13021:9;13017:19;13010:49;13073:146;13214:4;13205:6;13073:146;;;13065:154;;13230:73;13298:3;13287:9;13283:19;13274:6;13230:73;;;12181:1132;;;;;;;;;;13320:201;;13432:2;13421:9;13417:18;13409:26;;13446:65;13508:1;13497:9;13493:17;13484:6;13446:65;;;13403:118;;;;;13528:407;;13719:2;13708:9;13704:18;13696:26;;13769:9;13763:4;13759:20;13755:1;13744:9;13740:17;13733:47;13794:131;13920:4;13794:131;;;13786:139;;13690:245;;;;13942:407;;14133:2;14122:9;14118:18;14110:26;;14183:9;14177:4;14173:20;14169:1;14158:9;14154:17;14147:47;14208:131;14334:4;14208:131;;;14200:139;;14104:245;;;;14356:407;;14547:2;14536:9;14532:18;14524:26;;14597:9;14591:4;14587:20;14583:1;14572:9;14568:17;14561:47;14622:131;14748:4;14622:131;;;14614:139;;14518:245;;;;14770:407;;14961:2;14950:9;14946:18;14938:26;;15011:9;15005:4;15001:20;14997:1;14986:9;14982:17;14975:47;15036:131;15162:4;15036:131;;;15028:139;;14932:245;;;;15184:407;;15375:2;15364:9;15360:18;15352:26;;15425:9;15419:4;15415:20;15411:1;15400:9;15396:17;15389:47;15450:131;15576:4;15450:131;;;15442:139;;15346:245;;;;15598:407;;15789:2;15778:9;15774:18;15766:26;;15839:9;15833:4;15829:20;15825:1;15814:9;15810:17;15803:47;15864:131;15990:4;15864:131;;;15856:139;;15760:245;;;;16012:213;;16130:2;16119:9;16115:18;16107:26;;16144:71;16212:1;16201:9;16197:17;16188:6;16144:71;;;16101:124;;;;;16232:493;;16462:3;16451:9;16447:19;16439:27;;16477:71;16545:1;16534:9;16530:17;16521:6;16477:71;;;16559:156;16711:2;16700:9;16696:18;16687:6;16559:156;;;16433:292;;;;;;16732:2899;;17778:3;17767:9;17763:19;17755:27;;17793:71;17861:1;17850:9;17846:17;17837:6;17793:71;;;17912:9;17906:4;17902:20;17897:2;17886:9;17882:18;17875:48;17937:146;18078:4;18069:6;17937:146;;;17929:154;;18131:9;18125:4;18121:20;18116:2;18105:9;18101:18;18094:48;18156:146;18297:4;18288:6;18156:146;;;18148:154;;18350:9;18344:4;18340:20;18335:2;18324:9;18320:18;18313:48;18375:146;18516:4;18507:6;18375:146;;;18367:154;;18570:9;18564:4;18560:20;18554:3;18543:9;18539:19;18532:49;18595:146;18736:4;18727:6;18595:146;;;18587:154;;18790:9;18784:4;18780:20;18774:3;18763:9;18759:19;18752:49;18815:146;18956:4;18947:6;18815:146;;;18807:154;;19010:9;19004:4;19000:20;18994:3;18983:9;18979:19;18972:49;19035:146;19176:4;19167:6;19035:146;;;19027:154;;19230:9;19224:4;19220:20;19214:3;19203:9;19199:19;19192:49;19255:146;19396:4;19387:6;19255:146;;;19247:154;;19450:9;19444:4;19440:20;19434:3;19423:9;19419:19;19412:49;19475:146;19616:4;19607:6;19475:146;;;19467:154;;17749:1882;;;;;;;;;;;;;19638:620;;19904:3;19893:9;19889:19;19881:27;;19919:71;19987:1;19976:9;19972:17;19963:6;19919:71;;;20001:118;20115:2;20104:9;20100:18;20091:6;20001:118;;;20130;20244:2;20233:9;20229:18;20220:6;20130:118;;;19875:383;;;;;;;20265:1028;;20679:3;20668:9;20664:19;20656:27;;20694:71;20762:1;20751:9;20747:17;20738:6;20694:71;;;20776:118;20890:2;20879:9;20875:18;20866:6;20776:118;;;20905;21019:2;21008:9;21004:18;20995:6;20905:118;;;21034:119;21148:3;21137:9;21133:19;21124:6;21034:119;;;21164;21278:3;21267:9;21263:19;21254:6;21164:119;;;20650:643;;;;;;;;;21300:1844;;22010:3;21999:9;21995:19;21987:27;;22025:71;22093:1;22082:9;22078:17;22069:6;22025:71;;;22107:118;22221:2;22210:9;22206:18;22197:6;22107:118;;;22236;22350:2;22339:9;22335:18;22326:6;22236:118;;;22365:119;22479:3;22468:9;22464:19;22455:6;22365:119;;;22495;22609:3;22598:9;22594:19;22585:6;22495:119;;;22625;22739:3;22728:9;22724:19;22715:6;22625:119;;;22755;22869:3;22858:9;22854:19;22845:6;22755:119;;;22885;22999:3;22988:9;22984:19;22975:6;22885:119;;;23015;23129:3;23118:9;23114:19;23105:6;23015:119;;;21981:1163;;;;;;;;;;;;;23151:2048;;23935:3;23924:9;23920:19;23912:27;;23950:71;24018:1;24007:9;24003:17;23994:6;23950:71;;;24032:118;24146:2;24135:9;24131:18;24122:6;24032:118;;;24161;24275:2;24264:9;24260:18;24251:6;24161:118;;;24290:119;24404:3;24393:9;24389:19;24380:6;24290:119;;;24420;24534:3;24523:9;24519:19;24510:6;24420:119;;;24550;24664:3;24653:9;24649:19;24640:6;24550:119;;;24680;24794:3;24783:9;24779:19;24770:6;24680:119;;;24810;24924:3;24913:9;24909:19;24900:6;24810:119;;;24940;25054:3;25043:9;25039:19;25030:6;24940:119;;;25070;25184:3;25173:9;25169:19;25160:6;25070:119;;;23906:1293;;;;;;;;;;;;;;25206:256;;25268:2;25262:9;25252:19;;25306:4;25298:6;25294:17;25405:6;25393:10;25390:22;25369:18;25357:10;25354:34;25351:62;25348:2;;;25426:1;25423;25416:12;25348:2;25446:10;25442:2;25435:22;25246:216;;;;;25469:277;;25647:18;25639:6;25636:30;25633:2;;;25679:1;25676;25669:12;25633:2;25708:4;25700:6;25696:17;25688:25;;25736:4;25730;25726:15;25718:23;;25570:176;;;;25753:229;;25906:18;25898:6;25895:30;25892:2;;;25938:1;25935;25928:12;25892:2;25967:4;25959:6;25955:17;25947:25;;25829:153;;;;25989:233;;26146:18;26138:6;26135:30;26132:2;;;26178:1;26175;26168:12;26132:2;26207:4;26199:6;26195:17;26187:25;;26069:153;;;;26229:258;;26372:18;26364:6;26361:30;26358:2;;;26404:1;26401;26394:12;26358:2;26448:4;26444:9;26437:4;26429:6;26425:17;26421:33;26413:41;;26477:4;26471;26467:15;26459:23;;26295:192;;;;26496:125;;26608:6;26597:17;;26589:32;;;;26632:138;;26758:4;26750:6;26746:17;26735:28;;26727:43;;;;26779:113;;26884:3;26874:13;;26868:24;;;;26899:124;;27012:5;27006:12;26996:22;;26990:33;;;;27030:92;;27111:5;27105:12;27095:22;;27089:33;;;;27130:137;;27256:4;27248:6;27244:17;27233:28;;27226:41;;;;27276:139;;27404:4;27396:6;27392:17;27381:28;;27374:41;;;;27424:161;;27576:3;27561:18;;27554:31;;;;;27594:199;;27745:6;27740:3;27733:19;27782:4;27777:3;27773:14;27758:29;;27726:67;;;;;27802:163;;27917:6;27912:3;27905:19;27954:4;27949:3;27945:14;27930:29;;27898:67;;;;;27974:145;;28110:3;28095:18;;28088:31;;;;;28127:92;;28207:5;28200:13;28193:21;28182:32;;28176:43;;;;28226:79;;28295:5;28284:16;;28278:27;;;;28312:79;;28381:5;28370:16;;28364:27;;;;28398:79;;28467:5;28456:16;;28450:27;;;;28485:145;28566:6;28561:3;28556;28543:30;28622:1;28613:6;28608:3;28604:16;28597:27;28536:94;;;;28639:268;28704:1;28711:101;28725:6;28722:1;28719:13;28711:101;;;28801:1;28796:3;28792:11;28786:18;28782:1;28777:3;28773:11;28766:39;28747:2;28744:1;28740:10;28735:15;;28711:101;;;28827:6;28824:1;28821:13;28818:2;;;28892:1;28883:6;28878:3;28874:16;28867:27;28818:2;28688:219;;;;;28915:74;;28979:5;28968:16;;28962:27;;;", + "source": "pragma solidity 0.5.4;\npragma experimental ABIEncoderV2;\n\nimport \"./Utils.sol\";\n\ncontract ZetherVerifier {\n using Utils for uint256;\n\n uint256 constant m = 64;\n uint256 constant n = 6;\n uint256 constant FIELD_ORDER = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n uint256 constant UNITY = 9334303377689037989442018753807510978357674015322511348041267794643984346845; // primitive 2^28th root of unity modulo GROUP_ORDER (not field!)\n\n G1Point[] gs;\n G1Point[] hs;\n G1Point g;\n G1Point h;\n\n struct ZetherStatement {\n G1Point[] CLn;\n G1Point[] CRn;\n G1Point[] C;\n G1Point D;\n G1Point[] y;\n uint256 epoch;\n G1Point u;\n }\n\n struct ZetherProof {\n G1Point BA;\n G1Point BS;\n G1Point A;\n G1Point B;\n G1Point C;\n G1Point D;\n G1Point E;\n G1Point F;\n\n G1Point[] CLnG;\n G1Point[] CRnG;\n G1Point[] C_0G;\n G1Point[] DG;\n G1Point[] y_0G;\n G1Point[] gG;\n G1Point[] C_XG;\n G1Point[] y_XG;\n\n uint256[] f;\n uint256 z_A;\n uint256 z_C;\n uint256 z_E;\n\n G1Point CPrime;\n G1Point DPrime;\n G1Point CLnPrime;\n G1Point CRnPrime;\n\n G1Point[2] tCommits;\n uint256 tHat;\n uint256 tauX;\n uint256 mu;\n\n uint256 c;\n uint256 s_sk;\n uint256 s_r;\n uint256 s_vTransfer;\n uint256 s_vDiff;\n uint256 s_nuTransfer;\n uint256 s_nuDiff;\n\n InnerProductProof ipProof;\n }\n\n struct InnerProductProof {\n G1Point[n] ls;\n G1Point[n] rs;\n uint256 a;\n uint256 b;\n }\n\n constructor() public {\n g = mapInto(\"G\");\n h = mapInto(\"V\");\n for (uint256 i = 0; i < m; i++) {\n gs.push(mapInto(\"G\", i));\n hs.push(mapInto(\"H\", i));\n }\n }\n\n function verifyTransfer(bytes32[2][] memory CLn, bytes32[2][] memory CRn, bytes32[2][] memory C, bytes32[2] memory D, bytes32[2][] memory y, uint256 epoch, bytes32[2] memory u, bytes memory proof) view public returns (bool) {\n ZetherStatement memory statement;\n uint256 size = y.length;\n\n statement.CLn = new G1Point[](size);\n statement.CRn = new G1Point[](size);\n statement.C = new G1Point[](size);\n statement.y = new G1Point[](size);\n for (uint256 i = 0; i < size; i++) {\n statement.CLn[i] = G1Point(uint256(CLn[i][0]), uint256(CLn[i][1]));\n statement.CRn[i] = G1Point(uint256(CRn[i][0]), uint256(CRn[i][1]));\n statement.C[i] = G1Point(uint256(C[i][0]), uint256(C[i][1]));\n statement.y[i] = G1Point(uint256(y[i][0]), uint256(y[i][1]));\n }\n statement.D = G1Point(uint256(D[0]), uint256(D[1]));\n statement.epoch = epoch;\n statement.u = G1Point(uint256(u[0]), uint256(u[1]));\n ZetherProof memory zetherProof = unserialize(proof);\n return verify(statement, zetherProof);\n }\n\n struct ZetherAuxiliaries {\n uint256 y;\n uint256[m] ys;\n uint256 z;\n uint256[2] zs; // [z^2, z^3]\n uint256[m] twoTimesZSquared;\n uint256 zSum;\n uint256 x;\n uint256 t;\n uint256 k;\n G1Point tEval;\n }\n\n struct SigmaAuxiliaries {\n uint256 c;\n G1Point A_y;\n G1Point A_D;\n G1Point gEpoch;\n G1Point A_u;\n G1Point A_B;\n G1Point A_X;\n G1Point c_commit;\n G1Point A_t;\n G1Point A_C0;\n G1Point A_CLn;\n G1Point A_CPrime;\n G1Point A_CLnPrime;\n }\n\n struct AnonAuxiliaries {\n uint256 m;\n uint256 N;\n uint256 v;\n uint256 w;\n uint256 vPow;\n uint256 wPow;\n uint256[2][] f; // could just allocate extra space in the proof?\n uint256[2][] r; // each poly is an array of length N. evaluations of prods\n G1Point temp;\n G1Point CLnR;\n G1Point CRnR;\n G1Point[2][] CR;\n G1Point[2][] yR;\n G1Point C_XR;\n G1Point y_XR;\n G1Point gR;\n G1Point DR;\n }\n\n struct IPAuxiliaries {\n G1Point u_x;\n G1Point[m] hPrimes;\n uint256[m] hExp;\n G1Point P;\n uint256 o;\n uint256[n] challenges;\n uint256[m] otherExponents;\n }\n\n function verify(ZetherStatement memory statement, ZetherProof memory proof) view internal returns (bool) {\n uint256 statementHash = uint256(keccak256(abi.encode(statement.CLn, statement.CRn, statement.C, statement.D, statement.y, statement.epoch))).mod();\n\n AnonAuxiliaries memory anonAuxiliaries;\n anonAuxiliaries.v = uint256(keccak256(abi.encode(statementHash, proof.BA, proof.BS, proof.A, proof.B, proof.C, proof.D, proof.E, proof.F))).mod();\n anonAuxiliaries.w = uint256(keccak256(abi.encode(anonAuxiliaries.v, proof.CLnG, proof.CRnG, proof.C_0G, proof.DG, proof.y_0G, proof.gG, proof.C_XG, proof.y_XG))).mod();\n anonAuxiliaries.m = proof.f.length / 2;\n anonAuxiliaries.N = 2 ** anonAuxiliaries.m;\n anonAuxiliaries.f = new uint256[2][](2 * anonAuxiliaries.m);\n for (uint256 k = 0; k < 2 * anonAuxiliaries.m; k++) {\n anonAuxiliaries.f[k][1] = proof.f[k];\n anonAuxiliaries.f[k][0] = anonAuxiliaries.w.sub(proof.f[k]);\n }\n\n for (uint256 k = 0; k < 2 * anonAuxiliaries.m; k++) {\n anonAuxiliaries.temp = add(anonAuxiliaries.temp, mul(gs[k], anonAuxiliaries.f[k][1]));\n }\n require(eq(add(mul(proof.B, anonAuxiliaries.w), proof.A), add(anonAuxiliaries.temp, mul(h, proof.z_A))), \"Recovery failure for B^w * A.\");\n\n anonAuxiliaries.temp = G1Point(0, 0);\n for (uint256 k = 0; k < 2 * anonAuxiliaries.m; k++) { // danger... gs and hs need to be big enough.\n anonAuxiliaries.temp = add(anonAuxiliaries.temp, mul(gs[k], anonAuxiliaries.f[k][1].mul(anonAuxiliaries.w.sub(anonAuxiliaries.f[k][1]))));\n }\n require(eq(add(mul(proof.C, anonAuxiliaries.w), proof.D), add(anonAuxiliaries.temp, mul(h, proof.z_C))), \"Recovery failure for C^w * D.\");\n\n anonAuxiliaries.temp = add(mul(gs[0], anonAuxiliaries.f[0][1].mul(anonAuxiliaries.f[anonAuxiliaries.m][1])), mul(gs[1], anonAuxiliaries.f[0][0].mul(anonAuxiliaries.f[anonAuxiliaries.m][0])));\n require(eq(add(mul(proof.F, anonAuxiliaries.w), proof.E), add(anonAuxiliaries.temp, mul(h, proof.z_E))), \"Recovery failure for F^w * E.\");\n\n anonAuxiliaries.r = assemblePolynomials(anonAuxiliaries.f);\n\n anonAuxiliaries.CR = assembleConvolutions(anonAuxiliaries.r, statement.C);\n anonAuxiliaries.yR = assembleConvolutions(anonAuxiliaries.r, statement.y);\n for (uint256 i = 0; i < anonAuxiliaries.N; i++) {\n anonAuxiliaries.CLnR = add(anonAuxiliaries.CLnR, mul(statement.CLn[i], anonAuxiliaries.r[i][0]));\n anonAuxiliaries.CRnR = add(anonAuxiliaries.CRnR, mul(statement.CRn[i], anonAuxiliaries.r[i][0]));\n }\n anonAuxiliaries.vPow = 1;\n for (uint256 i = 0; i < anonAuxiliaries.N; i++) {\n anonAuxiliaries.C_XR = add(anonAuxiliaries.C_XR, mul(anonAuxiliaries.CR[i / 2][i % 2], anonAuxiliaries.vPow));\n anonAuxiliaries.y_XR = add(anonAuxiliaries.y_XR, mul(anonAuxiliaries.yR[i / 2][i % 2], anonAuxiliaries.vPow));\n if (i > 0) {\n anonAuxiliaries.vPow = anonAuxiliaries.vPow.mul(anonAuxiliaries.v);\n }\n }\n anonAuxiliaries.wPow = 1;\n for (uint256 k = 0; k < anonAuxiliaries.m; k++) {\n anonAuxiliaries.CLnR = add(anonAuxiliaries.CLnR, mul(proof.CLnG[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.CRnR = add(anonAuxiliaries.CRnR, mul(proof.CRnG[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.CR[0][0] = add(anonAuxiliaries.CR[0][0], mul(proof.C_0G[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.DR = add(anonAuxiliaries.DR, mul(proof.DG[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.yR[0][0] = add(anonAuxiliaries.yR[0][0], mul(proof.y_0G[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.gR = add(anonAuxiliaries.gR, mul(proof.gG[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.C_XR = add(anonAuxiliaries.C_XR, mul(proof.C_XG[k], anonAuxiliaries.wPow.neg()));\n anonAuxiliaries.y_XR = add(anonAuxiliaries.y_XR, mul(proof.y_XG[k], anonAuxiliaries.wPow.neg()));\n\n anonAuxiliaries.wPow = anonAuxiliaries.wPow.mul(anonAuxiliaries.w);\n }\n anonAuxiliaries.DR = add(anonAuxiliaries.DR, mul(statement.D, anonAuxiliaries.wPow));\n anonAuxiliaries.gR = add(anonAuxiliaries.gR, mul(g, anonAuxiliaries.wPow));\n\n ZetherAuxiliaries memory zetherAuxiliaries;\n zetherAuxiliaries.y = uint256(keccak256(abi.encode(anonAuxiliaries.w, proof.CPrime, proof.DPrime, proof.CLnPrime, proof.CRnPrime))).mod();\n zetherAuxiliaries.ys = powers(zetherAuxiliaries.y);\n zetherAuxiliaries.z = uint256(keccak256(abi.encode(zetherAuxiliaries.y))).mod();\n zetherAuxiliaries.zs = [zetherAuxiliaries.z.exp(2), zetherAuxiliaries.z.exp(3)]; \n zetherAuxiliaries.zSum = zetherAuxiliaries.zs[0].add(zetherAuxiliaries.zs[1]).mul(zetherAuxiliaries.z);\n zetherAuxiliaries.k = sumScalars(zetherAuxiliaries.ys).mul(zetherAuxiliaries.z.sub(zetherAuxiliaries.zs[0])).sub(zetherAuxiliaries.zSum.mul(2 ** (m / 2)).sub(zetherAuxiliaries.zSum));\n zetherAuxiliaries.t = proof.tHat.sub(zetherAuxiliaries.k);\n for (uint256 i = 0; i < m / 2; i++) {\n zetherAuxiliaries.twoTimesZSquared[i] = zetherAuxiliaries.zs[0].mul(2 ** i);\n zetherAuxiliaries.twoTimesZSquared[i + m / 2] = zetherAuxiliaries.zs[1].mul(2 ** i);\n }\n\n zetherAuxiliaries.x = uint256(keccak256(abi.encode(zetherAuxiliaries.z, proof.tCommits))).mod();\n zetherAuxiliaries.tEval = add(mul(proof.tCommits[0], zetherAuxiliaries.x), mul(proof.tCommits[1], zetherAuxiliaries.x.mul(zetherAuxiliaries.x))); // replace with \"commit\"?\n\n SigmaAuxiliaries memory sigmaAuxiliaries;\n sigmaAuxiliaries.A_y = add(mul(anonAuxiliaries.gR, proof.s_sk), mul(anonAuxiliaries.yR[0][0], proof.c.neg()));\n sigmaAuxiliaries.A_D = add(mul(g, proof.s_r), mul(statement.D, proof.c.neg())); // add(mul(anonAuxiliaries.gR, proof.s_r), mul(anonAuxiliaries.DR, proof.c.neg()));\n sigmaAuxiliaries.gEpoch = mapInto(\"Zether\", statement.epoch);\n sigmaAuxiliaries.A_u = add(mul(sigmaAuxiliaries.gEpoch, proof.s_sk), mul(statement.u, proof.c.neg()));\n sigmaAuxiliaries.A_X = add(mul(anonAuxiliaries.y_XR, proof.s_r), mul(anonAuxiliaries.C_XR, proof.c.neg()));\n sigmaAuxiliaries.c_commit = add(mul(add(mul(add(anonAuxiliaries.DR, proof.DPrime), proof.s_sk), mul(add(anonAuxiliaries.CR[0][0], proof.CPrime), proof.c.neg())), zetherAuxiliaries.zs[0]), mul(add(mul(add(anonAuxiliaries.CRnR, proof.CRnPrime), proof.s_sk), mul(add(anonAuxiliaries.CLnR, proof.CLnPrime), proof.c.neg())), zetherAuxiliaries.zs[1]));\n sigmaAuxiliaries.A_t = add(mul(add(add(mul(g, zetherAuxiliaries.t), mul(h, proof.tauX)), neg(zetherAuxiliaries.tEval)), proof.c.mul(anonAuxiliaries.wPow)), sigmaAuxiliaries.c_commit);\n sigmaAuxiliaries.A_C0 = add(mul(g, proof.s_vTransfer), add(mul(anonAuxiliaries.DR, proof.s_sk), mul(anonAuxiliaries.CR[0][0], proof.c.neg())));\n sigmaAuxiliaries.A_CLn = add(mul(g, proof.s_vDiff), add(mul(anonAuxiliaries.CRnR, proof.s_sk), mul(anonAuxiliaries.CLnR, proof.c.neg())));\n sigmaAuxiliaries.A_CPrime = add(mul(h, proof.s_nuTransfer), add(mul(proof.DPrime, proof.s_sk), mul(proof.CPrime, proof.c.neg())));\n sigmaAuxiliaries.A_CLnPrime = add(mul(h, proof.s_nuDiff), add(mul(proof.CRnPrime, proof.s_sk), mul(proof.CLnPrime, proof.c.neg())));\n\n sigmaAuxiliaries.c = uint256(keccak256(abi.encode(zetherAuxiliaries.x, sigmaAuxiliaries.A_y, sigmaAuxiliaries.A_D, sigmaAuxiliaries.A_u, sigmaAuxiliaries.A_X, sigmaAuxiliaries.A_t, sigmaAuxiliaries.A_C0, sigmaAuxiliaries.A_CLn, sigmaAuxiliaries.A_CPrime, sigmaAuxiliaries.A_CLnPrime))).mod();\n require(sigmaAuxiliaries.c == proof.c, \"Sigma protocol challenge equality failure.\");\n\n IPAuxiliaries memory ipAuxiliaries;\n ipAuxiliaries.o = uint256(keccak256(abi.encode(sigmaAuxiliaries.c))).mod();\n ipAuxiliaries.u_x = mul(g, ipAuxiliaries.o);\n ipAuxiliaries.hPrimes = hadamardInv(hs, zetherAuxiliaries.ys);\n ipAuxiliaries.hExp = addVectors(times(zetherAuxiliaries.ys, zetherAuxiliaries.z), zetherAuxiliaries.twoTimesZSquared);\n ipAuxiliaries.P = add(add(add(proof.BA, mul(proof.BS, zetherAuxiliaries.x)), mul(sumPoints(gs), zetherAuxiliaries.z.neg())), commit(ipAuxiliaries.hPrimes, ipAuxiliaries.hExp));\n ipAuxiliaries.P = add(ipAuxiliaries.P, mul(h, proof.mu.neg()));\n ipAuxiliaries.P = add(ipAuxiliaries.P, mul(ipAuxiliaries.u_x, proof.tHat));\n\n // begin inner product verification\n InnerProductProof memory ipProof = proof.ipProof;\n for (uint256 i = 0; i < n; i++) {\n ipAuxiliaries.o = uint256(keccak256(abi.encode(ipAuxiliaries.o, ipProof.ls[i], ipProof.rs[i]))).mod();\n ipAuxiliaries.challenges[i] = ipAuxiliaries.o; // overwrites value\n uint256 xInv = ipAuxiliaries.o.inv();\n ipAuxiliaries.P = add(ipAuxiliaries.P, add(mul(ipProof.ls[i], ipAuxiliaries.o.exp(2)), mul(ipProof.rs[i], xInv.exp(2))));\n }\n\n ipAuxiliaries.otherExponents[0] = 1;\n for (uint256 i = 0; i < n; i++) {\n ipAuxiliaries.otherExponents[0] = ipAuxiliaries.otherExponents[0].mul(ipAuxiliaries.challenges[i]);\n }\n bool[m] memory bitSet;\n ipAuxiliaries.otherExponents[0] = ipAuxiliaries.otherExponents[0].inv();\n for (uint256 i = 0; i < m/2; ++i) {\n for (uint256 j = 0; (1 << j) + i < m; ++j) {\n uint256 i1 = i + (1 << j);\n if (!bitSet[i1]) {\n uint256 temp = ipAuxiliaries.challenges[n - 1 - j].mul(ipAuxiliaries.challenges[n - 1 - j]);\n ipAuxiliaries.otherExponents[i1] = ipAuxiliaries.otherExponents[i].mul(temp);\n bitSet[i1] = true;\n }\n }\n }\n\n G1Point memory gTemp;\n G1Point memory hTemp;\n for (uint256 i = 0; i < m; i++) {\n gTemp = add(gTemp, mul(gs[i], ipAuxiliaries.otherExponents[i]));\n hTemp = add(hTemp, mul(ipAuxiliaries.hPrimes[i], ipAuxiliaries.otherExponents[m - 1 - i]));\n }\n G1Point memory cProof = add(add(mul(gTemp, ipProof.a), mul(hTemp, ipProof.b)), mul(ipAuxiliaries.u_x, ipProof.a.mul(ipProof.b)));\n require(eq(ipAuxiliaries.P, cProof), \"Inner product equality check failure.\");\n\n return true;\n }\n\n function assemblePolynomials(uint256[2][] memory f) internal view returns (uint256[2][] memory result) {\n uint256 m = f.length / 2;\n uint256 N = 2 ** m;\n result = new uint256[2][](N);\n for (uint256 i = 0; i < 2; i++) {\n uint256[] memory half = recursivePolynomials(i * m, (i + 1) * m, 1, f);\n for (uint256 j = 0; j < N; j++) {\n result[j][i] = half[j];\n }\n }\n }\n\n function recursivePolynomials(uint256 baseline, uint256 current, uint256 accum, uint256[2][] memory f) internal view returns (uint256[] memory result) {\n // have to do a bunch of re-allocating because solidity won't let me have something which is internal and also modifies (internal) state. (?)\n uint256 size = 2 ** (current - baseline); // size is at least 2...\n result = new uint256[](size);\n\n if (current == baseline) {\n result[0] = accum;\n return result;\n }\n current = current - 1;\n\n uint256[] memory left = recursivePolynomials(baseline, current, accum.mul(f[current][0]), f);\n uint256[] memory right = recursivePolynomials(baseline, current, accum.mul(f[current][1]), f);\n for (uint256 i = 0; i < size / 2; i++) {\n result[i] = left[i];\n result[i + size / 2] = right[i];\n }\n }\n\n function assembleConvolutions(uint256[2][] memory exponent, G1Point[] memory base) internal view returns (G1Point[2][] memory result) {\n // exponent is two \"rows\" (actually columns).\n // will return two rows, each of half the length of the exponents;\n // namely, we will return the Hadamards of \"base\" by the even circular shifts of \"exponent\"'s rows.\n uint256 size = exponent.length;\n uint256 half = size / 2;\n result = new G1Point[2][](half); // assuming that this is necessary even when return is declared up top\n\n G1Point[] memory base_fft = fft(base, false);\n\n uint256[] memory exponent_fft = new uint256[](size);\n for (uint256 i = 0; i < 2; i++) {\n for (uint256 j = 0; j < size; j++) {\n exponent_fft[j] = exponent[(size - j) % size][i]; // convolutional flip plus copy\n }\n\n exponent_fft = fft(exponent_fft);\n G1Point[] memory inverse_fft = new G1Point[](half);\n uint256 compensation = 2;\n compensation = compensation.inv();\n for (uint256 j = 0; j < half; j++) { // Hadamard\n inverse_fft[j] = mul(add(mul(base_fft[j], exponent_fft[j]), mul(base_fft[j + half], exponent_fft[j + half])), compensation);\n }\n\n inverse_fft = fft(inverse_fft, true);\n for (uint256 j = 0; j < half; j++) {\n result[j][i] = inverse_fft[j];\n }\n }\n }\n\n function fft(G1Point[] memory input, bool inverse) internal view returns (G1Point[] memory result) {\n uint256 size = input.length;\n if (size == 1) {\n return input;\n }\n require(size % 2 == 0, \"Input size is not a power of 2!\");\n\n uint256 omega = UNITY.exp(2**28 / size);\n uint256 compensation = 1;\n if (inverse) {\n omega = omega.inv();\n compensation = 2;\n }\n compensation = compensation.inv();\n G1Point[] memory even = fft(extract(input, 0), inverse);\n G1Point[] memory odd = fft(extract(input, 1), inverse);\n uint256 omega_run = 1;\n result = new G1Point[](size);\n for (uint256 i = 0; i < size / 2; i++) {\n G1Point memory temp = mul(odd[i], omega_run);\n result[i] = mul(add(even[i], temp), compensation);\n result[i + size / 2] = mul(add(even[i], neg(temp)), compensation);\n omega_run = omega_run.mul(omega);\n }\n }\n\n function extract(G1Point[] memory input, uint256 parity) internal pure returns (G1Point[] memory result) {\n result = new G1Point[](input.length / 2);\n for (uint256 i = 0; i < input.length / 2; i++) {\n result[i] = input[2 * i + parity];\n }\n }\n\n function fft(uint256[] memory input) internal view returns (uint256[] memory result) {\n uint256 size = input.length;\n if (size == 1) {\n return input;\n }\n require(size % 2 == 0, \"Input size is not a power of 2!\");\n\n uint256 omega = UNITY.exp(2**28 / size);\n uint256[] memory even = fft(extract(input, 0));\n uint256[] memory odd = fft(extract(input, 1));\n uint256 omega_run = 1;\n result = new uint256[](size);\n for (uint256 i = 0; i < size / 2; i++) {\n uint256 temp = odd[i].mul(omega_run);\n result[i] = even[i].add(temp);\n result[i + size / 2] = even[i].sub(temp);\n omega_run = omega_run.mul(omega);\n }\n }\n\n function extract(uint256[] memory input, uint256 parity) internal pure returns (uint256[] memory result) {\n result = new uint256[](input.length / 2);\n for (uint256 i = 0; i < input.length / 2; i++) {\n result[i] = input[2 * i + parity];\n }\n }\n\n function unserialize(bytes memory arr) internal pure returns (ZetherProof memory proof) {\n proof.BA = G1Point(slice(arr, 0), slice(arr, 32));\n proof.BS = G1Point(slice(arr, 64), slice(arr, 96));\n proof.A = G1Point(slice(arr, 128), slice(arr, 160));\n proof.B = G1Point(slice(arr, 192), slice(arr, 224));\n proof.C = G1Point(slice(arr, 256), slice(arr, 288));\n proof.D = G1Point(slice(arr, 320), slice(arr, 352));\n proof.E = G1Point(slice(arr, 384), slice(arr, 416));\n proof.F = G1Point(slice(arr, 448), slice(arr, 480));\n\n uint256 m = (arr.length - 2144) / 576;\n proof.CLnG = new G1Point[](m);\n proof.CRnG = new G1Point[](m);\n proof.C_0G = new G1Point[](m);\n proof.DG = new G1Point[](m);\n proof.y_0G = new G1Point[](m);\n proof.gG = new G1Point[](m);\n proof.C_XG = new G1Point[](m);\n proof.y_XG = new G1Point[](m);\n proof.f = new uint256[](2 * m);\n for (uint256 k = 0; k < m; k++) {\n proof.CLnG[k] = G1Point(slice(arr, 512 + k * 64), slice(arr, 544 + k * 64));\n proof.CRnG[k] = G1Point(slice(arr, 512 + (m + k) * 64), slice(arr, 544 + (m + k) * 64));\n proof.C_0G[k] = G1Point(slice(arr, 512 + m * 128 + k * 64), slice(arr, 544 + m * 128 + k * 64));\n proof.DG[k] = G1Point(slice(arr, 512 + m * 192 + k * 64), slice(arr, 544 + m * 192 + k * 64));\n proof.y_0G[k] = G1Point(slice(arr, 512 + m * 256 + k * 64), slice(arr, 544 + m * 256 + k * 64));\n proof.gG[k] = G1Point(slice(arr, 512 + m * 320 + k * 64), slice(arr, 544 + m * 320 + k * 64));\n proof.C_XG[k] = G1Point(slice(arr, 512 + m * 384 + k * 64), slice(arr, 544 + m * 384 + k * 64));\n proof.y_XG[k] = G1Point(slice(arr, 512 + m * 448 + k * 64), slice(arr, 544 + m * 448 + k * 64));\n proof.f[k] = slice(arr, 512 + m * 512 + k * 32);\n proof.f[k + m] = slice(arr, 512 + m * 544 + k * 32);\n }\n uint256 starting = m * 576;\n proof.z_A = slice(arr, 512 + starting);\n proof.z_C = slice(arr, 544 + starting);\n proof.z_E = slice(arr, 576 + starting);\n\n proof.CPrime = G1Point(slice(arr, 608 + starting), slice(arr, 640 + starting));\n proof.DPrime = G1Point(slice(arr, 672 + starting), slice(arr, 704 + starting));\n proof.CLnPrime = G1Point(slice(arr, 736 + starting), slice(arr, 768 + starting));\n proof.CRnPrime = G1Point(slice(arr, 800 + starting), slice(arr, 832 + starting));\n\n proof.tCommits = [G1Point(slice(arr, 864 + starting), slice(arr, 896 + starting)), G1Point(slice(arr, 928 + starting), slice(arr, 960 + starting))];\n proof.tHat = slice(arr, 992 + starting);\n proof.tauX = slice(arr, 1024 + starting);\n proof.mu = slice(arr, 1056 + starting);\n\n proof.c = slice(arr, 1088 + starting);\n proof.s_sk = slice(arr, 1120 + starting);\n proof.s_r = slice(arr, 1152 + starting);\n proof.s_vTransfer = slice(arr, 1184 + starting);\n proof.s_vDiff = slice(arr, 1216 + starting);\n proof.s_nuTransfer = slice(arr, 1248 + starting);\n proof.s_nuDiff = slice(arr, 1280 + starting);\n\n InnerProductProof memory ipProof;\n for (uint256 i = 0; i < n; i++) {\n ipProof.ls[i] = G1Point(slice(arr, 1312 + starting + i * 64), slice(arr, 1344 + starting + i * 64));\n ipProof.rs[i] = G1Point(slice(arr, 1312 + starting + (n + i) * 64), slice(arr, 1344 + starting + (n + i) * 64));\n }\n ipProof.a = slice(arr, 1312 + starting + n * 128);\n ipProof.b = slice(arr, 1344 + starting + n * 128);\n proof.ipProof = ipProof;\n\n return proof;\n }\n\n function addVectors(uint256[m] memory a, uint256[m] memory b) internal pure returns (uint256[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = a[i].add(b[i]);\n }\n }\n\n function hadamardInv(G1Point[] memory ps, uint256[m] memory ss) internal view returns (G1Point[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = mul(ps[i], ss[i].inv());\n }\n }\n\n function sumScalars(uint256[m] memory ys) internal pure returns (uint256 result) {\n for (uint256 i = 0; i < m; i++) {\n result = result.add(ys[i]);\n }\n }\n\n function sumPoints(G1Point[] memory ps) internal view returns (G1Point memory sum) {\n for (uint256 i = 0; i < m; i++) {\n sum = add(sum, ps[i]);\n }\n }\n\n function commit(G1Point[m] memory ps, uint256[m] memory ss) internal view returns (G1Point memory result) {\n for (uint256 i = 0; i < m; i++) {\n result = add(result, mul(ps[i], ss[i]));\n }\n }\n\n function powers(uint256 base) internal pure returns (uint256[m] memory powers) {\n powers[0] = 1;\n powers[1] = base;\n for (uint256 i = 2; i < m; i++) {\n powers[i] = powers[i - 1].mul(base);\n }\n }\n\n function times(uint256[m] memory v, uint256 x) internal pure returns (uint256[m] memory result) {\n for (uint256 i = 0; i < m; i++) {\n result[i] = v[i].mul(x);\n }\n }\n\n function slice(bytes memory input, uint256 start) internal pure returns (uint256 result) { // extracts exactly 32 bytes\n assembly {\n let m := mload(0x40)\n mstore(m, mload(add(add(input, 0x20), start))) // why only 0x20?\n result := mload(m)\n }\n }\n\n struct G1Point {\n uint256 x;\n uint256 y;\n }\n\n function add(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {\n assembly {\n let m := mload(0x40)\n mstore(m, mload(p1))\n mstore(add(m, 0x20), mload(add(p1, 0x20)))\n mstore(add(m, 0x40), mload(p2))\n mstore(add(m, 0x60), mload(add(p2, 0x20)))\n if iszero(staticcall(gas, 0x06, m, 0x80, r, 0x40)) {\n revert(0, 0)\n }\n }\n }\n\n function mul(G1Point memory p, uint256 s) internal view returns (G1Point memory r) {\n assembly {\n let m := mload(0x40)\n mstore(m, mload(p))\n mstore(add(m, 0x20), mload(add(p, 0x20)))\n mstore(add(m, 0x40), s)\n if iszero(staticcall(gas, 0x07, m, 0x60, r, 0x40)) {\n revert(0, 0)\n }\n }\n }\n\n function neg(G1Point memory p) internal pure returns (G1Point memory) {\n return G1Point(p.x, FIELD_ORDER - (p.y % FIELD_ORDER)); // p.y should already be reduced mod P?\n }\n\n function eq(G1Point memory p1, G1Point memory p2) internal pure returns (bool) {\n return p1.x == p2.x && p1.y == p2.y;\n }\n\n function fieldExp(uint256 base, uint256 exponent) internal view returns (uint256 output) { // warning: mod p, not q\n uint256 order = FIELD_ORDER;\n assembly {\n let m := mload(0x40)\n mstore(m, 0x20)\n mstore(add(m, 0x20), 0x20)\n mstore(add(m, 0x40), 0x20)\n mstore(add(m, 0x60), base)\n mstore(add(m, 0x80), exponent)\n mstore(add(m, 0xa0), order)\n if iszero(staticcall(gas, 0x05, m, 0xc0, m, 0x20)) { // staticcall or call?\n revert(0, 0)\n }\n output := mload(m)\n }\n }\n\n function mapInto(uint256 seed) internal view returns (G1Point memory) {\n uint256 y;\n while (true) {\n uint256 ySquared = fieldExp(seed, 3) + 3; // addmod instead of add: waste of gas, plus function overhead cost\n y = fieldExp(ySquared, (FIELD_ORDER + 1) / 4);\n if (fieldExp(y, 2) == ySquared) {\n break;\n }\n seed += 1;\n }\n return G1Point(seed, y);\n }\n\n function mapInto(string memory input) internal view returns (G1Point memory) {\n return mapInto(uint256(keccak256(abi.encodePacked(input))) % FIELD_ORDER);\n }\n\n function mapInto(string memory input, uint256 i) internal view returns (G1Point memory) {\n return mapInto(uint256(keccak256(abi.encodePacked(input, i))) % FIELD_ORDER);\n }\n}\n", "sourcePath": "/Users/benediamond/anonymous-zether/packages/protocol/contracts/ZetherVerifier.sol", "compiler": { "name": "solc", @@ -68,7 +68,7 @@ }, "networks": {}, "schemaVersion": "3.0.19", - "updatedAt": "2019-12-12T19:10:52.550Z", + "updatedAt": "2019-12-26T18:28:14.461Z", "devdoc": { "methods": {} }, diff --git a/packages/protocol/contracts/BurnVerifier.sol b/packages/protocol/contracts/BurnVerifier.sol index a7ef814b..22b9c3cd 100644 --- a/packages/protocol/contracts/BurnVerifier.sol +++ b/packages/protocol/contracts/BurnVerifier.sol @@ -26,8 +26,8 @@ contract BurnVerifier { } struct BurnProof { - G1Point A; - G1Point S; + G1Point BA; + G1Point BS; G1Point CLnPrime; G1Point CRnPrime; @@ -114,7 +114,7 @@ contract BurnVerifier { uint256 statementHash = uint256(keccak256(abi.encode(statement.CLn, statement.CRn, statement.y, statement.bTransfer, statement.epoch, statement.sender))).mod(); // stacktoodeep? BurnAuxiliaries memory burnAuxiliaries; - burnAuxiliaries.y = uint256(keccak256(abi.encode(statementHash, proof.A, proof.S, proof.CLnPrime, proof.CRnPrime))).mod(); + burnAuxiliaries.y = uint256(keccak256(abi.encode(statementHash, proof.BA, proof.BS, proof.CLnPrime, proof.CRnPrime))).mod(); burnAuxiliaries.ys = powers(burnAuxiliaries.y); burnAuxiliaries.z = uint256(keccak256(abi.encode(burnAuxiliaries.y))).mod(); burnAuxiliaries.zs = [burnAuxiliaries.z.exp(2)]; @@ -145,7 +145,7 @@ contract BurnVerifier { ipAuxiliaries.u_x = mul(g, ipAuxiliaries.o); ipAuxiliaries.hPrimes = hadamardInv(hs, burnAuxiliaries.ys); ipAuxiliaries.hExp = addVectors(times(burnAuxiliaries.ys, burnAuxiliaries.z), burnAuxiliaries.twoTimesZSquared); - ipAuxiliaries.P = add(add(add(proof.A, mul(proof.S, burnAuxiliaries.x)), mul(sumPoints(gs), burnAuxiliaries.z.neg())), commit(ipAuxiliaries.hPrimes, ipAuxiliaries.hExp)); + ipAuxiliaries.P = add(add(add(proof.BA, mul(proof.BS, burnAuxiliaries.x)), mul(sumPoints(gs), burnAuxiliaries.z.neg())), commit(ipAuxiliaries.hPrimes, ipAuxiliaries.hExp)); ipAuxiliaries.P = add(ipAuxiliaries.P, mul(h, proof.mu.neg())); ipAuxiliaries.P = add(ipAuxiliaries.P, mul(ipAuxiliaries.u_x, proof.tHat)); @@ -200,8 +200,8 @@ contract BurnVerifier { } function unserialize(bytes memory arr) internal pure returns (BurnProof memory proof) { - proof.A = G1Point(slice(arr, 0), slice(arr, 32)); - proof.S = G1Point(slice(arr, 64), slice(arr, 96)); + proof.BA = G1Point(slice(arr, 0), slice(arr, 32)); + proof.BS = G1Point(slice(arr, 64), slice(arr, 96)); proof.CLnPrime = G1Point(slice(arr, 128), slice(arr, 160)); proof.CRnPrime = G1Point(slice(arr, 192), slice(arr, 224)); diff --git a/packages/protocol/contracts/ZSC.sol b/packages/protocol/contracts/ZSC.sol index 04285057..93b39815 100644 --- a/packages/protocol/contracts/ZSC.sol +++ b/packages/protocol/contracts/ZSC.sol @@ -10,7 +10,6 @@ contract ZSC { BurnVerifier burnverifier; uint256 public epochLength; // now in milliseconds. - uint256 bTotal = 0; // could use erc20.balanceOf(this), but (even pure / view) calls cost gas during EVM execution uint256 constant MAX = 4294967295; // 2^32 - 1 // no sload for constants...! mapping(bytes32 => bytes32[2][2]) acc; // main account mapping mapping(bytes32 => bytes32[2][2]) pTransfers; // storage for pending transfers @@ -37,7 +36,7 @@ contract ZSC { uint256 size = y.length; accounts = new bytes32[2][2][](size); for (uint256 i = 0; i < size; i++) { - bytes32 yHash = keccak256(abi.encodePacked(y[i])); + bytes32 yHash = keccak256(abi.encode(y[i])); accounts[i] = acc[yHash]; if (lastRollOver[yHash] < epoch) { bytes32[2][2] memory scratch = pTransfers[yHash]; @@ -94,18 +93,15 @@ contract ZSC { } function fund(bytes32[2] calldata y, uint256 bTransfer) external { - bytes32 yHash = keccak256(abi.encodePacked(y)); + bytes32 yHash = keccak256(abi.encode(y)); rollOver(yHash); - // registration check here would be redundant, as any `transferFrom` the 0 address will necessarily fail. save an sload require(bTransfer <= MAX, "Deposit amount out of range."); // uint, so other way not necessary? - require(bTransfer + bTotal <= MAX, "Fund pushes contract past maximum value."); - // if pTransfers[yHash] == [0, 0, 0, 0] then an add and a write will be equivalent... + bytes32[2] memory scratch = pTransfers[yHash][0]; - // won't let me assign this array using literals / casts assembly { - let m := mload(0x40) let result := 1 + let m := mload(0x40) mstore(m, mload(scratch)) mstore(add(m, 0x20), mload(add(scratch, 0x20))) mstore(add(m, 0x40), 0x077da99d806abd13c9f15ece5398525119d11e11e9836b2ee7d23f6159ad87d4) @@ -119,7 +115,7 @@ contract ZSC { } pTransfers[yHash][0] = scratch; require(coin.transferFrom(msg.sender, address(this), bTransfer), "Transfer from sender failed."); - bTotal += bTransfer; + require(coin.balanceOf(address(this)) <= MAX, "Fund pushes contract past maximum value."); } function transfer(bytes32[2][] memory C, bytes32[2] memory D, bytes32[2][] memory y, bytes32[2] memory u, bytes memory proof) public { @@ -127,12 +123,13 @@ contract ZSC { bytes32[2][] memory CLn = new bytes32[2][](size); bytes32[2][] memory CRn = new bytes32[2][](size); require(C.length == size, "Input array length mismatch!"); - uint256 result = 1; - for (uint256 i = 0; i < y.length; i++) { - bytes32 yHash = keccak256(abi.encodePacked(y[i])); + + for (uint256 i = 0; i < size; i++) { + bytes32 yHash = keccak256(abi.encode(y[i])); rollOver(yHash); bytes32[2][2] memory scratch = pTransfers[yHash]; assembly { + let result := 1 let m := mload(0x40) mstore(m, mload(mload(scratch))) mstore(add(m, 0x20), mload(add(mload(scratch), 0x20))) @@ -148,10 +145,14 @@ contract ZSC { mstore(add(m, 0x40), mload(D)) mstore(add(m, 0x60), sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(add(D, 0x20)))) // invert! result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(scratch, 0x20)), 0x40)) + if iszero(result) { + revert(0, 0) + } } pTransfers[yHash] = scratch; // credit / debit / neither y's account. scratch = acc[yHash]; assembly { + let result := 1 let m := mload(0x40) mstore(m, mload(mload(scratch))) mstore(add(m, 0x20), mload(add(mload(scratch), 0x20))) @@ -163,12 +164,14 @@ contract ZSC { mstore(add(m, 0x40), mload(D)) mstore(add(m, 0x60), sub(0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, mload(add(D, 0x20)))) result := and(result, staticcall(gas, 0x06, m, 0x80, mload(add(add(CRn, 0x20), mul(i, 0x20))), 0x40)) + if iszero(result) { + revert(0, 0) + } } } - require(result == 1, "Elliptic curve operations failure. Bad points?"); bool seen = false; - bytes32 uHash = keccak256(abi.encodePacked(u)); + bytes32 uHash = keccak256(abi.encode(u)); for (uint256 i = 0; i < nonceSet.length; i++) { if (nonceSet[i] == uHash) { seen = true; @@ -183,7 +186,7 @@ contract ZSC { } function burn(bytes32[2] memory y, uint256 bTransfer, bytes32[2] memory u, bytes memory proof) public { - bytes32 yHash = keccak256(abi.encodePacked(y)); + bytes32 yHash = keccak256(abi.encode(y)); rollOver(yHash); require(0 <= bTransfer && bTransfer <= MAX, "Transfer amount out of range."); @@ -220,7 +223,7 @@ contract ZSC { } } bool seen = false; - bytes32 uHash = keccak256(abi.encodePacked(u)); + bytes32 uHash = keccak256(abi.encode(u)); for (uint256 i = 0; i < nonceSet.length; i++) { if (nonceSet[i] == uHash) { // does this have to repeat the sload for each iteration?!? revisit seen = true; @@ -230,7 +233,6 @@ contract ZSC { require(!seen, "Nonce already seen!"); require(burnverifier.verifyBurn(scratch[0], scratch[1], y, bTransfer, lastGlobalUpdate, u, msg.sender, proof), "Burn proof verification failed!"); require(coin.transfer(msg.sender, bTransfer), "This shouldn't fail... Something went severely wrong."); - bTotal -= bTransfer; nonceSet.push(uHash); } } diff --git a/packages/protocol/contracts/ZetherVerifier.sol b/packages/protocol/contracts/ZetherVerifier.sol index 12f8920f..81187875 100644 --- a/packages/protocol/contracts/ZetherVerifier.sol +++ b/packages/protocol/contracts/ZetherVerifier.sol @@ -11,8 +11,8 @@ contract ZetherVerifier { uint256 constant FIELD_ORDER = 21888242871839275222246405745257275088696311157297823662689037894645226208583; uint256 constant UNITY = 9334303377689037989442018753807510978357674015322511348041267794643984346845; // primitive 2^28th root of unity modulo GROUP_ORDER (not field!) - G1Point[] gs; // warning: this and the below are not statically sized anymore - G1Point[] hs; // need to push to these if large anonsets are used. + G1Point[] gs; + G1Point[] hs; G1Point g; G1Point h; @@ -22,7 +22,7 @@ contract ZetherVerifier { G1Point[] C; G1Point D; G1Point[] y; - uint256 epoch; // or uint8? + uint256 epoch; G1Point u; } @@ -140,9 +140,9 @@ contract ZetherVerifier { struct AnonAuxiliaries { uint256 m; uint256 N; - uint256 d; + uint256 v; uint256 w; - uint256 dPow; + uint256 vPow; uint256 wPow; uint256[2][] f; // could just allocate extra space in the proof? uint256[2][] r; // each poly is an array of length N. evaluations of prods @@ -171,8 +171,8 @@ contract ZetherVerifier { uint256 statementHash = uint256(keccak256(abi.encode(statement.CLn, statement.CRn, statement.C, statement.D, statement.y, statement.epoch))).mod(); AnonAuxiliaries memory anonAuxiliaries; - anonAuxiliaries.d = uint256(keccak256(abi.encode(statementHash, proof.BA, proof.BS, proof.A, proof.B, proof.C, proof.D, proof.E, proof.F))).mod(); - anonAuxiliaries.w = uint256(keccak256(abi.encode(anonAuxiliaries.d, proof.CLnG, proof.CRnG, proof.C_0G, proof.DG, proof.y_0G, proof.gG, proof.C_XG, proof.y_XG))).mod(); + anonAuxiliaries.v = uint256(keccak256(abi.encode(statementHash, proof.BA, proof.BS, proof.A, proof.B, proof.C, proof.D, proof.E, proof.F))).mod(); + anonAuxiliaries.w = uint256(keccak256(abi.encode(anonAuxiliaries.v, proof.CLnG, proof.CRnG, proof.C_0G, proof.DG, proof.y_0G, proof.gG, proof.C_XG, proof.y_XG))).mod(); anonAuxiliaries.m = proof.f.length / 2; anonAuxiliaries.N = 2 ** anonAuxiliaries.m; anonAuxiliaries.f = new uint256[2][](2 * anonAuxiliaries.m); @@ -203,12 +203,12 @@ contract ZetherVerifier { anonAuxiliaries.CLnR = add(anonAuxiliaries.CLnR, mul(statement.CLn[i], anonAuxiliaries.r[i][0])); anonAuxiliaries.CRnR = add(anonAuxiliaries.CRnR, mul(statement.CRn[i], anonAuxiliaries.r[i][0])); } - anonAuxiliaries.dPow = 1; + anonAuxiliaries.vPow = 1; for (uint256 i = 0; i < anonAuxiliaries.N; i++) { - anonAuxiliaries.C_XR = add(anonAuxiliaries.C_XR, mul(anonAuxiliaries.CR[i / 2][i % 2], anonAuxiliaries.dPow)); - anonAuxiliaries.y_XR = add(anonAuxiliaries.y_XR, mul(anonAuxiliaries.yR[i / 2][i % 2], anonAuxiliaries.dPow)); + anonAuxiliaries.C_XR = add(anonAuxiliaries.C_XR, mul(anonAuxiliaries.CR[i / 2][i % 2], anonAuxiliaries.vPow)); + anonAuxiliaries.y_XR = add(anonAuxiliaries.y_XR, mul(anonAuxiliaries.yR[i / 2][i % 2], anonAuxiliaries.vPow)); if (i > 0) { - anonAuxiliaries.dPow = anonAuxiliaries.dPow.mul(anonAuxiliaries.d); + anonAuxiliaries.vPow = anonAuxiliaries.vPow.mul(anonAuxiliaries.v); } } anonAuxiliaries.wPow = 1; diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 770e1260..b832c063 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -4,7 +4,7 @@ "description": "", "main": "./lib", "dependencies": { - "bn.js": "^5.0.0", + "bn.js": "^5.1.1", "elliptic": "^6.5.1", "web3": "^1.2.4" }, diff --git a/yarn.lock b/yarn.lock index 384caa64..9472d97a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1137,10 +1137,10 @@ bn.js@4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.0, bn.js@^4. resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -bn.js@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.0.0.tgz#5c3d398021b3ddb548c1296a16f857e908f35c70" - integrity sha512-bVwDX8AF+72fIUNuARelKAlQUNtPOfG2fRxorbVvFk4zpHbqLrPdOGfVg5vrKwVzLLePqPBiATaOZNELQzmS0A== +bn.js@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.1.tgz#48efc4031a9c4041b9c99c6941d903463ab62eb5" + integrity sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA== body-parser@1.19.0, body-parser@^1.16.0: version "1.19.0"