@shipload/sdk 2.0.0-rc13 → 2.0.0-rc15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/shipload.m.js CHANGED
@@ -205,7 +205,7 @@ var platform = /*#__PURE__*/Object.freeze({
205
205
  Contract: Contract$1
206
206
  });
207
207
 
208
- const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDh0CWFkZG1vZHVsZQAFC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAxtb2R1bGVfaW5kZXgFdWludDgPbW9kdWxlX2NhcmdvX2lkBnVpbnQ2NA90YXJnZXRfY2FyZ29faWQGdWludDY0CGFkZG5leHVzAAMKbmV4dXNfbmFtZQZzdHJpbmcBeAVpbnQ2NAF5BWludDY0B2FkdmFuY2UAAgZyZXZlYWwGc3RyaW5nBmNvbW1pdAtjaGVja3N1bTI1NgVibGVuZAADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BmlucHV0cwxjYXJnb19pdGVtW10GY2FuY2VsAAMLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABAdpdGVtX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIEc2VlZAd1aW50NjQ/B21vZHVsZXMObW9kdWxlX2VudHJ5W10JY2FyZ29fcm93AAYCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BHNlZWQGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10KY2FyZ29fc2VlZAACB2l0ZW1faWQGdWludDE2BHNlZWQGdWludDY0CWNsZWFucnN2cAACBWVwb2NoBnVpbnQ2NAhtYXhfcm93cwZ1aW50NjQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BmNvbW1pdAABBmNvbW1pdAtjaGVja3N1bTI1Ngljb25maWdsb2cAAQZjb25maWcLZ2FtZV9jb25maWcNY29udGFpbmVyX3JvdwAIAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzBnVpbnQzMghjYXBhY2l0eQZ1aW50MzIJY2FyZ29tYXNzBnVpbnQzMghzY2hlZHVsZQlzY2hlZHVsZT8LY29vcmRpbmF0ZXMAAwF4BWludDY0AXkFaW50NjQBegd1aW50MTY/BWNyYWZ0AAULZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIGaW5wdXRzDGNhcmdvX2l0ZW1bXQ1jcmFmdGVyX3N0YXRzAAIFc3BlZWQGdWludDE2BWRyYWluBnVpbnQxNgxjcmVhdGVlbnRpdHkABQVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWULZW50aXR5X25hbWUGc3RyaW5nAXgFaW50NjQBeQVpbnQ2NAZkZXBsb3kABQtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NA5wYWNrZWRfaXRlbV9pZAZ1aW50MTYEc2VlZAZ1aW50NjQLZW50aXR5X25hbWUGc3RyaW5nCmRlc2NlbnRpdHkABAdpdGVtX2lkBnVpbnQxNglodWxsX3NlZWQGdWludDY0DG1vZHVsZV9pdGVtcwh1aW50MTZbXQxtb2R1bGVfc2VlZHMIdWludDY0W10GZW5hYmxlAAEHZW5hYmxlZARib29sDGVuZXJneV9zdGF0cwACCGNhcGFjaXR5BnVpbnQxNghyZWNoYXJnZQZ1aW50MTYUZW50aXR5X2N1cnJlbnRfc3RhdGUAAgtjb29yZGluYXRlcwtjb29yZGluYXRlcwZlbmVyZ3kGdWludDE2D2VudGl0eV9kZWZhdWx0cwAFEndhcmVob3VzZV9jYXBhY2l0eQZ1aW50MzILd2FyZWhvdXNlX3oGdWludDE2EmNvbnRhaW5lcl9odWxsbWFzcwZ1aW50MzISY29udGFpbmVyX2NhcGFjaXR5BnVpbnQzMgtjb250YWluZXJfegZ1aW50MTYLZW50aXR5X2luZm8AGAR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCWNhcmdvbWFzcwZ1aW50MzIFY2FyZ28MY2FyZ29faXRlbVtdB2xvYWRlcnMNbG9hZGVyX3N0YXRzPwZlbmVyZ3kHdWludDE2PwhodWxsbWFzcwd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/CWdlbmVyYXRvcg1lbmVyZ3lfc3RhdHM/CGNhcGFjaXR5B3VpbnQzMj8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwdpc19pZGxlBGJvb2wMY3VycmVudF90YXNrBXRhc2s/FGN1cnJlbnRfdGFza19lbGFwc2VkBnVpbnQzMhZjdXJyZW50X3Rhc2tfcmVtYWluaW5nBnVpbnQzMg1wZW5kaW5nX3Rhc2tzBnRhc2tbXQdpZGxlX2F0C3RpbWVfcG9pbnQ/CHNjaGVkdWxlCXNjaGVkdWxlPwplbnRpdHlfcmVmAAILZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0DmVudGl0eV9zdW1tYXJ5AAgEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwdpc19pZGxlBGJvb2wOcmVzb2x2ZWRfY291bnQGdWludDMyDXBlbmRpbmdfY291bnQGdWludDMyEGVudGl0eV90YXNrX2luZm8ABAllbnRpdHlfaWQGdWludDY0C2VudGl0eV90eXBlBG5hbWUKdGFza19jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkCnRpbWVfcG9pbnQPZW50aXR5Z3JvdXBfcm93AAICaWQGdWludDY0DHBhcnRpY2lwYW50cwxlbnRpdHlfcmVmW10LZ2FtZV9jb25maWcAAwd2ZXJzaW9uBnVpbnQzMghkZWZhdWx0cw9lbnRpdHlfZGVmYXVsdHMFaXRlbXMKaXRlbV9kZWZbXQZnYXRoZXIABAtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIOZ2F0aGVyZXJfc3RhdHMABAV5aWVsZAZ1aW50MTYFZHJhaW4GdWludDE2BWRlcHRoBnVpbnQxNgVzcGVlZAZ1aW50MTYJZ2V0Y29uZmlnAAALZ2V0ZW50aXRpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/CWdldGVudGl0eQACC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAtnZXRpdGVtZGF0YQAACGdldGl0ZW1zAAALZ2V0bG9jYXRpb24AAgF4BWludDY0AXkFaW50NjQKZ2V0bG9jZGF0YQACAXgFaW50NjQBeQVpbnQ2NApnZXRtb2R1bGVzAAAJZ2V0bmVhcmJ5AAMLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CHJlY2hhcmdlBGJvb2wKZ2V0bmZ0aW5mbwAACWdldHBsYXllcgABB2FjY291bnQEbmFtZQlnZXRyZWNpcGUAAQ5vdXRwdXRfaXRlbV9pZAZ1aW50MTYKZ2V0cmVjaXBlcwACC2xvd2VyX2JvdW5kBnVpbnQxNgVsaW1pdAV1aW50OAxnZXRyZXNvdXJjZXMAAApnZXRzdHJhdHVtAAMBeAVpbnQ2NAF5BWludDY0B3N0cmF0dW0GdWludDE2DGdldHN1bW1hcmllcwACBW93bmVyBG5hbWULZW50aXR5X3R5cGUFbmFtZT8LZ3JvdXB0cmF2ZWwABAhlbnRpdGllcwxlbnRpdHlfcmVmW10BeAVpbnQ2NAF5BWludDY0CHJlY2hhcmdlBGJvb2wEaGFzaAABBXZhbHVlBnN0cmluZwdoYXNoNTEyAAEFdmFsdWUGc3RyaW5nDGhhdWxlcl9zdGF0cwADCGNhcGFjaXR5BXVpbnQ4CmVmZmljaWVuY3kGdWludDE2BWRyYWluBnVpbnQxNgRpbml0AAEEc2VlZAtjaGVja3N1bTI1NghpdGVtX2RlZgAFAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgR0eXBlBXVpbnQ4B3N1YnR5cGUFdWludDgEdGllcgV1aW50OA9pdGVtZGF0YV9yZXN1bHQAAgVpdGVtcwppdGVtX2RlZltdB3JlY2lwZXMOcmVjaXBlc19yZXN1bHQKaXRlbXNfaW5mbwABBWl0ZW1zCml0ZW1fZGVmW10Eam9pbgABB2FjY291bnQEbmFtZQxsb2FkZXJfc3RhdHMAAwRtYXNzBnVpbnQzMgZ0aHJ1c3QGdWludDE2CHF1YW50aXR5BXVpbnQ4EGxvY2F0aW9uX2Rlcml2ZWQAAwxzdGF0aWNfcHJvcHMPbG9jYXRpb25fc3RhdGljC2Vwb2NoX3Byb3BzDmxvY2F0aW9uX2Vwb2NoBHNpemUGdWludDE2DmxvY2F0aW9uX2Vwb2NoAAMGYWN0aXZlBGJvb2wFc2VlZDAFdWludDgFc2VlZDEFdWludDgNbG9jYXRpb25faW5mbwACBmNvb3Jkcwtjb29yZGluYXRlcwlpc19zeXN0ZW0EYm9vbAxsb2NhdGlvbl9yb3cABgJpZAZ1aW50NjQFb3duZXIEbmFtZQtjb29yZGluYXRlcwtjb29yZGluYXRlcwljYXJnb21hc3MGdWludDMyBWNhcmdvDGNhcmdvX2l0ZW1bXQhzY2hlZHVsZQlzY2hlZHVsZT8PbG9jYXRpb25fc3RhdGljAAUGY29vcmRzC2Nvb3JkaW5hdGVzBHR5cGUNbG9jYXRpb25fdHlwZQdzdWJ0eXBlBXVpbnQ4BXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DG1vZHVsZV9lbnRyeQACBHR5cGUFdWludDgJaW5zdGFsbGVkC2NhcmdvX3NlZWQ/C21vZHVsZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyC21vZHVsZV90eXBlBXVpbnQ4BHRpZXIFdWludDgObW9kdWxlc19yZXN1bHQAAQdtb2R1bGVzDW1vZHVsZV9pbmZvW10ObW92ZW1lbnRfc3RhdHMAAgZ0aHJ1c3QGdWludDMyBWRyYWluBnVpbnQxNgtuZWFyYnlfaW5mbwAFCmNhbl90cmF2ZWwEYm9vbAdjdXJyZW50FGVudGl0eV9jdXJyZW50X3N0YXRlCXByb2plY3RlZBRlbnRpdHlfY3VycmVudF9zdGF0ZQptYXhfZW5lcmd5BnVpbnQxNgdzeXN0ZW1zD25lYXJieV9zeXN0ZW1bXQ1uZWFyYnlfc3lzdGVtAAQIZGlzdGFuY2UGdWludDY0C2VuZXJneV9jb3N0BnVpbnQ2NAtmbGlnaHRfdGltZQZ1aW50MzIIbG9jYXRpb24NbG9jYXRpb25faW5mbwluZXh1c19yb3cABAJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcw5uZnRfc2NoZW1hX2RlZgACC3NjaGVtYV9uYW1lBG5hbWUGZmllbGRzDnNjaGVtYV9maWVsZFtdEG5mdF90ZW1wbGF0ZV9kZWYAAgdpdGVtX2lkBnVpbnQxNgtzY2hlbWFfbmFtZQRuYW1lDW5mdGNvbmZpZ19yb3cAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lDm5mdGluZm9fcmVzdWx0AAIHc2NoZW1hcxBuZnRfc2NoZW1hX2RlZltdCXRlbXBsYXRlcxJuZnRfdGVtcGxhdGVfZGVmW10Gbm90aWZ5AAEFZXZlbnQKdGFza19ldmVudAtwbGF5ZXJfaW5mbwAGBW93bmVyBG5hbWUJaXNfcGxheWVyBGJvb2wMY29tcGFueV9uYW1lBnN0cmluZwpzaGlwX2NvdW50BnVpbnQ2NA93YXJlaG91c2VfY291bnQGdWludDY0D2NvbnRhaW5lcl9jb3VudAZ1aW50NjQKcGxheWVyX3JvdwABBW93bmVyBG5hbWUIcmVjaGFyZ2UAAgtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAxyZWNpcGVfaW5wdXQAAwdpdGVtX2lkBnVpbnQxNghjYXRlZ29yeQV1aW50OAhxdWFudGl0eQZ1aW50MzIQcmVjaXBlX2l0ZW1faW5mbwACAmlkBnVpbnQxNgRtYXNzBnVpbnQzMg9yZWNpcGVfcmVzcG9uc2UABw5vdXRwdXRfaXRlbV9pZAZ1aW50MTYLb3V0cHV0X21hc3MGdWludDMyBmlucHV0cw5yZWNpcGVfaW5wdXRbXQpzdGF0X3Nsb3RzFHN0YXRfc2xvdF9yZXNwb25zZVtdDWJsZW5kX3dlaWdodHMFYnl0ZXMLb3V0cHV0X2l0ZW0QcmVjaXBlX2l0ZW1faW5mbwtpbnB1dF9pdGVtcxJyZWNpcGVfaXRlbV9pbmZvW10OcmVjaXBlc19yZXN1bHQAAQdyZWNpcGVzEXJlY2lwZV9yZXNwb25zZVtdC3Jlc2VydmVfcm93AAICaWQGdWludDY0CXJlbWFpbmluZwZ1aW50MzIHcmVzb2x2ZQADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/DXJlc291cmNlX2luZm8ABAJpZAZ1aW50MTYEbWFzcwZ1aW50MzIIY2F0ZWdvcnkFdWludDgEdGllcgV1aW50OA5yZXNvdXJjZV9zdGF0cwADBXN0YXQxBnVpbnQxNgVzdGF0MgZ1aW50MTYFc3RhdDMGdWludDE2EHJlc291cmNlc19yZXN1bHQAAQlyZXNvdXJjZXMPcmVzb3VyY2VfaW5mb1tdCHJtbW9kdWxlAAQLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OA90YXJnZXRfY2FyZ29faWQGdWludDY0CHJtbmZ0Y2ZnAAEHaXRlbV9pZAZ1aW50MTYEc2FsdAABBHNhbHQGdWludDY0CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQJc2V0bmZ0Y2ZnAAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQhzaGlwX3JvdwASAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nBHNlZWQGdWludDY0C2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzB3VpbnQzMj8IY2FwYWNpdHkHdWludDMyPwZlbmVyZ3kHdWludDE2PwljYXJnb21hc3MGdWludDMyB2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/CWdlbmVyYXRvcg1lbmVyZ3lfc3RhdHM/B2xvYWRlcnMNbG9hZGVyX3N0YXRzPwhnYXRoZXJlcg9nYXRoZXJlcl9zdGF0cz8Ed2FycAt3YXJwX3N0YXRzPwdjcmFmdGVyDmNyYWZ0ZXJfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/B21vZHVsZXMObW9kdWxlX2VudHJ5W10Ic2NoZWR1bGUJc2NoZWR1bGU/CnNwYXduY2FyZ28AAwllbnRpdHlfaWQGdWludDY0B2l0ZW1faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NAtzcGF3bnBhY2tlZAAECWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYJaHVsbF9zZWVkBnVpbnQ2NAlpbnN0YWxsZWQMY2FyZ29fc2VlZFtdC3NwYXduc2VlZGVkAAQJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQEc2VlZAZ1aW50NjQSc3RhdF9zbG90X3Jlc3BvbnNlAAEHc291cmNlcw1zdGF0X3NvdXJjZVtdC3N0YXRfc291cmNlAAILaW5wdXRfaW5kZXgFdWludDgQaW5wdXRfc3RhdF9pbmRleAV1aW50OAlzdGF0ZV9yb3cABgdlbmFibGVkBGJvb2wFZXBvY2gGdWludDMyBHNhbHQGdWludDY0BXNoaXBzBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2BmNvbW1pdAtjaGVja3N1bTI1NgxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABAdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzIEdGFzawAIBHR5cGUFdWludDgIZHVyYXRpb24GdWludDMyCmNhbmNlbGFibGUFdWludDgLY29vcmRpbmF0ZXMMY29vcmRpbmF0ZXM/BWNhcmdvDGNhcmdvX2l0ZW1bXQxlbnRpdHl0YXJnZXQLZW50aXR5X3JlZj8LZW50aXR5Z3JvdXAHdWludDY0PwtlbmVyZ3lfY29zdAd1aW50MTY/CnRhc2tfZXZlbnQACQpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDE2Pwx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10IdHJhbnNmZXIABgtzb3VyY2VfdHlwZQRuYW1lCXNvdXJjZV9pZAZ1aW50NjQJZGVzdF90eXBlBG5hbWUHZGVzdF9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyBnRyYXZlbAAFC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sCXR5cGVzX3JvdwADAmlkBnVpbnQ2NBNlbnRpdHlfc3VtbWFyeV90eXBlDmVudGl0eV9zdW1tYXJ5EGdhbWVfY29uZmlnX3R5cGULZ2FtZV9jb25maWcNd2FyZWhvdXNlX3JvdwALAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nBHNlZWQGdWludDY0C2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzB3VpbnQzMj8IY2FwYWNpdHkHdWludDMyPwljYXJnb21hc3MGdWludDMyB2xvYWRlcnMNbG9hZGVyX3N0YXRzPwdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHNjaGVkdWxlCXNjaGVkdWxlPwR3YXJwAAQLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQBeAVpbnQ2NAF5BWludDY0CndhcnBfc3RhdHMAAQVyYW5nZQZ1aW50MzIEd2lwZQAADHdpcGVzZXF1ZW5jZQAABHdyYXAABQVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhjYXJnb19pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0NAAAUFEnKlMyCWFkZG1vZHVsZccDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGFkZG1vZHVsZQpzdW1tYXJ5OiAnSW5zdGFsbCBhIG1vZHVsZSBpbnRvIGEgc2xvdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5zdGFsbCBhIG1vZHVsZSBmcm9tIGNhcmdvIGludG8gYSBtb2R1bGUgc2xvdCBvbiBhIGxpdmUgZW50aXR5IG9yIGEgcGFja2VkIGVudGl0eSBpbiBjYXJnby4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBubyBzY2hlZHVsZWQgdGFza3MuIFRoZSBtb2R1bGUgdHlwZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0IHNsb3QgdHlwZS4gVGhlIG1vZHVsZSBpdGVtIGlzIHJlbW92ZWQgZnJvbSBjYXJnbyB1cG9uIGluc3RhbGxhdGlvbi4AAABYdzVTMghhZGRuZXh1c6cDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGFkZG5leHVzCnN1bW1hcnk6ICdBZGQgYSBuZXh1cyBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ3JlYXRlIGEgbmV3IG5leHVzIGVudGl0eSBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuIE5leHVzZXMgYXJlIG93bmVkIGJ5IHRoZSBjb250cmFjdCBhbmQgc2VydmUgYXMgZml4ZWQgZ2F0aGVyaW5nIHBvaW50cyB3aGVyZSBwbGF5ZXJzIGNhbiB3cmFwLCB1bndyYXAsIGRlcGxveSwgYW5kIG90aGVyd2lzZSBpbnRlcmFjdCB3aXRoIE5GVC1iYWNrZWQgYXNzZXRzLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAAAAQKFpdjIHYWR2YW5jZdMBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGFkdmFuY2UKc3VtbWFyeTogJ0FkdmFuY2UgdHVybicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQWR2YW5jZSB0aGUgZ2FtZSB0byB0aGUgbmV4dCB0dXJuLgAAAACANFU8BWJsZW5k/QItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYmxlbmQKc3VtbWFyeTogJ0JsZW5kIGNhcmdvIHN0YWNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ29tYmluZSBtdWx0aXBsZSBjYXJnbyBzdGFja3Mgb2YgdGhlIHNhbWUgaXRlbSB0eXBlIGludG8gYSBzaW5nbGUgc3RhY2sgd2l0aCBhIG5ldyBibGVuZGVkIHNlZWQuIEFsbCBpbnB1dCBzdGFja3MgbXVzdCBzaGFyZSB0aGUgc2FtZSBpdGVtIGlkLiBUaGUgb3V0cHV0IHN0YWNrIGhhcyB0aGUgY29tYmluZWQgcXVhbnRpdHkgb2YgYWxsIGlucHV0cy4AAAAARIWmQQZjYW5jZWzCAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjYW5jZWwKc3VtbWFyeTogJ0NhbmNlbCBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbmNlbCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0YXNrcyBmcm9tIHRoZSBlbmQgb2YgYW4gZW50aXR5J3Mgc2NoZWR1bGUuIFRhc2tzIHRoYXQgYXJlIGltbXV0YWJsZSBhbmQgaW4gcHJvZ3Jlc3MgY2Fubm90IGJlIGNhbmNlbGxlZC4AAKgb32lURAljbGVhbnJzdnDsAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGVhbnJzdnAKc3VtbWFyeTogJ0NsZWFuIHVwIHBhc3QgZXBvY2ggcmVzZXJ2ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVyYXNlIHJlc2VydmUgdGFibGUgcm93cyBmcm9tIGEgcGFzdCBlcG9jaC4gQ2Fubm90IGNsZWFuIHRoZSBjdXJyZW50IG9yIGZ1dHVyZSBlcG9jaHMuIFRoZSBtYXhfcm93cyBwYXJhbWV0ZXIgY2FwcyB0aGUgbnVtYmVyIG9mIHJvd3MgZXJhc2VkIHBlciBjYWxsIHRvIGxpbWl0IENQVSB1c2FnZS4AgIrH5GtURApjbGVhcnRhYmxlvgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYXJ0YWJsZQpzdW1tYXJ5OiAnREVCVUc6IGNsZWFydGFibGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAGQnJUUGY29tbWl07AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY29tbWl0CnN1bW1hcnk6ICdTZXQgY29tbWl0IHZhbHVlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTZXQgdGhlIGluaXRpYWwgY29tbWl0IHZhbHVlIGR1cmluZyBnYW1lIGluaXRpYWxpemF0aW9uLgAAYDQytyZFCWNvbmZpZ2xvZ90CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbmZpZ2xvZwpzdW1tYXJ5OiAnTG9nIGdhbWUgY29uZmlndXJhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIHRoYXQgbG9ncyB0aGUgY3VycmVudCBnYW1lIGNvbmZpZ3VyYXRpb24uIENhbGxlZCBpbmxpbmUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdG8gYnJvYWRjYXN0IGNvbmZpZyB2aWEgYWN0aW9uIHRyYWNlcy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAACAvMxFBWNyYWZ0yAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY3JhZnQKc3VtbWFyeTogJ0NyYWZ0IGl0ZW1zIGZyb20gYSByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRyYW5zZm9ybSBjYXJnbyBpdGVtcyBpbnRvIGEgbmV3IGl0ZW0gdXNpbmcgYSByZWNpcGUuIFRoZSBlbnRpdHkgbXVzdCBoYXZlIGEgY3JhZnRlciBtb2R1bGUgaW5zdGFsbGVkLiBDb25zdW1lcyBlbmVyZ3kgYW5kIHNjaGVkdWxlcyBhIGNyYWZ0aW5nIHRhc2sgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiB0b3RhbCBpbnB1dCBtYXNzIGFuZCBjcmFmdGVyIHNwZWVkLiBJbnB1dCBxdWFudGl0aWVzIG11c3QgZXhhY3RseSBtYXRjaCB0aGUgcmVjaXBlIHJlcXVpcmVtZW50cy7gs8tTqWzURQxjcmVhdGVlbnRpdHm/AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjcmVhdGVlbnRpdHkKc3VtbWFyeTogJ0RFQlVHOiBjcmVhdGUgYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAHgaq0oGZGVwbG957AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVwbG95CnN1bW1hcnk6ICdEZXBsb3kgYSBwYWNrZWQgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpVbnBhY2sgYSBwYWNrZWQgZW50aXR5IGl0ZW0gKHBhY2tlZCBzaGlwIG9yIHBhY2tlZCBjb250YWluZXIpIGZyb20gY2FyZ28sIHNjaGVkdWxpbmcgYSBkZXBsb3kgdGFzayB0aGF0IGNyZWF0ZXMgdGhlIG5ldyBlbnRpdHkgYXQgdGhlIGRlcGxveWluZyBlbnRpdHkncyBsb2NhdGlvbiB1cG9uIHJlc29sdXRpb24uAIDPLk+FsEoKZGVzY2VudGl0efwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlc2NlbnRpdHkKc3VtbWFyeTogJ0Rlc2NyaWJlIGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIGEgcGFja2VkIGVudGl0eSwgZGVyaXZlZCBmcm9tIHRoZSBlbnRpdHkgaXRlbSBpZCwgaHVsbCBzZWVkLCBhbmQgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIG1vZHVsZSBpdGVtIGlkcyBhbmQgc2VlZHMuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgYW5kIE5GVCByZW5kZXJlcnMgdG8gZGlzcGxheSBwYWNrZWQgZW50aXRpZXMuIENhbGxpbmcgdGhpcyBhY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGNvbnRyYWN0IHN0YXRlLgAAAACoeMxUBmVuYWJsZd0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC4AAAAAXNWyYQZnYXRoZXKXAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnYXRoZXIKc3VtbWFyeTogJ0dhdGhlciByZXNvdXJjZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkdhdGhlciByZXNvdXJjZXMgYXQgdGhlIHNoaXAncyBjdXJyZW50IGxvY2F0aW9uLiBPbmx5IHdvcmtzIGF0IGdhdGhlcmFibGUgbG9jYXRpb24gdHlwZXMuIFNjaGVkdWxlcyBhIGdhdGhlciB0YXNrIHRoYXQgY29uc3VtZXMgZW5lcmd5IGFuZCB5aWVsZHMgY2FyZ28gYmFzZWQgb24gdGhlIHNoaXAncyBnYXRoZXJlciBzdGF0cyBhbmQgdGhlIGxvY2F0aW9uJ3MgcmVzb3VyY2UgY29tcG9zaXRpb24uAABgbk2KsmIJZ2V0Y29uZmlnygItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0Y29uZmlnCnN1bW1hcnk6ICdHZXQgZ2FtZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSBnYW1lIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIGRlZmF1bHQgZW50aXR5IHN0YXRzIGZvciB3YXJlaG91c2VzIGFuZCBjb250YWluZXJzLCBhbmQgdGhlIGZ1bGwgaXRlbSBkZWZpbml0aW9ucyB0YWJsZS4AsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy4ATDZJquyyYgtnZXRpdGVtZGF0YdwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1kYXRhCnN1bW1hcnk6ICdHZXQgZnVsbCBpdGVtIGNhdGFsb2cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBjb21wbGV0ZSBpdGVtIGNhdGFsb2cgYXMgdGhlIGNvbnRyYWN0IHNlZXMgaXQsIGluY2x1ZGluZyB0eXBlLCBzdWJ0eXBlLCB0aWVyLCBtYXNzLCBhbmQgb3RoZXIgc3RhdGljIG1ldGFkYXRhLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBjbGllbnRzIHRvIG1pcnJvciB0aGUgY29udHJhY3QncyBpdGVtIGRlZmluaXRpb25zLiBDYWxsaW5nIHRoaXMgYWN0aW9uIGRvZXMgbm90IG1vZGlmeSBjb250cmFjdCBzdGF0ZS4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuACZ12SAas2ILZ2V0bG9jYXRpb27iAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NhdGlvbgpzdW1tYXJ5OiAnR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYXRpb24gaW5jbHVkaW5nIHdoZXRoZXIgYSBzeXN0ZW0gZXhpc3RzLCBhbmQgZm9yIGVhY2ggaXRlbTogcHJpY2UsIHN1cHBseSwgcmFyaXR5IG11bHRpcGxpZXIsIGFuZCBsb2NhdGlvbiBtdWx0aXBsaWVyLgCAySYhGrNiCmdldGxvY2RhdGH+Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NkYXRhCnN1bW1hcnk6ICdHZXQgZGVyaXZlZCBsb2NhdGlvbiBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGRlcml2ZWQgbG9jYXRpb24gZGF0YSBpbmNsdWRpbmcgc3RhdGljIHByb3BlcnRpZXMgKHR5cGUsIGRpZmZpY3VsdHksIHNlZWRzKSBmcm9tIHRoZSBnYW1lIHNlZWQgYW5kIGVwb2NoLXNwZWNpZmljIHByb3BlcnRpZXMgKGFjdGl2ZSwgc2VlZHMpIGZyb20gdGhlIGN1cnJlbnQgZXBvY2ggc2VlZC4AAFZRJyqzYgpnZXRtb2R1bGVztAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bW9kdWxlcwpzdW1tYXJ5OiAnR2V0IGFsbCBtb2R1bGUgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgaXRlbXMgY2xhc3NpZmllZCBhcyBtb2R1bGVzLCBpbmNsdWRpbmcgZWFjaCBtb2R1bGUncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGluc3RhbGxhYmxlIGVxdWlwbWVudC4gQ2FsbGluZyB0aGlzIGFjdGlvbiBkb2VzIG5vdCBtb2RpZnkgY29udHJhY3Qgc3RhdGUuAADw5xo1s2IJZ2V0bmVhcmJ53gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bmVhcmJ5CnN1bW1hcnk6ICdHZXQgbmVhcmJ5IHJlYWNoYWJsZSBzeXN0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIG5lYXJieSBzeXN0ZW1zIHJlYWNoYWJsZSBieSBhbiBlbnRpdHkgZnJvbSBpdHMgcHJvamVjdGVkIGxvY2F0aW9uLiBSZXR1cm5zIGN1cnJlbnQgc3RhdGUgKHdpdGggY29tcGxldGVkIHRhc2tzIHJlc29sdmVkKSwgcHJvamVjdGVkIHN0YXRlIChhZnRlciBhbGwgc2NoZWR1bGVkIHRhc2tzKSwgYW5kIGEgbGlzdCBvZiByZWFjaGFibGUgc3lzdGVtcyB3aXRoIGRpc3RhbmNlLCBlbmVyZ3kgY29zdCwgZmxpZ2h0IHRpbWUsIGFuZCBtYXJrZXQgaW5mb3JtYXRpb24uAABd0+U1s2IKZ2V0bmZ0aW5mb6QELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5mdGluZm8Kc3VtbWFyeTogJ0dldCBORlQgc2NoZW1hIGFuZCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgQXRvbWljQXNzZXRzIHNjaGVtYXMgYW5kIHRlbXBsYXRlcyB0aGUgZ2FtZSBjb250cmFjdCBleHBlY3RzLCBwbHVzIHRoZSBjdXJyZW50IGBpdGVtX2lkIOKGkiAodGVtcGxhdGVfaWQsIHNjaGVtYV9uYW1lKWAgbWFwcGluZyBzdG9yZWQgaW4gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHN5bmMgYXRvbWljYXNzZXRzIHN0YXRlIHdpdGggdGhlIGNvbnRyYWN0LiBDYWxsaW5nIHRoaXMgYWN0aW9uIGRvZXMgbm90IG1vZGlmeSBjb250cmFjdCBzdGF0ZS4AALjKm1izYglnZXRwbGF5ZXL9Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRwbGF5ZXIKc3VtbWFyeTogJ0dldCBwbGF5ZXIgaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwbGF5ZXIgaW5jbHVkaW5nIGJhbGFuY2UsIGRlYnQsIG5ldHdvcnRoLCBlbnRpdHkgY291bnRzLCBhbmQgcHJpY2luZyBmb3IgbmV4dCBwdXJjaGFzZXMuIFJldHVybnMgaXNfcGxheWVyPWZhbHNlIGlmIHRoZSBhY2NvdW50IGhhcyBub3Qgam9pbmVkIHRoZSBnYW1lLgAAUNUhdbNiCWdldHJlY2lwZdoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZQpzdW1tYXJ5OiAnR2V0IGEgc2luZ2xlIGNyYWZ0aW5nIHJlY2lwZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHJlY2lwZSB3aG9zZSBvdXRwdXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaXRlbSBpZCwgaW5jbHVkaW5nIGl0cyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkaXNwbGF5IGNyYWZ0aW5nIHJlcXVpcmVtZW50cy4gQ2FsbGluZyB0aGlzIGFjdGlvbiBkb2VzIG5vdCBtb2RpZnkgY29udHJhY3Qgc3RhdGUuAABW1SF1s2IKZ2V0cmVjaXBlc+ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4gQ2FsbGluZyB0aGlzIGFjdGlvbiBkb2VzIG5vdCBtb2RpZnkgY29udHJhY3Qgc3RhdGUugBW6mmJ1s2IMZ2V0cmVzb3VyY2VzuwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzb3VyY2VzCnN1bW1hcnk6ICdHZXQgYWxsIHJlc291cmNlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGNsYXNzaWZpZWQgYXMgcmVzb3VyY2VzLCBpbmNsdWRpbmcgZWFjaCByZXNvdXJjZSdzIGlkLCBtYXNzLCBzdWJ0eXBlLCBhbmQgdGllci4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBlbnVtZXJhdGUgZ2F0aGVyYWJsZSBtYXRlcmlhbHMuIENhbGxpbmcgdGhpcyBhY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGNvbnRyYWN0IHN0YXRlLgCA1NncjLNiCmdldHN0cmF0dW3SAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdHJhdHVtCnN1bW1hcnk6ICdHZXQgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHJlc291cmNlIHN0cmF0dW0gZGF0YSBmb3IgYSBzcGVjaWZpYyBkZXB0aCBsYXllciBhdCBhIGNvb3JkaW5hdGUsIGluY2x1ZGluZyB0aGUgc3RyYXR1bSBzZWVkIGluZm8gYW5kIGRlcml2ZWQgcmVzb3VyY2Ugc3RhdHMugJW7RkqNs2IMZ2V0c3VtbWFyaWVz6AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3VtbWFyaWVzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHN1bW1hcmllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgbGlnaHR3ZWlnaHQgc3VtbWFyaWVzIG9mIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllciBpbmNsdWRpbmcgdHlwZSwgaWQsIG93bmVyLCBuYW1lLCBsb2NhdGlvbiwgYW5kIGlkbGUgc3RhdHVzLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4Aotrm5qrpZQtncm91cHRyYXZlbJoELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdyb3VwdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIG11bHRpcGxlIGVudGl0aWVzIHRvZ2V0aGVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSBncm91cCB0cmF2ZWwgZm9yIG11bHRpcGxlIGVudGl0aWVzIHRvIGEgZGVzdGluYXRpb24uIEFsbCBlbnRpdGllcyBtdXN0IGJlIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFuZCBvd25lZCBieSB0aGUgY2FsbGVyLiBBdCBsZWFzdCBvbmUgZW50aXR5IHdpdGggZW5naW5lcyBpcyByZXF1aXJlZCB0byBwcm92aWRlIHRocnVzdC4gRmxpZ2h0IGR1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgZnJvbSBjb21iaW5lZCB0aHJ1c3QgYW5kIHRvdGFsIG1hc3Mgb2YgYWxsIGVudGl0aWVzLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGZvciBhdG9taWMgcmVzb2x1dGlvbiBhbmQgY2FuY2VsbGF0aW9uLgAAAAAA0LBpBGhhc2j4AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhMjU2IGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTI1NiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAQITSsGkHaGFzaDUxMvsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2g1MTIKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGE1MTIgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhNTEyIGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4AAAAAAJDddARpbml0+gEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaW5pdApzdW1tYXJ5OiAnSW5pdGlhbGl6ZSBnYW1lIHNlZWQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYWxpemUgYSB0aGUgZ2FtZXMgc2VlZCBhbmQgc2VlZCB2YWx1ZXMgdG8gYm9vdHN0cmFwIGdhbWUgc3RhdGUuAAAAAAAwHX0Eam9pbsQBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGpvaW4Kc3VtbWFyeTogJ0pvaW4gYSBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpKb2luIGEgZ2FtZSBvZiBTaGlwbG9hZAAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAAIpd05C6CHJlY2hhcmdlzQItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVjaGFyZ2UKc3VtbWFyeTogJ1JlY2hhcmdlIHNoaXAgZW5lcmd5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTY2hlZHVsZSBhIHJlY2hhcmdlIHRhc2sgZm9yIGFuIGVudGl0eSB0byByZXN0b3JlIGVuZXJneSB0byBmdWxsIGNhcGFjaXR5LiBUaGUgcmVjaGFyZ2UgZHVyYXRpb24gZGVwZW5kcyBvbiBjdXJyZW50IGVuZXJneSBsZXZlbCBhbmQgcmVjaGFyZ2UgcmF0ZS4AAABA7UixugdyZXNvbHZl0AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVzb2x2ZQpzdW1tYXJ5OiAnQ29tcGxldGUgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXNvbHZlIGNvbXBsZXRlZCB0YXNrcyBpbiBhbiBlbnRpdHkncyBzY2hlZHVsZSwgYXBwbHlpbmcgdGhlaXIgZWZmZWN0cyAocmVjaGFyZ2UgZW5lcmd5LCB1cGRhdGUgbG9jYXRpb24sIGxvYWQvdW5sb2FkIGNhcmdvKS4gSWYgY291bnQgaXMgc3BlY2lmaWVkLCByZXNvbHZlIGV4YWN0bHkgdGhhdCBtYW55IHRhc2tzOyBvdGhlcndpc2UgcmVzb2x2ZSBhbGwgY29tcGxldGVkIHRhc2tzLiBGYWlscyBpZiBjb3VudCBleGNlZWRzIHRoZSBudW1iZXIgb2YgY29tcGxldGVkIHRhc2tzLgAAACrqRKW8CHJtbW9kdWxlvAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcm1tb2R1bGUKc3VtbWFyeTogJ1JlbW92ZSBhIG1vZHVsZSBmcm9tIGEgc2xvdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVtb3ZlIGFuIGluc3RhbGxlZCBtb2R1bGUgZnJvbSBhIHNsb3Qgb24gYSBsaXZlIGVudGl0eSBvciBhIHBhY2tlZCBlbnRpdHkgaW4gY2FyZ28uIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlIHdpdGggbm8gc2NoZWR1bGVkIHRhc2tzLiBUaGUgbW9kdWxlIGlzIHJldHVybmVkIHRvIGNhcmdvLiBGYWlscyBpZiB0aGUgZW50aXR5IGRvZXMgbm90IGhhdmUgZW5vdWdoIGNhcmdvIGNhcGFjaXR5IHRvIGhvbGQgdGhlIHJldHVybmVkIG1vZHVsZS4AAABsobymvAhybW5mdGNmZ6EDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJtbmZ0Y2ZnCnN1bW1hcnk6ICdSZW1vdmUgTkZUIHRlbXBsYXRlIG1hcHBpbmcgZm9yIGFuIGl0ZW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlbW92ZSB0aGUgQXRvbWljQXNzZXRzIHRlbXBsYXRlIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBpZCBmcm9tIHRoZSBgbmZ0Y29uZmlnYCB0YWJsZS4gQWZ0ZXIgcmVtb3ZhbCB0aGUgaXRlbSBjYW4gbm8gbG9uZ2VyIGJlIHdyYXBwZWQgb3IgdW53cmFwcGVkIHVudGlsIGEgbmV3IG1hcHBpbmcgaXMgc2V0LiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAAAAAACQo8EEc2FsdNgBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNhbHQKc3VtbWFyeTogJ0FwcGVuZCBTYWx0JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZGQgYWRkaXRpb25hbCBzYWx0IHRvIHRoZSBuZXh0IGVwb2NoIHNlZWQuAABgC+U1s8IJc2V0bmZ0Y2ZnxAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc2V0bmZ0Y2ZnCnN1bW1hcnk6ICdTZXQgTkZUIHRlbXBsYXRlIG1hcHBpbmcgZm9yIGFuIGl0ZW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkJpbmQgYW4gaXRlbSBpZCB0byBhbiBBdG9taWNBc3NldHMgdGVtcGxhdGUgaWQgYW5kIHNjaGVtYSBuYW1lLiBVc2VkIHRvIGNvbmZpZ3VyZSBob3cgdGhlIGNvbnRyYWN0IG1pbnRzIGFuZCByZWNvZ25pemVzIE5GVHMgZm9yIGEgZ2l2ZW4gaXRlbS4gSW5zZXJ0cyBhIG5ldyBtYXBwaW5nIGlmIG9uZSBkb2VzIG5vdCBleGlzdCwgb3IgdXBkYXRlcyB0aGUgZXhpc3RpbmcgbWFwcGluZy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAZdegyU3FCnNwYXduY2FyZ2/FAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzcGF3bmNhcmdvCnN1bW1hcnk6ICdERUJVRzogc3Bhd24gY2FyZ28gb24gYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAJKCyNTJTcULc3Bhd25wYWNrZWTnAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzcGF3bnBhY2tlZApzdW1tYXJ5OiAnREVCVUc6IHNwYXduIGEgcGFja2VkIGVudGl0eSB3aXRoIGluc3RhbGxlZCBtb2R1bGVzIG9uIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQCSSkrhyU3FC3NwYXduc2VlZGVkzQEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Bhd25zZWVkZWQKc3VtbWFyeTogJ0RFQlVHOiBzcGF3biBzZWVkZWQgY2FyZ28gb24gYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAVy08zc0IdHJhbnNmZXLIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB0cmFuc2ZlcgpzdW1tYXJ5OiAnVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiBlbnRpdGllcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiB0d28gZW50aXRpZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24uIEJvdGggZW50aXRpZXMgbXVzdCBiZSBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBhdCBsZWFzdCBvbmUgbXVzdCBoYXZlIGxvYWRlcnMuIENyZWF0ZXMgbG9hZCBhbmQgdW5sb2FkIHRhc2tzIG9uIGJvdGggZW50aXRpZXMgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiBjb21iaW5lZCBsb2FkZXIgY2FwYWNpdHkgYW5kIFotZGlzdGFuY2UgYmV0d2VlbiB0aGVtLgAAAABEtc3NBnRyYXZlbPsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBhIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIHRyYXZlbCBvZiBhbiBlbnRpdHkgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBhIG5ldyBkZXN0aW5hdGlvbi4AAAAAAFCv4QR3YXJwnwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2FycApzdW1tYXJ5OiAnV2FycCB0byBhIGRlc3RpbmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YW50bHkgdGVsZXBvcnQgYW4gZW50aXR5IHRvIGEgZGVzdGluYXRpb24gc3lzdGVtLiBSZXF1aXJlcyB3YXJwIGNhcGFiaWxpdHksIGZ1bGwgZW5lcmd5LCBlbXB0eSBjYXJnbywgYW5kIGFuIGVtcHR5IHNjaGVkdWxlLiBUaGUgZGVzdGluYXRpb24gbXVzdCBiZSBhIHZhbGlkIHN5c3RlbSB3aXRoaW4gd2FycCByYW5nZS4gUmVzb2x2ZXMgaW1tZWRpYXRlbHkgYXMgYSB6ZXJvLWR1cmF0aW9uIHRhc2suAAAAAACgquMEd2lwZbIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGUKc3VtbWFyeTogJ0RFQlVHOiB3aXBlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLaDQVNoqrKrjDHdpcGVzZXF1ZW5jZcIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGVzZXF1ZW5jZQpzdW1tYXJ5OiAnREVCVUc6IHdpcGVzZXF1ZW5jZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAAAAAFDN5QR3cmFw/gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd3JhcApzdW1tYXJ5OiAnV3JhcCBjYXJnbyBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKV3JhcCBhIHF1YW50aXR5IG9mIGNhcmdvIGZyb20gYW4gZW50aXR5IGludG8gYW4gQXRvbWljQXNzZXRzIE5GVCBtaW50ZWQgdG8gdGhlIHNwZWNpZmllZCBvd25lci4gVGhlIGVudGl0eSBtdXN0IGJlIGF0IGEgbmV4dXMsIGhhdmUgbG9hZGVycywgYW5kIGNvbnRhaW4gZW5vdWdoIG9mIHRoZSByZXF1ZXN0ZWQgY2FyZ28uIFNjaGVkdWxlcyBhIHdyYXAgdGFzayB0aGF0LCBvbiByZXNvbHV0aW9uLCByZW1vdmVzIHRoZSBjYXJnbyBmcm9tIHRoZSBlbnRpdHkgYW5kIG1pbnRzIHRoZSBORlQgdXNpbmcgdGhlIHRlbXBsYXRlIGNvbmZpZ3VyZWQgZm9yIHRoYXQgaXRlbSBpZC4NAAAAAADKrkEDaTY0AAAJY2FyZ29fcm93AAC4ajqTJ0UDaTY0AAANY29udGFpbmVyX3JvdwCqppf57PJUA2k2NAAAD2VudGl0eWdyb3VwX3JvdwAAAJO6bBCNA2k2NAAADGxvY2F0aW9uX3JvdwAAAAAArLuaA2k2NAAACW5leHVzX3JvdwAAYG5NivKaA2k2NAAADW5mdGNvbmZpZ19yb3cAAAAAXOVNrANpNjQAAApwbGF5ZXJfcm93AAAAQO2rsLoDaTY0AAALcmVzZXJ2ZV9yb3cAAAAKTaWtwgNpNjQAAAxzZXF1ZW5jZV9yb3cAAAAAAFBdwwNpNjQAAAhzaGlwX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwAAAAAArKrPA2k2NAAACXR5cGVzX3JvdwAAUFjTpq7hA2k2NAAADXdhcmVob3VzZV9yb3cBEVNoaXBsb2FkIChTZXJ2ZXIpEVNoaXBsb2FkIChTZXJ2ZXIpAAAAHgAAAABEhaZBDmNhbmNlbF9yZXN1bHRzAAAAAIC8zEUMdGFza19yZXN1bHRzAAAAAHgaq0oMdGFza19yZXN1bHRzAIDPLk+FsEoGc3RyaW5nAAAAAFzVsmEMdGFza19yZXN1bHRzAABgbk2KsmILZ2FtZV9jb25maWcAsHLZ5amyYg1lbnRpdHlfaW5mb1tdAADw2eWpsmILZW50aXR5X2luZm8ATDZJquyyYg9pdGVtZGF0YV9yZXN1bHQAAABYquyyYgppdGVtc19pbmZvACZ12SAas2INbG9jYXRpb25faW5mbwCAySYhGrNiEGxvY2F0aW9uX2Rlcml2ZWQAAFZRJyqzYg5tb2R1bGVzX3Jlc3VsdAAA8OcaNbNiC25lYXJieV9pbmZvAABd0+U1s2IObmZ0aW5mb19yZXN1bHQAALjKm1izYgtwbGF5ZXJfaW5mbwAAUNUhdbNiDnJlY2lwZXNfcmVzdWx0AABW1SF1s2IOcmVjaXBlc19yZXN1bHSAFbqaYnWzYhByZXNvdXJjZXNfcmVzdWx0AIDU2dyMs2IMc3RyYXR1bV9kYXRhgJW7RkqNs2IQZW50aXR5X3N1bW1hcnlbXQCi2ubmqullDHRhc2tfcmVzdWx0cwAAAAAA0LBpC2NoZWNrc3VtMjU2AAAAQITSsGkLY2hlY2tzdW01MTIAAACKXdOQugx0YXNrX3Jlc3VsdHMAAABA7Uixug9yZXNvbHZlX3Jlc3VsdHMAAABXLTzNzQx0YXNrX3Jlc3VsdHMAAAAARLXNzQx0YXNrX3Jlc3VsdHMAAAAAAFCv4Qx0YXNrX3Jlc3VsdHMAAAAAAFDN5Qx0YXNrX3Jlc3VsdHM=');
208
+ const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDh0CWFkZG1vZHVsZQAFC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAxtb2R1bGVfaW5kZXgFdWludDgPbW9kdWxlX2NhcmdvX2lkBnVpbnQ2NA90YXJnZXRfY2FyZ29faWQGdWludDY0CGFkZG5leHVzAAMKbmV4dXNfbmFtZQZzdHJpbmcBeAVpbnQ2NAF5BWludDY0B2FkdmFuY2UAAgZyZXZlYWwGc3RyaW5nBmNvbW1pdAtjaGVja3N1bTI1NgVibGVuZAADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BmlucHV0cwxjYXJnb19pdGVtW10GY2FuY2VsAAMLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABAdpdGVtX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10JY2FyZ29fcm93AAYCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCWNsZWFucnN2cAACBWVwb2NoBnVpbnQ2NAhtYXhfcm93cwZ1aW50NjQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BmNvbW1pdAABBmNvbW1pdAtjaGVja3N1bTI1Ngljb25maWdsb2cAAQZjb25maWcLZ2FtZV9jb25maWcNY29udGFpbmVyX3JvdwAIAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzBnVpbnQzMghjYXBhY2l0eQZ1aW50MzIJY2FyZ29tYXNzBnVpbnQzMghzY2hlZHVsZQlzY2hlZHVsZT8LY29vcmRpbmF0ZXMAAwF4BWludDY0AXkFaW50NjQBegd1aW50MTY/BWNyYWZ0AAULZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIGaW5wdXRzDGNhcmdvX2l0ZW1bXQ1jcmFmdGVyX3N0YXRzAAIFc3BlZWQGdWludDE2BWRyYWluBnVpbnQxNgxjcmVhdGVlbnRpdHkABQVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWULZW50aXR5X25hbWUGc3RyaW5nAXgFaW50NjQBeQVpbnQ2NAZkZXBsb3kABQtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NA5wYWNrZWRfaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0C2VudGl0eV9uYW1lBnN0cmluZwpkZXNjZW50aXR5AAQHaXRlbV9pZAZ1aW50MTYKaHVsbF9zdGF0cwZ1aW50NjQMbW9kdWxlX2l0ZW1zCHVpbnQxNltdDG1vZHVsZV9zdGF0cwh1aW50NjRbXQZlbmFibGUAAQdlbmFibGVkBGJvb2wMZW5lcmd5X3N0YXRzAAIIY2FwYWNpdHkGdWludDE2CHJlY2hhcmdlBnVpbnQxNhRlbnRpdHlfY3VycmVudF9zdGF0ZQACC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzBmVuZXJneQZ1aW50MTYPZW50aXR5X2RlZmF1bHRzAAUSd2FyZWhvdXNlX2NhcGFjaXR5BnVpbnQzMgt3YXJlaG91c2VfegZ1aW50MTYSY29udGFpbmVyX2h1bGxtYXNzBnVpbnQzMhJjb250YWluZXJfY2FwYWNpdHkGdWludDMyC2NvbnRhaW5lcl96BnVpbnQxNgtlbnRpdHlfaW5mbwAYBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb19pdGVtW10HbG9hZGVycw1sb2FkZXJfc3RhdHM/BmVuZXJneQd1aW50MTY/CGh1bGxtYXNzB3VpbnQzMj8HZW5naW5lcw9tb3ZlbWVudF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8IY2FwYWNpdHkHdWludDMyPwhnYXRoZXJlcg9nYXRoZXJlcl9zdGF0cz8GaGF1bGVyDWhhdWxlcl9zdGF0cz8Ed2FycAt3YXJwX3N0YXRzPwdjcmFmdGVyDmNyYWZ0ZXJfc3RhdHM/B2lzX2lkbGUEYm9vbAxjdXJyZW50X3Rhc2sFdGFzaz8UY3VycmVudF90YXNrX2VsYXBzZWQGdWludDMyFmN1cnJlbnRfdGFza19yZW1haW5pbmcGdWludDMyDXBlbmRpbmdfdGFza3MGdGFza1tdB2lkbGVfYXQLdGltZV9wb2ludD8Ic2NoZWR1bGUJc2NoZWR1bGU/CmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQOZW50aXR5X3N1bW1hcnkACAR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzB2lzX2lkbGUEYm9vbA5yZXNvbHZlZF9jb3VudAZ1aW50MzINcGVuZGluZ19jb3VudAZ1aW50MzIQZW50aXR5X3Rhc2tfaW5mbwAECWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQp0YXNrX2NvdW50BXVpbnQ4EHNjaGVkdWxlX3N0YXJ0ZWQKdGltZV9wb2ludA9lbnRpdHlncm91cF9yb3cAAgJpZAZ1aW50NjQMcGFydGljaXBhbnRzDGVudGl0eV9yZWZbXQtnYW1lX2NvbmZpZwADB3ZlcnNpb24GdWludDMyCGRlZmF1bHRzD2VudGl0eV9kZWZhdWx0cwVpdGVtcwppdGVtX2RlZltdBmdhdGhlcgAEBnNvdXJjZQplbnRpdHlfcmVmC2Rlc3RpbmF0aW9uCmVudGl0eV9yZWYHc3RyYXR1bQZ1aW50MTYIcXVhbnRpdHkGdWludDMyDmdhdGhlcmVyX3N0YXRzAAQFeWllbGQGdWludDE2BWRyYWluBnVpbnQxNgVkZXB0aAZ1aW50MTYFc3BlZWQGdWludDE2CWdldGNvbmZpZwAAC2dldGVudGl0aWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwlnZXRlbnRpdHkAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQLZ2V0aXRlbWRhdGEAAAhnZXRpdGVtcwAAC2dldGxvY2F0aW9uAAIBeAVpbnQ2NAF5BWludDY0CmdldGxvY2RhdGEAAgF4BWludDY0AXkFaW50NjQKZ2V0bW9kdWxlcwAACWdldG5lYXJieQADC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhyZWNoYXJnZQRib29sCmdldG5mdGluZm8AAAlnZXRwbGF5ZXIAAQdhY2NvdW50BG5hbWUJZ2V0cmVjaXBlAAEOb3V0cHV0X2l0ZW1faWQGdWludDE2CmdldHJlY2lwZXMAAgtsb3dlcl9ib3VuZAZ1aW50MTYFbGltaXQFdWludDgMZ2V0cmVzb3VyY2VzAAAKZ2V0c3RyYXR1bQADAXgFaW50NjQBeQVpbnQ2NAdzdHJhdHVtBnVpbnQxNgxnZXRzdW1tYXJpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/C2dyb3VwdHJhdmVsAAQIZW50aXRpZXMMZW50aXR5X3JlZltdAXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sBGhhc2gAAQV2YWx1ZQZzdHJpbmcHaGFzaDUxMgABBXZhbHVlBnN0cmluZwxoYXVsZXJfc3RhdHMAAwhjYXBhY2l0eQV1aW50OAplZmZpY2llbmN5BnVpbnQxNgVkcmFpbgZ1aW50MTYEaW5pdAABBHNlZWQLY2hlY2tzdW0yNTYIaXRlbV9kZWYABQJpZAZ1aW50MTYEbWFzcwZ1aW50MzIEdHlwZQV1aW50OAdzdWJ0eXBlBXVpbnQ4BHRpZXIFdWludDgPaXRlbWRhdGFfcmVzdWx0AAIFaXRlbXMKaXRlbV9kZWZbXQdyZWNpcGVzDnJlY2lwZXNfcmVzdWx0Cml0ZW1zX2luZm8AAQVpdGVtcwppdGVtX2RlZltdBGpvaW4AAQdhY2NvdW50BG5hbWUMbG9hZGVyX3N0YXRzAAMEbWFzcwZ1aW50MzIGdGhydXN0BnVpbnQxNghxdWFudGl0eQV1aW50OBBsb2NhdGlvbl9kZXJpdmVkAAMMc3RhdGljX3Byb3BzD2xvY2F0aW9uX3N0YXRpYwtlcG9jaF9wcm9wcw5sb2NhdGlvbl9lcG9jaARzaXplBnVpbnQxNg5sb2NhdGlvbl9lcG9jaAADBmFjdGl2ZQRib29sBXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DWxvY2F0aW9uX2luZm8AAgZjb29yZHMLY29vcmRpbmF0ZXMJaXNfc3lzdGVtBGJvb2wMbG9jYXRpb25fcm93AAYCaWQGdWludDY0BW93bmVyBG5hbWULY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb19pdGVtW10Ic2NoZWR1bGUJc2NoZWR1bGU/D2xvY2F0aW9uX3N0YXRpYwAFBmNvb3Jkcwtjb29yZGluYXRlcwR0eXBlDWxvY2F0aW9uX3R5cGUHc3VidHlwZQV1aW50OAVzZWVkMAV1aW50OAVzZWVkMQV1aW50OAxtb2R1bGVfZW50cnkAAgR0eXBlBXVpbnQ4CWluc3RhbGxlZA5wYWNrZWRfbW9kdWxlPwttb2R1bGVfaW5mbwAEAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgttb2R1bGVfdHlwZQV1aW50OAR0aWVyBXVpbnQ4Dm1vZHVsZXNfcmVzdWx0AAEHbW9kdWxlcw1tb2R1bGVfaW5mb1tdDm1vdmVtZW50X3N0YXRzAAIGdGhydXN0BnVpbnQzMgVkcmFpbgZ1aW50MTYLbmVhcmJ5X2luZm8ABQpjYW5fdHJhdmVsBGJvb2wHY3VycmVudBRlbnRpdHlfY3VycmVudF9zdGF0ZQlwcm9qZWN0ZWQUZW50aXR5X2N1cnJlbnRfc3RhdGUKbWF4X2VuZXJneQZ1aW50MTYHc3lzdGVtcw9uZWFyYnlfc3lzdGVtW10NbmVhcmJ5X3N5c3RlbQAECGRpc3RhbmNlBnVpbnQ2NAtlbmVyZ3lfY29zdAZ1aW50NjQLZmxpZ2h0X3RpbWUGdWludDMyCGxvY2F0aW9uDWxvY2F0aW9uX2luZm8JbmV4dXNfcm93AAQCaWQGdWludDY0BW93bmVyBG5hbWUEbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMObmZ0X3NjaGVtYV9kZWYAAgtzY2hlbWFfbmFtZQRuYW1lBmZpZWxkcw5zY2hlbWFfZmllbGRbXRBuZnRfdGVtcGxhdGVfZGVmAAIHaXRlbV9pZAZ1aW50MTYLc2NoZW1hX25hbWUEbmFtZQ1uZnRjb25maWdfcm93AAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQ5uZnRpbmZvX3Jlc3VsdAACB3NjaGVtYXMQbmZ0X3NjaGVtYV9kZWZbXQl0ZW1wbGF0ZXMSbmZ0X3RlbXBsYXRlX2RlZltdBm5vdGlmeQABBWV2ZW50CnRhc2tfZXZlbnQNcGFja2VkX21vZHVsZQACB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAtwbGF5ZXJfaW5mbwAGBW93bmVyBG5hbWUJaXNfcGxheWVyBGJvb2wMY29tcGFueV9uYW1lBnN0cmluZwpzaGlwX2NvdW50BnVpbnQ2NA93YXJlaG91c2VfY291bnQGdWludDY0D2NvbnRhaW5lcl9jb3VudAZ1aW50NjQKcGxheWVyX3JvdwABBW93bmVyBG5hbWUIcmVjaGFyZ2UAAgtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAxyZWNpcGVfaW5wdXQAAwdpdGVtX2lkBnVpbnQxNghjYXRlZ29yeQV1aW50OAhxdWFudGl0eQZ1aW50MzIQcmVjaXBlX2l0ZW1faW5mbwACAmlkBnVpbnQxNgRtYXNzBnVpbnQzMg9yZWNpcGVfcmVzcG9uc2UABw5vdXRwdXRfaXRlbV9pZAZ1aW50MTYLb3V0cHV0X21hc3MGdWludDMyBmlucHV0cw5yZWNpcGVfaW5wdXRbXQpzdGF0X3Nsb3RzFHN0YXRfc2xvdF9yZXNwb25zZVtdDWJsZW5kX3dlaWdodHMFYnl0ZXMLb3V0cHV0X2l0ZW0QcmVjaXBlX2l0ZW1faW5mbwtpbnB1dF9pdGVtcxJyZWNpcGVfaXRlbV9pbmZvW10OcmVjaXBlc19yZXN1bHQAAQdyZWNpcGVzEXJlY2lwZV9yZXNwb25zZVtdC3Jlc2VydmVfcm93AAICaWQGdWludDY0CXJlbWFpbmluZwZ1aW50MzIHcmVzb2x2ZQADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/DXJlc291cmNlX2luZm8ABAJpZAZ1aW50MTYEbWFzcwZ1aW50MzIIY2F0ZWdvcnkFdWludDgEdGllcgV1aW50OA5yZXNvdXJjZV9zdGF0cwADBXN0YXQxBnVpbnQxNgVzdGF0MgZ1aW50MTYFc3RhdDMGdWludDE2EHJlc291cmNlc19yZXN1bHQAAQlyZXNvdXJjZXMPcmVzb3VyY2VfaW5mb1tdCHJtbW9kdWxlAAQLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OA90YXJnZXRfY2FyZ29faWQGdWludDY0CHJtbmZ0Y2ZnAAEHaXRlbV9pZAZ1aW50MTYEc2FsdAABBHNhbHQGdWludDY0CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQJc2V0bmZ0Y2ZnAAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQhzaGlwX3JvdwASAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nBXN0YXRzBnVpbnQ2NAtjb29yZGluYXRlcwtjb29yZGluYXRlcwhodWxsbWFzcwd1aW50MzI/CGNhcGFjaXR5B3VpbnQzMj8GZW5lcmd5B3VpbnQxNj8JY2FyZ29tYXNzBnVpbnQzMgdlbmdpbmVzD21vdmVtZW50X3N0YXRzPwlnZW5lcmF0b3INZW5lcmd5X3N0YXRzPwdsb2FkZXJzDWxvYWRlcl9zdGF0cz8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwZoYXVsZXINaGF1bGVyX3N0YXRzPwdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHNjaGVkdWxlCXNjaGVkdWxlPwpzcGF3bmNhcmdvAAMJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQLc3Bhd25wYWNrZWQABAllbnRpdHlfaWQGdWludDY0B2l0ZW1faWQGdWludDE2Cmh1bGxfc3RhdHMGdWludDY0CWluc3RhbGxlZA9wYWNrZWRfbW9kdWxlW10Lc3Bhd25zZWVkZWQABAllbnRpdHlfaWQGdWludDY0B2l0ZW1faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NAVzdGF0cwZ1aW50NjQSc3RhdF9zbG90X3Jlc3BvbnNlAAEHc291cmNlcw1zdGF0X3NvdXJjZVtdC3N0YXRfc291cmNlAAILaW5wdXRfaW5kZXgFdWludDgQaW5wdXRfc3RhdF9pbmRleAV1aW50OAlzdGF0ZV9yb3cABgdlbmFibGVkBGJvb2wFZXBvY2gGdWludDMyBHNhbHQGdWludDY0BXNoaXBzBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2BmNvbW1pdAtjaGVja3N1bTI1NgxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABAdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzIEdGFzawAIBHR5cGUFdWludDgIZHVyYXRpb24GdWludDMyCmNhbmNlbGFibGUFdWludDgLY29vcmRpbmF0ZXMMY29vcmRpbmF0ZXM/BWNhcmdvDGNhcmdvX2l0ZW1bXQxlbnRpdHl0YXJnZXQLZW50aXR5X3JlZj8LZW50aXR5Z3JvdXAHdWludDY0PwtlbmVyZ3lfY29zdAd1aW50MTY/CnRhc2tfZXZlbnQACQpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDE2Pwx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10IdHJhbnNmZXIABwtzb3VyY2VfdHlwZQRuYW1lCXNvdXJjZV9pZAZ1aW50NjQJZGVzdF90eXBlBG5hbWUHZGVzdF9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0CHF1YW50aXR5BnVpbnQzMgZ0cmF2ZWwABQtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbAl0eXBlc19yb3cAAwJpZAZ1aW50NjQTZW50aXR5X3N1bW1hcnlfdHlwZQ5lbnRpdHlfc3VtbWFyeRBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnDXdhcmVob3VzZV9yb3cACwJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwVzdGF0cwZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMIaHVsbG1hc3MHdWludDMyPwhjYXBhY2l0eQd1aW50MzI/CWNhcmdvbWFzcwZ1aW50MzIHbG9hZGVycw1sb2FkZXJfc3RhdHM/B21vZHVsZXMObW9kdWxlX2VudHJ5W10Ic2NoZWR1bGUJc2NoZWR1bGU/BHdhcnAABAtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQKd2FycF9zdGF0cwABBXJhbmdlBnVpbnQzMgR3aXBlAAAMd2lwZXNlcXVlbmNlAAAEd3JhcAAFBW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CGNhcmdvX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQ0AABQUScqUzIJYWRkbW9kdWxlxwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbW9kdWxlCnN1bW1hcnk6ICdJbnN0YWxsIGEgbW9kdWxlIGludG8gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YWxsIGEgbW9kdWxlIGZyb20gY2FyZ28gaW50byBhIG1vZHVsZSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSB0eXBlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgc2xvdCB0eXBlLiBUaGUgbW9kdWxlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIGNhcmdvIHVwb24gaW5zdGFsbGF0aW9uLgAAAFh3NVMyCGFkZG5leHVzpwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbmV4dXMKc3VtbWFyeTogJ0FkZCBhIG5leHVzIGxvY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDcmVhdGUgYSBuZXcgbmV4dXMgZW50aXR5IGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy4gTmV4dXNlcyBhcmUgb3duZWQgYnkgdGhlIGNvbnRyYWN0IGFuZCBzZXJ2ZSBhcyBmaXhlZCBnYXRoZXJpbmcgcG9pbnRzIHdoZXJlIHBsYXllcnMgY2FuIHdyYXAsIHVud3JhcCwgZGVwbG95LCBhbmQgb3RoZXJ3aXNlIGludGVyYWN0IHdpdGggTkZULWJhY2tlZCBhc3NldHMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAABAoWl2MgdhZHZhbmNl0wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWR2YW5jZQpzdW1tYXJ5OiAnQWR2YW5jZSB0dXJuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZHZhbmNlIHRoZSBnYW1lIHRvIHRoZSBuZXh0IHR1cm4uAAAAAIA0VTwFYmxlbmT8Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBibGVuZApzdW1tYXJ5OiAnQmxlbmQgY2FyZ28gc3RhY2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDb21iaW5lIG11bHRpcGxlIGNhcmdvIHN0YWNrcyBvZiB0aGUgc2FtZSBpdGVtIHR5cGUgaW50byBhIHNpbmdsZSBzdGFjayB3aXRoIG5ldyBibGVuZGVkIHN0YXRzLiBBbGwgaW5wdXQgc3RhY2tzIG11c3Qgc2hhcmUgdGhlIHNhbWUgaXRlbSBpZC4gVGhlIG91dHB1dCBzdGFjayBoYXMgdGhlIGNvbWJpbmVkIHF1YW50aXR5IG9mIGFsbCBpbnB1dHMuAAAAAESFpkEGY2FuY2VswgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2FuY2VsCnN1bW1hcnk6ICdDYW5jZWwgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYW5jZWwgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGFza3MgZnJvbSB0aGUgZW5kIG9mIGFuIGVudGl0eSdzIHNjaGVkdWxlLiBUYXNrcyB0aGF0IGFyZSBpbW11dGFibGUgYW5kIGluIHByb2dyZXNzIGNhbm5vdCBiZSBjYW5jZWxsZWQuAACoG99pVEQJY2xlYW5yc3Zw7AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYW5yc3ZwCnN1bW1hcnk6ICdDbGVhbiB1cCBwYXN0IGVwb2NoIHJlc2VydmVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFcmFzZSByZXNlcnZlIHRhYmxlIHJvd3MgZnJvbSBhIHBhc3QgZXBvY2guIENhbm5vdCBjbGVhbiB0aGUgY3VycmVudCBvciBmdXR1cmUgZXBvY2hzLiBUaGUgbWF4X3Jvd3MgcGFyYW1ldGVyIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIGVyYXNlZCBwZXIgY2FsbCB0byBsaW1pdCBDUFUgdXNhZ2UuAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdOwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4AAGA0MrcmRQljb25maWdsb2fdAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjb25maWdsb2cKc3VtbWFyeTogJ0xvZyBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IGxvZ3MgdGhlIGN1cnJlbnQgZ2FtZSBjb25maWd1cmF0aW9uLiBDYWxsZWQgaW5saW5lIGFmdGVyIGluaXRpYWxpemF0aW9uIHRvIGJyb2FkY2FzdCBjb25maWcgdmlhIGFjdGlvbiB0cmFjZXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAgLzMRQVjcmFmdMgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNyYWZ0CnN1bW1hcnk6ICdDcmFmdCBpdGVtcyBmcm9tIGEgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2Zvcm0gY2FyZ28gaXRlbXMgaW50byBhIG5ldyBpdGVtIHVzaW5nIGEgcmVjaXBlLiBUaGUgZW50aXR5IG11c3QgaGF2ZSBhIGNyYWZ0ZXIgbW9kdWxlIGluc3RhbGxlZC4gQ29uc3VtZXMgZW5lcmd5IGFuZCBzY2hlZHVsZXMgYSBjcmFmdGluZyB0YXNrIHdpdGggZHVyYXRpb24gYmFzZWQgb24gdG90YWwgaW5wdXQgbWFzcyBhbmQgY3JhZnRlciBzcGVlZC4gSW5wdXQgcXVhbnRpdGllcyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2lwZSByZXF1aXJlbWVudHMu4LPLU6ls1EUMY3JlYXRlZW50aXR5vwEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY3JlYXRlZW50aXR5CnN1bW1hcnk6ICdERUJVRzogY3JlYXRlIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAAB4GqtKBmRlcGxveewCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlcGxveQpzdW1tYXJ5OiAnRGVwbG95IGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVW5wYWNrIGEgcGFja2VkIGVudGl0eSBpdGVtIChwYWNrZWQgc2hpcCBvciBwYWNrZWQgY29udGFpbmVyKSBmcm9tIGNhcmdvLCBzY2hlZHVsaW5nIGEgZGVwbG95IHRhc2sgdGhhdCBjcmVhdGVzIHRoZSBuZXcgZW50aXR5IGF0IHRoZSBkZXBsb3lpbmcgZW50aXR5J3MgbG9jYXRpb24gdXBvbiByZXNvbHV0aW9uLgCAzy5PhbBKCmRlc2NlbnRpdHn9Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBkZXNjZW50aXR5CnN1bW1hcnk6ICdEZXNjcmliZSBhIHBhY2tlZCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gc3RyaW5nIGZvciBhIHBhY2tlZCBlbnRpdHksIGRlcml2ZWQgZnJvbSB0aGUgZW50aXR5IGl0ZW0gaWQsIGh1bGwgc3RhdHMsIGFuZCB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGl0ZW0gaWRzIGFuZCBzdGF0cy4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgTkZUIHJlbmRlcmVycyB0byBkaXNwbGF5IHBhY2tlZCBlbnRpdGllcy4gQ2FsbGluZyB0aGlzIGFjdGlvbiBkb2VzIG5vdCBtb2RpZnkgY29udHJhY3Qgc3RhdGUuAAAAAKh4zFQGZW5hYmxl3QEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZW5hYmxlCnN1bW1hcnk6ICdTZXQgZW5hYmxlZCBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRW5hYmxlIG9yIGRpc2FibGUgdGhpcyBnYW1lIG9mIFNoaXBsb2FkLgAAAABc1bJhBmdhdGhlcpcDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdhdGhlcgpzdW1tYXJ5OiAnR2F0aGVyIHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKR2F0aGVyIHJlc291cmNlcyBhdCB0aGUgc2hpcCdzIGN1cnJlbnQgbG9jYXRpb24uIE9ubHkgd29ya3MgYXQgZ2F0aGVyYWJsZSBsb2NhdGlvbiB0eXBlcy4gU2NoZWR1bGVzIGEgZ2F0aGVyIHRhc2sgdGhhdCBjb25zdW1lcyBlbmVyZ3kgYW5kIHlpZWxkcyBjYXJnbyBiYXNlZCBvbiB0aGUgc2hpcCdzIGdhdGhlcmVyIHN0YXRzIGFuZCB0aGUgbG9jYXRpb24ncyByZXNvdXJjZSBjb21wb3NpdGlvbi4AAGBuTYqyYglnZXRjb25maWfKAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRjb25maWcKc3VtbWFyeTogJ0dldCBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgdGhlIGdhbWUgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgZGVmYXVsdCBlbnRpdHkgc3RhdHMgZm9yIHdhcmVob3VzZXMgYW5kIGNvbnRhaW5lcnMsIGFuZCB0aGUgZnVsbCBpdGVtIGRlZmluaXRpb25zIHRhYmxlLgCwctnlqbJiC2dldGVudGl0aWVzpAItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0ZW50aXRpZXMKc3VtbWFyeTogJ0dldCBhbGwgZW50aXRpZXMgZm9yIGEgcGxheWVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXR1cm5zIGZ1bGwgZW50aXR5IGluZm8gZm9yIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllci4gT3B0aW9uYWxseSBmaWx0ZXIgYnkgZW50aXR5IHR5cGUuAADw2eWpsmIJZ2V0ZW50aXR5ogItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0ZW50aXR5CnN1bW1hcnk6ICdHZXQgZW50aXR5IHN0YXRlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIGVudGl0eSBpbmNsdWRpbmcgaWRlbnRpdHksIGNhcmdvLCBzY2hlZHVsZSBzdGF0ZSwgYW5kIHR5cGUtc3BlY2lmaWMgZmllbGRzLgBMNkmq7LJiC2dldGl0ZW1kYXRh3AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbWRhdGEKc3VtbWFyeTogJ0dldCBmdWxsIGl0ZW0gY2F0YWxvZycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGNvbXBsZXRlIGl0ZW0gY2F0YWxvZyBhcyB0aGUgY29udHJhY3Qgc2VlcyBpdCwgaW5jbHVkaW5nIHR5cGUsIHN1YnR5cGUsIHRpZXIsIG1hc3MsIGFuZCBvdGhlciBzdGF0aWMgbWV0YWRhdGEuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgYW5kIGNsaWVudHMgdG8gbWlycm9yIHRoZSBjb250cmFjdCdzIGl0ZW0gZGVmaW5pdGlvbnMuIENhbGxpbmcgdGhpcyBhY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGNvbnRyYWN0IHN0YXRlLgAAAFiq7LJiCGdldGl0ZW1zmgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXMKc3VtbWFyeTogJ0dldCBhbGwgYXZhaWxhYmxlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgaXRlbXMgaW4gdGhlIGdhbWUgaW5jbHVkaW5nIHRoZWlyIGlkLCBiYXNlIHByaWNlLCBhbmQgbWFzcy4AJnXZIBqzYgtnZXRsb2NhdGlvbuICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2F0aW9uCnN1bW1hcnk6ICdHZXQgbG9jYXRpb24gaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2NhdGlvbiBpbmNsdWRpbmcgd2hldGhlciBhIHN5c3RlbSBleGlzdHMsIGFuZCBmb3IgZWFjaCBpdGVtOiBwcmljZSwgc3VwcGx5LCByYXJpdHkgbXVsdGlwbGllciwgYW5kIGxvY2F0aW9uIG11bHRpcGxpZXIuAIDJJiEas2IKZ2V0bG9jZGF0Yf4CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGxvY2RhdGEKc3VtbWFyeTogJ0dldCBkZXJpdmVkIGxvY2F0aW9uIGRhdGEnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgZGVyaXZlZCBsb2NhdGlvbiBkYXRhIGluY2x1ZGluZyBzdGF0aWMgcHJvcGVydGllcyAodHlwZSwgZGlmZmljdWx0eSwgc2VlZHMpIGZyb20gdGhlIGdhbWUgc2VlZCBhbmQgZXBvY2gtc3BlY2lmaWMgcHJvcGVydGllcyAoYWN0aXZlLCBzZWVkcykgZnJvbSB0aGUgY3VycmVudCBlcG9jaCBzZWVkLgAAVlEnKrNiCmdldG1vZHVsZXO0Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRtb2R1bGVzCnN1bW1hcnk6ICdHZXQgYWxsIG1vZHVsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIG1vZHVsZXMsIGluY2x1ZGluZyBlYWNoIG1vZHVsZSdzIGlkLCBtYXNzLCBzdWJ0eXBlLCBhbmQgdGllci4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBlbnVtZXJhdGUgaW5zdGFsbGFibGUgZXF1aXBtZW50LiBDYWxsaW5nIHRoaXMgYWN0aW9uIGRvZXMgbm90IG1vZGlmeSBjb250cmFjdCBzdGF0ZS4AAPDnGjWzYglnZXRuZWFyYnneAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRuZWFyYnkKc3VtbWFyeTogJ0dldCBuZWFyYnkgcmVhY2hhYmxlIHN5c3RlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgbmVhcmJ5IHN5c3RlbXMgcmVhY2hhYmxlIGJ5IGFuIGVudGl0eSBmcm9tIGl0cyBwcm9qZWN0ZWQgbG9jYXRpb24uIFJldHVybnMgY3VycmVudCBzdGF0ZSAod2l0aCBjb21wbGV0ZWQgdGFza3MgcmVzb2x2ZWQpLCBwcm9qZWN0ZWQgc3RhdGUgKGFmdGVyIGFsbCBzY2hlZHVsZWQgdGFza3MpLCBhbmQgYSBsaXN0IG9mIHJlYWNoYWJsZSBzeXN0ZW1zIHdpdGggZGlzdGFuY2UsIGVuZXJneSBjb3N0LCBmbGlnaHQgdGltZSwgYW5kIG1hcmtldCBpbmZvcm1hdGlvbi4AAF3T5TWzYgpnZXRuZnRpbmZvpAQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bmZ0aW5mbwpzdW1tYXJ5OiAnR2V0IE5GVCBzY2hlbWEgYW5kIHRlbXBsYXRlIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBBdG9taWNBc3NldHMgc2NoZW1hcyBhbmQgdGVtcGxhdGVzIHRoZSBnYW1lIGNvbnRyYWN0IGV4cGVjdHMsIHBsdXMgdGhlIGN1cnJlbnQgYGl0ZW1faWQg4oaSICh0ZW1wbGF0ZV9pZCwgc2NoZW1hX25hbWUpYCBtYXBwaW5nIHN0b3JlZCBpbiB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gc3luYyBhdG9taWNhc3NldHMgc3RhdGUgd2l0aCB0aGUgY29udHJhY3QuIENhbGxpbmcgdGhpcyBhY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGNvbnRyYWN0IHN0YXRlLgAAuMqbWLNiCWdldHBsYXllcv0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHBsYXllcgpzdW1tYXJ5OiAnR2V0IHBsYXllciBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBsYXllciBpbmNsdWRpbmcgYmFsYW5jZSwgZGVidCwgbmV0d29ydGgsIGVudGl0eSBjb3VudHMsIGFuZCBwcmljaW5nIGZvciBuZXh0IHB1cmNoYXNlcy4gUmV0dXJucyBpc19wbGF5ZXI9ZmFsc2UgaWYgdGhlIGFjY291bnQgaGFzIG5vdCBqb2luZWQgdGhlIGdhbWUuAABQ1SF1s2IJZ2V0cmVjaXBl2gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVjaXBlCnN1bW1hcnk6ICdHZXQgYSBzaW5nbGUgY3JhZnRpbmcgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgcmVjaXBlIHdob3NlIG91dHB1dCBtYXRjaGVzIHRoZSBnaXZlbiBpdGVtIGlkLCBpbmNsdWRpbmcgaXRzIGlucHV0cywgYmxlbmQgd2VpZ2h0cywgc3RhdCBzbG90cywgYW5kIHJlc29sdmVkIGl0ZW0gbWFzcyBpbmZvLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRpc3BsYXkgY3JhZnRpbmcgcmVxdWlyZW1lbnRzLiBDYWxsaW5nIHRoaXMgYWN0aW9uIGRvZXMgbm90IG1vZGlmeSBjb250cmFjdCBzdGF0ZS4AAFbVIXWzYgpnZXRyZWNpcGVz4AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVjaXBlcwpzdW1tYXJ5OiAnTGlzdCBjcmFmdGluZyByZWNpcGVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyBhIHBhZ2luYXRlZCBsaXN0IG9mIGNyYWZ0aW5nIHJlY2lwZXMgc3RhcnRpbmcgYXQgdGhlIHByb3ZpZGVkIGxvd2VyIGJvdW5kIG91dHB1dCBpdGVtIGlkLCB1cCB0byB0aGUgc3BlY2lmaWVkIGxpbWl0LiBFYWNoIGVudHJ5IGluY2x1ZGVzIGlucHV0cywgYmxlbmQgd2VpZ2h0cywgc3RhdCBzbG90cywgYW5kIHJlc29sdmVkIGl0ZW0gbWFzcyBpbmZvLiBDYWxsaW5nIHRoaXMgYWN0aW9uIGRvZXMgbm90IG1vZGlmeSBjb250cmFjdCBzdGF0ZS6AFbqaYnWzYgxnZXRyZXNvdXJjZXO7Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZXNvdXJjZXMKc3VtbWFyeTogJ0dldCBhbGwgcmVzb3VyY2UgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgaXRlbXMgY2xhc3NpZmllZCBhcyByZXNvdXJjZXMsIGluY2x1ZGluZyBlYWNoIHJlc291cmNlJ3MgaWQsIG1hc3MsIHN1YnR5cGUsIGFuZCB0aWVyLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGVudW1lcmF0ZSBnYXRoZXJhYmxlIG1hdGVyaWFscy4gQ2FsbGluZyB0aGlzIGFjdGlvbiBkb2VzIG5vdCBtb2RpZnkgY29udHJhY3Qgc3RhdGUuAIDU2dyMs2IKZ2V0c3RyYXR1bdICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHN0cmF0dW0Kc3VtbWFyeTogJ0dldCByZXNvdXJjZSBzdHJhdHVtIGRhdGEnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhIGZvciBhIHNwZWNpZmljIGRlcHRoIGxheWVyIGF0IGEgY29vcmRpbmF0ZSwgaW5jbHVkaW5nIHRoZSBzdHJhdHVtIHNlZWQgaW5mbyBhbmQgZGVyaXZlZCByZXNvdXJjZSBzdGF0cy6AlbtGSo2zYgxnZXRzdW1tYXJpZXPoAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdW1tYXJpZXMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3VtbWFyaWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBsaWdodHdlaWdodCBzdW1tYXJpZXMgb2YgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyIGluY2x1ZGluZyB0eXBlLCBpZCwgb3duZXIsIG5hbWUsIGxvY2F0aW9uLCBhbmQgaWRsZSBzdGF0dXMuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgCi2ubmqullC2dyb3VwdHJhdmVsmgQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ3JvdXB0cmF2ZWwKc3VtbWFyeTogJ01vdmUgbXVsdGlwbGUgZW50aXRpZXMgdG9nZXRoZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIGdyb3VwIHRyYXZlbCBmb3IgbXVsdGlwbGUgZW50aXRpZXMgdG8gYSBkZXN0aW5hdGlvbi4gQWxsIGVudGl0aWVzIG11c3QgYmUgYXQgdGhlIHNhbWUgbG9jYXRpb24gYW5kIG93bmVkIGJ5IHRoZSBjYWxsZXIuIEF0IGxlYXN0IG9uZSBlbnRpdHkgd2l0aCBlbmdpbmVzIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhydXN0LiBGbGlnaHQgZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBmcm9tIGNvbWJpbmVkIHRocnVzdCBhbmQgdG90YWwgbWFzcyBvZiBhbGwgZW50aXRpZXMuIENyZWF0ZXMgYW4gZW50aXR5Z3JvdXAgZm9yIGF0b21pYyByZXNvbHV0aW9uIGFuZCBjYW5jZWxsYXRpb24uAAAAAADQsGkEaGFzaPgBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2gKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGEyNTYgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhMjU2IGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4AAABAhNKwaQdoYXNoNTEy+wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaGFzaDUxMgpzdW1tYXJ5OiAnQ2FsY3VsYXRlIHNoYTUxMiBoYXNoJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYWxjdWxhdGVzIHRoZSBzaGE1MTIgaGFzaCBvZiBhIHN0cmluZyBiYXNlZCB1c2luZyB0aGUgZ2FtZSBzZWVkLgAAAAAAkN10BGluaXT6AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBpbml0CnN1bW1hcnk6ICdJbml0aWFsaXplIGdhbWUgc2VlZCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhbGl6ZSBhIHRoZSBnYW1lcyBzZWVkIGFuZCBzZWVkIHZhbHVlcyB0byBib290c3RyYXAgZ2FtZSBzdGF0ZS4AAAAAADAdfQRqb2luxAEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogam9pbgpzdW1tYXJ5OiAnSm9pbiBhIGdhbWUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkpvaW4gYSBnYW1lIG9mIFNoaXBsb2FkAAAAAPjlMp0Gbm90aWZ5igMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogbm90aWZ5CnN1bW1hcnk6ICdUYXNrIGxpZmVjeWNsZSBub3RpZmljYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IG5vdGlmaWVzIGVudGl0eSBvd25lcnMgb2YgdGFzayBsaWZlY3ljbGUgZXZlbnRzIChyZXNvbHZlZCwgY2FuY2VsbGVkKS4gQ2FsbGVkIGlubGluZSB3aGVuIHRhc2tzIGNoYW5nZSBzdGF0ZS4gVXNlcyByZXF1aXJlX3JlY2lwaWVudCB0byBlbmFibGUgb2ZmLWNoYWluIG1vbml0b3JpbmcgdmlhIGFjdGlvbiB0cmFjZXMuAAAAil3TkLoIcmVjaGFyZ2XNAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZWNoYXJnZQpzdW1tYXJ5OiAnUmVjaGFyZ2Ugc2hpcCBlbmVyZ3knCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClNjaGVkdWxlIGEgcmVjaGFyZ2UgdGFzayBmb3IgYW4gZW50aXR5IHRvIHJlc3RvcmUgZW5lcmd5IHRvIGZ1bGwgY2FwYWNpdHkuIFRoZSByZWNoYXJnZSBkdXJhdGlvbiBkZXBlbmRzIG9uIGN1cnJlbnQgZW5lcmd5IGxldmVsIGFuZCByZWNoYXJnZSByYXRlLgAAAEDtSLG6B3Jlc29sdmXQAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZXNvbHZlCnN1bW1hcnk6ICdDb21wbGV0ZSBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlc29sdmUgY29tcGxldGVkIHRhc2tzIGluIGFuIGVudGl0eSdzIHNjaGVkdWxlLCBhcHBseWluZyB0aGVpciBlZmZlY3RzIChyZWNoYXJnZSBlbmVyZ3ksIHVwZGF0ZSBsb2NhdGlvbiwgbG9hZC91bmxvYWQgY2FyZ28pLiBJZiBjb3VudCBpcyBzcGVjaWZpZWQsIHJlc29sdmUgZXhhY3RseSB0aGF0IG1hbnkgdGFza3M7IG90aGVyd2lzZSByZXNvbHZlIGFsbCBjb21wbGV0ZWQgdGFza3MuIEZhaWxzIGlmIGNvdW50IGV4Y2VlZHMgdGhlIG51bWJlciBvZiBjb21wbGV0ZWQgdGFza3MuAAAAKupEpbwIcm1tb2R1bGW8Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW1vZHVsZQpzdW1tYXJ5OiAnUmVtb3ZlIGEgbW9kdWxlIGZyb20gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgYW4gaW5zdGFsbGVkIG1vZHVsZSBmcm9tIGEgc2xvdCBvbiBhIGxpdmUgZW50aXR5IG9yIGEgcGFja2VkIGVudGl0eSBpbiBjYXJnby4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBubyBzY2hlZHVsZWQgdGFza3MuIFRoZSBtb2R1bGUgaXMgcmV0dXJuZWQgdG8gY2FyZ28uIEZhaWxzIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgaGF2ZSBlbm91Z2ggY2FyZ28gY2FwYWNpdHkgdG8gaG9sZCB0aGUgcmV0dXJuZWQgbW9kdWxlLgAAAGyhvKa8CHJtbmZ0Y2ZnoQMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcm1uZnRjZmcKc3VtbWFyeTogJ1JlbW92ZSBORlQgdGVtcGxhdGUgbWFwcGluZyBmb3IgYW4gaXRlbScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVtb3ZlIHRoZSBBdG9taWNBc3NldHMgdGVtcGxhdGUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIGlkIGZyb20gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBBZnRlciByZW1vdmFsIHRoZSBpdGVtIGNhbiBubyBsb25nZXIgYmUgd3JhcHBlZCBvciB1bndyYXBwZWQgdW50aWwgYSBuZXcgbWFwcGluZyBpcyBzZXQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAAJCjwQRzYWx02AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc2FsdApzdW1tYXJ5OiAnQXBwZW5kIFNhbHQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkFkZCBhZGRpdGlvbmFsIHNhbHQgdG8gdGhlIG5leHQgZXBvY2ggc2VlZC4AAGAL5TWzwglzZXRuZnRjZmfEAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzZXRuZnRjZmcKc3VtbWFyeTogJ1NldCBORlQgdGVtcGxhdGUgbWFwcGluZyBmb3IgYW4gaXRlbScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQmluZCBhbiBpdGVtIGlkIHRvIGFuIEF0b21pY0Fzc2V0cyB0ZW1wbGF0ZSBpZCBhbmQgc2NoZW1hIG5hbWUuIFVzZWQgdG8gY29uZmlndXJlIGhvdyB0aGUgY29udHJhY3QgbWludHMgYW5kIHJlY29nbml6ZXMgTkZUcyBmb3IgYSBnaXZlbiBpdGVtLiBJbnNlcnRzIGEgbmV3IG1hcHBpbmcgaWYgb25lIGRvZXMgbm90IGV4aXN0LCBvciB1cGRhdGVzIHRoZSBleGlzdGluZyBtYXBwaW5nLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAABl16DJTcUKc3Bhd25jYXJnb8UBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNwYXduY2FyZ28Kc3VtbWFyeTogJ0RFQlVHOiBzcGF3biBjYXJnbyBvbiBhbiBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AkoLI1MlNxQtzcGF3bnBhY2tlZOcBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNwYXducGFja2VkCnN1bW1hcnk6ICdERUJVRzogc3Bhd24gYSBwYWNrZWQgZW50aXR5IHdpdGggaW5zdGFsbGVkIG1vZHVsZXMgb24gYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAJJKSuHJTcULc3Bhd25zZWVkZWTNAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzcGF3bnNlZWRlZApzdW1tYXJ5OiAnREVCVUc6IHNwYXduIHNlZWRlZCBjYXJnbyBvbiBhbiBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAABXLTzNzQh0cmFuc2ZlcsgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYW5zZmVyCnN1bW1hcnk6ICdUcmFuc2ZlciBjYXJnbyBiZXR3ZWVuIGVudGl0aWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2ZlciBjYXJnbyBiZXR3ZWVuIHR3byBlbnRpdGllcyBhdCB0aGUgc2FtZSBsb2NhdGlvbi4gQm90aCBlbnRpdGllcyBtdXN0IGJlIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIGF0IGxlYXN0IG9uZSBtdXN0IGhhdmUgbG9hZGVycy4gQ3JlYXRlcyBsb2FkIGFuZCB1bmxvYWQgdGFza3Mgb24gYm90aCBlbnRpdGllcyB3aXRoIGR1cmF0aW9uIGJhc2VkIG9uIGNvbWJpbmVkIGxvYWRlciBjYXBhY2l0eSBhbmQgWi1kaXN0YW5jZSBiZXR3ZWVuIHRoZW0uAAAAAES1zc0GdHJhdmVs+wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIGEgc2hpcCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhdGUgdHJhdmVsIG9mIGFuIGVudGl0eSBmcm9tIGl0cyBjdXJyZW50IGxvY2F0aW9uIHRvIGEgbmV3IGRlc3RpbmF0aW9uLgAAAAAAUK/hBHdhcnCfAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3YXJwCnN1bW1hcnk6ICdXYXJwIHRvIGEgZGVzdGluYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluc3RhbnRseSB0ZWxlcG9ydCBhbiBlbnRpdHkgdG8gYSBkZXN0aW5hdGlvbiBzeXN0ZW0uIFJlcXVpcmVzIHdhcnAgY2FwYWJpbGl0eSwgZnVsbCBlbmVyZ3ksIGVtcHR5IGNhcmdvLCBhbmQgYW4gZW1wdHkgc2NoZWR1bGUuIFRoZSBkZXN0aW5hdGlvbiBtdXN0IGJlIGEgdmFsaWQgc3lzdGVtIHdpdGhpbiB3YXJwIHJhbmdlLiBSZXNvbHZlcyBpbW1lZGlhdGVseSBhcyBhIHplcm8tZHVyYXRpb24gdGFzay4AAAAAAKCq4wR3aXBlsgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2lwZQpzdW1tYXJ5OiAnREVCVUc6IHdpcGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0toNBU2iqsquMMd2lwZXNlcXVlbmNlwgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2lwZXNlcXVlbmNlCnN1bW1hcnk6ICdERUJVRzogd2lwZXNlcXVlbmNlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAAAAUM3lBHdyYXD+Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3cmFwCnN1bW1hcnk6ICdXcmFwIGNhcmdvIGludG8gYW4gTkZUJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpXcmFwIGEgcXVhbnRpdHkgb2YgY2FyZ28gZnJvbSBhbiBlbnRpdHkgaW50byBhbiBBdG9taWNBc3NldHMgTkZUIG1pbnRlZCB0byB0aGUgc3BlY2lmaWVkIG93bmVyLiBUaGUgZW50aXR5IG11c3QgYmUgYXQgYSBuZXh1cywgaGF2ZSBsb2FkZXJzLCBhbmQgY29udGFpbiBlbm91Z2ggb2YgdGhlIHJlcXVlc3RlZCBjYXJnby4gU2NoZWR1bGVzIGEgd3JhcCB0YXNrIHRoYXQsIG9uIHJlc29sdXRpb24sIHJlbW92ZXMgdGhlIGNhcmdvIGZyb20gdGhlIGVudGl0eSBhbmQgbWludHMgdGhlIE5GVCB1c2luZyB0aGUgdGVtcGxhdGUgY29uZmlndXJlZCBmb3IgdGhhdCBpdGVtIGlkLg0AAAAAAMquQQNpNjQAAAljYXJnb19yb3cAALhqOpMnRQNpNjQAAA1jb250YWluZXJfcm93AKqml/ns8lQDaTY0AAAPZW50aXR5Z3JvdXBfcm93AAAAk7psEI0DaTY0AAAMbG9jYXRpb25fcm93AAAAAACsu5oDaTY0AAAJbmV4dXNfcm93AABgbk2K8poDaTY0AAANbmZ0Y29uZmlnX3JvdwAAAABc5U2sA2k2NAAACnBsYXllcl9yb3cAAABA7auwugNpNjQAAAtyZXNlcnZlX3JvdwAAAApNpa3CA2k2NAAADHNlcXVlbmNlX3JvdwAAAAAAUF3DA2k2NAAACHNoaXBfcm93AAAAAACVTcYDaTY0AAAJc3RhdGVfcm93AAAAAACsqs8DaTY0AAAJdHlwZXNfcm93AABQWNOmruEDaTY0AAANd2FyZWhvdXNlX3JvdwERU2hpcGxvYWQgKFNlcnZlcikRU2hpcGxvYWQgKFNlcnZlcikAAAAeAAAAAESFpkEOY2FuY2VsX3Jlc3VsdHMAAAAAgLzMRQx0YXNrX3Jlc3VsdHMAAAAAeBqrSgx0YXNrX3Jlc3VsdHMAgM8uT4WwSgZzdHJpbmcAAAAAXNWyYQx0YXNrX3Jlc3VsdHMAAGBuTYqyYgtnYW1lX2NvbmZpZwCwctnlqbJiDWVudGl0eV9pbmZvW10AAPDZ5amyYgtlbnRpdHlfaW5mbwBMNkmq7LJiD2l0ZW1kYXRhX3Jlc3VsdAAAAFiq7LJiCml0ZW1zX2luZm8AJnXZIBqzYg1sb2NhdGlvbl9pbmZvAIDJJiEas2IQbG9jYXRpb25fZGVyaXZlZAAAVlEnKrNiDm1vZHVsZXNfcmVzdWx0AADw5xo1s2ILbmVhcmJ5X2luZm8AAF3T5TWzYg5uZnRpbmZvX3Jlc3VsdAAAuMqbWLNiC3BsYXllcl9pbmZvAABQ1SF1s2IOcmVjaXBlc19yZXN1bHQAAFbVIXWzYg5yZWNpcGVzX3Jlc3VsdIAVuppidbNiEHJlc291cmNlc19yZXN1bHQAgNTZ3IyzYgxzdHJhdHVtX2RhdGGAlbtGSo2zYhBlbnRpdHlfc3VtbWFyeVtdAKLa5uaq6WUMdGFza19yZXN1bHRzAAAAAADQsGkLY2hlY2tzdW0yNTYAAABAhNKwaQtjaGVja3N1bTUxMgAAAIpd05C6DHRhc2tfcmVzdWx0cwAAAEDtSLG6D3Jlc29sdmVfcmVzdWx0cwAAAFctPM3NDHRhc2tfcmVzdWx0cwAAAABEtc3NDHRhc2tfcmVzdWx0cwAAAAAAUK/hDHRhc2tfcmVzdWx0cwAAAAAAUM3lDHRhc2tfcmVzdWx0cw==');
209
209
  const abi = ABI.from(abiBlob);
210
210
  var Types;
211
211
  (function (Types) {
@@ -257,25 +257,25 @@ var Types;
257
257
  Struct.type('advance')
258
258
  ], advance);
259
259
  Types.advance = advance;
260
- let cargo_seed = class cargo_seed extends Struct {
260
+ let packed_module = class packed_module extends Struct {
261
261
  };
262
262
  __decorate([
263
263
  Struct.field(UInt16)
264
- ], cargo_seed.prototype, "item_id", void 0);
264
+ ], packed_module.prototype, "item_id", void 0);
265
265
  __decorate([
266
266
  Struct.field(UInt64)
267
- ], cargo_seed.prototype, "seed", void 0);
268
- cargo_seed = __decorate([
269
- Struct.type('cargo_seed')
270
- ], cargo_seed);
271
- Types.cargo_seed = cargo_seed;
267
+ ], packed_module.prototype, "stats", void 0);
268
+ packed_module = __decorate([
269
+ Struct.type('packed_module')
270
+ ], packed_module);
271
+ Types.packed_module = packed_module;
272
272
  let module_entry = class module_entry extends Struct {
273
273
  };
274
274
  __decorate([
275
275
  Struct.field(UInt8)
276
276
  ], module_entry.prototype, "type", void 0);
277
277
  __decorate([
278
- Struct.field(cargo_seed, { optional: true })
278
+ Struct.field(packed_module, { optional: true })
279
279
  ], module_entry.prototype, "installed", void 0);
280
280
  module_entry = __decorate([
281
281
  Struct.type('module_entry')
@@ -290,8 +290,8 @@ var Types;
290
290
  Struct.field(UInt32)
291
291
  ], cargo_item.prototype, "quantity", void 0);
292
292
  __decorate([
293
- Struct.field(UInt64, { optional: true })
294
- ], cargo_item.prototype, "seed", void 0);
293
+ Struct.field(UInt64)
294
+ ], cargo_item.prototype, "stats", void 0);
295
295
  __decorate([
296
296
  Struct.field(module_entry, { array: true })
297
297
  ], cargo_item.prototype, "modules", void 0);
@@ -381,7 +381,7 @@ var Types;
381
381
  ], cargo_row.prototype, "quantity", void 0);
382
382
  __decorate([
383
383
  Struct.field(UInt64)
384
- ], cargo_row.prototype, "seed", void 0);
384
+ ], cargo_row.prototype, "stats", void 0);
385
385
  __decorate([
386
386
  Struct.field(module_entry, { array: true })
387
387
  ], cargo_row.prototype, "modules", void 0);
@@ -645,7 +645,7 @@ var Types;
645
645
  ], deploy.prototype, "packed_item_id", void 0);
646
646
  __decorate([
647
647
  Struct.field(UInt64)
648
- ], deploy.prototype, "seed", void 0);
648
+ ], deploy.prototype, "stats", void 0);
649
649
  __decorate([
650
650
  Struct.field('string')
651
651
  ], deploy.prototype, "entity_name", void 0);
@@ -660,13 +660,13 @@ var Types;
660
660
  ], descentity.prototype, "item_id", void 0);
661
661
  __decorate([
662
662
  Struct.field(UInt64)
663
- ], descentity.prototype, "hull_seed", void 0);
663
+ ], descentity.prototype, "hull_stats", void 0);
664
664
  __decorate([
665
665
  Struct.field(UInt16, { array: true })
666
666
  ], descentity.prototype, "module_items", void 0);
667
667
  __decorate([
668
668
  Struct.field(UInt64, { array: true })
669
- ], descentity.prototype, "module_seeds", void 0);
669
+ ], descentity.prototype, "module_stats", void 0);
670
670
  descentity = __decorate([
671
671
  Struct.type('descentity')
672
672
  ], descentity);
@@ -914,11 +914,11 @@ var Types;
914
914
  let gather = class gather extends Struct {
915
915
  };
916
916
  __decorate([
917
- Struct.field(Name)
918
- ], gather.prototype, "entity_type", void 0);
917
+ Struct.field(entity_ref)
918
+ ], gather.prototype, "source", void 0);
919
919
  __decorate([
920
- Struct.field(UInt64)
921
- ], gather.prototype, "id", void 0);
920
+ Struct.field(entity_ref)
921
+ ], gather.prototype, "destination", void 0);
922
922
  __decorate([
923
923
  Struct.field(UInt16)
924
924
  ], gather.prototype, "stratum", void 0);
@@ -1734,7 +1734,7 @@ var Types;
1734
1734
  ], ship_row.prototype, "name", void 0);
1735
1735
  __decorate([
1736
1736
  Struct.field(UInt64)
1737
- ], ship_row.prototype, "seed", void 0);
1737
+ ], ship_row.prototype, "stats", void 0);
1738
1738
  __decorate([
1739
1739
  Struct.field(coordinates)
1740
1740
  ], ship_row.prototype, "coordinates", void 0);
@@ -1806,9 +1806,9 @@ var Types;
1806
1806
  ], spawnpacked.prototype, "item_id", void 0);
1807
1807
  __decorate([
1808
1808
  Struct.field(UInt64)
1809
- ], spawnpacked.prototype, "hull_seed", void 0);
1809
+ ], spawnpacked.prototype, "hull_stats", void 0);
1810
1810
  __decorate([
1811
- Struct.field(cargo_seed, { array: true })
1811
+ Struct.field(packed_module, { array: true })
1812
1812
  ], spawnpacked.prototype, "installed", void 0);
1813
1813
  spawnpacked = __decorate([
1814
1814
  Struct.type('spawnpacked')
@@ -1827,7 +1827,7 @@ var Types;
1827
1827
  ], spawnseeded.prototype, "quantity", void 0);
1828
1828
  __decorate([
1829
1829
  Struct.field(UInt64)
1830
- ], spawnseeded.prototype, "seed", void 0);
1830
+ ], spawnseeded.prototype, "stats", void 0);
1831
1831
  spawnseeded = __decorate([
1832
1832
  Struct.type('spawnseeded')
1833
1833
  ], spawnseeded);
@@ -1912,6 +1912,9 @@ var Types;
1912
1912
  __decorate([
1913
1913
  Struct.field(UInt16)
1914
1914
  ], transfer.prototype, "item_id", void 0);
1915
+ __decorate([
1916
+ Struct.field(UInt64)
1917
+ ], transfer.prototype, "stats", void 0);
1915
1918
  __decorate([
1916
1919
  Struct.field(UInt32)
1917
1920
  ], transfer.prototype, "quantity", void 0);
@@ -1968,7 +1971,7 @@ var Types;
1968
1971
  ], warehouse_row.prototype, "name", void 0);
1969
1972
  __decorate([
1970
1973
  Struct.field(UInt64)
1971
- ], warehouse_row.prototype, "seed", void 0);
1974
+ ], warehouse_row.prototype, "stats", void 0);
1972
1975
  __decorate([
1973
1976
  Struct.field(coordinates)
1974
1977
  ], warehouse_row.prototype, "coordinates", void 0);
@@ -2270,21 +2273,21 @@ const PLANET_SUBTYPE_ICY = 3;
2270
2273
  const PLANET_SUBTYPE_OCEAN = 4;
2271
2274
  const PLANET_SUBTYPE_INDUSTRIAL = 5;
2272
2275
  const RESOURCE_CATALOG = [
2273
- { id: 26, tier: 't1' },
2274
- { id: 13, tier: 't2' },
2275
- { id: 24, tier: 't3' },
2276
- { id: 29, tier: 't1' },
2277
- { id: 47, tier: 't2' },
2278
- { id: 79, tier: 't3' },
2279
- { id: 1, tier: 't1' },
2280
- { id: 2, tier: 't2' },
2281
- { id: 18, tier: 't3' },
2282
- { id: 14, tier: 't1' },
2283
- { id: 1000, tier: 't2' },
2284
- { id: 1001, tier: 't3' },
2285
- { id: 6, tier: 't1' },
2286
- { id: 1003, tier: 't2' },
2287
- { id: 1002, tier: 't3' },
2276
+ { id: 101, tier: 't1' },
2277
+ { id: 102, tier: 't2' },
2278
+ { id: 103, tier: 't3' },
2279
+ { id: 201, tier: 't1' },
2280
+ { id: 202, tier: 't2' },
2281
+ { id: 203, tier: 't3' },
2282
+ { id: 301, tier: 't1' },
2283
+ { id: 302, tier: 't2' },
2284
+ { id: 303, tier: 't3' },
2285
+ { id: 401, tier: 't1' },
2286
+ { id: 402, tier: 't2' },
2287
+ { id: 403, tier: 't3' },
2288
+ { id: 501, tier: 't1' },
2289
+ { id: 502, tier: 't2' },
2290
+ { id: 503, tier: 't3' },
2288
2291
  ];
2289
2292
  function getDepthThreshold(tier) {
2290
2293
  switch (tier) {
@@ -2341,14 +2344,14 @@ function getResourceWeight(itemId, stratum) {
2341
2344
  return 10;
2342
2345
  }
2343
2346
  }
2344
- const ASTEROID_RESOURCES = [26, 13, 24, 29, 47];
2345
- const NEBULA_RESOURCES = [47, 79, 1, 2, 18];
2346
- const GAS_GIANT_RESOURCES = [1, 2, 18, 14, 6];
2347
- const ROCKY_RESOURCES = [26, 13, 24, 14, 1000, 1001, 1002];
2348
- const TERRESTRIAL_RESOURCES = [29, 47, 14, 1000, 6, 1003, 1002];
2349
- const ICY_RESOURCES = [26, 1, 2, 14, 1001, 6, 1003];
2350
- const OCEAN_RESOURCES = [29, 79, 1, 18, 6, 1003, 1002];
2351
- const INDUSTRIAL_RESOURCES = [26, 13, 24, 29, 79, 1000, 1001];
2347
+ const ASTEROID_RESOURCES = [101, 102, 103, 201, 202];
2348
+ const NEBULA_RESOURCES = [202, 203, 301, 302, 303];
2349
+ const GAS_GIANT_RESOURCES = [301, 302, 303, 401, 501];
2350
+ const ROCKY_RESOURCES = [101, 102, 103, 401, 402, 403, 503];
2351
+ const TERRESTRIAL_RESOURCES = [201, 202, 401, 402, 501, 502, 503];
2352
+ const ICY_RESOURCES = [101, 301, 302, 401, 403, 501, 502];
2353
+ const OCEAN_RESOURCES = [201, 203, 301, 303, 501, 502, 503];
2354
+ const INDUSTRIAL_RESOURCES = [101, 102, 103, 201, 203, 402, 403];
2352
2355
  function getLocationCandidates(locationType, subtype) {
2353
2356
  if (locationType === 2)
2354
2357
  return ASTEROID_RESOURCES;
@@ -4769,139 +4772,139 @@ class BaseManager {
4769
4772
 
4770
4773
  var itemsData = [
4771
4774
  {
4772
- id: 26,
4773
- name: "Iron",
4774
- description: "A versatile metal used in hulls and structures.",
4775
+ id: 101,
4776
+ name: "",
4777
+ description: "",
4775
4778
  mass: 30000,
4776
- category: "metal",
4779
+ category: "ore",
4777
4780
  tier: "t1",
4778
- color: "#B7410E"
4781
+ color: "#C26D3F"
4779
4782
  },
4780
4783
  {
4781
- id: 13,
4782
- name: "Aluminum",
4783
- description: "A lightweight metal for structural components.",
4784
+ id: 102,
4785
+ name: "",
4786
+ description: "",
4784
4787
  mass: 27000,
4785
- category: "metal",
4788
+ category: "ore",
4786
4789
  tier: "t2",
4787
- color: "#A8B5C2"
4790
+ color: "#C26D3F"
4788
4791
  },
4789
4792
  {
4790
- id: 24,
4791
- name: "Chromium",
4792
- description: "A hard, corrosion-resistant alloy metal.",
4793
+ id: 103,
4794
+ name: "",
4795
+ description: "",
4793
4796
  mass: 52000,
4794
- category: "metal",
4797
+ category: "ore",
4795
4798
  tier: "t3",
4796
- color: "#D4E6F1"
4799
+ color: "#C26D3F"
4797
4800
  },
4798
4801
  {
4799
- id: 29,
4800
- name: "Copper",
4801
- description: "A conductive metal for electronics and wiring.",
4802
+ id: 201,
4803
+ name: "",
4804
+ description: "",
4802
4805
  mass: 40000,
4803
- category: "precious",
4806
+ category: "crystal",
4804
4807
  tier: "t1",
4805
- color: "#B87333"
4808
+ color: "#4ADBFF"
4806
4809
  },
4807
4810
  {
4808
- id: 47,
4809
- name: "Silver",
4810
- description: "A high-conductivity metal for precision components.",
4811
+ id: 202,
4812
+ name: "",
4813
+ description: "",
4811
4814
  mass: 55000,
4812
- category: "precious",
4815
+ category: "crystal",
4813
4816
  tier: "t2",
4814
- color: "#C0C0C0"
4817
+ color: "#4ADBFF"
4815
4818
  },
4816
4819
  {
4817
- id: 79,
4818
- name: "Gold",
4819
- description: "A corrosion-proof metal for advanced electronics.",
4820
+ id: 203,
4821
+ name: "",
4822
+ description: "",
4820
4823
  mass: 70000,
4821
- category: "precious",
4824
+ category: "crystal",
4822
4825
  tier: "t3",
4823
- color: "#FFD700"
4826
+ color: "#4ADBFF"
4824
4827
  },
4825
4828
  {
4826
- id: 1,
4827
- name: "Hydrogen",
4828
- description: "A lightweight gas used for fuel cells and propulsion.",
4829
+ id: 301,
4830
+ name: "",
4831
+ description: "",
4829
4832
  mass: 15000,
4830
4833
  category: "gas",
4831
4834
  tier: "t1",
4832
- color: "#7EC8E3"
4835
+ color: "#B8E4A0"
4833
4836
  },
4834
4837
  {
4835
- id: 2,
4836
- name: "Helium",
4837
- description: "An inert noble gas used in energy systems.",
4838
+ id: 302,
4839
+ name: "",
4840
+ description: "",
4838
4841
  mass: 2000,
4839
4842
  category: "gas",
4840
4843
  tier: "t2",
4841
- color: "#F5E6CC"
4844
+ color: "#B8E4A0"
4842
4845
  },
4843
4846
  {
4844
- id: 18,
4845
- name: "Argon",
4846
- description: "A noble gas used in industrial and energy applications.",
4847
+ id: 303,
4848
+ name: "",
4849
+ description: "",
4847
4850
  mass: 8000,
4848
4851
  category: "gas",
4849
4852
  tier: "t3",
4850
- color: "#9B59B6"
4853
+ color: "#B8E4A0"
4851
4854
  },
4852
4855
  {
4853
- id: 14,
4854
- name: "Silicon",
4855
- description: "A semiconductor used in sensors and computing.",
4856
+ id: 401,
4857
+ name: "",
4858
+ description: "",
4856
4859
  mass: 22000,
4857
- category: "mineral",
4860
+ category: "regolith",
4858
4861
  tier: "t1",
4859
- color: "#B8A9C9"
4862
+ color: "#C4A57B"
4860
4863
  },
4861
4864
  {
4862
- id: 1000,
4863
- name: "Quartz",
4864
- description: "A crystalline mineral for sensors and optics.",
4865
+ id: 402,
4866
+ name: "",
4867
+ description: "",
4865
4868
  mass: 35000,
4866
- category: "mineral",
4869
+ category: "regolith",
4867
4870
  tier: "t2",
4868
- color: "#E8D5B7"
4871
+ color: "#C4A57B"
4869
4872
  },
4870
4873
  {
4871
- id: 1001,
4872
- name: "Sapphire",
4873
- description: "A precious crystal for precision instruments.",
4874
+ id: 403,
4875
+ name: "",
4876
+ description: "",
4874
4877
  mass: 45000,
4875
- category: "mineral",
4878
+ category: "regolith",
4876
4879
  tier: "t3",
4877
- color: "#0F52BA"
4880
+ color: "#C4A57B"
4878
4881
  },
4879
4882
  {
4880
- id: 6,
4881
- name: "Carbon",
4882
- description: "A versatile element for life support and coatings.",
4883
+ id: 501,
4884
+ name: "",
4885
+ description: "",
4883
4886
  mass: 15000,
4884
- category: "organic",
4887
+ category: "biomass",
4885
4888
  tier: "t1",
4886
- color: "#4A4A4A"
4889
+ color: "#5A8B3E"
4887
4890
  },
4888
4891
  {
4889
- id: 1003,
4890
- name: "Biomass",
4891
- description: "Organic matter for life support systems.",
4892
+ id: 502,
4893
+ name: "",
4894
+ description: "",
4892
4895
  mass: 30000,
4893
- category: "organic",
4896
+ category: "biomass",
4894
4897
  tier: "t2",
4895
- color: "#8B4513"
4898
+ color: "#5A8B3E"
4896
4899
  },
4897
4900
  {
4898
- id: 1002,
4899
- name: "Resin",
4900
- description: "A fossilized organic compound for coatings and sealants.",
4901
+ id: 503,
4902
+ name: "",
4903
+ description: "",
4901
4904
  mass: 25000,
4902
- category: "organic",
4905
+ category: "biomass",
4903
4906
  tier: "t3",
4904
- color: "#DAA520"
4907
+ color: "#5A8B3E"
4905
4908
  }
4906
4909
  ];
4907
4910
 
@@ -4969,38 +4972,38 @@ const components = [
4969
4972
  {
4970
4973
  id: ITEM_HULL_PLATES,
4971
4974
  name: 'Hull Plates',
4972
- description: 'Structural plating formed from metal. Used in hulls, containers, and frames.',
4975
+ description: 'Structural plating formed from ore. Used in hulls, containers, and frames.',
4973
4976
  color: '#7B8D9E',
4974
4977
  mass: 50000,
4975
4978
  stats: [
4976
- { key: 'strength', source: 'metal' },
4977
- { key: 'density', source: 'metal' },
4979
+ { key: 'strength', source: 'ore' },
4980
+ { key: 'density', source: 'ore' },
4978
4981
  ],
4979
- recipe: [{ category: 'metal', quantity: 15 }],
4982
+ recipe: [{ category: 'ore', quantity: 15 }],
4980
4983
  usedIn: [
4981
4984
  { type: 'entity', name: 'Container' },
4982
- { type: 'entity', name: 'Warehouse T1' },
4983
- { type: 'entity', name: 'Ship T1' },
4985
+ { type: 'entity', name: 'Warehouse' },
4986
+ { type: 'entity', name: 'Ship' },
4984
4987
  ],
4985
4988
  },
4986
4989
  {
4987
4990
  id: ITEM_CARGO_LINING,
4988
4991
  name: 'Cargo Lining',
4989
- description: 'Precision-formed composite lining for cargo storage. Combines precious metal shaping with organic sealing.',
4990
- color: '#D4A843',
4992
+ description: 'Composite lining formed from fine regolith bound in biomass polymer. Dense enough to seal cargo holds, flexible enough to absorb vibration.',
4993
+ color: '#C4A57B',
4991
4994
  mass: 30000,
4992
4995
  stats: [
4993
- { key: 'ductility', source: 'precious' },
4994
- { key: 'purity', source: 'organic' },
4996
+ { key: 'fineness', source: 'regolith' },
4997
+ { key: 'saturation', source: 'biomass' },
4995
4998
  ],
4996
4999
  recipe: [
4997
- { category: 'precious', quantity: 6 },
4998
- { category: 'organic', quantity: 14 },
5000
+ { category: 'regolith', quantity: 10 },
5001
+ { category: 'biomass', quantity: 20 },
4999
5002
  ],
5000
5003
  usedIn: [
5001
5004
  { type: 'entity', name: 'Container' },
5002
- { type: 'entity', name: 'Warehouse T1' },
5003
- { type: 'entity', name: 'Ship T1' },
5005
+ { type: 'module', name: 'Loader' },
5006
+ { type: 'module', name: 'Storage' },
5004
5007
  ],
5005
5008
  },
5006
5009
  {
@@ -5019,73 +5022,76 @@ const components = [
5019
5022
  {
5020
5023
  id: ITEM_POWER_CELL,
5021
5024
  name: 'Power Cell',
5022
- description: 'Crystalline energy storage matrix formed from resonant minerals.',
5023
- color: '#7B5AE8',
5025
+ description: 'Crystalline energy storage matrix. Resonant lattices retain and release charge.',
5026
+ color: '#4ADBFF',
5024
5027
  mass: 30000,
5025
5028
  stats: [
5026
- { key: 'resonance', source: 'mineral' },
5027
- { key: 'clarity', source: 'mineral' },
5029
+ { key: 'resonance', source: 'crystal' },
5030
+ { key: 'reflectivity', source: 'crystal' },
5031
+ ],
5032
+ recipe: [{ category: 'crystal', quantity: 20 }],
5033
+ usedIn: [
5034
+ { type: 'module', name: 'Generator' },
5035
+ { type: 'module', name: 'Hauler' },
5028
5036
  ],
5029
- recipe: [{ category: 'mineral', quantity: 20 }],
5030
- usedIn: [{ type: 'module', name: 'Generator' }],
5031
5037
  },
5032
5038
  {
5033
5039
  id: ITEM_MATTER_CONDUIT,
5034
5040
  name: 'Matter Conduit',
5035
- description: 'Heavy-duty metal shaft used in gathering equipment.',
5041
+ description: 'Heavy-duty ore shaft used in gathering equipment.',
5036
5042
  color: '#7B8D9E',
5037
5043
  mass: 50000,
5038
5044
  stats: [
5039
- { key: 'strength', source: 'metal' },
5040
- { key: 'tolerance', source: 'metal' },
5045
+ { key: 'strength', source: 'ore' },
5046
+ { key: 'tolerance', source: 'ore' },
5041
5047
  ],
5042
- recipe: [{ category: 'metal', quantity: 15 }],
5048
+ recipe: [{ category: 'ore', quantity: 15 }],
5043
5049
  usedIn: [{ type: 'module', name: 'Gatherer' }],
5044
5050
  },
5045
5051
  {
5046
5052
  id: ITEM_SURVEY_PROBE,
5047
5053
  name: 'Survey Probe',
5048
- description: 'Precious metal sensor array for deep resource detection.',
5049
- color: '#D4A843',
5054
+ description: 'Crystal-lattice sensor array for deep resource detection.',
5055
+ color: '#4ADBFF',
5050
5056
  mass: 30000,
5051
5057
  stats: [
5052
- { key: 'conductivity', source: 'precious' },
5053
- { key: 'reflectivity', source: 'precious' },
5058
+ { key: 'conductivity', source: 'crystal' },
5059
+ { key: 'reflectivity', source: 'crystal' },
5054
5060
  ],
5055
- recipe: [{ category: 'precious', quantity: 10 }],
5061
+ recipe: [{ category: 'crystal', quantity: 10 }],
5056
5062
  usedIn: [{ type: 'module', name: 'Gatherer' }],
5057
5063
  },
5058
5064
  {
5059
5065
  id: ITEM_CARGO_ARM,
5060
5066
  name: 'Cargo Arm',
5061
- description: 'Flexible organic composite arm for cargo handling.',
5062
- color: '#6B8E5A',
5067
+ description: 'Flexible biomass composite arm for cargo handling.',
5068
+ color: '#5A8B3E',
5063
5069
  mass: 30000,
5064
5070
  stats: [
5065
- { key: 'plasticity', source: 'organic' },
5066
- { key: 'insulation', source: 'organic' },
5071
+ { key: 'plasticity', source: 'biomass' },
5072
+ { key: 'insulation', source: 'biomass' },
5067
5073
  ],
5068
- recipe: [{ category: 'organic', quantity: 32 }],
5074
+ recipe: [{ category: 'biomass', quantity: 32 }],
5069
5075
  usedIn: [{ type: 'module', name: 'Loader' }],
5070
5076
  },
5071
5077
  {
5072
5078
  id: ITEM_TOOL_BIT,
5073
5079
  name: 'Tool Bit',
5074
- description: 'Dense mineral cutting head for manufacturing operations.',
5075
- color: '#B8A9C9',
5080
+ description: 'Dense regolith cutting head for manufacturing operations.',
5081
+ color: '#C4A57B',
5076
5082
  mass: 30000,
5077
5083
  stats: [
5078
- { key: 'hardness', source: 'mineral' },
5079
- { key: 'clarity', source: 'mineral' },
5084
+ { key: 'hardness', source: 'regolith' },
5085
+ { key: 'composition', source: 'regolith' },
5080
5086
  ],
5081
- recipe: [{ category: 'mineral', quantity: 20 }],
5087
+ recipe: [{ category: 'regolith', quantity: 20 }],
5082
5088
  usedIn: [{ type: 'module', name: 'Manufacturing' }],
5083
5089
  },
5084
5090
  {
5085
5091
  id: ITEM_REACTION_CHAMBER,
5086
5092
  name: 'Reaction Chamber',
5087
5093
  description: 'Gas-pressurized vessel for controlled manufacturing reactions.',
5088
- color: '#7EC8E3',
5094
+ color: '#B8E4A0',
5089
5095
  mass: 50000,
5090
5096
  stats: [
5091
5097
  { key: 'reactivity', source: 'gas' },
@@ -5097,48 +5103,48 @@ const components = [
5097
5103
  {
5098
5104
  id: ITEM_FOCUSING_ARRAY,
5099
5105
  name: 'Focusing Array',
5100
- description: "Precision-formed precious-metal lens array. Routes the haul beam's energy efficiently to the target lock.",
5101
- color: '#D4A843',
5106
+ description: "Precision-formed crystal lens array. Routes the haul beam's energy efficiently to the target lock.",
5107
+ color: '#4ADBFF',
5102
5108
  mass: 40000,
5103
5109
  stats: [
5104
- { key: 'conductivity', source: 'precious' },
5105
- { key: 'ductility', source: 'precious' },
5110
+ { key: 'conductivity', source: 'crystal' },
5111
+ { key: 'resonance', source: 'crystal' },
5106
5112
  ],
5107
- recipe: [{ category: 'precious', quantity: 25 }],
5108
- usedIn: [{ type: 'module', name: 'Hauler Module T1' }],
5113
+ recipe: [{ category: 'crystal', quantity: 25 }],
5114
+ usedIn: [{ type: 'module', name: 'Hauler' }],
5109
5115
  },
5110
5116
  {
5111
5117
  id: ITEM_HULL_PLATES_T2,
5112
5118
  name: 'Hull Plates T2',
5113
- description: 'Advanced structural plating reinforced with tier 2 metals.',
5119
+ description: 'Advanced structural plating reinforced with tier 2 ore.',
5114
5120
  color: '#9BADB8',
5115
5121
  mass: 50000,
5116
5122
  stats: [
5117
- { key: 'strength', source: 'metal' },
5118
- { key: 'density', source: 'metal' },
5123
+ { key: 'strength', source: 'ore' },
5124
+ { key: 'density', source: 'ore' },
5119
5125
  ],
5120
5126
  recipe: [
5121
5127
  { itemId: ITEM_HULL_PLATES, quantity: 2 },
5122
- { category: 'metal', quantity: 15 },
5128
+ { category: 'ore', quantity: 15 },
5123
5129
  ],
5124
- usedIn: [{ type: 'entity', name: 'Container T2' }],
5130
+ usedIn: [{ type: 'entity', name: 'Container' }],
5125
5131
  },
5126
5132
  {
5127
5133
  id: ITEM_CARGO_LINING_T2,
5128
- name: 'Cargo Lining T2',
5129
- description: 'Advanced composite lining with improved storage properties.',
5130
- color: '#E0B84D',
5131
- mass: 30000,
5134
+ name: 'Cargo Lining',
5135
+ description: 'Advanced composite lining reinforced with tier 2 regolith and biomass polymer.',
5136
+ color: '#C4A57B',
5137
+ mass: 45000,
5132
5138
  stats: [
5133
- { key: 'ductility', source: 'precious' },
5134
- { key: 'purity', source: 'organic' },
5139
+ { key: 'fineness', source: 'regolith' },
5140
+ { key: 'saturation', source: 'biomass' },
5135
5141
  ],
5136
5142
  recipe: [
5137
5143
  { itemId: ITEM_CARGO_LINING, quantity: 2 },
5138
- { category: 'precious', quantity: 6 },
5139
- { category: 'organic', quantity: 14 },
5144
+ { category: 'regolith', quantity: 5 },
5145
+ { category: 'biomass', quantity: 10 },
5140
5146
  ],
5141
- usedIn: [{ type: 'entity', name: 'Container T2' }],
5147
+ usedIn: [{ type: 'entity', name: 'Container' }],
5142
5148
  },
5143
5149
  ];
5144
5150
  const entityRecipes = [
@@ -5155,13 +5161,13 @@ const entityRecipes = [
5155
5161
  stats: [
5156
5162
  { key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
5157
5163
  { key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
5158
- { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'ductility' },
5159
- { key: 'purity', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'purity' },
5164
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
5165
+ { key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
5160
5166
  ],
5161
5167
  },
5162
5168
  {
5163
5169
  id: 'ship-t1',
5164
- name: 'Ship T1',
5170
+ name: 'Ship',
5165
5171
  description: 'General-purpose vessel with 5 module slots.',
5166
5172
  color: '#4AE898',
5167
5173
  packedItemId: ITEM_SHIP_T1_PACKED,
@@ -5172,8 +5178,8 @@ const entityRecipes = [
5172
5178
  stats: [
5173
5179
  { key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
5174
5180
  { key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
5175
- { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'ductility' },
5176
- { key: 'purity', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'purity' },
5181
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
5182
+ { key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
5177
5183
  ],
5178
5184
  moduleSlots: [
5179
5185
  { type: MODULE_ANY },
@@ -5185,7 +5191,7 @@ const entityRecipes = [
5185
5191
  },
5186
5192
  {
5187
5193
  id: 'warehouse-t1',
5188
- name: 'Warehouse T1',
5194
+ name: 'Warehouse',
5189
5195
  description: 'Massive stationary storage facility with a single loader module slot.',
5190
5196
  color: '#EAB308',
5191
5197
  packedItemId: ITEM_WAREHOUSE_T1_PACKED,
@@ -5196,8 +5202,8 @@ const entityRecipes = [
5196
5202
  stats: [
5197
5203
  { key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
5198
5204
  { key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
5199
- { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'ductility' },
5200
- { key: 'purity', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'purity' },
5205
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
5206
+ { key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
5201
5207
  ],
5202
5208
  moduleSlots: [
5203
5209
  { type: MODULE_LOADER, label: 'Loader' },
@@ -5209,7 +5215,7 @@ const entityRecipes = [
5209
5215
  },
5210
5216
  {
5211
5217
  id: 'container-t2',
5212
- name: 'Container T2',
5218
+ name: 'Container',
5213
5219
  description: 'Advanced cargo container with improved capacity formulas.',
5214
5220
  color: '#9BADB8',
5215
5221
  packedItemId: ITEM_CONTAINER_T2_PACKED,
@@ -5220,8 +5226,12 @@ const entityRecipes = [
5220
5226
  stats: [
5221
5227
  { key: 'strength', sourceComponentId: ITEM_HULL_PLATES_T2, sourceStatKey: 'strength' },
5222
5228
  { key: 'density', sourceComponentId: ITEM_HULL_PLATES_T2, sourceStatKey: 'density' },
5223
- { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING_T2, sourceStatKey: 'ductility' },
5224
- { key: 'purity', sourceComponentId: ITEM_CARGO_LINING_T2, sourceStatKey: 'purity' },
5229
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING_T2, sourceStatKey: 'fineness' },
5230
+ {
5231
+ key: 'saturation',
5232
+ sourceComponentId: ITEM_CARGO_LINING_T2,
5233
+ sourceStatKey: 'saturation',
5234
+ },
5225
5235
  ],
5226
5236
  },
5227
5237
  ];
@@ -5242,14 +5252,14 @@ const moduleRecipes = [
5242
5252
  {
5243
5253
  id: 'generator-t1',
5244
5254
  name: 'Generator',
5245
- description: 'Basic energy system. Stores and recharges energy from resonant minerals.',
5246
- color: '#7B5AE8',
5255
+ description: 'Basic energy system. Stores and recharges energy from resonant crystals.',
5256
+ color: '#4ADBFF',
5247
5257
  itemId: ITEM_GENERATOR_T1,
5248
5258
  moduleType: MODULE_GENERATOR,
5249
5259
  recipe: [{ itemId: ITEM_POWER_CELL, quantity: 5 }],
5250
5260
  stats: [
5251
5261
  { key: 'resonance', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'resonance' },
5252
- { key: 'clarity', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'clarity' },
5262
+ { key: 'reflectivity', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'reflectivity' },
5253
5263
  ],
5254
5264
  },
5255
5265
  {
@@ -5287,7 +5297,7 @@ const moduleRecipes = [
5287
5297
  id: 'loader-t1',
5288
5298
  name: 'Loader',
5289
5299
  description: 'Basic cargo handling system. Loads and unloads cargo with articulated arms.',
5290
- color: '#6B8E5A',
5300
+ color: '#5A8B3E',
5291
5301
  itemId: ITEM_LOADER_T1,
5292
5302
  moduleType: MODULE_LOADER,
5293
5303
  recipe: [
@@ -5295,7 +5305,7 @@ const moduleRecipes = [
5295
5305
  { itemId: ITEM_CARGO_ARM, quantity: 3 },
5296
5306
  ],
5297
5307
  stats: [
5298
- { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'ductility' },
5308
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
5299
5309
  { key: 'plasticity', sourceComponentId: ITEM_CARGO_ARM, sourceStatKey: 'plasticity' },
5300
5310
  ],
5301
5311
  },
@@ -5303,7 +5313,7 @@ const moduleRecipes = [
5303
5313
  id: 'manufacturing-t1',
5304
5314
  name: 'Manufacturing',
5305
5315
  description: 'Basic crafting system. Processes materials using reaction chambers and cutting tools.',
5306
- color: '#7EC8E3',
5316
+ color: '#B8E4A0',
5307
5317
  itemId: ITEM_MANUFACTURING_T1,
5308
5318
  moduleType: MODULE_CRAFTER,
5309
5319
  recipe: [
@@ -5316,7 +5326,7 @@ const moduleRecipes = [
5316
5326
  sourceComponentId: ITEM_REACTION_CHAMBER,
5317
5327
  sourceStatKey: 'reactivity',
5318
5328
  },
5319
- { key: 'clarity', sourceComponentId: ITEM_TOOL_BIT, sourceStatKey: 'clarity' },
5329
+ { key: 'composition', sourceComponentId: ITEM_TOOL_BIT, sourceStatKey: 'composition' },
5320
5330
  ],
5321
5331
  },
5322
5332
  {
@@ -5332,16 +5342,16 @@ const moduleRecipes = [
5332
5342
  ],
5333
5343
  stats: [
5334
5344
  { key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
5335
- { key: 'ductility', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'ductility' },
5336
- { key: 'purity', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'purity' },
5337
- { key: 'density', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'density' },
5345
+ { key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
5346
+ { key: 'fineness', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'fineness' },
5347
+ { key: 'saturation', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'saturation' },
5338
5348
  ],
5339
5349
  },
5340
5350
  {
5341
5351
  id: 'hauler-t1',
5342
- name: 'Hauler Module T1',
5352
+ name: 'Hauler',
5343
5353
  description: 'Projects a haul beam to lock onto and transport containers or warehouses through group travel.',
5344
- color: '#D4A843',
5354
+ color: '#4ADBFF',
5345
5355
  itemId: ITEM_HAULER_T1,
5346
5356
  moduleType: MODULE_HAULER,
5347
5357
  recipe: [
@@ -5349,14 +5359,13 @@ const moduleRecipes = [
5349
5359
  { itemId: ITEM_FOCUSING_ARRAY, quantity: 3 },
5350
5360
  ],
5351
5361
  stats: [
5352
- { key: 'capacity', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'resonance' },
5362
+ { key: 'resonance', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'resonance' },
5363
+ { key: 'reflectivity', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'reflectivity' },
5353
5364
  {
5354
- key: 'efficiency',
5365
+ key: 'conductivity',
5355
5366
  sourceComponentId: ITEM_FOCUSING_ARRAY,
5356
5367
  sourceStatKey: 'conductivity',
5357
5368
  },
5358
- { key: 'drain', sourceComponentId: ITEM_POWER_CELL, sourceStatKey: 'clarity' },
5359
- { key: 'ductility', sourceComponentId: ITEM_FOCUSING_ARRAY, sourceStatKey: 'ductility' },
5360
5369
  ],
5361
5370
  },
5362
5371
  ];
@@ -5417,7 +5426,7 @@ function getComponentsForStat(statKey) {
5417
5426
  return components.filter((c) => c.stats.some((s) => s.key === statKey));
5418
5427
  }
5419
5428
 
5420
- const METAL_STATS = [
5429
+ const ORE_STATS = [
5421
5430
  {
5422
5431
  key: 'strength',
5423
5432
  label: 'Strength',
@@ -5438,24 +5447,24 @@ const METAL_STATS = [
5438
5447
  inverted: true,
5439
5448
  },
5440
5449
  ];
5441
- const PRECIOUS_STATS = [
5450
+ const CRYSTAL_STATS = [
5442
5451
  {
5443
5452
  key: 'conductivity',
5444
5453
  label: 'Conductivity',
5445
5454
  abbreviation: 'CON',
5446
- purpose: 'Efficiency of energy/signal transfer',
5455
+ purpose: 'Efficiency of energy/signal transfer through crystalline lattice',
5447
5456
  },
5448
5457
  {
5449
- key: 'ductility',
5450
- label: 'Ductility',
5451
- abbreviation: 'DUC',
5452
- purpose: 'Ability to be worked into fine, precise shapes',
5458
+ key: 'resonance',
5459
+ label: 'Resonance',
5460
+ abbreviation: 'RES',
5461
+ purpose: 'Frequency tuning and piezoelectric response storage and amplification',
5453
5462
  },
5454
5463
  {
5455
5464
  key: 'reflectivity',
5456
5465
  label: 'Reflectivity',
5457
5466
  abbreviation: 'REF',
5458
- purpose: 'Surface quality for heat management and precision optics',
5467
+ purpose: 'Optical refraction and reflection lenses, mirrors, focus',
5459
5468
  },
5460
5469
  ];
5461
5470
  const GAS_STATS = [
@@ -5478,52 +5487,52 @@ const GAS_STATS = [
5478
5487
  purpose: 'Heat capacity for thermal management',
5479
5488
  },
5480
5489
  ];
5481
- const MINERAL_STATS = [
5490
+ const REGOLITH_STATS = [
5482
5491
  {
5483
- key: 'resonance',
5484
- label: 'Resonance',
5485
- abbreviation: 'RES',
5486
- purpose: 'Energy field interaction storage, focusing, projection',
5492
+ key: 'composition',
5493
+ label: 'Composition',
5494
+ abbreviation: 'COM',
5495
+ purpose: 'Mineral/metal mixdrives sensor, chip, and optic crafting quality',
5487
5496
  },
5488
5497
  {
5489
5498
  key: 'hardness',
5490
5499
  label: 'Hardness',
5491
5500
  abbreviation: 'HRD',
5492
- purpose: 'Resistance to wear — cutting surfaces, penetration',
5501
+ purpose: 'Particle hardness — cutting surfaces, abrasives, wear resistance',
5493
5502
  },
5494
5503
  {
5495
- key: 'clarity',
5496
- label: 'Clarity',
5497
- abbreviation: 'CLR',
5498
- purpose: 'Crystalline perfectionprecision optics',
5504
+ key: 'fineness',
5505
+ label: 'Fineness',
5506
+ abbreviation: 'FIN',
5507
+ purpose: 'Grain sizefine powder for smooth composites and sintering',
5499
5508
  },
5500
5509
  ];
5501
- const ORGANIC_STATS = [
5510
+ const BIOMASS_STATS = [
5502
5511
  {
5503
5512
  key: 'plasticity',
5504
5513
  label: 'Plasticity',
5505
5514
  abbreviation: 'PLA',
5506
- purpose: 'Ease of reshaping speeds processing',
5515
+ purpose: 'Flexibility and deformation under load',
5507
5516
  },
5508
5517
  {
5509
5518
  key: 'insulation',
5510
5519
  label: 'Insulation',
5511
5520
  abbreviation: 'INS',
5512
- purpose: 'Energy containment reduces energy loss',
5521
+ purpose: 'Thermal and electrical blocking capacity',
5513
5522
  },
5514
5523
  {
5515
- key: 'purity',
5516
- label: 'Purity',
5517
- abbreviation: 'PUR',
5518
- purpose: 'Biological cleanliness better composites and lubricants',
5524
+ key: 'saturation',
5525
+ label: 'Saturation',
5526
+ abbreviation: 'SAT',
5527
+ purpose: 'Concentration of useful organic compounds per unit',
5519
5528
  },
5520
5529
  ];
5521
5530
  const STAT_MAP = {
5522
- metal: METAL_STATS,
5523
- precious: PRECIOUS_STATS,
5531
+ ore: ORE_STATS,
5532
+ crystal: CRYSTAL_STATS,
5524
5533
  gas: GAS_STATS,
5525
- mineral: MINERAL_STATS,
5526
- organic: ORGANIC_STATS,
5534
+ regolith: REGOLITH_STATS,
5535
+ biomass: BIOMASS_STATS,
5527
5536
  };
5528
5537
  function getStatDefinitions(category) {
5529
5538
  return STAT_MAP[category];
@@ -5668,40 +5677,40 @@ function deriveResourceStats(seed) {
5668
5677
  }
5669
5678
 
5670
5679
  function encodeStats(values) {
5671
- let seed = 0n;
5680
+ let stats = 0n;
5672
5681
  for (let i = 0; i < values.length && i < 6; i++) {
5673
- seed |= BigInt(values[i] & 0x3ff) << BigInt(i * 10);
5682
+ stats |= BigInt(values[i] & 0x3ff) << BigInt(i * 10);
5674
5683
  }
5675
- return seed;
5684
+ return stats;
5676
5685
  }
5677
- function decodeStat(seed, index) {
5678
- return Number((seed >> BigInt(index * 10)) & 0x3ffn);
5686
+ function decodeStat(stats, index) {
5687
+ return Number((stats >> BigInt(index * 10)) & 0x3ffn);
5679
5688
  }
5680
- function decodeStats(seed, count) {
5681
- const stats = [];
5689
+ function decodeStats(stats, count) {
5690
+ const result = [];
5682
5691
  for (let i = 0; i < count; i++) {
5683
- stats.push(decodeStat(seed, i));
5692
+ result.push(decodeStat(stats, i));
5684
5693
  }
5685
- return stats;
5694
+ return result;
5686
5695
  }
5687
- function mapStatsToKeys(seed, statDefs) {
5688
- const values = decodeStats(seed, statDefs.length);
5696
+ function mapStatsToKeys(stats, statDefs) {
5697
+ const values = decodeStats(stats, statDefs.length);
5689
5698
  const result = {};
5690
5699
  for (let i = 0; i < statDefs.length; i++) {
5691
5700
  result[statDefs[i].key] = values[i];
5692
5701
  }
5693
5702
  return result;
5694
5703
  }
5695
- function decodeCraftedItemStats(itemId, seed) {
5704
+ function decodeCraftedItemStats(itemId, stats) {
5696
5705
  const comp = getComponentById(itemId);
5697
5706
  if (comp)
5698
- return mapStatsToKeys(seed, comp.stats);
5707
+ return mapStatsToKeys(stats, comp.stats);
5699
5708
  const entityRecipe = entityRecipes.find((r) => r.packedItemId === itemId);
5700
5709
  if (entityRecipe)
5701
- return mapStatsToKeys(seed, entityRecipe.stats);
5710
+ return mapStatsToKeys(stats, entityRecipe.stats);
5702
5711
  const moduleRecipe = moduleRecipes.find((r) => r.itemId === itemId);
5703
5712
  if (moduleRecipe)
5704
- return mapStatsToKeys(seed, moduleRecipe.stats);
5713
+ return mapStatsToKeys(stats, moduleRecipe.stats);
5705
5714
  return {};
5706
5715
  }
5707
5716
  function blendStacks(stacks, statKey) {
@@ -5754,19 +5763,19 @@ function computeEntityStats(entityRecipeId, componentStacks) {
5754
5763
  return { key: stat.key, value: Math.max(1, Math.min(999, value)) };
5755
5764
  });
5756
5765
  }
5757
- function decodeStackStats(itemId, seed) {
5766
+ function decodeStackStats(itemId, stats) {
5758
5767
  if (itemId >= 10000) {
5759
- return decodeCraftedItemStats(itemId, BigInt(seed.toString()));
5768
+ return decodeCraftedItemStats(itemId, BigInt(stats.toString()));
5760
5769
  }
5761
- const raw = deriveResourceStats(BigInt(seed.toString()));
5762
- return { stat1: raw.stat1, stat2: raw.stat2, stat3: raw.stat3 };
5770
+ const s = BigInt(stats.toString());
5771
+ return { stat1: decodeStat(s, 0), stat2: decodeStat(s, 1), stat3: decodeStat(s, 2) };
5763
5772
  }
5764
5773
  const categoryItemMass = {
5765
- metal: 30000,
5766
- precious: 40000,
5774
+ ore: 30000,
5775
+ crystal: 40000,
5767
5776
  gas: 15000,
5768
- mineral: 22000,
5769
- organic: 15000,
5777
+ regolith: 22000,
5778
+ biomass: 15000,
5770
5779
  };
5771
5780
  function computeInputMass(itemId, itemType) {
5772
5781
  if (itemType === 'component') {
@@ -5813,25 +5822,24 @@ function blendCrossGroup(sources) {
5813
5822
  function blendCargoStacks(itemId, stacks) {
5814
5823
  const decoded = stacks.map((s) => ({
5815
5824
  quantity: s.quantity,
5816
- stats: decodeStackStats(itemId, s.seed),
5825
+ stats: decodeStackStats(itemId, s.stats),
5817
5826
  }));
5818
5827
  const allKeys = Object.keys(decoded[0]?.stats ?? {});
5819
5828
  const blended = allKeys.map((key) => Math.max(1, Math.min(999, blendStacks(decoded, key))));
5820
5829
  return UInt64.from(encodeStats(blended));
5821
5830
  }
5822
- function decodeRawStackToCategoryStats(seed, category) {
5823
- const raw = deriveResourceStats(seed);
5831
+ function decodeRawStackToCategoryStats(stats, category) {
5824
5832
  const defs = getStatDefinitions(category);
5825
5833
  const result = {};
5826
5834
  if (defs[0])
5827
- result[defs[0].key] = raw.stat1;
5835
+ result[defs[0].key] = decodeStat(stats, 0);
5828
5836
  if (defs[1])
5829
- result[defs[1].key] = raw.stat2;
5837
+ result[defs[1].key] = decodeStat(stats, 1);
5830
5838
  if (defs[2])
5831
- result[defs[2].key] = raw.stat3;
5839
+ result[defs[2].key] = decodeStat(stats, 2);
5832
5840
  return result;
5833
5841
  }
5834
- function computeCraftedOutputSeed(outputItemId, slotInputs) {
5842
+ function computeCraftedOutputStats(outputItemId, slotInputs) {
5835
5843
  var _a;
5836
5844
  const component = getComponentById(outputItemId);
5837
5845
  if (component) {
@@ -5843,8 +5851,8 @@ function computeCraftedOutputSeed(outputItemId, slotInputs) {
5843
5851
  const stacks = slot.stacks.map((s) => ({
5844
5852
  quantity: s.quantity,
5845
5853
  stats: slotIsComponent
5846
- ? decodeCraftedItemStats(slot.itemId, s.seed)
5847
- : decodeRawStackToCategoryStats(s.seed, slot.category),
5854
+ ? decodeCraftedItemStats(slot.itemId, s.stats)
5855
+ : decodeRawStackToCategoryStats(s.stats, slot.category),
5848
5856
  }));
5849
5857
  categoryStacks.push({ category: slot.category, stacks });
5850
5858
  }
@@ -5866,7 +5874,7 @@ function computeCraftedOutputSeed(outputItemId, slotInputs) {
5866
5874
  for (const s of slot.stacks) {
5867
5875
  list.push({
5868
5876
  quantity: s.quantity,
5869
- stats: decodeCraftedItemStats(slot.itemId, s.seed),
5877
+ stats: decodeCraftedItemStats(slot.itemId, s.stats),
5870
5878
  });
5871
5879
  }
5872
5880
  }
@@ -5877,7 +5885,11 @@ function computeCraftedOutputSeed(outputItemId, slotInputs) {
5877
5885
  });
5878
5886
  return UInt64.from(encodeStats(ordered));
5879
5887
  }
5880
- throw new Error(`computeCraftedOutputSeed: no recipe found for outputItemId=${outputItemId}`);
5888
+ throw new Error(`computeCraftedOutputStats: no recipe found for outputItemId=${outputItemId}`);
5889
+ }
5890
+ function encodeGatheredCargoStats(depositSeed) {
5891
+ const raw = deriveResourceStats(depositSeed);
5892
+ return UInt64.from(encodeStats([raw.stat1, raw.stat2, raw.stat3]));
5881
5893
  }
5882
5894
 
5883
5895
  const itemsById = new Map();
@@ -5901,7 +5913,7 @@ function synthesizeItem(id, source) {
5901
5913
  name: source.name,
5902
5914
  description: source.description,
5903
5915
  mass: source.mass,
5904
- category: 'metal',
5916
+ category: 'ore',
5905
5917
  tier: 't1',
5906
5918
  color: source.color,
5907
5919
  });
@@ -6251,6 +6263,9 @@ function capsHasGatherer(caps) {
6251
6263
  function capsHasMass(caps) {
6252
6264
  return caps.hullmass !== undefined;
6253
6265
  }
6266
+ function capsHasHauler(caps) {
6267
+ return caps.hauler !== undefined;
6268
+ }
6254
6269
 
6255
6270
  function calcCargoItemMass(item) {
6256
6271
  const itemDef = getItem(item.item_id);
@@ -6305,7 +6320,7 @@ function cargoItemToStack(item) {
6305
6320
  return {
6306
6321
  item_id: UInt16.from(item.item_id),
6307
6322
  quantity: UInt32.from(item.quantity),
6308
- seed: item.seed,
6323
+ stats: item.stats,
6309
6324
  modules: item.modules ?? [],
6310
6325
  };
6311
6326
  }
@@ -6313,23 +6328,18 @@ function stackToCargoItem(stack) {
6313
6328
  return Types.cargo_item.from({
6314
6329
  item_id: stack.item_id,
6315
6330
  quantity: stack.quantity,
6316
- seed: stack.seed,
6331
+ stats: stack.stats,
6317
6332
  modules: stack.modules,
6318
6333
  });
6319
6334
  }
6320
- function seedEquals(a, b) {
6321
- if (!a && !b)
6322
- return true;
6323
- if (!a || !b)
6324
- return false;
6335
+ function statsEquals(a, b) {
6325
6336
  return a.equals(b);
6326
6337
  }
6327
6338
  function stackIdentityEqual(a, b) {
6328
- return a.item_id.equals(b.item_id) && seedEquals(a.seed, b.seed);
6339
+ return a.item_id.equals(b.item_id) && statsEquals(a.stats, b.stats);
6329
6340
  }
6330
6341
  function stackKey(s) {
6331
- const seedVal = s.seed ? s.seed.toString() : '0';
6332
- return `${s.item_id.toNumber()}:${seedVal}`;
6342
+ return `${s.item_id.toNumber()}:${s.stats.toString()}`;
6333
6343
  }
6334
6344
  function stacksEqual(a, b) {
6335
6345
  return stackIdentityEqual(a, b) && a.quantity.equals(b.quantity);
@@ -6653,7 +6663,9 @@ function applyGatherTask(projected, task, options) {
6653
6663
  if (!options.complete)
6654
6664
  return;
6655
6665
  applyEnergyCost(projected, task);
6656
- applyAddCargoTask(projected, task);
6666
+ if (!task.entitytarget) {
6667
+ applyAddCargoTask(projected, task);
6668
+ }
6657
6669
  }
6658
6670
  function applyCraftTask(projected, task) {
6659
6671
  applyEnergyCost(projected, task);
@@ -6949,9 +6961,19 @@ function needsRecharge(entity) {
6949
6961
  }
6950
6962
 
6951
6963
  class Ship extends Types.entity_info {
6964
+ constructor() {
6965
+ super(...arguments);
6966
+ this._modules = [];
6967
+ }
6952
6968
  get name() {
6953
6969
  return this.entity_name;
6954
6970
  }
6971
+ get modules() {
6972
+ return this._modules;
6973
+ }
6974
+ setModules(modules) {
6975
+ this._modules = modules;
6976
+ }
6955
6977
  get inv() {
6956
6978
  return (this._inv ?? (this._inv = new InventoryAccessor(this)));
6957
6979
  }
@@ -7070,10 +7092,188 @@ class Ship extends Types.entity_info {
7070
7092
  }
7071
7093
  }
7072
7094
 
7095
+ function computeShipHullCapabilities(stats) {
7096
+ const density = stats.density ?? 500;
7097
+ const strength = stats.strength ?? 500;
7098
+ const fineness = stats.fineness ?? 500;
7099
+ const saturation = stats.saturation ?? 500;
7100
+ const hullmass = 25000 + 75 * density;
7101
+ const statSum = strength + fineness + saturation;
7102
+ const exponent = statSum / 2997.0;
7103
+ const capacity = Math.floor(1000000 * Math.pow(10, exponent));
7104
+ return { hullmass, capacity };
7105
+ }
7106
+ function computeEngineCapabilities(stats) {
7107
+ const vol = stats.volatility ?? 500;
7108
+ const thm = stats.thermal ?? 500;
7109
+ return {
7110
+ thrust: 400 + Math.floor((vol * 3) / 4),
7111
+ drain: Math.max(30, 50 - Math.floor(thm / 70)),
7112
+ };
7113
+ }
7114
+ function computeGeneratorCapabilities(stats) {
7115
+ const res = stats.resonance ?? 500;
7116
+ const ref = stats.reflectivity ?? 500;
7117
+ return {
7118
+ capacity: 300 + Math.floor(res / 6),
7119
+ recharge: 1 + Math.floor((ref * 3) / 1000),
7120
+ };
7121
+ }
7122
+ function computeGathererCapabilities(stats) {
7123
+ const str = stats.strength ?? 500;
7124
+ const con = stats.conductivity ?? 500;
7125
+ const ref = stats.reflectivity ?? 500;
7126
+ const tol = stats.tolerance ?? 500;
7127
+ return {
7128
+ yield: 200 + str,
7129
+ drain: Math.max(250, 1250 - Math.floor((con * 25) / 20)),
7130
+ depth: 200 + Math.floor((tol * 3) / 2),
7131
+ speed: 100 + Math.floor((ref * 4) / 5),
7132
+ };
7133
+ }
7134
+ function computeLoaderCapabilities(stats) {
7135
+ const fin = stats.fineness ?? 500;
7136
+ const pla = stats.plasticity ?? 500;
7137
+ return {
7138
+ mass: Math.max(200, 2000 - Math.floor(fin * 2)),
7139
+ thrust: 1 + Math.floor(pla / 500),
7140
+ quantity: 1,
7141
+ };
7142
+ }
7143
+ function computeManufacturingCapabilities(stats) {
7144
+ const rea = stats.reactivity ?? 500;
7145
+ const com = stats.composition ?? 500;
7146
+ return {
7147
+ speed: 100 + Math.floor((rea * 4) / 5),
7148
+ drain: Math.max(5, 30 - Math.floor(com / 33)),
7149
+ };
7150
+ }
7151
+ function computeHaulerCapabilities(stats) {
7152
+ const res = stats.resonance ?? 500;
7153
+ const con = stats.conductivity ?? 500;
7154
+ const ref = stats.reflectivity ?? 500;
7155
+ return {
7156
+ capacity: Math.max(1, 1 + Math.floor(res / 400)),
7157
+ efficiency: 2000 + con * 6,
7158
+ drain: Math.max(3, 15 - Math.floor(ref / 80)),
7159
+ };
7160
+ }
7161
+ function computeStorageCapabilities(stats, baseCapacity) {
7162
+ const strength = stats.strength ?? 500;
7163
+ const fineness = stats.fineness ?? 500;
7164
+ const saturation = stats.saturation ?? 500;
7165
+ const statSum = strength + fineness + saturation;
7166
+ const capacityBonus = Math.floor((baseCapacity * (10 + Math.floor((statSum * 10) / 2997))) / 100);
7167
+ return { capacityBonus };
7168
+ }
7169
+ function computeWarehouseHullCapabilities(stats) {
7170
+ const density = stats.density ?? 500;
7171
+ const strength = stats.strength ?? 500;
7172
+ const fineness = stats.fineness ?? 500;
7173
+ const saturation = stats.saturation ?? 500;
7174
+ const hullmass = 25000 + 75 * density;
7175
+ const statSum = strength + fineness + saturation;
7176
+ const exponent = statSum / 2997.0;
7177
+ const capacity = Math.floor(20000000 * Math.pow(10, exponent));
7178
+ return { hullmass, capacity };
7179
+ }
7180
+ function computeShipCapabilities(modules) {
7181
+ const ship = {};
7182
+ const engineModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_ENGINE);
7183
+ if (engineModules.length > 0) {
7184
+ let totalThrust = 0;
7185
+ let totalDrain = 0;
7186
+ for (const m of engineModules) {
7187
+ const caps = computeEngineCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7188
+ totalThrust += caps.thrust;
7189
+ totalDrain += caps.drain;
7190
+ }
7191
+ ship.engines = { thrust: totalThrust, drain: totalDrain };
7192
+ }
7193
+ const generatorModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GENERATOR);
7194
+ if (generatorModules.length > 0) {
7195
+ let totalCapacity = 0;
7196
+ let totalRecharge = 0;
7197
+ for (const m of generatorModules) {
7198
+ const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7199
+ totalCapacity += caps.capacity;
7200
+ totalRecharge += caps.recharge;
7201
+ }
7202
+ ship.generator = { capacity: totalCapacity, recharge: totalRecharge };
7203
+ }
7204
+ const gathererModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GATHERER);
7205
+ if (gathererModules.length > 0) {
7206
+ let totalYield = 0;
7207
+ let totalDrain = 0;
7208
+ let totalDepth = 0;
7209
+ let totalSpeed = 0;
7210
+ for (const m of gathererModules) {
7211
+ const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7212
+ totalYield += caps.yield;
7213
+ totalDrain += caps.drain;
7214
+ totalDepth += caps.depth;
7215
+ totalSpeed += caps.speed;
7216
+ }
7217
+ ship.gatherer = { yield: totalYield, drain: totalDrain, depth: totalDepth, speed: totalSpeed };
7218
+ }
7219
+ const haulerModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_HAULER);
7220
+ if (haulerModules.length > 0) {
7221
+ let totalCapacity = 0;
7222
+ let weightedEffNum = 0;
7223
+ let totalDrain = 0;
7224
+ for (const m of haulerModules) {
7225
+ const caps = computeHaulerCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7226
+ totalCapacity += caps.capacity;
7227
+ weightedEffNum += caps.efficiency * caps.capacity;
7228
+ totalDrain += caps.drain;
7229
+ }
7230
+ ship.hauler = {
7231
+ capacity: totalCapacity,
7232
+ efficiency: totalCapacity > 0 ? Math.floor(weightedEffNum / totalCapacity) : 0,
7233
+ drain: totalDrain,
7234
+ };
7235
+ }
7236
+ const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
7237
+ if (loaderModules.length > 0) {
7238
+ let totalMass = 0;
7239
+ let totalThrust = 0;
7240
+ let totalQuantity = 0;
7241
+ for (const m of loaderModules) {
7242
+ const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7243
+ totalMass += caps.mass;
7244
+ totalThrust += caps.thrust;
7245
+ totalQuantity += caps.quantity;
7246
+ }
7247
+ ship.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
7248
+ }
7249
+ const crafterModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_CRAFTER);
7250
+ if (crafterModules.length > 0) {
7251
+ let totalSpeed = 0;
7252
+ let totalDrain = 0;
7253
+ for (const m of crafterModules) {
7254
+ const caps = computeManufacturingCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7255
+ totalSpeed += caps.speed;
7256
+ totalDrain += caps.drain;
7257
+ }
7258
+ ship.crafter = { speed: totalSpeed, drain: totalDrain };
7259
+ }
7260
+ return ship;
7261
+ }
7262
+
7073
7263
  class Warehouse extends Types.entity_info {
7264
+ constructor() {
7265
+ super(...arguments);
7266
+ this._modules = [];
7267
+ }
7074
7268
  get name() {
7075
7269
  return this.entity_name;
7076
7270
  }
7271
+ get modules() {
7272
+ return this._modules;
7273
+ }
7274
+ setModules(modules) {
7275
+ this._modules = modules;
7276
+ }
7077
7277
  get inv() {
7078
7278
  return (this._inv ?? (this._inv = new InventoryAccessor(this)));
7079
7279
  }
@@ -7122,6 +7322,23 @@ class Warehouse extends Types.entity_info {
7122
7322
  return hull.adding(this.totalCargoMass);
7123
7323
  }
7124
7324
  }
7325
+ function computeWarehouseCapabilities(modules) {
7326
+ const warehouse = {};
7327
+ const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
7328
+ if (loaderModules.length > 0) {
7329
+ let totalMass = 0;
7330
+ let totalThrust = 0;
7331
+ let totalQuantity = 0;
7332
+ for (const m of loaderModules) {
7333
+ const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
7334
+ totalMass += caps.mass;
7335
+ totalThrust += caps.thrust;
7336
+ totalQuantity += caps.quantity;
7337
+ }
7338
+ warehouse.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
7339
+ }
7340
+ return warehouse;
7341
+ }
7125
7342
 
7126
7343
  class Container extends Types.entity_info {
7127
7344
  get name() {
@@ -7165,10 +7382,10 @@ class Container extends Types.entity_info {
7165
7382
  function computeContainerCapabilities(stats) {
7166
7383
  const density = stats['density'] ?? 500;
7167
7384
  const strength = stats['strength'] ?? 500;
7168
- const ductility = stats['ductility'] ?? 500;
7169
- const purity = stats['purity'] ?? 500;
7385
+ const fineness = stats['fineness'] ?? 500;
7386
+ const saturation = stats['saturation'] ?? 500;
7170
7387
  const hullmass = 25000 + 75 * density;
7171
- const statSum = strength + ductility + purity;
7388
+ const statSum = strength + fineness + saturation;
7172
7389
  const exponent = statSum / 2997;
7173
7390
  const capacity = Math.floor(1000000 * Math.pow(10, exponent));
7174
7391
  return { hullmass, capacity };
@@ -7176,10 +7393,10 @@ function computeContainerCapabilities(stats) {
7176
7393
  function computeContainerT2Capabilities(stats) {
7177
7394
  const strength = stats['strength'] ?? 0;
7178
7395
  const density = stats['density'] ?? 0;
7179
- const ductility = stats['ductility'] ?? 0;
7180
- const purity = stats['purity'] ?? 0;
7396
+ const fineness = stats['fineness'] ?? 0;
7397
+ const saturation = stats['saturation'] ?? 0;
7181
7398
  const hullmass = 20000 + 50 * density;
7182
- const statSum = strength + ductility + purity;
7399
+ const statSum = strength + fineness + saturation;
7183
7400
  const exponent = statSum / 2500;
7184
7401
  const capacity = Math.floor(1500000 * Math.pow(10, exponent));
7185
7402
  return { hullmass, capacity };
@@ -7382,13 +7599,14 @@ class ActionsManager extends BaseManager {
7382
7599
  id: UInt64.from(shipId),
7383
7600
  });
7384
7601
  }
7385
- transfer(sourceType, sourceId, destType, destId, goodId, quantity) {
7602
+ transfer(sourceType, sourceId, destType, destId, itemId, stats, quantity) {
7386
7603
  return this.server.action('transfer', {
7387
7604
  source_type: sourceType,
7388
7605
  source_id: UInt64.from(sourceId),
7389
7606
  dest_type: destType,
7390
7607
  dest_id: UInt64.from(destId),
7391
- item_id: UInt16.from(goodId),
7608
+ item_id: UInt16.from(itemId),
7609
+ stats: UInt64.from(stats),
7392
7610
  quantity: UInt32.from(quantity),
7393
7611
  });
7394
7612
  }
@@ -7403,10 +7621,16 @@ class ActionsManager extends BaseManager {
7403
7621
  account: Name.from(account),
7404
7622
  });
7405
7623
  }
7406
- gather(shipId, stratum, quantity) {
7624
+ gather(source, destination, stratum, quantity) {
7407
7625
  return this.server.action('gather', {
7408
- entity_type: EntityType.SHIP,
7409
- id: UInt64.from(shipId),
7626
+ source: Types.entity_ref.from({
7627
+ entity_type: source.entityType,
7628
+ entity_id: UInt64.from(source.entityId),
7629
+ }),
7630
+ destination: Types.entity_ref.from({
7631
+ entity_type: destination.entityType,
7632
+ entity_id: UInt64.from(destination.entityId),
7633
+ }),
7410
7634
  stratum: UInt16.from(stratum),
7411
7635
  quantity: UInt32.from(quantity),
7412
7636
  });
@@ -7439,12 +7663,12 @@ class ActionsManager extends BaseManager {
7439
7663
  inputs: cargoInputs,
7440
7664
  });
7441
7665
  }
7442
- deploy(entityType, entityId, packedItemId, seed, entityName) {
7666
+ deploy(entityType, entityId, packedItemId, stats, entityName) {
7443
7667
  return this.server.action('deploy', {
7444
7668
  entity_type: entityType,
7445
7669
  id: UInt64.from(entityId),
7446
7670
  packed_item_id: UInt16.from(packedItemId),
7447
- seed: UInt64.from(seed),
7671
+ stats: UInt64.from(stats),
7448
7672
  entity_name: entityName,
7449
7673
  });
7450
7674
  }
@@ -7465,6 +7689,15 @@ class ActionsManager extends BaseManager {
7465
7689
  target_cargo_id: UInt64.from(targetCargoId),
7466
7690
  });
7467
7691
  }
7692
+ wrap(owner, entityType, entityId, cargoId, quantity) {
7693
+ return this.server.action('wrap', {
7694
+ owner: Name.from(owner),
7695
+ entity_type: entityType,
7696
+ entity_id: UInt64.from(entityId),
7697
+ cargo_id: UInt64.from(cargoId),
7698
+ quantity: UInt64.from(quantity),
7699
+ });
7700
+ }
7468
7701
  joinGame(account, companyName) {
7469
7702
  return [this.foundCompany(account, companyName), this.join(account)];
7470
7703
  }
@@ -7604,6 +7837,51 @@ class Shipload {
7604
7837
  }
7605
7838
  }
7606
7839
 
7840
+ function assignModulesToSlots(packedEntityItemId, modules, entityLabel) {
7841
+ const slots = getEntitySlotLayout(packedEntityItemId);
7842
+ const result = slots.map((s) => ({ type: s.type, installed: undefined }));
7843
+ for (const mod of modules) {
7844
+ const itemId = Number(UInt16.from(mod.itemId).value.toString());
7845
+ const modType = getModuleCapabilityType(itemId);
7846
+ const slotIdx = result.findIndex((r) => !r.installed && moduleAccepts(r.type, modType));
7847
+ if (slotIdx === -1) {
7848
+ const recipe = getModuleRecipeByItemId(itemId);
7849
+ const modName = recipe?.name ?? `item ${itemId}`;
7850
+ throw new Error(`No compatible slot for module ${modName} (type ${modType}) on ${entityLabel}`);
7851
+ }
7852
+ result[slotIdx].installed = Types.packed_module.from({
7853
+ item_id: UInt16.from(mod.itemId),
7854
+ stats: UInt64.from(mod.stats),
7855
+ });
7856
+ }
7857
+ return result.map((r) => Types.module_entry.from({
7858
+ type: UInt8.from(r.type),
7859
+ installed: r.installed,
7860
+ }));
7861
+ }
7862
+ function decodePackedInput(m) {
7863
+ return {
7864
+ itemId: Number(UInt16.from(m.itemId).value.toString()),
7865
+ stats: BigInt(UInt64.from(m.stats).toString()),
7866
+ };
7867
+ }
7868
+ function computeStorageBonus(decoded, baseCapacity) {
7869
+ let totalBonus = 0;
7870
+ for (const m of decoded) {
7871
+ if (getModuleCapabilityType(m.itemId) !== MODULE_STORAGE)
7872
+ continue;
7873
+ const stats = decodeCraftedItemStats(m.itemId, m.stats);
7874
+ const { capacityBonus } = computeStorageCapabilities(stats, baseCapacity);
7875
+ totalBonus += capacityBonus;
7876
+ }
7877
+ return totalBonus;
7878
+ }
7879
+ function deriveShipFromModules(modules, baseCapacity) {
7880
+ const decoded = modules.map(decodePackedInput);
7881
+ const capabilities = computeShipCapabilities(decoded);
7882
+ const totalBonus = computeStorageBonus(decoded, baseCapacity);
7883
+ return { capabilities, finalCapacity: baseCapacity + totalBonus };
7884
+ }
7607
7885
  function makeShip(state) {
7608
7886
  const info = {
7609
7887
  type: Name.from('ship'),
@@ -7620,20 +7898,38 @@ function makeShip(state) {
7620
7898
  };
7621
7899
  if (state.hullmass !== undefined)
7622
7900
  info.hullmass = UInt32.from(state.hullmass);
7623
- if (state.capacity !== undefined)
7624
- info.capacity = UInt32.from(state.capacity);
7625
7901
  if (state.energy !== undefined)
7626
7902
  info.energy = UInt16.from(state.energy);
7627
- if (state.engines)
7628
- info.engines = state.engines;
7629
- if (state.generator)
7630
- info.generator = state.generator;
7631
- if (state.loaders)
7632
- info.loaders = state.loaders;
7633
7903
  if (state.schedule)
7634
7904
  info.schedule = state.schedule;
7905
+ let moduleEntries = [];
7906
+ if (state.modules && state.modules.length > 0) {
7907
+ moduleEntries = assignModulesToSlots(ITEM_SHIP_T1_PACKED, state.modules, 'Ship T1');
7908
+ const { capabilities, finalCapacity } = deriveShipFromModules(state.modules, state.capacity ?? 0);
7909
+ if (capabilities.engines)
7910
+ info.engines = capabilities.engines;
7911
+ if (capabilities.generator)
7912
+ info.generator = capabilities.generator;
7913
+ if (capabilities.gatherer)
7914
+ info.gatherer = capabilities.gatherer;
7915
+ if (capabilities.hauler)
7916
+ info.hauler = capabilities.hauler;
7917
+ if (capabilities.loaders)
7918
+ info.loaders = capabilities.loaders;
7919
+ if (capabilities.crafter)
7920
+ info.crafter = capabilities.crafter;
7921
+ if (state.capacity !== undefined)
7922
+ info.capacity = UInt32.from(finalCapacity);
7923
+ }
7924
+ else {
7925
+ moduleEntries = assignModulesToSlots(ITEM_SHIP_T1_PACKED, [], 'Ship T1');
7926
+ if (state.capacity !== undefined)
7927
+ info.capacity = UInt32.from(state.capacity);
7928
+ }
7635
7929
  const entityInfo = Types.entity_info.from(info);
7636
- return new Ship(entityInfo);
7930
+ const ship = new Ship(entityInfo);
7931
+ ship.setModules(moduleEntries);
7932
+ return ship;
7637
7933
  }
7638
7934
  function makeWarehouse(state) {
7639
7935
  const info = {
@@ -7652,12 +7948,25 @@ function makeWarehouse(state) {
7652
7948
  };
7653
7949
  if (state.hullmass !== undefined)
7654
7950
  info.hullmass = UInt32.from(state.hullmass);
7655
- if (state.loaders)
7656
- info.loaders = state.loaders;
7657
7951
  if (state.schedule)
7658
7952
  info.schedule = state.schedule;
7953
+ let moduleEntries = [];
7954
+ if (state.modules && state.modules.length > 0) {
7955
+ moduleEntries = assignModulesToSlots(ITEM_WAREHOUSE_T1_PACKED, state.modules, 'Warehouse T1');
7956
+ const decoded = state.modules.map(decodePackedInput);
7957
+ const capabilities = computeWarehouseCapabilities(decoded);
7958
+ if (capabilities.loaders)
7959
+ info.loaders = capabilities.loaders;
7960
+ const totalBonus = computeStorageBonus(decoded, state.capacity);
7961
+ info.capacity = UInt32.from(state.capacity + totalBonus);
7962
+ }
7963
+ else {
7964
+ moduleEntries = assignModulesToSlots(ITEM_WAREHOUSE_T1_PACKED, [], 'Warehouse T1');
7965
+ }
7659
7966
  const entityInfo = Types.entity_info.from(info);
7660
- return new Warehouse(entityInfo);
7967
+ const warehouse = new Warehouse(entityInfo);
7968
+ warehouse.setModules(moduleEntries);
7969
+ return warehouse;
7661
7970
  }
7662
7971
  function makeContainer(state) {
7663
7972
  const entityInfo = Types.entity_info.from({
@@ -7669,7 +7978,7 @@ function makeContainer(state) {
7669
7978
  hullmass: UInt32.from(state.hullmass),
7670
7979
  capacity: UInt32.from(state.capacity),
7671
7980
  cargomass: UInt32.from(state.cargomass || 0),
7672
- cargo: [],
7981
+ cargo: state.cargo || [],
7673
7982
  is_idle: !state.schedule,
7674
7983
  current_task_elapsed: UInt32.from(0),
7675
7984
  current_task_remaining: UInt32.from(0),
@@ -7816,11 +8125,11 @@ function computeHaulerDrain(distance, drain, haulCount) {
7816
8125
  }
7817
8126
 
7818
8127
  const categoryColors = {
7819
- metal: '#5B9BD5',
7820
- precious: '#D4A843',
7821
- gas: '#7EC8E3',
7822
- mineral: '#B8A9C9',
7823
- organic: '#6B8E5A',
8128
+ ore: '#C26D3F',
8129
+ crystal: '#4ADBFF',
8130
+ gas: '#B8E4A0',
8131
+ regolith: '#C4A57B',
8132
+ biomass: '#5A8B3E',
7824
8133
  };
7825
8134
  const tierColors = {
7826
8135
  t1: '#8b8b8b',
@@ -7829,16 +8138,30 @@ const tierColors = {
7829
8138
  t4: '#c084fc',
7830
8139
  t5: '#fbbf24',
7831
8140
  };
8141
+ const tierLabels = {
8142
+ t1: 'Common',
8143
+ t2: 'Uncommon',
8144
+ t3: 'Rare',
8145
+ t4: 'Epic',
8146
+ t5: 'Legendary',
8147
+ };
7832
8148
  const categoryIcons = {
7833
- metal: '⬡',
7834
- precious: '◈',
8149
+ ore: '⬡',
8150
+ crystal: '◈',
7835
8151
  gas: '◎',
7836
- mineral: '',
7837
- organic: '❋',
8152
+ regolith: '',
8153
+ biomass: '❋',
8154
+ };
8155
+ const categoryIconShapes = {
8156
+ ore: 'hex',
8157
+ crystal: 'diamond',
8158
+ gas: 'circle',
8159
+ regolith: 'square',
8160
+ biomass: 'star',
7838
8161
  };
7839
8162
  const componentIcon = '▣';
7840
8163
  const moduleIcon = '⬢';
7841
- const itemIcons = {
8164
+ const itemAbbreviations = {
7842
8165
  10001: 'HP',
7843
8166
  10002: 'CL',
7844
8167
  10003: 'TC',
@@ -7908,39 +8231,39 @@ function isCraftedItem(id) {
7908
8231
 
7909
8232
  const categories = [
7910
8233
  {
7911
- id: 'metal',
7912
- name: 'Metals',
7913
- label: 'Metal',
7914
- description: 'Structural, strong, heavy — hulls, frames, load-bearing components',
7915
- color: categoryColors.metal,
8234
+ id: 'ore',
8235
+ name: 'Ore',
8236
+ label: 'Ore',
8237
+ description: 'Structural metal-bearing rock — hulls, frames, load-bearing components',
8238
+ color: categoryColors.ore,
7916
8239
  },
7917
8240
  {
7918
- id: 'precious',
7919
- name: 'Precious Metals',
7920
- label: 'Precious Metal',
7921
- description: 'Conductive, corrosion-resistantelectronics, energy systems, precision components',
7922
- color: categoryColors.precious,
8241
+ id: 'crystal',
8242
+ name: 'Crystal',
8243
+ label: 'Crystal',
8244
+ description: 'Crystalline latticeconductors, energy storage, resonant systems',
8245
+ color: categoryColors.crystal,
7923
8246
  },
7924
8247
  {
7925
8248
  id: 'gas',
7926
- name: 'Gases',
8249
+ name: 'Gas',
7927
8250
  label: 'Gas',
7928
- description: 'Energy, fuel, volatile/reactive — propulsion, thermal processing, chemical reactions',
8251
+ description: 'Atmospheric volatile — propulsion, thermal processing, chemical reactions',
7929
8252
  color: categoryColors.gas,
7930
8253
  },
7931
8254
  {
7932
- id: 'mineral',
7933
- name: 'Minerals',
7934
- label: 'Mineral',
7935
- description: 'Crystalline, hard, precise — sensors, optics, energy storage, cutting surfaces',
7936
- color: categoryColors.mineral,
8255
+ id: 'regolith',
8256
+ name: 'Regolith',
8257
+ label: 'Regolith',
8258
+ description: 'Surface mineral dust — sensors, optics, computation, cutting surfaces',
8259
+ color: categoryColors.regolith,
7937
8260
  },
7938
8261
  {
7939
- id: 'organic',
7940
- name: 'Organics',
7941
- label: 'Organic',
7942
- description: 'Adaptive, biological, polymer — insulation, composites, bio-processes',
7943
- color: categoryColors.organic,
8262
+ id: 'biomass',
8263
+ name: 'Biomass',
8264
+ label: 'Biomass',
8265
+ description: 'Organic polymer — insulation, composites, bio-processes',
8266
+ color: categoryColors.biomass,
7944
8267
  },
7945
8268
  ];
7946
8269
  function getCategoryInfo(id) {
@@ -8380,194 +8703,21 @@ function getStatMappingsForCapability(capability) {
8380
8703
  return statMappings.filter((m) => m.capability === capability);
8381
8704
  }
8382
8705
 
8383
- function computeShipHullCapabilities(stats) {
8384
- const density = stats.density ?? 500;
8385
- const strength = stats.strength ?? 500;
8386
- const ductility = stats.ductility ?? 500;
8387
- const purity = stats.purity ?? 500;
8388
- const hullmass = 25000 + 75 * density;
8389
- const statSum = strength + ductility + purity;
8390
- const exponent = statSum / 2997.0;
8391
- const capacity = Math.floor(1000000 * Math.pow(10, exponent));
8392
- return { hullmass, capacity };
8393
- }
8394
- function computeEngineCapabilities(stats) {
8395
- const vol = stats.volatility ?? 500;
8396
- const thm = stats.thermal ?? 500;
8397
- return {
8398
- thrust: 400 + Math.floor((vol * 3) / 4),
8399
- drain: Math.max(30, 50 - Math.floor(thm / 70)),
8400
- };
8401
- }
8402
- function computeGeneratorCapabilities(stats) {
8403
- const res = stats.resonance ?? 500;
8404
- const clr = stats.clarity ?? 500;
8405
- return {
8406
- capacity: 300 + Math.floor(res / 6),
8407
- recharge: 5 + Math.floor((clr * 15) / 1000),
8408
- };
8409
- }
8410
- function computeGathererCapabilities(stats) {
8411
- const str = stats.strength ?? 500;
8412
- const con = stats.conductivity ?? 500;
8413
- const ref = stats.reflectivity ?? 500;
8414
- const tol = stats.tolerance ?? 500;
8415
- return {
8416
- yield: 200 + str,
8417
- drain: Math.max(10, 50 - Math.floor(con / 20)),
8418
- depth: 200 + Math.floor((tol * 3) / 2),
8419
- speed: 100 + Math.floor((ref * 4) / 5),
8420
- };
8421
- }
8422
- function computeLoaderCapabilities(stats) {
8423
- const duc = stats.ductility ?? 500;
8424
- const pla = stats.plasticity ?? 500;
8425
- return {
8426
- mass: Math.max(200, 2000 - Math.floor(duc * 2)),
8427
- thrust: 1 + Math.floor(pla / 500),
8428
- quantity: 1,
8429
- };
8430
- }
8431
- function computeManufacturingCapabilities(stats) {
8432
- const rea = stats.reactivity ?? 500;
8433
- const clr = stats.clarity ?? 500;
8434
- return {
8435
- speed: 100 + Math.floor((rea * 4) / 5),
8436
- drain: Math.max(5, 30 - Math.floor(clr / 33)),
8437
- };
8438
- }
8439
- function computeHaulerCapabilities(stats) {
8440
- const res = stats.resonance ?? 500;
8441
- const con = stats.conductivity ?? 500;
8442
- const clr = stats.clarity ?? 500;
8443
- return {
8444
- capacity: Math.max(1, 1 + Math.floor(res / 400)),
8445
- efficiency: 2000 + con * 6,
8446
- drain: Math.max(3, 15 - Math.floor(clr / 80)),
8447
- };
8448
- }
8449
- function computeStorageCapabilities(stats, baseCapacity) {
8450
- const strength = stats.strength ?? 500;
8451
- const ductility = stats.ductility ?? 500;
8452
- const purity = stats.purity ?? 500;
8453
- const statSum = strength + ductility + purity;
8454
- const capacityBonus = Math.floor((baseCapacity * (10 + Math.floor((statSum * 10) / 2997))) / 100);
8455
- return { capacityBonus };
8456
- }
8457
- function computeWarehouseHullCapabilities(stats) {
8458
- const density = stats.density ?? 500;
8459
- const strength = stats.strength ?? 500;
8460
- const ductility = stats.ductility ?? 500;
8461
- const purity = stats.purity ?? 500;
8462
- const hullmass = 25000 + 75 * density;
8463
- const statSum = strength + ductility + purity;
8464
- const exponent = statSum / 2997.0;
8465
- const capacity = Math.floor(20000000 * Math.pow(10, exponent));
8466
- return { hullmass, capacity };
8467
- }
8468
- function computeShipCapabilities(modules) {
8469
- const ship = {};
8470
- const engineModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_ENGINE);
8471
- if (engineModules.length > 0) {
8472
- let totalThrust = 0;
8473
- let totalDrain = 0;
8474
- for (const m of engineModules) {
8475
- const caps = computeEngineCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
8476
- totalThrust += caps.thrust;
8477
- totalDrain += caps.drain;
8478
- }
8479
- ship.engines = { thrust: totalThrust, drain: totalDrain };
8480
- }
8481
- const generatorModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GENERATOR);
8482
- if (generatorModules.length > 0) {
8483
- let totalCapacity = 0;
8484
- let totalRecharge = 0;
8485
- for (const m of generatorModules) {
8486
- const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
8487
- totalCapacity += caps.capacity;
8488
- totalRecharge += caps.recharge;
8489
- }
8490
- ship.generator = { capacity: totalCapacity, recharge: totalRecharge };
8491
- }
8492
- const gathererModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GATHERER);
8493
- if (gathererModules.length > 0) {
8494
- let totalYield = 0;
8495
- let totalDrain = 0;
8496
- let totalDepth = 0;
8497
- let totalSpeed = 0;
8498
- for (const m of gathererModules) {
8499
- const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
8500
- totalYield += caps.yield;
8501
- totalDrain += caps.drain;
8502
- totalDepth += caps.depth;
8503
- totalSpeed += caps.speed;
8504
- }
8505
- ship.gatherer = { yield: totalYield, drain: totalDrain, depth: totalDepth, speed: totalSpeed };
8506
- }
8507
- const haulerModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_HAULER);
8508
- if (haulerModules.length > 0) {
8509
- let totalCapacity = 0;
8510
- let weightedEffNum = 0;
8511
- let totalDrain = 0;
8512
- for (const m of haulerModules) {
8513
- const decoded = decodeCraftedItemStats(m.itemId, m.seed);
8514
- const caps = computeHaulerCapabilities({
8515
- resonance: decoded.capacity,
8516
- conductivity: decoded.efficiency,
8517
- clarity: decoded.drain,
8518
- });
8519
- totalCapacity += caps.capacity;
8520
- weightedEffNum += caps.efficiency * caps.capacity;
8521
- totalDrain += caps.drain;
8522
- }
8523
- ship.hauler = {
8524
- capacity: totalCapacity,
8525
- efficiency: totalCapacity > 0 ? Math.floor(weightedEffNum / totalCapacity) : 0,
8526
- drain: totalDrain,
8527
- };
8528
- }
8529
- const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
8530
- if (loaderModules.length > 0) {
8531
- let totalMass = 0;
8532
- let totalThrust = 0;
8533
- let totalQuantity = 0;
8534
- for (const m of loaderModules) {
8535
- const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
8536
- totalMass += caps.mass;
8537
- totalThrust += caps.thrust;
8538
- totalQuantity += caps.quantity;
8539
- }
8540
- ship.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
8541
- }
8542
- const crafterModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_CRAFTER);
8543
- if (crafterModules.length > 0) {
8544
- let totalSpeed = 0;
8545
- let totalDrain = 0;
8546
- for (const m of crafterModules) {
8547
- const caps = computeManufacturingCapabilities(decodeCraftedItemStats(m.itemId, m.seed));
8548
- totalSpeed += caps.speed;
8549
- totalDrain += caps.drain;
8550
- }
8551
- ship.crafter = { speed: totalSpeed, drain: totalDrain };
8552
- }
8553
- return ship;
8554
- }
8555
-
8556
8706
  function toNum(v) {
8557
8707
  return Number(UInt16.from(v).value.toString());
8558
8708
  }
8559
- function toBigSeed(v) {
8709
+ function toBigStats(v) {
8560
8710
  return BigInt(UInt64.from(v).toString());
8561
8711
  }
8562
- function resolveResource(id, seed) {
8712
+ function resolveResource(id, stats) {
8563
8713
  const item = getItem(id);
8564
8714
  const cat = item.category;
8565
- let stats;
8566
- if (seed !== undefined) {
8567
- const derived = deriveResourceStats(toBigSeed(seed));
8715
+ let resolvedStats;
8716
+ if (stats !== undefined) {
8717
+ const bigStats = toBigStats(stats);
8568
8718
  const defs = getStatDefinitions(cat);
8569
- const values = [derived.stat1, derived.stat2, derived.stat3];
8570
- stats = defs.map((d, i) => ({
8719
+ const values = [decodeStat(bigStats, 0), decodeStat(bigStats, 1), decodeStat(bigStats, 2)];
8720
+ resolvedStats = defs.map((d, i) => ({
8571
8721
  key: d.key,
8572
8722
  label: d.label,
8573
8723
  abbreviation: d.abbreviation,
@@ -8581,27 +8731,28 @@ function resolveResource(id, seed) {
8581
8731
  itemId: id,
8582
8732
  name: String(item.name),
8583
8733
  icon: categoryIcons[cat] ?? '⬡',
8734
+ abbreviation: null,
8584
8735
  category: cat,
8585
8736
  tier: item.tier,
8586
8737
  mass: Number(item.mass.value.toString()),
8587
8738
  itemType: 'resource',
8588
- stats,
8739
+ stats: resolvedStats,
8589
8740
  };
8590
8741
  }
8591
- function resolveComponent(id, seed) {
8742
+ function resolveComponent(id, stats) {
8592
8743
  const comp = getComponentById(id);
8593
- let stats;
8594
- if (seed !== undefined) {
8595
- const decoded = decodeCraftedItemStats(id, toBigSeed(seed));
8596
- stats = Object.entries(decoded).map(([key, value]) => {
8597
- const allDefs = getStatDefinitions('metal')
8598
- .concat(getStatDefinitions('precious'))
8744
+ let resolvedStats;
8745
+ if (stats !== undefined) {
8746
+ const decoded = decodeCraftedItemStats(id, toBigStats(stats));
8747
+ resolvedStats = Object.entries(decoded).map(([key, value]) => {
8748
+ const allDefs = getStatDefinitions('ore')
8749
+ .concat(getStatDefinitions('crystal'))
8599
8750
  .concat(getStatDefinitions('gas'))
8600
- .concat(getStatDefinitions('mineral'))
8601
- .concat(getStatDefinitions('organic'));
8751
+ .concat(getStatDefinitions('regolith'))
8752
+ .concat(getStatDefinitions('biomass'));
8602
8753
  const def = allDefs.find((d) => d.key === key);
8603
8754
  const statDef = comp.stats.find((s) => s.key === key);
8604
- const cat = (statDef?.source ?? 'metal');
8755
+ const cat = (statDef?.source ?? 'ore');
8605
8756
  return {
8606
8757
  key,
8607
8758
  label: def?.label ?? key,
@@ -8616,11 +8767,12 @@ function resolveComponent(id, seed) {
8616
8767
  return {
8617
8768
  itemId: id,
8618
8769
  name: comp.name,
8619
- icon: itemIcons[id] ?? componentIcon,
8770
+ icon: itemAbbreviations[id] ?? componentIcon,
8771
+ abbreviation: itemAbbreviations[id] ?? null,
8620
8772
  tier: 't1',
8621
8773
  mass: comp.mass,
8622
8774
  itemType: 'component',
8623
- stats,
8775
+ stats: resolvedStats,
8624
8776
  };
8625
8777
  }
8626
8778
  function computeCapabilityGroup(moduleType, stats) {
@@ -8678,11 +8830,22 @@ function computeCapabilityGroup(moduleType, stats) {
8678
8830
  ],
8679
8831
  };
8680
8832
  }
8833
+ case MODULE_HAULER: {
8834
+ const caps = computeHaulerCapabilities(stats);
8835
+ return {
8836
+ capability: 'Hauler',
8837
+ attributes: [
8838
+ { label: 'Capacity', value: caps.capacity },
8839
+ { label: 'Efficiency', value: caps.efficiency },
8840
+ { label: 'Drain', value: caps.drain },
8841
+ ],
8842
+ };
8843
+ }
8681
8844
  case MODULE_STORAGE: {
8682
8845
  const str = stats.strength ?? 500;
8683
- const duc = stats.ductility ?? 500;
8684
- const pur = stats.purity ?? 500;
8685
- const statSum = str + duc + pur;
8846
+ const fin = stats.fineness ?? 500;
8847
+ const sat = stats.saturation ?? 500;
8848
+ const statSum = str + fin + sat;
8686
8849
  const pct = 10 + Math.floor((statSum * 10) / 2997);
8687
8850
  return { capability: 'Storage', attributes: [{ label: 'Capacity Bonus', value: pct }] };
8688
8851
  }
@@ -8690,36 +8853,37 @@ function computeCapabilityGroup(moduleType, stats) {
8690
8853
  return undefined;
8691
8854
  }
8692
8855
  }
8693
- function resolveModule(id, seed) {
8856
+ function resolveModule(id, stats) {
8694
8857
  const recipe = getModuleRecipeByItemId(id);
8695
8858
  let attributes;
8696
- if (seed !== undefined) {
8697
- const stats = decodeCraftedItemStats(id, toBigSeed(seed));
8859
+ if (stats !== undefined) {
8860
+ const decoded = decodeCraftedItemStats(id, toBigStats(stats));
8698
8861
  const modType = getModuleCapabilityType(id);
8699
- const group = computeCapabilityGroup(modType, stats);
8862
+ const group = computeCapabilityGroup(modType, decoded);
8700
8863
  if (group)
8701
8864
  attributes = [group];
8702
8865
  }
8703
8866
  return {
8704
8867
  itemId: id,
8705
8868
  name: recipe.name,
8706
- icon: itemIcons[id] ?? moduleIcon,
8869
+ icon: itemAbbreviations[id] ?? moduleIcon,
8870
+ abbreviation: itemAbbreviations[id] ?? null,
8707
8871
  tier: 't1',
8708
8872
  mass: 0,
8709
8873
  itemType: 'module',
8710
8874
  attributes,
8711
8875
  };
8712
8876
  }
8713
- function resolveEntity(id, seed, modules) {
8877
+ function resolveEntity(id, stats, modules) {
8714
8878
  const recipe = getEntityRecipeByItemId(id);
8715
8879
  let attributes;
8716
8880
  let moduleSlots;
8717
- if (seed !== undefined) {
8718
- const stats = decodeCraftedItemStats(id, toBigSeed(seed));
8881
+ if (stats !== undefined) {
8882
+ const decoded = decodeCraftedItemStats(id, toBigStats(stats));
8719
8883
  attributes = [];
8720
8884
  const isShip = recipe.id === 'ship-t1';
8721
8885
  if (isShip) {
8722
- const hullCaps = computeShipHullCapabilities(stats);
8886
+ const hullCaps = computeShipHullCapabilities(decoded);
8723
8887
  attributes.push({
8724
8888
  capability: 'Hull',
8725
8889
  attributes: [
@@ -8729,7 +8893,7 @@ function resolveEntity(id, seed, modules) {
8729
8893
  });
8730
8894
  }
8731
8895
  else {
8732
- const containerCaps = computeContainerCapabilities(stats);
8896
+ const containerCaps = computeContainerCapabilities(decoded);
8733
8897
  attributes.push({
8734
8898
  capability: 'Hull',
8735
8899
  attributes: [
@@ -8744,10 +8908,10 @@ function resolveEntity(id, seed, modules) {
8744
8908
  const mod = modules?.[i];
8745
8909
  if (mod?.installed) {
8746
8910
  const modItemId = Number(mod.installed.item_id.value.toString());
8747
- const modSeed = BigInt(mod.installed.seed.toString());
8748
- const modStats = decodeCraftedItemStats(modItemId, modSeed);
8911
+ const modStats = BigInt(mod.installed.stats.toString());
8912
+ const decodedStats = decodeCraftedItemStats(modItemId, modStats);
8749
8913
  const modType = getModuleCapabilityType(modItemId);
8750
- const group = computeCapabilityGroup(modType, modStats);
8914
+ const group = computeCapabilityGroup(modType, decodedStats);
8751
8915
  const modRecipe = getModuleRecipeByItemId(modItemId);
8752
8916
  return {
8753
8917
  name: modRecipe?.name ?? 'Module',
@@ -8761,7 +8925,8 @@ function resolveEntity(id, seed, modules) {
8761
8925
  return {
8762
8926
  itemId: id,
8763
8927
  name: recipe.name,
8764
- icon: itemIcons[id] ?? componentIcon,
8928
+ icon: itemAbbreviations[id] ?? componentIcon,
8929
+ abbreviation: itemAbbreviations[id] ?? null,
8765
8930
  tier: 't1',
8766
8931
  mass: 0,
8767
8932
  itemType: 'entity',
@@ -8769,28 +8934,157 @@ function resolveEntity(id, seed, modules) {
8769
8934
  moduleSlots,
8770
8935
  };
8771
8936
  }
8772
- function resolveItem(itemId, seed, modules) {
8937
+ function resolveItem(itemId, stats, modules) {
8773
8938
  const id = toNum(itemId);
8774
8939
  if (isModuleItem(id))
8775
- return resolveModule(id, seed);
8940
+ return resolveModule(id, stats);
8776
8941
  if (getComponentById(id))
8777
- return resolveComponent(id, seed);
8942
+ return resolveComponent(id, stats);
8778
8943
  if (getEntityRecipeByItemId(id))
8779
- return resolveEntity(id, seed, modules);
8780
- return resolveResource(id, seed);
8944
+ return resolveEntity(id, stats, modules);
8945
+ return resolveResource(id, stats);
8946
+ }
8947
+
8948
+ const TEMPLATES = {
8949
+ engine: {
8950
+ id: 'module.engine.description',
8951
+ template: 'generates {thrust} thrust for travel while draining {drain} energy per distance travelled',
8952
+ params: [
8953
+ ['thrust', 'Thrust'],
8954
+ ['drain', 'Drain'],
8955
+ ],
8956
+ highlightKeys: ['thrust', 'drain'],
8957
+ },
8958
+ generator: {
8959
+ id: 'module.generator.description',
8960
+ template: 'holds {capacity} maximum energy and restores {recharge} per second while recharging',
8961
+ params: [
8962
+ ['capacity', 'Capacity'],
8963
+ ['recharge', 'Recharge'],
8964
+ ],
8965
+ highlightKeys: ['capacity', 'recharge'],
8966
+ },
8967
+ gatherer: {
8968
+ id: 'module.gatherer.description',
8969
+ template: 'mines resources at {yield} speed to a max depth of {depth} with {speed} gather speed while draining {drain} energy per second',
8970
+ params: [
8971
+ ['yield', 'Yield'],
8972
+ ['drain', 'Drain'],
8973
+ ['depth', 'Depth'],
8974
+ ['speed', 'Speed'],
8975
+ ],
8976
+ highlightKeys: ['yield', 'depth', 'speed', 'drain'],
8977
+ },
8978
+ loader: {
8979
+ id: 'module.loader.description',
8980
+ template: '{quantity} loader that generates {thrust} thrust with a weight of {mass} per unit',
8981
+ params: [
8982
+ ['quantity', 'Quantity'],
8983
+ ['thrust', 'Thrust'],
8984
+ ['mass', 'Mass'],
8985
+ ],
8986
+ highlightKeys: ['quantity', 'thrust', 'mass'],
8987
+ },
8988
+ manufacturing: {
8989
+ id: 'module.manufacturing.description',
8990
+ template: 'manufactures items at {speed} speed while draining {drain} energy per second',
8991
+ params: [
8992
+ ['speed', 'Speed'],
8993
+ ['drain', 'Drain'],
8994
+ ],
8995
+ highlightKeys: ['speed', 'drain'],
8996
+ },
8997
+ storage: {
8998
+ id: 'module.storage.description',
8999
+ template: 'boosts cargo capacity by {bonus}%',
9000
+ params: [['bonus', 'Capacity Bonus']],
9001
+ highlightKeys: ['bonus'],
9002
+ },
9003
+ hauler: {
9004
+ id: 'module.hauler.description',
9005
+ template: 'locks onto up to {capacity} targets at {efficiency} efficiency while draining {drain} energy per distance travelled per target',
9006
+ params: [
9007
+ ['capacity', 'Capacity'],
9008
+ ['efficiency', 'Efficiency'],
9009
+ ['drain', 'Drain'],
9010
+ ],
9011
+ highlightKeys: ['capacity', 'efficiency', 'drain'],
9012
+ },
9013
+ };
9014
+ function describeModule(input) {
9015
+ if (!input.attributes || input.attributes.length === 0)
9016
+ return null;
9017
+ const key = input.capability.toLowerCase();
9018
+ const spec = TEMPLATES[key];
9019
+ if (!spec)
9020
+ return null;
9021
+ const params = {};
9022
+ for (const [paramName, attrLabel] of spec.params) {
9023
+ const attr = input.attributes.find((a) => a.label === attrLabel);
9024
+ if (attr)
9025
+ params[paramName] = attr.value;
9026
+ }
9027
+ return {
9028
+ id: spec.id,
9029
+ template: spec.template,
9030
+ params,
9031
+ highlightKeys: spec.highlightKeys,
9032
+ };
9033
+ }
9034
+ function describeModuleForItem(resolved) {
9035
+ if (resolved.itemType !== 'module')
9036
+ return null;
9037
+ const group = resolved.attributes?.[0];
9038
+ if (!group)
9039
+ return null;
9040
+ return describeModule({ capability: group.capability, attributes: group.attributes });
9041
+ }
9042
+ function describeModuleForSlot(slot) {
9043
+ if (!slot.installed || !slot.name || !slot.attributes)
9044
+ return null;
9045
+ return describeModule({ capability: slot.name, attributes: slot.attributes });
9046
+ }
9047
+ function renderDescription(desc, options) {
9048
+ const translate = options?.translate ?? ((_id, fallback) => fallback);
9049
+ const formatNumber = options?.formatNumber ?? ((n) => n.toLocaleString('en-US'));
9050
+ const tpl = translate(desc.id, desc.template);
9051
+ const spans = [];
9052
+ const regex = /\{([A-Za-z_][A-Za-z0-9_]*)\}/g;
9053
+ let lastIndex = 0;
9054
+ let m;
9055
+ while ((m = regex.exec(tpl)) !== null) {
9056
+ if (m.index > lastIndex) {
9057
+ spans.push({ text: tpl.slice(lastIndex, m.index) });
9058
+ }
9059
+ const paramName = m[1] ?? '';
9060
+ const raw = desc.params[paramName];
9061
+ if (raw === undefined) {
9062
+ spans.push({ text: `{${paramName}}` });
9063
+ }
9064
+ else {
9065
+ const formatted = typeof raw === 'number' ? formatNumber(raw) : raw;
9066
+ const highlight = desc.highlightKeys.includes(paramName);
9067
+ spans.push(highlight ? { text: formatted, highlight: true } : { text: formatted });
9068
+ }
9069
+ lastIndex = m.index + m[0].length;
9070
+ }
9071
+ if (lastIndex < tpl.length) {
9072
+ spans.push({ text: tpl.slice(lastIndex) });
9073
+ }
9074
+ return spans;
8781
9075
  }
8782
9076
 
8783
9077
  function readCommonBase(data) {
8784
9078
  return {
8785
9079
  quantity: Number(data.quantity),
8786
- seed: String(data.seed),
9080
+ stats: String(data.stats),
8787
9081
  origin_x: String(data.origin_x),
8788
9082
  origin_y: String(data.origin_y),
8789
9083
  };
8790
9084
  }
8791
9085
  function deserializeScalar(data, itemId) {
8792
9086
  const base = readCommonBase(data);
8793
- return { item_id: itemId, quantity: base.quantity, seed: base.seed };
9087
+ return { item_id: itemId, quantity: base.quantity, stats: base.stats };
8794
9088
  }
8795
9089
  const deserializeResource = deserializeScalar;
8796
9090
  const deserializeComponent = deserializeScalar;
@@ -8798,15 +9092,15 @@ const deserializeModule = deserializeScalar;
8798
9092
  function deserializeEntity(data, itemId) {
8799
9093
  const base = readCommonBase(data);
8800
9094
  const moduleItems = (data.module_items ?? []).map((v) => Number(v));
8801
- const moduleSeeds = (data.module_seeds ?? []).map((v) => String(v));
9095
+ const moduleStats = (data.module_stats ?? []).map((v) => String(v));
8802
9096
  const layout = getEntitySlotLayout(itemId);
8803
9097
  const modules = layout.map((slot, i) => ({
8804
9098
  type: slot.type,
8805
9099
  installed: moduleItems[i] && moduleItems[i] !== 0
8806
- ? { item_id: moduleItems[i], seed: moduleSeeds[i] }
9100
+ ? { item_id: moduleItems[i], stats: moduleStats[i] }
8807
9101
  : undefined,
8808
9102
  }));
8809
- return { item_id: itemId, quantity: base.quantity, seed: base.seed, modules };
9103
+ return { item_id: itemId, quantity: base.quantity, stats: base.stats, modules };
8810
9104
  }
8811
9105
  function deserializeAsset(data, itemId) {
8812
9106
  const type = itemTypeCode(itemId);
@@ -8825,40 +9119,40 @@ function deserializeAsset(data, itemId) {
8825
9119
  function idiv(a, b) {
8826
9120
  return Math.floor(a / b);
8827
9121
  }
8828
- function computeBaseHullmass(seed) {
8829
- const density = decodeStat(seed, 1);
9122
+ function computeBaseHullmass(stats) {
9123
+ const density = decodeStat(stats, 1);
8830
9124
  return 25000 + 75 * density;
8831
9125
  }
8832
- function computeBaseCapacityShip(seed) {
8833
- const s = decodeStat(seed, 0) + decodeStat(seed, 2) + decodeStat(seed, 3);
9126
+ function computeBaseCapacityShip(stats) {
9127
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
8834
9128
  return Math.floor(1000000 * Math.pow(10, s / 2997));
8835
9129
  }
8836
- function computeBaseCapacityWarehouse(seed) {
8837
- const s = decodeStat(seed, 0) + decodeStat(seed, 2) + decodeStat(seed, 3);
9130
+ function computeBaseCapacityWarehouse(stats) {
9131
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
8838
9132
  return Math.floor(20000000 * Math.pow(10, s / 2997));
8839
9133
  }
8840
9134
  const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
8841
9135
  const computeEngineDrain = (thm) => Math.max(30, 50 - idiv(thm, 70));
8842
9136
  const computeGeneratorCap = (res) => 300 + idiv(res, 6);
8843
- const computeGeneratorRech = (clr) => 5 + idiv(clr * 15, 1000);
9137
+ const computeGeneratorRech = (ref) => 1 + idiv(ref * 3, 1000);
8844
9138
  const computeGathererYield = (str) => 200 + str;
8845
- const computeGathererDrain = (con) => Math.max(10, 50 - idiv(con, 20));
9139
+ const computeGathererDrain = (con) => Math.max(250, 1250 - idiv(con * 25, 20));
8846
9140
  const computeGathererDepth = (tol) => 200 + idiv(tol * 3, 2);
8847
9141
  const computeGathererSpeed = (ref) => 100 + idiv(ref * 4, 5);
8848
- const computeLoaderMass = (duc) => Math.max(200, 2000 - duc * 2);
9142
+ const computeLoaderMass = (fin) => Math.max(200, 2000 - fin * 2);
8849
9143
  const computeLoaderThrust = (pla) => 1 + idiv(pla, 500);
8850
9144
  const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
8851
- const computeCrafterDrain = (clr) => Math.max(5, 30 - idiv(clr, 33));
9145
+ const computeCrafterDrain = (com) => Math.max(5, 30 - idiv(com, 33));
8852
9146
  function entityDisplayName(itemId) {
8853
9147
  switch (itemId) {
8854
9148
  case ITEM_SHIP_T1_PACKED:
8855
- return 'Ship T1';
9149
+ return 'Ship';
8856
9150
  case ITEM_WAREHOUSE_T1_PACKED:
8857
- return 'Warehouse T1';
9151
+ return 'Warehouse';
8858
9152
  case ITEM_CONTAINER_T1_PACKED:
8859
- return 'Container T1';
9153
+ return 'Container';
8860
9154
  case ITEM_CONTAINER_T2_PACKED:
8861
- return 'Container T2';
9155
+ return 'Container';
8862
9156
  default:
8863
9157
  return 'Entity';
8864
9158
  }
@@ -8866,22 +9160,22 @@ function entityDisplayName(itemId) {
8866
9160
  function moduleDisplayName(itemId) {
8867
9161
  switch (itemId) {
8868
9162
  case ITEM_ENGINE_T1:
8869
- return 'Engine T1';
9163
+ return 'Engine';
8870
9164
  case ITEM_GENERATOR_T1:
8871
- return 'Generator T1';
9165
+ return 'Generator';
8872
9166
  case ITEM_GATHERER_T1:
8873
- return 'Gatherer T1';
9167
+ return 'Gatherer';
8874
9168
  case ITEM_LOADER_T1:
8875
- return 'Loader T1';
9169
+ return 'Loader';
8876
9170
  case ITEM_MANUFACTURING_T1:
8877
- return 'Manufacturing T1';
9171
+ return 'Manufacturing';
8878
9172
  case ITEM_STORAGE_T1:
8879
- return 'Storage T1';
9173
+ return 'Storage';
8880
9174
  default:
8881
9175
  return 'Module';
8882
9176
  }
8883
9177
  }
8884
- function formatModuleLine(slot, itemId, seed) {
9178
+ function formatModuleLine(slot, itemId, stats) {
8885
9179
  let out = `Slot ${slot} - `;
8886
9180
  if (itemId === 0) {
8887
9181
  out += '(empty)';
@@ -8891,42 +9185,42 @@ function formatModuleLine(slot, itemId, seed) {
8891
9185
  const subtype = getModuleCapabilityType(itemId);
8892
9186
  switch (subtype) {
8893
9187
  case MODULE_ENGINE: {
8894
- const vol = decodeStat(seed, 0);
8895
- const thm = decodeStat(seed, 1);
9188
+ const vol = decodeStat(stats, 0);
9189
+ const thm = decodeStat(stats, 1);
8896
9190
  out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`;
8897
9191
  break;
8898
9192
  }
8899
9193
  case MODULE_GENERATOR: {
8900
- const res = decodeStat(seed, 0);
8901
- const clr = decodeStat(seed, 1);
8902
- out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(clr)}`;
9194
+ const res = decodeStat(stats, 0);
9195
+ const ref = decodeStat(stats, 1);
9196
+ out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`;
8903
9197
  break;
8904
9198
  }
8905
9199
  case MODULE_GATHERER: {
8906
- const str = decodeStat(seed, 0);
8907
- const tol = decodeStat(seed, 1);
8908
- const con = decodeStat(seed, 3);
8909
- const ref = decodeStat(seed, 4);
9200
+ const str = decodeStat(stats, 0);
9201
+ const tol = decodeStat(stats, 1);
9202
+ const con = decodeStat(stats, 3);
9203
+ const ref = decodeStat(stats, 4);
8910
9204
  out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol)} Speed ${computeGathererSpeed(ref)} Drain ${computeGathererDrain(con)}`;
8911
9205
  break;
8912
9206
  }
8913
9207
  case MODULE_LOADER: {
8914
- const duc = decodeStat(seed, 0);
8915
- const pla = decodeStat(seed, 1);
8916
- out += ` Mass ${computeLoaderMass(duc)} Thrust ${computeLoaderThrust(pla)}`;
9208
+ const fin = decodeStat(stats, 0);
9209
+ const pla = decodeStat(stats, 1);
9210
+ out += ` Mass ${computeLoaderMass(fin)} Thrust ${computeLoaderThrust(pla)}`;
8917
9211
  break;
8918
9212
  }
8919
9213
  case MODULE_CRAFTER: {
8920
- const rea = decodeStat(seed, 0);
8921
- const clr = decodeStat(seed, 1);
8922
- out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(clr)}`;
9214
+ const rea = decodeStat(stats, 0);
9215
+ const com = decodeStat(stats, 1);
9216
+ out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(com)}`;
8923
9217
  break;
8924
9218
  }
8925
9219
  case MODULE_STORAGE: {
8926
- const str = decodeStat(seed, 0);
8927
- const duc = decodeStat(seed, 1);
8928
- const pur = decodeStat(seed, 2);
8929
- const sum = str + duc + pur;
9220
+ const str = decodeStat(stats, 0);
9221
+ const fin = decodeStat(stats, 2);
9222
+ const sat = decodeStat(stats, 3);
9223
+ const sum = str + fin + sat;
8930
9224
  const pct = 10 + idiv(sum * 10, 2997);
8931
9225
  out += ` +${pct}% capacity`;
8932
9226
  break;
@@ -8934,14 +9228,14 @@ function formatModuleLine(slot, itemId, seed) {
8934
9228
  }
8935
9229
  return out;
8936
9230
  }
8937
- function buildEntityDescription(itemId, hullSeed, moduleItems, moduleSeeds) {
8938
- const hullMass = computeBaseHullmass(hullSeed);
9231
+ function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
9232
+ const hullMass = computeBaseHullmass(hullStats);
8939
9233
  let baseCapacity = 0;
8940
9234
  if (itemId === ITEM_SHIP_T1_PACKED) {
8941
- baseCapacity = computeBaseCapacityShip(hullSeed);
9235
+ baseCapacity = computeBaseCapacityShip(hullStats);
8942
9236
  }
8943
9237
  else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
8944
- baseCapacity = computeBaseCapacityWarehouse(hullSeed);
9238
+ baseCapacity = computeBaseCapacityWarehouse(hullStats);
8945
9239
  }
8946
9240
  let out = entityDisplayName(itemId);
8947
9241
  out += ` - Hull ${hullMass} mass`;
@@ -8950,7 +9244,7 @@ function buildEntityDescription(itemId, hullSeed, moduleItems, moduleSeeds) {
8950
9244
  }
8951
9245
  out += '\n\n';
8952
9246
  for (let i = 0; i < moduleItems.length; i++) {
8953
- out += formatModuleLine(i, moduleItems[i], moduleSeeds[i] ?? 0n);
9247
+ out += formatModuleLine(i, moduleItems[i], moduleStats[i] ?? 0n);
8954
9248
  out += '\n';
8955
9249
  }
8956
9250
  return out;
@@ -8986,5 +9280,62 @@ var index = /*#__PURE__*/Object.freeze({
8986
9280
  buildEntityDescription: buildEntityDescription
8987
9281
  });
8988
9282
 
8989
- export { ActionsManager, BASE_ORBITAL_MASS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, CONTAINER_Z, CRAFT_ENERGY_DIVISOR, Container, Coordinates, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, ENTITY_CAPACITY_EXCEEDED, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, EntityInventory, EntityType, EpochsManager, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GameState, INITIAL_CONTAINER_CAPACITY, INITIAL_CONTAINER_HULLMASS, INITIAL_WAREHOUSE_CAPACITY, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_CARGO_ARM, ITEM_CARGO_LINING, ITEM_CARGO_LINING_T2, ITEM_CONTAINER_T1_PACKED, ITEM_CONTAINER_T2_PACKED, ITEM_DOES_NOT_EXIST, ITEM_ENGINE_T1, ITEM_FOCUSING_ARRAY, ITEM_GATHERER_T1, ITEM_GENERATOR_T1, ITEM_HAULER_T1, ITEM_HULL_PLATES, ITEM_HULL_PLATES_T2, ITEM_LOADER_T1, ITEM_MANUFACTURING_T1, ITEM_MATTER_CONDUIT, ITEM_NOT_AVAILABLE_AT_LOCATION, ITEM_POWER_CELL, ITEM_REACTION_CHAMBER, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_SURVEY_PROBE, ITEM_THRUSTER_CORE, ITEM_TOOL_BIT, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, InventoryAccessor, Item, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MIN_ORBITAL_ALTITUDE, MODULE_ANY, MODULE_CRAFTER, MODULE_ENGINE, MODULE_GATHERER, MODULE_GENERATOR, MODULE_HAULER, MODULE_LAUNCHER, MODULE_LOADER, MODULE_STORAGE, MODULE_WARP, index as NFT, NO_SCHEDULE, PLANET_SUBTYPE_GAS_GIANT, PLANET_SUBTYPE_ICY, PLANET_SUBTYPE_INDUSTRIAL, PLANET_SUBTYPE_OCEAN, PLANET_SUBTYPE_ROCKY, PLANET_SUBTYPE_TERRESTRIAL, PLAYER_ALREADY_JOINED, PLAYER_NOT_FOUND, PRECISION$1 as PRECISION, platform as PlatformContract, Player, PlayersManager, RECIPE_INPUTS_EXCESS, RECIPE_INPUTS_INSUFFICIENT, RECIPE_INPUTS_INVALID, RECIPE_INPUTS_MIXED, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, RESERVE_TIERS, SHIP_ALREADY_THERE, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_CARGO_NOT_LOADED, SHIP_CARGO_NOT_OWNED, SHIP_INVALID_CARGO, SHIP_INVALID_DESTINATION, SHIP_INVALID_TRAVEL_DURATION, SHIP_NOT_ARRIVED, SHIP_NOT_ENOUGH_ENERGY, SHIP_NOT_ENOUGH_ENERGY_CAPACITY, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, ScheduleAccessor, server as ServerContract, Ship, Shipload, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_CAPACITY_EXCEEDED, WAREHOUSE_NOT_FOUND, WAREHOUSE_Z, Warehouse, availableCapacity$1 as availableCapacity, availableCapacityFromMass, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildEntityDescription, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcLoadDuration, calcStacksMass, calc_acceleration, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, calc_loader_acceleration, calc_loader_flighttime, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calculateFlightTime, calculateLoadTimeBreakdown, calculateRefuelingTime, calculateTransferTime, canMove, capabilityAttributes, capabilityNames, capsHasCrafter, capsHasGatherer, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItemToStack, cargoUtils, categoryColors, categoryIcons, categoryItemMass, componentIcon, components, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass, computeComponentStats, computeContainerCapabilities, computeContainerT2Capabilities, computeCraftedOutputSeed, computeCrafterDrain, computeCrafterSpeed, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityStats, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererSpeed, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeHaulPenalty, computeHaulerCapabilities, computeHaulerDrain, computeInputMass, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeManufacturingCapabilities, computeShipCapabilities, computeShipHullCapabilities, computeStorageCapabilities, computeWarehouseHullCapabilities, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeCraftedItemStats, decodeStat, decodeStats, Shipload as default, deriveLocation, deriveLocationEpoch, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStratum, deserializeAsset, deserializeComponent, deserializeEntity, deserializeModule, deserializeResource, distanceBetweenCoordinates, distanceBetweenPoints, encodeStats, energyPercent, entityDisplayName, entityRecipes, estimateDealTravelTime, estimateTravelTime, findNearbyPlanets, formatModuleLine, getAllCraftableItems, getCapabilityAttributes, getCategoryInfo, getComponentById, getComponentsForCategory, getComponentsForStat, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEligibleResources, getEntityRecipe, getEntityRecipeByItemId, getEntitySlotLayout, getEpochInfo, getFlightOrigin, getItem, getItems, getLocationCandidates, getLocationType, getLocationTypeName, getModuleCapabilityType, getModuleRecipe, getModuleRecipeByItemId, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getResourceTier, getResourceWeight, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, hasEnergy, hasEnergyForDistance$1 as hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace$1 as hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, isCraftedItem, isFull$1 as isFull, isFullFromMass, isGatherableLocation, isInvertedAttribute, isModuleItem, isRelatedItem, itemCategory, itemIcons, itemIds, itemOffset, itemTier, itemTypeCode, lerp, makeContainer, makeShip, makeWarehouse, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleRecipes, needsRecharge, projectEntity, projectEntityAt, readCommonBase, removeFromStacks, resolveItem, resolveStats, rollTier, rollWithinTier, rotation, schedule, stackKey, stackToCargoItem, stacksEqual, statMappings, tierColors, toLocation, validateSchedule };
9283
+ function formatMass(kg) {
9284
+ const t = kg / 1000;
9285
+ const fixed = t.toFixed(2);
9286
+ const trimmed = fixed.replace(/\.?0+$/, '');
9287
+ return `${trimmed} t`;
9288
+ }
9289
+ function formatMassDelta(kg) {
9290
+ if (kg === 0)
9291
+ return '0 t';
9292
+ const sign = kg > 0 ? '+' : '-';
9293
+ return `${sign}${formatMass(Math.abs(kg))}`;
9294
+ }
9295
+
9296
+ const TIER_ADJECTIVES = {
9297
+ 1: 'Crude',
9298
+ 2: 'Dense',
9299
+ 3: 'Pure',
9300
+ 4: 'Prime',
9301
+ 5: 'Pristine',
9302
+ 6: 'Radiant',
9303
+ 7: 'Exotic',
9304
+ 8: 'Mythic',
9305
+ 9: 'Cosmic',
9306
+ 10: 'Ascendant',
9307
+ };
9308
+ const CATEGORY_LABELS = {
9309
+ ore: 'Ore',
9310
+ crystal: 'Crystal',
9311
+ gas: 'Gas',
9312
+ regolith: 'Regolith',
9313
+ biomass: 'Biomass',
9314
+ };
9315
+ function tierNumber(tier) {
9316
+ return Number(String(tier).replace(/^t/i, ''));
9317
+ }
9318
+ function displayName(resolved) {
9319
+ if (resolved.itemType === 'resource') {
9320
+ const tierNum = tierNumber(resolved.tier);
9321
+ const adj = TIER_ADJECTIVES[tierNum] ?? 'Unknown';
9322
+ const cat = resolved.category ? CATEGORY_LABELS[resolved.category] : 'Resource';
9323
+ return `${adj} ${cat}`;
9324
+ }
9325
+ return resolved.name;
9326
+ }
9327
+ function describeItem(resolved, opts) {
9328
+ const massFmt = opts?.formatMass ?? formatMass;
9329
+ const mass = massFmt(resolved.mass);
9330
+ const tier = `T${tierNumber(resolved.tier)}`;
9331
+ if (resolved.itemType === 'resource') {
9332
+ const cat = resolved.category ? CATEGORY_LABELS[resolved.category] : 'Resource';
9333
+ const header = `${tier} ${cat}`;
9334
+ const stats = resolved.stats?.map((s) => `${s.label} ${s.value}`).join(', ');
9335
+ return [header, stats, mass].filter(Boolean).join(' · ');
9336
+ }
9337
+ return `${tier} ${resolved.name} · ${mass}`;
9338
+ }
9339
+
9340
+ export { ActionsManager, BASE_ORBITAL_MASS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, CONTAINER_Z, CRAFT_ENERGY_DIVISOR, Container, Coordinates, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, ENTITY_CAPACITY_EXCEEDED, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, EntityInventory, EntityType, EpochsManager, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GameState, INITIAL_CONTAINER_CAPACITY, INITIAL_CONTAINER_HULLMASS, INITIAL_WAREHOUSE_CAPACITY, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_CARGO_ARM, ITEM_CARGO_LINING, ITEM_CARGO_LINING_T2, ITEM_CONTAINER_T1_PACKED, ITEM_CONTAINER_T2_PACKED, ITEM_DOES_NOT_EXIST, ITEM_ENGINE_T1, ITEM_FOCUSING_ARRAY, ITEM_GATHERER_T1, ITEM_GENERATOR_T1, ITEM_HAULER_T1, ITEM_HULL_PLATES, ITEM_HULL_PLATES_T2, ITEM_LOADER_T1, ITEM_MANUFACTURING_T1, ITEM_MATTER_CONDUIT, ITEM_NOT_AVAILABLE_AT_LOCATION, ITEM_POWER_CELL, ITEM_REACTION_CHAMBER, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_SURVEY_PROBE, ITEM_THRUSTER_CORE, ITEM_TOOL_BIT, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, InventoryAccessor, Item, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MIN_ORBITAL_ALTITUDE, MODULE_ANY, MODULE_CRAFTER, MODULE_ENGINE, MODULE_GATHERER, MODULE_GENERATOR, MODULE_HAULER, MODULE_LAUNCHER, MODULE_LOADER, MODULE_STORAGE, MODULE_WARP, index as NFT, NO_SCHEDULE, PLANET_SUBTYPE_GAS_GIANT, PLANET_SUBTYPE_ICY, PLANET_SUBTYPE_INDUSTRIAL, PLANET_SUBTYPE_OCEAN, PLANET_SUBTYPE_ROCKY, PLANET_SUBTYPE_TERRESTRIAL, PLAYER_ALREADY_JOINED, PLAYER_NOT_FOUND, PRECISION$1 as PRECISION, platform as PlatformContract, Player, PlayersManager, RECIPE_INPUTS_EXCESS, RECIPE_INPUTS_INSUFFICIENT, RECIPE_INPUTS_INVALID, RECIPE_INPUTS_MIXED, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, RESERVE_TIERS, SHIP_ALREADY_THERE, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_CARGO_NOT_LOADED, SHIP_CARGO_NOT_OWNED, SHIP_INVALID_CARGO, SHIP_INVALID_DESTINATION, SHIP_INVALID_TRAVEL_DURATION, SHIP_NOT_ARRIVED, SHIP_NOT_ENOUGH_ENERGY, SHIP_NOT_ENOUGH_ENERGY_CAPACITY, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, ScheduleAccessor, server as ServerContract, Ship, Shipload, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_CAPACITY_EXCEEDED, WAREHOUSE_NOT_FOUND, WAREHOUSE_Z, Warehouse, availableCapacity$1 as availableCapacity, availableCapacityFromMass, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildEntityDescription, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcLoadDuration, calcStacksMass, calc_acceleration, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, calc_loader_acceleration, calc_loader_flighttime, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calculateFlightTime, calculateLoadTimeBreakdown, calculateRefuelingTime, calculateTransferTime, canMove, capabilityAttributes, capabilityNames, capsHasCrafter, capsHasGatherer, capsHasHauler, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItemToStack, cargoUtils, categoryColors, categoryIconShapes, categoryIcons, categoryItemMass, componentIcon, components, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass, computeComponentStats, computeContainerCapabilities, computeContainerT2Capabilities, computeCraftedOutputStats, computeCrafterDrain, computeCrafterSpeed, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityStats, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererSpeed, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeHaulPenalty, computeHaulerCapabilities, computeHaulerDrain, computeInputMass, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeManufacturingCapabilities, computeShipCapabilities, computeShipHullCapabilities, computeStorageCapabilities, computeWarehouseCapabilities, computeWarehouseHullCapabilities, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeCraftedItemStats, decodeStat, decodeStats, Shipload as default, deriveLocation, deriveLocationEpoch, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStratum, describeItem, describeModule, describeModuleForItem, describeModuleForSlot, deserializeAsset, deserializeComponent, deserializeEntity, deserializeModule, deserializeResource, displayName, distanceBetweenCoordinates, distanceBetweenPoints, encodeGatheredCargoStats, encodeStats, energyPercent, entityDisplayName, entityRecipes, estimateDealTravelTime, estimateTravelTime, findNearbyPlanets, formatMass, formatMassDelta, formatModuleLine, getAllCraftableItems, getCapabilityAttributes, getCategoryInfo, getComponentById, getComponentsForCategory, getComponentsForStat, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEligibleResources, getEntityRecipe, getEntityRecipeByItemId, getEntitySlotLayout, getEpochInfo, getFlightOrigin, getItem, getItems, getLocationCandidates, getLocationType, getLocationTypeName, getModuleCapabilityType, getModuleRecipe, getModuleRecipeByItemId, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getResourceTier, getResourceWeight, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, hasEnergy, hasEnergyForDistance$1 as hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace$1 as hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, isCraftedItem, isFull$1 as isFull, isFullFromMass, isGatherableLocation, isInvertedAttribute, isModuleItem, isRelatedItem, itemAbbreviations, itemCategory, itemIds, itemOffset, itemTier, itemTypeCode, lerp, makeContainer, makeShip, makeWarehouse, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleRecipes, needsRecharge, projectEntity, projectEntityAt, readCommonBase, removeFromStacks, renderDescription, resolveItem, resolveStats, rollTier, rollWithinTier, rotation, schedule, stackKey, stackToCargoItem, stacksEqual, statMappings, tierColors, tierLabels, toLocation, validateSchedule };
8990
9341
  //# sourceMappingURL=shipload.m.js.map