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