@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.
- package/dist/yorkie-js-react.es.js +660 -27
- package/dist/yorkie-js-react.es.js.map +1 -1
- package/dist/yorkie-js-react.js +660 -27
- package/dist/yorkie-js-react.js.map +1 -1
- package/package.json +2 -2
package/dist/yorkie-js-react.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
9759
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 [
|
|
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({
|
|
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(
|
|
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
|
-
|
|
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({
|
|
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.
|
|
13768
|
+
this.indexTree.traverseAll((node) => {
|
|
13232
13769
|
if (node.getRemovedAt()) {
|
|
13233
|
-
pairs.push({
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
24265
|
+
const version = "0.7.13";
|
|
23633
24266
|
const pkg = {
|
|
23634
24267
|
name,
|
|
23635
24268
|
version
|