@alpha-arcade/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2146 @@
1
+ import algosdk2, { AtomicTransactionComposer, getApplicationAddress, modelsv2 } from 'algosdk';
2
+ import * as algokit3 from '@algorandfoundation/algokit-utils';
3
+ import { Decimal } from 'decimal.js';
4
+
5
+ // src/modules/trading.ts
6
+ var APP_SPEC = {
7
+ "hints": {
8
+ "on_create(string,uint64,address,uint64,address,string,address,uint64,uint64,address)uint8": {
9
+ "call_config": {
10
+ "no_op": "CREATE"
11
+ }
12
+ },
13
+ "create_escrow(uint64,uint64,uint64,uint8)uint64": {
14
+ "call_config": {
15
+ "no_op": "CALL"
16
+ }
17
+ },
18
+ "activate_market()uint8": {
19
+ "call_config": {
20
+ "no_op": "CALL"
21
+ }
22
+ },
23
+ "process_potential_match(application,application)uint8": {
24
+ "call_config": {
25
+ "no_op": "CALL"
26
+ }
27
+ },
28
+ "resolve_market(uint8)uint8": {
29
+ "call_config": {
30
+ "no_op": "CALL"
31
+ }
32
+ },
33
+ "merge_shares()uint8": {
34
+ "call_config": {
35
+ "no_op": "CALL"
36
+ }
37
+ },
38
+ "split_shares()uint8": {
39
+ "call_config": {
40
+ "no_op": "CALL"
41
+ }
42
+ },
43
+ "claim()uint8": {
44
+ "call_config": {
45
+ "no_op": "CALL"
46
+ }
47
+ },
48
+ "donate_excess_to_market_friend()uint8": {
49
+ "call_config": {
50
+ "no_op": "CALL"
51
+ }
52
+ },
53
+ "delete_escrow(uint64,address)uint8": {
54
+ "call_config": {
55
+ "no_op": "CALL"
56
+ }
57
+ },
58
+ "delete()uint8": {
59
+ "call_config": {
60
+ "delete_application": "CALL"
61
+ }
62
+ },
63
+ "do_noop(uint64)uint64": {
64
+ "call_config": {
65
+ "no_op": "CALL"
66
+ }
67
+ },
68
+ "on_update()uint64": {
69
+ "call_config": {
70
+ "update_application": "CALL"
71
+ }
72
+ }
73
+ },
74
+ "source": {
75
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDgKaW50Y2Jsb2NrIDEgMCAyIDI1NiAxMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAwMDAgMTg0NDY3NDQwNzM3MDk1NTE2MTUKYnl0ZWNibG9jayAweDYzNmY2YzZjNjE3NDY1NzI2MTZjNWY2MTczNzM2NTc0NWY2OTY0IDB4Nzk2NTczNWY3Mzc1NzA3MDZjNzkgMHg2ZTZmNWY3Mzc1NzA3MDZjNzkgMHg3OTY1NzM1ZjYxNzM3MzY1NzQ1ZjY5NjQgMHg2ZTZmNWY2MTczNzM2NTc0NWY2OTY0IDB4MTUxZjdjNzUgMHg3MDZmNzM2OTc0Njk2ZjZlIDB4MDAgMHg2OTczNWY3MjY1NzM2ZjZjNzY2NTY0IDB4NmQ2MTcyNmI2NTc0NWY2NjcyNjk2NTZlNjQ1ZjYxNjQ2NDcyIDB4NzA3MjY5NjM2NSAweDczNjk2NDY1IDB4IDB4NmY3NzZlNjU3MiAweDY5NzM1ZjYxNjM3NDY5NzY2MTc0NjU2NCAweDY2NjU2NTVmNjI2MTczNjU1ZjcwNjU3MjYzNjU2ZTc0IDB4NmQ2MTcyNmI2NTc0NWY2MTcwNzA1ZjY5NjQgMHg3MzZjNjk3MDcwNjE2NzY1IDB4NmY3NTc0NjM2ZjZkNjUgMHgxMTllM2M0YiAweDZmNzI2MTYzNmM2NTVmNjE2NDY0NzI2NTczNzMgMHg2NjY1NjU1ZjYxNjQ2NDcyNjU3MzczIDB4NjU3MzYzNzI2Zjc3NWY2MzYxNmU2MzY1NmM1ZjYxNjQ2NDcyNjU3MzczIDB4NDE2YzcwNjg2MTIwNGQ2MTcyNmI2NTc0MjAgMHg2ODc0NzQ3MDczM2EyZjJmNzc3Nzc3MmU2MTZjNzA2ODYxNjE3MjYzNjE2NDY1MmU2MzZmNmQyZjZkNjE3MjZiNjU3NDJmIDB4NjY2NTY1NWY3NDY5NmQ2NTcyNWY3Mzc0NjE3Mjc0CnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4YmE4ZDYxY2IgLy8gIm9uX2NyZWF0ZShzdHJpbmcsdWludDY0LGFkZHJlc3MsdWludDY0LGFkZHJlc3Msc3RyaW5nLGFkZHJlc3MsdWludDY0LHVpbnQ2NCxhZGRyZXNzKXVpbnQ4Igo9PQpibnogbWFpbl9sMjYKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHhlMTFhZjJhMCAvLyAiY3JlYXRlX2VzY3Jvdyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCl1aW50NjQiCj09CmJueiBtYWluX2wyNQp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweDAyYTRlMzA5IC8vICJhY3RpdmF0ZV9tYXJrZXQoKXVpbnQ4Igo9PQpibnogbWFpbl9sMjQKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHhiYTFkZWVmNSAvLyAicHJvY2Vzc19wb3RlbnRpYWxfbWF0Y2goYXBwbGljYXRpb24sYXBwbGljYXRpb24pdWludDgiCj09CmJueiBtYWluX2wyMwp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweGZiZGJmMTExIC8vICJyZXNvbHZlX21hcmtldCh1aW50OCl1aW50OCIKPT0KYm56IG1haW5fbDIyCnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4OGM1ZGIwNTYgLy8gIm1lcmdlX3NoYXJlcygpdWludDgiCj09CmJueiBtYWluX2wyMQp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweDgzMjFiM2JkIC8vICJzcGxpdF9zaGFyZXMoKXVpbnQ4Igo9PQpibnogbWFpbl9sMjAKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHgzMjAwNjIzYiAvLyAiY2xhaW0oKXVpbnQ4Igo9PQpibnogbWFpbl9sMTkKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHhhN2ExNTcxZSAvLyAiZG9uYXRlX2V4Y2Vzc190b19tYXJrZXRfZnJpZW5kKCl1aW50OCIKPT0KYm56IG1haW5fbDE4CnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4NDI1ZGViM2QgLy8gImRlbGV0ZV9lc2Nyb3codWludDY0LGFkZHJlc3MpdWludDgiCj09CmJueiBtYWluX2wxNwp0eG5hIEFwcGxpY2F0aW9uQXJncyAwCmJ5dGVjIDE5IC8vICJkZWxldGUoKXVpbnQ4Igo9PQpibnogbWFpbl9sMTYKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHhiNGYxMWExOCAvLyAiZG9fbm9vcCh1aW50NjQpdWludDY0Igo9PQpibnogbWFpbl9sMTUKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHgyNGMzZDIzNCAvLyAib25fdXBkYXRlKCl1aW50NjQiCj09CmJueiBtYWluX2wxNAplcnIKbWFpbl9sMTQ6CnR4biBPbkNvbXBsZXRpb24KcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIG9udXBkYXRlY2FzdGVyXzQyCmludGNfMCAvLyAxCnJldHVybgptYWluX2wxNToKdHhuIE9uQ29tcGxldGlvbgppbnRjXzEgLy8gTm9PcAo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzEgLy8gMAohPQomJgphc3NlcnQKY2FsbHN1YiBkb25vb3BjYXN0ZXJfNDEKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDE2Ogp0eG4gT25Db21wbGV0aW9uCnB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzEgLy8gMAohPQomJgphc3NlcnQKY2FsbHN1YiBkZWxldGVjYXN0ZXJfNDAKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDE3Ogp0eG4gT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIGRlbGV0ZWVzY3Jvd2Nhc3Rlcl8zOQppbnRjXzAgLy8gMQpyZXR1cm4KbWFpbl9sMTg6CnR4biBPbkNvbXBsZXRpb24KaW50Y18xIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18xIC8vIDAKIT0KJiYKYXNzZXJ0CmNhbGxzdWIgZG9uYXRlZXhjZXNzdG9tYXJrZXRmcmllbmRjYXN0ZXJfMzgKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDE5Ogp0eG4gT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIGNsYWltY2FzdGVyXzM3CmludGNfMCAvLyAxCnJldHVybgptYWluX2wyMDoKdHhuIE9uQ29tcGxldGlvbgppbnRjXzEgLy8gTm9PcAo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzEgLy8gMAohPQomJgphc3NlcnQKY2FsbHN1YiBzcGxpdHNoYXJlc2Nhc3Rlcl8zNgppbnRjXzAgLy8gMQpyZXR1cm4KbWFpbl9sMjE6CnR4biBPbkNvbXBsZXRpb24KaW50Y18xIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18xIC8vIDAKIT0KJiYKYXNzZXJ0CmNhbGxzdWIgbWVyZ2VzaGFyZXNjYXN0ZXJfMzUKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDIyOgp0eG4gT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIHJlc29sdmVtYXJrZXRjYXN0ZXJfMzQKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDIzOgp0eG4gT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIHByb2Nlc3Nwb3RlbnRpYWxtYXRjaGNhc3Rlcl8zMwppbnRjXzAgLy8gMQpyZXR1cm4KbWFpbl9sMjQ6CnR4biBPbkNvbXBsZXRpb24KaW50Y18xIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18xIC8vIDAKIT0KJiYKYXNzZXJ0CmNhbGxzdWIgYWN0aXZhdGVtYXJrZXRjYXN0ZXJfMzIKaW50Y18wIC8vIDEKcmV0dXJuCm1haW5fbDI1Ogp0eG4gT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CnR4biBBcHBsaWNhdGlvbklECmludGNfMSAvLyAwCiE9CiYmCmFzc2VydApjYWxsc3ViIGNyZWF0ZWVzY3Jvd2Nhc3Rlcl8zMQppbnRjXzAgLy8gMQpyZXR1cm4KbWFpbl9sMjY6CnR4biBPbkNvbXBsZXRpb24KaW50Y18xIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18xIC8vIDAKPT0KJiYKYXNzZXJ0CmNhbGxzdWIgb25jcmVhdGVjYXN0ZXJfMzAKaW50Y18wIC8vIDEKcmV0dXJuCgovLyBkaXZfY2VpbF9ieXRlcwpkaXZjZWlsYnl0ZXNfMDoKcHJvdG8gMiAxCmZyYW1lX2RpZyAtMgpmcmFtZV9kaWcgLTEKYi8Kc3RvcmUgMTIKZnJhbWVfZGlnIC0yCmZyYW1lX2RpZyAtMQpiJQpsZW4KaW50Y18xIC8vIDAKPgpibnogZGl2Y2VpbGJ5dGVzXzBfbDIKbG9hZCAxMgpyZXRzdWIKZGl2Y2VpbGJ5dGVzXzBfbDI6CmxvYWQgMTIKaW50Y18wIC8vIDEKaXRvYgpiKwpyZXRzdWIKCi8vIGNhbGN1bGF0ZV9mZWUKY2FsY3VsYXRlZmVlXzE6CnByb3RvIDMgMQpmcmFtZV9kaWcgLTMKaXRvYgpzdG9yZSAyCmZyYW1lX2RpZyAtMgppdG9iCnN0b3JlIDMKaW50YyA0IC8vIDEwMDAwMDAKZnJhbWVfZGlnIC0yCi0KaXRvYgpzdG9yZSA0CmxvYWQgMgpsb2FkIDMKYioKc3RvcmUgMgpsb2FkIDIKbG9hZCA0CmIqCnN0b3JlIDIKbG9hZCAyCmZyYW1lX2RpZyAtMQppdG9iCmIqCnN0b3JlIDIKbG9hZCAyCmludGMgNSAvLyAxMDAwMDAwMDAwMDAwMDAwMDAwCml0b2IKYi8KYnRvaQpyZXRzdWIKCi8vIGNhbGN1bGF0ZV9mZWVfY29tbWl0CmNhbGN1bGF0ZWZlZWNvbW1pdF8yOgpwcm90byAzIDEKZnJhbWVfZGlnIC0zCml0b2IKc3RvcmUgOQpmcmFtZV9kaWcgLTIKaXRvYgpzdG9yZSAxMAppbnRjIDQgLy8gMTAwMDAwMApmcmFtZV9kaWcgLTIKLQppdG9iCnN0b3JlIDExCmxvYWQgOQpsb2FkIDEwCmIqCnN0b3JlIDkKbG9hZCA5CmxvYWQgMTEKYioKc3RvcmUgOQpsb2FkIDkKZnJhbWVfZGlnIC0xCml0b2IKYioKc3RvcmUgOQpsb2FkIDkKaW50YyA1IC8vIDEwMDAwMDAwMDAwMDAwMDAwMDAKaXRvYgpjYWxsc3ViIGRpdmNlaWxieXRlc18wCmJ0b2kKcmV0c3ViCgovLyBnbG9iYWxfbXVzdF9nZXQKZ2xvYmFsbXVzdGdldF8zOgpwcm90byAyIDEKZnJhbWVfZGlnIC0yCmZyYW1lX2RpZyAtMQphcHBfZ2xvYmFsX2dldF9leApzdG9yZSAxCnN0b3JlIDAKbG9hZCAxCmFzc2VydApsb2FkIDAKcmV0c3ViCgovLyBnZXRfYXBwX2FkZHIKZ2V0YXBwYWRkcl80Ogpwcm90byAxIDEKZnJhbWVfZGlnIC0xCmFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKc3RvcmUgNgpzdG9yZSA1CmxvYWQgNgphc3NlcnQKbG9hZCA1CnJldHN1YgoKLy8gZ2V0X2FwcF9jcmVhdG9yCmdldGFwcGNyZWF0b3JfNToKcHJvdG8gMSAxCmZyYW1lX2RpZyAtMQphcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCnN0b3JlIDE2CnN0b3JlIDE1CmxvYWQgMTYKYXNzZXJ0CmxvYWQgMTUKcmV0c3ViCgovLyBzZW5kX2Fzc2V0CnNlbmRhc3NldF82Ogpwcm90byA0IDAKaXR4bl9iZWdpbgpwdXNoaW50IDQgLy8gYXhmZXIKaXR4bl9maWVsZCBUeXBlRW51bQpmcmFtZV9kaWcgLTQKaXR4bl9maWVsZCBTZW5kZXIKZnJhbWVfZGlnIC0zCml0eG5fZmllbGQgQXNzZXRBbW91bnQKZnJhbWVfZGlnIC0yCml0eG5fZmllbGQgWGZlckFzc2V0CmZyYW1lX2RpZyAtMQppdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKaXR4bl9zdWJtaXQKcmV0c3ViCgovLyBzZW5kX2FsZ28Kc2VuZGFsZ29fNzoKcHJvdG8gMyAwCml0eG5fYmVnaW4KaW50Y18wIC8vIHBheQppdHhuX2ZpZWxkIFR5cGVFbnVtCmZyYW1lX2RpZyAtMwppdHhuX2ZpZWxkIFNlbmRlcgpmcmFtZV9kaWcgLTIKaXR4bl9maWVsZCBBbW91bnQKZnJhbWVfZGlnIC0xCml0eG5fZmllbGQgUmVjZWl2ZXIKaXR4bl9zdWJtaXQKcmV0c3ViCgovLyBnZXRfZnVuZHNfdG9fdHJhZGVyCmdldGZ1bmRzdG90cmFkZXJfODoKcHJvdG8gNCAwCmZyYW1lX2RpZyAtNApmcmFtZV9kaWcgLTIKYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCnN0b3JlIDgKc3RvcmUgNwpsb2FkIDgKYm56IGdldGZ1bmRzdG90cmFkZXJfOF9sMgpnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwpmcmFtZV9kaWcgLTEKZnJhbWVfZGlnIC0yCmZyYW1lX2RpZyAtMwpjYWxsc3ViIHNlbmRhc3NldF82CmIgZ2V0ZnVuZHN0b3RyYWRlcl84X2wzCmdldGZ1bmRzdG90cmFkZXJfOF9sMjoKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKZnJhbWVfZGlnIC0xCmZyYW1lX2RpZyAtMgpmcmFtZV9kaWcgLTQKY2FsbHN1YiBzZW5kYXNzZXRfNgpnZXRmdW5kc3RvdHJhZGVyXzhfbDM6CnJldHN1YgoKLy8gc2FmZV93YWxsZXRfYmFsYW5jZQpzYWZld2FsbGV0YmFsYW5jZV85Ogpwcm90byAyIDEKZnJhbWVfZGlnIC0xCmZyYW1lX2RpZyAtMgphc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKc3RvcmUgMTgKcmV0c3ViCgovLyBvbl9jcmVhdGUKb25jcmVhdGVfMTA6CnByb3RvIDEwIDEKaW50Y18xIC8vIDAKcHVzaGJ5dGVzIDB4NzQ2OTc0NmM2NSAvLyAidGl0bGUiCmZyYW1lX2RpZyAtMTAKZXh0cmFjdCAyIDAKYXBwX2dsb2JhbF9wdXQKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKZnJhbWVfZGlnIC05CmFwcF9nbG9iYWxfcHV0CmJ5dGVjIDIwIC8vICJvcmFjbGVfYWRkcmVzcyIKZnJhbWVfZGlnIC04CmFwcF9nbG9iYWxfcHV0CnB1c2hieXRlcyAweDcyNjU3MzZmNmM3NTc0Njk2ZjZlNWY3NDY5NmQ2NSAvLyAicmVzb2x1dGlvbl90aW1lIgpmcmFtZV9kaWcgLTcKYXBwX2dsb2JhbF9wdXQKYnl0ZWMgMTQgLy8gImlzX2FjdGl2YXRlZCIKaW50Y18xIC8vIDAKYXBwX2dsb2JhbF9wdXQKYnl0ZWMgOCAvLyAiaXNfcmVzb2x2ZWQiCmludGNfMSAvLyAwCmFwcF9nbG9iYWxfcHV0CmJ5dGVjIDkgLy8gIm1hcmtldF9mcmllbmRfYWRkciIKZnJhbWVfZGlnIC02CmFwcF9nbG9iYWxfcHV0CnB1c2hieXRlcyAweDcyNzU2YzY1NzMgLy8gInJ1bGVzIgpmcmFtZV9kaWcgLTUKZXh0cmFjdCAyIDAKYXBwX2dsb2JhbF9wdXQKYnl0ZWMgMjEgLy8gImZlZV9hZGRyZXNzIgpmcmFtZV9kaWcgLTQKYXBwX2dsb2JhbF9wdXQKYnl0ZWMgMTUgLy8gImZlZV9iYXNlX3BlcmNlbnQiCmZyYW1lX2RpZyAtMwphcHBfZ2xvYmFsX3B1dApwdXNoYnl0ZXMgMHg2NjY1NjU1Zjc0Njk2ZDY1NzI1Zjc0Njg3MjY1NzM2ODZmNmM2NCAvLyAiZmVlX3RpbWVyX3RocmVzaG9sZCIKZnJhbWVfZGlnIC0yCmFwcF9nbG9iYWxfcHV0CmJ5dGVjIDIyIC8vICJlc2Nyb3dfY2FuY2VsX2FkZHJlc3MiCmZyYW1lX2RpZyAtMQphcHBfZ2xvYmFsX3B1dAppbnRjXzAgLy8gMQpmcmFtZV9idXJ5IDAKZnJhbWVfZGlnIDAKaW50Y18zIC8vIDI1Ngo8CmFzc2VydApyZXRzdWIKCi8vIGludF90b19hc2NpaQppbnR0b2FzY2lpXzExOgpwcm90byAxIDEKcHVzaGJ5dGVzIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkgLy8gIjAxMjM0NTY3ODkiCmZyYW1lX2RpZyAtMQppbnRjXzAgLy8gMQpleHRyYWN0MwpyZXRzdWIKCi8vIGl0b2EKaXRvYV8xMjoKcHJvdG8gMSAxCmZyYW1lX2RpZyAtMQppbnRjXzEgLy8gMAo9PQpibnogaXRvYV8xMl9sNQpmcmFtZV9kaWcgLTEKcHVzaGludCAxMCAvLyAxMAovCmludGNfMSAvLyAwCj4KYm56IGl0b2FfMTJfbDQKYnl0ZWMgMTIgLy8gIiIKaXRvYV8xMl9sMzoKZnJhbWVfZGlnIC0xCnB1c2hpbnQgMTAgLy8gMTAKJQpjYWxsc3ViIGludHRvYXNjaWlfMTEKY29uY2F0CmIgaXRvYV8xMl9sNgppdG9hXzEyX2w0OgpmcmFtZV9kaWcgLTEKcHVzaGludCAxMCAvLyAxMAovCmNhbGxzdWIgaXRvYV8xMgpiIGl0b2FfMTJfbDMKaXRvYV8xMl9sNToKcHVzaGJ5dGVzIDB4MzAgLy8gIjAiCml0b2FfMTJfbDY6CnJldHN1YgoKLy8gc2V0dXBfZXNjcm93CnNldHVwZXNjcm93XzEzOgpwcm90byA3IDAKaXR4bl9iZWdpbgppbnRjXzAgLy8gcGF5Cml0eG5fZmllbGQgVHlwZUVudW0KZnJhbWVfZGlnIC03CmNhbGxzdWIgZ2V0YXBwYWRkcl80Cml0eG5fZmllbGQgUmVjZWl2ZXIKcHVzaGludCAzMDAwMDAgLy8gMzAwMDAwCnB1c2hpbnQgMzAwMCAvLyAzMDAwCisKcHVzaGludCAxMDAwMDAgLy8gMTAwMDAwCisKaXR4bl9maWVsZCBBbW91bnQKZ2xvYmFsIE1pblR4bkZlZQppdHhuX2ZpZWxkIEZlZQppdHhuX25leHQKcHVzaGludCA2IC8vIGFwcGwKaXR4bl9maWVsZCBUeXBlRW51bQpmcmFtZV9kaWcgLTcKaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECnB1c2hieXRlcyAweDk1NGU3ZDcyIC8vICJzZXR1cChzdHJpbmcsc3RyaW5nLHN0cmluZyxzdHJpbmcsc3RyaW5nKXVpbnQ4IgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTMKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTYKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTIKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTQKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTUKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKaXR4bl9maWVsZCBBcHBsaWNhdGlvbnMKZnJhbWVfZGlnIC0xCml0eG5fZmllbGQgQXNzZXRzCmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0Cml0eG5fZmllbGQgQXNzZXRzCmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKaXR4bl9maWVsZCBBc3NldHMKYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0Cml0eG5fZmllbGQgQXNzZXRzCnR4biBTZW5kZXIKaXR4bl9maWVsZCBBY2NvdW50cwppdHhuX25leHQKcHVzaGludCA0IC8vIGF4ZmVyCml0eG5fZmllbGQgVHlwZUVudW0KdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKaXR4bl9maWVsZCBYZmVyQXNzZXQKZnJhbWVfZGlnIC03CmNhbGxzdWIgZ2V0YXBwYWRkcl80Cml0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgpnbG9iYWwgTWluVHhuRmVlCml0eG5fZmllbGQgRmVlCnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKaXR4bl9maWVsZCBBc3NldEFtb3VudAppdHhuX3N1Ym1pdApyZXRzdWIKCi8vIGNyZWF0ZV9lc2Nyb3cKY3JlYXRlZXNjcm93XzE0Ogpwcm90byA0IDEKaW50Y18xIC8vIDAKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBTZW5kZXIKdHhuIFNlbmRlcgo9PQphc3NlcnQKdHhuIFR5cGVFbnVtCnB1c2hpbnQgNiAvLyBhcHBsCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFR5cGVFbnVtCnB1c2hpbnQgNCAvLyBheGZlcgo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldFJlY2VpdmVyCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzIgLy8gMgotCmd0eG5zIFNlbmRlcgp0eG4gU2VuZGVyCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzIgLy8gMgotCmd0eG5zIFR5cGVFbnVtCmludGNfMCAvLyBwYXkKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgUmVjZWl2ZXIKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgQW1vdW50CnB1c2hpbnQgOTU2NTAwIC8vIDk1NjUwMAo+PQphc3NlcnQKYnl0ZWMgOCAvLyAiaXNfcmVzb2x2ZWQiCmFwcF9nbG9iYWxfZ2V0CmludGNfMSAvLyAwCj09CmFzc2VydApieXRlYyAxNCAvLyAiaXNfYWN0aXZhdGVkIgphcHBfZ2xvYmFsX2dldAppbnRjXzAgLy8gMQo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKYnl0ZWNfMyAvLyAieWVzX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAo9PQp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFhmZXJBc3NldApieXRlYyA0IC8vICJub19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKPT0KfHwKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKPT0KfHwKYXNzZXJ0Cml0eG5fYmVnaW4KcHVzaGludCA2IC8vIGFwcGwKaXR4bl9maWVsZCBUeXBlRW51bQpwdXNoYnl0ZXMgMHgwODIwMDYwMDAxYzA4NDNkMDQ4MDAyODA4MDkwYmJiYWQ2YWRmMDBkMjYxNzBkNmQ2MTcyNmI2NTc0NWY2MTcwNzA1ZjY5NjQwODcwNmY3MzY5NzQ2OTZmNmUwNTcwNzI2OTYzNjUwNDczNjk2NDY1MDg3MzZjNjk3MDcwNjE2NzY1MDU2Zjc3NmU2NTcyMDg3MTc1NjE2ZTc0Njk3NDc5MGY2NjY1NjU1Zjc0Njk2ZDY1NzI1ZjczNzQ2MTcyNzQwZjcxNzU2MTZlNzQ2OTc0Nzk1ZjY2Njk2YzZjNjU2NDEzNjM2ZjZjNmM2MTc0NjU3MjYxNmM1ZjYxNzM3MzY1NzQ1ZjY5NjQwNDE1MWY3Yzc1MGM3OTY1NzM1ZjYxNzM3MzY1NzQ1ZjY5NjQwYjZlNmY1ZjYxNzM3MzY1NzQ1ZjY5NjQxMDY2NjU2NTVmNjI2MTczNjU1ZjcwNjU3MjYzNjU2ZTc0MDEwMDBjNjE3MzczNjU3NDVmNmM2OTczNzQ2NTY0MGI2NjY1NjU1ZjYxNjQ2NDcyNjU3MzczMDQ5NTRlN2Q3MjA0MzJjZTI4MWUwNGM5MWU4OGY1MDRkYjkyMmZjMjAwMDRiYTFkZWVmNTMxMWIyMjEyNDAwMGI2MzYxYTAwODAwNDQzZGI2MmExMTI0MDAwOWEzNjFhMDAyNzExMTI0MDAwODIzNjFhMDAyNzEyMTI0MDAwNmEzNjFhMDAyNzEzMTI0MDAwNTIzNjFhMDAyNzE0MTI0MDAwM2EzNjFhMDA4MDA0MTE5ZTNjNGIxMjQwMDAxZDM2MWEwMDgwMDQyNGMzZDIzNDEyNDAwMDAxMDAzMTE5MjUxMjMxMTgyMjEzMTA0NDg4MGMxNDIzNDMzMTE5ODEwNTEyMzExODIyMTMxMDQ0ODgwYmYwMjM0MzMxMTkyMjEyMzExODIyMTMxMDQ0ODgwYmM2MjM0MzMxMTkyMjEyMzExODIyMTMxMDQ0ODgwYjg5MjM0MzMxMTkyMjEyMzExODIyMTMxMDQ0ODgwYjUzMjM0MzMxMTkyMjEyMzExODIyMTMxMDQ0ODgwYjA5MjM0MzMxMTkyMjEyMzExODIyMTIxMDQ0ODgwYWU2MjM0MzMxMTkyMjEyNDAwMDAxMDAzMTE4MjIxMjQ0ODgwMTBjMjM0MzhhMDIwMThiZmU4YmZmMGEzNTA5OGJmZThiZmYxODgxZjQwMzBkNDAwMDAzMzQwOTg5MzQwOTIzMDg4OThhMDIwMThiZmU4YmZmYTIzNTExOGJmZThiZmZhYTE1MjIwZDQwMDAwMzM0MTE4OTM0MTEyMzE2YTA4OThhMDMwMThiZmQxNjM1MDI4YmZlMTYzNTAzMjQ4YmZlMDkxNjM1MDQzNDAyMzQwM2EzMzUwMjM0MDIzNDA0YTMzNTAyMzQwMjhiZmYxNmEzMzUwMjM0MDIyMTA1MTZhMjE3ODk4YTAzMDE4YmZkMTYzNTBlOGJmZTE2MzUwZjI0OGJmZTA5MTYzNTEwMzQwZTM0MGZhMzM1MGUzNDBlMzQxMGEzMzUwZTM0MGU4YmZmMTZhMzM1MGUzNDBlMjEwNTE2ODhmZjdlMTc4OThhMDIwMThiZmU4YmZmNjUzNTAxMzUwMDM0MDE0NDM0MDA4OThhMDEwMThiZmY3MjA4MzUwNjM1MDUzNDA2NDQzNDA1ODk4YTA0MDBiMTI1YjIxMDhiZmNiMjAwOGJmZGIyMTI4YmZlYjIxMThiZmZiMjE0YjM4OThhMDQwMDhiZmM4YmZlNzAwMDM1MDgzNTA3MzQwODQwMDAwZTMyMGE4YmZmOGJmZThiZmQ4OGZmY2E0MjAwMGIzMjBhOGJmZjhiZmU4YmZjODhmZmJjODk4YTAwMDAyNzBmMjI2NzI3MDcyMjY3MjgyMjY3MjcwNTI3MTU2NzI5MjI2NzJhMjI2NzI3MDYyMjY3MjcwODIyNjcyYjIyNjcyNzA0MjI2Nzg5OGEwMDAxMjIyMzhjMDA4YjAwMjEwNDBjNDQ4OThhMDUwMTIyMzEwMDMyMDkxMjQ0MzExMDgxMDYxMjQ0MzYxYTAwMjcxMTEyNDQ4YmZiNTcwMjAwMTcyMjEyOGJmYjU3MDIwMDE3MjMxMjExNDQ4YmZkNTcwMjAwMTcyMjEyOGJmZDU3MDIwMDE3MjMxMjExNDQ4YmZjNTcwMjAwMTcyMjBkNDQ4YmZjNTcwMjAwMTcyNDBjNDQ4YmZlNTcwMjAwMTcyMjBkNDQyNzBmMjJjMDMwNjcyODMyMGQ2NzI5OGJmYjU3MDIwMDE3NjcyYjhiZmQ1NzAyMDAxNzY3MjcwNjhiZmU1NzAyMDAxNzY3MjcwODIyNjcyYThiZmM1NzAyMDAxNzY3MjcwNTIzYzAxYzY3MjcwNDhiZmY1NzAyMDAxNzY3MzIwYTIyMjg2NDI3MDk4OGZlYzMzMjBhODhmZWUxMzIwYTIyMjg2NDI3MGI4OGZlYjQzMjBhODhmZWQyMzIwYTIyMjg2NDI3MGM4OGZlYTUzMjBhODhmZWMzMjcwNzMyMDc2NzIzOGMwMDhiMDAyMTA0MGM0NDg5OGEwMTAwMzExNjIzMDgzODEwODEwNjEyNDQzMTE2MjMwODM5MWEwMDI3MTQxMjQ0MzExNjIzMDgzODE4OGJmZmMwMzIxMjQ0MzExNjgxMDIwODM4MTA4MTA2MTI0NDMxMTY4MTAyMDgzOTFhMDAyNzE2MTI0NDMxMTY4MTAyMDgzODE4Mjg2NDEyNDQzMTE2MjMwODM4MTkyMjEyNDQzMTE2ODEwMjA4MzgxOTIyMTI0NDg5OGEwNTAwOGJmYjhiZmM4YmZkOGJmZTg4ZmRjMzI4NjQyNzA5ODhmZTIyOGJmZjg4ZmU0MDg5OGEwMjAwMmE2NDhiZmUyYTg4ZmUxMThiZmUyNzA0ODhmZTBhMDkwZjQ0OGJmZTI3MDU4OGZlMDA4YmZlODhmZTBkMjg2NDI3MDk4OGZkZjQ4YmZmMmE2NDBiMjQwYThiZmYyYTY0Mjg2NDI3MGQ4OGZkZTI4OGZkNzkwOTg4ZmUxNzMyMGE4YmZmMmE2NDI4NjQyNzBkODhmZGNlMjg2NDI3MTA4OGZkYzc4OGZmOGQ4OThhMDIwMDJhNjQ4YmZlMmE4OGZkYjg4YmZlMjcwNDg4ZmRiMTA4MGU0NDhiZmUyNzA1ODhmZGE3OGJmZTg4ZmRiNDI5NjQyMjEyNDAwMDBhMjg2NDI3MGI4OGZkOTQ0MjAwMDcyODY0MjcwYzg4ZmQ4YThiZmY4OGZkYzE4OThhMDIwMDJhNjQ4YmZlMmE4OGZkNzkwODhiZmUyNzA0ODhmZDcxMDgyNDBmNDQzMjBhOGJmZjJhNjQwYjI0ODhmY2MwMjg2NDI3MDk4OGZkNWIyODY0ODhmZDY4ODhmZDc2ODk4YTAyMDAyYTY0OGJmZTJhODhmZDQ3OGJmZTI3MDQ4OGZkNDAwOTA4MjQwZTQ0MzIwYThiZmYyOTY0MjIxMjQwMDAwYTI4NjQyNzBiODhmZDI5NDIwMDA3Mjg2NDI3MGM4OGZkMWYyODY0ODhmZDJjODhmZDNhODk4YTAyMDEyMjhiZmU4OGZlN2M4YmZmMjcwNjY0MjcwODY0MDkwZTQ0MjcwNDY0MjIwZDQwMDE0ZDI3MDQ2NDIyMGQ0MDAxMzgyOTY0MjIxMjJiNjQyMzEyMTA4YmZlYzAzMjI5ODhmY2UxMjIxMjEwOGJmZWMwMzIyYjg4ZmNkNjIyMTIxMDI5NjQyMzEyMmI2NDIzMTIxMDhiZmVjMDMyMjk4OGZjYzIyMzEyMTA4YmZlYzAzMjJiODhmY2I3MjIxMjEwMTE0MDAwZWEyOTY0MjIxMjJiNjQyMjEyMTA4YmZlYzAzMjI5ODhmYzlmMjIxMjEwOGJmZWMwMzIyYjg4ZmM5NDIzMTIxMDI5NjQyMzEyMmI2NDIyMTIxMDhiZmVjMDMyMjk4OGZjODAyMzEyMTA4YmZlYzAzMjJiODhmYzc1MjMxMjEwMTE0MDAwOWMyOTY0MjIxMjJiNjQyMzEyMTA4YmZlYzAzMjI5ODhmYzVkMjMxMjEwOGJmZWMwMzIyYjg4ZmM1MjIzMTIxMDI5NjQyMzEyMmI2NDIzMTIxMDhiZmVjMDMyMjk4OGZjM2UyMjEyMTA4YmZlYzAzMjJiODhmYzMzMjMxMjEwMTE0MDAwNGUyOTY0MjIxMjJiNjQyMjEyMTA4YmZlYzAzMjI5ODhmYzFiMjMxMjEwOGJmZWMwMzIyYjg4ZmMxMDIyMTIxMDI5NjQyMzEyMmI2NDIyMTIxMDhiZmVjMDMyMjk4OGZiZmMyMjEyMTA4YmZlYzAzMjJiODhmYmYxMjIxMjEwMTE0MTAwNWE4YmZlYzAzMjhiZmY4OGZlOGY0MjAwNGU4YmZlYzAzMjhiZmY4OGZlNTE0MjAwNDI4YmZlYzAzMjhiZmY4OGZlMDY0MjAwMzY4YmZlYzAzMjhiZmY4OGZkYTE0MjAwMmEzMjA3MjcwNzY0ODE3ODA4MGM0NDQyZmViYjhiZmVjMDMyMjcwNDg4ZmJhNDIyMGQyNzA3NjQ4YmZlYzAzMjI3MDc4OGZiOTYwZTEwNDQ0MmZlOTYyNzA4MjcwODY0OGJmZjA4NjcyMzhjMDA4YjAwMjEwNDBjNDQ4OThhMDEwMDMxMTYyMzA5MzgxMDgxMDYxMjQ0MzExNjIzMDkzOTFhMDAyNzEyMTI0NDMxMTYyMzA5MzgxODhiZmYxMjQ0MzExNjIzMDgzODEwODEwNjEyNDQzMTE2MjMwODM5MWEwMDI3MTYxMjQ0MzExNjIzMDgzODE4Mjg2NDEyNDQzMTE2MjMwOTM5MWEwMjE3MjcwNjY0MjcwODY0MDkwZTQ0MzExNjIzMDkzODE5MjIxMjQ0MzExNjIzMDgzODE5MjIxMjQ0ODk4YTAyMDAyYTY0MjcwNDY0MDg4YmZlMmE4OGZiMDkwZjQ0OGJmZTI3MDU4OGZiMDA4YmZlODhmYjBkMjg2NDI3MDk4OGZhZjQ4YmZmOGJmZTJhODhmYWVjMGIyNDBhODhmYjIyMzIwYThiZmY4YmZlMmE4OGZhZGMyODY0MjcwZDg4ZmFkNTI4NjQyNzEwODhmYWNlODhmYzk0ODk4YTAyMDAyYTY0MjcwNDY0MDk4YmZlMmE4OGZhYmIwZTQ0OGJmZTI3MDU4OGZhYjI4YmZlODhmYWJmMjk2NDIyMTI0MDAwMGEyODY0MjcwYjg4ZmE5ZjQyMDAwNzI4NjQyNzBjODhmYTk1OGJmZjg4ZmFjYzg5OGEwMjAwMmE2NDhiZmUyYTg4ZmE4NDA4MjcwNDY0MDgyNDBmNDQyYTY0MjcwNDY0MDgyNDhiZmUyYTg4ZmE2ZjA5MGQ0MDAwMGIyYTY0MjcwNDY0MDgzNTEyNDIwMDBhMjQ4YmZlMmE4OGZhIC8vIDB4MDgyMDA2MDAwMWMwODQzZDA0ODAwMjgwODA5MGJiYmFkNmFkZjAwZDI2MTcwZDZkNjE3MjZiNjU3NDVmNjE3MDcwNWY2OTY0MDg3MDZmNzM2OTc0Njk2ZjZlMDU3MDcyNjk2MzY1MDQ3MzY5NjQ2NTA4NzM2YzY5NzA3MDYxNjc2NTA1NmY3NzZlNjU3MjA4NzE3NTYxNmU3NDY5NzQ3OTBmNjY2NTY1NWY3NDY5NmQ2NTcyNWY3Mzc0NjE3Mjc0MGY3MTc1NjE2ZTc0Njk3NDc5NWY2NjY5NmM2YzY1NjQxMzYzNmY2YzZjNjE3NDY1NzI2MTZjNWY2MTczNzM2NTc0NWY2OTY0MDQxNTFmN2M3NTBjNzk2NTczNWY2MTczNzM2NTc0NWY2OTY0MGI2ZTZmNWY2MTczNzM2NTc0NWY2OTY0MTA2NjY1NjU1ZjYyNjE3MzY1NWY3MDY1NzI2MzY1NmU3NDAxMDAwYzYxNzM3MzY1NzQ1ZjZjNjk3Mzc0NjU2NDBiNjY2NTY1NWY2MTY0NjQ3MjY1NzM3MzA0OTU0ZTdkNzIwNDMyY2UyODFlMDRjOTFlODhmNTA0ZGI5MjJmYzIwMDA0YmExZGVlZjUzMTFiMjIxMjQwMDBiNjM2MWEwMDgwMDQ0M2RiNjJhMTEyNDAwMDlhMzYxYTAwMjcxMTEyNDAwMDgyMzYxYTAwMjcxMjEyNDAwMDZhMzYxYTAwMjcxMzEyNDAwMDUyMzYxYTAwMjcxNDEyNDAwMDNhMzYxYTAwODAwNDExOWUzYzRiMTI0MDAwMWQzNjFhMDA4MDA0MjRjM2QyMzQxMjQwMDAwMTAwMzExOTI1MTIzMTE4MjIxMzEwNDQ4ODBjMTQyMzQzMzExOTgxMDUxMjMxMTgyMjEzMTA0NDg4MGJmMDIzNDMzMTE5MjIxMjMxMTgyMjEzMTA0NDg4MGJjNjIzNDMzMTE5MjIxMjMxMTgyMjEzMTA0NDg4MGI4OTIzNDMzMTE5MjIxMjMxMTgyMjEzMTA0NDg4MGI1MzIzNDMzMTE5MjIxMjMxMTgyMjEzMTA0NDg4MGIwOTIzNDMzMTE5MjIxMjMxMTgyMjEyMTA0NDg4MGFlNjIzNDMzMTE5MjIxMjQwMDAwMTAwMzExODIyMTI0NDg4MDEwYzIzNDM4YTAyMDE4YmZlOGJmZjBhMzUwOThiZmU4YmZmMTg4MWY0MDMwZDQwMDAwMzM0MDk4OTM0MDkyMzA4ODk4YTAyMDE4YmZlOGJmZmEyMzUxMThiZmU4YmZmYWExNTIyMGQ0MDAwMDMzNDExODkzNDExMjMxNmEwODk4YTAzMDE4YmZkMTYzNTAyOGJmZTE2MzUwMzI0OGJmZTA5MTYzNTA0MzQwMjM0MDNhMzM1MDIzNDAyMzQwNGEzMzUwMjM0MDI4YmZmMTZhMzM1MDIzNDAyMjEwNTE2YTIxNzg5OGEwMzAxOGJmZDE2MzUwZThiZmUxNjM1MGYyNDhiZmUwOTE2MzUxMDM0MGUzNDBmYTMzNTBlMzQwZTM0MTBhMzM1MGUzNDBlOGJmZjE2YTMzNTBlMzQwZTIxMDUxNjg4ZmY3ZTE3ODk4YTAyMDE4YmZlOGJmZjY1MzUwMTM1MDAzNDAxNDQzNDAwODk4YTAxMDE4YmZmNzIwODM1MDYzNTA1MzQwNjQ0MzQwNTg5OGEwNDAwYjEyNWIyMTA4YmZjYjIwMDhiZmRiMjEyOGJmZWIyMTE4YmZmYjIxNGIzODk4YTA0MDA4YmZjOGJmZTcwMDAzNTA4MzUwNzM0MDg0MDAwMGUzMjBhOGJmZjhiZmU4YmZkODhmZmNhNDIwMDBiMzIwYThiZmY4YmZlOGJmYzg4ZmZiYzg5OGEwMDAwMjcwZjIyNjcyNzA3MjI2NzI4MjI2NzI3MDUyNzE1NjcyOTIyNjcyYTIyNjcyNzA2MjI2NzI3MDgyMjY3MmIyMjY3MjcwNDIyNjc4OThhMDAwMTIyMjM4YzAwOGIwMDIxMDQwYzQ0ODk4YTA1MDEyMjMxMDAzMjA5MTI0NDMxMTA4MTA2MTI0NDM2MWEwMDI3MTExMjQ0OGJmYjU3MDIwMDE3MjIxMjhiZmI1NzAyMDAxNzIzMTIxMTQ0OGJmZDU3MDIwMDE3MjIxMjhiZmQ1NzAyMDAxNzIzMTIxMTQ0OGJmYzU3MDIwMDE3MjIwZDQ0OGJmYzU3MDIwMDE3MjQwYzQ0OGJmZTU3MDIwMDE3MjIwZDQ0MjcwZjIyYzAzMDY3MjgzMjBkNjcyOThiZmI1NzAyMDAxNzY3MmI4YmZkNTcwMjAwMTc2NzI3MDY4YmZlNTcwMjAwMTc2NzI3MDgyMjY3MmE4YmZjNTcwMjAwMTc2NzI3MDUyM2MwMWM2NzI3MDQ4YmZmNTcwMjAwMTc2NzMyMGEyMjI4NjQyNzA5ODhmZWMzMzIwYTg4ZmVlMTMyMGEyMjI4NjQyNzBiODhmZWI0MzIwYTg4ZmVkMjMyMGEyMjI4NjQyNzBjODhmZWE1MzIwYTg4ZmVjMzI3MDczMjA3NjcyMzhjMDA4YjAwMjEwNDBjNDQ4OThhMDEwMDMxMTYyMzA4MzgxMDgxMDYxMjQ0MzExNjIzMDgzOTFhMDAyNzE0MTI0NDMxMTYyMzA4MzgxODhiZmZjMDMyMTI0NDMxMTY4MTAyMDgzODEwODEwNjEyNDQzMTE2ODEwMjA4MzkxYTAwMjcxNjEyNDQzMTE2ODEwMjA4MzgxODI4NjQxMjQ0MzExNjIzMDgzODE5MjIxMjQ0MzExNjgxMDIwODM4MTkyMjEyNDQ4OThhMDUwMDhiZmI4YmZjOGJmZDhiZmU4OGZkYzMyODY0MjcwOTg4ZmUyMjhiZmY4OGZlNDA4OThhMDIwMDJhNjQ4YmZlMmE4OGZlMTE4YmZlMjcwNDg4ZmUwYTA5MGY0NDhiZmUyNzA1ODhmZTAwOGJmZTg4ZmUwZDI4NjQyNzA5ODhmZGY0OGJmZjJhNjQwYjI0MGE4YmZmMmE2NDI4NjQyNzBkODhmZGUyODhmZDc5MDk4OGZlMTczMjBhOGJmZjJhNjQyODY0MjcwZDg4ZmRjZTI4NjQyNzEwODhmZGM3ODhmZjhkODk4YTAyMDAyYTY0OGJmZTJhODhmZGI4OGJmZTI3MDQ4OGZkYjEwODBlNDQ4YmZlMjcwNTg4ZmRhNzhiZmU4OGZkYjQyOTY0MjIxMjQwMDAwYTI4NjQyNzBiODhmZDk0NDIwMDA3Mjg2NDI3MGM4OGZkOGE4YmZmODhmZGMxODk4YTAyMDAyYTY0OGJmZTJhODhmZDc5MDg4YmZlMjcwNDg4ZmQ3MTA4MjQwZjQ0MzIwYThiZmYyYTY0MGIyNDg4ZmNjMDI4NjQyNzA5ODhmZDViMjg2NDg4ZmQ2ODg4ZmQ3Njg5OGEwMjAwMmE2NDhiZmUyYTg4ZmQ0NzhiZmUyNzA0ODhmZDQwMDkwODI0MGU0NDMyMGE4YmZmMjk2NDIyMTI0MDAwMGEyODY0MjcwYjg4ZmQyOTQyMDAwNzI4NjQyNzBjODhmZDFmMjg2NDg4ZmQyYzg4ZmQzYTg5OGEwMjAxMjI4YmZlODhmZTdjOGJmZjI3MDY2NDI3MDg2NDA5MGU0NDI3MDQ2NDIyMGQ0MDAxNGQyNzA0NjQyMjBkNDAwMTM4Mjk2NDIyMTIyYjY0MjMxMjEwOGJmZWMwMzIyOTg4ZmNlMTIyMTIxMDhiZmVjMDMyMmI4OGZjZDYyMjEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZlYzAzMjI5ODhmY2MyMjMxMjEwOGJmZWMwMzIyYjg4ZmNiNzIyMTIxMDExNDAwMGVhMjk2NDIyMTIyYjY0MjIxMjEwOGJmZWMwMzIyOTg4ZmM5ZjIyMTIxMDhiZmVjMDMyMmI4OGZjOTQyMzEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZlYzAzMjI5ODhmYzgwMjMxMjEwOGJmZWMwMzIyYjg4ZmM3NTIzMTIxMDExNDAwMDljMjk2NDIyMTIyYjY0MjMxMjEwOGJmZWMwMzIyOTg4ZmM1ZDIzMTIxMDhiZmVjMDMyMmI4OGZjNTIyMzEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZlYzAzMjI5ODhmYzNlMjIxMjEwOGJmZWMwMzIyYjg4ZmMzMzIzMTIxMDExNDAwMDRlMjk2NDIyMTIyYjY0MjIxMjEwOGJmZWMwMzIyOTg4ZmMxYjIzMTIxMDhiZmVjMDMyMmI4OGZjMTAyMjEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZlYzAzMjI5ODhmYmZjMjIxMjEwOGJmZWMwMzIyYjg4ZmJmMTIyMTIxMDExNDEwMDVhOGJmZWMwMzI4YmZmODhmZThmNDIwMDRlOGJmZWMwMzI4YmZmODhmZTUxNDIwMDQyOGJmZWMwMzI4YmZmODhmZTA2NDIwMDM2OGJmZWMwMzI4YmZmODhmZGExNDIwMDJhMzIwNzI3MDc2NDgxNzgwODBjNDQ0MmZlYmI4YmZlYzAzMjI3MDQ4OGZiYTQyMjBkMjcwNzY0OGJmZWMwMzIyNzA3ODhmYjk2MGUxMDQ0NDJmZTk2MjcwODI3MDg2NDhiZmYwODY3MjM4YzAwOGIwMDIxMDQwYzQ0ODk4YTAxMDAzMTE2MjMwOTM4MTA4MTA2MTI0NDMxMTYyMzA5MzkxYTAwMjcxMjEyNDQzMTE2MjMwOTM4MTg4YmZmMTI0NDMxMTYyMzA4MzgxMDgxMDYxMjQ0MzExNjIzMDgzOTFhMDAyNzE2MTI0NDMxMTYyMzA4MzgxODI4NjQxMjQ0MzExNjIzMDkzOTFhMDIxNzI3MDY2NDI3MDg2NDA5MGU0NDMxMTYyMzA5MzgxOTIyMTI0NDMxMTYyMzA4MzgxOTIyMTI0NDg5OGEwMjAwMmE2NDI3MDQ2NDA4OGJmZTJhODhmYjA5MGY0NDhiZmUyNzA1ODhmYjAwOGJmZTg4ZmIwZDI4NjQyNzA5ODhmYWY0OGJmZjhiZmUyYTg4ZmFlYzBiMjQwYTg4ZmIyMjMyMGE4YmZmOGJmZTJhODhmYWRjMjg2NDI3MGQ4OGZhZDUyODY0MjcxMDg4ZmFjZTg4ZmM5NDg5OGEwMjAwMmE2NDI3MDQ2NDA5OGJmZTJhODhmYWJiMGU0NDhiZmUyNzA1ODhmYWIyOGJmZTg4ZmFiZjI5NjQyMjEyNDAwMDBhMjg2NDI3MGI4OGZhOWY0MjAwMDcyODY0MjcwYzg4ZmE5NThiZmY4OGZhY2M4OThhMDIwMDJhNjQ4YmZlMmE4OGZhODQwODI3MDQ2NDA4MjQwZjQ0MmE2NDI3MDQ2NDA4MjQ4YmZlMmE4OGZhNmYwOTBkNDAwMDBiMmE2NDI3MDQ2NDA4MzUxMjQyMDAwYTI0OGJmZTJhODhmYQppdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCnB1c2hieXRlcyAweDU4MDkzNTEyMzIwYThiZmYzNDEyMGIyNDg4ZjlhODI4NjQyNzA5ODhmYTQzMjg2NDg4ZmE1MDg4ZmE1ZTMyMGE4YmZmMzQxMjI4NjQyNzBkODhmYTJlMjg2NDI3MTA4OGZhMjc4OGZiZWQ4OThhMDIwMDJhNjQ4YmZlMmE4OGZhMTgwODI3MDQ2NDA5MjQwZTQ0MmE2NDI3MDQ2NDA5MjQ4YmZlMmE4OGZhMDMwOTBjNDAwMDI5MjQ4YmZlMmE4OGY5ZjcwOTM1MTMzMjBhOGJmZjI5NjQyMjEyNDAwMDBhMjg2NDI3MGI4OGY5ZTI0MjAwMTUyODY0MjcwYzg4ZjlkODQyMDAwYjJhNjQyNzA0NjQwOTM1MTM0MmZmZDYyODY0ODhmOWQ3ODhmOWU1ODk4YTAzMDEyMjMxMTA4MTA2MTI0NDM2MWEwMDI3MTMxMjQ0MzEwMDI3MDU2NDEyNDQyNzA4NjQyMjEyNDQ4YmZkMjIwZDQ0OGJmZDI0MGM0NDhiZmUyMjBkNDQ4YmZkMmE2NDEzOGJmZTI3MDY2NDEzMTE4YmZmMjcwNDY0MTMxMTQ0MmI2NDIzMTI0MDAwNmMyNzBmNjQzNTBkOGJmZTI3MDY2NDBkNDAwMDFkMjcwNjY0OGJmZTA5MzUwYzM0MGMyMjBkNDEwMGZhMzIwYTM0MGMzNDBkMzEwMDg4Zjk3NDQyMDBlYzhiZmUyNzA2NjQwOTM1MGMzMTE2MjIwZDQ0MzExNjIzMDkzODEwMjUxMjQ0MzExNjIzMDkzODAwMzEwMDEyNDQzMTE2MjMwOTM4MTQzMjBhMTI0NDMxMTYyMzA5MzgxMTM0MGQxMjQ0MzExNjIzMDkzODEyMzQwYzEyNDQ0MjAwYWIyNzA2NjQyYTY0MjcwNDY0MDgwYjI0MGEyNzA2NjQyYTY0MjcwNDY0MDgyODY0MjcwZDg4ZjhmMTg4ZjhiYTA4MzUwYThiZmU4YmZkOGJmZjA4MGIyNDBhOGJmZThiZmQ4YmZmMDgyODY0MjcwZDg4ZjhkMzg4Zjg5YzA4MzUwYjM0MGIzNDBhMGQ0MDAwMjEzNDBhMzQwYjA5MzUwYzM0MGMyMjBkNDEwMDU1MzIwYTM0MGMyODY0MjcwOTg4ZjhhYzMxMDA4OGY4Y2E0MjAwNDIzNDBiMzQwYTA5MzUwYzMxMTYyMjBkNDQzMTE2MjMwOTM4MTAyNTEyNDQzMTE2MjMwOTM4MDAzMTAwMTI0NDMxMTYyMzA5MzgxNDMyMGExMjQ0MzExNjIzMDkzODExMjg2NDI3MDk4OGY4NmUxMjQ0MzExNjIzMDkzODEyMzQwYzEyNDQyYThiZmQ2NzI3MDY4YmZlNjcyNzA0OGJmZjY3MjcwNzMyMDc2NzIzOGMwMDhiMDAyMTA0MGM0NDg5OGEwMTAxMjI4YmZmYzAzMjg4ZmNiZDhiZmZjMDMyMjcwNDg4ZjgzMTIyMGQ0MDAxNjUyNzA0NjQyMjBkNDAwMTUwMjk2NDIyMTIyYjY0MjMxMjEwOGJmZmMwMzIyOTg4ZjgxMzIyMTIxMDhiZmZjMDMyMmI4OGY4MDgyMjEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZmYzAzMjI5ODhmN2Y0MjMxMjEwOGJmZmMwMzIyYjg4ZjdlOTIyMTIxMDExNDAwMGZjMjk2NDIyMTIyYjY0MjIxMjEwOGJmZmMwMzIyOTg4ZjdkMTIyMTIxMDhiZmZjMDMyMmI4OGY3YzYyMzEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZmYzAzMjI5ODhmN2IyMjMxMjEwOGJmZmMwMzIyYjg4ZjdhNzIzMTIxMDExNDAwMGE4Mjk2NDIyMTIyYjY0MjMxMjEwOGJmZmMwMzIyOTg4Zjc4ZjIzMTIxMDhiZmZjMDMyMmI4OGY3ODQyMzEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZmYzAzMjI5ODhmNzcwMjIxMjEwOGJmZmMwMzIyYjg4Zjc2NTIzMTIxMDExNDAwMDU0Mjk2NDIyMTIyYjY0MjIxMjEwOGJmZmMwMzIyOTg4Zjc0ZDIzMTIxMDhiZmZjMDMyMmI4OGY3NDIyMjEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZmYzAzMjI5ODhmNzJlMjIxMjEwOGJmZmMwMzIyYjg4ZjcyMzIyMTIxMDExNDEwMDZjOGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmY2VhNDIwMDVhOGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYzZjNDIwMDQ4OGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYzFmNDIwMDM2OGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYmJmNDIwMDI0MzIwNzI3MDc2NDgxNzgwODBjNDQ0MmZlYTMyNzA0NjQyMjBkOGJmZmMwMzIyNzA3ODhmNmI5MjcwNzY0MGUxMDQ0NDJmZTg0MjcwODI3MDg2NDMxMTYyMzA5MzkxYTAyMTcwODY3MjM4YzAwODk4YTAwMDEyMjMxMDAzMjA5MTIzMTAwMjg2NDgwMTU2NTczNjM3MjZmNzc1ZjYzNjE2ZTYzNjU2YzVmNjE2NDY0NzI2NTczNzM4OGY2NzYxMjExNDRiMTI1YjIxMDI4NjQyNzA5ODhmNjY4YjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTI1YjIxMDI4NjQyNzBiODhmNjRhYjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTI1YjIxMDI4NjQyNzBjODhmNjJjYjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTIzYjIxMDIyYjIwODI3MDU2NGIyMDcyMmIyMDEyNzA1NjRiMjA5YjMyMzhjMDA4YjAwMjEwNDBjNDQ4OThhMDAwMTIyMzEwMDI4NjQ4MDEyNmQ2MTcyNmI2NTc0NWY2NjcyNjk2NTZlNjQ1ZjYxNjQ2NDcyODhmNWRiMTIzMjA0MjMxMjEwNDQyMzhjMDA4OThhMDAwMDIyODhmNjVhOGMwMDI3MGEyNzBlMjI4YjAwNTY1MGIwODk4YTAwMDAyMjI3MTU0NzA0MzYxYTAxOGMwMTM2MWEwMjhjMDIzNjFhMDM4YzAzMzYxYTA0OGMwNDM2MWEwNThjMDU4YjAxOGIwMjhiMDM4YjA0OGIwNTg4ZjYyZDhjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI0NzAyMzYxYTAxMjI1NThjMDEzNjFhMDIxNzhjMDI4YjAxOGIwMjg4Zjg1MThjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI0NzAzMzYxYTAxMTc4YzAxMzYxYTAyMTc4YzAyMzYxYTAzMTc4YzAzOGIwMThiMDI4YjAzODhmYjc4OGMwMDI3MGEyNzBlMjI4YjAwNTY1MGIwODk4YTAwMDAyMjQ5MzYxYTAxMjI1NThjMDE4YjAxODhmY2Q2OGMwMDI3MGE4YjAwMTY1MGIwODk4YTAwMDAyMjg4ZmU2ZDhjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI4OGZlZmM4YzAwMjcwYThiMDAxNjUwYjA4OSAvLyAweDU4MDkzNTEyMzIwYThiZmYzNDEyMGIyNDg4ZjlhODI4NjQyNzA5ODhmYTQzMjg2NDg4ZmE1MDg4ZmE1ZTMyMGE4YmZmMzQxMjI4NjQyNzBkODhmYTJlMjg2NDI3MTA4OGZhMjc4OGZiZWQ4OThhMDIwMDJhNjQ4YmZlMmE4OGZhMTgwODI3MDQ2NDA5MjQwZTQ0MmE2NDI3MDQ2NDA5MjQ4YmZlMmE4OGZhMDMwOTBjNDAwMDI5MjQ4YmZlMmE4OGY5ZjcwOTM1MTMzMjBhOGJmZjI5NjQyMjEyNDAwMDBhMjg2NDI3MGI4OGY5ZTI0MjAwMTUyODY0MjcwYzg4ZjlkODQyMDAwYjJhNjQyNzA0NjQwOTM1MTM0MmZmZDYyODY0ODhmOWQ3ODhmOWU1ODk4YTAzMDEyMjMxMTA4MTA2MTI0NDM2MWEwMDI3MTMxMjQ0MzEwMDI3MDU2NDEyNDQyNzA4NjQyMjEyNDQ4YmZkMjIwZDQ0OGJmZDI0MGM0NDhiZmUyMjBkNDQ4YmZkMmE2NDEzOGJmZTI3MDY2NDEzMTE4YmZmMjcwNDY0MTMxMTQ0MmI2NDIzMTI0MDAwNmMyNzBmNjQzNTBkOGJmZTI3MDY2NDBkNDAwMDFkMjcwNjY0OGJmZTA5MzUwYzM0MGMyMjBkNDEwMGZhMzIwYTM0MGMzNDBkMzEwMDg4Zjk3NDQyMDBlYzhiZmUyNzA2NjQwOTM1MGMzMTE2MjIwZDQ0MzExNjIzMDkzODEwMjUxMjQ0MzExNjIzMDkzODAwMzEwMDEyNDQzMTE2MjMwOTM4MTQzMjBhMTI0NDMxMTYyMzA5MzgxMTM0MGQxMjQ0MzExNjIzMDkzODEyMzQwYzEyNDQ0MjAwYWIyNzA2NjQyYTY0MjcwNDY0MDgwYjI0MGEyNzA2NjQyYTY0MjcwNDY0MDgyODY0MjcwZDg4ZjhmMTg4ZjhiYTA4MzUwYThiZmU4YmZkOGJmZjA4MGIyNDBhOGJmZThiZmQ4YmZmMDgyODY0MjcwZDg4ZjhkMzg4Zjg5YzA4MzUwYjM0MGIzNDBhMGQ0MDAwMjEzNDBhMzQwYjA5MzUwYzM0MGMyMjBkNDEwMDU1MzIwYTM0MGMyODY0MjcwOTg4ZjhhYzMxMDA4OGY4Y2E0MjAwNDIzNDBiMzQwYTA5MzUwYzMxMTYyMjBkNDQzMTE2MjMwOTM4MTAyNTEyNDQzMTE2MjMwOTM4MDAzMTAwMTI0NDMxMTYyMzA5MzgxNDMyMGExMjQ0MzExNjIzMDkzODExMjg2NDI3MDk4OGY4NmUxMjQ0MzExNjIzMDkzODEyMzQwYzEyNDQyYThiZmQ2NzI3MDY4YmZlNjcyNzA0OGJmZjY3MjcwNzMyMDc2NzIzOGMwMDhiMDAyMTA0MGM0NDg5OGEwMTAxMjI4YmZmYzAzMjg4ZmNiZDhiZmZjMDMyMjcwNDg4ZjgzMTIyMGQ0MDAxNjUyNzA0NjQyMjBkNDAwMTUwMjk2NDIyMTIyYjY0MjMxMjEwOGJmZmMwMzIyOTg4ZjgxMzIyMTIxMDhiZmZjMDMyMmI4OGY4MDgyMjEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZmYzAzMjI5ODhmN2Y0MjMxMjEwOGJmZmMwMzIyYjg4ZjdlOTIyMTIxMDExNDAwMGZjMjk2NDIyMTIyYjY0MjIxMjEwOGJmZmMwMzIyOTg4ZjdkMTIyMTIxMDhiZmZjMDMyMmI4OGY3YzYyMzEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZmYzAzMjI5ODhmN2IyMjMxMjEwOGJmZmMwMzIyYjg4ZjdhNzIzMTIxMDExNDAwMGE4Mjk2NDIyMTIyYjY0MjMxMjEwOGJmZmMwMzIyOTg4Zjc4ZjIzMTIxMDhiZmZjMDMyMmI4OGY3ODQyMzEyMTAyOTY0MjMxMjJiNjQyMzEyMTA4YmZmYzAzMjI5ODhmNzcwMjIxMjEwOGJmZmMwMzIyYjg4Zjc2NTIzMTIxMDExNDAwMDU0Mjk2NDIyMTIyYjY0MjIxMjEwOGJmZmMwMzIyOTg4Zjc0ZDIzMTIxMDhiZmZjMDMyMmI4OGY3NDIyMjEyMTAyOTY0MjMxMjJiNjQyMjEyMTA4YmZmYzAzMjI5ODhmNzJlMjIxMjEwOGJmZmMwMzIyYjg4ZjcyMzIyMTIxMDExNDEwMDZjOGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmY2VhNDIwMDVhOGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYzZjNDIwMDQ4OGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYzFmNDIwMDM2OGJmZmMwMzIzMTE2MjMwOTM5MWEwMjE3ODhmYmJmNDIwMDI0MzIwNzI3MDc2NDgxNzgwODBjNDQ0MmZlYTMyNzA0NjQyMjBkOGJmZmMwMzIyNzA3ODhmNmI5MjcwNzY0MGUxMDQ0NDJmZTg0MjcwODI3MDg2NDMxMTYyMzA5MzkxYTAyMTcwODY3MjM4YzAwODk4YTAwMDEyMjMxMDAzMjA5MTIzMTAwMjg2NDgwMTU2NTczNjM3MjZmNzc1ZjYzNjE2ZTYzNjU2YzVmNjE2NDY0NzI2NTczNzM4OGY2NzYxMjExNDRiMTI1YjIxMDI4NjQyNzA5ODhmNjY4YjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTI1YjIxMDI4NjQyNzBiODhmNjRhYjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTI1YjIxMDI4NjQyNzBjODhmNjJjYjIxMTI3MDU2NGIyMTQyMmIyMDEyMmIyMTIyNzA1NjRiMjE1YjNiMTIzYjIxMDIyYjIwODI3MDU2NGIyMDcyMmIyMDEyNzA1NjRiMjA5YjMyMzhjMDA4YjAwMjEwNDBjNDQ4OThhMDAwMTIyMzEwMDI4NjQ4MDEyNmQ2MTcyNmI2NTc0NWY2NjcyNjk2NTZlNjQ1ZjYxNjQ2NDcyODhmNWRiMTIzMjA0MjMxMjEwNDQyMzhjMDA4OThhMDAwMDIyODhmNjVhOGMwMDI3MGEyNzBlMjI4YjAwNTY1MGIwODk4YTAwMDAyMjI3MTU0NzA0MzYxYTAxOGMwMTM2MWEwMjhjMDIzNjFhMDM4YzAzMzYxYTA0OGMwNDM2MWEwNThjMDU4YjAxOGIwMjhiMDM4YjA0OGIwNTg4ZjYyZDhjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI0NzAyMzYxYTAxMjI1NThjMDEzNjFhMDIxNzhjMDI4YjAxOGIwMjg4Zjg1MThjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI0NzAzMzYxYTAxMTc4YzAxMzYxYTAyMTc4YzAyMzYxYTAzMTc4YzAzOGIwMThiMDI4YjAzODhmYjc4OGMwMDI3MGEyNzBlMjI4YjAwNTY1MGIwODk4YTAwMDAyMjQ5MzYxYTAxMjI1NThjMDE4YjAxODhmY2Q2OGMwMDI3MGE4YjAwMTY1MGIwODk4YTAwMDAyMjg4ZmU2ZDhjMDAyNzBhMjcwZTIyOGIwMDU2NTBiMDg5OGEwMDAwMjI4OGZlZmM4YzAwMjcwYThiMDAxNjUwYjA4OQppdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCnB1c2hieXRlcyAweDA4ODEwMDQzIC8vIDB4MDg4MTAwNDMKaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCmludGNfMCAvLyAxCml0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKaW50Y18wIC8vIDEKaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKcHVzaGludCA5IC8vIDkKaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50Cml0eG5fc3VibWl0Cml0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKc3RvcmUgMTMKbG9hZCAxMwpmcmFtZV9idXJ5IDAKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKYnl0ZWNfMyAvLyAieWVzX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAo9PQpibnogY3JlYXRlZXNjcm93XzE0X2w0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0CmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAo9PQpibnogY3JlYXRlZXNjcm93XzE0X2wzCnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKZnJhbWVfZGlnIC0zCmZyYW1lX2RpZyAtNApmcmFtZV9kaWcgLTIKKwoqCmludGMgNCAvLyAxMDAwMDAwCi8KZnJhbWVfZGlnIC0zCmZyYW1lX2RpZyAtNApmcmFtZV9kaWcgLTIKKwpieXRlYyAxNSAvLyAiZmVlX2Jhc2VfcGVyY2VudCIKYXBwX2dsb2JhbF9nZXQKY2FsbHN1YiBjYWxjdWxhdGVmZWVjb21taXRfMgorCj09CmFzc2VydApsb2FkIDEzCmZyYW1lX2RpZyAtNApmcmFtZV9kaWcgLTIKZnJhbWVfZGlnIC0zCmZyYW1lX2RpZyAtMQppbnRjXzAgLy8gMQpieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldApjYWxsc3ViIHNldHVwZXNjcm93XzEzCmIgY3JlYXRlZXNjcm93XzE0X2w1CmNyZWF0ZWVzY3Jvd18xNF9sMzoKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudApmcmFtZV9kaWcgLTMKPT0KYXNzZXJ0CmxvYWQgMTMKZnJhbWVfZGlnIC00CmZyYW1lX2RpZyAtMgp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50CmludGNfMSAvLyAwCmludGNfMSAvLyAwCmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldApjYWxsc3ViIHNldHVwZXNjcm93XzEzCmIgY3JlYXRlZXNjcm93XzE0X2w1CmNyZWF0ZWVzY3Jvd18xNF9sNDoKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudApmcmFtZV9kaWcgLTMKPT0KYXNzZXJ0CmxvYWQgMTMKZnJhbWVfZGlnIC00CmZyYW1lX2RpZyAtMgp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50CmludGNfMCAvLyAxCmludGNfMSAvLyAwCmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKY2FsbHN1YiBzZXR1cGVzY3Jvd18xMwpjcmVhdGVlc2Nyb3dfMTRfbDU6CnJldHN1YgoKLy8gYWN0aXZhdGVfbWFya2V0CmFjdGl2YXRlbWFya2V0XzE1Ogpwcm90byAwIDEKaW50Y18xIC8vIDAKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECmNhbGxzdWIgaXRvYV8xMgpzdG9yZSAxNApieXRlYyAxNCAvLyAiaXNfYWN0aXZhdGVkIgphcHBfZ2xvYmFsX2dldAppbnRjXzEgLy8gMAo9PQphc3NlcnQKaXR4bl9iZWdpbgpwdXNoaW50IDMgLy8gYWNmZwppdHhuX2ZpZWxkIFR5cGVFbnVtCmJ5dGVjIDIzIC8vICJBbHBoYSBNYXJrZXQgIgpsb2FkIDE0CmNvbmNhdApwdXNoYnl0ZXMgMHgyMDU5NjU3MyAvLyAiIFllcyIKY29uY2F0Cml0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCmJ5dGVjIDI0IC8vICJodHRwczovL3d3dy5hbHBoYWFyY2FkZS5jb20vbWFya2V0LyIKbG9hZCAxNApjb25jYXQKaXR4bl9maWVsZCBDb25maWdBc3NldFVSTApwdXNoaW50IDYgLy8gNgppdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKaW50YyA2IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1Cml0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbApnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwppdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgpwdXNoYnl0ZXMgMHg0MTRjNTA0ODQxMmQ1OSAvLyAiQUxQSEEtWSIKaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCml0eG5fc3VibWl0CmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKaXR4biBDcmVhdGVkQXNzZXRJRAphcHBfZ2xvYmFsX3B1dAppdHhuX2JlZ2luCnB1c2hpbnQgMyAvLyBhY2ZnCml0eG5fZmllbGQgVHlwZUVudW0KYnl0ZWMgMjMgLy8gIkFscGhhIE1hcmtldCAiCmxvYWQgMTQKY29uY2F0CnB1c2hieXRlcyAweDIwNGU2ZiAvLyAiIE5vIgpjb25jYXQKaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKYnl0ZWMgMjQgLy8gImh0dHBzOi8vd3d3LmFscGhhYXJjYWRlLmNvbS9tYXJrZXQvIgpsb2FkIDE0CmNvbmNhdAppdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VVJMCnB1c2hpbnQgNiAvLyA2Cml0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwppbnRjIDYgLy8gMTg0NDY3NDQwNzM3MDk1NTE2MTUKaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCml0eG5fZmllbGQgQ29uZmlnQXNzZXRNYW5hZ2VyCnB1c2hieXRlcyAweDQxNGM1MDQ4NDEyZDRlIC8vICJBTFBIQS1OIgppdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKaXR4bl9zdWJtaXQKYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCml0eG4gQ3JlYXRlZEFzc2V0SUQKYXBwX2dsb2JhbF9wdXQKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKaW50Y18xIC8vIDAKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKY2FsbHN1YiBzZW5kYXNzZXRfNgpieXRlYyAxNCAvLyAiaXNfYWN0aXZhdGVkIgppbnRjXzAgLy8gMQphcHBfZ2xvYmFsX3B1dApieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgppbnRjXzEgLy8gMAphcHBfZ2xvYmFsX3B1dApieXRlY18yIC8vICJub19zdXBwbHkiCmludGNfMSAvLyAwCmFwcF9nbG9iYWxfcHV0CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMAppbnRjXzMgLy8gMjU2CjwKYXNzZXJ0CnJldHN1YgoKLy8gdmFsaWRhdGVfbWF0Y2hfZ3JvdXBfc3RydWN0dXJlCnZhbGlkYXRlbWF0Y2hncm91cHN0cnVjdHVyZV8xNjoKcHJvdG8gMiAwCmJ5dGVjIDE0IC8vICJpc19hY3RpdmF0ZWQiCmFwcF9nbG9iYWxfZ2V0CmludGNfMCAvLyAxCj09CmFzc2VydApieXRlYyA4IC8vICJpc19yZXNvbHZlZCIKYXBwX2dsb2JhbF9nZXQKaW50Y18xIC8vIDAKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgVHlwZUVudW0KcHVzaGludCA2IC8vIGFwcGwKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnNhIEFwcGxpY2F0aW9uQXJncyAwCnB1c2hieXRlcyAweGRiOTIyZmMyIC8vICJtYXRjaF90YWtlcihhcHBsaWNhdGlvbil1aW50NjQiCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFwcGxpY2F0aW9uSUQKZnJhbWVfZGlnIC0xCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzIgLy8gMgotCmd0eG5zIFR5cGVFbnVtCnB1c2hpbnQgNiAvLyBhcHBsCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzIgLy8gMgotCmd0eG5zYSBBcHBsaWNhdGlvbkFyZ3MgMApwdXNoYnl0ZXMgMHgzMmNlMjgxZSAvLyAibWF0Y2hfbWFrZXIoYXBwbGljYXRpb24sdWludDY0KXVpbnQ4Igo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18yIC8vIDIKLQpndHhucyBBcHBsaWNhdGlvbklECmZyYW1lX2RpZyAtMgo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBPbkNvbXBsZXRpb24KaW50Y18xIC8vIE5vT3AKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgT25Db21wbGV0aW9uCmludGNfMSAvLyBOb09wCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIE9uQ29tcGxldGlvbgppbnRjXzEgLy8gTm9PcAo9PQphc3NlcnQKcmV0c3ViCgovLyB2YWxpZGF0ZV9tYXJrZXRfY29uc2lzdGVuY3kKdmFsaWRhdGVtYXJrZXRjb25zaXN0ZW5jeV8xNzoKcHJvdG8gMiAwCmZyYW1lX2RpZyAtMgpieXRlYyAxNiAvLyAibWFya2V0X2FwcF9pZCIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0xCmJ5dGVjIDE2IC8vICJtYXJrZXRfYXBwX2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwo9PQphc3NlcnQKZnJhbWVfZGlnIC0yCmJ5dGVjIDE2IC8vICJtYXJrZXRfYXBwX2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwpnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKPT0KYXNzZXJ0CmZyYW1lX2RpZyAtMQpieXRlYyAxNiAvLyAibWFya2V0X2FwcF9pZCIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECj09CmFzc2VydApyZXRzdWIKCi8vIGhhbmRsZV9iaWRfYmlkX2NvbXBsZW1lbnRfbWF0Y2gKaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4Ogpwcm90byAzIDAKZnJhbWVfZGlnIC0yCmJ5dGVjIDEwIC8vICJwcmljZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0zCmJ5dGVjIDEwIC8vICJwcmljZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKKwpmcmFtZV9kaWcgLTIKYnl0ZWMgMTcgLy8gInNsaXBwYWdlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMworCmludGMgNCAvLyAxMDAwMDAwCj49CmFzc2VydApmcmFtZV9kaWcgLTMKYnl0ZWMgMTMgLy8gIm93bmVyIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwpmcmFtZV9kaWcgLTMKY2FsbHN1YiBnZXRhcHBhZGRyXzQKZnJhbWVfZGlnIC0zCmJ5dGVjIDYgLy8gInBvc2l0aW9uIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQpibnogaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4X2w1CmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4X2wyOgpmcmFtZV9kaWcgLTEKY2FsbHN1YiBnZXRmdW5kc3RvdHJhZGVyXzgKZnJhbWVfZGlnIC0yCmJ5dGVjIDEzIC8vICJvd25lciIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0yCmNhbGxzdWIgZ2V0YXBwYWRkcl80CmZyYW1lX2RpZyAtMgpieXRlYyA2IC8vICJwb3NpdGlvbiIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18xIC8vIDAKPT0KYm56IGhhbmRsZWJpZGJpZGNvbXBsZW1lbnRtYXRjaF8xOF9sNApieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmIgaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4X2w2CmhhbmRsZWJpZGJpZGNvbXBsZW1lbnRtYXRjaF8xOF9sNDoKYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmIgaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4X2w2CmhhbmRsZWJpZGJpZGNvbXBsZW1lbnRtYXRjaF8xOF9sNToKYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmIgaGFuZGxlYmlkYmlkY29tcGxlbWVudG1hdGNoXzE4X2wyCmhhbmRsZWJpZGJpZGNvbXBsZW1lbnRtYXRjaF8xOF9sNjoKZnJhbWVfZGlnIC0xCmNhbGxzdWIgZ2V0ZnVuZHN0b3RyYWRlcl84CmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CmZyYW1lX2RpZyAtMQorCmFwcF9nbG9iYWxfcHV0CmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYnl0ZWNfMiAvLyAibm9fc3VwcGx5IgphcHBfZ2xvYmFsX2dldApmcmFtZV9kaWcgLTEKKwphcHBfZ2xvYmFsX3B1dApyZXRzdWIKCi8vIGhhbmRsZV9hc2tfYXNrX2NvbXBsZW1lbnRfbWF0Y2gKaGFuZGxlYXNrYXNrY29tcGxlbWVudG1hdGNoXzE5Ogpwcm90byAzIDAKZnJhbWVfZGlnIC0yCmJ5dGVjIDEwIC8vICJwcmljZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0zCmJ5dGVjIDEwIC8vICJwcmljZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKKwpmcmFtZV9kaWcgLTIKYnl0ZWMgMTcgLy8gInNsaXBwYWdlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwotCmludGMgNCAvLyAxMDAwMDAwCjw9CmFzc2VydApmcmFtZV9kaWcgLTIKYnl0ZWMgMTAgLy8gInByaWNlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwpmcmFtZV9kaWcgLTIKYnl0ZWMgMTcgLy8gInNsaXBwYWdlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwotCmludGMgNCAvLyAxMDAwMDAwCmZyYW1lX2RpZyAtMwpieXRlYyAxMCAvLyAicHJpY2UiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8zCi0KPApibnogaGFuZGxlYXNrYXNrY29tcGxlbWVudG1hdGNoXzE5X2wyCmludGMgNCAvLyAxMDAwMDAwCmZyYW1lX2RpZyAtMwpieXRlYyAxMCAvLyAicHJpY2UiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8zCi0Kc3RvcmUgMTcKYiBoYW5kbGVhc2thc2tjb21wbGVtZW50bWF0Y2hfMTlfbDMKaGFuZGxlYXNrYXNrY29tcGxlbWVudG1hdGNoXzE5X2wyOgpmcmFtZV9kaWcgLTIKYnl0ZWMgMTAgLy8gInByaWNlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwpmcmFtZV9kaWcgLTIKYnl0ZWMgMTcgLy8gInNsaXBwYWdlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwotCnN0b3JlIDE3CmhhbmRsZWFza2Fza2NvbXBsZW1lbnRtYXRjaF8xOV9sMzoKZnJhbWVfZGlnIC0zCmJ5dGVjIDEzIC8vICJvd25lciIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0zCmNhbGxzdWIgZ2V0YXBwYWRkcl80CmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmZyYW1lX2RpZyAtMQpmcmFtZV9kaWcgLTMKYnl0ZWMgMTAgLy8gInByaWNlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwoqCmludGMgNCAvLyAxMDAwMDAwCi8KY2FsbHN1YiBnZXRmdW5kc3RvdHJhZGVyXzgKZnJhbWVfZGlnIC0yCmJ5dGVjIDEzIC8vICJvd25lciIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0yCmNhbGxzdWIgZ2V0YXBwYWRkcl80CmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmZyYW1lX2RpZyAtMQpsb2FkIDE3CioKaW50YyA0IC8vIDEwMDAwMDAKLwpmcmFtZV9kaWcgLTEKbG9hZCAxNwpieXRlYyAxNSAvLyAiZmVlX2Jhc2VfcGVyY2VudCIKYXBwX2dsb2JhbF9nZXQKY2FsbHN1YiBjYWxjdWxhdGVmZWVfMQotCmNhbGxzdWIgZ2V0ZnVuZHN0b3RyYWRlcl84Cmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCmZyYW1lX2RpZyAtMQpsb2FkIDE3CmJ5dGVjIDE1IC8vICJmZWVfYmFzZV9wZXJjZW50IgphcHBfZ2xvYmFsX2dldApjYWxsc3ViIGNhbGN1bGF0ZWZlZV8xCmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmJ5dGVjIDIxIC8vICJmZWVfYWRkcmVzcyIKYXBwX2dsb2JhbF9nZXQKY2FsbHN1YiBzZW5kYXNzZXRfNgpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgphcHBfZ2xvYmFsX2dldApmcmFtZV9kaWcgLTEKLQphcHBfZ2xvYmFsX3B1dApieXRlY18yIC8vICJub19zdXBwbHkiCmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYXBwX2dsb2JhbF9nZXQKZnJhbWVfZGlnIC0xCi0KYXBwX2dsb2JhbF9wdXQKcmV0c3ViCgovLyBwcm9jZXNzX3BvdGVudGlhbF9tYXRjaApwcm9jZXNzcG90ZW50aWFsbWF0Y2hfMjA6CnByb3RvIDIgMQppbnRjXzEgLy8gMApmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmZyYW1lX2RpZyAtMQp0eG5hcyBBcHBsaWNhdGlvbnMKY2FsbHN1YiB2YWxpZGF0ZW1hdGNoZ3JvdXBzdHJ1Y3R1cmVfMTYKZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCmNhbGxzdWIgdmFsaWRhdGVtYXJrZXRjb25zaXN0ZW5jeV8xNwpieXRlYyA4IC8vICJpc19yZXNvbHZlZCIKYXBwX2dsb2JhbF9nZXQKaW50Y18xIC8vIDAKPT0KYXNzZXJ0CmZyYW1lX2RpZyAtMgp0eG5hcyBBcHBsaWNhdGlvbnMKY2FsbHN1YiBnZXRhcHBjcmVhdG9yXzUKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKPT0KYXNzZXJ0CmZyYW1lX2RpZyAtMQp0eG5hcyBBcHBsaWNhdGlvbnMKY2FsbHN1YiBnZXRhcHBjcmVhdG9yXzUKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKPT0KYXNzZXJ0CmZyYW1lX2RpZyAtMgp0eG5hcyBBcHBsaWNhdGlvbnMKYnl0ZWMgMjUgLy8gImZlZV90aW1lcl9zdGFydCIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKZnJhbWVfZGlnIC0xCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyAyNSAvLyAiZmVlX3RpbWVyX3N0YXJ0IgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwo8PQphc3NlcnQKZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyA2IC8vICJwb3NpdGlvbiIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18xIC8vIDAKPT0KZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyAxMSAvLyAic2lkZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KJiYKZnJhbWVfZGlnIC0xCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyA2IC8vICJwb3NpdGlvbiIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KJiYKZnJhbWVfZGlnIC0xCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyAxMSAvLyAic2lkZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KJiYKZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyA2IC8vICJwb3NpdGlvbiIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyAxMSAvLyAic2lkZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KJiYKZnJhbWVfZGlnIC0xCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyA2IC8vICJwb3NpdGlvbiIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18xIC8vIDAKPT0KJiYKZnJhbWVfZGlnIC0xCnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlYyAxMSAvLyAic2lkZSIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaW50Y18wIC8vIDEKPT0KJiYKfHwKYm56IHByb2Nlc3Nwb3RlbnRpYWxtYXRjaF8yMF9sMwpmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDYgLy8gInBvc2l0aW9uIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQpmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDExIC8vICJzaWRlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQomJgpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDYgLy8gInBvc2l0aW9uIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzAgLy8gMQo9PQomJgpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDExIC8vICJzaWRlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQomJgpmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDYgLy8gInBvc2l0aW9uIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzAgLy8gMQo9PQpmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDExIC8vICJzaWRlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQomJgpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDYgLy8gInBvc2l0aW9uIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQomJgpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjIDExIC8vICJzaWRlIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwppbnRjXzEgLy8gMAo9PQomJgp8fApieiBwcm9jZXNzcG90ZW50aWFsbWF0Y2hfMjBfbDQKZnJhbWVfZGlnIC0yCnR4bmFzIEFwcGxpY2F0aW9ucwpmcmFtZV9kaWcgLTEKdHhuYXMgQXBwbGljYXRpb25zCnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnNhIEFwcGxpY2F0aW9uQXJncyAyCmJ0b2kKY2FsbHN1YiBoYW5kbGVhc2thc2tjb21wbGVtZW50bWF0Y2hfMTkKYiBwcm9jZXNzcG90ZW50aWFsbWF0Y2hfMjBfbDQKcHJvY2Vzc3BvdGVudGlhbG1hdGNoXzIwX2wzOgpmcmFtZV9kaWcgLTIKdHhuYXMgQXBwbGljYXRpb25zCmZyYW1lX2RpZyAtMQp0eG5hcyBBcHBsaWNhdGlvbnMKdHhuIEdyb3VwSW5kZXgKaW50Y18yIC8vIDIKLQpndHhuc2EgQXBwbGljYXRpb25BcmdzIDIKYnRvaQpjYWxsc3ViIGhhbmRsZWJpZGJpZGNvbXBsZW1lbnRtYXRjaF8xOApwcm9jZXNzcG90ZW50aWFsbWF0Y2hfMjBfbDQ6CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMAppbnRjXzMgLy8gMjU2CjwKYXNzZXJ0CnJldHN1YgoKLy8gcmVzb2x2ZV9tYXJrZXQKcmVzb2x2ZW1hcmtldF8yMToKcHJvdG8gMSAxCmludGNfMSAvLyAwCnR4biBTZW5kZXIKYnl0ZWMgMjAgLy8gIm9yYWNsZV9hZGRyZXNzIgphcHBfZ2xvYmFsX2dldAo9PQphc3NlcnQKYnl0ZWMgMTggLy8gIm91dGNvbWUiCmZyYW1lX2RpZyAtMQphcHBfZ2xvYmFsX3B1dApieXRlYyA4IC8vICJpc19yZXNvbHZlZCIKaW50Y18wIC8vIDEKYXBwX2dsb2JhbF9wdXQKaW50Y18wIC8vIDEKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCmludGNfMyAvLyAyNTYKPAphc3NlcnQKcmV0c3ViCgovLyBtZXJnZV9zaGFyZXMKbWVyZ2VzaGFyZXNfMjI6CnByb3RvIDAgMQppbnRjXzEgLy8gMApieXRlYyA4IC8vICJpc19yZXNvbHZlZCIKYXBwX2dsb2JhbF9nZXQKaW50Y18xIC8vIDAKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgVHlwZUVudW0KcHVzaGludCA0IC8vIGF4ZmVyCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFR5cGVFbnVtCnB1c2hpbnQgNCAvLyBheGZlcgo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18yIC8vIDIKLQpndHhucyBBc3NldFJlY2VpdmVyCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0UmVjZWl2ZXIKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKPT0KYXNzZXJ0CmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18yIC8vIDIKLQpndHhucyBYZmVyQXNzZXQKPT0KYXNzZXJ0CmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFhmZXJBc3NldAo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18yIC8vIDIKLQpndHhucyBBc3NldEFtb3VudAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50Cj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50CmludGNfMSAvLyAwCj4KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgU2VuZGVyCnR4biBTZW5kZXIKPT0KYXNzZXJ0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgU2VuZGVyCnR4biBTZW5kZXIKPT0KYXNzZXJ0Cmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgQXNzZXRBbW91bnQKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIFNlbmRlcgpjYWxsc3ViIHNlbmRhc3NldF82CmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMiAvLyAyCi0KZ3R4bnMgQXNzZXRBbW91bnQKLQphcHBfZ2xvYmFsX3B1dApieXRlY18yIC8vICJub19zdXBwbHkiCmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudAotCmFwcF9nbG9iYWxfcHV0CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMAppbnRjXzMgLy8gMjU2CjwKYXNzZXJ0CnJldHN1YgoKLy8gc3BsaXRfc2hhcmVzCnNwbGl0c2hhcmVzXzIzOgpwcm90byAwIDEKaW50Y18xIC8vIDAKYnl0ZWMgOCAvLyAiaXNfcmVzb2x2ZWQiCmFwcF9nbG9iYWxfZ2V0CmludGNfMSAvLyAwCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFR5cGVFbnVtCnB1c2hpbnQgNCAvLyBheGZlcgo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldFJlY2VpdmVyCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCj09CmFzc2VydApieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFhmZXJBc3NldAo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudAppbnRjXzEgLy8gMAo+CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFNlbmRlcgp0eG4gU2VuZGVyCj09CmFzc2VydApnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50CmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIFNlbmRlcgpjYWxsc3ViIHNlbmRhc3NldF82Cmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBTZW5kZXIKY2FsbHN1YiBzZW5kYXNzZXRfNgpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50CisKYXBwX2dsb2JhbF9wdXQKYnl0ZWNfMiAvLyAibm9fc3VwcGx5IgpieXRlY18yIC8vICJub19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKKwphcHBfZ2xvYmFsX3B1dAppbnRjXzAgLy8gMQpmcmFtZV9idXJ5IDAKZnJhbWVfZGlnIDAKaW50Y18zIC8vIDI1Ngo8CmFzc2VydApyZXRzdWIKCi8vIGNsYWltCmNsYWltXzI0Ogpwcm90byAwIDEKaW50Y18xIC8vIDAKYnl0ZWMgOCAvLyAiaXNfcmVzb2x2ZWQiCmFwcF9nbG9iYWxfZ2V0CmludGNfMCAvLyAxCj09CmFzc2VydAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFR5cGVFbnVtCnB1c2hpbnQgNCAvLyBheGZlcgo9PQphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldFJlY2VpdmVyCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCj09CmFzc2VydApieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0Cj09CmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFhmZXJBc3NldAo9PQp8fAphc3NlcnQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBTZW5kZXIKdHhuIFNlbmRlcgo9PQphc3NlcnQKYnl0ZWMgMTggLy8gIm91dGNvbWUiCmFwcF9nbG9iYWxfZ2V0CmludGNfMCAvLyAxCj09CmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKPT0KJiYKYm56IGNsYWltXzI0X2wxMgpieXRlYyAxOCAvLyAib3V0Y29tZSIKYXBwX2dsb2JhbF9nZXQKaW50Y18xIC8vIDAKPT0KYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0Cj09CiYmCmJueiBjbGFpbV8yNF9sMTEKYnl0ZWMgMTggLy8gIm91dGNvbWUiCmFwcF9nbG9iYWxfZ2V0CmludGNfMiAvLyAyCj09CmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIFhmZXJBc3NldAo9PQpieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0Cj09Cnx8CiYmCmJueiBjbGFpbV8yNF9sNwpieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0Cj09CmJueiBjbGFpbV8yNF9sNgpieXRlYyA0IC8vICJub19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKPT0KYnogY2xhaW1fMjRfbDEzCmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYnl0ZWNfMiAvLyAibm9fc3VwcGx5IgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50Ci0KYXBwX2dsb2JhbF9wdXQKYiBjbGFpbV8yNF9sMTMKY2xhaW1fMjRfbDY6CmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKLQphcHBfZ2xvYmFsX3B1dApiIGNsYWltXzI0X2wxMwpjbGFpbV8yNF9sNzoKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudAppbnRjXzIgLy8gMgovCmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBTZW5kZXIKY2FsbHN1YiBzZW5kYXNzZXRfNgpieXRlYyA0IC8vICJub19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBYZmVyQXNzZXQKPT0KYm56IGNsYWltXzI0X2wxMApieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgWGZlckFzc2V0Cj09CmJ6IGNsYWltXzI0X2wxMwpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgpieXRlY18xIC8vICJ5ZXNfc3VwcGx5IgphcHBfZ2xvYmFsX2dldAp0eG4gR3JvdXBJbmRleAppbnRjXzAgLy8gMQotCmd0eG5zIEFzc2V0QW1vdW50Ci0KYXBwX2dsb2JhbF9wdXQKYiBjbGFpbV8yNF9sMTMKY2xhaW1fMjRfbDEwOgpieXRlY18yIC8vICJub19zdXBwbHkiCmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYXBwX2dsb2JhbF9nZXQKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudAotCmFwcF9nbG9iYWxfcHV0CmIgY2xhaW1fMjRfbDEzCmNsYWltXzI0X2wxMToKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKdHhuIEdyb3VwSW5kZXgKaW50Y18wIC8vIDEKLQpndHhucyBBc3NldEFtb3VudApieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAp0eG4gU2VuZGVyCmNhbGxzdWIgc2VuZGFzc2V0XzYKYnl0ZWNfMiAvLyAibm9fc3VwcGx5IgpieXRlY18yIC8vICJub19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKLQphcHBfZ2xvYmFsX3B1dApiIGNsYWltXzI0X2wxMwpjbGFpbV8yNF9sMTI6Cmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKdHhuIFNlbmRlcgpjYWxsc3ViIHNlbmRhc3NldF82CmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CnR4biBHcm91cEluZGV4CmludGNfMCAvLyAxCi0KZ3R4bnMgQXNzZXRBbW91bnQKLQphcHBfZ2xvYmFsX3B1dApjbGFpbV8yNF9sMTM6CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMAppbnRjXzMgLy8gMjU2CjwKYXNzZXJ0CnJldHN1YgoKLy8gZG9uYXRlX2V4Y2Vzc190b19tYXJrZXRfZnJpZW5kCmRvbmF0ZWV4Y2Vzc3RvbWFya2V0ZnJpZW5kXzI1Ogpwcm90byAwIDEKaW50Y18xIC8vIDAKdHhuIFNlbmRlcgpieXRlYyA5IC8vICJtYXJrZXRfZnJpZW5kX2FkZHIiCmFwcF9nbG9iYWxfZ2V0Cj09CmFzc2VydApieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldApnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwpjYWxsc3ViIHNhZmV3YWxsZXRiYWxhbmNlXzkKYnl0ZWNfMSAvLyAieWVzX3N1cHBseSIKYXBwX2dsb2JhbF9nZXQKYnl0ZWNfMiAvLyAibm9fc3VwcGx5IgphcHBfZ2xvYmFsX2dldAorCj4KYnogZG9uYXRlZXhjZXNzdG9tYXJrZXRmcmllbmRfMjVfbDIKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKYnl0ZWNfMCAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKY2FsbHN1YiBzYWZld2FsbGV0YmFsYW5jZV85CmJ5dGVjXzEgLy8gInllc19zdXBwbHkiCmFwcF9nbG9iYWxfZ2V0CmJ5dGVjXzIgLy8gIm5vX3N1cHBseSIKYXBwX2dsb2JhbF9nZXQKKwotCmJ5dGVjXzAgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0CmJ5dGVjIDkgLy8gIm1hcmtldF9mcmllbmRfYWRkciIKYXBwX2dsb2JhbF9nZXQKY2FsbHN1YiBzZW5kYXNzZXRfNgpkb25hdGVleGNlc3N0b21hcmtldGZyaWVuZF8yNV9sMjoKaW50Y18wIC8vIDEKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCmludGNfMyAvLyAyNTYKPAphc3NlcnQKcmV0c3ViCgovLyBkZWxldGVfZXNjcm93CmRlbGV0ZWVzY3Jvd18yNjoKcHJvdG8gMiAxCmludGNfMSAvLyAwCmZyYW1lX2RpZyAtMgpjYWxsc3ViIGdldGFwcGNyZWF0b3JfNQpnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwo9PQphc3NlcnQKdHhuIFNlbmRlcgpmcmFtZV9kaWcgLTIKYnl0ZWMgMTMgLy8gIm93bmVyIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMwo9PQp0eG4gU2VuZGVyCmJ5dGVjIDIyIC8vICJlc2Nyb3dfY2FuY2VsX2FkZHJlc3MiCmFwcF9nbG9iYWxfZ2V0Cj09Cnx8CmFzc2VydAppdHhuX2JlZ2luCnB1c2hpbnQgNiAvLyBhcHBsCml0eG5fZmllbGQgVHlwZUVudW0KZnJhbWVfZGlnIC0yCml0eG5fZmllbGQgQXBwbGljYXRpb25JRApieXRlYyAxOSAvLyAiZGVsZXRlKCl1aW50OCIKaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCml0eG5fZmllbGQgT25Db21wbGV0aW9uCmdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAppdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwpieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAppdHhuX2ZpZWxkIEFzc2V0cwpieXRlY18zIC8vICJ5ZXNfYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0Cml0eG5fZmllbGQgQXNzZXRzCmJ5dGVjIDQgLy8gIm5vX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAppdHhuX2ZpZWxkIEFzc2V0cwp0eG4gU2VuZGVyCml0eG5fZmllbGQgQWNjb3VudHMKZnJhbWVfZGlnIC0yCmJ5dGVjIDEzIC8vICJvd25lciIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzMKaXR4bl9maWVsZCBBY2NvdW50cwppdHhuX3N1Ym1pdApnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwpwdXNoaW50IDU1NjUwMCAvLyA1NTY1MDAKZnJhbWVfZGlnIC0xCmNhbGxzdWIgc2VuZGFsZ29fNwppbnRjXzAgLy8gMQpmcmFtZV9idXJ5IDAKZnJhbWVfZGlnIDAKaW50Y18zIC8vIDI1Ngo8CmFzc2VydApyZXRzdWIKCi8vIGRlbGV0ZQpkZWxldGVfMjc6CnByb3RvIDAgMQppbnRjXzEgLy8gMAp0eG4gU2VuZGVyCmJ5dGVjIDkgLy8gIm1hcmtldF9mcmllbmRfYWRkciIKYXBwX2dsb2JhbF9nZXQKPT0KYXNzZXJ0CmJ5dGVjIDggLy8gImlzX3Jlc29sdmVkIgphcHBfZ2xvYmFsX2dldAppbnRjXzAgLy8gMQo9PQphc3NlcnQKaXR4bl9iZWdpbgpwdXNoaW50IDQgLy8gYXhmZXIKaXR4bl9maWVsZCBUeXBlRW51bQpieXRlY18wIC8vICJjb2xsYXRlcmFsX2Fzc2V0X2lkIgphcHBfZ2xvYmFsX2dldAppdHhuX2ZpZWxkIFhmZXJBc3NldApieXRlYyA5IC8vICJtYXJrZXRfZnJpZW5kX2FkZHIiCmFwcF9nbG9iYWxfZ2V0Cml0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgppbnRjXzEgLy8gMAppdHhuX2ZpZWxkIEZlZQppbnRjXzEgLy8gMAppdHhuX2ZpZWxkIEFzc2V0QW1vdW50CmJ5dGVjIDkgLy8gIm1hcmtldF9mcmllbmRfYWRkciIKYXBwX2dsb2JhbF9nZXQKaXR4bl9maWVsZCBBc3NldENsb3NlVG8KaXR4bl9zdWJtaXQKaXR4bl9iZWdpbgpwdXNoaW50IDMgLy8gYWNmZwppdHhuX2ZpZWxkIFR5cGVFbnVtCmJ5dGVjXzMgLy8gInllc19hc3NldF9pZCIKYXBwX2dsb2JhbF9nZXQKaXR4bl9maWVsZCBDb25maWdBc3NldAppdHhuX3N1Ym1pdAppdHhuX2JlZ2luCnB1c2hpbnQgMyAvLyBhY2ZnCml0eG5fZmllbGQgVHlwZUVudW0KYnl0ZWMgNCAvLyAibm9fYXNzZXRfaWQiCmFwcF9nbG9iYWxfZ2V0Cml0eG5fZmllbGQgQ29uZmlnQXNzZXQKaXR4bl9zdWJtaXQKaXR4bl9iZWdpbgppbnRjXzAgLy8gcGF5Cml0eG5fZmllbGQgVHlwZUVudW0KaW50Y18xIC8vIDAKaXR4bl9maWVsZCBBbW91bnQKYnl0ZWMgOSAvLyAibWFya2V0X2ZyaWVuZF9hZGRyIgphcHBfZ2xvYmFsX2dldAppdHhuX2ZpZWxkIFJlY2VpdmVyCmludGNfMSAvLyAwCml0eG5fZmllbGQgRmVlCmJ5dGVjIDkgLy8gIm1hcmtldF9mcmllbmRfYWRkciIKYXBwX2dsb2JhbF9nZXQKaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCml0eG5fc3VibWl0CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApmcmFtZV9kaWcgMAppbnRjXzMgLy8gMjU2CjwKYXNzZXJ0CnJldHN1YgoKLy8gZG9fbm9vcApkb25vb3BfMjg6CnByb3RvIDEgMQppbnRjXzEgLy8gMApmcmFtZV9kaWcgLTEKZnJhbWVfYnVyeSAwCnJldHN1YgoKLy8gb25fdXBkYXRlCm9udXBkYXRlXzI5Ogpwcm90byAwIDEKaW50Y18xIC8vIDAKdHhuIFNlbmRlcgpieXRlYyA5IC8vICJtYXJrZXRfZnJpZW5kX2FkZHIiCmFwcF9nbG9iYWxfZ2V0Cj09Cmdsb2JhbCBHcm91cFNpemUKaW50Y18wIC8vIDEKPT0KJiYKYXNzZXJ0CmludGNfMCAvLyAxCmZyYW1lX2J1cnkgMApyZXRzdWIKCi8vIG9uX2NyZWF0ZV9jYXN0ZXIKb25jcmVhdGVjYXN0ZXJfMzA6CnByb3RvIDAgMAppbnRjXzEgLy8gMApieXRlYyAxMiAvLyAiIgppbnRjXzEgLy8gMApieXRlYyAxMiAvLyAiIgppbnRjXzEgLy8gMApieXRlYyAxMiAvLyAiIgpkdXBuIDIKaW50Y18xIC8vIDAKZHVwCmJ5dGVjIDEyIC8vICIiCnR4bmEgQXBwbGljYXRpb25BcmdzIDEKZnJhbWVfYnVyeSAxCnR4bmEgQXBwbGljYXRpb25BcmdzIDIKYnRvaQpmcmFtZV9idXJ5IDIKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwpmcmFtZV9idXJ5IDMKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNApidG9pCmZyYW1lX2J1cnkgNAp0eG5hIEFwcGxpY2F0aW9uQXJncyA1CmZyYW1lX2J1cnkgNQp0eG5hIEFwcGxpY2F0aW9uQXJncyA2CmZyYW1lX2J1cnkgNgp0eG5hIEFwcGxpY2F0aW9uQXJncyA3CmZyYW1lX2J1cnkgNwp0eG5hIEFwcGxpY2F0aW9uQXJncyA4CmJ0b2kKZnJhbWVfYnVyeSA4CnR4bmEgQXBwbGljYXRpb25BcmdzIDkKYnRvaQpmcmFtZV9idXJ5IDkKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKZnJhbWVfYnVyeSAxMApmcmFtZV9kaWcgMQpmcmFtZV9kaWcgMgpmcmFtZV9kaWcgMwpmcmFtZV9kaWcgNApmcmFtZV9kaWcgNQpmcmFtZV9kaWcgNgpmcmFtZV9kaWcgNwpmcmFtZV9kaWcgOApmcmFtZV9kaWcgOQpmcmFtZV9kaWcgMTAKY2FsbHN1YiBvbmNyZWF0ZV8xMApmcmFtZV9idXJ5IDAKYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CmJ5dGVjIDcgLy8gMHgwMAppbnRjXzEgLy8gMApmcmFtZV9kaWcgMApzZXRieXRlCmNvbmNhdApsb2cKcmV0c3ViCgovLyBjcmVhdGVfZXNjcm93X2Nhc3RlcgpjcmVhdGVlc2Nyb3djYXN0ZXJfMzE6CnByb3RvIDAgMAppbnRjXzEgLy8gMApkdXBuIDQKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQpidG9pCmZyYW1lX2J1cnkgMQp0eG5hIEFwcGxpY2F0aW9uQXJncyAyCmJ0b2kKZnJhbWVfYnVyeSAyCnR4bmEgQXBwbGljYXRpb25BcmdzIDMKYnRvaQpmcmFtZV9idXJ5IDMKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAppbnRjXzEgLy8gMApnZXRieXRlCmZyYW1lX2J1cnkgNApmcmFtZV9kaWcgMQpmcmFtZV9kaWcgMgpmcmFtZV9kaWcgMwpmcmFtZV9kaWcgNApjYWxsc3ViIGNyZWF0ZWVzY3Jvd18xNApmcmFtZV9idXJ5IDAKYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CmZyYW1lX2RpZyAwCml0b2IKY29uY2F0CmxvZwpyZXRzdWIKCi8vIGFjdGl2YXRlX21hcmtldF9jYXN0ZXIKYWN0aXZhdGVtYXJrZXRjYXN0ZXJfMzI6CnByb3RvIDAgMAppbnRjXzEgLy8gMApjYWxsc3ViIGFjdGl2YXRlbWFya2V0XzE1CmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNyAvLyAweDAwCmludGNfMSAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWIKCi8vIHByb2Nlc3NfcG90ZW50aWFsX21hdGNoX2Nhc3Rlcgpwcm9jZXNzcG90ZW50aWFsbWF0Y2hjYXN0ZXJfMzM6CnByb3RvIDAgMAppbnRjXzEgLy8gMApkdXBuIDIKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQppbnRjXzEgLy8gMApnZXRieXRlCmZyYW1lX2J1cnkgMQp0eG5hIEFwcGxpY2F0aW9uQXJncyAyCmludGNfMSAvLyAwCmdldGJ5dGUKZnJhbWVfYnVyeSAyCmZyYW1lX2RpZyAxCmZyYW1lX2RpZyAyCmNhbGxzdWIgcHJvY2Vzc3BvdGVudGlhbG1hdGNoXzIwCmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNyAvLyAweDAwCmludGNfMSAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWIKCi8vIHJlc29sdmVfbWFya2V0X2Nhc3RlcgpyZXNvbHZlbWFya2V0Y2FzdGVyXzM0Ogpwcm90byAwIDAKaW50Y18xIC8vIDAKZHVwCnR4bmEgQXBwbGljYXRpb25BcmdzIDEKaW50Y18xIC8vIDAKZ2V0Ynl0ZQpmcmFtZV9idXJ5IDEKZnJhbWVfZGlnIDEKY2FsbHN1YiByZXNvbHZlbWFya2V0XzIxCmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNyAvLyAweDAwCmludGNfMSAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWIKCi8vIG1lcmdlX3NoYXJlc19jYXN0ZXIKbWVyZ2VzaGFyZXNjYXN0ZXJfMzU6CnByb3RvIDAgMAppbnRjXzEgLy8gMApjYWxsc3ViIG1lcmdlc2hhcmVzXzIyCmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNyAvLyAweDAwCmludGNfMSAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWIKCi8vIHNwbGl0X3NoYXJlc19jYXN0ZXIKc3BsaXRzaGFyZXNjYXN0ZXJfMzY6CnByb3RvIDAgMAppbnRjXzEgLy8gMApjYWxsc3ViIHNwbGl0c2hhcmVzXzIzCmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNyAvLyAweDAwCmludGNfMSAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWIKCi8vIGNsYWltX2Nhc3RlcgpjbGFpbWNhc3Rlcl8zNzoKcHJvdG8gMCAwCmludGNfMSAvLyAwCmNhbGxzdWIgY2xhaW1fMjQKZnJhbWVfYnVyeSAwCmJ5dGVjIDUgLy8gMHgxNTFmN2M3NQpieXRlYyA3IC8vIDB4MDAKaW50Y18xIC8vIDAKZnJhbWVfZGlnIDAKc2V0Ynl0ZQpjb25jYXQKbG9nCnJldHN1YgoKLy8gZG9uYXRlX2V4Y2Vzc190b19tYXJrZXRfZnJpZW5kX2Nhc3Rlcgpkb25hdGVleGNlc3N0b21hcmtldGZyaWVuZGNhc3Rlcl8zODoKcHJvdG8gMCAwCmludGNfMSAvLyAwCmNhbGxzdWIgZG9uYXRlZXhjZXNzdG9tYXJrZXRmcmllbmRfMjUKZnJhbWVfYnVyeSAwCmJ5dGVjIDUgLy8gMHgxNTFmN2M3NQpieXRlYyA3IC8vIDB4MDAKaW50Y18xIC8vIDAKZnJhbWVfZGlnIDAKc2V0Ynl0ZQpjb25jYXQKbG9nCnJldHN1YgoKLy8gZGVsZXRlX2VzY3Jvd19jYXN0ZXIKZGVsZXRlZXNjcm93Y2FzdGVyXzM5Ogpwcm90byAwIDAKaW50Y18xIC8vIDAKZHVwCmJ5dGVjIDEyIC8vICIiCnR4bmEgQXBwbGljYXRpb25BcmdzIDEKYnRvaQpmcmFtZV9idXJ5IDEKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgpmcmFtZV9idXJ5IDIKZnJhbWVfZGlnIDEKZnJhbWVfZGlnIDIKY2FsbHN1YiBkZWxldGVlc2Nyb3dfMjYKZnJhbWVfYnVyeSAwCmJ5dGVjIDUgLy8gMHgxNTFmN2M3NQpieXRlYyA3IC8vIDB4MDAKaW50Y18xIC8vIDAKZnJhbWVfZGlnIDAKc2V0Ynl0ZQpjb25jYXQKbG9nCnJldHN1YgoKLy8gZGVsZXRlX2Nhc3RlcgpkZWxldGVjYXN0ZXJfNDA6CnByb3RvIDAgMAppbnRjXzEgLy8gMApjYWxsc3ViIGRlbGV0ZV8yNwpmcmFtZV9idXJ5IDAKYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CmJ5dGVjIDcgLy8gMHgwMAppbnRjXzEgLy8gMApmcmFtZV9kaWcgMApzZXRieXRlCmNvbmNhdApsb2cKcmV0c3ViCgovLyBkb19ub29wX2Nhc3Rlcgpkb25vb3BjYXN0ZXJfNDE6CnByb3RvIDAgMAppbnRjXzEgLy8gMApkdXAKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQpidG9pCmZyYW1lX2J1cnkgMQpmcmFtZV9kaWcgMQpjYWxsc3ViIGRvbm9vcF8yOApmcmFtZV9idXJ5IDAKYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CmZyYW1lX2RpZyAwCml0b2IKY29uY2F0CmxvZwpyZXRzdWIKCi8vIG9uX3VwZGF0ZV9jYXN0ZXIKb251cGRhdGVjYXN0ZXJfNDI6CnByb3RvIDAgMAppbnRjXzEgLy8gMApjYWxsc3ViIG9udXBkYXRlXzI5CmZyYW1lX2J1cnkgMApieXRlYyA1IC8vIDB4MTUxZjdjNzUKZnJhbWVfZGlnIDAKaXRvYgpjb25jYXQKbG9nCnJldHN1Yg==",
76
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDgKcHVzaGludCAwIC8vIDAKcmV0dXJu"
77
+ },
78
+ "state": {
79
+ "global": {
80
+ "num_byte_slices": 6,
81
+ "num_uints": 11
82
+ },
83
+ "local": {
84
+ "num_byte_slices": 0,
85
+ "num_uints": 0
86
+ }
87
+ },
88
+ "schema": {
89
+ "global": {
90
+ "declared": {
91
+ "collateral_asset_id": {
92
+ "type": "uint64",
93
+ "key": "collateral_asset_id",
94
+ "descr": "The asset id of the collatteral"
95
+ },
96
+ "escrow_cancel_address": {
97
+ "type": "bytes",
98
+ "key": "escrow_cancel_address",
99
+ "descr": "The address that can cancel escrows"
100
+ },
101
+ "fee_address": {
102
+ "type": "bytes",
103
+ "key": "fee_address",
104
+ "descr": "The address the fees go to"
105
+ },
106
+ "fee_base_percent": {
107
+ "type": "uint64",
108
+ "key": "fee_base_percent",
109
+ "descr": "The base fee percent of the market"
110
+ },
111
+ "fee_timer_threshold": {
112
+ "type": "uint64",
113
+ "key": "fee_timer_threshold",
114
+ "descr": "The number of seconds since fee_timer_start an order can match within to not pay fee"
115
+ },
116
+ "is_activated": {
117
+ "type": "uint64",
118
+ "key": "is_activated",
119
+ "descr": "The status of the market"
120
+ },
121
+ "is_resolved": {
122
+ "type": "uint64",
123
+ "key": "is_resolved",
124
+ "descr": "The status of the market"
125
+ },
126
+ "market_friend_addr": {
127
+ "type": "bytes",
128
+ "key": "market_friend_addr",
129
+ "descr": "The address of the market friend"
130
+ },
131
+ "no_asset_id": {
132
+ "type": "uint64",
133
+ "key": "no_asset_id",
134
+ "descr": "The asset id of the no outcome"
135
+ },
136
+ "no_supply": {
137
+ "type": "uint64",
138
+ "key": "no_supply",
139
+ "descr": "The supply of the no asset"
140
+ },
141
+ "oracle_address": {
142
+ "type": "bytes",
143
+ "key": "oracle_address",
144
+ "descr": "The address of the oracle"
145
+ },
146
+ "outcome": {
147
+ "type": "uint64",
148
+ "key": "outcome",
149
+ "descr": "The outcome of the market"
150
+ },
151
+ "resolution_time": {
152
+ "type": "uint64",
153
+ "key": "resolution_time",
154
+ "descr": "The timestamp the market should be resolved by (unix seconds)"
155
+ },
156
+ "rules": {
157
+ "type": "bytes",
158
+ "key": "rules",
159
+ "descr": "The rules of the market"
160
+ },
161
+ "title": {
162
+ "type": "bytes",
163
+ "key": "title",
164
+ "descr": "The name of the market"
165
+ },
166
+ "yes_asset_id": {
167
+ "type": "uint64",
168
+ "key": "yes_asset_id",
169
+ "descr": "The asset id of the yes outcome"
170
+ },
171
+ "yes_supply": {
172
+ "type": "uint64",
173
+ "key": "yes_supply",
174
+ "descr": "The supply of the yes asset"
175
+ }
176
+ },
177
+ "reserved": {}
178
+ },
179
+ "local": {
180
+ "declared": {},
181
+ "reserved": {}
182
+ }
183
+ },
184
+ "contract": {
185
+ "name": "market_app",
186
+ "methods": [
187
+ {
188
+ "name": "on_create",
189
+ "args": [
190
+ {
191
+ "type": "string",
192
+ "name": "title"
193
+ },
194
+ {
195
+ "type": "uint64",
196
+ "name": "collateral_asset_id"
197
+ },
198
+ {
199
+ "type": "address",
200
+ "name": "oracle_address"
201
+ },
202
+ {
203
+ "type": "uint64",
204
+ "name": "resolution_time"
205
+ },
206
+ {
207
+ "type": "address",
208
+ "name": "market_friend"
209
+ },
210
+ {
211
+ "type": "string",
212
+ "name": "rules"
213
+ },
214
+ {
215
+ "type": "address",
216
+ "name": "fee_address"
217
+ },
218
+ {
219
+ "type": "uint64",
220
+ "name": "fee_base_percent"
221
+ },
222
+ {
223
+ "type": "uint64",
224
+ "name": "fee_timer_threshhold"
225
+ },
226
+ {
227
+ "type": "address",
228
+ "name": "escrow_cancel_address"
229
+ }
230
+ ],
231
+ "returns": {
232
+ "type": "uint8"
233
+ }
234
+ },
235
+ {
236
+ "name": "create_escrow",
237
+ "args": [
238
+ {
239
+ "type": "uint64",
240
+ "name": "price"
241
+ },
242
+ {
243
+ "type": "uint64",
244
+ "name": "quantity"
245
+ },
246
+ {
247
+ "type": "uint64",
248
+ "name": "slippage"
249
+ },
250
+ {
251
+ "type": "uint8",
252
+ "name": "position"
253
+ }
254
+ ],
255
+ "returns": {
256
+ "type": "uint64"
257
+ }
258
+ },
259
+ {
260
+ "name": "activate_market",
261
+ "args": [],
262
+ "returns": {
263
+ "type": "uint8"
264
+ }
265
+ },
266
+ {
267
+ "name": "process_potential_match",
268
+ "args": [
269
+ {
270
+ "type": "application",
271
+ "name": "maker"
272
+ },
273
+ {
274
+ "type": "application",
275
+ "name": "taker"
276
+ }
277
+ ],
278
+ "returns": {
279
+ "type": "uint8"
280
+ }
281
+ },
282
+ {
283
+ "name": "resolve_market",
284
+ "args": [
285
+ {
286
+ "type": "uint8",
287
+ "name": "resolution"
288
+ }
289
+ ],
290
+ "returns": {
291
+ "type": "uint8"
292
+ }
293
+ },
294
+ {
295
+ "name": "merge_shares",
296
+ "args": [],
297
+ "returns": {
298
+ "type": "uint8"
299
+ }
300
+ },
301
+ {
302
+ "name": "split_shares",
303
+ "args": [],
304
+ "returns": {
305
+ "type": "uint8"
306
+ }
307
+ },
308
+ {
309
+ "name": "claim",
310
+ "args": [],
311
+ "returns": {
312
+ "type": "uint8"
313
+ }
314
+ },
315
+ {
316
+ "name": "donate_excess_to_market_friend",
317
+ "args": [],
318
+ "returns": {
319
+ "type": "uint8"
320
+ }
321
+ },
322
+ {
323
+ "name": "delete_escrow",
324
+ "args": [
325
+ {
326
+ "type": "uint64",
327
+ "name": "escrow_app_id"
328
+ },
329
+ {
330
+ "type": "address",
331
+ "name": "algo_receiver"
332
+ }
333
+ ],
334
+ "returns": {
335
+ "type": "uint8"
336
+ }
337
+ },
338
+ {
339
+ "name": "delete",
340
+ "args": [],
341
+ "returns": {
342
+ "type": "uint8"
343
+ }
344
+ },
345
+ {
346
+ "name": "do_noop",
347
+ "args": [
348
+ {
349
+ "type": "uint64",
350
+ "name": "call_number"
351
+ }
352
+ ],
353
+ "returns": {
354
+ "type": "uint64"
355
+ }
356
+ },
357
+ {
358
+ "name": "on_update",
359
+ "args": [],
360
+ "returns": {
361
+ "type": "uint64"
362
+ }
363
+ }
364
+ ],
365
+ "networks": {}
366
+ },
367
+ "bare_call_config": {}
368
+ };
369
+ var MarketAppCallFactory = class {
370
+ /**
371
+ * Gets available create call factories
372
+ */
373
+ static get create() {
374
+ return {
375
+ /**
376
+ * Constructs a create call for the market_app smart contract using the on_create(string,uint64,address,uint64,address,string,address,uint64,uint64,address)uint8 ABI method
377
+ *
378
+ * @param args Any args for the contract call
379
+ * @param params Any additional parameters for the call
380
+ * @returns A TypedCallParams object for the call
381
+ */
382
+ onCreate(args, params = {}) {
383
+ return {
384
+ method: "on_create(string,uint64,address,uint64,address,string,address,uint64,uint64,address)uint8",
385
+ methodArgs: Array.isArray(args) ? args : [args.title, args.collateralAssetId, args.oracleAddress, args.resolutionTime, args.marketFriend, args.rules, args.feeAddress, args.feeBasePercent, args.feeTimerThreshhold, args.escrowCancelAddress],
386
+ ...params
387
+ };
388
+ }
389
+ };
390
+ }
391
+ /**
392
+ * Gets available update call factories
393
+ */
394
+ static get update() {
395
+ return {
396
+ /**
397
+ * Constructs an update call for the market_app smart contract using the on_update()uint64 ABI method
398
+ *
399
+ * @param args Any args for the contract call
400
+ * @param params Any additional parameters for the call
401
+ * @returns A TypedCallParams object for the call
402
+ */
403
+ onUpdate(args, params = {}) {
404
+ return {
405
+ method: "on_update()uint64",
406
+ methodArgs: Array.isArray(args) ? args : [],
407
+ ...params
408
+ };
409
+ }
410
+ };
411
+ }
412
+ /**
413
+ * Gets available delete call factories
414
+ */
415
+ static get delete() {
416
+ return {
417
+ /**
418
+ * Constructs a delete call for the market_app smart contract using the delete()uint8 ABI method
419
+ *
420
+ * @param args Any args for the contract call
421
+ * @param params Any additional parameters for the call
422
+ * @returns A TypedCallParams object for the call
423
+ */
424
+ delete(args, params = {}) {
425
+ return {
426
+ method: "delete()uint8",
427
+ methodArgs: Array.isArray(args) ? args : [],
428
+ ...params
429
+ };
430
+ }
431
+ };
432
+ }
433
+ /**
434
+ * Constructs a no op call for the create_escrow(uint64,uint64,uint64,uint8)uint64 ABI method
435
+ *
436
+ * @param args Any args for the contract call
437
+ * @param params Any additional parameters for the call
438
+ * @returns A TypedCallParams object for the call
439
+ */
440
+ static createEscrow(args, params) {
441
+ return {
442
+ method: "create_escrow(uint64,uint64,uint64,uint8)uint64",
443
+ methodArgs: Array.isArray(args) ? args : [args.price, args.quantity, args.slippage, args.position],
444
+ ...params
445
+ };
446
+ }
447
+ /**
448
+ * Constructs a no op call for the activate_market()uint8 ABI method
449
+ *
450
+ * @param args Any args for the contract call
451
+ * @param params Any additional parameters for the call
452
+ * @returns A TypedCallParams object for the call
453
+ */
454
+ static activateMarket(args, params) {
455
+ return {
456
+ method: "activate_market()uint8",
457
+ methodArgs: Array.isArray(args) ? args : [],
458
+ ...params
459
+ };
460
+ }
461
+ /**
462
+ * Constructs a no op call for the process_potential_match(application,application)uint8 ABI method
463
+ *
464
+ * @param args Any args for the contract call
465
+ * @param params Any additional parameters for the call
466
+ * @returns A TypedCallParams object for the call
467
+ */
468
+ static processPotentialMatch(args, params) {
469
+ return {
470
+ method: "process_potential_match(application,application)uint8",
471
+ methodArgs: Array.isArray(args) ? args : [args.maker, args.taker],
472
+ ...params
473
+ };
474
+ }
475
+ /**
476
+ * Constructs a no op call for the resolve_market(uint8)uint8 ABI method
477
+ *
478
+ * @param args Any args for the contract call
479
+ * @param params Any additional parameters for the call
480
+ * @returns A TypedCallParams object for the call
481
+ */
482
+ static resolveMarket(args, params) {
483
+ return {
484
+ method: "resolve_market(uint8)uint8",
485
+ methodArgs: Array.isArray(args) ? args : [args.resolution],
486
+ ...params
487
+ };
488
+ }
489
+ /**
490
+ * Constructs a no op call for the merge_shares()uint8 ABI method
491
+ *
492
+ * @param args Any args for the contract call
493
+ * @param params Any additional parameters for the call
494
+ * @returns A TypedCallParams object for the call
495
+ */
496
+ static mergeShares(args, params) {
497
+ return {
498
+ method: "merge_shares()uint8",
499
+ methodArgs: Array.isArray(args) ? args : [],
500
+ ...params
501
+ };
502
+ }
503
+ /**
504
+ * Constructs a no op call for the split_shares()uint8 ABI method
505
+ *
506
+ * @param args Any args for the contract call
507
+ * @param params Any additional parameters for the call
508
+ * @returns A TypedCallParams object for the call
509
+ */
510
+ static splitShares(args, params) {
511
+ return {
512
+ method: "split_shares()uint8",
513
+ methodArgs: Array.isArray(args) ? args : [],
514
+ ...params
515
+ };
516
+ }
517
+ /**
518
+ * Constructs a no op call for the claim()uint8 ABI method
519
+ *
520
+ * @param args Any args for the contract call
521
+ * @param params Any additional parameters for the call
522
+ * @returns A TypedCallParams object for the call
523
+ */
524
+ static claim(args, params) {
525
+ return {
526
+ method: "claim()uint8",
527
+ methodArgs: Array.isArray(args) ? args : [],
528
+ ...params
529
+ };
530
+ }
531
+ /**
532
+ * Constructs a no op call for the donate_excess_to_market_friend()uint8 ABI method
533
+ *
534
+ * @param args Any args for the contract call
535
+ * @param params Any additional parameters for the call
536
+ * @returns A TypedCallParams object for the call
537
+ */
538
+ static donateExcessToMarketFriend(args, params) {
539
+ return {
540
+ method: "donate_excess_to_market_friend()uint8",
541
+ methodArgs: Array.isArray(args) ? args : [],
542
+ ...params
543
+ };
544
+ }
545
+ /**
546
+ * Constructs a no op call for the delete_escrow(uint64,address)uint8 ABI method
547
+ *
548
+ * @param args Any args for the contract call
549
+ * @param params Any additional parameters for the call
550
+ * @returns A TypedCallParams object for the call
551
+ */
552
+ static deleteEscrow(args, params) {
553
+ return {
554
+ method: "delete_escrow(uint64,address)uint8",
555
+ methodArgs: Array.isArray(args) ? args : [args.escrowAppId, args.algoReceiver],
556
+ ...params
557
+ };
558
+ }
559
+ /**
560
+ * Constructs a no op call for the do_noop(uint64)uint64 ABI method
561
+ *
562
+ * @param args Any args for the contract call
563
+ * @param params Any additional parameters for the call
564
+ * @returns A TypedCallParams object for the call
565
+ */
566
+ static doNoop(args, params) {
567
+ return {
568
+ method: "do_noop(uint64)uint64",
569
+ methodArgs: Array.isArray(args) ? args : [args.callNumber],
570
+ ...params
571
+ };
572
+ }
573
+ };
574
+ var MarketAppClient = class _MarketAppClient {
575
+ /**
576
+ * Creates a new instance of `MarketAppClient`
577
+ *
578
+ * @param appDetails appDetails The details to identify the app to deploy
579
+ * @param algod An algod client instance
580
+ */
581
+ constructor(appDetails, algod) {
582
+ this.algod = algod;
583
+ this.sender = appDetails.sender;
584
+ this.appClient = algokit3.getAppClient({
585
+ ...appDetails,
586
+ app: APP_SPEC
587
+ }, algod);
588
+ }
589
+ /**
590
+ * The underlying `ApplicationClient` for when you want to have more flexibility
591
+ */
592
+ appClient;
593
+ sender;
594
+ /**
595
+ * Checks for decode errors on the AppCallTransactionResult and maps the return value to the specified generic type
596
+ *
597
+ * @param result The AppCallTransactionResult to be mapped
598
+ * @param returnValueFormatter An optional delegate to format the return value if required
599
+ * @returns The smart contract response with an updated return value
600
+ */
601
+ mapReturnValue(result, returnValueFormatter) {
602
+ if (result.return?.decodeError) {
603
+ throw result.return.decodeError;
604
+ }
605
+ const returnValue = result.return?.returnValue !== void 0 && returnValueFormatter !== void 0 ? returnValueFormatter(result.return.returnValue) : result.return?.returnValue;
606
+ return { ...result, return: returnValue };
607
+ }
608
+ /**
609
+ * Calls the ABI method with the matching signature using an onCompletion code of NO_OP
610
+ *
611
+ * @param typedCallParams An object containing the method signature, args, and any other relevant parameters
612
+ * @param returnValueFormatter An optional delegate which when provided will be used to map non-undefined return values to the target type
613
+ * @returns The result of the smart contract call
614
+ */
615
+ async call(typedCallParams, returnValueFormatter) {
616
+ return this.mapReturnValue(await this.appClient.call(typedCallParams), returnValueFormatter);
617
+ }
618
+ /**
619
+ * Idempotently deploys the market_app smart contract.
620
+ *
621
+ * @param params The arguments for the contract calls and any additional parameters for the call
622
+ * @returns The deployment result
623
+ */
624
+ deploy(params = {}) {
625
+ const createArgs = params.createCall?.(MarketAppCallFactory.create);
626
+ const updateArgs = params.updateCall?.(MarketAppCallFactory.update);
627
+ const deleteArgs = params.deleteCall?.(MarketAppCallFactory.delete);
628
+ return this.appClient.deploy({
629
+ ...params,
630
+ updateArgs,
631
+ deleteArgs,
632
+ createArgs,
633
+ createOnCompleteAction: createArgs?.onCompleteAction
634
+ });
635
+ }
636
+ /**
637
+ * Gets available create methods
638
+ */
639
+ get create() {
640
+ const $this = this;
641
+ return {
642
+ /**
643
+ * Creates a new instance of the market_app smart contract using the on_create(string,uint64,address,uint64,address,string,address,uint64,uint64,address)uint8 ABI method.
644
+ *
645
+ * @param args The arguments for the smart contract call
646
+ * @param params Any additional parameters for the call
647
+ * @returns The create result
648
+ */
649
+ async onCreate(args, params = {}) {
650
+ return $this.mapReturnValue(await $this.appClient.create(MarketAppCallFactory.create.onCreate(args, params)));
651
+ }
652
+ };
653
+ }
654
+ /**
655
+ * Gets available update methods
656
+ */
657
+ get update() {
658
+ const $this = this;
659
+ return {
660
+ /**
661
+ * Updates an existing instance of the market_app smart contract using the on_update()uint64 ABI method.
662
+ *
663
+ * @param args The arguments for the smart contract call
664
+ * @param params Any additional parameters for the call
665
+ * @returns The update result
666
+ */
667
+ async onUpdate(args, params = {}) {
668
+ return $this.mapReturnValue(await $this.appClient.update(MarketAppCallFactory.update.onUpdate(args, params)));
669
+ }
670
+ };
671
+ }
672
+ /**
673
+ * Gets available delete methods
674
+ */
675
+ get delete() {
676
+ const $this = this;
677
+ return {
678
+ /**
679
+ * Deletes an existing instance of the market_app smart contract using the delete()uint8 ABI method.
680
+ *
681
+ * @param args The arguments for the smart contract call
682
+ * @param params Any additional parameters for the call
683
+ * @returns The delete result
684
+ */
685
+ async delete(args, params = {}) {
686
+ return $this.mapReturnValue(await $this.appClient.delete(MarketAppCallFactory.delete.delete(args, params)));
687
+ }
688
+ };
689
+ }
690
+ /**
691
+ * Makes a clear_state call to an existing instance of the market_app smart contract.
692
+ *
693
+ * @param args The arguments for the bare call
694
+ * @returns The clear_state result
695
+ */
696
+ clearState(args = {}) {
697
+ return this.appClient.clearState(args);
698
+ }
699
+ /**
700
+ * Calls the create_escrow(uint64,uint64,uint64,uint8)uint64 ABI method.
701
+ *
702
+ * @param args The arguments for the contract call
703
+ * @param params Any additional parameters for the call
704
+ * @returns The result of the call
705
+ */
706
+ createEscrow(args, params = {}) {
707
+ return this.call(MarketAppCallFactory.createEscrow(args, params));
708
+ }
709
+ /**
710
+ * Calls the activate_market()uint8 ABI method.
711
+ *
712
+ * @param args The arguments for the contract call
713
+ * @param params Any additional parameters for the call
714
+ * @returns The result of the call
715
+ */
716
+ activateMarket(args, params = {}) {
717
+ return this.call(MarketAppCallFactory.activateMarket(args, params));
718
+ }
719
+ /**
720
+ * Calls the process_potential_match(application,application)uint8 ABI method.
721
+ *
722
+ * @param args The arguments for the contract call
723
+ * @param params Any additional parameters for the call
724
+ * @returns The result of the call
725
+ */
726
+ processPotentialMatch(args, params = {}) {
727
+ return this.call(MarketAppCallFactory.processPotentialMatch(args, params));
728
+ }
729
+ /**
730
+ * Calls the resolve_market(uint8)uint8 ABI method.
731
+ *
732
+ * @param args The arguments for the contract call
733
+ * @param params Any additional parameters for the call
734
+ * @returns The result of the call
735
+ */
736
+ resolveMarket(args, params = {}) {
737
+ return this.call(MarketAppCallFactory.resolveMarket(args, params));
738
+ }
739
+ /**
740
+ * Calls the merge_shares()uint8 ABI method.
741
+ *
742
+ * @param args The arguments for the contract call
743
+ * @param params Any additional parameters for the call
744
+ * @returns The result of the call
745
+ */
746
+ mergeShares(args, params = {}) {
747
+ return this.call(MarketAppCallFactory.mergeShares(args, params));
748
+ }
749
+ /**
750
+ * Calls the split_shares()uint8 ABI method.
751
+ *
752
+ * @param args The arguments for the contract call
753
+ * @param params Any additional parameters for the call
754
+ * @returns The result of the call
755
+ */
756
+ splitShares(args, params = {}) {
757
+ return this.call(MarketAppCallFactory.splitShares(args, params));
758
+ }
759
+ /**
760
+ * Calls the claim()uint8 ABI method.
761
+ *
762
+ * @param args The arguments for the contract call
763
+ * @param params Any additional parameters for the call
764
+ * @returns The result of the call
765
+ */
766
+ claim(args, params = {}) {
767
+ return this.call(MarketAppCallFactory.claim(args, params));
768
+ }
769
+ /**
770
+ * Calls the donate_excess_to_market_friend()uint8 ABI method.
771
+ *
772
+ * @param args The arguments for the contract call
773
+ * @param params Any additional parameters for the call
774
+ * @returns The result of the call
775
+ */
776
+ donateExcessToMarketFriend(args, params = {}) {
777
+ return this.call(MarketAppCallFactory.donateExcessToMarketFriend(args, params));
778
+ }
779
+ /**
780
+ * Calls the delete_escrow(uint64,address)uint8 ABI method.
781
+ *
782
+ * @param args The arguments for the contract call
783
+ * @param params Any additional parameters for the call
784
+ * @returns The result of the call
785
+ */
786
+ deleteEscrow(args, params = {}) {
787
+ return this.call(MarketAppCallFactory.deleteEscrow(args, params));
788
+ }
789
+ /**
790
+ * Calls the do_noop(uint64)uint64 ABI method.
791
+ *
792
+ * @param args The arguments for the contract call
793
+ * @param params Any additional parameters for the call
794
+ * @returns The result of the call
795
+ */
796
+ doNoop(args, params = {}) {
797
+ return this.call(MarketAppCallFactory.doNoop(args, params));
798
+ }
799
+ /**
800
+ * Extracts a binary state value out of an AppState dictionary
801
+ *
802
+ * @param state The state dictionary containing the state value
803
+ * @param key The key of the state value
804
+ * @returns A BinaryState instance containing the state value, or undefined if the key was not found
805
+ */
806
+ static getBinaryState(state, key) {
807
+ const value = state[key];
808
+ if (!value) return void 0;
809
+ if (!("valueRaw" in value))
810
+ throw new Error(`Failed to parse state value for ${key}; received an int when expected a byte array`);
811
+ return {
812
+ asString() {
813
+ return value.value;
814
+ },
815
+ asByteArray() {
816
+ return value.valueRaw;
817
+ }
818
+ };
819
+ }
820
+ /**
821
+ * Extracts a integer state value out of an AppState dictionary
822
+ *
823
+ * @param state The state dictionary containing the state value
824
+ * @param key The key of the state value
825
+ * @returns An IntegerState instance containing the state value, or undefined if the key was not found
826
+ */
827
+ static getIntegerState(state, key) {
828
+ const value = state[key];
829
+ if (!value) return void 0;
830
+ if ("valueRaw" in value)
831
+ throw new Error(`Failed to parse state value for ${key}; received a byte array when expected a number`);
832
+ return {
833
+ asBigInt() {
834
+ return typeof value.value === "bigint" ? value.value : BigInt(value.value);
835
+ },
836
+ asNumber() {
837
+ return typeof value.value === "bigint" ? Number(value.value) : value.value;
838
+ }
839
+ };
840
+ }
841
+ /**
842
+ * Returns the smart contract's global state wrapped in a strongly typed accessor with options to format the stored value
843
+ */
844
+ async getGlobalState() {
845
+ const state = await this.appClient.getGlobalState();
846
+ return {
847
+ get collateralAssetId() {
848
+ return _MarketAppClient.getIntegerState(state, "collateral_asset_id");
849
+ },
850
+ get escrowCancelAddress() {
851
+ return _MarketAppClient.getBinaryState(state, "escrow_cancel_address");
852
+ },
853
+ get feeAddress() {
854
+ return _MarketAppClient.getBinaryState(state, "fee_address");
855
+ },
856
+ get feeBasePercent() {
857
+ return _MarketAppClient.getIntegerState(state, "fee_base_percent");
858
+ },
859
+ get feeTimerThreshold() {
860
+ return _MarketAppClient.getIntegerState(state, "fee_timer_threshold");
861
+ },
862
+ get isActivated() {
863
+ return _MarketAppClient.getIntegerState(state, "is_activated");
864
+ },
865
+ get isResolved() {
866
+ return _MarketAppClient.getIntegerState(state, "is_resolved");
867
+ },
868
+ get marketFriendAddr() {
869
+ return _MarketAppClient.getBinaryState(state, "market_friend_addr");
870
+ },
871
+ get noAssetId() {
872
+ return _MarketAppClient.getIntegerState(state, "no_asset_id");
873
+ },
874
+ get noSupply() {
875
+ return _MarketAppClient.getIntegerState(state, "no_supply");
876
+ },
877
+ get oracleAddress() {
878
+ return _MarketAppClient.getBinaryState(state, "oracle_address");
879
+ },
880
+ get outcome() {
881
+ return _MarketAppClient.getIntegerState(state, "outcome");
882
+ },
883
+ get resolutionTime() {
884
+ return _MarketAppClient.getIntegerState(state, "resolution_time");
885
+ },
886
+ get rules() {
887
+ return _MarketAppClient.getBinaryState(state, "rules");
888
+ },
889
+ get title() {
890
+ return _MarketAppClient.getBinaryState(state, "title");
891
+ },
892
+ get yesAssetId() {
893
+ return _MarketAppClient.getIntegerState(state, "yes_asset_id");
894
+ },
895
+ get yesSupply() {
896
+ return _MarketAppClient.getIntegerState(state, "yes_supply");
897
+ }
898
+ };
899
+ }
900
+ compose() {
901
+ const client = this;
902
+ const atc = new AtomicTransactionComposer();
903
+ let promiseChain = Promise.resolve();
904
+ const resultMappers = [];
905
+ return {
906
+ createEscrow(args, params) {
907
+ promiseChain = promiseChain.then(() => client.createEscrow(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
908
+ resultMappers.push(void 0);
909
+ return this;
910
+ },
911
+ activateMarket(args, params) {
912
+ promiseChain = promiseChain.then(() => client.activateMarket(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
913
+ resultMappers.push(void 0);
914
+ return this;
915
+ },
916
+ processPotentialMatch(args, params) {
917
+ promiseChain = promiseChain.then(() => client.processPotentialMatch(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
918
+ resultMappers.push(void 0);
919
+ return this;
920
+ },
921
+ resolveMarket(args, params) {
922
+ promiseChain = promiseChain.then(() => client.resolveMarket(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
923
+ resultMappers.push(void 0);
924
+ return this;
925
+ },
926
+ mergeShares(args, params) {
927
+ promiseChain = promiseChain.then(() => client.mergeShares(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
928
+ resultMappers.push(void 0);
929
+ return this;
930
+ },
931
+ splitShares(args, params) {
932
+ promiseChain = promiseChain.then(() => client.splitShares(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
933
+ resultMappers.push(void 0);
934
+ return this;
935
+ },
936
+ claim(args, params) {
937
+ promiseChain = promiseChain.then(() => client.claim(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
938
+ resultMappers.push(void 0);
939
+ return this;
940
+ },
941
+ donateExcessToMarketFriend(args, params) {
942
+ promiseChain = promiseChain.then(() => client.donateExcessToMarketFriend(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
943
+ resultMappers.push(void 0);
944
+ return this;
945
+ },
946
+ deleteEscrow(args, params) {
947
+ promiseChain = promiseChain.then(() => client.deleteEscrow(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
948
+ resultMappers.push(void 0);
949
+ return this;
950
+ },
951
+ doNoop(args, params) {
952
+ promiseChain = promiseChain.then(() => client.doNoop(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
953
+ resultMappers.push(void 0);
954
+ return this;
955
+ },
956
+ get update() {
957
+ const $this = this;
958
+ return {
959
+ onUpdate(args, params) {
960
+ promiseChain = promiseChain.then(() => client.update.onUpdate(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
961
+ resultMappers.push(void 0);
962
+ return $this;
963
+ }
964
+ };
965
+ },
966
+ get delete() {
967
+ const $this = this;
968
+ return {
969
+ delete(args, params) {
970
+ promiseChain = promiseChain.then(() => client.delete.delete(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
971
+ resultMappers.push(void 0);
972
+ return $this;
973
+ }
974
+ };
975
+ },
976
+ clearState(args) {
977
+ promiseChain = promiseChain.then(() => client.clearState({ ...args, sendParams: { ...args?.sendParams, skipSending: true, atc } }));
978
+ resultMappers.push(void 0);
979
+ return this;
980
+ },
981
+ addTransaction(txn, defaultSender) {
982
+ promiseChain = promiseChain.then(async () => atc.addTransaction(await algokit3.getTransactionWithSigner(txn, defaultSender ?? client.sender)));
983
+ return this;
984
+ },
985
+ async atc() {
986
+ await promiseChain;
987
+ return atc;
988
+ },
989
+ async simulate(options) {
990
+ await promiseChain;
991
+ const result = await atc.simulate(client.algod, new modelsv2.SimulateRequest({ txnGroups: [], ...options }));
992
+ return {
993
+ ...result,
994
+ returns: result.methodResults?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val.returnValue) : val.returnValue)
995
+ };
996
+ },
997
+ async execute(sendParams) {
998
+ await promiseChain;
999
+ const result = await algokit3.sendAtomicTransactionComposer({ atc, sendParams }, client.algod);
1000
+ return {
1001
+ ...result,
1002
+ returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val.returnValue) : val.returnValue)
1003
+ };
1004
+ }
1005
+ };
1006
+ }
1007
+ };
1008
+ var APP_SPEC2 = {
1009
+ "hints": {
1010
+ "on_create()uint8": {
1011
+ "call_config": {
1012
+ "no_op": "CREATE"
1013
+ }
1014
+ },
1015
+ "propose_a_match(application,application,uint64,address,address,address,uint64)uint8": {
1016
+ "call_config": {
1017
+ "no_op": "CALL"
1018
+ }
1019
+ }
1020
+ },
1021
+ "source": {
1022
+ "approval": "I3ByYWdtYSB2ZXJzaW9uIDgKaW50Y2Jsb2NrIDAgMSA2IDI1NgpieXRlY2Jsb2NrIDB4MDEgMHg2MzZmNmM2YzYxNzQ2NTcyNjE2YzVmNjE3MzczNjU3NDVmNjk2NCAweDc5NjU3MzVmNjE3MzczNjU3NDVmNjk2NCAweDZlNmY1ZjYxNzM3MzY1NzQ1ZjY5NjQgMHgxNTFmN2M3NSAweDAwCnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4NDNkYjYyYTEgLy8gIm9uX2NyZWF0ZSgpdWludDgiCj09CmJueiBtYWluX2w0CnR4bmEgQXBwbGljYXRpb25BcmdzIDAKcHVzaGJ5dGVzIDB4MTZhYzZkYmIgLy8gInByb3Bvc2VfYV9tYXRjaChhcHBsaWNhdGlvbixhcHBsaWNhdGlvbix1aW50NjQsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsdWludDY0KXVpbnQ4Igo9PQpibnogbWFpbl9sMwplcnIKbWFpbl9sMzoKdHhuIE9uQ29tcGxldGlvbgppbnRjXzAgLy8gTm9PcAo9PQp0eG4gQXBwbGljYXRpb25JRAppbnRjXzAgLy8gMAohPQomJgphc3NlcnQKY2FsbHN1YiBwcm9wb3NlYW1hdGNoY2FzdGVyXzQKaW50Y18xIC8vIDEKcmV0dXJuCm1haW5fbDQ6CnR4biBPbkNvbXBsZXRpb24KaW50Y18wIC8vIE5vT3AKPT0KdHhuIEFwcGxpY2F0aW9uSUQKaW50Y18wIC8vIDAKPT0KJiYKYXNzZXJ0CmNhbGxzdWIgb25jcmVhdGVjYXN0ZXJfMwppbnRjXzEgLy8gMQpyZXR1cm4KCi8vIGdsb2JhbF9tdXN0X2dldApnbG9iYWxtdXN0Z2V0XzA6CnByb3RvIDIgMQpmcmFtZV9kaWcgLTIKZnJhbWVfZGlnIC0xCmFwcF9nbG9iYWxfZ2V0X2V4CnN0b3JlIDIKc3RvcmUgMQpsb2FkIDIKYXNzZXJ0CmxvYWQgMQpyZXRzdWIKCi8vIG9uX2NyZWF0ZQpvbmNyZWF0ZV8xOgpwcm90byAwIDEKaW50Y18wIC8vIDAKaW50Y18xIC8vIDEKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCmludGNfMyAvLyAyNTYKPAphc3NlcnQKcmV0c3ViCgovLyBwcm9wb3NlX2FfbWF0Y2gKcHJvcG9zZWFtYXRjaF8yOgpwcm90byA3IDEKaW50Y18wIC8vIDAKdHhuIEdyb3VwSW5kZXgKZnJhbWVfZGlnIC0xCi0KZ3R4bnMgTGFzdExvZwpwdXNoaW50IDQgLy8gNAp0eG4gR3JvdXBJbmRleApmcmFtZV9kaWcgLTEKLQpndHhucyBMYXN0TG9nCmxlbgpwdXNoaW50IDQgLy8gNAotCmV4dHJhY3QzCmJ0b2kKc3RvcmUgMAppdHhuX2JlZ2luCmludGNfMiAvLyBhcHBsCml0eG5fZmllbGQgVHlwZUVudW0KZnJhbWVfZGlnIC02CnR4bmFzIEFwcGxpY2F0aW9ucwppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKbG9hZCAwCml0eG5fZmllbGQgQXBwbGljYXRpb25zCnB1c2hieXRlcyAweDMyY2UyODFlIC8vICJtYXRjaF9tYWtlcihhcHBsaWNhdGlvbix1aW50NjQpdWludDgiCml0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCmJ5dGVjXzAgLy8gMHgwMQppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpmcmFtZV9kaWcgLTUKaXRvYgppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwppbnRjXzAgLy8gMAppdHhuX2ZpZWxkIEZlZQpmcmFtZV9kaWcgLTQKaXR4bl9maWVsZCBBY2NvdW50cwpmcmFtZV9kaWcgLTIKaXR4bl9maWVsZCBBY2NvdW50cwpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCml0eG5fZmllbGQgQXBwbGljYXRpb25zCmxvYWQgMAppdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjXzEgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8wCml0eG5fZmllbGQgQXNzZXRzCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKYnl0ZWNfMiAvLyAieWVzX2Fzc2V0X2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMAppdHhuX2ZpZWxkIEFzc2V0cwpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjXzMgLy8gIm5vX2Fzc2V0X2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMAppdHhuX2ZpZWxkIEFzc2V0cwppdHhuX25leHQKaW50Y18yIC8vIGFwcGwKaXR4bl9maWVsZCBUeXBlRW51bQpsb2FkIDAKaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECmZyYW1lX2RpZyAtNgp0eG5hcyBBcHBsaWNhdGlvbnMKaXR4bl9maWVsZCBBcHBsaWNhdGlvbnMKcHVzaGJ5dGVzIDB4ZGI5MjJmYzIgLy8gIm1hdGNoX3Rha2VyKGFwcGxpY2F0aW9uKXVpbnQ2NCIKaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKYnl0ZWNfMCAvLyAweDAxCml0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCmludGNfMCAvLyAwCml0eG5fZmllbGQgRmVlCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKaXR4bl9maWVsZCBBcHBsaWNhdGlvbnMKZnJhbWVfZGlnIC02CnR4bmFzIEFwcGxpY2F0aW9ucwppdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjXzEgLy8gImNvbGxhdGVyYWxfYXNzZXRfaWQiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8wCml0eG5fZmllbGQgQXNzZXRzCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKYnl0ZWNfMiAvLyAieWVzX2Fzc2V0X2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMAppdHhuX2ZpZWxkIEFzc2V0cwpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCmJ5dGVjXzMgLy8gIm5vX2Fzc2V0X2lkIgpjYWxsc3ViIGdsb2JhbG11c3RnZXRfMAppdHhuX2ZpZWxkIEFzc2V0cwpmcmFtZV9kaWcgLTMKaXR4bl9maWVsZCBBY2NvdW50cwpmcmFtZV9kaWcgLTIKaXR4bl9maWVsZCBBY2NvdW50cwppdHhuX25leHQKaW50Y18yIC8vIGFwcGwKaXR4bl9maWVsZCBUeXBlRW51bQpmcmFtZV9kaWcgLTcKdHhuYXMgQXBwbGljYXRpb25zCml0eG5fZmllbGQgQXBwbGljYXRpb25JRApmcmFtZV9kaWcgLTYKdHhuYXMgQXBwbGljYXRpb25zCml0eG5fZmllbGQgQXBwbGljYXRpb25zCmxvYWQgMAppdHhuX2ZpZWxkIEFwcGxpY2F0aW9ucwpwdXNoYnl0ZXMgMHhiYTFkZWVmNSAvLyAicHJvY2Vzc19wb3RlbnRpYWxfbWF0Y2goYXBwbGljYXRpb24sYXBwbGljYXRpb24pdWludDgiCml0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCmJ5dGVjXzAgLy8gMHgwMQppdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwpwdXNoYnl0ZXMgMHgwMiAvLyAweDAyCml0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCmludGNfMCAvLyAwCml0eG5fZmllbGQgRmVlCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKYnl0ZWNfMSAvLyAiY29sbGF0ZXJhbF9hc3NldF9pZCIKY2FsbHN1YiBnbG9iYWxtdXN0Z2V0XzAKaXR4bl9maWVsZCBBc3NldHMKZnJhbWVfZGlnIC03CnR4bmFzIEFwcGxpY2F0aW9ucwpieXRlY18yIC8vICJ5ZXNfYXNzZXRfaWQiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8wCml0eG5fZmllbGQgQXNzZXRzCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKYnl0ZWNfMyAvLyAibm9fYXNzZXRfaWQiCmNhbGxzdWIgZ2xvYmFsbXVzdGdldF8wCml0eG5fZmllbGQgQXNzZXRzCmZyYW1lX2RpZyAtMwppdHhuX2ZpZWxkIEFjY291bnRzCmZyYW1lX2RpZyAtNAppdHhuX2ZpZWxkIEFjY291bnRzCmZyYW1lX2RpZyAtMgppdHhuX2ZpZWxkIEFjY291bnRzCml0eG5fbmV4dAppbnRjXzIgLy8gYXBwbAppdHhuX2ZpZWxkIFR5cGVFbnVtCmZyYW1lX2RpZyAtNwp0eG5hcyBBcHBsaWNhdGlvbnMKaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECmludGNfMCAvLyBOb09wCml0eG5fZmllbGQgT25Db21wbGV0aW9uCnB1c2hieXRlcyAweGI0ZjExYTE4IC8vICJkb19ub29wKHVpbnQ2NCl1aW50NjQiCml0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCmludGNfMSAvLyAxCml0b2IKaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKaW50Y18wIC8vIDAKaXR4bl9maWVsZCBGZWUKaXR4bl9zdWJtaXQKaW50Y18xIC8vIDEKZnJhbWVfYnVyeSAwCmZyYW1lX2RpZyAwCmludGNfMyAvLyAyNTYKPAphc3NlcnQKcmV0c3ViCgovLyBvbl9jcmVhdGVfY2FzdGVyCm9uY3JlYXRlY2FzdGVyXzM6CnByb3RvIDAgMAppbnRjXzAgLy8gMApjYWxsc3ViIG9uY3JlYXRlXzEKZnJhbWVfYnVyeSAwCmJ5dGVjIDQgLy8gMHgxNTFmN2M3NQpieXRlYyA1IC8vIDB4MDAKaW50Y18wIC8vIDAKZnJhbWVfZGlnIDAKc2V0Ynl0ZQpjb25jYXQKbG9nCnJldHN1YgoKLy8gcHJvcG9zZV9hX21hdGNoX2Nhc3Rlcgpwcm9wb3NlYW1hdGNoY2FzdGVyXzQ6CnByb3RvIDAgMAppbnRjXzAgLy8gMApkdXBuIDMKcHVzaGJ5dGVzIDB4IC8vICIiCmR1cG4gMgppbnRjXzAgLy8gMAp0eG5hIEFwcGxpY2F0aW9uQXJncyAxCmludGNfMCAvLyAwCmdldGJ5dGUKZnJhbWVfYnVyeSAxCnR4bmEgQXBwbGljYXRpb25BcmdzIDIKaW50Y18wIC8vIDAKZ2V0Ynl0ZQpmcmFtZV9idXJ5IDIKdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwpidG9pCmZyYW1lX2J1cnkgMwp0eG5hIEFwcGxpY2F0aW9uQXJncyA0CmZyYW1lX2J1cnkgNAp0eG5hIEFwcGxpY2F0aW9uQXJncyA1CmZyYW1lX2J1cnkgNQp0eG5hIEFwcGxpY2F0aW9uQXJncyA2CmZyYW1lX2J1cnkgNgp0eG5hIEFwcGxpY2F0aW9uQXJncyA3CmJ0b2kKZnJhbWVfYnVyeSA3CmZyYW1lX2RpZyAxCmZyYW1lX2RpZyAyCmZyYW1lX2RpZyAzCmZyYW1lX2RpZyA0CmZyYW1lX2RpZyA1CmZyYW1lX2RpZyA2CmZyYW1lX2RpZyA3CmNhbGxzdWIgcHJvcG9zZWFtYXRjaF8yCmZyYW1lX2J1cnkgMApieXRlYyA0IC8vIDB4MTUxZjdjNzUKYnl0ZWMgNSAvLyAweDAwCmludGNfMCAvLyAwCmZyYW1lX2RpZyAwCnNldGJ5dGUKY29uY2F0CmxvZwpyZXRzdWI=",
1023
+ "clear": "I3ByYWdtYSB2ZXJzaW9uIDgKcHVzaGludCAwIC8vIDAKcmV0dXJu"
1024
+ },
1025
+ "state": {
1026
+ "global": {
1027
+ "num_byte_slices": 0,
1028
+ "num_uints": 0
1029
+ },
1030
+ "local": {
1031
+ "num_byte_slices": 0,
1032
+ "num_uints": 0
1033
+ }
1034
+ },
1035
+ "schema": {
1036
+ "global": {
1037
+ "declared": {},
1038
+ "reserved": {}
1039
+ },
1040
+ "local": {
1041
+ "declared": {},
1042
+ "reserved": {}
1043
+ }
1044
+ },
1045
+ "contract": {
1046
+ "name": "matcher_app",
1047
+ "methods": [
1048
+ {
1049
+ "name": "on_create",
1050
+ "args": [],
1051
+ "returns": {
1052
+ "type": "uint8"
1053
+ }
1054
+ },
1055
+ {
1056
+ "name": "propose_a_match",
1057
+ "args": [
1058
+ {
1059
+ "type": "application",
1060
+ "name": "market_app"
1061
+ },
1062
+ {
1063
+ "type": "application",
1064
+ "name": "maker"
1065
+ },
1066
+ {
1067
+ "type": "uint64",
1068
+ "name": "quantity_matched"
1069
+ },
1070
+ {
1071
+ "type": "address",
1072
+ "name": "taker_address"
1073
+ },
1074
+ {
1075
+ "type": "address",
1076
+ "name": "maker_address"
1077
+ },
1078
+ {
1079
+ "type": "address",
1080
+ "name": "fee_address"
1081
+ },
1082
+ {
1083
+ "type": "uint64",
1084
+ "name": "taker_app_created_index_offset"
1085
+ }
1086
+ ],
1087
+ "returns": {
1088
+ "type": "uint8"
1089
+ }
1090
+ }
1091
+ ],
1092
+ "networks": {}
1093
+ },
1094
+ "bare_call_config": {}
1095
+ };
1096
+ var MatcherAppCallFactory = class {
1097
+ /**
1098
+ * Gets available create call factories
1099
+ */
1100
+ static get create() {
1101
+ return {
1102
+ /**
1103
+ * Constructs a create call for the matcher_app smart contract using the on_create()uint8 ABI method
1104
+ *
1105
+ * @param args Any args for the contract call
1106
+ * @param params Any additional parameters for the call
1107
+ * @returns A TypedCallParams object for the call
1108
+ */
1109
+ onCreate(args, params = {}) {
1110
+ return {
1111
+ method: "on_create()uint8",
1112
+ methodArgs: Array.isArray(args) ? args : [],
1113
+ ...params
1114
+ };
1115
+ }
1116
+ };
1117
+ }
1118
+ /**
1119
+ * Constructs a no op call for the propose_a_match(application,application,uint64,address,address,address,uint64)uint8 ABI method
1120
+ *
1121
+ * @param args Any args for the contract call
1122
+ * @param params Any additional parameters for the call
1123
+ * @returns A TypedCallParams object for the call
1124
+ */
1125
+ static proposeAMatch(args, params) {
1126
+ return {
1127
+ method: "propose_a_match(application,application,uint64,address,address,address,uint64)uint8",
1128
+ methodArgs: Array.isArray(args) ? args : [args.marketApp, args.maker, args.quantityMatched, args.takerAddress, args.makerAddress, args.feeAddress, args.takerAppCreatedIndexOffset],
1129
+ ...params
1130
+ };
1131
+ }
1132
+ };
1133
+ var MatcherAppClient = class {
1134
+ /**
1135
+ * Creates a new instance of `MatcherAppClient`
1136
+ *
1137
+ * @param appDetails appDetails The details to identify the app to deploy
1138
+ * @param algod An algod client instance
1139
+ */
1140
+ constructor(appDetails, algod) {
1141
+ this.algod = algod;
1142
+ this.sender = appDetails.sender;
1143
+ this.appClient = algokit3.getAppClient({
1144
+ ...appDetails,
1145
+ app: APP_SPEC2
1146
+ }, algod);
1147
+ }
1148
+ /**
1149
+ * The underlying `ApplicationClient` for when you want to have more flexibility
1150
+ */
1151
+ appClient;
1152
+ sender;
1153
+ /**
1154
+ * Checks for decode errors on the AppCallTransactionResult and maps the return value to the specified generic type
1155
+ *
1156
+ * @param result The AppCallTransactionResult to be mapped
1157
+ * @param returnValueFormatter An optional delegate to format the return value if required
1158
+ * @returns The smart contract response with an updated return value
1159
+ */
1160
+ mapReturnValue(result, returnValueFormatter) {
1161
+ if (result.return?.decodeError) {
1162
+ throw result.return.decodeError;
1163
+ }
1164
+ const returnValue = result.return?.returnValue !== void 0 && returnValueFormatter !== void 0 ? returnValueFormatter(result.return.returnValue) : result.return?.returnValue;
1165
+ return { ...result, return: returnValue };
1166
+ }
1167
+ /**
1168
+ * Calls the ABI method with the matching signature using an onCompletion code of NO_OP
1169
+ *
1170
+ * @param typedCallParams An object containing the method signature, args, and any other relevant parameters
1171
+ * @param returnValueFormatter An optional delegate which when provided will be used to map non-undefined return values to the target type
1172
+ * @returns The result of the smart contract call
1173
+ */
1174
+ async call(typedCallParams, returnValueFormatter) {
1175
+ return this.mapReturnValue(await this.appClient.call(typedCallParams), returnValueFormatter);
1176
+ }
1177
+ /**
1178
+ * Idempotently deploys the matcher_app smart contract.
1179
+ *
1180
+ * @param params The arguments for the contract calls and any additional parameters for the call
1181
+ * @returns The deployment result
1182
+ */
1183
+ deploy(params = {}) {
1184
+ const createArgs = params.createCall?.(MatcherAppCallFactory.create);
1185
+ return this.appClient.deploy({
1186
+ ...params,
1187
+ createArgs,
1188
+ createOnCompleteAction: createArgs?.onCompleteAction
1189
+ });
1190
+ }
1191
+ /**
1192
+ * Gets available create methods
1193
+ */
1194
+ get create() {
1195
+ const $this = this;
1196
+ return {
1197
+ /**
1198
+ * Creates a new instance of the matcher_app smart contract using the on_create()uint8 ABI method.
1199
+ *
1200
+ * @param args The arguments for the smart contract call
1201
+ * @param params Any additional parameters for the call
1202
+ * @returns The create result
1203
+ */
1204
+ async onCreate(args, params = {}) {
1205
+ return $this.mapReturnValue(await $this.appClient.create(MatcherAppCallFactory.create.onCreate(args, params)));
1206
+ }
1207
+ };
1208
+ }
1209
+ /**
1210
+ * Makes a clear_state call to an existing instance of the matcher_app smart contract.
1211
+ *
1212
+ * @param args The arguments for the bare call
1213
+ * @returns The clear_state result
1214
+ */
1215
+ clearState(args = {}) {
1216
+ return this.appClient.clearState(args);
1217
+ }
1218
+ /**
1219
+ * Calls the propose_a_match(application,application,uint64,address,address,address,uint64)uint8 ABI method.
1220
+ *
1221
+ * @param args The arguments for the contract call
1222
+ * @param params Any additional parameters for the call
1223
+ * @returns The result of the call
1224
+ */
1225
+ proposeAMatch(args, params = {}) {
1226
+ return this.call(MatcherAppCallFactory.proposeAMatch(args, params));
1227
+ }
1228
+ compose() {
1229
+ const client = this;
1230
+ const atc = new AtomicTransactionComposer();
1231
+ let promiseChain = Promise.resolve();
1232
+ const resultMappers = [];
1233
+ return {
1234
+ proposeAMatch(args, params) {
1235
+ promiseChain = promiseChain.then(() => client.proposeAMatch(args, { ...params, sendParams: { ...params?.sendParams, skipSending: true, atc } }));
1236
+ resultMappers.push(void 0);
1237
+ return this;
1238
+ },
1239
+ clearState(args) {
1240
+ promiseChain = promiseChain.then(() => client.clearState({ ...args, sendParams: { ...args?.sendParams, skipSending: true, atc } }));
1241
+ resultMappers.push(void 0);
1242
+ return this;
1243
+ },
1244
+ addTransaction(txn, defaultSender) {
1245
+ promiseChain = promiseChain.then(async () => atc.addTransaction(await algokit3.getTransactionWithSigner(txn, defaultSender ?? client.sender)));
1246
+ return this;
1247
+ },
1248
+ async atc() {
1249
+ await promiseChain;
1250
+ return atc;
1251
+ },
1252
+ async simulate(options) {
1253
+ await promiseChain;
1254
+ const result = await atc.simulate(client.algod, new modelsv2.SimulateRequest({ txnGroups: [], ...options }));
1255
+ return {
1256
+ ...result,
1257
+ returns: result.methodResults?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val.returnValue) : val.returnValue)
1258
+ };
1259
+ },
1260
+ async execute(sendParams) {
1261
+ await promiseChain;
1262
+ const result = await algokit3.sendAtomicTransactionComposer({ atc, sendParams }, client.algod);
1263
+ return {
1264
+ ...result,
1265
+ returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val.returnValue) : val.returnValue)
1266
+ };
1267
+ }
1268
+ };
1269
+ }
1270
+ };
1271
+ var calculateFee = (quantity, price, feeBase) => {
1272
+ const q = new Decimal(quantity.toString());
1273
+ const p = new Decimal(price.toString()).div(1e6);
1274
+ const fb = new Decimal(feeBase.toString()).div(1e6);
1275
+ const fee = fb.mul(q).mul(p).mul(new Decimal(1).minus(p));
1276
+ return Math.ceil(fee.toNumber());
1277
+ };
1278
+ var calculateFeeFromTotal = (totalAmount, price, feeBase) => {
1279
+ const total = new Decimal(totalAmount.toString());
1280
+ const p = new Decimal(price.toString()).div(1e6);
1281
+ const fb = new Decimal(feeBase.toString()).div(1e6);
1282
+ const denominator = p.mul(new Decimal(1).plus(fb.mul(new Decimal(1).minus(p))));
1283
+ const quantity = total.div(denominator);
1284
+ const fee = fb.mul(quantity).mul(p).mul(new Decimal(1).minus(p));
1285
+ return Math.ceil(fee.toNumber());
1286
+ };
1287
+ var decodeGlobalState = (rawState) => {
1288
+ const state = {};
1289
+ for (const item of rawState) {
1290
+ const key = Buffer.from(item.key, "base64").toString();
1291
+ if (item.value.type === 1) {
1292
+ if (key === "owner" || key === "oracle_address" || key === "fee_address" || key === "market_friend_addr" || key === "escrow_cancel_address") {
1293
+ try {
1294
+ const addressBytes = Buffer.from(item.value.bytes, "base64");
1295
+ if (addressBytes.length === 32) {
1296
+ state[key] = algosdk2.encodeAddress(addressBytes);
1297
+ } else {
1298
+ state[key] = item.value.bytes;
1299
+ }
1300
+ } catch {
1301
+ state[key] = item.value.bytes;
1302
+ }
1303
+ } else {
1304
+ try {
1305
+ state[key] = Buffer.from(item.value.bytes, "base64").toString();
1306
+ } catch {
1307
+ state[key] = item.value.bytes;
1308
+ }
1309
+ }
1310
+ } else {
1311
+ state[key] = Number(item.value.uint);
1312
+ }
1313
+ }
1314
+ return state;
1315
+ };
1316
+ var getMarketGlobalState = async (algodClient, marketAppId) => {
1317
+ const appInfo = await algodClient.getApplicationByID(marketAppId).do();
1318
+ const rawState = appInfo.params?.["global-state"] ?? appInfo["params"]?.["global-state"] ?? [];
1319
+ return decodeGlobalState(rawState);
1320
+ };
1321
+ var getEscrowGlobalState = async (indexerClient, escrowAppId) => {
1322
+ const appInfo = await indexerClient.lookupApplications(escrowAppId).do();
1323
+ const rawState = appInfo.application?.params?.["global-state"] ?? [];
1324
+ return decodeGlobalState(rawState);
1325
+ };
1326
+ var checkAssetOptIn = async (algodClient, address, assetId) => {
1327
+ try {
1328
+ const accountInfo = await algodClient.accountInformation(address).do();
1329
+ const assets = accountInfo.assets || accountInfo["assets"] || [];
1330
+ return assets.some((a) => (a["asset-id"] ?? a.assetId) === assetId);
1331
+ } catch {
1332
+ return false;
1333
+ }
1334
+ };
1335
+
1336
+ // src/utils/matching.ts
1337
+ var calculateMatchingOrders = (orderbook, isBuying, isYes, quantity, price, slippageTolerance) => {
1338
+ const { yes, no } = orderbook;
1339
+ const getMatchingOrders = () => {
1340
+ if (isBuying) {
1341
+ if (isYes) {
1342
+ const directOrders = yes.asks;
1343
+ const complementaryOrders = no.bids.map((bid) => ({
1344
+ price: 1e6 - bid.price,
1345
+ quantity: bid.quantity,
1346
+ escrowAppId: bid.escrowAppId,
1347
+ owner: bid.owner
1348
+ }));
1349
+ const allOrders = [...directOrders, ...complementaryOrders].sort((a, b) => a.price - b.price);
1350
+ return allOrders.filter((order) => order.price <= price + slippageTolerance);
1351
+ } else {
1352
+ const directOrders = no.asks;
1353
+ const complementaryOrders = yes.bids.map((bid) => ({
1354
+ price: 1e6 - bid.price,
1355
+ quantity: bid.quantity,
1356
+ escrowAppId: bid.escrowAppId,
1357
+ owner: bid.owner
1358
+ }));
1359
+ const allOrders = [...directOrders, ...complementaryOrders].sort((a, b) => a.price - b.price);
1360
+ return allOrders.filter((order) => order.price <= price + slippageTolerance);
1361
+ }
1362
+ } else {
1363
+ if (isYes) {
1364
+ const directOrders = yes.bids;
1365
+ const complementaryOrders = no.asks.map((ask) => ({
1366
+ price: 1e6 - ask.price,
1367
+ quantity: ask.quantity,
1368
+ escrowAppId: ask.escrowAppId,
1369
+ owner: ask.owner
1370
+ }));
1371
+ const allOrders = [...directOrders, ...complementaryOrders].sort((a, b) => b.price - a.price);
1372
+ return allOrders.filter((order) => order.price >= price - slippageTolerance);
1373
+ } else {
1374
+ const directOrders = no.bids;
1375
+ const complementaryOrders = yes.asks.map((ask) => ({
1376
+ price: 1e6 - ask.price,
1377
+ quantity: ask.quantity,
1378
+ escrowAppId: ask.escrowAppId,
1379
+ owner: ask.owner
1380
+ }));
1381
+ const allOrders = [...directOrders, ...complementaryOrders].sort((a, b) => b.price - a.price);
1382
+ return allOrders.filter((order) => order.price >= price - slippageTolerance);
1383
+ }
1384
+ }
1385
+ };
1386
+ const matchingOrders = getMatchingOrders();
1387
+ if (matchingOrders.length === 0) return [];
1388
+ const matches = [];
1389
+ let volumeLeft = quantity;
1390
+ for (const counterParty of matchingOrders) {
1391
+ if (volumeLeft <= 0) break;
1392
+ const amountToTake = Math.min(counterParty.quantity, volumeLeft);
1393
+ if (amountToTake > 0) {
1394
+ matches.push({
1395
+ escrowAppId: counterParty.escrowAppId,
1396
+ quantity: amountToTake,
1397
+ owner: counterParty.owner
1398
+ });
1399
+ volumeLeft -= amountToTake;
1400
+ }
1401
+ }
1402
+ return matches;
1403
+ };
1404
+ var getAllCreatedApplications = async (indexerClient, address, limit = 100) => {
1405
+ let applications = [];
1406
+ let nextToken;
1407
+ let hasMore = true;
1408
+ while (hasMore) {
1409
+ let query = indexerClient.lookupAccountCreatedApplications(address).limit(limit);
1410
+ if (nextToken) {
1411
+ query = query.nextToken(nextToken);
1412
+ }
1413
+ const response = await query.do();
1414
+ if (response.applications?.length) {
1415
+ applications = [...applications, ...response.applications];
1416
+ }
1417
+ if (response["next-token"]) {
1418
+ nextToken = response["next-token"];
1419
+ } else {
1420
+ hasMore = false;
1421
+ }
1422
+ }
1423
+ return applications.filter((a) => a.deleted === false);
1424
+ };
1425
+ var fetchApplicationsGlobalState = async (indexerClient, applications) => {
1426
+ return Promise.all(
1427
+ applications.map(async (app) => {
1428
+ const appId = app.id;
1429
+ try {
1430
+ const appInfo = await indexerClient.lookupApplications(appId).do();
1431
+ const globalState = {};
1432
+ const rawGlobalState = appInfo.application?.params?.["global-state"];
1433
+ if (rawGlobalState) {
1434
+ const decoded = decodeGlobalState(rawGlobalState);
1435
+ Object.assign(globalState, decoded);
1436
+ }
1437
+ return { appId: Number(appId), globalState };
1438
+ } catch {
1439
+ return { appId: 0, globalState: {} };
1440
+ }
1441
+ })
1442
+ );
1443
+ };
1444
+ var transformOrders = (orders) => orders.filter((o) => o.appId > 0).map((o) => ({
1445
+ price: o.globalState.price ?? 0,
1446
+ quantity: (o.globalState.quantity ?? 0) - (o.globalState.quantity_filled ?? 0),
1447
+ escrowAppId: o.appId,
1448
+ owner: o.globalState.owner ?? ""
1449
+ }));
1450
+ var getOrderbook = async (config, marketAppId) => {
1451
+ const appAddress = algosdk2.getApplicationAddress(marketAppId);
1452
+ const applications = await getAllCreatedApplications(config.indexerClient, appAddress);
1453
+ const appsWithState = await fetchApplicationsGlobalState(config.indexerClient, applications);
1454
+ const isOpenLimitOrder = (o) => (o.globalState.quantity ?? 0) > (o.globalState.quantity_filled ?? 0) && o.globalState.slippage === 0;
1455
+ const yesBuyOrders = appsWithState.filter(
1456
+ (o) => o.globalState.side === 1 && o.globalState.position === 1 && isOpenLimitOrder(o)
1457
+ );
1458
+ const yesSellOrders = appsWithState.filter(
1459
+ (o) => o.globalState.side === 0 && o.globalState.position === 1 && isOpenLimitOrder(o)
1460
+ );
1461
+ const noBuyOrders = appsWithState.filter(
1462
+ (o) => o.globalState.side === 1 && o.globalState.position === 0 && isOpenLimitOrder(o)
1463
+ );
1464
+ const noSellOrders = appsWithState.filter(
1465
+ (o) => o.globalState.side === 0 && o.globalState.position === 0 && isOpenLimitOrder(o)
1466
+ );
1467
+ return {
1468
+ yes: {
1469
+ bids: transformOrders(yesBuyOrders),
1470
+ asks: transformOrders(yesSellOrders)
1471
+ },
1472
+ no: {
1473
+ bids: transformOrders(noBuyOrders),
1474
+ asks: transformOrders(noSellOrders)
1475
+ }
1476
+ };
1477
+ };
1478
+ var getOpenOrders = async (config, marketAppId, walletAddress) => {
1479
+ const owner = walletAddress ?? config.activeAddress;
1480
+ const appAddress = algosdk2.getApplicationAddress(marketAppId);
1481
+ const applications = await getAllCreatedApplications(config.indexerClient, appAddress);
1482
+ const appsWithState = await fetchApplicationsGlobalState(config.indexerClient, applications);
1483
+ return appsWithState.filter(
1484
+ (o) => o.globalState.owner === owner && (o.globalState.quantity ?? 0) > (o.globalState.quantity_filled ?? 0)
1485
+ ).map((o) => ({
1486
+ escrowAppId: o.appId,
1487
+ marketAppId,
1488
+ position: o.globalState.position ?? 0,
1489
+ side: o.globalState.side ?? 0,
1490
+ price: o.globalState.price ?? 0,
1491
+ quantity: o.globalState.quantity ?? 0,
1492
+ quantityFilled: o.globalState.quantity_filled ?? 0,
1493
+ slippage: o.globalState.slippage ?? 0,
1494
+ owner: o.globalState.owner ?? ""
1495
+ }));
1496
+ };
1497
+
1498
+ // src/modules/trading.ts
1499
+ var extractEscrowAppId = async (algodClient, indexerClient, targetTxId) => {
1500
+ try {
1501
+ const pendingInfo = await algodClient.pendingTransactionInformation(targetTxId).do();
1502
+ if (pendingInfo?.["inner-txns"]?.[0]?.["created-application-index"]) {
1503
+ return pendingInfo["inner-txns"][0]["created-application-index"];
1504
+ }
1505
+ } catch {
1506
+ }
1507
+ const backoffs = [1e3, 1500, 2e3, 3e3, 5e3, 8e3];
1508
+ for (const delayMs of backoffs) {
1509
+ try {
1510
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
1511
+ const txnLookup = await indexerClient.lookupTransactionByID(targetTxId).do();
1512
+ if (txnLookup?.transaction?.["inner-txns"]?.[0]?.["created-application-index"]) {
1513
+ return txnLookup.transaction["inner-txns"][0]["created-application-index"];
1514
+ }
1515
+ } catch {
1516
+ }
1517
+ }
1518
+ return 0;
1519
+ };
1520
+ var createLimitOrder = async (config, params) => {
1521
+ return createOrder(config, { ...params, slippage: 0, matchingOrders: [] });
1522
+ };
1523
+ var createMarketOrder = async (config, params) => {
1524
+ let matchingOrders = params.matchingOrders;
1525
+ if (!matchingOrders) {
1526
+ const orderbook = await getOrderbook(config, params.marketAppId);
1527
+ matchingOrders = calculateMatchingOrders(
1528
+ orderbook,
1529
+ params.isBuying,
1530
+ params.position === 1,
1531
+ params.quantity,
1532
+ params.price,
1533
+ params.slippage
1534
+ );
1535
+ }
1536
+ const totalMatchedQuantity = matchingOrders.reduce((sum, o) => sum + o.quantity, 0);
1537
+ const result = await createOrder(config, {
1538
+ ...params,
1539
+ matchingOrders
1540
+ });
1541
+ return { ...result, matchedQuantity: totalMatchedQuantity };
1542
+ };
1543
+ var createOrder = async (config, params) => {
1544
+ const { algodClient, indexerClient, signer, activeAddress, matcherAppId, usdcAssetId, feeAddress } = config;
1545
+ const { marketAppId, position, price, quantity, isBuying, slippage, matchingOrders } = params;
1546
+ const globalState = await getMarketGlobalState(algodClient, marketAppId);
1547
+ const yesAssetId = globalState.yes_asset_id;
1548
+ const noAssetId = globalState.no_asset_id;
1549
+ const feeBase = params.feeBase ?? globalState.fee_base_percent;
1550
+ const marketFeeAddress = globalState.fee_address || feeAddress;
1551
+ const signerAccount = { signer, addr: activeAddress };
1552
+ const marketClient = new MarketAppClient(
1553
+ { resolveBy: "id", id: marketAppId, sender: signerAccount },
1554
+ algodClient
1555
+ );
1556
+ const matcherClient = new MatcherAppClient(
1557
+ { resolveBy: "id", id: matcherAppId, sender: signerAccount },
1558
+ algodClient
1559
+ );
1560
+ let fee = 0;
1561
+ if (isBuying) {
1562
+ fee = calculateFee(quantity, price + slippage, feeBase);
1563
+ }
1564
+ const marketAddress = getApplicationAddress(marketAppId);
1565
+ const atc = new AtomicTransactionComposer();
1566
+ let createEscrowTxnIndex = 0;
1567
+ if (!isBuying) {
1568
+ const hasUsdcOptIn = await checkAssetOptIn(algodClient, activeAddress, usdcAssetId);
1569
+ if (!hasUsdcOptIn) {
1570
+ const optInTxn = await algokit3.transferAsset(
1571
+ { from: signerAccount, to: activeAddress, assetId: usdcAssetId, amount: 0, skipSending: true },
1572
+ algodClient
1573
+ );
1574
+ atc.addTransaction({ txn: optInTxn.transaction, signer });
1575
+ createEscrowTxnIndex++;
1576
+ }
1577
+ } else {
1578
+ const assetId = position === 1 ? yesAssetId : noAssetId;
1579
+ const hasAssetOptIn = await checkAssetOptIn(algodClient, activeAddress, assetId);
1580
+ if (!hasAssetOptIn) {
1581
+ const optInTxn = await algokit3.transferAsset(
1582
+ { from: signerAccount, to: activeAddress, assetId, amount: 0, skipSending: true },
1583
+ algodClient
1584
+ );
1585
+ atc.addTransaction({ txn: optInTxn.transaction, signer });
1586
+ createEscrowTxnIndex++;
1587
+ }
1588
+ }
1589
+ const paymentTxn = await algokit3.transferAlgos(
1590
+ { from: signerAccount, to: marketAddress, amount: algokit3.microAlgos(957e3), skipSending: true },
1591
+ algodClient
1592
+ );
1593
+ atc.addTransaction({ txn: paymentTxn.transaction, signer });
1594
+ createEscrowTxnIndex++;
1595
+ const fundAmount = isBuying ? Math.floor(quantity * (price + slippage) / 1e6) + fee : quantity;
1596
+ const fundAssetId = isBuying ? usdcAssetId : position === 1 ? yesAssetId : noAssetId;
1597
+ const assetTransferTxn = await algokit3.transferAsset(
1598
+ { from: signerAccount, to: marketAddress, amount: fundAmount, assetId: fundAssetId, skipSending: true },
1599
+ algodClient
1600
+ );
1601
+ atc.addTransaction({ txn: assetTransferTxn.transaction, signer });
1602
+ createEscrowTxnIndex++;
1603
+ const createEscrowTxn = await marketClient.createEscrow(
1604
+ { price, quantity, slippage, position },
1605
+ { assets: [usdcAssetId, yesAssetId, noAssetId], sendParams: { skipSending: true } }
1606
+ );
1607
+ atc.addTransaction({ txn: createEscrowTxn.transaction, signer });
1608
+ let matchIndex = 1;
1609
+ for (const matchingOrder of matchingOrders) {
1610
+ const payCounterPartyTxn = await algokit3.transferAlgos(
1611
+ {
1612
+ from: signerAccount,
1613
+ to: getApplicationAddress(matchingOrder.escrowAppId),
1614
+ amount: algokit3.microAlgos(1e3 * (isBuying ? 1 : 2)),
1615
+ skipSending: true
1616
+ },
1617
+ algodClient
1618
+ );
1619
+ atc.addTransaction({ txn: payCounterPartyTxn.transaction, signer });
1620
+ const proposeAMatchTxn = await matcherClient.proposeAMatch(
1621
+ {
1622
+ marketApp: marketAppId,
1623
+ maker: matchingOrder.escrowAppId,
1624
+ quantityMatched: Math.min(matchingOrder.quantity, quantity),
1625
+ takerAddress: activeAddress,
1626
+ makerAddress: matchingOrder.owner,
1627
+ feeAddress: marketFeeAddress,
1628
+ takerAppCreatedIndexOffset: matchIndex * 2
1629
+ },
1630
+ {
1631
+ assets: [usdcAssetId, yesAssetId, noAssetId],
1632
+ accounts: [activeAddress, marketFeeAddress, matchingOrder.owner],
1633
+ sendParams: { skipSending: true, fee: algokit3.microAlgos(1e4) }
1634
+ }
1635
+ );
1636
+ atc.addTransaction({ txn: proposeAMatchTxn.transaction, signer });
1637
+ matchIndex++;
1638
+ }
1639
+ const result = await atc.execute(algodClient, 4);
1640
+ const targetTxId = result.txIDs[createEscrowTxnIndex];
1641
+ const escrowAppId = await extractEscrowAppId(algodClient, indexerClient, targetTxId);
1642
+ return {
1643
+ escrowAppId,
1644
+ txIds: result.txIDs,
1645
+ confirmedRound: result.confirmedRound
1646
+ };
1647
+ };
1648
+ var cancelOrder = async (config, params) => {
1649
+ const { algodClient, signer, usdcAssetId } = config;
1650
+ const { marketAppId, escrowAppId, orderOwner } = params;
1651
+ const globalState = await getMarketGlobalState(algodClient, marketAppId);
1652
+ const yesAssetId = globalState.yes_asset_id;
1653
+ const noAssetId = globalState.no_asset_id;
1654
+ const signerAccount = { signer, addr: orderOwner };
1655
+ const marketClient = new MarketAppClient(
1656
+ { resolveBy: "id", id: marketAppId, sender: signerAccount },
1657
+ algodClient
1658
+ );
1659
+ const atc = new AtomicTransactionComposer();
1660
+ const deleteCallTxn = await marketClient.deleteEscrow(
1661
+ { escrowAppId, algoReceiver: orderOwner },
1662
+ {
1663
+ apps: [escrowAppId],
1664
+ assets: [usdcAssetId, yesAssetId, noAssetId],
1665
+ accounts: [orderOwner],
1666
+ sendParams: { skipSending: true, fee: algokit3.microAlgos(7e3) }
1667
+ }
1668
+ );
1669
+ atc.addTransaction({ txn: deleteCallTxn.transaction, signer });
1670
+ const result = await atc.execute(algodClient, 4);
1671
+ return {
1672
+ success: true,
1673
+ txIds: result.txIDs
1674
+ };
1675
+ };
1676
+ var proposeMatch = async (config, params) => {
1677
+ const { algodClient, signer, activeAddress, matcherAppId, usdcAssetId, feeAddress } = config;
1678
+ const { marketAppId, makerEscrowAppId, makerAddress, quantityMatched } = params;
1679
+ const globalState = await getMarketGlobalState(algodClient, marketAppId);
1680
+ const yesAssetId = globalState.yes_asset_id;
1681
+ const noAssetId = globalState.no_asset_id;
1682
+ const marketFeeAddress = globalState.fee_address || feeAddress;
1683
+ const signerAccount = { signer, addr: activeAddress };
1684
+ const matcherClient = new MatcherAppClient(
1685
+ { resolveBy: "id", id: matcherAppId, sender: signerAccount },
1686
+ algodClient
1687
+ );
1688
+ const atc = new AtomicTransactionComposer();
1689
+ const payMakerTxn = await algokit3.transferAlgos(
1690
+ {
1691
+ from: signerAccount,
1692
+ to: getApplicationAddress(makerEscrowAppId),
1693
+ amount: algokit3.microAlgos(2e3),
1694
+ skipSending: true
1695
+ },
1696
+ algodClient
1697
+ );
1698
+ atc.addTransaction({ txn: payMakerTxn.transaction, signer });
1699
+ const proposeTxn = await matcherClient.proposeAMatch(
1700
+ {
1701
+ marketApp: marketAppId,
1702
+ maker: makerEscrowAppId,
1703
+ quantityMatched,
1704
+ takerAddress: activeAddress,
1705
+ makerAddress,
1706
+ feeAddress: marketFeeAddress,
1707
+ takerAppCreatedIndexOffset: 0
1708
+ },
1709
+ {
1710
+ assets: [usdcAssetId, yesAssetId, noAssetId],
1711
+ accounts: [activeAddress, marketFeeAddress, makerAddress],
1712
+ sendParams: { skipSending: true, fee: algokit3.microAlgos(1e4) }
1713
+ }
1714
+ );
1715
+ atc.addTransaction({ txn: proposeTxn.transaction, signer });
1716
+ const result = await atc.execute(algodClient, 4);
1717
+ return {
1718
+ success: true,
1719
+ txIds: result.txIDs
1720
+ };
1721
+ };
1722
+ var splitShares = async (config, params) => {
1723
+ const { algodClient, signer, activeAddress, usdcAssetId } = config;
1724
+ const { marketAppId, amount } = params;
1725
+ const globalState = await getMarketGlobalState(algodClient, marketAppId);
1726
+ const yesAssetId = globalState.yes_asset_id;
1727
+ const noAssetId = globalState.no_asset_id;
1728
+ const signerAccount = { signer, addr: activeAddress };
1729
+ const marketClient = new MarketAppClient(
1730
+ { resolveBy: "id", id: marketAppId, sender: signerAccount },
1731
+ algodClient
1732
+ );
1733
+ const marketAddress = getApplicationAddress(marketAppId);
1734
+ const atc = new AtomicTransactionComposer();
1735
+ let optInCosts = 0;
1736
+ const hasYesOptIn = await checkAssetOptIn(algodClient, activeAddress, yesAssetId);
1737
+ if (!hasYesOptIn) {
1738
+ const optInTxn = await algokit3.transferAsset(
1739
+ { from: signerAccount, to: activeAddress, assetId: yesAssetId, amount: 0, skipSending: true },
1740
+ algodClient
1741
+ );
1742
+ atc.addTransaction({ txn: optInTxn.transaction, signer });
1743
+ optInCosts += 1e3;
1744
+ }
1745
+ const hasNoOptIn = await checkAssetOptIn(algodClient, activeAddress, noAssetId);
1746
+ if (!hasNoOptIn) {
1747
+ const optInTxn = await algokit3.transferAsset(
1748
+ { from: signerAccount, to: activeAddress, assetId: noAssetId, amount: 0, skipSending: true },
1749
+ algodClient
1750
+ );
1751
+ atc.addTransaction({ txn: optInTxn.transaction, signer });
1752
+ optInCosts += 1e3;
1753
+ }
1754
+ const algoPayment = await algokit3.transferAlgos(
1755
+ { from: signerAccount, to: marketAddress, amount: algokit3.microAlgos(5e3 + optInCosts), skipSending: true },
1756
+ algodClient
1757
+ );
1758
+ atc.addTransaction({ txn: algoPayment.transaction, signer });
1759
+ const usdcTransfer = await algokit3.transferAsset(
1760
+ { from: signerAccount, to: marketAddress, amount, assetId: usdcAssetId, skipSending: true },
1761
+ algodClient
1762
+ );
1763
+ atc.addTransaction({ txn: usdcTransfer.transaction, signer });
1764
+ const splitTxn = await marketClient.splitShares(
1765
+ {},
1766
+ { assets: [usdcAssetId, yesAssetId, noAssetId], sendParams: { skipSending: true } }
1767
+ );
1768
+ atc.addTransaction({ txn: splitTxn.transaction, signer });
1769
+ const result = await atc.execute(algodClient, 4);
1770
+ return {
1771
+ success: true,
1772
+ txIds: result.txIDs,
1773
+ confirmedRound: result.confirmedRound
1774
+ };
1775
+ };
1776
+ var mergeShares = async (config, params) => {
1777
+ const { algodClient, signer, activeAddress, usdcAssetId } = config;
1778
+ const { marketAppId, amount } = params;
1779
+ const globalState = await getMarketGlobalState(algodClient, marketAppId);
1780
+ const yesAssetId = globalState.yes_asset_id;
1781
+ const noAssetId = globalState.no_asset_id;
1782
+ const signerAccount = { signer, addr: activeAddress };
1783
+ const marketClient = new MarketAppClient(
1784
+ { resolveBy: "id", id: marketAppId, sender: signerAccount },
1785
+ algodClient
1786
+ );
1787
+ const marketAddress = getApplicationAddress(marketAppId);
1788
+ const atc = new AtomicTransactionComposer();
1789
+ let optInCosts = 0;
1790
+ const hasUsdcOptIn = await checkAssetOptIn(algodClient, activeAddress, usdcAssetId);
1791
+ if (!hasUsdcOptIn) {
1792
+ const optInTxn = await algokit3.transferAsset(
1793
+ { from: signerAccount, to: activeAddress, assetId: usdcAssetId, amount: 0, skipSending: true },
1794
+ algodClient
1795
+ );
1796
+ atc.addTransaction({ txn: optInTxn.transaction, signer });
1797
+ optInCosts += 1e3;
1798
+ }
1799
+ const algoPayment = await algokit3.transferAlgos(
1800
+ { from: signerAccount, to: marketAddress, amount: algokit3.microAlgos(5e3 + optInCosts), skipSending: true },
1801
+ algodClient
1802
+ );
1803
+ atc.addTransaction({ txn: algoPayment.transaction, signer });
1804
+ const yesTransfer = await algokit3.transferAsset(
1805
+ { from: signerAccount, to: marketAddress, amount, assetId: yesAssetId, skipSending: true },
1806
+ algodClient
1807
+ );
1808
+ atc.addTransaction({ txn: yesTransfer.transaction, signer });
1809
+ const noTransfer = await algokit3.transferAsset(
1810
+ { from: signerAccount, to: marketAddress, amount, assetId: noAssetId, skipSending: true },
1811
+ algodClient
1812
+ );
1813
+ atc.addTransaction({ txn: noTransfer.transaction, signer });
1814
+ const mergeTxn = await marketClient.mergeShares(
1815
+ {},
1816
+ { assets: [usdcAssetId], sendParams: { skipSending: true } }
1817
+ );
1818
+ atc.addTransaction({ txn: mergeTxn.transaction, signer });
1819
+ const result = await atc.execute(algodClient, 4);
1820
+ return {
1821
+ success: true,
1822
+ txIds: result.txIDs,
1823
+ confirmedRound: result.confirmedRound
1824
+ };
1825
+ };
1826
+ var claim = async (config, params) => {
1827
+ const { algodClient, signer, activeAddress, usdcAssetId } = config;
1828
+ const { marketAppId, assetId } = params;
1829
+ const signerAccount = { signer, addr: activeAddress };
1830
+ const marketClient = new MarketAppClient(
1831
+ { resolveBy: "id", id: marketAppId, sender: signerAccount },
1832
+ algodClient
1833
+ );
1834
+ const marketAddress = getApplicationAddress(marketAppId);
1835
+ let tokenBalance = params.amount;
1836
+ if (!tokenBalance) {
1837
+ const accountInfo = await algodClient.accountInformation(activeAddress).do();
1838
+ const assets = accountInfo.assets || accountInfo["assets"] || [];
1839
+ const asset = assets.find((a) => (a["asset-id"] ?? a.assetId) === assetId);
1840
+ tokenBalance = asset ? Number(asset.amount) : 0;
1841
+ }
1842
+ if (tokenBalance <= 0) {
1843
+ throw new Error("No tokens to claim");
1844
+ }
1845
+ const atc = new AtomicTransactionComposer();
1846
+ const tokenTransfer = await algokit3.transferAsset(
1847
+ { from: signerAccount, to: marketAddress, amount: tokenBalance, assetId, skipSending: true },
1848
+ algodClient
1849
+ );
1850
+ atc.addTransaction({ txn: tokenTransfer.transaction, signer });
1851
+ const claimTxn = await marketClient.claim(
1852
+ {},
1853
+ {
1854
+ assets: [usdcAssetId, assetId],
1855
+ sendParams: { skipSending: true, fee: algokit3.microAlgos(1e3) }
1856
+ }
1857
+ );
1858
+ atc.addTransaction({ txn: claimTxn.transaction, signer });
1859
+ const sp = await algodClient.getTransactionParams().do();
1860
+ const closeOutTxn = algosdk2.makeAssetTransferTxnWithSuggestedParamsFromObject({
1861
+ from: activeAddress,
1862
+ to: marketAddress,
1863
+ amount: 0,
1864
+ assetIndex: assetId,
1865
+ closeRemainderTo: marketAddress,
1866
+ suggestedParams: sp
1867
+ });
1868
+ atc.addTransaction({ txn: closeOutTxn, signer });
1869
+ const result = await atc.execute(algodClient, 4);
1870
+ return {
1871
+ success: true,
1872
+ txIds: result.txIDs,
1873
+ confirmedRound: result.confirmedRound
1874
+ };
1875
+ };
1876
+ var getPositions = async (config, walletAddress) => {
1877
+ const { algodClient, indexerClient } = config;
1878
+ const address = walletAddress ?? config.activeAddress;
1879
+ const accountInfo = await algodClient.accountInformation(address).do();
1880
+ const assets = accountInfo.assets || accountInfo["assets"] || [];
1881
+ const nonZeroAssets = assets.filter((a) => Number(a.amount) > 0);
1882
+ if (nonZeroAssets.length === 0) return [];
1883
+ const positions = /* @__PURE__ */ new Map();
1884
+ for (const asset of nonZeroAssets) {
1885
+ const assetId = asset["asset-id"] ?? asset.assetId;
1886
+ const amount = Number(asset.amount);
1887
+ try {
1888
+ const assetInfo = await indexerClient.lookupAssetByID(assetId).do();
1889
+ const creator = assetInfo.asset?.params?.creator;
1890
+ if (!creator) continue;
1891
+ const createdApps = await indexerClient.lookupAccountCreatedApplications(creator).limit(1).do();
1892
+ if (!createdApps.applications?.length) continue;
1893
+ const appId = createdApps.applications[0].id;
1894
+ try {
1895
+ const appInfo = await indexerClient.lookupApplications(appId).do();
1896
+ const rawState = appInfo.application?.params?.["global-state"];
1897
+ if (!rawState) continue;
1898
+ let yesAssetIdOnChain = 0;
1899
+ let noAssetIdOnChain = 0;
1900
+ for (const item of rawState) {
1901
+ const key = Buffer.from(item.key, "base64").toString();
1902
+ if (key === "yes_asset_id") yesAssetIdOnChain = Number(item.value.uint);
1903
+ if (key === "no_asset_id") noAssetIdOnChain = Number(item.value.uint);
1904
+ }
1905
+ if (yesAssetIdOnChain === 0 && noAssetIdOnChain === 0) continue;
1906
+ const existing = positions.get(appId) ?? {
1907
+ marketAppId: appId,
1908
+ yesAssetId: yesAssetIdOnChain,
1909
+ noAssetId: noAssetIdOnChain,
1910
+ yesBalance: 0,
1911
+ noBalance: 0
1912
+ };
1913
+ if (assetId === yesAssetIdOnChain) {
1914
+ existing.yesBalance = amount;
1915
+ } else if (assetId === noAssetIdOnChain) {
1916
+ existing.noBalance = amount;
1917
+ } else {
1918
+ continue;
1919
+ }
1920
+ positions.set(appId, existing);
1921
+ } catch {
1922
+ continue;
1923
+ }
1924
+ } catch {
1925
+ continue;
1926
+ }
1927
+ }
1928
+ return Array.from(positions.values());
1929
+ };
1930
+
1931
+ // src/modules/markets.ts
1932
+ var DEFAULT_API_BASE_URL = "https://partners.alphaarcade.com/api";
1933
+ var getMarkets = async (config) => {
1934
+ const baseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;
1935
+ const allMarkets = [];
1936
+ let lastEvaluatedKey;
1937
+ let hasMore = true;
1938
+ while (hasMore) {
1939
+ const params = new URLSearchParams({ activeOnly: "true", limit: "300" });
1940
+ if (lastEvaluatedKey) {
1941
+ params.set("lastEvaluatedKey", lastEvaluatedKey);
1942
+ }
1943
+ const url = `${baseUrl}/get-live-markets?${params.toString()}`;
1944
+ const response = await fetch(url, { headers: { "x-api-key": config.apiKey } });
1945
+ if (!response.ok) {
1946
+ throw new Error(`Alpha API error: ${response.status} ${response.statusText}`);
1947
+ }
1948
+ const data = await response.json();
1949
+ if (Array.isArray(data)) {
1950
+ allMarkets.push(...data);
1951
+ hasMore = false;
1952
+ } else if (data.markets) {
1953
+ allMarkets.push(...data.markets);
1954
+ lastEvaluatedKey = data.lastEvaluatedKey;
1955
+ hasMore = !!lastEvaluatedKey;
1956
+ } else {
1957
+ hasMore = false;
1958
+ }
1959
+ }
1960
+ return allMarkets;
1961
+ };
1962
+ var getMarket = async (config, marketId) => {
1963
+ const baseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;
1964
+ const url = `${baseUrl}/get-market?marketId=${encodeURIComponent(marketId)}`;
1965
+ const response = await fetch(url, { headers: { "x-api-key": config.apiKey } });
1966
+ if (!response.ok) {
1967
+ if (response.status === 404) return null;
1968
+ throw new Error(`Alpha API error: ${response.status} ${response.statusText}`);
1969
+ }
1970
+ const data = await response.json();
1971
+ return data.market ?? data ?? null;
1972
+ };
1973
+
1974
+ // src/client.ts
1975
+ var AlphaClient = class {
1976
+ config;
1977
+ constructor(config) {
1978
+ if (!config.algodClient) throw new Error("algodClient is required");
1979
+ if (!config.indexerClient) throw new Error("indexerClient is required");
1980
+ if (!config.signer) throw new Error("signer is required");
1981
+ if (!config.activeAddress) throw new Error("activeAddress is required");
1982
+ if (!config.matcherAppId) throw new Error("matcherAppId is required");
1983
+ if (!config.usdcAssetId) throw new Error("usdcAssetId is required");
1984
+ if (!config.feeAddress) throw new Error("feeAddress is required");
1985
+ if (!config.apiKey) throw new Error("apiKey is required");
1986
+ this.config = {
1987
+ ...config,
1988
+ apiBaseUrl: config.apiBaseUrl ?? "https://partners.alphaarcade.com/api"
1989
+ };
1990
+ }
1991
+ // ============================================
1992
+ // Trading
1993
+ // ============================================
1994
+ /**
1995
+ * Creates a limit order on a market.
1996
+ *
1997
+ * A limit order sits on the orderbook at your specified price until matched
1998
+ * or cancelled. Slippage is 0 — the order executes only at your exact price.
1999
+ *
2000
+ * @param params - Order parameters (marketAppId, position, price, quantity, isBuying)
2001
+ * @returns The created escrow app ID and transaction info
2002
+ */
2003
+ async createLimitOrder(params) {
2004
+ return createLimitOrder(this.config, params);
2005
+ }
2006
+ /**
2007
+ * Creates a market order with automatic matching.
2008
+ *
2009
+ * Fetches the live orderbook, finds the best counterparty orders within your
2010
+ * slippage tolerance, then creates the order and proposes matches in a single
2011
+ * atomic transaction group.
2012
+ *
2013
+ * @param params - Order parameters (marketAppId, position, price, quantity, isBuying, slippage)
2014
+ * @returns The created escrow app ID, matched quantity, and transaction info
2015
+ */
2016
+ async createMarketOrder(params) {
2017
+ return createMarketOrder(this.config, params);
2018
+ }
2019
+ /**
2020
+ * Cancels an open order by deleting its escrow app.
2021
+ *
2022
+ * Returns the escrowed funds (USDC or outcome tokens) to the order owner,
2023
+ * and reclaims the ALGO minimum balance used by the escrow app.
2024
+ *
2025
+ * @param params - Cancel parameters (marketAppId, escrowAppId, orderOwner)
2026
+ * @returns Whether the cancellation succeeded
2027
+ */
2028
+ async cancelOrder(params) {
2029
+ return cancelOrder(this.config, params);
2030
+ }
2031
+ /**
2032
+ * Proposes a match between an existing maker order and a new taker order.
2033
+ *
2034
+ * Use this for advanced matching scenarios where you want to explicitly
2035
+ * specify which orders to match against.
2036
+ *
2037
+ * @param params - Match parameters (marketAppId, makerEscrowAppId, makerAddress, quantityMatched)
2038
+ * @returns Whether the match succeeded
2039
+ */
2040
+ async proposeMatch(params) {
2041
+ return proposeMatch(this.config, params);
2042
+ }
2043
+ // ============================================
2044
+ // Positions
2045
+ // ============================================
2046
+ /**
2047
+ * Splits USDC into equal amounts of YES and NO outcome tokens.
2048
+ *
2049
+ * For example, splitting 1 USDC gives you 1 YES token + 1 NO token.
2050
+ * Together they're always worth $1.00 — you can trade them independently.
2051
+ *
2052
+ * @param params - Split parameters (marketAppId, amount in microunits)
2053
+ * @returns Transaction result
2054
+ */
2055
+ async splitShares(params) {
2056
+ return splitShares(this.config, params);
2057
+ }
2058
+ /**
2059
+ * Merges equal amounts of YES and NO tokens back into USDC.
2060
+ *
2061
+ * The inverse of split. 1 YES + 1 NO = 1 USDC, always.
2062
+ *
2063
+ * @param params - Merge parameters (marketAppId, amount in microunits)
2064
+ * @returns Transaction result
2065
+ */
2066
+ async mergeShares(params) {
2067
+ return mergeShares(this.config, params);
2068
+ }
2069
+ /**
2070
+ * Claims USDC from a resolved market by redeeming outcome tokens.
2071
+ *
2072
+ * - Winning tokens: redeemed 1:1 for USDC
2073
+ * - Voided market: redeemed at half value
2074
+ * - Losing tokens: burned (no USDC returned)
2075
+ *
2076
+ * @param params - Claim parameters (marketAppId, assetId, optional amount)
2077
+ * @returns Transaction result
2078
+ */
2079
+ async claim(params) {
2080
+ return claim(this.config, params);
2081
+ }
2082
+ /**
2083
+ * Gets all token positions for a wallet across all markets.
2084
+ *
2085
+ * Reads on-chain account info and maps ASA holdings to markets.
2086
+ * Returns raw token balances (YES/NO amounts per market).
2087
+ *
2088
+ * @param walletAddress - Optional wallet (defaults to activeAddress)
2089
+ * @returns Array of positions with market app IDs and token balances
2090
+ */
2091
+ async getPositions(walletAddress) {
2092
+ return getPositions(this.config, walletAddress);
2093
+ }
2094
+ // ============================================
2095
+ // Orderbook
2096
+ // ============================================
2097
+ /**
2098
+ * Fetches the full on-chain orderbook for a market.
2099
+ *
2100
+ * Reads all escrow apps created by the market contract, decodes their
2101
+ * global state, and organizes into yes/no bids and asks.
2102
+ * Only includes limit orders (slippage = 0) with unfilled quantity.
2103
+ *
2104
+ * @param marketAppId - The market app ID
2105
+ * @returns Orderbook with yes and no sides, each having bids and asks
2106
+ */
2107
+ async getOrderbook(marketAppId) {
2108
+ return getOrderbook(this.config, marketAppId);
2109
+ }
2110
+ /**
2111
+ * Gets open orders for a specific wallet on a market.
2112
+ *
2113
+ * @param marketAppId - The market app ID
2114
+ * @param walletAddress - Optional wallet (defaults to activeAddress)
2115
+ * @returns Array of open orders
2116
+ */
2117
+ async getOpenOrders(marketAppId, walletAddress) {
2118
+ return getOpenOrders(this.config, marketAppId, walletAddress);
2119
+ }
2120
+ // ============================================
2121
+ // Markets
2122
+ // ============================================
2123
+ /**
2124
+ * Fetches all live, tradeable markets from the Alpha API.
2125
+ *
2126
+ * Automatically paginates to retrieve all markets.
2127
+ *
2128
+ * @returns Array of live markets
2129
+ */
2130
+ async getMarkets() {
2131
+ return getMarkets(this.config);
2132
+ }
2133
+ /**
2134
+ * Fetches a single market by its ID.
2135
+ *
2136
+ * @param marketId - The market ID
2137
+ * @returns The market data, or null if not found
2138
+ */
2139
+ async getMarket(marketId) {
2140
+ return getMarket(this.config, marketId);
2141
+ }
2142
+ };
2143
+
2144
+ export { AlphaClient, calculateFee, calculateFeeFromTotal, calculateMatchingOrders, checkAssetOptIn, decodeGlobalState, getEscrowGlobalState, getMarketGlobalState };
2145
+ //# sourceMappingURL=index.js.map
2146
+ //# sourceMappingURL=index.js.map