@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.
Files changed (59) hide show
  1. package/lib/shipload.d.ts +398 -51
  2. package/lib/shipload.js +1481 -400
  3. package/lib/shipload.js.map +1 -1
  4. package/lib/shipload.m.js +1442 -401
  5. package/lib/shipload.m.js.map +1 -1
  6. package/lib/testing.d.ts +101 -20
  7. package/lib/testing.js +201 -57
  8. package/lib/testing.js.map +1 -1
  9. package/lib/testing.m.js +201 -57
  10. package/lib/testing.m.js.map +1 -1
  11. package/package.json +1 -1
  12. package/src/capabilities/crafting.ts +2 -3
  13. package/src/capabilities/gathering.test.ts +16 -0
  14. package/src/capabilities/gathering.ts +8 -11
  15. package/src/contracts/server.ts +147 -29
  16. package/src/coordinates/address.ts +88 -0
  17. package/src/coordinates/constants.test.ts +15 -0
  18. package/src/coordinates/constants.ts +23 -0
  19. package/src/coordinates/index.ts +15 -0
  20. package/src/coordinates/memo.test.ts +47 -0
  21. package/src/coordinates/memo.ts +20 -0
  22. package/src/coordinates/permutation.ts +77 -0
  23. package/src/coordinates/regions.ts +48 -0
  24. package/src/coordinates/sectors.ts +115 -0
  25. package/src/data/capability-formulas.ts +0 -1
  26. package/src/data/entities.json +4 -4
  27. package/src/data/items.json +5 -5
  28. package/src/data/recipes.json +39 -65
  29. package/src/derivation/capabilities.test.ts +133 -0
  30. package/src/derivation/capabilities.ts +66 -14
  31. package/src/derivation/rollups.test.ts +55 -0
  32. package/src/derivation/rollups.ts +56 -0
  33. package/src/derivation/wormhole.ts +115 -0
  34. package/src/entities/makers.ts +30 -3
  35. package/src/errors.ts +2 -0
  36. package/src/index-module.ts +38 -2
  37. package/src/managers/actions.ts +79 -5
  38. package/src/managers/construction.ts +6 -4
  39. package/src/managers/context.ts +9 -0
  40. package/src/managers/coordinates.ts +14 -0
  41. package/src/managers/plot.ts +2 -4
  42. package/src/nft/description.ts +25 -6
  43. package/src/planner/index.ts +127 -0
  44. package/src/planner/planner.test.ts +319 -0
  45. package/src/resolution/resolve-item.ts +4 -1
  46. package/src/scheduling/availability.ts +1 -1
  47. package/src/scheduling/cancel.test.ts +348 -0
  48. package/src/scheduling/cancel.ts +209 -0
  49. package/src/scheduling/lanes.test.ts +249 -0
  50. package/src/scheduling/lanes.ts +140 -2
  51. package/src/scheduling/projection.ts +75 -16
  52. package/src/scheduling/schedule.ts +3 -1
  53. package/src/shipload.ts +5 -0
  54. package/src/testing/projection-parity.ts +26 -2
  55. package/src/travel/travel.ts +116 -105
  56. package/src/types/capabilities.ts +23 -6
  57. package/src/types/entity.ts +3 -3
  58. package/src/types.ts +2 -1
  59. package/src/utils/system.ts +11 -0
package/lib/shipload.js CHANGED
@@ -448,7 +448,7 @@ var platform = /*#__PURE__*/Object.freeze({
448
448
  Contract: Contract$1
449
449
  });
450
450
 
451
- const abiBlob = antelope.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');
451
+ const abiBlob = antelope.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=');
452
452
  const abi = antelope.ABI.from(abiBlob);
453
453
  exports.ServerTypes = void 0;
454
454
  (function (Types) {
@@ -865,22 +865,31 @@ exports.ServerTypes = void 0;
865
865
  tslib.__decorate([
866
866
  antelope.Struct.field(antelope.UInt64, { optional: true })
867
867
  ], craft.prototype, "target", void 0);
868
+ tslib.__decorate([
869
+ antelope.Struct.field(antelope.UInt8, { optional: true })
870
+ ], craft.prototype, "slot", void 0);
868
871
  craft = tslib.__decorate([
869
872
  antelope.Struct.type('craft')
870
873
  ], craft);
871
874
  Types.craft = craft;
872
- let crafter_stats = class crafter_stats extends antelope.Struct {
875
+ let crafter_lane = class crafter_lane extends antelope.Struct {
873
876
  };
877
+ tslib.__decorate([
878
+ antelope.Struct.field(antelope.UInt8)
879
+ ], crafter_lane.prototype, "slot_index", void 0);
874
880
  tslib.__decorate([
875
881
  antelope.Struct.field(antelope.UInt16)
876
- ], crafter_stats.prototype, "speed", void 0);
882
+ ], crafter_lane.prototype, "speed", void 0);
877
883
  tslib.__decorate([
878
884
  antelope.Struct.field(antelope.UInt32)
879
- ], crafter_stats.prototype, "drain", void 0);
880
- crafter_stats = tslib.__decorate([
881
- antelope.Struct.type('crafter_stats')
882
- ], crafter_stats);
883
- Types.crafter_stats = crafter_stats;
885
+ ], crafter_lane.prototype, "drain", void 0);
886
+ tslib.__decorate([
887
+ antelope.Struct.field(antelope.UInt16)
888
+ ], crafter_lane.prototype, "output_pct", void 0);
889
+ crafter_lane = tslib.__decorate([
890
+ antelope.Struct.type('crafter_lane')
891
+ ], crafter_lane);
892
+ Types.crafter_lane = crafter_lane;
884
893
  let demolish = class demolish extends antelope.Struct {
885
894
  };
886
895
  tslib.__decorate([
@@ -974,51 +983,60 @@ exports.ServerTypes = void 0;
974
983
  antelope.Struct.type('warp_stats')
975
984
  ], warp_stats);
976
985
  Types.warp_stats = warp_stats;
977
- let gatherer_stats = class gatherer_stats extends antelope.Struct {
986
+ let hauler_stats = class hauler_stats extends antelope.Struct {
978
987
  };
988
+ tslib.__decorate([
989
+ antelope.Struct.field(antelope.UInt8)
990
+ ], hauler_stats.prototype, "capacity", void 0);
979
991
  tslib.__decorate([
980
992
  antelope.Struct.field(antelope.UInt16)
981
- ], gatherer_stats.prototype, "yield", void 0);
993
+ ], hauler_stats.prototype, "efficiency", void 0);
982
994
  tslib.__decorate([
983
995
  antelope.Struct.field(antelope.UInt32)
984
- ], gatherer_stats.prototype, "drain", void 0);
996
+ ], hauler_stats.prototype, "drain", void 0);
997
+ hauler_stats = tslib.__decorate([
998
+ antelope.Struct.type('hauler_stats')
999
+ ], hauler_stats);
1000
+ Types.hauler_stats = hauler_stats;
1001
+ let gatherer_lane = class gatherer_lane extends antelope.Struct {
1002
+ };
1003
+ tslib.__decorate([
1004
+ antelope.Struct.field(antelope.UInt8)
1005
+ ], gatherer_lane.prototype, "slot_index", void 0);
985
1006
  tslib.__decorate([
986
1007
  antelope.Struct.field(antelope.UInt16)
987
- ], gatherer_stats.prototype, "depth", void 0);
988
- gatherer_stats = tslib.__decorate([
989
- antelope.Struct.type('gatherer_stats')
990
- ], gatherer_stats);
991
- Types.gatherer_stats = gatherer_stats;
992
- let loader_stats = class loader_stats extends antelope.Struct {
993
- };
1008
+ ], gatherer_lane.prototype, "yield", void 0);
994
1009
  tslib.__decorate([
995
1010
  antelope.Struct.field(antelope.UInt32)
996
- ], loader_stats.prototype, "mass", void 0);
1011
+ ], gatherer_lane.prototype, "drain", void 0);
997
1012
  tslib.__decorate([
998
1013
  antelope.Struct.field(antelope.UInt16)
999
- ], loader_stats.prototype, "thrust", void 0);
1014
+ ], gatherer_lane.prototype, "depth", void 0);
1000
1015
  tslib.__decorate([
1001
- antelope.Struct.field(antelope.UInt8)
1002
- ], loader_stats.prototype, "quantity", void 0);
1003
- loader_stats = tslib.__decorate([
1004
- antelope.Struct.type('loader_stats')
1005
- ], loader_stats);
1006
- Types.loader_stats = loader_stats;
1007
- let hauler_stats = class hauler_stats extends antelope.Struct {
1016
+ antelope.Struct.field(antelope.UInt16)
1017
+ ], gatherer_lane.prototype, "output_pct", void 0);
1018
+ gatherer_lane = tslib.__decorate([
1019
+ antelope.Struct.type('gatherer_lane')
1020
+ ], gatherer_lane);
1021
+ Types.gatherer_lane = gatherer_lane;
1022
+ let loader_lane = class loader_lane extends antelope.Struct {
1008
1023
  };
1009
1024
  tslib.__decorate([
1010
1025
  antelope.Struct.field(antelope.UInt8)
1011
- ], hauler_stats.prototype, "capacity", void 0);
1026
+ ], loader_lane.prototype, "slot_index", void 0);
1027
+ tslib.__decorate([
1028
+ antelope.Struct.field(antelope.UInt32)
1029
+ ], loader_lane.prototype, "mass", void 0);
1012
1030
  tslib.__decorate([
1013
1031
  antelope.Struct.field(antelope.UInt16)
1014
- ], hauler_stats.prototype, "efficiency", void 0);
1032
+ ], loader_lane.prototype, "thrust", void 0);
1015
1033
  tslib.__decorate([
1016
- antelope.Struct.field(antelope.UInt32)
1017
- ], hauler_stats.prototype, "drain", void 0);
1018
- hauler_stats = tslib.__decorate([
1019
- antelope.Struct.type('hauler_stats')
1020
- ], hauler_stats);
1021
- Types.hauler_stats = hauler_stats;
1034
+ antelope.Struct.field(antelope.UInt16)
1035
+ ], loader_lane.prototype, "output_pct", void 0);
1036
+ loader_lane = tslib.__decorate([
1037
+ antelope.Struct.type('loader_lane')
1038
+ ], loader_lane);
1039
+ Types.loader_lane = loader_lane;
1022
1040
  let task = class task extends antelope.Struct {
1023
1041
  };
1024
1042
  tslib.__decorate([
@@ -1144,18 +1162,18 @@ exports.ServerTypes = void 0;
1144
1162
  tslib.__decorate([
1145
1163
  antelope.Struct.field(energy_stats, { optional: true })
1146
1164
  ], entity_info.prototype, "generator", void 0);
1147
- tslib.__decorate([
1148
- antelope.Struct.field(gatherer_stats, { optional: true })
1149
- ], entity_info.prototype, "gatherer", void 0);
1150
- tslib.__decorate([
1151
- antelope.Struct.field(loader_stats, { optional: true })
1152
- ], entity_info.prototype, "loaders", void 0);
1153
1165
  tslib.__decorate([
1154
1166
  antelope.Struct.field(hauler_stats, { optional: true })
1155
1167
  ], entity_info.prototype, "hauler", void 0);
1156
1168
  tslib.__decorate([
1157
- antelope.Struct.field(crafter_stats, { optional: true })
1158
- ], entity_info.prototype, "crafter", void 0);
1169
+ antelope.Struct.field(gatherer_lane, { array: true })
1170
+ ], entity_info.prototype, "gatherer_lanes", void 0);
1171
+ tslib.__decorate([
1172
+ antelope.Struct.field(crafter_lane, { array: true })
1173
+ ], entity_info.prototype, "crafter_lanes", void 0);
1174
+ tslib.__decorate([
1175
+ antelope.Struct.field(loader_lane, { array: true })
1176
+ ], entity_info.prototype, "loader_lanes", void 0);
1159
1177
  tslib.__decorate([
1160
1178
  antelope.Struct.field(lane, { array: true })
1161
1179
  ], entity_info.prototype, "lanes", void 0);
@@ -1381,6 +1399,9 @@ exports.ServerTypes = void 0;
1381
1399
  tslib.__decorate([
1382
1400
  antelope.Struct.field(antelope.UInt32)
1383
1401
  ], gather.prototype, "quantity", void 0);
1402
+ tslib.__decorate([
1403
+ antelope.Struct.field(antelope.UInt8, { optional: true })
1404
+ ], gather.prototype, "slot", void 0);
1384
1405
  gather = tslib.__decorate([
1385
1406
  antelope.Struct.type('gather')
1386
1407
  ], gather);
@@ -1412,6 +1433,24 @@ exports.ServerTypes = void 0;
1412
1433
  antelope.Struct.type('getdeposit')
1413
1434
  ], getdeposit);
1414
1435
  Types.getdeposit = getdeposit;
1436
+ let getdistance = class getdistance extends antelope.Struct {
1437
+ };
1438
+ tslib.__decorate([
1439
+ antelope.Struct.field(antelope.Int64)
1440
+ ], getdistance.prototype, "ax", void 0);
1441
+ tslib.__decorate([
1442
+ antelope.Struct.field(antelope.Int64)
1443
+ ], getdistance.prototype, "ay", void 0);
1444
+ tslib.__decorate([
1445
+ antelope.Struct.field(antelope.Int64)
1446
+ ], getdistance.prototype, "bx", void 0);
1447
+ tslib.__decorate([
1448
+ antelope.Struct.field(antelope.Int64)
1449
+ ], getdistance.prototype, "by", void 0);
1450
+ getdistance = tslib.__decorate([
1451
+ antelope.Struct.type('getdistance')
1452
+ ], getdistance);
1453
+ Types.getdistance = getdistance;
1415
1454
  let geteligible = class geteligible extends antelope.Struct {
1416
1455
  };
1417
1456
  tslib.__decorate([
@@ -1649,6 +1688,39 @@ exports.ServerTypes = void 0;
1649
1688
  antelope.Struct.type('getsummaries')
1650
1689
  ], getsummaries);
1651
1690
  Types.getsummaries = getsummaries;
1691
+ let getwormhole = class getwormhole extends antelope.Struct {
1692
+ };
1693
+ tslib.__decorate([
1694
+ antelope.Struct.field(antelope.Int64)
1695
+ ], getwormhole.prototype, "x", void 0);
1696
+ tslib.__decorate([
1697
+ antelope.Struct.field(antelope.Int64)
1698
+ ], getwormhole.prototype, "y", void 0);
1699
+ getwormhole = tslib.__decorate([
1700
+ antelope.Struct.type('getwormhole')
1701
+ ], getwormhole);
1702
+ Types.getwormhole = getwormhole;
1703
+ let grouptransit = class grouptransit extends antelope.Struct {
1704
+ };
1705
+ tslib.__decorate([
1706
+ antelope.Struct.field(entity_ref, { array: true })
1707
+ ], grouptransit.prototype, "entities", void 0);
1708
+ tslib.__decorate([
1709
+ antelope.Struct.field(antelope.Int64)
1710
+ ], grouptransit.prototype, "ax", void 0);
1711
+ tslib.__decorate([
1712
+ antelope.Struct.field(antelope.Int64)
1713
+ ], grouptransit.prototype, "ay", void 0);
1714
+ tslib.__decorate([
1715
+ antelope.Struct.field(antelope.Int64)
1716
+ ], grouptransit.prototype, "bx", void 0);
1717
+ tslib.__decorate([
1718
+ antelope.Struct.field(antelope.Int64)
1719
+ ], grouptransit.prototype, "by", void 0);
1720
+ grouptransit = tslib.__decorate([
1721
+ antelope.Struct.type('grouptransit')
1722
+ ], grouptransit);
1723
+ Types.grouptransit = grouptransit;
1652
1724
  let grouptravel = class grouptravel extends antelope.Struct {
1653
1725
  };
1654
1726
  tslib.__decorate([
@@ -2014,6 +2086,9 @@ exports.ServerTypes = void 0;
2014
2086
  tslib.__decorate([
2015
2087
  antelope.Struct.field('bool')
2016
2088
  ], location_info.prototype, "is_system", void 0);
2089
+ tslib.__decorate([
2090
+ antelope.Struct.field('bool')
2091
+ ], location_info.prototype, "is_wormhole", void 0);
2017
2092
  location_info = tslib.__decorate([
2018
2093
  antelope.Struct.type('location_info')
2019
2094
  ], location_info);
@@ -2341,18 +2416,18 @@ exports.ServerTypes = void 0;
2341
2416
  tslib.__decorate([
2342
2417
  antelope.Struct.field(energy_stats, { optional: true })
2343
2418
  ], projected_state.prototype, "generator", void 0);
2344
- tslib.__decorate([
2345
- antelope.Struct.field(gatherer_stats, { optional: true })
2346
- ], projected_state.prototype, "gatherer", void 0);
2347
- tslib.__decorate([
2348
- antelope.Struct.field(loader_stats, { optional: true })
2349
- ], projected_state.prototype, "loaders", void 0);
2350
2419
  tslib.__decorate([
2351
2420
  antelope.Struct.field(hauler_stats, { optional: true })
2352
2421
  ], projected_state.prototype, "hauler", void 0);
2353
2422
  tslib.__decorate([
2354
- antelope.Struct.field(crafter_stats, { optional: true })
2355
- ], projected_state.prototype, "crafter", void 0);
2423
+ antelope.Struct.field(gatherer_lane, { array: true })
2424
+ ], projected_state.prototype, "gatherer_lanes", void 0);
2425
+ tslib.__decorate([
2426
+ antelope.Struct.field(crafter_lane, { array: true })
2427
+ ], projected_state.prototype, "crafter_lanes", void 0);
2428
+ tslib.__decorate([
2429
+ antelope.Struct.field(loader_lane, { array: true })
2430
+ ], projected_state.prototype, "loader_lanes", void 0);
2356
2431
  projected_state = tslib.__decorate([
2357
2432
  antelope.Struct.type('projected_state')
2358
2433
  ], projected_state);
@@ -2552,6 +2627,21 @@ exports.ServerTypes = void 0;
2552
2627
  antelope.Struct.type('rmnftcfg')
2553
2628
  ], rmnftcfg);
2554
2629
  Types.rmnftcfg = rmnftcfg;
2630
+ let setcoords = class setcoords extends antelope.Struct {
2631
+ };
2632
+ tslib.__decorate([
2633
+ antelope.Struct.field(antelope.UInt64)
2634
+ ], setcoords.prototype, "entity_id", void 0);
2635
+ tslib.__decorate([
2636
+ antelope.Struct.field(antelope.Int64)
2637
+ ], setcoords.prototype, "x", void 0);
2638
+ tslib.__decorate([
2639
+ antelope.Struct.field(antelope.Int64)
2640
+ ], setcoords.prototype, "y", void 0);
2641
+ setcoords = tslib.__decorate([
2642
+ antelope.Struct.type('setcoords')
2643
+ ], setcoords);
2644
+ Types.setcoords = setcoords;
2555
2645
  let setnftcfg = class setnftcfg extends antelope.Struct {
2556
2646
  };
2557
2647
  tslib.__decorate([
@@ -2711,6 +2801,27 @@ exports.ServerTypes = void 0;
2711
2801
  antelope.Struct.type('task_results')
2712
2802
  ], task_results);
2713
2803
  Types.task_results = task_results;
2804
+ let transit = class transit extends antelope.Struct {
2805
+ };
2806
+ tslib.__decorate([
2807
+ antelope.Struct.field(antelope.UInt64)
2808
+ ], transit.prototype, "id", void 0);
2809
+ tslib.__decorate([
2810
+ antelope.Struct.field(antelope.Int64)
2811
+ ], transit.prototype, "ax", void 0);
2812
+ tslib.__decorate([
2813
+ antelope.Struct.field(antelope.Int64)
2814
+ ], transit.prototype, "ay", void 0);
2815
+ tslib.__decorate([
2816
+ antelope.Struct.field(antelope.Int64)
2817
+ ], transit.prototype, "bx", void 0);
2818
+ tslib.__decorate([
2819
+ antelope.Struct.field(antelope.Int64)
2820
+ ], transit.prototype, "by", void 0);
2821
+ transit = tslib.__decorate([
2822
+ antelope.Struct.type('transit')
2823
+ ], transit);
2824
+ Types.transit = transit;
2714
2825
  let travel = class travel extends antelope.Struct {
2715
2826
  };
2716
2827
  tslib.__decorate([
@@ -2798,6 +2909,21 @@ exports.ServerTypes = void 0;
2798
2909
  antelope.Struct.type('wipe')
2799
2910
  ], wipe);
2800
2911
  Types.wipe = wipe;
2912
+ let wormhole_info = class wormhole_info extends antelope.Struct {
2913
+ };
2914
+ tslib.__decorate([
2915
+ antelope.Struct.field(coordinates)
2916
+ ], wormhole_info.prototype, "coords", void 0);
2917
+ tslib.__decorate([
2918
+ antelope.Struct.field('bool')
2919
+ ], wormhole_info.prototype, "is_wormhole", void 0);
2920
+ tslib.__decorate([
2921
+ antelope.Struct.field(coordinates)
2922
+ ], wormhole_info.prototype, "destination", void 0);
2923
+ wormhole_info = tslib.__decorate([
2924
+ antelope.Struct.type('wormhole_info')
2925
+ ], wormhole_info);
2926
+ Types.wormhole_info = wormhole_info;
2801
2927
  let wrapconfig_row = class wrapconfig_row extends antelope.Struct {
2802
2928
  };
2803
2929
  tslib.__decorate([
@@ -2925,6 +3051,8 @@ const GROUP_NOT_FOUND = 'Entity group not found.';
2925
3051
  const GROUP_DUPLICATE_ENTITY = 'Duplicate entity in group.';
2926
3052
  const GROUP_HAUL_CAPACITY_EXCEEDED = 'Group travel requires sufficient hauler capacity for all non-self-propelled entities.';
2927
3053
  const CANCEL_CONTAINS_GROUPED_TASK = 'Cannot cancel range containing grouped task - cancel non-grouped tasks first.';
3054
+ const WOULD_STRAND = 'Cancelling this would leave a later task without the cargo it needs.';
3055
+ const WOULD_OVERFILL = 'Cancelling this would overfill the other entity with returned cargo.';
2928
3056
  const WARP_NO_CAPABILITY = 'Entity does not have warp capability.';
2929
3057
  const WARP_HAS_SCHEDULE = 'Entity must be idle to warp.';
2930
3058
  const WARP_HAS_CARGO = 'Entity must have no cargo to warp.';
@@ -2979,6 +3107,7 @@ exports.TaskType = void 0;
2979
3107
  TaskType[TaskType["WARP"] = 6] = "WARP";
2980
3108
  TaskType[TaskType["CRAFT"] = 7] = "CRAFT";
2981
3109
  TaskType[TaskType["DEPLOY"] = 8] = "DEPLOY";
3110
+ TaskType[TaskType["TRANSIT"] = 9] = "TRANSIT";
2982
3111
  TaskType[TaskType["UNWRAP"] = 10] = "UNWRAP";
2983
3112
  TaskType[TaskType["UNDEPLOY"] = 11] = "UNDEPLOY";
2984
3113
  TaskType[TaskType["DEMOLISH"] = 13] = "DEMOLISH";
@@ -3803,15 +3932,15 @@ var recipes = [
3803
3932
  },
3804
3933
  {
3805
3934
  outputItemId: 10200,
3806
- outputMass: 1300000,
3935
+ outputMass: 1900000,
3807
3936
  inputs: [
3808
3937
  {
3809
3938
  itemId: 10001,
3810
3939
  quantity: 600
3811
3940
  },
3812
3941
  {
3813
- itemId: 10002,
3814
- quantity: 200
3942
+ itemId: 10008,
3943
+ quantity: 600
3815
3944
  }
3816
3945
  ],
3817
3946
  statSlots: [
@@ -3853,15 +3982,27 @@ var recipes = [
3853
3982
  },
3854
3983
  {
3855
3984
  outputItemId: 10201,
3856
- outputMass: 1900000,
3985
+ outputMass: 2400000,
3857
3986
  inputs: [
3858
3987
  {
3859
3988
  itemId: 10001,
3860
- quantity: 800
3989
+ quantity: 300
3861
3990
  },
3862
3991
  {
3863
- itemId: 10002,
3864
- quantity: 400
3992
+ itemId: 10008,
3993
+ quantity: 300
3994
+ },
3995
+ {
3996
+ itemId: 10007,
3997
+ quantity: 300
3998
+ },
3999
+ {
4000
+ itemId: 10003,
4001
+ quantity: 300
4002
+ },
4003
+ {
4004
+ itemId: 10006,
4005
+ quantity: 300
3865
4006
  }
3866
4007
  ],
3867
4008
  statSlots: [
@@ -3883,18 +4024,10 @@ var recipes = [
3883
4024
  },
3884
4025
  {
3885
4026
  sources: [
3886
- {
3887
- inputIndex: 1,
3888
- statIndex: 0
3889
- }
3890
4027
  ]
3891
4028
  },
3892
4029
  {
3893
4030
  sources: [
3894
- {
3895
- inputIndex: 1,
3896
- statIndex: 1
3897
- }
3898
4031
  ]
3899
4032
  }
3900
4033
  ],
@@ -3903,14 +4036,14 @@ var recipes = [
3903
4036
  },
3904
4037
  {
3905
4038
  outputItemId: 10202,
3906
- outputMass: 4800000,
4039
+ outputMass: 3200000,
3907
4040
  inputs: [
3908
4041
  {
3909
4042
  itemId: 10001,
3910
- quantity: 2000
4043
+ quantity: 1000
3911
4044
  },
3912
4045
  {
3913
- itemId: 10002,
4046
+ itemId: 10008,
3914
4047
  quantity: 1000
3915
4048
  }
3916
4049
  ],
@@ -3953,24 +4086,20 @@ var recipes = [
3953
4086
  },
3954
4087
  {
3955
4088
  outputItemId: 10203,
3956
- outputMass: 3700000,
4089
+ outputMass: 1900000,
3957
4090
  inputs: [
3958
4091
  {
3959
- itemId: 10001,
3960
- quantity: 1500
4092
+ itemId: 10008,
4093
+ quantity: 600
3961
4094
  },
3962
4095
  {
3963
- itemId: 10002,
3964
- quantity: 800
4096
+ itemId: 10006,
4097
+ quantity: 600
3965
4098
  }
3966
4099
  ],
3967
4100
  statSlots: [
3968
4101
  {
3969
4102
  sources: [
3970
- {
3971
- inputIndex: 0,
3972
- statIndex: 0
3973
- }
3974
4103
  ]
3975
4104
  },
3976
4105
  {
@@ -3984,17 +4113,13 @@ var recipes = [
3984
4113
  {
3985
4114
  sources: [
3986
4115
  {
3987
- inputIndex: 1,
4116
+ inputIndex: 0,
3988
4117
  statIndex: 0
3989
4118
  }
3990
4119
  ]
3991
4120
  },
3992
4121
  {
3993
4122
  sources: [
3994
- {
3995
- inputIndex: 1,
3996
- statIndex: 1
3997
- }
3998
4123
  ]
3999
4124
  }
4000
4125
  ],
@@ -4003,32 +4128,20 @@ var recipes = [
4003
4128
  },
4004
4129
  {
4005
4130
  outputItemId: 10204,
4006
- outputMass: 4600000,
4131
+ outputMass: 1900000,
4007
4132
  inputs: [
4008
- {
4009
- itemId: 10001,
4010
- quantity: 1500
4011
- },
4012
- {
4013
- itemId: 10002,
4014
- quantity: 600
4015
- },
4016
4133
  {
4017
4134
  itemId: 10008,
4018
- quantity: 400
4135
+ quantity: 600
4019
4136
  },
4020
4137
  {
4021
- itemId: 10009,
4022
- quantity: 400
4138
+ itemId: 10007,
4139
+ quantity: 600
4023
4140
  }
4024
4141
  ],
4025
4142
  statSlots: [
4026
4143
  {
4027
4144
  sources: [
4028
- {
4029
- inputIndex: 0,
4030
- statIndex: 0
4031
- }
4032
4145
  ]
4033
4146
  },
4034
4147
  {
@@ -4042,17 +4155,13 @@ var recipes = [
4042
4155
  {
4043
4156
  sources: [
4044
4157
  {
4045
- inputIndex: 1,
4158
+ inputIndex: 0,
4046
4159
  statIndex: 0
4047
4160
  }
4048
4161
  ]
4049
4162
  },
4050
4163
  {
4051
4164
  sources: [
4052
- {
4053
- inputIndex: 1,
4054
- statIndex: 1
4055
- }
4056
4165
  ]
4057
4166
  }
4058
4167
  ],
@@ -4265,11 +4374,11 @@ var entities = [
4265
4374
  slots: [
4266
4375
  {
4267
4376
  type: "generator",
4268
- outputPct: 100
4377
+ outputPct: 200
4269
4378
  },
4270
4379
  {
4271
4380
  type: "gatherer",
4272
- outputPct: 100
4381
+ outputPct: 200
4273
4382
  }
4274
4383
  ]
4275
4384
  },
@@ -4278,11 +4387,11 @@ var entities = [
4278
4387
  slots: [
4279
4388
  {
4280
4389
  type: "generator",
4281
- outputPct: 100
4390
+ outputPct: 200
4282
4391
  },
4283
4392
  {
4284
4393
  type: "crafter",
4285
- outputPct: 100
4394
+ outputPct: 200
4286
4395
  }
4287
4396
  ]
4288
4397
  },
@@ -4809,31 +4918,31 @@ var items = [
4809
4918
  },
4810
4919
  {
4811
4920
  id: 10200,
4812
- mass: 1300000,
4921
+ mass: 1900000,
4813
4922
  type: "entity",
4814
4923
  tier: 1
4815
4924
  },
4816
4925
  {
4817
4926
  id: 10201,
4818
- mass: 1900000,
4927
+ mass: 2400000,
4819
4928
  type: "entity",
4820
4929
  tier: 1
4821
4930
  },
4822
4931
  {
4823
4932
  id: 10202,
4824
- mass: 4800000,
4933
+ mass: 3200000,
4825
4934
  type: "entity",
4826
4935
  tier: 1
4827
4936
  },
4828
4937
  {
4829
4938
  id: 10203,
4830
- mass: 3700000,
4939
+ mass: 1900000,
4831
4940
  type: "entity",
4832
4941
  tier: 1
4833
4942
  },
4834
4943
  {
4835
4944
  id: 10204,
4836
- mass: 4600000,
4945
+ mass: 1900000,
4837
4946
  type: "entity",
4838
4947
  tier: 1
4839
4948
  },
@@ -5392,6 +5501,102 @@ function deriveLocationSize(loc) {
5392
5501
  return Math.floor(LOCATION_MIN_DEPTH + curved * range);
5393
5502
  }
5394
5503
 
5504
+ const WH = {
5505
+ RSIZE: 75,
5506
+ ZONE: 16384,
5507
+ THRESHOLD: 8192,
5508
+ MIN_REACH: 50000,
5509
+ TRANSIT_SPEED: 500,
5510
+ };
5511
+ const HALF = Math.round(Math.log2(WH.ZONE));
5512
+ const MASK = WH.ZONE - 1;
5513
+ function roll16(seed, str) {
5514
+ const h = hash512(seed, str).array;
5515
+ return (h[0] << 8) | h[1];
5516
+ }
5517
+ function feistelF(seed, x, round, key) {
5518
+ return roll16(seed, `feistel-${key}-${round}-${x}`) & MASK;
5519
+ }
5520
+ function feistel(seed, idx, key) {
5521
+ let L = (idx >>> HALF) & MASK;
5522
+ let R = idx & MASK;
5523
+ for (let r = 0; r < 4; r++) {
5524
+ const nR = L ^ feistelF(seed, R, r, key);
5525
+ L = R;
5526
+ R = nR;
5527
+ }
5528
+ return (L << HALF) | R;
5529
+ }
5530
+ function feistelInv(seed, idx, key) {
5531
+ let L = (idx >>> HALF) & MASK;
5532
+ let R = idx & MASK;
5533
+ for (let r = 3; r >= 0; r--) {
5534
+ const nL = R ^ feistelF(seed, L, r, key);
5535
+ R = L;
5536
+ L = nL;
5537
+ }
5538
+ return (L << HALF) | R;
5539
+ }
5540
+ function regionOf(x, y) {
5541
+ return { rx: Math.floor(x / WH.RSIZE), ry: Math.floor(y / WH.RSIZE) };
5542
+ }
5543
+ function partnerRegion(seed, R) {
5544
+ const qx = Math.floor(R.rx / WH.ZONE);
5545
+ const qy = Math.floor(R.ry / WH.ZONE);
5546
+ const zx = qx * WH.ZONE;
5547
+ const zy = qy * WH.ZONE;
5548
+ const key = `${qx}:${qy}`;
5549
+ const idx = (R.ry - zy) * WH.ZONE + (R.rx - zx);
5550
+ const p = feistelInv(seed, feistel(seed, idx, key) ^ 1, key);
5551
+ return { rx: zx + (p % WH.ZONE), ry: zy + Math.floor(p / WH.ZONE) };
5552
+ }
5553
+ function regKey(R) {
5554
+ return `${R.rx}:${R.ry}`;
5555
+ }
5556
+ function pairKey(a, b) {
5557
+ const ka = regKey(a);
5558
+ const kb = regKey(b);
5559
+ return ka < kb ? `${ka}|${kb}` : `${kb}|${ka}`;
5560
+ }
5561
+ function endpointInRegion(seed, R, key) {
5562
+ const h = hash512(seed, `wh-endpoint-${key}-${regKey(R)}`).array;
5563
+ const ox = ((h[0] << 24) | (h[1] << 16) | (h[2] << 8) | h[3]) >>> 0;
5564
+ const oy = ((h[4] << 24) | (h[5] << 16) | (h[6] << 8) | h[7]) >>> 0;
5565
+ return { x: R.rx * WH.RSIZE + (ox % WH.RSIZE), y: R.ry * WH.RSIZE + (oy % WH.RSIZE) };
5566
+ }
5567
+ function dist(a, b) {
5568
+ return Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);
5569
+ }
5570
+ function wormholeOfRegion(seed, R) {
5571
+ const P = partnerRegion(seed, R);
5572
+ if (P.rx === R.rx && P.ry === R.ry)
5573
+ return null;
5574
+ const key = pairKey(R, P);
5575
+ if (roll16(seed, `wh-exists-${key}`) >= WH.THRESHOLD)
5576
+ return null;
5577
+ const A = endpointInRegion(seed, R, key);
5578
+ const B = endpointInRegion(seed, P, key);
5579
+ if (dist(A, B) < WH.MIN_REACH)
5580
+ return null;
5581
+ return { A, B };
5582
+ }
5583
+ function wormholeAtRegionEndpoint(seed, rx, ry) {
5584
+ const w = wormholeOfRegion(seed, { rx, ry });
5585
+ if (!w)
5586
+ return null;
5587
+ return { from: w.A, to: w.B };
5588
+ }
5589
+ function wormholeAt(seed, x, y) {
5590
+ const w = wormholeOfRegion(seed, regionOf(x, y));
5591
+ if (!w || w.A.x !== x || w.A.y !== y)
5592
+ return null;
5593
+ return w.B;
5594
+ }
5595
+ function isValidWormholePair(seed, ax, ay, bx, by) {
5596
+ const to = wormholeAt(seed, ax, ay);
5597
+ return to !== null && to.x === bx && to.y === by;
5598
+ }
5599
+
5395
5600
  var syllables = [
5396
5601
  "A",
5397
5602
  "Ab",
@@ -7637,6 +7842,13 @@ function getSystemName(gameSeed, location) {
7637
7842
  function hasSystem(gameSeed, coordinates) {
7638
7843
  return getLocationType(gameSeed, coordinates) !== exports.LocationType.EMPTY;
7639
7844
  }
7845
+ function getLocationKind(gameSeed, x, y) {
7846
+ if (wormholeAt(gameSeed, x, y))
7847
+ return 'wormhole';
7848
+ if (hasSystem(gameSeed, { x, y }))
7849
+ return 'system';
7850
+ return 'empty';
7851
+ }
7640
7852
  function deriveLocationStatic(gameSeed, coordinates) {
7641
7853
  const seed = antelope.Checksum256.from(gameSeed);
7642
7854
  const coords = Coordinates.from(coordinates);
@@ -8338,7 +8550,10 @@ function entityDoesTaskType(entity, taskType, now) {
8338
8550
  }
8339
8551
  function isInFlight(entity, now) {
8340
8552
  const lane = mobilityLane(entity);
8341
- return lane ? currentTaskType(lane.schedule, now) === exports.TaskType.TRAVEL : false;
8553
+ if (!lane)
8554
+ return false;
8555
+ const t = currentTaskType(lane.schedule, now);
8556
+ return t === exports.TaskType.TRAVEL || t === exports.TaskType.TRANSIT;
8342
8557
  }
8343
8558
  function isRecharging(entity, now) {
8344
8559
  return entityDoesTaskType(entity, exports.TaskType.RECHARGE, now);
@@ -8398,6 +8613,9 @@ var schedule = /*#__PURE__*/Object.freeze({
8398
8613
  currentTaskProgressFloatForLane: currentTaskProgressFloatForLane
8399
8614
  });
8400
8615
 
8616
+ function isPositionalTask(task) {
8617
+ return task.type.equals(exports.TaskType.TRAVEL) || task.type.equals(exports.TaskType.TRANSIT);
8618
+ }
8401
8619
  function calc_orbital_altitude(mass) {
8402
8620
  if (mass <= BASE_ORBITAL_MASS) {
8403
8621
  return MIN_ORBITAL_ALTITUDE;
@@ -8451,7 +8669,7 @@ function getInterpolatedPosition(entity, taskIndex, taskProgress) {
8451
8669
  return { x: Number(settled.x), y: Number(settled.y) };
8452
8670
  }
8453
8671
  const task = tasks[taskIndex];
8454
- if (!task.type.equals(exports.TaskType.TRAVEL) || !task.coordinates) {
8672
+ if (!isPositionalTask(task) || !task.coordinates) {
8455
8673
  const origin = getFlightOrigin(entity, taskIndex);
8456
8674
  return { x: Number(origin.x), y: Number(origin.y) };
8457
8675
  }
@@ -8498,14 +8716,29 @@ function calc_ship_rechargetime(ship) {
8498
8716
  function calc_flighttime(distance, acceleration) {
8499
8717
  return antelope.UInt32.from(2 * Math.sqrt(Number(distance) / acceleration));
8500
8718
  }
8719
+ function calc_transit_duration(ax, ay, bx, by) {
8720
+ const distance = distanceBetweenPoints(ax, ay, bx, by);
8721
+ return antelope.UInt32.from(Math.floor(distance.toNumber() / (PRECISION$1 * WH.TRANSIT_SPEED)));
8722
+ }
8723
+ function shipLoaderLane(ship) {
8724
+ const lanes = ship.loader_lanes ?? [];
8725
+ if (lanes.length === 0)
8726
+ return undefined;
8727
+ let lowest = lanes[0];
8728
+ for (const lane of lanes) {
8729
+ if (Number(lane.slot_index) < Number(lowest.slot_index))
8730
+ lowest = lane;
8731
+ }
8732
+ return { thrust: Number(lowest.thrust), mass: Number(lowest.mass) };
8733
+ }
8501
8734
  function calc_loader_flighttime(ship, mass, altitude) {
8502
8735
  const z = altitude ?? ship.coordinates.z?.toNumber() ?? calc_orbital_altitude(Number(mass));
8503
8736
  return calc_flighttime(z, calc_loader_acceleration(ship, mass));
8504
8737
  }
8505
8738
  function calc_loader_acceleration(ship, mass) {
8506
- const thrust = ship.loaders ? Number(ship.loaders.thrust) : 0;
8507
- const loaderMass = ship.loaders ? Number(ship.loaders.mass) : 0;
8508
- return calc_acceleration(thrust, Number(mass) + loaderMass);
8739
+ const lane = shipLoaderLane(ship);
8740
+ const thrust = lane ? lane.thrust : 0;
8741
+ return calc_acceleration(thrust, Number(mass));
8509
8742
  }
8510
8743
  function calc_ship_flighttime(ship, mass, distance) {
8511
8744
  const acceleration = calc_ship_acceleration(ship, mass);
@@ -8521,8 +8754,10 @@ function calc_acceleration(thrust, mass) {
8521
8754
  function calc_ship_mass(ship, cargos) {
8522
8755
  const mass = antelope.UInt64.from(0);
8523
8756
  mass.add(ship.hullmass);
8524
- if (ship.loaders && ship.loaders.quantity.gt(antelope.UInt32.zero)) {
8525
- mass.add(ship.loaders.mass.multiplying(ship.loaders.quantity));
8757
+ if (ship.loader_lanes && ship.loader_lanes.length > 0) {
8758
+ for (const l of ship.loader_lanes) {
8759
+ mass.add(antelope.UInt64.from(l.mass));
8760
+ }
8526
8761
  }
8527
8762
  for (const cargo of cargos) {
8528
8763
  const cargoMass = getItem(cargo.item_id).mass * Number(antelope.UInt32.from(cargo.quantity));
@@ -8546,11 +8781,11 @@ function calculateTransferTime(ship, cargos, quantities) {
8546
8781
  if (mass.equals(antelope.UInt64.zero)) {
8547
8782
  return antelope.UInt32.from(0);
8548
8783
  }
8549
- if (!ship.loaders)
8784
+ const lane = shipLoaderLane(ship);
8785
+ if (!lane)
8550
8786
  return antelope.UInt32.from(0);
8551
- mass = antelope.UInt64.from(mass).adding(ship.loaders.mass);
8552
- const transfer_time = calc_loader_flighttime(ship, mass);
8553
- return transfer_time.dividing(ship.loaders.quantity);
8787
+ mass = antelope.UInt64.from(mass).adding(antelope.UInt64.from(lane.mass));
8788
+ return calc_loader_flighttime(ship, mass);
8554
8789
  }
8555
8790
  function calculateRefuelingTime(ship) {
8556
8791
  return calc_ship_rechargetime(ship);
@@ -8580,22 +8815,19 @@ function calculateLoadTimeBreakdown(ship, cargos, loadQuantities, unloadQuantiti
8580
8815
  }
8581
8816
  let unloadTime = 0;
8582
8817
  let loadTime = 0;
8583
- if (mass_unload.gt(antelope.UInt64.zero) && ship.loaders) {
8584
- const totalMass = antelope.UInt64.from(mass_unload).adding(ship.loaders.mass);
8818
+ const lane = shipLoaderLane(ship);
8819
+ if (mass_unload.gt(antelope.UInt64.zero) && lane) {
8820
+ const totalMass = antelope.UInt64.from(mass_unload).adding(antelope.UInt64.from(lane.mass));
8585
8821
  unloadTime = Number(calc_loader_flighttime(ship, totalMass));
8586
8822
  }
8587
- if (mass_load.gt(antelope.UInt64.zero) && ship.loaders) {
8588
- const totalMass = antelope.UInt64.from(mass_load).adding(ship.loaders.mass);
8823
+ if (mass_load.gt(antelope.UInt64.zero) && lane) {
8824
+ const totalMass = antelope.UInt64.from(mass_load).adding(antelope.UInt64.from(lane.mass));
8589
8825
  loadTime = Number(calc_loader_flighttime(ship, totalMass));
8590
8826
  }
8591
- const numLoaders = ship.loaders ? Number(ship.loaders.quantity) : 0;
8592
- const totalTime = numLoaders > 0 ? (unloadTime + loadTime) / numLoaders : 0;
8593
- const unloadTimePerLoader = numLoaders > 0 ? unloadTime / numLoaders : 0;
8594
- const loadTimePerLoader = numLoaders > 0 ? loadTime / numLoaders : 0;
8595
8827
  return {
8596
- unloadTime: unloadTimePerLoader,
8597
- loadTime: loadTimePerLoader,
8598
- totalTime,
8828
+ unloadTime,
8829
+ loadTime,
8830
+ totalTime: unloadTime + loadTime,
8599
8831
  unloadMass: Number(mass_unload),
8600
8832
  loadMass: Number(mass_load),
8601
8833
  };
@@ -8606,19 +8838,14 @@ function estimateTravelTime(ship, travelMass, distance, options = {}) {
8606
8838
  const rechargeTime = needsRecharge ? calc_ship_rechargetime(ship) : antelope.UInt32.zero;
8607
8839
  let loadTime = antelope.UInt32.zero;
8608
8840
  let unloadTime = antelope.UInt32.zero;
8609
- if (loadMass &&
8610
- antelope.UInt32.from(loadMass).gt(antelope.UInt32.zero) &&
8611
- ship.loaders &&
8612
- ship.loaders.quantity.gt(antelope.UInt32.zero)) {
8613
- const totalMass = antelope.UInt64.from(loadMass).adding(ship.loaders.mass);
8614
- loadTime = calc_loader_flighttime(ship, totalMass).dividing(ship.loaders.quantity);
8615
- }
8616
- if (unloadMass &&
8617
- antelope.UInt32.from(unloadMass).gt(antelope.UInt32.zero) &&
8618
- ship.loaders &&
8619
- ship.loaders.quantity.gt(antelope.UInt32.zero)) {
8620
- const totalMass = antelope.UInt64.from(unloadMass).adding(ship.loaders.mass);
8621
- unloadTime = calc_loader_flighttime(ship, totalMass).dividing(ship.loaders.quantity);
8841
+ const lane = shipLoaderLane(ship);
8842
+ if (loadMass && antelope.UInt32.from(loadMass).gt(antelope.UInt32.zero) && lane) {
8843
+ const totalMass = antelope.UInt64.from(loadMass).adding(antelope.UInt64.from(lane.mass));
8844
+ loadTime = calc_loader_flighttime(ship, totalMass);
8845
+ }
8846
+ if (unloadMass && antelope.UInt32.from(unloadMass).gt(antelope.UInt32.zero) && lane) {
8847
+ const totalMass = antelope.UInt64.from(unloadMass).adding(antelope.UInt64.from(lane.mass));
8848
+ unloadTime = calc_loader_flighttime(ship, totalMass);
8622
8849
  }
8623
8850
  return {
8624
8851
  flightTime,
@@ -8642,6 +8869,22 @@ function hasEnergyForDistance(ship, distance) {
8642
8869
  const energyNeeded = antelope.UInt64.from(distance).dividing(PRECISION$1).multiplying(ship.engines.drain);
8643
8870
  return antelope.UInt64.from(ship.energy ?? 0).gte(energyNeeded);
8644
8871
  }
8872
+ function toNum$1(v) {
8873
+ if (v === undefined)
8874
+ return 0;
8875
+ return typeof v === 'number' ? v : v.toNumber();
8876
+ }
8877
+ function chosenLoaderLane(entity) {
8878
+ const lanes = entity.loaderLanes ?? [];
8879
+ if (lanes.length === 0)
8880
+ return undefined;
8881
+ let lowest = lanes[0];
8882
+ for (const lane of lanes) {
8883
+ if (toNum$1(lane.slot_index) < toNum$1(lowest.slot_index))
8884
+ lowest = lane;
8885
+ }
8886
+ return lowest;
8887
+ }
8645
8888
  function mobilityTasks(entity) {
8646
8889
  return mobilityLane(entity)?.schedule.tasks ?? [];
8647
8890
  }
@@ -8650,7 +8893,7 @@ function getFlightOrigin(entity, flightTaskIndex) {
8650
8893
  let origin = entity.coordinates;
8651
8894
  for (let i = 0; i < flightTaskIndex && i < tasks.length; i++) {
8652
8895
  const task = tasks[i];
8653
- if (task.type.equals(exports.TaskType.TRAVEL) && task.coordinates) {
8896
+ if (isPositionalTask(task) && task.coordinates) {
8654
8897
  origin = task.coordinates;
8655
8898
  }
8656
8899
  }
@@ -8660,7 +8903,7 @@ function getDestinationLocation(entity) {
8660
8903
  const tasks = mobilityTasks(entity);
8661
8904
  for (let i = tasks.length - 1; i >= 0; i--) {
8662
8905
  const task = tasks[i];
8663
- if (task.type.equals(exports.TaskType.TRAVEL) && task.coordinates) {
8906
+ if (isPositionalTask(task) && task.coordinates) {
8664
8907
  return task.coordinates;
8665
8908
  }
8666
8909
  }
@@ -8675,7 +8918,7 @@ function getPositionAt(entity, taskIndex, taskProgress) {
8675
8918
  return getFlightOrigin(entity, tasks.length);
8676
8919
  }
8677
8920
  const task = tasks[taskIndex];
8678
- if (!task.type.equals(exports.TaskType.TRAVEL) || !task.coordinates) {
8921
+ if (!isPositionalTask(task) || !task.coordinates) {
8679
8922
  return getFlightOrigin(entity, taskIndex);
8680
8923
  }
8681
8924
  const origin = getFlightOrigin(entity, taskIndex);
@@ -8691,53 +8934,28 @@ function minTransferDistance(entityClass) {
8691
8934
  ? MIN_TRANSFER_DISTANCE_ORBITAL_VESSEL
8692
8935
  : MIN_TRANSFER_DISTANCE_PLANETARY_STRUCTURE;
8693
8936
  }
8694
- function calc_transfer_duration(source, dest, cargoMass) {
8695
- if (cargoMass === 0) {
8937
+ function calc_onesided_duration(loaderThrust, loaderMass, activeZ, counterpartZ, activeEntityClass, counterpartEntityClass, cargoMass) {
8938
+ if (cargoMass === 0 || loaderThrust === 0) {
8696
8939
  return 0;
8697
8940
  }
8698
- let totalThrust = 0;
8699
- let totalLoaderMass = 0;
8700
- let totalQuantity = 0;
8701
- if (source.loaders) {
8702
- const thrust = typeof source.loaders.thrust === 'number'
8703
- ? source.loaders.thrust
8704
- : source.loaders.thrust.toNumber();
8705
- const mass = typeof source.loaders.mass === 'number'
8706
- ? source.loaders.mass
8707
- : source.loaders.mass.toNumber();
8708
- const qty = typeof source.loaders.quantity === 'number'
8709
- ? source.loaders.quantity
8710
- : source.loaders.quantity.toNumber();
8711
- totalThrust += thrust * qty;
8712
- totalLoaderMass += mass * qty;
8713
- totalQuantity += qty;
8714
- }
8715
- if (dest.loaders) {
8716
- const thrust = typeof dest.loaders.thrust === 'number'
8717
- ? dest.loaders.thrust
8718
- : dest.loaders.thrust.toNumber();
8719
- const mass = typeof dest.loaders.mass === 'number' ? dest.loaders.mass : dest.loaders.mass.toNumber();
8720
- const qty = typeof dest.loaders.quantity === 'number'
8721
- ? dest.loaders.quantity
8722
- : dest.loaders.quantity.toNumber();
8723
- totalThrust += thrust * qty;
8724
- totalLoaderMass += mass * qty;
8725
- totalQuantity += qty;
8726
- }
8727
- if (totalThrust === 0 || totalQuantity === 0) {
8941
+ const rawDistance = Math.abs(activeZ - counterpartZ);
8942
+ const minDistance = Math.max(minTransferDistance(activeEntityClass), minTransferDistance(counterpartEntityClass));
8943
+ const distance = rawDistance < minDistance ? minDistance : rawDistance;
8944
+ const totalMass = cargoMass + loaderMass;
8945
+ const acceleration = calc_acceleration(loaderThrust, totalMass);
8946
+ const flightTime = Math.floor(2 * Math.sqrt(distance / acceleration));
8947
+ return flightTime === 0 ? 1 : flightTime;
8948
+ }
8949
+ function calc_transfer_duration(source, dest, cargoMass) {
8950
+ const active = chosenLoaderLane(source) ? source : dest;
8951
+ const counterpart = active === source ? dest : source;
8952
+ const lane = chosenLoaderLane(active);
8953
+ if (!lane) {
8728
8954
  return 0;
8729
8955
  }
8730
- const sourceZ = typeof source.location.z === 'number'
8731
- ? source.location.z
8732
- : (source.location.z?.toNumber() ?? 0);
8733
- const destZ = typeof dest.location.z === 'number' ? dest.location.z : (dest.location.z?.toNumber() ?? 0);
8734
- const rawDistance = Math.abs(sourceZ - destZ);
8735
- const minDistance = Math.max(minTransferDistance(source.entityClass), minTransferDistance(dest.entityClass));
8736
- const distance = rawDistance < minDistance ? minDistance : rawDistance;
8737
- const totalMass = cargoMass + totalLoaderMass;
8738
- const acceleration = calc_acceleration(totalThrust, totalMass);
8739
- const flightTime = 2 * Math.sqrt(distance / acceleration);
8740
- return Math.floor(flightTime / totalQuantity);
8956
+ const activeZ = toNum$1(active.location.z);
8957
+ const counterpartZ = toNum$1(counterpart.location.z);
8958
+ return calc_onesided_duration(toNum$1(lane.thrust), toNum$1(lane.mass), activeZ, counterpartZ, active.entityClass, counterpart.entityClass, cargoMass);
8741
8959
  }
8742
8960
 
8743
8961
  class Location {
@@ -9624,6 +9842,311 @@ class LocationsManager extends BaseManager {
9624
9842
  }
9625
9843
  }
9626
9844
 
9845
+ const COORD_MIN = -2147483648;
9846
+ const COORD_MAX = 2147483647;
9847
+ const COORD_OFFSET = 2147485000;
9848
+ const SECTOR_DIV = 100000000;
9849
+ const REGION_DIV = 10000;
9850
+ const SECTORS_PER_AXIS = 43;
9851
+ const REGION_PER_AXIS = 10000;
9852
+ const LOCAL_HALF = 5000;
9853
+ const LOCAL_MIN = -5000;
9854
+ const LOCAL_MAX = 4999;
9855
+ const SECTOR_COUNT = SECTORS_PER_AXIS * SECTORS_PER_AXIS;
9856
+ const REGION_COUNT = REGION_PER_AXIS * REGION_PER_AXIS;
9857
+ const SECTOR_FEISTEL = { n: SECTOR_COUNT, halfBits: 6, label: 'sector' };
9858
+ const REGION_FEISTEL = { n: REGION_COUNT, halfBits: 14, label: 'region' };
9859
+
9860
+ const ROUNDS = 4;
9861
+ const keyCache = new Map();
9862
+ function deriveRoundKeys(seed, label) {
9863
+ const cacheKey = `${seed}:${label}`;
9864
+ const cached = keyCache.get(cacheKey);
9865
+ if (cached)
9866
+ return cached;
9867
+ const h = hash512(seed, `coord-keys-${label}`).array;
9868
+ const keys = [];
9869
+ for (let i = 0; i < ROUNDS; i++) {
9870
+ const o = i * 4;
9871
+ keys.push(((h[o] << 24) | (h[o + 1] << 16) | (h[o + 2] << 8) | h[o + 3]) >>> 0);
9872
+ }
9873
+ keyCache.set(cacheKey, keys);
9874
+ return keys;
9875
+ }
9876
+ function roundFn(r, key, halfBits) {
9877
+ let x = (r ^ key) >>> 0;
9878
+ x = Math.imul(x ^ (x >>> 16), 0x9e3779b1) >>> 0;
9879
+ x = Math.imul(x ^ (x >>> 13), 0x7feb352d) >>> 0;
9880
+ x = (x ^ (x >>> 16)) >>> 0;
9881
+ return x & ((1 << halfBits) - 1);
9882
+ }
9883
+ function encryptBlock(x, halfBits, keys) {
9884
+ const mask = (1 << halfBits) - 1;
9885
+ let L = (x >>> halfBits) & mask;
9886
+ let R = x & mask;
9887
+ for (let i = 0; i < ROUNDS; i++) {
9888
+ const F = roundFn(R, keys[i], halfBits);
9889
+ const nL = R;
9890
+ const nR = (L ^ F) & mask;
9891
+ L = nL;
9892
+ R = nR;
9893
+ }
9894
+ return ((L << halfBits) | R) >>> 0;
9895
+ }
9896
+ function decryptBlock(y, halfBits, keys) {
9897
+ const mask = (1 << halfBits) - 1;
9898
+ let L = (y >>> halfBits) & mask;
9899
+ let R = y & mask;
9900
+ for (let i = ROUNDS - 1; i >= 0; i--) {
9901
+ const F = roundFn(L, keys[i], halfBits);
9902
+ const nR = L;
9903
+ const nL = (R ^ F) & mask;
9904
+ L = nL;
9905
+ R = nR;
9906
+ }
9907
+ return ((L << halfBits) | R) >>> 0;
9908
+ }
9909
+ function permute(seed, x, cfg) {
9910
+ const keys = deriveRoundKeys(seed, cfg.label);
9911
+ let v = encryptBlock(x, cfg.halfBits, keys);
9912
+ while (v >= cfg.n)
9913
+ v = encryptBlock(v, cfg.halfBits, keys);
9914
+ return v;
9915
+ }
9916
+ function unpermute(seed, y, cfg) {
9917
+ const keys = deriveRoundKeys(seed, cfg.label);
9918
+ let v = decryptBlock(y, cfg.halfBits, keys);
9919
+ while (v >= cfg.n)
9920
+ v = decryptBlock(v, cfg.halfBits, keys);
9921
+ return v;
9922
+ }
9923
+
9924
+ const ONSETS = ['b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't'];
9925
+ const VOWELS = ['a', 'e', 'i', 'o', 'u'];
9926
+ const CODAS = ['n', 'r', 'l', 's', 'k', 'm', 't', 'x'];
9927
+ const SYL_BASE = ONSETS.length * VOWELS.length * CODAS.length;
9928
+ function syllable(digit) {
9929
+ const onset = Math.floor(digit / (VOWELS.length * CODAS.length));
9930
+ const rem = digit % (VOWELS.length * CODAS.length);
9931
+ const vowel = Math.floor(rem / CODAS.length);
9932
+ const coda = rem % CODAS.length;
9933
+ return ONSETS[onset] + VOWELS[vowel] + CODAS[coda];
9934
+ }
9935
+ function unsyllable(chunk) {
9936
+ const onset = ONSETS.indexOf(chunk[0]);
9937
+ const vowel = VOWELS.indexOf(chunk[1]);
9938
+ const coda = CODAS.indexOf(chunk[2]);
9939
+ if (onset < 0 || vowel < 0 || coda < 0)
9940
+ throw new Error(`invalid region token chunk: ${chunk}`);
9941
+ return onset * (VOWELS.length * CODAS.length) + vowel * CODAS.length + coda;
9942
+ }
9943
+ function encodeRegion(seed, rx, ry) {
9944
+ const index = rx * REGION_PER_AXIS + ry;
9945
+ let n = permute(seed, index, REGION_FEISTEL);
9946
+ const d0 = n % SYL_BASE;
9947
+ n = Math.floor(n / SYL_BASE);
9948
+ const d1 = n % SYL_BASE;
9949
+ const d2 = Math.floor(n / SYL_BASE);
9950
+ const token = syllable(d2) + syllable(d1) + syllable(d0);
9951
+ return token.charAt(0).toUpperCase() + token.slice(1);
9952
+ }
9953
+ function decodeRegion(seed, token) {
9954
+ if (token.length !== 9)
9955
+ throw new Error(`invalid region token length: ${token}`);
9956
+ const lower = token.toLowerCase();
9957
+ const d2 = unsyllable(lower.slice(0, 3));
9958
+ const d1 = unsyllable(lower.slice(3, 6));
9959
+ const d0 = unsyllable(lower.slice(6, 9));
9960
+ const scrambled = (d2 * SYL_BASE + d1) * SYL_BASE + d0;
9961
+ if (scrambled >= REGION_FEISTEL.n)
9962
+ throw new Error(`invalid region token: ${token}`);
9963
+ const index = unpermute(seed, scrambled, REGION_FEISTEL);
9964
+ return { rx: Math.floor(index / REGION_PER_AXIS), ry: index % REGION_PER_AXIS };
9965
+ }
9966
+
9967
+ const SECTOR_ADJECTIVES = [
9968
+ 'Amber',
9969
+ 'Azure',
9970
+ 'Brass',
9971
+ 'Cinder',
9972
+ 'Cobalt',
9973
+ 'Copper',
9974
+ 'Coral',
9975
+ 'Crimson',
9976
+ 'Crystal',
9977
+ 'Dusk',
9978
+ 'Ember',
9979
+ 'Emerald',
9980
+ 'Frost',
9981
+ 'Glimmer',
9982
+ 'Golden',
9983
+ 'Hazy',
9984
+ 'Indigo',
9985
+ 'Iron',
9986
+ 'Ivory',
9987
+ 'Jade',
9988
+ 'Lunar',
9989
+ 'Misty',
9990
+ 'Neon',
9991
+ 'Onyx',
9992
+ 'Opal',
9993
+ 'Pearl',
9994
+ 'Plasma',
9995
+ 'Quartz',
9996
+ 'Rusty',
9997
+ 'Saffron',
9998
+ 'Scarlet',
9999
+ 'Silver',
10000
+ 'Solar',
10001
+ 'Static',
10002
+ 'Stormy',
10003
+ 'Sunny',
10004
+ 'Teal',
10005
+ 'Umber',
10006
+ 'Velvet',
10007
+ 'Verdant',
10008
+ 'Vermilion',
10009
+ 'Violet',
10010
+ 'Wispy',
10011
+ ];
10012
+ const SECTOR_NOUNS = [
10013
+ 'Belt',
10014
+ 'Bluff',
10015
+ 'Cluster',
10016
+ 'Coil',
10017
+ 'Crest',
10018
+ 'Drift',
10019
+ 'Expanse',
10020
+ 'Fathom',
10021
+ 'Flare',
10022
+ 'Gulf',
10023
+ 'Halo',
10024
+ 'Haven',
10025
+ 'Hollow',
10026
+ 'Maw',
10027
+ 'Mesa',
10028
+ 'Mire',
10029
+ 'Notch',
10030
+ 'Nook',
10031
+ 'Oasis',
10032
+ 'Lagoon',
10033
+ 'Peak',
10034
+ 'Pocket',
10035
+ 'Reach',
10036
+ 'Reef',
10037
+ 'Ridge',
10038
+ 'Rift',
10039
+ 'Run',
10040
+ 'Shoal',
10041
+ 'Shroud',
10042
+ 'Span',
10043
+ 'Spire',
10044
+ 'Spur',
10045
+ 'Stretch',
10046
+ 'Sprawl',
10047
+ 'Tangle',
10048
+ 'Trace',
10049
+ 'Trench',
10050
+ 'Vale',
10051
+ 'Vault',
10052
+ 'Verge',
10053
+ 'Vortex',
10054
+ 'Ward',
10055
+ 'Wisp',
10056
+ ];
10057
+ function encodeSector(seed, sx, sy) {
10058
+ const index = sx * SECTORS_PER_AXIS + sy;
10059
+ const scrambled = permute(seed, index, SECTOR_FEISTEL);
10060
+ const adj = Math.floor(scrambled / SECTORS_PER_AXIS);
10061
+ const noun = scrambled % SECTORS_PER_AXIS;
10062
+ return `${SECTOR_ADJECTIVES[adj]} ${SECTOR_NOUNS[noun]}`;
10063
+ }
10064
+ function decodeSector(seed, name) {
10065
+ const parts = name.trim().split(/\s+/);
10066
+ if (parts.length !== 2)
10067
+ throw new Error(`invalid sector name: ${name}`);
10068
+ const adj = SECTOR_ADJECTIVES.indexOf(parts[0]);
10069
+ const noun = SECTOR_NOUNS.indexOf(parts[1]);
10070
+ if (adj < 0 || noun < 0)
10071
+ throw new Error(`unknown sector name: ${name}`);
10072
+ const scrambled = adj * SECTORS_PER_AXIS + noun;
10073
+ const index = unpermute(seed, scrambled, SECTOR_FEISTEL);
10074
+ return { sx: Math.floor(index / SECTORS_PER_AXIS), sy: index % SECTORS_PER_AXIS };
10075
+ }
10076
+
10077
+ function sliceAxis(coord) {
10078
+ if (!Number.isInteger(coord) || coord < COORD_MIN || coord > COORD_MAX) {
10079
+ throw new RangeError(`coordinate out of range: ${coord}`);
10080
+ }
10081
+ const u = coord + COORD_OFFSET;
10082
+ return {
10083
+ sector: Math.floor(u / SECTOR_DIV),
10084
+ region: Math.floor(u / REGION_DIV) % REGION_PER_AXIS,
10085
+ local: (u % REGION_DIV) - LOCAL_HALF,
10086
+ };
10087
+ }
10088
+ function encodeAddress(seed, x, y) {
10089
+ const ax = sliceAxis(x);
10090
+ const ay = sliceAxis(y);
10091
+ return {
10092
+ sector: encodeSector(seed, ax.sector, ay.sector),
10093
+ region: encodeRegion(seed, ax.region, ay.region),
10094
+ localX: ax.local,
10095
+ localY: ay.local,
10096
+ };
10097
+ }
10098
+ function decodeAddress(seed, addr) {
10099
+ if (!Number.isInteger(addr.localX) ||
10100
+ !Number.isInteger(addr.localY) ||
10101
+ addr.localX < LOCAL_MIN ||
10102
+ addr.localX > LOCAL_MAX ||
10103
+ addr.localY < LOCAL_MIN ||
10104
+ addr.localY > LOCAL_MAX) {
10105
+ throw new RangeError(`local position out of range: ${addr.localX}, ${addr.localY}`);
10106
+ }
10107
+ const sector = decodeSector(seed, addr.sector);
10108
+ const region = decodeRegion(seed, addr.region);
10109
+ const x = sector.sx * SECTOR_DIV + region.rx * REGION_DIV + (addr.localX + LOCAL_HALF) - COORD_OFFSET;
10110
+ const y = sector.sy * SECTOR_DIV + region.ry * REGION_DIV + (addr.localY + LOCAL_HALF) - COORD_OFFSET;
10111
+ if (x < COORD_MIN || x > COORD_MAX || y < COORD_MIN || y > COORD_MAX) {
10112
+ throw new RangeError(`address decodes outside the coordinate range: ${x}, ${y}`);
10113
+ }
10114
+ return { x, y };
10115
+ }
10116
+ function addressFromCoordinates(seed, coords) {
10117
+ const x = typeof coords.x === 'number' ? coords.x : coords.x.toNumber();
10118
+ const y = typeof coords.y === 'number' ? coords.y : coords.y.toNumber();
10119
+ return encodeAddress(seed, x, y);
10120
+ }
10121
+
10122
+ const cache = new Map();
10123
+ const CACHE_MAX = 4096;
10124
+ function encodeAddressMemo(seed, x, y) {
10125
+ const key = `${antelope.Checksum256.from(seed).toString()}:${x},${y}`;
10126
+ let hit = cache.get(key);
10127
+ if (!hit) {
10128
+ hit = encodeAddress(seed, x, y);
10129
+ if (cache.size >= CACHE_MAX) {
10130
+ const oldest = cache.keys().next().value;
10131
+ if (oldest !== undefined)
10132
+ cache.delete(oldest);
10133
+ }
10134
+ cache.set(key, hit);
10135
+ }
10136
+ return hit;
10137
+ }
10138
+
10139
+ class CoordinatesManager extends BaseManager {
10140
+ async encode(x, y) {
10141
+ const game = await this.getGame();
10142
+ return encodeAddressMemo(game.config.seed, x, y);
10143
+ }
10144
+ async decode(addr) {
10145
+ const game = await this.getGame();
10146
+ return decodeAddress(game.config.seed, addr);
10147
+ }
10148
+ }
10149
+
9627
10150
  class EpochsManager extends BaseManager {
9628
10151
  async getCurrentHeight() {
9629
10152
  const game = await this.getGame();
@@ -11506,11 +12029,14 @@ class ActionsManager extends BaseManager {
11506
12029
  recharge,
11507
12030
  });
11508
12031
  }
11509
- grouptravel(entities, destination, recharge = true) {
11510
- const entityRefs = entities.map((e) => exports.ServerTypes.entity_ref.from({
12032
+ entityRefs(entities) {
12033
+ return entities.map((e) => exports.ServerTypes.entity_ref.from({
11511
12034
  entity_type: e.entityType,
11512
12035
  entity_id: antelope.UInt64.from(e.entityId),
11513
12036
  }));
12037
+ }
12038
+ grouptravel(entities, destination, recharge = true) {
12039
+ const entityRefs = this.entityRefs(entities);
11514
12040
  const x = antelope.Int64.from(destination.x);
11515
12041
  const y = antelope.Int64.from(destination.y);
11516
12042
  return this.server.action('grouptravel', {
@@ -11520,6 +12046,36 @@ class ActionsManager extends BaseManager {
11520
12046
  recharge,
11521
12047
  });
11522
12048
  }
12049
+ transit(shipId, entrance, exit) {
12050
+ return this.server.action('transit', {
12051
+ id: antelope.UInt64.from(shipId),
12052
+ ax: antelope.Int64.from(entrance.x),
12053
+ ay: antelope.Int64.from(entrance.y),
12054
+ bx: antelope.Int64.from(exit.x),
12055
+ by: antelope.Int64.from(exit.y),
12056
+ });
12057
+ }
12058
+ grouptransit(entities, entrance, exit) {
12059
+ const entityRefs = this.entityRefs(entities);
12060
+ return this.server.action('grouptransit', {
12061
+ entities: entityRefs,
12062
+ ax: antelope.Int64.from(entrance.x),
12063
+ ay: antelope.Int64.from(entrance.y),
12064
+ bx: antelope.Int64.from(exit.x),
12065
+ by: antelope.Int64.from(exit.y),
12066
+ });
12067
+ }
12068
+ getwormhole(x, y) {
12069
+ return this.server.action('getwormhole', { x: antelope.Int64.from(x), y: antelope.Int64.from(y) });
12070
+ }
12071
+ getdistance(origin, destination) {
12072
+ return this.server.action('getdistance', {
12073
+ ax: antelope.Int64.from(origin.x),
12074
+ ay: antelope.Int64.from(origin.y),
12075
+ bx: antelope.Int64.from(destination.x),
12076
+ by: antelope.Int64.from(destination.y),
12077
+ });
12078
+ }
11523
12079
  resolve(entityId, count) {
11524
12080
  const params = {
11525
12081
  id: antelope.UInt64.from(entityId),
@@ -11582,12 +12138,25 @@ class ActionsManager extends BaseManager {
11582
12138
  account: antelope.Name.from(account),
11583
12139
  });
11584
12140
  }
11585
- gather(sourceId, destinationId, stratum, quantity) {
11586
- return this.server.action('gather', {
12141
+ gather(sourceId, destinationId, stratum, quantity, slot) {
12142
+ const params = {
11587
12143
  source_id: antelope.UInt64.from(sourceId),
11588
12144
  destination_id: antelope.UInt64.from(destinationId),
11589
12145
  stratum: antelope.UInt16.from(stratum),
11590
12146
  quantity: antelope.UInt32.from(quantity),
12147
+ };
12148
+ if (slot !== undefined) {
12149
+ params.slot = antelope.UInt8.from(slot);
12150
+ }
12151
+ return this.server.action('gather', params);
12152
+ }
12153
+ bundleGather(gathers) {
12154
+ const actions = gathers.map(({ sourceId, destinationId, stratum, quantity, slot }) => this.gather(sourceId, destinationId, stratum, quantity, slot));
12155
+ return antelope.Transaction.from({
12156
+ expiration: 0,
12157
+ ref_block_num: 0,
12158
+ ref_block_prefix: 0,
12159
+ actions,
11591
12160
  });
11592
12161
  }
11593
12162
  warp(entityId, destination) {
@@ -11599,7 +12168,7 @@ class ActionsManager extends BaseManager {
11599
12168
  y,
11600
12169
  });
11601
12170
  }
11602
- craft(entityId, recipeId, quantity, inputs, target) {
12171
+ craft(entityId, recipeId, quantity, inputs, target, slot) {
11603
12172
  const params = {
11604
12173
  id: antelope.UInt64.from(entityId),
11605
12174
  recipe_id: antelope.UInt16.from(recipeId),
@@ -11609,6 +12178,9 @@ class ActionsManager extends BaseManager {
11609
12178
  if (target !== undefined) {
11610
12179
  params.target = antelope.UInt64.from(target);
11611
12180
  }
12181
+ if (slot !== undefined) {
12182
+ params.slot = antelope.UInt8.from(slot);
12183
+ }
11612
12184
  return this.server.action('craft', params);
11613
12185
  }
11614
12186
  blend(entityId, inputs) {
@@ -12276,6 +12848,12 @@ class GameContext {
12276
12848
  }
12277
12849
  return this._locations;
12278
12850
  }
12851
+ get coordinates() {
12852
+ if (!this._coordinates) {
12853
+ this._coordinates = new CoordinatesManager(this);
12854
+ }
12855
+ return this._coordinates;
12856
+ }
12279
12857
  get epochs() {
12280
12858
  if (!this._epochs) {
12281
12859
  this._epochs = new EpochsManager(this);
@@ -12396,6 +12974,9 @@ class Shipload {
12396
12974
  get locations() {
12397
12975
  return this._context.locations;
12398
12976
  }
12977
+ get coordinates() {
12978
+ return this._context.coordinates;
12979
+ }
12399
12980
  get epochs() {
12400
12981
  return this._context.epochs;
12401
12982
  }
@@ -12445,8 +13026,8 @@ function computeBaseHullmass$1(stats) {
12445
13026
  return 100000 - 75 * stats.density;
12446
13027
  }
12447
13028
  function computeShipHullCapabilities(stats) {
12448
- const statSum = stats.strength + stats.hardness + stats.cohesion;
12449
- const exponent = statSum / 2997.0;
13029
+ const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
13030
+ const exponent = statSum / 1998.0;
12450
13031
  return {
12451
13032
  hullmass: computeBaseHullmass$1(stats),
12452
13033
  capacity: Math.floor(5000000 * 6 ** exponent),
@@ -12537,9 +13118,9 @@ function computeStorageCapabilities(stats, baseCapacity) {
12537
13118
  function computeBaseCapacity(itemId, stats) {
12538
13119
  switch (itemId) {
12539
13120
  case ITEM_SHIP_T1_PACKED:
13121
+ return computeShipHullCapabilities(stats).capacity;
12540
13122
  case ITEM_EXTRACTOR_T1_PACKED:
12541
13123
  case ITEM_FACTORY_T1_PACKED:
12542
- return computeShipHullCapabilities(stats).capacity;
12543
13124
  case ITEM_CONTAINER_T1_PACKED:
12544
13125
  return computeContainerCapabilities(stats).capacity;
12545
13126
  case ITEM_WAREHOUSE_T1_PACKED:
@@ -12555,8 +13136,8 @@ function computeWarpCapabilities(stats) {
12555
13136
  return { range: 100 + resonance * 3 };
12556
13137
  }
12557
13138
  function computeWarehouseHullCapabilities(stats) {
12558
- const statSum = stats.strength + stats.hardness + stats.cohesion;
12559
- const exponent = statSum / 2997.0;
13139
+ const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
13140
+ const exponent = statSum / 1998.0;
12560
13141
  return {
12561
13142
  hullmass: computeBaseHullmass$1(stats),
12562
13143
  capacity: Math.floor(100000000 * 6 ** exponent),
@@ -12591,6 +13172,9 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
12591
13172
  let hasWarp = false;
12592
13173
  let totalBatteryStatSum = 0;
12593
13174
  let batteryCount = 0;
13175
+ const gathererLanes = [];
13176
+ const crafterLanes = [];
13177
+ const loaderLanes = [];
12594
13178
  for (const mod of modules) {
12595
13179
  const item = getItem(mod.itemId);
12596
13180
  const modType = getModuleCapabilityType(mod.itemId);
@@ -12613,10 +13197,18 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
12613
13197
  hasGatherer = true;
12614
13198
  const tier = item.tier;
12615
13199
  const caps = computeGathererCapabilities(decodedStats, tier);
12616
- totalGathYield += applySlotMultiplier(caps.yield, amp);
13200
+ const scaledYield = applySlotMultiplier(caps.yield, amp);
13201
+ totalGathYield += scaledYield;
12617
13202
  totalGathDrain += caps.drain;
12618
13203
  if (caps.depth > maxGathDepth)
12619
13204
  maxGathDepth = caps.depth;
13205
+ gathererLanes.push({
13206
+ slotIndex: mod.slotIndex,
13207
+ yield: scaledYield,
13208
+ drain: caps.drain,
13209
+ depth: caps.depth,
13210
+ outputPct: amp,
13211
+ });
12620
13212
  }
12621
13213
  else if (modType === MODULE_LOADER) {
12622
13214
  hasLoader = true;
@@ -12624,6 +13216,12 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
12624
13216
  totalLoaderMass += caps.mass;
12625
13217
  totalLoaderThrust += applySlotMultiplier(caps.thrust, amp);
12626
13218
  totalLoaderQuantity += caps.quantity;
13219
+ loaderLanes.push({
13220
+ slotIndex: mod.slotIndex,
13221
+ mass: caps.mass,
13222
+ thrust: applySlotMultiplier(caps.thrust, amp),
13223
+ outputPct: amp,
13224
+ });
12627
13225
  }
12628
13226
  else if (modType === MODULE_STORAGE) {
12629
13227
  const caps = computeStorageCapabilities(decodedStats, baseCapacity);
@@ -12632,8 +13230,15 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
12632
13230
  else if (modType === MODULE_CRAFTER) {
12633
13231
  hasCrafter = true;
12634
13232
  const caps = computeCrafterCapabilities(decodedStats);
12635
- totalCrafterSpeed += applySlotMultiplier(caps.speed, amp);
13233
+ const scaledSpeed = applySlotMultiplier(caps.speed, amp);
13234
+ totalCrafterSpeed += scaledSpeed;
12636
13235
  totalCrafterDrain += caps.drain;
13236
+ crafterLanes.push({
13237
+ slotIndex: mod.slotIndex,
13238
+ speed: scaledSpeed,
13239
+ drain: caps.drain,
13240
+ outputPct: amp,
13241
+ });
12637
13242
  }
12638
13243
  else if (modType === MODULE_HAULER) {
12639
13244
  hasHauler = true;
@@ -12681,6 +13286,7 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
12681
13286
  drain: totalGathDrain,
12682
13287
  depth: maxGathDepth,
12683
13288
  };
13289
+ result.gathererLanes = gathererLanes;
12684
13290
  }
12685
13291
  if (hasLoader) {
12686
13292
  result.loaders = {
@@ -12688,9 +13294,11 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
12688
13294
  thrust: clampUint16(totalLoaderThrust),
12689
13295
  quantity: totalLoaderQuantity,
12690
13296
  };
13297
+ result.loaderLanes = loaderLanes;
12691
13298
  }
12692
13299
  if (hasCrafter) {
12693
13300
  result.crafter = { speed: clampUint16(totalCrafterSpeed), drain: totalCrafterDrain };
13301
+ result.crafterLanes = crafterLanes;
12694
13302
  }
12695
13303
  if (hasHauler) {
12696
13304
  const efficiency = totalHaulerCapacity > 0 ? Number(weightedHaulerEffNum / BigInt(totalHaulerCapacity)) : 0;
@@ -12706,20 +13314,19 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
12706
13314
  return result;
12707
13315
  }
12708
13316
  function computeContainerCapabilities(stats) {
12709
- const statSum = stats.strength + stats.hardness + stats.cohesion;
12710
- const exponent = statSum / 2997.0;
13317
+ const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
13318
+ const exponent = statSum / 1998.0;
12711
13319
  return {
12712
13320
  hullmass: computeBaseHullmass$1(stats),
12713
13321
  capacity: Math.floor(22000000 * 6 ** exponent),
12714
13322
  };
12715
13323
  }
12716
13324
  function computeContainerT2Capabilities(stats) {
12717
- const strength = stats.strength;
12718
- const density = stats.density;
12719
- const hardness = stats.hardness;
12720
- const cohesion = stats.cohesion;
13325
+ const strength = stats.strength ?? 0;
13326
+ const density = stats.density ?? 0;
13327
+ const hardness = stats.hardness ?? 0;
12721
13328
  const hullmass = 70000 - 50 * density;
12722
- const statSum = strength + hardness + cohesion;
13329
+ const statSum = strength + hardness;
12723
13330
  const exponent = statSum / 2947;
12724
13331
  const capacity = Math.floor(24000000 * 6 ** exponent);
12725
13332
  return { hullmass, capacity };
@@ -12816,17 +13423,36 @@ function makeEntity(packedItemId, state) {
12816
13423
  info.engines = caps.engines;
12817
13424
  if (caps.generator)
12818
13425
  info.generator = caps.generator;
12819
- if (caps.gatherer)
12820
- info.gatherer = caps.gatherer;
12821
- if (caps.loaders)
12822
- info.loaders = caps.loaders;
12823
- if (caps.crafter)
12824
- info.crafter = caps.crafter;
12825
13426
  if (caps.hauler)
12826
13427
  info.hauler = caps.hauler;
12827
13428
  if (caps.warp)
12828
13429
  info.warp = caps.warp;
13430
+ info.gatherer_lanes = (caps.gathererLanes ?? []).map((l) => exports.ServerTypes.gatherer_lane.from({
13431
+ slot_index: l.slotIndex,
13432
+ yield: l.yield,
13433
+ drain: l.drain,
13434
+ depth: l.depth,
13435
+ output_pct: l.outputPct,
13436
+ }));
13437
+ info.crafter_lanes = (caps.crafterLanes ?? []).map((l) => exports.ServerTypes.crafter_lane.from({
13438
+ slot_index: l.slotIndex,
13439
+ speed: l.speed,
13440
+ drain: l.drain,
13441
+ output_pct: l.outputPct,
13442
+ }));
13443
+ info.loader_lanes = (caps.loaderLanes ?? []).map((l) => exports.ServerTypes.loader_lane.from({
13444
+ slot_index: l.slotIndex,
13445
+ mass: l.mass,
13446
+ thrust: l.thrust,
13447
+ output_pct: l.outputPct,
13448
+ }));
12829
13449
  }
13450
+ if (!info.gatherer_lanes)
13451
+ info.gatherer_lanes = [];
13452
+ if (!info.crafter_lanes)
13453
+ info.crafter_lanes = [];
13454
+ if (!info.loader_lanes)
13455
+ info.loader_lanes = [];
12830
13456
  const entityInfo = exports.ServerTypes.entity_info.from(info);
12831
13457
  return new Entity(entityInfo);
12832
13458
  }
@@ -12951,9 +13577,10 @@ class ConstructionManager extends BaseManager {
12951
13577
  continue;
12952
13578
  if (!coordsEqual(entity.coordinates, target.coordinates))
12953
13579
  continue;
12954
- const speed = entity.crafter?.speed.toNumber();
12955
- if (speed === undefined)
13580
+ const crafterLanes = entity.crafter_lanes ?? [];
13581
+ if (crafterLanes.length === 0)
12956
13582
  continue;
13583
+ const speed = crafterLanes.reduce((s, l) => s + Number(l.speed), 0);
12957
13584
  out.push({
12958
13585
  entityId: entity.id,
12959
13586
  entityType: entity.type,
@@ -13182,8 +13809,9 @@ function partitionSources(target, entities, cargo) {
13182
13809
  const relevant = matchRelevantCargo(entity, target, cargo, reserved);
13183
13810
  if (relevant.length === 0)
13184
13811
  continue;
13185
- const loaderCount = entity.loaders?.quantity.toNumber() ?? 0;
13186
- const loaderTotalMass = entity.loaders?.mass.toNumber() ?? 0;
13812
+ const loaderLanes = entity.loader_lanes ?? [];
13813
+ const loaderCount = loaderLanes.length;
13814
+ const loaderTotalMass = loaderLanes.reduce((s, l) => s + Number(l.mass), 0);
13187
13815
  const ref = {
13188
13816
  entityId: entity.id,
13189
13817
  name: entity.id.toString(),
@@ -13291,6 +13919,179 @@ function validateDisplayName(input, opts = {}) {
13291
13919
  return { valid: true, name };
13292
13920
  }
13293
13921
 
13922
+ function idiv(a, b) {
13923
+ return Math.floor(a / b);
13924
+ }
13925
+ function computeBaseHullmass(stats) {
13926
+ const density = decodeStat(stats, 1);
13927
+ return 100000 - 75 * density;
13928
+ }
13929
+ function computeBaseCapacityShip(stats) {
13930
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2);
13931
+ return Math.floor(5000000 * 6 ** (s / 1998));
13932
+ }
13933
+ function computeBaseCapacityContainer(stats) {
13934
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2);
13935
+ return Math.floor(22000000 * 6 ** (s / 1998));
13936
+ }
13937
+ function computeBaseCapacityContainerT2(stats) {
13938
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2);
13939
+ return Math.floor(24000000 * 6 ** (s / 2947));
13940
+ }
13941
+ function computeBaseCapacityWarehouse(stats) {
13942
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2);
13943
+ return Math.floor(100000000 * 6 ** (s / 1998));
13944
+ }
13945
+ const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
13946
+ const computeEngineDrain = (thm) => 2 * Math.max(30, 50 - idiv(thm, 70));
13947
+ const computeGeneratorCap = (com) => 950 + idiv(com, 2);
13948
+ const computeGeneratorRech = (fin) => 2 * (1 + idiv(fin * 3, 1000));
13949
+ const computeGathererYield = (str) => 200 + str;
13950
+ const computeGathererDrain = (con) => 2 * Math.max(250, 1250 - idiv(con * 25, 20));
13951
+ const computeGathererDepth = (tol, tier) => gathererDepthForTier(tol, tier);
13952
+ const computeLoaderMass = (ins) => Math.max(200, 2000 - ins * 2);
13953
+ const computeLoaderThrust = (pla) => 1 + idiv(pla * pla, 10000);
13954
+ const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
13955
+ const computeCrafterDrain = (fin) => Math.max(5, 30 - idiv(fin, 33));
13956
+ const computeHaulerCapacity = (fin) => Math.max(1, 1 + idiv(fin, 400));
13957
+ const computeHaulerEfficiency = (con) => 2000 + con * 6;
13958
+ const computeHaulerDrain$1 = (com) => Math.max(3, 15 - idiv(com, 80));
13959
+ const computeWarpRange = (stat) => 100 + stat * 3;
13960
+ function entityDisplayName(itemId) {
13961
+ switch (itemId) {
13962
+ case ITEM_SHIP_T1_PACKED:
13963
+ return 'Ship';
13964
+ case ITEM_WAREHOUSE_T1_PACKED:
13965
+ return 'Warehouse';
13966
+ case ITEM_EXTRACTOR_T1_PACKED:
13967
+ return 'Extractor';
13968
+ case ITEM_FACTORY_T1_PACKED:
13969
+ return 'Factory';
13970
+ case ITEM_CONTAINER_T1_PACKED:
13971
+ return 'Container';
13972
+ case ITEM_CONTAINER_T2_PACKED:
13973
+ return 'Container';
13974
+ default:
13975
+ return 'Entity';
13976
+ }
13977
+ }
13978
+ function moduleDisplayName(itemId) {
13979
+ switch (itemId) {
13980
+ case ITEM_ENGINE_T1:
13981
+ return 'Engine';
13982
+ case ITEM_GENERATOR_T1:
13983
+ return 'Generator';
13984
+ case ITEM_GATHERER_T1:
13985
+ return 'Gatherer';
13986
+ case ITEM_LOADER_T1:
13987
+ return 'Loader';
13988
+ case ITEM_CRAFTER_T1:
13989
+ return 'Crafter';
13990
+ case ITEM_STORAGE_T1:
13991
+ return 'Storage';
13992
+ case ITEM_HAULER_T1:
13993
+ return 'Hauler';
13994
+ case ITEM_WARP_T1:
13995
+ return 'Warp';
13996
+ default:
13997
+ return 'Module';
13998
+ }
13999
+ }
14000
+ function formatModuleLine(slot, itemId, stats) {
14001
+ let out = `Slot ${slot} - `;
14002
+ if (itemId === 0) {
14003
+ out += '(empty)';
14004
+ return out;
14005
+ }
14006
+ out += moduleDisplayName(itemId);
14007
+ const subtype = getModuleCapabilityType(itemId);
14008
+ switch (subtype) {
14009
+ case MODULE_ENGINE: {
14010
+ const vol = decodeStat(stats, 0);
14011
+ const thm = decodeStat(stats, 1);
14012
+ out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`;
14013
+ break;
14014
+ }
14015
+ case MODULE_GENERATOR: {
14016
+ const res = decodeStat(stats, 0);
14017
+ const ref = decodeStat(stats, 1);
14018
+ out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`;
14019
+ break;
14020
+ }
14021
+ case MODULE_GATHERER: {
14022
+ const str = decodeStat(stats, 0);
14023
+ const tol = decodeStat(stats, 1);
14024
+ const con = decodeStat(stats, 2);
14025
+ const tier = getItem(itemId).tier;
14026
+ out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol, tier)} Drain ${computeGathererDrain(con)}`;
14027
+ break;
14028
+ }
14029
+ case MODULE_LOADER: {
14030
+ const fin = decodeStat(stats, 0);
14031
+ const pla = decodeStat(stats, 1);
14032
+ out += ` Mass ${computeLoaderMass(fin)} Thrust ${computeLoaderThrust(pla)}`;
14033
+ break;
14034
+ }
14035
+ case MODULE_CRAFTER: {
14036
+ const rea = decodeStat(stats, 0);
14037
+ const com = decodeStat(stats, 1);
14038
+ out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(com)}`;
14039
+ break;
14040
+ }
14041
+ case MODULE_STORAGE: {
14042
+ const str = decodeStat(stats, 0);
14043
+ const fin = decodeStat(stats, 2);
14044
+ const sat = decodeStat(stats, 3);
14045
+ const sum = str + fin + sat;
14046
+ const pct = 10 + idiv(sum * 10, 2997);
14047
+ out += ` +${pct}% capacity`;
14048
+ break;
14049
+ }
14050
+ case MODULE_HAULER: {
14051
+ const res = decodeStat(stats, 0);
14052
+ const pla = decodeStat(stats, 1);
14053
+ const ref = decodeStat(stats, 2);
14054
+ out += ` Capacity ${computeHaulerCapacity(res)} Efficiency ${computeHaulerEfficiency(pla)} Drain ${computeHaulerDrain$1(ref)}`;
14055
+ break;
14056
+ }
14057
+ case MODULE_WARP: {
14058
+ const stat = decodeStat(stats, 0);
14059
+ out += ` Range ${computeWarpRange(stat)}`;
14060
+ break;
14061
+ }
14062
+ }
14063
+ return out;
14064
+ }
14065
+ function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
14066
+ const hullMass = computeBaseHullmass(hullStats);
14067
+ let baseCapacity = 0;
14068
+ if (itemId === ITEM_SHIP_T1_PACKED) {
14069
+ baseCapacity = computeBaseCapacityShip(hullStats);
14070
+ }
14071
+ else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
14072
+ baseCapacity = computeBaseCapacityWarehouse(hullStats);
14073
+ }
14074
+ else if (itemId === ITEM_EXTRACTOR_T1_PACKED ||
14075
+ itemId === ITEM_FACTORY_T1_PACKED ||
14076
+ itemId === ITEM_CONTAINER_T1_PACKED) {
14077
+ baseCapacity = computeBaseCapacityContainer(hullStats);
14078
+ }
14079
+ else if (itemId === ITEM_CONTAINER_T2_PACKED) {
14080
+ baseCapacity = computeBaseCapacityContainerT2(hullStats);
14081
+ }
14082
+ let out = entityDisplayName(itemId);
14083
+ out += ` - Hull ${hullMass} mass`;
14084
+ if (baseCapacity > 0) {
14085
+ out += ` * ${baseCapacity} capacity`;
14086
+ }
14087
+ out += '\n\n';
14088
+ for (let i = 0; i < moduleItems.length; i++) {
14089
+ out += formatModuleLine(i, moduleItems[i], moduleStats[i] ?? 0n);
14090
+ out += '\n';
14091
+ }
14092
+ return out;
14093
+ }
14094
+
13294
14095
  function laneKeyForModule(slotIndex) {
13295
14096
  return slotIndex + 1;
13296
14097
  }
@@ -13298,7 +14099,95 @@ function laneIsFree(lanes, laneKey) {
13298
14099
  const lane = lanes.find((entry) => entry.lane_key.toNumber() === laneKey);
13299
14100
  return lane ? lane.schedule.tasks.length === 0 : true;
13300
14101
  }
13301
- function workerLaneKey(modules, moduleSubtype, lanes) {
14102
+ function resolveLaneGatherer(modules, entityItemId, laneKey) {
14103
+ const idx = laneKey - 1;
14104
+ const installed = idx >= 0 && idx < modules.length ? modules[idx].installed : undefined;
14105
+ if (!installed)
14106
+ throw new Error('gatherer lane has no module');
14107
+ const item = getItem(Number(installed.item_id.value ?? installed.item_id));
14108
+ if (item.moduleType !== 'gatherer')
14109
+ throw new Error('lane module is not a gatherer');
14110
+ const stats = BigInt(installed.stats.toString());
14111
+ const str = decodeStat(stats, 0);
14112
+ const tol = decodeStat(stats, 1);
14113
+ const con = decodeStat(stats, 2);
14114
+ const layout = getEntityLayout(entityItemId)?.slots ?? [];
14115
+ const amp = getSlotAmp(layout, idx);
14116
+ const yieldVal = applySlotMultiplier(computeGathererYield(str), amp);
14117
+ const drain = computeGathererDrain(con);
14118
+ const depth = gathererDepthForTier(tol, item.tier ?? 1);
14119
+ return { slotIndex: idx, yield: yieldVal, drain, depth, outputPct: amp };
14120
+ }
14121
+ function selectGatherLane(modules, entityItemId, lanes, stratum, explicitSlot) {
14122
+ if (explicitSlot !== undefined) {
14123
+ const laneKey = laneKeyForModule(explicitSlot);
14124
+ const lane = resolveLaneGatherer(modules, entityItemId, laneKey);
14125
+ if (stratum > lane.depth)
14126
+ throw new Error('stratum exceeds gatherer depth');
14127
+ return laneKey;
14128
+ }
14129
+ return workerLaneKey(modules, 'gatherer', lanes, stratum);
14130
+ }
14131
+ function resolveLaneCrafter(modules, entityItemId, laneKey) {
14132
+ const idx = laneKey - 1;
14133
+ const installed = idx >= 0 && idx < modules.length ? modules[idx].installed : undefined;
14134
+ if (!installed)
14135
+ throw new Error('crafter lane has no module');
14136
+ const item = getItem(Number(installed.item_id.value ?? installed.item_id));
14137
+ if (item.moduleType !== 'crafter')
14138
+ throw new Error('lane module is not a crafter');
14139
+ const stats = BigInt(installed.stats.toString());
14140
+ const rea = decodeStat(stats, 0);
14141
+ const fin = decodeStat(stats, 1);
14142
+ const layout = getEntityLayout(entityItemId)?.slots ?? [];
14143
+ const amp = getSlotAmp(layout, idx);
14144
+ const speed = applySlotMultiplier(computeCrafterSpeed(rea), amp);
14145
+ const drain = computeCrafterDrain(fin);
14146
+ return { slotIndex: idx, speed, drain, outputPct: amp };
14147
+ }
14148
+ function resolveLaneLoader(modules, entityItemId, laneKey) {
14149
+ if (laneKey === LANE_MOBILITY) {
14150
+ return { slotIndex: -1, thrust: 0, mass: 0, outputPct: 0, valid: false };
14151
+ }
14152
+ const idx = laneKey - 1;
14153
+ const installed = idx >= 0 && idx < modules.length ? modules[idx].installed : undefined;
14154
+ if (!installed) {
14155
+ return { slotIndex: idx, thrust: 0, mass: 0, outputPct: 0, valid: false };
14156
+ }
14157
+ const stats = BigInt(installed.stats.toString());
14158
+ const ins = decodeStat(stats, 0);
14159
+ const pla = decodeStat(stats, 1);
14160
+ const layout = getEntityLayout(entityItemId)?.slots ?? [];
14161
+ const amp = getSlotAmp(layout, idx);
14162
+ const thrust = applySlotMultiplier(computeLoaderThrust(pla), amp);
14163
+ const mass = computeLoaderMass(ins);
14164
+ return { slotIndex: idx, thrust, mass, outputPct: amp, valid: true };
14165
+ }
14166
+ function workerLaneKey(modules, moduleSubtype, lanes, stratum) {
14167
+ if (moduleSubtype === 'gatherer' && stratum !== undefined) {
14168
+ let lowestReaching;
14169
+ for (let i = 0; i < modules.length; i++) {
14170
+ const installed = modules[i].installed;
14171
+ if (!installed)
14172
+ continue;
14173
+ const item = getItem(Number(installed.item_id.value ?? installed.item_id));
14174
+ if (item.moduleType !== 'gatherer')
14175
+ continue;
14176
+ const stats = BigInt(installed.stats.toString());
14177
+ const tol = decodeStat(stats, 1);
14178
+ const depth = gathererDepthForTier(tol, item.tier ?? 1);
14179
+ if (depth < stratum)
14180
+ continue;
14181
+ const laneKey = laneKeyForModule(i);
14182
+ if (lowestReaching === undefined)
14183
+ lowestReaching = laneKey;
14184
+ if (laneIsFree(lanes, laneKey))
14185
+ return laneKey;
14186
+ }
14187
+ if (lowestReaching === undefined)
14188
+ throw new Error('no gatherer reaches this stratum');
14189
+ return lowestReaching;
14190
+ }
13302
14191
  const occupiedMatchingLaneKeys = [];
13303
14192
  for (let slotIndex = 0; slotIndex < modules.length; slotIndex++) {
13304
14193
  const installed = modules[slotIndex].installed;
@@ -13555,9 +14444,32 @@ function recomputeCaps(entity) {
13555
14444
  }
13556
14445
  const itemId = Number(typeof entity.item_id === 'number' ? entity.item_id : entity.item_id.value);
13557
14446
  const hullStats = decodeCraftedItemStats(itemId, entity.stats);
14447
+ if (hullStats.strength === undefined)
14448
+ hullStats.strength = decodeStat(entity.stats, 0);
14449
+ if (hullStats.hardness === undefined)
14450
+ hullStats.hardness = decodeStat(entity.stats, 2);
13558
14451
  const layout = getEntityLayout(itemId)?.slots ?? [];
13559
14452
  const installed = toInstalledModules(entity.modules);
13560
14453
  const caps = computeEntityCapabilities(hullStats, itemId, installed, layout);
14454
+ const toLoaderLane = (l) => exports.ServerTypes.loader_lane.from({
14455
+ slot_index: l.slotIndex,
14456
+ mass: l.mass,
14457
+ thrust: l.thrust,
14458
+ output_pct: l.outputPct,
14459
+ });
14460
+ const toGathererLane = (l) => exports.ServerTypes.gatherer_lane.from({
14461
+ slot_index: l.slotIndex,
14462
+ yield: l.yield,
14463
+ drain: l.drain,
14464
+ depth: l.depth,
14465
+ output_pct: l.outputPct,
14466
+ });
14467
+ const toCrafterLane = (l) => exports.ServerTypes.crafter_lane.from({
14468
+ slot_index: l.slotIndex,
14469
+ speed: l.speed,
14470
+ drain: l.drain,
14471
+ output_pct: l.outputPct,
14472
+ });
13561
14473
  return {
13562
14474
  hullmass: antelope.UInt32.from(caps.hullmass),
13563
14475
  capacity: antelope.UInt32.from(caps.capacity),
@@ -13565,20 +14477,30 @@ function recomputeCaps(entity) {
13565
14477
  generator: caps.generator
13566
14478
  ? exports.ServerTypes.energy_stats.from(caps.generator)
13567
14479
  : undefined,
13568
- loaders: caps.loaders ? exports.ServerTypes.loader_stats.from(caps.loaders) : undefined,
14480
+ loaderLanes: (caps.loaderLanes ?? []).map(toLoaderLane),
14481
+ gathererLanes: (caps.gathererLanes ?? []).map(toGathererLane),
14482
+ crafterLanes: (caps.crafterLanes ?? []).map(toCrafterLane),
13569
14483
  hauler: caps.hauler ? exports.ServerTypes.hauler_stats.from(caps.hauler) : undefined,
13570
14484
  };
13571
14485
  }
14486
+ function loaderLanesTotalMass(lanes) {
14487
+ let total = 0;
14488
+ for (const l of lanes)
14489
+ total += Number(l.mass);
14490
+ return antelope.UInt64.from(total);
14491
+ }
13572
14492
  function createProjectedEntity(entity) {
13573
14493
  const needsRecompute = entity.hullmass === undefined ||
13574
- entity.loaders === undefined ||
14494
+ entity.loader_lanes === undefined ||
13575
14495
  entity.engines === undefined ||
13576
14496
  entity.generator === undefined ||
13577
14497
  entity.hauler === undefined ||
13578
14498
  entity.capacity === undefined;
13579
14499
  const caps = needsRecompute ? recomputeCaps(entity) : undefined;
13580
14500
  const shipMass = antelope.UInt32.from(entity.hullmass ?? caps?.hullmass ?? 0);
13581
- const loaders = entity.loaders ?? caps?.loaders;
14501
+ const loaderLanes = entity.loader_lanes ?? caps?.loaderLanes ?? [];
14502
+ const gathererLanes = entity.gatherer_lanes ?? caps?.gathererLanes ?? [];
14503
+ const crafterLanes = entity.crafter_lanes ?? caps?.crafterLanes ?? [];
13582
14504
  const engines = entity.engines ?? caps?.engines;
13583
14505
  const generator = entity.generator ?? caps?.generator;
13584
14506
  const hauler = entity.hauler ?? caps?.hauler;
@@ -13593,16 +14515,16 @@ function createProjectedEntity(entity) {
13593
14515
  engines,
13594
14516
  generator,
13595
14517
  hauler,
13596
- loaders,
14518
+ loaderLanes,
14519
+ gathererLanes,
14520
+ crafterLanes,
13597
14521
  get cargoMass() {
13598
14522
  return calcStacksMass(this.cargo);
13599
14523
  },
13600
14524
  get totalMass() {
13601
- let mass = antelope.UInt64.from(this.shipMass).adding(this.cargoMass);
13602
- if (this.loaders) {
13603
- mass = mass.adding(this.loaders.mass.multiplying(this.loaders.quantity));
13604
- }
13605
- return mass;
14525
+ return antelope.UInt64.from(this.shipMass)
14526
+ .adding(this.cargoMass)
14527
+ .adding(loaderLanesTotalMass(this.loaderLanes));
13606
14528
  },
13607
14529
  hasMovement() {
13608
14530
  return capsHasMovement(this.capabilities());
@@ -13611,7 +14533,7 @@ function createProjectedEntity(entity) {
13611
14533
  return capsHasStorage(this.capabilities());
13612
14534
  },
13613
14535
  hasLoaders() {
13614
- return capsHasLoaders(this.capabilities());
14536
+ return this.loaderLanes.length > 0;
13615
14537
  },
13616
14538
  capabilities() {
13617
14539
  return {
@@ -13619,7 +14541,6 @@ function createProjectedEntity(entity) {
13619
14541
  capacity: this.capacity ? antelope.UInt32.from(this.capacity) : undefined,
13620
14542
  engines: this.engines,
13621
14543
  generator: this.generator,
13622
- loaders: this.loaders,
13623
14544
  };
13624
14545
  },
13625
14546
  state() {
@@ -13721,6 +14642,7 @@ function applyTask(projected, task) {
13721
14642
  break;
13722
14643
  case exports.TaskType.TRAVEL:
13723
14644
  case exports.TaskType.WARP:
14645
+ case exports.TaskType.TRANSIT:
13724
14646
  applyFlightTask(projected, task, { complete: true });
13725
14647
  break;
13726
14648
  case exports.TaskType.LOAD:
@@ -13856,6 +14778,7 @@ function projectEntityAt(entity, now) {
13856
14778
  break;
13857
14779
  case exports.TaskType.TRAVEL:
13858
14780
  case exports.TaskType.WARP:
14781
+ case exports.TaskType.TRANSIT:
13859
14782
  applyFlightTask(projected, task, { complete: taskComplete, progress });
13860
14783
  break;
13861
14784
  case exports.TaskType.LOAD:
@@ -14024,6 +14947,155 @@ function availableForItem(avail, itemId) {
14024
14947
  return total;
14025
14948
  }
14026
14949
 
14950
+ exports.CancelBlockReason = void 0;
14951
+ (function (CancelBlockReason) {
14952
+ CancelBlockReason["TASK_NEVER"] = "TASK_NEVER";
14953
+ CancelBlockReason["BEFORE_START_RUNNING"] = "BEFORE_START_RUNNING";
14954
+ CancelBlockReason["DONE"] = "DONE";
14955
+ CancelBlockReason["CONTAINS_LINKED_TASK"] = "CONTAINS_LINKED_TASK";
14956
+ CancelBlockReason["WOULD_STRAND"] = "WOULD_STRAND";
14957
+ CancelBlockReason["WOULD_OVERFILL"] = "WOULD_OVERFILL";
14958
+ CancelBlockReason["NOT_OWNER"] = "NOT_OWNER";
14959
+ })(exports.CancelBlockReason || (exports.CancelBlockReason = {}));
14960
+ const EMPTY_EFFECTS = { refunds: [], releasedHolds: [], abandonsRunning: false };
14961
+ function postCancelEntity(entity, laneKey, fromTaskIndex) {
14962
+ const clone = entity.constructor.from(JSON.parse(JSON.stringify(entity.toJSON())));
14963
+ const lane = clone.lanes.find((l) => l.lane_key.toNumber() === laneKey);
14964
+ lane.schedule.tasks = lane.schedule.tasks.slice(0, fromTaskIndex);
14965
+ return clone;
14966
+ }
14967
+ function feasibleAfterCancel(post) {
14968
+ const ordered = orderedTasks(post);
14969
+ const base = new Map();
14970
+ for (const c of post.cargo ?? []) {
14971
+ const k = cargoKey(c);
14972
+ base.set(k, (base.get(k) ?? 0) + c.quantity.toNumber());
14973
+ }
14974
+ const isConsumer = (t) => t.type.toNumber() === exports.TaskType.CRAFT || t.type.toNumber() === exports.TaskType.UNLOAD;
14975
+ for (const self of ordered) {
14976
+ if (!isConsumer(self.task))
14977
+ continue;
14978
+ const map = new Map(base);
14979
+ for (const other of ordered) {
14980
+ if (other.completesAt.getTime() >= self.completesAt.getTime())
14981
+ continue;
14982
+ for (const out of taskCargoEffect(other.task).added) {
14983
+ map.set(cargoKey(out), (map.get(cargoKey(out)) ?? 0) + out.quantity.toNumber());
14984
+ }
14985
+ }
14986
+ for (const other of ordered) {
14987
+ if (other === self)
14988
+ continue;
14989
+ for (const inp of taskCargoEffect(other.task).removed) {
14990
+ const cur = map.get(cargoKey(inp)) ?? 0;
14991
+ map.set(cargoKey(inp), Math.max(0, cur - inp.quantity.toNumber()));
14992
+ }
14993
+ }
14994
+ for (const inp of taskCargoEffect(self.task).removed) {
14995
+ if ((map.get(cargoKey(inp)) ?? 0) < inp.quantity.toNumber())
14996
+ return false;
14997
+ }
14998
+ }
14999
+ try {
15000
+ validateSchedule(post);
15001
+ }
15002
+ catch {
15003
+ return false;
15004
+ }
15005
+ return true;
15006
+ }
15007
+ function laneTiming(lane, nowMs) {
15008
+ const startedMs = lane.schedule.started.toDate().getTime();
15009
+ let endSec = 0;
15010
+ return lane.schedule.tasks.map((t) => {
15011
+ const startsAt = startedMs + endSec * 1000;
15012
+ endSec += t.duration.toNumber();
15013
+ const completesAt = startedMs + endSec * 1000;
15014
+ return {
15015
+ startsAt,
15016
+ completesAt,
15017
+ running: nowMs >= startsAt && nowMs < completesAt,
15018
+ done: nowMs >= completesAt,
15019
+ };
15020
+ });
15021
+ }
15022
+ function cancelEligibility(entity, laneKey, fromTaskIndex, input) {
15023
+ const lane = (entity.lanes ?? []).find((l) => l.lane_key.equals(laneKey));
15024
+ if (!lane || fromTaskIndex < 0 || fromTaskIndex >= lane.schedule.tasks.length) {
15025
+ return { ok: false, range: { count: 0, taskIndices: [] }, effects: { ...EMPTY_EFFECTS } };
15026
+ }
15027
+ const tasks = lane.schedule.tasks;
15028
+ const timing = laneTiming(lane, input.now.getTime());
15029
+ const taskIndices = [];
15030
+ for (let i = fromTaskIndex; i < tasks.length; i++)
15031
+ taskIndices.push(i);
15032
+ const range = { count: taskIndices.length, taskIndices };
15033
+ const block = (blockedReason) => ({
15034
+ ok: false,
15035
+ blockedReason,
15036
+ range,
15037
+ effects: { ...EMPTY_EFFECTS },
15038
+ });
15039
+ for (const i of taskIndices) {
15040
+ const t = tasks[i];
15041
+ if (t.entitygroup && !t.entitygroup.equals(0))
15042
+ return block(exports.CancelBlockReason.CONTAINS_LINKED_TASK);
15043
+ }
15044
+ for (const i of taskIndices) {
15045
+ const t = tasks[i];
15046
+ if (timing[i].done)
15047
+ return block(exports.CancelBlockReason.DONE);
15048
+ if (t.cancelable.equals(exports.TaskCancelable.NEVER) && !t.type.equals(exports.TaskType.IDLE))
15049
+ return block(exports.CancelBlockReason.TASK_NEVER);
15050
+ if (t.cancelable.equals(exports.TaskCancelable.BEFORE_START) && timing[i].running)
15051
+ return block(exports.CancelBlockReason.BEFORE_START_RUNNING);
15052
+ }
15053
+ const post = postCancelEntity(entity, laneKey, fromTaskIndex);
15054
+ if (!feasibleAfterCancel(post))
15055
+ return block(exports.CancelBlockReason.WOULD_STRAND);
15056
+ const effects = { refunds: [], releasedHolds: [], abandonsRunning: false };
15057
+ let energyForfeited = 0;
15058
+ for (const i of taskIndices) {
15059
+ const t = tasks[i];
15060
+ if (timing[i].running && t.cancelable.equals(exports.TaskCancelable.ALWAYS))
15061
+ effects.abandonsRunning = true;
15062
+ if (t.energy_cost)
15063
+ energyForfeited += t.energy_cost.toNumber();
15064
+ if (t.type.equals(exports.TaskType.BUILDPLOT) && t.entitytarget)
15065
+ effects.keepsPlotDeposits = { plot: t.entitytarget };
15066
+ if (t.hold && t.entitytarget) {
15067
+ const counterpart = input.counterparts?.get(t.entitytarget.entity_id.toString());
15068
+ const hold = (counterpart?.holds ?? []).find((h) => h.id.equals(t.hold)) ??
15069
+ (entity.holds ?? []).find((h) => h.id.equals(t.hold));
15070
+ if (hold) {
15071
+ const kind = hold.kind.toNumber();
15072
+ effects.releasedHolds.push({ counterpart: t.entitytarget, kind });
15073
+ if (kind === 1 ) {
15074
+ effects.refunds.push({ giver: t.entitytarget, cargo: t.cargo });
15075
+ const giver = counterpart;
15076
+ if (giver) {
15077
+ const returned = t.cargo.reduce((s, c) => s + calcCargoItemMass(c).toNumber(), 0);
15078
+ const cap = giver.capacity
15079
+ ? giver.capacity.toNumber()
15080
+ : Number.MAX_SAFE_INTEGER;
15081
+ if (giver.cargomass.toNumber() + returned > cap) {
15082
+ return {
15083
+ ok: false,
15084
+ blockedReason: exports.CancelBlockReason.WOULD_OVERFILL,
15085
+ range,
15086
+ effects: { ...EMPTY_EFFECTS },
15087
+ };
15088
+ }
15089
+ }
15090
+ }
15091
+ }
15092
+ }
15093
+ }
15094
+ if (energyForfeited > 0)
15095
+ effects.energyForfeited = energyForfeited;
15096
+ return { ok: true, range, effects };
15097
+ }
15098
+
14027
15099
  function maxCraftable(entity, recipe, crafterSpeed, now) {
14028
15100
  if (recipe.inputs.length === 0)
14029
15101
  return 0;
@@ -14144,7 +15216,7 @@ function calc_gather_rate(gatherer, itemMass, stratum, richness) {
14144
15216
  }
14145
15217
  function calc_gather_energy(gatherer, duration) {
14146
15218
  const energy = Math.floor((duration * gatherer.drain.toNumber()) / PRECISION$1);
14147
- return antelope.UInt16.from(energy);
15219
+ return antelope.UInt32.from(energy);
14148
15220
  }
14149
15221
 
14150
15222
  const BASE_HAUL_PENALTY_MILLI = 300;
@@ -14158,7 +15230,7 @@ function computeHaulPenalty(totalThrust, haulCount, avgEfficiency) {
14158
15230
  HAULER_EFFICIENCY_DENOM);
14159
15231
  return Math.floor((totalThrust * 1000) / penaltyMilli);
14160
15232
  }
14161
- function computeHaulerDrain$1(distance, drain, haulCount) {
15233
+ function computeHaulerDrain(distance, drain, haulCount) {
14162
15234
  return Math.floor(distance / PRECISION) * drain * haulCount;
14163
15235
  }
14164
15236
 
@@ -14380,7 +15452,6 @@ const ENTITY_HULL_SLOTS = {
14380
15452
  0: { capability: 'Storage', attribute: 'capacity' },
14381
15453
  1: { capability: 'Hull', attribute: 'mass' },
14382
15454
  2: { capability: 'Storage', attribute: 'capacity' },
14383
- 3: { capability: 'Storage', attribute: 'capacity' },
14384
15455
  };
14385
15456
  const SLOT_FORMULAS = {
14386
15457
  engine: {
@@ -14547,6 +15618,56 @@ function allPlotBuildableItems() {
14547
15618
  return getItems().filter((item) => isPlotBuildable(item.id));
14548
15619
  }
14549
15620
 
15621
+ function rollupGatherer(lanes) {
15622
+ if (lanes.length === 0)
15623
+ return undefined;
15624
+ let totalYield = 0;
15625
+ let totalDrain = 0;
15626
+ let maxDepth = 0;
15627
+ for (const l of lanes) {
15628
+ totalYield += Number(l.yield);
15629
+ totalDrain += Number(l.drain);
15630
+ const d = Number(l.depth);
15631
+ if (d > maxDepth)
15632
+ maxDepth = d;
15633
+ }
15634
+ return {
15635
+ yield: antelope.UInt16.from(Math.min(totalYield, 65535)),
15636
+ drain: antelope.UInt32.from(totalDrain),
15637
+ depth: antelope.UInt16.from(maxDepth),
15638
+ };
15639
+ }
15640
+ function rollupCrafter(lanes) {
15641
+ if (lanes.length === 0)
15642
+ return undefined;
15643
+ let totalSpeed = 0;
15644
+ let totalDrain = 0;
15645
+ for (const l of lanes) {
15646
+ totalSpeed += Number(l.speed);
15647
+ totalDrain += Number(l.drain);
15648
+ }
15649
+ return {
15650
+ speed: antelope.UInt16.from(Math.min(totalSpeed, 65535)),
15651
+ drain: antelope.UInt32.from(totalDrain),
15652
+ };
15653
+ }
15654
+ function rollupLoaders(lanes) {
15655
+ if (lanes.length === 0)
15656
+ return undefined;
15657
+ const count = lanes.length;
15658
+ let totalMass = 0;
15659
+ let totalThrust = 0;
15660
+ for (const l of lanes) {
15661
+ totalMass += Number(l.mass);
15662
+ totalThrust += Number(l.thrust);
15663
+ }
15664
+ return {
15665
+ mass: antelope.UInt32.from(Math.floor(totalMass / count)),
15666
+ thrust: antelope.UInt16.from(Math.min(totalThrust, 65535)),
15667
+ quantity: antelope.UInt8.from(count),
15668
+ };
15669
+ }
15670
+
14550
15671
  function toNum(v) {
14551
15672
  return Number(antelope.UInt16.from(v).value.toString());
14552
15673
  }
@@ -14737,7 +15858,12 @@ function resolveEntity(id, stats, modules) {
14737
15858
  let attributes;
14738
15859
  let moduleSlots;
14739
15860
  if (stats !== undefined) {
14740
- const decoded = decodeCraftedItemStats(id, toBigStats(stats));
15861
+ const bigStats = toBigStats(stats);
15862
+ const decoded = decodeCraftedItemStats(id, bigStats);
15863
+ if (decoded.strength === undefined)
15864
+ decoded.strength = decodeStat(bigStats, 0);
15865
+ if (decoded.hardness === undefined)
15866
+ decoded.hardness = decodeStat(bigStats, 2);
14741
15867
  const hullCaps = hullCapsForEntity(id, decoded);
14742
15868
  attributes = [
14743
15869
  {
@@ -14934,164 +16060,6 @@ function renderDescription(desc, options) {
14934
16060
  return spans;
14935
16061
  }
14936
16062
 
14937
- function idiv(a, b) {
14938
- return Math.floor(a / b);
14939
- }
14940
- function computeBaseHullmass(stats) {
14941
- const density = decodeStat(stats, 1);
14942
- return 100000 - 75 * density;
14943
- }
14944
- function computeBaseCapacityShip(stats) {
14945
- const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
14946
- return Math.floor(5000000 * 6 ** (s / 2997));
14947
- }
14948
- function computeBaseCapacityWarehouse(stats) {
14949
- const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
14950
- return Math.floor(100000000 * 6 ** (s / 2997));
14951
- }
14952
- const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
14953
- const computeEngineDrain = (thm) => 2 * Math.max(30, 50 - idiv(thm, 70));
14954
- const computeGeneratorCap = (com) => 950 + idiv(com, 2);
14955
- const computeGeneratorRech = (fin) => 2 * (1 + idiv(fin * 3, 1000));
14956
- const computeGathererYield = (str) => 200 + str;
14957
- const computeGathererDrain = (con) => 2 * Math.max(250, 1250 - idiv(con * 25, 20));
14958
- const computeGathererDepth = (tol, tier) => gathererDepthForTier(tol, tier);
14959
- const computeLoaderMass = (ins) => Math.max(200, 2000 - ins * 2);
14960
- const computeLoaderThrust = (pla) => 1 + idiv(pla * pla, 10000);
14961
- const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
14962
- const computeCrafterDrain = (fin) => Math.max(5, 30 - idiv(fin, 33));
14963
- const computeHaulerCapacity = (fin) => Math.max(1, 1 + idiv(fin, 400));
14964
- const computeHaulerEfficiency = (con) => 2000 + con * 6;
14965
- const computeHaulerDrain = (com) => Math.max(3, 15 - idiv(com, 80));
14966
- const computeWarpRange = (stat) => 100 + stat * 3;
14967
- function entityDisplayName(itemId) {
14968
- switch (itemId) {
14969
- case ITEM_SHIP_T1_PACKED:
14970
- return 'Ship';
14971
- case ITEM_WAREHOUSE_T1_PACKED:
14972
- return 'Warehouse';
14973
- case ITEM_EXTRACTOR_T1_PACKED:
14974
- return 'Extractor';
14975
- case ITEM_CONTAINER_T1_PACKED:
14976
- return 'Container';
14977
- case ITEM_CONTAINER_T2_PACKED:
14978
- return 'Container';
14979
- default:
14980
- return 'Entity';
14981
- }
14982
- }
14983
- function moduleDisplayName(itemId) {
14984
- switch (itemId) {
14985
- case ITEM_ENGINE_T1:
14986
- return 'Engine';
14987
- case ITEM_GENERATOR_T1:
14988
- return 'Generator';
14989
- case ITEM_GATHERER_T1:
14990
- return 'Gatherer';
14991
- case ITEM_LOADER_T1:
14992
- return 'Loader';
14993
- case ITEM_CRAFTER_T1:
14994
- return 'Crafter';
14995
- case ITEM_STORAGE_T1:
14996
- return 'Storage';
14997
- case ITEM_HAULER_T1:
14998
- return 'Hauler';
14999
- case ITEM_WARP_T1:
15000
- return 'Warp';
15001
- default:
15002
- return 'Module';
15003
- }
15004
- }
15005
- function formatModuleLine(slot, itemId, stats) {
15006
- let out = `Slot ${slot} - `;
15007
- if (itemId === 0) {
15008
- out += '(empty)';
15009
- return out;
15010
- }
15011
- out += moduleDisplayName(itemId);
15012
- const subtype = getModuleCapabilityType(itemId);
15013
- switch (subtype) {
15014
- case MODULE_ENGINE: {
15015
- const vol = decodeStat(stats, 0);
15016
- const thm = decodeStat(stats, 1);
15017
- out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`;
15018
- break;
15019
- }
15020
- case MODULE_GENERATOR: {
15021
- const res = decodeStat(stats, 0);
15022
- const ref = decodeStat(stats, 1);
15023
- out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`;
15024
- break;
15025
- }
15026
- case MODULE_GATHERER: {
15027
- const str = decodeStat(stats, 0);
15028
- const tol = decodeStat(stats, 1);
15029
- const con = decodeStat(stats, 2);
15030
- const tier = getItem(itemId).tier;
15031
- out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol, tier)} Drain ${computeGathererDrain(con)}`;
15032
- break;
15033
- }
15034
- case MODULE_LOADER: {
15035
- const fin = decodeStat(stats, 0);
15036
- const pla = decodeStat(stats, 1);
15037
- out += ` Mass ${computeLoaderMass(fin)} Thrust ${computeLoaderThrust(pla)}`;
15038
- break;
15039
- }
15040
- case MODULE_CRAFTER: {
15041
- const rea = decodeStat(stats, 0);
15042
- const com = decodeStat(stats, 1);
15043
- out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(com)}`;
15044
- break;
15045
- }
15046
- case MODULE_STORAGE: {
15047
- const str = decodeStat(stats, 0);
15048
- const fin = decodeStat(stats, 2);
15049
- const sat = decodeStat(stats, 3);
15050
- const sum = str + fin + sat;
15051
- const pct = 10 + idiv(sum * 10, 2997);
15052
- out += ` +${pct}% capacity`;
15053
- break;
15054
- }
15055
- case MODULE_HAULER: {
15056
- const res = decodeStat(stats, 0);
15057
- const pla = decodeStat(stats, 1);
15058
- const ref = decodeStat(stats, 2);
15059
- out += ` Capacity ${computeHaulerCapacity(res)} Efficiency ${computeHaulerEfficiency(pla)} Drain ${computeHaulerDrain(ref)}`;
15060
- break;
15061
- }
15062
- case MODULE_WARP: {
15063
- const stat = decodeStat(stats, 0);
15064
- out += ` Range ${computeWarpRange(stat)}`;
15065
- break;
15066
- }
15067
- }
15068
- return out;
15069
- }
15070
- function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
15071
- const hullMass = computeBaseHullmass(hullStats);
15072
- let baseCapacity = 0;
15073
- if (itemId === ITEM_SHIP_T1_PACKED) {
15074
- baseCapacity = computeBaseCapacityShip(hullStats);
15075
- }
15076
- else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
15077
- baseCapacity = computeBaseCapacityWarehouse(hullStats);
15078
- }
15079
- else if (itemId === ITEM_EXTRACTOR_T1_PACKED) {
15080
- baseCapacity = computeBaseCapacityShip(hullStats);
15081
- }
15082
- let out = entityDisplayName(itemId);
15083
- out += ` - Hull ${hullMass} mass`;
15084
- if (baseCapacity > 0) {
15085
- out += ` * ${baseCapacity} capacity`;
15086
- }
15087
- out += '\n\n';
15088
- for (let i = 0; i < moduleItems.length; i++) {
15089
- out += formatModuleLine(i, moduleItems[i], moduleStats[i] ?? 0n);
15090
- out += '\n';
15091
- }
15092
- return out;
15093
- }
15094
-
15095
16063
  function moduleSlotsForImmutable(modules) {
15096
16064
  return modules.map((m) => ({
15097
16065
  type: Number(m.type.toString()),
@@ -15245,7 +16213,7 @@ function buildModuleImmutable(itemId, quantity, stats, originX, originY) {
15245
16213
  base.push({ first: 'reflectivity', second: ['uint16', ref] });
15246
16214
  base.push({ first: 'capacity', second: ['uint8', computeHaulerCapacity(res)] });
15247
16215
  base.push({ first: 'efficiency', second: ['uint16', computeHaulerEfficiency(pla)] });
15248
- base.push({ first: 'drain', second: ['uint16', computeHaulerDrain(ref)] });
16216
+ base.push({ first: 'drain', second: ['uint16', computeHaulerDrain$1(ref)] });
15249
16217
  break;
15250
16218
  }
15251
16219
  }
@@ -15300,6 +16268,8 @@ var index = /*#__PURE__*/Object.freeze({
15300
16268
  deserializeAsset: deserializeAsset,
15301
16269
  computeBaseHullmass: computeBaseHullmass,
15302
16270
  computeBaseCapacityShip: computeBaseCapacityShip,
16271
+ computeBaseCapacityContainer: computeBaseCapacityContainer,
16272
+ computeBaseCapacityContainerT2: computeBaseCapacityContainerT2,
15303
16273
  computeBaseCapacityWarehouse: computeBaseCapacityWarehouse,
15304
16274
  computeEngineThrust: computeEngineThrust,
15305
16275
  computeEngineDrain: computeEngineDrain,
@@ -15314,7 +16284,7 @@ var index = /*#__PURE__*/Object.freeze({
15314
16284
  computeCrafterDrain: computeCrafterDrain,
15315
16285
  computeHaulerCapacity: computeHaulerCapacity,
15316
16286
  computeHaulerEfficiency: computeHaulerEfficiency,
15317
- computeHaulerDrain: computeHaulerDrain,
16287
+ computeHaulerDrain: computeHaulerDrain$1,
15318
16288
  computeWarpRange: computeWarpRange,
15319
16289
  entityDisplayName: entityDisplayName,
15320
16290
  moduleDisplayName: moduleDisplayName,
@@ -15414,6 +16384,77 @@ function describeItem(resolved, opts) {
15414
16384
  return `${tier} ${resolved.name} · ${mass}`;
15415
16385
  }
15416
16386
 
16387
+ const PLAN_ITEM_MASS = GATHER_MASS_DIVISOR;
16388
+ const PLAN_RICHNESS = 1000;
16389
+ const MAX_PLAN_QTY = 10000;
16390
+ function gatherEnergyCost(lane, quantity, stratum) {
16391
+ const stats = lane;
16392
+ const dur = Number(calc_gather_duration(stats, PLAN_ITEM_MASS, quantity, stratum, PLAN_RICHNESS));
16393
+ return Number(calc_gather_energy(stats, dur));
16394
+ }
16395
+ function allocateProportional(lanes, total) {
16396
+ if (lanes.length === 0)
16397
+ return [];
16398
+ const weightSum = lanes.reduce((s, l) => s + l.weight, 0);
16399
+ if (weightSum === 0)
16400
+ return [];
16401
+ const entries = lanes.map((l) => ({
16402
+ slot: l.slot,
16403
+ quantity: Math.floor((total * l.weight) / weightSum),
16404
+ }));
16405
+ let remainder = total - entries.reduce((s, e) => s + e.quantity, 0);
16406
+ for (let i = 0; remainder > 0; i = (i + 1) % entries.length) {
16407
+ entries[i].quantity++;
16408
+ remainder--;
16409
+ }
16410
+ return entries;
16411
+ }
16412
+ function planParallelGather(entity, target, stratum, now) {
16413
+ const reaching = entity.gatherer_lanes.filter((l) => l.depth.toNumber() >= stratum);
16414
+ if (reaching.length === 0)
16415
+ throw new Error('no gatherer reaches this stratum');
16416
+ const energy = entity.generator ? Number(projectRemainingAt(entity).energy) : Infinity;
16417
+ const requestedQty = target === 'max' ? MAX_PLAN_QTY : target.quantity;
16418
+ let activeLanes = reaching.slice().sort((a, b) => a.yield.toNumber() - b.yield.toNumber());
16419
+ while (activeLanes.length > 0) {
16420
+ const laneWeights = activeLanes.map((l) => ({
16421
+ slot: l.slot_index.toNumber(),
16422
+ weight: l.yield.toNumber(),
16423
+ }));
16424
+ const proposed = allocateProportional(laneWeights, requestedQty);
16425
+ const totalEnergyCost = proposed.reduce((sum, entry) => {
16426
+ const lane = activeLanes.find((l) => l.slot_index.toNumber() === entry.slot);
16427
+ return sum + gatherEnergyCost(lane, entry.quantity, stratum);
16428
+ }, 0);
16429
+ if (totalEnergyCost <= energy) {
16430
+ return proposed.filter((e) => e.quantity > 0);
16431
+ }
16432
+ if (activeLanes.length === 1) {
16433
+ const lane = activeLanes[0];
16434
+ const energyPerUnit = gatherEnergyCost(lane, 1, stratum);
16435
+ if (energyPerUnit === 0)
16436
+ return proposed.filter((e) => e.quantity > 0);
16437
+ const maxQty = Math.min(requestedQty, Math.floor(energy / energyPerUnit));
16438
+ if (maxQty <= 0)
16439
+ return [];
16440
+ return [{ slot: lane.slot_index.toNumber(), quantity: maxQty }];
16441
+ }
16442
+ activeLanes = activeLanes.slice(1);
16443
+ }
16444
+ return [];
16445
+ }
16446
+ function planParallelTransfer(entity, target) {
16447
+ const lanes = entity.loader_lanes.filter((l) => l.thrust.toNumber() > 0);
16448
+ if (lanes.length === 0)
16449
+ return [];
16450
+ const requestedQty = target === 'max' ? MAX_PLAN_QTY : target.quantity;
16451
+ const laneWeights = lanes.map((l) => ({
16452
+ slot: l.slot_index.toNumber(),
16453
+ weight: l.thrust.toNumber(),
16454
+ }));
16455
+ return allocateProportional(laneWeights, requestedQty).filter((e) => e.quantity > 0);
16456
+ }
16457
+
15417
16458
  exports.ALL_ENTITY_TYPES = ALL_ENTITY_TYPES;
15418
16459
  exports.ATOMICASSETS_ACCOUNT = ATOMICASSETS_ACCOUNT;
15419
16460
  exports.ActionsManager = ActionsManager;
@@ -15434,6 +16475,9 @@ exports.COMPANY_NOT_FOUND = COMPANY_NOT_FOUND;
15434
16475
  exports.COMPONENT_TIER_PREFIXES = COMPONENT_TIER_PREFIXES;
15435
16476
  exports.CONTAINER_NOT_FOUND = CONTAINER_NOT_FOUND;
15436
16477
  exports.CONTAINER_Z = CONTAINER_Z;
16478
+ exports.COORD_MAX = COORD_MAX;
16479
+ exports.COORD_MIN = COORD_MIN;
16480
+ exports.COORD_OFFSET = COORD_OFFSET;
15437
16481
  exports.CRAFT_ENERGY_DIVISOR = CRAFT_ENERGY_DIVISOR;
15438
16482
  exports.CRAFT_EXCEEDS_ENERGY_CAPACITY = CRAFT_EXCEEDS_ENERGY_CAPACITY;
15439
16483
  exports.CRAFT_NOT_ENOUGH_ENERGY = CRAFT_NOT_ENOUGH_ENERGY;
@@ -15476,6 +16520,7 @@ exports.GAME_SEED_NOT_SET = GAME_SEED_NOT_SET;
15476
16520
  exports.GATHERER_DEPTH_MAX_TIER = GATHERER_DEPTH_MAX_TIER;
15477
16521
  exports.GATHERER_DEPTH_TABLE = GATHERER_DEPTH_TABLE;
15478
16522
  exports.GATHER_EXCEEDS_ENERGY_CAPACITY = GATHER_EXCEEDS_ENERGY_CAPACITY;
16523
+ exports.GATHER_MASS_DIVISOR = GATHER_MASS_DIVISOR;
15479
16524
  exports.GATHER_NOT_ENOUGH_ENERGY = GATHER_NOT_ENOUGH_ENERGY;
15480
16525
  exports.GROUP_DUPLICATE_ENTITY = GROUP_DUPLICATE_ENTITY;
15481
16526
  exports.GROUP_EMPTY = GROUP_EMPTY;
@@ -15578,6 +16623,7 @@ exports.ITEM_WARP_T1 = ITEM_WARP_T1;
15578
16623
  exports.InventoryAccessor = InventoryAccessor;
15579
16624
  exports.LANE_BARRIER = LANE_BARRIER;
15580
16625
  exports.LANE_MOBILITY = LANE_MOBILITY;
16626
+ exports.LOCAL_HALF = LOCAL_HALF;
15581
16627
  exports.LOCATION_MAX_DEPTH = LOCATION_MAX_DEPTH;
15582
16628
  exports.LOCATION_MIN_DEPTH = LOCATION_MIN_DEPTH;
15583
16629
  exports.Location = Location;
@@ -15629,11 +16675,15 @@ exports.RECIPE_INPUTS_INSUFFICIENT = RECIPE_INPUTS_INSUFFICIENT;
15629
16675
  exports.RECIPE_INPUTS_INVALID = RECIPE_INPUTS_INVALID;
15630
16676
  exports.RECIPE_INPUTS_MIXED = RECIPE_INPUTS_MIXED;
15631
16677
  exports.RECIPE_NOT_FOUND = RECIPE_NOT_FOUND;
16678
+ exports.REGION_DIV = REGION_DIV;
16679
+ exports.REGION_PER_AXIS = REGION_PER_AXIS;
15632
16680
  exports.REQUIRES_MORE_THAN_ONE = REQUIRES_MORE_THAN_ONE;
15633
16681
  exports.REQUIRES_POSITIVE_VALUE = REQUIRES_POSITIVE_VALUE;
15634
16682
  exports.RESERVE_TIERS = RESERVE_TIERS;
15635
16683
  exports.RESOLVE_COUNT_EXCEEDS_COMPLETED = RESOLVE_COUNT_EXCEEDS_COMPLETED;
15636
16684
  exports.RESOURCE_TIER_ADJECTIVES = RESOURCE_TIER_ADJECTIVES;
16685
+ exports.SECTORS_PER_AXIS = SECTORS_PER_AXIS;
16686
+ exports.SECTOR_DIV = SECTOR_DIV;
15637
16687
  exports.SHIPLOAD_COLLECTION = SHIPLOAD_COLLECTION;
15638
16688
  exports.SHIP_ALREADY_TRAVELING = SHIP_ALREADY_TRAVELING;
15639
16689
  exports.SHIP_CANNOT_BUY_TRAVELING = SHIP_CANNOT_BUY_TRAVELING;
@@ -15660,9 +16710,13 @@ exports.WARP_HAS_SCHEDULE = WARP_HAS_SCHEDULE;
15660
16710
  exports.WARP_NOT_FULL_ENERGY = WARP_NOT_FULL_ENERGY;
15661
16711
  exports.WARP_NO_CAPABILITY = WARP_NO_CAPABILITY;
15662
16712
  exports.WARP_OUT_OF_RANGE = WARP_OUT_OF_RANGE;
16713
+ exports.WH = WH;
16714
+ exports.WOULD_OVERFILL = WOULD_OVERFILL;
16715
+ exports.WOULD_STRAND = WOULD_STRAND;
15663
16716
  exports.WebSocketConnection = WebSocketConnection;
15664
16717
  exports.YIELD_FRACTION_DEEP = YIELD_FRACTION_DEEP;
15665
16718
  exports.YIELD_FRACTION_SHALLOW = YIELD_FRACTION_SHALLOW;
16719
+ exports.addressFromCoordinates = addressFromCoordinates;
15666
16720
  exports.allBuildableItems = allBuildableItems;
15667
16721
  exports.allPlotBuildableItems = allPlotBuildableItems;
15668
16722
  exports.availableBuildMethods = availableBuildMethods;
@@ -15695,6 +16749,7 @@ exports.calc_gather_energy = calc_gather_energy;
15695
16749
  exports.calc_gather_rate = calc_gather_rate;
15696
16750
  exports.calc_loader_acceleration = calc_loader_acceleration;
15697
16751
  exports.calc_loader_flighttime = calc_loader_flighttime;
16752
+ exports.calc_onesided_duration = calc_onesided_duration;
15698
16753
  exports.calc_orbital_altitude = calc_orbital_altitude;
15699
16754
  exports.calc_rechargetime = calc_rechargetime;
15700
16755
  exports.calc_ship_acceleration = calc_ship_acceleration;
@@ -15702,11 +16757,13 @@ exports.calc_ship_flighttime = calc_ship_flighttime;
15702
16757
  exports.calc_ship_mass = calc_ship_mass;
15703
16758
  exports.calc_ship_rechargetime = calc_ship_rechargetime;
15704
16759
  exports.calc_transfer_duration = calc_transfer_duration;
16760
+ exports.calc_transit_duration = calc_transit_duration;
15705
16761
  exports.calculateFlightTime = calculateFlightTime;
15706
16762
  exports.calculateLoadTimeBreakdown = calculateLoadTimeBreakdown;
15707
16763
  exports.calculateRefuelingTime = calculateRefuelingTime;
15708
16764
  exports.calculateTransferTime = calculateTransferTime;
15709
16765
  exports.canMove = canMove;
16766
+ exports.cancelEligibility = cancelEligibility;
15710
16767
  exports.candidateLaneCompletesAt = candidateLaneCompletesAt;
15711
16768
  exports.capabilityAttributes = capabilityAttributes;
15712
16769
  exports.capabilityNames = capabilityNames;
@@ -15754,7 +16811,7 @@ exports.computeGeneratorRech = computeGeneratorRech;
15754
16811
  exports.computeHaulPenalty = computeHaulPenalty;
15755
16812
  exports.computeHaulerCapabilities = computeHaulerCapabilities;
15756
16813
  exports.computeHaulerCapacity = computeHaulerCapacity;
15757
- exports.computeHaulerDrain = computeHaulerDrain$1;
16814
+ exports.computeHaulerDrain = computeHaulerDrain;
15758
16815
  exports.computeHaulerEfficiency = computeHaulerEfficiency;
15759
16816
  exports.computeInputMass = computeInputMass;
15760
16817
  exports.computeLoaderCapabilities = computeLoaderCapabilities;
@@ -15770,8 +16827,11 @@ exports.coordsToLocationId = coordsToLocationId;
15770
16827
  exports.createInventoryAccessor = createInventoryAccessor;
15771
16828
  exports.createProjectedEntity = createProjectedEntity;
15772
16829
  exports.createScheduleAccessor = createScheduleAccessor;
16830
+ exports.decodeAddress = decodeAddress;
15773
16831
  exports.decodeAtomicAsset = decodeAtomicAsset;
15774
16832
  exports.decodeCraftedItemStats = decodeCraftedItemStats;
16833
+ exports.decodeRegion = decodeRegion;
16834
+ exports.decodeSector = decodeSector;
15775
16835
  exports.decodeStat = decodeStat;
15776
16836
  exports.decodeStats = decodeStats;
15777
16837
  exports["default"] = Shipload;
@@ -15796,13 +16856,19 @@ exports.displayName = displayName;
15796
16856
  exports.distanceBetweenCoordinates = distanceBetweenCoordinates;
15797
16857
  exports.distanceBetweenPoints = distanceBetweenPoints;
15798
16858
  exports.easeFlightProgress = easeFlightProgress;
16859
+ exports.encodeAddress = encodeAddress;
16860
+ exports.encodeAddressMemo = encodeAddressMemo;
15799
16861
  exports.encodeGatheredCargoStats = encodeGatheredCargoStats;
16862
+ exports.encodeRegion = encodeRegion;
16863
+ exports.encodeSector = encodeSector;
15800
16864
  exports.encodeStats = encodeStats;
15801
16865
  exports.energyAtTime = energyAtTime;
15802
16866
  exports.energyPercent = energyPercent;
15803
16867
  exports.entityDisplayName = entityDisplayName;
15804
16868
  exports.estimateDealTravelTime = estimateDealTravelTime;
15805
16869
  exports.estimateTravelTime = estimateTravelTime;
16870
+ exports.feistel = feistel;
16871
+ exports.feistelInv = feistelInv;
15806
16872
  exports.fetchAtomicAssetsForOwner = fetchAtomicAssetsForOwner;
15807
16873
  exports.fetchAtomicSchemas = fetchAtomicSchemas;
15808
16874
  exports.filterByBuildMethod = filterByBuildMethod;
@@ -15833,6 +16899,7 @@ exports.getItem = getItem;
15833
16899
  exports.getItems = getItems;
15834
16900
  exports.getKindMeta = getKindMeta;
15835
16901
  exports.getLocationCandidates = getLocationCandidates;
16902
+ exports.getLocationKind = getLocationKind;
15836
16903
  exports.getLocationProfile = getLocationProfile;
15837
16904
  exports.getLocationType = getLocationType;
15838
16905
  exports.getLocationTypeName = getLocationTypeName;
@@ -15883,6 +16950,7 @@ exports.isPlotBuildable = isPlotBuildable;
15883
16950
  exports.isRelatedItem = isRelatedItem;
15884
16951
  exports.isShip = isShip;
15885
16952
  exports.isSubscriptionsDebugEnabled = isSubscriptionsDebugEnabled;
16953
+ exports.isValidWormholePair = isValidWormholePair;
15886
16954
  exports.isWarehouse = isWarehouse;
15887
16955
  exports.itemAbbreviations = itemAbbreviations;
15888
16956
  exports.itemCategory = itemCategory;
@@ -15905,22 +16973,33 @@ exports.moduleSlotTypeToCode = moduleSlotTypeToCode;
15905
16973
  exports.needsRecharge = needsRecharge;
15906
16974
  exports.normalizeDisplayName = normalizeDisplayName;
15907
16975
  exports.parseWireEntity = parseWireEntity;
16976
+ exports.partnerRegion = partnerRegion;
16977
+ exports.planParallelGather = planParallelGather;
16978
+ exports.planParallelTransfer = planParallelTransfer;
15908
16979
  exports.projectEntity = projectEntity;
15909
16980
  exports.projectEntityAt = projectEntityAt;
15910
16981
  exports.projectRemainingAt = projectRemainingAt;
15911
16982
  exports.projectedCargoAvailableAt = projectedCargoAvailableAt;
15912
16983
  exports.rawScheduleEnd = rawScheduleEnd;
15913
16984
  exports.readCommonBase = readCommonBase;
16985
+ exports.regionOf = regionOf;
15914
16986
  exports.removeFromStacks = removeFromStacks;
15915
16987
  exports.renderDescription = renderDescription;
15916
16988
  exports.resolveItem = resolveItem;
15917
16989
  exports.resolveItemCategory = resolveItemCategory;
16990
+ exports.resolveLaneCrafter = resolveLaneCrafter;
16991
+ exports.resolveLaneGatherer = resolveLaneGatherer;
16992
+ exports.resolveLaneLoader = resolveLaneLoader;
15918
16993
  exports.resolveLockedAmount = resolveLockedAmount;
15919
16994
  exports.resolveStats = resolveStats;
15920
16995
  exports.rollTier = rollTier;
15921
16996
  exports.rollWithinTier = rollWithinTier;
16997
+ exports.rollupCrafter = rollupCrafter;
16998
+ exports.rollupGatherer = rollupGatherer;
16999
+ exports.rollupLoaders = rollupLoaders;
15922
17000
  exports.rotation = rotation;
15923
17001
  exports.schedule = schedule;
17002
+ exports.selectGatherLane = selectGatherLane;
15924
17003
  exports.setSubscriptionsDebug = setSubscriptionsDebug;
15925
17004
  exports.stackKey = stackKey;
15926
17005
  exports.stackToCargoItem = stackToCargoItem;
@@ -15939,5 +17018,7 @@ exports.typeLabel = typeLabel;
15939
17018
  exports.validateDisplayName = validateDisplayName;
15940
17019
  exports.validateSchedule = validateSchedule;
15941
17020
  exports.workerLaneKey = workerLaneKey;
17021
+ exports.wormholeAt = wormholeAt;
17022
+ exports.wormholeAtRegionEndpoint = wormholeAtRegionEndpoint;
15942
17023
  exports.yieldThresholdAt = yieldThresholdAt;
15943
17024
  //# sourceMappingURL=shipload.js.map