-
Notifications
You must be signed in to change notification settings - Fork 0
/
Image_Child_Inscription.ts
286 lines (247 loc) · 48.7 KB
/
Image_Child_Inscription.ts
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
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
import {
Transaction,
script,
Psbt,
initEccLib,
networks,
Signer as BTCSigner,
crypto,
payments,
opcodes,
address as Address
} from "bitcoinjs-lib";
import { Taptree } from "bitcoinjs-lib/src/types";
import { ECPairFactory, ECPairAPI } from "ecpair";
import ecc from "@bitcoinerlab/secp256k1";
import axios, { AxiosResponse } from "axios";
import networkConfig from "config/network.config";
import { WIFWallet } from 'utils/WIFWallet'
import { SeedWallet } from "utils/SeedWallet";
import cbor from 'cbor';
//test
const network = networks.testnet;
// const network = networks.bitcoin;
initEccLib(ecc as any);
const ECPair: ECPairAPI = ECPairFactory(ecc);
// const seed: string = process.env.MNEMONIC as string;
// const networkType: string = networkConfig.networkType;
// const wallet = new SeedWallet({ networkType: networkType, seed: seed });
const privateKey: string = process.env.PRIVATE_KEY as string;
const networkType: string = networkConfig.networkType;
const wallet = new WIFWallet({ networkType: networkType, privateKey: privateKey });
const txhash: string = 'd9b95d549219eebcd1be0360f41c7164c4ad040b716475630154f08263ab2fdf';
const txidBuffer = Buffer.from(txhash, 'hex');
const inscriptionBuffer = txidBuffer.reverse();
const memeType: string = 'image/png';
const pointer1: number = 546 * 1;
const pointer2: number = 546 * 2;
const pointer3: number = 546 * 3;
const pointerBuffer1: Buffer = Buffer.from(pointer1.toString(16).padStart(4, '0'), 'hex').reverse();
const pointerBuffer2: Buffer = Buffer.from(pointer2.toString(16).padStart(4, '0'), 'hex').reverse();
const pointerBuffer3: Buffer = Buffer.from(pointer3.toString(16).padStart(4, '0'), 'hex').reverse();
const metaProtocol: Buffer = Buffer.concat([Buffer.from("parcel.bitmap", "utf8")]);
const contentBufferData1 = Buffer.from('0.364972.bitmap', 'utf8')
const receiveAddress: string = 'tb1ppx220ln489s5wqu8mqgezm7twwpj0avcvle3vclpdkpqvdg3mwqsvydajn';
const metadata = {
'type': 'Bitmap',
'description': 'Bitmap Community Parent Ordinal'
}
const metadataBuffer = cbor.encode(metadata);
const fee = 1200000;
const splitBuffer = (buffer: Buffer, chunkSize: number) => {
let chunks = [];
for (let i = 0; i < buffer.length; i += chunkSize) {
const chunk = buffer.subarray(i, i + chunkSize);
chunks.push(chunk);
}
return chunks;
};
export const contentBuffer = (content: string) => {
return Buffer.from('89504E470D0A1A0A0000000D494844520000057C0000019408060000008629EAA70000000467414D410000B18F0BFC610500000A4969434350735247422049454336313936362D322E31000048899D53775893F7163EDFF7650F5642D8F0B1976C81002223AC08C81059A21092006184101240C585880A561415119C4855C482D50A489D88E2A028B867418A885A8B555C38EE1FDCA7B57D7AEFEDEDFBD7FBBCE79CE7FCCE79CF0F8011122691E6A26A003952853C3AD81F8F4F48C4C9BD80021548E0042010E6CBC26705C50000F00379787E74B03FFC01AF6F00020070D52E2412C7E1FF83BA50265700209100E02212E70B01905200C82E54C81400C81800B053B3640A009400006C797C422200AA0D00ECF4493E0500D8A993DC1700D8A21CA908008D0100992847240240BB00605581522C02C0C200A0AC40222E04C0AE018059B632470280BD0500768E58900F4060008099422CCC0020380200431E13CD03204C03A030D2BFE0A95F7085B8480100C0CB95CD974BD23314B895D01A77F2F0E0E221E2C26CB142611729106609E4229C979B231348E7034CCE0C00001AF9D1C1FE383F90E7E6E4E1E666E76CEFF4C5A2FE6BF06F223E21F1DFFEBC8C020400104ECFEFDA5FE5E5D60370C701B075BF6BA95B00DA560068DFF95D33DB09A05A0AD07AF98B7938FC401E9EA150C83C1D1C0A0B0BED2562A1BD30E38B3EFF33E16FE08B7EF6FC401EFEDB7AF000719A4099ADC0A383FD71616E76AE528EE7CB0442316EF7E723FEC7857FFD8E29D1E234B15C2C158AF15889B850224DC779B952914421C995E212E97F32F11F96FD0993770D00AC864FC04EB607B5CB6CC07EEE01028B0E58D27600407EF32D8C1A0B91001067343279F7000093BFF98F402B0100CD97A4E30000BCE8185CA894174CC608000044A0812AB041070CC114ACC00E9CC11DBCC01702610644400C24C03C104206E4801C0AA11896411954C03AD804B5B0031AA0119AE110B4C131380DE7E0125C81EB70170660189EC218BC86090441C8081361213A8811628ED822CE0817998E04226148349280A420E988145122C5C872A402A9426A915D4823F22D7214398D5C40FA90DBC820328AFC8ABC47319481B25103D4027540B9A81F1A8AC6A073D174340F5D8096A26BD11AB41E3D80B6A2A7D14BE87574007D8A8E6380D1310E668CD9615C8C87456089581A26C71663E55835568F35631D583776151BC09E61EF0824028B8013EC085E8410C26C82909047584C5843A825EC23B412BA085709838431C2272293A84FB4257A12F9C478623AB1905846AC26EE211E219E255E270E135F9348240EC992E44E0A21259032490B496B48DB482DA453A43ED210699C4C26EB906DC9DEE408B280AC209791B7900F904F92FBC9C3E4B7143AC588E24C09A22452A494124A35653FE504A59F324299A0AA51CDA99ED408AA883A9F5A496DA076502F5387A91334759A25CD9B1643CBA42DA3D5D09A696769F7682FE974BA09DD831E4597D097D26BE807E9E7E983F4770C0D860D83C7486228196B197B19A718B7192F994CA605D39799C85430D7321B9967980F986F55582AF62A7C1591CA12953A9556957E95E7AA545573553FD579AA0B54AB550FAB5E567DA64655B350E3A909D416ABD5A91D55BBA936AECE5277528F50CF515FA3BE5FFD82FA630DB2868546A08648A35463B7C6198D2116C63265F15842D6725603EB2C6B984D625BB2F9EC4C7605FB1B762F7B4C534373AA66AC6691669DE671CD010EC6B1E0F039D99C4ACE21CE0DCE7B2D032D3F2DB1D66AAD66AD7EAD37DA7ADABEDA62ED72ED16EDEBDAEF75709D409D2C9DF53A6D3AF77509BA36BA51BA85BADB75CFEA3ED363EB79E909F5CAF50EE9DDD147F56DF4A3F517EAEFD6EFD11F373034083690196C313863F0CC9063E86B9869B8D1F084E1A811CB68BA91C468A3D149A327B826EE8767E33578173E66AC6F1C62AC34DE65DC6B3C61626932DBA4C4A4C5E4BE29CD946B9A66BAD1B4D374CCCCC82CDCACD8ACC9EC8E39D59C6B9E61BED9BCDBFC8D85A5459CC54A8B368BC796DA967CCB05964D96F7AC98563E567956F556D7AC49D65CEB2CEB6DD6576C501B579B0C9B3A9BCBB6A8AD9BADC4769B6DDF14E2148F29D229F5536EDA31ECFCEC0AEC9AEC06ED39F661F625F66DF6CF1DCC1C121DD63B743B7C727475CC766C70BCEBA4E134C3A9C4A9C3E957671B67A1739DF33517A64B90CB1297769717536DA78AA76E9F7ACB95E51AEEBAD2B5D3F5A39BBB9BDCADD96DD4DDCC3DC57DABFB4D2E9B1BC95DC33DEF41F4F0F758E271CCE39DA79BA7C2F390E72F5E765E595EFBBD1E4FB39C269ED6306DC8DBC45BE0BDCB7B603A3E3D65FACEE9033EC63E029F7A9F87BEA6BE22DF3DBE237ED67E997E07FC9EFB3BFACBFD8FF8BFE179F216F14E056001C101E501BD811A81B3036B031F049904A50735058D05BB062F0C3E15420C090D591F72936FC017F21BF96333DC672C9AD115CA089D155A1BFA30CC264C1ED6118E86CF08DF107E6FA6F94CE9CCB60888E0476C88B81F69199917F97D14292A32AA2EEA51B453747174F72CD6ACE459FB67BD8EF18FA98CB93BDB6AB6727667AC6A6C526C63EC9BB880B8AAB8817887F845F1971274132409ED89E4C4D8C43D89E37302E76C9A339CE49A54967463AEE5DCA2B917E6E9CECB9E773C593559907C3885981297B23FE5832042502F184FE5A76E4D1D13F2849B854F45BEA28DA251B1B7B84A3C92E69D5695F638DD3B7D43FA68864F4675C633094F522B79911992B923F34D5644D6DEACCFD971D92D39949C949CA3520D6996B42BD730B728B74F662B2B930DE479E66DCA1B9387CAF7E423F973F3DB156C854CD1A3B452AE500E164C2FA82B785B185B78B848BD485AD433DF66FEEAF9230B82167CBD90B050B8B0B3D8B87859F1E022BF45BB16238B5317772E315D52BA647869F0D27DCB68CBB296FD50E2585255F26A79DCF28E5283D2A5A5432B82573495A994C9CB6EAEF45AB9631561956455EF6A97D55B567F2A17955FAC70ACA8AEF8B046B8E6E2574E5FD57CF5796DDADADE4AB7CAEDEB48EBA4EB6EACF759BFAF4ABD6A41D5D086F00DAD1BF18DE51B5F6D4ADE74A17A6AF58ECDB4CDCACD03356135ED5BCCB6ACDBF2A136A3F67A9D7F5DCB56FDADABB7BED926DAD6BFDD777BF30E831D153BDEEF94ECBCB52B78576BBD457DF56ED2EE82DD8F1A621BBABFE67EDDB847774FC59E8F7BA57B07F645EFEB6A746F6CDCAFBFBFB2096D52368D1E483A70E59B806FDA9BED9A77B5705A2A0EC241E5C127DFA67C7BE350E8A1CEC3DCC3CDDF997FB7F508EB48792BD23ABF75AC2DA36DA03DA1BDEFE88CA39D1D5E1D47BEB7FF7EEF31E36375C7358F579EA09D283DF1F9E48293E3A764A79E9D4E3F3DD499DC79F74CFC996B5D515DBD6743CF9E3F1774EE4CB75FF7C9F3DEE78F5DF0BC70F422F762DB25B74BAD3DAE3D477E70FDE148AF5B6FEB65F7CBED573CAE74F44DEB3BD1EFD37FFA6AC0D573D7F8D72E5D9F79BDEFC6EC1BB76E26DD1CB825BAF5F876F6ED17770AEE4CDC5D7A8F78AFFCBEDAFDEA07FA0FEA7FB4FEB165C06DE0F860C060CFC3590FEF0E09879EFE94FFD387E1D247CC47D52346238D8F9D1F1F1B0D1ABDF264CE93E1A7B2A713CFCA7E56FF79EB73ABE7DFFDE2FB4BCF58FCD8F00BF98BCFBFAE79A9F372EFABA9AF3AC723C71FBCCE793DF1A6FCADCEDB7DEFB8EFBADFC7BD1F9928FC40FE50F3D1FA63C7A7D04FF73EE77CFEFC2FF784F3FB2D4738CF000000206348524D00007A26000080840000FA00000080E8000075300000EA6000003A98000017709CBA513C000000097048597300000EC400000EC401952B0E1B0000479A49444154789CEDDD49D2DE38BA1E50BAA2E69EA456E3F578555E8F57234DBC82F2202FAF28247BA279019C13A19032A5FF6B4810CD4310F81FFFF9CF7F160000000000FAF7AFD61F0000000000803C04BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE00000000008310F802000000000C42E00B000000003008812F00000000C02004BE000000000083F877EB0FC03BFFF77FFFCFD61FE1CACFFFFAFD47D34F010000004068FFEBFFFCBFD61F6128025F7E26FF9D23A0FD99FC59E80B000000001558D2616E6B30FBD77FFD5AFF5F1A02E7784D00000000A03081EFBCB6C1ECB2F9F39790F6E83501000000800A04BE733B0A63BF84B4473F6B962F000000001426F0E54CAE90D62C5F00000000A840E0CB911221AD59BE00C0887E2EDFF7410000802C04BED462962F00309A6DC8BBB701AE00180080EAFEDDFA03D0D4AFE53A88FDB92CCB8F1BAF6540030044B5D74FF9B1DCEFE79CBDE6DE66B5BF0EDE1300008A33C3775E7706374F67E5DEF9F7063F00400B7F6D7E2DCBB7B077FB9A67EF050000D5097CA9C9C00700A86DEF66F35F277FF7C4AF97EF0F0000C5087C010018DDDE4DE7AF37A24B3C2D0500009F097CB9C3CC1400A0677766E2467C6D0000784CE0CB953B8F3C0A840180A8BEAED3DBEAB50100E015812F3918EC0000D11DCDC4AD71E3DACD710000AA11F872D759A86B1003004476D48FC9B5C6EED9B20ED6F10500A02A812F779D85BA4F67F80A88018048BEF44DAEFA41D6F80500A02A812F77062157EBF83E192499E502004452A36F62F92B0000AA11F8CEEDC9E0E36A3024C8050066767613DDD34D00005423F025178F2B0200D195EAAF9CDD44BF7A520A0000B212F89283C7140180E85AF7575ABF3F000093F877EB0F00005040CECD46010000BA21F09DD7CFE5DD8077EFE73CA208D0871942D0ED77DC5B5FFE57F26F46F9DE7CF7B66FB4F56BB1AF0100008D59D2615E6F0634470318836580D87E2EBFC3ACF5D7B2F3FBFAEF7AB57EF6BF96E336EBAFE4EF7BFEBEBCB3B78E6F8E90567F0800801004BE7C65A0CC887E26BF43CFB641EFF6FF6D7F5FADFFAEB7E0771B683F21F49D4FCB5056398BEDE7C12F0080EE58D2811C7486E9DD5150940664666FD193B56EFE91FCF76A0D3B8F96385883DF9ECAFD9BF6E8AF657FC627E4A49CC575B60CCCB67EECA92EA4BEDEDA4B000627F09DDBDA817DBADE5CDAA1594301E84D3AF3F167F27747FF1EA24BCBEF76A983D4F6FFADE1468FF5FAD747F25DDF2C8B72309BB3BA71FBFFB77523AC8EDADA65515600684CE0CBD3417DAE192A3ACDB476F448FB59686476163DD8D6AFDB4792EF04A26B1D9FBE46E4FA3A47306DF625CBA21CCCE46A73C7D45EDDC8BC9E6C0EAABC00D084357C693183CBEED5B4966EEC946EE274F5B3BDCD7C644E773630DB93AE6B1B75B6EFD3C006B64A06BB42E33E7CAD1B99D393CD41D77FAFCC00509DC0776EEB1DE72F036577ADE9D1DB729B76E0219A743986B7F57B2F03D5DC9F2DF277259F927D17FDA2F8BE5CE76E2EB12CF7CB817E2300CD087C792B7A08007B72EDBAADF34E0FBE0613DB816AD459BE4F67E85DBD162C4BCCB24E5E39D6FC663E6FCFBBF60580EAACE1CBB23CDFB46DBB81C597D7D94AD7447BDAA132A386277274BCADE747445183D95C4A7E378FE1B32CE5D7F1D566B465CD6FDEFAFAE4CCFA1AAE7F00AA30C3975C9D8E37AF936E9A95CEBC4CD755FDB1FCB90CC5DEFA587BBF6095BB936DC606D1E418909EBD6EEB3A757B0D97B8FE0CC4E7523BB4D366C4E03CF0D697B2A3DC01509519BE7C1DBC7F79B4E957F2DFCBF2E7AEB677DFEBAC0395BE9EC1FCDC5A8755505AC919BE11EACF748DE21CCCD49BD3553932138F2BCA08001096C0972F03E76D48FBF675D29F39DBEDF68DEDCF6DC35F1DF4F9949AF9B8BEB632C5C82294EF1261EF2AC2F7238E1C8FEC7F59E68A32DCF4E52BD73500DDB0A403B9BCE944A7CB329466A7DC79950E648545CCA065BD992E2961C04D2E2566786B1362CA7D5E9CE7B938DF0074C50C5F565FEE58F736F0DE6EB6B52C3A70B3281956294B4451AA9C47B84996BBADB19403967500EE8AD00E02C06D025F9665FC5DDDF7A46B061BD08DAFE48D09E587484A6D6636623BE1DAE5C8D5B20E5FAE873B3FAB6CE637621D463D5FDA41371801A84EE0CBD68CEB52E558A78F3E942CDF6E1A30AAB57E6C59C685349476D63E9C95BF376DCA9D9F39DBC076A5CD7967B67E2E71B86601A84AE0CB6AD4D95B7709ECC656B27CBB69C0E85AB60FA5D6EC75CDB23A2BDFADC2C1ABF7BD0A84F567FE69E63E2E31186BC0D8D276C6F54E73025F96452778BBA6AF8A794C25CBB8E0E81E9DA0FE6CCB76CBF3552A745306E9D5D9357114062BEF66F7D2966B10C6954E50D86B8BD5015427F0C58EE77F334B932F34E0FBD28ECEB613441FD6D98F239571E58FADD16E7AEFF5E7D281E748D7F313B997761AAD6E04E0BDBF0EFEBC2C2697D1C8BF5A7F009A12F6320B8D6B5D3F973FEB97F557FA6FC82BD731FDB5C458BB779533A05D5FABF577A2BDB49E1A595A0FFF5CFEFCFE33C87DCD8F5E6638F6B44D729311C6B26D3FEFB6A5DBF617AA31C3773EE9E05D8715C8E96E8022702BE36B9D1E2D10CDB97E70B4EF461BDBF234631F68FB9DB7337F47BF2E0CB2C9E16D9B34FAF505337A73D3585D405502DFB9FC4C7E875928F3E5DD0D51CC74892F526734F7B51BE9BB51D7EC41EF9EBDB50647BE469C7700BEF8FA64508427E79888C0771E6BE5F273D1E1653E396709AE0497BF3DEDFCE8E8E497A37C475AC6612BD7AC65E624E8BD365BF0FB953A655E2610006FFB12368AA73A6BF8CEC1CC5EC86BFB68F8EC0DF693B0D720B9AC1C6156C4329DA3DC44FC5E9427BC7C666F9D5FF629537372DE812FDC78A62A337CC7B6BD7BA4723927881A5B8941EBEC9DFEA7B3E6AC9F5A4ECED9BDD1ACB3F3D7CFB79D8998DA2B8751BF1765A5B3670497CFA4337E7BAFB79D7F725196605EAE7FBA23F01D9F8AE9BEDE07341C2BB1A4C3CCDEAE5FE51A2B2357F98E7A7ED6CFB50D7EB7FF7FFDBBAB9F670EE9534D6E78BF37D2E3A7B9CBC108C78477D429302FD73F5D11F88ECB40E73E33C0C627ECCDE74DDDE21A2B6B96F27D14AE1C7D7FE56E2E6B0067BF82BCB6A1EFB20839578E03C03C72F7B5B5A95421F01D530F61EFD540BCF66757D98E2F57999A35447ABBF191A51CEA885CDFD7907E7FE56E2EF62A28ABE7251E4A9689DE8E05ED282BF0DE5E3DDEE27ACAD5D75E6FA4AA13284EE03B96483B51DF09C59ECED62A61D6F08E6F666BA0DFDE4412BA9537F2FABD5F2977E3DBCE9031ABB7BC5E67FB9628176E2ECCE7ED395FAF1BE099A36CA3C79B8F4746F91E0425F01D4FABC1CE5E47E649E5B55676B53AD047EB40321E83B2F772DC44727D95F7A5DE1F319437B09EC3CF833F5356CFB37D73313B6B5E6E2A417957E38F91D69787A204BEE36835D8F91A9CA6B37396A57C676AC48083733AE8CF7C0D7A056E75E4AAF77BAE0BD363A07E9FC3F626B1FABD0DB316E11ED709DC77370FA8D906E5CE594C3CA31A816FFF5A2DE390A3A2DA0ED86A84BD2A57BE9AA9D3FEF65A14B8D525ECFAE73150F6C666464F2CBD2DEF002DB83EE05CA4A529F7E4FE4C6B9DA04F435102DFBED5DE9C2D0DBBBE544EE9062B66F552428999EFA396A19C6BC18E7A8C22F108FB3FCD7443666635977F7AEAC986B4E9BF3D9BAD1471F0BB2C7F2EEF1051D472C27C843AB02F7AD05B927A81E204BEFDAB1594AEBE564A2D2B7515EA9C66EB3C3CB5ED6C580BB62F5FCB76D490E6AE28BB365357ED9BDDA9ABEB269DB573B647C1F6DF1ED5A1DBBFDB13A58D337065645F6E1E58FE04FEE92C13F875F277BD53175095C0B75F35662DE40E70F6D6EB2DED69A57AF468623A70633E2336D0E94CFBB784BDFDEAFD9C459F61485E2DC2DEA34D69AFFA033F92DFD7D7DAFBEC775E67B57DDFF578EC7DC69AC7286AA055AABF19F1BB52DED7A5AE80BF1DB5E5E9F28BA33DA5918E977AEF83D301816FDF4A74E69FCCE87DBB6E5BEDCA7BDB60EC05B77B83B6379F71FB332AF0318D725E73CDB4B72E3611B8E130879A61EF9DBED0D3F2966BF07A14F66E3FCFDEACE01AC72DDA4DF192FDCD48DF93F89417F8DB5E5BFE663CD1EB8D1413C8A84AE0CBEA4D457BE7DFA58F32B6782C239DC5B837ABF12A00FB75F0735B2AF05846BB2BFC557A3C725D8BCA3B2D097BC7577B29A8D265EA6896EF534F6705AFDFABD4315C67F946DBC4ADD4F7D5DFE309E585D9EDB5E567F9C39D719C6B0A2E087C59966F839BBD651A8EFEDC22ECCDF59E57AFB317086B84DACB75FE7BBD8B9C96C5D98FC728726EB0D73375ECF8B6378D6BEE5950AA6CADDFA5F6F597AE155C32F45D96DFDF4FC80571973C815ACE66F59EB51111D6EFCD3581C853913421F0EDDBD74EFBD78AE76886ECDE9F2354D825EDAD41943610E9E396BD54F6570D5DC4EF5162766FC4EF79242D5F398F87199531D8608FD1E55A63FC4CEE8D69EF6871DDAD6D421A3897EC9BB5EEE7947ECA47FD0970EEE8099DAB7E68A4A73473AE25ACDDA03A816FBFBE563E6F07FCA51E0B1FCD5900BC1D742D9B3F476B04EE3C461BF1F1CDD5EC65B3C4CD1641E1389C437A50B21E9FA93E4BD7FD2DBD194E94198D35F6BA8065F9B35CCCDEFF8465B9DE98ED2AEC3DBB8E6AD6C39EAAA36B02DFFE9DCDD2D8EB7C7C99D53BCB6CDD12B6C73F0D48F736926BEDEEB94EBF5794CF9F534F8D74A9B52E3D861447A4590F5042E9323E737D967EDF1A21D5887D83D1BE0FE7EED649A56FA4400FAE66F52ECB751D7AA73DAA590F7BAA8E6E097CFB96AEC976F46FD2BFFF32AB57D8FBCD51F01B29F47D13EC6F376B89F2F973E8A591DE1EF7DCD7682FC78067225CAB902A796379E6A0F7483AF37714A5BF8FFA733E77EAA4D1AE23FAB357066BD6556F67F5A63F7FA6C5449CAFCB686A2F6846E03B86A3B5617F2EF93AA582DEBCF666C64618407C196C4779847359F296D7D6E7E44AA9752E852331E59A41E49C1255C9FE8672FF5B1AF69658D7B765BFE6CEF7F0183E3999E14B4B471BA3D5AA87BF86BDAB68B37BBF5CD751C6C54CEC5FAD3F00D9A5CB0418DCC4B6366ADBD0B7B5AF839E08DF21A71EBECF5F9B5F396C3B67EA90B1E87C1255A9BAF6D7A2DC9FF991FC9EFBB5A3B6A15F9E5ED12EB275B77E897A2DD0BFA3B0B5D68DAC5C61EF8866FEEE046086EFB872552E3A27E56D97435896763362729CEBD6B37C675ACEA16438B22C71BF37DF39B74465EDF1364A1D9F084F2E9D89FCD9E8CB9D3549DD78A2A4164F29E458AF77EFB58ED4BE8646CF41A2B7D16420F0E58C4DDAEA396A246BEBF95C9728AF911AC1BD4E87F57AE7337AE79339955A92465D765FEE73D02AE0AA111A182473E6EB7A9FF044AB7E61CE59BD4FC6702D9673E8FD7ADEDB303EFDBBF4EFB5718310F872A5F70A8E7B7277165A3514A396D7D2375FCC84FBDBD57510E5D8E4587625CA7781DCF59BB0F79DC8CB2F3C553A3450B6E6F1F49A18E93A22BEABF6B3D44DB7124B385CD5DB516F204690EEE174F6EF567BE7EE2808DEA31DEC84C017626AB1915BAEC1B6C7D6F2B26B7D3977664DFF5AE21F9BBB1B0F09C2882A47FD367B7DF6552F03DBAFF44F786AD4C9045B6E04F7EBAA7CE63EAFB9C3DE276D8FC9447FDBDBFBE72CCCBDE3C9CFA4E1F0967A2418812FEC4B0704352BFBED9ABE3D569A23DC818D3020FCDA701F49BF5B8F65EC8BB4ACDC39B6E9A35011DD9D5514F93B309F1C75B7A0379F8803DB27EE9627E58427CE966888D05F7CEAE83A49FFBFEB24B6ABFAAE44D92C15F6469CDD1BC9DEB96EB9F4E6597D78562ED5290D087CE1B811D93E1A71A7A1C959E16E67C9F618FC8E700736C2C679B91F715EF5569E72781BA0AFFF76DB896975FCD2F2317B0798FEAD372AAED6BC3C9AC56ED67A1EA3CCEEF5383DB9DD29537BF54FD4757C9F046CADFB3C1CBB7B1E4B6CE29E731987BDD73B325339ACB16F4B0957FDB8BDF582294CE0CBE8EE06226795CE9D0A692F14CE5131D7087B0D8EE228B1398040E4B72FC775BD09D3FA386E03E865F95D665CC7F46A1BFADEF977CB62566F6E2582D28837ADDD2423A7B30923D1DAE4A737BDD39BDD51AE617EAB1D00EEBDDF973146B46BA4A4AB6B682F08ED21E07D22BD59EF865225025F8EF45C09EFCD662CDD59495F7B3B787D5B61D79AE59BB3633AC2720EAD945C9662F6C634E7B16D35F0D9FB0EE9E718AD73C83C8EAEA9BD01819B5879956843D31B52B57C59D626EA8C4CDACABD71518B3EC49747BF7B5F666E44BDD4A9775EF74E991CE146DD551F6759FEBCD646974E5EA120812F47EE3E6619C15E659186BCB53B29E972105F8E61E98A3FF7EB8FB09C432DA59770D039CFBBC655AB814FFA1D8E6E6A9DD1A9A247E975A64ECBABE41A80ADFA5F6FD65A8D3823931872968DDA9B1AE7DA0B42E81B4FE9356FAFCA4E8E72FC24ECEDB9DCA5D7CDD9D82FEA78F6EEE6D00424F0E54CC40EF0D57ABB57FFAFA6ED0E9A6F43DF288F914797F3C6448DCEF8B6F12FB521DBEC65A6D4A677B5076C5B5FCFEFEC6502F8A719066F57A141B4BE2E71F45A3672DFCC11FAC6F0A43CBE3D4F5765E76B08FBF49AEABDBCEDE5293DB6BB1173216E10F87247CB59BE47B3777BB09D651C79B674AE0ABCD5720E251AA05265ECE7C19FBF12F4FEA9C6CEB5B5063D6919777E811C4A0DDC5ADD10FBF2E8BD812C67DECE706CD5EF2FD5076A79C39BDF4AF76DEFBCC7D7BE68C4F1F0915C4FEAF6F49DF7945C7A908204BE5CA9D509BE7AD4AE57DB471A2387BEB9B4583AA397415A89065FD0FB4F353A5635073D3F0EFE0CF056A97AB2F5E3B76F83B95EFA11B471D4778F781361A41BDEFCE96E797ADB3FBD53766A86741102C1AFD771D431FFD1B13DFABCA3F515A622F0A5B65183DD3BBE341A9167F7456890A336A8ABDC1D7041EFBE1A039D56E5DD790672285D4F46ACABAE3E534F378FA92B2D1B11FABC4746BBE1CD6F4FCFED937AF8EE12683942BAA7A175EBF664B476616FFC58EA69D9ABCFD0FADC4E43E0CB5D3967A6BAC09FD9AEE35BE2AE7A8E0ADE60695F8975643594E76A84FFD18EBD0DDB80274AD49311EB99BB9F49FF8527A2F501B6A24F80E0BD279B9CDD753748CE39F628115A73EE6CA290B07770025FEED82E47B02CEF3A131107023D2A5541E6E8208E5079E72AA7B983DEF473BD39D66F1BF35ECE6BCD017BC4C7194BAFB706F4AD641DD97A10977EB7A74FC1B869CD911ECA450F9F91F74A6D72563BEC2DBD24450923B40D77372D2D7DB3A8753F615A025F9E7853E979F43CB6DE1BB1129F3F578726D28CDEB79F69DD917915F51A2ED95989D4F10478A3C6802E4AFB6050490939FB02B96F1A6F1FCD664C39EBEE27935272D7A766F7D67396C1A47545ADA5F09CD70604BEDCB5BD40D7E51DB617705A51B8B8F38B38AB70ABC5E78B74E7B5E4ACDE1C337ADF7CA6EDCF440C7F4B2C99B152870123281DF646B829963E89A6CE26976D3FF34DB94A97C42BB5066E94BE3079953AAF4F9687C8519FF638BBB72747C7EDEADC99D53B01812F4FED75AAB7FF9DFE5BBE2B5959E60C4C5B9CEFD61DDC74A1FBD6B37A4BDEB1DD0B7F5B5EE3DB639FF37B8E16F4EA3CC3BC6A3DFD10A1AE8CF01918D3DBB2556B5242AD47B2A92BF7797D52164B84BD66F7E6F576B9BFDA9BB4399F8D097C79636FB1EFADD641D0884A1DCFD681690EAD3AB83F93DF5BCEEA2D39D375CF3A43A5D5B55EA2B3122DBCC869B4EF035CAB11F66EEB9611FA7E5FF6AA801684BD65ECF52F5BD46F4FCEEBD90DFEA7EBF52E4BBEEF1BE969CC11E43847CEC74404BE94D07B87BF942F956B8981548E4E6284D9832D0768256696BE9DD55BFBFBA7A16FEDC17E89EFBD5D074F3D06F4AAC59ABD23D49982097A24ECFDE6E89A6FF9645BAE8D965BAED79BBEFF95AF63CA12E39108ED41CEA7A85B8C198DA91A13F8425D5F2AD8129B3CE468C85A56E22D36AA28F15EBD85BDAB6DE8BB2C751BF5DCCB672CCBB775FA5A89D01905E29861CD5E40FBFFC5D325D0D2FE6E8D7EE2D731E393D729B97CE093EF9163E3ECAFEB6E47B13793F7CB38ABC598B1C5754342E00B7D2851418ED6514C37C638FB777BAE7EB6C4B2095F1ECB691DF6AE6ACE80C85D666D26008CA2C6D23EA3D799A3F58B882B575FA9751FB0177BD7F6D363B7FEFBE87DDDA7E38308F57A8E1B897B9380BECEFAADF9D4C79D99BC5FCF51CBA76123ECFF3225812FD4F1B6B1582BFFDC156494B03097A70D727AF7F768E3C165293788FED2C18A7CFE4A2DEF106563BC68667F0479FBDDF78E45EFE717EEA8D1268C52679E99BD3EA58CBB13129E504EEF29D1872FB98FC5D7BAFCEDCF4798589473CDE0EDFBB7780AF18974F24FD4CFF995D9BE8D087CA19EB78D77890A71D4414DDAA94E43DCF5EFD2BBBFAB74039AF4E77278DBB03F7DFCAC9592E54AD8FB4F67C77BD447AFB79DC5B42E4BAF611D4B46566BC3CE91EACC23237F37DA39EA6F9BDD5B56E9BA710DAF4A78FB799FFE5CC93EE293E0B9D4E758AFBD2F334C4B2EE3B7F5E3E0CFA3D99E0B2A11F8421F4ACDF01DC9D14CDDF44EEF51E7235DCB35ED28E4B037683E3BAFE95A54D13BF7A51EDBC9595ED37330C29DF4B372D1FB77DB73F49D8E66F7AEC1EF88C78279D56A1766087B97451D415969DF54792BA3D64DB0EDFB45ECEB9EF9B29CDC13471370F6CE4BC9CFB14E062A3933FBC967591ABC7FA9B27534B1EA0E756025025F282FEAC668D1C3C3379E86787B7718D347807278D3B9EA2DECDDCA39F3A1C4F71F29EC9DC9F67C5DCD78FF95FC9B5136F1606E359FF4A8150A4431EA934FC4B0B794D85BCAE9BEDAFDE512B37C47B88177543EF7CA7DE9999EDBC9406F42DF5CED42CBF6B4D475B13781E6AE08E1FB3404BE50D6974AB6542398ABA318F9718C278DC7B6312FD1288EBA56EF1DE9E0A6E5C6747736431849E4EBF3ADBBB3F5D3BFB36618BDAB3D6B6D35E3F5D26B7BDBD2D78D916690ABEFDD7BBFB08456F5E3F6FDBF96FB1A217ECDD9A57BE7E12C082EE96BE8FB45941BA7A5C3DE374A2E8BC286C017CAFB52C9966A1C7255FC2374EC6B749E5B069DADE45ADEA1C4CCDE5994DA4CA4D5EC84B733DED74EA599DDF4A4D5BAEDB30FC04A6CB035B2F46924E1EFBEB44F94E3B566D73AE85DDF37577858EA3BD40C1D8FCAF6DE77ABD9D61C85BE35DF7B14B96F1C98905198C017CAF952B9EFAD274B7EB53A884FCEE108616FAA75F91D35C0A8D1814C07F32D96467832B3F74CBA5963EB7209A9D69B73CEB25EEF91D106E625ED6D7E9BEEC2AE9EFD2D0D9ABE3CF535BB08416F4E25CF6B8B3A3DCADABD7BEF951EEB5A75548B7AB0E48673B9BECF97FA909B04BE50D6D7D9BDD13BCBD13F5F0B39960E18A103BB35E3060935D40827F636184C67CA963CBFB9D6B2DECEAE12EA50DAD58D92F4EFB75AD5FF23D79577A917AE5D856D7BCBE9CC5CA696256F9BD3BA7FD8FA067AD44911D166F746594A607DFFDA6BF79E69B1B443AB7AB0C47552E27B98E55B90C017F2CBB94E57A947B2735131EFFBBA66ED48222CCC3F6A39ADD181DE9BC5B5DA06C0A5CEEFF63573775C0511E4B65787EFDD28D9FE1E21B810F6FE16E17C44F5A6CC2A53FB9E061CB99E1ACC51BE5BCF569CE91A4DFB7577BE7BABFAFCA88CB65ABBF7E83D5B2CED10E55C7C51EA386D27645080C017F2D986075F3A23A51BEA9C1DA55E02935A41EA7AEE5A6F5076E6AA412DF1FE1142DF11EDCD9AC83593E86A7095AE43587A862FF462EFB1F6BD7F1385B0F79A81E86F77CBAE63F64FE931A9F1F4D7F6FAEE755241A49B63B9DD3927E9CDC233ADEBF3F41CB55EBB774F8BA51D5AF4656B6E40FE73F3EFBEBCAF3E7F01025FC82B5767AA97CAAE87CF79F6E86C4E5F3A59253BB3779698D81EA3F5DFE7FE2C4FEFA2F73A30A969EF18E50C7BCFCAC0D11A6DB93B6B25AEDD5A7502F368BDF6EE5BADC3819EEC6D4C369337F5E56CC7E8CADB35F0DF1CFBF491FE1EDBBB12B37A8FFAA16F5FFF4B7879D5D7DA7BEDB33E7ACBFAFC69F98A5037D49AE5DBE3B5B77537ECFD5ACFD4DC486F2A025FF8AE4487A4C45A36BD37384F9D3D8A9E5B8E4E56C9B0F7EA73ED3D721C61A7F29CD75384CE6509B967ECBF7DDDD2EB6FE5FA9E3A94E4D6FBECB351EBC6DC6A3CD110D5D332AE8EDDF7350C79EA681DF11EE4AE57CFD6B4FD7A5C4AF4FDF7FAEF691F3DF767F9AA761BB8D7B7BFDB177D3ACBF7ED98A8459FB3C4757E763CD763D953FD32957FB5FE0030801F4BDE06766D504A34DABD0E489FDA7614B7BF72FBB57C0F7B6B6EBAF5F4674AAF097B25C7FBCF52E65769787F577ACD3CB1FD9912B3714BD24125879EEB999F3BBF9665FFDAA87923359292FD88E8DE066FB385E257722CF976D7DEF2623F93BFFBF2BAA5950A7BD3F1DAD7902AC7ECDE3347D7D08F935F2DD4EED7A7ED54DA763DFD4CCB725ED6721CD79A375C5AAD8DBC2C79AED999FA1655087CE19BB38111F5959E65B875D4817CA3E400E06D87B654E87BF75845DFB07044B93673C97DAC4B5C1F35EB0AC6356ABD7236983EFBF32C66FAAE5F6F66CF74ACEED886B177BC3D7E7BE72D577055CAB63EC9D1EE5F4DCAC811527DE9F33C59CA21BA5A1B391E4DE8D99BE0136DD669ADFE66CEEF7CB72CE67C4FFDF2CC2CE900DFE5EA9CF4B47E50C4CE48CDC145AE75B24A7FD6AF3B9FA6BBD9E6D06AE382ED264A237726DE94A99CE530FAF21911EB2EFAD6FBACCFB59E5F7FDFB61BDBBFDBDA9B3978B4B1D0DB754BA39A6D599837ED43DAE6F2DB9B80F0491D73B67970E4F3913BE85D9DD539B98EC7DB27AA72BE662BB566F73E5D726CDB8E7D6D7F225F374772F64BEE1EB7DEFB42C312F8C23B25D6ED5D96E3C1D517A5D6178CD21929752EF6DCED443E51F333BF9173C6E67610D86AB7DA5106EA7BE7E4CD77CC593F943ABFB9D793EE6D2D43621AA50CDD59C2E1E9F20EE9607B6F8DBF287D08AEBD5DBB7259DAB5F95195AC378E2623ECDDD089A4C4C499D221D5D7BEE408B37BDF9CB7DA1B5BE7B84197A3CF58EBA667CBD9BDB9FAEADA8BCC04BEF05E898D044A75044B3D121DA542AEB9265AAEEF5C332C88729E564F3E4F89CDE346091DB6C7E54D87B6879B4125C3D99ECF3D6D95BA766A3BFBFCB96F026D5F736FF6A7EB714C2D6FF44655F2981CBD5EA41B546737ACDF283119E38E52EFD5D375527A23C7AF6DEDD3B15B896BB2E68493DC7DE63BC7E2E8E99E37667B82A60A6BF8C233A5D603EAA9715FB5FECC2DD6662AD5092861BB76D9B27C3F562D1AE012EB08475FE3EB89F4B83C299FBD055639CB40AFE79B587AB9765ADBDBF0EC6CBD45D7671C399FEE595F6FE6B57DD33ECD559B9DE371F95C4FC1E56A838FD6607D2BE77E1AA58D54BF7DD91BE4A9AF6DEDDEFBBEB9E9906BC339A84AE00BCF94DA65B7C719872D1BADED1DD89AB37B73A975ECB61DE02FE5AAE5066A25AF879E775DBFDB813DD3CB77CF55065ACD0202CE8D74236E34B9DA89F4FCCEEC49FB73E7F85F05C8B9DABB484B995D6DC876E54B193C1B139CD55D57E396DE6636D69ADD5B4AAD8DE6DEBCDF53B96FA4F556163921F085674A343EDB06A09710A27550546B0DCEAF1DCA33B58E61AE75A75A2BDDF9186176D9DD70BFB7EF68F75F9887E0775C6EBAFDED4E997E5AEE4B6E4E967B76EF57B966F57EE987EFAD937CB6AEF9555D566AAC11C5DB8DED4A2D4958E3676ADA1EDF5CC7ECCD53830424F0857B6A2CB65EF2B547BB5357F371F4DC8F89D50AAA575F3F7BEECDB7DEBC6689A51DB67A7CB4F8ED67AB75ED440D69239F53E037334263C8D5EE8E1E683D7177CDCB27B37BF7E47C1AEEEB79CBBD31DB97CF93BB3ED95BA662CFD55365BD5C1BB5EAE392FDD4A7AFDDCBB969C5F1094CE00BF7ECED309D4BE93076B44AB8566055F2BC945EBB7759E29EF7B7B3B34B87BEAB1C6BCAD5927EC6ABE35AFADA29357B2BF73A9251AF0DE09FA284BEBF963F9FFA9941890DC56CDE76ED6E59BFD3DF6B7DDD6C45087B73FCFC9EB3EF16E91C7CF5B41FF96543E1AFF6DEFBCE2CEB3D239D432623F0856BE9860725C292929DDFF5F3E71CA4B41EF0D40A7B7B1994A403D1966BEEDEF1F6F36D43DF5A03EF1E66FBAEEE0CFA4A5F3B25965BE9E53A04CA8812FAAA8BC8E1A81C6FFB1A7737903A2A93E9ACD3B75AF7F797A56CFFF6A9F5733C5D33F5EC1C4438C64F949C1D9BBBAFBA7DEF3BAF5D7A1DECEDE7802A04BE706E9D8950AA72AED1C897DAB9B665A7ABD4718BD4A9BC2B5DCBACD4E78E32E3355DA7B6F44CEC911E2BAE710E4B1EA368EB0832B7DE06E9BDAB550F9BE5558ED9BDFF5C6221BDA9FC24A0BD3A962DD6F2CC2DD77ABD39A59F25C7ECDE28DFED4CE9FA2F67D89BD6E33597023C5363E3B69EE9571520F08573DBB0377725DD2258FC75F0AB1725070B353A95A51AE31A33C423491F0BAD51865B7712EF389B355443A92513840444A33CB651E30985BB7F1FB16D8CAAB71BE9B5FCB5F3EB8EAB3E4FC947E26BBEDE28E566D6D9BD4FBF5B892564B67AE8C77F91EBF86DCFDBDDBA24EABE1D2C025FB83252D8FBE3E0D75B2D063BA5665BD73C1F39CBD29B46F98D9C77DB737DCEBD99BE359778E84594590D5FE4BEEE7526C9A5B7C1FA284AD5C135D641EFA9FDC849BDFBB7DC7DA023D166F73EB941DFE3D3767B469ADDFBD6DDEF56A26FFD64D98DBB6D79E436BF443FF949D9CC55E7CCDA461623F08563A58392911BF8129EAC6DF646AFE7E34DA37C572F6BB16E6F5E940C7EA32DEF907ED7D68F3C46EE08436E359F30E0B79275F059FDF97543CFF4F3A68FF2B7BE99D8D37AF53DBAEAC3DE7DF2AED7D9BDCB72DD3F4983DE68FDF227C7E44E7D3172DBF1749247BAD4C997F7DD96A127E3C6274F7844D46A9D616D4670025FD85732581CA581AFDDF0E5EA0CAC6A2F6991BB41ACF5B9735F0325CB4D1AFC96D23AF45DDF37FDAE7B8142ABEBB497D7852F84BE6D447962E1EE8CE0743F88B48FF973E7675A28D9B6CD1A0ADC599FF769C879F66F72B695259750DBF6BF6B07BD6FCA62A919C73DF46DDEDE087A722E4BCC4E8DFC845BE4FA707BBC6A3CF592EAE19AE88AC017FEA946D8AB327B6E3D2F3906D6ADCE434FE169CECE48EEE51CAED49AEDBB2CED9636D9FB7F7BEB4BD6FE7C913BB15042A4D0B7C7B5F9BF685DDF1CB5C1E9CCDDEDEFE9CCBFBD355C5BCEB42DD1B6450C5C4ABBBB11DB93FEE89DD9BDADAF892B471BEFAE7D98DA7B0E3C91B3CFDD531DFD74C2CDD33E7FA971F7D327322297BD3B6A5EFBDBF7CA39118B02FEDDFA034030C2DEB8B6776C7F2DEFCE51FAF8FBDE9F7BD0E3ECDE56334DD7F2B2CAF99DFEFAAFD76EB5A9D8D5266DB507D9EBF180D9AC41C55AFE6B5F7B69DB96D67B47D26BF6E935DC32C88B50DF9CD5FD6F8FCDFA732DDB9608C7B6576F8290279B015ECDEEFDF9E07D8FD4DA0F616FD67B6FFDF12F7AF8AE6F43C4A7E17DCEB6E4CB67EE59EE1B2657638CDACB2AF192C0177ECB1D92EC75985464DF7D6DD0D69F6F3590CAA5B7D9BDADA403A9DC814C8B81F19DF3D3327082191DDD64CAE14E3DB36DDBD2FFB76D37F73E671A126F7FEEC8D5F79C615667C976B8F50DC565893F5B3482BD6374A7ECA79BEE6ECFF1D9B20F4F3FCB533526A7F43CE162EBEDF1EEA9BFF4F626C2DD7A2B771DF37532D008DE4E8ADA4A6F3C1EFD3D1D10F8C2DF4ACD88DB1B648D62A4C0B4F477E929401D793DA6BDA023E7AEB2B5BEE75E88B32CED07E7351FC78488F6EA81A3C0F5EAE7B67F772784495F237DBFF467F7FE7BFB1A5F36B029F964C5DE7B45696396256FE8D69201FDB537FDA5BDD9F8779DD511AB1CE72DD2F534AA1E8EF197B58E9F8850D7B408A74BC8DD0FAF756E22B479C312F842D9C79F470D7B97A5FD774A1B87BF4EFE2EFDFBDA7237C0AD8FFD5D511BF0DCC16FA4C75F5B779C4B97CD568FCCC31D4781EB5528996313A6AB40F7CD6BBC75F464C5B2945956278A1CFDC91197FFDAAEE9D9FBF74AFB726FC2DEBDD9F85FE458CA21D275D48B377DFB9E8EF3DB72D562A3B6B79E9C8F1E263544FF7C677A6F1BC2B2691BB32B19F6AEAFA902CBEF47F26BB5B7D3EF9DE35FFA1CF5D20097188C452EFFDBF29163B3A35AE739EA9A77A5BF7F7ABEDEEAE57AA46FDBF2BA37EB77F472B8AD9FEEB6C55FDFABA59CFDC928757A4EBD7FA7BD4DD89E6C62B517E4E73A265FCB7FDA6FEE55ED7A75F4B562DF86D9ADD6EE7DEAEDCDB5C8A17D2F656B2BF2F11C8219BECCAAC4EE922915585DD167C5449F91987B11FE9ECAFFDE6CB4D63B38DF7DBF929B273C557B498B37A2CD08644E51DBA99CF642EE65C9B3BEE056A46B3A7A3BDF528436EAAEA3CFFA657DD0A32554EEBCEF51F9CE3996B9F324425447C7F168F99C9CDE2EE7D18B37B37B9F1CE3DCEDC1534FCAFBDE526A5FF47ABD95E0381424F06566B91B189BB4B5F3B4C1E64F25D7B0EE4DBA79D1936352BBF39686BDB3850DAD070AC033251E896D1DA218B45F4B37008A7CBC72B5A7E95ABD5FDFF7E8064AEDCF19CDD171D86E36957EAFA7C72C471D137D524A2E4FAEEF1E9648D8CA79EE22DDA86470025F6653E391E3688F599712BDD37EA5A74E460D3982B3513A2FE91ABF778E4DEDCEDBEC41E7DB81C22865147A53B2BF90FBB5EFD6FBB9677C8D6E6D27A3F41F8FCE5FAE10F5EE926267E5E8ACCDCAD50F88702E9EB873BEB6371972380ADCBFBC46646FBEDFD37E70CB7A73F4BE600F1322463F076158C39799A46B6F957C8F9E1AF5B77AF98E698762BBA6622FDFA19412EB9DDDDDE1BD076FBE43AD0EECD7F586673642D904CAB85B3FACFDC812757EA4A57A72DB1EB716DF2F3DB66FD7E53D526226678EB071CF9B3557A3C875BEBE7E863B7AEBABD57C6AAC97E51C7A11E566DA9551D60DEF8219BECCA254E335FB320E3D342C66DFEC2BB58E750F65E2A92777CA7B58C77676239651886EE4EB2E677DBC9D2537EAF14A97785895F8BE7BE7A5C498E0EBD20877CB4FEEA51C7A2B6311FA3DA3CFEE5D966FEB554737F2A6BFE946E69167F9F6764D744BE0CB0C4ADFA99C691987544FDFB7E7990CA5E41AA4F6BE06DC19C1EA58AC9B066DF4D036BC09A5B511EF6D83DFBDE3B8B7DCC1D9E662A59668B8EB4B19DFFB8C695B957B09911EAEC9D597490A256E368D3ABBF7AB5ECAD4DBCFD9437DBFAD27A285BEB35D0F2158D281D1D5782C65D6B0377A83B7A7C5398A769CB68F51E6FC6CB3957F009E196DC3B665293773B966DF21423F25EDAFA7C7F447F2EFD63F6F7FA5AFD3FA91FF3BAE8E7D89E51C225C374F7C5992AFD412224F8E614FFDE308754149BD95FD37CE6E8AB564198746CCF06554A51E57DF1A7956E3A85A6DB0126DC051E2F344EC5CB450EB38940C4EA295D7336F672F28AF5057A91BF025D74ABDFB3325FA14B5EBA7686BA1A6C1EEF6DF6E978268F9B9BF8647DBB273D696E51CD3F4BA94C397EF5DA2CE89387B32979ACB39D43C8639CA7E2F81F8DDBAA5B6DEEA9D21087C1951CD4EE0CC15572FDF3D6D9CB7B3406A7D87088D6DE94E4A2FE5A1B45AC7A14479EAE151B5ADB79FD7B20E5057E9355323C85D27F77AF33087AB63D9BA3F9573C2C7DECCE5AD9CD74E8F616FEBF27954CFDC097DA3D55157BE1EEBC8CBE1E42CFBADEB9FBBAEEA965A7ABB0E8663490746533AECFDB5F9453FF61E11ACB9B9566B5F1E87BBE25AE89F73089456EA26556B2506D3DBC7D06BE825C08820F763C967E738E7B2143D87BDADCBE7D1313B3B963D1EEF656973AC4BF7417B3D1739B5CA2E2CE3108019BE8CA2F4120E232EDF30E323CDADEF72D6566369936599AF1C8DC83904722BD5E6961CB83E790CB664BB9A2E5DB02CEAE9967A1E07F4187845097BEF389B05CCB9D2B37C4B94FDF5357B289BCBF2E74CDF5A4F9CF65C5F0E47E0CB086ACCEA5D96FE1E77E6B7B4811B6546E3D94ED5AB920DFB28C7F14CB46B3EE2A647339403E099527DB3D2E15594C76097E59FFD96F433BD3D0611BE5B0FD2B6AD44999BE969B3BB7A0A7B7B3AAE919508224BB515BDE501EB58B1F4DAD335EA4B5EB0A4033DDBEEB85AAAE24A1B0B95577F463C67479B996CFFBBF4EED43DCE18F92252A899EBBC1E9DC337DFB5C772D053871D7A54AA0D2A59DF6CFB9691EC2D4DF533F9B52CFBFD83BDEFB3BE4E0FA15A6D69FFBFF4E3C8356638F6A2A7B077245FCA608ECD0B73BCCED96B477DBD1AB601F5F658E73ADEB5EB4B1E32C3975E99D5DBDE8C4B4244B07DCCF3682652E98EF26C61EF9D7AA0C6A0AAC64EF03DD6796F662BD8B80DCAE971298755F43AF0A8FFBBD72EA7E1F0DEEBF05BCBC7904BCEB8EBA5AF26EC6DEBCB71CFB17961AED9A7FA76FFB41D2FA64B3CAC9E1C77B3793B22F0A547B5C3DE912BB1193AFC51BE63CE4768F6D6F6ABD541EE6D00F1C5D9ECA83D358E49E9F3FCF67A695557460F676036BD2EE5B05AEBB288F5CAD531BDDA008C7F8A125CE47ECCBAB7BE9AB0B76F39FA805F42DF28D771747BC1EFFADF4F8372C7B813025F7A5223DC9A6D0987AF77737B09C45B77204B0C1E5BEEA4DBC339CFA575D929E56C93913765B5B732610608E455B28F56B3EDF9F21E6F674BE5306A5B554AA44D854ADD6068FDBD9E5286FB95ABAC6D43DF569FE1AE5A1BA0959006BFBDD5153C20F0A5073583DE6551E9DD1571F6CB1521CF77B35C1F4FCAF728CB39CC66F6EF0FB994DE4F6159FAB95EA3CE0EE66F11FBFB39CB4B4FFD5CD7097B8EAECBF4E98B96D7EFD77A3ECA759A1EC374C9872875241F087C89665B796E2BD31A77D0546AF7AD4B0AF478CCB6E54A67F39E281D93DA9ED43B3D2DE730EBF94CE9CCC2772386BD39FA063DCFFE7AAAE5CCE6BB2206BDCB52E6FA89F4FD52B5F79C601C919EBE5DCBF1977A3EC2F7481DAD014FC7FED5FA03C046DAE9A911F6E6DCA592B8B6E738BDA9D0EA73F422DD79750623DF08E86DB65C290699F0DD8861EFEAED779AED46527A9EA2F5ABF776908F22F7F513E9B8A77E2E7F7EDFF517ED8D3053B5B66D5DF2F418CC7ACC68C40C5FA2483B3D353B01913A7FE4B737537C6D6C6B067B3D3FE639E33572B70EEA71398711CFE74CB3E9A0B5D24B6DB50E7BD7CFF0F4BBAD4F3F7D798D1EA533EFDE6EBC944B4F1B38E50E7B237D57B379FBF1754F97593DDD682EE275CAE004BE44A223D09FDE67B2B408617B1A00CE78173AEA8665BD949916BE5CC7BDD761D04AE93AA9E7F519B7AFD1539BFFD4D5E69FB5967AD8FB1CD1EBF512EBF646F8CE425E6673B7BD88749D3211812F18F07FD1C3718B34ABB69759BE51D7BA2BEDE9E395BD05E2DB99ED339DD723E96C3CE05CC9F66BA46B71BBF3F9E8A1EF515BB2FDFFDBF037C771E831E0DD1A6DDD5E212F9C13F6D28CC097D65A875F06FCDFF4121C45EB7C461EFCCDDA29791BF6F6769C727F5EF527CCA1C6BE0A6B401AA55ECDB1AC433ADB356ADBFFD493BA3F5DEAE1C8D9B1395BA6A1F558E2899ED7ED5D3FFBDEE48551CA35E4D6EB788141087C69A9C6E081724608CB5B0C1222CFF29DB553F2B62EAA719C72979512614A94F212F9460AF4AAD67ABDAB28F5C9D7B67A5BD74659DB3697B77D85BD7FBF1EA7AB30F8ECFDA294992BA5C2DE92DF7FAFCF60FC368EA8E39151CC3AAE2210812FB5B9234C14DB41460B91067DB32EE1B02C7D0C5C227FB628ACE30BF995AE1F471E0CEF7DA7DE977828D1574843F151F512F6EECDE22D7DD3A794F406424F9FBDB46DBFC771C96FE67115C1087C6941C342041136848930E81B79C07DE5ED00ACC799EDB39CE7A7D7D4084F2A406E35029ED1EBA4A31B49BD2FF130EAF9AA21F7B9FE7A2ECE6E92E60AA85B85AE69FD12A5CF3D2237CDFF347ADB466704BEAC4A57D6D11F1999ADB1CA793EDE1CBBEDFBD738EE113B7911425F9D92F7C7BEE631CB5546463FCF91974B81DE940E7A97A58F3A29C73ABEA9BD356DA3F55196C5CDB01C4AB649395EBBE6755EA37D3EAA5FF40FFE94ABEE75D37CBF5CF5D0B63109812F3F933F977A34685962766657B355CCB93A3E6F1AFAEDAC815F4BF9B0FDE8BB4608F95B2F29B17E86D9BC3DE62D3AB539CB4884325F92C11CBC57338CE9A51E2ADD469F6D66D6FA46F0AA97731559897319714CD5BAECF456BF30866D3B317BF84D40025F96E577A7216725553BE8DD7EF637EF377A1092AA1D8C1CADDDDCEACE70B43BD23567F9F636BB2AB7AF8F29B63A661167A9AF22D59F518F11F4A0E4F5D37318F3B6FEDDAE877A661BFCEE6D60F6E4BDF7FA36E9CFBFDD1C8DFB66BA0119A15FD973FDD25AE4FE654F94414212F8CEADC4EEEF5B2DD6697AF39DA2857F35E49EB57216F844DE142B4287BCE67A7E3377467A79DA604FAEEBB5C4798F567F7E096666BC2E985BAD36B0E7B6A766DF726F03B3BDD9BF67EFB9FEFC5178BCECFC1BF28ADCEFCD25CA6CDEF43328D3CF58EA220F658EB004BEF37AD219B96A3C5B052911EE28B33FA86915FEEFE9A123537A5389D9AF951C83AF96A1E6D7321C29902DC94D3FB8AF76283563DBB32CDFBFF7D9CDF4A360781BF62ECB711036EB392969F4B0F76B7F32671FF76853C4DC84C8D71C23084AE03B9FAB70765B61AF7F4E3B947B6A776CCE668B98E1D54EC459947B21D0D759E1A5E4DCC8ADF5EC8B087295C79E67A7F5FCD981B2A2B4D33C7727BC4D37ADA28ED1AEAB5CFDC95C7DEEDA37685D3BE7DC3487C004BE733AEA886C37D15AED35CC513A32479DDB2F33BC84BEEF459DD570541EA29EE7A34730EF1E57B379FF547226492D5F6F0494FCEC113BF96EFAC1B148373967A05E9947EE6BEBEBFE2439DE7715AD0CD7FC3CAE61A05B02DFB9DCE988440BEB6AD3A0BFD363B989DC814B3FD7F6DABD13B045FD5E25959A5D1E25D07C13FAD6FAEC91CA9B651DE058CB1BB391DBDC3BDEDC4852AFCCA3D4B5F57513BFBB6A3E15F665CF8ADAD7D32CD7B08DDB605002DF79449D7D598A868BD55E00D463072E9DB97B77F7EFD16D438452D77C9463FC26CCACF5D9A385394FDB80DEEA0378A2F5724B3DB6B95B39975B625C35FA2039C2DFA36BB1461BFE76CF8AD99F5E2B29DAF276404602DF398C1AF61E050C5F1AAE68A105DF9D95855E3A38B536A6E8C9D5D2335FF5184EB4FCCC91CAE3DB3620D277805C46ED03D6A66FC9919A7DC9B3F077CF7ADD1FCDE06D5536EFDE44C91DF4BA69F32775130C4EE03B8FD11AB712B345665AC777ED9CCED2F1D9FB8E479D60E2AB156044AD07CEAEDB169F7994D9E633D4FDCCA3F5ACDE513DED37F53EBB997325FA23DBF272D62EA5E1EFDE726057816994FD09AEFE5DCEF77B63D4FEC1F63BCD322684A9087C1999F5D68E6DEFECCF283DC7A376E4465423EC8D5C07A40396289FB5F7EB6796BA9FF1D50A7ADF6C2CDA7B5BEBD167F6E4BACE8E96EEBA235A987BD7D1672C5157BCBD7667E81FE458B6667B7C7B287B30857FB5FE00F0D151E3ADA1B9B69DE53BBAA31D8795937EFC5CEA86BD3D948DED676D599EA31EAB37759B30875EA57564AD7AF2EEF53FD2CCB119FA4D5C2BD15ECC3E216355AA5F31523D94DB7ACCDFD46FDB36670D8F672FC31082C0777CBD847ABF36BFEE2AD968CFD248450D6A723A9B3D30CAA3E8A3FAB9D40B31B6F54F4FE5A1D4677D521747ECD8BF392E0682F4225DC3BC66D0DB633D99D3ACDF9B3FE5BE01BD37635E9B446DDBD0F76D7610AD3F085313F8CE2172E7B4F4E0E1ED5DCA19442E17399DCD02379322969FCB71C85BE3BA34EBFB6F4F8E814129D497CEA0AA711D5ECDEA8D3EB120B7A781887EC6787287BDE97AAAC432CB35BCADE3DF94C31FC9EF4043D6F01D5FE4F5C68E82DEA7EB071DADF314F9BB47D17AF3B6961D5A6B4DC5905EA3B5CBA14115D093DA9BB15D6DFAB4FEFFBBFDADDED7F15D963F6F16DFE93FCDB00628DFFC48FE6CFC52C6DBF1CE8CD7F0D9A67A571B5FF75EC7C33004BEB47034785807014F3A39771AE0A78DFBAC0D7ACBF72FFDFA67A1E2AF658C01684F5A87BCAB111E4D8EB0B1C96C7526D4B4D737AA55673EAD23AFFA5BA38526ADFB4FC07DAED7E7F6EAFE3404EEB90F0DC3B3A4C31CA254C4E9F20DE9E7FAD2105F6DDEF6F4D1BB28C7ACB4969D9F28833E8FA397952ED3D062A9863D2384BDCB52E6F33F79CDE8C7D1C66DE454B36C6CEBCB9A4B37A4EE5EDB4FEA80D1AEB128FD19C634DAF5D233E7E2CF8D82A3F6FD80FF22F09D4BCB0EE9D31D9D737FD62F6B11915FF49088F7AEC2DDD66BBEDA74E8DAD3014DD4E368E336724AC3D7D2EFB32C31EACDDCDF77B46BEC49FF525834869AE771BD5E949DF646ABBB8009087CE7D122F0FCB53C0F579EDE2DBCF3DAEB2C56A1EFBEDA618DB06D2C7702DE68CC4A38F7E6D8188C32B26DDDB6FDEF9CAFFF33F9EF0822D6DF11DDE95F3A9663C97D3EF7AE798FCDC714A57E06B824F09D4BCDC0339DD1FBA6A372676DDEF53DAEA43B86A66134758F45CD8EAB8E59193D05BCCB32EEF51EA17C47F80C50DA5FC9EF39ACF5E87613B0F53DA2D6A5EC33A9602E39CEF3D9A418016F395FCE9D7A19E88AC0773EA53AA4BF9677337AF75C6D42F4F53DD2107AD420E8891A039556C779EFBB09FCDF399AC91BDDD325657A11E5D8473FA6AE735A38BA11B2AD437B097A9FDCD4B97BBD8D78A348E83B879C6DDE51BF24BD3E46BC5E5A708D0253F977EB0F4013EB12076B63F76670B1D750E6EA005D85BD25DE2BDD717446DB72917BC0D97A1987BDCDE9ECD67B5F8BDDE173F038641D5737E95A7A7A9DCFDE0E702C6D1BD3D076D9F9BBBDB2B796C996F5EAB69C5FBDF75FCBFDEBE2C9F516B5CEF82A471F9B791CD523DB6B69BD0623B7B53DD1FF07A621F09DD759D0B9ED9C9E75F2B7AF51AA035232584E5FF36CF0368B74A0B22CDF062B5102B7BD8E9DCEDE3F9D1D939E06AD51CADD0C461C888EF23DC8270D08D6FAF0D7725C6F6EF70FF8B9FC79AD6C5FA3A6B46E6CD90E8E5467A4D23E764FED27F7E538B747D7407A6D3EB9F1C2B91CF5DEC8F5173010812F6963B51700A78F1C6E67A7947C447AEF7D4BD270FF2D1DA4BEE9D0EE056EAD3B47E977D80BB7E97F60DA7A36F9ACA21F6FA10B251C95A96DB01BE10989B39B6077AF8D9C6DF82CE1D55E3FA3755F883C72DD30392A0FAD6FC88CECEB138DB3D45FC00004BEA4CE3AA13F0EFE5C9259B76DEC85BECB72DD313A0A7AB7FF1D8D4EF59F7A0DC6CCEAE5886B9CDAA2D4A157F5E2DD6BE3E94CFE5EDB9112D227C8D44563A95DD6DD30C823C7B5E85C00E1D9B48DE846DB64A9277BCB5CA49B9D1D6DD6576B16F817E9EC2B83B03E37B3D82B7BD4E7FA81384AD48B7743AD27ED887A839EE5E833DD5DD26159DC4429E1EDB9732E802E087C8133DBF076FBDFE9BFD9FE7EF66FA3D8EE841EF533B69286FB51097AE3186DE02384A2576FEBC5DC75FD9DF71DADDE3893F68F18C7D7BEC7D91AE04F7F866772F41B9D0B20344B3A0077EC0D567EEDFCBF1E43379DB57F8A3C38B574433C916F0C6CDD7DF456B92215B12E4CBD5DBFFCE9A3CD771E63EEE178D5A65E19DB9BA51DDE6C7A6AFDD8FC2C41030C4BE00B3C31DA8065DBC1D381DE7777FDE61A9F61355A391C41F473F2743D72E8418BBAF1CE7B58AB9699EC6D02B6BD36CFDA9BA701AEBE6A5E5FEBAAE87D1F6072025F008E6C67FAD60CCAF606343AD5B1F5B07949E499EBC4F67557F712DECEE83D7BBD3BDFAD876B1D6A4B6F2A1EFDBFD49BFA64BBB1327944AADB01B211F802FCA603BD2F0D7E4B748ACDE2ED578F8F981ADCF15494D0B7C4B2367767B9BD998D7875ACB4BB8C62AF1C5FADC5FB2BF9EFF4DFEF5D43AE99BC3C01040CCBA66D007FD3C1BB966EE8F635E44B5FE7C7E61794A27CF1D6B60EACE9A8AE6CE54E387CF758B91E99D5B6ECEF5D537BD7C6DA57F5A44A5EDB3AF549FDEE3C00A199E10BCCEAEEFA6AFC291DA01C758CEFAE8F6CB0FF5DA9D93E4F6732F636EBA8F54C4DFA547B7DDADC4B377CF56496AFB57CE1DC9BEBBAC7A76A7AB0F661EE3EC9E13C00E1097C8199198C7E930E54D2CEF2D9BF258F52038E37D7464FE778EFFB19B8F144C91B06EA4F80BA7E6C7E7FD2FFE9ED663730114B3A003313F6E6B5ED2CA7BFE8CB9B6BA3C7EB49B0C61BE9F236B98CBAC48D9B29F0DED1F5D3639BDB933BF596A78480D004BEC02CF63A6E7B03691D6878AEC7418FEB9F2FD2351FDF869A91D6E72DF5B400F0CED1F5D3639BDB9356EBB5036425F0056670D4614EC31D1D68F8DBAC21CDACDF9BF7DE6EF6136D36EFDDF7FE126C0379B94959CE93FAD8790042B2862F302BE12E00B91CAD5F7EF533D19CAD4DFC7603B9271B2101F7D834AC8E3BF556C4BA1C40E00BB0C3060C442738C9C7B12497DEDB8D34B4DEBB2EDE7E479BA4C27BDAA936DCAC02BA664907803FE9D0115DE450A9B74027F2B184168E96A8C83593D08C4478463BD5D69DB5DA7BEBFB009310F802405FF6061651061BBD0E4C8550F0A7BD6BF9EBF56DA344C8CF3554DEDE269D674F42008420F00580BE451A6CF43CF0EC35AC86924ADC0CD9BEA6EB0EDE8BD4FECF20DD60D3CD622034812F00F425724012F9B31DD90EDE80DF4A841A82126004695DD6F30D6F6050025F807D3A6EF09CEB06C692CE68CBF59A403EDADE36D2BACC79004211F802FC9347E4E06F4F66E1B96E80BBCCAC87678EDA636D6F5B3F0EFE0CD09CC01700D8F364E072B67B3500F0DE9DF6D8ECD276DCC0024212F8021CD37966566FCABEC10E00D467962F00FF20F005D8A7F3CCCC84B700D017131500F86F025F80733ACFF4A275596DFDFE0030B2B3A593D6890ADA6200966511F8027379BAC6683ACB57279AA85ACF48FF2BC067008051DD79F2463B0CC07F13F802B3F8F288FACF45D8CBBCEEDE28B1691B00B4A7CF0A80C017E0C23A5BC29AA6CCE869B9779D00403B66F902B02C8BC017E0AE9FC9EFD09A19B500C01EFD5580C9097C81D9BC09C9FE5AFE5CA354279AD6CCA40580F9DCE9C7EAAF0220F005A6922324F3A81C111C0DE20CEE00604C4FFAB1FAAB009313F802BC2358A3A5BD415FC9C19DE52300A03FFAAB009312F8023CE75139222A15CA5A3E0200E2B8DBDEEBAF024C4CE00BCC284730E651392212CE02C0B89EB6F3425F8049097C81D908C41889A51600603E4FDA7F9314002624F00566952B28336382566ADFBCB873CDB81E00A0ACB5FD77D3178043025F6046B982328FC9114DA9B278E79A31830800EAF0C41A00A704BEC06C720762425FA210B802C05C7E2DF767FAEAAB024C44E00BCCA6C48C08411B2DFD5A9E0DF8BEBE1700D0DE8FE5FEF20EFAAA009311F80233CB1D5E9939416D3F36BF977EBCD3E3A300108FF619807F10F802B3CADD39B6B4032DD52C7766F902403C967600E0BF097C01F21082D1CA8F833F977E2F002086BBEDB3B0176012025F607639835A6118ADD42E7B7BD78D9B1E00D0D6595BFCD7622D5F8069087C8199DDDDE8E2AE9FC9EF30A2B370D94D0F00682377BF16808E097C81D9E50AA8D619133536CF82080C28012016A12F00CBB2087C0172CFC635BB9719B8A9010031097D0110F802D3CBD929B62E1A0000ADB9310B3039812FC09FA1AFD910709FEB0500E2D2B7059894C017E0B7AFB32174A89989D9430010D7765F895FC9EF000C4EE00BF0B76D78F5A5332C040300208A34F4D557059880C017E0B79FCBF7E51D6CDA060040243F963F67FC023038812FC06F3F36BFBFE910AF9BB6097D010000802604BE00FFF473F91DDA3E9DE52BF4050000009A11F802FC53FAD89B1D8EE1D8F6DA70A3030000A0B17FB7FE0000C1ADA1EFCFE5CF60EBAFCD9FF7C2606BA431831FCB9F21AF720F0000D098C017E09E6D909586BFE9DF030000003421F005784EB80B7FB2E40900004010D6F00500BE70030400002090FFF19FFFFCA7F56700000000002003337C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041087C01000000000621F005000000001884C017000000006010025F000000008041FC7FCCC0741CE089BE130000000049454E44AE426082', 'hex')
}
const contentBufferData: Buffer = contentBuffer('test')
const contentBufferArray: Array<Buffer> = splitBuffer(contentBufferData, 400)
export function createChildInscriptionTapScript(): Array<Buffer> {
const keyPair = wallet.ecPair;
let childOrdinalStacks: any = [
toXOnly(keyPair.publicKey),
opcodes.OP_CHECKSIG,
opcodes.OP_FALSE,
opcodes.OP_IF,
Buffer.from("ord", "utf8"),
1,
1,
Buffer.concat([Buffer.from(memeType, "utf8")]),
1,
2,
pointerBuffer1,
1,
3,
inscriptionBuffer,
1,
5,
metadataBuffer,
1,
7,
metaProtocol,
opcodes.OP_0
];
contentBufferArray.forEach((item: Buffer) => {
childOrdinalStacks.push(item)
})
childOrdinalStacks.push(opcodes.OP_ENDIF)
console.log(childOrdinalStacks)
return childOrdinalStacks;
}
async function childInscribe() {
const keyPair = wallet.ecPair;
const childOrdinalStack = createChildInscriptionTapScript();
const ordinal_script = script.compile(childOrdinalStack);
const scriptTree: Taptree = {
output: ordinal_script,
};
const redeem = {
output: ordinal_script,
redeemVersion: 192,
};
const ordinal_p2tr = payments.p2tr({
internalPubkey: toXOnly(keyPair.publicKey),
network,
scriptTree,
redeem,
});
const address = ordinal_p2tr.address ?? "";
console.log("send coin to address", address);
const utxos = await waitUntilUTXO(address as string);
const psbt = new Psbt({ network });
const parentInscriptionUTXO = {
txid: txhash,
vout: 0,
value: 546
}
psbt.addInput({
hash: parentInscriptionUTXO.txid,
index: parentInscriptionUTXO.vout,
witnessUtxo: {
value: parentInscriptionUTXO.value,
script: wallet.output,
},
tapInternalKey: toXOnly(keyPair.publicKey),
});
psbt.addInput({
hash: utxos[0].txid,
index: utxos[0].vout,
tapInternalKey: toXOnly(keyPair.publicKey),
witnessUtxo: { value: utxos[0].value, script: ordinal_p2tr.output! },
tapLeafScript: [
{
leafVersion: redeem.redeemVersion,
script: redeem.output,
controlBlock: ordinal_p2tr.witness![ordinal_p2tr.witness!.length - 1],
},
],
});
const change = utxos[0].value - 546 * 2 - fee;
psbt.addOutput({
address: receiveAddress, //Destination Address
value: 546,
});
psbt.addOutput({
address: receiveAddress, //Destination Address
value: 546,
});
psbt.addOutput({
address: receiveAddress, // Change address
value: change,
});
await signAndSend(keyPair, psbt);
}
childInscribe()
export async function signAndSend(
keypair: BTCSigner,
psbt: Psbt,
) {
const signer = tweakSigner(keypair, { network })
psbt.signInput(0, signer);
psbt.signInput(1, keypair);
psbt.finalizeAllInputs()
const tx = psbt.extractTransaction();
console.log(tx.virtualSize())
console.log(tx.toHex());
// const txid = await broadcast(tx.toHex());
// console.log(`Success! Txid is ${txid}`);
}
export async function waitUntilUTXO(address: string) {
return new Promise<IUTXO[]>((resolve, reject) => {
let intervalId: any;
const checkForUtxo = async () => {
try {
const response: AxiosResponse<string> = await blockstream.get(
`/address/${address}/utxo`
);
const data: IUTXO[] = response.data
? JSON.parse(response.data)
: undefined;
console.log(data);
if (data.length > 0) {
resolve(data);
clearInterval(intervalId);
}
} catch (error) {
reject(error);
clearInterval(intervalId);
}
};
intervalId = setInterval(checkForUtxo, 4000);
});
}
export async function getTx(id: string): Promise<string> {
const response: AxiosResponse<string> = await blockstream.get(
`/tx/${id}/hex`
);
return response.data;
}
const blockstream = new axios.Axios({
baseURL: `https://mempool.space/testnet/api`,
// baseURL: `https://mempool.space/api`,
});
export async function broadcast(txHex: string) {
const response: AxiosResponse<string> = await blockstream.post("/tx", txHex);
return response.data;
}
function tapTweakHash(pubKey: Buffer, h: Buffer | undefined): Buffer {
return crypto.taggedHash(
"TapTweak",
Buffer.concat(h ? [pubKey, h] : [pubKey])
);
}
function toXOnly(pubkey: Buffer): Buffer {
return pubkey.subarray(1, 33);
}
function tweakSigner(signer: any, opts: any = {}) {
let privateKey = signer.privateKey;
if (!privateKey) {
throw new Error('Private key is required for tweaking signer!');
}
if (signer.publicKey[0] === 3) {
privateKey = ecc.privateNegate(privateKey);
}
const tweakedPrivateKey = ecc.privateAdd(privateKey, tapTweakHash(toXOnly(signer.publicKey), opts.tweakHash));
if (!tweakedPrivateKey) {
throw new Error('Invalid tweaked private key!');
}
return ECPair.fromPrivateKey(Buffer.from(tweakedPrivateKey), {
network: opts.network,
});
}
interface IUTXO {
txid: string;
vout: number;
status: {
confirmed: boolean;
block_height: number;
block_hash: string;
block_time: number;
};
value: number;
}