@shipload/sdk 1.0.0-next.1 → 1.0.0-next.10

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 (51) hide show
  1. package/lib/shipload.d.ts +512 -320
  2. package/lib/shipload.js +1960 -1060
  3. package/lib/shipload.js.map +1 -1
  4. package/lib/shipload.m.js +1920 -1056
  5. package/lib/shipload.m.js.map +1 -1
  6. package/package.json +2 -2
  7. package/src/capabilities/modules.ts +3 -0
  8. package/src/capabilities/storage.ts +1 -1
  9. package/src/contracts/platform.ts +13 -1
  10. package/src/contracts/server.ts +227 -282
  11. package/src/data/capabilities.ts +5 -330
  12. package/src/data/capability-formulas.ts +70 -0
  13. package/src/data/catalog.ts +0 -5
  14. package/src/data/colors.ts +2 -16
  15. package/src/data/entities.json +33 -10
  16. package/src/data/item-ids.ts +3 -1
  17. package/src/data/items.json +258 -0
  18. package/src/data/metadata.ts +57 -1
  19. package/src/data/recipes-runtime.ts +1 -0
  20. package/src/data/recipes.json +82 -11
  21. package/src/derivation/capability-mappings.ts +122 -0
  22. package/src/derivation/index.ts +1 -0
  23. package/src/derivation/resources.ts +116 -37
  24. package/src/derivation/stats.ts +1 -2
  25. package/src/entities/container.ts +25 -10
  26. package/src/entities/extractor.ts +144 -0
  27. package/src/entities/gamestate.ts +0 -9
  28. package/src/entities/makers.ts +71 -20
  29. package/src/entities/ship-deploy.ts +114 -56
  30. package/src/entities/ship.ts +17 -0
  31. package/src/entities/slot-multiplier.ts +21 -0
  32. package/src/entities/warehouse.ts +20 -3
  33. package/src/index-module.ts +67 -26
  34. package/src/managers/actions.ts +53 -80
  35. package/src/managers/entities.ts +31 -17
  36. package/src/managers/locations.ts +2 -20
  37. package/src/nft/atomicdata.ts +125 -0
  38. package/src/nft/description.ts +41 -7
  39. package/src/nft/index.ts +1 -0
  40. package/src/resolution/resolve-item.ts +17 -9
  41. package/src/scheduling/accessor.ts +4 -0
  42. package/src/scheduling/projection.ts +8 -0
  43. package/src/scheduling/schedule.ts +15 -1
  44. package/src/scheduling/task-cargo.ts +47 -0
  45. package/src/subscriptions/connection.ts +50 -2
  46. package/src/subscriptions/manager.ts +81 -2
  47. package/src/travel/travel.ts +61 -2
  48. package/src/types/entity-traits.ts +64 -1
  49. package/src/types.ts +11 -1
  50. package/src/utils/cargo.ts +27 -0
  51. package/src/utils/system.ts +25 -24
package/lib/shipload.m.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { __decorate } from 'tslib';
2
- import { Blob, ABI, Struct, Name, UInt64, Checksum256, UInt32, TimePointSec, UInt8, Int64, UInt16, TimePoint, Bytes, Int32, Checksum512, APIClient } from '@wharfkit/antelope';
2
+ import { Blob, ABI, Struct, Name, UInt64, Checksum256, UInt32, TimePointSec, UInt16, UInt8, Int64, TimePoint, Bytes, Int32, Checksum512, APIClient } from '@wharfkit/antelope';
3
3
  import ContractKit, { Contract as Contract$2 } from '@wharfkit/contract';
4
4
 
5
- const abiBlob$1 = Blob.from('DmVvc2lvOjphYmkvMS4yAA0KY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/C2NvbXBhbnlfcm93AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nBmVuYWJsZQABB2VuYWJsZWQEYm9vbAplbmFibGVnYW1lAAIIY29udHJhY3QEbmFtZQdlbmFibGVkBGJvb2wMZm91bmRjb21wYW55AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nC2dhbWVfY29uZmlnAAQEc2VlZAtjaGVja3N1bTI1NgllcG9jaHRpbWUGdWludDMyBXN0YXJ0DnRpbWVfcG9pbnRfc2VjA2VuZA50aW1lX3BvaW50X3NlYwlnYW1lX21ldGEABARuYW1lBnN0cmluZwtkZXNjcmlwdGlvbgZzdHJpbmcDdXJsBnN0cmluZwd2ZXJzaW9uBnN0cmluZwhnYW1lX3JvdwAECGNvbnRyYWN0BG5hbWUGY29uZmlnC2dhbWVfY29uZmlnBG1ldGEJZ2FtZV9tZXRhBXN0YXRlCmdhbWVfc3RhdGUKZ2FtZV9zdGF0ZQABB2VuYWJsZWQEYm9vbAlzdGFydGdhbWUABAhjb250cmFjdARuYW1lBmNvbmZpZwtnYW1lX2NvbmZpZwRtZXRhCWdhbWVfbWV0YQVzdGF0ZQpnYW1lX3N0YXRlCXN0YXRlX3JvdwABB2VuYWJsZWQEYm9vbAp1cGRhdGVnYW1lAAIIY29udHJhY3QEbmFtZQRtZXRhCWdhbWVfbWV0YQR3aXBlAAAHAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAACoeMxUBmVuYWJsZfMBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnRW5hYmxlL2Rpc2FibGUgcGxhdGZvcm0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGUgcGxhdGZvcm0gY29udHJhY3QuAICShql4zFQKZW5hYmxlZ2FtZfwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZWdhbWUKc3VtbWFyeTogJ0VuYWJsZS9kaXNiYWJsZSBhIGdhbWUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGUgc3BlY2lmaWVkIGdhbWUgY29udHJhY3Qu4KepkqI0NV0MZm91bmRjb21wYW55gwItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZm91bmRjb21wYW55CnN1bW1hcnk6ICdGb3VuZCBhIG5ldyBjb21wYW55JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKRm91bmQgYSBuZXcgY29tcGFueSBpbiB0aGUgU2hpcGxvYWQgcGxhdGZvcm0gY29udHJhY3QuAABQ0rB8TcYJc3RhcnRnYW1l/wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3RhcnRnYW1lCnN1bW1hcnk6ICdTdGFydCBhIG5ldyBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKU3RhcnQgYSBuZXcgZ2FtZSBvZiBTaGlwbG9hZCBkZXBsb3llZCB0byBhIG5ldyBjb250cmFjdC4AgJKGqWxS1Qp1cGRhdGVnYW1ljQItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdXBkYXRlZ2FtZQpzdW1tYXJ5OiAnVXBkYXRlIGdhbWUgaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpVcGRhdGUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgZ2FtZSBjb250cmFjdC4KCi0tLQAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0DAAAAwE9TJUUDaTY0AAALY29tcGFueV9yb3cAAAAAAKykYQNpNjQAAAhnYW1lX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwETU2hpcGxvYWQgKFBsYXRmb3JtKRNTaGlwbG9hZCAoUGxhdGZvcm0pAAAAAA==');
5
+ const abiBlob$1 = Blob.from('DmVvc2lvOjphYmkvMS4yAA4KY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/C2NvbXBhbnlfcm93AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nBmVuYWJsZQABB2VuYWJsZWQEYm9vbAplbmFibGVnYW1lAAIIY29udHJhY3QEbmFtZQdlbmFibGVkBGJvb2wMZm91bmRjb21wYW55AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nC2dhbWVfY29uZmlnAAQEc2VlZAtjaGVja3N1bTI1NgllcG9jaHRpbWUGdWludDMyBXN0YXJ0DnRpbWVfcG9pbnRfc2VjA2VuZA50aW1lX3BvaW50X3NlYwlnYW1lX21ldGEABARuYW1lBnN0cmluZwtkZXNjcmlwdGlvbgZzdHJpbmcDdXJsBnN0cmluZwd2ZXJzaW9uBnN0cmluZwhnYW1lX3JvdwAECGNvbnRyYWN0BG5hbWUGY29uZmlnC2dhbWVfY29uZmlnBG1ldGEJZ2FtZV9tZXRhBXN0YXRlCmdhbWVfc3RhdGUKZ2FtZV9zdGF0ZQABB2VuYWJsZWQEYm9vbAxzZXRlcG9jaHRpbWUAAghjb250cmFjdARuYW1lCWVwb2NodGltZQZ1aW50MzIJc3RhcnRnYW1lAAQIY29udHJhY3QEbmFtZQZjb25maWcLZ2FtZV9jb25maWcEbWV0YQlnYW1lX21ldGEFc3RhdGUKZ2FtZV9zdGF0ZQlzdGF0ZV9yb3cAAQdlbmFibGVkBGJvb2wKdXBkYXRlZ2FtZQACCGNvbnRyYWN0BG5hbWUEbWV0YQlnYW1lX21ldGEEd2lwZQAACACAisfka1RECmNsZWFydGFibGW+AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGVhcnRhYmxlCnN1bW1hcnk6ICdERUJVRzogY2xlYXJ0YWJsZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAAAAqHjMVAZlbmFibGXzAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBlbmFibGUKc3VtbWFyeTogJ0VuYWJsZS9kaXNhYmxlIHBsYXRmb3JtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKRW5hYmxlIG9yIGRpc2FibGUgdGhlIHBsYXRmb3JtIGNvbnRyYWN0LgCAkoapeMxUCmVuYWJsZWdhbWX8AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBlbmFibGVnYW1lCnN1bW1hcnk6ICdFbmFibGUvZGlzYmFibGUgYSBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwZWNpZmllZCBnYW1lIGNvbnRyYWN0LuCnqZKiNDVdDGZvdW5kY29tcGFueYMCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGZvdW5kY29tcGFueQpzdW1tYXJ5OiAnRm91bmQgYSBuZXcgY29tcGFueScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1ODExMzc4MiNkM2JmMjkwZmRkZWRkYmI3ZDMyYWE4OTdlOWY3ZTllMTNhMmFlNDQ5NTYxNDJlMjNlYjQ3Yjc3MDk2YTJlYThkCgotLS0KCkZvdW5kIGEgbmV3IGNvbXBhbnkgaW4gdGhlIFNoaXBsb2FkIHBsYXRmb3JtIGNvbnRyYWN0LqCkyw3RqrLCDHNldGVwb2NodGltZQAAAFDSsHxNxglzdGFydGdhbWX/AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzdGFydGdhbWUKc3VtbWFyeTogJ1N0YXJ0IGEgbmV3IGdhbWUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpTdGFydCBhIG5ldyBnYW1lIG9mIFNoaXBsb2FkIGRlcGxveWVkIHRvIGEgbmV3IGNvbnRyYWN0LgCAkoapbFLVCnVwZGF0ZWdhbWWNAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB1cGRhdGVnYW1lCnN1bW1hcnk6ICdVcGRhdGUgZ2FtZSBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1ODExMzc4MiNkM2JmMjkwZmRkZWRkYmI3ZDMyYWE4OTdlOWY3ZTllMTNhMmFlNDQ5NTYxNDJlMjNlYjQ3Yjc3MDk2YTJlYThkCgotLS0KClVwZGF0ZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBnYW1lIGNvbnRyYWN0LgoKLS0tAAAAAACgquMEd2lwZbIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGUKc3VtbWFyeTogJ0RFQlVHOiB3aXBlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQMAAADAT1MlRQNpNjQAAAtjb21wYW55X3JvdwAAAAAArKRhA2k2NAAACGdhbWVfcm93AAAAAACVTcYDaTY0AAAJc3RhdGVfcm93ARNTaGlwbG9hZCAoUGxhdGZvcm0pE1NoaXBsb2FkIChQbGF0Zm9ybSkAAAAA');
6
6
  const abi$1 = ABI.from(abiBlob$1);
7
7
  var Types$1;
8
8
  (function (Types) {
@@ -129,6 +129,18 @@ var Types$1;
129
129
  Struct.type('game_row')
130
130
  ], game_row);
131
131
  Types.game_row = game_row;
132
+ let setepochtime = class setepochtime extends Struct {
133
+ };
134
+ __decorate([
135
+ Struct.field(Name)
136
+ ], setepochtime.prototype, "contract", void 0);
137
+ __decorate([
138
+ Struct.field(UInt32)
139
+ ], setepochtime.prototype, "epochtime", void 0);
140
+ setepochtime = __decorate([
141
+ Struct.type('setepochtime')
142
+ ], setepochtime);
143
+ Types.setepochtime = setepochtime;
132
144
  let startgame = class startgame extends Struct {
133
145
  };
134
146
  __decorate([
@@ -205,27 +217,63 @@ var platform = /*#__PURE__*/Object.freeze({
205
217
  Contract: Contract$1
206
218
  });
207
219
 
208
- const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDiDAQlhZGRtb2R1bGUABQtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQMbW9kdWxlX2luZGV4BXVpbnQ4D21vZHVsZV9jYXJnb19pZAZ1aW50NjQPdGFyZ2V0X2NhcmdvX2lkBnVpbnQ2NAhhZGRuZXh1cwADCm5leHVzX25hbWUGc3RyaW5nAXgFaW50NjQBeQVpbnQ2NAdhZHZhbmNlAAIGcmV2ZWFsBnN0cmluZwZjb21taXQLY2hlY2tzdW0yNTYFYmxlbmQAAwtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAZpbnB1dHMMY2FyZ29faXRlbVtdBmNhbmNlbAADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BWNvdW50BnVpbnQ2NA5jYW5jZWxfcmVzdWx0cwAGCWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQ9jYW5jZWxsZWRfY291bnQFdWludDgQc2NoZWR1bGVfc3RhcnRlZAt0aW1lX3BvaW50PwtlbnRpdHlncm91cAd1aW50NjQ/DWdyb3VwX21lbWJlcnMWQl92ZWN0b3JfZW50aXR5X3JlZl9FPwpjYXJnb19pdGVtAAQHaXRlbV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyBXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCWNhcmdvX3JvdwAGAmlkBnVpbnQ2NAllbnRpdHlfaWQGdWludDY0B2l0ZW1faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NAVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQxjbGFpbXN0YXJ0ZXIAAwdhY2NvdW50BG5hbWUBeAVpbnQ2NAF5BWludDY0CWNsZWFucnN2cAACBWVwb2NoBnVpbnQ2NAhtYXhfcm93cwZ1aW50NjQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BmNvbW1pdAABBmNvbW1pdAtjaGVja3N1bTI1Ngljb25maWdsb2cAAQZjb25maWcLZ2FtZV9jb25maWcNY29udGFpbmVyX3JvdwAIAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzBnVpbnQzMghjYXBhY2l0eQZ1aW50MzIJY2FyZ29tYXNzBnVpbnQzMghzY2hlZHVsZQlzY2hlZHVsZT8LY29vcmRpbmF0ZXMAAwF4BWludDY0AXkFaW50NjQBegd1aW50MTY/BWNyYWZ0AAULZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIGaW5wdXRzDGNhcmdvX2l0ZW1bXQ1jcmFmdGVyX3N0YXRzAAIFc3BlZWQGdWludDE2BWRyYWluBnVpbnQxNgxjcmVhdGVlbnRpdHkABQVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWULZW50aXR5X25hbWUGc3RyaW5nAXgFaW50NjQBeQVpbnQ2NAZkZXBsb3kABAtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NA5wYWNrZWRfaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0CmRlc2NlbnRpdHkABAdpdGVtX2lkBnVpbnQxNgpodWxsX3N0YXRzBnVpbnQ2NAxtb2R1bGVfaXRlbXMIdWludDE2W10MbW9kdWxlX3N0YXRzCHVpbnQ2NFtdBmVuYWJsZQABB2VuYWJsZWQEYm9vbAxlbmVyZ3lfc3RhdHMAAghjYXBhY2l0eQZ1aW50MTYIcmVjaGFyZ2UGdWludDE2FGVudGl0eV9jdXJyZW50X3N0YXRlAAILY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5BnVpbnQxNg9lbnRpdHlfZGVmYXVsdHMAAgt3YXJlaG91c2VfegZ1aW50MTYLY29udGFpbmVyX3oGdWludDE2C2VudGl0eV9pbmZvABkEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwljYXJnb21hc3MGdWludDMyBWNhcmdvDGNhcmdvX2l0ZW1bXQdsb2FkZXJzDWxvYWRlcl9zdGF0cz8HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQZlbmVyZ3kHdWludDE2PwhodWxsbWFzcwd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/CWdlbmVyYXRvcg1lbmVyZ3lfc3RhdHM/CGNhcGFjaXR5B3VpbnQzMj8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwdpc19pZGxlBGJvb2wMY3VycmVudF90YXNrBXRhc2s/FGN1cnJlbnRfdGFza19lbGFwc2VkBnVpbnQzMhZjdXJyZW50X3Rhc2tfcmVtYWluaW5nBnVpbnQzMg1wZW5kaW5nX3Rhc2tzBnRhc2tbXQdpZGxlX2F0C3RpbWVfcG9pbnQ/CHNjaGVkdWxlCXNjaGVkdWxlPw1lbnRpdHlfbGF5b3V0AAIOZW50aXR5X2l0ZW1faWQGdWludDE2BXNsb3RzCnNsb3RfZGVmW10VZW50aXR5X2xheW91dHNfcmVzdWx0AAEIZW50aXRpZXMPZW50aXR5X2xheW91dFtdCmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQOZW50aXR5X3N1bW1hcnkACAR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzB2lzX2lkbGUEYm9vbA5yZXNvbHZlZF9jb3VudAZ1aW50MzINcGVuZGluZ19jb3VudAZ1aW50MzIQZW50aXR5X3Rhc2tfaW5mbwAECWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQp0YXNrX2NvdW50BXVpbnQ4EHNjaGVkdWxlX3N0YXJ0ZWQKdGltZV9wb2ludA9lbnRpdHlncm91cF9yb3cAAgJpZAZ1aW50NjQMcGFydGljaXBhbnRzDGVudGl0eV9yZWZbXQtlbnVtX21lbWJlcgACBXZhbHVlBXVpbnQ4BG5hbWUGc3RyaW5nC2VudW1fcmVzdWx0AAEHbWVtYmVycw1lbnVtX21lbWJlcltdC2dhbWVfY29uZmlnAAMHdmVyc2lvbgZ1aW50MzIIZGVmYXVsdHMPZW50aXR5X2RlZmF1bHRzBWl0ZW1zCml0ZW1fZGVmW10GZ2F0aGVyAAQGc291cmNlCmVudGl0eV9yZWYLZGVzdGluYXRpb24KZW50aXR5X3JlZgdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIOZ2F0aGVyZXJfc3RhdHMABAV5aWVsZAZ1aW50MTYFZHJhaW4GdWludDE2BWRlcHRoBnVpbnQxNgVzcGVlZAZ1aW50MTYJZ2V0Y29uZmlnAAALZ2V0ZW50aXRpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/CWdldGVudGl0eQACC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAtnZXRpdGVtZGF0YQAACmdldGl0ZW1pZHMAAAhnZXRpdGVtcwAADGdldGl0ZW10eXBlcwAAC2dldGxvY2F0aW9uAAIBeAVpbnQ2NAF5BWludDY0CmdldGxvY2RhdGEAAgF4BWludDY0AXkFaW50NjQLZ2V0bW9kdHlwZXMAAApnZXRtb2R1bGVzAAAJZ2V0bmVhcmJ5AAMLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CHJlY2hhcmdlBGJvb2wKZ2V0bmZ0aW5mbwAACWdldHBsYXllcgABB2FjY291bnQEbmFtZQlnZXRyZWNpcGUAAQ5vdXRwdXRfaXRlbV9pZAZ1aW50MTYKZ2V0cmVjaXBlcwACC2xvd2VyX2JvdW5kBnVpbnQxNgVsaW1pdAV1aW50OApnZXRyZXNjYXRzAAALZ2V0cmVzZXJ2ZXMAAgF4BWludDY0AXkFaW50NjQMZ2V0cmVzb3VyY2VzAAAIZ2V0c2xvdHMAAApnZXRzdHJhdHVtAAMBeAVpbnQ2NAF5BWludDY0B3N0cmF0dW0GdWludDE2DGdldHN1bW1hcmllcwACBW93bmVyBG5hbWULZW50aXR5X3R5cGUFbmFtZT8LZ3JvdXB0cmF2ZWwABAhlbnRpdGllcwxlbnRpdHlfcmVmW10BeAVpbnQ2NAF5BWludDY0CHJlY2hhcmdlBGJvb2wEaGFzaAABBXZhbHVlBnN0cmluZwdoYXNoNTEyAAEFdmFsdWUGc3RyaW5nDGhhdWxlcl9zdGF0cwADCGNhcGFjaXR5BXVpbnQ4CmVmZmljaWVuY3kGdWludDE2BWRyYWluBnVpbnQxNgRpbml0AAEEc2VlZAtjaGVja3N1bTI1NghpdGVtX2RlZgAFAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgR0eXBlBXVpbnQ4B3N1YnR5cGUFdWludDgEdGllcgV1aW50OAxpdGVtX2lkX3BhaXIAAgJpZAZ1aW50MTYEbmFtZQZzdHJpbmcPaXRlbV9pZHNfcmVzdWx0AAEFaXRlbXMOaXRlbV9pZF9wYWlyW10PaXRlbWRhdGFfcmVzdWx0AAIFaXRlbXMKaXRlbV9kZWZbXQdyZWNpcGVzDnJlY2lwZXNfcmVzdWx0Cml0ZW1zX2luZm8AAQVpdGVtcwppdGVtX2RlZltdBGpvaW4AAQdhY2NvdW50BG5hbWUMbG9hZGVyX3N0YXRzAAMEbWFzcwZ1aW50MzIGdGhydXN0BnVpbnQxNghxdWFudGl0eQV1aW50OBBsb2NhdGlvbl9kZXJpdmVkAAMMc3RhdGljX3Byb3BzD2xvY2F0aW9uX3N0YXRpYwtlcG9jaF9wcm9wcw5sb2NhdGlvbl9lcG9jaARzaXplBnVpbnQxNg5sb2NhdGlvbl9lcG9jaAADBmFjdGl2ZQRib29sBXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DWxvY2F0aW9uX2luZm8AAgZjb29yZHMLY29vcmRpbmF0ZXMJaXNfc3lzdGVtBGJvb2wMbG9jYXRpb25fcm93AAYCaWQGdWludDY0BW93bmVyBG5hbWULY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb19pdGVtW10Ic2NoZWR1bGUJc2NoZWR1bGU/D2xvY2F0aW9uX3N0YXRpYwAFBmNvb3Jkcwtjb29yZGluYXRlcwR0eXBlDWxvY2F0aW9uX3R5cGUHc3VidHlwZQV1aW50OAVzZWVkMAV1aW50OAVzZWVkMQV1aW50OAxtb2R1bGVfZW50cnkAAgR0eXBlBXVpbnQ4CWluc3RhbGxlZA5wYWNrZWRfbW9kdWxlPwttb2R1bGVfaW5mbwAEAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgttb2R1bGVfdHlwZQV1aW50OAR0aWVyBXVpbnQ4Dm1vZHVsZXNfcmVzdWx0AAEHbW9kdWxlcw1tb2R1bGVfaW5mb1tdDm1vdmVtZW50X3N0YXRzAAIGdGhydXN0BnVpbnQzMgVkcmFpbgZ1aW50MTYLbmVhcmJ5X2luZm8ABQpjYW5fdHJhdmVsBGJvb2wHY3VycmVudBRlbnRpdHlfY3VycmVudF9zdGF0ZQlwcm9qZWN0ZWQUZW50aXR5X2N1cnJlbnRfc3RhdGUKbWF4X2VuZXJneQZ1aW50MTYHc3lzdGVtcw9uZWFyYnlfc3lzdGVtW10NbmVhcmJ5X3N5c3RlbQAECGRpc3RhbmNlBnVpbnQ2NAtlbmVyZ3lfY29zdAZ1aW50NjQLZmxpZ2h0X3RpbWUGdWludDMyCGxvY2F0aW9uDWxvY2F0aW9uX2luZm8JbmV4dXNfcm93AAQCaWQGdWludDY0BW93bmVyBG5hbWUEbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMObmZ0X3NjaGVtYV9kZWYAAgtzY2hlbWFfbmFtZQRuYW1lBmZpZWxkcw5zY2hlbWFfZmllbGRbXRBuZnRfdGVtcGxhdGVfZGVmAAIHaXRlbV9pZAZ1aW50MTYLc2NoZW1hX25hbWUEbmFtZQ1uZnRjb25maWdfcm93AAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQ5uZnRpbmZvX3Jlc3VsdAACB3NjaGVtYXMQbmZ0X3NjaGVtYV9kZWZbXQl0ZW1wbGF0ZXMSbmZ0X3RlbXBsYXRlX2RlZltdBm5vdGlmeQABBWV2ZW50CnRhc2tfZXZlbnQNcGFja2VkX21vZHVsZQACB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAtwbGF5ZXJfaW5mbwAGBW93bmVyBG5hbWUJaXNfcGxheWVyBGJvb2wMY29tcGFueV9uYW1lBnN0cmluZwpzaGlwX2NvdW50BnVpbnQ2NA93YXJlaG91c2VfY291bnQGdWludDY0D2NvbnRhaW5lcl9jb3VudAZ1aW50NjQKcGxheWVyX3JvdwABBW93bmVyBG5hbWUIcmVjaGFyZ2UAAgtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAxyZWNpcGVfaW5wdXQABAdpdGVtX2lkBnVpbnQxNghjYXRlZ29yeQV1aW50OAR0aWVyBXVpbnQ4CHF1YW50aXR5BnVpbnQzMhByZWNpcGVfaXRlbV9pbmZvAAICaWQGdWludDE2BG1hc3MGdWludDMyD3JlY2lwZV9yZXNwb25zZQAHDm91dHB1dF9pdGVtX2lkBnVpbnQxNgtvdXRwdXRfbWFzcwZ1aW50MzIGaW5wdXRzDnJlY2lwZV9pbnB1dFtdCnN0YXRfc2xvdHMUc3RhdF9zbG90X3Jlc3BvbnNlW10NYmxlbmRfd2VpZ2h0cwVieXRlcwtvdXRwdXRfaXRlbRByZWNpcGVfaXRlbV9pbmZvC2lucHV0X2l0ZW1zEnJlY2lwZV9pdGVtX2luZm9bXQ5yZWNpcGVzX3Jlc3VsdAABB3JlY2lwZXMRcmVjaXBlX3Jlc3BvbnNlW10LcmVzZXJ2ZV9yb3cABAJpZAZ1aW50NjQIY29vcmRfaWQGdWludDY0B3N0cmF0dW0GdWludDE2CXJlbWFpbmluZwZ1aW50MzIHcmVzb2x2ZQADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/DXJlc291cmNlX2luZm8ABAJpZAZ1aW50MTYEbWFzcwZ1aW50MzIIY2F0ZWdvcnkFdWludDgEdGllcgV1aW50OA5yZXNvdXJjZV9zdGF0cwADBXN0YXQxBnVpbnQxNgVzdGF0MgZ1aW50MTYFc3RhdDMGdWludDE2EHJlc291cmNlc19yZXN1bHQAAQlyZXNvdXJjZXMPcmVzb3VyY2VfaW5mb1tdCHJtbW9kdWxlAAQLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OA90YXJnZXRfY2FyZ29faWQGdWludDY0CHJtbmZ0Y2ZnAAEHaXRlbV9pZAZ1aW50MTYEc2FsdAABBHNhbHQGdWludDY0CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQJc2V0bmZ0Y2ZnAAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQhzaGlwX3JvdwASAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nBXN0YXRzBnVpbnQ2NAtjb29yZGluYXRlcwtjb29yZGluYXRlcwhodWxsbWFzcwd1aW50MzI/CGNhcGFjaXR5B3VpbnQzMj8GZW5lcmd5B3VpbnQxNj8JY2FyZ29tYXNzBnVpbnQzMgdlbmdpbmVzD21vdmVtZW50X3N0YXRzPwlnZW5lcmF0b3INZW5lcmd5X3N0YXRzPwdsb2FkZXJzDWxvYWRlcl9zdGF0cz8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwZoYXVsZXINaGF1bGVyX3N0YXRzPwdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHNjaGVkdWxlCXNjaGVkdWxlPwhzbG90X2RlZgABBHR5cGUFdWludDgKc3Bhd25jYXJnbwADCWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0C3NwYXducGFja2VkAAQJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQxNgpodWxsX3N0YXRzBnVpbnQ2NAlpbnN0YWxsZWQPcGFja2VkX21vZHVsZVtdC3NwYXduc2VlZGVkAAQJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQFc3RhdHMGdWludDY0EnN0YXRfc2xvdF9yZXNwb25zZQABB3NvdXJjZXMNc3RhdF9zb3VyY2VbXQtzdGF0X3NvdXJjZQACC2lucHV0X2luZGV4BXVpbnQ4EGlucHV0X3N0YXRfaW5kZXgFdWludDgJc3RhdGVfcm93AAYHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzYWx0BnVpbnQ2NAVzaGlwcwZ1aW50MzIEc2VlZAtjaGVja3N1bTI1NgZjb21taXQLY2hlY2tzdW0yNTYMc3RyYXR1bV9kYXRhAAIHc3RyYXR1bQxzdHJhdHVtX2luZm8Fc3RhdHMOcmVzb3VyY2Vfc3RhdHMMc3RyYXR1bV9pbmZvAAUHaXRlbV9pZAZ1aW50MTYEc2VlZAZ1aW50NjQIcmljaG5lc3MGdWludDE2B3Jlc2VydmUGdWludDMyC3Jlc2VydmVfbWF4BnVpbnQzMhFzdHJhdHVtX3JlbWFpbmluZwACB3N0cmF0dW0GdWludDE2CXJlbWFpbmluZwZ1aW50MzIEdGFzawAIBHR5cGUFdWludDgIZHVyYXRpb24GdWludDMyCmNhbmNlbGFibGUFdWludDgLY29vcmRpbmF0ZXMMY29vcmRpbmF0ZXM/BWNhcmdvDGNhcmdvX2l0ZW1bXQxlbnRpdHl0YXJnZXQLZW50aXR5X3JlZj8LZW50aXR5Z3JvdXAHdWludDY0PwtlbmVyZ3lfY29zdAd1aW50MTY/CnRhc2tfZXZlbnQACQpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDE2Pwx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10IdHJhbnNmZXIABwtzb3VyY2VfdHlwZQRuYW1lCXNvdXJjZV9pZAZ1aW50NjQJZGVzdF90eXBlBG5hbWUHZGVzdF9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0CHF1YW50aXR5BnVpbnQzMgZ0cmF2ZWwABQtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbAl0eXBlc19yb3cABAJpZAZ1aW50NjQTZW50aXR5X3N1bW1hcnlfdHlwZQ5lbnRpdHlfc3VtbWFyeRBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnFnN0cmF0dW1fcmVtYWluaW5nX3R5cGURc3RyYXR1bV9yZW1haW5pbmcNd2FyZWhvdXNlX3JvdwALAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nBXN0YXRzBnVpbnQ2NAtjb29yZGluYXRlcwtjb29yZGluYXRlcwhodWxsbWFzcwd1aW50MzI/CGNhcGFjaXR5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgdsb2FkZXJzDWxvYWRlcl9zdGF0cz8HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhzY2hlZHVsZQlzY2hlZHVsZT8Ed2FycAAEC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAp3YXJwX3N0YXRzAAEFcmFuZ2UGdWludDMyBHdpcGUAAAx3aXBlc2VxdWVuY2UAAAR3cmFwAAUFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQIY2FyZ29faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NDsAAFBRJypTMglhZGRtb2R1bGXHAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZGRtb2R1bGUKc3VtbWFyeTogJ0luc3RhbGwgYSBtb2R1bGUgaW50byBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluc3RhbGwgYSBtb2R1bGUgZnJvbSBjYXJnbyBpbnRvIGEgbW9kdWxlIHNsb3Qgb24gYSBsaXZlIGVudGl0eSBvciBhIHBhY2tlZCBlbnRpdHkgaW4gY2FyZ28uIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlIHdpdGggbm8gc2NoZWR1bGVkIHRhc2tzLiBUaGUgbW9kdWxlIHR5cGUgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBzbG90IHR5cGUuIFRoZSBtb2R1bGUgaXRlbSBpcyByZW1vdmVkIGZyb20gY2FyZ28gdXBvbiBpbnN0YWxsYXRpb24uAAAAWHc1UzIIYWRkbmV4dXOnAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZGRuZXh1cwpzdW1tYXJ5OiAnQWRkIGEgbmV4dXMgbG9jYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNyZWF0ZSBhIG5ldyBuZXh1cyBlbnRpdHkgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLiBOZXh1c2VzIGFyZSBvd25lZCBieSB0aGUgY29udHJhY3QgYW5kIHNlcnZlIGFzIGZpeGVkIGdhdGhlcmluZyBwb2ludHMgd2hlcmUgcGxheWVycyBjYW4gd3JhcCwgdW53cmFwLCBkZXBsb3ksIGFuZCBvdGhlcndpc2UgaW50ZXJhY3Qgd2l0aCBORlQtYmFja2VkIGFzc2V0cy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAEChaXYyB2FkdmFuY2XTAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZHZhbmNlCnN1bW1hcnk6ICdBZHZhbmNlIHR1cm4nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkFkdmFuY2UgdGhlIGdhbWUgdG8gdGhlIG5leHQgdHVybi4AAAAAgDRVPAVibGVuZPwCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGJsZW5kCnN1bW1hcnk6ICdCbGVuZCBjYXJnbyBzdGFja3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNvbWJpbmUgbXVsdGlwbGUgY2FyZ28gc3RhY2tzIG9mIHRoZSBzYW1lIGl0ZW0gdHlwZSBpbnRvIGEgc2luZ2xlIHN0YWNrIHdpdGggbmV3IGJsZW5kZWQgc3RhdHMuIEFsbCBpbnB1dCBzdGFja3MgbXVzdCBzaGFyZSB0aGUgc2FtZSBpdGVtIGlkLiBUaGUgb3V0cHV0IHN0YWNrIGhhcyB0aGUgY29tYmluZWQgcXVhbnRpdHkgb2YgYWxsIGlucHV0cy4AAAAARIWmQQZjYW5jZWzCAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjYW5jZWwKc3VtbWFyeTogJ0NhbmNlbCBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbmNlbCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0YXNrcyBmcm9tIHRoZSBlbmQgb2YgYW4gZW50aXR5J3Mgc2NoZWR1bGUuIFRhc2tzIHRoYXQgYXJlIGltbXV0YWJsZSBhbmQgaW4gcHJvZ3Jlc3MgY2Fubm90IGJlIGNhbmNlbGxlZC5wVb4mY+lMRAxjbGFpbXN0YXJ0ZXKFBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGFpbXN0YXJ0ZXIKc3VtbWFyeTogJ0RFQlVHOiBjbGFpbSBhIHN0YXJ0ZXIgc2hpcCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU3Bhd24gYSBwcmUta2l0dGVkIFQxIHN0YXJ0ZXIgc2hpcCBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgZm9yIGEgcmVnaXN0ZXJlZCBwbGF5ZXIuIEF2YWlsYWJsZSBvbmx5IG9uIHRlc3QgZGVwbG95bWVudHMgd2hlcmUgbm8gaW4tZ2FtZSBzaGlwIGVjb25vbXkgeWV0IGV4aXN0cy4gUmVxdWlyZXMgdGhlIGNhbGxlciB0byBiZSBhIGpvaW5lZCBwbGF5ZXIgd2l0aCBubyBleGlzdGluZyBzaGlwczsgdGhlIHJlc3VsdGluZyBzaGlwIGlzIGZpdHRlZCB3aXRoIGEgZ2VuZXJhdG9yLCBlbmdpbmUsIGdhdGhlcmVyLCBjcmFmdGVyLCBhbmQgaGF1bGVyIG1vZHVsZS4AAKgb32lURAljbGVhbnJzdnDsAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGVhbnJzdnAKc3VtbWFyeTogJ0NsZWFuIHVwIHBhc3QgZXBvY2ggcmVzZXJ2ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVyYXNlIHJlc2VydmUgdGFibGUgcm93cyBmcm9tIGEgcGFzdCBlcG9jaC4gQ2Fubm90IGNsZWFuIHRoZSBjdXJyZW50IG9yIGZ1dHVyZSBlcG9jaHMuIFRoZSBtYXhfcm93cyBwYXJhbWV0ZXIgY2FwcyB0aGUgbnVtYmVyIG9mIHJvd3MgZXJhc2VkIHBlciBjYWxsIHRvIGxpbWl0IENQVSB1c2FnZS4AgIrH5GtURApjbGVhcnRhYmxlvgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYXJ0YWJsZQpzdW1tYXJ5OiAnREVCVUc6IGNsZWFydGFibGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAGQnJUUGY29tbWl07AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY29tbWl0CnN1bW1hcnk6ICdTZXQgY29tbWl0IHZhbHVlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTZXQgdGhlIGluaXRpYWwgY29tbWl0IHZhbHVlIGR1cmluZyBnYW1lIGluaXRpYWxpemF0aW9uLgAAYDQytyZFCWNvbmZpZ2xvZ90CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbmZpZ2xvZwpzdW1tYXJ5OiAnTG9nIGdhbWUgY29uZmlndXJhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIHRoYXQgbG9ncyB0aGUgY3VycmVudCBnYW1lIGNvbmZpZ3VyYXRpb24uIENhbGxlZCBpbmxpbmUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdG8gYnJvYWRjYXN0IGNvbmZpZyB2aWEgYWN0aW9uIHRyYWNlcy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAACAvMxFBWNyYWZ0yAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY3JhZnQKc3VtbWFyeTogJ0NyYWZ0IGl0ZW1zIGZyb20gYSByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRyYW5zZm9ybSBjYXJnbyBpdGVtcyBpbnRvIGEgbmV3IGl0ZW0gdXNpbmcgYSByZWNpcGUuIFRoZSBlbnRpdHkgbXVzdCBoYXZlIGEgY3JhZnRlciBtb2R1bGUgaW5zdGFsbGVkLiBDb25zdW1lcyBlbmVyZ3kgYW5kIHNjaGVkdWxlcyBhIGNyYWZ0aW5nIHRhc2sgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiB0b3RhbCBpbnB1dCBtYXNzIGFuZCBjcmFmdGVyIHNwZWVkLiBJbnB1dCBxdWFudGl0aWVzIG11c3QgZXhhY3RseSBtYXRjaCB0aGUgcmVjaXBlIHJlcXVpcmVtZW50cy7gs8tTqWzURQxjcmVhdGVlbnRpdHm/AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjcmVhdGVlbnRpdHkKc3VtbWFyeTogJ0RFQlVHOiBjcmVhdGUgYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAHgaq0oGZGVwbG957AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVwbG95CnN1bW1hcnk6ICdEZXBsb3kgYSBwYWNrZWQgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpVbnBhY2sgYSBwYWNrZWQgZW50aXR5IGl0ZW0gKHBhY2tlZCBzaGlwIG9yIHBhY2tlZCBjb250YWluZXIpIGZyb20gY2FyZ28sIHNjaGVkdWxpbmcgYSBkZXBsb3kgdGFzayB0aGF0IGNyZWF0ZXMgdGhlIG5ldyBlbnRpdHkgYXQgdGhlIGRlcGxveWluZyBlbnRpdHkncyBsb2NhdGlvbiB1cG9uIHJlc29sdXRpb24uAIDPLk+FsEoKZGVzY2VudGl0eckDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlc2NlbnRpdHkKc3VtbWFyeTogJ0Rlc2NyaWJlIGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIGEgcGFja2VkIGVudGl0eSwgZGVyaXZlZCBmcm9tIHRoZSBlbnRpdHkgaXRlbSBpZCwgaHVsbCBzdGF0cywgYW5kIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBtb2R1bGUgaXRlbSBpZHMgYW5kIHN0YXRzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBORlQgcmVuZGVyZXJzIHRvIGRpc3BsYXkgcGFja2VkIGVudGl0aWVzLgAAAACoeMxUBmVuYWJsZd0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC4AAAAAXNWyYQZnYXRoZXKXAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnYXRoZXIKc3VtbWFyeTogJ0dhdGhlciByZXNvdXJjZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkdhdGhlciByZXNvdXJjZXMgYXQgdGhlIHNoaXAncyBjdXJyZW50IGxvY2F0aW9uLiBPbmx5IHdvcmtzIGF0IGdhdGhlcmFibGUgbG9jYXRpb24gdHlwZXMuIFNjaGVkdWxlcyBhIGdhdGhlciB0YXNrIHRoYXQgY29uc3VtZXMgZW5lcmd5IGFuZCB5aWVsZHMgY2FyZ28gYmFzZWQgb24gdGhlIHNoaXAncyBnYXRoZXJlciBzdGF0cyBhbmQgdGhlIGxvY2F0aW9uJ3MgcmVzb3VyY2UgY29tcG9zaXRpb24uAABgbk2KsmIJZ2V0Y29uZmlnygItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0Y29uZmlnCnN1bW1hcnk6ICdHZXQgZ2FtZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSBnYW1lIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIGRlZmF1bHQgZW50aXR5IHN0YXRzIGZvciB3YXJlaG91c2VzIGFuZCBjb250YWluZXJzLCBhbmQgdGhlIGZ1bGwgaXRlbSBkZWZpbml0aW9ucyB0YWJsZS4AsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy4ATDZJquyyYgtnZXRpdGVtZGF0YagDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1kYXRhCnN1bW1hcnk6ICdHZXQgZnVsbCBpdGVtIGNhdGFsb2cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBjb21wbGV0ZSBpdGVtIGNhdGFsb2cgYXMgdGhlIGNvbnRyYWN0IHNlZXMgaXQsIGluY2x1ZGluZyB0eXBlLCBzdWJ0eXBlLCB0aWVyLCBtYXNzLCBhbmQgb3RoZXIgc3RhdGljIG1ldGFkYXRhLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBjbGllbnRzIHRvIG1pcnJvciB0aGUgY29udHJhY3QncyBpdGVtIGRlZmluaXRpb25zLgAATk6q7LJiCmdldGl0ZW1pZHOGAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtaWRzCnN1bW1hcnk6ICdHZXQgaXRlbSBpZCB0byBuYW1lIG1hcHBpbmdzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBtYXBwaW5nIG9mIGl0ZW0gaWQgY29uc3RhbnRzIHRvIHRoZWlyIGNhbm9uaWNhbCBzdHJpbmcgbmFtZXMuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gcmVzb2x2ZSBudW1lcmljIGl0ZW0gaWRzIHRvIGh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXJzLgAAAFiq7LJiCGdldGl0ZW1zmgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXMKc3VtbWFyeTogJ0dldCBhbGwgYXZhaWxhYmxlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgaXRlbXMgaW4gdGhlIGdhbWUgaW5jbHVkaW5nIHRoZWlyIGlkLCBiYXNlIHByaWNlLCBhbmQgbWFzcy6AVfVZquyyYgxnZXRpdGVtdHlwZXOIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtdHlwZXMKc3VtbWFyeTogJ0dldCBpdGVtIHR5cGUgZW51bSB2YWx1ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBpdGVtIHR5cGUgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAocmVzb3VyY2UsIGNvbXBvbmVudCwgbW9kdWxlLCBlbnRpdHkpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBpdGVtIHR5cGUgaWRlbnRpZmllcnMuACZ12SAas2ILZ2V0bG9jYXRpb27iAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NhdGlvbgpzdW1tYXJ5OiAnR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYXRpb24gaW5jbHVkaW5nIHdoZXRoZXIgYSBzeXN0ZW0gZXhpc3RzLCBhbmQgZm9yIGVhY2ggaXRlbTogcHJpY2UsIHN1cHBseSwgcmFyaXR5IG11bHRpcGxpZXIsIGFuZCBsb2NhdGlvbiBtdWx0aXBsaWVyLgCAySYhGrNiCmdldGxvY2RhdGH+Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NkYXRhCnN1bW1hcnk6ICdHZXQgZGVyaXZlZCBsb2NhdGlvbiBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGRlcml2ZWQgbG9jYXRpb24gZGF0YSBpbmNsdWRpbmcgc3RhdGljIHByb3BlcnRpZXMgKHR5cGUsIGRpZmZpY3VsdHksIHNlZWRzKSBmcm9tIHRoZSBnYW1lIHNlZWQgYW5kIGVwb2NoLXNwZWNpZmljIHByb3BlcnRpZXMgKGFjdGl2ZSwgc2VlZHMpIGZyb20gdGhlIGN1cnJlbnQgZXBvY2ggc2VlZC4AsKo+JyqzYgtnZXRtb2R0eXBlc9YDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG1vZHR5cGVzCnN1bW1hcnk6ICdHZXQgbW9kdWxlIHR5cGUgZW51bSB2YWx1ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBtb2R1bGUgdHlwZSBlbnVtIHZhbHVlcyBhbmQgdGhlaXIgc3RyaW5nIG5hbWVzIChhbnksIGVuZ2luZSwgZ2VuZXJhdG9yLCBnYXRoZXJlciwgbG9hZGVyLCB3YXJwLCBjcmFmdGVyLCBsYXVuY2hlciwgc3RvcmFnZSwgaGF1bGVyKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgbW9kdWxlIHN1YnR5cGUgaWRlbnRpZmllcnMgYW5kIHNsb3QgY29tcGF0aWJpbGl0eS4AAFZRJyqzYgpnZXRtb2R1bGVzgAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bW9kdWxlcwpzdW1tYXJ5OiAnR2V0IGFsbCBtb2R1bGUgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgaXRlbXMgY2xhc3NpZmllZCBhcyBtb2R1bGVzLCBpbmNsdWRpbmcgZWFjaCBtb2R1bGUncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGluc3RhbGxhYmxlIGVxdWlwbWVudC4AAPDnGjWzYglnZXRuZWFyYnneAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRuZWFyYnkKc3VtbWFyeTogJ0dldCBuZWFyYnkgcmVhY2hhYmxlIHN5c3RlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgbmVhcmJ5IHN5c3RlbXMgcmVhY2hhYmxlIGJ5IGFuIGVudGl0eSBmcm9tIGl0cyBwcm9qZWN0ZWQgbG9jYXRpb24uIFJldHVybnMgY3VycmVudCBzdGF0ZSAod2l0aCBjb21wbGV0ZWQgdGFza3MgcmVzb2x2ZWQpLCBwcm9qZWN0ZWQgc3RhdGUgKGFmdGVyIGFsbCBzY2hlZHVsZWQgdGFza3MpLCBhbmQgYSBsaXN0IG9mIHJlYWNoYWJsZSBzeXN0ZW1zIHdpdGggZGlzdGFuY2UsIGVuZXJneSBjb3N0LCBmbGlnaHQgdGltZSwgYW5kIG1hcmtldCBpbmZvcm1hdGlvbi4AAF3T5TWzYgpnZXRuZnRpbmZv8AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bmZ0aW5mbwpzdW1tYXJ5OiAnR2V0IE5GVCBzY2hlbWEgYW5kIHRlbXBsYXRlIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBBdG9taWNBc3NldHMgc2NoZW1hcyBhbmQgdGVtcGxhdGVzIHRoZSBnYW1lIGNvbnRyYWN0IGV4cGVjdHMsIHBsdXMgdGhlIGN1cnJlbnQgYGl0ZW1faWQg4oaSICh0ZW1wbGF0ZV9pZCwgc2NoZW1hX25hbWUpYCBtYXBwaW5nIHN0b3JlZCBpbiB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gc3luYyBhdG9taWNhc3NldHMgc3RhdGUgd2l0aCB0aGUgY29udHJhY3QuAAC4yptYs2IJZ2V0cGxheWVy/QItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cGxheWVyCnN1bW1hcnk6ICdHZXQgcGxheWVyIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgcGxheWVyIGluY2x1ZGluZyBiYWxhbmNlLCBkZWJ0LCBuZXR3b3J0aCwgZW50aXR5IGNvdW50cywgYW5kIHByaWNpbmcgZm9yIG5leHQgcHVyY2hhc2VzLiBSZXR1cm5zIGlzX3BsYXllcj1mYWxzZSBpZiB0aGUgYWNjb3VudCBoYXMgbm90IGpvaW5lZCB0aGUgZ2FtZS4AAFDVIXWzYglnZXRyZWNpcGWmAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZWNpcGUKc3VtbWFyeTogJ0dldCBhIHNpbmdsZSBjcmFmdGluZyByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSByZWNpcGUgd2hvc2Ugb3V0cHV0IG1hdGNoZXMgdGhlIGdpdmVuIGl0ZW0gaWQsIGluY2x1ZGluZyBpdHMgaW5wdXRzLCBibGVuZCB3ZWlnaHRzLCBzdGF0IHNsb3RzLCBhbmQgcmVzb2x2ZWQgaXRlbSBtYXNzIGluZm8uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGlzcGxheSBjcmFmdGluZyByZXF1aXJlbWVudHMuAABW1SF1s2IKZ2V0cmVjaXBlc6wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4AAM4GYXWzYgpnZXRyZXNjYXRzngMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzY2F0cwpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIGNhdGVnb3J5IGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAob3JlLCBnYXMsIHJlZ29saXRoLCBiaW9tYXNzLCBjcnlzdGFsKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgcmVzb3VyY2Ugc3VidHlwZSBpZGVudGlmaWVycy4AsNpXYXWzYgtnZXRyZXNlcnZlcwCAFbqaYnWzYgxnZXRyZXNvdXJjZXOHAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZXNvdXJjZXMKc3VtbWFyeTogJ0dldCBhbGwgcmVzb3VyY2UgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgaXRlbXMgY2xhc3NpZmllZCBhcyByZXNvdXJjZXMsIGluY2x1ZGluZyBlYWNoIHJlc291cmNlJ3MgaWQsIG1hc3MsIHN1YnR5cGUsIGFuZCB0aWVyLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGVudW1lcmF0ZSBnYXRoZXJhYmxlIG1hdGVyaWFscy4AAAA404izYghnZXRzbG90c7sDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHNsb3RzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHNsb3QgbGF5b3V0cycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIG1vZHVsZSBzbG90IGxheW91dCBmb3IgZXZlcnkgZW50aXR5IGl0ZW0gdHlwZSwgbGlzdGluZyB0aGUgb3JkZXJlZCBzbG90IHR5cGVzIGF2YWlsYWJsZSBmb3IgbW9kdWxlIGluc3RhbGxhdGlvbi4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZXRlcm1pbmUgd2hpY2ggbW9kdWxlIHR5cGVzIGFyZSBjb21wYXRpYmxlIHdpdGggYSBnaXZlbiBlbnRpdHkgaHVsbC4AgNTZ3IyzYgpnZXRzdHJhdHVt0gItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3RyYXR1bQpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIHN0cmF0dW0gZGF0YScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyByZXNvdXJjZSBzdHJhdHVtIGRhdGEgZm9yIGEgc3BlY2lmaWMgZGVwdGggbGF5ZXIgYXQgYSBjb29yZGluYXRlLCBpbmNsdWRpbmcgdGhlIHN0cmF0dW0gc2VlZCBpbmZvIGFuZCBkZXJpdmVkIHJlc291cmNlIHN0YXRzLoCVu0ZKjbNiDGdldHN1bW1hcmllc+gCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHN1bW1hcmllcwpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdW1tYXJpZXMgZm9yIGEgcGxheWVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXR1cm5zIGxpZ2h0d2VpZ2h0IHN1bW1hcmllcyBvZiBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIgaW5jbHVkaW5nIHR5cGUsIGlkLCBvd25lciwgbmFtZSwgbG9jYXRpb24sIGFuZCBpZGxlIHN0YXR1cy4gT3B0aW9uYWxseSBmaWx0ZXIgYnkgZW50aXR5IHR5cGUuAKLa5uaq6WULZ3JvdXB0cmF2ZWyaBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBncm91cHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBtdWx0aXBsZSBlbnRpdGllcyB0b2dldGhlcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhdGUgZ3JvdXAgdHJhdmVsIGZvciBtdWx0aXBsZSBlbnRpdGllcyB0byBhIGRlc3RpbmF0aW9uLiBBbGwgZW50aXRpZXMgbXVzdCBiZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhbmQgb3duZWQgYnkgdGhlIGNhbGxlci4gQXQgbGVhc3Qgb25lIGVudGl0eSB3aXRoIGVuZ2luZXMgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aHJ1c3QuIEZsaWdodCBkdXJhdGlvbiBpcyBjYWxjdWxhdGVkIGZyb20gY29tYmluZWQgdGhydXN0IGFuZCB0b3RhbCBtYXNzIG9mIGFsbCBlbnRpdGllcy4gQ3JlYXRlcyBhbiBlbnRpdHlncm91cCBmb3IgYXRvbWljIHJlc29sdXRpb24gYW5kIGNhbmNlbGxhdGlvbi4AAAAAANCwaQRoYXNo+AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaGFzaApzdW1tYXJ5OiAnQ2FsY3VsYXRlIHNoYTI1NiBoYXNoJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYWxjdWxhdGVzIHRoZSBzaGEyNTYgaGFzaCBvZiBhIHN0cmluZyBiYXNlZCB1c2luZyB0aGUgZ2FtZSBzZWVkLgAAAECE0rBpB2hhc2g1MTL7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoNTEyCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhNTEyIGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTUxMiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAAACQ3XQEaW5pdPoBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGluaXQKc3VtbWFyeTogJ0luaXRpYWxpemUgZ2FtZSBzZWVkJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWFsaXplIGEgdGhlIGdhbWVzIHNlZWQgYW5kIHNlZWQgdmFsdWVzIHRvIGJvb3RzdHJhcCBnYW1lIHN0YXRlLgAAAAAAMB19BGpvaW7EAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBqb2luCnN1bW1hcnk6ICdKb2luIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSm9pbiBhIGdhbWUgb2YgU2hpcGxvYWQAAAAA+OUynQZub3RpZnmKAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBub3RpZnkKc3VtbWFyeTogJ1Rhc2sgbGlmZWN5Y2xlIG5vdGlmaWNhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIHRoYXQgbm90aWZpZXMgZW50aXR5IG93bmVycyBvZiB0YXNrIGxpZmVjeWNsZSBldmVudHMgKHJlc29sdmVkLCBjYW5jZWxsZWQpLiBDYWxsZWQgaW5saW5lIHdoZW4gdGFza3MgY2hhbmdlIHN0YXRlLiBVc2VzIHJlcXVpcmVfcmVjaXBpZW50IHRvIGVuYWJsZSBvZmYtY2hhaW4gbW9uaXRvcmluZyB2aWEgYWN0aW9uIHRyYWNlcy4AAACKXdOQughyZWNoYXJnZc0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlY2hhcmdlCnN1bW1hcnk6ICdSZWNoYXJnZSBzaGlwIGVuZXJneScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2NoZWR1bGUgYSByZWNoYXJnZSB0YXNrIGZvciBhbiBlbnRpdHkgdG8gcmVzdG9yZSBlbmVyZ3kgdG8gZnVsbCBjYXBhY2l0eS4gVGhlIHJlY2hhcmdlIGR1cmF0aW9uIGRlcGVuZHMgb24gY3VycmVudCBlbmVyZ3kgbGV2ZWwgYW5kIHJlY2hhcmdlIHJhdGUuAAAAQO1IsboHcmVzb2x2ZdADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlc29sdmUKc3VtbWFyeTogJ0NvbXBsZXRlIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVzb2x2ZSBjb21wbGV0ZWQgdGFza3MgaW4gYW4gZW50aXR5J3Mgc2NoZWR1bGUsIGFwcGx5aW5nIHRoZWlyIGVmZmVjdHMgKHJlY2hhcmdlIGVuZXJneSwgdXBkYXRlIGxvY2F0aW9uLCBsb2FkL3VubG9hZCBjYXJnbykuIElmIGNvdW50IGlzIHNwZWNpZmllZCwgcmVzb2x2ZSBleGFjdGx5IHRoYXQgbWFueSB0YXNrczsgb3RoZXJ3aXNlIHJlc29sdmUgYWxsIGNvbXBsZXRlZCB0YXNrcy4gRmFpbHMgaWYgY291bnQgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlZCB0YXNrcy4AAAAq6kSlvAhybW1vZHVsZbwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJtbW9kdWxlCnN1bW1hcnk6ICdSZW1vdmUgYSBtb2R1bGUgZnJvbSBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlbW92ZSBhbiBpbnN0YWxsZWQgbW9kdWxlIGZyb20gYSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSBpcyByZXR1cm5lZCB0byBjYXJnby4gRmFpbHMgaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBoYXZlIGVub3VnaCBjYXJnbyBjYXBhY2l0eSB0byBob2xkIHRoZSByZXR1cm5lZCBtb2R1bGUuAAAAbKG8prwIcm1uZnRjZmehAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW5mdGNmZwpzdW1tYXJ5OiAnUmVtb3ZlIE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgdGhlIEF0b21pY0Fzc2V0cyB0ZW1wbGF0ZSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gaWQgZnJvbSB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIEFmdGVyIHJlbW92YWwgdGhlIGl0ZW0gY2FuIG5vIGxvbmdlciBiZSB3cmFwcGVkIG9yIHVud3JhcHBlZCB1bnRpbCBhIG5ldyBtYXBwaW5nIGlzIHNldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAAAAkKPBBHNhbHTYAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzYWx0CnN1bW1hcnk6ICdBcHBlbmQgU2FsdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQWRkIGFkZGl0aW9uYWwgc2FsdCB0byB0aGUgbmV4dCBlcG9jaCBzZWVkLgAAYAvlNbPCCXNldG5mdGNmZ8QDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNldG5mdGNmZwpzdW1tYXJ5OiAnU2V0IE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpCaW5kIGFuIGl0ZW0gaWQgdG8gYW4gQXRvbWljQXNzZXRzIHRlbXBsYXRlIGlkIGFuZCBzY2hlbWEgbmFtZS4gVXNlZCB0byBjb25maWd1cmUgaG93IHRoZSBjb250cmFjdCBtaW50cyBhbmQgcmVjb2duaXplcyBORlRzIGZvciBhIGdpdmVuIGl0ZW0uIEluc2VydHMgYSBuZXcgbWFwcGluZyBpZiBvbmUgZG9lcyBub3QgZXhpc3QsIG9yIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIG1hcHBpbmcuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAGXXoMlNxQpzcGF3bmNhcmdvxQEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Bhd25jYXJnbwpzdW1tYXJ5OiAnREVCVUc6IHNwYXduIGNhcmdvIG9uIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQCSgsjUyU3FC3NwYXducGFja2Vk5wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Bhd25wYWNrZWQKc3VtbWFyeTogJ0RFQlVHOiBzcGF3biBhIHBhY2tlZCBlbnRpdHkgd2l0aCBpbnN0YWxsZWQgbW9kdWxlcyBvbiBhbiBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AkkpK4clNxQtzcGF3bnNlZWRlZM0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNwYXduc2VlZGVkCnN1bW1hcnk6ICdERUJVRzogc3Bhd24gc2VlZGVkIGNhcmdvIG9uIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAFctPM3NCHRyYW5zZmVyyAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdHJhbnNmZXIKc3VtbWFyeTogJ1RyYW5zZmVyIGNhcmdvIGJldHdlZW4gZW50aXRpZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRyYW5zZmVyIGNhcmdvIGJldHdlZW4gdHdvIGVudGl0aWVzIGF0IHRoZSBzYW1lIGxvY2F0aW9uLiBCb3RoIGVudGl0aWVzIG11c3QgYmUgb3duZWQgYnkgdGhlIGNhbGxlciBhbmQgYXQgbGVhc3Qgb25lIG11c3QgaGF2ZSBsb2FkZXJzLiBDcmVhdGVzIGxvYWQgYW5kIHVubG9hZCB0YXNrcyBvbiBib3RoIGVudGl0aWVzIHdpdGggZHVyYXRpb24gYmFzZWQgb24gY29tYmluZWQgbG9hZGVyIGNhcGFjaXR5IGFuZCBaLWRpc3RhbmNlIGJldHdlZW4gdGhlbS4AAAAARLXNzQZ0cmF2ZWz7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB0cmF2ZWwKc3VtbWFyeTogJ01vdmUgYSBzaGlwJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSB0cmF2ZWwgb2YgYW4gZW50aXR5IGZyb20gaXRzIGN1cnJlbnQgbG9jYXRpb24gdG8gYSBuZXcgZGVzdGluYXRpb24uAAAAAABQr+EEd2FycJ8DLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdhcnAKc3VtbWFyeTogJ1dhcnAgdG8gYSBkZXN0aW5hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5zdGFudGx5IHRlbGVwb3J0IGFuIGVudGl0eSB0byBhIGRlc3RpbmF0aW9uIHN5c3RlbS4gUmVxdWlyZXMgd2FycCBjYXBhYmlsaXR5LCBmdWxsIGVuZXJneSwgZW1wdHkgY2FyZ28sIGFuZCBhbiBlbXB0eSBzY2hlZHVsZS4gVGhlIGRlc3RpbmF0aW9uIG11c3QgYmUgYSB2YWxpZCBzeXN0ZW0gd2l0aGluIHdhcnAgcmFuZ2UuIFJlc29sdmVzIGltbWVkaWF0ZWx5IGFzIGEgemVyby1kdXJhdGlvbiB0YXNrLgAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS2g0FTaKqyq4wx3aXBlc2VxdWVuY2XCAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlc2VxdWVuY2UKc3VtbWFyeTogJ0RFQlVHOiB3aXBlc2VxdWVuY2UgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAABQzeUEd3JhcP4DLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdyYXAKc3VtbWFyeTogJ1dyYXAgY2FyZ28gaW50byBhbiBORlQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCldyYXAgYSBxdWFudGl0eSBvZiBjYXJnbyBmcm9tIGFuIGVudGl0eSBpbnRvIGFuIEF0b21pY0Fzc2V0cyBORlQgbWludGVkIHRvIHRoZSBzcGVjaWZpZWQgb3duZXIuIFRoZSBlbnRpdHkgbXVzdCBiZSBhdCBhIG5leHVzLCBoYXZlIGxvYWRlcnMsIGFuZCBjb250YWluIGVub3VnaCBvZiB0aGUgcmVxdWVzdGVkIGNhcmdvLiBTY2hlZHVsZXMgYSB3cmFwIHRhc2sgdGhhdCwgb24gcmVzb2x1dGlvbiwgcmVtb3ZlcyB0aGUgY2FyZ28gZnJvbSB0aGUgZW50aXR5IGFuZCBtaW50cyB0aGUgTkZUIHVzaW5nIHRoZSB0ZW1wbGF0ZSBjb25maWd1cmVkIGZvciB0aGF0IGl0ZW0gaWQuDQAAAAAAyq5BA2k2NAAACWNhcmdvX3JvdwAAuGo6kydFA2k2NAAADWNvbnRhaW5lcl9yb3cAqqaX+ezyVANpNjQAAA9lbnRpdHlncm91cF9yb3cAAACTumwQjQNpNjQAAAxsb2NhdGlvbl9yb3cAAAAAAKy7mgNpNjQAAAluZXh1c19yb3cAAGBuTYrymgNpNjQAAA1uZnRjb25maWdfcm93AAAAAFzlTawDaTY0AAAKcGxheWVyX3JvdwAAAEDtq7C6A2k2NAAAC3Jlc2VydmVfcm93AAAACk2lrcIDaTY0AAAMc2VxdWVuY2Vfcm93AAAAAABQXcMDaTY0AAAIc2hpcF9yb3cAAAAAAJVNxgNpNjQAAAlzdGF0ZV9yb3cAAAAAAKyqzwNpNjQAAAl0eXBlc19yb3cAAFBY06au4QNpNjQAAA13YXJlaG91c2Vfcm93ARFTaGlwbG9hZCAoU2VydmVyKRFTaGlwbG9hZCAoU2VydmVyKQAAACQAAAAARIWmQQ5jYW5jZWxfcmVzdWx0cwAAAACAvMxFDHRhc2tfcmVzdWx0cwAAAAB4GqtKDHRhc2tfcmVzdWx0cwCAzy5PhbBKBnN0cmluZwAAAABc1bJhDHRhc2tfcmVzdWx0cwAAYG5NirJiC2dhbWVfY29uZmlnALBy2eWpsmINZW50aXR5X2luZm9bXQAA8NnlqbJiC2VudGl0eV9pbmZvAEw2SarssmIPaXRlbWRhdGFfcmVzdWx0AABOTqrssmIPaXRlbV9pZHNfcmVzdWx0AAAAWKrssmIKaXRlbXNfaW5mb4BV9Vmq7LJiC2VudW1fcmVzdWx0ACZ12SAas2INbG9jYXRpb25faW5mbwCAySYhGrNiEGxvY2F0aW9uX2Rlcml2ZWQAsKo+JyqzYgtlbnVtX3Jlc3VsdAAAVlEnKrNiDm1vZHVsZXNfcmVzdWx0AADw5xo1s2ILbmVhcmJ5X2luZm8AAF3T5TWzYg5uZnRpbmZvX3Jlc3VsdAAAuMqbWLNiC3BsYXllcl9pbmZvAABQ1SF1s2IOcmVjaXBlc19yZXN1bHQAAFbVIXWzYg5yZWNpcGVzX3Jlc3VsdAAAzgZhdbNiC2VudW1fcmVzdWx0ALDaV2F1s2ITc3RyYXR1bV9yZW1haW5pbmdbXYAVuppidbNiEHJlc291cmNlc19yZXN1bHQAAAA404izYhVlbnRpdHlfbGF5b3V0c19yZXN1bHQAgNTZ3IyzYgxzdHJhdHVtX2RhdGGAlbtGSo2zYhBlbnRpdHlfc3VtbWFyeVtdAKLa5uaq6WUMdGFza19yZXN1bHRzAAAAAADQsGkLY2hlY2tzdW0yNTYAAABAhNKwaQtjaGVja3N1bTUxMgAAAIpd05C6DHRhc2tfcmVzdWx0cwAAAEDtSLG6D3Jlc29sdmVfcmVzdWx0cwAAAFctPM3NDHRhc2tfcmVzdWx0cwAAAABEtc3NDHRhc2tfcmVzdWx0cwAAAAAAUK/hDHRhc2tfcmVzdWx0cwAAAAAAUM3lDHRhc2tfcmVzdWx0cw==');
220
+ const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDiFAQlhZGRtb2R1bGUABAllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgp0YXJnZXRfcmVmCmNhcmdvX3JlZj8IYWRkbmV4dXMAAwpuZXh1c19uYW1lBnN0cmluZwF4BWludDY0AXkFaW50NjQHYWR2YW5jZQACBnJldmVhbAZzdHJpbmcGY29tbWl0C2NoZWNrc3VtMjU2BWJsZW5kAAICaWQGdWludDY0BmlucHV0cwxjYXJnb19pdGVtW10GY2FuY2VsAAICaWQGdWludDY0BWNvdW50BnVpbnQ2NA5jYW5jZWxfcmVzdWx0cwAGCWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQ9jYW5jZWxsZWRfY291bnQFdWludDgQc2NoZWR1bGVfc3RhcnRlZAt0aW1lX3BvaW50PwtlbnRpdHlncm91cAd1aW50NjQ/DWdyb3VwX21lbWJlcnMWQl92ZWN0b3JfZW50aXR5X3JlZl9FPwpjYXJnb19pdGVtAAQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10IcXVhbnRpdHkGdWludDMyCWNhcmdvX3JlZgADB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCWNhcmdvX3JvdwAGAmlkBnVpbnQ2NAllbnRpdHlfaWQGdWludDY0B2l0ZW1faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NAVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQpjYXJnb192aWV3AAUHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10IcXVhbnRpdHkGdWludDMyAmlkBnVpbnQ2NAxjbGFpbXN0YXJ0ZXIAAwdhY2NvdW50BG5hbWUBeAVpbnQ2NAF5BWludDY0CWNsZWFucnN2cAACBWVwb2NoBnVpbnQ2NAhtYXhfcm93cwZ1aW50NjQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BmNvbW1pdAABBmNvbW1pdAtjaGVja3N1bTI1Ngljb25maWdsb2cAAQZjb25maWcLZ2FtZV9jb25maWcLY29vcmRpbmF0ZXMAAwF4BWludDY0AXkFaW50NjQBegd1aW50MTY/BWNyYWZ0AAQCaWQGdWludDY0CXJlY2lwZV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyBmlucHV0cwxjYXJnb19pdGVtW10NY3JhZnRlcl9zdGF0cwACBXNwZWVkBnVpbnQxNgVkcmFpbgZ1aW50MTYMY3JlYXRlZW50aXR5AAUFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwF4BWludDY0AXkFaW50NjQIZGVtb2xpc2gAAQllbnRpdHlfaWQGdWludDY0BmRlcGxveQACAmlkBnVpbnQ2NANyZWYJY2FyZ29fcmVmCmRlc2NlbnRpdHkABAdpdGVtX2lkBnVpbnQxNgpodWxsX3N0YXRzBnVpbnQ2NAxtb2R1bGVfaXRlbXMIdWludDE2W10MbW9kdWxlX3N0YXRzCHVpbnQ2NFtdBmVuYWJsZQABB2VuYWJsZWQEYm9vbAxlbmVyZ3lfc3RhdHMAAghjYXBhY2l0eQZ1aW50MTYIcmVjaGFyZ2UGdWludDE2FGVudGl0eV9jdXJyZW50X3N0YXRlAAILY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5BnVpbnQxNg9lbnRpdHlfZGVmYXVsdHMAAgt3YXJlaG91c2VfegZ1aW50MTYLY29udGFpbmVyX3oGdWludDE2C2VudGl0eV9pbmZvABkEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwljYXJnb21hc3MGdWludDMyBWNhcmdvDGNhcmdvX3ZpZXdbXQdsb2FkZXJzDWxvYWRlcl9zdGF0cz8HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQZlbmVyZ3kHdWludDE2PwhodWxsbWFzcwd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/CWdlbmVyYXRvcg1lbmVyZ3lfc3RhdHM/CGNhcGFjaXR5B3VpbnQzMj8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwdpc19pZGxlBGJvb2wMY3VycmVudF90YXNrBXRhc2s/FGN1cnJlbnRfdGFza19lbGFwc2VkBnVpbnQzMhZjdXJyZW50X3Rhc2tfcmVtYWluaW5nBnVpbnQzMg1wZW5kaW5nX3Rhc2tzBnRhc2tbXQdpZGxlX2F0C3RpbWVfcG9pbnQ/CHNjaGVkdWxlCXNjaGVkdWxlPw1lbnRpdHlfbGF5b3V0AAIOZW50aXR5X2l0ZW1faWQGdWludDE2BXNsb3RzCnNsb3RfZGVmW10VZW50aXR5X2xheW91dHNfcmVzdWx0AAEIZW50aXRpZXMPZW50aXR5X2xheW91dFtdCmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKZW50aXR5X3JvdwAUAmlkBnVpbnQ2NAVvd25lcgRuYW1lBGtpbmQEbmFtZQRuYW1lBnN0cmluZwVzdGF0cwZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMIaHVsbG1hc3MHdWludDMyPwhjYXBhY2l0eQd1aW50MzI/BmVuZXJneQd1aW50MTY/CWNhcmdvbWFzcwZ1aW50MzIHZW5naW5lcw9tb3ZlbWVudF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8HbG9hZGVycw1sb2FkZXJfc3RhdHM/CGdhdGhlcmVyD2dhdGhlcmVyX3N0YXRzPwR3YXJwC3dhcnBfc3RhdHM/B2NyYWZ0ZXIOY3JhZnRlcl9zdGF0cz8GaGF1bGVyDWhhdWxlcl9zdGF0cz8HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhzY2hlZHVsZQlzY2hlZHVsZT8HaXRlbV9pZAZ1aW50MTYOZW50aXR5X3N1bW1hcnkACAR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzB2lzX2lkbGUEYm9vbA5yZXNvbHZlZF9jb3VudAZ1aW50MzINcGVuZGluZ19jb3VudAZ1aW50MzIQZW50aXR5X3Rhc2tfaW5mbwAECWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQp0YXNrX2NvdW50BXVpbnQ4EHNjaGVkdWxlX3N0YXJ0ZWQKdGltZV9wb2ludA9lbnRpdHlncm91cF9yb3cAAgJpZAZ1aW50NjQMcGFydGljaXBhbnRzDGVudGl0eV9yZWZbXQtlbnVtX21lbWJlcgACBXZhbHVlBXVpbnQ4BG5hbWUGc3RyaW5nC2VudW1fcmVzdWx0AAEHbWVtYmVycw1lbnVtX21lbWJlcltdDGZpeGNhcmdvbWFzcwABCWVudGl0eV9pZAZ1aW50NjQLZ2FtZV9jb25maWcAAwd2ZXJzaW9uBnVpbnQzMghkZWZhdWx0cw9lbnRpdHlfZGVmYXVsdHMFaXRlbXMKaXRlbV9kZWZbXQZnYXRoZXIABAlzb3VyY2VfaWQGdWludDY0DmRlc3RpbmF0aW9uX2lkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIOZ2F0aGVyZXJfc3RhdHMABAV5aWVsZAZ1aW50MTYFZHJhaW4GdWludDE2BWRlcHRoBnVpbnQxNgVzcGVlZAZ1aW50MTYJZ2V0Y29uZmlnAAALZ2V0ZWxpZ2libGUAAgZjb29yZHMLY29vcmRpbmF0ZXMHc3RyYXR1bQZ1aW50MTYLZ2V0ZW50aXRpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/CWdldGVudGl0eQABCWVudGl0eV9pZAZ1aW50NjQLZ2V0aXRlbWRhdGEAAApnZXRpdGVtaWRzAAAIZ2V0aXRlbXMAAAxnZXRpdGVtdHlwZXMAAAtnZXRsb2NhdGlvbgACAXgFaW50NjQBeQVpbnQ2NApnZXRsb2NkYXRhAAIBeAVpbnQ2NAF5BWludDY0C2dldG1vZHR5cGVzAAAKZ2V0bW9kdWxlcwAACWdldG5lYXJieQACCWVudGl0eV9pZAZ1aW50NjQIcmVjaGFyZ2UEYm9vbApnZXRuZnRpbmZvAAAJZ2V0cGxheWVyAAEHYWNjb3VudARuYW1lCWdldHJlY2lwZQABDm91dHB1dF9pdGVtX2lkBnVpbnQxNgpnZXRyZWNpcGVzAAILbG93ZXJfYm91bmQGdWludDE2BWxpbWl0BXVpbnQ4CmdldHJlc2NhdHMAAAtnZXRyZXNlcnZlcwACAXgFaW50NjQBeQVpbnQ2NAxnZXRyZXNvdXJjZXMAAAhnZXRzbG90cwAACmdldHN0cmF0dW0AAwF4BWludDY0AXkFaW50NjQHc3RyYXR1bQZ1aW50MTYMZ2V0c3VtbWFyaWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwtncm91cHRyYXZlbAAECGVudGl0aWVzDGVudGl0eV9yZWZbXQF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbARoYXNoAAEFdmFsdWUGc3RyaW5nB2hhc2g1MTIAAQV2YWx1ZQZzdHJpbmcMaGF1bGVyX3N0YXRzAAMIY2FwYWNpdHkFdWludDgKZWZmaWNpZW5jeQZ1aW50MTYFZHJhaW4GdWludDE2CmluaXRpYWxpemUAAQRzZWVkC2NoZWNrc3VtMjU2CGl0ZW1fZGVmAAUCaWQGdWludDE2BG1hc3MGdWludDMyBHR5cGUFdWludDgHc3VidHlwZQV1aW50OAR0aWVyBXVpbnQ4DGl0ZW1faWRfcGFpcgACAmlkBnVpbnQxNgRuYW1lBnN0cmluZw9pdGVtX2lkc19yZXN1bHQAAQVpdGVtcw5pdGVtX2lkX3BhaXJbXQ9pdGVtZGF0YV9yZXN1bHQAAgVpdGVtcwppdGVtX2RlZltdB3JlY2lwZXMOcmVjaXBlc19yZXN1bHQKaXRlbXNfaW5mbwABBWl0ZW1zCml0ZW1fZGVmW10Eam9pbgABB2FjY291bnQEbmFtZQxsb2FkZXJfc3RhdHMAAwRtYXNzBnVpbnQzMgZ0aHJ1c3QGdWludDE2CHF1YW50aXR5BXVpbnQ4EGxvY2F0aW9uX2Rlcml2ZWQAAgxzdGF0aWNfcHJvcHMPbG9jYXRpb25fc3RhdGljBHNpemUGdWludDE2DWxvY2F0aW9uX2luZm8AAgZjb29yZHMLY29vcmRpbmF0ZXMJaXNfc3lzdGVtBGJvb2wPbG9jYXRpb25fc3RhdGljAAUGY29vcmRzC2Nvb3JkaW5hdGVzBHR5cGUNbG9jYXRpb25fdHlwZQdzdWJ0eXBlBXVpbnQ4BXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DG1vZHVsZV9lbnRyeQACBHR5cGUFdWludDgJaW5zdGFsbGVkDnBhY2tlZF9tb2R1bGU/C21vZHVsZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyC21vZHVsZV90eXBlBXVpbnQ4BHRpZXIFdWludDgObW9kdWxlc19yZXN1bHQAAQdtb2R1bGVzDW1vZHVsZV9pbmZvW10ObW92ZW1lbnRfc3RhdHMAAgZ0aHJ1c3QGdWludDMyBWRyYWluBnVpbnQxNgtuZWFyYnlfaW5mbwAFCmNhbl90cmF2ZWwEYm9vbAdjdXJyZW50FGVudGl0eV9jdXJyZW50X3N0YXRlCXByb2plY3RlZBRlbnRpdHlfY3VycmVudF9zdGF0ZQptYXhfZW5lcmd5BnVpbnQxNgdzeXN0ZW1zD25lYXJieV9zeXN0ZW1bXQ1uZWFyYnlfc3lzdGVtAAQIZGlzdGFuY2UGdWludDY0C2VuZXJneV9jb3N0BnVpbnQ2NAtmbGlnaHRfdGltZQZ1aW50MzIIbG9jYXRpb24NbG9jYXRpb25faW5mbw5uZnRfc2NoZW1hX2RlZgACC3NjaGVtYV9uYW1lBG5hbWUGZmllbGRzDnNjaGVtYV9maWVsZFtdEG5mdF90ZW1wbGF0ZV9kZWYAAgdpdGVtX2lkBnVpbnQxNgtzY2hlbWFfbmFtZQRuYW1lDW5mdGNvbmZpZ19yb3cAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lDm5mdGluZm9fcmVzdWx0AAIHc2NoZW1hcxBuZnRfc2NoZW1hX2RlZltdCXRlbXBsYXRlcxJuZnRfdGVtcGxhdGVfZGVmW10Gbm90aWZ5AAEFZXZlbnQKdGFza19ldmVudA1wYWNrZWRfbW9kdWxlAAIHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0C3BsYXllcl9pbmZvAAMFb3duZXIEbmFtZQlpc19wbGF5ZXIEYm9vbAxjb21wYW55X25hbWUGc3RyaW5nCnBsYXllcl9yb3cAAQVvd25lcgRuYW1lCHJlY2hhcmdlAAECaWQGdWludDY0DHJlY2lwZV9pbnB1dAAEB2l0ZW1faWQGdWludDE2CGNhdGVnb3J5BXVpbnQ4BHRpZXIFdWludDgIcXVhbnRpdHkGdWludDMyEHJlY2lwZV9pdGVtX2luZm8AAgJpZAZ1aW50MTYEbWFzcwZ1aW50MzIPcmVjaXBlX3Jlc3BvbnNlAAcOb3V0cHV0X2l0ZW1faWQGdWludDE2C291dHB1dF9tYXNzBnVpbnQzMgZpbnB1dHMOcmVjaXBlX2lucHV0W10Kc3RhdF9zbG90cxRzdGF0X3Nsb3RfcmVzcG9uc2VbXQ1ibGVuZF93ZWlnaHRzBWJ5dGVzC291dHB1dF9pdGVtEHJlY2lwZV9pdGVtX2luZm8LaW5wdXRfaXRlbXMScmVjaXBlX2l0ZW1faW5mb1tdDnJlY2lwZXNfcmVzdWx0AAEHcmVjaXBlcxFyZWNpcGVfcmVzcG9uc2VbXQxyZWZyc2hlbnRpdHkAAQllbnRpdHlfaWQGdWludDY0C3Jlc2VydmVfcm93AAQCaWQGdWludDY0CGNvb3JkX2lkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNglyZW1haW5pbmcGdWludDMyB3Jlc29sdmUAAgJpZAZ1aW50NjQFY291bnQHdWludDY0Pw9yZXNvbHZlX3Jlc3VsdHMABgllbnRpdHlfaWQGdWludDY0C2VudGl0eV90eXBlBG5hbWUOcmVzb2x2ZWRfY291bnQFdWludDgUbmV3X3NjaGVkdWxlX3N0YXJ0ZWQLdGltZV9wb2ludD8LZW50aXR5Z3JvdXAHdWludDY0Pw1ncm91cF9tZW1iZXJzFkJfdmVjdG9yX2VudGl0eV9yZWZfRT8NcmVzb3VyY2VfaW5mbwAEAmlkBnVpbnQxNgRtYXNzBnVpbnQzMghjYXRlZ29yeQV1aW50OAR0aWVyBXVpbnQ4DnJlc291cmNlX3N0YXRzAAMFc3RhdDEGdWludDE2BXN0YXQyBnVpbnQxNgVzdGF0MwZ1aW50MTYQcmVzb3VyY2VzX3Jlc3VsdAABCXJlc291cmNlcw9yZXNvdXJjZV9pbmZvW10Icm1tb2R1bGUAAwllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAp0YXJnZXRfcmVmCmNhcmdvX3JlZj8Icm1uZnRjZmcAAQdpdGVtX2lkBnVpbnQxNgRzYWx0AAEEc2FsdAZ1aW50NjQIc2NoZWR1bGUAAgdzdGFydGVkCnRpbWVfcG9pbnQFdGFza3MGdGFza1tdDHNjaGVtYV9maWVsZAACBG5hbWUGc3RyaW5nCmZpZWxkX3R5cGUGc3RyaW5nCXNldG5mdGNmZwADB2l0ZW1faWQGdWludDE2C3RlbXBsYXRlX2lkBWludDMyC3NjaGVtYV9uYW1lBG5hbWUKc2tpcHJldmVhbAABBmNvbW1pdAtjaGVja3N1bTI1NghzbG90X2RlZgACBHR5cGUFdWludDgKb3V0cHV0X3BjdAZ1aW50MTYKc3Bhd25jYXJnbwADCWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0C3NwYXducGFja2VkAAQJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQxNgpodWxsX3N0YXRzBnVpbnQ2NAlpbnN0YWxsZWQPcGFja2VkX21vZHVsZVtdC3NwYXduc2VlZGVkAAQJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQFc3RhdHMGdWludDY0EnN0YXRfc2xvdF9yZXNwb25zZQABB3NvdXJjZXMNc3RhdF9zb3VyY2VbXQtzdGF0X3NvdXJjZQACC2lucHV0X2luZGV4BXVpbnQ4EGlucHV0X3N0YXRfaW5kZXgFdWludDgJc3RhdGVfcm93AAUHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzYWx0BnVpbnQ2NARzZWVkC2NoZWNrc3VtMjU2BmNvbW1pdAtjaGVja3N1bTI1NgxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABQdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzILcmVzZXJ2ZV9tYXgGdWludDMyEXN0cmF0dW1fcmVtYWluaW5nAAIHc3RyYXR1bQZ1aW50MTYJcmVtYWluaW5nBnVpbnQzMgR0YXNrAAgEdHlwZQV1aW50OAhkdXJhdGlvbgZ1aW50MzIKY2FuY2VsYWJsZQV1aW50OAtjb29yZGluYXRlcwxjb29yZGluYXRlcz8FY2FyZ28MY2FyZ29faXRlbVtdDGVudGl0eXRhcmdldAtlbnRpdHlfcmVmPwtlbnRpdHlncm91cAd1aW50NjQ/C2VuZXJneV9jb3N0B3VpbnQxNj8KdGFza19ldmVudAAJCmV2ZW50X3R5cGUFdWludDgFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKdGFza19pbmRleAV1aW50OAR0YXNrBHRhc2sJc3RhcnRzX2F0CnRpbWVfcG9pbnQMY29tcGxldGVzX2F0CnRpbWVfcG9pbnQKbmV3X2VuZXJneQd1aW50MTY/DHRhc2tfcmVzdWx0cwABCGVudGl0aWVzEmVudGl0eV90YXNrX2luZm9bXQh0cmFuc2ZlcgADCXNvdXJjZV9pZAZ1aW50NjQHZGVzdF9pZAZ1aW50NjQFaXRlbXMMY2FyZ29faXRlbVtdBnRyYXZlbAAEAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbAl0eXBlc19yb3cABAJpZAZ1aW50NjQTZW50aXR5X3N1bW1hcnlfdHlwZQ5lbnRpdHlfc3VtbWFyeRBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnFnN0cmF0dW1fcmVtYWluaW5nX3R5cGURc3RyYXR1bV9yZW1haW5pbmcIdW5kZXBsb3kAAgdob3N0X2lkBnVpbnQ2NAl0YXJnZXRfaWQGdWludDY0BHdhcnAAAwJpZAZ1aW50NjQBeAVpbnQ2NAF5BWludDY0CndhcnBfc3RhdHMAAQVyYW5nZQZ1aW50MzIEd2lwZQAABHdyYXAABAVvd25lcgRuYW1lCWVudGl0eV9pZAZ1aW50NjQIbmV4dXNfaWQGdWludDY0BWl0ZW1zDGNhcmdvX2l0ZW1bXQp3cmFwZW50aXR5AAIJZW50aXR5X2lkBnVpbnQ2NAhuZXh1c19pZAZ1aW50NjRBAABQUScqUzIJYWRkbW9kdWxlxwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbW9kdWxlCnN1bW1hcnk6ICdJbnN0YWxsIGEgbW9kdWxlIGludG8gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YWxsIGEgbW9kdWxlIGZyb20gY2FyZ28gaW50byBhIG1vZHVsZSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSB0eXBlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgc2xvdCB0eXBlLiBUaGUgbW9kdWxlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIGNhcmdvIHVwb24gaW5zdGFsbGF0aW9uLgAAAFh3NVMyCGFkZG5leHVzpwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbmV4dXMKc3VtbWFyeTogJ0FkZCBhIG5leHVzIGxvY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDcmVhdGUgYSBuZXcgbmV4dXMgZW50aXR5IGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy4gTmV4dXNlcyBhcmUgb3duZWQgYnkgdGhlIGNvbnRyYWN0IGFuZCBzZXJ2ZSBhcyBmaXhlZCBnYXRoZXJpbmcgcG9pbnRzIHdoZXJlIHBsYXllcnMgY2FuIHdyYXAsIHVud3JhcCwgZGVwbG95LCBhbmQgb3RoZXJ3aXNlIGludGVyYWN0IHdpdGggTkZULWJhY2tlZCBhc3NldHMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAABAoWl2MgdhZHZhbmNl0wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWR2YW5jZQpzdW1tYXJ5OiAnQWR2YW5jZSB0dXJuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZHZhbmNlIHRoZSBnYW1lIHRvIHRoZSBuZXh0IHR1cm4uAAAAAIA0VTwFYmxlbmT8Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBibGVuZApzdW1tYXJ5OiAnQmxlbmQgY2FyZ28gc3RhY2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDb21iaW5lIG11bHRpcGxlIGNhcmdvIHN0YWNrcyBvZiB0aGUgc2FtZSBpdGVtIHR5cGUgaW50byBhIHNpbmdsZSBzdGFjayB3aXRoIG5ldyBibGVuZGVkIHN0YXRzLiBBbGwgaW5wdXQgc3RhY2tzIG11c3Qgc2hhcmUgdGhlIHNhbWUgaXRlbSBpZC4gVGhlIG91dHB1dCBzdGFjayBoYXMgdGhlIGNvbWJpbmVkIHF1YW50aXR5IG9mIGFsbCBpbnB1dHMuAAAAAESFpkEGY2FuY2VswgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2FuY2VsCnN1bW1hcnk6ICdDYW5jZWwgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYW5jZWwgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGFza3MgZnJvbSB0aGUgZW5kIG9mIGFuIGVudGl0eSdzIHNjaGVkdWxlLiBUYXNrcyB0aGF0IGFyZSBpbW11dGFibGUgYW5kIGluIHByb2dyZXNzIGNhbm5vdCBiZSBjYW5jZWxsZWQucFW+JmPpTEQMY2xhaW1zdGFydGVyhQQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xhaW1zdGFydGVyCnN1bW1hcnk6ICdERUJVRzogY2xhaW0gYSBzdGFydGVyIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClNwYXduIGEgcHJlLWtpdHRlZCBUMSBzdGFydGVyIHNoaXAgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGZvciBhIHJlZ2lzdGVyZWQgcGxheWVyLiBBdmFpbGFibGUgb25seSBvbiB0ZXN0IGRlcGxveW1lbnRzIHdoZXJlIG5vIGluLWdhbWUgc2hpcCBlY29ub215IHlldCBleGlzdHMuIFJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYmUgYSBqb2luZWQgcGxheWVyIHdpdGggbm8gZXhpc3Rpbmcgc2hpcHM7IHRoZSByZXN1bHRpbmcgc2hpcCBpcyBmaXR0ZWQgd2l0aCBhIGdlbmVyYXRvciwgZW5naW5lLCBnYXRoZXJlciwgY3JhZnRlciwgYW5kIGhhdWxlciBtb2R1bGUuAACoG99pVEQJY2xlYW5yc3Zw7AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYW5yc3ZwCnN1bW1hcnk6ICdDbGVhbiB1cCBwYXN0IGVwb2NoIHJlc2VydmVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFcmFzZSByZXNlcnZlIHRhYmxlIHJvd3MgZnJvbSBhIHBhc3QgZXBvY2guIENhbm5vdCBjbGVhbiB0aGUgY3VycmVudCBvciBmdXR1cmUgZXBvY2hzLiBUaGUgbWF4X3Jvd3MgcGFyYW1ldGVyIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIGVyYXNlZCBwZXIgY2FsbCB0byBsaW1pdCBDUFUgdXNhZ2UuAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdOwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4AAGA0MrcmRQljb25maWdsb2fdAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjb25maWdsb2cKc3VtbWFyeTogJ0xvZyBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IGxvZ3MgdGhlIGN1cnJlbnQgZ2FtZSBjb25maWd1cmF0aW9uLiBDYWxsZWQgaW5saW5lIGFmdGVyIGluaXRpYWxpemF0aW9uIHRvIGJyb2FkY2FzdCBjb25maWcgdmlhIGFjdGlvbiB0cmFjZXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAgLzMRQVjcmFmdMgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNyYWZ0CnN1bW1hcnk6ICdDcmFmdCBpdGVtcyBmcm9tIGEgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2Zvcm0gY2FyZ28gaXRlbXMgaW50byBhIG5ldyBpdGVtIHVzaW5nIGEgcmVjaXBlLiBUaGUgZW50aXR5IG11c3QgaGF2ZSBhIGNyYWZ0ZXIgbW9kdWxlIGluc3RhbGxlZC4gQ29uc3VtZXMgZW5lcmd5IGFuZCBzY2hlZHVsZXMgYSBjcmFmdGluZyB0YXNrIHdpdGggZHVyYXRpb24gYmFzZWQgb24gdG90YWwgaW5wdXQgbWFzcyBhbmQgY3JhZnRlciBzcGVlZC4gSW5wdXQgcXVhbnRpdGllcyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2lwZSByZXF1aXJlbWVudHMu4LPLU6ls1EUMY3JlYXRlZW50aXR5vwEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY3JlYXRlZW50aXR5CnN1bW1hcnk6ICdERUJVRzogY3JlYXRlIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAA27SKVKCGRlbW9saXNo8QMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVtb2xpc2gKc3VtbWFyeTogJ0RlbW9saXNoIGEgc3RhdGlvbmFyeSBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkRlY29tbWlzc2lvbiBhbiBlbnRpdHksIGVyYXNpbmcgaXQgZnJvbSB0aGUgZ2FtZS4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUsIGhhdmUgZW1wdHkgY2FyZ28sIGFuZCBoYXZlIG5vIGluc3RhbGxlZCBtb2R1bGVzIChyZW1vdmUgZWFjaCB2aWEgcm1tb2R1bGUgZmlyc3QpLiBTY2hlZHVsZXMgYSBkZW1vbGlzaCB0YXNrIHRoYXQgZXJhc2VzIHRoZSBlbnRpdHkgb24gcmVzb2x1dGlvbi4gT25seSB2YWxpZCBmb3IgZW50aXRpZXMgdGhhdCBjYW5ub3QgbW92ZTsgdXNlIHVuZGVwbG95IG9yIHdyYXBlbnRpdHkgZm9yIHRoZSByZXN0LgAAAAB4GqtKBmRlcGxveewCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlcGxveQpzdW1tYXJ5OiAnRGVwbG95IGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVW5wYWNrIGEgcGFja2VkIGVudGl0eSBpdGVtIChwYWNrZWQgc2hpcCBvciBwYWNrZWQgY29udGFpbmVyKSBmcm9tIGNhcmdvLCBzY2hlZHVsaW5nIGEgZGVwbG95IHRhc2sgdGhhdCBjcmVhdGVzIHRoZSBuZXcgZW50aXR5IGF0IHRoZSBkZXBsb3lpbmcgZW50aXR5J3MgbG9jYXRpb24gdXBvbiByZXNvbHV0aW9uLgCAzy5PhbBKCmRlc2NlbnRpdHnJAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBkZXNjZW50aXR5CnN1bW1hcnk6ICdEZXNjcmliZSBhIHBhY2tlZCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gc3RyaW5nIGZvciBhIHBhY2tlZCBlbnRpdHksIGRlcml2ZWQgZnJvbSB0aGUgZW50aXR5IGl0ZW0gaWQsIGh1bGwgc3RhdHMsIGFuZCB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGl0ZW0gaWRzIGFuZCBzdGF0cy4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgTkZUIHJlbmRlcmVycyB0byBkaXNwbGF5IHBhY2tlZCBlbnRpdGllcy4AAAAAqHjMVAZlbmFibGXdAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBlbmFibGUKc3VtbWFyeTogJ1NldCBlbmFibGVkIHN0YXRlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGlzIGdhbWUgb2YgU2hpcGxvYWQugLGRlF2DulsMZml4Y2FyZ29tYXNzAAAAAABc1bJhBmdhdGhlcpcDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdhdGhlcgpzdW1tYXJ5OiAnR2F0aGVyIHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKR2F0aGVyIHJlc291cmNlcyBhdCB0aGUgc2hpcCdzIGN1cnJlbnQgbG9jYXRpb24uIE9ubHkgd29ya3MgYXQgZ2F0aGVyYWJsZSBsb2NhdGlvbiB0eXBlcy4gU2NoZWR1bGVzIGEgZ2F0aGVyIHRhc2sgdGhhdCBjb25zdW1lcyBlbmVyZ3kgYW5kIHlpZWxkcyBjYXJnbyBiYXNlZCBvbiB0aGUgc2hpcCdzIGdhdGhlcmVyIHN0YXRzIGFuZCB0aGUgbG9jYXRpb24ncyByZXNvdXJjZSBjb21wb3NpdGlvbi4AAGBuTYqyYglnZXRjb25maWfKAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRjb25maWcKc3VtbWFyeTogJ0dldCBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgdGhlIGdhbWUgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgZGVmYXVsdCBlbnRpdHkgc3RhdHMgZm9yIHdhcmVob3VzZXMgYW5kIGNvbnRhaW5lcnMsIGFuZCB0aGUgZnVsbCBpdGVtIGRlZmluaXRpb25zIHRhYmxlLgBUPI65qLJiC2dldGVsaWdpYmxlyAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0ZWxpZ2libGUKc3VtbWFyeTogJ0dldCBlbGlnaWJsZSByZXNvdXJjZSBpdGVtIElEcyBhdCBhIGxvY2F0aW9uIGFuZCBzdHJhdHVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgbGlzdCBvZiByZXNvdXJjZSBpdGVtIElEcyBlbGlnaWJsZSB0byBiZSBnYXRoZXJlZCBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgYW5kIHN0cmF0dW0gZGVwdGguIEl0ZW1zIGFyZSBnYXRlZCBieSBib3RoIHRoZSBsb2NhdGlvbidzIHJlc291cmNlIHByb2ZpbGUgYW5kIHRoZSBkZXB0aCB0aHJlc2hvbGQgZm9yIGVhY2ggdGllci4AsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy4ATDZJquyyYgtnZXRpdGVtZGF0YagDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1kYXRhCnN1bW1hcnk6ICdHZXQgZnVsbCBpdGVtIGNhdGFsb2cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBjb21wbGV0ZSBpdGVtIGNhdGFsb2cgYXMgdGhlIGNvbnRyYWN0IHNlZXMgaXQsIGluY2x1ZGluZyB0eXBlLCBzdWJ0eXBlLCB0aWVyLCBtYXNzLCBhbmQgb3RoZXIgc3RhdGljIG1ldGFkYXRhLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBjbGllbnRzIHRvIG1pcnJvciB0aGUgY29udHJhY3QncyBpdGVtIGRlZmluaXRpb25zLgAATk6q7LJiCmdldGl0ZW1pZHOGAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtaWRzCnN1bW1hcnk6ICdHZXQgaXRlbSBpZCB0byBuYW1lIG1hcHBpbmdzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBtYXBwaW5nIG9mIGl0ZW0gaWQgY29uc3RhbnRzIHRvIHRoZWlyIGNhbm9uaWNhbCBzdHJpbmcgbmFtZXMuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gcmVzb2x2ZSBudW1lcmljIGl0ZW0gaWRzIHRvIGh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXJzLgAAAFiq7LJiCGdldGl0ZW1zmgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXMKc3VtbWFyeTogJ0dldCBhbGwgYXZhaWxhYmxlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgaXRlbXMgaW4gdGhlIGdhbWUgaW5jbHVkaW5nIHRoZWlyIGlkLCBiYXNlIHByaWNlLCBhbmQgbWFzcy6AVfVZquyyYgxnZXRpdGVtdHlwZXOIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtdHlwZXMKc3VtbWFyeTogJ0dldCBpdGVtIHR5cGUgZW51bSB2YWx1ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBpdGVtIHR5cGUgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAocmVzb3VyY2UsIGNvbXBvbmVudCwgbW9kdWxlLCBlbnRpdHkpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBpdGVtIHR5cGUgaWRlbnRpZmllcnMuACZ12SAas2ILZ2V0bG9jYXRpb27iAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NhdGlvbgpzdW1tYXJ5OiAnR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYXRpb24gaW5jbHVkaW5nIHdoZXRoZXIgYSBzeXN0ZW0gZXhpc3RzLCBhbmQgZm9yIGVhY2ggaXRlbTogcHJpY2UsIHN1cHBseSwgcmFyaXR5IG11bHRpcGxpZXIsIGFuZCBsb2NhdGlvbiBtdWx0aXBsaWVyLgCAySYhGrNiCmdldGxvY2RhdGH+Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NkYXRhCnN1bW1hcnk6ICdHZXQgZGVyaXZlZCBsb2NhdGlvbiBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGRlcml2ZWQgbG9jYXRpb24gZGF0YSBpbmNsdWRpbmcgc3RhdGljIHByb3BlcnRpZXMgKHR5cGUsIGRpZmZpY3VsdHksIHNlZWRzKSBmcm9tIHRoZSBnYW1lIHNlZWQgYW5kIGVwb2NoLXNwZWNpZmljIHByb3BlcnRpZXMgKGFjdGl2ZSwgc2VlZHMpIGZyb20gdGhlIGN1cnJlbnQgZXBvY2ggc2VlZC4AsKo+JyqzYgtnZXRtb2R0eXBlc9YDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG1vZHR5cGVzCnN1bW1hcnk6ICdHZXQgbW9kdWxlIHR5cGUgZW51bSB2YWx1ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBtb2R1bGUgdHlwZSBlbnVtIHZhbHVlcyBhbmQgdGhlaXIgc3RyaW5nIG5hbWVzIChhbnksIGVuZ2luZSwgZ2VuZXJhdG9yLCBnYXRoZXJlciwgbG9hZGVyLCB3YXJwLCBjcmFmdGVyLCBsYXVuY2hlciwgc3RvcmFnZSwgaGF1bGVyKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgbW9kdWxlIHN1YnR5cGUgaWRlbnRpZmllcnMgYW5kIHNsb3QgY29tcGF0aWJpbGl0eS4AAFZRJyqzYgpnZXRtb2R1bGVzgAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bW9kdWxlcwpzdW1tYXJ5OiAnR2V0IGFsbCBtb2R1bGUgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgaXRlbXMgY2xhc3NpZmllZCBhcyBtb2R1bGVzLCBpbmNsdWRpbmcgZWFjaCBtb2R1bGUncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGluc3RhbGxhYmxlIGVxdWlwbWVudC4AAPDnGjWzYglnZXRuZWFyYnneAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRuZWFyYnkKc3VtbWFyeTogJ0dldCBuZWFyYnkgcmVhY2hhYmxlIHN5c3RlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgbmVhcmJ5IHN5c3RlbXMgcmVhY2hhYmxlIGJ5IGFuIGVudGl0eSBmcm9tIGl0cyBwcm9qZWN0ZWQgbG9jYXRpb24uIFJldHVybnMgY3VycmVudCBzdGF0ZSAod2l0aCBjb21wbGV0ZWQgdGFza3MgcmVzb2x2ZWQpLCBwcm9qZWN0ZWQgc3RhdGUgKGFmdGVyIGFsbCBzY2hlZHVsZWQgdGFza3MpLCBhbmQgYSBsaXN0IG9mIHJlYWNoYWJsZSBzeXN0ZW1zIHdpdGggZGlzdGFuY2UsIGVuZXJneSBjb3N0LCBmbGlnaHQgdGltZSwgYW5kIG1hcmtldCBpbmZvcm1hdGlvbi4AAF3T5TWzYgpnZXRuZnRpbmZv8AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bmZ0aW5mbwpzdW1tYXJ5OiAnR2V0IE5GVCBzY2hlbWEgYW5kIHRlbXBsYXRlIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBBdG9taWNBc3NldHMgc2NoZW1hcyBhbmQgdGVtcGxhdGVzIHRoZSBnYW1lIGNvbnRyYWN0IGV4cGVjdHMsIHBsdXMgdGhlIGN1cnJlbnQgYGl0ZW1faWQg4oaSICh0ZW1wbGF0ZV9pZCwgc2NoZW1hX25hbWUpYCBtYXBwaW5nIHN0b3JlZCBpbiB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gc3luYyBhdG9taWNhc3NldHMgc3RhdGUgd2l0aCB0aGUgY29udHJhY3QuAAC4yptYs2IJZ2V0cGxheWVy/QItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cGxheWVyCnN1bW1hcnk6ICdHZXQgcGxheWVyIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgcGxheWVyIGluY2x1ZGluZyBiYWxhbmNlLCBkZWJ0LCBuZXR3b3J0aCwgZW50aXR5IGNvdW50cywgYW5kIHByaWNpbmcgZm9yIG5leHQgcHVyY2hhc2VzLiBSZXR1cm5zIGlzX3BsYXllcj1mYWxzZSBpZiB0aGUgYWNjb3VudCBoYXMgbm90IGpvaW5lZCB0aGUgZ2FtZS4AAFDVIXWzYglnZXRyZWNpcGWmAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZWNpcGUKc3VtbWFyeTogJ0dldCBhIHNpbmdsZSBjcmFmdGluZyByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSByZWNpcGUgd2hvc2Ugb3V0cHV0IG1hdGNoZXMgdGhlIGdpdmVuIGl0ZW0gaWQsIGluY2x1ZGluZyBpdHMgaW5wdXRzLCBibGVuZCB3ZWlnaHRzLCBzdGF0IHNsb3RzLCBhbmQgcmVzb2x2ZWQgaXRlbSBtYXNzIGluZm8uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGlzcGxheSBjcmFmdGluZyByZXF1aXJlbWVudHMuAABW1SF1s2IKZ2V0cmVjaXBlc6wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4AAM4GYXWzYgpnZXRyZXNjYXRzngMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzY2F0cwpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIGNhdGVnb3J5IGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAob3JlLCBnYXMsIHJlZ29saXRoLCBiaW9tYXNzLCBjcnlzdGFsKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgcmVzb3VyY2Ugc3VidHlwZSBpZGVudGlmaWVycy4AsNpXYXWzYgtnZXRyZXNlcnZlc/wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc2VydmVzCnN1bW1hcnk6ICdHZXQgY3VycmVudCByZXNlcnZlIG1vZGlmaWNhdGlvbnMgYXQgYSBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyB0aGUgY2hhaW4ncyBtb2RpZmljYXRpb25zIHRvIGRlcml2ZWQgcmVzZXJ2ZXMgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGUgZm9yIHRoZSBjdXJyZW50IGVwb2NoIGFzIGEgbGlzdCBvZiB7c3RyYXR1bSwgcmVtYWluaW5nfSBwYWlycy4gU3RyYXRhIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZSB1c2UgdGhlaXIgZGVyaXZlZCBpbml0aWFsIHJlc2VydmUuIENvbXBvc2Ugd2l0aCBTREsgZGVyaXZhdGlvbiB0byBnZXQgdGhlIGZ1bGwgcGVyLWxvY2F0aW9uIHN0cmF0YSB2aWV3LoAVuppidbNiDGdldHJlc291cmNlc4cDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc291cmNlcwpzdW1tYXJ5OiAnR2V0IGFsbCByZXNvdXJjZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIHJlc291cmNlcywgaW5jbHVkaW5nIGVhY2ggcmVzb3VyY2UncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGdhdGhlcmFibGUgbWF0ZXJpYWxzLgAAADjTiLNiCGdldHNsb3RzuwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c2xvdHMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc2xvdCBsYXlvdXRzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgbW9kdWxlIHNsb3QgbGF5b3V0IGZvciBldmVyeSBlbnRpdHkgaXRlbSB0eXBlLCBsaXN0aW5nIHRoZSBvcmRlcmVkIHNsb3QgdHlwZXMgYXZhaWxhYmxlIGZvciBtb2R1bGUgaW5zdGFsbGF0aW9uLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRldGVybWluZSB3aGljaCBtb2R1bGUgdHlwZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBhIGdpdmVuIGVudGl0eSBodWxsLgCA1NncjLNiCmdldHN0cmF0dW3SAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdHJhdHVtCnN1bW1hcnk6ICdHZXQgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHJlc291cmNlIHN0cmF0dW0gZGF0YSBmb3IgYSBzcGVjaWZpYyBkZXB0aCBsYXllciBhdCBhIGNvb3JkaW5hdGUsIGluY2x1ZGluZyB0aGUgc3RyYXR1bSBzZWVkIGluZm8gYW5kIGRlcml2ZWQgcmVzb3VyY2Ugc3RhdHMugJW7RkqNs2IMZ2V0c3VtbWFyaWVz6AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3VtbWFyaWVzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHN1bW1hcmllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgbGlnaHR3ZWlnaHQgc3VtbWFyaWVzIG9mIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllciBpbmNsdWRpbmcgdHlwZSwgaWQsIG93bmVyLCBuYW1lLCBsb2NhdGlvbiwgYW5kIGlkbGUgc3RhdHVzLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4Aotrm5qrpZQtncm91cHRyYXZlbJoELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdyb3VwdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIG11bHRpcGxlIGVudGl0aWVzIHRvZ2V0aGVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSBncm91cCB0cmF2ZWwgZm9yIG11bHRpcGxlIGVudGl0aWVzIHRvIGEgZGVzdGluYXRpb24uIEFsbCBlbnRpdGllcyBtdXN0IGJlIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFuZCBvd25lZCBieSB0aGUgY2FsbGVyLiBBdCBsZWFzdCBvbmUgZW50aXR5IHdpdGggZW5naW5lcyBpcyByZXF1aXJlZCB0byBwcm92aWRlIHRocnVzdC4gRmxpZ2h0IGR1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgZnJvbSBjb21iaW5lZCB0aHJ1c3QgYW5kIHRvdGFsIG1hc3Mgb2YgYWxsIGVudGl0aWVzLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGZvciBhdG9taWMgcmVzb2x1dGlvbiBhbmQgY2FuY2VsbGF0aW9uLgAAAAAA0LBpBGhhc2j4AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhMjU2IGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTI1NiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAQITSsGkHaGFzaDUxMvsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2g1MTIKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGE1MTIgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhNTEyIGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4AgPouGpfddAppbml0aWFsaXplgAItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaW5pdGlhbGl6ZQpzdW1tYXJ5OiAnSW5pdGlhbGl6ZSBnYW1lIHNlZWQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYWxpemUgYSB0aGUgZ2FtZXMgc2VlZCBhbmQgc2VlZCB2YWx1ZXMgdG8gYm9vdHN0cmFwIGdhbWUgc3RhdGUuAAAAAAAwHX0Eam9pbsQBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGpvaW4Kc3VtbWFyeTogJ0pvaW4gYSBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpKb2luIGEgZ2FtZSBvZiBTaGlwbG9hZAAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAAIpd05C6CHJlY2hhcmdlzQItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVjaGFyZ2UKc3VtbWFyeTogJ1JlY2hhcmdlIHNoaXAgZW5lcmd5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTY2hlZHVsZSBhIHJlY2hhcmdlIHRhc2sgZm9yIGFuIGVudGl0eSB0byByZXN0b3JlIGVuZXJneSB0byBmdWxsIGNhcGFjaXR5LiBUaGUgcmVjaGFyZ2UgZHVyYXRpb24gZGVwZW5kcyBvbiBjdXJyZW50IGVuZXJneSBsZXZlbCBhbmQgcmVjaGFyZ2UgcmF0ZS7gs8tTNXyXugxyZWZyc2hlbnRpdHkAAAAAQO1IsboHcmVzb2x2ZdADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlc29sdmUKc3VtbWFyeTogJ0NvbXBsZXRlIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVzb2x2ZSBjb21wbGV0ZWQgdGFza3MgaW4gYW4gZW50aXR5J3Mgc2NoZWR1bGUsIGFwcGx5aW5nIHRoZWlyIGVmZmVjdHMgKHJlY2hhcmdlIGVuZXJneSwgdXBkYXRlIGxvY2F0aW9uLCBsb2FkL3VubG9hZCBjYXJnbykuIElmIGNvdW50IGlzIHNwZWNpZmllZCwgcmVzb2x2ZSBleGFjdGx5IHRoYXQgbWFueSB0YXNrczsgb3RoZXJ3aXNlIHJlc29sdmUgYWxsIGNvbXBsZXRlZCB0YXNrcy4gRmFpbHMgaWYgY291bnQgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlZCB0YXNrcy4AAAAq6kSlvAhybW1vZHVsZbwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJtbW9kdWxlCnN1bW1hcnk6ICdSZW1vdmUgYSBtb2R1bGUgZnJvbSBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlbW92ZSBhbiBpbnN0YWxsZWQgbW9kdWxlIGZyb20gYSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSBpcyByZXR1cm5lZCB0byBjYXJnby4gRmFpbHMgaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBoYXZlIGVub3VnaCBjYXJnbyBjYXBhY2l0eSB0byBob2xkIHRoZSByZXR1cm5lZCBtb2R1bGUuAAAAbKG8prwIcm1uZnRjZmehAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW5mdGNmZwpzdW1tYXJ5OiAnUmVtb3ZlIE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgdGhlIEF0b21pY0Fzc2V0cyB0ZW1wbGF0ZSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gaWQgZnJvbSB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIEFmdGVyIHJlbW92YWwgdGhlIGl0ZW0gY2FuIG5vIGxvbmdlciBiZSB3cmFwcGVkIG9yIHVud3JhcHBlZCB1bnRpbCBhIG5ldyBtYXBwaW5nIGlzIHNldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAAAAkKPBBHNhbHTYAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzYWx0CnN1bW1hcnk6ICdBcHBlbmQgU2FsdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQWRkIGFkZGl0aW9uYWwgc2FsdCB0byB0aGUgbmV4dCBlcG9jaCBzZWVkLgAAYAvlNbPCCXNldG5mdGNmZ8QDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNldG5mdGNmZwpzdW1tYXJ5OiAnU2V0IE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpCaW5kIGFuIGl0ZW0gaWQgdG8gYW4gQXRvbWljQXNzZXRzIHRlbXBsYXRlIGlkIGFuZCBzY2hlbWEgbmFtZS4gVXNlZCB0byBjb25maWd1cmUgaG93IHRoZSBjb250cmFjdCBtaW50cyBhbmQgcmVjb2duaXplcyBORlRzIGZvciBhIGdpdmVuIGl0ZW0uIEluc2VydHMgYSBuZXcgbWFwcGluZyBpZiBvbmUgZG9lcyBub3QgZXhpc3QsIG9yIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIG1hcHBpbmcuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AQDRqq1sdxApza2lwcmV2ZWFsAAAAZdegyU3FCnNwYXduY2FyZ2/FAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzcGF3bmNhcmdvCnN1bW1hcnk6ICdERUJVRzogc3Bhd24gY2FyZ28gb24gYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAJKCyNTJTcULc3Bhd25wYWNrZWTnAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzcGF3bnBhY2tlZApzdW1tYXJ5OiAnREVCVUc6IHNwYXduIGEgcGFja2VkIGVudGl0eSB3aXRoIGluc3RhbGxlZCBtb2R1bGVzIG9uIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQCSSkrhyU3FC3NwYXduc2VlZGVkzQEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Bhd25zZWVkZWQKc3VtbWFyeTogJ0RFQlVHOiBzcGF3biBzZWVkZWQgY2FyZ28gb24gYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAVy08zc0IdHJhbnNmZXLIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB0cmFuc2ZlcgpzdW1tYXJ5OiAnVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiBlbnRpdGllcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiB0d28gZW50aXRpZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24uIEJvdGggZW50aXRpZXMgbXVzdCBiZSBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBhdCBsZWFzdCBvbmUgbXVzdCBoYXZlIGxvYWRlcnMuIENyZWF0ZXMgbG9hZCBhbmQgdW5sb2FkIHRhc2tzIG9uIGJvdGggZW50aXRpZXMgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiBjb21iaW5lZCBsb2FkZXIgY2FwYWNpdHkgYW5kIFotZGlzdGFuY2UgYmV0d2VlbiB0aGVtLgAAAABEtc3NBnRyYXZlbPsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBhIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIHRyYXZlbCBvZiBhbiBlbnRpdHkgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBhIG5ldyBkZXN0aW5hdGlvbi4AAACexqrS1Ah1bmRlcGxveecELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHVuZGVwbG95CnN1bW1hcnk6ICdQYWNrIGEgZGVwbG95ZWQgZW50aXR5IGludG8gYSBob3N0JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpQYWNrIGFuIGVudGl0eSBpbnRvIGEgaG9zdCBlbnRpdHkncyBjYXJnbyBhcyBhIHBhY2tlZC1lbnRpdHkgaXRlbS4gSG9zdCBhbmQgdGFyZ2V0IG11c3Qgc2hhcmUgdGhlIHNhbWUgb3duZXIgYW5kIGNvb3JkaW5hdGVzLCB0aGUgaG9zdCBtdXN0IGhhdmUgbG9hZGVycyBhbmQgZW5vdWdoIGNhcGFjaXR5IGZvciB0aGUgcGFja2VkIG1hc3MsIGFuZCB0aGUgdGFyZ2V0IG11c3QgYmUgaWRsZSB3aXRoIGVtcHR5IGNhcmdvLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGFuZCBzY2hlZHVsZXMgdW5kZXBsb3kgdGFza3Mgb24gYm90aCBlbnRpdGllczsgb24gcmVzb2x1dGlvbiB0aGUgdGFyZ2V0IGlzIGVyYXNlZCBhbmQgdGhlIHBhY2tlZCBlbnRpdHkgaXMgYWRkZWQgdG8gdGhlIGhvc3QncyBjYXJnby4gSW52ZXJzZSBvZiBkZXBsb3kuAAAAAABQr+EEd2FycJ8DLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdhcnAKc3VtbWFyeTogJ1dhcnAgdG8gYSBkZXN0aW5hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5zdGFudGx5IHRlbGVwb3J0IGFuIGVudGl0eSB0byBhIGRlc3RpbmF0aW9uIHN5c3RlbS4gUmVxdWlyZXMgd2FycCBjYXBhYmlsaXR5LCBmdWxsIGVuZXJneSwgZW1wdHkgY2FyZ28sIGFuZCBhbiBlbXB0eSBzY2hlZHVsZS4gVGhlIGRlc3RpbmF0aW9uIG11c3QgYmUgYSB2YWxpZCBzeXN0ZW0gd2l0aGluIHdhcnAgcmFuZ2UuIFJlc29sdmVzIGltbWVkaWF0ZWx5IGFzIGEgemVyby1kdXJhdGlvbiB0YXNrLgAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAAAAAFDN5QR3cmFw/gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd3JhcApzdW1tYXJ5OiAnV3JhcCBjYXJnbyBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKV3JhcCBhIHF1YW50aXR5IG9mIGNhcmdvIGZyb20gYW4gZW50aXR5IGludG8gYW4gQXRvbWljQXNzZXRzIE5GVCBtaW50ZWQgdG8gdGhlIHNwZWNpZmllZCBvd25lci4gVGhlIGVudGl0eSBtdXN0IGJlIGF0IGEgbmV4dXMsIGhhdmUgbG9hZGVycywgYW5kIGNvbnRhaW4gZW5vdWdoIG9mIHRoZSByZXF1ZXN0ZWQgY2FyZ28uIFNjaGVkdWxlcyBhIHdyYXAgdGFzayB0aGF0LCBvbiByZXNvbHV0aW9uLCByZW1vdmVzIHRoZSBjYXJnbyBmcm9tIHRoZSBlbnRpdHkgYW5kIG1pbnRzIHRoZSBORlQgdXNpbmcgdGhlIHRlbXBsYXRlIGNvbmZpZ3VyZWQgZm9yIHRoYXQgaXRlbSBpZC4AgM8uT1XN5Qp3cmFwZW50aXR55gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd3JhcGVudGl0eQpzdW1tYXJ5OiAnV3JhcCBhIGRlcGxveWVkIGVudGl0eSBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKV3JhcCBhbiBlbnRpdHkgaW50byBhbiBBdG9taWNBc3NldHMgTkZUIG1pbnRlZCB0byBpdHMgb3duZXIuIFRoZSBlbnRpdHkgbXVzdCBiZSBhdCBhIG5leHVzLCBpZGxlIHdpdGggZW1wdHkgY2FyZ28sIGFuZCBoYXZlIGFuIG5mdGNvbmZpZyBtYXBwaW5nIGZvciBpdHMgaXRlbSBpZC4gU2NoZWR1bGVzIGEgd3JhcCB0YXNrIHRoYXQsIG9uIHJlc29sdXRpb24sIGVyYXNlcyB0aGUgZW50aXR5IGFuZCBtaW50cyB0aGUgTkZUIHByZXNlcnZpbmcgaXRzIHN0YXRzIGFuZCBpbnN0YWxsZWQgbW9kdWxlcy4IAAAAAADKrkEDaTY0AAAJY2FyZ29fcm93AAAAAPjs8lQDaTY0AAAKZW50aXR5X3JvdwCqppf57PJUA2k2NAAAD2VudGl0eWdyb3VwX3JvdwAAYG5NivKaA2k2NAAADW5mdGNvbmZpZ19yb3cAAAAAXOVNrANpNjQAAApwbGF5ZXJfcm93AAAAQO2rsLoDaTY0AAALcmVzZXJ2ZV9yb3cAAAAAAJVNxgNpNjQAAAlzdGF0ZV9yb3cAAAAAAKyqzwNpNjQAAAl0eXBlc19yb3cBEVNoaXBsb2FkIChTZXJ2ZXIpEVNoaXBsb2FkIChTZXJ2ZXIpAAAAKAAAAABEhaZBDmNhbmNlbF9yZXN1bHRzAAAAAIC8zEUMdGFza19yZXN1bHRzAAAADbtIpUoMdGFza19yZXN1bHRzAAAAAHgaq0oMdGFza19yZXN1bHRzAIDPLk+FsEoGc3RyaW5nAAAAAFzVsmEMdGFza19yZXN1bHRzAABgbk2KsmILZ2FtZV9jb25maWcAVDyOuaiyYgh1aW50MTZbXQCwctnlqbJiDWVudGl0eV9pbmZvW10AAPDZ5amyYgtlbnRpdHlfaW5mbwBMNkmq7LJiD2l0ZW1kYXRhX3Jlc3VsdAAATk6q7LJiD2l0ZW1faWRzX3Jlc3VsdAAAAFiq7LJiCml0ZW1zX2luZm+AVfVZquyyYgtlbnVtX3Jlc3VsdAAmddkgGrNiDWxvY2F0aW9uX2luZm8AgMkmIRqzYhBsb2NhdGlvbl9kZXJpdmVkALCqPicqs2ILZW51bV9yZXN1bHQAAFZRJyqzYg5tb2R1bGVzX3Jlc3VsdAAA8OcaNbNiC25lYXJieV9pbmZvAABd0+U1s2IObmZ0aW5mb19yZXN1bHQAALjKm1izYgtwbGF5ZXJfaW5mbwAAUNUhdbNiDnJlY2lwZXNfcmVzdWx0AABW1SF1s2IOcmVjaXBlc19yZXN1bHQAAM4GYXWzYgtlbnVtX3Jlc3VsdACw2ldhdbNiE3N0cmF0dW1fcmVtYWluaW5nW12AFbqaYnWzYhByZXNvdXJjZXNfcmVzdWx0AAAAONOIs2IVZW50aXR5X2xheW91dHNfcmVzdWx0AIDU2dyMs2IMc3RyYXR1bV9kYXRhgJW7RkqNs2IQZW50aXR5X3N1bW1hcnlbXQCi2ubmqullDHRhc2tfcmVzdWx0cwAAAAAA0LBpC2NoZWNrc3VtMjU2AAAAQITSsGkLY2hlY2tzdW01MTIAAACKXdOQugx0YXNrX3Jlc3VsdHMAAABA7Uixug9yZXNvbHZlX3Jlc3VsdHMAAABXLTzNzQx0YXNrX3Jlc3VsdHMAAAAARLXNzQx0YXNrX3Jlc3VsdHMAAACexqrS1Ax0YXNrX3Jlc3VsdHMAAAAAAFCv4Qx0YXNrX3Jlc3VsdHMAAAAAAFDN5Qx0YXNrX3Jlc3VsdHMAgM8uT1XN5Qx0YXNrX3Jlc3VsdHM=');
209
221
  const abi = ABI.from(abiBlob);
210
222
  var Types;
211
223
  (function (Types) {
212
- let addmodule = class addmodule extends Struct {
224
+ let packed_module = class packed_module extends Struct {
213
225
  };
214
226
  __decorate([
215
- Struct.field(Name)
216
- ], addmodule.prototype, "entity_type", void 0);
227
+ Struct.field(UInt16)
228
+ ], packed_module.prototype, "item_id", void 0);
217
229
  __decorate([
218
230
  Struct.field(UInt64)
219
- ], addmodule.prototype, "entity_id", void 0);
231
+ ], packed_module.prototype, "stats", void 0);
232
+ packed_module = __decorate([
233
+ Struct.type('packed_module')
234
+ ], packed_module);
235
+ Types.packed_module = packed_module;
236
+ let module_entry = class module_entry extends Struct {
237
+ };
220
238
  __decorate([
221
239
  Struct.field(UInt8)
222
- ], addmodule.prototype, "module_index", void 0);
240
+ ], module_entry.prototype, "type", void 0);
241
+ __decorate([
242
+ Struct.field(packed_module, { optional: true })
243
+ ], module_entry.prototype, "installed", void 0);
244
+ module_entry = __decorate([
245
+ Struct.type('module_entry')
246
+ ], module_entry);
247
+ Types.module_entry = module_entry;
248
+ let cargo_ref = class cargo_ref extends Struct {
249
+ };
250
+ __decorate([
251
+ Struct.field(UInt16)
252
+ ], cargo_ref.prototype, "item_id", void 0);
223
253
  __decorate([
224
254
  Struct.field(UInt64)
225
- ], addmodule.prototype, "module_cargo_id", void 0);
255
+ ], cargo_ref.prototype, "stats", void 0);
256
+ __decorate([
257
+ Struct.field(module_entry, { array: true })
258
+ ], cargo_ref.prototype, "modules", void 0);
259
+ cargo_ref = __decorate([
260
+ Struct.type('cargo_ref')
261
+ ], cargo_ref);
262
+ Types.cargo_ref = cargo_ref;
263
+ let addmodule = class addmodule extends Struct {
264
+ };
226
265
  __decorate([
227
266
  Struct.field(UInt64)
228
- ], addmodule.prototype, "target_cargo_id", void 0);
267
+ ], addmodule.prototype, "entity_id", void 0);
268
+ __decorate([
269
+ Struct.field(UInt8)
270
+ ], addmodule.prototype, "module_index", void 0);
271
+ __decorate([
272
+ Struct.field(cargo_ref)
273
+ ], addmodule.prototype, "module_ref", void 0);
274
+ __decorate([
275
+ Struct.field(cargo_ref, { optional: true })
276
+ ], addmodule.prototype, "target_ref", void 0);
229
277
  addmodule = __decorate([
230
278
  Struct.type('addmodule')
231
279
  ], addmodule);
@@ -257,53 +305,26 @@ var Types;
257
305
  Struct.type('advance')
258
306
  ], advance);
259
307
  Types.advance = advance;
260
- let packed_module = class packed_module extends Struct {
261
- };
262
- __decorate([
263
- Struct.field(UInt16)
264
- ], packed_module.prototype, "item_id", void 0);
265
- __decorate([
266
- Struct.field(UInt64)
267
- ], packed_module.prototype, "stats", void 0);
268
- packed_module = __decorate([
269
- Struct.type('packed_module')
270
- ], packed_module);
271
- Types.packed_module = packed_module;
272
- let module_entry = class module_entry extends Struct {
273
- };
274
- __decorate([
275
- Struct.field(UInt8)
276
- ], module_entry.prototype, "type", void 0);
277
- __decorate([
278
- Struct.field(packed_module, { optional: true })
279
- ], module_entry.prototype, "installed", void 0);
280
- module_entry = __decorate([
281
- Struct.type('module_entry')
282
- ], module_entry);
283
- Types.module_entry = module_entry;
284
308
  let cargo_item = class cargo_item extends Struct {
285
309
  };
286
310
  __decorate([
287
311
  Struct.field(UInt16)
288
312
  ], cargo_item.prototype, "item_id", void 0);
289
- __decorate([
290
- Struct.field(UInt32)
291
- ], cargo_item.prototype, "quantity", void 0);
292
313
  __decorate([
293
314
  Struct.field(UInt64)
294
315
  ], cargo_item.prototype, "stats", void 0);
295
316
  __decorate([
296
317
  Struct.field(module_entry, { array: true })
297
318
  ], cargo_item.prototype, "modules", void 0);
319
+ __decorate([
320
+ Struct.field(UInt32)
321
+ ], cargo_item.prototype, "quantity", void 0);
298
322
  cargo_item = __decorate([
299
323
  Struct.type('cargo_item')
300
324
  ], cargo_item);
301
325
  Types.cargo_item = cargo_item;
302
326
  let blend = class blend extends Struct {
303
327
  };
304
- __decorate([
305
- Struct.field(Name)
306
- ], blend.prototype, "entity_type", void 0);
307
328
  __decorate([
308
329
  Struct.field(UInt64)
309
330
  ], blend.prototype, "id", void 0);
@@ -316,9 +337,6 @@ var Types;
316
337
  Types.blend = blend;
317
338
  let cancel = class cancel extends Struct {
318
339
  };
319
- __decorate([
320
- Struct.field(Name)
321
- ], cancel.prototype, "entity_type", void 0);
322
340
  __decorate([
323
341
  Struct.field(UInt64)
324
342
  ], cancel.prototype, "id", void 0);
@@ -389,6 +407,27 @@ var Types;
389
407
  Struct.type('cargo_row')
390
408
  ], cargo_row);
391
409
  Types.cargo_row = cargo_row;
410
+ let cargo_view = class cargo_view extends Struct {
411
+ };
412
+ __decorate([
413
+ Struct.field(UInt16)
414
+ ], cargo_view.prototype, "item_id", void 0);
415
+ __decorate([
416
+ Struct.field(UInt64)
417
+ ], cargo_view.prototype, "stats", void 0);
418
+ __decorate([
419
+ Struct.field(module_entry, { array: true })
420
+ ], cargo_view.prototype, "modules", void 0);
421
+ __decorate([
422
+ Struct.field(UInt32)
423
+ ], cargo_view.prototype, "quantity", void 0);
424
+ __decorate([
425
+ Struct.field(UInt64)
426
+ ], cargo_view.prototype, "id", void 0);
427
+ cargo_view = __decorate([
428
+ Struct.type('cargo_view')
429
+ ], cargo_view);
430
+ Types.cargo_view = cargo_view;
392
431
  let claimstarter = class claimstarter extends Struct {
393
432
  };
394
433
  __decorate([
@@ -512,83 +551,8 @@ var Types;
512
551
  Struct.type('coordinates')
513
552
  ], coordinates);
514
553
  Types.coordinates = coordinates;
515
- let task = class task extends Struct {
516
- };
517
- __decorate([
518
- Struct.field(UInt8)
519
- ], task.prototype, "type", void 0);
520
- __decorate([
521
- Struct.field(UInt32)
522
- ], task.prototype, "duration", void 0);
523
- __decorate([
524
- Struct.field(UInt8)
525
- ], task.prototype, "cancelable", void 0);
526
- __decorate([
527
- Struct.field(coordinates, { optional: true })
528
- ], task.prototype, "coordinates", void 0);
529
- __decorate([
530
- Struct.field(cargo_item, { array: true })
531
- ], task.prototype, "cargo", void 0);
532
- __decorate([
533
- Struct.field(entity_ref, { optional: true })
534
- ], task.prototype, "entitytarget", void 0);
535
- __decorate([
536
- Struct.field(UInt64, { optional: true })
537
- ], task.prototype, "entitygroup", void 0);
538
- __decorate([
539
- Struct.field(UInt16, { optional: true })
540
- ], task.prototype, "energy_cost", void 0);
541
- task = __decorate([
542
- Struct.type('task')
543
- ], task);
544
- Types.task = task;
545
- let schedule = class schedule extends Struct {
546
- };
547
- __decorate([
548
- Struct.field(TimePoint)
549
- ], schedule.prototype, "started", void 0);
550
- __decorate([
551
- Struct.field(task, { array: true })
552
- ], schedule.prototype, "tasks", void 0);
553
- schedule = __decorate([
554
- Struct.type('schedule')
555
- ], schedule);
556
- Types.schedule = schedule;
557
- let container_row = class container_row extends Struct {
558
- };
559
- __decorate([
560
- Struct.field(UInt64)
561
- ], container_row.prototype, "id", void 0);
562
- __decorate([
563
- Struct.field(Name)
564
- ], container_row.prototype, "owner", void 0);
565
- __decorate([
566
- Struct.field('string')
567
- ], container_row.prototype, "name", void 0);
568
- __decorate([
569
- Struct.field(coordinates)
570
- ], container_row.prototype, "coordinates", void 0);
571
- __decorate([
572
- Struct.field(UInt32)
573
- ], container_row.prototype, "hullmass", void 0);
574
- __decorate([
575
- Struct.field(UInt32)
576
- ], container_row.prototype, "capacity", void 0);
577
- __decorate([
578
- Struct.field(UInt32)
579
- ], container_row.prototype, "cargomass", void 0);
580
- __decorate([
581
- Struct.field(schedule, { optional: true })
582
- ], container_row.prototype, "schedule", void 0);
583
- container_row = __decorate([
584
- Struct.type('container_row')
585
- ], container_row);
586
- Types.container_row = container_row;
587
554
  let craft = class craft extends Struct {
588
555
  };
589
- __decorate([
590
- Struct.field(Name)
591
- ], craft.prototype, "entity_type", void 0);
592
556
  __decorate([
593
557
  Struct.field(UInt64)
594
558
  ], craft.prototype, "id", void 0);
@@ -638,20 +602,23 @@ var Types;
638
602
  Struct.type('createentity')
639
603
  ], createentity);
640
604
  Types.createentity = createentity;
641
- let deploy = class deploy extends Struct {
605
+ let demolish = class demolish extends Struct {
642
606
  };
643
607
  __decorate([
644
- Struct.field(Name)
645
- ], deploy.prototype, "entity_type", void 0);
608
+ Struct.field(UInt64)
609
+ ], demolish.prototype, "entity_id", void 0);
610
+ demolish = __decorate([
611
+ Struct.type('demolish')
612
+ ], demolish);
613
+ Types.demolish = demolish;
614
+ let deploy = class deploy extends Struct {
615
+ };
646
616
  __decorate([
647
617
  Struct.field(UInt64)
648
618
  ], deploy.prototype, "id", void 0);
649
619
  __decorate([
650
- Struct.field(UInt16)
651
- ], deploy.prototype, "packed_item_id", void 0);
652
- __decorate([
653
- Struct.field(UInt64)
654
- ], deploy.prototype, "stats", void 0);
620
+ Struct.field(cargo_ref)
621
+ ], deploy.prototype, "ref", void 0);
655
622
  deploy = __decorate([
656
623
  Struct.type('deploy')
657
624
  ], deploy);
@@ -776,6 +743,48 @@ var Types;
776
743
  Struct.type('warp_stats')
777
744
  ], warp_stats);
778
745
  Types.warp_stats = warp_stats;
746
+ let task = class task extends Struct {
747
+ };
748
+ __decorate([
749
+ Struct.field(UInt8)
750
+ ], task.prototype, "type", void 0);
751
+ __decorate([
752
+ Struct.field(UInt32)
753
+ ], task.prototype, "duration", void 0);
754
+ __decorate([
755
+ Struct.field(UInt8)
756
+ ], task.prototype, "cancelable", void 0);
757
+ __decorate([
758
+ Struct.field(coordinates, { optional: true })
759
+ ], task.prototype, "coordinates", void 0);
760
+ __decorate([
761
+ Struct.field(cargo_item, { array: true })
762
+ ], task.prototype, "cargo", void 0);
763
+ __decorate([
764
+ Struct.field(entity_ref, { optional: true })
765
+ ], task.prototype, "entitytarget", void 0);
766
+ __decorate([
767
+ Struct.field(UInt64, { optional: true })
768
+ ], task.prototype, "entitygroup", void 0);
769
+ __decorate([
770
+ Struct.field(UInt16, { optional: true })
771
+ ], task.prototype, "energy_cost", void 0);
772
+ task = __decorate([
773
+ Struct.type('task')
774
+ ], task);
775
+ Types.task = task;
776
+ let schedule = class schedule extends Struct {
777
+ };
778
+ __decorate([
779
+ Struct.field(TimePoint)
780
+ ], schedule.prototype, "started", void 0);
781
+ __decorate([
782
+ Struct.field(task, { array: true })
783
+ ], schedule.prototype, "tasks", void 0);
784
+ schedule = __decorate([
785
+ Struct.type('schedule')
786
+ ], schedule);
787
+ Types.schedule = schedule;
779
788
  let entity_info = class entity_info extends Struct {
780
789
  };
781
790
  __decorate([
@@ -797,7 +806,7 @@ var Types;
797
806
  Struct.field(UInt32)
798
807
  ], entity_info.prototype, "cargomass", void 0);
799
808
  __decorate([
800
- Struct.field(cargo_item, { array: true })
809
+ Struct.field(cargo_view, { array: true })
801
810
  ], entity_info.prototype, "cargo", void 0);
802
811
  __decorate([
803
812
  Struct.field(loader_stats, { optional: true })
@@ -862,6 +871,9 @@ var Types;
862
871
  __decorate([
863
872
  Struct.field(UInt8)
864
873
  ], slot_def.prototype, "type", void 0);
874
+ __decorate([
875
+ Struct.field(UInt16)
876
+ ], slot_def.prototype, "output_pct", void 0);
865
877
  slot_def = __decorate([
866
878
  Struct.type('slot_def')
867
879
  ], slot_def);
@@ -887,6 +899,72 @@ var Types;
887
899
  Struct.type('entity_layouts_result')
888
900
  ], entity_layouts_result);
889
901
  Types.entity_layouts_result = entity_layouts_result;
902
+ let entity_row = class entity_row extends Struct {
903
+ };
904
+ __decorate([
905
+ Struct.field(UInt64)
906
+ ], entity_row.prototype, "id", void 0);
907
+ __decorate([
908
+ Struct.field(Name)
909
+ ], entity_row.prototype, "owner", void 0);
910
+ __decorate([
911
+ Struct.field(Name)
912
+ ], entity_row.prototype, "kind", void 0);
913
+ __decorate([
914
+ Struct.field('string')
915
+ ], entity_row.prototype, "name", void 0);
916
+ __decorate([
917
+ Struct.field(UInt64)
918
+ ], entity_row.prototype, "stats", void 0);
919
+ __decorate([
920
+ Struct.field(coordinates)
921
+ ], entity_row.prototype, "coordinates", void 0);
922
+ __decorate([
923
+ Struct.field(UInt32, { optional: true })
924
+ ], entity_row.prototype, "hullmass", void 0);
925
+ __decorate([
926
+ Struct.field(UInt32, { optional: true })
927
+ ], entity_row.prototype, "capacity", void 0);
928
+ __decorate([
929
+ Struct.field(UInt16, { optional: true })
930
+ ], entity_row.prototype, "energy", void 0);
931
+ __decorate([
932
+ Struct.field(UInt32)
933
+ ], entity_row.prototype, "cargomass", void 0);
934
+ __decorate([
935
+ Struct.field(movement_stats, { optional: true })
936
+ ], entity_row.prototype, "engines", void 0);
937
+ __decorate([
938
+ Struct.field(energy_stats, { optional: true })
939
+ ], entity_row.prototype, "generator", void 0);
940
+ __decorate([
941
+ Struct.field(loader_stats, { optional: true })
942
+ ], entity_row.prototype, "loaders", void 0);
943
+ __decorate([
944
+ Struct.field(gatherer_stats, { optional: true })
945
+ ], entity_row.prototype, "gatherer", void 0);
946
+ __decorate([
947
+ Struct.field(warp_stats, { optional: true })
948
+ ], entity_row.prototype, "warp", void 0);
949
+ __decorate([
950
+ Struct.field(crafter_stats, { optional: true })
951
+ ], entity_row.prototype, "crafter", void 0);
952
+ __decorate([
953
+ Struct.field(hauler_stats, { optional: true })
954
+ ], entity_row.prototype, "hauler", void 0);
955
+ __decorate([
956
+ Struct.field(module_entry, { array: true })
957
+ ], entity_row.prototype, "modules", void 0);
958
+ __decorate([
959
+ Struct.field(schedule, { optional: true })
960
+ ], entity_row.prototype, "schedule", void 0);
961
+ __decorate([
962
+ Struct.field(UInt16)
963
+ ], entity_row.prototype, "item_id", void 0);
964
+ entity_row = __decorate([
965
+ Struct.type('entity_row')
966
+ ], entity_row);
967
+ Types.entity_row = entity_row;
890
968
  let entity_summary = class entity_summary extends Struct {
891
969
  };
892
970
  __decorate([
@@ -968,14 +1046,23 @@ var Types;
968
1046
  Struct.type('enum_result')
969
1047
  ], enum_result);
970
1048
  Types.enum_result = enum_result;
1049
+ let fixcargomass = class fixcargomass extends Struct {
1050
+ };
1051
+ __decorate([
1052
+ Struct.field(UInt64)
1053
+ ], fixcargomass.prototype, "entity_id", void 0);
1054
+ fixcargomass = __decorate([
1055
+ Struct.type('fixcargomass')
1056
+ ], fixcargomass);
1057
+ Types.fixcargomass = fixcargomass;
971
1058
  let gather = class gather extends Struct {
972
1059
  };
973
1060
  __decorate([
974
- Struct.field(entity_ref)
975
- ], gather.prototype, "source", void 0);
1061
+ Struct.field(UInt64)
1062
+ ], gather.prototype, "source_id", void 0);
976
1063
  __decorate([
977
- Struct.field(entity_ref)
978
- ], gather.prototype, "destination", void 0);
1064
+ Struct.field(UInt64)
1065
+ ], gather.prototype, "destination_id", void 0);
979
1066
  __decorate([
980
1067
  Struct.field(UInt16)
981
1068
  ], gather.prototype, "stratum", void 0);
@@ -992,6 +1079,18 @@ var Types;
992
1079
  Struct.type('getconfig')
993
1080
  ], getconfig);
994
1081
  Types.getconfig = getconfig;
1082
+ let geteligible = class geteligible extends Struct {
1083
+ };
1084
+ __decorate([
1085
+ Struct.field(coordinates)
1086
+ ], geteligible.prototype, "coords", void 0);
1087
+ __decorate([
1088
+ Struct.field(UInt16)
1089
+ ], geteligible.prototype, "stratum", void 0);
1090
+ geteligible = __decorate([
1091
+ Struct.type('geteligible')
1092
+ ], geteligible);
1093
+ Types.geteligible = geteligible;
995
1094
  let getentities = class getentities extends Struct {
996
1095
  };
997
1096
  __decorate([
@@ -1006,9 +1105,6 @@ var Types;
1006
1105
  Types.getentities = getentities;
1007
1106
  let getentity = class getentity extends Struct {
1008
1107
  };
1009
- __decorate([
1010
- Struct.field(Name)
1011
- ], getentity.prototype, "entity_type", void 0);
1012
1108
  __decorate([
1013
1109
  Struct.field(UInt64)
1014
1110
  ], getentity.prototype, "entity_id", void 0);
@@ -1078,9 +1174,6 @@ var Types;
1078
1174
  Types.getmodules = getmodules;
1079
1175
  let getnearby = class getnearby extends Struct {
1080
1176
  };
1081
- __decorate([
1082
- Struct.field(Name)
1083
- ], getnearby.prototype, "entity_type", void 0);
1084
1177
  __decorate([
1085
1178
  Struct.field(UInt64)
1086
1179
  ], getnearby.prototype, "entity_id", void 0);
@@ -1220,15 +1313,15 @@ var Types;
1220
1313
  Struct.type('hash512')
1221
1314
  ], hash512);
1222
1315
  Types.hash512 = hash512;
1223
- let init = class init extends Struct {
1316
+ let initialize = class initialize extends Struct {
1224
1317
  };
1225
1318
  __decorate([
1226
1319
  Struct.field(Checksum256)
1227
- ], init.prototype, "seed", void 0);
1228
- init = __decorate([
1229
- Struct.type('init')
1230
- ], init);
1231
- Types.init = init;
1320
+ ], initialize.prototype, "seed", void 0);
1321
+ initialize = __decorate([
1322
+ Struct.type('initialize')
1323
+ ], initialize);
1324
+ Types.initialize = initialize;
1232
1325
  let item_id_pair = class item_id_pair extends Struct {
1233
1326
  };
1234
1327
  __decorate([
@@ -1388,29 +1481,11 @@ var Types;
1388
1481
  Struct.type('location_static')
1389
1482
  ], location_static);
1390
1483
  Types.location_static = location_static;
1391
- let location_epoch = class location_epoch extends Struct {
1392
- };
1393
- __decorate([
1394
- Struct.field('bool')
1395
- ], location_epoch.prototype, "active", void 0);
1396
- __decorate([
1397
- Struct.field(UInt8)
1398
- ], location_epoch.prototype, "seed0", void 0);
1399
- __decorate([
1400
- Struct.field(UInt8)
1401
- ], location_epoch.prototype, "seed1", void 0);
1402
- location_epoch = __decorate([
1403
- Struct.type('location_epoch')
1404
- ], location_epoch);
1405
- Types.location_epoch = location_epoch;
1406
- let location_derived = class location_derived extends Struct {
1484
+ let location_derived = class location_derived extends Struct {
1407
1485
  };
1408
1486
  __decorate([
1409
1487
  Struct.field(location_static)
1410
1488
  ], location_derived.prototype, "static_props", void 0);
1411
- __decorate([
1412
- Struct.field(location_epoch)
1413
- ], location_derived.prototype, "epoch_props", void 0);
1414
1489
  __decorate([
1415
1490
  Struct.field(UInt16)
1416
1491
  ], location_derived.prototype, "size", void 0);
@@ -1430,30 +1505,6 @@ var Types;
1430
1505
  Struct.type('location_info')
1431
1506
  ], location_info);
1432
1507
  Types.location_info = location_info;
1433
- let location_row = class location_row extends Struct {
1434
- };
1435
- __decorate([
1436
- Struct.field(UInt64)
1437
- ], location_row.prototype, "id", void 0);
1438
- __decorate([
1439
- Struct.field(Name)
1440
- ], location_row.prototype, "owner", void 0);
1441
- __decorate([
1442
- Struct.field(coordinates)
1443
- ], location_row.prototype, "coordinates", void 0);
1444
- __decorate([
1445
- Struct.field(UInt32)
1446
- ], location_row.prototype, "cargomass", void 0);
1447
- __decorate([
1448
- Struct.field(cargo_item, { array: true })
1449
- ], location_row.prototype, "cargo", void 0);
1450
- __decorate([
1451
- Struct.field(schedule, { optional: true })
1452
- ], location_row.prototype, "schedule", void 0);
1453
- location_row = __decorate([
1454
- Struct.type('location_row')
1455
- ], location_row);
1456
- Types.location_row = location_row;
1457
1508
  let module_info = class module_info extends Struct {
1458
1509
  };
1459
1510
  __decorate([
@@ -1520,24 +1571,6 @@ var Types;
1520
1571
  Struct.type('nearby_info')
1521
1572
  ], nearby_info);
1522
1573
  Types.nearby_info = nearby_info;
1523
- let nexus_row = class nexus_row extends Struct {
1524
- };
1525
- __decorate([
1526
- Struct.field(UInt64)
1527
- ], nexus_row.prototype, "id", void 0);
1528
- __decorate([
1529
- Struct.field(Name)
1530
- ], nexus_row.prototype, "owner", void 0);
1531
- __decorate([
1532
- Struct.field('string')
1533
- ], nexus_row.prototype, "name", void 0);
1534
- __decorate([
1535
- Struct.field(coordinates)
1536
- ], nexus_row.prototype, "coordinates", void 0);
1537
- nexus_row = __decorate([
1538
- Struct.type('nexus_row')
1539
- ], nexus_row);
1540
- Types.nexus_row = nexus_row;
1541
1574
  let schema_field = class schema_field extends Struct {
1542
1575
  };
1543
1576
  __decorate([
@@ -1654,15 +1687,6 @@ var Types;
1654
1687
  __decorate([
1655
1688
  Struct.field('string')
1656
1689
  ], player_info.prototype, "company_name", void 0);
1657
- __decorate([
1658
- Struct.field(UInt64)
1659
- ], player_info.prototype, "ship_count", void 0);
1660
- __decorate([
1661
- Struct.field(UInt64)
1662
- ], player_info.prototype, "warehouse_count", void 0);
1663
- __decorate([
1664
- Struct.field(UInt64)
1665
- ], player_info.prototype, "container_count", void 0);
1666
1690
  player_info = __decorate([
1667
1691
  Struct.type('player_info')
1668
1692
  ], player_info);
@@ -1678,9 +1702,6 @@ var Types;
1678
1702
  Types.player_row = player_row;
1679
1703
  let recharge = class recharge extends Struct {
1680
1704
  };
1681
- __decorate([
1682
- Struct.field(Name)
1683
- ], recharge.prototype, "entity_type", void 0);
1684
1705
  __decorate([
1685
1706
  Struct.field(UInt64)
1686
1707
  ], recharge.prototype, "id", void 0);
@@ -1688,6 +1709,15 @@ var Types;
1688
1709
  Struct.type('recharge')
1689
1710
  ], recharge);
1690
1711
  Types.recharge = recharge;
1712
+ let refrshentity = class refrshentity extends Struct {
1713
+ };
1714
+ __decorate([
1715
+ Struct.field(UInt64)
1716
+ ], refrshentity.prototype, "entity_id", void 0);
1717
+ refrshentity = __decorate([
1718
+ Struct.type('refrshentity')
1719
+ ], refrshentity);
1720
+ Types.refrshentity = refrshentity;
1691
1721
  let reserve_row = class reserve_row extends Struct {
1692
1722
  };
1693
1723
  __decorate([
@@ -1708,9 +1738,6 @@ var Types;
1708
1738
  Types.reserve_row = reserve_row;
1709
1739
  let resolve = class resolve extends Struct {
1710
1740
  };
1711
- __decorate([
1712
- Struct.field(Name)
1713
- ], resolve.prototype, "entity_type", void 0);
1714
1741
  __decorate([
1715
1742
  Struct.field(UInt64)
1716
1743
  ], resolve.prototype, "id", void 0);
@@ -1789,9 +1816,6 @@ var Types;
1789
1816
  Types.resources_result = resources_result;
1790
1817
  let rmmodule = class rmmodule extends Struct {
1791
1818
  };
1792
- __decorate([
1793
- Struct.field(Name)
1794
- ], rmmodule.prototype, "entity_type", void 0);
1795
1819
  __decorate([
1796
1820
  Struct.field(UInt64)
1797
1821
  ], rmmodule.prototype, "entity_id", void 0);
@@ -1799,8 +1823,8 @@ var Types;
1799
1823
  Struct.field(UInt8)
1800
1824
  ], rmmodule.prototype, "module_index", void 0);
1801
1825
  __decorate([
1802
- Struct.field(UInt64)
1803
- ], rmmodule.prototype, "target_cargo_id", void 0);
1826
+ Struct.field(cargo_ref, { optional: true })
1827
+ ], rmmodule.prototype, "target_ref", void 0);
1804
1828
  rmmodule = __decorate([
1805
1829
  Struct.type('rmmodule')
1806
1830
  ], rmmodule);
@@ -1823,18 +1847,6 @@ var Types;
1823
1847
  Struct.type('salt')
1824
1848
  ], salt);
1825
1849
  Types.salt = salt;
1826
- let sequence_row = class sequence_row extends Struct {
1827
- };
1828
- __decorate([
1829
- Struct.field(Name)
1830
- ], sequence_row.prototype, "key", void 0);
1831
- __decorate([
1832
- Struct.field(UInt64)
1833
- ], sequence_row.prototype, "value", void 0);
1834
- sequence_row = __decorate([
1835
- Struct.type('sequence_row')
1836
- ], sequence_row);
1837
- Types.sequence_row = sequence_row;
1838
1850
  let setnftcfg = class setnftcfg extends Struct {
1839
1851
  };
1840
1852
  __decorate([
@@ -1850,66 +1862,15 @@ var Types;
1850
1862
  Struct.type('setnftcfg')
1851
1863
  ], setnftcfg);
1852
1864
  Types.setnftcfg = setnftcfg;
1853
- let ship_row = class ship_row extends Struct {
1865
+ let skipreveal = class skipreveal extends Struct {
1854
1866
  };
1855
1867
  __decorate([
1856
- Struct.field(UInt64)
1857
- ], ship_row.prototype, "id", void 0);
1858
- __decorate([
1859
- Struct.field(Name)
1860
- ], ship_row.prototype, "owner", void 0);
1861
- __decorate([
1862
- Struct.field('string')
1863
- ], ship_row.prototype, "name", void 0);
1864
- __decorate([
1865
- Struct.field(UInt64)
1866
- ], ship_row.prototype, "stats", void 0);
1867
- __decorate([
1868
- Struct.field(coordinates)
1869
- ], ship_row.prototype, "coordinates", void 0);
1870
- __decorate([
1871
- Struct.field(UInt32, { optional: true })
1872
- ], ship_row.prototype, "hullmass", void 0);
1873
- __decorate([
1874
- Struct.field(UInt32, { optional: true })
1875
- ], ship_row.prototype, "capacity", void 0);
1876
- __decorate([
1877
- Struct.field(UInt16, { optional: true })
1878
- ], ship_row.prototype, "energy", void 0);
1879
- __decorate([
1880
- Struct.field(UInt32)
1881
- ], ship_row.prototype, "cargomass", void 0);
1882
- __decorate([
1883
- Struct.field(movement_stats, { optional: true })
1884
- ], ship_row.prototype, "engines", void 0);
1885
- __decorate([
1886
- Struct.field(energy_stats, { optional: true })
1887
- ], ship_row.prototype, "generator", void 0);
1888
- __decorate([
1889
- Struct.field(loader_stats, { optional: true })
1890
- ], ship_row.prototype, "loaders", void 0);
1891
- __decorate([
1892
- Struct.field(gatherer_stats, { optional: true })
1893
- ], ship_row.prototype, "gatherer", void 0);
1894
- __decorate([
1895
- Struct.field(warp_stats, { optional: true })
1896
- ], ship_row.prototype, "warp", void 0);
1897
- __decorate([
1898
- Struct.field(crafter_stats, { optional: true })
1899
- ], ship_row.prototype, "crafter", void 0);
1900
- __decorate([
1901
- Struct.field(hauler_stats, { optional: true })
1902
- ], ship_row.prototype, "hauler", void 0);
1903
- __decorate([
1904
- Struct.field(module_entry, { array: true })
1905
- ], ship_row.prototype, "modules", void 0);
1906
- __decorate([
1907
- Struct.field(schedule, { optional: true })
1908
- ], ship_row.prototype, "schedule", void 0);
1909
- ship_row = __decorate([
1910
- Struct.type('ship_row')
1911
- ], ship_row);
1912
- Types.ship_row = ship_row;
1868
+ Struct.field(Checksum256)
1869
+ ], skipreveal.prototype, "commit", void 0);
1870
+ skipreveal = __decorate([
1871
+ Struct.type('skipreveal')
1872
+ ], skipreveal);
1873
+ Types.skipreveal = skipreveal;
1913
1874
  let spawncargo = class spawncargo extends Struct {
1914
1875
  };
1915
1876
  __decorate([
@@ -1972,9 +1933,6 @@ var Types;
1972
1933
  __decorate([
1973
1934
  Struct.field(UInt64)
1974
1935
  ], state_row.prototype, "salt", void 0);
1975
- __decorate([
1976
- Struct.field(UInt32)
1977
- ], state_row.prototype, "ships", void 0);
1978
1936
  __decorate([
1979
1937
  Struct.field(Checksum256)
1980
1938
  ], state_row.prototype, "seed", void 0);
@@ -2041,36 +1999,21 @@ var Types;
2041
1999
  Types.task_results = task_results;
2042
2000
  let transfer = class transfer extends Struct {
2043
2001
  };
2044
- __decorate([
2045
- Struct.field(Name)
2046
- ], transfer.prototype, "source_type", void 0);
2047
2002
  __decorate([
2048
2003
  Struct.field(UInt64)
2049
2004
  ], transfer.prototype, "source_id", void 0);
2050
- __decorate([
2051
- Struct.field(Name)
2052
- ], transfer.prototype, "dest_type", void 0);
2053
2005
  __decorate([
2054
2006
  Struct.field(UInt64)
2055
2007
  ], transfer.prototype, "dest_id", void 0);
2056
2008
  __decorate([
2057
- Struct.field(UInt16)
2058
- ], transfer.prototype, "item_id", void 0);
2059
- __decorate([
2060
- Struct.field(UInt64)
2061
- ], transfer.prototype, "stats", void 0);
2062
- __decorate([
2063
- Struct.field(UInt32)
2064
- ], transfer.prototype, "quantity", void 0);
2009
+ Struct.field(cargo_item, { array: true })
2010
+ ], transfer.prototype, "items", void 0);
2065
2011
  transfer = __decorate([
2066
2012
  Struct.type('transfer')
2067
2013
  ], transfer);
2068
2014
  Types.transfer = transfer;
2069
2015
  let travel = class travel extends Struct {
2070
2016
  };
2071
- __decorate([
2072
- Struct.field(Name)
2073
- ], travel.prototype, "entity_type", void 0);
2074
2017
  __decorate([
2075
2018
  Struct.field(UInt64)
2076
2019
  ], travel.prototype, "id", void 0);
@@ -2105,50 +2048,20 @@ var Types;
2105
2048
  Struct.type('types_row')
2106
2049
  ], types_row);
2107
2050
  Types.types_row = types_row;
2108
- let warehouse_row = class warehouse_row extends Struct {
2051
+ let undeploy = class undeploy extends Struct {
2109
2052
  };
2110
2053
  __decorate([
2111
2054
  Struct.field(UInt64)
2112
- ], warehouse_row.prototype, "id", void 0);
2113
- __decorate([
2114
- Struct.field(Name)
2115
- ], warehouse_row.prototype, "owner", void 0);
2116
- __decorate([
2117
- Struct.field('string')
2118
- ], warehouse_row.prototype, "name", void 0);
2055
+ ], undeploy.prototype, "host_id", void 0);
2119
2056
  __decorate([
2120
2057
  Struct.field(UInt64)
2121
- ], warehouse_row.prototype, "stats", void 0);
2122
- __decorate([
2123
- Struct.field(coordinates)
2124
- ], warehouse_row.prototype, "coordinates", void 0);
2125
- __decorate([
2126
- Struct.field(UInt32, { optional: true })
2127
- ], warehouse_row.prototype, "hullmass", void 0);
2128
- __decorate([
2129
- Struct.field(UInt32, { optional: true })
2130
- ], warehouse_row.prototype, "capacity", void 0);
2131
- __decorate([
2132
- Struct.field(UInt32)
2133
- ], warehouse_row.prototype, "cargomass", void 0);
2134
- __decorate([
2135
- Struct.field(loader_stats, { optional: true })
2136
- ], warehouse_row.prototype, "loaders", void 0);
2137
- __decorate([
2138
- Struct.field(module_entry, { array: true })
2139
- ], warehouse_row.prototype, "modules", void 0);
2140
- __decorate([
2141
- Struct.field(schedule, { optional: true })
2142
- ], warehouse_row.prototype, "schedule", void 0);
2143
- warehouse_row = __decorate([
2144
- Struct.type('warehouse_row')
2145
- ], warehouse_row);
2146
- Types.warehouse_row = warehouse_row;
2058
+ ], undeploy.prototype, "target_id", void 0);
2059
+ undeploy = __decorate([
2060
+ Struct.type('undeploy')
2061
+ ], undeploy);
2062
+ Types.undeploy = undeploy;
2147
2063
  let warp = class warp extends Struct {
2148
2064
  };
2149
- __decorate([
2150
- Struct.field(Name)
2151
- ], warp.prototype, "entity_type", void 0);
2152
2065
  __decorate([
2153
2066
  Struct.field(UInt64)
2154
2067
  ], warp.prototype, "id", void 0);
@@ -2168,48 +2081,46 @@ var Types;
2168
2081
  Struct.type('wipe')
2169
2082
  ], wipe);
2170
2083
  Types.wipe = wipe;
2171
- let wipesequence = class wipesequence extends Struct {
2172
- };
2173
- wipesequence = __decorate([
2174
- Struct.type('wipesequence')
2175
- ], wipesequence);
2176
- Types.wipesequence = wipesequence;
2177
2084
  let wrap = class wrap extends Struct {
2178
2085
  };
2179
2086
  __decorate([
2180
2087
  Struct.field(Name)
2181
2088
  ], wrap.prototype, "owner", void 0);
2182
- __decorate([
2183
- Struct.field(Name)
2184
- ], wrap.prototype, "entity_type", void 0);
2185
2089
  __decorate([
2186
2090
  Struct.field(UInt64)
2187
2091
  ], wrap.prototype, "entity_id", void 0);
2188
2092
  __decorate([
2189
2093
  Struct.field(UInt64)
2190
- ], wrap.prototype, "cargo_id", void 0);
2094
+ ], wrap.prototype, "nexus_id", void 0);
2191
2095
  __decorate([
2192
- Struct.field(UInt64)
2193
- ], wrap.prototype, "quantity", void 0);
2096
+ Struct.field(cargo_item, { array: true })
2097
+ ], wrap.prototype, "items", void 0);
2194
2098
  wrap = __decorate([
2195
2099
  Struct.type('wrap')
2196
2100
  ], wrap);
2197
2101
  Types.wrap = wrap;
2102
+ let wrapentity = class wrapentity extends Struct {
2103
+ };
2104
+ __decorate([
2105
+ Struct.field(UInt64)
2106
+ ], wrapentity.prototype, "entity_id", void 0);
2107
+ __decorate([
2108
+ Struct.field(UInt64)
2109
+ ], wrapentity.prototype, "nexus_id", void 0);
2110
+ wrapentity = __decorate([
2111
+ Struct.type('wrapentity')
2112
+ ], wrapentity);
2113
+ Types.wrapentity = wrapentity;
2198
2114
  })(Types || (Types = {}));
2199
2115
  const TableMap = {
2200
2116
  cargo: Types.cargo_row,
2201
- container: Types.container_row,
2117
+ entity: Types.entity_row,
2202
2118
  entitygroup: Types.entitygroup_row,
2203
- location: Types.location_row,
2204
- nexus: Types.nexus_row,
2205
2119
  nftconfig: Types.nftconfig_row,
2206
2120
  player: Types.player_row,
2207
2121
  reserve: Types.reserve_row,
2208
- sequence: Types.sequence_row,
2209
- ship: Types.ship_row,
2210
2122
  state: Types.state_row,
2211
2123
  types: Types.types_row,
2212
- warehouse: Types.warehouse_row,
2213
2124
  };
2214
2125
  class Contract extends Contract$2 {
2215
2126
  constructor(args) {
@@ -2331,12 +2242,13 @@ const INSUFFICIENT_ITEM_SUPPLY = 'Insufficient supply of item at location.';
2331
2242
 
2332
2243
  const PRECISION$1 = 10000;
2333
2244
  const CRAFT_ENERGY_DIVISOR = 150000;
2334
- const WAREHOUSE_Z = 500;
2245
+ const PLANETARY_STRUCTURE_Z = 0;
2335
2246
  const CONTAINER_Z = 300;
2336
2247
  const TRAVEL_MAX_DURATION = 86400;
2337
2248
  const MIN_ORBITAL_ALTITUDE = 800;
2338
2249
  const MAX_ORBITAL_ALTITUDE = 3000;
2339
2250
  const BASE_ORBITAL_MASS = 100000;
2251
+ const MIN_TRANSFER_DISTANCE = 100;
2340
2252
  var TaskType;
2341
2253
  (function (TaskType) {
2342
2254
  TaskType[TaskType["IDLE"] = 0] = "IDLE";
@@ -2350,6 +2262,9 @@ var TaskType;
2350
2262
  TaskType[TaskType["DEPLOY"] = 8] = "DEPLOY";
2351
2263
  TaskType[TaskType["WRAP"] = 9] = "WRAP";
2352
2264
  TaskType[TaskType["UNWRAP"] = 10] = "UNWRAP";
2265
+ TaskType[TaskType["UNDEPLOY"] = 11] = "UNDEPLOY";
2266
+ TaskType[TaskType["WRAP_ENTITY"] = 12] = "WRAP_ENTITY";
2267
+ TaskType[TaskType["DEMOLISH"] = 13] = "DEMOLISH";
2353
2268
  })(TaskType || (TaskType = {}));
2354
2269
  var LocationType;
2355
2270
  (function (LocationType) {
@@ -2357,6 +2272,7 @@ var LocationType;
2357
2272
  LocationType[LocationType["PLANET"] = 1] = "PLANET";
2358
2273
  LocationType[LocationType["ASTEROID"] = 2] = "ASTEROID";
2359
2274
  LocationType[LocationType["NEBULA"] = 3] = "NEBULA";
2275
+ LocationType[LocationType["ICE_FIELD"] = 4] = "ICE_FIELD";
2360
2276
  })(LocationType || (LocationType = {}));
2361
2277
  var TaskCancelable;
2362
2278
  (function (TaskCancelable) {
@@ -2411,6 +2327,9 @@ const CATEGORY_LABELS = {
2411
2327
  function formatTier(tier) {
2412
2328
  return 'T' + tier;
2413
2329
  }
2330
+ function tierAdjective(tier) {
2331
+ return TIER_ADJECTIVES[tier] ?? `T${tier}`;
2332
+ }
2414
2333
 
2415
2334
  const ITEM_ORE_T1 = 101;
2416
2335
  const ITEM_ORE_T2 = 102;
@@ -2479,9 +2398,11 @@ const ITEM_LOADER_T1 = 10103;
2479
2398
  const ITEM_CRAFTER_T1 = 10104;
2480
2399
  const ITEM_STORAGE_T1 = 10105;
2481
2400
  const ITEM_HAULER_T1 = 10106;
2401
+ const ITEM_WARP_T1 = 10107;
2482
2402
  const ITEM_CONTAINER_T1_PACKED = 10200;
2483
2403
  const ITEM_SHIP_T1_PACKED = 10201;
2484
2404
  const ITEM_WAREHOUSE_T1_PACKED = 10202;
2405
+ const ITEM_EXTRACTOR_T1_PACKED = 10203;
2485
2406
  const ITEM_HULL_PLATES_T2 = 20001;
2486
2407
  const ITEM_CARGO_LINING_T2 = 20002;
2487
2408
  const ITEM_CONTAINER_T2_PACKED = 20200;
@@ -2508,6 +2429,55 @@ var items = [
2508
2429
  tier: 3,
2509
2430
  category: "ore"
2510
2431
  },
2432
+ {
2433
+ id: 104,
2434
+ mass: 71000,
2435
+ type: "resource",
2436
+ tier: 4,
2437
+ category: "ore"
2438
+ },
2439
+ {
2440
+ id: 105,
2441
+ mass: 78000,
2442
+ type: "resource",
2443
+ tier: 5,
2444
+ category: "ore"
2445
+ },
2446
+ {
2447
+ id: 106,
2448
+ mass: 87000,
2449
+ type: "resource",
2450
+ tier: 6,
2451
+ category: "ore"
2452
+ },
2453
+ {
2454
+ id: 107,
2455
+ mass: 96000,
2456
+ type: "resource",
2457
+ tier: 7,
2458
+ category: "ore"
2459
+ },
2460
+ {
2461
+ id: 108,
2462
+ mass: 107000,
2463
+ type: "resource",
2464
+ tier: 8,
2465
+ category: "ore"
2466
+ },
2467
+ {
2468
+ id: 109,
2469
+ mass: 118000,
2470
+ type: "resource",
2471
+ tier: 9,
2472
+ category: "ore"
2473
+ },
2474
+ {
2475
+ id: 110,
2476
+ mass: 130000,
2477
+ type: "resource",
2478
+ tier: 10,
2479
+ category: "ore"
2480
+ },
2511
2481
  {
2512
2482
  id: 201,
2513
2483
  mass: 35000,
@@ -2529,6 +2499,55 @@ var items = [
2529
2499
  tier: 3,
2530
2500
  category: "crystal"
2531
2501
  },
2502
+ {
2503
+ id: 204,
2504
+ mass: 35000,
2505
+ type: "resource",
2506
+ tier: 4,
2507
+ category: "crystal"
2508
+ },
2509
+ {
2510
+ id: 205,
2511
+ mass: 35000,
2512
+ type: "resource",
2513
+ tier: 5,
2514
+ category: "crystal"
2515
+ },
2516
+ {
2517
+ id: 206,
2518
+ mass: 35000,
2519
+ type: "resource",
2520
+ tier: 6,
2521
+ category: "crystal"
2522
+ },
2523
+ {
2524
+ id: 207,
2525
+ mass: 35000,
2526
+ type: "resource",
2527
+ tier: 7,
2528
+ category: "crystal"
2529
+ },
2530
+ {
2531
+ id: 208,
2532
+ mass: 35000,
2533
+ type: "resource",
2534
+ tier: 8,
2535
+ category: "crystal"
2536
+ },
2537
+ {
2538
+ id: 209,
2539
+ mass: 35000,
2540
+ type: "resource",
2541
+ tier: 9,
2542
+ category: "crystal"
2543
+ },
2544
+ {
2545
+ id: 210,
2546
+ mass: 35000,
2547
+ type: "resource",
2548
+ tier: 10,
2549
+ category: "crystal"
2550
+ },
2532
2551
  {
2533
2552
  id: 301,
2534
2553
  mass: 15000,
@@ -2550,6 +2569,55 @@ var items = [
2550
2569
  tier: 3,
2551
2570
  category: "gas"
2552
2571
  },
2572
+ {
2573
+ id: 304,
2574
+ mass: 11000,
2575
+ type: "resource",
2576
+ tier: 4,
2577
+ category: "gas"
2578
+ },
2579
+ {
2580
+ id: 305,
2581
+ mass: 10000,
2582
+ type: "resource",
2583
+ tier: 5,
2584
+ category: "gas"
2585
+ },
2586
+ {
2587
+ id: 306,
2588
+ mass: 9000,
2589
+ type: "resource",
2590
+ tier: 6,
2591
+ category: "gas"
2592
+ },
2593
+ {
2594
+ id: 307,
2595
+ mass: 8000,
2596
+ type: "resource",
2597
+ tier: 7,
2598
+ category: "gas"
2599
+ },
2600
+ {
2601
+ id: 308,
2602
+ mass: 7500,
2603
+ type: "resource",
2604
+ tier: 8,
2605
+ category: "gas"
2606
+ },
2607
+ {
2608
+ id: 309,
2609
+ mass: 6500,
2610
+ type: "resource",
2611
+ tier: 9,
2612
+ category: "gas"
2613
+ },
2614
+ {
2615
+ id: 310,
2616
+ mass: 6000,
2617
+ type: "resource",
2618
+ tier: 10,
2619
+ category: "gas"
2620
+ },
2553
2621
  {
2554
2622
  id: 401,
2555
2623
  mass: 22000,
@@ -2571,6 +2639,55 @@ var items = [
2571
2639
  tier: 3,
2572
2640
  category: "regolith"
2573
2641
  },
2642
+ {
2643
+ id: 404,
2644
+ mass: 32000,
2645
+ type: "resource",
2646
+ tier: 4,
2647
+ category: "regolith"
2648
+ },
2649
+ {
2650
+ id: 405,
2651
+ mass: 36000,
2652
+ type: "resource",
2653
+ tier: 5,
2654
+ category: "regolith"
2655
+ },
2656
+ {
2657
+ id: 406,
2658
+ mass: 40500,
2659
+ type: "resource",
2660
+ tier: 6,
2661
+ category: "regolith"
2662
+ },
2663
+ {
2664
+ id: 407,
2665
+ mass: 46000,
2666
+ type: "resource",
2667
+ tier: 7,
2668
+ category: "regolith"
2669
+ },
2670
+ {
2671
+ id: 408,
2672
+ mass: 52000,
2673
+ type: "resource",
2674
+ tier: 8,
2675
+ category: "regolith"
2676
+ },
2677
+ {
2678
+ id: 409,
2679
+ mass: 58500,
2680
+ type: "resource",
2681
+ tier: 9,
2682
+ category: "regolith"
2683
+ },
2684
+ {
2685
+ id: 410,
2686
+ mass: 66000,
2687
+ type: "resource",
2688
+ tier: 10,
2689
+ category: "regolith"
2690
+ },
2574
2691
  {
2575
2692
  id: 501,
2576
2693
  mass: 42000,
@@ -2593,10 +2710,59 @@ var items = [
2593
2710
  category: "biomass"
2594
2711
  },
2595
2712
  {
2596
- id: 10001,
2597
- mass: 50000,
2598
- type: "component",
2599
- tier: 1
2713
+ id: 504,
2714
+ mass: 29000,
2715
+ type: "resource",
2716
+ tier: 4,
2717
+ category: "biomass"
2718
+ },
2719
+ {
2720
+ id: 505,
2721
+ mass: 26000,
2722
+ type: "resource",
2723
+ tier: 5,
2724
+ category: "biomass"
2725
+ },
2726
+ {
2727
+ id: 506,
2728
+ mass: 23000,
2729
+ type: "resource",
2730
+ tier: 6,
2731
+ category: "biomass"
2732
+ },
2733
+ {
2734
+ id: 507,
2735
+ mass: 20000,
2736
+ type: "resource",
2737
+ tier: 7,
2738
+ category: "biomass"
2739
+ },
2740
+ {
2741
+ id: 508,
2742
+ mass: 18000,
2743
+ type: "resource",
2744
+ tier: 8,
2745
+ category: "biomass"
2746
+ },
2747
+ {
2748
+ id: 509,
2749
+ mass: 16000,
2750
+ type: "resource",
2751
+ tier: 9,
2752
+ category: "biomass"
2753
+ },
2754
+ {
2755
+ id: 510,
2756
+ mass: 14000,
2757
+ type: "resource",
2758
+ tier: 10,
2759
+ category: "biomass"
2760
+ },
2761
+ {
2762
+ id: 10001,
2763
+ mass: 50000,
2764
+ type: "component",
2765
+ tier: 1
2600
2766
  },
2601
2767
  {
2602
2768
  id: 10002,
@@ -2701,6 +2867,13 @@ var items = [
2701
2867
  tier: 1,
2702
2868
  subtype: "hauler"
2703
2869
  },
2870
+ {
2871
+ id: 10107,
2872
+ mass: 180000,
2873
+ type: "module",
2874
+ tier: 1,
2875
+ subtype: "warp"
2876
+ },
2704
2877
  {
2705
2878
  id: 10200,
2706
2879
  mass: 80000,
@@ -2719,6 +2892,12 @@ var items = [
2719
2892
  type: "entity",
2720
2893
  tier: 1
2721
2894
  },
2895
+ {
2896
+ id: 10203,
2897
+ mass: 800000,
2898
+ type: "entity",
2899
+ tier: 1
2900
+ },
2722
2901
  {
2723
2902
  id: 20001,
2724
2903
  mass: 50000,
@@ -3147,10 +3326,6 @@ var recipes = [
3147
3326
  },
3148
3327
  {
3149
3328
  sources: [
3150
- {
3151
- inputIndex: 1,
3152
- statIndex: 1
3153
- }
3154
3329
  ]
3155
3330
  },
3156
3331
  {
@@ -3190,8 +3365,8 @@ var recipes = [
3190
3365
  {
3191
3366
  sources: [
3192
3367
  {
3193
- inputIndex: 0,
3194
- statIndex: 0
3368
+ inputIndex: 1,
3369
+ statIndex: 1
3195
3370
  }
3196
3371
  ]
3197
3372
  },
@@ -3309,7 +3484,7 @@ var recipes = [
3309
3484
  sources: [
3310
3485
  {
3311
3486
  inputIndex: 0,
3312
- statIndex: 0
3487
+ statIndex: 1
3313
3488
  }
3314
3489
  ]
3315
3490
  },
@@ -3325,12 +3500,38 @@ var recipes = [
3325
3500
  sources: [
3326
3501
  {
3327
3502
  inputIndex: 0,
3328
- statIndex: 1
3503
+ statIndex: 0
3329
3504
  }
3330
3505
  ]
3331
3506
  },
3507
+ {
3508
+ sources: [
3509
+ ]
3510
+ }
3511
+ ],
3512
+ blendWeights: [
3513
+ ]
3514
+ },
3515
+ {
3516
+ outputItemId: 10107,
3517
+ outputMass: 180000,
3518
+ inputs: [
3519
+ {
3520
+ itemId: 10010,
3521
+ quantity: 6
3522
+ },
3523
+ {
3524
+ itemId: 10009,
3525
+ quantity: 4
3526
+ }
3527
+ ],
3528
+ statSlots: [
3332
3529
  {
3333
3530
  sources: [
3531
+ {
3532
+ inputIndex: 0,
3533
+ statIndex: 1
3534
+ },
3334
3535
  {
3335
3536
  inputIndex: 1,
3336
3537
  statIndex: 1
@@ -3339,6 +3540,8 @@ var recipes = [
3339
3540
  }
3340
3541
  ],
3341
3542
  blendWeights: [
3543
+ 1,
3544
+ 1
3342
3545
  ]
3343
3546
  },
3344
3547
  {
@@ -3491,6 +3694,56 @@ var recipes = [
3491
3694
  blendWeights: [
3492
3695
  ]
3493
3696
  },
3697
+ {
3698
+ outputItemId: 10203,
3699
+ outputMass: 800000,
3700
+ inputs: [
3701
+ {
3702
+ itemId: 10001,
3703
+ quantity: 15
3704
+ },
3705
+ {
3706
+ itemId: 10002,
3707
+ quantity: 8
3708
+ }
3709
+ ],
3710
+ statSlots: [
3711
+ {
3712
+ sources: [
3713
+ {
3714
+ inputIndex: 0,
3715
+ statIndex: 0
3716
+ }
3717
+ ]
3718
+ },
3719
+ {
3720
+ sources: [
3721
+ {
3722
+ inputIndex: 0,
3723
+ statIndex: 1
3724
+ }
3725
+ ]
3726
+ },
3727
+ {
3728
+ sources: [
3729
+ {
3730
+ inputIndex: 1,
3731
+ statIndex: 0
3732
+ }
3733
+ ]
3734
+ },
3735
+ {
3736
+ sources: [
3737
+ {
3738
+ inputIndex: 1,
3739
+ statIndex: 1
3740
+ }
3741
+ ]
3742
+ }
3743
+ ],
3744
+ blendWeights: [
3745
+ ]
3746
+ },
3494
3747
  {
3495
3748
  outputItemId: 20001,
3496
3749
  outputMass: 50000,
@@ -3649,19 +3902,24 @@ var entities = [
3649
3902
  entityItemId: 10201,
3650
3903
  slots: [
3651
3904
  {
3652
- type: "any"
3905
+ type: "any",
3906
+ outputPct: 100
3653
3907
  },
3654
3908
  {
3655
- type: "any"
3909
+ type: "any",
3910
+ outputPct: 100
3656
3911
  },
3657
3912
  {
3658
- type: "any"
3913
+ type: "any",
3914
+ outputPct: 100
3659
3915
  },
3660
3916
  {
3661
- type: "any"
3917
+ type: "any",
3918
+ outputPct: 100
3662
3919
  },
3663
3920
  {
3664
- type: "any"
3921
+ type: "any",
3922
+ outputPct: 100
3665
3923
  }
3666
3924
  ]
3667
3925
  },
@@ -3669,19 +3927,37 @@ var entities = [
3669
3927
  entityItemId: 10202,
3670
3928
  slots: [
3671
3929
  {
3672
- type: "loader"
3930
+ type: "loader",
3931
+ outputPct: 100
3932
+ },
3933
+ {
3934
+ type: "storage",
3935
+ outputPct: 100
3673
3936
  },
3674
3937
  {
3675
- type: "storage"
3938
+ type: "storage",
3939
+ outputPct: 100
3676
3940
  },
3677
3941
  {
3678
- type: "storage"
3942
+ type: "storage",
3943
+ outputPct: 100
3679
3944
  },
3680
3945
  {
3681
- type: "storage"
3946
+ type: "storage",
3947
+ outputPct: 100
3948
+ }
3949
+ ]
3950
+ },
3951
+ {
3952
+ entityItemId: 10203,
3953
+ slots: [
3954
+ {
3955
+ type: "generator",
3956
+ outputPct: 100
3682
3957
  },
3683
3958
  {
3684
- type: "storage"
3959
+ type: "gatherer",
3960
+ outputPct: 100
3685
3961
  }
3686
3962
  ]
3687
3963
  },
@@ -3692,78 +3968,6 @@ var entities = [
3692
3968
  }
3693
3969
  ];
3694
3970
 
3695
- const categoryColors = {
3696
- ore: '#C26D3F',
3697
- crystal: '#4ADBFF',
3698
- gas: '#B8E4A0',
3699
- regolith: '#C4A57B',
3700
- biomass: '#5A8B3E',
3701
- };
3702
- const tierColors = {
3703
- 1: '#8b8b8b',
3704
- 2: '#4ade80',
3705
- 3: '#818cf8',
3706
- 4: '#c084fc',
3707
- 5: '#fbbf24',
3708
- 6: '#f97316',
3709
- 7: '#ef4444',
3710
- 8: '#ec4899',
3711
- 9: '#06b6d4',
3712
- 10: '#ffffff',
3713
- };
3714
- const tierLabels = {
3715
- 1: 'Common',
3716
- 2: 'Uncommon',
3717
- 3: 'Rare',
3718
- 4: 'Epic',
3719
- 5: 'Legendary',
3720
- 6: 'Mythic',
3721
- 7: 'Divine',
3722
- 8: 'Celestial',
3723
- 9: 'Eternal',
3724
- 10: 'Transcendent',
3725
- };
3726
- const categoryIcons = {
3727
- ore: '⬡',
3728
- crystal: '◈',
3729
- gas: '◎',
3730
- regolith: '■',
3731
- biomass: '❋',
3732
- };
3733
- const categoryIconShapes = {
3734
- ore: 'hex',
3735
- crystal: 'diamond',
3736
- gas: 'circle',
3737
- regolith: 'square',
3738
- biomass: 'star',
3739
- };
3740
- const componentIcon = '▣';
3741
- const moduleIcon = '⬢';
3742
- const itemAbbreviations = {
3743
- 10001: 'HP',
3744
- 10002: 'CL',
3745
- 10003: 'TC',
3746
- 10004: 'PC',
3747
- 10005: 'DS',
3748
- 10006: 'EP',
3749
- 10007: 'CA',
3750
- 10008: 'TB',
3751
- 10009: 'RC',
3752
- 10010: 'FA',
3753
- 10100: 'EN',
3754
- 10101: 'GN',
3755
- 10102: 'EX',
3756
- 10103: 'LD',
3757
- 10104: 'MF',
3758
- 10105: 'ST',
3759
- 10200: 'CT',
3760
- 10201: 'SH',
3761
- 10202: 'WH',
3762
- 20001: 'HP',
3763
- 20002: 'CL',
3764
- 20200: 'CT',
3765
- };
3766
-
3767
3971
  const itemMetadata = {
3768
3972
  101: { name: 'Ore', description: 'Crude metallic ore.', color: '#C26D3F' },
3769
3973
  102: { name: 'Ore', description: 'Refined metallic ore with improved purity.', color: '#C26D3F' },
@@ -3772,6 +3976,13 @@ const itemMetadata = {
3772
3976
  description: 'High-grade metallic ore with exceptional density.',
3773
3977
  color: '#C26D3F',
3774
3978
  },
3979
+ 104: { name: 'Ore', description: '', color: '#C26D3F' },
3980
+ 105: { name: 'Ore', description: '', color: '#C26D3F' },
3981
+ 106: { name: 'Ore', description: '', color: '#C26D3F' },
3982
+ 107: { name: 'Ore', description: '', color: '#C26D3F' },
3983
+ 108: { name: 'Ore', description: '', color: '#C26D3F' },
3984
+ 109: { name: 'Ore', description: '', color: '#C26D3F' },
3985
+ 110: { name: 'Ore', description: '', color: '#C26D3F' },
3775
3986
  201: { name: 'Crystal', description: 'Raw resonant crystal.', color: '#4ADBFF' },
3776
3987
  202: {
3777
3988
  name: 'Crystal',
@@ -3783,6 +3994,13 @@ const itemMetadata = {
3783
3994
  description: 'High-grade resonant crystal with exceptional purity.',
3784
3995
  color: '#4ADBFF',
3785
3996
  },
3997
+ 204: { name: 'Crystal', description: '', color: '#4ADBFF' },
3998
+ 205: { name: 'Crystal', description: '', color: '#4ADBFF' },
3999
+ 206: { name: 'Crystal', description: '', color: '#4ADBFF' },
4000
+ 207: { name: 'Crystal', description: '', color: '#4ADBFF' },
4001
+ 208: { name: 'Crystal', description: '', color: '#4ADBFF' },
4002
+ 209: { name: 'Crystal', description: '', color: '#4ADBFF' },
4003
+ 210: { name: 'Crystal', description: '', color: '#4ADBFF' },
3786
4004
  301: { name: 'Gas', description: 'Raw volatile gas.', color: '#B8E4A0' },
3787
4005
  302: {
3788
4006
  name: 'Gas',
@@ -3794,6 +4012,13 @@ const itemMetadata = {
3794
4012
  description: 'High-grade volatile gas with exceptional energy density.',
3795
4013
  color: '#B8E4A0',
3796
4014
  },
4015
+ 304: { name: 'Gas', description: '', color: '#B8E4A0' },
4016
+ 305: { name: 'Gas', description: '', color: '#B8E4A0' },
4017
+ 306: { name: 'Gas', description: '', color: '#B8E4A0' },
4018
+ 307: { name: 'Gas', description: '', color: '#B8E4A0' },
4019
+ 308: { name: 'Gas', description: '', color: '#B8E4A0' },
4020
+ 309: { name: 'Gas', description: '', color: '#B8E4A0' },
4021
+ 310: { name: 'Gas', description: '', color: '#B8E4A0' },
3797
4022
  401: { name: 'Regolith', description: 'Crude regolith dust.', color: '#C4A57B' },
3798
4023
  402: {
3799
4024
  name: 'Regolith',
@@ -3805,6 +4030,13 @@ const itemMetadata = {
3805
4030
  description: 'High-grade regolith with exceptional uniformity.',
3806
4031
  color: '#C4A57B',
3807
4032
  },
4033
+ 404: { name: 'Regolith', description: '', color: '#C4A57B' },
4034
+ 405: { name: 'Regolith', description: '', color: '#C4A57B' },
4035
+ 406: { name: 'Regolith', description: '', color: '#C4A57B' },
4036
+ 407: { name: 'Regolith', description: '', color: '#C4A57B' },
4037
+ 408: { name: 'Regolith', description: '', color: '#C4A57B' },
4038
+ 409: { name: 'Regolith', description: '', color: '#C4A57B' },
4039
+ 410: { name: 'Regolith', description: '', color: '#C4A57B' },
3808
4040
  501: { name: 'Biomass', description: 'Crude organic biomass.', color: '#5A8B3E' },
3809
4041
  502: {
3810
4042
  name: 'Biomass',
@@ -3816,6 +4048,13 @@ const itemMetadata = {
3816
4048
  description: 'High-grade biomass with exceptional saturation.',
3817
4049
  color: '#5A8B3E',
3818
4050
  },
4051
+ 504: { name: 'Biomass', description: '', color: '#5A8B3E' },
4052
+ 505: { name: 'Biomass', description: '', color: '#5A8B3E' },
4053
+ 506: { name: 'Biomass', description: '', color: '#5A8B3E' },
4054
+ 507: { name: 'Biomass', description: '', color: '#5A8B3E' },
4055
+ 508: { name: 'Biomass', description: '', color: '#5A8B3E' },
4056
+ 509: { name: 'Biomass', description: '', color: '#5A8B3E' },
4057
+ 510: { name: 'Biomass', description: '', color: '#5A8B3E' },
3819
4058
  10001: {
3820
4059
  name: 'Hull Plates',
3821
4060
  description: 'Structural plating formed from ore. Used in hulls, containers, and frames.',
@@ -3901,6 +4140,11 @@ const itemMetadata = {
3901
4140
  description: 'Projects a haul beam to lock onto and transport containers or warehouses through group travel.',
3902
4141
  color: '#4ADBFF',
3903
4142
  },
4143
+ 10107: {
4144
+ name: 'Warp',
4145
+ description: 'Folds local space-time around the hull, projecting the ship across vast distances in a single discharge of the entire energy reserve.',
4146
+ color: '#9be4ff',
4147
+ },
3904
4148
  10200: {
3905
4149
  name: 'Container',
3906
4150
  description: 'Passive floating cargo storage in space. Towed by ships.',
@@ -3916,6 +4160,11 @@ const itemMetadata = {
3916
4160
  description: 'Massive stationary storage facility with a single loader module slot.',
3917
4161
  color: '#EAB308',
3918
4162
  },
4163
+ 10203: {
4164
+ name: 'Extractor',
4165
+ description: 'Planetary resource extraction facility with generator and gatherer module slots.',
4166
+ color: '#D4726F',
4167
+ },
3919
4168
  20001: {
3920
4169
  name: 'Hull Plates',
3921
4170
  description: 'Advanced structural plating reinforced with tier 2 ore.',
@@ -3935,6 +4184,7 @@ const itemMetadata = {
3935
4184
  const entityMetadata = {
3936
4185
  10201: { moduleSlotLabels: ['Engine', 'Generator', 'Gatherer', 'Loader', 'Storage'] },
3937
4186
  10202: { moduleSlotLabels: ['Loader', 'Storage', 'Storage', 'Storage', 'Storage'] },
4187
+ 10203: { moduleSlotLabels: ['Generator', 'Gatherer'] },
3938
4188
  };
3939
4189
  for (const item of items) {
3940
4190
  if (!itemMetadata[item.id]) {
@@ -4040,9 +4290,6 @@ function typeLabel(type) {
4040
4290
  function categoryLabel(cat) {
4041
4291
  return CATEGORY_LABELS[cat];
4042
4292
  }
4043
- function tierLabel(tier) {
4044
- return tierLabels[tier] ?? `T${tier}`;
4045
- }
4046
4293
  const CATEGORY_BY_INDEX = ['ore', 'gas', 'regolith', 'biomass', 'crystal'];
4047
4294
  function categoryFromIndex(i) {
4048
4295
  return CATEGORY_BY_INDEX[i];
@@ -4105,10 +4352,15 @@ function hash512(seed, string) {
4105
4352
  }
4106
4353
 
4107
4354
  const DEPTH_THRESHOLD_T1 = 0;
4108
- const DEPTH_THRESHOLD_T2 = 2000;
4109
- const DEPTH_THRESHOLD_T3 = 10000;
4110
- const DEPTH_THRESHOLD_T4 = 30000;
4111
- const DEPTH_THRESHOLD_T5 = 55000;
4355
+ const DEPTH_THRESHOLD_T2 = 1500;
4356
+ const DEPTH_THRESHOLD_T3 = 5000;
4357
+ const DEPTH_THRESHOLD_T4 = 12000;
4358
+ const DEPTH_THRESHOLD_T5 = 22000;
4359
+ const DEPTH_THRESHOLD_T6 = 32000;
4360
+ const DEPTH_THRESHOLD_T7 = 42000;
4361
+ const DEPTH_THRESHOLD_T8 = 50000;
4362
+ const DEPTH_THRESHOLD_T9 = 57000;
4363
+ const DEPTH_THRESHOLD_T10 = 63000;
4112
4364
  const LOCATION_MIN_DEPTH = 500;
4113
4365
  const LOCATION_MAX_DEPTH = 65535;
4114
4366
  const YIELD_THRESHOLD = Math.floor(0.001 * 0xffffffff);
@@ -4118,19 +4370,22 @@ const PLANET_SUBTYPE_TERRESTRIAL = 2;
4118
4370
  const PLANET_SUBTYPE_ICY = 3;
4119
4371
  const PLANET_SUBTYPE_OCEAN = 4;
4120
4372
  const PLANET_SUBTYPE_INDUSTRIAL = 5;
4373
+ const DEPTH_THRESHOLD_TABLE = [
4374
+ DEPTH_THRESHOLD_T1,
4375
+ DEPTH_THRESHOLD_T2,
4376
+ DEPTH_THRESHOLD_T3,
4377
+ DEPTH_THRESHOLD_T4,
4378
+ DEPTH_THRESHOLD_T5,
4379
+ DEPTH_THRESHOLD_T6,
4380
+ DEPTH_THRESHOLD_T7,
4381
+ DEPTH_THRESHOLD_T8,
4382
+ DEPTH_THRESHOLD_T9,
4383
+ DEPTH_THRESHOLD_T10,
4384
+ ];
4121
4385
  function getDepthThreshold(tier) {
4122
- switch (tier) {
4123
- case 1:
4124
- return DEPTH_THRESHOLD_T1;
4125
- case 2:
4126
- return DEPTH_THRESHOLD_T2;
4127
- case 3:
4128
- return DEPTH_THRESHOLD_T3;
4129
- case 4:
4130
- return DEPTH_THRESHOLD_T4;
4131
- default:
4132
- return DEPTH_THRESHOLD_T5;
4133
- }
4386
+ if (tier < 1 || tier > 10)
4387
+ return 65535;
4388
+ return DEPTH_THRESHOLD_TABLE[tier - 1];
4134
4389
  }
4135
4390
  function getResourceTier(itemId) {
4136
4391
  return getItem(itemId).tier;
@@ -4143,11 +4398,11 @@ function getResourceWeight(itemId, stratum) {
4143
4398
  const depthAbove = stratum - threshold;
4144
4399
  switch (tier) {
4145
4400
  case 1:
4146
- if (stratum < 2000)
4401
+ if (stratum < DEPTH_THRESHOLD_T2)
4147
4402
  return 100;
4148
- if (stratum < 10000)
4403
+ if (stratum < DEPTH_THRESHOLD_T3)
4149
4404
  return 80;
4150
- if (stratum < 30000)
4405
+ if (stratum < DEPTH_THRESHOLD_T4)
4151
4406
  return 50;
4152
4407
  return 30;
4153
4408
  case 2:
@@ -4172,37 +4427,97 @@ function getResourceWeight(itemId, stratum) {
4172
4427
  return 10;
4173
4428
  }
4174
4429
  }
4175
- const ASTEROID_RESOURCES = [101, 102, 103, 201, 202];
4176
- const NEBULA_RESOURCES = [202, 203, 301, 302, 303];
4177
- const GAS_GIANT_RESOURCES = [301, 302, 303, 401, 501];
4178
- const ROCKY_RESOURCES = [101, 102, 103, 401, 402, 403, 503];
4179
- const TERRESTRIAL_RESOURCES = [201, 202, 401, 402, 501, 502, 503];
4180
- const ICY_RESOURCES = [101, 301, 302, 401, 403, 501, 502];
4181
- const OCEAN_RESOURCES = [201, 203, 301, 303, 501, 502, 503];
4182
- const INDUSTRIAL_RESOURCES = [101, 102, 103, 201, 203, 402, 403];
4183
- function getLocationCandidates(locationType, subtype) {
4184
- if (locationType === 2)
4185
- return ASTEROID_RESOURCES;
4186
- if (locationType === 3)
4187
- return NEBULA_RESOURCES;
4188
- if (locationType === 1) {
4430
+ const RESOURCE_ORE = 0;
4431
+ const RESOURCE_GAS = 1;
4432
+ const RESOURCE_REGOLITH = 2;
4433
+ const RESOURCE_BIOMASS = 3;
4434
+ const RESOURCE_CRYSTAL = 4;
4435
+ function categoryBaseId(category) {
4436
+ switch (category) {
4437
+ case RESOURCE_ORE:
4438
+ return 100;
4439
+ case RESOURCE_CRYSTAL:
4440
+ return 200;
4441
+ case RESOURCE_GAS:
4442
+ return 300;
4443
+ case RESOURCE_REGOLITH:
4444
+ return 400;
4445
+ case RESOURCE_BIOMASS:
4446
+ return 500;
4447
+ default:
4448
+ return 0;
4449
+ }
4450
+ }
4451
+ function resourceId(category, tier) {
4452
+ return categoryBaseId(category) + tier;
4453
+ }
4454
+ function getLocationProfile(locationType, subtype) {
4455
+ if (locationType === LocationType.ASTEROID) {
4456
+ return [
4457
+ { category: RESOURCE_ORE, maxTier: 5 },
4458
+ { category: RESOURCE_CRYSTAL, maxTier: 5 },
4459
+ ];
4460
+ }
4461
+ if (locationType === LocationType.NEBULA) {
4462
+ return [
4463
+ { category: RESOURCE_GAS, maxTier: 5 },
4464
+ { category: RESOURCE_REGOLITH, maxTier: 5 },
4465
+ ];
4466
+ }
4467
+ if (locationType === LocationType.ICE_FIELD) {
4468
+ return [
4469
+ { category: RESOURCE_GAS, maxTier: 5 },
4470
+ { category: RESOURCE_BIOMASS, maxTier: 5 },
4471
+ ];
4472
+ }
4473
+ if (locationType === LocationType.PLANET) {
4189
4474
  switch (subtype) {
4190
4475
  case PLANET_SUBTYPE_GAS_GIANT:
4191
- return GAS_GIANT_RESOURCES;
4476
+ return [
4477
+ { category: RESOURCE_GAS, maxTier: 10 },
4478
+ { category: RESOURCE_CRYSTAL, maxTier: 3 },
4479
+ ];
4192
4480
  case PLANET_SUBTYPE_ROCKY:
4193
- return ROCKY_RESOURCES;
4481
+ return [
4482
+ { category: RESOURCE_REGOLITH, maxTier: 10 },
4483
+ { category: RESOURCE_ORE, maxTier: 3 },
4484
+ ];
4194
4485
  case PLANET_SUBTYPE_TERRESTRIAL:
4195
- return TERRESTRIAL_RESOURCES;
4486
+ return [
4487
+ { category: RESOURCE_ORE, maxTier: 10 },
4488
+ { category: RESOURCE_BIOMASS, maxTier: 3 },
4489
+ ];
4196
4490
  case PLANET_SUBTYPE_ICY:
4197
- return ICY_RESOURCES;
4491
+ return [
4492
+ { category: RESOURCE_CRYSTAL, maxTier: 10 },
4493
+ { category: RESOURCE_REGOLITH, maxTier: 3 },
4494
+ ];
4198
4495
  case PLANET_SUBTYPE_OCEAN:
4199
- return OCEAN_RESOURCES;
4496
+ return [
4497
+ { category: RESOURCE_BIOMASS, maxTier: 10 },
4498
+ { category: RESOURCE_GAS, maxTier: 3 },
4499
+ ];
4200
4500
  case PLANET_SUBTYPE_INDUSTRIAL:
4201
- return INDUSTRIAL_RESOURCES;
4501
+ return [
4502
+ { category: RESOURCE_ORE, maxTier: 3 },
4503
+ { category: RESOURCE_CRYSTAL, maxTier: 3 },
4504
+ { category: RESOURCE_REGOLITH, maxTier: 3 },
4505
+ { category: RESOURCE_BIOMASS, maxTier: 3 },
4506
+ ];
4202
4507
  }
4203
4508
  }
4204
4509
  return [];
4205
4510
  }
4511
+ function getLocationCandidates(locationType, subtype) {
4512
+ const profile = getLocationProfile(locationType, subtype);
4513
+ const ids = [];
4514
+ for (const { category, maxTier } of profile) {
4515
+ for (let tier = 1; tier <= maxTier; tier++) {
4516
+ ids.push(resourceId(category, tier));
4517
+ }
4518
+ }
4519
+ return ids;
4520
+ }
4206
4521
  function getEligibleResources(locationType, subtype, stratum) {
4207
4522
  const candidates = getLocationCandidates(locationType, subtype);
4208
4523
  return candidates.filter((itemId) => {
@@ -6378,7 +6693,6 @@ var nebulaNouns = [
6378
6693
  ];
6379
6694
 
6380
6695
  const LOCATION_EXISTS_THRESHOLD = 0x10;
6381
- const LOCATION_ACTIVE_THRESHOLD = 0x80;
6382
6696
  function getLocationType(gameSeed, coordinates) {
6383
6697
  const seed = Checksum256.from(gameSeed);
6384
6698
  const str = ['system', coordinates.x, coordinates.y].join('-');
@@ -6386,13 +6700,13 @@ function getLocationType(gameSeed, coordinates) {
6386
6700
  if (hashResult.array[0] >= LOCATION_EXISTS_THRESHOLD) {
6387
6701
  return LocationType.EMPTY;
6388
6702
  }
6389
- if (hashResult.array[1] < 96) {
6703
+ if (hashResult.array[1] < 96)
6390
6704
  return LocationType.PLANET;
6391
- }
6392
- else if (hashResult.array[1] < 176) {
6705
+ if (hashResult.array[1] < 149)
6393
6706
  return LocationType.ASTEROID;
6394
- }
6395
- return LocationType.NEBULA;
6707
+ if (hashResult.array[1] < 202)
6708
+ return LocationType.NEBULA;
6709
+ return LocationType.ICE_FIELD;
6396
6710
  }
6397
6711
  function isGatherableLocation(locationType) {
6398
6712
  return locationType !== LocationType.EMPTY;
@@ -6407,6 +6721,8 @@ function getLocationTypeName(type) {
6407
6721
  return 'Asteroid';
6408
6722
  case LocationType.NEBULA:
6409
6723
  return 'Nebula';
6724
+ case LocationType.ICE_FIELD:
6725
+ return 'Ice Field';
6410
6726
  }
6411
6727
  }
6412
6728
  function uint16(hash, offset) {
@@ -6434,6 +6750,14 @@ function generateNebulaName(hashResult) {
6434
6750
  const nounIdx = uint16(hashResult, 2) % nebulaNouns.length;
6435
6751
  return `${nebulaAdjectives[adjIdx]} ${nebulaNouns[nounIdx]}`;
6436
6752
  }
6753
+ function generateIceFieldName(hashResult) {
6754
+ const A = 65;
6755
+ const letter1 = String.fromCharCode(A + (hashResult.array[0] % 26));
6756
+ const letter2 = String.fromCharCode(A + (hashResult.array[1] % 26));
6757
+ const subId = (hashResult.array[2] % 9) + 1;
6758
+ const num = (uint16(hashResult, 3) % 9000) + 1000;
6759
+ return `${letter1}${letter2}-${subId}/${num}`;
6760
+ }
6437
6761
  function getSystemName(gameSeed, location) {
6438
6762
  const seed = Checksum256.from(gameSeed);
6439
6763
  const locationType = getLocationType(seed, location);
@@ -6449,6 +6773,8 @@ function getSystemName(gameSeed, location) {
6449
6773
  return generateAsteroidName(hashResult);
6450
6774
  case LocationType.NEBULA:
6451
6775
  return generateNebulaName(hashResult);
6776
+ case LocationType.ICE_FIELD:
6777
+ return generateIceFieldName(hashResult);
6452
6778
  default:
6453
6779
  return generatePlanetName(hashResult);
6454
6780
  }
@@ -6474,33 +6800,27 @@ function deriveLocationStatic(gameSeed, coordinates) {
6474
6800
  if (hashResult.array[1] < 96) {
6475
6801
  loc.type = UInt8.from(LocationType.PLANET);
6476
6802
  }
6477
- else if (hashResult.array[1] < 176) {
6803
+ else if (hashResult.array[1] < 149) {
6478
6804
  loc.type = UInt8.from(LocationType.ASTEROID);
6479
6805
  }
6480
- else {
6806
+ else if (hashResult.array[1] < 202) {
6481
6807
  loc.type = UInt8.from(LocationType.NEBULA);
6482
6808
  }
6809
+ else {
6810
+ loc.type = UInt8.from(LocationType.ICE_FIELD);
6811
+ }
6483
6812
  loc.subtype = UInt8.from(Number(loc.type) === LocationType.PLANET ? hashResult.array[2] % 6 : hashResult.array[2]);
6484
6813
  loc.seed0 = UInt8.from(hashResult.array[3]);
6485
6814
  loc.seed1 = UInt8.from(hashResult.array[4]);
6486
6815
  return loc;
6487
6816
  }
6488
- function deriveLocationEpoch(epochSeed, coordinates) {
6489
- const seed = Checksum256.from(epochSeed);
6490
- const coords = Coordinates.from(coordinates);
6491
- const str = `system-epoch-${coords.x}-${coords.y}`;
6492
- const hashResult = hash512(seed, str);
6493
- return Types.location_epoch.from({
6494
- active: hashResult.array[0] < LOCATION_ACTIVE_THRESHOLD,
6495
- seed0: hashResult.array[1],
6496
- seed1: hashResult.array[2],
6497
- });
6817
+ function isLocationBuildable(gameSeed, coordinates) {
6818
+ return getLocationType(gameSeed, coordinates) === LocationType.PLANET;
6498
6819
  }
6499
- function deriveLocation(gameSeed, epochSeed, coordinates) {
6820
+ function deriveLocation(gameSeed, coordinates) {
6500
6821
  const staticProps = deriveLocationStatic(gameSeed, coordinates);
6501
6822
  return Types.location_derived.from({
6502
6823
  static_props: staticProps,
6503
- epoch_props: deriveLocationEpoch(epochSeed, coordinates),
6504
6824
  size: deriveLocationSize(staticProps),
6505
6825
  });
6506
6826
  }
@@ -6527,9 +6847,6 @@ class GameState extends Types.state_row {
6527
6847
  get isEnabled() {
6528
6848
  return this.enabled;
6529
6849
  }
6530
- get shipCount() {
6531
- return Number(this.ships);
6532
- }
6533
6850
  get currentSalt() {
6534
6851
  return this.salt;
6535
6852
  }
@@ -6570,7 +6887,6 @@ class GameState extends Types.state_row {
6570
6887
  return {
6571
6888
  enabled: this.enabled,
6572
6889
  epoch: this.epoch.toString(),
6573
- ships: this.shipCount,
6574
6890
  hasSeed: !this.seed.equals(Checksum256.from('0'.repeat(64))),
6575
6891
  hasCommit: !this.commit.equals(Checksum256.from('0'.repeat(64))),
6576
6892
  };
@@ -6622,6 +6938,40 @@ function lerp$1(origin, destination, time) {
6622
6938
  y: (1 - time) * Number(origin.y) + time * Number(destination.y),
6623
6939
  };
6624
6940
  }
6941
+ function easeFlightProgress(t) {
6942
+ if (t <= 0)
6943
+ return 0;
6944
+ if (t >= 1)
6945
+ return 1;
6946
+ return t < 0.5 ? 2 * t * t : 1 - 2 * (1 - t) * (1 - t);
6947
+ }
6948
+ function flightSpeedFactor(t) {
6949
+ if (t <= 0 || t >= 1)
6950
+ return 0;
6951
+ return t < 0.5 ? 4 * t : 4 * (1 - t);
6952
+ }
6953
+ function interpolateFlightPosition(origin, destination, taskProgress, options) {
6954
+ const t = options?.easing === 'linear' ? taskProgress : easeFlightProgress(taskProgress);
6955
+ return {
6956
+ x: (1 - t) * Number(origin.x) + t * Number(destination.x),
6957
+ y: (1 - t) * Number(origin.y) + t * Number(destination.y),
6958
+ };
6959
+ }
6960
+ function getInterpolatedPosition(entity, taskIndex, taskProgress) {
6961
+ if (!entity.schedule || entity.schedule.tasks.length === 0) {
6962
+ return { x: Number(entity.coordinates.x), y: Number(entity.coordinates.y) };
6963
+ }
6964
+ if (taskIndex < 0) {
6965
+ const settled = getFlightOrigin(entity, entity.schedule.tasks.length);
6966
+ return { x: Number(settled.x), y: Number(settled.y) };
6967
+ }
6968
+ const task = entity.schedule.tasks[taskIndex];
6969
+ if (!task.type.equals(TaskType.TRAVEL) || !task.coordinates) {
6970
+ const origin = getFlightOrigin(entity, taskIndex);
6971
+ return { x: Number(origin.x), y: Number(origin.y) };
6972
+ }
6973
+ return interpolateFlightPosition(getFlightOrigin(entity, taskIndex), task.coordinates, taskProgress);
6974
+ }
6625
6975
  function rotation(origin, destination) {
6626
6976
  return Math.atan2(destination.y - origin.y, destination.x - origin.x) * (180 / Math.PI) + 90;
6627
6977
  }
@@ -6831,9 +7181,12 @@ function getDestinationLocation(entity) {
6831
7181
  return undefined;
6832
7182
  }
6833
7183
  function getPositionAt(entity, taskIndex, taskProgress) {
6834
- if (!entity.schedule || entity.schedule.tasks.length === 0 || taskIndex < 0) {
7184
+ if (!entity.schedule || entity.schedule.tasks.length === 0) {
6835
7185
  return entity.coordinates;
6836
7186
  }
7187
+ if (taskIndex < 0) {
7188
+ return getFlightOrigin(entity, entity.schedule.tasks.length);
7189
+ }
6837
7190
  const task = entity.schedule.tasks[taskIndex];
6838
7191
  if (!task.type.equals(TaskType.TRAVEL) || !task.coordinates) {
6839
7192
  return getFlightOrigin(entity, taskIndex);
@@ -6886,7 +7239,8 @@ function calc_transfer_duration(source, dest, cargoMass) {
6886
7239
  ? source.location.z
6887
7240
  : (source.location.z?.toNumber() ?? 0);
6888
7241
  const destZ = typeof dest.location.z === 'number' ? dest.location.z : (dest.location.z?.toNumber() ?? 0);
6889
- const distance = Math.abs(sourceZ - destZ);
7242
+ const rawDistance = Math.abs(sourceZ - destZ);
7243
+ const distance = rawDistance < MIN_TRANSFER_DISTANCE ? MIN_TRANSFER_DISTANCE : rawDistance;
6890
7244
  const totalMass = cargoMass + totalLoaderMass;
6891
7245
  const acceleration = calc_acceleration(totalThrust, totalMass);
6892
7246
  const flightTime = 2 * Math.sqrt(distance / acceleration);
@@ -6965,7 +7319,7 @@ function cargoItemToStack(item) {
6965
7319
  return {
6966
7320
  item_id: UInt16.from(item.item_id),
6967
7321
  quantity: UInt32.from(item.quantity),
6968
- stats: item.stats,
7322
+ stats: UInt64.from(item.stats),
6969
7323
  modules: item.modules ?? [],
6970
7324
  };
6971
7325
  }
@@ -7062,7 +7416,7 @@ function currentTaskIndex(entity, now) {
7062
7416
  }
7063
7417
  timeAccum += taskDuration;
7064
7418
  }
7065
- return entity.schedule.tasks.length - 1;
7419
+ return -1;
7066
7420
  }
7067
7421
  function currentTask(entity, now) {
7068
7422
  const index = currentTaskIndex(entity, now);
@@ -7128,8 +7482,25 @@ function currentTaskProgress(entity, now) {
7128
7482
  return 1;
7129
7483
  return Math.min(1, elapsed / duration);
7130
7484
  }
7131
- function scheduleProgress(entity, now) {
7132
- const duration = scheduleDuration(entity);
7485
+ function currentTaskProgressFloat(entity, now) {
7486
+ if (!entity.schedule || entity.schedule.tasks.length === 0)
7487
+ return 0;
7488
+ const index = currentTaskIndex(entity, now);
7489
+ if (index < 0)
7490
+ return 0;
7491
+ const task = entity.schedule.tasks[index];
7492
+ const durationMs = task.duration.toNumber() * 1000;
7493
+ if (durationMs === 0)
7494
+ return 1;
7495
+ const startedMs = entity.schedule.started.toDate().getTime();
7496
+ const taskStartMs = startedMs + getTaskStartTime(entity, index) * 1000;
7497
+ const elapsedMs = now.getTime() - taskStartMs;
7498
+ if (elapsedMs <= 0)
7499
+ return 0;
7500
+ return Math.min(1, elapsedMs / durationMs);
7501
+ }
7502
+ function scheduleProgress(entity, now) {
7503
+ const duration = scheduleDuration(entity);
7133
7504
  if (duration === 0)
7134
7505
  return hasSchedule$1(entity) ? 1 : 0;
7135
7506
  const elapsed = scheduleElapsed(entity, now);
@@ -7172,6 +7543,7 @@ var schedule = /*#__PURE__*/Object.freeze({
7172
7543
  isTaskComplete: isTaskComplete,
7173
7544
  isTaskInProgress: isTaskInProgress,
7174
7545
  currentTaskProgress: currentTaskProgress,
7546
+ currentTaskProgressFloat: currentTaskProgressFloat,
7175
7547
  scheduleProgress: scheduleProgress,
7176
7548
  isTaskType: isTaskType,
7177
7549
  isInFlight: isInFlight,
@@ -7352,6 +7724,10 @@ function applyTask(projected, task) {
7352
7724
  case TaskType.DEPLOY:
7353
7725
  applyDeployTask(projected, task);
7354
7726
  break;
7727
+ case TaskType.UNDEPLOY:
7728
+ case TaskType.WRAP_ENTITY:
7729
+ case TaskType.DEMOLISH:
7730
+ break;
7355
7731
  }
7356
7732
  }
7357
7733
  function projectEntity(entity, options) {
@@ -7517,6 +7893,10 @@ function projectEntityAt(entity, now) {
7517
7893
  if (taskComplete)
7518
7894
  applyDeployTask(projected, task);
7519
7895
  break;
7896
+ case TaskType.UNDEPLOY:
7897
+ case TaskType.WRAP_ENTITY:
7898
+ case TaskType.DEMOLISH:
7899
+ break;
7520
7900
  }
7521
7901
  }
7522
7902
  return projected;
@@ -7620,6 +8000,9 @@ class ScheduleAccessor {
7620
8000
  currentTaskProgress(now) {
7621
8001
  return currentTaskProgress(this.entity, now);
7622
8002
  }
8003
+ currentTaskProgressFloat(now) {
8004
+ return currentTaskProgressFloat(this.entity, now);
8005
+ }
7623
8006
  progress(now) {
7624
8007
  return scheduleProgress(this.entity, now);
7625
8008
  }
@@ -7708,6 +8091,12 @@ class Ship extends Types.entity_info {
7708
8091
  get name() {
7709
8092
  return this.entity_name;
7710
8093
  }
8094
+ get entityClass() {
8095
+ return 'mobile';
8096
+ }
8097
+ get canUndeploy() {
8098
+ return true;
8099
+ }
7711
8100
  get inv() {
7712
8101
  this._inv ?? (this._inv = new InventoryAccessor(this));
7713
8102
  return this._inv;
@@ -7739,6 +8128,11 @@ class Ship extends Types.entity_info {
7739
8128
  const progress = this.sched.currentTaskProgress(now);
7740
8129
  return Coordinates.from(getPositionAt(this, taskIndex, progress));
7741
8130
  }
8131
+ interpolatedPositionAt(now) {
8132
+ const taskIndex = this.sched.currentTaskIndex(now);
8133
+ const progress = this.sched.currentTaskProgressFloat(now);
8134
+ return getInterpolatedPosition(this, taskIndex, progress);
8135
+ }
7742
8136
  isInFlight(now) {
7743
8137
  return isInFlight(this, now);
7744
8138
  }
@@ -7845,8 +8239,7 @@ const ORE_STATS = [
7845
8239
  key: 'density',
7846
8240
  label: 'Density',
7847
8241
  abbreviation: 'DEN',
7848
- purpose: 'Mass per unit',
7849
- inverted: true,
8242
+ purpose: 'Structural integrity — higher rolls produce lighter hulls',
7850
8243
  },
7851
8244
  ];
7852
8245
  const CRYSTAL_STATS = [
@@ -8387,6 +8780,8 @@ function getModuleCapabilityType(itemId) {
8387
8780
  return MODULE_STORAGE;
8388
8781
  case ITEM_HAULER_T1:
8389
8782
  return MODULE_HAULER;
8783
+ case ITEM_WARP_T1:
8784
+ return MODULE_WARP;
8390
8785
  default:
8391
8786
  return 0xff;
8392
8787
  }
@@ -8421,92 +8816,124 @@ function moduleSlotTypeToCode(slotType) {
8421
8816
  }
8422
8817
  }
8423
8818
 
8819
+ const U16_MAX = 65535;
8820
+ function clampUint16(value) {
8821
+ return Math.min(value, U16_MAX);
8822
+ }
8823
+ function applySlotMultiplier(value, outputPct) {
8824
+ return clampUint16(Math.floor((value * outputPct) / 100));
8825
+ }
8826
+ function getSlotAmp(layout, slotIndex) {
8827
+ return layout[slotIndex]?.outputPct ?? 100;
8828
+ }
8829
+
8424
8830
  function computeShipHullCapabilities(stats) {
8425
- const density = stats.density ?? 500;
8426
- const strength = stats.strength ?? 500;
8427
- const hardness = stats.hardness ?? 500;
8428
- const saturation = stats.saturation ?? 500;
8429
- const hullmass = 25000 + 75 * density;
8831
+ const density = stats.density;
8832
+ const strength = stats.strength;
8833
+ const hardness = stats.hardness;
8834
+ const saturation = stats.saturation;
8835
+ const hullmass = 100000 - 75 * density;
8430
8836
  const statSum = strength + hardness + saturation;
8431
8837
  const exponent = statSum / 2997.0;
8432
8838
  const capacity = Math.floor(1000000 * 10 ** exponent);
8433
8839
  return { hullmass, capacity };
8434
8840
  }
8435
8841
  function computeEngineCapabilities(stats) {
8436
- const vol = stats.volatility ?? 500;
8437
- const thm = stats.thermal ?? 500;
8842
+ const vol = stats.volatility;
8843
+ const thm = stats.thermal;
8438
8844
  return {
8439
8845
  thrust: 400 + Math.floor((vol * 3) / 4),
8440
8846
  drain: Math.max(30, 50 - Math.floor(thm / 70)),
8441
8847
  };
8442
8848
  }
8443
8849
  function computeGeneratorCapabilities(stats) {
8444
- const res = stats.resonance ?? 500;
8445
- const ref = stats.reflectivity ?? 500;
8850
+ const com = stats.composition;
8851
+ const fin = stats.fineness;
8446
8852
  return {
8447
- capacity: 300 + Math.floor(res / 6),
8448
- recharge: 1 + Math.floor((ref * 3) / 1000),
8449
- };
8450
- }
8451
- function computeGathererCapabilities(stats) {
8452
- const str = stats.strength ?? 500;
8453
- const con = stats.conductivity ?? 500;
8454
- const ref = stats.reflectivity ?? 500;
8455
- const tol = stats.tolerance ?? 500;
8853
+ capacity: 300 + Math.floor(com / 6),
8854
+ recharge: 1 + Math.floor((fin * 3) / 1000),
8855
+ };
8856
+ }
8857
+ const GATHERER_DEPTH_TABLE = [
8858
+ { floor: 500, slope: 5 },
8859
+ { floor: 2000, slope: 11 },
8860
+ { floor: 7000, slope: 16 },
8861
+ { floor: 15000, slope: 18 },
8862
+ { floor: 25000, slope: 19 },
8863
+ { floor: 35000, slope: 16 },
8864
+ { floor: 46000, slope: 12 },
8865
+ { floor: 53500, slope: 10 },
8866
+ { floor: 60000, slope: 5 },
8867
+ { floor: 63500, slope: 2 },
8868
+ ];
8869
+ const GATHERER_DEPTH_MAX_TIER = 10;
8870
+ function gathererDepthForTier(tol, tier) {
8871
+ if (tier < 1 || tier > GATHERER_DEPTH_MAX_TIER) {
8872
+ throw new Error(`gatherer tier out of range: ${tier}`);
8873
+ }
8874
+ const p = GATHERER_DEPTH_TABLE[tier - 1];
8875
+ return p.floor + tol * p.slope;
8876
+ }
8877
+ function computeGathererCapabilities(stats, tier) {
8878
+ const str = stats.strength;
8879
+ const con = stats.conductivity;
8880
+ const ref = stats.reflectivity;
8881
+ const tol = stats.tolerance;
8456
8882
  return {
8457
8883
  yield: 200 + str,
8458
8884
  drain: Math.max(250, 1250 - Math.floor((con * 25) / 20)),
8459
- depth: 200 + Math.floor((tol * 3) / 2),
8885
+ depth: gathererDepthForTier(tol, tier),
8460
8886
  speed: 100 + Math.floor((ref * 4) / 5),
8461
8887
  };
8462
8888
  }
8463
8889
  function computeLoaderCapabilities(stats) {
8464
- const hrd = stats.hardness ?? 500;
8465
- const pla = stats.plasticity ?? 500;
8890
+ const insulation = stats.insulation;
8891
+ const plasticity = stats.plasticity;
8466
8892
  return {
8467
- mass: Math.max(200, 2000 - Math.floor(hrd * 2)),
8468
- thrust: 1 + Math.floor(pla / 500),
8893
+ mass: Math.max(200, 2000 - Math.floor(insulation * 2)),
8894
+ thrust: 1 + Math.floor(plasticity / 500),
8469
8895
  quantity: 1,
8470
8896
  };
8471
8897
  }
8472
8898
  function computeCrafterCapabilities(stats) {
8473
- const rea = stats.reactivity ?? 500;
8474
- const com = stats.composition ?? 500;
8899
+ const rea = stats.reactivity;
8900
+ const fin = stats.fineness;
8475
8901
  return {
8476
8902
  speed: 100 + Math.floor((rea * 4) / 5),
8477
- drain: Math.max(5, 30 - Math.floor(com / 33)),
8903
+ drain: Math.max(5, 30 - Math.floor(fin / 33)),
8478
8904
  };
8479
8905
  }
8480
8906
  function computeHaulerCapabilities(stats) {
8481
- const res = stats.resonance ?? 500;
8482
- const con = stats.conductivity ?? 500;
8483
- const ref = stats.reflectivity ?? 500;
8907
+ const fineness = stats.fineness;
8908
+ const conductivity = stats.conductivity;
8909
+ const composition = stats.composition;
8484
8910
  return {
8485
- capacity: Math.max(1, 1 + Math.floor(res / 400)),
8486
- efficiency: 2000 + con * 6,
8487
- drain: Math.max(3, 15 - Math.floor(ref / 80)),
8911
+ capacity: Math.max(1, 1 + Math.floor(fineness / 400)),
8912
+ efficiency: 2000 + conductivity * 6,
8913
+ drain: Math.max(3, 15 - Math.floor(composition / 80)),
8488
8914
  };
8489
8915
  }
8490
8916
  function computeStorageCapabilities(stats, baseCapacity) {
8491
- const strength = stats.strength ?? 500;
8492
- const hardness = stats.hardness ?? 500;
8493
- const saturation = stats.saturation ?? 500;
8494
- const statSum = strength + hardness + saturation;
8917
+ const strength = stats.strength;
8918
+ const density = stats.density;
8919
+ const hardness = stats.hardness;
8920
+ const saturation = stats.saturation;
8921
+ const statSum = strength + density + hardness + saturation;
8495
8922
  const capacityBonus = Math.floor((baseCapacity * (10 + Math.floor((statSum * 10) / 2997))) / 100);
8496
8923
  return { capacityBonus };
8497
8924
  }
8498
8925
  function computeWarehouseHullCapabilities(stats) {
8499
- const density = stats.density ?? 500;
8500
- const strength = stats.strength ?? 500;
8501
- const hardness = stats.hardness ?? 500;
8502
- const saturation = stats.saturation ?? 500;
8503
- const hullmass = 25000 + 75 * density;
8926
+ const density = stats.density;
8927
+ const strength = stats.strength;
8928
+ const hardness = stats.hardness;
8929
+ const saturation = stats.saturation;
8930
+ const hullmass = 100000 - 75 * density;
8504
8931
  const statSum = strength + hardness + saturation;
8505
8932
  const exponent = statSum / 2997.0;
8506
8933
  const capacity = Math.floor(20000000 * 10 ** exponent);
8507
8934
  return { hullmass, capacity };
8508
8935
  }
8509
- function computeShipCapabilities(modules) {
8936
+ function computeShipCapabilities(modules, layout) {
8510
8937
  const ship = {};
8511
8938
  const engineModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_ENGINE);
8512
8939
  if (engineModules.length > 0) {
@@ -8514,7 +8941,7 @@ function computeShipCapabilities(modules) {
8514
8941
  let totalDrain = 0;
8515
8942
  for (const m of engineModules) {
8516
8943
  const caps = computeEngineCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8517
- totalThrust += caps.thrust;
8944
+ totalThrust += applySlotMultiplier(caps.thrust, getSlotAmp(layout, m.slotIndex));
8518
8945
  totalDrain += caps.drain;
8519
8946
  }
8520
8947
  ship.engines = { thrust: totalThrust, drain: totalDrain };
@@ -8525,25 +8952,37 @@ function computeShipCapabilities(modules) {
8525
8952
  let totalRecharge = 0;
8526
8953
  for (const m of generatorModules) {
8527
8954
  const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8528
- totalCapacity += caps.capacity;
8529
- totalRecharge += caps.recharge;
8955
+ const amp = getSlotAmp(layout, m.slotIndex);
8956
+ totalCapacity += applySlotMultiplier(caps.capacity, amp);
8957
+ totalRecharge += applySlotMultiplier(caps.recharge, amp);
8530
8958
  }
8531
- ship.generator = { capacity: totalCapacity, recharge: totalRecharge };
8959
+ ship.generator = {
8960
+ capacity: clampUint16(totalCapacity),
8961
+ recharge: clampUint16(totalRecharge),
8962
+ };
8532
8963
  }
8533
8964
  const gathererModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GATHERER);
8534
8965
  if (gathererModules.length > 0) {
8535
8966
  let totalYield = 0;
8536
8967
  let totalDrain = 0;
8537
- let totalDepth = 0;
8968
+ let maxDepth = 0;
8538
8969
  let totalSpeed = 0;
8539
8970
  for (const m of gathererModules) {
8540
- const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8541
- totalYield += caps.yield;
8971
+ const tier = getItem(m.itemId).tier;
8972
+ const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.stats), tier);
8973
+ const amp = getSlotAmp(layout, m.slotIndex);
8974
+ totalYield += applySlotMultiplier(caps.yield, amp);
8542
8975
  totalDrain += caps.drain;
8543
- totalDepth += caps.depth;
8544
- totalSpeed += caps.speed;
8976
+ if (caps.depth > maxDepth)
8977
+ maxDepth = caps.depth;
8978
+ totalSpeed += applySlotMultiplier(caps.speed, amp);
8545
8979
  }
8546
- ship.gatherer = { yield: totalYield, drain: totalDrain, depth: totalDepth, speed: totalSpeed };
8980
+ ship.gatherer = {
8981
+ yield: clampUint16(totalYield),
8982
+ drain: totalDrain,
8983
+ depth: maxDepth,
8984
+ speed: clampUint16(totalSpeed),
8985
+ };
8547
8986
  }
8548
8987
  const haulerModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_HAULER);
8549
8988
  if (haulerModules.length > 0) {
@@ -8552,13 +8991,15 @@ function computeShipCapabilities(modules) {
8552
8991
  let totalDrain = 0;
8553
8992
  for (const m of haulerModules) {
8554
8993
  const caps = computeHaulerCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8994
+ const eff = applySlotMultiplier(caps.efficiency, getSlotAmp(layout, m.slotIndex));
8555
8995
  totalCapacity += caps.capacity;
8556
- weightedEffNum += caps.efficiency * caps.capacity;
8996
+ weightedEffNum += eff * caps.capacity;
8557
8997
  totalDrain += caps.drain;
8558
8998
  }
8999
+ const efficiency = totalCapacity > 0 ? Math.floor(weightedEffNum / totalCapacity) : 0;
8559
9000
  ship.hauler = {
8560
9001
  capacity: totalCapacity,
8561
- efficiency: totalCapacity > 0 ? Math.floor(weightedEffNum / totalCapacity) : 0,
9002
+ efficiency: clampUint16(efficiency),
8562
9003
  drain: totalDrain,
8563
9004
  };
8564
9005
  }
@@ -8570,10 +9011,14 @@ function computeShipCapabilities(modules) {
8570
9011
  for (const m of loaderModules) {
8571
9012
  const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8572
9013
  totalMass += caps.mass;
8573
- totalThrust += caps.thrust;
9014
+ totalThrust += applySlotMultiplier(caps.thrust, getSlotAmp(layout, m.slotIndex));
8574
9015
  totalQuantity += caps.quantity;
8575
9016
  }
8576
- ship.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
9017
+ ship.loaders = {
9018
+ mass: totalMass,
9019
+ thrust: clampUint16(totalThrust),
9020
+ quantity: totalQuantity,
9021
+ };
8577
9022
  }
8578
9023
  const crafterModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_CRAFTER);
8579
9024
  if (crafterModules.length > 0) {
@@ -8581,10 +9026,10 @@ function computeShipCapabilities(modules) {
8581
9026
  let totalDrain = 0;
8582
9027
  for (const m of crafterModules) {
8583
9028
  const caps = computeCrafterCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8584
- totalSpeed += caps.speed;
9029
+ totalSpeed += applySlotMultiplier(caps.speed, getSlotAmp(layout, m.slotIndex));
8585
9030
  totalDrain += caps.drain;
8586
9031
  }
8587
- ship.crafter = { speed: totalSpeed, drain: totalDrain };
9032
+ ship.crafter = { speed: clampUint16(totalSpeed), drain: totalDrain };
8588
9033
  }
8589
9034
  return ship;
8590
9035
  }
@@ -8593,6 +9038,12 @@ class Warehouse extends Types.entity_info {
8593
9038
  get name() {
8594
9039
  return this.entity_name;
8595
9040
  }
9041
+ get entityClass() {
9042
+ return 'building';
9043
+ }
9044
+ get canDemolish() {
9045
+ return true;
9046
+ }
8596
9047
  get inv() {
8597
9048
  this._inv ?? (this._inv = new InventoryAccessor(this));
8598
9049
  return this._inv;
@@ -8643,7 +9094,7 @@ class Warehouse extends Types.entity_info {
8643
9094
  return hull.adding(this.totalCargoMass);
8644
9095
  }
8645
9096
  }
8646
- function computeWarehouseCapabilities(modules) {
9097
+ function computeWarehouseCapabilities(modules, layout) {
8647
9098
  const warehouse = {};
8648
9099
  const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
8649
9100
  if (loaderModules.length > 0) {
@@ -8653,10 +9104,14 @@ function computeWarehouseCapabilities(modules) {
8653
9104
  for (const m of loaderModules) {
8654
9105
  const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8655
9106
  totalMass += caps.mass;
8656
- totalThrust += caps.thrust;
9107
+ totalThrust += applySlotMultiplier(caps.thrust, getSlotAmp(layout, m.slotIndex));
8657
9108
  totalQuantity += caps.quantity;
8658
9109
  }
8659
- warehouse.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
9110
+ warehouse.loaders = {
9111
+ mass: totalMass,
9112
+ thrust: clampUint16(totalThrust),
9113
+ quantity: totalQuantity,
9114
+ };
8660
9115
  }
8661
9116
  return warehouse;
8662
9117
  }
@@ -8665,6 +9120,12 @@ class Container extends Types.entity_info {
8665
9120
  get name() {
8666
9121
  return this.entity_name;
8667
9122
  }
9123
+ get entityClass() {
9124
+ return 'mobile';
9125
+ }
9126
+ get canUndeploy() {
9127
+ return true;
9128
+ }
8668
9129
  get sched() {
8669
9130
  this._sched ?? (this._sched = new ScheduleAccessor(this));
8670
9131
  return this._sched;
@@ -8672,6 +9133,11 @@ class Container extends Types.entity_info {
8672
9133
  get isIdle() {
8673
9134
  return this.is_idle;
8674
9135
  }
9136
+ interpolatedPositionAt(now) {
9137
+ const taskIndex = this.sched.currentTaskIndex(now);
9138
+ const progress = this.sched.currentTaskProgressFloat(now);
9139
+ return getInterpolatedPosition(this, taskIndex, progress);
9140
+ }
8675
9141
  isLoading(now) {
8676
9142
  return isLoading(this, now);
8677
9143
  }
@@ -8702,32 +9168,119 @@ class Container extends Types.entity_info {
8702
9168
  }
8703
9169
  }
8704
9170
  function computeContainerCapabilities(stats) {
8705
- const density = stats['density'] ?? 500;
8706
- const strength = stats['strength'] ?? 500;
8707
- const hardness = stats['hardness'] ?? 500;
8708
- const saturation = stats['saturation'] ?? 500;
8709
- const hullmass = 25000 + 75 * density;
9171
+ const density = stats.density;
9172
+ const strength = stats.strength;
9173
+ const hardness = stats.hardness;
9174
+ const saturation = stats.saturation;
9175
+ const hullmass = 100000 - 75 * density;
8710
9176
  const statSum = strength + hardness + saturation;
8711
9177
  const exponent = statSum / 2997;
8712
9178
  const capacity = Math.floor(1000000 * 10 ** exponent);
8713
9179
  return { hullmass, capacity };
8714
9180
  }
8715
9181
  function computeContainerT2Capabilities(stats) {
8716
- const strength = stats['strength'] ?? 0;
8717
- const density = stats['density'] ?? 0;
8718
- const hardness = stats['hardness'] ?? 0;
8719
- const saturation = stats['saturation'] ?? 0;
8720
- const hullmass = 20000 + 50 * density;
9182
+ const strength = stats.strength;
9183
+ const density = stats.density;
9184
+ const hardness = stats.hardness;
9185
+ const saturation = stats.saturation;
9186
+ const hullmass = 70000 - 50 * density;
8721
9187
  const statSum = strength + hardness + saturation;
8722
9188
  const exponent = statSum / 2500;
8723
9189
  const capacity = Math.floor(1500000 * 10 ** exponent);
8724
9190
  return { hullmass, capacity };
8725
9191
  }
8726
9192
 
9193
+ class Extractor extends Types.entity_info {
9194
+ get name() {
9195
+ return this.entity_name;
9196
+ }
9197
+ get entityClass() {
9198
+ return 'building';
9199
+ }
9200
+ get canDemolish() {
9201
+ return true;
9202
+ }
9203
+ get inv() {
9204
+ this._inv ?? (this._inv = new InventoryAccessor(this));
9205
+ return this._inv;
9206
+ }
9207
+ get inventory() {
9208
+ return this.inv.items;
9209
+ }
9210
+ get sched() {
9211
+ this._sched ?? (this._sched = new ScheduleAccessor(this));
9212
+ return this._sched;
9213
+ }
9214
+ get isIdle() {
9215
+ return this.is_idle;
9216
+ }
9217
+ get location() {
9218
+ return Location.from(this.coordinates);
9219
+ }
9220
+ get totalCargoMass() {
9221
+ return this.inv.totalMass;
9222
+ }
9223
+ get maxCapacity() {
9224
+ return UInt64.from(this.capacity);
9225
+ }
9226
+ get availableCapacity() {
9227
+ const cargo = this.totalCargoMass;
9228
+ return cargo.gte(this.maxCapacity) ? UInt64.from(0) : this.maxCapacity.subtracting(cargo);
9229
+ }
9230
+ get isFull() {
9231
+ return this.totalCargoMass.gte(this.maxCapacity);
9232
+ }
9233
+ get totalMass() {
9234
+ const hull = this.hullmass ? UInt64.from(this.hullmass) : UInt64.from(0);
9235
+ return hull.adding(this.totalCargoMass);
9236
+ }
9237
+ }
9238
+ function computeExtractorCapabilities(modules, layout) {
9239
+ const out = {};
9240
+ const genModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GENERATOR);
9241
+ if (genModules.length > 0) {
9242
+ let totalCapacity = 0;
9243
+ let totalRecharge = 0;
9244
+ for (const m of genModules) {
9245
+ const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
9246
+ const amp = getSlotAmp(layout, m.slotIndex);
9247
+ totalCapacity += applySlotMultiplier(caps.capacity, amp);
9248
+ totalRecharge += applySlotMultiplier(caps.recharge, amp);
9249
+ }
9250
+ out.generator = {
9251
+ capacity: clampUint16(totalCapacity),
9252
+ recharge: clampUint16(totalRecharge),
9253
+ };
9254
+ }
9255
+ const gathModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GATHERER);
9256
+ if (gathModules.length > 0) {
9257
+ let totalYield = 0;
9258
+ let totalDrain = 0;
9259
+ let maxDepth = 0;
9260
+ let totalSpeed = 0;
9261
+ for (const m of gathModules) {
9262
+ const tier = getItem(m.itemId).tier;
9263
+ const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.stats), tier);
9264
+ const amp = getSlotAmp(layout, m.slotIndex);
9265
+ totalYield += applySlotMultiplier(caps.yield, amp);
9266
+ totalDrain += caps.drain;
9267
+ if (caps.depth > maxDepth)
9268
+ maxDepth = caps.depth;
9269
+ totalSpeed += applySlotMultiplier(caps.speed, amp);
9270
+ }
9271
+ out.gatherer = {
9272
+ yield: clampUint16(totalYield),
9273
+ drain: totalDrain,
9274
+ depth: maxDepth,
9275
+ speed: clampUint16(totalSpeed),
9276
+ };
9277
+ }
9278
+ return out;
9279
+ }
9280
+
8727
9281
  class EntitiesManager extends BaseManager {
8728
- async getEntity(type, id) {
9282
+ async getEntity(id) {
8729
9283
  const result = await this.server.readonly('getentity', {
8730
- entity_type: Name.from(type),
8731
9284
  entity_id: id,
8732
9285
  });
8733
9286
  const entityInfo = result;
@@ -8737,7 +9290,7 @@ class EntitiesManager extends BaseManager {
8737
9290
  const ownerName = this.resolveOwner(owner);
8738
9291
  const result = await this.server.readonly('getentities', {
8739
9292
  owner: ownerName,
8740
- entity_type: type ? Name.from(type) : null,
9293
+ entity_type: type,
8741
9294
  });
8742
9295
  const entities = result;
8743
9296
  return entities.map((entity) => this.wrapEntity(entity));
@@ -8746,18 +9299,21 @@ class EntitiesManager extends BaseManager {
8746
9299
  const ownerName = this.resolveOwner(owner);
8747
9300
  const result = await this.server.readonly('getsummaries', {
8748
9301
  owner: ownerName,
8749
- entity_type: type ? Name.from(type) : null,
9302
+ entity_type: type,
8750
9303
  });
8751
9304
  return result;
8752
9305
  }
8753
9306
  async getShip(id) {
8754
- return (await this.getEntity('ship', id));
9307
+ return (await this.getEntity(id));
8755
9308
  }
8756
9309
  async getWarehouse(id) {
8757
- return (await this.getEntity('warehouse', id));
9310
+ return (await this.getEntity(id));
8758
9311
  }
8759
9312
  async getContainer(id) {
8760
- return (await this.getEntity('container', id));
9313
+ return (await this.getEntity(id));
9314
+ }
9315
+ async getExtractor(id) {
9316
+ return (await this.getEntity(id));
8761
9317
  }
8762
9318
  async getShips(owner) {
8763
9319
  return (await this.getEntities(owner, 'ship'));
@@ -8768,6 +9324,9 @@ class EntitiesManager extends BaseManager {
8768
9324
  async getContainers(owner) {
8769
9325
  return (await this.getEntities(owner, 'container'));
8770
9326
  }
9327
+ async getExtractors(owner) {
9328
+ return (await this.getEntities(owner, 'extractor'));
9329
+ }
8771
9330
  async getShipSummaries(owner) {
8772
9331
  return this.getSummaries(owner, 'ship');
8773
9332
  }
@@ -8777,16 +9336,19 @@ class EntitiesManager extends BaseManager {
8777
9336
  async getContainerSummaries(owner) {
8778
9337
  return this.getSummaries(owner, 'container');
8779
9338
  }
9339
+ async getExtractorSummaries(owner) {
9340
+ return this.getSummaries(owner, 'extractor');
9341
+ }
8780
9342
  wrapEntity(entity) {
8781
- if (entity.type.equals('ship')) {
9343
+ if (entity.type.equals('ship'))
8782
9344
  return new Ship(entity);
8783
- }
8784
- else if (entity.type.equals('warehouse')) {
9345
+ if (entity.type.equals('warehouse'))
8785
9346
  return new Warehouse(entity);
8786
- }
8787
- else {
9347
+ if (entity.type.equals('extractor'))
9348
+ return new Extractor(entity);
9349
+ if (entity.type.equals('container'))
8788
9350
  return new Container(entity);
8789
- }
9351
+ throw new Error(`unknown entity type: ${entity.type}`);
8790
9352
  }
8791
9353
  resolveOwner(owner) {
8792
9354
  if (typeof owner === 'object' && owner !== null && 'owner' in owner) {
@@ -8870,17 +9432,6 @@ class LocationsManager extends BaseManager {
8870
9432
  reserve: overrideMap.get(s.index) ?? s.reserve,
8871
9433
  }));
8872
9434
  }
8873
- async getLocationEntity(id) {
8874
- const row = await this.server.table('location').get(UInt64.from(id));
8875
- return row ?? undefined;
8876
- }
8877
- async getLocationEntityAt(coords) {
8878
- const id = coordsToLocationId(coords);
8879
- return this.getLocationEntity(id);
8880
- }
8881
- async getAllLocationEntities() {
8882
- return this.server.table('location').all();
8883
- }
8884
9435
  }
8885
9436
 
8886
9437
  class EpochsManager extends BaseManager {
@@ -8927,7 +9478,6 @@ class ActionsManager extends BaseManager {
8927
9478
  const x = Int64.from(destination.x);
8928
9479
  const y = Int64.from(destination.y);
8929
9480
  return this.server.action('travel', {
8930
- entity_type: EntityType.SHIP,
8931
9481
  id: UInt64.from(shipId),
8932
9482
  x,
8933
9483
  y,
@@ -8948,9 +9498,8 @@ class ActionsManager extends BaseManager {
8948
9498
  recharge,
8949
9499
  });
8950
9500
  }
8951
- resolve(entityId, entityType = EntityType.SHIP, count) {
9501
+ resolve(entityId, count) {
8952
9502
  const params = {
8953
- entity_type: entityType,
8954
9503
  id: UInt64.from(entityId),
8955
9504
  };
8956
9505
  if (count !== undefined) {
@@ -8958,28 +9507,27 @@ class ActionsManager extends BaseManager {
8958
9507
  }
8959
9508
  return this.server.action('resolve', params);
8960
9509
  }
8961
- cancel(entityId, count, entityType = EntityType.SHIP) {
9510
+ cancel(entityId, count) {
8962
9511
  return this.server.action('cancel', {
8963
- entity_type: entityType,
8964
9512
  id: UInt64.from(entityId),
8965
9513
  count: UInt64.from(count),
8966
9514
  });
8967
9515
  }
8968
- recharge(entityId, entityType = EntityType.SHIP) {
9516
+ recharge(entityId) {
8969
9517
  return this.server.action('recharge', {
8970
- entity_type: entityType,
8971
9518
  id: UInt64.from(entityId),
8972
9519
  });
8973
9520
  }
8974
- transfer(sourceType, sourceId, destType, destId, itemId, stats, quantity) {
9521
+ refrshentity(entityId) {
9522
+ return this.server.action('refrshentity', {
9523
+ entity_id: UInt64.from(entityId),
9524
+ });
9525
+ }
9526
+ transfer(sourceId, destId, items) {
8975
9527
  return this.server.action('transfer', {
8976
- source_type: sourceType,
8977
9528
  source_id: UInt64.from(sourceId),
8978
- dest_type: destType,
8979
9529
  dest_id: UInt64.from(destId),
8980
- item_id: UInt16.from(itemId),
8981
- stats: UInt64.from(stats),
8982
- quantity: UInt32.from(quantity),
9530
+ items,
8983
9531
  });
8984
9532
  }
8985
9533
  foundCompany(account, name) {
@@ -8993,80 +9541,81 @@ class ActionsManager extends BaseManager {
8993
9541
  account: Name.from(account),
8994
9542
  });
8995
9543
  }
8996
- gather(source, destination, stratum, quantity) {
9544
+ gather(sourceId, destinationId, stratum, quantity) {
8997
9545
  return this.server.action('gather', {
8998
- source: Types.entity_ref.from({
8999
- entity_type: source.entityType,
9000
- entity_id: UInt64.from(source.entityId),
9001
- }),
9002
- destination: Types.entity_ref.from({
9003
- entity_type: destination.entityType,
9004
- entity_id: UInt64.from(destination.entityId),
9005
- }),
9546
+ source_id: UInt64.from(sourceId),
9547
+ destination_id: UInt64.from(destinationId),
9006
9548
  stratum: UInt16.from(stratum),
9007
9549
  quantity: UInt32.from(quantity),
9008
9550
  });
9009
9551
  }
9010
- warp(entityId, destination, entityType = EntityType.SHIP) {
9552
+ warp(entityId, destination) {
9011
9553
  const x = Int64.from(destination.x);
9012
9554
  const y = Int64.from(destination.y);
9013
9555
  return this.server.action('warp', {
9014
- entity_type: entityType,
9015
9556
  id: UInt64.from(entityId),
9016
9557
  x,
9017
9558
  y,
9018
9559
  });
9019
9560
  }
9020
- craft(entityType, entityId, recipeId, quantity, inputs) {
9021
- const cargoInputs = inputs.map((i) => Types.cargo_item.from(i));
9561
+ craft(entityId, recipeId, quantity, inputs) {
9022
9562
  return this.server.action('craft', {
9023
- entity_type: entityType,
9024
9563
  id: UInt64.from(entityId),
9025
9564
  recipe_id: UInt16.from(recipeId),
9026
9565
  quantity: UInt32.from(quantity),
9027
- inputs: cargoInputs,
9566
+ inputs,
9028
9567
  });
9029
9568
  }
9030
- blend(entityType, entityId, inputs) {
9031
- const cargoInputs = inputs.map((i) => Types.cargo_item.from(i));
9569
+ blend(entityId, inputs) {
9032
9570
  return this.server.action('blend', {
9033
- entity_type: entityType,
9034
9571
  id: UInt64.from(entityId),
9035
- inputs: cargoInputs,
9572
+ inputs,
9036
9573
  });
9037
9574
  }
9038
- deploy(entityType, entityId, packedItemId, stats) {
9575
+ deploy(entityId, ref) {
9039
9576
  return this.server.action('deploy', {
9040
- entity_type: entityType,
9041
9577
  id: UInt64.from(entityId),
9042
- packed_item_id: UInt16.from(packedItemId),
9043
- stats: UInt64.from(stats),
9578
+ ref,
9044
9579
  });
9045
9580
  }
9046
- addmodule(entityType, entityId, moduleIndex, moduleCargoId, targetCargoId = UInt64.from(0)) {
9581
+ addmodule(entityId, moduleIndex, moduleRef, targetRef = null) {
9047
9582
  return this.server.action('addmodule', {
9048
- entity_type: entityType,
9049
9583
  entity_id: UInt64.from(entityId),
9050
9584
  module_index: moduleIndex,
9051
- module_cargo_id: UInt64.from(moduleCargoId),
9052
- target_cargo_id: UInt64.from(targetCargoId),
9585
+ module_ref: moduleRef,
9586
+ target_ref: targetRef ?? undefined,
9053
9587
  });
9054
9588
  }
9055
- rmmodule(entityType, entityId, moduleIndex, targetCargoId = UInt64.from(0)) {
9589
+ rmmodule(entityId, moduleIndex, targetRef = null) {
9056
9590
  return this.server.action('rmmodule', {
9057
- entity_type: entityType,
9058
9591
  entity_id: UInt64.from(entityId),
9059
9592
  module_index: moduleIndex,
9060
- target_cargo_id: UInt64.from(targetCargoId),
9593
+ target_ref: targetRef ?? undefined,
9061
9594
  });
9062
9595
  }
9063
- wrap(owner, entityType, entityId, cargoId, quantity) {
9596
+ wrap(owner, entityId, nexusId, items) {
9064
9597
  return this.server.action('wrap', {
9065
9598
  owner: Name.from(owner),
9066
- entity_type: entityType,
9067
9599
  entity_id: UInt64.from(entityId),
9068
- cargo_id: UInt64.from(cargoId),
9069
- quantity: UInt64.from(quantity),
9600
+ nexus_id: UInt64.from(nexusId),
9601
+ items,
9602
+ });
9603
+ }
9604
+ undeploy(hostId, targetId) {
9605
+ return this.server.action('undeploy', {
9606
+ host_id: UInt64.from(hostId),
9607
+ target_id: UInt64.from(targetId),
9608
+ });
9609
+ }
9610
+ wrapEntity(entityId, nexusId) {
9611
+ return this.server.action('wrapentity', {
9612
+ entity_id: UInt64.from(entityId),
9613
+ nexus_id: UInt64.from(nexusId),
9614
+ });
9615
+ }
9616
+ demolish(entityId) {
9617
+ return this.server.action('demolish', {
9618
+ entity_id: UInt64.from(entityId),
9070
9619
  });
9071
9620
  }
9072
9621
  joinGame(account, companyName) {
@@ -9095,9 +9644,15 @@ class WebSocketConnection {
9095
9644
  this._state = 'disconnected';
9096
9645
  this.shouldReconnect = true;
9097
9646
  this.sendQueue = [];
9647
+ this.pingTimer = null;
9648
+ this.staleTimer = null;
9098
9649
  this.url = options.url;
9099
9650
  this.onMessage = options.onMessage;
9100
9651
  this.onStateChange = options.onStateChange;
9652
+ this.minReconnectDelay =
9653
+ options.minReconnectDelay ?? WebSocketConnection.DEFAULT_MIN_RECONNECT_DELAY;
9654
+ this.pingIntervalMs = options.pingIntervalMs ?? WebSocketConnection.DEFAULT_PING_INTERVAL_MS;
9655
+ this.pongTimeoutMs = options.pongTimeoutMs ?? WebSocketConnection.DEFAULT_PONG_TIMEOUT_MS;
9101
9656
  }
9102
9657
  get state() {
9103
9658
  return this._state;
@@ -9126,8 +9681,10 @@ class WebSocketConnection {
9126
9681
  this.ws.readyState === WebSocket.OPEN) {
9127
9682
  this.ws.send(this.sendQueue.shift());
9128
9683
  }
9684
+ this.startHeartbeat();
9129
9685
  };
9130
9686
  this.ws.onmessage = (event) => {
9687
+ this.resetStaleTimer();
9131
9688
  try {
9132
9689
  const message = JSON.parse(event.data);
9133
9690
  this.onMessage(message);
@@ -9137,6 +9694,7 @@ class WebSocketConnection {
9137
9694
  }
9138
9695
  };
9139
9696
  this.ws.onclose = () => {
9697
+ this.stopHeartbeat();
9140
9698
  this.ws = null;
9141
9699
  this.sendQueue.length = 0;
9142
9700
  if (this.shouldReconnect) {
@@ -9161,7 +9719,7 @@ class WebSocketConnection {
9161
9719
  if (this.reconnectTimeout) {
9162
9720
  return;
9163
9721
  }
9164
- const delay = Math.min(WebSocketConnection.MIN_RECONNECT_DELAY *
9722
+ const delay = Math.min(this.minReconnectDelay *
9165
9723
  WebSocketConnection.RECONNECT_MULTIPLIER ** this.reconnectAttempts, WebSocketConnection.MAX_RECONNECT_DELAY);
9166
9724
  debug(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts + 1})`);
9167
9725
  this.reconnectTimeout = setTimeout(() => {
@@ -9176,6 +9734,7 @@ class WebSocketConnection {
9176
9734
  clearTimeout(this.reconnectTimeout);
9177
9735
  this.reconnectTimeout = null;
9178
9736
  }
9737
+ this.stopHeartbeat();
9179
9738
  if (this.ws) {
9180
9739
  this.ws.close();
9181
9740
  this.ws = null;
@@ -9183,6 +9742,34 @@ class WebSocketConnection {
9183
9742
  this.sendQueue.length = 0;
9184
9743
  this.setState('disconnected');
9185
9744
  }
9745
+ startHeartbeat() {
9746
+ this.stopHeartbeat();
9747
+ this.resetStaleTimer();
9748
+ this.pingTimer = setInterval(() => {
9749
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
9750
+ this.ws.send(JSON.stringify({ type: 'ping' }));
9751
+ }
9752
+ }, this.pingIntervalMs);
9753
+ }
9754
+ stopHeartbeat() {
9755
+ if (this.pingTimer) {
9756
+ clearInterval(this.pingTimer);
9757
+ this.pingTimer = null;
9758
+ }
9759
+ if (this.staleTimer) {
9760
+ clearTimeout(this.staleTimer);
9761
+ this.staleTimer = null;
9762
+ }
9763
+ }
9764
+ resetStaleTimer() {
9765
+ if (this.staleTimer)
9766
+ clearTimeout(this.staleTimer);
9767
+ this.staleTimer = setTimeout(() => {
9768
+ debug('No frames within ping interval + pong timeout — forcing reconnect');
9769
+ if (this.ws)
9770
+ this.ws.close();
9771
+ }, this.pingIntervalMs + this.pongTimeoutMs);
9772
+ }
9186
9773
  close() {
9187
9774
  this.disconnect();
9188
9775
  }
@@ -9198,9 +9785,11 @@ class WebSocketConnection {
9198
9785
  return this._state === 'connected';
9199
9786
  }
9200
9787
  }
9201
- WebSocketConnection.MIN_RECONNECT_DELAY = 1000;
9788
+ WebSocketConnection.DEFAULT_MIN_RECONNECT_DELAY = 1000;
9202
9789
  WebSocketConnection.MAX_RECONNECT_DELAY = 30000;
9203
9790
  WebSocketConnection.RECONNECT_MULTIPLIER = 2;
9791
+ WebSocketConnection.DEFAULT_PING_INTERVAL_MS = 25000;
9792
+ WebSocketConnection.DEFAULT_PONG_TIMEOUT_MS = 10000;
9204
9793
 
9205
9794
  function mapEntity(ei) {
9206
9795
  if (ei.type.equals('ship'))
@@ -9229,9 +9818,14 @@ class SubscriptionsManager {
9229
9818
  this.entitySubs = new Map();
9230
9819
  this.boundsSubs = new Map();
9231
9820
  this.subCounter = 0;
9821
+ this.hasConnected = false;
9232
9822
  this.conn = new WebSocketConnection({
9233
9823
  url: opts.url,
9234
9824
  onMessage: (m) => this.onMessage(m),
9825
+ onStateChange: (s) => this.onStateChange(s),
9826
+ minReconnectDelay: opts.minReconnectDelay,
9827
+ pingIntervalMs: opts.pingIntervalMs,
9828
+ pongTimeoutMs: opts.pongTimeoutMs,
9235
9829
  });
9236
9830
  this.conn.connect();
9237
9831
  }
@@ -9288,6 +9882,9 @@ class SubscriptionsManager {
9288
9882
  current: new Map(),
9289
9883
  };
9290
9884
  this.boundsSubs.set(subId, {
9885
+ bounds,
9886
+ owner: handlers.owner,
9887
+ prioritizeOwner: handlers.prioritizeOwner,
9291
9888
  onSnapshot: handlers.onSnapshot,
9292
9889
  onUpdate: handlers.onUpdate,
9293
9890
  onBoundsDelta: handlers.onBoundsDelta,
@@ -9296,14 +9893,67 @@ class SubscriptionsManager {
9296
9893
  this.sendMessage(msg);
9297
9894
  return handle;
9298
9895
  }
9896
+ subscribeOwner(owner, handlers = {}) {
9897
+ const subId = this.generateSubID('own');
9898
+ const msg = {
9899
+ type: 'subscribe',
9900
+ sub_id: subId,
9901
+ owner,
9902
+ };
9903
+ const handle = {
9904
+ subId,
9905
+ unsubscribe: () => this.unsubscribeBounds(subId),
9906
+ current: new Map(),
9907
+ };
9908
+ this.boundsSubs.set(subId, {
9909
+ bounds: undefined,
9910
+ owner,
9911
+ prioritizeOwner: undefined,
9912
+ onSnapshot: handlers.onSnapshot,
9913
+ onUpdate: handlers.onUpdate,
9914
+ handle,
9915
+ });
9916
+ this.sendMessage(msg);
9917
+ return handle;
9918
+ }
9299
9919
  unsubscribeBounds(subId) {
9300
9920
  this.boundsSubs.delete(subId);
9301
9921
  this.sendMessage({ type: 'unsubscribe', sub_id: subId });
9302
9922
  }
9303
9923
  updateBounds(subId, bounds) {
9924
+ const entry = this.boundsSubs.get(subId);
9925
+ if (entry)
9926
+ entry.bounds = bounds;
9304
9927
  const msg = { type: 'update_bounds', sub_id: subId, bounds };
9305
9928
  this.sendMessage(msg);
9306
9929
  }
9930
+ onStateChange(state) {
9931
+ if (state !== 'connected')
9932
+ return;
9933
+ if (!this.hasConnected) {
9934
+ this.hasConnected = true;
9935
+ return;
9936
+ }
9937
+ for (const [subId, entry] of this.entitySubs) {
9938
+ const msg = {
9939
+ type: 'subscribe_entity',
9940
+ sub_id: subId,
9941
+ entity_type: entry.type,
9942
+ entity_id: entry.id,
9943
+ };
9944
+ this.sendMessage(msg);
9945
+ }
9946
+ for (const [subId, entry] of this.boundsSubs) {
9947
+ const msg = {
9948
+ type: 'subscribe',
9949
+ sub_id: subId,
9950
+ bounds: entry.bounds,
9951
+ owner: entry.owner,
9952
+ prioritize_owner: entry.prioritizeOwner,
9953
+ };
9954
+ this.sendMessage(msg);
9955
+ }
9956
+ }
9307
9957
  onMessage(msg) {
9308
9958
  switch (msg.type) {
9309
9959
  case 'snapshot':
@@ -9565,15 +10215,22 @@ function assignModulesToSlots(packedEntityItemId, modules, entityLabel) {
9565
10215
  installed: r.installed,
9566
10216
  }));
9567
10217
  }
9568
- function decodePackedInput(m) {
9569
- return {
9570
- itemId: Number(UInt16.from(m.itemId).value.toString()),
9571
- stats: BigInt(UInt64.from(m.stats).toString()),
9572
- };
10218
+ function toInstalledModules(entries) {
10219
+ const installed = [];
10220
+ entries.forEach((entry, slotIndex) => {
10221
+ if (!entry.installed)
10222
+ return;
10223
+ installed.push({
10224
+ slotIndex,
10225
+ itemId: Number(UInt16.from(entry.installed.item_id).value.toString()),
10226
+ stats: BigInt(UInt64.from(entry.installed.stats).toString()),
10227
+ });
10228
+ });
10229
+ return installed;
9573
10230
  }
9574
- function computeStorageBonus(decoded, baseCapacity) {
10231
+ function computeStorageBonus(modules, baseCapacity) {
9575
10232
  let totalBonus = 0;
9576
- for (const m of decoded) {
10233
+ for (const m of modules) {
9577
10234
  if (getModuleCapabilityType(m.itemId) !== MODULE_STORAGE)
9578
10235
  continue;
9579
10236
  const stats = decodeCraftedItemStats(m.itemId, m.stats);
@@ -9582,10 +10239,10 @@ function computeStorageBonus(decoded, baseCapacity) {
9582
10239
  }
9583
10240
  return totalBonus;
9584
10241
  }
9585
- function deriveShipFromModules(modules, baseCapacity) {
9586
- const decoded = modules.map(decodePackedInput);
9587
- const capabilities = computeShipCapabilities(decoded);
9588
- const totalBonus = computeStorageBonus(decoded, baseCapacity);
10242
+ function deriveShipFromModules(moduleEntries, layout, baseCapacity) {
10243
+ const installed = toInstalledModules(moduleEntries);
10244
+ const capabilities = computeShipCapabilities(installed, layout);
10245
+ const totalBonus = computeStorageBonus(installed, baseCapacity);
9589
10246
  return { capabilities, finalCapacity: baseCapacity + totalBonus };
9590
10247
  }
9591
10248
  function makeShip(state) {
@@ -9609,9 +10266,10 @@ function makeShip(state) {
9609
10266
  if (state.schedule)
9610
10267
  info.schedule = state.schedule;
9611
10268
  let moduleEntries = [];
10269
+ const shipLayout = getEntityLayout(ITEM_SHIP_T1_PACKED)?.slots ?? [];
9612
10270
  if (state.modules && state.modules.length > 0) {
9613
10271
  moduleEntries = assignModulesToSlots(ITEM_SHIP_T1_PACKED, state.modules, 'Ship T1');
9614
- const { capabilities, finalCapacity } = deriveShipFromModules(state.modules, state.capacity ?? 0);
10272
+ const { capabilities, finalCapacity } = deriveShipFromModules(moduleEntries, shipLayout, state.capacity ?? 0);
9615
10273
  if (capabilities.engines)
9616
10274
  info.engines = capabilities.engines;
9617
10275
  if (capabilities.generator)
@@ -9656,13 +10314,14 @@ function makeWarehouse(state) {
9656
10314
  if (state.schedule)
9657
10315
  info.schedule = state.schedule;
9658
10316
  let moduleEntries = [];
10317
+ const warehouseLayout = getEntityLayout(ITEM_WAREHOUSE_T1_PACKED)?.slots ?? [];
9659
10318
  if (state.modules && state.modules.length > 0) {
9660
10319
  moduleEntries = assignModulesToSlots(ITEM_WAREHOUSE_T1_PACKED, state.modules, 'Warehouse T1');
9661
- const decoded = state.modules.map(decodePackedInput);
9662
- const capabilities = computeWarehouseCapabilities(decoded);
10320
+ const installed = toInstalledModules(moduleEntries);
10321
+ const capabilities = computeWarehouseCapabilities(installed, warehouseLayout);
9663
10322
  if (capabilities.loaders)
9664
10323
  info.loaders = capabilities.loaders;
9665
- const totalBonus = computeStorageBonus(decoded, state.capacity);
10324
+ const totalBonus = computeStorageBonus(installed, state.capacity);
9666
10325
  info.capacity = UInt32.from(state.capacity + totalBonus);
9667
10326
  }
9668
10327
  else {
@@ -9672,6 +10331,42 @@ function makeWarehouse(state) {
9672
10331
  const entityInfo = Types.entity_info.from(info);
9673
10332
  return new Warehouse(entityInfo);
9674
10333
  }
10334
+ function makeExtractor(state) {
10335
+ const info = {
10336
+ type: Name.from('extractor'),
10337
+ id: UInt64.from(state.id),
10338
+ owner: Name.from(state.owner),
10339
+ entity_name: state.name,
10340
+ coordinates: Types.coordinates.from(state.coordinates),
10341
+ cargomass: UInt32.from(0),
10342
+ cargo: state.cargo || [],
10343
+ is_idle: !state.schedule,
10344
+ current_task_elapsed: UInt32.from(0),
10345
+ current_task_remaining: UInt32.from(0),
10346
+ pending_tasks: [],
10347
+ };
10348
+ if (state.hullmass !== undefined)
10349
+ info.hullmass = UInt32.from(state.hullmass);
10350
+ if (state.energy !== undefined)
10351
+ info.energy = UInt16.from(state.energy);
10352
+ if (state.schedule)
10353
+ info.schedule = state.schedule;
10354
+ if (state.capacity !== undefined)
10355
+ info.capacity = UInt32.from(state.capacity);
10356
+ const moduleEntries = assignModulesToSlots(ITEM_EXTRACTOR_T1_PACKED, state.modules ?? [], 'Extractor T1');
10357
+ if (state.modules && state.modules.length > 0) {
10358
+ const layout = getEntityLayout(ITEM_EXTRACTOR_T1_PACKED)?.slots ?? [];
10359
+ const installed = toInstalledModules(moduleEntries);
10360
+ const capabilities = computeExtractorCapabilities(installed, layout);
10361
+ if (capabilities.generator)
10362
+ info.generator = capabilities.generator;
10363
+ if (capabilities.gatherer)
10364
+ info.gatherer = capabilities.gatherer;
10365
+ }
10366
+ info.modules = moduleEntries;
10367
+ const entityInfo = Types.entity_info.from(info);
10368
+ return new Extractor(entityInfo);
10369
+ }
9675
10370
  function makeContainer(state) {
9676
10371
  const entityInfo = Types.entity_info.from({
9677
10372
  type: Name.from('container'),
@@ -9753,6 +10448,149 @@ var cargoUtils = /*#__PURE__*/Object.freeze({
9753
10448
  afterRemoveAllItems: afterRemoveAllItems
9754
10449
  });
9755
10450
 
10451
+ function cargoRef(src) {
10452
+ return {
10453
+ item_id: src.item_id,
10454
+ stats: src.stats,
10455
+ modules: src.modules ?? [],
10456
+ };
10457
+ }
10458
+ function cargoItem(src, quantity) {
10459
+ return {
10460
+ ...cargoRef(src),
10461
+ quantity,
10462
+ };
10463
+ }
10464
+
10465
+ function toChange(item, direction) {
10466
+ return {
10467
+ direction,
10468
+ item_id: Number(item.item_id),
10469
+ stats: BigInt(item.stats.toString()),
10470
+ modules: item.modules ?? [],
10471
+ quantity: Number(item.quantity),
10472
+ };
10473
+ }
10474
+ function taskCargoChanges(task) {
10475
+ const items = task.cargo ?? [];
10476
+ if (items.length === 0)
10477
+ return [];
10478
+ switch (Number(task.type)) {
10479
+ case TaskType.LOAD:
10480
+ case TaskType.UNWRAP:
10481
+ return items.map((i) => toChange(i, 'in'));
10482
+ case TaskType.GATHER:
10483
+ return task.entitytarget ? [] : items.map((i) => toChange(i, 'in'));
10484
+ case TaskType.UNLOAD:
10485
+ case TaskType.WRAP:
10486
+ return items.map((i) => toChange(i, 'out'));
10487
+ case TaskType.CRAFT:
10488
+ return [
10489
+ ...items.slice(0, -1).map((i) => toChange(i, 'out')),
10490
+ toChange(items[items.length - 1], 'in'),
10491
+ ];
10492
+ default:
10493
+ return [];
10494
+ }
10495
+ }
10496
+
10497
+ const ENTITY_SHIP = Name.from('ship');
10498
+ const ENTITY_WAREHOUSE = Name.from('warehouse');
10499
+ const ENTITY_EXTRACTOR = Name.from('extractor');
10500
+ const ENTITY_CONTAINER = Name.from('container');
10501
+ var EntityClass;
10502
+ (function (EntityClass) {
10503
+ EntityClass[EntityClass["OrbitalVessel"] = 0] = "OrbitalVessel";
10504
+ EntityClass[EntityClass["PlanetaryStructure"] = 1] = "PlanetaryStructure";
10505
+ })(EntityClass || (EntityClass = {}));
10506
+ function getEntityClass(entityType) {
10507
+ const typeName = typeof entityType === 'string' ? entityType : entityType.toString();
10508
+ switch (typeName) {
10509
+ case 'ship':
10510
+ case 'container':
10511
+ return EntityClass.OrbitalVessel;
10512
+ case 'warehouse':
10513
+ case 'extractor':
10514
+ return EntityClass.PlanetaryStructure;
10515
+ default:
10516
+ throw new Error(`Entity type has no class: ${typeName}`);
10517
+ }
10518
+ }
10519
+ function getPackedEntityType(itemId) {
10520
+ switch (itemId) {
10521
+ case ITEM_SHIP_T1_PACKED:
10522
+ return ENTITY_SHIP;
10523
+ case ITEM_CONTAINER_T1_PACKED:
10524
+ case ITEM_CONTAINER_T2_PACKED:
10525
+ return ENTITY_CONTAINER;
10526
+ case ITEM_WAREHOUSE_T1_PACKED:
10527
+ return ENTITY_WAREHOUSE;
10528
+ case ITEM_EXTRACTOR_T1_PACKED:
10529
+ return ENTITY_EXTRACTOR;
10530
+ default:
10531
+ return null;
10532
+ }
10533
+ }
10534
+ const shipTraits = {
10535
+ typeName: ENTITY_SHIP,
10536
+ isMovable: true,
10537
+ hasEnergy: true,
10538
+ hasLoaders: true,
10539
+ hasModules: true,
10540
+ notFoundError: 'ship not found',
10541
+ };
10542
+ const warehouseTraits = {
10543
+ typeName: ENTITY_WAREHOUSE,
10544
+ isMovable: false,
10545
+ hasEnergy: false,
10546
+ hasLoaders: true,
10547
+ hasModules: true,
10548
+ notFoundError: 'warehouse not found',
10549
+ };
10550
+ const extractorTraits = {
10551
+ typeName: ENTITY_EXTRACTOR,
10552
+ isMovable: false,
10553
+ hasEnergy: true,
10554
+ hasLoaders: false,
10555
+ hasModules: true,
10556
+ notFoundError: 'extractor not found',
10557
+ };
10558
+ const containerTraits = {
10559
+ typeName: ENTITY_CONTAINER,
10560
+ isMovable: true,
10561
+ hasEnergy: false,
10562
+ hasLoaders: false,
10563
+ hasModules: false,
10564
+ notFoundError: 'container not found',
10565
+ };
10566
+ function getEntityTraits(entityType) {
10567
+ const typeName = typeof entityType === 'string' ? entityType : entityType.toString();
10568
+ switch (typeName) {
10569
+ case 'ship':
10570
+ return shipTraits;
10571
+ case 'warehouse':
10572
+ return warehouseTraits;
10573
+ case 'extractor':
10574
+ return extractorTraits;
10575
+ case 'container':
10576
+ return containerTraits;
10577
+ default:
10578
+ throw new Error(`Unknown entity type: ${typeName}`);
10579
+ }
10580
+ }
10581
+ function isShip(entity) {
10582
+ return entity.type?.equals(ENTITY_SHIP) ?? false;
10583
+ }
10584
+ function isWarehouse(entity) {
10585
+ return entity.type?.equals(ENTITY_WAREHOUSE) ?? false;
10586
+ }
10587
+ function isExtractor(entity) {
10588
+ return entity.type?.equals(ENTITY_EXTRACTOR) ?? false;
10589
+ }
10590
+ function isContainer(entity) {
10591
+ return entity.type?.equals(ENTITY_CONTAINER) ?? false;
10592
+ }
10593
+
9756
10594
  function canMove(e) {
9757
10595
  return 'engines' in e && 'generator' in e && 'energy' in e;
9758
10596
  }
@@ -9825,34 +10663,96 @@ function computeHaulPenalty(totalThrust, haulCount, avgEfficiency) {
9825
10663
  HAULER_EFFICIENCY_DENOM);
9826
10664
  return Math.floor((totalThrust * 1000) / penaltyMilli);
9827
10665
  }
9828
- function computeHaulerDrain(distance, drain, haulCount) {
10666
+ function computeHaulerDrain$1(distance, drain, haulCount) {
9829
10667
  return Math.floor(distance / PRECISION) * drain * haulCount;
9830
10668
  }
9831
10669
 
9832
- const ITEM_TYPE_RESOURCE = 0;
9833
- const ITEM_TYPE_COMPONENT = 1;
9834
- const ITEM_TYPE_MODULE = 2;
9835
- const ITEM_TYPE_ENTITY = 3;
9836
- function itemTypeCode(id) {
9837
- switch (itemCategory(id)) {
9838
- case 'resource':
9839
- return ITEM_TYPE_RESOURCE;
9840
- case 'component':
9841
- return ITEM_TYPE_COMPONENT;
9842
- case 'module':
9843
- return ITEM_TYPE_MODULE;
9844
- case 'entity':
9845
- return ITEM_TYPE_ENTITY;
9846
- }
9847
- }
9848
- function itemTier(id) {
9849
- if (id < 10000)
9850
- return 0;
9851
- return Math.floor(id / 10000);
9852
- }
9853
- function itemOffset(id) {
9854
- return id % 10000;
9855
- }
10670
+ const categoryColors = {
10671
+ ore: '#C26D3F',
10672
+ crystal: '#4ADBFF',
10673
+ gas: '#B8E4A0',
10674
+ regolith: '#C4A57B',
10675
+ biomass: '#5A8B3E',
10676
+ };
10677
+ const tierColors = {
10678
+ 1: '#8b8b8b',
10679
+ 2: '#4ade80',
10680
+ 3: '#818cf8',
10681
+ 4: '#c084fc',
10682
+ 5: '#fbbf24',
10683
+ 6: '#f97316',
10684
+ 7: '#ef4444',
10685
+ 8: '#ec4899',
10686
+ 9: '#06b6d4',
10687
+ 10: '#ffffff',
10688
+ };
10689
+ const categoryIcons = {
10690
+ ore: '⬡',
10691
+ crystal: '◈',
10692
+ gas: '◎',
10693
+ regolith: '■',
10694
+ biomass: '❋',
10695
+ };
10696
+ const categoryIconShapes = {
10697
+ ore: 'hex',
10698
+ crystal: 'diamond',
10699
+ gas: 'circle',
10700
+ regolith: 'square',
10701
+ biomass: 'star',
10702
+ };
10703
+ const componentIcon = '▣';
10704
+ const moduleIcon = '⬢';
10705
+ const itemAbbreviations = {
10706
+ 10001: 'HP',
10707
+ 10002: 'CL',
10708
+ 10003: 'TC',
10709
+ 10004: 'PC',
10710
+ 10005: 'DS',
10711
+ 10006: 'EP',
10712
+ 10007: 'CA',
10713
+ 10008: 'TB',
10714
+ 10009: 'RC',
10715
+ 10010: 'FA',
10716
+ 10100: 'EN',
10717
+ 10101: 'GN',
10718
+ 10102: 'EX',
10719
+ 10103: 'LD',
10720
+ 10104: 'MF',
10721
+ 10105: 'ST',
10722
+ 10106: 'HL',
10723
+ 10107: 'WP',
10724
+ 10200: 'CT',
10725
+ 10201: 'SH',
10726
+ 10202: 'WH',
10727
+ 20001: 'HP',
10728
+ 20002: 'CL',
10729
+ 20200: 'CT',
10730
+ };
10731
+
10732
+ const ITEM_TYPE_RESOURCE = 0;
10733
+ const ITEM_TYPE_COMPONENT = 1;
10734
+ const ITEM_TYPE_MODULE = 2;
10735
+ const ITEM_TYPE_ENTITY = 3;
10736
+ function itemTypeCode(id) {
10737
+ switch (itemCategory(id)) {
10738
+ case 'resource':
10739
+ return ITEM_TYPE_RESOURCE;
10740
+ case 'component':
10741
+ return ITEM_TYPE_COMPONENT;
10742
+ case 'module':
10743
+ return ITEM_TYPE_MODULE;
10744
+ case 'entity':
10745
+ return ITEM_TYPE_ENTITY;
10746
+ }
10747
+ }
10748
+ function itemTier(id) {
10749
+ if (id < 10000)
10750
+ return 0;
10751
+ return Math.floor(id / 10000);
10752
+ }
10753
+ function itemOffset(id) {
10754
+ return id % 10000;
10755
+ }
9856
10756
  function itemCategory(id) {
9857
10757
  if (id < 10000)
9858
10758
  return 'resource';
@@ -9975,6 +10875,11 @@ const capabilityNames = [
9975
10875
  const capabilityAttributes = [
9976
10876
  { capability: 'Hull', attribute: 'mass', description: 'Total mass of the hull' },
9977
10877
  { capability: 'Storage', attribute: 'capacity', description: 'Maximum mass that can be stored' },
10878
+ {
10879
+ capability: 'Storage',
10880
+ attribute: 'bonus',
10881
+ description: 'Capacity bonus added by an installed Storage module',
10882
+ },
9978
10883
  { capability: 'Movement', attribute: 'thrust', description: 'Propulsion force' },
9979
10884
  { capability: 'Movement', attribute: 'drain', description: 'Energy consumed per movement' },
9980
10885
  { capability: 'Energy', attribute: 'capacity', description: 'Maximum energy storage' },
@@ -10012,338 +10917,151 @@ const capabilityAttributes = [
10012
10917
  description: 'Energy consumed per target during haul-beam operation',
10013
10918
  },
10014
10919
  ];
10015
- const statMappings = [
10016
- {
10017
- stat: 'Strength',
10018
- capability: 'Gathering',
10019
- attribute: 'yield',
10020
- rationale: 'Raw mechanical force drives faster gathering',
10021
- },
10022
- {
10023
- stat: 'Strength',
10024
- capability: 'Storage',
10025
- attribute: 'capacity',
10026
- rationale: 'Stronger walls hold more capacity per mass',
10027
- },
10028
- {
10029
- stat: 'Strength',
10030
- capability: 'Launch',
10031
- attribute: 'capacity',
10032
- rationale: 'Stronger housing handles larger launch loads',
10033
- },
10034
- {
10035
- stat: 'Tolerance',
10036
- capability: 'Movement',
10037
- attribute: 'thrust',
10038
- rationale: 'Engine components that tolerate more can push harder',
10039
- },
10040
- {
10041
- stat: 'Tolerance',
10042
- capability: 'Energy',
10043
- attribute: 'recharge',
10044
- rationale: 'Generator housing withstands stress for faster recharge',
10045
- },
10046
- {
10047
- stat: 'Tolerance',
10048
- capability: 'Gathering',
10049
- attribute: 'depth',
10050
- rationale: 'Housing withstands pressure/heat at extreme depths',
10051
- },
10052
- {
10053
- stat: 'Tolerance',
10054
- capability: 'Warp',
10055
- attribute: 'range',
10056
- rationale: 'Warp drive housing withstands extreme forces',
10057
- },
10058
- {
10059
- stat: 'Density',
10060
- capability: 'Hull',
10061
- attribute: 'mass',
10062
- rationale: 'Lighter metal = lighter hull',
10063
- },
10064
- {
10065
- stat: 'Density',
10066
- capability: 'Loader',
10067
- attribute: 'mass',
10068
- rationale: 'Lighter metal = lighter loader units',
10069
- },
10070
- {
10071
- stat: 'Density',
10072
- capability: 'Movement',
10073
- attribute: 'drain',
10074
- rationale: 'Lighter components require less energy to move',
10075
- },
10076
- {
10077
- stat: 'Conductivity',
10078
- capability: 'Movement',
10079
- attribute: 'drain',
10080
- rationale: 'Efficient energy transfer reduces movement energy cost',
10081
- },
10082
- {
10083
- stat: 'Conductivity',
10084
- capability: 'Gathering',
10085
- attribute: 'drain',
10086
- rationale: 'Efficient energy transfer reduces gathering energy cost',
10087
- },
10088
- {
10089
- stat: 'Conductivity',
10090
- capability: 'Crafter',
10091
- attribute: 'drain',
10092
- rationale: 'Efficient energy transfer reduces crafting energy cost',
10093
- },
10094
- {
10095
- stat: 'Conductivity',
10096
- capability: 'Energy',
10097
- attribute: 'recharge',
10098
- rationale: 'Better conductivity speeds energy flow during recharge',
10099
- },
10100
- {
10101
- stat: 'Ductility',
10102
- capability: 'Crafter',
10103
- attribute: 'quality',
10104
- rationale: 'Precise shaping enables tighter crafting tolerances',
10105
- },
10106
- {
10107
- stat: 'Ductility',
10108
- capability: 'Gathering',
10109
- attribute: 'yield',
10110
- rationale: 'Precisely shaped conduit components gather faster',
10111
- },
10112
- {
10113
- stat: 'Ductility',
10114
- capability: 'Storage',
10115
- attribute: 'capacity',
10116
- rationale: 'Precision-formed container walls maximize volume',
10117
- },
10118
- {
10119
- stat: 'Ductility',
10120
- capability: 'Loader',
10121
- attribute: 'mass',
10122
- rationale: 'Precision-formed precious metal reduces loader unit mass',
10123
- },
10124
- {
10125
- stat: 'Reflectivity',
10126
- capability: 'Gathering',
10127
- attribute: 'depth',
10128
- rationale: 'Reflective heat shielding protects equipment at depth',
10129
- },
10130
- {
10131
- stat: 'Reflectivity',
10132
- capability: 'Launch',
10133
- attribute: 'range',
10134
- rationale: 'Reflective surfaces focus electromagnetic launch energy',
10135
- },
10136
- {
10137
- stat: 'Volatility',
10138
- capability: 'Gathering',
10139
- attribute: 'yield',
10140
- rationale: 'Energy release powers faster gathering',
10141
- },
10142
- {
10143
- stat: 'Volatility',
10144
- capability: 'Movement',
10145
- attribute: 'thrust',
10146
- rationale: 'Energy release drives propulsion force',
10147
- },
10148
- {
10149
- stat: 'Volatility',
10150
- capability: 'Loader',
10151
- attribute: 'thrust',
10152
- rationale: 'Energy release powers loader motors',
10153
- },
10154
- {
10155
- stat: 'Volatility',
10156
- capability: 'Launch',
10157
- attribute: 'capacity',
10158
- rationale: 'Energy release enables launching heavier payloads',
10159
- },
10160
- {
10161
- stat: 'Reactivity',
10162
- capability: 'Crafter',
10163
- attribute: 'speed',
10164
- rationale: 'Reactive gases accelerate chemical/thermal processing',
10165
- },
10166
- {
10167
- stat: 'Reactivity',
10168
- capability: 'Gathering',
10169
- attribute: 'speed',
10170
- rationale: 'Reactive gases manage heat/friction during gathering',
10171
- },
10172
- {
10173
- stat: 'Reactivity',
10174
- capability: 'Launch',
10175
- attribute: 'drain',
10176
- rationale: 'Reactive gas medium reduces electromagnetic resistance',
10177
- },
10178
- {
10179
- stat: 'Thermal',
10180
- capability: 'Crafter',
10181
- attribute: 'quality',
10182
- rationale: 'Precise thermal control during fabrication',
10183
- },
10184
- {
10185
- stat: 'Thermal',
10186
- capability: 'Gathering',
10187
- attribute: 'drain',
10188
- rationale: 'Thermal management reduces energy waste during gathering',
10189
- },
10190
- {
10191
- stat: 'Thermal',
10192
- capability: 'Energy',
10193
- attribute: 'capacity',
10194
- rationale: 'Thermal management enables denser energy storage',
10195
- },
10196
- {
10197
- stat: 'Resonance',
10198
- capability: 'Energy',
10199
- attribute: 'capacity',
10200
- rationale: 'Resonating crystals store energy in fields',
10201
- },
10202
- {
10203
- stat: 'Resonance',
10204
- capability: 'Warp',
10205
- attribute: 'range',
10206
- rationale: 'Resonant crystals amplify warp field projection',
10207
- },
10208
- {
10209
- stat: 'Resonance',
10210
- capability: 'Launch',
10211
- attribute: 'range',
10212
- rationale: 'Resonant crystals focus electromagnetic launch field',
10213
- },
10214
- {
10215
- stat: 'Resonance',
10216
- capability: 'Launch',
10217
- attribute: 'capacity',
10218
- rationale: 'Stronger resonant field launches heavier payloads',
10219
- },
10220
- {
10221
- stat: 'Hardness',
10222
- capability: 'Crafter',
10223
- attribute: 'speed',
10224
- rationale: 'Hard tooling surfaces cut and shape materials faster',
10225
- },
10226
- {
10227
- stat: 'Hardness',
10228
- capability: 'Launch',
10229
- attribute: 'drain',
10230
- rationale: 'Hard rail surfaces reduce friction, less energy wasted',
10231
- },
10232
- {
10233
- stat: 'Clarity',
10234
- capability: 'Energy',
10235
- attribute: 'recharge',
10236
- rationale: 'Flawless crystals enable smoother energy flow during recharge',
10237
- },
10238
- {
10239
- stat: 'Clarity',
10240
- capability: 'Crafter',
10241
- attribute: 'quality',
10242
- rationale: 'Precision optics for calibration during fabrication',
10243
- },
10244
- {
10245
- stat: 'Clarity',
10246
- capability: 'Crafter',
10247
- attribute: 'drain',
10248
- rationale: 'Precision computing optimizes energy routing in factory',
10249
- },
10250
- {
10251
- stat: 'Plasticity',
10252
- capability: 'Crafter',
10253
- attribute: 'speed',
10254
- rationale: 'Easily reshaped materials speed up processing',
10255
- },
10256
- {
10257
- stat: 'Plasticity',
10258
- capability: 'Movement',
10259
- attribute: 'thrust',
10260
- rationale: 'Flexible polymer seals reduce friction in propulsion',
10261
- },
10262
- {
10263
- stat: 'Plasticity',
10264
- capability: 'Loader',
10265
- attribute: 'thrust',
10266
- rationale: 'Flexible joints improve loader force transfer',
10267
- },
10268
- {
10269
- stat: 'Insulation',
10270
- capability: 'Movement',
10271
- attribute: 'drain',
10272
- rationale: 'Better insulation reduces energy loss during movement',
10273
- },
10274
- {
10275
- stat: 'Insulation',
10276
- capability: 'Gathering',
10277
- attribute: 'drain',
10278
- rationale: 'Better insulation reduces energy loss during gathering',
10279
- },
10280
- {
10281
- stat: 'Insulation',
10282
- capability: 'Crafter',
10283
- attribute: 'drain',
10284
- rationale: 'Better insulation reduces energy loss during crafting',
10920
+ const invertedAttributes = new Set(['drain', 'mass']);
10921
+ function isInvertedAttribute(attribute) {
10922
+ return invertedAttributes.has(attribute);
10923
+ }
10924
+ function getCapabilityAttributes(capability) {
10925
+ if (capability) {
10926
+ return capabilityAttributes.filter((a) => a.capability === capability);
10927
+ }
10928
+ return capabilityAttributes;
10929
+ }
10930
+
10931
+ const ENTITY_HULL_SLOTS = {
10932
+ 0: { capability: 'Storage', attribute: 'capacity' },
10933
+ 1: { capability: 'Hull', attribute: 'mass' },
10934
+ 2: { capability: 'Storage', attribute: 'capacity' },
10935
+ 3: { capability: 'Storage', attribute: 'capacity' },
10936
+ };
10937
+ const SLOT_FORMULAS = {
10938
+ engine: {
10939
+ 0: { capability: 'Movement', attribute: 'thrust' },
10940
+ 1: { capability: 'Movement', attribute: 'drain' },
10285
10941
  },
10286
- {
10287
- stat: 'Insulation',
10288
- capability: 'Launch',
10289
- attribute: 'drain',
10290
- rationale: 'Better insulation reduces energy loss during launch',
10942
+ generator: {
10943
+ 0: { capability: 'Energy', attribute: 'capacity' },
10944
+ 1: { capability: 'Energy', attribute: 'recharge' },
10291
10945
  },
10292
- {
10293
- stat: 'Purity',
10294
- capability: 'Storage',
10295
- attribute: 'capacity',
10296
- rationale: 'Purer composites make better containers',
10946
+ gatherer: {
10947
+ 0: { capability: 'Gathering', attribute: 'yield' },
10948
+ 1: { capability: 'Gathering', attribute: 'depth' },
10949
+ 3: { capability: 'Gathering', attribute: 'drain' },
10950
+ 4: { capability: 'Gathering', attribute: 'speed' },
10297
10951
  },
10298
- {
10299
- stat: 'Purity',
10300
- capability: 'Gathering',
10301
- attribute: 'speed',
10302
- rationale: 'Purer bio-lubricants reduce friction during gathering',
10952
+ loader: {
10953
+ 0: { capability: 'Loader', attribute: 'mass' },
10954
+ 1: { capability: 'Loader', attribute: 'thrust' },
10303
10955
  },
10304
- {
10305
- stat: 'Purity',
10306
- capability: 'Energy',
10307
- attribute: 'capacity',
10308
- rationale: 'Purer organic electrolytes store more charge',
10956
+ crafter: {
10957
+ 0: { capability: 'Crafter', attribute: 'speed' },
10958
+ 1: { capability: 'Crafter', attribute: 'drain' },
10309
10959
  },
10310
- {
10311
- stat: 'Resonance',
10312
- capability: 'Hauler',
10313
- attribute: 'capacity',
10314
- rationale: 'Resonant field strength determines how many targets the haul beam can lock onto simultaneously.',
10960
+ storage: {
10961
+ 0: { capability: 'Storage', attribute: 'bonus' },
10962
+ 1: { capability: 'Storage', attribute: 'bonus' },
10963
+ 2: { capability: 'Storage', attribute: 'bonus' },
10964
+ 3: { capability: 'Storage', attribute: 'bonus' },
10315
10965
  },
10316
- {
10317
- stat: 'Conductivity',
10318
- capability: 'Hauler',
10319
- attribute: 'efficiency',
10320
- rationale: 'Energy-transfer efficiency reduces the thrust penalty from each hauled target.',
10966
+ hauler: {
10967
+ 0: { capability: 'Hauler', attribute: 'capacity' },
10968
+ 1: { capability: 'Hauler', attribute: 'efficiency' },
10969
+ 2: { capability: 'Hauler', attribute: 'drain' },
10321
10970
  },
10322
- {
10323
- stat: 'Clarity',
10324
- capability: 'Hauler',
10325
- attribute: 'drain',
10326
- rationale: 'Clarity-focused energy routing reduces per-target drain during haul-beam operation.',
10971
+ warp: {
10972
+ 0: { capability: 'Warp', attribute: 'range' },
10327
10973
  },
10328
- ];
10329
- const invertedAttributes = new Set(['drain', 'mass']);
10330
- function isInvertedAttribute(attribute) {
10331
- return invertedAttributes.has(attribute);
10974
+ 'ship-t1': ENTITY_HULL_SLOTS,
10975
+ 'container-t1': ENTITY_HULL_SLOTS,
10976
+ 'warehouse-t1': ENTITY_HULL_SLOTS,
10977
+ 'extractor-t1': ENTITY_HULL_SLOTS,
10978
+ 'container-t2': ENTITY_HULL_SLOTS,
10979
+ };
10980
+
10981
+ const KIND_TO_ITEM_ID = {
10982
+ engine: ITEM_ENGINE_T1,
10983
+ generator: ITEM_GENERATOR_T1,
10984
+ gatherer: ITEM_GATHERER_T1,
10985
+ loader: ITEM_LOADER_T1,
10986
+ crafter: ITEM_CRAFTER_T1,
10987
+ storage: ITEM_STORAGE_T1,
10988
+ hauler: ITEM_HAULER_T1,
10989
+ warp: ITEM_WARP_T1,
10990
+ 'ship-t1': ITEM_SHIP_T1_PACKED,
10991
+ 'container-t1': ITEM_CONTAINER_T1_PACKED,
10992
+ 'warehouse-t1': ITEM_WAREHOUSE_T1_PACKED,
10993
+ 'extractor-t1': ITEM_EXTRACTOR_T1_PACKED,
10994
+ 'container-t2': ITEM_CONTAINER_T2_PACKED,
10995
+ };
10996
+ function isCategoryInput(input) {
10997
+ return 'category' in input;
10332
10998
  }
10333
- function getCapabilityAttributes(capability) {
10334
- if (capability) {
10335
- return capabilityAttributes.filter((a) => a.capability === capability);
10999
+ function traceToRawCategoryStat(recipe, source, visited = new Set()) {
11000
+ const input = recipe.inputs[source.inputIndex];
11001
+ if (!input)
11002
+ return undefined;
11003
+ if (isCategoryInput(input)) {
11004
+ const defs = getStatDefinitions(input.category);
11005
+ return defs[source.statIndex];
10336
11006
  }
10337
- return capabilityAttributes;
11007
+ if (visited.has(input.itemId))
11008
+ return undefined;
11009
+ const subRecipe = getRecipe(input.itemId);
11010
+ if (!subRecipe)
11011
+ return undefined;
11012
+ const subSlot = subRecipe.statSlots[source.statIndex];
11013
+ if (!subSlot)
11014
+ return undefined;
11015
+ const subSource = subSlot.sources[0];
11016
+ if (!subSource)
11017
+ return undefined;
11018
+ const nextVisited = new Set(visited);
11019
+ nextVisited.add(input.itemId);
11020
+ return traceToRawCategoryStat(subRecipe, subSource, nextVisited);
11021
+ }
11022
+ let cached;
11023
+ function deriveStatMappings() {
11024
+ if (cached)
11025
+ return cached;
11026
+ const out = [];
11027
+ const seen = new Set();
11028
+ for (const [kind, slots] of Object.entries(SLOT_FORMULAS)) {
11029
+ const itemId = KIND_TO_ITEM_ID[kind];
11030
+ const recipe = getRecipe(itemId);
11031
+ if (!recipe)
11032
+ continue;
11033
+ for (const [slotIdxStr, consumer] of Object.entries(slots)) {
11034
+ const slotIdx = Number(slotIdxStr);
11035
+ const slot = recipe.statSlots[slotIdx];
11036
+ if (!slot)
11037
+ continue;
11038
+ for (const source of slot.sources) {
11039
+ const stat = traceToRawCategoryStat(recipe, source);
11040
+ if (!stat)
11041
+ continue;
11042
+ const key = `${stat.label}|${consumer.capability}|${consumer.attribute}`;
11043
+ if (seen.has(key))
11044
+ continue;
11045
+ seen.add(key);
11046
+ out.push({
11047
+ stat: stat.label,
11048
+ capability: consumer.capability,
11049
+ attribute: consumer.attribute,
11050
+ });
11051
+ }
11052
+ }
11053
+ }
11054
+ cached = out;
11055
+ return out;
10338
11056
  }
10339
11057
  function getStatMappings() {
10340
- return statMappings;
11058
+ return deriveStatMappings();
10341
11059
  }
10342
11060
  function getStatMappingsForStat(stat) {
10343
- return statMappings.filter((m) => m.stat === stat);
11061
+ return deriveStatMappings().filter((m) => m.stat === stat);
10344
11062
  }
10345
11063
  function getStatMappingsForCapability(capability) {
10346
- return statMappings.filter((m) => m.capability === capability);
11064
+ return deriveStatMappings().filter((m) => m.capability === capability);
10347
11065
  }
10348
11066
 
10349
11067
  function toNum(v) {
@@ -10415,7 +11133,7 @@ function resolveComponent(id, stats) {
10415
11133
  stats: resolvedStats,
10416
11134
  };
10417
11135
  }
10418
- function computeCapabilityGroup(moduleType, stats) {
11136
+ function computeCapabilityGroup(moduleType, stats, tier) {
10419
11137
  switch (moduleType) {
10420
11138
  case MODULE_ENGINE: {
10421
11139
  const caps = computeEngineCapabilities(stats);
@@ -10438,7 +11156,7 @@ function computeCapabilityGroup(moduleType, stats) {
10438
11156
  };
10439
11157
  }
10440
11158
  case MODULE_GATHERER: {
10441
- const caps = computeGathererCapabilities(stats);
11159
+ const caps = computeGathererCapabilities(stats, tier);
10442
11160
  return {
10443
11161
  capability: 'Gatherer',
10444
11162
  attributes: [
@@ -10482,10 +11200,11 @@ function computeCapabilityGroup(moduleType, stats) {
10482
11200
  };
10483
11201
  }
10484
11202
  case MODULE_STORAGE: {
10485
- const str = stats.strength ?? 500;
10486
- const hrd = stats.hardness ?? 500;
10487
- const sat = stats.saturation ?? 500;
10488
- const statSum = str + hrd + sat;
11203
+ const str = stats.strength;
11204
+ const den = stats.density;
11205
+ const hrd = stats.hardness;
11206
+ const sat = stats.saturation;
11207
+ const statSum = str + den + hrd + sat;
10489
11208
  const pct = 10 + Math.floor((statSum * 10) / 2997);
10490
11209
  return { capability: 'Storage', attributes: [{ label: 'Capacity Bonus', value: pct }] };
10491
11210
  }
@@ -10499,7 +11218,7 @@ function resolveModule(id, stats) {
10499
11218
  if (stats !== undefined) {
10500
11219
  const decoded = decodeCraftedItemStats(id, toBigStats(stats));
10501
11220
  const modType = getModuleCapabilityType(id);
10502
- const group = computeCapabilityGroup(modType, decoded);
11221
+ const group = computeCapabilityGroup(modType, decoded, item.tier);
10503
11222
  if (group)
10504
11223
  attributes = [group];
10505
11224
  }
@@ -10520,6 +11239,8 @@ function hullCapsForEntity(itemId, decoded) {
10520
11239
  return computeShipHullCapabilities(decoded);
10521
11240
  case ITEM_WAREHOUSE_T1_PACKED:
10522
11241
  return computeWarehouseHullCapabilities(decoded);
11242
+ case ITEM_EXTRACTOR_T1_PACKED:
11243
+ return computeShipHullCapabilities(decoded);
10523
11244
  case ITEM_CONTAINER_T1_PACKED:
10524
11245
  return computeContainerCapabilities(decoded);
10525
11246
  case ITEM_CONTAINER_T2_PACKED:
@@ -10555,14 +11276,17 @@ function resolveEntity(id, stats, modules) {
10555
11276
  const modStats = BigInt(mod.installed.stats.toString());
10556
11277
  const decodedStats = decodeCraftedItemStats(modItemId, modStats);
10557
11278
  const modType = getModuleCapabilityType(modItemId);
10558
- const group = computeCapabilityGroup(modType, decodedStats);
10559
11279
  let modName = 'Module';
11280
+ let modTier = 1;
10560
11281
  try {
10561
- modName = getItem(modItemId).name;
11282
+ const modItem = getItem(modItemId);
11283
+ modName = modItem.name;
11284
+ modTier = modItem.tier;
10562
11285
  }
10563
11286
  catch {
10564
11287
  modName = itemMetadata[modItemId]?.name ?? 'Module';
10565
11288
  }
11289
+ const group = computeCapabilityGroup(modType, decodedStats, modTier);
10566
11290
  return {
10567
11291
  name: modName,
10568
11292
  installed: true,
@@ -10778,7 +11502,7 @@ function idiv(a, b) {
10778
11502
  }
10779
11503
  function computeBaseHullmass(stats) {
10780
11504
  const density = decodeStat(stats, 1);
10781
- return 25000 + 75 * density;
11505
+ return 100000 - 75 * density;
10782
11506
  }
10783
11507
  function computeBaseCapacityShip(stats) {
10784
11508
  const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
@@ -10790,22 +11514,28 @@ function computeBaseCapacityWarehouse(stats) {
10790
11514
  }
10791
11515
  const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
10792
11516
  const computeEngineDrain = (thm) => Math.max(30, 50 - idiv(thm, 70));
10793
- const computeGeneratorCap = (res) => 300 + idiv(res, 6);
10794
- const computeGeneratorRech = (ref) => 1 + idiv(ref * 3, 1000);
11517
+ const computeGeneratorCap = (com) => 300 + idiv(com, 6);
11518
+ const computeGeneratorRech = (fin) => 1 + idiv(fin * 3, 1000);
10795
11519
  const computeGathererYield = (str) => 200 + str;
10796
11520
  const computeGathererDrain = (con) => Math.max(250, 1250 - idiv(con * 25, 20));
10797
- const computeGathererDepth = (tol) => 200 + idiv(tol * 3, 2);
11521
+ const computeGathererDepth = (tol, tier) => gathererDepthForTier(tol, tier);
10798
11522
  const computeGathererSpeed = (ref) => 100 + idiv(ref * 4, 5);
10799
- const computeLoaderMass = (fin) => Math.max(200, 2000 - fin * 2);
11523
+ const computeLoaderMass = (ins) => Math.max(200, 2000 - ins * 2);
10800
11524
  const computeLoaderThrust = (pla) => 1 + idiv(pla, 500);
10801
11525
  const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
10802
- const computeCrafterDrain = (com) => Math.max(5, 30 - idiv(com, 33));
11526
+ const computeCrafterDrain = (fin) => Math.max(5, 30 - idiv(fin, 33));
11527
+ const computeHaulerCapacity = (fin) => Math.max(1, 1 + idiv(fin, 400));
11528
+ const computeHaulerEfficiency = (con) => 2000 + con * 6;
11529
+ const computeHaulerDrain = (com) => Math.max(3, 15 - idiv(com, 80));
11530
+ const computeWarpRange = (stat) => 100 + stat * 3;
10803
11531
  function entityDisplayName(itemId) {
10804
11532
  switch (itemId) {
10805
11533
  case ITEM_SHIP_T1_PACKED:
10806
11534
  return 'Ship';
10807
11535
  case ITEM_WAREHOUSE_T1_PACKED:
10808
11536
  return 'Warehouse';
11537
+ case ITEM_EXTRACTOR_T1_PACKED:
11538
+ return 'Extractor';
10809
11539
  case ITEM_CONTAINER_T1_PACKED:
10810
11540
  return 'Container';
10811
11541
  case ITEM_CONTAINER_T2_PACKED:
@@ -10828,6 +11558,10 @@ function moduleDisplayName(itemId) {
10828
11558
  return 'Crafter';
10829
11559
  case ITEM_STORAGE_T1:
10830
11560
  return 'Storage';
11561
+ case ITEM_HAULER_T1:
11562
+ return 'Hauler';
11563
+ case ITEM_WARP_T1:
11564
+ return 'Warp';
10831
11565
  default:
10832
11566
  return 'Module';
10833
11567
  }
@@ -10858,7 +11592,8 @@ function formatModuleLine(slot, itemId, stats) {
10858
11592
  const tol = decodeStat(stats, 1);
10859
11593
  const con = decodeStat(stats, 3);
10860
11594
  const ref = decodeStat(stats, 4);
10861
- out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol)} Speed ${computeGathererSpeed(ref)} Drain ${computeGathererDrain(con)}`;
11595
+ const tier = getItem(itemId).tier;
11596
+ out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol, tier)} Speed ${computeGathererSpeed(ref)} Drain ${computeGathererDrain(con)}`;
10862
11597
  break;
10863
11598
  }
10864
11599
  case MODULE_LOADER: {
@@ -10882,6 +11617,18 @@ function formatModuleLine(slot, itemId, stats) {
10882
11617
  out += ` +${pct}% capacity`;
10883
11618
  break;
10884
11619
  }
11620
+ case MODULE_HAULER: {
11621
+ const fin = decodeStat(stats, 0);
11622
+ const con = decodeStat(stats, 1);
11623
+ const com = decodeStat(stats, 2);
11624
+ out += ` Capacity ${computeHaulerCapacity(fin)} Efficiency ${computeHaulerEfficiency(con)} Drain ${computeHaulerDrain(com)}`;
11625
+ break;
11626
+ }
11627
+ case MODULE_WARP: {
11628
+ const stat = decodeStat(stats, 0);
11629
+ out += ` Range ${computeWarpRange(stat)}`;
11630
+ break;
11631
+ }
10885
11632
  }
10886
11633
  return out;
10887
11634
  }
@@ -10894,6 +11641,9 @@ function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
10894
11641
  else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
10895
11642
  baseCapacity = computeBaseCapacityWarehouse(hullStats);
10896
11643
  }
11644
+ else if (itemId === ITEM_EXTRACTOR_T1_PACKED) {
11645
+ baseCapacity = computeBaseCapacityShip(hullStats);
11646
+ }
10897
11647
  let out = entityDisplayName(itemId);
10898
11648
  out += ` - Hull ${hullMass} mass`;
10899
11649
  if (baseCapacity > 0) {
@@ -10907,6 +11657,115 @@ function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
10907
11657
  return out;
10908
11658
  }
10909
11659
 
11660
+ function deserializeAtomicData(data, schema) {
11661
+ let rawData;
11662
+ if (data && typeof data === 'object' && 'immutable_serialized_data' in data) {
11663
+ rawData = data
11664
+ .immutable_serialized_data;
11665
+ }
11666
+ else {
11667
+ rawData = data;
11668
+ }
11669
+ let bytes;
11670
+ if (typeof rawData === 'string') {
11671
+ const hex = rawData;
11672
+ bytes = new Uint8Array(hex.length / 2);
11673
+ for (let i = 0; i < hex.length; i += 2) {
11674
+ bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
11675
+ }
11676
+ }
11677
+ else if (Array.isArray(rawData)) {
11678
+ bytes = new Uint8Array(rawData);
11679
+ }
11680
+ else {
11681
+ bytes = rawData;
11682
+ }
11683
+ let offset = 0;
11684
+ function readVarint() {
11685
+ let result = 0;
11686
+ let multiplier = 1;
11687
+ while (bytes[offset] >= 128) {
11688
+ result += (bytes[offset] - 128) * multiplier;
11689
+ offset++;
11690
+ multiplier *= 128;
11691
+ }
11692
+ result += bytes[offset] * multiplier;
11693
+ offset++;
11694
+ return result;
11695
+ }
11696
+ function readVarint64() {
11697
+ let result = 0n;
11698
+ let multiplier = 1n;
11699
+ while (bytes[offset] >= 128) {
11700
+ result += BigInt(bytes[offset] - 128) * multiplier;
11701
+ offset++;
11702
+ multiplier *= 128n;
11703
+ }
11704
+ result += BigInt(bytes[offset]) * multiplier;
11705
+ offset++;
11706
+ return result;
11707
+ }
11708
+ function readZigzagInt64() {
11709
+ const unsigned = readVarint64();
11710
+ if (unsigned % 2n === 0n) {
11711
+ return unsigned / 2n;
11712
+ }
11713
+ else {
11714
+ return -(unsigned / 2n) - 1n;
11715
+ }
11716
+ }
11717
+ function readString() {
11718
+ const length = readVarint();
11719
+ const str = new TextDecoder().decode(bytes.slice(offset, offset + length));
11720
+ offset += length;
11721
+ return str;
11722
+ }
11723
+ const RESERVED = 4;
11724
+ const result = {};
11725
+ while (offset < bytes.length) {
11726
+ const fieldIndex = readVarint() - RESERVED;
11727
+ const field = schema[fieldIndex];
11728
+ if (!field)
11729
+ break;
11730
+ switch (field.type) {
11731
+ case 'uint16':
11732
+ result[field.name] = readVarint();
11733
+ break;
11734
+ case 'uint32':
11735
+ result[field.name] = readVarint();
11736
+ break;
11737
+ case 'uint64':
11738
+ result[field.name] = readVarint64();
11739
+ break;
11740
+ case 'int64':
11741
+ result[field.name] = readZigzagInt64();
11742
+ break;
11743
+ case 'string':
11744
+ result[field.name] = readString();
11745
+ break;
11746
+ case 'uint16[]': {
11747
+ const len = readVarint();
11748
+ const arr = [];
11749
+ for (let i = 0; i < len; i++)
11750
+ arr.push(readVarint());
11751
+ result[field.name] = arr;
11752
+ break;
11753
+ }
11754
+ case 'uint64[]': {
11755
+ const len = readVarint();
11756
+ const arr = [];
11757
+ for (let i = 0; i < len; i++)
11758
+ arr.push(readVarint64());
11759
+ result[field.name] = arr;
11760
+ break;
11761
+ }
11762
+ default:
11763
+ throw new Error(`Unknown type: ${field.type}`);
11764
+ }
11765
+ }
11766
+ return result;
11767
+ }
11768
+
10910
11769
  var index = /*#__PURE__*/Object.freeze({
10911
11770
  __proto__: null,
10912
11771
  readCommonBase: readCommonBase,
@@ -10931,10 +11790,15 @@ var index = /*#__PURE__*/Object.freeze({
10931
11790
  computeLoaderThrust: computeLoaderThrust,
10932
11791
  computeCrafterSpeed: computeCrafterSpeed,
10933
11792
  computeCrafterDrain: computeCrafterDrain,
11793
+ computeHaulerCapacity: computeHaulerCapacity,
11794
+ computeHaulerEfficiency: computeHaulerEfficiency,
11795
+ computeHaulerDrain: computeHaulerDrain,
11796
+ computeWarpRange: computeWarpRange,
10934
11797
  entityDisplayName: entityDisplayName,
10935
11798
  moduleDisplayName: moduleDisplayName,
10936
11799
  formatModuleLine: formatModuleLine,
10937
- buildEntityDescription: buildEntityDescription
11800
+ buildEntityDescription: buildEntityDescription,
11801
+ deserializeAtomicData: deserializeAtomicData
10938
11802
  });
10939
11803
 
10940
11804
  function formatMass(kg) {
@@ -10971,5 +11835,5 @@ function describeItem(resolved, opts) {
10971
11835
  return `${tier} ${resolved.name} · ${mass}`;
10972
11836
  }
10973
11837
 
10974
- export { ActionsManager, BASE_ORBITAL_MASS, BLEND_INPUTS_MUST_MATCH, BLEND_REQUIRES_MULTIPLE, BLEND_STAT_LESS_NOT_SUPPORTED, CANCEL_CONTAINS_GROUPED_TASK, CANCEL_PAIRED_HAS_PENDING, CATEGORY_LABELS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, CONTAINER_CAPACITY_EXCEEDED, CONTAINER_NOT_FOUND, CONTAINER_Z, CRAFT_ENERGY_DIVISOR, CRAFT_EXCEEDS_ENERGY_CAPACITY, CRAFT_NOT_ENOUGH_ENERGY, Container, Coordinates, DEPLOY_ENTITY_HAS_SCHEDULE, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, DESTINATION_CAPACITY_EXCEEDED, ENTITY_CAPACITY_EXCEEDED, ENTITY_NO_CRAFTER, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, EntityInventory, EntityType, EpochsManager, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GATHER_EXCEEDS_ENERGY_CAPACITY, GATHER_NOT_ENOUGH_ENERGY, GROUP_DUPLICATE_ENTITY, GROUP_EMPTY, GROUP_ENTITY_NOT_MOVABLE, GROUP_HAUL_CAPACITY_EXCEEDED, GROUP_NOT_FOUND, GROUP_NOT_SAME_LOCATION, GROUP_NOT_SAME_OWNER, GROUP_NO_THRUST, GameState, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_BIOMASS_T1, ITEM_BIOMASS_T10, ITEM_BIOMASS_T2, ITEM_BIOMASS_T3, ITEM_BIOMASS_T4, ITEM_BIOMASS_T5, ITEM_BIOMASS_T6, ITEM_BIOMASS_T7, ITEM_BIOMASS_T8, ITEM_BIOMASS_T9, ITEM_CARGO_ARM, ITEM_CARGO_LINING, ITEM_CARGO_LINING_T2, ITEM_CONTAINER_T1_PACKED, ITEM_CONTAINER_T2_PACKED, ITEM_CRAFTER_T1, ITEM_CRYSTAL_T1, ITEM_CRYSTAL_T10, ITEM_CRYSTAL_T2, ITEM_CRYSTAL_T3, ITEM_CRYSTAL_T4, ITEM_CRYSTAL_T5, ITEM_CRYSTAL_T6, ITEM_CRYSTAL_T7, ITEM_CRYSTAL_T8, ITEM_CRYSTAL_T9, ITEM_DOES_NOT_EXIST, ITEM_ENGINE_T1, ITEM_FOCUSING_ARRAY, ITEM_GAS_T1, ITEM_GAS_T10, ITEM_GAS_T2, ITEM_GAS_T3, ITEM_GAS_T4, ITEM_GAS_T5, ITEM_GAS_T6, ITEM_GAS_T7, ITEM_GAS_T8, ITEM_GAS_T9, ITEM_GATHERER_T1, ITEM_GENERATOR_T1, ITEM_HAULER_T1, ITEM_HULL_PLATES, ITEM_HULL_PLATES_T2, ITEM_LOADER_T1, ITEM_MATTER_CONDUIT, ITEM_NOT_AVAILABLE_AT_LOCATION, ITEM_NOT_DEPLOYABLE, ITEM_NOT_PACKED_ENTITY, ITEM_ORE_T1, ITEM_ORE_T10, ITEM_ORE_T2, ITEM_ORE_T3, ITEM_ORE_T4, ITEM_ORE_T5, ITEM_ORE_T6, ITEM_ORE_T7, ITEM_ORE_T8, ITEM_ORE_T9, ITEM_POWER_CELL, ITEM_REACTION_CHAMBER, ITEM_REGOLITH_T1, ITEM_REGOLITH_T10, ITEM_REGOLITH_T2, ITEM_REGOLITH_T3, ITEM_REGOLITH_T4, ITEM_REGOLITH_T5, ITEM_REGOLITH_T6, ITEM_REGOLITH_T7, ITEM_REGOLITH_T8, ITEM_REGOLITH_T9, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_SURVEY_PROBE, ITEM_THRUSTER_CORE, ITEM_TOOL_BIT, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, InventoryAccessor, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MIN_ORBITAL_ALTITUDE, MODULE_ANY, MODULE_CARGO_NOT_FOUND, MODULE_CRAFTER, MODULE_ENGINE, MODULE_ENTITY_BUSY, MODULE_GATHERER, MODULE_GENERATOR, MODULE_HAULER, MODULE_LAUNCHER, MODULE_LOADER, MODULE_NOT_MODULE, MODULE_SLOT_EMPTY, MODULE_SLOT_INVALID, MODULE_SLOT_OCCUPIED, MODULE_STORAGE, MODULE_TYPE_MISMATCH, MODULE_WARP, index as NFT, NO_SCHEDULE, PLANET_SUBTYPE_GAS_GIANT, PLANET_SUBTYPE_ICY, PLANET_SUBTYPE_INDUSTRIAL, PLANET_SUBTYPE_OCEAN, PLANET_SUBTYPE_ROCKY, PLANET_SUBTYPE_TERRESTRIAL, PLAYER_ALREADY_JOINED, PLAYER_NOT_FOUND, PLAYER_NOT_JOINED, PRECISION$1 as PRECISION, platform as PlatformContract, Types$1 as PlatformTypes, Player, PlayersManager, RECIPE_INPUTS_EXCESS, RECIPE_INPUTS_INSUFFICIENT, RECIPE_INPUTS_INVALID, RECIPE_INPUTS_MIXED, RECIPE_NOT_FOUND, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, RESERVE_TIERS, RESOLVE_COUNT_EXCEEDS_COMPLETED, SHIP_ALREADY_THERE, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_CAPACITY_EXCEEDED, SHIP_CARGO_NOT_LOADED, SHIP_CARGO_NOT_OWNED, SHIP_INVALID_CARGO, SHIP_INVALID_DESTINATION, SHIP_INVALID_TRAVEL_DURATION, SHIP_NOT_ARRIVED, SHIP_NOT_ENOUGH_ENERGY, SHIP_NOT_ENOUGH_ENERGY_CAPACITY, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, STARTER_ALREADY_CLAIMED, ScheduleAccessor, server as ServerContract, Types as ServerTypes, Ship, Shipload, SubscriptionsManager, TIER_ADJECTIVES, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_CAPACITY_EXCEEDED, WAREHOUSE_NOT_FOUND, WAREHOUSE_Z, WARP_HAS_CARGO, WARP_HAS_SCHEDULE, WARP_NOT_FULL_ENERGY, WARP_NO_CAPABILITY, WARP_OUT_OF_RANGE, Warehouse, WebSocketConnection, availableCapacity$1 as availableCapacity, availableCapacityFromMass, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildEntityDescription, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcLoadDuration, calcStacksMass, calc_acceleration, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, calc_loader_acceleration, calc_loader_flighttime, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calculateFlightTime, calculateLoadTimeBreakdown, calculateRefuelingTime, calculateTransferTime, canMove, capabilityAttributes, capabilityNames, capsHasCrafter, capsHasGatherer, capsHasHauler, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItemToStack, cargoUtils, categoryColors, categoryFromIndex, categoryIconShapes, categoryIcons, categoryLabel, categoryLabelFromIndex, componentIcon, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass, computeComponentStats, computeContainerCapabilities, computeContainerT2Capabilities, computeCraftedOutputStats, computeCrafterCapabilities, computeCrafterDrain, computeCrafterSpeed, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityStats, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererSpeed, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeHaulPenalty, computeHaulerCapabilities, computeHaulerDrain, computeInputMass, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeShipCapabilities, computeShipHullCapabilities, computeStorageCapabilities, computeWarehouseCapabilities, computeWarehouseHullCapabilities, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeCraftedItemStats, decodeStat, decodeStats, Shipload as default, deriveLocation, deriveLocationEpoch, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStrata, deriveStratum, describeItem, describeModule, describeModuleForItem, describeModuleForSlot, deserializeAsset, deserializeComponent, deserializeEntity, deserializeModule, deserializeResource, displayName, distanceBetweenCoordinates, distanceBetweenPoints, encodeGatheredCargoStats, encodeStats, energyPercent, entityDisplayName, estimateDealTravelTime, estimateTravelTime, findItemByCategoryAndTier, findNearbyPlanets, formatMass, formatMassDelta, formatModuleLine, formatTier, getCapabilityAttributes, getCategoryInfo, getComponents, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEligibleResources, getEntityItems, getEntityLayout, getEpochInfo, getFlightOrigin, getItem, getItems, getLocationCandidates, getLocationType, getLocationTypeName, getModuleCapabilityType, getModules, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getRecipe, getResourceTier, getResourceWeight, getResources, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, hasEnergy, hasEnergyForDistance$1 as hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace$1 as hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, isCraftedItem, isFull$1 as isFull, isFullFromMass, isGatherableLocation, isInvertedAttribute, isModuleItem, isRelatedItem, isSubscriptionsDebugEnabled, itemAbbreviations, itemCategory, itemIds, itemOffset, itemTier, itemTypeCode, lerp$1 as lerp, makeContainer, makeShip, makeWarehouse, mapEntity, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleSlotTypeToCode, needsRecharge, parseWireEntity, projectEntity, projectEntityAt, projectFromCurrentState, projectFromCurrentStateAt, readCommonBase, removeFromStacks, renderDescription, resolveItem, resolveItemCategory, resolveStats, rollTier, rollWithinTier, rotation, schedule, setSubscriptionsDebug, stackKey, stackToCargoItem, stacksEqual, statMappings, tierColors, tierLabel, tierLabels, toLocation, typeLabel, validateSchedule };
11838
+ export { ActionsManager, BASE_ORBITAL_MASS, BLEND_INPUTS_MUST_MATCH, BLEND_REQUIRES_MULTIPLE, BLEND_STAT_LESS_NOT_SUPPORTED, CANCEL_CONTAINS_GROUPED_TASK, CANCEL_PAIRED_HAS_PENDING, CATEGORY_LABELS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, CONTAINER_CAPACITY_EXCEEDED, CONTAINER_NOT_FOUND, CONTAINER_Z, CRAFT_ENERGY_DIVISOR, CRAFT_EXCEEDS_ENERGY_CAPACITY, CRAFT_NOT_ENOUGH_ENERGY, Container, Coordinates, DEPLOY_ENTITY_HAS_SCHEDULE, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, DESTINATION_CAPACITY_EXCEEDED, ENTITY_CAPACITY_EXCEEDED, ENTITY_CONTAINER, ENTITY_EXTRACTOR, ENTITY_NO_CRAFTER, ENTITY_SHIP, ENTITY_WAREHOUSE, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, EntityClass, EntityInventory, EntityType, EpochsManager, Extractor, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GATHERER_DEPTH_MAX_TIER, GATHERER_DEPTH_TABLE, GATHER_EXCEEDS_ENERGY_CAPACITY, GATHER_NOT_ENOUGH_ENERGY, GROUP_DUPLICATE_ENTITY, GROUP_EMPTY, GROUP_ENTITY_NOT_MOVABLE, GROUP_HAUL_CAPACITY_EXCEEDED, GROUP_NOT_FOUND, GROUP_NOT_SAME_LOCATION, GROUP_NOT_SAME_OWNER, GROUP_NO_THRUST, GameState, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_BIOMASS_T1, ITEM_BIOMASS_T10, ITEM_BIOMASS_T2, ITEM_BIOMASS_T3, ITEM_BIOMASS_T4, ITEM_BIOMASS_T5, ITEM_BIOMASS_T6, ITEM_BIOMASS_T7, ITEM_BIOMASS_T8, ITEM_BIOMASS_T9, ITEM_CARGO_ARM, ITEM_CARGO_LINING, ITEM_CARGO_LINING_T2, ITEM_CONTAINER_T1_PACKED, ITEM_CONTAINER_T2_PACKED, ITEM_CRAFTER_T1, ITEM_CRYSTAL_T1, ITEM_CRYSTAL_T10, ITEM_CRYSTAL_T2, ITEM_CRYSTAL_T3, ITEM_CRYSTAL_T4, ITEM_CRYSTAL_T5, ITEM_CRYSTAL_T6, ITEM_CRYSTAL_T7, ITEM_CRYSTAL_T8, ITEM_CRYSTAL_T9, ITEM_DOES_NOT_EXIST, ITEM_ENGINE_T1, ITEM_EXTRACTOR_T1_PACKED, ITEM_FOCUSING_ARRAY, ITEM_GAS_T1, ITEM_GAS_T10, ITEM_GAS_T2, ITEM_GAS_T3, ITEM_GAS_T4, ITEM_GAS_T5, ITEM_GAS_T6, ITEM_GAS_T7, ITEM_GAS_T8, ITEM_GAS_T9, ITEM_GATHERER_T1, ITEM_GENERATOR_T1, ITEM_HAULER_T1, ITEM_HULL_PLATES, ITEM_HULL_PLATES_T2, ITEM_LOADER_T1, ITEM_MATTER_CONDUIT, ITEM_NOT_AVAILABLE_AT_LOCATION, ITEM_NOT_DEPLOYABLE, ITEM_NOT_PACKED_ENTITY, ITEM_ORE_T1, ITEM_ORE_T10, ITEM_ORE_T2, ITEM_ORE_T3, ITEM_ORE_T4, ITEM_ORE_T5, ITEM_ORE_T6, ITEM_ORE_T7, ITEM_ORE_T8, ITEM_ORE_T9, ITEM_POWER_CELL, ITEM_REACTION_CHAMBER, ITEM_REGOLITH_T1, ITEM_REGOLITH_T10, ITEM_REGOLITH_T2, ITEM_REGOLITH_T3, ITEM_REGOLITH_T4, ITEM_REGOLITH_T5, ITEM_REGOLITH_T6, ITEM_REGOLITH_T7, ITEM_REGOLITH_T8, ITEM_REGOLITH_T9, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_SURVEY_PROBE, ITEM_THRUSTER_CORE, ITEM_TOOL_BIT, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, ITEM_WARP_T1, InventoryAccessor, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MIN_ORBITAL_ALTITUDE, MIN_TRANSFER_DISTANCE, MODULE_ANY, MODULE_CARGO_NOT_FOUND, MODULE_CRAFTER, MODULE_ENGINE, MODULE_ENTITY_BUSY, MODULE_GATHERER, MODULE_GENERATOR, MODULE_HAULER, MODULE_LAUNCHER, MODULE_LOADER, MODULE_NOT_MODULE, MODULE_SLOT_EMPTY, MODULE_SLOT_INVALID, MODULE_SLOT_OCCUPIED, MODULE_STORAGE, MODULE_TYPE_MISMATCH, MODULE_WARP, index as NFT, NO_SCHEDULE, PLANETARY_STRUCTURE_Z, PLANET_SUBTYPE_GAS_GIANT, PLANET_SUBTYPE_ICY, PLANET_SUBTYPE_INDUSTRIAL, PLANET_SUBTYPE_OCEAN, PLANET_SUBTYPE_ROCKY, PLANET_SUBTYPE_TERRESTRIAL, PLAYER_ALREADY_JOINED, PLAYER_NOT_FOUND, PLAYER_NOT_JOINED, PRECISION$1 as PRECISION, platform as PlatformContract, Types$1 as PlatformTypes, Player, PlayersManager, RECIPE_INPUTS_EXCESS, RECIPE_INPUTS_INSUFFICIENT, RECIPE_INPUTS_INVALID, RECIPE_INPUTS_MIXED, RECIPE_NOT_FOUND, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, RESERVE_TIERS, RESOLVE_COUNT_EXCEEDS_COMPLETED, SHIP_ALREADY_THERE, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_CAPACITY_EXCEEDED, SHIP_CARGO_NOT_LOADED, SHIP_CARGO_NOT_OWNED, SHIP_INVALID_CARGO, SHIP_INVALID_DESTINATION, SHIP_INVALID_TRAVEL_DURATION, SHIP_NOT_ARRIVED, SHIP_NOT_ENOUGH_ENERGY, SHIP_NOT_ENOUGH_ENERGY_CAPACITY, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, SLOT_FORMULAS, STARTER_ALREADY_CLAIMED, ScheduleAccessor, server as ServerContract, Types as ServerTypes, Ship, Shipload, SubscriptionsManager, TIER_ADJECTIVES, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_CAPACITY_EXCEEDED, WAREHOUSE_NOT_FOUND, WARP_HAS_CARGO, WARP_HAS_SCHEDULE, WARP_NOT_FULL_ENERGY, WARP_NO_CAPABILITY, WARP_OUT_OF_RANGE, Warehouse, WebSocketConnection, availableCapacity$1 as availableCapacity, availableCapacityFromMass, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildEntityDescription, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcLoadDuration, calcStacksMass, calc_acceleration, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, calc_loader_acceleration, calc_loader_flighttime, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calculateFlightTime, calculateLoadTimeBreakdown, calculateRefuelingTime, calculateTransferTime, canMove, capabilityAttributes, capabilityNames, capsHasCrafter, capsHasGatherer, capsHasHauler, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItem, cargoItemToStack, cargoRef, cargoUtils, categoryColors, categoryFromIndex, categoryIconShapes, categoryIcons, categoryLabel, categoryLabelFromIndex, componentIcon, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass, computeComponentStats, computeContainerCapabilities, computeContainerT2Capabilities, computeCraftedOutputStats, computeCrafterCapabilities, computeCrafterDrain, computeCrafterSpeed, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityStats, computeExtractorCapabilities, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererSpeed, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeHaulPenalty, computeHaulerCapabilities, computeHaulerCapacity, computeHaulerDrain$1 as computeHaulerDrain, computeHaulerEfficiency, computeInputMass, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeShipCapabilities, computeShipHullCapabilities, computeStorageCapabilities, computeWarehouseCapabilities, computeWarehouseHullCapabilities, computeWarpRange, containerTraits, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeCraftedItemStats, decodeStat, decodeStats, Shipload as default, deriveLocation, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStatMappings, deriveStrata, deriveStratum, describeItem, describeModule, describeModuleForItem, describeModuleForSlot, deserializeAsset, deserializeAtomicData, deserializeComponent, deserializeEntity, deserializeModule, deserializeResource, displayName, distanceBetweenCoordinates, distanceBetweenPoints, easeFlightProgress, encodeGatheredCargoStats, encodeStats, energyPercent, entityDisplayName, estimateDealTravelTime, estimateTravelTime, extractorTraits, findItemByCategoryAndTier, findNearbyPlanets, flightSpeedFactor, formatMass, formatMassDelta, formatModuleLine, formatTier, gathererDepthForTier, getCapabilityAttributes, getCategoryInfo, getComponents, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEligibleResources, getEntityClass, getEntityItems, getEntityLayout, getEntityTraits, getEpochInfo, getFlightOrigin, getInterpolatedPosition, getItem, getItems, getLocationCandidates, getLocationProfile, getLocationType, getLocationTypeName, getModuleCapabilityType, getModules, getPackedEntityType, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getRecipe, getResourceTier, getResourceWeight, getResources, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, hasEnergy, hasEnergyForDistance$1 as hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace$1 as hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, interpolateFlightPosition, isContainer, isCraftedItem, isExtractor, isFull$1 as isFull, isFullFromMass, isGatherableLocation, isInvertedAttribute, isLocationBuildable, isModuleItem, isRelatedItem, isShip, isSubscriptionsDebugEnabled, isWarehouse, itemAbbreviations, itemCategory, itemIds, itemOffset, itemTier, itemTypeCode, lerp$1 as lerp, makeContainer, makeExtractor, makeShip, makeWarehouse, mapEntity, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleSlotTypeToCode, needsRecharge, parseWireEntity, projectEntity, projectEntityAt, projectFromCurrentState, projectFromCurrentStateAt, readCommonBase, removeFromStacks, renderDescription, resolveItem, resolveItemCategory, resolveStats, rollTier, rollWithinTier, rotation, schedule, setSubscriptionsDebug, shipTraits, stackKey, stackToCargoItem, stacksEqual, taskCargoChanges, tierAdjective, tierColors, toLocation, typeLabel, validateSchedule, warehouseTraits };
10975
11839
  //# sourceMappingURL=shipload.m.js.map