@shipload/sdk 1.0.0-next.34 → 1.0.0-next.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/shipload.d.ts +398 -51
- package/lib/shipload.js +1481 -400
- package/lib/shipload.js.map +1 -1
- package/lib/shipload.m.js +1442 -401
- package/lib/shipload.m.js.map +1 -1
- package/lib/testing.d.ts +101 -20
- package/lib/testing.js +201 -57
- package/lib/testing.js.map +1 -1
- package/lib/testing.m.js +201 -57
- package/lib/testing.m.js.map +1 -1
- package/package.json +1 -1
- package/src/capabilities/crafting.ts +2 -3
- package/src/capabilities/gathering.test.ts +16 -0
- package/src/capabilities/gathering.ts +8 -11
- package/src/contracts/server.ts +147 -29
- package/src/coordinates/address.ts +88 -0
- package/src/coordinates/constants.test.ts +15 -0
- package/src/coordinates/constants.ts +23 -0
- package/src/coordinates/index.ts +15 -0
- package/src/coordinates/memo.test.ts +47 -0
- package/src/coordinates/memo.ts +20 -0
- package/src/coordinates/permutation.ts +77 -0
- package/src/coordinates/regions.ts +48 -0
- package/src/coordinates/sectors.ts +115 -0
- package/src/data/capability-formulas.ts +0 -1
- package/src/data/entities.json +4 -4
- package/src/data/items.json +5 -5
- package/src/data/recipes.json +39 -65
- package/src/derivation/capabilities.test.ts +133 -0
- package/src/derivation/capabilities.ts +66 -14
- package/src/derivation/rollups.test.ts +55 -0
- package/src/derivation/rollups.ts +56 -0
- package/src/derivation/wormhole.ts +115 -0
- package/src/entities/makers.ts +30 -3
- package/src/errors.ts +2 -0
- package/src/index-module.ts +38 -2
- package/src/managers/actions.ts +79 -5
- package/src/managers/construction.ts +6 -4
- package/src/managers/context.ts +9 -0
- package/src/managers/coordinates.ts +14 -0
- package/src/managers/plot.ts +2 -4
- package/src/nft/description.ts +25 -6
- package/src/planner/index.ts +127 -0
- package/src/planner/planner.test.ts +319 -0
- package/src/resolution/resolve-item.ts +4 -1
- package/src/scheduling/availability.ts +1 -1
- package/src/scheduling/cancel.test.ts +348 -0
- package/src/scheduling/cancel.ts +209 -0
- package/src/scheduling/lanes.test.ts +249 -0
- package/src/scheduling/lanes.ts +140 -2
- package/src/scheduling/projection.ts +75 -16
- package/src/scheduling/schedule.ts +3 -1
- package/src/shipload.ts +5 -0
- package/src/testing/projection-parity.ts +26 -2
- package/src/travel/travel.ts +116 -105
- package/src/types/capabilities.ts +23 -6
- package/src/types/entity.ts +3 -3
- package/src/types.ts +2 -1
- package/src/utils/system.ts +11 -0
package/lib/shipload.m.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
|
-
import { Blob, ABI, Struct, Name, Asset, UInt64, Checksum256, UInt32, TimePointSec, ExtendedAsset, UInt16, UInt8, Int64, TimePoint, BlockTimestamp, Bytes, Int32, Checksum512, PermissionLevel, Action, APIClient, Serializer } from '@wharfkit/antelope';
|
|
2
|
+
import { Blob, ABI, Struct, Name, Asset, UInt64, Checksum256, UInt32, TimePointSec, ExtendedAsset, UInt16, UInt8, Int64, TimePoint, BlockTimestamp, Bytes, Int32, Checksum512, PermissionLevel, Action, Transaction, APIClient, Serializer } from '@wharfkit/antelope';
|
|
3
3
|
import ContractKit, { Contract as Contract$2 } from '@wharfkit/contract';
|
|
4
4
|
|
|
5
5
|
const abiBlob$1 = Blob.from('DmVvc2lvOjphYmkvMS4yAB0LYmFsYW5jZV9yb3cAAg50b2tlbl9jb250cmFjdARuYW1lB2JhbGFuY2UFYXNzZXQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BWNsb3NlAAMFb3duZXIEbmFtZQ50b2tlbl9jb250cmFjdARuYW1lDHRva2VuX3N5bWJvbAZzeW1ib2wLY29tcGFueV9yb3cAAgdhY2NvdW50BG5hbWUEbmFtZQZzdHJpbmcMZGViaXRkZXBvc2l0AAUFb3duZXIEbmFtZQV0b2tlbgRuYW1lBmxvY2tlZAVhc3NldAtmZWVfYWNjb3VudARuYW1lA2ZlZQVhc3NldA5kZXBvc2l0Y2ZnX3JvdwACDnRva2VuX2NvbnRyYWN0BG5hbWUMdG9rZW5fc3ltYm9sBnN5bWJvbAZlbmFibGUAAQdlbmFibGVkBGJvb2wKZW5hYmxlZ2FtZQACCGNvbnRyYWN0BG5hbWUHZW5hYmxlZARib29sDGZvdW5kY29tcGFueQACB2FjY291bnQEbmFtZQRuYW1lBnN0cmluZwtnYW1lX2NvbmZpZwAEBHNlZWQLY2hlY2tzdW0yNTYJZXBvY2h0aW1lBnVpbnQzMgVzdGFydA50aW1lX3BvaW50X3NlYwNlbmQOdGltZV9wb2ludF9zZWMJZ2FtZV9tZXRhAAQEbmFtZQZzdHJpbmcLZGVzY3JpcHRpb24Gc3RyaW5nA3VybAZzdHJpbmcHdmVyc2lvbgZzdHJpbmcIZ2FtZV9yb3cABAhjb250cmFjdARuYW1lBmNvbmZpZwtnYW1lX2NvbmZpZwRtZXRhCWdhbWVfbWV0YQVzdGF0ZQpnYW1lX3N0YXRlCmdhbWVfc3RhdGUAAQdlbmFibGVkBGJvb2wEb3BlbgADBW93bmVyBG5hbWUOdG9rZW5fY29udHJhY3QEbmFtZQx0b2tlbl9zeW1ib2wGc3ltYm9sDHJlbGdhdGVhc3NldAABCGFzc2V0X2lkBnVpbnQ2NAxyZWxnYXRlb3duZXIAAQVvd25lcgRuYW1lDHNldGVwb2NodGltZQACCGNvbnRyYWN0BG5hbWUJZXBvY2h0aW1lBnVpbnQzMghzZXR0b2tlbgACDnRva2VuX2NvbnRyYWN0BG5hbWUMdG9rZW5fc3ltYm9sBnN5bWJvbAlzdGFydGdhbWUABAhjb250cmFjdARuYW1lBmNvbmZpZwtnYW1lX2NvbmZpZwRtZXRhCWdhbWVfbWV0YQVzdGF0ZQpnYW1lX3N0YXRlCXN0YXRlX3JvdwABB2VuYWJsZWQEYm9vbAt1bndyYXBjYXJnbwADBGdhbWUEbmFtZQVvd25lcgRuYW1lCGFzc2V0X2lkBnVpbnQ2NA51bndyYXBjdXN0X3JvdwACCGFzc2V0X2lkBnVpbnQ2NAVvd25lcgRuYW1lDHVud3JhcGVudGl0eQADBGdhbWUEbmFtZQVvd25lcgRuYW1lCGFzc2V0X2lkBnVpbnQ2NAp1cGRhdGVnYW1lAAIIY29udHJhY3QEbmFtZQRtZXRhCWdhbWVfbWV0YQR3aXBlAAAId2l0aGRyYXcAAwVvd25lcgRuYW1lCHF1YW50aXR5DmV4dGVuZGVkX2Fzc2V0BG1lbW8Gc3RyaW5nCXdyYXBjYXJnbwAGBGdhbWUEbmFtZQVvd25lcgRuYW1lCWVudGl0eV9pZAZ1aW50NjQIbmV4dXNfaWQGdWludDY0CGNhcmdvX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQKd3JhcGVudGl0eQAEBGdhbWUEbmFtZQVvd25lcgRuYW1lCWVudGl0eV9pZAZ1aW50NjQIbmV4dXNfaWQGdWludDY0DHdyYXBnYXRlX3JvdwADBW93bmVyBG5hbWUEZ2FtZQRuYW1lDWxhc3RfYXNzZXRfaWQGdWludDY0EwCAisfka1RECmNsZWFydGFibGW+AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGVhcnRhYmxlCnN1bW1hcnk6ICdERUJVRzogY2xlYXJ0YWJsZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAAAAAIVpRAVjbG9zZeICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsb3NlCnN1bW1hcnk6ICdDbG9zZSBhIGRlcG9zaXQgYmFsYW5jZSByb3cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpDbG9zZSB0aGUgb3duZXIncyBkZXBvc2l0IGJhbGFuY2Ugcm93IGZvciB0aGUgZ2l2ZW4gdG9rZW4gYW5kIGZyZWUgaXRzIFJBTS4gVGhlIGJhbGFuY2UgbXVzdCBiZSB6ZXJvIGJlZm9yZSBjbG9zaW5nLiBSZXF1aXJlcyB0aGUgb3duZXIncyBhdXRob3JpdHkukB2mVaXsjkoMZGViaXRkZXBvc2l0nQQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGViaXRkZXBvc2l0CnN1bW1hcnk6ICdEZWJpdCBhIGRlcG9zaXQgYmFsYW5jZSBmb3IgYSB3cmFwIG9wZXJhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1ODExMzc4MiNkM2JmMjkwZmRkZWRkYmI3ZDMyYWE4OTdlOWY3ZTllMTNhMmFlNDQ5NTYxNDJlMjNlYjQ3Yjc3MDk2YTJlYThkCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IGEgcmVnaXN0ZXJlZCwgZW5hYmxlZCBnYW1lIGNvbnRyYWN0IG9ubHkuIERlYml0cyB0aGUgb3duZXIncyBkZXBvc2l0IGJhbGFuY2UgYnkgdGhlIGxvY2tlZCBhbW91bnQgcGx1cyB0aGUgZmVlLCBhbmQgY3JlZGl0cyB0aGUgZmVlIHRvIHRoZSBjb25maWd1cmVkIGZlZSBhY2NvdW50LiBVc2VkIGJ5IGEgZ2FtZSdzIHdyYXAgZmxvdyB0byBjb2xsZWN0IHRoZSB3cmFwIGNvc3QuIENhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgcGxheWVycyBvciB1bnJlZ2lzdGVyZWQgYWNjb3VudHMuAAAAAKh4zFQGZW5hYmxl8wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZW5hYmxlCnN1bW1hcnk6ICdFbmFibGUvZGlzYWJsZSBwbGF0Zm9ybScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1ODExMzc4MiNkM2JmMjkwZmRkZWRkYmI3ZDMyYWE4OTdlOWY3ZTllMTNhMmFlNDQ5NTYxNDJlMjNlYjQ3Yjc3MDk2YTJlYThkCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoZSBwbGF0Zm9ybSBjb250cmFjdC4AgJKGqXjMVAplbmFibGVnYW1l/AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZW5hYmxlZ2FtZQpzdW1tYXJ5OiAnRW5hYmxlL2Rpc2JhYmxlIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1ODExMzc4MiNkM2JmMjkwZmRkZWRkYmI3ZDMyYWE4OTdlOWY3ZTllMTNhMmFlNDQ5NTYxNDJlMjNlYjQ3Yjc3MDk2YTJlYThkCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVjaWZpZWQgZ2FtZSBjb250cmFjdC7gp6mSojQ1XQxmb3VuZGNvbXBhbnmDAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBmb3VuZGNvbXBhbnkKc3VtbWFyeTogJ0ZvdW5kIGEgbmV3IGNvbXBhbnknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpGb3VuZCBhIG5ldyBjb21wYW55IGluIHRoZSBTaGlwbG9hZCBwbGF0Zm9ybSBjb250cmFjdC4AAAAAADBVpQRvcGVumwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogb3BlbgpzdW1tYXJ5OiAnT3BlbiBhIGRlcG9zaXQgYmFsYW5jZSByb3cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpPcGVuIGEgemVyby1iYWxhbmNlIGRlcG9zaXQgcm93IGZvciB0aGUgZ2l2ZW4gb3duZXIgYW5kIHRva2VuLCB3aXRoIFJBTSBwYWlkIGJ5IHRoZSBvd25lci4gSGFzIG5vIGVmZmVjdCBpZiB0aGUgcm93IGFscmVhZHkgZXhpc3RzLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIG93bmVyIGNhbiByZWNlaXZlIHRva2VuIGRlcG9zaXRzIG9yIHdyYXAgcmVmdW5kcy6QFcZGZcOiugxyZWxnYXRlYXNzZXQAcNXkVGXDoroMcmVsZ2F0ZW93bmVyAKCkyw3RqrLCDHNldGVwb2NodGltZcQCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNldGVwb2NodGltZQpzdW1tYXJ5OiAnREVCVUc6IG92ZXJyaWRlIGEgZ2FtZScncyBlcG9jaCB0aW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpPdmVycmlkZSB0aGUgZXBvY2ggZHVyYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNwZWNpZmllZCBnYW1lIGNvbnRyYWN0LiBSZXF1aXJlcyBwbGF0Zm9ybSBjb250cmFjdCBhdXRob3JpdHkuAAAAU0Gas8IIc2V0dG9rZW6dAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzZXR0b2tlbgpzdW1tYXJ5OiAnU2V0IHRoZSBhY2NlcHRlZCBkZXBvc2l0IHRva2VuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKQWRtaW4gYWN0aW9uIHRoYXQgc2V0cyB0aGUgYWNjZXB0ZWQgZGVwb3NpdCB0b2tlbiAoY29udHJhY3QgYWNjb3VudCBhbmQgc3ltYm9sKSBmb3IgdGhlIHBsYXRmb3JtLiBBbGwgcGxheWVyIGRlcG9zaXRzIGFuZCB3cmFwIGNvc3RzIGFyZSBkZW5vbWluYXRlZCBpbiB0aGlzIHRva2VuLiBSZXF1aXJlcyBwbGF0Zm9ybSBjb250cmFjdCBhdXRob3JpdHkuAABQ0rB8TcYJc3RhcnRnYW1l/wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3RhcnRnYW1lCnN1bW1hcnk6ICdTdGFydCBhIG5ldyBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKU3RhcnQgYSBuZXcgZ2FtZSBvZiBTaGlwbG9hZCBkZXBsb3llZCB0byBhIG5ldyBjb250cmFjdC4AKLsGVXP51At1bndyYXBjYXJnb88ELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHVud3JhcGNhcmdvCnN1bW1hcnk6ICdEZXBvc2l0IGFuIE5GVCBpbnRvIGEgaG9zdCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkRlcG9zaXQgYW4gQXRvbWljQXNzZXRzIE5GVCBpbnRvIGEgaG9zdCBlbnRpdHkncyBjYXJnby4gUGFpcnMgd2l0aCBhbiBhdG9taWNhc3NldHM6OnRyYW5zZmVyIGNhcnJ5aW5nIHRoZSAndW53cmFwJyBtZW1vIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLiBUaGUgY2FsbGVyIG11c3Qgb3duIHRoZSBob3N0LCB0aGUgaG9zdCBtdXN0IGhhdmUgbG9hZGVycywgYW5kIHRoZSBob3N0IG11c3QgaGF2ZSBjYXBhY2l0eSBoZWFkcm9vbSBmb3IgdGhlIHVud3JhcHBlZCBtYXNzLiBTY2hlZHVsZXMgYSBUQVNLX1VOV1JBUCBvbiB0aGUgaG9zdCB0aGF0LCBvbiByZXNvbHV0aW9uLCBwbGFjZXMgdGhlIGRlY29kZWQgaXRlbSBpbnRvIHRoZSBob3N0J3MgY2FyZ28gYW5kIGJ1cm5zIHRoZSBORlQu4LPLU1Vz+dQMdW53cmFwZW50aXR54gQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdW53cmFwZW50aXR5CnN1bW1hcnk6ICdEZXBsb3kgYW4gZW50aXR5IE5GVCBkaXJlY3RseSB0byBhIG5leHVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpEZXBsb3kgYSBwYWNrZWQtZW50aXR5IEF0b21pY0Fzc2V0cyBORlQgKG9yYml0YWwgdmVzc2VsOiBzaGlwIG9yIGNvbnRhaW5lcikgZGlyZWN0bHkgYXMgYSBsaXZlIGVudGl0eS4gUGFpcnMgd2l0aCBhbiBhdG9taWNhc3NldHM6OnRyYW5zZmVyIGNhcnJ5aW5nIHRoZSAnZGVwbG95JyBtZW1vIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLiBUaGUgTkZUIGlzIGJ1cm5lZCwgYSBuZXcgZW50aXR5IHJvdyBpcyBlbXBsYWNlZCBhdCB0aGUgTkZUJ3Mgd3JhcCBvcmlnaW4gcGFpZCBieSB0aGUgb3duZXIsIGFuZCBUQVNLX1RSQVZFTCBwbHVzIFRBU0tfUkVDSEFSR0UgYXJlIHF1ZXVlZCB0byBkZWxpdmVyIHRoZSBlbnRpdHkgdG8gdGhlIHRhcmdldCBuZXh1cyBhbmQgYnJpbmcgaXQgdG8gZnVsbCBlbmVyZ3kuAICShqlsUtUKdXBkYXRlZ2FtZY0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHVwZGF0ZWdhbWUKc3VtbWFyeTogJ1VwZGF0ZSBnYW1lIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKVXBkYXRlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIGdhbWUgY29udHJhY3QuCgotLS0AAAAAAKCq4wR3aXBlsgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2lwZQpzdW1tYXJ5OiAnREVCVUc6IHdpcGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAA3NzUsuMId2l0aGRyYXeXAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXRoZHJhdwpzdW1tYXJ5OiAnV2l0aGRyYXcgdG9rZW5zIGZyb20gYSBkZXBvc2l0IGJhbGFuY2UnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpXaXRoZHJhdyB0b2tlbnMgZnJvbSB0aGUgb3duZXIncyBkZXBvc2l0IGJhbGFuY2UuIERlYml0cyB0aGUgbGVkZ2VyIGJ5IHRoZSByZXF1ZXN0ZWQgYW1vdW50IGFuZCB0cmFuc2ZlcnMgdGhlIHRva2VucyB0byB0aGUgb3duZXIuIFJlcXVpcmVzIGEgc3VmZmljaWVudCBiYWxhbmNlIGFuZCB0aGUgb3duZXIncyBhdXRob3JpdHkuAACg7BpUzeUJd3JhcGNhcmdvAACAzy5PVc3lCndyYXBlbnRpdHm1BC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3cmFwZW50aXR5CnN1bW1hcnk6ICdXcmFwIGEgZGVwbG95ZWQgZW50aXR5IGludG8gYW4gTkZUJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpXcmFwIGFuIGVudGl0eSBpbnRvIGFuIEF0b21pY0Fzc2V0cyBORlQgbWludGVkIHRvIGl0cyBvd25lci4gVGhlIGVudGl0eSBtdXN0IGJlIGF0IGEgbmV4dXMsIGlkbGUgd2l0aCBlbXB0eSBjYXJnbywgYW5kIGhhdmUgYW4gbmZ0Y29uZmlnIG1hcHBpbmcgZm9yIGl0cyBpdGVtIGlkLiBFcmFzZXMgdGhlIGVudGl0eSBhbmQgbWludHMgdGhlIE5GVCBpbmxpbmUsIHByZXNlcnZpbmcgaXRzIHN0YXRzIGFuZCBpbnN0YWxsZWQgbW9kdWxlczsgdGhlIHBsYXllciBwYXlzIFJBTSBmb3IgdGhlIG5ldyBhc3NldCByb3cuIFJlcXVpcmVzIHRoZSBvd25lcidzIGFjdGl2ZSBwZXJtaXNzaW9uIChubyBzZXNzaW9uLWtleSBjb21wYXRpYmlsaXR5KS4HAAAAQKFpojkDaTY0AAALYmFsYW5jZV9yb3cAAADAT1MlRQNpNjQAAAtjb21wYW55X3JvdwAAWyg7TKtKA2k2NAAADmRlcG9zaXRjZmdfcm93AAAAAACspGEDaTY0AAAIZ2FtZV9yb3cAAAAAAJVNxgNpNjQAAAlzdGF0ZV9yb3cAQMYaVXP51ANpNjQAAA51bndyYXBjdXN0X3JvdwAAACobVs3lA2k2NAAADHdyYXBnYXRlX3JvdwETU2hpcGxvYWQgKFBsYXRmb3JtKRNTaGlwbG9hZCAoUGxhdGZvcm0pAAAAAA==');
|
|
@@ -440,7 +440,7 @@ var platform = /*#__PURE__*/Object.freeze({
|
|
|
440
440
|
Contract: Contract$1
|
|
441
441
|
});
|
|
442
442
|
|
|
443
|
-
const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDisAQlhZGRtb2R1bGUABAllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgp0YXJnZXRfcmVmCmNhcmdvX3JlZj8IYWRkbmV4dXMAAwpuZXh1c19uYW1lBnN0cmluZwF4BWludDY0AXkFaW50NjQJYWRkb3JhY2xlAAEJb3JhY2xlX2lkBG5hbWUFYmxlbmQAAgJpZAZ1aW50NjQGaW5wdXRzDGNhcmdvX2l0ZW1bXQlidWlsZHBsb3QAAgpidWlsZGVyX2lkBnVpbnQ2NAdwbG90X2lkBnVpbnQ2NAZjYW5jZWwAAwJpZAZ1aW50NjQIbGFuZV9rZXkFdWludDgFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABQdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhxdWFudGl0eQZ1aW50MzIJZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcmVmAAQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10JZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcm93AAcCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdC3NlcXVlbmNlX2lkB3VpbnQ2ND8KY2FyZ29fdmlldwAGB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHF1YW50aXR5BnVpbnQzMgJpZAZ1aW50NjQJZW50aXR5X2lkB3VpbnQ2ND8JY2xhaW1fcm93AAEFb3duZXIEbmFtZQljbGFpbXBsb3QAAwpidWlsZGVyX2lkBnVpbnQ2NA50YXJnZXRfaXRlbV9pZAZ1aW50MTYGY29vcmRzC2Nvb3JkaW5hdGVzDGNsYWltc3RhcnRlcgABBW93bmVyBG5hbWUJY2xlYW5yc3ZwAAIFZXBvY2gGdWludDY0CG1heF9yb3dzBnVpbnQ2NApjbGVhcnRhYmxlAAMKdGFibGVfbmFtZQRuYW1lBXNjb3BlBW5hbWU/CG1heF9yb3dzB3VpbnQ2ND8GY29tbWl0AAMJb3JhY2xlX2lkBG5hbWUFZXBvY2gGdWludDY0BmNvbW1pdAtjaGVja3N1bTI1Ngpjb21taXRfcm93AAQCaWQGdWludDY0BWVwb2NoBnVpbnQ2NAlvcmFjbGVfaWQEbmFtZQZjb21taXQLY2hlY2tzdW0yNTYJY29uZmlnbG9nAAEGY29uZmlnC2dhbWVfY29uZmlnC2Nvb3JkaW5hdGVzAAMBeAVpbnQ2NAF5BWludDY0AXoHdWludDE2PwVjcmFmdAAFAmlkBnVpbnQ2NAlyZWNpcGVfaWQGdWludDE2CHF1YW50aXR5BnVpbnQzMgZpbnB1dHMMY2FyZ29faXRlbVtdBnRhcmdldAd1aW50NjQ/DWNyYWZ0ZXJfc3RhdHMAAgVzcGVlZAZ1aW50MTYFZHJhaW4GdWludDMyCGRlbW9saXNoAAEJZW50aXR5X2lkBnVpbnQ2NAZkZXBsb3kAAgJpZAZ1aW50NjQDcmVmCWNhcmdvX3JlZgpkZXNjZW50aXR5AAQHaXRlbV9pZAZ1aW50MTYKaHVsbF9zdGF0cwZ1aW50NjQMbW9kdWxlX2l0ZW1zCHVpbnQxNltdDG1vZHVsZV9zdGF0cwh1aW50NjRbXQZlbmFibGUAAQdlbmFibGVkBGJvb2wMZW5lcmd5X3N0YXRzAAIIY2FwYWNpdHkGdWludDMyCHJlY2hhcmdlBnVpbnQzMhRlbnRpdHlfY3VycmVudF9zdGF0ZQACC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzBmVuZXJneQZ1aW50MzIPZW50aXR5X2RlZmF1bHRzAAILd2FyZWhvdXNlX3oGdWludDE2C2NvbnRhaW5lcl96BnVpbnQxNgtlbnRpdHlfaW5mbwAVBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMHaXRlbV9pZAZ1aW50MTYJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb192aWV3W10HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQZlbmVyZ3kHdWludDMyPwhodWxsbWFzcwd1aW50MzI/CGNhcGFjaXR5B3VpbnQzMj8HZW5naW5lcw9tb3ZlbWVudF9zdGF0cz8Ed2FycAt3YXJwX3N0YXRzPwlnZW5lcmF0b3INZW5lcmd5X3N0YXRzPwhnYXRoZXJlcg9nYXRoZXJlcl9zdGF0cz8HbG9hZGVycw1sb2FkZXJfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/B2NyYWZ0ZXIOY3JhZnRlcl9zdGF0cz8FbGFuZXMGbGFuZVtdBWhvbGRzBmhvbGRbXQ1lbnRpdHlfbGF5b3V0AAIOZW50aXR5X2l0ZW1faWQGdWludDE2BXNsb3RzCnNsb3RfZGVmW10VZW50aXR5X2xheW91dHNfcmVzdWx0AAEIZW50aXRpZXMPZW50aXR5X2xheW91dFtdCmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKZW50aXR5X3JvdwAMAmlkBnVpbnQ2NAVvd25lcgRuYW1lBGtpbmQEbmFtZQdpdGVtX2lkBnVpbnQxNgRuYW1lBnN0cmluZwVzdGF0cwZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdBWxhbmVzBmxhbmVbXQVob2xkcwZob2xkW10OZW50aXR5X3NlcV9yb3cAAQduZXh0X2lkBnVpbnQ2NA5lbnRpdHlfc3VtbWFyeQAIBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMHaXNfaWRsZQRib29sDnJlc29sdmVkX2NvdW50BnVpbnQzMg1wZW5kaW5nX2NvdW50BnVpbnQzMhBlbnRpdHlfdGFza19pbmZvAAQJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lCnRhc2tfY291bnQFdWludDgQc2NoZWR1bGVfc3RhcnRlZAp0aW1lX3BvaW50D2VudGl0eWdyb3VwX3JvdwACAmlkBnVpbnQ2NAxwYXJ0aWNpcGFudHMMZW50aXR5X3JlZltdC2VudW1fbWVtYmVyAAIFdmFsdWUFdWludDgEbmFtZQZzdHJpbmcLZW51bV9yZXN1bHQAAQdtZW1iZXJzDWVudW1fbWVtYmVyW10JZXBvY2hfcm93AAQFZXBvY2gGdWludDY0Cm9yYWNsZV9pZHMGbmFtZVtdCXRocmVzaG9sZAV1aW50OARzZWVkC2NoZWNrc3VtMjU2DGZpeGNhcmdvbWFzcwABCWVudGl0eV9pZAZ1aW50NjQLZm9yY2VyZXZlYWwAAQVlcG9jaAZ1aW50NjQLZ2FtZV9jb25maWcAAwd2ZXJzaW9uBnVpbnQzMghkZWZhdWx0cw9lbnRpdHlfZGVmYXVsdHMFaXRlbXMKaXRlbV9kZWZbXQZnYXRoZXIABAlzb3VyY2VfaWQGdWludDY0DmRlc3RpbmF0aW9uX2lkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIOZ2F0aGVyZXJfc3RhdHMAAwV5aWVsZAZ1aW50MTYFZHJhaW4GdWludDMyBWRlcHRoBnVpbnQxNgxnZW5lc2lzZmxlZXQAAQhlbnRpdGllcwxlbnRpdHlfcm93W10JZ2V0Y29uZmlnAAAKZ2V0ZGVwb3NpdAACBW93bmVyBG5hbWUIYXNzZXRfaWQGdWludDY0C2dldGVsaWdpYmxlAAIGY29vcmRzC2Nvb3JkaW5hdGVzB3N0cmF0dW0GdWludDE2CWdldGVudGNscwAAC2dldGVudGl0aWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwlnZXRlbnRpdHkAAQllbnRpdHlfaWQGdWludDY0C2dldGl0ZW1kYXRhAAAKZ2V0aXRlbWlkcwAACGdldGl0ZW1zAAALZ2V0aXRlbXR5cGUAAQdpdGVtX2lkBnVpbnQxNgxnZXRpdGVtdHlwZXMAAAtnZXRraW5kbWV0YQAAC2dldGxvY2F0aW9uAAIBeAVpbnQ2NAF5BWludDY0CmdldGxvY2RhdGEAAgF4BWludDY0AXkFaW50NjQLZ2V0bW9kdHlwZXMAAApnZXRtb2R1bGVzAAAJZ2V0bmVhcmJ5AAIJZW50aXR5X2lkBnVpbnQ2NAhyZWNoYXJnZQRib29sCmdldG5mdGJhc2UAAApnZXRuZnRpbmZvAAAJZ2V0cGxheWVyAAEHYWNjb3VudARuYW1lDGdldHByb2pzdGF0ZQACCWVudGl0eV9pZAZ1aW50NjQKdGFza19jb3VudAZ1aW50OD8JZ2V0cmVjaXBlAAEOb3V0cHV0X2l0ZW1faWQGdWludDE2CmdldHJlY2lwZXMAAgtsb3dlcl9ib3VuZAZ1aW50MTYFbGltaXQFdWludDgKZ2V0cmVzY2F0cwAAC2dldHJlc2VydmVzAAIBeAVpbnQ2NAF5BWludDY0DGdldHJlc291cmNlcwAACGdldHNsb3RzAAAKZ2V0c3RyYXR1bQADAXgFaW50NjQBeQVpbnQ2NAdzdHJhdHVtBnVpbnQxNgxnZXRzdW1tYXJpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/C2dyb3VwdHJhdmVsAAQIZW50aXRpZXMMZW50aXR5X3JlZltdAXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sBGhhc2gAAQV2YWx1ZQZzdHJpbmcHaGFzaDUxMgABBXZhbHVlBnN0cmluZwxoYXVsZXJfc3RhdHMAAwhjYXBhY2l0eQV1aW50OAplZmZpY2llbmN5BnVpbnQxNgVkcmFpbgZ1aW50MzIEaG9sZAAFAmlkBnVpbnQ2NARraW5kBXVpbnQ4C2NvdW50ZXJwYXJ0CmVudGl0eV9yZWYFdW50aWwKdGltZV9wb2ludA1pbmNvbWluZ19tYXNzBnVpbnQzMgtpbXBvcnRjYXJnbwABA3JvdwljYXJnb19yb3cMaW1wb3J0ZW50aXR5AAEDcm93CmVudGl0eV9yb3cLaW1wb3J0Z3JvdXAAAQNyb3cPZW50aXR5Z3JvdXBfcm93DGltcG9ydHBsYXllcgABBW93bmVyBG5hbWUNaW1wb3J0cmVzZXJ2ZQACC2Vwb2NoX3Njb3BlBnVpbnQzMgNyb3cLcmVzZXJ2ZV9yb3cLaW1wb3J0c3RhdGUAAQNyb3cJc3RhdGVfcm93CGl0ZW1fZGVmAAUCaWQGdWludDE2BG1hc3MGdWludDMyBHR5cGUFdWludDgHc3VidHlwZQV1aW50OAR0aWVyBXVpbnQ4DGl0ZW1faWRfcGFpcgACAmlkBnVpbnQxNgRuYW1lBnN0cmluZw9pdGVtX2lkc19yZXN1bHQAAQVpdGVtcw5pdGVtX2lkX3BhaXJbXQ9pdGVtZGF0YV9yZXN1bHQAAgVpdGVtcwppdGVtX2RlZltdB3JlY2lwZXMOcmVjaXBlc19yZXN1bHQKaXRlbXNfaW5mbwABBWl0ZW1zCml0ZW1fZGVmW10Eam9pbgABB2FjY291bnQEbmFtZRBraW5kX21ldGFfcmVzdWx0AAIFa2luZHMPa2luZF9tZXRhX3Jvd1tdCXRlbXBsYXRlcxN0ZW1wbGF0ZV9tZXRhX3Jvd1tdDWtpbmRfbWV0YV9yb3cABQRraW5kBG5hbWUOY2xhc3NpZmljYXRpb24FdWludDgQY2FwYWJpbGl0eV9mbGFncwV1aW50OAd6X2Nvb3JkBnVpbnQzMg1kZWZhdWx0X2xhYmVsBnN0cmluZwRsYW5lAAIIbGFuZV9rZXkFdWludDgIc2NoZWR1bGUIc2NoZWR1bGUEbG9hZAADAmlkBnVpbnQ2NAdmcm9tX2lkBnVpbnQ2NAVpdGVtcwxjYXJnb19pdGVtW10MbG9hZGVyX3N0YXRzAAMEbWFzcwZ1aW50MzIGdGhydXN0BnVpbnQxNghxdWFudGl0eQV1aW50OBBsb2NhdGlvbl9kZXJpdmVkAAIMc3RhdGljX3Byb3BzD2xvY2F0aW9uX3N0YXRpYwRzaXplBnVpbnQxNg1sb2NhdGlvbl9pbmZvAAIGY29vcmRzC2Nvb3JkaW5hdGVzCWlzX3N5c3RlbQRib29sD2xvY2F0aW9uX3N0YXRpYwAFBmNvb3Jkcwtjb29yZGluYXRlcwR0eXBlDWxvY2F0aW9uX3R5cGUHc3VidHlwZQV1aW50OAVzZWVkMAV1aW50OAVzZWVkMQV1aW50OAxtb2R1bGVfZW50cnkAAgR0eXBlBXVpbnQ4CWluc3RhbGxlZA5wYWNrZWRfbW9kdWxlPwttb2R1bGVfaW5mbwAEAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgttb2R1bGVfdHlwZQV1aW50OAR0aWVyBXVpbnQ4Dm1vZHVsZXNfcmVzdWx0AAEHbW9kdWxlcw1tb2R1bGVfaW5mb1tdDm1vdmVtZW50X3N0YXRzAAIGdGhydXN0BnVpbnQzMgVkcmFpbgZ1aW50MzILbmVhcmJ5X2luZm8ABQpjYW5fdHJhdmVsBGJvb2wHY3VycmVudBRlbnRpdHlfY3VycmVudF9zdGF0ZQlwcm9qZWN0ZWQUZW50aXR5X2N1cnJlbnRfc3RhdGUKbWF4X2VuZXJneQZ1aW50MzIHc3lzdGVtcw9uZWFyYnlfc3lzdGVtW10NbmVhcmJ5X3N5c3RlbQAECGRpc3RhbmNlBnVpbnQ2NAtlbmVyZ3lfY29zdAZ1aW50NjQLZmxpZ2h0X3RpbWUGdWludDMyCGxvY2F0aW9uDWxvY2F0aW9uX2luZm8ObmZ0X2NhcmdvX2l0ZW0ABAdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhxdWFudGl0eQZ1aW50MzIQbmZ0X2l0ZW1fcGF5bG9hZAACBGl0ZW0ObmZ0X2NhcmdvX2l0ZW0IbG9jYXRpb24MY29vcmRpbmF0ZXM/Dm5mdF9zY2hlbWFfZGVmAAILc2NoZW1hX25hbWUEbmFtZQZmaWVsZHMOc2NoZW1hX2ZpZWxkW10QbmZ0X3RlbXBsYXRlX2RlZgADB2l0ZW1faWQGdWludDE2C3NjaGVtYV9uYW1lBG5hbWULdGVtcGxhdGVfaWQFaW50MzINbmZ0Y29uZmlnX3JvdwADB2l0ZW1faWQGdWludDE2C3RlbXBsYXRlX2lkBWludDMyC3NjaGVtYV9uYW1lBG5hbWUJbmZ0aW1ndXJsAAIEaXRlbQpjYXJnb19pdGVtCGxvY2F0aW9uDGNvb3JkaW5hdGVzPw5uZnRpbmZvX3Jlc3VsdAACB3NjaGVtYXMQbmZ0X3NjaGVtYV9kZWZbXQl0ZW1wbGF0ZXMSbmZ0X3RlbXBsYXRlX2RlZltdBm5vdGlmeQABBWV2ZW50CnRhc2tfZXZlbnQRb3JhY2xlX2NvbmZpZ19yb3cAAQl0aHJlc2hvbGQFdWludDgKb3JhY2xlX3JvdwABAmlkBG5hbWUNcGFja2VkX21vZHVsZQACB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NApwbGFjZWNhcmdvAAMFb3duZXIEbmFtZQdob3N0X2lkBnVpbnQ2NAhhc3NldF9pZAZ1aW50NjQLcGxhY2VlbnRpdHkAAwVvd25lcgRuYW1lCGFzc2V0X2lkBnVpbnQ2NA90YXJnZXRfbmV4dXNfaWQGdWludDY0C3BsYXllcl9pbmZvAAMFb3duZXIEbmFtZQlpc19wbGF5ZXIEYm9vbAxjb21wYW55X25hbWUGc3RyaW5nCnBsYXllcl9yb3cAAQVvd25lcgRuYW1lD3Byb2plY3RlZF9zdGF0ZQAOBW93bmVyBG5hbWULY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb192aWV3W10IaHVsbG1hc3MHdWludDMyPwhjYXBhY2l0eQd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/B2xvYWRlcnMNbG9hZGVyX3N0YXRzPwZoYXVsZXINaGF1bGVyX3N0YXRzPwdjcmFmdGVyDmNyYWZ0ZXJfc3RhdHM/CHJlY2hhcmdlAAECaWQGdWludDY0DHJlY2lwZV9pbnB1dAACB2l0ZW1faWQGdWludDE2CHF1YW50aXR5BnVpbnQzMhByZWNpcGVfaXRlbV9pbmZvAAICaWQGdWludDE2BG1hc3MGdWludDMyD3JlY2lwZV9yZXNwb25zZQAHDm91dHB1dF9pdGVtX2lkBnVpbnQxNgtvdXRwdXRfbWFzcwZ1aW50MzIGaW5wdXRzDnJlY2lwZV9pbnB1dFtdCnN0YXRfc2xvdHMUc3RhdF9zbG90X3Jlc3BvbnNlW10NYmxlbmRfd2VpZ2h0cwVieXRlcwtvdXRwdXRfaXRlbRByZWNpcGVfaXRlbV9pbmZvC2lucHV0X2l0ZW1zEnJlY2lwZV9pdGVtX2luZm9bXQ5yZWNpcGVzX3Jlc3VsdAABB3JlY2lwZXMRcmVjaXBlX3Jlc3BvbnNlW10McmVmcnNoZW50aXR5AAEJZW50aXR5X2lkBnVpbnQ2NAxyZW1vdmVvcmFjbGUAAQlvcmFjbGVfaWQEbmFtZQZyZW5hbWUAAgJpZAZ1aW50NjQEbmFtZQZzdHJpbmcLcmVzZXJ2ZV9yb3cABQJpZAZ1aW50NjQIY29vcmRfaWQGdWludDY0B3N0cmF0dW0GdWludDE2CXJlbWFpbmluZwZ1aW50MzIKbGFzdF9ibG9jaxRibG9ja190aW1lc3RhbXBfdHlwZQdyZXNvbHZlAAICaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CnJlc29sdmVhbGwAAQVvd25lcgRuYW1lEnJlc29sdmVhbGxfcmVzdWx0cwACB3NjYW5uZWQGdWludDMyCHJlc29sdmVkBnVpbnQzMg1yZXNvdXJjZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyCGNhdGVnb3J5BXVpbnQ4BHRpZXIFdWludDgOcmVzb3VyY2Vfc3RhdHMAAwVzdGF0MQZ1aW50MTYFc3RhdDIGdWludDE2BXN0YXQzBnVpbnQxNhByZXNvdXJjZXNfcmVzdWx0AAEJcmVzb3VyY2VzD3Jlc291cmNlX2luZm9bXQZyZXZlYWwAAwlvcmFjbGVfaWQEbmFtZQVlcG9jaAZ1aW50NjQGcmV2ZWFsC2NoZWNrc3VtMjU2CnJldmVhbF9yb3cABAJpZAZ1aW50NjQFZXBvY2gGdWludDY0CW9yYWNsZV9pZARuYW1lBnJldmVhbAtjaGVja3N1bTI1NghybW1vZHVsZQADCWVudGl0eV9pZAZ1aW50NjQMbW9kdWxlX2luZGV4BXVpbnQ4CnRhcmdldF9yZWYKY2FyZ29fcmVmPwhybW5mdGNmZwABB2l0ZW1faWQGdWludDE2CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwlzZXRuZnRjZmcAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lDHNldHRocmVzaG9sZAABCXRocmVzaG9sZAV1aW50OAtzZXR3cmFwY29zdAADCWl0ZW1fdHlwZQV1aW50OAR0aWVyBXVpbnQ4BmFtb3VudAZ1aW50NjQKc2V0d3JhcGZlZQACB2ZlZV9wY3QGdWludDE2C2ZlZV9hY2NvdW50BG5hbWUIc2xvdF9kZWYAAgR0eXBlBXVpbnQ4Cm91dHB1dF9wY3QGdWludDE2EnN0YXRfc2xvdF9yZXNwb25zZQABB3NvdXJjZXMNc3RhdF9zb3VyY2VbXQtzdGF0X3NvdXJjZQACC2lucHV0X2luZGV4BXVpbnQ4EGlucHV0X3N0YXRfaW5kZXgFdWludDgJc3RhdGVfcm93AAMHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2CXN0b3djYXJnbwAFBW93bmVyBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhuZXh1c19pZAZ1aW50NjQIY2FyZ29faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NApzdG93ZW50aXR5AAMFb3duZXIEbmFtZQllbnRpdHlfaWQGdWludDY0CG5leHVzX2lkBnVpbnQ2NAxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABQdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzILcmVzZXJ2ZV9tYXgGdWludDMyEXN0cmF0dW1fcmVtYWluaW5nAAMHc3RyYXR1bQZ1aW50MTYJcmVtYWluaW5nBnVpbnQzMgpsYXN0X2Jsb2NrFGJsb2NrX3RpbWVzdGFtcF90eXBlCnN3YXBtb2R1bGUAAwllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgR0YXNrAAkEdHlwZQV1aW50OAhkdXJhdGlvbgZ1aW50MzIKY2FuY2VsYWJsZQV1aW50OAtjb29yZGluYXRlcwxjb29yZGluYXRlcz8FY2FyZ28MY2FyZ29faXRlbVtdDGVudGl0eXRhcmdldAtlbnRpdHlfcmVmPwtlbnRpdHlncm91cAd1aW50NjQ/C2VuZXJneV9jb3N0B3VpbnQzMj8EaG9sZAd1aW50NjQ/CnRhc2tfZXZlbnQACgpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDMyPwhsYW5lX2tleQV1aW50OAx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10RdGVtcGxhdGVfbWV0YV9yb3cAAwdpdGVtX2lkBnVpbnQxNgRraW5kBG5hbWUNZGlzcGxheV9sYWJlbAZzdHJpbmcGdHJhdmVsAAQCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sCXR5cGVzX3JvdwAFAmlkBnVpbnQ2NBNlbnRpdHlfc3VtbWFyeV90eXBlDmVudGl0eV9zdW1tYXJ5EGdhbWVfY29uZmlnX3R5cGULZ2FtZV9jb25maWcWc3RyYXR1bV9yZW1haW5pbmdfdHlwZRFzdHJhdHVtX3JlbWFpbmluZxVuZnRfaXRlbV9wYXlsb2FkX3R5cGUQbmZ0X2l0ZW1fcGF5bG9hZAh1bmRlcGxveQACB2hvc3RfaWQGdWludDY0CXRhcmdldF9pZAZ1aW50NjQGdW5sb2FkAAMCaWQGdWludDY0BXRvX2lkBnVpbnQ2NAVpdGVtcwxjYXJnb19pdGVtW10Ed2FycAADAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQKd2FycF9zdGF0cwABBXJhbmdlBnVpbnQzMgR3aXBlAAAOd3JhcGNvbmZpZ19yb3cAAgdmZWVfcGN0BnVpbnQxNgtmZWVfYWNjb3VudARuYW1lDHdyYXBjb3N0X3JvdwADCWl0ZW1fdHlwZQV1aW50OAR0aWVyBXVpbnQ4BmFtb3VudAZ1aW50NjRWAABQUScqUzIJYWRkbW9kdWxlxwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbW9kdWxlCnN1bW1hcnk6ICdJbnN0YWxsIGEgbW9kdWxlIGludG8gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YWxsIGEgbW9kdWxlIGZyb20gY2FyZ28gaW50byBhIG1vZHVsZSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSB0eXBlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgc2xvdCB0eXBlLiBUaGUgbW9kdWxlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIGNhcmdvIHVwb24gaW5zdGFsbGF0aW9uLgAAAFh3NVMyCGFkZG5leHVzpwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbmV4dXMKc3VtbWFyeTogJ0FkZCBhIG5leHVzIGxvY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDcmVhdGUgYSBuZXcgbmV4dXMgZW50aXR5IGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy4gTmV4dXNlcyBhcmUgb3duZWQgYnkgdGhlIGNvbnRyYWN0IGFuZCBzZXJ2ZSBhcyBmaXhlZCBnYXRoZXJpbmcgcG9pbnRzIHdoZXJlIHBsYXllcnMgY2FuIHdyYXAsIHVud3JhcCwgZGVwbG95LCBhbmQgb3RoZXJ3aXNlIGludGVyYWN0IHdpdGggTkZULWJhY2tlZCBhc3NldHMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAFARmUtTMglhZGRvcmFjbGUAAAAAAIA0VTwFYmxlbmT8Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBibGVuZApzdW1tYXJ5OiAnQmxlbmQgY2FyZ28gc3RhY2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDb21iaW5lIG11bHRpcGxlIGNhcmdvIHN0YWNrcyBvZiB0aGUgc2FtZSBpdGVtIHR5cGUgaW50byBhIHNpbmdsZSBzdGFjayB3aXRoIG5ldyBibGVuZGVkIHN0YXRzLiBBbGwgaW5wdXQgc3RhY2tzIG11c3Qgc2hhcmUgdGhlIHNhbWUgaXRlbSBpZC4gVGhlIG91dHB1dCBzdGFjayBoYXMgdGhlIGNvbWJpbmVkIHF1YW50aXR5IG9mIGFsbCBpbnB1dHMuAADINNYUnT4JYnVpbGRwbG90AAAAAABEhaZBBmNhbmNlbMICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNhbmNlbApzdW1tYXJ5OiAnQ2FuY2VsIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FuY2VsIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRhc2tzIGZyb20gdGhlIGVuZCBvZiBhbiBlbnRpdHkncyBzY2hlZHVsZS4gVGFza3MgdGhhdCBhcmUgaW1tdXRhYmxlIGFuZCBpbiBwcm9ncmVzcyBjYW5ub3QgYmUgY2FuY2VsbGVkLgAAyDRW6UxECWNsYWltcGxvdABwVb4mY+lMRAxjbGFpbXN0YXJ0ZXIAAACoG99pVEQJY2xlYW5yc3Zw7AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYW5yc3ZwCnN1bW1hcnk6ICdDbGVhbiB1cCBwYXN0IGVwb2NoIHJlc2VydmVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFcmFzZSByZXNlcnZlIHRhYmxlIHJvd3MgZnJvbSBhIHBhc3QgZXBvY2guIENhbm5vdCBjbGVhbiB0aGUgY3VycmVudCBvciBmdXR1cmUgZXBvY2hzLiBUaGUgbWF4X3Jvd3MgcGFyYW1ldGVyIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIGVyYXNlZCBwZXIgY2FsbCB0byBsaW1pdCBDUFUgdXNhZ2UuAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdOwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4AAGA0MrcmRQljb25maWdsb2fdAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjb25maWdsb2cKc3VtbWFyeTogJ0xvZyBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IGxvZ3MgdGhlIGN1cnJlbnQgZ2FtZSBjb25maWd1cmF0aW9uLiBDYWxsZWQgaW5saW5lIGFmdGVyIGluaXRpYWxpemF0aW9uIHRvIGJyb2FkY2FzdCBjb25maWcgdmlhIGFjdGlvbiB0cmFjZXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAgLzMRQVjcmFmdMgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNyYWZ0CnN1bW1hcnk6ICdDcmFmdCBpdGVtcyBmcm9tIGEgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2Zvcm0gY2FyZ28gaXRlbXMgaW50byBhIG5ldyBpdGVtIHVzaW5nIGEgcmVjaXBlLiBUaGUgZW50aXR5IG11c3QgaGF2ZSBhIGNyYWZ0ZXIgbW9kdWxlIGluc3RhbGxlZC4gQ29uc3VtZXMgZW5lcmd5IGFuZCBzY2hlZHVsZXMgYSBjcmFmdGluZyB0YXNrIHdpdGggZHVyYXRpb24gYmFzZWQgb24gdG90YWwgaW5wdXQgbWFzcyBhbmQgY3JhZnRlciBzcGVlZC4gSW5wdXQgcXVhbnRpdGllcyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2lwZSByZXF1aXJlbWVudHMuAAAADbtIpUoIZGVtb2xpc2jxAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBkZW1vbGlzaApzdW1tYXJ5OiAnRGVtb2xpc2ggYSBzdGF0aW9uYXJ5IGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRGVjb21taXNzaW9uIGFuIGVudGl0eSwgZXJhc2luZyBpdCBmcm9tIHRoZSBnYW1lLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSwgaGF2ZSBlbXB0eSBjYXJnbywgYW5kIGhhdmUgbm8gaW5zdGFsbGVkIG1vZHVsZXMgKHJlbW92ZSBlYWNoIHZpYSBybW1vZHVsZSBmaXJzdCkuIFNjaGVkdWxlcyBhIGRlbW9saXNoIHRhc2sgdGhhdCBlcmFzZXMgdGhlIGVudGl0eSBvbiByZXNvbHV0aW9uLiBPbmx5IHZhbGlkIGZvciBlbnRpdGllcyB0aGF0IGNhbm5vdCBtb3ZlOyB1c2UgdW5kZXBsb3kgb3Igd3JhcGVudGl0eSBmb3IgdGhlIHJlc3QuAAAAAHgaq0oGZGVwbG957AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVwbG95CnN1bW1hcnk6ICdEZXBsb3kgYSBwYWNrZWQgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpVbnBhY2sgYSBwYWNrZWQgZW50aXR5IGl0ZW0gKHBhY2tlZCBzaGlwIG9yIHBhY2tlZCBjb250YWluZXIpIGZyb20gY2FyZ28sIHNjaGVkdWxpbmcgYSBkZXBsb3kgdGFzayB0aGF0IGNyZWF0ZXMgdGhlIG5ldyBlbnRpdHkgYXQgdGhlIGRlcGxveWluZyBlbnRpdHkncyBsb2NhdGlvbiB1cG9uIHJlc29sdXRpb24uAIDPLk+FsEoKZGVzY2VudGl0eckDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlc2NlbnRpdHkKc3VtbWFyeTogJ0Rlc2NyaWJlIGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIGEgcGFja2VkIGVudGl0eSwgZGVyaXZlZCBmcm9tIHRoZSBlbnRpdHkgaXRlbSBpZCwgaHVsbCBzdGF0cywgYW5kIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBtb2R1bGUgaXRlbSBpZHMgYW5kIHN0YXRzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBORlQgcmVuZGVyZXJzIHRvIGRpc3BsYXkgcGFja2VkIGVudGl0aWVzLgAAAACoeMxUBmVuYWJsZd0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC6AsZGUXYO6WwxmaXhjYXJnb21hc3OQAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBmaXhjYXJnb21hc3MKc3VtbWFyeTogJ0RFQlVHOiByZWNvbXB1dGUgZW50aXR5IGNhcmdvIG1hc3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlY29tcHV0ZSBhbmQgcmV3cml0ZSBhbiBlbnRpdHkncyBjYXJnbyBtYXNzIGZyb20gaXRzIGN1cnJlbnQgY2FyZ28uIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4gQXZhaWxhYmxlIGZvciByZXBhaXJpbmcgZHJpZnQgYmV0d2VlbiBjYWNoZWQgY2FyZ28gbWFzcyBhbmQgdGhlIHRydWUgbWFzcyBkZXJpdmVkIGZyb20gY2FyZ28gcm93cy4AolFbXYUuXQtmb3JjZXJldmVhbL4ELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGZvcmNlcmV2ZWFsCnN1bW1hcnk6ICdERUJVRzogZm9yY2UtZmluYWxpemUgYW4gZXBvY2ggZnJvbSBleGlzdGluZyByZXZlYWxzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpGaW5hbGl6ZSBhIHN0dWNrIGVwb2NoIGJ5IGNvbXB1dGluZyBpdHMgc2VlZCBmcm9tIHRoZSByZXZlYWxzIGFscmVhZHkgc3VibWl0dGVkLCB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LiBUaGUgc2VlZCBpcyBkZXJpdmVkIHNvbGVseSBmcm9tIHRoZSBwcmUtaW1hZ2UtbG9ja2VkIHJldmVhbHMgYWxyZWFkeSBvbiBjaGFpbjsgbm8gYWRtaW4tc3VwcGxpZWQgZW50cm9weSBpcyBpbnRyb2R1Y2VkLiBVc2VkIHRvIHVuYmxvY2sgZXBvY2ggcHJvZ3Jlc3Npb24gd2hlbiB0aGUgdGhyZXNob2xkIGNhbm5vdCBvdGhlcndpc2UgYmUgbWV0LgAAAABc1bJhBmdhdGhlcpcDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdhdGhlcgpzdW1tYXJ5OiAnR2F0aGVyIHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKR2F0aGVyIHJlc291cmNlcyBhdCB0aGUgc2hpcCdzIGN1cnJlbnQgbG9jYXRpb24uIE9ubHkgd29ya3MgYXQgZ2F0aGVyYWJsZSBsb2NhdGlvbiB0eXBlcy4gU2NoZWR1bGVzIGEgZ2F0aGVyIHRhc2sgdGhhdCBjb25zdW1lcyBlbmVyZ3kgYW5kIHlpZWxkcyBjYXJnbyBiYXNlZCBvbiB0aGUgc2hpcCdzIGdhdGhlcmVyIHN0YXRzIGFuZCB0aGUgbG9jYXRpb24ncyByZXNvdXJjZSBjb21wb3NpdGlvbi6QlYoLO6ymYgxnZW5lc2lzZmxlZXSpBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZW5lc2lzZmxlZXQKc3VtbWFyeTogJ01pbnQgdGhlIG9uZS10aW1lIGdlbmVzaXMgZmxlZXQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVtcGxhY2UgdGhlIG9uZS10aW1lIGdlbmVzaXMgZmxlZXQ6IGEgY2FsbGVyLXN1cHBsaWVkIHNldCBvZiBlbnRpdGllcyAoc2hpcHMsIHN0cnVjdHVyZXMsIGFuZCBjb250YWluZXJzKSB3cml0dGVuIHRvIHRoZSB3b3JsZCBhcy1pcy4gVmFsaWQgb25seSBkdXJpbmcgdGhlIHByZS1nZW5lc2lzIHdpbmRvdywgYmVmb3JlIGVwb2NoIDEgaXMgZmluYWxpemVkLiBUaGUgc3VwcGxpZWQgZW50aXR5IGlkcyBhcmUgaG9ub3JlZCBhbmQgdGhlIGlkIHNlcXVlbmNlIGlzIGFkdmFuY2VkIHBhc3QgdGhlbTsgaWQgMCBpcyByZXNlcnZlZCBmb3IgdGhlIEdlbmVzaXMgTmV4dXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAGBuTYqyYglnZXRjb25maWfKAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRjb25maWcKc3VtbWFyeTogJ0dldCBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgdGhlIGdhbWUgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgZGVmYXVsdCBlbnRpdHkgc3RhdHMgZm9yIHdhcmVob3VzZXMgYW5kIGNvbnRhaW5lcnMsIGFuZCB0aGUgZnVsbCBpdGVtIGRlZmluaXRpb25zIHRhYmxlLgBAdphWlbJiCmdldGRlcG9zaXQAAFQ8jrmosmILZ2V0ZWxpZ2libGXIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbGlnaWJsZQpzdW1tYXJ5OiAnR2V0IGVsaWdpYmxlIHJlc291cmNlIGl0ZW0gSURzIGF0IGEgbG9jYXRpb24gYW5kIHN0cmF0dW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBsaXN0IG9mIHJlc291cmNlIGl0ZW0gSURzIGVsaWdpYmxlIHRvIGJlIGdhdGhlcmVkIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcyBhbmQgc3RyYXR1bSBkZXB0aC4gSXRlbXMgYXJlIGdhdGVkIGJ5IGJvdGggdGhlIGxvY2F0aW9uJ3MgcmVzb3VyY2UgcHJvZmlsZSBhbmQgdGhlIGRlcHRoIHRocmVzaG9sZCBmb3IgZWFjaCB0aWVyLgAAwBHlqbJiCWdldGVudGNsc4wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGNscwpzdW1tYXJ5OiAnR2V0IGVudGl0eSBjbGFzcyBlbnVtIHZhbHVlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgc2V0IG9mIGVudGl0eSBjbGFzcyBlbnVtIHZhbHVlcyBhbmQgdGhlaXIgc3RyaW5nIG5hbWVzIChPcmJpdGFsVmVzc2VsLCBQbGFuZXRhcnlTdHJ1Y3R1cmUpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBlbnRpdHkgY2xhc3MgaWRlbnRpZmllcnMuALBy2eWpsmILZ2V0ZW50aXRpZXOkAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbnRpdGllcwpzdW1tYXJ5OiAnR2V0IGFsbCBlbnRpdGllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgZnVsbCBlbnRpdHkgaW5mbyBmb3IgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4AAPDZ5amyYglnZXRlbnRpdHmiAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbnRpdHkKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4gZW50aXR5IGluY2x1ZGluZyBpZGVudGl0eSwgY2FyZ28sIHNjaGVkdWxlIHN0YXRlLCBhbmQgdHlwZS1zcGVjaWZpYyBmaWVsZHMuAEw2SarssmILZ2V0aXRlbWRhdGGoAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtZGF0YQpzdW1tYXJ5OiAnR2V0IGZ1bGwgaXRlbSBjYXRhbG9nJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgY29tcGxldGUgaXRlbSBjYXRhbG9nIGFzIHRoZSBjb250cmFjdCBzZWVzIGl0LCBpbmNsdWRpbmcgdHlwZSwgc3VidHlwZSwgdGllciwgbWFzcywgYW5kIG90aGVyIHN0YXRpYyBtZXRhZGF0YS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgY2xpZW50cyB0byBtaXJyb3IgdGhlIGNvbnRyYWN0J3MgaXRlbSBkZWZpbml0aW9ucy4AAE5OquyyYgpnZXRpdGVtaWRzhgMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbWlkcwpzdW1tYXJ5OiAnR2V0IGl0ZW0gaWQgdG8gbmFtZSBtYXBwaW5ncycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgbWFwcGluZyBvZiBpdGVtIGlkIGNvbnN0YW50cyB0byB0aGVpciBjYW5vbmljYWwgc3RyaW5nIG5hbWVzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHJlc29sdmUgbnVtZXJpYyBpdGVtIGlkcyB0byBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVycy4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuAFT1WarssmILZ2V0aXRlbXR5cGUAgFX1WarssmIMZ2V0aXRlbXR5cGVziAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXR5cGVzCnN1bW1hcnk6ICdHZXQgaXRlbSB0eXBlIGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgaXRlbSB0eXBlIGVudW0gdmFsdWVzIGFuZCB0aGVpciBzdHJpbmcgbmFtZXMgKHJlc291cmNlLCBjb21wb25lbnQsIG1vZHVsZSwgZW50aXR5KS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgaXRlbSB0eXBlIGlkZW50aWZpZXJzLgBMVjJNB7NiC2dldGtpbmRtZXRh+AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0a2luZG1ldGEKc3VtbWFyeTogJ0dldCBlbnRpdHkga2luZCBtZXRhZGF0YScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGVudGl0eSBraW5kIHJlZ2lzdHJ5IGFuZCB0ZW1wbGF0ZSByZWdpc3RyeSwgaW5jbHVkaW5nIGVhY2gga2luZCdzIGNsYXNzaWZpY2F0aW9uLCBjYXBhYmlsaXR5IGZsYWdzLCBaLWNvb3JkaW5hdGUsIGFuZCBkZWZhdWx0IGxhYmVsLCBwbHVzIHRoZSBtYXBwaW5nIG9mIGVudGl0eSBpdGVtIGlkcyB0byBraW5kcyB3aXRoIGRpc3BsYXkgbGFiZWxzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGludGVycHJldCBlbnRpdHkga2luZHMgYW5kIGNhcGFiaWxpdGllcy4AJnXZIBqzYgtnZXRsb2NhdGlvbuICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2F0aW9uCnN1bW1hcnk6ICdHZXQgbG9jYXRpb24gaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2NhdGlvbiBpbmNsdWRpbmcgd2hldGhlciBhIHN5c3RlbSBleGlzdHMsIGFuZCBmb3IgZWFjaCBpdGVtOiBwcmljZSwgc3VwcGx5LCByYXJpdHkgbXVsdGlwbGllciwgYW5kIGxvY2F0aW9uIG11bHRpcGxpZXIuAIDJJiEas2IKZ2V0bG9jZGF0Yf4CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2RhdGEKc3VtbWFyeTogJ0dldCBkZXJpdmVkIGxvY2F0aW9uIGRhdGEnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgZGVyaXZlZCBsb2NhdGlvbiBkYXRhIGluY2x1ZGluZyBzdGF0aWMgcHJvcGVydGllcyAodHlwZSwgZGlmZmljdWx0eSwgc2VlZHMpIGZyb20gdGhlIGdhbWUgc2VlZCBhbmQgZXBvY2gtc3BlY2lmaWMgcHJvcGVydGllcyAoYWN0aXZlLCBzZWVkcykgZnJvbSB0aGUgY3VycmVudCBlcG9jaCBzZWVkLgCwqj4nKrNiC2dldG1vZHR5cGVz1gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bW9kdHlwZXMKc3VtbWFyeTogJ0dldCBtb2R1bGUgdHlwZSBlbnVtIHZhbHVlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgc2V0IG9mIG1vZHVsZSB0eXBlIGVudW0gdmFsdWVzIGFuZCB0aGVpciBzdHJpbmcgbmFtZXMgKGFueSwgZW5naW5lLCBnZW5lcmF0b3IsIGdhdGhlcmVyLCBsb2FkZXIsIHdhcnAsIGNyYWZ0ZXIsIGxhdW5jaGVyLCBzdG9yYWdlLCBoYXVsZXIpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBtb2R1bGUgc3VidHlwZSBpZGVudGlmaWVycyBhbmQgc2xvdCBjb21wYXRpYmlsaXR5LgAAVlEnKrNiCmdldG1vZHVsZXOAAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRtb2R1bGVzCnN1bW1hcnk6ICdHZXQgYWxsIG1vZHVsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIG1vZHVsZXMsIGluY2x1ZGluZyBlYWNoIG1vZHVsZSdzIGlkLCBtYXNzLCBzdWJ0eXBlLCBhbmQgdGllci4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBlbnVtZXJhdGUgaW5zdGFsbGFibGUgZXF1aXBtZW50LgAA8OcaNbNiCWdldG5lYXJied4DLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5lYXJieQpzdW1tYXJ5OiAnR2V0IG5lYXJieSByZWFjaGFibGUgc3lzdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBuZWFyYnkgc3lzdGVtcyByZWFjaGFibGUgYnkgYW4gZW50aXR5IGZyb20gaXRzIHByb2plY3RlZCBsb2NhdGlvbi4gUmV0dXJucyBjdXJyZW50IHN0YXRlICh3aXRoIGNvbXBsZXRlZCB0YXNrcyByZXNvbHZlZCksIHByb2plY3RlZCBzdGF0ZSAoYWZ0ZXIgYWxsIHNjaGVkdWxlZCB0YXNrcyksIGFuZCBhIGxpc3Qgb2YgcmVhY2hhYmxlIHN5c3RlbXMgd2l0aCBkaXN0YW5jZSwgZW5lcmd5IGNvc3QsIGZsaWdodCB0aW1lLCBhbmQgbWFya2V0IGluZm9ybWF0aW9uLgCAwubkNbNiCmdldG5mdGJhc2UAAABd0+U1s2IKZ2V0bmZ0aW5mb/ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5mdGluZm8Kc3VtbWFyeTogJ0dldCBORlQgc2NoZW1hIGFuZCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgQXRvbWljQXNzZXRzIHNjaGVtYXMgYW5kIHRlbXBsYXRlcyB0aGUgZ2FtZSBjb250cmFjdCBleHBlY3RzLCBwbHVzIHRoZSBjdXJyZW50IGBpdGVtX2lkIOKGkiAodGVtcGxhdGVfaWQsIHNjaGVtYV9uYW1lKWAgbWFwcGluZyBzdG9yZWQgaW4gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHN5bmMgYXRvbWljYXNzZXRzIHN0YXRlIHdpdGggdGhlIGNvbnRyYWN0LgAAuMqbWLNiCWdldHBsYXllcv0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHBsYXllcgpzdW1tYXJ5OiAnR2V0IHBsYXllciBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBsYXllciBpbmNsdWRpbmcgYmFsYW5jZSwgZGVidCwgbmV0d29ydGgsIGVudGl0eSBjb3VudHMsIGFuZCBwcmljaW5nIGZvciBuZXh0IHB1cmNoYXNlcy4gUmV0dXJucyBpc19wbGF5ZXI9ZmFsc2UgaWYgdGhlIGFjY291bnQgaGFzIG5vdCBqb2luZWQgdGhlIGdhbWUuoLLJ+NFbs2IMZ2V0cHJvanN0YXRlywMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cHJvanN0YXRlCnN1bW1hcnk6ICdHZXQgcHJvamVjdGVkIGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHByb2plY3RlZCBzdGF0ZSBvZiBhbiBlbnRpdHkgYWZ0ZXIgYXBwbHlpbmcgdGhlIG5leHQgdGFza19jb3VudCBzY2hlZHVsZWQgdGFza3MgKG9yIGFsbCB0YXNrcyBpZiB0YXNrX2NvdW50IGlzIG9taXR0ZWQpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHByZXZpZXcgdGhlIHJlc3VsdCBvZiBhbiBlbnRpdHkncyBzY2hlZHVsZSB3aXRob3V0IHJlc29sdmluZyBvbi1jaGFpbi4AAFDVIXWzYglnZXRyZWNpcGWmAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZWNpcGUKc3VtbWFyeTogJ0dldCBhIHNpbmdsZSBjcmFmdGluZyByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSByZWNpcGUgd2hvc2Ugb3V0cHV0IG1hdGNoZXMgdGhlIGdpdmVuIGl0ZW0gaWQsIGluY2x1ZGluZyBpdHMgaW5wdXRzLCBibGVuZCB3ZWlnaHRzLCBzdGF0IHNsb3RzLCBhbmQgcmVzb2x2ZWQgaXRlbSBtYXNzIGluZm8uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGlzcGxheSBjcmFmdGluZyByZXF1aXJlbWVudHMuAABW1SF1s2IKZ2V0cmVjaXBlc6wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4AAM4GYXWzYgpnZXRyZXNjYXRzngMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzY2F0cwpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIGNhdGVnb3J5IGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAob3JlLCBnYXMsIHJlZ29saXRoLCBiaW9tYXNzLCBjcnlzdGFsKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgcmVzb3VyY2Ugc3VidHlwZSBpZGVudGlmaWVycy4AsNpXYXWzYgtnZXRyZXNlcnZlc/wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc2VydmVzCnN1bW1hcnk6ICdHZXQgY3VycmVudCByZXNlcnZlIG1vZGlmaWNhdGlvbnMgYXQgYSBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyB0aGUgY2hhaW4ncyBtb2RpZmljYXRpb25zIHRvIGRlcml2ZWQgcmVzZXJ2ZXMgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGUgZm9yIHRoZSBjdXJyZW50IGVwb2NoIGFzIGEgbGlzdCBvZiB7c3RyYXR1bSwgcmVtYWluaW5nfSBwYWlycy4gU3RyYXRhIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZSB1c2UgdGhlaXIgZGVyaXZlZCBpbml0aWFsIHJlc2VydmUuIENvbXBvc2Ugd2l0aCBTREsgZGVyaXZhdGlvbiB0byBnZXQgdGhlIGZ1bGwgcGVyLWxvY2F0aW9uIHN0cmF0YSB2aWV3LoAVuppidbNiDGdldHJlc291cmNlc4cDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc291cmNlcwpzdW1tYXJ5OiAnR2V0IGFsbCByZXNvdXJjZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIHJlc291cmNlcywgaW5jbHVkaW5nIGVhY2ggcmVzb3VyY2UncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGdhdGhlcmFibGUgbWF0ZXJpYWxzLgAAADjTiLNiCGdldHNsb3RzuwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c2xvdHMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc2xvdCBsYXlvdXRzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgbW9kdWxlIHNsb3QgbGF5b3V0IGZvciBldmVyeSBlbnRpdHkgaXRlbSB0eXBlLCBsaXN0aW5nIHRoZSBvcmRlcmVkIHNsb3QgdHlwZXMgYXZhaWxhYmxlIGZvciBtb2R1bGUgaW5zdGFsbGF0aW9uLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRldGVybWluZSB3aGljaCBtb2R1bGUgdHlwZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBhIGdpdmVuIGVudGl0eSBodWxsLgCA1NncjLNiCmdldHN0cmF0dW3SAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdHJhdHVtCnN1bW1hcnk6ICdHZXQgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHJlc291cmNlIHN0cmF0dW0gZGF0YSBmb3IgYSBzcGVjaWZpYyBkZXB0aCBsYXllciBhdCBhIGNvb3JkaW5hdGUsIGluY2x1ZGluZyB0aGUgc3RyYXR1bSBzZWVkIGluZm8gYW5kIGRlcml2ZWQgcmVzb3VyY2Ugc3RhdHMugJW7RkqNs2IMZ2V0c3VtbWFyaWVz6AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3VtbWFyaWVzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHN1bW1hcmllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgbGlnaHR3ZWlnaHQgc3VtbWFyaWVzIG9mIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllciBpbmNsdWRpbmcgdHlwZSwgaWQsIG93bmVyLCBuYW1lLCBsb2NhdGlvbiwgYW5kIGlkbGUgc3RhdHVzLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4Aotrm5qrpZQtncm91cHRyYXZlbJoELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdyb3VwdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIG11bHRpcGxlIGVudGl0aWVzIHRvZ2V0aGVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSBncm91cCB0cmF2ZWwgZm9yIG11bHRpcGxlIGVudGl0aWVzIHRvIGEgZGVzdGluYXRpb24uIEFsbCBlbnRpdGllcyBtdXN0IGJlIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFuZCBvd25lZCBieSB0aGUgY2FsbGVyLiBBdCBsZWFzdCBvbmUgZW50aXR5IHdpdGggZW5naW5lcyBpcyByZXF1aXJlZCB0byBwcm92aWRlIHRocnVzdC4gRmxpZ2h0IGR1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgZnJvbSBjb21iaW5lZCB0aHJ1c3QgYW5kIHRvdGFsIG1hc3Mgb2YgYWxsIGVudGl0aWVzLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGZvciBhdG9taWMgcmVzb2x1dGlvbiBhbmQgY2FuY2VsbGF0aW9uLgAAAAAA0LBpBGhhc2j4AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhMjU2IGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTI1NiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAQITSsGkHaGFzaDUxMvsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2g1MTIKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGE1MTIgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhNTEyIGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4AKLsG5UurdAtpbXBvcnRjYXJnbwDgs8tT5UurdAxpbXBvcnRlbnRpdHkAAKqml+VLq3QLaW1wb3J0Z3JvdXAAcJU3seZLq3QMaW1wb3J0cGxheWVyALqvwurmS6t0DWltcG9ydHJlc2VydmUAAFQ2GedLq3QLaW1wb3J0c3RhdGUAAAAAAAAwHX0Eam9pbsQBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGpvaW4Kc3VtbWFyeTogJ0pvaW4gYSBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpKb2luIGEgZ2FtZSBvZiBTaGlwbG9hZAAAAAAAkAyNBGxvYWQAAACIVzPp8poJbmZ0aW1ndXJssgMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogbmZ0aW1ndXJsCnN1bW1hcnk6ICdHZXQgTkZUIGltYWdlIFVSTCBmb3IgYSBjYXJnbyBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgaW1hZ2UgVVJMIHRoZSBjb250cmFjdCBlbWl0cyBmb3IgYSBnaXZlbiBjYXJnbyBpdGVtLCBvcHRpb25hbGx5IHNjb3BlZCB0byBhIGxvY2F0aW9uLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBORlQgcmVuZGVyZXJzIHRvIGZldGNoIHRoZSBjYW5vbmljYWwgYXJ0d29yayBmb3IgYW4gaXRlbSBvciBwYWNrZWQgZW50aXR5LgAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAZdcghUysCnBsYWNlY2FyZ2/JBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBwbGFjZWNhcmdvCnN1bW1hcnk6ICdSZXN0b3JlIE5GVCBjYXJnbyBvbnRvIGEgaG9zdCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IHRoZSBwbGF0Zm9ybSBjb250cmFjdCBvbmx5LiBSZXN0b3JlcyB0aGUgY2FyZ28gcmVjb3JkZWQgaW4gYW4gdW53cmFwcGVkIE5GVCBvbnRvIGEgaG9zdCBlbnRpdHkuIFZhbGlkYXRlcyBob3N0IG93bmVyc2hpcCwgbG9hZGVycywgYW5kIHJlbWFpbmluZyBjYXBhY2l0eSwgZGVzZXJpYWxpemVzIHRoZSBORlQncyBpdGVtIGRhdGEsIGFuZCBhcHBlbmRzIGFuIHVud3JhcCB0YXNrIHRvIGRlbGl2ZXIgdGhlIGNhcmdvIHRvIHRoZSBob3N0LiBUaGUgcGxhdGZvcm0gY29udHJhY3QgY3JlZGl0cyB0aGUgZGVwb3NpdCByZWZ1bmQgYW5kIGJ1cm5zIHRoZSBhc3NldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgB8dnkqhUysC3BsYWNlZW50aXR5wAQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcGxhY2VlbnRpdHkKc3VtbWFyeTogJ01hdGVyaWFsaXplIGEgcGFja2VkLWVudGl0eSBORlQgYXMgYSBsaXZlIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIGNhbGxlZCBpbmxpbmUgYnkgdGhlIHBsYXRmb3JtIGNvbnRyYWN0IG9ubHkuIEVtcGxhY2VzIGEgbGl2ZSBvcmJpdGFsIHZlc3NlbCAoc2hpcCBvciBjb250YWluZXIpIGZyb20gaXRzIHBhY2tlZC1lbnRpdHkgTkZUIGRhdGEgYXQgdGhlIHJlY29yZGVkIHdyYXAgb3JpZ2luLCB0aGVuIHF1ZXVlcyB0cmF2ZWwgYW5kIHJlY2hhcmdlIHRhc2tzIHRvIGRlbGl2ZXIgaXQgdG8gdGhlIHRhcmdldCBuZXh1cyBhdCBmdWxsIGVuZXJneS4gVGhlIHBsYXRmb3JtIGNvbnRyYWN0IGNyZWRpdHMgdGhlIGRlcG9zaXQgcmVmdW5kIGFuZCBidXJucyB0aGUgYXNzZXQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAACKXdOQughyZWNoYXJnZc0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlY2hhcmdlCnN1bW1hcnk6ICdSZWNoYXJnZSBzaGlwIGVuZXJneScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2NoZWR1bGUgYSByZWNoYXJnZSB0YXNrIGZvciBhbiBlbnRpdHkgdG8gcmVzdG9yZSBlbmVyZ3kgdG8gZnVsbCBjYXBhY2l0eS4gVGhlIHJlY2hhcmdlIGR1cmF0aW9uIGRlcGVuZHMgb24gY3VycmVudCBlbmVyZ3kgbGV2ZWwgYW5kIHJlY2hhcmdlIHJhdGUu4LPLUzV8l7oMcmVmcnNoZW50aXR5uAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVmcnNoZW50aXR5CnN1bW1hcnk6ICdSZWZyZXNoIGRlcml2ZWQgZW50aXR5IHN0YXRlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZWNvbXB1dGUgZGVyaXZlZCBmaWVsZHMgb24gYW4gZW50aXR5IGZyb20gaXRzIGN1cnJlbnQgY2FyZ28gYW5kIG1vZHVsZXMsIHJlZnJlc2hpbmcgY2FwYWJpbGl0eSBzdGF0cyBhbmQgY2FyZ28gbWFzcy4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBubyBzY2hlZHVsZWQgdGFza3MuIFVzZWQgdG8gcmVjb25jaWxlIGRlcml2ZWQgc3RhdGUgYWZ0ZXIgZGF0YSBtaWdyYXRpb25zIG9yIGNvbnRyYWN0IHVwZ3JhZGVzLqAiMpeqTaW6DHJlbW92ZW9yYWNsZQAAAAAAKGmmugZyZW5hbWUAAAAAQO1IsboHcmVzb2x2ZdADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlc29sdmUKc3VtbWFyeTogJ0NvbXBsZXRlIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVzb2x2ZSBjb21wbGV0ZWQgdGFza3MgaW4gYW4gZW50aXR5J3Mgc2NoZWR1bGUsIGFwcGx5aW5nIHRoZWlyIGVmZmVjdHMgKHJlY2hhcmdlIGVuZXJneSwgdXBkYXRlIGxvY2F0aW9uLCBsb2FkL3VubG9hZCBjYXJnbykuIElmIGNvdW50IGlzIHNwZWNpZmllZCwgcmVzb2x2ZSBleGFjdGx5IHRoYXQgbWFueSB0YXNrczsgb3RoZXJ3aXNlIHJlc29sdmUgYWxsIGNvbXBsZXRlZCB0YXNrcy4gRmFpbHMgaWYgY291bnQgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlZCB0YXNrcy4AQIxG7UixugpyZXNvbHZlYWxsAAAAAABEo7a6BnJldmVhbAAAAAAq6kSlvAhybW1vZHVsZbwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJtbW9kdWxlCnN1bW1hcnk6ICdSZW1vdmUgYSBtb2R1bGUgZnJvbSBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlbW92ZSBhbiBpbnN0YWxsZWQgbW9kdWxlIGZyb20gYSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSBpcyByZXR1cm5lZCB0byBjYXJnby4gRmFpbHMgaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBoYXZlIGVub3VnaCBjYXJnbyBjYXBhY2l0eSB0byBob2xkIHRoZSByZXR1cm5lZCBtb2R1bGUuAAAAbKG8prwIcm1uZnRjZmehAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW5mdGNmZwpzdW1tYXJ5OiAnUmVtb3ZlIE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgdGhlIEF0b21pY0Fzc2V0cyB0ZW1wbGF0ZSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gaWQgZnJvbSB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIEFmdGVyIHJlbW92YWwgdGhlIGl0ZW0gY2FuIG5vIGxvbmdlciBiZSB3cmFwcGVkIG9yIHVud3JhcHBlZCB1bnRpbCBhIG5ldyBtYXBwaW5nIGlzIHNldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAYAvlNbPCCXNldG5mdGNmZ8QDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNldG5mdGNmZwpzdW1tYXJ5OiAnU2V0IE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpCaW5kIGFuIGl0ZW0gaWQgdG8gYW4gQXRvbWljQXNzZXRzIHRlbXBsYXRlIGlkIGFuZCBzY2hlbWEgbmFtZS4gVXNlZCB0byBjb25maWd1cmUgaG93IHRoZSBjb250cmFjdCBtaW50cyBhbmQgcmVjb2duaXplcyBORlRzIGZvciBhIGdpdmVuIGl0ZW0uIEluc2VydHMgYSBuZXcgbWFwcGluZyBpZiBvbmUgZG9lcyBub3QgZXhpc3QsIG9yIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIG1hcHBpbmcuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS6QIm1Y3ZazwgxzZXR0aHJlc2hvbGQAADKmqJrLs8ILc2V0d3JhcGNvc3QAAIBSq5rLs8IKc2V0d3JhcGZlZQAAAKDsGsRpxglzdG93Y2FyZ2/VBS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzdG93Y2FyZ28Kc3VtbWFyeTogJ1Jlc2VydmUgYSBjYXJnbyBzdGFjayBmb3Igd3JhcHBpbmcgaW50byBhbiBORlQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IHRoZSBwbGF0Zm9ybSBjb250cmFjdCBvbmx5LiBSZXNlcnZlcyBhbmQgY29uc3VtZXMgYSBjYXJnbyBzdGFjayBvbiBhIGxpdmUgZW50aXR5IGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVC4gVmFsaWRhdGVzIGVudGl0eSBvd25lcnNoaXAsIGxvYWRlcnMsIGFuZCBwcmVzZW5jZSBhdCB0aGUgbmV4dXMsIGFuZCBjb25maXJtcyB0aGUgdGFyZ2V0IGNhcmdvIHN0YWNrIGlzIGF2YWlsYWJsZSBhbmQgbm90IHJlc2VydmVkIGJ5IGEgcGVuZGluZyB0YXNrLiBDb21wdXRlcyB0aGUgd3JhcCBjb3N0IGFuZCBmZWUsIGRlYml0cyB0aGVtIGZyb20gdGhlIG93bmVyJ3MgcGxhdGZvcm0gZGVwb3NpdCBiYWxhbmNlLCBkZXJpdmVzIHRoZSBORlQncyBpbW11dGFibGUgZGF0YSwgYW5kIG1pbnRzIHRoZSBORlQgaW5saW5lIGFzIHRoZSBnYW1lIGNvbnRyYWN0IGJlZm9yZSBjb25zdW1pbmcgdGhlIGNhcmdvLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAIDPLk/FacYKc3Rvd2VudGl0eZkFLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHN0b3dlbnRpdHkKc3VtbWFyeTogJ1Jlc2VydmUgYW4gZW50aXR5IGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIGNhbGxlZCBpbmxpbmUgYnkgdGhlIHBsYXRmb3JtIGNvbnRyYWN0IG9ubHkuIFJlc2VydmVzIGEgd2hvbGUgZW50aXR5IChzaGlwLCBjb250YWluZXIsIG9yIHBsYW5ldGFyeSBzdHJ1Y3R1cmUpIGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVC4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBlbXB0eSBjYXJnbyBhbmQgbm8gc2NoZWR1bGVkIHRhc2tzLiBDb21wdXRlcyB0aGUgd3JhcCBjb3N0IGFuZCBmZWUsIGRlYml0cyB0aGVtIGZyb20gdGhlIG93bmVyJ3MgcGxhdGZvcm0gZGVwb3NpdCBiYWxhbmNlLCBkZXJpdmVzIHRoZSBlbnRpdHkgTkZUJ3MgaW1tdXRhYmxlIGRhdGEsIG1pbnRzIHRoZSBORlQgaW5saW5lIGFzIHRoZSBnYW1lIGNvbnRyYWN0LCBhbmQgZXJhc2VzIHRoZSBlbnRpdHkgZnJvbSB0aGUgd29ybGQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AgIo6UVkNxwpzd2FwbW9kdWxlAAAAAABEtc3NBnRyYXZlbPsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBhIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIHRyYXZlbCBvZiBhbiBlbnRpdHkgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBhIG5ldyBkZXN0aW5hdGlvbi4AAACexqrS1Ah1bmRlcGxveecELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHVuZGVwbG95CnN1bW1hcnk6ICdQYWNrIGEgZGVwbG95ZWQgZW50aXR5IGludG8gYSBob3N0JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpQYWNrIGFuIGVudGl0eSBpbnRvIGEgaG9zdCBlbnRpdHkncyBjYXJnbyBhcyBhIHBhY2tlZC1lbnRpdHkgaXRlbS4gSG9zdCBhbmQgdGFyZ2V0IG11c3Qgc2hhcmUgdGhlIHNhbWUgb3duZXIgYW5kIGNvb3JkaW5hdGVzLCB0aGUgaG9zdCBtdXN0IGhhdmUgbG9hZGVycyBhbmQgZW5vdWdoIGNhcGFjaXR5IGZvciB0aGUgcGFja2VkIG1hc3MsIGFuZCB0aGUgdGFyZ2V0IG11c3QgYmUgaWRsZSB3aXRoIGVtcHR5IGNhcmdvLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGFuZCBzY2hlZHVsZXMgdW5kZXBsb3kgdGFza3Mgb24gYm90aCBlbnRpdGllczsgb24gcmVzb2x1dGlvbiB0aGUgdGFyZ2V0IGlzIGVyYXNlZCBhbmQgdGhlIHBhY2tlZCBlbnRpdHkgaXMgYWRkZWQgdG8gdGhlIGhvc3QncyBjYXJnby4gSW52ZXJzZSBvZiBkZXBsb3kuAAAAACRD49QGdW5sb2FkAAAAAAAAUK/hBHdhcnCfAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3YXJwCnN1bW1hcnk6ICdXYXJwIHRvIGEgZGVzdGluYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluc3RhbnRseSB0ZWxlcG9ydCBhbiBlbnRpdHkgdG8gYSBkZXN0aW5hdGlvbiBzeXN0ZW0uIFJlcXVpcmVzIHdhcnAgY2FwYWJpbGl0eSwgZnVsbCBlbmVyZ3ksIGVtcHR5IGNhcmdvLCBhbmQgYW4gZW1wdHkgc2NoZWR1bGUuIFRoZSBkZXN0aW5hdGlvbiBtdXN0IGJlIGEgdmFsaWQgc3lzdGVtIHdpdGhpbiB3YXJwIHJhbmdlLiBSZXNvbHZlcyBpbW1lZGlhdGVseSBhcyBhIHplcm8tZHVyYXRpb24gdGFzay4AAAAAAKCq4wR3aXBlsgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2lwZQpzdW1tYXJ5OiAnREVCVUc6IHdpcGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tEQAAAAAAyq5BA2k2NAAACWNhcmdvX3JvdwAAAABg6UxEA2k2NAAACWNsYWltX3JvdwAAAABkJyVFA2k2NAAACmNvbW1pdF9yb3cAAAAA+OzyVANpNjQAAAplbnRpdHlfcm93AKqml/ns8lQDaTY0AAAPZW50aXR5Z3JvdXBfcm93AACwCvvs8lQDaTY0AAAOZW50aXR5X3NlcV9yb3cAAAAAgIZoVQNpNjQAAAllcG9jaF9yb3cAAGBuTYrymgNpNjQAAA1uZnRjb25maWdfcm93AABgC6mIzKUDaTY0AAARb3JhY2xlX2NvbmZpZ19yb3cAAAAAq4jMpQNpNjQAAApvcmFjbGVfcm93AAAAAFzlTawDaTY0AAAKcGxheWVyX3JvdwAAAEDtq7C6A2k2NAAAC3Jlc2VydmVfcm93AAAAAESjtroDaTY0AAAKcmV2ZWFsX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwAAAAAArKrPA2k2NAAACXR5cGVzX3JvdwAAc2tSVM3lA2k2NAAADndyYXBjb25maWdfcm93AAAAGVNUzeUDaTY0AAAMd3JhcGNvc3Rfcm93ARFTaGlwbG9hZCAoU2VydmVyKRFTaGlwbG9hZCAoU2VydmVyKQAAADUAAMg01hSdPgx0YXNrX3Jlc3VsdHMAAAAARIWmQQ5jYW5jZWxfcmVzdWx0cwAAyDRW6UxEDHRhc2tfcmVzdWx0cwAAAACAvMxFDHRhc2tfcmVzdWx0cwAAAA27SKVKDHRhc2tfcmVzdWx0cwAAAAB4GqtKDHRhc2tfcmVzdWx0cwCAzy5PhbBKBnN0cmluZwAAAABc1bJhDHRhc2tfcmVzdWx0cwAAYG5NirJiC2dhbWVfY29uZmlnAEB2mFaVsmIOZXh0ZW5kZWRfYXNzZXQAVDyOuaiyYgh1aW50MTZbXQAAwBHlqbJiC2VudW1fcmVzdWx0ALBy2eWpsmINZW50aXR5X2luZm9bXQAA8NnlqbJiC2VudGl0eV9pbmZvAEw2SarssmIPaXRlbWRhdGFfcmVzdWx0AABOTqrssmIPaXRlbV9pZHNfcmVzdWx0AAAAWKrssmIKaXRlbXNfaW5mbwBU9Vmq7LJiBXVpbnQ4gFX1WarssmILZW51bV9yZXN1bHQATFYyTQezYhBraW5kX21ldGFfcmVzdWx0ACZ12SAas2INbG9jYXRpb25faW5mbwCAySYhGrNiEGxvY2F0aW9uX2Rlcml2ZWQAsKo+JyqzYgtlbnVtX3Jlc3VsdAAAVlEnKrNiDm1vZHVsZXNfcmVzdWx0AADw5xo1s2ILbmVhcmJ5X2luZm8AgMLm5DWzYghzdHJpbmdbXQAAXdPlNbNiDm5mdGluZm9fcmVzdWx0AAC4yptYs2ILcGxheWVyX2luZm+gssn40VuzYg9wcm9qZWN0ZWRfc3RhdGUAAFDVIXWzYg5yZWNpcGVzX3Jlc3VsdAAAVtUhdbNiDnJlY2lwZXNfcmVzdWx0AADOBmF1s2ILZW51bV9yZXN1bHQAsNpXYXWzYhNzdHJhdHVtX3JlbWFpbmluZ1tdgBW6mmJ1s2IQcmVzb3VyY2VzX3Jlc3VsdAAAADjTiLNiFWVudGl0eV9sYXlvdXRzX3Jlc3VsdACA1NncjLNiDHN0cmF0dW1fZGF0YYCVu0ZKjbNiEGVudGl0eV9zdW1tYXJ5W10Aotrm5qrpZQx0YXNrX3Jlc3VsdHMAAAAAANCwaQtjaGVja3N1bTI1NgAAAECE0rBpC2NoZWNrc3VtNTEyAAAAAACQDI0MdGFza19yZXN1bHRzAACIVzPp8poGc3RyaW5nAABl1yCFTKwMdGFza19yZXN1bHRzAHx2eSqFTKwMdGFza19yZXN1bHRzAAAAil3TkLoMdGFza19yZXN1bHRzAAAAQO1IsboPcmVzb2x2ZV9yZXN1bHRzAECMRu1IsboScmVzb2x2ZWFsbF9yZXN1bHRzAACg7BrEacYMdGFza19yZXN1bHRzAIDPLk/FacYMdGFza19yZXN1bHRzAAAAAES1zc0MdGFza19yZXN1bHRzAAAAnsaq0tQMdGFza19yZXN1bHRzAAAAACRD49QMdGFza19yZXN1bHRzAAAAAABQr+EMdGFza19yZXN1bHRz');
|
|
443
|
+
const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDiyAQlhZGRtb2R1bGUABAllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgp0YXJnZXRfcmVmCmNhcmdvX3JlZj8IYWRkbmV4dXMAAwpuZXh1c19uYW1lBnN0cmluZwF4BWludDY0AXkFaW50NjQJYWRkb3JhY2xlAAEJb3JhY2xlX2lkBG5hbWUFYmxlbmQAAgJpZAZ1aW50NjQGaW5wdXRzDGNhcmdvX2l0ZW1bXQlidWlsZHBsb3QAAgpidWlsZGVyX2lkBnVpbnQ2NAdwbG90X2lkBnVpbnQ2NAZjYW5jZWwAAwJpZAZ1aW50NjQIbGFuZV9rZXkFdWludDgFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABQdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhxdWFudGl0eQZ1aW50MzIJZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcmVmAAQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10JZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcm93AAcCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdC3NlcXVlbmNlX2lkB3VpbnQ2ND8KY2FyZ29fdmlldwAGB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHF1YW50aXR5BnVpbnQzMgJpZAZ1aW50NjQJZW50aXR5X2lkB3VpbnQ2ND8JY2xhaW1fcm93AAEFb3duZXIEbmFtZQljbGFpbXBsb3QAAwpidWlsZGVyX2lkBnVpbnQ2NA50YXJnZXRfaXRlbV9pZAZ1aW50MTYGY29vcmRzC2Nvb3JkaW5hdGVzDGNsYWltc3RhcnRlcgABBW93bmVyBG5hbWUJY2xlYW5yc3ZwAAIFZXBvY2gGdWludDY0CG1heF9yb3dzBnVpbnQ2NApjbGVhcnRhYmxlAAMKdGFibGVfbmFtZQRuYW1lBXNjb3BlBW5hbWU/CG1heF9yb3dzB3VpbnQ2ND8GY29tbWl0AAMJb3JhY2xlX2lkBG5hbWUFZXBvY2gGdWludDY0BmNvbW1pdAtjaGVja3N1bTI1Ngpjb21taXRfcm93AAQCaWQGdWludDY0BWVwb2NoBnVpbnQ2NAlvcmFjbGVfaWQEbmFtZQZjb21taXQLY2hlY2tzdW0yNTYJY29uZmlnbG9nAAEGY29uZmlnC2dhbWVfY29uZmlnC2Nvb3JkaW5hdGVzAAMBeAVpbnQ2NAF5BWludDY0AXoHdWludDE2PwVjcmFmdAAGAmlkBnVpbnQ2NAlyZWNpcGVfaWQGdWludDE2CHF1YW50aXR5BnVpbnQzMgZpbnB1dHMMY2FyZ29faXRlbVtdBnRhcmdldAd1aW50NjQ/BHNsb3QGdWludDg/DGNyYWZ0ZXJfbGFuZQAECnNsb3RfaW5kZXgFdWludDgFc3BlZWQGdWludDE2BWRyYWluBnVpbnQzMgpvdXRwdXRfcGN0BnVpbnQxNghkZW1vbGlzaAABCWVudGl0eV9pZAZ1aW50NjQGZGVwbG95AAICaWQGdWludDY0A3JlZgljYXJnb19yZWYKZGVzY2VudGl0eQAEB2l0ZW1faWQGdWludDE2Cmh1bGxfc3RhdHMGdWludDY0DG1vZHVsZV9pdGVtcwh1aW50MTZbXQxtb2R1bGVfc3RhdHMIdWludDY0W10GZW5hYmxlAAEHZW5hYmxlZARib29sDGVuZXJneV9zdGF0cwACCGNhcGFjaXR5BnVpbnQzMghyZWNoYXJnZQZ1aW50MzIUZW50aXR5X2N1cnJlbnRfc3RhdGUAAgtjb29yZGluYXRlcwtjb29yZGluYXRlcwZlbmVyZ3kGdWludDMyD2VudGl0eV9kZWZhdWx0cwACC3dhcmVob3VzZV96BnVpbnQxNgtjb250YWluZXJfegZ1aW50MTYLZW50aXR5X2luZm8AFQR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzB2l0ZW1faWQGdWludDE2CWNhcmdvbWFzcwZ1aW50MzIFY2FyZ28MY2FyZ29fdmlld1tdB21vZHVsZXMObW9kdWxlX2VudHJ5W10GZW5lcmd5B3VpbnQzMj8IaHVsbG1hc3MHdWludDMyPwhjYXBhY2l0eQd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8GaGF1bGVyDWhhdWxlcl9zdGF0cz8OZ2F0aGVyZXJfbGFuZXMPZ2F0aGVyZXJfbGFuZVtdDWNyYWZ0ZXJfbGFuZXMOY3JhZnRlcl9sYW5lW10MbG9hZGVyX2xhbmVzDWxvYWRlcl9sYW5lW10FbGFuZXMGbGFuZVtdBWhvbGRzBmhvbGRbXQ1lbnRpdHlfbGF5b3V0AAIOZW50aXR5X2l0ZW1faWQGdWludDE2BXNsb3RzCnNsb3RfZGVmW10VZW50aXR5X2xheW91dHNfcmVzdWx0AAEIZW50aXRpZXMPZW50aXR5X2xheW91dFtdCmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKZW50aXR5X3JvdwAMAmlkBnVpbnQ2NAVvd25lcgRuYW1lBGtpbmQEbmFtZQdpdGVtX2lkBnVpbnQxNgRuYW1lBnN0cmluZwVzdGF0cwZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdBWxhbmVzBmxhbmVbXQVob2xkcwZob2xkW10OZW50aXR5X3NlcV9yb3cAAQduZXh0X2lkBnVpbnQ2NA5lbnRpdHlfc3VtbWFyeQAIBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMHaXNfaWRsZQRib29sDnJlc29sdmVkX2NvdW50BnVpbnQzMg1wZW5kaW5nX2NvdW50BnVpbnQzMhBlbnRpdHlfdGFza19pbmZvAAQJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lCnRhc2tfY291bnQFdWludDgQc2NoZWR1bGVfc3RhcnRlZAp0aW1lX3BvaW50D2VudGl0eWdyb3VwX3JvdwACAmlkBnVpbnQ2NAxwYXJ0aWNpcGFudHMMZW50aXR5X3JlZltdC2VudW1fbWVtYmVyAAIFdmFsdWUFdWludDgEbmFtZQZzdHJpbmcLZW51bV9yZXN1bHQAAQdtZW1iZXJzDWVudW1fbWVtYmVyW10JZXBvY2hfcm93AAQFZXBvY2gGdWludDY0Cm9yYWNsZV9pZHMGbmFtZVtdCXRocmVzaG9sZAV1aW50OARzZWVkC2NoZWNrc3VtMjU2DGZpeGNhcmdvbWFzcwABCWVudGl0eV9pZAZ1aW50NjQLZm9yY2VyZXZlYWwAAQVlcG9jaAZ1aW50NjQLZ2FtZV9jb25maWcAAwd2ZXJzaW9uBnVpbnQzMghkZWZhdWx0cw9lbnRpdHlfZGVmYXVsdHMFaXRlbXMKaXRlbV9kZWZbXQZnYXRoZXIABQlzb3VyY2VfaWQGdWludDY0DmRlc3RpbmF0aW9uX2lkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIEc2xvdAZ1aW50OD8NZ2F0aGVyZXJfbGFuZQAFCnNsb3RfaW5kZXgFdWludDgFeWllbGQGdWludDE2BWRyYWluBnVpbnQzMgVkZXB0aAZ1aW50MTYKb3V0cHV0X3BjdAZ1aW50MTYMZ2VuZXNpc2ZsZWV0AAEIZW50aXRpZXMMZW50aXR5X3Jvd1tdCWdldGNvbmZpZwAACmdldGRlcG9zaXQAAgVvd25lcgRuYW1lCGFzc2V0X2lkBnVpbnQ2NAtnZXRkaXN0YW5jZQAEAmF4BWludDY0AmF5BWludDY0AmJ4BWludDY0AmJ5BWludDY0C2dldGVsaWdpYmxlAAIGY29vcmRzC2Nvb3JkaW5hdGVzB3N0cmF0dW0GdWludDE2CWdldGVudGNscwAAC2dldGVudGl0aWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwlnZXRlbnRpdHkAAQllbnRpdHlfaWQGdWludDY0C2dldGl0ZW1kYXRhAAAKZ2V0aXRlbWlkcwAACGdldGl0ZW1zAAALZ2V0aXRlbXR5cGUAAQdpdGVtX2lkBnVpbnQxNgxnZXRpdGVtdHlwZXMAAAtnZXRraW5kbWV0YQAAC2dldGxvY2F0aW9uAAIBeAVpbnQ2NAF5BWludDY0CmdldGxvY2RhdGEAAgF4BWludDY0AXkFaW50NjQLZ2V0bW9kdHlwZXMAAApnZXRtb2R1bGVzAAAJZ2V0bmVhcmJ5AAIJZW50aXR5X2lkBnVpbnQ2NAhyZWNoYXJnZQRib29sCmdldG5mdGJhc2UAAApnZXRuZnRpbmZvAAAJZ2V0cGxheWVyAAEHYWNjb3VudARuYW1lDGdldHByb2pzdGF0ZQACCWVudGl0eV9pZAZ1aW50NjQKdGFza19jb3VudAZ1aW50OD8JZ2V0cmVjaXBlAAEOb3V0cHV0X2l0ZW1faWQGdWludDE2CmdldHJlY2lwZXMAAgtsb3dlcl9ib3VuZAZ1aW50MTYFbGltaXQFdWludDgKZ2V0cmVzY2F0cwAAC2dldHJlc2VydmVzAAIBeAVpbnQ2NAF5BWludDY0DGdldHJlc291cmNlcwAACGdldHNsb3RzAAAKZ2V0c3RyYXR1bQADAXgFaW50NjQBeQVpbnQ2NAdzdHJhdHVtBnVpbnQxNgxnZXRzdW1tYXJpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/C2dldHdvcm1ob2xlAAIBeAVpbnQ2NAF5BWludDY0DGdyb3VwdHJhbnNpdAAFCGVudGl0aWVzDGVudGl0eV9yZWZbXQJheAVpbnQ2NAJheQVpbnQ2NAJieAVpbnQ2NAJieQVpbnQ2NAtncm91cHRyYXZlbAAECGVudGl0aWVzDGVudGl0eV9yZWZbXQF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbARoYXNoAAEFdmFsdWUGc3RyaW5nB2hhc2g1MTIAAQV2YWx1ZQZzdHJpbmcMaGF1bGVyX3N0YXRzAAMIY2FwYWNpdHkFdWludDgKZWZmaWNpZW5jeQZ1aW50MTYFZHJhaW4GdWludDMyBGhvbGQABQJpZAZ1aW50NjQEa2luZAV1aW50OAtjb3VudGVycGFydAplbnRpdHlfcmVmBXVudGlsCnRpbWVfcG9pbnQNaW5jb21pbmdfbWFzcwZ1aW50MzILaW1wb3J0Y2FyZ28AAQNyb3cJY2FyZ29fcm93DGltcG9ydGVudGl0eQABA3JvdwplbnRpdHlfcm93C2ltcG9ydGdyb3VwAAEDcm93D2VudGl0eWdyb3VwX3JvdwxpbXBvcnRwbGF5ZXIAAQVvd25lcgRuYW1lDWltcG9ydHJlc2VydmUAAgtlcG9jaF9zY29wZQZ1aW50MzIDcm93C3Jlc2VydmVfcm93C2ltcG9ydHN0YXRlAAEDcm93CXN0YXRlX3JvdwhpdGVtX2RlZgAFAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgR0eXBlBXVpbnQ4B3N1YnR5cGUFdWludDgEdGllcgV1aW50OAxpdGVtX2lkX3BhaXIAAgJpZAZ1aW50MTYEbmFtZQZzdHJpbmcPaXRlbV9pZHNfcmVzdWx0AAEFaXRlbXMOaXRlbV9pZF9wYWlyW10PaXRlbWRhdGFfcmVzdWx0AAIFaXRlbXMKaXRlbV9kZWZbXQdyZWNpcGVzDnJlY2lwZXNfcmVzdWx0Cml0ZW1zX2luZm8AAQVpdGVtcwppdGVtX2RlZltdBGpvaW4AAQdhY2NvdW50BG5hbWUQa2luZF9tZXRhX3Jlc3VsdAACBWtpbmRzD2tpbmRfbWV0YV9yb3dbXQl0ZW1wbGF0ZXMTdGVtcGxhdGVfbWV0YV9yb3dbXQ1raW5kX21ldGFfcm93AAUEa2luZARuYW1lDmNsYXNzaWZpY2F0aW9uBXVpbnQ4EGNhcGFiaWxpdHlfZmxhZ3MFdWludDgHel9jb29yZAZ1aW50MzINZGVmYXVsdF9sYWJlbAZzdHJpbmcEbGFuZQACCGxhbmVfa2V5BXVpbnQ4CHNjaGVkdWxlCHNjaGVkdWxlBGxvYWQAAwJpZAZ1aW50NjQHZnJvbV9pZAZ1aW50NjQFaXRlbXMMY2FyZ29faXRlbVtdC2xvYWRlcl9sYW5lAAQKc2xvdF9pbmRleAV1aW50OARtYXNzBnVpbnQzMgZ0aHJ1c3QGdWludDE2Cm91dHB1dF9wY3QGdWludDE2EGxvY2F0aW9uX2Rlcml2ZWQAAgxzdGF0aWNfcHJvcHMPbG9jYXRpb25fc3RhdGljBHNpemUGdWludDE2DWxvY2F0aW9uX2luZm8AAwZjb29yZHMLY29vcmRpbmF0ZXMJaXNfc3lzdGVtBGJvb2wLaXNfd29ybWhvbGUEYm9vbA9sb2NhdGlvbl9zdGF0aWMABQZjb29yZHMLY29vcmRpbmF0ZXMEdHlwZQ1sb2NhdGlvbl90eXBlB3N1YnR5cGUFdWludDgFc2VlZDAFdWludDgFc2VlZDEFdWludDgMbW9kdWxlX2VudHJ5AAIEdHlwZQV1aW50OAlpbnN0YWxsZWQOcGFja2VkX21vZHVsZT8LbW9kdWxlX2luZm8ABAJpZAZ1aW50MTYEbWFzcwZ1aW50MzILbW9kdWxlX3R5cGUFdWludDgEdGllcgV1aW50OA5tb2R1bGVzX3Jlc3VsdAABB21vZHVsZXMNbW9kdWxlX2luZm9bXQ5tb3ZlbWVudF9zdGF0cwACBnRocnVzdAZ1aW50MzIFZHJhaW4GdWludDMyC25lYXJieV9pbmZvAAUKY2FuX3RyYXZlbARib29sB2N1cnJlbnQUZW50aXR5X2N1cnJlbnRfc3RhdGUJcHJvamVjdGVkFGVudGl0eV9jdXJyZW50X3N0YXRlCm1heF9lbmVyZ3kGdWludDMyB3N5c3RlbXMPbmVhcmJ5X3N5c3RlbVtdDW5lYXJieV9zeXN0ZW0ABAhkaXN0YW5jZQZ1aW50NjQLZW5lcmd5X2Nvc3QGdWludDY0C2ZsaWdodF90aW1lBnVpbnQzMghsb2NhdGlvbg1sb2NhdGlvbl9pbmZvDm5mdF9jYXJnb19pdGVtAAQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10IcXVhbnRpdHkGdWludDMyEG5mdF9pdGVtX3BheWxvYWQAAgRpdGVtDm5mdF9jYXJnb19pdGVtCGxvY2F0aW9uDGNvb3JkaW5hdGVzPw5uZnRfc2NoZW1hX2RlZgACC3NjaGVtYV9uYW1lBG5hbWUGZmllbGRzDnNjaGVtYV9maWVsZFtdEG5mdF90ZW1wbGF0ZV9kZWYAAwdpdGVtX2lkBnVpbnQxNgtzY2hlbWFfbmFtZQRuYW1lC3RlbXBsYXRlX2lkBWludDMyDW5mdGNvbmZpZ19yb3cAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lCW5mdGltZ3VybAACBGl0ZW0KY2FyZ29faXRlbQhsb2NhdGlvbgxjb29yZGluYXRlcz8ObmZ0aW5mb19yZXN1bHQAAgdzY2hlbWFzEG5mdF9zY2hlbWFfZGVmW10JdGVtcGxhdGVzEm5mdF90ZW1wbGF0ZV9kZWZbXQZub3RpZnkAAQVldmVudAp0YXNrX2V2ZW50EW9yYWNsZV9jb25maWdfcm93AAEJdGhyZXNob2xkBXVpbnQ4Cm9yYWNsZV9yb3cAAQJpZARuYW1lDXBhY2tlZF9tb2R1bGUAAgdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQKcGxhY2VjYXJnbwADBW93bmVyBG5hbWUHaG9zdF9pZAZ1aW50NjQIYXNzZXRfaWQGdWludDY0C3BsYWNlZW50aXR5AAMFb3duZXIEbmFtZQhhc3NldF9pZAZ1aW50NjQPdGFyZ2V0X25leHVzX2lkBnVpbnQ2NAtwbGF5ZXJfaW5mbwADBW93bmVyBG5hbWUJaXNfcGxheWVyBGJvb2wMY29tcGFueV9uYW1lBnN0cmluZwpwbGF5ZXJfcm93AAEFb3duZXIEbmFtZQ9wcm9qZWN0ZWRfc3RhdGUADgVvd25lcgRuYW1lC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzBmVuZXJneQd1aW50MzI/CWNhcmdvbWFzcwZ1aW50MzIFY2FyZ28MY2FyZ29fdmlld1tdCGh1bGxtYXNzB3VpbnQzMj8IY2FwYWNpdHkHdWludDMyPwdlbmdpbmVzD21vdmVtZW50X3N0YXRzPwR3YXJwC3dhcnBfc3RhdHM/CWdlbmVyYXRvcg1lbmVyZ3lfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/DmdhdGhlcmVyX2xhbmVzD2dhdGhlcmVyX2xhbmVbXQ1jcmFmdGVyX2xhbmVzDmNyYWZ0ZXJfbGFuZVtdDGxvYWRlcl9sYW5lcw1sb2FkZXJfbGFuZVtdCHJlY2hhcmdlAAECaWQGdWludDY0DHJlY2lwZV9pbnB1dAACB2l0ZW1faWQGdWludDE2CHF1YW50aXR5BnVpbnQzMhByZWNpcGVfaXRlbV9pbmZvAAICaWQGdWludDE2BG1hc3MGdWludDMyD3JlY2lwZV9yZXNwb25zZQAHDm91dHB1dF9pdGVtX2lkBnVpbnQxNgtvdXRwdXRfbWFzcwZ1aW50MzIGaW5wdXRzDnJlY2lwZV9pbnB1dFtdCnN0YXRfc2xvdHMUc3RhdF9zbG90X3Jlc3BvbnNlW10NYmxlbmRfd2VpZ2h0cwVieXRlcwtvdXRwdXRfaXRlbRByZWNpcGVfaXRlbV9pbmZvC2lucHV0X2l0ZW1zEnJlY2lwZV9pdGVtX2luZm9bXQ5yZWNpcGVzX3Jlc3VsdAABB3JlY2lwZXMRcmVjaXBlX3Jlc3BvbnNlW10McmVmcnNoZW50aXR5AAEJZW50aXR5X2lkBnVpbnQ2NAxyZW1vdmVvcmFjbGUAAQlvcmFjbGVfaWQEbmFtZQZyZW5hbWUAAgJpZAZ1aW50NjQEbmFtZQZzdHJpbmcLcmVzZXJ2ZV9yb3cABQJpZAZ1aW50NjQIY29vcmRfaWQGdWludDY0B3N0cmF0dW0GdWludDE2CXJlbWFpbmluZwZ1aW50MzIKbGFzdF9ibG9jaxRibG9ja190aW1lc3RhbXBfdHlwZQdyZXNvbHZlAAICaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CnJlc29sdmVhbGwAAQVvd25lcgRuYW1lEnJlc29sdmVhbGxfcmVzdWx0cwACB3NjYW5uZWQGdWludDMyCHJlc29sdmVkBnVpbnQzMg1yZXNvdXJjZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyCGNhdGVnb3J5BXVpbnQ4BHRpZXIFdWludDgOcmVzb3VyY2Vfc3RhdHMAAwVzdGF0MQZ1aW50MTYFc3RhdDIGdWludDE2BXN0YXQzBnVpbnQxNhByZXNvdXJjZXNfcmVzdWx0AAEJcmVzb3VyY2VzD3Jlc291cmNlX2luZm9bXQZyZXZlYWwAAwlvcmFjbGVfaWQEbmFtZQVlcG9jaAZ1aW50NjQGcmV2ZWFsC2NoZWNrc3VtMjU2CnJldmVhbF9yb3cABAJpZAZ1aW50NjQFZXBvY2gGdWludDY0CW9yYWNsZV9pZARuYW1lBnJldmVhbAtjaGVja3N1bTI1NghybW1vZHVsZQADCWVudGl0eV9pZAZ1aW50NjQMbW9kdWxlX2luZGV4BXVpbnQ4CnRhcmdldF9yZWYKY2FyZ29fcmVmPwhybW5mdGNmZwABB2l0ZW1faWQGdWludDE2CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwlzZXRjb29yZHMAAwllbnRpdHlfaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAlzZXRuZnRjZmcAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lDHNldHRocmVzaG9sZAABCXRocmVzaG9sZAV1aW50OAtzZXR3cmFwY29zdAADCWl0ZW1fdHlwZQV1aW50OAR0aWVyBXVpbnQ4BmFtb3VudAZ1aW50NjQKc2V0d3JhcGZlZQACB2ZlZV9wY3QGdWludDE2C2ZlZV9hY2NvdW50BG5hbWUIc2xvdF9kZWYAAgR0eXBlBXVpbnQ4Cm91dHB1dF9wY3QGdWludDE2EnN0YXRfc2xvdF9yZXNwb25zZQABB3NvdXJjZXMNc3RhdF9zb3VyY2VbXQtzdGF0X3NvdXJjZQACC2lucHV0X2luZGV4BXVpbnQ4EGlucHV0X3N0YXRfaW5kZXgFdWludDgJc3RhdGVfcm93AAMHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2CXN0b3djYXJnbwAFBW93bmVyBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhuZXh1c19pZAZ1aW50NjQIY2FyZ29faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NApzdG93ZW50aXR5AAMFb3duZXIEbmFtZQllbnRpdHlfaWQGdWludDY0CG5leHVzX2lkBnVpbnQ2NAxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABQdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzILcmVzZXJ2ZV9tYXgGdWludDMyEXN0cmF0dW1fcmVtYWluaW5nAAMHc3RyYXR1bQZ1aW50MTYJcmVtYWluaW5nBnVpbnQzMgpsYXN0X2Jsb2NrFGJsb2NrX3RpbWVzdGFtcF90eXBlCnN3YXBtb2R1bGUAAwllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgR0YXNrAAkEdHlwZQV1aW50OAhkdXJhdGlvbgZ1aW50MzIKY2FuY2VsYWJsZQV1aW50OAtjb29yZGluYXRlcwxjb29yZGluYXRlcz8FY2FyZ28MY2FyZ29faXRlbVtdDGVudGl0eXRhcmdldAtlbnRpdHlfcmVmPwtlbnRpdHlncm91cAd1aW50NjQ/C2VuZXJneV9jb3N0B3VpbnQzMj8EaG9sZAd1aW50NjQ/CnRhc2tfZXZlbnQACgpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDMyPwhsYW5lX2tleQV1aW50OAx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10RdGVtcGxhdGVfbWV0YV9yb3cAAwdpdGVtX2lkBnVpbnQxNgRraW5kBG5hbWUNZGlzcGxheV9sYWJlbAZzdHJpbmcHdHJhbnNpdAAFAmlkBnVpbnQ2NAJheAVpbnQ2NAJheQVpbnQ2NAJieAVpbnQ2NAJieQVpbnQ2NAZ0cmF2ZWwABAJpZAZ1aW50NjQBeAVpbnQ2NAF5BWludDY0CHJlY2hhcmdlBGJvb2wJdHlwZXNfcm93AAUCaWQGdWludDY0E2VudGl0eV9zdW1tYXJ5X3R5cGUOZW50aXR5X3N1bW1hcnkQZ2FtZV9jb25maWdfdHlwZQtnYW1lX2NvbmZpZxZzdHJhdHVtX3JlbWFpbmluZ190eXBlEXN0cmF0dW1fcmVtYWluaW5nFW5mdF9pdGVtX3BheWxvYWRfdHlwZRBuZnRfaXRlbV9wYXlsb2FkCHVuZGVwbG95AAIHaG9zdF9pZAZ1aW50NjQJdGFyZ2V0X2lkBnVpbnQ2NAZ1bmxvYWQAAwJpZAZ1aW50NjQFdG9faWQGdWludDY0BWl0ZW1zDGNhcmdvX2l0ZW1bXQR3YXJwAAMCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAp3YXJwX3N0YXRzAAEFcmFuZ2UGdWludDMyBHdpcGUAAA13b3JtaG9sZV9pbmZvAAMGY29vcmRzC2Nvb3JkaW5hdGVzC2lzX3dvcm1ob2xlBGJvb2wLZGVzdGluYXRpb24LY29vcmRpbmF0ZXMOd3JhcGNvbmZpZ19yb3cAAgdmZWVfcGN0BnVpbnQxNgtmZWVfYWNjb3VudARuYW1lDHdyYXBjb3N0X3JvdwADCWl0ZW1fdHlwZQV1aW50OAR0aWVyBXVpbnQ4BmFtb3VudAZ1aW50NjRbAABQUScqUzIJYWRkbW9kdWxlxwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbW9kdWxlCnN1bW1hcnk6ICdJbnN0YWxsIGEgbW9kdWxlIGludG8gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YWxsIGEgbW9kdWxlIGZyb20gY2FyZ28gaW50byBhIG1vZHVsZSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSB0eXBlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgc2xvdCB0eXBlLiBUaGUgbW9kdWxlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIGNhcmdvIHVwb24gaW5zdGFsbGF0aW9uLgAAAFh3NVMyCGFkZG5leHVzpwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbmV4dXMKc3VtbWFyeTogJ0FkZCBhIG5leHVzIGxvY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDcmVhdGUgYSBuZXcgbmV4dXMgZW50aXR5IGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy4gTmV4dXNlcyBhcmUgb3duZWQgYnkgdGhlIGNvbnRyYWN0IGFuZCBzZXJ2ZSBhcyBmaXhlZCBnYXRoZXJpbmcgcG9pbnRzIHdoZXJlIHBsYXllcnMgY2FuIHdyYXAsIHVud3JhcCwgZGVwbG95LCBhbmQgb3RoZXJ3aXNlIGludGVyYWN0IHdpdGggTkZULWJhY2tlZCBhc3NldHMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAFARmUtTMglhZGRvcmFjbGUAAAAAAIA0VTwFYmxlbmT8Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBibGVuZApzdW1tYXJ5OiAnQmxlbmQgY2FyZ28gc3RhY2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDb21iaW5lIG11bHRpcGxlIGNhcmdvIHN0YWNrcyBvZiB0aGUgc2FtZSBpdGVtIHR5cGUgaW50byBhIHNpbmdsZSBzdGFjayB3aXRoIG5ldyBibGVuZGVkIHN0YXRzLiBBbGwgaW5wdXQgc3RhY2tzIG11c3Qgc2hhcmUgdGhlIHNhbWUgaXRlbSBpZC4gVGhlIG91dHB1dCBzdGFjayBoYXMgdGhlIGNvbWJpbmVkIHF1YW50aXR5IG9mIGFsbCBpbnB1dHMuAADINNYUnT4JYnVpbGRwbG90AAAAAABEhaZBBmNhbmNlbMICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNhbmNlbApzdW1tYXJ5OiAnQ2FuY2VsIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FuY2VsIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRhc2tzIGZyb20gdGhlIGVuZCBvZiBhbiBlbnRpdHkncyBzY2hlZHVsZS4gVGFza3MgdGhhdCBhcmUgaW1tdXRhYmxlIGFuZCBpbiBwcm9ncmVzcyBjYW5ub3QgYmUgY2FuY2VsbGVkLgAAyDRW6UxECWNsYWltcGxvdABwVb4mY+lMRAxjbGFpbXN0YXJ0ZXIAAACoG99pVEQJY2xlYW5yc3Zw7AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYW5yc3ZwCnN1bW1hcnk6ICdDbGVhbiB1cCBwYXN0IGVwb2NoIHJlc2VydmVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFcmFzZSByZXNlcnZlIHRhYmxlIHJvd3MgZnJvbSBhIHBhc3QgZXBvY2guIENhbm5vdCBjbGVhbiB0aGUgY3VycmVudCBvciBmdXR1cmUgZXBvY2hzLiBUaGUgbWF4X3Jvd3MgcGFyYW1ldGVyIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIGVyYXNlZCBwZXIgY2FsbCB0byBsaW1pdCBDUFUgdXNhZ2UuAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdOwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4AAGA0MrcmRQljb25maWdsb2fdAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjb25maWdsb2cKc3VtbWFyeTogJ0xvZyBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IGxvZ3MgdGhlIGN1cnJlbnQgZ2FtZSBjb25maWd1cmF0aW9uLiBDYWxsZWQgaW5saW5lIGFmdGVyIGluaXRpYWxpemF0aW9uIHRvIGJyb2FkY2FzdCBjb25maWcgdmlhIGFjdGlvbiB0cmFjZXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAgLzMRQVjcmFmdMgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNyYWZ0CnN1bW1hcnk6ICdDcmFmdCBpdGVtcyBmcm9tIGEgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2Zvcm0gY2FyZ28gaXRlbXMgaW50byBhIG5ldyBpdGVtIHVzaW5nIGEgcmVjaXBlLiBUaGUgZW50aXR5IG11c3QgaGF2ZSBhIGNyYWZ0ZXIgbW9kdWxlIGluc3RhbGxlZC4gQ29uc3VtZXMgZW5lcmd5IGFuZCBzY2hlZHVsZXMgYSBjcmFmdGluZyB0YXNrIHdpdGggZHVyYXRpb24gYmFzZWQgb24gdG90YWwgaW5wdXQgbWFzcyBhbmQgY3JhZnRlciBzcGVlZC4gSW5wdXQgcXVhbnRpdGllcyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2lwZSByZXF1aXJlbWVudHMuAAAADbtIpUoIZGVtb2xpc2jxAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBkZW1vbGlzaApzdW1tYXJ5OiAnRGVtb2xpc2ggYSBzdGF0aW9uYXJ5IGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRGVjb21taXNzaW9uIGFuIGVudGl0eSwgZXJhc2luZyBpdCBmcm9tIHRoZSBnYW1lLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSwgaGF2ZSBlbXB0eSBjYXJnbywgYW5kIGhhdmUgbm8gaW5zdGFsbGVkIG1vZHVsZXMgKHJlbW92ZSBlYWNoIHZpYSBybW1vZHVsZSBmaXJzdCkuIFNjaGVkdWxlcyBhIGRlbW9saXNoIHRhc2sgdGhhdCBlcmFzZXMgdGhlIGVudGl0eSBvbiByZXNvbHV0aW9uLiBPbmx5IHZhbGlkIGZvciBlbnRpdGllcyB0aGF0IGNhbm5vdCBtb3ZlOyB1c2UgdW5kZXBsb3kgb3Igd3JhcGVudGl0eSBmb3IgdGhlIHJlc3QuAAAAAHgaq0oGZGVwbG957AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVwbG95CnN1bW1hcnk6ICdEZXBsb3kgYSBwYWNrZWQgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpVbnBhY2sgYSBwYWNrZWQgZW50aXR5IGl0ZW0gKHBhY2tlZCBzaGlwIG9yIHBhY2tlZCBjb250YWluZXIpIGZyb20gY2FyZ28sIHNjaGVkdWxpbmcgYSBkZXBsb3kgdGFzayB0aGF0IGNyZWF0ZXMgdGhlIG5ldyBlbnRpdHkgYXQgdGhlIGRlcGxveWluZyBlbnRpdHkncyBsb2NhdGlvbiB1cG9uIHJlc29sdXRpb24uAIDPLk+FsEoKZGVzY2VudGl0eckDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlc2NlbnRpdHkKc3VtbWFyeTogJ0Rlc2NyaWJlIGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIGEgcGFja2VkIGVudGl0eSwgZGVyaXZlZCBmcm9tIHRoZSBlbnRpdHkgaXRlbSBpZCwgaHVsbCBzdGF0cywgYW5kIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBtb2R1bGUgaXRlbSBpZHMgYW5kIHN0YXRzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBORlQgcmVuZGVyZXJzIHRvIGRpc3BsYXkgcGFja2VkIGVudGl0aWVzLgAAAACoeMxUBmVuYWJsZd0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC6AsZGUXYO6WwxmaXhjYXJnb21hc3OQAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBmaXhjYXJnb21hc3MKc3VtbWFyeTogJ0RFQlVHOiByZWNvbXB1dGUgZW50aXR5IGNhcmdvIG1hc3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlY29tcHV0ZSBhbmQgcmV3cml0ZSBhbiBlbnRpdHkncyBjYXJnbyBtYXNzIGZyb20gaXRzIGN1cnJlbnQgY2FyZ28uIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4gQXZhaWxhYmxlIGZvciByZXBhaXJpbmcgZHJpZnQgYmV0d2VlbiBjYWNoZWQgY2FyZ28gbWFzcyBhbmQgdGhlIHRydWUgbWFzcyBkZXJpdmVkIGZyb20gY2FyZ28gcm93cy4AolFbXYUuXQtmb3JjZXJldmVhbL4ELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGZvcmNlcmV2ZWFsCnN1bW1hcnk6ICdERUJVRzogZm9yY2UtZmluYWxpemUgYW4gZXBvY2ggZnJvbSBleGlzdGluZyByZXZlYWxzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpGaW5hbGl6ZSBhIHN0dWNrIGVwb2NoIGJ5IGNvbXB1dGluZyBpdHMgc2VlZCBmcm9tIHRoZSByZXZlYWxzIGFscmVhZHkgc3VibWl0dGVkLCB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LiBUaGUgc2VlZCBpcyBkZXJpdmVkIHNvbGVseSBmcm9tIHRoZSBwcmUtaW1hZ2UtbG9ja2VkIHJldmVhbHMgYWxyZWFkeSBvbiBjaGFpbjsgbm8gYWRtaW4tc3VwcGxpZWQgZW50cm9weSBpcyBpbnRyb2R1Y2VkLiBVc2VkIHRvIHVuYmxvY2sgZXBvY2ggcHJvZ3Jlc3Npb24gd2hlbiB0aGUgdGhyZXNob2xkIGNhbm5vdCBvdGhlcndpc2UgYmUgbWV0LgAAAABc1bJhBmdhdGhlcpcDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdhdGhlcgpzdW1tYXJ5OiAnR2F0aGVyIHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKR2F0aGVyIHJlc291cmNlcyBhdCB0aGUgc2hpcCdzIGN1cnJlbnQgbG9jYXRpb24uIE9ubHkgd29ya3MgYXQgZ2F0aGVyYWJsZSBsb2NhdGlvbiB0eXBlcy4gU2NoZWR1bGVzIGEgZ2F0aGVyIHRhc2sgdGhhdCBjb25zdW1lcyBlbmVyZ3kgYW5kIHlpZWxkcyBjYXJnbyBiYXNlZCBvbiB0aGUgc2hpcCdzIGdhdGhlcmVyIHN0YXRzIGFuZCB0aGUgbG9jYXRpb24ncyByZXNvdXJjZSBjb21wb3NpdGlvbi6QlYoLO6ymYgxnZW5lc2lzZmxlZXSpBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZW5lc2lzZmxlZXQKc3VtbWFyeTogJ01pbnQgdGhlIG9uZS10aW1lIGdlbmVzaXMgZmxlZXQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVtcGxhY2UgdGhlIG9uZS10aW1lIGdlbmVzaXMgZmxlZXQ6IGEgY2FsbGVyLXN1cHBsaWVkIHNldCBvZiBlbnRpdGllcyAoc2hpcHMsIHN0cnVjdHVyZXMsIGFuZCBjb250YWluZXJzKSB3cml0dGVuIHRvIHRoZSB3b3JsZCBhcy1pcy4gVmFsaWQgb25seSBkdXJpbmcgdGhlIHByZS1nZW5lc2lzIHdpbmRvdywgYmVmb3JlIGVwb2NoIDEgaXMgZmluYWxpemVkLiBUaGUgc3VwcGxpZWQgZW50aXR5IGlkcyBhcmUgaG9ub3JlZCBhbmQgdGhlIGlkIHNlcXVlbmNlIGlzIGFkdmFuY2VkIHBhc3QgdGhlbTsgaWQgMCBpcyByZXNlcnZlZCBmb3IgdGhlIEdlbmVzaXMgTmV4dXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAGBuTYqyYglnZXRjb25maWfKAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRjb25maWcKc3VtbWFyeTogJ0dldCBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgdGhlIGdhbWUgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgZGVmYXVsdCBlbnRpdHkgc3RhdHMgZm9yIHdhcmVob3VzZXMgYW5kIGNvbnRhaW5lcnMsIGFuZCB0aGUgZnVsbCBpdGVtIGRlZmluaXRpb25zIHRhYmxlLgBAdphWlbJiCmdldGRlcG9zaXQAABSaJmOXsmILZ2V0ZGlzdGFuY2UAAFQ8jrmosmILZ2V0ZWxpZ2libGXIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbGlnaWJsZQpzdW1tYXJ5OiAnR2V0IGVsaWdpYmxlIHJlc291cmNlIGl0ZW0gSURzIGF0IGEgbG9jYXRpb24gYW5kIHN0cmF0dW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBsaXN0IG9mIHJlc291cmNlIGl0ZW0gSURzIGVsaWdpYmxlIHRvIGJlIGdhdGhlcmVkIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcyBhbmQgc3RyYXR1bSBkZXB0aC4gSXRlbXMgYXJlIGdhdGVkIGJ5IGJvdGggdGhlIGxvY2F0aW9uJ3MgcmVzb3VyY2UgcHJvZmlsZSBhbmQgdGhlIGRlcHRoIHRocmVzaG9sZCBmb3IgZWFjaCB0aWVyLgAAwBHlqbJiCWdldGVudGNsc4wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGNscwpzdW1tYXJ5OiAnR2V0IGVudGl0eSBjbGFzcyBlbnVtIHZhbHVlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgc2V0IG9mIGVudGl0eSBjbGFzcyBlbnVtIHZhbHVlcyBhbmQgdGhlaXIgc3RyaW5nIG5hbWVzIChPcmJpdGFsVmVzc2VsLCBQbGFuZXRhcnlTdHJ1Y3R1cmUpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBlbnRpdHkgY2xhc3MgaWRlbnRpZmllcnMuALBy2eWpsmILZ2V0ZW50aXRpZXOkAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbnRpdGllcwpzdW1tYXJ5OiAnR2V0IGFsbCBlbnRpdGllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgZnVsbCBlbnRpdHkgaW5mbyBmb3IgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4AAPDZ5amyYglnZXRlbnRpdHmiAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbnRpdHkKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4gZW50aXR5IGluY2x1ZGluZyBpZGVudGl0eSwgY2FyZ28sIHNjaGVkdWxlIHN0YXRlLCBhbmQgdHlwZS1zcGVjaWZpYyBmaWVsZHMuAEw2SarssmILZ2V0aXRlbWRhdGGoAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtZGF0YQpzdW1tYXJ5OiAnR2V0IGZ1bGwgaXRlbSBjYXRhbG9nJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgY29tcGxldGUgaXRlbSBjYXRhbG9nIGFzIHRoZSBjb250cmFjdCBzZWVzIGl0LCBpbmNsdWRpbmcgdHlwZSwgc3VidHlwZSwgdGllciwgbWFzcywgYW5kIG90aGVyIHN0YXRpYyBtZXRhZGF0YS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgY2xpZW50cyB0byBtaXJyb3IgdGhlIGNvbnRyYWN0J3MgaXRlbSBkZWZpbml0aW9ucy4AAE5OquyyYgpnZXRpdGVtaWRzhgMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbWlkcwpzdW1tYXJ5OiAnR2V0IGl0ZW0gaWQgdG8gbmFtZSBtYXBwaW5ncycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgbWFwcGluZyBvZiBpdGVtIGlkIGNvbnN0YW50cyB0byB0aGVpciBjYW5vbmljYWwgc3RyaW5nIG5hbWVzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHJlc29sdmUgbnVtZXJpYyBpdGVtIGlkcyB0byBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVycy4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuAFT1WarssmILZ2V0aXRlbXR5cGUAgFX1WarssmIMZ2V0aXRlbXR5cGVziAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXR5cGVzCnN1bW1hcnk6ICdHZXQgaXRlbSB0eXBlIGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgaXRlbSB0eXBlIGVudW0gdmFsdWVzIGFuZCB0aGVpciBzdHJpbmcgbmFtZXMgKHJlc291cmNlLCBjb21wb25lbnQsIG1vZHVsZSwgZW50aXR5KS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgaXRlbSB0eXBlIGlkZW50aWZpZXJzLgBMVjJNB7NiC2dldGtpbmRtZXRh+AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0a2luZG1ldGEKc3VtbWFyeTogJ0dldCBlbnRpdHkga2luZCBtZXRhZGF0YScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGVudGl0eSBraW5kIHJlZ2lzdHJ5IGFuZCB0ZW1wbGF0ZSByZWdpc3RyeSwgaW5jbHVkaW5nIGVhY2gga2luZCdzIGNsYXNzaWZpY2F0aW9uLCBjYXBhYmlsaXR5IGZsYWdzLCBaLWNvb3JkaW5hdGUsIGFuZCBkZWZhdWx0IGxhYmVsLCBwbHVzIHRoZSBtYXBwaW5nIG9mIGVudGl0eSBpdGVtIGlkcyB0byBraW5kcyB3aXRoIGRpc3BsYXkgbGFiZWxzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGludGVycHJldCBlbnRpdHkga2luZHMgYW5kIGNhcGFiaWxpdGllcy4AJnXZIBqzYgtnZXRsb2NhdGlvbuICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2F0aW9uCnN1bW1hcnk6ICdHZXQgbG9jYXRpb24gaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2NhdGlvbiBpbmNsdWRpbmcgd2hldGhlciBhIHN5c3RlbSBleGlzdHMsIGFuZCBmb3IgZWFjaCBpdGVtOiBwcmljZSwgc3VwcGx5LCByYXJpdHkgbXVsdGlwbGllciwgYW5kIGxvY2F0aW9uIG11bHRpcGxpZXIuAIDJJiEas2IKZ2V0bG9jZGF0Yf4CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2RhdGEKc3VtbWFyeTogJ0dldCBkZXJpdmVkIGxvY2F0aW9uIGRhdGEnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgZGVyaXZlZCBsb2NhdGlvbiBkYXRhIGluY2x1ZGluZyBzdGF0aWMgcHJvcGVydGllcyAodHlwZSwgZGlmZmljdWx0eSwgc2VlZHMpIGZyb20gdGhlIGdhbWUgc2VlZCBhbmQgZXBvY2gtc3BlY2lmaWMgcHJvcGVydGllcyAoYWN0aXZlLCBzZWVkcykgZnJvbSB0aGUgY3VycmVudCBlcG9jaCBzZWVkLgCwqj4nKrNiC2dldG1vZHR5cGVz1gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bW9kdHlwZXMKc3VtbWFyeTogJ0dldCBtb2R1bGUgdHlwZSBlbnVtIHZhbHVlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgc2V0IG9mIG1vZHVsZSB0eXBlIGVudW0gdmFsdWVzIGFuZCB0aGVpciBzdHJpbmcgbmFtZXMgKGFueSwgZW5naW5lLCBnZW5lcmF0b3IsIGdhdGhlcmVyLCBsb2FkZXIsIHdhcnAsIGNyYWZ0ZXIsIGxhdW5jaGVyLCBzdG9yYWdlLCBoYXVsZXIpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBtb2R1bGUgc3VidHlwZSBpZGVudGlmaWVycyBhbmQgc2xvdCBjb21wYXRpYmlsaXR5LgAAVlEnKrNiCmdldG1vZHVsZXOAAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRtb2R1bGVzCnN1bW1hcnk6ICdHZXQgYWxsIG1vZHVsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIG1vZHVsZXMsIGluY2x1ZGluZyBlYWNoIG1vZHVsZSdzIGlkLCBtYXNzLCBzdWJ0eXBlLCBhbmQgdGllci4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBlbnVtZXJhdGUgaW5zdGFsbGFibGUgZXF1aXBtZW50LgAA8OcaNbNiCWdldG5lYXJied4DLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5lYXJieQpzdW1tYXJ5OiAnR2V0IG5lYXJieSByZWFjaGFibGUgc3lzdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBuZWFyYnkgc3lzdGVtcyByZWFjaGFibGUgYnkgYW4gZW50aXR5IGZyb20gaXRzIHByb2plY3RlZCBsb2NhdGlvbi4gUmV0dXJucyBjdXJyZW50IHN0YXRlICh3aXRoIGNvbXBsZXRlZCB0YXNrcyByZXNvbHZlZCksIHByb2plY3RlZCBzdGF0ZSAoYWZ0ZXIgYWxsIHNjaGVkdWxlZCB0YXNrcyksIGFuZCBhIGxpc3Qgb2YgcmVhY2hhYmxlIHN5c3RlbXMgd2l0aCBkaXN0YW5jZSwgZW5lcmd5IGNvc3QsIGZsaWdodCB0aW1lLCBhbmQgbWFya2V0IGluZm9ybWF0aW9uLgCAwubkNbNiCmdldG5mdGJhc2UAAABd0+U1s2IKZ2V0bmZ0aW5mb/ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5mdGluZm8Kc3VtbWFyeTogJ0dldCBORlQgc2NoZW1hIGFuZCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgQXRvbWljQXNzZXRzIHNjaGVtYXMgYW5kIHRlbXBsYXRlcyB0aGUgZ2FtZSBjb250cmFjdCBleHBlY3RzLCBwbHVzIHRoZSBjdXJyZW50IGBpdGVtX2lkIOKGkiAodGVtcGxhdGVfaWQsIHNjaGVtYV9uYW1lKWAgbWFwcGluZyBzdG9yZWQgaW4gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHN5bmMgYXRvbWljYXNzZXRzIHN0YXRlIHdpdGggdGhlIGNvbnRyYWN0LgAAuMqbWLNiCWdldHBsYXllcv0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHBsYXllcgpzdW1tYXJ5OiAnR2V0IHBsYXllciBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBsYXllciBpbmNsdWRpbmcgYmFsYW5jZSwgZGVidCwgbmV0d29ydGgsIGVudGl0eSBjb3VudHMsIGFuZCBwcmljaW5nIGZvciBuZXh0IHB1cmNoYXNlcy4gUmV0dXJucyBpc19wbGF5ZXI9ZmFsc2UgaWYgdGhlIGFjY291bnQgaGFzIG5vdCBqb2luZWQgdGhlIGdhbWUuoLLJ+NFbs2IMZ2V0cHJvanN0YXRlywMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cHJvanN0YXRlCnN1bW1hcnk6ICdHZXQgcHJvamVjdGVkIGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHByb2plY3RlZCBzdGF0ZSBvZiBhbiBlbnRpdHkgYWZ0ZXIgYXBwbHlpbmcgdGhlIG5leHQgdGFza19jb3VudCBzY2hlZHVsZWQgdGFza3MgKG9yIGFsbCB0YXNrcyBpZiB0YXNrX2NvdW50IGlzIG9taXR0ZWQpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHByZXZpZXcgdGhlIHJlc3VsdCBvZiBhbiBlbnRpdHkncyBzY2hlZHVsZSB3aXRob3V0IHJlc29sdmluZyBvbi1jaGFpbi4AAFDVIXWzYglnZXRyZWNpcGWmAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZWNpcGUKc3VtbWFyeTogJ0dldCBhIHNpbmdsZSBjcmFmdGluZyByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSByZWNpcGUgd2hvc2Ugb3V0cHV0IG1hdGNoZXMgdGhlIGdpdmVuIGl0ZW0gaWQsIGluY2x1ZGluZyBpdHMgaW5wdXRzLCBibGVuZCB3ZWlnaHRzLCBzdGF0IHNsb3RzLCBhbmQgcmVzb2x2ZWQgaXRlbSBtYXNzIGluZm8uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGlzcGxheSBjcmFmdGluZyByZXF1aXJlbWVudHMuAABW1SF1s2IKZ2V0cmVjaXBlc6wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4AAM4GYXWzYgpnZXRyZXNjYXRzngMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzY2F0cwpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIGNhdGVnb3J5IGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAob3JlLCBnYXMsIHJlZ29saXRoLCBiaW9tYXNzLCBjcnlzdGFsKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgcmVzb3VyY2Ugc3VidHlwZSBpZGVudGlmaWVycy4AsNpXYXWzYgtnZXRyZXNlcnZlc/wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc2VydmVzCnN1bW1hcnk6ICdHZXQgY3VycmVudCByZXNlcnZlIG1vZGlmaWNhdGlvbnMgYXQgYSBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyB0aGUgY2hhaW4ncyBtb2RpZmljYXRpb25zIHRvIGRlcml2ZWQgcmVzZXJ2ZXMgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGUgZm9yIHRoZSBjdXJyZW50IGVwb2NoIGFzIGEgbGlzdCBvZiB7c3RyYXR1bSwgcmVtYWluaW5nfSBwYWlycy4gU3RyYXRhIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZSB1c2UgdGhlaXIgZGVyaXZlZCBpbml0aWFsIHJlc2VydmUuIENvbXBvc2Ugd2l0aCBTREsgZGVyaXZhdGlvbiB0byBnZXQgdGhlIGZ1bGwgcGVyLWxvY2F0aW9uIHN0cmF0YSB2aWV3LoAVuppidbNiDGdldHJlc291cmNlc4cDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc291cmNlcwpzdW1tYXJ5OiAnR2V0IGFsbCByZXNvdXJjZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIHJlc291cmNlcywgaW5jbHVkaW5nIGVhY2ggcmVzb3VyY2UncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGdhdGhlcmFibGUgbWF0ZXJpYWxzLgAAADjTiLNiCGdldHNsb3RzuwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c2xvdHMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc2xvdCBsYXlvdXRzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgbW9kdWxlIHNsb3QgbGF5b3V0IGZvciBldmVyeSBlbnRpdHkgaXRlbSB0eXBlLCBsaXN0aW5nIHRoZSBvcmRlcmVkIHNsb3QgdHlwZXMgYXZhaWxhYmxlIGZvciBtb2R1bGUgaW5zdGFsbGF0aW9uLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRldGVybWluZSB3aGljaCBtb2R1bGUgdHlwZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBhIGdpdmVuIGVudGl0eSBodWxsLgCA1NncjLNiCmdldHN0cmF0dW3SAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdHJhdHVtCnN1bW1hcnk6ICdHZXQgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHJlc291cmNlIHN0cmF0dW0gZGF0YSBmb3IgYSBzcGVjaWZpYyBkZXB0aCBsYXllciBhdCBhIGNvb3JkaW5hdGUsIGluY2x1ZGluZyB0aGUgc3RyYXR1bSBzZWVkIGluZm8gYW5kIGRlcml2ZWQgcmVzb3VyY2Ugc3RhdHMugJW7RkqNs2IMZ2V0c3VtbWFyaWVz6AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3VtbWFyaWVzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHN1bW1hcmllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgbGlnaHR3ZWlnaHQgc3VtbWFyaWVzIG9mIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllciBpbmNsdWRpbmcgdHlwZSwgaWQsIG93bmVyLCBuYW1lLCBsb2NhdGlvbiwgYW5kIGlkbGUgc3RhdHVzLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4AVKRNXsqzYgtnZXR3b3JtaG9sZQCQHZ7m5qrpZQxncm91cHRyYW5zaXQAAKLa5uaq6WULZ3JvdXB0cmF2ZWyaBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBncm91cHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBtdWx0aXBsZSBlbnRpdGllcyB0b2dldGhlcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhdGUgZ3JvdXAgdHJhdmVsIGZvciBtdWx0aXBsZSBlbnRpdGllcyB0byBhIGRlc3RpbmF0aW9uLiBBbGwgZW50aXRpZXMgbXVzdCBiZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhbmQgb3duZWQgYnkgdGhlIGNhbGxlci4gQXQgbGVhc3Qgb25lIGVudGl0eSB3aXRoIGVuZ2luZXMgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aHJ1c3QuIEZsaWdodCBkdXJhdGlvbiBpcyBjYWxjdWxhdGVkIGZyb20gY29tYmluZWQgdGhydXN0IGFuZCB0b3RhbCBtYXNzIG9mIGFsbCBlbnRpdGllcy4gQ3JlYXRlcyBhbiBlbnRpdHlncm91cCBmb3IgYXRvbWljIHJlc29sdXRpb24gYW5kIGNhbmNlbGxhdGlvbi4AAAAAANCwaQRoYXNo+AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaGFzaApzdW1tYXJ5OiAnQ2FsY3VsYXRlIHNoYTI1NiBoYXNoJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYWxjdWxhdGVzIHRoZSBzaGEyNTYgaGFzaCBvZiBhIHN0cmluZyBiYXNlZCB1c2luZyB0aGUgZ2FtZSBzZWVkLgAAAECE0rBpB2hhc2g1MTL7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoNTEyCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhNTEyIGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTUxMiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuACi7BuVLq3QLaW1wb3J0Y2FyZ28A4LPLU+VLq3QMaW1wb3J0ZW50aXR5AACqppflS6t0C2ltcG9ydGdyb3VwAHCVN7HmS6t0DGltcG9ydHBsYXllcgC6r8Lq5kurdA1pbXBvcnRyZXNlcnZlAABUNhnnS6t0C2ltcG9ydHN0YXRlAAAAAAAAMB19BGpvaW7EAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBqb2luCnN1bW1hcnk6ICdKb2luIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSm9pbiBhIGdhbWUgb2YgU2hpcGxvYWQAAAAAAJAMjQRsb2FkAAAAiFcz6fKaCW5mdGltZ3VybLIDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5mdGltZ3VybApzdW1tYXJ5OiAnR2V0IE5GVCBpbWFnZSBVUkwgZm9yIGEgY2FyZ28gaXRlbScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGltYWdlIFVSTCB0aGUgY29udHJhY3QgZW1pdHMgZm9yIGEgZ2l2ZW4gY2FyZ28gaXRlbSwgb3B0aW9uYWxseSBzY29wZWQgdG8gYSBsb2NhdGlvbi4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgTkZUIHJlbmRlcmVycyB0byBmZXRjaCB0aGUgY2Fub25pY2FsIGFydHdvcmsgZm9yIGFuIGl0ZW0gb3IgcGFja2VkIGVudGl0eS4AAAAA+OUynQZub3RpZnmKAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBub3RpZnkKc3VtbWFyeTogJ1Rhc2sgbGlmZWN5Y2xlIG5vdGlmaWNhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIHRoYXQgbm90aWZpZXMgZW50aXR5IG93bmVycyBvZiB0YXNrIGxpZmVjeWNsZSBldmVudHMgKHJlc29sdmVkLCBjYW5jZWxsZWQpLiBDYWxsZWQgaW5saW5lIHdoZW4gdGFza3MgY2hhbmdlIHN0YXRlLiBVc2VzIHJlcXVpcmVfcmVjaXBpZW50IHRvIGVuYWJsZSBvZmYtY2hhaW4gbW9uaXRvcmluZyB2aWEgYWN0aW9uIHRyYWNlcy4AAGXXIIVMrApwbGFjZWNhcmdvyQQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcGxhY2VjYXJnbwpzdW1tYXJ5OiAnUmVzdG9yZSBORlQgY2FyZ28gb250byBhIGhvc3QgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gY2FsbGVkIGlubGluZSBieSB0aGUgcGxhdGZvcm0gY29udHJhY3Qgb25seS4gUmVzdG9yZXMgdGhlIGNhcmdvIHJlY29yZGVkIGluIGFuIHVud3JhcHBlZCBORlQgb250byBhIGhvc3QgZW50aXR5LiBWYWxpZGF0ZXMgaG9zdCBvd25lcnNoaXAsIGxvYWRlcnMsIGFuZCByZW1haW5pbmcgY2FwYWNpdHksIGRlc2VyaWFsaXplcyB0aGUgTkZUJ3MgaXRlbSBkYXRhLCBhbmQgYXBwZW5kcyBhbiB1bndyYXAgdGFzayB0byBkZWxpdmVyIHRoZSBjYXJnbyB0byB0aGUgaG9zdC4gVGhlIHBsYXRmb3JtIGNvbnRyYWN0IGNyZWRpdHMgdGhlIGRlcG9zaXQgcmVmdW5kIGFuZCBidXJucyB0aGUgYXNzZXQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AfHZ5KoVMrAtwbGFjZWVudGl0ecAELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHBsYWNlZW50aXR5CnN1bW1hcnk6ICdNYXRlcmlhbGl6ZSBhIHBhY2tlZC1lbnRpdHkgTkZUIGFzIGEgbGl2ZSBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IHRoZSBwbGF0Zm9ybSBjb250cmFjdCBvbmx5LiBFbXBsYWNlcyBhIGxpdmUgb3JiaXRhbCB2ZXNzZWwgKHNoaXAgb3IgY29udGFpbmVyKSBmcm9tIGl0cyBwYWNrZWQtZW50aXR5IE5GVCBkYXRhIGF0IHRoZSByZWNvcmRlZCB3cmFwIG9yaWdpbiwgdGhlbiBxdWV1ZXMgdHJhdmVsIGFuZCByZWNoYXJnZSB0YXNrcyB0byBkZWxpdmVyIGl0IHRvIHRoZSB0YXJnZXQgbmV4dXMgYXQgZnVsbCBlbmVyZ3kuIFRoZSBwbGF0Zm9ybSBjb250cmFjdCBjcmVkaXRzIHRoZSBkZXBvc2l0IHJlZnVuZCBhbmQgYnVybnMgdGhlIGFzc2V0LiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAAAAil3TkLoIcmVjaGFyZ2XNAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZWNoYXJnZQpzdW1tYXJ5OiAnUmVjaGFyZ2Ugc2hpcCBlbmVyZ3knCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClNjaGVkdWxlIGEgcmVjaGFyZ2UgdGFzayBmb3IgYW4gZW50aXR5IHRvIHJlc3RvcmUgZW5lcmd5IHRvIGZ1bGwgY2FwYWNpdHkuIFRoZSByZWNoYXJnZSBkdXJhdGlvbiBkZXBlbmRzIG9uIGN1cnJlbnQgZW5lcmd5IGxldmVsIGFuZCByZWNoYXJnZSByYXRlLuCzy1M1fJe6DHJlZnJzaGVudGl0ebgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlZnJzaGVudGl0eQpzdW1tYXJ5OiAnUmVmcmVzaCBkZXJpdmVkIGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVjb21wdXRlIGRlcml2ZWQgZmllbGRzIG9uIGFuIGVudGl0eSBmcm9tIGl0cyBjdXJyZW50IGNhcmdvIGFuZCBtb2R1bGVzLCByZWZyZXNoaW5nIGNhcGFiaWxpdHkgc3RhdHMgYW5kIGNhcmdvIG1hc3MuIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlIHdpdGggbm8gc2NoZWR1bGVkIHRhc2tzLiBVc2VkIHRvIHJlY29uY2lsZSBkZXJpdmVkIHN0YXRlIGFmdGVyIGRhdGEgbWlncmF0aW9ucyBvciBjb250cmFjdCB1cGdyYWRlcy6gIjKXqk2lugxyZW1vdmVvcmFjbGUAAAAAAChpproGcmVuYW1lAAAAAEDtSLG6B3Jlc29sdmXQAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZXNvbHZlCnN1bW1hcnk6ICdDb21wbGV0ZSBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlc29sdmUgY29tcGxldGVkIHRhc2tzIGluIGFuIGVudGl0eSdzIHNjaGVkdWxlLCBhcHBseWluZyB0aGVpciBlZmZlY3RzIChyZWNoYXJnZSBlbmVyZ3ksIHVwZGF0ZSBsb2NhdGlvbiwgbG9hZC91bmxvYWQgY2FyZ28pLiBJZiBjb3VudCBpcyBzcGVjaWZpZWQsIHJlc29sdmUgZXhhY3RseSB0aGF0IG1hbnkgdGFza3M7IG90aGVyd2lzZSByZXNvbHZlIGFsbCBjb21wbGV0ZWQgdGFza3MuIEZhaWxzIGlmIGNvdW50IGV4Y2VlZHMgdGhlIG51bWJlciBvZiBjb21wbGV0ZWQgdGFza3MuAECMRu1IsboKcmVzb2x2ZWFsbAAAAAAARKO2ugZyZXZlYWwAAAAAKupEpbwIcm1tb2R1bGW8Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW1vZHVsZQpzdW1tYXJ5OiAnUmVtb3ZlIGEgbW9kdWxlIGZyb20gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgYW4gaW5zdGFsbGVkIG1vZHVsZSBmcm9tIGEgc2xvdCBvbiBhIGxpdmUgZW50aXR5IG9yIGEgcGFja2VkIGVudGl0eSBpbiBjYXJnby4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBubyBzY2hlZHVsZWQgdGFza3MuIFRoZSBtb2R1bGUgaXMgcmV0dXJuZWQgdG8gY2FyZ28uIEZhaWxzIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgaGF2ZSBlbm91Z2ggY2FyZ28gY2FwYWNpdHkgdG8gaG9sZCB0aGUgcmV0dXJuZWQgbW9kdWxlLgAAAGyhvKa8CHJtbmZ0Y2ZnoQMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcm1uZnRjZmcKc3VtbWFyeTogJ1JlbW92ZSBORlQgdGVtcGxhdGUgbWFwcGluZyBmb3IgYW4gaXRlbScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVtb3ZlIHRoZSBBdG9taWNBc3NldHMgdGVtcGxhdGUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIGlkIGZyb20gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBBZnRlciByZW1vdmFsIHRoZSBpdGVtIGNhbiBubyBsb25nZXIgYmUgd3JhcHBlZCBvciB1bndyYXBwZWQgdW50aWwgYSBuZXcgbWFwcGluZyBpcyBzZXQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAMDpUoqywglzZXRjb29yZHMAAABgC+U1s8IJc2V0bmZ0Y2ZnxAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc2V0bmZ0Y2ZnCnN1bW1hcnk6ICdTZXQgTkZUIHRlbXBsYXRlIG1hcHBpbmcgZm9yIGFuIGl0ZW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkJpbmQgYW4gaXRlbSBpZCB0byBhbiBBdG9taWNBc3NldHMgdGVtcGxhdGUgaWQgYW5kIHNjaGVtYSBuYW1lLiBVc2VkIHRvIGNvbmZpZ3VyZSBob3cgdGhlIGNvbnRyYWN0IG1pbnRzIGFuZCByZWNvZ25pemVzIE5GVHMgZm9yIGEgZ2l2ZW4gaXRlbS4gSW5zZXJ0cyBhIG5ldyBtYXBwaW5nIGlmIG9uZSBkb2VzIG5vdCBleGlzdCwgb3IgdXBkYXRlcyB0aGUgZXhpc3RpbmcgbWFwcGluZy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LpAibVjdlrPCDHNldHRocmVzaG9sZAAAMqaomsuzwgtzZXR3cmFwY29zdAAAgFKrmsuzwgpzZXR3cmFwZmVlAAAAoOwaxGnGCXN0b3djYXJnb9UFLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHN0b3djYXJnbwpzdW1tYXJ5OiAnUmVzZXJ2ZSBhIGNhcmdvIHN0YWNrIGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIGNhbGxlZCBpbmxpbmUgYnkgdGhlIHBsYXRmb3JtIGNvbnRyYWN0IG9ubHkuIFJlc2VydmVzIGFuZCBjb25zdW1lcyBhIGNhcmdvIHN0YWNrIG9uIGEgbGl2ZSBlbnRpdHkgZm9yIHdyYXBwaW5nIGludG8gYW4gTkZULiBWYWxpZGF0ZXMgZW50aXR5IG93bmVyc2hpcCwgbG9hZGVycywgYW5kIHByZXNlbmNlIGF0IHRoZSBuZXh1cywgYW5kIGNvbmZpcm1zIHRoZSB0YXJnZXQgY2FyZ28gc3RhY2sgaXMgYXZhaWxhYmxlIGFuZCBub3QgcmVzZXJ2ZWQgYnkgYSBwZW5kaW5nIHRhc2suIENvbXB1dGVzIHRoZSB3cmFwIGNvc3QgYW5kIGZlZSwgZGViaXRzIHRoZW0gZnJvbSB0aGUgb3duZXIncyBwbGF0Zm9ybSBkZXBvc2l0IGJhbGFuY2UsIGRlcml2ZXMgdGhlIE5GVCdzIGltbXV0YWJsZSBkYXRhLCBhbmQgbWludHMgdGhlIE5GVCBpbmxpbmUgYXMgdGhlIGdhbWUgY29udHJhY3QgYmVmb3JlIGNvbnN1bWluZyB0aGUgY2FyZ28uIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AgM8uT8VpxgpzdG93ZW50aXR5mQUtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Rvd2VudGl0eQpzdW1tYXJ5OiAnUmVzZXJ2ZSBhbiBlbnRpdHkgZm9yIHdyYXBwaW5nIGludG8gYW4gTkZUJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gY2FsbGVkIGlubGluZSBieSB0aGUgcGxhdGZvcm0gY29udHJhY3Qgb25seS4gUmVzZXJ2ZXMgYSB3aG9sZSBlbnRpdHkgKHNoaXAsIGNvbnRhaW5lciwgb3IgcGxhbmV0YXJ5IHN0cnVjdHVyZSkgZm9yIHdyYXBwaW5nIGludG8gYW4gTkZULiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIGVtcHR5IGNhcmdvIGFuZCBubyBzY2hlZHVsZWQgdGFza3MuIENvbXB1dGVzIHRoZSB3cmFwIGNvc3QgYW5kIGZlZSwgZGViaXRzIHRoZW0gZnJvbSB0aGUgb3duZXIncyBwbGF0Zm9ybSBkZXBvc2l0IGJhbGFuY2UsIGRlcml2ZXMgdGhlIGVudGl0eSBORlQncyBpbW11dGFibGUgZGF0YSwgbWludHMgdGhlIE5GVCBpbmxpbmUgYXMgdGhlIGdhbWUgY29udHJhY3QsIGFuZCBlcmFzZXMgdGhlIGVudGl0eSBmcm9tIHRoZSB3b3JsZC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgCAijpRWQ3HCnN3YXBtb2R1bGUAAAAAIDs8zc0HdHJhbnNpdAAAAAAARLXNzQZ0cmF2ZWz7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB0cmF2ZWwKc3VtbWFyeTogJ01vdmUgYSBzaGlwJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSB0cmF2ZWwgb2YgYW4gZW50aXR5IGZyb20gaXRzIGN1cnJlbnQgbG9jYXRpb24gdG8gYSBuZXcgZGVzdGluYXRpb24uAAAAnsaq0tQIdW5kZXBsb3nnBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB1bmRlcGxveQpzdW1tYXJ5OiAnUGFjayBhIGRlcGxveWVkIGVudGl0eSBpbnRvIGEgaG9zdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUGFjayBhbiBlbnRpdHkgaW50byBhIGhvc3QgZW50aXR5J3MgY2FyZ28gYXMgYSBwYWNrZWQtZW50aXR5IGl0ZW0uIEhvc3QgYW5kIHRhcmdldCBtdXN0IHNoYXJlIHRoZSBzYW1lIG93bmVyIGFuZCBjb29yZGluYXRlcywgdGhlIGhvc3QgbXVzdCBoYXZlIGxvYWRlcnMgYW5kIGVub3VnaCBjYXBhY2l0eSBmb3IgdGhlIHBhY2tlZCBtYXNzLCBhbmQgdGhlIHRhcmdldCBtdXN0IGJlIGlkbGUgd2l0aCBlbXB0eSBjYXJnby4gQ3JlYXRlcyBhbiBlbnRpdHlncm91cCBhbmQgc2NoZWR1bGVzIHVuZGVwbG95IHRhc2tzIG9uIGJvdGggZW50aXRpZXM7IG9uIHJlc29sdXRpb24gdGhlIHRhcmdldCBpcyBlcmFzZWQgYW5kIHRoZSBwYWNrZWQgZW50aXR5IGlzIGFkZGVkIHRvIHRoZSBob3N0J3MgY2FyZ28uIEludmVyc2Ugb2YgZGVwbG95LgAAAAAkQ+PUBnVubG9hZAAAAAAAAFCv4QR3YXJwnwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2FycApzdW1tYXJ5OiAnV2FycCB0byBhIGRlc3RpbmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YW50bHkgdGVsZXBvcnQgYW4gZW50aXR5IHRvIGEgZGVzdGluYXRpb24gc3lzdGVtLiBSZXF1aXJlcyB3YXJwIGNhcGFiaWxpdHksIGZ1bGwgZW5lcmd5LCBlbXB0eSBjYXJnbywgYW5kIGFuIGVtcHR5IHNjaGVkdWxlLiBUaGUgZGVzdGluYXRpb24gbXVzdCBiZSBhIHZhbGlkIHN5c3RlbSB3aXRoaW4gd2FycCByYW5nZS4gUmVzb2x2ZXMgaW1tZWRpYXRlbHkgYXMgYSB6ZXJvLWR1cmF0aW9uIHRhc2suAAAAAACgquMEd2lwZbIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGUKc3VtbWFyeTogJ0RFQlVHOiB3aXBlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLREAAAAAAMquQQNpNjQAAAljYXJnb19yb3cAAAAAYOlMRANpNjQAAAljbGFpbV9yb3cAAAAAZCclRQNpNjQAAApjb21taXRfcm93AAAAAPjs8lQDaTY0AAAKZW50aXR5X3JvdwCqppf57PJUA2k2NAAAD2VudGl0eWdyb3VwX3JvdwAAsAr77PJUA2k2NAAADmVudGl0eV9zZXFfcm93AAAAAICGaFUDaTY0AAAJZXBvY2hfcm93AABgbk2K8poDaTY0AAANbmZ0Y29uZmlnX3JvdwAAYAupiMylA2k2NAAAEW9yYWNsZV9jb25maWdfcm93AAAAAKuIzKUDaTY0AAAKb3JhY2xlX3JvdwAAAABc5U2sA2k2NAAACnBsYXllcl9yb3cAAABA7auwugNpNjQAAAtyZXNlcnZlX3JvdwAAAABEo7a6A2k2NAAACnJldmVhbF9yb3cAAAAAAJVNxgNpNjQAAAlzdGF0ZV9yb3cAAAAAAKyqzwNpNjQAAAl0eXBlc19yb3cAAHNrUlTN5QNpNjQAAA53cmFwY29uZmlnX3JvdwAAABlTVM3lA2k2NAAADHdyYXBjb3N0X3JvdwERU2hpcGxvYWQgKFNlcnZlcikRU2hpcGxvYWQgKFNlcnZlcikAAAA5AADINNYUnT4MdGFza19yZXN1bHRzAAAAAESFpkEOY2FuY2VsX3Jlc3VsdHMAAMg0VulMRAx0YXNrX3Jlc3VsdHMAAAAAgLzMRQx0YXNrX3Jlc3VsdHMAAAANu0ilSgx0YXNrX3Jlc3VsdHMAAAAAeBqrSgx0YXNrX3Jlc3VsdHMAgM8uT4WwSgZzdHJpbmcAAAAAXNWyYQx0YXNrX3Jlc3VsdHMAAGBuTYqyYgtnYW1lX2NvbmZpZwBAdphWlbJiDmV4dGVuZGVkX2Fzc2V0ABSaJmOXsmIGdWludDY0AFQ8jrmosmIIdWludDE2W10AAMAR5amyYgtlbnVtX3Jlc3VsdACwctnlqbJiDWVudGl0eV9pbmZvW10AAPDZ5amyYgtlbnRpdHlfaW5mbwBMNkmq7LJiD2l0ZW1kYXRhX3Jlc3VsdAAATk6q7LJiD2l0ZW1faWRzX3Jlc3VsdAAAAFiq7LJiCml0ZW1zX2luZm8AVPVZquyyYgV1aW50OIBV9Vmq7LJiC2VudW1fcmVzdWx0AExWMk0Hs2IQa2luZF9tZXRhX3Jlc3VsdAAmddkgGrNiDWxvY2F0aW9uX2luZm8AgMkmIRqzYhBsb2NhdGlvbl9kZXJpdmVkALCqPicqs2ILZW51bV9yZXN1bHQAAFZRJyqzYg5tb2R1bGVzX3Jlc3VsdAAA8OcaNbNiC25lYXJieV9pbmZvAIDC5uQ1s2IIc3RyaW5nW10AAF3T5TWzYg5uZnRpbmZvX3Jlc3VsdAAAuMqbWLNiC3BsYXllcl9pbmZvoLLJ+NFbs2IPcHJvamVjdGVkX3N0YXRlAABQ1SF1s2IOcmVjaXBlc19yZXN1bHQAAFbVIXWzYg5yZWNpcGVzX3Jlc3VsdAAAzgZhdbNiC2VudW1fcmVzdWx0ALDaV2F1s2ITc3RyYXR1bV9yZW1haW5pbmdbXYAVuppidbNiEHJlc291cmNlc19yZXN1bHQAAAA404izYhVlbnRpdHlfbGF5b3V0c19yZXN1bHQAgNTZ3IyzYgxzdHJhdHVtX2RhdGGAlbtGSo2zYhBlbnRpdHlfc3VtbWFyeVtdAFSkTV7Ks2INd29ybWhvbGVfaW5mb5AdnubmqullDHRhc2tfcmVzdWx0cwCi2ubmqullDHRhc2tfcmVzdWx0cwAAAAAA0LBpC2NoZWNrc3VtMjU2AAAAQITSsGkLY2hlY2tzdW01MTIAAAAAAJAMjQx0YXNrX3Jlc3VsdHMAAIhXM+nymgZzdHJpbmcAAGXXIIVMrAx0YXNrX3Jlc3VsdHMAfHZ5KoVMrAx0YXNrX3Jlc3VsdHMAAACKXdOQugx0YXNrX3Jlc3VsdHMAAABA7Uixug9yZXNvbHZlX3Jlc3VsdHMAQIxG7UixuhJyZXNvbHZlYWxsX3Jlc3VsdHMAAKDsGsRpxgx0YXNrX3Jlc3VsdHMAgM8uT8Vpxgx0YXNrX3Jlc3VsdHMAAAAgOzzNzQx0YXNrX3Jlc3VsdHMAAAAARLXNzQx0YXNrX3Jlc3VsdHMAAACexqrS1Ax0YXNrX3Jlc3VsdHMAAAAAJEPj1Ax0YXNrX3Jlc3VsdHMAAAAAAFCv4Qx0YXNrX3Jlc3VsdHM=');
|
|
444
444
|
const abi = ABI.from(abiBlob);
|
|
445
445
|
var Types;
|
|
446
446
|
(function (Types) {
|
|
@@ -857,22 +857,31 @@ var Types;
|
|
|
857
857
|
__decorate([
|
|
858
858
|
Struct.field(UInt64, { optional: true })
|
|
859
859
|
], craft.prototype, "target", void 0);
|
|
860
|
+
__decorate([
|
|
861
|
+
Struct.field(UInt8, { optional: true })
|
|
862
|
+
], craft.prototype, "slot", void 0);
|
|
860
863
|
craft = __decorate([
|
|
861
864
|
Struct.type('craft')
|
|
862
865
|
], craft);
|
|
863
866
|
Types.craft = craft;
|
|
864
|
-
let
|
|
867
|
+
let crafter_lane = class crafter_lane extends Struct {
|
|
865
868
|
};
|
|
869
|
+
__decorate([
|
|
870
|
+
Struct.field(UInt8)
|
|
871
|
+
], crafter_lane.prototype, "slot_index", void 0);
|
|
866
872
|
__decorate([
|
|
867
873
|
Struct.field(UInt16)
|
|
868
|
-
],
|
|
874
|
+
], crafter_lane.prototype, "speed", void 0);
|
|
869
875
|
__decorate([
|
|
870
876
|
Struct.field(UInt32)
|
|
871
|
-
],
|
|
872
|
-
|
|
873
|
-
Struct.
|
|
874
|
-
],
|
|
875
|
-
|
|
877
|
+
], crafter_lane.prototype, "drain", void 0);
|
|
878
|
+
__decorate([
|
|
879
|
+
Struct.field(UInt16)
|
|
880
|
+
], crafter_lane.prototype, "output_pct", void 0);
|
|
881
|
+
crafter_lane = __decorate([
|
|
882
|
+
Struct.type('crafter_lane')
|
|
883
|
+
], crafter_lane);
|
|
884
|
+
Types.crafter_lane = crafter_lane;
|
|
876
885
|
let demolish = class demolish extends Struct {
|
|
877
886
|
};
|
|
878
887
|
__decorate([
|
|
@@ -966,51 +975,60 @@ var Types;
|
|
|
966
975
|
Struct.type('warp_stats')
|
|
967
976
|
], warp_stats);
|
|
968
977
|
Types.warp_stats = warp_stats;
|
|
969
|
-
let
|
|
978
|
+
let hauler_stats = class hauler_stats extends Struct {
|
|
970
979
|
};
|
|
980
|
+
__decorate([
|
|
981
|
+
Struct.field(UInt8)
|
|
982
|
+
], hauler_stats.prototype, "capacity", void 0);
|
|
971
983
|
__decorate([
|
|
972
984
|
Struct.field(UInt16)
|
|
973
|
-
],
|
|
985
|
+
], hauler_stats.prototype, "efficiency", void 0);
|
|
974
986
|
__decorate([
|
|
975
987
|
Struct.field(UInt32)
|
|
976
|
-
],
|
|
988
|
+
], hauler_stats.prototype, "drain", void 0);
|
|
989
|
+
hauler_stats = __decorate([
|
|
990
|
+
Struct.type('hauler_stats')
|
|
991
|
+
], hauler_stats);
|
|
992
|
+
Types.hauler_stats = hauler_stats;
|
|
993
|
+
let gatherer_lane = class gatherer_lane extends Struct {
|
|
994
|
+
};
|
|
995
|
+
__decorate([
|
|
996
|
+
Struct.field(UInt8)
|
|
997
|
+
], gatherer_lane.prototype, "slot_index", void 0);
|
|
977
998
|
__decorate([
|
|
978
999
|
Struct.field(UInt16)
|
|
979
|
-
],
|
|
980
|
-
gatherer_stats = __decorate([
|
|
981
|
-
Struct.type('gatherer_stats')
|
|
982
|
-
], gatherer_stats);
|
|
983
|
-
Types.gatherer_stats = gatherer_stats;
|
|
984
|
-
let loader_stats = class loader_stats extends Struct {
|
|
985
|
-
};
|
|
1000
|
+
], gatherer_lane.prototype, "yield", void 0);
|
|
986
1001
|
__decorate([
|
|
987
1002
|
Struct.field(UInt32)
|
|
988
|
-
],
|
|
1003
|
+
], gatherer_lane.prototype, "drain", void 0);
|
|
989
1004
|
__decorate([
|
|
990
1005
|
Struct.field(UInt16)
|
|
991
|
-
],
|
|
1006
|
+
], gatherer_lane.prototype, "depth", void 0);
|
|
992
1007
|
__decorate([
|
|
993
|
-
Struct.field(
|
|
994
|
-
],
|
|
995
|
-
|
|
996
|
-
Struct.type('
|
|
997
|
-
],
|
|
998
|
-
Types.
|
|
999
|
-
let
|
|
1008
|
+
Struct.field(UInt16)
|
|
1009
|
+
], gatherer_lane.prototype, "output_pct", void 0);
|
|
1010
|
+
gatherer_lane = __decorate([
|
|
1011
|
+
Struct.type('gatherer_lane')
|
|
1012
|
+
], gatherer_lane);
|
|
1013
|
+
Types.gatherer_lane = gatherer_lane;
|
|
1014
|
+
let loader_lane = class loader_lane extends Struct {
|
|
1000
1015
|
};
|
|
1001
1016
|
__decorate([
|
|
1002
1017
|
Struct.field(UInt8)
|
|
1003
|
-
],
|
|
1018
|
+
], loader_lane.prototype, "slot_index", void 0);
|
|
1019
|
+
__decorate([
|
|
1020
|
+
Struct.field(UInt32)
|
|
1021
|
+
], loader_lane.prototype, "mass", void 0);
|
|
1004
1022
|
__decorate([
|
|
1005
1023
|
Struct.field(UInt16)
|
|
1006
|
-
],
|
|
1024
|
+
], loader_lane.prototype, "thrust", void 0);
|
|
1007
1025
|
__decorate([
|
|
1008
|
-
Struct.field(
|
|
1009
|
-
],
|
|
1010
|
-
|
|
1011
|
-
Struct.type('
|
|
1012
|
-
],
|
|
1013
|
-
Types.
|
|
1026
|
+
Struct.field(UInt16)
|
|
1027
|
+
], loader_lane.prototype, "output_pct", void 0);
|
|
1028
|
+
loader_lane = __decorate([
|
|
1029
|
+
Struct.type('loader_lane')
|
|
1030
|
+
], loader_lane);
|
|
1031
|
+
Types.loader_lane = loader_lane;
|
|
1014
1032
|
let task = class task extends Struct {
|
|
1015
1033
|
};
|
|
1016
1034
|
__decorate([
|
|
@@ -1136,18 +1154,18 @@ var Types;
|
|
|
1136
1154
|
__decorate([
|
|
1137
1155
|
Struct.field(energy_stats, { optional: true })
|
|
1138
1156
|
], entity_info.prototype, "generator", void 0);
|
|
1139
|
-
__decorate([
|
|
1140
|
-
Struct.field(gatherer_stats, { optional: true })
|
|
1141
|
-
], entity_info.prototype, "gatherer", void 0);
|
|
1142
|
-
__decorate([
|
|
1143
|
-
Struct.field(loader_stats, { optional: true })
|
|
1144
|
-
], entity_info.prototype, "loaders", void 0);
|
|
1145
1157
|
__decorate([
|
|
1146
1158
|
Struct.field(hauler_stats, { optional: true })
|
|
1147
1159
|
], entity_info.prototype, "hauler", void 0);
|
|
1148
1160
|
__decorate([
|
|
1149
|
-
Struct.field(
|
|
1150
|
-
], entity_info.prototype, "
|
|
1161
|
+
Struct.field(gatherer_lane, { array: true })
|
|
1162
|
+
], entity_info.prototype, "gatherer_lanes", void 0);
|
|
1163
|
+
__decorate([
|
|
1164
|
+
Struct.field(crafter_lane, { array: true })
|
|
1165
|
+
], entity_info.prototype, "crafter_lanes", void 0);
|
|
1166
|
+
__decorate([
|
|
1167
|
+
Struct.field(loader_lane, { array: true })
|
|
1168
|
+
], entity_info.prototype, "loader_lanes", void 0);
|
|
1151
1169
|
__decorate([
|
|
1152
1170
|
Struct.field(lane, { array: true })
|
|
1153
1171
|
], entity_info.prototype, "lanes", void 0);
|
|
@@ -1373,6 +1391,9 @@ var Types;
|
|
|
1373
1391
|
__decorate([
|
|
1374
1392
|
Struct.field(UInt32)
|
|
1375
1393
|
], gather.prototype, "quantity", void 0);
|
|
1394
|
+
__decorate([
|
|
1395
|
+
Struct.field(UInt8, { optional: true })
|
|
1396
|
+
], gather.prototype, "slot", void 0);
|
|
1376
1397
|
gather = __decorate([
|
|
1377
1398
|
Struct.type('gather')
|
|
1378
1399
|
], gather);
|
|
@@ -1404,6 +1425,24 @@ var Types;
|
|
|
1404
1425
|
Struct.type('getdeposit')
|
|
1405
1426
|
], getdeposit);
|
|
1406
1427
|
Types.getdeposit = getdeposit;
|
|
1428
|
+
let getdistance = class getdistance extends Struct {
|
|
1429
|
+
};
|
|
1430
|
+
__decorate([
|
|
1431
|
+
Struct.field(Int64)
|
|
1432
|
+
], getdistance.prototype, "ax", void 0);
|
|
1433
|
+
__decorate([
|
|
1434
|
+
Struct.field(Int64)
|
|
1435
|
+
], getdistance.prototype, "ay", void 0);
|
|
1436
|
+
__decorate([
|
|
1437
|
+
Struct.field(Int64)
|
|
1438
|
+
], getdistance.prototype, "bx", void 0);
|
|
1439
|
+
__decorate([
|
|
1440
|
+
Struct.field(Int64)
|
|
1441
|
+
], getdistance.prototype, "by", void 0);
|
|
1442
|
+
getdistance = __decorate([
|
|
1443
|
+
Struct.type('getdistance')
|
|
1444
|
+
], getdistance);
|
|
1445
|
+
Types.getdistance = getdistance;
|
|
1407
1446
|
let geteligible = class geteligible extends Struct {
|
|
1408
1447
|
};
|
|
1409
1448
|
__decorate([
|
|
@@ -1641,6 +1680,39 @@ var Types;
|
|
|
1641
1680
|
Struct.type('getsummaries')
|
|
1642
1681
|
], getsummaries);
|
|
1643
1682
|
Types.getsummaries = getsummaries;
|
|
1683
|
+
let getwormhole = class getwormhole extends Struct {
|
|
1684
|
+
};
|
|
1685
|
+
__decorate([
|
|
1686
|
+
Struct.field(Int64)
|
|
1687
|
+
], getwormhole.prototype, "x", void 0);
|
|
1688
|
+
__decorate([
|
|
1689
|
+
Struct.field(Int64)
|
|
1690
|
+
], getwormhole.prototype, "y", void 0);
|
|
1691
|
+
getwormhole = __decorate([
|
|
1692
|
+
Struct.type('getwormhole')
|
|
1693
|
+
], getwormhole);
|
|
1694
|
+
Types.getwormhole = getwormhole;
|
|
1695
|
+
let grouptransit = class grouptransit extends Struct {
|
|
1696
|
+
};
|
|
1697
|
+
__decorate([
|
|
1698
|
+
Struct.field(entity_ref, { array: true })
|
|
1699
|
+
], grouptransit.prototype, "entities", void 0);
|
|
1700
|
+
__decorate([
|
|
1701
|
+
Struct.field(Int64)
|
|
1702
|
+
], grouptransit.prototype, "ax", void 0);
|
|
1703
|
+
__decorate([
|
|
1704
|
+
Struct.field(Int64)
|
|
1705
|
+
], grouptransit.prototype, "ay", void 0);
|
|
1706
|
+
__decorate([
|
|
1707
|
+
Struct.field(Int64)
|
|
1708
|
+
], grouptransit.prototype, "bx", void 0);
|
|
1709
|
+
__decorate([
|
|
1710
|
+
Struct.field(Int64)
|
|
1711
|
+
], grouptransit.prototype, "by", void 0);
|
|
1712
|
+
grouptransit = __decorate([
|
|
1713
|
+
Struct.type('grouptransit')
|
|
1714
|
+
], grouptransit);
|
|
1715
|
+
Types.grouptransit = grouptransit;
|
|
1644
1716
|
let grouptravel = class grouptravel extends Struct {
|
|
1645
1717
|
};
|
|
1646
1718
|
__decorate([
|
|
@@ -2006,6 +2078,9 @@ var Types;
|
|
|
2006
2078
|
__decorate([
|
|
2007
2079
|
Struct.field('bool')
|
|
2008
2080
|
], location_info.prototype, "is_system", void 0);
|
|
2081
|
+
__decorate([
|
|
2082
|
+
Struct.field('bool')
|
|
2083
|
+
], location_info.prototype, "is_wormhole", void 0);
|
|
2009
2084
|
location_info = __decorate([
|
|
2010
2085
|
Struct.type('location_info')
|
|
2011
2086
|
], location_info);
|
|
@@ -2333,18 +2408,18 @@ var Types;
|
|
|
2333
2408
|
__decorate([
|
|
2334
2409
|
Struct.field(energy_stats, { optional: true })
|
|
2335
2410
|
], projected_state.prototype, "generator", void 0);
|
|
2336
|
-
__decorate([
|
|
2337
|
-
Struct.field(gatherer_stats, { optional: true })
|
|
2338
|
-
], projected_state.prototype, "gatherer", void 0);
|
|
2339
|
-
__decorate([
|
|
2340
|
-
Struct.field(loader_stats, { optional: true })
|
|
2341
|
-
], projected_state.prototype, "loaders", void 0);
|
|
2342
2411
|
__decorate([
|
|
2343
2412
|
Struct.field(hauler_stats, { optional: true })
|
|
2344
2413
|
], projected_state.prototype, "hauler", void 0);
|
|
2345
2414
|
__decorate([
|
|
2346
|
-
Struct.field(
|
|
2347
|
-
], projected_state.prototype, "
|
|
2415
|
+
Struct.field(gatherer_lane, { array: true })
|
|
2416
|
+
], projected_state.prototype, "gatherer_lanes", void 0);
|
|
2417
|
+
__decorate([
|
|
2418
|
+
Struct.field(crafter_lane, { array: true })
|
|
2419
|
+
], projected_state.prototype, "crafter_lanes", void 0);
|
|
2420
|
+
__decorate([
|
|
2421
|
+
Struct.field(loader_lane, { array: true })
|
|
2422
|
+
], projected_state.prototype, "loader_lanes", void 0);
|
|
2348
2423
|
projected_state = __decorate([
|
|
2349
2424
|
Struct.type('projected_state')
|
|
2350
2425
|
], projected_state);
|
|
@@ -2544,6 +2619,21 @@ var Types;
|
|
|
2544
2619
|
Struct.type('rmnftcfg')
|
|
2545
2620
|
], rmnftcfg);
|
|
2546
2621
|
Types.rmnftcfg = rmnftcfg;
|
|
2622
|
+
let setcoords = class setcoords extends Struct {
|
|
2623
|
+
};
|
|
2624
|
+
__decorate([
|
|
2625
|
+
Struct.field(UInt64)
|
|
2626
|
+
], setcoords.prototype, "entity_id", void 0);
|
|
2627
|
+
__decorate([
|
|
2628
|
+
Struct.field(Int64)
|
|
2629
|
+
], setcoords.prototype, "x", void 0);
|
|
2630
|
+
__decorate([
|
|
2631
|
+
Struct.field(Int64)
|
|
2632
|
+
], setcoords.prototype, "y", void 0);
|
|
2633
|
+
setcoords = __decorate([
|
|
2634
|
+
Struct.type('setcoords')
|
|
2635
|
+
], setcoords);
|
|
2636
|
+
Types.setcoords = setcoords;
|
|
2547
2637
|
let setnftcfg = class setnftcfg extends Struct {
|
|
2548
2638
|
};
|
|
2549
2639
|
__decorate([
|
|
@@ -2703,6 +2793,27 @@ var Types;
|
|
|
2703
2793
|
Struct.type('task_results')
|
|
2704
2794
|
], task_results);
|
|
2705
2795
|
Types.task_results = task_results;
|
|
2796
|
+
let transit = class transit extends Struct {
|
|
2797
|
+
};
|
|
2798
|
+
__decorate([
|
|
2799
|
+
Struct.field(UInt64)
|
|
2800
|
+
], transit.prototype, "id", void 0);
|
|
2801
|
+
__decorate([
|
|
2802
|
+
Struct.field(Int64)
|
|
2803
|
+
], transit.prototype, "ax", void 0);
|
|
2804
|
+
__decorate([
|
|
2805
|
+
Struct.field(Int64)
|
|
2806
|
+
], transit.prototype, "ay", void 0);
|
|
2807
|
+
__decorate([
|
|
2808
|
+
Struct.field(Int64)
|
|
2809
|
+
], transit.prototype, "bx", void 0);
|
|
2810
|
+
__decorate([
|
|
2811
|
+
Struct.field(Int64)
|
|
2812
|
+
], transit.prototype, "by", void 0);
|
|
2813
|
+
transit = __decorate([
|
|
2814
|
+
Struct.type('transit')
|
|
2815
|
+
], transit);
|
|
2816
|
+
Types.transit = transit;
|
|
2706
2817
|
let travel = class travel extends Struct {
|
|
2707
2818
|
};
|
|
2708
2819
|
__decorate([
|
|
@@ -2790,6 +2901,21 @@ var Types;
|
|
|
2790
2901
|
Struct.type('wipe')
|
|
2791
2902
|
], wipe);
|
|
2792
2903
|
Types.wipe = wipe;
|
|
2904
|
+
let wormhole_info = class wormhole_info extends Struct {
|
|
2905
|
+
};
|
|
2906
|
+
__decorate([
|
|
2907
|
+
Struct.field(coordinates)
|
|
2908
|
+
], wormhole_info.prototype, "coords", void 0);
|
|
2909
|
+
__decorate([
|
|
2910
|
+
Struct.field('bool')
|
|
2911
|
+
], wormhole_info.prototype, "is_wormhole", void 0);
|
|
2912
|
+
__decorate([
|
|
2913
|
+
Struct.field(coordinates)
|
|
2914
|
+
], wormhole_info.prototype, "destination", void 0);
|
|
2915
|
+
wormhole_info = __decorate([
|
|
2916
|
+
Struct.type('wormhole_info')
|
|
2917
|
+
], wormhole_info);
|
|
2918
|
+
Types.wormhole_info = wormhole_info;
|
|
2793
2919
|
let wrapconfig_row = class wrapconfig_row extends Struct {
|
|
2794
2920
|
};
|
|
2795
2921
|
__decorate([
|
|
@@ -2917,6 +3043,8 @@ const GROUP_NOT_FOUND = 'Entity group not found.';
|
|
|
2917
3043
|
const GROUP_DUPLICATE_ENTITY = 'Duplicate entity in group.';
|
|
2918
3044
|
const GROUP_HAUL_CAPACITY_EXCEEDED = 'Group travel requires sufficient hauler capacity for all non-self-propelled entities.';
|
|
2919
3045
|
const CANCEL_CONTAINS_GROUPED_TASK = 'Cannot cancel range containing grouped task - cancel non-grouped tasks first.';
|
|
3046
|
+
const WOULD_STRAND = 'Cancelling this would leave a later task without the cargo it needs.';
|
|
3047
|
+
const WOULD_OVERFILL = 'Cancelling this would overfill the other entity with returned cargo.';
|
|
2920
3048
|
const WARP_NO_CAPABILITY = 'Entity does not have warp capability.';
|
|
2921
3049
|
const WARP_HAS_SCHEDULE = 'Entity must be idle to warp.';
|
|
2922
3050
|
const WARP_HAS_CARGO = 'Entity must have no cargo to warp.';
|
|
@@ -2971,6 +3099,7 @@ var TaskType;
|
|
|
2971
3099
|
TaskType[TaskType["WARP"] = 6] = "WARP";
|
|
2972
3100
|
TaskType[TaskType["CRAFT"] = 7] = "CRAFT";
|
|
2973
3101
|
TaskType[TaskType["DEPLOY"] = 8] = "DEPLOY";
|
|
3102
|
+
TaskType[TaskType["TRANSIT"] = 9] = "TRANSIT";
|
|
2974
3103
|
TaskType[TaskType["UNWRAP"] = 10] = "UNWRAP";
|
|
2975
3104
|
TaskType[TaskType["UNDEPLOY"] = 11] = "UNDEPLOY";
|
|
2976
3105
|
TaskType[TaskType["DEMOLISH"] = 13] = "DEMOLISH";
|
|
@@ -3795,15 +3924,15 @@ var recipes = [
|
|
|
3795
3924
|
},
|
|
3796
3925
|
{
|
|
3797
3926
|
outputItemId: 10200,
|
|
3798
|
-
outputMass:
|
|
3927
|
+
outputMass: 1900000,
|
|
3799
3928
|
inputs: [
|
|
3800
3929
|
{
|
|
3801
3930
|
itemId: 10001,
|
|
3802
3931
|
quantity: 600
|
|
3803
3932
|
},
|
|
3804
3933
|
{
|
|
3805
|
-
itemId:
|
|
3806
|
-
quantity:
|
|
3934
|
+
itemId: 10008,
|
|
3935
|
+
quantity: 600
|
|
3807
3936
|
}
|
|
3808
3937
|
],
|
|
3809
3938
|
statSlots: [
|
|
@@ -3845,15 +3974,27 @@ var recipes = [
|
|
|
3845
3974
|
},
|
|
3846
3975
|
{
|
|
3847
3976
|
outputItemId: 10201,
|
|
3848
|
-
outputMass:
|
|
3977
|
+
outputMass: 2400000,
|
|
3849
3978
|
inputs: [
|
|
3850
3979
|
{
|
|
3851
3980
|
itemId: 10001,
|
|
3852
|
-
quantity:
|
|
3981
|
+
quantity: 300
|
|
3853
3982
|
},
|
|
3854
3983
|
{
|
|
3855
|
-
itemId:
|
|
3856
|
-
quantity:
|
|
3984
|
+
itemId: 10008,
|
|
3985
|
+
quantity: 300
|
|
3986
|
+
},
|
|
3987
|
+
{
|
|
3988
|
+
itemId: 10007,
|
|
3989
|
+
quantity: 300
|
|
3990
|
+
},
|
|
3991
|
+
{
|
|
3992
|
+
itemId: 10003,
|
|
3993
|
+
quantity: 300
|
|
3994
|
+
},
|
|
3995
|
+
{
|
|
3996
|
+
itemId: 10006,
|
|
3997
|
+
quantity: 300
|
|
3857
3998
|
}
|
|
3858
3999
|
],
|
|
3859
4000
|
statSlots: [
|
|
@@ -3875,18 +4016,10 @@ var recipes = [
|
|
|
3875
4016
|
},
|
|
3876
4017
|
{
|
|
3877
4018
|
sources: [
|
|
3878
|
-
{
|
|
3879
|
-
inputIndex: 1,
|
|
3880
|
-
statIndex: 0
|
|
3881
|
-
}
|
|
3882
4019
|
]
|
|
3883
4020
|
},
|
|
3884
4021
|
{
|
|
3885
4022
|
sources: [
|
|
3886
|
-
{
|
|
3887
|
-
inputIndex: 1,
|
|
3888
|
-
statIndex: 1
|
|
3889
|
-
}
|
|
3890
4023
|
]
|
|
3891
4024
|
}
|
|
3892
4025
|
],
|
|
@@ -3895,14 +4028,14 @@ var recipes = [
|
|
|
3895
4028
|
},
|
|
3896
4029
|
{
|
|
3897
4030
|
outputItemId: 10202,
|
|
3898
|
-
outputMass:
|
|
4031
|
+
outputMass: 3200000,
|
|
3899
4032
|
inputs: [
|
|
3900
4033
|
{
|
|
3901
4034
|
itemId: 10001,
|
|
3902
|
-
quantity:
|
|
4035
|
+
quantity: 1000
|
|
3903
4036
|
},
|
|
3904
4037
|
{
|
|
3905
|
-
itemId:
|
|
4038
|
+
itemId: 10008,
|
|
3906
4039
|
quantity: 1000
|
|
3907
4040
|
}
|
|
3908
4041
|
],
|
|
@@ -3945,24 +4078,20 @@ var recipes = [
|
|
|
3945
4078
|
},
|
|
3946
4079
|
{
|
|
3947
4080
|
outputItemId: 10203,
|
|
3948
|
-
outputMass:
|
|
4081
|
+
outputMass: 1900000,
|
|
3949
4082
|
inputs: [
|
|
3950
4083
|
{
|
|
3951
|
-
itemId:
|
|
3952
|
-
quantity:
|
|
4084
|
+
itemId: 10008,
|
|
4085
|
+
quantity: 600
|
|
3953
4086
|
},
|
|
3954
4087
|
{
|
|
3955
|
-
itemId:
|
|
3956
|
-
quantity:
|
|
4088
|
+
itemId: 10006,
|
|
4089
|
+
quantity: 600
|
|
3957
4090
|
}
|
|
3958
4091
|
],
|
|
3959
4092
|
statSlots: [
|
|
3960
4093
|
{
|
|
3961
4094
|
sources: [
|
|
3962
|
-
{
|
|
3963
|
-
inputIndex: 0,
|
|
3964
|
-
statIndex: 0
|
|
3965
|
-
}
|
|
3966
4095
|
]
|
|
3967
4096
|
},
|
|
3968
4097
|
{
|
|
@@ -3976,17 +4105,13 @@ var recipes = [
|
|
|
3976
4105
|
{
|
|
3977
4106
|
sources: [
|
|
3978
4107
|
{
|
|
3979
|
-
inputIndex:
|
|
4108
|
+
inputIndex: 0,
|
|
3980
4109
|
statIndex: 0
|
|
3981
4110
|
}
|
|
3982
4111
|
]
|
|
3983
4112
|
},
|
|
3984
4113
|
{
|
|
3985
4114
|
sources: [
|
|
3986
|
-
{
|
|
3987
|
-
inputIndex: 1,
|
|
3988
|
-
statIndex: 1
|
|
3989
|
-
}
|
|
3990
4115
|
]
|
|
3991
4116
|
}
|
|
3992
4117
|
],
|
|
@@ -3995,32 +4120,20 @@ var recipes = [
|
|
|
3995
4120
|
},
|
|
3996
4121
|
{
|
|
3997
4122
|
outputItemId: 10204,
|
|
3998
|
-
outputMass:
|
|
4123
|
+
outputMass: 1900000,
|
|
3999
4124
|
inputs: [
|
|
4000
|
-
{
|
|
4001
|
-
itemId: 10001,
|
|
4002
|
-
quantity: 1500
|
|
4003
|
-
},
|
|
4004
|
-
{
|
|
4005
|
-
itemId: 10002,
|
|
4006
|
-
quantity: 600
|
|
4007
|
-
},
|
|
4008
4125
|
{
|
|
4009
4126
|
itemId: 10008,
|
|
4010
|
-
quantity:
|
|
4127
|
+
quantity: 600
|
|
4011
4128
|
},
|
|
4012
4129
|
{
|
|
4013
|
-
itemId:
|
|
4014
|
-
quantity:
|
|
4130
|
+
itemId: 10007,
|
|
4131
|
+
quantity: 600
|
|
4015
4132
|
}
|
|
4016
4133
|
],
|
|
4017
4134
|
statSlots: [
|
|
4018
4135
|
{
|
|
4019
4136
|
sources: [
|
|
4020
|
-
{
|
|
4021
|
-
inputIndex: 0,
|
|
4022
|
-
statIndex: 0
|
|
4023
|
-
}
|
|
4024
4137
|
]
|
|
4025
4138
|
},
|
|
4026
4139
|
{
|
|
@@ -4034,17 +4147,13 @@ var recipes = [
|
|
|
4034
4147
|
{
|
|
4035
4148
|
sources: [
|
|
4036
4149
|
{
|
|
4037
|
-
inputIndex:
|
|
4150
|
+
inputIndex: 0,
|
|
4038
4151
|
statIndex: 0
|
|
4039
4152
|
}
|
|
4040
4153
|
]
|
|
4041
4154
|
},
|
|
4042
4155
|
{
|
|
4043
4156
|
sources: [
|
|
4044
|
-
{
|
|
4045
|
-
inputIndex: 1,
|
|
4046
|
-
statIndex: 1
|
|
4047
|
-
}
|
|
4048
4157
|
]
|
|
4049
4158
|
}
|
|
4050
4159
|
],
|
|
@@ -4257,11 +4366,11 @@ var entities = [
|
|
|
4257
4366
|
slots: [
|
|
4258
4367
|
{
|
|
4259
4368
|
type: "generator",
|
|
4260
|
-
outputPct:
|
|
4369
|
+
outputPct: 200
|
|
4261
4370
|
},
|
|
4262
4371
|
{
|
|
4263
4372
|
type: "gatherer",
|
|
4264
|
-
outputPct:
|
|
4373
|
+
outputPct: 200
|
|
4265
4374
|
}
|
|
4266
4375
|
]
|
|
4267
4376
|
},
|
|
@@ -4270,11 +4379,11 @@ var entities = [
|
|
|
4270
4379
|
slots: [
|
|
4271
4380
|
{
|
|
4272
4381
|
type: "generator",
|
|
4273
|
-
outputPct:
|
|
4382
|
+
outputPct: 200
|
|
4274
4383
|
},
|
|
4275
4384
|
{
|
|
4276
4385
|
type: "crafter",
|
|
4277
|
-
outputPct:
|
|
4386
|
+
outputPct: 200
|
|
4278
4387
|
}
|
|
4279
4388
|
]
|
|
4280
4389
|
},
|
|
@@ -4801,31 +4910,31 @@ var items = [
|
|
|
4801
4910
|
},
|
|
4802
4911
|
{
|
|
4803
4912
|
id: 10200,
|
|
4804
|
-
mass:
|
|
4913
|
+
mass: 1900000,
|
|
4805
4914
|
type: "entity",
|
|
4806
4915
|
tier: 1
|
|
4807
4916
|
},
|
|
4808
4917
|
{
|
|
4809
4918
|
id: 10201,
|
|
4810
|
-
mass:
|
|
4919
|
+
mass: 2400000,
|
|
4811
4920
|
type: "entity",
|
|
4812
4921
|
tier: 1
|
|
4813
4922
|
},
|
|
4814
4923
|
{
|
|
4815
4924
|
id: 10202,
|
|
4816
|
-
mass:
|
|
4925
|
+
mass: 3200000,
|
|
4817
4926
|
type: "entity",
|
|
4818
4927
|
tier: 1
|
|
4819
4928
|
},
|
|
4820
4929
|
{
|
|
4821
4930
|
id: 10203,
|
|
4822
|
-
mass:
|
|
4931
|
+
mass: 1900000,
|
|
4823
4932
|
type: "entity",
|
|
4824
4933
|
tier: 1
|
|
4825
4934
|
},
|
|
4826
4935
|
{
|
|
4827
4936
|
id: 10204,
|
|
4828
|
-
mass:
|
|
4937
|
+
mass: 1900000,
|
|
4829
4938
|
type: "entity",
|
|
4830
4939
|
tier: 1
|
|
4831
4940
|
},
|
|
@@ -5384,6 +5493,102 @@ function deriveLocationSize(loc) {
|
|
|
5384
5493
|
return Math.floor(LOCATION_MIN_DEPTH + curved * range);
|
|
5385
5494
|
}
|
|
5386
5495
|
|
|
5496
|
+
const WH = {
|
|
5497
|
+
RSIZE: 75,
|
|
5498
|
+
ZONE: 16384,
|
|
5499
|
+
THRESHOLD: 8192,
|
|
5500
|
+
MIN_REACH: 50000,
|
|
5501
|
+
TRANSIT_SPEED: 500,
|
|
5502
|
+
};
|
|
5503
|
+
const HALF = Math.round(Math.log2(WH.ZONE));
|
|
5504
|
+
const MASK = WH.ZONE - 1;
|
|
5505
|
+
function roll16(seed, str) {
|
|
5506
|
+
const h = hash512(seed, str).array;
|
|
5507
|
+
return (h[0] << 8) | h[1];
|
|
5508
|
+
}
|
|
5509
|
+
function feistelF(seed, x, round, key) {
|
|
5510
|
+
return roll16(seed, `feistel-${key}-${round}-${x}`) & MASK;
|
|
5511
|
+
}
|
|
5512
|
+
function feistel(seed, idx, key) {
|
|
5513
|
+
let L = (idx >>> HALF) & MASK;
|
|
5514
|
+
let R = idx & MASK;
|
|
5515
|
+
for (let r = 0; r < 4; r++) {
|
|
5516
|
+
const nR = L ^ feistelF(seed, R, r, key);
|
|
5517
|
+
L = R;
|
|
5518
|
+
R = nR;
|
|
5519
|
+
}
|
|
5520
|
+
return (L << HALF) | R;
|
|
5521
|
+
}
|
|
5522
|
+
function feistelInv(seed, idx, key) {
|
|
5523
|
+
let L = (idx >>> HALF) & MASK;
|
|
5524
|
+
let R = idx & MASK;
|
|
5525
|
+
for (let r = 3; r >= 0; r--) {
|
|
5526
|
+
const nL = R ^ feistelF(seed, L, r, key);
|
|
5527
|
+
R = L;
|
|
5528
|
+
L = nL;
|
|
5529
|
+
}
|
|
5530
|
+
return (L << HALF) | R;
|
|
5531
|
+
}
|
|
5532
|
+
function regionOf(x, y) {
|
|
5533
|
+
return { rx: Math.floor(x / WH.RSIZE), ry: Math.floor(y / WH.RSIZE) };
|
|
5534
|
+
}
|
|
5535
|
+
function partnerRegion(seed, R) {
|
|
5536
|
+
const qx = Math.floor(R.rx / WH.ZONE);
|
|
5537
|
+
const qy = Math.floor(R.ry / WH.ZONE);
|
|
5538
|
+
const zx = qx * WH.ZONE;
|
|
5539
|
+
const zy = qy * WH.ZONE;
|
|
5540
|
+
const key = `${qx}:${qy}`;
|
|
5541
|
+
const idx = (R.ry - zy) * WH.ZONE + (R.rx - zx);
|
|
5542
|
+
const p = feistelInv(seed, feistel(seed, idx, key) ^ 1, key);
|
|
5543
|
+
return { rx: zx + (p % WH.ZONE), ry: zy + Math.floor(p / WH.ZONE) };
|
|
5544
|
+
}
|
|
5545
|
+
function regKey(R) {
|
|
5546
|
+
return `${R.rx}:${R.ry}`;
|
|
5547
|
+
}
|
|
5548
|
+
function pairKey(a, b) {
|
|
5549
|
+
const ka = regKey(a);
|
|
5550
|
+
const kb = regKey(b);
|
|
5551
|
+
return ka < kb ? `${ka}|${kb}` : `${kb}|${ka}`;
|
|
5552
|
+
}
|
|
5553
|
+
function endpointInRegion(seed, R, key) {
|
|
5554
|
+
const h = hash512(seed, `wh-endpoint-${key}-${regKey(R)}`).array;
|
|
5555
|
+
const ox = ((h[0] << 24) | (h[1] << 16) | (h[2] << 8) | h[3]) >>> 0;
|
|
5556
|
+
const oy = ((h[4] << 24) | (h[5] << 16) | (h[6] << 8) | h[7]) >>> 0;
|
|
5557
|
+
return { x: R.rx * WH.RSIZE + (ox % WH.RSIZE), y: R.ry * WH.RSIZE + (oy % WH.RSIZE) };
|
|
5558
|
+
}
|
|
5559
|
+
function dist(a, b) {
|
|
5560
|
+
return Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);
|
|
5561
|
+
}
|
|
5562
|
+
function wormholeOfRegion(seed, R) {
|
|
5563
|
+
const P = partnerRegion(seed, R);
|
|
5564
|
+
if (P.rx === R.rx && P.ry === R.ry)
|
|
5565
|
+
return null;
|
|
5566
|
+
const key = pairKey(R, P);
|
|
5567
|
+
if (roll16(seed, `wh-exists-${key}`) >= WH.THRESHOLD)
|
|
5568
|
+
return null;
|
|
5569
|
+
const A = endpointInRegion(seed, R, key);
|
|
5570
|
+
const B = endpointInRegion(seed, P, key);
|
|
5571
|
+
if (dist(A, B) < WH.MIN_REACH)
|
|
5572
|
+
return null;
|
|
5573
|
+
return { A, B };
|
|
5574
|
+
}
|
|
5575
|
+
function wormholeAtRegionEndpoint(seed, rx, ry) {
|
|
5576
|
+
const w = wormholeOfRegion(seed, { rx, ry });
|
|
5577
|
+
if (!w)
|
|
5578
|
+
return null;
|
|
5579
|
+
return { from: w.A, to: w.B };
|
|
5580
|
+
}
|
|
5581
|
+
function wormholeAt(seed, x, y) {
|
|
5582
|
+
const w = wormholeOfRegion(seed, regionOf(x, y));
|
|
5583
|
+
if (!w || w.A.x !== x || w.A.y !== y)
|
|
5584
|
+
return null;
|
|
5585
|
+
return w.B;
|
|
5586
|
+
}
|
|
5587
|
+
function isValidWormholePair(seed, ax, ay, bx, by) {
|
|
5588
|
+
const to = wormholeAt(seed, ax, ay);
|
|
5589
|
+
return to !== null && to.x === bx && to.y === by;
|
|
5590
|
+
}
|
|
5591
|
+
|
|
5387
5592
|
var syllables = [
|
|
5388
5593
|
"A",
|
|
5389
5594
|
"Ab",
|
|
@@ -7629,6 +7834,13 @@ function getSystemName(gameSeed, location) {
|
|
|
7629
7834
|
function hasSystem(gameSeed, coordinates) {
|
|
7630
7835
|
return getLocationType(gameSeed, coordinates) !== LocationType.EMPTY;
|
|
7631
7836
|
}
|
|
7837
|
+
function getLocationKind(gameSeed, x, y) {
|
|
7838
|
+
if (wormholeAt(gameSeed, x, y))
|
|
7839
|
+
return 'wormhole';
|
|
7840
|
+
if (hasSystem(gameSeed, { x, y }))
|
|
7841
|
+
return 'system';
|
|
7842
|
+
return 'empty';
|
|
7843
|
+
}
|
|
7632
7844
|
function deriveLocationStatic(gameSeed, coordinates) {
|
|
7633
7845
|
const seed = Checksum256.from(gameSeed);
|
|
7634
7846
|
const coords = Coordinates.from(coordinates);
|
|
@@ -8330,7 +8542,10 @@ function entityDoesTaskType(entity, taskType, now) {
|
|
|
8330
8542
|
}
|
|
8331
8543
|
function isInFlight(entity, now) {
|
|
8332
8544
|
const lane = mobilityLane(entity);
|
|
8333
|
-
|
|
8545
|
+
if (!lane)
|
|
8546
|
+
return false;
|
|
8547
|
+
const t = currentTaskType(lane.schedule, now);
|
|
8548
|
+
return t === TaskType.TRAVEL || t === TaskType.TRANSIT;
|
|
8334
8549
|
}
|
|
8335
8550
|
function isRecharging(entity, now) {
|
|
8336
8551
|
return entityDoesTaskType(entity, TaskType.RECHARGE, now);
|
|
@@ -8390,6 +8605,9 @@ var schedule = /*#__PURE__*/Object.freeze({
|
|
|
8390
8605
|
currentTaskProgressFloatForLane: currentTaskProgressFloatForLane
|
|
8391
8606
|
});
|
|
8392
8607
|
|
|
8608
|
+
function isPositionalTask(task) {
|
|
8609
|
+
return task.type.equals(TaskType.TRAVEL) || task.type.equals(TaskType.TRANSIT);
|
|
8610
|
+
}
|
|
8393
8611
|
function calc_orbital_altitude(mass) {
|
|
8394
8612
|
if (mass <= BASE_ORBITAL_MASS) {
|
|
8395
8613
|
return MIN_ORBITAL_ALTITUDE;
|
|
@@ -8443,7 +8661,7 @@ function getInterpolatedPosition(entity, taskIndex, taskProgress) {
|
|
|
8443
8661
|
return { x: Number(settled.x), y: Number(settled.y) };
|
|
8444
8662
|
}
|
|
8445
8663
|
const task = tasks[taskIndex];
|
|
8446
|
-
if (!task
|
|
8664
|
+
if (!isPositionalTask(task) || !task.coordinates) {
|
|
8447
8665
|
const origin = getFlightOrigin(entity, taskIndex);
|
|
8448
8666
|
return { x: Number(origin.x), y: Number(origin.y) };
|
|
8449
8667
|
}
|
|
@@ -8490,14 +8708,29 @@ function calc_ship_rechargetime(ship) {
|
|
|
8490
8708
|
function calc_flighttime(distance, acceleration) {
|
|
8491
8709
|
return UInt32.from(2 * Math.sqrt(Number(distance) / acceleration));
|
|
8492
8710
|
}
|
|
8711
|
+
function calc_transit_duration(ax, ay, bx, by) {
|
|
8712
|
+
const distance = distanceBetweenPoints(ax, ay, bx, by);
|
|
8713
|
+
return UInt32.from(Math.floor(distance.toNumber() / (PRECISION$1 * WH.TRANSIT_SPEED)));
|
|
8714
|
+
}
|
|
8715
|
+
function shipLoaderLane(ship) {
|
|
8716
|
+
const lanes = ship.loader_lanes ?? [];
|
|
8717
|
+
if (lanes.length === 0)
|
|
8718
|
+
return undefined;
|
|
8719
|
+
let lowest = lanes[0];
|
|
8720
|
+
for (const lane of lanes) {
|
|
8721
|
+
if (Number(lane.slot_index) < Number(lowest.slot_index))
|
|
8722
|
+
lowest = lane;
|
|
8723
|
+
}
|
|
8724
|
+
return { thrust: Number(lowest.thrust), mass: Number(lowest.mass) };
|
|
8725
|
+
}
|
|
8493
8726
|
function calc_loader_flighttime(ship, mass, altitude) {
|
|
8494
8727
|
const z = altitude ?? ship.coordinates.z?.toNumber() ?? calc_orbital_altitude(Number(mass));
|
|
8495
8728
|
return calc_flighttime(z, calc_loader_acceleration(ship, mass));
|
|
8496
8729
|
}
|
|
8497
8730
|
function calc_loader_acceleration(ship, mass) {
|
|
8498
|
-
const
|
|
8499
|
-
const
|
|
8500
|
-
return calc_acceleration(thrust, Number(mass)
|
|
8731
|
+
const lane = shipLoaderLane(ship);
|
|
8732
|
+
const thrust = lane ? lane.thrust : 0;
|
|
8733
|
+
return calc_acceleration(thrust, Number(mass));
|
|
8501
8734
|
}
|
|
8502
8735
|
function calc_ship_flighttime(ship, mass, distance) {
|
|
8503
8736
|
const acceleration = calc_ship_acceleration(ship, mass);
|
|
@@ -8513,8 +8746,10 @@ function calc_acceleration(thrust, mass) {
|
|
|
8513
8746
|
function calc_ship_mass(ship, cargos) {
|
|
8514
8747
|
const mass = UInt64.from(0);
|
|
8515
8748
|
mass.add(ship.hullmass);
|
|
8516
|
-
if (ship.
|
|
8517
|
-
|
|
8749
|
+
if (ship.loader_lanes && ship.loader_lanes.length > 0) {
|
|
8750
|
+
for (const l of ship.loader_lanes) {
|
|
8751
|
+
mass.add(UInt64.from(l.mass));
|
|
8752
|
+
}
|
|
8518
8753
|
}
|
|
8519
8754
|
for (const cargo of cargos) {
|
|
8520
8755
|
const cargoMass = getItem(cargo.item_id).mass * Number(UInt32.from(cargo.quantity));
|
|
@@ -8538,11 +8773,11 @@ function calculateTransferTime(ship, cargos, quantities) {
|
|
|
8538
8773
|
if (mass.equals(UInt64.zero)) {
|
|
8539
8774
|
return UInt32.from(0);
|
|
8540
8775
|
}
|
|
8541
|
-
|
|
8776
|
+
const lane = shipLoaderLane(ship);
|
|
8777
|
+
if (!lane)
|
|
8542
8778
|
return UInt32.from(0);
|
|
8543
|
-
mass = UInt64.from(mass).adding(
|
|
8544
|
-
|
|
8545
|
-
return transfer_time.dividing(ship.loaders.quantity);
|
|
8779
|
+
mass = UInt64.from(mass).adding(UInt64.from(lane.mass));
|
|
8780
|
+
return calc_loader_flighttime(ship, mass);
|
|
8546
8781
|
}
|
|
8547
8782
|
function calculateRefuelingTime(ship) {
|
|
8548
8783
|
return calc_ship_rechargetime(ship);
|
|
@@ -8572,22 +8807,19 @@ function calculateLoadTimeBreakdown(ship, cargos, loadQuantities, unloadQuantiti
|
|
|
8572
8807
|
}
|
|
8573
8808
|
let unloadTime = 0;
|
|
8574
8809
|
let loadTime = 0;
|
|
8575
|
-
|
|
8576
|
-
|
|
8810
|
+
const lane = shipLoaderLane(ship);
|
|
8811
|
+
if (mass_unload.gt(UInt64.zero) && lane) {
|
|
8812
|
+
const totalMass = UInt64.from(mass_unload).adding(UInt64.from(lane.mass));
|
|
8577
8813
|
unloadTime = Number(calc_loader_flighttime(ship, totalMass));
|
|
8578
8814
|
}
|
|
8579
|
-
if (mass_load.gt(UInt64.zero) &&
|
|
8580
|
-
const totalMass = UInt64.from(mass_load).adding(
|
|
8815
|
+
if (mass_load.gt(UInt64.zero) && lane) {
|
|
8816
|
+
const totalMass = UInt64.from(mass_load).adding(UInt64.from(lane.mass));
|
|
8581
8817
|
loadTime = Number(calc_loader_flighttime(ship, totalMass));
|
|
8582
8818
|
}
|
|
8583
|
-
const numLoaders = ship.loaders ? Number(ship.loaders.quantity) : 0;
|
|
8584
|
-
const totalTime = numLoaders > 0 ? (unloadTime + loadTime) / numLoaders : 0;
|
|
8585
|
-
const unloadTimePerLoader = numLoaders > 0 ? unloadTime / numLoaders : 0;
|
|
8586
|
-
const loadTimePerLoader = numLoaders > 0 ? loadTime / numLoaders : 0;
|
|
8587
8819
|
return {
|
|
8588
|
-
unloadTime
|
|
8589
|
-
loadTime
|
|
8590
|
-
totalTime,
|
|
8820
|
+
unloadTime,
|
|
8821
|
+
loadTime,
|
|
8822
|
+
totalTime: unloadTime + loadTime,
|
|
8591
8823
|
unloadMass: Number(mass_unload),
|
|
8592
8824
|
loadMass: Number(mass_load),
|
|
8593
8825
|
};
|
|
@@ -8598,19 +8830,14 @@ function estimateTravelTime(ship, travelMass, distance, options = {}) {
|
|
|
8598
8830
|
const rechargeTime = needsRecharge ? calc_ship_rechargetime(ship) : UInt32.zero;
|
|
8599
8831
|
let loadTime = UInt32.zero;
|
|
8600
8832
|
let unloadTime = UInt32.zero;
|
|
8601
|
-
|
|
8602
|
-
|
|
8603
|
-
|
|
8604
|
-
ship
|
|
8605
|
-
|
|
8606
|
-
|
|
8607
|
-
|
|
8608
|
-
|
|
8609
|
-
UInt32.from(unloadMass).gt(UInt32.zero) &&
|
|
8610
|
-
ship.loaders &&
|
|
8611
|
-
ship.loaders.quantity.gt(UInt32.zero)) {
|
|
8612
|
-
const totalMass = UInt64.from(unloadMass).adding(ship.loaders.mass);
|
|
8613
|
-
unloadTime = calc_loader_flighttime(ship, totalMass).dividing(ship.loaders.quantity);
|
|
8833
|
+
const lane = shipLoaderLane(ship);
|
|
8834
|
+
if (loadMass && UInt32.from(loadMass).gt(UInt32.zero) && lane) {
|
|
8835
|
+
const totalMass = UInt64.from(loadMass).adding(UInt64.from(lane.mass));
|
|
8836
|
+
loadTime = calc_loader_flighttime(ship, totalMass);
|
|
8837
|
+
}
|
|
8838
|
+
if (unloadMass && UInt32.from(unloadMass).gt(UInt32.zero) && lane) {
|
|
8839
|
+
const totalMass = UInt64.from(unloadMass).adding(UInt64.from(lane.mass));
|
|
8840
|
+
unloadTime = calc_loader_flighttime(ship, totalMass);
|
|
8614
8841
|
}
|
|
8615
8842
|
return {
|
|
8616
8843
|
flightTime,
|
|
@@ -8634,6 +8861,22 @@ function hasEnergyForDistance(ship, distance) {
|
|
|
8634
8861
|
const energyNeeded = UInt64.from(distance).dividing(PRECISION$1).multiplying(ship.engines.drain);
|
|
8635
8862
|
return UInt64.from(ship.energy ?? 0).gte(energyNeeded);
|
|
8636
8863
|
}
|
|
8864
|
+
function toNum$1(v) {
|
|
8865
|
+
if (v === undefined)
|
|
8866
|
+
return 0;
|
|
8867
|
+
return typeof v === 'number' ? v : v.toNumber();
|
|
8868
|
+
}
|
|
8869
|
+
function chosenLoaderLane(entity) {
|
|
8870
|
+
const lanes = entity.loaderLanes ?? [];
|
|
8871
|
+
if (lanes.length === 0)
|
|
8872
|
+
return undefined;
|
|
8873
|
+
let lowest = lanes[0];
|
|
8874
|
+
for (const lane of lanes) {
|
|
8875
|
+
if (toNum$1(lane.slot_index) < toNum$1(lowest.slot_index))
|
|
8876
|
+
lowest = lane;
|
|
8877
|
+
}
|
|
8878
|
+
return lowest;
|
|
8879
|
+
}
|
|
8637
8880
|
function mobilityTasks(entity) {
|
|
8638
8881
|
return mobilityLane(entity)?.schedule.tasks ?? [];
|
|
8639
8882
|
}
|
|
@@ -8642,7 +8885,7 @@ function getFlightOrigin(entity, flightTaskIndex) {
|
|
|
8642
8885
|
let origin = entity.coordinates;
|
|
8643
8886
|
for (let i = 0; i < flightTaskIndex && i < tasks.length; i++) {
|
|
8644
8887
|
const task = tasks[i];
|
|
8645
|
-
if (task
|
|
8888
|
+
if (isPositionalTask(task) && task.coordinates) {
|
|
8646
8889
|
origin = task.coordinates;
|
|
8647
8890
|
}
|
|
8648
8891
|
}
|
|
@@ -8652,7 +8895,7 @@ function getDestinationLocation(entity) {
|
|
|
8652
8895
|
const tasks = mobilityTasks(entity);
|
|
8653
8896
|
for (let i = tasks.length - 1; i >= 0; i--) {
|
|
8654
8897
|
const task = tasks[i];
|
|
8655
|
-
if (task
|
|
8898
|
+
if (isPositionalTask(task) && task.coordinates) {
|
|
8656
8899
|
return task.coordinates;
|
|
8657
8900
|
}
|
|
8658
8901
|
}
|
|
@@ -8667,7 +8910,7 @@ function getPositionAt(entity, taskIndex, taskProgress) {
|
|
|
8667
8910
|
return getFlightOrigin(entity, tasks.length);
|
|
8668
8911
|
}
|
|
8669
8912
|
const task = tasks[taskIndex];
|
|
8670
|
-
if (!task
|
|
8913
|
+
if (!isPositionalTask(task) || !task.coordinates) {
|
|
8671
8914
|
return getFlightOrigin(entity, taskIndex);
|
|
8672
8915
|
}
|
|
8673
8916
|
const origin = getFlightOrigin(entity, taskIndex);
|
|
@@ -8683,53 +8926,28 @@ function minTransferDistance(entityClass) {
|
|
|
8683
8926
|
? MIN_TRANSFER_DISTANCE_ORBITAL_VESSEL
|
|
8684
8927
|
: MIN_TRANSFER_DISTANCE_PLANETARY_STRUCTURE;
|
|
8685
8928
|
}
|
|
8686
|
-
function
|
|
8687
|
-
if (cargoMass === 0) {
|
|
8929
|
+
function calc_onesided_duration(loaderThrust, loaderMass, activeZ, counterpartZ, activeEntityClass, counterpartEntityClass, cargoMass) {
|
|
8930
|
+
if (cargoMass === 0 || loaderThrust === 0) {
|
|
8688
8931
|
return 0;
|
|
8689
8932
|
}
|
|
8690
|
-
|
|
8691
|
-
|
|
8692
|
-
|
|
8693
|
-
|
|
8694
|
-
|
|
8695
|
-
|
|
8696
|
-
|
|
8697
|
-
|
|
8698
|
-
|
|
8699
|
-
|
|
8700
|
-
|
|
8701
|
-
|
|
8702
|
-
|
|
8703
|
-
totalThrust += thrust * qty;
|
|
8704
|
-
totalLoaderMass += mass * qty;
|
|
8705
|
-
totalQuantity += qty;
|
|
8706
|
-
}
|
|
8707
|
-
if (dest.loaders) {
|
|
8708
|
-
const thrust = typeof dest.loaders.thrust === 'number'
|
|
8709
|
-
? dest.loaders.thrust
|
|
8710
|
-
: dest.loaders.thrust.toNumber();
|
|
8711
|
-
const mass = typeof dest.loaders.mass === 'number' ? dest.loaders.mass : dest.loaders.mass.toNumber();
|
|
8712
|
-
const qty = typeof dest.loaders.quantity === 'number'
|
|
8713
|
-
? dest.loaders.quantity
|
|
8714
|
-
: dest.loaders.quantity.toNumber();
|
|
8715
|
-
totalThrust += thrust * qty;
|
|
8716
|
-
totalLoaderMass += mass * qty;
|
|
8717
|
-
totalQuantity += qty;
|
|
8718
|
-
}
|
|
8719
|
-
if (totalThrust === 0 || totalQuantity === 0) {
|
|
8933
|
+
const rawDistance = Math.abs(activeZ - counterpartZ);
|
|
8934
|
+
const minDistance = Math.max(minTransferDistance(activeEntityClass), minTransferDistance(counterpartEntityClass));
|
|
8935
|
+
const distance = rawDistance < minDistance ? minDistance : rawDistance;
|
|
8936
|
+
const totalMass = cargoMass + loaderMass;
|
|
8937
|
+
const acceleration = calc_acceleration(loaderThrust, totalMass);
|
|
8938
|
+
const flightTime = Math.floor(2 * Math.sqrt(distance / acceleration));
|
|
8939
|
+
return flightTime === 0 ? 1 : flightTime;
|
|
8940
|
+
}
|
|
8941
|
+
function calc_transfer_duration(source, dest, cargoMass) {
|
|
8942
|
+
const active = chosenLoaderLane(source) ? source : dest;
|
|
8943
|
+
const counterpart = active === source ? dest : source;
|
|
8944
|
+
const lane = chosenLoaderLane(active);
|
|
8945
|
+
if (!lane) {
|
|
8720
8946
|
return 0;
|
|
8721
8947
|
}
|
|
8722
|
-
const
|
|
8723
|
-
|
|
8724
|
-
|
|
8725
|
-
const destZ = typeof dest.location.z === 'number' ? dest.location.z : (dest.location.z?.toNumber() ?? 0);
|
|
8726
|
-
const rawDistance = Math.abs(sourceZ - destZ);
|
|
8727
|
-
const minDistance = Math.max(minTransferDistance(source.entityClass), minTransferDistance(dest.entityClass));
|
|
8728
|
-
const distance = rawDistance < minDistance ? minDistance : rawDistance;
|
|
8729
|
-
const totalMass = cargoMass + totalLoaderMass;
|
|
8730
|
-
const acceleration = calc_acceleration(totalThrust, totalMass);
|
|
8731
|
-
const flightTime = 2 * Math.sqrt(distance / acceleration);
|
|
8732
|
-
return Math.floor(flightTime / totalQuantity);
|
|
8948
|
+
const activeZ = toNum$1(active.location.z);
|
|
8949
|
+
const counterpartZ = toNum$1(counterpart.location.z);
|
|
8950
|
+
return calc_onesided_duration(toNum$1(lane.thrust), toNum$1(lane.mass), activeZ, counterpartZ, active.entityClass, counterpart.entityClass, cargoMass);
|
|
8733
8951
|
}
|
|
8734
8952
|
|
|
8735
8953
|
class Location {
|
|
@@ -9616,6 +9834,311 @@ class LocationsManager extends BaseManager {
|
|
|
9616
9834
|
}
|
|
9617
9835
|
}
|
|
9618
9836
|
|
|
9837
|
+
const COORD_MIN = -2147483648;
|
|
9838
|
+
const COORD_MAX = 2147483647;
|
|
9839
|
+
const COORD_OFFSET = 2147485000;
|
|
9840
|
+
const SECTOR_DIV = 100000000;
|
|
9841
|
+
const REGION_DIV = 10000;
|
|
9842
|
+
const SECTORS_PER_AXIS = 43;
|
|
9843
|
+
const REGION_PER_AXIS = 10000;
|
|
9844
|
+
const LOCAL_HALF = 5000;
|
|
9845
|
+
const LOCAL_MIN = -5000;
|
|
9846
|
+
const LOCAL_MAX = 4999;
|
|
9847
|
+
const SECTOR_COUNT = SECTORS_PER_AXIS * SECTORS_PER_AXIS;
|
|
9848
|
+
const REGION_COUNT = REGION_PER_AXIS * REGION_PER_AXIS;
|
|
9849
|
+
const SECTOR_FEISTEL = { n: SECTOR_COUNT, halfBits: 6, label: 'sector' };
|
|
9850
|
+
const REGION_FEISTEL = { n: REGION_COUNT, halfBits: 14, label: 'region' };
|
|
9851
|
+
|
|
9852
|
+
const ROUNDS = 4;
|
|
9853
|
+
const keyCache = new Map();
|
|
9854
|
+
function deriveRoundKeys(seed, label) {
|
|
9855
|
+
const cacheKey = `${seed}:${label}`;
|
|
9856
|
+
const cached = keyCache.get(cacheKey);
|
|
9857
|
+
if (cached)
|
|
9858
|
+
return cached;
|
|
9859
|
+
const h = hash512(seed, `coord-keys-${label}`).array;
|
|
9860
|
+
const keys = [];
|
|
9861
|
+
for (let i = 0; i < ROUNDS; i++) {
|
|
9862
|
+
const o = i * 4;
|
|
9863
|
+
keys.push(((h[o] << 24) | (h[o + 1] << 16) | (h[o + 2] << 8) | h[o + 3]) >>> 0);
|
|
9864
|
+
}
|
|
9865
|
+
keyCache.set(cacheKey, keys);
|
|
9866
|
+
return keys;
|
|
9867
|
+
}
|
|
9868
|
+
function roundFn(r, key, halfBits) {
|
|
9869
|
+
let x = (r ^ key) >>> 0;
|
|
9870
|
+
x = Math.imul(x ^ (x >>> 16), 0x9e3779b1) >>> 0;
|
|
9871
|
+
x = Math.imul(x ^ (x >>> 13), 0x7feb352d) >>> 0;
|
|
9872
|
+
x = (x ^ (x >>> 16)) >>> 0;
|
|
9873
|
+
return x & ((1 << halfBits) - 1);
|
|
9874
|
+
}
|
|
9875
|
+
function encryptBlock(x, halfBits, keys) {
|
|
9876
|
+
const mask = (1 << halfBits) - 1;
|
|
9877
|
+
let L = (x >>> halfBits) & mask;
|
|
9878
|
+
let R = x & mask;
|
|
9879
|
+
for (let i = 0; i < ROUNDS; i++) {
|
|
9880
|
+
const F = roundFn(R, keys[i], halfBits);
|
|
9881
|
+
const nL = R;
|
|
9882
|
+
const nR = (L ^ F) & mask;
|
|
9883
|
+
L = nL;
|
|
9884
|
+
R = nR;
|
|
9885
|
+
}
|
|
9886
|
+
return ((L << halfBits) | R) >>> 0;
|
|
9887
|
+
}
|
|
9888
|
+
function decryptBlock(y, halfBits, keys) {
|
|
9889
|
+
const mask = (1 << halfBits) - 1;
|
|
9890
|
+
let L = (y >>> halfBits) & mask;
|
|
9891
|
+
let R = y & mask;
|
|
9892
|
+
for (let i = ROUNDS - 1; i >= 0; i--) {
|
|
9893
|
+
const F = roundFn(L, keys[i], halfBits);
|
|
9894
|
+
const nR = L;
|
|
9895
|
+
const nL = (R ^ F) & mask;
|
|
9896
|
+
L = nL;
|
|
9897
|
+
R = nR;
|
|
9898
|
+
}
|
|
9899
|
+
return ((L << halfBits) | R) >>> 0;
|
|
9900
|
+
}
|
|
9901
|
+
function permute(seed, x, cfg) {
|
|
9902
|
+
const keys = deriveRoundKeys(seed, cfg.label);
|
|
9903
|
+
let v = encryptBlock(x, cfg.halfBits, keys);
|
|
9904
|
+
while (v >= cfg.n)
|
|
9905
|
+
v = encryptBlock(v, cfg.halfBits, keys);
|
|
9906
|
+
return v;
|
|
9907
|
+
}
|
|
9908
|
+
function unpermute(seed, y, cfg) {
|
|
9909
|
+
const keys = deriveRoundKeys(seed, cfg.label);
|
|
9910
|
+
let v = decryptBlock(y, cfg.halfBits, keys);
|
|
9911
|
+
while (v >= cfg.n)
|
|
9912
|
+
v = decryptBlock(v, cfg.halfBits, keys);
|
|
9913
|
+
return v;
|
|
9914
|
+
}
|
|
9915
|
+
|
|
9916
|
+
const ONSETS = ['b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't'];
|
|
9917
|
+
const VOWELS = ['a', 'e', 'i', 'o', 'u'];
|
|
9918
|
+
const CODAS = ['n', 'r', 'l', 's', 'k', 'm', 't', 'x'];
|
|
9919
|
+
const SYL_BASE = ONSETS.length * VOWELS.length * CODAS.length;
|
|
9920
|
+
function syllable(digit) {
|
|
9921
|
+
const onset = Math.floor(digit / (VOWELS.length * CODAS.length));
|
|
9922
|
+
const rem = digit % (VOWELS.length * CODAS.length);
|
|
9923
|
+
const vowel = Math.floor(rem / CODAS.length);
|
|
9924
|
+
const coda = rem % CODAS.length;
|
|
9925
|
+
return ONSETS[onset] + VOWELS[vowel] + CODAS[coda];
|
|
9926
|
+
}
|
|
9927
|
+
function unsyllable(chunk) {
|
|
9928
|
+
const onset = ONSETS.indexOf(chunk[0]);
|
|
9929
|
+
const vowel = VOWELS.indexOf(chunk[1]);
|
|
9930
|
+
const coda = CODAS.indexOf(chunk[2]);
|
|
9931
|
+
if (onset < 0 || vowel < 0 || coda < 0)
|
|
9932
|
+
throw new Error(`invalid region token chunk: ${chunk}`);
|
|
9933
|
+
return onset * (VOWELS.length * CODAS.length) + vowel * CODAS.length + coda;
|
|
9934
|
+
}
|
|
9935
|
+
function encodeRegion(seed, rx, ry) {
|
|
9936
|
+
const index = rx * REGION_PER_AXIS + ry;
|
|
9937
|
+
let n = permute(seed, index, REGION_FEISTEL);
|
|
9938
|
+
const d0 = n % SYL_BASE;
|
|
9939
|
+
n = Math.floor(n / SYL_BASE);
|
|
9940
|
+
const d1 = n % SYL_BASE;
|
|
9941
|
+
const d2 = Math.floor(n / SYL_BASE);
|
|
9942
|
+
const token = syllable(d2) + syllable(d1) + syllable(d0);
|
|
9943
|
+
return token.charAt(0).toUpperCase() + token.slice(1);
|
|
9944
|
+
}
|
|
9945
|
+
function decodeRegion(seed, token) {
|
|
9946
|
+
if (token.length !== 9)
|
|
9947
|
+
throw new Error(`invalid region token length: ${token}`);
|
|
9948
|
+
const lower = token.toLowerCase();
|
|
9949
|
+
const d2 = unsyllable(lower.slice(0, 3));
|
|
9950
|
+
const d1 = unsyllable(lower.slice(3, 6));
|
|
9951
|
+
const d0 = unsyllable(lower.slice(6, 9));
|
|
9952
|
+
const scrambled = (d2 * SYL_BASE + d1) * SYL_BASE + d0;
|
|
9953
|
+
if (scrambled >= REGION_FEISTEL.n)
|
|
9954
|
+
throw new Error(`invalid region token: ${token}`);
|
|
9955
|
+
const index = unpermute(seed, scrambled, REGION_FEISTEL);
|
|
9956
|
+
return { rx: Math.floor(index / REGION_PER_AXIS), ry: index % REGION_PER_AXIS };
|
|
9957
|
+
}
|
|
9958
|
+
|
|
9959
|
+
const SECTOR_ADJECTIVES = [
|
|
9960
|
+
'Amber',
|
|
9961
|
+
'Azure',
|
|
9962
|
+
'Brass',
|
|
9963
|
+
'Cinder',
|
|
9964
|
+
'Cobalt',
|
|
9965
|
+
'Copper',
|
|
9966
|
+
'Coral',
|
|
9967
|
+
'Crimson',
|
|
9968
|
+
'Crystal',
|
|
9969
|
+
'Dusk',
|
|
9970
|
+
'Ember',
|
|
9971
|
+
'Emerald',
|
|
9972
|
+
'Frost',
|
|
9973
|
+
'Glimmer',
|
|
9974
|
+
'Golden',
|
|
9975
|
+
'Hazy',
|
|
9976
|
+
'Indigo',
|
|
9977
|
+
'Iron',
|
|
9978
|
+
'Ivory',
|
|
9979
|
+
'Jade',
|
|
9980
|
+
'Lunar',
|
|
9981
|
+
'Misty',
|
|
9982
|
+
'Neon',
|
|
9983
|
+
'Onyx',
|
|
9984
|
+
'Opal',
|
|
9985
|
+
'Pearl',
|
|
9986
|
+
'Plasma',
|
|
9987
|
+
'Quartz',
|
|
9988
|
+
'Rusty',
|
|
9989
|
+
'Saffron',
|
|
9990
|
+
'Scarlet',
|
|
9991
|
+
'Silver',
|
|
9992
|
+
'Solar',
|
|
9993
|
+
'Static',
|
|
9994
|
+
'Stormy',
|
|
9995
|
+
'Sunny',
|
|
9996
|
+
'Teal',
|
|
9997
|
+
'Umber',
|
|
9998
|
+
'Velvet',
|
|
9999
|
+
'Verdant',
|
|
10000
|
+
'Vermilion',
|
|
10001
|
+
'Violet',
|
|
10002
|
+
'Wispy',
|
|
10003
|
+
];
|
|
10004
|
+
const SECTOR_NOUNS = [
|
|
10005
|
+
'Belt',
|
|
10006
|
+
'Bluff',
|
|
10007
|
+
'Cluster',
|
|
10008
|
+
'Coil',
|
|
10009
|
+
'Crest',
|
|
10010
|
+
'Drift',
|
|
10011
|
+
'Expanse',
|
|
10012
|
+
'Fathom',
|
|
10013
|
+
'Flare',
|
|
10014
|
+
'Gulf',
|
|
10015
|
+
'Halo',
|
|
10016
|
+
'Haven',
|
|
10017
|
+
'Hollow',
|
|
10018
|
+
'Maw',
|
|
10019
|
+
'Mesa',
|
|
10020
|
+
'Mire',
|
|
10021
|
+
'Notch',
|
|
10022
|
+
'Nook',
|
|
10023
|
+
'Oasis',
|
|
10024
|
+
'Lagoon',
|
|
10025
|
+
'Peak',
|
|
10026
|
+
'Pocket',
|
|
10027
|
+
'Reach',
|
|
10028
|
+
'Reef',
|
|
10029
|
+
'Ridge',
|
|
10030
|
+
'Rift',
|
|
10031
|
+
'Run',
|
|
10032
|
+
'Shoal',
|
|
10033
|
+
'Shroud',
|
|
10034
|
+
'Span',
|
|
10035
|
+
'Spire',
|
|
10036
|
+
'Spur',
|
|
10037
|
+
'Stretch',
|
|
10038
|
+
'Sprawl',
|
|
10039
|
+
'Tangle',
|
|
10040
|
+
'Trace',
|
|
10041
|
+
'Trench',
|
|
10042
|
+
'Vale',
|
|
10043
|
+
'Vault',
|
|
10044
|
+
'Verge',
|
|
10045
|
+
'Vortex',
|
|
10046
|
+
'Ward',
|
|
10047
|
+
'Wisp',
|
|
10048
|
+
];
|
|
10049
|
+
function encodeSector(seed, sx, sy) {
|
|
10050
|
+
const index = sx * SECTORS_PER_AXIS + sy;
|
|
10051
|
+
const scrambled = permute(seed, index, SECTOR_FEISTEL);
|
|
10052
|
+
const adj = Math.floor(scrambled / SECTORS_PER_AXIS);
|
|
10053
|
+
const noun = scrambled % SECTORS_PER_AXIS;
|
|
10054
|
+
return `${SECTOR_ADJECTIVES[adj]} ${SECTOR_NOUNS[noun]}`;
|
|
10055
|
+
}
|
|
10056
|
+
function decodeSector(seed, name) {
|
|
10057
|
+
const parts = name.trim().split(/\s+/);
|
|
10058
|
+
if (parts.length !== 2)
|
|
10059
|
+
throw new Error(`invalid sector name: ${name}`);
|
|
10060
|
+
const adj = SECTOR_ADJECTIVES.indexOf(parts[0]);
|
|
10061
|
+
const noun = SECTOR_NOUNS.indexOf(parts[1]);
|
|
10062
|
+
if (adj < 0 || noun < 0)
|
|
10063
|
+
throw new Error(`unknown sector name: ${name}`);
|
|
10064
|
+
const scrambled = adj * SECTORS_PER_AXIS + noun;
|
|
10065
|
+
const index = unpermute(seed, scrambled, SECTOR_FEISTEL);
|
|
10066
|
+
return { sx: Math.floor(index / SECTORS_PER_AXIS), sy: index % SECTORS_PER_AXIS };
|
|
10067
|
+
}
|
|
10068
|
+
|
|
10069
|
+
function sliceAxis(coord) {
|
|
10070
|
+
if (!Number.isInteger(coord) || coord < COORD_MIN || coord > COORD_MAX) {
|
|
10071
|
+
throw new RangeError(`coordinate out of range: ${coord}`);
|
|
10072
|
+
}
|
|
10073
|
+
const u = coord + COORD_OFFSET;
|
|
10074
|
+
return {
|
|
10075
|
+
sector: Math.floor(u / SECTOR_DIV),
|
|
10076
|
+
region: Math.floor(u / REGION_DIV) % REGION_PER_AXIS,
|
|
10077
|
+
local: (u % REGION_DIV) - LOCAL_HALF,
|
|
10078
|
+
};
|
|
10079
|
+
}
|
|
10080
|
+
function encodeAddress(seed, x, y) {
|
|
10081
|
+
const ax = sliceAxis(x);
|
|
10082
|
+
const ay = sliceAxis(y);
|
|
10083
|
+
return {
|
|
10084
|
+
sector: encodeSector(seed, ax.sector, ay.sector),
|
|
10085
|
+
region: encodeRegion(seed, ax.region, ay.region),
|
|
10086
|
+
localX: ax.local,
|
|
10087
|
+
localY: ay.local,
|
|
10088
|
+
};
|
|
10089
|
+
}
|
|
10090
|
+
function decodeAddress(seed, addr) {
|
|
10091
|
+
if (!Number.isInteger(addr.localX) ||
|
|
10092
|
+
!Number.isInteger(addr.localY) ||
|
|
10093
|
+
addr.localX < LOCAL_MIN ||
|
|
10094
|
+
addr.localX > LOCAL_MAX ||
|
|
10095
|
+
addr.localY < LOCAL_MIN ||
|
|
10096
|
+
addr.localY > LOCAL_MAX) {
|
|
10097
|
+
throw new RangeError(`local position out of range: ${addr.localX}, ${addr.localY}`);
|
|
10098
|
+
}
|
|
10099
|
+
const sector = decodeSector(seed, addr.sector);
|
|
10100
|
+
const region = decodeRegion(seed, addr.region);
|
|
10101
|
+
const x = sector.sx * SECTOR_DIV + region.rx * REGION_DIV + (addr.localX + LOCAL_HALF) - COORD_OFFSET;
|
|
10102
|
+
const y = sector.sy * SECTOR_DIV + region.ry * REGION_DIV + (addr.localY + LOCAL_HALF) - COORD_OFFSET;
|
|
10103
|
+
if (x < COORD_MIN || x > COORD_MAX || y < COORD_MIN || y > COORD_MAX) {
|
|
10104
|
+
throw new RangeError(`address decodes outside the coordinate range: ${x}, ${y}`);
|
|
10105
|
+
}
|
|
10106
|
+
return { x, y };
|
|
10107
|
+
}
|
|
10108
|
+
function addressFromCoordinates(seed, coords) {
|
|
10109
|
+
const x = typeof coords.x === 'number' ? coords.x : coords.x.toNumber();
|
|
10110
|
+
const y = typeof coords.y === 'number' ? coords.y : coords.y.toNumber();
|
|
10111
|
+
return encodeAddress(seed, x, y);
|
|
10112
|
+
}
|
|
10113
|
+
|
|
10114
|
+
const cache = new Map();
|
|
10115
|
+
const CACHE_MAX = 4096;
|
|
10116
|
+
function encodeAddressMemo(seed, x, y) {
|
|
10117
|
+
const key = `${Checksum256.from(seed).toString()}:${x},${y}`;
|
|
10118
|
+
let hit = cache.get(key);
|
|
10119
|
+
if (!hit) {
|
|
10120
|
+
hit = encodeAddress(seed, x, y);
|
|
10121
|
+
if (cache.size >= CACHE_MAX) {
|
|
10122
|
+
const oldest = cache.keys().next().value;
|
|
10123
|
+
if (oldest !== undefined)
|
|
10124
|
+
cache.delete(oldest);
|
|
10125
|
+
}
|
|
10126
|
+
cache.set(key, hit);
|
|
10127
|
+
}
|
|
10128
|
+
return hit;
|
|
10129
|
+
}
|
|
10130
|
+
|
|
10131
|
+
class CoordinatesManager extends BaseManager {
|
|
10132
|
+
async encode(x, y) {
|
|
10133
|
+
const game = await this.getGame();
|
|
10134
|
+
return encodeAddressMemo(game.config.seed, x, y);
|
|
10135
|
+
}
|
|
10136
|
+
async decode(addr) {
|
|
10137
|
+
const game = await this.getGame();
|
|
10138
|
+
return decodeAddress(game.config.seed, addr);
|
|
10139
|
+
}
|
|
10140
|
+
}
|
|
10141
|
+
|
|
9619
10142
|
class EpochsManager extends BaseManager {
|
|
9620
10143
|
async getCurrentHeight() {
|
|
9621
10144
|
const game = await this.getGame();
|
|
@@ -11498,11 +12021,14 @@ class ActionsManager extends BaseManager {
|
|
|
11498
12021
|
recharge,
|
|
11499
12022
|
});
|
|
11500
12023
|
}
|
|
11501
|
-
|
|
11502
|
-
|
|
12024
|
+
entityRefs(entities) {
|
|
12025
|
+
return entities.map((e) => Types.entity_ref.from({
|
|
11503
12026
|
entity_type: e.entityType,
|
|
11504
12027
|
entity_id: UInt64.from(e.entityId),
|
|
11505
12028
|
}));
|
|
12029
|
+
}
|
|
12030
|
+
grouptravel(entities, destination, recharge = true) {
|
|
12031
|
+
const entityRefs = this.entityRefs(entities);
|
|
11506
12032
|
const x = Int64.from(destination.x);
|
|
11507
12033
|
const y = Int64.from(destination.y);
|
|
11508
12034
|
return this.server.action('grouptravel', {
|
|
@@ -11512,6 +12038,36 @@ class ActionsManager extends BaseManager {
|
|
|
11512
12038
|
recharge,
|
|
11513
12039
|
});
|
|
11514
12040
|
}
|
|
12041
|
+
transit(shipId, entrance, exit) {
|
|
12042
|
+
return this.server.action('transit', {
|
|
12043
|
+
id: UInt64.from(shipId),
|
|
12044
|
+
ax: Int64.from(entrance.x),
|
|
12045
|
+
ay: Int64.from(entrance.y),
|
|
12046
|
+
bx: Int64.from(exit.x),
|
|
12047
|
+
by: Int64.from(exit.y),
|
|
12048
|
+
});
|
|
12049
|
+
}
|
|
12050
|
+
grouptransit(entities, entrance, exit) {
|
|
12051
|
+
const entityRefs = this.entityRefs(entities);
|
|
12052
|
+
return this.server.action('grouptransit', {
|
|
12053
|
+
entities: entityRefs,
|
|
12054
|
+
ax: Int64.from(entrance.x),
|
|
12055
|
+
ay: Int64.from(entrance.y),
|
|
12056
|
+
bx: Int64.from(exit.x),
|
|
12057
|
+
by: Int64.from(exit.y),
|
|
12058
|
+
});
|
|
12059
|
+
}
|
|
12060
|
+
getwormhole(x, y) {
|
|
12061
|
+
return this.server.action('getwormhole', { x: Int64.from(x), y: Int64.from(y) });
|
|
12062
|
+
}
|
|
12063
|
+
getdistance(origin, destination) {
|
|
12064
|
+
return this.server.action('getdistance', {
|
|
12065
|
+
ax: Int64.from(origin.x),
|
|
12066
|
+
ay: Int64.from(origin.y),
|
|
12067
|
+
bx: Int64.from(destination.x),
|
|
12068
|
+
by: Int64.from(destination.y),
|
|
12069
|
+
});
|
|
12070
|
+
}
|
|
11515
12071
|
resolve(entityId, count) {
|
|
11516
12072
|
const params = {
|
|
11517
12073
|
id: UInt64.from(entityId),
|
|
@@ -11574,12 +12130,25 @@ class ActionsManager extends BaseManager {
|
|
|
11574
12130
|
account: Name.from(account),
|
|
11575
12131
|
});
|
|
11576
12132
|
}
|
|
11577
|
-
gather(sourceId, destinationId, stratum, quantity) {
|
|
11578
|
-
|
|
12133
|
+
gather(sourceId, destinationId, stratum, quantity, slot) {
|
|
12134
|
+
const params = {
|
|
11579
12135
|
source_id: UInt64.from(sourceId),
|
|
11580
12136
|
destination_id: UInt64.from(destinationId),
|
|
11581
12137
|
stratum: UInt16.from(stratum),
|
|
11582
12138
|
quantity: UInt32.from(quantity),
|
|
12139
|
+
};
|
|
12140
|
+
if (slot !== undefined) {
|
|
12141
|
+
params.slot = UInt8.from(slot);
|
|
12142
|
+
}
|
|
12143
|
+
return this.server.action('gather', params);
|
|
12144
|
+
}
|
|
12145
|
+
bundleGather(gathers) {
|
|
12146
|
+
const actions = gathers.map(({ sourceId, destinationId, stratum, quantity, slot }) => this.gather(sourceId, destinationId, stratum, quantity, slot));
|
|
12147
|
+
return Transaction.from({
|
|
12148
|
+
expiration: 0,
|
|
12149
|
+
ref_block_num: 0,
|
|
12150
|
+
ref_block_prefix: 0,
|
|
12151
|
+
actions,
|
|
11583
12152
|
});
|
|
11584
12153
|
}
|
|
11585
12154
|
warp(entityId, destination) {
|
|
@@ -11591,7 +12160,7 @@ class ActionsManager extends BaseManager {
|
|
|
11591
12160
|
y,
|
|
11592
12161
|
});
|
|
11593
12162
|
}
|
|
11594
|
-
craft(entityId, recipeId, quantity, inputs, target) {
|
|
12163
|
+
craft(entityId, recipeId, quantity, inputs, target, slot) {
|
|
11595
12164
|
const params = {
|
|
11596
12165
|
id: UInt64.from(entityId),
|
|
11597
12166
|
recipe_id: UInt16.from(recipeId),
|
|
@@ -11601,6 +12170,9 @@ class ActionsManager extends BaseManager {
|
|
|
11601
12170
|
if (target !== undefined) {
|
|
11602
12171
|
params.target = UInt64.from(target);
|
|
11603
12172
|
}
|
|
12173
|
+
if (slot !== undefined) {
|
|
12174
|
+
params.slot = UInt8.from(slot);
|
|
12175
|
+
}
|
|
11604
12176
|
return this.server.action('craft', params);
|
|
11605
12177
|
}
|
|
11606
12178
|
blend(entityId, inputs) {
|
|
@@ -12268,6 +12840,12 @@ class GameContext {
|
|
|
12268
12840
|
}
|
|
12269
12841
|
return this._locations;
|
|
12270
12842
|
}
|
|
12843
|
+
get coordinates() {
|
|
12844
|
+
if (!this._coordinates) {
|
|
12845
|
+
this._coordinates = new CoordinatesManager(this);
|
|
12846
|
+
}
|
|
12847
|
+
return this._coordinates;
|
|
12848
|
+
}
|
|
12271
12849
|
get epochs() {
|
|
12272
12850
|
if (!this._epochs) {
|
|
12273
12851
|
this._epochs = new EpochsManager(this);
|
|
@@ -12388,6 +12966,9 @@ class Shipload {
|
|
|
12388
12966
|
get locations() {
|
|
12389
12967
|
return this._context.locations;
|
|
12390
12968
|
}
|
|
12969
|
+
get coordinates() {
|
|
12970
|
+
return this._context.coordinates;
|
|
12971
|
+
}
|
|
12391
12972
|
get epochs() {
|
|
12392
12973
|
return this._context.epochs;
|
|
12393
12974
|
}
|
|
@@ -12437,8 +13018,8 @@ function computeBaseHullmass$1(stats) {
|
|
|
12437
13018
|
return 100000 - 75 * stats.density;
|
|
12438
13019
|
}
|
|
12439
13020
|
function computeShipHullCapabilities(stats) {
|
|
12440
|
-
const statSum = stats.strength + stats.hardness
|
|
12441
|
-
const exponent = statSum /
|
|
13021
|
+
const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
|
|
13022
|
+
const exponent = statSum / 1998.0;
|
|
12442
13023
|
return {
|
|
12443
13024
|
hullmass: computeBaseHullmass$1(stats),
|
|
12444
13025
|
capacity: Math.floor(5000000 * 6 ** exponent),
|
|
@@ -12529,9 +13110,9 @@ function computeStorageCapabilities(stats, baseCapacity) {
|
|
|
12529
13110
|
function computeBaseCapacity(itemId, stats) {
|
|
12530
13111
|
switch (itemId) {
|
|
12531
13112
|
case ITEM_SHIP_T1_PACKED:
|
|
13113
|
+
return computeShipHullCapabilities(stats).capacity;
|
|
12532
13114
|
case ITEM_EXTRACTOR_T1_PACKED:
|
|
12533
13115
|
case ITEM_FACTORY_T1_PACKED:
|
|
12534
|
-
return computeShipHullCapabilities(stats).capacity;
|
|
12535
13116
|
case ITEM_CONTAINER_T1_PACKED:
|
|
12536
13117
|
return computeContainerCapabilities(stats).capacity;
|
|
12537
13118
|
case ITEM_WAREHOUSE_T1_PACKED:
|
|
@@ -12547,8 +13128,8 @@ function computeWarpCapabilities(stats) {
|
|
|
12547
13128
|
return { range: 100 + resonance * 3 };
|
|
12548
13129
|
}
|
|
12549
13130
|
function computeWarehouseHullCapabilities(stats) {
|
|
12550
|
-
const statSum = stats.strength + stats.hardness
|
|
12551
|
-
const exponent = statSum /
|
|
13131
|
+
const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
|
|
13132
|
+
const exponent = statSum / 1998.0;
|
|
12552
13133
|
return {
|
|
12553
13134
|
hullmass: computeBaseHullmass$1(stats),
|
|
12554
13135
|
capacity: Math.floor(100000000 * 6 ** exponent),
|
|
@@ -12583,6 +13164,9 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12583
13164
|
let hasWarp = false;
|
|
12584
13165
|
let totalBatteryStatSum = 0;
|
|
12585
13166
|
let batteryCount = 0;
|
|
13167
|
+
const gathererLanes = [];
|
|
13168
|
+
const crafterLanes = [];
|
|
13169
|
+
const loaderLanes = [];
|
|
12586
13170
|
for (const mod of modules) {
|
|
12587
13171
|
const item = getItem(mod.itemId);
|
|
12588
13172
|
const modType = getModuleCapabilityType(mod.itemId);
|
|
@@ -12605,10 +13189,18 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12605
13189
|
hasGatherer = true;
|
|
12606
13190
|
const tier = item.tier;
|
|
12607
13191
|
const caps = computeGathererCapabilities(decodedStats, tier);
|
|
12608
|
-
|
|
13192
|
+
const scaledYield = applySlotMultiplier(caps.yield, amp);
|
|
13193
|
+
totalGathYield += scaledYield;
|
|
12609
13194
|
totalGathDrain += caps.drain;
|
|
12610
13195
|
if (caps.depth > maxGathDepth)
|
|
12611
13196
|
maxGathDepth = caps.depth;
|
|
13197
|
+
gathererLanes.push({
|
|
13198
|
+
slotIndex: mod.slotIndex,
|
|
13199
|
+
yield: scaledYield,
|
|
13200
|
+
drain: caps.drain,
|
|
13201
|
+
depth: caps.depth,
|
|
13202
|
+
outputPct: amp,
|
|
13203
|
+
});
|
|
12612
13204
|
}
|
|
12613
13205
|
else if (modType === MODULE_LOADER) {
|
|
12614
13206
|
hasLoader = true;
|
|
@@ -12616,6 +13208,12 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12616
13208
|
totalLoaderMass += caps.mass;
|
|
12617
13209
|
totalLoaderThrust += applySlotMultiplier(caps.thrust, amp);
|
|
12618
13210
|
totalLoaderQuantity += caps.quantity;
|
|
13211
|
+
loaderLanes.push({
|
|
13212
|
+
slotIndex: mod.slotIndex,
|
|
13213
|
+
mass: caps.mass,
|
|
13214
|
+
thrust: applySlotMultiplier(caps.thrust, amp),
|
|
13215
|
+
outputPct: amp,
|
|
13216
|
+
});
|
|
12619
13217
|
}
|
|
12620
13218
|
else if (modType === MODULE_STORAGE) {
|
|
12621
13219
|
const caps = computeStorageCapabilities(decodedStats, baseCapacity);
|
|
@@ -12624,8 +13222,15 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12624
13222
|
else if (modType === MODULE_CRAFTER) {
|
|
12625
13223
|
hasCrafter = true;
|
|
12626
13224
|
const caps = computeCrafterCapabilities(decodedStats);
|
|
12627
|
-
|
|
13225
|
+
const scaledSpeed = applySlotMultiplier(caps.speed, amp);
|
|
13226
|
+
totalCrafterSpeed += scaledSpeed;
|
|
12628
13227
|
totalCrafterDrain += caps.drain;
|
|
13228
|
+
crafterLanes.push({
|
|
13229
|
+
slotIndex: mod.slotIndex,
|
|
13230
|
+
speed: scaledSpeed,
|
|
13231
|
+
drain: caps.drain,
|
|
13232
|
+
outputPct: amp,
|
|
13233
|
+
});
|
|
12629
13234
|
}
|
|
12630
13235
|
else if (modType === MODULE_HAULER) {
|
|
12631
13236
|
hasHauler = true;
|
|
@@ -12673,6 +13278,7 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12673
13278
|
drain: totalGathDrain,
|
|
12674
13279
|
depth: maxGathDepth,
|
|
12675
13280
|
};
|
|
13281
|
+
result.gathererLanes = gathererLanes;
|
|
12676
13282
|
}
|
|
12677
13283
|
if (hasLoader) {
|
|
12678
13284
|
result.loaders = {
|
|
@@ -12680,9 +13286,11 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12680
13286
|
thrust: clampUint16(totalLoaderThrust),
|
|
12681
13287
|
quantity: totalLoaderQuantity,
|
|
12682
13288
|
};
|
|
13289
|
+
result.loaderLanes = loaderLanes;
|
|
12683
13290
|
}
|
|
12684
13291
|
if (hasCrafter) {
|
|
12685
13292
|
result.crafter = { speed: clampUint16(totalCrafterSpeed), drain: totalCrafterDrain };
|
|
13293
|
+
result.crafterLanes = crafterLanes;
|
|
12686
13294
|
}
|
|
12687
13295
|
if (hasHauler) {
|
|
12688
13296
|
const efficiency = totalHaulerCapacity > 0 ? Number(weightedHaulerEffNum / BigInt(totalHaulerCapacity)) : 0;
|
|
@@ -12698,20 +13306,19 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
|
|
|
12698
13306
|
return result;
|
|
12699
13307
|
}
|
|
12700
13308
|
function computeContainerCapabilities(stats) {
|
|
12701
|
-
const statSum = stats.strength + stats.hardness
|
|
12702
|
-
const exponent = statSum /
|
|
13309
|
+
const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
|
|
13310
|
+
const exponent = statSum / 1998.0;
|
|
12703
13311
|
return {
|
|
12704
13312
|
hullmass: computeBaseHullmass$1(stats),
|
|
12705
13313
|
capacity: Math.floor(22000000 * 6 ** exponent),
|
|
12706
13314
|
};
|
|
12707
13315
|
}
|
|
12708
13316
|
function computeContainerT2Capabilities(stats) {
|
|
12709
|
-
const strength = stats.strength;
|
|
12710
|
-
const density = stats.density;
|
|
12711
|
-
const hardness = stats.hardness;
|
|
12712
|
-
const cohesion = stats.cohesion;
|
|
13317
|
+
const strength = stats.strength ?? 0;
|
|
13318
|
+
const density = stats.density ?? 0;
|
|
13319
|
+
const hardness = stats.hardness ?? 0;
|
|
12713
13320
|
const hullmass = 70000 - 50 * density;
|
|
12714
|
-
const statSum = strength + hardness
|
|
13321
|
+
const statSum = strength + hardness;
|
|
12715
13322
|
const exponent = statSum / 2947;
|
|
12716
13323
|
const capacity = Math.floor(24000000 * 6 ** exponent);
|
|
12717
13324
|
return { hullmass, capacity };
|
|
@@ -12808,17 +13415,36 @@ function makeEntity(packedItemId, state) {
|
|
|
12808
13415
|
info.engines = caps.engines;
|
|
12809
13416
|
if (caps.generator)
|
|
12810
13417
|
info.generator = caps.generator;
|
|
12811
|
-
if (caps.gatherer)
|
|
12812
|
-
info.gatherer = caps.gatherer;
|
|
12813
|
-
if (caps.loaders)
|
|
12814
|
-
info.loaders = caps.loaders;
|
|
12815
|
-
if (caps.crafter)
|
|
12816
|
-
info.crafter = caps.crafter;
|
|
12817
13418
|
if (caps.hauler)
|
|
12818
13419
|
info.hauler = caps.hauler;
|
|
12819
13420
|
if (caps.warp)
|
|
12820
13421
|
info.warp = caps.warp;
|
|
13422
|
+
info.gatherer_lanes = (caps.gathererLanes ?? []).map((l) => Types.gatherer_lane.from({
|
|
13423
|
+
slot_index: l.slotIndex,
|
|
13424
|
+
yield: l.yield,
|
|
13425
|
+
drain: l.drain,
|
|
13426
|
+
depth: l.depth,
|
|
13427
|
+
output_pct: l.outputPct,
|
|
13428
|
+
}));
|
|
13429
|
+
info.crafter_lanes = (caps.crafterLanes ?? []).map((l) => Types.crafter_lane.from({
|
|
13430
|
+
slot_index: l.slotIndex,
|
|
13431
|
+
speed: l.speed,
|
|
13432
|
+
drain: l.drain,
|
|
13433
|
+
output_pct: l.outputPct,
|
|
13434
|
+
}));
|
|
13435
|
+
info.loader_lanes = (caps.loaderLanes ?? []).map((l) => Types.loader_lane.from({
|
|
13436
|
+
slot_index: l.slotIndex,
|
|
13437
|
+
mass: l.mass,
|
|
13438
|
+
thrust: l.thrust,
|
|
13439
|
+
output_pct: l.outputPct,
|
|
13440
|
+
}));
|
|
12821
13441
|
}
|
|
13442
|
+
if (!info.gatherer_lanes)
|
|
13443
|
+
info.gatherer_lanes = [];
|
|
13444
|
+
if (!info.crafter_lanes)
|
|
13445
|
+
info.crafter_lanes = [];
|
|
13446
|
+
if (!info.loader_lanes)
|
|
13447
|
+
info.loader_lanes = [];
|
|
12822
13448
|
const entityInfo = Types.entity_info.from(info);
|
|
12823
13449
|
return new Entity(entityInfo);
|
|
12824
13450
|
}
|
|
@@ -12943,9 +13569,10 @@ class ConstructionManager extends BaseManager {
|
|
|
12943
13569
|
continue;
|
|
12944
13570
|
if (!coordsEqual(entity.coordinates, target.coordinates))
|
|
12945
13571
|
continue;
|
|
12946
|
-
const
|
|
12947
|
-
if (
|
|
13572
|
+
const crafterLanes = entity.crafter_lanes ?? [];
|
|
13573
|
+
if (crafterLanes.length === 0)
|
|
12948
13574
|
continue;
|
|
13575
|
+
const speed = crafterLanes.reduce((s, l) => s + Number(l.speed), 0);
|
|
12949
13576
|
out.push({
|
|
12950
13577
|
entityId: entity.id,
|
|
12951
13578
|
entityType: entity.type,
|
|
@@ -13174,8 +13801,9 @@ function partitionSources(target, entities, cargo) {
|
|
|
13174
13801
|
const relevant = matchRelevantCargo(entity, target, cargo, reserved);
|
|
13175
13802
|
if (relevant.length === 0)
|
|
13176
13803
|
continue;
|
|
13177
|
-
const
|
|
13178
|
-
const
|
|
13804
|
+
const loaderLanes = entity.loader_lanes ?? [];
|
|
13805
|
+
const loaderCount = loaderLanes.length;
|
|
13806
|
+
const loaderTotalMass = loaderLanes.reduce((s, l) => s + Number(l.mass), 0);
|
|
13179
13807
|
const ref = {
|
|
13180
13808
|
entityId: entity.id,
|
|
13181
13809
|
name: entity.id.toString(),
|
|
@@ -13283,6 +13911,179 @@ function validateDisplayName(input, opts = {}) {
|
|
|
13283
13911
|
return { valid: true, name };
|
|
13284
13912
|
}
|
|
13285
13913
|
|
|
13914
|
+
function idiv(a, b) {
|
|
13915
|
+
return Math.floor(a / b);
|
|
13916
|
+
}
|
|
13917
|
+
function computeBaseHullmass(stats) {
|
|
13918
|
+
const density = decodeStat(stats, 1);
|
|
13919
|
+
return 100000 - 75 * density;
|
|
13920
|
+
}
|
|
13921
|
+
function computeBaseCapacityShip(stats) {
|
|
13922
|
+
const s = decodeStat(stats, 0) + decodeStat(stats, 2);
|
|
13923
|
+
return Math.floor(5000000 * 6 ** (s / 1998));
|
|
13924
|
+
}
|
|
13925
|
+
function computeBaseCapacityContainer(stats) {
|
|
13926
|
+
const s = decodeStat(stats, 0) + decodeStat(stats, 2);
|
|
13927
|
+
return Math.floor(22000000 * 6 ** (s / 1998));
|
|
13928
|
+
}
|
|
13929
|
+
function computeBaseCapacityContainerT2(stats) {
|
|
13930
|
+
const s = decodeStat(stats, 0) + decodeStat(stats, 2);
|
|
13931
|
+
return Math.floor(24000000 * 6 ** (s / 2947));
|
|
13932
|
+
}
|
|
13933
|
+
function computeBaseCapacityWarehouse(stats) {
|
|
13934
|
+
const s = decodeStat(stats, 0) + decodeStat(stats, 2);
|
|
13935
|
+
return Math.floor(100000000 * 6 ** (s / 1998));
|
|
13936
|
+
}
|
|
13937
|
+
const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
|
|
13938
|
+
const computeEngineDrain = (thm) => 2 * Math.max(30, 50 - idiv(thm, 70));
|
|
13939
|
+
const computeGeneratorCap = (com) => 950 + idiv(com, 2);
|
|
13940
|
+
const computeGeneratorRech = (fin) => 2 * (1 + idiv(fin * 3, 1000));
|
|
13941
|
+
const computeGathererYield = (str) => 200 + str;
|
|
13942
|
+
const computeGathererDrain = (con) => 2 * Math.max(250, 1250 - idiv(con * 25, 20));
|
|
13943
|
+
const computeGathererDepth = (tol, tier) => gathererDepthForTier(tol, tier);
|
|
13944
|
+
const computeLoaderMass = (ins) => Math.max(200, 2000 - ins * 2);
|
|
13945
|
+
const computeLoaderThrust = (pla) => 1 + idiv(pla * pla, 10000);
|
|
13946
|
+
const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
|
|
13947
|
+
const computeCrafterDrain = (fin) => Math.max(5, 30 - idiv(fin, 33));
|
|
13948
|
+
const computeHaulerCapacity = (fin) => Math.max(1, 1 + idiv(fin, 400));
|
|
13949
|
+
const computeHaulerEfficiency = (con) => 2000 + con * 6;
|
|
13950
|
+
const computeHaulerDrain$1 = (com) => Math.max(3, 15 - idiv(com, 80));
|
|
13951
|
+
const computeWarpRange = (stat) => 100 + stat * 3;
|
|
13952
|
+
function entityDisplayName(itemId) {
|
|
13953
|
+
switch (itemId) {
|
|
13954
|
+
case ITEM_SHIP_T1_PACKED:
|
|
13955
|
+
return 'Ship';
|
|
13956
|
+
case ITEM_WAREHOUSE_T1_PACKED:
|
|
13957
|
+
return 'Warehouse';
|
|
13958
|
+
case ITEM_EXTRACTOR_T1_PACKED:
|
|
13959
|
+
return 'Extractor';
|
|
13960
|
+
case ITEM_FACTORY_T1_PACKED:
|
|
13961
|
+
return 'Factory';
|
|
13962
|
+
case ITEM_CONTAINER_T1_PACKED:
|
|
13963
|
+
return 'Container';
|
|
13964
|
+
case ITEM_CONTAINER_T2_PACKED:
|
|
13965
|
+
return 'Container';
|
|
13966
|
+
default:
|
|
13967
|
+
return 'Entity';
|
|
13968
|
+
}
|
|
13969
|
+
}
|
|
13970
|
+
function moduleDisplayName(itemId) {
|
|
13971
|
+
switch (itemId) {
|
|
13972
|
+
case ITEM_ENGINE_T1:
|
|
13973
|
+
return 'Engine';
|
|
13974
|
+
case ITEM_GENERATOR_T1:
|
|
13975
|
+
return 'Generator';
|
|
13976
|
+
case ITEM_GATHERER_T1:
|
|
13977
|
+
return 'Gatherer';
|
|
13978
|
+
case ITEM_LOADER_T1:
|
|
13979
|
+
return 'Loader';
|
|
13980
|
+
case ITEM_CRAFTER_T1:
|
|
13981
|
+
return 'Crafter';
|
|
13982
|
+
case ITEM_STORAGE_T1:
|
|
13983
|
+
return 'Storage';
|
|
13984
|
+
case ITEM_HAULER_T1:
|
|
13985
|
+
return 'Hauler';
|
|
13986
|
+
case ITEM_WARP_T1:
|
|
13987
|
+
return 'Warp';
|
|
13988
|
+
default:
|
|
13989
|
+
return 'Module';
|
|
13990
|
+
}
|
|
13991
|
+
}
|
|
13992
|
+
function formatModuleLine(slot, itemId, stats) {
|
|
13993
|
+
let out = `Slot ${slot} - `;
|
|
13994
|
+
if (itemId === 0) {
|
|
13995
|
+
out += '(empty)';
|
|
13996
|
+
return out;
|
|
13997
|
+
}
|
|
13998
|
+
out += moduleDisplayName(itemId);
|
|
13999
|
+
const subtype = getModuleCapabilityType(itemId);
|
|
14000
|
+
switch (subtype) {
|
|
14001
|
+
case MODULE_ENGINE: {
|
|
14002
|
+
const vol = decodeStat(stats, 0);
|
|
14003
|
+
const thm = decodeStat(stats, 1);
|
|
14004
|
+
out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`;
|
|
14005
|
+
break;
|
|
14006
|
+
}
|
|
14007
|
+
case MODULE_GENERATOR: {
|
|
14008
|
+
const res = decodeStat(stats, 0);
|
|
14009
|
+
const ref = decodeStat(stats, 1);
|
|
14010
|
+
out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`;
|
|
14011
|
+
break;
|
|
14012
|
+
}
|
|
14013
|
+
case MODULE_GATHERER: {
|
|
14014
|
+
const str = decodeStat(stats, 0);
|
|
14015
|
+
const tol = decodeStat(stats, 1);
|
|
14016
|
+
const con = decodeStat(stats, 2);
|
|
14017
|
+
const tier = getItem(itemId).tier;
|
|
14018
|
+
out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol, tier)} Drain ${computeGathererDrain(con)}`;
|
|
14019
|
+
break;
|
|
14020
|
+
}
|
|
14021
|
+
case MODULE_LOADER: {
|
|
14022
|
+
const fin = decodeStat(stats, 0);
|
|
14023
|
+
const pla = decodeStat(stats, 1);
|
|
14024
|
+
out += ` Mass ${computeLoaderMass(fin)} Thrust ${computeLoaderThrust(pla)}`;
|
|
14025
|
+
break;
|
|
14026
|
+
}
|
|
14027
|
+
case MODULE_CRAFTER: {
|
|
14028
|
+
const rea = decodeStat(stats, 0);
|
|
14029
|
+
const com = decodeStat(stats, 1);
|
|
14030
|
+
out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(com)}`;
|
|
14031
|
+
break;
|
|
14032
|
+
}
|
|
14033
|
+
case MODULE_STORAGE: {
|
|
14034
|
+
const str = decodeStat(stats, 0);
|
|
14035
|
+
const fin = decodeStat(stats, 2);
|
|
14036
|
+
const sat = decodeStat(stats, 3);
|
|
14037
|
+
const sum = str + fin + sat;
|
|
14038
|
+
const pct = 10 + idiv(sum * 10, 2997);
|
|
14039
|
+
out += ` +${pct}% capacity`;
|
|
14040
|
+
break;
|
|
14041
|
+
}
|
|
14042
|
+
case MODULE_HAULER: {
|
|
14043
|
+
const res = decodeStat(stats, 0);
|
|
14044
|
+
const pla = decodeStat(stats, 1);
|
|
14045
|
+
const ref = decodeStat(stats, 2);
|
|
14046
|
+
out += ` Capacity ${computeHaulerCapacity(res)} Efficiency ${computeHaulerEfficiency(pla)} Drain ${computeHaulerDrain$1(ref)}`;
|
|
14047
|
+
break;
|
|
14048
|
+
}
|
|
14049
|
+
case MODULE_WARP: {
|
|
14050
|
+
const stat = decodeStat(stats, 0);
|
|
14051
|
+
out += ` Range ${computeWarpRange(stat)}`;
|
|
14052
|
+
break;
|
|
14053
|
+
}
|
|
14054
|
+
}
|
|
14055
|
+
return out;
|
|
14056
|
+
}
|
|
14057
|
+
function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
|
|
14058
|
+
const hullMass = computeBaseHullmass(hullStats);
|
|
14059
|
+
let baseCapacity = 0;
|
|
14060
|
+
if (itemId === ITEM_SHIP_T1_PACKED) {
|
|
14061
|
+
baseCapacity = computeBaseCapacityShip(hullStats);
|
|
14062
|
+
}
|
|
14063
|
+
else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
|
|
14064
|
+
baseCapacity = computeBaseCapacityWarehouse(hullStats);
|
|
14065
|
+
}
|
|
14066
|
+
else if (itemId === ITEM_EXTRACTOR_T1_PACKED ||
|
|
14067
|
+
itemId === ITEM_FACTORY_T1_PACKED ||
|
|
14068
|
+
itemId === ITEM_CONTAINER_T1_PACKED) {
|
|
14069
|
+
baseCapacity = computeBaseCapacityContainer(hullStats);
|
|
14070
|
+
}
|
|
14071
|
+
else if (itemId === ITEM_CONTAINER_T2_PACKED) {
|
|
14072
|
+
baseCapacity = computeBaseCapacityContainerT2(hullStats);
|
|
14073
|
+
}
|
|
14074
|
+
let out = entityDisplayName(itemId);
|
|
14075
|
+
out += ` - Hull ${hullMass} mass`;
|
|
14076
|
+
if (baseCapacity > 0) {
|
|
14077
|
+
out += ` * ${baseCapacity} capacity`;
|
|
14078
|
+
}
|
|
14079
|
+
out += '\n\n';
|
|
14080
|
+
for (let i = 0; i < moduleItems.length; i++) {
|
|
14081
|
+
out += formatModuleLine(i, moduleItems[i], moduleStats[i] ?? 0n);
|
|
14082
|
+
out += '\n';
|
|
14083
|
+
}
|
|
14084
|
+
return out;
|
|
14085
|
+
}
|
|
14086
|
+
|
|
13286
14087
|
function laneKeyForModule(slotIndex) {
|
|
13287
14088
|
return slotIndex + 1;
|
|
13288
14089
|
}
|
|
@@ -13290,7 +14091,95 @@ function laneIsFree(lanes, laneKey) {
|
|
|
13290
14091
|
const lane = lanes.find((entry) => entry.lane_key.toNumber() === laneKey);
|
|
13291
14092
|
return lane ? lane.schedule.tasks.length === 0 : true;
|
|
13292
14093
|
}
|
|
13293
|
-
function
|
|
14094
|
+
function resolveLaneGatherer(modules, entityItemId, laneKey) {
|
|
14095
|
+
const idx = laneKey - 1;
|
|
14096
|
+
const installed = idx >= 0 && idx < modules.length ? modules[idx].installed : undefined;
|
|
14097
|
+
if (!installed)
|
|
14098
|
+
throw new Error('gatherer lane has no module');
|
|
14099
|
+
const item = getItem(Number(installed.item_id.value ?? installed.item_id));
|
|
14100
|
+
if (item.moduleType !== 'gatherer')
|
|
14101
|
+
throw new Error('lane module is not a gatherer');
|
|
14102
|
+
const stats = BigInt(installed.stats.toString());
|
|
14103
|
+
const str = decodeStat(stats, 0);
|
|
14104
|
+
const tol = decodeStat(stats, 1);
|
|
14105
|
+
const con = decodeStat(stats, 2);
|
|
14106
|
+
const layout = getEntityLayout(entityItemId)?.slots ?? [];
|
|
14107
|
+
const amp = getSlotAmp(layout, idx);
|
|
14108
|
+
const yieldVal = applySlotMultiplier(computeGathererYield(str), amp);
|
|
14109
|
+
const drain = computeGathererDrain(con);
|
|
14110
|
+
const depth = gathererDepthForTier(tol, item.tier ?? 1);
|
|
14111
|
+
return { slotIndex: idx, yield: yieldVal, drain, depth, outputPct: amp };
|
|
14112
|
+
}
|
|
14113
|
+
function selectGatherLane(modules, entityItemId, lanes, stratum, explicitSlot) {
|
|
14114
|
+
if (explicitSlot !== undefined) {
|
|
14115
|
+
const laneKey = laneKeyForModule(explicitSlot);
|
|
14116
|
+
const lane = resolveLaneGatherer(modules, entityItemId, laneKey);
|
|
14117
|
+
if (stratum > lane.depth)
|
|
14118
|
+
throw new Error('stratum exceeds gatherer depth');
|
|
14119
|
+
return laneKey;
|
|
14120
|
+
}
|
|
14121
|
+
return workerLaneKey(modules, 'gatherer', lanes, stratum);
|
|
14122
|
+
}
|
|
14123
|
+
function resolveLaneCrafter(modules, entityItemId, laneKey) {
|
|
14124
|
+
const idx = laneKey - 1;
|
|
14125
|
+
const installed = idx >= 0 && idx < modules.length ? modules[idx].installed : undefined;
|
|
14126
|
+
if (!installed)
|
|
14127
|
+
throw new Error('crafter lane has no module');
|
|
14128
|
+
const item = getItem(Number(installed.item_id.value ?? installed.item_id));
|
|
14129
|
+
if (item.moduleType !== 'crafter')
|
|
14130
|
+
throw new Error('lane module is not a crafter');
|
|
14131
|
+
const stats = BigInt(installed.stats.toString());
|
|
14132
|
+
const rea = decodeStat(stats, 0);
|
|
14133
|
+
const fin = decodeStat(stats, 1);
|
|
14134
|
+
const layout = getEntityLayout(entityItemId)?.slots ?? [];
|
|
14135
|
+
const amp = getSlotAmp(layout, idx);
|
|
14136
|
+
const speed = applySlotMultiplier(computeCrafterSpeed(rea), amp);
|
|
14137
|
+
const drain = computeCrafterDrain(fin);
|
|
14138
|
+
return { slotIndex: idx, speed, drain, outputPct: amp };
|
|
14139
|
+
}
|
|
14140
|
+
function resolveLaneLoader(modules, entityItemId, laneKey) {
|
|
14141
|
+
if (laneKey === LANE_MOBILITY) {
|
|
14142
|
+
return { slotIndex: -1, thrust: 0, mass: 0, outputPct: 0, valid: false };
|
|
14143
|
+
}
|
|
14144
|
+
const idx = laneKey - 1;
|
|
14145
|
+
const installed = idx >= 0 && idx < modules.length ? modules[idx].installed : undefined;
|
|
14146
|
+
if (!installed) {
|
|
14147
|
+
return { slotIndex: idx, thrust: 0, mass: 0, outputPct: 0, valid: false };
|
|
14148
|
+
}
|
|
14149
|
+
const stats = BigInt(installed.stats.toString());
|
|
14150
|
+
const ins = decodeStat(stats, 0);
|
|
14151
|
+
const pla = decodeStat(stats, 1);
|
|
14152
|
+
const layout = getEntityLayout(entityItemId)?.slots ?? [];
|
|
14153
|
+
const amp = getSlotAmp(layout, idx);
|
|
14154
|
+
const thrust = applySlotMultiplier(computeLoaderThrust(pla), amp);
|
|
14155
|
+
const mass = computeLoaderMass(ins);
|
|
14156
|
+
return { slotIndex: idx, thrust, mass, outputPct: amp, valid: true };
|
|
14157
|
+
}
|
|
14158
|
+
function workerLaneKey(modules, moduleSubtype, lanes, stratum) {
|
|
14159
|
+
if (moduleSubtype === 'gatherer' && stratum !== undefined) {
|
|
14160
|
+
let lowestReaching;
|
|
14161
|
+
for (let i = 0; i < modules.length; i++) {
|
|
14162
|
+
const installed = modules[i].installed;
|
|
14163
|
+
if (!installed)
|
|
14164
|
+
continue;
|
|
14165
|
+
const item = getItem(Number(installed.item_id.value ?? installed.item_id));
|
|
14166
|
+
if (item.moduleType !== 'gatherer')
|
|
14167
|
+
continue;
|
|
14168
|
+
const stats = BigInt(installed.stats.toString());
|
|
14169
|
+
const tol = decodeStat(stats, 1);
|
|
14170
|
+
const depth = gathererDepthForTier(tol, item.tier ?? 1);
|
|
14171
|
+
if (depth < stratum)
|
|
14172
|
+
continue;
|
|
14173
|
+
const laneKey = laneKeyForModule(i);
|
|
14174
|
+
if (lowestReaching === undefined)
|
|
14175
|
+
lowestReaching = laneKey;
|
|
14176
|
+
if (laneIsFree(lanes, laneKey))
|
|
14177
|
+
return laneKey;
|
|
14178
|
+
}
|
|
14179
|
+
if (lowestReaching === undefined)
|
|
14180
|
+
throw new Error('no gatherer reaches this stratum');
|
|
14181
|
+
return lowestReaching;
|
|
14182
|
+
}
|
|
13294
14183
|
const occupiedMatchingLaneKeys = [];
|
|
13295
14184
|
for (let slotIndex = 0; slotIndex < modules.length; slotIndex++) {
|
|
13296
14185
|
const installed = modules[slotIndex].installed;
|
|
@@ -13547,9 +14436,32 @@ function recomputeCaps(entity) {
|
|
|
13547
14436
|
}
|
|
13548
14437
|
const itemId = Number(typeof entity.item_id === 'number' ? entity.item_id : entity.item_id.value);
|
|
13549
14438
|
const hullStats = decodeCraftedItemStats(itemId, entity.stats);
|
|
14439
|
+
if (hullStats.strength === undefined)
|
|
14440
|
+
hullStats.strength = decodeStat(entity.stats, 0);
|
|
14441
|
+
if (hullStats.hardness === undefined)
|
|
14442
|
+
hullStats.hardness = decodeStat(entity.stats, 2);
|
|
13550
14443
|
const layout = getEntityLayout(itemId)?.slots ?? [];
|
|
13551
14444
|
const installed = toInstalledModules(entity.modules);
|
|
13552
14445
|
const caps = computeEntityCapabilities(hullStats, itemId, installed, layout);
|
|
14446
|
+
const toLoaderLane = (l) => Types.loader_lane.from({
|
|
14447
|
+
slot_index: l.slotIndex,
|
|
14448
|
+
mass: l.mass,
|
|
14449
|
+
thrust: l.thrust,
|
|
14450
|
+
output_pct: l.outputPct,
|
|
14451
|
+
});
|
|
14452
|
+
const toGathererLane = (l) => Types.gatherer_lane.from({
|
|
14453
|
+
slot_index: l.slotIndex,
|
|
14454
|
+
yield: l.yield,
|
|
14455
|
+
drain: l.drain,
|
|
14456
|
+
depth: l.depth,
|
|
14457
|
+
output_pct: l.outputPct,
|
|
14458
|
+
});
|
|
14459
|
+
const toCrafterLane = (l) => Types.crafter_lane.from({
|
|
14460
|
+
slot_index: l.slotIndex,
|
|
14461
|
+
speed: l.speed,
|
|
14462
|
+
drain: l.drain,
|
|
14463
|
+
output_pct: l.outputPct,
|
|
14464
|
+
});
|
|
13553
14465
|
return {
|
|
13554
14466
|
hullmass: UInt32.from(caps.hullmass),
|
|
13555
14467
|
capacity: UInt32.from(caps.capacity),
|
|
@@ -13557,20 +14469,30 @@ function recomputeCaps(entity) {
|
|
|
13557
14469
|
generator: caps.generator
|
|
13558
14470
|
? Types.energy_stats.from(caps.generator)
|
|
13559
14471
|
: undefined,
|
|
13560
|
-
|
|
14472
|
+
loaderLanes: (caps.loaderLanes ?? []).map(toLoaderLane),
|
|
14473
|
+
gathererLanes: (caps.gathererLanes ?? []).map(toGathererLane),
|
|
14474
|
+
crafterLanes: (caps.crafterLanes ?? []).map(toCrafterLane),
|
|
13561
14475
|
hauler: caps.hauler ? Types.hauler_stats.from(caps.hauler) : undefined,
|
|
13562
14476
|
};
|
|
13563
14477
|
}
|
|
14478
|
+
function loaderLanesTotalMass(lanes) {
|
|
14479
|
+
let total = 0;
|
|
14480
|
+
for (const l of lanes)
|
|
14481
|
+
total += Number(l.mass);
|
|
14482
|
+
return UInt64.from(total);
|
|
14483
|
+
}
|
|
13564
14484
|
function createProjectedEntity(entity) {
|
|
13565
14485
|
const needsRecompute = entity.hullmass === undefined ||
|
|
13566
|
-
entity.
|
|
14486
|
+
entity.loader_lanes === undefined ||
|
|
13567
14487
|
entity.engines === undefined ||
|
|
13568
14488
|
entity.generator === undefined ||
|
|
13569
14489
|
entity.hauler === undefined ||
|
|
13570
14490
|
entity.capacity === undefined;
|
|
13571
14491
|
const caps = needsRecompute ? recomputeCaps(entity) : undefined;
|
|
13572
14492
|
const shipMass = UInt32.from(entity.hullmass ?? caps?.hullmass ?? 0);
|
|
13573
|
-
const
|
|
14493
|
+
const loaderLanes = entity.loader_lanes ?? caps?.loaderLanes ?? [];
|
|
14494
|
+
const gathererLanes = entity.gatherer_lanes ?? caps?.gathererLanes ?? [];
|
|
14495
|
+
const crafterLanes = entity.crafter_lanes ?? caps?.crafterLanes ?? [];
|
|
13574
14496
|
const engines = entity.engines ?? caps?.engines;
|
|
13575
14497
|
const generator = entity.generator ?? caps?.generator;
|
|
13576
14498
|
const hauler = entity.hauler ?? caps?.hauler;
|
|
@@ -13585,16 +14507,16 @@ function createProjectedEntity(entity) {
|
|
|
13585
14507
|
engines,
|
|
13586
14508
|
generator,
|
|
13587
14509
|
hauler,
|
|
13588
|
-
|
|
14510
|
+
loaderLanes,
|
|
14511
|
+
gathererLanes,
|
|
14512
|
+
crafterLanes,
|
|
13589
14513
|
get cargoMass() {
|
|
13590
14514
|
return calcStacksMass(this.cargo);
|
|
13591
14515
|
},
|
|
13592
14516
|
get totalMass() {
|
|
13593
|
-
|
|
13594
|
-
|
|
13595
|
-
|
|
13596
|
-
}
|
|
13597
|
-
return mass;
|
|
14517
|
+
return UInt64.from(this.shipMass)
|
|
14518
|
+
.adding(this.cargoMass)
|
|
14519
|
+
.adding(loaderLanesTotalMass(this.loaderLanes));
|
|
13598
14520
|
},
|
|
13599
14521
|
hasMovement() {
|
|
13600
14522
|
return capsHasMovement(this.capabilities());
|
|
@@ -13603,7 +14525,7 @@ function createProjectedEntity(entity) {
|
|
|
13603
14525
|
return capsHasStorage(this.capabilities());
|
|
13604
14526
|
},
|
|
13605
14527
|
hasLoaders() {
|
|
13606
|
-
return
|
|
14528
|
+
return this.loaderLanes.length > 0;
|
|
13607
14529
|
},
|
|
13608
14530
|
capabilities() {
|
|
13609
14531
|
return {
|
|
@@ -13611,7 +14533,6 @@ function createProjectedEntity(entity) {
|
|
|
13611
14533
|
capacity: this.capacity ? UInt32.from(this.capacity) : undefined,
|
|
13612
14534
|
engines: this.engines,
|
|
13613
14535
|
generator: this.generator,
|
|
13614
|
-
loaders: this.loaders,
|
|
13615
14536
|
};
|
|
13616
14537
|
},
|
|
13617
14538
|
state() {
|
|
@@ -13713,6 +14634,7 @@ function applyTask(projected, task) {
|
|
|
13713
14634
|
break;
|
|
13714
14635
|
case TaskType.TRAVEL:
|
|
13715
14636
|
case TaskType.WARP:
|
|
14637
|
+
case TaskType.TRANSIT:
|
|
13716
14638
|
applyFlightTask(projected, task, { complete: true });
|
|
13717
14639
|
break;
|
|
13718
14640
|
case TaskType.LOAD:
|
|
@@ -13848,6 +14770,7 @@ function projectEntityAt(entity, now) {
|
|
|
13848
14770
|
break;
|
|
13849
14771
|
case TaskType.TRAVEL:
|
|
13850
14772
|
case TaskType.WARP:
|
|
14773
|
+
case TaskType.TRANSIT:
|
|
13851
14774
|
applyFlightTask(projected, task, { complete: taskComplete, progress });
|
|
13852
14775
|
break;
|
|
13853
14776
|
case TaskType.LOAD:
|
|
@@ -14016,6 +14939,155 @@ function availableForItem(avail, itemId) {
|
|
|
14016
14939
|
return total;
|
|
14017
14940
|
}
|
|
14018
14941
|
|
|
14942
|
+
var CancelBlockReason;
|
|
14943
|
+
(function (CancelBlockReason) {
|
|
14944
|
+
CancelBlockReason["TASK_NEVER"] = "TASK_NEVER";
|
|
14945
|
+
CancelBlockReason["BEFORE_START_RUNNING"] = "BEFORE_START_RUNNING";
|
|
14946
|
+
CancelBlockReason["DONE"] = "DONE";
|
|
14947
|
+
CancelBlockReason["CONTAINS_LINKED_TASK"] = "CONTAINS_LINKED_TASK";
|
|
14948
|
+
CancelBlockReason["WOULD_STRAND"] = "WOULD_STRAND";
|
|
14949
|
+
CancelBlockReason["WOULD_OVERFILL"] = "WOULD_OVERFILL";
|
|
14950
|
+
CancelBlockReason["NOT_OWNER"] = "NOT_OWNER";
|
|
14951
|
+
})(CancelBlockReason || (CancelBlockReason = {}));
|
|
14952
|
+
const EMPTY_EFFECTS = { refunds: [], releasedHolds: [], abandonsRunning: false };
|
|
14953
|
+
function postCancelEntity(entity, laneKey, fromTaskIndex) {
|
|
14954
|
+
const clone = entity.constructor.from(JSON.parse(JSON.stringify(entity.toJSON())));
|
|
14955
|
+
const lane = clone.lanes.find((l) => l.lane_key.toNumber() === laneKey);
|
|
14956
|
+
lane.schedule.tasks = lane.schedule.tasks.slice(0, fromTaskIndex);
|
|
14957
|
+
return clone;
|
|
14958
|
+
}
|
|
14959
|
+
function feasibleAfterCancel(post) {
|
|
14960
|
+
const ordered = orderedTasks(post);
|
|
14961
|
+
const base = new Map();
|
|
14962
|
+
for (const c of post.cargo ?? []) {
|
|
14963
|
+
const k = cargoKey(c);
|
|
14964
|
+
base.set(k, (base.get(k) ?? 0) + c.quantity.toNumber());
|
|
14965
|
+
}
|
|
14966
|
+
const isConsumer = (t) => t.type.toNumber() === TaskType.CRAFT || t.type.toNumber() === TaskType.UNLOAD;
|
|
14967
|
+
for (const self of ordered) {
|
|
14968
|
+
if (!isConsumer(self.task))
|
|
14969
|
+
continue;
|
|
14970
|
+
const map = new Map(base);
|
|
14971
|
+
for (const other of ordered) {
|
|
14972
|
+
if (other.completesAt.getTime() >= self.completesAt.getTime())
|
|
14973
|
+
continue;
|
|
14974
|
+
for (const out of taskCargoEffect(other.task).added) {
|
|
14975
|
+
map.set(cargoKey(out), (map.get(cargoKey(out)) ?? 0) + out.quantity.toNumber());
|
|
14976
|
+
}
|
|
14977
|
+
}
|
|
14978
|
+
for (const other of ordered) {
|
|
14979
|
+
if (other === self)
|
|
14980
|
+
continue;
|
|
14981
|
+
for (const inp of taskCargoEffect(other.task).removed) {
|
|
14982
|
+
const cur = map.get(cargoKey(inp)) ?? 0;
|
|
14983
|
+
map.set(cargoKey(inp), Math.max(0, cur - inp.quantity.toNumber()));
|
|
14984
|
+
}
|
|
14985
|
+
}
|
|
14986
|
+
for (const inp of taskCargoEffect(self.task).removed) {
|
|
14987
|
+
if ((map.get(cargoKey(inp)) ?? 0) < inp.quantity.toNumber())
|
|
14988
|
+
return false;
|
|
14989
|
+
}
|
|
14990
|
+
}
|
|
14991
|
+
try {
|
|
14992
|
+
validateSchedule(post);
|
|
14993
|
+
}
|
|
14994
|
+
catch {
|
|
14995
|
+
return false;
|
|
14996
|
+
}
|
|
14997
|
+
return true;
|
|
14998
|
+
}
|
|
14999
|
+
function laneTiming(lane, nowMs) {
|
|
15000
|
+
const startedMs = lane.schedule.started.toDate().getTime();
|
|
15001
|
+
let endSec = 0;
|
|
15002
|
+
return lane.schedule.tasks.map((t) => {
|
|
15003
|
+
const startsAt = startedMs + endSec * 1000;
|
|
15004
|
+
endSec += t.duration.toNumber();
|
|
15005
|
+
const completesAt = startedMs + endSec * 1000;
|
|
15006
|
+
return {
|
|
15007
|
+
startsAt,
|
|
15008
|
+
completesAt,
|
|
15009
|
+
running: nowMs >= startsAt && nowMs < completesAt,
|
|
15010
|
+
done: nowMs >= completesAt,
|
|
15011
|
+
};
|
|
15012
|
+
});
|
|
15013
|
+
}
|
|
15014
|
+
function cancelEligibility(entity, laneKey, fromTaskIndex, input) {
|
|
15015
|
+
const lane = (entity.lanes ?? []).find((l) => l.lane_key.equals(laneKey));
|
|
15016
|
+
if (!lane || fromTaskIndex < 0 || fromTaskIndex >= lane.schedule.tasks.length) {
|
|
15017
|
+
return { ok: false, range: { count: 0, taskIndices: [] }, effects: { ...EMPTY_EFFECTS } };
|
|
15018
|
+
}
|
|
15019
|
+
const tasks = lane.schedule.tasks;
|
|
15020
|
+
const timing = laneTiming(lane, input.now.getTime());
|
|
15021
|
+
const taskIndices = [];
|
|
15022
|
+
for (let i = fromTaskIndex; i < tasks.length; i++)
|
|
15023
|
+
taskIndices.push(i);
|
|
15024
|
+
const range = { count: taskIndices.length, taskIndices };
|
|
15025
|
+
const block = (blockedReason) => ({
|
|
15026
|
+
ok: false,
|
|
15027
|
+
blockedReason,
|
|
15028
|
+
range,
|
|
15029
|
+
effects: { ...EMPTY_EFFECTS },
|
|
15030
|
+
});
|
|
15031
|
+
for (const i of taskIndices) {
|
|
15032
|
+
const t = tasks[i];
|
|
15033
|
+
if (t.entitygroup && !t.entitygroup.equals(0))
|
|
15034
|
+
return block(CancelBlockReason.CONTAINS_LINKED_TASK);
|
|
15035
|
+
}
|
|
15036
|
+
for (const i of taskIndices) {
|
|
15037
|
+
const t = tasks[i];
|
|
15038
|
+
if (timing[i].done)
|
|
15039
|
+
return block(CancelBlockReason.DONE);
|
|
15040
|
+
if (t.cancelable.equals(TaskCancelable.NEVER) && !t.type.equals(TaskType.IDLE))
|
|
15041
|
+
return block(CancelBlockReason.TASK_NEVER);
|
|
15042
|
+
if (t.cancelable.equals(TaskCancelable.BEFORE_START) && timing[i].running)
|
|
15043
|
+
return block(CancelBlockReason.BEFORE_START_RUNNING);
|
|
15044
|
+
}
|
|
15045
|
+
const post = postCancelEntity(entity, laneKey, fromTaskIndex);
|
|
15046
|
+
if (!feasibleAfterCancel(post))
|
|
15047
|
+
return block(CancelBlockReason.WOULD_STRAND);
|
|
15048
|
+
const effects = { refunds: [], releasedHolds: [], abandonsRunning: false };
|
|
15049
|
+
let energyForfeited = 0;
|
|
15050
|
+
for (const i of taskIndices) {
|
|
15051
|
+
const t = tasks[i];
|
|
15052
|
+
if (timing[i].running && t.cancelable.equals(TaskCancelable.ALWAYS))
|
|
15053
|
+
effects.abandonsRunning = true;
|
|
15054
|
+
if (t.energy_cost)
|
|
15055
|
+
energyForfeited += t.energy_cost.toNumber();
|
|
15056
|
+
if (t.type.equals(TaskType.BUILDPLOT) && t.entitytarget)
|
|
15057
|
+
effects.keepsPlotDeposits = { plot: t.entitytarget };
|
|
15058
|
+
if (t.hold && t.entitytarget) {
|
|
15059
|
+
const counterpart = input.counterparts?.get(t.entitytarget.entity_id.toString());
|
|
15060
|
+
const hold = (counterpart?.holds ?? []).find((h) => h.id.equals(t.hold)) ??
|
|
15061
|
+
(entity.holds ?? []).find((h) => h.id.equals(t.hold));
|
|
15062
|
+
if (hold) {
|
|
15063
|
+
const kind = hold.kind.toNumber();
|
|
15064
|
+
effects.releasedHolds.push({ counterpart: t.entitytarget, kind });
|
|
15065
|
+
if (kind === 1 ) {
|
|
15066
|
+
effects.refunds.push({ giver: t.entitytarget, cargo: t.cargo });
|
|
15067
|
+
const giver = counterpart;
|
|
15068
|
+
if (giver) {
|
|
15069
|
+
const returned = t.cargo.reduce((s, c) => s + calcCargoItemMass(c).toNumber(), 0);
|
|
15070
|
+
const cap = giver.capacity
|
|
15071
|
+
? giver.capacity.toNumber()
|
|
15072
|
+
: Number.MAX_SAFE_INTEGER;
|
|
15073
|
+
if (giver.cargomass.toNumber() + returned > cap) {
|
|
15074
|
+
return {
|
|
15075
|
+
ok: false,
|
|
15076
|
+
blockedReason: CancelBlockReason.WOULD_OVERFILL,
|
|
15077
|
+
range,
|
|
15078
|
+
effects: { ...EMPTY_EFFECTS },
|
|
15079
|
+
};
|
|
15080
|
+
}
|
|
15081
|
+
}
|
|
15082
|
+
}
|
|
15083
|
+
}
|
|
15084
|
+
}
|
|
15085
|
+
}
|
|
15086
|
+
if (energyForfeited > 0)
|
|
15087
|
+
effects.energyForfeited = energyForfeited;
|
|
15088
|
+
return { ok: true, range, effects };
|
|
15089
|
+
}
|
|
15090
|
+
|
|
14019
15091
|
function maxCraftable(entity, recipe, crafterSpeed, now) {
|
|
14020
15092
|
if (recipe.inputs.length === 0)
|
|
14021
15093
|
return 0;
|
|
@@ -14136,7 +15208,7 @@ function calc_gather_rate(gatherer, itemMass, stratum, richness) {
|
|
|
14136
15208
|
}
|
|
14137
15209
|
function calc_gather_energy(gatherer, duration) {
|
|
14138
15210
|
const energy = Math.floor((duration * gatherer.drain.toNumber()) / PRECISION$1);
|
|
14139
|
-
return
|
|
15211
|
+
return UInt32.from(energy);
|
|
14140
15212
|
}
|
|
14141
15213
|
|
|
14142
15214
|
const BASE_HAUL_PENALTY_MILLI = 300;
|
|
@@ -14150,7 +15222,7 @@ function computeHaulPenalty(totalThrust, haulCount, avgEfficiency) {
|
|
|
14150
15222
|
HAULER_EFFICIENCY_DENOM);
|
|
14151
15223
|
return Math.floor((totalThrust * 1000) / penaltyMilli);
|
|
14152
15224
|
}
|
|
14153
|
-
function computeHaulerDrain
|
|
15225
|
+
function computeHaulerDrain(distance, drain, haulCount) {
|
|
14154
15226
|
return Math.floor(distance / PRECISION) * drain * haulCount;
|
|
14155
15227
|
}
|
|
14156
15228
|
|
|
@@ -14372,7 +15444,6 @@ const ENTITY_HULL_SLOTS = {
|
|
|
14372
15444
|
0: { capability: 'Storage', attribute: 'capacity' },
|
|
14373
15445
|
1: { capability: 'Hull', attribute: 'mass' },
|
|
14374
15446
|
2: { capability: 'Storage', attribute: 'capacity' },
|
|
14375
|
-
3: { capability: 'Storage', attribute: 'capacity' },
|
|
14376
15447
|
};
|
|
14377
15448
|
const SLOT_FORMULAS = {
|
|
14378
15449
|
engine: {
|
|
@@ -14539,6 +15610,56 @@ function allPlotBuildableItems() {
|
|
|
14539
15610
|
return getItems().filter((item) => isPlotBuildable(item.id));
|
|
14540
15611
|
}
|
|
14541
15612
|
|
|
15613
|
+
function rollupGatherer(lanes) {
|
|
15614
|
+
if (lanes.length === 0)
|
|
15615
|
+
return undefined;
|
|
15616
|
+
let totalYield = 0;
|
|
15617
|
+
let totalDrain = 0;
|
|
15618
|
+
let maxDepth = 0;
|
|
15619
|
+
for (const l of lanes) {
|
|
15620
|
+
totalYield += Number(l.yield);
|
|
15621
|
+
totalDrain += Number(l.drain);
|
|
15622
|
+
const d = Number(l.depth);
|
|
15623
|
+
if (d > maxDepth)
|
|
15624
|
+
maxDepth = d;
|
|
15625
|
+
}
|
|
15626
|
+
return {
|
|
15627
|
+
yield: UInt16.from(Math.min(totalYield, 65535)),
|
|
15628
|
+
drain: UInt32.from(totalDrain),
|
|
15629
|
+
depth: UInt16.from(maxDepth),
|
|
15630
|
+
};
|
|
15631
|
+
}
|
|
15632
|
+
function rollupCrafter(lanes) {
|
|
15633
|
+
if (lanes.length === 0)
|
|
15634
|
+
return undefined;
|
|
15635
|
+
let totalSpeed = 0;
|
|
15636
|
+
let totalDrain = 0;
|
|
15637
|
+
for (const l of lanes) {
|
|
15638
|
+
totalSpeed += Number(l.speed);
|
|
15639
|
+
totalDrain += Number(l.drain);
|
|
15640
|
+
}
|
|
15641
|
+
return {
|
|
15642
|
+
speed: UInt16.from(Math.min(totalSpeed, 65535)),
|
|
15643
|
+
drain: UInt32.from(totalDrain),
|
|
15644
|
+
};
|
|
15645
|
+
}
|
|
15646
|
+
function rollupLoaders(lanes) {
|
|
15647
|
+
if (lanes.length === 0)
|
|
15648
|
+
return undefined;
|
|
15649
|
+
const count = lanes.length;
|
|
15650
|
+
let totalMass = 0;
|
|
15651
|
+
let totalThrust = 0;
|
|
15652
|
+
for (const l of lanes) {
|
|
15653
|
+
totalMass += Number(l.mass);
|
|
15654
|
+
totalThrust += Number(l.thrust);
|
|
15655
|
+
}
|
|
15656
|
+
return {
|
|
15657
|
+
mass: UInt32.from(Math.floor(totalMass / count)),
|
|
15658
|
+
thrust: UInt16.from(Math.min(totalThrust, 65535)),
|
|
15659
|
+
quantity: UInt8.from(count),
|
|
15660
|
+
};
|
|
15661
|
+
}
|
|
15662
|
+
|
|
14542
15663
|
function toNum(v) {
|
|
14543
15664
|
return Number(UInt16.from(v).value.toString());
|
|
14544
15665
|
}
|
|
@@ -14729,7 +15850,12 @@ function resolveEntity(id, stats, modules) {
|
|
|
14729
15850
|
let attributes;
|
|
14730
15851
|
let moduleSlots;
|
|
14731
15852
|
if (stats !== undefined) {
|
|
14732
|
-
const
|
|
15853
|
+
const bigStats = toBigStats(stats);
|
|
15854
|
+
const decoded = decodeCraftedItemStats(id, bigStats);
|
|
15855
|
+
if (decoded.strength === undefined)
|
|
15856
|
+
decoded.strength = decodeStat(bigStats, 0);
|
|
15857
|
+
if (decoded.hardness === undefined)
|
|
15858
|
+
decoded.hardness = decodeStat(bigStats, 2);
|
|
14733
15859
|
const hullCaps = hullCapsForEntity(id, decoded);
|
|
14734
15860
|
attributes = [
|
|
14735
15861
|
{
|
|
@@ -14926,164 +16052,6 @@ function renderDescription(desc, options) {
|
|
|
14926
16052
|
return spans;
|
|
14927
16053
|
}
|
|
14928
16054
|
|
|
14929
|
-
function idiv(a, b) {
|
|
14930
|
-
return Math.floor(a / b);
|
|
14931
|
-
}
|
|
14932
|
-
function computeBaseHullmass(stats) {
|
|
14933
|
-
const density = decodeStat(stats, 1);
|
|
14934
|
-
return 100000 - 75 * density;
|
|
14935
|
-
}
|
|
14936
|
-
function computeBaseCapacityShip(stats) {
|
|
14937
|
-
const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
|
|
14938
|
-
return Math.floor(5000000 * 6 ** (s / 2997));
|
|
14939
|
-
}
|
|
14940
|
-
function computeBaseCapacityWarehouse(stats) {
|
|
14941
|
-
const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
|
|
14942
|
-
return Math.floor(100000000 * 6 ** (s / 2997));
|
|
14943
|
-
}
|
|
14944
|
-
const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
|
|
14945
|
-
const computeEngineDrain = (thm) => 2 * Math.max(30, 50 - idiv(thm, 70));
|
|
14946
|
-
const computeGeneratorCap = (com) => 950 + idiv(com, 2);
|
|
14947
|
-
const computeGeneratorRech = (fin) => 2 * (1 + idiv(fin * 3, 1000));
|
|
14948
|
-
const computeGathererYield = (str) => 200 + str;
|
|
14949
|
-
const computeGathererDrain = (con) => 2 * Math.max(250, 1250 - idiv(con * 25, 20));
|
|
14950
|
-
const computeGathererDepth = (tol, tier) => gathererDepthForTier(tol, tier);
|
|
14951
|
-
const computeLoaderMass = (ins) => Math.max(200, 2000 - ins * 2);
|
|
14952
|
-
const computeLoaderThrust = (pla) => 1 + idiv(pla * pla, 10000);
|
|
14953
|
-
const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
|
|
14954
|
-
const computeCrafterDrain = (fin) => Math.max(5, 30 - idiv(fin, 33));
|
|
14955
|
-
const computeHaulerCapacity = (fin) => Math.max(1, 1 + idiv(fin, 400));
|
|
14956
|
-
const computeHaulerEfficiency = (con) => 2000 + con * 6;
|
|
14957
|
-
const computeHaulerDrain = (com) => Math.max(3, 15 - idiv(com, 80));
|
|
14958
|
-
const computeWarpRange = (stat) => 100 + stat * 3;
|
|
14959
|
-
function entityDisplayName(itemId) {
|
|
14960
|
-
switch (itemId) {
|
|
14961
|
-
case ITEM_SHIP_T1_PACKED:
|
|
14962
|
-
return 'Ship';
|
|
14963
|
-
case ITEM_WAREHOUSE_T1_PACKED:
|
|
14964
|
-
return 'Warehouse';
|
|
14965
|
-
case ITEM_EXTRACTOR_T1_PACKED:
|
|
14966
|
-
return 'Extractor';
|
|
14967
|
-
case ITEM_CONTAINER_T1_PACKED:
|
|
14968
|
-
return 'Container';
|
|
14969
|
-
case ITEM_CONTAINER_T2_PACKED:
|
|
14970
|
-
return 'Container';
|
|
14971
|
-
default:
|
|
14972
|
-
return 'Entity';
|
|
14973
|
-
}
|
|
14974
|
-
}
|
|
14975
|
-
function moduleDisplayName(itemId) {
|
|
14976
|
-
switch (itemId) {
|
|
14977
|
-
case ITEM_ENGINE_T1:
|
|
14978
|
-
return 'Engine';
|
|
14979
|
-
case ITEM_GENERATOR_T1:
|
|
14980
|
-
return 'Generator';
|
|
14981
|
-
case ITEM_GATHERER_T1:
|
|
14982
|
-
return 'Gatherer';
|
|
14983
|
-
case ITEM_LOADER_T1:
|
|
14984
|
-
return 'Loader';
|
|
14985
|
-
case ITEM_CRAFTER_T1:
|
|
14986
|
-
return 'Crafter';
|
|
14987
|
-
case ITEM_STORAGE_T1:
|
|
14988
|
-
return 'Storage';
|
|
14989
|
-
case ITEM_HAULER_T1:
|
|
14990
|
-
return 'Hauler';
|
|
14991
|
-
case ITEM_WARP_T1:
|
|
14992
|
-
return 'Warp';
|
|
14993
|
-
default:
|
|
14994
|
-
return 'Module';
|
|
14995
|
-
}
|
|
14996
|
-
}
|
|
14997
|
-
function formatModuleLine(slot, itemId, stats) {
|
|
14998
|
-
let out = `Slot ${slot} - `;
|
|
14999
|
-
if (itemId === 0) {
|
|
15000
|
-
out += '(empty)';
|
|
15001
|
-
return out;
|
|
15002
|
-
}
|
|
15003
|
-
out += moduleDisplayName(itemId);
|
|
15004
|
-
const subtype = getModuleCapabilityType(itemId);
|
|
15005
|
-
switch (subtype) {
|
|
15006
|
-
case MODULE_ENGINE: {
|
|
15007
|
-
const vol = decodeStat(stats, 0);
|
|
15008
|
-
const thm = decodeStat(stats, 1);
|
|
15009
|
-
out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`;
|
|
15010
|
-
break;
|
|
15011
|
-
}
|
|
15012
|
-
case MODULE_GENERATOR: {
|
|
15013
|
-
const res = decodeStat(stats, 0);
|
|
15014
|
-
const ref = decodeStat(stats, 1);
|
|
15015
|
-
out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`;
|
|
15016
|
-
break;
|
|
15017
|
-
}
|
|
15018
|
-
case MODULE_GATHERER: {
|
|
15019
|
-
const str = decodeStat(stats, 0);
|
|
15020
|
-
const tol = decodeStat(stats, 1);
|
|
15021
|
-
const con = decodeStat(stats, 2);
|
|
15022
|
-
const tier = getItem(itemId).tier;
|
|
15023
|
-
out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol, tier)} Drain ${computeGathererDrain(con)}`;
|
|
15024
|
-
break;
|
|
15025
|
-
}
|
|
15026
|
-
case MODULE_LOADER: {
|
|
15027
|
-
const fin = decodeStat(stats, 0);
|
|
15028
|
-
const pla = decodeStat(stats, 1);
|
|
15029
|
-
out += ` Mass ${computeLoaderMass(fin)} Thrust ${computeLoaderThrust(pla)}`;
|
|
15030
|
-
break;
|
|
15031
|
-
}
|
|
15032
|
-
case MODULE_CRAFTER: {
|
|
15033
|
-
const rea = decodeStat(stats, 0);
|
|
15034
|
-
const com = decodeStat(stats, 1);
|
|
15035
|
-
out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(com)}`;
|
|
15036
|
-
break;
|
|
15037
|
-
}
|
|
15038
|
-
case MODULE_STORAGE: {
|
|
15039
|
-
const str = decodeStat(stats, 0);
|
|
15040
|
-
const fin = decodeStat(stats, 2);
|
|
15041
|
-
const sat = decodeStat(stats, 3);
|
|
15042
|
-
const sum = str + fin + sat;
|
|
15043
|
-
const pct = 10 + idiv(sum * 10, 2997);
|
|
15044
|
-
out += ` +${pct}% capacity`;
|
|
15045
|
-
break;
|
|
15046
|
-
}
|
|
15047
|
-
case MODULE_HAULER: {
|
|
15048
|
-
const res = decodeStat(stats, 0);
|
|
15049
|
-
const pla = decodeStat(stats, 1);
|
|
15050
|
-
const ref = decodeStat(stats, 2);
|
|
15051
|
-
out += ` Capacity ${computeHaulerCapacity(res)} Efficiency ${computeHaulerEfficiency(pla)} Drain ${computeHaulerDrain(ref)}`;
|
|
15052
|
-
break;
|
|
15053
|
-
}
|
|
15054
|
-
case MODULE_WARP: {
|
|
15055
|
-
const stat = decodeStat(stats, 0);
|
|
15056
|
-
out += ` Range ${computeWarpRange(stat)}`;
|
|
15057
|
-
break;
|
|
15058
|
-
}
|
|
15059
|
-
}
|
|
15060
|
-
return out;
|
|
15061
|
-
}
|
|
15062
|
-
function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
|
|
15063
|
-
const hullMass = computeBaseHullmass(hullStats);
|
|
15064
|
-
let baseCapacity = 0;
|
|
15065
|
-
if (itemId === ITEM_SHIP_T1_PACKED) {
|
|
15066
|
-
baseCapacity = computeBaseCapacityShip(hullStats);
|
|
15067
|
-
}
|
|
15068
|
-
else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
|
|
15069
|
-
baseCapacity = computeBaseCapacityWarehouse(hullStats);
|
|
15070
|
-
}
|
|
15071
|
-
else if (itemId === ITEM_EXTRACTOR_T1_PACKED) {
|
|
15072
|
-
baseCapacity = computeBaseCapacityShip(hullStats);
|
|
15073
|
-
}
|
|
15074
|
-
let out = entityDisplayName(itemId);
|
|
15075
|
-
out += ` - Hull ${hullMass} mass`;
|
|
15076
|
-
if (baseCapacity > 0) {
|
|
15077
|
-
out += ` * ${baseCapacity} capacity`;
|
|
15078
|
-
}
|
|
15079
|
-
out += '\n\n';
|
|
15080
|
-
for (let i = 0; i < moduleItems.length; i++) {
|
|
15081
|
-
out += formatModuleLine(i, moduleItems[i], moduleStats[i] ?? 0n);
|
|
15082
|
-
out += '\n';
|
|
15083
|
-
}
|
|
15084
|
-
return out;
|
|
15085
|
-
}
|
|
15086
|
-
|
|
15087
16055
|
function moduleSlotsForImmutable(modules) {
|
|
15088
16056
|
return modules.map((m) => ({
|
|
15089
16057
|
type: Number(m.type.toString()),
|
|
@@ -15237,7 +16205,7 @@ function buildModuleImmutable(itemId, quantity, stats, originX, originY) {
|
|
|
15237
16205
|
base.push({ first: 'reflectivity', second: ['uint16', ref] });
|
|
15238
16206
|
base.push({ first: 'capacity', second: ['uint8', computeHaulerCapacity(res)] });
|
|
15239
16207
|
base.push({ first: 'efficiency', second: ['uint16', computeHaulerEfficiency(pla)] });
|
|
15240
|
-
base.push({ first: 'drain', second: ['uint16', computeHaulerDrain(ref)] });
|
|
16208
|
+
base.push({ first: 'drain', second: ['uint16', computeHaulerDrain$1(ref)] });
|
|
15241
16209
|
break;
|
|
15242
16210
|
}
|
|
15243
16211
|
}
|
|
@@ -15292,6 +16260,8 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
15292
16260
|
deserializeAsset: deserializeAsset,
|
|
15293
16261
|
computeBaseHullmass: computeBaseHullmass,
|
|
15294
16262
|
computeBaseCapacityShip: computeBaseCapacityShip,
|
|
16263
|
+
computeBaseCapacityContainer: computeBaseCapacityContainer,
|
|
16264
|
+
computeBaseCapacityContainerT2: computeBaseCapacityContainerT2,
|
|
15295
16265
|
computeBaseCapacityWarehouse: computeBaseCapacityWarehouse,
|
|
15296
16266
|
computeEngineThrust: computeEngineThrust,
|
|
15297
16267
|
computeEngineDrain: computeEngineDrain,
|
|
@@ -15306,7 +16276,7 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
15306
16276
|
computeCrafterDrain: computeCrafterDrain,
|
|
15307
16277
|
computeHaulerCapacity: computeHaulerCapacity,
|
|
15308
16278
|
computeHaulerEfficiency: computeHaulerEfficiency,
|
|
15309
|
-
computeHaulerDrain: computeHaulerDrain,
|
|
16279
|
+
computeHaulerDrain: computeHaulerDrain$1,
|
|
15310
16280
|
computeWarpRange: computeWarpRange,
|
|
15311
16281
|
entityDisplayName: entityDisplayName,
|
|
15312
16282
|
moduleDisplayName: moduleDisplayName,
|
|
@@ -15406,5 +16376,76 @@ function describeItem(resolved, opts) {
|
|
|
15406
16376
|
return `${tier} ${resolved.name} · ${mass}`;
|
|
15407
16377
|
}
|
|
15408
16378
|
|
|
15409
|
-
export { ALL_ENTITY_TYPES, ATOMICASSETS_ACCOUNT, ActionsManager, BASE_ORBITAL_MASS, BLEND_INPUTS_MUST_MATCH, BLEND_REQUIRES_MULTIPLE, BLEND_STAT_LESS_NOT_SUPPORTED, CANCEL_CONTAINS_GROUPED_TASK, CAP_DEMOLISH, CAP_MODULES, CAP_UNDEPLOY, CAP_WRAP, CATEGORY_LABELS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, COMPONENT_TIER_PREFIXES, CONTAINER_NOT_FOUND, CONTAINER_Z, CRAFT_ENERGY_DIVISOR, CRAFT_EXCEEDS_ENERGY_CAPACITY, CRAFT_NOT_ENOUGH_ENERGY, ConstructionManager, Coordinates, DEPLOY_ENTITY_HAS_SCHEDULE, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, DESTINATION_CAPACITY_EXCEEDED, ENTITY_ALREADY_THERE, ENTITY_CAPACITY_EXCEEDED, ENTITY_CARGO_NOT_LOADED, ENTITY_CARGO_NOT_OWNED, ENTITY_CONTAINER, ENTITY_EXTRACTOR, ENTITY_FACTORY, ENTITY_INVALID_CARGO, ENTITY_INVALID_DESTINATION, ENTITY_INVALID_TRAVEL_DURATION, ENTITY_NEXUS, ENTITY_NOT_ENOUGH_ENERGY, ENTITY_NOT_ENOUGH_ENERGY_CAPACITY, 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, Entity, EntityClass, EntityInventory, EpochsManager, 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, HoldKind, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_BATTERY_T1, ITEM_BEAM, 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_CERAMIC, 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_FACTORY_T1_PACKED, ITEM_FRAME, ITEM_FRAME_T2, 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_LOADER_T1, 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_PLASMA_CELL, ITEM_PLATE, ITEM_PLATE_T2, ITEM_POLYMER, ITEM_REACTOR, 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_RESIN, ITEM_RESONATOR, ITEM_SENSOR, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, ITEM_WARP_T1, InventoryAccessor, LANE_BARRIER, LANE_MOBILITY, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MAX_STARS_PER_STAT, MAX_STAR_RATING, MIN_ORBITAL_ALTITUDE, MIN_TRANSFER_DISTANCE_ORBITAL_VESSEL, MIN_TRANSFER_DISTANCE_PLANETARY_STRUCTURE, MODULE_ANY, MODULE_BATTERY, 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_TIER_PREFIXES, MODULE_TYPE_MISMATCH, MODULE_WARP, index as NFT, NO_SCHEDULE, NftManager, 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, RESOURCE_TIER_ADJECTIVES, SHIPLOAD_COLLECTION, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_NOT_ARRIVED, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, SLOT_FORMULAS, STAR_STEP, ScheduleAccessor, server as ServerContract, Types as ServerTypes, Shipload, SubscriptionsManager, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_NOT_FOUND, WARP_HAS_CARGO, WARP_HAS_SCHEDULE, WARP_NOT_FULL_ENERGY, WARP_NO_CAPABILITY, WARP_OUT_OF_RANGE, WebSocketConnection, YIELD_FRACTION_DEEP, YIELD_FRACTION_SHALLOW, allBuildableItems, allPlotBuildableItems, availableBuildMethods, availableCapacity, availableCapacityFromMass, availableForItem, baseName, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildComponentImmutable, buildEntityDescription, buildEntityImmutable, buildImmutableData, buildMintAssetAction, buildModuleImmutable, buildResourceImmutable, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcStacksMass, calc_acceleration, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, calc_gather_rate, 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, candidateLaneCompletesAt, capabilityAttributes, capabilityNames, capsHasCrafter, capsHasGatherer, capsHasHauler, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItem, cargoItemToStack, cargoReadyAt, cargoRef, cargoUtils, categoryColors, categoryFromIndex, categoryLabel, categoryLabelFromIndex, componentIcon, composeIdleResolve, computeBaseCapacity, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass, computeComponentStats, computeContainerCapabilities, computeContainerT2Capabilities, computeCraftedOutputStats, computeCrafterCapabilities, computeCrafterDrain, computeCrafterSpeed, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityCapabilities, computeEntityStats, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeHaulPenalty, computeHaulerCapabilities, computeHaulerCapacity, computeHaulerDrain$1 as computeHaulerDrain, computeHaulerEfficiency, computeInputMass, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeNftImageUrl, computeShipHullCapabilities, computeStorageCapabilities, computeWarehouseHullCapabilities, computeWarpCapabilities, computeWarpRange, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeAtomicAsset, 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, energyAtTime, energyPercent, entityDisplayName, estimateDealTravelTime, estimateTravelTime, fetchAtomicAssetsForOwner, fetchAtomicSchemas, filterByBuildMethod, findNearbyPlanets, flightSpeedFactor, formatLocation, formatMass, formatMassDelta, formatMassScaled, formatModuleLine, formatTier, gathererDepthForTier, getCapabilityAttributes, getCategoryInfo, getComponents, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEffectiveReserve, getEligibleResources, getEntityClass, getEntityItems, getEntityLayout, getEpochInfo, getFlightOrigin, getInterpolatedPosition, getItem, getItems, getKindMeta, getLocationCandidates, getLocationProfile, getLocationType, getLocationTypeName, getModuleCapabilityType, getModules, getPackedEntityType, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getRecipe, getResourceTier, getResourceWeight, getResources, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, getTemplateMeta, hasEnergy, hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, interpolateFlightPosition, isBuildable, isContainer, isCraftedItem, isExtractor, isFactory, isFull, isFullFromMass, isGatherableLocation, isInvertedAttribute, isLocationBuildable, isModuleItem, isNexus, isPlot, isPlotBuildable, isRelatedItem, isShip, isSubscriptionsDebugEnabled, isWarehouse, itemAbbreviations, itemCategory, itemIds, itemOffset, itemTier, itemTypeCode, kindCan, laneKeyForModule, lerp$1 as lerp, makeEntity, mapEntity, maxCraftable, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleSlotTypeToCode, needsRecharge, normalizeDisplayName, parseWireEntity, projectEntity, projectEntityAt, projectRemainingAt, projectedCargoAvailableAt, rawScheduleEnd, readCommonBase, removeFromStacks, renderDescription, resolveItem, resolveItemCategory, resolveLockedAmount, resolveStats, rollTier, rollWithinTier, rotation, schedule, setSubscriptionsDebug, stackKey, stackToCargoItem, stacksEqual, starRating, starsForStat, statMagnitude, subtractFromStacks, taskCargoChanges, taskCargoEffect, tierAdjective, tierColors, tierOfReserve, toLocation, typeLabel, validateDisplayName, validateSchedule, workerLaneKey, yieldThresholdAt };
|
|
16379
|
+
const PLAN_ITEM_MASS = GATHER_MASS_DIVISOR;
|
|
16380
|
+
const PLAN_RICHNESS = 1000;
|
|
16381
|
+
const MAX_PLAN_QTY = 10000;
|
|
16382
|
+
function gatherEnergyCost(lane, quantity, stratum) {
|
|
16383
|
+
const stats = lane;
|
|
16384
|
+
const dur = Number(calc_gather_duration(stats, PLAN_ITEM_MASS, quantity, stratum, PLAN_RICHNESS));
|
|
16385
|
+
return Number(calc_gather_energy(stats, dur));
|
|
16386
|
+
}
|
|
16387
|
+
function allocateProportional(lanes, total) {
|
|
16388
|
+
if (lanes.length === 0)
|
|
16389
|
+
return [];
|
|
16390
|
+
const weightSum = lanes.reduce((s, l) => s + l.weight, 0);
|
|
16391
|
+
if (weightSum === 0)
|
|
16392
|
+
return [];
|
|
16393
|
+
const entries = lanes.map((l) => ({
|
|
16394
|
+
slot: l.slot,
|
|
16395
|
+
quantity: Math.floor((total * l.weight) / weightSum),
|
|
16396
|
+
}));
|
|
16397
|
+
let remainder = total - entries.reduce((s, e) => s + e.quantity, 0);
|
|
16398
|
+
for (let i = 0; remainder > 0; i = (i + 1) % entries.length) {
|
|
16399
|
+
entries[i].quantity++;
|
|
16400
|
+
remainder--;
|
|
16401
|
+
}
|
|
16402
|
+
return entries;
|
|
16403
|
+
}
|
|
16404
|
+
function planParallelGather(entity, target, stratum, now) {
|
|
16405
|
+
const reaching = entity.gatherer_lanes.filter((l) => l.depth.toNumber() >= stratum);
|
|
16406
|
+
if (reaching.length === 0)
|
|
16407
|
+
throw new Error('no gatherer reaches this stratum');
|
|
16408
|
+
const energy = entity.generator ? Number(projectRemainingAt(entity).energy) : Infinity;
|
|
16409
|
+
const requestedQty = target === 'max' ? MAX_PLAN_QTY : target.quantity;
|
|
16410
|
+
let activeLanes = reaching.slice().sort((a, b) => a.yield.toNumber() - b.yield.toNumber());
|
|
16411
|
+
while (activeLanes.length > 0) {
|
|
16412
|
+
const laneWeights = activeLanes.map((l) => ({
|
|
16413
|
+
slot: l.slot_index.toNumber(),
|
|
16414
|
+
weight: l.yield.toNumber(),
|
|
16415
|
+
}));
|
|
16416
|
+
const proposed = allocateProportional(laneWeights, requestedQty);
|
|
16417
|
+
const totalEnergyCost = proposed.reduce((sum, entry) => {
|
|
16418
|
+
const lane = activeLanes.find((l) => l.slot_index.toNumber() === entry.slot);
|
|
16419
|
+
return sum + gatherEnergyCost(lane, entry.quantity, stratum);
|
|
16420
|
+
}, 0);
|
|
16421
|
+
if (totalEnergyCost <= energy) {
|
|
16422
|
+
return proposed.filter((e) => e.quantity > 0);
|
|
16423
|
+
}
|
|
16424
|
+
if (activeLanes.length === 1) {
|
|
16425
|
+
const lane = activeLanes[0];
|
|
16426
|
+
const energyPerUnit = gatherEnergyCost(lane, 1, stratum);
|
|
16427
|
+
if (energyPerUnit === 0)
|
|
16428
|
+
return proposed.filter((e) => e.quantity > 0);
|
|
16429
|
+
const maxQty = Math.min(requestedQty, Math.floor(energy / energyPerUnit));
|
|
16430
|
+
if (maxQty <= 0)
|
|
16431
|
+
return [];
|
|
16432
|
+
return [{ slot: lane.slot_index.toNumber(), quantity: maxQty }];
|
|
16433
|
+
}
|
|
16434
|
+
activeLanes = activeLanes.slice(1);
|
|
16435
|
+
}
|
|
16436
|
+
return [];
|
|
16437
|
+
}
|
|
16438
|
+
function planParallelTransfer(entity, target) {
|
|
16439
|
+
const lanes = entity.loader_lanes.filter((l) => l.thrust.toNumber() > 0);
|
|
16440
|
+
if (lanes.length === 0)
|
|
16441
|
+
return [];
|
|
16442
|
+
const requestedQty = target === 'max' ? MAX_PLAN_QTY : target.quantity;
|
|
16443
|
+
const laneWeights = lanes.map((l) => ({
|
|
16444
|
+
slot: l.slot_index.toNumber(),
|
|
16445
|
+
weight: l.thrust.toNumber(),
|
|
16446
|
+
}));
|
|
16447
|
+
return allocateProportional(laneWeights, requestedQty).filter((e) => e.quantity > 0);
|
|
16448
|
+
}
|
|
16449
|
+
|
|
16450
|
+
export { ALL_ENTITY_TYPES, ATOMICASSETS_ACCOUNT, ActionsManager, BASE_ORBITAL_MASS, BLEND_INPUTS_MUST_MATCH, BLEND_REQUIRES_MULTIPLE, BLEND_STAT_LESS_NOT_SUPPORTED, CANCEL_CONTAINS_GROUPED_TASK, CAP_DEMOLISH, CAP_MODULES, CAP_UNDEPLOY, CAP_WRAP, CATEGORY_LABELS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, COMPONENT_TIER_PREFIXES, CONTAINER_NOT_FOUND, CONTAINER_Z, COORD_MAX, COORD_MIN, COORD_OFFSET, CRAFT_ENERGY_DIVISOR, CRAFT_EXCEEDS_ENERGY_CAPACITY, CRAFT_NOT_ENOUGH_ENERGY, CancelBlockReason, ConstructionManager, Coordinates, DEPLOY_ENTITY_HAS_SCHEDULE, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, DESTINATION_CAPACITY_EXCEEDED, ENTITY_ALREADY_THERE, ENTITY_CAPACITY_EXCEEDED, ENTITY_CARGO_NOT_LOADED, ENTITY_CARGO_NOT_OWNED, ENTITY_CONTAINER, ENTITY_EXTRACTOR, ENTITY_FACTORY, ENTITY_INVALID_CARGO, ENTITY_INVALID_DESTINATION, ENTITY_INVALID_TRAVEL_DURATION, ENTITY_NEXUS, ENTITY_NOT_ENOUGH_ENERGY, ENTITY_NOT_ENOUGH_ENERGY_CAPACITY, 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, Entity, EntityClass, EntityInventory, EpochsManager, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GATHERER_DEPTH_MAX_TIER, GATHERER_DEPTH_TABLE, GATHER_EXCEEDS_ENERGY_CAPACITY, GATHER_MASS_DIVISOR, 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, HoldKind, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_BATTERY_T1, ITEM_BEAM, 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_CERAMIC, 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_FACTORY_T1_PACKED, ITEM_FRAME, ITEM_FRAME_T2, 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_LOADER_T1, 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_PLASMA_CELL, ITEM_PLATE, ITEM_PLATE_T2, ITEM_POLYMER, ITEM_REACTOR, 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_RESIN, ITEM_RESONATOR, ITEM_SENSOR, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, ITEM_WARP_T1, InventoryAccessor, LANE_BARRIER, LANE_MOBILITY, LOCAL_HALF, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MAX_STARS_PER_STAT, MAX_STAR_RATING, MIN_ORBITAL_ALTITUDE, MIN_TRANSFER_DISTANCE_ORBITAL_VESSEL, MIN_TRANSFER_DISTANCE_PLANETARY_STRUCTURE, MODULE_ANY, MODULE_BATTERY, 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_TIER_PREFIXES, MODULE_TYPE_MISMATCH, MODULE_WARP, index as NFT, NO_SCHEDULE, NftManager, 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, REGION_DIV, REGION_PER_AXIS, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, RESERVE_TIERS, RESOLVE_COUNT_EXCEEDS_COMPLETED, RESOURCE_TIER_ADJECTIVES, SECTORS_PER_AXIS, SECTOR_DIV, SHIPLOAD_COLLECTION, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_NOT_ARRIVED, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, SLOT_FORMULAS, STAR_STEP, ScheduleAccessor, server as ServerContract, Types as ServerTypes, Shipload, SubscriptionsManager, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_NOT_FOUND, WARP_HAS_CARGO, WARP_HAS_SCHEDULE, WARP_NOT_FULL_ENERGY, WARP_NO_CAPABILITY, WARP_OUT_OF_RANGE, WH, WOULD_OVERFILL, WOULD_STRAND, WebSocketConnection, YIELD_FRACTION_DEEP, YIELD_FRACTION_SHALLOW, addressFromCoordinates, allBuildableItems, allPlotBuildableItems, availableBuildMethods, availableCapacity, availableCapacityFromMass, availableForItem, baseName, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildComponentImmutable, buildEntityDescription, buildEntityImmutable, buildImmutableData, buildMintAssetAction, buildModuleImmutable, buildResourceImmutable, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcStacksMass, calc_acceleration, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, calc_gather_rate, calc_loader_acceleration, calc_loader_flighttime, calc_onesided_duration, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calc_transit_duration, calculateFlightTime, calculateLoadTimeBreakdown, calculateRefuelingTime, calculateTransferTime, canMove, cancelEligibility, candidateLaneCompletesAt, capabilityAttributes, capabilityNames, capsHasCrafter, capsHasGatherer, capsHasHauler, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItem, cargoItemToStack, cargoReadyAt, cargoRef, cargoUtils, categoryColors, categoryFromIndex, categoryLabel, categoryLabelFromIndex, componentIcon, composeIdleResolve, computeBaseCapacity, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass, computeComponentStats, computeContainerCapabilities, computeContainerT2Capabilities, computeCraftedOutputStats, computeCrafterCapabilities, computeCrafterDrain, computeCrafterSpeed, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityCapabilities, computeEntityStats, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeHaulPenalty, computeHaulerCapabilities, computeHaulerCapacity, computeHaulerDrain, computeHaulerEfficiency, computeInputMass, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeNftImageUrl, computeShipHullCapabilities, computeStorageCapabilities, computeWarehouseHullCapabilities, computeWarpCapabilities, computeWarpRange, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeAddress, decodeAtomicAsset, decodeCraftedItemStats, decodeRegion, decodeSector, 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, encodeAddress, encodeAddressMemo, encodeGatheredCargoStats, encodeRegion, encodeSector, encodeStats, energyAtTime, energyPercent, entityDisplayName, estimateDealTravelTime, estimateTravelTime, feistel, feistelInv, fetchAtomicAssetsForOwner, fetchAtomicSchemas, filterByBuildMethod, findNearbyPlanets, flightSpeedFactor, formatLocation, formatMass, formatMassDelta, formatMassScaled, formatModuleLine, formatTier, gathererDepthForTier, getCapabilityAttributes, getCategoryInfo, getComponents, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEffectiveReserve, getEligibleResources, getEntityClass, getEntityItems, getEntityLayout, getEpochInfo, getFlightOrigin, getInterpolatedPosition, getItem, getItems, getKindMeta, getLocationCandidates, getLocationKind, getLocationProfile, getLocationType, getLocationTypeName, getModuleCapabilityType, getModules, getPackedEntityType, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getRecipe, getResourceTier, getResourceWeight, getResources, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, getTemplateMeta, hasEnergy, hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, interpolateFlightPosition, isBuildable, isContainer, isCraftedItem, isExtractor, isFactory, isFull, isFullFromMass, isGatherableLocation, isInvertedAttribute, isLocationBuildable, isModuleItem, isNexus, isPlot, isPlotBuildable, isRelatedItem, isShip, isSubscriptionsDebugEnabled, isValidWormholePair, isWarehouse, itemAbbreviations, itemCategory, itemIds, itemOffset, itemTier, itemTypeCode, kindCan, laneKeyForModule, lerp$1 as lerp, makeEntity, mapEntity, maxCraftable, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleSlotTypeToCode, needsRecharge, normalizeDisplayName, parseWireEntity, partnerRegion, planParallelGather, planParallelTransfer, projectEntity, projectEntityAt, projectRemainingAt, projectedCargoAvailableAt, rawScheduleEnd, readCommonBase, regionOf, removeFromStacks, renderDescription, resolveItem, resolveItemCategory, resolveLaneCrafter, resolveLaneGatherer, resolveLaneLoader, resolveLockedAmount, resolveStats, rollTier, rollWithinTier, rollupCrafter, rollupGatherer, rollupLoaders, rotation, schedule, selectGatherLane, setSubscriptionsDebug, stackKey, stackToCargoItem, stacksEqual, starRating, starsForStat, statMagnitude, subtractFromStacks, taskCargoChanges, taskCargoEffect, tierAdjective, tierColors, tierOfReserve, toLocation, typeLabel, validateDisplayName, validateSchedule, workerLaneKey, wormholeAt, wormholeAtRegionEndpoint, yieldThresholdAt };
|
|
15410
16451
|
//# sourceMappingURL=shipload.m.js.map
|