Contract con_lite_dao_beta


Contract Code


  
1 Proposals = Hash(default_value = None)
2 Ballots = Hash(default_value = False)
3 BallotCount = Hash(default_value = 0)
4 ProposalCount = Variable()
5 ProcessedBallots = Hash(default_value = 0)
6 VerifiedBallots = Hash(default_value = 0)
7 LPWeight = Hash(default_value = 0)
8 metadata = Hash(default_value = None)
9
10 I = importlib
11
12 @construct
13 def seed():
14 metadata['operator'] = ctx.caller
15 metadata['fee_currency'] = 'con_rswp_lst001'
16 metadata['fee_amount'] = 10 # 27272 $30 3/7/22
17 metadata['token_contract'] = 'con_rswp_lst001'
18 metadata['v_token_contracts'] = ['con_staking_rswp_rswp_interop_v2']
19 metadata['lp_v_token_contracts'] = ['con_liq_mining_rswp_rswp']
20 metadata['dex_contract'] = 'con_rocketswap_official_v1_1'
21 metadata['max_description_length'] = 50
22 metadata['max_choices_number'] = 4
23 metadata['max_title_length'] = 20
24
25 ProposalCount.set(0)
26
27
28 @export
29 def create_proposal(title:str, description: str, date_decision: datetime.datetime, choices: list):
30 assert len(title) > 4 and len(title) <= metadata['max_title_length'], f"Title must be more than 4 characters long and at most {metadata['max_title_length']} long."
31 assert len(description) > 10 and len(description) <= metadata['max_description_length'], f"Description length must be more than 10 characters long and at most {metadata['max_description_length']} long"
32 assert date_decision > now, 'the decision date must take place in the future.'
33 assert len(choices) > 1 and len(choices) <= metadata['max_choices_number'] , f"you must specify at least 2 choices and at most {metadata['max_choices_number']} choices"
34
35 for choice in choices:
36 assert len(choice) > 0, 'choice cannot be an empty string.'
37
38 deduct_fee()
39
40 ProposalCount.set(ProposalCount.get() + 1)
41 Proposals[ProposalCount.get()] = {
42 "title":title,
43 "description": description,
44 "date_decision": date_decision,
45 "choices": choices,
46 "state": "open",
47 "results": {}
48 }
49
50 proposal_idx = ProposalCount.get()
51
52 token_contract_name = metadata['token_contract']
53 if LPWeight[proposal_idx,token_contract_name] == 0:
54 set_lp_token_value(proposal_idx=proposal_idx, token_contract_name=token_contract_name)
55
56
57
58 def deduct_fee():
59 token_contract = I.import_module(metadata['fee_currency'])
60 token_contract.transfer_from(amount=metadata['fee_amount'], to=metadata['operator'], main_account=ctx.signer)
61
62
63 @export
64 def count_ballots(proposal_idx: int, batch_size: int = None):
65 if batch_size == None: batch_size=100
66
67 '''checks'''
68 assert now > Proposals[proposal_idx]["date_decision"], 'It is not possible to count the ballots for this proposal yet'
69 assert Proposals[proposal_idx]["state"] != "concluded", 'The ballots for this proposal have already been counted'
70 assert Ballots[proposal_idx, "counted"] != True, 'this ballot has been counted.'
71 '''check if this proposal has a stored lp token weight, if no, calculate how much the LP weight is worth'''
72
73 start_idx = ProcessedBallots[proposal_idx]
74 start_idx += 1
75
76 current_ballot_idx = 0
77
78 '''count the ballots'''
79 for i in range(0, batch_size):
80 current_ballot_idx = start_idx + i
81
82 voter_vk = Ballots[proposal_idx,"forwards_index", current_ballot_idx,"user_vk"]
83
84 ProcessedBallots[proposal_idx, current_ballot_idx, "choice"] = Ballots[proposal_idx,"forwards_index", current_ballot_idx, "choice"]
85 ProcessedBallots[proposal_idx, current_ballot_idx, "user_vk"] = voter_vk
86 ProcessedBallots[proposal_idx, current_ballot_idx, "weight"] = get_vk_weight(vk=voter_vk, proposal_idx=proposal_idx)
87
88 if current_ballot_idx == BallotCount[proposal_idx]:
89 # Mark ballot count as ready for verification.
90
91 Ballots[proposal_idx, "counted"] = True
92 # Store ballot count of processed ballots
93 ProcessedBallots[proposal_idx] = current_ballot_idx
94 return
95
96 ProcessedBallots[proposal_idx] = current_ballot_idx
97
98
99 @export
100 def verify_ballots(proposal_idx: int, batch_size: int = None):
101 if batch_size == None: batch_size=100
102
103 '''checks'''
104 assert Ballots[proposal_idx, "counted"] == True, 'ballots must be counted before verifying them'
105 assert Ballots[proposal_idx, "verified"] != True, 'the ballots for this proposal have already been verified'
106 assert Proposals[proposal_idx]["state"] != "concluded", 'this proposal has been concluded'
107
108 start_idx = VerifiedBallots[proposal_idx]
109 start_idx += 1
110
111 current_ballot_idx = 0
112
113 for i in range(0, batch_size):
114 current_ballot_idx = start_idx + i
115
116 voter_vk = ProcessedBallots[proposal_idx, current_ballot_idx, "user_vk"]
117 choice = ProcessedBallots[proposal_idx, current_ballot_idx, "choice"]
118 processed_weight = ProcessedBallots[proposal_idx, current_ballot_idx, "weight"]
119
120 current_weight = get_vk_weight(vk=voter_vk, proposal_idx=proposal_idx)
121
122 if current_weight >= processed_weight - (processed_weight * 0.05):
123 VerifiedBallots[proposal_idx, choice] += current_weight
124
125 if current_ballot_idx == BallotCount[proposal_idx]:
126
127 choices_len = len(Proposals[proposal_idx]["choices"])
128 Ballots[proposal_idx, "verified"] = True
129 Proposal = Proposals[proposal_idx]
130 Proposal["state"] = "concluded"
131
132 for c in range(0, choices_len):
133 Proposal["results"][str(c)] = VerifiedBallots[proposal_idx, c]
134
135 Proposals[proposal_idx] = Proposal
136
137 VerifiedBallots[proposal_idx] = current_ballot_idx
138
139 return
140
141 VerifiedBallots[proposal_idx] = current_ballot_idx
142
143
144 @export
145 def cast_ballot(proposal_idx: int, choice_idx: int):
146 voter = ctx.signer
147 ballot_idx = BallotCount[proposal_idx]
148 ballot_idx += 1
149
150 '''checks'''
151 assert Proposals[proposal_idx] != False
152 assert choice_idx >= 0 and choice_idx < len(Proposals[proposal_idx]["choices"]), 'you must select a valid choice.'
153 assert now < Proposals[proposal_idx]["date_decision"], 'It is too late to cast a ballot for this proposal.'
154 assert Ballots[proposal_idx,"backwards_index", voter] == False, 'you have already cast a ballot !'
155
156 '''record ballot'''
157 Ballots[proposal_idx,"forwards_index",ballot_idx,"choice"] = choice_idx
158 Ballots[proposal_idx,"forwards_index",ballot_idx,"user_vk"] = voter
159 Ballots[proposal_idx,"backwards_index", voter] = ballot_idx
160
161 BallotCount[proposal_idx] += 1
162
163 @export
164 def get_vk_weight(vk:str, proposal_idx: int):
165 '''
166 Get the rswp value of any tokens, vtokens and LP tokens for rswp pairs (staked or not).
167 '''
168 token_contract_name = metadata['token_contract']
169 user_token_total = 0
170
171 user_token_total += get_token_value(vk=vk, token_contract_name=token_contract_name)
172 user_token_total += get_staked_token_value(vk=vk)
173 user_token_total += get_rocketfuel_value(vk=vk, token_contract_name=token_contract_name)
174 user_token_total += get_lp_value(vk=vk, proposal_idx=proposal_idx, token_contract_name=token_contract_name)
175 user_token_total += get_staked_lp_value(vk=vk, proposal_idx=proposal_idx, token_contract_name=token_contract_name)
176
177 return user_token_total
178
179 @export
180 def get_token_value(vk:str, token_contract_name:str):
181 balances = ForeignHash(foreign_contract=token_contract_name, foreign_name='balances')
182 token_balance = balances[vk] or 0
183
184 return token_balance
185
186 @export
187 def get_staked_token_value(vk: str):
188 '''iterate through v token contracts and get user balance.'''
189 vk_balance = 0
190 staking_contract_names = metadata['v_token_contracts']
191
192 for contract in staking_contract_names:
193 balances = ForeignHash(foreign_contract=contract, foreign_name='balances')
194 vk_balance += balances[vk] or 0
195
196 return vk_balance
197
198 @export
199 def get_rocketfuel_value(vk:str, token_contract_name: str):
200 '''
201 get value of RSWP staked in rocket fuel
202 '''
203 dex_contract_name = metadata['dex_contract']
204 dex_staked_amount = ForeignHash(foreign_contract=dex_contract_name, foreign_name='staked_amount')
205 user_rocketfuel = dex_staked_amount[vk, token_contract_name] or 0
206
207 return user_rocketfuel
208
209 @export
210 def get_lp_value(vk:str, proposal_idx:int, token_contract_name: str):
211 '''
212 get lp value from the dex contract
213 '''
214 dex_contract_name = metadata['dex_contract']
215 dex_lp_points = ForeignHash(foreign_contract=dex_contract_name, foreign_name='lp_points')
216 user_lp = dex_lp_points[token_contract_name, vk] or 0
217
218 return user_lp * LPWeight[proposal_idx,token_contract_name]
219
220 @export
221 def get_staked_lp_value(vk: str, proposal_idx: int, token_contract_name:str):
222 lp_count = 0
223 staking_contract_names = metadata['lp_v_token_contracts']
224 lp_token_value = LPWeight[proposal_idx,token_contract_name]
225
226 for contract in staking_contract_names:
227 balances = ForeignHash(foreign_contract=contract, foreign_name='balances')
228 vk_balance = balances[vk] or 0
229 lp_count += vk_balance
230
231 return lp_count * LPWeight[proposal_idx,token_contract_name]
232
233 def set_lp_token_value(proposal_idx: int, token_contract_name: str):
234 '''
235 import the dex contract, get the reserves value for the TAU-RSWP pair, take the RSWP value of the LP and multiply it by 2
236 '''
237 dex_contract_name = metadata['dex_contract']
238 dex_reserves = ForeignHash(foreign_contract=dex_contract_name, foreign_name='reserves')
239 dex_lp_points = ForeignHash(foreign_contract=dex_contract_name, foreign_name='lp_points')
240
241 reserves = dex_reserves[token_contract_name]
242 total_lp = dex_lp_points[token_contract_name]
243 token_per_lp = reserves[1] / total_lp
244
245 LPWeight[proposal_idx,token_contract_name] = token_per_lp * 2
246
247
248 def assert_operator():
249 assert ctx.caller == metadata['operator'], "You are not the listed operator for this contract."
250
251 @export
252 def change_meta(key: str, value: Any):
253 assert ctx.caller == metadata['operator'], 'Only operator can set metadata!'
254 metadata[key] = value
255

Byte Code

e3000000000000000000000000060000004000000073b2010000650064006401640264038d035a01650064046401640564038d035a02650064066401640764038d035a0365046401640864098d025a05650064066401640a64038d035a06650064066401640b64038d035a07650064066401640c64038d035a08650064006401640d64038d035a09650a5a0b640e640f84005a0c650d64018301650e650e650f6a0f651064109c0464116412840483015a116413641484005a12650d6401830164356513651364159c0264166417840583015a14650d6401830164366513651364159c0264186419840583015a15650d6401830165136513641a9c02641b641c840483015a16650d64018301650e6513641d9c02641e641f840483015a17650d64018301650e650e64209c0264216422840483015a18650d64018301650e64239c0164246425840483015a19650d64018301650e650e64209c0264266427840483015a1a650d64018301650e6513650e64289c036429642a840483015a1b650d64018301650e6513650e64289c03642b642c840483015a1c6513650e642d9c02642e642f84045a1d6430643184005a1e650d64018301650e651f64329c0264336434840483015a206400530029374eda11636f6e5f6c6974655f64616f5f62657461da0950726f706f73616c732903da0d64656661756c745f76616c7565da08636f6e7472616374da046e616d6546da0742616c6c6f7473e900000000da0b42616c6c6f74436f756e74da0d50726f706f73616c436f756e74290272040000007205000000da1050726f63657373656442616c6c6f7473da0f566572696669656442616c6c6f7473da084c50576569676874da086d65746164617461630000000000000000000000000300000043000000736400000074006a01740264013c006402740264033c006404740264053c006402740264063c0064076701740264083c00640967017402640a3c00640b7402640c3c00640d7402640e3c00640f740264103c006411740264123c0074036a046413830101006400530029144eda086f70657261746f72da0f636f6e5f727377705f6c7374303031da0c6665655f63757272656e6379e90a000000da0a6665655f616d6f756e74da0e746f6b656e5f636f6e7472616374da20636f6e5f7374616b696e675f727377705f727377705f696e7465726f705f7632da11765f746f6b656e5f636f6e747261637473da18636f6e5f6c69715f6d696e696e675f727377705f72737770da146c705f765f746f6b656e5f636f6e747261637473da1c636f6e5f726f636b6574737761705f6f6666696369616c5f76315f31da0c6465785f636f6e7472616374e932000000da166d61785f6465736372697074696f6e5f6c656e677468e904000000da126d61785f63686f696365735f6e756d626572e914000000da106d61785f7469746c655f6c656e67746872070000002905da03637478da0663616c6c6572da0a5f5f6d65746164617461da0f5f5f50726f706f73616c436f756e74da03736574a90072250000007225000000da00da045f5f5f5f13000000731600000000010a010801080108010a010a01080108010801080172270000002904da057469746c65da0b6465736372697074696f6eda0d646174655f6465636973696f6eda0763686f69636573630400000000000000070000000700000043000000732601000074007c00830164016b04721c74007c0083017401640219006b017330740264037401640219009b0064049d038301820174007c01830164056b04724c74007c0183017401640619006b017360740264077401640619009b0064089d03830182017c0274036b047370740264098301820174007c038301640a6b04728c74007c0383017401640b19006b0173a07402640c7401640b19009b00640d9d038301820178207c0344005d187d0474007c048301640e6b0473a67402640f8301820171a6570074048300010074056a0674056a078300640a1700830101007c007c017c027c036410690064119c06740874056a0783003c0074056a0783007d057401641219007d0674097c057c0666021900640e6b0290017222740a7c057c0664138d0201006400530029144e721c000000721f0000007a365469746c65206d757374206265206d6f7265207468616e20342063686172616374657273206c6f6e6720616e64206174206d6f7374207a06206c6f6e672e7211000000721b0000007a444465736372697074696f6e206c656e677468206d757374206265206d6f7265207468616e2031302063686172616374657273206c6f6e6720616e64206174206d6f7374207a05206c6f6e677a30746865206465636973696f6e2064617465206d7573742074616b6520706c61636520696e20746865206675747572652ee901000000721d0000007a30796f75206d7573742073706563696679206174206c6561737420322063686f6963657320616e64206174206d6f7374207a082063686f6963657372070000007a2163686f6963652063616e6e6f7420626520616e20656d70747920737472696e672eda046f70656e290672280000007229000000722a000000722b000000da057374617465da07726573756c747372130000002902da0c70726f706f73616c5f696478da13746f6b656e5f636f6e74726163745f6e616d65290bda036c656e7222000000da0e417373657274696f6e4572726f72da036e6f77da0c5f5f6465647563745f66656572230000007224000000da03676574da0b5f5f50726f706f73616c73da0a5f5f4c50576569676874da145f5f7365745f6c705f746f6b656e5f76616c7565290772280000007229000000722a000000722b000000da0663686f69636572300000007231000000722500000072250000007226000000da0f6372656174655f70726f706f73616c21000000732800000000031e01120114010a01120110011e0112010a011801060112010201060112010801080112010401723b000000630000000000000000010000000500000043000000732c00000074006a0174026401190083017d007c006a0374026402190074026403190074046a0564048d0301006400530029054e72100000007212000000720e0000002903da06616d6f756e74da02746fda0c6d61696e5f6163636f756e742906da0149da0d696d706f72745f6d6f64756c657222000000da0d7472616e736665725f66726f6d7220000000da067369676e65722901721300000072250000007225000000722600000072350000003a000000730600000000010e010a01723500000029027230000000da0a62617463685f73697a6563020000000000000006000000060000004300000073020100007c0164006b02720c64017d01740074017c001900640219006b047324740264038301820174017c0019006404190064056b03733c740264068301820174037c0064076602190064086b037354740264098301820174047c0019007d027c02640a37007d02640b7d03788c7405640b7c01830244005d7e7d047c027c0417007d0374037c00640c7c03640d660419007d0574037c00640c7c03640e6604190074047c007c03640e66033c007c0574047c007c03640d66033c0074067c057c00640f8d0274047c007c03641066033c007c0374077c0019006b027274640874037c00640766023c007c0374047c003c0064005300717457007c0374047c003c006400530029114ee964000000722a0000007a3d4974206973206e6f7420706f737369626c6520746f20636f756e74207468652062616c6c6f747320666f7220746869732070726f706f73616c20796574722e000000da09636f6e636c756465647a375468652062616c6c6f747320666f7220746869732070726f706f73616c206861766520616c7265616479206265656e20636f756e746564da07636f756e746564547a1d746869732062616c6c6f7420686173206265656e20636f756e7465642e722c0000007207000000da0e666f7277617264735f696e646578da07757365725f766b723a0000002902da02766b7230000000da067765696768742908723400000072370000007233000000da095f5f42616c6c6f7473da125f5f50726f63657373656442616c6c6f7473da0572616e6765da0d6765745f766b5f776569676874da0d5f5f42616c6c6f74436f756e74290672300000007243000000da0973746172745f696478da1263757272656e745f62616c6c6f745f696478da0169da08766f7465725f766b722500000072250000007226000000da0d636f756e745f62616c6c6f7473400000007330000000000208010402120106010a010e010a010e020801080104021001080106010a02060114020e0216010c010c010801080172540000006302000000000000000c000000060000004300000073680100007c0164006b02720c64017d0174007c0064026602190064036b027324740164048301820174007c0064056602190064036b03733c740164068301820174027c0019006407190064086b037354740164098301820174037c0019007d027c02640a37007d02640b7d0378f27404640b7c01830244005de47d047c027c0417007d0374057c007c03640c660319007d0574057c007c03640d660319007d0674057c007c03640e660319007d0774067c057c00640f8d027d087c087c077c07740764108301140018006b0572de74037c007c066602050019007c08370003003c007c0374087c0019006b027274740974027c0019006411190083017d09640374007c00640566023c0074027c0019007d0a64087c0a64073c00782c7404640b7c09830244005d1e7d0b74037c007c0b660219007c0a64121900740a7c0b83013c009001712257007c0a74027c003c007c0374037c003c0064005300717457007c0374037c003c006400530029134e72440000007246000000547a2d62616c6c6f7473206d75737420626520636f756e746564206265666f726520766572696679696e67207468656dda0876657269666965647a387468652062616c6c6f747320666f7220746869732070726f706f73616c206861766520616c7265616479206265656e207665726966696564722e00000072450000007a20746869732070726f706f73616c20686173206265656e20636f6e636c75646564722c00000072070000007248000000723a000000724a0000002902724900000072300000007a04302e3035722b000000722f000000290b724b00000072330000007237000000da115f5f566572696669656442616c6c6f7473724d000000724c000000724e000000da07646563696d616c724f0000007232000000da03737472290c723000000072430000007250000000725100000072520000007253000000723a000000da1070726f6365737365645f776569676874da0e63757272656e745f776569676874da0b63686f696365735f6c656eda0850726f706f73616cda0163722500000072250000007226000000da0e7665726966795f62616c6c6f74736200000073420000000002080104020a010e010a010e010a010e0108010801040110010801060108010e0104010a010c0108010c0114010c0110010c010801080110011e02080108010801725e00000029027230000000da0a63686f6963655f69647863020000000000000004000000060000004300000073be00000074006a017d0274027c0019007d037c03640137007d0374037c00190064026b037326740482017c0164036b0572427c01740574037c0019006404190083016b00734a7404640583018201740674037c001900640619006b007362740464078301820174077c0064087c026603190064026b02737c74046409830182017c0174077c00640a7c03640b66043c007c0274077c00640a7c03640c66043c007c0374077c0064087c0266033c0074027c00050019006401370003003c0064005300290d4e722c000000467207000000722b0000007a1f796f75206d7573742073656c65637420612076616c69642063686f6963652e722a0000007a32497420697320746f6f206c61746520746f206361737420612062616c6c6f7420666f7220746869732070726f706f73616c2eda0f6261636b77617264735f696e6465787a20796f75206861766520616c7265616479206361737420612062616c6c6f7420217247000000723a0000007248000000290872200000007242000000724f0000007237000000723300000072320000007234000000724b00000029047230000000725f000000da05766f746572da0a62616c6c6f745f696478722500000072250000007226000000da0b636173745f62616c6c6f7489000000731c0000000002060108010802100112011201120106010c010e03100110010e01726300000029027249000000723000000063020000000000000004000000060000004300000073620000007400640119007d0264027d037c0374017c007c0264038d0237007d037c0374027c0064048d0137007d037c0374037c007c0264038d0237007d037c0374047c007c017c0264058d0337007d037c0374057c007c017c0264058d0337007d037c03530029067a620a202020204765742074686520727377702076616c7565206f6620616e7920746f6b656e732c2076746f6b656e7320616e64204c5020746f6b656e7320666f72207273777020706169727320287374616b6564206f72206e6f74292e200a202020207213000000720700000029027249000000723100000029017249000000290372490000007230000000723100000029067222000000da0f6765745f746f6b656e5f76616c7565da166765745f7374616b65645f746f6b656e5f76616c7565da146765745f726f636b65746675656c5f76616c7565da0c6765745f6c705f76616c7565da136765745f7374616b65645f6c705f76616c75652904724900000072300000007231000000da10757365725f746f6b656e5f746f74616c722500000072250000007226000000724e0000009e000000731800000000050801040106010a010e0106010a0108010a0106010c01724e000000290272490000007231000000630200000000000000040000000600000043000000732000000074007c0164016402640164038d047d027c027c001900701a64047d037c03530029054eda0862616c616e63657372010000002904da10666f726569676e5f636f6e7472616374da0c666f726569676e5f6e616d657204000000720500000072070000002901da0b466f726569676e48617368290472490000007231000000da0a5f5f62616c616e636573da0d746f6b656e5f62616c616e63657225000000722500000072260000007264000000b10000007308000000000204010c010c01726400000029017249000000630100000000000000050000000700000043000000733e00000064017d017400640219007d02782c7c0244005d247d0374017c0364036404640364058d047d047c017c047c0019007032640137007d01711257007c01530029067a3769746572617465207468726f756768207620746f6b656e20636f6e74726163747320616e642067657420757365722062616c616e63652e72070000007215000000726a00000072010000002904726b000000726c0000007204000000720500000029027222000000726d00000029057249000000da0a766b5f62616c616e6365da167374616b696e675f636f6e74726163745f6e616d65737204000000726e0000007225000000722500000072260000007265000000b9000000730e0000000003040108010a0104010c0114017265000000630200000000000000050000000600000043000000732c0000007400640119007d0274017c0264026403640464058d047d037c037c007c0166021900702664067d047c04530029077a310a202020206765742076616c7565206f662052535750207374616b656420696e20726f636b6574206675656c0a202020207219000000da0d7374616b65645f616d6f756e747201000000da116465785f7374616b65645f616d6f756e742904726b000000726c00000072040000007205000000720700000029027222000000726d000000290572490000007231000000da116465785f636f6e74726163745f6e616d65da135f5f6465785f7374616b65645f616d6f756e74da0f757365725f726f636b65746675656c7225000000722500000072260000007266000000c5000000730c0000000005080104010401080110017266000000290372490000007230000000723100000063030000000000000006000000060000004300000073380000007400640119007d0374017c0364026403640464058d047d047c047c027c0066021900702664067d057c0574027c017c02660219001400530029077a2c0a20202020676574206c702076616c75652066726f6d207468652064657820636f6e74726163740a202020207219000000da096c705f706f696e74737201000000da0d6465785f6c705f706f696e74732904726b000000726c00000072040000007205000000720700000029037222000000726d000000723800000029067249000000723000000072310000007274000000da0f5f5f6465785f6c705f706f696e7473da07757365725f6c707225000000722500000072260000007267000000d2000000730c0000000005080104010401080110017267000000630300000000000000090000000700000043000000735a00000064017d037400640219007d0474017c017c02660219007d0578307c0444005d287d0674027c0664036404640364058d047d077c077c001900703c64017d087c037c0837007d03711e57007c0374017c017c02660219001400530029064e72070000007217000000726a00000072010000002904726b000000726c00000072040000007205000000290372220000007238000000726d0000002909724900000072300000007231000000da086c705f636f756e747271000000da0e6c705f746f6b656e5f76616c75657204000000726e00000072700000007225000000722500000072260000007268000000df00000073120000000002040108010c010a0104010c010c010c01726800000029027230000000723100000063020000000000000008000000060000004300000073580000007400640119007d0274017c0264026403640464058d047d0374017c0264066403640764058d047d047c037c0119007d057c047c0119007d067c05640819007c061b007d077c076409140074027c007c0166023c00640a5300290b7a830a20202020696d706f7274207468652064657820636f6e74726163742c20676574207468652072657365727665732076616c756520666f7220746865205441552d5253575020706169722c2074616b652074686520525357502076616c7565206f6620746865204c5020616e64206d756c7469706c7920697420627920320a202020207219000000da0872657365727665737201000000da0c6465785f72657365727665732904726b000000726c0000007204000000720500000072770000007278000000722c000000e9020000004e29037222000000726d00000072380000002908723000000072310000007274000000da0e5f5f6465785f72657365727665737279000000727d000000da08746f74616c5f6c70da0c746f6b656e5f7065725f6c707225000000722500000072260000007239000000ec000000731600000000040801040104010801040104010801080108010c017239000000630000000000000000000000000300000043000000731a00000074006a017402640119006b02731674036402830182016400530029034e720e0000007a32596f7520617265206e6f7420746865206c6973746564206f70657261746f7220666f72207468697320636f6e74726163742e290472200000007221000000722200000072330000007225000000722500000072250000007226000000da115f5f6173736572745f6f70657261746f72fd00000073040000000001100172830000002902da036b6579da0576616c7565630200000000000000020000000300000043000000732200000074006a017402640119006b02731674036402830182017c0174027c003c006400530029034e720e0000007a1f4f6e6c79206f70657261746f722063616e20736574206d657461646174612129047220000000722100000072220000007233000000290272840000007285000000722500000072250000007226000000da0b6368616e67655f6d657461020100007306000000000210010601728600000029014e29014e2921da04486173687237000000724b000000724f000000da085661726961626c657223000000724c000000725600000072380000007222000000da09696d706f72746c6962723f0000007227000000da085f5f6578706f72747258000000da086461746574696d65da046c697374723b0000007235000000da03696e747254000000725e0000007263000000724e0000007264000000726500000072660000007267000000726800000072390000007283000000da03416e7972860000007225000000722500000072250000007226000000da083c6d6f64756c653e0100000073540000000601080106010801060108010c01060108010601080106010801060108010403080e060108011017080606011421060114260601121406011212060112070601100b0601120c0601140c0601140c101108050601