@layerzerolabs/layerzero-v2-ton 3.0.19-ton.1 → 3.0.21-ton.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.
Files changed (109) hide show
  1. package/build/AllStorages.compiled.json +1 -1
  2. package/build/AllStorages.test.compiled.json +1 -1
  3. package/build/BaseContract.test.compiled.json +1 -1
  4. package/build/Channel.compiled.json +1 -1
  5. package/build/Channel.permissions.test.compiled.json +1 -1
  6. package/build/ChannelBurn.test.compiled.json +1 -1
  7. package/build/ChannelCommitPacket.test.compiled.json +1 -1
  8. package/build/ChannelConfig.test.compiled.json +1 -1
  9. package/build/ChannelInitialize.test.compiled.json +1 -1
  10. package/build/ChannelMsglibIntegration.test.compiled.json +1 -1
  11. package/build/ChannelMsglibSendCallback.test.compiled.json +1 -1
  12. package/build/ChannelNilify.test.compiled.json +1 -1
  13. package/build/ChannelReceive.test.compiled.json +1 -1
  14. package/build/ChannelReceiveCallback.test.compiled.json +1 -1
  15. package/build/ChannelReceiveView.test.compiled.json +1 -1
  16. package/build/ChannelSend.test.compiled.json +1 -1
  17. package/build/Classlib.test.compiled.json +1 -1
  18. package/build/ComputeDataSizeGas.test.compiled.json +1 -1
  19. package/build/Connection.compiled.json +1 -1
  20. package/build/Controller.assertions.test.compiled.json +1 -1
  21. package/build/Controller.compiled.json +1 -1
  22. package/build/Controller.permissions.test.compiled.json +1 -1
  23. package/build/Controller.test.compiled.json +1 -1
  24. package/build/Counter.compiled.json +1 -1
  25. package/build/Counter.permissions.test.compiled.json +1 -1
  26. package/build/Counter.setters.test.compiled.json +1 -1
  27. package/build/Counter.test.compiled.json +1 -1
  28. package/build/Dvn.compiled.json +1 -1
  29. package/build/Dvn.test.compiled.json +1 -1
  30. package/build/DvnFeeLib.compiled.json +1 -1
  31. package/build/DvnPermissions.test.compiled.json +1 -1
  32. package/build/Endpoint.compiled.json +1 -1
  33. package/build/Endpoint.permissions.test.compiled.json +1 -1
  34. package/build/Endpoint.test.compiled.json +1 -1
  35. package/build/EndpointSetEpConfigDefaults.test.compiled.json +1 -1
  36. package/build/Executor.compiled.json +1 -1
  37. package/build/Executor.test.compiled.json +1 -1
  38. package/build/ExecutorFeeLib.compiled.json +1 -1
  39. package/build/ExecutorPermissions.test.compiled.json +1 -1
  40. package/build/LzClasses.test.compiled.json +1 -1
  41. package/build/LzUtil.test.compiled.json +1 -1
  42. package/build/MsgData.test.compiled.json +1 -1
  43. package/build/MsglibPacketCodec.test.compiled.json +1 -1
  44. package/build/PipelinedOutOfOrder.test.compiled.json +1 -1
  45. package/build/PriceFeedCache.compiled.json +1 -1
  46. package/build/PriceFeedCache.test.compiled.json +1 -1
  47. package/build/Proxy.compiled.json +1 -1
  48. package/build/Proxy.permissions.test.compiled.json +1 -1
  49. package/build/Proxy.test.compiled.json +1 -1
  50. package/build/SmlConnection.compiled.json +1 -1
  51. package/build/SmlConnection.permissions.test.compiled.json +1 -1
  52. package/build/SmlConnection.test.compiled.json +1 -1
  53. package/build/SmlManager.compiled.json +1 -1
  54. package/build/SmlManager.permissions.test.compiled.json +1 -1
  55. package/build/SmlManager.test.compiled.json +1 -1
  56. package/build/Uln.compiled.json +1 -1
  57. package/build/Uln.test.compiled.json +1 -1
  58. package/build/UlnConnection.compiled.json +1 -1
  59. package/build/UlnConnection.test.compiled.json +1 -1
  60. package/build/UlnConnectionPermissions.test.compiled.json +1 -1
  61. package/build/UlnManagement.test.compiled.json +1 -1
  62. package/build/UlnManager.compiled.json +1 -1
  63. package/build/UlnManager.test.compiled.json +1 -1
  64. package/build/UlnManagerPermissions.test.compiled.json +1 -1
  65. package/build/UlnManagerUtil.test.compiled.json +1 -1
  66. package/build/UlnPermissions.test.compiled.json +1 -1
  67. package/build/UlnReceiveConfig.test.compiled.json +1 -1
  68. package/build/UlnSend.test.compiled.json +1 -1
  69. package/build/UlnSendConfig.test.compiled.json +1 -1
  70. package/build/UlnSendWithDvnFeeLib.test.compiled.json +1 -1
  71. package/build/UlnSendWithExecFeeLib.test.compiled.json +1 -1
  72. package/build/UlnSendWorkerFactory.test.compiled.json +1 -1
  73. package/build/UlnUtil.test.compiled.json +1 -1
  74. package/build/WorkerCore.test.compiled.json +1 -1
  75. package/build/badFeeLib1.test.compiled.json +1 -1
  76. package/build/badFeeLib10.test.compiled.json +1 -1
  77. package/build/badFeeLib11.test.compiled.json +1 -1
  78. package/build/badFeeLib12.test.compiled.json +1 -1
  79. package/build/badFeeLib2.test.compiled.json +1 -1
  80. package/build/badFeeLib3.test.compiled.json +1 -1
  81. package/build/badFeeLib4.test.compiled.json +1 -1
  82. package/build/badFeeLib5.test.compiled.json +1 -1
  83. package/build/badFeeLib6.test.compiled.json +1 -1
  84. package/build/badFeeLib7.test.compiled.json +1 -1
  85. package/build/badFeeLib8.test.compiled.json +1 -1
  86. package/build/badFeeLib9.test.compiled.json +1 -1
  87. package/package.json +2 -2
  88. package/src/classes/lz/EpConfig.fc +1 -1
  89. package/src/funC++/actions/call.fc +2 -2
  90. package/src/funC++/actions/deploy.fc +2 -2
  91. package/src/funC++/actions/destroy.fc +1 -1
  92. package/src/funC++/actions/dispatch.fc +2 -2
  93. package/src/funC++/actions/event.fc +10 -4
  94. package/src/funC++/actions/payment.fc +2 -2
  95. package/src/funC++/actions/sendJettons.fc +2 -2
  96. package/src/funC++/classlib.fc +5 -1
  97. package/src/funC++/constants.fc +2 -2
  98. package/src/funC++/dataStructures/AddressList.fc +2 -1
  99. package/src/protocol/channel/handler.fc +26 -4
  100. package/src/protocol/channel/interface.fc +1 -0
  101. package/src/protocol/core/abstract/protocolHandler.fc +1 -1
  102. package/src/protocol/endpoint/interface.fc +8 -8
  103. package/src/protocol/msglibs/ultralightnode/feeLibInterface.fc +2 -2
  104. package/src/protocol/msglibs/ultralightnode/msgdata/Attestation.fc +4 -4
  105. package/src/protocol/msglibs/ultralightnode/msgdata/UlnReceiveConfig.fc +13 -13
  106. package/src/protocol/msglibs/ultralightnode/ulnConnection/utils.fc +2 -10
  107. package/src/workers/core/abstract/workerHandler.fc +1 -1
  108. package/CHANGELOG.md +0 -13
  109. package/build/PriceFeedCache.permissions.test.compiled.json +0 -1
@@ -20,7 +20,7 @@ const int action::deploy::md = 5;
20
20
  const int action::deploy::outflowNanos = 6;
21
21
 
22
22
  ;; @terminal
23
- tuple action::deploy::New(
23
+ tuple action::deploy::create(
24
24
  cell code,
25
25
  cell $storage,
26
26
  int donationNanos,
@@ -61,7 +61,7 @@ tuple _newAction<deployAndCall>(
61
61
  cell $md,
62
62
  int outflowNanos
63
63
  ) inline {
64
- return action::deploy::New(
64
+ return action::deploy::create(
65
65
  code,
66
66
  $storage,
67
67
  donationNanos,
@@ -7,7 +7,7 @@ const int action::destroy::opcode = 2;
7
7
  const int action::destroy::md = 3;
8
8
 
9
9
  ;; @terminal
10
- tuple action::destroy::New(int to, int opcode, cell $md) inline {
10
+ tuple action::destroy::create(int to, int opcode, cell $md) inline {
11
11
  return unsafeTuple([action::destroy::NAME, to, opcode, $md]);
12
12
  }
13
13
 
@@ -12,7 +12,7 @@ const int action::dispatch::gasNanos = 4;
12
12
  ;; Call a method on the contract at address `to` with the given message data `md`
13
13
  ;; optionally provide value provisioned from this contract's balance
14
14
  ;; @terminal
15
- tuple action::dispatch::New(int to, int opcode, cell $md, int gasNanos) inline {
15
+ tuple action::dispatch::create(int to, int opcode, cell $md, int gasNanos) inline {
16
16
  return unsafeTuple([action::dispatch::NAME, to, opcode, $md, gasNanos]);
17
17
  }
18
18
 
@@ -32,7 +32,7 @@ int action::dispatch::equals(tuple self, tuple other) {
32
32
  }
33
33
 
34
34
  tuple _newAction<dispatch>(int to, int opcode, cell $body, int gasNanos) inline {
35
- return action::dispatch::New(to, opcode, $body, gasNanos);
35
+ return action::dispatch::create(to, opcode, $body, gasNanos);
36
36
  }
37
37
 
38
38
  ;; overloaded when you want to pass 0 outflowNanos
@@ -15,8 +15,8 @@ int _getEventSink() impure inline;
15
15
  ;; @info Events in LZ contracts are internal messages to an event sink
16
16
  ;; where the resulting transaction always reverts
17
17
  ;; @non-terminal
18
- tuple action::event::New(int topic, cell $body, cell $initialStorage) inline method_id {
19
- cell $eventObj = cl::declare(
18
+ cell action::event::New(int topic, cell $body, cell $initialStorage) inline method_id {
19
+ return cl::declare(
20
20
  action::event::NAME,
21
21
  unsafeTuple([
22
22
  [cl::t::uint256, topic],
@@ -24,7 +24,13 @@ tuple action::event::New(int topic, cell $body, cell $initialStorage) inline met
24
24
  [cl::t::objRef, $initialStorage]
25
25
  ])
26
26
  );
27
- return unsafeTuple([action::event::NAME, $eventObj]);
27
+ }
28
+
29
+ tuple action::event::create(int topic, cell $body, cell $initialStorage) inline {
30
+ return unsafeTuple([
31
+ action::event::NAME,
32
+ action::event::New(topic, $body, $initialStorage)
33
+ ]);
28
34
  }
29
35
 
30
36
  ;; returns true if equals
@@ -42,7 +48,7 @@ int action::event::equals(tuple self, tuple other) {
42
48
 
43
49
  ;; interface this function because it requires passing the 'getInitialStorage' from the baseHandler
44
50
  ;; tuple _newAction<event>(int topic, cell $body) impure inline {
45
- ;; return action::event::New(topic, $body, getInitialStorage());
51
+ ;; return action::event::create(topic, $body, getInitialStorage());
46
52
  ;; }
47
53
 
48
54
  tuple _newAction<event>(int topic, cell $body) impure inline;
@@ -10,7 +10,7 @@ const int action::payment::amount = 2;
10
10
  const int action::payment::outflowNanos = 3;
11
11
 
12
12
  ;; @non-terminal
13
- tuple action::payment::New(int toAddress, int amount, int outflowNanos) inline {
13
+ tuple action::payment::create(int toAddress, int amount, int outflowNanos) inline {
14
14
  return unsafeTuple([action::payment::NAME, toAddress, amount, outflowNanos]);
15
15
  }
16
16
 
@@ -25,7 +25,7 @@ int action::payment::equals(tuple self, tuple other) {
25
25
  }
26
26
 
27
27
  tuple _newAction<payment>(int toAddress, int amount, int outflowNanos) inline {
28
- return action::payment::New(toAddress, amount, outflowNanos);
28
+ return action::payment::create(toAddress, amount, outflowNanos);
29
29
  }
30
30
 
31
31
  (tuple, ()) ~pushAction<payment>(tuple actions, int toAddress, int amount, int outflowNanos) inline {
@@ -20,7 +20,7 @@ const int Jetton::OP::TRANSFER_NOTIFICATION = 0x7362d09c;
20
20
  const int Jetton::OP::TRANSFER = 0xf8a7ea5;
21
21
 
22
22
  ;; @terminal
23
- tuple action::sendJettons::New(int walletAddress, int toAddress, int amount, int responseAddress) inline {
23
+ tuple action::sendJettons::create(int walletAddress, int toAddress, int amount, int responseAddress) inline {
24
24
  return unsafeTuple([action::sendJettons::NAME, walletAddress, toAddress, amount, responseAddress]);
25
25
  }
26
26
 
@@ -36,7 +36,7 @@ int action::sendJettons::equals(tuple self, tuple other) {
36
36
  }
37
37
 
38
38
  tuple _newAction<sendJettons>(int walletAddress, int toAddress, int amount, int responseAddress) inline {
39
- return action::sendJettons::New(walletAddress, toAddress, amount, responseAddress);
39
+ return action::sendJettons::create(walletAddress, toAddress, amount, responseAddress);
40
40
  }
41
41
 
42
42
  (tuple, ()) ~pushAction<sendJettons>(
@@ -589,7 +589,11 @@ cell cl::dict256::New() inline {
589
589
  if (dict.cell_is_empty()) {
590
590
  return (empty_cell(), false);
591
591
  }
592
- return dict.udict_get_ref?(DICT256_KEYLEN, key);
592
+ (cell ret, int exists) = dict.udict_get_ref?(DICT256_KEYLEN, key);
593
+ ifnot (exists) {
594
+ return (empty_cell(), false);
595
+ }
596
+ return (ret, true);
593
597
  }
594
598
 
595
599
  cell cl::dict256::setRef(cell dict, int key, cell val) inline method_id {
@@ -1,6 +1,6 @@
1
1
  const int ERRORCODE_MASK = 0x7ff;
2
- const int CLASSLIB::ERROR::INVALID_FIELD_TYPE = 1058;
3
- const int CLASSLIB::ERROR::WRONG_ORDER_CONSTRUCTOR = 1059;
2
+ const int CLASSLIB::ERROR::INVALID_FIELD_TYPE = 1059;
3
+ const int CLASSLIB::ERROR::WRONG_ORDER_CONSTRUCTOR = 1060;
4
4
 
5
5
  const int MAX_U8 = 0xFF;
6
6
  const int MAX_U16 = 0xFFFF;
@@ -44,7 +44,8 @@ int AddressList::isValid(cell addressList, int maxCount) {
44
44
  int count = 0;
45
45
  while (addressListSlice.slice_empty?() == false) {
46
46
  (int bits, int refs) = addressListSlice.slice_bits_refs();
47
- if ((refs > 1) | ((refs == 1) & ((bits % 256) != 0))) {
47
+ ;; todo: more test coverage
48
+ if ((refs > 1) | ((bits % 256) != 0)) {
48
49
  return false;
49
50
  }
50
51
  repeat (bits / 256) {
@@ -306,8 +306,9 @@ tuple channelSend(cell $mdObj) impure inline method_id {
306
306
  cell $epConfigOApp = $storage.cl::get<objRef>(Channel::epConfigOApp);
307
307
  int sendMsglib = $epConfigOApp.cl::get<address>(lz::EpConfig::sendMsglib);
308
308
  int sendMsglibConnection = $epConfigOApp.cl::get<address>(lz::EpConfig::sendMsglibConnection);
309
+ cell $sendPath = $storage.cl::get<objRef>(Channel::path);
309
310
 
310
- if ($epConfigOApp.cl::get<bool>(lz::EpConfig::useDefaults)) {
311
+ if ($epConfigOApp.cl::get<bool>(lz::EpConfig::isNull)) {
311
312
  cell $defaultSendEpConfig = $mdObj.cl::get<objRef>(md::MdObj::obj);
312
313
 
313
314
  sendMsglib = $defaultSendEpConfig.cl::get<address>(lz::SendEpConfig::sendMsglibAddress);
@@ -316,6 +317,23 @@ tuple channelSend(cell $mdObj) impure inline method_id {
316
317
  .cl::get<address>(lz::SendEpConfig::sendMsglibConnectionAddress);
317
318
  }
318
319
 
320
+ if ((sendMsglib == NULLADDRESS) | (sendMsglibConnection == NULLADDRESS)) {
321
+ actions~pushAction<call>(
322
+ $sendPath.cl::get<address>(lz::Path::srcOApp),
323
+ Layerzero::OP::CHANNEL_SEND_CALLBACK,
324
+ md::MdObj::New(
325
+ md::MessagingReceipt::New(
326
+ $lzSend,
327
+ 0,
328
+ 0,
329
+ Channel::ERROR::MsglibBlocked
330
+ ),
331
+ getInitialStorage()
332
+ )
333
+ );
334
+ return actions;
335
+ }
336
+
319
337
  ;; Each send request is assigned a unique request ID, which is also used as the key into
320
338
  ;; the sendRequestQueue
321
339
  int curRequestId = $storage.cl::get<uint64>(Channel::lastSendRequestId) + 1;
@@ -378,7 +396,11 @@ tuple msglibSendCallback(cell $mdAddress) impure inline method_id {
378
396
 
379
397
  ;; Read the requestId from the sendRequestQueue to ensure this send request is genuine
380
398
  ;; and is not being double-executed
381
- (_, cell contents, _, int exists) = DeterministicInsertionCircularQueue::get(sendRequestQueue, requestId);
399
+ (_, cell contents, _, int exists) = DeterministicInsertionCircularQueue::get(
400
+ sendRequestQueue,
401
+ requestId
402
+ );
403
+
382
404
  if (exists) {
383
405
  if (_readSendRequestQueueEntry(contents) == $lzSend.cl::hash()) {
384
406
  $storage = $storage.cl::set(
@@ -548,7 +570,7 @@ tuple channelCommitPacket(cell $mdExtended) impure inline method_id {
548
570
  lz::EpConfig::receiveMsglibConnection
549
571
  );
550
572
 
551
- int useDefaults = $epConfigOApp.cl::get<bool>(lz::EpConfig::useDefaults);
573
+ int useDefaults = $epConfigOApp.cl::get<bool>(lz::EpConfig::isNull);
552
574
 
553
575
  if (useDefaults) {
554
576
  cell $defaultConfig = $mdExtended.cl::get<objRef>(md::MdObj::obj);
@@ -796,7 +818,7 @@ tuple lzReceiveExecuteCallback(cell $lzReceiveStatus) impure inline method_id {
796
818
  md::ExtendedMd::New(
797
819
  $mockPacket,
798
820
  $mockEpConfigDefaults, ;; this is completely ignored if useDefaults is false
799
- $epConfigOApp.cl::get<bool>(lz::EpConfig::useDefaults)
821
+ $epConfigOApp.cl::get<bool>(lz::EpConfig::isNull)
800
822
  ? $mockEpConfigDefaults.cl::get<address>(lz::EpConfig::receiveMsglibConnection)
801
823
  : $epConfigOApp.cl::get<address>(lz::EpConfig::receiveMsglibConnection)
802
824
  )
@@ -43,6 +43,7 @@ const int Channel::ERROR::notCommittable = 140;
43
43
  const int Channel::ERROR::notExecutable = 141;
44
44
  const int Channel::ERROR::notExecuting = 142;
45
45
  const int Channel::ERROR::wrongPath = 143;
46
+ const int Channel::ERROR::MsglibBlocked = 144;
46
47
  const int Channel::NO_ERROR = 0;
47
48
 
48
49
  ;; States for view function and packet executability management
@@ -106,5 +106,5 @@ tuple initialize(cell $md) impure inline {
106
106
  ;; declared inside of the actions/event.fc
107
107
  ;; We declare it here because it saves the need for declaring initialStorage everytime we call event
108
108
  tuple _newAction<event>(int topic, cell $body) impure inline {
109
- return action::event::New(topic, $body, getInitialStorage());
109
+ return action::event::create(topic, $body, getInitialStorage());
110
110
  }
@@ -10,11 +10,11 @@ const int Endpoint::OP::GET_MSGLIB_INFO_CALLBACK = "Endpoint::OP::GET_MSGLIB_INF
10
10
  const int Endpoint::event::EP_CONFIG_DEFAULTS_SET = "EP_CONFIG_DEFAULTS_SET"u;
11
11
 
12
12
  ;; ERRORS
13
- const int Endpoint::ERROR::notOApp = 97;
14
- const int Endpoint::ERROR::wrongPath = 98;
15
- const int Endpoint::ERROR::unauthorizedMsglib = 99;
16
- const int Endpoint::ERROR::invalidExpiry = 100;
17
- const int Endpoint::ERROR::unresolvedMsglib = 101;
18
- const int Endpoint::ERROR::msglibInfoExists = 102;
19
- const int Endpoint::ERROR::numMsglibsExceeded = 103;
20
- const int Endpoint::ERROR::sameTimeoutAndReceive = 104;
13
+ const int Endpoint::ERROR::notOApp = 300;
14
+ const int Endpoint::ERROR::wrongPath = 301;
15
+ const int Endpoint::ERROR::unauthorizedMsglib = 302;
16
+ const int Endpoint::ERROR::invalidExpiry = 303;
17
+ const int Endpoint::ERROR::unresolvedMsglib = 304;
18
+ const int Endpoint::ERROR::msglibInfoExists = 305;
19
+ const int Endpoint::ERROR::numMsglibsExceeded = 306;
20
+ const int Endpoint::ERROR::sameTimeoutAndReceive = 307;
@@ -6,5 +6,5 @@ const int UlnWorkerInterface::quote = 107686; ;; ulnWorker::quote
6
6
  ;; tuple ulnWorker::setConfig(cell $storage, cell $md) method_id;
7
7
  const int UlnWorkerInterface::setConfig = 95983; ;; ulnWorker::setConfig
8
8
 
9
- const int UlnWorkerInterface::ERROR::UNKNOWN_OPTIONS = 2047;
10
- const int UlnWorkerInterface::ERROR::ZERO_LZ_COMPOSE_GAS_PROVIDED = 2046;
9
+ const int UlnWorkerInterface::ERROR::UNKNOWN_OPTIONS = 2100;
10
+ const int UlnWorkerInterface::ERROR::ZERO_LZ_COMPOSE_GAS_PROVIDED = 2101;
@@ -7,8 +7,8 @@ const int lz::Attestation::NAME = "Attest"u;
7
7
  const int lz::Attestation::hash = 0; ;; hash
8
8
  const int lz::Attestation::confirmations = 1; ;; uint64
9
9
 
10
- const int lz::Attestation::bits = _HEADER_WIDTH + 256 + 64;
11
- const int lz::Attestation::refs = 0;
10
+ const int ULN_ATTESTATION_BITS = _HEADER_WIDTH + 256 + 64;
11
+ const int ULN_ATTESTATION_REFS = 0;
12
12
  ;; As long as the first 128 bits of the header match the below number,
13
13
  ;; the attestation is parseable by classlib
14
14
  const int lz::Attestation::leading16Bytes = 0x417474657374815ED897BFFF;
@@ -29,8 +29,8 @@ cell lz::Attestation::New(int hash, int confirmations) inline method_id {
29
29
  (int bits, int refs) = selfSlice.slice_bits_refs();
30
30
  throw_unless(
31
31
  cl::ERROR::MALFORMED_OBJECT,
32
- (bits == lz::Attestation::bits)
33
- & (refs == lz::Attestation::refs)
32
+ (bits == ULN_ATTESTATION_BITS)
33
+ & (refs == ULN_ATTESTATION_REFS)
34
34
  & (selfSlice~load_uint(128) == lz::Attestation::leading16Bytes)
35
35
  );
36
36
  }
@@ -53,28 +53,28 @@ const int UlnReceiveConfig::ERROR::INVALID_MIN_COMMIT_PACKET_GAS = 388;
53
53
  ;; address[] optionalDVNs; // no duplicates. sorted an an ascending order. allowed overlap with requiredDVNs
54
54
 
55
55
  cell UlnReceiveConfig::New(
56
- int useDefaultMinCommitPacketGas,
56
+ int minCommitPacketGasNull,
57
57
  int minCommitPacketGas,
58
- int useDefaultConfirmations,
58
+ int confirmationsNull,
59
59
  int confirmations,
60
- int useDefaultRequiredDVNs,
60
+ int requiredDVNsNull,
61
61
  cell requiredDVNs,
62
- int useDefaultOptionalDVNs,
62
+ int optionalDVNsNull,
63
63
  cell optionalDVNs,
64
64
  int optionalDVNThreshold
65
65
  ) impure method_id {
66
66
  return cl::declare(
67
67
  UlnReceiveConfig::NAME,
68
68
  unsafeTuple([
69
- [cl::t::bool, useDefaultMinCommitPacketGas],
70
- [cl::t::uint32, minCommitPacketGas], ;; UlnReceiveConfig::minCommitPacketGas
71
- [cl::t::bool, useDefaultConfirmations],
72
- [cl::t::uint64, confirmations], ;; UlnReceiveConfig::confirmations
73
- [cl::t::bool, useDefaultRequiredDVNs],
74
- [cl::t::cellRef, requiredDVNs], ;; UlnReceiveConfig::requiredDVNs
75
- [cl::t::bool, useDefaultOptionalDVNs],
76
- [cl::t::cellRef, optionalDVNs], ;; UlnReceiveConfig::requiredDVNs
77
- [cl::t::uint8, optionalDVNThreshold] ;; UlnReceiveConfig::optionalDVNThreshold
69
+ [cl::t::bool, minCommitPacketGasNull], ;; UlnReceiveConfig::minCommitPacketGasNull
70
+ [cl::t::uint32, minCommitPacketGas], ;; UlnReceiveConfig::minCommitPacketGas
71
+ [cl::t::bool, confirmationsNull], ;; UlnReceiveConfig::confirmationsNull
72
+ [cl::t::uint64, confirmations], ;; UlnReceiveConfig::confirmations
73
+ [cl::t::bool, requiredDVNsNull], ;; UlnReceiveConfig::requiredDVNsNull
74
+ [cl::t::cellRef, requiredDVNs], ;; UlnReceiveConfig::requiredDVNs
75
+ [cl::t::bool, optionalDVNsNull], ;; UlnReceiveConfig::optionalDVNsNull
76
+ [cl::t::cellRef, optionalDVNs], ;; UlnReceiveConfig::requiredDVNs
77
+ [cl::t::uint8, optionalDVNThreshold] ;; UlnReceiveConfig::optionalDVNThreshold
78
78
  ])
79
79
  );
80
80
  }
@@ -34,24 +34,16 @@ cell UlnConnection::utils::setHashLookup(
34
34
  (cell addressLookup, _) = hashLookups.cl::dict256::get<cellRef>(nonce);
35
35
 
36
36
  ;; insert the attestation
37
- addressLookup = addressLookup.cl::dict256::setRef(
38
- dvnAddress,
39
- $attestation
40
- );
37
+ addressLookup = addressLookup.cl::dict256::setRef(dvnAddress, $attestation);
41
38
 
42
39
  ;; save the attestation hash
43
- hashLookups = hashLookups.cl::dict256::setRef(nonce, addressLookup);
44
-
45
40
  return $self.cl::set(
46
41
  UlnConnection::hashLookups,
47
42
  hashLookups.cl::dict256::setRef(nonce, addressLookup)
48
43
  );
49
44
  }
50
45
 
51
- cell UlnConnection::utils::deleteNonceAttestations(
52
- cell $self,
53
- int nonce
54
- ) impure inline {
46
+ cell UlnConnection::utils::deleteNonceAttestations(cell $self, int nonce) impure inline {
55
47
  cell hashLookups = $self.cl::get<dict256>(UlnConnection::hashLookups);
56
48
  ;; delete is safe to call on a non-existent key
57
49
  hashLookups = hashLookups.cl::dict256::delete(nonce);
@@ -22,7 +22,7 @@ cell getInitialStorage() impure inline {
22
22
  ;; declared inside of the actions/event.fc
23
23
  ;; We declare it here because it saves the need for declaring initialStorage everytime we call event
24
24
  tuple _newAction<event>(int topic, cell $body) impure inline {
25
- return action::event::New(topic, $body, cl::nullObject());
25
+ return action::event::create(topic, $body, cl::nullObject());
26
26
  }
27
27
 
28
28
  ;;; ==========================================
package/CHANGELOG.md DELETED
@@ -1,13 +0,0 @@
1
- # @layerzerolabs/layerzero-v2-ton
2
-
3
- ## 3.0.19-ton.1
4
-
5
- ### Patch Changes
6
-
7
- - pack contract source
8
-
9
- ## 3.0.19-ton.0
10
-
11
- ### Patch Changes
12
-
13
- - admin workers
@@ -1 +0,0 @@
1
- {"hash":"7e6ca9a2e13eb5b6a01f58b6799f8c109842441dd708629d47f4386ddc6e5d84","hashBase64":"fmypouE+tbagH1i2eZ+MEJhCRB3XCGKdR/Q4bdxuXYQ=","hex":"b5ee9c72420201bc000100004b7500000114ff00f4a413f4bcf2c80b0001020162000200e20202c7000300bd0201200004005c02012000050027020120000600110201480007000e0201200008000b01f1d106380492f82706d9e46834c4c2e6cabecae4e4dee4bedae6ce409c9ea840e6cae85c5c5c4107c317c20b789fc20b78cfc2080b8b7c2fc30f83b9037c429105f470badb838c18390c006646581e580e58465ffe5b0e4b87d80470e00b7c090378810b788fc310098784af6a2016d090176aa607f80f83df14000901f621d074d701700271b098317f028020d72159de7f20706d04fa40fa4031fa003171d721fa003101fa44315307c7008e326c33058020d7018040d701fa0020d74981010bbe9c3827800b8307d724d70bff08de20c702953625d74c06df081035443012df02fa003073a9b400107b50a9105810471046503305046f0c000a0004f861020120000c000d000158001943082102051c71fba92f068df8020158000f00100073401d001d021d74b22d74b5033bd5213bd12b1935f03708e2020c000935f037fe07f709322c2009d5340d7485341d748f00c12b001e8145f04e2800f54c000928015928014e2f8329a307f5470005470005300e1d020d749810250be9a307f5470005470005300e120d70b078100d1bd2181008878d724d70b078100debdb19a307f5470005470005300e0d3070130d33f0101d33f0101d33f0101d3070130d33f0101d33f0101d33f0101d33f0101d33f0101d33f013180201200012001f0201200013001602012000140015000765c1bc060091f10eba490eba4d040bf40de4718c684686c2dcdcdee840c6dedcc6c2e8cadcc2e8ca7440e6e8e4d2dcce40e8dede40d8dedccf0107f0a187c80c2055879786f642c678b00e78b64e840201200017001e0201200018001b0201200019001a00053c09e0007722c20870402640a2c4b63c09c068d63788700026600c3232c1f2743c09f7a4c870802384c85eaa42298c3232c1f274007c0a005eaa41007a0c7c0a20020120001c001d00053c0a60008d22c208700026600c3232c1f2743c09f7a4c87080238b086a4e00f042a7886a4e00e98c3232c1f274007c0a2384086a4e00e99069bdb232c1f274007c0a38806ac0c07a0c7c0a20001b64062c8e8823c0a007c0abf850c20201200020002403f7f906001cc1845abab4b73a1c4701060024c9845b3ab4b73a189b470106002cc9845b3ab4b73a19994701060034c9845b3ab4b73a1b1a4701060044d1845bbab4b73a191a9b470106003cc1845ab1b7b4b739c701060044d1845bb0b2323932b9b9c70106004cd1845bb234b1ba191a9b470106004f181106004f18140021002200230012308b66f626a52656680014308b763656c6c52656680026c000968b4626f6f6c8e08b7756e6b6e6f776e8020158002500260183521f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba9130e0018307f45b30209993d0307f925b70f2ffda118e823088df801b7006f420f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba93307f6de08307f4866fa59101e05b7f6d8020120002800310201200029002e020120002a002b0071b243f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f7526b6fedbc003060fe8f8df4b2203c0b6fedb010df90b78890b788c002c02fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8026f1001006c002d000e6f10ba01c0ffb0020120002f0030003fb842de2042de217444de2244de23756044de2444de25756004de2602de277561009fb5db45dbf603a0e12a438e0180011c7843ae964184020380024552700f860161632abe08e1b663c1560f1c274803a7fe038000a64779632abe06e1b663c003c843ae9584012a03ae99a003bdd0be06ff0201200032004502012000330034005bb7da88e003a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c50201200035003b02012000360039010148003701bced447001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f8416f1101d0003800a88e4eeda2edfb8e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d89320c2008e2422ba945b7fdb31e08e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d8e85f0370d8f2e7df01e34f8416f112170830602d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20270830602d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2128003a003c20c2009a236f1021a014706f8503de82287061796d656e7455206f046f8c020120003c0041020120003d004003b50060ae15dbdc9ad95c8e8e995d995b9d0e8e905113525394d7d4d15508b6cf3b513b511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c160136cf049c0076cf3b5520003e01b901b904f48882186576656e747850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e282186576656e74016f0201b701ab01ae003f00046f8c02753b513b511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c5600f6cf1c0076cf3b552001b901b901b942073802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2208210f851d3f5ba218210beea5b26bab1218210a91df8babab1018210217607d4bab1f2e7dd8004201e6ed447001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e271830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20170821009f047d982015018ed43d8db3c004301dc2070830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22173802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e202710044007a01d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2128240616374696f6e43616c6c55206f046f8c020120004600570201f400470048003d2341b50726963654665656443616368653a3a7065726d697373696f6e7382002f71bc024fc4043a342e636865636b5065726d697373696f6e733a3a75706461746550726963653a3a737563636573733a3a61646d696e3181bc09be324fc4043e342e636865636b5065726d697373696f6e733a3a75706461746550726963653a3a737563636573733a3a61646d696e3281bc09be324fc4044225bc0a00049004a0052636865636b5065726d697373696f6e733a3a75706461746550726963653a3a6e6f745570646174657201fc6f8c93f101118d0d18da1958dad4195c9b5a5cdcda5bdb9cce8e9d5c19185d1953985d1a5d99541c9a58d94e8e9cdd58d8d95cdcce8e98591b5a5b8c606f026f8c93f101128d0d18da1958dad4195c9b5a5cdcda5bdb9cce8e9d5c19185d1953985d1a5d99541c9a58d94e8e9cdd58d8d95cdcce8e98591b5a5b8ca06f02004b02fe6f8c93f101138d0bd8da1958dad4195c9b5a5cdcda5bdb9cce8e9d5c19185d1953985d1a5d99541c9a58d94e8e9b9bdd155c19185d195ca06f026f8c93f101148d0bd8da1958dad4195c9b5a5cdcda5bdb9cce8e98d85b1b159a58541c9bde1e4e8e9cdd58d8d95cdcce8e98591b5a5b8c606f026f8c93f10115896f026f8c004c004d005e636865636b5065726d697373696f6e733a3a63616c6c56696150726f78793a3a737563636573733a3a61646d696e3204fc8a8d0a98da1958dad4195c9b5a5cdcda5bdb9cce8e98d85b1b159a58541c9bde1e4e8e9b9bdd155c19185d195ca06f026f8c93f101178d0ad8da1958dad4195c9b5a5cdcda5bdb9cce8e98db185a5b551bdb8e8e9cdd58d8d95cdcce8e98591b5a5b8c606f026f8c93f10118896f026f8c93f10119896f026f8c93f1011a004e004f005000510006f101160056636865636b5065726d697373696f6e733a3a636c61696d546f6e3a3a737563636573733a3a61646d696e320058636865636b5065726d697373696f6e733a3a636c61696d546f6e3a3a7265766572743a3a6e6f7441646d696e04fc896f026f8c93f1011b8d0b18da1958dad4195c9b5a5cdcda5bdb9cce8e9cd95d10591b5a5b9cce8e9cdd58d8d95cdcce8e98591b5a5b8ca06f026f8c93f1011c8d0b58da1958dad4195c9b5a5cdcda5bdb9cce8e9cd95d10591b5a5b9cce8e9c995d995c9d0e8e9b9bdd10591b5a5ba06f026f8c93f1011d896f026f8c8a00520053005400550058636865636b5065726d697373696f6e733a3a73657441646d696e733a3a737563636573733a3a61646d696e310056636865636b5065726d697373696f6e733a3a73657450726f78793a3a737563636573733a3a61646d696e310006f1011e0178896f026f8c93f1011f8d0b18da1958dad4195c9b5a5cdcda5bdb9cce8e9cd95d141c9bde1e4e8e9c995d995c9d0e8e9b9bdd10591b5a5ba06f026f8c00560056636865636b5065726d697373696f6e733a3a73657450726f78793a3a737563636573733a3a61646d696e320201200058005b0201580059005a00713c1da2c8e8823c0a3e10bc0a22c8e8823c0a087c0a3f850c3c1da2c8e8823c0a3e10bc0a22c8e8823c0a007c0a083f850c3e406102ac3cbc20000f00644c24bc1eb8a00037f49bfc584703846824e8cae6e87474e6d0deead8c884caa8e4eacb04020120005d008f020120005e007d020120005f007302012000600061004fb442de2042de217444de2244de23756044de2444de25756044de2644de27756004de2802de29756102012000620066010dd10b78910b7894006302fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8226f1522006c006402fe6f158ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8236f10006c00650062236f10ba246f11f900246f11f900bab002c0ff12b0236f13236f13bab0236f14236f14bab001c0ffb0026f16016f16bab00201200067006a010d5216f13216f138006802fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8226f1022006c006900326f10ba236f11236f11bab0036f12026f1212ba12b001c0ffb0010d5216f13216f138006b02fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8226f1022006c007201962220f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe282104e554c4cba935f037fe0709320c1108ae85f047f006d0286533001d001a712a65074d724d70b0320c0098e8a20c109945b801001e30de30d208e1d135f038bf4d616c666f726d6564206669656c648fe143020fe2030db31e001a4006e007001f66c1220c10991ae923070e254731002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e254732102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2bd209131e30d006f00f88b56c68733a20854753202d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2f02d5d8b57268733a2080402d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e212f02d01c43031532001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900532101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900bd20e300007100c4533101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900fe2030532101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900fe2030003e6f10ba236f11236f11bab0236f12236f12bab001c0ffb0026f14016f14bab00201200074007702012000750076005bf4714f6d176fd90c108719dcc39dd48adc70c10c1087b2e74c45d49adf802cd10e00049aded98f0780371716c384000567c2720201200078007b0201580079007a00af1c3b507b50fb513b517b51e496dffb59fb597b593b58fb5865167c24cc3b507b7c407cbfe38b1c234287065726d697373696f6e7320636865636b2073686f756c64206e6f742068617665207468726f776e824dfe2c238a000ad1c3b507b50fb513b517b51e456fb59fb597b593b58fb585c5ffb44653c24cc1ffb507b7c407cbfe38a1c234247065726d697373696f6e7320636865636b2073686f756c642068617665207468726f776e824dfe2c238a001e9d4083dcc083dd3781643780b84b1137c429085cc71910b7c452a91037c0906798c183d04204de4f1800e437c61037c452a90837c0896f2998b7c080e5ff9137c4528811b7c280d2741818b7c6ca90b7c461004b80b7c68164ac667418e4b8787ac100e05af6a1ec76aa383780c083dcc083dd37814007c00b4c86f017096226f885210b98e32216f88a552206f8120cf318307a08409bc9e3001c86f8c206f88a552106f8112de53316f8101cbff226f88a510236f8501a4e830316f8d95216f88c20097016f8d02c958cce831c9f06c30ed44020158007e0084020158007f00820201200080008102dd208e1b5bd8dad4dd1bdc995e1400dbc09e561bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a001ab01ae011520196041f2e019a041f32000830115480668107cc80658107cb8008302e68210706174687550056f027850046f027550036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae0201200085008b0201200086008701275f0b5807c82284d657373616765c8cbffcb3fc9800890201200088008a015f3c2d601f0820bc13595cdcd859d94819dc99585d195c881d1a185b881b585e135cd9d09e5d195cf232fff2cff2cff260008902ea7082205061636b65747950046f027950036f0276586f0278706f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae012b3c2d601f208a13595cdcd859d97232fff2cff2600aa0008d020148008c008e01293c2da01f208a13595cdcd859d97232fff2cff25620008d02e882205061636b65747950046f027950036f0276586f0278706f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae0009200abc2f20020120009000a802012000910094020158009200930009f6465ffe4c000bd3d6465ffe4c0201200095009e02012000960097042bf40324032ed9e6d9e785cc080646465ffe4ed9e382c40099009a010c009c0201480098009d042b2019201976cf36cf3c2ea040323232fff276cf1c16200099009a010c009c010c71728107cc73009b010c74758107cc76009b02f082384f7074696f6e7356317850056f027850046f027850036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae031cdb3c718107c1db3c728107c2db3c01b901b901b900071c3c34e0020120009f00a70283d785ded9e1037c45290600049b7c0e4c717106000cd18103788e480b7886664f02e37c090d2a91837c0c9916100cd015280e4ac662990b7c0f41998e480e664f100c00a000a501c8207001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e22173830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2217300a101d8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22272802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2237100a201d8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20470802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2257200a301fa804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e271c8cb07cb3fcb1f14cbff13cb1f12cbffcbff6f01017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2d093206eb38ae83000a400ec20d74ac201f2d4c1216f88a553206f8120cf31ab0223d749ab025ca0c07f25d749a93802c300f2d4c25321a06c12c27f8e22807f58a120aa025250d71913cf165415036f8501aa0213d72101a4c851336f8c41349131e22370d72112cf1644046f8521c702936c216d9b029501c86f8c01ded74cd0e202a4206f8820c0008e825b888e3dc871935302bb8e305320a152406f812173a908c0008e10206f11016f1003c9c8cc13cbff12cb3f9d206f11016f105003cbff12cb3fe201a4e8135f03c9e2717880518020806401b700a603f88240536d6c4a6f6241737367788210deadbeef6f027750036f02126f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e21089107870db3c01ab01ae0132001fd786ac100680691b7813780a198786c402012000a900b002014800aa00ad02015800ab00ac009d0c1bc0321be308a38bc0a9489be229548c1be073cc60c1e821026f2540b21be300b7889be229548c1be054c8680072ffc8dbe22944091be1791b085be365485be2308025c05be340b256333a0c726000211bc01c00e614c4a81be300a900b91b086002014800ae00af005132204134b232fff264c8f080238554c8e81632ffc8f000659484331484333780e9540cfa04d7c0f26000071c3c38a002012000b100b602012000b200b3000dd41006815f865c02012000b400b5001d57a800b800c800d8201a7fded43d880031482081c41cb82180861c468008103e880118201a7fded43d8802012000b700b8000df40855a80f871402012000b900bc02012000ba00bb000d20422dc07c38a0000d2042ed007c38a0000d48109b601f0e280201c700be00c302012000bf00c0003bb304061a810050e1020f74e0e4e1e1f8e0e4e1e1fce04f040265c7da87b10201f400c100c200330c2041ee7e10405c5be17e18608432027e843c3dbc6026b68ca000330c2041eebe10405c5be17e18608432027e843c3dbc6026b68ca002012000c400d302012000c500cc02012000c600c902012000c700c800330c2041edbe10405c5be17e18608432027e843c3dbc6026f68ca000330c2041ee7e10405c5be17e18608421dc003e7c3dbc6026b68ca002012000ca00cb00330c2041eebe10405c5be17e18608421dc003e7c3dbc6026b68ca000330c2041edbe10405c5be17e18608421dc003e7c3dbc6026f68ca002012000cd00d002012000ce00cf00330c2041ee7e10405c5be17e186084385013fabc3d7c6026b68ca000330c2041eebe10405c5be17e186084385013fabc3d7c6026b68ca002012000d100d200330c2041edbe10405c5be17e186084385013fabc3d7c6026f68ca001310c2041ee7e10405c5be17e186084085d81f5223c6026b68ca001b702012000d400db02012000d500d802012000d600d701310c2041eebe10405c5be17e186084085d81f5223c6026b68ca001b701310c2041edbe10405c5be17e186084085d81f5223c6026f68ca001b702012000d900da01310c2041ee7e10405c5be17e18608414f24b13a23c6026b68ca001b701310c2041eebe10405c5be17e18608414f24b13a23c6026b68ca001b702012000dc00df02012000dd00de01310c2041edbe10405c5be17e18608414f24b13a23c6026f68ca001b701310c2041ee7e10405c5be17e18608423aa7293e23c6026b68ca001b702012000e000e101310c2041eebe10405c5be17e18608423aa7293e23c6026b68ca001b701310c2041edbe10405c5be17e18608423aa7293e23c6026f68ca001b702012000e3014d02012000e4012102012000e5010402012000e600fb02012000e700f102012000e800e90114ab5f705433334403db3c018502012000ea00eb0133a6d5020f83020f85020f89020f8b020f8f020f91f0474c79b679018502012000ec00f001e3a0e89201fea422a8081601fea4108a01fea422a8080e01fea410234096a8088ea8094e06814d8681425ad82709fd4e16d826040fe2f2c7cb510cab000238c4cce4832021c35cc05f3c591c233c05c14492854c941040d9675cd04b3c5904133c048b5d2562848b5d28408f5ccb3c5b278c3a00ed02fe34366f00708ef25303ba534bbab08e565303ba8e20c8533970d730cf16546a91cf0123d749539aa0a124d74a2559d732cf16126f8c8e2e530aba8e20c8533670d730cf16546761cf0123d7495367a0a124d74a2559d732cf16126f8c97c823cf16126f8ce2e2e30d22d74ac2009502d74cd002de01a4530abee6195f09530100ee00ef0074532870d7305398a070538ba12ba153165530d73424d7495378a0a125d74a2659d732c85003cf16546cb1cf0101cf16546871cf0101cf16126f8c00266f81c99322c2009802a55c6f8113ccc9e86c2102e9a0b60841c185d1a1d54015bc09e14011bc09d5400dbc09e161bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01ab01ae02012000f200f702012000f300f40057a4bc03a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c50201c700f500f60087ad887e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be878a535c2ffdfe4cc1c1c38a002f1a9208c155b1b911d9b919b1d94015bc09d94011bc09d1400dbc09dd61bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a001ab01ae02012000f800f90075a62ee1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50207fd410103a6c900fa016c8240556c6e57726b496e666f7850086f027950076f027950066f027850056f027550046f027750036f0276706f027050036f02126f08019f02012000fc00fd02edad22412027b83a34b7b739a2bc3a3aa80237813aa801b7813cac37813781b6e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f14001ab01ae02012000fe010302012000ff0102020158010001010081bab830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e27074c8cb02ca07cbffc9d08006bbd320f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe28006ba553002005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c502eca82f82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae020120010501120201200106010d0201480107010b0117a6e10440ead8dc9acee4f20d010804fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2166f027950056f027901b701ab01ae0109043450046f027850036f0275586f0279886f0279886f0279886f027901b701b701b7010a03c2886f0278706f026f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201b701ab01ae0103a445010c017c82206c7a53656e6476706f0278706f0278706f027950066f0277500a6f027750096f027950086f027950076f027950056f02487010561059443049906f09019f020120010e0111020120010f011002dda6450420a09e9e9eece2de04f39108139e8192de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501ab01ae0041a7cae1e01c2090be1104101e84816c135402e1f06d080f0407f602e1f0715403410224a9f77f707f217f887f8824820193afed43d801b701b70201200113011c0201200114011b0201200115011602d7a4b50480e6cae882c8c8e4cae6e6f0b0de04de02db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501ab01ae0201200117011a02039b880118011902e95824077726b436f7253746f727950046f027850036f0278586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801ab01ae017f58240556c6e53656e6443666775500b6f0275500a6f027050096f027850086f027050076f027950066f027050056f027950046f027050036f0276586f026f0a8019f0065f005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c502f6aad182186576656e747850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e282186576656e74016f0201ab01ae0201c7011d011e02e7bb1823052637645704366677850046f027850036f0276586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801ab01ae0103bd98011f01f6227101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2d02370804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e25133a15123a1c8532370d730cf165214a113cf41840950030120023ca170d732cf16c9d0d76171c858cf1622cf40c91024db3c017003a012db3c01b901b90201200122013c02012001230133020120012401250071aead917c8041784b514b69127942e33df749e187c51848abf86d51aee2dc3f2085bc318504e7e3dd4c360936894183fa0bca814183fa0bf1400201200126012702daab1982204d64416464727950036f0278586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae0201200128012c011fa4230480c6dedcdccac6e8d2dedcf209012904fe82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2146f027950036f02787001b701ab01ae012a04626f0278706f027850046f027982015d9fed43d86f02797f707f217f887f8824820193afed43d86f0279886f0276716f027901b701b701b7012b03c2886f02107810676f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201b701ab01ae020158012d01310111b918208756c6e79048012e04fe82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2146f027550036f02755801b701ab01ae012f04486f02797f707f217f887f8824820193afed43d86f027982015d9fed43d86f0279886f027901b701b701b7013003d2886f0274706f0274706f0274706f026f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201b701ab01ae0103b9780132018482306c6962536e64436277500c6f0277500b6f0279500a6f027950096f027950086f027450076f027350066f027450056f027350046f027950036f0273586f026f0b019f020120013401370201c90135013602f5b310480caf0cac6a0c2e4c2dae6f0a00ade04f2a008de04eca006de04eab0de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5001ab01ae002bb4a05a10202bdae43a7fe02b17403a67e0262b1776100201200138013b0201480139013a02eba1ee088141858dad95d1e54011bc09e5400dbc09d961bc09e1c1bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01ab01ae02d7a066086135913d89a9e5400dbc09e561bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01ab01ae0226a99f70207f217f887f887f25820132e3ed43d801b701b7020120013d0146020120013e0143020120013f014202012001400141016ba72c43f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f751d06b710e12e03060fe81edf43c501b702dfa76f0470e6cae8a6dad886ccceeea006de04eeb0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501ab01ae02f0aa4a8228556c6e53656e647950056f027950046f027950036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae0201200144014502daabce82204174746573747850036f0276586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae006ca8b5830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20201200147014802d5acd6411831b7b4b739a0b6ba3bac37813780b6e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f14001ab01ae0201200149014c020120014a014b02eda4dce10440a0c2c6d6cae8f2a008de04f2a006de04ecb0de04f0e0de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501ab01ae0103a5eb01b902e0aa0a823853656e6445704366677850036f0278586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae020120014e018c020120014f01760201200150016a0201200151015e02012001520159020158015301560201620154015502d5f6090155b1b989e5d1958dbd91e561bc09bc05b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01ab01ae011daf9fdc151c001c150cccd100f6cf2001850103a01a015701268238556c6e5665726966797650046f02027902015803de82204174746573747850036f0276586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e26f026f0201ab01ae019f020120015a015d0201cb015b015c02f1fc11c27b83a34b7b739ab18bc2802b7813c280237813c2801b7813c2c3781378236e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f1401ab01ae0067b6f005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c5006ba587060e05a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c5020120015f01600150abdd8240556c6e457865637574727650066f027450056f027750046f027750036f0276586f026f05019f0104a827016102e05cdb3c24787802d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22571802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e226760162016601b67f227501d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2237701d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e22474016302e67102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c300e30004767102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3009132e30d120164016500d23122747102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c300c00012b0227501d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e25800d03321767102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c300c000b0017701d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e25901e27102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3008e373124787802d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e201de2670016701e27102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3008e37302471802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2de5065016801ea21727102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3008e363073804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2e30d103540440169006c3173804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2020120016b016c0179add7c1202ab6372932b1bb21b333b8280537813aa804b78138280437813b2803b78138280337813ca802b78138280237813ca801b78139ac37813784c0019f020158016d01740123a473020f8240eb9197ff93020f81e16be169016e03ec82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2f0b501ab01ae016f02ea217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f9008107c42075c8cbffc98107c3f0b5f0b401b9017003ec82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2f0b501ab01ae017102ea217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f9008107c72075c8cbffc98107c6f0b5f0b401b9017203ec82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2f0b501ab01ae017302d6217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f900f823a63cdb3c01b9018501e5a56a418201e5a90242e203a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c5a044e1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c4a6417324be07c61d017502605122a171c85d70d730cf16cb00840958a1a51270d732cf16c9d0d76171c858cf1622cf40c91024db3c017003a012db3c01b901b902012001770182020120017801810201200179017c020120017a017b0103a52b01850073a7e443f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f753062db060fe81cdf432e03060fe81cdf43c5020120017d017e0093a453e0c6e3060e05a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c44180013861f0510017060fae49ae17ffbd020158017f018002edbbf8240536d6c4a6f6241737367788210deadbeef6f027750036f02126f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801ab01ae02f1bfd823050464665656c69627750056f027650046f027550036f0277586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801ab01ae0041aeaa01e86410c080af386b98678b09e59fe5ff8965ff80c081cf386b98e78b64c002012001830187020148018401860121a4a2fee0a826002046e0a866668807b6790185016682304570436f6e6669677050096f027850086f027850076f027850066f027850056f027850046f027850036f0276586f026f08019f0057a5ce03a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c502012001880189006ca80d802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20104aa12018a01dc2173830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22272802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22371018b00f8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20470802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e203c8cb3f13cb1f13cbffcb1fcbff71f90403020120018d01a1020120018e0198020120018f01910121ac5ac114383321b0b1b43281bcb8280240019003fa824077726b436f7253746f727950046f027850036f0278586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2126f0279586f026f0201ab01ae019f020120019201970201200193019400dda47642e1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c54202e203a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c5a002e3ae49ae1601800302012001950196006da009c40b40069c4a9941729811cb5c935c2c05488a9819eb5c935c2c248700025cc48b5c90075c0e6d675d2341444b5c90075c0f8b0c0200efa0f3b511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238b423867b68bb7ec835d2700026c831c0a4dc36cc7835d33437b4ffc0760c6002ea8b27021f03e309320c2ff985220f0413001a401e83031020120019901a0020148019a019b0011a731e0ee02df02de23020148019c019d004fbfdd020d74b0181029eba01c000b0018306d701308250417474657374815ed897bfffbab0f2e42280103b918019e0148823053657445704366677050066f027850056f027850046f027850036f0276586f026f05019f02b06dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae006dad294183016800d38953282e5302396b926b8580a91153033d6b926b858490e0004b98916b9200eb81cdaceba46828896b9200eb81f14002012001a201b002012001a301a403efae4fc11c3130b9b2a9ba37b932bc2c378138383781383837813cc43781378236e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f14001b701ab01ae02012001a501a902015801a601a801b5a26fb511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238b4201a700a28e4eeda2edfb8e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d89320c2008e2422ba945b7fdb31e08e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d8e85f0370d80007a11fb51202014801aa01af02f9a0d60841413d3d3dd9c5bc09e721c73d01491a84573d0610254012844f3d03244dbc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01ab01ae02fc53806f81206f102020c10991ae923070e25350a08409bc8e133507a4702a6f885220be950ac86f8c0ade5085de20c0008e1d24a427bc8e16343505a470742a6f885230be950ac86f8c0ade476604dede21c1098e2021c0099d026f1153a76f81cc541a076f859d026f1153a76f81cc541a076f85e2e30d5098cb0328c20001ac01ad0022026f11b60b53a86f8123cf01541a086f8500708e157327c00191709127e258cb015240cb09cb015038a08e1a38840925c00191709125e25009cb0118cb095210cb0101a44707e202a41067033e21cf32c0008f0788885003cc12cc8e8d21cf32c0018e848858cc01de01e20101b701b701b70057a10c0740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238a02012001b101b301efaff6c77976d176fd9039c183816800d38953282e5302396b926b8580a91153033d6b926b858490e0004b98916b9200eb81cdaceba46828896b9200eb81f110bac183816800d38953282e5302396b926b8580a91153033d6b926b858490e0004b98916b9200eb81cdaceba46828896b9200eb81f1013bec4001b200c8804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e222c00021c300b0955f038104038e2022c30001f823bbb0965b810402db31e020c30002bab095810401db31e0810455e202012001b401b802012001b501b6006ba6b7008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50105a6351101b7000001ceabf9217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f90001b902f402d001a712a6505ca60472d724d70b01532174d724d70b035da6067ad724d70b095244a61072d724d70b012120c10991ae923070e223c0009125955353d748d0e221c300927433dec821d74927b60822d74a5250b6082359d730cf1624c0098e16323334505503cc7023d74a5006a1a54350d73213cf16e30e2201ba01bb006404c0098e1431345055cc7023d74a5006a1a54350d73213cf168e163206b60b541026cf015035a022d74a1023d73113cf16e20048c2008e1bc9c822d749546351d730cf16cc7022d74a5004a1a513d732cf16c9936c21c9e24e5d6972"}