aboutsummaryrefslogtreecommitdiffstats
path: root/packages/migrations/artifacts/2.0.0/TestSignatureValidator.json
blob: 1bb19704c6eead3d4efd82c10aefcc2b31b09ab9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
{
    "schemaVersion": "2.0.0",
    "contractName": "TestSignatureValidator",
    "compilerOutput": {
        "abi": [
            {
                "constant": false,
                "inputs": [
                    {
                        "name": "hash",
                        "type": "bytes32"
                    },
                    {
                        "name": "signer",
                        "type": "address"
                    },
                    {
                        "name": "signature",
                        "type": "bytes"
                    }
                ],
                "name": "preSign",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "name": "",
                        "type": "bytes32"
                    }
                ],
                "name": "transactions",
                "outputs": [
                    {
                        "name": "",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "name": "validator",
                        "type": "address"
                    },
                    {
                        "name": "approval",
                        "type": "bool"
                    }
                ],
                "name": "setSignatureValidatorApproval",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "name": "",
                        "type": "address"
                    },
                    {
                        "name": "",
                        "type": "address"
                    }
                ],
                "name": "allowedValidators",
                "outputs": [
                    {
                        "name": "",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "name": "",
                        "type": "bytes32"
                    },
                    {
                        "name": "",
                        "type": "address"
                    }
                ],
                "name": "preSigned",
                "outputs": [
                    {
                        "name": "",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "name": "hash",
                        "type": "bytes32"
                    },
                    {
                        "name": "signer",
                        "type": "address"
                    },
                    {
                        "name": "signature",
                        "type": "bytes"
                    }
                ],
                "name": "publicIsValidSignature",
                "outputs": [
                    {
                        "name": "isValid",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "name": "salt",
                        "type": "uint256"
                    },
                    {
                        "name": "signer",
                        "type": "address"
                    },
                    {
                        "name": "data",
                        "type": "bytes"
                    },
                    {
                        "name": "signature",
                        "type": "bytes"
                    }
                ],
                "name": "executeTransaction",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "currentContextAddress",
                "outputs": [
                    {
                        "name": "",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            }
        ],
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x608060405234801561001057600080fd5b506115ce806100206000396000f30060806040526004361061008d5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633683ef8e8114610092578063642f2eaf146100b457806377fcce68146100ea5780637b8e35141461010a57806382c174d01461012a578063abba41cc1461014a578063bfc8bfce1461016a578063eea086ba1461018a575b600080fd5b34801561009e57600080fd5b506100b26100ad366004611264565b6101ac565b005b3480156100c057600080fd5b506100d46100cf366004611227565b610278565b6040516100e19190611437565b60405180910390f35b3480156100f657600080fd5b506100b26101053660046111d9565b61028d565b34801561011657600080fd5b506100d461012536600461119f565b6102d2565b34801561013657600080fd5b506100d4610145366004611245565b6102f2565b34801561015657600080fd5b506100d46101653660046112cc565b61030f565b34801561017657600080fd5b506100b2610185366004611331565b610324565b34801561019657600080fd5b5061019f610656565b6040516100e19190611429565b6101e7848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750610665945050505050565b60408051808201909152601181527f494e56414c49445f5349474e415455524500000000000000000000000000000060208201529015156102475760405160e560020a62461bcd02815260040161023e91906114d0565b60405180910390fd5b505050600091825260208281526040808420600160a060020a0390931684529190529020805460ff19166001179055565b60026020526000908152604090205460ff1681565b6000610297610e3d565b600160a060020a03908116600090815260016020908152604080832096909316825294909452909220805460ff191691151591909117905550565b600160209081526000928352604080842090915290825290205460ff1681565b600060208181529281526040808220909352908152205460ff1681565b600061031c848484610665565b949350505050565b60035460408051808201909152601281527f5245454e5452414e43595f494c4c4547414c00000000000000000000000000006020820152600091600160a060020a0316156103885760405160e560020a62461bcd02815260040161023e91906114d0565b5030868887876040516020018086600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018481526020018383808284378201915050955050505050506040516020818303038152906040526040518082805190602001908083835b602083106104395780518252601f19909201916020918201910161041a565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008181526002835285902054838601909552600f83527f494e56414c49445f54585f48415348000000000000000000000000000000000091830191909152955093505060ff161590506104ca5760405160e560020a62461bcd02815260040161023e91906114d0565b50600160a060020a038616331461059757610516818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750610665945050505050565b60408051808201909152601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015290151561056d5760405160e560020a62461bcd02815260040161023e91906114d0565b506003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b60008181526002602052604090819020805460ff191660011790555130908690869080838380828437820191505092505050600060405180830381855af460408051808201909152601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015292501515905061062f5760405160e560020a62461bcd02815260040161023e91906114d0565b50506003805473ffffffffffffffffffffffffffffffffffffffff19169055505050505050565b600354600160a060020a031681565b6000806000806000806000808851116040805190810160405280601e81526020017f4c454e4754485f475245415445525f5448414e5f305f524551554952454400008152509015156106cd5760405160e560020a62461bcd02815260040161023e91906114d0565b506106d788610e6c565b60f860020a900460ff1660088111156106ec57fe5b955060008660088111156106fc57fe5b141561075057604080518082018252601181527f5349474e41545552455f494c4c4547414c0000000000000000000000000000006020820152905160e560020a62461bcd02815261023e91906004016114d0565b600186600881111561075e57fe5b14156107c657875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156107bc5760405160e560020a62461bcd02815260040161023e91906114d0565b5060009650610e30565b60028660088111156107d457fe5b14156108dc57875160408051808201909152601281527f4c454e4754485f36365f524551554952454400000000000000000000000000006020820152906041146108345760405160e560020a62461bcd02815260040161023e91906114d0565b5087600081518110151561084457fe5b016020015160f860020a908190048102049450610862886001610ef6565b935061086f886021610ef6565b925060018a86868660405160008152602001604052604051610894949392919061149b565b60206040516020810390808403906000865af11580156108b8573d6000803e3d6000fd5b5050604051601f190151600160a060020a038b81169082161498509250610e309050565b60038660088111156108ea57fe5b1415610a9657875160408051808201909152601281527f4c454e4754485f36365f5245515549524544000000000000000000000000000060208201529060411461094a5760405160e560020a62461bcd02815260040161023e91906114d0565b5087600081518110151561095a57fe5b016020015160f860020a908190048102049450610978886001610ef6565b9350610985886021610ef6565b925060016040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152508b6040516020018083805190602001908083835b602083106109f25780518252601f1990920191602091820191016109d3565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310610a525780518252601f199092019160209182019101610a33565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008352910192839052610894945092508991899150889061149b565b6004866008811115610aa457fe5b1415610b1657875160408051808201909152601181527f4c454e4754485f315f524551554952454400000000000000000000000000000060208201529015610b025760405160e560020a62461bcd02815260040161023e91906114d0565b50600160a060020a03891633149650610e30565b6005866008811115610b2457fe5b1415610bca576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a038a1690631626ba7e90610b71908d908c9060040161147b565b602060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bc39190810190611209565b9650610e30565b6006866008811115610bd857fe5b1415610c6b57610be788610f8a565b600160a060020a03808b1660009081526001602090815260408083209385168352929052205490915060ff161515610c225760009650610e30565b6040517f93634702000000000000000000000000000000000000000000000000000000008152600160a060020a03821690639363470290610b71908d908d908d90600401611445565b6007866008811115610c7957fe5b1415610caa5760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610e30565b6008866008811115610cb857fe5b1415610da357875160408051808201909152601281527f4c454e4754485f36365f52455155495245440000000000000000000000000000602082015290604114610d185760405160e560020a62461bcd02815260040161023e91906114d0565b50876000815181101515610d2857fe5b016020015160f860020a908190048102049450610d46886001610ef6565b9350610d53886021610ef6565b604080518082018252601b8082527f19457468657265756d205369676e6564204d6573736167653a0a4100000000006020808401918252935194975060019492938f9301918291908083836109f2565b6007866008811115610db157fe5b1415610de25760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610e30565b604080518082018252601581527f5349474e41545552455f554e535550504f5254454400000000000000000000006020820152905160e560020a62461bcd02815261023e91906004016114d0565b5050505050509392505050565b6003546000908190600160a060020a031615610e6457600354600160a060020a0316610e66565b335b92915050565b805160408051808201909152601e81527f4c656e677468206d7573742062652067726561746572207468616e20302e000060208201526000918210610ec75760405160e560020a62461bcd02815260040161023e91906114d0565b50815182906000198101908110610eda57fe5b01602001518251600019019092525060f860020a908190040290565b60008160200183511015606060405190810160405280602b81526020017f4c656e677468206d7573742062652067726561746572207468616e206f72206581526020017f7175616c20746f2033322e000000000000000000000000000000000000000000815250901515610f805760405160e560020a62461bcd02815260040161023e91906114d0565b5050016020015190565b6000601482511015606060405190810160405280602b81526020017f4c656e677468206d7573742062652067726561746572207468616e206f72206581526020017f7175616c20746f2032302e0000000000000000000000000000000000000000008152509015156110125760405160e560020a62461bcd02815260040161023e91906114d0565b5061102182601484510361102e565b8251601319019092525090565b60008160140183511015606060405190810160405280602b81526020017f4c656e677468206d7573742062652067726561746572207468616e206f72206581526020017f7175616c20746f2032302e0000000000000000000000000000000000000000008152509015156110b85760405160e560020a62461bcd02815260040161023e91906114d0565b50500160140151600160a060020a031690565b60006110d78235611534565b9392505050565b60006110d78235611540565b60006110d78251611540565b60006110d78235611545565b600080601f8301841361111457600080fd5b50813567ffffffffffffffff81111561112c57600080fd5b60208301915083600182028301111561114457600080fd5b9250929050565b6000601f8201831361115c57600080fd5b813561116f61116a82611508565b6114e1565b9150808252602083016020830185838301111561118b57600080fd5b61119683828461154e565b50505092915050565b600080604083850312156111b257600080fd5b60006111be85856110cb565b92505060206111cf858286016110cb565b9150509250929050565b600080604083850312156111ec57600080fd5b60006111f885856110cb565b92505060206111cf858286016110de565b60006020828403121561121b57600080fd5b600061031c84846110ea565b60006020828403121561123957600080fd5b600061031c84846110f6565b6000806040838503121561125857600080fd5b60006111be85856110f6565b6000806000806060858703121561127a57600080fd5b600061128687876110f6565b9450506020611297878288016110cb565b935050604085013567ffffffffffffffff8111156112b457600080fd5b6112c087828801611102565b95989497509550505050565b6000806000606084860312156112e157600080fd5b60006112ed86866110f6565b93505060206112fe868287016110cb565b925050604084013567ffffffffffffffff81111561131b57600080fd5b6113278682870161114b565b9150509250925092565b6000806000806000806080878903121561134a57600080fd5b600061135689896110f6565b965050602061136789828a016110cb565b955050604087013567ffffffffffffffff81111561138457600080fd5b61139089828a01611102565b9450945050606087013567ffffffffffffffff8111156113af57600080fd5b6113bb89828a01611102565b92509250509295509295509295565b6113d381611534565b82525050565b6113d381611540565b6113d381611545565b60006113f682611530565b80845261140a81602086016020860161155a565b6114138161158a565b9093016020019392505050565b6113d381611548565b60208101610e6682846113ca565b60208101610e6682846113d9565b6060810161145382866113e2565b61146060208301856113ca565b818103604083015261147281846113eb565b95945050505050565b6040810161148982856113e2565b818103602083015261031c81846113eb565b608081016114a982876113e2565b6114b66020830186611420565b6114c360408301856113e2565b61147260608301846113e2565b602080825281016110d781846113eb565b60405181810167ffffffffffffffff8111828210171561150057600080fd5b604052919050565b600067ffffffffffffffff82111561151f57600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b82818337506000910152565b60005b8381101561157557818101518382015260200161155d565b83811115611584576000848401525b50505050565b601f01601f1916905600a265627a7a72305820a3e75681a02946f533c55e4085d644ea01287f464c06460cce51bb8c1e999e336c6578706572696d656e74616cf50037",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15CE DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3683EF8E DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0xB4 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x10A JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x12A JUMPI DUP1 PUSH4 0xABBA41CC EQ PUSH2 0x14A JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x16A JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x18A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0xAD CALLDATASIZE PUSH1 0x4 PUSH2 0x1264 JUMP JUMPDEST PUSH2 0x1AC JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0xCF CALLDATASIZE PUSH1 0x4 PUSH2 0x1227 JUMP JUMPDEST PUSH2 0x278 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE1 SWAP2 SWAP1 PUSH2 0x1437 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x105 CALLDATASIZE PUSH1 0x4 PUSH2 0x11D9 JUMP JUMPDEST PUSH2 0x28D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x116 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x125 CALLDATASIZE PUSH1 0x4 PUSH2 0x119F JUMP JUMPDEST PUSH2 0x2D2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x136 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x145 CALLDATASIZE PUSH1 0x4 PUSH2 0x1245 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x156 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x165 CALLDATASIZE PUSH1 0x4 PUSH2 0x12CC JUMP JUMPDEST PUSH2 0x30F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x185 CALLDATASIZE PUSH1 0x4 PUSH2 0x1331 JUMP JUMPDEST PUSH2 0x324 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19F PUSH2 0x656 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE1 SWAP2 SWAP1 PUSH2 0x1429 JUMP JUMPDEST PUSH2 0x1E7 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x665 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x247 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x297 PUSH2 0xE3D JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP7 SWAP1 SWAP4 AND DUP3 MSTORE SWAP5 SWAP1 SWAP5 MSTORE SWAP1 SWAP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 MSTORE SWAP1 DUP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 DUP5 PUSH2 0x665 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x388 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP ADDRESS DUP7 DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x439 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x41A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 DUP4 MSTORE DUP6 SWAP1 KECCAK256 SLOAD DUP4 DUP7 ADD SWAP1 SWAP6 MSTORE PUSH1 0xF DUP4 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 POP SWAP4 POP POP PUSH1 0xFF AND ISZERO SWAP1 POP PUSH2 0x4CA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND CALLER EQ PUSH2 0x597 JUMPI PUSH2 0x516 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x665 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x56D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP3 POP ISZERO ISZERO SWAP1 POP PUSH2 0x62F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 MLOAD GT PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x6CD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH2 0x6D7 DUP9 PUSH2 0xE6C JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x6EC JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x6FC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x750 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x23E SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x14D0 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x75E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x7C6 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x7BC JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH1 0x0 SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x7D4 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x8DC JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x834 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x844 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x862 DUP9 PUSH1 0x1 PUSH2 0xEF6 JUMP JUMPDEST SWAP4 POP PUSH2 0x86F DUP9 PUSH1 0x21 PUSH2 0xEF6 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP11 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x894 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x149B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8B8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP12 DUP2 AND SWAP1 DUP3 AND EQ SWAP9 POP SWAP3 POP PUSH2 0xE30 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x8EA JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xA96 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x94A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x95A JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x978 DUP9 PUSH1 0x1 PUSH2 0xEF6 JUMP JUMPDEST SWAP4 POP PUSH2 0x985 DUP9 PUSH1 0x21 PUSH2 0xEF6 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x9F2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x9D3 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP4 DUP5 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 SUB DUP2 MSTORE SWAP4 DUP3 ADD SWAP1 DUP2 SWAP1 MSTORE DUP4 MLOAD SWAP4 SWAP5 POP SWAP3 DUP4 SWAP3 POP SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xA52 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA33 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x894 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x149B JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xAA4 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xB16 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0xB02 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND CALLER EQ SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xBCA JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0xB71 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x147B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xBC3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1209 JUMP JUMPDEST SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xBD8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xC6B JUMPI PUSH2 0xBE7 DUP9 PUSH2 0xF8A JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xC22 JUMPI PUSH1 0x0 SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0xB71 SWAP1 DUP14 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x1445 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xC79 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xCAA JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xCB8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xDA3 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0xD18 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD28 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0xD46 DUP9 PUSH1 0x1 PUSH2 0xEF6 JUMP JUMPDEST SWAP4 POP PUSH2 0xD53 DUP9 PUSH1 0x21 PUSH2 0xEF6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1B DUP1 DUP3 MSTORE PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE SWAP4 MLOAD SWAP5 SWAP8 POP PUSH1 0x1 SWAP5 SWAP3 SWAP4 DUP16 SWAP4 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH2 0x9F2 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xDB1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xDE2 JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x23E SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x14D0 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0xE64 JUMPI PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0xE66 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C656E677468206D7573742062652067726561746572207468616E20302E0000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 DUP3 LT PUSH2 0xEC7 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP DUP2 MLOAD DUP3 SWAP1 PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0xEDA JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH1 0x0 NOT ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C656E677468206D7573742062652067726561746572207468616E206F722065 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7175616C20746F2033322E000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xF80 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C656E677468206D7573742062652067726561746572207468616E206F722065 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7175616C20746F2032302E000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x1012 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH2 0x1021 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x102E JUMP JUMPDEST DUP3 MLOAD PUSH1 0x13 NOT ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C656E677468206D7573742062652067726561746572207468616E206F722065 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7175616C20746F2032302E000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x10B8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10D7 DUP3 CALLDATALOAD PUSH2 0x1534 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10D7 DUP3 CALLDATALOAD PUSH2 0x1540 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10D7 DUP3 MLOAD PUSH2 0x1540 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10D7 DUP3 CALLDATALOAD PUSH2 0x1545 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x1114 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x112C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x1144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x115C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x116F PUSH2 0x116A DUP3 PUSH2 0x1508 JUMP JUMPDEST PUSH2 0x14E1 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x118B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1196 DUP4 DUP3 DUP5 PUSH2 0x154E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x11B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11BE DUP6 DUP6 PUSH2 0x10CB JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x11CF DUP6 DUP3 DUP7 ADD PUSH2 0x10CB JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x11EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11F8 DUP6 DUP6 PUSH2 0x10CB JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x11CF DUP6 DUP3 DUP7 ADD PUSH2 0x10DE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x121B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 PUSH2 0x10EA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1239 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 PUSH2 0x10F6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1258 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11BE DUP6 DUP6 PUSH2 0x10F6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x127A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1286 DUP8 DUP8 PUSH2 0x10F6 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x1297 DUP8 DUP3 DUP9 ADD PUSH2 0x10CB JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12C0 DUP8 DUP3 DUP9 ADD PUSH2 0x1102 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x12E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x12ED DUP7 DUP7 PUSH2 0x10F6 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x12FE DUP7 DUP3 DUP8 ADD PUSH2 0x10CB JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x131B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1327 DUP7 DUP3 DUP8 ADD PUSH2 0x114B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x134A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1356 DUP10 DUP10 PUSH2 0x10F6 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x1367 DUP10 DUP3 DUP11 ADD PUSH2 0x10CB JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1390 DUP10 DUP3 DUP11 ADD PUSH2 0x1102 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13BB DUP10 DUP3 DUP11 ADD PUSH2 0x1102 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x13D3 DUP2 PUSH2 0x1534 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x13D3 DUP2 PUSH2 0x1540 JUMP JUMPDEST PUSH2 0x13D3 DUP2 PUSH2 0x1545 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13F6 DUP3 PUSH2 0x1530 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x140A DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x155A JUMP JUMPDEST PUSH2 0x1413 DUP2 PUSH2 0x158A JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x13D3 DUP2 PUSH2 0x1548 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE66 DUP3 DUP5 PUSH2 0x13CA JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE66 DUP3 DUP5 PUSH2 0x13D9 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1453 DUP3 DUP7 PUSH2 0x13E2 JUMP JUMPDEST PUSH2 0x1460 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x13CA JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x1472 DUP2 DUP5 PUSH2 0x13EB JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x1489 DUP3 DUP6 PUSH2 0x13E2 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x31C DUP2 DUP5 PUSH2 0x13EB JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x14A9 DUP3 DUP8 PUSH2 0x13E2 JUMP JUMPDEST PUSH2 0x14B6 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1420 JUMP JUMPDEST PUSH2 0x14C3 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x13E2 JUMP JUMPDEST PUSH2 0x1472 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x13E2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10D7 DUP2 DUP5 PUSH2 0x13EB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1500 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x151F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1575 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x155D JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1584 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 LOG3 0xe7 JUMP DUP2 LOG0 0x29 0x46 0xf5 CALLER 0xc5 0x5e BLOCKHASH DUP6 0xd6 DIFFICULTY 0xea ADD 0x28 PUSH32 0x464C06460CCE51BB8C1E999E336C6578706572696D656E74616CF50037000000 ",
                "sourceMap": "759:412:9:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;759:412:9;;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x60806040526004361061008d5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633683ef8e8114610092578063642f2eaf146100b457806377fcce68146100ea5780637b8e35141461010a57806382c174d01461012a578063abba41cc1461014a578063bfc8bfce1461016a578063eea086ba1461018a575b600080fd5b34801561009e57600080fd5b506100b26100ad366004611264565b6101ac565b005b3480156100c057600080fd5b506100d46100cf366004611227565b610278565b6040516100e19190611437565b60405180910390f35b3480156100f657600080fd5b506100b26101053660046111d9565b61028d565b34801561011657600080fd5b506100d461012536600461119f565b6102d2565b34801561013657600080fd5b506100d4610145366004611245565b6102f2565b34801561015657600080fd5b506100d46101653660046112cc565b61030f565b34801561017657600080fd5b506100b2610185366004611331565b610324565b34801561019657600080fd5b5061019f610656565b6040516100e19190611429565b6101e7848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750610665945050505050565b60408051808201909152601181527f494e56414c49445f5349474e415455524500000000000000000000000000000060208201529015156102475760405160e560020a62461bcd02815260040161023e91906114d0565b60405180910390fd5b505050600091825260208281526040808420600160a060020a0390931684529190529020805460ff19166001179055565b60026020526000908152604090205460ff1681565b6000610297610e3d565b600160a060020a03908116600090815260016020908152604080832096909316825294909452909220805460ff191691151591909117905550565b600160209081526000928352604080842090915290825290205460ff1681565b600060208181529281526040808220909352908152205460ff1681565b600061031c848484610665565b949350505050565b60035460408051808201909152601281527f5245454e5452414e43595f494c4c4547414c00000000000000000000000000006020820152600091600160a060020a0316156103885760405160e560020a62461bcd02815260040161023e91906114d0565b5030868887876040516020018086600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018481526020018383808284378201915050955050505050506040516020818303038152906040526040518082805190602001908083835b602083106104395780518252601f19909201916020918201910161041a565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008181526002835285902054838601909552600f83527f494e56414c49445f54585f48415348000000000000000000000000000000000091830191909152955093505060ff161590506104ca5760405160e560020a62461bcd02815260040161023e91906114d0565b50600160a060020a038616331461059757610516818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750610665945050505050565b60408051808201909152601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015290151561056d5760405160e560020a62461bcd02815260040161023e91906114d0565b506003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0388161790555b60008181526002602052604090819020805460ff191660011790555130908690869080838380828437820191505092505050600060405180830381855af460408051808201909152601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015292501515905061062f5760405160e560020a62461bcd02815260040161023e91906114d0565b50506003805473ffffffffffffffffffffffffffffffffffffffff19169055505050505050565b600354600160a060020a031681565b6000806000806000806000808851116040805190810160405280601e81526020017f4c454e4754485f475245415445525f5448414e5f305f524551554952454400008152509015156106cd5760405160e560020a62461bcd02815260040161023e91906114d0565b506106d788610e6c565b60f860020a900460ff1660088111156106ec57fe5b955060008660088111156106fc57fe5b141561075057604080518082018252601181527f5349474e41545552455f494c4c4547414c0000000000000000000000000000006020820152905160e560020a62461bcd02815261023e91906004016114d0565b600186600881111561075e57fe5b14156107c657875160408051808201909152601181527f4c454e4754485f315f5245515549524544000000000000000000000000000000602082015290156107bc5760405160e560020a62461bcd02815260040161023e91906114d0565b5060009650610e30565b60028660088111156107d457fe5b14156108dc57875160408051808201909152601281527f4c454e4754485f36365f524551554952454400000000000000000000000000006020820152906041146108345760405160e560020a62461bcd02815260040161023e91906114d0565b5087600081518110151561084457fe5b016020015160f860020a908190048102049450610862886001610ef6565b935061086f886021610ef6565b925060018a86868660405160008152602001604052604051610894949392919061149b565b60206040516020810390808403906000865af11580156108b8573d6000803e3d6000fd5b5050604051601f190151600160a060020a038b81169082161498509250610e309050565b60038660088111156108ea57fe5b1415610a9657875160408051808201909152601281527f4c454e4754485f36365f5245515549524544000000000000000000000000000060208201529060411461094a5760405160e560020a62461bcd02815260040161023e91906114d0565b5087600081518110151561095a57fe5b016020015160f860020a908190048102049450610978886001610ef6565b9350610985886021610ef6565b925060016040805190810160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152508b6040516020018083805190602001908083835b602083106109f25780518252601f1990920191602091820191016109d3565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815293820190819052835193945092839250908401908083835b60208310610a525780518252601f199092019160209182019101610a33565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008352910192839052610894945092508991899150889061149b565b6004866008811115610aa457fe5b1415610b1657875160408051808201909152601181527f4c454e4754485f315f524551554952454400000000000000000000000000000060208201529015610b025760405160e560020a62461bcd02815260040161023e91906114d0565b50600160a060020a03891633149650610e30565b6005866008811115610b2457fe5b1415610bca576040517f1626ba7e000000000000000000000000000000000000000000000000000000008152600160a060020a038a1690631626ba7e90610b71908d908c9060040161147b565b602060405180830381600087803b158015610b8b57600080fd5b505af1158015610b9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610bc39190810190611209565b9650610e30565b6006866008811115610bd857fe5b1415610c6b57610be788610f8a565b600160a060020a03808b1660009081526001602090815260408083209385168352929052205490915060ff161515610c225760009650610e30565b6040517f93634702000000000000000000000000000000000000000000000000000000008152600160a060020a03821690639363470290610b71908d908d908d90600401611445565b6007866008811115610c7957fe5b1415610caa5760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610e30565b6008866008811115610cb857fe5b1415610da357875160408051808201909152601281527f4c454e4754485f36365f52455155495245440000000000000000000000000000602082015290604114610d185760405160e560020a62461bcd02815260040161023e91906114d0565b50876000815181101515610d2857fe5b016020015160f860020a908190048102049450610d46886001610ef6565b9350610d53886021610ef6565b604080518082018252601b8082527f19457468657265756d205369676e6564204d6573736167653a0a4100000000006020808401918252935194975060019492938f9301918291908083836109f2565b6007866008811115610db157fe5b1415610de25760008a815260208181526040808320600160a060020a038d16845290915290205460ff169650610e30565b604080518082018252601581527f5349474e41545552455f554e535550504f5254454400000000000000000000006020820152905160e560020a62461bcd02815261023e91906004016114d0565b5050505050509392505050565b6003546000908190600160a060020a031615610e6457600354600160a060020a0316610e66565b335b92915050565b805160408051808201909152601e81527f4c656e677468206d7573742062652067726561746572207468616e20302e000060208201526000918210610ec75760405160e560020a62461bcd02815260040161023e91906114d0565b50815182906000198101908110610eda57fe5b01602001518251600019019092525060f860020a908190040290565b60008160200183511015606060405190810160405280602b81526020017f4c656e677468206d7573742062652067726561746572207468616e206f72206581526020017f7175616c20746f2033322e000000000000000000000000000000000000000000815250901515610f805760405160e560020a62461bcd02815260040161023e91906114d0565b5050016020015190565b6000601482511015606060405190810160405280602b81526020017f4c656e677468206d7573742062652067726561746572207468616e206f72206581526020017f7175616c20746f2032302e0000000000000000000000000000000000000000008152509015156110125760405160e560020a62461bcd02815260040161023e91906114d0565b5061102182601484510361102e565b8251601319019092525090565b60008160140183511015606060405190810160405280602b81526020017f4c656e677468206d7573742062652067726561746572207468616e206f72206581526020017f7175616c20746f2032302e0000000000000000000000000000000000000000008152509015156110b85760405160e560020a62461bcd02815260040161023e91906114d0565b50500160140151600160a060020a031690565b60006110d78235611534565b9392505050565b60006110d78235611540565b60006110d78251611540565b60006110d78235611545565b600080601f8301841361111457600080fd5b50813567ffffffffffffffff81111561112c57600080fd5b60208301915083600182028301111561114457600080fd5b9250929050565b6000601f8201831361115c57600080fd5b813561116f61116a82611508565b6114e1565b9150808252602083016020830185838301111561118b57600080fd5b61119683828461154e565b50505092915050565b600080604083850312156111b257600080fd5b60006111be85856110cb565b92505060206111cf858286016110cb565b9150509250929050565b600080604083850312156111ec57600080fd5b60006111f885856110cb565b92505060206111cf858286016110de565b60006020828403121561121b57600080fd5b600061031c84846110ea565b60006020828403121561123957600080fd5b600061031c84846110f6565b6000806040838503121561125857600080fd5b60006111be85856110f6565b6000806000806060858703121561127a57600080fd5b600061128687876110f6565b9450506020611297878288016110cb565b935050604085013567ffffffffffffffff8111156112b457600080fd5b6112c087828801611102565b95989497509550505050565b6000806000606084860312156112e157600080fd5b60006112ed86866110f6565b93505060206112fe868287016110cb565b925050604084013567ffffffffffffffff81111561131b57600080fd5b6113278682870161114b565b9150509250925092565b6000806000806000806080878903121561134a57600080fd5b600061135689896110f6565b965050602061136789828a016110cb565b955050604087013567ffffffffffffffff81111561138457600080fd5b61139089828a01611102565b9450945050606087013567ffffffffffffffff8111156113af57600080fd5b6113bb89828a01611102565b92509250509295509295509295565b6113d381611534565b82525050565b6113d381611540565b6113d381611545565b60006113f682611530565b80845261140a81602086016020860161155a565b6114138161158a565b9093016020019392505050565b6113d381611548565b60208101610e6682846113ca565b60208101610e6682846113d9565b6060810161145382866113e2565b61146060208301856113ca565b818103604083015261147281846113eb565b95945050505050565b6040810161148982856113e2565b818103602083015261031c81846113eb565b608081016114a982876113e2565b6114b66020830186611420565b6114c360408301856113e2565b61147260608301846113e2565b602080825281016110d781846113eb565b60405181810167ffffffffffffffff8111828210171561150057600080fd5b604052919050565b600067ffffffffffffffff82111561151f57600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b60ff1690565b82818337506000910152565b60005b8381101561157557818101518382015260200161155d565b83811115611584576000848401525b50505050565b601f01601f1916905600a265627a7a72305820a3e75681a02946f533c55e4085d644ea01287f464c06460cce51bb8c1e999e336c6578706572696d656e74616cf50037",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3683EF8E DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0xB4 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x10A JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x12A JUMPI DUP1 PUSH4 0xABBA41CC EQ PUSH2 0x14A JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x16A JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x18A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0xAD CALLDATASIZE PUSH1 0x4 PUSH2 0x1264 JUMP JUMPDEST PUSH2 0x1AC JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0xCF CALLDATASIZE PUSH1 0x4 PUSH2 0x1227 JUMP JUMPDEST PUSH2 0x278 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE1 SWAP2 SWAP1 PUSH2 0x1437 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x105 CALLDATASIZE PUSH1 0x4 PUSH2 0x11D9 JUMP JUMPDEST PUSH2 0x28D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x116 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x125 CALLDATASIZE PUSH1 0x4 PUSH2 0x119F JUMP JUMPDEST PUSH2 0x2D2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x136 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x145 CALLDATASIZE PUSH1 0x4 PUSH2 0x1245 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x156 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD4 PUSH2 0x165 CALLDATASIZE PUSH1 0x4 PUSH2 0x12CC JUMP JUMPDEST PUSH2 0x30F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x185 CALLDATASIZE PUSH1 0x4 PUSH2 0x1331 JUMP JUMPDEST PUSH2 0x324 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19F PUSH2 0x656 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE1 SWAP2 SWAP1 PUSH2 0x1429 JUMP JUMPDEST PUSH2 0x1E7 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x665 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x247 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x297 PUSH2 0xE3D JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP7 SWAP1 SWAP4 AND DUP3 MSTORE SWAP5 SWAP1 SWAP5 MSTORE SWAP1 SWAP3 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP3 DUP2 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 MSTORE SWAP1 DUP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 DUP5 PUSH2 0x665 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0x388 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP ADDRESS DUP7 DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x439 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x41A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 DUP4 MSTORE DUP6 SWAP1 KECCAK256 SLOAD DUP4 DUP7 ADD SWAP1 SWAP6 MSTORE PUSH1 0xF DUP4 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP6 POP SWAP4 POP POP PUSH1 0xFF AND ISZERO SWAP1 POP PUSH2 0x4CA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND CALLER EQ PUSH2 0x597 JUMPI PUSH2 0x516 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x665 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO ISZERO PUSH2 0x56D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP3 POP ISZERO ISZERO SWAP1 POP PUSH2 0x62F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP POP PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 MLOAD GT PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x6CD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH2 0x6D7 DUP9 PUSH2 0xE6C JUMP JUMPDEST PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x6EC JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x6FC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x750 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x23E SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x14D0 JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x75E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x7C6 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0x7BC JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH1 0x0 SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x7D4 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x8DC JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x834 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x844 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x862 DUP9 PUSH1 0x1 PUSH2 0xEF6 JUMP JUMPDEST SWAP4 POP PUSH2 0x86F DUP9 PUSH1 0x21 PUSH2 0xEF6 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP11 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x894 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x149B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8B8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP12 DUP2 AND SWAP1 DUP3 AND EQ SWAP9 POP SWAP3 POP PUSH2 0xE30 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0x8EA JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xA96 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0x94A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x95A JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x978 DUP9 PUSH1 0x1 PUSH2 0xEF6 JUMP JUMPDEST SWAP4 POP PUSH2 0x985 DUP9 PUSH1 0x21 PUSH2 0xEF6 JUMP JUMPDEST SWAP3 POP PUSH1 0x1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x9F2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x9D3 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP4 DUP5 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 SUB DUP2 MSTORE SWAP4 DUP3 ADD SWAP1 DUP2 SWAP1 MSTORE DUP4 MLOAD SWAP4 SWAP5 POP SWAP3 DUP4 SWAP3 POP SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xA52 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA33 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x894 SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x149B JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xAA4 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xB16 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F315F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 ISZERO PUSH2 0xB02 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND CALLER EQ SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xBCA JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP11 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0xB71 SWAP1 DUP14 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x147B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xBC3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1209 JUMP JUMPDEST SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xBD8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xC6B JUMPI PUSH2 0xBE7 DUP9 PUSH2 0xF8A JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP12 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xC22 JUMPI PUSH1 0x0 SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0xB71 SWAP1 DUP14 SWAP1 DUP14 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x1445 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xC79 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xCAA JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xCB8 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xDA3 JUMPI DUP8 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36365F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x41 EQ PUSH2 0xD18 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP DUP8 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD28 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0xD46 DUP9 PUSH1 0x1 PUSH2 0xEF6 JUMP JUMPDEST SWAP4 POP PUSH2 0xD53 DUP9 PUSH1 0x21 PUSH2 0xEF6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1B DUP1 DUP3 MSTORE PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A410000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 DUP3 MSTORE SWAP4 MLOAD SWAP5 SWAP8 POP PUSH1 0x1 SWAP5 SWAP3 SWAP4 DUP16 SWAP4 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH2 0x9F2 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x8 DUP2 GT ISZERO PUSH2 0xDB1 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xDE2 JUMPI PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP7 POP PUSH2 0xE30 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH2 0x23E SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x14D0 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO PUSH2 0xE64 JUMPI PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0xE66 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C656E677468206D7573742062652067726561746572207468616E20302E0000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 DUP3 LT PUSH2 0xEC7 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP DUP2 MLOAD DUP3 SWAP1 PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0xEDA JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH1 0x0 NOT ADD SWAP1 SWAP3 MSTORE POP PUSH1 0xF8 PUSH1 0x2 EXP SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C656E677468206D7573742062652067726561746572207468616E206F722065 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7175616C20746F2033322E000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xF80 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C656E677468206D7573742062652067726561746572207468616E206F722065 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7175616C20746F2032302E000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x1012 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP PUSH2 0x1021 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x102E JUMP JUMPDEST DUP3 MLOAD PUSH1 0x13 NOT ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C656E677468206D7573742062652067726561746572207468616E206F722065 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7175616C20746F2032302E000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x10B8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x23E SWAP2 SWAP1 PUSH2 0x14D0 JUMP JUMPDEST POP POP ADD PUSH1 0x14 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10D7 DUP3 CALLDATALOAD PUSH2 0x1534 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10D7 DUP3 CALLDATALOAD PUSH2 0x1540 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10D7 DUP3 MLOAD PUSH2 0x1540 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10D7 DUP3 CALLDATALOAD PUSH2 0x1545 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x1114 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x112C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x1144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x115C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x116F PUSH2 0x116A DUP3 PUSH2 0x1508 JUMP JUMPDEST PUSH2 0x14E1 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x118B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1196 DUP4 DUP3 DUP5 PUSH2 0x154E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x11B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11BE DUP6 DUP6 PUSH2 0x10CB JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x11CF DUP6 DUP3 DUP7 ADD PUSH2 0x10CB JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x11EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11F8 DUP6 DUP6 PUSH2 0x10CB JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x11CF DUP6 DUP3 DUP7 ADD PUSH2 0x10DE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x121B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 PUSH2 0x10EA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1239 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x31C DUP5 DUP5 PUSH2 0x10F6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1258 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11BE DUP6 DUP6 PUSH2 0x10F6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x127A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1286 DUP8 DUP8 PUSH2 0x10F6 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x1297 DUP8 DUP3 DUP9 ADD PUSH2 0x10CB JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12C0 DUP8 DUP3 DUP9 ADD PUSH2 0x1102 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x12E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x12ED DUP7 DUP7 PUSH2 0x10F6 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x12FE DUP7 DUP3 DUP8 ADD PUSH2 0x10CB JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x131B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1327 DUP7 DUP3 DUP8 ADD PUSH2 0x114B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x134A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1356 DUP10 DUP10 PUSH2 0x10F6 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x1367 DUP10 DUP3 DUP11 ADD PUSH2 0x10CB JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1390 DUP10 DUP3 DUP11 ADD PUSH2 0x1102 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13BB DUP10 DUP3 DUP11 ADD PUSH2 0x1102 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x13D3 DUP2 PUSH2 0x1534 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x13D3 DUP2 PUSH2 0x1540 JUMP JUMPDEST PUSH2 0x13D3 DUP2 PUSH2 0x1545 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13F6 DUP3 PUSH2 0x1530 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x140A DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x155A JUMP JUMPDEST PUSH2 0x1413 DUP2 PUSH2 0x158A JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x13D3 DUP2 PUSH2 0x1548 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE66 DUP3 DUP5 PUSH2 0x13CA JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE66 DUP3 DUP5 PUSH2 0x13D9 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1453 DUP3 DUP7 PUSH2 0x13E2 JUMP JUMPDEST PUSH2 0x1460 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x13CA JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x1472 DUP2 DUP5 PUSH2 0x13EB JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x1489 DUP3 DUP6 PUSH2 0x13E2 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x31C DUP2 DUP5 PUSH2 0x13EB JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x14A9 DUP3 DUP8 PUSH2 0x13E2 JUMP JUMPDEST PUSH2 0x14B6 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1420 JUMP JUMPDEST PUSH2 0x14C3 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x13E2 JUMP JUMPDEST PUSH2 0x1472 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x13E2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x10D7 DUP2 DUP5 PUSH2 0x13EB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1500 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x151F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1575 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x155D JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1584 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 LOG3 0xe7 JUMP DUP2 LOG0 0x29 0x46 0xf5 CALLER 0xc5 0x5e BLOCKHASH DUP6 0xd6 DIFFICULTY 0xea ADD 0x28 PUSH32 0x464C06460CCE51BB8C1E999E336C6578706572696D656E74616CF50037000000 ",
                "sourceMap": "759:412:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1723:275:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1723:275:0;;;;;;;;;;;945:45:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;945:45:1;;;;;;;;;;;;;;;;;;;;;;;;;2228:233:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2228:233:0;;;;;;;;;1324:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1324:71:0;;;;;;;;;1204:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1204:63:0;;;;;;;;;852:317:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;852:317:9;;;;;;;;;1397:1380:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1397:1380:1;;;;;;;;;1042:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1042:36:1;;;;;;;;;;;;1723:275:0;1869:41;1886:4;1892:6;1900:9;;1869:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1869:16:0;;-1:-1:-1;;;;;1869:41:0:i;:::-;1924:17;;;;;;;;;;;;;;;;;;1848:103;;;;;;-1:-1:-1;;;;;1848:103:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1961:9:0;:15;;;;;;;;;;;-1:-1:-1;;;;;1961:23:0;;;;;;;;;;:30;;-1:-1:-1;;1961:30:0;1987:4;1961:30;;;1723:275::o;945:45:1:-;;;;;;;;;;;;;;;:::o;2228:233:0:-;2354:14;2371:26;:24;:26::i;:::-;-1:-1:-1;;;;;2407:25:0;;;;;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;:47;;-1:-1:-1;;2407:47:0;;;;;;;;;;-1:-1:-1;2228:233:0:o;1324:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1204:63::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;852:317:9:-;1013:12;1051:87;1081:4;1099:6;1119:9;1051:16;:87::i;:::-;1041:97;852:317;-1:-1:-1;;;;852:317:9:o;1397:1380:1:-;1604:21;;1653:18;;;;;;;;;;;;;;;;;1730:23;;-1:-1:-1;;;;;1604:21:1;:35;1583:98;;;;-1:-1:-1;;;;;1583:98:1;;;;;;;;;;;1804:4;1823:6;1843:4;1861;;1766:109;;;;;;-1:-1:-1;;;;;1766:109:1;-1:-1:-1;;;;;1766:109:1;;;;;;;;-1:-1:-1;;;;;1766:109:1;-1:-1:-1;;;;;1766:109:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1766:109:1;;;1756:120;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1756:120:1;;;;;;;;;;;;-1:-1:-1;1963:29:1;;;:12;:29;;;;;;2006:15;;;;;;;;;;;;;;;;;1756:120;-1:-1:-1;1756:120:1;-1:-1:-1;;1963:29:1;;1962:30;;-1:-1:-1;1941:90:1;;;;-1:-1:-1;;;;;1941:90:1;;;;;;;;;;-1:-1:-1;;;;;;2117:20:1;;2127:10;2117:20;2113:309;;2212:52;2229:15;2246:6;2254:9;;2212:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2212:16:1;;-1:-1:-1;;;;;2212:52:1:i;:::-;2282:20;;;;;;;;;;;;;;;;;;2187:129;;;;;;-1:-1:-1;;;;;2187:129:1;;;;;;;;;;-1:-1:-1;2381:21:1;:30;;-1:-1:-1;;2381:30:1;-1:-1:-1;;;;;2381:30:1;;;;;2113:309;2463:29;;;;:12;:29;;;;;;;:36;;-1:-1:-1;;2463:36:1;2495:4;2463:36;;;2530:32;2538:4;;2557;;;;2530:32;2557:4;;;;2530:32;;;;;;;;;;;;;;;;;;;;;2576:16;;;;;;;;;;;;;;;;;;-1:-1:-1;2509:93:1;;;-1:-1:-1;2509:93:1;;;;-1:-1:-1;;;;;2509:93:1;;;;;;;;;;-1:-1:-1;;2736:21:1;:34;;-1:-1:-1;;2736:34:1;;;-1:-1:-1;;;;;;1397:1380:1:o;1042:36::-;;;-1:-1:-1;;;;;1042:36:1;;:::o;2826:6487:0:-;2983:12;3284:27;3414:7;3431:9;3450;3469:17;7091;3164:1;3145:9;:16;:20;3179:30;;;;;;;;;;;;;;;;;;3124:95;;;;;;;-1:-1:-1;;;;;3124:95:0;;;;;;;;;;;3334:18;3342:9;3334:7;:18::i;:::-;-1:-1:-1;;;3328:25:0;;3314:40;;;;;;;;;;3284:70;-1:-1:-1;3836:21:0;3819:13;:38;;;;;;;;;3815:5150;;;3880:17;;;;;;;;;;;;;;;;3873:25;;-1:-1:-1;;;;;3873:25:0;;;;3880:17;3873:25;;;;3815:5150;4180:21;4163:13;:38;;;;;;;;;4159:4806;;;4242:16;;4281:17;;;;;;;;;;;;;;;;;;4242:21;4217:95;;;;-1:-1:-1;;;;;4217:95:0;;;;;;;;;;-1:-1:-1;4336:5:0;;-1:-1:-1;4355:14:0;;4159:4806;4442:20;4425:13;:37;;;;;;;;;4421:4544;;;4503:16;;4543:18;;;;;;;;;;;;;;;;;;4523:2;4503:22;4478:97;;;;-1:-1:-1;;;;;4478:97:0;;;;;;;;;;;4599:9;4609:1;4599:12;;;;;;;;;;;;;;-1:-1:-1;;;4599:12:0;;;;;;4593:19;;-1:-1:-1;4630:25:0;4642:9;4653:1;4630:11;:25::i;:::-;4626:29;;4673:26;4685:9;4696:2;4673:11;:26::i;:::-;4669:30;;4725:24;4735:4;4741:1;4744;4747;4725:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4725:24:0;;-1:-1:-1;;4725:24:0;;-1:-1:-1;;;;;4773:19:0;;;;;;;;-1:-1:-1;4725:24:0;-1:-1:-1;4806:14:0;;-1:-1:-1;4806:14:0;4421:4544;4897:21;4880:13;:38;;;;;;;;;4876:4089;;;4959:16;;4999:18;;;;;;;;;;;;;;;;;;4979:2;4959:22;4934:97;;;;-1:-1:-1;;;;;4934:97:0;;;;;;;;;;;5055:9;5065:1;5055:12;;;;;;;;;;;;;;-1:-1:-1;;;5055:12:0;;;;;;5049:19;;-1:-1:-1;5086:25:0;5098:9;5109:1;5086:11;:25::i;:::-;5082:29;;5129:26;5141:9;5152:2;5129:11;:26::i;:::-;5125:30;;5181:153;5235:20;;;;;;;;;;;;;;;;;;5257:4;5218:44;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5218:44:0;;;;;-1:-1:-1;5218:44:0;;;26:21:-1;;;6:49;;5218:44:0;;;;;;;5208:55;;5218:44;;-1:-1:-1;5218:44:0;;;-1:-1:-1;5208:55:0;;;;;5218:44;5208:55;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5208:55:0;;;;;;;;;;;;-1:-1:-1;5181:153:0;;;;;;;;;;-1:-1:-1;5208:55:0;-1:-1:-1;5281:1:0;;5300;;-1:-1:-1;5319:1:0;;5181:153;;4876:4089;5995:20;5978:13;:37;;;;;;;;;5974:2991;;;6056:16;;6095:17;;;;;;;;;;;;;;;;;;6056:21;6031:95;;;;-1:-1:-1;;;;;6031:95:0;;;;;;;;;;-1:-1:-1;;;;;;6150:20:0;;6160:10;6150:20;;-1:-1:-1;6184:14:0;;5974:2991;6368:20;6351:13;:37;;;;;;;;;6347:2618;;;6414:49;;;;;-1:-1:-1;;;;;6414:32:0;;;;;:49;;6447:4;;6453:9;;6414:49;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6414:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6414:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6414:49:0;;;;;;;;;6404:59;-1:-1:-1;6477:14:0;;6347:2618;6990:23;6973:13;:40;;;;;;;;;6969:1996;;;7111:21;7122:9;7111:10;:21::i;:::-;-1:-1:-1;;;;;7204:25:0;;;;;;;:17;:25;;;;;;;;:36;;;;;;;;;;7091:41;;-1:-1:-1;7204:36:0;;7203:37;7199:88;;;7267:5;7260:12;;;;7199:88;7310:125;;;;;-1:-1:-1;;;;;7310:38:0;;;;;:125;;7366:4;;7388:6;;7412:9;;7310:125;;;;6969:1996;7571:23;7554:13;:40;;;;;;;;;7550:1415;;;7620:9;:15;;;;;;;;;;;-1:-1:-1;;;;;7620:23:0;;;;;;;;;;;;;-1:-1:-1;7657:14:0;;7550:1415;8237:20;8220:13;:37;;;;;;;;;8216:749;;;8298:16;;8338:18;;;;;;;;;;;;;;;;;;8318:2;8298:22;8273:97;;;;-1:-1:-1;;;;;8273:97:0;;;;;;;;;;;8394:9;8404:1;8394:12;;;;;;;;;;;;;;-1:-1:-1;;;8394:12:0;;;;;;8388:19;;-1:-1:-1;8425:25:0;8437:9;8448:1;8425:11;:25::i;:::-;8421:29;;8468:26;8480:9;8491:2;8468:11;:26::i;:::-;8574:23;;;;;;;;;;;;;;;;;;;;8557:47;;8464:30;;-1:-1:-1;8520:156:0;;8574:23;;8599:4;;8557:47;;;;8574:23;;8557:47;8574:23;36:153:-1;;8216:749:0;8854:23;8837:13;:40;;;;;;;;;8833:132;;;8903:9;:15;;;;;;;;;;;-1:-1:-1;;;;;8903:23:0;;;;;;;;;;;;;-1:-1:-1;8940:14:0;;8833:132;9284:21;;;;;;;;;;;;;;;;9277:29;;-1:-1:-1;;;;;9277:29:0;;;;9284:21;9277:29;;;;2826:6487;;;;;;;;;;;;:::o;3221:241:1:-;3352:21;;3304:7;;;;-1:-1:-1;;;;;3352:21:1;:35;:72;;3403:21;;-1:-1:-1;;;;;3403:21:1;3352:72;;;3390:10;3352:72;3327:97;3221:241;-1:-1:-1;;3221:241:1:o;1267:440:10:-;1397:8;;1423:23;;;;;;;;;;;;;;;;;1347:13;;1397:12;-1:-1:-1;1376:80:10;;;;-1:-1:-1;;;;;1376:80:10;;;;;;;;;;-1:-1:-1;1506:8:10;;1504:1;;-1:-1:-1;;1506:12:10;;;1504:15;;;;;;;;;;1626:8;;-1:-1:-1;;1622:16:10;1651:17;;;-1:-1:-1;;;;1504:15:10;;;;;;1267:440::o;6464:472::-;6585:14;6648:5;6656:2;6648:10;6636:1;:8;:22;;6672;;;;;;;;;;;;;;;;;;;;;;;6615:89;;;;;;;-1:-1:-1;;;;;6615:89:10;;;;;;;;;;-1:-1:-1;;6883:13:10;6785:2;6883:13;6877:20;;6464:472::o;1902:460::-;1985:14;2048:2;2036:1;:8;:14;;2064:22;;;;;;;;;;;;;;;;;;;;;;;2015:81;;;;;;;-1:-1:-1;;;;;2015:81:10;;;;;;;;;;;2148:29;2160:1;2174:2;2163:1;:8;:13;2148:11;:29::i;:::-;2280:8;;-1:-1:-1;;2276:17:10;2306;;;-1:-1:-1;2139:38:10;1902:460::o;3710:869::-;3831:14;3894:5;3902:2;3894:10;3882:1;:8;:22;;3946;;;;;;;;;;;;;;;;;;;;;;;3861:117;;;;;;;-1:-1:-1;;;;;3861:117:10;;;;;;;;;;-1:-1:-1;;4481:13:10;4226:2;4481:13;4475:20;-1:-1:-1;;;;;4471:69:10;;3710:869::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;130:112;;194:43;229:6;216:20;194:43;;249:116;;324:36;352:6;346:13;324:36;;372:118;;439:46;477:6;464:20;439:46;;511:335;;;618:4;606:17;;602:27;-1:-1;592:2;;643:1;640;633:12;592:2;-1:-1;663:20;;703:18;692:30;;689:2;;;735:1;732;725:12;689:2;769:4;761:6;757:17;745:29;;819:3;812;804:6;800:16;790:8;786:31;783:40;780:2;;;836:1;833;826:12;780:2;585:261;;;;;;855:440;;949:4;937:17;;933:27;-1:-1;923:2;;974:1;971;964:12;923:2;1011:6;998:20;1033:64;1048:48;1089:6;1048:48;;;1033:64;;;1024:73;;1117:6;1110:5;1103:21;1153:4;1145:6;1141:17;1186:4;1179:5;1175:16;1221:3;1212:6;1207:3;1203:16;1200:25;1197:2;;;1238:1;1235;1228:12;1197:2;1248:41;1282:6;1277:3;1272;1248:41;;;916:379;;;;;;;;1428:366;;;1549:2;1537:9;1528:7;1524:23;1520:32;1517:2;;;1565:1;1562;1555:12;1517:2;1600:1;1617:53;1662:7;1642:9;1617:53;;;1607:63;;1579:97;1707:2;1725:53;1770:7;1761:6;1750:9;1746:22;1725:53;;;1715:63;;1686:98;1511:283;;;;;;1801:360;;;1919:2;1907:9;1898:7;1894:23;1890:32;1887:2;;;1935:1;1932;1925:12;1887:2;1970:1;1987:53;2032:7;2012:9;1987:53;;;1977:63;;1949:97;2077:2;2095:50;2137:7;2128:6;2117:9;2113:22;2095:50;;2168:257;;2280:2;2268:9;2259:7;2255:23;2251:32;2248:2;;;2296:1;2293;2286:12;2248:2;2331:1;2348:61;2401:7;2381:9;2348:61;;2432:241;;2536:2;2524:9;2515:7;2511:23;2507:32;2504:2;;;2552:1;2549;2542:12;2504:2;2587:1;2604:53;2649:7;2629:9;2604:53;;2680:366;;;2801:2;2789:9;2780:7;2776:23;2772:32;2769:2;;;2817:1;2814;2807:12;2769:2;2852:1;2869:53;2914:7;2894:9;2869:53;;3053:615;;;;;3210:2;3198:9;3189:7;3185:23;3181:32;3178:2;;;3226:1;3223;3216:12;3178:2;3261:1;3278:53;3323:7;3303:9;3278:53;;;3268:63;;3240:97;3368:2;3386:53;3431:7;3422:6;3411:9;3407:22;3386:53;;;3376:63;;3347:98;3504:2;3493:9;3489:18;3476:32;3528:18;3520:6;3517:30;3514:2;;;3560:1;3557;3550:12;3514:2;3588:64;3644:7;3635:6;3624:9;3620:22;3588:64;;;3172:496;;;;-1:-1;3570:82;-1:-1;;;;3172:496;3675:595;;;;3822:2;3810:9;3801:7;3797:23;3793:32;3790:2;;;3838:1;3835;3828:12;3790:2;3873:1;3890:53;3935:7;3915:9;3890:53;;;3880:63;;3852:97;3980:2;3998:53;4043:7;4034:6;4023:9;4019:22;3998:53;;;3988:63;;3959:98;4116:2;4105:9;4101:18;4088:32;4140:18;4132:6;4129:30;4126:2;;;4172:1;4169;4162:12;4126:2;4192:62;4246:7;4237:6;4226:9;4222:22;4192:62;;;4182:72;;4067:193;3784:486;;;;;;4277:865;;;;;;;4470:3;4458:9;4449:7;4445:23;4441:33;4438:2;;;4487:1;4484;4477:12;4438:2;4522:1;4539:53;4584:7;4564:9;4539:53;;;4529:63;;4501:97;4629:2;4647:53;4692:7;4683:6;4672:9;4668:22;4647:53;;;4637:63;;4608:98;4765:2;4754:9;4750:18;4737:32;4789:18;4781:6;4778:30;4775:2;;;4821:1;4818;4811:12;4775:2;4849:64;4905:7;4896:6;4885:9;4881:22;4849:64;;;4831:82;;;;4716:203;4978:2;4967:9;4963:18;4950:32;5002:18;4994:6;4991:30;4988:2;;;5034:1;5031;5024:12;4988:2;5062:64;5118:7;5109:6;5098:9;5094:22;5062:64;;;5044:82;;;;4929:203;4432:710;;;;;;;;;5149:110;5222:31;5247:5;5222:31;;;5217:3;5210:44;5204:55;;;5266:101;5333:28;5355:5;5333:28;;5374:110;5447:31;5472:5;5447:31;;5491:297;;5591:38;5623:5;5591:38;;;5646:6;5641:3;5634:19;5658:63;5714:6;5707:4;5702:3;5698:14;5691:4;5684:5;5680:16;5658:63;;;5753:29;5775:6;5753:29;;;5733:50;;;5746:4;5733:50;;5571:217;-1:-1;;;5571:217;6094:104;6163:29;6186:5;6163:29;;6205:193;6313:2;6298:18;;6327:61;6302:9;6361:6;6327:61;;6405:181;6507:2;6492:18;;6521:55;6496:9;6549:6;6521:55;;6593:479;6775:2;6760:18;;6789:61;6764:9;6823:6;6789:61;;;6861:62;6919:2;6908:9;6904:18;6895:6;6861:62;;;6971:9;6965:4;6961:20;6956:2;6945:9;6941:18;6934:48;6996:66;7057:4;7048:6;6996:66;;;6988:74;6746:326;-1:-1;;;;;6746:326;7079:378;7233:2;7218:18;;7247:61;7222:9;7281:6;7247:61;;;7356:9;7350:4;7346:20;7341:2;7330:9;7326:18;7319:48;7381:66;7442:4;7433:6;7381:66;;7464:489;7652:3;7637:19;;7667:61;7641:9;7701:6;7667:61;;;7739:58;7793:2;7782:9;7778:18;7769:6;7739:58;;;7808:62;7866:2;7855:9;7851:18;7842:6;7808:62;;;7881;7939:2;7928:9;7924:18;7915:6;7881:62;;7960:273;8084:2;8098:47;;;8069:18;;8159:64;8069:18;8209:6;8159:64;;8240:256;8302:2;8296:9;8328:17;;;8403:18;8388:34;;8424:22;;;8385:62;8382:2;;;8460:1;8457;8450:12;8382:2;8476;8469:22;8280:216;;-1:-1;8280:216;8503:258;;8646:18;8638:6;8635:30;8632:2;;;8678:1;8675;8668:12;8632:2;-1:-1;8751:4;8722;8699:17;;;;-1:-1;;8695:33;8741:15;;8569:192;8768:91;8842:12;;8826:33;8961:128;-1:-1;;;;;9030:54;;9013:76;9096:92;9169:13;9162:21;;9145:43;9195:79;9264:5;9247:27;9281:88;9359:4;9348:16;;9331:38;9783:145;9864:6;9859:3;9854;9841:30;-1:-1;9920:1;9902:16;;9895:27;9834:94;9937:268;10002:1;10009:101;10023:6;10020:1;10017:13;10009:101;;;10090:11;;;10084:18;10071:11;;;10064:39;10045:2;10038:10;10009:101;;;10125:6;10122:1;10119:13;10116:2;;;10190:1;10181:6;10176:3;10172:16;10165:27;10116:2;9986:219;;;;;10213:97;10301:2;10281:14;-1:-1;;10277:28;;10261:49"
            }
        }
    },
    "sources": {
        "current/protocol/Exchange/MixinSignatureValidator.sol": {
            "id": 0
        },
        "current/protocol/Exchange/MixinTransactions.sol": {
            "id": 1
        },
        "current/protocol/Exchange/interfaces/ISignatureValidator.sol": {
            "id": 2
        },
        "current/protocol/Exchange/interfaces/ITransactions.sol": {
            "id": 3
        },
        "current/protocol/Exchange/interfaces/IValidator.sol": {
            "id": 4
        },
        "current/protocol/Exchange/interfaces/IWallet.sol": {
            "id": 5
        },
        "current/protocol/Exchange/libs/LibExchangeErrors.sol": {
            "id": 6
        },
        "current/protocol/Exchange/mixins/MSignatureValidator.sol": {
            "id": 7
        },
        "current/protocol/Exchange/mixins/MTransactions.sol": {
            "id": 8
        },
        "current/test/TestSignatureValidator/TestSignatureValidator.sol": {
            "id": 9
        },
        "current/utils/LibBytes/LibBytes.sol": {
            "id": 10
        }
    },
    "sourceCodes": {
        "current/protocol/Exchange/MixinSignatureValidator.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\ncontract MixinSignatureValidator is\n    LibBytes,\n    LibExchangeErrors,\n    MSignatureValidator,\n    MTransactions\n{\n    // Personal message headers\n    string constant ETH_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n32\";\n    string constant TREZOR_PERSONAL_MESSAGE = \"\\x19Ethereum Signed Message:\\n\\x41\";\n\n    // Mapping of hash => signer => signed\n    mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n    // Mapping of signer => validator => approved\n    mapping (address => mapping (address => bool)) public allowedValidators;\n\n    /// @dev Approves a hash on-chain using any valid signature type.\n    ///      After presigning a hash, the preSign signature type will become valid for that hash and signer.\n    /// @param signer Address that should have signed the given hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    function preSign(\n        bytes32 hash,\n        address signer,\n        bytes signature\n    )\n        external\n    {\n        require(\n            isValidSignature(hash, signer, signature),\n            INVALID_SIGNATURE\n        );\n        preSigned[hash][signer] = true;\n    }\n\n    /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n    /// @param validator Address of Validator contract.\n    /// @param approval Approval or disapproval of  Validator contract.\n    function setSignatureValidatorApproval(\n        address validator,\n        bool approval\n    )\n        external\n    {\n        address signer = getCurrentContextAddress();\n        allowedValidators[signer][validator] = approval;\n    }\n\n    /// @dev Verifies that a hash has been signed by the given signer.\n    /// @param hash Any 32 byte hash.\n    /// @param signer Address that should have signed the given hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    /// @return True if the address recovered from the provided signature matches the input signer address.\n    function isValidSignature(\n        bytes32 hash,\n        address signer,\n        bytes memory signature\n    )\n        internal\n        view\n        returns (bool isValid)\n    {\n        // TODO: Domain separation: make hash depend on role. (Taker sig should not be valid as maker sig, etc.)\n        require(\n            signature.length > 0,\n            LENGTH_GREATER_THAN_0_REQUIRED\n        );\n\n        // Pop last byte off of signature byte array.\n        SignatureType signatureType = SignatureType(uint8(popByte(signature)));\n\n        // Variables are not scoped in Solidity.\n        uint8 v;\n        bytes32 r;\n        bytes32 s;\n        address recovered;\n\n        // Always illegal signature.\n        // This is always an implicit option since a signer can create a\n        // signature array with invalid type or length. We may as well make\n        // it an explicit option. This aids testing and analysis. It is\n        // also the initialization value for the enum type.\n        if (signatureType == SignatureType.Illegal) {\n            revert(SIGNATURE_ILLEGAL);\n\n        // Always invalid signature.\n        // Like Illegal, this is always implicitly available and therefore\n        // offered explicitly. It can be implicitly created by providing\n        // a correctly formatted but incorrect signature.\n        } else if (signatureType == SignatureType.Invalid) {\n            require(\n                signature.length == 0,\n                LENGTH_0_REQUIRED\n            );\n            isValid = false;\n            return isValid;\n\n        // Signature using EIP712\n        } else if (signatureType == SignatureType.EIP712) {\n            require(\n                signature.length == 65,\n                LENGTH_65_REQUIRED\n            );\n            v = uint8(signature[0]);\n            r = readBytes32(signature, 1);\n            s = readBytes32(signature, 33);\n            recovered = ecrecover(hash, v, r, s);\n            isValid = signer == recovered;\n            return isValid;\n\n        // Signed using web3.eth_sign\n        } else if (signatureType == SignatureType.EthSign) {\n            require(\n                signature.length == 65,\n                LENGTH_65_REQUIRED\n            );\n            v = uint8(signature[0]);\n            r = readBytes32(signature, 1);\n            s = readBytes32(signature, 33);\n            recovered = ecrecover(\n                keccak256(abi.encodePacked(ETH_PERSONAL_MESSAGE, hash)),\n                v,\n                r,\n                s\n            );\n            isValid = signer == recovered;\n            return isValid;\n\n        // Implicitly signed by caller.\n        // The signer has initiated the call. In the case of non-contract\n        // accounts it means the transaction itself was signed.\n        // Example: let's say for a particular operation three signatures\n        // A, B and C are required. To submit the transaction, A and B can\n        // give a signature to C, who can then submit the transaction using\n        // `Caller` for his own signature. Or A and C can sign and B can\n        // submit using `Caller`. Having `Caller` allows this flexibility.\n        } else if (signatureType == SignatureType.Caller) {\n            require(\n                signature.length == 0,\n                LENGTH_0_REQUIRED\n            );\n            isValid = signer == msg.sender;\n            return isValid;\n\n        // Signature verified by wallet contract.\n        // If used with an order, the maker of the order is the wallet contract.\n        } else if (signatureType == SignatureType.Wallet) {\n            isValid = IWallet(signer).isValidSignature(hash, signature);\n            return isValid;\n\n        // Signature verified by validator contract.\n        // If used with an order, the maker of the order can still be an EOA.\n        // A signature using this type should be encoded as:\n        // | Offset   | Length | Contents                        |\n        // | 0x00     | x      | Signature to validate           |\n        // | 0x00 + x | 20     | Address of validator contract   |\n        // | 0x14 + x | 1      | Signature type is always \"\\x06\" |\n        } else if (signatureType == SignatureType.Validator) {\n            // Pop last 20 bytes off of signature byte array.\n            address validator = popAddress(signature);\n            // Ensure signer has approved validator.\n            if (!allowedValidators[signer][validator]) {\n                return false;\n            }\n            isValid = IValidator(validator).isValidSignature(\n                hash,\n                signer,\n                signature\n            );\n            return isValid;\n\n        // Signer signed hash previously using the preSign function.\n        } else if (signatureType == SignatureType.PreSigned) {\n            isValid = preSigned[hash][signer];\n            return isValid;\n\n        // Signature from Trezor hardware wallet.\n        // It differs from web3.eth_sign in the encoding of message length\n        // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n        // self-terminating which leads to ambiguities).\n        // See also:\n        // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n        // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n        // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n        } else if (signatureType == SignatureType.Trezor) {\n            require(\n                signature.length == 65,\n                LENGTH_65_REQUIRED\n            );\n            v = uint8(signature[0]);\n            r = readBytes32(signature, 1);\n            s = readBytes32(signature, 33);\n            recovered = ecrecover(\n                keccak256(abi.encodePacked(TREZOR_PERSONAL_MESSAGE, hash)),\n                v,\n                r,\n                s\n            );\n            isValid = signer == recovered;\n            return isValid;\n\n        // Signer signed hash previously using the preSign function\n        } else if (signatureType == SignatureType.PreSigned) {\n            isValid = preSigned[hash][signer];\n            return isValid;\n        }\n\n        // Anything else is illegal (We do not return false because\n        // the signature may actually be valid, just not in a format\n        // that we currently support. In this case returning false\n        // may lead the caller to incorrectly believe that the\n        // signature was invalid.)\n        revert(SIGNATURE_UNSUPPORTED);\n    }\n}\n",
        "current/protocol/Exchange/MixinTransactions.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\n\ncontract MixinTransactions is\n    LibExchangeErrors,\n    MSignatureValidator,\n    MTransactions\n{\n\n    // Mapping of transaction hash => executed\n    // This prevents transactions from being executed more than once.\n    mapping (bytes32 => bool) public transactions;\n\n    // Address of current transaction signer\n    address public currentContextAddress;\n\n    /// @dev Executes an exchange method call in the context of signer.\n    /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n    /// @param signer Address of transaction signer.\n    /// @param data AbiV2 encoded calldata.\n    /// @param signature Proof of signer transaction by signer.\n    function executeTransaction(\n        uint256 salt,\n        address signer,\n        bytes data,\n        bytes signature\n    )\n        external\n    {\n        // Prevent reentrancy\n        require(\n            currentContextAddress == address(0),\n            REENTRANCY_ILLEGAL\n        );\n\n        // Calculate transaction hash\n        bytes32 transactionHash = keccak256(abi.encodePacked(\n            address(this),\n            signer,\n            salt,\n            data\n        ));\n\n        // Validate transaction has not been executed\n        require(\n            !transactions[transactionHash],\n            INVALID_TX_HASH\n        );\n\n        // Transaction always valid if signer is sender of transaction\n        if (signer != msg.sender) {\n            // Validate signature\n            require(\n                isValidSignature(transactionHash, signer, signature),\n                INVALID_TX_SIGNATURE\n            );\n\n            // Set the current transaction signer\n            currentContextAddress = signer;\n        }\n\n        // Execute transaction\n        transactions[transactionHash] = true;\n        require(\n            address(this).delegatecall(data),\n            FAILED_EXECUTION\n        );\n\n        // Reset current transaction signer\n        // TODO: Check if gas is paid when currentContextAddress is already 0.\n        currentContextAddress = address(0);\n    }\n\n    /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n    ///      If calling a fill function, this address will represent the taker.\n    ///      If calling a cancel function, this address will represent the maker.\n    /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n    ///         `msg.sender` if entry point is any other function.\n    function getCurrentContextAddress()\n        internal\n        view\n        returns (address)\n    {\n        address contextAddress = currentContextAddress == address(0) ? msg.sender : currentContextAddress;\n        return contextAddress;\n    }\n}\n",
        "current/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract ISignatureValidator {\n\n    /// @dev Approves a hash on-chain using any valid signature type.\n    ///      After presigning a hash, the preSign signature type will become valid for that hash and signer.\n    /// @param signer Address that should have signed the given hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    function preSign(\n        bytes32 hash,\n        address signer,\n        bytes signature\n    )\n        external;\n    \n    /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n    /// @param validator Address of Validator contract.\n    /// @param approval Approval or disapproval of  Validator contract.\n    function setSignatureValidatorApproval(\n        address validator,\n        bool approval\n    )\n        external;\n}\n",
        "current/protocol/Exchange/interfaces/ITransactions.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\ncontract ITransactions {\n\n    /// @dev Executes an exchange method call in the context of signer.\n    /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n    /// @param signer Address of transaction signer.\n    /// @param data AbiV2 encoded calldata.\n    /// @param signature Proof of signer transaction by signer.\n    function executeTransaction(\n        uint256 salt,\n        address signer,\n        bytes data,\n        bytes signature)\n        external;\n}\n",
        "current/protocol/Exchange/interfaces/IValidator.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.23;\n\ncontract IValidator {\n\n    /// @dev Verifies that a signature is valid.\n    /// @param hash Message hash that is signed.\n    /// @param signer Address that should have signed the given hash.\n    /// @param signature Proof of signing.\n    /// @return Validity of order signature.\n    function isValidSignature(\n        bytes32 hash,\n        address signer,\n        bytes signature\n    )\n        external\n        view\n        returns (bool isValid);\n}\n",
        "current/protocol/Exchange/interfaces/IWallet.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract IWallet {\n\n    /// @dev Verifies that a signature is valid.\n    /// @param hash Message hash that is signed.\n    /// @param signature Proof of signing.\n    /// @return Validity of order signature.\n    function isValidSignature(\n        bytes32 hash,\n        bytes signature\n    )\n        external\n        view\n        returns (bool isValid);\n}\n",
        "current/protocol/Exchange/libs/LibExchangeErrors.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibExchangeErrors {\n    /// Order validation errors ///\n    string constant ORDER_UNFILLABLE = \"ORDER_UNFILLABLE\";                  // Order cannot be filled.\n    string constant INVALID_MAKER = \"INVALID_MAKER\";                        // Invalid makerAddress.\n    string constant INVALID_TAKER = \"INVALID_TAKER\";                        // Invalid takerAddress.\n    string constant INVALID_SENDER = \"INVALID_SENDER\";                      // Invalid `msg.sender`.\n    string constant INVALID_ORDER_SIGNATURE = \"INVALID_ORDER_SIGNATURE\";    // Signature validation failed. \n    string constant ASSET_DATA_MISMATCH = \"ASSET_DATA_MISMATCH\";            // Asset data must be the same for each order. \n    \n    /// fillOrder validation errors ///\n    string constant INVALID_TAKER_AMOUNT = \"INVALID_TAKER_AMOUNT\";          // takerAssetFillAmount cannot equal 0.\n    string constant ROUNDING_ERROR = \"ROUNDING_ERROR\";                      // Rounding error greater than 0.1% of takerAssetFillAmount. \n    \n    /// Signature validation errors ///\n    string constant INVALID_SIGNATURE = \"INVALID_SIGNATURE\";                // Signature validation failed. \n    string constant SIGNATURE_ILLEGAL = \"SIGNATURE_ILLEGAL\";                // Signature type is illegal.\n    string constant SIGNATURE_UNSUPPORTED = \"SIGNATURE_UNSUPPORTED\";        // Signature type unsupported.\n    \n    /// cancelOrdersUptTo errors ///\n    string constant INVALID_NEW_MAKER_EPOCH = \"INVALID_NEW_MAKER_EPOCH\";    // Specified salt must be greater than or equal to existing makerEpoch.\n\n    /// fillOrKillOrder errors ///\n    string constant COMPLETE_FILL_FAILED = \"COMPLETE_FILL_FAILED\";          // Desired takerAssetFillAmount could not be completely filled. \n\n    /// matchOrders errors ///\n    string constant NEGATIVE_SPREAD_REQUIRED = \"NEGATIVE_SPREAD_REQUIRED\";  // Matched orders must have a negative spread.\n\n    /// Transaction errors ///\n    string constant REENTRANCY_ILLEGAL = \"REENTRANCY_ILLEGAL\";              // Recursive reentrancy is not allowed. \n    string constant INVALID_TX_HASH = \"INVALID_TX_HASH\";                    // Transaction has already been executed. \n    string constant INVALID_TX_SIGNATURE = \"INVALID_TX_SIGNATURE\";          // Signature validation failed. \n    string constant FAILED_EXECUTION = \"FAILED_EXECUTION\";                  // Transaction execution failed. \n    \n    /// registerAssetProxy errors ///\n    string constant ASSET_PROXY_MISMATCH = \"ASSET_PROXY_MISMATCH\";          // oldAssetProxy proxy does not match currentAssetProxy. \n    string constant ASSET_PROXY_ID_MISMATCH = \"ASSET_PROXY_ID_MISMATCH\";    // newAssetProxyId does not match given assetProxyId.\n\n    /// Length validation errors ///\n    string constant LENGTH_GREATER_THAN_0_REQUIRED = \"LENGTH_GREATER_THAN_0_REQUIRED\"; // Byte array must have a length greater than 0.\n    string constant LENGTH_0_REQUIRED = \"LENGTH_1_REQUIRED\";                // Byte array must have a length of 1.\n    string constant LENGTH_65_REQUIRED = \"LENGTH_66_REQUIRED\";              // Byte array must have a length of 66.\n}\n",
        "current/protocol/Exchange/mixins/MSignatureValidator.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\ncontract MSignatureValidator is\n    ISignatureValidator\n{\n    // Allowed signature types.\n    enum SignatureType {\n        Illegal,    // 0x00, default value\n        Invalid,    // 0x01\n        EIP712,     // 0x02\n        EthSign,    // 0x03\n        Caller,     // 0x04\n        Wallet,     // 0x05\n        Validator,  // 0x06\n        PreSigned,  // 0x07\n        Trezor      // 0x08\n    }\n\n    /// @dev Verifies that a signature is valid.\n    /// @param hash Message hash that is signed.\n    /// @param signer Address of signer.\n    /// @param signature Proof of signing.\n    /// @return Validity of order signature.\n    function isValidSignature(\n        bytes32 hash,\n        address signer,\n        bytes memory signature\n    )\n        internal\n        view\n        returns (bool isValid);\n}\n",
        "current/protocol/Exchange/mixins/MTransactions.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\npragma solidity ^0.4.24;\n\nimport \"../interfaces/ITransactions.sol\";\n\ncontract MTransactions is\n    ITransactions\n{\n\n    /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n    ///      If calling a fill function, this address will represent the taker.\n    ///      If calling a cancel function, this address will represent the maker.\n    /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n    ///         `msg.sender` if entry point is any other function.\n    function getCurrentContextAddress()\n        internal\n        view\n        returns (address);\n}\n",
        "current/test/TestSignatureValidator/TestSignatureValidator.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/MixinSignatureValidator.sol\";\nimport \"../../protocol/Exchange/MixinTransactions.sol\";\n\ncontract TestSignatureValidator is\n    MixinSignatureValidator,\n    MixinTransactions\n{\n\n    function publicIsValidSignature(\n        bytes32 hash,\n        address signer,\n        bytes memory signature\n    )\n        public\n        view\n        returns (bool isValid)\n    {\n        isValid = isValidSignature(\n            hash,\n            signer,\n            signature\n        );\n        return isValid;\n    }\n}\n",
        "current/utils/LibBytes/LibBytes.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibBytes {\n\n    // Revert reasons\n    string constant GT_ZERO_LENGTH_REQUIRED = \"Length must be greater than 0.\";\n    string constant GTE_4_LENGTH_REQUIRED = \"Length must be greater than or equal to 4.\";\n    string constant GTE_20_LENGTH_REQUIRED = \"Length must be greater than or equal to 20.\";\n    string constant GTE_32_LENGTH_REQUIRED = \"Length must be greater than or equal to 32.\";\n    string constant INDEX_OUT_OF_BOUNDS = \"Specified array index is out of bounds.\";\n\n    /// @dev Pops the last byte off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The byte that was popped off.\n    function popByte(bytes memory b)\n        internal\n        pure\n        returns (bytes1 result)\n    {\n        require(\n            b.length > 0,\n            GT_ZERO_LENGTH_REQUIRED\n        );\n\n        // Store last byte.\n        result = b[b.length - 1];\n        \n        assembly {\n            // Decrement length of byte array.\n            let newLen := sub(mload(b), 1)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The 20 byte address that was popped off.\n    function popAddress(bytes memory b)\n        internal\n        pure\n        returns (address result)\n    {\n        require(\n            b.length >= 20,\n            GTE_20_LENGTH_REQUIRED\n        );\n\n        // Store last 20 bytes.\n        result = readAddress(b, b.length - 20);\n\n        assembly {\n            // Subtract 20 from byte array length.\n            let newLen := sub(mload(b), 20)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Tests equality of two byte arrays.\n    /// @param lhs First byte array to compare.\n    /// @param rhs Second byte array to compare.\n    /// @return True if arrays are the same. False otherwise.\n    function areBytesEqual(\n        bytes memory lhs,\n        bytes memory rhs\n    )\n        internal\n        pure\n        returns (bool equal)\n    {\n        assembly {\n            // Get the number of words occupied by <lhs>\n            let lenFullWords := div(add(mload(lhs), 0x1F), 0x20)\n\n            // Add 1 to the number of words, to account for the length field\n            lenFullWords := add(lenFullWords, 0x1)\n\n            // Test equality word-by-word.\n            // Terminates early if there is a mismatch.\n            for {let i := 0} lt(i, lenFullWords) {i := add(i, 1)} {\n                let lhsWord := mload(add(lhs, mul(i, 0x20)))\n                let rhsWord := mload(add(rhs, mul(i, 0x20)))\n                equal := eq(lhsWord, rhsWord)\n                if eq(equal, 0) {\n                    // Break\n                    i := lenFullWords\n                }\n            }\n       }\n\n       return equal;\n    }\n\n    /// @dev Reads an address from a position in a byte array.\n    /// @param b Byte array containing an address.\n    /// @param index Index in byte array of address.\n    /// @return address from byte array.\n    function readAddress(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (address result)\n    {\n        require(\n            b.length >= index + 20,  // 20 is length of address\n            GTE_20_LENGTH_REQUIRED\n        ); \n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Read address from array memory\n        assembly {\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 20-byte mask to obtain address\n            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    /// @dev Writes an address into a specific position in a byte array.\n    /// @param b Byte array to insert address into.\n    /// @param index Index in byte array of address.\n    /// @param input Address to put into byte array.\n    function writeAddress(\n        bytes memory b,\n        uint256 index,\n        address input\n    )\n        internal\n        pure\n    {\n        require(\n            b.length >= index + 20,  // 20 is length of address\n            GTE_20_LENGTH_REQUIRED\n        ); \n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Store address into array memory\n        assembly {\n            // The address occupies 20 bytes and mstore stores 32 bytes.\n            // First fetch the 32-byte word where we'll be storing the address, then\n            // apply a mask so we have only the bytes in the word that the address will not occupy.\n            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n            let neighbors := and(mload(add(b, index)), 0xffffffffffffffffffffffff0000000000000000000000000000000000000000)\n\n            // Store the neighbors and address into memory\n            mstore(add(b, index), xor(input, neighbors))\n        }\n    }\n\n    /// @dev Reads a bytes32 value from a position in a byte array.\n    /// @param b Byte array containing a bytes32 value.\n    /// @param index Index in byte array of bytes32 value.\n    /// @return bytes32 value from byte array.\n    function readBytes32(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        require(\n            b.length >= index + 32,\n            GTE_32_LENGTH_REQUIRED\n        );\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            result := mload(add(b, index))\n        }\n        return result;\n    }\n\n    /// @dev Writes a bytes32 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input\n    )\n        internal\n        pure\n    {\n        require(\n            b.length >= index + 32,\n            GTE_32_LENGTH_REQUIRED\n        );\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            mstore(add(b, index), input)\n        }\n    }\n\n    /// @dev Reads a uint256 value from a position in a byte array.\n    /// @param b Byte array containing a uint256 value.\n    /// @param index Index in byte array of uint256 value.\n    /// @return uint256 value from byte array.\n    function readUint256(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (uint256 result)\n    {\n        return uint256(readBytes32(b, index));\n    }\n\n    /// @dev Writes a uint256 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input\n    )\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n\n    /// @dev Reads the first 4 bytes from a byte array of arbitrary length.\n    /// @param b Byte array to read first 4 bytes from.\n    /// @return First 4 bytes of data.\n    function readFirst4(bytes memory b)\n        internal\n        pure\n        returns (bytes4 result)\n    {\n        require(\n            b.length >= 4,\n            GTE_4_LENGTH_REQUIRED\n        );\n        assembly {\n            result := mload(add(b, 32))\n        }\n        return result;\n    }\n}\n"
    },
    "sourceTreeHashHex": "0xa22b90ef9c8956fde2135677908074a7d60d9e87f1ae95f924932f7c0a55fece",
    "compiler": {
        "name": "solc",
        "version": "soljson-v0.4.24+commit.e67f0147.js",
        "settings": {
            "optimizer": {
                "enabled": true,
                "runs": 200
            },
            "outputSelection": {
                "*": {
                    "*": [
                        "abi",
                        "evm.bytecode.object",
                        "evm.bytecode.sourceMap",
                        "evm.deployedBytecode.object",
                        "evm.deployedBytecode.sourceMap"
                    ]
                }
            }
        }
    },
    "networks": {}
}