Contract con_staking_smart_empoch_rswp_rswp_05


Contract Code


  
1 import con_rswp_lst001
2 STAKING_TOKEN = con_rswp_lst001
3 YIELD_TOKEN = con_rswp_lst001
4 __Owner = Variable(contract='con_staking_smart_empoch_rswp_rswp_05', name=
5 'Owner')
6 __DevRewardWallet = Variable(contract=
7 'con_staking_smart_empoch_rswp_rswp_05', name='DevRewardWallet')
8 __EmissionRatePerHour = Variable(contract=
9 'con_staking_smart_empoch_rswp_rswp_05', name='EmissionRatePerHour')
10 __DevRewardPct = Variable(contract='con_staking_smart_empoch_rswp_rswp_05',
11 name='DevRewardPct')
12 __StartTime = Variable(contract='con_staking_smart_empoch_rswp_rswp_05',
13 name='StartTime')
14 __EndTime = Variable(contract='con_staking_smart_empoch_rswp_rswp_05', name
15 ='EndTime')
16 __OpenForBusiness = Variable(contract=
17 'con_staking_smart_empoch_rswp_rswp_05', name='OpenForBusiness')
18 __Deposits = Hash(default_value=False, contract=
19 'con_staking_smart_empoch_rswp_rswp_05', name='Deposits')
20 __Withdrawals = Hash(default_value=0, contract=
21 'con_staking_smart_empoch_rswp_rswp_05', name='Withdrawals')
22 __CurrentEpochIndex = Variable(contract=
23 'con_staking_smart_empoch_rswp_rswp_05', name='CurrentEpochIndex')
24 __Epochs = Hash(default_value=False, contract=
25 'con_staking_smart_empoch_rswp_rswp_05', name='Epochs')
26 __StakedBalance = Variable(contract='con_staking_smart_empoch_rswp_rswp_05',
27 name='StakedBalance')
28 __WithdrawnBalance = Variable(contract=
29 'con_staking_smart_empoch_rswp_rswp_05', name='WithdrawnBalance')
30 __EpochMinTime = Variable(contract='con_staking_smart_empoch_rswp_rswp_05',
31 name='EpochMinTime')
32 __EpochMaxRatioIncrease = Variable(contract=
33 'con_staking_smart_empoch_rswp_rswp_05', name='EpochMaxRatioIncrease')
34 __meta = Hash(default_value=False, contract=
35 'con_staking_smart_empoch_rswp_rswp_05', name='meta')
36
37
38 def ____():
39 __Owner.set(ctx.caller)
40 __DevRewardWallet.set(ctx.caller)
41 __CurrentEpochIndex.set(0)
42 __StakedBalance.set(0)
43 __WithdrawnBalance.set(0)
44 __EpochMaxRatioIncrease.set(10)
45 __EpochMinTime.set(30 * 60)
46 __Epochs[0] = {'time': now, 'staked': 0, 'amt_per_hr': 3000}
47 __meta['version'] = '0.0.1'
48 __meta['type'] = 'staking_smart_epoch'
49 __meta['STAKING_TOKEN'] = 'con_rswp_lst001'
50 __meta['YIELD_TOKEN'] = 'con_rswp_lst001'
51 __EmissionRatePerHour.set(100)
52 __DevRewardPct.set(1 / 10)
53 __StartTime.set(datetime.datetime(year=2018, month=1, day=1, hour=0))
54 __EndTime.set(datetime.datetime(year=2022, month=3, day=4, hour=0))
55 __OpenForBusiness.set(True)
56
57
58 @__export('con_staking_smart_empoch_rswp_rswp_05')
59 def addStakingTokens(amount: float):
60 assert __OpenForBusiness.get(
61 ) == True, 'This staking pool is not open right now.'
62 assert amount > 0, 'You cannot stake a negative balance.'
63 user = ctx.caller
64 STAKING_TOKEN.transfer_from(amount=amount, to=ctx.this, main_account=user)
65 staked = __StakedBalance.get()
66 new_staked_amount = staked + amount
67 __StakedBalance.set(new_staked_amount)
68 epoch_index = __decideIncrementEpoch(new_staked_amount=new_staked_amount)
69 if __Deposits[user] is False:
70 __Deposits[user] = []
71 deposits = __Deposits[user]
72 deposits.append({'starting_epoch': epoch_index, 'time': now, 'amount':
73 amount})
74 __Deposits[user] = deposits
75
76
77 @__export('con_staking_smart_empoch_rswp_rswp_05')
78 def withdrawYield(amount: float):
79 assert amount > 0, 'You cannot harvest a negative balance'
80 user = ctx.caller
81 deposits = __Deposits[user]
82 assert deposits is not False, 'You have no deposit to withdraw yield from.'
83 withdrawn_yield = __Withdrawals[user]
84 harvestable_yield = 0
85 for d in deposits:
86 harvestable_yield += __calculateYield(starting_epoch_index=d[
87 'starting_epoch'], start_time=d['time'], amount=d['amount'])
88 harvestable_yield -= withdrawn_yield
89 yield_to_harvest = (amount if amount < harvestable_yield else
90 harvestable_yield)
91 assert yield_to_harvest > 0, 'There is no yield to harvest right now :('
92 dev_share = yield_to_harvest * __DevRewardPct.get()
93 if dev_share > 0:
94 YIELD_TOKEN.transfer(to=__DevRewardWallet.get(), amount=dev_share)
95 user_share = yield_to_harvest - dev_share
96 YIELD_TOKEN.transfer(to=user, amount=user_share)
97 __Withdrawals[user] = withdrawn_yield + yield_to_harvest
98 new_withdrawn_amount = __WithdrawnBalance.get() + yield_to_harvest
99 __WithdrawnBalance.set(new_withdrawn_amount)
100
101
102 @__export('con_staking_smart_empoch_rswp_rswp_05')
103 def withdrawTokensAndYield():
104 user = ctx.caller
105 deposits = __Deposits[user]
106 assert deposits is not False, 'You have no deposit to withdraw'
107 withdrawn_yield = __Withdrawals[user]
108 stake_to_return = 0
109 yield_to_harvest = 0
110 for d in deposits:
111 yield_to_harvest += __calculateYield(starting_epoch_index=d[
112 'starting_epoch'], start_time=d['time'], amount=d['amount'])
113 stake_to_return += d['amount']
114 STAKING_TOKEN.transfer(to=user, amount=stake_to_return)
115 yield_to_harvest -= withdrawn_yield
116 if yield_to_harvest > 0:
117 dev_share = yield_to_harvest * __DevRewardPct.get()
118 if dev_share > 0:
119 YIELD_TOKEN.transfer(to=__DevRewardWallet.get(), amount=dev_share)
120 user_share = yield_to_harvest - dev_share
121 YIELD_TOKEN.transfer(to=user, amount=user_share)
122 __Deposits[user] = False
123 __Withdrawals[user] = 0
124 new_staked_amount = __StakedBalance.get() - stake_to_return
125 __StakedBalance.set(new_staked_amount)
126 new_withdrawn_amount = __WithdrawnBalance.get() + yield_to_harvest
127 __WithdrawnBalance.set(new_withdrawn_amount)
128 __decideIncrementEpoch(new_staked_amount=new_staked_amount)
129
130
131 def __calculateYield(starting_epoch_index: int, start_time, amount: float):
132 current_epoch_index = __getCurrentEpochIndex()
133 this_epoch_index = starting_epoch_index
134 y = 0
135 while this_epoch_index <= current_epoch_index:
136 this_epoch = __Epochs[this_epoch_index]
137 next_epoch = __Epochs[this_epoch_index + 1]
138 delta = 0
139 if starting_epoch_index == current_epoch_index:
140 delta = __fitTimeToRange(now) - __fitTimeToRange(start_time)
141 elif this_epoch_index == starting_epoch_index:
142 delta = __fitTimeToRange(next_epoch['time']) - __fitTimeToRange(
143 start_time)
144 elif this_epoch_index == current_epoch_index:
145 delta = __fitTimeToRange(now) - __fitTimeToRange(this_epoch['time']
146 )
147 else:
148 delta = __fitTimeToRange(next_epoch['time']) - __fitTimeToRange(
149 this_epoch['time'])
150 pct_share_of_stake = 0
151 if amount is not 0 and this_epoch['staked'] is not 0:
152 pct_share_of_stake = decimal(amount) / this_epoch['staked']
153 emission_rate_per_hour = this_epoch['amt_per_hr']
154 global_yield_this_epoch = delta.seconds * __getEmissionRatePerSecond(
155 emission_rate_per_hour)
156 deposit_yield_this_epoch = global_yield_this_epoch * decimal(
157 pct_share_of_stake)
158 y += deposit_yield_this_epoch
159 this_epoch_index += 1
160 return y
161
162
163 def __fitTimeToRange(time: Any):
164 if time < __StartTime.get():
165 time = __StartTime.get()
166 elif time > __EndTime.get():
167 time = __EndTime.get()
168 return time
169
170
171 def __getCurrentEpochIndex():
172 current_epoch_index = __CurrentEpochIndex.get()
173 return current_epoch_index
174
175
176 def __decideIncrementEpoch(new_staked_amount: float):
177 epoch_index = __CurrentEpochIndex.get()
178 this_epoch = __Epochs[epoch_index]
179 this_epoch_staked = this_epoch['staked']
180 delta = now - this_epoch['time']
181 delta_seconds = delta.seconds if delta.seconds > 0 else 0
182 if delta_seconds >= __EpochMinTime.get(
183 ) or this_epoch_staked is 0 or __maxStakedChangeRatioExceeded(
184 new_staked_amount=new_staked_amount, this_epoch_staked=
185 this_epoch_staked):
186 epoch_index = __incrementEpoch(new_staked_amount)
187 return epoch_index
188
189
190 def __maxStakedChangeRatioExceeded(new_staked_amount: float,
191 this_epoch_staked: float):
192 smaller = (new_staked_amount if new_staked_amount <= this_epoch_staked else
193 this_epoch_staked)
194 bigger = (new_staked_amount if new_staked_amount >= this_epoch_staked else
195 this_epoch_staked)
196 dif = bigger - smaller
197 return dif / this_epoch_staked >= __EpochMaxRatioIncrease.get()
198
199
200 def __incrementEpoch(new_staked_amount: float):
201 current_epoch = __CurrentEpochIndex.get()
202 new_epoch_idx = current_epoch + 1
203 __CurrentEpochIndex.set(new_epoch_idx)
204 __Epochs[new_epoch_idx] = {'time': now, 'staked': new_staked_amount,
205 'amt_per_hr': __Epochs[current_epoch]['amt_per_hr']}
206 return new_epoch_idx
207
208
209 @__export('con_staking_smart_empoch_rswp_rswp_05')
210 def changeAmountPerHour(amount_per_hour: float):
211 __assertOwner()
212 current_epoch = __CurrentEpochIndex.get()
213 new_epoch_idx = current_epoch + 1
214 __CurrentEpochIndex.set(new_epoch_idx)
215 __setEmissionRatePerHour(amount=amount_per_hour)
216 __Epochs[new_epoch_idx] = {'time': now, 'staked': __StakedBalance.get(),
217 'amt_per_hr': amount_per_hour}
218
219
220 @__export('con_staking_smart_empoch_rswp_rswp_05')
221 def setEpochMinTime(min_seconds: float):
222 __assertOwner()
223 assert min_seconds >= 0, 'you must choose a positive value.'
224 __EpochMinTime.set(min_seconds)
225
226
227 @__export('con_staking_smart_empoch_rswp_rswp_05')
228 def setEpochMaxRatioIncrease(ratio: float):
229 __assertOwner()
230 assert ratio > 0, 'must be a positive value'
231 __EpochMaxRatioIncrease.set(ratio)
232
233
234 def __getEmissionRatePerSecond(emission_rate_per_hour: float):
235 emission_rate_per_minute = emission_rate_per_hour / 60
236 emission_rate_per_second = emission_rate_per_minute / 60
237 return emission_rate_per_second
238
239
240 @__export('con_staking_smart_empoch_rswp_rswp_05')
241 def setOwner(vk: str):
242 __assertOwner()
243 __Owner.set(vk)
244
245
246 @__export('con_staking_smart_empoch_rswp_rswp_05')
247 def setDevWallet(vk: str):
248 __assertOwner()
249 __DevRewardWallet.set(vk)
250
251
252 @__export('con_staking_smart_empoch_rswp_rswp_05')
253 def setDevRewardPct(amount: float):
254 __assertOwner()
255 assert amount < 1 and amount >= 0, 'Amount must be a value between 0 and 1'
256 __DevRewardPct.set(amount)
257
258
259 def __setEmissionRatePerHour(amount: float):
260 __assertOwner()
261 __EmissionRatePerHour.set(amount)
262
263
264 @__export('con_staking_smart_empoch_rswp_rswp_05')
265 def recoverYieldToken(amount: float):
266 __assertOwner()
267 YIELD_TOKEN.transfer(amount=amount, to=__Owner.get())
268
269
270 @__export('con_staking_smart_empoch_rswp_rswp_05')
271 def allowStaking(is_open: bool):
272 __assertOwner()
273 __OpenForBusiness.set(is_open)
274
275
276 @__export('con_staking_smart_empoch_rswp_rswp_05')
277 def setStartTime(year: int, month: int, day: int, hour: int):
278 __assertOwner()
279 time = datetime.datetime(year, month, day, hour)
280 __StartTime.set(time)
281
282
283 @__export('con_staking_smart_empoch_rswp_rswp_05')
284 def setEndTime(year: int, month: int, day: int, hour: int):
285 __assertOwner()
286 time = datetime.datetime(year, month, day, hour)
287 __EndTime.set(time)
288
289
290 def __assertOwner():
291 assert __Owner.get(
292 ) == ctx.caller, 'You must be the owner to call this function.'
293
294
295 @__export('con_staking_smart_empoch_rswp_rswp_05')
296 def emergencyReturnStake():
297 user = ctx.caller
298 deposits = __Deposits[user]
299 assert __Deposits[user
300 ] is not False, 'This account has no deposits to return.'
301 stake_to_return = 0
302 for d in deposits:
303 stake_to_return += d['amount']
304 STAKING_TOKEN.transfer(to=user, amount=stake_to_return)
305 __Deposits[user] = False
306 __Withdrawals[user] = 0
307 new_staked_amount = __StakedBalance.get() - stake_to_return
308 __StakedBalance.set(new_staked_amount)
309 __decideIncrementEpoch(new_staked_amount=new_staked_amount)
310

Byte Code

e30000000000000000000000000600000040000000738e020000640064016c005a0065005a0165005a0265036402640364048d025a0465036402640564048d025a0565036402640664048d025a0665036402640764048d025a0765036402640864048d025a0865036402640964048d025a0965036402640a64048d025a0a650b640b6402640c640d8d035a0c650b64006402640e640d8d035a0d65036402640f64048d025a0e650b640b64026410640d8d035a0f65036402641164048d025a1065036402641264048d025a1165036402641364048d025a1265036402641464048d025a13650b640b64026415640d8d035a146416641784005a15651664028301651764189c016419641a840483015a18651664028301651764189c01641b641c840483015a19651664028301641d641e840083015a1a651b6517641f9c026420642184045a1c651d64229c016423642484045a1e6425642684005a1f651764279c016428642984045a2065176517642a9c02642b642c84045a21651764279c01642d642e84045a226516640283016517642f9c0164306431840483015a23651664028301651764329c0164336434840483015a24651664028301651764359c0164366437840483015a25651764389c016439643a84045a266516640283016527643b9c01643c643d840483015a286516640283016527643b9c01643e643f840483015a29651664028301651764189c0164406441840483015a2a651764189c016442644384045a2b651664028301651764189c0164446445840483015a2c651664028301652d64469c0164476448840483015a2e651664028301651b651b651b651b64499c04644a644b840483015a2f651664028301651b651b651b651b64499c04644c644d840483015a30644e644f84005a3165166402830164506451840083015a32640153002952e9000000004eda25636f6e5f7374616b696e675f736d6172745f656d706f63685f727377705f727377705f3035da054f776e65722902da08636f6e7472616374da046e616d65da0f44657652657761726457616c6c6574da13456d697373696f6e52617465506572486f7572da0c446576526577617264506374da09537461727454696d65da07456e6454696d65da0f4f70656e466f72427573696e65737346da084465706f736974732903da0d64656661756c745f76616c756572040000007205000000da0b5769746864726177616c73da1143757272656e7445706f6368496e646578da0645706f636873da0d5374616b656442616c616e6365da1057697468647261776e42616c616e6365da0c45706f63684d696e54696d65da1545706f63684d6178526174696f496e637265617365da046d65746163000000000000000000000000070000004300000073cc00000074006a0174026a038301010074046a0174026a038301010074056a0164018301010074066a0164018301010074076a0164018301010074086a0164028301010074096a01641683010100740a6401640564069c03740b64013c006407740c64083c006409740c640a3c00640b740c640c3c00640b740c640d3c00740d6a01640e83010100740e6a01641783010100740f6a0174106a106410640f640f640164118d048301010074116a0174106a10641264136414640164118d048301010074126a016415830101006400530029184e7201000000e90a000000e91e000000e93c00000069b80b00002903da0474696d65da067374616b6564da0a616d745f7065725f68727a05302e302e31da0776657273696f6eda137374616b696e675f736d6172745f65706f6368da0474797065da0f636f6e5f727377705f6c7374303031da0d5354414b494e475f544f4b454eda0b5949454c445f544f4b454ee964000000e90100000069e20700002904da0479656172da056d6f6e7468da03646179da04686f757269e6070000e903000000e904000000546908070000679a9999999999b93f2913da075f5f4f776e6572da03736574da03637478da0663616c6c6572da115f5f44657652657761726457616c6c6574da135f5f43757272656e7445706f6368496e646578da0f5f5f5374616b656442616c616e6365da125f5f57697468647261776e42616c616e6365da175f5f45706f63684d6178526174696f496e637265617365da0e5f5f45706f63684d696e54696d65da036e6f77da085f5f45706f636873da065f5f6d657461da155f5f456d697373696f6e52617465506572486f7572da0e5f5f446576526577617264506374da0b5f5f537461727454696d65da086461746574696d65da095f5f456e6454696d65da115f5f4f70656e466f72427573696e657373a900723d000000723d000000da00da045f5f5f5f26000000732200000000010c010c010a010a010a010a010a01100108010801080108010a010a0118011801723f0000002901da06616d6f756e74630100000000000000060000000500000043000000739a00000074006a01830064016b02731474026402830182017c0064036b047324740264048301820174036a047d0174056a067c0074036a077c0164058d03010074086a0183007d027c027c0017007d0374086a097c0383010100740a7c0364068d017d04740b7c01190064076b0872746700740b7c013c00740b7c0119007d057c056a0c7c04740d7c0064089c03830101007c05740b7c013c006400530029094e547a2854686973207374616b696e6720706f6f6c206973206e6f74206f70656e207269676874206e6f772e72010000007a24596f752063616e6e6f74207374616b652061206e656761746976652062616c616e63652e29037240000000da02746fda0c6d61696e5f6163636f756e742901da116e65775f7374616b65645f616d6f756e74462903da0e7374617274696e675f65706f636872190000007240000000290e723c000000da03676574da0e417373657274696f6e4572726f72722c000000722d0000007220000000da0d7472616e736665725f66726f6dda04746869737230000000722b000000da165f5f646563696465496e6372656d656e7445706f6368da0a5f5f4465706f73697473da06617070656e64723400000029067240000000da0475736572721a0000007243000000da0b65706f63685f696e646578da086465706f73697473723d000000723d000000723e000000da106164645374616b696e67546f6b656e733a000000731e000000000206010e01100106011201080108010a010a010c010801080108010a01724f0000006301000000000000000a000000070000004300000073f00000007c0064016b047310740064028301820174016a027d0174037c0119007d027c0264036b09732e740064048301820174047c0119007d0364017d04782a7c0244005d227d057c0474057c05640519007c05640619007c056407190064088d0337007d04714057007c047c0338007d047c007c046b00727a7c006e027c047d067c0664016b04738e74006409830182017c0674066a07830014007d077c0764016b0472b474086a09740a6a0783007c07640a8d0201007c067c0718007d0874086a097c017c08640a8d0201007c037c06170074047c013c00740b6a0783007c0617007d09740b6a0c7c098301010064005300290b4e72010000007a25596f752063616e6e6f7420686172766573742061206e656761746976652062616c616e6365467a2b596f752068617665206e6f206465706f73697420746f207769746864726177207969656c642066726f6d2e7244000000721900000072400000002903da147374617274696e675f65706f63685f696e646578da0a73746172745f74696d6572400000007a295468657265206973206e6f207969656c6420746f2068617276657374207269676874206e6f77203a28290272410000007240000000290d7246000000722c000000722d000000724a000000da0d5f5f5769746864726177616c73da105f5f63616c63756c6174655969656c64723800000072450000007221000000da087472616e73666572722e0000007231000000722b000000290a7240000000724c000000724e000000da0f77697468647261776e5f7969656c64da116861727665737461626c655f7969656c64da0164da107969656c645f746f5f68617276657374da096465765f7368617265da0a757365725f7368617265da146e65775f77697468647261776e5f616d6f756e74723d000000723d000000723e000000da0d77697468647261775969656c644d000000732a00000000021001060108011001080104010a0106011c0108010c01040110010c010801120108010e010c010c01725c0000006300000000000000000a0000000700000043000000730a01000074006a017d0074027c0019007d017c0164016b09731e740364028301820174047c0019007d0264037d0364037d0478367c0144005d2e7d057c0474057c05640419007c05640519007c056406190064078d0337007d047c037c056406190037007d037134570074066a077c007c0364088d0201007c047c0238007d047c0464036b0472c07c0474086a09830014007d067c0664036b0472aa740a6a07740b6a0983007c0664088d0201007c047c0618007d07740a6a077c007c0764088d020100640174027c003c00640374047c003c00740c6a0983007c0318007d08740c6a0d7c0883010100740e6a0983007c0417007d09740e6a0d7c0983010100740f7c0864098d01010064005300290a4e467a1f596f752068617665206e6f206465706f73697420746f20776974686472617772010000007244000000721900000072400000002903725000000072510000007240000000290272410000007240000000290172430000002910722c000000722d000000724a00000072460000007252000000725300000072200000007254000000723800000072450000007221000000722e0000007230000000722b00000072310000007249000000290a724c000000724e0000007255000000da0f7374616b655f746f5f72657475726e725800000072570000007259000000725a0000007243000000725b000000723d000000723d000000723e000000da167769746864726177546f6b656e73416e645969656c6466000000733200000000020601080110010801040104010a010601180110010e01080108010c010801120108010e01080108010c010a010c010a01725e0000002902725000000072400000006303000000000000000d00000004000000430000007300010000740083007d037c007d0464017d0578ec7c047c036b0172fa74017c0419007d0674017c046402170019007d0764017d087c007c036b02724a74027403830174027c01830118007d086e547c047c006b02726874027c0764031900830174027c01830118007d086e367c047c036b02728674027403830174027c0664031900830118007d086e1874027c0764031900830174027c0664031900830118007d0864017d097c0264016b0972c67c066404190064016b0972c674047c0283017c06640419001b007d097c06640519007d0a7c086a0574067c0a830114007d0b7c0b74047c09830114007d0c7c057c0c37007d057c04640237007d04711057007c05530029064e720100000072230000007219000000721a000000721b0000002907da165f5f67657443757272656e7445706f6368496e6465787235000000da105f5f66697454696d65546f52616e67657234000000da07646563696d616cda077365636f6e6473da1a5f5f676574456d697373696f6e526174655065725365636f6e64290d725000000072510000007240000000da1363757272656e745f65706f63685f696e646578da10746869735f65706f63685f696e646578da0179da0a746869735f65706f6368da0a6e6578745f65706f6368da0564656c7461da127063745f73686172655f6f665f7374616b65da16656d697373696f6e5f726174655f7065725f686f7572da17676c6f62616c5f7969656c645f746869735f65706f6368da186465706f7369745f7969656c645f746869735f65706f6368723d000000723d000000723e000000725300000083000000733600000000010601040104010a0108010c0104010801120108010c010a01080116030c010c010401140110010801060108010401080108010c01725300000029017219000000630100000000000000010000000200000043000000732e0000007c0074006a0183006b00721674006a0183007d006e147c0074026a0183006b04722a74026a0183007d007c00530029014e290372390000007245000000723b00000029017219000000723d000000723d000000723e0000007260000000a3000000730a00000000010c010a010c0108017260000000630000000000000000010000000100000043000000730c00000074006a0183007d007c00530029014e2902722f000000724500000029017264000000723d000000723d000000723e000000725f000000ab000000730400000000010801725f00000029017243000000630100000000000000060000000400000043000000736400000074006a0183007d0174027c0119007d027c02640119007d0374037c026402190018007d047c046a0464036b0472347c046a046e0264037d057c0574056a0183006b0573587c0364036b08735874067c007c0364048d02726074077c0083017d017c01530029054e721a0000007219000000720100000029027243000000da11746869735f65706f63685f7374616b65642908722f00000072450000007235000000723400000072620000007233000000da1e5f5f6d61785374616b65644368616e6765526174696f4578636565646564da105f5f696e6372656d656e7445706f636829067243000000724d0000007267000000726e0000007269000000da0d64656c74615f7365636f6e6473723d000000723d000000723e0000007249000000b0000000731600000000010801080108010c0114010c010a01020108010801724900000029027243000000726e00000063020000000000000005000000020000004300000073380000007c007c016b01720c7c006e027c017d027c007c016b05721c7c006e027c017d037c037c0218007d047c047c011b0074006a0183006b05530029014e29027232000000724500000029057243000000726e000000da07736d616c6c6572da06626967676572da03646966723d000000723d000000723e000000726f000000be000000730c00000000020c0104010c0104010801726f000000630100000000000000030000000400000043000000733600000074006a0183007d017c01640117007d0274006a027c028301010074037c0074047c0119006402190064039c0374047c023c007c02530029044e7223000000721b00000029037219000000721a000000721b0000002905722f0000007245000000722b0000007234000000723500000029037243000000da0d63757272656e745f65706f6368da0d6e65775f65706f63685f696478723d000000723d000000723e0000007270000000c8000000730c0000000001080108010a010401140172700000002901da0f616d6f756e745f7065725f686f7572630100000000000000030000000400000043000000734200000074008300010074016a0283007d017c01640117007d0274016a037c028301010074047c0064028d010100740574066a0283007c0064039c0374077c023c006400530029044e72230000002901724000000029037219000000721a000000721b0000002908da0d5f5f6173736572744f776e6572722f0000007245000000722b000000da185f5f736574456d697373696f6e52617465506572486f75727234000000723000000072350000002903727700000072750000007276000000723d000000723d000000723e000000da136368616e6765416d6f756e74506572486f7572d1000000730e00000000020601080108010a010a010801727a0000002901da0b6d696e5f7365636f6e647363010000000000000001000000020000004300000073240000007400830001007c0064016b057316740164028301820174026a037c00830101006400530029034e72010000007a21796f75206d7573742063686f6f7365206120706f7369746976652076616c75652e2904727800000072460000007233000000722b0000002901727b000000723d000000723d000000723e000000da0f73657445706f63684d696e54696d65dc0000007306000000000206011001727c0000002901da05726174696f63010000000000000001000000020000004300000073240000007400830001007c0064016b047316740164028301820174026a037c00830101006400530029034e72010000007a186d757374206265206120706f7369746976652076616c75652904727800000072460000007232000000722b0000002901727d000000723d000000723d000000723e000000da1873657445706f63684d6178526174696f496e637265617365e30000007306000000000206011001727e0000002901726b00000063010000000000000003000000020000004300000073140000007c0064011b007d017c0164011b007d027c02530029024e7218000000723d0000002903726b000000da18656d697373696f6e5f726174655f7065725f6d696e757465da18656d697373696f6e5f726174655f7065725f7365636f6e64723d000000723d000000723e0000007263000000ea000000730600000000010801080172630000002901da02766b630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e29037278000000722a000000722b00000029017281000000723d000000723d000000723e000000da087365744f776e6572f00000007304000000000206017282000000630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e29037278000000722e000000722b00000029017281000000723d000000723d000000723e000000da0c73657444657657616c6c6574f60000007304000000000206017283000000630100000000000000010000000200000043000000732c0000007400830001007c0064016b0072167c0064026b05731e740164038301820174026a037c00830101006400530029044e722300000072010000007a26416d6f756e74206d75737420626520612076616c7565206265747765656e203020616e6420312904727800000072460000007238000000722b00000029017240000000723d000000723d000000723e000000da0f736574446576526577617264506374fc00000073060000000002060118017284000000630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e290372780000007237000000722b00000029017240000000723d000000723d000000723e0000007279000000030100007304000000000106017279000000630100000000000000010000000400000043000000731c00000074008300010074016a027c0074036a04830064018d0201006400530029024e2902724000000072410000002905727800000072210000007254000000722a000000724500000029017240000000723d000000723d000000723e000000da117265636f7665725969656c64546f6b656e0801000073040000000002060172850000002901da0769735f6f70656e630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e29037278000000723c000000722b00000029017286000000723d000000723d000000723e000000da0c616c6c6f775374616b696e670e010000730400000000020601728700000029047224000000722500000072260000007227000000630400000000000000050000000500000043000000732400000074008300010074016a017c007c017c027c0383047d0474026a037c04830101006400530029014e29047278000000723a0000007239000000722b000000290572240000007225000000722600000072270000007219000000723d000000723d000000723e000000da0c736574537461727454696d651401000073060000000002060110017288000000630400000000000000050000000500000043000000732400000074008300010074016a017c007c017c027c0383047d0474026a037c04830101006400530029014e29047278000000723a000000723b000000722b000000290572240000007225000000722600000072270000007219000000723d000000723d000000723e000000da0a736574456e6454696d651b01000073060000000002060110017289000000630000000000000000000000000200000043000000731a00000074006a01830074026a036b02731674046401830182016400530029024e7a2c596f75206d75737420626520746865206f776e657220746f2063616c6c20746869732066756e6374696f6e2e2905722a0000007245000000722c000000722d0000007246000000723d000000723d000000723d000000723e0000007278000000220100007304000000000106017278000000630000000000000000050000000400000043000000738200000074006a017d0074027c0019007d0174027c00190064016b097322740364028301820164037d0278187c0144005d107d037c027c036404190037007d02712c570074046a057c007c0264058d020100640174027c003c00640374067c003c0074076a0883007c0218007d0474076a097c0483010100740a7c0464068d0101006400530029074e467a2754686973206163636f756e7420686173206e6f206465706f7369747320746f2072657475726e2e7201000000724000000029027241000000724000000029017243000000290b722c000000722d000000724a000000724600000072200000007254000000725200000072300000007245000000722b00000072490000002905724c000000724e000000725d00000072570000007243000000723d000000723d000000723e000000da14656d657267656e637952657475726e5374616b6527010000731a00000000020601080106010e0104010a0110010e01080108010c010a01728a0000002933721f00000072200000007221000000da085661726961626c65722a000000722e000000723700000072380000007239000000723b000000723c000000da0448617368724a0000007252000000722f000000723500000072300000007231000000723300000072320000007236000000723f000000da085f5f6578706f7274da05666c6f6174724f000000725c000000725e000000da03696e747253000000da03416e797260000000725f0000007249000000726f0000007270000000727a000000727c000000727e0000007263000000da0373747272820000007283000000728400000072790000007285000000da04626f6f6c7287000000728800000072890000007278000000728a000000723d000000723d000000723d000000723e000000da083c6d6f64756c653e01000000738e0000000801040104010401080102010a0102010a0104010801040108010401080102010a0104010a0104010a0102010a0104010a010401080102010a010401080102010a0104010a0308140601101206011018101d10200e0808050e0e02010e090e090601100a06011006060110060e060601100506011005060110060e05060110050601100506011606060116060805