@dan-uni/dan-any 0.7.8 → 0.8.5

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/dist/index.js CHANGED
@@ -5,11 +5,9 @@ import { create, fromBinary, toBinary } from "@bufbuild/protobuf";
5
5
  import { file_google_protobuf_timestamp, timestampDate, timestampFromDate, timestampNow } from "@bufbuild/protobuf/wkt";
6
6
  import { fileDesc, messageDesc as codegenv2_messageDesc } from "@bufbuild/protobuf/codegenv2";
7
7
  import { Expose, plainToInstance } from "class-transformer";
8
- import { IsDate, IsEmail, IsEnum, IsInt, IsNotEmpty, IsNumber, IsOptional, IsString, Max, Min, validateOrReject } from "class-validator";
8
+ import { IsDate, IsEmail, IsEnum, IsInt, IsNotEmpty, IsNumber, IsOptional, IsString, Max, Min, isEmail, validateOrReject } from "class-validator";
9
9
  import hh_mm_ss from "hh-mm-ss";
10
10
  import jssha from "jssha";
11
- import { Canvas as external_fabric_Canvas } from "fabric";
12
- import { StaticCanvas } from "fabric/node";
13
11
  import { brotliCompressSync, brotliDecompressSync, gunzipSync, gzipSync } from "node:zlib";
14
12
  import { decode, encode as external_base16384_encode } from "base16384";
15
13
  var __webpack_require__ = {};
@@ -62,6 +60,7 @@ __webpack_require__.d(dm_gen_namespaceObject, {
62
60
  Pools: ()=>dm_gen_Pools,
63
61
  UniDM: ()=>UniDM
64
62
  });
63
+ var package_namespaceObject = JSON.parse('{"u2":"@dan-uni/dan-any","i8":"0.8.5","e8":"https://github.com/ani-uni/danuni/tree/master/packages/dan-any#readme"}');
65
64
  const file_bili_dm = /*@__PURE__*/ fileDesc("Cg1iaWxpL2RtLnByb3RvEiBiaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MSJkCgZBdmF0YXISCgoCaWQYASABKAkSCwoDdXJsGAIgASgJEkEKC2F2YXRhcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyVHlwZSIjCgZCdWJibGUSDAoEdGV4dBgBIAEoCRILCgN1cmwYAiABKAkixgEKCEJ1YmJsZVYyEgwKBHRleHQYASABKAkSCwoDdXJsGAIgASgJEkEKC2J1YmJsZV90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnViYmxlVHlwZRIVCg1leHBvc3VyZV9vbmNlGAQgASgIEkUKDWV4cG9zdXJlX3R5cGUYBSABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGUiWwoGQnV0dG9uEgwKBHRleHQYASABKAkSQwoGYWN0aW9uGAIgASgOMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGUiWAoOQnV6endvcmRDb25maWcSRgoIa2V5d29yZHMYASADKAsyNC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdXp6d29yZFNob3dDb25maWcieAoSQnV6endvcmRTaG93Q29uZmlnEgwKBG5hbWUYASABKAkSDgoGc2NoZW1hGAIgASgJEg4KBnNvdXJjZRgDIAEoBRIKCgJpZBgEIAEoAxITCgtidXp6d29yZF9pZBgFIAEoAxITCgtzY2hlbWFfdHlwZRgGIAEoBSJ7CghDaGVja0JveBIMCgR0ZXh0GAEgASgJEjwKBHR5cGUYAiABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja2JveFR5cGUSFQoNZGVmYXVsdF92YWx1ZRgDIAEoCBIMCgRzaG93GAQgASgIIm8KCkNoZWNrQm94VjISDAoEdGV4dBgBIAEoCRI8CgR0eXBlGAIgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2hlY2tib3hUeXBlEhUKDWRlZmF1bHRfdmFsdWUYAyABKAgiggIKC0NsaWNrQnV0dG9uEhUKDXBvcnRyYWl0X3RleHQYASADKAkSFgoObGFuZHNjYXBlX3RleHQYAiADKAkSGwoTcG9ydHJhaXRfdGV4dF9mb2N1cxgDIAMoCRIcChRsYW5kc2NhcGVfdGV4dF9mb2N1cxgEIAMoCRJBCgtyZW5kZXJfdHlwZRgFIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlbmRlclR5cGUSDAoEc2hvdxgGIAEoCBI4CgZidWJibGUYByABKAsyKC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdWJibGUiswIKDUNsaWNrQnV0dG9uVjISFQoNcG9ydHJhaXRfdGV4dBgBIAMoCRIWCg5sYW5kc2NhcGVfdGV4dBgCIAMoCRIbChNwb3J0cmFpdF90ZXh0X2ZvY3VzGAMgAygJEhwKFGxhbmRzY2FwZV90ZXh0X2ZvY3VzGAQgAygJEkEKC3JlbmRlcl90eXBlGAUgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIXCg90ZXh0X2lucHV0X3Bvc3QYBiABKAgSFQoNZXhwb3N1cmVfb25jZRgHIAEoCBJFCg1leHBvc3VyZV90eXBlGAggASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb3N1cmVUeXBlIksKB0NvbW1hbmQSQAoLY29tbWFuZF9kbXMYASADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Db21tYW5kRG0i5gEKCUNvbW1hbmREbRIKCgJpZBgBIAEoAxILCgNvaWQYAiABKAMSCwoDbWlkGAMgASgDEg8KB2NvbW1hbmQYBCABKAkSDwoHY29udGVudBgFIAEoCRIQCghwcm9ncmVzcxgGIAEoBRINCgVjdGltZRgHIAEoCRINCgVtdGltZRgIIAEoCRINCgVleHRyYRgJIAEoCRINCgVpZFN0chgKIAEoCRIMCgR0eXBlGAsgASgFEhMKC2F1dG9fY3JlYXRlGAwgASgIEhIKCmNvdW50X2Rvd24YDSABKAUSDAoEYXR0chgOIAEoBSJQCg1EYW5tYWt1QUlGbGFnEj8KCGRtX2ZsYWdzGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUZsYWciiwMKC0Rhbm1ha3VFbGVtEgoKAmlkGAEgASgDEhAKCHByb2dyZXNzGAIgASgFEgwKBG1vZGUYAyABKAUSEAoIZm9udHNpemUYBCABKAUSPwoFY29sb3IYBSABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRIQCghtaWRfaGFzaBgGIAEoCRIPCgdjb250ZW50GAcgASgJEg0KBWN0aW1lGAggASgDEg4KBndlaWdodBgJIAEoBRIOCgZhY3Rpb24YCiABKAkSDAoEcG9vbBgLIAEoBRIOCgZpZF9zdHIYDCABKAkSDAoEYXR0chgNIAEoBRIRCglhbmltYXRpb24YFiABKAkSDQoFZXh0cmEYFyABKAkSQgoIY29sb3JmdWwYGCABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRIMCgR0eXBlGBkgASgFEgsKA29pZBgaIAEoAyIpCgtEYW5tYWt1RmxhZxIMCgRkbWlkGAEgASgDEgwKBGZsYWcYAiABKAUiSwoRRGFubWFrdUZsYWdDb25maWcSEAoIcmVjX2ZsYWcYASABKAUSEAoIcmVjX3RleHQYAiABKAkSEgoKcmVjX3N3aXRjaBgDIAEoBSKLBwoYRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnEikKIXBsYXllcl9kYW5tYWt1X3VzZV9kZWZhdWx0X2NvbmZpZxgBIAEoCBIsCiRwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9zd2l0Y2gYBCABKAgSKwojcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWwYBSABKAUSHwoXcGxheWVyX2Rhbm1ha3VfYmxvY2t0b3AYBiABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tzY3JvbGwYByABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tib3R0b20YCCABKAgSJAoccGxheWVyX2Rhbm1ha3VfYmxvY2tjb2xvcmZ1bBgJIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9ibG9ja3JlcGVhdBgKIAEoCBIjChtwbGF5ZXJfZGFubWFrdV9ibG9ja3NwZWNpYWwYCyABKAgSHgoWcGxheWVyX2Rhbm1ha3Vfb3BhY2l0eRgMIAEoAhIkChxwbGF5ZXJfZGFubWFrdV9zY2FsaW5nZmFjdG9yGA0gASgCEh0KFXBsYXllcl9kYW5tYWt1X2RvbWFpbhgOIAEoAhIcChRwbGF5ZXJfZGFubWFrdV9zcGVlZBgPIAEoBRIkChxpbmxpbmVfcGxheWVyX2Rhbm1ha3Vfc3dpdGNoGBAgASgIEikKIXBsYXllcl9kYW5tYWt1X3Nlbmlvcl9tb2RlX3N3aXRjaBgRIAEoBRIuCiZwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92MhgSIAEoBRKYAQoqcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWxfdjJfbWFwGBMgAygLMmQuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnLlBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EiUKHXBsYXllcl9kYW5tYWt1X2VuYWJsZV9oZXJkX2RtGBQgASgIGksKKVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEi7AkKEURhbm11UGxheWVyQ29uZmlnEh0KFXBsYXllcl9kYW5tYWt1X3N3aXRjaBgBIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9zd2l0Y2hfc2F2ZRgCIAEoCBIpCiFwbGF5ZXJfZGFubWFrdV91c2VfZGVmYXVsdF9jb25maWcYAyABKAgSLAokcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfc3dpdGNoGAQgASgIEisKI3BsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsGAUgASgFEh8KF3BsYXllcl9kYW5tYWt1X2Jsb2NrdG9wGAYgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2Nrc2Nyb2xsGAcgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2NrYm90dG9tGAggASgIEiQKHHBsYXllcl9kYW5tYWt1X2Jsb2NrY29sb3JmdWwYCSABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tyZXBlYXQYCiABKAgSIwobcGxheWVyX2Rhbm1ha3VfYmxvY2tzcGVjaWFsGAsgASgIEh4KFnBsYXllcl9kYW5tYWt1X29wYWNpdHkYDCABKAISJAoccGxheWVyX2Rhbm1ha3Vfc2NhbGluZ2ZhY3RvchgNIAEoAhIdChVwbGF5ZXJfZGFubWFrdV9kb21haW4YDiABKAISHAoUcGxheWVyX2Rhbm1ha3Vfc3BlZWQYDyABKAUSJgoecGxheWVyX2Rhbm1ha3VfZW5hYmxlYmxvY2tsaXN0GBAgASgIEiQKHGlubGluZV9wbGF5ZXJfZGFubWFrdV9zd2l0Y2gYESABKAgSJAocaW5saW5lX3BsYXllcl9kYW5tYWt1X2NvbmZpZxgSIAEoBRImCh5wbGF5ZXJfZGFubWFrdV9pb3Nfc3dpdGNoX3NhdmUYEyABKAUSKQohcGxheWVyX2Rhbm1ha3Vfc2VuaW9yX21vZGVfc3dpdGNoGBQgASgFEi4KJnBsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsX3YyGBUgASgFEpEBCipwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92Ml9tYXAYFiADKAsyXS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckNvbmZpZy5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRIlCh1wbGF5ZXJfZGFubWFrdV9lbmFibGVfaGVyZF9kbRgXIAEoCBImCh5wbGF5ZXJfZGFubWFrdV9ibG9ja3RvcF9ib3R0b20YGCABKAgSIAoYcGxheWVyX2Rhbm1ha3VfZG9tYWluX3YyGBkgASgFEh4KFnBsYXllcl9kYW5tYWt1X2RlbnNpdHkYGiABKAUSJQodcGxheWVyX2Rhbm1ha3Vfc3VidGl0bGVfcHJvb2YYGyABKAgSIwobcGxheWVyX2Rhbm1ha3VfcGVvcGxlX3Byb29mGBwgASgIGksKKVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMk1hcEVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEiMAoWRGFubXVQbGF5ZXJDb25maWdQYW5lbBIWCg5zZWxlY3Rpb25fdGV4dBgBIAEoCSJLChhEYW5tdVBsYXllckR5bmFtaWNDb25maWcSEAoIcHJvZ3Jlc3MYASABKAUSHQoVcGxheWVyX2Rhbm1ha3VfZG9tYWluGA4gASgCIpADChVEYW5tdVBsYXllclZpZXdDb25maWcSYQodZGFubXVrdV9kZWZhdWx0X3BsYXllcl9jb25maWcYASABKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdURlZmF1bHRQbGF5ZXJDb25maWcSUgoVZGFubXVrdV9wbGF5ZXJfY29uZmlnGAIgASgLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWcSYQodZGFubXVrdV9wbGF5ZXJfZHluYW1pY19jb25maWcYAyADKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tdVBsYXllckR5bmFtaWNDb25maWcSXQobZGFubXVrdV9wbGF5ZXJfY29uZmlnX3BhbmVsGAQgASgLMjguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWdQYW5lbCKZBQoURGFubXVXZWJQbGF5ZXJDb25maWcSEQoJZG1fc3dpdGNoGAEgASgIEhEKCWFpX3N3aXRjaBgCIAEoCBIQCghhaV9sZXZlbBgDIAEoBRIQCghibG9ja3RvcBgEIAEoCBITCgtibG9ja3Njcm9sbBgFIAEoCBITCgtibG9ja2JvdHRvbRgGIAEoCBISCgpibG9ja2NvbG9yGAcgASgIEhQKDGJsb2Nrc3BlY2lhbBgIIAEoCBIUCgxwcmV2ZW50c2hhZGUYCSABKAgSDQoFZG1hc2sYCiABKAgSDwoHb3BhY2l0eRgLIAEoAhIOCgZkbWFyZWEYDCABKAUSEQoJc3BlZWRwbHVzGA0gASgCEhAKCGZvbnRzaXplGA4gASgCEhIKCnNjcmVlbnN5bmMYDyABKAgSEQoJc3BlZWRzeW5jGBAgASgIEhIKCmZvbnRmYW1pbHkYESABKAkSDAoEYm9sZBgSIAEoCBISCgpmb250Ym9yZGVyGBMgASgFEhEKCWRyYXdfdHlwZRgUIAEoCRIaChJzZW5pb3JfbW9kZV9zd2l0Y2gYFSABKAUSEwoLYWlfbGV2ZWxfdjIYFiABKAUSYQoPYWlfbGV2ZWxfdjJfbWFwGBcgAygLMkguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVXZWJQbGF5ZXJDb25maWcuQWlMZXZlbFYyTWFwRW50cnkSFwoPYmxvY2t0b3BfYm90dG9tGBggASgIEhIKCmRtX2FyZWFfdjIYGSABKAUSEgoKZG1fZGVuc2l0eRgaIAEoBRozChFBaUxldmVsVjJNYXBFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBIlkKCkRtQ29sb3JmdWwSPgoEdHlwZRgBIAEoDjIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29sb3JmdWxUeXBlEgsKA3NyYxgCIAEoCSJQCg9EbUV4cG9SZXBvcnRSZXESEgoKc2Vzc2lvbl9pZBgBIAEoCRILCgNvaWQYAiABKAMSDQoFZG1pZHMYAyABKAwSDQoFc3BtaWQYBCABKAkiEQoPRG1FeHBvUmVwb3J0UmVzIm0KCkRtSGVyZFZpZXcSGwoTZGlzcGxheV9oZXJkX2RtX251bRgBIAEoBRJCCghoZXJkX2RtcxgCIAMoCzIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlZpZXdIZXJkRG1FbGVtIpYCCgpEbU1hc2tXYWxsEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAxIPCgdjb250ZW50GAMgASgJEk0KDGNvbnRlbnRfdHlwZRgEIAEoDjI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZRJFCghiaXpfdHlwZRgFIAEoDjIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxCaXpUeXBlEkUKCGNvbnRlbnRzGAYgAygLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1NYXNrV2FsbENvbnRlbnQiawoRRG1NYXNrV2FsbENvbnRlbnQSRQoEdHlwZRgBIAEoDjI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50VHlwZRIPCgdjb250ZW50GAIgASgJIs0QChFEbVBsYXllckNvbmZpZ1JlcRIKCgJ0cxgBIAEoAxJFCgZzd2l0Y2gYAiABKAsyNS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U3dpdGNoEk4KC3N3aXRjaF9zYXZlGAMgASgLMjkuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVN3aXRjaFNhdmUSWwoSdXNlX2RlZmF1bHRfY29uZmlnGAQgASgLMj8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVVzZURlZmF1bHRDb25maWcSYQoVYWlfcmVjb21tZW5kZWRfc3dpdGNoGAUgASgLMkIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRTd2l0Y2gSXwoUYWlfcmVjb21tZW5kZWRfbGV2ZWwYBiABKAsyQS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEkkKCGJsb2NrdG9wGAcgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrdG9wEk8KC2Jsb2Nrc2Nyb2xsGAggASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2Nrc2Nyb2xsEk8KC2Jsb2NrYm90dG9tGAkgASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrYm90dG9tElMKDWJsb2NrY29sb3JmdWwYCiABKAsyPC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tjb2xvcmZ1bBJPCgtibG9ja3JlcGVhdBgLIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja3JlcGVhdBJRCgxibG9ja3NwZWNpYWwYDCABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEkcKB29wYWNpdHkYDSABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1T3BhY2l0eRJTCg1zY2FsaW5nZmFjdG9yGA4gASgLMjwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVNjYWxpbmdmYWN0b3ISRQoGZG9tYWluGA8gASgLMjUuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURvbWFpbhJDCgVzcGVlZBgQIAEoCzI0LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTcGVlZBJXCg9lbmFibGVibG9ja2xpc3QYESABKAsyPi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0El4KGWlubGluZVBsYXllckRhbm1ha3VTd2l0Y2gYEiABKAsyOy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5JbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoElsKEnNlbmlvcl9tb2RlX3N3aXRjaBgTIAEoCzI/LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTZW5pb3JNb2RlU3dpdGNoEmQKF2FpX3JlY29tbWVuZGVkX2xldmVsX3YyGBQgASgLMkMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbFYyElMKDmVuYWJsZV9oZXJkX2RtGBUgASgLMjsuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUVuYWJsZUhlcmREbRJWCg9ibG9ja3RvcF9ib3R0b20YFiABKAsyPS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SSgoJZG9tYWluX3YyGBcgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURvbWFpblYyEkcKB2RlbnNpdHkYGCABKAsyNi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1RGVuc2l0eRJUCg5zdWJ0aXRsZV9wcm9vZhgZIAEoCzI8LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTdWJ0aXRsZVByb29mElAKDHBlb3BsZV9wcm9vZhgaIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VQZW9wbGVQcm9vZiIvCgtEbVNlZ0NvbmZpZxIRCglwYWdlX3NpemUYASABKAMSDQoFdG90YWwYAiABKAMikQIKEERtU2VnTW9iaWxlUmVwbHkSPAoFZWxlbXMYASADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbRINCgVzdGF0ZRgCIAEoBRJACgdhaV9mbGFnGAMgASgLMi8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUFJRmxhZxIVCg1zZWdtZW50X3J1bGVzGAQgAygDEkIKDGNvbG9yZnVsX3NyYxgFIAMoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtQ29sb3JmdWwSEwoLY29udGV4dF9zcmMYBiABKAkiygEKDkRtU2VnTW9iaWxlUmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRIVCg1zZWdtZW50X2luZGV4GAQgASgDEhYKDnRlZW5hZ2Vyc19tb2RlGAUgASgFEgoKAnBzGAYgASgDEgoKAnBlGAcgASgDEhEKCXB1bGxfbW9kZRgIIAEoBRISCgpmcm9tX3NjZW5lGAkgASgFEg0KBXNwbWlkGAogASgJEhMKC2NvbnRleHRfZXh0GAsgASgJIlwKDURtU2VnT3R0UmVwbHkSPAoFZWxlbXMYASADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbRINCgVzdGF0ZRgCIAEoBSJMCgtEbVNlZ090dFJlcRILCgNwaWQYASABKAMSCwoDb2lkGAIgASgDEgwKBHR5cGUYAyABKAUSFQoNc2VnbWVudF9pbmRleBgEIAEoAyJdCg1EbVNlZ1NES1JlcGx5Eg4KBmNsb3NlZBgBIAEoCBI8CgVlbGVtcxgCIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VFbGVtIkwKC0RtU2VnU0RLUmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRIVCg1zZWdtZW50X2luZGV4GAQgASgDIncKCURtU3ViVmlldxIMCgR0eXBlGAEgASgFEgsKA29pZBgCIAEoAxILCgNwaWQYAyABKAMSQgoLcG9zdF9wYW5lbDIYBCADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxWMiKhCQoLRG1WaWV3UmVwbHkSDgoGY2xvc2VkGAEgASgIEjkKBG1hc2sYAiABKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWRlb01hc2sSQQoIc3VidGl0bGUYAyABKAsyLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWRlb1N1YnRpdGxlEhMKC3NwZWNpYWxfZG1zGAQgAygJEkQKB2FpX2ZsYWcYBSABKAsyMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RmxhZ0NvbmZpZxJOCg1wbGF5ZXJfY29uZmlnGAYgASgLMjcuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJWaWV3Q29uZmlnEhYKDnNlbmRfYm94X3N0eWxlGAcgASgFEg0KBWFsbG93GAggASgIEhEKCWNoZWNrX2JveBgJIAEoCBIaChJjaGVja19ib3hfc2hvd19tc2cYCiABKAkSGAoQdGV4dF9wbGFjZWhvbGRlchgLIAEoCRIZChFpbnB1dF9wbGFjZWhvbGRlchgMIAEoCRIdChVyZXBvcnRfZmlsdGVyX2NvbnRlbnQYDSADKAkSQQoLZXhwb19yZXBvcnQYDiABKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvUmVwb3J0EkkKD2J1enp3b3JkX2NvbmZpZxgPIAEoCzIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1enp3b3JkQ29uZmlnEkIKC2V4cHJlc3Npb25zGBAgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnMSPwoKcG9zdF9wYW5lbBgRIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbBIVCg1hY3Rpdml0eV9tZXRhGBIgAygJEkIKC3Bvc3RfcGFuZWwyGBMgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjISQgoMZG1fbWFza193YWxsGBQgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1NYXNrV2FsbBI9CgdkbV9oZXJkGBUgASgLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1IZXJkVmlldxI6Cgdjb21tYW5kGBYgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ29tbWFuZBIKCgJrdhgXIAEoCRI+CglzdWJfdmlld3MYGCADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVN1YlZpZXcSNgoDcW9lGBkgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUW9lSW5mbyJtCglEbVZpZXdSZXESCwoDcGlkGAEgASgDEgsKA29pZBgCIAEoAxIMCgR0eXBlGAMgASgFEg0KBXNwbWlkGAQgASgJEhQKDGlzX2hhcmRfYm9vdBgFIAEoBRITCgtjb250ZXh0X2V4dBgGIAEoCSKBBgoORG1XZWJWaWV3UmVwbHkSDQoFc3RhdGUYASABKAUSDAoEdGV4dBgCIAEoCRIRCgl0ZXh0X3NpZGUYAyABKAkSPQoGZG1fc2dlGAQgASgLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdDb25maWcSQQoEZmxhZxgFIAEoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VGbGFnQ29uZmlnEhMKC3NwZWNpYWxfZG1zGAYgAygJEhEKCWNoZWNrX2JveBgHIAEoCBINCgVjb3VudBgIIAEoAxJACgtjb21tYW5kX2RtcxgJIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNvbW1hbmREbRJNCg1wbGF5ZXJfY29uZmlnGAogASgLMjYuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVXZWJQbGF5ZXJDb25maWcSHQoVcmVwb3J0X2ZpbHRlcl9jb250ZW50GAsgAygJEkIKC2V4cHJlc3Npb25zGAwgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbnMSPwoKcG9zdF9wYW5lbBgNIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbBIVCg1hY3Rpdml0eV9tZXRhGA4gAygJEkIKC3Bvc3RfcGFuZWwyGA8gAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjISPgoJc3ViX3ZpZXdzGBAgAygLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TdWJWaWV3EjYKA3FvZRgRIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlFvZUluZm8iKgoKRXhwb1JlcG9ydBIcChRzaG91bGRfcmVwb3J0X2F0X2VuZBgBIAEoCCJkCgpFeHByZXNzaW9uEg8KB2tleXdvcmQYASADKAkSCwoDdXJsGAIgASgJEjgKBnBlcmlvZBgDIAMoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBlcmlvZCJJCgtFeHByZXNzaW9ucxI6CgRkYXRhGAEgAygLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwcmVzc2lvbiIqChlJbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoEg0KBXZhbHVlGAEgASgIIicKBUxhYmVsEg0KBXRpdGxlGAEgASgJEg8KB2NvbnRlbnQYAiADKAkihwEKB0xhYmVsVjISDQoFdGl0bGUYASABKAkSDwoHY29udGVudBgCIAMoCRIVCg1leHBvc3VyZV9vbmNlGAMgASgIEkUKDWV4cG9zdXJlX3R5cGUYBCABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5FeHBvc3VyZVR5cGUiJAoGUGVyaW9kEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAyIwCh9QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsEg0KBXZhbHVlGAEgASgFIjIKIVBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMhINCgV2YWx1ZRgBIAEoBSIxCiBQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZFN3aXRjaBINCgV2YWx1ZRgBIAEoCCIpChhQbGF5ZXJEYW5tYWt1QmxvY2tib3R0b20SDQoFdmFsdWUYASABKAgiKwoaUGxheWVyRGFubWFrdUJsb2NrY29sb3JmdWwSDQoFdmFsdWUYASABKAgiKQoYUGxheWVyRGFubWFrdUJsb2NrcmVwZWF0Eg0KBXZhbHVlGAEgASgIIikKGFBsYXllckRhbm1ha3VCbG9ja3Njcm9sbBINCgV2YWx1ZRgBIAEoCCIqChlQbGF5ZXJEYW5tYWt1QmxvY2tzcGVjaWFsEg0KBXZhbHVlGAEgASgIIiYKFVBsYXllckRhbm1ha3VCbG9ja3RvcBINCgV2YWx1ZRgBIAEoCCIsChtQbGF5ZXJEYW5tYWt1QmxvY2t0b3BCb3R0b20SDQoFdmFsdWUYASABKAgiJQoUUGxheWVyRGFubWFrdURlbnNpdHkSDQoFdmFsdWUYASABKAUiJAoTUGxheWVyRGFubWFrdURvbWFpbhINCgV2YWx1ZRgBIAEoAiImChVQbGF5ZXJEYW5tYWt1RG9tYWluVjISDQoFdmFsdWUYASABKAUiKgoZUGxheWVyRGFubWFrdUVuYWJsZUhlcmREbRINCgV2YWx1ZRgBIAEoCCItChxQbGF5ZXJEYW5tYWt1RW5hYmxlYmxvY2tsaXN0Eg0KBXZhbHVlGAEgASgIIiUKFFBsYXllckRhbm1ha3VPcGFjaXR5Eg0KBXZhbHVlGAEgASgCIikKGFBsYXllckRhbm1ha3VQZW9wbGVQcm9vZhINCgV2YWx1ZRgBIAEoCCIrChpQbGF5ZXJEYW5tYWt1U2NhbGluZ2ZhY3RvchINCgV2YWx1ZRgBIAEoAiIuCh1QbGF5ZXJEYW5tYWt1U2VuaW9yTW9kZVN3aXRjaBINCgV2YWx1ZRgBIAEoBSIjChJQbGF5ZXJEYW5tYWt1U3BlZWQSDQoFdmFsdWUYASABKAUiKwoaUGxheWVyRGFubWFrdVN1YnRpdGxlUHJvb2YSDQoFdmFsdWUYASABKAgiOAoTUGxheWVyRGFubWFrdVN3aXRjaBINCgV2YWx1ZRgBIAEoCBISCgpjYW5faWdub3JlGAIgASgIIigKF1BsYXllckRhbm1ha3VTd2l0Y2hTYXZlEg0KBXZhbHVlGAEgASgIIi4KHVBsYXllckRhbm1ha3VVc2VEZWZhdWx0Q29uZmlnEg0KBXZhbHVlGAEgASgIIowDCglQb3N0UGFuZWwSDQoFc3RhcnQYASABKAMSCwoDZW5kGAIgASgDEhAKCHByaW9yaXR5GAMgASgDEg4KBmJpel9pZBgEIAEoAxJECghiaXpfdHlwZRgFIAEoDjIyLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbEJpelR5cGUSQwoMY2xpY2tfYnV0dG9uGAYgASgLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2xpY2tCdXR0b24SPwoKdGV4dF9pbnB1dBgHIAEoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dBI9CgljaGVja19ib3gYCCABKAsyKi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja0JveBI2CgV0b2FzdBgJIAEoCzInLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0Iq0ECgtQb3N0UGFuZWxWMhINCgVzdGFydBgBIAEoAxILCgNlbmQYAiABKAMSRAoIYml6X3R5cGUYAyABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxCaXpUeXBlEkUKDGNsaWNrX2J1dHRvbhgEIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNsaWNrQnV0dG9uVjISQQoKdGV4dF9pbnB1dBgFIAEoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRleHRJbnB1dFYyEj8KCWNoZWNrX2JveBgGIAEoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNoZWNrQm94VjISOAoFdG9hc3QYByABKAsyKS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Ub2FzdFYyEjoKBmJ1YmJsZRgIIAEoCzIqLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1YmJsZVYyEjgKBWxhYmVsGAkgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuTGFiZWxWMhJBCgtwb3N0X3N0YXR1cxgKIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RTdGF0dXMiFwoHUW9lSW5mbxIMCgRpbmZvGAEgASgJIikKCFJlc3BvbnNlEgwKBGNvZGUYASABKAUSDwoHbWVzc2FnZRgCIAEoCSL5AgoMU3VidGl0bGVJdGVtEgoKAmlkGAEgASgDEg4KBmlkX3N0chgCIAEoCRILCgNsYW4YAyABKAkSDwoHbGFuX2RvYxgEIAEoCRIUCgxzdWJ0aXRsZV91cmwYBSABKAkSOgoGYXV0aG9yGAYgASgLMiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVXNlckluZm8SPAoEdHlwZRgHIAEoDjIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlVHlwZRIVCg1sYW5fZG9jX2JyaWVmGAggASgJEkEKB2FpX3R5cGUYCSABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpVHlwZRJFCglhaV9zdGF0dXMYCiABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUFpU3RhdHVzIugCCglUZXh0SW5wdXQSHAoUcG9ydHJhaXRfcGxhY2Vob2xkZXIYASADKAkSHQoVbGFuZHNjYXBlX3BsYWNlaG9sZGVyGAIgAygJEkEKC3JlbmRlcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIYChBwbGFjZWhvbGRlcl9wb3N0GAQgASgIEgwKBHNob3cYBSABKAgSOAoGYXZhdGFyGAYgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyEkEKC3Bvc3Rfc3RhdHVzGAcgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFN0YXR1cxI2CgVsYWJlbBgIIAEoCzInLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkxhYmVsIvsBCgtUZXh0SW5wdXRWMhIcChRwb3J0cmFpdF9wbGFjZWhvbGRlchgBIAMoCRIdChVsYW5kc2NhcGVfcGxhY2Vob2xkZXIYAiADKAkSQQoLcmVuZGVyX3R5cGUYAyABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5SZW5kZXJUeXBlEhgKEHBsYWNlaG9sZGVyX3Bvc3QYBCABKAgSOAoGYXZhdGFyGAUgAygLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQXZhdGFyEhgKEHRleHRfaW5wdXRfbGltaXQYBiABKAUibwoFVG9hc3QSDAoEdGV4dBgBIAEoCRIQCghkdXJhdGlvbhgCIAEoBRIMCgRzaG93GAMgASgIEjgKBmJ1dHRvbhgEIAEoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1dHRvbiJiCg1Ub2FzdEJ1dHRvblYyEgwKBHRleHQYASABKAkSQwoGYWN0aW9uGAIgASgOMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RGdW5jdGlvblR5cGUicwoHVG9hc3RWMhIMCgR0ZXh0GAEgASgJEhAKCGR1cmF0aW9uGAIgASgFEkgKD3RvYXN0X2J1dHRvbl92MhgDIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0QnV0dG9uVjIiXAoIVXNlckluZm8SCwoDbWlkGAEgASgDEgwKBG5hbWUYAiABKAkSCwoDc2V4GAMgASgJEgwKBGZhY2UYBCABKAkSDAoEc2lnbhgFIAEoCRIMCgRyYW5rGAYgASgFIlMKCVZpZGVvTWFzaxILCgNjaWQYASABKAMSDAoEcGxhdBgCIAEoBRILCgNmcHMYAyABKAUSDAoEdGltZRgEIAEoAxIQCghtYXNrX3VybBgFIAEoCSJwCg1WaWRlb1N1YnRpdGxlEgsKA2xhbhgBIAEoCRIPCgdsYW5fZG9jGAIgASgJEkEKCXN1YnRpdGxlcxgDIAMoCzIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlN1YnRpdGxlSXRlbSKSAQoOVmlld0hlcmREbUVsZW0SEAoIaGVyZF9tc2cYASABKAkSFgoOaGVyZF9zdGFydF9jbnQYAiABKAUSFAoMaGVyZF9lbmRfY250GAMgASgFEhIKCnJlZ2V4X3J1bGUYBCABKAkSFgoOc3RhcnRfcHJvZ3Jlc3MYBSABKAUSFAoMZW5kX3Byb2dyZXNzGAYgASgFKjMKCkF2YXRhclR5cGUSEgoOQXZhdGFyVHlwZU5vbmUQABIRCg1BdmF0YXJUeXBlTkZUEAEqWQoKQnViYmxlVHlwZRISCg5CdWJibGVUeXBlTm9uZRAAEhkKFUJ1YmJsZVR5cGVDbGlja0J1dHRvbhABEhwKGEJ1YmJsZVR5cGVEbVNldHRpbmdQYW5lbBACKlgKDENoZWNrYm94VHlwZRIUChBDaGVja2JveFR5cGVOb25lEAASGQoVQ2hlY2tib3hUeXBlRW5jb3VyYWdlEAESFwoTQ2hlY2tib3hUeXBlQ29sb3JETRACKjUKDkRtQ29sb3JmdWxUeXBlEgwKCE5vbmVUeXBlEAASFQoPVmlwR3JhZHVhbENvbG9yEOHUAypgChFEbU1hc2tXYWxsQml6VHlwZRILCgdVbmtub3duEAASBwoDT0dWEAESCgoGQml6UGljEAISCAoETXV0ZRADEgoKBlJlY29yZBAEEgkKBUNsb3VkEAUSCAoEQUlHQxAGKnYKFURtTWFza1dhbGxDb250ZW50VHlwZRIgChxEbU1hc2tXYWxsQ29udGVudFR5cGVVbmtub3duEAASHQoZRG1NYXNrV2FsbENvbnRlbnRUeXBlVGV4dBABEhwKGERtTWFza1dhbGxDb250ZW50VHlwZVBpYxACKjwKDEV4cG9zdXJlVHlwZRIUChBFeHBvc3VyZVR5cGVOb25lEAASFgoSRXhwb3N1cmVUeXBlRE1TZW5kEAEqgwIKEFBvc3RQYW5lbEJpelR5cGUSGAoUUG9zdFBhbmVsQml6VHlwZU5vbmUQABIdChlQb3N0UGFuZWxCaXpUeXBlRW5jb3VyYWdlEAESGwoXUG9zdFBhbmVsQml6VHlwZUNvbG9yRE0QAhIZChVQb3N0UGFuZWxCaXpUeXBlTkZURE0QAxIdChlQb3N0UGFuZWxCaXpUeXBlRnJhZ0Nsb3NlEAQSHQoZUG9zdFBhbmVsQml6VHlwZVJlY29tbWVuZBAFEhwKGFBvc3RQYW5lbEJpelR5cGVQbG90TGVhaxAGEiIKHlBvc3RQYW5lbEJpelR5cGVBbnRpSGFyYXNzbWVudBAHKjgKClBvc3RTdGF0dXMSFAoQUG9zdFN0YXR1c05vcm1hbBAAEhQKEFBvc3RTdGF0dXNDbG9zZWQQASpOCgpSZW5kZXJUeXBlEhIKDlJlbmRlclR5cGVOb25lEAASFAoQUmVuZGVyVHlwZVNpbmdsZRABEhYKElJlbmRlclR5cGVSb3RhdGlvbhACKjYKEFN1YnRpdGxlQWlTdGF0dXMSCAoETm9uZRAAEgwKCEV4cG9zdXJlEAESCgoGQXNzaXN0EAIqKwoOU3VidGl0bGVBaVR5cGUSCgoGTm9ybWFsEAASDQoJVHJhbnNsYXRlEAEqHgoMU3VidGl0bGVUeXBlEgYKAkNDEAASBgoCQUkQASpOChFUb2FzdEZ1bmN0aW9uVHlwZRIZChVUb2FzdEZ1bmN0aW9uVHlwZU5vbmUQABIeChpUb2FzdEZ1bmN0aW9uVHlwZVBvc3RQYW5lbBABMqAFCgJETRJzCgtEbVNlZ01vYmlsZRIwLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnTW9iaWxlUmVxGjIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdNb2JpbGVSZXBseRJkCgZEbVZpZXcSKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVZpZXdSZXEaLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVZpZXdSZXBseRJxCg5EbVBsYXllckNvbmZpZxIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtUGxheWVyQ29uZmlnUmVxGiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVzcG9uc2USagoIRG1TZWdPdHQSLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ090dFJlcRovLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnT3R0UmVwbHkSagoIRG1TZWdTREsSLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ1NES1JlcRovLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnU0RLUmVwbHkSdAoMRG1FeHBvUmVwb3J0EjEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1FeHBvUmVwb3J0UmVxGjEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1FeHBvUmVwb3J0UmVzYgZwcm90bzM");
66
65
  const DmSegMobileReplySchema = /*@__PURE__*/ codegenv2_messageDesc(file_bili_dm, 30);
67
66
  const DmWebViewReplySchema = /*@__PURE__*/ codegenv2_messageDesc(file_bili_dm, 39);
@@ -423,11 +422,13 @@ class UniDM {
423
422
  }
424
423
  return mode;
425
424
  }
426
- static fromBili(args, cid, options) {
425
+ static fromBili(args, cid, options, recSOID) {
427
426
  if (args.oid && !cid) cid = args.oid;
428
- const SOID = `def_${platform_PlatformVideoSource.Bilibili}+${id_gen_UniID.fromBili({
427
+ const SOID = recSOID || `def_${platform_PlatformVideoSource.Bilibili}+${id_gen_UniID.fromBili({
429
428
  cid
430
- })}`, senderID = id_gen_UniID.fromBili({
429
+ })}`, senderID = isEmail(args.midHash, {
430
+ require_tld: false
431
+ }) ? args.midHash : id_gen_UniID.fromBili({
431
432
  midHash: args.midHash
432
433
  });
433
434
  let mode = 0;
@@ -524,7 +525,7 @@ class UniDM {
524
525
  this.color,
525
526
  this.ctime.getTime() / 1000,
526
527
  this.extra.bili?.pool || this.pool,
527
- this.senderID,
528
+ options?.avoidSenderIDWithAt ? this.senderID.replaceAll(`@${platform_PlatformVideoSource.Bilibili}`, '') : this.senderID,
528
529
  this.extra.bili?.dmid || this.DMID || this.toDMID(),
529
530
  this.weight
530
531
  ].join(',')
@@ -640,7 +641,7 @@ class UniDM {
640
641
  color: this.color,
641
642
  uid: this.senderID,
642
643
  m: this.content,
643
- cid: Number(this.DMID) || 1
644
+ cid: this.DMID ? Number.parseInt(Buffer.from(this.DMID).toString('hex'), 16) : 0
644
645
  };
645
646
  }
646
647
  constructor(){
@@ -839,10 +840,17 @@ _ts_decorate([
839
840
  const src_JSON = json_bigint({
840
841
  useNativeBigInt: true
841
842
  });
843
+ const DanUniConvertTipTemplate = {
844
+ meassage: 'Converted by DanUni!',
845
+ version: `JS/TS ${package_namespaceObject.u2} (v${package_namespaceObject.i8})`
846
+ };
842
847
  class UniPool {
843
- constructor(dans, options = {}){
848
+ constructor(dans, options = {}, info = {
849
+ fromConverted: false
850
+ }){
844
851
  this.dans = dans;
845
852
  this.options = options;
853
+ this.info = info;
846
854
  if (false !== options.dedupe) options.dedupe = true;
847
855
  if (this.options.dedupe) this.dedupe();
848
856
  }
@@ -992,15 +1000,21 @@ class UniPool {
992
1000
  if (dans instanceof UniPool) return new UniPool([
993
1001
  ...this.dans,
994
1002
  ...dans.dans
995
- ]);
1003
+ ], {
1004
+ ...this.options,
1005
+ ...dans.options
1006
+ }, {
1007
+ ...this.info,
1008
+ ...dans.info
1009
+ });
996
1010
  if (dans instanceof UniDM) return new UniPool([
997
1011
  ...this.dans,
998
1012
  dans
999
- ]);
1013
+ ], this.options, this.info);
1000
1014
  if (Array.isArray(dans) && dans.every((d)=>d instanceof UniDM)) return new UniPool([
1001
1015
  ...this.dans,
1002
1016
  ...dans
1003
- ]);
1017
+ ], this.options, this.info);
1004
1018
  return this;
1005
1019
  }
1006
1020
  split(key) {
@@ -1011,8 +1025,9 @@ class UniPool {
1011
1025
  return [
1012
1026
  ...set
1013
1027
  ].map((v)=>new UniPool(this.dans.filter((d)=>d[key] === v), {
1028
+ ...this.options,
1014
1029
  dedupe: false
1015
- }));
1030
+ }, this.info));
1016
1031
  }
1017
1032
  dedupe() {
1018
1033
  if (false !== this.options.dmid) {
@@ -1123,7 +1138,7 @@ class UniPool {
1123
1138
  ];
1124
1139
  }
1125
1140
  });
1126
- return new UniPool(result);
1141
+ return new UniPool(result, this.options, this.info);
1127
1142
  }
1128
1143
  minify() {
1129
1144
  return this.dans.map((d)=>d.minify());
@@ -1134,14 +1149,14 @@ class UniPool {
1134
1149
  return this.dans;
1135
1150
  case 'danuni.bin':
1136
1151
  return this.toPb();
1152
+ case 'bili.xml':
1153
+ return this.toBiliXML();
1137
1154
  case 'dplayer.json':
1138
1155
  return this.toDplayer();
1139
1156
  case 'artplayer.json':
1140
1157
  return this.toArtplayer();
1141
1158
  case 'ddplay.json':
1142
1159
  return this.toDDplay();
1143
- case 'common.ass':
1144
- return this.toASS();
1145
1160
  default:
1146
1161
  {
1147
1162
  const message = '(err) Unknown format or unsupported now!';
@@ -1154,6 +1169,7 @@ class UniPool {
1154
1169
  const data = fromBinary(DanmakuReplySchema, new Uint8Array(bin));
1155
1170
  return new UniPool(data.danmakus.map((d)=>UniDM.create({
1156
1171
  ...d,
1172
+ progress: d.progress / 1000,
1157
1173
  mode: d.mode,
1158
1174
  ctime: timestampDate(d.ctime || timestampNow()),
1159
1175
  pool: d.pool,
@@ -1165,7 +1181,7 @@ class UniPool {
1165
1181
  danmakus: this.dans.map((d)=>({
1166
1182
  SOID: d.SOID,
1167
1183
  DMID: d.DMID,
1168
- progress: d.progress,
1184
+ progress: 1000 * d.progress,
1169
1185
  mode: d.mode,
1170
1186
  fontsize: d.fontsize,
1171
1187
  color: d.color,
@@ -1183,7 +1199,7 @@ class UniPool {
1183
1199
  static fromBiliXML(xml, options) {
1184
1200
  const parser = new XMLParser({
1185
1201
  ignoreAttributes: false
1186
- }), oriData = parser.parse(xml), dans = oriData.i.d;
1202
+ }), oriData = parser.parse(xml), dans = oriData.i.d, fromConverted = !!oriData.danuni, cid = BigInt(oriData.i.chatid);
1187
1203
  return new UniPool(dans.map((d)=>{
1188
1204
  const p_str = d['@_p'], p_arr = p_str.split(',');
1189
1205
  return UniDM.fromBili({
@@ -1197,18 +1213,24 @@ class UniPool {
1197
1213
  midHash: p_arr[6],
1198
1214
  id: BigInt(p_arr[7]),
1199
1215
  weight: Number.parseInt(p_arr[8])
1200
- }, BigInt(oriData.i.chatid), options);
1201
- }).filter((d)=>null !== d), options);
1216
+ }, cid, options, fromConverted ? oriData.danuni?.data : void 0);
1217
+ }).filter((d)=>null !== d), options, {
1218
+ fromConverted
1219
+ });
1202
1220
  }
1203
- toBiliXML() {
1221
+ toBiliXML(options) {
1204
1222
  const genCID = (id)=>{
1205
1223
  const UniID = id_gen_UniID.fromString(id);
1206
1224
  if (UniID.domain === platform_PlatformVideoSource.Bilibili) {
1207
1225
  const cid = UniID.id.replaceAll(`def_${platform_PlatformVideoSource.Bilibili}+`, '');
1208
1226
  if (cid) return cid;
1209
1227
  }
1210
- return Number.parseInt(Buffer.from(id).toString('hex'), 16).toString();
1228
+ return !options?.cid || id;
1211
1229
  };
1230
+ if (options?.avoidSenderIDWithAt) {
1231
+ const ok = this.dans.every((d)=>d.senderID.endsWith(`@${platform_PlatformVideoSource.Bilibili}`));
1232
+ if (!ok) throw new Error("\u5B58\u5728\u5176\u4ED6\u6765\u6E90\u7684senderID\uFF0C\u8BF7\u5173\u95ED\u8BE5\u529F\u80FD\u518D\u8BD5\uFF01");
1233
+ }
1212
1234
  const builder = new XMLBuilder({
1213
1235
  ignoreAttributes: false
1214
1236
  });
@@ -1217,6 +1239,10 @@ class UniPool {
1217
1239
  '@_version': '1.0',
1218
1240
  '@_encoding': 'UTF-8'
1219
1241
  },
1242
+ danuni: {
1243
+ ...DanUniConvertTipTemplate,
1244
+ data: this.shared.SOID
1245
+ },
1220
1246
  i: {
1221
1247
  chatserver: 'chat.bilibili.com',
1222
1248
  chatid: genCID(this.dans[0].SOID),
@@ -1225,7 +1251,7 @@ class UniPool {
1225
1251
  state: 0,
1226
1252
  real_name: 0,
1227
1253
  source: 'k-v',
1228
- d: this.dans.map((dan)=>dan.toBiliXML())
1254
+ d: this.dans.map((dan)=>dan.toBiliXML(options))
1229
1255
  }
1230
1256
  });
1231
1257
  }
@@ -1247,11 +1273,14 @@ class UniPool {
1247
1273
  mode: d[1],
1248
1274
  color: d[2],
1249
1275
  midHash: d[3]
1250
- }, playerID, domain, options)), options);
1276
+ }, playerID, domain, options)), options, {
1277
+ fromConverted: !!json.danuni
1278
+ });
1251
1279
  }
1252
1280
  toDplayer() {
1253
1281
  return {
1254
1282
  code: 0,
1283
+ danuni: DanUniConvertTipTemplate,
1255
1284
  data: this.dans.map((dan)=>{
1256
1285
  const d = dan.toDplayer();
1257
1286
  return [
@@ -1265,26 +1294,31 @@ class UniPool {
1265
1294
  };
1266
1295
  }
1267
1296
  static fromArtplayer(json, playerID, domain = 'other', options) {
1268
- return new UniPool(json.map((d)=>UniDM.fromArtplayer({
1297
+ return new UniPool(json.danmuku.map((d)=>UniDM.fromArtplayer({
1269
1298
  content: d.text,
1270
1299
  progress: d.time || 0,
1271
1300
  mode: d.mode || 0,
1272
1301
  color: Number((d.color || 'FFFFFF').replace('#', '0x')),
1273
1302
  style: d.style
1274
- }, playerID, domain, options)), options);
1303
+ }, playerID, domain, options)), options, {
1304
+ fromConverted: !!json.danuni
1305
+ });
1275
1306
  }
1276
1307
  toArtplayer() {
1277
- return this.dans.map((dan)=>{
1278
- const d = dan.toArtplayer();
1279
- return {
1280
- text: d.content,
1281
- time: d.progress,
1282
- mode: d.mode,
1283
- color: `#${d.color.toString(16).toUpperCase() || 'FFFFFF'}`,
1284
- border: d.border,
1285
- style: d.style
1286
- };
1287
- });
1308
+ return {
1309
+ danuni: DanUniConvertTipTemplate,
1310
+ danmuku: this.dans.map((dan)=>{
1311
+ const d = dan.toArtplayer();
1312
+ return {
1313
+ text: d.content,
1314
+ time: d.progress,
1315
+ mode: d.mode,
1316
+ color: `#${d.color.toString(16).toUpperCase() || 'FFFFFF'}`,
1317
+ border: d.border,
1318
+ style: d.style
1319
+ };
1320
+ })
1321
+ };
1288
1322
  }
1289
1323
  static fromDDPlay(json, episodeId, options) {
1290
1324
  return new UniPool(json.comments.map((d)=>{
@@ -1297,10 +1331,13 @@ class UniPool {
1297
1331
  progress: Number.parseFloat(p_arr[0]),
1298
1332
  uid: p_arr[3]
1299
1333
  }, episodeId, void 0, options);
1300
- }), options);
1334
+ }), options, {
1335
+ fromConverted: !!json.danuni
1336
+ });
1301
1337
  }
1302
1338
  toDDplay() {
1303
1339
  return {
1340
+ danuni: DanUniConvertTipTemplate,
1304
1341
  count: this.dans.length,
1305
1342
  comments: this.dans.map((dan)=>{
1306
1343
  const d = dan.toDDplay();
@@ -1315,7 +1352,7 @@ class UniPool {
1315
1352
  static fromASS(ass) {
1316
1353
  return parseAssRawField(ass);
1317
1354
  }
1318
- toASS(options = {
1355
+ toASS(canvasCtx, options = {
1319
1356
  substyle: {}
1320
1357
  }) {
1321
1358
  const fn = this.shared.SOID;
@@ -1323,7 +1360,7 @@ class UniPool {
1323
1360
  filename: fn,
1324
1361
  title: fn,
1325
1362
  ...options
1326
- });
1363
+ }, canvasCtx);
1327
1364
  }
1328
1365
  }
1329
1366
  const color_pad = (s)=>s.length < 2 ? `0${s}` : s;
@@ -1433,18 +1470,7 @@ const splitGrids = ({ fontSize, padding, playResY, bottomSpace })=>{
1433
1470
  2: arrayOfLength(linesCount, 0)
1434
1471
  };
1435
1472
  };
1436
- const measureTextWidth = (()=>{
1437
- let isWeb;
1438
- try {
1439
- isWeb = !!window;
1440
- } catch {
1441
- isWeb = false;
1442
- }
1443
- const Canvas = isWeb ? external_fabric_Canvas : StaticCanvas;
1444
- const canvasContext = new Canvas(void 0, {
1445
- width: 50,
1446
- height: 50
1447
- }).getContext();
1473
+ const measureTextWidthConstructor = (canvasContext)=>{
1448
1474
  const supportTextMeasure = !!canvasContext.measureText("\u4E2D");
1449
1475
  if (supportTextMeasure) return (fontName, fontSize, bold, text)=>{
1450
1476
  canvasContext.font = `${bold ? 'bold' : 'normal'} ${fontSize}px ${fontName}`;
@@ -1453,7 +1479,7 @@ const measureTextWidth = (()=>{
1453
1479
  };
1454
1480
  console.warn('[Warn] node-canvas is installed without text measure support, layout may not be correct');
1455
1481
  return (_fontName, fontSize, _bold, text)=>text.length * fontSize;
1456
- })();
1482
+ };
1457
1483
  const resolveAvailableFixGrid = (grids, time)=>{
1458
1484
  for (const [i, grid] of grids.entries())if (grid <= time) return i;
1459
1485
  return -1;
@@ -1466,7 +1492,7 @@ const resolveAvailableScrollGrid = (grids, rectWidth, screenWidth, time, duratio
1466
1492
  }
1467
1493
  return -1;
1468
1494
  };
1469
- const initializeLayout = (config)=>{
1495
+ const initializeLayout = (config, canvasCtx)=>{
1470
1496
  const { playResX, playResY, fontName, fontSize, bold, padding, scrollTime, fixTime, bottomSpace } = config;
1471
1497
  const [paddingTop, paddingRight, paddingBottom, paddingLeft] = padding;
1472
1498
  const defaultFontSize = fontSize[FontSize.NORMAL];
@@ -1475,7 +1501,7 @@ const initializeLayout = (config)=>{
1475
1501
  return (danmaku)=>{
1476
1502
  const targetGrids = grids[danmaku.type];
1477
1503
  const danmakuFontSize = fontSize[danmaku.fontSizeType];
1478
- const rectWidth = measureTextWidth(fontName, danmakuFontSize, bold, danmaku.content) + paddingLeft + paddingRight;
1504
+ const rectWidth = measureTextWidthConstructor(canvasCtx)(fontName, danmakuFontSize, bold, danmaku.content) + paddingLeft + paddingRight;
1479
1505
  const verticalOffset = paddingTop + Math.round((defaultFontSize - danmakuFontSize) / 2);
1480
1506
  if (danmaku.type === DanmakuType.SCROLL) {
1481
1507
  const scrollGrids = targetGrids;
@@ -1520,11 +1546,11 @@ const initializeLayout = (config)=>{
1520
1546
  }
1521
1547
  };
1522
1548
  };
1523
- const layoutDanmaku = (inputList, config)=>{
1549
+ const layoutDanmaku = (inputList, config, canvasCtx)=>{
1524
1550
  const list = [
1525
1551
  ...UniPool2DanmakuLists(inputList)
1526
1552
  ].sort((x, y)=>x.time - y.time);
1527
- const layout = initializeLayout(config);
1553
+ const layout = initializeLayout(config, canvasCtx);
1528
1554
  return DanmakuList2UniPool(list.map(layout).filter((danmaku)=>!!danmaku));
1529
1555
  };
1530
1556
  const formatTime = (seconds)=>{
@@ -1617,8 +1643,7 @@ const ass_event = (list, config)=>{
1617
1643
  ];
1618
1644
  return content.join('\n');
1619
1645
  };
1620
- var package_namespaceObject = JSON.parse('{"e8":"https://github.com/ani-uni/danuni/tree/master/packages/dan-any#readme"}');
1621
- const info = ({ playResX, playResY }, { filename, title })=>{
1646
+ const ass_info = ({ playResX, playResY }, { filename, title })=>{
1622
1647
  const content = [
1623
1648
  '[Script Info]',
1624
1649
  `Title: ${title}`,
@@ -1717,7 +1742,7 @@ const ass_create = (list, rawList, config, context = {
1717
1742
  }, rawConfig)=>{
1718
1743
  const Elist = UniPool2DanmakuLists(list), ErawList = UniPool2DanmakuLists(rawList);
1719
1744
  const content = [
1720
- info(config, context),
1745
+ ass_info(config, context),
1721
1746
  style(config),
1722
1747
  ass_event(Elist, config)
1723
1748
  ];
@@ -1759,10 +1784,10 @@ const ass_gen_config = (overrides = {})=>{
1759
1784
  config.backColor = config.backColor && formatColor(hexColorToRGB(config.backColor));
1760
1785
  return config;
1761
1786
  };
1762
- function generateASS(danmaku, options) {
1787
+ function generateASS(danmaku, options, canvasCtx) {
1763
1788
  const config = ass_gen_config(options.substyle);
1764
1789
  const mergedList = danmaku.merge(config.mergeIn);
1765
- const layoutList = layoutDanmaku(mergedList, config);
1790
+ const layoutList = layoutDanmaku(mergedList, config, canvasCtx);
1766
1791
  const content = ass_create(layoutList, danmaku, config, {
1767
1792
  filename: options?.filename || 'unknown',
1768
1793
  title: options?.title || 'unknown'
@@ -1777,10 +1802,17 @@ function parseAssRawField(ass) {
1777
1802
  const src_JSON_0 = json_bigint({
1778
1803
  useNativeBigInt: true
1779
1804
  });
1805
+ const src_DanUniConvertTipTemplate = {
1806
+ meassage: 'Converted by DanUni!',
1807
+ version: `JS/TS ${package_namespaceObject.u2} (v${package_namespaceObject.i8})`
1808
+ };
1780
1809
  class src_UniPool {
1781
- constructor(dans, options = {}){
1810
+ constructor(dans, options = {}, info = {
1811
+ fromConverted: false
1812
+ }){
1782
1813
  this.dans = dans;
1783
1814
  this.options = options;
1815
+ this.info = info;
1784
1816
  if (false !== options.dedupe) options.dedupe = true;
1785
1817
  if (this.options.dedupe) this.dedupe();
1786
1818
  }
@@ -1930,15 +1962,21 @@ class src_UniPool {
1930
1962
  if (dans instanceof src_UniPool) return new src_UniPool([
1931
1963
  ...this.dans,
1932
1964
  ...dans.dans
1933
- ]);
1965
+ ], {
1966
+ ...this.options,
1967
+ ...dans.options
1968
+ }, {
1969
+ ...this.info,
1970
+ ...dans.info
1971
+ });
1934
1972
  if (dans instanceof UniDM) return new src_UniPool([
1935
1973
  ...this.dans,
1936
1974
  dans
1937
- ]);
1975
+ ], this.options, this.info);
1938
1976
  if (Array.isArray(dans) && dans.every((d)=>d instanceof UniDM)) return new src_UniPool([
1939
1977
  ...this.dans,
1940
1978
  ...dans
1941
- ]);
1979
+ ], this.options, this.info);
1942
1980
  return this;
1943
1981
  }
1944
1982
  split(key) {
@@ -1949,8 +1987,9 @@ class src_UniPool {
1949
1987
  return [
1950
1988
  ...set
1951
1989
  ].map((v)=>new src_UniPool(this.dans.filter((d)=>d[key] === v), {
1990
+ ...this.options,
1952
1991
  dedupe: false
1953
- }));
1992
+ }, this.info));
1954
1993
  }
1955
1994
  dedupe() {
1956
1995
  if (false !== this.options.dmid) {
@@ -2061,7 +2100,7 @@ class src_UniPool {
2061
2100
  ];
2062
2101
  }
2063
2102
  });
2064
- return new src_UniPool(result);
2103
+ return new src_UniPool(result, this.options, this.info);
2065
2104
  }
2066
2105
  minify() {
2067
2106
  return this.dans.map((d)=>d.minify());
@@ -2072,14 +2111,14 @@ class src_UniPool {
2072
2111
  return this.dans;
2073
2112
  case 'danuni.bin':
2074
2113
  return this.toPb();
2114
+ case 'bili.xml':
2115
+ return this.toBiliXML();
2075
2116
  case 'dplayer.json':
2076
2117
  return this.toDplayer();
2077
2118
  case 'artplayer.json':
2078
2119
  return this.toArtplayer();
2079
2120
  case 'ddplay.json':
2080
2121
  return this.toDDplay();
2081
- case 'common.ass':
2082
- return this.toASS();
2083
2122
  default:
2084
2123
  {
2085
2124
  const message = '(err) Unknown format or unsupported now!';
@@ -2092,6 +2131,7 @@ class src_UniPool {
2092
2131
  const data = fromBinary(DanmakuReplySchema, new Uint8Array(bin));
2093
2132
  return new src_UniPool(data.danmakus.map((d)=>UniDM.create({
2094
2133
  ...d,
2134
+ progress: d.progress / 1000,
2095
2135
  mode: d.mode,
2096
2136
  ctime: timestampDate(d.ctime || timestampNow()),
2097
2137
  pool: d.pool,
@@ -2103,7 +2143,7 @@ class src_UniPool {
2103
2143
  danmakus: this.dans.map((d)=>({
2104
2144
  SOID: d.SOID,
2105
2145
  DMID: d.DMID,
2106
- progress: d.progress,
2146
+ progress: 1000 * d.progress,
2107
2147
  mode: d.mode,
2108
2148
  fontsize: d.fontsize,
2109
2149
  color: d.color,
@@ -2121,7 +2161,7 @@ class src_UniPool {
2121
2161
  static fromBiliXML(xml, options) {
2122
2162
  const parser = new XMLParser({
2123
2163
  ignoreAttributes: false
2124
- }), oriData = parser.parse(xml), dans = oriData.i.d;
2164
+ }), oriData = parser.parse(xml), dans = oriData.i.d, fromConverted = !!oriData.danuni, cid = BigInt(oriData.i.chatid);
2125
2165
  return new src_UniPool(dans.map((d)=>{
2126
2166
  const p_str = d['@_p'], p_arr = p_str.split(',');
2127
2167
  return UniDM.fromBili({
@@ -2135,18 +2175,24 @@ class src_UniPool {
2135
2175
  midHash: p_arr[6],
2136
2176
  id: BigInt(p_arr[7]),
2137
2177
  weight: Number.parseInt(p_arr[8])
2138
- }, BigInt(oriData.i.chatid), options);
2139
- }).filter((d)=>null !== d), options);
2178
+ }, cid, options, fromConverted ? oriData.danuni?.data : void 0);
2179
+ }).filter((d)=>null !== d), options, {
2180
+ fromConverted
2181
+ });
2140
2182
  }
2141
- toBiliXML() {
2183
+ toBiliXML(options) {
2142
2184
  const genCID = (id)=>{
2143
2185
  const UniID = id_gen_UniID.fromString(id);
2144
2186
  if (UniID.domain === platform_PlatformVideoSource.Bilibili) {
2145
2187
  const cid = UniID.id.replaceAll(`def_${platform_PlatformVideoSource.Bilibili}+`, '');
2146
2188
  if (cid) return cid;
2147
2189
  }
2148
- return Number.parseInt(Buffer.from(id).toString('hex'), 16).toString();
2190
+ return !options?.cid || id;
2149
2191
  };
2192
+ if (options?.avoidSenderIDWithAt) {
2193
+ const ok = this.dans.every((d)=>d.senderID.endsWith(`@${platform_PlatformVideoSource.Bilibili}`));
2194
+ if (!ok) throw new Error("\u5B58\u5728\u5176\u4ED6\u6765\u6E90\u7684senderID\uFF0C\u8BF7\u5173\u95ED\u8BE5\u529F\u80FD\u518D\u8BD5\uFF01");
2195
+ }
2150
2196
  const builder = new XMLBuilder({
2151
2197
  ignoreAttributes: false
2152
2198
  });
@@ -2155,6 +2201,10 @@ class src_UniPool {
2155
2201
  '@_version': '1.0',
2156
2202
  '@_encoding': 'UTF-8'
2157
2203
  },
2204
+ danuni: {
2205
+ ...src_DanUniConvertTipTemplate,
2206
+ data: this.shared.SOID
2207
+ },
2158
2208
  i: {
2159
2209
  chatserver: 'chat.bilibili.com',
2160
2210
  chatid: genCID(this.dans[0].SOID),
@@ -2163,7 +2213,7 @@ class src_UniPool {
2163
2213
  state: 0,
2164
2214
  real_name: 0,
2165
2215
  source: 'k-v',
2166
- d: this.dans.map((dan)=>dan.toBiliXML())
2216
+ d: this.dans.map((dan)=>dan.toBiliXML(options))
2167
2217
  }
2168
2218
  });
2169
2219
  }
@@ -2185,11 +2235,14 @@ class src_UniPool {
2185
2235
  mode: d[1],
2186
2236
  color: d[2],
2187
2237
  midHash: d[3]
2188
- }, playerID, domain, options)), options);
2238
+ }, playerID, domain, options)), options, {
2239
+ fromConverted: !!json.danuni
2240
+ });
2189
2241
  }
2190
2242
  toDplayer() {
2191
2243
  return {
2192
2244
  code: 0,
2245
+ danuni: src_DanUniConvertTipTemplate,
2193
2246
  data: this.dans.map((dan)=>{
2194
2247
  const d = dan.toDplayer();
2195
2248
  return [
@@ -2203,26 +2256,31 @@ class src_UniPool {
2203
2256
  };
2204
2257
  }
2205
2258
  static fromArtplayer(json, playerID, domain = 'other', options) {
2206
- return new src_UniPool(json.map((d)=>UniDM.fromArtplayer({
2259
+ return new src_UniPool(json.danmuku.map((d)=>UniDM.fromArtplayer({
2207
2260
  content: d.text,
2208
2261
  progress: d.time || 0,
2209
2262
  mode: d.mode || 0,
2210
2263
  color: Number((d.color || 'FFFFFF').replace('#', '0x')),
2211
2264
  style: d.style
2212
- }, playerID, domain, options)), options);
2265
+ }, playerID, domain, options)), options, {
2266
+ fromConverted: !!json.danuni
2267
+ });
2213
2268
  }
2214
2269
  toArtplayer() {
2215
- return this.dans.map((dan)=>{
2216
- const d = dan.toArtplayer();
2217
- return {
2218
- text: d.content,
2219
- time: d.progress,
2220
- mode: d.mode,
2221
- color: `#${d.color.toString(16).toUpperCase() || 'FFFFFF'}`,
2222
- border: d.border,
2223
- style: d.style
2224
- };
2225
- });
2270
+ return {
2271
+ danuni: src_DanUniConvertTipTemplate,
2272
+ danmuku: this.dans.map((dan)=>{
2273
+ const d = dan.toArtplayer();
2274
+ return {
2275
+ text: d.content,
2276
+ time: d.progress,
2277
+ mode: d.mode,
2278
+ color: `#${d.color.toString(16).toUpperCase() || 'FFFFFF'}`,
2279
+ border: d.border,
2280
+ style: d.style
2281
+ };
2282
+ })
2283
+ };
2226
2284
  }
2227
2285
  static fromDDPlay(json, episodeId, options) {
2228
2286
  return new src_UniPool(json.comments.map((d)=>{
@@ -2235,10 +2293,13 @@ class src_UniPool {
2235
2293
  progress: Number.parseFloat(p_arr[0]),
2236
2294
  uid: p_arr[3]
2237
2295
  }, episodeId, void 0, options);
2238
- }), options);
2296
+ }), options, {
2297
+ fromConverted: !!json.danuni
2298
+ });
2239
2299
  }
2240
2300
  toDDplay() {
2241
2301
  return {
2302
+ danuni: src_DanUniConvertTipTemplate,
2242
2303
  count: this.dans.length,
2243
2304
  comments: this.dans.map((dan)=>{
2244
2305
  const d = dan.toDDplay();
@@ -2253,7 +2314,7 @@ class src_UniPool {
2253
2314
  static fromASS(ass) {
2254
2315
  return parseAssRawField(ass);
2255
2316
  }
2256
- toASS(options = {
2317
+ toASS(canvasCtx, options = {
2257
2318
  substyle: {}
2258
2319
  }) {
2259
2320
  const fn = this.shared.SOID;
@@ -2261,7 +2322,7 @@ class src_UniPool {
2261
2322
  filename: fn,
2262
2323
  title: fn,
2263
2324
  ...options
2264
- });
2325
+ }, canvasCtx);
2265
2326
  }
2266
2327
  }
2267
2328
  export { UniDM, dm_gen_namespaceObject as UniDMTools, id_gen_namespaceObject as UniIDTools, src_UniPool as UniPool, platform_namespaceObject as platform };