@yorkie-js/react 0.7.12 → 0.7.13

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.
@@ -5792,7 +5792,7 @@
5792
5792
  }
5793
5793
  };
5794
5794
  }
5795
- const file_yorkie_v1_resources = /* @__PURE__ */ fileDesc("Chl5b3JraWUvdjEvcmVzb3VyY2VzLnByb3RvEgl5b3JraWUudjEirgEKCFNuYXBzaG90EiQKBHJvb3QYASABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQSNQoJcHJlc2VuY2VzGAIgAygLMiIueW9ya2llLnYxLlNuYXBzaG90LlByZXNlbmNlc0VudHJ5GkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi+wEKCkNoYW5nZVBhY2sSFAoMZG9jdW1lbnRfa2V5GAEgASgJEikKCmNoZWNrcG9pbnQYAiABKAsyFS55b3JraWUudjEuQ2hlY2twb2ludBIQCghzbmFwc2hvdBgDIAEoDBIiCgdjaGFuZ2VzGAQgAygLMhEueW9ya2llLnYxLkNoYW5nZRIwChFtaW5fc3luY2VkX3RpY2tldBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYBiABKAgSMAoOdmVyc2lvbl92ZWN0b3IYByABKAsyGC55b3JraWUudjEuVmVyc2lvblZlY3RvciKYAQoGQ2hhbmdlEh8KAmlkGAEgASgLMhMueW9ya2llLnYxLkNoYW5nZUlEEg8KB21lc3NhZ2UYAiABKAkSKAoKb3BlcmF0aW9ucxgDIAMoCzIULnlvcmtpZS52MS5PcGVyYXRpb24SMgoPcHJlc2VuY2VfY2hhbmdlGAQgASgLMhkueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlIocBCghDaGFuZ2VJRBISCgpjbGllbnRfc2VxGAEgASgNEhIKCnNlcnZlcl9zZXEYAiABKAMSDwoHbGFtcG9ydBgDIAEoAxIQCghhY3Rvcl9pZBgEIAEoDBIwCg52ZXJzaW9uX3ZlY3RvchgFIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yInQKDVZlcnNpb25WZWN0b3ISNAoGdmVjdG9yGAEgAygLMiQueW9ya2llLnYxLlZlcnNpb25WZWN0b3IuVmVjdG9yRW50cnkaLQoLVmVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgDOgI4ASLZGgoJT3BlcmF0aW9uEicKA3NldBgBIAEoCzIYLnlvcmtpZS52MS5PcGVyYXRpb24uU2V0SAASJwoDYWRkGAIgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5BZGRIABIpCgRtb3ZlGAMgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5Nb3ZlSAASLQoGcmVtb3ZlGAQgASgLMhsueW9ya2llLnYxLk9wZXJhdGlvbi5SZW1vdmVIABIpCgRlZGl0GAUgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0SAASKwoFc3R5bGUYByABKAsyGi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlSAASMQoIaW5jcmVhc2UYCCABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLkluY3JlYXNlSAASMgoJdHJlZV9lZGl0GAkgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdEgAEjQKCnRyZWVfc3R5bGUYCiABKAsyHi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZUgAEjIKCWFycmF5X3NldBgLIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uQXJyYXlTZXRIABqdAQoDU2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSCwoDa2V5GAIgASgJEisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQawAEKA0FkZBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQavwEKBE1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIuCg9wcmV2X2NyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqRAQoGUmVtb3ZlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2QMKBEVkaXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zElMKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjIueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIPCgdjb250ZW50GAUgASgJEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSPQoKYXR0cmlidXRlcxgHIAMoCzIpLnlvcmtpZS52MS5PcGVyYXRpb24uRWRpdC5BdHRyaWJ1dGVzRW50cnkaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARrpAwoFU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEj4KCmF0dHJpYnV0ZXMYBCADKAsyKi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0ElQKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAYgAygLMjMueW9ya2llLnYxLk9wZXJhdGlvbi5TdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSHAoUYXR0cmlidXRlc190b19yZW1vdmUYByADKAkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARqkAQoISW5jcmVhc2USMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIrCgV2YWx1ZRgCIAEoCzIcLnlvcmtpZS52MS5KU09ORWxlbWVudFNpbXBsZRIqCgtleGVjdXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg0KBWFjdG9yGAQgASgJGpMDCghUcmVlRWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiAKBGZyb20YAiABKAsyEi55b3JraWUudjEuVHJlZVBvcxIeCgJ0bxgDIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zElcKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjYueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdC5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSJgoIY29udGVudHMYBSADKAsyFC55b3JraWUudjEuVHJlZU5vZGVzEhMKC3NwbGl0X2xldmVsGAcgASgFEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrtAwoJVHJlZVN0eWxlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSQgoKYXR0cmlidXRlcxgEIAMoCzIuLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhwKFGF0dHJpYnV0ZXNfdG9fcmVtb3ZlGAYgAygJElgKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAcgAygLMjcueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5GjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGlEKGENyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldDoCOAEawAEKCEFycmF5U2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSLFAQoRSlNPTkVsZW1lbnRTaW1wbGUSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiIKBHR5cGUYBCABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAUgASgMIp8LCgtKU09ORWxlbWVudBI4Cgtqc29uX29iamVjdBgBIAEoCzIhLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OT2JqZWN0SAASNgoKanNvbl9hcnJheRgCIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OQXJyYXlIABI1CglwcmltaXRpdmUYAyABKAsyIC55b3JraWUudjEuSlNPTkVsZW1lbnQuUHJpbWl0aXZlSAASKwoEdGV4dBgFIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UZXh0SAASMQoHY291bnRlchgGIAEoCzIeLnlvcmtpZS52MS5KU09ORWxlbWVudC5Db3VudGVySAASKwoEdHJlZRgHIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UcmVlSAAargEKCkpTT05PYmplY3QSIQoFbm9kZXMYASADKAsyEi55b3JraWUudjEuUkhUTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQarQEKCUpTT05BcnJheRIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SR0FOb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq9AQoJUHJpbWl0aXZlEiIKBHR5cGUYASABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAIgASgMEikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqpAQoEVGV4dBIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UZXh0Tm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2AEKB0NvdW50ZXISIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhUKDWhsbF9yZWdpc3RlcnMYByABKAxKBAgGEAcaqQEKBFRyZWUSIgoFbm9kZXMYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0QgYKBGJvZHkiPwoHUkhUTm9kZRILCgNrZXkYASABKAkSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudCLuAQoHUkdBTm9kZRIgCgRuZXh0GAEgASgLMhIueW9ya2llLnYxLlJHQU5vZGUSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBIyChNwb3NpdGlvbl9jcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSMAoRcG9zaXRpb25fbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIyChNwb3NpdGlvbl9yZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUiQgoKVGltZVRpY2tldBIPCgdsYW1wb3J0GAEgASgDEhEKCWRlbGltaXRlchgCIAEoDRIQCghhY3Rvcl9pZBgDIAEoDCIuCgxEb2NFdmVudEJvZHkSDQoFdG9waWMYASABKAkSDwoHcGF5bG9hZBgCIAEoDCJrCghEb2NFdmVudBIlCgR0eXBlGAEgASgOMhcueW9ya2llLnYxLkRvY0V2ZW50VHlwZRIRCglwdWJsaXNoZXIYAiABKAkSJQoEYm9keRgDIAEoCzIXLnlvcmtpZS52MS5Eb2NFdmVudEJvZHki1gEKDENoYW5uZWxFdmVudBIqCgR0eXBlGAEgASgOMhwueW9ya2llLnYxLkNoYW5uZWxFdmVudC5UeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIVCg1zZXNzaW9uX2NvdW50GAMgASgDEgsKA3NlcRgEIAEoAxINCgV0b3BpYxgFIAEoCRIPCgdwYXlsb2FkGAYgASgMIkMKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhEKDVRZUEVfUFJFU0VOQ0UQARISCg5UWVBFX0JST0FEQ0FTVBACIiYKCERhdGFTaXplEgwKBGRhdGEYASABKAUSDAoEbWV0YRgCIAEoBSJNCgdEb2NTaXplEiEKBGxpdmUYASABKAsyEy55b3JraWUudjEuRGF0YVNpemUSHwoCZ2MYAiABKAsyEy55b3JraWUudjEuRGF0YVNpemUikQEKBlNjaGVtYRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAUSDAoEYm9keRgEIAEoCRIeCgVydWxlcxgFIAMoCzIPLnlvcmtpZS52MS5SdWxlEi4KCmNyZWF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIlAKDFRyZWVOb2RlUnVsZRIRCglub2RlX3R5cGUYASABKAkSDwoHY29udGVudBgCIAEoCRINCgVtYXJrcxgDIAEoCRINCgVncm91cBgEIAEoCSJPCgRSdWxlEgwKBHBhdGgYASABKAkSDAoEdHlwZRgCIAEoCRIrCgp0cmVlX25vZGVzGAMgAygLMhcueW9ya2llLnYxLlRyZWVOb2RlUnVsZSKDAQoPUmV2aXNpb25TdW1tYXJ5EgoKAmlkGAEgASgJEg0KBWxhYmVsGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEhAKCHNuYXBzaG90GAQgASgJEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKvwCCglWYWx1ZVR5cGUSEwoPVkFMVUVfVFlQRV9OVUxMEAASFgoSVkFMVUVfVFlQRV9CT09MRUFOEAESFgoSVkFMVUVfVFlQRV9JTlRFR0VSEAISEwoPVkFMVUVfVFlQRV9MT05HEAMSFQoRVkFMVUVfVFlQRV9ET1VCTEUQBBIVChFWQUxVRV9UWVBFX1NUUklORxAFEhQKEFZBTFVFX1RZUEVfQllURVMQBhITCg9WQUxVRV9UWVBFX0RBVEUQBxIaChZWQUxVRV9UWVBFX0pTT05fT0JKRUNUEAgSGQoVVkFMVUVfVFlQRV9KU09OX0FSUkFZEAkSEwoPVkFMVUVfVFlQRV9URVhUEAoSGgoWVkFMVUVfVFlQRV9JTlRFR0VSX0NOVBALEhcKE1ZBTFVFX1RZUEVfTE9OR19DTlQQDBITCg9WQUxVRV9UWVBFX1RSRUUQDRIgChxWQUxVRV9UWVBFX0lOVEVHRVJfREVEVVBfQ05UEA4iBAgPEA8qpgEKDERvY0V2ZW50VHlwZRIjCh9ET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9DSEFOR0VEEAASIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfV0FUQ0hFRBABEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1VOV0FUQ0hFRBACEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX0JST0FEQ0FTVBADQkUKEWRldi55b3JraWUuYXBpLnYxUAFaLmdpdGh1Yi5jb20veW9ya2llLXRlYW0veW9ya2llL2FwaS95b3JraWUvdjE7djFiBnByb3RvMw", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
5795
+ const file_yorkie_v1_resources = /* @__PURE__ */ fileDesc("Chl5b3JraWUvdjEvcmVzb3VyY2VzLnByb3RvEgl5b3JraWUudjEirgEKCFNuYXBzaG90EiQKBHJvb3QYASABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQSNQoJcHJlc2VuY2VzGAIgAygLMiIueW9ya2llLnYxLlNuYXBzaG90LlByZXNlbmNlc0VudHJ5GkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi+wEKCkNoYW5nZVBhY2sSFAoMZG9jdW1lbnRfa2V5GAEgASgJEikKCmNoZWNrcG9pbnQYAiABKAsyFS55b3JraWUudjEuQ2hlY2twb2ludBIQCghzbmFwc2hvdBgDIAEoDBIiCgdjaGFuZ2VzGAQgAygLMhEueW9ya2llLnYxLkNoYW5nZRIwChFtaW5fc3luY2VkX3RpY2tldBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYBiABKAgSMAoOdmVyc2lvbl92ZWN0b3IYByABKAsyGC55b3JraWUudjEuVmVyc2lvblZlY3RvciKYAQoGQ2hhbmdlEh8KAmlkGAEgASgLMhMueW9ya2llLnYxLkNoYW5nZUlEEg8KB21lc3NhZ2UYAiABKAkSKAoKb3BlcmF0aW9ucxgDIAMoCzIULnlvcmtpZS52MS5PcGVyYXRpb24SMgoPcHJlc2VuY2VfY2hhbmdlGAQgASgLMhkueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlIocBCghDaGFuZ2VJRBISCgpjbGllbnRfc2VxGAEgASgNEhIKCnNlcnZlcl9zZXEYAiABKAMSDwoHbGFtcG9ydBgDIAEoAxIQCghhY3Rvcl9pZBgEIAEoDBIwCg52ZXJzaW9uX3ZlY3RvchgFIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yInQKDVZlcnNpb25WZWN0b3ISNAoGdmVjdG9yGAEgAygLMiQueW9ya2llLnYxLlZlcnNpb25WZWN0b3IuVmVjdG9yRW50cnkaLQoLVmVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgDOgI4ASLpGwoJT3BlcmF0aW9uEicKA3NldBgBIAEoCzIYLnlvcmtpZS52MS5PcGVyYXRpb24uU2V0SAASJwoDYWRkGAIgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5BZGRIABIpCgRtb3ZlGAMgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5Nb3ZlSAASLQoGcmVtb3ZlGAQgASgLMhsueW9ya2llLnYxLk9wZXJhdGlvbi5SZW1vdmVIABIpCgRlZGl0GAUgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0SAASKwoFc3R5bGUYByABKAsyGi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlSAASMQoIaW5jcmVhc2UYCCABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLkluY3JlYXNlSAASMgoJdHJlZV9lZGl0GAkgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdEgAEjQKCnRyZWVfc3R5bGUYCiABKAsyHi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZUgAEjIKCWFycmF5X3NldBgLIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uQXJyYXlTZXRIABqdAQoDU2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSCwoDa2V5GAIgASgJEisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQawAEKA0FkZBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQavwEKBE1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIuCg9wcmV2X2NyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqRAQoGUmVtb3ZlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa6QQKBEVkaXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zElMKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjIueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIPCgdjb250ZW50GAUgASgJEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSPQoKYXR0cmlidXRlcxgHIAMoCzIpLnlvcmtpZS52MS5PcGVyYXRpb24uRWRpdC5BdHRyaWJ1dGVzRW50cnkSLQoNcmVzdG9yZV9zcGFucxgIIAMoCzIWLnlvcmtpZS52MS5SZXN0b3JlU3BhbhIsCgxyZXN0b3JlX21vZGUYCSABKA4yFi55b3JraWUudjEuUmVzdG9yZU1vZGUSMQoRcmV0b21ic3RvbmVfc3BhbnMYCiADKAsyFi55b3JraWUudjEuUmVzdG9yZVNwYW4aUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARrpAwoFU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEj4KCmF0dHJpYnV0ZXMYBCADKAsyKi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0ElQKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAYgAygLMjMueW9ya2llLnYxLk9wZXJhdGlvbi5TdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSHAoUYXR0cmlidXRlc190b19yZW1vdmUYByADKAkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARqkAQoISW5jcmVhc2USMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIrCgV2YWx1ZRgCIAEoCzIcLnlvcmtpZS52MS5KU09ORWxlbWVudFNpbXBsZRIqCgtleGVjdXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg0KBWFjdG9yGAQgASgJGpMDCghUcmVlRWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiAKBGZyb20YAiABKAsyEi55b3JraWUudjEuVHJlZVBvcxIeCgJ0bxgDIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zElcKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjYueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdC5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSJgoIY29udGVudHMYBSADKAsyFC55b3JraWUudjEuVHJlZU5vZGVzEhMKC3NwbGl0X2xldmVsGAcgASgFEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrtAwoJVHJlZVN0eWxlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSQgoKYXR0cmlidXRlcxgEIAMoCzIuLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhwKFGF0dHJpYnV0ZXNfdG9fcmVtb3ZlGAYgAygJElgKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAcgAygLMjcueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5GjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGlEKGENyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldDoCOAEawAEKCEFycmF5U2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSLFAQoRSlNPTkVsZW1lbnRTaW1wbGUSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiIKBHR5cGUYBCABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAUgASgMIp8LCgtKU09ORWxlbWVudBI4Cgtqc29uX29iamVjdBgBIAEoCzIhLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OT2JqZWN0SAASNgoKanNvbl9hcnJheRgCIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OQXJyYXlIABI1CglwcmltaXRpdmUYAyABKAsyIC55b3JraWUudjEuSlNPTkVsZW1lbnQuUHJpbWl0aXZlSAASKwoEdGV4dBgFIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UZXh0SAASMQoHY291bnRlchgGIAEoCzIeLnlvcmtpZS52MS5KU09ORWxlbWVudC5Db3VudGVySAASKwoEdHJlZRgHIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UcmVlSAAargEKCkpTT05PYmplY3QSIQoFbm9kZXMYASADKAsyEi55b3JraWUudjEuUkhUTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQarQEKCUpTT05BcnJheRIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SR0FOb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq9AQoJUHJpbWl0aXZlEiIKBHR5cGUYASABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAIgASgMEikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqpAQoEVGV4dBIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UZXh0Tm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2AEKB0NvdW50ZXISIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhUKDWhsbF9yZWdpc3RlcnMYByABKAxKBAgGEAcaqQEKBFRyZWUSIgoFbm9kZXMYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0QgYKBGJvZHkiPwoHUkhUTm9kZRILCgNrZXkYASABKAkSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudCLuAQoHUkdBTm9kZRIgCgRuZXh0GAEgASgLMhIueW9ya2llLnYxLlJHQU5vZGUSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBIyChNwb3NpdGlvbl9jcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSMAoRcG9zaXRpb25fbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIyChNwb3NpdGlvbl9yZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUi1AEKC1Jlc3RvcmVTcGFuEikKCmNyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBINCgVzdGFydBgCIAEoBRILCgNlbmQYAyABKAUSDwoHY29udGVudBgEIAEoCRI6CgphdHRyaWJ1dGVzGAUgAygLMiYueW9ya2llLnYxLlJlc3RvcmVTcGFuLkF0dHJpYnV0ZXNFbnRyeRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJCCgpUaW1lVGlja2V0Eg8KB2xhbXBvcnQYASABKAMSEQoJZGVsaW1pdGVyGAIgASgNEhAKCGFjdG9yX2lkGAMgASgMIi4KDERvY0V2ZW50Qm9keRINCgV0b3BpYxgBIAEoCRIPCgdwYXlsb2FkGAIgASgMImsKCERvY0V2ZW50EiUKBHR5cGUYASABKA4yFy55b3JraWUudjEuRG9jRXZlbnRUeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIlCgRib2R5GAMgASgLMhcueW9ya2llLnYxLkRvY0V2ZW50Qm9keSLWAQoMQ2hhbm5lbEV2ZW50EioKBHR5cGUYASABKA4yHC55b3JraWUudjEuQ2hhbm5lbEV2ZW50LlR5cGUSEQoJcHVibGlzaGVyGAIgASgJEhUKDXNlc3Npb25fY291bnQYAyABKAMSCwoDc2VxGAQgASgDEg0KBXRvcGljGAUgASgJEg8KB3BheWxvYWQYBiABKAwiQwoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEQoNVFlQRV9QUkVTRU5DRRABEhIKDlRZUEVfQlJPQURDQVNUEAIiJgoIRGF0YVNpemUSDAoEZGF0YRgBIAEoBRIMCgRtZXRhGAIgASgFIk0KB0RvY1NpemUSIQoEbGl2ZRgBIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZRIfCgJnYxgCIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZSKRAQoGU2NoZW1hEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDwoHdmVyc2lvbhgDIAEoBRIMCgRib2R5GAQgASgJEh4KBXJ1bGVzGAUgAygLMg8ueW9ya2llLnYxLlJ1bGUSLgoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiUAoMVHJlZU5vZGVSdWxlEhEKCW5vZGVfdHlwZRgBIAEoCRIPCgdjb250ZW50GAIgASgJEg0KBW1hcmtzGAMgASgJEg0KBWdyb3VwGAQgASgJIk8KBFJ1bGUSDAoEcGF0aBgBIAEoCRIMCgR0eXBlGAIgASgJEisKCnRyZWVfbm9kZXMYAyADKAsyFy55b3JraWUudjEuVHJlZU5vZGVSdWxlIoMBCg9SZXZpc2lvblN1bW1hcnkSCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEAoIc25hcHNob3QYBCABKAkSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAqYwoLUmVzdG9yZU1vZGUSHAoYUkVTVE9SRV9NT0RFX1VOU1BFQ0lGSUVEEAASGAoUUkVTVE9SRV9NT0RFX1JFU1RPUkUQARIcChhSRVNUT1JFX01PREVfUkVUT01CU1RPTkUQAir8AgoJVmFsdWVUeXBlEhMKD1ZBTFVFX1RZUEVfTlVMTBAAEhYKElZBTFVFX1RZUEVfQk9PTEVBThABEhYKElZBTFVFX1RZUEVfSU5URUdFUhACEhMKD1ZBTFVFX1RZUEVfTE9ORxADEhUKEVZBTFVFX1RZUEVfRE9VQkxFEAQSFQoRVkFMVUVfVFlQRV9TVFJJTkcQBRIUChBWQUxVRV9UWVBFX0JZVEVTEAYSEwoPVkFMVUVfVFlQRV9EQVRFEAcSGgoWVkFMVUVfVFlQRV9KU09OX09CSkVDVBAIEhkKFVZBTFVFX1RZUEVfSlNPTl9BUlJBWRAJEhMKD1ZBTFVFX1RZUEVfVEVYVBAKEhoKFlZBTFVFX1RZUEVfSU5URUdFUl9DTlQQCxIXChNWQUxVRV9UWVBFX0xPTkdfQ05UEAwSEwoPVkFMVUVfVFlQRV9UUkVFEA0SIAocVkFMVUVfVFlQRV9JTlRFR0VSX0RFRFVQX0NOVBAOIgQIDxAPKqYBCgxEb2NFdmVudFR5cGUSIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfQ0hBTkdFRBAAEiMKH0RPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1dBVENIRUQQARIlCiFET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9VTldBVENIRUQQAhIlCiFET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9CUk9BRENBU1QQA0JFChFkZXYueW9ya2llLmFwaS52MVABWi5naXRodWIuY29tL3lvcmtpZS10ZWFtL3lvcmtpZS9hcGkveW9ya2llL3YxO3YxYgZwcm90bzM", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
5796
5796
  const SnapshotSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 0);
5797
5797
  const ChangePackSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 1);
5798
5798
  const ChangeSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 2);
@@ -5837,13 +5837,20 @@
5837
5837
  const PresenceSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 24);
5838
5838
  const CheckpointSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 26);
5839
5839
  const TextNodePosSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 27);
5840
- const TimeTicketSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 28);
5840
+ const RestoreSpanSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 28);
5841
+ const TimeTicketSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 29);
5841
5842
  var ChannelEvent_Type = /* @__PURE__ */ ((ChannelEvent_Type2) => {
5842
5843
  ChannelEvent_Type2[ChannelEvent_Type2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
5843
5844
  ChannelEvent_Type2[ChannelEvent_Type2["PRESENCE"] = 1] = "PRESENCE";
5844
5845
  ChannelEvent_Type2[ChannelEvent_Type2["BROADCAST"] = 2] = "BROADCAST";
5845
5846
  return ChannelEvent_Type2;
5846
5847
  })(ChannelEvent_Type || {});
5848
+ var RestoreMode = /* @__PURE__ */ ((RestoreMode2) => {
5849
+ RestoreMode2[RestoreMode2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
5850
+ RestoreMode2[RestoreMode2["RESTORE"] = 1] = "RESTORE";
5851
+ RestoreMode2[RestoreMode2["RETOMBSTONE"] = 2] = "RETOMBSTONE";
5852
+ return RestoreMode2;
5853
+ })(RestoreMode || {});
5847
5854
  var ValueType = /* @__PURE__ */ ((ValueType2) => {
5848
5855
  ValueType2[ValueType2["NULL"] = 0] = "NULL";
5849
5856
  ValueType2[ValueType2["BOOLEAN"] = 1] = "BOOLEAN";
@@ -9688,10 +9695,20 @@
9688
9695
  head;
9689
9696
  treeByIndex;
9690
9697
  treeByID;
9698
+ /**
9699
+ * `pendingGCPairs` buffers GC pairs for nodes that were created
9700
+ * already-tombstoned by splitting a removed node. Such pieces inherit
9701
+ * `removedAt` without ever passing through `remove()`, so they would
9702
+ * otherwise never be registered for GC. Callers that split nodes
9703
+ * (`edit`, `CRDTText.setStyle`, `CRDTText.removeStyle`) drain this
9704
+ * buffer into their returned GC pairs.
9705
+ */
9706
+ pendingGCPairs;
9691
9707
  constructor() {
9692
9708
  this.head = RGATreeSplitNode.create(InitialRGATreeSplitNodeID);
9693
9709
  this.treeByIndex = new SplayTree();
9694
9710
  this.treeByID = new LLRBTree(RGATreeSplitNode.createComparator());
9711
+ this.pendingGCPairs = [];
9695
9712
  this.treeByIndex.insert(this.head);
9696
9713
  this.treeByID.put(this.head.getID(), this.head);
9697
9714
  }
@@ -9724,7 +9741,7 @@
9724
9741
  );
9725
9742
  addDataSizes(diff, diffTo, diffFrom);
9726
9743
  const nodesToDelete = this.findBetween(fromRight, toRight);
9727
- const [changes, removedNodes] = this.deleteNodes(
9744
+ const [changes, removedNodes, alreadyRemovedIDs] = this.deleteNodes(
9728
9745
  nodesToDelete,
9729
9746
  editedAt,
9730
9747
  versionVector
@@ -9755,11 +9772,285 @@
9755
9772
  }
9756
9773
  const pairs = [];
9757
9774
  const removedValues = [];
9758
- for (const [, removedNode] of removedNodes) {
9759
- pairs.push({ parent: this, child: removedNode });
9775
+ const removedSpans = [];
9776
+ for (const [id, removedNode] of removedNodes) {
9777
+ if (!alreadyRemovedIDs.has(id)) {
9778
+ pairs.push({ parent: this, child: removedNode });
9779
+ }
9760
9780
  removedValues.push(removedNode.getValue());
9781
+ removedSpans.push({
9782
+ createdAt: removedNode.getCreatedAt(),
9783
+ start: removedNode.getID().getOffset(),
9784
+ end: removedNode.getID().getOffset() + removedNode.getContentLength(),
9785
+ value: removedNode.getValue().substring(0)
9786
+ });
9787
+ }
9788
+ pairs.push(...this.drainPendingGCPairs());
9789
+ return [caretPos, pairs, diff, changes, removedValues, removedSpans];
9790
+ }
9791
+ /**
9792
+ * `restore` re-establishes the characters described by `spans` under
9793
+ * their ORIGINAL identities. For each span, per overlapping region:
9794
+ * - live piece exists → skip (idempotent; another undo restored it)
9795
+ * - tombstoned piece exists → clear removedAt (un-tombstone)
9796
+ * - no piece exists (GC'd) → recreate a node with the original ID
9797
+ *
9798
+ * Returns [untombstonedNodes, recreatedNodes, changes, liveDiff,
9799
+ * pendingGCPairs]. `changes` describes the revived content as insertions
9800
+ * (ascending index) so editor bindings and remote sync can be driven
9801
+ * the same way as a normal edit.
9802
+ *
9803
+ * The caller must, in order: (1) register every pair in `pendingGCPairs`
9804
+ * — these are fragments `splitNode` buffered while isolating a target
9805
+ * range out of a larger tombstoned piece (see `drainPendingGCPairs`);
9806
+ * (2) unregister GC pairs for `untombstonedNodes`. Registering first is
9807
+ * required for `untombstonedNodes` entries whose node was itself one of
9808
+ * those split-born fragments (a target isolated from the interior of a
9809
+ * tombstone) — such a node was never registered under its own id, so
9810
+ * step (1) creates the entry that step (2) then correctly walks from gc
9811
+ * back to live; entries that remain tombstoned (siblings of the
9812
+ * restored target) simply stay registered. Finally, `root.acc(liveDiff)`
9813
+ * accounts the size of any nodes recreated from scratch (the GC'd-away
9814
+ * case), which `splitNode`'s buffering does not cover.
9815
+ */
9816
+ restore(spans, executedAt, fallbackAnchor) {
9817
+ const untombstoned = [];
9818
+ const recreated = [];
9819
+ const liveDiff = { data: 0, meta: 0 };
9820
+ for (const span of spans) {
9821
+ const pieces = this.findPiecesOverlapping(
9822
+ span.createdAt,
9823
+ span.start,
9824
+ span.end
9825
+ );
9826
+ let cursor = span.start;
9827
+ let pieceIdx = 0;
9828
+ while (cursor < span.end) {
9829
+ const piece = pieces[pieceIdx];
9830
+ const pieceStart = piece ? piece.getID().getOffset() : Infinity;
9831
+ const pieceEnd = piece ? pieceStart + piece.getContentLength() : Infinity;
9832
+ if (piece && pieceStart <= cursor) {
9833
+ const overlapEnd = Math.min(pieceEnd, span.end);
9834
+ if (piece.isRemoved()) {
9835
+ const [target] = this.isolateRange(piece, cursor, overlapEnd);
9836
+ target.setRemovedAt(void 0);
9837
+ this.treeByIndex.splayNode(target);
9838
+ untombstoned.push(target);
9839
+ }
9840
+ cursor = overlapEnd;
9841
+ if (overlapEnd >= pieceEnd) {
9842
+ pieceIdx++;
9843
+ }
9844
+ } else {
9845
+ const gapEnd = Math.min(pieceStart, span.end);
9846
+ const value = span.value.substring(
9847
+ cursor - span.start,
9848
+ gapEnd - span.start
9849
+ );
9850
+ const newNode = RGATreeSplitNode.create(
9851
+ RGATreeSplitNodeID.of(span.createdAt, cursor),
9852
+ value
9853
+ );
9854
+ addDataSizes(liveDiff, newNode.getDataSize());
9855
+ const prev = this.findRestoreAnchor(
9856
+ span.createdAt,
9857
+ cursor,
9858
+ gapEnd,
9859
+ executedAt,
9860
+ fallbackAnchor
9861
+ );
9862
+ this.insertAfter(prev, newNode);
9863
+ recreated.push(newNode);
9864
+ cursor = gapEnd;
9865
+ }
9866
+ }
9867
+ }
9868
+ const pendingGCPairs = this.drainPendingGCPairs();
9869
+ const changes = [];
9870
+ for (const node of [...untombstoned, ...recreated]) {
9871
+ const [from] = this.findIndexesFromRange(node.createPosRange());
9872
+ changes.push({
9873
+ actor: executedAt.getActorID(),
9874
+ from,
9875
+ to: from,
9876
+ value: node.getValue()
9877
+ });
9878
+ }
9879
+ changes.sort((a, b) => a.from - b.from);
9880
+ return [untombstoned, recreated, changes, liveDiff, pendingGCPairs];
9881
+ }
9882
+ /**
9883
+ * `retombstone` re-deletes the characters described by `spans` (redo of
9884
+ * an identity-preserving undo). Only live pieces are affected; already
9885
+ * removed or purged regions are skipped (idempotent).
9886
+ *
9887
+ * Returns [pairs, changes, diff]: GCPairs for the newly tombstoned
9888
+ * nodes, the removed regions as deletions so editor bindings and remote
9889
+ * sync can be driven the same way as a normal edit, and the
9890
+ * metadata-size overhead from splitting the (live) pieces to isolate the
9891
+ * target range. The caller must `root.acc(diff)` before registering
9892
+ * `pairs`, mirroring how a normal edit's boundary splits are accounted
9893
+ * before its resulting tombstones are registered. Indices are captured
9894
+ * before each removal, so applying them in emission order stays
9895
+ * consistent.
9896
+ */
9897
+ retombstone(spans, executedAt) {
9898
+ const pairs = [];
9899
+ const changes = [];
9900
+ const diff = { data: 0, meta: 0 };
9901
+ for (const span of spans) {
9902
+ const pieces = this.findPiecesOverlapping(
9903
+ span.createdAt,
9904
+ span.start,
9905
+ span.end
9906
+ );
9907
+ for (const piece of pieces) {
9908
+ if (piece.isRemoved()) {
9909
+ continue;
9910
+ }
9911
+ const pieceStart = piece.getID().getOffset();
9912
+ const pieceEnd = pieceStart + piece.getContentLength();
9913
+ const [target, splitDiff] = this.isolateRange(
9914
+ piece,
9915
+ Math.max(pieceStart, span.start),
9916
+ Math.min(pieceEnd, span.end)
9917
+ );
9918
+ addDataSizes(diff, splitDiff);
9919
+ const [from, to] = this.findIndexesFromRange(target.createPosRange());
9920
+ target.remove(executedAt);
9921
+ this.treeByIndex.splayNode(target);
9922
+ pairs.push({ parent: this, child: target });
9923
+ if (from < to) {
9924
+ changes.push({ actor: executedAt.getActorID(), from, to });
9925
+ }
9926
+ }
9761
9927
  }
9762
- return [caretPos, pairs, diff, changes, removedValues];
9928
+ pairs.push(...this.drainPendingGCPairs());
9929
+ return [pairs, changes, diff];
9930
+ }
9931
+ /**
9932
+ * `findPiecesOverlapping` collects existing nodes (live or tombstoned)
9933
+ * belonging to the insertion `createdAt` that overlap the absolute-offset
9934
+ * interval [start, end), in ascending offset order. Works by descending
9935
+ * floorEntry probes over treeByID.
9936
+ */
9937
+ findPiecesOverlapping(createdAt, start, end) {
9938
+ const pieces = [];
9939
+ let probe = end - 1;
9940
+ while (probe >= 0) {
9941
+ const key = RGATreeSplitNodeID.of(createdAt, probe);
9942
+ const entry = this.treeByID.floorEntry(key);
9943
+ if (!entry || !entry.key.hasSameCreatedAt(key)) {
9944
+ break;
9945
+ }
9946
+ const node = entry.value;
9947
+ const nodeStart = node.getID().getOffset();
9948
+ const nodeEnd = nodeStart + node.getContentLength();
9949
+ if (nodeEnd <= start) {
9950
+ break;
9951
+ }
9952
+ if (nodeStart < end && nodeEnd > start) {
9953
+ pieces.push(node);
9954
+ }
9955
+ if (nodeStart <= start) {
9956
+ break;
9957
+ }
9958
+ probe = nodeStart - 1;
9959
+ }
9960
+ return pieces.reverse();
9961
+ }
9962
+ /**
9963
+ * `findPieceCovering` returns the node of insertion `createdAt` whose
9964
+ * absolute-offset range covers `offset`, if present.
9965
+ */
9966
+ findPieceCovering(createdAt, offset) {
9967
+ const key = RGATreeSplitNodeID.of(createdAt, offset);
9968
+ const entry = this.treeByID.floorEntry(key);
9969
+ if (!entry || !entry.key.hasSameCreatedAt(key)) {
9970
+ return;
9971
+ }
9972
+ const node = entry.value;
9973
+ const nodeStart = node.getID().getOffset();
9974
+ const nodeEnd = nodeStart + node.getContentLength();
9975
+ if (nodeStart <= offset && offset < nodeEnd) {
9976
+ return node;
9977
+ }
9978
+ return;
9979
+ }
9980
+ /**
9981
+ * `findRestoreAnchor` returns the physical node to insert a recreated
9982
+ * fragment [gapStart, gapEnd) of insertion `createdAt` AFTER.
9983
+ *
9984
+ * Resolution ladder (all rules key on op-carried data + ID lookups only):
9985
+ * (a) a piece covering gapEnd exists → directly before it
9986
+ * (originally-adjacent successor; exact original slot)
9987
+ * (b) nearest surviving piece of the same insertion left of gapStart
9988
+ * → directly after it
9989
+ * (c) rightmost surviving piece of the same insertion (must be right
9990
+ * of the gap) → directly before it
9991
+ * (d) the operation's fallback anchor (refined) — same exposure as the
9992
+ * current implementation's fromPos; see design-doc caveat
9993
+ * (e) head (deterministic last resort)
9994
+ */
9995
+ findRestoreAnchor(createdAt, gapStart, gapEnd, executedAt, fallbackAnchor) {
9996
+ const succ = this.findPieceCovering(createdAt, gapEnd);
9997
+ if (succ) {
9998
+ return succ.getPrev();
9999
+ }
10000
+ if (gapStart > 0) {
10001
+ const key = RGATreeSplitNodeID.of(createdAt, gapStart - 1);
10002
+ const entry = this.treeByID.floorEntry(key);
10003
+ if (entry && entry.key.hasSameCreatedAt(key)) {
10004
+ return entry.value;
10005
+ }
10006
+ }
10007
+ const rightmostKey = RGATreeSplitNodeID.of(
10008
+ createdAt,
10009
+ Number.MAX_SAFE_INTEGER
10010
+ );
10011
+ const rightmost = this.treeByID.floorEntry(rightmostKey);
10012
+ if (rightmost && rightmost.key.hasSameCreatedAt(rightmostKey) && rightmost.value.getID().getOffset() >= gapEnd) {
10013
+ return rightmost.value.getPrev();
10014
+ }
10015
+ if (fallbackAnchor) {
10016
+ try {
10017
+ const refined = this.refinePos(fallbackAnchor);
10018
+ const [left] = this.findNodeWithSplit(refined, executedAt);
10019
+ return left;
10020
+ } catch {
10021
+ }
10022
+ }
10023
+ return this.head;
10024
+ }
10025
+ /**
10026
+ * `isolateRange` splits `piece` so that a node exactly covering the
10027
+ * absolute-offset interval [from, to) exists, and returns it along with
10028
+ * the net metadata-size overhead the split(s) introduced.
10029
+ *
10030
+ * When `piece` is live, this overhead is a normal live-bucket cost (same
10031
+ * as any other boundary split) and the caller should `root.acc` it.
10032
+ * When `piece` is tombstoned, `splitNode` itself buffers the overhead of
10033
+ * any born-removed fragment via `pendingGCPairs` (see `drainPendingGCPairs`),
10034
+ * so the returned diff is zero in that case — the caller must still
10035
+ * drain and register those pairs.
10036
+ *
10037
+ * Requires: pieceStart <= from < to <= pieceEnd.
10038
+ */
10039
+ isolateRange(piece, from, to) {
10040
+ const diff = { data: 0, meta: 0 };
10041
+ let node = piece;
10042
+ const nodeStart = node.getID().getOffset();
10043
+ if (from > nodeStart) {
10044
+ const [right, splitDiff] = this.splitNode(node, from - nodeStart);
10045
+ addDataSizes(diff, splitDiff);
10046
+ node = right;
10047
+ }
10048
+ const newStart = node.getID().getOffset();
10049
+ if (to < newStart + node.getContentLength()) {
10050
+ const [, splitDiff] = this.splitNode(node, to - newStart);
10051
+ addDataSizes(diff, splitDiff);
10052
+ }
10053
+ return [node, diff];
9763
10054
  }
9764
10055
  /**
9765
10056
  * `indexToPos` finds RGATreeSplitPos of given offset.
@@ -10029,11 +10320,28 @@
10029
10320
  splitNode.setInsPrev(node);
10030
10321
  addDataSizes(diff, node.getDataSize(), splitNode.getDataSize());
10031
10322
  subDataSize(diff, prvSize);
10323
+ if (splitNode.isRemoved()) {
10324
+ this.pendingGCPairs.push({
10325
+ parent: this,
10326
+ child: splitNode,
10327
+ gcOnlySize: diff
10328
+ });
10329
+ return [splitNode, { data: 0, meta: 0 }];
10330
+ }
10032
10331
  return [splitNode, diff];
10033
10332
  }
10333
+ /**
10334
+ * `drainPendingGCPairs` returns the GC pairs buffered for born-tombstoned
10335
+ * split pieces and clears the buffer.
10336
+ */
10337
+ drainPendingGCPairs() {
10338
+ const pairs = this.pendingGCPairs;
10339
+ this.pendingGCPairs = [];
10340
+ return pairs;
10341
+ }
10034
10342
  deleteNodes(candidates, editedAt, vector) {
10035
10343
  if (!candidates.length) {
10036
- return [[], /* @__PURE__ */ new Map()];
10344
+ return [[], /* @__PURE__ */ new Map(), /* @__PURE__ */ new Set()];
10037
10345
  }
10038
10346
  const isLocal = vector === void 0 || vector.size() === 0;
10039
10347
  const nodesToRemove = [];
@@ -10068,12 +10376,17 @@
10068
10376
  nodesToKeep.push(rightEdge);
10069
10377
  const changes = this.makeChanges(nodesToKeep, editedAt);
10070
10378
  const removedNodes = /* @__PURE__ */ new Map();
10379
+ const alreadyRemovedIDs = /* @__PURE__ */ new Set();
10071
10380
  for (const node of nodesToRemove) {
10072
- removedNodes.set(node.getID().toIDString(), node);
10381
+ const id = node.getID().toIDString();
10382
+ if (node.isRemoved()) {
10383
+ alreadyRemovedIDs.add(id);
10384
+ }
10385
+ removedNodes.set(id, node);
10073
10386
  node.remove(editedAt);
10074
10387
  }
10075
10388
  this.deleteIndexNodes(nodesToKeep);
10076
- return [changes, removedNodes];
10389
+ return [changes, removedNodes, alreadyRemovedIDs];
10077
10390
  }
10078
10391
  /**
10079
10392
  * `findEdgesOfCandidates` finds the edges outside `candidates`,
@@ -10545,7 +10858,7 @@
10545
10858
  crdtTextValue.setAttr(k, v, editedAt);
10546
10859
  }
10547
10860
  }
10548
- const [caretPos, pairs, diff, valueChanges, removedValues] = this.rgaTreeSplit.edit(range, editedAt, crdtTextValue, versionVector);
10861
+ const [caretPos, pairs, diff, valueChanges, removedValues, removedSpans] = this.rgaTreeSplit.edit(range, editedAt, crdtTextValue, versionVector);
10549
10862
  const changes = valueChanges.map((change) => ({
10550
10863
  ...change,
10551
10864
  value: change.value ? {
@@ -10558,7 +10871,56 @@
10558
10871
  type: "content"
10559
10872
  /* Content */
10560
10873
  }));
10561
- return [changes, pairs, diff, [caretPos, caretPos], removedValues];
10874
+ return [
10875
+ changes,
10876
+ pairs,
10877
+ diff,
10878
+ [caretPos, caretPos],
10879
+ removedValues,
10880
+ removedSpans
10881
+ ];
10882
+ }
10883
+ /**
10884
+ * `restore` re-establishes removed characters under their original
10885
+ * identities (identity-preserving undo of a deletion).
10886
+ */
10887
+ restore(spans, executedAt, fallbackAnchor) {
10888
+ const [untombstoned, recreated, valueChanges, liveDiff, pendingGCPairs] = this.rgaTreeSplit.restore(spans, executedAt, fallbackAnchor);
10889
+ return [
10890
+ untombstoned,
10891
+ recreated,
10892
+ this.toTextChanges(valueChanges),
10893
+ liveDiff,
10894
+ pendingGCPairs
10895
+ ];
10896
+ }
10897
+ /**
10898
+ * `retombstone` re-deletes previously restored characters (redo).
10899
+ */
10900
+ retombstone(spans, executedAt) {
10901
+ const [pairs, valueChanges, diff] = this.rgaTreeSplit.retombstone(
10902
+ spans,
10903
+ executedAt
10904
+ );
10905
+ return [pairs, this.toTextChanges(valueChanges), diff];
10906
+ }
10907
+ /**
10908
+ * `toTextChanges` wraps raw RGATreeSplit value changes into `TextChange`s,
10909
+ * mirroring the mapping used by `edit`.
10910
+ */
10911
+ toTextChanges(valueChanges) {
10912
+ return valueChanges.map((change) => ({
10913
+ ...change,
10914
+ value: change.value ? {
10915
+ attributes: parseObjectValues(change.value.getAttributes()),
10916
+ content: change.value.getContent()
10917
+ } : {
10918
+ attributes: void 0,
10919
+ content: ""
10920
+ },
10921
+ type: "content"
10922
+ /* Content */
10923
+ }));
10562
10924
  }
10563
10925
  /**
10564
10926
  * `setStyle` applies the style of the given range.
@@ -10635,6 +10997,7 @@
10635
10997
  }
10636
10998
  }
10637
10999
  }
11000
+ pairs.push(...this.rgaTreeSplit.drainPendingGCPairs());
10638
11001
  return [pairs, diff, changes, prevAttributes, attributesToRemove];
10639
11002
  }
10640
11003
  /**
@@ -10705,6 +11068,7 @@
10705
11068
  }
10706
11069
  }
10707
11070
  }
11071
+ pairs.push(...this.rgaTreeSplit.drainPendingGCPairs());
10708
11072
  return [pairs, diff, changes, prevAttributes];
10709
11073
  }
10710
11074
  /**
@@ -10859,10 +11223,16 @@
10859
11223
  const pairs = [];
10860
11224
  for (const node of this.rgaTreeSplit) {
10861
11225
  if (node.getRemovedAt()) {
10862
- pairs.push({ parent: this.rgaTreeSplit, child: node });
11226
+ pairs.push({
11227
+ parent: this.rgaTreeSplit,
11228
+ child: node,
11229
+ gcOnlySize: node.getDataSize()
11230
+ });
10863
11231
  }
10864
11232
  for (const p of node.getValue().getGCPairs()) {
10865
- pairs.push(p);
11233
+ pairs.push(
11234
+ node.getRemovedAt() ? { ...p, gcOnlySize: p.child.getDataSize() } : p
11235
+ );
10866
11236
  }
10867
11237
  }
10868
11238
  return pairs;
@@ -10874,18 +11244,33 @@
10874
11244
  content;
10875
11245
  attributes;
10876
11246
  isUndoOp;
10877
- constructor(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp) {
11247
+ restoreSpans;
11248
+ restoreMode;
11249
+ // `retombstoneSpans` is the companion span set for an identity-preserving
11250
+ // reverse op. `restoreSpans` describes content the reversed edit removed;
11251
+ // `retombstoneSpans` describes content the reversed edit inserted (non-empty
11252
+ // only for the reverse of a replace). `restoreMode` picks the direction:
11253
+ // 'restore' revives restoreSpans and re-removes retombstoneSpans; a
11254
+ // 'retombstone' op (the redo) does the opposite. Reversing an edit that both
11255
+ // inserts and deletes as two identity operations — rather than
11256
+ // copy-reinserting the deleted text as a fresh node — keeps a later revived
11257
+ // neighbour in its original relative order.
11258
+ retombstoneSpans;
11259
+ constructor(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp, restoreSpans, restoreMode, retombstoneSpans) {
10878
11260
  super(parentCreatedAt, executedAt);
10879
11261
  this.fromPos = fromPos;
10880
11262
  this.toPos = toPos;
10881
11263
  this.content = content;
10882
11264
  this.attributes = attributes;
10883
11265
  this.isUndoOp = isUndoOp;
11266
+ this.restoreSpans = restoreSpans;
11267
+ this.restoreMode = restoreMode;
11268
+ this.retombstoneSpans = retombstoneSpans;
10884
11269
  }
10885
11270
  /**
10886
11271
  * `create` creates a new instance of EditOperation.
10887
11272
  */
10888
- static create(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp) {
11273
+ static create(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp, restoreSpans, restoreMode, retombstoneSpans) {
10889
11274
  return new EditOperation(
10890
11275
  parentCreatedAt,
10891
11276
  fromPos,
@@ -10893,7 +11278,10 @@
10893
11278
  content,
10894
11279
  attributes,
10895
11280
  executedAt,
10896
- isUndoOp
11281
+ isUndoOp,
11282
+ restoreSpans,
11283
+ restoreMode,
11284
+ retombstoneSpans
10897
11285
  );
10898
11286
  }
10899
11287
  /**
@@ -10914,11 +11302,71 @@
10914
11302
  );
10915
11303
  }
10916
11304
  const text = parentObject;
11305
+ if (this.restoreSpans || this.retombstoneSpans) {
11306
+ const isRetombstone = this.restoreMode === "retombstone";
11307
+ const toRestore = (isRetombstone ? this.retombstoneSpans : this.restoreSpans) ?? [];
11308
+ const toRetombstone = (isRetombstone ? this.restoreSpans : this.retombstoneSpans) ?? [];
11309
+ const opInfos = [];
11310
+ const totalDiff = { data: 0, meta: 0 };
11311
+ const toOpInfo = (c) => ({
11312
+ type: "edit",
11313
+ from: c.from,
11314
+ to: c.to,
11315
+ value: c.value,
11316
+ path: root.createPath(this.getParentCreatedAt())
11317
+ });
11318
+ if (toRetombstone.length) {
11319
+ const [pairs2, changes2, diff2] = text.retombstone(
11320
+ toRetombstone,
11321
+ this.getExecutedAt()
11322
+ );
11323
+ addDataSizes(totalDiff, diff2);
11324
+ for (const pair of pairs2) {
11325
+ root.registerGCPair(pair);
11326
+ }
11327
+ for (const c of changes2) {
11328
+ opInfos.push(toOpInfo(c));
11329
+ }
11330
+ }
11331
+ if (toRestore.length) {
11332
+ const [untombstoned, , changes2, liveDiff, pendingGCPairs] = text.restore(toRestore, this.getExecutedAt(), this.fromPos);
11333
+ for (const pair of pendingGCPairs) {
11334
+ root.registerGCPair(pair);
11335
+ }
11336
+ for (const node of untombstoned) {
11337
+ root.unregisterGCPair({
11338
+ parent: text.getRGATreeSplit(),
11339
+ child: node
11340
+ });
11341
+ }
11342
+ addDataSizes(totalDiff, liveDiff);
11343
+ for (const c of changes2) {
11344
+ opInfos.push(toOpInfo(c));
11345
+ }
11346
+ }
11347
+ root.acc(totalDiff);
11348
+ return {
11349
+ opInfos,
11350
+ // Reverse keeps the same span sets and flips the direction.
11351
+ reverseOp: EditOperation.create(
11352
+ this.getParentCreatedAt(),
11353
+ this.fromPos,
11354
+ this.toPos,
11355
+ "",
11356
+ /* @__PURE__ */ new Map(),
11357
+ void 0,
11358
+ true,
11359
+ this.restoreSpans,
11360
+ isRetombstone ? "restore" : "retombstone",
11361
+ this.retombstoneSpans
11362
+ )
11363
+ };
11364
+ }
10917
11365
  if (this.isUndoOp) {
10918
11366
  this.fromPos = text.refinePos(this.fromPos);
10919
11367
  this.toPos = text.refinePos(this.toPos);
10920
11368
  }
10921
- const [changes, pairs, diff, , removedValues] = text.edit(
11369
+ const [changes, pairs, diff, , removedValues, removedSpans] = text.edit(
10922
11370
  [this.fromPos, this.toPos],
10923
11371
  this.content,
10924
11372
  this.getExecutedAt(),
@@ -10927,7 +11375,8 @@
10927
11375
  );
10928
11376
  const reverseOp = this.toReverseOperation(
10929
11377
  removedValues,
10930
- text.normalizePos(this.fromPos)
11378
+ text.normalizePos(this.fromPos),
11379
+ removedSpans
10931
11380
  );
10932
11381
  root.acc(diff);
10933
11382
  for (const pair of pairs) {
@@ -10946,7 +11395,33 @@
10946
11395
  reverseOp
10947
11396
  };
10948
11397
  }
10949
- toReverseOperation(removedValues, fromPos) {
11398
+ toReverseOperation(removedValues, fromPos, removedSpans) {
11399
+ if (removedSpans.length || this.content?.length) {
11400
+ let insertedSpans;
11401
+ if (this.content?.length) {
11402
+ const value = CRDTTextValue.create(this.content);
11403
+ insertedSpans = [
11404
+ {
11405
+ createdAt: this.getExecutedAt(),
11406
+ start: 0,
11407
+ end: value.length,
11408
+ value
11409
+ }
11410
+ ];
11411
+ }
11412
+ return EditOperation.create(
11413
+ this.getParentCreatedAt(),
11414
+ fromPos,
11415
+ fromPos,
11416
+ "",
11417
+ /* @__PURE__ */ new Map(),
11418
+ void 0,
11419
+ true,
11420
+ removedSpans.length ? removedSpans : void 0,
11421
+ "restore",
11422
+ insertedSpans
11423
+ );
11424
+ }
10950
11425
  const content = removedValues?.length ? removedValues.map((v) => v.getContent()).join("") : "";
10951
11426
  let attrs;
10952
11427
  if (removedValues.length === 1) {
@@ -11084,6 +11559,26 @@
11084
11559
  getAttributes() {
11085
11560
  return this.attributes || /* @__PURE__ */ new Map();
11086
11561
  }
11562
+ /**
11563
+ * `getRestoreSpans` returns the identity-preserving restore payload, if
11564
+ * this is a restore/retombstone operation.
11565
+ */
11566
+ getRestoreSpans() {
11567
+ return this.restoreSpans;
11568
+ }
11569
+ /**
11570
+ * `getRestoreMode` returns the identity-preserving mode of this Edit.
11571
+ */
11572
+ getRestoreMode() {
11573
+ return this.restoreMode;
11574
+ }
11575
+ /**
11576
+ * `getRetombstoneSpans` returns the companion span set (content the reversed
11577
+ * edit inserted) for an identity-preserving reverse op, if any.
11578
+ */
11579
+ getRetombstoneSpans() {
11580
+ return this.retombstoneSpans;
11581
+ }
11087
11582
  }
11088
11583
  class StyleOperation extends Operation {
11089
11584
  fromPos;
@@ -12384,6 +12879,10 @@
12384
12879
  }
12385
12880
  this.insNextID = split.id;
12386
12881
  tree.registerNode(split);
12882
+ if (split.removedAt) {
12883
+ tree.registerPendingGCPair(split, diff);
12884
+ return [split, { data: 0, meta: 0 }];
12885
+ }
12387
12886
  }
12388
12887
  return [split, diff];
12389
12888
  }
@@ -12481,7 +12980,11 @@
12481
12980
  }
12482
12981
  for (const node of this.attrs) {
12483
12982
  if (node.getRemovedAt()) {
12484
- pairs.push({ parent: this, child: node });
12983
+ pairs.push({
12984
+ parent: this,
12985
+ child: node,
12986
+ gcOnlySize: node.getDataSize()
12987
+ });
12485
12988
  }
12486
12989
  }
12487
12990
  return pairs;
@@ -12548,10 +13051,19 @@
12548
13051
  class CRDTTree extends CRDTElement {
12549
13052
  indexTree;
12550
13053
  nodeMapByID;
13054
+ /**
13055
+ * `pendingGCPairs` buffers GC pairs for nodes that were created
13056
+ * already-tombstoned by splitting a removed node. Such pieces inherit
13057
+ * `removedAt` without ever passing through `remove()`, so they would
13058
+ * otherwise never be registered for GC. `edit` and `style` drain this
13059
+ * buffer into their returned GC pairs.
13060
+ */
13061
+ pendingGCPairs;
12551
13062
  constructor(root, createdAt) {
12552
13063
  super(createdAt);
12553
13064
  this.indexTree = new IndexTree(root);
12554
13065
  this.nodeMapByID = new LLRBTree(CRDTTreeNodeID.createComparator());
13066
+ this.pendingGCPairs = [];
12555
13067
  this.indexTree.traverseAll((node) => {
12556
13068
  this.nodeMapByID.put(node.id, node);
12557
13069
  });
@@ -12653,6 +13165,25 @@
12653
13165
  registerNode(node) {
12654
13166
  this.nodeMapByID.put(node.id, node);
12655
13167
  }
13168
+ /**
13169
+ * `registerPendingGCPair` buffers a GC pair for a node that was born
13170
+ * tombstoned (split off an already-removed node). The pair is picked up
13171
+ * by the next `edit` or `style` call via `drainPendingGCPairs`. `size`
13172
+ * is the net-new size created by the split; it is accounted to
13173
+ * docSize.gc at registration since the node was never live.
13174
+ */
13175
+ registerPendingGCPair(node, size) {
13176
+ this.pendingGCPairs.push({ parent: this, child: node, gcOnlySize: size });
13177
+ }
13178
+ /**
13179
+ * `drainPendingGCPairs` returns the buffered GC pairs and clears the
13180
+ * buffer.
13181
+ */
13182
+ drainPendingGCPairs() {
13183
+ const pairs = this.pendingGCPairs;
13184
+ this.pendingGCPairs = [];
13185
+ return pairs;
13186
+ }
12656
13187
  /**
12657
13188
  * `findNodesAndSplitText` finds `TreePos` of the given `CRDTTreeNodeID` and
12658
13189
  * splits nodes if the position is in the middle of a text node.
@@ -12839,6 +13370,7 @@
12839
13370
  }
12840
13371
  }
12841
13372
  );
13373
+ pairs.push(...this.drainPendingGCPairs());
12842
13374
  return [pairs, changes, diff, prevAttributes, newAttrKeys];
12843
13375
  }
12844
13376
  /**
@@ -12942,6 +13474,7 @@
12942
13474
  }
12943
13475
  }
12944
13476
  );
13477
+ pairs.push(...this.drainPendingGCPairs());
12945
13478
  return [pairs, changes, diff, prevAttributes];
12946
13479
  }
12947
13480
  /**
@@ -13105,6 +13638,9 @@
13105
13638
  parent = left.parent;
13106
13639
  }
13107
13640
  }
13641
+ if (!parent.parent) {
13642
+ break;
13643
+ }
13108
13644
  parent.split(
13109
13645
  this,
13110
13646
  left !== parent ? parent.findOffset(left, true) + 1 : 0,
@@ -13164,6 +13700,7 @@
13164
13700
  }
13165
13701
  }
13166
13702
  }
13703
+ pairs.push(...this.drainPendingGCPairs());
13167
13704
  return [
13168
13705
  changes,
13169
13706
  pairs,
@@ -13228,9 +13765,13 @@
13228
13765
  */
13229
13766
  getGCPairs() {
13230
13767
  const pairs = [];
13231
- this.indexTree.traverse((node) => {
13768
+ this.indexTree.traverseAll((node) => {
13232
13769
  if (node.getRemovedAt()) {
13233
- pairs.push({ parent: this, child: node });
13770
+ pairs.push({
13771
+ parent: this,
13772
+ child: node,
13773
+ gcOnlySize: node.getDataSize()
13774
+ });
13234
13775
  }
13235
13776
  for (const p of node.getGCPairs()) {
13236
13777
  pairs.push(p);
@@ -15679,6 +16220,25 @@
15679
16220
  pbAttributes[key] = value;
15680
16221
  }
15681
16222
  pbEditOperation.executedAt = toTimeTicket(editOperation.getExecutedAt());
16223
+ const toPbSpan = (span) => {
16224
+ const pbSpan = create(RestoreSpanSchema);
16225
+ pbSpan.createdAt = toTimeTicket(span.createdAt);
16226
+ pbSpan.start = span.start;
16227
+ pbSpan.end = span.end;
16228
+ pbSpan.content = span.value.getContent();
16229
+ const pbSpanAttrs = pbSpan.attributes;
16230
+ for (const [key, value] of Object.entries(span.value.getAttributes())) {
16231
+ pbSpanAttrs[key] = value;
16232
+ }
16233
+ return pbSpan;
16234
+ };
16235
+ const restoreSpans = editOperation.getRestoreSpans();
16236
+ const retombstoneSpans = editOperation.getRetombstoneSpans();
16237
+ if (restoreSpans && restoreSpans.length || retombstoneSpans && retombstoneSpans.length) {
16238
+ pbEditOperation.restoreSpans = (restoreSpans ?? []).map(toPbSpan);
16239
+ pbEditOperation.retombstoneSpans = (retombstoneSpans ?? []).map(toPbSpan);
16240
+ pbEditOperation.restoreMode = editOperation.getRestoreMode() === "retombstone" ? RestoreMode.RETOMBSTONE : RestoreMode.RESTORE;
16241
+ }
15682
16242
  pbOperation.body.case = "edit";
15683
16243
  pbOperation.body.value = pbEditOperation;
15684
16244
  } else if (operation instanceof StyleOperation) {
@@ -16338,13 +16898,38 @@
16338
16898
  Object.entries(pbEditOperation.attributes).forEach(([key, value]) => {
16339
16899
  attributes.set(key, value);
16340
16900
  });
16901
+ const executedAt = fromTimeTicket(pbEditOperation.executedAt);
16902
+ const fromPbSpan = (pbSpan) => {
16903
+ const value = CRDTTextValue.create(pbSpan.content);
16904
+ for (const [key, attr] of Object.entries(pbSpan.attributes)) {
16905
+ value.setAttr(key, attr, executedAt);
16906
+ }
16907
+ return {
16908
+ createdAt: fromTimeTicket(pbSpan.createdAt),
16909
+ start: pbSpan.start,
16910
+ end: pbSpan.end,
16911
+ value
16912
+ };
16913
+ };
16914
+ let restoreSpans;
16915
+ let retombstoneSpans;
16916
+ let restoreMode;
16917
+ if (pbEditOperation.restoreSpans.length || pbEditOperation.retombstoneSpans.length) {
16918
+ restoreSpans = pbEditOperation.restoreSpans.map(fromPbSpan);
16919
+ retombstoneSpans = pbEditOperation.retombstoneSpans.map(fromPbSpan);
16920
+ restoreMode = pbEditOperation.restoreMode === RestoreMode.RETOMBSTONE ? "retombstone" : "restore";
16921
+ }
16341
16922
  return EditOperation.create(
16342
16923
  fromTimeTicket(pbEditOperation.parentCreatedAt),
16343
16924
  fromTextNodePos(pbEditOperation.from),
16344
16925
  fromTextNodePos(pbEditOperation.to),
16345
16926
  pbEditOperation.content,
16346
16927
  attributes,
16347
- fromTimeTicket(pbEditOperation.executedAt)
16928
+ executedAt,
16929
+ restoreMode ? true : void 0,
16930
+ restoreSpans,
16931
+ restoreMode,
16932
+ retombstoneSpans
16348
16933
  );
16349
16934
  } else if (pbOperation.body.case === "style") {
16350
16935
  const pbStyleOperation = pbOperation.body.value;
@@ -18980,7 +19565,9 @@
18980
19565
  CRDTTreePos.fromStruct(range[0]),
18981
19566
  CRDTTreePos.fromStruct(range[1])
18982
19567
  ];
18983
- return this.tree.posRangeToIndexRange(posRange);
19568
+ const indexRange = this.tree.posRangeToIndexRange(posRange);
19569
+ this.registerPendingGCPairs();
19570
+ return indexRange;
18984
19571
  }
18985
19572
  /**
18986
19573
  * `posRangeToPathRange` converts the position range into the path range.
@@ -18996,7 +19583,23 @@
18996
19583
  CRDTTreePos.fromStruct(range[0]),
18997
19584
  CRDTTreePos.fromStruct(range[1])
18998
19585
  ];
18999
- return this.tree.posRangeToPathRange(posRange);
19586
+ const pathRange = this.tree.posRangeToPathRange(posRange);
19587
+ this.registerPendingGCPairs();
19588
+ return pathRange;
19589
+ }
19590
+ /**
19591
+ * `registerPendingGCPairs` registers with the root any GC pairs the tree
19592
+ * buffered while resolving a position. `posRangeToIndexRange` and
19593
+ * `posRangeToPathRange` split text nodes to locate a position; when the
19594
+ * position lands inside a tombstoned node the split produces a
19595
+ * born-removed piece. Unlike edit/style/removeStyle, these read-path
19596
+ * conversions emit no operation, so the buffered pairs would otherwise
19597
+ * never reach the root and the piece would leak (invisible to GC).
19598
+ */
19599
+ registerPendingGCPairs() {
19600
+ for (const pair of this.tree.drainPendingGCPairs()) {
19601
+ this.context.registerGCPair(pair);
19602
+ }
19000
19603
  }
19001
19604
  }
19002
19605
  function createJSON(context, target) {
@@ -19239,6 +19842,10 @@
19239
19842
  return;
19240
19843
  }
19241
19844
  this.gcPairMap.set(pair.child.toIDString(), pair);
19845
+ if (pair.gcOnlySize) {
19846
+ addDataSizes(this.docSize.gc, pair.gcOnlySize);
19847
+ return;
19848
+ }
19242
19849
  const size = this.gcPairMap.get(pair.child.toIDString()).child.getDataSize();
19243
19850
  addDataSizes(this.docSize.gc, size);
19244
19851
  subDataSize(this.docSize.live, size);
@@ -19246,6 +19853,28 @@
19246
19853
  this.docSize.live.meta += TimeTicketSize;
19247
19854
  }
19248
19855
  }
19856
+ /**
19857
+ * `unregisterGCPair` removes the given pair from the hash table. Called
19858
+ * when a tombstoned node is revived (un-tombstoned) by an
19859
+ * identity-preserving undo, so that a later re-registration (redo) is
19860
+ * not swallowed by the toggle in `registerGCPair`.
19861
+ *
19862
+ * NOTE: must be called AFTER the node's removedAt has been cleared, so
19863
+ * `getDataSize()` no longer includes the tombstone ticket.
19864
+ */
19865
+ unregisterGCPair(pair) {
19866
+ const registered = this.gcPairMap.get(pair.child.toIDString());
19867
+ if (!registered) {
19868
+ return;
19869
+ }
19870
+ this.gcPairMap.delete(pair.child.toIDString());
19871
+ const size = pair.child.getDataSize();
19872
+ subDataSize(this.docSize.gc, size);
19873
+ addDataSizes(this.docSize.live, size);
19874
+ if (!(pair.child instanceof RHTNode)) {
19875
+ this.docSize.gc.meta -= TimeTicketSize;
19876
+ }
19877
+ }
19249
19878
  /**
19250
19879
  * `getElementMapSize` returns the size of element map.
19251
19880
  */
@@ -19308,6 +19937,10 @@
19308
19937
  }
19309
19938
  for (const [, pair] of this.gcPairMap) {
19310
19939
  const removedAt = pair.child.getRemovedAt();
19940
+ if (!removedAt) {
19941
+ this.unregisterGCPair(pair);
19942
+ continue;
19943
+ }
19311
19944
  if (removedAt && minSyncedVersionVector?.afterOrEqual(removedAt)) {
19312
19945
  pair.parent.purge(pair.child);
19313
19946
  subDataSize(this.docSize.gc, pair.child.getDataSize());
@@ -21531,7 +22164,7 @@
21531
22164
  };
21532
22165
  }
21533
22166
  const name$1 = "@yorkie-js/sdk";
21534
- const version$1 = "0.7.12";
22167
+ const version$1 = "0.7.13";
21535
22168
  const pkg$1 = {
21536
22169
  name: name$1,
21537
22170
  version: version$1
@@ -23629,7 +24262,7 @@
23629
24262
  };
23630
24263
  }
23631
24264
  const name = "@yorkie-js/react";
23632
- const version = "0.7.12";
24265
+ const version = "0.7.13";
23633
24266
  const pkg = {
23634
24267
  name,
23635
24268
  version